From 01641403cb0129407c2e345c573663e647c1684f Mon Sep 17 00:00:00 2001 From: Giulio Eulisse Date: Wed, 28 Aug 2019 15:40:38 +0200 Subject: [PATCH 0001/2352] Fix warnings on macOS --- occ/occlib/OccServer.cxx | 4 +- occ/occlib/RuntimeControlledObject.h | 178 +++++++++++++-------------- occ/plugin/OccPluginServer.cxx | 7 +- 3 files changed, 94 insertions(+), 95 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index fa2823873..970c4cf70 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -27,6 +27,8 @@ #include "OccServer.h" #include +#include + #include "util/Defer.h" #include #include @@ -227,7 +229,7 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: std::string evt = boost::algorithm::to_lower_copy(event); - printf("Object: %s - processing event %s in state %s with run number %lu.\n", + printf("Object: %s - processing event %s in state %s with run number %llu.\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str(), diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index 82a9d6de2..cb48c96e4 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -77,96 +77,94 @@ class OCC_EXPORT RuntimeControlledObject { */ t_State getState() const; - /** - * Transition from standby to configured. - * - * @param properties a boost::property_tree pushed by the control agent, containing - * deployment-specific configuration (i.e. channel configuration and related). - * @return 0 if the transition completed successfully, any non-zero value immediately triggers - * a transition to the error state. - * - * The implementer should use this transition to move the machine from an unconfigured, bare - * state into a state where the dataflow may be initiated at any time. - * It is ok for this step to take some time if necessary. - * - * Example properties tree with one inbound and one outbound channel: - * { - * "chans": { - * "myOutboundCh": { - * "0": { - * "address": "tcp://target.hostname.cern.ch:5555", - * "method": "connect", // can be connect, bind - * "type": "pull", // can be push, pull, pub, sub - * "transport": "default", - * "rateLogging": "0", - * "sndBufSize": "1000", - * "sndKernelSize": "0", - * "rcvBufSize": "1000", - * "rcvKernelSize": "0" - * }, - * "numSockets": "1" - * }, - * "myInboundCh": { - * "0": { - * "address": "tcp://*:5555", - * "method": "bind", - * "type": "push", - * "transport": "default", - * "rateLogging": "0", - * "sndBufSize": "1000", - * "sndKernelSize": "0", - * "rcvBufSize": "1000", - * "rcvKernelSize": "0" - * }, - * "numSockets": "1" - * } - * }, - * "additional non-channel properties": "go here" - * } - * - * Example of correspondence between Readout configuration file and the equivalent - * reconfiguration information pushed by AliECS: - * - * [consumer-fmq-wp5] - * # session name must match --session parameter of all O2 devices in the chain - * consumerType=FairMQChannel - * enabled=0 - * sessionName=default \ - * transportType=shmem \ - * channelName=readout-out > can be overridden in incoming tree - * channelType=pair / - * channelAddress=ipc:///tmp/readout-pipe-0 / - * unmanagedMemorySize=2G - * disableSending=0 - * #need also a memory pool for headers and partial HBf chunks copies - * memoryPoolNumberOfPages=100 - * memoryPoolPageSize=128k - * - * Incoming tree: - * { - * "chans": { - * "readout-out": { // should be matched against channelName - * "0": { - * "method": "connect", // can be connect, bind - * "address": "tcp://target.hostname.cern.ch:5555", // if "method" is "bind", "address" can be e.g. "tcp://*:5555" - * "type": "push", // can be push, pull, pub, sub - * "transport": "shmem", - * "rateLogging": "0", // additional channel options not specified in config file - * "sndBufSize": "1000", - * "sndKernelSize": "0", - * "rcvBufSize": "1000", - * "rcvKernelSize": "0" - * }, - * "numSockets": "1" // this is always 1 because we enforce 1 connection per channel - * }, - * }, - * "additional non-channel properties": "go here" - * } - * - * @note Only one of the transition functions will be called at any given time, and during a - * transition all checks (iterateRunning/iterateCheck) are blocked until the transition - * finishes and returns success or error. - */ + /// Transition from standby to configured. + /// + /// @param properties a boost::property_tree pushed by the control agent, containing + /// deployment-specific configuration (i.e. channel configuration and related). + /// @return 0 if the transition completed successfully, any non-zero value immediately triggers + /// a transition to the error state. + /// + /// The implementer should use this transition to move the machine from an unconfigured, bare + /// state into a state where the dataflow may be initiated at any time. + /// It is ok for this step to take some time if necessary. + /// + /// Example properties tree with one inbound and one outbound channel: + /// { + /// "chans": { + /// "myOutboundCh": { + /// "0": { + /// "address": "tcp://target.hostname.cern.ch:5555", + /// "method": "connect", // can be connect, bind + /// "type": "pull", // can be push, pull, pub, sub + /// "transport": "default", + /// "rateLogging": "0", + /// "sndBufSize": "1000", + /// "sndKernelSize": "0", + /// "rcvBufSize": "1000", + /// "rcvKernelSize": "0" + /// }, + /// "numSockets": "1" + /// }, + /// "myInboundCh": { + /// "0": { + /// "address": "tcp://*:5555", + /// "method": "bind", + /// "type": "push", + /// "transport": "default", + /// "rateLogging": "0", + /// "sndBufSize": "1000", + /// "sndKernelSize": "0", + /// "rcvBufSize": "1000", + /// "rcvKernelSize": "0" + /// }, + /// "numSockets": "1" + /// } + /// }, + /// "additional non-channel properties": "go here" + /// } + /// + /// Example of correspondence between Readout configuration file and the equivalent + /// reconfiguration information pushed by AliECS: + /// + /// [consumer-fmq-wp5] + /// # session name must match --session parameter of all O2 devices in the chain + /// consumerType=FairMQChannel + /// enabled=0 + /// sessionName=default \ + /// transportType=shmem \ + /// channelName=readout-out > can be overridden in incoming tree + /// channelType=pair / + /// channelAddress=ipc:///tmp/readout-pipe-0 / + /// unmanagedMemorySize=2G + /// disableSending=0 + /// #need also a memory pool for headers and partial HBf chunks copies + /// memoryPoolNumberOfPages=100 + /// memoryPoolPageSize=128k + /// + /// Incoming tree: + /// { + /// "chans": { + /// "readout-out": { // should be matched against channelName + /// "0": { + /// "method": "connect", // can be connect, bind + /// "address": "tcp://target.hostname.cern.ch:5555", // if "method" is "bind", "address" can be e.g. "tcp://*:5555" + /// "type": "push", // can be push, pull, pub, sub + /// "transport": "shmem", + /// "rateLogging": "0", // additional channel options not specified in config file + /// "sndBufSize": "1000", + /// "sndKernelSize": "0", + /// "rcvBufSize": "1000", + /// "rcvKernelSize": "0" + /// }, + /// "numSockets": "1" // this is always 1 because we enforce 1 connection per channel + /// }, + /// }, + /// "additional non-channel properties": "go here" + /// } + /// + /// @note Only one of the transition functions will be called at any given time, and during a + /// transition all checks (iterateRunning/iterateCheck) are blocked until the transition + /// finishes and returns success or error. virtual int executeConfigure(const boost::property_tree::ptree& properties); /** diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 88a9184a1..1b7cbe9b5 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -358,7 +358,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, m_pluginServices->SetProperty(it->key(), it->value()); } } - catch (fair::mq::PluginServices::InvalidStateError &e) { + catch (std::runtime_error &e) { OLOG(WARNING) << "[request Transition] cannot push RUN transition arguments, reason:" << e.what(); } } @@ -380,8 +380,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, // IF we have no states in list yet, OR // we have some states, and the last one is an intermediate state (for which an autotransition is presumably about to happen) - if (newStates.empty() || - !newStates.empty() && isIntermediateState(newStates.back())) { + if (newStates.empty() || isIntermediateState(newStates.back())) { // We need to block until the transitions are complete for (;;) { OLOG(DEBUG) << "[request Transition] transitions expected, blocking"; @@ -453,4 +452,4 @@ std::string OccPluginServer::generateSubscriptionId(const std::string& prefix) id = std::to_string(std::time(nullptr)); } return "OCC_"s + (prefix.size() ? (prefix + "_") : "") + id; -} \ No newline at end of file +} From b68c6e2a37a19d0de1738fb315f4e7b052b2477d Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 10:51:35 +0200 Subject: [PATCH 0002/2352] [OCONF-164] Add coconut list command --- coconut/cmd/configuration_dump.go | 4 +- coconut/cmd/configuration_list.go | 47 + coconut/cmd/environment_control.go | 2 +- coconut/cmd/environment_create.go | 2 +- coconut/cmd/environment_destroy.go | 2 +- coconut/cmd/environment_list.go | 2 +- coconut/cmd/environment_show.go | 2 +- coconut/configuration/configuration.go | 56 + coconut/protos/o2control.pb.go | 1941 ++++++++++++++---------- configuration/consulsource.go | 11 +- configuration/source.go | 1 + configuration/yamlsource.go | 5 + core/protos/o2control.pb.go | 1941 ++++++++++++++---------- executor/protos/occ.pb.go | 355 +++-- 14 files changed, 2643 insertions(+), 1728 deletions(-) create mode 100644 coconut/cmd/configuration_list.go diff --git a/coconut/cmd/configuration_dump.go b/coconut/cmd/configuration_dump.go index 8c7abc943..df1c13448 100644 --- a/coconut/cmd/configuration_dump.go +++ b/coconut/cmd/configuration_dump.go @@ -25,11 +25,11 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" ) -// configurationDumpCmd represents the environment list command +// configurationDumpCmd represents the configuration list command var configurationDumpCmd = &cobra.Command{ Use: "dump [key]", Aliases: []string{"d"}, diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go new file mode 100644 index 000000000..7d24856eb --- /dev/null +++ b/coconut/cmd/configuration_list.go @@ -0,0 +1,47 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" +) + +// configurationListCmd represents the configuration list command +var configurationListCmd = &cobra.Command{ + Use: "list [key]", + Aliases: []string{"l"}, + Short: "List all existing components in Consul", + Long: `The configuration list command requests all components +from O² Configuration a list of keys and displays it on +the standard output in the specified format`, + Run: configuration.WrapCall(configuration.List), + Args: cobra.MaximumNArgs(2), +} + +func init() { + configurationCmd.AddCommand(configurationListCmd) + configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") +} diff --git a/coconut/cmd/environment_control.go b/coconut/cmd/environment_control.go index 38339eb21..1f04dd333 100644 --- a/coconut/cmd/environment_control.go +++ b/coconut/cmd/environment_control.go @@ -25,8 +25,8 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // environmentControlCmd represents the environment list command diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 309a4076a..bbc168e39 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentCreateCmd represents the environment list command diff --git a/coconut/cmd/environment_destroy.go b/coconut/cmd/environment_destroy.go index 4343bc84f..b87c0fc5f 100644 --- a/coconut/cmd/environment_destroy.go +++ b/coconut/cmd/environment_destroy.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentDestroyCmd represents the environment list command diff --git a/coconut/cmd/environment_list.go b/coconut/cmd/environment_list.go index 496b59179..98d040ab7 100644 --- a/coconut/cmd/environment_list.go +++ b/coconut/cmd/environment_list.go @@ -25,8 +25,8 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // environmentListCmd represents the environment list command diff --git a/coconut/cmd/environment_show.go b/coconut/cmd/environment_show.go index d9c327953..df1cee5ce 100644 --- a/coconut/cmd/environment_show.go +++ b/coconut/cmd/environment_show.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentShowCmd represents the environment list command diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index be7a567ae..170bc8e60 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -50,6 +50,7 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(configuration.Source, *cobra.Command, []string, io.Writer) (error) +var componentsPath = "o2/components/" func WrapCall(call ConfigurationCall) RunFunc { return func(cmd *cobra.Command, args []string) { @@ -133,3 +134,58 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ return nil } + +func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { + if len(args) > 1 { + err = errors.New(fmt.Sprintf("command requires 0 or 1 arg but received %d", len(args))) + return + } + + keyPrefix := componentsPath + if len(args) > 0 { + keyPrefix += args[0] + "/" + } + + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + return + } + set := make(map[string]bool) + var components []string + for _, key := range keys { + componentName := strings.Replace(key, keyPrefix, "", 1) + componentName = strings.Split(componentName, "/")[0] + if !set[componentName] { + components = append(components, componentName) + set[componentName] = true + } + } + + output, err := formatOutput(cmd, components) + if err != nil { + return + } + fmt.Fprintln(o, string(output)) + return nil +} + +func formatOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("format") + if err != nil { + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + case "toml": + parsedOutput, err = toml.Marshal(output) + } + if err != nil { + log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) + return + } + return parsedOutput, nil +} \ No newline at end of file diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index ce6049427..e4ed2135f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -409,7 +412,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +457,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +545,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +635,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +681,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +723,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +764,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +823,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +905,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +952,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +999,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +1047,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1102,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1158,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1221,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1283,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1339,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1401,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1455,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1511,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1603,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1670,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1710,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1757,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1804,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1852,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1910,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1987,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2054,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2143,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2191,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2249,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2308,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2390,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2433,7 +2436,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2473,7 +2476,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2873,6 +2876,53 @@ type ControlServer interface { GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3202,7 +3252,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3210,20 +3260,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3231,20 +3287,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3252,38 +3314,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3291,46 +3362,60 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + return m.MarshalToSizedBuffer(dAtA[:m.Size()]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3338,20 +3423,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3359,53 +3450,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3413,63 +3513,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3477,26 +3588,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3504,20 +3622,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3525,20 +3649,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3546,38 +3676,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3585,61 +3724,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3647,26 +3798,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3674,30 +3832,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3705,26 +3871,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + i-- + dAtA[i] = 0xa } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3732,40 +3905,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3773,31 +3956,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3805,37 +3995,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3843,48 +4041,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3892,31 +4099,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3924,44 +4138,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3969,36 +4193,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4006,30 +4237,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4037,70 +4276,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4108,44 +4360,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4153,20 +4415,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4174,32 +4442,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4207,26 +4483,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4234,30 +4517,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4265,32 +4556,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4298,72 +4597,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4371,38 +4666,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4410,86 +4714,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + } + } + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4497,35 +4819,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4533,44 +4855,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4578,32 +4910,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4611,71 +4951,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4683,32 +5029,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4716,20 +5070,26 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4737,39 +5097,41 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, s := range m.WorkflowTemplates { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.WorkflowTemplates[iNdEx]) + copy(dAtA[i:], m.WorkflowTemplates[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplates[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -5646,14 +6008,7 @@ func (m *GetWorkflowTemplatesReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) diff --git a/configuration/consulsource.go b/configuration/consulsource.go index debda789e..7f0218a97 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -76,7 +76,7 @@ func (cc *ConsulSource) GetNextUInt32(key string) (value uint32, err error) { } func (cc *ConsulSource) Get(key string) (value string, err error) { - kvp, _, err := cc.kv.Get(formatKey(key), nil) + kvp, _, err := cc.kv.Get(formatKey(key),nil) if err != nil { return } @@ -84,6 +84,15 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } +func (cc *ConsulSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { + requestKey := formatKey(key) + kvps, _, err := cc.kv.Keys(requestKey, separator, nil) + if err != nil { + return + } + return kvps, nil +} + func (cc *ConsulSource) GetRecursive(key string) (value Item, err error) { requestKey := formatKey(key) kvps, _, err := cc.kv.List(requestKey, nil) diff --git a/configuration/source.go b/configuration/source.go index 0251307bb..deffc54ce 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -35,6 +35,7 @@ import ( type ROSource interface { Get(string) (string, error) GetRecursive(string) (Item, error) + GetKeysByPrefix(string, string)([]string, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) } diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index c75a071bd..c77499049 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -150,6 +150,11 @@ func (yc *YamlSource) Get(key string) (value string, err error) { return } +func (cc *YamlSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { + // + return nil, nil +} + func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index ce6049427..e4ed2135f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -409,7 +412,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +457,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +545,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +635,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +681,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +723,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +764,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +823,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +905,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +952,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +999,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +1047,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1102,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1158,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1221,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1283,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1339,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1401,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1455,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1511,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1603,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1670,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1710,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1757,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1804,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1852,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1910,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1987,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2054,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2143,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2191,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2249,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2308,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2390,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2433,7 +2436,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2473,7 +2476,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2873,6 +2876,53 @@ type ControlServer interface { GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3202,7 +3252,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3210,20 +3260,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3231,20 +3287,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3252,38 +3314,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3291,46 +3362,60 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + return m.MarshalToSizedBuffer(dAtA[:m.Size()]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3338,20 +3423,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3359,53 +3450,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3413,63 +3513,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3477,26 +3588,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3504,20 +3622,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3525,20 +3649,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3546,38 +3676,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3585,61 +3724,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3647,26 +3798,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3674,30 +3832,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3705,26 +3871,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + i-- + dAtA[i] = 0xa } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3732,40 +3905,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3773,31 +3956,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3805,37 +3995,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3843,48 +4041,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3892,31 +4099,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3924,44 +4138,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3969,36 +4193,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4006,30 +4237,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4037,70 +4276,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4108,44 +4360,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4153,20 +4415,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4174,32 +4442,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4207,26 +4483,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4234,30 +4517,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4265,32 +4556,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4298,72 +4597,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4371,38 +4666,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4410,86 +4714,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + } + } + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4497,35 +4819,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4533,44 +4855,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4578,32 +4910,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4611,71 +4951,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4683,32 +5029,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4716,20 +5070,26 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4737,39 +5097,41 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, s := range m.WorkflowTemplates { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.WorkflowTemplates[iNdEx]) + copy(dAtA[i:], m.WorkflowTemplates[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplates[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -5646,14 +6008,7 @@ func (m *GetWorkflowTemplatesReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index cf6413bca..48d65e899 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -121,7 +124,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -162,7 +165,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -215,7 +218,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -255,7 +258,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -302,7 +305,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -348,7 +351,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -388,7 +391,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -436,7 +439,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -492,7 +495,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -556,7 +559,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -783,6 +786,23 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } +// UnimplementedOccServer can be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -896,7 +916,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -904,20 +924,26 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -925,31 +951,38 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -957,20 +990,26 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -978,25 +1017,31 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Type != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1004,30 +1049,38 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Event != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) - n1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n1 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1035,20 +1088,26 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1056,26 +1115,33 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.State) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1083,32 +1149,40 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Key) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Value) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Value) + copy(dAtA[i:], m.Value) i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1116,44 +1190,54 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.SrcState) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i += copy(dAtA[i:], m.SrcState) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Arguments) > 0 { - for _, msg := range m.Arguments { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x1a } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x12 + } + if len(m.SrcState) > 0 { + i -= len(m.SrcState) + copy(dAtA[i:], m.SrcState) + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1161,51 +1245,61 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Trigger != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Ok { - dAtA[i] = 0x20 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x1a + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Trigger != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { + offset -= sovOcc(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1382,14 +1476,7 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) From f45c3800958f7f88cfa20719ef60c58e357c388a Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 11:55:07 +0200 Subject: [PATCH 0003/2352] [OCONF-164] Add timestamp flag --- coconut/cmd/configuration_list.go | 7 ++++--- coconut/configuration/configuration.go | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 7d24856eb..bb693a967 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -32,16 +32,17 @@ import ( // configurationListCmd represents the configuration list command var configurationListCmd = &cobra.Command{ Use: "list [key]", - Aliases: []string{"l"}, + Aliases: []string{"l", "ls", "list"}, Short: "List all existing components in Consul", Long: `The configuration list command requests all components -from O² Configuration a list of keys and displays it on +from O² Configuration as a list of keys and displays it on the standard output in the specified format`, Run: configuration.WrapCall(configuration.List), - Args: cobra.MaximumNArgs(2), + Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 170bc8e60..eca56c061 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -146,6 +146,8 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ keyPrefix += args[0] + "/" } + useTimestamp, err := cmd.Flags().GetBool("timestamp") + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { return @@ -154,7 +156,9 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ var components []string for _, key := range keys { componentName := strings.Replace(key, keyPrefix, "", 1) - componentName = strings.Split(componentName, "/")[0] + if !useTimestamp { + componentName = strings.Split(componentName, "/")[0] + } if !set[componentName] { components = append(components, componentName) set[componentName] = true From a83de17f781b8bb24ed60cd22f857bdf32f03094 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 14:34:52 +0200 Subject: [PATCH 0004/2352] [OCONF-165] Add show command --- coconut/cmd/configuration_show.go | 48 ++++++++++++++++++++++++++ coconut/configuration/configuration.go | 45 ++++++++++++++++++++++++ configuration/consulsource.go | 4 ++- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 coconut/cmd/configuration_show.go diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go new file mode 100644 index 000000000..968e21097 --- /dev/null +++ b/coconut/cmd/configuration_show.go @@ -0,0 +1,48 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" +) + +// configurationShowCmd represents the configuration show command +var configurationShowCmd = &cobra.Command{ + Use: "show [component] [entry]", + Aliases: []string{"s"}, + Short: "Show configuration for the component and entry specified", + Long: `The configuration show command requests by default the latest +configuration for the specified component and entry. It can request exact +time configuration by specifying wanted timestamp as flag`, + Run: configuration.WrapCall(configuration.Show), + Args: cobra.ExactArgs(2), +} + +func init() { + configurationCmd.AddCommand(configurationShowCmd) + configurationShowCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") +} diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index eca56c061..273eab733 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -173,6 +173,51 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ return nil } +func Show(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { + if len(args) != 2 { + err = errors.New(fmt.Sprintf("command requires 2 args but received %d", len(args))) + return + } + + component := args[0] + entry := args[1] + timestamp, err := cmd.Flags().GetString("timestamp") + + key:= componentsPath + component + "/" + entry + var configuration string + if timestamp != "" { + key +="/" + timestamp + configuration, err = cfg.Get(key) + if err != nil { + return + } + } else { + configList, _ := cfg.GetRecursive(key) + if err != nil { + return + } + maxTimestamp := "" + for key, config := range configList.Map(){ + if strings.Compare(maxTimestamp, key) < 0 { + maxTimestamp = key + configuration = config.Value() + } + } + } + + if err != nil { + return + } + + output, err := formatOutput(cmd, []string{configuration}) + if err != nil { + return + } + + fmt.Fprintln(o, string(output)) + return nil +} + func formatOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { format, err := cmd.Flags().GetString("format") if err != nil { diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 7f0218a97..d08974d4a 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -80,7 +80,9 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { if err != nil { return } - value = string(kvp.Value[:]) + if kvp != nil { + value = string(kvp.Value[:]) + } return } From 59b4d41a7271ab641997090f1a5db2083adc2d3e Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 17:09:28 +0200 Subject: [PATCH 0005/2352] [OCONF-164] Display only latest timestamp + code refactoring --- coconut/cmd/configuration_list.go | 13 ++++++------ coconut/configuration/configuration.go | 29 +++++++++++++++++++------- configuration/consulsource.go | 8 +++---- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index bb693a967..5ac5cd592 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -29,20 +29,19 @@ import ( "github.com/spf13/cobra" ) -// configurationListCmd represents the configuration list command var configurationListCmd = &cobra.Command{ - Use: "list [key]", - Aliases: []string{"l", "ls", "list"}, - Short: "List all existing components in Consul", + Use: "list [component]", + Aliases: []string{"l", "ls"}, + Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components -from O² Configuration as a list of keys and displays it on -the standard output in the specified format`, +from O² Configuration as a list and displays it on the standard output +in the specified format`, Run: configuration.WrapCall(configuration.List), Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) - configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration list") configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index eca56c061..53487fa4b 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -137,7 +137,7 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { if len(args) > 1 { - err = errors.New(fmt.Sprintf("command requires 0 or 1 arg but received %d", len(args))) + err = errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) return } @@ -152,16 +152,29 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ if err != nil { return } - set := make(map[string]bool) var components []string + + componentsSet := make(map[string]string) for _, key := range keys { - componentName := strings.Replace(key, keyPrefix, "", 1) - if !useTimestamp { - componentName = strings.Split(componentName, "/")[0] + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + componentTimestamp := componentParts[len(componentParts) - 1] + if useTimestamp { + componentsFullName = strings.TrimSuffix(componentsFullName, "/"+componentTimestamp) + } else { + componentsFullName = componentParts[0] + } + + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ + componentsSet[componentsFullName] = componentTimestamp } - if !set[componentName] { - components = append(components, componentName) - set[componentName] = true + } + + for key,value := range componentsSet { + if useTimestamp { + components = append(components, key+"/"+value) + } else { + components = append(components, key) } } diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 7f0218a97..677d2fab3 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -84,13 +84,13 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } -func (cc *ConsulSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { - requestKey := formatKey(key) - kvps, _, err := cc.kv.Keys(requestKey, separator, nil) +func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string, separator string)(value []string, err error) { + keyPrefix = formatKey(keyPrefix) + keys, _, err := cc.kv.Keys(keyPrefix, separator, nil) if err != nil { return } - return kvps, nil + return keys, nil } func (cc *ConsulSource) GetRecursive(key string) (value Item, err error) { From b3daf2430b5fb04c15d8fef86b5306f5ecf220bd Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 9 Sep 2019 15:12:01 +0200 Subject: [PATCH 0006/2352] [core] Task class always identified by hash --- core/repos/repo.go | 12 ++++-------- core/task/class.go | 12 ++++-------- core/task/manager.go | 3 ++- 3 files changed, 10 insertions(+), 17 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 01ca79e59..cab855908 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -38,6 +38,7 @@ type Repo struct { User string RepoName string Revision string + Hash string Default bool } @@ -62,7 +63,7 @@ func NewRepo(repoPath string) (*Repo, error) { } return &Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, false}, nil + repoUrlSlice[2], revision, "", false}, nil } func (r *Repo) GetIdentifier() string { @@ -119,13 +120,7 @@ func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdenti taskClassIdentifier = loadTaskClass } - if !strings.Contains(loadTaskClass, "@") { - if r.Revision == "" { - taskClassIdentifier += "@master" - } else { - taskClassIdentifier += "@" + r.Revision - } - } + taskClassIdentifier += "@" + r.Hash return } @@ -163,6 +158,7 @@ func (r *Repo) checkoutRevision(revision string) error { return err } + r.Hash = newHash.String() //Update repo hash r.Revision = revision //Update repo revision return nil } diff --git a/core/task/class.go b/core/task/class.go index 71fdf480c..65146ea2a 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -29,7 +29,6 @@ import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" "strconv" @@ -53,16 +52,13 @@ type info struct { } type taskClassIdentifier struct { - repo repos.Repo - Name string + repoIdentifier string + hash string + Name string } func (tcID taskClassIdentifier) String() string { - if tcID.repo.Revision != "" { - return fmt.Sprintf("%stasks/%s@%s", tcID.repo.GetIdentifier(), tcID.Name, tcID.repo.Revision) - } else { - return fmt.Sprintf("%stasks/%s@master", tcID.repo.GetIdentifier(), tcID.Name) - } + return fmt.Sprintf("%stasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) } func (tcID *taskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { diff --git a/core/task/manager.go b/core/task/manager.go index df1d354c9..17b80b58d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -140,7 +140,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, return nil, err } - taskClassStruct.Identifier.repo = *repo + taskClassStruct.Identifier.repoIdentifier = repo.GetIdentifier() + taskClassStruct.Identifier.hash = repo.Hash taskClassList = append(taskClassList, &taskClassStruct) } return taskClassList, nil From 1914a776c604b6188d9f97b463cf2dd41c995f08 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 10 Sep 2019 14:45:10 +0200 Subject: [PATCH 0007/2352] [OCONF-164] Updates based on new requirements --- coconut/cmd/configuration_list.go | 7 ++- coconut/configuration/configuration.go | 72 ++++++++++++++++---------- coconut/protos/o2control.pb.go | 61 +++------------------- core/protos/o2control.pb.go | 61 +++------------------- executor/protos/occ.pb.go | 2 +- 5 files changed, 62 insertions(+), 141 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 5ac5cd592..024f97273 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -34,14 +34,13 @@ var configurationListCmd = &cobra.Command{ Aliases: []string{"l", "ls"}, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components -from O² Configuration as a list and displays it on the standard output -in the specified format`, +from O² Configuration as a list and displays it on the standard output`, Run: configuration.WrapCall(configuration.List), Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) - configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration list") - configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") + configurationListCmd.Flags().StringP("output", "o", "yaml", "output format for the configuration list (yaml/json)") + configurationListCmd.Flags().BoolP("timestamp", "t", false, "display latest timestamp entries for the requested component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 53487fa4b..242236c8f 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -84,18 +84,14 @@ func WrapCall(call ConfigurationCall) RunFunc { err = call(cfg, cmd, args, &out) os.Stdout = stdout s.Stop() + fmt.Print(out.String()) + if err != nil { - var fields logrus.Fields - if logrus.GetLevel() == logrus.DebugLevel { - fields = logrus.Fields{"error": err} - } log.WithPrefix(cmd.Use). - WithFields(fields). - Fatal("cannot query endpoint") + WithError(err). + Fatal("command finished with error") os.Exit(1) } - - fmt.Print(out.String()) } } @@ -136,31 +132,45 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ } func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { + keyPrefix := componentsPath + useTimestamp := false if len(args) > 1 { - err = errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) + err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) return + } else { + useTimestamp, err = cmd.Flags().GetBool("timestamp") + if err != nil { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) + return + } + if len(args) == 1 { + if !isInputNameValid(args[0]) { + err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) + return + } else { + keyPrefix += args[0] + "/" + } + } else if len(args) == 0 && useTimestamp { + err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) + return + } } - keyPrefix := componentsPath - if len(args) > 0 { - keyPrefix += args[0] + "/" - } - - useTimestamp, err := cmd.Flags().GetBool("timestamp") - keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { + err = errors.New(fmt.Sprintf("Could not query ConsulSource")) return } - var components []string + var components []string componentsSet := make(map[string]string) + for _, key := range keys { componentsFullName := strings.TrimPrefix(key, keyPrefix) componentParts := strings.Split(componentsFullName, "/") componentTimestamp := componentParts[len(componentParts) - 1] if useTimestamp { - componentsFullName = strings.TrimSuffix(componentsFullName, "/"+componentTimestamp) + componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) } else { componentsFullName = componentParts[0] } @@ -172,13 +182,13 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ for key,value := range componentsSet { if useTimestamp { - components = append(components, key+"/"+value) + components = append(components, key+"@"+value) } else { components = append(components, key) } } - output, err := formatOutput(cmd, components) + output, err := formatListOutput(cmd, components) if err != nil { return } @@ -186,23 +196,29 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ return nil } -func formatOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { - format, err := cmd.Flags().GetString("format") +func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("output") if err != nil { return } switch strings.ToLower(format) { - case "json": - parsedOutput, err = json.MarshalIndent(output, "", " ") - case "yaml": - parsedOutput, err = yaml.Marshal(output) - case "toml": - parsedOutput, err = toml.Marshal(output) + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) return } return parsedOutput, nil +} + +func isInputNameValid(input string)(valid bool) { + if strings.Contains(input, "/") || strings.Contains(input, "@") { + return false + } else { + return true + } } \ No newline at end of file diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index e4ed2135f..bab5404b5 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -308,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -3393,7 +3345,8 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - return m.MarshalToSizedBuffer(dAtA[:m.Size()]) + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index e4ed2135f..bab5404b5 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -308,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -3393,7 +3345,8 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - return m.MarshalToSizedBuffer(dAtA[:m.Size()]) + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 48d65e899..5f74bc308 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StateChangeTrigger int32 From 5df742c2cbe66e33a55150668739b7f02b8d142e Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 10:51:35 +0200 Subject: [PATCH 0008/2352] [OCONF-164] Add coconut list command --- coconut/cmd/configuration_dump.go | 4 +- coconut/cmd/configuration_list.go | 47 ++++ coconut/cmd/environment_control.go | 2 +- coconut/cmd/environment_create.go | 2 +- coconut/cmd/environment_destroy.go | 2 +- coconut/cmd/environment_list.go | 2 +- coconut/cmd/environment_show.go | 2 +- coconut/configuration/configuration.go | 56 ++++ configuration/consulsource.go | 11 +- configuration/source.go | 1 + configuration/yamlsource.go | 5 + executor/protos/occ.pb.go | 355 +++++++++++++++---------- 12 files changed, 347 insertions(+), 142 deletions(-) create mode 100644 coconut/cmd/configuration_list.go diff --git a/coconut/cmd/configuration_dump.go b/coconut/cmd/configuration_dump.go index 8c7abc943..df1c13448 100644 --- a/coconut/cmd/configuration_dump.go +++ b/coconut/cmd/configuration_dump.go @@ -25,11 +25,11 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" ) -// configurationDumpCmd represents the environment list command +// configurationDumpCmd represents the configuration list command var configurationDumpCmd = &cobra.Command{ Use: "dump [key]", Aliases: []string{"d"}, diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go new file mode 100644 index 000000000..7d24856eb --- /dev/null +++ b/coconut/cmd/configuration_list.go @@ -0,0 +1,47 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" +) + +// configurationListCmd represents the configuration list command +var configurationListCmd = &cobra.Command{ + Use: "list [key]", + Aliases: []string{"l"}, + Short: "List all existing components in Consul", + Long: `The configuration list command requests all components +from O² Configuration a list of keys and displays it on +the standard output in the specified format`, + Run: configuration.WrapCall(configuration.List), + Args: cobra.MaximumNArgs(2), +} + +func init() { + configurationCmd.AddCommand(configurationListCmd) + configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") +} diff --git a/coconut/cmd/environment_control.go b/coconut/cmd/environment_control.go index 94878d5d4..995209306 100644 --- a/coconut/cmd/environment_control.go +++ b/coconut/cmd/environment_control.go @@ -25,8 +25,8 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // environmentControlCmd represents the environment list command diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index a250fa2ae..ced7025a7 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentCreateCmd represents the environment list command diff --git a/coconut/cmd/environment_destroy.go b/coconut/cmd/environment_destroy.go index 00cf955fe..01b49dc6a 100644 --- a/coconut/cmd/environment_destroy.go +++ b/coconut/cmd/environment_destroy.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentDestroyCmd represents the environment list command diff --git a/coconut/cmd/environment_list.go b/coconut/cmd/environment_list.go index 477f81589..de9920e10 100644 --- a/coconut/cmd/environment_list.go +++ b/coconut/cmd/environment_list.go @@ -25,8 +25,8 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // environmentListCmd represents the environment list command diff --git a/coconut/cmd/environment_show.go b/coconut/cmd/environment_show.go index c9fff5b6b..fde89ee64 100644 --- a/coconut/cmd/environment_show.go +++ b/coconut/cmd/environment_show.go @@ -27,9 +27,9 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // environmentShowCmd represents the environment list command diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index be7a567ae..170bc8e60 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -50,6 +50,7 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(configuration.Source, *cobra.Command, []string, io.Writer) (error) +var componentsPath = "o2/components/" func WrapCall(call ConfigurationCall) RunFunc { return func(cmd *cobra.Command, args []string) { @@ -133,3 +134,58 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ return nil } + +func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { + if len(args) > 1 { + err = errors.New(fmt.Sprintf("command requires 0 or 1 arg but received %d", len(args))) + return + } + + keyPrefix := componentsPath + if len(args) > 0 { + keyPrefix += args[0] + "/" + } + + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + return + } + set := make(map[string]bool) + var components []string + for _, key := range keys { + componentName := strings.Replace(key, keyPrefix, "", 1) + componentName = strings.Split(componentName, "/")[0] + if !set[componentName] { + components = append(components, componentName) + set[componentName] = true + } + } + + output, err := formatOutput(cmd, components) + if err != nil { + return + } + fmt.Fprintln(o, string(output)) + return nil +} + +func formatOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("format") + if err != nil { + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + case "toml": + parsedOutput, err = toml.Marshal(output) + } + if err != nil { + log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) + return + } + return parsedOutput, nil +} \ No newline at end of file diff --git a/configuration/consulsource.go b/configuration/consulsource.go index debda789e..7f0218a97 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -76,7 +76,7 @@ func (cc *ConsulSource) GetNextUInt32(key string) (value uint32, err error) { } func (cc *ConsulSource) Get(key string) (value string, err error) { - kvp, _, err := cc.kv.Get(formatKey(key), nil) + kvp, _, err := cc.kv.Get(formatKey(key),nil) if err != nil { return } @@ -84,6 +84,15 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } +func (cc *ConsulSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { + requestKey := formatKey(key) + kvps, _, err := cc.kv.Keys(requestKey, separator, nil) + if err != nil { + return + } + return kvps, nil +} + func (cc *ConsulSource) GetRecursive(key string) (value Item, err error) { requestKey := formatKey(key) kvps, _, err := cc.kv.List(requestKey, nil) diff --git a/configuration/source.go b/configuration/source.go index 0251307bb..deffc54ce 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -35,6 +35,7 @@ import ( type ROSource interface { Get(string) (string, error) GetRecursive(string) (Item, error) + GetKeysByPrefix(string, string)([]string, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) } diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index c75a071bd..c77499049 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -150,6 +150,11 @@ func (yc *YamlSource) Get(key string) (value string, err error) { return } +func (cc *YamlSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { + // + return nil, nil +} + func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index cf6413bca..48d65e899 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -121,7 +124,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -162,7 +165,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -215,7 +218,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -255,7 +258,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -302,7 +305,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -348,7 +351,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -388,7 +391,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -436,7 +439,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -492,7 +495,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -556,7 +559,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -783,6 +786,23 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } +// UnimplementedOccServer can be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -896,7 +916,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -904,20 +924,26 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -925,31 +951,38 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -957,20 +990,26 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -978,25 +1017,31 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Type != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1004,30 +1049,38 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Event != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) - n1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n1 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1035,20 +1088,26 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1056,26 +1115,33 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.State) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1083,32 +1149,40 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Key) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Value) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Value) + copy(dAtA[i:], m.Value) i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1116,44 +1190,54 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.SrcState) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i += copy(dAtA[i:], m.SrcState) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Arguments) > 0 { - for _, msg := range m.Arguments { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x1a } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x12 + } + if len(m.SrcState) > 0 { + i -= len(m.SrcState) + copy(dAtA[i:], m.SrcState) + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1161,51 +1245,61 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Trigger != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Ok { - dAtA[i] = 0x20 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x1a + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Trigger != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { + offset -= sovOcc(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1382,14 +1476,7 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) From cde489a155b5d1b7645761a2bf9882ab21d05312 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 11:55:07 +0200 Subject: [PATCH 0009/2352] [OCONF-164] Add timestamp flag --- coconut/cmd/configuration_list.go | 7 ++++--- coconut/configuration/configuration.go | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 7d24856eb..bb693a967 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -32,16 +32,17 @@ import ( // configurationListCmd represents the configuration list command var configurationListCmd = &cobra.Command{ Use: "list [key]", - Aliases: []string{"l"}, + Aliases: []string{"l", "ls", "list"}, Short: "List all existing components in Consul", Long: `The configuration list command requests all components -from O² Configuration a list of keys and displays it on +from O² Configuration as a list of keys and displays it on the standard output in the specified format`, Run: configuration.WrapCall(configuration.List), - Args: cobra.MaximumNArgs(2), + Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 170bc8e60..eca56c061 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -146,6 +146,8 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ keyPrefix += args[0] + "/" } + useTimestamp, err := cmd.Flags().GetBool("timestamp") + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { return @@ -154,7 +156,9 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ var components []string for _, key := range keys { componentName := strings.Replace(key, keyPrefix, "", 1) - componentName = strings.Split(componentName, "/")[0] + if !useTimestamp { + componentName = strings.Split(componentName, "/")[0] + } if !set[componentName] { components = append(components, componentName) set[componentName] = true From 70f56b5da5e8391ca1b6602391747131d68949ac Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 29 Aug 2019 17:09:28 +0200 Subject: [PATCH 0010/2352] [OCONF-164] Display only latest timestamp + code refactoring --- coconut/cmd/configuration_list.go | 13 ++++++------ coconut/configuration/configuration.go | 29 +++++++++++++++++++------- configuration/consulsource.go | 8 +++---- 3 files changed, 31 insertions(+), 19 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index bb693a967..5ac5cd592 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -29,20 +29,19 @@ import ( "github.com/spf13/cobra" ) -// configurationListCmd represents the configuration list command var configurationListCmd = &cobra.Command{ - Use: "list [key]", - Aliases: []string{"l", "ls", "list"}, - Short: "List all existing components in Consul", + Use: "list [component]", + Aliases: []string{"l", "ls"}, + Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components -from O² Configuration as a list of keys and displays it on -the standard output in the specified format`, +from O² Configuration as a list and displays it on the standard output +in the specified format`, Run: configuration.WrapCall(configuration.List), Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) - configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration list") configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index eca56c061..53487fa4b 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -137,7 +137,7 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { if len(args) > 1 { - err = errors.New(fmt.Sprintf("command requires 0 or 1 arg but received %d", len(args))) + err = errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) return } @@ -152,16 +152,29 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ if err != nil { return } - set := make(map[string]bool) var components []string + + componentsSet := make(map[string]string) for _, key := range keys { - componentName := strings.Replace(key, keyPrefix, "", 1) - if !useTimestamp { - componentName = strings.Split(componentName, "/")[0] + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + componentTimestamp := componentParts[len(componentParts) - 1] + if useTimestamp { + componentsFullName = strings.TrimSuffix(componentsFullName, "/"+componentTimestamp) + } else { + componentsFullName = componentParts[0] + } + + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ + componentsSet[componentsFullName] = componentTimestamp } - if !set[componentName] { - components = append(components, componentName) - set[componentName] = true + } + + for key,value := range componentsSet { + if useTimestamp { + components = append(components, key+"/"+value) + } else { + components = append(components, key) } } diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 7f0218a97..677d2fab3 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -84,13 +84,13 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } -func (cc *ConsulSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { - requestKey := formatKey(key) - kvps, _, err := cc.kv.Keys(requestKey, separator, nil) +func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string, separator string)(value []string, err error) { + keyPrefix = formatKey(keyPrefix) + keys, _, err := cc.kv.Keys(keyPrefix, separator, nil) if err != nil { return } - return kvps, nil + return keys, nil } func (cc *ConsulSource) GetRecursive(key string) (value Item, err error) { From ef7ffecc6a31753c8ef9dabf7a1f62cf95960469 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 10 Sep 2019 14:45:10 +0200 Subject: [PATCH 0011/2352] [OCONF-164] Updates based on new requirements --- coconut/cmd/configuration_list.go | 7 ++- coconut/configuration/configuration.go | 72 ++++++++++++++++---------- executor/protos/occ.pb.go | 2 +- 3 files changed, 48 insertions(+), 33 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 5ac5cd592..024f97273 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -34,14 +34,13 @@ var configurationListCmd = &cobra.Command{ Aliases: []string{"l", "ls"}, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components -from O² Configuration as a list and displays it on the standard output -in the specified format`, +from O² Configuration as a list and displays it on the standard output`, Run: configuration.WrapCall(configuration.List), Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) - configurationListCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration list") - configurationListCmd.Flags().BoolP("timestamp", "t", false, "display timestamps for the listed component") + configurationListCmd.Flags().StringP("output", "o", "yaml", "output format for the configuration list (yaml/json)") + configurationListCmd.Flags().BoolP("timestamp", "t", false, "display latest timestamp entries for the requested component") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 53487fa4b..242236c8f 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -84,18 +84,14 @@ func WrapCall(call ConfigurationCall) RunFunc { err = call(cfg, cmd, args, &out) os.Stdout = stdout s.Stop() + fmt.Print(out.String()) + if err != nil { - var fields logrus.Fields - if logrus.GetLevel() == logrus.DebugLevel { - fields = logrus.Fields{"error": err} - } log.WithPrefix(cmd.Use). - WithFields(fields). - Fatal("cannot query endpoint") + WithError(err). + Fatal("command finished with error") os.Exit(1) } - - fmt.Print(out.String()) } } @@ -136,31 +132,45 @@ func Dump(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ } func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { + keyPrefix := componentsPath + useTimestamp := false if len(args) > 1 { - err = errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) + err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) return + } else { + useTimestamp, err = cmd.Flags().GetBool("timestamp") + if err != nil { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) + return + } + if len(args) == 1 { + if !isInputNameValid(args[0]) { + err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) + return + } else { + keyPrefix += args[0] + "/" + } + } else if len(args) == 0 && useTimestamp { + err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) + return + } } - keyPrefix := componentsPath - if len(args) > 0 { - keyPrefix += args[0] + "/" - } - - useTimestamp, err := cmd.Flags().GetBool("timestamp") - keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { + err = errors.New(fmt.Sprintf("Could not query ConsulSource")) return } - var components []string + var components []string componentsSet := make(map[string]string) + for _, key := range keys { componentsFullName := strings.TrimPrefix(key, keyPrefix) componentParts := strings.Split(componentsFullName, "/") componentTimestamp := componentParts[len(componentParts) - 1] if useTimestamp { - componentsFullName = strings.TrimSuffix(componentsFullName, "/"+componentTimestamp) + componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) } else { componentsFullName = componentParts[0] } @@ -172,13 +182,13 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ for key,value := range componentsSet { if useTimestamp { - components = append(components, key+"/"+value) + components = append(components, key+"@"+value) } else { components = append(components, key) } } - output, err := formatOutput(cmd, components) + output, err := formatListOutput(cmd, components) if err != nil { return } @@ -186,23 +196,29 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ return nil } -func formatOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { - format, err := cmd.Flags().GetString("format") +func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("output") if err != nil { return } switch strings.ToLower(format) { - case "json": - parsedOutput, err = json.MarshalIndent(output, "", " ") - case "yaml": - parsedOutput, err = yaml.Marshal(output) - case "toml": - parsedOutput, err = toml.Marshal(output) + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) return } return parsedOutput, nil +} + +func isInputNameValid(input string)(valid bool) { + if strings.Contains(input, "/") || strings.Contains(input, "@") { + return false + } else { + return true + } } \ No newline at end of file diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 48d65e899..5f74bc308 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StateChangeTrigger int32 From 879f82c1bd19d62b7ac8ad23b494e2c3cbf613b6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Sep 2019 15:29:26 +0200 Subject: [PATCH 0012/2352] [core] Regenerate proto --- coconut/protos/o2control.pb.go | 2365 +++++++++++++++++++------------- core/protos/o2control.pb.go | 2365 +++++++++++++++++++------------- 2 files changed, 2778 insertions(+), 1952 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index db73e9e78..5076703f0 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +857,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +904,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +951,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +999,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1054,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1110,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1173,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1235,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1291,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1353,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1407,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1463,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1555,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1622,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1662,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1709,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1756,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1804,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1862,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1939,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2006,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2095,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2143,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2201,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2260,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2342,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2433,7 +2388,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2474,7 +2429,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2528,7 +2483,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2574,7 +2529,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2615,7 +2570,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2669,7 +2624,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2716,7 +2671,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2763,7 +2718,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2810,7 +2765,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2858,7 +2813,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2912,7 +2867,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2959,7 +2914,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3006,7 +2961,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3053,7 +3008,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3536,6 +3491,68 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3975,7 +3992,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3983,20 +4000,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4004,20 +4027,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4025,38 +4054,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4064,46 +4102,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4111,20 +4164,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4132,53 +4191,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4186,63 +4254,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4250,26 +4329,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4277,20 +4363,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4298,20 +4390,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4319,38 +4417,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4358,61 +4465,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4420,26 +4539,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4447,30 +4573,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4478,26 +4612,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4505,40 +4646,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4546,31 +4697,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4578,37 +4736,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4616,48 +4782,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - return i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4665,31 +4840,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4697,44 +4879,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4742,36 +4934,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4779,30 +4978,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4810,70 +5017,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4881,44 +5101,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4926,20 +5156,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4947,32 +5183,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4980,26 +5224,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5007,30 +5258,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5038,32 +5297,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5071,72 +5338,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5144,38 +5407,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5183,86 +5455,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5270,35 +5560,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5306,44 +5596,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5351,32 +5651,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5384,71 +5692,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5456,32 +5770,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5489,20 +5811,26 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5510,32 +5838,40 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Template) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Template) + copy(dAtA[i:], m.Template) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5543,32 +5879,40 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5576,20 +5920,26 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5597,36 +5947,43 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Default { - dAtA[i] = 0x10 - i++ + i-- if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5634,32 +5991,40 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5667,26 +6032,33 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Name) + copy(dAtA[i:], m.Name) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5694,26 +6066,33 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5721,25 +6100,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5747,36 +6132,43 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0x12 + } if m.Ok { - dAtA[i] = 0x8 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5784,25 +6176,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5810,26 +6208,33 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5837,25 +6242,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5863,30 +6274,39 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -6960,14 +7380,7 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index db73e9e78..5076703f0 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +857,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +904,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +951,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +999,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1054,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1110,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1173,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1235,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1291,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1353,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1407,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1463,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1555,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1622,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1662,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1709,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1756,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1804,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1862,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1939,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2006,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2095,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2143,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2201,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2260,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2342,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2433,7 +2388,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2474,7 +2429,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2528,7 +2483,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2574,7 +2529,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2615,7 +2570,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2669,7 +2624,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2716,7 +2671,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2763,7 +2718,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2810,7 +2765,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2858,7 +2813,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2912,7 +2867,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2959,7 +2914,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3006,7 +2961,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3053,7 +3008,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3536,6 +3491,68 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3975,7 +3992,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -3983,20 +4000,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4004,20 +4027,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4025,38 +4054,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4064,46 +4102,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4111,20 +4164,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4132,53 +4191,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4186,63 +4254,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4250,26 +4329,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4277,20 +4363,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4298,20 +4390,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4319,38 +4417,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4358,61 +4465,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4420,26 +4539,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4447,30 +4573,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4478,26 +4612,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4505,40 +4646,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4546,31 +4697,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4578,37 +4736,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4616,48 +4782,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - return i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4665,31 +4840,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4697,44 +4879,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4742,36 +4934,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4779,30 +4978,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4810,70 +5017,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4881,44 +5101,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4926,20 +5156,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4947,32 +5183,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4980,26 +5224,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5007,30 +5258,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5038,32 +5297,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5071,72 +5338,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5144,38 +5407,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5183,86 +5455,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5270,35 +5560,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5306,44 +5596,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5351,32 +5651,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5384,71 +5692,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5456,32 +5770,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5489,20 +5811,26 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5510,32 +5838,40 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Template) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Template) + copy(dAtA[i:], m.Template) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5543,32 +5879,40 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5576,20 +5920,26 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5597,36 +5947,43 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Default { - dAtA[i] = 0x10 - i++ + i-- if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5634,32 +5991,40 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5667,26 +6032,33 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Name) + copy(dAtA[i:], m.Name) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5694,26 +6066,33 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5721,25 +6100,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5747,36 +6132,43 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0x12 + } if m.Ok { - dAtA[i] = 0x8 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5784,25 +6176,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5810,26 +6208,33 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5837,25 +6242,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5863,30 +6274,39 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -6960,14 +7380,7 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) From 78efe458a8cc275a24688b79b44ec850ef7e1122 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 10 Sep 2019 18:22:21 +0200 Subject: [PATCH 0013/2352] [OCONF-165] Update show command to include multiple formats --- coconut/cmd/configuration_show.go | 6 +- coconut/configuration/configuration.go | 118 ++++++++++++++++++++----- configuration/consulsource.go | 2 + 3 files changed, 100 insertions(+), 26 deletions(-) diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 968e21097..a7f9457b4 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -31,18 +31,18 @@ import ( // configurationShowCmd represents the configuration show command var configurationShowCmd = &cobra.Command{ - Use: "show [component] [entry]", + Use: "show ", Aliases: []string{"s"}, Short: "Show configuration for the component and entry specified", Long: `The configuration show command requests by default the latest configuration for the specified component and entry. It can request exact time configuration by specifying wanted timestamp as flag`, Run: configuration.WrapCall(configuration.Show), - Args: cobra.ExactArgs(2), + Args: cobra.RangeArgs(0, 3), } func init() { configurationCmd.AddCommand(configurationShowCmd) - configurationShowCmd.Flags().StringP("format", "f", "yaml", "output format for the configuration dump") + configurationShowCmd.Flags().StringP("output", "o", "yaml", "output format for the configuration shown") configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index ccc562738..22baa54f0 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -197,42 +197,71 @@ func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writ } func Show(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error) { - if len(args) != 2 { - err = errors.New(fmt.Sprintf("command requires 2 args but received %d", len(args))) + var key, component, entry, timestamp string + configMap := make(map[string]string) + + if len(args) < 1 || len(args) > 2 { + err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) return } - component := args[0] - entry := args[1] - timestamp, err := cmd.Flags().GetString("timestamp") + timestamp, err = cmd.Flags().GetString("timestamp") + if err != nil { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) + return + } - key:= componentsPath + component + "/" + entry - var configuration string - if timestamp != "" { - key +="/" + timestamp - configuration, err = cfg.Get(key) - if err != nil { + switch len(args) { + case 1: + if strings.Contains(args[0], "@") && strings.Contains(args[0], "/"){ + if timestamp != "" { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) + return + } + // coconut conf show component/entry@timestamp + arg := strings.Replace(args[0], "@", "/", 1) + params := strings.Split(arg, "/") + component = params[0] + entry = params[1] + timestamp = params[2] + } else if strings.Contains(args[0], "/") { + // assumes component/entry + params := strings.Split(args[0], "/") + component = params[0] + entry = params[1] + } else { + // coconut conf show component / coconut conf show component@timestamp + err = errors.New(fmt.Sprintf("Please provide entry name")) return } - } else { - configList, _ := cfg.GetRecursive(key) - if err != nil { + case 2: + if !isInputNameValid(args[0]) || !isInputNameValid(args[1]) { + err = errors.New(fmt.Sprintf("Component or Entry name provided are not valid")) return - } - maxTimestamp := "" - for key, config := range configList.Map(){ - if strings.Compare(maxTimestamp, key) < 0 { - maxTimestamp = key - configuration = config.Value() - } + } else { + component = args[0] + entry = args[1] } } + var configuration string + if timestamp == "" { + timestamp, err = getLatestTimestamp(cfg, component , entry) + if err != nil { + return + } + } + key = componentsPath + component + "/" + entry + "/" + timestamp + configuration, err = cfg.Get(key) if err != nil { return } - - output, err := formatOutput(cmd, []string{configuration}) + if configuration == "" { + err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) + return + } + configMap[timestamp] = configuration + output, err := formatConfigOutput(cmd, configMap) if err != nil { return } @@ -260,10 +289,53 @@ func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, return parsedOutput, nil } +func formatConfigOutput( cmd *cobra.Command, output map[string]string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("output") + if err != nil { + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + case "toml": + parsedOutput, err = toml.Marshal(output) + } + if err != nil { + log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) + return + } + return parsedOutput, nil +} + func isInputNameValid(input string)(valid bool) { if strings.Contains(input, "/") || strings.Contains(input, "@") { return false } else { return true } +} + +func getLatestTimestamp(cfg configuration.Source, component string, entry string)(timestamp string, err error) { + keyPrefix := componentsPath + component + "/" + entry + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + err = errors.New(fmt.Sprintf("Could not query ConsulSource")) + return + } + if len(keys) == 0 { + err = errors.New(fmt.Sprintf("No keys found")) + return + } + + var maxTimeStamp string + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix + "/") + if strings.Compare(componentsFullName, maxTimeStamp) > 0 { + maxTimeStamp = componentsFullName + } + } + return maxTimeStamp, nil } \ No newline at end of file diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 433dafc8b..7ba8f557d 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -82,6 +82,8 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { } if kvp != nil { value = string(kvp.Value[:]) + } else { + value = "" } return } From 15a3f790c95477377f57dd189d0b6bbdb98c935d Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 11 Sep 2019 12:14:27 +0200 Subject: [PATCH 0014/2352] [OCONF-165] Added examples to cobra help --- coconut/cmd/configuration_list.go | 4 ++++ coconut/cmd/configuration_show.go | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 024f97273..6b5366d4f 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -32,6 +32,10 @@ import ( var configurationListCmd = &cobra.Command{ Use: "list [component]", Aliases: []string{"l", "ls"}, + Example: `coconut conf list +coconut conf list +coconut conf list -t +`, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components from O² Configuration as a list and displays it on the standard output`, diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index a7f9457b4..532637ba4 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -33,6 +33,11 @@ import ( var configurationShowCmd = &cobra.Command{ Use: "show ", Aliases: []string{"s"}, + Example: `coconut conf show +coconut conf show -t +coconut conf show / +coconut conf show / -t +coconut conf show /@`, Short: "Show configuration for the component and entry specified", Long: `The configuration show command requests by default the latest configuration for the specified component and entry. It can request exact From 9882808fd63680af3b20ca8869b14914d1e62859 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 11 Sep 2019 14:00:12 +0200 Subject: [PATCH 0015/2352] [OCONF-164] Add example parameter to cobra --- coconut/cmd/configuration_list.go | 3 +++ configuration/consulsource.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 024f97273..5e630ff9e 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -32,6 +32,9 @@ import ( var configurationListCmd = &cobra.Command{ Use: "list [component]", Aliases: []string{"l", "ls"}, + Example: `coconut conf list +coconut conf list +coconut conf list -t `, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components from O² Configuration as a list and displays it on the standard output`, diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 677d2fab3..0e30dd5c8 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -76,7 +76,7 @@ func (cc *ConsulSource) GetNextUInt32(key string) (value uint32, err error) { } func (cc *ConsulSource) Get(key string) (value string, err error) { - kvp, _, err := cc.kv.Get(formatKey(key),nil) + kvp, _, err := cc.kv.Get(formatKey(key), nil) if err != nil { return } From 032f5b4185aa8131300336cec0085b390a808ec0 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 16 Sep 2019 11:40:51 +0000 Subject: [PATCH 0016/2352] [OCONF-165] Refactor sources --- coconut/configuration/configuration.go | 428 ++++++++++++------------- configuration/source.go | 1 - configuration/yamlsource.go | 5 - 3 files changed, 214 insertions(+), 220 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index ae5ca301f..a3addc9ae 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -48,7 +48,7 @@ var log = logger.New(logrus.StandardLogger(), "coconut") type RunFunc func(*cobra.Command, []string) -type ConfigurationCall func(configuration.Source, *cobra.Command, []string, io.Writer) (error, int) +type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) var componentsPath = "o2/components/" // code = 1 - Provided args by the user are invalid @@ -68,7 +68,7 @@ func WrapCall(call ConfigurationCall) RunFunc { s.Suffix = " working..." s.Start() - cfg, err := configuration.NewSource(endpoint) + cfg, err := configuration.NewConsulSource(strings.TrimPrefix(endpoint, "consul://")) if err != nil { var fields logrus.Fields if logrus.GetLevel() == logrus.DebugLevel { @@ -99,7 +99,7 @@ func WrapCall(call ConfigurationCall) RunFunc { } } -func Dump(cfg configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { +func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, 1 @@ -135,214 +135,214 @@ func Dump(cfg configuration.ConsulSource, cmd *cobra.Command, args []string, o i return nil, 0 } -//func List(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { -// keyPrefix := componentsPath -// useTimestamp := false -// if len(args) > 1 { -// err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) -// return err , 1 -// } else { -// useTimestamp, err = cmd.Flags().GetBool("timestamp") -// if err != nil { -// err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) -// return err, 1 -// } -// if len(args) == 1 { -// if !isInputNameValid(args[0]) { -// err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) -// return err, 1 -// } else { -// keyPrefix += args[0] + "/" -// } -// } else if len(args) == 0 && useTimestamp { -// err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) -// return err, 1 -// } -// } -// -// keys, err := cfg.GetKeysByPrefix(keyPrefix, "") -// if err != nil { -// err = errors.New(fmt.Sprintf("Could not query ConsulSource")) -// return err, 2 -// } -// -// // keys is empty? for a certain component? throw error maybe? -// -// var components []string -// componentsSet := make(map[string]string) -// -// for _, key := range keys { -// componentsFullName := strings.TrimPrefix(key, keyPrefix) -// componentParts := strings.Split(componentsFullName, "/") -// componentTimestamp := componentParts[len(componentParts) - 1] -// if useTimestamp { -// componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) -// } else { -// componentsFullName = componentParts[0] -// } -// -// if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ -// componentsSet[componentsFullName] = componentTimestamp -// } -// } -// -// for key,value := range componentsSet { -// if useTimestamp { -// components = append(components, key+"@"+value) -// } else { -// components = append(components, key) -// } -// } -// -// output, err := formatListOutput(cmd, components) -// if err != nil { -// return err, 4 -// } -// fmt.Fprintln(o, string(output)) -// return nil, 0 -//} -// -//func Show(cfg configuration.Source, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { -// var key, component, entry, timestamp string -// configMap := make(map[string]string) -// -// if len(args) < 1 || len(args) > 2 { -// err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) -// return err, 1 -// } -// -// timestamp, err = cmd.Flags().GetString("timestamp") -// if err != nil { -// err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) -// return err, 1 -// } -// -// switch len(args) { -// case 1: -// if strings.Contains(args[0], "@") && strings.Contains(args[0], "/"){ -// if timestamp != "" { -// err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) -// return err, 1 -// } -// // coconut conf show component/entry@timestamp -// arg := strings.Replace(args[0], "@", "/", 1) -// params := strings.Split(arg, "/") -// component = params[0] -// entry = params[1] -// timestamp = params[2] -// } else if strings.Contains(args[0], "/") { -// // assumes component/entry -// params := strings.Split(args[0], "/") -// component = params[0] -// entry = params[1] -// } else { -// // coconut conf show component / coconut conf show component@timestamp -// err = errors.New(fmt.Sprintf("Please provide entry name")) -// return err, 1 -// } -// case 2: -// if !isInputNameValid(args[0]) || !isInputNameValid(args[1]) { -// err = errors.New(fmt.Sprintf("Component or Entry name provided are not valid")) -// return err, 1 -// } else { -// component = args[0] -// entry = args[1] -// } -// } -// -// var configuration string -// if timestamp == "" { -// timestamp, err, code = getLatestTimestamp(cfg, component , entry) -// if err != nil { -// return err, code -// } -// } -// key = componentsPath + component + "/" + entry + "/" + timestamp -// configuration, err = cfg.Get(key) -// if err != nil { -// return err, 2 -// } -// if configuration == "" { -// err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) -// return err, 3 -// } -// configMap[timestamp] = configuration -// output, err, code := formatConfigOutput(cmd, configMap) -// if err != nil { -// return err, code -// } -// -// fmt.Fprintln(o, string(output)) -// return nil, 0 -//} -// -//func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { -// format, err := cmd.Flags().GetString("output") -// if err != nil { -// return -// } -// -// switch strings.ToLower(format) { -// case "json": -// parsedOutput, err = json.MarshalIndent(output, "", " ") -// case "yaml": -// parsedOutput, err = yaml.Marshal(output) -// } -// if err != nil { -// log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) -// return -// } -// return parsedOutput, nil -//} -// -//func formatConfigOutput( cmd *cobra.Command, output map[string]string)(parsedOutput []byte, err error, code int) { -// format, err := cmd.Flags().GetString("output") -// if err != nil { -// code = 1 -// return -// } -// -// switch strings.ToLower(format) { -// case "json": -// parsedOutput, err = json.MarshalIndent(output, "", " ") -// case "yaml": -// parsedOutput, err = yaml.Marshal(output) -// case "toml": -// parsedOutput, err = toml.Marshal(output) -// } -// if err != nil { -// log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) -// return -// } -// return parsedOutput, nil, 0 -//} -// -//func isInputNameValid(input string)(valid bool) { -// if strings.Contains(input, "/") || strings.Contains(input, "@") { -// return false -// } else { -// return true -// } -//} -// -//func getLatestTimestamp(cfg configuration.Source, component string, entry string)(timestamp string, err error, code int) { -// keyPrefix := componentsPath + component + "/" + entry -// keys, err := cfg.GetKeysByPrefix(keyPrefix, "") -// if err != nil { -// err = errors.New(fmt.Sprintf("Could not query ConsulSource")) -// return "", err, 2 -// } -// if len(keys) == 0 { -// err = errors.New(fmt.Sprintf("No keys found")) -// return "", err, 3 -// } -// -// var maxTimeStamp string -// for _, key := range keys { -// componentsFullName := strings.TrimPrefix(key, keyPrefix + "/") -// if strings.Compare(componentsFullName, maxTimeStamp) > 0 { -// maxTimeStamp = componentsFullName -// } -// } -// return maxTimeStamp, nil, 0 -//} \ No newline at end of file +func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + keyPrefix := componentsPath + useTimestamp := false + if len(args) > 1 { + err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) + return err , 1 + } else { + useTimestamp, err = cmd.Flags().GetBool("timestamp") + if err != nil { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) + return err, 1 + } + if len(args) == 1 { + if !isInputNameValid(args[0]) { + err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) + return err, 1 + } else { + keyPrefix += args[0] + "/" + } + } else if len(args) == 0 && useTimestamp { + err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) + return err, 1 + } + } + + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + err = errors.New(fmt.Sprintf("Could not query ConsulSource")) + return err, 2 + } + + // keys is empty? for a certain component? throw error maybe? + + var components []string + componentsSet := make(map[string]string) + + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + componentTimestamp := componentParts[len(componentParts) - 1] + if useTimestamp { + componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) + } else { + componentsFullName = componentParts[0] + } + + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ + componentsSet[componentsFullName] = componentTimestamp + } + } + + for key,value := range componentsSet { + if useTimestamp { + components = append(components, key+"@"+value) + } else { + components = append(components, key) + } + } + + output, err := formatListOutput(cmd, components) + if err != nil { + return err, 4 + } + fmt.Fprintln(o, string(output)) + return nil, 0 +} + +func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + var key, component, entry, timestamp string + configMap := make(map[string]string) + + if len(args) < 1 || len(args) > 2 { + err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) + return err, 1 + } + + timestamp, err = cmd.Flags().GetString("timestamp") + if err != nil { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) + return err, 1 + } + + switch len(args) { + case 1: + if strings.Contains(args[0], "@") && strings.Contains(args[0], "/"){ + if timestamp != "" { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) + return err, 1 + } + // coconut conf show component/entry@timestamp + arg := strings.Replace(args[0], "@", "/", 1) + params := strings.Split(arg, "/") + component = params[0] + entry = params[1] + timestamp = params[2] + } else if strings.Contains(args[0], "/") { + // assumes component/entry + params := strings.Split(args[0], "/") + component = params[0] + entry = params[1] + } else { + // coconut conf show component / coconut conf show component@timestamp + err = errors.New(fmt.Sprintf("Please provide entry name")) + return err, 1 + } + case 2: + if !isInputNameValid(args[0]) || !isInputNameValid(args[1]) { + err = errors.New(fmt.Sprintf("Component or Entry name provided are not valid")) + return err, 1 + } else { + component = args[0] + entry = args[1] + } + } + + var configuration string + if timestamp == "" { + timestamp, err, code = getLatestTimestamp(cfg, component , entry) + if err != nil { + return err, code + } + } + key = componentsPath + component + "/" + entry + "/" + timestamp + configuration, err = cfg.Get(key) + if err != nil { + return err, 2 + } + if configuration == "" { + err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) + return err, 3 + } + configMap[timestamp] = configuration + output, err, code := formatConfigOutput(cmd, configMap) + if err != nil { + return err, code + } + + fmt.Fprintln(o, string(output)) + return nil, 0 +} + +func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("output") + if err != nil { + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + } + if err != nil { + log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) + return + } + return parsedOutput, nil +} + +func formatConfigOutput( cmd *cobra.Command, output map[string]string)(parsedOutput []byte, err error, code int) { + format, err := cmd.Flags().GetString("output") + if err != nil { + code = 1 + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + case "toml": + parsedOutput, err = toml.Marshal(output) + } + if err != nil { + log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) + return + } + return parsedOutput, nil, 0 +} + +func isInputNameValid(input string)(valid bool) { + if strings.Contains(input, "/") || strings.Contains(input, "@") { + return false + } else { + return true + } +} + +func getLatestTimestamp(cfg configuration.Source, component string, entry string)(timestamp string, err error, code int) { + keyPrefix := componentsPath + component + "/" + entry + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + err = errors.New(fmt.Sprintf("Could not query ConsulSource")) + return "", err, 2 + } + if len(keys) == 0 { + err = errors.New(fmt.Sprintf("No keys found")) + return "", err, 3 + } + + var maxTimeStamp string + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix + "/") + if strings.Compare(componentsFullName, maxTimeStamp) > 0 { + maxTimeStamp = componentsFullName + } + } + return maxTimeStamp, nil, 0 +} \ No newline at end of file diff --git a/configuration/source.go b/configuration/source.go index deffc54ce..0251307bb 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -35,7 +35,6 @@ import ( type ROSource interface { Get(string) (string, error) GetRecursive(string) (Item, error) - GetKeysByPrefix(string, string)([]string, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) } diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index c77499049..c75a071bd 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -150,11 +150,6 @@ func (yc *YamlSource) Get(key string) (value string, err error) { return } -func (cc *YamlSource) GetKeysByPrefix(key string, separator string)(value []string, err error) { - // - return nil, nil -} - func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { From 97e39726a350c4eb0f7dddaa7d91867f4ecf77d0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Sep 2019 15:10:10 +0200 Subject: [PATCH 0017/2352] [coconut] Update documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 3 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_list.md | 43 ++++++++++++++++++++++ coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 2 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 2 +- 25 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 coconut/doc/coconut_configuration_list.md diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 68d26a33d..75714aa68 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -30,4 +30,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 719c1d476..8a1caa37e 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -29,4 +29,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index e9befee57..32bfa461d 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -26,5 +26,6 @@ configuration store. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut configuration dump](coconut_configuration_dump.md) - dump configuration subtree +* [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 57dc53399..230bd4328 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -32,4 +32,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md new file mode 100644 index 000000000..325647560 --- /dev/null +++ b/coconut/doc/coconut_configuration_list.md @@ -0,0 +1,43 @@ +## coconut configuration list + +List all existing O² components in Consul + +### Synopsis + +The configuration list command requests all components +from O² Configuration as a list and displays it on the standard output + +``` +coconut configuration list [component] [flags] +``` + +### Examples + +``` +coconut conf list +coconut conf list +coconut conf list -t +``` + +### Options + +``` + -h, --help help for list + -o, --output string output format for the configuration list (yaml/json) (default "yaml") + -t, --timestamp display latest timestamp entries for the requested component +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + -v, --verbose show verbose output for debug purposes +``` + +### SEE ALSO + +* [coconut configuration](coconut_configuration.md) - view or modify O² configuration + +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index b26d6947e..87f58b7d6 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -51,4 +51,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 7d9d766d5..490c73db0 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -39,4 +39,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index a1f04d05d..70aaaec7d 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -44,4 +44,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index e4b4611a5..65309ea26 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -34,4 +34,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index d83dd0d18..0e5891b70 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -30,4 +30,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 59dcabc27..a9ae34209 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -32,4 +32,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index a7b3d3314..dbff96108 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -30,4 +30,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 45c855c0e..990ba7b47 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -55,4 +55,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index c47038b83..12d7d48de 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -30,4 +30,4 @@ coconut repository add [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 1af3fb0dd..598384701 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index d948a815f..b61f03079 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 1b18a1bb6..e98e5c5c2 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index d9ce35142..6974db100 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 67554b5f1..adc6381db 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -27,4 +27,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 088b28b9d..685fcac84 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -29,4 +29,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index eb829f56f..e75a6d57d 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -28,4 +28,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 49c8f6177..b3606e482 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -31,4 +31,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 1dc5e7201..757240d2d 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -30,4 +30,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 5aca6ec2d..fd95dfbea 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -27,4 +27,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 964def551..201200bfb 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -30,4 +30,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 26-Aug-2019 +###### Auto generated by spf13/cobra on 12-Sep-2019 From e2f9039dd9d9e78dbd0978632f6b86bc589ae6bd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Sep 2019 15:10:36 +0200 Subject: [PATCH 0018/2352] [executor] Fix bug which prevented configuration payload to be printed --- executor/executor.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executor.go b/executor/executor.go index 34e548284..2a5d53d7c 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -355,7 +355,7 @@ func handleMessage(state *internalState, data []byte) (err error) { } state.mu.RUnlock() - if cmd.Name == "CONFIGURE" { + if cmd.Event == "CONFIGURE" { log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") } From bd908064648a130e25414e2e6e52f5d1df1c56f8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Sep 2019 15:27:26 +0200 Subject: [PATCH 0019/2352] [executor] Improve configuration kv output --- executor/executorcmd/client.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 8a1665752..c771f8ac3 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -97,20 +97,28 @@ func (r *RpcClient) UnmarshalTransition(data []byte) (cmd *ExecutorCommand_Trans } func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, err error) { - log.WithField("event", ei.Evt).Debug("executor<->occplugin interface requesting transition") + log.WithField("event", ei.Evt). + Debug("executor<->occplugin interface requesting transition") + var response *pb.TransitionReply + + argsToPush := func() (cfg []*pb.ConfigEntry) { + cfg = make([]*pb.ConfigEntry, 0) + if len(ei.Args) == 0 { + return + } + for k, v := range ei.Args { + cfg = append(cfg, &pb.ConfigEntry{Key: k, Value: v}) + log.WithField("key", k). + WithField("value", v). + Debug("pushing argument") + } + return + }() + response, err = r.Transition(context.TODO(), &pb.TransitionRequest{ TransitionEvent: ei.Evt, - Arguments: func() (cfg []*pb.ConfigEntry) { - cfg = make([]*pb.ConfigEntry, 0) - if len(ei.Args) == 0 { - return - } - for k, v := range ei.Args { - cfg = append(cfg, &pb.ConfigEntry{Key: k, Value: v}) - } - return - }(), + Arguments: argsToPush, SrcState: ei.Src, }, grpc.EmptyCallOption{}) From 76db0514a1bcf3b6f0adc82b21092aba42dd1d2b Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 16 Sep 2019 14:10:45 +0000 Subject: [PATCH 0020/2352] [OCONF-165] Setting up test env --- coconut/configuration/configuration.go | 20 +- configuration/conf_test.go | 51 +++ configuration/configuration_suite_test.go | 51 ++- configuration/consulsource.go | 14 - configuration/source.go | 2 +- configuration/source_test.go | 458 +++++++++++----------- 6 files changed, 316 insertions(+), 280 deletions(-) create mode 100644 configuration/conf_test.go diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index a3addc9ae..d2196441d 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -39,6 +39,7 @@ import ( "strings" "github.com/AliceO2Group/Control/configuration" "errors" + "regexp" "encoding/json" "gopkg.in/yaml.v2" "github.com/naoina/toml" @@ -51,6 +52,9 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) var componentsPath = "o2/components/" + +var InputRegex, _ = regexp.Compile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)?(\@[0-9]+)?$$`) + // code = 1 - Provided args by the user are invalid // code = 2 - Source connection error // code = 3 - Source retrieved empty data @@ -148,7 +152,7 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, 1 } if len(args) == 1 { - if !isInputNameValid(args[0]) { + if !IsInputNameValid(args[0]) { err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) return err, 1 } else { @@ -219,7 +223,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o switch len(args) { case 1: - if strings.Contains(args[0], "@") && strings.Contains(args[0], "/"){ + if IsInputNameValid(args[0]){ if timestamp != "" { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) return err, 1 @@ -241,7 +245,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, 1 } case 2: - if !isInputNameValid(args[0]) || !isInputNameValid(args[1]) { + if !IsInputNameValid(args[0]) || !IsInputNameValid(args[1]) { err = errors.New(fmt.Sprintf("Component or Entry name provided are not valid")) return err, 1 } else { @@ -317,15 +321,11 @@ func formatConfigOutput( cmd *cobra.Command, output map[string]string)(parsedOut return parsedOutput, nil, 0 } -func isInputNameValid(input string)(valid bool) { - if strings.Contains(input, "/") || strings.Contains(input, "@") { - return false - } else { - return true - } +func IsInputNameValid(input string)(valid bool) { + return InputRegex.MatchString(input) } -func getLatestTimestamp(cfg configuration.Source, component string, entry string)(timestamp string, err error, code int) { +func getLatestTimestamp(cfg *configuration.ConsulSource, component string, entry string)(timestamp string, err error, code int) { keyPrefix := componentsPath + component + "/" + entry keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { diff --git a/configuration/conf_test.go b/configuration/conf_test.go new file mode 100644 index 000000000..47c2f54e3 --- /dev/null +++ b/configuration/conf_test.go @@ -0,0 +1,51 @@ +package configuration_test + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" +) +var _ = Describe("Conf", func() { + Describe("Test helper methods", func() { + Context("when the user provides input for commands", func() { + It("should pass if input is one word without `/` or `@`", func() { + isValid := configuration.IsInputNameValid("component") + Expect(isValid).To(Equal(true)) + }) + It("should pass if input is in format `/", func() { + isValid := configuration.IsInputNameValid("component/entry") + Expect(isValid).To(Equal(true)) + }) + It("should pass if input is in format `/@", func() { + isValid := configuration.IsInputNameValid("component/entry/12345") + Expect(isValid).To(Equal(true)) + }) + It("should fail if input is one word containing `/` or `@`", func() { + isValidSlash := configuration.IsInputNameValid("component/") + isValidAt := configuration.IsInputNameValid("component@") + Expect(isValidSlash).To(Equal(false)) + Expect(isValidAt).To(Equal(false)) + }) + + It("should not error", func() { + }) + }) + + }) + + Describe("Test coconut configuration dump command", func() { + It("should test dump command", func() { + }) + }) + + Describe("Test coconut configuration list command", func() { + It("should test list command", func() { + }) + }) + + Describe("Test coconut configuration show command", func() { + It("should test show command", func() { + }) + }) + +}) \ No newline at end of file diff --git a/configuration/configuration_suite_test.go b/configuration/configuration_suite_test.go index bc4f5d411..0298c356b 100644 --- a/configuration/configuration_suite_test.go +++ b/configuration/configuration_suite_test.go @@ -1,11 +1,10 @@ package configuration_test import ( - "io" - "io/ioutil" - "os" + //"io" + //"io/ioutil" + //"os" "testing" - . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) @@ -18,25 +17,25 @@ func TestConfiguration(t *testing.T) { RunSpecs(t, "Configuration Suite") } -var _ = BeforeSuite(func() { - var err error - tmpDir = new(string) - *tmpDir, err = ioutil.TempDir("", "o2control-configuration") - Expect(err).NotTo(HaveOccurred()) - - // copy config file - from, err := os.Open("./" + configFile) - Expect(err).NotTo(HaveOccurred()) - defer from.Close() - - to, err := os.OpenFile(*tmpDir + "/" + configFile, os.O_RDWR|os.O_CREATE, 0666) - Expect(err).NotTo(HaveOccurred()) - defer to.Close() - - _, err = io.Copy(to, from) - Expect(err).NotTo(HaveOccurred()) -}) - -var _ = AfterSuite(func() { - os.RemoveAll(*tmpDir) -}) +//var _ = BeforeSuite(func() { +// var err error +// tmpDir = new(string) +// *tmpDir, err = ioutil.TempDir("", "o2control-configuration") +// Expect(err).NotTo(HaveOccurred()) +// +// // copy config file +// from, err := os.Open("./" + configFile) +// Expect(err).NotTo(HaveOccurred()) +// defer from.Close() +// +// to, err := os.OpenFile(*tmpDir + "/" + configFile, os.O_RDWR|os.O_CREATE, 0666) +// Expect(err).NotTo(HaveOccurred()) +// defer to.Close() +// +// _, err = io.Copy(to, from) +// Expect(err).NotTo(HaveOccurred()) +//}) +// +//var _ = AfterSuite(func() { +// os.RemoveAll(*tmpDir) +//}) diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 0906a8a2c..ffb685d77 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -37,20 +37,6 @@ type ConsulSource struct { kv *api.KV } -func newConsulSource(uri string) (cc *ConsulSource, err error) { - cfg := api.DefaultConfig() - cfg.Address = uri - cli, err := api.NewClient(cfg) - if err != nil { - return - } - cc = &ConsulSource{ - uri: uri, - kv: cli.KV(), - } - return -} - func NewConsulSource(uri string) (cc *ConsulSource, err error) { cfg := api.DefaultConfig() cfg.Address = uri diff --git a/configuration/source.go b/configuration/source.go index 0251307bb..9fba16cb1 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -48,7 +48,7 @@ type Source interface { func NewSource(uri string) (configuration Source, err error) { if strings.HasPrefix(uri, "consul://") { - configuration, err = newConsulSource(strings.TrimPrefix(uri, "consul://")) + configuration, err = NewConsulSource(strings.TrimPrefix(uri, "consul://")) return } else if strings.HasPrefix(uri, "file://") && (strings.HasSuffix(uri, ".yaml") || strings.HasSuffix(uri, ".json")) { diff --git a/configuration/source_test.go b/configuration/source_test.go index e0e09f245..c2618f1c1 100644 --- a/configuration/source_test.go +++ b/configuration/source_test.go @@ -1,237 +1,237 @@ package configuration_test import ( - . "github.com/AliceO2Group/Control/configuration" + //. "github.com/AliceO2Group/Control/configuration" . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "gopkg.in/yaml.v2" + //. "github.com/onsi/gomega" + //"gopkg.in/yaml.v2" ) var _ = Describe("Source", func() { - var ( - c Source - err error - ) - - DoConfigurationTests := func() { - var ( - o2_control_tasks_1_map = Map{ - "name": String("fairmq-ex-1-n-1-sampler"), - "control": Map{ - "mode": String("fairmq"), - }, - "wants": Map{ - "cpu": String("1"), - "memory": String("256"), - "ports": String("1"), - }, - "bind": Array{ - Map{ - "name": String("data1"), - "type": String("push"), - "sndBufSize": String("1000"), - "rcvBufSize": String("1000"), - "rateLogging": String("0"), - }, - }, - "properties": Map{ - "severity": String("trace"), - "color": String("false"), - }, - "command": Map{ - "env": Array{}, - "shell": String("true"), - "arguments": Array{}, - "value": String("fairmq-ex-1-n-1-sampler"), - }, - } - recursivePutMap = Map{ - "firstKey": String("one"), - "secondKey": Array{ - Map{ - "name": String("first"), - "type": String("an array item"), - }, - Map{ - "name": String("second"), - "type": String("an array item"), - }, - Map{ - "name": String("third"), - "type": String("and yet another array item"), - }, - }, - "thirdKey": Map{ - "just some": String("stuff"), - }, - } - recursivePutArray = Array{ - Map{ - "name": String("first"), - "type": String("an array item with a property map inside"), - "properties": Map{ - "just some": String("stuff"), - }, - }, - Map{ - "name": String("second"), - "type": String("an array item"), - }, - Map{ - "name": String("third"), - "type": String("and yet another array item"), - }, - } - recursivePutString = String("this is a bit underwhelming compared to the other two...") - ) - - It("should return no error when creating an instance", func() { - Expect(err).NotTo(HaveOccurred()) - }) - - Context("to get a subtree or value", func() { - It("should correctly get a single item", func() { - Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) - Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) - Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) - }) - - It("should correctly recursively get a configuration subtree", func() { - Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) - }) - - It("should correctly recursively get a configuration subtree as YAML", func() { - marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) - Expect(marshErr).NotTo(HaveOccurred()) - Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) - }) - }) - - Context("to check the existence of a key", func() { - It("should correctly determine whether a value node is defined", func() { - Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) - Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) - }) - - It("should correctly determine whether a map node is defined", func() { - Expect(c.Exists("o2")).To(BeTrue()) - }) - - It("should correctly determine whether an array node is defined", func() { - Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) - Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) - }) - - It("should correctly address non-existent keys", func() { - Expect(c.Exists("")).To(BeFalse()) - Expect(c.Exists("FakeKey")).To(BeFalse()) - }) - }) - - Context("to add a new subtree or value", func(){ - It("should correctly push a single value", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) - putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) - }) - - It("should correctly push a configuration.Map", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) - putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) - }) - - It("should correctly push an configuration.Array", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) - putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) - }) - - It("should correctly push a configuration.String", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) - putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) - }) - - It("should correctly push a YAML map", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) - marshalled, marshErr := yaml.Marshal(recursivePutMap) - Expect(marshErr).NotTo(HaveOccurred()) - putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) - }) - - It("should correctly push a YAML array", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) - marshalled, marshErr := yaml.Marshal(recursivePutArray) - Expect(marshErr).NotTo(HaveOccurred()) - putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) - }) - }) - - Context("to replace/update an existing subtree or value", func() { - It("should correctly push a single value", func() { - Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) - putErr := c.Put("o2/control/globals/config_basedir", "foobar") - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) - }) - - It("should correctly push a configuration.Map", func() { - Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) - putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) - }) - - It("should correctly push an configuration.Array", func() { - Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) - putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) - }) - - It("should correctly push a configuration.String", func() { - Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) - putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) - Expect(putErr).NotTo(HaveOccurred()) - Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) - }) - }) - } - - Describe("when interacting with an instance", func() { - Context("with Consul backend", func() { - BeforeEach(func() { - c, err = NewSource("consul://dummy") - }) - - It("should be of type *ConsulSource", func() { - _, ok := c.(*ConsulSource) - Expect(ok).To(Equal(true)) - }) - - //DoConfigurationTests() - }) - - Context("with YAML file backend", func() { - BeforeEach(func() { - c, err = NewSource("file://" + *tmpDir + "/" + configFile) - }) - - It("should be of type *YamlSource", func() { - _, ok := c.(*YamlSource) - Expect(ok).To(Equal(true)) - }) - - DoConfigurationTests() - }) - }) +// var ( +// c Source +// err error +// ) +// +// DoConfigurationTests := func() { +// var ( +// o2_control_tasks_1_map = Map{ +// "name": String("fairmq-ex-1-n-1-sampler"), +// "control": Map{ +// "mode": String("fairmq"), +// }, +// "wants": Map{ +// "cpu": String("1"), +// "memory": String("256"), +// "ports": String("1"), +// }, +// "bind": Array{ +// Map{ +// "name": String("data1"), +// "type": String("push"), +// "sndBufSize": String("1000"), +// "rcvBufSize": String("1000"), +// "rateLogging": String("0"), +// }, +// }, +// "properties": Map{ +// "severity": String("trace"), +// "color": String("false"), +// }, +// "command": Map{ +// "env": Array{}, +// "shell": String("true"), +// "arguments": Array{}, +// "value": String("fairmq-ex-1-n-1-sampler"), +// }, +// } +// recursivePutMap = Map{ +// "firstKey": String("one"), +// "secondKey": Array{ +// Map{ +// "name": String("first"), +// "type": String("an array item"), +// }, +// Map{ +// "name": String("second"), +// "type": String("an array item"), +// }, +// Map{ +// "name": String("third"), +// "type": String("and yet another array item"), +// }, +// }, +// "thirdKey": Map{ +// "just some": String("stuff"), +// }, +// } +// recursivePutArray = Array{ +// Map{ +// "name": String("first"), +// "type": String("an array item with a property map inside"), +// "properties": Map{ +// "just some": String("stuff"), +// }, +// }, +// Map{ +// "name": String("second"), +// "type": String("an array item"), +// }, +// Map{ +// "name": String("third"), +// "type": String("and yet another array item"), +// }, +// } +// recursivePutString = String("this is a bit underwhelming compared to the other two...") +// ) +// +// It("should return no error when creating an instance", func() { +// Expect(err).NotTo(HaveOccurred()) +// }) +// +// Context("to get a subtree or value", func() { +// It("should correctly get a single item", func() { +// Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) +// Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) +// Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) +// }) +// +// It("should correctly recursively get a configuration subtree", func() { +// Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) +// }) +// +// It("should correctly recursively get a configuration subtree as YAML", func() { +// marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) +// Expect(marshErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) +// }) +// }) +// +// Context("to check the existence of a key", func() { +// It("should correctly determine whether a value node is defined", func() { +// Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) +// Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) +// }) +// +// It("should correctly determine whether a map node is defined", func() { +// Expect(c.Exists("o2")).To(BeTrue()) +// }) +// +// It("should correctly determine whether an array node is defined", func() { +// Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) +// Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) +// }) +// +// It("should correctly address non-existent keys", func() { +// Expect(c.Exists("")).To(BeFalse()) +// Expect(c.Exists("FakeKey")).To(BeFalse()) +// }) +// }) +// +// Context("to add a new subtree or value", func(){ +// It("should correctly push a single value", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) +// putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) +// }) +// +// It("should correctly push a configuration.Map", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) +// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) +// }) +// +// It("should correctly push an configuration.Array", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) +// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) +// }) +// +// It("should correctly push a configuration.String", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) +// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) +// }) +// +// It("should correctly push a YAML map", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) +// marshalled, marshErr := yaml.Marshal(recursivePutMap) +// Expect(marshErr).NotTo(HaveOccurred()) +// putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) +// }) +// +// It("should correctly push a YAML array", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) +// marshalled, marshErr := yaml.Marshal(recursivePutArray) +// Expect(marshErr).NotTo(HaveOccurred()) +// putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) +// }) +// }) +// +// Context("to replace/update an existing subtree or value", func() { +// It("should correctly push a single value", func() { +// Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) +// putErr := c.Put("o2/control/globals/config_basedir", "foobar") +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) +// }) +// +// It("should correctly push a configuration.Map", func() { +// Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) +// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) +// }) +// +// It("should correctly push an configuration.Array", func() { +// Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) +// putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) +// }) +// +// It("should correctly push a configuration.String", func() { +// Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) +// putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) +// Expect(putErr).NotTo(HaveOccurred()) +// Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) +// }) +// }) +// } +// +// Describe("when interacting with an instance", func() { +// Context("with Consul backend", func() { +// BeforeEach(func() { +// c, err = NewSource("consul://dummy") +// }) +// +// It("should be of type *ConsulSource", func() { +// _, ok := c.(*ConsulSource) +// Expect(ok).To(Equal(true)) +// }) +// +// //DoConfigurationTests() +// }) +// +// Context("with YAML file backend", func() { +// BeforeEach(func() { +// c, err = NewSource("file://" + *tmpDir + "/" + configFile) +// }) +// +// It("should be of type *YamlSource", func() { +// _, ok := c.(*YamlSource) +// Expect(ok).To(Equal(true)) +// }) +// +// DoConfigurationTests() +// }) +// }) }) From 3b4ad40cc1ee655c8d80d763d6150ec09b61c0ee Mon Sep 17 00:00:00 2001 From: George Raduta Date: Mon, 16 Sep 2019 23:39:01 +0200 Subject: [PATCH 0021/2352] [OCONF-165] Add unit tests --- coconut/configuration/configuration.go | 87 +++-- configuration/conf_test.go | 68 +++- configuration/source_test.go | 454 +++++++++++++------------ 3 files changed, 332 insertions(+), 277 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index d2196441d..eadaae061 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -170,32 +170,9 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, 2 } - // keys is empty? for a certain component? throw error maybe? - - var components []string - componentsSet := make(map[string]string) - - for _, key := range keys { - componentsFullName := strings.TrimPrefix(key, keyPrefix) - componentParts := strings.Split(componentsFullName, "/") - componentTimestamp := componentParts[len(componentParts) - 1] - if useTimestamp { - componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) - } else { - componentsFullName = componentParts[0] - } - - if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ - componentsSet[componentsFullName] = componentTimestamp - } - } - - for key,value := range componentsSet { - if useTimestamp { - components = append(components, key+"@"+value) - } else { - components = append(components, key) - } + components, err, code := GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) + if err != nil { + return err, code } output, err := formatListOutput(cmd, components) @@ -256,7 +233,12 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o var configuration string if timestamp == "" { - timestamp, err, code = getLatestTimestamp(cfg, component , entry) + keyPrefix := componentsPath + component + "/" + entry + keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + if err != nil { + return errors.New(fmt.Sprintf("Could not query ConsulSource")), 2 + } + timestamp, err, code = GetLatestTimestamp(keys, component , entry) if err != nil { return err, code } @@ -325,13 +307,10 @@ func IsInputNameValid(input string)(valid bool) { return InputRegex.MatchString(input) } -func getLatestTimestamp(cfg *configuration.ConsulSource, component string, entry string)(timestamp string, err error, code int) { +// Method to return the latest timestamp for a specified component & entry +// If no keys were passed an error and code exit 3 will be returned +func GetLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error, code int) { keyPrefix := componentsPath + component + "/" + entry - keys, err := cfg.GetKeysByPrefix(keyPrefix, "") - if err != nil { - err = errors.New(fmt.Sprintf("Could not query ConsulSource")) - return "", err, 2 - } if len(keys) == 0 { err = errors.New(fmt.Sprintf("No keys found")) return "", err, 3 @@ -339,10 +318,46 @@ func getLatestTimestamp(cfg *configuration.ConsulSource, component string, entry var maxTimeStamp string for _, key := range keys { - componentsFullName := strings.TrimPrefix(key, keyPrefix + "/") - if strings.Compare(componentsFullName, maxTimeStamp) > 0 { - maxTimeStamp = componentsFullName + componentTimestamp := strings.TrimPrefix(key, keyPrefix + "/") + fmt.Println(componentTimestamp) + if strings.Compare(componentTimestamp, maxTimeStamp) > 0 { + maxTimeStamp = componentTimestamp } } return maxTimeStamp, nil, 0 +} + +// Method to return a list of components, entries or entries with latest timestamp +// If no keys were passed an error and code exit 3 will be returned +func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { + if len(keys) == 0 { + return []string{}, errors.New(fmt.Sprintf("No keys found")), 3 + } + + var components []string + componentsSet := make(map[string]string) + + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + componentTimestamp := componentParts[len(componentParts) - 1] + if useTimestamp { + componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) + } else { + componentsFullName = componentParts[0] + } + + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ + componentsSet[componentsFullName] = componentTimestamp + } + } + + for key,value := range componentsSet { + if useTimestamp { + components = append(components, key+"@"+value) + } else { + components = append(components, key) + } + } + return components, nil, 0 } \ No newline at end of file diff --git a/configuration/conf_test.go b/configuration/conf_test.go index 47c2f54e3..590fa5d15 100644 --- a/configuration/conf_test.go +++ b/configuration/conf_test.go @@ -5,9 +5,11 @@ import ( . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) + var _ = Describe("Conf", func() { - Describe("Test helper methods", func() { - Context("when the user provides input for commands", func() { + + Describe("Test helper methods in configuration package", func() { + Context("IsInputNameValid() - when the user provides input for commands", func() { It("should pass if input is one word without `/` or `@`", func() { isValid := configuration.IsInputNameValid("component") Expect(isValid).To(Equal(true)) @@ -17,7 +19,7 @@ var _ = Describe("Conf", func() { Expect(isValid).To(Equal(true)) }) It("should pass if input is in format `/@", func() { - isValid := configuration.IsInputNameValid("component/entry/12345") + isValid := configuration.IsInputNameValid("component/entry@12345") Expect(isValid).To(Equal(true)) }) It("should fail if input is one word containing `/` or `@`", func() { @@ -26,25 +28,61 @@ var _ = Describe("Conf", func() { Expect(isValidSlash).To(Equal(false)) Expect(isValidAt).To(Equal(false)) }) + }) + + Context("GetListOfComponentsAndOrWithTimestamps() - get latest timestamp for each component given", func() { + var keys []string + var readoutKeys []string + readoutKeys = append(readoutKeys,"o2/components/readout/cru/1", "o2/components/readout/cru/2", + "o2/components/readout/no-cru/10") + keys = append(readoutKeys, "o2/components/tpc/no-cru/3", "o2/components/tpc/cru/0") + + keyPrefix := "o2/components/" - It("should not error", func() { + It("should fail and return error and exit code 3 for empty array of keys being passed", func() { + components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps([]string{}, keyPrefix, false) + Expect(err.Error()).To(Equal("No keys found")) + Expect(code).To(Equal(3)) + Expect(components).To(Equal([]string{})) }) - }) - }) + It("should successfully pass, return error nil, code 0 and array of components when no component/timestamp is added to keyprefix", func() { + components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, false) + Expect(err).To(BeNil()) + Expect(code).To(Equal(0)) + Expect(components).To(Equal([]string{"readout", "tpc"})) + }) - Describe("Test coconut configuration dump command", func() { - It("should test dump command", func() { - }) - }) + It("should successfully pass, return error nil, code 0 and array of entries when component is provided", func() { + components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(readoutKeys, keyPrefix + "readout/", false) + Expect(err).To(BeNil()) + Expect(code).To(Equal(0)) + Expect(components).To(Equal([]string{"cru", "no-cru"})) + }) - Describe("Test coconut configuration list command", func() { - It("should test list command", func() { + It("should successfully pass, return error nil, code 0 and array of entries when component is provided and timestamp is used", func() { + components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(readoutKeys, keyPrefix + "readout/", true) + Expect(err).To(BeNil()) + Expect(code).To(Equal(0)) + Expect(components).To(Equal([]string{"cru@2", "no-cru@10"})) + }) }) - }) - Describe("Test coconut configuration show command", func() { - It("should test show command", func() { + Context("GetLatestTimestamp() - given a component and entry it will return the latest timestamp if exists", func() { + var keysReadoutCRU = append([]string{}, "o2/components/readout/cru/1", "o2/components/readout/cru/2") + + It("should fail and return error and exit code 3 due to empty keys", func() { + _, err, code := configuration.GetLatestTimestamp([]string{}, "readout", "cru") + Expect(err.Error()).To(Equal("No keys found")) + Expect(code).To(Equal(3)) + }) + + It("should successfully return the latest timestamp of a given component & entry", func() { + timestamp, err, code := configuration.GetLatestTimestamp(keysReadoutCRU, "readout", "cru") + Expect(err).To(BeNil()) + Expect(code).To(Equal(0)) + Expect(timestamp).To(Equal("2")) + }) }) }) diff --git a/configuration/source_test.go b/configuration/source_test.go index c2618f1c1..5100e0673 100644 --- a/configuration/source_test.go +++ b/configuration/source_test.go @@ -3,235 +3,237 @@ package configuration_test import ( //. "github.com/AliceO2Group/Control/configuration" . "github.com/onsi/ginkgo" + //"gopkg.in/yaml.v2" + //. "github.com/onsi/gomega" //"gopkg.in/yaml.v2" ) var _ = Describe("Source", func() { -// var ( -// c Source -// err error -// ) -// -// DoConfigurationTests := func() { -// var ( -// o2_control_tasks_1_map = Map{ -// "name": String("fairmq-ex-1-n-1-sampler"), -// "control": Map{ -// "mode": String("fairmq"), -// }, -// "wants": Map{ -// "cpu": String("1"), -// "memory": String("256"), -// "ports": String("1"), -// }, -// "bind": Array{ -// Map{ -// "name": String("data1"), -// "type": String("push"), -// "sndBufSize": String("1000"), -// "rcvBufSize": String("1000"), -// "rateLogging": String("0"), -// }, -// }, -// "properties": Map{ -// "severity": String("trace"), -// "color": String("false"), -// }, -// "command": Map{ -// "env": Array{}, -// "shell": String("true"), -// "arguments": Array{}, -// "value": String("fairmq-ex-1-n-1-sampler"), -// }, -// } -// recursivePutMap = Map{ -// "firstKey": String("one"), -// "secondKey": Array{ -// Map{ -// "name": String("first"), -// "type": String("an array item"), -// }, -// Map{ -// "name": String("second"), -// "type": String("an array item"), -// }, -// Map{ -// "name": String("third"), -// "type": String("and yet another array item"), -// }, -// }, -// "thirdKey": Map{ -// "just some": String("stuff"), -// }, -// } -// recursivePutArray = Array{ -// Map{ -// "name": String("first"), -// "type": String("an array item with a property map inside"), -// "properties": Map{ -// "just some": String("stuff"), -// }, -// }, -// Map{ -// "name": String("second"), -// "type": String("an array item"), -// }, -// Map{ -// "name": String("third"), -// "type": String("and yet another array item"), -// }, -// } -// recursivePutString = String("this is a bit underwhelming compared to the other two...") -// ) -// -// It("should return no error when creating an instance", func() { -// Expect(err).NotTo(HaveOccurred()) -// }) -// -// Context("to get a subtree or value", func() { -// It("should correctly get a single item", func() { -// Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) -// Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) -// Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) -// }) -// -// It("should correctly recursively get a configuration subtree", func() { -// Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) -// }) -// -// It("should correctly recursively get a configuration subtree as YAML", func() { -// marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) -// Expect(marshErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) -// }) -// }) -// -// Context("to check the existence of a key", func() { -// It("should correctly determine whether a value node is defined", func() { -// Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) -// Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) -// }) -// -// It("should correctly determine whether a map node is defined", func() { -// Expect(c.Exists("o2")).To(BeTrue()) -// }) -// -// It("should correctly determine whether an array node is defined", func() { -// Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) -// Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) -// }) -// -// It("should correctly address non-existent keys", func() { -// Expect(c.Exists("")).To(BeFalse()) -// Expect(c.Exists("FakeKey")).To(BeFalse()) -// }) -// }) -// -// Context("to add a new subtree or value", func(){ -// It("should correctly push a single value", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) -// putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) -// }) -// -// It("should correctly push a configuration.Map", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) -// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) -// }) -// -// It("should correctly push an configuration.Array", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) -// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) -// }) -// -// It("should correctly push a configuration.String", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) -// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) -// }) -// -// It("should correctly push a YAML map", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) -// marshalled, marshErr := yaml.Marshal(recursivePutMap) -// Expect(marshErr).NotTo(HaveOccurred()) -// putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) -// }) -// -// It("should correctly push a YAML array", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) -// marshalled, marshErr := yaml.Marshal(recursivePutArray) -// Expect(marshErr).NotTo(HaveOccurred()) -// putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) -// }) -// }) -// -// Context("to replace/update an existing subtree or value", func() { -// It("should correctly push a single value", func() { -// Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) -// putErr := c.Put("o2/control/globals/config_basedir", "foobar") -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) -// }) -// -// It("should correctly push a configuration.Map", func() { -// Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) -// putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) -// }) -// -// It("should correctly push an configuration.Array", func() { -// Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) -// putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) -// }) -// -// It("should correctly push a configuration.String", func() { -// Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) -// putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) -// Expect(putErr).NotTo(HaveOccurred()) -// Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) -// }) -// }) -// } -// -// Describe("when interacting with an instance", func() { -// Context("with Consul backend", func() { -// BeforeEach(func() { -// c, err = NewSource("consul://dummy") -// }) -// -// It("should be of type *ConsulSource", func() { -// _, ok := c.(*ConsulSource) -// Expect(ok).To(Equal(true)) -// }) -// -// //DoConfigurationTests() -// }) -// -// Context("with YAML file backend", func() { -// BeforeEach(func() { -// c, err = NewSource("file://" + *tmpDir + "/" + configFile) -// }) -// -// It("should be of type *YamlSource", func() { -// _, ok := c.(*YamlSource) -// Expect(ok).To(Equal(true)) -// }) -// -// DoConfigurationTests() -// }) -// }) + //var ( + // c Source + // err error + //) + // + //DoConfigurationTests := func() { + // var ( + // o2_control_tasks_1_map = Map{ + // "name": String("fairmq-ex-1-n-1-sampler"), + // "control": Map{ + // "mode": String("fairmq"), + // }, + // "wants": Map{ + // "cpu": String("1"), + // "memory": String("256"), + // "ports": String("1"), + // }, + // "bind": Array{ + // Map{ + // "name": String("data1"), + // "type": String("push"), + // "sndBufSize": String("1000"), + // "rcvBufSize": String("1000"), + // "rateLogging": String("0"), + // }, + // }, + // "properties": Map{ + // "severity": String("trace"), + // "color": String("false"), + // }, + // "command": Map{ + // "env": Array{}, + // "shell": String("true"), + // "arguments": Array{}, + // "value": String("fairmq-ex-1-n-1-sampler"), + // }, + // } + // recursivePutMap = Map{ + // "firstKey": String("one"), + // "secondKey": Array{ + // Map{ + // "name": String("first"), + // "type": String("an array item"), + // }, + // Map{ + // "name": String("second"), + // "type": String("an array item"), + // }, + // Map{ + // "name": String("third"), + // "type": String("and yet another array item"), + // }, + // }, + // "thirdKey": Map{ + // "just some": String("stuff"), + // }, + // } + // recursivePutArray = Array{ + // Map{ + // "name": String("first"), + // "type": String("an array item with a property map inside"), + // "properties": Map{ + // "just some": String("stuff"), + // }, + // }, + // Map{ + // "name": String("second"), + // "type": String("an array item"), + // }, + // Map{ + // "name": String("third"), + // "type": String("and yet another array item"), + // }, + // } + // recursivePutString = String("this is a bit underwhelming compared to the other two...") + // ) + // + // It("should return no error when creating an instance", func() { + // Expect(err).NotTo(HaveOccurred()) + // }) + // + // Context("to get a subtree or value", func() { + // It("should correctly get a single item", func() { + // Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) + // Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) + // Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) + // }) + // + // It("should correctly recursively get a configuration subtree", func() { + // Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) + // }) + // + // It("should correctly recursively get a configuration subtree as YAML", func() { + // marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) + // Expect(marshErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) + // }) + // }) + // + // Context("to check the existence of a key", func() { + // It("should correctly determine whether a value node is defined", func() { + // Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) + // Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) + // }) + // + // It("should correctly determine whether a map node is defined", func() { + // Expect(c.Exists("o2")).To(BeTrue()) + // }) + // + // It("should correctly determine whether an array node is defined", func() { + // Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) + // Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) + // }) + // + // It("should correctly address non-existent keys", func() { + // Expect(c.Exists("")).To(BeFalse()) + // Expect(c.Exists("FakeKey")).To(BeFalse()) + // }) + // }) + // + // Context("to add a new subtree or value", func(){ + // It("should correctly push a single value", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) + // putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) + // }) + // + // It("should correctly push a configuration.Map", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) + // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) + // }) + // + // It("should correctly push an configuration.Array", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) + // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) + // }) + // + // It("should correctly push a configuration.String", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) + // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) + // }) + // + // It("should correctly push a YAML map", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) + // marshalled, marshErr := yaml.Marshal(recursivePutMap) + // Expect(marshErr).NotTo(HaveOccurred()) + // putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) + // }) + // + // It("should correctly push a YAML array", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) + // marshalled, marshErr := yaml.Marshal(recursivePutArray) + // Expect(marshErr).NotTo(HaveOccurred()) + // putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) + // }) + // }) + // + // Context("to replace/update an existing subtree or value", func() { + // It("should correctly push a single value", func() { + // Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) + // putErr := c.Put("o2/control/globals/config_basedir", "foobar") + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) + // }) + // + // It("should correctly push a configuration.Map", func() { + // Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) + // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) + // }) + // + // It("should correctly push an configuration.Array", func() { + // Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) + // putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) + // }) + // + // It("should correctly push a configuration.String", func() { + // Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) + // putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) + // Expect(putErr).NotTo(HaveOccurred()) + // Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) + // }) + // }) + //} + // + //Describe("when interacting with an instance", func() { + // Context("with Consul backend", func() { + // BeforeEach(func() { + // c, err = NewSource("consul://dummy") + // }) + // + // It("should be of type *ConsulSource", func() { + // _, ok := c.(*ConsulSource) + // Expect(ok).To(Equal(true)) + // }) + // + // //DoConfigurationTests() + // }) + // + // Context("with YAML file backend", func() { + // BeforeEach(func() { + // c, err = NewSource("file://" + *tmpDir + "/" + configFile) + // }) + // + // It("should be of type *YamlSource", func() { + // _, ok := c.(*YamlSource) + // Expect(ok).To(Equal(true)) + // }) + // + // DoConfigurationTests() + // }) + //}) }) From 000bc3ef9f4801a450b895cc353e34fd1f08e4a8 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 17 Sep 2019 14:55:15 +0200 Subject: [PATCH 0022/2352] [OCONF-165] Refactor code --- coconut/cmd/configuration_show.go | 1 - coconut/configuration/configuration.go | 74 +++++++++----------------- configuration/conf_test.go | 2 + 3 files changed, 28 insertions(+), 49 deletions(-) diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 532637ba4..dab800746 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -48,6 +48,5 @@ time configuration by specifying wanted timestamp as flag`, func init() { configurationCmd.AddCommand(configurationShowCmd) - configurationShowCmd.Flags().StringP("output", "o", "yaml", "output format for the configuration shown") configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index eadaae061..7b34db9da 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -152,7 +152,7 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, 1 } if len(args) == 1 { - if !IsInputNameValid(args[0]) { + if !IsInputSingleValidWord(args[0]) { err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) return err, 1 } else { @@ -185,7 +185,6 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { var key, component, entry, timestamp string - configMap := make(map[string]string) if len(args) < 1 || len(args) > 2 { err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) @@ -200,30 +199,32 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o switch len(args) { case 1: - if IsInputNameValid(args[0]){ - if timestamp != "" { - err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) - return err, 1 - } - // coconut conf show component/entry@timestamp - arg := strings.Replace(args[0], "@", "/", 1) - params := strings.Split(arg, "/") - component = params[0] - entry = params[1] - timestamp = params[2] - } else if strings.Contains(args[0], "/") { - // assumes component/entry - params := strings.Split(args[0], "/") - component = params[0] - entry = params[1] + if IsInputNameValid(args[0] ) { + if strings.Contains(args[0], "@") { + if timestamp != "" { + err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) + return err, 1 + } + // coconut conf show component/entry@timestamp + arg := strings.Replace(args[0], "@", "/", 1) + params := strings.Split(arg, "/") + component = params[0] + entry = params[1] + timestamp = params[2] + } else if strings.Contains(args[0], "/") { + // assumes component/entry + params := strings.Split(args[0], "/") + component = params[0] + entry = params[1] + } } else { // coconut conf show component / coconut conf show component@timestamp err = errors.New(fmt.Sprintf("Please provide entry name")) return err, 1 } case 2: - if !IsInputNameValid(args[0]) || !IsInputNameValid(args[1]) { - err = errors.New(fmt.Sprintf("Component or Entry name provided are not valid")) + if !IsInputSingleValidWord(args[0]) || !IsInputSingleValidWord(args[1]) { + err = errors.New(fmt.Sprintf("Component and Entry name cannot contain `/` or `@`")) return err, 1 } else { component = args[0] @@ -252,13 +253,8 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) return err, 3 } - configMap[timestamp] = configuration - output, err, code := formatConfigOutput(cmd, configMap) - if err != nil { - return err, code - } - fmt.Fprintln(o, string(output)) + fmt.Fprintln(o, string(configuration)) return nil, 0 } @@ -281,30 +277,12 @@ func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, return parsedOutput, nil } -func formatConfigOutput( cmd *cobra.Command, output map[string]string)(parsedOutput []byte, err error, code int) { - format, err := cmd.Flags().GetString("output") - if err != nil { - code = 1 - return - } - - switch strings.ToLower(format) { - case "json": - parsedOutput, err = json.MarshalIndent(output, "", " ") - case "yaml": - parsedOutput, err = yaml.Marshal(output) - case "toml": - parsedOutput, err = toml.Marshal(output) - } - if err != nil { - log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) - return - } - return parsedOutput, nil, 0 +func IsInputNameValid(input string) bool { + return InputRegex.MatchString(input) } -func IsInputNameValid(input string)(valid bool) { - return InputRegex.MatchString(input) +func IsInputSingleValidWord(input string) bool { + return !strings.Contains(input, "/") && !strings.Contains(input, "@") } // Method to return the latest timestamp for a specified component & entry diff --git a/configuration/conf_test.go b/configuration/conf_test.go index 590fa5d15..48494fb43 100644 --- a/configuration/conf_test.go +++ b/configuration/conf_test.go @@ -1,9 +1,11 @@ package configuration_test import ( + . "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/coconut/configuration" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" + "github.com/spf13/cobra" ) var _ = Describe("Conf", func() { From b6776deaeef3461b98f2fcfb63039c07960229ca Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 17 Sep 2019 15:01:35 +0200 Subject: [PATCH 0023/2352] [OCONF-165] Rever test changes --- coconut/configuration/configuration.go | 6 +- configuration/conf_test.go | 91 ----- configuration/configuration_suite_test.go | 50 +-- configuration/source_test.go | 460 +++++++++++----------- 4 files changed, 257 insertions(+), 350 deletions(-) delete mode 100644 configuration/conf_test.go diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 7b34db9da..3942a8364 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -103,7 +103,7 @@ func WrapCall(call ConfigurationCall) RunFunc { } } -func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { +func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, 1 @@ -212,13 +212,13 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o entry = params[1] timestamp = params[2] } else if strings.Contains(args[0], "/") { - // assumes component/entry + // coconut conf show component/entry params := strings.Split(args[0], "/") component = params[0] entry = params[1] } } else { - // coconut conf show component / coconut conf show component@timestamp + // coconut conf show component || coconut conf show component@timestamp err = errors.New(fmt.Sprintf("Please provide entry name")) return err, 1 } diff --git a/configuration/conf_test.go b/configuration/conf_test.go deleted file mode 100644 index 48494fb43..000000000 --- a/configuration/conf_test.go +++ /dev/null @@ -1,91 +0,0 @@ -package configuration_test - -import ( - . "github.com/AliceO2Group/Control/configuration" - "github.com/AliceO2Group/Control/coconut/configuration" - . "github.com/onsi/ginkgo" - . "github.com/onsi/gomega" - "github.com/spf13/cobra" -) - -var _ = Describe("Conf", func() { - - Describe("Test helper methods in configuration package", func() { - Context("IsInputNameValid() - when the user provides input for commands", func() { - It("should pass if input is one word without `/` or `@`", func() { - isValid := configuration.IsInputNameValid("component") - Expect(isValid).To(Equal(true)) - }) - It("should pass if input is in format `/", func() { - isValid := configuration.IsInputNameValid("component/entry") - Expect(isValid).To(Equal(true)) - }) - It("should pass if input is in format `/@", func() { - isValid := configuration.IsInputNameValid("component/entry@12345") - Expect(isValid).To(Equal(true)) - }) - It("should fail if input is one word containing `/` or `@`", func() { - isValidSlash := configuration.IsInputNameValid("component/") - isValidAt := configuration.IsInputNameValid("component@") - Expect(isValidSlash).To(Equal(false)) - Expect(isValidAt).To(Equal(false)) - }) - }) - - Context("GetListOfComponentsAndOrWithTimestamps() - get latest timestamp for each component given", func() { - var keys []string - var readoutKeys []string - readoutKeys = append(readoutKeys,"o2/components/readout/cru/1", "o2/components/readout/cru/2", - "o2/components/readout/no-cru/10") - keys = append(readoutKeys, "o2/components/tpc/no-cru/3", "o2/components/tpc/cru/0") - - keyPrefix := "o2/components/" - - It("should fail and return error and exit code 3 for empty array of keys being passed", func() { - components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps([]string{}, keyPrefix, false) - Expect(err.Error()).To(Equal("No keys found")) - Expect(code).To(Equal(3)) - Expect(components).To(Equal([]string{})) - }) - - It("should successfully pass, return error nil, code 0 and array of components when no component/timestamp is added to keyprefix", func() { - components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, false) - Expect(err).To(BeNil()) - Expect(code).To(Equal(0)) - Expect(components).To(Equal([]string{"readout", "tpc"})) - }) - - It("should successfully pass, return error nil, code 0 and array of entries when component is provided", func() { - components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(readoutKeys, keyPrefix + "readout/", false) - Expect(err).To(BeNil()) - Expect(code).To(Equal(0)) - Expect(components).To(Equal([]string{"cru", "no-cru"})) - }) - - It("should successfully pass, return error nil, code 0 and array of entries when component is provided and timestamp is used", func() { - components, err, code := configuration.GetListOfComponentsAndOrWithTimestamps(readoutKeys, keyPrefix + "readout/", true) - Expect(err).To(BeNil()) - Expect(code).To(Equal(0)) - Expect(components).To(Equal([]string{"cru@2", "no-cru@10"})) - }) - }) - - Context("GetLatestTimestamp() - given a component and entry it will return the latest timestamp if exists", func() { - var keysReadoutCRU = append([]string{}, "o2/components/readout/cru/1", "o2/components/readout/cru/2") - - It("should fail and return error and exit code 3 due to empty keys", func() { - _, err, code := configuration.GetLatestTimestamp([]string{}, "readout", "cru") - Expect(err.Error()).To(Equal("No keys found")) - Expect(code).To(Equal(3)) - }) - - It("should successfully return the latest timestamp of a given component & entry", func() { - timestamp, err, code := configuration.GetLatestTimestamp(keysReadoutCRU, "readout", "cru") - Expect(err).To(BeNil()) - Expect(code).To(Equal(0)) - Expect(timestamp).To(Equal("2")) - }) - }) - }) - -}) \ No newline at end of file diff --git a/configuration/configuration_suite_test.go b/configuration/configuration_suite_test.go index 0298c356b..c5e298c05 100644 --- a/configuration/configuration_suite_test.go +++ b/configuration/configuration_suite_test.go @@ -1,9 +1,9 @@ package configuration_test import ( - //"io" - //"io/ioutil" - //"os" + "io" + "io/ioutil" + "os" "testing" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" @@ -17,25 +17,25 @@ func TestConfiguration(t *testing.T) { RunSpecs(t, "Configuration Suite") } -//var _ = BeforeSuite(func() { -// var err error -// tmpDir = new(string) -// *tmpDir, err = ioutil.TempDir("", "o2control-configuration") -// Expect(err).NotTo(HaveOccurred()) -// -// // copy config file -// from, err := os.Open("./" + configFile) -// Expect(err).NotTo(HaveOccurred()) -// defer from.Close() -// -// to, err := os.OpenFile(*tmpDir + "/" + configFile, os.O_RDWR|os.O_CREATE, 0666) -// Expect(err).NotTo(HaveOccurred()) -// defer to.Close() -// -// _, err = io.Copy(to, from) -// Expect(err).NotTo(HaveOccurred()) -//}) -// -//var _ = AfterSuite(func() { -// os.RemoveAll(*tmpDir) -//}) +var _ = BeforeSuite(func() { + var err error + tmpDir = new(string) + *tmpDir, err = ioutil.TempDir("", "o2control-configuration") + Expect(err).NotTo(HaveOccurred()) + + // copy config file + from, err := os.Open("./" + configFile) + Expect(err).NotTo(HaveOccurred()) + defer from.Close() + + to, err := os.OpenFile(*tmpDir + "/" + configFile, os.O_RDWR|os.O_CREATE, 0666) + Expect(err).NotTo(HaveOccurred()) + defer to.Close() + + _, err = io.Copy(to, from) + Expect(err).NotTo(HaveOccurred()) +}) + +var _ = AfterSuite(func() { + os.RemoveAll(*tmpDir) +}) diff --git a/configuration/source_test.go b/configuration/source_test.go index 5100e0673..e0e09f245 100644 --- a/configuration/source_test.go +++ b/configuration/source_test.go @@ -1,239 +1,237 @@ package configuration_test import ( - //. "github.com/AliceO2Group/Control/configuration" + . "github.com/AliceO2Group/Control/configuration" . "github.com/onsi/ginkgo" - //"gopkg.in/yaml.v2" - - //. "github.com/onsi/gomega" - //"gopkg.in/yaml.v2" + . "github.com/onsi/gomega" + "gopkg.in/yaml.v2" ) var _ = Describe("Source", func() { - //var ( - // c Source - // err error - //) - // - //DoConfigurationTests := func() { - // var ( - // o2_control_tasks_1_map = Map{ - // "name": String("fairmq-ex-1-n-1-sampler"), - // "control": Map{ - // "mode": String("fairmq"), - // }, - // "wants": Map{ - // "cpu": String("1"), - // "memory": String("256"), - // "ports": String("1"), - // }, - // "bind": Array{ - // Map{ - // "name": String("data1"), - // "type": String("push"), - // "sndBufSize": String("1000"), - // "rcvBufSize": String("1000"), - // "rateLogging": String("0"), - // }, - // }, - // "properties": Map{ - // "severity": String("trace"), - // "color": String("false"), - // }, - // "command": Map{ - // "env": Array{}, - // "shell": String("true"), - // "arguments": Array{}, - // "value": String("fairmq-ex-1-n-1-sampler"), - // }, - // } - // recursivePutMap = Map{ - // "firstKey": String("one"), - // "secondKey": Array{ - // Map{ - // "name": String("first"), - // "type": String("an array item"), - // }, - // Map{ - // "name": String("second"), - // "type": String("an array item"), - // }, - // Map{ - // "name": String("third"), - // "type": String("and yet another array item"), - // }, - // }, - // "thirdKey": Map{ - // "just some": String("stuff"), - // }, - // } - // recursivePutArray = Array{ - // Map{ - // "name": String("first"), - // "type": String("an array item with a property map inside"), - // "properties": Map{ - // "just some": String("stuff"), - // }, - // }, - // Map{ - // "name": String("second"), - // "type": String("an array item"), - // }, - // Map{ - // "name": String("third"), - // "type": String("and yet another array item"), - // }, - // } - // recursivePutString = String("this is a bit underwhelming compared to the other two...") - // ) - // - // It("should return no error when creating an instance", func() { - // Expect(err).NotTo(HaveOccurred()) - // }) - // - // Context("to get a subtree or value", func() { - // It("should correctly get a single item", func() { - // Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) - // Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) - // Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) - // }) - // - // It("should correctly recursively get a configuration subtree", func() { - // Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) - // }) - // - // It("should correctly recursively get a configuration subtree as YAML", func() { - // marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) - // Expect(marshErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) - // }) - // }) - // - // Context("to check the existence of a key", func() { - // It("should correctly determine whether a value node is defined", func() { - // Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) - // Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) - // }) - // - // It("should correctly determine whether a map node is defined", func() { - // Expect(c.Exists("o2")).To(BeTrue()) - // }) - // - // It("should correctly determine whether an array node is defined", func() { - // Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) - // Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) - // }) - // - // It("should correctly address non-existent keys", func() { - // Expect(c.Exists("")).To(BeFalse()) - // Expect(c.Exists("FakeKey")).To(BeFalse()) - // }) - // }) - // - // Context("to add a new subtree or value", func(){ - // It("should correctly push a single value", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) - // putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) - // }) - // - // It("should correctly push a configuration.Map", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) - // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) - // }) - // - // It("should correctly push an configuration.Array", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) - // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) - // }) - // - // It("should correctly push a configuration.String", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) - // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) - // }) - // - // It("should correctly push a YAML map", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) - // marshalled, marshErr := yaml.Marshal(recursivePutMap) - // Expect(marshErr).NotTo(HaveOccurred()) - // putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) - // }) - // - // It("should correctly push a YAML array", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) - // marshalled, marshErr := yaml.Marshal(recursivePutArray) - // Expect(marshErr).NotTo(HaveOccurred()) - // putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) - // }) - // }) - // - // Context("to replace/update an existing subtree or value", func() { - // It("should correctly push a single value", func() { - // Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) - // putErr := c.Put("o2/control/globals/config_basedir", "foobar") - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) - // }) - // - // It("should correctly push a configuration.Map", func() { - // Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) - // putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) - // }) - // - // It("should correctly push an configuration.Array", func() { - // Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) - // putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) - // }) - // - // It("should correctly push a configuration.String", func() { - // Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) - // putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) - // Expect(putErr).NotTo(HaveOccurred()) - // Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) - // }) - // }) - //} - // - //Describe("when interacting with an instance", func() { - // Context("with Consul backend", func() { - // BeforeEach(func() { - // c, err = NewSource("consul://dummy") - // }) - // - // It("should be of type *ConsulSource", func() { - // _, ok := c.(*ConsulSource) - // Expect(ok).To(Equal(true)) - // }) - // - // //DoConfigurationTests() - // }) - // - // Context("with YAML file backend", func() { - // BeforeEach(func() { - // c, err = NewSource("file://" + *tmpDir + "/" + configFile) - // }) - // - // It("should be of type *YamlSource", func() { - // _, ok := c.(*YamlSource) - // Expect(ok).To(Equal(true)) - // }) - // - // DoConfigurationTests() - // }) - //}) + var ( + c Source + err error + ) + + DoConfigurationTests := func() { + var ( + o2_control_tasks_1_map = Map{ + "name": String("fairmq-ex-1-n-1-sampler"), + "control": Map{ + "mode": String("fairmq"), + }, + "wants": Map{ + "cpu": String("1"), + "memory": String("256"), + "ports": String("1"), + }, + "bind": Array{ + Map{ + "name": String("data1"), + "type": String("push"), + "sndBufSize": String("1000"), + "rcvBufSize": String("1000"), + "rateLogging": String("0"), + }, + }, + "properties": Map{ + "severity": String("trace"), + "color": String("false"), + }, + "command": Map{ + "env": Array{}, + "shell": String("true"), + "arguments": Array{}, + "value": String("fairmq-ex-1-n-1-sampler"), + }, + } + recursivePutMap = Map{ + "firstKey": String("one"), + "secondKey": Array{ + Map{ + "name": String("first"), + "type": String("an array item"), + }, + Map{ + "name": String("second"), + "type": String("an array item"), + }, + Map{ + "name": String("third"), + "type": String("and yet another array item"), + }, + }, + "thirdKey": Map{ + "just some": String("stuff"), + }, + } + recursivePutArray = Array{ + Map{ + "name": String("first"), + "type": String("an array item with a property map inside"), + "properties": Map{ + "just some": String("stuff"), + }, + }, + Map{ + "name": String("second"), + "type": String("an array item"), + }, + Map{ + "name": String("third"), + "type": String("and yet another array item"), + }, + } + recursivePutString = String("this is a bit underwhelming compared to the other two...") + ) + + It("should return no error when creating an instance", func() { + Expect(err).NotTo(HaveOccurred()) + }) + + Context("to get a subtree or value", func() { + It("should correctly get a single item", func() { + Expect(c.Get("o2/control/globals/o2_install_path")).To(Equal("/opt/alisw/el7")) + Expect(c.Get("o2/control/tasks[1]/name")).To(Equal("fairmq-ex-1-n-1-sampler")) + Expect(c.Get("o2/control/globals/control/direct/control_port_args[1]")).To(Equal("{{ controlPort }}")) + }) + + It("should correctly recursively get a configuration subtree", func() { + Expect(c.GetRecursive("o2/control/tasks[1]")).To(Equal(o2_control_tasks_1_map)) + }) + + It("should correctly recursively get a configuration subtree as YAML", func() { + marshalled, marshErr := yaml.Marshal(o2_control_tasks_1_map) + Expect(marshErr).NotTo(HaveOccurred()) + Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) + }) + }) + + Context("to check the existence of a key", func() { + It("should correctly determine whether a value node is defined", func() { + Expect(c.Exists("o2/control/workflows[0]/role/roles[1]/name")).To(BeTrue()) + Expect(c.Exists("o2/control/workflows[0]/role/roles[4]/name")).To(BeFalse()) + }) + + It("should correctly determine whether a map node is defined", func() { + Expect(c.Exists("o2")).To(BeTrue()) + }) + + It("should correctly determine whether an array node is defined", func() { + Expect(c.Exists("o2/control/globals/control/direct/control_port_args[1]")).To(BeTrue()) + Expect(c.Exists("o2/control/globals/control/direct/control_port_args")).To(BeTrue()) + }) + + It("should correctly address non-existent keys", func() { + Expect(c.Exists("")).To(BeFalse()) + Expect(c.Exists("FakeKey")).To(BeFalse()) + }) + }) + + Context("to add a new subtree or value", func(){ + It("should correctly push a single value", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) + putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.Get("o2/control/tasks[0]/bind[1]/newSingleValue")).To(Equal("foobar")) + }) + + It("should correctly push a configuration.Map", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newMap")).To(BeFalse()) + putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newMap", recursivePutMap) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newMap")).To(Equal(recursivePutMap)) + }) + + It("should correctly push an configuration.Array", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newArray")).To(BeFalse()) + putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newArray", recursivePutArray) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newArray")).To(Equal(recursivePutArray)) + }) + + It("should correctly push a configuration.String", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newString")).To(BeFalse()) + putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]/newString", recursivePutString) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]/newString")).To(BeEquivalentTo(recursivePutString)) + }) + + It("should correctly push a YAML map", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlMap")).To(BeFalse()) + marshalled, marshErr := yaml.Marshal(recursivePutMap) + Expect(marshErr).NotTo(HaveOccurred()) + putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap", marshalled) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlMap")).To(Equal(marshalled)) + }) + + It("should correctly push a YAML array", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]/newYamlArray")).To(BeFalse()) + marshalled, marshErr := yaml.Marshal(recursivePutArray) + Expect(marshErr).NotTo(HaveOccurred()) + putErr := c.PutRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray", marshalled) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursiveYaml("o2/control/tasks[0]/bind[1]/newYamlArray")).To(Equal(marshalled)) + }) + }) + + Context("to replace/update an existing subtree or value", func() { + It("should correctly push a single value", func() { + Expect(c.Exists("o2/control/globals/config_basedir")).To(BeTrue()) + putErr := c.Put("o2/control/globals/config_basedir", "foobar") + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.Get("o2/control/globals/config_basedir")).To(Equal("foobar")) + }) + + It("should correctly push a configuration.Map", func() { + Expect(c.Exists("o2/control/tasks[0]/bind[1]")).To(BeTrue()) + putErr := c.PutRecursive("o2/control/tasks[0]/bind[1]", recursivePutMap) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/bind[1]")).To(Equal(recursivePutMap)) + }) + + It("should correctly push an configuration.Array", func() { + Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) + putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutArray) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(Equal(recursivePutArray)) + }) + + It("should correctly push a configuration.String", func() { + Expect(c.Exists("o2/control/tasks[0]/wants")).To(BeTrue()) + putErr := c.PutRecursive("o2/control/tasks[0]/wants", recursivePutString) + Expect(putErr).NotTo(HaveOccurred()) + Expect(c.GetRecursive("o2/control/tasks[0]/wants")).To(BeEquivalentTo(recursivePutString)) + }) + }) + } + + Describe("when interacting with an instance", func() { + Context("with Consul backend", func() { + BeforeEach(func() { + c, err = NewSource("consul://dummy") + }) + + It("should be of type *ConsulSource", func() { + _, ok := c.(*ConsulSource) + Expect(ok).To(Equal(true)) + }) + + //DoConfigurationTests() + }) + + Context("with YAML file backend", func() { + BeforeEach(func() { + c, err = NewSource("file://" + *tmpDir + "/" + configFile) + }) + + It("should be of type *YamlSource", func() { + _, ok := c.(*YamlSource) + Expect(ok).To(Equal(true)) + }) + + DoConfigurationTests() + }) + }) }) From 591b4e07704deba6af1e9188a10f976873a7e46e Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 17 Sep 2019 15:02:22 +0200 Subject: [PATCH 0024/2352] [OCONF-165] Rever test changes --- configuration/configuration_suite_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/configuration/configuration_suite_test.go b/configuration/configuration_suite_test.go index c5e298c05..bc4f5d411 100644 --- a/configuration/configuration_suite_test.go +++ b/configuration/configuration_suite_test.go @@ -5,6 +5,7 @@ import ( "io/ioutil" "os" "testing" + . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) From c86190f71a3763b59124f4efa220bdf6f91a37dc Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 17 Sep 2019 18:35:10 +0200 Subject: [PATCH 0025/2352] [OCONF-184] Add history for component and entry --- coconut/cmd/configuration_history.go | 48 +++++++++++++++++ coconut/configuration/configuration.go | 72 +++++++++++++++++++++++++- 2 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 coconut/cmd/configuration_history.go diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go new file mode 100644 index 000000000..4ea0e6196 --- /dev/null +++ b/coconut/cmd/configuration_history.go @@ -0,0 +1,48 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" +) + +var configurationHistoryCmd = &cobra.Command{ + Use: "history [component]", + Aliases: []string{"h"}, + Example: `coconut conf history +coconut conf history +coconut conf history /`, + Short: "List all existing entries with timestamps of a specified component in Consul", + Long: `The configuration history command will return all entries with +all of their associated timestamps or returns all timestamps for a specified component and entry`, + Run: configuration.WrapCall(configuration.History), + Args: cobra.RangeArgs(0, 3), +} + +func init() { + configurationCmd.AddCommand(configurationHistoryCmd) + configurationHistoryCmd.Flags().StringP("output", "o", "yaml", "output format for the returned entries (yaml/json)") +} diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 3942a8364..6e3b88798 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -30,6 +30,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/briandowns/spinner" + "strconv" "time" "io" "github.com/sirupsen/logrus" @@ -103,7 +104,7 @@ func WrapCall(call ConfigurationCall) RunFunc { } } -func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, int) { +func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, 1 @@ -258,6 +259,75 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return nil, 0 } +func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + var key, component, entry string + + if len(args) < 1 || len(args) > 2 { + err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) + return err, 1 + } + switch len(args) { + case 1: + if IsInputSingleValidWord(args[0]) { + component = args[0] + entry = "" + } else if IsInputNameValid(args[0]) && !strings.Contains(args[0], "@"){ + splitCom := strings.Split(args[0], "/") + component = splitCom[0] + entry = splitCom[1] + } else { + return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), 1 + } + case 2: + if IsInputNameValid(args[0]) && IsInputNameValid(args[1]) { + component = args[0] + entry = args[1] + } else { + return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), 1 + } + } + key = componentsPath + component + "/" + entry + keys, err := cfg.GetKeysByPrefix(key, "") + if err != nil { + return errors.New(fmt.Sprintf("Could not query ConsulSource")), 2 + } + //o2/components/readout/TPC-test/1567083880 + //- o2/components/readout/TPC-test/1567083931 + //- o2/components/readout/TPC-test/1567084508 + //- o2/components/readout/TPC-test/1567415993 + //- o2/components/readout/TPC-test/1567417758 + //- o2/components/readout/withCRU-demo/100 + //- o2/components/readout/withCRU-demo/101 + if len(keys) == 0 { + return errors.New(fmt.Sprintf("No data was found")), 2 + } else { + for index := range keys { + var value = keys[index] + value = strings.TrimPrefix(value , componentsPath) + index2 := strings.LastIndex(value, "/") + timetsamo := value[index2+1:] + i, err := strconv.ParseInt(timetsamo, 10, 64) + if err != nil { + panic(err) + } + tm := time.Unix(i, 0) + value = value[:index2] + string("@") + value[index2+1:] + " " + tm.Format("RFC3339") + keys[index] = value + } + if entry != "" { + + } else { + //tree + } + } + output, err := formatListOutput(cmd, keys) + if err != nil { + return err, 4 + } + fmt.Fprintln(o, string(output)) + return nil, 0 +} + func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { format, err := cmd.Flags().GetString("output") if err != nil { From 328c5d278f9842d13dd8ac7b5523f69a12bce156 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Sep 2019 16:08:29 +0200 Subject: [PATCH 0026/2352] [OCONF-165] Add constants for exitCode --- coconut/configuration/configuration.go | 83 ++++++++++++++------------ 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 3942a8364..a67a9d08f 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -30,6 +30,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/briandowns/spinner" + "strconv" "time" "io" "github.com/sirupsen/logrus" @@ -53,12 +54,15 @@ type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []strin var componentsPath = "o2/components/" -var InputRegex, _ = regexp.Compile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)?(\@[0-9]+)?$$`) +var InputRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)?(\@[0-9]+)?$$`) -// code = 1 - Provided args by the user are invalid -// code = 2 - Source connection error -// code = 3 - Source retrieved empty data -// code = 4 - Logic/Output error +const ( + exitCode0 = iota + exitCode1 = iota // code = 1 - Provided args by the user are invalid + exitCode2 = iota // code = 2 - Source connection error + exitCode3 = iota // code = 3 - Source retrieved empty data + exitCode4 = iota // code = 4 - Logic/Output error +) func WrapCall(call ConfigurationCall) RunFunc { return func(cmd *cobra.Command, args []string) { @@ -81,7 +85,7 @@ func WrapCall(call ConfigurationCall) RunFunc { log.WithPrefix(cmd.Use). WithFields(fields). Fatal("cannot query endpoint") - os.Exit(2) + os.Exit(exitCode2) } var out strings.Builder @@ -97,27 +101,27 @@ func WrapCall(call ConfigurationCall) RunFunc { if err != nil { log.WithPrefix(cmd.Use). WithError(err). - Fatal("command finished with error") + Fatal( "command finished with error") os.Exit(code) } } } -func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, int) { +func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) - return err, 1 + return err, exitCode1 } key := args[0] data, err := cfg.GetRecursive(key) if err != nil { - return err, 2 + return err, exitCode2 } format, err := cmd.Flags().GetString("format") if err != nil { - return err, 1 + return err, exitCode1 } var output []byte @@ -131,12 +135,12 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) - return err, 4 + return err, exitCode4 } fmt.Fprintln(o, string(output)) - return nil, 0 + return nil, exitCode0 } func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { @@ -144,30 +148,30 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o useTimestamp := false if len(args) > 1 { err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) - return err , 1 + return err , exitCode1 } else { useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) - return err, 1 + return err, exitCode1 } if len(args) == 1 { if !IsInputSingleValidWord(args[0]) { err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) - return err, 1 + return err, exitCode1 } else { keyPrefix += args[0] + "/" } } else if len(args) == 0 && useTimestamp { err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) - return err, 1 + return err, exitCode1 } } keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { err = errors.New(fmt.Sprintf("Could not query ConsulSource")) - return err, 2 + return err, exitCode2 } components, err, code := GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) @@ -177,10 +181,10 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o output, err := formatListOutput(cmd, components) if err != nil { - return err, 4 + return err, exitCode4 } fmt.Fprintln(o, string(output)) - return nil, 0 + return nil, exitCode0 } func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { @@ -188,13 +192,13 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if len(args) < 1 || len(args) > 2 { err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) - return err, 1 + return err, exitCode1 } timestamp, err = cmd.Flags().GetString("timestamp") if err != nil { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) - return err, 1 + return err, exitCode1 } switch len(args) { @@ -203,7 +207,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if strings.Contains(args[0], "@") { if timestamp != "" { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) - return err, 1 + return err, exitCode1 } // coconut conf show component/entry@timestamp arg := strings.Replace(args[0], "@", "/", 1) @@ -216,16 +220,16 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o params := strings.Split(args[0], "/") component = params[0] entry = params[1] - } + } } else { // coconut conf show component || coconut conf show component@timestamp err = errors.New(fmt.Sprintf("Please provide entry name")) - return err, 1 + return err, exitCode1 } case 2: if !IsInputSingleValidWord(args[0]) || !IsInputSingleValidWord(args[1]) { err = errors.New(fmt.Sprintf("Component and Entry name cannot contain `/` or `@`")) - return err, 1 + return err, exitCode1 } else { component = args[0] entry = args[1] @@ -237,7 +241,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o keyPrefix := componentsPath + component + "/" + entry keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { - return errors.New(fmt.Sprintf("Could not query ConsulSource")), 2 + return errors.New(fmt.Sprintf("Could not query ConsulSource")), exitCode2 } timestamp, err, code = GetLatestTimestamp(keys, component , entry) if err != nil { @@ -247,15 +251,15 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o key = componentsPath + component + "/" + entry + "/" + timestamp configuration, err = cfg.Get(key) if err != nil { - return err, 2 + return err, exitCode2 } if configuration == "" { err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) - return err, 3 + return err, exitCode3 } fmt.Fprintln(o, string(configuration)) - return nil, 0 + return nil, exitCode0 } func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { @@ -291,25 +295,26 @@ func GetLatestTimestamp(keys []string, component string, entry string)(timestamp keyPrefix := componentsPath + component + "/" + entry if len(keys) == 0 { err = errors.New(fmt.Sprintf("No keys found")) - return "", err, 3 + return "", err, exitCode3 } - var maxTimeStamp string + var maxTimeStamp uint64 for _, key := range keys { - componentTimestamp := strings.TrimPrefix(key, keyPrefix + "/") - fmt.Println(componentTimestamp) - if strings.Compare(componentTimestamp, maxTimeStamp) > 0 { - maxTimeStamp = componentTimestamp + componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) + if err == nil { + if componentTimestamp > maxTimeStamp { + maxTimeStamp = componentTimestamp + } } } - return maxTimeStamp, nil, 0 + return string(maxTimeStamp), nil, exitCode0 } // Method to return a list of components, entries or entries with latest timestamp // If no keys were passed an error and code exit 3 will be returned func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { if len(keys) == 0 { - return []string{}, errors.New(fmt.Sprintf("No keys found")), 3 + return []string{}, errors.New(fmt.Sprintf("No keys found")), exitCode3 } var components []string @@ -337,5 +342,5 @@ func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use components = append(components, key) } } - return components, nil, 0 + return components, nil, exitCode0 } \ No newline at end of file From f42ee30cb7f7422df50ae048058bc48c0bb34494 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Sep 2019 16:27:32 +0200 Subject: [PATCH 0027/2352] [OCONF-165] Change conversion of uint64 --- coconut/cmd/configuration_show.go | 1 - coconut/configuration/configuration.go | 66 +++++++++++++------------- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index dab800746..cd4d9a485 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -29,7 +29,6 @@ import ( "github.com/spf13/cobra" ) -// configurationShowCmd represents the configuration show command var configurationShowCmd = &cobra.Command{ Use: "show ", Aliases: []string{"s"}, diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index a67a9d08f..96f7ce2b0 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -54,14 +54,14 @@ type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []strin var componentsPath = "o2/components/" -var InputRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)?(\@[0-9]+)?$$`) +var InputRegex, __ = regexp.Compile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) const ( - exitCode0 = iota - exitCode1 = iota // code = 1 - Provided args by the user are invalid - exitCode2 = iota // code = 2 - Source connection error - exitCode3 = iota // code = 3 - Source retrieved empty data - exitCode4 = iota // code = 4 - Logic/Output error + nonZero = iota + invalidArgs = iota // Provided args by the user are invalid + connectionError = iota // Source connection error + emptyData = iota // Source retrieved empty data + logicError = iota // Logic/Output error ) func WrapCall(call ConfigurationCall) RunFunc { @@ -85,7 +85,7 @@ func WrapCall(call ConfigurationCall) RunFunc { log.WithPrefix(cmd.Use). WithFields(fields). Fatal("cannot query endpoint") - os.Exit(exitCode2) + os.Exit(connectionError) } var out strings.Builder @@ -110,18 +110,18 @@ func WrapCall(call ConfigurationCall) RunFunc { func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) - return err, exitCode1 + return err, invalidArgs } key := args[0] data, err := cfg.GetRecursive(key) if err != nil { - return err, exitCode2 + return err, connectionError } format, err := cmd.Flags().GetString("format") if err != nil { - return err, exitCode1 + return err, invalidArgs } var output []byte @@ -135,12 +135,12 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) - return err, exitCode4 + return err, logicError } fmt.Fprintln(o, string(output)) - return nil, exitCode0 + return nil, nonZero } func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { @@ -148,30 +148,30 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o useTimestamp := false if len(args) > 1 { err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) - return err , exitCode1 + return err , invalidArgs } else { useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) - return err, exitCode1 + return err, invalidArgs } if len(args) == 1 { if !IsInputSingleValidWord(args[0]) { err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) - return err, exitCode1 + return err, invalidArgs } else { keyPrefix += args[0] + "/" } } else if len(args) == 0 && useTimestamp { err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) - return err, exitCode1 + return err, invalidArgs } } keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { err = errors.New(fmt.Sprintf("Could not query ConsulSource")) - return err, exitCode2 + return err, connectionError } components, err, code := GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) @@ -181,10 +181,10 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o output, err := formatListOutput(cmd, components) if err != nil { - return err, exitCode4 + return err, logicError } fmt.Fprintln(o, string(output)) - return nil, exitCode0 + return nil, nonZero } func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { @@ -192,13 +192,13 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if len(args) < 1 || len(args) > 2 { err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) - return err, exitCode1 + return err, invalidArgs } timestamp, err = cmd.Flags().GetString("timestamp") if err != nil { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) - return err, exitCode1 + return err, invalidArgs } switch len(args) { @@ -207,7 +207,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if strings.Contains(args[0], "@") { if timestamp != "" { err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) - return err, exitCode1 + return err, invalidArgs } // coconut conf show component/entry@timestamp arg := strings.Replace(args[0], "@", "/", 1) @@ -224,12 +224,12 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } else { // coconut conf show component || coconut conf show component@timestamp err = errors.New(fmt.Sprintf("Please provide entry name")) - return err, exitCode1 + return err, invalidArgs } case 2: if !IsInputSingleValidWord(args[0]) || !IsInputSingleValidWord(args[1]) { err = errors.New(fmt.Sprintf("Component and Entry name cannot contain `/` or `@`")) - return err, exitCode1 + return err, invalidArgs } else { component = args[0] entry = args[1] @@ -241,7 +241,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o keyPrefix := componentsPath + component + "/" + entry keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { - return errors.New(fmt.Sprintf("Could not query ConsulSource")), exitCode2 + return errors.New(fmt.Sprintf("Could not query ConsulSource")), connectionError } timestamp, err, code = GetLatestTimestamp(keys, component , entry) if err != nil { @@ -251,15 +251,15 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o key = componentsPath + component + "/" + entry + "/" + timestamp configuration, err = cfg.Get(key) if err != nil { - return err, exitCode2 + return err, connectionError } if configuration == "" { err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) - return err, exitCode3 + return err, emptyData } - fmt.Fprintln(o, string(configuration)) - return nil, exitCode0 + fmt.Fprintln(o, configuration) + return nil, nonZero } func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { @@ -295,7 +295,7 @@ func GetLatestTimestamp(keys []string, component string, entry string)(timestamp keyPrefix := componentsPath + component + "/" + entry if len(keys) == 0 { err = errors.New(fmt.Sprintf("No keys found")) - return "", err, exitCode3 + return "", err, emptyData } var maxTimeStamp uint64 @@ -307,14 +307,14 @@ func GetLatestTimestamp(keys []string, component string, entry string)(timestamp } } } - return string(maxTimeStamp), nil, exitCode0 + return strconv.FormatUint(maxTimeStamp, 10), nil, nonZero } // Method to return a list of components, entries or entries with latest timestamp // If no keys were passed an error and code exit 3 will be returned func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { if len(keys) == 0 { - return []string{}, errors.New(fmt.Sprintf("No keys found")), exitCode3 + return []string{}, errors.New(fmt.Sprintf("No keys found")), emptyData } var components []string @@ -342,5 +342,5 @@ func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use components = append(components, key) } } - return components, nil, exitCode0 + return components, nil, nonZero } \ No newline at end of file From f31679b28e069b7613d680858230d64300ddd182 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 19 Sep 2019 10:14:40 +0200 Subject: [PATCH 0028/2352] [OCONF-165] Mustcompile regex --- coconut/configuration/configuration.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 4596adfc4..7a7c98a2a 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -54,7 +54,7 @@ type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []strin var componentsPath = "o2/components/" -var InputRegex, __ = regexp.Compile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) +var InputRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) const ( nonZero = iota @@ -294,13 +294,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, if err != nil { return errors.New(fmt.Sprintf("Could not query ConsulSource")), 2 } - //o2/components/readout/TPC-test/1567083880 - //- o2/components/readout/TPC-test/1567083931 - //- o2/components/readout/TPC-test/1567084508 - //- o2/components/readout/TPC-test/1567415993 - //- o2/components/readout/TPC-test/1567417758 - //- o2/components/readout/withCRU-demo/100 - //- o2/components/readout/withCRU-demo/101 + if len(keys) == 0 { return errors.New(fmt.Sprintf("No data was found")), 2 } else { From b20cec759f9eeb5d31c83de2c72cac65258d05a6 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 19 Sep 2019 10:16:11 +0200 Subject: [PATCH 0029/2352] [OCONF-165] MustCompile Regexp --- coconut/configuration/configuration.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 96f7ce2b0..1ed7cbb08 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -54,7 +54,7 @@ type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []strin var componentsPath = "o2/components/" -var InputRegex, __ = regexp.Compile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) +var InputRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) const ( nonZero = iota From b14cb7f1d0808d5ee1c7f816f126bd8d9a4c2fb0 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 19 Sep 2019 10:24:24 +0200 Subject: [PATCH 0030/2352] [coconut][core] Implement coconut template queries + API * [repo] Implement Get{Tags,Branches,BranchesAndTags} methods with globbing support * [coconut + core] WIP:Extend API to allow template patthern querying for repo(s) + revision(s) w/ wildcards * [coconut + core] WIP: Changes to support templ list all-branches and all-tags flags * [core] WIP: Allow to query for workflow templates by repo index * [core] WIP: Allow to query for workflow templates with hashes * [coconut] Update docs * [core] Address some TODOs * [coconut + core] cleanup * [coconut] Move templ list examples from Long to Example * [coconut] Use regexp to check input in case of templ list argument * Review pass 1 * Review pass 2 * [coconut] Update templ list shorthands * [core] Custom type for better template maps readability * [coconut] Update regexp matches with MustCompile --- coconut/cmd/template_list.go | 26 +- coconut/control/control.go | 106 +- coconut/protos/o2control.pb.go | 2868 +++++++++++++++----------------- core/protos/o2control.pb.go | 2868 +++++++++++++++----------------- core/protos/o2control.proto | 8 +- core/repos/repo.go | 92 +- core/repos/repomanager.go | 158 +- core/server.go | 21 +- core/task/manager.go | 2 +- executor/protos/occ.pb.go | 357 ++-- 10 files changed, 3173 insertions(+), 3333 deletions(-) diff --git a/coconut/cmd/template_list.go b/coconut/cmd/template_list.go index c0d4c09dc..e220e77ae 100644 --- a/coconut/cmd/template_list.go +++ b/coconut/cmd/template_list.go @@ -25,8 +25,8 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // templateListCmd represents the template list command @@ -35,10 +35,30 @@ var templateListCmd = &cobra.Command{ Aliases: []string{"list", "ls", "l"}, Short: "list available workflow templates", Long: `The template list command shows a list of available workflow templates. -These workflow templates can then be loaded to create an environment.`, +These workflow templates can then be loaded to create an environment. + +` + "`coconut templ list` " + `can be called with +1) a combination of the ` + "`--repo` " + `, ` + "`--revision` " + `, ` + "`--all-branches` " + `, ` + "`--all-tags`" + `flags, or with +2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing.`, + Example: +` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories + * ` + "`coconut templ list *AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list *@v*`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories + * ` + "`coconut templ list --repo=*AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list --revision=dev*`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories + * ` + "`coconut templ list --repo=*gitlab.cern.ch* --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` + * ` + "`coconut templ list --all-branches`" + ` lists templates from all branches for all git repositories + * ` + "`coconut templ list --repo=*github.com* --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern + * ` + "`coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 `" + ` lists templates from the commit corresponding to the hash for all git repositories`, + Run: control.WrapCall(control.ListWorkflowTemplates), } func init() { templateCmd.AddCommand(templateListCmd) -} + + templateListCmd.Flags().StringP("repository", "r", "*", "repositories to list templates from") + templateListCmd.Flags().StringP("revision", "i", "master", "revisions (branches/tags) to list templates from") + templateListCmd.Flags().BoolP("all-branches", "b", false, "list templates from all branches") + templateListCmd.Flags().BoolP("all-tags", "t", false, "list templates from all tags") +} \ No newline at end of file diff --git a/coconut/control/control.go b/coconut/control/control.go index 4e6eb57dc..dac562290 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -33,6 +33,7 @@ import ( "github.com/xlab/treeprint" "io" "os" + "regexp" "strconv" "strings" "time" @@ -490,13 +491,92 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, // ListWorkflowTemplates lists the available workflow templates and the git repo on which they reside. func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - if len(args) != 0 { - err = errors.New(fmt.Sprintf("accepts no arg(s), received %d", len(args))) - return err + repoPattern := "*" + revisionPattern := "master" + allBranches := false + allTags := false + + if len(args) == 0 { + repoPattern, err = cmd.Flags().GetString("repository") + if err != nil { + return + } + if len(repoPattern) == 0 { + err = errors.New("cannot query for an empty repo") + return + } + + revisionPattern, err = cmd.Flags().GetString("revision") + if err != nil { + return + } + + if len(revisionPattern) == 0 { + err = errors.New("cannot query for an empty revision") + return + } + + allBranches, err = cmd.Flags().GetBool("all-branches") + if err != nil { + return + } + + allTags, err = cmd.Flags().GetBool("all-tags") + if err != nil { + return + } + + if allBranches || allTags { + if revisionPattern != "master" { + fmt.Fprintln(o, "Ignoring `--all-{branches,tags}` flags, as a valid revision has been specified") + allBranches = false + allTags = false + } else { + revisionPattern = "*" + } + } + + } else if len(args) == 1 { // If we have an argument, give priority over the flags + simpleRepoRegex := regexp.MustCompile("\\A[^@]+\\z") + repoRevisionRegex := regexp.MustCompile("\\A[^@]+@[^@]+\\z") + + if simpleRepoRegex.MatchString(args[0]) { + repoPattern = args[0] + } else if repoRevisionRegex.MatchString(args[0]) { + slicedArgument := strings.Split(args[0], "@") + repoPattern = slicedArgument[0] + revisionPattern = slicedArgument[1] + } else { + err = errors.New("arguments should be in the form of [repo-pattern](@[revision-pattern])") + return + } + + if checkForFlag, _ := cmd.Flags().GetString("repository"); checkForFlag != "*" { // "*" comes from the flag's default value + fmt.Fprintln(o, "Ignoring `--repo` flag, as a valid argument has been passed ") + } + + if checkForFlag, _ := cmd.Flags().GetString("revision"); checkForFlag != "master" { + fmt.Fprintln(o, "Ignoring `--revision` flag, as a valid argument has been passed") + } + + if checkForFlag, _ := cmd.Flags().GetBool("all-branches"); checkForFlag != false { + fmt.Fprintln(o, "Ignoring `--all-branches` flag, as a valid argument has been passed") + } + + if checkForFlag, _ := cmd.Flags().GetBool("all-tags"); checkForFlag != false { + fmt.Fprintln(o, "Ignoring `--all-tags` flag, as a valid argument has been passed") + } + + } else { + err = errors.New(fmt.Sprintf("expecting one argument or a combination of the --repo and --revision flags, %d args received", len(args))) + + return } + var response *pb.GetWorkflowTemplatesReply - response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{}, grpc.EmptyCallOption{}) + response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{RepoPattern: repoPattern, RevisionPattern: revisionPattern, + AllBranches: allBranches, AllTags: allTags}, grpc.EmptyCallOption{}) if err != nil { return err } @@ -506,20 +586,30 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob fmt.Fprintln(o, "No templates found.") } else { var prevRepo string + var prevRevision string aTree := treeprint.New() aTree.SetValue("Available templates in loaded configuration:") + revBranch := treeprint.New() + for _, tmpl := range templates { - if prevRepo != tmpl.GetRepo() { - fmt.Fprintln(o, aTree.String()) + if prevRepo != tmpl.GetRepo() { // Create the root node of the tree w/ the repo name + fmt.Fprint(o, aTree.String()) aTree = treeprint.New() aTree.SetValue(blue(tmpl.GetRepo())) prevRepo = tmpl.GetRepo() + prevRevision = "" // Reinitialize the previous revision + } + + if prevRevision != tmpl.GetRevision() { // Create the first leaf of the root node w/ the revision name + revBranch = aTree.AddBranch(tmpl.GetRevision) + revBranch.SetValue(yellow("[revision] " + tmpl.GetRevision())) // Otherwise the pointer value was set as the branch's value + prevRevision = tmpl.GetRevision() } - aTree.AddNode(tmpl.GetTemplate()) + revBranch.AddNode(tmpl.GetTemplate()) } - fmt.Fprintln(o, aTree.String()) + fmt.Fprint(o, aTree.String()) } return nil diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 5076703f0..cafad697e 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StatusUpdate_Level int32 @@ -142,7 +139,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -184,7 +181,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -225,7 +222,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -282,7 +279,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -308,7 +305,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,13 +331,61 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ +// XXX_OneofFuncs is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } +func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) + } + return nil +} + +func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*StatusUpdate) + switch tag { + case 2: // Event.mesosHeartbeat + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Event_MesosHeartbeat) + err := b.DecodeMessage(msg) + m.Event = &StatusUpdate_MesosHeartbeat{msg} + return true, err + default: + return false, nil + } +} + +func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + s := proto.Size(x.MesosHeartbeat) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -364,7 +409,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -409,7 +454,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -497,7 +542,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -587,7 +632,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -633,7 +678,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -675,7 +720,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -716,7 +761,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -775,7 +820,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -857,7 +902,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -904,7 +949,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -951,7 +996,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -999,7 +1044,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1054,7 +1099,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1110,7 +1155,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1173,7 +1218,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1235,7 +1280,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1291,7 +1336,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1353,7 +1398,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1407,7 +1452,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1463,7 +1508,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1555,7 +1600,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1622,7 +1667,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1662,7 +1707,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1709,7 +1754,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1756,7 +1801,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1804,7 +1849,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1862,7 +1907,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1939,7 +1984,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2006,7 +2051,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2095,7 +2140,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2143,7 +2188,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2201,7 +2246,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2260,7 +2305,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2342,7 +2387,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2369,6 +2414,10 @@ func (m *GetRolesReply) GetRoles() []*RoleInfo { } type GetWorkflowTemplatesRequest struct { + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2388,7 +2437,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2407,9 +2456,38 @@ func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if m != nil { + return m.RepoPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if m != nil { + return m.RevisionPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if m != nil { + return m.AllBranches + } + return false +} + +func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { + if m != nil { + return m.AllTags + } + return false +} + type WorkflowTemplateInfo struct { Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2429,7 +2507,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2462,6 +2540,13 @@ func (m *WorkflowTemplateInfo) GetTemplate() string { return "" } +func (m *WorkflowTemplateInfo) GetRevision() string { + if m != nil { + return m.Revision + } + return "" +} + type GetWorkflowTemplatesReply struct { WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2483,7 +2568,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2529,7 +2614,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2570,7 +2655,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2624,7 +2709,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2671,7 +2756,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2718,7 +2803,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2765,7 +2850,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2813,7 +2898,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2867,7 +2952,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2914,7 +2999,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2961,7 +3046,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3008,7 +3093,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3095,142 +3180,147 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2159 bytes of a gzipped FileDescriptorProto + // 2225 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xd7, 0xc8, 0x92, 0x25, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0xd6, 0xeb, 0x78, 0x9b, - 0x54, 0x36, 0xd9, 0x5d, 0x9c, 0xc5, 0x0b, 0x6c, 0x2a, 0x2c, 0x04, 0x5b, 0x56, 0x1c, 0x41, 0x6c, - 0xa5, 0x46, 0x4a, 0x52, 0x6c, 0x15, 0x15, 0xc6, 0x9a, 0x96, 0xa5, 0xf5, 0x68, 0x5a, 0xcc, 0x1f, - 0x3b, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xe2, 0xcc, 0xf7, 0xe0, 0x42, 0x01, - 0xdf, 0x80, 0x0a, 0x55, 0x9c, 0xf8, 0x10, 0x54, 0xff, 0x99, 0x99, 0x9e, 0xd1, 0xc8, 0x76, 0x15, - 0x37, 0xbd, 0xd7, 0xbf, 0xf7, 0xba, 0xdf, 0x9f, 0x7e, 0xef, 0xf5, 0x08, 0xd6, 0xa7, 0x2e, 0xf5, - 0xa9, 0xf7, 0x88, 0xee, 0x0d, 0xa8, 0xe3, 0xbb, 0xd4, 0xde, 0xe5, 0x0c, 0x54, 0x89, 0x18, 0x78, - 0x1d, 0xd6, 0xda, 0x17, 0xc4, 0xf1, 0xdf, 0x1e, 0x13, 0x8f, 0x7a, 0xcf, 0x89, 0xe9, 0xfa, 0xa7, - 0xc4, 0xf4, 0xf1, 0x32, 0x2c, 0xf5, 0x7c, 0xd3, 0x0f, 0x3c, 0x83, 0xfc, 0x3a, 0x20, 0x9e, 0x8f, - 0x4f, 0xa1, 0x1a, 0x32, 0xa6, 0xf6, 0x15, 0x5a, 0x83, 0xa2, 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x1d, - 0xed, 0x41, 0xc5, 0x10, 0x04, 0xfa, 0x31, 0x2c, 0x79, 0x1c, 0xf4, 0x6a, 0x6a, 0x99, 0x3e, 0xf1, - 0xf4, 0xfc, 0xce, 0xc2, 0x83, 0xea, 0xde, 0xc6, 0x6e, 0x7c, 0x82, 0x9e, 0xb2, 0x6e, 0x24, 0xd1, - 0xf8, 0x6f, 0x1a, 0xd4, 0xd4, 0x75, 0xf4, 0x05, 0x14, 0x6d, 0x72, 0x41, 0x6c, 0xbe, 0x4b, 0x7d, - 0xef, 0xc3, 0x39, 0x7a, 0x76, 0x5f, 0x30, 0x90, 0x21, 0xb0, 0xa8, 0x03, 0xf5, 0x49, 0xc2, 0x18, - 0x3d, 0xbf, 0xa3, 0x3d, 0xa8, 0xee, 0xdd, 0x55, 0xa4, 0xb3, 0x6c, 0x7e, 0x9e, 0x33, 0x52, 0x82, - 0xf8, 0xfb, 0x50, 0xe4, 0xaa, 0x51, 0x05, 0x8a, 0x87, 0xed, 0x83, 0x57, 0x47, 0x8d, 0x1c, 0x2a, - 0x43, 0xa1, 0x73, 0xf2, 0xac, 0xdb, 0xd0, 0x50, 0x15, 0x4a, 0x6f, 0xf6, 0x8d, 0x93, 0xce, 0xc9, - 0x51, 0x23, 0xcf, 0x10, 0x6d, 0xc3, 0xe8, 0x1a, 0x8d, 0x85, 0x83, 0x12, 0x14, 0xb9, 0x7e, 0xbc, - 0x09, 0x1b, 0x47, 0xc4, 0x7f, 0xe6, 0x9a, 0x13, 0x72, 0x49, 0xdd, 0xf3, 0x8e, 0x33, 0xa4, 0xa1, - 0x3b, 0xff, 0xac, 0x41, 0xe9, 0x35, 0x71, 0xbd, 0x31, 0x75, 0x98, 0x2f, 0x27, 0xe6, 0x37, 0xd4, - 0xe5, 0x56, 0x16, 0x0d, 0x41, 0x70, 0xee, 0xd8, 0xa1, 0x2e, 0x3f, 0x3d, 0xe3, 0x32, 0x82, 0x71, - 0xa7, 0xa6, 0x3f, 0x18, 0xe9, 0x0b, 0x82, 0xcb, 0x09, 0xc6, 0x3d, 0x0d, 0xc6, 0xb6, 0xa5, 0x17, - 0x44, 0x34, 0x38, 0x81, 0x76, 0xa0, 0x3a, 0x75, 0xa9, 0x15, 0x0c, 0xfc, 0x13, 0x73, 0x42, 0xf4, - 0x22, 0x5f, 0x53, 0x59, 0x68, 0x1b, 0xe0, 0x42, 0x1c, 0xa2, 0xe7, 0xbb, 0xfa, 0x22, 0x07, 0x28, - 0x1c, 0xfc, 0x6d, 0x1e, 0xee, 0xcc, 0x5a, 0xc0, 0xe2, 0xbf, 0x03, 0xd5, 0x61, 0xc4, 0xb5, 0x64, - 0x16, 0xa8, 0x2c, 0xf4, 0x19, 0xac, 0x10, 0xe7, 0x62, 0xec, 0x52, 0x67, 0x42, 0x1c, 0xdf, 0x6b, - 0xd1, 0xc0, 0xf1, 0xa5, 0x2d, 0xb3, 0x0b, 0xec, 0x24, 0xbe, 0xe9, 0x9d, 0x4b, 0x98, 0x30, 0x4e, - 0xe1, 0xc4, 0xf9, 0x56, 0x50, 0xf3, 0x6d, 0x1b, 0x60, 0x44, 0xbd, 0x50, 0x79, 0x51, 0x48, 0xc5, - 0x1c, 0x84, 0xa1, 0x36, 0x76, 0x3c, 0xdf, 0x74, 0x06, 0x84, 0xbb, 0x40, 0x58, 0x98, 0xe0, 0xa1, - 0xcf, 0xa0, 0x24, 0x2d, 0xd6, 0x4b, 0x3c, 0x4f, 0x90, 0x92, 0x27, 0x32, 0x44, 0x46, 0x08, 0xc1, - 0x0f, 0x61, 0xb9, 0x4f, 0x4c, 0xd7, 0xa2, 0x97, 0x8e, 0x0c, 0x25, 0x5a, 0x87, 0x45, 0x97, 0x98, - 0x1e, 0x75, 0xa4, 0x17, 0x24, 0xc5, 0xae, 0x50, 0x0c, 0x9d, 0xda, 0x57, 0x58, 0x87, 0xf5, 0x23, - 0xe2, 0xb7, 0x15, 0xdb, 0xc3, 0x6c, 0x78, 0x07, 0x6b, 0x33, 0x2b, 0xb7, 0xf3, 0xf2, 0x4f, 0xa0, - 0xa6, 0x3a, 0x53, 0x5e, 0xb8, 0xa6, 0x9a, 0xea, 0xf1, 0x32, 0x0f, 0x5f, 0x02, 0x8f, 0xff, 0xa9, - 0xc1, 0x72, 0x0a, 0x81, 0xea, 0x90, 0x1f, 0x87, 0x9b, 0xe5, 0xc7, 0x3c, 0x8f, 0x06, 0x2e, 0x31, - 0x7d, 0x62, 0xbd, 0x19, 0x11, 0x87, 0xc7, 0xb0, 0x62, 0xa8, 0xac, 0x38, 0x3a, 0x0b, 0x6a, 0x74, - 0x76, 0xa1, 0xc8, 0x23, 0xa8, 0x17, 0xf8, 0xa1, 0x74, 0xf5, 0xf6, 0x8e, 0xa8, 0xeb, 0xf7, 0x4d, - 0x4f, 0x64, 0x94, 0x80, 0xa1, 0x26, 0x94, 0x5d, 0x4a, 0x7d, 0x83, 0xda, 0x61, 0xb2, 0x46, 0x34, - 0xfa, 0x04, 0x1a, 0x83, 0xc0, 0x75, 0x89, 0xe3, 0x1b, 0x81, 0x73, 0x12, 0x4c, 0x4e, 0x89, 0xc8, - 0xd7, 0x25, 0x63, 0x86, 0x8f, 0x5b, 0x70, 0xe7, 0x84, 0x5c, 0x2a, 0x56, 0x85, 0x91, 0xfa, 0x04, - 0x1a, 0xcc, 0x6d, 0x43, 0x9b, 0x5e, 0xf6, 0xc9, 0x64, 0x6a, 0xc7, 0xf5, 0x6b, 0x86, 0x8f, 0x7b, - 0xb0, 0x9a, 0x56, 0xc2, 0x22, 0xf2, 0x15, 0x54, 0x15, 0xff, 0x71, 0xe9, 0xeb, 0xdd, 0xad, 0xc2, - 0xf1, 0xc7, 0xfc, 0x3a, 0x65, 0x9c, 0x2c, 0xe5, 0x72, 0xfc, 0x5b, 0x0d, 0x56, 0xd3, 0xc8, 0xff, - 0x7b, 0x7b, 0xf4, 0x08, 0xca, 0xa1, 0x9d, 0xb2, 0x26, 0xae, 0x2a, 0xa2, 0xcc, 0xcf, 0x5c, 0x26, - 0x02, 0xe1, 0xbf, 0x6b, 0xb0, 0xd9, 0x12, 0xcb, 0x37, 0x1f, 0x1a, 0x3d, 0x85, 0x82, 0x7f, 0x35, - 0x25, 0x5c, 0x75, 0x7d, 0xef, 0x53, 0x45, 0xf5, 0x5c, 0x1d, 0xbb, 0xdd, 0x29, 0x13, 0x31, 0xb8, - 0x20, 0x36, 0x61, 0x51, 0xd0, 0xac, 0xc8, 0x9e, 0x74, 0xbb, 0x2f, 0x1b, 0x39, 0x84, 0xa0, 0xde, - 0xeb, 0xef, 0x1b, 0xfd, 0xb7, 0xfb, 0xad, 0x7e, 0xe7, 0x75, 0xa7, 0xff, 0x8b, 0x86, 0x86, 0x56, - 0x60, 0xa9, 0xd7, 0xef, 0xbe, 0x8c, 0x59, 0x79, 0xb4, 0x04, 0x95, 0x56, 0xf7, 0xe4, 0x59, 0xe7, - 0xe8, 0x95, 0xd1, 0x6e, 0x2c, 0xb0, 0x6a, 0x6c, 0xb4, 0x7b, 0xed, 0x7e, 0xa3, 0x80, 0x6a, 0x50, - 0x3e, 0xea, 0xbe, 0x15, 0xb5, 0xb9, 0x88, 0xcf, 0x61, 0x23, 0xeb, 0x30, 0xcc, 0xb7, 0x69, 0x73, - 0xa2, 0xa4, 0xce, 0xab, 0x49, 0x9d, 0x95, 0x88, 0x0b, 0x73, 0x12, 0xf1, 0x0f, 0x1a, 0xe8, 0xc7, - 0xd4, 0x1a, 0x0f, 0xaf, 0x6e, 0xe5, 0x3d, 0xa0, 0x53, 0xe2, 0x9a, 0xfe, 0x98, 0x3a, 0xe1, 0x3d, - 0xbe, 0x9b, 0x1d, 0xd9, 0x6e, 0x88, 0x33, 0x14, 0x11, 0x74, 0x1f, 0xea, 0x2e, 0x19, 0x50, 0x67, - 0x38, 0x3e, 0x0b, 0x5c, 0xb2, 0x6f, 0xdb, 0xfc, 0x5c, 0x65, 0x23, 0xc5, 0xc5, 0x7f, 0xd2, 0x60, - 0x2d, 0x4b, 0x19, 0x7a, 0x22, 0xe3, 0x27, 0x9a, 0xed, 0xfd, 0x1b, 0xf6, 0x4e, 0x84, 0x4e, 0xdc, - 0x5d, 0x5b, 0x54, 0xd9, 0x7c, 0x78, 0x77, 0x05, 0x8d, 0xbf, 0x97, 0x11, 0xd6, 0x65, 0xa8, 0x1a, - 0xed, 0xe3, 0xee, 0xeb, 0xf6, 0x5b, 0xa3, 0xfb, 0x82, 0x45, 0xac, 0x06, 0xe5, 0xfd, 0xc3, 0x43, - 0x41, 0x15, 0xf0, 0xef, 0x34, 0x58, 0xcf, 0xf0, 0x1c, 0x0b, 0xd3, 0xcf, 0xa1, 0x31, 0x34, 0xc7, - 0x36, 0xb1, 0xba, 0xb1, 0xb7, 0xb4, 0xdb, 0x79, 0x6b, 0x46, 0x50, 0x06, 0x21, 0x3f, 0x1b, 0x73, - 0xb5, 0x90, 0xe1, 0x0e, 0x6c, 0x1e, 0x12, 0xcf, 0x77, 0xe9, 0x6d, 0xe2, 0xb8, 0x05, 0x95, 0x73, - 0x42, 0xa6, 0x7d, 0x5e, 0xf9, 0xf2, 0x3c, 0x02, 0x31, 0x03, 0x13, 0xd8, 0xc8, 0x52, 0xc5, 0x0c, - 0xfb, 0x19, 0xac, 0x0c, 0x6c, 0x62, 0x3a, 0x81, 0x80, 0x72, 0xa6, 0xbc, 0xe1, 0x5b, 0xea, 0x5d, - 0x4a, 0x63, 0x8c, 0x59, 0x31, 0xfc, 0x1f, 0x0d, 0x96, 0x12, 0x35, 0x16, 0x21, 0x28, 0x38, 0x2c, - 0x38, 0xe2, 0xa0, 0xfc, 0x37, 0xeb, 0x5c, 0x36, 0x1d, 0x9c, 0x13, 0x4b, 0x9e, 0x53, 0x52, 0x8c, - 0xcf, 0x2a, 0x72, 0xc7, 0x92, 0x6e, 0x90, 0x14, 0xe3, 0x8b, 0x81, 0x4d, 0x76, 0x61, 0x49, 0xc5, - 0x5e, 0x2b, 0xaa, 0x37, 0x65, 0x0b, 0x2a, 0x03, 0xdb, 0xf4, 0x3c, 0xa5, 0xf3, 0xc6, 0x0c, 0xd4, - 0x86, 0xba, 0x45, 0xa6, 0x36, 0xbd, 0x0a, 0x4b, 0x95, 0xec, 0xbe, 0xea, 0x8c, 0xc7, 0x0e, 0x7f, - 0x98, 0x00, 0x19, 0x29, 0x21, 0x56, 0x28, 0xd1, 0x2c, 0x8c, 0xa5, 0x23, 0x1b, 0x03, 0x14, 0x8b, - 0x23, 0x1a, 0xe9, 0x50, 0x32, 0xcf, 0x18, 0x30, 0x0c, 0x7c, 0x48, 0xb2, 0x15, 0x3a, 0x1c, 0x12, - 0x37, 0x32, 0x3c, 0x24, 0xd9, 0xa0, 0x41, 0xde, 0x91, 0x41, 0xe0, 0x53, 0xb6, 0x28, 0xac, 0x57, - 0x38, 0x78, 0x05, 0x96, 0x8f, 0x88, 0x2f, 0x03, 0x20, 0x7a, 0xfa, 0x53, 0x58, 0x8a, 0x59, 0x2c, - 0xbe, 0x51, 0x3b, 0xd4, 0x6e, 0xd5, 0x0e, 0xf1, 0x03, 0xa8, 0x4b, 0x05, 0xca, 0xa4, 0x21, 0xe3, - 0xa2, 0xa9, 0x71, 0xc1, 0x5f, 0x42, 0x2d, 0x42, 0xb2, 0x9d, 0x3e, 0x86, 0x02, 0x5b, 0x91, 0xc9, - 0xb3, 0x9a, 0xf2, 0x28, 0xdf, 0x83, 0x03, 0x70, 0x1b, 0x96, 0x18, 0xa7, 0xc5, 0xa2, 0x32, 0x37, - 0x4b, 0x58, 0xfb, 0x17, 0xe2, 0xc7, 0xd4, 0x22, 0x51, 0xfb, 0x8f, 0x59, 0xf8, 0x37, 0x50, 0x6d, - 0xd1, 0xc9, 0xc4, 0x74, 0x2c, 0xae, 0xa4, 0x01, 0x0b, 0xc4, 0xb9, 0xe0, 0x66, 0x56, 0x0c, 0xf6, - 0x93, 0x27, 0xc8, 0x88, 0xd8, 0xb6, 0xcc, 0x33, 0x41, 0x30, 0xee, 0x85, 0x69, 0x07, 0xd1, 0x65, - 0xe3, 0x04, 0x4b, 0x1b, 0xd3, 0x3d, 0x0b, 0xc4, 0x38, 0x53, 0xe0, 0x3a, 0x62, 0x06, 0x3b, 0x60, - 0xe0, 0x11, 0x57, 0x66, 0x1a, 0xff, 0x8d, 0x8f, 0xa1, 0xda, 0x1a, 0x99, 0x8e, 0x43, 0xec, 0xb9, - 0x36, 0x20, 0xa5, 0x35, 0x55, 0x64, 0xc9, 0xe2, 0xde, 0x74, 0xcf, 0x88, 0x1f, 0x67, 0x39, 0xa3, - 0xf0, 0x7f, 0xf3, 0x50, 0x8e, 0xae, 0xcd, 0x0f, 0xa1, 0xe2, 0xb1, 0xe0, 0xf0, 0x0c, 0x15, 0xfe, - 0x9c, 0x1f, 0xb8, 0x18, 0xca, 0xe4, 0x06, 0xa1, 0x57, 0x65, 0xaf, 0xd5, 0x53, 0x71, 0x88, 0xbc, - 0x6e, 0xc4, 0x50, 0xf4, 0x53, 0x58, 0x1e, 0x3b, 0xa7, 0x34, 0x70, 0x2c, 0x69, 0x92, 0xa7, 0x2f, - 0xf0, 0x74, 0x59, 0x57, 0x4b, 0x40, 0x6c, 0xad, 0x91, 0x86, 0xa3, 0x03, 0x68, 0xd0, 0xc0, 0x4f, - 0xaa, 0x28, 0x5c, 0xab, 0x62, 0x06, 0x8f, 0x1e, 0xb3, 0x90, 0x47, 0x01, 0xe5, 0xce, 0x4e, 0x89, - 0xc7, 0xab, 0x86, 0x0a, 0x65, 0x17, 0x8f, 0x65, 0xd6, 0x4b, 0xd3, 0x1f, 0xc9, 0x3b, 0x1f, 0xd1, - 0x2c, 0xde, 0xc4, 0xb9, 0xe8, 0x58, 0xfc, 0xa6, 0x57, 0x0c, 0x41, 0xe0, 0x47, 0xb0, 0x9a, 0x2c, - 0x69, 0x22, 0xd7, 0x75, 0x28, 0x89, 0xec, 0xf6, 0x64, 0x22, 0x85, 0x24, 0xfe, 0xbd, 0x06, 0x2b, - 0x33, 0x45, 0x10, 0x3d, 0x81, 0xea, 0xf9, 0xd8, 0xb6, 0x89, 0xd5, 0xbf, 0xd5, 0x1d, 0x53, 0xc1, - 0xe8, 0x2b, 0xa8, 0xb9, 0x81, 0xe3, 0x8c, 0x9d, 0xb3, 0xb0, 0x6a, 0x5f, 0x2f, 0x9c, 0x40, 0xe3, - 0x16, 0xbf, 0xfb, 0x6c, 0x7a, 0x8a, 0x0e, 0x1f, 0x59, 0xaa, 0x29, 0x96, 0x32, 0xdf, 0x4c, 0x4d, - 0x7f, 0xd4, 0x9b, 0x92, 0x41, 0xd8, 0x23, 0x43, 0x1a, 0xff, 0x45, 0x83, 0x72, 0x38, 0x80, 0xcd, - 0xab, 0xd5, 0xb2, 0xf6, 0xe6, 0xb3, 0x6b, 0x6f, 0x62, 0xf4, 0x6e, 0x42, 0x79, 0x18, 0xd8, 0x36, - 0x0f, 0x83, 0xa8, 0x56, 0x11, 0xad, 0x7a, 0xb6, 0x98, 0xf0, 0x2c, 0x7a, 0x08, 0x45, 0xd6, 0xb4, - 0x3d, 0x7d, 0x91, 0x3b, 0x20, 0x73, 0x38, 0x14, 0x08, 0xfc, 0x84, 0x57, 0x37, 0x69, 0x34, 0xf3, - 0x7f, 0x24, 0xab, 0xdd, 0x28, 0xfb, 0x21, 0x7c, 0x70, 0x44, 0xfc, 0x37, 0xa9, 0x89, 0x3b, 0x2a, - 0x9c, 0xcf, 0x60, 0x2d, 0xbd, 0x16, 0x7a, 0xc5, 0x25, 0x53, 0x1a, 0x7a, 0x85, 0xfd, 0xe6, 0xe9, - 0x16, 0x4e, 0xf2, 0xd2, 0xa5, 0x21, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x6d, 0xd8, 0x71, 0x8f, 0x61, - 0x25, 0x3d, 0xf2, 0x67, 0x8d, 0x11, 0x59, 0x07, 0x31, 0x66, 0x25, 0x31, 0x82, 0xc6, 0x8b, 0xb1, - 0xc7, 0x1a, 0x39, 0x8d, 0xec, 0x78, 0x0c, 0x65, 0x46, 0xcf, 0x8d, 0xa8, 0x0e, 0x25, 0x8b, 0x0c, - 0xcd, 0xc0, 0xf6, 0x65, 0x59, 0x0c, 0x49, 0xfc, 0x23, 0xa8, 0x2b, 0xda, 0x42, 0xef, 0x32, 0x2a, - 0xcb, 0xbb, 0x72, 0x0f, 0x43, 0x20, 0xf0, 0x3d, 0xa8, 0xef, 0x5b, 0x16, 0xe3, 0x86, 0xd9, 0x98, - 0xb1, 0x39, 0xfe, 0x1c, 0x6a, 0x11, 0x4a, 0xbe, 0x34, 0x89, 0xeb, 0x52, 0xb7, 0xe7, 0xbb, 0x63, - 0xe7, 0x2c, 0x7c, 0x69, 0x2a, 0x2c, 0xfc, 0x10, 0x56, 0x0c, 0x32, 0xa1, 0x17, 0x44, 0x55, 0xbd, - 0x06, 0xc5, 0xb1, 0x63, 0x91, 0x77, 0xe1, 0xa7, 0x0b, 0x4e, 0xe0, 0x0e, 0x2c, 0xab, 0x50, 0x39, - 0x5c, 0x53, 0xd1, 0x90, 0xca, 0x46, 0x9e, 0x9e, 0xb3, 0x61, 0xd5, 0x21, 0x97, 0x87, 0xc2, 0x60, - 0x06, 0x93, 0xe1, 0x4b, 0x71, 0xf1, 0xa7, 0xb0, 0x6a, 0x90, 0xa1, 0x4b, 0xbc, 0x91, 0xea, 0xdb, - 0x39, 0xfb, 0xfe, 0x80, 0x1d, 0x51, 0x05, 0xdf, 0xce, 0xb2, 0xef, 0xc2, 0x9d, 0x1e, 0xf1, 0x95, - 0x5d, 0xaf, 0xdf, 0xe5, 0x4b, 0x58, 0x4d, 0xc3, 0x6f, 0xb5, 0xcf, 0xde, 0xb7, 0x35, 0x28, 0xc9, - 0xc7, 0x07, 0x6a, 0x41, 0xb5, 0xef, 0x9a, 0x83, 0x73, 0xf1, 0x19, 0x0b, 0xe9, 0x33, 0x5f, 0xb6, - 0xe4, 0x19, 0x9a, 0xeb, 0x19, 0x2b, 0x6c, 0xc2, 0xcb, 0x7d, 0xae, 0xa1, 0xaf, 0xa1, 0x91, 0xfe, - 0x3a, 0x83, 0xb0, 0x82, 0x9f, 0xf3, 0xf1, 0xa9, 0xb9, 0x73, 0x2d, 0x86, 0x6b, 0x47, 0x07, 0x50, - 0x0e, 0xbf, 0x5e, 0x20, 0xf5, 0x81, 0x99, 0xfa, 0xfa, 0xd1, 0xd4, 0x33, 0xd7, 0x84, 0x8e, 0x37, - 0xbc, 0x32, 0xaa, 0x9f, 0x35, 0xd0, 0x47, 0xc9, 0xad, 0x33, 0x3e, 0x86, 0x34, 0xef, 0x5e, 0x07, - 0x11, 0x8a, 0xfb, 0x50, 0x4f, 0x3e, 0xce, 0x91, 0x6a, 0x52, 0xe6, 0xe3, 0xbf, 0xb9, 0x7d, 0x0d, - 0x22, 0xd2, 0x9a, 0xdc, 0x0f, 0xed, 0xcc, 0x3d, 0x4a, 0x96, 0xd6, 0x8c, 0x07, 0x3b, 0xce, 0xa1, - 0x5f, 0x01, 0x9a, 0x7d, 0x71, 0xa2, 0x7b, 0xb7, 0x79, 0x1d, 0x37, 0xf1, 0x0d, 0x28, 0xb1, 0xc3, - 0x2f, 0x61, 0x65, 0xe6, 0xad, 0x84, 0xbe, 0xa3, 0x88, 0xce, 0x7b, 0x83, 0x36, 0x3f, 0xba, 0x1e, - 0x14, 0x19, 0x30, 0xfb, 0x64, 0x49, 0x18, 0x30, 0xf7, 0x71, 0x94, 0x30, 0x60, 0xce, 0xbb, 0x47, - 0xe4, 0x5a, 0x38, 0x2a, 0x27, 0x72, 0x2d, 0x35, 0x52, 0x27, 0x72, 0x2d, 0x31, 0x5b, 0xe3, 0x1c, - 0x7a, 0x0a, 0x25, 0xc9, 0x42, 0x9b, 0xb3, 0xb0, 0x50, 0xc3, 0x46, 0xd6, 0x92, 0x50, 0x70, 0x02, - 0x35, 0x75, 0xaa, 0x40, 0xdb, 0x73, 0xdf, 0x5c, 0x42, 0xd5, 0xb5, 0x6f, 0xb2, 0xc8, 0x28, 0xde, - 0x21, 0xd3, 0x46, 0xa9, 0xb3, 0x42, 0xda, 0xa8, 0xb8, 0xa5, 0xe2, 0x1c, 0x1a, 0xf2, 0xef, 0x82, - 0x33, 0x2d, 0x0c, 0xdd, 0x4f, 0xca, 0xcc, 0x6b, 0xa5, 0xcd, 0x7b, 0x37, 0xe2, 0xc4, 0x3e, 0x6d, - 0xa8, 0x44, 0x0d, 0x07, 0x7d, 0xa0, 0x08, 0xa5, 0x9b, 0x5a, 0x73, 0x33, 0x7b, 0x31, 0x8a, 0x81, - 0x6c, 0x2a, 0x89, 0x18, 0x24, 0xdb, 0x51, 0x22, 0x06, 0x6a, 0x0f, 0xc2, 0x39, 0xf4, 0x1c, 0x20, - 0x6e, 0x1c, 0x68, 0x2b, 0xd1, 0xe5, 0x52, 0xad, 0xa7, 0xd9, 0x9c, 0xb3, 0x1a, 0x45, 0x53, 0x6d, - 0x05, 0x89, 0x68, 0x66, 0x34, 0x94, 0xe6, 0xd6, 0xdc, 0xf5, 0xa8, 0x36, 0x24, 0x8b, 0x7e, 0xa2, - 0x36, 0x64, 0xb6, 0x8f, 0x44, 0x6d, 0xc8, 0xe8, 0x18, 0x38, 0x77, 0xf0, 0xf8, 0xaf, 0xef, 0xb7, - 0xb5, 0x7f, 0xbc, 0xdf, 0xd6, 0xfe, 0xf5, 0x7e, 0x5b, 0xfb, 0xe3, 0xbf, 0xb7, 0x73, 0x80, 0x07, - 0xa3, 0xdd, 0x01, 0x71, 0x9d, 0x5d, 0xd3, 0x1e, 0x0f, 0xc8, 0x2e, 0xdd, 0xdb, 0x0d, 0x35, 0xb8, - 0xd3, 0x81, 0x47, 0xdc, 0x0b, 0xe2, 0x7e, 0x9d, 0x9f, 0x9e, 0x9e, 0x2e, 0xf2, 0x7f, 0x72, 0xbe, - 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x51, 0xba, 0xac, 0xe3, 0x19, 0x00, 0x00, + 0x15, 0xd7, 0xc8, 0x52, 0x24, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x36, 0x38, 0xde, 0x26, + 0x95, 0x4d, 0x76, 0x17, 0x67, 0xf1, 0x02, 0x9b, 0x0a, 0x0b, 0xc1, 0x96, 0x15, 0x47, 0x10, 0x5b, + 0xa9, 0x91, 0x92, 0x14, 0x5b, 0x45, 0x85, 0xb1, 0xa6, 0x65, 0x69, 0x3d, 0x9a, 0x16, 0x3d, 0x23, + 0x25, 0x39, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xa2, 0x38, 0xf2, 0x3d, 0xb8, 0x50, + 0xc0, 0x37, 0xa0, 0x42, 0x15, 0x27, 0x3e, 0x04, 0xd5, 0x7f, 0x66, 0xa6, 0x67, 0x34, 0x72, 0x5c, + 0xc5, 0x4d, 0xef, 0xf5, 0xaf, 0x5f, 0xf7, 0x7b, 0xbf, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x6b, 0xca, + 0x68, 0x40, 0xfd, 0xfb, 0x74, 0x7f, 0x40, 0xbd, 0x80, 0x51, 0x77, 0x4f, 0x28, 0x50, 0x25, 0x52, + 0xe0, 0x2d, 0xd8, 0x6c, 0xcf, 0x89, 0x17, 0xbc, 0x3a, 0x21, 0x3e, 0xf5, 0x9f, 0x10, 0x9b, 0x05, + 0x67, 0xc4, 0x0e, 0xf0, 0x1a, 0xac, 0xf6, 0x02, 0x3b, 0x98, 0xf9, 0x16, 0xf9, 0xd5, 0x8c, 0xf8, + 0x01, 0x3e, 0x83, 0x6a, 0xa8, 0x98, 0xba, 0x6f, 0xd1, 0x26, 0x14, 0xfd, 0xc0, 0x0e, 0x88, 0x69, + 0xec, 0x1a, 0x77, 0x2b, 0x96, 0x14, 0xd0, 0x8f, 0x60, 0xd5, 0x17, 0xa0, 0xe7, 0x53, 0xc7, 0x0e, + 0x88, 0x6f, 0xe6, 0x77, 0x57, 0xee, 0x56, 0xf7, 0x6f, 0xec, 0xc5, 0x3b, 0xe8, 0x69, 0xe3, 0x56, + 0x12, 0x8d, 0xff, 0x66, 0x40, 0x4d, 0x1f, 0x47, 0x9f, 0x43, 0xd1, 0x25, 0x73, 0xe2, 0x8a, 0x55, + 0xea, 0xfb, 0xdf, 0x5a, 0x62, 0x67, 0xef, 0x29, 0x07, 0x59, 0x12, 0x8b, 0x3a, 0x50, 0x9f, 0x24, + 0x9c, 0x31, 0xf3, 0xbb, 0xc6, 0xdd, 0xea, 0xfe, 0x2d, 0x6d, 0x76, 0x96, 0xcf, 0x4f, 0x72, 0x56, + 0x6a, 0x22, 0xfe, 0x1e, 0x14, 0x85, 0x69, 0x54, 0x81, 0xe2, 0x51, 0xfb, 0xf0, 0xf9, 0x71, 0x23, + 0x87, 0xca, 0x50, 0xe8, 0x9c, 0x3e, 0xee, 0x36, 0x0c, 0x54, 0x85, 0xd2, 0xcb, 0x03, 0xeb, 0xb4, + 0x73, 0x7a, 0xdc, 0xc8, 0x73, 0x44, 0xdb, 0xb2, 0xba, 0x56, 0x63, 0xe5, 0xb0, 0x04, 0x45, 0x61, + 0x1f, 0x6f, 0xc3, 0x8d, 0x63, 0x12, 0x3c, 0x66, 0xf6, 0x84, 0xbc, 0xa6, 0xec, 0xa2, 0xe3, 0x0d, + 0x69, 0x18, 0xce, 0x3f, 0x19, 0x50, 0x7a, 0x41, 0x98, 0x3f, 0xa6, 0x1e, 0x8f, 0xe5, 0xc4, 0xfe, + 0x9a, 0x32, 0xe1, 0x65, 0xd1, 0x92, 0x82, 0xd0, 0x8e, 0x3d, 0xca, 0xc4, 0xee, 0xb9, 0x96, 0x0b, + 0x5c, 0x3b, 0xb5, 0x83, 0xc1, 0xc8, 0x5c, 0x91, 0x5a, 0x21, 0x70, 0xed, 0xd9, 0x6c, 0xec, 0x3a, + 0x66, 0x41, 0xb2, 0x21, 0x04, 0xb4, 0x0b, 0xd5, 0x29, 0xa3, 0xce, 0x6c, 0x10, 0x9c, 0xda, 0x13, + 0x62, 0x16, 0xc5, 0x98, 0xae, 0x42, 0x3b, 0x00, 0x73, 0xb9, 0x89, 0x5e, 0xc0, 0xcc, 0x6b, 0x02, + 0xa0, 0x69, 0xf0, 0x37, 0x79, 0xb8, 0xbe, 0xe8, 0x01, 0xe7, 0x7f, 0x17, 0xaa, 0xc3, 0x48, 0xeb, + 0xa8, 0x2c, 0xd0, 0x55, 0xe8, 0x53, 0x58, 0x27, 0xde, 0x7c, 0xcc, 0xa8, 0x37, 0x21, 0x5e, 0xe0, + 0xb7, 0xe8, 0xcc, 0x0b, 0x94, 0x2f, 0x8b, 0x03, 0x7c, 0x27, 0x81, 0xed, 0x5f, 0x28, 0x98, 0x74, + 0x4e, 0xd3, 0xc4, 0xf9, 0x56, 0xd0, 0xf3, 0x6d, 0x07, 0x60, 0x44, 0xfd, 0xd0, 0x78, 0x51, 0xce, + 0x8a, 0x35, 0x08, 0x43, 0x6d, 0xec, 0xf9, 0x81, 0xed, 0x0d, 0x88, 0x08, 0x81, 0xf4, 0x30, 0xa1, + 0x43, 0x9f, 0x42, 0x49, 0x79, 0x6c, 0x96, 0x44, 0x9e, 0x20, 0x2d, 0x4f, 0x14, 0x45, 0x56, 0x08, + 0xc1, 0xf7, 0x60, 0xad, 0x4f, 0x6c, 0xe6, 0xd0, 0xd7, 0x9e, 0xa2, 0x12, 0x6d, 0xc1, 0x35, 0x46, + 0x6c, 0x9f, 0x7a, 0x2a, 0x0a, 0x4a, 0xe2, 0x47, 0x28, 0x86, 0x4e, 0xdd, 0xb7, 0xd8, 0x84, 0xad, + 0x63, 0x12, 0xb4, 0x35, 0xdf, 0xc3, 0x6c, 0x78, 0x03, 0x9b, 0x0b, 0x23, 0x57, 0x8b, 0xf2, 0x8f, + 0xa1, 0xa6, 0x07, 0x53, 0x1d, 0xb8, 0xa6, 0x9e, 0xea, 0xf1, 0xb0, 0xa0, 0x2f, 0x81, 0xc7, 0xff, + 0x34, 0x60, 0x2d, 0x85, 0x40, 0x75, 0xc8, 0x8f, 0xc3, 0xc5, 0xf2, 0x63, 0x91, 0x47, 0x03, 0x46, + 0xec, 0x80, 0x38, 0x2f, 0x47, 0xc4, 0x13, 0x1c, 0x56, 0x2c, 0x5d, 0x15, 0xb3, 0xb3, 0xa2, 0xb3, + 0xb3, 0x07, 0x45, 0xc1, 0xa0, 0x59, 0x10, 0x9b, 0x32, 0xf5, 0xd3, 0x3b, 0xa2, 0x2c, 0xe8, 0xdb, + 0xbe, 0xcc, 0x28, 0x09, 0x43, 0x4d, 0x28, 0x33, 0x4a, 0x03, 0x8b, 0xba, 0x61, 0xb2, 0x46, 0x32, + 0xfa, 0x18, 0x1a, 0x83, 0x19, 0x63, 0xc4, 0x0b, 0xac, 0x99, 0x77, 0x3a, 0x9b, 0x9c, 0x11, 0x99, + 0xaf, 0xab, 0xd6, 0x82, 0x1e, 0xb7, 0xe0, 0xfa, 0x29, 0x79, 0xad, 0x79, 0x15, 0x32, 0xf5, 0x31, + 0x34, 0x78, 0xd8, 0x86, 0x2e, 0x7d, 0xdd, 0x27, 0x93, 0xa9, 0x1b, 0xd7, 0xaf, 0x05, 0x3d, 0xee, + 0xc1, 0x46, 0xda, 0x08, 0x67, 0xe4, 0x4b, 0xa8, 0x6a, 0xf1, 0x13, 0xb3, 0x2f, 0x0f, 0xb7, 0x0e, + 0xc7, 0x1f, 0x89, 0xe3, 0x94, 0xb1, 0xb3, 0x54, 0xc8, 0xf1, 0x6f, 0x0c, 0xd8, 0x48, 0x23, 0xff, + 0xef, 0xe5, 0xd1, 0x7d, 0x28, 0x87, 0x7e, 0xaa, 0x9a, 0xb8, 0xa1, 0x4d, 0xe5, 0x71, 0x16, 0x73, + 0x22, 0x10, 0xfe, 0xbb, 0x01, 0xdb, 0x2d, 0x39, 0xfc, 0xfe, 0x4d, 0xa3, 0x47, 0x50, 0x08, 0xde, + 0x4e, 0x89, 0x30, 0x5d, 0xdf, 0xff, 0x44, 0x33, 0xbd, 0xd4, 0xc6, 0x5e, 0x77, 0xca, 0xa7, 0x58, + 0x62, 0x22, 0xb6, 0xe1, 0x9a, 0x94, 0x79, 0x91, 0x3d, 0xed, 0x76, 0x9f, 0x35, 0x72, 0x08, 0x41, + 0xbd, 0xd7, 0x3f, 0xb0, 0xfa, 0xaf, 0x0e, 0x5a, 0xfd, 0xce, 0x8b, 0x4e, 0xff, 0xe7, 0x0d, 0x03, + 0xad, 0xc3, 0x6a, 0xaf, 0xdf, 0x7d, 0x16, 0xab, 0xf2, 0x68, 0x15, 0x2a, 0xad, 0xee, 0xe9, 0xe3, + 0xce, 0xf1, 0x73, 0xab, 0xdd, 0x58, 0xe1, 0xd5, 0xd8, 0x6a, 0xf7, 0xda, 0xfd, 0x46, 0x01, 0xd5, + 0xa0, 0x7c, 0xdc, 0x7d, 0x25, 0x6b, 0x73, 0x11, 0x5f, 0xc0, 0x8d, 0xac, 0xcd, 0xf0, 0xd8, 0xa6, + 0xdd, 0x89, 0x92, 0x3a, 0xaf, 0x27, 0x75, 0x56, 0x22, 0xae, 0x2c, 0x49, 0xc4, 0xdf, 0x1b, 0x60, + 0x9e, 0x50, 0x67, 0x3c, 0x7c, 0x7b, 0xa5, 0xe8, 0x01, 0x9d, 0x12, 0x66, 0x07, 0x63, 0xea, 0x85, + 0xe7, 0xf8, 0x56, 0x36, 0xb3, 0xdd, 0x10, 0x67, 0x69, 0x53, 0xd0, 0x1d, 0xa8, 0x33, 0x32, 0xa0, + 0xde, 0x70, 0x7c, 0x3e, 0x63, 0xe4, 0xc0, 0x75, 0xc5, 0xbe, 0xca, 0x56, 0x4a, 0x8b, 0xff, 0x68, + 0xc0, 0x66, 0x96, 0x31, 0xf4, 0x50, 0xf1, 0x27, 0x9b, 0xed, 0x9d, 0xf7, 0xac, 0x9d, 0xa0, 0x4e, + 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x7c, 0x78, 0x76, 0xa5, 0x8c, 0xbf, 0x9b, 0x41, 0xeb, 0x1a, 0x54, + 0xad, 0xf6, 0x49, 0xf7, 0x45, 0xfb, 0x95, 0xd5, 0x7d, 0xca, 0x19, 0xab, 0x41, 0xf9, 0xe0, 0xe8, + 0x48, 0x4a, 0x05, 0xfc, 0x5b, 0x03, 0xb6, 0x32, 0x22, 0xc7, 0x69, 0xfa, 0x19, 0x34, 0x86, 0xf6, + 0xd8, 0x25, 0x4e, 0x37, 0x8e, 0x96, 0x71, 0xb5, 0x68, 0x2d, 0x4c, 0x54, 0x24, 0xe4, 0x17, 0x39, + 0xd7, 0x0b, 0x19, 0xee, 0xc0, 0xf6, 0x11, 0xf1, 0x03, 0x46, 0xaf, 0xc2, 0xe3, 0x4d, 0xa8, 0x5c, + 0x10, 0x32, 0xed, 0x8b, 0xca, 0x97, 0x17, 0x0c, 0xc4, 0x0a, 0x4c, 0xe0, 0x46, 0x96, 0x29, 0xee, + 0xd8, 0x4f, 0x61, 0x7d, 0xe0, 0x12, 0xdb, 0x9b, 0x49, 0xa8, 0x50, 0xaa, 0x13, 0x7e, 0x53, 0x3f, + 0x4b, 0x69, 0x8c, 0xb5, 0x38, 0x0d, 0xff, 0xc7, 0x80, 0xd5, 0x44, 0x8d, 0x45, 0x08, 0x0a, 0x1e, + 0x27, 0x47, 0x6e, 0x54, 0xfc, 0xe6, 0x9d, 0xcb, 0xa5, 0x83, 0x0b, 0xe2, 0xa8, 0x7d, 0x2a, 0x89, + 0xeb, 0x79, 0x45, 0xee, 0x38, 0x2a, 0x0c, 0x4a, 0xe2, 0x7a, 0x79, 0x61, 0x53, 0x5d, 0x58, 0x49, + 0x71, 0xd4, 0x8a, 0xfa, 0x49, 0xb9, 0x09, 0x95, 0x81, 0x6b, 0xfb, 0xbe, 0xd6, 0x79, 0x63, 0x05, + 0x6a, 0x43, 0xdd, 0x21, 0x53, 0x97, 0xbe, 0x0d, 0x4b, 0x95, 0xea, 0xbe, 0xfa, 0x1d, 0x8f, 0x6f, + 0xfe, 0x28, 0x01, 0xb2, 0x52, 0x93, 0x78, 0xa1, 0x44, 0x8b, 0x30, 0x9e, 0x8e, 0xfc, 0x1a, 0xa0, + 0x79, 0x1c, 0xc9, 0xc8, 0x84, 0x92, 0x7d, 0xce, 0x81, 0x21, 0xf1, 0xa1, 0xc8, 0x47, 0xe8, 0x70, + 0x48, 0x58, 0xe4, 0x78, 0x28, 0xf2, 0x8b, 0x06, 0x79, 0x43, 0x06, 0xb3, 0x80, 0xf2, 0x41, 0xe9, + 0xbd, 0xa6, 0xc1, 0xeb, 0xb0, 0x76, 0x4c, 0x02, 0x45, 0x80, 0xec, 0xe9, 0x8f, 0x60, 0x35, 0x56, + 0x71, 0x7e, 0xa3, 0x76, 0x68, 0x5c, 0xa9, 0x1d, 0xe2, 0xbb, 0x50, 0x57, 0x06, 0xb4, 0x9b, 0x86, + 0xe2, 0xc5, 0xd0, 0x79, 0xc1, 0x5f, 0x40, 0x2d, 0x42, 0xf2, 0x95, 0x3e, 0x82, 0x02, 0x1f, 0x51, + 0xc9, 0xb3, 0x91, 0x8a, 0xa8, 0x58, 0x43, 0x00, 0x70, 0x1b, 0x56, 0xb9, 0xa6, 0xc5, 0x59, 0x59, + 0x9a, 0x25, 0xbc, 0xfd, 0xcb, 0xe9, 0x27, 0xd4, 0x21, 0x51, 0xfb, 0x8f, 0x55, 0xf8, 0xd7, 0x50, + 0x6d, 0xd1, 0xc9, 0xc4, 0xf6, 0x1c, 0x61, 0xa4, 0x01, 0x2b, 0xc4, 0x9b, 0x0b, 0x37, 0x2b, 0x16, + 0xff, 0x29, 0x12, 0x64, 0x44, 0x5c, 0x57, 0xe5, 0x99, 0x14, 0xb8, 0x76, 0x6e, 0xbb, 0xb3, 0xe8, + 0xb0, 0x09, 0x81, 0xa7, 0x8d, 0xcd, 0xce, 0x67, 0xf2, 0x3a, 0x53, 0x10, 0x36, 0x62, 0x05, 0xdf, + 0xe0, 0xcc, 0x27, 0x4c, 0x65, 0x9a, 0xf8, 0x8d, 0x4f, 0xa0, 0xda, 0x1a, 0xd9, 0x9e, 0x47, 0xdc, + 0xa5, 0x3e, 0x20, 0xad, 0x35, 0x55, 0x54, 0xc9, 0x12, 0xd1, 0x64, 0xe7, 0x24, 0x88, 0xb3, 0x9c, + 0x4b, 0xf8, 0xbf, 0x79, 0x28, 0x47, 0xc7, 0xe6, 0x07, 0x50, 0xf1, 0x39, 0x39, 0x22, 0x43, 0x65, + 0x3c, 0x97, 0x13, 0x17, 0x43, 0xf9, 0xbc, 0x41, 0x18, 0x55, 0xd5, 0x6b, 0xcd, 0x14, 0x0f, 0x51, + 0xd4, 0xad, 0x18, 0x8a, 0x7e, 0x02, 0x6b, 0x63, 0xef, 0x8c, 0xce, 0x3c, 0x47, 0xb9, 0xe4, 0x9b, + 0x2b, 0x22, 0x5d, 0xb6, 0xf4, 0x12, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x10, 0x1a, 0x74, 0x16, + 0x24, 0x4d, 0x14, 0x2e, 0x35, 0xb1, 0x80, 0x47, 0x0f, 0x38, 0xe5, 0x11, 0xa1, 0x22, 0xd8, 0xa9, + 0xe9, 0xf1, 0xa8, 0xa5, 0x43, 0xf9, 0xc1, 0xe3, 0x99, 0xf5, 0xcc, 0x0e, 0x46, 0xea, 0xcc, 0x47, + 0x32, 0xe7, 0x9b, 0x78, 0xf3, 0x8e, 0x23, 0x4e, 0x7a, 0xc5, 0x92, 0x02, 0xbe, 0x0f, 0x1b, 0xc9, + 0x92, 0x26, 0x73, 0xdd, 0x84, 0x92, 0xcc, 0x6e, 0x5f, 0x25, 0x52, 0x28, 0xe2, 0xdf, 0x19, 0xb0, + 0xbe, 0x50, 0x04, 0xd1, 0x43, 0xa8, 0x5e, 0x8c, 0x5d, 0x97, 0x38, 0xfd, 0x2b, 0x9d, 0x31, 0x1d, + 0x8c, 0xbe, 0x84, 0x1a, 0x9b, 0x79, 0xde, 0xd8, 0x3b, 0x0f, 0xab, 0xf6, 0xe5, 0x93, 0x13, 0x68, + 0xdc, 0x12, 0x67, 0x9f, 0xdf, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x53, + 0x3b, 0x18, 0xf5, 0xa6, 0x64, 0x10, 0xf6, 0xc8, 0x50, 0xc6, 0x7f, 0x31, 0xa0, 0x1c, 0x5e, 0xc0, + 0x96, 0xd5, 0x6a, 0x55, 0x7b, 0xf3, 0xd9, 0xb5, 0x37, 0x71, 0xf5, 0x6e, 0x42, 0x79, 0x38, 0x73, + 0x5d, 0x41, 0x83, 0xac, 0x56, 0x91, 0xac, 0x47, 0xb6, 0x98, 0x88, 0x2c, 0xba, 0x07, 0x45, 0xde, + 0xb4, 0x7d, 0xf3, 0x9a, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x43, 0x51, 0xdd, 0x94, 0xd3, + 0x3c, 0xfe, 0xd1, 0x5c, 0xe3, 0xbd, 0x73, 0xff, 0x6c, 0xc0, 0x07, 0xc7, 0x24, 0x78, 0x99, 0xba, + 0x72, 0x47, 0xd1, 0xdb, 0x85, 0x2a, 0x23, 0x53, 0xfa, 0xcc, 0x0e, 0x02, 0xc2, 0xc2, 0x57, 0x95, + 0xae, 0x42, 0x77, 0x61, 0x8d, 0x91, 0xf9, 0x98, 0xbf, 0xc8, 0x42, 0x94, 0x8c, 0x4a, 0x5a, 0xcd, + 0x6d, 0xd9, 0xae, 0x7b, 0xc8, 0x6c, 0x6f, 0x30, 0x22, 0xbe, 0xba, 0x11, 0xe9, 0x2a, 0xd1, 0x0e, + 0x5c, 0xb7, 0x6f, 0x9f, 0xcb, 0xae, 0x56, 0xb6, 0x42, 0x11, 0x9f, 0xc1, 0x66, 0x7a, 0x8f, 0x21, + 0x3d, 0x7c, 0x33, 0x21, 0x3d, 0xfc, 0xb7, 0xc8, 0xfb, 0xf0, 0x49, 0xa1, 0xb8, 0x0d, 0x65, 0x71, + 0x37, 0x52, 0xdb, 0x52, 0x2c, 0x45, 0x32, 0xfe, 0x1a, 0xb6, 0xb3, 0x43, 0xc1, 0x63, 0x7a, 0x02, + 0xeb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0x6b, 0x93, 0xd6, 0xe2, 0x4c, 0x8c, 0xa0, 0xf1, 0x74, + 0xec, 0xf3, 0xdb, 0x06, 0x8d, 0xba, 0xd4, 0x03, 0x28, 0x73, 0x79, 0x69, 0xda, 0x99, 0x50, 0x72, + 0xc8, 0xd0, 0x9e, 0xb9, 0x81, 0xaa, 0xdd, 0xa1, 0x88, 0x7f, 0x08, 0x75, 0xcd, 0x5a, 0x98, 0x02, + 0x5c, 0xca, 0x4a, 0x01, 0xb5, 0x86, 0x25, 0x11, 0xf8, 0x36, 0xd4, 0x0f, 0x1c, 0x87, 0x6b, 0x43, + 0xd2, 0x33, 0x16, 0xc7, 0x9f, 0x41, 0x2d, 0x42, 0xa9, 0xe7, 0x30, 0x61, 0x8c, 0xb2, 0x5e, 0xc0, + 0xc6, 0xde, 0x79, 0x98, 0x18, 0x9a, 0x0a, 0xdf, 0x83, 0x75, 0x8b, 0x4c, 0xe8, 0x9c, 0xe8, 0xa6, + 0x37, 0xa1, 0x38, 0xf6, 0x1c, 0xf2, 0x26, 0xfc, 0xbe, 0x22, 0x04, 0xdc, 0x81, 0x35, 0x1d, 0xaa, + 0x5e, 0x00, 0x54, 0x76, 0xcd, 0xb2, 0x95, 0xa7, 0x17, 0xfc, 0x46, 0xed, 0x91, 0xd7, 0x47, 0xd2, + 0x61, 0x0e, 0x53, 0xd4, 0xa6, 0xb4, 0xf8, 0x13, 0xd8, 0xb0, 0xc8, 0x90, 0x11, 0x7f, 0xa4, 0xc7, + 0x76, 0xc9, 0xba, 0xdf, 0xe7, 0x5b, 0xd4, 0xc1, 0x57, 0xf3, 0xec, 0x3b, 0x70, 0xbd, 0x47, 0x02, + 0x6d, 0xd5, 0xcb, 0x57, 0xf9, 0x02, 0x36, 0xd2, 0xf0, 0x2b, 0xad, 0xb3, 0xff, 0x4d, 0x0d, 0x4a, + 0xea, 0x85, 0x84, 0x5a, 0x50, 0xed, 0x33, 0x7b, 0x70, 0x21, 0xbf, 0xb5, 0x21, 0x73, 0xe1, 0xf3, + 0x9b, 0xda, 0x43, 0x73, 0x2b, 0x63, 0x84, 0x5f, 0x43, 0x73, 0x9f, 0x19, 0xe8, 0x2b, 0x68, 0xa4, + 0x3f, 0x21, 0x21, 0xac, 0xe1, 0x97, 0x7c, 0x21, 0x6b, 0xee, 0x5e, 0x8a, 0x11, 0xd6, 0xd1, 0x21, + 0x94, 0xc3, 0x4f, 0x2c, 0x48, 0x7f, 0x05, 0xa7, 0x3e, 0xd1, 0x34, 0xcd, 0xcc, 0x31, 0x69, 0xe3, + 0xa5, 0x28, 0xdf, 0xfa, 0xb7, 0x17, 0xf4, 0x61, 0x72, 0xe9, 0x8c, 0x2f, 0x36, 0xcd, 0x5b, 0x97, + 0x41, 0xa4, 0xe1, 0x3e, 0xd4, 0x93, 0x5f, 0x10, 0x90, 0xee, 0x52, 0xe6, 0x17, 0x8a, 0xe6, 0xce, + 0x25, 0x88, 0xc8, 0x6a, 0x72, 0x3d, 0xb4, 0xbb, 0x74, 0x2b, 0x59, 0x56, 0x33, 0xbe, 0x2a, 0xe0, + 0x1c, 0xfa, 0x25, 0xa0, 0xc5, 0x67, 0x31, 0xba, 0x7d, 0x95, 0x27, 0x7c, 0x13, 0xbf, 0x07, 0x25, + 0x57, 0xf8, 0x05, 0xac, 0x2f, 0x3c, 0xe8, 0xd0, 0xb7, 0xb5, 0xa9, 0xcb, 0x1e, 0xca, 0xcd, 0x0f, + 0x2f, 0x07, 0x45, 0x0e, 0x2c, 0xbe, 0xab, 0x12, 0x0e, 0x2c, 0x7d, 0xc1, 0x25, 0x1c, 0x58, 0xf2, + 0x38, 0x93, 0xb9, 0x16, 0xde, 0xe7, 0x13, 0xb9, 0x96, 0xba, 0xf7, 0x27, 0x72, 0x2d, 0xf1, 0x00, + 0xc0, 0x39, 0xf4, 0x08, 0x4a, 0x4a, 0x85, 0xb6, 0x17, 0x61, 0xa1, 0x85, 0x1b, 0x59, 0x43, 0xd2, + 0xc0, 0x29, 0xd4, 0xf4, 0xab, 0x0f, 0xda, 0x59, 0xfa, 0x30, 0x94, 0xa6, 0x2e, 0x7d, 0x38, 0x46, + 0x4e, 0x89, 0x36, 0x9e, 0x76, 0x4a, 0xbf, 0xd0, 0xa4, 0x9d, 0x8a, 0xfb, 0x3e, 0xce, 0xa1, 0xa1, + 0xf8, 0x78, 0xb9, 0xd0, 0xc2, 0xd0, 0x9d, 0xe4, 0x9c, 0x65, 0xed, 0xbe, 0x79, 0xfb, 0xbd, 0x38, + 0xb9, 0x4e, 0x1b, 0x2a, 0x51, 0xc3, 0x41, 0x1f, 0x68, 0x93, 0xd2, 0x4d, 0xad, 0xb9, 0x9d, 0x3d, + 0x18, 0x71, 0xa0, 0x9a, 0x4a, 0x82, 0x83, 0x64, 0x3b, 0x4a, 0x70, 0xa0, 0xf7, 0x20, 0x9c, 0x43, + 0x4f, 0x00, 0xe2, 0xc6, 0x81, 0x6e, 0x26, 0xba, 0x5c, 0xaa, 0xf5, 0x34, 0x9b, 0x4b, 0x46, 0x23, + 0x36, 0xf5, 0x56, 0x90, 0x60, 0x33, 0xa3, 0xa1, 0x34, 0x6f, 0x2e, 0x1d, 0x8f, 0x6a, 0x43, 0xb2, + 0xe8, 0x27, 0x6a, 0x43, 0x66, 0xfb, 0x48, 0xd4, 0x86, 0x8c, 0x8e, 0x81, 0x73, 0x87, 0x0f, 0xfe, + 0xfa, 0x6e, 0xc7, 0xf8, 0xc7, 0xbb, 0x1d, 0xe3, 0x5f, 0xef, 0x76, 0x8c, 0x3f, 0xfc, 0x7b, 0x27, + 0x07, 0x78, 0x30, 0xda, 0x1b, 0x10, 0xe6, 0xed, 0xd9, 0xee, 0x78, 0x40, 0xf6, 0xe8, 0xfe, 0x5e, + 0x68, 0x81, 0x4d, 0x07, 0x3e, 0x61, 0x73, 0xc2, 0xbe, 0xca, 0x4f, 0xcf, 0xce, 0xae, 0x89, 0xbf, + 0x9b, 0x3e, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x63, 0x43, 0xc7, 0x88, 0x1a, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3491,68 +3581,6 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} - func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3992,7 +4020,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4000,26 +4028,20 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4027,26 +4049,20 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4054,47 +4070,38 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.StatusUpdates { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4102,61 +4109,46 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) } if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } + nn1, err1 := m.Event.MarshalTo(dAtA[i:]) + if err1 != nil { + return 0, err1 } + i += nn1 } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + i := 0 if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) + n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) + if err2 != nil { + return 0, err2 + } + i += n2 } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4164,26 +4156,20 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4191,62 +4177,53 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if m.Minor != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + if m.Patch != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) } if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i += copy(dAtA[i:], m.Build) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + if len(m.ProductName) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i += copy(dAtA[i:], m.ProductName) } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if len(m.VersionStr) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i += copy(dAtA[i:], m.VersionStr) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4254,74 +4231,63 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 + if m.EnvironmentsCount != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + if m.TasksCount != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if m.HostsCount != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + if len(m.InstanceName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i += copy(dAtA[i:], m.InstanceName) } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.Version != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) + n3, err3 := m.Version.MarshalTo(dAtA[i:]) + if err3 != nil { + return 0, err3 + } + i += n3 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4329,33 +4295,26 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4363,26 +4322,20 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4390,26 +4343,20 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4417,47 +4364,38 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Environments { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4465,73 +4403,61 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 + if len(m.CreatedWhen) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i += copy(dAtA[i:], m.CreatedWhen) } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.RootRole) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i += copy(dAtA[i:], m.RootRole) } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4539,33 +4465,26 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i += copy(dAtA[i:], m.WorkflowTemplate) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4573,38 +4492,30 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n4, err4 := m.Environment.MarshalTo(dAtA[i:]) + if err4 != nil { + return 0, err4 + } + i += n4 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4612,33 +4523,26 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4646,50 +4550,40 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n5, err5 := m.Environment.MarshalTo(dAtA[i:]) + if err5 != nil { + return 0, err5 + } + i += n5 } if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) + n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) + if err6 != nil { + return 0, err6 } - i-- - dAtA[i] = 0xa + i += n6 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4697,38 +4591,31 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4736,45 +4623,37 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4782,57 +4661,48 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.Operations) > 0 { + for _, msg := range m.Operations { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if m.ReconfigureAll { - i-- + dAtA[i] = 0x18 + i++ if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4840,38 +4710,31 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) + i += copy(dAtA[i:], m.RoleName) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4879,54 +4742,44 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.FailedOperations) > 0 { + for _, msg := range m.FailedOperations { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4934,43 +4787,36 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.KeepTasks { - i-- + dAtA[i] = 0x10 + i++ if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4978,38 +4824,30 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) + n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) + if err7 != nil { + return 0, err7 + } + i += n7 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5017,83 +4855,70 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Locked { + dAtA[i] = 0x10 + i++ + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 + i++ } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a + if len(m.TaskId) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a + if len(m.State) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.ClassName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i += copy(dAtA[i:], m.ClassName) + } + if m.DeploymentInfo != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) + n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) + if err8 != nil { + return 0, err8 } - i-- - dAtA[i] = 0x10 + i += n8 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5101,54 +4926,44 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 + if len(m.AgentId) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i += copy(dAtA[i:], m.AgentId) } if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i += copy(dAtA[i:], m.OfferId) } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 + if len(m.ExecutorId) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i += copy(dAtA[i:], m.ExecutorId) } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5156,26 +4971,20 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5183,40 +4992,32 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5224,33 +5025,26 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5258,38 +5052,30 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) + n9, err9 := m.Task.MarshalTo(dAtA[i:]) + if err9 != nil { + return 0, err9 + } + i += n9 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5297,40 +5083,32 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i += copy(dAtA[i:], m.ControlMode) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5338,68 +5116,72 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 + if len(m.Env) > 0 { + for _, s := range m.Env { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } if m.Shell { - i-- + dAtA[i] = 0x10 + i++ if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa + if len(m.Value) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if len(m.User) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5407,47 +5189,38 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.Target) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5455,104 +5228,86 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.ShortInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) + n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) + if err10 != nil { + return 0, err10 } - i-- - dAtA[i] = 0x2a + i += n10 } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 + if m.ClassInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) + n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) + if err11 != nil { + return 0, err11 } + i += n11 } if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.InboundChannels { dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if len(m.OutboundChannels) > 0 { + for _, msg := range m.OutboundChannels { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0xa } - return len(dAtA) - i, nil + if m.CommandInfo != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) + n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) + if err12 != nil { + return 0, err12 + } + i += n12 + } + if len(m.TaskPath) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i += copy(dAtA[i:], m.TaskPath) + } + if len(m.EnvId) > 0 { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5560,35 +5315,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- + for _, s := range m.TaskIds { dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5596,54 +5351,44 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.KilledTasks) > 0 { + for _, msg := range m.KilledTasks { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i += n } } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.RunningTasks) > 0 { + for _, msg := range m.RunningTasks { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5651,40 +5396,32 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) } if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i += copy(dAtA[i:], m.PathSpec) } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5692,77 +5429,71 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } + if len(m.Status) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i += copy(dAtA[i:], m.FullPath) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 + if len(m.Roles) > 0 { + for _, msg := range m.Roles { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5770,40 +5501,32 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Roles { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5811,26 +5534,52 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l + if len(m.RepoPattern) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i += copy(dAtA[i:], m.RepoPattern) + } + if len(m.RevisionPattern) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i += copy(dAtA[i:], m.RevisionPattern) + } + if m.AllBranches { + dAtA[i] = 0x18 + i++ + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.AllTags { + dAtA[i] = 0x20 + i++ + if m.AllTags { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5838,40 +5587,38 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repo) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i += copy(dAtA[i:], m.Repo) } if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i += copy(dAtA[i:], m.Template) } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa + if len(m.Revision) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5879,40 +5626,32 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + for _, msg := range m.WorkflowTemplates { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5920,26 +5659,20 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5947,43 +5680,36 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if m.Default { - i-- + dAtA[i] = 0x10 + i++ if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5991,40 +5717,32 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Repos { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6032,33 +5750,26 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6066,33 +5777,26 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6100,31 +5804,25 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6132,43 +5830,36 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0x12 - } if m.Ok { - i-- + dAtA[i] = 0x8 + i++ if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x8 + i++ } - return len(dAtA) - i, nil + if len(m.NewDefaultRepo) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i += copy(dAtA[i:], m.NewDefaultRepo) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6176,31 +5867,25 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6208,33 +5893,26 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6242,31 +5920,25 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6274,39 +5946,30 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7158,6 +6821,20 @@ func (m *GetWorkflowTemplatesRequest) Size() (n int) { } var l int _ = l + l = len(m.RepoPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.RevisionPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.AllBranches { + n += 2 + } + if m.AllTags { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7178,6 +6855,10 @@ func (m *WorkflowTemplateInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7380,7 +7061,14 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -12222,6 +11910,110 @@ func (m *GetWorkflowTemplatesRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RepoPattern = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RevisionPattern = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllBranches = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllTags = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12340,6 +12132,38 @@ func (m *WorkflowTemplateInfo) Unmarshal(dAtA []byte) error { } m.Template = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Revision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 5076703f0..cafad697e 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StatusUpdate_Level int32 @@ -142,7 +139,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -184,7 +181,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -225,7 +222,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -282,7 +279,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -308,7 +305,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,13 +331,61 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ +// XXX_OneofFuncs is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } +func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) + } + return nil +} + +func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*StatusUpdate) + switch tag { + case 2: // Event.mesosHeartbeat + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Event_MesosHeartbeat) + err := b.DecodeMessage(msg) + m.Event = &StatusUpdate_MesosHeartbeat{msg} + return true, err + default: + return false, nil + } +} + +func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + s := proto.Size(x.MesosHeartbeat) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -364,7 +409,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -409,7 +454,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -497,7 +542,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -587,7 +632,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -633,7 +678,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -675,7 +720,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -716,7 +761,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -775,7 +820,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -857,7 +902,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -904,7 +949,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -951,7 +996,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -999,7 +1044,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1054,7 +1099,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1110,7 +1155,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1173,7 +1218,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1235,7 +1280,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1291,7 +1336,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1353,7 +1398,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1407,7 +1452,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1463,7 +1508,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1555,7 +1600,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1622,7 +1667,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1662,7 +1707,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1709,7 +1754,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1756,7 +1801,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1804,7 +1849,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1862,7 +1907,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1939,7 +1984,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2006,7 +2051,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2095,7 +2140,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2143,7 +2188,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2201,7 +2246,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2260,7 +2305,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2342,7 +2387,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2369,6 +2414,10 @@ func (m *GetRolesReply) GetRoles() []*RoleInfo { } type GetWorkflowTemplatesRequest struct { + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2388,7 +2437,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2407,9 +2456,38 @@ func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if m != nil { + return m.RepoPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if m != nil { + return m.RevisionPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if m != nil { + return m.AllBranches + } + return false +} + +func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { + if m != nil { + return m.AllTags + } + return false +} + type WorkflowTemplateInfo struct { Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2429,7 +2507,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2462,6 +2540,13 @@ func (m *WorkflowTemplateInfo) GetTemplate() string { return "" } +func (m *WorkflowTemplateInfo) GetRevision() string { + if m != nil { + return m.Revision + } + return "" +} + type GetWorkflowTemplatesReply struct { WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2483,7 +2568,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2529,7 +2614,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2570,7 +2655,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2624,7 +2709,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2671,7 +2756,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2718,7 +2803,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2765,7 +2850,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2813,7 +2898,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2867,7 +2952,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2914,7 +2999,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2961,7 +3046,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3008,7 +3093,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3095,142 +3180,147 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2159 bytes of a gzipped FileDescriptorProto + // 2225 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xd7, 0xc8, 0x92, 0x25, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0xd6, 0xeb, 0x78, 0x9b, - 0x54, 0x36, 0xd9, 0x5d, 0x9c, 0xc5, 0x0b, 0x6c, 0x2a, 0x2c, 0x04, 0x5b, 0x56, 0x1c, 0x41, 0x6c, - 0xa5, 0x46, 0x4a, 0x52, 0x6c, 0x15, 0x15, 0xc6, 0x9a, 0x96, 0xa5, 0xf5, 0x68, 0x5a, 0xcc, 0x1f, - 0x3b, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xe2, 0xcc, 0xf7, 0xe0, 0x42, 0x01, - 0xdf, 0x80, 0x0a, 0x55, 0x9c, 0xf8, 0x10, 0x54, 0xff, 0x99, 0x99, 0x9e, 0xd1, 0xc8, 0x76, 0x15, - 0x37, 0xbd, 0xd7, 0xbf, 0xf7, 0xba, 0xdf, 0x9f, 0x7e, 0xef, 0xf5, 0x08, 0xd6, 0xa7, 0x2e, 0xf5, - 0xa9, 0xf7, 0x88, 0xee, 0x0d, 0xa8, 0xe3, 0xbb, 0xd4, 0xde, 0xe5, 0x0c, 0x54, 0x89, 0x18, 0x78, - 0x1d, 0xd6, 0xda, 0x17, 0xc4, 0xf1, 0xdf, 0x1e, 0x13, 0x8f, 0x7a, 0xcf, 0x89, 0xe9, 0xfa, 0xa7, - 0xc4, 0xf4, 0xf1, 0x32, 0x2c, 0xf5, 0x7c, 0xd3, 0x0f, 0x3c, 0x83, 0xfc, 0x3a, 0x20, 0x9e, 0x8f, - 0x4f, 0xa1, 0x1a, 0x32, 0xa6, 0xf6, 0x15, 0x5a, 0x83, 0xa2, 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x1d, - 0xed, 0x41, 0xc5, 0x10, 0x04, 0xfa, 0x31, 0x2c, 0x79, 0x1c, 0xf4, 0x6a, 0x6a, 0x99, 0x3e, 0xf1, - 0xf4, 0xfc, 0xce, 0xc2, 0x83, 0xea, 0xde, 0xc6, 0x6e, 0x7c, 0x82, 0x9e, 0xb2, 0x6e, 0x24, 0xd1, - 0xf8, 0x6f, 0x1a, 0xd4, 0xd4, 0x75, 0xf4, 0x05, 0x14, 0x6d, 0x72, 0x41, 0x6c, 0xbe, 0x4b, 0x7d, - 0xef, 0xc3, 0x39, 0x7a, 0x76, 0x5f, 0x30, 0x90, 0x21, 0xb0, 0xa8, 0x03, 0xf5, 0x49, 0xc2, 0x18, - 0x3d, 0xbf, 0xa3, 0x3d, 0xa8, 0xee, 0xdd, 0x55, 0xa4, 0xb3, 0x6c, 0x7e, 0x9e, 0x33, 0x52, 0x82, - 0xf8, 0xfb, 0x50, 0xe4, 0xaa, 0x51, 0x05, 0x8a, 0x87, 0xed, 0x83, 0x57, 0x47, 0x8d, 0x1c, 0x2a, - 0x43, 0xa1, 0x73, 0xf2, 0xac, 0xdb, 0xd0, 0x50, 0x15, 0x4a, 0x6f, 0xf6, 0x8d, 0x93, 0xce, 0xc9, - 0x51, 0x23, 0xcf, 0x10, 0x6d, 0xc3, 0xe8, 0x1a, 0x8d, 0x85, 0x83, 0x12, 0x14, 0xb9, 0x7e, 0xbc, - 0x09, 0x1b, 0x47, 0xc4, 0x7f, 0xe6, 0x9a, 0x13, 0x72, 0x49, 0xdd, 0xf3, 0x8e, 0x33, 0xa4, 0xa1, - 0x3b, 0xff, 0xac, 0x41, 0xe9, 0x35, 0x71, 0xbd, 0x31, 0x75, 0x98, 0x2f, 0x27, 0xe6, 0x37, 0xd4, - 0xe5, 0x56, 0x16, 0x0d, 0x41, 0x70, 0xee, 0xd8, 0xa1, 0x2e, 0x3f, 0x3d, 0xe3, 0x32, 0x82, 0x71, - 0xa7, 0xa6, 0x3f, 0x18, 0xe9, 0x0b, 0x82, 0xcb, 0x09, 0xc6, 0x3d, 0x0d, 0xc6, 0xb6, 0xa5, 0x17, - 0x44, 0x34, 0x38, 0x81, 0x76, 0xa0, 0x3a, 0x75, 0xa9, 0x15, 0x0c, 0xfc, 0x13, 0x73, 0x42, 0xf4, - 0x22, 0x5f, 0x53, 0x59, 0x68, 0x1b, 0xe0, 0x42, 0x1c, 0xa2, 0xe7, 0xbb, 0xfa, 0x22, 0x07, 0x28, - 0x1c, 0xfc, 0x6d, 0x1e, 0xee, 0xcc, 0x5a, 0xc0, 0xe2, 0xbf, 0x03, 0xd5, 0x61, 0xc4, 0xb5, 0x64, - 0x16, 0xa8, 0x2c, 0xf4, 0x19, 0xac, 0x10, 0xe7, 0x62, 0xec, 0x52, 0x67, 0x42, 0x1c, 0xdf, 0x6b, - 0xd1, 0xc0, 0xf1, 0xa5, 0x2d, 0xb3, 0x0b, 0xec, 0x24, 0xbe, 0xe9, 0x9d, 0x4b, 0x98, 0x30, 0x4e, - 0xe1, 0xc4, 0xf9, 0x56, 0x50, 0xf3, 0x6d, 0x1b, 0x60, 0x44, 0xbd, 0x50, 0x79, 0x51, 0x48, 0xc5, - 0x1c, 0x84, 0xa1, 0x36, 0x76, 0x3c, 0xdf, 0x74, 0x06, 0x84, 0xbb, 0x40, 0x58, 0x98, 0xe0, 0xa1, - 0xcf, 0xa0, 0x24, 0x2d, 0xd6, 0x4b, 0x3c, 0x4f, 0x90, 0x92, 0x27, 0x32, 0x44, 0x46, 0x08, 0xc1, - 0x0f, 0x61, 0xb9, 0x4f, 0x4c, 0xd7, 0xa2, 0x97, 0x8e, 0x0c, 0x25, 0x5a, 0x87, 0x45, 0x97, 0x98, - 0x1e, 0x75, 0xa4, 0x17, 0x24, 0xc5, 0xae, 0x50, 0x0c, 0x9d, 0xda, 0x57, 0x58, 0x87, 0xf5, 0x23, - 0xe2, 0xb7, 0x15, 0xdb, 0xc3, 0x6c, 0x78, 0x07, 0x6b, 0x33, 0x2b, 0xb7, 0xf3, 0xf2, 0x4f, 0xa0, - 0xa6, 0x3a, 0x53, 0x5e, 0xb8, 0xa6, 0x9a, 0xea, 0xf1, 0x32, 0x0f, 0x5f, 0x02, 0x8f, 0xff, 0xa9, - 0xc1, 0x72, 0x0a, 0x81, 0xea, 0x90, 0x1f, 0x87, 0x9b, 0xe5, 0xc7, 0x3c, 0x8f, 0x06, 0x2e, 0x31, - 0x7d, 0x62, 0xbd, 0x19, 0x11, 0x87, 0xc7, 0xb0, 0x62, 0xa8, 0xac, 0x38, 0x3a, 0x0b, 0x6a, 0x74, - 0x76, 0xa1, 0xc8, 0x23, 0xa8, 0x17, 0xf8, 0xa1, 0x74, 0xf5, 0xf6, 0x8e, 0xa8, 0xeb, 0xf7, 0x4d, - 0x4f, 0x64, 0x94, 0x80, 0xa1, 0x26, 0x94, 0x5d, 0x4a, 0x7d, 0x83, 0xda, 0x61, 0xb2, 0x46, 0x34, - 0xfa, 0x04, 0x1a, 0x83, 0xc0, 0x75, 0x89, 0xe3, 0x1b, 0x81, 0x73, 0x12, 0x4c, 0x4e, 0x89, 0xc8, - 0xd7, 0x25, 0x63, 0x86, 0x8f, 0x5b, 0x70, 0xe7, 0x84, 0x5c, 0x2a, 0x56, 0x85, 0x91, 0xfa, 0x04, - 0x1a, 0xcc, 0x6d, 0x43, 0x9b, 0x5e, 0xf6, 0xc9, 0x64, 0x6a, 0xc7, 0xf5, 0x6b, 0x86, 0x8f, 0x7b, - 0xb0, 0x9a, 0x56, 0xc2, 0x22, 0xf2, 0x15, 0x54, 0x15, 0xff, 0x71, 0xe9, 0xeb, 0xdd, 0xad, 0xc2, - 0xf1, 0xc7, 0xfc, 0x3a, 0x65, 0x9c, 0x2c, 0xe5, 0x72, 0xfc, 0x5b, 0x0d, 0x56, 0xd3, 0xc8, 0xff, - 0x7b, 0x7b, 0xf4, 0x08, 0xca, 0xa1, 0x9d, 0xb2, 0x26, 0xae, 0x2a, 0xa2, 0xcc, 0xcf, 0x5c, 0x26, - 0x02, 0xe1, 0xbf, 0x6b, 0xb0, 0xd9, 0x12, 0xcb, 0x37, 0x1f, 0x1a, 0x3d, 0x85, 0x82, 0x7f, 0x35, - 0x25, 0x5c, 0x75, 0x7d, 0xef, 0x53, 0x45, 0xf5, 0x5c, 0x1d, 0xbb, 0xdd, 0x29, 0x13, 0x31, 0xb8, - 0x20, 0x36, 0x61, 0x51, 0xd0, 0xac, 0xc8, 0x9e, 0x74, 0xbb, 0x2f, 0x1b, 0x39, 0x84, 0xa0, 0xde, - 0xeb, 0xef, 0x1b, 0xfd, 0xb7, 0xfb, 0xad, 0x7e, 0xe7, 0x75, 0xa7, 0xff, 0x8b, 0x86, 0x86, 0x56, - 0x60, 0xa9, 0xd7, 0xef, 0xbe, 0x8c, 0x59, 0x79, 0xb4, 0x04, 0x95, 0x56, 0xf7, 0xe4, 0x59, 0xe7, - 0xe8, 0x95, 0xd1, 0x6e, 0x2c, 0xb0, 0x6a, 0x6c, 0xb4, 0x7b, 0xed, 0x7e, 0xa3, 0x80, 0x6a, 0x50, - 0x3e, 0xea, 0xbe, 0x15, 0xb5, 0xb9, 0x88, 0xcf, 0x61, 0x23, 0xeb, 0x30, 0xcc, 0xb7, 0x69, 0x73, - 0xa2, 0xa4, 0xce, 0xab, 0x49, 0x9d, 0x95, 0x88, 0x0b, 0x73, 0x12, 0xf1, 0x0f, 0x1a, 0xe8, 0xc7, - 0xd4, 0x1a, 0x0f, 0xaf, 0x6e, 0xe5, 0x3d, 0xa0, 0x53, 0xe2, 0x9a, 0xfe, 0x98, 0x3a, 0xe1, 0x3d, - 0xbe, 0x9b, 0x1d, 0xd9, 0x6e, 0x88, 0x33, 0x14, 0x11, 0x74, 0x1f, 0xea, 0x2e, 0x19, 0x50, 0x67, - 0x38, 0x3e, 0x0b, 0x5c, 0xb2, 0x6f, 0xdb, 0xfc, 0x5c, 0x65, 0x23, 0xc5, 0xc5, 0x7f, 0xd2, 0x60, - 0x2d, 0x4b, 0x19, 0x7a, 0x22, 0xe3, 0x27, 0x9a, 0xed, 0xfd, 0x1b, 0xf6, 0x4e, 0x84, 0x4e, 0xdc, - 0x5d, 0x5b, 0x54, 0xd9, 0x7c, 0x78, 0x77, 0x05, 0x8d, 0xbf, 0x97, 0x11, 0xd6, 0x65, 0xa8, 0x1a, - 0xed, 0xe3, 0xee, 0xeb, 0xf6, 0x5b, 0xa3, 0xfb, 0x82, 0x45, 0xac, 0x06, 0xe5, 0xfd, 0xc3, 0x43, - 0x41, 0x15, 0xf0, 0xef, 0x34, 0x58, 0xcf, 0xf0, 0x1c, 0x0b, 0xd3, 0xcf, 0xa1, 0x31, 0x34, 0xc7, - 0x36, 0xb1, 0xba, 0xb1, 0xb7, 0xb4, 0xdb, 0x79, 0x6b, 0x46, 0x50, 0x06, 0x21, 0x3f, 0x1b, 0x73, - 0xb5, 0x90, 0xe1, 0x0e, 0x6c, 0x1e, 0x12, 0xcf, 0x77, 0xe9, 0x6d, 0xe2, 0xb8, 0x05, 0x95, 0x73, - 0x42, 0xa6, 0x7d, 0x5e, 0xf9, 0xf2, 0x3c, 0x02, 0x31, 0x03, 0x13, 0xd8, 0xc8, 0x52, 0xc5, 0x0c, - 0xfb, 0x19, 0xac, 0x0c, 0x6c, 0x62, 0x3a, 0x81, 0x80, 0x72, 0xa6, 0xbc, 0xe1, 0x5b, 0xea, 0x5d, - 0x4a, 0x63, 0x8c, 0x59, 0x31, 0xfc, 0x1f, 0x0d, 0x96, 0x12, 0x35, 0x16, 0x21, 0x28, 0x38, 0x2c, - 0x38, 0xe2, 0xa0, 0xfc, 0x37, 0xeb, 0x5c, 0x36, 0x1d, 0x9c, 0x13, 0x4b, 0x9e, 0x53, 0x52, 0x8c, - 0xcf, 0x2a, 0x72, 0xc7, 0x92, 0x6e, 0x90, 0x14, 0xe3, 0x8b, 0x81, 0x4d, 0x76, 0x61, 0x49, 0xc5, - 0x5e, 0x2b, 0xaa, 0x37, 0x65, 0x0b, 0x2a, 0x03, 0xdb, 0xf4, 0x3c, 0xa5, 0xf3, 0xc6, 0x0c, 0xd4, - 0x86, 0xba, 0x45, 0xa6, 0x36, 0xbd, 0x0a, 0x4b, 0x95, 0xec, 0xbe, 0xea, 0x8c, 0xc7, 0x0e, 0x7f, - 0x98, 0x00, 0x19, 0x29, 0x21, 0x56, 0x28, 0xd1, 0x2c, 0x8c, 0xa5, 0x23, 0x1b, 0x03, 0x14, 0x8b, - 0x23, 0x1a, 0xe9, 0x50, 0x32, 0xcf, 0x18, 0x30, 0x0c, 0x7c, 0x48, 0xb2, 0x15, 0x3a, 0x1c, 0x12, - 0x37, 0x32, 0x3c, 0x24, 0xd9, 0xa0, 0x41, 0xde, 0x91, 0x41, 0xe0, 0x53, 0xb6, 0x28, 0xac, 0x57, - 0x38, 0x78, 0x05, 0x96, 0x8f, 0x88, 0x2f, 0x03, 0x20, 0x7a, 0xfa, 0x53, 0x58, 0x8a, 0x59, 0x2c, - 0xbe, 0x51, 0x3b, 0xd4, 0x6e, 0xd5, 0x0e, 0xf1, 0x03, 0xa8, 0x4b, 0x05, 0xca, 0xa4, 0x21, 0xe3, - 0xa2, 0xa9, 0x71, 0xc1, 0x5f, 0x42, 0x2d, 0x42, 0xb2, 0x9d, 0x3e, 0x86, 0x02, 0x5b, 0x91, 0xc9, - 0xb3, 0x9a, 0xf2, 0x28, 0xdf, 0x83, 0x03, 0x70, 0x1b, 0x96, 0x18, 0xa7, 0xc5, 0xa2, 0x32, 0x37, - 0x4b, 0x58, 0xfb, 0x17, 0xe2, 0xc7, 0xd4, 0x22, 0x51, 0xfb, 0x8f, 0x59, 0xf8, 0x37, 0x50, 0x6d, - 0xd1, 0xc9, 0xc4, 0x74, 0x2c, 0xae, 0xa4, 0x01, 0x0b, 0xc4, 0xb9, 0xe0, 0x66, 0x56, 0x0c, 0xf6, - 0x93, 0x27, 0xc8, 0x88, 0xd8, 0xb6, 0xcc, 0x33, 0x41, 0x30, 0xee, 0x85, 0x69, 0x07, 0xd1, 0x65, - 0xe3, 0x04, 0x4b, 0x1b, 0xd3, 0x3d, 0x0b, 0xc4, 0x38, 0x53, 0xe0, 0x3a, 0x62, 0x06, 0x3b, 0x60, - 0xe0, 0x11, 0x57, 0x66, 0x1a, 0xff, 0x8d, 0x8f, 0xa1, 0xda, 0x1a, 0x99, 0x8e, 0x43, 0xec, 0xb9, - 0x36, 0x20, 0xa5, 0x35, 0x55, 0x64, 0xc9, 0xe2, 0xde, 0x74, 0xcf, 0x88, 0x1f, 0x67, 0x39, 0xa3, - 0xf0, 0x7f, 0xf3, 0x50, 0x8e, 0xae, 0xcd, 0x0f, 0xa1, 0xe2, 0xb1, 0xe0, 0xf0, 0x0c, 0x15, 0xfe, - 0x9c, 0x1f, 0xb8, 0x18, 0xca, 0xe4, 0x06, 0xa1, 0x57, 0x65, 0xaf, 0xd5, 0x53, 0x71, 0x88, 0xbc, - 0x6e, 0xc4, 0x50, 0xf4, 0x53, 0x58, 0x1e, 0x3b, 0xa7, 0x34, 0x70, 0x2c, 0x69, 0x92, 0xa7, 0x2f, - 0xf0, 0x74, 0x59, 0x57, 0x4b, 0x40, 0x6c, 0xad, 0x91, 0x86, 0xa3, 0x03, 0x68, 0xd0, 0xc0, 0x4f, - 0xaa, 0x28, 0x5c, 0xab, 0x62, 0x06, 0x8f, 0x1e, 0xb3, 0x90, 0x47, 0x01, 0xe5, 0xce, 0x4e, 0x89, - 0xc7, 0xab, 0x86, 0x0a, 0x65, 0x17, 0x8f, 0x65, 0xd6, 0x4b, 0xd3, 0x1f, 0xc9, 0x3b, 0x1f, 0xd1, - 0x2c, 0xde, 0xc4, 0xb9, 0xe8, 0x58, 0xfc, 0xa6, 0x57, 0x0c, 0x41, 0xe0, 0x47, 0xb0, 0x9a, 0x2c, - 0x69, 0x22, 0xd7, 0x75, 0x28, 0x89, 0xec, 0xf6, 0x64, 0x22, 0x85, 0x24, 0xfe, 0xbd, 0x06, 0x2b, - 0x33, 0x45, 0x10, 0x3d, 0x81, 0xea, 0xf9, 0xd8, 0xb6, 0x89, 0xd5, 0xbf, 0xd5, 0x1d, 0x53, 0xc1, - 0xe8, 0x2b, 0xa8, 0xb9, 0x81, 0xe3, 0x8c, 0x9d, 0xb3, 0xb0, 0x6a, 0x5f, 0x2f, 0x9c, 0x40, 0xe3, - 0x16, 0xbf, 0xfb, 0x6c, 0x7a, 0x8a, 0x0e, 0x1f, 0x59, 0xaa, 0x29, 0x96, 0x32, 0xdf, 0x4c, 0x4d, - 0x7f, 0xd4, 0x9b, 0x92, 0x41, 0xd8, 0x23, 0x43, 0x1a, 0xff, 0x45, 0x83, 0x72, 0x38, 0x80, 0xcd, - 0xab, 0xd5, 0xb2, 0xf6, 0xe6, 0xb3, 0x6b, 0x6f, 0x62, 0xf4, 0x6e, 0x42, 0x79, 0x18, 0xd8, 0x36, - 0x0f, 0x83, 0xa8, 0x56, 0x11, 0xad, 0x7a, 0xb6, 0x98, 0xf0, 0x2c, 0x7a, 0x08, 0x45, 0xd6, 0xb4, - 0x3d, 0x7d, 0x91, 0x3b, 0x20, 0x73, 0x38, 0x14, 0x08, 0xfc, 0x84, 0x57, 0x37, 0x69, 0x34, 0xf3, - 0x7f, 0x24, 0xab, 0xdd, 0x28, 0xfb, 0x21, 0x7c, 0x70, 0x44, 0xfc, 0x37, 0xa9, 0x89, 0x3b, 0x2a, - 0x9c, 0xcf, 0x60, 0x2d, 0xbd, 0x16, 0x7a, 0xc5, 0x25, 0x53, 0x1a, 0x7a, 0x85, 0xfd, 0xe6, 0xe9, - 0x16, 0x4e, 0xf2, 0xd2, 0xa5, 0x21, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x6d, 0xd8, 0x71, 0x8f, 0x61, - 0x25, 0x3d, 0xf2, 0x67, 0x8d, 0x11, 0x59, 0x07, 0x31, 0x66, 0x25, 0x31, 0x82, 0xc6, 0x8b, 0xb1, - 0xc7, 0x1a, 0x39, 0x8d, 0xec, 0x78, 0x0c, 0x65, 0x46, 0xcf, 0x8d, 0xa8, 0x0e, 0x25, 0x8b, 0x0c, - 0xcd, 0xc0, 0xf6, 0x65, 0x59, 0x0c, 0x49, 0xfc, 0x23, 0xa8, 0x2b, 0xda, 0x42, 0xef, 0x32, 0x2a, - 0xcb, 0xbb, 0x72, 0x0f, 0x43, 0x20, 0xf0, 0x3d, 0xa8, 0xef, 0x5b, 0x16, 0xe3, 0x86, 0xd9, 0x98, - 0xb1, 0x39, 0xfe, 0x1c, 0x6a, 0x11, 0x4a, 0xbe, 0x34, 0x89, 0xeb, 0x52, 0xb7, 0xe7, 0xbb, 0x63, - 0xe7, 0x2c, 0x7c, 0x69, 0x2a, 0x2c, 0xfc, 0x10, 0x56, 0x0c, 0x32, 0xa1, 0x17, 0x44, 0x55, 0xbd, - 0x06, 0xc5, 0xb1, 0x63, 0x91, 0x77, 0xe1, 0xa7, 0x0b, 0x4e, 0xe0, 0x0e, 0x2c, 0xab, 0x50, 0x39, - 0x5c, 0x53, 0xd1, 0x90, 0xca, 0x46, 0x9e, 0x9e, 0xb3, 0x61, 0xd5, 0x21, 0x97, 0x87, 0xc2, 0x60, - 0x06, 0x93, 0xe1, 0x4b, 0x71, 0xf1, 0xa7, 0xb0, 0x6a, 0x90, 0xa1, 0x4b, 0xbc, 0x91, 0xea, 0xdb, - 0x39, 0xfb, 0xfe, 0x80, 0x1d, 0x51, 0x05, 0xdf, 0xce, 0xb2, 0xef, 0xc2, 0x9d, 0x1e, 0xf1, 0x95, - 0x5d, 0xaf, 0xdf, 0xe5, 0x4b, 0x58, 0x4d, 0xc3, 0x6f, 0xb5, 0xcf, 0xde, 0xb7, 0x35, 0x28, 0xc9, - 0xc7, 0x07, 0x6a, 0x41, 0xb5, 0xef, 0x9a, 0x83, 0x73, 0xf1, 0x19, 0x0b, 0xe9, 0x33, 0x5f, 0xb6, - 0xe4, 0x19, 0x9a, 0xeb, 0x19, 0x2b, 0x6c, 0xc2, 0xcb, 0x7d, 0xae, 0xa1, 0xaf, 0xa1, 0x91, 0xfe, - 0x3a, 0x83, 0xb0, 0x82, 0x9f, 0xf3, 0xf1, 0xa9, 0xb9, 0x73, 0x2d, 0x86, 0x6b, 0x47, 0x07, 0x50, - 0x0e, 0xbf, 0x5e, 0x20, 0xf5, 0x81, 0x99, 0xfa, 0xfa, 0xd1, 0xd4, 0x33, 0xd7, 0x84, 0x8e, 0x37, - 0xbc, 0x32, 0xaa, 0x9f, 0x35, 0xd0, 0x47, 0xc9, 0xad, 0x33, 0x3e, 0x86, 0x34, 0xef, 0x5e, 0x07, - 0x11, 0x8a, 0xfb, 0x50, 0x4f, 0x3e, 0xce, 0x91, 0x6a, 0x52, 0xe6, 0xe3, 0xbf, 0xb9, 0x7d, 0x0d, - 0x22, 0xd2, 0x9a, 0xdc, 0x0f, 0xed, 0xcc, 0x3d, 0x4a, 0x96, 0xd6, 0x8c, 0x07, 0x3b, 0xce, 0xa1, - 0x5f, 0x01, 0x9a, 0x7d, 0x71, 0xa2, 0x7b, 0xb7, 0x79, 0x1d, 0x37, 0xf1, 0x0d, 0x28, 0xb1, 0xc3, - 0x2f, 0x61, 0x65, 0xe6, 0xad, 0x84, 0xbe, 0xa3, 0x88, 0xce, 0x7b, 0x83, 0x36, 0x3f, 0xba, 0x1e, - 0x14, 0x19, 0x30, 0xfb, 0x64, 0x49, 0x18, 0x30, 0xf7, 0x71, 0x94, 0x30, 0x60, 0xce, 0xbb, 0x47, - 0xe4, 0x5a, 0x38, 0x2a, 0x27, 0x72, 0x2d, 0x35, 0x52, 0x27, 0x72, 0x2d, 0x31, 0x5b, 0xe3, 0x1c, - 0x7a, 0x0a, 0x25, 0xc9, 0x42, 0x9b, 0xb3, 0xb0, 0x50, 0xc3, 0x46, 0xd6, 0x92, 0x50, 0x70, 0x02, - 0x35, 0x75, 0xaa, 0x40, 0xdb, 0x73, 0xdf, 0x5c, 0x42, 0xd5, 0xb5, 0x6f, 0xb2, 0xc8, 0x28, 0xde, - 0x21, 0xd3, 0x46, 0xa9, 0xb3, 0x42, 0xda, 0xa8, 0xb8, 0xa5, 0xe2, 0x1c, 0x1a, 0xf2, 0xef, 0x82, - 0x33, 0x2d, 0x0c, 0xdd, 0x4f, 0xca, 0xcc, 0x6b, 0xa5, 0xcd, 0x7b, 0x37, 0xe2, 0xc4, 0x3e, 0x6d, - 0xa8, 0x44, 0x0d, 0x07, 0x7d, 0xa0, 0x08, 0xa5, 0x9b, 0x5a, 0x73, 0x33, 0x7b, 0x31, 0x8a, 0x81, - 0x6c, 0x2a, 0x89, 0x18, 0x24, 0xdb, 0x51, 0x22, 0x06, 0x6a, 0x0f, 0xc2, 0x39, 0xf4, 0x1c, 0x20, - 0x6e, 0x1c, 0x68, 0x2b, 0xd1, 0xe5, 0x52, 0xad, 0xa7, 0xd9, 0x9c, 0xb3, 0x1a, 0x45, 0x53, 0x6d, - 0x05, 0x89, 0x68, 0x66, 0x34, 0x94, 0xe6, 0xd6, 0xdc, 0xf5, 0xa8, 0x36, 0x24, 0x8b, 0x7e, 0xa2, - 0x36, 0x64, 0xb6, 0x8f, 0x44, 0x6d, 0xc8, 0xe8, 0x18, 0x38, 0x77, 0xf0, 0xf8, 0xaf, 0xef, 0xb7, - 0xb5, 0x7f, 0xbc, 0xdf, 0xd6, 0xfe, 0xf5, 0x7e, 0x5b, 0xfb, 0xe3, 0xbf, 0xb7, 0x73, 0x80, 0x07, - 0xa3, 0xdd, 0x01, 0x71, 0x9d, 0x5d, 0xd3, 0x1e, 0x0f, 0xc8, 0x2e, 0xdd, 0xdb, 0x0d, 0x35, 0xb8, - 0xd3, 0x81, 0x47, 0xdc, 0x0b, 0xe2, 0x7e, 0x9d, 0x9f, 0x9e, 0x9e, 0x2e, 0xf2, 0x7f, 0x72, 0xbe, - 0xf8, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xb4, 0x51, 0xba, 0xac, 0xe3, 0x19, 0x00, 0x00, + 0x15, 0xd7, 0xc8, 0x52, 0x24, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x36, 0x38, 0xde, 0x26, + 0x95, 0x4d, 0x76, 0x17, 0x67, 0xf1, 0x02, 0x9b, 0x0a, 0x0b, 0xc1, 0x96, 0x15, 0x47, 0x10, 0x5b, + 0xa9, 0x91, 0x92, 0x14, 0x5b, 0x45, 0x85, 0xb1, 0xa6, 0x65, 0x69, 0x3d, 0x9a, 0x16, 0x3d, 0x23, + 0x25, 0x39, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xa2, 0x38, 0xf2, 0x3d, 0xb8, 0x50, + 0xc0, 0x37, 0xa0, 0x42, 0x15, 0x27, 0x3e, 0x04, 0xd5, 0x7f, 0x66, 0xa6, 0x67, 0x34, 0x72, 0x5c, + 0xc5, 0x4d, 0xef, 0xf5, 0xaf, 0x5f, 0xf7, 0x7b, 0xbf, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x6b, 0xca, + 0x68, 0x40, 0xfd, 0xfb, 0x74, 0x7f, 0x40, 0xbd, 0x80, 0x51, 0x77, 0x4f, 0x28, 0x50, 0x25, 0x52, + 0xe0, 0x2d, 0xd8, 0x6c, 0xcf, 0x89, 0x17, 0xbc, 0x3a, 0x21, 0x3e, 0xf5, 0x9f, 0x10, 0x9b, 0x05, + 0x67, 0xc4, 0x0e, 0xf0, 0x1a, 0xac, 0xf6, 0x02, 0x3b, 0x98, 0xf9, 0x16, 0xf9, 0xd5, 0x8c, 0xf8, + 0x01, 0x3e, 0x83, 0x6a, 0xa8, 0x98, 0xba, 0x6f, 0xd1, 0x26, 0x14, 0xfd, 0xc0, 0x0e, 0x88, 0x69, + 0xec, 0x1a, 0x77, 0x2b, 0x96, 0x14, 0xd0, 0x8f, 0x60, 0xd5, 0x17, 0xa0, 0xe7, 0x53, 0xc7, 0x0e, + 0x88, 0x6f, 0xe6, 0x77, 0x57, 0xee, 0x56, 0xf7, 0x6f, 0xec, 0xc5, 0x3b, 0xe8, 0x69, 0xe3, 0x56, + 0x12, 0x8d, 0xff, 0x66, 0x40, 0x4d, 0x1f, 0x47, 0x9f, 0x43, 0xd1, 0x25, 0x73, 0xe2, 0x8a, 0x55, + 0xea, 0xfb, 0xdf, 0x5a, 0x62, 0x67, 0xef, 0x29, 0x07, 0x59, 0x12, 0x8b, 0x3a, 0x50, 0x9f, 0x24, + 0x9c, 0x31, 0xf3, 0xbb, 0xc6, 0xdd, 0xea, 0xfe, 0x2d, 0x6d, 0x76, 0x96, 0xcf, 0x4f, 0x72, 0x56, + 0x6a, 0x22, 0xfe, 0x1e, 0x14, 0x85, 0x69, 0x54, 0x81, 0xe2, 0x51, 0xfb, 0xf0, 0xf9, 0x71, 0x23, + 0x87, 0xca, 0x50, 0xe8, 0x9c, 0x3e, 0xee, 0x36, 0x0c, 0x54, 0x85, 0xd2, 0xcb, 0x03, 0xeb, 0xb4, + 0x73, 0x7a, 0xdc, 0xc8, 0x73, 0x44, 0xdb, 0xb2, 0xba, 0x56, 0x63, 0xe5, 0xb0, 0x04, 0x45, 0x61, + 0x1f, 0x6f, 0xc3, 0x8d, 0x63, 0x12, 0x3c, 0x66, 0xf6, 0x84, 0xbc, 0xa6, 0xec, 0xa2, 0xe3, 0x0d, + 0x69, 0x18, 0xce, 0x3f, 0x19, 0x50, 0x7a, 0x41, 0x98, 0x3f, 0xa6, 0x1e, 0x8f, 0xe5, 0xc4, 0xfe, + 0x9a, 0x32, 0xe1, 0x65, 0xd1, 0x92, 0x82, 0xd0, 0x8e, 0x3d, 0xca, 0xc4, 0xee, 0xb9, 0x96, 0x0b, + 0x5c, 0x3b, 0xb5, 0x83, 0xc1, 0xc8, 0x5c, 0x91, 0x5a, 0x21, 0x70, 0xed, 0xd9, 0x6c, 0xec, 0x3a, + 0x66, 0x41, 0xb2, 0x21, 0x04, 0xb4, 0x0b, 0xd5, 0x29, 0xa3, 0xce, 0x6c, 0x10, 0x9c, 0xda, 0x13, + 0x62, 0x16, 0xc5, 0x98, 0xae, 0x42, 0x3b, 0x00, 0x73, 0xb9, 0x89, 0x5e, 0xc0, 0xcc, 0x6b, 0x02, + 0xa0, 0x69, 0xf0, 0x37, 0x79, 0xb8, 0xbe, 0xe8, 0x01, 0xe7, 0x7f, 0x17, 0xaa, 0xc3, 0x48, 0xeb, + 0xa8, 0x2c, 0xd0, 0x55, 0xe8, 0x53, 0x58, 0x27, 0xde, 0x7c, 0xcc, 0xa8, 0x37, 0x21, 0x5e, 0xe0, + 0xb7, 0xe8, 0xcc, 0x0b, 0x94, 0x2f, 0x8b, 0x03, 0x7c, 0x27, 0x81, 0xed, 0x5f, 0x28, 0x98, 0x74, + 0x4e, 0xd3, 0xc4, 0xf9, 0x56, 0xd0, 0xf3, 0x6d, 0x07, 0x60, 0x44, 0xfd, 0xd0, 0x78, 0x51, 0xce, + 0x8a, 0x35, 0x08, 0x43, 0x6d, 0xec, 0xf9, 0x81, 0xed, 0x0d, 0x88, 0x08, 0x81, 0xf4, 0x30, 0xa1, + 0x43, 0x9f, 0x42, 0x49, 0x79, 0x6c, 0x96, 0x44, 0x9e, 0x20, 0x2d, 0x4f, 0x14, 0x45, 0x56, 0x08, + 0xc1, 0xf7, 0x60, 0xad, 0x4f, 0x6c, 0xe6, 0xd0, 0xd7, 0x9e, 0xa2, 0x12, 0x6d, 0xc1, 0x35, 0x46, + 0x6c, 0x9f, 0x7a, 0x2a, 0x0a, 0x4a, 0xe2, 0x47, 0x28, 0x86, 0x4e, 0xdd, 0xb7, 0xd8, 0x84, 0xad, + 0x63, 0x12, 0xb4, 0x35, 0xdf, 0xc3, 0x6c, 0x78, 0x03, 0x9b, 0x0b, 0x23, 0x57, 0x8b, 0xf2, 0x8f, + 0xa1, 0xa6, 0x07, 0x53, 0x1d, 0xb8, 0xa6, 0x9e, 0xea, 0xf1, 0xb0, 0xa0, 0x2f, 0x81, 0xc7, 0xff, + 0x34, 0x60, 0x2d, 0x85, 0x40, 0x75, 0xc8, 0x8f, 0xc3, 0xc5, 0xf2, 0x63, 0x91, 0x47, 0x03, 0x46, + 0xec, 0x80, 0x38, 0x2f, 0x47, 0xc4, 0x13, 0x1c, 0x56, 0x2c, 0x5d, 0x15, 0xb3, 0xb3, 0xa2, 0xb3, + 0xb3, 0x07, 0x45, 0xc1, 0xa0, 0x59, 0x10, 0x9b, 0x32, 0xf5, 0xd3, 0x3b, 0xa2, 0x2c, 0xe8, 0xdb, + 0xbe, 0xcc, 0x28, 0x09, 0x43, 0x4d, 0x28, 0x33, 0x4a, 0x03, 0x8b, 0xba, 0x61, 0xb2, 0x46, 0x32, + 0xfa, 0x18, 0x1a, 0x83, 0x19, 0x63, 0xc4, 0x0b, 0xac, 0x99, 0x77, 0x3a, 0x9b, 0x9c, 0x11, 0x99, + 0xaf, 0xab, 0xd6, 0x82, 0x1e, 0xb7, 0xe0, 0xfa, 0x29, 0x79, 0xad, 0x79, 0x15, 0x32, 0xf5, 0x31, + 0x34, 0x78, 0xd8, 0x86, 0x2e, 0x7d, 0xdd, 0x27, 0x93, 0xa9, 0x1b, 0xd7, 0xaf, 0x05, 0x3d, 0xee, + 0xc1, 0x46, 0xda, 0x08, 0x67, 0xe4, 0x4b, 0xa8, 0x6a, 0xf1, 0x13, 0xb3, 0x2f, 0x0f, 0xb7, 0x0e, + 0xc7, 0x1f, 0x89, 0xe3, 0x94, 0xb1, 0xb3, 0x54, 0xc8, 0xf1, 0x6f, 0x0c, 0xd8, 0x48, 0x23, 0xff, + 0xef, 0xe5, 0xd1, 0x7d, 0x28, 0x87, 0x7e, 0xaa, 0x9a, 0xb8, 0xa1, 0x4d, 0xe5, 0x71, 0x16, 0x73, + 0x22, 0x10, 0xfe, 0xbb, 0x01, 0xdb, 0x2d, 0x39, 0xfc, 0xfe, 0x4d, 0xa3, 0x47, 0x50, 0x08, 0xde, + 0x4e, 0x89, 0x30, 0x5d, 0xdf, 0xff, 0x44, 0x33, 0xbd, 0xd4, 0xc6, 0x5e, 0x77, 0xca, 0xa7, 0x58, + 0x62, 0x22, 0xb6, 0xe1, 0x9a, 0x94, 0x79, 0x91, 0x3d, 0xed, 0x76, 0x9f, 0x35, 0x72, 0x08, 0x41, + 0xbd, 0xd7, 0x3f, 0xb0, 0xfa, 0xaf, 0x0e, 0x5a, 0xfd, 0xce, 0x8b, 0x4e, 0xff, 0xe7, 0x0d, 0x03, + 0xad, 0xc3, 0x6a, 0xaf, 0xdf, 0x7d, 0x16, 0xab, 0xf2, 0x68, 0x15, 0x2a, 0xad, 0xee, 0xe9, 0xe3, + 0xce, 0xf1, 0x73, 0xab, 0xdd, 0x58, 0xe1, 0xd5, 0xd8, 0x6a, 0xf7, 0xda, 0xfd, 0x46, 0x01, 0xd5, + 0xa0, 0x7c, 0xdc, 0x7d, 0x25, 0x6b, 0x73, 0x11, 0x5f, 0xc0, 0x8d, 0xac, 0xcd, 0xf0, 0xd8, 0xa6, + 0xdd, 0x89, 0x92, 0x3a, 0xaf, 0x27, 0x75, 0x56, 0x22, 0xae, 0x2c, 0x49, 0xc4, 0xdf, 0x1b, 0x60, + 0x9e, 0x50, 0x67, 0x3c, 0x7c, 0x7b, 0xa5, 0xe8, 0x01, 0x9d, 0x12, 0x66, 0x07, 0x63, 0xea, 0x85, + 0xe7, 0xf8, 0x56, 0x36, 0xb3, 0xdd, 0x10, 0x67, 0x69, 0x53, 0xd0, 0x1d, 0xa8, 0x33, 0x32, 0xa0, + 0xde, 0x70, 0x7c, 0x3e, 0x63, 0xe4, 0xc0, 0x75, 0xc5, 0xbe, 0xca, 0x56, 0x4a, 0x8b, 0xff, 0x68, + 0xc0, 0x66, 0x96, 0x31, 0xf4, 0x50, 0xf1, 0x27, 0x9b, 0xed, 0x9d, 0xf7, 0xac, 0x9d, 0xa0, 0x4e, + 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x7c, 0x78, 0x76, 0xa5, 0x8c, 0xbf, 0x9b, 0x41, 0xeb, 0x1a, 0x54, + 0xad, 0xf6, 0x49, 0xf7, 0x45, 0xfb, 0x95, 0xd5, 0x7d, 0xca, 0x19, 0xab, 0x41, 0xf9, 0xe0, 0xe8, + 0x48, 0x4a, 0x05, 0xfc, 0x5b, 0x03, 0xb6, 0x32, 0x22, 0xc7, 0x69, 0xfa, 0x19, 0x34, 0x86, 0xf6, + 0xd8, 0x25, 0x4e, 0x37, 0x8e, 0x96, 0x71, 0xb5, 0x68, 0x2d, 0x4c, 0x54, 0x24, 0xe4, 0x17, 0x39, + 0xd7, 0x0b, 0x19, 0xee, 0xc0, 0xf6, 0x11, 0xf1, 0x03, 0x46, 0xaf, 0xc2, 0xe3, 0x4d, 0xa8, 0x5c, + 0x10, 0x32, 0xed, 0x8b, 0xca, 0x97, 0x17, 0x0c, 0xc4, 0x0a, 0x4c, 0xe0, 0x46, 0x96, 0x29, 0xee, + 0xd8, 0x4f, 0x61, 0x7d, 0xe0, 0x12, 0xdb, 0x9b, 0x49, 0xa8, 0x50, 0xaa, 0x13, 0x7e, 0x53, 0x3f, + 0x4b, 0x69, 0x8c, 0xb5, 0x38, 0x0d, 0xff, 0xc7, 0x80, 0xd5, 0x44, 0x8d, 0x45, 0x08, 0x0a, 0x1e, + 0x27, 0x47, 0x6e, 0x54, 0xfc, 0xe6, 0x9d, 0xcb, 0xa5, 0x83, 0x0b, 0xe2, 0xa8, 0x7d, 0x2a, 0x89, + 0xeb, 0x79, 0x45, 0xee, 0x38, 0x2a, 0x0c, 0x4a, 0xe2, 0x7a, 0x79, 0x61, 0x53, 0x5d, 0x58, 0x49, + 0x71, 0xd4, 0x8a, 0xfa, 0x49, 0xb9, 0x09, 0x95, 0x81, 0x6b, 0xfb, 0xbe, 0xd6, 0x79, 0x63, 0x05, + 0x6a, 0x43, 0xdd, 0x21, 0x53, 0x97, 0xbe, 0x0d, 0x4b, 0x95, 0xea, 0xbe, 0xfa, 0x1d, 0x8f, 0x6f, + 0xfe, 0x28, 0x01, 0xb2, 0x52, 0x93, 0x78, 0xa1, 0x44, 0x8b, 0x30, 0x9e, 0x8e, 0xfc, 0x1a, 0xa0, + 0x79, 0x1c, 0xc9, 0xc8, 0x84, 0x92, 0x7d, 0xce, 0x81, 0x21, 0xf1, 0xa1, 0xc8, 0x47, 0xe8, 0x70, + 0x48, 0x58, 0xe4, 0x78, 0x28, 0xf2, 0x8b, 0x06, 0x79, 0x43, 0x06, 0xb3, 0x80, 0xf2, 0x41, 0xe9, + 0xbd, 0xa6, 0xc1, 0xeb, 0xb0, 0x76, 0x4c, 0x02, 0x45, 0x80, 0xec, 0xe9, 0x8f, 0x60, 0x35, 0x56, + 0x71, 0x7e, 0xa3, 0x76, 0x68, 0x5c, 0xa9, 0x1d, 0xe2, 0xbb, 0x50, 0x57, 0x06, 0xb4, 0x9b, 0x86, + 0xe2, 0xc5, 0xd0, 0x79, 0xc1, 0x5f, 0x40, 0x2d, 0x42, 0xf2, 0x95, 0x3e, 0x82, 0x02, 0x1f, 0x51, + 0xc9, 0xb3, 0x91, 0x8a, 0xa8, 0x58, 0x43, 0x00, 0x70, 0x1b, 0x56, 0xb9, 0xa6, 0xc5, 0x59, 0x59, + 0x9a, 0x25, 0xbc, 0xfd, 0xcb, 0xe9, 0x27, 0xd4, 0x21, 0x51, 0xfb, 0x8f, 0x55, 0xf8, 0xd7, 0x50, + 0x6d, 0xd1, 0xc9, 0xc4, 0xf6, 0x1c, 0x61, 0xa4, 0x01, 0x2b, 0xc4, 0x9b, 0x0b, 0x37, 0x2b, 0x16, + 0xff, 0x29, 0x12, 0x64, 0x44, 0x5c, 0x57, 0xe5, 0x99, 0x14, 0xb8, 0x76, 0x6e, 0xbb, 0xb3, 0xe8, + 0xb0, 0x09, 0x81, 0xa7, 0x8d, 0xcd, 0xce, 0x67, 0xf2, 0x3a, 0x53, 0x10, 0x36, 0x62, 0x05, 0xdf, + 0xe0, 0xcc, 0x27, 0x4c, 0x65, 0x9a, 0xf8, 0x8d, 0x4f, 0xa0, 0xda, 0x1a, 0xd9, 0x9e, 0x47, 0xdc, + 0xa5, 0x3e, 0x20, 0xad, 0x35, 0x55, 0x54, 0xc9, 0x12, 0xd1, 0x64, 0xe7, 0x24, 0x88, 0xb3, 0x9c, + 0x4b, 0xf8, 0xbf, 0x79, 0x28, 0x47, 0xc7, 0xe6, 0x07, 0x50, 0xf1, 0x39, 0x39, 0x22, 0x43, 0x65, + 0x3c, 0x97, 0x13, 0x17, 0x43, 0xf9, 0xbc, 0x41, 0x18, 0x55, 0xd5, 0x6b, 0xcd, 0x14, 0x0f, 0x51, + 0xd4, 0xad, 0x18, 0x8a, 0x7e, 0x02, 0x6b, 0x63, 0xef, 0x8c, 0xce, 0x3c, 0x47, 0xb9, 0xe4, 0x9b, + 0x2b, 0x22, 0x5d, 0xb6, 0xf4, 0x12, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x10, 0x1a, 0x74, 0x16, + 0x24, 0x4d, 0x14, 0x2e, 0x35, 0xb1, 0x80, 0x47, 0x0f, 0x38, 0xe5, 0x11, 0xa1, 0x22, 0xd8, 0xa9, + 0xe9, 0xf1, 0xa8, 0xa5, 0x43, 0xf9, 0xc1, 0xe3, 0x99, 0xf5, 0xcc, 0x0e, 0x46, 0xea, 0xcc, 0x47, + 0x32, 0xe7, 0x9b, 0x78, 0xf3, 0x8e, 0x23, 0x4e, 0x7a, 0xc5, 0x92, 0x02, 0xbe, 0x0f, 0x1b, 0xc9, + 0x92, 0x26, 0x73, 0xdd, 0x84, 0x92, 0xcc, 0x6e, 0x5f, 0x25, 0x52, 0x28, 0xe2, 0xdf, 0x19, 0xb0, + 0xbe, 0x50, 0x04, 0xd1, 0x43, 0xa8, 0x5e, 0x8c, 0x5d, 0x97, 0x38, 0xfd, 0x2b, 0x9d, 0x31, 0x1d, + 0x8c, 0xbe, 0x84, 0x1a, 0x9b, 0x79, 0xde, 0xd8, 0x3b, 0x0f, 0xab, 0xf6, 0xe5, 0x93, 0x13, 0x68, + 0xdc, 0x12, 0x67, 0x9f, 0xdf, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x53, + 0x3b, 0x18, 0xf5, 0xa6, 0x64, 0x10, 0xf6, 0xc8, 0x50, 0xc6, 0x7f, 0x31, 0xa0, 0x1c, 0x5e, 0xc0, + 0x96, 0xd5, 0x6a, 0x55, 0x7b, 0xf3, 0xd9, 0xb5, 0x37, 0x71, 0xf5, 0x6e, 0x42, 0x79, 0x38, 0x73, + 0x5d, 0x41, 0x83, 0xac, 0x56, 0x91, 0xac, 0x47, 0xb6, 0x98, 0x88, 0x2c, 0xba, 0x07, 0x45, 0xde, + 0xb4, 0x7d, 0xf3, 0x9a, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x43, 0x51, 0xdd, 0x94, 0xd3, + 0x3c, 0xfe, 0xd1, 0x5c, 0xe3, 0xbd, 0x73, 0xff, 0x6c, 0xc0, 0x07, 0xc7, 0x24, 0x78, 0x99, 0xba, + 0x72, 0x47, 0xd1, 0xdb, 0x85, 0x2a, 0x23, 0x53, 0xfa, 0xcc, 0x0e, 0x02, 0xc2, 0xc2, 0x57, 0x95, + 0xae, 0x42, 0x77, 0x61, 0x8d, 0x91, 0xf9, 0x98, 0xbf, 0xc8, 0x42, 0x94, 0x8c, 0x4a, 0x5a, 0xcd, + 0x6d, 0xd9, 0xae, 0x7b, 0xc8, 0x6c, 0x6f, 0x30, 0x22, 0xbe, 0xba, 0x11, 0xe9, 0x2a, 0xd1, 0x0e, + 0x5c, 0xb7, 0x6f, 0x9f, 0xcb, 0xae, 0x56, 0xb6, 0x42, 0x11, 0x9f, 0xc1, 0x66, 0x7a, 0x8f, 0x21, + 0x3d, 0x7c, 0x33, 0x21, 0x3d, 0xfc, 0xb7, 0xc8, 0xfb, 0xf0, 0x49, 0xa1, 0xb8, 0x0d, 0x65, 0x71, + 0x37, 0x52, 0xdb, 0x52, 0x2c, 0x45, 0x32, 0xfe, 0x1a, 0xb6, 0xb3, 0x43, 0xc1, 0x63, 0x7a, 0x02, + 0xeb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0x6b, 0x93, 0xd6, 0xe2, 0x4c, 0x8c, 0xa0, 0xf1, 0x74, + 0xec, 0xf3, 0xdb, 0x06, 0x8d, 0xba, 0xd4, 0x03, 0x28, 0x73, 0x79, 0x69, 0xda, 0x99, 0x50, 0x72, + 0xc8, 0xd0, 0x9e, 0xb9, 0x81, 0xaa, 0xdd, 0xa1, 0x88, 0x7f, 0x08, 0x75, 0xcd, 0x5a, 0x98, 0x02, + 0x5c, 0xca, 0x4a, 0x01, 0xb5, 0x86, 0x25, 0x11, 0xf8, 0x36, 0xd4, 0x0f, 0x1c, 0x87, 0x6b, 0x43, + 0xd2, 0x33, 0x16, 0xc7, 0x9f, 0x41, 0x2d, 0x42, 0xa9, 0xe7, 0x30, 0x61, 0x8c, 0xb2, 0x5e, 0xc0, + 0xc6, 0xde, 0x79, 0x98, 0x18, 0x9a, 0x0a, 0xdf, 0x83, 0x75, 0x8b, 0x4c, 0xe8, 0x9c, 0xe8, 0xa6, + 0x37, 0xa1, 0x38, 0xf6, 0x1c, 0xf2, 0x26, 0xfc, 0xbe, 0x22, 0x04, 0xdc, 0x81, 0x35, 0x1d, 0xaa, + 0x5e, 0x00, 0x54, 0x76, 0xcd, 0xb2, 0x95, 0xa7, 0x17, 0xfc, 0x46, 0xed, 0x91, 0xd7, 0x47, 0xd2, + 0x61, 0x0e, 0x53, 0xd4, 0xa6, 0xb4, 0xf8, 0x13, 0xd8, 0xb0, 0xc8, 0x90, 0x11, 0x7f, 0xa4, 0xc7, + 0x76, 0xc9, 0xba, 0xdf, 0xe7, 0x5b, 0xd4, 0xc1, 0x57, 0xf3, 0xec, 0x3b, 0x70, 0xbd, 0x47, 0x02, + 0x6d, 0xd5, 0xcb, 0x57, 0xf9, 0x02, 0x36, 0xd2, 0xf0, 0x2b, 0xad, 0xb3, 0xff, 0x4d, 0x0d, 0x4a, + 0xea, 0x85, 0x84, 0x5a, 0x50, 0xed, 0x33, 0x7b, 0x70, 0x21, 0xbf, 0xb5, 0x21, 0x73, 0xe1, 0xf3, + 0x9b, 0xda, 0x43, 0x73, 0x2b, 0x63, 0x84, 0x5f, 0x43, 0x73, 0x9f, 0x19, 0xe8, 0x2b, 0x68, 0xa4, + 0x3f, 0x21, 0x21, 0xac, 0xe1, 0x97, 0x7c, 0x21, 0x6b, 0xee, 0x5e, 0x8a, 0x11, 0xd6, 0xd1, 0x21, + 0x94, 0xc3, 0x4f, 0x2c, 0x48, 0x7f, 0x05, 0xa7, 0x3e, 0xd1, 0x34, 0xcd, 0xcc, 0x31, 0x69, 0xe3, + 0xa5, 0x28, 0xdf, 0xfa, 0xb7, 0x17, 0xf4, 0x61, 0x72, 0xe9, 0x8c, 0x2f, 0x36, 0xcd, 0x5b, 0x97, + 0x41, 0xa4, 0xe1, 0x3e, 0xd4, 0x93, 0x5f, 0x10, 0x90, 0xee, 0x52, 0xe6, 0x17, 0x8a, 0xe6, 0xce, + 0x25, 0x88, 0xc8, 0x6a, 0x72, 0x3d, 0xb4, 0xbb, 0x74, 0x2b, 0x59, 0x56, 0x33, 0xbe, 0x2a, 0xe0, + 0x1c, 0xfa, 0x25, 0xa0, 0xc5, 0x67, 0x31, 0xba, 0x7d, 0x95, 0x27, 0x7c, 0x13, 0xbf, 0x07, 0x25, + 0x57, 0xf8, 0x05, 0xac, 0x2f, 0x3c, 0xe8, 0xd0, 0xb7, 0xb5, 0xa9, 0xcb, 0x1e, 0xca, 0xcd, 0x0f, + 0x2f, 0x07, 0x45, 0x0e, 0x2c, 0xbe, 0xab, 0x12, 0x0e, 0x2c, 0x7d, 0xc1, 0x25, 0x1c, 0x58, 0xf2, + 0x38, 0x93, 0xb9, 0x16, 0xde, 0xe7, 0x13, 0xb9, 0x96, 0xba, 0xf7, 0x27, 0x72, 0x2d, 0xf1, 0x00, + 0xc0, 0x39, 0xf4, 0x08, 0x4a, 0x4a, 0x85, 0xb6, 0x17, 0x61, 0xa1, 0x85, 0x1b, 0x59, 0x43, 0xd2, + 0xc0, 0x29, 0xd4, 0xf4, 0xab, 0x0f, 0xda, 0x59, 0xfa, 0x30, 0x94, 0xa6, 0x2e, 0x7d, 0x38, 0x46, + 0x4e, 0x89, 0x36, 0x9e, 0x76, 0x4a, 0xbf, 0xd0, 0xa4, 0x9d, 0x8a, 0xfb, 0x3e, 0xce, 0xa1, 0xa1, + 0xf8, 0x78, 0xb9, 0xd0, 0xc2, 0xd0, 0x9d, 0xe4, 0x9c, 0x65, 0xed, 0xbe, 0x79, 0xfb, 0xbd, 0x38, + 0xb9, 0x4e, 0x1b, 0x2a, 0x51, 0xc3, 0x41, 0x1f, 0x68, 0x93, 0xd2, 0x4d, 0xad, 0xb9, 0x9d, 0x3d, + 0x18, 0x71, 0xa0, 0x9a, 0x4a, 0x82, 0x83, 0x64, 0x3b, 0x4a, 0x70, 0xa0, 0xf7, 0x20, 0x9c, 0x43, + 0x4f, 0x00, 0xe2, 0xc6, 0x81, 0x6e, 0x26, 0xba, 0x5c, 0xaa, 0xf5, 0x34, 0x9b, 0x4b, 0x46, 0x23, + 0x36, 0xf5, 0x56, 0x90, 0x60, 0x33, 0xa3, 0xa1, 0x34, 0x6f, 0x2e, 0x1d, 0x8f, 0x6a, 0x43, 0xb2, + 0xe8, 0x27, 0x6a, 0x43, 0x66, 0xfb, 0x48, 0xd4, 0x86, 0x8c, 0x8e, 0x81, 0x73, 0x87, 0x0f, 0xfe, + 0xfa, 0x6e, 0xc7, 0xf8, 0xc7, 0xbb, 0x1d, 0xe3, 0x5f, 0xef, 0x76, 0x8c, 0x3f, 0xfc, 0x7b, 0x27, + 0x07, 0x78, 0x30, 0xda, 0x1b, 0x10, 0xe6, 0xed, 0xd9, 0xee, 0x78, 0x40, 0xf6, 0xe8, 0xfe, 0x5e, + 0x68, 0x81, 0x4d, 0x07, 0x3e, 0x61, 0x73, 0xc2, 0xbe, 0xca, 0x4f, 0xcf, 0xce, 0xae, 0x89, 0xbf, + 0x9b, 0x3e, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x63, 0x43, 0xc7, 0x88, 0x1a, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3491,68 +3581,6 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} - func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3992,7 +4020,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4000,26 +4028,20 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4027,26 +4049,20 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4054,47 +4070,38 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.StatusUpdates { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4102,61 +4109,46 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) } if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } + nn1, err1 := m.Event.MarshalTo(dAtA[i:]) + if err1 != nil { + return 0, err1 } + i += nn1 } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + i := 0 if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) + n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) + if err2 != nil { + return 0, err2 + } + i += n2 } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4164,26 +4156,20 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4191,62 +4177,53 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if m.Minor != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + if m.Patch != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) } if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i += copy(dAtA[i:], m.Build) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + if len(m.ProductName) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i += copy(dAtA[i:], m.ProductName) } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if len(m.VersionStr) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i += copy(dAtA[i:], m.VersionStr) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4254,74 +4231,63 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 + if m.EnvironmentsCount != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + if m.TasksCount != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if m.HostsCount != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + if len(m.InstanceName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i += copy(dAtA[i:], m.InstanceName) } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.Version != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) + n3, err3 := m.Version.MarshalTo(dAtA[i:]) + if err3 != nil { + return 0, err3 + } + i += n3 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4329,33 +4295,26 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4363,26 +4322,20 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4390,26 +4343,20 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4417,47 +4364,38 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Environments { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4465,73 +4403,61 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 + if len(m.CreatedWhen) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i += copy(dAtA[i:], m.CreatedWhen) } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.RootRole) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i += copy(dAtA[i:], m.RootRole) } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4539,33 +4465,26 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i += copy(dAtA[i:], m.WorkflowTemplate) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4573,38 +4492,30 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n4, err4 := m.Environment.MarshalTo(dAtA[i:]) + if err4 != nil { + return 0, err4 + } + i += n4 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4612,33 +4523,26 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4646,50 +4550,40 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n5, err5 := m.Environment.MarshalTo(dAtA[i:]) + if err5 != nil { + return 0, err5 + } + i += n5 } if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) + n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) + if err6 != nil { + return 0, err6 } - i-- - dAtA[i] = 0xa + i += n6 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4697,38 +4591,31 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4736,45 +4623,37 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4782,57 +4661,48 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.Operations) > 0 { + for _, msg := range m.Operations { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if m.ReconfigureAll { - i-- + dAtA[i] = 0x18 + i++ if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4840,38 +4710,31 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) + i += copy(dAtA[i:], m.RoleName) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4879,54 +4742,44 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.FailedOperations) > 0 { + for _, msg := range m.FailedOperations { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4934,43 +4787,36 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.KeepTasks { - i-- + dAtA[i] = 0x10 + i++ if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4978,38 +4824,30 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) + n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) + if err7 != nil { + return 0, err7 + } + i += n7 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5017,83 +4855,70 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Locked { + dAtA[i] = 0x10 + i++ + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 + i++ } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a + if len(m.TaskId) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a + if len(m.State) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.ClassName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i += copy(dAtA[i:], m.ClassName) + } + if m.DeploymentInfo != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) + n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) + if err8 != nil { + return 0, err8 } - i-- - dAtA[i] = 0x10 + i += n8 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5101,54 +4926,44 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 + if len(m.AgentId) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i += copy(dAtA[i:], m.AgentId) } if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i += copy(dAtA[i:], m.OfferId) } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 + if len(m.ExecutorId) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i += copy(dAtA[i:], m.ExecutorId) } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5156,26 +4971,20 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5183,40 +4992,32 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5224,33 +5025,26 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5258,38 +5052,30 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) + n9, err9 := m.Task.MarshalTo(dAtA[i:]) + if err9 != nil { + return 0, err9 + } + i += n9 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5297,40 +5083,32 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i += copy(dAtA[i:], m.ControlMode) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5338,68 +5116,72 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 + if len(m.Env) > 0 { + for _, s := range m.Env { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } if m.Shell { - i-- + dAtA[i] = 0x10 + i++ if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa + if len(m.Value) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if len(m.User) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5407,47 +5189,38 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.Target) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5455,104 +5228,86 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.ShortInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) + n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) + if err10 != nil { + return 0, err10 } - i-- - dAtA[i] = 0x2a + i += n10 } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 + if m.ClassInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) + n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) + if err11 != nil { + return 0, err11 } + i += n11 } if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.InboundChannels { dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if len(m.OutboundChannels) > 0 { + for _, msg := range m.OutboundChannels { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0xa } - return len(dAtA) - i, nil + if m.CommandInfo != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) + n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) + if err12 != nil { + return 0, err12 + } + i += n12 + } + if len(m.TaskPath) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i += copy(dAtA[i:], m.TaskPath) + } + if len(m.EnvId) > 0 { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5560,35 +5315,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- + for _, s := range m.TaskIds { dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5596,54 +5351,44 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.KilledTasks) > 0 { + for _, msg := range m.KilledTasks { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i += n } } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.RunningTasks) > 0 { + for _, msg := range m.RunningTasks { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5651,40 +5396,32 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) } if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i += copy(dAtA[i:], m.PathSpec) } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5692,77 +5429,71 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } + if len(m.Status) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i += copy(dAtA[i:], m.FullPath) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 + if len(m.Roles) > 0 { + for _, msg := range m.Roles { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5770,40 +5501,32 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Roles { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5811,26 +5534,52 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l + if len(m.RepoPattern) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i += copy(dAtA[i:], m.RepoPattern) + } + if len(m.RevisionPattern) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i += copy(dAtA[i:], m.RevisionPattern) + } + if m.AllBranches { + dAtA[i] = 0x18 + i++ + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } + if m.AllTags { + dAtA[i] = 0x20 + i++ + if m.AllTags { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5838,40 +5587,38 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repo) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i += copy(dAtA[i:], m.Repo) } if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i += copy(dAtA[i:], m.Template) } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa + if len(m.Revision) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5879,40 +5626,32 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + for _, msg := range m.WorkflowTemplates { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5920,26 +5659,20 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5947,43 +5680,36 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if m.Default { - i-- + dAtA[i] = 0x10 + i++ if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5991,40 +5717,32 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Repos { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6032,33 +5750,26 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6066,33 +5777,26 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6100,31 +5804,25 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6132,43 +5830,36 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0x12 - } if m.Ok { - i-- + dAtA[i] = 0x8 + i++ if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x8 + i++ } - return len(dAtA) - i, nil + if len(m.NewDefaultRepo) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i += copy(dAtA[i:], m.NewDefaultRepo) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6176,31 +5867,25 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6208,33 +5893,26 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6242,31 +5920,25 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6274,39 +5946,30 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) + i += copy(dAtA[i:], m.ErrorString) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7158,6 +6821,20 @@ func (m *GetWorkflowTemplatesRequest) Size() (n int) { } var l int _ = l + l = len(m.RepoPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.RevisionPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.AllBranches { + n += 2 + } + if m.AllTags { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7178,6 +6855,10 @@ func (m *WorkflowTemplateInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7380,7 +7061,14 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -12222,6 +11910,110 @@ func (m *GetWorkflowTemplatesRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RepoPattern = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RevisionPattern = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllBranches = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllTags = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12340,6 +12132,38 @@ func (m *WorkflowTemplateInfo) Unmarshal(dAtA []byte) error { } m.Template = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Revision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index af592559f..85a1427fc 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -276,11 +276,17 @@ message GetRolesReply { repeated RoleInfo roles = 1; } -message GetWorkflowTemplatesRequest{} +message GetWorkflowTemplatesRequest{ + string repoPattern = 1; + string revisionPattern = 2; + bool allBranches = 3; + bool allTags = 4; +} message WorkflowTemplateInfo { string repo = 1; string template = 2; + string revision = 3; } message GetWorkflowTemplatesReply{ diff --git a/core/repos/repo.go b/core/repos/repo.go index cab855908..1271a7567 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,6 +26,7 @@ package repos import ( "errors" + "github.com/gobwas/glob" "github.com/spf13/viper" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" @@ -187,16 +188,91 @@ func (r *Repo) refresh() error { return nil } -func (r *Repo) getWorkflows() ([]string, error) { - var workflows []string - files, err := ioutil.ReadDir(r.getWorkflowDir()) +// Returns a map of revision->[]templates for the repo +func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string) (TemplatesByRevision, error) { + // Get a list of revisions (branches/tags/hash) that are matched by the revisionPattern; gitRefs filter branches and/or tags + revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) if err != nil { - return workflows, err + return nil, err } - for _, file := range files { - if strings.HasSuffix(file.Name(), ".yaml") { // Only return .yaml files - workflows = append(workflows, strings.TrimSuffix(file.Name(), ".yaml")) + + templates := make(TemplatesByRevision) + for _, revision := range revisionsMatched { + + // Checkout the revision + err := r.checkoutRevision(revision) + if err != nil { + return nil, err + } + + // Go through the filesystem to locate available templates + files, err := ioutil.ReadDir(r.getWorkflowDir()) + if err != nil { + return templates, err + } + for _, file := range files { + if strings.HasSuffix(file.Name(), ".yaml") { // Only return .yaml files + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template(strings.TrimSuffix(file.Name(), ".yaml"))) + } } } - return workflows, nil + return templates, nil +} + +func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { + var revisions []string + + // get a handle of the repo for go-git + ref, err := git.PlainOpen(r.getCloneDir()) + if err != nil { + return nil, errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + // Check if the revision pattern is actually a hash. If so return a single revision + hashMaybe := plumbing.NewHash(revisionPattern) + resolvedHash, err := ref.ResolveRevision(plumbing.Revision(revisionPattern)) + if err == nil && *resolvedHash == hashMaybe { + revisions := append(revisions, resolvedHash.String()) + return revisions, nil + } + + // If not get a list of git references and loop through them to try and find a match + refs, err := ref.References() + if err != nil { + return nil, errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + // Function that uses the go-git interface for iterating through the references and will populate the revisions slice + err = refs.ForEach(func(ref *plumbing.Reference) error { + if ref.Type() == plumbing.SymbolicReference { // go-git docs suggests this to skip HEAD, but HEAD makes it anyway + return nil + } + + refString := ref.Name().String() + g := glob.MustCompile(revisionPattern) + + // Function to check the prefix of a git reference to filter branches and/or tags + resolveRef := func(refString, prefix string) (string, bool) { + if strings.HasPrefix(refString, prefix) { + return strings.Split(refString, prefix)[1], true + } + return refString, false + } + + // Loop through the desirable reference prefixes {/refs/tags, refs/remotes/origin} and look for a match + for _, refPrefix := range refPrefixes { + if resolvedRefString, ok := resolveRef(refString, refPrefix); ok { + // In case of a match check the resolved reference string (stripped of the /refs/* prefix) + // against the revision pattern provided + if g.Match(resolvedRefString) { + revisions = append(revisions, resolvedRefString) + break + } + } + } + + return nil + }) + + return revisions, nil } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 3a5d9b098..efff04c2d 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -29,6 +29,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/confsys" + "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" "gopkg.in/src-d/go-git.v4" @@ -36,10 +37,17 @@ import ( "os" "path/filepath" "sort" + "strconv" "strings" "sync" ) +const ( + refPrefix = "refs/" + refTagPrefix = refPrefix + "tags/" + refRemotePrefix = refPrefix + "remotes/origin/" +) + var log = logger.New(logrus.StandardLogger(),"repos") var ( @@ -192,43 +200,73 @@ func cleanCloneParentDirs(parentDirs []string) error { return nil } -func (manager *RepoManager) GetRepos() (repoList map[string]*Repo) { +func (manager *RepoManager) GetAllRepos() (repoList map[string]*Repo) { manager.mutex.Lock() defer manager.mutex.Unlock() return manager.repoList } -func (manager *RepoManager) RemoveRepoByIndex(index int) (ok bool, newDefaultRepo string) { +func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]*Repo) { manager.mutex.Lock() defer manager.mutex.Unlock() + if repoPattern == "*" { // Skip unnecessary pattern matching + return manager.repoList + } + + matchedRepoList := make(map[string]*Repo) + g := glob.MustCompile(repoPattern) + + for _, repo := range manager.repoList { + if g.Match(repo.GetIdentifier()) { + matchedRepoList[repo.GetIdentifier()] = repo + } + } + + return matchedRepoList +} + +func (manager *RepoManager) getRepoByIndex(index int) (*Repo, error) { keys := manager.GetOrderedRepolistKeys() + if len(keys) - 1 >= index { // Verify that index is not out of bounds + return manager.repoList[keys[index]], nil + } else { + return nil, errors.New("getRepoByIndex: repo not found for index :" + strconv.Itoa(index)) + } +} - for i, repoName := range keys { - if i != index { - continue +func (manager *RepoManager) RemoveRepoByIndex(index int) (bool, string) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + + newDefaultRepoString := "" + + repo, err := manager.getRepoByIndex(index) + if err != nil { + return false, "" + } + + wasDefault := repo.Default + + _ = os.RemoveAll(repo.getCloneDir()) // Try, but don't crash if we fail + + delete(manager.repoList, repo.GetIdentifier()) + // Set as default the repo sitting on top of the list + if wasDefault && len(manager.repoList) > 0 { + newDefaultRepo, err := manager.getRepoByIndex(0) + if err != nil { + return false, newDefaultRepoString } - wasDefault := manager.repoList[repoName].Default - - _ = os.RemoveAll(manager.repoList[repoName].getCloneDir()) // Try, but don't crash if we fail - - delete(manager.repoList, repoName) - // Set as default the repo sitting on top of the list - if wasDefault && len(manager.repoList) > 0 { - manager.setDefaultRepo(manager.repoList[manager.GetOrderedRepolistKeys()[0]]) //Keys have to be reparsed since there was a removal - keys = manager.GetOrderedRepolistKeys() //Update keys after deletion - newDefaultRepo = keys[0] - } else if len(manager.repoList) == 0 { - err := manager.cService.NewDefaultRepo(viper.GetString("defaultRepo")) - if err != nil { - log.Warning("Failed to update default_repo backend") - } + manager.setDefaultRepo(newDefaultRepo) + newDefaultRepoString = newDefaultRepo.GetIdentifier() + } else if len(manager.repoList) == 0 { + err := manager.cService.NewDefaultRepo(viper.GetString("defaultRepo")) + if err != nil { + log.Warning("Failed to update default_repo backend") } - return true, newDefaultRepo } - - return false, newDefaultRepo + return true, newDefaultRepoString } func (manager *RepoManager) RefreshRepos() error { @@ -261,17 +299,12 @@ func (manager *RepoManager) RefreshRepoByIndex(index int) error { manager.mutex.Lock() defer manager.mutex.Unlock() - keys := manager.GetOrderedRepolistKeys() - - for i, repoName := range keys { - if i != index { - continue - } - repo := manager.repoList[repoName] - return repo.refresh() + repo, err := manager.getRepoByIndex(index) + if err != nil { + return err } - return errors.New("RefreshRepoByIndex: repo not found for index: " + string(index)) + return repo.refresh() } func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowPath string, workflowRepo *Repo, err error) { @@ -408,18 +441,65 @@ func (manager *RepoManager) GetOrderedRepolistKeys() []string { return keys } -func (manager *RepoManager) GetWorkflowTemplates() (map[string][]string, int, error) { - templateList := make(map[string][]string) +type RepoKey string +type RevisionKey string +type Template string +type Templates []Template +type TemplatesByRevision map[RevisionKey]Templates +type TemplatesByRepo map[RepoKey]TemplatesByRevision + +// Returns a map of templates: repo -> revision -> []templates +func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool) (TemplatesByRepo, int, error) { + templateList := make(TemplatesByRepo) numTemplates := 0 - for _, repo := range manager.GetRepos() { - templates, err := repo.getWorkflows() + + if repoPattern == "" { + repoPattern = "*" + } + + if revisionPattern == "" { + revisionPattern = "master" + } + + // Prepare the gitRefs slice which will filter the git references + var gitRefs []string + if !allBranches && !allTags { + gitRefs = append(gitRefs, refRemotePrefix, refTagPrefix) + } else { + if allBranches { + gitRefs = append(gitRefs, refRemotePrefix) + } + + if allTags { + gitRefs = append(gitRefs, refTagPrefix) + } + } + + // Build list of repos to iterate through by pattern or by index(single repo, if pattern is an int) + repos := make(map[string]*Repo) + if repoIndex, err := strconv.Atoi(repoPattern); err == nil { + repo, err := manager.getRepoByIndex(repoIndex) if err != nil { return nil, 0, err } - templateList[repo.GetIdentifier()] = templates - numTemplates += len(templates) + repos[repo.GetIdentifier()] = repo + } else { + repos = manager.getRepos(repoPattern) + } + + for _, repo := range repos { + // For every repo get the templates for the revisions matching the revisionPattern; gitRefs to filter tags and/or branches + templates, err := repo.getWorkflows(revisionPattern, gitRefs) + if err != nil { + return nil, 0, err + } + templateList[RepoKey(repo.GetIdentifier())] = templates + + for _, revTemplate := range templates { + numTemplates += len(revTemplate) // numTemplates is needed for protobuf to know the number of messages to go through + } } return templateList, numTemplates, nil -} \ No newline at end of file +} diff --git a/core/server.go b/core/server.go index bd984d8c3..b7b6c768c 100644 --- a/core/server.go +++ b/core/server.go @@ -485,17 +485,24 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo m.state.RLock() defer m.state.RUnlock() - workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates() + if req == nil { + return nil, status.New(codes.InvalidArgument, "received nil request").Err() + } + + workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags()) if err != nil { - return nil, status.New(codes.FailedPrecondition, "cannot query available workflows").Err() + return nil, status.New(codes.InvalidArgument, "cannot query available workflows for " + req.GetRepoPattern() + "@" + req.GetRevisionPattern() + ": " + + err.Error()).Err() } workflowTemplateInfos := make([]*pb.WorkflowTemplateInfo, numWorkflows) i := 0 - for repo, templates := range workflowMap { - for _, template := range templates { - workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{Repo: repo, Template: template} - i++ + for repo, revisions := range workflowMap { + for revision, templates := range revisions { + for _, template := range templates { + workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{Repo: string(repo), Revision: string(revision), Template: string(template)} + i++ + } } } @@ -509,7 +516,7 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - repoList := the.RepoManager().GetRepos() + repoList := the.RepoManager().GetAllRepos() repoInfos := make([]*pb.RepoInfo, len(repoList)) // Ensure alphabetical order of repos in output diff --git a/core/task/manager.go b/core/task/manager.go index 17b80b58d..086256763 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -125,7 +125,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, if err != nil { return } - repo = repoManager.GetRepos()[repo.GetIdentifier()] //get repo pointer from repomanager + repo = repoManager.GetAllRepos()[repo.GetIdentifier()] //get repo pointer from repomanager if repo == nil { //should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 5f74bc308..cf6413bca 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StateChangeTrigger int32 @@ -124,7 +121,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -165,7 +162,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -218,7 +215,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -258,7 +255,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -305,7 +302,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -351,7 +348,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -391,7 +388,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -439,7 +436,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -495,7 +492,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -559,7 +556,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -786,23 +783,6 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } -// UnimplementedOccServer can be embedded to have forward compatible implementations. -type UnimplementedOccServer struct { -} - -func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") -} -func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") -} - func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -916,7 +896,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -924,26 +904,20 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -951,38 +925,31 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -990,26 +957,20 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1017,31 +978,25 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1049,38 +1004,30 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Event != nil { - { - size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) + n1, err1 := m.Event.MarshalTo(dAtA[i:]) + if err1 != nil { + return 0, err1 + } + i += n1 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1088,26 +1035,20 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1115,33 +1056,26 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1149,40 +1083,32 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) } if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1190,54 +1116,44 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.SrcState) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i += copy(dAtA[i:], m.SrcState) + } + if len(m.TransitionEvent) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i += copy(dAtA[i:], m.TransitionEvent) } if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Arguments { dAtA[i] = 0x1a + i++ + i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x12 - } - if len(m.SrcState) > 0 { - i -= len(m.SrcState) - copy(dAtA[i:], m.SrcState) - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1245,61 +1161,51 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Trigger != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + } + if len(m.State) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if len(m.TransitionEvent) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i += copy(dAtA[i:], m.TransitionEvent) } if m.Ok { - i-- + dAtA[i] = 0x20 + i++ if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x20 - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x1a - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 + i++ } - if m.Trigger != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { - offset -= sovOcc(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1476,7 +1382,14 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) From 000916175a65948d302baa4b7b48b283acf5cce1 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 20 Sep 2019 09:03:24 +0200 Subject: [PATCH 0031/2352] [core] Update defaults for templ list API --- coconut/control/control.go | 2 -- core/repos/repomanager.go | 3 +++ 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index dac562290..e6cb7cb9f 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -531,8 +531,6 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob fmt.Fprintln(o, "Ignoring `--all-{branches,tags}` flags, as a valid revision has been specified") allBranches = false allTags = false - } else { - revisionPattern = "*" } } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index efff04c2d..e4b6adda9 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -459,6 +459,8 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat if revisionPattern == "" { revisionPattern = "master" + } else if allBranches || allTags { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error + return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") } // Prepare the gitRefs slice which will filter the git references @@ -466,6 +468,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat if !allBranches && !allTags { gitRefs = append(gitRefs, refRemotePrefix, refTagPrefix) } else { + revisionPattern = "*" if allBranches { gitRefs = append(gitRefs, refRemotePrefix) } From 7d329c25a87e8f0f89b2a3f42ac9b3cb416b6bf6 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 25 Sep 2019 17:27:18 +0200 Subject: [PATCH 0032/2352] [OCONF-184] Add time format --- coconut/configuration/configuration.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 7a7c98a2a..68a55d460 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -282,7 +282,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), 1 } case 2: - if IsInputNameValid(args[0]) && IsInputNameValid(args[1]) { + if IsInputSingleValidWord(args[0]) && IsInputSingleValidWord(args[1]) { component = args[0] entry = args[1] } else { @@ -308,7 +308,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, panic(err) } tm := time.Unix(i, 0) - value = value[:index2] + string("@") + value[index2+1:] + " " + tm.Format("RFC3339") + value = value[:index2] + string("@") + value[index2+1:] + " " + tm.Format(time.RFC822) keys[index] = value } if entry != "" { From bfc7a6532414c216bbe3303cf9d6ea20293d4134 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 27 Sep 2019 15:56:40 +0200 Subject: [PATCH 0033/2352] [OCONF-184] Use tableWriter --- coconut/configuration/configuration.go | 134 +++++++++++++++++++------ 1 file changed, 105 insertions(+), 29 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 68a55d460..c3b0dc160 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -27,6 +27,8 @@ package configuration import ( + "github.com/fatih/color" + "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/briandowns/spinner" @@ -35,6 +37,7 @@ import ( "io" "github.com/sirupsen/logrus" "os" + "sort" "github.com/AliceO2Group/Control/common/logger" "fmt" "strings" @@ -64,6 +67,15 @@ const ( logicError = iota // Logic/Output error ) +var( + white = color.New(color.FgHiWhite).SprintFunc() + blue = color.New(color.FgHiBlue).SprintFunc() + green = color.New(color.FgHiGreen).SprintFunc() + yellow = color.New(color.FgHiYellow).SprintFunc() + red = color.New(color.FgHiRed).SprintFunc() + grey = color.New(color.FgWhite).SprintFunc() +) + func WrapCall(call ConfigurationCall) RunFunc { return func(cmd *cobra.Command, args []string) { endpoint := viper.GetString("config_endpoint") @@ -267,7 +279,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, if len(args) < 1 || len(args) > 2 { err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) - return err, 1 + return err, invalidArgs } switch len(args) { case 1: @@ -279,49 +291,47 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, component = splitCom[0] entry = splitCom[1] } else { - return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), 1 + return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), invalidArgs } case 2: if IsInputSingleValidWord(args[0]) && IsInputSingleValidWord(args[1]) { component = args[0] entry = args[1] } else { - return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), 1 + return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), invalidArgs } } key = componentsPath + component + "/" + entry - keys, err := cfg.GetKeysByPrefix(key, "") - if err != nil { - return errors.New(fmt.Sprintf("Could not query ConsulSource")), 2 - } + var keys sort.StringSlice + keys , err = cfg.GetKeysByPrefix(key, "") if len(keys) == 0 { - return errors.New(fmt.Sprintf("No data was found")), 2 + return errors.New(fmt.Sprintf("No data was found")), emptyData } else { - for index := range keys { - var value = keys[index] - value = strings.TrimPrefix(value , componentsPath) - index2 := strings.LastIndex(value, "/") - timetsamo := value[index2+1:] - i, err := strconv.ParseInt(timetsamo, 10, 64) - if err != nil { - panic(err) - } - tm := time.Unix(i, 0) - value = value[:index2] + string("@") + value[index2+1:] + " " + tm.Format(time.RFC822) - keys[index] = value - } if entry != "" { - + sort.Sort(sort.Reverse(keys)) + drawTableHistoryConfigs([]string{}, keys, 0, o) } else { - //tree + maxLen := GetMaxLenOfKey(keys) + var currentKeys sort.StringSlice + for _, value := range keys { + _, currentEntry, _ := GetComponentEntryTimestamp(value) + if currentEntry != entry { + if entry != "" { + fmt.Fprintln(o, "- " + entry) + sort.Sort(sort.Reverse(currentKeys)) + drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) + } + currentKeys = []string{value} + entry = currentEntry + } else { + currentKeys = append(currentKeys, value) + } + } + fmt.Fprintln(o, "- " + entry) + drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) } } - output, err := formatListOutput(cmd, keys) - if err != nil { - return err, 4 - } - fmt.Fprintln(o, string(output)) return nil, 0 } @@ -348,10 +358,36 @@ func IsInputNameValid(input string) bool { return InputRegex.MatchString(input) } +func GetMapOfKeysAndTimestamps(keys []string)(map[string]string, error, int) { + configMap := make(map[string]string) + for index := range keys { + var value = keys[index] + value = strings.TrimPrefix(value , componentsPath) + indexOfTimestamp := strings.LastIndex(value, "/") + timestamp, err := GetTimestampInFormat(value[indexOfTimestamp+1:], time.RFC822) + if err != nil { + return nil, err, logicError + } + value = value[:indexOfTimestamp] + string("@") + value[indexOfTimestamp+1:] + configMap[value] = timestamp + } + return configMap, nil, 0 +} + func IsInputSingleValidWord(input string) bool { return !strings.Contains(input, "/") && !strings.Contains(input, "@") } +// Method to parse a timestamp in the specified format +func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ + timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) + if err != nil { + return "", errors.New(fmt.Sprintf("Unable to identify timestamp")) + } + tm := time.Unix(timeStampAsInt, 0) + return tm.Format(timeFormat), nil +} + // Method to return the latest timestamp for a specified component & entry // If no keys were passed an error and code exit 3 will be returned func GetLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error, code int) { @@ -406,4 +442,44 @@ func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use } } return components, nil, nonZero -} \ No newline at end of file +} + +func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { + table := tablewriter.NewWriter(o) + if len(headers) > 0 { + table.SetHeader(headers) + } + table.SetBorder(false) + table.SetColMinWidth(0, max) + + for _, value := range history { + component, entry, timestamp := GetComponentEntryTimestamp(value) + prettyTimestamp, err := GetTimestampInFormat(timestamp, time.RFC822) + if err != nil { + prettyTimestamp = timestamp + } + configName := red(component) + "/" + blue(entry) + "@" + timestamp + table.Append([]string{configName, prettyTimestamp}) + } + table.Render() +} + +func GetComponentEntryTimestamp(key string)(component string, entry string, timestamp string) { + key = strings.TrimPrefix(key, componentsPath) + key = strings.TrimPrefix(key, "/'") + key = strings.TrimSuffix(key, "/") + elements := strings.Split(key, "/") + component = elements[0] + entry = elements[1] + timestamp = elements[2] + return +} + +func GetMaxLenOfKey(keys []string) (maxLen int){ + maxLen = 0 + for _, value := range keys { + if len(value) - len(componentsPath) >= maxLen { + maxLen = len(value) - len(componentsPath) + } + } +} From 53791bca6a1eda40c1511c254c8dfc9d623f506d Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 27 Sep 2019 16:06:29 +0200 Subject: [PATCH 0034/2352] [OCONF-184] Updates on code structure --- coconut/configuration/configuration.go | 43 ++++++++------------------ 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index c3b0dc160..9ce044a76 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -301,6 +301,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), invalidArgs } } + key = componentsPath + component + "/" + entry var keys sort.StringSlice keys , err = cfg.GetKeysByPrefix(key, "") @@ -314,18 +315,18 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } else { maxLen := GetMaxLenOfKey(keys) var currentKeys sort.StringSlice + _, entry, _ := GetComponentEntryTimestamp(keys[0]) + for _, value := range keys { _, currentEntry, _ := GetComponentEntryTimestamp(value) - if currentEntry != entry { - if entry != "" { - fmt.Fprintln(o, "- " + entry) - sort.Sort(sort.Reverse(currentKeys)) - drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) - } - currentKeys = []string{value} - entry = currentEntry - } else { + if currentEntry == entry { currentKeys = append(currentKeys, value) + } else { + fmt.Fprintln(o, "- " + entry) + sort.Sort(sort.Reverse(currentKeys)) //sort in reverse of timestamps + drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) + currentKeys = []string{value} + entry = currentEntry } } fmt.Fprintln(o, "- " + entry) @@ -358,22 +359,6 @@ func IsInputNameValid(input string) bool { return InputRegex.MatchString(input) } -func GetMapOfKeysAndTimestamps(keys []string)(map[string]string, error, int) { - configMap := make(map[string]string) - for index := range keys { - var value = keys[index] - value = strings.TrimPrefix(value , componentsPath) - indexOfTimestamp := strings.LastIndex(value, "/") - timestamp, err := GetTimestampInFormat(value[indexOfTimestamp+1:], time.RFC822) - if err != nil { - return nil, err, logicError - } - value = value[:indexOfTimestamp] + string("@") + value[indexOfTimestamp+1:] - configMap[value] = timestamp - } - return configMap, nil, 0 -} - func IsInputSingleValidWord(input string) bool { return !strings.Contains(input, "/") && !strings.Contains(input, "@") } @@ -464,15 +449,12 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W table.Render() } -func GetComponentEntryTimestamp(key string)(component string, entry string, timestamp string) { +func GetComponentEntryTimestamp(key string)(string, string, string) { key = strings.TrimPrefix(key, componentsPath) key = strings.TrimPrefix(key, "/'") key = strings.TrimSuffix(key, "/") elements := strings.Split(key, "/") - component = elements[0] - entry = elements[1] - timestamp = elements[2] - return + return elements[0], elements[1], elements[2] } func GetMaxLenOfKey(keys []string) (maxLen int){ @@ -482,4 +464,5 @@ func GetMaxLenOfKey(keys []string) (maxLen int){ maxLen = len(value) - len(componentsPath) } } + return } From e953824317cc1e7faedce3382e74b70d8bc0d025 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 27 Sep 2019 16:52:42 +0200 Subject: [PATCH 0035/2352] [OCONF-184] Resolve comments --- coconut/cmd/configuration_history.go | 6 +- coconut/cmd/configuration_list.go | 2 +- coconut/cmd/configuration_show.go | 2 +- coconut/configuration/configuration.go | 6 +- coconut/protos/o2control.pb.go | 2422 ++++++++++++++---------- core/protos/o2control.pb.go | 2422 ++++++++++++++---------- executor/protos/occ.pb.go | 357 ++-- 7 files changed, 3066 insertions(+), 2151 deletions(-) diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go index 4ea0e6196..34711329c 100644 --- a/coconut/cmd/configuration_history.go +++ b/coconut/cmd/configuration_history.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2019 CERN and copyright holders of ALICE O². * Author: George Raduta * * This program is free software: you can redistribute it and/or modify @@ -30,13 +30,13 @@ import ( ) var configurationHistoryCmd = &cobra.Command{ - Use: "history [component]", + Use: "history ", Aliases: []string{"h"}, Example: `coconut conf history coconut conf history coconut conf history /`, Short: "List all existing entries with timestamps of a specified component in Consul", - Long: `The configuration history command will return all entries with + Long: `The configuration history command returns all entries with all of their associated timestamps or returns all timestamps for a specified component and entry`, Run: configuration.WrapCall(configuration.History), Args: cobra.RangeArgs(0, 3), diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 5e630ff9e..9b7a8d021 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2019 CERN and copyright holders of ALICE O². * Author: George Raduta * * This program is free software: you can redistribute it and/or modify diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index cd4d9a485..09ae2df1d 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2019 CERN and copyright holders of ALICE O². * Author: George Raduta * * This program is free software: you can redistribute it and/or modify diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 9ce044a76..c7870b746 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -68,12 +68,8 @@ const ( ) var( - white = color.New(color.FgHiWhite).SprintFunc() blue = color.New(color.FgHiBlue).SprintFunc() - green = color.New(color.FgHiGreen).SprintFunc() - yellow = color.New(color.FgHiYellow).SprintFunc() red = color.New(color.FgHiRed).SprintFunc() - grey = color.New(color.FgWhite).SprintFunc() ) func WrapCall(call ConfigurationCall) RunFunc { @@ -278,7 +274,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, var key, component, entry string if len(args) < 1 || len(args) > 2 { - err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) + err = errors.New(fmt.Sprintf("Accepts between 0 and 3 arg(s), but received %d", len(args))) return err, invalidArgs } switch len(args) { diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index cafad697e..382d407ce 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +857,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +904,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +951,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +999,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1054,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1110,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1173,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1235,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1291,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1353,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1407,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1463,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1555,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1622,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1662,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1709,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1756,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1804,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1862,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1939,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2006,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2095,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2143,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2201,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2260,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2342,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2437,7 +2392,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2507,7 +2462,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2568,7 +2523,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2614,7 +2569,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2655,7 +2610,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2709,7 +2664,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2756,7 +2711,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2803,7 +2758,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2850,7 +2805,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2898,7 +2853,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2952,7 +2907,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2999,7 +2954,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3046,7 +3001,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3093,7 +3048,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3581,6 +3536,68 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -4020,7 +4037,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4028,20 +4045,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4049,20 +4072,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4070,38 +4099,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4109,46 +4147,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4156,20 +4209,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4177,53 +4236,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4231,63 +4299,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4295,26 +4374,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4322,20 +4408,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4343,20 +4435,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4364,38 +4462,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4403,61 +4510,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4465,26 +4584,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4492,30 +4618,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4523,26 +4657,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4550,40 +4691,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4591,31 +4742,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4623,37 +4781,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4661,48 +4827,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4710,31 +4885,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4742,44 +4924,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4787,36 +4979,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4824,30 +5023,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4855,70 +5062,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4926,44 +5146,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4971,20 +5201,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4992,32 +5228,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5025,26 +5269,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5052,30 +5303,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5083,32 +5342,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5116,72 +5383,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5189,38 +5452,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5228,86 +5500,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + } + } + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5315,35 +5605,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5351,44 +5641,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + } + } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5396,32 +5696,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5429,71 +5737,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5501,32 +5815,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5534,52 +5856,60 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.RepoPattern) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i += copy(dAtA[i:], m.RepoPattern) - } - if len(m.RevisionPattern) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i += copy(dAtA[i:], m.RevisionPattern) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllBranches { - dAtA[i] = 0x18 - i++ - if m.AllBranches { + if m.AllTags { + i-- + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if m.AllTags { + i-- dAtA[i] = 0x20 - i++ - if m.AllTags { + } + if m.AllBranches { + i-- + if m.AllBranches { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5587,38 +5917,47 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) - } - if len(m.Template) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Revision) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 + } + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5626,32 +5965,40 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5659,20 +6006,26 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5680,36 +6033,43 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Default { - dAtA[i] = 0x10 - i++ + i-- if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5717,32 +6077,40 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5750,26 +6118,33 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Name) + copy(dAtA[i:], m.Name) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5777,26 +6152,33 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5804,25 +6186,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5830,36 +6218,43 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0x12 + } if m.Ok { - dAtA[i] = 0x8 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5867,25 +6262,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5893,26 +6294,33 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5920,25 +6328,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5946,30 +6360,39 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7061,14 +7484,7 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index cafad697e..382d407ce 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -902,7 +857,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -949,7 +904,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +951,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +999,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1054,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1110,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1173,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1235,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1291,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1353,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1407,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1508,7 +1463,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1600,7 +1555,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1667,7 +1622,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1707,7 +1662,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1754,7 +1709,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1801,7 +1756,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1849,7 +1804,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1907,7 +1862,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1984,7 +1939,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2051,7 +2006,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2140,7 +2095,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2188,7 +2143,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2246,7 +2201,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2305,7 +2260,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2387,7 +2342,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2437,7 +2392,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2507,7 +2462,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2568,7 +2523,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2614,7 +2569,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2655,7 +2610,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2709,7 +2664,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2756,7 +2711,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2803,7 +2758,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2850,7 +2805,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2898,7 +2853,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2952,7 +2907,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2999,7 +2954,7 @@ func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3046,7 +3001,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3093,7 +3048,7 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3581,6 +3536,68 @@ type ControlServer interface { SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -4020,7 +4037,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4028,20 +4045,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4049,20 +4072,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4070,38 +4099,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4109,46 +4147,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err2 := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err2 != nil { - return 0, err2 + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4156,20 +4209,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4177,53 +4236,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4231,63 +4299,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err3 := m.Version.MarshalTo(dAtA[i:]) - if err3 != nil { - return 0, err3 - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4295,26 +4374,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4322,20 +4408,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4343,20 +4435,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4364,38 +4462,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4403,61 +4510,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4465,26 +4584,33 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4492,30 +4618,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err4 := m.Environment.MarshalTo(dAtA[i:]) - if err4 != nil { - return 0, err4 + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4523,26 +4657,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4550,40 +4691,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err5 := m.Environment.MarshalTo(dAtA[i:]) - if err5 != nil { - return 0, err5 - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err6 := m.Workflow.MarshalTo(dAtA[i:]) - if err6 != nil { - return 0, err6 + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4591,31 +4742,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4623,37 +4781,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4661,48 +4827,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4710,31 +4885,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4742,44 +4924,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4787,36 +4979,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4824,30 +5023,38 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err7 := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err7 != nil { - return 0, err7 + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4855,70 +5062,83 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x3a } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 } if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x2a } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err8 := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err8 != nil { - return 0, err8 + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i += n8 + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4926,44 +5146,54 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) + i-- + dAtA[i] = 0x1a } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4971,20 +5201,26 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4992,32 +5228,40 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5025,26 +5269,33 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5052,30 +5303,38 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err9 := m.Task.MarshalTo(dAtA[i:]) - if err9 != nil { - return 0, err9 + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n9 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5083,32 +5342,40 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5116,72 +5383,68 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } if m.Shell { - dAtA[i] = 0x10 - i++ + i-- if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x10 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5189,38 +5452,47 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Target) + copy(dAtA[i:], m.Target) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5228,86 +5500,104 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err10 := m.ShortInfo.MarshalTo(dAtA[i:]) - if err10 != nil { - return 0, err10 - } - i += n10 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err11 := m.ClassInfo.MarshalTo(dAtA[i:]) - if err11 != nil { - return 0, err11 - } - i += n11 + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 + } + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + } + } + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err12 := m.CommandInfo.MarshalTo(dAtA[i:]) - if err12 != nil { - return 0, err12 + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5315,35 +5605,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5351,44 +5641,54 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + } + } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5396,32 +5696,40 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.PathSpec) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5429,71 +5737,77 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + i-- + dAtA[i] = 0x22 } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5501,32 +5815,40 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5534,52 +5856,60 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.RepoPattern) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i += copy(dAtA[i:], m.RepoPattern) - } - if len(m.RevisionPattern) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i += copy(dAtA[i:], m.RevisionPattern) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllBranches { - dAtA[i] = 0x18 - i++ - if m.AllBranches { + if m.AllTags { + i-- + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if m.AllTags { + i-- dAtA[i] = 0x20 - i++ - if m.AllTags { + } + if m.AllBranches { + i-- + if m.AllBranches { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 } - return i, nil + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5587,38 +5917,47 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) - } - if len(m.Template) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Revision) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 + } + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5626,32 +5965,40 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5659,20 +6006,26 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5680,36 +6033,43 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Default { - dAtA[i] = 0x10 - i++ + i-- if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5717,32 +6077,40 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5750,26 +6118,33 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Name) + copy(dAtA[i:], m.Name) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5777,26 +6152,33 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5804,25 +6186,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5830,36 +6218,43 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0x12 + } if m.Ok { - dAtA[i] = 0x8 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ - } - if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5867,25 +6262,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5893,26 +6294,33 @@ func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5920,25 +6328,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5946,30 +6360,39 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.ErrorString) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.ErrorString) + copy(dAtA[i:], m.ErrorString) i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i += copy(dAtA[i:], m.ErrorString) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7061,14 +7484,7 @@ func (m *SetDefaultRepoReply) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index cf6413bca..5f74bc308 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StateChangeTrigger int32 @@ -121,7 +124,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -162,7 +165,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -215,7 +218,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -255,7 +258,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -302,7 +305,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -348,7 +351,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -388,7 +391,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -436,7 +439,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -492,7 +495,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -556,7 +559,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -783,6 +786,23 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } +// UnimplementedOccServer can be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -896,7 +916,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -904,20 +924,26 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -925,31 +951,38 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -957,20 +990,26 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -978,25 +1017,31 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Type != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1004,30 +1049,38 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Event != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) - n1, err1 := m.Event.MarshalTo(dAtA[i:]) - if err1 != nil { - return 0, err1 + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n1 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1035,20 +1088,26 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1056,26 +1115,33 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.State) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1083,32 +1149,40 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Key) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Value) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Value) + copy(dAtA[i:], m.Value) i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1116,44 +1190,54 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.SrcState) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i += copy(dAtA[i:], m.SrcState) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Arguments) > 0 { - for _, msg := range m.Arguments { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x1a } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x12 + } + if len(m.SrcState) > 0 { + i -= len(m.SrcState) + copy(dAtA[i:], m.SrcState) + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1161,51 +1245,61 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Trigger != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Ok { - dAtA[i] = 0x20 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x1a + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Trigger != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { + offset -= sovOcc(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1382,14 +1476,7 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) From e76aacd9cf1dfbfdf528362f42f2cf5768d39fbf Mon Sep 17 00:00:00 2001 From: George R Date: Thu, 3 Oct 2019 12:16:33 +0200 Subject: [PATCH 0036/2352] [OCONF-166] coconut conf import command (#71) * [OCONF-166] Add coconut import command * [OCONF-166] Refactor * [OCONF-166] Add extension check * [OCONF-166] Fix compilation issues * [OCONF-166] Add component & entry check for new entries * [OCONF-166] Add extension file logic * [OCONF-166] Change error messages * [OCONF-166] Syntax updates * [OCONF-166] Address comments on strings * [OCONF-166] Fix compilation issue * [OCONF-166] Update user message * [OCONF-166] Add component/entry format * [OCONF-166] Remove commented lines * [OCONF-166] Update documentation --- coconut/cmd/configuration_history.go | 2 +- coconut/cmd/configuration_import.go | 55 +++++ coconut/cmd/configuration_show.go | 6 +- coconut/configuration/configuration.go | 263 +++++++++------------ coconut/configuration/configurationutil.go | 237 +++++++++++++++++++ 5 files changed, 403 insertions(+), 160 deletions(-) create mode 100644 coconut/cmd/configuration_import.go create mode 100644 coconut/configuration/configurationutil.go diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go index 34711329c..defb7de42 100644 --- a/coconut/cmd/configuration_history.go +++ b/coconut/cmd/configuration_history.go @@ -39,7 +39,7 @@ coconut conf history /`, Long: `The configuration history command returns all entries with all of their associated timestamps or returns all timestamps for a specified component and entry`, Run: configuration.WrapCall(configuration.History), - Args: cobra.RangeArgs(0, 3), + Args: cobra.RangeArgs(0, 3), } func init() { diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go new file mode 100644 index 000000000..976bf9751 --- /dev/null +++ b/coconut/cmd/configuration_import.go @@ -0,0 +1,55 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "github.com/AliceO2Group/Control/coconut/configuration" + "github.com/spf13/cobra" +) + +var configurationImportCmd = &cobra.Command{ + Use: "import ", + Aliases: []string{"i", "imp"}, + Example: `coconut conf import +coconut conf import / +coconut conf import --new-component +coconut conf import / --format=json +coconut conf import .json +`, + Short: "Import a configuration file for the specified component and entry", + Long: `The configuration import command generates a timestamp and saves +the configuration file to Consul under the // path. +Supported configuration file types are JSON, YAML, TOML and INI, +and their file extensions are recognized automatically.`, + Run: configuration.WrapCall(configuration.Import), + Args: cobra.RangeArgs(1, 4), +} + +func init() { + configurationCmd.AddCommand(configurationImportCmd) + configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") + configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") + +} diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 09ae2df1d..1913bb1c5 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -38,9 +38,9 @@ coconut conf show / coconut conf show / -t coconut conf show /@`, Short: "Show configuration for the component and entry specified", - Long: `The configuration show command requests by default the latest -configuration for the specified component and entry. It can request exact -time configuration by specifying wanted timestamp as flag`, + Long: `The configuration show command returns the most recent +configuration revision for the specified component and entry. +It can also return a specific revision, requested with the --timestamp/-t flag`, Run: configuration.WrapCall(configuration.Show), Args: cobra.RangeArgs(0, 3), } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index c7870b746..25e857b65 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -27,8 +27,6 @@ package configuration import ( - "github.com/fatih/color" - "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/briandowns/spinner" @@ -43,7 +41,6 @@ import ( "strings" "github.com/AliceO2Group/Control/configuration" "errors" - "regexp" "encoding/json" "gopkg.in/yaml.v2" "github.com/naoina/toml" @@ -55,21 +52,15 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) -var componentsPath = "o2/components/" - -var InputRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) - const ( nonZero = iota invalidArgs = iota // Provided args by the user are invalid + invalidArgsErrMsg = "component and entry names cannot contain `/ or `@`" connectionError = iota // Source connection error emptyData = iota // Source retrieved empty data + emptyDataErrMsg = "no data was found" logicError = iota // Logic/Output error -) - -var( - blue = color.New(color.FgHiBlue).SprintFunc() - red = color.New(color.FgHiRed).SprintFunc() + componentsPath = "o2/components/" ) func WrapCall(call ConfigurationCall) RunFunc { @@ -155,34 +146,29 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o keyPrefix := componentsPath useTimestamp := false if len(args) > 1 { - err = errors.New(fmt.Sprintf("Command requires maximum 1 arg but received %d", len(args))) - return err , invalidArgs + return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , invalidArgs } else { useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { - err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be identified")) - return err, invalidArgs + return err, invalidArgs } if len(args) == 1 { - if !IsInputSingleValidWord(args[0]) { - err = errors.New(fmt.Sprintf("Requested component name cannot contain character `/` or `@`")) - return err, invalidArgs + if !isInputSingleValidWord(args[0]) { + return errors.New(invalidArgsErrMsg), invalidArgs } else { keyPrefix += args[0] + "/" } } else if len(args) == 0 && useTimestamp { - err = errors.New(fmt.Sprintf("To use flag `-t / --timestamp` please provide component name")) - return err, invalidArgs + return errors.New("to use flag `-t / --timestamp` please provide component name"), invalidArgs } } keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { - err = errors.New(fmt.Sprintf("Could not query ConsulSource")) - return err, connectionError + return err, connectionError } - components, err, code := GetListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) + components, err, code := getListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) if err != nil { return err, code } @@ -199,22 +185,20 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o var key, component, entry, timestamp string if len(args) < 1 || len(args) > 2 { - err = errors.New(fmt.Sprintf(" accepts between 0 and 3 arg(s), but received %d", len(args))) - return err, invalidArgs + return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), invalidArgs } timestamp, err = cmd.Flags().GetString("timestamp") if err != nil { - err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` could not be provided")) return err, invalidArgs } switch len(args) { case 1: - if IsInputNameValid(args[0] ) { + if isInputCompEntryTsValid(args[0] ) { if strings.Contains(args[0], "@") { if timestamp != "" { - err = errors.New(fmt.Sprintf("Flag `-t / --timestamp` must not be provided when using format `component/entry@timestamp`")) + err = errors.New("flag `-t / --timestamp` must not be provided when using format /@") return err, invalidArgs } // coconut conf show component/entry@timestamp @@ -231,13 +215,11 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } } else { // coconut conf show component || coconut conf show component@timestamp - err = errors.New(fmt.Sprintf("Please provide entry name")) - return err, invalidArgs + return errors.New("please provide entry name"), invalidArgs } case 2: - if !IsInputSingleValidWord(args[0]) || !IsInputSingleValidWord(args[1]) { - err = errors.New(fmt.Sprintf("Component and Entry name cannot contain `/` or `@`")) - return err, invalidArgs + if !isInputSingleValidWord(args[0]) || !isInputSingleValidWord(args[1]) { + return errors.New(invalidArgsErrMsg), invalidArgs } else { component = args[0] entry = args[1] @@ -249,9 +231,9 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o keyPrefix := componentsPath + component + "/" + entry keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { - return errors.New(fmt.Sprintf("Could not query ConsulSource")), connectionError + return err, connectionError } - timestamp, err, code = GetLatestTimestamp(keys, component , entry) + timestamp, err, code = getLatestTimestamp(keys, component , entry) if err != nil { return err, code } @@ -262,8 +244,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, connectionError } if configuration == "" { - err = errors.New(fmt.Sprintf("Requsted component and entry could not be found")) - return err, emptyData + return errors.New(emptyDataErrMsg), emptyData } fmt.Fprintln(o, configuration) @@ -274,47 +255,48 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, var key, component, entry string if len(args) < 1 || len(args) > 2 { - err = errors.New(fmt.Sprintf("Accepts between 0 and 3 arg(s), but received %d", len(args))) - return err, invalidArgs + return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), invalidArgs } switch len(args) { case 1: - if IsInputSingleValidWord(args[0]) { + if isInputSingleValidWord(args[0]) { component = args[0] entry = "" - } else if IsInputNameValid(args[0]) && !strings.Contains(args[0], "@"){ + } else if isInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ splitCom := strings.Split(args[0], "/") component = splitCom[0] entry = splitCom[1] } else { - return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), invalidArgs + return errors.New(invalidArgsErrMsg), invalidArgs } case 2: - if IsInputSingleValidWord(args[0]) && IsInputSingleValidWord(args[1]) { + if isInputSingleValidWord(args[0]) && isInputSingleValidWord(args[1]) { component = args[0] entry = args[1] } else { - return errors.New(fmt.Sprintf("Component and Entry name cannot contain `/ or `@`")), invalidArgs + return errors.New(invalidArgsErrMsg), invalidArgs } } key = componentsPath + component + "/" + entry var keys sort.StringSlice keys , err = cfg.GetKeysByPrefix(key, "") - + if err != nil { + return err, connectionError + } if len(keys) == 0 { - return errors.New(fmt.Sprintf("No data was found")), emptyData + return errors.New(emptyDataErrMsg), emptyData } else { if entry != "" { sort.Sort(sort.Reverse(keys)) drawTableHistoryConfigs([]string{}, keys, 0, o) } else { - maxLen := GetMaxLenOfKey(keys) + maxLen := getMaxLenOfKey(keys) var currentKeys sort.StringSlice - _, entry, _ := GetComponentEntryTimestamp(keys[0]) + _, entry, _ := getComponentEntryTimestampFromConsul(keys[0]) for _, value := range keys { - _, currentEntry, _ := GetComponentEntryTimestamp(value) + _, currentEntry, _ := getComponentEntryTimestampFromConsul(value) if currentEntry == entry { currentKeys = append(currentKeys, value) } else { @@ -332,133 +314,102 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return nil, 0 } -func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { - format, err := cmd.Flags().GetString("output") +func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + useNewComponent, err := cmd.Flags().GetBool("new-component") if err != nil { - return - } - - switch strings.ToLower(format) { - case "json": - parsedOutput, err = json.MarshalIndent(output, "", " ") - case "yaml": - parsedOutput, err = yaml.Marshal(output) + return err, invalidArgs } + useExtension, err := cmd.Flags().GetString("format") if err != nil { - log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) - return + return err, invalidArgs } - return parsedOutput, nil -} - -func IsInputNameValid(input string) bool { - return InputRegex.MatchString(input) -} - -func IsInputSingleValidWord(input string) bool { - return !strings.Contains(input, "/") && !strings.Contains(input, "@") -} - -// Method to parse a timestamp in the specified format -func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ - timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) - if err != nil { - return "", errors.New(fmt.Sprintf("Unable to identify timestamp")) + var component, entry, filePath string + if len(args) < 2 || len(args) > 3 { + return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), invalidArgs + } else { + switch len(args) { + case 2: + component, entry, err = getComponentEntryFromUserInput(args[0]) + filePath = args[1] + case 3: + if !isInputSingleValidWord(args[0]) || !isInputSingleValidWord(args[1]) { + err = errors.New(invalidArgsErrMsg) + } else { + component = args[0] + entry = args[1] + filePath = args[2] + } + } + if err != nil { + return err, invalidArgs + } } - tm := time.Unix(timeStampAsInt, 0) - return tm.Format(timeFormat), nil -} -// Method to return the latest timestamp for a specified component & entry -// If no keys were passed an error and code exit 3 will be returned -func GetLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error, code int) { - keyPrefix := componentsPath + component + "/" + entry - if len(keys) == 0 { - err = errors.New(fmt.Sprintf("No keys found")) - return "", err, emptyData + fileParts := strings.Split(filePath, ".") + extension := "" + if len(fileParts) > 1 { + extension = fileParts[len(fileParts)-1] } - var maxTimeStamp uint64 - for _, key := range keys { - componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) - if err == nil { - if componentTimestamp > maxTimeStamp { - maxTimeStamp = componentTimestamp - } - } + if !isFileExtensionValid(extension) && useExtension == "" { + return errors.New("supported file extensions: JSON, YAML, INI or TOML." + + " To force a specific configuration format, see flag --format/-f" ), invalidArgs + } else if useExtension != "" { + extension = strings.ToUpper(useExtension) } - return strconv.FormatUint(maxTimeStamp, 10), nil, nonZero -} -// Method to return a list of components, entries or entries with latest timestamp -// If no keys were passed an error and code exit 3 will be returned -func GetListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { - if len(keys) == 0 { - return []string{}, errors.New(fmt.Sprintf("No keys found")), emptyData + keys, err := cfg.GetKeysByPrefix("", "") + if err != nil { + return err, connectionError } - var components []string - componentsSet := make(map[string]string) - - for _, key := range keys { - componentsFullName := strings.TrimPrefix(key, keyPrefix) - componentParts := strings.Split(componentsFullName, "/") - componentTimestamp := componentParts[len(componentParts) - 1] - if useTimestamp { - componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) - } else { - componentsFullName = componentParts[0] + components := getComponentsMapFromKeysList(keys) + componentExist := components[component] + if !componentExist && !useNewComponent { + componentMsg := "" + for key, _ := range components { + componentMsg += "\n- " + key } + return errors.New("component " + component + " does not exist. " + + "Available components in configuration database:" + componentMsg + + "\nTo create a new component, see flag --new-component/-n" ), + invalidArgs + } + if componentExist && useNewComponent { + return errors.New("invalid use of flag --new-component/-n: component " + red(component) + " already exists"), invalidArgs + } - if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ - componentsSet[componentsFullName] = componentTimestamp - } + entryExists := false + if !useNewComponent { + entriesMap := getEntriesMapOfComponentFromKeysList(component, keys) + entryExists = entriesMap[entry] } - for key,value := range componentsSet { - if useTimestamp { - components = append(components, key+"@"+value) - } else { - components = append(components, key) - } + fileContent, err := getFileContent(filePath) + if err != nil { + return err, logicError } - return components, nil, nonZero -} -func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { - table := tablewriter.NewWriter(o) - if len(headers) > 0 { - table.SetHeader(headers) + timestamp := time.Now().Unix() + key := componentsPath + component + "/" + entry + "/" + strconv.FormatInt(timestamp, 10) + err = cfg.Put(key, string(fileContent)) + if err != nil { + return } - table.SetBorder(false) - table.SetColMinWidth(0, max) - for _, value := range history { - component, entry, timestamp := GetComponentEntryTimestamp(value) - prettyTimestamp, err := GetTimestampInFormat(timestamp, time.RFC822) - if err != nil { - prettyTimestamp = timestamp - } - configName := red(component) + "/" + blue(entry) + "@" + timestamp - table.Append([]string{configName, prettyTimestamp}) + userMsg := "" + if !componentExist { + userMsg = "New component created: " + red(component) + "\n" } - table.Render() -} + if !entryExists { + userMsg += "New entry created: " + blue(entry) + "\n" + } else { + userMsg += "Entry updated: " + blue(entry) + "\n" + } + fullKey := red(component) + "/" + blue(entry) + "@" + strconv.FormatInt(timestamp, 10) + userMsg += "Configuration imported: " + fullKey -func GetComponentEntryTimestamp(key string)(string, string, string) { - key = strings.TrimPrefix(key, componentsPath) - key = strings.TrimPrefix(key, "/'") - key = strings.TrimSuffix(key, "/") - elements := strings.Split(key, "/") - return elements[0], elements[1], elements[2] + fmt.Fprintln(o, userMsg) + return nil, 0 } -func GetMaxLenOfKey(keys []string) (maxLen int){ - maxLen = 0 - for _, value := range keys { - if len(value) - len(componentsPath) >= maxLen { - maxLen = len(value) - len(componentsPath) - } - } - return -} diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go new file mode 100644 index 000000000..7f6618d67 --- /dev/null +++ b/coconut/configuration/configurationutil.go @@ -0,0 +1,237 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019 CERN and copyright holders of ALICE O². + * Author: George Raduta + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package configuration + +import ( + "github.com/fatih/color" + "github.com/olekukonko/tablewriter" + "github.com/spf13/cobra" + "strconv" + "time" + "io" + "io/ioutil" + "os" + "strings" + "errors" + "regexp" + "encoding/json" + "gopkg.in/yaml.v2" +) + +var ( + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) + inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)$`) +) +var( + blue = color.New(color.FgHiBlue).SprintFunc() + red = color.New(color.FgHiRed).SprintFunc() +) + +func isInputCompEntryTsValid(input string) bool { + return inputFullRegex.MatchString(input) +} + +func isInputCompEntryValid(input string) bool { + return inputComponentEntryRegex.MatchString(input) +} + +func isInputSingleValidWord(input string) bool { + return !strings.Contains(input, "/") && !strings.Contains(input, "@") +} + +// Method to parse a timestamp in the specified format +func getTimestampInFormat(timestamp string, timeFormat string)(string, error){ + timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) + if err != nil { + return "", errors.New("unable to identify timestamp") + } + tm := time.Unix(timeStampAsInt, 0) + return tm.Format(timeFormat), nil +} + +// Method to return the latest timestamp for a specified component & entry +// If no keys were passed an error and code exit 3 will be returned +func getLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error, code int) { + keyPrefix := componentsPath + component + "/" + entry + if len(keys) == 0 { + err = errors.New("no keys found") + return "", err, emptyData + } + + var maxTimeStamp uint64 + for _, key := range keys { + componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) + if err == nil { + if componentTimestamp > maxTimeStamp { + maxTimeStamp = componentTimestamp + } + } + } + return strconv.FormatUint(maxTimeStamp, 10), nil, nonZero +} + +// Method to return a list of components, entries or entries with latest timestamp +// If no keys were passed an error and code exit 3 will be returned +func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { + if len(keys) == 0 { + return []string{}, errors.New("no keys found"), emptyData + } + + var components []string + componentsSet := make(map[string]string) + + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + componentTimestamp := componentParts[len(componentParts) - 1] + if useTimestamp { + componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) + } else { + componentsFullName = componentParts[0] + } + + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ + componentsSet[componentsFullName] = componentTimestamp + } + } + + for key,value := range componentsSet { + if useTimestamp { + components = append(components, key+"@"+value) + components = append(components, key+"@"+value) + } else { + components = append(components, key) + } + } + return components, nil, nonZero +} + +func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { + table := tablewriter.NewWriter(o) + if len(headers) > 0 { + table.SetHeader(headers) + } + table.SetBorder(false) + table.SetColMinWidth(0, max) + + for _, value := range history { + component, entry, timestamp := getComponentEntryTimestampFromConsul(value) + prettyTimestamp, err := getTimestampInFormat(timestamp, time.RFC822) + if err != nil { + prettyTimestamp = timestamp + } + configName := red(component) + "/" + blue(entry) + "@" + timestamp + table.Append([]string{configName, prettyTimestamp}) + } + table.Render() +} + +func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { + format, err := cmd.Flags().GetString("output") + if err != nil { + return + } + + switch strings.ToLower(format) { + case "json": + parsedOutput, err = json.MarshalIndent(output, "", " ") + case "yaml": + parsedOutput, err = yaml.Marshal(output) + } + if err != nil { + return + } + return parsedOutput, nil +} + +// Method to split component, entry and timestamp when being passed a key from consul +// e.g. of key o2/components/quality-control/cru-demo/12345678 +func getComponentEntryTimestampFromConsul(key string)(string, string, string) { + key = strings.TrimPrefix(key, componentsPath) + key = strings.TrimPrefix(key, "/'") + key = strings.TrimSuffix(key, "/") + elements := strings.Split(key, "/") + return elements[0], elements[1], elements[2] +} + +func getMaxLenOfKey(keys []string) (maxLen int){ + maxLen = 0 + for _, value := range keys { + if len(value) - len(componentsPath) >= maxLen { + maxLen = len(value) - len(componentsPath) + } + } + return +} + +func getFileContent(filePath string)(fileContent []byte, err error) { + file, err := os.Open(filePath) + if err != nil { + return + } + defer file.Close() + + fileContentByte, err := ioutil.ReadAll(file) + if err != nil { + return + } + return fileContentByte, nil +} + +func getComponentsMapFromKeysList(keys []string) map[string]bool { + var componentsMap = make(map[string]bool) + for _,value := range keys { + value := strings.TrimPrefix(value, componentsPath) + component := strings.Split(value, "/" )[0] + componentsMap[component] = true + } + return componentsMap +} + +func getEntriesMapOfComponentFromKeysList(component string, keys []string) map[string]bool { + var entriesMap = make(map[string]bool) + for _,value := range keys { + value := strings.TrimPrefix(value, componentsPath) + parts := strings.Split(value, "/" ) + if parts[0] == component { + entriesMap[parts[1]] = true + } + } + return entriesMap +} + +func isFileExtensionValid(extension string) bool{ + extension = strings.ToUpper(extension) + return extension == "JSON" || extension == "YAML" || extension == "YML" || extension == "INI" || extension == "TOML" +} + +func getComponentEntryFromUserInput(input string) (string, string, error) { + if isInputCompEntryValid(input) { + splitCom := strings.Split(input, "/") + return splitCom[0], splitCom[1], nil + } else { + return "", "", errors.New(invalidArgsErrMsg) + } +} From 2c282106e862a9e9b346acd578e2e0bcd792446a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Oct 2019 12:56:50 +0200 Subject: [PATCH 0037/2352] [build] Bump to v0.11.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ebd6a6c6a..59f25fd77 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 10 +VERSION_MINOR := 11 VERSION_PATCH := 0 From 6f531f0078864eee45a023fe73e02ece22bc1daa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Oct 2019 12:59:02 +0200 Subject: [PATCH 0038/2352] [coconut] Generate coconut user documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 5 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_history.md | 42 +++++++++++++++++ coconut/doc/coconut_configuration_import.md | 48 ++++++++++++++++++++ coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 45 ++++++++++++++++++ coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 2 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 26 ++++++++++- 28 files changed, 186 insertions(+), 26 deletions(-) create mode 100644 coconut/doc/coconut_configuration_history.md create mode 100644 coconut/doc/coconut_configuration_import.md create mode 100644 coconut/doc/coconut_configuration_show.md diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 75714aa68..5af84dd06 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -30,4 +30,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 8a1caa37e..b7987d958 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -29,4 +29,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 32bfa461d..cadbd21d7 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -26,6 +26,9 @@ configuration store. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut configuration dump](coconut_configuration_dump.md) - dump configuration subtree +* [coconut configuration history](coconut_configuration_history.md) - List all existing entries with timestamps of a specified component in Consul +* [coconut configuration import](coconut_configuration_import.md) - Import a configuration file for the specified component and entry * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul +* [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 230bd4328..44dfc3b1e 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -32,4 +32,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md new file mode 100644 index 000000000..e6a7e906d --- /dev/null +++ b/coconut/doc/coconut_configuration_history.md @@ -0,0 +1,42 @@ +## coconut configuration history + +List all existing entries with timestamps of a specified component in Consul + +### Synopsis + +The configuration history command returns all entries with +all of their associated timestamps or returns all timestamps for a specified component and entry + +``` +coconut configuration history [flags] +``` + +### Examples + +``` +coconut conf history +coconut conf history +coconut conf history / +``` + +### Options + +``` + -h, --help help for history + -o, --output string output format for the returned entries (yaml/json) (default "yaml") +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + -v, --verbose show verbose output for debug purposes +``` + +### SEE ALSO + +* [coconut configuration](coconut_configuration.md) - view or modify O² configuration + +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md new file mode 100644 index 000000000..a17e194c8 --- /dev/null +++ b/coconut/doc/coconut_configuration_import.md @@ -0,0 +1,48 @@ +## coconut configuration import + +Import a configuration file for the specified component and entry + +### Synopsis + +The configuration import command generates a timestamp and saves +the configuration file to Consul under the // path. +Supported configuration file types are JSON, YAML, TOML and INI, +and their file extensions are recognized automatically. + +``` +coconut configuration import [flags] +``` + +### Examples + +``` +coconut conf import +coconut conf import / +coconut conf import --new-component +coconut conf import / --format=json +coconut conf import .json + +``` + +### Options + +``` + -f, --format string force a specific configuration file type, overriding any file extension + -h, --help help for import + -n, --new-component create a new configuration component while importing entry +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + -v, --verbose show verbose output for debug purposes +``` + +### SEE ALSO + +* [coconut configuration](coconut_configuration.md) - view or modify O² configuration + +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 325647560..4426899d7 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -40,4 +40,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md new file mode 100644 index 000000000..b9ef1244e --- /dev/null +++ b/coconut/doc/coconut_configuration_show.md @@ -0,0 +1,45 @@ +## coconut configuration show + +Show configuration for the component and entry specified + +### Synopsis + +The configuration show command returns the most recent +configuration revision for the specified component and entry. +It can also return a specific revision, requested with the --timestamp/-t flag + +``` +coconut configuration show [flags] +``` + +### Examples + +``` +coconut conf show +coconut conf show -t +coconut conf show / +coconut conf show / -t +coconut conf show /@ +``` + +### Options + +``` + -h, --help help for show + -t, --timestamp string request configuration for this timestamp +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + -v, --verbose show verbose output for debug purposes +``` + +### SEE ALSO + +* [coconut configuration](coconut_configuration.md) - view or modify O² configuration + +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 87f58b7d6..a05af2624 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -51,4 +51,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 490c73db0..cc9042b83 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -39,4 +39,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 70aaaec7d..acabc8211 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -44,4 +44,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 65309ea26..e83a2b2cb 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -34,4 +34,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 0e5891b70..d2c5ce173 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -30,4 +30,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index a9ae34209..5c11e351a 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -32,4 +32,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index dbff96108..903893ca5 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -30,4 +30,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 990ba7b47..c5011a99e 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -55,4 +55,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 12d7d48de..f98a7966c 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -30,4 +30,4 @@ coconut repository add [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 598384701..fdcc8b8de 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index b61f03079..1a543874b 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index e98e5c5c2..4670a28a4 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 6974db100..4bbea03d9 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index adc6381db..4b95efa90 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -27,4 +27,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 685fcac84..acae53e54 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -29,4 +29,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index e75a6d57d..9f99adcf6 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -28,4 +28,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index b3606e482..9f2cb33be 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -31,4 +31,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 757240d2d..d7d296afd 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -30,4 +30,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index fd95dfbea..e0e88bca9 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -27,4 +27,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 201200bfb..63d7b13c0 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -7,14 +7,36 @@ list available workflow templates The template list command shows a list of available workflow templates. These workflow templates can then be loaded to create an environment. +`coconut templ list` can be called with +1) a combination of the `--repo` , `--revision` , `--all-branches` , `--all-tags`flags, or with +2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing. + ``` coconut template list [flags] ``` +### Examples + +``` + * `coconut templ list` lists templates from the HEAD of master for all git repositories + * `coconut templ list *AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * `coconut templ list *@v*` lists templates coming from revisions matching the `v*`pattern for all git repositories + * `coconut templ list --repo=*AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * `coconut templ list --revision=dev*` lists templates coming from revisions matching the `dev*`pattern for all git repositories + * `coconut templ list --repo=*gitlab.cern.ch* --revision=master` lists templates for revisions `master`for git repositories matching `*gitlab.cern.ch*` + * `coconut templ list --all-branches` lists templates from all branches for all git repositories + * `coconut templ list --repo=*github.com* --all-tags` lists templates from all tags for git repositories which match the *github.com* pattern + * `coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 ` lists templates from the commit corresponding to the hash for all git repositories +``` + ### Options ``` - -h, --help help for list + -b, --all-branches list templates from all branches + -t, --all-tags list templates from all tags + -h, --help help for list + -r, --repository string repositories to list templates from (default "*") + -i, --revision string revisions (branches/tags) to list templates from (default "master") ``` ### Options inherited from parent commands @@ -30,4 +52,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 12-Sep-2019 +###### Auto generated by spf13/cobra on 3-Oct-2019 From f9235830bc91f71d04ef02e4fa332228cdbb5b6b Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 18 Oct 2019 14:47:07 +0200 Subject: [PATCH 0039/2352] [core] Update repo rpcs to return errors --- coconut/control/control.go | 48 ++++++++++++------------------------- core/protos/o2control.proto | 21 +++++----------- core/repos/repomanager.go | 14 +++++++---- core/server.go | 31 +++++++++++++----------- 4 files changed, 47 insertions(+), 67 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index e6cb7cb9f..0a4e92e98 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -657,17 +657,13 @@ func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar return err } - var response *pb.AddRepoReply - response, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: args[0]}, grpc.EmptyCallOption{}) + _, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: args[0]}, grpc.EmptyCallOption{}) if err != nil { + fmt.Fprintln(o, "Cannot add repository.") return err } - if response.GetErrorString() == "" { - fmt.Fprintln(o, "Repository succesfully added.") - } else { - fmt.Fprintln(o, "Cannot add repository:", response.GetErrorString()) - } + fmt.Fprintln(o, "Repository succesfully added.") return nil } @@ -691,13 +687,9 @@ func RemoveRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, } newDefaultRepo := response.GetNewDefaultRepo() - if response.GetOk() { - fmt.Fprintln(o, "Repository removed succsefully") - if newDefaultRepo != "" { - fmt.Fprintln(o, "New default repo is: " + newDefaultRepo) - } - } else { - fmt.Fprintln(o, "Repository not found") + fmt.Fprintln(o, "Repository removed succsefully.") + if newDefaultRepo != "" { + fmt.Fprintln(o, "New default repo is: " + newDefaultRepo) } return nil @@ -710,28 +702,23 @@ func RefreshRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comman return err } - var response *pb.RefreshReposReply if len(args) == 0 { - response, err = rpc.RefreshRepos(cxt, &pb.RefreshReposRequest{Index: -1}, grpc.EmptyCallOption{}) + _, err = rpc.RefreshRepos(cxt, &pb.RefreshReposRequest{Index: -1}, grpc.EmptyCallOption{}) } else if len(args) == 1 { index, _ := strconv.ParseInt(args[0], 10, 32) - response, err = rpc.RefreshRepos(cxt, &pb.RefreshReposRequest{Index: int32(index)}, grpc.EmptyCallOption{}) + _, err = rpc.RefreshRepos(cxt, &pb.RefreshReposRequest{Index: int32(index)}, grpc.EmptyCallOption{}) } if err != nil { + fmt.Fprintln(o, "Repository refresh operation failed.") return err } - errorString := response.GetErrorString() - if errorString == "" { - if len(args) == 0 { - fmt.Fprintln(o, "Repositories refreshed succesfully") - } else { - fmt.Fprintln(o, "Repository refreshed succesfully") - } + if len(args) == 0 { + fmt.Fprintln(o, "Repositories refreshed succesfully") } else { - fmt.Fprintln(o, "Repository refresh operation failed:", errorString) + fmt.Fprintln(o, "Repository refreshed succesfully") } return nil @@ -748,18 +735,13 @@ func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comm index, _ := strconv.ParseInt(args[0], 10, 32) - var response *pb.SetDefaultRepoReply - response, err = rpc.SetDefaultRepo(cxt, &pb.SetDefaultRepoRequest{Index: int32(index)}, grpc.EmptyCallOption{}) + _, err = rpc.SetDefaultRepo(cxt, &pb.SetDefaultRepoRequest{Index: int32(index)}, grpc.EmptyCallOption{}) if err != nil { + fmt.Fprintln(o, "Operation failed.") return err } - errorString := response.GetErrorString() - if errorString == "" { - fmt.Fprintln(o, "Default repository updated succesfully") - } else { - fmt.Fprintln(o, "Operation failed:", errorString) - } + fmt.Fprintln(o, "Default repository update succesfully") return nil } \ No newline at end of file diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 85a1427fc..2e7f5eab7 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -57,10 +57,10 @@ service Control { rpc GetWorkflowTemplates (GetWorkflowTemplatesRequest) returns (GetWorkflowTemplatesReply) {} rpc ListRepos(ListReposRequest) returns (ListReposReply) {} - rpc AddRepo(AddRepoRequest) returns (AddRepoReply) {} + rpc AddRepo(AddRepoRequest) returns (Empty) {} rpc RemoveRepo(RemoveRepoRequest) returns (RemoveRepoReply) {} - rpc RefreshRepos(RefreshReposRequest) returns (RefreshReposReply) {} - rpc SetDefaultRepo(SetDefaultRepoRequest) returns (SetDefaultRepoReply) {} + rpc RefreshRepos(RefreshReposRequest) returns (Empty) {} + rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} } //////////////////////////////////////// @@ -312,31 +312,22 @@ message AddRepoRequest { string name = 1; } -message AddRepoReply { - string errorString = 1; -} - message RemoveRepoRequest { int32 index = 1; } message RemoveRepoReply { - bool ok = 1; - string newDefaultRepo = 2; + string newDefaultRepo = 1; } message RefreshReposRequest { int32 index = 1; } -message RefreshReposReply { - string errorString = 1; -} - message SetDefaultRepoRequest { int32 index = 1; } -message SetDefaultRepoReply { - string errorString = 1; +message Empty { + } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index e4b6adda9..592957e10 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -236,7 +236,7 @@ func (manager *RepoManager) getRepoByIndex(index int) (*Repo, error) { } } -func (manager *RepoManager) RemoveRepoByIndex(index int) (bool, string) { +func (manager *RepoManager) RemoveRepoByIndex(index int) (string, error) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -244,7 +244,7 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (bool, string) { repo, err := manager.getRepoByIndex(index) if err != nil { - return false, "" + return "", err } wasDefault := repo.Default @@ -256,7 +256,7 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (bool, string) { if wasDefault && len(manager.repoList) > 0 { newDefaultRepo, err := manager.getRepoByIndex(0) if err != nil { - return false, newDefaultRepoString + return newDefaultRepoString, err } manager.setDefaultRepo(newDefaultRepo) newDefaultRepoString = newDefaultRepo.GetIdentifier() @@ -266,7 +266,7 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (bool, string) { log.Warning("Failed to update default_repo backend") } } - return true, newDefaultRepoString + return newDefaultRepoString, nil } func (manager *RepoManager) RefreshRepos() error { @@ -372,7 +372,11 @@ func (manager *RepoManager) setDefaultRepo(repo *Repo) { } func (manager *RepoManager) UpdateDefaultRepoByIndex(index int) error { - newDefaultRepo := manager.repoList[manager.GetOrderedRepolistKeys()[index]] + orderedRepoList := manager.GetOrderedRepolistKeys() + if index >= len(orderedRepoList) { + return errors.New("Default repo index out of range") + } + newDefaultRepo := manager.repoList[orderedRepoList[index]] if newDefaultRepo == nil { return errors.New("Repo not found") } else if newDefaultRepo == manager.defaultRepo { diff --git a/core/server.go b/core/server.go index b7b6c768c..2e7648c27 100644 --- a/core/server.go +++ b/core/server.go @@ -530,7 +530,7 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p return &pb.ListReposReply{Repos: repoInfos}, nil } -func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { +func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Empty, error) { m.logMethod() if req == nil { @@ -538,12 +538,11 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad } err := the.RepoManager().AddRepo(req.Name) - if err == nil { //new Repo -> refresh - return &pb.AddRepoReply{ErrorString: "" }, nil - } else { - return &pb.AddRepoReply{ErrorString: err.Error() }, nil + if err != nil { + return nil, err } + return &pb.Empty{}, nil } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { @@ -553,12 +552,16 @@ func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) ( return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - ok, newDefaultRepo := the.RepoManager().RemoveRepoByIndex(int(req.Index)) + newDefaultRepo, err := the.RepoManager().RemoveRepoByIndex(int(req.Index)) - return &pb.RemoveRepoReply{Ok: ok, NewDefaultRepo: newDefaultRepo}, nil + if err != nil { + return nil, err + } + + return &pb.RemoveRepoReply{NewDefaultRepo: newDefaultRepo}, nil } -func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposRequest) (*pb.RefreshReposReply, error) { +func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposRequest) (*pb.Empty, error) { m.logMethod() if req == nil { @@ -572,13 +575,13 @@ func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposReques err = the.RepoManager().RefreshRepoByIndex(int(req.Index)) } if err != nil { - return &pb.RefreshReposReply{ErrorString: err.Error()}, nil + return nil, err } - return &pb.RefreshReposReply{ErrorString: ""}, nil + return &pb.Empty{}, nil } -func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRequest) (*pb.SetDefaultRepoReply, error) { +func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRequest) (*pb.Empty, error) { m.logMethod() if req == nil { @@ -587,8 +590,8 @@ func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRe err := the.RepoManager().UpdateDefaultRepoByIndex(int(req.Index)) if err != nil { - return &pb.SetDefaultRepoReply{ErrorString: err.Error()}, nil - } else { - return &pb.SetDefaultRepoReply{ErrorString: ""}, nil + return nil, err } + + return &pb.Empty{}, nil } \ No newline at end of file From fb5d82010103f38f4f18789b6504237603ba63a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 18 Oct 2019 15:57:55 +0200 Subject: [PATCH 0040/2352] [core] Regenerate proto --- coconut/protos/o2control.pb.go | 827 ++++++++------------------------- core/protos/o2control.pb.go | 827 ++++++++------------------------- 2 files changed, 364 insertions(+), 1290 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 382d407ce..122978e5f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2737,53 +2737,6 @@ func (m *AddRepoRequest) GetName() string { return "" } -type AddRepoReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) -} - -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo - -func (m *AddRepoReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} - type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2795,7 +2748,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2832,8 +2785,7 @@ func (m *RemoveRepoRequest) GetIndex() int32 { } type RemoveRepoReply struct { - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - NewDefaultRepo string `protobuf:"bytes,2,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2843,7 +2795,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,13 +2824,6 @@ func (m *RemoveRepoReply) XXX_DiscardUnknown() { var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetOk() bool { - if m != nil { - return m.Ok - } - return false -} - func (m *RemoveRepoReply) GetNewDefaultRepo() string { if m != nil { return m.NewDefaultRepo @@ -2897,7 +2842,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2933,53 +2878,6 @@ func (m *RefreshReposRequest) GetIndex() int32 { return 0 } -type RefreshReposReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RefreshReposReply) Reset() { *m = RefreshReposReply{} } -func (m *RefreshReposReply) String() string { return proto.CompactTextString(m) } -func (*RefreshReposReply) ProtoMessage() {} -func (*RefreshReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *RefreshReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RefreshReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposReply.Merge(m, src) -} -func (m *RefreshReposReply) XXX_Size() int { - return m.Size() -} -func (m *RefreshReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposReply.DiscardUnknown(m) -} - -var xxx_messageInfo_RefreshReposReply proto.InternalMessageInfo - -func (m *RefreshReposReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} - type SetDefaultRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2991,7 +2889,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3027,25 +2925,24 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } -type SetDefaultRepoReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` +type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetDefaultRepoReply) Reset() { *m = SetDefaultRepoReply{} } -func (m *SetDefaultRepoReply) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoReply) ProtoMessage() {} -func (*SetDefaultRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } -func (m *SetDefaultRepoReply) XXX_Unmarshal(b []byte) error { +func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3055,24 +2952,17 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *SetDefaultRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoReply.Merge(m, src) +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) } -func (m *SetDefaultRepoReply) XXX_Size() int { +func (m *Empty) XXX_Size() int { return m.Size() } -func (m *SetDefaultRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoReply.DiscardUnknown(m) +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) } -var xxx_messageInfo_SetDefaultRepoReply proto.InternalMessageInfo - -func (m *SetDefaultRepoReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} +var xxx_messageInfo_Empty proto.InternalMessageInfo func init() { proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) @@ -3123,159 +3013,154 @@ func init() { proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*RefreshReposReply)(nil), "o2control.RefreshReposReply") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetDefaultRepoReply)(nil), "o2control.SetDefaultRepoReply") + proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2225 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xd7, 0xc8, 0x52, 0x24, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x36, 0x38, 0xde, 0x26, - 0x95, 0x4d, 0x76, 0x17, 0x67, 0xf1, 0x02, 0x9b, 0x0a, 0x0b, 0xc1, 0x96, 0x15, 0x47, 0x10, 0x5b, - 0xa9, 0x91, 0x92, 0x14, 0x5b, 0x45, 0x85, 0xb1, 0xa6, 0x65, 0x69, 0x3d, 0x9a, 0x16, 0x3d, 0x23, - 0x25, 0x39, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xa2, 0x38, 0xf2, 0x3d, 0xb8, 0x50, - 0xc0, 0x37, 0xa0, 0x42, 0x15, 0x27, 0x3e, 0x04, 0xd5, 0x7f, 0x66, 0xa6, 0x67, 0x34, 0x72, 0x5c, - 0xc5, 0x4d, 0xef, 0xf5, 0xaf, 0x5f, 0xf7, 0x7b, 0xbf, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x6b, 0xca, - 0x68, 0x40, 0xfd, 0xfb, 0x74, 0x7f, 0x40, 0xbd, 0x80, 0x51, 0x77, 0x4f, 0x28, 0x50, 0x25, 0x52, - 0xe0, 0x2d, 0xd8, 0x6c, 0xcf, 0x89, 0x17, 0xbc, 0x3a, 0x21, 0x3e, 0xf5, 0x9f, 0x10, 0x9b, 0x05, - 0x67, 0xc4, 0x0e, 0xf0, 0x1a, 0xac, 0xf6, 0x02, 0x3b, 0x98, 0xf9, 0x16, 0xf9, 0xd5, 0x8c, 0xf8, - 0x01, 0x3e, 0x83, 0x6a, 0xa8, 0x98, 0xba, 0x6f, 0xd1, 0x26, 0x14, 0xfd, 0xc0, 0x0e, 0x88, 0x69, - 0xec, 0x1a, 0x77, 0x2b, 0x96, 0x14, 0xd0, 0x8f, 0x60, 0xd5, 0x17, 0xa0, 0xe7, 0x53, 0xc7, 0x0e, - 0x88, 0x6f, 0xe6, 0x77, 0x57, 0xee, 0x56, 0xf7, 0x6f, 0xec, 0xc5, 0x3b, 0xe8, 0x69, 0xe3, 0x56, - 0x12, 0x8d, 0xff, 0x66, 0x40, 0x4d, 0x1f, 0x47, 0x9f, 0x43, 0xd1, 0x25, 0x73, 0xe2, 0x8a, 0x55, - 0xea, 0xfb, 0xdf, 0x5a, 0x62, 0x67, 0xef, 0x29, 0x07, 0x59, 0x12, 0x8b, 0x3a, 0x50, 0x9f, 0x24, - 0x9c, 0x31, 0xf3, 0xbb, 0xc6, 0xdd, 0xea, 0xfe, 0x2d, 0x6d, 0x76, 0x96, 0xcf, 0x4f, 0x72, 0x56, - 0x6a, 0x22, 0xfe, 0x1e, 0x14, 0x85, 0x69, 0x54, 0x81, 0xe2, 0x51, 0xfb, 0xf0, 0xf9, 0x71, 0x23, - 0x87, 0xca, 0x50, 0xe8, 0x9c, 0x3e, 0xee, 0x36, 0x0c, 0x54, 0x85, 0xd2, 0xcb, 0x03, 0xeb, 0xb4, - 0x73, 0x7a, 0xdc, 0xc8, 0x73, 0x44, 0xdb, 0xb2, 0xba, 0x56, 0x63, 0xe5, 0xb0, 0x04, 0x45, 0x61, - 0x1f, 0x6f, 0xc3, 0x8d, 0x63, 0x12, 0x3c, 0x66, 0xf6, 0x84, 0xbc, 0xa6, 0xec, 0xa2, 0xe3, 0x0d, - 0x69, 0x18, 0xce, 0x3f, 0x19, 0x50, 0x7a, 0x41, 0x98, 0x3f, 0xa6, 0x1e, 0x8f, 0xe5, 0xc4, 0xfe, - 0x9a, 0x32, 0xe1, 0x65, 0xd1, 0x92, 0x82, 0xd0, 0x8e, 0x3d, 0xca, 0xc4, 0xee, 0xb9, 0x96, 0x0b, - 0x5c, 0x3b, 0xb5, 0x83, 0xc1, 0xc8, 0x5c, 0x91, 0x5a, 0x21, 0x70, 0xed, 0xd9, 0x6c, 0xec, 0x3a, - 0x66, 0x41, 0xb2, 0x21, 0x04, 0xb4, 0x0b, 0xd5, 0x29, 0xa3, 0xce, 0x6c, 0x10, 0x9c, 0xda, 0x13, - 0x62, 0x16, 0xc5, 0x98, 0xae, 0x42, 0x3b, 0x00, 0x73, 0xb9, 0x89, 0x5e, 0xc0, 0xcc, 0x6b, 0x02, - 0xa0, 0x69, 0xf0, 0x37, 0x79, 0xb8, 0xbe, 0xe8, 0x01, 0xe7, 0x7f, 0x17, 0xaa, 0xc3, 0x48, 0xeb, - 0xa8, 0x2c, 0xd0, 0x55, 0xe8, 0x53, 0x58, 0x27, 0xde, 0x7c, 0xcc, 0xa8, 0x37, 0x21, 0x5e, 0xe0, - 0xb7, 0xe8, 0xcc, 0x0b, 0x94, 0x2f, 0x8b, 0x03, 0x7c, 0x27, 0x81, 0xed, 0x5f, 0x28, 0x98, 0x74, - 0x4e, 0xd3, 0xc4, 0xf9, 0x56, 0xd0, 0xf3, 0x6d, 0x07, 0x60, 0x44, 0xfd, 0xd0, 0x78, 0x51, 0xce, - 0x8a, 0x35, 0x08, 0x43, 0x6d, 0xec, 0xf9, 0x81, 0xed, 0x0d, 0x88, 0x08, 0x81, 0xf4, 0x30, 0xa1, - 0x43, 0x9f, 0x42, 0x49, 0x79, 0x6c, 0x96, 0x44, 0x9e, 0x20, 0x2d, 0x4f, 0x14, 0x45, 0x56, 0x08, - 0xc1, 0xf7, 0x60, 0xad, 0x4f, 0x6c, 0xe6, 0xd0, 0xd7, 0x9e, 0xa2, 0x12, 0x6d, 0xc1, 0x35, 0x46, - 0x6c, 0x9f, 0x7a, 0x2a, 0x0a, 0x4a, 0xe2, 0x47, 0x28, 0x86, 0x4e, 0xdd, 0xb7, 0xd8, 0x84, 0xad, - 0x63, 0x12, 0xb4, 0x35, 0xdf, 0xc3, 0x6c, 0x78, 0x03, 0x9b, 0x0b, 0x23, 0x57, 0x8b, 0xf2, 0x8f, - 0xa1, 0xa6, 0x07, 0x53, 0x1d, 0xb8, 0xa6, 0x9e, 0xea, 0xf1, 0xb0, 0xa0, 0x2f, 0x81, 0xc7, 0xff, - 0x34, 0x60, 0x2d, 0x85, 0x40, 0x75, 0xc8, 0x8f, 0xc3, 0xc5, 0xf2, 0x63, 0x91, 0x47, 0x03, 0x46, - 0xec, 0x80, 0x38, 0x2f, 0x47, 0xc4, 0x13, 0x1c, 0x56, 0x2c, 0x5d, 0x15, 0xb3, 0xb3, 0xa2, 0xb3, - 0xb3, 0x07, 0x45, 0xc1, 0xa0, 0x59, 0x10, 0x9b, 0x32, 0xf5, 0xd3, 0x3b, 0xa2, 0x2c, 0xe8, 0xdb, - 0xbe, 0xcc, 0x28, 0x09, 0x43, 0x4d, 0x28, 0x33, 0x4a, 0x03, 0x8b, 0xba, 0x61, 0xb2, 0x46, 0x32, - 0xfa, 0x18, 0x1a, 0x83, 0x19, 0x63, 0xc4, 0x0b, 0xac, 0x99, 0x77, 0x3a, 0x9b, 0x9c, 0x11, 0x99, - 0xaf, 0xab, 0xd6, 0x82, 0x1e, 0xb7, 0xe0, 0xfa, 0x29, 0x79, 0xad, 0x79, 0x15, 0x32, 0xf5, 0x31, - 0x34, 0x78, 0xd8, 0x86, 0x2e, 0x7d, 0xdd, 0x27, 0x93, 0xa9, 0x1b, 0xd7, 0xaf, 0x05, 0x3d, 0xee, - 0xc1, 0x46, 0xda, 0x08, 0x67, 0xe4, 0x4b, 0xa8, 0x6a, 0xf1, 0x13, 0xb3, 0x2f, 0x0f, 0xb7, 0x0e, - 0xc7, 0x1f, 0x89, 0xe3, 0x94, 0xb1, 0xb3, 0x54, 0xc8, 0xf1, 0x6f, 0x0c, 0xd8, 0x48, 0x23, 0xff, - 0xef, 0xe5, 0xd1, 0x7d, 0x28, 0x87, 0x7e, 0xaa, 0x9a, 0xb8, 0xa1, 0x4d, 0xe5, 0x71, 0x16, 0x73, - 0x22, 0x10, 0xfe, 0xbb, 0x01, 0xdb, 0x2d, 0x39, 0xfc, 0xfe, 0x4d, 0xa3, 0x47, 0x50, 0x08, 0xde, - 0x4e, 0x89, 0x30, 0x5d, 0xdf, 0xff, 0x44, 0x33, 0xbd, 0xd4, 0xc6, 0x5e, 0x77, 0xca, 0xa7, 0x58, - 0x62, 0x22, 0xb6, 0xe1, 0x9a, 0x94, 0x79, 0x91, 0x3d, 0xed, 0x76, 0x9f, 0x35, 0x72, 0x08, 0x41, - 0xbd, 0xd7, 0x3f, 0xb0, 0xfa, 0xaf, 0x0e, 0x5a, 0xfd, 0xce, 0x8b, 0x4e, 0xff, 0xe7, 0x0d, 0x03, - 0xad, 0xc3, 0x6a, 0xaf, 0xdf, 0x7d, 0x16, 0xab, 0xf2, 0x68, 0x15, 0x2a, 0xad, 0xee, 0xe9, 0xe3, - 0xce, 0xf1, 0x73, 0xab, 0xdd, 0x58, 0xe1, 0xd5, 0xd8, 0x6a, 0xf7, 0xda, 0xfd, 0x46, 0x01, 0xd5, - 0xa0, 0x7c, 0xdc, 0x7d, 0x25, 0x6b, 0x73, 0x11, 0x5f, 0xc0, 0x8d, 0xac, 0xcd, 0xf0, 0xd8, 0xa6, - 0xdd, 0x89, 0x92, 0x3a, 0xaf, 0x27, 0x75, 0x56, 0x22, 0xae, 0x2c, 0x49, 0xc4, 0xdf, 0x1b, 0x60, - 0x9e, 0x50, 0x67, 0x3c, 0x7c, 0x7b, 0xa5, 0xe8, 0x01, 0x9d, 0x12, 0x66, 0x07, 0x63, 0xea, 0x85, - 0xe7, 0xf8, 0x56, 0x36, 0xb3, 0xdd, 0x10, 0x67, 0x69, 0x53, 0xd0, 0x1d, 0xa8, 0x33, 0x32, 0xa0, - 0xde, 0x70, 0x7c, 0x3e, 0x63, 0xe4, 0xc0, 0x75, 0xc5, 0xbe, 0xca, 0x56, 0x4a, 0x8b, 0xff, 0x68, - 0xc0, 0x66, 0x96, 0x31, 0xf4, 0x50, 0xf1, 0x27, 0x9b, 0xed, 0x9d, 0xf7, 0xac, 0x9d, 0xa0, 0x4e, - 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x7c, 0x78, 0x76, 0xa5, 0x8c, 0xbf, 0x9b, 0x41, 0xeb, 0x1a, 0x54, - 0xad, 0xf6, 0x49, 0xf7, 0x45, 0xfb, 0x95, 0xd5, 0x7d, 0xca, 0x19, 0xab, 0x41, 0xf9, 0xe0, 0xe8, - 0x48, 0x4a, 0x05, 0xfc, 0x5b, 0x03, 0xb6, 0x32, 0x22, 0xc7, 0x69, 0xfa, 0x19, 0x34, 0x86, 0xf6, - 0xd8, 0x25, 0x4e, 0x37, 0x8e, 0x96, 0x71, 0xb5, 0x68, 0x2d, 0x4c, 0x54, 0x24, 0xe4, 0x17, 0x39, - 0xd7, 0x0b, 0x19, 0xee, 0xc0, 0xf6, 0x11, 0xf1, 0x03, 0x46, 0xaf, 0xc2, 0xe3, 0x4d, 0xa8, 0x5c, - 0x10, 0x32, 0xed, 0x8b, 0xca, 0x97, 0x17, 0x0c, 0xc4, 0x0a, 0x4c, 0xe0, 0x46, 0x96, 0x29, 0xee, - 0xd8, 0x4f, 0x61, 0x7d, 0xe0, 0x12, 0xdb, 0x9b, 0x49, 0xa8, 0x50, 0xaa, 0x13, 0x7e, 0x53, 0x3f, - 0x4b, 0x69, 0x8c, 0xb5, 0x38, 0x0d, 0xff, 0xc7, 0x80, 0xd5, 0x44, 0x8d, 0x45, 0x08, 0x0a, 0x1e, - 0x27, 0x47, 0x6e, 0x54, 0xfc, 0xe6, 0x9d, 0xcb, 0xa5, 0x83, 0x0b, 0xe2, 0xa8, 0x7d, 0x2a, 0x89, - 0xeb, 0x79, 0x45, 0xee, 0x38, 0x2a, 0x0c, 0x4a, 0xe2, 0x7a, 0x79, 0x61, 0x53, 0x5d, 0x58, 0x49, - 0x71, 0xd4, 0x8a, 0xfa, 0x49, 0xb9, 0x09, 0x95, 0x81, 0x6b, 0xfb, 0xbe, 0xd6, 0x79, 0x63, 0x05, - 0x6a, 0x43, 0xdd, 0x21, 0x53, 0x97, 0xbe, 0x0d, 0x4b, 0x95, 0xea, 0xbe, 0xfa, 0x1d, 0x8f, 0x6f, - 0xfe, 0x28, 0x01, 0xb2, 0x52, 0x93, 0x78, 0xa1, 0x44, 0x8b, 0x30, 0x9e, 0x8e, 0xfc, 0x1a, 0xa0, - 0x79, 0x1c, 0xc9, 0xc8, 0x84, 0x92, 0x7d, 0xce, 0x81, 0x21, 0xf1, 0xa1, 0xc8, 0x47, 0xe8, 0x70, - 0x48, 0x58, 0xe4, 0x78, 0x28, 0xf2, 0x8b, 0x06, 0x79, 0x43, 0x06, 0xb3, 0x80, 0xf2, 0x41, 0xe9, - 0xbd, 0xa6, 0xc1, 0xeb, 0xb0, 0x76, 0x4c, 0x02, 0x45, 0x80, 0xec, 0xe9, 0x8f, 0x60, 0x35, 0x56, - 0x71, 0x7e, 0xa3, 0x76, 0x68, 0x5c, 0xa9, 0x1d, 0xe2, 0xbb, 0x50, 0x57, 0x06, 0xb4, 0x9b, 0x86, - 0xe2, 0xc5, 0xd0, 0x79, 0xc1, 0x5f, 0x40, 0x2d, 0x42, 0xf2, 0x95, 0x3e, 0x82, 0x02, 0x1f, 0x51, - 0xc9, 0xb3, 0x91, 0x8a, 0xa8, 0x58, 0x43, 0x00, 0x70, 0x1b, 0x56, 0xb9, 0xa6, 0xc5, 0x59, 0x59, - 0x9a, 0x25, 0xbc, 0xfd, 0xcb, 0xe9, 0x27, 0xd4, 0x21, 0x51, 0xfb, 0x8f, 0x55, 0xf8, 0xd7, 0x50, - 0x6d, 0xd1, 0xc9, 0xc4, 0xf6, 0x1c, 0x61, 0xa4, 0x01, 0x2b, 0xc4, 0x9b, 0x0b, 0x37, 0x2b, 0x16, - 0xff, 0x29, 0x12, 0x64, 0x44, 0x5c, 0x57, 0xe5, 0x99, 0x14, 0xb8, 0x76, 0x6e, 0xbb, 0xb3, 0xe8, - 0xb0, 0x09, 0x81, 0xa7, 0x8d, 0xcd, 0xce, 0x67, 0xf2, 0x3a, 0x53, 0x10, 0x36, 0x62, 0x05, 0xdf, - 0xe0, 0xcc, 0x27, 0x4c, 0x65, 0x9a, 0xf8, 0x8d, 0x4f, 0xa0, 0xda, 0x1a, 0xd9, 0x9e, 0x47, 0xdc, - 0xa5, 0x3e, 0x20, 0xad, 0x35, 0x55, 0x54, 0xc9, 0x12, 0xd1, 0x64, 0xe7, 0x24, 0x88, 0xb3, 0x9c, - 0x4b, 0xf8, 0xbf, 0x79, 0x28, 0x47, 0xc7, 0xe6, 0x07, 0x50, 0xf1, 0x39, 0x39, 0x22, 0x43, 0x65, - 0x3c, 0x97, 0x13, 0x17, 0x43, 0xf9, 0xbc, 0x41, 0x18, 0x55, 0xd5, 0x6b, 0xcd, 0x14, 0x0f, 0x51, - 0xd4, 0xad, 0x18, 0x8a, 0x7e, 0x02, 0x6b, 0x63, 0xef, 0x8c, 0xce, 0x3c, 0x47, 0xb9, 0xe4, 0x9b, - 0x2b, 0x22, 0x5d, 0xb6, 0xf4, 0x12, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x10, 0x1a, 0x74, 0x16, - 0x24, 0x4d, 0x14, 0x2e, 0x35, 0xb1, 0x80, 0x47, 0x0f, 0x38, 0xe5, 0x11, 0xa1, 0x22, 0xd8, 0xa9, - 0xe9, 0xf1, 0xa8, 0xa5, 0x43, 0xf9, 0xc1, 0xe3, 0x99, 0xf5, 0xcc, 0x0e, 0x46, 0xea, 0xcc, 0x47, - 0x32, 0xe7, 0x9b, 0x78, 0xf3, 0x8e, 0x23, 0x4e, 0x7a, 0xc5, 0x92, 0x02, 0xbe, 0x0f, 0x1b, 0xc9, - 0x92, 0x26, 0x73, 0xdd, 0x84, 0x92, 0xcc, 0x6e, 0x5f, 0x25, 0x52, 0x28, 0xe2, 0xdf, 0x19, 0xb0, - 0xbe, 0x50, 0x04, 0xd1, 0x43, 0xa8, 0x5e, 0x8c, 0x5d, 0x97, 0x38, 0xfd, 0x2b, 0x9d, 0x31, 0x1d, - 0x8c, 0xbe, 0x84, 0x1a, 0x9b, 0x79, 0xde, 0xd8, 0x3b, 0x0f, 0xab, 0xf6, 0xe5, 0x93, 0x13, 0x68, - 0xdc, 0x12, 0x67, 0x9f, 0xdf, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x53, - 0x3b, 0x18, 0xf5, 0xa6, 0x64, 0x10, 0xf6, 0xc8, 0x50, 0xc6, 0x7f, 0x31, 0xa0, 0x1c, 0x5e, 0xc0, - 0x96, 0xd5, 0x6a, 0x55, 0x7b, 0xf3, 0xd9, 0xb5, 0x37, 0x71, 0xf5, 0x6e, 0x42, 0x79, 0x38, 0x73, - 0x5d, 0x41, 0x83, 0xac, 0x56, 0x91, 0xac, 0x47, 0xb6, 0x98, 0x88, 0x2c, 0xba, 0x07, 0x45, 0xde, - 0xb4, 0x7d, 0xf3, 0x9a, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x43, 0x51, 0xdd, 0x94, 0xd3, - 0x3c, 0xfe, 0xd1, 0x5c, 0xe3, 0xbd, 0x73, 0xff, 0x6c, 0xc0, 0x07, 0xc7, 0x24, 0x78, 0x99, 0xba, - 0x72, 0x47, 0xd1, 0xdb, 0x85, 0x2a, 0x23, 0x53, 0xfa, 0xcc, 0x0e, 0x02, 0xc2, 0xc2, 0x57, 0x95, - 0xae, 0x42, 0x77, 0x61, 0x8d, 0x91, 0xf9, 0x98, 0xbf, 0xc8, 0x42, 0x94, 0x8c, 0x4a, 0x5a, 0xcd, - 0x6d, 0xd9, 0xae, 0x7b, 0xc8, 0x6c, 0x6f, 0x30, 0x22, 0xbe, 0xba, 0x11, 0xe9, 0x2a, 0xd1, 0x0e, - 0x5c, 0xb7, 0x6f, 0x9f, 0xcb, 0xae, 0x56, 0xb6, 0x42, 0x11, 0x9f, 0xc1, 0x66, 0x7a, 0x8f, 0x21, - 0x3d, 0x7c, 0x33, 0x21, 0x3d, 0xfc, 0xb7, 0xc8, 0xfb, 0xf0, 0x49, 0xa1, 0xb8, 0x0d, 0x65, 0x71, - 0x37, 0x52, 0xdb, 0x52, 0x2c, 0x45, 0x32, 0xfe, 0x1a, 0xb6, 0xb3, 0x43, 0xc1, 0x63, 0x7a, 0x02, - 0xeb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0x6b, 0x93, 0xd6, 0xe2, 0x4c, 0x8c, 0xa0, 0xf1, 0x74, - 0xec, 0xf3, 0xdb, 0x06, 0x8d, 0xba, 0xd4, 0x03, 0x28, 0x73, 0x79, 0x69, 0xda, 0x99, 0x50, 0x72, - 0xc8, 0xd0, 0x9e, 0xb9, 0x81, 0xaa, 0xdd, 0xa1, 0x88, 0x7f, 0x08, 0x75, 0xcd, 0x5a, 0x98, 0x02, - 0x5c, 0xca, 0x4a, 0x01, 0xb5, 0x86, 0x25, 0x11, 0xf8, 0x36, 0xd4, 0x0f, 0x1c, 0x87, 0x6b, 0x43, - 0xd2, 0x33, 0x16, 0xc7, 0x9f, 0x41, 0x2d, 0x42, 0xa9, 0xe7, 0x30, 0x61, 0x8c, 0xb2, 0x5e, 0xc0, - 0xc6, 0xde, 0x79, 0x98, 0x18, 0x9a, 0x0a, 0xdf, 0x83, 0x75, 0x8b, 0x4c, 0xe8, 0x9c, 0xe8, 0xa6, - 0x37, 0xa1, 0x38, 0xf6, 0x1c, 0xf2, 0x26, 0xfc, 0xbe, 0x22, 0x04, 0xdc, 0x81, 0x35, 0x1d, 0xaa, - 0x5e, 0x00, 0x54, 0x76, 0xcd, 0xb2, 0x95, 0xa7, 0x17, 0xfc, 0x46, 0xed, 0x91, 0xd7, 0x47, 0xd2, - 0x61, 0x0e, 0x53, 0xd4, 0xa6, 0xb4, 0xf8, 0x13, 0xd8, 0xb0, 0xc8, 0x90, 0x11, 0x7f, 0xa4, 0xc7, - 0x76, 0xc9, 0xba, 0xdf, 0xe7, 0x5b, 0xd4, 0xc1, 0x57, 0xf3, 0xec, 0x3b, 0x70, 0xbd, 0x47, 0x02, - 0x6d, 0xd5, 0xcb, 0x57, 0xf9, 0x02, 0x36, 0xd2, 0xf0, 0x2b, 0xad, 0xb3, 0xff, 0x4d, 0x0d, 0x4a, - 0xea, 0x85, 0x84, 0x5a, 0x50, 0xed, 0x33, 0x7b, 0x70, 0x21, 0xbf, 0xb5, 0x21, 0x73, 0xe1, 0xf3, - 0x9b, 0xda, 0x43, 0x73, 0x2b, 0x63, 0x84, 0x5f, 0x43, 0x73, 0x9f, 0x19, 0xe8, 0x2b, 0x68, 0xa4, - 0x3f, 0x21, 0x21, 0xac, 0xe1, 0x97, 0x7c, 0x21, 0x6b, 0xee, 0x5e, 0x8a, 0x11, 0xd6, 0xd1, 0x21, - 0x94, 0xc3, 0x4f, 0x2c, 0x48, 0x7f, 0x05, 0xa7, 0x3e, 0xd1, 0x34, 0xcd, 0xcc, 0x31, 0x69, 0xe3, - 0xa5, 0x28, 0xdf, 0xfa, 0xb7, 0x17, 0xf4, 0x61, 0x72, 0xe9, 0x8c, 0x2f, 0x36, 0xcd, 0x5b, 0x97, - 0x41, 0xa4, 0xe1, 0x3e, 0xd4, 0x93, 0x5f, 0x10, 0x90, 0xee, 0x52, 0xe6, 0x17, 0x8a, 0xe6, 0xce, - 0x25, 0x88, 0xc8, 0x6a, 0x72, 0x3d, 0xb4, 0xbb, 0x74, 0x2b, 0x59, 0x56, 0x33, 0xbe, 0x2a, 0xe0, - 0x1c, 0xfa, 0x25, 0xa0, 0xc5, 0x67, 0x31, 0xba, 0x7d, 0x95, 0x27, 0x7c, 0x13, 0xbf, 0x07, 0x25, - 0x57, 0xf8, 0x05, 0xac, 0x2f, 0x3c, 0xe8, 0xd0, 0xb7, 0xb5, 0xa9, 0xcb, 0x1e, 0xca, 0xcd, 0x0f, - 0x2f, 0x07, 0x45, 0x0e, 0x2c, 0xbe, 0xab, 0x12, 0x0e, 0x2c, 0x7d, 0xc1, 0x25, 0x1c, 0x58, 0xf2, - 0x38, 0x93, 0xb9, 0x16, 0xde, 0xe7, 0x13, 0xb9, 0x96, 0xba, 0xf7, 0x27, 0x72, 0x2d, 0xf1, 0x00, - 0xc0, 0x39, 0xf4, 0x08, 0x4a, 0x4a, 0x85, 0xb6, 0x17, 0x61, 0xa1, 0x85, 0x1b, 0x59, 0x43, 0xd2, - 0xc0, 0x29, 0xd4, 0xf4, 0xab, 0x0f, 0xda, 0x59, 0xfa, 0x30, 0x94, 0xa6, 0x2e, 0x7d, 0x38, 0x46, - 0x4e, 0x89, 0x36, 0x9e, 0x76, 0x4a, 0xbf, 0xd0, 0xa4, 0x9d, 0x8a, 0xfb, 0x3e, 0xce, 0xa1, 0xa1, - 0xf8, 0x78, 0xb9, 0xd0, 0xc2, 0xd0, 0x9d, 0xe4, 0x9c, 0x65, 0xed, 0xbe, 0x79, 0xfb, 0xbd, 0x38, - 0xb9, 0x4e, 0x1b, 0x2a, 0x51, 0xc3, 0x41, 0x1f, 0x68, 0x93, 0xd2, 0x4d, 0xad, 0xb9, 0x9d, 0x3d, - 0x18, 0x71, 0xa0, 0x9a, 0x4a, 0x82, 0x83, 0x64, 0x3b, 0x4a, 0x70, 0xa0, 0xf7, 0x20, 0x9c, 0x43, - 0x4f, 0x00, 0xe2, 0xc6, 0x81, 0x6e, 0x26, 0xba, 0x5c, 0xaa, 0xf5, 0x34, 0x9b, 0x4b, 0x46, 0x23, - 0x36, 0xf5, 0x56, 0x90, 0x60, 0x33, 0xa3, 0xa1, 0x34, 0x6f, 0x2e, 0x1d, 0x8f, 0x6a, 0x43, 0xb2, - 0xe8, 0x27, 0x6a, 0x43, 0x66, 0xfb, 0x48, 0xd4, 0x86, 0x8c, 0x8e, 0x81, 0x73, 0x87, 0x0f, 0xfe, - 0xfa, 0x6e, 0xc7, 0xf8, 0xc7, 0xbb, 0x1d, 0xe3, 0x5f, 0xef, 0x76, 0x8c, 0x3f, 0xfc, 0x7b, 0x27, - 0x07, 0x78, 0x30, 0xda, 0x1b, 0x10, 0xe6, 0xed, 0xd9, 0xee, 0x78, 0x40, 0xf6, 0xe8, 0xfe, 0x5e, - 0x68, 0x81, 0x4d, 0x07, 0x3e, 0x61, 0x73, 0xc2, 0xbe, 0xca, 0x4f, 0xcf, 0xce, 0xae, 0x89, 0xbf, - 0x9b, 0x3e, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x63, 0x43, 0xc7, 0x88, 0x1a, 0x00, - 0x00, + // 2185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x6f, 0x1b, 0x4b, + 0x15, 0xcf, 0x3a, 0x76, 0x6c, 0x1f, 0x27, 0x8e, 0x33, 0x49, 0x93, 0x8d, 0x6f, 0x49, 0x73, 0x87, + 0xaa, 0x37, 0xbd, 0xf7, 0x92, 0x42, 0x2e, 0x82, 0x52, 0x2e, 0x94, 0xc4, 0x71, 0x53, 0x43, 0x13, + 0x57, 0x1b, 0xb7, 0x15, 0x57, 0x42, 0x65, 0xe3, 0x1d, 0xc7, 0x6e, 0xd6, 0x3b, 0x66, 0x77, 0xec, + 0x34, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x0f, 0xbc, 0xf0, 0x8a, 0x10, 0x8f, 0x7c, 0x0f, 0x5e, 0x10, + 0xf0, 0x0d, 0x50, 0x91, 0x78, 0x42, 0x7c, 0x06, 0x34, 0x7f, 0x76, 0x77, 0x76, 0xbd, 0x4e, 0x22, + 0xf1, 0xe6, 0x73, 0xe6, 0x77, 0xce, 0x9c, 0x7f, 0x73, 0xce, 0xcc, 0x1a, 0xd6, 0x47, 0x3e, 0x65, + 0x34, 0x78, 0x44, 0xf7, 0xba, 0xd4, 0x63, 0x3e, 0x75, 0x77, 0x05, 0x03, 0x95, 0x23, 0x06, 0x5e, + 0x87, 0xb5, 0xe6, 0x84, 0x78, 0xec, 0xed, 0x31, 0x09, 0x68, 0xf0, 0x9c, 0xd8, 0x3e, 0x3b, 0x23, + 0x36, 0xc3, 0xcb, 0xb0, 0x74, 0xca, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0x8b, 0x31, 0x09, 0x18, 0x3e, + 0x83, 0x4a, 0xc8, 0x18, 0xb9, 0x57, 0x68, 0x0d, 0x0a, 0x01, 0xb3, 0x19, 0x31, 0x8d, 0x6d, 0x63, + 0xa7, 0x6c, 0x49, 0x02, 0xfd, 0x00, 0x96, 0x02, 0x01, 0x7a, 0x35, 0x72, 0x6c, 0x46, 0x02, 0x33, + 0xb7, 0x3d, 0xbf, 0x53, 0xd9, 0xdb, 0xd8, 0x8d, 0x2d, 0x38, 0xd5, 0xd6, 0xad, 0x24, 0x1a, 0xff, + 0xd5, 0x80, 0x45, 0x7d, 0x1d, 0x7d, 0x01, 0x05, 0x97, 0x4c, 0x88, 0x2b, 0x76, 0xa9, 0xee, 0x7d, + 0x6d, 0x86, 0x9e, 0xdd, 0x17, 0x1c, 0x64, 0x49, 0x2c, 0x6a, 0x41, 0x75, 0x98, 0x70, 0xc6, 0xcc, + 0x6d, 0x1b, 0x3b, 0x95, 0xbd, 0x7b, 0x9a, 0x74, 0x96, 0xcf, 0xcf, 0xe7, 0xac, 0x94, 0x20, 0xfe, + 0x36, 0x14, 0x84, 0x6a, 0x54, 0x86, 0xc2, 0x61, 0xf3, 0xe0, 0xd5, 0x51, 0x6d, 0x0e, 0x95, 0x20, + 0xdf, 0x3a, 0x79, 0xd6, 0xae, 0x19, 0xa8, 0x02, 0xc5, 0x37, 0xfb, 0xd6, 0x49, 0xeb, 0xe4, 0xa8, + 0x96, 0xe3, 0x88, 0xa6, 0x65, 0xb5, 0xad, 0xda, 0xfc, 0x41, 0x11, 0x0a, 0x42, 0x3f, 0xde, 0x84, + 0x8d, 0x23, 0xc2, 0x9e, 0xf9, 0xf6, 0x90, 0x5c, 0x52, 0xff, 0xa2, 0xe5, 0xf5, 0x68, 0x18, 0xce, + 0x3f, 0x1a, 0x50, 0x7c, 0x4d, 0xfc, 0x60, 0x40, 0x3d, 0x1e, 0xcb, 0xa1, 0xfd, 0x8e, 0xfa, 0xc2, + 0xcb, 0x82, 0x25, 0x09, 0xc1, 0x1d, 0x78, 0xd4, 0x17, 0xd6, 0x73, 0x2e, 0x27, 0x38, 0x77, 0x64, + 0xb3, 0x6e, 0xdf, 0x9c, 0x97, 0x5c, 0x41, 0x70, 0xee, 0xd9, 0x78, 0xe0, 0x3a, 0x66, 0x5e, 0x66, + 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb1, 0x87, 0xc4, 0x2c, 0x88, + 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x88, 0x53, 0xe6, 0x9b, 0x0b, 0x02, 0xa0, 0x71, 0xf0, + 0x6f, 0x73, 0x70, 0x67, 0xda, 0x03, 0x9e, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, 0xa3, 0xaa, 0x40, + 0x67, 0xa1, 0xcf, 0x61, 0x85, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, 0xd0, 0xa0, 0x63, + 0x8f, 0x29, 0x5f, 0xa6, 0x17, 0xb8, 0x25, 0xcc, 0x0e, 0x2e, 0x14, 0x4c, 0x3a, 0xa7, 0x71, 0xe2, + 0x7a, 0xcb, 0xeb, 0xf5, 0xb6, 0x05, 0xd0, 0xa7, 0x41, 0xa8, 0xbc, 0x20, 0xa5, 0x62, 0x0e, 0xc2, + 0xb0, 0x38, 0xf0, 0x02, 0x66, 0x7b, 0x5d, 0x22, 0x42, 0x20, 0x3d, 0x4c, 0xf0, 0xd0, 0xe7, 0x50, + 0x54, 0x1e, 0x9b, 0x45, 0x51, 0x27, 0x48, 0xab, 0x13, 0x95, 0x22, 0x2b, 0x84, 0xe0, 0x87, 0xb0, + 0xdc, 0x21, 0xb6, 0xef, 0xd0, 0x4b, 0x4f, 0xa5, 0x12, 0xad, 0xc3, 0x82, 0x4f, 0xec, 0x80, 0x7a, + 0x2a, 0x0a, 0x8a, 0xe2, 0x47, 0x28, 0x86, 0x8e, 0xdc, 0x2b, 0x6c, 0xc2, 0xfa, 0x11, 0x61, 0x4d, + 0xcd, 0xf7, 0xb0, 0x1a, 0xde, 0xc3, 0xda, 0xd4, 0xca, 0xed, 0xa2, 0xfc, 0x43, 0x58, 0xd4, 0x83, + 0xa9, 0x0e, 0x5c, 0x5d, 0x2f, 0xf5, 0x78, 0x59, 0xa4, 0x2f, 0x81, 0xc7, 0xff, 0x30, 0x60, 0x39, + 0x85, 0x40, 0x55, 0xc8, 0x0d, 0xc2, 0xcd, 0x72, 0x03, 0x51, 0x47, 0x5d, 0x9f, 0xd8, 0x8c, 0x38, + 0x6f, 0xfa, 0xc4, 0x13, 0x39, 0x2c, 0x5b, 0x3a, 0x2b, 0xce, 0xce, 0xbc, 0x9e, 0x9d, 0x5d, 0x28, + 0x88, 0x0c, 0x9a, 0x79, 0x61, 0x94, 0xa9, 0x9f, 0xde, 0x3e, 0xf5, 0x59, 0xc7, 0x0e, 0x64, 0x45, + 0x49, 0x18, 0xaa, 0x43, 0xc9, 0xa7, 0x94, 0x59, 0xd4, 0x0d, 0x8b, 0x35, 0xa2, 0xd1, 0xa7, 0x50, + 0xeb, 0x8e, 0x7d, 0x9f, 0x78, 0xcc, 0x1a, 0x7b, 0x27, 0xe3, 0xe1, 0x19, 0x91, 0xf5, 0xba, 0x64, + 0x4d, 0xf1, 0x71, 0x03, 0xee, 0x9c, 0x90, 0x4b, 0xcd, 0xab, 0x30, 0x53, 0x9f, 0x42, 0x8d, 0x87, + 0xad, 0xe7, 0xd2, 0xcb, 0x0e, 0x19, 0x8e, 0xdc, 0xb8, 0x7f, 0x4d, 0xf1, 0xf1, 0x29, 0xac, 0xa6, + 0x95, 0xf0, 0x8c, 0x7c, 0x09, 0x15, 0x2d, 0x7e, 0x42, 0xfa, 0xfa, 0x70, 0xeb, 0x70, 0xfc, 0x89, + 0x38, 0x4e, 0x19, 0x96, 0xa5, 0x42, 0x8e, 0x7f, 0x65, 0xc0, 0x6a, 0x1a, 0xf9, 0x7f, 0x6f, 0x8f, + 0x1e, 0x41, 0x29, 0xf4, 0x53, 0xf5, 0xc4, 0x55, 0x4d, 0x94, 0xc7, 0x59, 0xc8, 0x44, 0x20, 0xfc, + 0x37, 0x03, 0x36, 0x1b, 0x72, 0xf9, 0x66, 0xa3, 0xd1, 0x53, 0xc8, 0xb3, 0xab, 0x11, 0x11, 0xaa, + 0xab, 0x7b, 0x9f, 0x69, 0xaa, 0x67, 0xea, 0xd8, 0x6d, 0x8f, 0xb8, 0x88, 0x25, 0x04, 0xb1, 0x0d, + 0x0b, 0x92, 0xe6, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0x59, 0x9b, 0x43, 0x08, 0xaa, 0xa7, 0x9d, 0x7d, + 0xab, 0xf3, 0x76, 0xbf, 0xd1, 0x69, 0xbd, 0x6e, 0x75, 0x7e, 0x5a, 0x33, 0xd0, 0x0a, 0x2c, 0x9d, + 0x76, 0xda, 0x2f, 0x63, 0x56, 0x0e, 0x2d, 0x41, 0xb9, 0xd1, 0x3e, 0x79, 0xd6, 0x3a, 0x7a, 0x65, + 0x35, 0x6b, 0xf3, 0xbc, 0x1b, 0x5b, 0xcd, 0xd3, 0x66, 0xa7, 0x96, 0x47, 0x8b, 0x50, 0x3a, 0x6a, + 0xbf, 0x95, 0xbd, 0xb9, 0x80, 0x2f, 0x60, 0x23, 0xcb, 0x18, 0x1e, 0xdb, 0xb4, 0x3b, 0x51, 0x51, + 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x19, 0x85, 0xf8, 0x3b, 0x03, 0xcc, 0x63, 0xea, 0x0c, + 0x7a, 0x57, 0xb7, 0x8a, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, 0x78, 0x8e, 0xef, 0x65, + 0x67, 0xb6, 0x1d, 0xe2, 0x2c, 0x4d, 0x04, 0x3d, 0x80, 0xaa, 0x4f, 0xba, 0xd4, 0xeb, 0x0d, 0xce, + 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0x61, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0x1f, 0x0c, 0x58, 0xcb, 0x52, + 0x86, 0x9e, 0xa8, 0xfc, 0xc9, 0x61, 0xfb, 0xe0, 0x86, 0xbd, 0x13, 0xa9, 0x93, 0x67, 0xd7, 0x95, + 0x5d, 0x36, 0x17, 0x9e, 0x5d, 0x49, 0xe3, 0x6f, 0x65, 0xa4, 0x75, 0x19, 0x2a, 0x56, 0xf3, 0xb8, + 0xfd, 0xba, 0xf9, 0xd6, 0x6a, 0xbf, 0xe0, 0x19, 0x5b, 0x84, 0xd2, 0xfe, 0xe1, 0xa1, 0xa4, 0xf2, + 0xf8, 0xd7, 0x06, 0xac, 0x67, 0x44, 0x8e, 0xa7, 0xe9, 0x27, 0x50, 0xeb, 0xd9, 0x03, 0x97, 0x38, + 0xed, 0x38, 0x5a, 0xc6, 0xed, 0xa2, 0x35, 0x25, 0xa8, 0x92, 0x90, 0x9b, 0xce, 0xb9, 0xde, 0xc8, + 0x70, 0x0b, 0x36, 0x0f, 0x49, 0xc0, 0x7c, 0x7a, 0x9b, 0x3c, 0xde, 0x85, 0xf2, 0x05, 0x21, 0xa3, + 0x8e, 0xe8, 0x7c, 0x39, 0x91, 0x81, 0x98, 0x81, 0x09, 0x6c, 0x64, 0xa9, 0xe2, 0x8e, 0xfd, 0x18, + 0x56, 0xba, 0x2e, 0xb1, 0xbd, 0xb1, 0x84, 0x0a, 0xa6, 0x3a, 0xe1, 0x77, 0xf5, 0xb3, 0x94, 0xc6, + 0x58, 0xd3, 0x62, 0xf8, 0xdf, 0x06, 0x2c, 0x25, 0x7a, 0x2c, 0x42, 0x90, 0xf7, 0x78, 0x72, 0xa4, + 0xa1, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xd9, 0xa9, 0x28, 0xce, 0xe7, 0x1d, + 0xb9, 0xe5, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, 0x51, 0x2b, + 0xe8, 0x27, 0xe5, 0x2e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, 0x09, 0x55, + 0x87, 0x8c, 0x5c, 0x7a, 0x15, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, 0x30, 0x01, + 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, 0x8e, 0x68, + 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, 0xfc, 0xc8, + 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x9e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, 0xc6, 0xc1, + 0x2b, 0xb0, 0x7c, 0x44, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x61, 0x29, 0x66, 0xf1, 0xfc, 0x46, + 0xe3, 0xd0, 0xb8, 0xd5, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, 0x8b, 0xa1, + 0xe7, 0x05, 0x7f, 0x17, 0x16, 0x23, 0x24, 0xdf, 0xe9, 0x13, 0xc8, 0xf3, 0x15, 0x55, 0x3c, 0xab, + 0xa9, 0x88, 0x8a, 0x3d, 0x04, 0x00, 0x37, 0x61, 0x89, 0x73, 0x1a, 0x3c, 0x2b, 0x33, 0xab, 0x84, + 0x8f, 0x7f, 0x29, 0x7e, 0x4c, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, 0x06, 0x1d, + 0x0e, 0x6d, 0xcf, 0x11, 0x4a, 0x6a, 0x30, 0x4f, 0xbc, 0x89, 0x70, 0xb3, 0x6c, 0xf1, 0x9f, 0xa2, + 0x40, 0xfa, 0xc4, 0x75, 0x55, 0x9d, 0x49, 0x82, 0x73, 0x27, 0xb6, 0x3b, 0x8e, 0x0e, 0x9b, 0x20, + 0x78, 0xd9, 0xd8, 0xfe, 0xf9, 0x58, 0x5e, 0x67, 0xf2, 0x42, 0x47, 0xcc, 0xe0, 0x06, 0x8e, 0x03, + 0xe2, 0xab, 0x4a, 0x13, 0xbf, 0xf1, 0x31, 0x54, 0x1a, 0x7d, 0xdb, 0xf3, 0x88, 0x3b, 0xd3, 0x07, + 0xa4, 0x8d, 0xa6, 0xb2, 0x6a, 0x59, 0x22, 0x9a, 0xfe, 0x39, 0x61, 0x71, 0x95, 0x73, 0x0a, 0xff, + 0x27, 0x07, 0xa5, 0xe8, 0xd8, 0x7c, 0x07, 0xca, 0x01, 0x4f, 0x8e, 0xa8, 0x50, 0x19, 0xcf, 0xd9, + 0x89, 0x8b, 0xa1, 0x5c, 0xae, 0x1b, 0x46, 0x55, 0xcd, 0x5a, 0x33, 0x95, 0x87, 0x28, 0xea, 0x56, + 0x0c, 0x45, 0x3f, 0x82, 0xe5, 0x81, 0x77, 0x46, 0xc7, 0x9e, 0xa3, 0x5c, 0x0a, 0xcc, 0x79, 0x51, + 0x2e, 0xeb, 0x7a, 0x0b, 0x88, 0xbd, 0xb5, 0xd2, 0x70, 0x74, 0x00, 0x35, 0x3a, 0x66, 0x49, 0x15, + 0xf9, 0x6b, 0x55, 0x4c, 0xe1, 0xd1, 0x63, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, 0xf1, 0x78, + 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x69, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, 0xcd, 0xf3, + 0x4d, 0xbc, 0x49, 0xcb, 0x11, 0x27, 0xbd, 0x6c, 0x49, 0x02, 0x3f, 0x82, 0xd5, 0x64, 0x4b, 0x93, + 0xb5, 0x6e, 0x42, 0x51, 0x56, 0x77, 0xa0, 0x0a, 0x29, 0x24, 0xf1, 0x6f, 0x0c, 0x58, 0x99, 0x6a, + 0x82, 0xe8, 0x09, 0x54, 0x2e, 0x06, 0xae, 0x4b, 0x9c, 0xce, 0xad, 0xce, 0x98, 0x0e, 0x46, 0x5f, + 0xc2, 0xa2, 0x3f, 0xf6, 0xbc, 0x81, 0x77, 0x1e, 0x76, 0xed, 0xeb, 0x85, 0x13, 0x68, 0xdc, 0x10, + 0x67, 0x9f, 0xdf, 0x9e, 0x22, 0xe3, 0x23, 0x4f, 0x0d, 0xcd, 0x53, 0x1e, 0x9b, 0x91, 0xcd, 0xfa, + 0xa7, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0x3f, 0x1b, 0x50, 0x0a, 0x2f, 0x60, 0xb3, 0x7a, + 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, 0xae, 0x48, + 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x08, 0x05, 0x3e, 0xb4, 0x03, + 0x73, 0x41, 0x04, 0x20, 0xf3, 0x72, 0x28, 0x11, 0xf8, 0x89, 0xe8, 0x6e, 0xca, 0x69, 0x1e, 0xff, + 0x48, 0xd6, 0xb8, 0x51, 0xf6, 0x4f, 0x06, 0x7c, 0x74, 0x44, 0xd8, 0x9b, 0xd4, 0x95, 0x3b, 0x8a, + 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6d, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, 0x16, 0xda, + 0x81, 0x65, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, 0xcb, 0x76, + 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, 0x75, 0x3b, + 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0xf1, 0x19, 0xac, 0xa5, 0x6d, 0x0c, 0xd3, 0xc3, 0x8d, + 0x09, 0xd3, 0xc3, 0x7f, 0x8b, 0xba, 0x0f, 0x9f, 0x14, 0x2a, 0xb7, 0x21, 0x2d, 0xee, 0x46, 0xca, + 0x2c, 0x95, 0xa5, 0x88, 0xc6, 0xef, 0x60, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xc7, 0xb0, 0x92, 0x7e, + 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0x8b, 0x41, 0xc0, 0x6f, + 0x1b, 0x34, 0x9a, 0x52, 0x8f, 0xa1, 0xc4, 0xe9, 0x99, 0x65, 0x67, 0x42, 0xd1, 0x21, 0x3d, 0x7b, + 0xec, 0x32, 0xd5, 0xbb, 0x43, 0x12, 0x7f, 0x1f, 0xaa, 0x9a, 0xb6, 0xb0, 0x04, 0x38, 0x95, 0x55, + 0x02, 0x6a, 0x0f, 0x4b, 0x22, 0xf0, 0x7d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0x49, 0xcf, 0xd8, + 0x1c, 0x3f, 0x84, 0x15, 0x8b, 0x0c, 0xe9, 0x84, 0xe8, 0xc0, 0x35, 0x28, 0x0c, 0x3c, 0x87, 0xbc, + 0x0f, 0xbf, 0x96, 0x08, 0x02, 0x7f, 0x0f, 0x96, 0x75, 0x28, 0x37, 0xe7, 0x01, 0x54, 0x3d, 0x72, + 0x79, 0x28, 0xcd, 0xb5, 0xe2, 0x84, 0xa5, 0xb8, 0xf8, 0x33, 0x58, 0xb5, 0x48, 0xcf, 0x27, 0x41, + 0x5f, 0x8f, 0xcc, 0x8c, 0x7d, 0xbe, 0x01, 0x77, 0x4e, 0x09, 0xd3, 0xc4, 0xaf, 0x87, 0x17, 0xa1, + 0xd0, 0x1c, 0x8e, 0xd8, 0xd5, 0xde, 0x7f, 0x2b, 0x50, 0x54, 0x0f, 0x0f, 0xd4, 0x80, 0x4a, 0xc7, + 0xb7, 0xbb, 0x17, 0xf2, 0x13, 0x16, 0x32, 0xa7, 0xbe, 0x6a, 0x29, 0x9d, 0xf5, 0xf5, 0x8c, 0x15, + 0x7e, 0xbb, 0x9b, 0xfb, 0xa6, 0x81, 0xbe, 0x82, 0x5a, 0xfa, 0xcb, 0x0c, 0xc2, 0x1a, 0x7e, 0xc6, + 0x87, 0xa7, 0xfa, 0xf6, 0xb5, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0x72, 0x81, 0xf4, 0xc7, + 0x65, 0xea, 0xcb, 0x47, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0xde, 0x88, 0xae, 0xa8, 0x7f, 0xd2, 0x40, + 0x1f, 0x27, 0xb7, 0xce, 0xf8, 0x10, 0x52, 0xbf, 0x77, 0x1d, 0x44, 0x2a, 0xee, 0x40, 0x35, 0xf9, + 0x30, 0x47, 0xba, 0x4b, 0x99, 0x0f, 0xff, 0xfa, 0xd6, 0x35, 0x88, 0x48, 0x6b, 0x72, 0x3f, 0xb4, + 0x3d, 0xd3, 0x94, 0x2c, 0xad, 0x19, 0x8f, 0x75, 0x3c, 0x87, 0x7e, 0x0e, 0x68, 0xfa, 0xb5, 0x89, + 0xee, 0xdf, 0xe6, 0x65, 0x5c, 0xc7, 0x37, 0xa0, 0xe4, 0x0e, 0x3f, 0x83, 0x95, 0xa9, 0x77, 0x12, + 0xfa, 0xba, 0x26, 0x3a, 0xeb, 0xfd, 0x59, 0xff, 0xf8, 0x7a, 0x50, 0xe4, 0xc0, 0xf4, 0x73, 0x25, + 0xe1, 0xc0, 0xcc, 0x87, 0x51, 0xc2, 0x81, 0x19, 0x6f, 0x1e, 0x59, 0x6b, 0xe1, 0x35, 0x39, 0x51, + 0x6b, 0xa9, 0xeb, 0x74, 0xa2, 0xd6, 0x12, 0xf7, 0x6a, 0x3c, 0x87, 0x9e, 0x42, 0x51, 0xb1, 0xd0, + 0xe6, 0x34, 0x2c, 0xd4, 0xb0, 0x91, 0xb5, 0x24, 0x15, 0x9c, 0xc0, 0xa2, 0x7e, 0xa3, 0x40, 0x5b, + 0x33, 0xdf, 0x5b, 0x52, 0xd5, 0xb5, 0xef, 0xb1, 0xc8, 0x29, 0x31, 0x1d, 0xd3, 0x4e, 0xe9, 0xf7, + 0x84, 0xb4, 0x53, 0xf1, 0x38, 0xc5, 0x73, 0xa8, 0x27, 0xbe, 0x09, 0x4e, 0x4d, 0x06, 0xf4, 0x20, + 0x29, 0x33, 0x6b, 0x8a, 0xd6, 0xef, 0xdf, 0x88, 0x93, 0xfb, 0x34, 0xa1, 0x1c, 0xf5, 0x71, 0xf4, + 0x91, 0x26, 0x94, 0x9e, 0x15, 0xf5, 0xcd, 0xec, 0x45, 0xa9, 0xe6, 0x31, 0x14, 0x55, 0x47, 0x4f, + 0xe4, 0x20, 0xd9, 0xe5, 0xeb, 0x35, 0xfd, 0x89, 0xce, 0x1b, 0x23, 0x9e, 0x43, 0xcf, 0x01, 0xe2, + 0xd6, 0x8d, 0xee, 0x26, 0xa6, 0x46, 0xaa, 0xf9, 0xd7, 0xeb, 0x33, 0x56, 0xc3, 0xb0, 0x2f, 0xea, + 0x9d, 0x3c, 0x91, 0xc6, 0x8c, 0x16, 0x9f, 0x69, 0xcd, 0x33, 0xa8, 0x26, 0x1b, 0x7c, 0xa2, 0x11, + 0x64, 0xf6, 0xfe, 0x2c, 0x3d, 0x07, 0x8f, 0xff, 0xf2, 0x61, 0xcb, 0xf8, 0xfb, 0x87, 0x2d, 0xe3, + 0x9f, 0x1f, 0xb6, 0x8c, 0xdf, 0xff, 0x6b, 0x6b, 0x0e, 0x70, 0xb7, 0xbf, 0xdb, 0x25, 0xbe, 0xb7, + 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8c, 0x3f, 0xea, 0x06, 0xc4, 0x9f, 0x10, + 0xff, 0xab, 0xdc, 0xe8, 0xec, 0x6c, 0x41, 0xfc, 0x49, 0xf3, 0xc5, 0xff, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x98, 0x74, 0xa0, 0x5d, 0xbe, 0x19, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3305,10 +3190,10 @@ type ControlClient interface { GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*RefreshReposReply, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*SetDefaultRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3477,8 +3362,8 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt return out, nil } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) if err != nil { return nil, err @@ -3495,8 +3380,8 @@ func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, o return out, nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*RefreshReposReply, error) { - out := new(RefreshReposReply) +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) if err != nil { return nil, err @@ -3504,8 +3389,8 @@ func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposReques return out, nil } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*SetDefaultRepoReply, error) { - out := new(SetDefaultRepoReply) +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) if err != nil { return nil, err @@ -3530,10 +3415,10 @@ type ControlServer interface { GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + AddRepo(context.Context, *AddRepoRequest) (*Empty, error) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*RefreshReposReply, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) } // UnimplementedControlServer can be embedded to have forward compatible implementations. @@ -3585,16 +3470,16 @@ func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") } func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") } @@ -6141,40 +6026,6 @@ func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6236,17 +6087,7 @@ func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.NewDefaultRepo) i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) i-- - dAtA[i] = 0x12 - } - if m.Ok { - i-- - if m.Ok { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -6283,40 +6124,6 @@ func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6349,7 +6156,7 @@ func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { +func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6359,12 +6166,12 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6373,13 +6180,6 @@ func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } @@ -7371,22 +7171,6 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *RemoveRepoRequest) Size() (n int) { if m == nil { return 0 @@ -7408,9 +7192,6 @@ func (m *RemoveRepoReply) Size() (n int) { } var l int _ = l - if m.Ok { - n += 2 - } l = len(m.NewDefaultRepo) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -7436,22 +7217,6 @@ func (m *RefreshReposRequest) Size() (n int) { return n } -func (m *RefreshReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *SetDefaultRepoRequest) Size() (n int) { if m == nil { return 0 @@ -7467,16 +7232,12 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetDefaultRepoReply) Size() (n int) { +func (m *Empty) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13027,92 +12788,6 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RemoveRepoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13216,26 +12891,6 @@ func (m *RemoveRepoReply) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ok = bool(v != 0) - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) } @@ -13365,92 +13020,6 @@ func (m *RefreshReposRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *RefreshReposReply) 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 ErrIntOverflowO2Control - } - 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: RefreshReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13524,7 +13093,7 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetDefaultRepoReply) Unmarshal(dAtA []byte) error { +func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13547,44 +13116,12 @@ func (m *SetDefaultRepoReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetDefaultRepoReply: wiretype end group for non-group") + return fmt.Errorf("proto: Empty: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 382d407ce..122978e5f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2737,53 +2737,6 @@ func (m *AddRepoRequest) GetName() string { return "" } -type AddRepoReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) -} - -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo - -func (m *AddRepoReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} - type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2795,7 +2748,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2832,8 +2785,7 @@ func (m *RemoveRepoRequest) GetIndex() int32 { } type RemoveRepoReply struct { - Ok bool `protobuf:"varint,1,opt,name=ok,proto3" json:"ok,omitempty"` - NewDefaultRepo string `protobuf:"bytes,2,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2843,7 +2795,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,13 +2824,6 @@ func (m *RemoveRepoReply) XXX_DiscardUnknown() { var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetOk() bool { - if m != nil { - return m.Ok - } - return false -} - func (m *RemoveRepoReply) GetNewDefaultRepo() string { if m != nil { return m.NewDefaultRepo @@ -2897,7 +2842,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2933,53 +2878,6 @@ func (m *RefreshReposRequest) GetIndex() int32 { return 0 } -type RefreshReposReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RefreshReposReply) Reset() { *m = RefreshReposReply{} } -func (m *RefreshReposReply) String() string { return proto.CompactTextString(m) } -func (*RefreshReposReply) ProtoMessage() {} -func (*RefreshReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *RefreshReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RefreshReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposReply.Merge(m, src) -} -func (m *RefreshReposReply) XXX_Size() int { - return m.Size() -} -func (m *RefreshReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposReply.DiscardUnknown(m) -} - -var xxx_messageInfo_RefreshReposReply proto.InternalMessageInfo - -func (m *RefreshReposReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} - type SetDefaultRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2991,7 +2889,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3027,25 +2925,24 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } -type SetDefaultRepoReply struct { - ErrorString string `protobuf:"bytes,1,opt,name=errorString,proto3" json:"errorString,omitempty"` +type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetDefaultRepoReply) Reset() { *m = SetDefaultRepoReply{} } -func (m *SetDefaultRepoReply) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoReply) ProtoMessage() {} -func (*SetDefaultRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } -func (m *SetDefaultRepoReply) XXX_Unmarshal(b []byte) error { +func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetDefaultRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3055,24 +2952,17 @@ func (m *SetDefaultRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *SetDefaultRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoReply.Merge(m, src) +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) } -func (m *SetDefaultRepoReply) XXX_Size() int { +func (m *Empty) XXX_Size() int { return m.Size() } -func (m *SetDefaultRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoReply.DiscardUnknown(m) +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) } -var xxx_messageInfo_SetDefaultRepoReply proto.InternalMessageInfo - -func (m *SetDefaultRepoReply) GetErrorString() string { - if m != nil { - return m.ErrorString - } - return "" -} +var xxx_messageInfo_Empty proto.InternalMessageInfo func init() { proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) @@ -3123,159 +3013,154 @@ func init() { proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*RefreshReposReply)(nil), "o2control.RefreshReposReply") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetDefaultRepoReply)(nil), "o2control.SetDefaultRepoReply") + proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2225 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xd7, 0xc8, 0x52, 0x24, 0x3d, 0xc9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x36, 0x38, 0xde, 0x26, - 0x95, 0x4d, 0x76, 0x17, 0x67, 0xf1, 0x02, 0x9b, 0x0a, 0x0b, 0xc1, 0x96, 0x15, 0x47, 0x10, 0x5b, - 0xa9, 0x91, 0x92, 0x14, 0x5b, 0x45, 0x85, 0xb1, 0xa6, 0x65, 0x69, 0x3d, 0x9a, 0x16, 0x3d, 0x23, - 0x25, 0x39, 0x70, 0xe3, 0x46, 0x51, 0x7b, 0xe0, 0xc2, 0x95, 0xa2, 0x38, 0xf2, 0x3d, 0xb8, 0x50, - 0xc0, 0x37, 0xa0, 0x42, 0x15, 0x27, 0x3e, 0x04, 0xd5, 0x7f, 0x66, 0xa6, 0x67, 0x34, 0x72, 0x5c, - 0xc5, 0x4d, 0xef, 0xf5, 0xaf, 0x5f, 0xf7, 0x7b, 0xbf, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x6b, 0xca, - 0x68, 0x40, 0xfd, 0xfb, 0x74, 0x7f, 0x40, 0xbd, 0x80, 0x51, 0x77, 0x4f, 0x28, 0x50, 0x25, 0x52, - 0xe0, 0x2d, 0xd8, 0x6c, 0xcf, 0x89, 0x17, 0xbc, 0x3a, 0x21, 0x3e, 0xf5, 0x9f, 0x10, 0x9b, 0x05, - 0x67, 0xc4, 0x0e, 0xf0, 0x1a, 0xac, 0xf6, 0x02, 0x3b, 0x98, 0xf9, 0x16, 0xf9, 0xd5, 0x8c, 0xf8, - 0x01, 0x3e, 0x83, 0x6a, 0xa8, 0x98, 0xba, 0x6f, 0xd1, 0x26, 0x14, 0xfd, 0xc0, 0x0e, 0x88, 0x69, - 0xec, 0x1a, 0x77, 0x2b, 0x96, 0x14, 0xd0, 0x8f, 0x60, 0xd5, 0x17, 0xa0, 0xe7, 0x53, 0xc7, 0x0e, - 0x88, 0x6f, 0xe6, 0x77, 0x57, 0xee, 0x56, 0xf7, 0x6f, 0xec, 0xc5, 0x3b, 0xe8, 0x69, 0xe3, 0x56, - 0x12, 0x8d, 0xff, 0x66, 0x40, 0x4d, 0x1f, 0x47, 0x9f, 0x43, 0xd1, 0x25, 0x73, 0xe2, 0x8a, 0x55, - 0xea, 0xfb, 0xdf, 0x5a, 0x62, 0x67, 0xef, 0x29, 0x07, 0x59, 0x12, 0x8b, 0x3a, 0x50, 0x9f, 0x24, - 0x9c, 0x31, 0xf3, 0xbb, 0xc6, 0xdd, 0xea, 0xfe, 0x2d, 0x6d, 0x76, 0x96, 0xcf, 0x4f, 0x72, 0x56, - 0x6a, 0x22, 0xfe, 0x1e, 0x14, 0x85, 0x69, 0x54, 0x81, 0xe2, 0x51, 0xfb, 0xf0, 0xf9, 0x71, 0x23, - 0x87, 0xca, 0x50, 0xe8, 0x9c, 0x3e, 0xee, 0x36, 0x0c, 0x54, 0x85, 0xd2, 0xcb, 0x03, 0xeb, 0xb4, - 0x73, 0x7a, 0xdc, 0xc8, 0x73, 0x44, 0xdb, 0xb2, 0xba, 0x56, 0x63, 0xe5, 0xb0, 0x04, 0x45, 0x61, - 0x1f, 0x6f, 0xc3, 0x8d, 0x63, 0x12, 0x3c, 0x66, 0xf6, 0x84, 0xbc, 0xa6, 0xec, 0xa2, 0xe3, 0x0d, - 0x69, 0x18, 0xce, 0x3f, 0x19, 0x50, 0x7a, 0x41, 0x98, 0x3f, 0xa6, 0x1e, 0x8f, 0xe5, 0xc4, 0xfe, - 0x9a, 0x32, 0xe1, 0x65, 0xd1, 0x92, 0x82, 0xd0, 0x8e, 0x3d, 0xca, 0xc4, 0xee, 0xb9, 0x96, 0x0b, - 0x5c, 0x3b, 0xb5, 0x83, 0xc1, 0xc8, 0x5c, 0x91, 0x5a, 0x21, 0x70, 0xed, 0xd9, 0x6c, 0xec, 0x3a, - 0x66, 0x41, 0xb2, 0x21, 0x04, 0xb4, 0x0b, 0xd5, 0x29, 0xa3, 0xce, 0x6c, 0x10, 0x9c, 0xda, 0x13, - 0x62, 0x16, 0xc5, 0x98, 0xae, 0x42, 0x3b, 0x00, 0x73, 0xb9, 0x89, 0x5e, 0xc0, 0xcc, 0x6b, 0x02, - 0xa0, 0x69, 0xf0, 0x37, 0x79, 0xb8, 0xbe, 0xe8, 0x01, 0xe7, 0x7f, 0x17, 0xaa, 0xc3, 0x48, 0xeb, - 0xa8, 0x2c, 0xd0, 0x55, 0xe8, 0x53, 0x58, 0x27, 0xde, 0x7c, 0xcc, 0xa8, 0x37, 0x21, 0x5e, 0xe0, - 0xb7, 0xe8, 0xcc, 0x0b, 0x94, 0x2f, 0x8b, 0x03, 0x7c, 0x27, 0x81, 0xed, 0x5f, 0x28, 0x98, 0x74, - 0x4e, 0xd3, 0xc4, 0xf9, 0x56, 0xd0, 0xf3, 0x6d, 0x07, 0x60, 0x44, 0xfd, 0xd0, 0x78, 0x51, 0xce, - 0x8a, 0x35, 0x08, 0x43, 0x6d, 0xec, 0xf9, 0x81, 0xed, 0x0d, 0x88, 0x08, 0x81, 0xf4, 0x30, 0xa1, - 0x43, 0x9f, 0x42, 0x49, 0x79, 0x6c, 0x96, 0x44, 0x9e, 0x20, 0x2d, 0x4f, 0x14, 0x45, 0x56, 0x08, - 0xc1, 0xf7, 0x60, 0xad, 0x4f, 0x6c, 0xe6, 0xd0, 0xd7, 0x9e, 0xa2, 0x12, 0x6d, 0xc1, 0x35, 0x46, - 0x6c, 0x9f, 0x7a, 0x2a, 0x0a, 0x4a, 0xe2, 0x47, 0x28, 0x86, 0x4e, 0xdd, 0xb7, 0xd8, 0x84, 0xad, - 0x63, 0x12, 0xb4, 0x35, 0xdf, 0xc3, 0x6c, 0x78, 0x03, 0x9b, 0x0b, 0x23, 0x57, 0x8b, 0xf2, 0x8f, - 0xa1, 0xa6, 0x07, 0x53, 0x1d, 0xb8, 0xa6, 0x9e, 0xea, 0xf1, 0xb0, 0xa0, 0x2f, 0x81, 0xc7, 0xff, - 0x34, 0x60, 0x2d, 0x85, 0x40, 0x75, 0xc8, 0x8f, 0xc3, 0xc5, 0xf2, 0x63, 0x91, 0x47, 0x03, 0x46, - 0xec, 0x80, 0x38, 0x2f, 0x47, 0xc4, 0x13, 0x1c, 0x56, 0x2c, 0x5d, 0x15, 0xb3, 0xb3, 0xa2, 0xb3, - 0xb3, 0x07, 0x45, 0xc1, 0xa0, 0x59, 0x10, 0x9b, 0x32, 0xf5, 0xd3, 0x3b, 0xa2, 0x2c, 0xe8, 0xdb, - 0xbe, 0xcc, 0x28, 0x09, 0x43, 0x4d, 0x28, 0x33, 0x4a, 0x03, 0x8b, 0xba, 0x61, 0xb2, 0x46, 0x32, - 0xfa, 0x18, 0x1a, 0x83, 0x19, 0x63, 0xc4, 0x0b, 0xac, 0x99, 0x77, 0x3a, 0x9b, 0x9c, 0x11, 0x99, - 0xaf, 0xab, 0xd6, 0x82, 0x1e, 0xb7, 0xe0, 0xfa, 0x29, 0x79, 0xad, 0x79, 0x15, 0x32, 0xf5, 0x31, - 0x34, 0x78, 0xd8, 0x86, 0x2e, 0x7d, 0xdd, 0x27, 0x93, 0xa9, 0x1b, 0xd7, 0xaf, 0x05, 0x3d, 0xee, - 0xc1, 0x46, 0xda, 0x08, 0x67, 0xe4, 0x4b, 0xa8, 0x6a, 0xf1, 0x13, 0xb3, 0x2f, 0x0f, 0xb7, 0x0e, - 0xc7, 0x1f, 0x89, 0xe3, 0x94, 0xb1, 0xb3, 0x54, 0xc8, 0xf1, 0x6f, 0x0c, 0xd8, 0x48, 0x23, 0xff, - 0xef, 0xe5, 0xd1, 0x7d, 0x28, 0x87, 0x7e, 0xaa, 0x9a, 0xb8, 0xa1, 0x4d, 0xe5, 0x71, 0x16, 0x73, - 0x22, 0x10, 0xfe, 0xbb, 0x01, 0xdb, 0x2d, 0x39, 0xfc, 0xfe, 0x4d, 0xa3, 0x47, 0x50, 0x08, 0xde, - 0x4e, 0x89, 0x30, 0x5d, 0xdf, 0xff, 0x44, 0x33, 0xbd, 0xd4, 0xc6, 0x5e, 0x77, 0xca, 0xa7, 0x58, - 0x62, 0x22, 0xb6, 0xe1, 0x9a, 0x94, 0x79, 0x91, 0x3d, 0xed, 0x76, 0x9f, 0x35, 0x72, 0x08, 0x41, - 0xbd, 0xd7, 0x3f, 0xb0, 0xfa, 0xaf, 0x0e, 0x5a, 0xfd, 0xce, 0x8b, 0x4e, 0xff, 0xe7, 0x0d, 0x03, - 0xad, 0xc3, 0x6a, 0xaf, 0xdf, 0x7d, 0x16, 0xab, 0xf2, 0x68, 0x15, 0x2a, 0xad, 0xee, 0xe9, 0xe3, - 0xce, 0xf1, 0x73, 0xab, 0xdd, 0x58, 0xe1, 0xd5, 0xd8, 0x6a, 0xf7, 0xda, 0xfd, 0x46, 0x01, 0xd5, - 0xa0, 0x7c, 0xdc, 0x7d, 0x25, 0x6b, 0x73, 0x11, 0x5f, 0xc0, 0x8d, 0xac, 0xcd, 0xf0, 0xd8, 0xa6, - 0xdd, 0x89, 0x92, 0x3a, 0xaf, 0x27, 0x75, 0x56, 0x22, 0xae, 0x2c, 0x49, 0xc4, 0xdf, 0x1b, 0x60, - 0x9e, 0x50, 0x67, 0x3c, 0x7c, 0x7b, 0xa5, 0xe8, 0x01, 0x9d, 0x12, 0x66, 0x07, 0x63, 0xea, 0x85, - 0xe7, 0xf8, 0x56, 0x36, 0xb3, 0xdd, 0x10, 0x67, 0x69, 0x53, 0xd0, 0x1d, 0xa8, 0x33, 0x32, 0xa0, - 0xde, 0x70, 0x7c, 0x3e, 0x63, 0xe4, 0xc0, 0x75, 0xc5, 0xbe, 0xca, 0x56, 0x4a, 0x8b, 0xff, 0x68, - 0xc0, 0x66, 0x96, 0x31, 0xf4, 0x50, 0xf1, 0x27, 0x9b, 0xed, 0x9d, 0xf7, 0xac, 0x9d, 0xa0, 0x4e, - 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x7c, 0x78, 0x76, 0xa5, 0x8c, 0xbf, 0x9b, 0x41, 0xeb, 0x1a, 0x54, - 0xad, 0xf6, 0x49, 0xf7, 0x45, 0xfb, 0x95, 0xd5, 0x7d, 0xca, 0x19, 0xab, 0x41, 0xf9, 0xe0, 0xe8, - 0x48, 0x4a, 0x05, 0xfc, 0x5b, 0x03, 0xb6, 0x32, 0x22, 0xc7, 0x69, 0xfa, 0x19, 0x34, 0x86, 0xf6, - 0xd8, 0x25, 0x4e, 0x37, 0x8e, 0x96, 0x71, 0xb5, 0x68, 0x2d, 0x4c, 0x54, 0x24, 0xe4, 0x17, 0x39, - 0xd7, 0x0b, 0x19, 0xee, 0xc0, 0xf6, 0x11, 0xf1, 0x03, 0x46, 0xaf, 0xc2, 0xe3, 0x4d, 0xa8, 0x5c, - 0x10, 0x32, 0xed, 0x8b, 0xca, 0x97, 0x17, 0x0c, 0xc4, 0x0a, 0x4c, 0xe0, 0x46, 0x96, 0x29, 0xee, - 0xd8, 0x4f, 0x61, 0x7d, 0xe0, 0x12, 0xdb, 0x9b, 0x49, 0xa8, 0x50, 0xaa, 0x13, 0x7e, 0x53, 0x3f, - 0x4b, 0x69, 0x8c, 0xb5, 0x38, 0x0d, 0xff, 0xc7, 0x80, 0xd5, 0x44, 0x8d, 0x45, 0x08, 0x0a, 0x1e, - 0x27, 0x47, 0x6e, 0x54, 0xfc, 0xe6, 0x9d, 0xcb, 0xa5, 0x83, 0x0b, 0xe2, 0xa8, 0x7d, 0x2a, 0x89, - 0xeb, 0x79, 0x45, 0xee, 0x38, 0x2a, 0x0c, 0x4a, 0xe2, 0x7a, 0x79, 0x61, 0x53, 0x5d, 0x58, 0x49, - 0x71, 0xd4, 0x8a, 0xfa, 0x49, 0xb9, 0x09, 0x95, 0x81, 0x6b, 0xfb, 0xbe, 0xd6, 0x79, 0x63, 0x05, - 0x6a, 0x43, 0xdd, 0x21, 0x53, 0x97, 0xbe, 0x0d, 0x4b, 0x95, 0xea, 0xbe, 0xfa, 0x1d, 0x8f, 0x6f, - 0xfe, 0x28, 0x01, 0xb2, 0x52, 0x93, 0x78, 0xa1, 0x44, 0x8b, 0x30, 0x9e, 0x8e, 0xfc, 0x1a, 0xa0, - 0x79, 0x1c, 0xc9, 0xc8, 0x84, 0x92, 0x7d, 0xce, 0x81, 0x21, 0xf1, 0xa1, 0xc8, 0x47, 0xe8, 0x70, - 0x48, 0x58, 0xe4, 0x78, 0x28, 0xf2, 0x8b, 0x06, 0x79, 0x43, 0x06, 0xb3, 0x80, 0xf2, 0x41, 0xe9, - 0xbd, 0xa6, 0xc1, 0xeb, 0xb0, 0x76, 0x4c, 0x02, 0x45, 0x80, 0xec, 0xe9, 0x8f, 0x60, 0x35, 0x56, - 0x71, 0x7e, 0xa3, 0x76, 0x68, 0x5c, 0xa9, 0x1d, 0xe2, 0xbb, 0x50, 0x57, 0x06, 0xb4, 0x9b, 0x86, - 0xe2, 0xc5, 0xd0, 0x79, 0xc1, 0x5f, 0x40, 0x2d, 0x42, 0xf2, 0x95, 0x3e, 0x82, 0x02, 0x1f, 0x51, - 0xc9, 0xb3, 0x91, 0x8a, 0xa8, 0x58, 0x43, 0x00, 0x70, 0x1b, 0x56, 0xb9, 0xa6, 0xc5, 0x59, 0x59, - 0x9a, 0x25, 0xbc, 0xfd, 0xcb, 0xe9, 0x27, 0xd4, 0x21, 0x51, 0xfb, 0x8f, 0x55, 0xf8, 0xd7, 0x50, - 0x6d, 0xd1, 0xc9, 0xc4, 0xf6, 0x1c, 0x61, 0xa4, 0x01, 0x2b, 0xc4, 0x9b, 0x0b, 0x37, 0x2b, 0x16, - 0xff, 0x29, 0x12, 0x64, 0x44, 0x5c, 0x57, 0xe5, 0x99, 0x14, 0xb8, 0x76, 0x6e, 0xbb, 0xb3, 0xe8, - 0xb0, 0x09, 0x81, 0xa7, 0x8d, 0xcd, 0xce, 0x67, 0xf2, 0x3a, 0x53, 0x10, 0x36, 0x62, 0x05, 0xdf, - 0xe0, 0xcc, 0x27, 0x4c, 0x65, 0x9a, 0xf8, 0x8d, 0x4f, 0xa0, 0xda, 0x1a, 0xd9, 0x9e, 0x47, 0xdc, - 0xa5, 0x3e, 0x20, 0xad, 0x35, 0x55, 0x54, 0xc9, 0x12, 0xd1, 0x64, 0xe7, 0x24, 0x88, 0xb3, 0x9c, - 0x4b, 0xf8, 0xbf, 0x79, 0x28, 0x47, 0xc7, 0xe6, 0x07, 0x50, 0xf1, 0x39, 0x39, 0x22, 0x43, 0x65, - 0x3c, 0x97, 0x13, 0x17, 0x43, 0xf9, 0xbc, 0x41, 0x18, 0x55, 0xd5, 0x6b, 0xcd, 0x14, 0x0f, 0x51, - 0xd4, 0xad, 0x18, 0x8a, 0x7e, 0x02, 0x6b, 0x63, 0xef, 0x8c, 0xce, 0x3c, 0x47, 0xb9, 0xe4, 0x9b, - 0x2b, 0x22, 0x5d, 0xb6, 0xf4, 0x12, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x10, 0x1a, 0x74, 0x16, - 0x24, 0x4d, 0x14, 0x2e, 0x35, 0xb1, 0x80, 0x47, 0x0f, 0x38, 0xe5, 0x11, 0xa1, 0x22, 0xd8, 0xa9, - 0xe9, 0xf1, 0xa8, 0xa5, 0x43, 0xf9, 0xc1, 0xe3, 0x99, 0xf5, 0xcc, 0x0e, 0x46, 0xea, 0xcc, 0x47, - 0x32, 0xe7, 0x9b, 0x78, 0xf3, 0x8e, 0x23, 0x4e, 0x7a, 0xc5, 0x92, 0x02, 0xbe, 0x0f, 0x1b, 0xc9, - 0x92, 0x26, 0x73, 0xdd, 0x84, 0x92, 0xcc, 0x6e, 0x5f, 0x25, 0x52, 0x28, 0xe2, 0xdf, 0x19, 0xb0, - 0xbe, 0x50, 0x04, 0xd1, 0x43, 0xa8, 0x5e, 0x8c, 0x5d, 0x97, 0x38, 0xfd, 0x2b, 0x9d, 0x31, 0x1d, - 0x8c, 0xbe, 0x84, 0x1a, 0x9b, 0x79, 0xde, 0xd8, 0x3b, 0x0f, 0xab, 0xf6, 0xe5, 0x93, 0x13, 0x68, - 0xdc, 0x12, 0x67, 0x9f, 0xdf, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x53, - 0x3b, 0x18, 0xf5, 0xa6, 0x64, 0x10, 0xf6, 0xc8, 0x50, 0xc6, 0x7f, 0x31, 0xa0, 0x1c, 0x5e, 0xc0, - 0x96, 0xd5, 0x6a, 0x55, 0x7b, 0xf3, 0xd9, 0xb5, 0x37, 0x71, 0xf5, 0x6e, 0x42, 0x79, 0x38, 0x73, - 0x5d, 0x41, 0x83, 0xac, 0x56, 0x91, 0xac, 0x47, 0xb6, 0x98, 0x88, 0x2c, 0xba, 0x07, 0x45, 0xde, - 0xb4, 0x7d, 0xf3, 0x9a, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x43, 0x51, 0xdd, 0x94, 0xd3, - 0x3c, 0xfe, 0xd1, 0x5c, 0xe3, 0xbd, 0x73, 0xff, 0x6c, 0xc0, 0x07, 0xc7, 0x24, 0x78, 0x99, 0xba, - 0x72, 0x47, 0xd1, 0xdb, 0x85, 0x2a, 0x23, 0x53, 0xfa, 0xcc, 0x0e, 0x02, 0xc2, 0xc2, 0x57, 0x95, - 0xae, 0x42, 0x77, 0x61, 0x8d, 0x91, 0xf9, 0x98, 0xbf, 0xc8, 0x42, 0x94, 0x8c, 0x4a, 0x5a, 0xcd, - 0x6d, 0xd9, 0xae, 0x7b, 0xc8, 0x6c, 0x6f, 0x30, 0x22, 0xbe, 0xba, 0x11, 0xe9, 0x2a, 0xd1, 0x0e, - 0x5c, 0xb7, 0x6f, 0x9f, 0xcb, 0xae, 0x56, 0xb6, 0x42, 0x11, 0x9f, 0xc1, 0x66, 0x7a, 0x8f, 0x21, - 0x3d, 0x7c, 0x33, 0x21, 0x3d, 0xfc, 0xb7, 0xc8, 0xfb, 0xf0, 0x49, 0xa1, 0xb8, 0x0d, 0x65, 0x71, - 0x37, 0x52, 0xdb, 0x52, 0x2c, 0x45, 0x32, 0xfe, 0x1a, 0xb6, 0xb3, 0x43, 0xc1, 0x63, 0x7a, 0x02, - 0xeb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0x6b, 0x93, 0xd6, 0xe2, 0x4c, 0x8c, 0xa0, 0xf1, 0x74, - 0xec, 0xf3, 0xdb, 0x06, 0x8d, 0xba, 0xd4, 0x03, 0x28, 0x73, 0x79, 0x69, 0xda, 0x99, 0x50, 0x72, - 0xc8, 0xd0, 0x9e, 0xb9, 0x81, 0xaa, 0xdd, 0xa1, 0x88, 0x7f, 0x08, 0x75, 0xcd, 0x5a, 0x98, 0x02, - 0x5c, 0xca, 0x4a, 0x01, 0xb5, 0x86, 0x25, 0x11, 0xf8, 0x36, 0xd4, 0x0f, 0x1c, 0x87, 0x6b, 0x43, - 0xd2, 0x33, 0x16, 0xc7, 0x9f, 0x41, 0x2d, 0x42, 0xa9, 0xe7, 0x30, 0x61, 0x8c, 0xb2, 0x5e, 0xc0, - 0xc6, 0xde, 0x79, 0x98, 0x18, 0x9a, 0x0a, 0xdf, 0x83, 0x75, 0x8b, 0x4c, 0xe8, 0x9c, 0xe8, 0xa6, - 0x37, 0xa1, 0x38, 0xf6, 0x1c, 0xf2, 0x26, 0xfc, 0xbe, 0x22, 0x04, 0xdc, 0x81, 0x35, 0x1d, 0xaa, - 0x5e, 0x00, 0x54, 0x76, 0xcd, 0xb2, 0x95, 0xa7, 0x17, 0xfc, 0x46, 0xed, 0x91, 0xd7, 0x47, 0xd2, - 0x61, 0x0e, 0x53, 0xd4, 0xa6, 0xb4, 0xf8, 0x13, 0xd8, 0xb0, 0xc8, 0x90, 0x11, 0x7f, 0xa4, 0xc7, - 0x76, 0xc9, 0xba, 0xdf, 0xe7, 0x5b, 0xd4, 0xc1, 0x57, 0xf3, 0xec, 0x3b, 0x70, 0xbd, 0x47, 0x02, - 0x6d, 0xd5, 0xcb, 0x57, 0xf9, 0x02, 0x36, 0xd2, 0xf0, 0x2b, 0xad, 0xb3, 0xff, 0x4d, 0x0d, 0x4a, - 0xea, 0x85, 0x84, 0x5a, 0x50, 0xed, 0x33, 0x7b, 0x70, 0x21, 0xbf, 0xb5, 0x21, 0x73, 0xe1, 0xf3, - 0x9b, 0xda, 0x43, 0x73, 0x2b, 0x63, 0x84, 0x5f, 0x43, 0x73, 0x9f, 0x19, 0xe8, 0x2b, 0x68, 0xa4, - 0x3f, 0x21, 0x21, 0xac, 0xe1, 0x97, 0x7c, 0x21, 0x6b, 0xee, 0x5e, 0x8a, 0x11, 0xd6, 0xd1, 0x21, - 0x94, 0xc3, 0x4f, 0x2c, 0x48, 0x7f, 0x05, 0xa7, 0x3e, 0xd1, 0x34, 0xcd, 0xcc, 0x31, 0x69, 0xe3, - 0xa5, 0x28, 0xdf, 0xfa, 0xb7, 0x17, 0xf4, 0x61, 0x72, 0xe9, 0x8c, 0x2f, 0x36, 0xcd, 0x5b, 0x97, - 0x41, 0xa4, 0xe1, 0x3e, 0xd4, 0x93, 0x5f, 0x10, 0x90, 0xee, 0x52, 0xe6, 0x17, 0x8a, 0xe6, 0xce, - 0x25, 0x88, 0xc8, 0x6a, 0x72, 0x3d, 0xb4, 0xbb, 0x74, 0x2b, 0x59, 0x56, 0x33, 0xbe, 0x2a, 0xe0, - 0x1c, 0xfa, 0x25, 0xa0, 0xc5, 0x67, 0x31, 0xba, 0x7d, 0x95, 0x27, 0x7c, 0x13, 0xbf, 0x07, 0x25, - 0x57, 0xf8, 0x05, 0xac, 0x2f, 0x3c, 0xe8, 0xd0, 0xb7, 0xb5, 0xa9, 0xcb, 0x1e, 0xca, 0xcd, 0x0f, - 0x2f, 0x07, 0x45, 0x0e, 0x2c, 0xbe, 0xab, 0x12, 0x0e, 0x2c, 0x7d, 0xc1, 0x25, 0x1c, 0x58, 0xf2, - 0x38, 0x93, 0xb9, 0x16, 0xde, 0xe7, 0x13, 0xb9, 0x96, 0xba, 0xf7, 0x27, 0x72, 0x2d, 0xf1, 0x00, - 0xc0, 0x39, 0xf4, 0x08, 0x4a, 0x4a, 0x85, 0xb6, 0x17, 0x61, 0xa1, 0x85, 0x1b, 0x59, 0x43, 0xd2, - 0xc0, 0x29, 0xd4, 0xf4, 0xab, 0x0f, 0xda, 0x59, 0xfa, 0x30, 0x94, 0xa6, 0x2e, 0x7d, 0x38, 0x46, - 0x4e, 0x89, 0x36, 0x9e, 0x76, 0x4a, 0xbf, 0xd0, 0xa4, 0x9d, 0x8a, 0xfb, 0x3e, 0xce, 0xa1, 0xa1, - 0xf8, 0x78, 0xb9, 0xd0, 0xc2, 0xd0, 0x9d, 0xe4, 0x9c, 0x65, 0xed, 0xbe, 0x79, 0xfb, 0xbd, 0x38, - 0xb9, 0x4e, 0x1b, 0x2a, 0x51, 0xc3, 0x41, 0x1f, 0x68, 0x93, 0xd2, 0x4d, 0xad, 0xb9, 0x9d, 0x3d, - 0x18, 0x71, 0xa0, 0x9a, 0x4a, 0x82, 0x83, 0x64, 0x3b, 0x4a, 0x70, 0xa0, 0xf7, 0x20, 0x9c, 0x43, - 0x4f, 0x00, 0xe2, 0xc6, 0x81, 0x6e, 0x26, 0xba, 0x5c, 0xaa, 0xf5, 0x34, 0x9b, 0x4b, 0x46, 0x23, - 0x36, 0xf5, 0x56, 0x90, 0x60, 0x33, 0xa3, 0xa1, 0x34, 0x6f, 0x2e, 0x1d, 0x8f, 0x6a, 0x43, 0xb2, - 0xe8, 0x27, 0x6a, 0x43, 0x66, 0xfb, 0x48, 0xd4, 0x86, 0x8c, 0x8e, 0x81, 0x73, 0x87, 0x0f, 0xfe, - 0xfa, 0x6e, 0xc7, 0xf8, 0xc7, 0xbb, 0x1d, 0xe3, 0x5f, 0xef, 0x76, 0x8c, 0x3f, 0xfc, 0x7b, 0x27, - 0x07, 0x78, 0x30, 0xda, 0x1b, 0x10, 0xe6, 0xed, 0xd9, 0xee, 0x78, 0x40, 0xf6, 0xe8, 0xfe, 0x5e, - 0x68, 0x81, 0x4d, 0x07, 0x3e, 0x61, 0x73, 0xc2, 0xbe, 0xca, 0x4f, 0xcf, 0xce, 0xae, 0x89, 0xbf, - 0x9b, 0x3e, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x58, 0x63, 0x43, 0xc7, 0x88, 0x1a, 0x00, - 0x00, + // 2185 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x6f, 0x1b, 0x4b, + 0x15, 0xcf, 0x3a, 0x76, 0x6c, 0x1f, 0x27, 0x8e, 0x33, 0x49, 0x93, 0x8d, 0x6f, 0x49, 0x73, 0x87, + 0xaa, 0x37, 0xbd, 0xf7, 0x92, 0x42, 0x2e, 0x82, 0x52, 0x2e, 0x94, 0xc4, 0x71, 0x53, 0x43, 0x13, + 0x57, 0x1b, 0xb7, 0x15, 0x57, 0x42, 0x65, 0xe3, 0x1d, 0xc7, 0x6e, 0xd6, 0x3b, 0x66, 0x77, 0xec, + 0x34, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x0f, 0xbc, 0xf0, 0x8a, 0x10, 0x8f, 0x7c, 0x0f, 0x5e, 0x10, + 0xf0, 0x0d, 0x50, 0x91, 0x78, 0x42, 0x7c, 0x06, 0x34, 0x7f, 0x76, 0x77, 0x76, 0xbd, 0x4e, 0x22, + 0xf1, 0xe6, 0x73, 0xe6, 0x77, 0xce, 0x9c, 0x7f, 0x73, 0xce, 0xcc, 0x1a, 0xd6, 0x47, 0x3e, 0x65, + 0x34, 0x78, 0x44, 0xf7, 0xba, 0xd4, 0x63, 0x3e, 0x75, 0x77, 0x05, 0x03, 0x95, 0x23, 0x06, 0x5e, + 0x87, 0xb5, 0xe6, 0x84, 0x78, 0xec, 0xed, 0x31, 0x09, 0x68, 0xf0, 0x9c, 0xd8, 0x3e, 0x3b, 0x23, + 0x36, 0xc3, 0xcb, 0xb0, 0x74, 0xca, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0x8b, 0x31, 0x09, 0x18, 0x3e, + 0x83, 0x4a, 0xc8, 0x18, 0xb9, 0x57, 0x68, 0x0d, 0x0a, 0x01, 0xb3, 0x19, 0x31, 0x8d, 0x6d, 0x63, + 0xa7, 0x6c, 0x49, 0x02, 0xfd, 0x00, 0x96, 0x02, 0x01, 0x7a, 0x35, 0x72, 0x6c, 0x46, 0x02, 0x33, + 0xb7, 0x3d, 0xbf, 0x53, 0xd9, 0xdb, 0xd8, 0x8d, 0x2d, 0x38, 0xd5, 0xd6, 0xad, 0x24, 0x1a, 0xff, + 0xd5, 0x80, 0x45, 0x7d, 0x1d, 0x7d, 0x01, 0x05, 0x97, 0x4c, 0x88, 0x2b, 0x76, 0xa9, 0xee, 0x7d, + 0x6d, 0x86, 0x9e, 0xdd, 0x17, 0x1c, 0x64, 0x49, 0x2c, 0x6a, 0x41, 0x75, 0x98, 0x70, 0xc6, 0xcc, + 0x6d, 0x1b, 0x3b, 0x95, 0xbd, 0x7b, 0x9a, 0x74, 0x96, 0xcf, 0xcf, 0xe7, 0xac, 0x94, 0x20, 0xfe, + 0x36, 0x14, 0x84, 0x6a, 0x54, 0x86, 0xc2, 0x61, 0xf3, 0xe0, 0xd5, 0x51, 0x6d, 0x0e, 0x95, 0x20, + 0xdf, 0x3a, 0x79, 0xd6, 0xae, 0x19, 0xa8, 0x02, 0xc5, 0x37, 0xfb, 0xd6, 0x49, 0xeb, 0xe4, 0xa8, + 0x96, 0xe3, 0x88, 0xa6, 0x65, 0xb5, 0xad, 0xda, 0xfc, 0x41, 0x11, 0x0a, 0x42, 0x3f, 0xde, 0x84, + 0x8d, 0x23, 0xc2, 0x9e, 0xf9, 0xf6, 0x90, 0x5c, 0x52, 0xff, 0xa2, 0xe5, 0xf5, 0x68, 0x18, 0xce, + 0x3f, 0x1a, 0x50, 0x7c, 0x4d, 0xfc, 0x60, 0x40, 0x3d, 0x1e, 0xcb, 0xa1, 0xfd, 0x8e, 0xfa, 0xc2, + 0xcb, 0x82, 0x25, 0x09, 0xc1, 0x1d, 0x78, 0xd4, 0x17, 0xd6, 0x73, 0x2e, 0x27, 0x38, 0x77, 0x64, + 0xb3, 0x6e, 0xdf, 0x9c, 0x97, 0x5c, 0x41, 0x70, 0xee, 0xd9, 0x78, 0xe0, 0x3a, 0x66, 0x5e, 0x66, + 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb1, 0x87, 0xc4, 0x2c, 0x88, + 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x88, 0x53, 0xe6, 0x9b, 0x0b, 0x02, 0xa0, 0x71, 0xf0, + 0x6f, 0x73, 0x70, 0x67, 0xda, 0x03, 0x9e, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, 0xa3, 0xaa, 0x40, + 0x67, 0xa1, 0xcf, 0x61, 0x85, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, 0xd0, 0xa0, 0x63, + 0x8f, 0x29, 0x5f, 0xa6, 0x17, 0xb8, 0x25, 0xcc, 0x0e, 0x2e, 0x14, 0x4c, 0x3a, 0xa7, 0x71, 0xe2, + 0x7a, 0xcb, 0xeb, 0xf5, 0xb6, 0x05, 0xd0, 0xa7, 0x41, 0xa8, 0xbc, 0x20, 0xa5, 0x62, 0x0e, 0xc2, + 0xb0, 0x38, 0xf0, 0x02, 0x66, 0x7b, 0x5d, 0x22, 0x42, 0x20, 0x3d, 0x4c, 0xf0, 0xd0, 0xe7, 0x50, + 0x54, 0x1e, 0x9b, 0x45, 0x51, 0x27, 0x48, 0xab, 0x13, 0x95, 0x22, 0x2b, 0x84, 0xe0, 0x87, 0xb0, + 0xdc, 0x21, 0xb6, 0xef, 0xd0, 0x4b, 0x4f, 0xa5, 0x12, 0xad, 0xc3, 0x82, 0x4f, 0xec, 0x80, 0x7a, + 0x2a, 0x0a, 0x8a, 0xe2, 0x47, 0x28, 0x86, 0x8e, 0xdc, 0x2b, 0x6c, 0xc2, 0xfa, 0x11, 0x61, 0x4d, + 0xcd, 0xf7, 0xb0, 0x1a, 0xde, 0xc3, 0xda, 0xd4, 0xca, 0xed, 0xa2, 0xfc, 0x43, 0x58, 0xd4, 0x83, + 0xa9, 0x0e, 0x5c, 0x5d, 0x2f, 0xf5, 0x78, 0x59, 0xa4, 0x2f, 0x81, 0xc7, 0xff, 0x30, 0x60, 0x39, + 0x85, 0x40, 0x55, 0xc8, 0x0d, 0xc2, 0xcd, 0x72, 0x03, 0x51, 0x47, 0x5d, 0x9f, 0xd8, 0x8c, 0x38, + 0x6f, 0xfa, 0xc4, 0x13, 0x39, 0x2c, 0x5b, 0x3a, 0x2b, 0xce, 0xce, 0xbc, 0x9e, 0x9d, 0x5d, 0x28, + 0x88, 0x0c, 0x9a, 0x79, 0x61, 0x94, 0xa9, 0x9f, 0xde, 0x3e, 0xf5, 0x59, 0xc7, 0x0e, 0x64, 0x45, + 0x49, 0x18, 0xaa, 0x43, 0xc9, 0xa7, 0x94, 0x59, 0xd4, 0x0d, 0x8b, 0x35, 0xa2, 0xd1, 0xa7, 0x50, + 0xeb, 0x8e, 0x7d, 0x9f, 0x78, 0xcc, 0x1a, 0x7b, 0x27, 0xe3, 0xe1, 0x19, 0x91, 0xf5, 0xba, 0x64, + 0x4d, 0xf1, 0x71, 0x03, 0xee, 0x9c, 0x90, 0x4b, 0xcd, 0xab, 0x30, 0x53, 0x9f, 0x42, 0x8d, 0x87, + 0xad, 0xe7, 0xd2, 0xcb, 0x0e, 0x19, 0x8e, 0xdc, 0xb8, 0x7f, 0x4d, 0xf1, 0xf1, 0x29, 0xac, 0xa6, + 0x95, 0xf0, 0x8c, 0x7c, 0x09, 0x15, 0x2d, 0x7e, 0x42, 0xfa, 0xfa, 0x70, 0xeb, 0x70, 0xfc, 0x89, + 0x38, 0x4e, 0x19, 0x96, 0xa5, 0x42, 0x8e, 0x7f, 0x65, 0xc0, 0x6a, 0x1a, 0xf9, 0x7f, 0x6f, 0x8f, + 0x1e, 0x41, 0x29, 0xf4, 0x53, 0xf5, 0xc4, 0x55, 0x4d, 0x94, 0xc7, 0x59, 0xc8, 0x44, 0x20, 0xfc, + 0x37, 0x03, 0x36, 0x1b, 0x72, 0xf9, 0x66, 0xa3, 0xd1, 0x53, 0xc8, 0xb3, 0xab, 0x11, 0x11, 0xaa, + 0xab, 0x7b, 0x9f, 0x69, 0xaa, 0x67, 0xea, 0xd8, 0x6d, 0x8f, 0xb8, 0x88, 0x25, 0x04, 0xb1, 0x0d, + 0x0b, 0x92, 0xe6, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0x59, 0x9b, 0x43, 0x08, 0xaa, 0xa7, 0x9d, 0x7d, + 0xab, 0xf3, 0x76, 0xbf, 0xd1, 0x69, 0xbd, 0x6e, 0x75, 0x7e, 0x5a, 0x33, 0xd0, 0x0a, 0x2c, 0x9d, + 0x76, 0xda, 0x2f, 0x63, 0x56, 0x0e, 0x2d, 0x41, 0xb9, 0xd1, 0x3e, 0x79, 0xd6, 0x3a, 0x7a, 0x65, + 0x35, 0x6b, 0xf3, 0xbc, 0x1b, 0x5b, 0xcd, 0xd3, 0x66, 0xa7, 0x96, 0x47, 0x8b, 0x50, 0x3a, 0x6a, + 0xbf, 0x95, 0xbd, 0xb9, 0x80, 0x2f, 0x60, 0x23, 0xcb, 0x18, 0x1e, 0xdb, 0xb4, 0x3b, 0x51, 0x51, + 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x19, 0x85, 0xf8, 0x3b, 0x03, 0xcc, 0x63, 0xea, 0x0c, + 0x7a, 0x57, 0xb7, 0x8a, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, 0x78, 0x8e, 0xef, 0x65, + 0x67, 0xb6, 0x1d, 0xe2, 0x2c, 0x4d, 0x04, 0x3d, 0x80, 0xaa, 0x4f, 0xba, 0xd4, 0xeb, 0x0d, 0xce, + 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0x61, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0x1f, 0x0c, 0x58, 0xcb, 0x52, + 0x86, 0x9e, 0xa8, 0xfc, 0xc9, 0x61, 0xfb, 0xe0, 0x86, 0xbd, 0x13, 0xa9, 0x93, 0x67, 0xd7, 0x95, + 0x5d, 0x36, 0x17, 0x9e, 0x5d, 0x49, 0xe3, 0x6f, 0x65, 0xa4, 0x75, 0x19, 0x2a, 0x56, 0xf3, 0xb8, + 0xfd, 0xba, 0xf9, 0xd6, 0x6a, 0xbf, 0xe0, 0x19, 0x5b, 0x84, 0xd2, 0xfe, 0xe1, 0xa1, 0xa4, 0xf2, + 0xf8, 0xd7, 0x06, 0xac, 0x67, 0x44, 0x8e, 0xa7, 0xe9, 0x27, 0x50, 0xeb, 0xd9, 0x03, 0x97, 0x38, + 0xed, 0x38, 0x5a, 0xc6, 0xed, 0xa2, 0x35, 0x25, 0xa8, 0x92, 0x90, 0x9b, 0xce, 0xb9, 0xde, 0xc8, + 0x70, 0x0b, 0x36, 0x0f, 0x49, 0xc0, 0x7c, 0x7a, 0x9b, 0x3c, 0xde, 0x85, 0xf2, 0x05, 0x21, 0xa3, + 0x8e, 0xe8, 0x7c, 0x39, 0x91, 0x81, 0x98, 0x81, 0x09, 0x6c, 0x64, 0xa9, 0xe2, 0x8e, 0xfd, 0x18, + 0x56, 0xba, 0x2e, 0xb1, 0xbd, 0xb1, 0x84, 0x0a, 0xa6, 0x3a, 0xe1, 0x77, 0xf5, 0xb3, 0x94, 0xc6, + 0x58, 0xd3, 0x62, 0xf8, 0xdf, 0x06, 0x2c, 0x25, 0x7a, 0x2c, 0x42, 0x90, 0xf7, 0x78, 0x72, 0xa4, + 0xa1, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xd9, 0xa9, 0x28, 0xce, 0xe7, 0x1d, + 0xb9, 0xe5, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, 0x51, 0x2b, + 0xe8, 0x27, 0xe5, 0x2e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, 0x09, 0x55, + 0x87, 0x8c, 0x5c, 0x7a, 0x15, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, 0x30, 0x01, + 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, 0x8e, 0x68, + 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, 0xfc, 0xc8, + 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x9e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, 0xc6, 0xc1, + 0x2b, 0xb0, 0x7c, 0x44, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x61, 0x29, 0x66, 0xf1, 0xfc, 0x46, + 0xe3, 0xd0, 0xb8, 0xd5, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, 0x8b, 0xa1, + 0xe7, 0x05, 0x7f, 0x17, 0x16, 0x23, 0x24, 0xdf, 0xe9, 0x13, 0xc8, 0xf3, 0x15, 0x55, 0x3c, 0xab, + 0xa9, 0x88, 0x8a, 0x3d, 0x04, 0x00, 0x37, 0x61, 0x89, 0x73, 0x1a, 0x3c, 0x2b, 0x33, 0xab, 0x84, + 0x8f, 0x7f, 0x29, 0x7e, 0x4c, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, 0x06, 0x1d, + 0x0e, 0x6d, 0xcf, 0x11, 0x4a, 0x6a, 0x30, 0x4f, 0xbc, 0x89, 0x70, 0xb3, 0x6c, 0xf1, 0x9f, 0xa2, + 0x40, 0xfa, 0xc4, 0x75, 0x55, 0x9d, 0x49, 0x82, 0x73, 0x27, 0xb6, 0x3b, 0x8e, 0x0e, 0x9b, 0x20, + 0x78, 0xd9, 0xd8, 0xfe, 0xf9, 0x58, 0x5e, 0x67, 0xf2, 0x42, 0x47, 0xcc, 0xe0, 0x06, 0x8e, 0x03, + 0xe2, 0xab, 0x4a, 0x13, 0xbf, 0xf1, 0x31, 0x54, 0x1a, 0x7d, 0xdb, 0xf3, 0x88, 0x3b, 0xd3, 0x07, + 0xa4, 0x8d, 0xa6, 0xb2, 0x6a, 0x59, 0x22, 0x9a, 0xfe, 0x39, 0x61, 0x71, 0x95, 0x73, 0x0a, 0xff, + 0x27, 0x07, 0xa5, 0xe8, 0xd8, 0x7c, 0x07, 0xca, 0x01, 0x4f, 0x8e, 0xa8, 0x50, 0x19, 0xcf, 0xd9, + 0x89, 0x8b, 0xa1, 0x5c, 0xae, 0x1b, 0x46, 0x55, 0xcd, 0x5a, 0x33, 0x95, 0x87, 0x28, 0xea, 0x56, + 0x0c, 0x45, 0x3f, 0x82, 0xe5, 0x81, 0x77, 0x46, 0xc7, 0x9e, 0xa3, 0x5c, 0x0a, 0xcc, 0x79, 0x51, + 0x2e, 0xeb, 0x7a, 0x0b, 0x88, 0xbd, 0xb5, 0xd2, 0x70, 0x74, 0x00, 0x35, 0x3a, 0x66, 0x49, 0x15, + 0xf9, 0x6b, 0x55, 0x4c, 0xe1, 0xd1, 0x63, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, 0xf1, 0x78, + 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x69, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, 0xcd, 0xf3, + 0x4d, 0xbc, 0x49, 0xcb, 0x11, 0x27, 0xbd, 0x6c, 0x49, 0x02, 0x3f, 0x82, 0xd5, 0x64, 0x4b, 0x93, + 0xb5, 0x6e, 0x42, 0x51, 0x56, 0x77, 0xa0, 0x0a, 0x29, 0x24, 0xf1, 0x6f, 0x0c, 0x58, 0x99, 0x6a, + 0x82, 0xe8, 0x09, 0x54, 0x2e, 0x06, 0xae, 0x4b, 0x9c, 0xce, 0xad, 0xce, 0x98, 0x0e, 0x46, 0x5f, + 0xc2, 0xa2, 0x3f, 0xf6, 0xbc, 0x81, 0x77, 0x1e, 0x76, 0xed, 0xeb, 0x85, 0x13, 0x68, 0xdc, 0x10, + 0x67, 0x9f, 0xdf, 0x9e, 0x22, 0xe3, 0x23, 0x4f, 0x0d, 0xcd, 0x53, 0x1e, 0x9b, 0x91, 0xcd, 0xfa, + 0xa7, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0x3f, 0x1b, 0x50, 0x0a, 0x2f, 0x60, 0xb3, 0x7a, + 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, 0xae, 0x48, + 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x08, 0x05, 0x3e, 0xb4, 0x03, + 0x73, 0x41, 0x04, 0x20, 0xf3, 0x72, 0x28, 0x11, 0xf8, 0x89, 0xe8, 0x6e, 0xca, 0x69, 0x1e, 0xff, + 0x48, 0xd6, 0xb8, 0x51, 0xf6, 0x4f, 0x06, 0x7c, 0x74, 0x44, 0xd8, 0x9b, 0xd4, 0x95, 0x3b, 0x8a, + 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6d, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, 0x16, 0xda, + 0x81, 0x65, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, 0xcb, 0x76, + 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, 0x75, 0x3b, + 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0xf1, 0x19, 0xac, 0xa5, 0x6d, 0x0c, 0xd3, 0xc3, 0x8d, + 0x09, 0xd3, 0xc3, 0x7f, 0x8b, 0xba, 0x0f, 0x9f, 0x14, 0x2a, 0xb7, 0x21, 0x2d, 0xee, 0x46, 0xca, + 0x2c, 0x95, 0xa5, 0x88, 0xc6, 0xef, 0x60, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xc7, 0xb0, 0x92, 0x7e, + 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0x8b, 0x41, 0xc0, 0x6f, + 0x1b, 0x34, 0x9a, 0x52, 0x8f, 0xa1, 0xc4, 0xe9, 0x99, 0x65, 0x67, 0x42, 0xd1, 0x21, 0x3d, 0x7b, + 0xec, 0x32, 0xd5, 0xbb, 0x43, 0x12, 0x7f, 0x1f, 0xaa, 0x9a, 0xb6, 0xb0, 0x04, 0x38, 0x95, 0x55, + 0x02, 0x6a, 0x0f, 0x4b, 0x22, 0xf0, 0x7d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0x49, 0xcf, 0xd8, + 0x1c, 0x3f, 0x84, 0x15, 0x8b, 0x0c, 0xe9, 0x84, 0xe8, 0xc0, 0x35, 0x28, 0x0c, 0x3c, 0x87, 0xbc, + 0x0f, 0xbf, 0x96, 0x08, 0x02, 0x7f, 0x0f, 0x96, 0x75, 0x28, 0x37, 0xe7, 0x01, 0x54, 0x3d, 0x72, + 0x79, 0x28, 0xcd, 0xb5, 0xe2, 0x84, 0xa5, 0xb8, 0xf8, 0x33, 0x58, 0xb5, 0x48, 0xcf, 0x27, 0x41, + 0x5f, 0x8f, 0xcc, 0x8c, 0x7d, 0xbe, 0x01, 0x77, 0x4e, 0x09, 0xd3, 0xc4, 0xaf, 0x87, 0x17, 0xa1, + 0xd0, 0x1c, 0x8e, 0xd8, 0xd5, 0xde, 0x7f, 0x2b, 0x50, 0x54, 0x0f, 0x0f, 0xd4, 0x80, 0x4a, 0xc7, + 0xb7, 0xbb, 0x17, 0xf2, 0x13, 0x16, 0x32, 0xa7, 0xbe, 0x6a, 0x29, 0x9d, 0xf5, 0xf5, 0x8c, 0x15, + 0x7e, 0xbb, 0x9b, 0xfb, 0xa6, 0x81, 0xbe, 0x82, 0x5a, 0xfa, 0xcb, 0x0c, 0xc2, 0x1a, 0x7e, 0xc6, + 0x87, 0xa7, 0xfa, 0xf6, 0xb5, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0x72, 0x81, 0xf4, 0xc7, + 0x65, 0xea, 0xcb, 0x47, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0xde, 0x88, 0xae, 0xa8, 0x7f, 0xd2, 0x40, + 0x1f, 0x27, 0xb7, 0xce, 0xf8, 0x10, 0x52, 0xbf, 0x77, 0x1d, 0x44, 0x2a, 0xee, 0x40, 0x35, 0xf9, + 0x30, 0x47, 0xba, 0x4b, 0x99, 0x0f, 0xff, 0xfa, 0xd6, 0x35, 0x88, 0x48, 0x6b, 0x72, 0x3f, 0xb4, + 0x3d, 0xd3, 0x94, 0x2c, 0xad, 0x19, 0x8f, 0x75, 0x3c, 0x87, 0x7e, 0x0e, 0x68, 0xfa, 0xb5, 0x89, + 0xee, 0xdf, 0xe6, 0x65, 0x5c, 0xc7, 0x37, 0xa0, 0xe4, 0x0e, 0x3f, 0x83, 0x95, 0xa9, 0x77, 0x12, + 0xfa, 0xba, 0x26, 0x3a, 0xeb, 0xfd, 0x59, 0xff, 0xf8, 0x7a, 0x50, 0xe4, 0xc0, 0xf4, 0x73, 0x25, + 0xe1, 0xc0, 0xcc, 0x87, 0x51, 0xc2, 0x81, 0x19, 0x6f, 0x1e, 0x59, 0x6b, 0xe1, 0x35, 0x39, 0x51, + 0x6b, 0xa9, 0xeb, 0x74, 0xa2, 0xd6, 0x12, 0xf7, 0x6a, 0x3c, 0x87, 0x9e, 0x42, 0x51, 0xb1, 0xd0, + 0xe6, 0x34, 0x2c, 0xd4, 0xb0, 0x91, 0xb5, 0x24, 0x15, 0x9c, 0xc0, 0xa2, 0x7e, 0xa3, 0x40, 0x5b, + 0x33, 0xdf, 0x5b, 0x52, 0xd5, 0xb5, 0xef, 0xb1, 0xc8, 0x29, 0x31, 0x1d, 0xd3, 0x4e, 0xe9, 0xf7, + 0x84, 0xb4, 0x53, 0xf1, 0x38, 0xc5, 0x73, 0xa8, 0x27, 0xbe, 0x09, 0x4e, 0x4d, 0x06, 0xf4, 0x20, + 0x29, 0x33, 0x6b, 0x8a, 0xd6, 0xef, 0xdf, 0x88, 0x93, 0xfb, 0x34, 0xa1, 0x1c, 0xf5, 0x71, 0xf4, + 0x91, 0x26, 0x94, 0x9e, 0x15, 0xf5, 0xcd, 0xec, 0x45, 0xa9, 0xe6, 0x31, 0x14, 0x55, 0x47, 0x4f, + 0xe4, 0x20, 0xd9, 0xe5, 0xeb, 0x35, 0xfd, 0x89, 0xce, 0x1b, 0x23, 0x9e, 0x43, 0xcf, 0x01, 0xe2, + 0xd6, 0x8d, 0xee, 0x26, 0xa6, 0x46, 0xaa, 0xf9, 0xd7, 0xeb, 0x33, 0x56, 0xc3, 0xb0, 0x2f, 0xea, + 0x9d, 0x3c, 0x91, 0xc6, 0x8c, 0x16, 0x9f, 0x69, 0xcd, 0x33, 0xa8, 0x26, 0x1b, 0x7c, 0xa2, 0x11, + 0x64, 0xf6, 0xfe, 0x2c, 0x3d, 0x07, 0x8f, 0xff, 0xf2, 0x61, 0xcb, 0xf8, 0xfb, 0x87, 0x2d, 0xe3, + 0x9f, 0x1f, 0xb6, 0x8c, 0xdf, 0xff, 0x6b, 0x6b, 0x0e, 0x70, 0xb7, 0xbf, 0xdb, 0x25, 0xbe, 0xb7, + 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8c, 0x3f, 0xea, 0x06, 0xc4, 0x9f, 0x10, + 0xff, 0xab, 0xdc, 0xe8, 0xec, 0x6c, 0x41, 0xfc, 0x49, 0xf3, 0xc5, 0xff, 0x02, 0x00, 0x00, 0xff, + 0xff, 0x98, 0x74, 0xa0, 0x5d, 0xbe, 0x19, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3305,10 +3190,10 @@ type ControlClient interface { GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*RefreshReposReply, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*SetDefaultRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3477,8 +3362,8 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt return out, nil } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) if err != nil { return nil, err @@ -3495,8 +3380,8 @@ func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, o return out, nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*RefreshReposReply, error) { - out := new(RefreshReposReply) +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) if err != nil { return nil, err @@ -3504,8 +3389,8 @@ func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposReques return out, nil } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*SetDefaultRepoReply, error) { - out := new(SetDefaultRepoReply) +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) if err != nil { return nil, err @@ -3530,10 +3415,10 @@ type ControlServer interface { GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + AddRepo(context.Context, *AddRepoRequest) (*Empty, error) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*RefreshReposReply, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) } // UnimplementedControlServer can be embedded to have forward compatible implementations. @@ -3585,16 +3470,16 @@ func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") } func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*RefreshReposReply, error) { +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*SetDefaultRepoReply, error) { +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") } @@ -6141,40 +6026,6 @@ func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6236,17 +6087,7 @@ func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.NewDefaultRepo) i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) i-- - dAtA[i] = 0x12 - } - if m.Ok { - i-- - if m.Ok { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -6283,40 +6124,6 @@ func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *RefreshReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -6349,7 +6156,7 @@ func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { +func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6359,12 +6166,12 @@ func (m *SetDefaultRepoReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetDefaultRepoReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6373,13 +6180,6 @@ func (m *SetDefaultRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ErrorString) > 0 { - i -= len(m.ErrorString) - copy(dAtA[i:], m.ErrorString) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ErrorString))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } @@ -7371,22 +7171,6 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *RemoveRepoRequest) Size() (n int) { if m == nil { return 0 @@ -7408,9 +7192,6 @@ func (m *RemoveRepoReply) Size() (n int) { } var l int _ = l - if m.Ok { - n += 2 - } l = len(m.NewDefaultRepo) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -7436,22 +7217,6 @@ func (m *RefreshReposRequest) Size() (n int) { return n } -func (m *RefreshReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *SetDefaultRepoRequest) Size() (n int) { if m == nil { return 0 @@ -7467,16 +7232,12 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetDefaultRepoReply) Size() (n int) { +func (m *Empty) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.ErrorString) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13027,92 +12788,6 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *RemoveRepoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13216,26 +12891,6 @@ func (m *RemoveRepoReply) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ok = bool(v != 0) - case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) } @@ -13365,92 +13020,6 @@ func (m *RefreshReposRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *RefreshReposReply) 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 ErrIntOverflowO2Control - } - 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: RefreshReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13524,7 +13093,7 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetDefaultRepoReply) Unmarshal(dAtA []byte) error { +func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13547,44 +13116,12 @@ func (m *SetDefaultRepoReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetDefaultRepoReply: wiretype end group for non-group") + return fmt.Errorf("proto: Empty: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ErrorString", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ErrorString = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) From deb10945c3ed233431a3386e98895ae76088d129 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 21 Oct 2019 10:01:54 +0200 Subject: [PATCH 0041/2352] [build] Bump to v0.11.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 59f25fd77..b55e86ab6 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 11 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 513cc9a1e9c7fcdeb0a618365baa3f3e0456f8e4 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 28 Oct 2019 11:50:52 +0100 Subject: [PATCH 0042/2352] [coconut + core] Improve template list functionality --- coconut/cmd/template_list.go | 10 +++--- coconut/control/control.go | 15 ++------- coconut/protos/o2control.pb.go | 58 ++++++++++------------------------ core/protos/o2control.pb.go | 58 ++++++++++------------------------ core/repos/repomanager.go | 10 +++--- executor/protos/occ.pb.go | 58 ++++++++++------------------------ 6 files changed, 62 insertions(+), 147 deletions(-) diff --git a/coconut/cmd/template_list.go b/coconut/cmd/template_list.go index e220e77ae..f086859c1 100644 --- a/coconut/cmd/template_list.go +++ b/coconut/cmd/template_list.go @@ -44,11 +44,11 @@ These workflow templates can then be loaded to create an environment. ` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories * ` + "`coconut templ list *AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * ` + "`coconut templ list *@v*`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories - * ` + "`coconut templ list --repo=*AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list --repository=*AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * ` + "`coconut templ list --revision=dev*`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories - * ` + "`coconut templ list --repo=*gitlab.cern.ch* --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` + * ` + "`coconut templ list --repository=*gitlab.cern.ch* --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` * ` + "`coconut templ list --all-branches`" + ` lists templates from all branches for all git repositories - * ` + "`coconut templ list --repo=*github.com* --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern + * ` + "`coconut templ list --repository=*github.com* --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern * ` + "`coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 `" + ` lists templates from the commit corresponding to the hash for all git repositories`, Run: control.WrapCall(control.ListWorkflowTemplates), @@ -57,8 +57,8 @@ These workflow templates can then be loaded to create an environment. func init() { templateCmd.AddCommand(templateListCmd) - templateListCmd.Flags().StringP("repository", "r", "*", "repositories to list templates from") - templateListCmd.Flags().StringP("revision", "i", "master", "revisions (branches/tags) to list templates from") + templateListCmd.Flags().StringP("repository", "r", "", "repositories to list templates from") + templateListCmd.Flags().StringP("revision", "i", "", "revisions (branches/tags) to list templates from") templateListCmd.Flags().BoolP("all-branches", "b", false, "list templates from all branches") templateListCmd.Flags().BoolP("all-tags", "t", false, "list templates from all tags") } \ No newline at end of file diff --git a/coconut/control/control.go b/coconut/control/control.go index 0a4e92e98..bde7883b6 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -491,8 +491,8 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, // ListWorkflowTemplates lists the available workflow templates and the git repo on which they reside. func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - repoPattern := "*" - revisionPattern := "master" + repoPattern := "" + revisionPattern := "" // Let the API take care of defaults allBranches := false allTags := false @@ -501,21 +501,12 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob if err != nil { return } - if len(repoPattern) == 0 { - err = errors.New("cannot query for an empty repo") - return - } revisionPattern, err = cmd.Flags().GetString("revision") if err != nil { return } - if len(revisionPattern) == 0 { - err = errors.New("cannot query for an empty revision") - return - } - allBranches, err = cmd.Flags().GetBool("all-branches") if err != nil { return @@ -527,7 +518,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob } if allBranches || allTags { - if revisionPattern != "master" { + if revisionPattern != "" { fmt.Fprintln(o, "Ignoring `--all-{branches,tags}` flags, as a valid revision has been specified") allBranches = false allTags = false diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 122978e5f..828244624 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -13150,6 +13150,7 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13181,10 +13182,8 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13205,55 +13204,30 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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 := skipO2Control(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupO2Control + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") ) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 122978e5f..828244624 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -13150,6 +13150,7 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13181,10 +13182,8 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13205,55 +13204,30 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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 := skipO2Control(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupO2Control + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") ) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 592957e10..992648d34 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -457,14 +457,16 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat templateList := make(TemplatesByRepo) numTemplates := 0 - if repoPattern == "" { + if repoPattern == "" { // all repos if unspecified repoPattern = "*" } - if revisionPattern == "" { + if allBranches || allTags { + if revisionPattern != "" { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error + return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") + } + } else if revisionPattern == "" { // master if unspecified revisionPattern = "master" - } else if allBranches || allTags { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error - return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") } // Prepare the gitRefs slice which will filter the git references diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 5f74bc308..b301392e5 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -2427,6 +2427,7 @@ func (m *TransitionReply) Unmarshal(dAtA []byte) error { func skipOcc(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -2458,10 +2459,8 @@ func skipOcc(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -2482,55 +2481,30 @@ func skipOcc(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthOcc } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - 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 := skipOcc(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupOcc + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthOcc + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") ) From 9cf3f5a5b876aa94e9d58b156d9ae4662284d22d Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 1 Nov 2019 11:52:34 +0100 Subject: [PATCH 0043/2352] [coconut] Handle incorrect repo default arg --- coconut/control/control.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index bde7883b6..636b98393 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -718,13 +718,17 @@ func RefreshRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comman // SetDefaultRepo selects the default repository based on the indexes reported by ListRepos. // It also updates the backend (consul or file) which holds a record for the default repository // which is persistent across core executions. -func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { +func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { if len(args) != 1 { - err = errors.New(fmt.Sprintf("accepts 1 arg, received %d", len(args))) + err := errors.New(fmt.Sprintf("accepts 1 arg, received %d", len(args))) return err } - index, _ := strconv.ParseInt(args[0], 10, 32) + index, err := strconv.ParseInt(args[0], 10, 32) + if err != nil { + fmt.Fprintln(o, "Wrong argument; should be repository's index") + return err + } _, err = rpc.SetDefaultRepo(cxt, &pb.SetDefaultRepoRequest{Index: int32(index)}, grpc.EmptyCallOption{}) if err != nil { From 3f2ab971767e357d6a4a1fe555174e67d1b071c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Jan 2020 09:46:47 +0100 Subject: [PATCH 0044/2352] Update README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 33d3ec6cd..881ac41ec 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ What is your use case? * I want to run AliECS (and other O²/FLP software) in a **multi-node setup** - :construction: No user instructions yet - contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. + :arrow_right: [Multi node O²/FLP software deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/utils/o2-flp-setup/README.md) (**BETA**) - or contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. * I want to ensure AliECS can **run and control my process** @@ -25,6 +25,10 @@ What is your use case? * My software does not use FairMQ and/or DPL, but should be controlled through a state machine :telescope: See [the OCC documentation](occ/README.md) to learn how to integrate the O² Control and Configuration library with your software. [Readout](https://github.com/AliceO2Group/Readout) is currently the only example of this setup. + + * My software is a command line utility with no state machine + + :palm_tree: Nothing to do, AliECS natively supports generic commands. * I want to build and run AliECS for **development** purposes From 714a2911dbe6994086bd85f29b63627a2f62ac77 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Dec 2019 16:22:08 +0000 Subject: [PATCH 0045/2352] [core] Add BASIC control mode --- common/controlmode/controlmode.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index 3ecb99637..42a221c15 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -37,6 +37,7 @@ type ControlMode int const( DIRECT ControlMode = iota FAIRMQ + BASIC ) func (cm *ControlMode) String() string { @@ -49,6 +50,8 @@ func (cm *ControlMode) String() string { return "direct" case FAIRMQ: return "fairmq" + case BASIC: + return "basic" } return "direct" } @@ -65,6 +68,8 @@ func (cm *ControlMode) UnmarshalText(b []byte) error { *cm = DIRECT case "fairmq": *cm = FAIRMQ + case "basic": + *cm = BASIC default: *cm = DIRECT } From dd049f1b381f69bc205459fe17b93e3e5cf1945f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Dec 2019 16:23:11 +0000 Subject: [PATCH 0046/2352] [core] Normalize interface of task.Task --- core/task/manager.go | 12 +++++------- core/task/task.go | 31 +++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 086256763..8c503f7be 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -27,15 +27,15 @@ package task import ( "errors" "fmt" + "io/ioutil" + "strings" + "sync" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" "gopkg.in/yaml.v2" - "io/ioutil" - - "strings" - "sync" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" @@ -83,9 +83,7 @@ func NewManager(resourceOffersDone <-chan DeploymentMap, // constructed Task. // This function should only be called by the Mesos scheduler controller when // matching role requests with offers (matchRoles). -// The new role is not assigned to an environment and comes without a roleClass -// function, as those two are filled out later on by Manager.AcquireTasks. -func (m*Manager) NewTaskForMesosOffer(offer *mesos.Offer, descriptor *Descriptor, bindPorts map[string]uint64, executorId mesos.ExecutorID) (t *Task) { +func (m *Manager) NewTaskForMesosOffer(offer *mesos.Offer, descriptor *Descriptor, bindPorts map[string]uint64, executorId mesos.ExecutorID) (t *Task) { newId := uuid.NewUUID().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), diff --git a/core/task/task.go b/core/task/task.go index 660200fa6..be599d77b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -55,6 +55,29 @@ type parentRole interface { //GetVars() } +/* +type Task interface { + GetParentRole() interface{} + GetParentRolePath() string + IsLocked() bool + GetName() string + GetClassName() string + BuildTaskCommand() *common.TaskCommandInfo + GetWantsCPU() float64 + GetWantsMemory() float64 + GetWantsPorts() Ranges + GetOfferId() string + GetTaskId() string + GetExecutorId() string + GetAgentId() string + GetHostname() string + GetEnvironmentId() uuid.Array + GetBindPorts() map[string]uint64 + BuildPropertyMap(bindMap channel.BindMap) controlcommands.PropertyMap + GetMesosCommandTarget() controlcommands.MesosCommandTarget +}*/ + + type Task struct { parent parentRole className string @@ -83,7 +106,7 @@ func (t *Task) GetParentRolePath() string { return t.parent.GetPath() } -func (t Task) IsLocked() bool { +func (t *Task) IsLocked() bool { return len(t.hostname) > 0 && len(t.agentId) > 0 && len(t.offerId) > 0 && @@ -167,15 +190,15 @@ func (t *Task) GetWantsPorts() Ranges { return nil } -func (t Task) GetOfferId() string { +func (t *Task) GetOfferId() string { return t.offerId } -func (t Task) GetTaskId() string { +func (t *Task) GetTaskId() string { return t.taskId } -func (t Task) GetExecutorId() string { +func (t *Task) GetExecutorId() string { return t.executorId } From d04d21148eca40631c5a08d9652d9eee65d04800 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 09:30:37 +0100 Subject: [PATCH 0047/2352] [misc] Add fx3-copy-executors utility script for quick lab deployment --- hacking/fx3-copy-executors | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 hacking/fx3-copy-executors diff --git a/hacking/fx3-copy-executors b/hacking/fx3-copy-executors new file mode 100755 index 000000000..f51222fc0 --- /dev/null +++ b/hacking/fx3-copy-executors @@ -0,0 +1,2 @@ +#!/bin/bash +psshscp -h lab-inventory -l root -A bin/o2control-executor /opt/ From bc4af35506b0e53de9410fe41111a29f2baeca91 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 09:35:44 +0100 Subject: [PATCH 0048/2352] [misc] Add protoString utility function to utils --- common/utils/utils.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index f18017910..f8a4a996f 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -1,3 +1,27 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package utils import ( @@ -25,4 +49,7 @@ func EnsureTrailingSlash(path *string) { if !strings.HasSuffix(*path, "/") { //Add trailing '/' *path += "/" } -} \ No newline at end of file +} + +// helper func to package strings up nicely for protobuf +func ProtoString(s string) *string { return &s } From 4da0306536046eeab69034228faac0944e2b902b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 09:37:23 +0100 Subject: [PATCH 0049/2352] [executor] Refactor for lockless concurrency and ControllableTask --- executor/executable/basictask.go | 55 ++ executor/executable/controllabletask.go | 371 +++++++++++ executor/executable/task.go | 140 ++++ executor/executor.go | 616 ++---------------- executor/executorcmd/client.go | 28 +- .../executorcmd/executorcommand_transition.go | 6 +- executor/handlers.go | 215 ++++++ 7 files changed, 855 insertions(+), 576 deletions(-) create mode 100644 executor/executable/basictask.go create mode 100644 executor/executable/controllabletask.go create mode 100644 executor/executable/task.go create mode 100644 executor/handlers.go diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go new file mode 100644 index 000000000..8d07ac90c --- /dev/null +++ b/executor/executable/basictask.go @@ -0,0 +1,55 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd" +) + +type BasicTask struct { + taskBase +} + +func (b *BasicTask) Launch() error { + panic("implement me") +} + +func (b *BasicTask) Kill() error { + panic("implement me") +} + +func (b *BasicTask) Transition(transition *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { + panic("implement me") +} + +func (b *BasicTask) UnmarshalTransition([]byte) (*executorcmd.ExecutorCommand_Transition, error) { + panic("implement me") +} + +type HookTask struct { + taskBase +} + diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go new file mode 100644 index 000000000..b49b036c4 --- /dev/null +++ b/executor/executable/controllabletask.go @@ -0,0 +1,371 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "context" + "encoding/json" + "errors" + "io" + "syscall" + "time" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd" + pb "github.com/AliceO2Group/Control/executor/protos" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" +) + +type ControllableTask struct { + taskBase + rpc *executorcmd.RpcClient + pendingFinalTaskStateCh chan mesos.TaskState +} + +func (t *ControllableTask) Launch() error { + t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed + taskCmd := prepareTaskCmd(t.tci) + log.WithField("payload", string(t.ti.GetData()[:])). + WithField("task", t.ti.Name). + Debug("starting task") + + // Set up pipes for controlled process + var errStdout, errStderr error + stdoutIn, _ := taskCmd.StdoutPipe() + stderrIn, _ := taskCmd.StderrPipe() + + err := taskCmd.Start() + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "command": *t.tci.Value, + }). + Error("failed to run task") + + t.sendStatus(mesos.TASK_FAILED, err.Error()) + return err + } + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("task started") + + go func() { + _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer(), stdoutIn) + }() + go func() { + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer(), stderrIn) + }() + + log.WithFields(logrus.Fields{ + "controlPort": t.tci.ControlPort, + "controlMode": t.tci.ControlMode.String(), + "task": t.ti.Name, + "id": t.ti.TaskID.Value, + }). + Debug("starting gRPC client") + t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode) + if t.rpc == nil { + return errors.New("could not start gRPC client") + } + t.rpc.TaskCmd = taskCmd + + // We fork out into a goroutine for the actual process management. + // Control returns to the event loop which can safely access *internalState. + // Anything in the following goroutine must not touch *internalState, except via channels. + go func() { + elapsed := 0 * time.Second + for { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "elapsed": elapsed.String(), + }). + Debug("polling task for IDLE state reached") + + response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("task", t.ti.Name). + Info("cannot query task status") + } else { + log.WithField("state", response.GetState()). + WithField("task", t.ti.Name). + Debug("task status queried") + } + // NOTE: we acquire the transitioner-dependent STANDBY equivalent state + reachedState := t.rpc.FromDeviceState(response.GetState()) + + if reachedState == "STANDBY" && err == nil { + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("task running and ready for control input") + break + } else if reachedState == "DONE" || reachedState == "ERROR" { + // something went wrong, the device moved to DONE or ERROR on startup + _ = syscall.Kill(-taskCmd.Process.Pid, syscall.SIGKILL) + + log.WithField("task", t.ti.Name).Debug("task killed") + t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") + return + } else if elapsed >= startupTimeout { + err = errors.New("timeout while waiting for task startup") + log.WithField("task", t.ti.Name).Error(err.Error()) + t.sendStatus(mesos.TASK_FAILED, err.Error()) + _ = t.rpc.Close() + t.rpc = nil + return + } else { + log.WithField("task", t.ti.Name). + Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) + time.Sleep(startupPollingInterval) + elapsed += startupPollingInterval + } + } + + // Set up event stream from task + esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("task", t.ti.Name). + WithError(err). + Error("cannot set up event stream from task") + t.sendStatus(mesos.TASK_FAILED, err.Error()) + _ = t.rpc.Close() + t.rpc = nil + return + } + + log.WithField("task", t.ti.Name).Debug("notifying of task running state") + + // send RUNNING + t.sendStatus(mesos.TASK_RUNNING, "") + + // Process events from task in yet another goroutine + go func() { + deo := event.DeviceEventOrigin{ + AgentId: t.ti.AgentID, + ExecutorId: t.ti.GetExecutor().ExecutorID, + TaskId: t.ti.TaskID, + } + for { + if t.rpc == nil { + log.WithError(err).Warning("event stream done") + break + } + esr, err := esc.Recv() + if err == io.EOF { + log.WithError(err).Warning("event stream EOF") + break + } + if err != nil { + log.WithError(err).Warning("error receiving event from task") + continue + } + ev := esr.GetEvent() + + deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) + if deviceEvent == nil { + log.Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") + break + } + + t.sendDeviceEvent(deviceEvent) + } + }() + + err = taskCmd.Wait() + // ^ when this unblocks, the task is done + + pendingState := mesos.TASK_FINISHED + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + }). + Error("process terminated with error") + pendingState = mesos.TASK_FAILED + } + + select { + case pending := <- t.pendingFinalTaskStateCh: + pendingState = pending + default: + } + + if t.rpc != nil { + _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much + log.Debug("rpc client closed") + t.rpc = nil + log.Debug("rpc client removed") + } + + if errStdout != nil || errStderr != nil { + log.WithFields(logrus.Fields{ + "errStderr": errStderr, + "errStdout": errStdout, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + }). + Warning("failed to capture stdout or stderr of task") + } + + log.WithField("task", t.ti.Name). + WithField("status", pendingState.String()). + Debug("sending final status update") + t.sendStatus(pendingState, "") + }() + + log.WithField("task", t.ti.Name).Debug("gRPC client running, handler forked") + return nil +} + +func (t *ControllableTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { + cmd = new(executorcmd.ExecutorCommand_Transition) + if t.rpc == nil { + err = errors.New("cannot unmarshal transition: RPC is down") + cmd = nil + return + } + cmd.Rpc = t.rpc + err = json.Unmarshal(data, cmd) + if err != nil { + cmd = nil + } + return +} + +func (t *ControllableTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { + newState, transitionError := cmd.Commit() + + response := cmd.PrepareResponse(transitionError, newState, t.ti.TaskID.Value) + return response +} + +func (t *ControllableTask) Kill() error { + response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Error("cannot query task status") + } else { + log.WithField("state", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried") + } + + // NOTE: we acquire the transitioner-dependent STANDBY equivalent state + reachedState := t.rpc.FromDeviceState(response.GetState()) + + + nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { + log.WithField("currentState", currentState). + Debug("nextTransition(currentState) BEGIN") + var evt, destination string + switch currentState { + case "RUNNING": + evt = "STOP" + destination = "CONFIGURED" + case "CONFIGURED": + evt = "RESET" + destination = "STANDBY" + case "ERROR": + evt = "RECOVER" + destination = "STANDBY" + case "STANDBY": + evt = "EXIT" + destination = "DONE" + } + log.WithField("evt", evt). + WithField("dst", destination). + Debug("nextTransition(currentState) BEGIN") + + exc = executorcmd.NewLocalExecutorCommand_Transition( + t.rpc, + []controlcommands.MesosCommandTarget{ + { + AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a + ExecutorId: mesos.ExecutorID{}, // local transition + TaskId: t.ti.GetTaskID(), + }, + }, + reachedState, + evt, + destination, + nil, + ) + return + } + + for reachedState != "DONE" { + cmd := nextTransition(reachedState) + log.WithFields(logrus.Fields{ + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + }). + Debug("state DONE not reached, about to commit transition") + + newState, transitionError := cmd.Commit() + + log.WithField("newState", newState). + WithError(transitionError). + Debug("transition committed") + if transitionError != nil || len(cmd.Event) == 0 { + log.WithError(transitionError).Error("cannot gracefully end task") + break + } + reachedState = newState + } + + log.Debug("end transition loop done") + + pid := t.rpc.TaskCmd.Process.Pid + _ = t.rpc.Close() + t.rpc = nil + + if reachedState == "DONE" { + log.Debug("task exited correctly") + t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED + } else { // something went wrong + log.Debug("task killed") + t.pendingFinalTaskStateCh <- mesos.TASK_KILLED + } + + + // TODO: do a SIGTERM before the SIGKILL + + // When killing we must always use syscall.Kill with a negative PID, in order to kill all + // children which were assigned the same PGID at launch + killErr := syscall.Kill(-pid, syscall.SIGKILL) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") + } + + return killErr +} \ No newline at end of file diff --git a/executor/executable/task.go b/executor/executable/task.go new file mode 100644 index 000000000..36d6ee839 --- /dev/null +++ b/executor/executable/task.go @@ -0,0 +1,140 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "encoding/json" + "errors" + "os" + "os/exec" + "strings" + "syscall" + "time" + + "github.com/AliceO2Group/Control/common" + "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/sirupsen/logrus" +) + +const( + startupPollingInterval = 500 * time.Millisecond + startupTimeout = 30 * time.Second +) + +var log = logger.New(logrus.StandardLogger(), "executor") + +type SendStatusFunc func(state mesos.TaskState, message string) +type SendDeviceEventFunc func(event event.DeviceEvent) + +type Task interface { + Launch() error + Kill() error + Transition(transition *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition + UnmarshalTransition([]byte) (*executorcmd.ExecutorCommand_Transition, error) +} + +type taskBase struct { + ti *mesos.TaskInfo + tci *common.TaskCommandInfo + tcmd *exec.Cmd + + sendStatus SendStatusFunc + sendDeviceEvent SendDeviceEventFunc +} + +func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc) Task { + var commandInfo common.TaskCommandInfo + + tciData := taskInfo.GetData() + + log.WithField("json", string(tciData[:])).Trace("received TaskCommandInfo") + if err := json.Unmarshal(tciData, &commandInfo); tciData != nil && err == nil { + log.WithFields(logrus.Fields{ + "shell": *commandInfo.Shell, + "value": *commandInfo.Value, + "args": commandInfo.Arguments, + "task": taskInfo.Name, + }). + Info("instantiating task") + } else { + if err != nil { + log.WithError(err).WithField("task", taskInfo.Name).Error("could not launch task") + } else { + log.WithError(errors.New("command data is nil")).WithField("task", taskInfo.Name).Error("could not launch task") + } + sendStatusFunc(mesos.TASK_FAILED, "TaskInfo.Data is nil") + return nil + } + + var newTask Task + // switch based on type of task + switch commandInfo.ControlMode { + case controlmode.BASIC: + newTask = &BasicTask{ + taskBase: taskBase{ + ti: &taskInfo, + tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + }, + } + case controlmode.DIRECT: + fallthrough + case controlmode.FAIRMQ: + newTask = &ControllableTask{ + taskBase: taskBase{ + ti: &taskInfo, + tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + }, + rpc: nil, + } + } + + return newTask +} + +func prepareTaskCmd(commandInfo *common.TaskCommandInfo) *exec.Cmd { + var taskCmd *exec.Cmd + if *commandInfo.Shell { + rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") + taskCmd = exec.Command("/bin/sh", []string{"-c", rawCommand}...) + } else { + taskCmd = exec.Command(*commandInfo.Value, commandInfo.Arguments...) + } + taskCmd.Env = append(os.Environ(), commandInfo.Env...) + + // We must setpgid(2) in order to be able to kill the whole process group which consists of + // the containing shell and all of its children + taskCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + + return taskCmd +} diff --git a/executor/executor.go b/executor/executor.go index 2a5d53d7c..c2c6e3d43 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -32,24 +32,14 @@ package executor import ( "context" - "encoding/json" "errors" - "fmt" "io" "net/url" - "os" - "os/exec" - "strings" "sync" - "syscall" "time" - "github.com/AliceO2Group/Control/common" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/executor/executorcmd" - "github.com/AliceO2Group/Control/executor/protos" + "github.com/AliceO2Group/Control/executor/executable" "github.com/golang/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" @@ -63,14 +53,11 @@ import ( "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpexec" "github.com/pborman/uuid" "github.com/sirupsen/logrus" - "google.golang.org/grpc" ) const ( apiPath = "/api/v1/executor" httpTimeout = 10 * time.Second - startupPollingInterval = 500 * time.Millisecond - startupTimeout = 30 * time.Second ) var log = logger.New(logrus.StandardLogger(), "executor") @@ -118,7 +105,12 @@ func Run(cfg config.Config) { unackedUpdates: make(map[string]executor.Call_Update), failedTasks: make(map[mesos.TaskID]mesos.TaskStatus), killedTasks: make(map[mesos.TaskID]mesos.TaskStatus), - rpcClients: make(map[mesos.TaskID]*executorcmd.RpcClient), + + // The executor keeps a map of controlled tasks. + activeTasks: make(map[mesos.TaskID]executable.Task), + + statusCh: make(chan mesos.TaskStatus), + messageCh: make(chan []byte), } subscriber = calls.SenderWith( // Here too, callOptions for all outgoing subscriber calls @@ -137,9 +129,7 @@ func Run(cfg config.Config) { func() { // We create the subscription call. If we haven't had an unclean disconnect, the lists of unacknowledged // tasks and updates are empty. - state.mu.RLock() subscribe := calls.Subscribe(unacknowledgedTasks(state), unacknowledgedUpdates(state)) - state.mu.RUnlock() log.Debug("subscribing to agent for events") // ↓ empty context ↓ we get a plain RequestFunc from the executor.Call value @@ -202,20 +192,53 @@ func unacknowledgedUpdates(state *internalState) (result []executor.Call_Update) return } +// nextEventNotify blocks waiting for an incoming event. When an event arrives, it is sent back via +// the eventCh channel, and the function quits. +func nextEventNotify(decoder encoding.Decoder, eventCh chan<- executor.Event, errorCh chan<- error) { + log.Trace("EVENT LOOP nextEventNotify start") + var e executor.Event + var err error + if err = decoder.Decode(&e); err == nil { + eventCh <- e + } else { + errorCh <- err + } +} + // eventLoop dispatches incoming events from mesos-agent to the events.Handler (built in buildEventhandler). func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) (err error) { - log.Debug("listening for events from agent") + log.Trace("listening for events from agent") ctx := context.TODO() // dummy context + + // The decoder object is the response obtained from the Mesos slave subscription. We use decoder.Decode + // to acquire the next event from Mesos. Unfortunately this call blocks, so we rather keep it in a separate + // goroutine and only pipe single events into the main loop as they come. + errorCh := make(chan error) // errors come through here + eventCh := make(chan executor.Event) // events from Mesos come through here + + // Spawn a goroutine to wait for the first event + go nextEventNotify(decoder, eventCh, errorCh) + for err == nil && !state.shouldQuit { - log.Debug("begin new event loop iteration") + log.Trace("EVENT LOOP begin new main event loop iteration") // housekeeping - state.mu.Lock() sendFailedTasks(state) - state.mu.Unlock() - var e executor.Event - if err = decoder.Decode(&e); err == nil { + select { + case e := <- eventCh: + log.Trace("EVENT LOOP about to handle event") err = h.HandleEvent(ctx, &e) + + // Spawn a goroutine to wait for the next event + go nextEventNotify(decoder, eventCh, errorCh) + case err = <- errorCh: + log.Trace("EVENT LOOP got error") + // Any error coming through here should immediately destroy the event loop and return + // control to the Mesos subscription handling. + case status := <- state.statusCh: + handleStatusUpdate(state, status) + case message := <- state.messageCh: + handleOutgoingMessage(state, message) } } return err @@ -225,57 +248,53 @@ func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) func buildEventHandler(state *internalState) events.Handler { return events.HandlerFuncs{ executor.Event_SUBSCRIBED: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") - state.mu.Lock() // With this event we get FrameworkInfo, ExecutorInfo, AgentInfo: state.framework = e.Subscribed.FrameworkInfo state.executor = e.Subscribed.ExecutorInfo state.agent = e.Subscribed.AgentInfo - state.mu.Unlock() return nil }, executor.Event_LAUNCH: func(_ context.Context, e *executor.Event) error { // Launch one task. We're not handling LAUNCH_GROUP. - log.WithField("event", e.Type.String()).Debug("handling event") - launch(state, e.Launch.Task) + log.WithField("event", e.Type.String()).Trace("handling event") + handleLaunchEvent(state, e.Launch.Task) return nil }, executor.Event_KILL: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") - return kill(state, e.Kill) + return handleKillEvent(state, e.Kill) }, executor.Event_ACKNOWLEDGED: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") - state.mu.Lock() delete(state.unackedTasks, e.Acknowledged.TaskID) delete(state.unackedUpdates, string(e.Acknowledged.UUID)) - state.mu.Unlock() return nil }, executor.Event_MESSAGE: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") log.WithFields(logrus.Fields{ "length": len(e.Message.Data), "message": string(e.Message.Data[:]), }). - Debug("received message data") - err := handleMessage(state, e.Message.Data) + Trace("received message data") + err := handleMessageEvent(state, e.Message.Data) if err != nil { log.WithField("error", err.Error()).Debug("MESSAGE handler error") } return err }, executor.Event_SHUTDOWN: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") state.shouldQuit = true return nil }, executor.Event_ERROR: func(_ context.Context, e *executor.Event) error { - log.WithField("event", e.Type.String()).Debug("handling event") + log.WithField("event", e.Type.String()).Trace("handling event") return errMustAbort }, }.Otherwise(func(_ context.Context, e *executor.Event) error { @@ -293,7 +312,7 @@ func sendFailedTasks(state *internalState) { "taskId": taskID.Value, "error": updateErr, }). - Error("failed to send status update for task") + Error("failed to send status update for task") } else { // If we have successfully notified Mesos, we clear our list of failed tasks. delete(state.failedTasks, taskID) @@ -301,520 +320,6 @@ func sendFailedTasks(state *internalState) { } } -func handleMessage(state *internalState, data []byte) (err error) { - var incoming struct { - Name string `json:"name"` - TargetList []struct{ - TaskId mesos.TaskID - } `json:"targetList"` - } - err = json.Unmarshal(data, &incoming) - if err != nil { - return - } - - if len(incoming.TargetList) != 1 { - err = fmt.Errorf("cannot apply ExecutorCommand with %d!=1 target taskIds", len(incoming.TargetList)) - return - } - - log.WithField("name", incoming.Name). - WithField("payload", string(data[:])). - Debug("processing incoming MESSAGE") - - switch incoming.Name { - case "MesosCommand_Transition": - taskId := incoming.TargetList[0].TaskId - - state.mu.RLock() - // Check whether we have a control connection to the running task - _, ok := state.rpcClients[taskId] - if !ok { - err = fmt.Errorf("no RPC client for taskId %s", taskId.Value) - log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": err.Error(), - }). - Error("cannot unmarshal incoming MESSAGE") - state.mu.RUnlock() - return - } - - var cmd *executorcmd.ExecutorCommand_Transition - cmd, err = state.rpcClients[taskId].UnmarshalTransition(data) - if err != nil { - log.WithFields(logrus.Fields{ - "name": cmd.Name, - "message": string(data[:]), - "error": err.Error(), - }). - Error("cannot unmarshal incoming MESSAGE") - state.mu.RUnlock() - return - } - state.mu.RUnlock() - - if cmd.Event == "CONFIGURE" { - log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") - } - - newState, transitionError := cmd.Commit() - - go func() { - response := cmd.PrepareResponse(transitionError, newState, taskId.Value) - data, marshalError := json.Marshal(response) - if marshalError != nil { - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "marshalError": marshalError, - }). - Error("cannot marshal MesosCommandResponse for sending as MESSAGE") - return - } - state.mu.Lock() - defer state.mu.Unlock() - state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "state": response.CurrentState, - }). - Debug("response sent") - }() - default: - err = errors.New(fmt.Sprintf("unrecognized controlcommand %s", incoming.Name)) - } - return -} - -// launch tries to launch a task described by a mesos.TaskInfo. -func launch(state *internalState, task mesos.TaskInfo) { - state.mu.Lock() - - state.unackedTasks[task.TaskID] = task - jsonTask, _ := json.MarshalIndent(task, "", "\t") - log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])).Debug("received task to launch") - - status := newStatus(state, task.TaskID) - - var commandInfo common.TaskCommandInfo - - tciData := task.GetData() - - log.WithField("json", string(tciData[:])).Debug("received TaskCommandInfo") - if err := json.Unmarshal(tciData, &commandInfo); tciData != nil && err == nil { - log.WithFields(logrus.Fields{ - "shell": *commandInfo.Shell, - "value": *commandInfo.Value, - "args": commandInfo.Arguments, - "task": task.Name, - }). - Info("launching task") - } else { - if err != nil { - log.WithError(err).WithField("task", task.Name).Error("could not launch task") - } else { - log.WithError(errors.New("command data is nil")).WithField("task", task.Name).Error("could not launch task") - } - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString("TaskInfo.Data is nil") - state.failedTasks[task.TaskID] = status - state.mu.Unlock() - return - } - state.mu.Unlock() - - var taskCmd *exec.Cmd - if *commandInfo.Shell { - rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") - taskCmd = exec.Command("/bin/sh", []string{"-c", rawCommand}...) - } else { - taskCmd = exec.Command(*commandInfo.Value, commandInfo.Arguments...) - } - taskCmd.Env = append(os.Environ(), commandInfo.Env...) - - // We must setpgid(2) in order to be able to kill the whole process group which consists of - // the containing shell and all of its children - taskCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - - var errStdout, errStderr error - stdoutIn, _ := taskCmd.StdoutPipe() - stderrIn, _ := taskCmd.StderrPipe() - - log.WithField("payload", string(task.GetData()[:])).WithField("task", task.Name).Debug("starting task") - err := taskCmd.Start() - if err != nil { - log.WithFields(logrus.Fields{ - "id": task.TaskID.Value, - "task": task.Name, - "error": err, - "command": *commandInfo.Value, - }). - Error("failed to run task") - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - state.mu.Lock() - state.failedTasks[task.TaskID] = status - state.mu.Unlock() - return - } - log.WithField("id", task.TaskID.Value).WithField("task", task.Name).Debug("task started") - - go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", task.Name).Writer(), stdoutIn) - }() - go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", task.Name).Writer(), stderrIn) - }() - - state.mu.Lock() - log.WithFields(logrus.Fields{ - "controlPort": commandInfo.ControlPort, - "controlMode": commandInfo.ControlMode.String(), - "task": task.Name, - "id": task.TaskID.Value, - }). - Debug("starting gRPC client") - state.rpcClients[task.TaskID] = executorcmd.NewClient(commandInfo.ControlPort, commandInfo.ControlMode) - state.rpcClients[task.TaskID].TaskCmd = taskCmd - state.mu.Unlock() - - go func() { - elapsed := 0 * time.Second - for { - log.WithFields(logrus.Fields{ - "id": task.TaskID.Value, - "task": task.Name, - "elapsed": elapsed.String(), - }). - Debug("polling task for IDLE state reached") - state.mu.RLock() - response, err := state.rpcClients[task.TaskID].GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err).WithField("task", task.Name).Info("cannot query task status") - } else { - log.WithField("state", response.GetState()).WithField("task", task.Name).Debug("task status queried") - } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - reachedState := state.rpcClients[task.TaskID].FromDeviceState(response.GetState()) - state.mu.RUnlock() - - if reachedState == "STANDBY" && err == nil { - log.WithField("id", task.TaskID.Value). - WithField("task", task.Name). - Debug("task running and ready for control input") - break - } else if reachedState == "DONE" || reachedState == "ERROR" { - // something went wrong, the device moved to DONE or ERROR on startup - state.mu.Lock() - log.Debug("state locked") - status := newStatus(state, task.TaskID) - _ = syscall.Kill(-taskCmd.Process.Pid, syscall.SIGKILL) - - log.WithField("task", task.Name).Debug("task killed") - status.State = mesos.TASK_FAILED.Enum() - - state.killedTasks[task.TaskID] = status - - log.Debug("unlocking state") - state.mu.Unlock() - return - } else if elapsed >= startupTimeout { - err = errors.New("timeout while waiting for task startup") - log.WithField("task", task.Name).Error(err.Error()) - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - - state.mu.Lock() - state.failedTasks[task.TaskID] = status - state.rpcClients[task.TaskID].Close() - delete(state.rpcClients, task.TaskID) - state.mu.Unlock() - return - } else { - log.WithField("task", task.Name).Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) - time.Sleep(startupPollingInterval) - elapsed += startupPollingInterval - } - } - - // Set up event stream from task - state.mu.RLock() - esc, err := state.rpcClients[task.TaskID].EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) - state.mu.RUnlock() - if err != nil { - log.WithField("task", task.Name).WithError(err).Error("cannot set up event stream from task") - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - - state.mu.Lock() - state.failedTasks[task.TaskID] = status - state.rpcClients[task.TaskID].Close() - delete(state.rpcClients, task.TaskID) - state.mu.Unlock() - return - } - - log.WithField("task", task.Name).Debug("notifying of task running state") - status.State = mesos.TASK_RUNNING.Enum() - - // send RUNNING - state.mu.Lock() - err = update(state, status) - if err != nil { - log.WithFields(logrus.Fields{ - "id": task.TaskID.Value, - "task": task.Name, - "error": err.Error(), - }). - Error("failed to send TASK_RUNNING") - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - - state.failedTasks[task.TaskID] = status - state.rpcClients[task.TaskID].Close() - delete(state.rpcClients, task.TaskID) - - if taskCmd.Process != nil { - log.WithFields(logrus.Fields{ - "process": taskCmd.Process.Pid, - "id": task.TaskID.Value, - "task": task.Name, - }). - Warning("killing leftover process") - err = syscall.Kill(-taskCmd.Process.Pid, syscall.SIGKILL) - if err != nil { - log.WithFields(logrus.Fields{ - "process": taskCmd.Process.Pid, - "id": task.TaskID.Value, - "task": task.Name, - }). - Error("cannot kill process") - } - } - state.mu.Unlock() - return - } - state.mu.Unlock() - - // Process events from task - go func() { - deo := event.DeviceEventOrigin{ - AgentId: task.AgentID, - ExecutorId: task.GetExecutor().ExecutorID, - TaskId: task.TaskID, - } - for { - if _, ok := state.rpcClients[task.TaskID]; !ok { - log.WithError(err).Warning("event stream done") - break - } - esr, err := esc.Recv() - if err == io.EOF { - log.WithError(err).Warning("event stream EOF") - break - } - if err != nil { - log.WithError(err).Warning("error receiving event from task") - continue - } - ev := esr.GetEvent() - - deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) - if deviceEvent == nil { - log.Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") - break - } - - jsonEvent, err := json.Marshal(deviceEvent) - if err != nil { - log.WithError(err).Warning("error marshaling event from task") - continue - } - - state.mu.RLock() - state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(jsonEvent))) - log.WithFields(logrus.Fields{ - "task": task.TaskID.Value, - "event": string(jsonEvent), - }). - Debug("event sent") - state.mu.RUnlock() - } - }() - - err = taskCmd.Wait() - - state.mu.Lock() - defer state.mu.Unlock() - if _, ok := state.rpcClients[task.TaskID]; ok { - state.rpcClients[task.TaskID].Close() // NOTE: might return non-nil error, but we don't care much - log.Debug("rpc client closed") - delete(state.rpcClients, task.TaskID) - log.Debug("rpc client removed") - } - - if _, ok := state.killedTasks[task.TaskID]; !ok && err != nil { - log.WithFields(logrus.Fields{ - "id": task.TaskID.Value, - "task": task.Name, - "error": err.Error(), - }). - Error("process terminated with error") - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - state.failedTasks[task.TaskID] = status - return - } - - if errStdout != nil || errStderr != nil { - log.WithFields(logrus.Fields{ - "errStderr": errStderr, - "errStdout": errStdout, - "id": task.TaskID.Value, - "task": task.Name, - }). - Warning("failed to capture stdout or stderr of task") - } - - if _, ok := state.killedTasks[task.TaskID]; ok { - status = state.killedTasks[task.TaskID] - delete(state.killedTasks, task.TaskID) - } else { - status = newStatus(state, task.TaskID) - status.State = mesos.TASK_FAILED.Enum() - } - log.WithField("task", task.Name). - WithField("status", status.State.String()). - Debug("sending final status update") - - err = update(state, status) - if err != nil { - log.WithFields(logrus.Fields{ - "id": task.TaskID.Value, - "name": task.Name, - "error": err.Error(), - }). - Error("failed to send final status update") - status.State = mesos.TASK_FAILED.Enum() - status.Message = protoString(err.Error()) - state.failedTasks[task.TaskID] = status - } - }() - log.WithField("task", task.Name).Debug("gRPC client running, handler forked") -} - -func kill(state *internalState, e *executor.Event_Kill) error { - state.mu.RLock() - rpcClient, ok := state.rpcClients[e.GetTaskID()] - if !ok { - state.mu.RUnlock() - return errors.New("invalid task ID") - } - response, err := rpcClient.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err).WithField("taskId", e.GetTaskID()).Error("cannot query task status") - } else { - log.WithField("state", response.GetState()).WithField("taskId", e.GetTaskID()).Debug("task status queried") - } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - reachedState := rpcClient.FromDeviceState(response.GetState()) - state.mu.RUnlock() - - nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { - log.WithField("currentState", currentState). - Debug("nextTransition(currentState) BEGIN") - var evt, destination string - switch currentState { - case "RUNNING": - evt = "STOP" - destination = "CONFIGURED" - case "CONFIGURED": - evt = "RESET" - destination = "STANDBY" - case "ERROR": - evt = "RECOVER" - destination = "STANDBY" - case "STANDBY": - evt = "EXIT" - destination = "DONE" - } - log.WithField("evt", evt). - WithField("dst", destination). - Debug("nextTransition(currentState) BEGIN") - - exc = executorcmd.NewLocalExecutorCommand_Transition( - rpcClient, - []controlcommands.MesosCommandTarget{ - { - AgentId: *state.agent.GetID(), - ExecutorId: state.executor.GetExecutorID(), - TaskId: e.GetTaskID(), - }, - }, - reachedState, - evt, - destination, - nil, - ) - return - } - - for reachedState != "DONE" { - cmd := nextTransition(reachedState) - log.WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - }). - Debug("state DONE not reached, about to commit transition") - newState, transitionError := cmd.Commit() - log.WithField("newState", newState). - WithError(transitionError). - Debug("transition committed") - if transitionError != nil || len(cmd.Event) == 0 { - log.WithError(transitionError).Error("cannot gracefully end task") - break - } - reachedState = newState - } - - log.Debug("end transition loop done") - - state.mu.Lock() - log.Debug("state locked") - - status := newStatus(state, e.GetTaskID()) - - // When killing we must always use syscall.Kill with a negative PID, in order to kill all - // children which were assigned the same PGID at launch - killErr := syscall.Kill(-rpcClient.TaskCmd.Process.Pid, syscall.SIGKILL) - if killErr != nil { - log.WithError(killErr).WithField("taskId", e.GetTaskID()).Warning("could not kill task") - } - - if reachedState == "DONE" { - log.Debug("task exited correctly") - status.State = mesos.TASK_FINISHED.Enum() - } else { // something went wrong - log.Debug("task killed") - status.State = mesos.TASK_KILLED.Enum() - } - state.killedTasks[e.GetTaskID()] = status - - log.Debug("unlocking state") - state.mu.Unlock() - return err -} - -// helper func to package strings up nicely for protobuf -func protoString(s string) *string { return &s } - // update sends UPDATE to agent. func update(state *internalState, status mesos.TaskStatus) error { status.Timestamp = proto.Float64(float64(time.Now().Unix())) @@ -859,6 +364,9 @@ type internalState struct { unackedUpdates map[string]executor.Call_Update failedTasks map[mesos.TaskID]mesos.TaskStatus // send updates for these as we can killedTasks map[mesos.TaskID]mesos.TaskStatus - rpcClients map[mesos.TaskID]*executorcmd.RpcClient + activeTasks map[mesos.TaskID]executable.Task shouldQuit bool + + statusCh chan mesos.TaskStatus + messageCh chan []byte } diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index c771f8ac3..ee4adf67b 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -28,21 +28,21 @@ package executorcmd import ( "context" - "github.com/k0kubun/pp" - "google.golang.org/grpc" + "errors" "fmt" "os/exec" - - "github.com/AliceO2Group/Control/executor/protos" + "strconv" "time" + + "github.com/k0kubun/pp" + "google.golang.org/grpc" + + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/logger" - "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" + "github.com/AliceO2Group/Control/executor/protos" + "github.com/sirupsen/logrus" "google.golang.org/grpc/status" - "errors" - "encoding/json" - "strconv" - "github.com/AliceO2Group/Control/common/controlmode" ) var log = logger.New(logrus.StandardLogger(), "executorcmd") @@ -86,16 +86,6 @@ func (r *RpcClient) FromDeviceState(state string) string { return r.ctrl.FromDeviceState(state) } -func (r *RpcClient) UnmarshalTransition(data []byte) (cmd *ExecutorCommand_Transition, err error) { - cmd = new(ExecutorCommand_Transition) - cmd.rc = r - err = json.Unmarshal(data, cmd) - if err != nil { - cmd = nil - } - return -} - func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, err error) { log.WithField("event", ei.Evt). Debug("executor<->occplugin interface requesting transition") diff --git a/executor/executorcmd/executorcommand_transition.go b/executor/executorcmd/executorcommand_transition.go index fc321144f..50a5b6794 100644 --- a/executor/executorcmd/executorcommand_transition.go +++ b/executor/executorcmd/executorcommand_transition.go @@ -29,13 +29,13 @@ import "github.com/AliceO2Group/Control/core/controlcommands" type ExecutorCommand_Transition struct { controlcommands.MesosCommand_Transition - rc *RpcClient + Rpc *RpcClient } func NewLocalExecutorCommand_Transition(rpcClient *RpcClient, receivers []controlcommands.MesosCommandTarget, source string, event string, destination string, arguments controlcommands.PropertyMapsMap) (*ExecutorCommand_Transition) { return &ExecutorCommand_Transition{ - rc: rpcClient, + Rpc: rpcClient, MesosCommand_Transition: *controlcommands.NewMesosCommand_Transition(receivers, source, event, destination, arguments), } } @@ -46,5 +46,5 @@ func (e *ExecutorCommand_Transition) PrepareResponse(err error, currentState str } func (e *ExecutorCommand_Transition) Commit() (finalState string, err error) { - return e.rc.ctrl.Commit(e.Event, e.Source, e.Destination, e.Arguments) + return e.Rpc.ctrl.Commit(e.Event, e.Source, e.Destination, e.Arguments) } diff --git a/executor/handlers.go b/executor/handlers.go new file mode 100644 index 000000000..beb7544f9 --- /dev/null +++ b/executor/handlers.go @@ -0,0 +1,215 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executor + +import ( + "context" + "encoding/json" + "errors" + "fmt" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/executor/executable" + "github.com/AliceO2Group/Control/executor/executorcmd" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/executor" + "github.com/mesos/mesos-go/api/v1/lib/executor/calls" + "github.com/sirupsen/logrus" +) + +func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executable.SendStatusFunc { + return func(mesosState mesos.TaskState, message string){ + status := newStatus(state, task.TaskID) + status.State = &mesosState + status.Message = utils.ProtoString(message) + state.statusCh <- status + } +} + +func makeSendDeviceEventFunc(state *internalState) executable.SendDeviceEventFunc { + return func(event event.DeviceEvent) { + jsonEvent, err := json.Marshal(event) + if err != nil { + log.WithError(err).Warning("error marshaling event from task") + return + } + state.messageCh <- jsonEvent + } +} + +func handleOutgoingMessage(state *internalState, message []byte) { + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(message))) + log.WithFields(logrus.Fields{ + "event": string(message), + }). + Debug("event sent") +} + +func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { + if status.State == nil { + log.Warn("status with nil state received") + } else if *status.State == mesos.TASK_FAILED { // failed task updates are sent separately with less priority + state.failedTasks[status.TaskID] = status + delete(state.activeTasks, status.TaskID) + } else { + switch *status.State { + case mesos.TASK_DROPPED: fallthrough + case mesos.TASK_FINISHED: fallthrough + case mesos.TASK_GONE: fallthrough + case mesos.TASK_KILLED: fallthrough + case mesos.TASK_LOST: + delete(state.activeTasks, status.TaskID) + } + err := update(state, status) + if err != nil { // in case of failed update, we just print an error message + log.WithFields(logrus.Fields{ + "task": status.TaskID, + "state": status.State.String(), + }). + Warn("failed to update task status") + } + } + +} + +// Handle incoming message event. This function is thread-safe with respect to state. +func handleMessageEvent(state *internalState, data []byte) (err error) { + var incoming struct { + Name string `json:"name"` + TargetList []struct{ + TaskId mesos.TaskID + } `json:"targetList"` + } + err = json.Unmarshal(data, &incoming) + if err != nil { + return + } + + if len(incoming.TargetList) != 1 { + err = fmt.Errorf("cannot apply ExecutorCommand with %d!=1 target taskIds", len(incoming.TargetList)) + return + } + + log.WithField("name", incoming.Name). + WithField("payload", string(data[:])). + Debug("processing incoming MESSAGE") + + switch incoming.Name { + case "MesosCommand_Transition": + taskId := incoming.TargetList[0].TaskId + + // Check whether the task exists and is active + activeTask, ok := state.activeTasks[taskId] + if !ok || activeTask == nil { + err = fmt.Errorf("no active task %s", taskId.Value) + log.WithFields(logrus.Fields{ + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("no task for incoming MESSAGE") + return + } + + var cmd *executorcmd.ExecutorCommand_Transition + cmd, err = state.activeTasks[taskId].UnmarshalTransition(data) + if err != nil { + log.WithFields(logrus.Fields{ + "name": cmd.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("cannot unmarshal incoming MESSAGE") + return + } + + if cmd.Event == "CONFIGURE" { + log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") + } + + response := state.activeTasks[taskId].Transition(cmd) + + data, marshalError := json.Marshal(response) + if marshalError != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + return marshalError + } + + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "state": response.CurrentState, + }). + Debug("response sent") + + default: + err = errors.New(fmt.Sprintf("unrecognized controlcommand %s", incoming.Name)) + } + return +} + +// Attempts to launch a task described by a mesos.TaskInfo. This function is thread-safe with respect to state. +func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { + state.unackedTasks[taskInfo.TaskID] = taskInfo + + jsonTask, _ := json.MarshalIndent(taskInfo, "", "\t") + log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])).Trace("received task to launch") + + myTask := executable.NewTask(taskInfo, + makeSendStatusUpdateFunc(state, taskInfo), + makeSendDeviceEventFunc(state)) + + err := myTask.Launch() + + if err == nil { + state.activeTasks[taskInfo.TaskID] = myTask + } else { + log.Error("task launch failed") + } +} + +// Attempts to kill a task. This function is thread-safe with respect to state. +func handleKillEvent(state *internalState, e *executor.Event_Kill) error { + activeTask, ok := state.activeTasks[e.GetTaskID()] + if !ok { + return errors.New("invalid task ID") + } + + _ = activeTask.Kill() + + activeTask = nil + delete(state.activeTasks, e.GetTaskID()) + + return nil +} From b639f921582eb967269ea221150a167f06878213 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 17:26:46 +0100 Subject: [PATCH 0050/2352] [executor] Further refactor Transitioner-RPC relationship --- executor/executable/controllabletask.go | 4 ++-- executor/executorcmd/client.go | 10 +++++----- executor/executorcmd/executorcommand_transition.go | 13 ++++++++----- executor/executorcmd/transitioner/transitioner.go | 1 + 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index b49b036c4..e31ec08ea 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -253,7 +253,7 @@ func (t *ControllableTask) UnmarshalTransition(data []byte) (cmd *executorcmd.Ex cmd = nil return } - cmd.Rpc = t.rpc + cmd.Transitioner = t.rpc.Transitioner err = json.Unmarshal(data, cmd) if err != nil { cmd = nil @@ -303,7 +303,7 @@ func (t *ControllableTask) Kill() error { Debug("nextTransition(currentState) BEGIN") exc = executorcmd.NewLocalExecutorCommand_Transition( - t.rpc, + t.rpc.Transitioner, []controlcommands.MesosCommandTarget{ { AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index ee4adf67b..0ddaf2ea2 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -67,15 +67,15 @@ func NewClient(controlPort uint64, controlMode controlmode.ControlMode) *RpcClie } log.WithFields(logrus.Fields{"endpoint": endpoint, "controlMode": controlMode.String()}).Debug("instantiating new transitioner") - client.ctrl = transitioner.NewTransitioner(controlMode, client.doTransition) + client.Transitioner = transitioner.NewTransitioner(controlMode, client.doTransition) return client } type RpcClient struct { pb.OccClient - conn *grpc.ClientConn - ctrl transitioner.Transitioner - TaskCmd *exec.Cmd + conn *grpc.ClientConn + Transitioner transitioner.Transitioner + TaskCmd *exec.Cmd } func (r *RpcClient) Close() error { @@ -83,7 +83,7 @@ func (r *RpcClient) Close() error { } func (r *RpcClient) FromDeviceState(state string) string { - return r.ctrl.FromDeviceState(state) + return r.Transitioner.FromDeviceState(state) } func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, err error) { diff --git a/executor/executorcmd/executorcommand_transition.go b/executor/executorcmd/executorcommand_transition.go index 50a5b6794..16fbc835f 100644 --- a/executor/executorcmd/executorcommand_transition.go +++ b/executor/executorcmd/executorcommand_transition.go @@ -24,18 +24,21 @@ package executorcmd -import "github.com/AliceO2Group/Control/core/controlcommands" +import ( + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" +) type ExecutorCommand_Transition struct { controlcommands.MesosCommand_Transition - Rpc *RpcClient + Transitioner transitioner.Transitioner } -func NewLocalExecutorCommand_Transition(rpcClient *RpcClient, receivers []controlcommands.MesosCommandTarget, source string, event string, destination string, arguments controlcommands.PropertyMapsMap) (*ExecutorCommand_Transition) { +func NewLocalExecutorCommand_Transition(transitioner transitioner.Transitioner, receivers []controlcommands.MesosCommandTarget, source string, event string, destination string, arguments controlcommands.PropertyMapsMap) (*ExecutorCommand_Transition) { return &ExecutorCommand_Transition{ - Rpc: rpcClient, + Transitioner: transitioner, MesosCommand_Transition: *controlcommands.NewMesosCommand_Transition(receivers, source, event, destination, arguments), } } @@ -46,5 +49,5 @@ func (e *ExecutorCommand_Transition) PrepareResponse(err error, currentState str } func (e *ExecutorCommand_Transition) Commit() (finalState string, err error) { - return e.Rpc.ctrl.Commit(e.Event, e.Source, e.Destination, e.Arguments) + return e.Transitioner.Commit(e.Event, e.Source, e.Destination, e.Arguments) } diff --git a/executor/executorcmd/transitioner/transitioner.go b/executor/executorcmd/transitioner/transitioner.go index 7f4cc2bc9..47119d2d5 100644 --- a/executor/executorcmd/transitioner/transitioner.go +++ b/executor/executorcmd/transitioner/transitioner.go @@ -52,6 +52,7 @@ func NewTransitioner(cm controlmode.ControlMode, transitionFunc DoTransitionFunc switch cm { case controlmode.FAIRMQ: return NewFairMQTransitioner(transitionFunc) + case controlmode.BASIC: fallthrough case controlmode.DIRECT: fallthrough default: return NewDirectTransitioner(transitionFunc) From ec0048f882b51de473b5815cd55442141bd8435a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 17:27:46 +0100 Subject: [PATCH 0051/2352] [executor] Remove taskCmd from executor task base --- executor/executable/task.go | 1 - 1 file changed, 1 deletion(-) diff --git a/executor/executable/task.go b/executor/executable/task.go index 36d6ee839..f0a2f3370 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -63,7 +63,6 @@ type Task interface { type taskBase struct { ti *mesos.TaskInfo tci *common.TaskCommandInfo - tcmd *exec.Cmd sendStatus SendStatusFunc sendDeviceEvent SendDeviceEventFunc From e953e8386f361891ea6552b87a47828ccda604ff Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2019 17:28:33 +0100 Subject: [PATCH 0052/2352] [WIP][executor] Implement basic task handlers and transitioner --- executor/executable/basictask.go | 145 ++++++++++++++++++++++++++++--- 1 file changed, 135 insertions(+), 10 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 8d07ac90c..3cd2fca0c 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -25,31 +25,156 @@ package executable import ( + "encoding/json" + "errors" + "io" + "os/exec" + "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/sirupsen/logrus" ) type BasicTask struct { taskBase + taskCmd *exec.Cmd + transitioner transitioner.Transitioner + pendingFinalTaskStateCh chan mesos.TaskState } -func (b *BasicTask) Launch() error { - panic("implement me") +type HookTask struct { + taskBase } -func (b *BasicTask) Kill() error { - panic("implement me") + + +func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { + // If it's a basic task role, we make a RUNNING-state based transition function + // otherwise we process the hooks spec. + return func(ei transitioner.EventInfo) (newState string, err error) { + log.WithField("event", ei.Evt). + Debug("executor basic task transitioner requesting transition") + + switch { + case ei.Src == "CONFIGURED" && ei.Evt == "START" && ei.Dst == "RUNNING": + // Set up pipes for controlled process + var errStdout, errStderr error + stdoutIn, _ := t.taskCmd.StdoutPipe() + stderrIn, _ := t.taskCmd.StderrPipe() + + err = t.taskCmd.Start() + + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "command": *t.tci.Value, + }). + Error("failed to run basic task") + + return "CONFIGURED", err + } + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("basic task started") + + go func() { + _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer(), stdoutIn) + }() + go func() { + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer(), stderrIn) + }() + + go func() { + err = t.taskCmd.Wait() + // ^ when this unblocks, the task is done + + pendingState := mesos.TASK_FINISHED + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + }). + Error("process terminated with error") + pendingState = mesos.TASK_FAILED + } + exitCode := t.taskCmd.ProcessState.ExitCode() + + select { + case pending := <- t.pendingFinalTaskStateCh: + pendingState = pending + default: + } + + if t.taskCmd != nil { + t.taskCmd = nil + log.Debug("exec.Cmd wrapper removed") + } + + if errStdout != nil || errStderr != nil { + log.WithFields(logrus.Fields{ + "errStderr": errStderr, + "errStdout": errStdout, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + }). + Warning("failed to capture stdout or stderr of task") + } + + log.WithField("task", t.ti.Name). + WithField("status", pendingState.String()). + Debug("sending final status update") + t.sendStatus(pendingState, "") + }() + + } + + } } -func (b *BasicTask) Transition(transition *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { - panic("implement me") +func (t *BasicTask) Launch() error { + t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed + if t.taskCmd != nil { + return errors.New("bad internal state for basic task command") + } + + t.taskCmd = prepareTaskCmd(t.tci) + if t.taskCmd == nil { + return errors.New("could not instantiate basic task command") + } + + t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, makeTransitionFunc()) + log.WithField("payload", string(t.ti.GetData()[:])). + WithField("task", t.ti.Name). + Debug("basic task staged") + + t.sendStatus(mesos.TASK_RUNNING, "") + + return nil } -func (b *BasicTask) UnmarshalTransition([]byte) (*executorcmd.ExecutorCommand_Transition, error) { - panic("implement me") +func (t *BasicTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { + cmd = new(executorcmd.ExecutorCommand_Transition) + + + err = json.Unmarshal(data, cmd) + if err != nil { + cmd = nil + } + return cmd, err } -type HookTask struct { - taskBase +func (t *BasicTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { + newState, transitionError := cmd.Commit() + + response := cmd.PrepareResponse(transitionError, newState, t.ti.TaskID.Value) + return response } +func (t *BasicTask) Kill() error { + panic("implement me") +} From bd7d80eaa17d21c3c62387869fe8aaee6468f888 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 18 Dec 2019 12:28:50 +0100 Subject: [PATCH 0053/2352] [occ][executor] Add BASIC_TASK_TERMINATED event and update END_OF_STREAM --- common/event/deviceevent.go | 31 +++++++-- executor/executable/controllabletask.go | 1 - executor/handlers.go | 1 + executor/protos/occ.pb.go | 92 +++++++++++++------------ occ/occlib/OccServer.cxx | 2 +- occ/occlib/RuntimeControlledObject.h | 2 +- occ/protos/occ.proto | 3 +- 7 files changed, 79 insertions(+), 53 deletions(-) diff --git a/common/event/deviceevent.go b/common/event/deviceevent.go index d1966f0d9..2a8973199 100644 --- a/common/event/deviceevent.go +++ b/common/event/deviceevent.go @@ -63,8 +63,16 @@ func (b *DeviceEventBase) GetType() pb.DeviceEventType { func NewDeviceEvent(origin DeviceEventOrigin, t pb.DeviceEventType) (de DeviceEvent) { switch t { - case pb.DeviceEventType_END_OF_DATA: - de = &EndOfData{ + case pb.DeviceEventType_END_OF_STREAM: + de = &EndOfStream{ + DeviceEventBase: DeviceEventBase{ + Type: t, + Origin: origin, + MessageType: "DeviceEvent", + }, + } + case pb.DeviceEventType_BASIC_TASK_TERMINATED: + de = &BasicTaskTerminated{ DeviceEventBase: DeviceEventBase{ Type: t, Origin: origin, @@ -77,10 +85,23 @@ func NewDeviceEvent(origin DeviceEventOrigin, t pb.DeviceEventType) (de DeviceEv return de } -type EndOfData struct { +type EndOfStream struct { + DeviceEventBase +} + +func (e *EndOfStream) GetName() string { + return "END_OF_STREAM" +} + +type BasicTaskTerminated struct { DeviceEventBase + ExitCode int + Stdout string + Stderr string + VoluntaryTermination bool + FinalMesosState mesos.TaskState } -func (e *EndOfData) GetName() string { - return "END_OF_DATA" +func (e *BasicTaskTerminated) GetName() string { + return "BASIC_TASK_TERMINATED" } \ No newline at end of file diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index e31ec08ea..6ec5a072a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -279,7 +279,6 @@ func (t *ControllableTask) Kill() error { // NOTE: we acquire the transitioner-dependent STANDBY equivalent state reachedState := t.rpc.FromDeviceState(response.GetState()) - nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { log.WithField("currentState", currentState). Debug("nextTransition(currentState) BEGIN") diff --git a/executor/handlers.go b/executor/handlers.go index beb7544f9..11d0346fc 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -194,6 +194,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { if err == nil { state.activeTasks[taskInfo.TaskID] = myTask + log.Trace("task launched") } else { log.Error("task launch failed") } diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index b301392e5..d452f8ed8 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -82,18 +82,21 @@ func (StateType) EnumDescriptor() ([]byte, []int) { type DeviceEventType int32 const ( - DeviceEventType_NULL_DEVICE_EVENT DeviceEventType = 0 - DeviceEventType_END_OF_DATA DeviceEventType = 1 + DeviceEventType_NULL_DEVICE_EVENT DeviceEventType = 0 + DeviceEventType_END_OF_STREAM DeviceEventType = 1 + DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 ) var DeviceEventType_name = map[int32]string{ 0: "NULL_DEVICE_EVENT", - 1: "END_OF_DATA", + 1: "END_OF_STREAM", + 2: "BASIC_TASK_TERMINATED", } var DeviceEventType_value = map[string]int32{ - "NULL_DEVICE_EVENT": 0, - "END_OF_DATA": 1, + "NULL_DEVICE_EVENT": 0, + "END_OF_STREAM": 1, + "BASIC_TASK_TERMINATED": 2, } func (x DeviceEventType) String() string { @@ -625,45 +628,46 @@ func init() { func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } var fileDescriptor_17fd8faceeeb3e6c = []byte{ - // 603 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xdd, 0x6e, 0xd3, 0x4c, - 0x10, 0xcd, 0x26, 0x6d, 0xbf, 0x74, 0xd2, 0xaf, 0x71, 0x96, 0x96, 0x86, 0x08, 0x45, 0x91, 0xa5, - 0x4a, 0xa1, 0x48, 0x06, 0x02, 0xbd, 0x00, 0xc1, 0x45, 0x9a, 0x2c, 0x55, 0xa4, 0x90, 0x48, 0x9b, - 0x6d, 0x85, 0xb8, 0x89, 0xdc, 0xd5, 0x92, 0x46, 0x4d, 0x6d, 0xe3, 0x6c, 0x2b, 0xf9, 0x1d, 0xb8, - 0x07, 0xde, 0x88, 0x4b, 0x1e, 0x01, 0x95, 0x17, 0x41, 0xbb, 0xfe, 0x89, 0x9d, 0x9a, 0x3b, 0xef, - 0xcc, 0xd9, 0x73, 0xce, 0xec, 0xcc, 0x18, 0x0c, 0xcf, 0x77, 0xa5, 0xbb, 0x7c, 0xe6, 0x72, 0x6e, - 0xe9, 0x4f, 0xbc, 0xe5, 0x72, 0x3e, 0xf5, 0x2e, 0xcc, 0x3d, 0xc0, 0x13, 0x69, 0x4b, 0x31, 0x91, - 0xbe, 0xb0, 0xaf, 0xa9, 0xf8, 0x72, 0x23, 0x96, 0xd2, 0x1c, 0x83, 0x91, 0x89, 0x7a, 0x8b, 0x00, - 0x1f, 0xc2, 0x86, 0x0c, 0x3c, 0x51, 0x47, 0x2d, 0xd4, 0xde, 0xed, 0xd4, 0xac, 0x90, 0xc0, 0xd2, - 0x38, 0x16, 0x78, 0x82, 0xea, 0x34, 0xde, 0x83, 0xcd, 0xa5, 0x0a, 0xd5, 0x8b, 0x2d, 0xd4, 0xde, - 0xa6, 0xe1, 0x41, 0xc9, 0x90, 0x5b, 0xe1, 0xc8, 0xac, 0xcc, 0x1b, 0xa8, 0xf4, 0xc5, 0xed, 0x9c, - 0x0b, 0x9d, 0xc3, 0x4f, 0x33, 0x0a, 0x07, 0xb1, 0x42, 0x0a, 0xb2, 0xd2, 0x31, 0xdf, 0x81, 0x91, - 0x61, 0x54, 0x16, 0x9f, 0xc0, 0xa6, 0x50, 0x31, 0xcd, 0x50, 0xe9, 0x3c, 0xc8, 0x61, 0xa0, 0x21, - 0xc2, 0xac, 0x41, 0xf5, 0x54, 0x48, 0x6d, 0x3e, 0x76, 0x73, 0x08, 0xff, 0xaf, 0x42, 0x8a, 0x2e, - 0x29, 0x05, 0xa5, 0x4b, 0x39, 0x86, 0x4a, 0xcf, 0x75, 0x3e, 0xcf, 0x67, 0xc4, 0x91, 0x7e, 0x80, - 0x0d, 0x28, 0x5d, 0x89, 0x20, 0x82, 0xa8, 0x4f, 0x75, 0xed, 0xd6, 0x5e, 0xdc, 0x24, 0x2f, 0xa0, - 0x0f, 0xe6, 0x57, 0x04, 0x35, 0xe6, 0xdb, 0xce, 0x72, 0x2e, 0xe7, 0xae, 0x13, 0x69, 0xe2, 0x06, - 0x94, 0x97, 0x3e, 0x9f, 0xa4, 0x54, 0x92, 0x33, 0x6e, 0x43, 0x55, 0x26, 0x17, 0xb4, 0xf9, 0x88, - 0x71, 0x3d, 0x8c, 0x5f, 0xc0, 0xb6, 0xed, 0xcf, 0x6e, 0xae, 0x85, 0x23, 0x97, 0xf5, 0x52, 0xab, - 0x94, 0xae, 0x3d, 0xe5, 0x95, 0xae, 0x50, 0xe6, 0x37, 0x04, 0xd5, 0xb4, 0x1d, 0x55, 0xef, 0x2b, - 0xf8, 0x4f, 0xfa, 0xf3, 0xd9, 0x4c, 0xf8, 0x51, 0x0b, 0x1a, 0x99, 0x26, 0xf7, 0x2e, 0x6d, 0x67, - 0x26, 0x58, 0x88, 0xa0, 0x31, 0x34, 0xbf, 0xe1, 0x79, 0xe6, 0x4b, 0xf9, 0xe6, 0x77, 0xa1, 0xe8, - 0x5e, 0xd5, 0x37, 0x5a, 0xa8, 0x5d, 0xa6, 0x45, 0xf7, 0xea, 0x68, 0x18, 0x4d, 0x64, 0x46, 0x0e, - 0xef, 0x40, 0x99, 0x7c, 0x24, 0xbd, 0x33, 0x36, 0xa6, 0x46, 0x01, 0x3f, 0x04, 0xdc, 0x27, 0xe7, - 0x83, 0x1e, 0x99, 0x0e, 0x46, 0x8c, 0x8c, 0xd8, 0x60, 0x3c, 0xea, 0x0e, 0x0d, 0x84, 0x0d, 0xd8, - 0x89, 0xe2, 0x84, 0xd2, 0x31, 0x35, 0x8a, 0x47, 0xc7, 0xb0, 0x9d, 0x4c, 0xa8, 0x4a, 0x4f, 0x58, - 0x97, 0x91, 0xe9, 0x84, 0x75, 0x4f, 0x86, 0x24, 0x24, 0x0a, 0x23, 0x8a, 0x87, 0x7e, 0x20, 0xfd, - 0x41, 0x97, 0x11, 0x03, 0x1d, 0xbd, 0x86, 0xea, 0xda, 0xd8, 0xe1, 0x7d, 0xa8, 0x8d, 0xce, 0x86, - 0xc3, 0x69, 0x2c, 0x70, 0x4e, 0x46, 0xcc, 0x28, 0xe0, 0x2a, 0x54, 0xc8, 0xa8, 0x3f, 0x1d, 0xbf, - 0x9f, 0xf6, 0xbb, 0xac, 0x6b, 0xa0, 0xce, 0x8f, 0x22, 0x94, 0xc6, 0x9c, 0xe3, 0x53, 0xa8, 0xa4, - 0x06, 0x14, 0x27, 0x6f, 0x79, 0x7f, 0x0f, 0x1a, 0xf5, 0xdc, 0x9c, 0xb7, 0x08, 0xcc, 0xc2, 0x73, - 0xa4, 0x88, 0x52, 0xcb, 0x88, 0xb3, 0x4d, 0xf9, 0x07, 0xd1, 0xfa, 0xf6, 0x6a, 0xa2, 0xb7, 0x50, - 0x8e, 0x07, 0x1c, 0x27, 0xdb, 0xb5, 0xb6, 0x05, 0x8d, 0xfd, 0xfb, 0x09, 0x7d, 0x1f, 0x9f, 0x00, - 0xac, 0x06, 0x06, 0x3f, 0x8a, 0x61, 0xf7, 0x66, 0xba, 0x71, 0x90, 0x97, 0xd2, 0x1c, 0x27, 0x9d, - 0x9f, 0x77, 0x4d, 0xf4, 0xeb, 0xae, 0x89, 0x7e, 0xdf, 0x35, 0xd1, 0xf7, 0x3f, 0xcd, 0x02, 0x3c, - 0xe6, 0x97, 0x16, 0x17, 0xbe, 0x63, 0xd9, 0x8b, 0x39, 0x17, 0x96, 0xdb, 0xb1, 0xb8, 0xeb, 0x48, - 0xdf, 0x5d, 0x28, 0x92, 0x4f, 0x45, 0xef, 0xe2, 0x62, 0x4b, 0xff, 0xb0, 0x5e, 0xfe, 0x0d, 0x00, - 0x00, 0xff, 0xff, 0x46, 0x7b, 0xff, 0x7c, 0xc4, 0x04, 0x00, 0x00, + // 623 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xcd, 0x3a, 0x6d, 0x49, 0x27, 0x6d, 0xe3, 0x2c, 0x2d, 0x4d, 0x23, 0x14, 0x45, 0x96, 0x2a, + 0x85, 0x22, 0x19, 0x08, 0xf4, 0x82, 0xe0, 0xe0, 0x24, 0x4b, 0x15, 0x91, 0x3a, 0xd2, 0x7a, 0x5b, + 0x21, 0x2e, 0x96, 0x6b, 0x2d, 0x69, 0xd4, 0xd4, 0x36, 0xce, 0xb6, 0x52, 0xfe, 0x81, 0x3b, 0xf0, + 0x47, 0x1c, 0xf9, 0x04, 0x54, 0x7e, 0x04, 0xed, 0x26, 0x71, 0xec, 0x24, 0xdc, 0xbc, 0x33, 0x6f, + 0xdf, 0x7b, 0xb3, 0x33, 0x63, 0xd0, 0xa3, 0x38, 0x14, 0xe1, 0xf8, 0x45, 0xe8, 0xfb, 0xa6, 0xfa, + 0xc4, 0x5b, 0xa1, 0xef, 0xbb, 0xd1, 0x95, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, 0x8e, 0x88, 0xb9, + 0x77, 0x4b, 0xf9, 0xd7, 0x3b, 0x3e, 0x16, 0x46, 0x1f, 0xf4, 0x4c, 0x34, 0x1a, 0x4d, 0xf0, 0x31, + 0x6c, 0x88, 0x49, 0xc4, 0x2b, 0xa8, 0x8e, 0x1a, 0x7b, 0xcd, 0xb2, 0x39, 0x25, 0x30, 0x15, 0x8e, + 0x4d, 0x22, 0x4e, 0x55, 0x1a, 0xef, 0xc3, 0xe6, 0x58, 0x86, 0x2a, 0x5a, 0x1d, 0x35, 0xb6, 0xe9, + 0xf4, 0x20, 0x65, 0xc8, 0x3d, 0x0f, 0x44, 0x56, 0xe6, 0x2d, 0x14, 0x3b, 0xfc, 0x7e, 0xe8, 0x73, + 0x95, 0xc3, 0xcf, 0x33, 0x0a, 0x87, 0x73, 0x85, 0x14, 0x64, 0xa1, 0x63, 0xbc, 0x07, 0x3d, 0xc3, + 0x28, 0x2d, 0x3e, 0x83, 0x4d, 0x2e, 0x63, 0x8a, 0xa1, 0xd8, 0x7c, 0xbc, 0x86, 0x81, 0x4e, 0x11, + 0x46, 0x19, 0x4a, 0x67, 0x5c, 0x28, 0xf3, 0x73, 0x37, 0xc7, 0xb0, 0xbb, 0x08, 0x49, 0xba, 0xa4, + 0x14, 0x94, 0x2e, 0xe5, 0x14, 0x8a, 0xed, 0x30, 0xf8, 0x32, 0x1c, 0x90, 0x40, 0xc4, 0x13, 0xac, + 0x43, 0xfe, 0x86, 0x4f, 0x66, 0x10, 0xf9, 0x29, 0xaf, 0xdd, 0x7b, 0xa3, 0xbb, 0xe4, 0x05, 0xd4, + 0xc1, 0xf8, 0x86, 0xa0, 0xcc, 0x62, 0x2f, 0x18, 0x0f, 0xc5, 0x30, 0x0c, 0x66, 0x9a, 0xb8, 0x0a, + 0x85, 0x71, 0xec, 0x3b, 0x29, 0x95, 0xe4, 0x8c, 0x1b, 0x50, 0x12, 0xc9, 0x05, 0x65, 0x7e, 0xc6, + 0xb8, 0x1c, 0xc6, 0xaf, 0x60, 0xdb, 0x8b, 0x07, 0x77, 0xb7, 0x3c, 0x10, 0xe3, 0x4a, 0xbe, 0x9e, + 0x4f, 0xd7, 0x9e, 0xf2, 0x4a, 0x17, 0x28, 0xe3, 0x3b, 0x82, 0x52, 0xda, 0x8e, 0xac, 0xf7, 0x0d, + 0x3c, 0x12, 0xf1, 0x70, 0x30, 0xe0, 0xf1, 0xac, 0x05, 0xd5, 0x4c, 0x93, 0xdb, 0xd7, 0x5e, 0x30, + 0xe0, 0x6c, 0x8a, 0xa0, 0x73, 0xe8, 0xfa, 0x86, 0xaf, 0x33, 0x9f, 0x5f, 0x6f, 0x7e, 0x0f, 0xb4, + 0xf0, 0xa6, 0xb2, 0x51, 0x47, 0x8d, 0x02, 0xd5, 0xc2, 0x9b, 0x93, 0xde, 0x6c, 0x22, 0x33, 0x72, + 0x78, 0x07, 0x0a, 0xe4, 0x13, 0x69, 0x5f, 0xb0, 0x3e, 0xd5, 0x73, 0xf8, 0x09, 0xe0, 0x0e, 0xb9, + 0xec, 0xb6, 0x89, 0xdb, 0xb5, 0x19, 0xb1, 0x59, 0xb7, 0x6f, 0x5b, 0x3d, 0x1d, 0x61, 0x1d, 0x76, + 0x66, 0x71, 0x42, 0x69, 0x9f, 0xea, 0xda, 0xc9, 0x29, 0x6c, 0x27, 0x13, 0x2a, 0xd3, 0x0e, 0xb3, + 0x18, 0x71, 0x1d, 0x66, 0xb5, 0x7a, 0x64, 0x4a, 0x34, 0x8d, 0x48, 0x1e, 0x7a, 0x4e, 0x3a, 0x5d, + 0x8b, 0x11, 0x1d, 0x9d, 0x5c, 0x42, 0x69, 0x69, 0xec, 0xf0, 0x01, 0x94, 0xed, 0x8b, 0x5e, 0xcf, + 0x9d, 0x0b, 0x5c, 0x12, 0x9b, 0xe9, 0x39, 0x5c, 0x86, 0x5d, 0x62, 0x77, 0xdc, 0xfe, 0x07, 0xd7, + 0x61, 0x94, 0x58, 0xe7, 0x3a, 0xc2, 0x47, 0x70, 0xd0, 0xb2, 0x9c, 0x6e, 0xdb, 0x65, 0x96, 0xf3, + 0xd1, 0x95, 0xbc, 0x5d, 0xdb, 0x62, 0xa4, 0xa3, 0x6b, 0xcd, 0x9f, 0x1a, 0xe4, 0xfb, 0xbe, 0x8f, + 0xcf, 0xa0, 0x98, 0x9a, 0x5e, 0x9c, 0x3c, 0xf4, 0xea, 0x92, 0x54, 0x2b, 0x6b, 0x73, 0xd1, 0x68, + 0x62, 0xe4, 0x5e, 0x22, 0x49, 0x94, 0xda, 0x54, 0x9c, 0xed, 0xd8, 0x7f, 0x88, 0x96, 0x57, 0x5b, + 0x11, 0xbd, 0x83, 0xc2, 0x7c, 0xfa, 0x71, 0xb2, 0x7a, 0x4b, 0x2b, 0x52, 0x3d, 0x58, 0x4d, 0xa8, + 0xfb, 0xb8, 0x05, 0xb0, 0x98, 0x26, 0x7c, 0x34, 0x87, 0xad, 0x0c, 0x7c, 0xf5, 0x70, 0x5d, 0x4a, + 0x71, 0xb4, 0x9a, 0xbf, 0x1e, 0x6a, 0xe8, 0xf7, 0x43, 0x0d, 0xfd, 0x79, 0xa8, 0xa1, 0x1f, 0x7f, + 0x6b, 0x39, 0x78, 0xea, 0x5f, 0x9b, 0x3e, 0x8f, 0x03, 0xd3, 0x1b, 0x0d, 0x7d, 0x6e, 0x86, 0x4d, + 0xd3, 0x0f, 0x03, 0x11, 0x87, 0x23, 0x49, 0xf2, 0x59, 0x8b, 0xae, 0xae, 0xb6, 0xd4, 0xdf, 0xec, + 0xf5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xf5, 0x41, 0x08, 0xe1, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 970c4cf70..d54001d43 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -410,7 +410,7 @@ void OccServer::runChecker() if (err == 1) { // signal EndOfData event endOfData = true; auto eodEvent = new pb::DeviceEvent; - eodEvent->set_type(pb::END_OF_DATA); + eodEvent->set_type(pb::END_OF_STREAM); pushEvent(eodEvent); } else if (err) { diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index cb48c96e4..fe9d0afc8 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -252,7 +252,7 @@ class OCC_EXPORT RuntimeControlledObject { * * @return 0 if the operation completed successfully and the machine can stay in the running state, * 1 if all data processing is done and the implementer wishes to notify the machine control - * mechanism of this condition (send END_OF_DATA event), or any other value which immediately + * mechanism of this condition (send END_OF_STREAM event), or any other value which immediately * triggers a transition to the error state. * * This function is called continuously by OccServer::runChecker if the state machine is in the diff --git a/occ/protos/occ.proto b/occ/protos/occ.proto index 2fcde7794..c047a9dba 100644 --- a/occ/protos/occ.proto +++ b/occ/protos/occ.proto @@ -52,7 +52,8 @@ enum StateType { enum DeviceEventType { NULL_DEVICE_EVENT = 0; - END_OF_DATA = 1; + END_OF_STREAM = 1; + BASIC_TASK_TERMINATED = 2; } message StateStreamRequest {} From 933e54a95be946f6f29472e4a72e22c64bd8a6a0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 18 Dec 2019 12:31:39 +0100 Subject: [PATCH 0054/2352] [executor] Implement BasicTask transitioner --- executor/executable/basictask.go | 216 ++++++++++++++++++++----------- 1 file changed, 140 insertions(+), 76 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 3cd2fca0c..8bca46c46 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -25,14 +25,18 @@ package executable import ( + "bytes" "encoding/json" "errors" "io" "os/exec" + "syscall" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" + pb "github.com/AliceO2Group/Control/executor/protos" mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" ) @@ -49,8 +53,129 @@ type HookTask struct { } - func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { + startBasicTask := func() (err error) { + // Set up pipes for controlled process + var errStdout, errStderr error + var stdoutBuf, stderrBuf bytes.Buffer + + stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer() + stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer() + + // Each of these multiwriters will push incoming lines to a buffer as well as the logger + stdout := io.MultiWriter(stdoutLog, &stdoutBuf) + stderr := io.MultiWriter(stderrLog, &stderrBuf) + + stdoutIn, _ := t.taskCmd.StdoutPipe() + stderrIn, _ := t.taskCmd.StderrPipe() + + err = t.taskCmd.Start() + + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "command": *t.tci.Value, + }). + Error("failed to run basic task") + + return err + } + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("basic task started") + + go func() { + _, errStdout = io.Copy(stdout, stdoutIn) + }() + go func() { + _, errStderr = io.Copy(stderr, stderrIn) + }() + + go func() { + err = t.taskCmd.Wait() + // ^ when this unblocks, the task is done + + pendingState := mesos.TASK_FINISHED + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + }). + Error("process terminated with error") + pendingState = mesos.TASK_FAILED + } + + // Can be -1 if the process was killed + exitCode := t.taskCmd.ProcessState.ExitCode() + processTerminatedOnItsOwn := true + + select { + case pending := <- t.pendingFinalTaskStateCh: + pendingState = pending + processTerminatedOnItsOwn = false + default: + } + + if t.taskCmd != nil { + t.taskCmd = nil + log.Debug("exec.Cmd wrapper removed") + } + + if errStdout != nil || errStderr != nil { + log.WithFields(logrus.Fields{ + "errStderr": errStderr, + "errStdout": errStdout, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + }). + Warning("failed to capture stdout or stderr of task") + } + + deo := event.DeviceEventOrigin{ + AgentId: t.ti.AgentID, + ExecutorId: t.ti.GetExecutor().ExecutorID, + TaskId: t.ti.TaskID, + } + deviceEvent := event.NewDeviceEvent(deo, pb.DeviceEventType_BASIC_TASK_TERMINATED) + if btt, ok := deviceEvent.(*event.BasicTaskTerminated); ok { + btt.VoluntaryTermination = processTerminatedOnItsOwn + btt.ExitCode = exitCode + btt.FinalMesosState = pendingState + btt.Stderr = stderrBuf.String() + btt.Stdout = stdoutBuf.String() + t.sendDeviceEvent(btt) + } + }() + + return err + } + + ensureBasicTaskKilled := func() (err error) { + if t.taskCmd == nil { + return nil + } + if t.taskCmd.ProcessState.Exited() { + return nil + } + + // Preparing to kill running task + t.pendingFinalTaskStateCh <- mesos.TASK_KILLED + + // TODO: SIGTERM before SIGKILL + + pid := t.taskCmd.Process.Pid + err = syscall.Kill(-pid, syscall.SIGKILL) + if err != nil { + log.WithError(err). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") + } + + return + } // If it's a basic task role, we make a RUNNING-state based transition function // otherwise we process the hooks spec. return func(ei transitioner.EventInfo) (newState string, err error) { @@ -59,80 +184,18 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { switch { case ei.Src == "CONFIGURED" && ei.Evt == "START" && ei.Dst == "RUNNING": - // Set up pipes for controlled process - var errStdout, errStderr error - stdoutIn, _ := t.taskCmd.StdoutPipe() - stderrIn, _ := t.taskCmd.StderrPipe() - - err = t.taskCmd.Start() - + err = startBasicTask() if err != nil { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - "command": *t.tci.Value, - }). - Error("failed to run basic task") - return "CONFIGURED", err } - log.WithField("id", t.ti.TaskID.Value). - WithField("task", t.ti.Name). - Debug("basic task started") - - go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer(), stdoutIn) - }() - go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer(), stderrIn) - }() - - go func() { - err = t.taskCmd.Wait() - // ^ when this unblocks, the task is done - - pendingState := mesos.TASK_FINISHED - if err != nil { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - }). - Error("process terminated with error") - pendingState = mesos.TASK_FAILED - } - exitCode := t.taskCmd.ProcessState.ExitCode() - - select { - case pending := <- t.pendingFinalTaskStateCh: - pendingState = pending - default: - } - - if t.taskCmd != nil { - t.taskCmd = nil - log.Debug("exec.Cmd wrapper removed") - } - - if errStdout != nil || errStderr != nil { - log.WithFields(logrus.Fields{ - "errStderr": errStderr, - "errStdout": errStdout, - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - }). - Warning("failed to capture stdout or stderr of task") - } - - log.WithField("task", t.ti.Name). - WithField("status", pendingState.String()). - Debug("sending final status update") - t.sendStatus(pendingState, "") - }() - + return "RUNNING", err + case ei.Src == "RUNNING" && ei.Evt == "STOP" && ei.Dst == "CONFIGURED": + err = ensureBasicTaskKilled() + return "CONFIGURED", err + default: + // By default we declare any transition as valid and executed as NOOP + return ei.Dst, nil } - } } @@ -147,12 +210,12 @@ func (t *BasicTask) Launch() error { return errors.New("could not instantiate basic task command") } - t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, makeTransitionFunc()) + t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, t.makeTransitionFunc()) log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). Debug("basic task staged") - t.sendStatus(mesos.TASK_RUNNING, "") + go t.sendStatus(mesos.TASK_RUNNING, "") return nil } @@ -160,12 +223,12 @@ func (t *BasicTask) Launch() error { func (t *BasicTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { cmd = new(executorcmd.ExecutorCommand_Transition) - + cmd.Transitioner = t.transitioner err = json.Unmarshal(data, cmd) if err != nil { cmd = nil } - return cmd, err + return } func (t *BasicTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { @@ -176,5 +239,6 @@ func (t *BasicTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *con } func (t *BasicTask) Kill() error { - panic("implement me") + go t.sendStatus(mesos.TASK_FINISHED, "") + return nil } From 4c0b063d925b6f9aa6bddb55e810773600c5207a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 18 Dec 2019 12:32:16 +0100 Subject: [PATCH 0055/2352] [core] Fix CommandInfo for basic tasks and handle BASIC_TASK_TERMINATED --- core/scheduler.go | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index f9b2f3255..e86a0254a 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -32,6 +32,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/AliceO2Group/Control/common/controlmode" "github.com/spf13/viper" "io" "strconv" @@ -322,7 +323,25 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { } switch evt.GetType() { - case pb.DeviceEventType_END_OF_DATA: + case pb.DeviceEventType_BASIC_TASK_TERMINATED: + if btt, ok := evt.(*event.BasicTaskTerminated); ok { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "exitCode": btt.ExitCode, + "stdout": btt.Stdout, + "stderr": btt.Stderr, + "finalMesosState": btt.FinalMesosState.String(), + }). + Info("basic task terminated") + if btt.VoluntaryTermination { + goto doFallthrough + } + // FIXME: handle propagation of exit code, final state, std{err,out} + } + return + doFallthrough: + fallthrough + case pb.DeviceEventType_END_OF_STREAM: taskId := evt.GetOrigin().TaskId t := state.taskman.GetTask(taskId.Value) if t == nil { @@ -336,7 +355,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { if env.CurrentState() == "RUNNING" { err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_DATA event") + log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") } } } @@ -546,9 +565,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // Append control port to arguments // For the control port parameter and/or environment variable, see occ/OccGlobals.h - cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) - cmd.ControlPort = controlPort - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) + if cmd.ControlMode != controlmode.BASIC { + cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) + cmd.ControlPort = controlPort + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) + } cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "O2_ROLE", offer.Hostname)) runCommand := *cmd From b4a14fb4efc9d0de79256f6ae3cec6b1279a64d0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jan 2020 19:20:39 +0100 Subject: [PATCH 0056/2352] [common] Improve log processing --- Makefile | 10 +- cmd/o2control-core/main.go | 2 +- cmd/o2control-executor/main.go | 2 +- common/logger/infologger/directhook.go | 205 +++++++++++++++++++++++++ common/logger/infologger/fields.go | 16 +- common/logger/infologger/hook.go | 37 +---- common/logger/infologger/protocols.go | 84 ++++++++++ common/logger/infologger/utils.go | 59 +++++++ 8 files changed, 367 insertions(+), 48 deletions(-) create mode 100644 common/logger/infologger/directhook.go create mode 100644 common/logger/infologger/protocols.go create mode 100644 common/logger/infologger/utils.go diff --git a/Makefile b/Makefile index dab12206c..4a0676869 100644 --- a/Makefile +++ b/Makefile @@ -30,7 +30,10 @@ ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) HOST_GOOS=$(shell go env GOOS) HOST_GOARCH=$(shell go env GOARCH) +CGO_LDFLAGS= +ifdef WITH_LIBINFOLOGGER CGO_LDFLAGS=CGO_LDFLAGS="$(ROOT_DIR)/vendor/infoLoggerForGo/infoLoggerForGo.a -static-libstdc++ -static-libgcc" +endif BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) REPOPATH = github.com/AliceO2Group/Control @@ -116,12 +119,13 @@ cleanall: vendor: tools/dep @echo -e "\e[1;33mdep ensure\e[0m" @./tools/dep ensure - @mkdir -p vendor/infoLoggerForGo - @cp ${INFOLOGGER_ROOT}/lib/infoLoggerForGo.* vendor/infoLoggerForGo/ + +# @mkdir -p vendor/infoLoggerForGo +# @cp ${INFOLOGGER_ROOT}/lib/infoLoggerForGo.* vendor/infoLoggerForGo/ # For cgo, *.a means C, so by default it will use gcc when linking against it. For # this reason, we must create a dummy *.cpp file in the package dir to force cgo to # use g++ instead of gcc. - @touch vendor/infoLoggerForGo/infoLoggerForGo.cpp +# @touch vendor/infoLoggerForGo/infoLoggerForGo.cpp tools: tools/dep tools/protoc diff --git a/cmd/o2control-core/main.go b/cmd/o2control-core/main.go index da66e82d2..a132cf7b8 100644 --- a/cmd/o2control-core/main.go +++ b/cmd/o2control-core/main.go @@ -44,7 +44,7 @@ func init() { ForceFormatting: true, }) log.SetOutput(os.Stdout) - ilHook, err := infologger.NewHook("ECS", "AliECS core") + ilHook, err := infologger.NewDirectHook("ECS", "AliECS core") if err == nil { log.AddHook(ilHook) } diff --git a/cmd/o2control-executor/main.go b/cmd/o2control-executor/main.go index 9f76f2d46..69c616103 100644 --- a/cmd/o2control-executor/main.go +++ b/cmd/o2control-executor/main.go @@ -36,7 +36,7 @@ import ( func init() { logrus.SetOutput(os.Stdout) - ilHook, err := infologger.NewHook("ECS", "AliECS executor") + ilHook, err := infologger.NewDirectHook("ECS", "AliECS executor") if err == nil { logrus.AddHook(ilHook) } diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go new file mode 100644 index 000000000..62867f140 --- /dev/null +++ b/common/logger/infologger/directhook.go @@ -0,0 +1,205 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package infologger + +import ( + "errors" + "fmt" + "net" + "runtime" + "sort" + "strconv" + "strings" + + "github.com/sirupsen/logrus" +) + + +type sender struct { + stream net.Conn +} + +func newSender(path string) *sender { + stream, err := net.Dial("unix", path) + if err != nil { + fmt.Printf("cannot dial unix socket %s\n", path) + return nil + } + return &sender{ + stream: stream, + } +} + +func (s *sender) Close() error { + return s.stream.Close() +} + +func (s *sender) format(fields map[string]string, version protoVersion) string { + stringLog := string("*" + version) + currentProtocol := protocols[version] + for _, fSpec := range *currentProtocol { + stringLog += "#" + if value, ok := fields[fSpec.name]; ok { + stringLog += value + } + } + return stringLog + "\n" +} + +func (s *sender) Send(fields map[string]string) error { + if s.stream != nil { + _, err := s.stream.Write([]byte(s.format(fields, v14))) + return err + } + return errors.New("could not send log message: InfoLogger socket not available") +} + +type DirectHook struct { + il *sender + system string + facility string +} + +func paddedAbstractSocket(name string) string { + targetLen := 108 // Linux constant + out := make([]byte, targetLen) + for i := 0; i < targetLen; i++ { + if i < len(name) { + out[i] = name[i] + } else { + out[i] = '\x00' + } + } + return string(out) +} + +func guessSocketPath() string { + if runtime.GOOS == "linux" { + return paddedAbstractSocket("@infoLoggerD") + } else { // macOS + return "/tmp/infoLoggerD.socket" + } +} + +func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, error) { + socketPath := guessSocketPath() + sender := newSender(socketPath) + if sender == nil { + return nil, fmt.Errorf("cannot instantiate InfoLogger hook on socket %s", socketPath) + } + return &DirectHook{ + il: sender, + system: defaultSystem, + facility: defaultFacility, + }, nil +} + +func (h *DirectHook) Levels() []logrus.Level { + // Everything except logrus.TraceLevel + return []logrus.Level{ + logrus.PanicLevel, + logrus.FatalLevel, + logrus.ErrorLevel, + logrus.WarnLevel, + logrus.InfoLevel, + logrus.DebugLevel, + } +} + +func (h *DirectHook) Fire(e *logrus.Entry) error { + // Supported field names: + // Severity, Level, ErrorCode, SourceFile, SourceLine, + // Facility, Role, System, Detector, Partition, Run + // Filled automatically by InfoLogger, do not set: PID, hostName, userName + + payload := make(map[string]string) + payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) + + if e.HasCaller() { + payload["errsource"] = e.Caller.File + payload["errline"] = strconv.Itoa(e.Caller.Line) + } + + var message strings.Builder + message.WriteString(e.Message) + + unmappableFields := make(sort.StringSlice, 0) + + if e.Data != nil { + for k, v := range e.Data { + if k == "prefix" { + continue + } + + var vStr string + switch v.(type) { + case string: + vStr = v.(string) + case []byte: + vStr = string(v.([]byte)[:]) + case fmt.Stringer: + vStr = v.(fmt.Stringer).String() + default: + vStr = fmt.Sprintf("%v", v) + } + + if _, ok := Fields[k]; ok { + if k == Facility { + payload[Facility] = buildFineFacility(vStr, e.Data) + } else { + payload[k] = vStr + } + } else { // data structure key not mappable to InfoLogger field + unmappableFields = append(unmappableFields, fmt.Sprintf(" %s=\"%s\"", k, vStr)) + } + } + } + + // If a System and/or Facility isn't passed manually, we fall back on defaults + if _, ok := e.Data[System]; !ok { + payload[System] = h.system + } + if _, ok := e.Data[Facility]; !ok { + payload[Facility] = buildFineFacility(h.facility, e.Data) + } + + unmappableFields.Sort() + + for _, v := range unmappableFields { + message.WriteString(v) + } + + payload["message"] = message.String() + + if h.il != nil { + err := h.il.Send(payload) + if err != nil { + return fmt.Errorf("infoLogger hook error: %s", err.Error()) + } + } else { + return fmt.Errorf("infoLogger hook error: sender not available") + } + return nil +} diff --git a/common/logger/infologger/fields.go b/common/logger/infologger/fields.go index 7860adb6b..23646851d 100644 --- a/common/logger/infologger/fields.go +++ b/common/logger/infologger/fields.go @@ -29,14 +29,14 @@ package infologger // Facility, Role, System, Detector, Partition, Run const( - Level = "Level" - ErrorCode = "ErrorCode" - Facility = "Facility" - Role = "Role" - System = "System" - Detector = "Detector" - Partition = "Partition" - Run = "Run" + Level = "level" + ErrorCode = "errcode" + Facility = "facility" + Role = "rolename" + System = "system" + Detector = "detector" + Partition = "partition" + Run = "run" ) var Fields = map[string]bool{ diff --git a/common/logger/infologger/hook.go b/common/logger/infologger/hook.go index a7576167c..2d343e6ae 100644 --- a/common/logger/infologger/hook.go +++ b/common/logger/infologger/hook.go @@ -23,7 +23,7 @@ */ package infologger - +/* import ( "fmt" "sort" @@ -34,7 +34,6 @@ import ( "infoLoggerForGo" ) - type Hook struct { infoLogger infoLoggerForGo.InfoLogger system string @@ -131,36 +130,4 @@ func (h *Hook) Fire(e *logrus.Entry) error { } return nil } - - -func logrusLevelToInfoLoggerSeverity(level logrus.Level) string { - switch level { - case logrus.PanicLevel: - return "F" - case logrus.FatalLevel: - return "F" - case logrus.ErrorLevel: - return "E" - case logrus.WarnLevel: - return "W" - case logrus.InfoLevel: - return "I" - case logrus.DebugLevel: - return "D" - case logrus.TraceLevel: - return "D" - default: - return "U" - } -} - -func buildFineFacility(baseFacility string, data logrus.Fields) string { - if data == nil { - return baseFacility - } - - if prefix, ok := data["prefix"]; ok { - return baseFacility + "/" + prefix.(string) - } - return baseFacility -} \ No newline at end of file +*/ \ No newline at end of file diff --git a/common/logger/infologger/protocols.go b/common/logger/infologger/protocols.go new file mode 100644 index 000000000..c66949ce5 --- /dev/null +++ b/common/logger/infologger/protocols.go @@ -0,0 +1,84 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package infologger + +type protoVersion string +const( + v14 = protoVersion("1.4") + v13 = protoVersion("1.3") +) + +type fieldType string +const( + ft_String = fieldType("String") + ft_Number = fieldType("Number") +) + +type fieldSpec struct { + name string + ftype fieldType +} + +type protoSpec []fieldSpec + +var protocols = map[protoVersion]*protoSpec{ + v13: { + {name: "severity", ftype: ft_String}, + {name: "level", ftype: ft_Number}, + {name: "timestamp", ftype: ft_Number}, + {name: "hostname", ftype: ft_String}, + {name: "rolename", ftype: ft_String}, + {name: "pid", ftype: ft_Number}, + {name: "username", ftype: ft_String}, + {name: "system", ftype: ft_String}, + {name: "facility", ftype: ft_String}, + {name: "detector", ftype: ft_String}, + {name: "partition", ftype: ft_String}, + {name: "dest", ftype: ft_String}, + {name: "run", ftype: ft_Number}, + {name: "errcode", ftype: ft_Number}, + {name: "errline", ftype: ft_Number}, + {name: "errsource", ftype: ft_String}, + {name: "message", ftype: ft_String}, + }, + v14: { + {name: "severity", ftype: ft_String}, + {name: "level", ftype: ft_Number}, + {name: "timestamp", ftype: ft_Number}, + {name: "hostname", ftype: ft_String}, + {name: "rolename", ftype: ft_String}, + {name: "pid", ftype: ft_Number}, + {name: "username", ftype: ft_String}, + {name: "system", ftype: ft_String}, + {name: "facility", ftype: ft_String}, + {name: "detector", ftype: ft_String}, + {name: "partition", ftype: ft_String}, + {name: "run", ftype: ft_Number}, + {name: "errcode", ftype: ft_Number}, + {name: "errline", ftype: ft_Number}, + {name: "errsource", ftype: ft_String}, + {name: "message", ftype: ft_String}, + }, +} \ No newline at end of file diff --git a/common/logger/infologger/utils.go b/common/logger/infologger/utils.go new file mode 100644 index 000000000..432ca0438 --- /dev/null +++ b/common/logger/infologger/utils.go @@ -0,0 +1,59 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package infologger + +import "github.com/sirupsen/logrus" + +func logrusLevelToInfoLoggerSeverity(level logrus.Level) string { + switch level { + case logrus.PanicLevel: + return "F" + case logrus.FatalLevel: + return "F" + case logrus.ErrorLevel: + return "E" + case logrus.WarnLevel: + return "W" + case logrus.InfoLevel: + return "I" + case logrus.DebugLevel: + return "D" + case logrus.TraceLevel: + return "D" + default: + return "U" + } +} + +func buildFineFacility(baseFacility string, data logrus.Fields) string { + if data == nil { + return baseFacility + } + + if prefix, ok := data["prefix"]; ok { + return baseFacility + "/" + prefix.(string) + } + return baseFacility +} \ No newline at end of file From f4eb45daaaa6dafa66ad1780ea6c19ce72b197c9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jan 2020 15:21:01 +0100 Subject: [PATCH 0057/2352] [executor] Do not destroy the exec.Cmd instance before Kill --- executor/executable/basictask.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 8bca46c46..2919cf418 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -119,11 +119,6 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { default: } - if t.taskCmd != nil { - t.taskCmd = nil - log.Debug("exec.Cmd wrapper removed") - } - if errStdout != nil || errStderr != nil { log.WithFields(logrus.Fields{ "errStderr": errStderr, @@ -239,6 +234,11 @@ func (t *BasicTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *con } func (t *BasicTask) Kill() error { + if t.taskCmd != nil { + t.taskCmd = nil + log.Debug("exec.Cmd wrapper removed") + } + go t.sendStatus(mesos.TASK_FINISHED, "") return nil } From 25dcf8c719aec3a15661ab96dc93021329b4ed1f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jan 2020 15:21:28 +0100 Subject: [PATCH 0058/2352] [core] Handle incoming nil MesosCommandResponse --- core/task/manager.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index 8c503f7be..d54f569a1 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -462,6 +462,10 @@ func (m *Manager) TransitionTasks(tasks Tasks, src string, event string, dest st response := <- notify close(notify) + if response == nil { + return errors.New("unknown MesosCommand error: nil response received") + } + errText := response.Err().Error() if len(strings.TrimSpace(errText)) != 0 { return errors.New(response.Err().Error()) From 70d9e1f45018d8205dc094a302e8b603b4877574 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jan 2020 15:32:21 +0100 Subject: [PATCH 0059/2352] [executor] Fix crash on rerunning basic task within existing env --- executor/executable/basictask.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 2919cf418..881c48a21 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -179,6 +179,12 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { switch { case ei.Src == "CONFIGURED" && ei.Evt == "START" && ei.Dst == "RUNNING": + // If we've already run the task, went back to CONFIGURED and are now + // looking to rerun it within the same environment, we must recreate + // the taskCmd as the exec.Cmd type is single-use: + if t.taskCmd.ProcessState != nil && t.taskCmd.ProcessState.Exited() { + t.taskCmd = prepareTaskCmd(t.tci) + } err = startBasicTask() if err != nil { return "CONFIGURED", err From 749fcbd2150c9c298f7da813572643a6e0e98ac6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Jan 2020 15:26:47 +0100 Subject: [PATCH 0060/2352] [core] Annotate BASIC_TASK_TERMINATED event for JSON --- common/event/deviceevent.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/common/event/deviceevent.go b/common/event/deviceevent.go index 2a8973199..92ad2cdc8 100644 --- a/common/event/deviceevent.go +++ b/common/event/deviceevent.go @@ -95,11 +95,11 @@ func (e *EndOfStream) GetName() string { type BasicTaskTerminated struct { DeviceEventBase - ExitCode int - Stdout string - Stderr string - VoluntaryTermination bool - FinalMesosState mesos.TaskState + ExitCode int `json:"exitCode"` + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + VoluntaryTermination bool `json:"voluntaryTermination"` + FinalMesosState mesos.TaskState `json:"finalMesosState"` } func (e *BasicTaskTerminated) GetName() string { From a69accd6ceac70e9ca98cad8de588c681a6769c6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Jan 2020 15:29:20 +0100 Subject: [PATCH 0061/2352] [core] Make sure we unmarshal all fields of an incoming DeviceEvent --- core/scheduler.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/scheduler.go b/core/scheduler.go index e86a0254a..b3fc4cc6e 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -263,6 +263,10 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even } ev := event.NewDeviceEvent(incomingEvent.Origin, incomingEvent.Type) if ev != nil { + err = json.Unmarshal(data, &ev) + if err != nil { + return + } handleDeviceEvent(state, ev) } else { log.WithFields(logrus.Fields{ From 7f5a715085d959adada6c90c53f7bfea273604be Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Jan 2020 16:51:26 +0100 Subject: [PATCH 0062/2352] [core] Tone down debug output --- core/state.go | 2 +- core/util.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/state.go b/core/state.go index 3df33d950..3a2fa3470 100644 --- a/core/state.go +++ b/core/state.go @@ -75,7 +75,7 @@ func newInternalState(shutdown func()) (*internalState, error) { log.WithError(err).Fatal("cannot marshal configuration dump") return nil, err } - log.WithField("data", string(cfgBytes)).Debug("configuration dump") + log.WithField("data", string(cfgBytes)).Trace("configuration dump") } resourceOffersDone := make(chan task.DeploymentMap) diff --git a/core/util.go b/core/util.go index 7a01f8b00..f42725a6b 100644 --- a/core/util.go +++ b/core/util.go @@ -53,7 +53,7 @@ func prepareExecutorInfo( metricsAPI *metricsAPI, ) (*mesos.ExecutorInfo, error) { if execImage != "" { - log.Debug("executor container image specified, will run") + log.Trace("executor container image specified, will run") // Create mesos custom executor return &mesos.ExecutorInfo{ Type: mesos.ExecutorInfo_CUSTOM, @@ -75,7 +75,7 @@ func prepareExecutorInfo( Resources: wantsResources, }, nil } else if execBinary != "" { - log.Debug("no executor container image specified, using executor binary") + log.Trace("no executor container image specified, using executor binary") _, executorCmd := filepath.Split(execBinary) var ( From 2c225ba981e1676d88e82b915383d572af5df490 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Jan 2020 16:51:59 +0100 Subject: [PATCH 0063/2352] [core] Make transition reacting to END_OF_STREAM asynchronous --- core/scheduler.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index b3fc4cc6e..2916a7328 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -357,10 +357,12 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") } if env.CurrentState() == "RUNNING" { - err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) - if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") - } + go func() { + err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + } + }() } } } @@ -410,7 +412,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } default: if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler").Debug("no roles need deployment") + log.WithPrefix("scheduler").Trace("no roles need deployment") } } @@ -717,10 +719,10 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl Error("failed to decline tasks") } else { log.WithPrefix("scheduler").WithField("offers", n). - Debug("offers declined") + Trace("offers declined") } } else { - log.WithPrefix("scheduler").Info("no offers to decline") + log.WithPrefix("scheduler").Trace("no offers to decline") } // Notify listeners... @@ -728,11 +730,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl case state.resourceOffersDone <- tasksDeployed: log.WithPrefix("scheduler"). WithField("tasksDeployed", len(tasksDeployed)). - Debug("notified listeners on resourceOffers done") + Trace("notified listeners on resourceOffers done") default: if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). - Debug("no listeners notified") + Trace("no listeners notified") } } @@ -867,7 +869,7 @@ func SendCommand(ctx context.Context, state *internalState, command controlcomma func logAllEvents() eventrules.Rule { return func(ctx context.Context, e *scheduler.Event, err error, ch eventrules.Chain) (context.Context, *scheduler.Event, error) { log.WithPrefix("scheduler").WithField("event", fmt.Sprintf("%+v", *e)). - Debug("incoming event") + Trace("incoming event") return ch(ctx, e, err) } } From c8f974dc0f0819369210243e46139830bb5e48d6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jan 2020 16:20:31 +0100 Subject: [PATCH 0064/2352] [core] SafeToStop mechanism in task.Task This is necessary for handling BASIC_TASK_TERMINATED and END_OF_STREAM events coming from multiple tasks in a workflow --- core/environment/environment.go | 10 ++++++++++ core/scheduler.go | 9 ++++++--- core/task/manager.go | 1 + core/task/task.go | 12 ++++++++++++ 4 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 2cb8e406a..c22043e8b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -153,6 +153,16 @@ func (env *Environment) CurrentState() string { return env.Sm.Current() } +func (env *Environment) IsSafeToStop() bool { + tasks := env.Workflow().GetTasks() + for _, t := range tasks { + if !t.IsSafeToStop() { + return false + } + } + return true +} + func (env *Environment) Workflow() workflow.Role { if env == nil { return nil diff --git a/core/scheduler.go b/core/scheduler.go index 2916a7328..691147ff6 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -357,10 +357,13 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") } if env.CurrentState() == "RUNNING" { + t.SetSafeToStop(true) // we mark this specific task as ok to STOP go func() { - err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) - if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + if env.IsSafeToStop() { // but then we ask the env whether *all* of them are + err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + } } }() } diff --git a/core/task/manager.go b/core/task/manager.go index d54f569a1..667dcb3aa 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -523,6 +523,7 @@ func (m *Manager) UpdateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st + taskPtr.safeToStop = false if taskPtr.parent != nil { taskPtr.parent.UpdateState(st) } diff --git a/core/task/task.go b/core/task/task.go index be599d77b..bc1ec6043 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -93,11 +93,23 @@ type Task struct { status Status state State + safeToStop bool GetTaskClass func() *TaskClass // ↑ to be filled in by NewTaskForMesosOffer in Manager } +func (t *Task) IsSafeToStop() bool { + if t.GetTaskClass().Control.Mode != controlmode.BASIC { + return t.state == RUNNING + } + return t.state == RUNNING && t.safeToStop +} + +func (t *Task) SetSafeToStop(done bool) { + t.safeToStop = done +} + func (t *Task) GetParentRole() interface{} { return t.parent } From 484b794aa7f8ce053d52ee8dd85537cfbf023119 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jan 2020 15:23:58 +0100 Subject: [PATCH 0065/2352] [misc] Migrate from dep to Go Modules --- Gopkg.lock | 1051 ------------------------ Gopkg.toml | 61 -- Makefile | 34 +- common/logger/infologger/directhook.go | 2 +- go.mod | 161 ++-- go.sum | 494 ++++++++--- 6 files changed, 464 insertions(+), 1339 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index 4f942b8ed..000000000 --- a/Gopkg.lock +++ /dev/null @@ -1,1051 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - branch = "master" - digest = "1:1237f2e0fe3256bbce813cc1bafddaf26b85bddbd2f8c08c30eb845140198aee" - name = "github.com/armon/consul-api" - packages = ["."] - pruneopts = "UT" - revision = "eb2c6b5be1b66bab83016e0b05f01b8d5496ffbd" - -[[projects]] - branch = "master" - digest = "1:7a9140c806333a78122763d08ec6c0d7358c7fff1df8cfbb01881c5dc46e24e5" - name = "github.com/armon/go-metrics" - packages = ["."] - pruneopts = "UT" - revision = "ec5e00d3c878b2a97bbe0884ef45ffd1b4f669f5" - -[[projects]] - digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" - name = "github.com/beorn7/perks" - packages = ["quantile"] - pruneopts = "UT" - revision = "37c8de3658fcb183f997c4e13e8337516ab753e6" - version = "v1.0.1" - -[[projects]] - digest = "1:937ce6e0cd5ccfec205f444a0d9c74f5680cbb68cd0a992b000559bf964ea20b" - name = "github.com/briandowns/spinner" - packages = ["."] - pruneopts = "UT" - revision = "e3fb08e7443c496a847cb2eef48e3883f3e12c38" - version = "v1.6.1" - -[[projects]] - digest = "1:53cbf1b46de4361416179ade70a96517fe6263301e65a7afa6afde8d92bab4c6" - name = "github.com/coreos/etcd" - packages = [ - "client", - "pkg/pathutil", - "pkg/srv", - "pkg/types", - "version", - ] - pruneopts = "UT" - revision = "98d308426819d892e149fe45f6fd542464cb1f9d" - version = "v3.3.13" - -[[projects]] - digest = "1:05ffeeed3f0f05520de0679f6aa3219ffee69cfd6d9fb6c194879d4c818ad670" - name = "github.com/coreos/go-semver" - packages = ["semver"] - pruneopts = "UT" - revision = "e214231b295a8ea9479f11b70b35d5acf3556d9b" - version = "v0.3.0" - -[[projects]] - digest = "1:7cb4fdca4c251b3ef8027c90ea35f70c7b661a593b9eeae34753c65499098bb1" - name = "github.com/cpuguy83/go-md2man" - packages = ["md2man"] - pruneopts = "UT" - revision = "7762f7e404f8416dfa1d9bb6a8c192aa9acb4d19" - version = "v1.0.10" - -[[projects]] - digest = "1:b498b36dbb2b306d1c5205ee5236c9e60352be8f9eea9bf08186723a9f75b4f3" - name = "github.com/emirpasic/gods" - packages = [ - "containers", - "lists", - "lists/arraylist", - "trees", - "trees/binaryheap", - "utils", - ] - pruneopts = "UT" - revision = "1615341f118ae12f353cc8a983f35b584342c9b3" - version = "v1.12.0" - -[[projects]] - digest = "1:865079840386857c809b72ce300be7580cb50d3d3129ce11bf9aa6ca2bc1934a" - name = "github.com/fatih/color" - packages = ["."] - pruneopts = "UT" - revision = "5b77d2a35fb0ede96d138fc9a99f5c9b6aef11b4" - version = "v1.7.0" - -[[projects]] - digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" - name = "github.com/fsnotify/fsnotify" - packages = ["."] - pruneopts = "UT" - revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" - version = "v1.4.7" - -[[projects]] - digest = "1:0e16b03c72bd42739ca68d055c10369e60d17838428f512f3b29ae115ba788e0" - name = "github.com/gdamore/encoding" - packages = ["."] - pruneopts = "UT" - revision = "6289cdc94c00ac4aa177771c5fce7af2f96b626d" - version = "v1.0.0" - -[[projects]] - digest = "1:0c4039930c835217e8bd7b4b58f9eccae17ff87720d2f62447ba8a416cdb7d7f" - name = "github.com/gdamore/tcell" - packages = [ - ".", - "terminfo", - "terminfo/a/ansi", - "terminfo/base", - "terminfo/dynamic", - "terminfo/v/vt100", - "terminfo/v/vt102", - "terminfo/v/vt220", - "terminfo/x/xterm", - ] - pruneopts = "UT" - revision = "1922b3786eaefecbba6fd8e11dbfd3531fad7a54" - version = "v1.2.0" - -[[projects]] - digest = "1:9ae31ce33b4bab257668963e844d98765b44160be4ee98cafc44637a213e530d" - name = "github.com/gobwas/glob" - packages = [ - ".", - "compiler", - "match", - "syntax", - "syntax/ast", - "syntax/lexer", - "util/runes", - "util/strings", - ] - pruneopts = "UT" - revision = "5ccd90ef52e1e632236f7326478d4faa74f99438" - version = "v0.2.3" - -[[projects]] - digest = "1:33f49b72fdad072a03d13b31a42edfff08088b7c27198f4073b8213a58884f27" - name = "github.com/gogo/protobuf" - packages = [ - "gogoproto", - "proto", - "protoc-gen-gogo/descriptor", - "sortkeys", - ] - pruneopts = "UT" - revision = "ba06b47c162d49f2af050fb4c75bcbc86a159d5c" - version = "v1.2.1" - -[[projects]] - digest = "1:7ade0e7351787347d3dd3456abb365fd71ea75c19a859505e6a427064e1f9e42" - name = "github.com/golang/protobuf" - packages = [ - "proto", - "protoc-gen-go/descriptor", - "ptypes", - "ptypes/any", - "ptypes/duration", - "ptypes/timestamp", - ] - pruneopts = "UT" - revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" - version = "v1.3.2" - -[[projects]] - digest = "1:582b704bebaa06b48c29b0cec224a6058a09c86883aaddabde889cd1a5f73e1b" - name = "github.com/google/uuid" - packages = ["."] - pruneopts = "UT" - revision = "0cd6bf5da1e1c83f8b45653022c74f71af0538a4" - version = "v1.1.1" - -[[projects]] - digest = "1:8b20ed6a6df0628913a69e4c1709537b2e26c7be4aca856bf52b431cf1ce6d90" - name = "github.com/hashicorp/consul" - packages = ["api"] - pruneopts = "UT" - revision = "a42ded477cf4e5ac1a850b42ec5d25672cd2545d" - version = "v1.5.3" - -[[projects]] - digest = "1:af105c7c5dc0b4ae41991f122cae860b9600f7d226072c2a83127048c991660c" - name = "github.com/hashicorp/go-cleanhttp" - packages = ["."] - pruneopts = "UT" - revision = "eda1e5db218aad1db63ca4642c8906b26bcf2744" - version = "v0.5.1" - -[[projects]] - digest = "1:6e9806a06d00f4d1f90806d7b5cfb11e35dca76503390ca6e704b05ea7051bff" - name = "github.com/hashicorp/go-immutable-radix" - packages = ["."] - pruneopts = "UT" - revision = "7dd1121b595e4e1bd6dd5caa78e0f5c454740379" - version = "v1.1.0" - -[[projects]] - digest = "1:7b893c9e1181e224506c523777dea0d16f4bd20a7627b100cc800e14229f405c" - name = "github.com/hashicorp/go-rootcerts" - packages = ["."] - pruneopts = "UT" - revision = "df8e78a645e18d56ed7bb9ae10ffb8174ab892e2" - version = "v1.0.1" - -[[projects]] - digest = "1:7fae9ec96d10b2afce0da23c378c8b3389319b7f92fa092f2621bba3078cfb4b" - name = "github.com/hashicorp/golang-lru" - packages = ["simplelru"] - pruneopts = "UT" - revision = "7f827b33c0f158ec5dfbba01bb0b14a4541fd81d" - version = "v0.5.3" - -[[projects]] - digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" - name = "github.com/hashicorp/hcl" - packages = [ - ".", - "hcl/ast", - "hcl/parser", - "hcl/printer", - "hcl/scanner", - "hcl/strconv", - "hcl/token", - "json/parser", - "json/scanner", - "json/token", - ] - pruneopts = "UT" - revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" - version = "v1.0.0" - -[[projects]] - digest = "1:acc81e4e4289587b257ccdfccbc6eaf16d4c2fb57dda73c6bb349bf50f02501f" - name = "github.com/hashicorp/serf" - packages = ["coordinate"] - pruneopts = "UT" - revision = "15cfd05de3dffb3664aa37b06e91f970b825e380" - version = "v0.8.3" - -[[projects]] - digest = "1:a1038ef593beb4771c8f0f9c26e8b00410acd800af5c6864651d9bf160ea1813" - name = "github.com/hpcloud/tail" - packages = [ - ".", - "ratelimiter", - "util", - "watch", - "winfile", - ] - pruneopts = "UT" - revision = "a30252cb686a21eb2d0b98132633053ec2f7f1e5" - version = "v1.0.0" - -[[projects]] - digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" - name = "github.com/inconshreveable/mousetrap" - packages = ["."] - pruneopts = "UT" - revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" - version = "v1.0" - -[[projects]] - branch = "master" - digest = "1:62fe3a7ea2050ecbd753a71889026f83d73329337ada66325cbafd5dea5f713d" - name = "github.com/jbenet/go-context" - packages = ["io"] - pruneopts = "UT" - revision = "d14ea06fba99483203c19d92cfcd13ebe73135f4" - -[[projects]] - branch = "master" - digest = "1:ae940e9156d0d778ce1991bcc99e58fa5ca2790ddf7c5f0bc05385854416f7a6" - name = "github.com/jinzhu/copier" - packages = ["."] - pruneopts = "UT" - revision = "976e0346caa839d22a17f8031a96bcd0870c0128" - -[[projects]] - digest = "1:709cd2a2c29cc9b89732f6c24846bbb9d6270f28ef5ef2128cc73bd0d6d7bff9" - name = "github.com/json-iterator/go" - packages = ["."] - pruneopts = "UT" - revision = "27518f6661eba504be5a7a9a9f6d9460d892ade3" - version = "v1.1.7" - -[[projects]] - digest = "1:86c75d55fde56a814f69515d092963634d6f5f6bc1c3e9091b01fbe373a9546e" - name = "github.com/k0kubun/pp" - packages = ["."] - pruneopts = "UT" - revision = "3d73dea227e0711e38b911ffa6fbafc8ff6b2991" - version = "v3.0.1" - -[[projects]] - digest = "1:fd7f169f32c221b096c74e756bda16fe22d3bb448bbf74042fd0700407a1f92f" - name = "github.com/kevinburke/ssh_config" - packages = ["."] - pruneopts = "UT" - revision = "6cfae18c12b8934b1afba3ce8159476fdef666ba" - version = "1.0" - -[[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" - name = "github.com/konsorten/go-windows-terminal-sequences" - packages = ["."] - pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" - -[[projects]] - branch = "master" - digest = "1:17e2b99f622792fcc12942bfc0f9089d1532f6dfc40878b44ae145b458fbab30" - name = "github.com/looplab/fsm" - packages = ["."] - pruneopts = "UT" - revision = "84b5307469f859464403f80919467950a79de1b1" - -[[projects]] - digest = "1:39de67207027b7374272d5ec9b1bf85457714150ba1263e8d236316629dad570" - name = "github.com/lucasb-eyer/go-colorful" - packages = ["."] - pruneopts = "UT" - revision = "30298f24079860c4dee452fdef6519b362a4a026" - version = "v1.0.2" - -[[projects]] - digest = "1:5a0ef768465592efca0412f7e838cdc0826712f8447e70e6ccc52eb441e9ab13" - name = "github.com/magiconair/properties" - packages = ["."] - pruneopts = "UT" - revision = "de8848e004dd33dc07a2947b3d76f618a7fc7ef1" - version = "v1.8.1" - -[[projects]] - digest = "1:c658e84ad3916da105a761660dcaeb01e63416c8ec7bc62256a9b411a05fcd67" - name = "github.com/mattn/go-colorable" - packages = ["."] - pruneopts = "UT" - revision = "167de6bfdfba052fa6b2d3664c8f5272e23c9072" - version = "v0.0.9" - -[[projects]] - digest = "1:9b90c7639a41697f3d4ad12d7d67dfacc9a7a4a6e0bbfae4fc72d0da57c28871" - name = "github.com/mattn/go-isatty" - packages = ["."] - pruneopts = "UT" - revision = "1311e847b0cb909da63b5fecfb5370aa66236465" - version = "v0.0.8" - -[[projects]] - digest = "1:0356f3312c9bd1cbeda81505b7fd437501d8e778ab66998ef69f00d7f9b3a0d7" - name = "github.com/mattn/go-runewidth" - packages = ["."] - pruneopts = "UT" - revision = "3ee7d812e62a0804a7d0a324e0249ca2db3476d3" - version = "v0.0.4" - -[[projects]] - digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - pruneopts = "UT" - revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" - version = "v1.0.1" - -[[projects]] - branch = "master" - digest = "1:30b526b2ebada8db8d58f4b05fd3b5c1159fa198523b1e15443f86daf52b288e" - name = "github.com/mesos/mesos-go" - packages = [ - "api/v1/cmd", - "api/v1/lib", - "api/v1/lib/backoff", - "api/v1/lib/client", - "api/v1/lib/debug", - "api/v1/lib/encoding", - "api/v1/lib/encoding/codecs", - "api/v1/lib/encoding/framing", - "api/v1/lib/encoding/json", - "api/v1/lib/encoding/proto", - "api/v1/lib/executor", - "api/v1/lib/executor/calls", - "api/v1/lib/executor/config", - "api/v1/lib/executor/events", - "api/v1/lib/extras/metrics", - "api/v1/lib/extras/scheduler/callrules", - "api/v1/lib/extras/scheduler/controller", - "api/v1/lib/extras/scheduler/eventrules", - "api/v1/lib/extras/store", - "api/v1/lib/httpcli", - "api/v1/lib/httpcli/apierrors", - "api/v1/lib/httpcli/httpexec", - "api/v1/lib/httpcli/httpsched", - "api/v1/lib/recordio", - "api/v1/lib/resourcefilters", - "api/v1/lib/resources", - "api/v1/lib/roles", - "api/v1/lib/scheduler", - "api/v1/lib/scheduler/calls", - "api/v1/lib/scheduler/events", - "api/v1/lib/time", - ] - pruneopts = "UT" - revision = "56ac038085ac996051390598b156bff1c6ef0d3d" - -[[projects]] - branch = "master" - digest = "1:2b32af4d2a529083275afc192d1067d8126b578c7a9613b26600e4df9c735155" - name = "github.com/mgutz/ansi" - packages = ["."] - pruneopts = "UT" - revision = "9520e82c474b0a04dd04f8a40959027271bab992" - -[[projects]] - digest = "1:5d231480e1c64a726869bc4142d270184c419749d34f167646baa21008eb0a79" - name = "github.com/mitchellh/go-homedir" - packages = ["."] - pruneopts = "UT" - revision = "af06845cf3004701891bf4fdb884bfe4920b3727" - version = "v1.1.0" - -[[projects]] - digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" - name = "github.com/mitchellh/mapstructure" - packages = ["."] - pruneopts = "UT" - revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" - version = "v1.1.2" - -[[projects]] - digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" - name = "github.com/modern-go/concurrent" - packages = ["."] - pruneopts = "UT" - revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" - version = "1.0.3" - -[[projects]] - digest = "1:e32bdbdb7c377a07a9a46378290059822efdce5c8d96fe71940d87cb4f918855" - name = "github.com/modern-go/reflect2" - packages = ["."] - pruneopts = "UT" - revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" - version = "1.0.1" - -[[projects]] - digest = "1:b56c589214f01a5601e0821387db484617392d0042f26234bf2da853a2f498a1" - name = "github.com/naoina/go-stringutil" - packages = ["."] - pruneopts = "UT" - revision = "6b638e95a32d0c1131db0e7fe83775cbea4a0d0b" - version = "v0.1.0" - -[[projects]] - digest = "1:f58c3d0e46b64878d00652fedba24ee879725191ab919dca7b62586859281c04" - name = "github.com/naoina/toml" - packages = [ - ".", - "ast", - ] - pruneopts = "UT" - revision = "e6f5723bf2a66af014955e0888881314cf294129" - version = "v0.1.1" - -[[projects]] - digest = "1:abcdbf03ca6ca13d3697e2186edc1f33863bbdac2b3a44dfa39015e8903f7409" - name = "github.com/olekukonko/tablewriter" - packages = ["."] - pruneopts = "UT" - revision = "e6d60cf7ba1f42d86d54cdf5508611c4aafb3970" - version = "v0.0.1" - -[[projects]] - digest = "1:e9c3bb68a6c9470302b8046d4647e0612a2ea6037b9c6a47de60c0a90db504f8" - name = "github.com/onsi/ginkgo" - packages = [ - ".", - "config", - "internal/codelocation", - "internal/containernode", - "internal/failer", - "internal/leafnodes", - "internal/remote", - "internal/spec", - "internal/spec_iterator", - "internal/specrunner", - "internal/suite", - "internal/testingtproxy", - "internal/writer", - "reporters", - "reporters/stenographer", - "reporters/stenographer/support/go-colorable", - "reporters/stenographer/support/go-isatty", - "types", - ] - pruneopts = "UT" - revision = "eea6ad008b96acdaa524f5b409513bf062b500ad" - version = "v1.8.0" - -[[projects]] - digest = "1:fe167e8f858cbfc10c721f2000f2446140800bb53fa83c088e03d191275611a4" - name = "github.com/onsi/gomega" - packages = [ - ".", - "format", - "internal/assertion", - "internal/asyncassertion", - "internal/oraclematcher", - "internal/testingtsupport", - "matchers", - "matchers/support/goraph/bipartitegraph", - "matchers/support/goraph/edge", - "matchers/support/goraph/node", - "matchers/support/goraph/util", - "types", - ] - pruneopts = "UT" - revision = "90e289841c1ed79b7a598a7cd9959750cb5e89e2" - version = "v1.5.0" - -[[projects]] - digest = "1:e5d0bd87abc2781d14e274807a470acd180f0499f8bf5bb18606e9ec22ad9de9" - name = "github.com/pborman/uuid" - packages = ["."] - pruneopts = "UT" - revision = "adf5a7427709b9deb95d29d3fa8a2bf9cfd388f1" - version = "v1.2" - -[[projects]] - digest = "1:93131d8002d7025da13582877c32d1fc302486775a1b06f62241741006428c5e" - name = "github.com/pelletier/go-toml" - packages = ["."] - pruneopts = "UT" - revision = "728039f679cbcd4f6a54e080d2219a4c4928c546" - version = "v1.4.0" - -[[projects]] - branch = "master" - digest = "1:9d9989e96f765584e1b58e7f23e1b94740deb282fd363e5e7c5b5e30ae7b7c2c" - name = "github.com/pquerna/ffjson" - packages = [ - "fflib/v1", - "fflib/v1/internal", - ] - pruneopts = "UT" - revision = "e517b90714f7c0eabe6d2e570a5886ae077d6db6" - -[[projects]] - digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9" - name = "github.com/prometheus/client_golang" - packages = [ - "prometheus", - "prometheus/internal", - "prometheus/promhttp", - ] - pruneopts = "UT" - revision = "170205fb58decfd011f1550d4cfb737230d7ae4f" - version = "v1.1.0" - -[[projects]] - branch = "master" - digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" - name = "github.com/prometheus/client_model" - packages = ["go"] - pruneopts = "UT" - revision = "fd36f4220a901265f90734c3183c5f0c91daa0b8" - -[[projects]] - digest = "1:8dcedf2e8f06c7f94e48267dea0bc0be261fa97b377f3ae3e87843a92a549481" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "model", - ] - pruneopts = "UT" - revision = "31bed53e4047fd6c510e43a941f90cb31be0972a" - version = "v0.6.0" - -[[projects]] - digest = "1:366f5aa02ff6c1e2eccce9ca03a22a6d983da89eecff8a89965401764534eb7c" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "internal/fs", - ] - pruneopts = "UT" - revision = "3f98efb27840a48a7a2898ec80be07674d19f9c8" - version = "v0.0.3" - -[[projects]] - branch = "master" - digest = "1:d6e9ea49a9c5241d906762898a0d7ccb12a3f3e6f949586010e56ca2203312bc" - name = "github.com/rivo/tview" - packages = ["."] - pruneopts = "UT" - revision = "23dc8a0944e4cdc31297e081606be7959b5c4efc" - -[[projects]] - digest = "1:557a3527e466dd95ec976b81888f6d5a12059be38f5198a5804564cebf9f5277" - name = "github.com/rivo/uniseg" - packages = ["."] - pruneopts = "UT" - revision = "f8f8f751c732fdcd5e158c13c28f8863ad80e9a5" - version = "v0.1.0" - -[[projects]] - digest = "1:b36a0ede02c4c2aef7df7f91cbbb7bb88a98b5d253509d4f997dda526e50c88c" - name = "github.com/russross/blackfriday" - packages = ["."] - pruneopts = "UT" - revision = "05f3235734ad95d0016f6a23902f06461fcf567a" - version = "v1.5.2" - -[[projects]] - digest = "1:d917313f309bda80d27274d53985bc65651f81a5b66b820749ac7f8ef061fd04" - name = "github.com/sergi/go-diff" - packages = ["diffmatchpatch"] - pruneopts = "UT" - revision = "1744e2970ca51c86172c8190fadad617561ed6e7" - version = "v1.0.0" - -[[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" - name = "github.com/sirupsen/logrus" - packages = ["."] - pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" - -[[projects]] - digest = "1:bb495ec276ab82d3dd08504bbc0594a65de8c3b22c6f2aaa92d05b73fbf3a82e" - name = "github.com/spf13/afero" - packages = [ - ".", - "mem", - ] - pruneopts = "UT" - revision = "588a75ec4f32903aa5e39a2619ba6a4631e28424" - version = "v1.2.2" - -[[projects]] - digest = "1:08d65904057412fc0270fc4812a1c90c594186819243160dc779a402d4b6d0bc" - name = "github.com/spf13/cast" - packages = ["."] - pruneopts = "UT" - revision = "8c9545af88b134710ab1cd196795e7f2388358d7" - version = "v1.3.0" - -[[projects]] - digest = "1:abe9f3f23399646a6263682cacc9e86969f6c7e768f0ef036449926aa24cbbef" - name = "github.com/spf13/cobra" - packages = [ - ".", - "doc", - ] - pruneopts = "UT" - revision = "f2b07da1e2c38d5f12845a4f607e2e1018cbb1f5" - version = "v0.0.5" - -[[projects]] - digest = "1:1b753ec16506f5864d26a28b43703c58831255059644351bbcb019b843950900" - name = "github.com/spf13/jwalterweatherman" - packages = ["."] - pruneopts = "UT" - revision = "94f6ae3ed3bceceafa716478c5fbf8d29ca601a1" - version = "v1.1.0" - -[[projects]] - digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" - name = "github.com/spf13/pflag" - packages = ["."] - pruneopts = "UT" - revision = "298182f68c66c05229eb03ac171abe6e309ee79a" - version = "v1.0.3" - -[[projects]] - digest = "1:5d7e98ad29b0dc062d7cb720c4f8c85b521b64a508ffd6d82d5c288d682a2728" - name = "github.com/spf13/viper" - packages = [ - ".", - "remote", - ] - pruneopts = "UT" - revision = "b5bf975e5823809fb22c7644d008757f78a4259e" - version = "v1.4.0" - -[[projects]] - digest = "1:e4ed0afd67bf7be353921665cdac50834c867ff1bba153efc0745b755a7f5905" - name = "github.com/src-d/gcfg" - packages = [ - ".", - "scanner", - "token", - "types", - ] - pruneopts = "UT" - revision = "1ac3a1ac202429a54835fe8408a92880156b489d" - version = "v1.4.0" - -[[projects]] - branch = "master" - digest = "1:cb73172668cfdb965aee8d0eb9ada2b278c85ddc8f4593c4666dd0fe6491ed38" - name = "github.com/teo/logrus-prefixed-formatter" - packages = ["."] - pruneopts = "UT" - revision = "d4c78d9812958d3657170b1369c57a6be0023907" - -[[projects]] - digest = "1:172f94a6b3644a8f9e6b5e5b7fc9fe1e42d424f52a0300b2e7ab1e57db73f85d" - name = "github.com/xanzy/ssh-agent" - packages = ["."] - pruneopts = "UT" - revision = "6a3e2ff9e7c564f36873c2e36413f634534f1c44" - version = "v0.2.1" - -[[projects]] - branch = "master" - digest = "1:fbbce3ff584585118f3c270df893dea88eb3e7ddbece46ea322410af9ae27829" - name = "github.com/xlab/treeprint" - packages = ["."] - pruneopts = "UT" - revision = "a009c3971eca89777614839eb7f69abed3ea3959" - -[[projects]] - branch = "master" - digest = "1:b2faf2256a00b05784390fbd8ea4b22519ea62daf751fef4ab4ce583c66abf1b" - name = "github.com/xordataexchange/crypt" - packages = [ - "backend", - "backend/consul", - "backend/etcd", - "config", - "encoding/secconf", - ] - pruneopts = "UT" - revision = "b2862e3d0a775f18c7cfe02273500ae307b61218" - -[[projects]] - branch = "master" - digest = "1:2d4cab5a9ea650aa99394d7e768e280f0cfc1d0b7c0fa08f2447391ab1eb5480" - name = "golang.org/x/crypto" - packages = [ - "cast5", - "curve25519", - "ed25519", - "ed25519/internal/edwards25519", - "internal/chacha20", - "internal/subtle", - "openpgp", - "openpgp/armor", - "openpgp/elgamal", - "openpgp/errors", - "openpgp/packet", - "openpgp/s2k", - "poly1305", - "ssh", - "ssh/agent", - "ssh/knownhosts", - "ssh/terminal", - ] - pruneopts = "UT" - revision = "4def268fd1a49955bfb3dda92fe3db4f924f2285" - -[[projects]] - branch = "master" - digest = "1:a7e913ba6e6a12039af83d8f10cd5e478e53e0cf3682e7b5e6f907c96927d67a" - name = "golang.org/x/net" - packages = [ - "context", - "html", - "html/atom", - "html/charset", - "http/httpguts", - "http2", - "http2/hpack", - "idna", - "internal/socks", - "internal/timeseries", - "proxy", - "trace", - ] - pruneopts = "UT" - revision = "ca1201d0de80cfde86cb01aea620983605dfe99b" - -[[projects]] - branch = "master" - digest = "1:afce8593ac5918df05a46499b04b8c4e46a91e99566055e4a8ba829a8f389a09" - name = "golang.org/x/sys" - packages = [ - "cpu", - "unix", - "windows", - ] - pruneopts = "UT" - revision = "51ab0e2deafac1f46c46ad59cf0921be2f180c3d" - -[[projects]] - digest = "1:28deae5fe892797ff37a317b5bcda96d11d1c90dadd89f1337651df3bc4c586e" - name = "golang.org/x/text" - packages = [ - "collate", - "collate/build", - "encoding", - "encoding/charmap", - "encoding/htmlindex", - "encoding/internal", - "encoding/internal/identifier", - "encoding/japanese", - "encoding/korean", - "encoding/simplifiedchinese", - "encoding/traditionalchinese", - "encoding/unicode", - "internal/colltab", - "internal/gen", - "internal/language", - "internal/language/compact", - "internal/tag", - "internal/triegen", - "internal/ucd", - "internal/utf8internal", - "language", - "runes", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - ] - pruneopts = "UT" - revision = "342b2e1fbaa52c93f31447ad2c6abc048c63e475" - version = "v0.3.2" - -[[projects]] - branch = "master" - digest = "1:583a0c80f5e3a9343d33aea4aead1e1afcc0043db66fdf961ddd1fe8cd3a4faf" - name = "google.golang.org/genproto" - packages = ["googleapis/rpc/status"] - pruneopts = "UT" - revision = "fa694d86fc64c7654a660f8908de4e879866748d" - -[[projects]] - digest = "1:89eba2efa76562459d64d23c595954cfb3531b05a2970ca94253b6dc316a8e71" - name = "google.golang.org/grpc" - packages = [ - ".", - "balancer", - "balancer/base", - "balancer/roundrobin", - "binarylog/grpc_binarylog_v1", - "codes", - "connectivity", - "credentials", - "credentials/internal", - "encoding", - "encoding/proto", - "grpclog", - "internal", - "internal/backoff", - "internal/balancerload", - "internal/binarylog", - "internal/channelz", - "internal/envconfig", - "internal/grpcrand", - "internal/grpcsync", - "internal/syscall", - "internal/transport", - "keepalive", - "metadata", - "naming", - "peer", - "reflection", - "reflection/grpc_reflection_v1alpha", - "resolver", - "resolver/dns", - "resolver/passthrough", - "serviceconfig", - "stats", - "status", - "tap", - ] - pruneopts = "UT" - revision = "045159ad57f3781d409358e3ade910a018c16b30" - version = "v1.22.1" - -[[projects]] - digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" - name = "gopkg.in/fsnotify.v1" - packages = ["."] - pruneopts = "UT" - revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" - source = "gopkg.in/fsnotify/fsnotify.v1" - version = "v1.4.7" - -[[projects]] - digest = "1:eb27cfcaf8d7e4155224dd0a209f1d0ab19784fef01be142638b78b7b6becd6b" - name = "gopkg.in/src-d/go-billy.v4" - packages = [ - ".", - "helper/chroot", - "helper/polyfill", - "osfs", - "util", - ] - pruneopts = "UT" - revision = "780403cfc1bc95ff4d07e7b26db40a6186c5326e" - version = "v4.3.2" - -[[projects]] - digest = "1:b2ad0a18676cd4d5b4b180709c1ea34dbabd74b3d7db0cc01e6d287d5f1e3a99" - name = "gopkg.in/src-d/go-git.v4" - packages = [ - ".", - "config", - "internal/revision", - "internal/url", - "plumbing", - "plumbing/cache", - "plumbing/filemode", - "plumbing/format/config", - "plumbing/format/diff", - "plumbing/format/gitignore", - "plumbing/format/idxfile", - "plumbing/format/index", - "plumbing/format/objfile", - "plumbing/format/packfile", - "plumbing/format/pktline", - "plumbing/object", - "plumbing/protocol/packp", - "plumbing/protocol/packp/capability", - "plumbing/protocol/packp/sideband", - "plumbing/revlist", - "plumbing/storer", - "plumbing/transport", - "plumbing/transport/client", - "plumbing/transport/file", - "plumbing/transport/git", - "plumbing/transport/http", - "plumbing/transport/internal/common", - "plumbing/transport/server", - "plumbing/transport/ssh", - "storage", - "storage/filesystem", - "storage/filesystem/dotgit", - "storage/memory", - "utils/binary", - "utils/diff", - "utils/ioutil", - "utils/merkletrie", - "utils/merkletrie/filesystem", - "utils/merkletrie/index", - "utils/merkletrie/internal/frame", - "utils/merkletrie/noder", - ] - pruneopts = "UT" - revision = "0d1a009cbb604db18be960db5f1525b99a55d727" - version = "v4.13.1" - -[[projects]] - branch = "v1" - digest = "1:0caa92e17bc0b65a98c63e5bc76a9e844cd5e56493f8fdbb28fad101a16254d9" - name = "gopkg.in/tomb.v1" - packages = ["."] - pruneopts = "UT" - revision = "dd632973f1e7218eb1089048e0798ec9ae7dceb8" - -[[projects]] - digest = "1:78d374b493e747afa9fbb2119687e3740a7fb8d0ebabddfef0a012593aaecbb3" - name = "gopkg.in/warnings.v0" - packages = ["."] - pruneopts = "UT" - revision = "ec4a0fea49c7b46c2aeb0b51aac55779c607e52b" - version = "v0.1.2" - -[[projects]] - digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" - name = "gopkg.in/yaml.v2" - packages = ["."] - pruneopts = "UT" - revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" - version = "v2.2.2" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/briandowns/spinner", - "github.com/fatih/color", - "github.com/gdamore/tcell", - "github.com/gobwas/glob", - "github.com/gogo/protobuf/proto", - "github.com/golang/protobuf/proto", - "github.com/google/uuid", - "github.com/hashicorp/consul/api", - "github.com/jinzhu/copier", - "github.com/k0kubun/pp", - "github.com/looplab/fsm", - "github.com/mesos/mesos-go/api/v1/cmd", - "github.com/mesos/mesos-go/api/v1/lib", - "github.com/mesos/mesos-go/api/v1/lib/backoff", - "github.com/mesos/mesos-go/api/v1/lib/encoding", - "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs", - "github.com/mesos/mesos-go/api/v1/lib/executor", - "github.com/mesos/mesos-go/api/v1/lib/executor/calls", - "github.com/mesos/mesos-go/api/v1/lib/executor/config", - "github.com/mesos/mesos-go/api/v1/lib/executor/events", - "github.com/mesos/mesos-go/api/v1/lib/extras/metrics", - "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/callrules", - "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/controller", - "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/eventrules", - "github.com/mesos/mesos-go/api/v1/lib/extras/store", - "github.com/mesos/mesos-go/api/v1/lib/httpcli", - "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpexec", - "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpsched", - "github.com/mesos/mesos-go/api/v1/lib/resources", - "github.com/mesos/mesos-go/api/v1/lib/scheduler", - "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls", - "github.com/mesos/mesos-go/api/v1/lib/scheduler/events", - "github.com/mitchellh/go-homedir", - "github.com/naoina/toml", - "github.com/olekukonko/tablewriter", - "github.com/onsi/ginkgo", - "github.com/onsi/gomega", - "github.com/pborman/uuid", - "github.com/prometheus/client_golang/prometheus", - "github.com/prometheus/client_golang/prometheus/promhttp", - "github.com/rivo/tview", - "github.com/sirupsen/logrus", - "github.com/spf13/cobra", - "github.com/spf13/cobra/doc", - "github.com/spf13/pflag", - "github.com/spf13/viper", - "github.com/spf13/viper/remote", - "github.com/teo/logrus-prefixed-formatter", - "github.com/xlab/treeprint", - "golang.org/x/net/context", - "golang.org/x/sys/unix", - "google.golang.org/grpc", - "google.golang.org/grpc/codes", - "google.golang.org/grpc/reflection", - "google.golang.org/grpc/status", - "gopkg.in/src-d/go-git.v4", - "gopkg.in/src-d/go-git.v4/plumbing", - "gopkg.in/yaml.v2", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index af8be30cc..000000000 --- a/Gopkg.toml +++ /dev/null @@ -1,61 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -[prune] - unused-packages = true - go-tests = true - -[[constraint]] - branch = "master" - name = "github.com/looplab/fsm" - -[[constraint]] - name = "github.com/mesos/mesos-go" - branch = "master" - -[[constraint]] - name = "github.com/pborman/uuid" - version = "1.2.0" - -[[constraint]] - name = "github.com/sirupsen/logrus" - version = "1.2.0" - -[[constraint]] - name = "github.com/teo/logrus-prefixed-formatter" - branch = "master" - -[[override]] - name = "gopkg.in/fsnotify.v1" - source = "gopkg.in/fsnotify/fsnotify.v1" - -# Workaround for https://github.com/rivo/tview/issues/205 -[[override]] - name = "github.com/mattn/go-runewidth" - version = "v0.0.4" - -#[[override]] -# name = "github.com/cpuguy83/go-md2man" -# branch = "master" - -[[override]] - name = "github.com/russross/blackfriday" -# branch = "master" - version = "v1.5.2" diff --git a/Makefile b/Makefile index 4a0676869..c512e98a7 100644 --- a/Makefile +++ b/Makefile @@ -77,15 +77,15 @@ install: $(INSTALL_WHAT) $(WHAT): # @echo -e "WHAT_$@_BUILD_FLAGS $(WHAT_$@_BUILD_FLAGS)" - @echo -e "\e[1;33m$(WHAT_$@_BUILD_FLAGS) go build\e[0m ./cmd/$@ \e[1;33m==>\e[0m \e[1;34m./bin/$@\e[0m" + @echo -e "\e[1;33m$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor\e[0m ./cmd/$@ \e[1;33m==>\e[0m \e[1;34m./bin/$@\e[0m" # @echo ${PWD} - @$(WHAT_$@_BUILD_FLAGS) go build $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ + @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ $(INSTALL_WHAT): # @echo -e "WHAT_$(@:install_%=%)_BUILD_FLAGS $(WHAT_$(@:install_%=%)_BUILD_FLAGS)" - @echo -e "\e[1;33m$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install\e[0m ./cmd/$(@:install_%=%) \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$(@:install_%=%)\e[0m" + @echo -e "\e[1;33m$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor\e[0m ./cmd/$(@:install_%=%) \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$(@:install_%=%)\e[0m" # @echo ${PWD} - @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) + @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) generate: ifndef HAS_GOGOPROTO @@ -96,16 +96,16 @@ endif go generate $(VERBOSE_$(V)) $$gendir; \ done -test: tools/dep +test: $(BUILD_FLAGS) go test -v --race $(SRC_DIRS) -ginkgo.progress -debugtest: tools/dep +debugtest: $(BUILD_FLAGS) go test -v --race $(SRC_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress -vet: tools/dep +vet: go vet $(SRC_DIRS) -fmt: tools/dep +fmt: go fmt $(SRC_DIRS) clean: @@ -116,9 +116,13 @@ cleanall: @rm -rf bin tools vendor @echo -e "clean done: \e[1;34mbin tools vendor\e[0m" -vendor: tools/dep - @echo -e "\e[1;33mdep ensure\e[0m" - @./tools/dep ensure +vendor: + @echo -e "\e[1;33mgo mod vendor\e[0m" + @go mod vendor + +# vendor: tools/dep +# @echo -e "\e[1;33mdep ensure\e[0m" +# @./tools/dep ensure # @mkdir -p vendor/infoLoggerForGo # @cp ${INFOLOGGER_ROOT}/lib/infoLoggerForGo.* vendor/infoLoggerForGo/ @@ -127,13 +131,7 @@ vendor: tools/dep # use g++ instead of gcc. # @touch vendor/infoLoggerForGo/infoLoggerForGo.cpp -tools: tools/dep tools/protoc - -tools/dep: - @echo "downloading dep" - mkdir -p tools - curl -L https://github.com/golang/dep/releases/download/v0.5.1/dep-$(HOST_GOOS)-$(HOST_GOARCH) -o tools/dep - chmod +x tools/dep +tools: tools/protoc tools/protoc: @echo "installing Go protoc" diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 62867f140..03be84a88 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -83,7 +83,7 @@ type DirectHook struct { } func paddedAbstractSocket(name string) string { - targetLen := 108 // Linux constant + const targetLen = 108 // Linux constant out := make([]byte, targetLen) for i := 0; i < targetLen; i++ { if i < len(name) { diff --git a/go.mod b/go.mod index bf4101646..fd0f81743 100644 --- a/go.mod +++ b/go.mod @@ -1,93 +1,88 @@ module github.com/AliceO2Group/Control +go 1.12 + require ( - github.com/BurntSushi/toml v0.3.0 // indirect - github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895 // indirect - github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78 // indirect - github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 // indirect - github.com/briandowns/spinner v0.0.0-20180626164024-5b875a9171af - github.com/circonus-labs/circonus-gometrics v2.2.1+incompatible // indirect - github.com/circonus-labs/circonusllhist v0.0.0-20180430145027-5eb751da55c6 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect + github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 + github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 + github.com/beorn7/perks v1.0.1 + github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c + github.com/coreos/bbolt v1.3.3 // indirect + github.com/coreos/etcd v3.3.10+incompatible + github.com/coreos/go-semver v0.2.0 + github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect + github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/emirpasic/gods v1.12.0 github.com/fatih/color v1.7.0 - github.com/fsnotify/fsnotify v1.4.7 // indirect - github.com/gobwas/glob v0.2.3 - github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 - github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect - github.com/golang/protobuf v1.1.0 - github.com/hashicorp/consul v1.2.2 - github.com/hashicorp/go-cleanhttp v0.0.0-20171218145408-d5fe4b57a186 // indirect - github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa // indirect - github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c // indirect - github.com/hashicorp/go-multierror v1.0.0 // indirect - github.com/hashicorp/go-retryablehttp v0.0.0-20180718195005-e651d75abec6 // indirect - github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90 // indirect - github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 // indirect - github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036 // indirect - github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 // indirect - github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce // indirect - github.com/hashicorp/memberlist v0.1.0 // indirect - github.com/hashicorp/serf v0.8.1 // indirect - github.com/hashicorp/yamux v0.0.0-20180826203732-cc6d2ea263b2 // indirect - github.com/hpcloud/tail v1.0.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3 + github.com/gdamore/tcell v1.1.2 + github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1 + github.com/gogo/protobuf v1.2.1 + github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect + github.com/golang/protobuf v1.3.2 + github.com/google/btree v1.0.0 // indirect + github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1 + github.com/gorilla/websocket v1.4.1 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect + github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.12.1 // indirect + github.com/hashicorp/consul/api v1.1.0 + github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/memberlist v0.1.4 // indirect + github.com/hpcloud/tail v1.0.0 + github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 + github.com/jonboulle/clockwork v0.1.0 // indirect + github.com/json-iterator/go v1.1.6 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect - github.com/k0kubun/pp v2.3.0+incompatible - github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 // indirect - github.com/looplab/fsm v0.0.0-20180515091235-f980bdb68a89 - github.com/magiconair/properties v1.8.0 // indirect - github.com/mattn/go-colorable v0.0.9 // indirect - github.com/mattn/go-isatty v0.0.3 // indirect - github.com/mattn/go-runewidth v0.0.2 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect - github.com/mesos/mesos-go v0.0.0-20180726154829-5a67a247eead - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect - github.com/miekg/dns v1.0.8 // indirect - github.com/mitchellh/go-homedir v0.0.0-20180801233206-58046073cbff - github.com/mitchellh/go-testing-interface v1.0.0 // indirect - github.com/mitchellh/mapstructure v0.0.0-20180715050151-f15292f7a699 // indirect - github.com/naoina/go-stringutil v0.1.0 // indirect - github.com/naoina/toml v0.1.1 - github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84 + github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0 + github.com/kylelemons/godebug v1.1.0 // indirect + github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8 + github.com/mattn/go-colorable v0.1.2 + github.com/mattn/go-isatty v0.0.8 + github.com/mattn/go-runewidth v0.0.4 + github.com/matttproud/golang_protobuf_extensions v1.0.1 + github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac + github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b + github.com/mitchellh/go-homedir v1.1.0 + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd + github.com/modern-go/reflect2 v1.0.1 + github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d + github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6 + github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f github.com/onsi/ginkgo v1.6.0 - github.com/onsi/gomega v1.4.1 - github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c // indirect - github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 // indirect - github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c - github.com/pelletier/go-toml v1.2.0 // indirect - github.com/pkg/errors v0.8.0 // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20 // indirect - github.com/prometheus/client_golang v0.8.0 - github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 // indirect - github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e // indirect - github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273 // indirect - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect - github.com/sirupsen/logrus v1.0.6 - github.com/spf13/afero v1.1.1 // indirect - github.com/spf13/cast v1.2.0 // indirect - github.com/spf13/cobra v0.0.3 - github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec // indirect - github.com/spf13/pflag v1.0.1 // indirect - github.com/spf13/viper v1.0.2 - github.com/stretchr/testify v1.2.2 // indirect + github.com/onsi/gomega v1.4.2 + github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 + github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 + github.com/prometheus/client_golang v1.0.0 + github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 + github.com/prometheus/common v0.6.0 + github.com/prometheus/procfs v0.0.3 + github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 + github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732 // indirect + github.com/russross/blackfriday v1.5.2 + github.com/sirupsen/logrus v1.4.2 + github.com/soheilhy/cmux v0.1.4 // indirect + github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3 + github.com/spf13/pflag v1.0.3 + github.com/spf13/viper v1.3.2 + github.com/src-d/gcfg v1.4.0 github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 - github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 // indirect + github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect + github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca - golang.org/x/crypto v0.0.0-20180802221240-56440b844dfe // indirect - golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a - golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect - golang.org/x/sys v0.0.0-20180806082429-34b17bdb4300 // indirect - golang.org/x/text v0.3.0 // indirect - google.golang.org/appengine v1.1.0 // indirect - google.golang.org/genproto v0.0.0-20180731170733-daca94659cb5 // indirect - google.golang.org/grpc v1.14.0 - gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect - gopkg.in/fsnotify.v1 v1.4.7 // indirect - gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect - gopkg.in/vmihailenco/msgpack.v2 v2.9.1 // indirect - gopkg.in/yaml.v2 v2.2.1 + github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 + go.etcd.io/bbolt v1.3.3 // indirect + go.uber.org/zap v1.13.0 // indirect + golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 + golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 + golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa + golang.org/x/text v0.3.2 + golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect + google.golang.org/appengine v1.4.0 // indirect + google.golang.org/grpc v1.24.0 + gopkg.in/fsnotify.v1 v1.4.7 + gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60 + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 + gopkg.in/warnings.v0 v0.1.2 + gopkg.in/yaml.v2 v2.2.3 ) diff --git a/go.sum b/go.sum index 038c9c682..3568fa6e1 100644 --- a/go.sum +++ b/go.sum @@ -1,182 +1,426 @@ -github.com/BurntSushi/toml v0.3.0 h1:e1/Ivsx3Z0FVTV0NSOv/aVgbUWyQuzj7DDnFblkRvsY= -github.com/BurntSushi/toml v0.3.0/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895 h1:dmc/C8bpE5VkQn65PNbbyACDC8xw8Hpp/NEurdPmQDQ= -github.com/DataDog/datadog-go v0.0.0-20180822151419-281ae9f2d895/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78 h1:mdRSArcFLfW0VoL34LZAKSz6LkkK4jFxVx2xYavACMg= -github.com/armon/go-metrics v0.0.0-20180713145231-3c58d8115a78/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973 h1:xJ4a3vCFaGF/jqvzLMYoU8P317H5OQ+Via4RmuPwCS0= +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= +github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= +github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/briandowns/spinner v0.0.0-20180626164024-5b875a9171af h1:CzYpDWJqkM3xNlLYMgcROjZDbTi404SVEzFM4ZCrKcY= -github.com/briandowns/spinner v0.0.0-20180626164024-5b875a9171af/go.mod h1:hw/JEQBIE+c/BLI4aKM8UU8v+ZqrD3h7HC27kKt8JQU= -github.com/circonus-labs/circonus-gometrics v2.2.1+incompatible h1:1L31gruXa06igfDg0HNf0lw40TEgGesySg9nZ3rI5v4= -github.com/circonus-labs/circonus-gometrics v2.2.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= -github.com/circonus-labs/circonusllhist v0.0.0-20180430145027-5eb751da55c6 h1:Rm//1hbNxCErrYx7+QSOvITlZtNpt3rW1Ov8lxifdsg= -github.com/circonus-labs/circonusllhist v0.0.0-20180430145027-5eb751da55c6/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c h1:KN5ZlRNnQTrfWPx4u4Ku/YHBX6mnI8NUEmB8DnjTqKY= +github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= +github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= +github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= -github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415 h1:WSBJMqJbLxsn+bTCPyPYZfqHdJmc8MK4wrBjMft6BAM= -github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= +github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.1.2 h1:Afe8cU6SECC06UmvaJ55Jr3Eh0tz/ywLjqWYqjGZp3s= +github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1 h1:YXuzGGFuMAsneym/3VUv1ITd0wfzUMVQPTBFHjdVBB4= +github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/protobuf v1.1.0 h1:0iH4Ffd/meGoXqF2lSAhZHt8X+cPgkfn/cb6Cce5Vpc= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/hashicorp/consul v1.2.2 h1:C5FurAZWLQ+XAjmL9g6rXbPlwxyyz8DvTL0WCAxTLAo= -github.com/hashicorp/consul v1.2.2/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1 h1:ilOjbdkICALXG74FGpl2zsZQPTl4x3rXkFHFc+Z+W5o= +github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= +github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.0.0-20171218145408-d5fe4b57a186 h1:URgjUo+bs1KwatoNbwG0uCO4dHN4r1jsp4a5AGgHRjo= -github.com/hashicorp/go-cleanhttp v0.0.0-20171218145408-d5fe4b57a186/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa h1:0nA8i+6Rwqaq9xlpmVxxTwk6rxiEhX+E6Wh4vPNHiS8= -github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa/go.mod h1:6ij3Z20p+OhOkCSrA0gImAWoHYQRGbnlcuk6XYTiaRw= -github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c h1:BTAbnbegUIMB6xmQCwWE8yRzbA4XSpnZY5hvRJC188I= -github.com/hashicorp/go-msgpack v0.0.0-20150518234257-fa3f63826f7c/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= +github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-retryablehttp v0.0.0-20180718195005-e651d75abec6 h1:qCv4319q2q7XKn0MQbi8p37hsJ+9Xo8e6yojA73JVxk= -github.com/hashicorp/go-retryablehttp v0.0.0-20180718195005-e651d75abec6/go.mod h1:fXcdFsQoipQa7mwORhKad5jmDCeSy/RCGzWA08PO0lM= -github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90 h1:9HVkPxOpo+yO93Ah4yrO67d/qh0fbLLWbKqhYjyHq9A= -github.com/hashicorp/go-rootcerts v0.0.0-20160503143440-6bb64b370b90/go.mod h1:o4zcYY1e0GEZI6eSEr+43QDYmuGglw1qSO6qdHUHCgg= -github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86 h1:7YOlAIO2YWnJZkQp7B5eFykaIY7C9JndqAFQyVV5BhM= -github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036 h1:d8T6WIONl4rMCPcQ/eY3uSz3+e4/GaoflKjXrWMex1U= -github.com/hashicorp/go-uuid v0.0.0-20180228145832-27454136f036/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47 h1:UnszMmmmm5vLwWzDjTFVIkfhvWF1NdrmChl8L2NUDCw= -github.com/hashicorp/golang-lru v0.0.0-20180201235237-0fb14efe8c47/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce h1:xdsDDbiBDQTKASoGEZ+pEmF1OnWuu8AQ9I8iNbHNeno= -github.com/hashicorp/hcl v0.0.0-20180404174102-ef8a98b0bbce/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w= -github.com/hashicorp/memberlist v0.1.0 h1:qSsCiC0WYD39lbSitKNt40e30uorm2Ss/d4JGU1hzH8= -github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE= -github.com/hashicorp/serf v0.8.1 h1:mYs6SMzu72+90OcPa5wr3nfznA4Dw9UyR791ZFNOIf4= -github.com/hashicorp/serf v0.8.1/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= -github.com/hashicorp/yamux v0.0.0-20180826203732-cc6d2ea263b2 h1:QWdAspPPc/c5mh+D7cedfGmL8cxGXKxUGZiNMduza68= -github.com/hashicorp/yamux v0.0.0-20180826203732-cc6d2ea263b2/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= +github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= +github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= +github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= +github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0OcoGs= +github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= +github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= +github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3 h1:sHsPfNMAG70QAvKbddQ0uScZCHQoZsT5NykGRCeeeIs= -github.com/jinzhu/copier v0.0.0-20180308034124-7e38e58719c3/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= +github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= +github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/pp v2.3.0+incompatible h1:EKhKbi34VQDWJtq+zpsKSEhkHHs9w2P8Izbq8IhLVSo= -github.com/k0kubun/pp v2.3.0+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348 h1:MtvEpTB6LX3vkb4ax0b5D2DHbNAUsen0Gx5wZoq3lV4= -github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= -github.com/looplab/fsm v0.0.0-20180515091235-f980bdb68a89 h1:xQVP1ArDVHkSnlRqDo92HDHHsLA4mMSlOfo/zB2gqkM= -github.com/looplab/fsm v0.0.0-20180515091235-f980bdb68a89/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= +github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0 h1:isrpDsQUQHYEAfXO8bqhFDLoxc5QwsVmRhLJxgyHib8= +github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= +github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8 h1:BqTJQmqiLncTRN8doCq+TeUqTgnRVpALHB0r9wOX0dM= +github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= +github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= +github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-isatty v0.0.3 h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI= +github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-runewidth v0.0.2 h1:UnlwIPBGaTZfPQ6T1IGzPI0EkYAQmT9fAEJ/poFC63o= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mesos/mesos-go v0.0.0-20180726154829-5a67a247eead h1:k/8LjWi89Rn87kYvOYh4TbbDVpXDYBS9UXSzyEQX+cA= -github.com/mesos/mesos-go v0.0.0-20180726154829-5a67a247eead/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= +github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= +github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.8 h1:Zi8HNpze3NeRWH1PQV6O71YcvJRQ6j0lORO6DAEmAAI= -github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= -github.com/mitchellh/go-homedir v0.0.0-20180801233206-58046073cbff h1:jM4Eo4qMmmcqePS3u6X2lcEELtVuXWkWJIS/pRI3oSk= -github.com/mitchellh/go-homedir v0.0.0-20180801233206-58046073cbff/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= +github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/mapstructure v0.0.0-20180715050151-f15292f7a699 h1:KXZJFdun9knAVAR8tg/aHJEr5DgtcbqyvzacK+CDCaI= -github.com/mitchellh/mapstructure v0.0.0-20180715050151-f15292f7a699/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= -github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84 h1:fiKJgB4JDUd43CApkmCeTSQlWjtTtABrU2qsgbuP0BI= -github.com/olekukonko/tablewriter v0.0.0-20180506121414-d4647c9c7a84/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= +github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d h1:EGph1kHLXbvElkn0raT+O5rDHtzJP3lpz2LeI4vcmpU= +github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6 h1:w6eXHR7WKUyvZ7oKurReO1EJE1T2GEn5nCFUez8ZidQ= +github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f h1:rTTOFopae+vzrPqqP8245pIaoTOapT6CmssriqpvPR8= +github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.1 h1:PZSj/UFNaVp3KxrzHOcS7oyuWA7LoOY/77yCTEFu21U= -github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c h1:Lgl0gzECD8GnQ5QCWA8o6BtfL6mDH5rQgM4/fX3avOs= +github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1 h1:/I3lTljEEDNYLho3/FUB7iD/oc2cEFgVmbHzV+O0PtU= -github.com/pascaldekloe/name v0.0.0-20180628100202-0fd16699aae1/go.mod h1:eD5JxqMiuNYyFNmyY9rkJ/slN8y59oEu4Ei7F8OoKWQ= -github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c h1:MUyE44mTvnI5A0xrxIxaMqoWFzPfQvtE2IWUollMDMs= -github.com/pborman/uuid v0.0.0-20170612153648-e790cca94e6c/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= +github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 h1:zNBQb37RGLmJybyMcs983HfUfpkw9OTFD9tbBfAViHE= +github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20 h1:7sBb9iOkeq+O7AXlVoH/8zpIcRXX523zMkKKspHjjx8= -github.com/pquerna/ffjson v0.0.0-20180717144149-af8b230fcd20/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= -github.com/prometheus/client_golang v0.8.0 h1:1921Yw9Gc3iSc4VQh3PIoOqgPCZS7G/4xQNVUp8Mda8= -github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910 h1:idejC8f05m9MGOsuEi1ATq9shN03HrxNkD/luQvxCv8= +github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE= +github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e h1:n/3MEhJQjQxrOUCzh1Y3Re6aJUUWRp2M9+Oc3eVn/54= -github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273 h1:agujYaXJSxSo18YNX3jzl+4G6Bstwt+kqv47GS12uL0= -github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= +github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= +github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 h1:3L7UVoI/26LdSEPadEc4tNPMW+4vLBJaj31jAlJG4xg= +github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= +github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732 h1:Bsua5Lz58TGb1rIpyGH1hRWNkIlSFW9NL7uNJ8N/KAA= +github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sirupsen/logrus v1.0.6 h1:hcP1GmhGigz/O7h1WVUM5KklBp1JoNS9FggWKdj/j3s= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/spf13/afero v1.1.1 h1:Lt3ihYMlE+lreX1GS4Qw4ZsNpYQLxIXKBTEOXm3nt6I= -github.com/spf13/afero v1.1.1/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/cast v1.2.0 h1:HHl1DSRbEQN2i8tJmtS6ViPyHx35+p51amrdsiTCrkg= -github.com/spf13/cast v1.2.0/go.mod h1:r2rcYCSwa1IExKTDiTfzaxqT2FNHs8hODu4LnUfgKEg= -github.com/spf13/cobra v0.0.3 h1:ZlrZ4XsMRm04Fr5pSFxBgfND2EBVa1nLpiy1stUsX/8= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec h1:2ZXvIUGghLpdTVHR1UfvfrzoVlZaE/yOWC5LueIHZig= -github.com/spf13/jwalterweatherman v0.0.0-20180109140146-7c0cea34c8ec/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/pflag v1.0.1 h1:aCvUg6QPl3ibpQUxyLkrEkCHtPqYJL4x9AuhqVqFis4= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.0.2 h1:Ncr3ZIuJn322w2k1qmzXDnkLAdQMlJqBa9kfAH+irso= -github.com/spf13/viper v1.0.2/go.mod h1:A8kyI5cUJhb8N+3pkfONlcEcZbueH6nhAm0Fq7SrnBM= -github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3 h1:OWK3X+aTDXVHzFGBd2DWuYtScqHPPPOWVv2ED2Av1iY= +github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= +github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= -github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= +github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= +github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= -golang.org/x/crypto v0.0.0-20180802221240-56440b844dfe h1:APBCFlxGVQi3YDSHtTbNXRZhDEuz9rrnVPXZA4YbUx8= -golang.org/x/crypto v0.0.0-20180802221240-56440b844dfe/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a h1:8fCF9zjAir2SP3N+axz9xs+0r4V8dqPzqsWO10t8zoo= -golang.org/x/net v0.0.0-20180801234040-f4c29de78a2a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f h1:wMNYb4v58l5UBM7MYRLPG6ZhfOqbKu7X5eyFl8ZhKvA= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= +golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180806082429-34b17bdb4300 h1:eJa+6+7jje7fOYUrLnwKNR9kcpvLANj1Asw0Ou1pBiI= -golang.org/x/sys v0.0.0-20180806082429-34b17bdb4300/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= +golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto v0.0.0-20180731170733-daca94659cb5 h1:2PjFmwzH/sxgW9CRJDlEiwMHO8rOk1eMDzVL14HC1e4= -google.golang.org/genproto v0.0.0-20180731170733-daca94659cb5/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/grpc v1.14.0 h1:ArxJuB1NWfPY6r9Gp9gqwplT0Ge7nqv9msgu03lHLmo= -google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= +gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= +gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= +gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= +gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60 h1:tcCfbJJIOZouLjPc4sqmYW+AusrD6VzUTxIbyxXJZ0E= +gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/vmihailenco/msgpack.v2 v2.9.1 h1:kb0VV7NuIojvRfzwslQeP3yArBqJHW9tOl4t38VS1jM= -gopkg.in/vmihailenco/msgpack.v2 v2.9.1/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= -gopkg.in/yaml.v2 v2.2.1 h1:mUhvW9EsL+naU5Q3cakzfE91YhliOondGd6ZrsDBHQE= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From 091766c9dc877426875681705a8662a0795552fe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 17 Jan 2020 16:10:50 +0100 Subject: [PATCH 0066/2352] [core] Cleanup on failed deployment OCTRL-167 #close Issue caused by task misconfiguration. In AliECS we now make sure that if a task transitions to ERROR immediately after deployment, and the environment deployment fails, we clean up afterwards. --- core/environment/manager.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index bec5d107e..a0ad3ba0c 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/pborman/uuid" + "github.com/sirupsen/logrus" ) type Manager struct { @@ -71,12 +72,30 @@ func (envs *Manager) CreateEnvironment(workflowPath string) (uuid.UUID, error) { nil, true )) if err != nil { - rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), env.Workflow().GetTasks()) + envState := env.CurrentState() + envTasks := env.Workflow().GetTasks() + rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) if rlsErr != nil { log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") } delete(envs.m, env.id.Array()) + + // As this is a failed env deployment, we must clean up any running & released tasks. + // This is an important step as env deploy failures are often caused by bad task + // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, + // so there's no point in keeping it for future recovery & reconfiguration. + var killedTasks task.Tasks + killedTasks, _, err = envs.taskman.KillTasks(envTasks.GetTaskIds()) + if err != nil { + log.WithError(err).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + }). + Warn("environment deployment failed, tasks were cleaned up") + return env.id, err } From 109fe7f289805e5e56a57a066476d5070086cf1c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 17 Jan 2020 16:51:42 +0100 Subject: [PATCH 0067/2352] [core] Correctly report deployment error --- core/environment/manager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index a0ad3ba0c..ffe211e05 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -86,9 +86,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string) (uuid.UUID, error) { // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, // so there's no point in keeping it for future recovery & reconfiguration. var killedTasks task.Tasks - killedTasks, _, err = envs.taskman.KillTasks(envTasks.GetTaskIds()) - if err != nil { - log.WithError(err).Warn("task teardown error") + killedTasks, _, rlsErr = envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") } log.WithFields(logrus.Fields{ "killedCount": len(killedTasks), From 754f836d7e02867a14c90adb4ffd12f0e386b503 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Jan 2020 16:33:51 +0100 Subject: [PATCH 0068/2352] [misc] Refresh coconut documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 2 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_history.md | 2 +- coconut/doc/coconut_configuration_import.md | 2 +- coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 2 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 2 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 12 ++++++------ 28 files changed, 33 insertions(+), 33 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 5af84dd06..a87ca7296 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -30,4 +30,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index b7987d958..602bb73b5 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -29,4 +29,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index cadbd21d7..bdae78ca5 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -31,4 +31,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 44dfc3b1e..bebb925f8 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -32,4 +32,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index e6a7e906d..77b641804 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -39,4 +39,4 @@ coconut conf history / * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index a17e194c8..5ee124f35 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -45,4 +45,4 @@ coconut conf import .json * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 4426899d7..d133648b5 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -40,4 +40,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index b9ef1244e..b77e13fd6 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -42,4 +42,4 @@ coconut conf show /@ * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index a05af2624..890d019d3 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -51,4 +51,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index cc9042b83..7b9e2b5d8 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -39,4 +39,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index acabc8211..f5236b262 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -44,4 +44,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index e83a2b2cb..792bdd9e0 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -34,4 +34,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index d2c5ce173..1da67ad03 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -30,4 +30,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 5c11e351a..155584a2b 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -32,4 +32,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index 903893ca5..f71cdb333 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -30,4 +30,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index c5011a99e..0e5348c98 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -55,4 +55,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index f98a7966c..d2505ad1a 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -30,4 +30,4 @@ coconut repository add [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index fdcc8b8de..95da248df 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 1a543874b..8638821d3 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 4670a28a4..2853267b2 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 4bbea03d9..b3bb9b639 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 4b95efa90..5aa350d94 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -27,4 +27,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index acae53e54..a6b5755fe 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -29,4 +29,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 9f99adcf6..590f7b885 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -28,4 +28,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 9f2cb33be..ce78b6ca4 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -31,4 +31,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index d7d296afd..0015c1791 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -30,4 +30,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index e0e88bca9..3dd0766e3 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -27,4 +27,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 63d7b13c0..3ae9a2b02 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -21,11 +21,11 @@ coconut template list [flags] * `coconut templ list` lists templates from the HEAD of master for all git repositories * `coconut templ list *AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * `coconut templ list *@v*` lists templates coming from revisions matching the `v*`pattern for all git repositories - * `coconut templ list --repo=*AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * `coconut templ list --repository=*AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * `coconut templ list --revision=dev*` lists templates coming from revisions matching the `dev*`pattern for all git repositories - * `coconut templ list --repo=*gitlab.cern.ch* --revision=master` lists templates for revisions `master`for git repositories matching `*gitlab.cern.ch*` + * `coconut templ list --repository=*gitlab.cern.ch* --revision=master` lists templates for revisions `master`for git repositories matching `*gitlab.cern.ch*` * `coconut templ list --all-branches` lists templates from all branches for all git repositories - * `coconut templ list --repo=*github.com* --all-tags` lists templates from all tags for git repositories which match the *github.com* pattern + * `coconut templ list --repository=*github.com* --all-tags` lists templates from all tags for git repositories which match the *github.com* pattern * `coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 ` lists templates from the commit corresponding to the hash for all git repositories ``` @@ -35,8 +35,8 @@ coconut template list [flags] -b, --all-branches list templates from all branches -t, --all-tags list templates from all tags -h, --help help for list - -r, --repository string repositories to list templates from (default "*") - -i, --revision string revisions (branches/tags) to list templates from (default "master") + -r, --repository string repositories to list templates from + -i, --revision string revisions (branches/tags) to list templates from ``` ### Options inherited from parent commands @@ -52,4 +52,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 3-Oct-2019 +###### Auto generated by spf13/cobra on 20-Jan-2020 From e874670470d48ba2a714fc768c05e378b78ab42e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jan 2020 10:34:48 +0100 Subject: [PATCH 0069/2352] [build] Bump to v0.12.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index b55e86ab6..59a0df274 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 11 -VERSION_PATCH := 1 +VERSION_MINOR := 12 +VERSION_PATCH := 0 From 5d57d21116d215c22988163ee0a1ea14a948dd5b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jan 2020 13:39:23 +0100 Subject: [PATCH 0070/2352] [build] Bump dependencies --- go.mod | 110 +++++++++++++++++--------------- go.sum | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 256 insertions(+), 51 deletions(-) diff --git a/go.mod b/go.mod index fd0f81743..6da2b7851 100644 --- a/go.mod +++ b/go.mod @@ -2,87 +2,95 @@ module github.com/AliceO2Group/Control go 1.12 +// Hack to build go-md2man needed by viper +// Issue: https://github.com/cpuguy83/go-md2man/issues/58 +replace github.com/russross/blackfriday => github.com/russross/blackfriday v1.5.2 + require ( github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 - github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 + github.com/armon/go-metrics v0.3.0 github.com/beorn7/perks v1.0.1 - github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c + github.com/briandowns/spinner v1.8.0 github.com/coreos/bbolt v1.3.3 // indirect - github.com/coreos/etcd v3.3.10+incompatible - github.com/coreos/go-semver v0.2.0 - github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f // indirect - github.com/dgrijalva/jwt-go v3.2.0+incompatible // indirect + github.com/coreos/etcd v3.3.18+incompatible + github.com/coreos/go-semver v0.3.0 github.com/emirpasic/gods v1.12.0 - github.com/fatih/color v1.7.0 - github.com/gdamore/tcell v1.1.2 - github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1 - github.com/gogo/protobuf v1.2.1 + github.com/fatih/color v1.9.0 + github.com/gdamore/tcell v1.3.0 + github.com/gobwas/glob v0.2.3 + github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect github.com/golang/protobuf v1.3.2 - github.com/google/btree v1.0.0 // indirect - github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1 + github.com/google/uuid v1.1.1 github.com/gorilla/websocket v1.4.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.12.1 // indirect - github.com/hashicorp/consul/api v1.1.0 + github.com/hashicorp/consul/api v1.3.0 + github.com/hashicorp/go-immutable-radix v1.1.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/memberlist v0.1.4 // indirect + github.com/hashicorp/serf v0.8.5 // indirect github.com/hpcloud/tail v1.0.0 - github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 - github.com/jonboulle/clockwork v0.1.0 // indirect - github.com/json-iterator/go v1.1.6 + github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a + github.com/json-iterator/go v1.1.9 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect - github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0 + github.com/k0kubun/pp v3.0.1+incompatible + github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8 - github.com/mattn/go-colorable v0.1.2 - github.com/mattn/go-isatty v0.0.8 - github.com/mattn/go-runewidth v0.0.4 + github.com/looplab/fsm v0.1.0 + github.com/lucasb-eyer/go-colorful v1.0.3 // indirect + github.com/mattn/go-colorable v0.1.4 + github.com/mattn/go-isatty v0.0.12 + github.com/mattn/go-runewidth v0.0.8 github.com/matttproud/golang_protobuf_extensions v1.0.1 github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b github.com/mitchellh/go-homedir v1.1.0 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd github.com/modern-go/reflect2 v1.0.1 - github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d - github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6 - github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f - github.com/onsi/ginkgo v1.6.0 - github.com/onsi/gomega v1.4.2 - github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 - github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 - github.com/prometheus/client_golang v1.0.0 - github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 - github.com/prometheus/common v0.6.0 - github.com/prometheus/procfs v0.0.3 - github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 - github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732 // indirect - github.com/russross/blackfriday v1.5.2 + github.com/naoina/go-stringutil v0.1.0 + github.com/naoina/toml v0.1.1 + github.com/olekukonko/tablewriter v0.0.4 + github.com/onsi/ginkgo v1.11.0 + github.com/onsi/gomega v1.8.1 + github.com/pborman/uuid v1.2.0 + github.com/pelletier/go-toml v1.6.0 // indirect + github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 + github.com/prometheus/client_golang v1.3.0 + github.com/prometheus/client_model v0.2.0 + github.com/prometheus/common v0.9.1 + github.com/prometheus/procfs v0.0.8 + github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 + github.com/russross/blackfriday v2.0.0+incompatible + github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.4.2 - github.com/soheilhy/cmux v0.1.4 // indirect - github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3 - github.com/spf13/pflag v1.0.3 - github.com/spf13/viper v1.3.2 + github.com/spf13/afero v1.2.2 // indirect + github.com/spf13/cast v1.3.1 // indirect + github.com/spf13/cobra v0.0.5 + github.com/spf13/jwalterweatherman v1.1.0 // indirect + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.6.2 github.com/src-d/gcfg v1.4.0 github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 - github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 // indirect + github.com/ugorji/go v1.1.7 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect - github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 // indirect - github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca + github.com/xlab/treeprint v1.0.0 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 go.etcd.io/bbolt v1.3.3 // indirect go.uber.org/zap v1.13.0 // indirect - golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 - golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 - golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa + golang.org/x/crypto v0.0.0-20200117160349-530e935923ad + golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa + golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 golang.org/x/text v0.3.2 - golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 // indirect - google.golang.org/appengine v1.4.0 // indirect - google.golang.org/grpc v1.24.0 + golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect + google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 // indirect + google.golang.org/grpc v1.26.0 gopkg.in/fsnotify.v1 v1.4.7 - gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60 + gopkg.in/ini.v1 v1.51.1 // indirect + gopkg.in/src-d/go-git.v4 v4.13.1 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 gopkg.in/warnings.v0 v0.1.2 - gopkg.in/yaml.v2 v2.2.3 + gopkg.in/yaml.v2 v2.2.7 ) diff --git a/go.sum b/go.sum index 3568fa6e1..e39578595 100644 --- a/go.sum +++ b/go.sum @@ -4,10 +4,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -17,6 +21,8 @@ github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5 github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= +github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= +github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -27,16 +33,30 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c h1:KN5ZlRNnQTrfWPx4u4Ku/YHBX6mnI8NUEmB8DnjTqKY= github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/briandowns/spinner v1.8.0 h1:SeidJ8ASAayR4Wxl5Of54LHqgi8s6sBvAHg4kxKxia4= +github.com/briandowns/spinner v1.8.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.18+incompatible h1:Zz1aXgDrFFi1nadh58tA9ktt06cmPTwNNP3dXwIq1lE= +github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= @@ -47,10 +67,15 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -59,21 +84,29 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell v1.1.2 h1:Afe8cU6SECC06UmvaJ55Jr3Eh0tz/ywLjqWYqjGZp3s= github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= +github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= +github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1 h1:YXuzGGFuMAsneym/3VUv1ITd0wfzUMVQPTBFHjdVBB4= github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -87,21 +120,36 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1 h1:ilOjbdkICALXG74FGpl2zsZQPTl4x3rXkFHFc+Z+W5o= github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0 h1:HXNYlRkkM/t+Y/Yhxtwcy02dlYwIaoxzvxPnS+cqy78= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -109,6 +157,8 @@ github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVo github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= +github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -117,6 +167,8 @@ github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHh github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= +github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= +github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= @@ -126,6 +178,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -135,6 +189,8 @@ github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0 github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= +github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= +github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= @@ -144,21 +200,34 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= +github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0 h1:isrpDsQUQHYEAfXO8bqhFDLoxc5QwsVmRhLJxgyHib8= github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= +github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= +github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -170,18 +239,32 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8 h1:BqTJQmqiLncTRN8doCq+TeUqTgnRVpALHB0r9wOX0dM= github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= +github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= +github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= +github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= +github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= +github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= +github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= @@ -201,30 +284,47 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d h1:EGph1kHLXbvElkn0raT+O5rDHtzJP3lpz2LeI4vcmpU= github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= +github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6 h1:w6eXHR7WKUyvZ7oKurReO1EJE1T2GEn5nCFUez8ZidQ= github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= +github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f h1:rTTOFopae+vzrPqqP8245pIaoTOapT6CmssriqpvPR8= github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 h1:zNBQb37RGLmJybyMcs983HfUfpkw9OTFD9tbBfAViHE= github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= +github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= +github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= +github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -233,54 +333,101 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE= github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= +github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= +github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 h1:3L7UVoI/26LdSEPadEc4tNPMW+4vLBJaj31jAlJG4xg= github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= +github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 h1:iSQ9CjsvareuUUlmHAQKpn4+ZjZjMtldyygiOH3G3+s= +github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732 h1:Bsua5Lz58TGb1rIpyGH1hRWNkIlSFW9NL7uNJ8N/KAA= github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday v2.0.0+incompatible h1:cBXrhZNUf9C+La9/YpS+UHpUT8YD6Td9ZMSU9APFcsk= +github.com/russross/blackfriday v2.0.0+incompatible/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3 h1:OWK3X+aTDXVHzFGBd2DWuYtScqHPPPOWVv2ED2Av1iY= github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= +github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= +github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -291,13 +438,18 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= @@ -306,8 +458,11 @@ github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5 github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs= +github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -329,6 +484,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad h1:Jh8cai0fqIK+f6nG0UgPW5wFk8wmiMhM3AyciDBdtQg= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= @@ -342,26 +499,33 @@ golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -369,9 +533,16 @@ golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 h1:N19i1HjUnR7TF7rMt8O4p3dLvqvmYyzB6ifMFmrbY50= +golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -379,48 +550,74 @@ golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZe golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT0QnZDg9Uc2dH0Ql513kFvHocz+WM= +google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= +gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60 h1:tcCfbJJIOZouLjPc4sqmYW+AusrD6VzUTxIbyxXJZ0E= gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= +gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= From 981059e6dbc21ba46d1b3039a0383c791811fbc5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jan 2020 13:59:36 +0100 Subject: [PATCH 0071/2352] [build] Fix viper dependency and go mod tidy --- go.mod | 46 +++++++++++++++++----------------------------- go.sum | 58 +--------------------------------------------------------- 2 files changed, 18 insertions(+), 86 deletions(-) diff --git a/go.mod b/go.mod index 6da2b7851..17d276ef3 100644 --- a/go.mod +++ b/go.mod @@ -6,15 +6,16 @@ go 1.12 // Issue: https://github.com/cpuguy83/go-md2man/issues/58 replace github.com/russross/blackfriday => github.com/russross/blackfriday v1.5.2 +// Hack to get a working binary needed by viper +// Issue: https://github.com/spf13/viper/issues/644 +replace github.com/coreos/etcd => github.com/coreos/etcd v3.3.18+incompatible + require ( - github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 - github.com/armon/go-metrics v0.3.0 - github.com/beorn7/perks v1.0.1 + github.com/armon/go-metrics v0.3.0 // indirect github.com/briandowns/spinner v1.8.0 github.com/coreos/bbolt v1.3.3 // indirect - github.com/coreos/etcd v3.3.18+incompatible - github.com/coreos/go-semver v0.3.0 - github.com/emirpasic/gods v1.12.0 + github.com/coreos/etcd v3.3.18+incompatible // indirect + github.com/coreos/go-semver v0.3.0 // indirect github.com/fatih/color v1.9.0 github.com/gdamore/tcell v1.3.0 github.com/gobwas/glob v0.2.3 @@ -32,38 +33,31 @@ require ( github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/memberlist v0.1.4 // indirect github.com/hashicorp/serf v0.8.5 // indirect - github.com/hpcloud/tail v1.0.0 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a - github.com/json-iterator/go v1.1.9 + github.com/json-iterator/go v1.1.9 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.1.0 github.com/lucasb-eyer/go-colorful v1.0.3 // indirect - github.com/mattn/go-colorable v0.1.4 - github.com/mattn/go-isatty v0.0.12 - github.com/mattn/go-runewidth v0.0.8 - github.com/matttproud/golang_protobuf_extensions v1.0.1 + github.com/mattn/go-isatty v0.0.12 // indirect + github.com/mattn/go-runewidth v0.0.8 // indirect github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b + github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd - github.com/modern-go/reflect2 v1.0.1 - github.com/naoina/go-stringutil v0.1.0 + github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 github.com/olekukonko/tablewriter v0.0.4 github.com/onsi/ginkgo v1.11.0 github.com/onsi/gomega v1.8.1 github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect - github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 + github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/client_golang v1.3.0 - github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.9.1 - github.com/prometheus/procfs v0.0.8 + github.com/prometheus/common v0.9.1 // indirect github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 - github.com/russross/blackfriday v2.0.0+incompatible + github.com/russross/blackfriday v2.0.0+incompatible // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.4.2 github.com/spf13/afero v1.2.2 // indirect @@ -72,25 +66,19 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.6.2 - github.com/src-d/gcfg v1.4.0 github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 - github.com/ugorji/go v1.1.7 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xlab/treeprint v1.0.0 - github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 go.etcd.io/bbolt v1.3.3 // indirect go.uber.org/zap v1.13.0 // indirect - golang.org/x/crypto v0.0.0-20200117160349-530e935923ad + golang.org/x/crypto v0.0.0-20200117160349-530e935923ad // indirect golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 - golang.org/x/text v0.3.2 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 // indirect google.golang.org/grpc v1.26.0 - gopkg.in/fsnotify.v1 v1.4.7 gopkg.in/ini.v1 v1.51.1 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 - gopkg.in/warnings.v0 v0.1.2 gopkg.in/yaml.v2 v2.2.7 + sigs.k8s.io/yaml v1.1.0 // indirect ) diff --git a/go.sum b/go.sum index e39578595..8d9f99551 100644 --- a/go.sum +++ b/go.sum @@ -3,7 +3,6 @@ github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= -github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= @@ -19,8 +18,6 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878 h1:EFSB7Zo9Eg91v7MJPVsifUysc/wPdN+NOnVe6bWbdBM= -github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= @@ -31,8 +28,6 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c h1:KN5ZlRNnQTrfWPx4u4Ku/YHBX6mnI8NUEmB8DnjTqKY= -github.com/briandowns/spinner v0.0.0-20190611041244-e3fb08e7443c/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/briandowns/spinner v1.8.0 h1:SeidJ8ASAayR4Wxl5Of54LHqgi8s6sBvAHg4kxKxia4= github.com/briandowns/spinner v1.8.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -82,8 +77,6 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.1.2 h1:Afe8cU6SECC06UmvaJ55Jr3Eh0tz/ywLjqWYqjGZp3s= -github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -95,8 +88,6 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1 h1:YXuzGGFuMAsneym/3VUv1ITd0wfzUMVQPTBFHjdVBB4= -github.com/gobwas/glob v0.0.0-20180208210656-5ccd90ef52e1/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -124,8 +115,6 @@ github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1 h1:ilOjbdkICALXG74FGpl2zsZQPTl4x3rXkFHFc+Z+W5o= -github.com/google/uuid v0.0.0-20190227210549-0cd6bf5da1e1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -142,12 +131,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/hashicorp/consul/api v1.1.0 h1:BNQPM9ytxj6jbjjdRPioQ94T6YXriSopn0i8COv6SRA= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0 h1:HXNYlRkkM/t+Y/Yhxtwcy02dlYwIaoxzvxPnS+cqy78= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.1.1 h1:LnuDWGNsoajlhGyHJvuWW6FVqRl8JOTPqS6CPTsYjhY= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -198,8 +183,6 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8 h1:mGIXW/lubQ4B+3bXTLxcTMTjUNDqoF6T/HUW9LbFx9s= -github.com/jinzhu/copier v0.0.0-20190625015134-976e0346caa8/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= @@ -215,8 +198,6 @@ github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0 h1:isrpDsQUQHYEAfXO8bqhFDLoxc5QwsVmRhLJxgyHib8= -github.com/k0kubun/pp v0.0.0-20190402025839-3d73dea227e0/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= @@ -237,8 +218,6 @@ github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8 h1:BqTJQmqiLncTRN8doCq+TeUqTgnRVpALHB0r9wOX0dM= -github.com/looplab/fsm v0.0.0-20190116160011-84b5307469f8/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= @@ -291,33 +270,23 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d h1:EGph1kHLXbvElkn0raT+O5rDHtzJP3lpz2LeI4vcmpU= -github.com/naoina/go-stringutil v0.0.0-20151118234443-6b638e95a32d/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6 h1:w6eXHR7WKUyvZ7oKurReO1EJE1T2GEn5nCFUez8ZidQ= -github.com/naoina/toml v0.0.0-20170428090843-e6f5723bf2a6/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f h1:rTTOFopae+vzrPqqP8245pIaoTOapT6CmssriqpvPR8= -github.com/olekukonko/tablewriter v0.0.0-20181026071410-e6d60cf7ba1f/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709 h1:zNBQb37RGLmJybyMcs983HfUfpkw9OTFD9tbBfAViHE= -github.com/pborman/uuid v0.0.0-20180906182336-adf5a7427709/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= @@ -331,8 +300,6 @@ github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= -github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7 h1:gGBSHPOU7g8YjTbhwn+lvFm2VDEhhA+PwDIlstkgSxE= -github.com/pquerna/ffjson v0.0.0-20181028064349-e517b90714f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -353,8 +320,6 @@ github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= @@ -362,18 +327,11 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3 h1:CTwfnzjQ+8dS6MhHHu4YswVAD99sL2wjPqP+VkURmKE= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4 h1:3L7UVoI/26LdSEPadEc4tNPMW+4vLBJaj31jAlJG4xg= -github.com/rivo/tview v0.0.0-20190721135419-23dc8a0944e4/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 h1:iSQ9CjsvareuUUlmHAQKpn4+ZjZjMtldyygiOH3G3+s= github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= -github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732 h1:Bsua5Lz58TGb1rIpyGH1hRWNkIlSFW9NL7uNJ8N/KAA= -github.com/rivo/uniseg v0.0.0-20190706090656-f8f8f751c732/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -381,9 +339,6 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday v2.0.0+incompatible h1:cBXrhZNUf9C+La9/YpS+UHpUT8YD6Td9ZMSU9APFcsk= -github.com/russross/blackfriday v2.0.0+incompatible/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -391,8 +346,6 @@ github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= @@ -412,8 +365,6 @@ github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3 h1:OWK3X+aTDXVHzFGBd2DWuYtScqHPPPOWVv2ED2Av1iY= -github.com/spf13/cobra v0.0.0-20190607144823-f2b07da1e2c3/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= @@ -445,19 +396,16 @@ github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.m github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca h1:1CFlNzQhALwjS9mBAUkycX616GzgsuYUOCHA5+HSlXI= -github.com/xlab/treeprint v0.0.0-20181112141820-a009c3971eca/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs= github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= @@ -535,8 +483,6 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa h1:KIDDMLT1O0Nr7TSxp8xM5tJcdn8tgyAONntO829og1M= -golang.org/x/sys v0.0.0-20190804053845-51ab0e2deafa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -598,8 +544,6 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60 h1:tcCfbJJIOZouLjPc4sqmYW+AusrD6VzUTxIbyxXJZ0E= -gopkg.in/src-d/go-git.v4 v4.0.0-20190801152248-0d1a009cbb60/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= From 42c2de739204f93b6406cddefe409b6ce5aac404 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jan 2020 14:00:24 +0100 Subject: [PATCH 0072/2352] [build] Bump to v0.12.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 59a0df274..437fb643e 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 12 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From c2e367a1c8e89f6f646f4039a80d68f742d94529 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 23 Jan 2020 12:42:18 +0100 Subject: [PATCH 0073/2352] [core] Fill out logrus fields --- common/logger/infologger/directhook.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 03be84a88..d76ef076d 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -28,14 +28,20 @@ import ( "errors" "fmt" "net" + "os" + "os/user" "runtime" "sort" "strconv" "strings" + "time" "github.com/sirupsen/logrus" ) +func newUnixTimestamp() string { + return fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) +} type sender struct { stream net.Conn @@ -133,9 +139,14 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { // Severity, Level, ErrorCode, SourceFile, SourceLine, // Facility, Role, System, Detector, Partition, Run // Filled automatically by InfoLogger, do not set: PID, hostName, userName - payload := make(map[string]string) payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) + payload["timestamp"] = newUnixTimestamp() + hostname, _ := os.Hostname() + payload["hostname"] = hostname + payload["pid"] = fmt.Sprintf("%d",os.Getpid()) + unixUser, _ := user.Current() + payload["username"] = unixUser.Name if e.HasCaller() { payload["errsource"] = e.Caller.File From c4556870a59ab557d303bfee2ac0cba8c9edb2fb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 23 Jan 2020 13:10:42 +0000 Subject: [PATCH 0074/2352] [build] Bump to v0.12.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 437fb643e..849747de5 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 12 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 03435ffd5133f3363d274894cf0be3cea095b54d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jan 2020 11:46:30 +0100 Subject: [PATCH 0075/2352] [core] Optimize logger constants --- common/logger/infologger/directhook.go | 29 ++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index d76ef076d..7014144ca 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -39,6 +39,29 @@ import ( "github.com/sirupsen/logrus" ) +var ( + hostname string + pid string + username string +) + +func init() { + var err error + pid = fmt.Sprintf("%d", os.Getpid()) + + unixUser, _ := user.Current() + if unixUser != nil { + username = unixUser.Name + } + + hostname, err = os.Hostname() + if err != nil { + return + } + // We only take the short hostname + hostname = strings.Split(hostname, ".")[0] +} + func newUnixTimestamp() string { return fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) } @@ -142,11 +165,9 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { payload := make(map[string]string) payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) payload["timestamp"] = newUnixTimestamp() - hostname, _ := os.Hostname() payload["hostname"] = hostname - payload["pid"] = fmt.Sprintf("%d",os.Getpid()) - unixUser, _ := user.Current() - payload["username"] = unixUser.Name + payload["pid"] = pid + payload["username"] = username if e.HasCaller() { payload["errsource"] = e.Caller.File From 08bf1328c01ca2b106835c1167150ae7981ae914 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Feb 2020 17:03:51 +0100 Subject: [PATCH 0076/2352] [executor] Lower logrus severity of task stout/stderr --- executor/executable/controllabletask.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6ec5a072a..5cef7f216 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -77,10 +77,10 @@ func (t *ControllableTask) Launch() error { Debug("task started") go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer(), stdoutIn) + _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer(), stderrIn) + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stderrIn) }() log.WithFields(logrus.Fields{ From c8338367de3a9096fbbf4b4b7a57c45a7b498427 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 7 Feb 2020 16:31:40 +0100 Subject: [PATCH 0077/2352] [core]: manage a single writable directory path --- core/config.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/config.go b/core/config.go index ca247284e..685cf44e7 100644 --- a/core/config.go +++ b/core/config.go @@ -48,6 +48,7 @@ func setDefaults() error { } exeDir := filepath.Dir(exe) + viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows") @@ -172,6 +173,20 @@ func sanitizeReposPath() { viper.Set("repositoriesPath", sanitizedReposPath) } +func checkWorkingDirRights() error { + err := unix.Access(viper.GetString("coreWorkingDir"), unix.W_OK) + if err != nil { + return errors.New("No write access for core working path \"" + viper.GetString("coreWorkingDir") + "\": "+ err.Error()) + } + return nil +} + +func sanitizeWorkingPath() { + sanitizeWorkingPath := viper.GetString("coreWorkingDir") + utils.EnsureTrailingSlash(&sanitizeWorkingPath) + viper.Set("coreWorkingDir", sanitizeWorkingPath) +} + // Bind environment variables with the prefix ALIECS // e.g. ALIECS_EXECUTORCPU func bindEnvironmentVariables() { @@ -197,6 +212,10 @@ func NewConfig() (err error) { if err = checkRepoDirRights(); err != nil { return } + sanitizeWorkingPath() + if err = checkWorkingDirRights(); err != nil { + return + } return } From ddfa0b8a43f7f6041e8d4f38d4617114d04d7e52 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 7 Feb 2020 16:32:36 +0100 Subject: [PATCH 0078/2352] [core]: persistent FID with reconciliation for previous running tasks --- core/confsys/service.go | 25 +++++++++++++++++++++++++ core/core.go | 15 +++++++++++++-- core/scheduler.go | 22 ++++++++++++++++++++-- 3 files changed, 58 insertions(+), 4 deletions(-) diff --git a/core/confsys/service.go b/core/confsys/service.go index ff03feb98..81835dd88 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -187,4 +187,29 @@ func (s *Service) RefreshRepositories() { // vars inserted (todo: figure out which vars get parsed when and where) func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]string /*vars from cli/gui*/) string { panic("not implemented yet") +} + +// Persist Mesos Framework ID by saving to Consul, or to a local file. +func (s *Service) NewMesosFID(fidValue string) error { + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + return cSrc.Put("o2/aliecs/mesos_fid", fidValue) + } else { + data := []byte(fidValue) + return ioutil.WriteFile(viper.GetString("coreWorkingDir") + "mesos_fid.txt", data, 0644) + } +} + +// Retrieve Mesos Framework ID from Consul, or local file. +func (s *Service) GetMesosFID() (fidValue string, err error) { + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + return cSrc.Get("o2/aliecs/mesos_fid") + } else { + var byteFidValue []byte + byteFidValue, err = ioutil.ReadFile(viper.GetString("coreWorkingDir") + "mesos_fid.txt") + if err != nil { + return + } + fidValue = strings.TrimSuffix(string(byteFidValue), "/n") + return + } } \ No newline at end of file diff --git a/core/core.go b/core/core.go index bd7a955ac..6fa5d9ba2 100644 --- a/core/core.go +++ b/core/core.go @@ -27,6 +27,7 @@ package core import ( "context" "github.com/AliceO2Group/Control/common/product" + "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" "time" @@ -72,13 +73,23 @@ func Run() error { // store.Singleton is a thread-safe abstraction to load and store and string, // provided by mesos-go. - // We also make sure that a log message is printed when the FrameworkID changes. + // We also make sure that a log message is printed with the FrameworkID. fidStore := store.DecorateSingleton( store.NewInMemorySingleton(), store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { - log.WithField("frameworkId", v).Debug("generated new frameworkId") + // Store Mesos Framework ID to configuration. + err = the.ConfSvc().NewMesosFID(v) + if err != nil { + log.WithField("error", err).Error("cannot write to configuration") + } + log.WithField("frameworkId", v).Debug("frameworkId") return nil })) + + // Set Framework ID from the configuration + if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { + store.SetOrPanic(fidStore)(fidValue) + } // callrules.New returns a Rules and accept a bunch of Rule values as arguments. // WithFrameworkID returns a Rule which injects a frameworkID to outgoing calls. diff --git a/core/scheduler.go b/core/scheduler.go index 691147ff6..9206b92ab 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -155,6 +155,7 @@ func buildEventHandler(state *internalState, fidStore store.Singleton) events.Ha scheduler.Event_SUBSCRIBED: eventrules.New( logger, controller.TrackSubscription(fidStore, viper.GetDuration("mesosFailoverTimeout")), + eventrules.New().HandleF(reconciliationCall(state)), ), scheduler.Event_MESSAGE: eventrules.HandleF(incomingMessageHandler(state, fidStore)), }.Otherwise(logger.HandleEvent)) @@ -170,6 +171,16 @@ func notifyStateMachine(state *internalState) events.HandlerFunc { } } +// Implicit Reconciliation Call that sends an empty list of tasks and the master responds +// with the latest state for all currently known non-terminal tasks. +func reconciliationCall(state *internalState) events.HandlerFunc { + return func(ctx context.Context, e *scheduler.Event) error { + reconcileCall := calls.Reconcile(calls.ReconcileTasks(nil)) + calls.CallNoData(ctx, state.cli, reconcileCall) + return nil + } +} + // Update metrics when we receive an offer func trackOffersReceived(state *internalState) eventrules.Rule { return func(ctx context.Context, e *scheduler.Event, err error, chain eventrules.Chain) (context.Context, *scheduler.Event, error) { @@ -803,8 +814,15 @@ func statusUpdate(state *internalState) events.HandlerFunc { Info("task inactive exception") } - // Enqueue task state update - go state.taskman.UpdateTaskStatus(&s) + // This will check if the task update is from a reconciliation and will kill it with a mesos call. + // Reconcilation tasks are not part of the taskman.roster + if s.GetReason().String() == "REASON_RECONCILIATION" { + killCall := calls.Kill(s.TaskID.GetValue(), s.AgentID.GetValue()) + calls.CallNoData(ctx, state.cli, killCall) + } else { + // Enqueue task state update + go state.taskman.UpdateTaskStatus(&s) + } return nil } From 94e923c456df66c4ffed21b8795efbdd716b3dd4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 10 Feb 2020 10:04:32 +0100 Subject: [PATCH 0079/2352] [core]: respect alphabetical order --- core/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config.go b/core/config.go index 685cf44e7..202831f7f 100644 --- a/core/config.go +++ b/core/config.go @@ -48,9 +48,9 @@ func setDefaults() error { } exeDir := filepath.Dir(exe) - viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD + viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows") viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) From a188767e76adeec056747701ed1cdb944c61b68f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 3 Feb 2020 16:23:18 +0100 Subject: [PATCH 0080/2352] [core+coconut] Introduce global default branch for repos --- coconut/cmd/repo_default_branch.go | 45 + coconut/control/control.go | 38 +- coconut/protos/o2control.pb.go | 3203 +++++++++++++++------------- core/config.go | 1 + core/confsys/service.go | 25 +- core/protos/o2control.pb.go | 3203 +++++++++++++++------------- core/protos/o2control.proto | 12 + core/repos/repo.go | 28 +- core/repos/repomanager.go | 38 + core/server.go | 34 +- executor/protos/occ.pb.go | 415 ++-- 11 files changed, 3726 insertions(+), 3316 deletions(-) create mode 100644 coconut/cmd/repo_default_branch.go diff --git a/coconut/cmd/repo_default_branch.go b/coconut/cmd/repo_default_branch.go new file mode 100644 index 000000000..16e90d2c9 --- /dev/null +++ b/coconut/cmd/repo_default_branch.go @@ -0,0 +1,45 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + + "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" +) + +// repoRemoveCmd represents the repository remove command +var repoDefaultBranchCmd = &cobra.Command{ + Use: "default-branch", + Short: "set default global and per-repository branch", + Long: fmt.Sprintf(`The repository default-branch command sets the global default +repository branch as well as the per-repository default branch.`), + Run: control.WrapCall(control.SetDefaultBranch), +} + +func init() { + repoCmd.AddCommand(repoDefaultBranchCmd) +} diff --git a/coconut/control/control.go b/coconut/control/control.go index 636b98393..acd165a0c 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -622,17 +622,17 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "No repositories found.") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "repository", "default"}) + table.SetHeader([]string{"id", "repository", "default branch", "default"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlueColor} - table.SetHeaderColor(fg, fg, fg) + table.SetHeaderColor(fg, fg, fg, fg) for i, root := range roots { defaultTick := "" if root.GetDefault() { defaultTick = blue("YES") } - table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick}) + table.Append([]string{strconv.Itoa(i), root.GetName(), root.GetDefaultBranch(), defaultTick}) } fmt.Fprintf(o, "Git repositories used as configuration sources:\n\n") table.Render() @@ -719,7 +719,7 @@ func RefreshRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comman // It also updates the backend (consul or file) which holds a record for the default repository // which is persistent across core executions. func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { - if len(args) != 1 { + if len(args) < 1 && len(args) > 2 { err := errors.New(fmt.Sprintf("accepts 1 arg, received %d", len(args))) return err } @@ -738,5 +738,35 @@ func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comm fmt.Fprintln(o, "Default repository update succesfully") + return nil +} + + +// SetDefaultBranch selects the default repository branch. +// This can be done on the global or on the repository level. +func SetDefaultBranch(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { + if len(args) == 1 { // Set global default + _, err := rpc.SetGlobalDefaultBranch(cxt, &pb.SetGlobalDefaultBranchRequest{Branch: args[0]}, grpc.EmptyCallOption{}) + if err != nil { + fmt.Fprintln(o, "Operation failed.") + return err + } + } else if len(args) == 2 { // Set per-repo default + index, err := strconv.ParseInt(args[0], 10, 32) + if err != nil { + fmt.Fprintln(o, "Wrong argument; should be repository's index") + return err + } + + _, err = rpc.SetRepoDefaultBranch(cxt, &pb.SetRepoDefaultBranchRequest{Index: int32(index), Branch: args[1]}, grpc.EmptyCallOption{}) + if err != nil { + fmt.Fprintln(o, "Operation failed.") + return err + } + } else { + err := errors.New(fmt.Sprintf("expects 1 or 2 args, received %d", len(args))) + return err + } + return nil } \ No newline at end of file diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 828244624..4d75bb919 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StatusUpdate_Level int32 @@ -142,7 +139,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -184,7 +181,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -225,7 +222,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -282,7 +279,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -308,7 +305,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,13 +331,61 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ +// XXX_OneofFuncs is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } +func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) + } + return nil +} + +func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*StatusUpdate) + switch tag { + case 2: // Event.mesosHeartbeat + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Event_MesosHeartbeat) + err := b.DecodeMessage(msg) + m.Event = &StatusUpdate_MesosHeartbeat{msg} + return true, err + default: + return false, nil + } +} + +func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + s := proto.Size(x.MesosHeartbeat) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -364,7 +409,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -409,7 +454,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -497,7 +542,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -587,7 +632,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -633,7 +678,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -675,7 +720,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -716,7 +761,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -775,7 +820,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -857,7 +902,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -904,7 +949,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -951,7 +996,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -999,7 +1044,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1054,7 +1099,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1110,7 +1155,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1173,7 +1218,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1235,7 +1280,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1291,7 +1336,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1353,7 +1398,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1407,7 +1452,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1463,7 +1508,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1555,7 +1600,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1622,7 +1667,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1662,7 +1707,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1709,7 +1754,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1756,7 +1801,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1804,7 +1849,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1862,7 +1907,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1939,7 +1984,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2006,7 +2051,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2095,7 +2140,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2143,7 +2188,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2201,7 +2246,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2260,7 +2305,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2342,7 +2387,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2392,7 +2437,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2462,7 +2507,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2523,7 +2568,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2569,7 +2614,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2591,6 +2636,7 @@ var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2610,7 +2656,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2643,6 +2689,13 @@ func (m *RepoInfo) GetDefault() bool { return false } +func (m *RepoInfo) GetDefaultBranch() string { + if m != nil { + return m.DefaultBranch + } + return "" +} + type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2664,7 +2717,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2711,7 +2764,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2758,7 +2811,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2805,7 +2858,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2852,7 +2905,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2899,7 +2952,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2925,6 +2978,108 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } +type SetGlobalDefaultBranchRequest struct { + Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultBranchRequest{} } +func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} +func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} +} +func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetGlobalDefaultBranchRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetGlobalDefaultBranchRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultBranchRequest.Merge(m, src) +} +func (m *SetGlobalDefaultBranchRequest) XXX_Size() int { + return m.Size() +} +func (m *SetGlobalDefaultBranchRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultBranchRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetGlobalDefaultBranchRequest proto.InternalMessageInfo + +func (m *SetGlobalDefaultBranchRequest) GetBranch() string { + if m != nil { + return m.Branch + } + return "" +} + +type SetRepoDefaultBranchRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranchRequest{} } +func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultBranchRequest) ProtoMessage() {} +func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} +} +func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultBranchRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetRepoDefaultBranchRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultBranchRequest.Merge(m, src) +} +func (m *SetRepoDefaultBranchRequest) XXX_Size() int { + return m.Size() +} +func (m *SetRepoDefaultBranchRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultBranchRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetRepoDefaultBranchRequest proto.InternalMessageInfo + +func (m *SetRepoDefaultBranchRequest) GetIndex() int32 { + if m != nil { + return m.Index + } + return 0 +} + +func (m *SetRepoDefaultBranchRequest) GetBranch() string { + if m != nil { + return m.Branch + } + return "" +} + type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2935,7 +3090,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2945,7 +3100,7 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3017,150 +3172,157 @@ func init() { proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") + proto.RegisterType((*SetGlobalDefaultBranchRequest)(nil), "o2control.SetGlobalDefaultBranchRequest") + proto.RegisterType((*SetRepoDefaultBranchRequest)(nil), "o2control.SetRepoDefaultBranchRequest") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2185 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x6f, 0x1b, 0x4b, - 0x15, 0xcf, 0x3a, 0x76, 0x6c, 0x1f, 0x27, 0x8e, 0x33, 0x49, 0x93, 0x8d, 0x6f, 0x49, 0x73, 0x87, - 0xaa, 0x37, 0xbd, 0xf7, 0x92, 0x42, 0x2e, 0x82, 0x52, 0x2e, 0x94, 0xc4, 0x71, 0x53, 0x43, 0x13, - 0x57, 0x1b, 0xb7, 0x15, 0x57, 0x42, 0x65, 0xe3, 0x1d, 0xc7, 0x6e, 0xd6, 0x3b, 0x66, 0x77, 0xec, - 0x34, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x0f, 0xbc, 0xf0, 0x8a, 0x10, 0x8f, 0x7c, 0x0f, 0x5e, 0x10, - 0xf0, 0x0d, 0x50, 0x91, 0x78, 0x42, 0x7c, 0x06, 0x34, 0x7f, 0x76, 0x77, 0x76, 0xbd, 0x4e, 0x22, - 0xf1, 0xe6, 0x73, 0xe6, 0x77, 0xce, 0x9c, 0x7f, 0x73, 0xce, 0xcc, 0x1a, 0xd6, 0x47, 0x3e, 0x65, - 0x34, 0x78, 0x44, 0xf7, 0xba, 0xd4, 0x63, 0x3e, 0x75, 0x77, 0x05, 0x03, 0x95, 0x23, 0x06, 0x5e, - 0x87, 0xb5, 0xe6, 0x84, 0x78, 0xec, 0xed, 0x31, 0x09, 0x68, 0xf0, 0x9c, 0xd8, 0x3e, 0x3b, 0x23, - 0x36, 0xc3, 0xcb, 0xb0, 0x74, 0xca, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0x8b, 0x31, 0x09, 0x18, 0x3e, - 0x83, 0x4a, 0xc8, 0x18, 0xb9, 0x57, 0x68, 0x0d, 0x0a, 0x01, 0xb3, 0x19, 0x31, 0x8d, 0x6d, 0x63, - 0xa7, 0x6c, 0x49, 0x02, 0xfd, 0x00, 0x96, 0x02, 0x01, 0x7a, 0x35, 0x72, 0x6c, 0x46, 0x02, 0x33, - 0xb7, 0x3d, 0xbf, 0x53, 0xd9, 0xdb, 0xd8, 0x8d, 0x2d, 0x38, 0xd5, 0xd6, 0xad, 0x24, 0x1a, 0xff, - 0xd5, 0x80, 0x45, 0x7d, 0x1d, 0x7d, 0x01, 0x05, 0x97, 0x4c, 0x88, 0x2b, 0x76, 0xa9, 0xee, 0x7d, - 0x6d, 0x86, 0x9e, 0xdd, 0x17, 0x1c, 0x64, 0x49, 0x2c, 0x6a, 0x41, 0x75, 0x98, 0x70, 0xc6, 0xcc, - 0x6d, 0x1b, 0x3b, 0x95, 0xbd, 0x7b, 0x9a, 0x74, 0x96, 0xcf, 0xcf, 0xe7, 0xac, 0x94, 0x20, 0xfe, - 0x36, 0x14, 0x84, 0x6a, 0x54, 0x86, 0xc2, 0x61, 0xf3, 0xe0, 0xd5, 0x51, 0x6d, 0x0e, 0x95, 0x20, - 0xdf, 0x3a, 0x79, 0xd6, 0xae, 0x19, 0xa8, 0x02, 0xc5, 0x37, 0xfb, 0xd6, 0x49, 0xeb, 0xe4, 0xa8, - 0x96, 0xe3, 0x88, 0xa6, 0x65, 0xb5, 0xad, 0xda, 0xfc, 0x41, 0x11, 0x0a, 0x42, 0x3f, 0xde, 0x84, - 0x8d, 0x23, 0xc2, 0x9e, 0xf9, 0xf6, 0x90, 0x5c, 0x52, 0xff, 0xa2, 0xe5, 0xf5, 0x68, 0x18, 0xce, - 0x3f, 0x1a, 0x50, 0x7c, 0x4d, 0xfc, 0x60, 0x40, 0x3d, 0x1e, 0xcb, 0xa1, 0xfd, 0x8e, 0xfa, 0xc2, - 0xcb, 0x82, 0x25, 0x09, 0xc1, 0x1d, 0x78, 0xd4, 0x17, 0xd6, 0x73, 0x2e, 0x27, 0x38, 0x77, 0x64, - 0xb3, 0x6e, 0xdf, 0x9c, 0x97, 0x5c, 0x41, 0x70, 0xee, 0xd9, 0x78, 0xe0, 0x3a, 0x66, 0x5e, 0x66, - 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb1, 0x87, 0xc4, 0x2c, 0x88, - 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x88, 0x53, 0xe6, 0x9b, 0x0b, 0x02, 0xa0, 0x71, 0xf0, - 0x6f, 0x73, 0x70, 0x67, 0xda, 0x03, 0x9e, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, 0xa3, 0xaa, 0x40, - 0x67, 0xa1, 0xcf, 0x61, 0x85, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, 0xd0, 0xa0, 0x63, - 0x8f, 0x29, 0x5f, 0xa6, 0x17, 0xb8, 0x25, 0xcc, 0x0e, 0x2e, 0x14, 0x4c, 0x3a, 0xa7, 0x71, 0xe2, - 0x7a, 0xcb, 0xeb, 0xf5, 0xb6, 0x05, 0xd0, 0xa7, 0x41, 0xa8, 0xbc, 0x20, 0xa5, 0x62, 0x0e, 0xc2, - 0xb0, 0x38, 0xf0, 0x02, 0x66, 0x7b, 0x5d, 0x22, 0x42, 0x20, 0x3d, 0x4c, 0xf0, 0xd0, 0xe7, 0x50, - 0x54, 0x1e, 0x9b, 0x45, 0x51, 0x27, 0x48, 0xab, 0x13, 0x95, 0x22, 0x2b, 0x84, 0xe0, 0x87, 0xb0, - 0xdc, 0x21, 0xb6, 0xef, 0xd0, 0x4b, 0x4f, 0xa5, 0x12, 0xad, 0xc3, 0x82, 0x4f, 0xec, 0x80, 0x7a, - 0x2a, 0x0a, 0x8a, 0xe2, 0x47, 0x28, 0x86, 0x8e, 0xdc, 0x2b, 0x6c, 0xc2, 0xfa, 0x11, 0x61, 0x4d, - 0xcd, 0xf7, 0xb0, 0x1a, 0xde, 0xc3, 0xda, 0xd4, 0xca, 0xed, 0xa2, 0xfc, 0x43, 0x58, 0xd4, 0x83, - 0xa9, 0x0e, 0x5c, 0x5d, 0x2f, 0xf5, 0x78, 0x59, 0xa4, 0x2f, 0x81, 0xc7, 0xff, 0x30, 0x60, 0x39, - 0x85, 0x40, 0x55, 0xc8, 0x0d, 0xc2, 0xcd, 0x72, 0x03, 0x51, 0x47, 0x5d, 0x9f, 0xd8, 0x8c, 0x38, - 0x6f, 0xfa, 0xc4, 0x13, 0x39, 0x2c, 0x5b, 0x3a, 0x2b, 0xce, 0xce, 0xbc, 0x9e, 0x9d, 0x5d, 0x28, - 0x88, 0x0c, 0x9a, 0x79, 0x61, 0x94, 0xa9, 0x9f, 0xde, 0x3e, 0xf5, 0x59, 0xc7, 0x0e, 0x64, 0x45, - 0x49, 0x18, 0xaa, 0x43, 0xc9, 0xa7, 0x94, 0x59, 0xd4, 0x0d, 0x8b, 0x35, 0xa2, 0xd1, 0xa7, 0x50, - 0xeb, 0x8e, 0x7d, 0x9f, 0x78, 0xcc, 0x1a, 0x7b, 0x27, 0xe3, 0xe1, 0x19, 0x91, 0xf5, 0xba, 0x64, - 0x4d, 0xf1, 0x71, 0x03, 0xee, 0x9c, 0x90, 0x4b, 0xcd, 0xab, 0x30, 0x53, 0x9f, 0x42, 0x8d, 0x87, - 0xad, 0xe7, 0xd2, 0xcb, 0x0e, 0x19, 0x8e, 0xdc, 0xb8, 0x7f, 0x4d, 0xf1, 0xf1, 0x29, 0xac, 0xa6, - 0x95, 0xf0, 0x8c, 0x7c, 0x09, 0x15, 0x2d, 0x7e, 0x42, 0xfa, 0xfa, 0x70, 0xeb, 0x70, 0xfc, 0x89, - 0x38, 0x4e, 0x19, 0x96, 0xa5, 0x42, 0x8e, 0x7f, 0x65, 0xc0, 0x6a, 0x1a, 0xf9, 0x7f, 0x6f, 0x8f, - 0x1e, 0x41, 0x29, 0xf4, 0x53, 0xf5, 0xc4, 0x55, 0x4d, 0x94, 0xc7, 0x59, 0xc8, 0x44, 0x20, 0xfc, - 0x37, 0x03, 0x36, 0x1b, 0x72, 0xf9, 0x66, 0xa3, 0xd1, 0x53, 0xc8, 0xb3, 0xab, 0x11, 0x11, 0xaa, - 0xab, 0x7b, 0x9f, 0x69, 0xaa, 0x67, 0xea, 0xd8, 0x6d, 0x8f, 0xb8, 0x88, 0x25, 0x04, 0xb1, 0x0d, - 0x0b, 0x92, 0xe6, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0x59, 0x9b, 0x43, 0x08, 0xaa, 0xa7, 0x9d, 0x7d, - 0xab, 0xf3, 0x76, 0xbf, 0xd1, 0x69, 0xbd, 0x6e, 0x75, 0x7e, 0x5a, 0x33, 0xd0, 0x0a, 0x2c, 0x9d, - 0x76, 0xda, 0x2f, 0x63, 0x56, 0x0e, 0x2d, 0x41, 0xb9, 0xd1, 0x3e, 0x79, 0xd6, 0x3a, 0x7a, 0x65, - 0x35, 0x6b, 0xf3, 0xbc, 0x1b, 0x5b, 0xcd, 0xd3, 0x66, 0xa7, 0x96, 0x47, 0x8b, 0x50, 0x3a, 0x6a, - 0xbf, 0x95, 0xbd, 0xb9, 0x80, 0x2f, 0x60, 0x23, 0xcb, 0x18, 0x1e, 0xdb, 0xb4, 0x3b, 0x51, 0x51, - 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x19, 0x85, 0xf8, 0x3b, 0x03, 0xcc, 0x63, 0xea, 0x0c, - 0x7a, 0x57, 0xb7, 0x8a, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, 0x78, 0x8e, 0xef, 0x65, - 0x67, 0xb6, 0x1d, 0xe2, 0x2c, 0x4d, 0x04, 0x3d, 0x80, 0xaa, 0x4f, 0xba, 0xd4, 0xeb, 0x0d, 0xce, - 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0x61, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0x1f, 0x0c, 0x58, 0xcb, 0x52, - 0x86, 0x9e, 0xa8, 0xfc, 0xc9, 0x61, 0xfb, 0xe0, 0x86, 0xbd, 0x13, 0xa9, 0x93, 0x67, 0xd7, 0x95, - 0x5d, 0x36, 0x17, 0x9e, 0x5d, 0x49, 0xe3, 0x6f, 0x65, 0xa4, 0x75, 0x19, 0x2a, 0x56, 0xf3, 0xb8, - 0xfd, 0xba, 0xf9, 0xd6, 0x6a, 0xbf, 0xe0, 0x19, 0x5b, 0x84, 0xd2, 0xfe, 0xe1, 0xa1, 0xa4, 0xf2, - 0xf8, 0xd7, 0x06, 0xac, 0x67, 0x44, 0x8e, 0xa7, 0xe9, 0x27, 0x50, 0xeb, 0xd9, 0x03, 0x97, 0x38, - 0xed, 0x38, 0x5a, 0xc6, 0xed, 0xa2, 0x35, 0x25, 0xa8, 0x92, 0x90, 0x9b, 0xce, 0xb9, 0xde, 0xc8, - 0x70, 0x0b, 0x36, 0x0f, 0x49, 0xc0, 0x7c, 0x7a, 0x9b, 0x3c, 0xde, 0x85, 0xf2, 0x05, 0x21, 0xa3, - 0x8e, 0xe8, 0x7c, 0x39, 0x91, 0x81, 0x98, 0x81, 0x09, 0x6c, 0x64, 0xa9, 0xe2, 0x8e, 0xfd, 0x18, - 0x56, 0xba, 0x2e, 0xb1, 0xbd, 0xb1, 0x84, 0x0a, 0xa6, 0x3a, 0xe1, 0x77, 0xf5, 0xb3, 0x94, 0xc6, - 0x58, 0xd3, 0x62, 0xf8, 0xdf, 0x06, 0x2c, 0x25, 0x7a, 0x2c, 0x42, 0x90, 0xf7, 0x78, 0x72, 0xa4, - 0xa1, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xd9, 0xa9, 0x28, 0xce, 0xe7, 0x1d, - 0xb9, 0xe5, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, 0x51, 0x2b, - 0xe8, 0x27, 0xe5, 0x2e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, 0x09, 0x55, - 0x87, 0x8c, 0x5c, 0x7a, 0x15, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, 0x30, 0x01, - 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, 0x8e, 0x68, - 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, 0xfc, 0xc8, - 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x9e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, 0xc6, 0xc1, - 0x2b, 0xb0, 0x7c, 0x44, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x61, 0x29, 0x66, 0xf1, 0xfc, 0x46, - 0xe3, 0xd0, 0xb8, 0xd5, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, 0x8b, 0xa1, - 0xe7, 0x05, 0x7f, 0x17, 0x16, 0x23, 0x24, 0xdf, 0xe9, 0x13, 0xc8, 0xf3, 0x15, 0x55, 0x3c, 0xab, - 0xa9, 0x88, 0x8a, 0x3d, 0x04, 0x00, 0x37, 0x61, 0x89, 0x73, 0x1a, 0x3c, 0x2b, 0x33, 0xab, 0x84, - 0x8f, 0x7f, 0x29, 0x7e, 0x4c, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, 0x06, 0x1d, - 0x0e, 0x6d, 0xcf, 0x11, 0x4a, 0x6a, 0x30, 0x4f, 0xbc, 0x89, 0x70, 0xb3, 0x6c, 0xf1, 0x9f, 0xa2, - 0x40, 0xfa, 0xc4, 0x75, 0x55, 0x9d, 0x49, 0x82, 0x73, 0x27, 0xb6, 0x3b, 0x8e, 0x0e, 0x9b, 0x20, - 0x78, 0xd9, 0xd8, 0xfe, 0xf9, 0x58, 0x5e, 0x67, 0xf2, 0x42, 0x47, 0xcc, 0xe0, 0x06, 0x8e, 0x03, - 0xe2, 0xab, 0x4a, 0x13, 0xbf, 0xf1, 0x31, 0x54, 0x1a, 0x7d, 0xdb, 0xf3, 0x88, 0x3b, 0xd3, 0x07, - 0xa4, 0x8d, 0xa6, 0xb2, 0x6a, 0x59, 0x22, 0x9a, 0xfe, 0x39, 0x61, 0x71, 0x95, 0x73, 0x0a, 0xff, - 0x27, 0x07, 0xa5, 0xe8, 0xd8, 0x7c, 0x07, 0xca, 0x01, 0x4f, 0x8e, 0xa8, 0x50, 0x19, 0xcf, 0xd9, - 0x89, 0x8b, 0xa1, 0x5c, 0xae, 0x1b, 0x46, 0x55, 0xcd, 0x5a, 0x33, 0x95, 0x87, 0x28, 0xea, 0x56, - 0x0c, 0x45, 0x3f, 0x82, 0xe5, 0x81, 0x77, 0x46, 0xc7, 0x9e, 0xa3, 0x5c, 0x0a, 0xcc, 0x79, 0x51, - 0x2e, 0xeb, 0x7a, 0x0b, 0x88, 0xbd, 0xb5, 0xd2, 0x70, 0x74, 0x00, 0x35, 0x3a, 0x66, 0x49, 0x15, - 0xf9, 0x6b, 0x55, 0x4c, 0xe1, 0xd1, 0x63, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, 0xf1, 0x78, - 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x69, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, 0xcd, 0xf3, - 0x4d, 0xbc, 0x49, 0xcb, 0x11, 0x27, 0xbd, 0x6c, 0x49, 0x02, 0x3f, 0x82, 0xd5, 0x64, 0x4b, 0x93, - 0xb5, 0x6e, 0x42, 0x51, 0x56, 0x77, 0xa0, 0x0a, 0x29, 0x24, 0xf1, 0x6f, 0x0c, 0x58, 0x99, 0x6a, - 0x82, 0xe8, 0x09, 0x54, 0x2e, 0x06, 0xae, 0x4b, 0x9c, 0xce, 0xad, 0xce, 0x98, 0x0e, 0x46, 0x5f, - 0xc2, 0xa2, 0x3f, 0xf6, 0xbc, 0x81, 0x77, 0x1e, 0x76, 0xed, 0xeb, 0x85, 0x13, 0x68, 0xdc, 0x10, - 0x67, 0x9f, 0xdf, 0x9e, 0x22, 0xe3, 0x23, 0x4f, 0x0d, 0xcd, 0x53, 0x1e, 0x9b, 0x91, 0xcd, 0xfa, - 0xa7, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0x3f, 0x1b, 0x50, 0x0a, 0x2f, 0x60, 0xb3, 0x7a, - 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, 0xae, 0x48, - 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x08, 0x05, 0x3e, 0xb4, 0x03, - 0x73, 0x41, 0x04, 0x20, 0xf3, 0x72, 0x28, 0x11, 0xf8, 0x89, 0xe8, 0x6e, 0xca, 0x69, 0x1e, 0xff, - 0x48, 0xd6, 0xb8, 0x51, 0xf6, 0x4f, 0x06, 0x7c, 0x74, 0x44, 0xd8, 0x9b, 0xd4, 0x95, 0x3b, 0x8a, - 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6d, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, 0x16, 0xda, - 0x81, 0x65, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, 0xcb, 0x76, - 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, 0x75, 0x3b, - 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0xf1, 0x19, 0xac, 0xa5, 0x6d, 0x0c, 0xd3, 0xc3, 0x8d, - 0x09, 0xd3, 0xc3, 0x7f, 0x8b, 0xba, 0x0f, 0x9f, 0x14, 0x2a, 0xb7, 0x21, 0x2d, 0xee, 0x46, 0xca, - 0x2c, 0x95, 0xa5, 0x88, 0xc6, 0xef, 0x60, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xc7, 0xb0, 0x92, 0x7e, - 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0x8b, 0x41, 0xc0, 0x6f, - 0x1b, 0x34, 0x9a, 0x52, 0x8f, 0xa1, 0xc4, 0xe9, 0x99, 0x65, 0x67, 0x42, 0xd1, 0x21, 0x3d, 0x7b, - 0xec, 0x32, 0xd5, 0xbb, 0x43, 0x12, 0x7f, 0x1f, 0xaa, 0x9a, 0xb6, 0xb0, 0x04, 0x38, 0x95, 0x55, - 0x02, 0x6a, 0x0f, 0x4b, 0x22, 0xf0, 0x7d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0x49, 0xcf, 0xd8, - 0x1c, 0x3f, 0x84, 0x15, 0x8b, 0x0c, 0xe9, 0x84, 0xe8, 0xc0, 0x35, 0x28, 0x0c, 0x3c, 0x87, 0xbc, - 0x0f, 0xbf, 0x96, 0x08, 0x02, 0x7f, 0x0f, 0x96, 0x75, 0x28, 0x37, 0xe7, 0x01, 0x54, 0x3d, 0x72, - 0x79, 0x28, 0xcd, 0xb5, 0xe2, 0x84, 0xa5, 0xb8, 0xf8, 0x33, 0x58, 0xb5, 0x48, 0xcf, 0x27, 0x41, - 0x5f, 0x8f, 0xcc, 0x8c, 0x7d, 0xbe, 0x01, 0x77, 0x4e, 0x09, 0xd3, 0xc4, 0xaf, 0x87, 0x17, 0xa1, - 0xd0, 0x1c, 0x8e, 0xd8, 0xd5, 0xde, 0x7f, 0x2b, 0x50, 0x54, 0x0f, 0x0f, 0xd4, 0x80, 0x4a, 0xc7, - 0xb7, 0xbb, 0x17, 0xf2, 0x13, 0x16, 0x32, 0xa7, 0xbe, 0x6a, 0x29, 0x9d, 0xf5, 0xf5, 0x8c, 0x15, - 0x7e, 0xbb, 0x9b, 0xfb, 0xa6, 0x81, 0xbe, 0x82, 0x5a, 0xfa, 0xcb, 0x0c, 0xc2, 0x1a, 0x7e, 0xc6, - 0x87, 0xa7, 0xfa, 0xf6, 0xb5, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0x72, 0x81, 0xf4, 0xc7, - 0x65, 0xea, 0xcb, 0x47, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0xde, 0x88, 0xae, 0xa8, 0x7f, 0xd2, 0x40, - 0x1f, 0x27, 0xb7, 0xce, 0xf8, 0x10, 0x52, 0xbf, 0x77, 0x1d, 0x44, 0x2a, 0xee, 0x40, 0x35, 0xf9, - 0x30, 0x47, 0xba, 0x4b, 0x99, 0x0f, 0xff, 0xfa, 0xd6, 0x35, 0x88, 0x48, 0x6b, 0x72, 0x3f, 0xb4, - 0x3d, 0xd3, 0x94, 0x2c, 0xad, 0x19, 0x8f, 0x75, 0x3c, 0x87, 0x7e, 0x0e, 0x68, 0xfa, 0xb5, 0x89, - 0xee, 0xdf, 0xe6, 0x65, 0x5c, 0xc7, 0x37, 0xa0, 0xe4, 0x0e, 0x3f, 0x83, 0x95, 0xa9, 0x77, 0x12, - 0xfa, 0xba, 0x26, 0x3a, 0xeb, 0xfd, 0x59, 0xff, 0xf8, 0x7a, 0x50, 0xe4, 0xc0, 0xf4, 0x73, 0x25, - 0xe1, 0xc0, 0xcc, 0x87, 0x51, 0xc2, 0x81, 0x19, 0x6f, 0x1e, 0x59, 0x6b, 0xe1, 0x35, 0x39, 0x51, - 0x6b, 0xa9, 0xeb, 0x74, 0xa2, 0xd6, 0x12, 0xf7, 0x6a, 0x3c, 0x87, 0x9e, 0x42, 0x51, 0xb1, 0xd0, - 0xe6, 0x34, 0x2c, 0xd4, 0xb0, 0x91, 0xb5, 0x24, 0x15, 0x9c, 0xc0, 0xa2, 0x7e, 0xa3, 0x40, 0x5b, - 0x33, 0xdf, 0x5b, 0x52, 0xd5, 0xb5, 0xef, 0xb1, 0xc8, 0x29, 0x31, 0x1d, 0xd3, 0x4e, 0xe9, 0xf7, - 0x84, 0xb4, 0x53, 0xf1, 0x38, 0xc5, 0x73, 0xa8, 0x27, 0xbe, 0x09, 0x4e, 0x4d, 0x06, 0xf4, 0x20, - 0x29, 0x33, 0x6b, 0x8a, 0xd6, 0xef, 0xdf, 0x88, 0x93, 0xfb, 0x34, 0xa1, 0x1c, 0xf5, 0x71, 0xf4, - 0x91, 0x26, 0x94, 0x9e, 0x15, 0xf5, 0xcd, 0xec, 0x45, 0xa9, 0xe6, 0x31, 0x14, 0x55, 0x47, 0x4f, - 0xe4, 0x20, 0xd9, 0xe5, 0xeb, 0x35, 0xfd, 0x89, 0xce, 0x1b, 0x23, 0x9e, 0x43, 0xcf, 0x01, 0xe2, - 0xd6, 0x8d, 0xee, 0x26, 0xa6, 0x46, 0xaa, 0xf9, 0xd7, 0xeb, 0x33, 0x56, 0xc3, 0xb0, 0x2f, 0xea, - 0x9d, 0x3c, 0x91, 0xc6, 0x8c, 0x16, 0x9f, 0x69, 0xcd, 0x33, 0xa8, 0x26, 0x1b, 0x7c, 0xa2, 0x11, - 0x64, 0xf6, 0xfe, 0x2c, 0x3d, 0x07, 0x8f, 0xff, 0xf2, 0x61, 0xcb, 0xf8, 0xfb, 0x87, 0x2d, 0xe3, - 0x9f, 0x1f, 0xb6, 0x8c, 0xdf, 0xff, 0x6b, 0x6b, 0x0e, 0x70, 0xb7, 0xbf, 0xdb, 0x25, 0xbe, 0xb7, - 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8c, 0x3f, 0xea, 0x06, 0xc4, 0x9f, 0x10, - 0xff, 0xab, 0xdc, 0xe8, 0xec, 0x6c, 0x41, 0xfc, 0x49, 0xf3, 0xc5, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x98, 0x74, 0xa0, 0x5d, 0xbe, 0x19, 0x00, 0x00, + // 2262 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, + 0x15, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x92, 0x75, 0xbc, 0x4d, + 0x2a, 0xeb, 0xec, 0x2e, 0x0e, 0x78, 0x29, 0x36, 0x84, 0x85, 0xe0, 0x3f, 0x8a, 0x63, 0x36, 0xb6, + 0x52, 0x23, 0x25, 0x29, 0xb6, 0x0a, 0xc2, 0x48, 0xd3, 0xb2, 0xb4, 0x1e, 0x4d, 0x8b, 0x99, 0x96, + 0x12, 0x1f, 0xb8, 0x71, 0xa3, 0x28, 0x0e, 0x5c, 0x28, 0x6e, 0x14, 0xc5, 0x91, 0xef, 0xc1, 0x85, + 0x02, 0xbe, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x21, 0xa8, 0xfe, 0x33, 0x33, 0x3d, 0xa3, 0x91, 0xec, + 0x2a, 0x6e, 0x7a, 0xaf, 0x7f, 0xef, 0xf5, 0xfb, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x63, 0xe4, 0x53, + 0x46, 0x83, 0x87, 0x74, 0xaf, 0x4b, 0x3d, 0xe6, 0x53, 0x77, 0x57, 0x30, 0x50, 0x39, 0x62, 0xe0, + 0x0d, 0x58, 0x6f, 0x4c, 0x88, 0xc7, 0xde, 0x9c, 0x92, 0x80, 0x06, 0xcf, 0x88, 0xed, 0xb3, 0x0e, + 0xb1, 0x19, 0x5e, 0x81, 0xe5, 0x16, 0xb3, 0xd9, 0x38, 0xb0, 0xc8, 0x2f, 0xc6, 0x24, 0x60, 0xb8, + 0x03, 0x95, 0x90, 0x31, 0x72, 0x2f, 0xd1, 0x3a, 0x14, 0x02, 0x66, 0x33, 0x62, 0x1a, 0xdb, 0xc6, + 0x4e, 0xd9, 0x92, 0x04, 0xfa, 0x01, 0x2c, 0x07, 0x02, 0xf4, 0x72, 0xe4, 0xd8, 0x8c, 0x04, 0x66, + 0x6e, 0x7b, 0x71, 0xa7, 0xb2, 0x77, 0x6b, 0x37, 0xb6, 0xa0, 0xa5, 0xad, 0x5b, 0x49, 0x34, 0xfe, + 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x0c, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0xec, 0x52, 0xdd, 0xfb, + 0x60, 0x86, 0x9e, 0xdd, 0xe7, 0x1c, 0x64, 0x49, 0x2c, 0x3a, 0x81, 0xea, 0x30, 0xe1, 0x8c, 0x99, + 0xdb, 0x36, 0x76, 0x2a, 0x7b, 0x77, 0x35, 0xe9, 0x2c, 0x9f, 0x9f, 0x2d, 0x58, 0x29, 0x41, 0xfc, + 0x1d, 0x28, 0x08, 0xd5, 0xa8, 0x0c, 0x85, 0xa3, 0xc6, 0xc1, 0xcb, 0xe3, 0xda, 0x02, 0x2a, 0x41, + 0xfe, 0xe4, 0xec, 0x69, 0xb3, 0x66, 0xa0, 0x0a, 0x14, 0x5f, 0xef, 0x5b, 0x67, 0x27, 0x67, 0xc7, + 0xb5, 0x1c, 0x47, 0x34, 0x2c, 0xab, 0x69, 0xd5, 0x16, 0x0f, 0x8a, 0x50, 0x10, 0xfa, 0xf1, 0x26, + 0xdc, 0x3a, 0x26, 0xec, 0xa9, 0x6f, 0x0f, 0xc9, 0x5b, 0xea, 0x5f, 0x9c, 0x78, 0x3d, 0x1a, 0x86, + 0xf3, 0x4f, 0x06, 0x14, 0x5f, 0x11, 0x3f, 0x18, 0x50, 0x8f, 0xc7, 0x72, 0x68, 0x7f, 0x4d, 0x7d, + 0xe1, 0x65, 0xc1, 0x92, 0x84, 0xe0, 0x0e, 0x3c, 0xea, 0x0b, 0xeb, 0x39, 0x97, 0x13, 0x9c, 0x3b, + 0xb2, 0x59, 0xb7, 0x6f, 0x2e, 0x4a, 0xae, 0x20, 0x38, 0xb7, 0x33, 0x1e, 0xb8, 0x8e, 0x99, 0x97, + 0xd9, 0x10, 0x04, 0xda, 0x86, 0xca, 0xc8, 0xa7, 0xce, 0xb8, 0xcb, 0xce, 0xec, 0x21, 0x31, 0x0b, + 0x62, 0x4d, 0x67, 0xa1, 0x2d, 0x80, 0x89, 0x34, 0xa2, 0xc5, 0x7c, 0xf3, 0x86, 0x00, 0x68, 0x1c, + 0xfc, 0xdb, 0x1c, 0xdc, 0x9c, 0xf6, 0x80, 0xe7, 0x7f, 0x1b, 0x2a, 0xbd, 0x88, 0xeb, 0xa8, 0x2a, + 0xd0, 0x59, 0xe8, 0x53, 0x58, 0x25, 0xde, 0x64, 0xe0, 0x53, 0x6f, 0x48, 0x3c, 0x16, 0x1c, 0xd2, + 0xb1, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0xdc, 0x12, 0x66, 0x07, 0x17, 0x0a, 0x26, 0x9d, 0xd3, 0x38, + 0x71, 0xbd, 0xe5, 0xf5, 0x7a, 0xdb, 0x02, 0xe8, 0xd3, 0x20, 0x54, 0x5e, 0x90, 0x52, 0x31, 0x07, + 0x61, 0x58, 0x1a, 0x78, 0x01, 0xb3, 0xbd, 0x2e, 0x11, 0x21, 0x90, 0x1e, 0x26, 0x78, 0xe8, 0x53, + 0x28, 0x2a, 0x8f, 0xcd, 0xa2, 0xa8, 0x13, 0xa4, 0xd5, 0x89, 0x4a, 0x91, 0x15, 0x42, 0xf0, 0x03, + 0x58, 0x69, 0x13, 0xdb, 0x77, 0xe8, 0x5b, 0x4f, 0xa5, 0x12, 0x6d, 0xc0, 0x0d, 0x9f, 0xd8, 0x01, + 0xf5, 0x54, 0x14, 0x14, 0xc5, 0x8f, 0x50, 0x0c, 0x1d, 0xb9, 0x97, 0xd8, 0x84, 0x8d, 0x63, 0xc2, + 0x1a, 0x9a, 0xef, 0x61, 0x35, 0xbc, 0x83, 0xf5, 0xa9, 0x95, 0xeb, 0x45, 0xf9, 0x87, 0xb0, 0xa4, + 0x07, 0x53, 0x1d, 0xb8, 0xba, 0x5e, 0xea, 0xf1, 0xb2, 0x48, 0x5f, 0x02, 0x8f, 0xff, 0x69, 0xc0, + 0x4a, 0x0a, 0x81, 0xaa, 0x90, 0x1b, 0x84, 0x9b, 0xe5, 0x06, 0xa2, 0x8e, 0xba, 0x3e, 0xb1, 0x19, + 0x71, 0x5e, 0xf7, 0x89, 0x27, 0x72, 0x58, 0xb6, 0x74, 0x56, 0x9c, 0x9d, 0x45, 0x3d, 0x3b, 0xbb, + 0x50, 0x10, 0x19, 0x34, 0xf3, 0xc2, 0x28, 0x53, 0x3f, 0xbd, 0x7d, 0xea, 0xb3, 0xb6, 0x1d, 0xc8, + 0x8a, 0x92, 0x30, 0x54, 0x87, 0x92, 0x4f, 0x29, 0xb3, 0xa8, 0x1b, 0x16, 0x6b, 0x44, 0xa3, 0x8f, + 0xa1, 0xd6, 0x1d, 0xfb, 0x3e, 0xf1, 0x98, 0x35, 0xf6, 0xce, 0xc6, 0xc3, 0x0e, 0x91, 0xf5, 0xba, + 0x6c, 0x4d, 0xf1, 0xf1, 0x21, 0xdc, 0x3c, 0x23, 0x6f, 0x35, 0xaf, 0xc2, 0x4c, 0x7d, 0x0c, 0x35, + 0x1e, 0xb6, 0x9e, 0x4b, 0xdf, 0xb6, 0xc9, 0x70, 0xe4, 0xc6, 0xfd, 0x6b, 0x8a, 0x8f, 0x5b, 0xb0, + 0x96, 0x56, 0xc2, 0x33, 0xf2, 0x05, 0x54, 0xb4, 0xf8, 0x09, 0xe9, 0xf9, 0xe1, 0xd6, 0xe1, 0xf8, + 0x23, 0x71, 0x9c, 0x32, 0x2c, 0x4b, 0x85, 0x1c, 0xff, 0xca, 0x80, 0xb5, 0x34, 0xf2, 0xff, 0xde, + 0x1e, 0x3d, 0x84, 0x52, 0xe8, 0xa7, 0xea, 0x89, 0x6b, 0x9a, 0x28, 0x8f, 0xb3, 0x90, 0x89, 0x40, + 0xf8, 0xef, 0x06, 0x6c, 0x1e, 0xca, 0xe5, 0xab, 0x8d, 0x46, 0x4f, 0x20, 0xcf, 0x2e, 0x47, 0x44, + 0xa8, 0xae, 0xee, 0x7d, 0xa2, 0xa9, 0x9e, 0xa9, 0x63, 0xb7, 0x39, 0xe2, 0x22, 0x96, 0x10, 0xc4, + 0x36, 0xdc, 0x90, 0x34, 0x6f, 0xb2, 0x67, 0xcd, 0xe6, 0x8b, 0xda, 0x02, 0x42, 0x50, 0x6d, 0xb5, + 0xf7, 0xad, 0xf6, 0x9b, 0xfd, 0xc3, 0xf6, 0xc9, 0xab, 0x93, 0xf6, 0x4f, 0x6a, 0x06, 0x5a, 0x85, + 0xe5, 0x56, 0xbb, 0xf9, 0x22, 0x66, 0xe5, 0xd0, 0x32, 0x94, 0x0f, 0x9b, 0x67, 0x4f, 0x4f, 0x8e, + 0x5f, 0x5a, 0x8d, 0xda, 0x22, 0xef, 0xc6, 0x56, 0xa3, 0xd5, 0x68, 0xd7, 0xf2, 0x68, 0x09, 0x4a, + 0xc7, 0xcd, 0x37, 0xb2, 0x37, 0x17, 0xf0, 0x05, 0xdc, 0xca, 0x32, 0x86, 0xc7, 0x36, 0xed, 0x4e, + 0x54, 0xd4, 0x39, 0xbd, 0xa8, 0xb3, 0x0a, 0x71, 0x71, 0x46, 0x21, 0xfe, 0xce, 0x00, 0xf3, 0x94, + 0x3a, 0x83, 0xde, 0xe5, 0xb5, 0xa2, 0x07, 0x74, 0x44, 0x7c, 0x9b, 0x0d, 0xa8, 0x17, 0x9e, 0xe3, + 0xbb, 0xd9, 0x99, 0x6d, 0x86, 0x38, 0x4b, 0x13, 0x41, 0xf7, 0xa1, 0xea, 0x93, 0x2e, 0xf5, 0x7a, + 0x83, 0xf3, 0xb1, 0x4f, 0xf6, 0x5d, 0x57, 0xd8, 0x55, 0xb2, 0x52, 0x5c, 0xfc, 0x47, 0x03, 0xd6, + 0xb3, 0x94, 0xa1, 0xc7, 0x2a, 0x7f, 0x72, 0xd8, 0xde, 0xbf, 0x62, 0xef, 0x44, 0xea, 0xe4, 0xd9, + 0x75, 0x65, 0x97, 0xcd, 0x85, 0x67, 0x57, 0xd2, 0xf8, 0xdb, 0x19, 0x69, 0x5d, 0x81, 0x8a, 0xd5, + 0x38, 0x6d, 0xbe, 0x6a, 0xbc, 0xb1, 0x9a, 0xcf, 0x79, 0xc6, 0x96, 0xa0, 0xb4, 0x7f, 0x74, 0x24, + 0xa9, 0x3c, 0xfe, 0xb5, 0x01, 0x1b, 0x19, 0x91, 0xe3, 0x69, 0xfa, 0x12, 0x6a, 0x3d, 0x7b, 0xe0, + 0x12, 0xa7, 0x19, 0x47, 0xcb, 0xb8, 0x5e, 0xb4, 0xa6, 0x04, 0x55, 0x12, 0x72, 0xd3, 0x39, 0xd7, + 0x1b, 0x19, 0x3e, 0x81, 0xcd, 0x23, 0x12, 0x30, 0x9f, 0x5e, 0x27, 0x8f, 0x77, 0xa0, 0x7c, 0x41, + 0xc8, 0xa8, 0x2d, 0x3a, 0x5f, 0x4e, 0x64, 0x20, 0x66, 0x60, 0x02, 0xb7, 0xb2, 0x54, 0x71, 0xc7, + 0x7e, 0x0c, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x42, 0x05, 0x53, 0x9d, 0xf0, 0x3b, 0xfa, 0x59, + 0x4a, 0x63, 0xac, 0x69, 0x31, 0xfc, 0x1f, 0x03, 0x96, 0x13, 0x3d, 0x16, 0x21, 0xc8, 0x7b, 0x3c, + 0x39, 0xd2, 0x50, 0xf1, 0x9b, 0x4f, 0x2e, 0x97, 0x76, 0x2f, 0x88, 0xa3, 0xec, 0x54, 0x14, 0xe7, + 0xf3, 0x8e, 0x7c, 0xe2, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, + 0x51, 0x2b, 0xe8, 0x27, 0xe5, 0x0e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, + 0x01, 0x55, 0x87, 0x8c, 0x5c, 0x7a, 0x19, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, + 0x28, 0x01, 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, + 0x8e, 0x68, 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, + 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x8e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, + 0xc6, 0xc1, 0xab, 0xb0, 0x72, 0x4c, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x60, 0x39, 0x66, 0xf1, + 0xfc, 0x46, 0xe3, 0xd0, 0xb8, 0xd6, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, + 0x8b, 0xa1, 0xe7, 0x05, 0x7f, 0x0e, 0x4b, 0x11, 0x92, 0xef, 0xf4, 0x11, 0xe4, 0xf9, 0x8a, 0x2a, + 0x9e, 0xb5, 0x54, 0x44, 0xc5, 0x1e, 0x02, 0x80, 0x1b, 0xb0, 0xcc, 0x39, 0x87, 0x3c, 0x2b, 0x33, + 0xab, 0x84, 0x8f, 0x7f, 0x29, 0x7e, 0x4a, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, + 0x43, 0x3a, 0x1c, 0xda, 0x9e, 0x23, 0x94, 0xd4, 0x60, 0x91, 0x78, 0x13, 0xe1, 0x66, 0xd9, 0xe2, + 0x3f, 0x45, 0x81, 0xf4, 0x89, 0xeb, 0xaa, 0x3a, 0x93, 0x04, 0xe7, 0x4e, 0x6c, 0x77, 0x1c, 0x1d, + 0x36, 0x41, 0xf0, 0xb2, 0xb1, 0xfd, 0xf3, 0xb1, 0xbc, 0xce, 0xe4, 0x85, 0x8e, 0x98, 0xc1, 0x0d, + 0x1c, 0x07, 0xc4, 0x57, 0x95, 0x26, 0x7e, 0xe3, 0x53, 0xa8, 0x1c, 0xf6, 0x6d, 0xcf, 0x23, 0xee, + 0x4c, 0x1f, 0x90, 0x36, 0x9a, 0xca, 0xaa, 0x65, 0x89, 0x68, 0xfa, 0xe7, 0x84, 0xc5, 0x55, 0xce, + 0x29, 0xfc, 0xdf, 0x1c, 0x94, 0xa2, 0x63, 0xf3, 0x5d, 0x28, 0x07, 0x3c, 0x39, 0xa2, 0x42, 0x65, + 0x3c, 0x67, 0x27, 0x2e, 0x86, 0x72, 0xb9, 0x6e, 0x18, 0x55, 0x35, 0x6b, 0xcd, 0x54, 0x1e, 0xa2, + 0xa8, 0x5b, 0x31, 0x14, 0xfd, 0x08, 0x56, 0x06, 0x5e, 0x87, 0x8e, 0x3d, 0x47, 0xb9, 0x14, 0x98, + 0x8b, 0xa2, 0x5c, 0x36, 0xf4, 0x16, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x00, 0x6a, 0x74, 0xcc, + 0x92, 0x2a, 0xf2, 0x73, 0x55, 0x4c, 0xe1, 0xd1, 0x23, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, + 0xf1, 0x78, 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x61, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, + 0xcd, 0xf3, 0x4d, 0xbc, 0xc9, 0x89, 0x23, 0x4e, 0x7a, 0xd9, 0x92, 0x04, 0x7e, 0x08, 0x6b, 0xc9, + 0x96, 0x26, 0x6b, 0xdd, 0x84, 0xa2, 0xac, 0xee, 0x40, 0x15, 0x52, 0x48, 0xe2, 0xdf, 0x18, 0xb0, + 0x3a, 0xd5, 0x04, 0xd1, 0x63, 0xa8, 0x5c, 0x0c, 0x5c, 0x97, 0x38, 0xed, 0x6b, 0x9d, 0x31, 0x1d, + 0x8c, 0xbe, 0x80, 0x25, 0x7f, 0xec, 0x79, 0x03, 0xef, 0x3c, 0xec, 0xda, 0xf3, 0x85, 0x13, 0x68, + 0x7c, 0x28, 0xce, 0x3e, 0xbf, 0x3d, 0x45, 0xc6, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x23, + 0x9b, 0xf5, 0x5b, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0xbf, 0x18, 0x50, 0x0a, 0x2f, 0x60, + 0xb3, 0x7a, 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, + 0xae, 0x48, 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x00, 0x05, 0x3e, + 0xb4, 0x03, 0xf3, 0x86, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x63, 0xd1, 0xdd, 0x94, 0xd3, + 0x3c, 0xfe, 0x91, 0xac, 0x71, 0xa5, 0xec, 0x9f, 0x0d, 0xb8, 0x7d, 0x4c, 0xd8, 0xeb, 0xd4, 0x95, + 0x3b, 0x8a, 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6c, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, + 0x16, 0xda, 0x81, 0x15, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, + 0xcb, 0x76, 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, + 0x75, 0xdb, 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0x71, 0x07, 0xd6, 0xd3, 0x36, 0x86, 0xe9, + 0xe1, 0xc6, 0x84, 0xe9, 0xe1, 0xbf, 0x45, 0xdd, 0x87, 0x4f, 0x0a, 0x95, 0xdb, 0x90, 0x16, 0x77, + 0x23, 0x65, 0x96, 0xca, 0x52, 0x44, 0xe3, 0xaf, 0x61, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xa7, 0xb0, + 0x9a, 0x7e, 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0xf3, 0x41, + 0xc0, 0x6f, 0x1b, 0x34, 0x9a, 0x52, 0x3f, 0x83, 0x12, 0xa7, 0x67, 0x96, 0x9d, 0x09, 0x45, 0x87, + 0xf4, 0xec, 0xb1, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x74, 0x0f, 0x96, 0xd5, 0x4f, 0x19, 0x4a, 0xe5, + 0x5a, 0x92, 0x89, 0xbf, 0x0f, 0x55, 0x6d, 0xcf, 0xb0, 0x50, 0x38, 0x95, 0x55, 0x28, 0xca, 0x12, + 0x4b, 0x22, 0xf0, 0x3d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0xa5, 0x91, 0x61, 0x22, 0x7e, 0x00, + 0xab, 0x16, 0x19, 0xd2, 0x09, 0xd1, 0x81, 0xeb, 0x50, 0x18, 0x78, 0x0e, 0x79, 0x17, 0x7e, 0x53, + 0x11, 0x04, 0xfe, 0x1e, 0xac, 0xe8, 0x50, 0x6e, 0xce, 0x7d, 0xa8, 0x7a, 0xe4, 0xed, 0x91, 0x34, + 0xda, 0x8a, 0xd3, 0x9a, 0xe2, 0xe2, 0x4f, 0x60, 0xcd, 0x22, 0x3d, 0x9f, 0x04, 0x7d, 0x3d, 0x7e, + 0x33, 0xf6, 0xf9, 0x26, 0xdc, 0x6c, 0x11, 0xa6, 0x89, 0xcf, 0x87, 0x7f, 0x0e, 0x1f, 0xb4, 0x08, + 0x3b, 0x76, 0x69, 0xc7, 0x76, 0x8f, 0xf4, 0xf0, 0x69, 0x83, 0xbf, 0x23, 0x83, 0xac, 0x06, 0xbf, + 0xa4, 0xf0, 0x97, 0x70, 0xbb, 0x45, 0xc4, 0x06, 0x99, 0x62, 0x99, 0xbb, 0x69, 0xca, 0x72, 0x09, + 0x65, 0x45, 0x28, 0x34, 0x86, 0x23, 0x76, 0xb9, 0xf7, 0x87, 0x65, 0x28, 0xaa, 0x47, 0x12, 0x3a, + 0x84, 0x4a, 0xdb, 0xb7, 0xbb, 0x17, 0xf2, 0x73, 0x1b, 0x32, 0xa7, 0xbe, 0xc0, 0xa9, 0xbd, 0xea, + 0x1b, 0x19, 0x2b, 0xfc, 0x26, 0xba, 0xf0, 0x2d, 0x03, 0x7d, 0x05, 0xb5, 0xf4, 0x57, 0x24, 0x84, + 0x35, 0xfc, 0x8c, 0x8f, 0x64, 0xf5, 0xed, 0xb9, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0xca, + 0x82, 0xf4, 0x87, 0x70, 0xea, 0x2b, 0x4d, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0x5e, 0x8b, 0x0e, 0xae, + 0x7f, 0x7e, 0x41, 0x1f, 0x26, 0xb7, 0xce, 0xf8, 0x68, 0x53, 0xbf, 0x3b, 0x0f, 0x22, 0x15, 0xb7, + 0xa1, 0x9a, 0xfc, 0x88, 0x80, 0x74, 0x97, 0x32, 0x3f, 0x52, 0xd4, 0xb7, 0xe6, 0x20, 0x22, 0xad, + 0xc9, 0xfd, 0xd0, 0xf6, 0x4c, 0x53, 0xb2, 0xb4, 0x66, 0x7c, 0x58, 0xc0, 0x0b, 0xe8, 0xe7, 0x80, + 0xa6, 0x5f, 0xc6, 0xe8, 0xde, 0x75, 0x5e, 0xf1, 0x75, 0x7c, 0x05, 0x4a, 0xee, 0xf0, 0x53, 0x58, + 0x9d, 0x7a, 0xd3, 0xa1, 0x6f, 0x68, 0xa2, 0xb3, 0xde, 0xca, 0xf5, 0x0f, 0xe7, 0x83, 0x22, 0x07, + 0xa6, 0x9f, 0x56, 0x09, 0x07, 0x66, 0x3e, 0xe2, 0x12, 0x0e, 0xcc, 0x78, 0x9f, 0xc9, 0x5a, 0x0b, + 0xaf, 0xf4, 0x89, 0x5a, 0x4b, 0x5d, 0xfd, 0x13, 0xb5, 0x96, 0x78, 0x03, 0xe0, 0x05, 0xf4, 0x04, + 0x8a, 0x8a, 0x85, 0x36, 0xa7, 0x61, 0xa1, 0x86, 0x5b, 0x59, 0x4b, 0x52, 0xc1, 0x19, 0x2c, 0xe9, + 0xb7, 0x1f, 0xb4, 0x35, 0xf3, 0x6d, 0x28, 0x55, 0xcd, 0x7d, 0x3b, 0x46, 0x4e, 0x89, 0x49, 0x9e, + 0x76, 0x4a, 0xbf, 0xd3, 0xa4, 0x9d, 0x8a, 0x47, 0x3f, 0x5e, 0x40, 0x3d, 0xf1, 0xfd, 0x72, 0x6a, + 0x8a, 0xa1, 0xfb, 0x49, 0x99, 0x59, 0x13, 0xbf, 0x7e, 0xef, 0x4a, 0x9c, 0xdc, 0xa7, 0x01, 0xe5, + 0x68, 0x9a, 0xa0, 0xdb, 0x9a, 0x50, 0x7a, 0xae, 0xd5, 0x37, 0xb3, 0x17, 0xa5, 0x9a, 0x47, 0x50, + 0x54, 0x73, 0x25, 0x91, 0x83, 0xe4, 0xac, 0xa9, 0xd7, 0xf4, 0xcf, 0x09, 0xbc, 0x31, 0xe2, 0x05, + 0xf4, 0x0c, 0x20, 0x1e, 0x20, 0xe8, 0x4e, 0x62, 0x76, 0xa5, 0x46, 0x50, 0xbd, 0x3e, 0x63, 0x35, + 0x0c, 0xfb, 0x92, 0x3e, 0x4f, 0x12, 0x69, 0xcc, 0x18, 0x34, 0x99, 0xd6, 0x3c, 0x85, 0x6a, 0x72, + 0xcc, 0x24, 0x1a, 0x41, 0xe6, 0x04, 0xca, 0xd4, 0xf3, 0x0a, 0x36, 0xb2, 0xe7, 0x0f, 0xda, 0x49, + 0xea, 0x9b, 0x3d, 0xa2, 0x32, 0xf5, 0x5a, 0xb0, 0x9e, 0x35, 0x9e, 0x12, 0x65, 0x31, 0x67, 0x7e, + 0x65, 0xe9, 0x3c, 0x78, 0xf4, 0xd7, 0xf7, 0x5b, 0xc6, 0x3f, 0xde, 0x6f, 0x19, 0xff, 0x7a, 0xbf, + 0x65, 0xfc, 0xfe, 0xdf, 0x5b, 0x0b, 0x80, 0xbb, 0xfd, 0xdd, 0x2e, 0xf1, 0xbd, 0x5d, 0xdb, 0x1d, + 0x74, 0xc9, 0x2e, 0xdd, 0xdb, 0x0d, 0x65, 0xfc, 0x51, 0x37, 0x20, 0xfe, 0x84, 0xf8, 0x5f, 0xe5, + 0x46, 0x9d, 0xce, 0x0d, 0xf1, 0xe7, 0xd7, 0x67, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x01, 0xeb, + 0xd2, 0x9a, 0x16, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3194,6 +3356,8 @@ type ControlClient interface { RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3398,6 +3562,24 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe return out, nil } +func (c *controlClient) SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultBranch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultBranch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. type ControlServer interface { TrackStatus(*StatusRequest, Control_TrackStatusServer) error @@ -3419,68 +3601,8 @@ type ControlServer interface { RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) -} - -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") + SetGlobalDefaultBranch(context.Context, *SetGlobalDefaultBranchRequest) (*Empty, error) + SetRepoDefaultBranch(context.Context, *SetRepoDefaultBranchRequest) (*Empty, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -3832,6 +3954,42 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Control_SetGlobalDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultBranchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultBranch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultBranch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultBranch(ctx, req.(*SetGlobalDefaultBranchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultBranchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultBranch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultBranch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultBranch(ctx, req.(*SetRepoDefaultBranchRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), @@ -3908,6 +4066,14 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "SetDefaultRepo", Handler: _Control_SetDefaultRepo_Handler, }, + { + MethodName: "SetGlobalDefaultBranch", + Handler: _Control_SetGlobalDefaultBranch_Handler, + }, + { + MethodName: "SetRepoDefaultBranch", + Handler: _Control_SetRepoDefaultBranch_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -3922,7 +4088,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3930,26 +4096,20 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3957,26 +4117,20 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3984,47 +4138,38 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.StatusUpdates { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4032,61 +4177,46 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) } if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } + nn1, err := m.Event.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } + i += nn1 } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + i := 0 if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) + n2, err := m.MesosHeartbeat.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4094,26 +4224,20 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4121,62 +4245,53 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if m.Minor != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + if m.Patch != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) } if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i += copy(dAtA[i:], m.Build) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + if len(m.ProductName) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i += copy(dAtA[i:], m.ProductName) } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if len(m.VersionStr) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i += copy(dAtA[i:], m.VersionStr) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4184,74 +4299,63 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if m.EnvironmentsCount != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + if m.TasksCount != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if m.HostsCount != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + if len(m.InstanceName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i += copy(dAtA[i:], m.InstanceName) } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.Version != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) + n3, err := m.Version.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4259,33 +4363,26 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4293,26 +4390,20 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4320,26 +4411,20 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4347,47 +4432,38 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Environments { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4395,73 +4471,61 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 + if len(m.CreatedWhen) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i += copy(dAtA[i:], m.CreatedWhen) } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.RootRole) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i += copy(dAtA[i:], m.RootRole) } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4469,33 +4533,26 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i += copy(dAtA[i:], m.WorkflowTemplate) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4503,38 +4560,30 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n4, err := m.Environment.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4542,33 +4591,26 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4576,50 +4618,40 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n5, err := m.Environment.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 } if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) + n6, err := m.Workflow.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n6 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4627,38 +4659,31 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4666,45 +4691,37 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4712,57 +4729,48 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.Operations) > 0 { + for _, msg := range m.Operations { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if m.ReconfigureAll { - i-- + dAtA[i] = 0x18 + i++ if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4770,38 +4778,31 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) + i += copy(dAtA[i:], m.RoleName) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4809,54 +4810,44 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.FailedOperations) > 0 { + for _, msg := range m.FailedOperations { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4864,43 +4855,36 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.KeepTasks { - i-- + dAtA[i] = 0x10 + i++ if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4908,38 +4892,30 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) + n7, err := m.CleanupTasksReply.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4947,83 +4923,70 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Locked { + dAtA[i] = 0x10 + i++ + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i-- - dAtA[i] = 0x3a + i++ } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a + if len(m.TaskId) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a + if len(m.State) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.ClassName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i += copy(dAtA[i:], m.ClassName) + } + if m.DeploymentInfo != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) + n8, err := m.DeploymentInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x10 + i += n8 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5031,54 +4994,44 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 + if len(m.AgentId) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i += copy(dAtA[i:], m.AgentId) } if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i += copy(dAtA[i:], m.OfferId) } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 + if len(m.ExecutorId) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i += copy(dAtA[i:], m.ExecutorId) } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5086,26 +5039,20 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5113,40 +5060,32 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5154,33 +5093,26 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5188,38 +5120,30 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) + n9, err := m.Task.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5227,40 +5151,32 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i += copy(dAtA[i:], m.ControlMode) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5268,68 +5184,72 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 + if len(m.Env) > 0 { + for _, s := range m.Env { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } if m.Shell { - i-- + dAtA[i] = 0x10 + i++ if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa + if len(m.Value) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if len(m.User) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5337,47 +5257,38 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.Target) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5385,104 +5296,86 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.ShortInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) + n10, err := m.ShortInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x2a + i += n10 } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 + if m.ClassInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) + n11, err := m.ClassInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } + i += n11 } if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.InboundChannels { dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if len(m.OutboundChannels) > 0 { + for _, msg := range m.OutboundChannels { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0xa } - return len(dAtA) - i, nil + if m.CommandInfo != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) + n12, err := m.CommandInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + if len(m.TaskPath) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i += copy(dAtA[i:], m.TaskPath) + } + if len(m.EnvId) > 0 { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5490,35 +5383,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- + for _, s := range m.TaskIds { dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5526,54 +5419,44 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.KilledTasks) > 0 { + for _, msg := range m.KilledTasks { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i += n } } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.RunningTasks) > 0 { + for _, msg := range m.RunningTasks { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5581,40 +5464,32 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) } if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i += copy(dAtA[i:], m.PathSpec) } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5622,77 +5497,71 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } + if len(m.Status) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i += copy(dAtA[i:], m.FullPath) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 + if len(m.Roles) > 0 { + for _, msg := range m.Roles { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5700,40 +5569,32 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Roles { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5741,60 +5602,52 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.RepoPattern) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i += copy(dAtA[i:], m.RepoPattern) } - if m.AllTags { - i-- - if m.AllTags { + if len(m.RevisionPattern) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i += copy(dAtA[i:], m.RevisionPattern) + } + if m.AllBranches { + dAtA[i] = 0x18 + i++ + if m.AllBranches { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x20 + i++ } - if m.AllBranches { - i-- - if m.AllBranches { + if m.AllTags { + dAtA[i] = 0x20 + i++ + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 + i++ } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5802,47 +5655,38 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a + if len(m.Repo) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i += copy(dAtA[i:], m.Repo) } if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i += copy(dAtA[i:], m.Template) } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa + if len(m.Revision) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5850,40 +5694,32 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.WorkflowTemplates { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5891,26 +5727,20 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5918,43 +5748,42 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if m.Default { - i-- + dAtA[i] = 0x10 + i++ if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.DefaultBranch) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) + i += copy(dAtA[i:], m.DefaultBranch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5962,40 +5791,32 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Repos { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6003,33 +5824,26 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6037,31 +5851,25 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6069,33 +5877,26 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i += copy(dAtA[i:], m.NewDefaultRepo) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6103,31 +5904,25 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6135,31 +5930,84 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Index != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) +func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { + var i int _ = i var l int _ = l + if len(m.Branch) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) + i += copy(dAtA[i:], m.Branch) + } if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SetRepoDefaultBranchRequest) 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 *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) } - return len(dAtA) - i, nil + if len(m.Branch) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) + i += copy(dAtA[i:], m.Branch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6167,32 +6015,24 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { } func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7131,6 +6971,10 @@ func (m *RepoInfo) Size() (n int) { if m.Default { n += 2 } + l = len(m.DefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7155,13 +6999,44 @@ func (m *ListReposReply) Size() (n int) { return n } -func (m *AddRepoRequest) Size() (n int) { +func (m *AddRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoReply) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) + l = len(m.NewDefaultRepo) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7171,7 +7046,7 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *RemoveRepoRequest) Size() (n int) { +func (m *RefreshReposRequest) Size() (n int) { if m == nil { return 0 } @@ -7186,15 +7061,14 @@ func (m *RemoveRepoRequest) Size() (n int) { return n } -func (m *RemoveRepoReply) Size() (n int) { +func (m *SetDefaultRepoRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -7202,14 +7076,15 @@ func (m *RemoveRepoReply) Size() (n int) { return n } -func (m *RefreshReposRequest) Size() (n int) { +func (m *SetGlobalDefaultBranchRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + l = len(m.Branch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -7217,7 +7092,7 @@ func (m *RefreshReposRequest) Size() (n int) { return n } -func (m *SetDefaultRepoRequest) Size() (n int) { +func (m *SetRepoDefaultBranchRequest) Size() (n int) { if m == nil { return 0 } @@ -7226,6 +7101,10 @@ func (m *SetDefaultRepoRequest) Size() (n int) { if m.Index != 0 { n += 1 + sovO2Control(uint64(m.Index)) } + l = len(m.Branch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7245,7 +7124,14 @@ func (m *Empty) Size() (n int) { } func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -12589,6 +12475,38 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } } m.Default = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -13093,6 +13011,197 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *SetGlobalDefaultBranchRequest) 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 ErrIntOverflowO2Control + } + 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: SetGlobalDefaultBranchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Branch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetRepoDefaultBranchRequest) 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 ErrIntOverflowO2Control + } + 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: SetRepoDefaultBranchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetRepoDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Branch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13150,7 +13259,6 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 - depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13182,8 +13290,10 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } + return iNdEx, nil case 1: iNdEx += 8 + return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13204,30 +13314,55 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + return iNdEx, nil case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowO2Control + } + 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 := skipO2Control(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } } - depth-- + 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) } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } } - return 0, io.ErrUnexpectedEOF + panic("unreachable") } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") ) diff --git a/core/config.go b/core/config.go index 202831f7f..01dab4761 100644 --- a/core/config.go +++ b/core/config.go @@ -55,6 +55,7 @@ func setDefaults() error { viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) viper.SetDefault("executorMemory", envFloat("EXEC_MEMORY", "64")) + viper.SetDefault("globalDefaultBranch", "master") viper.SetDefault("instanceName", fmt.Sprintf("%s instance", product.PRETTY_SHORTNAME)) viper.SetDefault("mesosApiTimeout", envDuration("MESOS_CONNECT_TIMEOUT", "20s")) viper.SetDefault("mesosAuthMode", env("AUTH_MODE", "")) diff --git a/core/confsys/service.go b/core/confsys/service.go index 81835dd88..5263580ca 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -118,7 +118,30 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { if err != nil { return } - defaultRepo = strings.TrimSuffix(string(defaultRepoData), "/n") + defaultRepo = strings.TrimSuffix(string(defaultRepoData), "\n") + return + } +} + +func (s *Service) NewDefaultBranch(defaultBranch string) error { + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + return cSrc.Put("o2/control/default_branch", defaultBranch) + } else { + data := []byte(defaultBranch) + return ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_branch", data, 0644) + } +} + +func (s *Service) GetDefaultBranch() (defaultBranch string, err error) { + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + return cSrc.Get("o2/control/default_branch") + } else { + var defaultBranchData []byte + defaultBranchData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_branch") + if err != nil { + return + } + defaultBranch = strings.TrimSuffix(string(defaultBranchData), "\n") return } } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 828244624..4d75bb919 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StatusUpdate_Level int32 @@ -142,7 +139,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -184,7 +181,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -225,7 +222,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -282,7 +279,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -308,7 +305,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -334,13 +331,61 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ +// XXX_OneofFuncs is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { + return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } +func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + _ = b.EncodeVarint(2<<3 | proto.WireBytes) + if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { + return err + } + case nil: + default: + return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) + } + return nil +} + +func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { + m := msg.(*StatusUpdate) + switch tag { + case 2: // Event.mesosHeartbeat + if wire != proto.WireBytes { + return true, proto.ErrInternalBadWireType + } + msg := new(Event_MesosHeartbeat) + err := b.DecodeMessage(msg) + m.Event = &StatusUpdate_MesosHeartbeat{msg} + return true, err + default: + return false, nil + } +} + +func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { + m := msg.(*StatusUpdate) + // Event + switch x := m.Event.(type) { + case *StatusUpdate_MesosHeartbeat: + s := proto.Size(x.MesosHeartbeat) + n += 1 // tag and wire + n += proto.SizeVarint(uint64(s)) + n += s + case nil: + default: + panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) + } + return n +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -364,7 +409,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -409,7 +454,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -497,7 +542,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -587,7 +632,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -633,7 +678,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -675,7 +720,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -716,7 +761,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -775,7 +820,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -857,7 +902,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -904,7 +949,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -951,7 +996,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -999,7 +1044,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1054,7 +1099,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1110,7 +1155,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1173,7 +1218,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1235,7 +1280,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1291,7 +1336,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1353,7 +1398,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1407,7 +1452,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1463,7 +1508,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1555,7 +1600,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1622,7 +1667,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1662,7 +1707,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1709,7 +1754,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1756,7 +1801,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1804,7 +1849,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1862,7 +1907,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -1939,7 +1984,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2006,7 +2051,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2095,7 +2140,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2143,7 +2188,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2201,7 +2246,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2260,7 +2305,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2342,7 +2387,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2392,7 +2437,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2462,7 +2507,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2523,7 +2568,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2569,7 +2614,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2591,6 +2636,7 @@ var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2610,7 +2656,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2643,6 +2689,13 @@ func (m *RepoInfo) GetDefault() bool { return false } +func (m *RepoInfo) GetDefaultBranch() string { + if m != nil { + return m.DefaultBranch + } + return "" +} + type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2664,7 +2717,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2711,7 +2764,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2758,7 +2811,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2805,7 +2858,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2852,7 +2905,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2899,7 +2952,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -2925,6 +2978,108 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } +type SetGlobalDefaultBranchRequest struct { + Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultBranchRequest{} } +func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} +func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} +} +func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetGlobalDefaultBranchRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetGlobalDefaultBranchRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultBranchRequest.Merge(m, src) +} +func (m *SetGlobalDefaultBranchRequest) XXX_Size() int { + return m.Size() +} +func (m *SetGlobalDefaultBranchRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultBranchRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetGlobalDefaultBranchRequest proto.InternalMessageInfo + +func (m *SetGlobalDefaultBranchRequest) GetBranch() string { + if m != nil { + return m.Branch + } + return "" +} + +type SetRepoDefaultBranchRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranchRequest{} } +func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultBranchRequest) ProtoMessage() {} +func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} +} +func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultBranchRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetRepoDefaultBranchRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultBranchRequest.Merge(m, src) +} +func (m *SetRepoDefaultBranchRequest) XXX_Size() int { + return m.Size() +} +func (m *SetRepoDefaultBranchRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultBranchRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetRepoDefaultBranchRequest proto.InternalMessageInfo + +func (m *SetRepoDefaultBranchRequest) GetIndex() int32 { + if m != nil { + return m.Index + } + return 0 +} + +func (m *SetRepoDefaultBranchRequest) GetBranch() string { + if m != nil { + return m.Branch + } + return "" +} + type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -2935,7 +3090,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2945,7 +3100,7 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -3017,150 +3172,157 @@ func init() { proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") + proto.RegisterType((*SetGlobalDefaultBranchRequest)(nil), "o2control.SetGlobalDefaultBranchRequest") + proto.RegisterType((*SetRepoDefaultBranchRequest)(nil), "o2control.SetRepoDefaultBranchRequest") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2185 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x6f, 0x1b, 0x4b, - 0x15, 0xcf, 0x3a, 0x76, 0x6c, 0x1f, 0x27, 0x8e, 0x33, 0x49, 0x93, 0x8d, 0x6f, 0x49, 0x73, 0x87, - 0xaa, 0x37, 0xbd, 0xf7, 0x92, 0x42, 0x2e, 0x82, 0x52, 0x2e, 0x94, 0xc4, 0x71, 0x53, 0x43, 0x13, - 0x57, 0x1b, 0xb7, 0x15, 0x57, 0x42, 0x65, 0xe3, 0x1d, 0xc7, 0x6e, 0xd6, 0x3b, 0x66, 0x77, 0xec, - 0x34, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x0f, 0xbc, 0xf0, 0x8a, 0x10, 0x8f, 0x7c, 0x0f, 0x5e, 0x10, - 0xf0, 0x0d, 0x50, 0x91, 0x78, 0x42, 0x7c, 0x06, 0x34, 0x7f, 0x76, 0x77, 0x76, 0xbd, 0x4e, 0x22, - 0xf1, 0xe6, 0x73, 0xe6, 0x77, 0xce, 0x9c, 0x7f, 0x73, 0xce, 0xcc, 0x1a, 0xd6, 0x47, 0x3e, 0x65, - 0x34, 0x78, 0x44, 0xf7, 0xba, 0xd4, 0x63, 0x3e, 0x75, 0x77, 0x05, 0x03, 0x95, 0x23, 0x06, 0x5e, - 0x87, 0xb5, 0xe6, 0x84, 0x78, 0xec, 0xed, 0x31, 0x09, 0x68, 0xf0, 0x9c, 0xd8, 0x3e, 0x3b, 0x23, - 0x36, 0xc3, 0xcb, 0xb0, 0x74, 0xca, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0x8b, 0x31, 0x09, 0x18, 0x3e, - 0x83, 0x4a, 0xc8, 0x18, 0xb9, 0x57, 0x68, 0x0d, 0x0a, 0x01, 0xb3, 0x19, 0x31, 0x8d, 0x6d, 0x63, - 0xa7, 0x6c, 0x49, 0x02, 0xfd, 0x00, 0x96, 0x02, 0x01, 0x7a, 0x35, 0x72, 0x6c, 0x46, 0x02, 0x33, - 0xb7, 0x3d, 0xbf, 0x53, 0xd9, 0xdb, 0xd8, 0x8d, 0x2d, 0x38, 0xd5, 0xd6, 0xad, 0x24, 0x1a, 0xff, - 0xd5, 0x80, 0x45, 0x7d, 0x1d, 0x7d, 0x01, 0x05, 0x97, 0x4c, 0x88, 0x2b, 0x76, 0xa9, 0xee, 0x7d, - 0x6d, 0x86, 0x9e, 0xdd, 0x17, 0x1c, 0x64, 0x49, 0x2c, 0x6a, 0x41, 0x75, 0x98, 0x70, 0xc6, 0xcc, - 0x6d, 0x1b, 0x3b, 0x95, 0xbd, 0x7b, 0x9a, 0x74, 0x96, 0xcf, 0xcf, 0xe7, 0xac, 0x94, 0x20, 0xfe, - 0x36, 0x14, 0x84, 0x6a, 0x54, 0x86, 0xc2, 0x61, 0xf3, 0xe0, 0xd5, 0x51, 0x6d, 0x0e, 0x95, 0x20, - 0xdf, 0x3a, 0x79, 0xd6, 0xae, 0x19, 0xa8, 0x02, 0xc5, 0x37, 0xfb, 0xd6, 0x49, 0xeb, 0xe4, 0xa8, - 0x96, 0xe3, 0x88, 0xa6, 0x65, 0xb5, 0xad, 0xda, 0xfc, 0x41, 0x11, 0x0a, 0x42, 0x3f, 0xde, 0x84, - 0x8d, 0x23, 0xc2, 0x9e, 0xf9, 0xf6, 0x90, 0x5c, 0x52, 0xff, 0xa2, 0xe5, 0xf5, 0x68, 0x18, 0xce, - 0x3f, 0x1a, 0x50, 0x7c, 0x4d, 0xfc, 0x60, 0x40, 0x3d, 0x1e, 0xcb, 0xa1, 0xfd, 0x8e, 0xfa, 0xc2, - 0xcb, 0x82, 0x25, 0x09, 0xc1, 0x1d, 0x78, 0xd4, 0x17, 0xd6, 0x73, 0x2e, 0x27, 0x38, 0x77, 0x64, - 0xb3, 0x6e, 0xdf, 0x9c, 0x97, 0x5c, 0x41, 0x70, 0xee, 0xd9, 0x78, 0xe0, 0x3a, 0x66, 0x5e, 0x66, - 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb1, 0x87, 0xc4, 0x2c, 0x88, - 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x88, 0x53, 0xe6, 0x9b, 0x0b, 0x02, 0xa0, 0x71, 0xf0, - 0x6f, 0x73, 0x70, 0x67, 0xda, 0x03, 0x9e, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, 0xa3, 0xaa, 0x40, - 0x67, 0xa1, 0xcf, 0x61, 0x85, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, 0xd0, 0xa0, 0x63, - 0x8f, 0x29, 0x5f, 0xa6, 0x17, 0xb8, 0x25, 0xcc, 0x0e, 0x2e, 0x14, 0x4c, 0x3a, 0xa7, 0x71, 0xe2, - 0x7a, 0xcb, 0xeb, 0xf5, 0xb6, 0x05, 0xd0, 0xa7, 0x41, 0xa8, 0xbc, 0x20, 0xa5, 0x62, 0x0e, 0xc2, - 0xb0, 0x38, 0xf0, 0x02, 0x66, 0x7b, 0x5d, 0x22, 0x42, 0x20, 0x3d, 0x4c, 0xf0, 0xd0, 0xe7, 0x50, - 0x54, 0x1e, 0x9b, 0x45, 0x51, 0x27, 0x48, 0xab, 0x13, 0x95, 0x22, 0x2b, 0x84, 0xe0, 0x87, 0xb0, - 0xdc, 0x21, 0xb6, 0xef, 0xd0, 0x4b, 0x4f, 0xa5, 0x12, 0xad, 0xc3, 0x82, 0x4f, 0xec, 0x80, 0x7a, - 0x2a, 0x0a, 0x8a, 0xe2, 0x47, 0x28, 0x86, 0x8e, 0xdc, 0x2b, 0x6c, 0xc2, 0xfa, 0x11, 0x61, 0x4d, - 0xcd, 0xf7, 0xb0, 0x1a, 0xde, 0xc3, 0xda, 0xd4, 0xca, 0xed, 0xa2, 0xfc, 0x43, 0x58, 0xd4, 0x83, - 0xa9, 0x0e, 0x5c, 0x5d, 0x2f, 0xf5, 0x78, 0x59, 0xa4, 0x2f, 0x81, 0xc7, 0xff, 0x30, 0x60, 0x39, - 0x85, 0x40, 0x55, 0xc8, 0x0d, 0xc2, 0xcd, 0x72, 0x03, 0x51, 0x47, 0x5d, 0x9f, 0xd8, 0x8c, 0x38, - 0x6f, 0xfa, 0xc4, 0x13, 0x39, 0x2c, 0x5b, 0x3a, 0x2b, 0xce, 0xce, 0xbc, 0x9e, 0x9d, 0x5d, 0x28, - 0x88, 0x0c, 0x9a, 0x79, 0x61, 0x94, 0xa9, 0x9f, 0xde, 0x3e, 0xf5, 0x59, 0xc7, 0x0e, 0x64, 0x45, - 0x49, 0x18, 0xaa, 0x43, 0xc9, 0xa7, 0x94, 0x59, 0xd4, 0x0d, 0x8b, 0x35, 0xa2, 0xd1, 0xa7, 0x50, - 0xeb, 0x8e, 0x7d, 0x9f, 0x78, 0xcc, 0x1a, 0x7b, 0x27, 0xe3, 0xe1, 0x19, 0x91, 0xf5, 0xba, 0x64, - 0x4d, 0xf1, 0x71, 0x03, 0xee, 0x9c, 0x90, 0x4b, 0xcd, 0xab, 0x30, 0x53, 0x9f, 0x42, 0x8d, 0x87, - 0xad, 0xe7, 0xd2, 0xcb, 0x0e, 0x19, 0x8e, 0xdc, 0xb8, 0x7f, 0x4d, 0xf1, 0xf1, 0x29, 0xac, 0xa6, - 0x95, 0xf0, 0x8c, 0x7c, 0x09, 0x15, 0x2d, 0x7e, 0x42, 0xfa, 0xfa, 0x70, 0xeb, 0x70, 0xfc, 0x89, - 0x38, 0x4e, 0x19, 0x96, 0xa5, 0x42, 0x8e, 0x7f, 0x65, 0xc0, 0x6a, 0x1a, 0xf9, 0x7f, 0x6f, 0x8f, - 0x1e, 0x41, 0x29, 0xf4, 0x53, 0xf5, 0xc4, 0x55, 0x4d, 0x94, 0xc7, 0x59, 0xc8, 0x44, 0x20, 0xfc, - 0x37, 0x03, 0x36, 0x1b, 0x72, 0xf9, 0x66, 0xa3, 0xd1, 0x53, 0xc8, 0xb3, 0xab, 0x11, 0x11, 0xaa, - 0xab, 0x7b, 0x9f, 0x69, 0xaa, 0x67, 0xea, 0xd8, 0x6d, 0x8f, 0xb8, 0x88, 0x25, 0x04, 0xb1, 0x0d, - 0x0b, 0x92, 0xe6, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0x59, 0x9b, 0x43, 0x08, 0xaa, 0xa7, 0x9d, 0x7d, - 0xab, 0xf3, 0x76, 0xbf, 0xd1, 0x69, 0xbd, 0x6e, 0x75, 0x7e, 0x5a, 0x33, 0xd0, 0x0a, 0x2c, 0x9d, - 0x76, 0xda, 0x2f, 0x63, 0x56, 0x0e, 0x2d, 0x41, 0xb9, 0xd1, 0x3e, 0x79, 0xd6, 0x3a, 0x7a, 0x65, - 0x35, 0x6b, 0xf3, 0xbc, 0x1b, 0x5b, 0xcd, 0xd3, 0x66, 0xa7, 0x96, 0x47, 0x8b, 0x50, 0x3a, 0x6a, - 0xbf, 0x95, 0xbd, 0xb9, 0x80, 0x2f, 0x60, 0x23, 0xcb, 0x18, 0x1e, 0xdb, 0xb4, 0x3b, 0x51, 0x51, - 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x19, 0x85, 0xf8, 0x3b, 0x03, 0xcc, 0x63, 0xea, 0x0c, - 0x7a, 0x57, 0xb7, 0x8a, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, 0x78, 0x8e, 0xef, 0x65, - 0x67, 0xb6, 0x1d, 0xe2, 0x2c, 0x4d, 0x04, 0x3d, 0x80, 0xaa, 0x4f, 0xba, 0xd4, 0xeb, 0x0d, 0xce, - 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0x61, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0x1f, 0x0c, 0x58, 0xcb, 0x52, - 0x86, 0x9e, 0xa8, 0xfc, 0xc9, 0x61, 0xfb, 0xe0, 0x86, 0xbd, 0x13, 0xa9, 0x93, 0x67, 0xd7, 0x95, - 0x5d, 0x36, 0x17, 0x9e, 0x5d, 0x49, 0xe3, 0x6f, 0x65, 0xa4, 0x75, 0x19, 0x2a, 0x56, 0xf3, 0xb8, - 0xfd, 0xba, 0xf9, 0xd6, 0x6a, 0xbf, 0xe0, 0x19, 0x5b, 0x84, 0xd2, 0xfe, 0xe1, 0xa1, 0xa4, 0xf2, - 0xf8, 0xd7, 0x06, 0xac, 0x67, 0x44, 0x8e, 0xa7, 0xe9, 0x27, 0x50, 0xeb, 0xd9, 0x03, 0x97, 0x38, - 0xed, 0x38, 0x5a, 0xc6, 0xed, 0xa2, 0x35, 0x25, 0xa8, 0x92, 0x90, 0x9b, 0xce, 0xb9, 0xde, 0xc8, - 0x70, 0x0b, 0x36, 0x0f, 0x49, 0xc0, 0x7c, 0x7a, 0x9b, 0x3c, 0xde, 0x85, 0xf2, 0x05, 0x21, 0xa3, - 0x8e, 0xe8, 0x7c, 0x39, 0x91, 0x81, 0x98, 0x81, 0x09, 0x6c, 0x64, 0xa9, 0xe2, 0x8e, 0xfd, 0x18, - 0x56, 0xba, 0x2e, 0xb1, 0xbd, 0xb1, 0x84, 0x0a, 0xa6, 0x3a, 0xe1, 0x77, 0xf5, 0xb3, 0x94, 0xc6, - 0x58, 0xd3, 0x62, 0xf8, 0xdf, 0x06, 0x2c, 0x25, 0x7a, 0x2c, 0x42, 0x90, 0xf7, 0x78, 0x72, 0xa4, - 0xa1, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xd9, 0xa9, 0x28, 0xce, 0xe7, 0x1d, - 0xb9, 0xe5, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, 0x51, 0x2b, - 0xe8, 0x27, 0xe5, 0x2e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, 0x09, 0x55, - 0x87, 0x8c, 0x5c, 0x7a, 0x15, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, 0x30, 0x01, - 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, 0x8e, 0x68, - 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, 0xfc, 0xc8, - 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x9e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, 0xc6, 0xc1, - 0x2b, 0xb0, 0x7c, 0x44, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x61, 0x29, 0x66, 0xf1, 0xfc, 0x46, - 0xe3, 0xd0, 0xb8, 0xd5, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, 0x8b, 0xa1, - 0xe7, 0x05, 0x7f, 0x17, 0x16, 0x23, 0x24, 0xdf, 0xe9, 0x13, 0xc8, 0xf3, 0x15, 0x55, 0x3c, 0xab, - 0xa9, 0x88, 0x8a, 0x3d, 0x04, 0x00, 0x37, 0x61, 0x89, 0x73, 0x1a, 0x3c, 0x2b, 0x33, 0xab, 0x84, - 0x8f, 0x7f, 0x29, 0x7e, 0x4c, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, 0x06, 0x1d, - 0x0e, 0x6d, 0xcf, 0x11, 0x4a, 0x6a, 0x30, 0x4f, 0xbc, 0x89, 0x70, 0xb3, 0x6c, 0xf1, 0x9f, 0xa2, - 0x40, 0xfa, 0xc4, 0x75, 0x55, 0x9d, 0x49, 0x82, 0x73, 0x27, 0xb6, 0x3b, 0x8e, 0x0e, 0x9b, 0x20, - 0x78, 0xd9, 0xd8, 0xfe, 0xf9, 0x58, 0x5e, 0x67, 0xf2, 0x42, 0x47, 0xcc, 0xe0, 0x06, 0x8e, 0x03, - 0xe2, 0xab, 0x4a, 0x13, 0xbf, 0xf1, 0x31, 0x54, 0x1a, 0x7d, 0xdb, 0xf3, 0x88, 0x3b, 0xd3, 0x07, - 0xa4, 0x8d, 0xa6, 0xb2, 0x6a, 0x59, 0x22, 0x9a, 0xfe, 0x39, 0x61, 0x71, 0x95, 0x73, 0x0a, 0xff, - 0x27, 0x07, 0xa5, 0xe8, 0xd8, 0x7c, 0x07, 0xca, 0x01, 0x4f, 0x8e, 0xa8, 0x50, 0x19, 0xcf, 0xd9, - 0x89, 0x8b, 0xa1, 0x5c, 0xae, 0x1b, 0x46, 0x55, 0xcd, 0x5a, 0x33, 0x95, 0x87, 0x28, 0xea, 0x56, - 0x0c, 0x45, 0x3f, 0x82, 0xe5, 0x81, 0x77, 0x46, 0xc7, 0x9e, 0xa3, 0x5c, 0x0a, 0xcc, 0x79, 0x51, - 0x2e, 0xeb, 0x7a, 0x0b, 0x88, 0xbd, 0xb5, 0xd2, 0x70, 0x74, 0x00, 0x35, 0x3a, 0x66, 0x49, 0x15, - 0xf9, 0x6b, 0x55, 0x4c, 0xe1, 0xd1, 0x63, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, 0xf1, 0x78, - 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x69, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, 0xcd, 0xf3, - 0x4d, 0xbc, 0x49, 0xcb, 0x11, 0x27, 0xbd, 0x6c, 0x49, 0x02, 0x3f, 0x82, 0xd5, 0x64, 0x4b, 0x93, - 0xb5, 0x6e, 0x42, 0x51, 0x56, 0x77, 0xa0, 0x0a, 0x29, 0x24, 0xf1, 0x6f, 0x0c, 0x58, 0x99, 0x6a, - 0x82, 0xe8, 0x09, 0x54, 0x2e, 0x06, 0xae, 0x4b, 0x9c, 0xce, 0xad, 0xce, 0x98, 0x0e, 0x46, 0x5f, - 0xc2, 0xa2, 0x3f, 0xf6, 0xbc, 0x81, 0x77, 0x1e, 0x76, 0xed, 0xeb, 0x85, 0x13, 0x68, 0xdc, 0x10, - 0x67, 0x9f, 0xdf, 0x9e, 0x22, 0xe3, 0x23, 0x4f, 0x0d, 0xcd, 0x53, 0x1e, 0x9b, 0x91, 0xcd, 0xfa, - 0xa7, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0x3f, 0x1b, 0x50, 0x0a, 0x2f, 0x60, 0xb3, 0x7a, - 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, 0xae, 0x48, - 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x08, 0x05, 0x3e, 0xb4, 0x03, - 0x73, 0x41, 0x04, 0x20, 0xf3, 0x72, 0x28, 0x11, 0xf8, 0x89, 0xe8, 0x6e, 0xca, 0x69, 0x1e, 0xff, - 0x48, 0xd6, 0xb8, 0x51, 0xf6, 0x4f, 0x06, 0x7c, 0x74, 0x44, 0xd8, 0x9b, 0xd4, 0x95, 0x3b, 0x8a, - 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6d, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, 0x16, 0xda, - 0x81, 0x65, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, 0xcb, 0x76, - 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, 0x75, 0x3b, - 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0xf1, 0x19, 0xac, 0xa5, 0x6d, 0x0c, 0xd3, 0xc3, 0x8d, - 0x09, 0xd3, 0xc3, 0x7f, 0x8b, 0xba, 0x0f, 0x9f, 0x14, 0x2a, 0xb7, 0x21, 0x2d, 0xee, 0x46, 0xca, - 0x2c, 0x95, 0xa5, 0x88, 0xc6, 0xef, 0x60, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xc7, 0xb0, 0x92, 0x7e, - 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0x8b, 0x41, 0xc0, 0x6f, - 0x1b, 0x34, 0x9a, 0x52, 0x8f, 0xa1, 0xc4, 0xe9, 0x99, 0x65, 0x67, 0x42, 0xd1, 0x21, 0x3d, 0x7b, - 0xec, 0x32, 0xd5, 0xbb, 0x43, 0x12, 0x7f, 0x1f, 0xaa, 0x9a, 0xb6, 0xb0, 0x04, 0x38, 0x95, 0x55, - 0x02, 0x6a, 0x0f, 0x4b, 0x22, 0xf0, 0x7d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0x49, 0xcf, 0xd8, - 0x1c, 0x3f, 0x84, 0x15, 0x8b, 0x0c, 0xe9, 0x84, 0xe8, 0xc0, 0x35, 0x28, 0x0c, 0x3c, 0x87, 0xbc, - 0x0f, 0xbf, 0x96, 0x08, 0x02, 0x7f, 0x0f, 0x96, 0x75, 0x28, 0x37, 0xe7, 0x01, 0x54, 0x3d, 0x72, - 0x79, 0x28, 0xcd, 0xb5, 0xe2, 0x84, 0xa5, 0xb8, 0xf8, 0x33, 0x58, 0xb5, 0x48, 0xcf, 0x27, 0x41, - 0x5f, 0x8f, 0xcc, 0x8c, 0x7d, 0xbe, 0x01, 0x77, 0x4e, 0x09, 0xd3, 0xc4, 0xaf, 0x87, 0x17, 0xa1, - 0xd0, 0x1c, 0x8e, 0xd8, 0xd5, 0xde, 0x7f, 0x2b, 0x50, 0x54, 0x0f, 0x0f, 0xd4, 0x80, 0x4a, 0xc7, - 0xb7, 0xbb, 0x17, 0xf2, 0x13, 0x16, 0x32, 0xa7, 0xbe, 0x6a, 0x29, 0x9d, 0xf5, 0xf5, 0x8c, 0x15, - 0x7e, 0xbb, 0x9b, 0xfb, 0xa6, 0x81, 0xbe, 0x82, 0x5a, 0xfa, 0xcb, 0x0c, 0xc2, 0x1a, 0x7e, 0xc6, - 0x87, 0xa7, 0xfa, 0xf6, 0xb5, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0x72, 0x81, 0xf4, 0xc7, - 0x65, 0xea, 0xcb, 0x47, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0xde, 0x88, 0xae, 0xa8, 0x7f, 0xd2, 0x40, - 0x1f, 0x27, 0xb7, 0xce, 0xf8, 0x10, 0x52, 0xbf, 0x77, 0x1d, 0x44, 0x2a, 0xee, 0x40, 0x35, 0xf9, - 0x30, 0x47, 0xba, 0x4b, 0x99, 0x0f, 0xff, 0xfa, 0xd6, 0x35, 0x88, 0x48, 0x6b, 0x72, 0x3f, 0xb4, - 0x3d, 0xd3, 0x94, 0x2c, 0xad, 0x19, 0x8f, 0x75, 0x3c, 0x87, 0x7e, 0x0e, 0x68, 0xfa, 0xb5, 0x89, - 0xee, 0xdf, 0xe6, 0x65, 0x5c, 0xc7, 0x37, 0xa0, 0xe4, 0x0e, 0x3f, 0x83, 0x95, 0xa9, 0x77, 0x12, - 0xfa, 0xba, 0x26, 0x3a, 0xeb, 0xfd, 0x59, 0xff, 0xf8, 0x7a, 0x50, 0xe4, 0xc0, 0xf4, 0x73, 0x25, - 0xe1, 0xc0, 0xcc, 0x87, 0x51, 0xc2, 0x81, 0x19, 0x6f, 0x1e, 0x59, 0x6b, 0xe1, 0x35, 0x39, 0x51, - 0x6b, 0xa9, 0xeb, 0x74, 0xa2, 0xd6, 0x12, 0xf7, 0x6a, 0x3c, 0x87, 0x9e, 0x42, 0x51, 0xb1, 0xd0, - 0xe6, 0x34, 0x2c, 0xd4, 0xb0, 0x91, 0xb5, 0x24, 0x15, 0x9c, 0xc0, 0xa2, 0x7e, 0xa3, 0x40, 0x5b, - 0x33, 0xdf, 0x5b, 0x52, 0xd5, 0xb5, 0xef, 0xb1, 0xc8, 0x29, 0x31, 0x1d, 0xd3, 0x4e, 0xe9, 0xf7, - 0x84, 0xb4, 0x53, 0xf1, 0x38, 0xc5, 0x73, 0xa8, 0x27, 0xbe, 0x09, 0x4e, 0x4d, 0x06, 0xf4, 0x20, - 0x29, 0x33, 0x6b, 0x8a, 0xd6, 0xef, 0xdf, 0x88, 0x93, 0xfb, 0x34, 0xa1, 0x1c, 0xf5, 0x71, 0xf4, - 0x91, 0x26, 0x94, 0x9e, 0x15, 0xf5, 0xcd, 0xec, 0x45, 0xa9, 0xe6, 0x31, 0x14, 0x55, 0x47, 0x4f, - 0xe4, 0x20, 0xd9, 0xe5, 0xeb, 0x35, 0xfd, 0x89, 0xce, 0x1b, 0x23, 0x9e, 0x43, 0xcf, 0x01, 0xe2, - 0xd6, 0x8d, 0xee, 0x26, 0xa6, 0x46, 0xaa, 0xf9, 0xd7, 0xeb, 0x33, 0x56, 0xc3, 0xb0, 0x2f, 0xea, - 0x9d, 0x3c, 0x91, 0xc6, 0x8c, 0x16, 0x9f, 0x69, 0xcd, 0x33, 0xa8, 0x26, 0x1b, 0x7c, 0xa2, 0x11, - 0x64, 0xf6, 0xfe, 0x2c, 0x3d, 0x07, 0x8f, 0xff, 0xf2, 0x61, 0xcb, 0xf8, 0xfb, 0x87, 0x2d, 0xe3, - 0x9f, 0x1f, 0xb6, 0x8c, 0xdf, 0xff, 0x6b, 0x6b, 0x0e, 0x70, 0xb7, 0xbf, 0xdb, 0x25, 0xbe, 0xb7, - 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8c, 0x3f, 0xea, 0x06, 0xc4, 0x9f, 0x10, - 0xff, 0xab, 0xdc, 0xe8, 0xec, 0x6c, 0x41, 0xfc, 0x49, 0xf3, 0xc5, 0xff, 0x02, 0x00, 0x00, 0xff, - 0xff, 0x98, 0x74, 0xa0, 0x5d, 0xbe, 0x19, 0x00, 0x00, + // 2262 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, + 0x15, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x92, 0x75, 0xbc, 0x4d, + 0x2a, 0xeb, 0xec, 0x2e, 0x0e, 0x78, 0x29, 0x36, 0x84, 0x85, 0xe0, 0x3f, 0x8a, 0x63, 0x36, 0xb6, + 0x52, 0x23, 0x25, 0x29, 0xb6, 0x0a, 0xc2, 0x48, 0xd3, 0xb2, 0xb4, 0x1e, 0x4d, 0x8b, 0x99, 0x96, + 0x12, 0x1f, 0xb8, 0x71, 0xa3, 0x28, 0x0e, 0x5c, 0x28, 0x6e, 0x14, 0xc5, 0x91, 0xef, 0xc1, 0x85, + 0x02, 0xbe, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x21, 0xa8, 0xfe, 0x33, 0x33, 0x3d, 0xa3, 0x91, 0xec, + 0x2a, 0x6e, 0x7a, 0xaf, 0x7f, 0xef, 0xf5, 0xfb, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x63, 0xe4, 0x53, + 0x46, 0x83, 0x87, 0x74, 0xaf, 0x4b, 0x3d, 0xe6, 0x53, 0x77, 0x57, 0x30, 0x50, 0x39, 0x62, 0xe0, + 0x0d, 0x58, 0x6f, 0x4c, 0x88, 0xc7, 0xde, 0x9c, 0x92, 0x80, 0x06, 0xcf, 0x88, 0xed, 0xb3, 0x0e, + 0xb1, 0x19, 0x5e, 0x81, 0xe5, 0x16, 0xb3, 0xd9, 0x38, 0xb0, 0xc8, 0x2f, 0xc6, 0x24, 0x60, 0xb8, + 0x03, 0x95, 0x90, 0x31, 0x72, 0x2f, 0xd1, 0x3a, 0x14, 0x02, 0x66, 0x33, 0x62, 0x1a, 0xdb, 0xc6, + 0x4e, 0xd9, 0x92, 0x04, 0xfa, 0x01, 0x2c, 0x07, 0x02, 0xf4, 0x72, 0xe4, 0xd8, 0x8c, 0x04, 0x66, + 0x6e, 0x7b, 0x71, 0xa7, 0xb2, 0x77, 0x6b, 0x37, 0xb6, 0xa0, 0xa5, 0xad, 0x5b, 0x49, 0x34, 0xfe, + 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x0c, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0xec, 0x52, 0xdd, 0xfb, + 0x60, 0x86, 0x9e, 0xdd, 0xe7, 0x1c, 0x64, 0x49, 0x2c, 0x3a, 0x81, 0xea, 0x30, 0xe1, 0x8c, 0x99, + 0xdb, 0x36, 0x76, 0x2a, 0x7b, 0x77, 0x35, 0xe9, 0x2c, 0x9f, 0x9f, 0x2d, 0x58, 0x29, 0x41, 0xfc, + 0x1d, 0x28, 0x08, 0xd5, 0xa8, 0x0c, 0x85, 0xa3, 0xc6, 0xc1, 0xcb, 0xe3, 0xda, 0x02, 0x2a, 0x41, + 0xfe, 0xe4, 0xec, 0x69, 0xb3, 0x66, 0xa0, 0x0a, 0x14, 0x5f, 0xef, 0x5b, 0x67, 0x27, 0x67, 0xc7, + 0xb5, 0x1c, 0x47, 0x34, 0x2c, 0xab, 0x69, 0xd5, 0x16, 0x0f, 0x8a, 0x50, 0x10, 0xfa, 0xf1, 0x26, + 0xdc, 0x3a, 0x26, 0xec, 0xa9, 0x6f, 0x0f, 0xc9, 0x5b, 0xea, 0x5f, 0x9c, 0x78, 0x3d, 0x1a, 0x86, + 0xf3, 0x4f, 0x06, 0x14, 0x5f, 0x11, 0x3f, 0x18, 0x50, 0x8f, 0xc7, 0x72, 0x68, 0x7f, 0x4d, 0x7d, + 0xe1, 0x65, 0xc1, 0x92, 0x84, 0xe0, 0x0e, 0x3c, 0xea, 0x0b, 0xeb, 0x39, 0x97, 0x13, 0x9c, 0x3b, + 0xb2, 0x59, 0xb7, 0x6f, 0x2e, 0x4a, 0xae, 0x20, 0x38, 0xb7, 0x33, 0x1e, 0xb8, 0x8e, 0x99, 0x97, + 0xd9, 0x10, 0x04, 0xda, 0x86, 0xca, 0xc8, 0xa7, 0xce, 0xb8, 0xcb, 0xce, 0xec, 0x21, 0x31, 0x0b, + 0x62, 0x4d, 0x67, 0xa1, 0x2d, 0x80, 0x89, 0x34, 0xa2, 0xc5, 0x7c, 0xf3, 0x86, 0x00, 0x68, 0x1c, + 0xfc, 0xdb, 0x1c, 0xdc, 0x9c, 0xf6, 0x80, 0xe7, 0x7f, 0x1b, 0x2a, 0xbd, 0x88, 0xeb, 0xa8, 0x2a, + 0xd0, 0x59, 0xe8, 0x53, 0x58, 0x25, 0xde, 0x64, 0xe0, 0x53, 0x6f, 0x48, 0x3c, 0x16, 0x1c, 0xd2, + 0xb1, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0xdc, 0x12, 0x66, 0x07, 0x17, 0x0a, 0x26, 0x9d, 0xd3, 0x38, + 0x71, 0xbd, 0xe5, 0xf5, 0x7a, 0xdb, 0x02, 0xe8, 0xd3, 0x20, 0x54, 0x5e, 0x90, 0x52, 0x31, 0x07, + 0x61, 0x58, 0x1a, 0x78, 0x01, 0xb3, 0xbd, 0x2e, 0x11, 0x21, 0x90, 0x1e, 0x26, 0x78, 0xe8, 0x53, + 0x28, 0x2a, 0x8f, 0xcd, 0xa2, 0xa8, 0x13, 0xa4, 0xd5, 0x89, 0x4a, 0x91, 0x15, 0x42, 0xf0, 0x03, + 0x58, 0x69, 0x13, 0xdb, 0x77, 0xe8, 0x5b, 0x4f, 0xa5, 0x12, 0x6d, 0xc0, 0x0d, 0x9f, 0xd8, 0x01, + 0xf5, 0x54, 0x14, 0x14, 0xc5, 0x8f, 0x50, 0x0c, 0x1d, 0xb9, 0x97, 0xd8, 0x84, 0x8d, 0x63, 0xc2, + 0x1a, 0x9a, 0xef, 0x61, 0x35, 0xbc, 0x83, 0xf5, 0xa9, 0x95, 0xeb, 0x45, 0xf9, 0x87, 0xb0, 0xa4, + 0x07, 0x53, 0x1d, 0xb8, 0xba, 0x5e, 0xea, 0xf1, 0xb2, 0x48, 0x5f, 0x02, 0x8f, 0xff, 0x69, 0xc0, + 0x4a, 0x0a, 0x81, 0xaa, 0x90, 0x1b, 0x84, 0x9b, 0xe5, 0x06, 0xa2, 0x8e, 0xba, 0x3e, 0xb1, 0x19, + 0x71, 0x5e, 0xf7, 0x89, 0x27, 0x72, 0x58, 0xb6, 0x74, 0x56, 0x9c, 0x9d, 0x45, 0x3d, 0x3b, 0xbb, + 0x50, 0x10, 0x19, 0x34, 0xf3, 0xc2, 0x28, 0x53, 0x3f, 0xbd, 0x7d, 0xea, 0xb3, 0xb6, 0x1d, 0xc8, + 0x8a, 0x92, 0x30, 0x54, 0x87, 0x92, 0x4f, 0x29, 0xb3, 0xa8, 0x1b, 0x16, 0x6b, 0x44, 0xa3, 0x8f, + 0xa1, 0xd6, 0x1d, 0xfb, 0x3e, 0xf1, 0x98, 0x35, 0xf6, 0xce, 0xc6, 0xc3, 0x0e, 0x91, 0xf5, 0xba, + 0x6c, 0x4d, 0xf1, 0xf1, 0x21, 0xdc, 0x3c, 0x23, 0x6f, 0x35, 0xaf, 0xc2, 0x4c, 0x7d, 0x0c, 0x35, + 0x1e, 0xb6, 0x9e, 0x4b, 0xdf, 0xb6, 0xc9, 0x70, 0xe4, 0xc6, 0xfd, 0x6b, 0x8a, 0x8f, 0x5b, 0xb0, + 0x96, 0x56, 0xc2, 0x33, 0xf2, 0x05, 0x54, 0xb4, 0xf8, 0x09, 0xe9, 0xf9, 0xe1, 0xd6, 0xe1, 0xf8, + 0x23, 0x71, 0x9c, 0x32, 0x2c, 0x4b, 0x85, 0x1c, 0xff, 0xca, 0x80, 0xb5, 0x34, 0xf2, 0xff, 0xde, + 0x1e, 0x3d, 0x84, 0x52, 0xe8, 0xa7, 0xea, 0x89, 0x6b, 0x9a, 0x28, 0x8f, 0xb3, 0x90, 0x89, 0x40, + 0xf8, 0xef, 0x06, 0x6c, 0x1e, 0xca, 0xe5, 0xab, 0x8d, 0x46, 0x4f, 0x20, 0xcf, 0x2e, 0x47, 0x44, + 0xa8, 0xae, 0xee, 0x7d, 0xa2, 0xa9, 0x9e, 0xa9, 0x63, 0xb7, 0x39, 0xe2, 0x22, 0x96, 0x10, 0xc4, + 0x36, 0xdc, 0x90, 0x34, 0x6f, 0xb2, 0x67, 0xcd, 0xe6, 0x8b, 0xda, 0x02, 0x42, 0x50, 0x6d, 0xb5, + 0xf7, 0xad, 0xf6, 0x9b, 0xfd, 0xc3, 0xf6, 0xc9, 0xab, 0x93, 0xf6, 0x4f, 0x6a, 0x06, 0x5a, 0x85, + 0xe5, 0x56, 0xbb, 0xf9, 0x22, 0x66, 0xe5, 0xd0, 0x32, 0x94, 0x0f, 0x9b, 0x67, 0x4f, 0x4f, 0x8e, + 0x5f, 0x5a, 0x8d, 0xda, 0x22, 0xef, 0xc6, 0x56, 0xa3, 0xd5, 0x68, 0xd7, 0xf2, 0x68, 0x09, 0x4a, + 0xc7, 0xcd, 0x37, 0xb2, 0x37, 0x17, 0xf0, 0x05, 0xdc, 0xca, 0x32, 0x86, 0xc7, 0x36, 0xed, 0x4e, + 0x54, 0xd4, 0x39, 0xbd, 0xa8, 0xb3, 0x0a, 0x71, 0x71, 0x46, 0x21, 0xfe, 0xce, 0x00, 0xf3, 0x94, + 0x3a, 0x83, 0xde, 0xe5, 0xb5, 0xa2, 0x07, 0x74, 0x44, 0x7c, 0x9b, 0x0d, 0xa8, 0x17, 0x9e, 0xe3, + 0xbb, 0xd9, 0x99, 0x6d, 0x86, 0x38, 0x4b, 0x13, 0x41, 0xf7, 0xa1, 0xea, 0x93, 0x2e, 0xf5, 0x7a, + 0x83, 0xf3, 0xb1, 0x4f, 0xf6, 0x5d, 0x57, 0xd8, 0x55, 0xb2, 0x52, 0x5c, 0xfc, 0x47, 0x03, 0xd6, + 0xb3, 0x94, 0xa1, 0xc7, 0x2a, 0x7f, 0x72, 0xd8, 0xde, 0xbf, 0x62, 0xef, 0x44, 0xea, 0xe4, 0xd9, + 0x75, 0x65, 0x97, 0xcd, 0x85, 0x67, 0x57, 0xd2, 0xf8, 0xdb, 0x19, 0x69, 0x5d, 0x81, 0x8a, 0xd5, + 0x38, 0x6d, 0xbe, 0x6a, 0xbc, 0xb1, 0x9a, 0xcf, 0x79, 0xc6, 0x96, 0xa0, 0xb4, 0x7f, 0x74, 0x24, + 0xa9, 0x3c, 0xfe, 0xb5, 0x01, 0x1b, 0x19, 0x91, 0xe3, 0x69, 0xfa, 0x12, 0x6a, 0x3d, 0x7b, 0xe0, + 0x12, 0xa7, 0x19, 0x47, 0xcb, 0xb8, 0x5e, 0xb4, 0xa6, 0x04, 0x55, 0x12, 0x72, 0xd3, 0x39, 0xd7, + 0x1b, 0x19, 0x3e, 0x81, 0xcd, 0x23, 0x12, 0x30, 0x9f, 0x5e, 0x27, 0x8f, 0x77, 0xa0, 0x7c, 0x41, + 0xc8, 0xa8, 0x2d, 0x3a, 0x5f, 0x4e, 0x64, 0x20, 0x66, 0x60, 0x02, 0xb7, 0xb2, 0x54, 0x71, 0xc7, + 0x7e, 0x0c, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x42, 0x05, 0x53, 0x9d, 0xf0, 0x3b, 0xfa, 0x59, + 0x4a, 0x63, 0xac, 0x69, 0x31, 0xfc, 0x1f, 0x03, 0x96, 0x13, 0x3d, 0x16, 0x21, 0xc8, 0x7b, 0x3c, + 0x39, 0xd2, 0x50, 0xf1, 0x9b, 0x4f, 0x2e, 0x97, 0x76, 0x2f, 0x88, 0xa3, 0xec, 0x54, 0x14, 0xe7, + 0xf3, 0x8e, 0x7c, 0xe2, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, + 0x51, 0x2b, 0xe8, 0x27, 0xe5, 0x0e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, + 0x01, 0x55, 0x87, 0x8c, 0x5c, 0x7a, 0x19, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, + 0x28, 0x01, 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, + 0x8e, 0x68, 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, + 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x8e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, + 0xc6, 0xc1, 0xab, 0xb0, 0x72, 0x4c, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x60, 0x39, 0x66, 0xf1, + 0xfc, 0x46, 0xe3, 0xd0, 0xb8, 0xd6, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, + 0x8b, 0xa1, 0xe7, 0x05, 0x7f, 0x0e, 0x4b, 0x11, 0x92, 0xef, 0xf4, 0x11, 0xe4, 0xf9, 0x8a, 0x2a, + 0x9e, 0xb5, 0x54, 0x44, 0xc5, 0x1e, 0x02, 0x80, 0x1b, 0xb0, 0xcc, 0x39, 0x87, 0x3c, 0x2b, 0x33, + 0xab, 0x84, 0x8f, 0x7f, 0x29, 0x7e, 0x4a, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, + 0x43, 0x3a, 0x1c, 0xda, 0x9e, 0x23, 0x94, 0xd4, 0x60, 0x91, 0x78, 0x13, 0xe1, 0x66, 0xd9, 0xe2, + 0x3f, 0x45, 0x81, 0xf4, 0x89, 0xeb, 0xaa, 0x3a, 0x93, 0x04, 0xe7, 0x4e, 0x6c, 0x77, 0x1c, 0x1d, + 0x36, 0x41, 0xf0, 0xb2, 0xb1, 0xfd, 0xf3, 0xb1, 0xbc, 0xce, 0xe4, 0x85, 0x8e, 0x98, 0xc1, 0x0d, + 0x1c, 0x07, 0xc4, 0x57, 0x95, 0x26, 0x7e, 0xe3, 0x53, 0xa8, 0x1c, 0xf6, 0x6d, 0xcf, 0x23, 0xee, + 0x4c, 0x1f, 0x90, 0x36, 0x9a, 0xca, 0xaa, 0x65, 0x89, 0x68, 0xfa, 0xe7, 0x84, 0xc5, 0x55, 0xce, + 0x29, 0xfc, 0xdf, 0x1c, 0x94, 0xa2, 0x63, 0xf3, 0x5d, 0x28, 0x07, 0x3c, 0x39, 0xa2, 0x42, 0x65, + 0x3c, 0x67, 0x27, 0x2e, 0x86, 0x72, 0xb9, 0x6e, 0x18, 0x55, 0x35, 0x6b, 0xcd, 0x54, 0x1e, 0xa2, + 0xa8, 0x5b, 0x31, 0x14, 0xfd, 0x08, 0x56, 0x06, 0x5e, 0x87, 0x8e, 0x3d, 0x47, 0xb9, 0x14, 0x98, + 0x8b, 0xa2, 0x5c, 0x36, 0xf4, 0x16, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x00, 0x6a, 0x74, 0xcc, + 0x92, 0x2a, 0xf2, 0x73, 0x55, 0x4c, 0xe1, 0xd1, 0x23, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, + 0xf1, 0x78, 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x61, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, + 0xcd, 0xf3, 0x4d, 0xbc, 0xc9, 0x89, 0x23, 0x4e, 0x7a, 0xd9, 0x92, 0x04, 0x7e, 0x08, 0x6b, 0xc9, + 0x96, 0x26, 0x6b, 0xdd, 0x84, 0xa2, 0xac, 0xee, 0x40, 0x15, 0x52, 0x48, 0xe2, 0xdf, 0x18, 0xb0, + 0x3a, 0xd5, 0x04, 0xd1, 0x63, 0xa8, 0x5c, 0x0c, 0x5c, 0x97, 0x38, 0xed, 0x6b, 0x9d, 0x31, 0x1d, + 0x8c, 0xbe, 0x80, 0x25, 0x7f, 0xec, 0x79, 0x03, 0xef, 0x3c, 0xec, 0xda, 0xf3, 0x85, 0x13, 0x68, + 0x7c, 0x28, 0xce, 0x3e, 0xbf, 0x3d, 0x45, 0xc6, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x23, + 0x9b, 0xf5, 0x5b, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0xbf, 0x18, 0x50, 0x0a, 0x2f, 0x60, + 0xb3, 0x7a, 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, + 0xae, 0x48, 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x00, 0x05, 0x3e, + 0xb4, 0x03, 0xf3, 0x86, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x63, 0xd1, 0xdd, 0x94, 0xd3, + 0x3c, 0xfe, 0x91, 0xac, 0x71, 0xa5, 0xec, 0x9f, 0x0d, 0xb8, 0x7d, 0x4c, 0xd8, 0xeb, 0xd4, 0x95, + 0x3b, 0x8a, 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6c, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, + 0x16, 0xda, 0x81, 0x15, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, + 0xcb, 0x76, 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, + 0x75, 0xdb, 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0x71, 0x07, 0xd6, 0xd3, 0x36, 0x86, 0xe9, + 0xe1, 0xc6, 0x84, 0xe9, 0xe1, 0xbf, 0x45, 0xdd, 0x87, 0x4f, 0x0a, 0x95, 0xdb, 0x90, 0x16, 0x77, + 0x23, 0x65, 0x96, 0xca, 0x52, 0x44, 0xe3, 0xaf, 0x61, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xa7, 0xb0, + 0x9a, 0x7e, 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0xf3, 0x41, + 0xc0, 0x6f, 0x1b, 0x34, 0x9a, 0x52, 0x3f, 0x83, 0x12, 0xa7, 0x67, 0x96, 0x9d, 0x09, 0x45, 0x87, + 0xf4, 0xec, 0xb1, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x74, 0x0f, 0x96, 0xd5, 0x4f, 0x19, 0x4a, 0xe5, + 0x5a, 0x92, 0x89, 0xbf, 0x0f, 0x55, 0x6d, 0xcf, 0xb0, 0x50, 0x38, 0x95, 0x55, 0x28, 0xca, 0x12, + 0x4b, 0x22, 0xf0, 0x3d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0xa5, 0x91, 0x61, 0x22, 0x7e, 0x00, + 0xab, 0x16, 0x19, 0xd2, 0x09, 0xd1, 0x81, 0xeb, 0x50, 0x18, 0x78, 0x0e, 0x79, 0x17, 0x7e, 0x53, + 0x11, 0x04, 0xfe, 0x1e, 0xac, 0xe8, 0x50, 0x6e, 0xce, 0x7d, 0xa8, 0x7a, 0xe4, 0xed, 0x91, 0x34, + 0xda, 0x8a, 0xd3, 0x9a, 0xe2, 0xe2, 0x4f, 0x60, 0xcd, 0x22, 0x3d, 0x9f, 0x04, 0x7d, 0x3d, 0x7e, + 0x33, 0xf6, 0xf9, 0x26, 0xdc, 0x6c, 0x11, 0xa6, 0x89, 0xcf, 0x87, 0x7f, 0x0e, 0x1f, 0xb4, 0x08, + 0x3b, 0x76, 0x69, 0xc7, 0x76, 0x8f, 0xf4, 0xf0, 0x69, 0x83, 0xbf, 0x23, 0x83, 0xac, 0x06, 0xbf, + 0xa4, 0xf0, 0x97, 0x70, 0xbb, 0x45, 0xc4, 0x06, 0x99, 0x62, 0x99, 0xbb, 0x69, 0xca, 0x72, 0x09, + 0x65, 0x45, 0x28, 0x34, 0x86, 0x23, 0x76, 0xb9, 0xf7, 0x87, 0x65, 0x28, 0xaa, 0x47, 0x12, 0x3a, + 0x84, 0x4a, 0xdb, 0xb7, 0xbb, 0x17, 0xf2, 0x73, 0x1b, 0x32, 0xa7, 0xbe, 0xc0, 0xa9, 0xbd, 0xea, + 0x1b, 0x19, 0x2b, 0xfc, 0x26, 0xba, 0xf0, 0x2d, 0x03, 0x7d, 0x05, 0xb5, 0xf4, 0x57, 0x24, 0x84, + 0x35, 0xfc, 0x8c, 0x8f, 0x64, 0xf5, 0xed, 0xb9, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0xca, + 0x82, 0xf4, 0x87, 0x70, 0xea, 0x2b, 0x4d, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0x5e, 0x8b, 0x0e, 0xae, + 0x7f, 0x7e, 0x41, 0x1f, 0x26, 0xb7, 0xce, 0xf8, 0x68, 0x53, 0xbf, 0x3b, 0x0f, 0x22, 0x15, 0xb7, + 0xa1, 0x9a, 0xfc, 0x88, 0x80, 0x74, 0x97, 0x32, 0x3f, 0x52, 0xd4, 0xb7, 0xe6, 0x20, 0x22, 0xad, + 0xc9, 0xfd, 0xd0, 0xf6, 0x4c, 0x53, 0xb2, 0xb4, 0x66, 0x7c, 0x58, 0xc0, 0x0b, 0xe8, 0xe7, 0x80, + 0xa6, 0x5f, 0xc6, 0xe8, 0xde, 0x75, 0x5e, 0xf1, 0x75, 0x7c, 0x05, 0x4a, 0xee, 0xf0, 0x53, 0x58, + 0x9d, 0x7a, 0xd3, 0xa1, 0x6f, 0x68, 0xa2, 0xb3, 0xde, 0xca, 0xf5, 0x0f, 0xe7, 0x83, 0x22, 0x07, + 0xa6, 0x9f, 0x56, 0x09, 0x07, 0x66, 0x3e, 0xe2, 0x12, 0x0e, 0xcc, 0x78, 0x9f, 0xc9, 0x5a, 0x0b, + 0xaf, 0xf4, 0x89, 0x5a, 0x4b, 0x5d, 0xfd, 0x13, 0xb5, 0x96, 0x78, 0x03, 0xe0, 0x05, 0xf4, 0x04, + 0x8a, 0x8a, 0x85, 0x36, 0xa7, 0x61, 0xa1, 0x86, 0x5b, 0x59, 0x4b, 0x52, 0xc1, 0x19, 0x2c, 0xe9, + 0xb7, 0x1f, 0xb4, 0x35, 0xf3, 0x6d, 0x28, 0x55, 0xcd, 0x7d, 0x3b, 0x46, 0x4e, 0x89, 0x49, 0x9e, + 0x76, 0x4a, 0xbf, 0xd3, 0xa4, 0x9d, 0x8a, 0x47, 0x3f, 0x5e, 0x40, 0x3d, 0xf1, 0xfd, 0x72, 0x6a, + 0x8a, 0xa1, 0xfb, 0x49, 0x99, 0x59, 0x13, 0xbf, 0x7e, 0xef, 0x4a, 0x9c, 0xdc, 0xa7, 0x01, 0xe5, + 0x68, 0x9a, 0xa0, 0xdb, 0x9a, 0x50, 0x7a, 0xae, 0xd5, 0x37, 0xb3, 0x17, 0xa5, 0x9a, 0x47, 0x50, + 0x54, 0x73, 0x25, 0x91, 0x83, 0xe4, 0xac, 0xa9, 0xd7, 0xf4, 0xcf, 0x09, 0xbc, 0x31, 0xe2, 0x05, + 0xf4, 0x0c, 0x20, 0x1e, 0x20, 0xe8, 0x4e, 0x62, 0x76, 0xa5, 0x46, 0x50, 0xbd, 0x3e, 0x63, 0x35, + 0x0c, 0xfb, 0x92, 0x3e, 0x4f, 0x12, 0x69, 0xcc, 0x18, 0x34, 0x99, 0xd6, 0x3c, 0x85, 0x6a, 0x72, + 0xcc, 0x24, 0x1a, 0x41, 0xe6, 0x04, 0xca, 0xd4, 0xf3, 0x0a, 0x36, 0xb2, 0xe7, 0x0f, 0xda, 0x49, + 0xea, 0x9b, 0x3d, 0xa2, 0x32, 0xf5, 0x5a, 0xb0, 0x9e, 0x35, 0x9e, 0x12, 0x65, 0x31, 0x67, 0x7e, + 0x65, 0xe9, 0x3c, 0x78, 0xf4, 0xd7, 0xf7, 0x5b, 0xc6, 0x3f, 0xde, 0x6f, 0x19, 0xff, 0x7a, 0xbf, + 0x65, 0xfc, 0xfe, 0xdf, 0x5b, 0x0b, 0x80, 0xbb, 0xfd, 0xdd, 0x2e, 0xf1, 0xbd, 0x5d, 0xdb, 0x1d, + 0x74, 0xc9, 0x2e, 0xdd, 0xdb, 0x0d, 0x65, 0xfc, 0x51, 0x37, 0x20, 0xfe, 0x84, 0xf8, 0x5f, 0xe5, + 0x46, 0x9d, 0xce, 0x0d, 0xf1, 0xe7, 0xd7, 0x67, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x01, 0xeb, + 0xd2, 0x9a, 0x16, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3194,6 +3356,8 @@ type ControlClient interface { RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3398,6 +3562,24 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe return out, nil } +func (c *controlClient) SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultBranch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultBranch", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. type ControlServer interface { TrackStatus(*StatusRequest, Control_TrackStatusServer) error @@ -3419,68 +3601,8 @@ type ControlServer interface { RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) -} - -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") + SetGlobalDefaultBranch(context.Context, *SetGlobalDefaultBranchRequest) (*Empty, error) + SetRepoDefaultBranch(context.Context, *SetRepoDefaultBranchRequest) (*Empty, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -3832,6 +3954,42 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Control_SetGlobalDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultBranchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultBranch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultBranch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultBranch(ctx, req.(*SetGlobalDefaultBranchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultBranchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultBranch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultBranch", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultBranch(ctx, req.(*SetRepoDefaultBranchRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), @@ -3908,6 +4066,14 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "SetDefaultRepo", Handler: _Control_SetDefaultRepo_Handler, }, + { + MethodName: "SetGlobalDefaultBranch", + Handler: _Control_SetGlobalDefaultBranch_Handler, + }, + { + MethodName: "SetRepoDefaultBranch", + Handler: _Control_SetRepoDefaultBranch_Handler, + }, }, Streams: []grpc.StreamDesc{ { @@ -3922,7 +4088,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3930,26 +4096,20 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3957,26 +4117,20 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -3984,47 +4138,38 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.StatusUpdates { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4032,61 +4177,46 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) } if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } + nn1, err := m.Event.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } + i += nn1 } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + i := 0 if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) + n2, err := m.MesosHeartbeat.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n2 } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4094,26 +4224,20 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4121,62 +4245,53 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if m.Minor != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + if m.Patch != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) } if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i += copy(dAtA[i:], m.Build) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + if len(m.ProductName) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i += copy(dAtA[i:], m.ProductName) } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if len(m.VersionStr) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i += copy(dAtA[i:], m.VersionStr) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4184,74 +4299,63 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if m.EnvironmentsCount != 0 { + dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + if m.TasksCount != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if m.HostsCount != 0 { + dAtA[i] = 0x28 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + if len(m.InstanceName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i += copy(dAtA[i:], m.InstanceName) } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.Version != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) + n3, err := m.Version.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n3 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4259,33 +4363,26 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) + i += copy(dAtA[i:], m.Reason) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4293,26 +4390,20 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4320,26 +4411,20 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4347,47 +4432,38 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i += copy(dAtA[i:], m.FrameworkId) } if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Environments { dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4395,73 +4471,61 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 + if len(m.CreatedWhen) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i += copy(dAtA[i:], m.CreatedWhen) } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.RootRole) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i += copy(dAtA[i:], m.RootRole) } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x30 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4469,33 +4533,26 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i += copy(dAtA[i:], m.WorkflowTemplate) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4503,38 +4560,30 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n4, err := m.Environment.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n4 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4542,33 +4591,26 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4576,50 +4618,40 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) + n5, err := m.Environment.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n5 } if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) + n6, err := m.Workflow.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n6 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4627,38 +4659,31 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x10 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4666,45 +4691,37 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.CurrentRunNumber != 0 { + dAtA[i] = 0x18 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4712,57 +4729,48 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) + } + if len(m.Operations) > 0 { + for _, msg := range m.Operations { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if m.ReconfigureAll { - i-- + dAtA[i] = 0x18 + i++ if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4770,38 +4778,31 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) } if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) + i += copy(dAtA[i:], m.RoleName) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4809,54 +4810,44 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.FailedOperations) > 0 { + for _, msg := range m.FailedOperations { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4864,43 +4855,36 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i += copy(dAtA[i:], m.Id) } if m.KeepTasks { - i-- + dAtA[i] = 0x10 + i++ if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4908,38 +4892,30 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) + n7, err := m.CleanupTasksReply.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n7 + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -4947,83 +4923,70 @@ func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { } func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Locked { + dAtA[i] = 0x10 + i++ + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } - i-- - dAtA[i] = 0x3a + i++ } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a + if len(m.TaskId) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) } if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a + if len(m.State) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.ClassName) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i += copy(dAtA[i:], m.ClassName) + } + if m.DeploymentInfo != nil { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) + n8, err := m.DeploymentInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x10 + i += n8 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5031,54 +4994,44 @@ func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Hostname) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i += copy(dAtA[i:], m.Hostname) } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 + if len(m.AgentId) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i += copy(dAtA[i:], m.AgentId) } if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i += copy(dAtA[i:], m.OfferId) } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 + if len(m.ExecutorId) > 0 { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i += copy(dAtA[i:], m.ExecutorId) } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5086,26 +5039,20 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5113,40 +5060,32 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { } func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Tasks { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5154,33 +5093,26 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { } func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i += copy(dAtA[i:], m.TaskId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5188,38 +5120,30 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { } func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) + n9, err := m.Task.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n9 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5227,40 +5151,32 @@ func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i += copy(dAtA[i:], m.ControlMode) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5268,68 +5184,72 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { } func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 + if len(m.Env) > 0 { + for _, s := range m.Env { + dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } if m.Shell { - i-- + dAtA[i] = 0x10 + i++ if m.Shell { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa + if len(m.Value) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + dAtA[i] = 0x22 + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if len(m.User) > 0 { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i += copy(dAtA[i:], m.User) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5337,47 +5257,38 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { } func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i += copy(dAtA[i:], m.Type) } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.Target) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i += copy(dAtA[i:], m.Target) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5385,104 +5296,86 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { } func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.ShortInfo != nil { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) + n10, err := m.ShortInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x2a + i += n10 } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 + if m.ClassInfo != nil { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) + n11, err := m.ClassInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } + i += n11 } if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.InboundChannels { dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if len(m.OutboundChannels) > 0 { + for _, msg := range m.OutboundChannels { + dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) if err != nil { return 0, err } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + i += n } - i-- - dAtA[i] = 0xa } - return len(dAtA) - i, nil + if m.CommandInfo != nil { + dAtA[i] = 0x2a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) + n12, err := m.CommandInfo.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n12 + } + if len(m.TaskPath) > 0 { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i += copy(dAtA[i:], m.TaskPath) + } + if len(m.EnvId) > 0 { + dAtA[i] = 0x3a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5490,35 +5383,35 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- + for _, s := range m.TaskIds { dAtA[i] = 0xa + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5526,54 +5419,44 @@ func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { } func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.KilledTasks) > 0 { + for _, msg := range m.KilledTasks { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i += n } } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if len(m.RunningTasks) > 0 { + for _, msg := range m.RunningTasks { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5581,40 +5464,32 @@ func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i += copy(dAtA[i:], m.EnvId) } if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i += copy(dAtA[i:], m.PathSpec) } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5622,77 +5497,71 @@ func (m *RoleInfo) Marshal() (dAtA []byte, err error) { } func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } + if len(m.Status) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i += copy(dAtA[i:], m.Status) + } + if len(m.State) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- dAtA[i] = 0x22 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i += copy(dAtA[i:], m.FullPath) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + dAtA[i] = 0x2a + i++ + l = len(s) + for l >= 1<<7 { + dAtA[i] = uint8(uint64(l)&0x7f | 0x80) + l >>= 7 + i++ + } + dAtA[i] = uint8(l) + i++ + i += copy(dAtA[i:], s) + } } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 + if len(m.Roles) > 0 { + for _, msg := range m.Roles { + dAtA[i] = 0x32 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n + } } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5700,40 +5569,32 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { } func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Roles { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5741,60 +5602,52 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.RepoPattern) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i += copy(dAtA[i:], m.RepoPattern) } - if m.AllTags { - i-- - if m.AllTags { + if len(m.RevisionPattern) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i += copy(dAtA[i:], m.RevisionPattern) + } + if m.AllBranches { + dAtA[i] = 0x18 + i++ + if m.AllBranches { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x20 + i++ } - if m.AllBranches { - i-- - if m.AllBranches { + if m.AllTags { + dAtA[i] = 0x20 + i++ + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x18 + i++ } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5802,47 +5655,38 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { } func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a + if len(m.Repo) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i += copy(dAtA[i:], m.Repo) } if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i += copy(dAtA[i:], m.Template) } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa + if len(m.Revision) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5850,40 +5694,32 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { } func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.WorkflowTemplates { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5891,26 +5727,20 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { } func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RepoInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5918,43 +5748,42 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { } func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) } if m.Default { - i-- + dAtA[i] = 0x10 + i++ if m.Default { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x10 + i++ } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + if len(m.DefaultBranch) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) + i += copy(dAtA[i:], m.DefaultBranch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -5962,40 +5791,32 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Repos { dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6003,33 +5824,26 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i += copy(dAtA[i:], m.Name) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6037,31 +5851,25 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6069,33 +5877,26 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i += copy(dAtA[i:], m.NewDefaultRepo) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6103,31 +5904,25 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6135,31 +5930,84 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if m.Index != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + dAtA = make([]byte, size) + n, err := m.MarshalTo(dAtA) + if err != nil { + return nil, err + } + return dAtA[:n], nil } -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) +func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { + var i int _ = i var l int _ = l + if len(m.Branch) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) + i += copy(dAtA[i:], m.Branch) + } if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *SetRepoDefaultBranchRequest) 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 *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) } - return len(dAtA) - i, nil + if len(m.Branch) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) + i += copy(dAtA[i:], m.Branch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -6167,32 +6015,24 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { } func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -7131,6 +6971,10 @@ func (m *RepoInfo) Size() (n int) { if m.Default { n += 2 } + l = len(m.DefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7155,13 +6999,44 @@ func (m *ListReposReply) Size() (n int) { return n } -func (m *AddRepoRequest) Size() (n int) { +func (m *AddRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoReply) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) + l = len(m.NewDefaultRepo) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7171,7 +7046,7 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *RemoveRepoRequest) Size() (n int) { +func (m *RefreshReposRequest) Size() (n int) { if m == nil { return 0 } @@ -7186,15 +7061,14 @@ func (m *RemoveRepoRequest) Size() (n int) { return n } -func (m *RemoveRepoReply) Size() (n int) { +func (m *SetDefaultRepoRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -7202,14 +7076,15 @@ func (m *RemoveRepoReply) Size() (n int) { return n } -func (m *RefreshReposRequest) Size() (n int) { +func (m *SetGlobalDefaultBranchRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + l = len(m.Branch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -7217,7 +7092,7 @@ func (m *RefreshReposRequest) Size() (n int) { return n } -func (m *SetDefaultRepoRequest) Size() (n int) { +func (m *SetRepoDefaultBranchRequest) Size() (n int) { if m == nil { return 0 } @@ -7226,6 +7101,10 @@ func (m *SetDefaultRepoRequest) Size() (n int) { if m.Index != 0 { n += 1 + sovO2Control(uint64(m.Index)) } + l = len(m.Branch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7245,7 +7124,14 @@ func (m *Empty) Size() (n int) { } func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -12589,6 +12475,38 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } } m.Default = bool(v != 0) + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -13093,6 +13011,197 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *SetGlobalDefaultBranchRequest) 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 ErrIntOverflowO2Control + } + 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: SetGlobalDefaultBranchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Branch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetRepoDefaultBranchRequest) 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 ErrIntOverflowO2Control + } + 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: SetRepoDefaultBranchRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetRepoDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) + } + m.Index = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Index |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Branch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -13150,7 +13259,6 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 - depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13182,8 +13290,10 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } + return iNdEx, nil case 1: iNdEx += 8 + return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13204,30 +13314,55 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + return iNdEx, nil case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowO2Control + } + 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 := skipO2Control(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } } - depth-- + 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) } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } } - return 0, io.ErrUnexpectedEOF + panic("unreachable") } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") ) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 2e7f5eab7..a6e910f6b 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -61,6 +61,8 @@ service Control { rpc RemoveRepo(RemoveRepoRequest) returns (RemoveRepoReply) {} rpc RefreshRepos(RefreshReposRequest) returns (Empty) {} rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} + rpc SetGlobalDefaultBranch(SetGlobalDefaultBranchRequest) returns (Empty) {} + rpc SetRepoDefaultBranch(SetRepoDefaultBranchRequest) returns (Empty) {} } //////////////////////////////////////// @@ -302,6 +304,7 @@ message ListReposRequest {} message RepoInfo { string name = 1; bool default = 2; + string defaultBranch = 3; } message ListReposReply { @@ -328,6 +331,15 @@ message SetDefaultRepoRequest { int32 index = 1; } +message SetGlobalDefaultBranchRequest { + string branch = 1; +} + +message SetRepoDefaultBranchRequest { + int32 index = 1; + string branch = 2; +} + message Empty { } \ No newline at end of file diff --git a/core/repos/repo.go b/core/repos/repo.go index 1271a7567..2aaaf440f 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,6 +26,7 @@ package repos import ( "errors" + "fmt" "github.com/gobwas/glob" "github.com/spf13/viper" "gopkg.in/src-d/go-git.v4" @@ -39,6 +40,7 @@ type Repo struct { User string RepoName string Revision string + DefaultBranch string Hash string Default bool } @@ -49,12 +51,16 @@ func NewRepo(repoPath string) (*Repo, error) { var repoUrlSlice []string var revision string + + //TODO: Decide between global and per-repo default branch + defaultBranch := viper.GetString("globalDefaultBranch") + if len(revSlice) == 2 { //revision specified repoUrlSlice = strings.Split(revSlice[0], "/") revision = revSlice[1] - } else if len(revSlice) == 1{ //no revision specified + } else if len(revSlice) == 1 { //no revision specified repoUrlSlice = strings.Split(revSlice[0], "/") - revision = "master" + revision = defaultBranch } else { return &Repo{}, errors.New("Repo path resolution failed") } @@ -63,8 +69,10 @@ func NewRepo(repoPath string) (*Repo, error) { return &Repo{}, errors.New("Repo path resolution failed") } + fmt.Print(repoPath + " " + revision) + return &Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, "", false}, nil + repoUrlSlice[2], revision, defaultBranch, "", false}, nil } func (r *Repo) GetIdentifier() string { @@ -275,4 +283,18 @@ func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]str }) return revisions, nil +} + +func (r* Repo) updateDefaultBranch(branch string) error { + var refs []string + refs = append(refs, refRemotePrefix) // Only search for branches, not tags + revisionsMatched, err := r.getRevisions(branch, refs) + if err != nil{ + return err + } else if len(revisionsMatched) == 0 { + return errors.New("branch not found") + } + + r.DefaultBranch = branch + return nil } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 992648d34..5dccb2547 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -73,6 +73,14 @@ func initializeRepos(service *confsys.Service) *RepoManager { rm := RepoManager{repoList: map[string]*Repo {}} rm.cService = service + // Get default branch + defaultBranch, err := rm.cService.GetDefaultBranch() + if err != nil { + log.Warning("Failed to parse default_branch from backend") + defaultBranch = viper.GetString("defaultBranch") + } + viper.Set("globalDefaultBranch", defaultBranch) + // Get default repo defaultRepo, err := rm.cService.GetDefaultRepo() if err != nil { @@ -142,6 +150,10 @@ func (manager *RepoManager) AddRepo(repoPath string) error { repo, err := NewRepo(repoPath) + // TODO: Handle the default revision here, within rm + // OR + // TODO: Handle the default revision within Repo + if err != nil { return err } @@ -403,6 +415,32 @@ func (manager *RepoManager) UpdateDefaultRepo(repoPath string) error { //unused return nil } +func (manager *RepoManager) SetGlobalDefaultBranch(branch string) error { + + // Update default_branch backend + err := manager.cService.NewDefaultBranch(branch) + if err != nil { + log.Warning("Failed to update default_branch backend: ", err) + return err + } + + viper.Set("globalDefaultBranch", branch) + return nil +} + +func (manager *RepoManager) UpdateDefaultBranchByIndex(index int, branch string) error { + orderedRepoList := manager.GetOrderedRepolistKeys() + if index >= len(orderedRepoList) { + return errors.New("repository index out of range") + } + repo := manager.repoList[orderedRepoList[index]] + err := repo.updateDefaultBranch(branch) + if err != nil { + return errors.New("Could not update default branch for " + repo.GetIdentifier() + " : " + err.Error()) + } + return nil +} + func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (err error) { reposRequired := make(map[Repo]bool) for _, taskClass := range taskClassesRequired { diff --git a/core/server.go b/core/server.go index 2e7648c27..a5560b247 100644 --- a/core/server.go +++ b/core/server.go @@ -524,7 +524,7 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p for i, repoName := range keys { repo := repoList[repoName] - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default} + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultBranch: repo.DefaultBranch} } return &pb.ListReposReply{Repos: repoInfos}, nil @@ -594,4 +594,34 @@ func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRe } return &pb.Empty{}, nil -} \ No newline at end of file +} + +func (m *RpcServer) SetGlobalDefaultBranch(cxt context.Context, req *pb.SetGlobalDefaultBranchRequest) (*pb.Empty, error) { + m.logMethod() + + if req == nil { + return nil, status.New(codes.InvalidArgument, "received nil request").Err() + } + + err := the.RepoManager().SetGlobalDefaultBranch(req.Branch) + if err != nil { + return nil, err + } + + return &pb.Empty{}, nil +} + +func (m *RpcServer) SetRepoDefaultBranch(cxt context.Context, req *pb.SetRepoDefaultBranchRequest) (*pb.Empty, error) { + m.logMethod() + + if req == nil { + return nil, status.New(codes.InvalidArgument, "received nil request").Err() + } + + err := the.RepoManager().UpdateDefaultBranchByIndex(int(req.Index), req.Branch) + if err != nil { + return nil, err + } + + return &pb.Empty{}, nil +} diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index d452f8ed8..7f71e6750 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,11 +8,8 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" io "io" math "math" - math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -24,7 +21,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion3 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package type StateChangeTrigger int32 @@ -127,7 +124,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -168,7 +165,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -221,7 +218,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -261,7 +258,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -308,7 +305,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -354,7 +351,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -394,7 +391,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -442,7 +439,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -498,7 +495,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -562,7 +559,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) + n, err := m.MarshalTo(b) if err != nil { return nil, err } @@ -790,23 +787,6 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } -// UnimplementedOccServer can be embedded to have forward compatible implementations. -type UnimplementedOccServer struct { -} - -func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") -} -func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") -} - func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -920,7 +900,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -928,26 +908,20 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -955,38 +929,31 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -994,26 +961,20 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1021,31 +982,25 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1053,38 +1008,30 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if m.Event != nil { - { - size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) + n1, err := m.Event.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n1 } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1092,26 +1039,20 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1119,33 +1060,26 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) } - return len(dAtA) - i, nil + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1153,40 +1087,32 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i += copy(dAtA[i:], m.Key) } if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i-- dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) + i += copy(dAtA[i:], m.Value) } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1194,54 +1120,44 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if len(m.SrcState) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i += copy(dAtA[i:], m.SrcState) + } + if len(m.TransitionEvent) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i += copy(dAtA[i:], m.TransitionEvent) } if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- + for _, msg := range m.Arguments { dAtA[i] = 0x1a + i++ + i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) + n, err := msg.MarshalTo(dAtA[i:]) + if err != nil { + return 0, err + } + i += n } } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x12 - } - if len(m.SrcState) > 0 { - i -= len(m.SrcState) - copy(dAtA[i:], m.SrcState) - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i-- - dAtA[i] = 0xa + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + n, err := m.MarshalTo(dAtA) if err != nil { return nil, err } @@ -1249,61 +1165,51 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) + var i int _ = i var l int _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.Trigger != 0 { + dAtA[i] = 0x8 + i++ + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + } + if len(m.State) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i += copy(dAtA[i:], m.State) + } + if len(m.TransitionEvent) > 0 { + dAtA[i] = 0x1a + i++ + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i += copy(dAtA[i:], m.TransitionEvent) } if m.Ok { - i-- + dAtA[i] = 0x20 + i++ if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i-- - dAtA[i] = 0x20 - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x1a + i++ } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Trigger != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - i-- - dAtA[i] = 0x8 + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + return i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { - offset -= sovOcc(v) - base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return base + return offset + 1 } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1480,7 +1386,14 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -2431,7 +2344,6 @@ func (m *TransitionReply) Unmarshal(dAtA []byte) error { func skipOcc(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 - depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -2463,8 +2375,10 @@ func skipOcc(dAtA []byte) (n int, err error) { break } } + return iNdEx, nil case 1: iNdEx += 8 + return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -2485,30 +2399,55 @@ func skipOcc(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthOcc } iNdEx += length + if iNdEx < 0 { + return 0, ErrInvalidLengthOcc + } + return iNdEx, nil case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOcc + for { + var innerWire uint64 + var start int = iNdEx + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOcc + } + 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 := skipOcc(dAtA[start:]) + if err != nil { + return 0, err + } + iNdEx = start + next + if iNdEx < 0 { + return 0, ErrInvalidLengthOcc + } } - depth-- + 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) } - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - if depth == 0 { - return iNdEx, nil - } } - return 0, io.ErrUnexpectedEOF + panic("unreachable") } var ( - ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") + ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") ) From 9ba586b0a1fec393b8bf92934cbdc3fba7c98ce9 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 4 Feb 2020 15:40:56 +0100 Subject: [PATCH 0081/2352] [core+coconut] Add default bracnh option for new repos and improve API and coconut --- coconut/control/control.go | 32 +- coconut/protos/o2control.pb.go | 590 ++++++++++++++++++++++++--------- core/protos/o2control.pb.go | 590 ++++++++++++++++++++++++--------- core/protos/o2control.proto | 8 +- core/repos/repo.go | 13 +- core/repos/repomanager.go | 109 ++++-- core/server.go | 9 +- core/task/manager.go | 2 +- 8 files changed, 990 insertions(+), 363 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index acd165a0c..0b6db4734 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -622,17 +622,21 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "No repositories found.") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "repository", "default branch", "default"}) + table.SetHeader([]string{"id", "repository", "default", "default branch", "global default"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlueColor} - table.SetHeaderColor(fg, fg, fg, fg) + table.SetHeaderColor(fg, fg, fg, fg, fg) for i, root := range roots { defaultTick := "" + defaultBranchTick := "" if root.GetDefault() { defaultTick = blue("YES") } - table.Append([]string{strconv.Itoa(i), root.GetName(), root.GetDefaultBranch(), defaultTick}) + if root.GetIsGlobalDefaultBranch() { + defaultBranchTick = blue("YES") + } + table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick, root.GetDefaultBranch(), defaultBranchTick}) } fmt.Fprintf(o, "Git repositories used as configuration sources:\n\n") table.Render() @@ -643,18 +647,32 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, // AddRepo add a new repository to the available git repositories used for configuration and checks it out. func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - if len(args) != 1 { - err = errors.New(fmt.Sprintf("accepts 1 arg, received %d", len(args))) + + var name string + defaultBranch := "" + if len(args) == 1 { + name = args[0] + } else if len(args) == 2 { + name = args[0] + defaultBranch = args[1] + } else if len(args) != 1 { + err = errors.New(fmt.Sprintf("accepts 1 or 2 args, received %d", len(args))) return err } - _, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: args[0]}, grpc.EmptyCallOption{}) + var response *pb.AddRepoReply + response, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: name, DefaultBranch: defaultBranch}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Cannot add repository.") return err } fmt.Fprintln(o, "Repository succesfully added.") + if response.GetNewDefaultBranch() != defaultBranch { + fmt.Fprintln(o, "Default branch specified not present in repository;") + //TODO: It's not clear here if it's the global default or master + fmt.Fprintln(o, "Fallback to default branch:", blue(response.GetNewDefaultBranch())) + } return nil } @@ -719,7 +737,7 @@ func RefreshRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comman // It also updates the backend (consul or file) which holds a record for the default repository // which is persistent across core executions. func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { - if len(args) < 1 && len(args) > 2 { + if len(args) != 1 { err := errors.New(fmt.Sprintf("accepts 1 arg, received %d", len(args))) return err } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 4d75bb919..da359ca5f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2634,12 +2634,13 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` + IsGlobalDefaultBranch bool `protobuf:"varint,4,opt,name=isGlobalDefaultBranch,proto3" json:"isGlobalDefaultBranch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2696,6 +2697,13 @@ func (m *RepoInfo) GetDefaultBranch() string { return "" } +func (m *RepoInfo) GetIsGlobalDefaultBranch() bool { + if m != nil { + return m.IsGlobalDefaultBranch + } + return false +} + type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2745,6 +2753,7 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultBranch string `protobuf:"bytes,2,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2790,6 +2799,60 @@ func (m *AddRepoRequest) GetName() string { return "" } +func (m *AddRepoRequest) GetDefaultBranch() string { + if m != nil { + return m.DefaultBranch + } + return "" +} + +type AddRepoReply struct { + NewDefaultBranch string `protobuf:"bytes,1,opt,name=newDefaultBranch,proto3" json:"newDefaultBranch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } +func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } +func (*AddRepoReply) ProtoMessage() {} +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} +} +func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AddRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoReply.Merge(m, src) +} +func (m *AddRepoReply) XXX_Size() int { + return m.Size() +} +func (m *AddRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoReply.DiscardUnknown(m) +} + +var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo + +func (m *AddRepoReply) GetNewDefaultBranch() string { + if m != nil { + return m.NewDefaultBranch + } + return "" +} + type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2801,7 +2864,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2848,7 +2911,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2895,7 +2958,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,7 +3005,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2989,7 +3052,7 @@ func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultB func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3037,7 +3100,7 @@ func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranc func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultBranchRequest) ProtoMessage() {} func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3090,7 +3153,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3168,6 +3231,7 @@ func init() { proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") + proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") @@ -3180,149 +3244,151 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2262 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x92, 0x75, 0xbc, 0x4d, - 0x2a, 0xeb, 0xec, 0x2e, 0x0e, 0x78, 0x29, 0x36, 0x84, 0x85, 0xe0, 0x3f, 0x8a, 0x63, 0x36, 0xb6, - 0x52, 0x23, 0x25, 0x29, 0xb6, 0x0a, 0xc2, 0x48, 0xd3, 0xb2, 0xb4, 0x1e, 0x4d, 0x8b, 0x99, 0x96, - 0x12, 0x1f, 0xb8, 0x71, 0xa3, 0x28, 0x0e, 0x5c, 0x28, 0x6e, 0x14, 0xc5, 0x91, 0xef, 0xc1, 0x85, - 0x02, 0xbe, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x21, 0xa8, 0xfe, 0x33, 0x33, 0x3d, 0xa3, 0x91, 0xec, - 0x2a, 0x6e, 0x7a, 0xaf, 0x7f, 0xef, 0xf5, 0xfb, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x63, 0xe4, 0x53, - 0x46, 0x83, 0x87, 0x74, 0xaf, 0x4b, 0x3d, 0xe6, 0x53, 0x77, 0x57, 0x30, 0x50, 0x39, 0x62, 0xe0, - 0x0d, 0x58, 0x6f, 0x4c, 0x88, 0xc7, 0xde, 0x9c, 0x92, 0x80, 0x06, 0xcf, 0x88, 0xed, 0xb3, 0x0e, - 0xb1, 0x19, 0x5e, 0x81, 0xe5, 0x16, 0xb3, 0xd9, 0x38, 0xb0, 0xc8, 0x2f, 0xc6, 0x24, 0x60, 0xb8, - 0x03, 0x95, 0x90, 0x31, 0x72, 0x2f, 0xd1, 0x3a, 0x14, 0x02, 0x66, 0x33, 0x62, 0x1a, 0xdb, 0xc6, - 0x4e, 0xd9, 0x92, 0x04, 0xfa, 0x01, 0x2c, 0x07, 0x02, 0xf4, 0x72, 0xe4, 0xd8, 0x8c, 0x04, 0x66, - 0x6e, 0x7b, 0x71, 0xa7, 0xb2, 0x77, 0x6b, 0x37, 0xb6, 0xa0, 0xa5, 0xad, 0x5b, 0x49, 0x34, 0xfe, - 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x0c, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0xec, 0x52, 0xdd, 0xfb, - 0x60, 0x86, 0x9e, 0xdd, 0xe7, 0x1c, 0x64, 0x49, 0x2c, 0x3a, 0x81, 0xea, 0x30, 0xe1, 0x8c, 0x99, - 0xdb, 0x36, 0x76, 0x2a, 0x7b, 0x77, 0x35, 0xe9, 0x2c, 0x9f, 0x9f, 0x2d, 0x58, 0x29, 0x41, 0xfc, - 0x1d, 0x28, 0x08, 0xd5, 0xa8, 0x0c, 0x85, 0xa3, 0xc6, 0xc1, 0xcb, 0xe3, 0xda, 0x02, 0x2a, 0x41, - 0xfe, 0xe4, 0xec, 0x69, 0xb3, 0x66, 0xa0, 0x0a, 0x14, 0x5f, 0xef, 0x5b, 0x67, 0x27, 0x67, 0xc7, - 0xb5, 0x1c, 0x47, 0x34, 0x2c, 0xab, 0x69, 0xd5, 0x16, 0x0f, 0x8a, 0x50, 0x10, 0xfa, 0xf1, 0x26, - 0xdc, 0x3a, 0x26, 0xec, 0xa9, 0x6f, 0x0f, 0xc9, 0x5b, 0xea, 0x5f, 0x9c, 0x78, 0x3d, 0x1a, 0x86, - 0xf3, 0x4f, 0x06, 0x14, 0x5f, 0x11, 0x3f, 0x18, 0x50, 0x8f, 0xc7, 0x72, 0x68, 0x7f, 0x4d, 0x7d, - 0xe1, 0x65, 0xc1, 0x92, 0x84, 0xe0, 0x0e, 0x3c, 0xea, 0x0b, 0xeb, 0x39, 0x97, 0x13, 0x9c, 0x3b, - 0xb2, 0x59, 0xb7, 0x6f, 0x2e, 0x4a, 0xae, 0x20, 0x38, 0xb7, 0x33, 0x1e, 0xb8, 0x8e, 0x99, 0x97, - 0xd9, 0x10, 0x04, 0xda, 0x86, 0xca, 0xc8, 0xa7, 0xce, 0xb8, 0xcb, 0xce, 0xec, 0x21, 0x31, 0x0b, - 0x62, 0x4d, 0x67, 0xa1, 0x2d, 0x80, 0x89, 0x34, 0xa2, 0xc5, 0x7c, 0xf3, 0x86, 0x00, 0x68, 0x1c, - 0xfc, 0xdb, 0x1c, 0xdc, 0x9c, 0xf6, 0x80, 0xe7, 0x7f, 0x1b, 0x2a, 0xbd, 0x88, 0xeb, 0xa8, 0x2a, - 0xd0, 0x59, 0xe8, 0x53, 0x58, 0x25, 0xde, 0x64, 0xe0, 0x53, 0x6f, 0x48, 0x3c, 0x16, 0x1c, 0xd2, - 0xb1, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0xdc, 0x12, 0x66, 0x07, 0x17, 0x0a, 0x26, 0x9d, 0xd3, 0x38, - 0x71, 0xbd, 0xe5, 0xf5, 0x7a, 0xdb, 0x02, 0xe8, 0xd3, 0x20, 0x54, 0x5e, 0x90, 0x52, 0x31, 0x07, - 0x61, 0x58, 0x1a, 0x78, 0x01, 0xb3, 0xbd, 0x2e, 0x11, 0x21, 0x90, 0x1e, 0x26, 0x78, 0xe8, 0x53, - 0x28, 0x2a, 0x8f, 0xcd, 0xa2, 0xa8, 0x13, 0xa4, 0xd5, 0x89, 0x4a, 0x91, 0x15, 0x42, 0xf0, 0x03, - 0x58, 0x69, 0x13, 0xdb, 0x77, 0xe8, 0x5b, 0x4f, 0xa5, 0x12, 0x6d, 0xc0, 0x0d, 0x9f, 0xd8, 0x01, - 0xf5, 0x54, 0x14, 0x14, 0xc5, 0x8f, 0x50, 0x0c, 0x1d, 0xb9, 0x97, 0xd8, 0x84, 0x8d, 0x63, 0xc2, - 0x1a, 0x9a, 0xef, 0x61, 0x35, 0xbc, 0x83, 0xf5, 0xa9, 0x95, 0xeb, 0x45, 0xf9, 0x87, 0xb0, 0xa4, - 0x07, 0x53, 0x1d, 0xb8, 0xba, 0x5e, 0xea, 0xf1, 0xb2, 0x48, 0x5f, 0x02, 0x8f, 0xff, 0x69, 0xc0, - 0x4a, 0x0a, 0x81, 0xaa, 0x90, 0x1b, 0x84, 0x9b, 0xe5, 0x06, 0xa2, 0x8e, 0xba, 0x3e, 0xb1, 0x19, - 0x71, 0x5e, 0xf7, 0x89, 0x27, 0x72, 0x58, 0xb6, 0x74, 0x56, 0x9c, 0x9d, 0x45, 0x3d, 0x3b, 0xbb, - 0x50, 0x10, 0x19, 0x34, 0xf3, 0xc2, 0x28, 0x53, 0x3f, 0xbd, 0x7d, 0xea, 0xb3, 0xb6, 0x1d, 0xc8, - 0x8a, 0x92, 0x30, 0x54, 0x87, 0x92, 0x4f, 0x29, 0xb3, 0xa8, 0x1b, 0x16, 0x6b, 0x44, 0xa3, 0x8f, - 0xa1, 0xd6, 0x1d, 0xfb, 0x3e, 0xf1, 0x98, 0x35, 0xf6, 0xce, 0xc6, 0xc3, 0x0e, 0x91, 0xf5, 0xba, - 0x6c, 0x4d, 0xf1, 0xf1, 0x21, 0xdc, 0x3c, 0x23, 0x6f, 0x35, 0xaf, 0xc2, 0x4c, 0x7d, 0x0c, 0x35, - 0x1e, 0xb6, 0x9e, 0x4b, 0xdf, 0xb6, 0xc9, 0x70, 0xe4, 0xc6, 0xfd, 0x6b, 0x8a, 0x8f, 0x5b, 0xb0, - 0x96, 0x56, 0xc2, 0x33, 0xf2, 0x05, 0x54, 0xb4, 0xf8, 0x09, 0xe9, 0xf9, 0xe1, 0xd6, 0xe1, 0xf8, - 0x23, 0x71, 0x9c, 0x32, 0x2c, 0x4b, 0x85, 0x1c, 0xff, 0xca, 0x80, 0xb5, 0x34, 0xf2, 0xff, 0xde, - 0x1e, 0x3d, 0x84, 0x52, 0xe8, 0xa7, 0xea, 0x89, 0x6b, 0x9a, 0x28, 0x8f, 0xb3, 0x90, 0x89, 0x40, - 0xf8, 0xef, 0x06, 0x6c, 0x1e, 0xca, 0xe5, 0xab, 0x8d, 0x46, 0x4f, 0x20, 0xcf, 0x2e, 0x47, 0x44, - 0xa8, 0xae, 0xee, 0x7d, 0xa2, 0xa9, 0x9e, 0xa9, 0x63, 0xb7, 0x39, 0xe2, 0x22, 0x96, 0x10, 0xc4, - 0x36, 0xdc, 0x90, 0x34, 0x6f, 0xb2, 0x67, 0xcd, 0xe6, 0x8b, 0xda, 0x02, 0x42, 0x50, 0x6d, 0xb5, - 0xf7, 0xad, 0xf6, 0x9b, 0xfd, 0xc3, 0xf6, 0xc9, 0xab, 0x93, 0xf6, 0x4f, 0x6a, 0x06, 0x5a, 0x85, - 0xe5, 0x56, 0xbb, 0xf9, 0x22, 0x66, 0xe5, 0xd0, 0x32, 0x94, 0x0f, 0x9b, 0x67, 0x4f, 0x4f, 0x8e, - 0x5f, 0x5a, 0x8d, 0xda, 0x22, 0xef, 0xc6, 0x56, 0xa3, 0xd5, 0x68, 0xd7, 0xf2, 0x68, 0x09, 0x4a, - 0xc7, 0xcd, 0x37, 0xb2, 0x37, 0x17, 0xf0, 0x05, 0xdc, 0xca, 0x32, 0x86, 0xc7, 0x36, 0xed, 0x4e, - 0x54, 0xd4, 0x39, 0xbd, 0xa8, 0xb3, 0x0a, 0x71, 0x71, 0x46, 0x21, 0xfe, 0xce, 0x00, 0xf3, 0x94, - 0x3a, 0x83, 0xde, 0xe5, 0xb5, 0xa2, 0x07, 0x74, 0x44, 0x7c, 0x9b, 0x0d, 0xa8, 0x17, 0x9e, 0xe3, - 0xbb, 0xd9, 0x99, 0x6d, 0x86, 0x38, 0x4b, 0x13, 0x41, 0xf7, 0xa1, 0xea, 0x93, 0x2e, 0xf5, 0x7a, - 0x83, 0xf3, 0xb1, 0x4f, 0xf6, 0x5d, 0x57, 0xd8, 0x55, 0xb2, 0x52, 0x5c, 0xfc, 0x47, 0x03, 0xd6, - 0xb3, 0x94, 0xa1, 0xc7, 0x2a, 0x7f, 0x72, 0xd8, 0xde, 0xbf, 0x62, 0xef, 0x44, 0xea, 0xe4, 0xd9, - 0x75, 0x65, 0x97, 0xcd, 0x85, 0x67, 0x57, 0xd2, 0xf8, 0xdb, 0x19, 0x69, 0x5d, 0x81, 0x8a, 0xd5, - 0x38, 0x6d, 0xbe, 0x6a, 0xbc, 0xb1, 0x9a, 0xcf, 0x79, 0xc6, 0x96, 0xa0, 0xb4, 0x7f, 0x74, 0x24, - 0xa9, 0x3c, 0xfe, 0xb5, 0x01, 0x1b, 0x19, 0x91, 0xe3, 0x69, 0xfa, 0x12, 0x6a, 0x3d, 0x7b, 0xe0, - 0x12, 0xa7, 0x19, 0x47, 0xcb, 0xb8, 0x5e, 0xb4, 0xa6, 0x04, 0x55, 0x12, 0x72, 0xd3, 0x39, 0xd7, - 0x1b, 0x19, 0x3e, 0x81, 0xcd, 0x23, 0x12, 0x30, 0x9f, 0x5e, 0x27, 0x8f, 0x77, 0xa0, 0x7c, 0x41, - 0xc8, 0xa8, 0x2d, 0x3a, 0x5f, 0x4e, 0x64, 0x20, 0x66, 0x60, 0x02, 0xb7, 0xb2, 0x54, 0x71, 0xc7, - 0x7e, 0x0c, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x42, 0x05, 0x53, 0x9d, 0xf0, 0x3b, 0xfa, 0x59, - 0x4a, 0x63, 0xac, 0x69, 0x31, 0xfc, 0x1f, 0x03, 0x96, 0x13, 0x3d, 0x16, 0x21, 0xc8, 0x7b, 0x3c, - 0x39, 0xd2, 0x50, 0xf1, 0x9b, 0x4f, 0x2e, 0x97, 0x76, 0x2f, 0x88, 0xa3, 0xec, 0x54, 0x14, 0xe7, - 0xf3, 0x8e, 0x7c, 0xe2, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, - 0x51, 0x2b, 0xe8, 0x27, 0xe5, 0x0e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, - 0x01, 0x55, 0x87, 0x8c, 0x5c, 0x7a, 0x19, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, - 0x28, 0x01, 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, - 0x8e, 0x68, 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, - 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x8e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, - 0xc6, 0xc1, 0xab, 0xb0, 0x72, 0x4c, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x60, 0x39, 0x66, 0xf1, - 0xfc, 0x46, 0xe3, 0xd0, 0xb8, 0xd6, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, - 0x8b, 0xa1, 0xe7, 0x05, 0x7f, 0x0e, 0x4b, 0x11, 0x92, 0xef, 0xf4, 0x11, 0xe4, 0xf9, 0x8a, 0x2a, - 0x9e, 0xb5, 0x54, 0x44, 0xc5, 0x1e, 0x02, 0x80, 0x1b, 0xb0, 0xcc, 0x39, 0x87, 0x3c, 0x2b, 0x33, - 0xab, 0x84, 0x8f, 0x7f, 0x29, 0x7e, 0x4a, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, - 0x43, 0x3a, 0x1c, 0xda, 0x9e, 0x23, 0x94, 0xd4, 0x60, 0x91, 0x78, 0x13, 0xe1, 0x66, 0xd9, 0xe2, - 0x3f, 0x45, 0x81, 0xf4, 0x89, 0xeb, 0xaa, 0x3a, 0x93, 0x04, 0xe7, 0x4e, 0x6c, 0x77, 0x1c, 0x1d, - 0x36, 0x41, 0xf0, 0xb2, 0xb1, 0xfd, 0xf3, 0xb1, 0xbc, 0xce, 0xe4, 0x85, 0x8e, 0x98, 0xc1, 0x0d, - 0x1c, 0x07, 0xc4, 0x57, 0x95, 0x26, 0x7e, 0xe3, 0x53, 0xa8, 0x1c, 0xf6, 0x6d, 0xcf, 0x23, 0xee, - 0x4c, 0x1f, 0x90, 0x36, 0x9a, 0xca, 0xaa, 0x65, 0x89, 0x68, 0xfa, 0xe7, 0x84, 0xc5, 0x55, 0xce, - 0x29, 0xfc, 0xdf, 0x1c, 0x94, 0xa2, 0x63, 0xf3, 0x5d, 0x28, 0x07, 0x3c, 0x39, 0xa2, 0x42, 0x65, - 0x3c, 0x67, 0x27, 0x2e, 0x86, 0x72, 0xb9, 0x6e, 0x18, 0x55, 0x35, 0x6b, 0xcd, 0x54, 0x1e, 0xa2, - 0xa8, 0x5b, 0x31, 0x14, 0xfd, 0x08, 0x56, 0x06, 0x5e, 0x87, 0x8e, 0x3d, 0x47, 0xb9, 0x14, 0x98, - 0x8b, 0xa2, 0x5c, 0x36, 0xf4, 0x16, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x00, 0x6a, 0x74, 0xcc, - 0x92, 0x2a, 0xf2, 0x73, 0x55, 0x4c, 0xe1, 0xd1, 0x23, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, - 0xf1, 0x78, 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x61, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, - 0xcd, 0xf3, 0x4d, 0xbc, 0xc9, 0x89, 0x23, 0x4e, 0x7a, 0xd9, 0x92, 0x04, 0x7e, 0x08, 0x6b, 0xc9, - 0x96, 0x26, 0x6b, 0xdd, 0x84, 0xa2, 0xac, 0xee, 0x40, 0x15, 0x52, 0x48, 0xe2, 0xdf, 0x18, 0xb0, - 0x3a, 0xd5, 0x04, 0xd1, 0x63, 0xa8, 0x5c, 0x0c, 0x5c, 0x97, 0x38, 0xed, 0x6b, 0x9d, 0x31, 0x1d, - 0x8c, 0xbe, 0x80, 0x25, 0x7f, 0xec, 0x79, 0x03, 0xef, 0x3c, 0xec, 0xda, 0xf3, 0x85, 0x13, 0x68, - 0x7c, 0x28, 0xce, 0x3e, 0xbf, 0x3d, 0x45, 0xc6, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x23, - 0x9b, 0xf5, 0x5b, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0xbf, 0x18, 0x50, 0x0a, 0x2f, 0x60, - 0xb3, 0x7a, 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, - 0xae, 0x48, 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x00, 0x05, 0x3e, - 0xb4, 0x03, 0xf3, 0x86, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x63, 0xd1, 0xdd, 0x94, 0xd3, - 0x3c, 0xfe, 0x91, 0xac, 0x71, 0xa5, 0xec, 0x9f, 0x0d, 0xb8, 0x7d, 0x4c, 0xd8, 0xeb, 0xd4, 0x95, - 0x3b, 0x8a, 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6c, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, - 0x16, 0xda, 0x81, 0x15, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, - 0xcb, 0x76, 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, - 0x75, 0xdb, 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0x71, 0x07, 0xd6, 0xd3, 0x36, 0x86, 0xe9, - 0xe1, 0xc6, 0x84, 0xe9, 0xe1, 0xbf, 0x45, 0xdd, 0x87, 0x4f, 0x0a, 0x95, 0xdb, 0x90, 0x16, 0x77, - 0x23, 0x65, 0x96, 0xca, 0x52, 0x44, 0xe3, 0xaf, 0x61, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xa7, 0xb0, - 0x9a, 0x7e, 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0xf3, 0x41, - 0xc0, 0x6f, 0x1b, 0x34, 0x9a, 0x52, 0x3f, 0x83, 0x12, 0xa7, 0x67, 0x96, 0x9d, 0x09, 0x45, 0x87, - 0xf4, 0xec, 0xb1, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x74, 0x0f, 0x96, 0xd5, 0x4f, 0x19, 0x4a, 0xe5, - 0x5a, 0x92, 0x89, 0xbf, 0x0f, 0x55, 0x6d, 0xcf, 0xb0, 0x50, 0x38, 0x95, 0x55, 0x28, 0xca, 0x12, - 0x4b, 0x22, 0xf0, 0x3d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0xa5, 0x91, 0x61, 0x22, 0x7e, 0x00, - 0xab, 0x16, 0x19, 0xd2, 0x09, 0xd1, 0x81, 0xeb, 0x50, 0x18, 0x78, 0x0e, 0x79, 0x17, 0x7e, 0x53, - 0x11, 0x04, 0xfe, 0x1e, 0xac, 0xe8, 0x50, 0x6e, 0xce, 0x7d, 0xa8, 0x7a, 0xe4, 0xed, 0x91, 0x34, - 0xda, 0x8a, 0xd3, 0x9a, 0xe2, 0xe2, 0x4f, 0x60, 0xcd, 0x22, 0x3d, 0x9f, 0x04, 0x7d, 0x3d, 0x7e, - 0x33, 0xf6, 0xf9, 0x26, 0xdc, 0x6c, 0x11, 0xa6, 0x89, 0xcf, 0x87, 0x7f, 0x0e, 0x1f, 0xb4, 0x08, - 0x3b, 0x76, 0x69, 0xc7, 0x76, 0x8f, 0xf4, 0xf0, 0x69, 0x83, 0xbf, 0x23, 0x83, 0xac, 0x06, 0xbf, - 0xa4, 0xf0, 0x97, 0x70, 0xbb, 0x45, 0xc4, 0x06, 0x99, 0x62, 0x99, 0xbb, 0x69, 0xca, 0x72, 0x09, - 0x65, 0x45, 0x28, 0x34, 0x86, 0x23, 0x76, 0xb9, 0xf7, 0x87, 0x65, 0x28, 0xaa, 0x47, 0x12, 0x3a, - 0x84, 0x4a, 0xdb, 0xb7, 0xbb, 0x17, 0xf2, 0x73, 0x1b, 0x32, 0xa7, 0xbe, 0xc0, 0xa9, 0xbd, 0xea, - 0x1b, 0x19, 0x2b, 0xfc, 0x26, 0xba, 0xf0, 0x2d, 0x03, 0x7d, 0x05, 0xb5, 0xf4, 0x57, 0x24, 0x84, - 0x35, 0xfc, 0x8c, 0x8f, 0x64, 0xf5, 0xed, 0xb9, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0xca, - 0x82, 0xf4, 0x87, 0x70, 0xea, 0x2b, 0x4d, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0x5e, 0x8b, 0x0e, 0xae, - 0x7f, 0x7e, 0x41, 0x1f, 0x26, 0xb7, 0xce, 0xf8, 0x68, 0x53, 0xbf, 0x3b, 0x0f, 0x22, 0x15, 0xb7, - 0xa1, 0x9a, 0xfc, 0x88, 0x80, 0x74, 0x97, 0x32, 0x3f, 0x52, 0xd4, 0xb7, 0xe6, 0x20, 0x22, 0xad, - 0xc9, 0xfd, 0xd0, 0xf6, 0x4c, 0x53, 0xb2, 0xb4, 0x66, 0x7c, 0x58, 0xc0, 0x0b, 0xe8, 0xe7, 0x80, - 0xa6, 0x5f, 0xc6, 0xe8, 0xde, 0x75, 0x5e, 0xf1, 0x75, 0x7c, 0x05, 0x4a, 0xee, 0xf0, 0x53, 0x58, - 0x9d, 0x7a, 0xd3, 0xa1, 0x6f, 0x68, 0xa2, 0xb3, 0xde, 0xca, 0xf5, 0x0f, 0xe7, 0x83, 0x22, 0x07, - 0xa6, 0x9f, 0x56, 0x09, 0x07, 0x66, 0x3e, 0xe2, 0x12, 0x0e, 0xcc, 0x78, 0x9f, 0xc9, 0x5a, 0x0b, - 0xaf, 0xf4, 0x89, 0x5a, 0x4b, 0x5d, 0xfd, 0x13, 0xb5, 0x96, 0x78, 0x03, 0xe0, 0x05, 0xf4, 0x04, - 0x8a, 0x8a, 0x85, 0x36, 0xa7, 0x61, 0xa1, 0x86, 0x5b, 0x59, 0x4b, 0x52, 0xc1, 0x19, 0x2c, 0xe9, - 0xb7, 0x1f, 0xb4, 0x35, 0xf3, 0x6d, 0x28, 0x55, 0xcd, 0x7d, 0x3b, 0x46, 0x4e, 0x89, 0x49, 0x9e, - 0x76, 0x4a, 0xbf, 0xd3, 0xa4, 0x9d, 0x8a, 0x47, 0x3f, 0x5e, 0x40, 0x3d, 0xf1, 0xfd, 0x72, 0x6a, - 0x8a, 0xa1, 0xfb, 0x49, 0x99, 0x59, 0x13, 0xbf, 0x7e, 0xef, 0x4a, 0x9c, 0xdc, 0xa7, 0x01, 0xe5, - 0x68, 0x9a, 0xa0, 0xdb, 0x9a, 0x50, 0x7a, 0xae, 0xd5, 0x37, 0xb3, 0x17, 0xa5, 0x9a, 0x47, 0x50, - 0x54, 0x73, 0x25, 0x91, 0x83, 0xe4, 0xac, 0xa9, 0xd7, 0xf4, 0xcf, 0x09, 0xbc, 0x31, 0xe2, 0x05, - 0xf4, 0x0c, 0x20, 0x1e, 0x20, 0xe8, 0x4e, 0x62, 0x76, 0xa5, 0x46, 0x50, 0xbd, 0x3e, 0x63, 0x35, - 0x0c, 0xfb, 0x92, 0x3e, 0x4f, 0x12, 0x69, 0xcc, 0x18, 0x34, 0x99, 0xd6, 0x3c, 0x85, 0x6a, 0x72, - 0xcc, 0x24, 0x1a, 0x41, 0xe6, 0x04, 0xca, 0xd4, 0xf3, 0x0a, 0x36, 0xb2, 0xe7, 0x0f, 0xda, 0x49, - 0xea, 0x9b, 0x3d, 0xa2, 0x32, 0xf5, 0x5a, 0xb0, 0x9e, 0x35, 0x9e, 0x12, 0x65, 0x31, 0x67, 0x7e, - 0x65, 0xe9, 0x3c, 0x78, 0xf4, 0xd7, 0xf7, 0x5b, 0xc6, 0x3f, 0xde, 0x6f, 0x19, 0xff, 0x7a, 0xbf, - 0x65, 0xfc, 0xfe, 0xdf, 0x5b, 0x0b, 0x80, 0xbb, 0xfd, 0xdd, 0x2e, 0xf1, 0xbd, 0x5d, 0xdb, 0x1d, - 0x74, 0xc9, 0x2e, 0xdd, 0xdb, 0x0d, 0x65, 0xfc, 0x51, 0x37, 0x20, 0xfe, 0x84, 0xf8, 0x5f, 0xe5, - 0x46, 0x9d, 0xce, 0x0d, 0xf1, 0xe7, 0xd7, 0x67, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x01, 0xeb, - 0xd2, 0x9a, 0x16, 0x1b, 0x00, 0x00, + // 2299 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, + 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0x43, + 0x2a, 0xe7, 0xe4, 0x0e, 0x07, 0x7c, 0x57, 0xdc, 0x11, 0x0e, 0x82, 0xff, 0x28, 0x8e, 0xef, 0x62, + 0x2b, 0xb5, 0x52, 0x92, 0xe2, 0xaa, 0xa8, 0xb0, 0xd2, 0x8e, 0x2c, 0x9d, 0x57, 0x3b, 0x62, 0x77, + 0xa4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xc0, 0x03, 0xaf, 0x57, 0x14, 0x8f, 0x7c, 0x0f, + 0x5e, 0x28, 0xe0, 0x1b, 0x50, 0xa1, 0x8a, 0x27, 0x3e, 0x04, 0x35, 0x7f, 0x76, 0x77, 0x76, 0xb5, + 0x92, 0x5d, 0xc5, 0x9b, 0xba, 0xa7, 0xbb, 0xb7, 0xbb, 0x7f, 0x3d, 0xdd, 0x33, 0x23, 0xd8, 0x18, + 0xf9, 0x94, 0xd1, 0xe0, 0x21, 0xdd, 0xeb, 0x52, 0x8f, 0xf9, 0xd4, 0xdd, 0x15, 0x0c, 0x54, 0x8e, + 0x18, 0x78, 0x03, 0xd6, 0x1b, 0x13, 0xe2, 0xb1, 0xd7, 0xa7, 0x24, 0xa0, 0xc1, 0x53, 0x62, 0xfb, + 0xac, 0x43, 0x6c, 0x86, 0x57, 0x60, 0xb9, 0xc5, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0xcb, 0x31, 0x09, + 0x18, 0xee, 0x40, 0x25, 0x64, 0x8c, 0xdc, 0x4b, 0xb4, 0x0e, 0x85, 0x80, 0xd9, 0x8c, 0x98, 0xc6, + 0xb6, 0xb1, 0x53, 0xb6, 0x24, 0x81, 0x7e, 0x0c, 0xcb, 0x81, 0x10, 0x7a, 0x31, 0x72, 0x6c, 0x46, + 0x02, 0x33, 0xb7, 0xbd, 0xb8, 0x53, 0xd9, 0xbb, 0xb5, 0x1b, 0x7b, 0xd0, 0xd2, 0xd6, 0xad, 0xa4, + 0x34, 0xfe, 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x04, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0x7c, 0xa5, + 0xba, 0xf7, 0xfe, 0x0c, 0x3b, 0xbb, 0xcf, 0xb8, 0x90, 0x25, 0x65, 0xd1, 0x09, 0x54, 0x87, 0x89, + 0x60, 0xcc, 0xdc, 0xb6, 0xb1, 0x53, 0xd9, 0xbb, 0xa3, 0x69, 0x67, 0xc5, 0xfc, 0x74, 0xc1, 0x4a, + 0x29, 0xe2, 0x4f, 0xa1, 0x20, 0x4c, 0xa3, 0x32, 0x14, 0x8e, 0x1a, 0x07, 0x2f, 0x8e, 0x6b, 0x0b, + 0xa8, 0x04, 0xf9, 0x93, 0xb3, 0x27, 0xcd, 0x9a, 0x81, 0x2a, 0x50, 0x7c, 0xb5, 0x6f, 0x9d, 0x9d, + 0x9c, 0x1d, 0xd7, 0x72, 0x5c, 0xa2, 0x61, 0x59, 0x4d, 0xab, 0xb6, 0x78, 0x50, 0x84, 0x82, 0xb0, + 0x8f, 0x37, 0xe1, 0xd6, 0x31, 0x61, 0x4f, 0x7c, 0x7b, 0x48, 0xde, 0x50, 0xff, 0xe2, 0xc4, 0xeb, + 0xd1, 0x30, 0x9d, 0x7f, 0x32, 0xa0, 0xf8, 0x92, 0xf8, 0xc1, 0x80, 0x7a, 0x3c, 0x97, 0x43, 0xfb, + 0x1b, 0xea, 0x8b, 0x28, 0x0b, 0x96, 0x24, 0x04, 0x77, 0xe0, 0x51, 0x5f, 0x78, 0xcf, 0xb9, 0x9c, + 0xe0, 0xdc, 0x91, 0xcd, 0xba, 0x7d, 0x73, 0x51, 0x72, 0x05, 0xc1, 0xb9, 0x9d, 0xf1, 0xc0, 0x75, + 0xcc, 0xbc, 0x44, 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb3, 0x87, + 0xc4, 0x2c, 0x88, 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x89, 0x16, 0xf3, 0xcd, 0x1b, 0x42, + 0x40, 0xe3, 0xe0, 0xdf, 0xe5, 0xe0, 0xe6, 0x74, 0x04, 0x1c, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, + 0xa3, 0xaa, 0x40, 0x67, 0xa1, 0x8f, 0x61, 0x95, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, + 0x70, 0x48, 0xc7, 0x1e, 0x53, 0xb1, 0x4c, 0x2f, 0x70, 0x4f, 0x98, 0x1d, 0x5c, 0x28, 0x31, 0x19, + 0x9c, 0xc6, 0x89, 0xeb, 0x2d, 0xaf, 0xd7, 0xdb, 0x16, 0x40, 0x9f, 0x06, 0xa1, 0xf1, 0x82, 0xd4, + 0x8a, 0x39, 0x08, 0xc3, 0xd2, 0xc0, 0x0b, 0x98, 0xed, 0x75, 0x89, 0x48, 0x81, 0x8c, 0x30, 0xc1, + 0x43, 0x1f, 0x43, 0x51, 0x45, 0x6c, 0x16, 0x45, 0x9d, 0x20, 0xad, 0x4e, 0x14, 0x44, 0x56, 0x28, + 0x82, 0xef, 0xc3, 0x4a, 0x9b, 0xd8, 0xbe, 0x43, 0xdf, 0x78, 0x0a, 0x4a, 0xb4, 0x01, 0x37, 0x7c, + 0x62, 0x07, 0xd4, 0x53, 0x59, 0x50, 0x14, 0xdf, 0x42, 0xb1, 0xe8, 0xc8, 0xbd, 0xc4, 0x26, 0x6c, + 0x1c, 0x13, 0xd6, 0xd0, 0x62, 0x0f, 0xab, 0xe1, 0x2d, 0xac, 0x4f, 0xad, 0x5c, 0x2f, 0xcb, 0x3f, + 0x81, 0x25, 0x3d, 0x99, 0x6a, 0xc3, 0xd5, 0xf5, 0x52, 0x8f, 0x97, 0x05, 0x7c, 0x09, 0x79, 0xfc, + 0x4f, 0x03, 0x56, 0x52, 0x12, 0xa8, 0x0a, 0xb9, 0x41, 0xf8, 0xb1, 0xdc, 0x40, 0xd4, 0x51, 0xd7, + 0x27, 0x36, 0x23, 0xce, 0xab, 0x3e, 0xf1, 0x04, 0x86, 0x65, 0x4b, 0x67, 0xc5, 0xe8, 0x2c, 0xea, + 0xe8, 0xec, 0x42, 0x41, 0x20, 0x68, 0xe6, 0x85, 0x53, 0xa6, 0xbe, 0x7b, 0xfb, 0xd4, 0x67, 0x6d, + 0x3b, 0x90, 0x15, 0x25, 0xc5, 0x50, 0x1d, 0x4a, 0x3e, 0xa5, 0xcc, 0xa2, 0x6e, 0x58, 0xac, 0x11, + 0x8d, 0x1e, 0x40, 0xad, 0x3b, 0xf6, 0x7d, 0xe2, 0x31, 0x6b, 0xec, 0x9d, 0x8d, 0x87, 0x1d, 0x22, + 0xeb, 0x75, 0xd9, 0x9a, 0xe2, 0xe3, 0x43, 0xb8, 0x79, 0x46, 0xde, 0x68, 0x51, 0x85, 0x48, 0x3d, + 0x80, 0x1a, 0x4f, 0x5b, 0xcf, 0xa5, 0x6f, 0xda, 0x64, 0x38, 0x72, 0xe3, 0xfe, 0x35, 0xc5, 0xc7, + 0x2d, 0x58, 0x4b, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x15, 0x2d, 0x7f, 0x42, 0x7b, 0x7e, 0xba, 0x75, + 0x71, 0xfc, 0xa1, 0xd8, 0x4e, 0x19, 0x9e, 0xa5, 0x52, 0x8e, 0x7f, 0x6d, 0xc0, 0x5a, 0x5a, 0xf2, + 0xff, 0xfe, 0x3c, 0x7a, 0x08, 0xa5, 0x30, 0x4e, 0xd5, 0x13, 0xd7, 0x34, 0x55, 0x9e, 0x67, 0xa1, + 0x13, 0x09, 0xe1, 0xbf, 0x1b, 0xb0, 0x79, 0x28, 0x97, 0xaf, 0x76, 0x1a, 0x3d, 0x86, 0x3c, 0xbb, + 0x1c, 0x11, 0x61, 0xba, 0xba, 0xf7, 0x91, 0x66, 0x7a, 0xa6, 0x8d, 0xdd, 0xe6, 0x88, 0xab, 0x58, + 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0x35, 0x9b, 0xcf, 0x6b, 0x0b, 0x08, 0x41, + 0xb5, 0xd5, 0xde, 0xb7, 0xda, 0xaf, 0xf7, 0x0f, 0xdb, 0x27, 0x2f, 0x4f, 0xda, 0x3f, 0xab, 0x19, + 0x68, 0x15, 0x96, 0x5b, 0xed, 0xe6, 0xf3, 0x98, 0x95, 0x43, 0xcb, 0x50, 0x3e, 0x6c, 0x9e, 0x3d, + 0x39, 0x39, 0x7e, 0x61, 0x35, 0x6a, 0x8b, 0xbc, 0x1b, 0x5b, 0x8d, 0x56, 0xa3, 0x5d, 0xcb, 0xa3, + 0x25, 0x28, 0x1d, 0x37, 0x5f, 0xcb, 0xde, 0x5c, 0xc0, 0x17, 0x70, 0x2b, 0xcb, 0x19, 0x9e, 0xdb, + 0x74, 0x38, 0x51, 0x51, 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xc5, 0x19, 0x85, 0xf8, 0x7b, 0x03, + 0xcc, 0x53, 0xea, 0x0c, 0x7a, 0x97, 0xd7, 0xca, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, + 0xb8, 0x8f, 0xef, 0x64, 0x23, 0xdb, 0x0c, 0xe5, 0x2c, 0x4d, 0x05, 0xdd, 0x83, 0xaa, 0x4f, 0xba, + 0xd4, 0xeb, 0x0d, 0xce, 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0xe1, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0xb7, + 0x06, 0xac, 0x67, 0x19, 0x43, 0x8f, 0x14, 0x7e, 0x72, 0xd8, 0xde, 0xbb, 0xe2, 0xdb, 0x09, 0xe8, + 0xe4, 0xde, 0x75, 0x65, 0x97, 0xcd, 0x85, 0x7b, 0x57, 0xd2, 0xf8, 0xfb, 0x19, 0xb0, 0xae, 0x40, + 0xc5, 0x6a, 0x9c, 0x36, 0x5f, 0x36, 0x5e, 0x5b, 0xcd, 0x67, 0x1c, 0xb1, 0x25, 0x28, 0xed, 0x1f, + 0x1d, 0x49, 0x2a, 0x8f, 0x7f, 0x63, 0xc0, 0x46, 0x46, 0xe6, 0x38, 0x4c, 0x5f, 0x41, 0xad, 0x67, + 0x0f, 0x5c, 0xe2, 0x34, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0x21, 0x37, 0x8d, + 0xb9, 0xde, 0xc8, 0xf0, 0x09, 0x6c, 0x1e, 0x91, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, 0xf2, + 0x05, 0x21, 0xa3, 0xb6, 0xe8, 0x7c, 0x39, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, 0xe2, + 0x81, 0x7d, 0x09, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x8a, 0x0a, 0xa6, 0xda, 0xe1, 0xb7, 0xf5, + 0xbd, 0x94, 0x96, 0xb1, 0xa6, 0xd5, 0xf0, 0x7f, 0x0c, 0x58, 0x4e, 0xf4, 0x58, 0x84, 0x20, 0xef, + 0x71, 0x70, 0xa4, 0xa3, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xf9, 0xa9, 0x28, + 0xce, 0xe7, 0x1d, 0xf9, 0xc4, 0x51, 0x69, 0x50, 0x14, 0xe7, 0xcb, 0x03, 0x9b, 0x9a, 0xc2, 0x8a, + 0x8a, 0xb3, 0x56, 0xd0, 0x77, 0xca, 0x6d, 0x28, 0x77, 0x5d, 0x3b, 0x08, 0xb4, 0xc9, 0x1b, 0x33, + 0x50, 0x03, 0xaa, 0x0e, 0x19, 0xb9, 0xf4, 0x32, 0x6c, 0x55, 0x6a, 0xfa, 0xea, 0x67, 0x3c, 0xee, + 0xfc, 0x51, 0x42, 0xc8, 0x4a, 0x29, 0xf1, 0x46, 0x89, 0xa6, 0xc5, 0x78, 0x39, 0xf2, 0x63, 0x80, + 0x16, 0x71, 0x44, 0x23, 0x13, 0x8a, 0xf6, 0x39, 0x17, 0x0c, 0x81, 0x0f, 0x49, 0xbe, 0x42, 0x7b, + 0x3d, 0xe2, 0x47, 0x81, 0x87, 0x24, 0x3f, 0x68, 0x90, 0xb7, 0xa4, 0x3b, 0x66, 0x94, 0x2f, 0xca, + 0xe8, 0x35, 0x0e, 0x5e, 0x85, 0x95, 0x63, 0xc2, 0x14, 0x00, 0x72, 0xa6, 0x3f, 0x86, 0xe5, 0x98, + 0xc5, 0xf1, 0x8d, 0xc6, 0xa1, 0x71, 0xad, 0x71, 0x88, 0x77, 0xa0, 0xaa, 0x0c, 0x68, 0x27, 0x0d, + 0x85, 0x8b, 0xa1, 0xe3, 0x82, 0x3f, 0x83, 0xa5, 0x48, 0x92, 0x7f, 0xe9, 0x43, 0xc8, 0xf3, 0x15, + 0x55, 0x3c, 0x6b, 0xa9, 0x8c, 0x8a, 0x6f, 0x08, 0x01, 0xdc, 0x80, 0x65, 0xce, 0x39, 0xe4, 0xa8, + 0xcc, 0xac, 0x12, 0x3e, 0xfe, 0xa5, 0xfa, 0x29, 0x75, 0x48, 0x34, 0xfe, 0x63, 0x16, 0xfe, 0x15, + 0x54, 0x0e, 0xe9, 0x70, 0x68, 0x7b, 0x8e, 0x30, 0x52, 0x83, 0x45, 0xe2, 0x4d, 0x44, 0x98, 0x65, + 0x8b, 0xff, 0x14, 0x05, 0xd2, 0x27, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x3b, 0xb1, 0xdd, 0x71, + 0xb4, 0xd9, 0x04, 0xc1, 0xcb, 0xc6, 0xf6, 0xcf, 0xc7, 0xf2, 0x38, 0x93, 0x17, 0x36, 0x62, 0x06, + 0x77, 0x70, 0x1c, 0x10, 0x5f, 0x55, 0x9a, 0xf8, 0x8d, 0x4f, 0xa1, 0x72, 0xd8, 0xb7, 0x3d, 0x8f, + 0xb8, 0x33, 0x63, 0x40, 0xda, 0x68, 0x2a, 0xab, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x13, 0x16, 0x57, + 0x39, 0xa7, 0xf0, 0x7f, 0x73, 0x50, 0x8a, 0xb6, 0xcd, 0x0f, 0xa0, 0x1c, 0x70, 0x70, 0x44, 0x85, + 0xca, 0x7c, 0xce, 0x06, 0x2e, 0x16, 0xe5, 0x7a, 0xdd, 0x30, 0xab, 0x6a, 0xd6, 0x9a, 0x29, 0x1c, + 0xa2, 0xac, 0x5b, 0xb1, 0x28, 0xfa, 0x29, 0xac, 0x0c, 0xbc, 0x0e, 0x1d, 0x7b, 0x8e, 0x0a, 0x29, + 0x30, 0x17, 0x45, 0xb9, 0x6c, 0xe8, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x03, 0xa8, 0xd1, + 0x31, 0x4b, 0x9a, 0xc8, 0xcf, 0x35, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, 0x64, + 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x1b, 0x8f, 0x57, 0xd6, 0x73, 0x9b, 0xf5, 0xd5, 0x9e, + 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x26, 0x27, 0x8e, 0xd8, 0xe9, 0x65, 0x4b, 0x12, 0xf8, 0x21, 0xac, + 0x25, 0x5b, 0x9a, 0xac, 0x75, 0x13, 0x8a, 0xb2, 0xba, 0x03, 0x55, 0x48, 0x21, 0x89, 0x7f, 0x6b, + 0xc0, 0xea, 0x54, 0x13, 0x44, 0x8f, 0xa0, 0x72, 0x31, 0x70, 0x5d, 0xe2, 0xb4, 0xaf, 0xb5, 0xc7, + 0x74, 0x61, 0xf4, 0x05, 0x2c, 0xf9, 0x63, 0xcf, 0x1b, 0x78, 0xe7, 0x61, 0xd7, 0x9e, 0xaf, 0x9c, + 0x90, 0xc6, 0x87, 0x62, 0xef, 0xf3, 0xd3, 0x53, 0xe4, 0x7c, 0x14, 0xa9, 0xa1, 0x45, 0xca, 0x73, + 0x33, 0xb2, 0x59, 0xbf, 0x35, 0x22, 0xdd, 0x70, 0x46, 0x86, 0x34, 0xfe, 0x8b, 0x01, 0xa5, 0xf0, + 0x00, 0x36, 0xab, 0x57, 0xab, 0xde, 0x9b, 0xcb, 0xee, 0xbd, 0x89, 0xa3, 0x77, 0x1d, 0x4a, 0xbd, + 0xb1, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0x85, 0x44, 0x66, 0xd1, 0x7d, 0x28, + 0xf0, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x0f, 0x87, 0x52, 0x02, 0x3f, 0x12, 0xdd, 0x4d, + 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x8e, 0x09, 0x7b, 0x95, + 0x3a, 0x72, 0x47, 0xd9, 0xdb, 0x86, 0x8a, 0x4f, 0x46, 0xf4, 0xb9, 0xcd, 0x18, 0xf1, 0xc3, 0x5b, + 0x95, 0xce, 0x42, 0x3b, 0xb0, 0xe2, 0x93, 0xc9, 0x80, 0xdf, 0xc8, 0x42, 0x29, 0x99, 0x95, 0x34, + 0x9b, 0xdb, 0xb2, 0x5d, 0xf7, 0xc0, 0xb7, 0xbd, 0x6e, 0x9f, 0x04, 0xea, 0x44, 0xa4, 0xb3, 0xc4, + 0x38, 0x70, 0xdd, 0xb6, 0x7d, 0x2e, 0xa7, 0x5a, 0xc9, 0x0a, 0x49, 0xdc, 0x81, 0xf5, 0xb4, 0x8f, + 0x21, 0x3c, 0xdc, 0x99, 0x10, 0x1e, 0xfe, 0x5b, 0xd4, 0x7d, 0x78, 0xa5, 0x50, 0xd8, 0x86, 0xb4, + 0x38, 0x1b, 0x29, 0xb7, 0x14, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x54, 0xf0, 0x9c, 0x9e, + 0xc2, 0x6a, 0xfa, 0x5e, 0x92, 0x75, 0xd6, 0xc9, 0x72, 0xd2, 0x9a, 0xd6, 0xc4, 0x08, 0x6a, 0xcf, + 0x06, 0x01, 0x3f, 0x6d, 0xd0, 0x68, 0x4a, 0xfd, 0x81, 0xd7, 0x1d, 0x19, 0xd1, 0x99, 0x75, 0x67, + 0x42, 0xd1, 0x21, 0x3d, 0x7b, 0xec, 0x32, 0xd5, 0xbc, 0x43, 0x12, 0xdd, 0x85, 0x65, 0xf5, 0x53, + 0xe6, 0x52, 0xc5, 0x96, 0x64, 0xa2, 0x4f, 0xe1, 0xe6, 0x20, 0x38, 0x76, 0x69, 0xc7, 0x76, 0x8f, + 0x12, 0xd2, 0x32, 0xd9, 0xd9, 0x8b, 0xf8, 0x47, 0x50, 0xd5, 0x5c, 0x0d, 0xeb, 0x8b, 0x53, 0x59, + 0xf5, 0xa5, 0xfc, 0xb7, 0xa4, 0x04, 0xfe, 0x12, 0xaa, 0xfb, 0x8e, 0xc3, 0xb9, 0x61, 0x45, 0x65, + 0x05, 0x36, 0xe5, 0x7e, 0x2e, 0xc3, 0x7d, 0xfc, 0x08, 0x96, 0x22, 0x5b, 0xdc, 0x8d, 0x07, 0x50, + 0xf3, 0xc8, 0x9b, 0x64, 0x24, 0xea, 0x0a, 0x99, 0xe6, 0xe3, 0xfb, 0xb0, 0x6a, 0x91, 0x21, 0x9d, + 0x10, 0xdd, 0x95, 0x75, 0x28, 0x0c, 0x3c, 0x87, 0xbc, 0x0d, 0x1f, 0x7b, 0x04, 0x81, 0x7f, 0x08, + 0x2b, 0xba, 0x28, 0xff, 0xd2, 0x3d, 0xa8, 0xc6, 0x16, 0xad, 0xb8, 0xde, 0x52, 0x5c, 0xfc, 0x11, + 0xac, 0x59, 0xa4, 0xe7, 0x93, 0xa0, 0xaf, 0x03, 0x3b, 0xe3, 0x3b, 0xdf, 0x85, 0x9b, 0x2d, 0xc2, + 0x34, 0xf5, 0xf9, 0xe2, 0x9f, 0xc1, 0xfb, 0x2d, 0xc2, 0x32, 0x00, 0xd2, 0x4e, 0x24, 0x1d, 0x3d, + 0x09, 0x8a, 0xc2, 0x5f, 0xc1, 0x7b, 0x2d, 0x22, 0x3e, 0x90, 0xa9, 0x96, 0xf9, 0x35, 0xcd, 0x58, + 0x2e, 0x61, 0xac, 0x08, 0x85, 0xc6, 0x70, 0xc4, 0x2e, 0xf7, 0xbe, 0x5d, 0x86, 0xa2, 0xba, 0xbd, + 0xa1, 0x43, 0xa8, 0xb4, 0x7d, 0xbb, 0x7b, 0x21, 0xdf, 0x01, 0x91, 0x39, 0xf5, 0x34, 0xa8, 0xbe, + 0x55, 0xdf, 0xc8, 0x58, 0xe1, 0x47, 0xe4, 0x85, 0xef, 0x19, 0xe8, 0x6b, 0xa8, 0xa5, 0x9f, 0xb7, + 0x10, 0xd6, 0xe4, 0x67, 0xbc, 0xde, 0xd5, 0xb7, 0xe7, 0xca, 0x08, 0xeb, 0xe8, 0x00, 0x4a, 0xe1, + 0xf3, 0x0f, 0xd2, 0x6f, 0xe8, 0xa9, 0xe7, 0xa3, 0xba, 0x99, 0xb9, 0x26, 0x6d, 0xbc, 0x12, 0xa3, + 0x45, 0x7f, 0x17, 0x42, 0x1f, 0x24, 0x3f, 0x9d, 0xf1, 0x9a, 0x54, 0xbf, 0x33, 0x4f, 0x44, 0x1a, + 0x6e, 0x43, 0x35, 0xf9, 0xba, 0x81, 0xf4, 0x90, 0x32, 0x5f, 0x4f, 0xea, 0x5b, 0x73, 0x24, 0x22, + 0xab, 0xc9, 0xef, 0xa1, 0xed, 0x99, 0xae, 0x64, 0x59, 0xcd, 0x78, 0xf1, 0xc0, 0x0b, 0xe8, 0x17, + 0x80, 0xa6, 0xaf, 0xec, 0xe8, 0xee, 0x75, 0x9e, 0x17, 0xea, 0xf8, 0x0a, 0x29, 0xf9, 0x85, 0x9f, + 0xc3, 0xea, 0xd4, 0x65, 0x13, 0x7d, 0x47, 0x53, 0x9d, 0x75, 0x89, 0xaf, 0x7f, 0x30, 0x5f, 0x28, + 0x0a, 0x60, 0xfa, 0xce, 0x97, 0x08, 0x60, 0xe6, 0xed, 0x32, 0x11, 0xc0, 0x8c, 0x8b, 0xa3, 0xac, + 0xb5, 0xf0, 0xae, 0x91, 0xa8, 0xb5, 0xd4, 0x9d, 0x24, 0x51, 0x6b, 0x89, 0xcb, 0x09, 0x5e, 0x40, + 0x8f, 0xa1, 0xa8, 0x58, 0x68, 0x73, 0x5a, 0x2c, 0xb4, 0x70, 0x2b, 0x6b, 0x49, 0x1a, 0x38, 0x83, + 0x25, 0xfd, 0x58, 0x86, 0xb6, 0x66, 0x5e, 0x5a, 0xa5, 0xa9, 0xb9, 0x97, 0xda, 0x28, 0x28, 0x71, + 0xc4, 0x48, 0x07, 0xa5, 0x1f, 0xb6, 0xd2, 0x41, 0xc5, 0x67, 0x12, 0xbc, 0x80, 0x7a, 0xe2, 0x61, + 0x75, 0x6a, 0xbc, 0xa2, 0x7b, 0x49, 0x9d, 0x59, 0x47, 0x91, 0xfa, 0xdd, 0x2b, 0xe5, 0xe4, 0x77, + 0x1a, 0x50, 0x8e, 0xe6, 0x15, 0x7a, 0x4f, 0x53, 0x4a, 0x0f, 0xdc, 0xfa, 0x66, 0xf6, 0x62, 0x84, + 0x81, 0x9a, 0x36, 0x09, 0x0c, 0x92, 0xd3, 0x2c, 0x81, 0x81, 0x3e, 0x9c, 0xf0, 0x02, 0x7a, 0x0a, + 0x10, 0xcf, 0x11, 0x74, 0x3b, 0x31, 0x24, 0x53, 0x93, 0xa8, 0x5e, 0x9f, 0xb1, 0x1a, 0x66, 0x7f, + 0x49, 0x1f, 0x2b, 0x09, 0x34, 0x33, 0xe6, 0x4d, 0xbd, 0xa6, 0x3f, 0xbe, 0xf0, 0x6e, 0x8d, 0x17, + 0xd0, 0x13, 0xa8, 0x26, 0xa7, 0x4d, 0xa2, 0x1f, 0x64, 0x0e, 0xa2, 0x4c, 0x3b, 0x2f, 0x61, 0x23, + 0x7b, 0x0c, 0xa1, 0x9d, 0xa4, 0xbd, 0xd9, 0x93, 0x2a, 0xd3, 0xae, 0x05, 0xeb, 0x59, 0x53, 0x2a, + 0x51, 0x1d, 0x73, 0xc6, 0x58, 0x96, 0xcd, 0x83, 0xcf, 0xff, 0xfa, 0x6e, 0xcb, 0xf8, 0xc7, 0xbb, + 0x2d, 0xe3, 0x5f, 0xef, 0xb6, 0x8c, 0x3f, 0xfe, 0x7b, 0x6b, 0x01, 0x70, 0xb7, 0xbf, 0xdb, 0x25, + 0xbe, 0xb7, 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8e, 0x3f, 0xea, 0x06, 0xc4, + 0x9f, 0x10, 0xff, 0xeb, 0xdc, 0xa8, 0xd3, 0xb9, 0x21, 0xfe, 0x9c, 0xfb, 0xe4, 0x7f, 0x01, 0x00, + 0x00, 0xff, 0xff, 0xfb, 0x76, 0xda, 0x3c, 0xb6, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3352,7 +3418,7 @@ type ControlClient interface { GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) @@ -3526,8 +3592,8 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt return out, nil } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) if err != nil { return nil, err @@ -3597,7 +3663,7 @@ type ControlServer interface { GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*Empty, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) @@ -5774,6 +5840,16 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) i += copy(dAtA[i:], m.DefaultBranch) } + if m.IsGlobalDefaultBranch { + dAtA[i] = 0x20 + i++ + if m.IsGlobalDefaultBranch { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -5834,6 +5910,39 @@ func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i += copy(dAtA[i:], m.Name) } + if len(m.DefaultBranch) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) + i += copy(dAtA[i:], m.DefaultBranch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *AddRepoReply) 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 *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.NewDefaultBranch) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultBranch))) + i += copy(dAtA[i:], m.NewDefaultBranch) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -6975,6 +7084,9 @@ func (m *RepoInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if m.IsGlobalDefaultBranch { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7009,6 +7121,26 @@ func (m *AddRepoRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.DefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12507,6 +12639,26 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } m.DefaultBranch = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultBranch", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsGlobalDefaultBranch = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12681,6 +12833,124 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddRepoReply) 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 ErrIntOverflowO2Control + } + 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: AddRepoReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewDefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 4d75bb919..da359ca5f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2634,12 +2634,13 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` + IsGlobalDefaultBranch bool `protobuf:"varint,4,opt,name=isGlobalDefaultBranch,proto3" json:"isGlobalDefaultBranch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2696,6 +2697,13 @@ func (m *RepoInfo) GetDefaultBranch() string { return "" } +func (m *RepoInfo) GetIsGlobalDefaultBranch() bool { + if m != nil { + return m.IsGlobalDefaultBranch + } + return false +} + type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2745,6 +2753,7 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultBranch string `protobuf:"bytes,2,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2790,6 +2799,60 @@ func (m *AddRepoRequest) GetName() string { return "" } +func (m *AddRepoRequest) GetDefaultBranch() string { + if m != nil { + return m.DefaultBranch + } + return "" +} + +type AddRepoReply struct { + NewDefaultBranch string `protobuf:"bytes,1,opt,name=newDefaultBranch,proto3" json:"newDefaultBranch,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } +func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } +func (*AddRepoReply) ProtoMessage() {} +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} +} +func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *AddRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoReply.Merge(m, src) +} +func (m *AddRepoReply) XXX_Size() int { + return m.Size() +} +func (m *AddRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoReply.DiscardUnknown(m) +} + +var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo + +func (m *AddRepoReply) GetNewDefaultBranch() string { + if m != nil { + return m.NewDefaultBranch + } + return "" +} + type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -2801,7 +2864,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2848,7 +2911,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2895,7 +2958,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2942,7 +3005,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2989,7 +3052,7 @@ func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultB func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3037,7 +3100,7 @@ func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranc func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultBranchRequest) ProtoMessage() {} func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3090,7 +3153,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3168,6 +3231,7 @@ func init() { proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") + proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") @@ -3180,149 +3244,151 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2262 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x4f, 0x73, 0x1b, 0x49, - 0x15, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0x9c, 0xb1, 0x92, 0x75, 0xbc, 0x4d, - 0x2a, 0xeb, 0xec, 0x2e, 0x0e, 0x78, 0x29, 0x36, 0x84, 0x85, 0xe0, 0x3f, 0x8a, 0x63, 0x36, 0xb6, - 0x52, 0x23, 0x25, 0x29, 0xb6, 0x0a, 0xc2, 0x48, 0xd3, 0xb2, 0xb4, 0x1e, 0x4d, 0x8b, 0x99, 0x96, - 0x12, 0x1f, 0xb8, 0x71, 0xa3, 0x28, 0x0e, 0x5c, 0x28, 0x6e, 0x14, 0xc5, 0x91, 0xef, 0xc1, 0x85, - 0x02, 0xbe, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x21, 0xa8, 0xfe, 0x33, 0x33, 0x3d, 0xa3, 0x91, 0xec, - 0x2a, 0x6e, 0x7a, 0xaf, 0x7f, 0xef, 0xf5, 0xfb, 0xd7, 0xef, 0x75, 0x8f, 0x60, 0x63, 0xe4, 0x53, - 0x46, 0x83, 0x87, 0x74, 0xaf, 0x4b, 0x3d, 0xe6, 0x53, 0x77, 0x57, 0x30, 0x50, 0x39, 0x62, 0xe0, - 0x0d, 0x58, 0x6f, 0x4c, 0x88, 0xc7, 0xde, 0x9c, 0x92, 0x80, 0x06, 0xcf, 0x88, 0xed, 0xb3, 0x0e, - 0xb1, 0x19, 0x5e, 0x81, 0xe5, 0x16, 0xb3, 0xd9, 0x38, 0xb0, 0xc8, 0x2f, 0xc6, 0x24, 0x60, 0xb8, - 0x03, 0x95, 0x90, 0x31, 0x72, 0x2f, 0xd1, 0x3a, 0x14, 0x02, 0x66, 0x33, 0x62, 0x1a, 0xdb, 0xc6, - 0x4e, 0xd9, 0x92, 0x04, 0xfa, 0x01, 0x2c, 0x07, 0x02, 0xf4, 0x72, 0xe4, 0xd8, 0x8c, 0x04, 0x66, - 0x6e, 0x7b, 0x71, 0xa7, 0xb2, 0x77, 0x6b, 0x37, 0xb6, 0xa0, 0xa5, 0xad, 0x5b, 0x49, 0x34, 0xfe, - 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x0c, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0xec, 0x52, 0xdd, 0xfb, - 0x60, 0x86, 0x9e, 0xdd, 0xe7, 0x1c, 0x64, 0x49, 0x2c, 0x3a, 0x81, 0xea, 0x30, 0xe1, 0x8c, 0x99, - 0xdb, 0x36, 0x76, 0x2a, 0x7b, 0x77, 0x35, 0xe9, 0x2c, 0x9f, 0x9f, 0x2d, 0x58, 0x29, 0x41, 0xfc, - 0x1d, 0x28, 0x08, 0xd5, 0xa8, 0x0c, 0x85, 0xa3, 0xc6, 0xc1, 0xcb, 0xe3, 0xda, 0x02, 0x2a, 0x41, - 0xfe, 0xe4, 0xec, 0x69, 0xb3, 0x66, 0xa0, 0x0a, 0x14, 0x5f, 0xef, 0x5b, 0x67, 0x27, 0x67, 0xc7, - 0xb5, 0x1c, 0x47, 0x34, 0x2c, 0xab, 0x69, 0xd5, 0x16, 0x0f, 0x8a, 0x50, 0x10, 0xfa, 0xf1, 0x26, - 0xdc, 0x3a, 0x26, 0xec, 0xa9, 0x6f, 0x0f, 0xc9, 0x5b, 0xea, 0x5f, 0x9c, 0x78, 0x3d, 0x1a, 0x86, - 0xf3, 0x4f, 0x06, 0x14, 0x5f, 0x11, 0x3f, 0x18, 0x50, 0x8f, 0xc7, 0x72, 0x68, 0x7f, 0x4d, 0x7d, - 0xe1, 0x65, 0xc1, 0x92, 0x84, 0xe0, 0x0e, 0x3c, 0xea, 0x0b, 0xeb, 0x39, 0x97, 0x13, 0x9c, 0x3b, - 0xb2, 0x59, 0xb7, 0x6f, 0x2e, 0x4a, 0xae, 0x20, 0x38, 0xb7, 0x33, 0x1e, 0xb8, 0x8e, 0x99, 0x97, - 0xd9, 0x10, 0x04, 0xda, 0x86, 0xca, 0xc8, 0xa7, 0xce, 0xb8, 0xcb, 0xce, 0xec, 0x21, 0x31, 0x0b, - 0x62, 0x4d, 0x67, 0xa1, 0x2d, 0x80, 0x89, 0x34, 0xa2, 0xc5, 0x7c, 0xf3, 0x86, 0x00, 0x68, 0x1c, - 0xfc, 0xdb, 0x1c, 0xdc, 0x9c, 0xf6, 0x80, 0xe7, 0x7f, 0x1b, 0x2a, 0xbd, 0x88, 0xeb, 0xa8, 0x2a, - 0xd0, 0x59, 0xe8, 0x53, 0x58, 0x25, 0xde, 0x64, 0xe0, 0x53, 0x6f, 0x48, 0x3c, 0x16, 0x1c, 0xd2, - 0xb1, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0xdc, 0x12, 0x66, 0x07, 0x17, 0x0a, 0x26, 0x9d, 0xd3, 0x38, - 0x71, 0xbd, 0xe5, 0xf5, 0x7a, 0xdb, 0x02, 0xe8, 0xd3, 0x20, 0x54, 0x5e, 0x90, 0x52, 0x31, 0x07, - 0x61, 0x58, 0x1a, 0x78, 0x01, 0xb3, 0xbd, 0x2e, 0x11, 0x21, 0x90, 0x1e, 0x26, 0x78, 0xe8, 0x53, - 0x28, 0x2a, 0x8f, 0xcd, 0xa2, 0xa8, 0x13, 0xa4, 0xd5, 0x89, 0x4a, 0x91, 0x15, 0x42, 0xf0, 0x03, - 0x58, 0x69, 0x13, 0xdb, 0x77, 0xe8, 0x5b, 0x4f, 0xa5, 0x12, 0x6d, 0xc0, 0x0d, 0x9f, 0xd8, 0x01, - 0xf5, 0x54, 0x14, 0x14, 0xc5, 0x8f, 0x50, 0x0c, 0x1d, 0xb9, 0x97, 0xd8, 0x84, 0x8d, 0x63, 0xc2, - 0x1a, 0x9a, 0xef, 0x61, 0x35, 0xbc, 0x83, 0xf5, 0xa9, 0x95, 0xeb, 0x45, 0xf9, 0x87, 0xb0, 0xa4, - 0x07, 0x53, 0x1d, 0xb8, 0xba, 0x5e, 0xea, 0xf1, 0xb2, 0x48, 0x5f, 0x02, 0x8f, 0xff, 0x69, 0xc0, - 0x4a, 0x0a, 0x81, 0xaa, 0x90, 0x1b, 0x84, 0x9b, 0xe5, 0x06, 0xa2, 0x8e, 0xba, 0x3e, 0xb1, 0x19, - 0x71, 0x5e, 0xf7, 0x89, 0x27, 0x72, 0x58, 0xb6, 0x74, 0x56, 0x9c, 0x9d, 0x45, 0x3d, 0x3b, 0xbb, - 0x50, 0x10, 0x19, 0x34, 0xf3, 0xc2, 0x28, 0x53, 0x3f, 0xbd, 0x7d, 0xea, 0xb3, 0xb6, 0x1d, 0xc8, - 0x8a, 0x92, 0x30, 0x54, 0x87, 0x92, 0x4f, 0x29, 0xb3, 0xa8, 0x1b, 0x16, 0x6b, 0x44, 0xa3, 0x8f, - 0xa1, 0xd6, 0x1d, 0xfb, 0x3e, 0xf1, 0x98, 0x35, 0xf6, 0xce, 0xc6, 0xc3, 0x0e, 0x91, 0xf5, 0xba, - 0x6c, 0x4d, 0xf1, 0xf1, 0x21, 0xdc, 0x3c, 0x23, 0x6f, 0x35, 0xaf, 0xc2, 0x4c, 0x7d, 0x0c, 0x35, - 0x1e, 0xb6, 0x9e, 0x4b, 0xdf, 0xb6, 0xc9, 0x70, 0xe4, 0xc6, 0xfd, 0x6b, 0x8a, 0x8f, 0x5b, 0xb0, - 0x96, 0x56, 0xc2, 0x33, 0xf2, 0x05, 0x54, 0xb4, 0xf8, 0x09, 0xe9, 0xf9, 0xe1, 0xd6, 0xe1, 0xf8, - 0x23, 0x71, 0x9c, 0x32, 0x2c, 0x4b, 0x85, 0x1c, 0xff, 0xca, 0x80, 0xb5, 0x34, 0xf2, 0xff, 0xde, - 0x1e, 0x3d, 0x84, 0x52, 0xe8, 0xa7, 0xea, 0x89, 0x6b, 0x9a, 0x28, 0x8f, 0xb3, 0x90, 0x89, 0x40, - 0xf8, 0xef, 0x06, 0x6c, 0x1e, 0xca, 0xe5, 0xab, 0x8d, 0x46, 0x4f, 0x20, 0xcf, 0x2e, 0x47, 0x44, - 0xa8, 0xae, 0xee, 0x7d, 0xa2, 0xa9, 0x9e, 0xa9, 0x63, 0xb7, 0x39, 0xe2, 0x22, 0x96, 0x10, 0xc4, - 0x36, 0xdc, 0x90, 0x34, 0x6f, 0xb2, 0x67, 0xcd, 0xe6, 0x8b, 0xda, 0x02, 0x42, 0x50, 0x6d, 0xb5, - 0xf7, 0xad, 0xf6, 0x9b, 0xfd, 0xc3, 0xf6, 0xc9, 0xab, 0x93, 0xf6, 0x4f, 0x6a, 0x06, 0x5a, 0x85, - 0xe5, 0x56, 0xbb, 0xf9, 0x22, 0x66, 0xe5, 0xd0, 0x32, 0x94, 0x0f, 0x9b, 0x67, 0x4f, 0x4f, 0x8e, - 0x5f, 0x5a, 0x8d, 0xda, 0x22, 0xef, 0xc6, 0x56, 0xa3, 0xd5, 0x68, 0xd7, 0xf2, 0x68, 0x09, 0x4a, - 0xc7, 0xcd, 0x37, 0xb2, 0x37, 0x17, 0xf0, 0x05, 0xdc, 0xca, 0x32, 0x86, 0xc7, 0x36, 0xed, 0x4e, - 0x54, 0xd4, 0x39, 0xbd, 0xa8, 0xb3, 0x0a, 0x71, 0x71, 0x46, 0x21, 0xfe, 0xce, 0x00, 0xf3, 0x94, - 0x3a, 0x83, 0xde, 0xe5, 0xb5, 0xa2, 0x07, 0x74, 0x44, 0x7c, 0x9b, 0x0d, 0xa8, 0x17, 0x9e, 0xe3, - 0xbb, 0xd9, 0x99, 0x6d, 0x86, 0x38, 0x4b, 0x13, 0x41, 0xf7, 0xa1, 0xea, 0x93, 0x2e, 0xf5, 0x7a, - 0x83, 0xf3, 0xb1, 0x4f, 0xf6, 0x5d, 0x57, 0xd8, 0x55, 0xb2, 0x52, 0x5c, 0xfc, 0x47, 0x03, 0xd6, - 0xb3, 0x94, 0xa1, 0xc7, 0x2a, 0x7f, 0x72, 0xd8, 0xde, 0xbf, 0x62, 0xef, 0x44, 0xea, 0xe4, 0xd9, - 0x75, 0x65, 0x97, 0xcd, 0x85, 0x67, 0x57, 0xd2, 0xf8, 0xdb, 0x19, 0x69, 0x5d, 0x81, 0x8a, 0xd5, - 0x38, 0x6d, 0xbe, 0x6a, 0xbc, 0xb1, 0x9a, 0xcf, 0x79, 0xc6, 0x96, 0xa0, 0xb4, 0x7f, 0x74, 0x24, - 0xa9, 0x3c, 0xfe, 0xb5, 0x01, 0x1b, 0x19, 0x91, 0xe3, 0x69, 0xfa, 0x12, 0x6a, 0x3d, 0x7b, 0xe0, - 0x12, 0xa7, 0x19, 0x47, 0xcb, 0xb8, 0x5e, 0xb4, 0xa6, 0x04, 0x55, 0x12, 0x72, 0xd3, 0x39, 0xd7, - 0x1b, 0x19, 0x3e, 0x81, 0xcd, 0x23, 0x12, 0x30, 0x9f, 0x5e, 0x27, 0x8f, 0x77, 0xa0, 0x7c, 0x41, - 0xc8, 0xa8, 0x2d, 0x3a, 0x5f, 0x4e, 0x64, 0x20, 0x66, 0x60, 0x02, 0xb7, 0xb2, 0x54, 0x71, 0xc7, - 0x7e, 0x0c, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x42, 0x05, 0x53, 0x9d, 0xf0, 0x3b, 0xfa, 0x59, - 0x4a, 0x63, 0xac, 0x69, 0x31, 0xfc, 0x1f, 0x03, 0x96, 0x13, 0x3d, 0x16, 0x21, 0xc8, 0x7b, 0x3c, - 0x39, 0xd2, 0x50, 0xf1, 0x9b, 0x4f, 0x2e, 0x97, 0x76, 0x2f, 0x88, 0xa3, 0xec, 0x54, 0x14, 0xe7, - 0xf3, 0x8e, 0x7c, 0xe2, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, 0x85, 0x4d, 0x4d, 0x61, 0x45, 0xc5, - 0x51, 0x2b, 0xe8, 0x27, 0xe5, 0x0e, 0x94, 0xbb, 0xae, 0x1d, 0x04, 0xda, 0xe4, 0x8d, 0x19, 0xa8, - 0x01, 0x55, 0x87, 0x8c, 0x5c, 0x7a, 0x19, 0xb6, 0x2a, 0x35, 0x7d, 0xf5, 0x3b, 0x1e, 0x37, 0xfe, - 0x28, 0x01, 0xb2, 0x52, 0x42, 0xbc, 0x51, 0xa2, 0x69, 0x18, 0x2f, 0x47, 0x7e, 0x0d, 0xd0, 0x3c, - 0x8e, 0x68, 0x64, 0x42, 0xd1, 0x3e, 0xe7, 0xc0, 0x30, 0xf1, 0x21, 0xc9, 0x57, 0x68, 0xaf, 0x47, - 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x17, 0x0d, 0xf2, 0x8e, 0x74, 0xc7, 0x8c, 0xf2, 0x45, 0xe9, 0xbd, - 0xc6, 0xc1, 0xab, 0xb0, 0x72, 0x4c, 0x98, 0x4a, 0x80, 0x9c, 0xe9, 0x4f, 0x60, 0x39, 0x66, 0xf1, - 0xfc, 0x46, 0xe3, 0xd0, 0xb8, 0xd6, 0x38, 0xc4, 0x3b, 0x50, 0x55, 0x0a, 0xb4, 0x9b, 0x86, 0xca, - 0x8b, 0xa1, 0xe7, 0x05, 0x7f, 0x0e, 0x4b, 0x11, 0x92, 0xef, 0xf4, 0x11, 0xe4, 0xf9, 0x8a, 0x2a, - 0x9e, 0xb5, 0x54, 0x44, 0xc5, 0x1e, 0x02, 0x80, 0x1b, 0xb0, 0xcc, 0x39, 0x87, 0x3c, 0x2b, 0x33, - 0xab, 0x84, 0x8f, 0x7f, 0x29, 0x7e, 0x4a, 0x1d, 0x12, 0x8d, 0xff, 0x98, 0x85, 0x7f, 0x09, 0x95, - 0x43, 0x3a, 0x1c, 0xda, 0x9e, 0x23, 0x94, 0xd4, 0x60, 0x91, 0x78, 0x13, 0xe1, 0x66, 0xd9, 0xe2, - 0x3f, 0x45, 0x81, 0xf4, 0x89, 0xeb, 0xaa, 0x3a, 0x93, 0x04, 0xe7, 0x4e, 0x6c, 0x77, 0x1c, 0x1d, - 0x36, 0x41, 0xf0, 0xb2, 0xb1, 0xfd, 0xf3, 0xb1, 0xbc, 0xce, 0xe4, 0x85, 0x8e, 0x98, 0xc1, 0x0d, - 0x1c, 0x07, 0xc4, 0x57, 0x95, 0x26, 0x7e, 0xe3, 0x53, 0xa8, 0x1c, 0xf6, 0x6d, 0xcf, 0x23, 0xee, - 0x4c, 0x1f, 0x90, 0x36, 0x9a, 0xca, 0xaa, 0x65, 0x89, 0x68, 0xfa, 0xe7, 0x84, 0xc5, 0x55, 0xce, - 0x29, 0xfc, 0xdf, 0x1c, 0x94, 0xa2, 0x63, 0xf3, 0x5d, 0x28, 0x07, 0x3c, 0x39, 0xa2, 0x42, 0x65, - 0x3c, 0x67, 0x27, 0x2e, 0x86, 0x72, 0xb9, 0x6e, 0x18, 0x55, 0x35, 0x6b, 0xcd, 0x54, 0x1e, 0xa2, - 0xa8, 0x5b, 0x31, 0x14, 0xfd, 0x08, 0x56, 0x06, 0x5e, 0x87, 0x8e, 0x3d, 0x47, 0xb9, 0x14, 0x98, - 0x8b, 0xa2, 0x5c, 0x36, 0xf4, 0x16, 0x10, 0x7b, 0x6b, 0xa5, 0xe1, 0xe8, 0x00, 0x6a, 0x74, 0xcc, - 0x92, 0x2a, 0xf2, 0x73, 0x55, 0x4c, 0xe1, 0xd1, 0x23, 0x9e, 0xf2, 0x28, 0xa1, 0x22, 0xd8, 0x29, - 0xf1, 0x78, 0xd5, 0xd2, 0xa1, 0xfc, 0xe0, 0xf1, 0xca, 0x7a, 0x61, 0xb3, 0xbe, 0x3a, 0xf3, 0x11, - 0xcd, 0xf3, 0x4d, 0xbc, 0xc9, 0x89, 0x23, 0x4e, 0x7a, 0xd9, 0x92, 0x04, 0x7e, 0x08, 0x6b, 0xc9, - 0x96, 0x26, 0x6b, 0xdd, 0x84, 0xa2, 0xac, 0xee, 0x40, 0x15, 0x52, 0x48, 0xe2, 0xdf, 0x18, 0xb0, - 0x3a, 0xd5, 0x04, 0xd1, 0x63, 0xa8, 0x5c, 0x0c, 0x5c, 0x97, 0x38, 0xed, 0x6b, 0x9d, 0x31, 0x1d, - 0x8c, 0xbe, 0x80, 0x25, 0x7f, 0xec, 0x79, 0x03, 0xef, 0x3c, 0xec, 0xda, 0xf3, 0x85, 0x13, 0x68, - 0x7c, 0x28, 0xce, 0x3e, 0xbf, 0x3d, 0x45, 0xc6, 0x47, 0x9e, 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x23, - 0x9b, 0xf5, 0x5b, 0x23, 0xd2, 0x0d, 0x67, 0x64, 0x48, 0xe3, 0xbf, 0x18, 0x50, 0x0a, 0x2f, 0x60, - 0xb3, 0x7a, 0xb5, 0xea, 0xbd, 0xb9, 0xec, 0xde, 0x9b, 0xb8, 0x7a, 0xd7, 0xa1, 0xd4, 0x1b, 0xbb, - 0xae, 0x48, 0x83, 0xec, 0x56, 0x11, 0xad, 0x47, 0xb6, 0x90, 0x88, 0x2c, 0x7a, 0x00, 0x05, 0x3e, - 0xb4, 0x03, 0xf3, 0x86, 0x08, 0x40, 0xe6, 0xe5, 0x50, 0x22, 0xf0, 0x63, 0xd1, 0xdd, 0x94, 0xd3, - 0x3c, 0xfe, 0x91, 0xac, 0x71, 0xa5, 0xec, 0x9f, 0x0d, 0xb8, 0x7d, 0x4c, 0xd8, 0xeb, 0xd4, 0x95, - 0x3b, 0x8a, 0xde, 0x36, 0x54, 0x7c, 0x32, 0xa2, 0x2f, 0x6c, 0xc6, 0x88, 0x1f, 0xbe, 0xaa, 0x74, - 0x16, 0xda, 0x81, 0x15, 0x9f, 0x4c, 0x06, 0xfc, 0x45, 0x16, 0xa2, 0x64, 0x54, 0xd2, 0x6c, 0xae, - 0xcb, 0x76, 0xdd, 0x03, 0xdf, 0xf6, 0xba, 0x7d, 0x12, 0xa8, 0x1b, 0x91, 0xce, 0x12, 0xe3, 0xc0, - 0x75, 0xdb, 0xf6, 0xb9, 0x9c, 0x6a, 0x25, 0x2b, 0x24, 0x71, 0x07, 0xd6, 0xd3, 0x36, 0x86, 0xe9, - 0xe1, 0xc6, 0x84, 0xe9, 0xe1, 0xbf, 0x45, 0xdd, 0x87, 0x4f, 0x0a, 0x95, 0xdb, 0x90, 0x16, 0x77, - 0x23, 0x65, 0x96, 0xca, 0x52, 0x44, 0xe3, 0xaf, 0x61, 0x33, 0x3b, 0x14, 0x3c, 0xa6, 0xa7, 0xb0, - 0x9a, 0x7e, 0x97, 0x64, 0xdd, 0x75, 0xb2, 0x8c, 0xb4, 0xa6, 0x25, 0x31, 0x82, 0xda, 0xf3, 0x41, - 0xc0, 0x6f, 0x1b, 0x34, 0x9a, 0x52, 0x3f, 0x83, 0x12, 0xa7, 0x67, 0x96, 0x9d, 0x09, 0x45, 0x87, - 0xf4, 0xec, 0xb1, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x74, 0x0f, 0x96, 0xd5, 0x4f, 0x19, 0x4a, 0xe5, - 0x5a, 0x92, 0x89, 0xbf, 0x0f, 0x55, 0x6d, 0xcf, 0xb0, 0x50, 0x38, 0x95, 0x55, 0x28, 0xca, 0x12, - 0x4b, 0x22, 0xf0, 0x3d, 0xa8, 0xee, 0x3b, 0x0e, 0xe7, 0x86, 0xa5, 0x91, 0x61, 0x22, 0x7e, 0x00, - 0xab, 0x16, 0x19, 0xd2, 0x09, 0xd1, 0x81, 0xeb, 0x50, 0x18, 0x78, 0x0e, 0x79, 0x17, 0x7e, 0x53, - 0x11, 0x04, 0xfe, 0x1e, 0xac, 0xe8, 0x50, 0x6e, 0xce, 0x7d, 0xa8, 0x7a, 0xe4, 0xed, 0x91, 0x34, - 0xda, 0x8a, 0xd3, 0x9a, 0xe2, 0xe2, 0x4f, 0x60, 0xcd, 0x22, 0x3d, 0x9f, 0x04, 0x7d, 0x3d, 0x7e, - 0x33, 0xf6, 0xf9, 0x26, 0xdc, 0x6c, 0x11, 0xa6, 0x89, 0xcf, 0x87, 0x7f, 0x0e, 0x1f, 0xb4, 0x08, - 0x3b, 0x76, 0x69, 0xc7, 0x76, 0x8f, 0xf4, 0xf0, 0x69, 0x83, 0xbf, 0x23, 0x83, 0xac, 0x06, 0xbf, - 0xa4, 0xf0, 0x97, 0x70, 0xbb, 0x45, 0xc4, 0x06, 0x99, 0x62, 0x99, 0xbb, 0x69, 0xca, 0x72, 0x09, - 0x65, 0x45, 0x28, 0x34, 0x86, 0x23, 0x76, 0xb9, 0xf7, 0x87, 0x65, 0x28, 0xaa, 0x47, 0x12, 0x3a, - 0x84, 0x4a, 0xdb, 0xb7, 0xbb, 0x17, 0xf2, 0x73, 0x1b, 0x32, 0xa7, 0xbe, 0xc0, 0xa9, 0xbd, 0xea, - 0x1b, 0x19, 0x2b, 0xfc, 0x26, 0xba, 0xf0, 0x2d, 0x03, 0x7d, 0x05, 0xb5, 0xf4, 0x57, 0x24, 0x84, - 0x35, 0xfc, 0x8c, 0x8f, 0x64, 0xf5, 0xed, 0xb9, 0x18, 0xa1, 0x1d, 0x1d, 0x40, 0x29, 0xfc, 0xca, - 0x82, 0xf4, 0x87, 0x70, 0xea, 0x2b, 0x4d, 0xdd, 0xcc, 0x5c, 0x93, 0x3a, 0x5e, 0x8b, 0x0e, 0xae, - 0x7f, 0x7e, 0x41, 0x1f, 0x26, 0xb7, 0xce, 0xf8, 0x68, 0x53, 0xbf, 0x3b, 0x0f, 0x22, 0x15, 0xb7, - 0xa1, 0x9a, 0xfc, 0x88, 0x80, 0x74, 0x97, 0x32, 0x3f, 0x52, 0xd4, 0xb7, 0xe6, 0x20, 0x22, 0xad, - 0xc9, 0xfd, 0xd0, 0xf6, 0x4c, 0x53, 0xb2, 0xb4, 0x66, 0x7c, 0x58, 0xc0, 0x0b, 0xe8, 0xe7, 0x80, - 0xa6, 0x5f, 0xc6, 0xe8, 0xde, 0x75, 0x5e, 0xf1, 0x75, 0x7c, 0x05, 0x4a, 0xee, 0xf0, 0x53, 0x58, - 0x9d, 0x7a, 0xd3, 0xa1, 0x6f, 0x68, 0xa2, 0xb3, 0xde, 0xca, 0xf5, 0x0f, 0xe7, 0x83, 0x22, 0x07, - 0xa6, 0x9f, 0x56, 0x09, 0x07, 0x66, 0x3e, 0xe2, 0x12, 0x0e, 0xcc, 0x78, 0x9f, 0xc9, 0x5a, 0x0b, - 0xaf, 0xf4, 0x89, 0x5a, 0x4b, 0x5d, 0xfd, 0x13, 0xb5, 0x96, 0x78, 0x03, 0xe0, 0x05, 0xf4, 0x04, - 0x8a, 0x8a, 0x85, 0x36, 0xa7, 0x61, 0xa1, 0x86, 0x5b, 0x59, 0x4b, 0x52, 0xc1, 0x19, 0x2c, 0xe9, - 0xb7, 0x1f, 0xb4, 0x35, 0xf3, 0x6d, 0x28, 0x55, 0xcd, 0x7d, 0x3b, 0x46, 0x4e, 0x89, 0x49, 0x9e, - 0x76, 0x4a, 0xbf, 0xd3, 0xa4, 0x9d, 0x8a, 0x47, 0x3f, 0x5e, 0x40, 0x3d, 0xf1, 0xfd, 0x72, 0x6a, - 0x8a, 0xa1, 0xfb, 0x49, 0x99, 0x59, 0x13, 0xbf, 0x7e, 0xef, 0x4a, 0x9c, 0xdc, 0xa7, 0x01, 0xe5, - 0x68, 0x9a, 0xa0, 0xdb, 0x9a, 0x50, 0x7a, 0xae, 0xd5, 0x37, 0xb3, 0x17, 0xa5, 0x9a, 0x47, 0x50, - 0x54, 0x73, 0x25, 0x91, 0x83, 0xe4, 0xac, 0xa9, 0xd7, 0xf4, 0xcf, 0x09, 0xbc, 0x31, 0xe2, 0x05, - 0xf4, 0x0c, 0x20, 0x1e, 0x20, 0xe8, 0x4e, 0x62, 0x76, 0xa5, 0x46, 0x50, 0xbd, 0x3e, 0x63, 0x35, - 0x0c, 0xfb, 0x92, 0x3e, 0x4f, 0x12, 0x69, 0xcc, 0x18, 0x34, 0x99, 0xd6, 0x3c, 0x85, 0x6a, 0x72, - 0xcc, 0x24, 0x1a, 0x41, 0xe6, 0x04, 0xca, 0xd4, 0xf3, 0x0a, 0x36, 0xb2, 0xe7, 0x0f, 0xda, 0x49, - 0xea, 0x9b, 0x3d, 0xa2, 0x32, 0xf5, 0x5a, 0xb0, 0x9e, 0x35, 0x9e, 0x12, 0x65, 0x31, 0x67, 0x7e, - 0x65, 0xe9, 0x3c, 0x78, 0xf4, 0xd7, 0xf7, 0x5b, 0xc6, 0x3f, 0xde, 0x6f, 0x19, 0xff, 0x7a, 0xbf, - 0x65, 0xfc, 0xfe, 0xdf, 0x5b, 0x0b, 0x80, 0xbb, 0xfd, 0xdd, 0x2e, 0xf1, 0xbd, 0x5d, 0xdb, 0x1d, - 0x74, 0xc9, 0x2e, 0xdd, 0xdb, 0x0d, 0x65, 0xfc, 0x51, 0x37, 0x20, 0xfe, 0x84, 0xf8, 0x5f, 0xe5, - 0x46, 0x9d, 0xce, 0x0d, 0xf1, 0xe7, 0xd7, 0x67, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x01, 0xeb, - 0xd2, 0x9a, 0x16, 0x1b, 0x00, 0x00, + // 2299 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, + 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0x43, + 0x2a, 0xe7, 0xe4, 0x0e, 0x07, 0x7c, 0x57, 0xdc, 0x11, 0x0e, 0x82, 0xff, 0x28, 0x8e, 0xef, 0x62, + 0x2b, 0xb5, 0x52, 0x92, 0xe2, 0xaa, 0xa8, 0xb0, 0xd2, 0x8e, 0x2c, 0x9d, 0x57, 0x3b, 0x62, 0x77, + 0xa4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xc0, 0x03, 0xaf, 0x57, 0x14, 0x8f, 0x7c, 0x0f, + 0x5e, 0x28, 0xe0, 0x1b, 0x50, 0xa1, 0x8a, 0x27, 0x3e, 0x04, 0x35, 0x7f, 0x76, 0x77, 0x76, 0xb5, + 0x92, 0x5d, 0xc5, 0x9b, 0xba, 0xa7, 0xbb, 0xb7, 0xbb, 0x7f, 0x3d, 0xdd, 0x33, 0x23, 0xd8, 0x18, + 0xf9, 0x94, 0xd1, 0xe0, 0x21, 0xdd, 0xeb, 0x52, 0x8f, 0xf9, 0xd4, 0xdd, 0x15, 0x0c, 0x54, 0x8e, + 0x18, 0x78, 0x03, 0xd6, 0x1b, 0x13, 0xe2, 0xb1, 0xd7, 0xa7, 0x24, 0xa0, 0xc1, 0x53, 0x62, 0xfb, + 0xac, 0x43, 0x6c, 0x86, 0x57, 0x60, 0xb9, 0xc5, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0xcb, 0x31, 0x09, + 0x18, 0xee, 0x40, 0x25, 0x64, 0x8c, 0xdc, 0x4b, 0xb4, 0x0e, 0x85, 0x80, 0xd9, 0x8c, 0x98, 0xc6, + 0xb6, 0xb1, 0x53, 0xb6, 0x24, 0x81, 0x7e, 0x0c, 0xcb, 0x81, 0x10, 0x7a, 0x31, 0x72, 0x6c, 0x46, + 0x02, 0x33, 0xb7, 0xbd, 0xb8, 0x53, 0xd9, 0xbb, 0xb5, 0x1b, 0x7b, 0xd0, 0xd2, 0xd6, 0xad, 0xa4, + 0x34, 0xfe, 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x04, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0x7c, 0xa5, + 0xba, 0xf7, 0xfe, 0x0c, 0x3b, 0xbb, 0xcf, 0xb8, 0x90, 0x25, 0x65, 0xd1, 0x09, 0x54, 0x87, 0x89, + 0x60, 0xcc, 0xdc, 0xb6, 0xb1, 0x53, 0xd9, 0xbb, 0xa3, 0x69, 0x67, 0xc5, 0xfc, 0x74, 0xc1, 0x4a, + 0x29, 0xe2, 0x4f, 0xa1, 0x20, 0x4c, 0xa3, 0x32, 0x14, 0x8e, 0x1a, 0x07, 0x2f, 0x8e, 0x6b, 0x0b, + 0xa8, 0x04, 0xf9, 0x93, 0xb3, 0x27, 0xcd, 0x9a, 0x81, 0x2a, 0x50, 0x7c, 0xb5, 0x6f, 0x9d, 0x9d, + 0x9c, 0x1d, 0xd7, 0x72, 0x5c, 0xa2, 0x61, 0x59, 0x4d, 0xab, 0xb6, 0x78, 0x50, 0x84, 0x82, 0xb0, + 0x8f, 0x37, 0xe1, 0xd6, 0x31, 0x61, 0x4f, 0x7c, 0x7b, 0x48, 0xde, 0x50, 0xff, 0xe2, 0xc4, 0xeb, + 0xd1, 0x30, 0x9d, 0x7f, 0x32, 0xa0, 0xf8, 0x92, 0xf8, 0xc1, 0x80, 0x7a, 0x3c, 0x97, 0x43, 0xfb, + 0x1b, 0xea, 0x8b, 0x28, 0x0b, 0x96, 0x24, 0x04, 0x77, 0xe0, 0x51, 0x5f, 0x78, 0xcf, 0xb9, 0x9c, + 0xe0, 0xdc, 0x91, 0xcd, 0xba, 0x7d, 0x73, 0x51, 0x72, 0x05, 0xc1, 0xb9, 0x9d, 0xf1, 0xc0, 0x75, + 0xcc, 0xbc, 0x44, 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb3, 0x87, + 0xc4, 0x2c, 0x88, 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x89, 0x16, 0xf3, 0xcd, 0x1b, 0x42, + 0x40, 0xe3, 0xe0, 0xdf, 0xe5, 0xe0, 0xe6, 0x74, 0x04, 0x1c, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, + 0xa3, 0xaa, 0x40, 0x67, 0xa1, 0x8f, 0x61, 0x95, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, + 0x70, 0x48, 0xc7, 0x1e, 0x53, 0xb1, 0x4c, 0x2f, 0x70, 0x4f, 0x98, 0x1d, 0x5c, 0x28, 0x31, 0x19, + 0x9c, 0xc6, 0x89, 0xeb, 0x2d, 0xaf, 0xd7, 0xdb, 0x16, 0x40, 0x9f, 0x06, 0xa1, 0xf1, 0x82, 0xd4, + 0x8a, 0x39, 0x08, 0xc3, 0xd2, 0xc0, 0x0b, 0x98, 0xed, 0x75, 0x89, 0x48, 0x81, 0x8c, 0x30, 0xc1, + 0x43, 0x1f, 0x43, 0x51, 0x45, 0x6c, 0x16, 0x45, 0x9d, 0x20, 0xad, 0x4e, 0x14, 0x44, 0x56, 0x28, + 0x82, 0xef, 0xc3, 0x4a, 0x9b, 0xd8, 0xbe, 0x43, 0xdf, 0x78, 0x0a, 0x4a, 0xb4, 0x01, 0x37, 0x7c, + 0x62, 0x07, 0xd4, 0x53, 0x59, 0x50, 0x14, 0xdf, 0x42, 0xb1, 0xe8, 0xc8, 0xbd, 0xc4, 0x26, 0x6c, + 0x1c, 0x13, 0xd6, 0xd0, 0x62, 0x0f, 0xab, 0xe1, 0x2d, 0xac, 0x4f, 0xad, 0x5c, 0x2f, 0xcb, 0x3f, + 0x81, 0x25, 0x3d, 0x99, 0x6a, 0xc3, 0xd5, 0xf5, 0x52, 0x8f, 0x97, 0x05, 0x7c, 0x09, 0x79, 0xfc, + 0x4f, 0x03, 0x56, 0x52, 0x12, 0xa8, 0x0a, 0xb9, 0x41, 0xf8, 0xb1, 0xdc, 0x40, 0xd4, 0x51, 0xd7, + 0x27, 0x36, 0x23, 0xce, 0xab, 0x3e, 0xf1, 0x04, 0x86, 0x65, 0x4b, 0x67, 0xc5, 0xe8, 0x2c, 0xea, + 0xe8, 0xec, 0x42, 0x41, 0x20, 0x68, 0xe6, 0x85, 0x53, 0xa6, 0xbe, 0x7b, 0xfb, 0xd4, 0x67, 0x6d, + 0x3b, 0x90, 0x15, 0x25, 0xc5, 0x50, 0x1d, 0x4a, 0x3e, 0xa5, 0xcc, 0xa2, 0x6e, 0x58, 0xac, 0x11, + 0x8d, 0x1e, 0x40, 0xad, 0x3b, 0xf6, 0x7d, 0xe2, 0x31, 0x6b, 0xec, 0x9d, 0x8d, 0x87, 0x1d, 0x22, + 0xeb, 0x75, 0xd9, 0x9a, 0xe2, 0xe3, 0x43, 0xb8, 0x79, 0x46, 0xde, 0x68, 0x51, 0x85, 0x48, 0x3d, + 0x80, 0x1a, 0x4f, 0x5b, 0xcf, 0xa5, 0x6f, 0xda, 0x64, 0x38, 0x72, 0xe3, 0xfe, 0x35, 0xc5, 0xc7, + 0x2d, 0x58, 0x4b, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x15, 0x2d, 0x7f, 0x42, 0x7b, 0x7e, 0xba, 0x75, + 0x71, 0xfc, 0xa1, 0xd8, 0x4e, 0x19, 0x9e, 0xa5, 0x52, 0x8e, 0x7f, 0x6d, 0xc0, 0x5a, 0x5a, 0xf2, + 0xff, 0xfe, 0x3c, 0x7a, 0x08, 0xa5, 0x30, 0x4e, 0xd5, 0x13, 0xd7, 0x34, 0x55, 0x9e, 0x67, 0xa1, + 0x13, 0x09, 0xe1, 0xbf, 0x1b, 0xb0, 0x79, 0x28, 0x97, 0xaf, 0x76, 0x1a, 0x3d, 0x86, 0x3c, 0xbb, + 0x1c, 0x11, 0x61, 0xba, 0xba, 0xf7, 0x91, 0x66, 0x7a, 0xa6, 0x8d, 0xdd, 0xe6, 0x88, 0xab, 0x58, + 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0x35, 0x9b, 0xcf, 0x6b, 0x0b, 0x08, 0x41, + 0xb5, 0xd5, 0xde, 0xb7, 0xda, 0xaf, 0xf7, 0x0f, 0xdb, 0x27, 0x2f, 0x4f, 0xda, 0x3f, 0xab, 0x19, + 0x68, 0x15, 0x96, 0x5b, 0xed, 0xe6, 0xf3, 0x98, 0x95, 0x43, 0xcb, 0x50, 0x3e, 0x6c, 0x9e, 0x3d, + 0x39, 0x39, 0x7e, 0x61, 0x35, 0x6a, 0x8b, 0xbc, 0x1b, 0x5b, 0x8d, 0x56, 0xa3, 0x5d, 0xcb, 0xa3, + 0x25, 0x28, 0x1d, 0x37, 0x5f, 0xcb, 0xde, 0x5c, 0xc0, 0x17, 0x70, 0x2b, 0xcb, 0x19, 0x9e, 0xdb, + 0x74, 0x38, 0x51, 0x51, 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xc5, 0x19, 0x85, 0xf8, 0x7b, 0x03, + 0xcc, 0x53, 0xea, 0x0c, 0x7a, 0x97, 0xd7, 0xca, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, + 0xb8, 0x8f, 0xef, 0x64, 0x23, 0xdb, 0x0c, 0xe5, 0x2c, 0x4d, 0x05, 0xdd, 0x83, 0xaa, 0x4f, 0xba, + 0xd4, 0xeb, 0x0d, 0xce, 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0xe1, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0xb7, + 0x06, 0xac, 0x67, 0x19, 0x43, 0x8f, 0x14, 0x7e, 0x72, 0xd8, 0xde, 0xbb, 0xe2, 0xdb, 0x09, 0xe8, + 0xe4, 0xde, 0x75, 0x65, 0x97, 0xcd, 0x85, 0x7b, 0x57, 0xd2, 0xf8, 0xfb, 0x19, 0xb0, 0xae, 0x40, + 0xc5, 0x6a, 0x9c, 0x36, 0x5f, 0x36, 0x5e, 0x5b, 0xcd, 0x67, 0x1c, 0xb1, 0x25, 0x28, 0xed, 0x1f, + 0x1d, 0x49, 0x2a, 0x8f, 0x7f, 0x63, 0xc0, 0x46, 0x46, 0xe6, 0x38, 0x4c, 0x5f, 0x41, 0xad, 0x67, + 0x0f, 0x5c, 0xe2, 0x34, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0x21, 0x37, 0x8d, + 0xb9, 0xde, 0xc8, 0xf0, 0x09, 0x6c, 0x1e, 0x91, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, 0xf2, + 0x05, 0x21, 0xa3, 0xb6, 0xe8, 0x7c, 0x39, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, 0xe2, + 0x81, 0x7d, 0x09, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x8a, 0x0a, 0xa6, 0xda, 0xe1, 0xb7, 0xf5, + 0xbd, 0x94, 0x96, 0xb1, 0xa6, 0xd5, 0xf0, 0x7f, 0x0c, 0x58, 0x4e, 0xf4, 0x58, 0x84, 0x20, 0xef, + 0x71, 0x70, 0xa4, 0xa3, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xf9, 0xa9, 0x28, + 0xce, 0xe7, 0x1d, 0xf9, 0xc4, 0x51, 0x69, 0x50, 0x14, 0xe7, 0xcb, 0x03, 0x9b, 0x9a, 0xc2, 0x8a, + 0x8a, 0xb3, 0x56, 0xd0, 0x77, 0xca, 0x6d, 0x28, 0x77, 0x5d, 0x3b, 0x08, 0xb4, 0xc9, 0x1b, 0x33, + 0x50, 0x03, 0xaa, 0x0e, 0x19, 0xb9, 0xf4, 0x32, 0x6c, 0x55, 0x6a, 0xfa, 0xea, 0x67, 0x3c, 0xee, + 0xfc, 0x51, 0x42, 0xc8, 0x4a, 0x29, 0xf1, 0x46, 0x89, 0xa6, 0xc5, 0x78, 0x39, 0xf2, 0x63, 0x80, + 0x16, 0x71, 0x44, 0x23, 0x13, 0x8a, 0xf6, 0x39, 0x17, 0x0c, 0x81, 0x0f, 0x49, 0xbe, 0x42, 0x7b, + 0x3d, 0xe2, 0x47, 0x81, 0x87, 0x24, 0x3f, 0x68, 0x90, 0xb7, 0xa4, 0x3b, 0x66, 0x94, 0x2f, 0xca, + 0xe8, 0x35, 0x0e, 0x5e, 0x85, 0x95, 0x63, 0xc2, 0x14, 0x00, 0x72, 0xa6, 0x3f, 0x86, 0xe5, 0x98, + 0xc5, 0xf1, 0x8d, 0xc6, 0xa1, 0x71, 0xad, 0x71, 0x88, 0x77, 0xa0, 0xaa, 0x0c, 0x68, 0x27, 0x0d, + 0x85, 0x8b, 0xa1, 0xe3, 0x82, 0x3f, 0x83, 0xa5, 0x48, 0x92, 0x7f, 0xe9, 0x43, 0xc8, 0xf3, 0x15, + 0x55, 0x3c, 0x6b, 0xa9, 0x8c, 0x8a, 0x6f, 0x08, 0x01, 0xdc, 0x80, 0x65, 0xce, 0x39, 0xe4, 0xa8, + 0xcc, 0xac, 0x12, 0x3e, 0xfe, 0xa5, 0xfa, 0x29, 0x75, 0x48, 0x34, 0xfe, 0x63, 0x16, 0xfe, 0x15, + 0x54, 0x0e, 0xe9, 0x70, 0x68, 0x7b, 0x8e, 0x30, 0x52, 0x83, 0x45, 0xe2, 0x4d, 0x44, 0x98, 0x65, + 0x8b, 0xff, 0x14, 0x05, 0xd2, 0x27, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x3b, 0xb1, 0xdd, 0x71, + 0xb4, 0xd9, 0x04, 0xc1, 0xcb, 0xc6, 0xf6, 0xcf, 0xc7, 0xf2, 0x38, 0x93, 0x17, 0x36, 0x62, 0x06, + 0x77, 0x70, 0x1c, 0x10, 0x5f, 0x55, 0x9a, 0xf8, 0x8d, 0x4f, 0xa1, 0x72, 0xd8, 0xb7, 0x3d, 0x8f, + 0xb8, 0x33, 0x63, 0x40, 0xda, 0x68, 0x2a, 0xab, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x13, 0x16, 0x57, + 0x39, 0xa7, 0xf0, 0x7f, 0x73, 0x50, 0x8a, 0xb6, 0xcd, 0x0f, 0xa0, 0x1c, 0x70, 0x70, 0x44, 0x85, + 0xca, 0x7c, 0xce, 0x06, 0x2e, 0x16, 0xe5, 0x7a, 0xdd, 0x30, 0xab, 0x6a, 0xd6, 0x9a, 0x29, 0x1c, + 0xa2, 0xac, 0x5b, 0xb1, 0x28, 0xfa, 0x29, 0xac, 0x0c, 0xbc, 0x0e, 0x1d, 0x7b, 0x8e, 0x0a, 0x29, + 0x30, 0x17, 0x45, 0xb9, 0x6c, 0xe8, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x03, 0xa8, 0xd1, + 0x31, 0x4b, 0x9a, 0xc8, 0xcf, 0x35, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, 0x64, + 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x1b, 0x8f, 0x57, 0xd6, 0x73, 0x9b, 0xf5, 0xd5, 0x9e, + 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x26, 0x27, 0x8e, 0xd8, 0xe9, 0x65, 0x4b, 0x12, 0xf8, 0x21, 0xac, + 0x25, 0x5b, 0x9a, 0xac, 0x75, 0x13, 0x8a, 0xb2, 0xba, 0x03, 0x55, 0x48, 0x21, 0x89, 0x7f, 0x6b, + 0xc0, 0xea, 0x54, 0x13, 0x44, 0x8f, 0xa0, 0x72, 0x31, 0x70, 0x5d, 0xe2, 0xb4, 0xaf, 0xb5, 0xc7, + 0x74, 0x61, 0xf4, 0x05, 0x2c, 0xf9, 0x63, 0xcf, 0x1b, 0x78, 0xe7, 0x61, 0xd7, 0x9e, 0xaf, 0x9c, + 0x90, 0xc6, 0x87, 0x62, 0xef, 0xf3, 0xd3, 0x53, 0xe4, 0x7c, 0x14, 0xa9, 0xa1, 0x45, 0xca, 0x73, + 0x33, 0xb2, 0x59, 0xbf, 0x35, 0x22, 0xdd, 0x70, 0x46, 0x86, 0x34, 0xfe, 0x8b, 0x01, 0xa5, 0xf0, + 0x00, 0x36, 0xab, 0x57, 0xab, 0xde, 0x9b, 0xcb, 0xee, 0xbd, 0x89, 0xa3, 0x77, 0x1d, 0x4a, 0xbd, + 0xb1, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0x85, 0x44, 0x66, 0xd1, 0x7d, 0x28, + 0xf0, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x0f, 0x87, 0x52, 0x02, 0x3f, 0x12, 0xdd, 0x4d, + 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x8e, 0x09, 0x7b, 0x95, + 0x3a, 0x72, 0x47, 0xd9, 0xdb, 0x86, 0x8a, 0x4f, 0x46, 0xf4, 0xb9, 0xcd, 0x18, 0xf1, 0xc3, 0x5b, + 0x95, 0xce, 0x42, 0x3b, 0xb0, 0xe2, 0x93, 0xc9, 0x80, 0xdf, 0xc8, 0x42, 0x29, 0x99, 0x95, 0x34, + 0x9b, 0xdb, 0xb2, 0x5d, 0xf7, 0xc0, 0xb7, 0xbd, 0x6e, 0x9f, 0x04, 0xea, 0x44, 0xa4, 0xb3, 0xc4, + 0x38, 0x70, 0xdd, 0xb6, 0x7d, 0x2e, 0xa7, 0x5a, 0xc9, 0x0a, 0x49, 0xdc, 0x81, 0xf5, 0xb4, 0x8f, + 0x21, 0x3c, 0xdc, 0x99, 0x10, 0x1e, 0xfe, 0x5b, 0xd4, 0x7d, 0x78, 0xa5, 0x50, 0xd8, 0x86, 0xb4, + 0x38, 0x1b, 0x29, 0xb7, 0x14, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x54, 0xf0, 0x9c, 0x9e, + 0xc2, 0x6a, 0xfa, 0x5e, 0x92, 0x75, 0xd6, 0xc9, 0x72, 0xd2, 0x9a, 0xd6, 0xc4, 0x08, 0x6a, 0xcf, + 0x06, 0x01, 0x3f, 0x6d, 0xd0, 0x68, 0x4a, 0xfd, 0x81, 0xd7, 0x1d, 0x19, 0xd1, 0x99, 0x75, 0x67, + 0x42, 0xd1, 0x21, 0x3d, 0x7b, 0xec, 0x32, 0xd5, 0xbc, 0x43, 0x12, 0xdd, 0x85, 0x65, 0xf5, 0x53, + 0xe6, 0x52, 0xc5, 0x96, 0x64, 0xa2, 0x4f, 0xe1, 0xe6, 0x20, 0x38, 0x76, 0x69, 0xc7, 0x76, 0x8f, + 0x12, 0xd2, 0x32, 0xd9, 0xd9, 0x8b, 0xf8, 0x47, 0x50, 0xd5, 0x5c, 0x0d, 0xeb, 0x8b, 0x53, 0x59, + 0xf5, 0xa5, 0xfc, 0xb7, 0xa4, 0x04, 0xfe, 0x12, 0xaa, 0xfb, 0x8e, 0xc3, 0xb9, 0x61, 0x45, 0x65, + 0x05, 0x36, 0xe5, 0x7e, 0x2e, 0xc3, 0x7d, 0xfc, 0x08, 0x96, 0x22, 0x5b, 0xdc, 0x8d, 0x07, 0x50, + 0xf3, 0xc8, 0x9b, 0x64, 0x24, 0xea, 0x0a, 0x99, 0xe6, 0xe3, 0xfb, 0xb0, 0x6a, 0x91, 0x21, 0x9d, + 0x10, 0xdd, 0x95, 0x75, 0x28, 0x0c, 0x3c, 0x87, 0xbc, 0x0d, 0x1f, 0x7b, 0x04, 0x81, 0x7f, 0x08, + 0x2b, 0xba, 0x28, 0xff, 0xd2, 0x3d, 0xa8, 0xc6, 0x16, 0xad, 0xb8, 0xde, 0x52, 0x5c, 0xfc, 0x11, + 0xac, 0x59, 0xa4, 0xe7, 0x93, 0xa0, 0xaf, 0x03, 0x3b, 0xe3, 0x3b, 0xdf, 0x85, 0x9b, 0x2d, 0xc2, + 0x34, 0xf5, 0xf9, 0xe2, 0x9f, 0xc1, 0xfb, 0x2d, 0xc2, 0x32, 0x00, 0xd2, 0x4e, 0x24, 0x1d, 0x3d, + 0x09, 0x8a, 0xc2, 0x5f, 0xc1, 0x7b, 0x2d, 0x22, 0x3e, 0x90, 0xa9, 0x96, 0xf9, 0x35, 0xcd, 0x58, + 0x2e, 0x61, 0xac, 0x08, 0x85, 0xc6, 0x70, 0xc4, 0x2e, 0xf7, 0xbe, 0x5d, 0x86, 0xa2, 0xba, 0xbd, + 0xa1, 0x43, 0xa8, 0xb4, 0x7d, 0xbb, 0x7b, 0x21, 0xdf, 0x01, 0x91, 0x39, 0xf5, 0x34, 0xa8, 0xbe, + 0x55, 0xdf, 0xc8, 0x58, 0xe1, 0x47, 0xe4, 0x85, 0xef, 0x19, 0xe8, 0x6b, 0xa8, 0xa5, 0x9f, 0xb7, + 0x10, 0xd6, 0xe4, 0x67, 0xbc, 0xde, 0xd5, 0xb7, 0xe7, 0xca, 0x08, 0xeb, 0xe8, 0x00, 0x4a, 0xe1, + 0xf3, 0x0f, 0xd2, 0x6f, 0xe8, 0xa9, 0xe7, 0xa3, 0xba, 0x99, 0xb9, 0x26, 0x6d, 0xbc, 0x12, 0xa3, + 0x45, 0x7f, 0x17, 0x42, 0x1f, 0x24, 0x3f, 0x9d, 0xf1, 0x9a, 0x54, 0xbf, 0x33, 0x4f, 0x44, 0x1a, + 0x6e, 0x43, 0x35, 0xf9, 0xba, 0x81, 0xf4, 0x90, 0x32, 0x5f, 0x4f, 0xea, 0x5b, 0x73, 0x24, 0x22, + 0xab, 0xc9, 0xef, 0xa1, 0xed, 0x99, 0xae, 0x64, 0x59, 0xcd, 0x78, 0xf1, 0xc0, 0x0b, 0xe8, 0x17, + 0x80, 0xa6, 0xaf, 0xec, 0xe8, 0xee, 0x75, 0x9e, 0x17, 0xea, 0xf8, 0x0a, 0x29, 0xf9, 0x85, 0x9f, + 0xc3, 0xea, 0xd4, 0x65, 0x13, 0x7d, 0x47, 0x53, 0x9d, 0x75, 0x89, 0xaf, 0x7f, 0x30, 0x5f, 0x28, + 0x0a, 0x60, 0xfa, 0xce, 0x97, 0x08, 0x60, 0xe6, 0xed, 0x32, 0x11, 0xc0, 0x8c, 0x8b, 0xa3, 0xac, + 0xb5, 0xf0, 0xae, 0x91, 0xa8, 0xb5, 0xd4, 0x9d, 0x24, 0x51, 0x6b, 0x89, 0xcb, 0x09, 0x5e, 0x40, + 0x8f, 0xa1, 0xa8, 0x58, 0x68, 0x73, 0x5a, 0x2c, 0xb4, 0x70, 0x2b, 0x6b, 0x49, 0x1a, 0x38, 0x83, + 0x25, 0xfd, 0x58, 0x86, 0xb6, 0x66, 0x5e, 0x5a, 0xa5, 0xa9, 0xb9, 0x97, 0xda, 0x28, 0x28, 0x71, + 0xc4, 0x48, 0x07, 0xa5, 0x1f, 0xb6, 0xd2, 0x41, 0xc5, 0x67, 0x12, 0xbc, 0x80, 0x7a, 0xe2, 0x61, + 0x75, 0x6a, 0xbc, 0xa2, 0x7b, 0x49, 0x9d, 0x59, 0x47, 0x91, 0xfa, 0xdd, 0x2b, 0xe5, 0xe4, 0x77, + 0x1a, 0x50, 0x8e, 0xe6, 0x15, 0x7a, 0x4f, 0x53, 0x4a, 0x0f, 0xdc, 0xfa, 0x66, 0xf6, 0x62, 0x84, + 0x81, 0x9a, 0x36, 0x09, 0x0c, 0x92, 0xd3, 0x2c, 0x81, 0x81, 0x3e, 0x9c, 0xf0, 0x02, 0x7a, 0x0a, + 0x10, 0xcf, 0x11, 0x74, 0x3b, 0x31, 0x24, 0x53, 0x93, 0xa8, 0x5e, 0x9f, 0xb1, 0x1a, 0x66, 0x7f, + 0x49, 0x1f, 0x2b, 0x09, 0x34, 0x33, 0xe6, 0x4d, 0xbd, 0xa6, 0x3f, 0xbe, 0xf0, 0x6e, 0x8d, 0x17, + 0xd0, 0x13, 0xa8, 0x26, 0xa7, 0x4d, 0xa2, 0x1f, 0x64, 0x0e, 0xa2, 0x4c, 0x3b, 0x2f, 0x61, 0x23, + 0x7b, 0x0c, 0xa1, 0x9d, 0xa4, 0xbd, 0xd9, 0x93, 0x2a, 0xd3, 0xae, 0x05, 0xeb, 0x59, 0x53, 0x2a, + 0x51, 0x1d, 0x73, 0xc6, 0x58, 0x96, 0xcd, 0x83, 0xcf, 0xff, 0xfa, 0x6e, 0xcb, 0xf8, 0xc7, 0xbb, + 0x2d, 0xe3, 0x5f, 0xef, 0xb6, 0x8c, 0x3f, 0xfe, 0x7b, 0x6b, 0x01, 0x70, 0xb7, 0xbf, 0xdb, 0x25, + 0xbe, 0xb7, 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8e, 0x3f, 0xea, 0x06, 0xc4, + 0x9f, 0x10, 0xff, 0xeb, 0xdc, 0xa8, 0xd3, 0xb9, 0x21, 0xfe, 0x9c, 0xfb, 0xe4, 0x7f, 0x01, 0x00, + 0x00, 0xff, 0xff, 0xfb, 0x76, 0xda, 0x3c, 0xb6, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3352,7 +3418,7 @@ type ControlClient interface { GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) @@ -3526,8 +3592,8 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt return out, nil } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) if err != nil { return nil, err @@ -3597,7 +3663,7 @@ type ControlServer interface { GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*Empty, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) @@ -5774,6 +5840,16 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) i += copy(dAtA[i:], m.DefaultBranch) } + if m.IsGlobalDefaultBranch { + dAtA[i] = 0x20 + i++ + if m.IsGlobalDefaultBranch { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i++ + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -5834,6 +5910,39 @@ func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i += copy(dAtA[i:], m.Name) } + if len(m.DefaultBranch) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) + i += copy(dAtA[i:], m.DefaultBranch) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + +func (m *AddRepoReply) 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 *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.NewDefaultBranch) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultBranch))) + i += copy(dAtA[i:], m.NewDefaultBranch) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -6975,6 +7084,9 @@ func (m *RepoInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if m.IsGlobalDefaultBranch { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7009,6 +7121,26 @@ func (m *AddRepoRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.DefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultBranch) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12507,6 +12639,26 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } m.DefaultBranch = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultBranch", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.IsGlobalDefaultBranch = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12681,6 +12833,124 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { } m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *AddRepoReply) 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 ErrIntOverflowO2Control + } + 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: AddRepoReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultBranch", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.NewDefaultBranch = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index a6e910f6b..392402f69 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -57,7 +57,7 @@ service Control { rpc GetWorkflowTemplates (GetWorkflowTemplatesRequest) returns (GetWorkflowTemplatesReply) {} rpc ListRepos(ListReposRequest) returns (ListReposReply) {} - rpc AddRepo(AddRepoRequest) returns (Empty) {} + rpc AddRepo(AddRepoRequest) returns (AddRepoReply) {} rpc RemoveRepo(RemoveRepoRequest) returns (RemoveRepoReply) {} rpc RefreshRepos(RefreshReposRequest) returns (Empty) {} rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} @@ -305,6 +305,7 @@ message RepoInfo { string name = 1; bool default = 2; string defaultBranch = 3; + bool isGlobalDefaultBranch = 4; } message ListReposReply { @@ -313,6 +314,11 @@ message ListReposReply { message AddRepoRequest { string name = 1; + string defaultBranch = 2; +} + +message AddRepoReply { + string newDefaultBranch = 1; } message RemoveRepoRequest { diff --git a/core/repos/repo.go b/core/repos/repo.go index 2aaaf440f..401bb4f3a 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,7 +26,6 @@ package repos import ( "errors" - "fmt" "github.com/gobwas/glob" "github.com/spf13/viper" "gopkg.in/src-d/go-git.v4" @@ -45,7 +44,7 @@ type Repo struct { Default bool } -func NewRepo(repoPath string) (*Repo, error) { +func NewRepo(repoPath string, defaultBranch string) (*Repo, error) { revSlice := strings.Split(repoPath, "@") @@ -53,7 +52,7 @@ func NewRepo(repoPath string) (*Repo, error) { var revision string //TODO: Decide between global and per-repo default branch - defaultBranch := viper.GetString("globalDefaultBranch") + //defaultBranch := viper.GetString("globalDefaultBranch") if len(revSlice) == 2 { //revision specified repoUrlSlice = strings.Split(revSlice[0], "/") @@ -69,10 +68,10 @@ func NewRepo(repoPath string) (*Repo, error) { return &Repo{}, errors.New("Repo path resolution failed") } - fmt.Print(repoPath + " " + revision) + newRepo := Repo{repoUrlSlice[0], repoUrlSlice[1], + repoUrlSlice[2], revision, defaultBranch, "", false} - return &Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, defaultBranch, "", false}, nil + return &newRepo, nil } func (r *Repo) GetIdentifier() string { @@ -188,7 +187,7 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } - err = r.checkoutRevision("master") + err = r.checkoutRevision(r.DefaultBranch) if err != nil { return err } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 5dccb2547..ff928d72e 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -65,6 +65,7 @@ func Instance(service *confsys.Service) *RepoManager { type RepoManager struct { repoList map[string]*Repo defaultRepo *Repo + defaultBranch string mutex sync.Mutex cService *confsys.Service } @@ -73,13 +74,13 @@ func initializeRepos(service *confsys.Service) *RepoManager { rm := RepoManager{repoList: map[string]*Repo {}} rm.cService = service + var err error // Get default branch - defaultBranch, err := rm.cService.GetDefaultBranch() + rm.defaultBranch, err = rm.cService.GetDefaultBranch() if err != nil { log.Warning("Failed to parse default_branch from backend") - defaultBranch = viper.GetString("defaultBranch") + rm.defaultBranch = viper.GetString("defaultBranch") } - viper.Set("globalDefaultBranch", defaultBranch) // Get default repo defaultRepo, err := rm.cService.GetDefaultRepo() @@ -89,7 +90,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } // Add default repo - err = rm.AddRepo(defaultRepo) + _, err = rm.AddRepo(defaultRepo, rm.defaultBranch) if err != nil { log.Fatal("Could not open default repo: ", err) } @@ -102,7 +103,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } for _, repo := range discoveredRepos { - err = rm.AddRepo(repo) + _, err = rm.AddRepo(repo, rm.defaultBranch) if err != nil && err.Error() != "Repo already present" { //Skip error for default repo log.Warning("Failed to add persistent repo: ", repo, " | ", err) } @@ -142,25 +143,79 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ return } -func (manager *RepoManager) AddRepo(repoPath string) error { +func (manager *RepoManager) checkDefaultBranch(repo *Repo) error { + _, err := git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ + URL: repo.getUrl(), + ReferenceName: plumbing.NewBranchReferenceName("master"), //Check out master so we have a working copy + }) + + if err != nil && err != git.ErrRepositoryAlreadyExists { + return err + } + + // Decide if revision = defaultBranch -> if yes lock them together + revIsDefault := false + if repo.DefaultBranch == repo.Revision { + revIsDefault = true + } + + // Check that the defaultBranch is valid + var prefixes []string + prefixes = append(prefixes, refRemotePrefix) + var matchedRevs []string + matchedRevs, err = repo.getRevisions(repo.DefaultBranch, prefixes) + if err != nil { + return err + } else if len(matchedRevs) == 0 { + log.Warning("Default branch " + repo.DefaultBranch + " invalid for " + repo.GetIdentifier()) + if repo.DefaultBranch != manager.defaultBranch { + log.Warning("Defaulting to global default branch: " + manager.defaultBranch) + repo.DefaultBranch = manager.defaultBranch + matchedRevs, err = repo.getRevisions(repo.DefaultBranch, prefixes) + if err != nil { + return err + } else if len(matchedRevs) == 0 { + log.Warning("Global default branch " + repo.DefaultBranch + " invalid for " + repo.GetIdentifier()) + } else { + if revIsDefault { + repo.Revision = repo.DefaultBranch + } + return nil + } + } + log.Warning("Defaulting to master") + repo.DefaultBranch = "master" + } + + if revIsDefault { + repo.Revision = repo.DefaultBranch + } + return nil +} + +func (manager *RepoManager) AddRepo(repoPath string, defaultBranch string) (string, error) { manager.mutex.Lock() defer manager.mutex.Unlock() utils.EnsureTrailingSlash(&repoPath) - repo, err := NewRepo(repoPath) + if defaultBranch == "" { + defaultBranch = manager.defaultBranch + } - // TODO: Handle the default revision here, within rm - // OR - // TODO: Handle the default revision within Repo + repo, err := NewRepo(repoPath, defaultBranch) if err != nil { - return err + return "", err } _, exists := manager.repoList[repo.GetIdentifier()] if !exists { //Try to clone it + err = manager.checkDefaultBranch(repo) + if err != nil { + return "", err + } _, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ URL: repo.getUrl(), @@ -169,17 +224,17 @@ func (manager *RepoManager) AddRepo(repoPath string) error { if err != nil { - if err == git.ErrRepositoryAlreadyExists { //Make sure master is checked out + if err == git.ErrRepositoryAlreadyExists { //Make sure the requested revision is checked out checkoutErr := repo.checkoutRevision(repo.Revision) if checkoutErr != nil { - return errors.New(err.Error() + " " + checkoutErr.Error()) + return "", errors.New(err.Error() + " " + checkoutErr.Error()) } } else { cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) if cleanErr != nil { - return errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) + return "", errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) } - return err + return "", err } } @@ -190,10 +245,10 @@ func (manager *RepoManager) AddRepo(repoPath string) error { manager.setDefaultRepo(repo) } } else { - return errors.New("Repo already present") + return "", errors.New("Repo already present") } - return nil + return repo.DefaultBranch, nil } func cleanCloneParentDirs(parentDirs []string) error { @@ -424,7 +479,8 @@ func (manager *RepoManager) SetGlobalDefaultBranch(branch string) error { return err } - viper.Set("globalDefaultBranch", branch) + viper.Set("globalDefaultBranch", branch) //TODO: Do I need this? + manager.defaultBranch = branch return nil } @@ -445,7 +501,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er reposRequired := make(map[Repo]bool) for _, taskClass := range taskClassesRequired { var newRepo *Repo - newRepo, err = NewRepo(taskClass) + newRepo, err = NewRepo(taskClass, manager.defaultBranch) if err != nil { return } @@ -456,7 +512,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er for repo := range reposRequired { existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { - err = manager.AddRepo(repo.GetIdentifier()) + _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultBranch) if err != nil { return } @@ -503,9 +559,9 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat if revisionPattern != "" { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") } - } else if revisionPattern == "" { // master if unspecified - revisionPattern = "master" - } + }/*else if revisionPattern == "" { // default branch if unspecified + revisionPattern = "" + }*/ // Prepare the gitRefs slice which will filter the git references var gitRefs []string @@ -536,6 +592,9 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat for _, repo := range repos { // For every repo get the templates for the revisions matching the revisionPattern; gitRefs to filter tags and/or branches + if revisionPattern == "" { // If the revision pattern is empty, use the default branch + revisionPattern = repo.DefaultBranch + } templates, err := repo.getWorkflows(revisionPattern, gitRefs) if err != nil { return nil, 0, err @@ -550,3 +609,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat return templateList, numTemplates, nil } + +func (manager *RepoManager) GetDefaultBranch() string { + return manager.defaultBranch +} diff --git a/core/server.go b/core/server.go index a5560b247..dbe4d277b 100644 --- a/core/server.go +++ b/core/server.go @@ -524,25 +524,26 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p for i, repoName := range keys { repo := repoList[repoName] - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultBranch: repo.DefaultBranch} + isGlobalDefaultBranch := repo.DefaultBranch == viper.GetString("globalDefaultBranch") + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultBranch: repo.DefaultBranch, IsGlobalDefaultBranch: isGlobalDefaultBranch} } return &pb.ListReposReply{Repos: repoInfos}, nil } -func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Empty, error) { +func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { m.logMethod() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - err := the.RepoManager().AddRepo(req.Name) + newDefaultBranch, err := the.RepoManager().AddRepo(req.Name, req.DefaultBranch) if err != nil { return nil, err } - return &pb.Empty{}, nil + return &pb.AddRepoReply{NewDefaultBranch: newDefaultBranch}, nil } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { diff --git a/core/task/manager.go b/core/task/manager.go index 667dcb3aa..ae17fd744 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -119,7 +119,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" var repo *repos.Repo - repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks/")[0]) + repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks/")[0], repoManager.GetDefaultBranch()) if err != nil { return } From 8d3c807b7bc39c8aa99cb51c2ac93437c15d261c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 4 Feb 2020 16:33:26 +0100 Subject: [PATCH 0082/2352] [core]s/branch/revision/g --- ...ult_branch.go => repo_default_revision.go} | 14 +- coconut/control/control.go | 30 +- coconut/protos/o2control.pb.go | 536 +++++++++--------- core/config.go | 2 +- core/confsys/service.go | 18 +- core/protos/o2control.pb.go | 536 +++++++++--------- core/protos/o2control.proto | 20 +- core/repos/repo.go | 20 +- core/repos/repomanager.go | 88 +-- core/server.go | 16 +- core/task/manager.go | 2 +- 11 files changed, 641 insertions(+), 641 deletions(-) rename coconut/cmd/{repo_default_branch.go => repo_default_revision.go} (75%) diff --git a/coconut/cmd/repo_default_branch.go b/coconut/cmd/repo_default_revision.go similarity index 75% rename from coconut/cmd/repo_default_branch.go rename to coconut/cmd/repo_default_revision.go index 16e90d2c9..ea11cb761 100644 --- a/coconut/cmd/repo_default_branch.go +++ b/coconut/cmd/repo_default_revision.go @@ -32,14 +32,14 @@ import ( ) // repoRemoveCmd represents the repository remove command -var repoDefaultBranchCmd = &cobra.Command{ - Use: "default-branch", - Short: "set default global and per-repository branch", - Long: fmt.Sprintf(`The repository default-branch command sets the global default -repository branch as well as the per-repository default branch.`), - Run: control.WrapCall(control.SetDefaultBranch), +var repoDefaultRevisionCmd = &cobra.Command{ + Use: "default-revision", + Short: "set default global and per-repository revision", + Long: fmt.Sprintf(`The repository default-revision command sets the global default +repository revision as well as the per-repository default revision.`), + Run: control.WrapCall(control.SetDefaultRevision), } func init() { - repoCmd.AddCommand(repoDefaultBranchCmd) + repoCmd.AddCommand(repoDefaultRevisionCmd) } diff --git a/coconut/control/control.go b/coconut/control/control.go index 0b6db4734..5380a5466 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -622,21 +622,21 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "No repositories found.") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "repository", "default", "default branch", "global default"}) + table.SetHeader([]string{"id", "repository", "default", "default revision", "global default"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlueColor} table.SetHeaderColor(fg, fg, fg, fg, fg) for i, root := range roots { defaultTick := "" - defaultBranchTick := "" + defaultRevisionTick := "" if root.GetDefault() { defaultTick = blue("YES") } - if root.GetIsGlobalDefaultBranch() { - defaultBranchTick = blue("YES") + if root.GetIsGlobalDefaultRevision() { + defaultRevisionTick = blue("YES") } - table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick, root.GetDefaultBranch(), defaultBranchTick}) + table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick, root.GetDefaultRevision(), defaultRevisionTick}) } fmt.Fprintf(o, "Git repositories used as configuration sources:\n\n") table.Render() @@ -649,29 +649,29 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { var name string - defaultBranch := "" + defaultRevision := "" if len(args) == 1 { name = args[0] } else if len(args) == 2 { name = args[0] - defaultBranch = args[1] + defaultRevision = args[1] } else if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 or 2 args, received %d", len(args))) return err } var response *pb.AddRepoReply - response, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: name, DefaultBranch: defaultBranch}, grpc.EmptyCallOption{}) + response, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: name, DefaultRevision: defaultRevision}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Cannot add repository.") return err } fmt.Fprintln(o, "Repository succesfully added.") - if response.GetNewDefaultBranch() != defaultBranch { - fmt.Fprintln(o, "Default branch specified not present in repository;") + if response.GetNewDefaultRevision() != defaultRevision { + fmt.Fprintln(o, "Default revision specified not present in repository;") //TODO: It's not clear here if it's the global default or master - fmt.Fprintln(o, "Fallback to default branch:", blue(response.GetNewDefaultBranch())) + fmt.Fprintln(o, "Fallback to default revision:", blue(response.GetNewDefaultRevision())) } return nil @@ -760,11 +760,11 @@ func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comm } -// SetDefaultBranch selects the default repository branch. +// SetDefaultRevision selects the default repository revision. // This can be done on the global or on the repository level. -func SetDefaultBranch(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { +func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { if len(args) == 1 { // Set global default - _, err := rpc.SetGlobalDefaultBranch(cxt, &pb.SetGlobalDefaultBranchRequest{Branch: args[0]}, grpc.EmptyCallOption{}) + _, err := rpc.SetGlobalDefaultRevision(cxt, &pb.SetGlobalDefaultRevisionRequest{Revision: args[0]}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Operation failed.") return err @@ -776,7 +776,7 @@ func SetDefaultBranch(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Co return err } - _, err = rpc.SetRepoDefaultBranch(cxt, &pb.SetRepoDefaultBranchRequest{Index: int32(index), Branch: args[1]}, grpc.EmptyCallOption{}) + _, err = rpc.SetRepoDefaultRevision(cxt, &pb.SetRepoDefaultRevisionRequest{Index: int32(index), Revision: args[1]}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Operation failed.") return err diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index da359ca5f..54f860ec2 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2634,13 +2634,13 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` - IsGlobalDefaultBranch bool `protobuf:"varint,4,opt,name=isGlobalDefaultBranch,proto3" json:"isGlobalDefaultBranch,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + IsGlobalDefaultRevision bool `protobuf:"varint,4,opt,name=isGlobalDefaultRevision,proto3" json:"isGlobalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2690,16 +2690,16 @@ func (m *RepoInfo) GetDefault() bool { return false } -func (m *RepoInfo) GetDefaultBranch() string { +func (m *RepoInfo) GetDefaultRevision() string { if m != nil { - return m.DefaultBranch + return m.DefaultRevision } return "" } -func (m *RepoInfo) GetIsGlobalDefaultBranch() bool { +func (m *RepoInfo) GetIsGlobalDefaultRevision() bool { if m != nil { - return m.IsGlobalDefaultBranch + return m.IsGlobalDefaultRevision } return false } @@ -2753,7 +2753,7 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultBranch string `protobuf:"bytes,2,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2799,15 +2799,15 @@ func (m *AddRepoRequest) GetName() string { return "" } -func (m *AddRepoRequest) GetDefaultBranch() string { +func (m *AddRepoRequest) GetDefaultRevision() string { if m != nil { - return m.DefaultBranch + return m.DefaultRevision } return "" } type AddRepoReply struct { - NewDefaultBranch string `protobuf:"bytes,1,opt,name=newDefaultBranch,proto3" json:"newDefaultBranch,omitempty"` + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2846,9 +2846,9 @@ func (m *AddRepoReply) XXX_DiscardUnknown() { var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo -func (m *AddRepoReply) GetNewDefaultBranch() string { +func (m *AddRepoReply) GetNewDefaultRevision() string { if m != nil { - return m.NewDefaultBranch + return m.NewDefaultRevision } return "" } @@ -3041,25 +3041,25 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } -type SetGlobalDefaultBranchRequest struct { - Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` +type SetGlobalDefaultRevisionRequest struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultBranchRequest{} } -func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} -func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { +func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } +func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } -func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { +func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetGlobalDefaultBranchRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3069,45 +3069,45 @@ func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *SetGlobalDefaultBranchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultBranchRequest.Merge(m, src) +func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) } -func (m *SetGlobalDefaultBranchRequest) XXX_Size() int { +func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { return m.Size() } -func (m *SetGlobalDefaultBranchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultBranchRequest.DiscardUnknown(m) +func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) } -var xxx_messageInfo_SetGlobalDefaultBranchRequest proto.InternalMessageInfo +var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetGlobalDefaultBranchRequest) GetBranch() string { +func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { if m != nil { - return m.Branch + return m.Revision } return "" } -type SetRepoDefaultBranchRequest struct { +type SetRepoDefaultRevisionRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranchRequest{} } -func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultBranchRequest) ProtoMessage() {} -func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { +func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } +func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } -func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { +func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultBranchRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3117,28 +3117,28 @@ func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *SetRepoDefaultBranchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultBranchRequest.Merge(m, src) +func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) } -func (m *SetRepoDefaultBranchRequest) XXX_Size() int { +func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultBranchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultBranchRequest.DiscardUnknown(m) +func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) } -var xxx_messageInfo_SetRepoDefaultBranchRequest proto.InternalMessageInfo +var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetRepoDefaultBranchRequest) GetIndex() int32 { +func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { if m != nil { return m.Index } return 0 } -func (m *SetRepoDefaultBranchRequest) GetBranch() string { +func (m *SetRepoDefaultRevisionRequest) GetRevision() string { if m != nil { - return m.Branch + return m.Revision } return "" } @@ -3236,159 +3236,159 @@ func init() { proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultBranchRequest)(nil), "o2control.SetGlobalDefaultBranchRequest") - proto.RegisterType((*SetRepoDefaultBranchRequest)(nil), "o2control.SetRepoDefaultBranchRequest") + proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2299 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, - 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0x43, - 0x2a, 0xe7, 0xe4, 0x0e, 0x07, 0x7c, 0x57, 0xdc, 0x11, 0x0e, 0x82, 0xff, 0x28, 0x8e, 0xef, 0x62, - 0x2b, 0xb5, 0x52, 0x92, 0xe2, 0xaa, 0xa8, 0xb0, 0xd2, 0x8e, 0x2c, 0x9d, 0x57, 0x3b, 0x62, 0x77, - 0xa4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xc0, 0x03, 0xaf, 0x57, 0x14, 0x8f, 0x7c, 0x0f, - 0x5e, 0x28, 0xe0, 0x1b, 0x50, 0xa1, 0x8a, 0x27, 0x3e, 0x04, 0x35, 0x7f, 0x76, 0x77, 0x76, 0xb5, - 0x92, 0x5d, 0xc5, 0x9b, 0xba, 0xa7, 0xbb, 0xb7, 0xbb, 0x7f, 0x3d, 0xdd, 0x33, 0x23, 0xd8, 0x18, - 0xf9, 0x94, 0xd1, 0xe0, 0x21, 0xdd, 0xeb, 0x52, 0x8f, 0xf9, 0xd4, 0xdd, 0x15, 0x0c, 0x54, 0x8e, - 0x18, 0x78, 0x03, 0xd6, 0x1b, 0x13, 0xe2, 0xb1, 0xd7, 0xa7, 0x24, 0xa0, 0xc1, 0x53, 0x62, 0xfb, - 0xac, 0x43, 0x6c, 0x86, 0x57, 0x60, 0xb9, 0xc5, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0xcb, 0x31, 0x09, - 0x18, 0xee, 0x40, 0x25, 0x64, 0x8c, 0xdc, 0x4b, 0xb4, 0x0e, 0x85, 0x80, 0xd9, 0x8c, 0x98, 0xc6, - 0xb6, 0xb1, 0x53, 0xb6, 0x24, 0x81, 0x7e, 0x0c, 0xcb, 0x81, 0x10, 0x7a, 0x31, 0x72, 0x6c, 0x46, - 0x02, 0x33, 0xb7, 0xbd, 0xb8, 0x53, 0xd9, 0xbb, 0xb5, 0x1b, 0x7b, 0xd0, 0xd2, 0xd6, 0xad, 0xa4, - 0x34, 0xfe, 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x04, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0x7c, 0xa5, - 0xba, 0xf7, 0xfe, 0x0c, 0x3b, 0xbb, 0xcf, 0xb8, 0x90, 0x25, 0x65, 0xd1, 0x09, 0x54, 0x87, 0x89, - 0x60, 0xcc, 0xdc, 0xb6, 0xb1, 0x53, 0xd9, 0xbb, 0xa3, 0x69, 0x67, 0xc5, 0xfc, 0x74, 0xc1, 0x4a, - 0x29, 0xe2, 0x4f, 0xa1, 0x20, 0x4c, 0xa3, 0x32, 0x14, 0x8e, 0x1a, 0x07, 0x2f, 0x8e, 0x6b, 0x0b, - 0xa8, 0x04, 0xf9, 0x93, 0xb3, 0x27, 0xcd, 0x9a, 0x81, 0x2a, 0x50, 0x7c, 0xb5, 0x6f, 0x9d, 0x9d, - 0x9c, 0x1d, 0xd7, 0x72, 0x5c, 0xa2, 0x61, 0x59, 0x4d, 0xab, 0xb6, 0x78, 0x50, 0x84, 0x82, 0xb0, - 0x8f, 0x37, 0xe1, 0xd6, 0x31, 0x61, 0x4f, 0x7c, 0x7b, 0x48, 0xde, 0x50, 0xff, 0xe2, 0xc4, 0xeb, - 0xd1, 0x30, 0x9d, 0x7f, 0x32, 0xa0, 0xf8, 0x92, 0xf8, 0xc1, 0x80, 0x7a, 0x3c, 0x97, 0x43, 0xfb, - 0x1b, 0xea, 0x8b, 0x28, 0x0b, 0x96, 0x24, 0x04, 0x77, 0xe0, 0x51, 0x5f, 0x78, 0xcf, 0xb9, 0x9c, - 0xe0, 0xdc, 0x91, 0xcd, 0xba, 0x7d, 0x73, 0x51, 0x72, 0x05, 0xc1, 0xb9, 0x9d, 0xf1, 0xc0, 0x75, - 0xcc, 0xbc, 0x44, 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb3, 0x87, - 0xc4, 0x2c, 0x88, 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x89, 0x16, 0xf3, 0xcd, 0x1b, 0x42, - 0x40, 0xe3, 0xe0, 0xdf, 0xe5, 0xe0, 0xe6, 0x74, 0x04, 0x1c, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, - 0xa3, 0xaa, 0x40, 0x67, 0xa1, 0x8f, 0x61, 0x95, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, - 0x70, 0x48, 0xc7, 0x1e, 0x53, 0xb1, 0x4c, 0x2f, 0x70, 0x4f, 0x98, 0x1d, 0x5c, 0x28, 0x31, 0x19, - 0x9c, 0xc6, 0x89, 0xeb, 0x2d, 0xaf, 0xd7, 0xdb, 0x16, 0x40, 0x9f, 0x06, 0xa1, 0xf1, 0x82, 0xd4, - 0x8a, 0x39, 0x08, 0xc3, 0xd2, 0xc0, 0x0b, 0x98, 0xed, 0x75, 0x89, 0x48, 0x81, 0x8c, 0x30, 0xc1, - 0x43, 0x1f, 0x43, 0x51, 0x45, 0x6c, 0x16, 0x45, 0x9d, 0x20, 0xad, 0x4e, 0x14, 0x44, 0x56, 0x28, - 0x82, 0xef, 0xc3, 0x4a, 0x9b, 0xd8, 0xbe, 0x43, 0xdf, 0x78, 0x0a, 0x4a, 0xb4, 0x01, 0x37, 0x7c, - 0x62, 0x07, 0xd4, 0x53, 0x59, 0x50, 0x14, 0xdf, 0x42, 0xb1, 0xe8, 0xc8, 0xbd, 0xc4, 0x26, 0x6c, - 0x1c, 0x13, 0xd6, 0xd0, 0x62, 0x0f, 0xab, 0xe1, 0x2d, 0xac, 0x4f, 0xad, 0x5c, 0x2f, 0xcb, 0x3f, - 0x81, 0x25, 0x3d, 0x99, 0x6a, 0xc3, 0xd5, 0xf5, 0x52, 0x8f, 0x97, 0x05, 0x7c, 0x09, 0x79, 0xfc, - 0x4f, 0x03, 0x56, 0x52, 0x12, 0xa8, 0x0a, 0xb9, 0x41, 0xf8, 0xb1, 0xdc, 0x40, 0xd4, 0x51, 0xd7, - 0x27, 0x36, 0x23, 0xce, 0xab, 0x3e, 0xf1, 0x04, 0x86, 0x65, 0x4b, 0x67, 0xc5, 0xe8, 0x2c, 0xea, - 0xe8, 0xec, 0x42, 0x41, 0x20, 0x68, 0xe6, 0x85, 0x53, 0xa6, 0xbe, 0x7b, 0xfb, 0xd4, 0x67, 0x6d, - 0x3b, 0x90, 0x15, 0x25, 0xc5, 0x50, 0x1d, 0x4a, 0x3e, 0xa5, 0xcc, 0xa2, 0x6e, 0x58, 0xac, 0x11, - 0x8d, 0x1e, 0x40, 0xad, 0x3b, 0xf6, 0x7d, 0xe2, 0x31, 0x6b, 0xec, 0x9d, 0x8d, 0x87, 0x1d, 0x22, - 0xeb, 0x75, 0xd9, 0x9a, 0xe2, 0xe3, 0x43, 0xb8, 0x79, 0x46, 0xde, 0x68, 0x51, 0x85, 0x48, 0x3d, - 0x80, 0x1a, 0x4f, 0x5b, 0xcf, 0xa5, 0x6f, 0xda, 0x64, 0x38, 0x72, 0xe3, 0xfe, 0x35, 0xc5, 0xc7, - 0x2d, 0x58, 0x4b, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x15, 0x2d, 0x7f, 0x42, 0x7b, 0x7e, 0xba, 0x75, - 0x71, 0xfc, 0xa1, 0xd8, 0x4e, 0x19, 0x9e, 0xa5, 0x52, 0x8e, 0x7f, 0x6d, 0xc0, 0x5a, 0x5a, 0xf2, - 0xff, 0xfe, 0x3c, 0x7a, 0x08, 0xa5, 0x30, 0x4e, 0xd5, 0x13, 0xd7, 0x34, 0x55, 0x9e, 0x67, 0xa1, - 0x13, 0x09, 0xe1, 0xbf, 0x1b, 0xb0, 0x79, 0x28, 0x97, 0xaf, 0x76, 0x1a, 0x3d, 0x86, 0x3c, 0xbb, - 0x1c, 0x11, 0x61, 0xba, 0xba, 0xf7, 0x91, 0x66, 0x7a, 0xa6, 0x8d, 0xdd, 0xe6, 0x88, 0xab, 0x58, - 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0x35, 0x9b, 0xcf, 0x6b, 0x0b, 0x08, 0x41, - 0xb5, 0xd5, 0xde, 0xb7, 0xda, 0xaf, 0xf7, 0x0f, 0xdb, 0x27, 0x2f, 0x4f, 0xda, 0x3f, 0xab, 0x19, - 0x68, 0x15, 0x96, 0x5b, 0xed, 0xe6, 0xf3, 0x98, 0x95, 0x43, 0xcb, 0x50, 0x3e, 0x6c, 0x9e, 0x3d, - 0x39, 0x39, 0x7e, 0x61, 0x35, 0x6a, 0x8b, 0xbc, 0x1b, 0x5b, 0x8d, 0x56, 0xa3, 0x5d, 0xcb, 0xa3, - 0x25, 0x28, 0x1d, 0x37, 0x5f, 0xcb, 0xde, 0x5c, 0xc0, 0x17, 0x70, 0x2b, 0xcb, 0x19, 0x9e, 0xdb, - 0x74, 0x38, 0x51, 0x51, 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xc5, 0x19, 0x85, 0xf8, 0x7b, 0x03, - 0xcc, 0x53, 0xea, 0x0c, 0x7a, 0x97, 0xd7, 0xca, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, - 0xb8, 0x8f, 0xef, 0x64, 0x23, 0xdb, 0x0c, 0xe5, 0x2c, 0x4d, 0x05, 0xdd, 0x83, 0xaa, 0x4f, 0xba, - 0xd4, 0xeb, 0x0d, 0xce, 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0xe1, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0xb7, - 0x06, 0xac, 0x67, 0x19, 0x43, 0x8f, 0x14, 0x7e, 0x72, 0xd8, 0xde, 0xbb, 0xe2, 0xdb, 0x09, 0xe8, - 0xe4, 0xde, 0x75, 0x65, 0x97, 0xcd, 0x85, 0x7b, 0x57, 0xd2, 0xf8, 0xfb, 0x19, 0xb0, 0xae, 0x40, - 0xc5, 0x6a, 0x9c, 0x36, 0x5f, 0x36, 0x5e, 0x5b, 0xcd, 0x67, 0x1c, 0xb1, 0x25, 0x28, 0xed, 0x1f, - 0x1d, 0x49, 0x2a, 0x8f, 0x7f, 0x63, 0xc0, 0x46, 0x46, 0xe6, 0x38, 0x4c, 0x5f, 0x41, 0xad, 0x67, - 0x0f, 0x5c, 0xe2, 0x34, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0x21, 0x37, 0x8d, - 0xb9, 0xde, 0xc8, 0xf0, 0x09, 0x6c, 0x1e, 0x91, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, 0xf2, - 0x05, 0x21, 0xa3, 0xb6, 0xe8, 0x7c, 0x39, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, 0xe2, - 0x81, 0x7d, 0x09, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x8a, 0x0a, 0xa6, 0xda, 0xe1, 0xb7, 0xf5, - 0xbd, 0x94, 0x96, 0xb1, 0xa6, 0xd5, 0xf0, 0x7f, 0x0c, 0x58, 0x4e, 0xf4, 0x58, 0x84, 0x20, 0xef, - 0x71, 0x70, 0xa4, 0xa3, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xf9, 0xa9, 0x28, - 0xce, 0xe7, 0x1d, 0xf9, 0xc4, 0x51, 0x69, 0x50, 0x14, 0xe7, 0xcb, 0x03, 0x9b, 0x9a, 0xc2, 0x8a, - 0x8a, 0xb3, 0x56, 0xd0, 0x77, 0xca, 0x6d, 0x28, 0x77, 0x5d, 0x3b, 0x08, 0xb4, 0xc9, 0x1b, 0x33, - 0x50, 0x03, 0xaa, 0x0e, 0x19, 0xb9, 0xf4, 0x32, 0x6c, 0x55, 0x6a, 0xfa, 0xea, 0x67, 0x3c, 0xee, - 0xfc, 0x51, 0x42, 0xc8, 0x4a, 0x29, 0xf1, 0x46, 0x89, 0xa6, 0xc5, 0x78, 0x39, 0xf2, 0x63, 0x80, - 0x16, 0x71, 0x44, 0x23, 0x13, 0x8a, 0xf6, 0x39, 0x17, 0x0c, 0x81, 0x0f, 0x49, 0xbe, 0x42, 0x7b, - 0x3d, 0xe2, 0x47, 0x81, 0x87, 0x24, 0x3f, 0x68, 0x90, 0xb7, 0xa4, 0x3b, 0x66, 0x94, 0x2f, 0xca, - 0xe8, 0x35, 0x0e, 0x5e, 0x85, 0x95, 0x63, 0xc2, 0x14, 0x00, 0x72, 0xa6, 0x3f, 0x86, 0xe5, 0x98, - 0xc5, 0xf1, 0x8d, 0xc6, 0xa1, 0x71, 0xad, 0x71, 0x88, 0x77, 0xa0, 0xaa, 0x0c, 0x68, 0x27, 0x0d, - 0x85, 0x8b, 0xa1, 0xe3, 0x82, 0x3f, 0x83, 0xa5, 0x48, 0x92, 0x7f, 0xe9, 0x43, 0xc8, 0xf3, 0x15, - 0x55, 0x3c, 0x6b, 0xa9, 0x8c, 0x8a, 0x6f, 0x08, 0x01, 0xdc, 0x80, 0x65, 0xce, 0x39, 0xe4, 0xa8, - 0xcc, 0xac, 0x12, 0x3e, 0xfe, 0xa5, 0xfa, 0x29, 0x75, 0x48, 0x34, 0xfe, 0x63, 0x16, 0xfe, 0x15, - 0x54, 0x0e, 0xe9, 0x70, 0x68, 0x7b, 0x8e, 0x30, 0x52, 0x83, 0x45, 0xe2, 0x4d, 0x44, 0x98, 0x65, - 0x8b, 0xff, 0x14, 0x05, 0xd2, 0x27, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x3b, 0xb1, 0xdd, 0x71, - 0xb4, 0xd9, 0x04, 0xc1, 0xcb, 0xc6, 0xf6, 0xcf, 0xc7, 0xf2, 0x38, 0x93, 0x17, 0x36, 0x62, 0x06, - 0x77, 0x70, 0x1c, 0x10, 0x5f, 0x55, 0x9a, 0xf8, 0x8d, 0x4f, 0xa1, 0x72, 0xd8, 0xb7, 0x3d, 0x8f, - 0xb8, 0x33, 0x63, 0x40, 0xda, 0x68, 0x2a, 0xab, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x13, 0x16, 0x57, - 0x39, 0xa7, 0xf0, 0x7f, 0x73, 0x50, 0x8a, 0xb6, 0xcd, 0x0f, 0xa0, 0x1c, 0x70, 0x70, 0x44, 0x85, - 0xca, 0x7c, 0xce, 0x06, 0x2e, 0x16, 0xe5, 0x7a, 0xdd, 0x30, 0xab, 0x6a, 0xd6, 0x9a, 0x29, 0x1c, - 0xa2, 0xac, 0x5b, 0xb1, 0x28, 0xfa, 0x29, 0xac, 0x0c, 0xbc, 0x0e, 0x1d, 0x7b, 0x8e, 0x0a, 0x29, - 0x30, 0x17, 0x45, 0xb9, 0x6c, 0xe8, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x03, 0xa8, 0xd1, - 0x31, 0x4b, 0x9a, 0xc8, 0xcf, 0x35, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, 0x64, - 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x1b, 0x8f, 0x57, 0xd6, 0x73, 0x9b, 0xf5, 0xd5, 0x9e, - 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x26, 0x27, 0x8e, 0xd8, 0xe9, 0x65, 0x4b, 0x12, 0xf8, 0x21, 0xac, - 0x25, 0x5b, 0x9a, 0xac, 0x75, 0x13, 0x8a, 0xb2, 0xba, 0x03, 0x55, 0x48, 0x21, 0x89, 0x7f, 0x6b, - 0xc0, 0xea, 0x54, 0x13, 0x44, 0x8f, 0xa0, 0x72, 0x31, 0x70, 0x5d, 0xe2, 0xb4, 0xaf, 0xb5, 0xc7, - 0x74, 0x61, 0xf4, 0x05, 0x2c, 0xf9, 0x63, 0xcf, 0x1b, 0x78, 0xe7, 0x61, 0xd7, 0x9e, 0xaf, 0x9c, - 0x90, 0xc6, 0x87, 0x62, 0xef, 0xf3, 0xd3, 0x53, 0xe4, 0x7c, 0x14, 0xa9, 0xa1, 0x45, 0xca, 0x73, - 0x33, 0xb2, 0x59, 0xbf, 0x35, 0x22, 0xdd, 0x70, 0x46, 0x86, 0x34, 0xfe, 0x8b, 0x01, 0xa5, 0xf0, - 0x00, 0x36, 0xab, 0x57, 0xab, 0xde, 0x9b, 0xcb, 0xee, 0xbd, 0x89, 0xa3, 0x77, 0x1d, 0x4a, 0xbd, - 0xb1, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0x85, 0x44, 0x66, 0xd1, 0x7d, 0x28, - 0xf0, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x0f, 0x87, 0x52, 0x02, 0x3f, 0x12, 0xdd, 0x4d, - 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x8e, 0x09, 0x7b, 0x95, - 0x3a, 0x72, 0x47, 0xd9, 0xdb, 0x86, 0x8a, 0x4f, 0x46, 0xf4, 0xb9, 0xcd, 0x18, 0xf1, 0xc3, 0x5b, - 0x95, 0xce, 0x42, 0x3b, 0xb0, 0xe2, 0x93, 0xc9, 0x80, 0xdf, 0xc8, 0x42, 0x29, 0x99, 0x95, 0x34, - 0x9b, 0xdb, 0xb2, 0x5d, 0xf7, 0xc0, 0xb7, 0xbd, 0x6e, 0x9f, 0x04, 0xea, 0x44, 0xa4, 0xb3, 0xc4, - 0x38, 0x70, 0xdd, 0xb6, 0x7d, 0x2e, 0xa7, 0x5a, 0xc9, 0x0a, 0x49, 0xdc, 0x81, 0xf5, 0xb4, 0x8f, - 0x21, 0x3c, 0xdc, 0x99, 0x10, 0x1e, 0xfe, 0x5b, 0xd4, 0x7d, 0x78, 0xa5, 0x50, 0xd8, 0x86, 0xb4, - 0x38, 0x1b, 0x29, 0xb7, 0x14, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x54, 0xf0, 0x9c, 0x9e, - 0xc2, 0x6a, 0xfa, 0x5e, 0x92, 0x75, 0xd6, 0xc9, 0x72, 0xd2, 0x9a, 0xd6, 0xc4, 0x08, 0x6a, 0xcf, - 0x06, 0x01, 0x3f, 0x6d, 0xd0, 0x68, 0x4a, 0xfd, 0x81, 0xd7, 0x1d, 0x19, 0xd1, 0x99, 0x75, 0x67, - 0x42, 0xd1, 0x21, 0x3d, 0x7b, 0xec, 0x32, 0xd5, 0xbc, 0x43, 0x12, 0xdd, 0x85, 0x65, 0xf5, 0x53, - 0xe6, 0x52, 0xc5, 0x96, 0x64, 0xa2, 0x4f, 0xe1, 0xe6, 0x20, 0x38, 0x76, 0x69, 0xc7, 0x76, 0x8f, - 0x12, 0xd2, 0x32, 0xd9, 0xd9, 0x8b, 0xf8, 0x47, 0x50, 0xd5, 0x5c, 0x0d, 0xeb, 0x8b, 0x53, 0x59, - 0xf5, 0xa5, 0xfc, 0xb7, 0xa4, 0x04, 0xfe, 0x12, 0xaa, 0xfb, 0x8e, 0xc3, 0xb9, 0x61, 0x45, 0x65, - 0x05, 0x36, 0xe5, 0x7e, 0x2e, 0xc3, 0x7d, 0xfc, 0x08, 0x96, 0x22, 0x5b, 0xdc, 0x8d, 0x07, 0x50, - 0xf3, 0xc8, 0x9b, 0x64, 0x24, 0xea, 0x0a, 0x99, 0xe6, 0xe3, 0xfb, 0xb0, 0x6a, 0x91, 0x21, 0x9d, - 0x10, 0xdd, 0x95, 0x75, 0x28, 0x0c, 0x3c, 0x87, 0xbc, 0x0d, 0x1f, 0x7b, 0x04, 0x81, 0x7f, 0x08, - 0x2b, 0xba, 0x28, 0xff, 0xd2, 0x3d, 0xa8, 0xc6, 0x16, 0xad, 0xb8, 0xde, 0x52, 0x5c, 0xfc, 0x11, - 0xac, 0x59, 0xa4, 0xe7, 0x93, 0xa0, 0xaf, 0x03, 0x3b, 0xe3, 0x3b, 0xdf, 0x85, 0x9b, 0x2d, 0xc2, - 0x34, 0xf5, 0xf9, 0xe2, 0x9f, 0xc1, 0xfb, 0x2d, 0xc2, 0x32, 0x00, 0xd2, 0x4e, 0x24, 0x1d, 0x3d, - 0x09, 0x8a, 0xc2, 0x5f, 0xc1, 0x7b, 0x2d, 0x22, 0x3e, 0x90, 0xa9, 0x96, 0xf9, 0x35, 0xcd, 0x58, - 0x2e, 0x61, 0xac, 0x08, 0x85, 0xc6, 0x70, 0xc4, 0x2e, 0xf7, 0xbe, 0x5d, 0x86, 0xa2, 0xba, 0xbd, - 0xa1, 0x43, 0xa8, 0xb4, 0x7d, 0xbb, 0x7b, 0x21, 0xdf, 0x01, 0x91, 0x39, 0xf5, 0x34, 0xa8, 0xbe, - 0x55, 0xdf, 0xc8, 0x58, 0xe1, 0x47, 0xe4, 0x85, 0xef, 0x19, 0xe8, 0x6b, 0xa8, 0xa5, 0x9f, 0xb7, - 0x10, 0xd6, 0xe4, 0x67, 0xbc, 0xde, 0xd5, 0xb7, 0xe7, 0xca, 0x08, 0xeb, 0xe8, 0x00, 0x4a, 0xe1, - 0xf3, 0x0f, 0xd2, 0x6f, 0xe8, 0xa9, 0xe7, 0xa3, 0xba, 0x99, 0xb9, 0x26, 0x6d, 0xbc, 0x12, 0xa3, - 0x45, 0x7f, 0x17, 0x42, 0x1f, 0x24, 0x3f, 0x9d, 0xf1, 0x9a, 0x54, 0xbf, 0x33, 0x4f, 0x44, 0x1a, - 0x6e, 0x43, 0x35, 0xf9, 0xba, 0x81, 0xf4, 0x90, 0x32, 0x5f, 0x4f, 0xea, 0x5b, 0x73, 0x24, 0x22, - 0xab, 0xc9, 0xef, 0xa1, 0xed, 0x99, 0xae, 0x64, 0x59, 0xcd, 0x78, 0xf1, 0xc0, 0x0b, 0xe8, 0x17, - 0x80, 0xa6, 0xaf, 0xec, 0xe8, 0xee, 0x75, 0x9e, 0x17, 0xea, 0xf8, 0x0a, 0x29, 0xf9, 0x85, 0x9f, - 0xc3, 0xea, 0xd4, 0x65, 0x13, 0x7d, 0x47, 0x53, 0x9d, 0x75, 0x89, 0xaf, 0x7f, 0x30, 0x5f, 0x28, - 0x0a, 0x60, 0xfa, 0xce, 0x97, 0x08, 0x60, 0xe6, 0xed, 0x32, 0x11, 0xc0, 0x8c, 0x8b, 0xa3, 0xac, - 0xb5, 0xf0, 0xae, 0x91, 0xa8, 0xb5, 0xd4, 0x9d, 0x24, 0x51, 0x6b, 0x89, 0xcb, 0x09, 0x5e, 0x40, - 0x8f, 0xa1, 0xa8, 0x58, 0x68, 0x73, 0x5a, 0x2c, 0xb4, 0x70, 0x2b, 0x6b, 0x49, 0x1a, 0x38, 0x83, - 0x25, 0xfd, 0x58, 0x86, 0xb6, 0x66, 0x5e, 0x5a, 0xa5, 0xa9, 0xb9, 0x97, 0xda, 0x28, 0x28, 0x71, - 0xc4, 0x48, 0x07, 0xa5, 0x1f, 0xb6, 0xd2, 0x41, 0xc5, 0x67, 0x12, 0xbc, 0x80, 0x7a, 0xe2, 0x61, - 0x75, 0x6a, 0xbc, 0xa2, 0x7b, 0x49, 0x9d, 0x59, 0x47, 0x91, 0xfa, 0xdd, 0x2b, 0xe5, 0xe4, 0x77, - 0x1a, 0x50, 0x8e, 0xe6, 0x15, 0x7a, 0x4f, 0x53, 0x4a, 0x0f, 0xdc, 0xfa, 0x66, 0xf6, 0x62, 0x84, - 0x81, 0x9a, 0x36, 0x09, 0x0c, 0x92, 0xd3, 0x2c, 0x81, 0x81, 0x3e, 0x9c, 0xf0, 0x02, 0x7a, 0x0a, - 0x10, 0xcf, 0x11, 0x74, 0x3b, 0x31, 0x24, 0x53, 0x93, 0xa8, 0x5e, 0x9f, 0xb1, 0x1a, 0x66, 0x7f, - 0x49, 0x1f, 0x2b, 0x09, 0x34, 0x33, 0xe6, 0x4d, 0xbd, 0xa6, 0x3f, 0xbe, 0xf0, 0x6e, 0x8d, 0x17, - 0xd0, 0x13, 0xa8, 0x26, 0xa7, 0x4d, 0xa2, 0x1f, 0x64, 0x0e, 0xa2, 0x4c, 0x3b, 0x2f, 0x61, 0x23, - 0x7b, 0x0c, 0xa1, 0x9d, 0xa4, 0xbd, 0xd9, 0x93, 0x2a, 0xd3, 0xae, 0x05, 0xeb, 0x59, 0x53, 0x2a, - 0x51, 0x1d, 0x73, 0xc6, 0x58, 0x96, 0xcd, 0x83, 0xcf, 0xff, 0xfa, 0x6e, 0xcb, 0xf8, 0xc7, 0xbb, - 0x2d, 0xe3, 0x5f, 0xef, 0xb6, 0x8c, 0x3f, 0xfe, 0x7b, 0x6b, 0x01, 0x70, 0xb7, 0xbf, 0xdb, 0x25, - 0xbe, 0xb7, 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8e, 0x3f, 0xea, 0x06, 0xc4, - 0x9f, 0x10, 0xff, 0xeb, 0xdc, 0xa8, 0xd3, 0xb9, 0x21, 0xfe, 0x9c, 0xfb, 0xe4, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xfb, 0x76, 0xda, 0x3c, 0xb6, 0x1b, 0x00, 0x00, + // 2298 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcf, 0x73, 0x1b, 0x49, + 0xf5, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0x36, 0xeb, 0x78, 0xfb, + 0xbb, 0x95, 0x75, 0xb2, 0xfb, 0x75, 0xc0, 0x4b, 0x41, 0x08, 0xbb, 0x1b, 0xfc, 0x43, 0x71, 0x0c, + 0xb1, 0x15, 0x46, 0x4a, 0x52, 0xa4, 0x8a, 0x0a, 0x63, 0x4d, 0xcb, 0xd2, 0x7a, 0x34, 0x2d, 0x66, + 0x5a, 0x4e, 0x7c, 0xe0, 0xc6, 0x8d, 0xa2, 0x38, 0x70, 0xe1, 0xc0, 0x85, 0xa2, 0x38, 0x70, 0xe0, + 0xff, 0xe0, 0x42, 0x01, 0xff, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x47, 0x50, 0xfd, 0x63, 0x66, 0x7a, + 0x46, 0x33, 0x8a, 0xab, 0xb8, 0xe9, 0xbd, 0x7e, 0xef, 0x4d, 0xbf, 0xf7, 0x79, 0xfd, 0xde, 0xeb, + 0x16, 0xac, 0x8d, 0x7d, 0xca, 0x68, 0x70, 0x9f, 0xee, 0xf6, 0xa8, 0xc7, 0x7c, 0xea, 0xee, 0x08, + 0x06, 0xaa, 0x46, 0x0c, 0xbc, 0x06, 0xab, 0xad, 0x4b, 0xe2, 0xb1, 0xd7, 0x27, 0x24, 0xa0, 0xc1, + 0x13, 0x62, 0xfb, 0xec, 0x8c, 0xd8, 0x0c, 0x2f, 0xc1, 0x62, 0x87, 0xd9, 0x6c, 0x12, 0x58, 0xe4, + 0x67, 0x13, 0x12, 0x30, 0x7c, 0x06, 0xb5, 0x90, 0x31, 0x76, 0xaf, 0xd0, 0x2a, 0x94, 0x02, 0x66, + 0x33, 0x62, 0x1a, 0x5b, 0xc6, 0x76, 0xd5, 0x92, 0x04, 0xfa, 0x12, 0x16, 0x03, 0x21, 0xf4, 0x7c, + 0xec, 0xd8, 0x8c, 0x04, 0x66, 0x61, 0x6b, 0x7e, 0xbb, 0xb6, 0xbb, 0xbe, 0x13, 0xef, 0xa0, 0xa3, + 0xad, 0x5b, 0x49, 0x69, 0xfc, 0x57, 0x03, 0x16, 0xf4, 0x75, 0xf4, 0x39, 0x94, 0x5c, 0x72, 0x49, + 0x5c, 0xf1, 0x95, 0xfa, 0xee, 0x87, 0x39, 0x76, 0x76, 0x9e, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x63, + 0xa8, 0x8f, 0x12, 0xce, 0x98, 0x85, 0x2d, 0x63, 0xbb, 0xb6, 0x7b, 0x5b, 0xd3, 0xce, 0xf2, 0xf9, + 0xc9, 0x9c, 0x95, 0x52, 0xc4, 0xdf, 0x82, 0x92, 0x30, 0x8d, 0xaa, 0x50, 0x3a, 0x6c, 0xed, 0x3f, + 0x3f, 0x6a, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4f, 0x1f, 0xb7, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xe5, + 0x9e, 0x75, 0x7a, 0x7c, 0x7a, 0xd4, 0x28, 0x70, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x7e, + 0x19, 0x4a, 0xc2, 0x3e, 0xde, 0x80, 0xf5, 0x23, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, + 0xc5, 0xb1, 0xd7, 0xa7, 0x61, 0x38, 0xff, 0x60, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, + 0x2c, 0x47, 0xf6, 0xd7, 0xd4, 0x17, 0x5e, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xd8, + 0x3d, 0xe7, 0x72, 0x82, 0x73, 0xc7, 0x36, 0xeb, 0x0d, 0xcc, 0x79, 0xc9, 0x15, 0x04, 0xe7, 0x9e, + 0x4d, 0x86, 0xae, 0x63, 0x16, 0x25, 0x1a, 0x82, 0x40, 0x5b, 0x50, 0x1b, 0xfb, 0xd4, 0x99, 0xf4, + 0xd8, 0xa9, 0x3d, 0x22, 0x66, 0x49, 0xac, 0xe9, 0x2c, 0xb4, 0x09, 0x70, 0x29, 0x37, 0xd1, 0x61, + 0xbe, 0x79, 0x43, 0x08, 0x68, 0x1c, 0xfc, 0xeb, 0x02, 0xdc, 0x9c, 0xf6, 0x80, 0xe3, 0xbf, 0x05, + 0xb5, 0x7e, 0xc4, 0x75, 0x54, 0x16, 0xe8, 0x2c, 0xf4, 0x19, 0x2c, 0x13, 0xef, 0x72, 0xe8, 0x53, + 0x6f, 0x44, 0x3c, 0x16, 0x1c, 0xd0, 0x89, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0x7c, 0x27, 0xcc, 0x0e, + 0x2e, 0x94, 0x98, 0x74, 0x4e, 0xe3, 0xc4, 0xf9, 0x56, 0xd4, 0xf3, 0x6d, 0x13, 0x60, 0x40, 0x83, + 0xd0, 0x78, 0x49, 0x6a, 0xc5, 0x1c, 0x84, 0x61, 0x61, 0xe8, 0x05, 0xcc, 0xf6, 0x7a, 0x44, 0x84, + 0x40, 0x7a, 0x98, 0xe0, 0xa1, 0xcf, 0xa0, 0xac, 0x3c, 0x36, 0xcb, 0x22, 0x4f, 0x90, 0x96, 0x27, + 0x0a, 0x22, 0x2b, 0x14, 0xc1, 0x77, 0x61, 0xa9, 0x4b, 0x6c, 0xdf, 0xa1, 0x6f, 0x3c, 0x05, 0x25, + 0x5a, 0x83, 0x1b, 0x3e, 0xb1, 0x03, 0xea, 0xa9, 0x28, 0x28, 0x8a, 0x1f, 0xa1, 0x58, 0x74, 0xec, + 0x5e, 0x61, 0x13, 0xd6, 0x8e, 0x08, 0x6b, 0x69, 0xbe, 0x87, 0xd9, 0xf0, 0x16, 0x56, 0xa7, 0x56, + 0xae, 0x17, 0xe5, 0xaf, 0x60, 0x41, 0x0f, 0xa6, 0x3a, 0x70, 0x4d, 0x3d, 0xd5, 0xe3, 0x65, 0x01, + 0x5f, 0x42, 0x1e, 0xff, 0xc3, 0x80, 0xa5, 0x94, 0x04, 0xaa, 0x43, 0x61, 0x18, 0x7e, 0xac, 0x30, + 0x14, 0x79, 0xd4, 0xf3, 0x89, 0xcd, 0x88, 0xf3, 0x72, 0x40, 0x3c, 0x81, 0x61, 0xd5, 0xd2, 0x59, + 0x31, 0x3a, 0xf3, 0x3a, 0x3a, 0x3b, 0x50, 0x12, 0x08, 0x9a, 0x45, 0xb1, 0x29, 0x53, 0x3f, 0xbd, + 0x03, 0xea, 0xb3, 0xae, 0x1d, 0xc8, 0x8c, 0x92, 0x62, 0xa8, 0x09, 0x15, 0x9f, 0x52, 0x66, 0x51, + 0x37, 0x4c, 0xd6, 0x88, 0x46, 0xf7, 0xa0, 0xd1, 0x9b, 0xf8, 0x3e, 0xf1, 0x98, 0x35, 0xf1, 0x4e, + 0x27, 0xa3, 0x33, 0x22, 0xf3, 0x75, 0xd1, 0x9a, 0xe2, 0xe3, 0x03, 0xb8, 0x79, 0x4a, 0xde, 0x68, + 0x5e, 0x85, 0x48, 0xdd, 0x83, 0x06, 0x0f, 0x5b, 0xdf, 0xa5, 0x6f, 0xba, 0x64, 0x34, 0x76, 0xe3, + 0xfa, 0x35, 0xc5, 0xc7, 0x1d, 0x58, 0x49, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x35, 0x2d, 0x7e, 0x42, + 0x7b, 0x76, 0xb8, 0x75, 0x71, 0xfc, 0x89, 0x38, 0x4e, 0x19, 0x3b, 0x4b, 0x85, 0x1c, 0xff, 0xc2, + 0x80, 0x95, 0xb4, 0xe4, 0xff, 0xfc, 0x79, 0x74, 0x1f, 0x2a, 0xa1, 0x9f, 0xaa, 0x26, 0xae, 0x68, + 0xaa, 0x3c, 0xce, 0x42, 0x27, 0x12, 0xc2, 0x7f, 0x33, 0x60, 0xe3, 0x40, 0x2e, 0xbf, 0x7f, 0xd3, + 0xe8, 0x11, 0x14, 0xd9, 0xd5, 0x98, 0x08, 0xd3, 0xf5, 0xdd, 0x4f, 0x35, 0xd3, 0xb9, 0x36, 0x76, + 0xda, 0x63, 0xae, 0x62, 0x09, 0x45, 0x6c, 0xc3, 0x0d, 0x49, 0xf3, 0x22, 0x7b, 0xda, 0x6e, 0x3f, + 0x6b, 0xcc, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0xcf, 0xea, 0xbe, 0xde, 0x3b, 0xe8, 0x1e, 0xbf, 0x38, + 0xee, 0xfe, 0xb8, 0x61, 0xa0, 0x65, 0x58, 0xec, 0x74, 0xdb, 0xcf, 0x62, 0x56, 0x01, 0x2d, 0x42, + 0xf5, 0xa0, 0x7d, 0xfa, 0xf8, 0xf8, 0xe8, 0xb9, 0xd5, 0x6a, 0xcc, 0xf3, 0x6a, 0x6c, 0xb5, 0x3a, + 0xad, 0x6e, 0xa3, 0x88, 0x16, 0xa0, 0x72, 0xd4, 0x7e, 0x2d, 0x6b, 0x73, 0x09, 0x5f, 0xc0, 0x7a, + 0xd6, 0x66, 0x78, 0x6c, 0xd3, 0xee, 0x44, 0x49, 0x5d, 0xd0, 0x93, 0x3a, 0x2b, 0x11, 0xe7, 0x73, + 0x12, 0xf1, 0x37, 0x06, 0x98, 0x27, 0xd4, 0x19, 0xf6, 0xaf, 0xae, 0x15, 0x3d, 0xa0, 0x63, 0xe2, + 0xdb, 0x6c, 0x48, 0xbd, 0xf0, 0x1c, 0xdf, 0xce, 0x46, 0xb6, 0x1d, 0xca, 0x59, 0x9a, 0x0a, 0xba, + 0x03, 0x75, 0x9f, 0xf4, 0xa8, 0xd7, 0x1f, 0x9e, 0x4f, 0x7c, 0xb2, 0xe7, 0xba, 0x62, 0x5f, 0x15, + 0x2b, 0xc5, 0xc5, 0xbf, 0x37, 0x60, 0x35, 0xcb, 0x18, 0x7a, 0xa8, 0xf0, 0x93, 0xcd, 0xf6, 0xce, + 0x7b, 0xbe, 0x9d, 0x80, 0x4e, 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x42, 0x78, 0x76, 0x25, 0x8d, 0xbf, + 0x99, 0x01, 0xeb, 0x12, 0xd4, 0xac, 0xd6, 0x49, 0xfb, 0x45, 0xeb, 0xb5, 0xd5, 0x7e, 0xca, 0x11, + 0x5b, 0x80, 0xca, 0xde, 0xe1, 0xa1, 0xa4, 0x8a, 0xf8, 0x97, 0x06, 0xac, 0x65, 0x44, 0x8e, 0xc3, + 0xf4, 0x43, 0x68, 0xf4, 0xed, 0xa1, 0x4b, 0x9c, 0x76, 0x1c, 0x2d, 0xe3, 0x7a, 0xd1, 0x9a, 0x52, + 0x54, 0x20, 0x14, 0xa6, 0x31, 0xd7, 0x0b, 0x19, 0x3e, 0x86, 0x8d, 0x43, 0x12, 0x30, 0x9f, 0x5e, + 0x07, 0xc7, 0x5b, 0x50, 0xbd, 0x20, 0x64, 0xdc, 0x15, 0x95, 0xaf, 0x20, 0x10, 0x88, 0x19, 0x98, + 0xc0, 0x7a, 0x96, 0x29, 0xee, 0xd8, 0x0f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x48, 0x51, 0xc1, + 0x54, 0x27, 0xfc, 0x96, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, + 0x1a, 0x8b, 0x10, 0x14, 0x3d, 0x0e, 0x8e, 0xdc, 0xa8, 0xf8, 0xcd, 0x3b, 0x97, 0x4b, 0x7b, 0x17, + 0xc4, 0x51, 0xfb, 0x54, 0x14, 0xe7, 0xf3, 0x8a, 0x7c, 0xec, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, + 0xc0, 0xa6, 0xba, 0xb0, 0xa2, 0xe2, 0xa8, 0x95, 0xf4, 0x93, 0x72, 0x0b, 0xaa, 0x3d, 0xd7, 0x0e, + 0x02, 0xad, 0xf3, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0x2e, 0xbd, 0x0a, 0x4b, 0x95, 0xea, + 0xbe, 0xfa, 0x8c, 0xc7, 0x37, 0x7f, 0x98, 0x10, 0xb2, 0x52, 0x4a, 0xbc, 0x50, 0xa2, 0x69, 0x31, + 0x9e, 0x8e, 0x7c, 0x0c, 0xd0, 0x3c, 0x8e, 0x68, 0x64, 0x42, 0xd9, 0x3e, 0xe7, 0x82, 0x21, 0xf0, + 0x21, 0xc9, 0x57, 0x68, 0xbf, 0x4f, 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x83, 0x06, 0x79, 0x4b, 0x7a, + 0x13, 0x46, 0xf9, 0xa2, 0xf4, 0x5e, 0xe3, 0xe0, 0x65, 0x58, 0x3a, 0x22, 0x4c, 0x01, 0x20, 0x7b, + 0xfa, 0x23, 0x58, 0x8c, 0x59, 0x1c, 0xdf, 0xa8, 0x1d, 0x1a, 0xd7, 0x6a, 0x87, 0x78, 0x1b, 0xea, + 0xca, 0x80, 0x36, 0x69, 0x28, 0x5c, 0x0c, 0x1d, 0x17, 0xfc, 0x1d, 0x58, 0x88, 0x24, 0xf9, 0x97, + 0x3e, 0x81, 0x22, 0x5f, 0x51, 0xc9, 0xb3, 0x92, 0x8a, 0xa8, 0xf8, 0x86, 0x10, 0xc0, 0x2d, 0x58, + 0xe4, 0x9c, 0x03, 0x8e, 0x4a, 0x6e, 0x96, 0xf0, 0xf6, 0x2f, 0xd5, 0x4f, 0xa8, 0x43, 0xa2, 0xf6, + 0x1f, 0xb3, 0xf0, 0xcf, 0xa1, 0x76, 0x40, 0x47, 0x23, 0xdb, 0x73, 0x84, 0x91, 0x06, 0xcc, 0x13, + 0xef, 0x52, 0xb8, 0x59, 0xb5, 0xf8, 0x4f, 0x91, 0x20, 0x03, 0xe2, 0xba, 0x2a, 0xcf, 0x24, 0xc1, + 0xb9, 0x97, 0xb6, 0x3b, 0x89, 0x0e, 0x9b, 0x20, 0x78, 0xda, 0xd8, 0xfe, 0xf9, 0x44, 0x8e, 0x33, + 0x45, 0x61, 0x23, 0x66, 0xf0, 0x0d, 0x4e, 0x02, 0xe2, 0xab, 0x4c, 0x13, 0xbf, 0xf1, 0x09, 0xd4, + 0x0e, 0x06, 0xb6, 0xe7, 0x11, 0x37, 0xd7, 0x07, 0xa4, 0xb5, 0xa6, 0xaa, 0x2a, 0x59, 0x22, 0x9a, + 0xfe, 0x39, 0x61, 0x71, 0x96, 0x73, 0x0a, 0xff, 0xa7, 0x00, 0x95, 0xe8, 0xd8, 0x7c, 0x1b, 0xaa, + 0x01, 0x07, 0x47, 0x64, 0xa8, 0x8c, 0x67, 0x3e, 0x70, 0xb1, 0x28, 0xd7, 0xeb, 0x85, 0x51, 0x55, + 0xbd, 0xd6, 0x4c, 0xe1, 0x10, 0x45, 0xdd, 0x8a, 0x45, 0xd1, 0xf7, 0x61, 0x69, 0xe8, 0x9d, 0xd1, + 0x89, 0xe7, 0x28, 0x97, 0x02, 0x73, 0x5e, 0xa4, 0xcb, 0x9a, 0x5e, 0x02, 0x62, 0x6f, 0xad, 0xb4, + 0x38, 0xda, 0x87, 0x06, 0x9d, 0xb0, 0xa4, 0x89, 0xe2, 0x4c, 0x13, 0x53, 0xf2, 0xe8, 0x01, 0x87, + 0x3c, 0x02, 0x54, 0x04, 0x3b, 0xa5, 0x1e, 0xaf, 0x5a, 0xba, 0x28, 0x3f, 0x78, 0x3c, 0xb3, 0x9e, + 0xd9, 0x6c, 0xa0, 0xce, 0x7c, 0x44, 0x73, 0xbc, 0x89, 0x77, 0x79, 0xec, 0x88, 0x93, 0x5e, 0xb5, + 0x24, 0x81, 0xef, 0xc3, 0x4a, 0xb2, 0xa4, 0xc9, 0x5c, 0x37, 0xa1, 0x2c, 0xb3, 0x3b, 0x50, 0x89, + 0x14, 0x92, 0xf8, 0x57, 0x06, 0x2c, 0x4f, 0x15, 0x41, 0xf4, 0x10, 0x6a, 0x17, 0x43, 0xd7, 0x25, + 0x4e, 0xf7, 0x5a, 0x67, 0x4c, 0x17, 0x46, 0x5f, 0xc0, 0x82, 0x3f, 0xf1, 0xbc, 0xa1, 0x77, 0x1e, + 0x56, 0xed, 0xd9, 0xca, 0x09, 0x69, 0x7c, 0x20, 0xce, 0x3e, 0x9f, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, + 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x63, 0x9b, 0x0d, 0x3a, 0x63, 0xd2, 0x0b, 0x7b, 0x64, 0x48, 0xe3, + 0x3f, 0x1b, 0x50, 0x09, 0x07, 0xb0, 0xbc, 0x5a, 0xad, 0x6a, 0x6f, 0x21, 0xbb, 0xf6, 0x26, 0x46, + 0xef, 0x26, 0x54, 0xfa, 0x13, 0xd7, 0x15, 0x30, 0xc8, 0x6a, 0x15, 0xd1, 0x7a, 0x64, 0x4b, 0x89, + 0xc8, 0xa2, 0xbb, 0x50, 0xe2, 0x4d, 0x3b, 0x30, 0x6f, 0x88, 0x00, 0x64, 0x0e, 0x87, 0x52, 0x02, + 0x3f, 0x14, 0xd5, 0x4d, 0x39, 0xcd, 0xe3, 0x1f, 0xe9, 0x1a, 0xef, 0xd5, 0xfd, 0xa3, 0x01, 0x1f, + 0x1c, 0x11, 0xf6, 0x32, 0x35, 0x72, 0x47, 0xd1, 0xdb, 0x82, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, + 0x18, 0xf1, 0xc3, 0x5b, 0x95, 0xce, 0x42, 0xdb, 0xb0, 0xe4, 0x93, 0xcb, 0x21, 0xbf, 0x91, 0x85, + 0x52, 0x32, 0x2a, 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0xbe, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, + 0x44, 0xa4, 0xb3, 0x44, 0x3b, 0x70, 0xdd, 0xae, 0x7d, 0x2e, 0xbb, 0x5a, 0xc5, 0x0a, 0x49, 0x7c, + 0x06, 0xab, 0xe9, 0x3d, 0x86, 0xf0, 0xf0, 0xcd, 0x84, 0xf0, 0xf0, 0xdf, 0x22, 0xef, 0xc3, 0x2b, + 0x85, 0xc2, 0x36, 0xa4, 0xc5, 0x6c, 0xa4, 0xb6, 0xa5, 0x50, 0x8a, 0x68, 0xfc, 0x35, 0x6c, 0x64, + 0x87, 0x82, 0xc7, 0xf4, 0x04, 0x96, 0xd3, 0xf7, 0x92, 0xac, 0x59, 0x27, 0x6b, 0x93, 0xd6, 0xb4, + 0x26, 0x46, 0xd0, 0x78, 0x3a, 0x0c, 0xf8, 0xb4, 0x41, 0xa3, 0x2e, 0xf5, 0x3b, 0x9e, 0x77, 0x64, + 0x4c, 0x73, 0xf3, 0xce, 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0x65, 0xaa, 0x78, 0x87, 0x24, 0x07, + 0x41, 0xfd, 0xb4, 0x92, 0xde, 0xa5, 0xd9, 0xe8, 0x01, 0xac, 0x0f, 0x83, 0x23, 0x97, 0x9e, 0xd9, + 0xee, 0x61, 0x4a, 0x43, 0x86, 0x3c, 0x6f, 0x19, 0x7f, 0x0f, 0xea, 0xda, 0x96, 0xc3, 0x3c, 0xe3, + 0x54, 0x56, 0x9e, 0x29, 0x3f, 0x2c, 0x29, 0x81, 0x4f, 0xa1, 0xbe, 0xe7, 0x38, 0x9c, 0x1b, 0x66, + 0x56, 0x96, 0x83, 0x19, 0x6e, 0x14, 0x32, 0xdd, 0xc0, 0x5f, 0xc1, 0x42, 0x64, 0x4f, 0x36, 0x74, + 0xe4, 0x91, 0x37, 0x69, 0x8f, 0xa4, 0xed, 0x8c, 0x15, 0x7c, 0x17, 0x96, 0x2d, 0x32, 0xa2, 0x97, + 0x44, 0xdf, 0xd2, 0x2a, 0x94, 0x86, 0x9e, 0x43, 0xde, 0x86, 0x8f, 0x3f, 0x82, 0xc0, 0xdf, 0x85, + 0x25, 0x5d, 0x94, 0x7f, 0xed, 0x0e, 0xd4, 0x75, 0x9b, 0x51, 0xfe, 0xa5, 0xb8, 0xf8, 0x53, 0x58, + 0xb1, 0x48, 0xdf, 0x27, 0xc1, 0x40, 0x07, 0x3a, 0xe7, 0x3b, 0xff, 0x0f, 0x37, 0x3b, 0x84, 0x69, + 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0xdb, 0x1d, 0xc2, 0x32, 0xa1, 0x0a, 0x15, 0xf5, 0x64, 0x37, 0x52, + 0xc9, 0xfe, 0x23, 0xf8, 0xb0, 0x43, 0xc4, 0x67, 0x72, 0x94, 0x33, 0xbf, 0x9a, 0x30, 0x59, 0x48, + 0x99, 0x2c, 0x43, 0xa9, 0x35, 0x1a, 0xb3, 0xab, 0xdd, 0x3f, 0x2d, 0x42, 0x59, 0xdd, 0xec, 0xd0, + 0x01, 0xd4, 0xba, 0xbe, 0xdd, 0xbb, 0x90, 0x6f, 0x84, 0xc8, 0x9c, 0x7a, 0x36, 0x54, 0xdf, 0x6b, + 0xae, 0x65, 0xac, 0xf0, 0xf1, 0x79, 0xee, 0x1b, 0x06, 0x7a, 0x05, 0x8d, 0xf4, 0xd3, 0x17, 0xc2, + 0x9a, 0x7c, 0xce, 0xcb, 0x5e, 0x73, 0x6b, 0xa6, 0x8c, 0xb0, 0x8e, 0xf6, 0xa1, 0x12, 0x3e, 0x0d, + 0x21, 0xfd, 0xf6, 0x9e, 0x7a, 0x5a, 0x6a, 0x9a, 0x99, 0x6b, 0xd2, 0xc6, 0x4b, 0xd1, 0x76, 0xf4, + 0x37, 0x23, 0xf4, 0x51, 0xf2, 0xd3, 0x19, 0x2f, 0x4d, 0xcd, 0xdb, 0xb3, 0x44, 0xa4, 0xe1, 0x2e, + 0xd4, 0x93, 0x2f, 0x1f, 0x48, 0x77, 0x29, 0xf3, 0x65, 0xa5, 0xb9, 0x39, 0x43, 0x22, 0xb2, 0x9a, + 0xfc, 0x1e, 0xda, 0xca, 0xdd, 0x4a, 0x96, 0xd5, 0x8c, 0xd7, 0x10, 0x3c, 0x87, 0x7e, 0x0a, 0x68, + 0xfa, 0x3a, 0x8f, 0x3e, 0xbe, 0xce, 0xd3, 0x43, 0x13, 0xbf, 0x47, 0x4a, 0x7e, 0xe1, 0x27, 0xb0, + 0x3c, 0x75, 0x11, 0x45, 0xff, 0xa7, 0xa9, 0xe6, 0x5d, 0xf0, 0x9b, 0x1f, 0xcd, 0x16, 0x8a, 0x1c, + 0x98, 0xbe, 0x0f, 0x26, 0x1c, 0xc8, 0xbd, 0x79, 0x26, 0x1c, 0xc8, 0xb9, 0x54, 0xca, 0x5c, 0x0b, + 0xef, 0x21, 0x89, 0x5c, 0x4b, 0xdd, 0x57, 0x12, 0xb9, 0x96, 0xb8, 0xb8, 0xe0, 0x39, 0xf4, 0x08, + 0xca, 0x8a, 0x85, 0x36, 0xa6, 0xc5, 0x42, 0x0b, 0xeb, 0x59, 0x4b, 0xd2, 0xc0, 0x29, 0x2c, 0xe8, + 0x23, 0x1b, 0xda, 0xcc, 0xbd, 0xd0, 0x4a, 0x53, 0x33, 0x2f, 0xbc, 0x91, 0x53, 0x62, 0xfc, 0x48, + 0x3b, 0xa5, 0x0f, 0x62, 0x69, 0xa7, 0xe2, 0x79, 0x05, 0xcf, 0xa1, 0xbe, 0x78, 0x74, 0x9d, 0x6a, + 0xbd, 0xe8, 0x4e, 0x52, 0x27, 0x6f, 0x4c, 0x69, 0x7e, 0xfc, 0x5e, 0x39, 0xf9, 0x9d, 0x16, 0x54, + 0xa3, 0x1e, 0x86, 0x3e, 0xd0, 0x94, 0xd2, 0xcd, 0xb8, 0xb9, 0x91, 0xbd, 0x18, 0x61, 0xa0, 0xba, + 0x4f, 0x02, 0x83, 0x64, 0x87, 0x4b, 0x60, 0xa0, 0x37, 0x2b, 0x3c, 0x87, 0x9e, 0x00, 0xc4, 0x3d, + 0x05, 0xdd, 0x4a, 0x34, 0xce, 0x54, 0x57, 0x6a, 0x36, 0x73, 0x56, 0xc3, 0xe8, 0x2f, 0xe8, 0x2d, + 0x26, 0x81, 0x66, 0x46, 0xef, 0x69, 0x36, 0xf4, 0x87, 0x19, 0x5e, 0xad, 0xf1, 0x1c, 0x7a, 0x0c, + 0xf5, 0x64, 0xe7, 0x49, 0xd4, 0x83, 0xcc, 0xa6, 0x94, 0x69, 0xe7, 0x15, 0x98, 0x79, 0x2d, 0x09, + 0xdd, 0x4b, 0x5a, 0x9c, 0xd5, 0xb7, 0x32, 0x6d, 0xbf, 0x80, 0xb5, 0xec, 0x7e, 0x85, 0xb6, 0x93, + 0x96, 0xf3, 0x5b, 0x5a, 0x96, 0xdd, 0xfd, 0x07, 0x7f, 0x79, 0xb7, 0x69, 0xfc, 0xfd, 0xdd, 0xa6, + 0xf1, 0xcf, 0x77, 0x9b, 0xc6, 0x6f, 0xff, 0xb5, 0x39, 0x07, 0xb8, 0x37, 0xd8, 0xe9, 0x11, 0xdf, + 0xdb, 0xb1, 0xdd, 0x61, 0x8f, 0xec, 0xd0, 0xdd, 0x9d, 0x50, 0xc7, 0x1f, 0xf7, 0x02, 0xe2, 0x5f, + 0x12, 0xff, 0x55, 0x61, 0x7c, 0x76, 0x76, 0x43, 0xfc, 0x81, 0xf7, 0xf9, 0x7f, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x59, 0x71, 0xe8, 0x68, 0xda, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3422,8 +3422,8 @@ type ControlClient interface { RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3628,18 +3628,18 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe return out, nil } -func (c *controlClient) SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultBranch", in, out, opts...) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *controlClient) SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultBranch", in, out, opts...) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) if err != nil { return nil, err } @@ -3667,8 +3667,8 @@ type ControlServer interface { RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultBranch(context.Context, *SetGlobalDefaultBranchRequest) (*Empty, error) - SetRepoDefaultBranch(context.Context, *SetRepoDefaultBranchRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*Empty, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -4020,38 +4020,38 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -func _Control_SetGlobalDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultBranchRequest) +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultBranch(ctx, in) + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultBranch", + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultBranch(ctx, req.(*SetGlobalDefaultBranchRequest)) + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_SetRepoDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultBranchRequest) +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultBranch(ctx, in) + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultBranch", + FullMethod: "/o2control.Control/SetRepoDefaultRevision", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultBranch(ctx, req.(*SetRepoDefaultBranchRequest)) + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) } return interceptor(ctx, in, info, handler) } @@ -4133,12 +4133,12 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_SetDefaultRepo_Handler, }, { - MethodName: "SetGlobalDefaultBranch", - Handler: _Control_SetGlobalDefaultBranch_Handler, + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, }, { - MethodName: "SetRepoDefaultBranch", - Handler: _Control_SetRepoDefaultBranch_Handler, + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, }, }, Streams: []grpc.StreamDesc{ @@ -5834,16 +5834,16 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { } i++ } - if len(m.DefaultBranch) > 0 { + if len(m.DefaultRevision) > 0 { dAtA[i] = 0x1a i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) - i += copy(dAtA[i:], m.DefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i += copy(dAtA[i:], m.DefaultRevision) } - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { dAtA[i] = 0x20 i++ - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -5910,11 +5910,11 @@ func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i += copy(dAtA[i:], m.Name) } - if len(m.DefaultBranch) > 0 { + if len(m.DefaultRevision) > 0 { dAtA[i] = 0x12 i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) - i += copy(dAtA[i:], m.DefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i += copy(dAtA[i:], m.DefaultRevision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -5937,11 +5937,11 @@ func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.NewDefaultBranch) > 0 { + if len(m.NewDefaultRevision) > 0 { dAtA[i] = 0xa i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultBranch))) - i += copy(dAtA[i:], m.NewDefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i += copy(dAtA[i:], m.NewDefaultRevision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6054,7 +6054,7 @@ func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { +func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6064,16 +6064,16 @@ func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l - if len(m.Branch) > 0 { + if len(m.Revision) > 0 { dAtA[i] = 0xa i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) - i += copy(dAtA[i:], m.Branch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6081,7 +6081,7 @@ func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *SetRepoDefaultBranchRequest) Marshal() (dAtA []byte, err error) { +func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6091,7 +6091,7 @@ func (m *SetRepoDefaultBranchRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int @@ -6101,11 +6101,11 @@ func (m *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) } - if len(m.Branch) > 0 { + if len(m.Revision) > 0 { dAtA[i] = 0x12 i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) - i += copy(dAtA[i:], m.Branch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -7080,11 +7080,11 @@ func (m *RepoInfo) Size() (n int) { if m.Default { n += 2 } - l = len(m.DefaultBranch) + l = len(m.DefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { n += 2 } if m.XXX_unrecognized != nil { @@ -7121,7 +7121,7 @@ func (m *AddRepoRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.DefaultBranch) + l = len(m.DefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7137,7 +7137,7 @@ func (m *AddRepoReply) Size() (n int) { } var l int _ = l - l = len(m.NewDefaultBranch) + l = len(m.NewDefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7208,13 +7208,13 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetGlobalDefaultBranchRequest) Size() (n int) { +func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Branch) + l = len(m.Revision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7224,7 +7224,7 @@ func (m *SetGlobalDefaultBranchRequest) Size() (n int) { return n } -func (m *SetRepoDefaultBranchRequest) Size() (n int) { +func (m *SetRepoDefaultRevisionRequest) Size() (n int) { if m == nil { return 0 } @@ -7233,7 +7233,7 @@ func (m *SetRepoDefaultBranchRequest) Size() (n int) { if m.Index != 0 { n += 1 + sovO2Control(uint64(m.Index)) } - l = len(m.Branch) + l = len(m.Revision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -12609,7 +12609,7 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { m.Default = bool(v != 0) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12637,11 +12637,11 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultRevision", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -12658,7 +12658,7 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { break } } - m.IsGlobalDefaultBranch = bool(v != 0) + m.IsGlobalDefaultRevision = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12835,7 +12835,7 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12863,7 +12863,7 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -12921,7 +12921,7 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12949,7 +12949,7 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.NewDefaultBranch = string(dAtA[iNdEx:postIndex]) + m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -13281,7 +13281,7 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { +func (m *SetGlobalDefaultRevisionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13304,15 +13304,15 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -13340,7 +13340,7 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Branch = string(dAtA[iNdEx:postIndex]) + m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -13367,7 +13367,7 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { +func (m *SetRepoDefaultRevisionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13390,10 +13390,10 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetRepoDefaultBranchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -13417,7 +13417,7 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { } case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -13445,7 +13445,7 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Branch = string(dAtA[iNdEx:postIndex]) + m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/core/config.go b/core/config.go index 01dab4761..26c99a202 100644 --- a/core/config.go +++ b/core/config.go @@ -55,7 +55,7 @@ func setDefaults() error { viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) viper.SetDefault("executorMemory", envFloat("EXEC_MEMORY", "64")) - viper.SetDefault("globalDefaultBranch", "master") + viper.SetDefault("globalDefaultRevision", "master") viper.SetDefault("instanceName", fmt.Sprintf("%s instance", product.PRETTY_SHORTNAME)) viper.SetDefault("mesosApiTimeout", envDuration("MESOS_CONNECT_TIMEOUT", "20s")) viper.SetDefault("mesosAuthMode", env("AUTH_MODE", "")) diff --git a/core/confsys/service.go b/core/confsys/service.go index 5263580ca..6790361c9 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -123,25 +123,25 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { } } -func (s *Service) NewDefaultBranch(defaultBranch string) error { +func (s *Service) NewDefaultRevision(defaultRevision string) error { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put("o2/control/default_branch", defaultBranch) + return cSrc.Put("o2/control/default_revision", defaultRevision) } else { - data := []byte(defaultBranch) - return ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_branch", data, 0644) + data := []byte(defaultRevision) + return ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_revision", data, 0644) } } -func (s *Service) GetDefaultBranch() (defaultBranch string, err error) { +func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get("o2/control/default_branch") + return cSrc.Get("o2/control/default_revision") } else { - var defaultBranchData []byte - defaultBranchData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_branch") + var defaultRevisionData []byte + defaultRevisionData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_revision") if err != nil { return } - defaultBranch = strings.TrimSuffix(string(defaultBranchData), "\n") + defaultRevision = strings.TrimSuffix(string(defaultRevisionData), "\n") return } } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index da359ca5f..54f860ec2 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2634,13 +2634,13 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultBranch string `protobuf:"bytes,3,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` - IsGlobalDefaultBranch bool `protobuf:"varint,4,opt,name=isGlobalDefaultBranch,proto3" json:"isGlobalDefaultBranch,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + IsGlobalDefaultRevision bool `protobuf:"varint,4,opt,name=isGlobalDefaultRevision,proto3" json:"isGlobalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2690,16 +2690,16 @@ func (m *RepoInfo) GetDefault() bool { return false } -func (m *RepoInfo) GetDefaultBranch() string { +func (m *RepoInfo) GetDefaultRevision() string { if m != nil { - return m.DefaultBranch + return m.DefaultRevision } return "" } -func (m *RepoInfo) GetIsGlobalDefaultBranch() bool { +func (m *RepoInfo) GetIsGlobalDefaultRevision() bool { if m != nil { - return m.IsGlobalDefaultBranch + return m.IsGlobalDefaultRevision } return false } @@ -2753,7 +2753,7 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultBranch string `protobuf:"bytes,2,opt,name=defaultBranch,proto3" json:"defaultBranch,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2799,15 +2799,15 @@ func (m *AddRepoRequest) GetName() string { return "" } -func (m *AddRepoRequest) GetDefaultBranch() string { +func (m *AddRepoRequest) GetDefaultRevision() string { if m != nil { - return m.DefaultBranch + return m.DefaultRevision } return "" } type AddRepoReply struct { - NewDefaultBranch string `protobuf:"bytes,1,opt,name=newDefaultBranch,proto3" json:"newDefaultBranch,omitempty"` + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2846,9 +2846,9 @@ func (m *AddRepoReply) XXX_DiscardUnknown() { var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo -func (m *AddRepoReply) GetNewDefaultBranch() string { +func (m *AddRepoReply) GetNewDefaultRevision() string { if m != nil { - return m.NewDefaultBranch + return m.NewDefaultRevision } return "" } @@ -3041,25 +3041,25 @@ func (m *SetDefaultRepoRequest) GetIndex() int32 { return 0 } -type SetGlobalDefaultBranchRequest struct { - Branch string `protobuf:"bytes,1,opt,name=branch,proto3" json:"branch,omitempty"` +type SetGlobalDefaultRevisionRequest struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetGlobalDefaultBranchRequest) Reset() { *m = SetGlobalDefaultBranchRequest{} } -func (m *SetGlobalDefaultBranchRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultBranchRequest) ProtoMessage() {} -func (*SetGlobalDefaultBranchRequest) Descriptor() ([]byte, []int) { +func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } +func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } -func (m *SetGlobalDefaultBranchRequest) XXX_Unmarshal(b []byte) error { +func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetGlobalDefaultBranchRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3069,45 +3069,45 @@ func (m *SetGlobalDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *SetGlobalDefaultBranchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultBranchRequest.Merge(m, src) +func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) } -func (m *SetGlobalDefaultBranchRequest) XXX_Size() int { +func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { return m.Size() } -func (m *SetGlobalDefaultBranchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultBranchRequest.DiscardUnknown(m) +func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) } -var xxx_messageInfo_SetGlobalDefaultBranchRequest proto.InternalMessageInfo +var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetGlobalDefaultBranchRequest) GetBranch() string { +func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { if m != nil { - return m.Branch + return m.Revision } return "" } -type SetRepoDefaultBranchRequest struct { +type SetRepoDefaultRevisionRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Branch string `protobuf:"bytes,2,opt,name=branch,proto3" json:"branch,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultBranchRequest) Reset() { *m = SetRepoDefaultBranchRequest{} } -func (m *SetRepoDefaultBranchRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultBranchRequest) ProtoMessage() {} -func (*SetRepoDefaultBranchRequest) Descriptor() ([]byte, []int) { +func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } +func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } -func (m *SetRepoDefaultBranchRequest) XXX_Unmarshal(b []byte) error { +func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultBranchRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalTo(b) @@ -3117,28 +3117,28 @@ func (m *SetRepoDefaultBranchRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *SetRepoDefaultBranchRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultBranchRequest.Merge(m, src) +func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) } -func (m *SetRepoDefaultBranchRequest) XXX_Size() int { +func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultBranchRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultBranchRequest.DiscardUnknown(m) +func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) } -var xxx_messageInfo_SetRepoDefaultBranchRequest proto.InternalMessageInfo +var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetRepoDefaultBranchRequest) GetIndex() int32 { +func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { if m != nil { return m.Index } return 0 } -func (m *SetRepoDefaultBranchRequest) GetBranch() string { +func (m *SetRepoDefaultRevisionRequest) GetRevision() string { if m != nil { - return m.Branch + return m.Revision } return "" } @@ -3236,159 +3236,159 @@ func init() { proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultBranchRequest)(nil), "o2control.SetGlobalDefaultBranchRequest") - proto.RegisterType((*SetRepoDefaultBranchRequest)(nil), "o2control.SetRepoDefaultBranchRequest") + proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2299 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, - 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0x43, - 0x2a, 0xe7, 0xe4, 0x0e, 0x07, 0x7c, 0x57, 0xdc, 0x11, 0x0e, 0x82, 0xff, 0x28, 0x8e, 0xef, 0x62, - 0x2b, 0xb5, 0x52, 0x92, 0xe2, 0xaa, 0xa8, 0xb0, 0xd2, 0x8e, 0x2c, 0x9d, 0x57, 0x3b, 0x62, 0x77, - 0xa4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xc0, 0x03, 0xaf, 0x57, 0x14, 0x8f, 0x7c, 0x0f, - 0x5e, 0x28, 0xe0, 0x1b, 0x50, 0xa1, 0x8a, 0x27, 0x3e, 0x04, 0x35, 0x7f, 0x76, 0x77, 0x76, 0xb5, - 0x92, 0x5d, 0xc5, 0x9b, 0xba, 0xa7, 0xbb, 0xb7, 0xbb, 0x7f, 0x3d, 0xdd, 0x33, 0x23, 0xd8, 0x18, - 0xf9, 0x94, 0xd1, 0xe0, 0x21, 0xdd, 0xeb, 0x52, 0x8f, 0xf9, 0xd4, 0xdd, 0x15, 0x0c, 0x54, 0x8e, - 0x18, 0x78, 0x03, 0xd6, 0x1b, 0x13, 0xe2, 0xb1, 0xd7, 0xa7, 0x24, 0xa0, 0xc1, 0x53, 0x62, 0xfb, - 0xac, 0x43, 0x6c, 0x86, 0x57, 0x60, 0xb9, 0xc5, 0x6c, 0x36, 0x0e, 0x2c, 0xf2, 0xcb, 0x31, 0x09, - 0x18, 0xee, 0x40, 0x25, 0x64, 0x8c, 0xdc, 0x4b, 0xb4, 0x0e, 0x85, 0x80, 0xd9, 0x8c, 0x98, 0xc6, - 0xb6, 0xb1, 0x53, 0xb6, 0x24, 0x81, 0x7e, 0x0c, 0xcb, 0x81, 0x10, 0x7a, 0x31, 0x72, 0x6c, 0x46, - 0x02, 0x33, 0xb7, 0xbd, 0xb8, 0x53, 0xd9, 0xbb, 0xb5, 0x1b, 0x7b, 0xd0, 0xd2, 0xd6, 0xad, 0xa4, - 0x34, 0xfe, 0x9b, 0x01, 0x4b, 0xfa, 0x3a, 0xfa, 0x04, 0x0a, 0x2e, 0x99, 0x10, 0x57, 0x7c, 0xa5, - 0xba, 0xf7, 0xfe, 0x0c, 0x3b, 0xbb, 0xcf, 0xb8, 0x90, 0x25, 0x65, 0xd1, 0x09, 0x54, 0x87, 0x89, - 0x60, 0xcc, 0xdc, 0xb6, 0xb1, 0x53, 0xd9, 0xbb, 0xa3, 0x69, 0x67, 0xc5, 0xfc, 0x74, 0xc1, 0x4a, - 0x29, 0xe2, 0x4f, 0xa1, 0x20, 0x4c, 0xa3, 0x32, 0x14, 0x8e, 0x1a, 0x07, 0x2f, 0x8e, 0x6b, 0x0b, - 0xa8, 0x04, 0xf9, 0x93, 0xb3, 0x27, 0xcd, 0x9a, 0x81, 0x2a, 0x50, 0x7c, 0xb5, 0x6f, 0x9d, 0x9d, - 0x9c, 0x1d, 0xd7, 0x72, 0x5c, 0xa2, 0x61, 0x59, 0x4d, 0xab, 0xb6, 0x78, 0x50, 0x84, 0x82, 0xb0, - 0x8f, 0x37, 0xe1, 0xd6, 0x31, 0x61, 0x4f, 0x7c, 0x7b, 0x48, 0xde, 0x50, 0xff, 0xe2, 0xc4, 0xeb, - 0xd1, 0x30, 0x9d, 0x7f, 0x32, 0xa0, 0xf8, 0x92, 0xf8, 0xc1, 0x80, 0x7a, 0x3c, 0x97, 0x43, 0xfb, - 0x1b, 0xea, 0x8b, 0x28, 0x0b, 0x96, 0x24, 0x04, 0x77, 0xe0, 0x51, 0x5f, 0x78, 0xcf, 0xb9, 0x9c, - 0xe0, 0xdc, 0x91, 0xcd, 0xba, 0x7d, 0x73, 0x51, 0x72, 0x05, 0xc1, 0xb9, 0x9d, 0xf1, 0xc0, 0x75, - 0xcc, 0xbc, 0x44, 0x43, 0x10, 0x68, 0x1b, 0x2a, 0x23, 0x9f, 0x3a, 0xe3, 0x2e, 0x3b, 0xb3, 0x87, - 0xc4, 0x2c, 0x88, 0x35, 0x9d, 0x85, 0xb6, 0x00, 0x26, 0xd2, 0x89, 0x16, 0xf3, 0xcd, 0x1b, 0x42, - 0x40, 0xe3, 0xe0, 0xdf, 0xe5, 0xe0, 0xe6, 0x74, 0x04, 0x1c, 0xff, 0x6d, 0xa8, 0xf4, 0x22, 0xae, - 0xa3, 0xaa, 0x40, 0x67, 0xa1, 0x8f, 0x61, 0x95, 0x78, 0x93, 0x81, 0x4f, 0xbd, 0x21, 0xf1, 0x58, - 0x70, 0x48, 0xc7, 0x1e, 0x53, 0xb1, 0x4c, 0x2f, 0x70, 0x4f, 0x98, 0x1d, 0x5c, 0x28, 0x31, 0x19, - 0x9c, 0xc6, 0x89, 0xeb, 0x2d, 0xaf, 0xd7, 0xdb, 0x16, 0x40, 0x9f, 0x06, 0xa1, 0xf1, 0x82, 0xd4, - 0x8a, 0x39, 0x08, 0xc3, 0xd2, 0xc0, 0x0b, 0x98, 0xed, 0x75, 0x89, 0x48, 0x81, 0x8c, 0x30, 0xc1, - 0x43, 0x1f, 0x43, 0x51, 0x45, 0x6c, 0x16, 0x45, 0x9d, 0x20, 0xad, 0x4e, 0x14, 0x44, 0x56, 0x28, - 0x82, 0xef, 0xc3, 0x4a, 0x9b, 0xd8, 0xbe, 0x43, 0xdf, 0x78, 0x0a, 0x4a, 0xb4, 0x01, 0x37, 0x7c, - 0x62, 0x07, 0xd4, 0x53, 0x59, 0x50, 0x14, 0xdf, 0x42, 0xb1, 0xe8, 0xc8, 0xbd, 0xc4, 0x26, 0x6c, - 0x1c, 0x13, 0xd6, 0xd0, 0x62, 0x0f, 0xab, 0xe1, 0x2d, 0xac, 0x4f, 0xad, 0x5c, 0x2f, 0xcb, 0x3f, - 0x81, 0x25, 0x3d, 0x99, 0x6a, 0xc3, 0xd5, 0xf5, 0x52, 0x8f, 0x97, 0x05, 0x7c, 0x09, 0x79, 0xfc, - 0x4f, 0x03, 0x56, 0x52, 0x12, 0xa8, 0x0a, 0xb9, 0x41, 0xf8, 0xb1, 0xdc, 0x40, 0xd4, 0x51, 0xd7, - 0x27, 0x36, 0x23, 0xce, 0xab, 0x3e, 0xf1, 0x04, 0x86, 0x65, 0x4b, 0x67, 0xc5, 0xe8, 0x2c, 0xea, - 0xe8, 0xec, 0x42, 0x41, 0x20, 0x68, 0xe6, 0x85, 0x53, 0xa6, 0xbe, 0x7b, 0xfb, 0xd4, 0x67, 0x6d, - 0x3b, 0x90, 0x15, 0x25, 0xc5, 0x50, 0x1d, 0x4a, 0x3e, 0xa5, 0xcc, 0xa2, 0x6e, 0x58, 0xac, 0x11, - 0x8d, 0x1e, 0x40, 0xad, 0x3b, 0xf6, 0x7d, 0xe2, 0x31, 0x6b, 0xec, 0x9d, 0x8d, 0x87, 0x1d, 0x22, - 0xeb, 0x75, 0xd9, 0x9a, 0xe2, 0xe3, 0x43, 0xb8, 0x79, 0x46, 0xde, 0x68, 0x51, 0x85, 0x48, 0x3d, - 0x80, 0x1a, 0x4f, 0x5b, 0xcf, 0xa5, 0x6f, 0xda, 0x64, 0x38, 0x72, 0xe3, 0xfe, 0x35, 0xc5, 0xc7, - 0x2d, 0x58, 0x4b, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x15, 0x2d, 0x7f, 0x42, 0x7b, 0x7e, 0xba, 0x75, - 0x71, 0xfc, 0xa1, 0xd8, 0x4e, 0x19, 0x9e, 0xa5, 0x52, 0x8e, 0x7f, 0x6d, 0xc0, 0x5a, 0x5a, 0xf2, - 0xff, 0xfe, 0x3c, 0x7a, 0x08, 0xa5, 0x30, 0x4e, 0xd5, 0x13, 0xd7, 0x34, 0x55, 0x9e, 0x67, 0xa1, - 0x13, 0x09, 0xe1, 0xbf, 0x1b, 0xb0, 0x79, 0x28, 0x97, 0xaf, 0x76, 0x1a, 0x3d, 0x86, 0x3c, 0xbb, - 0x1c, 0x11, 0x61, 0xba, 0xba, 0xf7, 0x91, 0x66, 0x7a, 0xa6, 0x8d, 0xdd, 0xe6, 0x88, 0xab, 0x58, - 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0x35, 0x9b, 0xcf, 0x6b, 0x0b, 0x08, 0x41, - 0xb5, 0xd5, 0xde, 0xb7, 0xda, 0xaf, 0xf7, 0x0f, 0xdb, 0x27, 0x2f, 0x4f, 0xda, 0x3f, 0xab, 0x19, - 0x68, 0x15, 0x96, 0x5b, 0xed, 0xe6, 0xf3, 0x98, 0x95, 0x43, 0xcb, 0x50, 0x3e, 0x6c, 0x9e, 0x3d, - 0x39, 0x39, 0x7e, 0x61, 0x35, 0x6a, 0x8b, 0xbc, 0x1b, 0x5b, 0x8d, 0x56, 0xa3, 0x5d, 0xcb, 0xa3, - 0x25, 0x28, 0x1d, 0x37, 0x5f, 0xcb, 0xde, 0x5c, 0xc0, 0x17, 0x70, 0x2b, 0xcb, 0x19, 0x9e, 0xdb, - 0x74, 0x38, 0x51, 0x51, 0xe7, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xc5, 0x19, 0x85, 0xf8, 0x7b, 0x03, - 0xcc, 0x53, 0xea, 0x0c, 0x7a, 0x97, 0xd7, 0xca, 0x1e, 0xd0, 0x11, 0xf1, 0x6d, 0x36, 0xa0, 0x5e, - 0xb8, 0x8f, 0xef, 0x64, 0x23, 0xdb, 0x0c, 0xe5, 0x2c, 0x4d, 0x05, 0xdd, 0x83, 0xaa, 0x4f, 0xba, - 0xd4, 0xeb, 0x0d, 0xce, 0xc7, 0x3e, 0xd9, 0x77, 0x5d, 0xe1, 0x57, 0xc9, 0x4a, 0x71, 0xf1, 0xb7, - 0x06, 0xac, 0x67, 0x19, 0x43, 0x8f, 0x14, 0x7e, 0x72, 0xd8, 0xde, 0xbb, 0xe2, 0xdb, 0x09, 0xe8, - 0xe4, 0xde, 0x75, 0x65, 0x97, 0xcd, 0x85, 0x7b, 0x57, 0xd2, 0xf8, 0xfb, 0x19, 0xb0, 0xae, 0x40, - 0xc5, 0x6a, 0x9c, 0x36, 0x5f, 0x36, 0x5e, 0x5b, 0xcd, 0x67, 0x1c, 0xb1, 0x25, 0x28, 0xed, 0x1f, - 0x1d, 0x49, 0x2a, 0x8f, 0x7f, 0x63, 0xc0, 0x46, 0x46, 0xe6, 0x38, 0x4c, 0x5f, 0x41, 0xad, 0x67, - 0x0f, 0x5c, 0xe2, 0x34, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0x21, 0x37, 0x8d, - 0xb9, 0xde, 0xc8, 0xf0, 0x09, 0x6c, 0x1e, 0x91, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, 0xf2, - 0x05, 0x21, 0xa3, 0xb6, 0xe8, 0x7c, 0x39, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, 0xe2, - 0x81, 0x7d, 0x09, 0xab, 0x5d, 0x97, 0xd8, 0xde, 0x58, 0x8a, 0x0a, 0xa6, 0xda, 0xe1, 0xb7, 0xf5, - 0xbd, 0x94, 0x96, 0xb1, 0xa6, 0xd5, 0xf0, 0x7f, 0x0c, 0x58, 0x4e, 0xf4, 0x58, 0x84, 0x20, 0xef, - 0x71, 0x70, 0xa4, 0xa3, 0xe2, 0x37, 0x9f, 0x5c, 0x2e, 0xed, 0x5e, 0x10, 0x47, 0xf9, 0xa9, 0x28, - 0xce, 0xe7, 0x1d, 0xf9, 0xc4, 0x51, 0x69, 0x50, 0x14, 0xe7, 0xcb, 0x03, 0x9b, 0x9a, 0xc2, 0x8a, - 0x8a, 0xb3, 0x56, 0xd0, 0x77, 0xca, 0x6d, 0x28, 0x77, 0x5d, 0x3b, 0x08, 0xb4, 0xc9, 0x1b, 0x33, - 0x50, 0x03, 0xaa, 0x0e, 0x19, 0xb9, 0xf4, 0x32, 0x6c, 0x55, 0x6a, 0xfa, 0xea, 0x67, 0x3c, 0xee, - 0xfc, 0x51, 0x42, 0xc8, 0x4a, 0x29, 0xf1, 0x46, 0x89, 0xa6, 0xc5, 0x78, 0x39, 0xf2, 0x63, 0x80, - 0x16, 0x71, 0x44, 0x23, 0x13, 0x8a, 0xf6, 0x39, 0x17, 0x0c, 0x81, 0x0f, 0x49, 0xbe, 0x42, 0x7b, - 0x3d, 0xe2, 0x47, 0x81, 0x87, 0x24, 0x3f, 0x68, 0x90, 0xb7, 0xa4, 0x3b, 0x66, 0x94, 0x2f, 0xca, - 0xe8, 0x35, 0x0e, 0x5e, 0x85, 0x95, 0x63, 0xc2, 0x14, 0x00, 0x72, 0xa6, 0x3f, 0x86, 0xe5, 0x98, - 0xc5, 0xf1, 0x8d, 0xc6, 0xa1, 0x71, 0xad, 0x71, 0x88, 0x77, 0xa0, 0xaa, 0x0c, 0x68, 0x27, 0x0d, - 0x85, 0x8b, 0xa1, 0xe3, 0x82, 0x3f, 0x83, 0xa5, 0x48, 0x92, 0x7f, 0xe9, 0x43, 0xc8, 0xf3, 0x15, - 0x55, 0x3c, 0x6b, 0xa9, 0x8c, 0x8a, 0x6f, 0x08, 0x01, 0xdc, 0x80, 0x65, 0xce, 0x39, 0xe4, 0xa8, - 0xcc, 0xac, 0x12, 0x3e, 0xfe, 0xa5, 0xfa, 0x29, 0x75, 0x48, 0x34, 0xfe, 0x63, 0x16, 0xfe, 0x15, - 0x54, 0x0e, 0xe9, 0x70, 0x68, 0x7b, 0x8e, 0x30, 0x52, 0x83, 0x45, 0xe2, 0x4d, 0x44, 0x98, 0x65, - 0x8b, 0xff, 0x14, 0x05, 0xd2, 0x27, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x3b, 0xb1, 0xdd, 0x71, - 0xb4, 0xd9, 0x04, 0xc1, 0xcb, 0xc6, 0xf6, 0xcf, 0xc7, 0xf2, 0x38, 0x93, 0x17, 0x36, 0x62, 0x06, - 0x77, 0x70, 0x1c, 0x10, 0x5f, 0x55, 0x9a, 0xf8, 0x8d, 0x4f, 0xa1, 0x72, 0xd8, 0xb7, 0x3d, 0x8f, - 0xb8, 0x33, 0x63, 0x40, 0xda, 0x68, 0x2a, 0xab, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x13, 0x16, 0x57, - 0x39, 0xa7, 0xf0, 0x7f, 0x73, 0x50, 0x8a, 0xb6, 0xcd, 0x0f, 0xa0, 0x1c, 0x70, 0x70, 0x44, 0x85, - 0xca, 0x7c, 0xce, 0x06, 0x2e, 0x16, 0xe5, 0x7a, 0xdd, 0x30, 0xab, 0x6a, 0xd6, 0x9a, 0x29, 0x1c, - 0xa2, 0xac, 0x5b, 0xb1, 0x28, 0xfa, 0x29, 0xac, 0x0c, 0xbc, 0x0e, 0x1d, 0x7b, 0x8e, 0x0a, 0x29, - 0x30, 0x17, 0x45, 0xb9, 0x6c, 0xe8, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x03, 0xa8, 0xd1, - 0x31, 0x4b, 0x9a, 0xc8, 0xcf, 0x35, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, 0x64, - 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x1b, 0x8f, 0x57, 0xd6, 0x73, 0x9b, 0xf5, 0xd5, 0x9e, - 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x26, 0x27, 0x8e, 0xd8, 0xe9, 0x65, 0x4b, 0x12, 0xf8, 0x21, 0xac, - 0x25, 0x5b, 0x9a, 0xac, 0x75, 0x13, 0x8a, 0xb2, 0xba, 0x03, 0x55, 0x48, 0x21, 0x89, 0x7f, 0x6b, - 0xc0, 0xea, 0x54, 0x13, 0x44, 0x8f, 0xa0, 0x72, 0x31, 0x70, 0x5d, 0xe2, 0xb4, 0xaf, 0xb5, 0xc7, - 0x74, 0x61, 0xf4, 0x05, 0x2c, 0xf9, 0x63, 0xcf, 0x1b, 0x78, 0xe7, 0x61, 0xd7, 0x9e, 0xaf, 0x9c, - 0x90, 0xc6, 0x87, 0x62, 0xef, 0xf3, 0xd3, 0x53, 0xe4, 0x7c, 0x14, 0xa9, 0xa1, 0x45, 0xca, 0x73, - 0x33, 0xb2, 0x59, 0xbf, 0x35, 0x22, 0xdd, 0x70, 0x46, 0x86, 0x34, 0xfe, 0x8b, 0x01, 0xa5, 0xf0, - 0x00, 0x36, 0xab, 0x57, 0xab, 0xde, 0x9b, 0xcb, 0xee, 0xbd, 0x89, 0xa3, 0x77, 0x1d, 0x4a, 0xbd, - 0xb1, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0x85, 0x44, 0x66, 0xd1, 0x7d, 0x28, - 0xf0, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x0f, 0x87, 0x52, 0x02, 0x3f, 0x12, 0xdd, 0x4d, - 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x8e, 0x09, 0x7b, 0x95, - 0x3a, 0x72, 0x47, 0xd9, 0xdb, 0x86, 0x8a, 0x4f, 0x46, 0xf4, 0xb9, 0xcd, 0x18, 0xf1, 0xc3, 0x5b, - 0x95, 0xce, 0x42, 0x3b, 0xb0, 0xe2, 0x93, 0xc9, 0x80, 0xdf, 0xc8, 0x42, 0x29, 0x99, 0x95, 0x34, - 0x9b, 0xdb, 0xb2, 0x5d, 0xf7, 0xc0, 0xb7, 0xbd, 0x6e, 0x9f, 0x04, 0xea, 0x44, 0xa4, 0xb3, 0xc4, - 0x38, 0x70, 0xdd, 0xb6, 0x7d, 0x2e, 0xa7, 0x5a, 0xc9, 0x0a, 0x49, 0xdc, 0x81, 0xf5, 0xb4, 0x8f, - 0x21, 0x3c, 0xdc, 0x99, 0x10, 0x1e, 0xfe, 0x5b, 0xd4, 0x7d, 0x78, 0xa5, 0x50, 0xd8, 0x86, 0xb4, - 0x38, 0x1b, 0x29, 0xb7, 0x14, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xcd, 0xec, 0x54, 0xf0, 0x9c, 0x9e, - 0xc2, 0x6a, 0xfa, 0x5e, 0x92, 0x75, 0xd6, 0xc9, 0x72, 0xd2, 0x9a, 0xd6, 0xc4, 0x08, 0x6a, 0xcf, - 0x06, 0x01, 0x3f, 0x6d, 0xd0, 0x68, 0x4a, 0xfd, 0x81, 0xd7, 0x1d, 0x19, 0xd1, 0x99, 0x75, 0x67, - 0x42, 0xd1, 0x21, 0x3d, 0x7b, 0xec, 0x32, 0xd5, 0xbc, 0x43, 0x12, 0xdd, 0x85, 0x65, 0xf5, 0x53, - 0xe6, 0x52, 0xc5, 0x96, 0x64, 0xa2, 0x4f, 0xe1, 0xe6, 0x20, 0x38, 0x76, 0x69, 0xc7, 0x76, 0x8f, - 0x12, 0xd2, 0x32, 0xd9, 0xd9, 0x8b, 0xf8, 0x47, 0x50, 0xd5, 0x5c, 0x0d, 0xeb, 0x8b, 0x53, 0x59, - 0xf5, 0xa5, 0xfc, 0xb7, 0xa4, 0x04, 0xfe, 0x12, 0xaa, 0xfb, 0x8e, 0xc3, 0xb9, 0x61, 0x45, 0x65, - 0x05, 0x36, 0xe5, 0x7e, 0x2e, 0xc3, 0x7d, 0xfc, 0x08, 0x96, 0x22, 0x5b, 0xdc, 0x8d, 0x07, 0x50, - 0xf3, 0xc8, 0x9b, 0x64, 0x24, 0xea, 0x0a, 0x99, 0xe6, 0xe3, 0xfb, 0xb0, 0x6a, 0x91, 0x21, 0x9d, - 0x10, 0xdd, 0x95, 0x75, 0x28, 0x0c, 0x3c, 0x87, 0xbc, 0x0d, 0x1f, 0x7b, 0x04, 0x81, 0x7f, 0x08, - 0x2b, 0xba, 0x28, 0xff, 0xd2, 0x3d, 0xa8, 0xc6, 0x16, 0xad, 0xb8, 0xde, 0x52, 0x5c, 0xfc, 0x11, - 0xac, 0x59, 0xa4, 0xe7, 0x93, 0xa0, 0xaf, 0x03, 0x3b, 0xe3, 0x3b, 0xdf, 0x85, 0x9b, 0x2d, 0xc2, - 0x34, 0xf5, 0xf9, 0xe2, 0x9f, 0xc1, 0xfb, 0x2d, 0xc2, 0x32, 0x00, 0xd2, 0x4e, 0x24, 0x1d, 0x3d, - 0x09, 0x8a, 0xc2, 0x5f, 0xc1, 0x7b, 0x2d, 0x22, 0x3e, 0x90, 0xa9, 0x96, 0xf9, 0x35, 0xcd, 0x58, - 0x2e, 0x61, 0xac, 0x08, 0x85, 0xc6, 0x70, 0xc4, 0x2e, 0xf7, 0xbe, 0x5d, 0x86, 0xa2, 0xba, 0xbd, - 0xa1, 0x43, 0xa8, 0xb4, 0x7d, 0xbb, 0x7b, 0x21, 0xdf, 0x01, 0x91, 0x39, 0xf5, 0x34, 0xa8, 0xbe, - 0x55, 0xdf, 0xc8, 0x58, 0xe1, 0x47, 0xe4, 0x85, 0xef, 0x19, 0xe8, 0x6b, 0xa8, 0xa5, 0x9f, 0xb7, - 0x10, 0xd6, 0xe4, 0x67, 0xbc, 0xde, 0xd5, 0xb7, 0xe7, 0xca, 0x08, 0xeb, 0xe8, 0x00, 0x4a, 0xe1, - 0xf3, 0x0f, 0xd2, 0x6f, 0xe8, 0xa9, 0xe7, 0xa3, 0xba, 0x99, 0xb9, 0x26, 0x6d, 0xbc, 0x12, 0xa3, - 0x45, 0x7f, 0x17, 0x42, 0x1f, 0x24, 0x3f, 0x9d, 0xf1, 0x9a, 0x54, 0xbf, 0x33, 0x4f, 0x44, 0x1a, - 0x6e, 0x43, 0x35, 0xf9, 0xba, 0x81, 0xf4, 0x90, 0x32, 0x5f, 0x4f, 0xea, 0x5b, 0x73, 0x24, 0x22, - 0xab, 0xc9, 0xef, 0xa1, 0xed, 0x99, 0xae, 0x64, 0x59, 0xcd, 0x78, 0xf1, 0xc0, 0x0b, 0xe8, 0x17, - 0x80, 0xa6, 0xaf, 0xec, 0xe8, 0xee, 0x75, 0x9e, 0x17, 0xea, 0xf8, 0x0a, 0x29, 0xf9, 0x85, 0x9f, - 0xc3, 0xea, 0xd4, 0x65, 0x13, 0x7d, 0x47, 0x53, 0x9d, 0x75, 0x89, 0xaf, 0x7f, 0x30, 0x5f, 0x28, - 0x0a, 0x60, 0xfa, 0xce, 0x97, 0x08, 0x60, 0xe6, 0xed, 0x32, 0x11, 0xc0, 0x8c, 0x8b, 0xa3, 0xac, - 0xb5, 0xf0, 0xae, 0x91, 0xa8, 0xb5, 0xd4, 0x9d, 0x24, 0x51, 0x6b, 0x89, 0xcb, 0x09, 0x5e, 0x40, - 0x8f, 0xa1, 0xa8, 0x58, 0x68, 0x73, 0x5a, 0x2c, 0xb4, 0x70, 0x2b, 0x6b, 0x49, 0x1a, 0x38, 0x83, - 0x25, 0xfd, 0x58, 0x86, 0xb6, 0x66, 0x5e, 0x5a, 0xa5, 0xa9, 0xb9, 0x97, 0xda, 0x28, 0x28, 0x71, - 0xc4, 0x48, 0x07, 0xa5, 0x1f, 0xb6, 0xd2, 0x41, 0xc5, 0x67, 0x12, 0xbc, 0x80, 0x7a, 0xe2, 0x61, - 0x75, 0x6a, 0xbc, 0xa2, 0x7b, 0x49, 0x9d, 0x59, 0x47, 0x91, 0xfa, 0xdd, 0x2b, 0xe5, 0xe4, 0x77, - 0x1a, 0x50, 0x8e, 0xe6, 0x15, 0x7a, 0x4f, 0x53, 0x4a, 0x0f, 0xdc, 0xfa, 0x66, 0xf6, 0x62, 0x84, - 0x81, 0x9a, 0x36, 0x09, 0x0c, 0x92, 0xd3, 0x2c, 0x81, 0x81, 0x3e, 0x9c, 0xf0, 0x02, 0x7a, 0x0a, - 0x10, 0xcf, 0x11, 0x74, 0x3b, 0x31, 0x24, 0x53, 0x93, 0xa8, 0x5e, 0x9f, 0xb1, 0x1a, 0x66, 0x7f, - 0x49, 0x1f, 0x2b, 0x09, 0x34, 0x33, 0xe6, 0x4d, 0xbd, 0xa6, 0x3f, 0xbe, 0xf0, 0x6e, 0x8d, 0x17, - 0xd0, 0x13, 0xa8, 0x26, 0xa7, 0x4d, 0xa2, 0x1f, 0x64, 0x0e, 0xa2, 0x4c, 0x3b, 0x2f, 0x61, 0x23, - 0x7b, 0x0c, 0xa1, 0x9d, 0xa4, 0xbd, 0xd9, 0x93, 0x2a, 0xd3, 0xae, 0x05, 0xeb, 0x59, 0x53, 0x2a, - 0x51, 0x1d, 0x73, 0xc6, 0x58, 0x96, 0xcd, 0x83, 0xcf, 0xff, 0xfa, 0x6e, 0xcb, 0xf8, 0xc7, 0xbb, - 0x2d, 0xe3, 0x5f, 0xef, 0xb6, 0x8c, 0x3f, 0xfe, 0x7b, 0x6b, 0x01, 0x70, 0xb7, 0xbf, 0xdb, 0x25, - 0xbe, 0xb7, 0x6b, 0xbb, 0x83, 0x2e, 0xd9, 0xa5, 0x7b, 0xbb, 0xa1, 0x8e, 0x3f, 0xea, 0x06, 0xc4, - 0x9f, 0x10, 0xff, 0xeb, 0xdc, 0xa8, 0xd3, 0xb9, 0x21, 0xfe, 0x9c, 0xfb, 0xe4, 0x7f, 0x01, 0x00, - 0x00, 0xff, 0xff, 0xfb, 0x76, 0xda, 0x3c, 0xb6, 0x1b, 0x00, 0x00, + // 2298 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcf, 0x73, 0x1b, 0x49, + 0xf5, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0x36, 0xeb, 0x78, 0xfb, + 0xbb, 0x95, 0x75, 0xb2, 0xfb, 0x75, 0xc0, 0x4b, 0x41, 0x08, 0xbb, 0x1b, 0xfc, 0x43, 0x71, 0x0c, + 0xb1, 0x15, 0x46, 0x4a, 0x52, 0xa4, 0x8a, 0x0a, 0x63, 0x4d, 0xcb, 0xd2, 0x7a, 0x34, 0x2d, 0x66, + 0x5a, 0x4e, 0x7c, 0xe0, 0xc6, 0x8d, 0xa2, 0x38, 0x70, 0xe1, 0xc0, 0x85, 0xa2, 0x38, 0x70, 0xe0, + 0xff, 0xe0, 0x42, 0x01, 0xff, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x47, 0x50, 0xfd, 0x63, 0x66, 0x7a, + 0x46, 0x33, 0x8a, 0xab, 0xb8, 0xe9, 0xbd, 0x7e, 0xef, 0x4d, 0xbf, 0xf7, 0x79, 0xfd, 0xde, 0xeb, + 0x16, 0xac, 0x8d, 0x7d, 0xca, 0x68, 0x70, 0x9f, 0xee, 0xf6, 0xa8, 0xc7, 0x7c, 0xea, 0xee, 0x08, + 0x06, 0xaa, 0x46, 0x0c, 0xbc, 0x06, 0xab, 0xad, 0x4b, 0xe2, 0xb1, 0xd7, 0x27, 0x24, 0xa0, 0xc1, + 0x13, 0x62, 0xfb, 0xec, 0x8c, 0xd8, 0x0c, 0x2f, 0xc1, 0x62, 0x87, 0xd9, 0x6c, 0x12, 0x58, 0xe4, + 0x67, 0x13, 0x12, 0x30, 0x7c, 0x06, 0xb5, 0x90, 0x31, 0x76, 0xaf, 0xd0, 0x2a, 0x94, 0x02, 0x66, + 0x33, 0x62, 0x1a, 0x5b, 0xc6, 0x76, 0xd5, 0x92, 0x04, 0xfa, 0x12, 0x16, 0x03, 0x21, 0xf4, 0x7c, + 0xec, 0xd8, 0x8c, 0x04, 0x66, 0x61, 0x6b, 0x7e, 0xbb, 0xb6, 0xbb, 0xbe, 0x13, 0xef, 0xa0, 0xa3, + 0xad, 0x5b, 0x49, 0x69, 0xfc, 0x57, 0x03, 0x16, 0xf4, 0x75, 0xf4, 0x39, 0x94, 0x5c, 0x72, 0x49, + 0x5c, 0xf1, 0x95, 0xfa, 0xee, 0x87, 0x39, 0x76, 0x76, 0x9e, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x63, + 0xa8, 0x8f, 0x12, 0xce, 0x98, 0x85, 0x2d, 0x63, 0xbb, 0xb6, 0x7b, 0x5b, 0xd3, 0xce, 0xf2, 0xf9, + 0xc9, 0x9c, 0x95, 0x52, 0xc4, 0xdf, 0x82, 0x92, 0x30, 0x8d, 0xaa, 0x50, 0x3a, 0x6c, 0xed, 0x3f, + 0x3f, 0x6a, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4f, 0x1f, 0xb7, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xe5, + 0x9e, 0x75, 0x7a, 0x7c, 0x7a, 0xd4, 0x28, 0x70, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x7e, + 0x19, 0x4a, 0xc2, 0x3e, 0xde, 0x80, 0xf5, 0x23, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, + 0xc5, 0xb1, 0xd7, 0xa7, 0x61, 0x38, 0xff, 0x60, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, + 0x2c, 0x47, 0xf6, 0xd7, 0xd4, 0x17, 0x5e, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xd8, + 0x3d, 0xe7, 0x72, 0x82, 0x73, 0xc7, 0x36, 0xeb, 0x0d, 0xcc, 0x79, 0xc9, 0x15, 0x04, 0xe7, 0x9e, + 0x4d, 0x86, 0xae, 0x63, 0x16, 0x25, 0x1a, 0x82, 0x40, 0x5b, 0x50, 0x1b, 0xfb, 0xd4, 0x99, 0xf4, + 0xd8, 0xa9, 0x3d, 0x22, 0x66, 0x49, 0xac, 0xe9, 0x2c, 0xb4, 0x09, 0x70, 0x29, 0x37, 0xd1, 0x61, + 0xbe, 0x79, 0x43, 0x08, 0x68, 0x1c, 0xfc, 0xeb, 0x02, 0xdc, 0x9c, 0xf6, 0x80, 0xe3, 0xbf, 0x05, + 0xb5, 0x7e, 0xc4, 0x75, 0x54, 0x16, 0xe8, 0x2c, 0xf4, 0x19, 0x2c, 0x13, 0xef, 0x72, 0xe8, 0x53, + 0x6f, 0x44, 0x3c, 0x16, 0x1c, 0xd0, 0x89, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0x7c, 0x27, 0xcc, 0x0e, + 0x2e, 0x94, 0x98, 0x74, 0x4e, 0xe3, 0xc4, 0xf9, 0x56, 0xd4, 0xf3, 0x6d, 0x13, 0x60, 0x40, 0x83, + 0xd0, 0x78, 0x49, 0x6a, 0xc5, 0x1c, 0x84, 0x61, 0x61, 0xe8, 0x05, 0xcc, 0xf6, 0x7a, 0x44, 0x84, + 0x40, 0x7a, 0x98, 0xe0, 0xa1, 0xcf, 0xa0, 0xac, 0x3c, 0x36, 0xcb, 0x22, 0x4f, 0x90, 0x96, 0x27, + 0x0a, 0x22, 0x2b, 0x14, 0xc1, 0x77, 0x61, 0xa9, 0x4b, 0x6c, 0xdf, 0xa1, 0x6f, 0x3c, 0x05, 0x25, + 0x5a, 0x83, 0x1b, 0x3e, 0xb1, 0x03, 0xea, 0xa9, 0x28, 0x28, 0x8a, 0x1f, 0xa1, 0x58, 0x74, 0xec, + 0x5e, 0x61, 0x13, 0xd6, 0x8e, 0x08, 0x6b, 0x69, 0xbe, 0x87, 0xd9, 0xf0, 0x16, 0x56, 0xa7, 0x56, + 0xae, 0x17, 0xe5, 0xaf, 0x60, 0x41, 0x0f, 0xa6, 0x3a, 0x70, 0x4d, 0x3d, 0xd5, 0xe3, 0x65, 0x01, + 0x5f, 0x42, 0x1e, 0xff, 0xc3, 0x80, 0xa5, 0x94, 0x04, 0xaa, 0x43, 0x61, 0x18, 0x7e, 0xac, 0x30, + 0x14, 0x79, 0xd4, 0xf3, 0x89, 0xcd, 0x88, 0xf3, 0x72, 0x40, 0x3c, 0x81, 0x61, 0xd5, 0xd2, 0x59, + 0x31, 0x3a, 0xf3, 0x3a, 0x3a, 0x3b, 0x50, 0x12, 0x08, 0x9a, 0x45, 0xb1, 0x29, 0x53, 0x3f, 0xbd, + 0x03, 0xea, 0xb3, 0xae, 0x1d, 0xc8, 0x8c, 0x92, 0x62, 0xa8, 0x09, 0x15, 0x9f, 0x52, 0x66, 0x51, + 0x37, 0x4c, 0xd6, 0x88, 0x46, 0xf7, 0xa0, 0xd1, 0x9b, 0xf8, 0x3e, 0xf1, 0x98, 0x35, 0xf1, 0x4e, + 0x27, 0xa3, 0x33, 0x22, 0xf3, 0x75, 0xd1, 0x9a, 0xe2, 0xe3, 0x03, 0xb8, 0x79, 0x4a, 0xde, 0x68, + 0x5e, 0x85, 0x48, 0xdd, 0x83, 0x06, 0x0f, 0x5b, 0xdf, 0xa5, 0x6f, 0xba, 0x64, 0x34, 0x76, 0xe3, + 0xfa, 0x35, 0xc5, 0xc7, 0x1d, 0x58, 0x49, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x35, 0x2d, 0x7e, 0x42, + 0x7b, 0x76, 0xb8, 0x75, 0x71, 0xfc, 0x89, 0x38, 0x4e, 0x19, 0x3b, 0x4b, 0x85, 0x1c, 0xff, 0xc2, + 0x80, 0x95, 0xb4, 0xe4, 0xff, 0xfc, 0x79, 0x74, 0x1f, 0x2a, 0xa1, 0x9f, 0xaa, 0x26, 0xae, 0x68, + 0xaa, 0x3c, 0xce, 0x42, 0x27, 0x12, 0xc2, 0x7f, 0x33, 0x60, 0xe3, 0x40, 0x2e, 0xbf, 0x7f, 0xd3, + 0xe8, 0x11, 0x14, 0xd9, 0xd5, 0x98, 0x08, 0xd3, 0xf5, 0xdd, 0x4f, 0x35, 0xd3, 0xb9, 0x36, 0x76, + 0xda, 0x63, 0xae, 0x62, 0x09, 0x45, 0x6c, 0xc3, 0x0d, 0x49, 0xf3, 0x22, 0x7b, 0xda, 0x6e, 0x3f, + 0x6b, 0xcc, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0xcf, 0xea, 0xbe, 0xde, 0x3b, 0xe8, 0x1e, 0xbf, 0x38, + 0xee, 0xfe, 0xb8, 0x61, 0xa0, 0x65, 0x58, 0xec, 0x74, 0xdb, 0xcf, 0x62, 0x56, 0x01, 0x2d, 0x42, + 0xf5, 0xa0, 0x7d, 0xfa, 0xf8, 0xf8, 0xe8, 0xb9, 0xd5, 0x6a, 0xcc, 0xf3, 0x6a, 0x6c, 0xb5, 0x3a, + 0xad, 0x6e, 0xa3, 0x88, 0x16, 0xa0, 0x72, 0xd4, 0x7e, 0x2d, 0x6b, 0x73, 0x09, 0x5f, 0xc0, 0x7a, + 0xd6, 0x66, 0x78, 0x6c, 0xd3, 0xee, 0x44, 0x49, 0x5d, 0xd0, 0x93, 0x3a, 0x2b, 0x11, 0xe7, 0x73, + 0x12, 0xf1, 0x37, 0x06, 0x98, 0x27, 0xd4, 0x19, 0xf6, 0xaf, 0xae, 0x15, 0x3d, 0xa0, 0x63, 0xe2, + 0xdb, 0x6c, 0x48, 0xbd, 0xf0, 0x1c, 0xdf, 0xce, 0x46, 0xb6, 0x1d, 0xca, 0x59, 0x9a, 0x0a, 0xba, + 0x03, 0x75, 0x9f, 0xf4, 0xa8, 0xd7, 0x1f, 0x9e, 0x4f, 0x7c, 0xb2, 0xe7, 0xba, 0x62, 0x5f, 0x15, + 0x2b, 0xc5, 0xc5, 0xbf, 0x37, 0x60, 0x35, 0xcb, 0x18, 0x7a, 0xa8, 0xf0, 0x93, 0xcd, 0xf6, 0xce, + 0x7b, 0xbe, 0x9d, 0x80, 0x4e, 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x42, 0x78, 0x76, 0x25, 0x8d, 0xbf, + 0x99, 0x01, 0xeb, 0x12, 0xd4, 0xac, 0xd6, 0x49, 0xfb, 0x45, 0xeb, 0xb5, 0xd5, 0x7e, 0xca, 0x11, + 0x5b, 0x80, 0xca, 0xde, 0xe1, 0xa1, 0xa4, 0x8a, 0xf8, 0x97, 0x06, 0xac, 0x65, 0x44, 0x8e, 0xc3, + 0xf4, 0x43, 0x68, 0xf4, 0xed, 0xa1, 0x4b, 0x9c, 0x76, 0x1c, 0x2d, 0xe3, 0x7a, 0xd1, 0x9a, 0x52, + 0x54, 0x20, 0x14, 0xa6, 0x31, 0xd7, 0x0b, 0x19, 0x3e, 0x86, 0x8d, 0x43, 0x12, 0x30, 0x9f, 0x5e, + 0x07, 0xc7, 0x5b, 0x50, 0xbd, 0x20, 0x64, 0xdc, 0x15, 0x95, 0xaf, 0x20, 0x10, 0x88, 0x19, 0x98, + 0xc0, 0x7a, 0x96, 0x29, 0xee, 0xd8, 0x0f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x48, 0x51, 0xc1, + 0x54, 0x27, 0xfc, 0x96, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, + 0x1a, 0x8b, 0x10, 0x14, 0x3d, 0x0e, 0x8e, 0xdc, 0xa8, 0xf8, 0xcd, 0x3b, 0x97, 0x4b, 0x7b, 0x17, + 0xc4, 0x51, 0xfb, 0x54, 0x14, 0xe7, 0xf3, 0x8a, 0x7c, 0xec, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, + 0xc0, 0xa6, 0xba, 0xb0, 0xa2, 0xe2, 0xa8, 0x95, 0xf4, 0x93, 0x72, 0x0b, 0xaa, 0x3d, 0xd7, 0x0e, + 0x02, 0xad, 0xf3, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0x2e, 0xbd, 0x0a, 0x4b, 0x95, 0xea, + 0xbe, 0xfa, 0x8c, 0xc7, 0x37, 0x7f, 0x98, 0x10, 0xb2, 0x52, 0x4a, 0xbc, 0x50, 0xa2, 0x69, 0x31, + 0x9e, 0x8e, 0x7c, 0x0c, 0xd0, 0x3c, 0x8e, 0x68, 0x64, 0x42, 0xd9, 0x3e, 0xe7, 0x82, 0x21, 0xf0, + 0x21, 0xc9, 0x57, 0x68, 0xbf, 0x4f, 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x83, 0x06, 0x79, 0x4b, 0x7a, + 0x13, 0x46, 0xf9, 0xa2, 0xf4, 0x5e, 0xe3, 0xe0, 0x65, 0x58, 0x3a, 0x22, 0x4c, 0x01, 0x20, 0x7b, + 0xfa, 0x23, 0x58, 0x8c, 0x59, 0x1c, 0xdf, 0xa8, 0x1d, 0x1a, 0xd7, 0x6a, 0x87, 0x78, 0x1b, 0xea, + 0xca, 0x80, 0x36, 0x69, 0x28, 0x5c, 0x0c, 0x1d, 0x17, 0xfc, 0x1d, 0x58, 0x88, 0x24, 0xf9, 0x97, + 0x3e, 0x81, 0x22, 0x5f, 0x51, 0xc9, 0xb3, 0x92, 0x8a, 0xa8, 0xf8, 0x86, 0x10, 0xc0, 0x2d, 0x58, + 0xe4, 0x9c, 0x03, 0x8e, 0x4a, 0x6e, 0x96, 0xf0, 0xf6, 0x2f, 0xd5, 0x4f, 0xa8, 0x43, 0xa2, 0xf6, + 0x1f, 0xb3, 0xf0, 0xcf, 0xa1, 0x76, 0x40, 0x47, 0x23, 0xdb, 0x73, 0x84, 0x91, 0x06, 0xcc, 0x13, + 0xef, 0x52, 0xb8, 0x59, 0xb5, 0xf8, 0x4f, 0x91, 0x20, 0x03, 0xe2, 0xba, 0x2a, 0xcf, 0x24, 0xc1, + 0xb9, 0x97, 0xb6, 0x3b, 0x89, 0x0e, 0x9b, 0x20, 0x78, 0xda, 0xd8, 0xfe, 0xf9, 0x44, 0x8e, 0x33, + 0x45, 0x61, 0x23, 0x66, 0xf0, 0x0d, 0x4e, 0x02, 0xe2, 0xab, 0x4c, 0x13, 0xbf, 0xf1, 0x09, 0xd4, + 0x0e, 0x06, 0xb6, 0xe7, 0x11, 0x37, 0xd7, 0x07, 0xa4, 0xb5, 0xa6, 0xaa, 0x2a, 0x59, 0x22, 0x9a, + 0xfe, 0x39, 0x61, 0x71, 0x96, 0x73, 0x0a, 0xff, 0xa7, 0x00, 0x95, 0xe8, 0xd8, 0x7c, 0x1b, 0xaa, + 0x01, 0x07, 0x47, 0x64, 0xa8, 0x8c, 0x67, 0x3e, 0x70, 0xb1, 0x28, 0xd7, 0xeb, 0x85, 0x51, 0x55, + 0xbd, 0xd6, 0x4c, 0xe1, 0x10, 0x45, 0xdd, 0x8a, 0x45, 0xd1, 0xf7, 0x61, 0x69, 0xe8, 0x9d, 0xd1, + 0x89, 0xe7, 0x28, 0x97, 0x02, 0x73, 0x5e, 0xa4, 0xcb, 0x9a, 0x5e, 0x02, 0x62, 0x6f, 0xad, 0xb4, + 0x38, 0xda, 0x87, 0x06, 0x9d, 0xb0, 0xa4, 0x89, 0xe2, 0x4c, 0x13, 0x53, 0xf2, 0xe8, 0x01, 0x87, + 0x3c, 0x02, 0x54, 0x04, 0x3b, 0xa5, 0x1e, 0xaf, 0x5a, 0xba, 0x28, 0x3f, 0x78, 0x3c, 0xb3, 0x9e, + 0xd9, 0x6c, 0xa0, 0xce, 0x7c, 0x44, 0x73, 0xbc, 0x89, 0x77, 0x79, 0xec, 0x88, 0x93, 0x5e, 0xb5, + 0x24, 0x81, 0xef, 0xc3, 0x4a, 0xb2, 0xa4, 0xc9, 0x5c, 0x37, 0xa1, 0x2c, 0xb3, 0x3b, 0x50, 0x89, + 0x14, 0x92, 0xf8, 0x57, 0x06, 0x2c, 0x4f, 0x15, 0x41, 0xf4, 0x10, 0x6a, 0x17, 0x43, 0xd7, 0x25, + 0x4e, 0xf7, 0x5a, 0x67, 0x4c, 0x17, 0x46, 0x5f, 0xc0, 0x82, 0x3f, 0xf1, 0xbc, 0xa1, 0x77, 0x1e, + 0x56, 0xed, 0xd9, 0xca, 0x09, 0x69, 0x7c, 0x20, 0xce, 0x3e, 0x9f, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, + 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x63, 0x9b, 0x0d, 0x3a, 0x63, 0xd2, 0x0b, 0x7b, 0x64, 0x48, 0xe3, + 0x3f, 0x1b, 0x50, 0x09, 0x07, 0xb0, 0xbc, 0x5a, 0xad, 0x6a, 0x6f, 0x21, 0xbb, 0xf6, 0x26, 0x46, + 0xef, 0x26, 0x54, 0xfa, 0x13, 0xd7, 0x15, 0x30, 0xc8, 0x6a, 0x15, 0xd1, 0x7a, 0x64, 0x4b, 0x89, + 0xc8, 0xa2, 0xbb, 0x50, 0xe2, 0x4d, 0x3b, 0x30, 0x6f, 0x88, 0x00, 0x64, 0x0e, 0x87, 0x52, 0x02, + 0x3f, 0x14, 0xd5, 0x4d, 0x39, 0xcd, 0xe3, 0x1f, 0xe9, 0x1a, 0xef, 0xd5, 0xfd, 0xa3, 0x01, 0x1f, + 0x1c, 0x11, 0xf6, 0x32, 0x35, 0x72, 0x47, 0xd1, 0xdb, 0x82, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, + 0x18, 0xf1, 0xc3, 0x5b, 0x95, 0xce, 0x42, 0xdb, 0xb0, 0xe4, 0x93, 0xcb, 0x21, 0xbf, 0x91, 0x85, + 0x52, 0x32, 0x2a, 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0xbe, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, + 0x44, 0xa4, 0xb3, 0x44, 0x3b, 0x70, 0xdd, 0xae, 0x7d, 0x2e, 0xbb, 0x5a, 0xc5, 0x0a, 0x49, 0x7c, + 0x06, 0xab, 0xe9, 0x3d, 0x86, 0xf0, 0xf0, 0xcd, 0x84, 0xf0, 0xf0, 0xdf, 0x22, 0xef, 0xc3, 0x2b, + 0x85, 0xc2, 0x36, 0xa4, 0xc5, 0x6c, 0xa4, 0xb6, 0xa5, 0x50, 0x8a, 0x68, 0xfc, 0x35, 0x6c, 0x64, + 0x87, 0x82, 0xc7, 0xf4, 0x04, 0x96, 0xd3, 0xf7, 0x92, 0xac, 0x59, 0x27, 0x6b, 0x93, 0xd6, 0xb4, + 0x26, 0x46, 0xd0, 0x78, 0x3a, 0x0c, 0xf8, 0xb4, 0x41, 0xa3, 0x2e, 0xf5, 0x3b, 0x9e, 0x77, 0x64, + 0x4c, 0x73, 0xf3, 0xce, 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0x65, 0xaa, 0x78, 0x87, 0x24, 0x07, + 0x41, 0xfd, 0xb4, 0x92, 0xde, 0xa5, 0xd9, 0xe8, 0x01, 0xac, 0x0f, 0x83, 0x23, 0x97, 0x9e, 0xd9, + 0xee, 0x61, 0x4a, 0x43, 0x86, 0x3c, 0x6f, 0x19, 0x7f, 0x0f, 0xea, 0xda, 0x96, 0xc3, 0x3c, 0xe3, + 0x54, 0x56, 0x9e, 0x29, 0x3f, 0x2c, 0x29, 0x81, 0x4f, 0xa1, 0xbe, 0xe7, 0x38, 0x9c, 0x1b, 0x66, + 0x56, 0x96, 0x83, 0x19, 0x6e, 0x14, 0x32, 0xdd, 0xc0, 0x5f, 0xc1, 0x42, 0x64, 0x4f, 0x36, 0x74, + 0xe4, 0x91, 0x37, 0x69, 0x8f, 0xa4, 0xed, 0x8c, 0x15, 0x7c, 0x17, 0x96, 0x2d, 0x32, 0xa2, 0x97, + 0x44, 0xdf, 0xd2, 0x2a, 0x94, 0x86, 0x9e, 0x43, 0xde, 0x86, 0x8f, 0x3f, 0x82, 0xc0, 0xdf, 0x85, + 0x25, 0x5d, 0x94, 0x7f, 0xed, 0x0e, 0xd4, 0x75, 0x9b, 0x51, 0xfe, 0xa5, 0xb8, 0xf8, 0x53, 0x58, + 0xb1, 0x48, 0xdf, 0x27, 0xc1, 0x40, 0x07, 0x3a, 0xe7, 0x3b, 0xff, 0x0f, 0x37, 0x3b, 0x84, 0x69, + 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0xdb, 0x1d, 0xc2, 0x32, 0xa1, 0x0a, 0x15, 0xf5, 0x64, 0x37, 0x52, + 0xc9, 0xfe, 0x23, 0xf8, 0xb0, 0x43, 0xc4, 0x67, 0x72, 0x94, 0x33, 0xbf, 0x9a, 0x30, 0x59, 0x48, + 0x99, 0x2c, 0x43, 0xa9, 0x35, 0x1a, 0xb3, 0xab, 0xdd, 0x3f, 0x2d, 0x42, 0x59, 0xdd, 0xec, 0xd0, + 0x01, 0xd4, 0xba, 0xbe, 0xdd, 0xbb, 0x90, 0x6f, 0x84, 0xc8, 0x9c, 0x7a, 0x36, 0x54, 0xdf, 0x6b, + 0xae, 0x65, 0xac, 0xf0, 0xf1, 0x79, 0xee, 0x1b, 0x06, 0x7a, 0x05, 0x8d, 0xf4, 0xd3, 0x17, 0xc2, + 0x9a, 0x7c, 0xce, 0xcb, 0x5e, 0x73, 0x6b, 0xa6, 0x8c, 0xb0, 0x8e, 0xf6, 0xa1, 0x12, 0x3e, 0x0d, + 0x21, 0xfd, 0xf6, 0x9e, 0x7a, 0x5a, 0x6a, 0x9a, 0x99, 0x6b, 0xd2, 0xc6, 0x4b, 0xd1, 0x76, 0xf4, + 0x37, 0x23, 0xf4, 0x51, 0xf2, 0xd3, 0x19, 0x2f, 0x4d, 0xcd, 0xdb, 0xb3, 0x44, 0xa4, 0xe1, 0x2e, + 0xd4, 0x93, 0x2f, 0x1f, 0x48, 0x77, 0x29, 0xf3, 0x65, 0xa5, 0xb9, 0x39, 0x43, 0x22, 0xb2, 0x9a, + 0xfc, 0x1e, 0xda, 0xca, 0xdd, 0x4a, 0x96, 0xd5, 0x8c, 0xd7, 0x10, 0x3c, 0x87, 0x7e, 0x0a, 0x68, + 0xfa, 0x3a, 0x8f, 0x3e, 0xbe, 0xce, 0xd3, 0x43, 0x13, 0xbf, 0x47, 0x4a, 0x7e, 0xe1, 0x27, 0xb0, + 0x3c, 0x75, 0x11, 0x45, 0xff, 0xa7, 0xa9, 0xe6, 0x5d, 0xf0, 0x9b, 0x1f, 0xcd, 0x16, 0x8a, 0x1c, + 0x98, 0xbe, 0x0f, 0x26, 0x1c, 0xc8, 0xbd, 0x79, 0x26, 0x1c, 0xc8, 0xb9, 0x54, 0xca, 0x5c, 0x0b, + 0xef, 0x21, 0x89, 0x5c, 0x4b, 0xdd, 0x57, 0x12, 0xb9, 0x96, 0xb8, 0xb8, 0xe0, 0x39, 0xf4, 0x08, + 0xca, 0x8a, 0x85, 0x36, 0xa6, 0xc5, 0x42, 0x0b, 0xeb, 0x59, 0x4b, 0xd2, 0xc0, 0x29, 0x2c, 0xe8, + 0x23, 0x1b, 0xda, 0xcc, 0xbd, 0xd0, 0x4a, 0x53, 0x33, 0x2f, 0xbc, 0x91, 0x53, 0x62, 0xfc, 0x48, + 0x3b, 0xa5, 0x0f, 0x62, 0x69, 0xa7, 0xe2, 0x79, 0x05, 0xcf, 0xa1, 0xbe, 0x78, 0x74, 0x9d, 0x6a, + 0xbd, 0xe8, 0x4e, 0x52, 0x27, 0x6f, 0x4c, 0x69, 0x7e, 0xfc, 0x5e, 0x39, 0xf9, 0x9d, 0x16, 0x54, + 0xa3, 0x1e, 0x86, 0x3e, 0xd0, 0x94, 0xd2, 0xcd, 0xb8, 0xb9, 0x91, 0xbd, 0x18, 0x61, 0xa0, 0xba, + 0x4f, 0x02, 0x83, 0x64, 0x87, 0x4b, 0x60, 0xa0, 0x37, 0x2b, 0x3c, 0x87, 0x9e, 0x00, 0xc4, 0x3d, + 0x05, 0xdd, 0x4a, 0x34, 0xce, 0x54, 0x57, 0x6a, 0x36, 0x73, 0x56, 0xc3, 0xe8, 0x2f, 0xe8, 0x2d, + 0x26, 0x81, 0x66, 0x46, 0xef, 0x69, 0x36, 0xf4, 0x87, 0x19, 0x5e, 0xad, 0xf1, 0x1c, 0x7a, 0x0c, + 0xf5, 0x64, 0xe7, 0x49, 0xd4, 0x83, 0xcc, 0xa6, 0x94, 0x69, 0xe7, 0x15, 0x98, 0x79, 0x2d, 0x09, + 0xdd, 0x4b, 0x5a, 0x9c, 0xd5, 0xb7, 0x32, 0x6d, 0xbf, 0x80, 0xb5, 0xec, 0x7e, 0x85, 0xb6, 0x93, + 0x96, 0xf3, 0x5b, 0x5a, 0x96, 0xdd, 0xfd, 0x07, 0x7f, 0x79, 0xb7, 0x69, 0xfc, 0xfd, 0xdd, 0xa6, + 0xf1, 0xcf, 0x77, 0x9b, 0xc6, 0x6f, 0xff, 0xb5, 0x39, 0x07, 0xb8, 0x37, 0xd8, 0xe9, 0x11, 0xdf, + 0xdb, 0xb1, 0xdd, 0x61, 0x8f, 0xec, 0xd0, 0xdd, 0x9d, 0x50, 0xc7, 0x1f, 0xf7, 0x02, 0xe2, 0x5f, + 0x12, 0xff, 0x55, 0x61, 0x7c, 0x76, 0x76, 0x43, 0xfc, 0x81, 0xf7, 0xf9, 0x7f, 0x03, 0x00, 0x00, + 0xff, 0xff, 0x59, 0x71, 0xe8, 0x68, 0xda, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3422,8 +3422,8 @@ type ControlClient interface { RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) } type controlClient struct { @@ -3628,18 +3628,18 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe return out, nil } -func (c *controlClient) SetGlobalDefaultBranch(ctx context.Context, in *SetGlobalDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultBranch", in, out, opts...) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *controlClient) SetRepoDefaultBranch(ctx context.Context, in *SetRepoDefaultBranchRequest, opts ...grpc.CallOption) (*Empty, error) { +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultBranch", in, out, opts...) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) if err != nil { return nil, err } @@ -3667,8 +3667,8 @@ type ControlServer interface { RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultBranch(context.Context, *SetGlobalDefaultBranchRequest) (*Empty, error) - SetRepoDefaultBranch(context.Context, *SetRepoDefaultBranchRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*Empty, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -4020,38 +4020,38 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -func _Control_SetGlobalDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultBranchRequest) +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultBranch(ctx, in) + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultBranch", + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultBranch(ctx, req.(*SetGlobalDefaultBranchRequest)) + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_SetRepoDefaultBranch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultBranchRequest) +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultBranch(ctx, in) + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultBranch", + FullMethod: "/o2control.Control/SetRepoDefaultRevision", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultBranch(ctx, req.(*SetRepoDefaultBranchRequest)) + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) } return interceptor(ctx, in, info, handler) } @@ -4133,12 +4133,12 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_SetDefaultRepo_Handler, }, { - MethodName: "SetGlobalDefaultBranch", - Handler: _Control_SetGlobalDefaultBranch_Handler, + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, }, { - MethodName: "SetRepoDefaultBranch", - Handler: _Control_SetRepoDefaultBranch_Handler, + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, }, }, Streams: []grpc.StreamDesc{ @@ -5834,16 +5834,16 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { } i++ } - if len(m.DefaultBranch) > 0 { + if len(m.DefaultRevision) > 0 { dAtA[i] = 0x1a i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) - i += copy(dAtA[i:], m.DefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i += copy(dAtA[i:], m.DefaultRevision) } - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { dAtA[i] = 0x20 i++ - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -5910,11 +5910,11 @@ func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i += copy(dAtA[i:], m.Name) } - if len(m.DefaultBranch) > 0 { + if len(m.DefaultRevision) > 0 { dAtA[i] = 0x12 i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultBranch))) - i += copy(dAtA[i:], m.DefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i += copy(dAtA[i:], m.DefaultRevision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -5937,11 +5937,11 @@ func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { _ = i var l int _ = l - if len(m.NewDefaultBranch) > 0 { + if len(m.NewDefaultRevision) > 0 { dAtA[i] = 0xa i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultBranch))) - i += copy(dAtA[i:], m.NewDefaultBranch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i += copy(dAtA[i:], m.NewDefaultRevision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6054,7 +6054,7 @@ func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { +func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6064,16 +6064,16 @@ func (m *SetGlobalDefaultBranchRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int _ = l - if len(m.Branch) > 0 { + if len(m.Revision) > 0 { dAtA[i] = 0xa i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) - i += copy(dAtA[i:], m.Branch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -6081,7 +6081,7 @@ func (m *SetGlobalDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } -func (m *SetRepoDefaultBranchRequest) Marshal() (dAtA []byte, err error) { +func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalTo(dAtA) @@ -6091,7 +6091,7 @@ func (m *SetRepoDefaultBranchRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { var i int _ = i var l int @@ -6101,11 +6101,11 @@ func (m *SetRepoDefaultBranchRequest) MarshalTo(dAtA []byte) (int, error) { i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) } - if len(m.Branch) > 0 { + if len(m.Revision) > 0 { dAtA[i] = 0x12 i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Branch))) - i += copy(dAtA[i:], m.Branch) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i += copy(dAtA[i:], m.Revision) } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) @@ -7080,11 +7080,11 @@ func (m *RepoInfo) Size() (n int) { if m.Default { n += 2 } - l = len(m.DefaultBranch) + l = len(m.DefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.IsGlobalDefaultBranch { + if m.IsGlobalDefaultRevision { n += 2 } if m.XXX_unrecognized != nil { @@ -7121,7 +7121,7 @@ func (m *AddRepoRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.DefaultBranch) + l = len(m.DefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7137,7 +7137,7 @@ func (m *AddRepoReply) Size() (n int) { } var l int _ = l - l = len(m.NewDefaultBranch) + l = len(m.NewDefaultRevision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7208,13 +7208,13 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetGlobalDefaultBranchRequest) Size() (n int) { +func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Branch) + l = len(m.Revision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -7224,7 +7224,7 @@ func (m *SetGlobalDefaultBranchRequest) Size() (n int) { return n } -func (m *SetRepoDefaultBranchRequest) Size() (n int) { +func (m *SetRepoDefaultRevisionRequest) Size() (n int) { if m == nil { return 0 } @@ -7233,7 +7233,7 @@ func (m *SetRepoDefaultBranchRequest) Size() (n int) { if m.Index != 0 { n += 1 + sovO2Control(uint64(m.Index)) } - l = len(m.Branch) + l = len(m.Revision) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -12609,7 +12609,7 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { m.Default = bool(v != 0) case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12637,11 +12637,11 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultRevision", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -12658,7 +12658,7 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { break } } - m.IsGlobalDefaultBranch = bool(v != 0) + m.IsGlobalDefaultRevision = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12835,7 +12835,7 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12863,7 +12863,7 @@ func (m *AddRepoRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.DefaultBranch = string(dAtA[iNdEx:postIndex]) + m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -12921,7 +12921,7 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultBranch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -12949,7 +12949,7 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.NewDefaultBranch = string(dAtA[iNdEx:postIndex]) + m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -13281,7 +13281,7 @@ func (m *SetDefaultRepoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { +func (m *SetGlobalDefaultRevisionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13304,15 +13304,15 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -13340,7 +13340,7 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Branch = string(dAtA[iNdEx:postIndex]) + m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -13367,7 +13367,7 @@ func (m *SetGlobalDefaultBranchRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { +func (m *SetRepoDefaultRevisionRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -13390,10 +13390,10 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetRepoDefaultBranchRequest: wiretype end group for non-group") + return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultBranchRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -13417,7 +13417,7 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { } case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Branch", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -13445,7 +13445,7 @@ func (m *SetRepoDefaultBranchRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Branch = string(dAtA[iNdEx:postIndex]) + m.Revision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 392402f69..923c1cb7a 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -61,8 +61,8 @@ service Control { rpc RemoveRepo(RemoveRepoRequest) returns (RemoveRepoReply) {} rpc RefreshRepos(RefreshReposRequest) returns (Empty) {} rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} - rpc SetGlobalDefaultBranch(SetGlobalDefaultBranchRequest) returns (Empty) {} - rpc SetRepoDefaultBranch(SetRepoDefaultBranchRequest) returns (Empty) {} + rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} + rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (Empty) {} } //////////////////////////////////////// @@ -304,8 +304,8 @@ message ListReposRequest {} message RepoInfo { string name = 1; bool default = 2; - string defaultBranch = 3; - bool isGlobalDefaultBranch = 4; + string defaultRevision = 3; + bool isGlobalDefaultRevision = 4; } message ListReposReply { @@ -314,11 +314,11 @@ message ListReposReply { message AddRepoRequest { string name = 1; - string defaultBranch = 2; + string defaultRevision = 2; } message AddRepoReply { - string newDefaultBranch = 1; + string newDefaultRevision = 1; } message RemoveRepoRequest { @@ -337,13 +337,13 @@ message SetDefaultRepoRequest { int32 index = 1; } -message SetGlobalDefaultBranchRequest { - string branch = 1; +message SetGlobalDefaultRevisionRequest { + string revision = 1; } -message SetRepoDefaultBranchRequest { +message SetRepoDefaultRevisionRequest { int32 index = 1; - string branch = 2; + string revision = 2; } message Empty { diff --git a/core/repos/repo.go b/core/repos/repo.go index 401bb4f3a..06f06fc35 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -39,27 +39,27 @@ type Repo struct { User string RepoName string Revision string - DefaultBranch string + DefaultRevision string Hash string Default bool } -func NewRepo(repoPath string, defaultBranch string) (*Repo, error) { +func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { revSlice := strings.Split(repoPath, "@") var repoUrlSlice []string var revision string - //TODO: Decide between global and per-repo default branch - //defaultBranch := viper.GetString("globalDefaultBranch") + //TODO: Decide between global and per-repo default revision + //defaultRevision := viper.GetString("globalDefaultRevision") if len(revSlice) == 2 { //revision specified repoUrlSlice = strings.Split(revSlice[0], "/") revision = revSlice[1] } else if len(revSlice) == 1 { //no revision specified repoUrlSlice = strings.Split(revSlice[0], "/") - revision = defaultBranch + revision = defaultRevision } else { return &Repo{}, errors.New("Repo path resolution failed") } @@ -69,7 +69,7 @@ func NewRepo(repoPath string, defaultBranch string) (*Repo, error) { } newRepo := Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, defaultBranch, "", false} + repoUrlSlice[2], revision, defaultRevision, "", false} return &newRepo, nil } @@ -187,7 +187,7 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } - err = r.checkoutRevision(r.DefaultBranch) + err = r.checkoutRevision(r.DefaultRevision) if err != nil { return err } @@ -284,16 +284,16 @@ func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]str return revisions, nil } -func (r* Repo) updateDefaultBranch(branch string) error { +func (r* Repo) updateDefaultRevision(revision string) error { var refs []string refs = append(refs, refRemotePrefix) // Only search for branches, not tags - revisionsMatched, err := r.getRevisions(branch, refs) + revisionsMatched, err := r.getRevisions(revision, refs) if err != nil{ return err } else if len(revisionsMatched) == 0 { return errors.New("branch not found") } - r.DefaultBranch = branch + r.DefaultRevision = revision return nil } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index ff928d72e..ddbb78598 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -65,7 +65,7 @@ func Instance(service *confsys.Service) *RepoManager { type RepoManager struct { repoList map[string]*Repo defaultRepo *Repo - defaultBranch string + defaultRevision string mutex sync.Mutex cService *confsys.Service } @@ -75,11 +75,11 @@ func initializeRepos(service *confsys.Service) *RepoManager { rm.cService = service var err error - // Get default branch - rm.defaultBranch, err = rm.cService.GetDefaultBranch() + // Get default revision + rm.defaultRevision, err = rm.cService.GetDefaultRevision() if err != nil { - log.Warning("Failed to parse default_branch from backend") - rm.defaultBranch = viper.GetString("defaultBranch") + log.Warning("Failed to parse default_revision from backend") + rm.defaultRevision = viper.GetString("globalDefaultRevision") } // Get default repo @@ -90,7 +90,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } // Add default repo - _, err = rm.AddRepo(defaultRepo, rm.defaultBranch) + _, err = rm.AddRepo(defaultRepo, rm.defaultRevision) if err != nil { log.Fatal("Could not open default repo: ", err) } @@ -103,7 +103,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } for _, repo := range discoveredRepos { - _, err = rm.AddRepo(repo, rm.defaultBranch) + _, err = rm.AddRepo(repo, rm.defaultRevision) if err != nil && err.Error() != "Repo already present" { //Skip error for default repo log.Warning("Failed to add persistent repo: ", repo, " | ", err) } @@ -143,7 +143,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ return } -func (manager *RepoManager) checkDefaultBranch(repo *Repo) error { +func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { _, err := git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ URL: repo.getUrl(), ReferenceName: plumbing.NewBranchReferenceName("master"), //Check out master so we have a working copy @@ -153,57 +153,57 @@ func (manager *RepoManager) checkDefaultBranch(repo *Repo) error { return err } - // Decide if revision = defaultBranch -> if yes lock them together + // Decide if revision = defaultRevision -> if yes lock them together revIsDefault := false - if repo.DefaultBranch == repo.Revision { + if repo.DefaultRevision == repo.Revision { revIsDefault = true } - // Check that the defaultBranch is valid + // Check that the defaultRevision is valid var prefixes []string - prefixes = append(prefixes, refRemotePrefix) + prefixes = append(prefixes, refRemotePrefix, refTagPrefix) var matchedRevs []string - matchedRevs, err = repo.getRevisions(repo.DefaultBranch, prefixes) + matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) if err != nil { return err } else if len(matchedRevs) == 0 { - log.Warning("Default branch " + repo.DefaultBranch + " invalid for " + repo.GetIdentifier()) - if repo.DefaultBranch != manager.defaultBranch { - log.Warning("Defaulting to global default branch: " + manager.defaultBranch) - repo.DefaultBranch = manager.defaultBranch - matchedRevs, err = repo.getRevisions(repo.DefaultBranch, prefixes) + log.Warning("Default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) + if repo.DefaultRevision != manager.defaultRevision { + log.Warning("Defaulting to global default revision: " + manager.defaultRevision) + repo.DefaultRevision = manager.defaultRevision + matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) if err != nil { return err } else if len(matchedRevs) == 0 { - log.Warning("Global default branch " + repo.DefaultBranch + " invalid for " + repo.GetIdentifier()) + log.Warning("Global default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) } else { if revIsDefault { - repo.Revision = repo.DefaultBranch + repo.Revision = repo.DefaultRevision } return nil } } log.Warning("Defaulting to master") - repo.DefaultBranch = "master" + repo.DefaultRevision = "master" } if revIsDefault { - repo.Revision = repo.DefaultBranch + repo.Revision = repo.DefaultRevision } return nil } -func (manager *RepoManager) AddRepo(repoPath string, defaultBranch string) (string, error) { +func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (string, error) { manager.mutex.Lock() defer manager.mutex.Unlock() utils.EnsureTrailingSlash(&repoPath) - if defaultBranch == "" { - defaultBranch = manager.defaultBranch + if defaultRevision == "" { + defaultRevision = manager.defaultRevision } - repo, err := NewRepo(repoPath, defaultBranch) + repo, err := NewRepo(repoPath, defaultRevision) if err != nil { return "", err @@ -212,7 +212,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultBranch string) (stri _, exists := manager.repoList[repo.GetIdentifier()] if !exists { //Try to clone it - err = manager.checkDefaultBranch(repo) + err = manager.checkDefaultRevision(repo) if err != nil { return "", err } @@ -248,7 +248,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultBranch string) (stri return "", errors.New("Repo already present") } - return repo.DefaultBranch, nil + return repo.DefaultRevision, nil } func cleanCloneParentDirs(parentDirs []string) error { @@ -470,29 +470,29 @@ func (manager *RepoManager) UpdateDefaultRepo(repoPath string) error { //unused return nil } -func (manager *RepoManager) SetGlobalDefaultBranch(branch string) error { +func (manager *RepoManager) SetGlobalDefaultRevision(revision string) error { - // Update default_branch backend - err := manager.cService.NewDefaultBranch(branch) + // Update default_revision backend + err := manager.cService.NewDefaultRevision(revision) if err != nil { - log.Warning("Failed to update default_branch backend: ", err) + log.Warning("Failed to update default_revision backend: ", err) return err } - viper.Set("globalDefaultBranch", branch) //TODO: Do I need this? - manager.defaultBranch = branch + viper.Set("globalDefaultRevision", revision) //TODO: Do I need this? + manager.defaultRevision = revision return nil } -func (manager *RepoManager) UpdateDefaultBranchByIndex(index int, branch string) error { +func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision string) error { orderedRepoList := manager.GetOrderedRepolistKeys() if index >= len(orderedRepoList) { return errors.New("repository index out of range") } repo := manager.repoList[orderedRepoList[index]] - err := repo.updateDefaultBranch(branch) + err := repo.updateDefaultRevision(revision) if err != nil { - return errors.New("Could not update default branch for " + repo.GetIdentifier() + " : " + err.Error()) + return errors.New("Could not update default revision for " + repo.GetIdentifier() + " : " + err.Error()) } return nil } @@ -501,7 +501,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er reposRequired := make(map[Repo]bool) for _, taskClass := range taskClassesRequired { var newRepo *Repo - newRepo, err = NewRepo(taskClass, manager.defaultBranch) + newRepo, err = NewRepo(taskClass, manager.defaultRevision) if err != nil { return } @@ -512,7 +512,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er for repo := range reposRequired { existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { - _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultBranch) + _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultRevision) if err != nil { return } @@ -559,7 +559,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat if revisionPattern != "" { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") } - }/*else if revisionPattern == "" { // default branch if unspecified + }/*else if revisionPattern == "" { // default revision if unspecified revisionPattern = "" }*/ @@ -592,8 +592,8 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat for _, repo := range repos { // For every repo get the templates for the revisions matching the revisionPattern; gitRefs to filter tags and/or branches - if revisionPattern == "" { // If the revision pattern is empty, use the default branch - revisionPattern = repo.DefaultBranch + if revisionPattern == "" { // If the revision pattern is empty, use the default revision + revisionPattern = repo.DefaultRevision } templates, err := repo.getWorkflows(revisionPattern, gitRefs) if err != nil { @@ -610,6 +610,6 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat return templateList, numTemplates, nil } -func (manager *RepoManager) GetDefaultBranch() string { - return manager.defaultBranch +func (manager *RepoManager) GetDefaultRevision() string { + return manager.defaultRevision } diff --git a/core/server.go b/core/server.go index dbe4d277b..5ef1a9d45 100644 --- a/core/server.go +++ b/core/server.go @@ -524,8 +524,8 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p for i, repoName := range keys { repo := repoList[repoName] - isGlobalDefaultBranch := repo.DefaultBranch == viper.GetString("globalDefaultBranch") - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultBranch: repo.DefaultBranch, IsGlobalDefaultBranch: isGlobalDefaultBranch} + isGlobalDefaultRevision := repo.DefaultRevision == viper.GetString("globalDefaultRevision") + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision, IsGlobalDefaultRevision: isGlobalDefaultRevision} } return &pb.ListReposReply{Repos: repoInfos}, nil @@ -538,12 +538,12 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - newDefaultBranch, err := the.RepoManager().AddRepo(req.Name, req.DefaultBranch) + newDefaultRevision, err := the.RepoManager().AddRepo(req.Name, req.DefaultRevision) if err != nil { return nil, err } - return &pb.AddRepoReply{NewDefaultBranch: newDefaultBranch}, nil + return &pb.AddRepoReply{NewDefaultRevision: newDefaultRevision}, nil } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { @@ -597,14 +597,14 @@ func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRe return &pb.Empty{}, nil } -func (m *RpcServer) SetGlobalDefaultBranch(cxt context.Context, req *pb.SetGlobalDefaultBranchRequest) (*pb.Empty, error) { +func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlobalDefaultRevisionRequest) (*pb.Empty, error) { m.logMethod() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - err := the.RepoManager().SetGlobalDefaultBranch(req.Branch) + err := the.RepoManager().SetGlobalDefaultRevision(req.Revision) if err != nil { return nil, err } @@ -612,14 +612,14 @@ func (m *RpcServer) SetGlobalDefaultBranch(cxt context.Context, req *pb.SetGloba return &pb.Empty{}, nil } -func (m *RpcServer) SetRepoDefaultBranch(cxt context.Context, req *pb.SetRepoDefaultBranchRequest) (*pb.Empty, error) { +func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoDefaultRevisionRequest) (*pb.Empty, error) { m.logMethod() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - err := the.RepoManager().UpdateDefaultBranchByIndex(int(req.Index), req.Branch) + err := the.RepoManager().UpdateDefaultRevisionByIndex(int(req.Index), req.Revision) if err != nil { return nil, err } diff --git a/core/task/manager.go b/core/task/manager.go index ae17fd744..a1975114b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -119,7 +119,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" var repo *repos.Repo - repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks/")[0], repoManager.GetDefaultBranch()) + repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks/")[0], repoManager.GetDefaultRevision()) if err != nil { return } From aee9ac26587a9745e38deec13359cbbdb6444639 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 4 Feb 2020 16:35:41 +0100 Subject: [PATCH 0083/2352] [core]s/branch/revision/g round 2 --- core/repos/repo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 06f06fc35..49394ccc1 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -286,12 +286,12 @@ func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]str func (r* Repo) updateDefaultRevision(revision string) error { var refs []string - refs = append(refs, refRemotePrefix) // Only search for branches, not tags + refs = append(refs, refRemotePrefix, refTagPrefix) revisionsMatched, err := r.getRevisions(revision, refs) if err != nil{ return err } else if len(revisionsMatched) == 0 { - return errors.New("branch not found") + return errors.New("revision not found") } r.DefaultRevision = revision From 07446bb75dbb40e1e71f447fe44e1cc7671736cb Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 6 Feb 2020 14:58:11 +0100 Subject: [PATCH 0084/2352] [coconut] Some improvements --- coconut/cmd/repo_default_revision.go | 2 +- coconut/control/control.go | 20 +- coconut/protos/o2control.pb.go | 401 ++++++++++++++------------- core/protos/o2control.pb.go | 401 ++++++++++++++------------- core/protos/o2control.proto | 2 +- core/repos/repo.go | 8 +- core/repos/repomanager.go | 14 +- core/server.go | 5 +- 8 files changed, 438 insertions(+), 415 deletions(-) diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index ea11cb761..fd027b882 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -31,7 +31,7 @@ import ( "github.com/spf13/cobra" ) -// repoRemoveCmd represents the repository remove command +// repoDefaultRevision sets global and per-repo default revision var repoDefaultRevisionCmd = &cobra.Command{ Use: "default-revision", Short: "set default global and per-repository revision", diff --git a/coconut/control/control.go b/coconut/control/control.go index 5380a5466..6ce562cee 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -622,24 +622,30 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "No repositories found.") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "repository", "default", "default revision", "global default"}) + table.SetHeader([]string{"id", "repository", "default", "default revision"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlueColor} - table.SetHeaderColor(fg, fg, fg, fg, fg) + table.SetHeaderColor(fg, fg, fg, fg) + + globalDefaultRevision := response.GetGlobalDefaultRevision() for i, root := range roots { defaultTick := "" - defaultRevisionTick := "" + if root.GetDefault() { defaultTick = blue("YES") } - if root.GetIsGlobalDefaultRevision() { - defaultRevisionTick = blue("YES") + var defaultRevision string + if root.GetDefaultRevision() == globalDefaultRevision { + defaultRevision = red(globalDefaultRevision) + } else { + defaultRevision = root.GetDefaultRevision() } - table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick, root.GetDefaultRevision(), defaultRevisionTick}) + table.Append([]string{strconv.Itoa(i), root.GetName(), defaultTick, defaultRevision}) } fmt.Fprintf(o, "Git repositories used as configuration sources:\n\n") table.Render() + fmt.Fprintf(o, "\nGlobal default revision: %s\n", red(globalDefaultRevision)) } return nil @@ -668,7 +674,7 @@ func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar } fmt.Fprintln(o, "Repository succesfully added.") - if response.GetNewDefaultRevision() != defaultRevision { + if defaultRevision != "" && response.GetNewDefaultRevision() != defaultRevision { fmt.Fprintln(o, "Default revision specified not present in repository;") //TODO: It's not clear here if it's the global default or master fmt.Fprintln(o, "Fallback to default revision:", blue(response.GetNewDefaultRevision())) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 54f860ec2..e0a339ada 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2634,13 +2634,12 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - IsGlobalDefaultRevision bool `protobuf:"varint,4,opt,name=isGlobalDefaultRevision,proto3" json:"isGlobalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2697,18 +2696,12 @@ func (m *RepoInfo) GetDefaultRevision() string { return "" } -func (m *RepoInfo) GetIsGlobalDefaultRevision() bool { - if m != nil { - return m.IsGlobalDefaultRevision - } - return false -} - type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ListReposReply) Reset() { *m = ListReposReply{} } @@ -2751,6 +2744,13 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { return nil } +func (m *ListReposReply) GetGlobalDefaultRevision() string { + if m != nil { + return m.GlobalDefaultRevision + } + return "" +} + type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` @@ -3244,151 +3244,151 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2298 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcf, 0x73, 0x1b, 0x49, - 0xf5, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0x36, 0xeb, 0x78, 0xfb, - 0xbb, 0x95, 0x75, 0xb2, 0xfb, 0x75, 0xc0, 0x4b, 0x41, 0x08, 0xbb, 0x1b, 0xfc, 0x43, 0x71, 0x0c, - 0xb1, 0x15, 0x46, 0x4a, 0x52, 0xa4, 0x8a, 0x0a, 0x63, 0x4d, 0xcb, 0xd2, 0x7a, 0x34, 0x2d, 0x66, - 0x5a, 0x4e, 0x7c, 0xe0, 0xc6, 0x8d, 0xa2, 0x38, 0x70, 0xe1, 0xc0, 0x85, 0xa2, 0x38, 0x70, 0xe0, - 0xff, 0xe0, 0x42, 0x01, 0xff, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x47, 0x50, 0xfd, 0x63, 0x66, 0x7a, - 0x46, 0x33, 0x8a, 0xab, 0xb8, 0xe9, 0xbd, 0x7e, 0xef, 0x4d, 0xbf, 0xf7, 0x79, 0xfd, 0xde, 0xeb, - 0x16, 0xac, 0x8d, 0x7d, 0xca, 0x68, 0x70, 0x9f, 0xee, 0xf6, 0xa8, 0xc7, 0x7c, 0xea, 0xee, 0x08, - 0x06, 0xaa, 0x46, 0x0c, 0xbc, 0x06, 0xab, 0xad, 0x4b, 0xe2, 0xb1, 0xd7, 0x27, 0x24, 0xa0, 0xc1, - 0x13, 0x62, 0xfb, 0xec, 0x8c, 0xd8, 0x0c, 0x2f, 0xc1, 0x62, 0x87, 0xd9, 0x6c, 0x12, 0x58, 0xe4, - 0x67, 0x13, 0x12, 0x30, 0x7c, 0x06, 0xb5, 0x90, 0x31, 0x76, 0xaf, 0xd0, 0x2a, 0x94, 0x02, 0x66, - 0x33, 0x62, 0x1a, 0x5b, 0xc6, 0x76, 0xd5, 0x92, 0x04, 0xfa, 0x12, 0x16, 0x03, 0x21, 0xf4, 0x7c, - 0xec, 0xd8, 0x8c, 0x04, 0x66, 0x61, 0x6b, 0x7e, 0xbb, 0xb6, 0xbb, 0xbe, 0x13, 0xef, 0xa0, 0xa3, - 0xad, 0x5b, 0x49, 0x69, 0xfc, 0x57, 0x03, 0x16, 0xf4, 0x75, 0xf4, 0x39, 0x94, 0x5c, 0x72, 0x49, - 0x5c, 0xf1, 0x95, 0xfa, 0xee, 0x87, 0x39, 0x76, 0x76, 0x9e, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x63, - 0xa8, 0x8f, 0x12, 0xce, 0x98, 0x85, 0x2d, 0x63, 0xbb, 0xb6, 0x7b, 0x5b, 0xd3, 0xce, 0xf2, 0xf9, - 0xc9, 0x9c, 0x95, 0x52, 0xc4, 0xdf, 0x82, 0x92, 0x30, 0x8d, 0xaa, 0x50, 0x3a, 0x6c, 0xed, 0x3f, - 0x3f, 0x6a, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4f, 0x1f, 0xb7, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xe5, - 0x9e, 0x75, 0x7a, 0x7c, 0x7a, 0xd4, 0x28, 0x70, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x7e, - 0x19, 0x4a, 0xc2, 0x3e, 0xde, 0x80, 0xf5, 0x23, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, - 0xc5, 0xb1, 0xd7, 0xa7, 0x61, 0x38, 0xff, 0x60, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, - 0x2c, 0x47, 0xf6, 0xd7, 0xd4, 0x17, 0x5e, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xd8, - 0x3d, 0xe7, 0x72, 0x82, 0x73, 0xc7, 0x36, 0xeb, 0x0d, 0xcc, 0x79, 0xc9, 0x15, 0x04, 0xe7, 0x9e, - 0x4d, 0x86, 0xae, 0x63, 0x16, 0x25, 0x1a, 0x82, 0x40, 0x5b, 0x50, 0x1b, 0xfb, 0xd4, 0x99, 0xf4, - 0xd8, 0xa9, 0x3d, 0x22, 0x66, 0x49, 0xac, 0xe9, 0x2c, 0xb4, 0x09, 0x70, 0x29, 0x37, 0xd1, 0x61, - 0xbe, 0x79, 0x43, 0x08, 0x68, 0x1c, 0xfc, 0xeb, 0x02, 0xdc, 0x9c, 0xf6, 0x80, 0xe3, 0xbf, 0x05, - 0xb5, 0x7e, 0xc4, 0x75, 0x54, 0x16, 0xe8, 0x2c, 0xf4, 0x19, 0x2c, 0x13, 0xef, 0x72, 0xe8, 0x53, - 0x6f, 0x44, 0x3c, 0x16, 0x1c, 0xd0, 0x89, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0x7c, 0x27, 0xcc, 0x0e, - 0x2e, 0x94, 0x98, 0x74, 0x4e, 0xe3, 0xc4, 0xf9, 0x56, 0xd4, 0xf3, 0x6d, 0x13, 0x60, 0x40, 0x83, - 0xd0, 0x78, 0x49, 0x6a, 0xc5, 0x1c, 0x84, 0x61, 0x61, 0xe8, 0x05, 0xcc, 0xf6, 0x7a, 0x44, 0x84, - 0x40, 0x7a, 0x98, 0xe0, 0xa1, 0xcf, 0xa0, 0xac, 0x3c, 0x36, 0xcb, 0x22, 0x4f, 0x90, 0x96, 0x27, - 0x0a, 0x22, 0x2b, 0x14, 0xc1, 0x77, 0x61, 0xa9, 0x4b, 0x6c, 0xdf, 0xa1, 0x6f, 0x3c, 0x05, 0x25, - 0x5a, 0x83, 0x1b, 0x3e, 0xb1, 0x03, 0xea, 0xa9, 0x28, 0x28, 0x8a, 0x1f, 0xa1, 0x58, 0x74, 0xec, - 0x5e, 0x61, 0x13, 0xd6, 0x8e, 0x08, 0x6b, 0x69, 0xbe, 0x87, 0xd9, 0xf0, 0x16, 0x56, 0xa7, 0x56, - 0xae, 0x17, 0xe5, 0xaf, 0x60, 0x41, 0x0f, 0xa6, 0x3a, 0x70, 0x4d, 0x3d, 0xd5, 0xe3, 0x65, 0x01, - 0x5f, 0x42, 0x1e, 0xff, 0xc3, 0x80, 0xa5, 0x94, 0x04, 0xaa, 0x43, 0x61, 0x18, 0x7e, 0xac, 0x30, - 0x14, 0x79, 0xd4, 0xf3, 0x89, 0xcd, 0x88, 0xf3, 0x72, 0x40, 0x3c, 0x81, 0x61, 0xd5, 0xd2, 0x59, - 0x31, 0x3a, 0xf3, 0x3a, 0x3a, 0x3b, 0x50, 0x12, 0x08, 0x9a, 0x45, 0xb1, 0x29, 0x53, 0x3f, 0xbd, - 0x03, 0xea, 0xb3, 0xae, 0x1d, 0xc8, 0x8c, 0x92, 0x62, 0xa8, 0x09, 0x15, 0x9f, 0x52, 0x66, 0x51, - 0x37, 0x4c, 0xd6, 0x88, 0x46, 0xf7, 0xa0, 0xd1, 0x9b, 0xf8, 0x3e, 0xf1, 0x98, 0x35, 0xf1, 0x4e, - 0x27, 0xa3, 0x33, 0x22, 0xf3, 0x75, 0xd1, 0x9a, 0xe2, 0xe3, 0x03, 0xb8, 0x79, 0x4a, 0xde, 0x68, - 0x5e, 0x85, 0x48, 0xdd, 0x83, 0x06, 0x0f, 0x5b, 0xdf, 0xa5, 0x6f, 0xba, 0x64, 0x34, 0x76, 0xe3, - 0xfa, 0x35, 0xc5, 0xc7, 0x1d, 0x58, 0x49, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x35, 0x2d, 0x7e, 0x42, - 0x7b, 0x76, 0xb8, 0x75, 0x71, 0xfc, 0x89, 0x38, 0x4e, 0x19, 0x3b, 0x4b, 0x85, 0x1c, 0xff, 0xc2, - 0x80, 0x95, 0xb4, 0xe4, 0xff, 0xfc, 0x79, 0x74, 0x1f, 0x2a, 0xa1, 0x9f, 0xaa, 0x26, 0xae, 0x68, - 0xaa, 0x3c, 0xce, 0x42, 0x27, 0x12, 0xc2, 0x7f, 0x33, 0x60, 0xe3, 0x40, 0x2e, 0xbf, 0x7f, 0xd3, - 0xe8, 0x11, 0x14, 0xd9, 0xd5, 0x98, 0x08, 0xd3, 0xf5, 0xdd, 0x4f, 0x35, 0xd3, 0xb9, 0x36, 0x76, - 0xda, 0x63, 0xae, 0x62, 0x09, 0x45, 0x6c, 0xc3, 0x0d, 0x49, 0xf3, 0x22, 0x7b, 0xda, 0x6e, 0x3f, - 0x6b, 0xcc, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0xcf, 0xea, 0xbe, 0xde, 0x3b, 0xe8, 0x1e, 0xbf, 0x38, - 0xee, 0xfe, 0xb8, 0x61, 0xa0, 0x65, 0x58, 0xec, 0x74, 0xdb, 0xcf, 0x62, 0x56, 0x01, 0x2d, 0x42, - 0xf5, 0xa0, 0x7d, 0xfa, 0xf8, 0xf8, 0xe8, 0xb9, 0xd5, 0x6a, 0xcc, 0xf3, 0x6a, 0x6c, 0xb5, 0x3a, - 0xad, 0x6e, 0xa3, 0x88, 0x16, 0xa0, 0x72, 0xd4, 0x7e, 0x2d, 0x6b, 0x73, 0x09, 0x5f, 0xc0, 0x7a, - 0xd6, 0x66, 0x78, 0x6c, 0xd3, 0xee, 0x44, 0x49, 0x5d, 0xd0, 0x93, 0x3a, 0x2b, 0x11, 0xe7, 0x73, - 0x12, 0xf1, 0x37, 0x06, 0x98, 0x27, 0xd4, 0x19, 0xf6, 0xaf, 0xae, 0x15, 0x3d, 0xa0, 0x63, 0xe2, - 0xdb, 0x6c, 0x48, 0xbd, 0xf0, 0x1c, 0xdf, 0xce, 0x46, 0xb6, 0x1d, 0xca, 0x59, 0x9a, 0x0a, 0xba, - 0x03, 0x75, 0x9f, 0xf4, 0xa8, 0xd7, 0x1f, 0x9e, 0x4f, 0x7c, 0xb2, 0xe7, 0xba, 0x62, 0x5f, 0x15, - 0x2b, 0xc5, 0xc5, 0xbf, 0x37, 0x60, 0x35, 0xcb, 0x18, 0x7a, 0xa8, 0xf0, 0x93, 0xcd, 0xf6, 0xce, - 0x7b, 0xbe, 0x9d, 0x80, 0x4e, 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x42, 0x78, 0x76, 0x25, 0x8d, 0xbf, - 0x99, 0x01, 0xeb, 0x12, 0xd4, 0xac, 0xd6, 0x49, 0xfb, 0x45, 0xeb, 0xb5, 0xd5, 0x7e, 0xca, 0x11, - 0x5b, 0x80, 0xca, 0xde, 0xe1, 0xa1, 0xa4, 0x8a, 0xf8, 0x97, 0x06, 0xac, 0x65, 0x44, 0x8e, 0xc3, - 0xf4, 0x43, 0x68, 0xf4, 0xed, 0xa1, 0x4b, 0x9c, 0x76, 0x1c, 0x2d, 0xe3, 0x7a, 0xd1, 0x9a, 0x52, - 0x54, 0x20, 0x14, 0xa6, 0x31, 0xd7, 0x0b, 0x19, 0x3e, 0x86, 0x8d, 0x43, 0x12, 0x30, 0x9f, 0x5e, - 0x07, 0xc7, 0x5b, 0x50, 0xbd, 0x20, 0x64, 0xdc, 0x15, 0x95, 0xaf, 0x20, 0x10, 0x88, 0x19, 0x98, - 0xc0, 0x7a, 0x96, 0x29, 0xee, 0xd8, 0x0f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x48, 0x51, 0xc1, - 0x54, 0x27, 0xfc, 0x96, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, - 0x1a, 0x8b, 0x10, 0x14, 0x3d, 0x0e, 0x8e, 0xdc, 0xa8, 0xf8, 0xcd, 0x3b, 0x97, 0x4b, 0x7b, 0x17, - 0xc4, 0x51, 0xfb, 0x54, 0x14, 0xe7, 0xf3, 0x8a, 0x7c, 0xec, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, - 0xc0, 0xa6, 0xba, 0xb0, 0xa2, 0xe2, 0xa8, 0x95, 0xf4, 0x93, 0x72, 0x0b, 0xaa, 0x3d, 0xd7, 0x0e, - 0x02, 0xad, 0xf3, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0x2e, 0xbd, 0x0a, 0x4b, 0x95, 0xea, - 0xbe, 0xfa, 0x8c, 0xc7, 0x37, 0x7f, 0x98, 0x10, 0xb2, 0x52, 0x4a, 0xbc, 0x50, 0xa2, 0x69, 0x31, - 0x9e, 0x8e, 0x7c, 0x0c, 0xd0, 0x3c, 0x8e, 0x68, 0x64, 0x42, 0xd9, 0x3e, 0xe7, 0x82, 0x21, 0xf0, - 0x21, 0xc9, 0x57, 0x68, 0xbf, 0x4f, 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x83, 0x06, 0x79, 0x4b, 0x7a, - 0x13, 0x46, 0xf9, 0xa2, 0xf4, 0x5e, 0xe3, 0xe0, 0x65, 0x58, 0x3a, 0x22, 0x4c, 0x01, 0x20, 0x7b, - 0xfa, 0x23, 0x58, 0x8c, 0x59, 0x1c, 0xdf, 0xa8, 0x1d, 0x1a, 0xd7, 0x6a, 0x87, 0x78, 0x1b, 0xea, - 0xca, 0x80, 0x36, 0x69, 0x28, 0x5c, 0x0c, 0x1d, 0x17, 0xfc, 0x1d, 0x58, 0x88, 0x24, 0xf9, 0x97, - 0x3e, 0x81, 0x22, 0x5f, 0x51, 0xc9, 0xb3, 0x92, 0x8a, 0xa8, 0xf8, 0x86, 0x10, 0xc0, 0x2d, 0x58, - 0xe4, 0x9c, 0x03, 0x8e, 0x4a, 0x6e, 0x96, 0xf0, 0xf6, 0x2f, 0xd5, 0x4f, 0xa8, 0x43, 0xa2, 0xf6, - 0x1f, 0xb3, 0xf0, 0xcf, 0xa1, 0x76, 0x40, 0x47, 0x23, 0xdb, 0x73, 0x84, 0x91, 0x06, 0xcc, 0x13, - 0xef, 0x52, 0xb8, 0x59, 0xb5, 0xf8, 0x4f, 0x91, 0x20, 0x03, 0xe2, 0xba, 0x2a, 0xcf, 0x24, 0xc1, - 0xb9, 0x97, 0xb6, 0x3b, 0x89, 0x0e, 0x9b, 0x20, 0x78, 0xda, 0xd8, 0xfe, 0xf9, 0x44, 0x8e, 0x33, - 0x45, 0x61, 0x23, 0x66, 0xf0, 0x0d, 0x4e, 0x02, 0xe2, 0xab, 0x4c, 0x13, 0xbf, 0xf1, 0x09, 0xd4, - 0x0e, 0x06, 0xb6, 0xe7, 0x11, 0x37, 0xd7, 0x07, 0xa4, 0xb5, 0xa6, 0xaa, 0x2a, 0x59, 0x22, 0x9a, - 0xfe, 0x39, 0x61, 0x71, 0x96, 0x73, 0x0a, 0xff, 0xa7, 0x00, 0x95, 0xe8, 0xd8, 0x7c, 0x1b, 0xaa, - 0x01, 0x07, 0x47, 0x64, 0xa8, 0x8c, 0x67, 0x3e, 0x70, 0xb1, 0x28, 0xd7, 0xeb, 0x85, 0x51, 0x55, - 0xbd, 0xd6, 0x4c, 0xe1, 0x10, 0x45, 0xdd, 0x8a, 0x45, 0xd1, 0xf7, 0x61, 0x69, 0xe8, 0x9d, 0xd1, - 0x89, 0xe7, 0x28, 0x97, 0x02, 0x73, 0x5e, 0xa4, 0xcb, 0x9a, 0x5e, 0x02, 0x62, 0x6f, 0xad, 0xb4, - 0x38, 0xda, 0x87, 0x06, 0x9d, 0xb0, 0xa4, 0x89, 0xe2, 0x4c, 0x13, 0x53, 0xf2, 0xe8, 0x01, 0x87, - 0x3c, 0x02, 0x54, 0x04, 0x3b, 0xa5, 0x1e, 0xaf, 0x5a, 0xba, 0x28, 0x3f, 0x78, 0x3c, 0xb3, 0x9e, - 0xd9, 0x6c, 0xa0, 0xce, 0x7c, 0x44, 0x73, 0xbc, 0x89, 0x77, 0x79, 0xec, 0x88, 0x93, 0x5e, 0xb5, - 0x24, 0x81, 0xef, 0xc3, 0x4a, 0xb2, 0xa4, 0xc9, 0x5c, 0x37, 0xa1, 0x2c, 0xb3, 0x3b, 0x50, 0x89, - 0x14, 0x92, 0xf8, 0x57, 0x06, 0x2c, 0x4f, 0x15, 0x41, 0xf4, 0x10, 0x6a, 0x17, 0x43, 0xd7, 0x25, - 0x4e, 0xf7, 0x5a, 0x67, 0x4c, 0x17, 0x46, 0x5f, 0xc0, 0x82, 0x3f, 0xf1, 0xbc, 0xa1, 0x77, 0x1e, - 0x56, 0xed, 0xd9, 0xca, 0x09, 0x69, 0x7c, 0x20, 0xce, 0x3e, 0x9f, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, - 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x63, 0x9b, 0x0d, 0x3a, 0x63, 0xd2, 0x0b, 0x7b, 0x64, 0x48, 0xe3, - 0x3f, 0x1b, 0x50, 0x09, 0x07, 0xb0, 0xbc, 0x5a, 0xad, 0x6a, 0x6f, 0x21, 0xbb, 0xf6, 0x26, 0x46, - 0xef, 0x26, 0x54, 0xfa, 0x13, 0xd7, 0x15, 0x30, 0xc8, 0x6a, 0x15, 0xd1, 0x7a, 0x64, 0x4b, 0x89, - 0xc8, 0xa2, 0xbb, 0x50, 0xe2, 0x4d, 0x3b, 0x30, 0x6f, 0x88, 0x00, 0x64, 0x0e, 0x87, 0x52, 0x02, - 0x3f, 0x14, 0xd5, 0x4d, 0x39, 0xcd, 0xe3, 0x1f, 0xe9, 0x1a, 0xef, 0xd5, 0xfd, 0xa3, 0x01, 0x1f, - 0x1c, 0x11, 0xf6, 0x32, 0x35, 0x72, 0x47, 0xd1, 0xdb, 0x82, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, - 0x18, 0xf1, 0xc3, 0x5b, 0x95, 0xce, 0x42, 0xdb, 0xb0, 0xe4, 0x93, 0xcb, 0x21, 0xbf, 0x91, 0x85, - 0x52, 0x32, 0x2a, 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0xbe, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, - 0x44, 0xa4, 0xb3, 0x44, 0x3b, 0x70, 0xdd, 0xae, 0x7d, 0x2e, 0xbb, 0x5a, 0xc5, 0x0a, 0x49, 0x7c, - 0x06, 0xab, 0xe9, 0x3d, 0x86, 0xf0, 0xf0, 0xcd, 0x84, 0xf0, 0xf0, 0xdf, 0x22, 0xef, 0xc3, 0x2b, - 0x85, 0xc2, 0x36, 0xa4, 0xc5, 0x6c, 0xa4, 0xb6, 0xa5, 0x50, 0x8a, 0x68, 0xfc, 0x35, 0x6c, 0x64, - 0x87, 0x82, 0xc7, 0xf4, 0x04, 0x96, 0xd3, 0xf7, 0x92, 0xac, 0x59, 0x27, 0x6b, 0x93, 0xd6, 0xb4, - 0x26, 0x46, 0xd0, 0x78, 0x3a, 0x0c, 0xf8, 0xb4, 0x41, 0xa3, 0x2e, 0xf5, 0x3b, 0x9e, 0x77, 0x64, - 0x4c, 0x73, 0xf3, 0xce, 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0x65, 0xaa, 0x78, 0x87, 0x24, 0x07, - 0x41, 0xfd, 0xb4, 0x92, 0xde, 0xa5, 0xd9, 0xe8, 0x01, 0xac, 0x0f, 0x83, 0x23, 0x97, 0x9e, 0xd9, - 0xee, 0x61, 0x4a, 0x43, 0x86, 0x3c, 0x6f, 0x19, 0x7f, 0x0f, 0xea, 0xda, 0x96, 0xc3, 0x3c, 0xe3, - 0x54, 0x56, 0x9e, 0x29, 0x3f, 0x2c, 0x29, 0x81, 0x4f, 0xa1, 0xbe, 0xe7, 0x38, 0x9c, 0x1b, 0x66, - 0x56, 0x96, 0x83, 0x19, 0x6e, 0x14, 0x32, 0xdd, 0xc0, 0x5f, 0xc1, 0x42, 0x64, 0x4f, 0x36, 0x74, - 0xe4, 0x91, 0x37, 0x69, 0x8f, 0xa4, 0xed, 0x8c, 0x15, 0x7c, 0x17, 0x96, 0x2d, 0x32, 0xa2, 0x97, - 0x44, 0xdf, 0xd2, 0x2a, 0x94, 0x86, 0x9e, 0x43, 0xde, 0x86, 0x8f, 0x3f, 0x82, 0xc0, 0xdf, 0x85, - 0x25, 0x5d, 0x94, 0x7f, 0xed, 0x0e, 0xd4, 0x75, 0x9b, 0x51, 0xfe, 0xa5, 0xb8, 0xf8, 0x53, 0x58, - 0xb1, 0x48, 0xdf, 0x27, 0xc1, 0x40, 0x07, 0x3a, 0xe7, 0x3b, 0xff, 0x0f, 0x37, 0x3b, 0x84, 0x69, - 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0xdb, 0x1d, 0xc2, 0x32, 0xa1, 0x0a, 0x15, 0xf5, 0x64, 0x37, 0x52, - 0xc9, 0xfe, 0x23, 0xf8, 0xb0, 0x43, 0xc4, 0x67, 0x72, 0x94, 0x33, 0xbf, 0x9a, 0x30, 0x59, 0x48, - 0x99, 0x2c, 0x43, 0xa9, 0x35, 0x1a, 0xb3, 0xab, 0xdd, 0x3f, 0x2d, 0x42, 0x59, 0xdd, 0xec, 0xd0, - 0x01, 0xd4, 0xba, 0xbe, 0xdd, 0xbb, 0x90, 0x6f, 0x84, 0xc8, 0x9c, 0x7a, 0x36, 0x54, 0xdf, 0x6b, - 0xae, 0x65, 0xac, 0xf0, 0xf1, 0x79, 0xee, 0x1b, 0x06, 0x7a, 0x05, 0x8d, 0xf4, 0xd3, 0x17, 0xc2, - 0x9a, 0x7c, 0xce, 0xcb, 0x5e, 0x73, 0x6b, 0xa6, 0x8c, 0xb0, 0x8e, 0xf6, 0xa1, 0x12, 0x3e, 0x0d, - 0x21, 0xfd, 0xf6, 0x9e, 0x7a, 0x5a, 0x6a, 0x9a, 0x99, 0x6b, 0xd2, 0xc6, 0x4b, 0xd1, 0x76, 0xf4, - 0x37, 0x23, 0xf4, 0x51, 0xf2, 0xd3, 0x19, 0x2f, 0x4d, 0xcd, 0xdb, 0xb3, 0x44, 0xa4, 0xe1, 0x2e, - 0xd4, 0x93, 0x2f, 0x1f, 0x48, 0x77, 0x29, 0xf3, 0x65, 0xa5, 0xb9, 0x39, 0x43, 0x22, 0xb2, 0x9a, - 0xfc, 0x1e, 0xda, 0xca, 0xdd, 0x4a, 0x96, 0xd5, 0x8c, 0xd7, 0x10, 0x3c, 0x87, 0x7e, 0x0a, 0x68, - 0xfa, 0x3a, 0x8f, 0x3e, 0xbe, 0xce, 0xd3, 0x43, 0x13, 0xbf, 0x47, 0x4a, 0x7e, 0xe1, 0x27, 0xb0, - 0x3c, 0x75, 0x11, 0x45, 0xff, 0xa7, 0xa9, 0xe6, 0x5d, 0xf0, 0x9b, 0x1f, 0xcd, 0x16, 0x8a, 0x1c, - 0x98, 0xbe, 0x0f, 0x26, 0x1c, 0xc8, 0xbd, 0x79, 0x26, 0x1c, 0xc8, 0xb9, 0x54, 0xca, 0x5c, 0x0b, - 0xef, 0x21, 0x89, 0x5c, 0x4b, 0xdd, 0x57, 0x12, 0xb9, 0x96, 0xb8, 0xb8, 0xe0, 0x39, 0xf4, 0x08, - 0xca, 0x8a, 0x85, 0x36, 0xa6, 0xc5, 0x42, 0x0b, 0xeb, 0x59, 0x4b, 0xd2, 0xc0, 0x29, 0x2c, 0xe8, - 0x23, 0x1b, 0xda, 0xcc, 0xbd, 0xd0, 0x4a, 0x53, 0x33, 0x2f, 0xbc, 0x91, 0x53, 0x62, 0xfc, 0x48, - 0x3b, 0xa5, 0x0f, 0x62, 0x69, 0xa7, 0xe2, 0x79, 0x05, 0xcf, 0xa1, 0xbe, 0x78, 0x74, 0x9d, 0x6a, - 0xbd, 0xe8, 0x4e, 0x52, 0x27, 0x6f, 0x4c, 0x69, 0x7e, 0xfc, 0x5e, 0x39, 0xf9, 0x9d, 0x16, 0x54, - 0xa3, 0x1e, 0x86, 0x3e, 0xd0, 0x94, 0xd2, 0xcd, 0xb8, 0xb9, 0x91, 0xbd, 0x18, 0x61, 0xa0, 0xba, - 0x4f, 0x02, 0x83, 0x64, 0x87, 0x4b, 0x60, 0xa0, 0x37, 0x2b, 0x3c, 0x87, 0x9e, 0x00, 0xc4, 0x3d, - 0x05, 0xdd, 0x4a, 0x34, 0xce, 0x54, 0x57, 0x6a, 0x36, 0x73, 0x56, 0xc3, 0xe8, 0x2f, 0xe8, 0x2d, - 0x26, 0x81, 0x66, 0x46, 0xef, 0x69, 0x36, 0xf4, 0x87, 0x19, 0x5e, 0xad, 0xf1, 0x1c, 0x7a, 0x0c, - 0xf5, 0x64, 0xe7, 0x49, 0xd4, 0x83, 0xcc, 0xa6, 0x94, 0x69, 0xe7, 0x15, 0x98, 0x79, 0x2d, 0x09, - 0xdd, 0x4b, 0x5a, 0x9c, 0xd5, 0xb7, 0x32, 0x6d, 0xbf, 0x80, 0xb5, 0xec, 0x7e, 0x85, 0xb6, 0x93, - 0x96, 0xf3, 0x5b, 0x5a, 0x96, 0xdd, 0xfd, 0x07, 0x7f, 0x79, 0xb7, 0x69, 0xfc, 0xfd, 0xdd, 0xa6, - 0xf1, 0xcf, 0x77, 0x9b, 0xc6, 0x6f, 0xff, 0xb5, 0x39, 0x07, 0xb8, 0x37, 0xd8, 0xe9, 0x11, 0xdf, - 0xdb, 0xb1, 0xdd, 0x61, 0x8f, 0xec, 0xd0, 0xdd, 0x9d, 0x50, 0xc7, 0x1f, 0xf7, 0x02, 0xe2, 0x5f, - 0x12, 0xff, 0x55, 0x61, 0x7c, 0x76, 0x76, 0x43, 0xfc, 0x81, 0xf7, 0xf9, 0x7f, 0x03, 0x00, 0x00, - 0xff, 0xff, 0x59, 0x71, 0xe8, 0x68, 0xda, 0x1b, 0x00, 0x00, + // 2292 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, + 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0xc3, + 0x55, 0xce, 0xc9, 0x1d, 0x0e, 0xf8, 0xae, 0xe0, 0x48, 0xdd, 0x5d, 0xf0, 0x1f, 0xc5, 0x31, 0xc4, + 0x56, 0x58, 0x29, 0x49, 0x91, 0x2a, 0x2a, 0xac, 0xb5, 0x23, 0x4b, 0xe7, 0xd5, 0x8e, 0x6e, 0x77, + 0xe4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xf0, 0xc2, 0x2b, 0x45, 0xf1, 0xc0, 0x03, 0xdf, + 0x83, 0x17, 0x0a, 0xf8, 0x06, 0x54, 0xa8, 0xe2, 0x89, 0x0f, 0x41, 0xcd, 0x9f, 0xdd, 0x9d, 0x5d, + 0xed, 0xca, 0xae, 0xba, 0x37, 0x75, 0x4f, 0x77, 0x4f, 0x77, 0xff, 0x7a, 0xba, 0x67, 0x56, 0xb0, + 0x36, 0xf6, 0x29, 0xa3, 0xc1, 0x03, 0xba, 0xd3, 0xa3, 0x1e, 0xf3, 0xa9, 0xbb, 0x2d, 0x18, 0xa8, + 0x1a, 0x31, 0xf0, 0x1a, 0xac, 0xb6, 0x2e, 0x88, 0xc7, 0x5e, 0x1f, 0x93, 0x80, 0x06, 0x4f, 0x88, + 0xed, 0xb3, 0x53, 0x62, 0x33, 0xbc, 0x04, 0x8b, 0x1d, 0x66, 0xb3, 0x49, 0x60, 0x91, 0x6f, 0x26, + 0x24, 0x60, 0xf8, 0x14, 0x6a, 0x21, 0x63, 0xec, 0x5e, 0xa2, 0x55, 0x28, 0x05, 0xcc, 0x66, 0xc4, + 0x34, 0x36, 0x8d, 0xad, 0xaa, 0x25, 0x09, 0xf4, 0x25, 0x2c, 0x06, 0x42, 0xe8, 0xf9, 0xd8, 0xb1, + 0x19, 0x09, 0xcc, 0xc2, 0xe6, 0xfc, 0x56, 0x6d, 0xe7, 0xd6, 0x76, 0xec, 0x41, 0x47, 0x5b, 0xb7, + 0x92, 0xd2, 0xf8, 0xef, 0x06, 0x2c, 0xe8, 0xeb, 0xe8, 0x53, 0x28, 0xb9, 0xe4, 0x82, 0xb8, 0x62, + 0x97, 0xfa, 0xce, 0xfb, 0x39, 0x76, 0xb6, 0x9f, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x23, 0xa8, 0x8f, + 0x12, 0xc1, 0x98, 0x85, 0x4d, 0x63, 0xab, 0xb6, 0x73, 0x47, 0xd3, 0xce, 0x8a, 0xf9, 0xc9, 0x9c, + 0x95, 0x52, 0xc4, 0x9f, 0x41, 0x49, 0x98, 0x46, 0x55, 0x28, 0x1d, 0xb4, 0xf6, 0x9e, 0x1f, 0x36, + 0xe6, 0x50, 0x05, 0x8a, 0x47, 0x27, 0x8f, 0xdb, 0x0d, 0x03, 0xd5, 0xa0, 0xfc, 0x72, 0xd7, 0x3a, + 0x39, 0x3a, 0x39, 0x6c, 0x14, 0xb8, 0x44, 0xcb, 0xb2, 0xda, 0x56, 0x63, 0x7e, 0xaf, 0x0c, 0x25, + 0x61, 0x1f, 0xaf, 0xc3, 0xad, 0x43, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, 0xf9, 0x91, + 0xd7, 0xa7, 0x61, 0x3a, 0xff, 0x64, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, 0x2e, 0x47, + 0xf6, 0xd7, 0xd4, 0x17, 0x51, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xf0, 0x9e, 0x73, + 0x39, 0xc1, 0xb9, 0x63, 0x9b, 0xf5, 0x06, 0xe6, 0xbc, 0xe4, 0x0a, 0x82, 0x73, 0x4f, 0x27, 0x43, + 0xd7, 0x31, 0x8b, 0x12, 0x0d, 0x41, 0xa0, 0x4d, 0xa8, 0x8d, 0x7d, 0xea, 0x4c, 0x7a, 0xec, 0xc4, + 0x1e, 0x11, 0xb3, 0x24, 0xd6, 0x74, 0x16, 0xda, 0x00, 0xb8, 0x90, 0x4e, 0x74, 0x98, 0x6f, 0xde, + 0x10, 0x02, 0x1a, 0x07, 0xff, 0xae, 0x00, 0x37, 0xa7, 0x23, 0xe0, 0xf8, 0x6f, 0x42, 0xad, 0x1f, + 0x71, 0x1d, 0x55, 0x05, 0x3a, 0x0b, 0x7d, 0x02, 0xcb, 0xc4, 0xbb, 0x18, 0xfa, 0xd4, 0x1b, 0x11, + 0x8f, 0x05, 0xfb, 0x74, 0xe2, 0x31, 0x15, 0xcb, 0xf4, 0x02, 0xf7, 0x84, 0xd9, 0xc1, 0xb9, 0x12, + 0x93, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0x68, 0x10, 0x1a, 0x2f, + 0x49, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x80, 0xd9, 0x5e, 0x8f, 0x88, 0x14, 0xc8, 0x08, + 0x13, 0x3c, 0xf4, 0x09, 0x94, 0x55, 0xc4, 0x66, 0x59, 0xd4, 0x09, 0xd2, 0xea, 0x44, 0x41, 0x64, + 0x85, 0x22, 0xf8, 0x1e, 0x2c, 0x75, 0x89, 0xed, 0x3b, 0xf4, 0x8d, 0xa7, 0xa0, 0x44, 0x6b, 0x70, + 0xc3, 0x27, 0x76, 0x40, 0x3d, 0x95, 0x05, 0x45, 0xf1, 0x23, 0x14, 0x8b, 0x8e, 0xdd, 0x4b, 0x6c, + 0xc2, 0xda, 0x21, 0x61, 0x2d, 0x2d, 0xf6, 0xb0, 0x1a, 0xde, 0xc2, 0xea, 0xd4, 0xca, 0xf5, 0xb2, + 0xfc, 0x15, 0x2c, 0xe8, 0xc9, 0x54, 0x07, 0xae, 0xa9, 0x97, 0x7a, 0xbc, 0x2c, 0xe0, 0x4b, 0xc8, + 0xe3, 0x7f, 0x19, 0xb0, 0x94, 0x92, 0x40, 0x75, 0x28, 0x0c, 0xc3, 0xcd, 0x0a, 0x43, 0x51, 0x47, + 0x3d, 0x9f, 0xd8, 0x8c, 0x38, 0x2f, 0x07, 0xc4, 0x13, 0x18, 0x56, 0x2d, 0x9d, 0x15, 0xa3, 0x33, + 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x81, 0xa0, 0x59, 0x14, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, 0x50, 0x9f, + 0x75, 0xed, 0x40, 0x56, 0x94, 0x14, 0x43, 0x4d, 0xa8, 0xf8, 0x94, 0x32, 0x8b, 0xba, 0x61, 0xb1, + 0x46, 0x34, 0xba, 0x0f, 0x8d, 0xde, 0xc4, 0xf7, 0x89, 0xc7, 0xac, 0x89, 0x77, 0x32, 0x19, 0x9d, + 0x12, 0x59, 0xaf, 0x8b, 0xd6, 0x14, 0x1f, 0xef, 0xc3, 0xcd, 0x13, 0xf2, 0x46, 0x8b, 0x2a, 0x44, + 0xea, 0x3e, 0x34, 0x78, 0xda, 0xfa, 0x2e, 0x7d, 0xd3, 0x25, 0xa3, 0xb1, 0x1b, 0xf7, 0xaf, 0x29, + 0x3e, 0xee, 0xc0, 0x4a, 0xda, 0x08, 0x47, 0xe4, 0x0b, 0xa8, 0x69, 0xf9, 0x13, 0xda, 0xb3, 0xd3, + 0xad, 0x8b, 0xe3, 0x8f, 0xc4, 0x71, 0xca, 0xf0, 0x2c, 0x95, 0x72, 0xfc, 0x6b, 0x03, 0x56, 0xd2, + 0x92, 0xdf, 0x7a, 0x7b, 0xf4, 0x00, 0x2a, 0x61, 0x9c, 0xaa, 0x27, 0xae, 0x68, 0xaa, 0x3c, 0xcf, + 0x42, 0x27, 0x12, 0xc2, 0xff, 0x30, 0x60, 0x7d, 0x5f, 0x2e, 0x5f, 0xed, 0x34, 0x7a, 0x04, 0x45, + 0x76, 0x39, 0x26, 0xc2, 0x74, 0x7d, 0xe7, 0x63, 0xcd, 0x74, 0xae, 0x8d, 0xed, 0xf6, 0x98, 0xab, + 0x58, 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0xb4, 0xdb, 0xcf, 0x1a, 0x73, 0x08, + 0x41, 0xbd, 0xd3, 0xdd, 0xb5, 0xba, 0xaf, 0x77, 0xf7, 0xbb, 0x47, 0x2f, 0x8e, 0xba, 0x3f, 0x6f, + 0x18, 0x68, 0x19, 0x16, 0x3b, 0xdd, 0xf6, 0xb3, 0x98, 0x55, 0x40, 0x8b, 0x50, 0xdd, 0x6f, 0x9f, + 0x3c, 0x3e, 0x3a, 0x7c, 0x6e, 0xb5, 0x1a, 0xf3, 0xbc, 0x1b, 0x5b, 0xad, 0x4e, 0xab, 0xdb, 0x28, + 0xa2, 0x05, 0xa8, 0x1c, 0xb6, 0x5f, 0xcb, 0xde, 0x5c, 0xc2, 0xe7, 0x70, 0x2b, 0xcb, 0x19, 0x9e, + 0xdb, 0x74, 0x38, 0x51, 0x51, 0x17, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x9c, 0x42, 0xfc, 0xbd, + 0x01, 0xe6, 0x31, 0x75, 0x86, 0xfd, 0xcb, 0x6b, 0x65, 0x0f, 0xe8, 0x98, 0xf8, 0x36, 0x1b, 0x52, + 0x2f, 0x3c, 0xc7, 0x77, 0xb2, 0x91, 0x6d, 0x87, 0x72, 0x96, 0xa6, 0x82, 0xee, 0x42, 0xdd, 0x27, + 0x3d, 0xea, 0xf5, 0x87, 0x67, 0x13, 0x9f, 0xec, 0xba, 0xae, 0xf0, 0xab, 0x62, 0xa5, 0xb8, 0xf8, + 0x8f, 0x06, 0xac, 0x66, 0x19, 0x43, 0x0f, 0x15, 0x7e, 0x72, 0xd8, 0xde, 0xbd, 0x62, 0xef, 0x04, + 0x74, 0xf2, 0xec, 0xba, 0xb2, 0xcb, 0x16, 0xc2, 0xb3, 0x2b, 0x69, 0xfc, 0xfd, 0x0c, 0x58, 0x97, + 0xa0, 0x66, 0xb5, 0x8e, 0xdb, 0x2f, 0x5a, 0xaf, 0xad, 0xf6, 0x53, 0x8e, 0xd8, 0x02, 0x54, 0x76, + 0x0f, 0x0e, 0x24, 0x55, 0xc4, 0xbf, 0x31, 0x60, 0x2d, 0x23, 0x73, 0x1c, 0xa6, 0x9f, 0x42, 0xa3, + 0x6f, 0x0f, 0x5d, 0xe2, 0xb4, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0xa1, 0x30, + 0x8d, 0xb9, 0xde, 0xc8, 0xf0, 0x11, 0xac, 0x1f, 0x90, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, + 0xea, 0x39, 0x21, 0xe3, 0xae, 0xe8, 0x7c, 0x05, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, + 0xe2, 0x81, 0xfd, 0x04, 0x96, 0x7b, 0x2e, 0xb1, 0xbd, 0x89, 0x14, 0x15, 0x4c, 0x75, 0xc2, 0x6f, + 0xeb, 0x67, 0x29, 0x2d, 0x63, 0x4d, 0xab, 0xe1, 0xff, 0x1a, 0xb0, 0x98, 0xe8, 0xb1, 0x08, 0x41, + 0xd1, 0xe3, 0xe0, 0x48, 0x47, 0xc5, 0x6f, 0x3e, 0xb9, 0x5c, 0xda, 0x3b, 0x27, 0x8e, 0xf2, 0x53, + 0x51, 0x9c, 0xcf, 0x3b, 0xf2, 0x91, 0xa3, 0xd2, 0xa0, 0x28, 0xce, 0x97, 0x17, 0x36, 0x35, 0x85, + 0x15, 0x15, 0x67, 0xad, 0xa4, 0x9f, 0x94, 0xdb, 0x50, 0xed, 0xb9, 0x76, 0x10, 0x68, 0x93, 0x37, + 0x66, 0xa0, 0x16, 0xd4, 0x1d, 0x32, 0x76, 0xe9, 0x65, 0xd8, 0xaa, 0xd4, 0xf4, 0xd5, 0xef, 0x78, + 0xdc, 0xf9, 0x83, 0x84, 0x90, 0x95, 0x52, 0xe2, 0x8d, 0x12, 0x4d, 0x8b, 0xf1, 0x72, 0xe4, 0xd7, + 0x00, 0x2d, 0xe2, 0x88, 0x46, 0x26, 0x94, 0xed, 0x33, 0x2e, 0x18, 0x02, 0x1f, 0x92, 0x7c, 0x85, + 0xf6, 0xfb, 0xc4, 0x8f, 0x02, 0x0f, 0x49, 0x7e, 0xd1, 0x20, 0x6f, 0x49, 0x6f, 0xc2, 0x28, 0x5f, + 0x94, 0xd1, 0x6b, 0x1c, 0xbc, 0x0c, 0x4b, 0x87, 0x84, 0x29, 0x00, 0xe4, 0x4c, 0x7f, 0x04, 0x8b, + 0x31, 0x8b, 0xe3, 0x1b, 0x8d, 0x43, 0xe3, 0x5a, 0xe3, 0x10, 0x6f, 0x41, 0x5d, 0x19, 0xd0, 0x6e, + 0x1a, 0x0a, 0x17, 0x43, 0xc7, 0x05, 0xff, 0x10, 0x16, 0x22, 0x49, 0xbe, 0xd3, 0x47, 0x50, 0xe4, + 0x2b, 0xaa, 0x78, 0x56, 0x52, 0x19, 0x15, 0x7b, 0x08, 0x01, 0xdc, 0x82, 0x45, 0xce, 0xd9, 0xe7, + 0xa8, 0xe4, 0x56, 0x09, 0x1f, 0xff, 0x52, 0xfd, 0x98, 0x3a, 0x24, 0x1a, 0xff, 0x31, 0x0b, 0xff, + 0x0a, 0x6a, 0xfb, 0x74, 0x34, 0xb2, 0x3d, 0x47, 0x18, 0x69, 0xc0, 0x3c, 0xf1, 0x2e, 0x44, 0x98, + 0x55, 0x8b, 0xff, 0x14, 0x05, 0x32, 0x20, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x7b, 0x61, 0xbb, + 0x93, 0xe8, 0xb0, 0x09, 0x82, 0x97, 0x8d, 0xed, 0x9f, 0x4d, 0xe4, 0x75, 0xa6, 0x28, 0x6c, 0xc4, + 0x0c, 0xee, 0xe0, 0x24, 0x20, 0xbe, 0xaa, 0x34, 0xf1, 0x1b, 0x1f, 0x43, 0x6d, 0x7f, 0x60, 0x7b, + 0x1e, 0x71, 0x73, 0x63, 0x40, 0xda, 0x68, 0xaa, 0xaa, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x11, 0x16, + 0x57, 0x39, 0xa7, 0xf0, 0xff, 0x0a, 0x50, 0x89, 0x8e, 0xcd, 0x0f, 0xa0, 0x1a, 0x70, 0x70, 0x44, + 0x85, 0xca, 0x7c, 0xe6, 0x03, 0x17, 0x8b, 0x72, 0xbd, 0x5e, 0x98, 0x55, 0x35, 0x6b, 0xcd, 0x14, + 0x0e, 0x51, 0xd6, 0xad, 0x58, 0x14, 0xfd, 0x18, 0x96, 0x86, 0xde, 0x29, 0x9d, 0x78, 0x8e, 0x0a, + 0x29, 0x30, 0xe7, 0x45, 0xb9, 0xac, 0xe9, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x3d, 0x68, + 0xd0, 0x09, 0x4b, 0x9a, 0x28, 0xce, 0x34, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, + 0x64, 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x07, 0x8f, 0x57, 0xd6, 0x33, 0x9b, 0x0d, 0xd4, + 0x99, 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x2e, 0x8e, 0x1c, 0x71, 0xd2, 0xab, 0x96, 0x24, 0xf0, 0x03, + 0x58, 0x49, 0xb6, 0x34, 0x59, 0xeb, 0x26, 0x94, 0x65, 0x75, 0x07, 0xaa, 0x90, 0x42, 0x12, 0xff, + 0xd6, 0x80, 0xe5, 0xa9, 0x26, 0x88, 0x1e, 0x42, 0xed, 0x7c, 0xe8, 0xba, 0xc4, 0xe9, 0x5e, 0xeb, + 0x8c, 0xe9, 0xc2, 0xe8, 0x0b, 0x58, 0xf0, 0x27, 0x9e, 0x37, 0xf4, 0xce, 0xc2, 0xae, 0x3d, 0x5b, + 0x39, 0x21, 0x8d, 0xf7, 0xc5, 0xd9, 0xe7, 0xb7, 0xa7, 0xc8, 0xf9, 0x28, 0x52, 0x43, 0x8b, 0x94, + 0xe7, 0x66, 0x6c, 0xb3, 0x41, 0x67, 0x4c, 0x7a, 0xe1, 0x8c, 0x0c, 0x69, 0xfc, 0x57, 0x03, 0x2a, + 0xe1, 0x05, 0x2c, 0xaf, 0x57, 0xab, 0xde, 0x5b, 0xc8, 0xee, 0xbd, 0x89, 0xab, 0x77, 0x13, 0x2a, + 0xfd, 0x89, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0xa5, 0x44, 0x66, 0xd1, 0x3d, + 0x28, 0xf1, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x2f, 0x87, 0x52, 0x02, 0x3f, 0x14, 0xdd, + 0x4d, 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x0e, 0x09, 0x7b, + 0x99, 0xba, 0x72, 0x47, 0xd9, 0xdb, 0x84, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, 0x18, 0xf1, 0xc3, + 0x57, 0x95, 0xce, 0x42, 0x5b, 0xb0, 0xe4, 0x93, 0x8b, 0x21, 0x7f, 0x91, 0x85, 0x52, 0x32, 0x2b, + 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0x9e, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, 0x8d, 0x48, 0x67, + 0x89, 0x71, 0xe0, 0xba, 0x5d, 0xfb, 0x4c, 0x4e, 0xb5, 0x8a, 0x15, 0x92, 0xf8, 0x14, 0x56, 0xd3, + 0x3e, 0x86, 0xf0, 0x70, 0x67, 0x42, 0x78, 0xf8, 0x6f, 0x51, 0xf7, 0xe1, 0x93, 0x42, 0x61, 0x1b, + 0xd2, 0xe2, 0x6e, 0xa4, 0xdc, 0x52, 0x28, 0x45, 0x34, 0xfe, 0x1a, 0xd6, 0xb3, 0x53, 0xc1, 0x73, + 0x7a, 0x0c, 0xcb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0xcb, 0x49, 0x6b, 0x5a, 0x13, 0x23, 0x68, + 0x3c, 0x1d, 0x06, 0xfc, 0xb6, 0x41, 0xb5, 0xcf, 0x3a, 0x15, 0x4e, 0xe7, 0x96, 0x9d, 0x09, 0x65, + 0x87, 0xf4, 0xed, 0x89, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x8e, 0x81, 0xfa, 0x69, 0x25, 0x83, 0x4b, + 0xb3, 0xf1, 0x37, 0x50, 0xd7, 0xf6, 0x0d, 0x8b, 0x85, 0x53, 0x59, 0xc5, 0xa2, 0xbc, 0xb1, 0xa4, + 0x04, 0xfa, 0x0c, 0x6e, 0x9e, 0xb9, 0xf4, 0xd4, 0x76, 0x0f, 0x52, 0x9b, 0xc9, 0x2c, 0x67, 0x2f, + 0xe2, 0x13, 0xa8, 0xef, 0x3a, 0x0e, 0xb7, 0x15, 0x16, 0x55, 0x56, 0x70, 0x19, 0x21, 0x14, 0xb2, + 0x43, 0xf8, 0x0a, 0x16, 0x22, 0x7b, 0x72, 0x96, 0x23, 0x8f, 0xbc, 0x49, 0xbb, 0x24, 0x6d, 0x67, + 0xac, 0xe0, 0x7b, 0xb0, 0x6c, 0x91, 0x11, 0xbd, 0x20, 0xba, 0x4b, 0xab, 0x50, 0x1a, 0x7a, 0x0e, + 0x79, 0x1b, 0x7e, 0xf7, 0x11, 0x04, 0xfe, 0x11, 0x2c, 0xe9, 0xa2, 0x7c, 0xb7, 0xbb, 0x50, 0xd7, + 0x6d, 0x46, 0xa5, 0x97, 0xe2, 0xe2, 0x8f, 0x61, 0xc5, 0x22, 0x7d, 0x9f, 0x04, 0x03, 0x1d, 0xe3, + 0x9c, 0x7d, 0xbe, 0x0b, 0x37, 0x3b, 0x84, 0x69, 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0x3b, 0x1d, 0xc2, + 0x0e, 0xb3, 0xb2, 0x1d, 0x2a, 0xea, 0x75, 0x6e, 0xa4, 0xea, 0xfc, 0x67, 0xf0, 0x7e, 0x87, 0x88, + 0x6d, 0x72, 0x94, 0x33, 0x77, 0x4d, 0x98, 0x2c, 0xa4, 0x4c, 0x96, 0xa1, 0xd4, 0x1a, 0x8d, 0xd9, + 0xe5, 0xce, 0x5f, 0x16, 0xa1, 0xac, 0x1e, 0x75, 0x68, 0x1f, 0x6a, 0x5d, 0xdf, 0xee, 0x9d, 0xcb, + 0xcf, 0x83, 0xc8, 0x9c, 0xfa, 0x62, 0xa8, 0xf6, 0x6b, 0xae, 0x65, 0xac, 0xf0, 0x9b, 0xf3, 0xdc, + 0xf7, 0x0c, 0xf4, 0x0a, 0x1a, 0xe9, 0xaf, 0x5e, 0x08, 0x6b, 0xf2, 0x39, 0x1f, 0xf5, 0x9a, 0x9b, + 0x33, 0x65, 0x84, 0x75, 0xb4, 0x07, 0x95, 0xf0, 0xab, 0x10, 0xd2, 0x1f, 0xee, 0xa9, 0xaf, 0x4a, + 0x4d, 0x33, 0x73, 0x4d, 0xda, 0x78, 0x29, 0x26, 0x8e, 0xfe, 0xb9, 0x08, 0x7d, 0x90, 0xdc, 0x3a, + 0xe3, 0x23, 0x53, 0xf3, 0xce, 0x2c, 0x11, 0x69, 0xb8, 0x0b, 0xf5, 0xe4, 0x47, 0x0f, 0xa4, 0x87, + 0x94, 0xf9, 0x51, 0xa5, 0xb9, 0x31, 0x43, 0x22, 0xb2, 0x9a, 0xdc, 0x0f, 0x6d, 0xe6, 0xba, 0x92, + 0x65, 0x35, 0xe3, 0x43, 0x08, 0x9e, 0x43, 0xbf, 0x04, 0x34, 0xfd, 0x92, 0x47, 0x1f, 0x5e, 0xe7, + 0xab, 0x43, 0x13, 0x5f, 0x21, 0x25, 0x77, 0xf8, 0x05, 0x2c, 0x4f, 0xbd, 0x41, 0xd1, 0x77, 0x34, + 0xd5, 0xbc, 0xb7, 0x7d, 0xf3, 0x83, 0xd9, 0x42, 0x51, 0x00, 0xd3, 0x4f, 0xc1, 0x44, 0x00, 0xb9, + 0x8f, 0xce, 0x44, 0x00, 0x39, 0xef, 0x49, 0x59, 0x6b, 0xe1, 0x13, 0x24, 0x51, 0x6b, 0xa9, 0xa7, + 0x4a, 0xa2, 0xd6, 0x12, 0x6f, 0x16, 0x3c, 0x87, 0x1e, 0x41, 0x59, 0xb1, 0xd0, 0xfa, 0xb4, 0x58, + 0x68, 0xe1, 0x56, 0xd6, 0x92, 0x34, 0x70, 0x02, 0x0b, 0xfa, 0x6d, 0x0d, 0x6d, 0xe4, 0xbe, 0x65, + 0xa5, 0xa9, 0x99, 0x6f, 0xdd, 0x28, 0x28, 0x71, 0xf3, 0x48, 0x07, 0xa5, 0xdf, 0xc1, 0xd2, 0x41, + 0xc5, 0x57, 0x15, 0x3c, 0x87, 0xfa, 0xe2, 0x7b, 0xeb, 0xd4, 0xd4, 0x45, 0x77, 0x93, 0x3a, 0x79, + 0x37, 0x94, 0xe6, 0x87, 0x57, 0xca, 0xc9, 0x7d, 0x5a, 0x50, 0x8d, 0x26, 0x1f, 0x7a, 0x4f, 0x53, + 0x4a, 0xcf, 0xe1, 0xe6, 0x7a, 0xf6, 0x62, 0x84, 0x81, 0x9a, 0x3e, 0x09, 0x0c, 0x92, 0x13, 0x2e, + 0x81, 0x81, 0x3e, 0xac, 0xf0, 0x1c, 0x7a, 0x02, 0x10, 0xcf, 0x14, 0x74, 0x3b, 0x31, 0x6e, 0x53, + 0x53, 0xa9, 0xd9, 0xcc, 0x59, 0x0d, 0xb3, 0xbf, 0xa0, 0x8f, 0x98, 0x04, 0x9a, 0x19, 0xb3, 0xa7, + 0xd9, 0xd0, 0xbf, 0xc9, 0xf0, 0x6e, 0x8d, 0xe7, 0xd0, 0x63, 0xa8, 0x27, 0x27, 0x4f, 0xa2, 0x1f, + 0x64, 0x0e, 0xa5, 0x4c, 0x3b, 0xaf, 0xc0, 0xcc, 0x1b, 0x49, 0xe8, 0x7e, 0xd2, 0xe2, 0xac, 0xb9, + 0x95, 0x69, 0xfb, 0x05, 0xac, 0x65, 0xcf, 0x2b, 0xb4, 0x95, 0xb4, 0x9c, 0x3f, 0xd2, 0xb2, 0xec, + 0xee, 0x7d, 0xfe, 0xb7, 0x77, 0x1b, 0xc6, 0x3f, 0xdf, 0x6d, 0x18, 0xff, 0x7e, 0xb7, 0x61, 0xfc, + 0xe1, 0x3f, 0x1b, 0x73, 0x80, 0x7b, 0x83, 0xed, 0x1e, 0xf1, 0xbd, 0x6d, 0xdb, 0x1d, 0xf6, 0xc8, + 0x36, 0xdd, 0xd9, 0x0e, 0x75, 0xfc, 0x71, 0x2f, 0x20, 0xfe, 0x05, 0xf1, 0x5f, 0x15, 0xc6, 0xa7, + 0xa7, 0x37, 0xc4, 0x7f, 0x77, 0x9f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xef, 0x3e, 0xd0, 0xb5, + 0xd5, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5840,16 +5840,6 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) i += copy(dAtA[i:], m.DefaultRevision) } - if m.IsGlobalDefaultRevision { - dAtA[i] = 0x20 - i++ - if m.IsGlobalDefaultRevision { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -5883,6 +5873,12 @@ func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.GlobalDefaultRevision) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + i += copy(dAtA[i:], m.GlobalDefaultRevision) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -7084,9 +7080,6 @@ func (m *RepoInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.IsGlobalDefaultRevision { - n += 2 - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7105,6 +7098,10 @@ func (m *ListReposReply) Size() (n int) { n += 1 + l + sovO2Control(uint64(l)) } } + l = len(m.GlobalDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12639,26 +12636,6 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultRevision", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsGlobalDefaultRevision = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12747,6 +12724,38 @@ func (m *ListReposReply) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 54f860ec2..e0a339ada 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2634,13 +2634,12 @@ func (m *ListReposRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - IsGlobalDefaultRevision bool `protobuf:"varint,4,opt,name=isGlobalDefaultRevision,proto3" json:"isGlobalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RepoInfo) Reset() { *m = RepoInfo{} } @@ -2697,18 +2696,12 @@ func (m *RepoInfo) GetDefaultRevision() string { return "" } -func (m *RepoInfo) GetIsGlobalDefaultRevision() bool { - if m != nil { - return m.IsGlobalDefaultRevision - } - return false -} - type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ListReposReply) Reset() { *m = ListReposReply{} } @@ -2751,6 +2744,13 @@ func (m *ListReposReply) GetRepos() []*RepoInfo { return nil } +func (m *ListReposReply) GetGlobalDefaultRevision() string { + if m != nil { + return m.GlobalDefaultRevision + } + return "" +} + type AddRepoRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` @@ -3244,151 +3244,151 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2298 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcf, 0x73, 0x1b, 0x49, - 0xf5, 0xf7, 0xc8, 0x52, 0x24, 0x3d, 0xd9, 0xb2, 0xdc, 0x76, 0xec, 0xb1, 0x36, 0xeb, 0x78, 0xfb, - 0xbb, 0x95, 0x75, 0xb2, 0xfb, 0x75, 0xc0, 0x4b, 0x41, 0x08, 0xbb, 0x1b, 0xfc, 0x43, 0x71, 0x0c, - 0xb1, 0x15, 0x46, 0x4a, 0x52, 0xa4, 0x8a, 0x0a, 0x63, 0x4d, 0xcb, 0xd2, 0x7a, 0x34, 0x2d, 0x66, - 0x5a, 0x4e, 0x7c, 0xe0, 0xc6, 0x8d, 0xa2, 0x38, 0x70, 0xe1, 0xc0, 0x85, 0xa2, 0x38, 0x70, 0xe0, - 0xff, 0xe0, 0x42, 0x01, 0xff, 0x01, 0x15, 0xaa, 0x38, 0xf1, 0x47, 0x50, 0xfd, 0x63, 0x66, 0x7a, - 0x46, 0x33, 0x8a, 0xab, 0xb8, 0xe9, 0xbd, 0x7e, 0xef, 0x4d, 0xbf, 0xf7, 0x79, 0xfd, 0xde, 0xeb, - 0x16, 0xac, 0x8d, 0x7d, 0xca, 0x68, 0x70, 0x9f, 0xee, 0xf6, 0xa8, 0xc7, 0x7c, 0xea, 0xee, 0x08, - 0x06, 0xaa, 0x46, 0x0c, 0xbc, 0x06, 0xab, 0xad, 0x4b, 0xe2, 0xb1, 0xd7, 0x27, 0x24, 0xa0, 0xc1, - 0x13, 0x62, 0xfb, 0xec, 0x8c, 0xd8, 0x0c, 0x2f, 0xc1, 0x62, 0x87, 0xd9, 0x6c, 0x12, 0x58, 0xe4, - 0x67, 0x13, 0x12, 0x30, 0x7c, 0x06, 0xb5, 0x90, 0x31, 0x76, 0xaf, 0xd0, 0x2a, 0x94, 0x02, 0x66, - 0x33, 0x62, 0x1a, 0x5b, 0xc6, 0x76, 0xd5, 0x92, 0x04, 0xfa, 0x12, 0x16, 0x03, 0x21, 0xf4, 0x7c, - 0xec, 0xd8, 0x8c, 0x04, 0x66, 0x61, 0x6b, 0x7e, 0xbb, 0xb6, 0xbb, 0xbe, 0x13, 0xef, 0xa0, 0xa3, - 0xad, 0x5b, 0x49, 0x69, 0xfc, 0x57, 0x03, 0x16, 0xf4, 0x75, 0xf4, 0x39, 0x94, 0x5c, 0x72, 0x49, - 0x5c, 0xf1, 0x95, 0xfa, 0xee, 0x87, 0x39, 0x76, 0x76, 0x9e, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x63, - 0xa8, 0x8f, 0x12, 0xce, 0x98, 0x85, 0x2d, 0x63, 0xbb, 0xb6, 0x7b, 0x5b, 0xd3, 0xce, 0xf2, 0xf9, - 0xc9, 0x9c, 0x95, 0x52, 0xc4, 0xdf, 0x82, 0x92, 0x30, 0x8d, 0xaa, 0x50, 0x3a, 0x6c, 0xed, 0x3f, - 0x3f, 0x6a, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4f, 0x1f, 0xb7, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xe5, - 0x9e, 0x75, 0x7a, 0x7c, 0x7a, 0xd4, 0x28, 0x70, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x7e, - 0x19, 0x4a, 0xc2, 0x3e, 0xde, 0x80, 0xf5, 0x23, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, - 0xc5, 0xb1, 0xd7, 0xa7, 0x61, 0x38, 0xff, 0x60, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, - 0x2c, 0x47, 0xf6, 0xd7, 0xd4, 0x17, 0x5e, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xd8, - 0x3d, 0xe7, 0x72, 0x82, 0x73, 0xc7, 0x36, 0xeb, 0x0d, 0xcc, 0x79, 0xc9, 0x15, 0x04, 0xe7, 0x9e, - 0x4d, 0x86, 0xae, 0x63, 0x16, 0x25, 0x1a, 0x82, 0x40, 0x5b, 0x50, 0x1b, 0xfb, 0xd4, 0x99, 0xf4, - 0xd8, 0xa9, 0x3d, 0x22, 0x66, 0x49, 0xac, 0xe9, 0x2c, 0xb4, 0x09, 0x70, 0x29, 0x37, 0xd1, 0x61, - 0xbe, 0x79, 0x43, 0x08, 0x68, 0x1c, 0xfc, 0xeb, 0x02, 0xdc, 0x9c, 0xf6, 0x80, 0xe3, 0xbf, 0x05, - 0xb5, 0x7e, 0xc4, 0x75, 0x54, 0x16, 0xe8, 0x2c, 0xf4, 0x19, 0x2c, 0x13, 0xef, 0x72, 0xe8, 0x53, - 0x6f, 0x44, 0x3c, 0x16, 0x1c, 0xd0, 0x89, 0xc7, 0x94, 0x2f, 0xd3, 0x0b, 0x7c, 0x27, 0xcc, 0x0e, - 0x2e, 0x94, 0x98, 0x74, 0x4e, 0xe3, 0xc4, 0xf9, 0x56, 0xd4, 0xf3, 0x6d, 0x13, 0x60, 0x40, 0x83, - 0xd0, 0x78, 0x49, 0x6a, 0xc5, 0x1c, 0x84, 0x61, 0x61, 0xe8, 0x05, 0xcc, 0xf6, 0x7a, 0x44, 0x84, - 0x40, 0x7a, 0x98, 0xe0, 0xa1, 0xcf, 0xa0, 0xac, 0x3c, 0x36, 0xcb, 0x22, 0x4f, 0x90, 0x96, 0x27, - 0x0a, 0x22, 0x2b, 0x14, 0xc1, 0x77, 0x61, 0xa9, 0x4b, 0x6c, 0xdf, 0xa1, 0x6f, 0x3c, 0x05, 0x25, - 0x5a, 0x83, 0x1b, 0x3e, 0xb1, 0x03, 0xea, 0xa9, 0x28, 0x28, 0x8a, 0x1f, 0xa1, 0x58, 0x74, 0xec, - 0x5e, 0x61, 0x13, 0xd6, 0x8e, 0x08, 0x6b, 0x69, 0xbe, 0x87, 0xd9, 0xf0, 0x16, 0x56, 0xa7, 0x56, - 0xae, 0x17, 0xe5, 0xaf, 0x60, 0x41, 0x0f, 0xa6, 0x3a, 0x70, 0x4d, 0x3d, 0xd5, 0xe3, 0x65, 0x01, - 0x5f, 0x42, 0x1e, 0xff, 0xc3, 0x80, 0xa5, 0x94, 0x04, 0xaa, 0x43, 0x61, 0x18, 0x7e, 0xac, 0x30, - 0x14, 0x79, 0xd4, 0xf3, 0x89, 0xcd, 0x88, 0xf3, 0x72, 0x40, 0x3c, 0x81, 0x61, 0xd5, 0xd2, 0x59, - 0x31, 0x3a, 0xf3, 0x3a, 0x3a, 0x3b, 0x50, 0x12, 0x08, 0x9a, 0x45, 0xb1, 0x29, 0x53, 0x3f, 0xbd, - 0x03, 0xea, 0xb3, 0xae, 0x1d, 0xc8, 0x8c, 0x92, 0x62, 0xa8, 0x09, 0x15, 0x9f, 0x52, 0x66, 0x51, - 0x37, 0x4c, 0xd6, 0x88, 0x46, 0xf7, 0xa0, 0xd1, 0x9b, 0xf8, 0x3e, 0xf1, 0x98, 0x35, 0xf1, 0x4e, - 0x27, 0xa3, 0x33, 0x22, 0xf3, 0x75, 0xd1, 0x9a, 0xe2, 0xe3, 0x03, 0xb8, 0x79, 0x4a, 0xde, 0x68, - 0x5e, 0x85, 0x48, 0xdd, 0x83, 0x06, 0x0f, 0x5b, 0xdf, 0xa5, 0x6f, 0xba, 0x64, 0x34, 0x76, 0xe3, - 0xfa, 0x35, 0xc5, 0xc7, 0x1d, 0x58, 0x49, 0x1b, 0xe1, 0x88, 0x7c, 0x01, 0x35, 0x2d, 0x7e, 0x42, - 0x7b, 0x76, 0xb8, 0x75, 0x71, 0xfc, 0x89, 0x38, 0x4e, 0x19, 0x3b, 0x4b, 0x85, 0x1c, 0xff, 0xc2, - 0x80, 0x95, 0xb4, 0xe4, 0xff, 0xfc, 0x79, 0x74, 0x1f, 0x2a, 0xa1, 0x9f, 0xaa, 0x26, 0xae, 0x68, - 0xaa, 0x3c, 0xce, 0x42, 0x27, 0x12, 0xc2, 0x7f, 0x33, 0x60, 0xe3, 0x40, 0x2e, 0xbf, 0x7f, 0xd3, - 0xe8, 0x11, 0x14, 0xd9, 0xd5, 0x98, 0x08, 0xd3, 0xf5, 0xdd, 0x4f, 0x35, 0xd3, 0xb9, 0x36, 0x76, - 0xda, 0x63, 0xae, 0x62, 0x09, 0x45, 0x6c, 0xc3, 0x0d, 0x49, 0xf3, 0x22, 0x7b, 0xda, 0x6e, 0x3f, - 0x6b, 0xcc, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0xcf, 0xea, 0xbe, 0xde, 0x3b, 0xe8, 0x1e, 0xbf, 0x38, - 0xee, 0xfe, 0xb8, 0x61, 0xa0, 0x65, 0x58, 0xec, 0x74, 0xdb, 0xcf, 0x62, 0x56, 0x01, 0x2d, 0x42, - 0xf5, 0xa0, 0x7d, 0xfa, 0xf8, 0xf8, 0xe8, 0xb9, 0xd5, 0x6a, 0xcc, 0xf3, 0x6a, 0x6c, 0xb5, 0x3a, - 0xad, 0x6e, 0xa3, 0x88, 0x16, 0xa0, 0x72, 0xd4, 0x7e, 0x2d, 0x6b, 0x73, 0x09, 0x5f, 0xc0, 0x7a, - 0xd6, 0x66, 0x78, 0x6c, 0xd3, 0xee, 0x44, 0x49, 0x5d, 0xd0, 0x93, 0x3a, 0x2b, 0x11, 0xe7, 0x73, - 0x12, 0xf1, 0x37, 0x06, 0x98, 0x27, 0xd4, 0x19, 0xf6, 0xaf, 0xae, 0x15, 0x3d, 0xa0, 0x63, 0xe2, - 0xdb, 0x6c, 0x48, 0xbd, 0xf0, 0x1c, 0xdf, 0xce, 0x46, 0xb6, 0x1d, 0xca, 0x59, 0x9a, 0x0a, 0xba, - 0x03, 0x75, 0x9f, 0xf4, 0xa8, 0xd7, 0x1f, 0x9e, 0x4f, 0x7c, 0xb2, 0xe7, 0xba, 0x62, 0x5f, 0x15, - 0x2b, 0xc5, 0xc5, 0xbf, 0x37, 0x60, 0x35, 0xcb, 0x18, 0x7a, 0xa8, 0xf0, 0x93, 0xcd, 0xf6, 0xce, - 0x7b, 0xbe, 0x9d, 0x80, 0x4e, 0x9e, 0x5d, 0x57, 0x56, 0xd9, 0x42, 0x78, 0x76, 0x25, 0x8d, 0xbf, - 0x99, 0x01, 0xeb, 0x12, 0xd4, 0xac, 0xd6, 0x49, 0xfb, 0x45, 0xeb, 0xb5, 0xd5, 0x7e, 0xca, 0x11, - 0x5b, 0x80, 0xca, 0xde, 0xe1, 0xa1, 0xa4, 0x8a, 0xf8, 0x97, 0x06, 0xac, 0x65, 0x44, 0x8e, 0xc3, - 0xf4, 0x43, 0x68, 0xf4, 0xed, 0xa1, 0x4b, 0x9c, 0x76, 0x1c, 0x2d, 0xe3, 0x7a, 0xd1, 0x9a, 0x52, - 0x54, 0x20, 0x14, 0xa6, 0x31, 0xd7, 0x0b, 0x19, 0x3e, 0x86, 0x8d, 0x43, 0x12, 0x30, 0x9f, 0x5e, - 0x07, 0xc7, 0x5b, 0x50, 0xbd, 0x20, 0x64, 0xdc, 0x15, 0x95, 0xaf, 0x20, 0x10, 0x88, 0x19, 0x98, - 0xc0, 0x7a, 0x96, 0x29, 0xee, 0xd8, 0x0f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x48, 0x51, 0xc1, - 0x54, 0x27, 0xfc, 0x96, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, - 0x1a, 0x8b, 0x10, 0x14, 0x3d, 0x0e, 0x8e, 0xdc, 0xa8, 0xf8, 0xcd, 0x3b, 0x97, 0x4b, 0x7b, 0x17, - 0xc4, 0x51, 0xfb, 0x54, 0x14, 0xe7, 0xf3, 0x8a, 0x7c, 0xec, 0xa8, 0x30, 0x28, 0x8a, 0xf3, 0xe5, - 0xc0, 0xa6, 0xba, 0xb0, 0xa2, 0xe2, 0xa8, 0x95, 0xf4, 0x93, 0x72, 0x0b, 0xaa, 0x3d, 0xd7, 0x0e, - 0x02, 0xad, 0xf3, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0x2e, 0xbd, 0x0a, 0x4b, 0x95, 0xea, - 0xbe, 0xfa, 0x8c, 0xc7, 0x37, 0x7f, 0x98, 0x10, 0xb2, 0x52, 0x4a, 0xbc, 0x50, 0xa2, 0x69, 0x31, - 0x9e, 0x8e, 0x7c, 0x0c, 0xd0, 0x3c, 0x8e, 0x68, 0x64, 0x42, 0xd9, 0x3e, 0xe7, 0x82, 0x21, 0xf0, - 0x21, 0xc9, 0x57, 0x68, 0xbf, 0x4f, 0xfc, 0xc8, 0xf1, 0x90, 0xe4, 0x83, 0x06, 0x79, 0x4b, 0x7a, - 0x13, 0x46, 0xf9, 0xa2, 0xf4, 0x5e, 0xe3, 0xe0, 0x65, 0x58, 0x3a, 0x22, 0x4c, 0x01, 0x20, 0x7b, - 0xfa, 0x23, 0x58, 0x8c, 0x59, 0x1c, 0xdf, 0xa8, 0x1d, 0x1a, 0xd7, 0x6a, 0x87, 0x78, 0x1b, 0xea, - 0xca, 0x80, 0x36, 0x69, 0x28, 0x5c, 0x0c, 0x1d, 0x17, 0xfc, 0x1d, 0x58, 0x88, 0x24, 0xf9, 0x97, - 0x3e, 0x81, 0x22, 0x5f, 0x51, 0xc9, 0xb3, 0x92, 0x8a, 0xa8, 0xf8, 0x86, 0x10, 0xc0, 0x2d, 0x58, - 0xe4, 0x9c, 0x03, 0x8e, 0x4a, 0x6e, 0x96, 0xf0, 0xf6, 0x2f, 0xd5, 0x4f, 0xa8, 0x43, 0xa2, 0xf6, - 0x1f, 0xb3, 0xf0, 0xcf, 0xa1, 0x76, 0x40, 0x47, 0x23, 0xdb, 0x73, 0x84, 0x91, 0x06, 0xcc, 0x13, - 0xef, 0x52, 0xb8, 0x59, 0xb5, 0xf8, 0x4f, 0x91, 0x20, 0x03, 0xe2, 0xba, 0x2a, 0xcf, 0x24, 0xc1, - 0xb9, 0x97, 0xb6, 0x3b, 0x89, 0x0e, 0x9b, 0x20, 0x78, 0xda, 0xd8, 0xfe, 0xf9, 0x44, 0x8e, 0x33, - 0x45, 0x61, 0x23, 0x66, 0xf0, 0x0d, 0x4e, 0x02, 0xe2, 0xab, 0x4c, 0x13, 0xbf, 0xf1, 0x09, 0xd4, - 0x0e, 0x06, 0xb6, 0xe7, 0x11, 0x37, 0xd7, 0x07, 0xa4, 0xb5, 0xa6, 0xaa, 0x2a, 0x59, 0x22, 0x9a, - 0xfe, 0x39, 0x61, 0x71, 0x96, 0x73, 0x0a, 0xff, 0xa7, 0x00, 0x95, 0xe8, 0xd8, 0x7c, 0x1b, 0xaa, - 0x01, 0x07, 0x47, 0x64, 0xa8, 0x8c, 0x67, 0x3e, 0x70, 0xb1, 0x28, 0xd7, 0xeb, 0x85, 0x51, 0x55, - 0xbd, 0xd6, 0x4c, 0xe1, 0x10, 0x45, 0xdd, 0x8a, 0x45, 0xd1, 0xf7, 0x61, 0x69, 0xe8, 0x9d, 0xd1, - 0x89, 0xe7, 0x28, 0x97, 0x02, 0x73, 0x5e, 0xa4, 0xcb, 0x9a, 0x5e, 0x02, 0x62, 0x6f, 0xad, 0xb4, - 0x38, 0xda, 0x87, 0x06, 0x9d, 0xb0, 0xa4, 0x89, 0xe2, 0x4c, 0x13, 0x53, 0xf2, 0xe8, 0x01, 0x87, - 0x3c, 0x02, 0x54, 0x04, 0x3b, 0xa5, 0x1e, 0xaf, 0x5a, 0xba, 0x28, 0x3f, 0x78, 0x3c, 0xb3, 0x9e, - 0xd9, 0x6c, 0xa0, 0xce, 0x7c, 0x44, 0x73, 0xbc, 0x89, 0x77, 0x79, 0xec, 0x88, 0x93, 0x5e, 0xb5, - 0x24, 0x81, 0xef, 0xc3, 0x4a, 0xb2, 0xa4, 0xc9, 0x5c, 0x37, 0xa1, 0x2c, 0xb3, 0x3b, 0x50, 0x89, - 0x14, 0x92, 0xf8, 0x57, 0x06, 0x2c, 0x4f, 0x15, 0x41, 0xf4, 0x10, 0x6a, 0x17, 0x43, 0xd7, 0x25, - 0x4e, 0xf7, 0x5a, 0x67, 0x4c, 0x17, 0x46, 0x5f, 0xc0, 0x82, 0x3f, 0xf1, 0xbc, 0xa1, 0x77, 0x1e, - 0x56, 0xed, 0xd9, 0xca, 0x09, 0x69, 0x7c, 0x20, 0xce, 0x3e, 0x9f, 0x9e, 0xa2, 0xcd, 0x47, 0x9e, - 0x1a, 0x9a, 0xa7, 0x3c, 0x36, 0x63, 0x9b, 0x0d, 0x3a, 0x63, 0xd2, 0x0b, 0x7b, 0x64, 0x48, 0xe3, - 0x3f, 0x1b, 0x50, 0x09, 0x07, 0xb0, 0xbc, 0x5a, 0xad, 0x6a, 0x6f, 0x21, 0xbb, 0xf6, 0x26, 0x46, - 0xef, 0x26, 0x54, 0xfa, 0x13, 0xd7, 0x15, 0x30, 0xc8, 0x6a, 0x15, 0xd1, 0x7a, 0x64, 0x4b, 0x89, - 0xc8, 0xa2, 0xbb, 0x50, 0xe2, 0x4d, 0x3b, 0x30, 0x6f, 0x88, 0x00, 0x64, 0x0e, 0x87, 0x52, 0x02, - 0x3f, 0x14, 0xd5, 0x4d, 0x39, 0xcd, 0xe3, 0x1f, 0xe9, 0x1a, 0xef, 0xd5, 0xfd, 0xa3, 0x01, 0x1f, - 0x1c, 0x11, 0xf6, 0x32, 0x35, 0x72, 0x47, 0xd1, 0xdb, 0x82, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, - 0x18, 0xf1, 0xc3, 0x5b, 0x95, 0xce, 0x42, 0xdb, 0xb0, 0xe4, 0x93, 0xcb, 0x21, 0xbf, 0x91, 0x85, - 0x52, 0x32, 0x2a, 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0xbe, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, - 0x44, 0xa4, 0xb3, 0x44, 0x3b, 0x70, 0xdd, 0xae, 0x7d, 0x2e, 0xbb, 0x5a, 0xc5, 0x0a, 0x49, 0x7c, - 0x06, 0xab, 0xe9, 0x3d, 0x86, 0xf0, 0xf0, 0xcd, 0x84, 0xf0, 0xf0, 0xdf, 0x22, 0xef, 0xc3, 0x2b, - 0x85, 0xc2, 0x36, 0xa4, 0xc5, 0x6c, 0xa4, 0xb6, 0xa5, 0x50, 0x8a, 0x68, 0xfc, 0x35, 0x6c, 0x64, - 0x87, 0x82, 0xc7, 0xf4, 0x04, 0x96, 0xd3, 0xf7, 0x92, 0xac, 0x59, 0x27, 0x6b, 0x93, 0xd6, 0xb4, - 0x26, 0x46, 0xd0, 0x78, 0x3a, 0x0c, 0xf8, 0xb4, 0x41, 0xa3, 0x2e, 0xf5, 0x3b, 0x9e, 0x77, 0x64, - 0x4c, 0x73, 0xf3, 0xce, 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0x65, 0xaa, 0x78, 0x87, 0x24, 0x07, - 0x41, 0xfd, 0xb4, 0x92, 0xde, 0xa5, 0xd9, 0xe8, 0x01, 0xac, 0x0f, 0x83, 0x23, 0x97, 0x9e, 0xd9, - 0xee, 0x61, 0x4a, 0x43, 0x86, 0x3c, 0x6f, 0x19, 0x7f, 0x0f, 0xea, 0xda, 0x96, 0xc3, 0x3c, 0xe3, - 0x54, 0x56, 0x9e, 0x29, 0x3f, 0x2c, 0x29, 0x81, 0x4f, 0xa1, 0xbe, 0xe7, 0x38, 0x9c, 0x1b, 0x66, - 0x56, 0x96, 0x83, 0x19, 0x6e, 0x14, 0x32, 0xdd, 0xc0, 0x5f, 0xc1, 0x42, 0x64, 0x4f, 0x36, 0x74, - 0xe4, 0x91, 0x37, 0x69, 0x8f, 0xa4, 0xed, 0x8c, 0x15, 0x7c, 0x17, 0x96, 0x2d, 0x32, 0xa2, 0x97, - 0x44, 0xdf, 0xd2, 0x2a, 0x94, 0x86, 0x9e, 0x43, 0xde, 0x86, 0x8f, 0x3f, 0x82, 0xc0, 0xdf, 0x85, - 0x25, 0x5d, 0x94, 0x7f, 0xed, 0x0e, 0xd4, 0x75, 0x9b, 0x51, 0xfe, 0xa5, 0xb8, 0xf8, 0x53, 0x58, - 0xb1, 0x48, 0xdf, 0x27, 0xc1, 0x40, 0x07, 0x3a, 0xe7, 0x3b, 0xff, 0x0f, 0x37, 0x3b, 0x84, 0x69, - 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0xdb, 0x1d, 0xc2, 0x32, 0xa1, 0x0a, 0x15, 0xf5, 0x64, 0x37, 0x52, - 0xc9, 0xfe, 0x23, 0xf8, 0xb0, 0x43, 0xc4, 0x67, 0x72, 0x94, 0x33, 0xbf, 0x9a, 0x30, 0x59, 0x48, - 0x99, 0x2c, 0x43, 0xa9, 0x35, 0x1a, 0xb3, 0xab, 0xdd, 0x3f, 0x2d, 0x42, 0x59, 0xdd, 0xec, 0xd0, - 0x01, 0xd4, 0xba, 0xbe, 0xdd, 0xbb, 0x90, 0x6f, 0x84, 0xc8, 0x9c, 0x7a, 0x36, 0x54, 0xdf, 0x6b, - 0xae, 0x65, 0xac, 0xf0, 0xf1, 0x79, 0xee, 0x1b, 0x06, 0x7a, 0x05, 0x8d, 0xf4, 0xd3, 0x17, 0xc2, - 0x9a, 0x7c, 0xce, 0xcb, 0x5e, 0x73, 0x6b, 0xa6, 0x8c, 0xb0, 0x8e, 0xf6, 0xa1, 0x12, 0x3e, 0x0d, - 0x21, 0xfd, 0xf6, 0x9e, 0x7a, 0x5a, 0x6a, 0x9a, 0x99, 0x6b, 0xd2, 0xc6, 0x4b, 0xd1, 0x76, 0xf4, - 0x37, 0x23, 0xf4, 0x51, 0xf2, 0xd3, 0x19, 0x2f, 0x4d, 0xcd, 0xdb, 0xb3, 0x44, 0xa4, 0xe1, 0x2e, - 0xd4, 0x93, 0x2f, 0x1f, 0x48, 0x77, 0x29, 0xf3, 0x65, 0xa5, 0xb9, 0x39, 0x43, 0x22, 0xb2, 0x9a, - 0xfc, 0x1e, 0xda, 0xca, 0xdd, 0x4a, 0x96, 0xd5, 0x8c, 0xd7, 0x10, 0x3c, 0x87, 0x7e, 0x0a, 0x68, - 0xfa, 0x3a, 0x8f, 0x3e, 0xbe, 0xce, 0xd3, 0x43, 0x13, 0xbf, 0x47, 0x4a, 0x7e, 0xe1, 0x27, 0xb0, - 0x3c, 0x75, 0x11, 0x45, 0xff, 0xa7, 0xa9, 0xe6, 0x5d, 0xf0, 0x9b, 0x1f, 0xcd, 0x16, 0x8a, 0x1c, - 0x98, 0xbe, 0x0f, 0x26, 0x1c, 0xc8, 0xbd, 0x79, 0x26, 0x1c, 0xc8, 0xb9, 0x54, 0xca, 0x5c, 0x0b, - 0xef, 0x21, 0x89, 0x5c, 0x4b, 0xdd, 0x57, 0x12, 0xb9, 0x96, 0xb8, 0xb8, 0xe0, 0x39, 0xf4, 0x08, - 0xca, 0x8a, 0x85, 0x36, 0xa6, 0xc5, 0x42, 0x0b, 0xeb, 0x59, 0x4b, 0xd2, 0xc0, 0x29, 0x2c, 0xe8, - 0x23, 0x1b, 0xda, 0xcc, 0xbd, 0xd0, 0x4a, 0x53, 0x33, 0x2f, 0xbc, 0x91, 0x53, 0x62, 0xfc, 0x48, - 0x3b, 0xa5, 0x0f, 0x62, 0x69, 0xa7, 0xe2, 0x79, 0x05, 0xcf, 0xa1, 0xbe, 0x78, 0x74, 0x9d, 0x6a, - 0xbd, 0xe8, 0x4e, 0x52, 0x27, 0x6f, 0x4c, 0x69, 0x7e, 0xfc, 0x5e, 0x39, 0xf9, 0x9d, 0x16, 0x54, - 0xa3, 0x1e, 0x86, 0x3e, 0xd0, 0x94, 0xd2, 0xcd, 0xb8, 0xb9, 0x91, 0xbd, 0x18, 0x61, 0xa0, 0xba, - 0x4f, 0x02, 0x83, 0x64, 0x87, 0x4b, 0x60, 0xa0, 0x37, 0x2b, 0x3c, 0x87, 0x9e, 0x00, 0xc4, 0x3d, - 0x05, 0xdd, 0x4a, 0x34, 0xce, 0x54, 0x57, 0x6a, 0x36, 0x73, 0x56, 0xc3, 0xe8, 0x2f, 0xe8, 0x2d, - 0x26, 0x81, 0x66, 0x46, 0xef, 0x69, 0x36, 0xf4, 0x87, 0x19, 0x5e, 0xad, 0xf1, 0x1c, 0x7a, 0x0c, - 0xf5, 0x64, 0xe7, 0x49, 0xd4, 0x83, 0xcc, 0xa6, 0x94, 0x69, 0xe7, 0x15, 0x98, 0x79, 0x2d, 0x09, - 0xdd, 0x4b, 0x5a, 0x9c, 0xd5, 0xb7, 0x32, 0x6d, 0xbf, 0x80, 0xb5, 0xec, 0x7e, 0x85, 0xb6, 0x93, - 0x96, 0xf3, 0x5b, 0x5a, 0x96, 0xdd, 0xfd, 0x07, 0x7f, 0x79, 0xb7, 0x69, 0xfc, 0xfd, 0xdd, 0xa6, - 0xf1, 0xcf, 0x77, 0x9b, 0xc6, 0x6f, 0xff, 0xb5, 0x39, 0x07, 0xb8, 0x37, 0xd8, 0xe9, 0x11, 0xdf, - 0xdb, 0xb1, 0xdd, 0x61, 0x8f, 0xec, 0xd0, 0xdd, 0x9d, 0x50, 0xc7, 0x1f, 0xf7, 0x02, 0xe2, 0x5f, - 0x12, 0xff, 0x55, 0x61, 0x7c, 0x76, 0x76, 0x43, 0xfc, 0x81, 0xf7, 0xf9, 0x7f, 0x03, 0x00, 0x00, - 0xff, 0xff, 0x59, 0x71, 0xe8, 0x68, 0xda, 0x1b, 0x00, 0x00, + // 2292 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, + 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0xc3, + 0x55, 0xce, 0xc9, 0x1d, 0x0e, 0xf8, 0xae, 0xe0, 0x48, 0xdd, 0x5d, 0xf0, 0x1f, 0xc5, 0x31, 0xc4, + 0x56, 0x58, 0x29, 0x49, 0x91, 0x2a, 0x2a, 0xac, 0xb5, 0x23, 0x4b, 0xe7, 0xd5, 0x8e, 0x6e, 0x77, + 0xe4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xf0, 0xc2, 0x2b, 0x45, 0xf1, 0xc0, 0x03, 0xdf, + 0x83, 0x17, 0x0a, 0xf8, 0x06, 0x54, 0xa8, 0xe2, 0x89, 0x0f, 0x41, 0xcd, 0x9f, 0xdd, 0x9d, 0x5d, + 0xed, 0xca, 0xae, 0xba, 0x37, 0x75, 0x4f, 0x77, 0x4f, 0x77, 0xff, 0x7a, 0xba, 0x67, 0x56, 0xb0, + 0x36, 0xf6, 0x29, 0xa3, 0xc1, 0x03, 0xba, 0xd3, 0xa3, 0x1e, 0xf3, 0xa9, 0xbb, 0x2d, 0x18, 0xa8, + 0x1a, 0x31, 0xf0, 0x1a, 0xac, 0xb6, 0x2e, 0x88, 0xc7, 0x5e, 0x1f, 0x93, 0x80, 0x06, 0x4f, 0x88, + 0xed, 0xb3, 0x53, 0x62, 0x33, 0xbc, 0x04, 0x8b, 0x1d, 0x66, 0xb3, 0x49, 0x60, 0x91, 0x6f, 0x26, + 0x24, 0x60, 0xf8, 0x14, 0x6a, 0x21, 0x63, 0xec, 0x5e, 0xa2, 0x55, 0x28, 0x05, 0xcc, 0x66, 0xc4, + 0x34, 0x36, 0x8d, 0xad, 0xaa, 0x25, 0x09, 0xf4, 0x25, 0x2c, 0x06, 0x42, 0xe8, 0xf9, 0xd8, 0xb1, + 0x19, 0x09, 0xcc, 0xc2, 0xe6, 0xfc, 0x56, 0x6d, 0xe7, 0xd6, 0x76, 0xec, 0x41, 0x47, 0x5b, 0xb7, + 0x92, 0xd2, 0xf8, 0xef, 0x06, 0x2c, 0xe8, 0xeb, 0xe8, 0x53, 0x28, 0xb9, 0xe4, 0x82, 0xb8, 0x62, + 0x97, 0xfa, 0xce, 0xfb, 0x39, 0x76, 0xb6, 0x9f, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x23, 0xa8, 0x8f, + 0x12, 0xc1, 0x98, 0x85, 0x4d, 0x63, 0xab, 0xb6, 0x73, 0x47, 0xd3, 0xce, 0x8a, 0xf9, 0xc9, 0x9c, + 0x95, 0x52, 0xc4, 0x9f, 0x41, 0x49, 0x98, 0x46, 0x55, 0x28, 0x1d, 0xb4, 0xf6, 0x9e, 0x1f, 0x36, + 0xe6, 0x50, 0x05, 0x8a, 0x47, 0x27, 0x8f, 0xdb, 0x0d, 0x03, 0xd5, 0xa0, 0xfc, 0x72, 0xd7, 0x3a, + 0x39, 0x3a, 0x39, 0x6c, 0x14, 0xb8, 0x44, 0xcb, 0xb2, 0xda, 0x56, 0x63, 0x7e, 0xaf, 0x0c, 0x25, + 0x61, 0x1f, 0xaf, 0xc3, 0xad, 0x43, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, 0xf9, 0x91, + 0xd7, 0xa7, 0x61, 0x3a, 0xff, 0x64, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, 0x2e, 0x47, + 0xf6, 0xd7, 0xd4, 0x17, 0x51, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xf0, 0x9e, 0x73, + 0x39, 0xc1, 0xb9, 0x63, 0x9b, 0xf5, 0x06, 0xe6, 0xbc, 0xe4, 0x0a, 0x82, 0x73, 0x4f, 0x27, 0x43, + 0xd7, 0x31, 0x8b, 0x12, 0x0d, 0x41, 0xa0, 0x4d, 0xa8, 0x8d, 0x7d, 0xea, 0x4c, 0x7a, 0xec, 0xc4, + 0x1e, 0x11, 0xb3, 0x24, 0xd6, 0x74, 0x16, 0xda, 0x00, 0xb8, 0x90, 0x4e, 0x74, 0x98, 0x6f, 0xde, + 0x10, 0x02, 0x1a, 0x07, 0xff, 0xae, 0x00, 0x37, 0xa7, 0x23, 0xe0, 0xf8, 0x6f, 0x42, 0xad, 0x1f, + 0x71, 0x1d, 0x55, 0x05, 0x3a, 0x0b, 0x7d, 0x02, 0xcb, 0xc4, 0xbb, 0x18, 0xfa, 0xd4, 0x1b, 0x11, + 0x8f, 0x05, 0xfb, 0x74, 0xe2, 0x31, 0x15, 0xcb, 0xf4, 0x02, 0xf7, 0x84, 0xd9, 0xc1, 0xb9, 0x12, + 0x93, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0x68, 0x10, 0x1a, 0x2f, + 0x49, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x80, 0xd9, 0x5e, 0x8f, 0x88, 0x14, 0xc8, 0x08, + 0x13, 0x3c, 0xf4, 0x09, 0x94, 0x55, 0xc4, 0x66, 0x59, 0xd4, 0x09, 0xd2, 0xea, 0x44, 0x41, 0x64, + 0x85, 0x22, 0xf8, 0x1e, 0x2c, 0x75, 0x89, 0xed, 0x3b, 0xf4, 0x8d, 0xa7, 0xa0, 0x44, 0x6b, 0x70, + 0xc3, 0x27, 0x76, 0x40, 0x3d, 0x95, 0x05, 0x45, 0xf1, 0x23, 0x14, 0x8b, 0x8e, 0xdd, 0x4b, 0x6c, + 0xc2, 0xda, 0x21, 0x61, 0x2d, 0x2d, 0xf6, 0xb0, 0x1a, 0xde, 0xc2, 0xea, 0xd4, 0xca, 0xf5, 0xb2, + 0xfc, 0x15, 0x2c, 0xe8, 0xc9, 0x54, 0x07, 0xae, 0xa9, 0x97, 0x7a, 0xbc, 0x2c, 0xe0, 0x4b, 0xc8, + 0xe3, 0x7f, 0x19, 0xb0, 0x94, 0x92, 0x40, 0x75, 0x28, 0x0c, 0xc3, 0xcd, 0x0a, 0x43, 0x51, 0x47, + 0x3d, 0x9f, 0xd8, 0x8c, 0x38, 0x2f, 0x07, 0xc4, 0x13, 0x18, 0x56, 0x2d, 0x9d, 0x15, 0xa3, 0x33, + 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x81, 0xa0, 0x59, 0x14, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, 0x50, 0x9f, + 0x75, 0xed, 0x40, 0x56, 0x94, 0x14, 0x43, 0x4d, 0xa8, 0xf8, 0x94, 0x32, 0x8b, 0xba, 0x61, 0xb1, + 0x46, 0x34, 0xba, 0x0f, 0x8d, 0xde, 0xc4, 0xf7, 0x89, 0xc7, 0xac, 0x89, 0x77, 0x32, 0x19, 0x9d, + 0x12, 0x59, 0xaf, 0x8b, 0xd6, 0x14, 0x1f, 0xef, 0xc3, 0xcd, 0x13, 0xf2, 0x46, 0x8b, 0x2a, 0x44, + 0xea, 0x3e, 0x34, 0x78, 0xda, 0xfa, 0x2e, 0x7d, 0xd3, 0x25, 0xa3, 0xb1, 0x1b, 0xf7, 0xaf, 0x29, + 0x3e, 0xee, 0xc0, 0x4a, 0xda, 0x08, 0x47, 0xe4, 0x0b, 0xa8, 0x69, 0xf9, 0x13, 0xda, 0xb3, 0xd3, + 0xad, 0x8b, 0xe3, 0x8f, 0xc4, 0x71, 0xca, 0xf0, 0x2c, 0x95, 0x72, 0xfc, 0x6b, 0x03, 0x56, 0xd2, + 0x92, 0xdf, 0x7a, 0x7b, 0xf4, 0x00, 0x2a, 0x61, 0x9c, 0xaa, 0x27, 0xae, 0x68, 0xaa, 0x3c, 0xcf, + 0x42, 0x27, 0x12, 0xc2, 0xff, 0x30, 0x60, 0x7d, 0x5f, 0x2e, 0x5f, 0xed, 0x34, 0x7a, 0x04, 0x45, + 0x76, 0x39, 0x26, 0xc2, 0x74, 0x7d, 0xe7, 0x63, 0xcd, 0x74, 0xae, 0x8d, 0xed, 0xf6, 0x98, 0xab, + 0x58, 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0xb4, 0xdb, 0xcf, 0x1a, 0x73, 0x08, + 0x41, 0xbd, 0xd3, 0xdd, 0xb5, 0xba, 0xaf, 0x77, 0xf7, 0xbb, 0x47, 0x2f, 0x8e, 0xba, 0x3f, 0x6f, + 0x18, 0x68, 0x19, 0x16, 0x3b, 0xdd, 0xf6, 0xb3, 0x98, 0x55, 0x40, 0x8b, 0x50, 0xdd, 0x6f, 0x9f, + 0x3c, 0x3e, 0x3a, 0x7c, 0x6e, 0xb5, 0x1a, 0xf3, 0xbc, 0x1b, 0x5b, 0xad, 0x4e, 0xab, 0xdb, 0x28, + 0xa2, 0x05, 0xa8, 0x1c, 0xb6, 0x5f, 0xcb, 0xde, 0x5c, 0xc2, 0xe7, 0x70, 0x2b, 0xcb, 0x19, 0x9e, + 0xdb, 0x74, 0x38, 0x51, 0x51, 0x17, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x9c, 0x42, 0xfc, 0xbd, + 0x01, 0xe6, 0x31, 0x75, 0x86, 0xfd, 0xcb, 0x6b, 0x65, 0x0f, 0xe8, 0x98, 0xf8, 0x36, 0x1b, 0x52, + 0x2f, 0x3c, 0xc7, 0x77, 0xb2, 0x91, 0x6d, 0x87, 0x72, 0x96, 0xa6, 0x82, 0xee, 0x42, 0xdd, 0x27, + 0x3d, 0xea, 0xf5, 0x87, 0x67, 0x13, 0x9f, 0xec, 0xba, 0xae, 0xf0, 0xab, 0x62, 0xa5, 0xb8, 0xf8, + 0x8f, 0x06, 0xac, 0x66, 0x19, 0x43, 0x0f, 0x15, 0x7e, 0x72, 0xd8, 0xde, 0xbd, 0x62, 0xef, 0x04, + 0x74, 0xf2, 0xec, 0xba, 0xb2, 0xcb, 0x16, 0xc2, 0xb3, 0x2b, 0x69, 0xfc, 0xfd, 0x0c, 0x58, 0x97, + 0xa0, 0x66, 0xb5, 0x8e, 0xdb, 0x2f, 0x5a, 0xaf, 0xad, 0xf6, 0x53, 0x8e, 0xd8, 0x02, 0x54, 0x76, + 0x0f, 0x0e, 0x24, 0x55, 0xc4, 0xbf, 0x31, 0x60, 0x2d, 0x23, 0x73, 0x1c, 0xa6, 0x9f, 0x42, 0xa3, + 0x6f, 0x0f, 0x5d, 0xe2, 0xb4, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0xa1, 0x30, + 0x8d, 0xb9, 0xde, 0xc8, 0xf0, 0x11, 0xac, 0x1f, 0x90, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, + 0xea, 0x39, 0x21, 0xe3, 0xae, 0xe8, 0x7c, 0x05, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, + 0xe2, 0x81, 0xfd, 0x04, 0x96, 0x7b, 0x2e, 0xb1, 0xbd, 0x89, 0x14, 0x15, 0x4c, 0x75, 0xc2, 0x6f, + 0xeb, 0x67, 0x29, 0x2d, 0x63, 0x4d, 0xab, 0xe1, 0xff, 0x1a, 0xb0, 0x98, 0xe8, 0xb1, 0x08, 0x41, + 0xd1, 0xe3, 0xe0, 0x48, 0x47, 0xc5, 0x6f, 0x3e, 0xb9, 0x5c, 0xda, 0x3b, 0x27, 0x8e, 0xf2, 0x53, + 0x51, 0x9c, 0xcf, 0x3b, 0xf2, 0x91, 0xa3, 0xd2, 0xa0, 0x28, 0xce, 0x97, 0x17, 0x36, 0x35, 0x85, + 0x15, 0x15, 0x67, 0xad, 0xa4, 0x9f, 0x94, 0xdb, 0x50, 0xed, 0xb9, 0x76, 0x10, 0x68, 0x93, 0x37, + 0x66, 0xa0, 0x16, 0xd4, 0x1d, 0x32, 0x76, 0xe9, 0x65, 0xd8, 0xaa, 0xd4, 0xf4, 0xd5, 0xef, 0x78, + 0xdc, 0xf9, 0x83, 0x84, 0x90, 0x95, 0x52, 0xe2, 0x8d, 0x12, 0x4d, 0x8b, 0xf1, 0x72, 0xe4, 0xd7, + 0x00, 0x2d, 0xe2, 0x88, 0x46, 0x26, 0x94, 0xed, 0x33, 0x2e, 0x18, 0x02, 0x1f, 0x92, 0x7c, 0x85, + 0xf6, 0xfb, 0xc4, 0x8f, 0x02, 0x0f, 0x49, 0x7e, 0xd1, 0x20, 0x6f, 0x49, 0x6f, 0xc2, 0x28, 0x5f, + 0x94, 0xd1, 0x6b, 0x1c, 0xbc, 0x0c, 0x4b, 0x87, 0x84, 0x29, 0x00, 0xe4, 0x4c, 0x7f, 0x04, 0x8b, + 0x31, 0x8b, 0xe3, 0x1b, 0x8d, 0x43, 0xe3, 0x5a, 0xe3, 0x10, 0x6f, 0x41, 0x5d, 0x19, 0xd0, 0x6e, + 0x1a, 0x0a, 0x17, 0x43, 0xc7, 0x05, 0xff, 0x10, 0x16, 0x22, 0x49, 0xbe, 0xd3, 0x47, 0x50, 0xe4, + 0x2b, 0xaa, 0x78, 0x56, 0x52, 0x19, 0x15, 0x7b, 0x08, 0x01, 0xdc, 0x82, 0x45, 0xce, 0xd9, 0xe7, + 0xa8, 0xe4, 0x56, 0x09, 0x1f, 0xff, 0x52, 0xfd, 0x98, 0x3a, 0x24, 0x1a, 0xff, 0x31, 0x0b, 0xff, + 0x0a, 0x6a, 0xfb, 0x74, 0x34, 0xb2, 0x3d, 0x47, 0x18, 0x69, 0xc0, 0x3c, 0xf1, 0x2e, 0x44, 0x98, + 0x55, 0x8b, 0xff, 0x14, 0x05, 0x32, 0x20, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x7b, 0x61, 0xbb, + 0x93, 0xe8, 0xb0, 0x09, 0x82, 0x97, 0x8d, 0xed, 0x9f, 0x4d, 0xe4, 0x75, 0xa6, 0x28, 0x6c, 0xc4, + 0x0c, 0xee, 0xe0, 0x24, 0x20, 0xbe, 0xaa, 0x34, 0xf1, 0x1b, 0x1f, 0x43, 0x6d, 0x7f, 0x60, 0x7b, + 0x1e, 0x71, 0x73, 0x63, 0x40, 0xda, 0x68, 0xaa, 0xaa, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x11, 0x16, + 0x57, 0x39, 0xa7, 0xf0, 0xff, 0x0a, 0x50, 0x89, 0x8e, 0xcd, 0x0f, 0xa0, 0x1a, 0x70, 0x70, 0x44, + 0x85, 0xca, 0x7c, 0xe6, 0x03, 0x17, 0x8b, 0x72, 0xbd, 0x5e, 0x98, 0x55, 0x35, 0x6b, 0xcd, 0x14, + 0x0e, 0x51, 0xd6, 0xad, 0x58, 0x14, 0xfd, 0x18, 0x96, 0x86, 0xde, 0x29, 0x9d, 0x78, 0x8e, 0x0a, + 0x29, 0x30, 0xe7, 0x45, 0xb9, 0xac, 0xe9, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x3d, 0x68, + 0xd0, 0x09, 0x4b, 0x9a, 0x28, 0xce, 0x34, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, + 0x64, 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x07, 0x8f, 0x57, 0xd6, 0x33, 0x9b, 0x0d, 0xd4, + 0x99, 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x2e, 0x8e, 0x1c, 0x71, 0xd2, 0xab, 0x96, 0x24, 0xf0, 0x03, + 0x58, 0x49, 0xb6, 0x34, 0x59, 0xeb, 0x26, 0x94, 0x65, 0x75, 0x07, 0xaa, 0x90, 0x42, 0x12, 0xff, + 0xd6, 0x80, 0xe5, 0xa9, 0x26, 0x88, 0x1e, 0x42, 0xed, 0x7c, 0xe8, 0xba, 0xc4, 0xe9, 0x5e, 0xeb, + 0x8c, 0xe9, 0xc2, 0xe8, 0x0b, 0x58, 0xf0, 0x27, 0x9e, 0x37, 0xf4, 0xce, 0xc2, 0xae, 0x3d, 0x5b, + 0x39, 0x21, 0x8d, 0xf7, 0xc5, 0xd9, 0xe7, 0xb7, 0xa7, 0xc8, 0xf9, 0x28, 0x52, 0x43, 0x8b, 0x94, + 0xe7, 0x66, 0x6c, 0xb3, 0x41, 0x67, 0x4c, 0x7a, 0xe1, 0x8c, 0x0c, 0x69, 0xfc, 0x57, 0x03, 0x2a, + 0xe1, 0x05, 0x2c, 0xaf, 0x57, 0xab, 0xde, 0x5b, 0xc8, 0xee, 0xbd, 0x89, 0xab, 0x77, 0x13, 0x2a, + 0xfd, 0x89, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0xa5, 0x44, 0x66, 0xd1, 0x3d, + 0x28, 0xf1, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x2f, 0x87, 0x52, 0x02, 0x3f, 0x14, 0xdd, + 0x4d, 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x0e, 0x09, 0x7b, + 0x99, 0xba, 0x72, 0x47, 0xd9, 0xdb, 0x84, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, 0x18, 0xf1, 0xc3, + 0x57, 0x95, 0xce, 0x42, 0x5b, 0xb0, 0xe4, 0x93, 0x8b, 0x21, 0x7f, 0x91, 0x85, 0x52, 0x32, 0x2b, + 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0x9e, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, 0x8d, 0x48, 0x67, + 0x89, 0x71, 0xe0, 0xba, 0x5d, 0xfb, 0x4c, 0x4e, 0xb5, 0x8a, 0x15, 0x92, 0xf8, 0x14, 0x56, 0xd3, + 0x3e, 0x86, 0xf0, 0x70, 0x67, 0x42, 0x78, 0xf8, 0x6f, 0x51, 0xf7, 0xe1, 0x93, 0x42, 0x61, 0x1b, + 0xd2, 0xe2, 0x6e, 0xa4, 0xdc, 0x52, 0x28, 0x45, 0x34, 0xfe, 0x1a, 0xd6, 0xb3, 0x53, 0xc1, 0x73, + 0x7a, 0x0c, 0xcb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0xcb, 0x49, 0x6b, 0x5a, 0x13, 0x23, 0x68, + 0x3c, 0x1d, 0x06, 0xfc, 0xb6, 0x41, 0xb5, 0xcf, 0x3a, 0x15, 0x4e, 0xe7, 0x96, 0x9d, 0x09, 0x65, + 0x87, 0xf4, 0xed, 0x89, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x8e, 0x81, 0xfa, 0x69, 0x25, 0x83, 0x4b, + 0xb3, 0xf1, 0x37, 0x50, 0xd7, 0xf6, 0x0d, 0x8b, 0x85, 0x53, 0x59, 0xc5, 0xa2, 0xbc, 0xb1, 0xa4, + 0x04, 0xfa, 0x0c, 0x6e, 0x9e, 0xb9, 0xf4, 0xd4, 0x76, 0x0f, 0x52, 0x9b, 0xc9, 0x2c, 0x67, 0x2f, + 0xe2, 0x13, 0xa8, 0xef, 0x3a, 0x0e, 0xb7, 0x15, 0x16, 0x55, 0x56, 0x70, 0x19, 0x21, 0x14, 0xb2, + 0x43, 0xf8, 0x0a, 0x16, 0x22, 0x7b, 0x72, 0x96, 0x23, 0x8f, 0xbc, 0x49, 0xbb, 0x24, 0x6d, 0x67, + 0xac, 0xe0, 0x7b, 0xb0, 0x6c, 0x91, 0x11, 0xbd, 0x20, 0xba, 0x4b, 0xab, 0x50, 0x1a, 0x7a, 0x0e, + 0x79, 0x1b, 0x7e, 0xf7, 0x11, 0x04, 0xfe, 0x11, 0x2c, 0xe9, 0xa2, 0x7c, 0xb7, 0xbb, 0x50, 0xd7, + 0x6d, 0x46, 0xa5, 0x97, 0xe2, 0xe2, 0x8f, 0x61, 0xc5, 0x22, 0x7d, 0x9f, 0x04, 0x03, 0x1d, 0xe3, + 0x9c, 0x7d, 0xbe, 0x0b, 0x37, 0x3b, 0x84, 0x69, 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0x3b, 0x1d, 0xc2, + 0x0e, 0xb3, 0xb2, 0x1d, 0x2a, 0xea, 0x75, 0x6e, 0xa4, 0xea, 0xfc, 0x67, 0xf0, 0x7e, 0x87, 0x88, + 0x6d, 0x72, 0x94, 0x33, 0x77, 0x4d, 0x98, 0x2c, 0xa4, 0x4c, 0x96, 0xa1, 0xd4, 0x1a, 0x8d, 0xd9, + 0xe5, 0xce, 0x5f, 0x16, 0xa1, 0xac, 0x1e, 0x75, 0x68, 0x1f, 0x6a, 0x5d, 0xdf, 0xee, 0x9d, 0xcb, + 0xcf, 0x83, 0xc8, 0x9c, 0xfa, 0x62, 0xa8, 0xf6, 0x6b, 0xae, 0x65, 0xac, 0xf0, 0x9b, 0xf3, 0xdc, + 0xf7, 0x0c, 0xf4, 0x0a, 0x1a, 0xe9, 0xaf, 0x5e, 0x08, 0x6b, 0xf2, 0x39, 0x1f, 0xf5, 0x9a, 0x9b, + 0x33, 0x65, 0x84, 0x75, 0xb4, 0x07, 0x95, 0xf0, 0xab, 0x10, 0xd2, 0x1f, 0xee, 0xa9, 0xaf, 0x4a, + 0x4d, 0x33, 0x73, 0x4d, 0xda, 0x78, 0x29, 0x26, 0x8e, 0xfe, 0xb9, 0x08, 0x7d, 0x90, 0xdc, 0x3a, + 0xe3, 0x23, 0x53, 0xf3, 0xce, 0x2c, 0x11, 0x69, 0xb8, 0x0b, 0xf5, 0xe4, 0x47, 0x0f, 0xa4, 0x87, + 0x94, 0xf9, 0x51, 0xa5, 0xb9, 0x31, 0x43, 0x22, 0xb2, 0x9a, 0xdc, 0x0f, 0x6d, 0xe6, 0xba, 0x92, + 0x65, 0x35, 0xe3, 0x43, 0x08, 0x9e, 0x43, 0xbf, 0x04, 0x34, 0xfd, 0x92, 0x47, 0x1f, 0x5e, 0xe7, + 0xab, 0x43, 0x13, 0x5f, 0x21, 0x25, 0x77, 0xf8, 0x05, 0x2c, 0x4f, 0xbd, 0x41, 0xd1, 0x77, 0x34, + 0xd5, 0xbc, 0xb7, 0x7d, 0xf3, 0x83, 0xd9, 0x42, 0x51, 0x00, 0xd3, 0x4f, 0xc1, 0x44, 0x00, 0xb9, + 0x8f, 0xce, 0x44, 0x00, 0x39, 0xef, 0x49, 0x59, 0x6b, 0xe1, 0x13, 0x24, 0x51, 0x6b, 0xa9, 0xa7, + 0x4a, 0xa2, 0xd6, 0x12, 0x6f, 0x16, 0x3c, 0x87, 0x1e, 0x41, 0x59, 0xb1, 0xd0, 0xfa, 0xb4, 0x58, + 0x68, 0xe1, 0x56, 0xd6, 0x92, 0x34, 0x70, 0x02, 0x0b, 0xfa, 0x6d, 0x0d, 0x6d, 0xe4, 0xbe, 0x65, + 0xa5, 0xa9, 0x99, 0x6f, 0xdd, 0x28, 0x28, 0x71, 0xf3, 0x48, 0x07, 0xa5, 0xdf, 0xc1, 0xd2, 0x41, + 0xc5, 0x57, 0x15, 0x3c, 0x87, 0xfa, 0xe2, 0x7b, 0xeb, 0xd4, 0xd4, 0x45, 0x77, 0x93, 0x3a, 0x79, + 0x37, 0x94, 0xe6, 0x87, 0x57, 0xca, 0xc9, 0x7d, 0x5a, 0x50, 0x8d, 0x26, 0x1f, 0x7a, 0x4f, 0x53, + 0x4a, 0xcf, 0xe1, 0xe6, 0x7a, 0xf6, 0x62, 0x84, 0x81, 0x9a, 0x3e, 0x09, 0x0c, 0x92, 0x13, 0x2e, + 0x81, 0x81, 0x3e, 0xac, 0xf0, 0x1c, 0x7a, 0x02, 0x10, 0xcf, 0x14, 0x74, 0x3b, 0x31, 0x6e, 0x53, + 0x53, 0xa9, 0xd9, 0xcc, 0x59, 0x0d, 0xb3, 0xbf, 0xa0, 0x8f, 0x98, 0x04, 0x9a, 0x19, 0xb3, 0xa7, + 0xd9, 0xd0, 0xbf, 0xc9, 0xf0, 0x6e, 0x8d, 0xe7, 0xd0, 0x63, 0xa8, 0x27, 0x27, 0x4f, 0xa2, 0x1f, + 0x64, 0x0e, 0xa5, 0x4c, 0x3b, 0xaf, 0xc0, 0xcc, 0x1b, 0x49, 0xe8, 0x7e, 0xd2, 0xe2, 0xac, 0xb9, + 0x95, 0x69, 0xfb, 0x05, 0xac, 0x65, 0xcf, 0x2b, 0xb4, 0x95, 0xb4, 0x9c, 0x3f, 0xd2, 0xb2, 0xec, + 0xee, 0x7d, 0xfe, 0xb7, 0x77, 0x1b, 0xc6, 0x3f, 0xdf, 0x6d, 0x18, 0xff, 0x7e, 0xb7, 0x61, 0xfc, + 0xe1, 0x3f, 0x1b, 0x73, 0x80, 0x7b, 0x83, 0xed, 0x1e, 0xf1, 0xbd, 0x6d, 0xdb, 0x1d, 0xf6, 0xc8, + 0x36, 0xdd, 0xd9, 0x0e, 0x75, 0xfc, 0x71, 0x2f, 0x20, 0xfe, 0x05, 0xf1, 0x5f, 0x15, 0xc6, 0xa7, + 0xa7, 0x37, 0xc4, 0x7f, 0x77, 0x9f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xef, 0x3e, 0xd0, 0xb5, + 0xd5, 0x1b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5840,16 +5840,6 @@ func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) i += copy(dAtA[i:], m.DefaultRevision) } - if m.IsGlobalDefaultRevision { - dAtA[i] = 0x20 - i++ - if m.IsGlobalDefaultRevision { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -5883,6 +5873,12 @@ func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { i += n } } + if len(m.GlobalDefaultRevision) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + i += copy(dAtA[i:], m.GlobalDefaultRevision) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -7084,9 +7080,6 @@ func (m *RepoInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.IsGlobalDefaultRevision { - n += 2 - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7105,6 +7098,10 @@ func (m *ListReposReply) Size() (n int) { n += 1 + l + sovO2Control(uint64(l)) } } + l = len(m.GlobalDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -12639,26 +12636,6 @@ func (m *RepoInfo) Unmarshal(dAtA []byte) error { } m.DefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field IsGlobalDefaultRevision", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.IsGlobalDefaultRevision = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -12747,6 +12724,38 @@ func (m *ListReposReply) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 923c1cb7a..53e8ea725 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -305,11 +305,11 @@ message RepoInfo { string name = 1; bool default = 2; string defaultRevision = 3; - bool isGlobalDefaultRevision = 4; } message ListReposReply { repeated RepoInfo repos = 1; + string globalDefaultRevision = 2; } message AddRepoRequest { diff --git a/core/repos/repo.go b/core/repos/repo.go index 49394ccc1..76c411a09 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -51,13 +51,11 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { var repoUrlSlice []string var revision string - //TODO: Decide between global and per-repo default revision - //defaultRevision := viper.GetString("globalDefaultRevision") - - if len(revSlice) == 2 { //revision specified + if len(revSlice) == 2 { //revision specified in the repo path repoUrlSlice = strings.Split(revSlice[0], "/") revision = revSlice[1] - } else if len(revSlice) == 1 { //no revision specified + log.Warning("Using revision : " + revision + " from repo path: " + repoPath) + } else if len(revSlice) == 1 { //no revision specified in the repo path repoUrlSlice = strings.Split(revSlice[0], "/") revision = defaultRevision } else { diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index ddbb78598..cae7a6d2c 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -80,6 +80,8 @@ func initializeRepos(service *confsys.Service) *RepoManager { if err != nil { log.Warning("Failed to parse default_revision from backend") rm.defaultRevision = viper.GetString("globalDefaultRevision") + } else { + viper.Set("globalDefaultRevision", rm.defaultRevision) } // Get default repo @@ -154,6 +156,8 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { } // Decide if revision = defaultRevision -> if yes lock them together + // We do this because, in the case where the revision was not specified, it would fall back to the default revision + // As a result, subsequent changes to the default revision should be followed by revision revIsDefault := false if repo.DefaultRevision == repo.Revision { revIsDefault = true @@ -168,7 +172,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { return err } else if len(matchedRevs) == 0 { log.Warning("Default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) - if repo.DefaultRevision != manager.defaultRevision { + if repo.DefaultRevision != manager.defaultRevision { //TODO: This check implies that repo.DefaultRevision might be different to the global on. This is not the case yet but it stays here for reference. log.Warning("Defaulting to global default revision: " + manager.defaultRevision) repo.DefaultRevision = manager.defaultRevision matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) @@ -479,7 +483,7 @@ func (manager *RepoManager) SetGlobalDefaultRevision(revision string) error { return err } - viper.Set("globalDefaultRevision", revision) //TODO: Do I need this? + viper.Set("globalDefaultRevision", revision) manager.defaultRevision = revision return nil } @@ -501,7 +505,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er reposRequired := make(map[Repo]bool) for _, taskClass := range taskClassesRequired { var newRepo *Repo - newRepo, err = NewRepo(taskClass, manager.defaultRevision) + newRepo, err = NewRepo(taskClass, manager.defaultRevision) //TODO: To be replaced by the repo's revision; not done now because it would break if err != nil { return } @@ -559,9 +563,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat if revisionPattern != "" { // If the revision pattern is specified and an all{Branches,Tags} flag is used return error return nil, 0, errors.New("cannot use all{Branches,Tags} with a revision specified") } - }/*else if revisionPattern == "" { // default revision if unspecified - revisionPattern = "" - }*/ + } // Prepare the gitRefs slice which will filter the git references var gitRefs []string diff --git a/core/server.go b/core/server.go index 5ef1a9d45..c29d0b559 100644 --- a/core/server.go +++ b/core/server.go @@ -524,11 +524,10 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p for i, repoName := range keys { repo := repoList[repoName] - isGlobalDefaultRevision := repo.DefaultRevision == viper.GetString("globalDefaultRevision") - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision, IsGlobalDefaultRevision: isGlobalDefaultRevision} + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision} } - return &pb.ListReposReply{Repos: repoInfos}, nil + return &pb.ListReposReply{Repos: repoInfos, GlobalDefaultRevision: viper.GetString("globalDefaultRevision")}, nil } func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { From 5d5e386e0fcc60712efdf437218c742dfc7d2f1e Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 7 Feb 2020 16:19:54 +0100 Subject: [PATCH 0085/2352] [coconut] Cleaner var declaration --- coconut/control/control.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 6ce562cee..f619eff00 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -654,8 +654,7 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, // AddRepo add a new repository to the available git repositories used for configuration and checks it out. func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - var name string - defaultRevision := "" + name, defaultRevision := "", "" if len(args) == 1 { name = args[0] } else if len(args) == 2 { From 0d760c18c48e47c3a2f1d4960a1d19684f5820c5 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 7 Feb 2020 16:26:16 +0100 Subject: [PATCH 0086/2352] [coconut] s/fmt.Sprintf// for repo commands --- coconut/cmd/repo_add.go | 5 +---- coconut/cmd/repo_default.go | 5 +---- coconut/cmd/repo_default_revision.go | 5 +---- coconut/cmd/repo_list.go | 5 +---- coconut/cmd/repo_refresh.go | 5 +---- coconut/cmd/repo_remove.go | 5 +---- 6 files changed, 6 insertions(+), 24 deletions(-) diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index f4b6435fa..3f8bd958c 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -36,8 +34,7 @@ var repoAddCmd = &cobra.Command{ Use: "add", Aliases: []string{"new", "a"}, Short: "add a new git repository", - Long: fmt.Sprintf(`The repository add command adds a git repository -to the catalogue of repositories used for task and workflow configuration.`), + Long: "The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration.", Run: control.WrapCall(control.AddRepo), } diff --git a/coconut/cmd/repo_default.go b/coconut/cmd/repo_default.go index f82eabaea..169eaa9f2 100644 --- a/coconut/cmd/repo_default.go +++ b/coconut/cmd/repo_default.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -35,8 +33,7 @@ import ( var repoDefaultCmd = &cobra.Command{ Use: "default", Short: "set a git repository as default", - Long: fmt.Sprintf(`The repository default command sets a git repository -as the default repository for incoming workflow deployment requests.`), + Long: "The repository default command sets a git repository as the default repository for incoming workflow deployment requests.", Run: control.WrapCall(control.SetDefaultRepo), } diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index fd027b882..e95922d0c 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -35,8 +33,7 @@ import ( var repoDefaultRevisionCmd = &cobra.Command{ Use: "default-revision", Short: "set default global and per-repository revision", - Long: fmt.Sprintf(`The repository default-revision command sets the global default -repository revision as well as the per-repository default revision.`), + Long: "The repository default-revision command sets the global default repository revision as well as the per-repository default revision.", Run: control.WrapCall(control.SetDefaultRevision), } diff --git a/coconut/cmd/repo_list.go b/coconut/cmd/repo_list.go index 3dd63f27b..7bf9d5a3d 100644 --- a/coconut/cmd/repo_list.go +++ b/coconut/cmd/repo_list.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -36,8 +34,7 @@ var repoListCmd = &cobra.Command{ Use: "list", Aliases: []string{"l"}, Short: "list git repositories", - Long: fmt.Sprintf(`The repostory list command lists available git repositories -to be used for task and workflow configuration.`), + Long: "The repostory list command lists available git repositories to be used for task and workflow configuration.", Run: control.WrapCall(control.ListRepos), } diff --git a/coconut/cmd/repo_refresh.go b/coconut/cmd/repo_refresh.go index c73610f3b..672e86684 100644 --- a/coconut/cmd/repo_refresh.go +++ b/coconut/cmd/repo_refresh.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -36,8 +34,7 @@ var repoRefreshCmd = &cobra.Command{ Use: "refresh", Aliases: []string{"update", "u"}, Short: "refresh git repositories", - Long: fmt.Sprintf(`The repository refresh command makes sure -all git repositories used for task and workflow configuration are up to date.`), + Long: "The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date.", Run: control.WrapCall(control.RefreshRepos), } diff --git a/coconut/cmd/repo_remove.go b/coconut/cmd/repo_remove.go index c970a326e..14b8163e4 100644 --- a/coconut/cmd/repo_remove.go +++ b/coconut/cmd/repo_remove.go @@ -25,8 +25,6 @@ package cmd import ( - "fmt" - "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -36,8 +34,7 @@ var repoRemoveCmd = &cobra.Command{ Use: "remove", Aliases: []string{"r", "delete", "d"}, Short: "remove a git repository", - Long: fmt.Sprintf(`The repository remove command removes a git repository -from the catalogue of workflow configuration sources.`), + Long: "The repository remove command removes a git repository from the catalogue of workflow configuration sources.", Run: control.WrapCall(control.RemoveRepo), } From 23fe23c2ad16319b50fea6a01be14005dd006d9b Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 10 Feb 2020 16:27:22 +0100 Subject: [PATCH 0087/2352] [core] Support perisistent default revisions per repo --- coconut/cmd/repo.go | 8 ++--- coconut/cmd/repo_default_revision.go | 2 +- coconut/cmd/repo_remove.go | 2 +- core/config.go | 1 + core/confsys/service.go | 36 ++++++++++++++++++++ core/repos/repomanager.go | 49 +++++++++++++++++++++------- 6 files changed, 81 insertions(+), 17 deletions(-) diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index e704688c9..be7f555be 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -48,16 +48,16 @@ gitlab.cern.ch/tmrnjava/AliECS_conf/ By default, all short task and workflow names are assumed to be in the default repository (see ` + "`coconut repo list`" + ` command). -Any workflow from any repository can be loaded by providing a full and unique path (the ` + "`workflows`" + ` directory is omitted from the loading path as it's name and existence is enforced by convention when we know we're dealing with workflows), e.g. the following two are different workflows: +Any workflow from any repository can be loaded by providing a full and unique path, e.g. the following two are different workflows: ` + "```" + ` -github.com/AliceO2Group/ControlWorkflows/readout-qc-1 -gitlab.cern.ch/tmrnjava/AliECS_conf/readout-qc-1 +github.com/AliceO2Group/ControlWorkflows/workflows/readout-qc-1 +gitlab.cern.ch/tmrnjava/AliECS_conf/workflows/readout-qc-1 ` + "```" + ` By default a workflow is loaded from its state at HEAD in the master branch. A request to load a workflow can further be qualified with a branch, tag or commit hash: ` + "```" + ` readout-qc-1@readout-testing -gitlab.cern.ch/tmrnjava/AliECS_conf/readout-qc-1@5c7f1c1f +gitlab.cern.ch/tmrnjava/AliECS_conf/workflows/readout-qc-1@5c7f1c1f ` + "```" + ` Make sure to run ` + "`coconut repo refresh`" + ` if you make changes to a configuration repository.`, diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index e95922d0c..2d0c82dc9 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019 CERN and copyright holders of ALICE O². + * Copyright 2020 CERN and copyright holders of ALICE O². * Author: Kostas Alexopoulos * * This program is free software: you can redistribute it and/or modify diff --git a/coconut/cmd/repo_remove.go b/coconut/cmd/repo_remove.go index 14b8163e4..a58388e62 100644 --- a/coconut/cmd/repo_remove.go +++ b/coconut/cmd/repo_remove.go @@ -32,7 +32,7 @@ import ( // repoRemoveCmd represents the repo remove command var repoRemoveCmd = &cobra.Command{ Use: "remove", - Aliases: []string{"r", "delete", "d"}, + Aliases: []string{"r", "delete", "del", "d"}, Short: "remove a git repository", Long: "The repository remove command removes a git repository from the catalogue of workflow configuration sources.", Run: control.WrapCall(control.RemoveRepo), diff --git a/core/config.go b/core/config.go index 26c99a202..38c6e65a7 100644 --- a/core/config.go +++ b/core/config.go @@ -218,6 +218,7 @@ func NewConfig() (err error) { return } + return } diff --git a/core/confsys/service.go b/core/confsys/service.go index 6790361c9..d091a7289 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -25,6 +25,7 @@ package confsys import ( + "encoding/json" "io/ioutil" "os" "path/filepath" @@ -146,6 +147,41 @@ func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { } } +func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { + var defaultRevisions map[string]string + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + data, err := cSrc.Get("o2/control/default_revisions") + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(data), &defaultRevisions) + if err != nil { + return nil, err + } + } else { + defaultRevisionData, err := ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_revisions.json") + if err != nil { + return nil, err + } + err = json.Unmarshal(defaultRevisionData, &defaultRevisions) + } + return defaultRevisions, nil +} + +func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) error { + data, err := json.MarshalIndent(defaultRevisions, "", " ") + if err != nil { + return err + } + + if cSrc, ok := s.src.(*configuration.ConsulSource); ok { + err = cSrc.Put("o2/control/default_revisions", string(data)) + } else { + err = ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_revisions.json", data, 0644) + } + return err +} + func (s *Service) NewRunNumber() (runNumber uint32, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { return cSrc.GetNextUInt32("o2/control/run_number") diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index cae7a6d2c..71db17581 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -66,6 +66,7 @@ type RepoManager struct { repoList map[string]*Repo defaultRepo *Repo defaultRevision string + defaultRevisions map[string]string mutex sync.Mutex cService *confsys.Service } @@ -75,24 +76,32 @@ func initializeRepos(service *confsys.Service) *RepoManager { rm.cService = service var err error - // Get default revision + // Get global default revision rm.defaultRevision, err = rm.cService.GetDefaultRevision() - if err != nil { + if err != nil || rm.defaultRevision == "" { log.Warning("Failed to parse default_revision from backend") rm.defaultRevision = viper.GetString("globalDefaultRevision") } else { viper.Set("globalDefaultRevision", rm.defaultRevision) } + // Get default revisions + revsMap, err := rm.cService.GetRepoDefaultRevisions() + if err != nil { + log.Warning("Failed to parse default_revisions from backend") + rm.defaultRevisions = make(map[string]string) + } else { + rm.defaultRevisions = revsMap + } + // Get default repo defaultRepo, err := rm.cService.GetDefaultRepo() - if err != nil { + if err != nil || defaultRepo == "" { log.Warning("Failed to parse default_repo from backend") defaultRepo = viper.GetString("defaultRepo") } - // Add default repo - _, err = rm.AddRepo(defaultRepo, rm.defaultRevision) + _, err = rm.AddRepo(defaultRepo, rm.defaultRevisions[defaultRepo]) if err != nil { log.Fatal("Could not open default repo: ", err) } @@ -105,7 +114,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } for _, repo := range discoveredRepos { - _, err = rm.AddRepo(repo, rm.defaultRevision) + _, err = rm.AddRepo(repo, rm.defaultRevisions[repo]) if err != nil && err.Error() != "Repo already present" { //Skip error for default repo log.Warning("Failed to add persistent repo: ", repo, " | ", err) } @@ -137,6 +146,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ for _, repo := range someRepos { //sanitize path repo = strings.TrimPrefix(repo, viper.GetString("RepositoriesPath")) + utils.EnsureTrailingSlash(&repo) repos = append(repos, repo) } } @@ -157,7 +167,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { // Decide if revision = defaultRevision -> if yes lock them together // We do this because, in the case where the revision was not specified, it would fall back to the default revision - // As a result, subsequent changes to the default revision should be followed by revision + // As a result, subsequent changes to the default revision, within the scope of this function, should be followed by revision revIsDefault := false if repo.DefaultRevision == repo.Revision { revIsDefault = true @@ -172,7 +182,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { return err } else if len(matchedRevs) == 0 { log.Warning("Default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) - if repo.DefaultRevision != manager.defaultRevision { //TODO: This check implies that repo.DefaultRevision might be different to the global on. This is not the case yet but it stays here for reference. + if repo.DefaultRevision != manager.defaultRevision { log.Warning("Defaulting to global default revision: " + manager.defaultRevision) repo.DefaultRevision = manager.defaultRevision matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) @@ -252,6 +262,13 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st return "", errors.New("Repo already present") } + // Update default revisions + manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision + err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + if err != nil { + return "", err + } + return repo.DefaultRevision, nil } @@ -337,6 +354,14 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (string, error) { log.Warning("Failed to update default_repo backend") } } + + // Update default revisions + delete(manager.defaultRevisions, repo.GetIdentifier()) + err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + if err != nil { + return "", err + } + return newDefaultRepoString, nil } @@ -409,8 +434,10 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP return } - if revision != "" { //If a revision has been specified, update the Repo + if revision != "" { // If a revision has been specified, update the Repo workflowRepo.Revision = revision + } else { // Otherwise use the default revision of the repo + workflowRepo.Revision = workflowRepo.DefaultRevision } // Make sure that HEAD is on the expected revision @@ -433,7 +460,7 @@ func (manager *RepoManager) setDefaultRepo(repo *Repo) { } // Update default_repo backend - err := manager.cService.NewDefaultRepo(repo.GetIdentifier()) + err := manager.cService.NewDefaultRepo(strings.TrimSuffix(repo.GetIdentifier(), "/")) if err != nil { log.Warning("Failed to update default_repo backend: ", err) } @@ -505,7 +532,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er reposRequired := make(map[Repo]bool) for _, taskClass := range taskClassesRequired { var newRepo *Repo - newRepo, err = NewRepo(taskClass, manager.defaultRevision) //TODO: To be replaced by the repo's revision; not done now because it would break + newRepo, err = NewRepo(taskClass, manager.defaultRevision) if err != nil { return } From 6bf484eb8225de5bc9443b3cc78d3f02fa454c27 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 11 Feb 2020 12:08:49 +0100 Subject: [PATCH 0088/2352] [coconut] Improve message verbosity --- coconut/control/control.go | 15 +- coconut/protos/o2control.pb.go | 528 +++++++++++++++++++++++---------- core/protos/o2control.pb.go | 528 +++++++++++++++++++++++---------- core/protos/o2control.proto | 7 +- core/repos/repo.go | 13 +- core/repos/repomanager.go | 36 +-- core/server.go | 22 +- 7 files changed, 815 insertions(+), 334 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index f619eff00..a9792a648 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -673,11 +673,7 @@ func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar } fmt.Fprintln(o, "Repository succesfully added.") - if defaultRevision != "" && response.GetNewDefaultRevision() != defaultRevision { - fmt.Fprintln(o, "Default revision specified not present in repository;") - //TODO: It's not clear here if it's the global default or master - fmt.Fprintln(o, "Fallback to default revision:", blue(response.GetNewDefaultRevision())) - } + fmt.Fprintln(o, response.GetInfo()) return nil } @@ -781,15 +777,22 @@ func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. return err } - _, err = rpc.SetRepoDefaultRevision(cxt, &pb.SetRepoDefaultRevisionRequest{Index: int32(index), Revision: args[1]}, grpc.EmptyCallOption{}) + var response *pb.SetRepoDefaultRevisionReply + response, err = rpc.SetRepoDefaultRevision(cxt, &pb.SetRepoDefaultRevisionRequest{Index: int32(index), Revision: args[1]}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Operation failed.") return err + } else if response.GetInfo() != "" { + fmt.Fprintln(o, "Operation failed.\n") + fmt.Fprintln(o, "Available revisions for this repo: \n"+response.GetInfo()) + return errors.New("Could not update the default revision.") } } else { err := errors.New(fmt.Sprintf("expects 1 or 2 args, received %d", len(args))) return err } + fmt.Fprintln(o, "The default revision for this repo has been successfuly updated to \"" + args[1] + "\".") + return nil } \ No newline at end of file diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index e0a339ada..c5e0e61df 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2808,6 +2808,7 @@ func (m *AddRepoRequest) GetDefaultRevision() string { type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2853,6 +2854,13 @@ func (m *AddRepoReply) GetNewDefaultRevision() string { return "" } +func (m *AddRepoReply) GetInfo() string { + if m != nil { + return m.Info + } + return "" +} + type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3143,6 +3151,53 @@ func (m *SetRepoDefaultRevisionRequest) GetRevision() string { return "" } +type SetRepoDefaultRevisionReply struct { + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } +func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} +} +func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) +} +func (m *SetRepoDefaultRevisionReply) XXX_Size() int { + return m.Size() +} +func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) +} + +var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionReply) GetInfo() string { + if m != nil { + return m.Info + } + return "" +} + type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3153,7 +3208,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3238,157 +3293,159 @@ func init() { proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2292 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, - 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0xc3, - 0x55, 0xce, 0xc9, 0x1d, 0x0e, 0xf8, 0xae, 0xe0, 0x48, 0xdd, 0x5d, 0xf0, 0x1f, 0xc5, 0x31, 0xc4, - 0x56, 0x58, 0x29, 0x49, 0x91, 0x2a, 0x2a, 0xac, 0xb5, 0x23, 0x4b, 0xe7, 0xd5, 0x8e, 0x6e, 0x77, - 0xe4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xf0, 0xc2, 0x2b, 0x45, 0xf1, 0xc0, 0x03, 0xdf, - 0x83, 0x17, 0x0a, 0xf8, 0x06, 0x54, 0xa8, 0xe2, 0x89, 0x0f, 0x41, 0xcd, 0x9f, 0xdd, 0x9d, 0x5d, - 0xed, 0xca, 0xae, 0xba, 0x37, 0x75, 0x4f, 0x77, 0x4f, 0x77, 0xff, 0x7a, 0xba, 0x67, 0x56, 0xb0, - 0x36, 0xf6, 0x29, 0xa3, 0xc1, 0x03, 0xba, 0xd3, 0xa3, 0x1e, 0xf3, 0xa9, 0xbb, 0x2d, 0x18, 0xa8, - 0x1a, 0x31, 0xf0, 0x1a, 0xac, 0xb6, 0x2e, 0x88, 0xc7, 0x5e, 0x1f, 0x93, 0x80, 0x06, 0x4f, 0x88, - 0xed, 0xb3, 0x53, 0x62, 0x33, 0xbc, 0x04, 0x8b, 0x1d, 0x66, 0xb3, 0x49, 0x60, 0x91, 0x6f, 0x26, - 0x24, 0x60, 0xf8, 0x14, 0x6a, 0x21, 0x63, 0xec, 0x5e, 0xa2, 0x55, 0x28, 0x05, 0xcc, 0x66, 0xc4, - 0x34, 0x36, 0x8d, 0xad, 0xaa, 0x25, 0x09, 0xf4, 0x25, 0x2c, 0x06, 0x42, 0xe8, 0xf9, 0xd8, 0xb1, - 0x19, 0x09, 0xcc, 0xc2, 0xe6, 0xfc, 0x56, 0x6d, 0xe7, 0xd6, 0x76, 0xec, 0x41, 0x47, 0x5b, 0xb7, - 0x92, 0xd2, 0xf8, 0xef, 0x06, 0x2c, 0xe8, 0xeb, 0xe8, 0x53, 0x28, 0xb9, 0xe4, 0x82, 0xb8, 0x62, - 0x97, 0xfa, 0xce, 0xfb, 0x39, 0x76, 0xb6, 0x9f, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x23, 0xa8, 0x8f, - 0x12, 0xc1, 0x98, 0x85, 0x4d, 0x63, 0xab, 0xb6, 0x73, 0x47, 0xd3, 0xce, 0x8a, 0xf9, 0xc9, 0x9c, - 0x95, 0x52, 0xc4, 0x9f, 0x41, 0x49, 0x98, 0x46, 0x55, 0x28, 0x1d, 0xb4, 0xf6, 0x9e, 0x1f, 0x36, - 0xe6, 0x50, 0x05, 0x8a, 0x47, 0x27, 0x8f, 0xdb, 0x0d, 0x03, 0xd5, 0xa0, 0xfc, 0x72, 0xd7, 0x3a, - 0x39, 0x3a, 0x39, 0x6c, 0x14, 0xb8, 0x44, 0xcb, 0xb2, 0xda, 0x56, 0x63, 0x7e, 0xaf, 0x0c, 0x25, - 0x61, 0x1f, 0xaf, 0xc3, 0xad, 0x43, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, 0xf9, 0x91, - 0xd7, 0xa7, 0x61, 0x3a, 0xff, 0x64, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, 0x2e, 0x47, - 0xf6, 0xd7, 0xd4, 0x17, 0x51, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xf0, 0x9e, 0x73, - 0x39, 0xc1, 0xb9, 0x63, 0x9b, 0xf5, 0x06, 0xe6, 0xbc, 0xe4, 0x0a, 0x82, 0x73, 0x4f, 0x27, 0x43, - 0xd7, 0x31, 0x8b, 0x12, 0x0d, 0x41, 0xa0, 0x4d, 0xa8, 0x8d, 0x7d, 0xea, 0x4c, 0x7a, 0xec, 0xc4, - 0x1e, 0x11, 0xb3, 0x24, 0xd6, 0x74, 0x16, 0xda, 0x00, 0xb8, 0x90, 0x4e, 0x74, 0x98, 0x6f, 0xde, - 0x10, 0x02, 0x1a, 0x07, 0xff, 0xae, 0x00, 0x37, 0xa7, 0x23, 0xe0, 0xf8, 0x6f, 0x42, 0xad, 0x1f, - 0x71, 0x1d, 0x55, 0x05, 0x3a, 0x0b, 0x7d, 0x02, 0xcb, 0xc4, 0xbb, 0x18, 0xfa, 0xd4, 0x1b, 0x11, - 0x8f, 0x05, 0xfb, 0x74, 0xe2, 0x31, 0x15, 0xcb, 0xf4, 0x02, 0xf7, 0x84, 0xd9, 0xc1, 0xb9, 0x12, - 0x93, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0x68, 0x10, 0x1a, 0x2f, - 0x49, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x80, 0xd9, 0x5e, 0x8f, 0x88, 0x14, 0xc8, 0x08, - 0x13, 0x3c, 0xf4, 0x09, 0x94, 0x55, 0xc4, 0x66, 0x59, 0xd4, 0x09, 0xd2, 0xea, 0x44, 0x41, 0x64, - 0x85, 0x22, 0xf8, 0x1e, 0x2c, 0x75, 0x89, 0xed, 0x3b, 0xf4, 0x8d, 0xa7, 0xa0, 0x44, 0x6b, 0x70, - 0xc3, 0x27, 0x76, 0x40, 0x3d, 0x95, 0x05, 0x45, 0xf1, 0x23, 0x14, 0x8b, 0x8e, 0xdd, 0x4b, 0x6c, - 0xc2, 0xda, 0x21, 0x61, 0x2d, 0x2d, 0xf6, 0xb0, 0x1a, 0xde, 0xc2, 0xea, 0xd4, 0xca, 0xf5, 0xb2, - 0xfc, 0x15, 0x2c, 0xe8, 0xc9, 0x54, 0x07, 0xae, 0xa9, 0x97, 0x7a, 0xbc, 0x2c, 0xe0, 0x4b, 0xc8, - 0xe3, 0x7f, 0x19, 0xb0, 0x94, 0x92, 0x40, 0x75, 0x28, 0x0c, 0xc3, 0xcd, 0x0a, 0x43, 0x51, 0x47, - 0x3d, 0x9f, 0xd8, 0x8c, 0x38, 0x2f, 0x07, 0xc4, 0x13, 0x18, 0x56, 0x2d, 0x9d, 0x15, 0xa3, 0x33, - 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x81, 0xa0, 0x59, 0x14, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, 0x50, 0x9f, - 0x75, 0xed, 0x40, 0x56, 0x94, 0x14, 0x43, 0x4d, 0xa8, 0xf8, 0x94, 0x32, 0x8b, 0xba, 0x61, 0xb1, - 0x46, 0x34, 0xba, 0x0f, 0x8d, 0xde, 0xc4, 0xf7, 0x89, 0xc7, 0xac, 0x89, 0x77, 0x32, 0x19, 0x9d, - 0x12, 0x59, 0xaf, 0x8b, 0xd6, 0x14, 0x1f, 0xef, 0xc3, 0xcd, 0x13, 0xf2, 0x46, 0x8b, 0x2a, 0x44, - 0xea, 0x3e, 0x34, 0x78, 0xda, 0xfa, 0x2e, 0x7d, 0xd3, 0x25, 0xa3, 0xb1, 0x1b, 0xf7, 0xaf, 0x29, - 0x3e, 0xee, 0xc0, 0x4a, 0xda, 0x08, 0x47, 0xe4, 0x0b, 0xa8, 0x69, 0xf9, 0x13, 0xda, 0xb3, 0xd3, - 0xad, 0x8b, 0xe3, 0x8f, 0xc4, 0x71, 0xca, 0xf0, 0x2c, 0x95, 0x72, 0xfc, 0x6b, 0x03, 0x56, 0xd2, - 0x92, 0xdf, 0x7a, 0x7b, 0xf4, 0x00, 0x2a, 0x61, 0x9c, 0xaa, 0x27, 0xae, 0x68, 0xaa, 0x3c, 0xcf, - 0x42, 0x27, 0x12, 0xc2, 0xff, 0x30, 0x60, 0x7d, 0x5f, 0x2e, 0x5f, 0xed, 0x34, 0x7a, 0x04, 0x45, - 0x76, 0x39, 0x26, 0xc2, 0x74, 0x7d, 0xe7, 0x63, 0xcd, 0x74, 0xae, 0x8d, 0xed, 0xf6, 0x98, 0xab, - 0x58, 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0xb4, 0xdb, 0xcf, 0x1a, 0x73, 0x08, - 0x41, 0xbd, 0xd3, 0xdd, 0xb5, 0xba, 0xaf, 0x77, 0xf7, 0xbb, 0x47, 0x2f, 0x8e, 0xba, 0x3f, 0x6f, - 0x18, 0x68, 0x19, 0x16, 0x3b, 0xdd, 0xf6, 0xb3, 0x98, 0x55, 0x40, 0x8b, 0x50, 0xdd, 0x6f, 0x9f, - 0x3c, 0x3e, 0x3a, 0x7c, 0x6e, 0xb5, 0x1a, 0xf3, 0xbc, 0x1b, 0x5b, 0xad, 0x4e, 0xab, 0xdb, 0x28, - 0xa2, 0x05, 0xa8, 0x1c, 0xb6, 0x5f, 0xcb, 0xde, 0x5c, 0xc2, 0xe7, 0x70, 0x2b, 0xcb, 0x19, 0x9e, - 0xdb, 0x74, 0x38, 0x51, 0x51, 0x17, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x9c, 0x42, 0xfc, 0xbd, - 0x01, 0xe6, 0x31, 0x75, 0x86, 0xfd, 0xcb, 0x6b, 0x65, 0x0f, 0xe8, 0x98, 0xf8, 0x36, 0x1b, 0x52, - 0x2f, 0x3c, 0xc7, 0x77, 0xb2, 0x91, 0x6d, 0x87, 0x72, 0x96, 0xa6, 0x82, 0xee, 0x42, 0xdd, 0x27, - 0x3d, 0xea, 0xf5, 0x87, 0x67, 0x13, 0x9f, 0xec, 0xba, 0xae, 0xf0, 0xab, 0x62, 0xa5, 0xb8, 0xf8, - 0x8f, 0x06, 0xac, 0x66, 0x19, 0x43, 0x0f, 0x15, 0x7e, 0x72, 0xd8, 0xde, 0xbd, 0x62, 0xef, 0x04, - 0x74, 0xf2, 0xec, 0xba, 0xb2, 0xcb, 0x16, 0xc2, 0xb3, 0x2b, 0x69, 0xfc, 0xfd, 0x0c, 0x58, 0x97, - 0xa0, 0x66, 0xb5, 0x8e, 0xdb, 0x2f, 0x5a, 0xaf, 0xad, 0xf6, 0x53, 0x8e, 0xd8, 0x02, 0x54, 0x76, - 0x0f, 0x0e, 0x24, 0x55, 0xc4, 0xbf, 0x31, 0x60, 0x2d, 0x23, 0x73, 0x1c, 0xa6, 0x9f, 0x42, 0xa3, - 0x6f, 0x0f, 0x5d, 0xe2, 0xb4, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0xa1, 0x30, - 0x8d, 0xb9, 0xde, 0xc8, 0xf0, 0x11, 0xac, 0x1f, 0x90, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, - 0xea, 0x39, 0x21, 0xe3, 0xae, 0xe8, 0x7c, 0x05, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, - 0xe2, 0x81, 0xfd, 0x04, 0x96, 0x7b, 0x2e, 0xb1, 0xbd, 0x89, 0x14, 0x15, 0x4c, 0x75, 0xc2, 0x6f, - 0xeb, 0x67, 0x29, 0x2d, 0x63, 0x4d, 0xab, 0xe1, 0xff, 0x1a, 0xb0, 0x98, 0xe8, 0xb1, 0x08, 0x41, - 0xd1, 0xe3, 0xe0, 0x48, 0x47, 0xc5, 0x6f, 0x3e, 0xb9, 0x5c, 0xda, 0x3b, 0x27, 0x8e, 0xf2, 0x53, - 0x51, 0x9c, 0xcf, 0x3b, 0xf2, 0x91, 0xa3, 0xd2, 0xa0, 0x28, 0xce, 0x97, 0x17, 0x36, 0x35, 0x85, - 0x15, 0x15, 0x67, 0xad, 0xa4, 0x9f, 0x94, 0xdb, 0x50, 0xed, 0xb9, 0x76, 0x10, 0x68, 0x93, 0x37, - 0x66, 0xa0, 0x16, 0xd4, 0x1d, 0x32, 0x76, 0xe9, 0x65, 0xd8, 0xaa, 0xd4, 0xf4, 0xd5, 0xef, 0x78, - 0xdc, 0xf9, 0x83, 0x84, 0x90, 0x95, 0x52, 0xe2, 0x8d, 0x12, 0x4d, 0x8b, 0xf1, 0x72, 0xe4, 0xd7, - 0x00, 0x2d, 0xe2, 0x88, 0x46, 0x26, 0x94, 0xed, 0x33, 0x2e, 0x18, 0x02, 0x1f, 0x92, 0x7c, 0x85, - 0xf6, 0xfb, 0xc4, 0x8f, 0x02, 0x0f, 0x49, 0x7e, 0xd1, 0x20, 0x6f, 0x49, 0x6f, 0xc2, 0x28, 0x5f, - 0x94, 0xd1, 0x6b, 0x1c, 0xbc, 0x0c, 0x4b, 0x87, 0x84, 0x29, 0x00, 0xe4, 0x4c, 0x7f, 0x04, 0x8b, - 0x31, 0x8b, 0xe3, 0x1b, 0x8d, 0x43, 0xe3, 0x5a, 0xe3, 0x10, 0x6f, 0x41, 0x5d, 0x19, 0xd0, 0x6e, - 0x1a, 0x0a, 0x17, 0x43, 0xc7, 0x05, 0xff, 0x10, 0x16, 0x22, 0x49, 0xbe, 0xd3, 0x47, 0x50, 0xe4, - 0x2b, 0xaa, 0x78, 0x56, 0x52, 0x19, 0x15, 0x7b, 0x08, 0x01, 0xdc, 0x82, 0x45, 0xce, 0xd9, 0xe7, - 0xa8, 0xe4, 0x56, 0x09, 0x1f, 0xff, 0x52, 0xfd, 0x98, 0x3a, 0x24, 0x1a, 0xff, 0x31, 0x0b, 0xff, - 0x0a, 0x6a, 0xfb, 0x74, 0x34, 0xb2, 0x3d, 0x47, 0x18, 0x69, 0xc0, 0x3c, 0xf1, 0x2e, 0x44, 0x98, - 0x55, 0x8b, 0xff, 0x14, 0x05, 0x32, 0x20, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x7b, 0x61, 0xbb, - 0x93, 0xe8, 0xb0, 0x09, 0x82, 0x97, 0x8d, 0xed, 0x9f, 0x4d, 0xe4, 0x75, 0xa6, 0x28, 0x6c, 0xc4, - 0x0c, 0xee, 0xe0, 0x24, 0x20, 0xbe, 0xaa, 0x34, 0xf1, 0x1b, 0x1f, 0x43, 0x6d, 0x7f, 0x60, 0x7b, - 0x1e, 0x71, 0x73, 0x63, 0x40, 0xda, 0x68, 0xaa, 0xaa, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x11, 0x16, - 0x57, 0x39, 0xa7, 0xf0, 0xff, 0x0a, 0x50, 0x89, 0x8e, 0xcd, 0x0f, 0xa0, 0x1a, 0x70, 0x70, 0x44, - 0x85, 0xca, 0x7c, 0xe6, 0x03, 0x17, 0x8b, 0x72, 0xbd, 0x5e, 0x98, 0x55, 0x35, 0x6b, 0xcd, 0x14, - 0x0e, 0x51, 0xd6, 0xad, 0x58, 0x14, 0xfd, 0x18, 0x96, 0x86, 0xde, 0x29, 0x9d, 0x78, 0x8e, 0x0a, - 0x29, 0x30, 0xe7, 0x45, 0xb9, 0xac, 0xe9, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x3d, 0x68, - 0xd0, 0x09, 0x4b, 0x9a, 0x28, 0xce, 0x34, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, - 0x64, 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x07, 0x8f, 0x57, 0xd6, 0x33, 0x9b, 0x0d, 0xd4, - 0x99, 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x2e, 0x8e, 0x1c, 0x71, 0xd2, 0xab, 0x96, 0x24, 0xf0, 0x03, - 0x58, 0x49, 0xb6, 0x34, 0x59, 0xeb, 0x26, 0x94, 0x65, 0x75, 0x07, 0xaa, 0x90, 0x42, 0x12, 0xff, - 0xd6, 0x80, 0xe5, 0xa9, 0x26, 0x88, 0x1e, 0x42, 0xed, 0x7c, 0xe8, 0xba, 0xc4, 0xe9, 0x5e, 0xeb, - 0x8c, 0xe9, 0xc2, 0xe8, 0x0b, 0x58, 0xf0, 0x27, 0x9e, 0x37, 0xf4, 0xce, 0xc2, 0xae, 0x3d, 0x5b, - 0x39, 0x21, 0x8d, 0xf7, 0xc5, 0xd9, 0xe7, 0xb7, 0xa7, 0xc8, 0xf9, 0x28, 0x52, 0x43, 0x8b, 0x94, - 0xe7, 0x66, 0x6c, 0xb3, 0x41, 0x67, 0x4c, 0x7a, 0xe1, 0x8c, 0x0c, 0x69, 0xfc, 0x57, 0x03, 0x2a, - 0xe1, 0x05, 0x2c, 0xaf, 0x57, 0xab, 0xde, 0x5b, 0xc8, 0xee, 0xbd, 0x89, 0xab, 0x77, 0x13, 0x2a, - 0xfd, 0x89, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0xa5, 0x44, 0x66, 0xd1, 0x3d, - 0x28, 0xf1, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x2f, 0x87, 0x52, 0x02, 0x3f, 0x14, 0xdd, - 0x4d, 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x0e, 0x09, 0x7b, - 0x99, 0xba, 0x72, 0x47, 0xd9, 0xdb, 0x84, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, 0x18, 0xf1, 0xc3, - 0x57, 0x95, 0xce, 0x42, 0x5b, 0xb0, 0xe4, 0x93, 0x8b, 0x21, 0x7f, 0x91, 0x85, 0x52, 0x32, 0x2b, - 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0x9e, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, 0x8d, 0x48, 0x67, - 0x89, 0x71, 0xe0, 0xba, 0x5d, 0xfb, 0x4c, 0x4e, 0xb5, 0x8a, 0x15, 0x92, 0xf8, 0x14, 0x56, 0xd3, - 0x3e, 0x86, 0xf0, 0x70, 0x67, 0x42, 0x78, 0xf8, 0x6f, 0x51, 0xf7, 0xe1, 0x93, 0x42, 0x61, 0x1b, - 0xd2, 0xe2, 0x6e, 0xa4, 0xdc, 0x52, 0x28, 0x45, 0x34, 0xfe, 0x1a, 0xd6, 0xb3, 0x53, 0xc1, 0x73, - 0x7a, 0x0c, 0xcb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0xcb, 0x49, 0x6b, 0x5a, 0x13, 0x23, 0x68, - 0x3c, 0x1d, 0x06, 0xfc, 0xb6, 0x41, 0xb5, 0xcf, 0x3a, 0x15, 0x4e, 0xe7, 0x96, 0x9d, 0x09, 0x65, - 0x87, 0xf4, 0xed, 0x89, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x8e, 0x81, 0xfa, 0x69, 0x25, 0x83, 0x4b, - 0xb3, 0xf1, 0x37, 0x50, 0xd7, 0xf6, 0x0d, 0x8b, 0x85, 0x53, 0x59, 0xc5, 0xa2, 0xbc, 0xb1, 0xa4, - 0x04, 0xfa, 0x0c, 0x6e, 0x9e, 0xb9, 0xf4, 0xd4, 0x76, 0x0f, 0x52, 0x9b, 0xc9, 0x2c, 0x67, 0x2f, - 0xe2, 0x13, 0xa8, 0xef, 0x3a, 0x0e, 0xb7, 0x15, 0x16, 0x55, 0x56, 0x70, 0x19, 0x21, 0x14, 0xb2, - 0x43, 0xf8, 0x0a, 0x16, 0x22, 0x7b, 0x72, 0x96, 0x23, 0x8f, 0xbc, 0x49, 0xbb, 0x24, 0x6d, 0x67, - 0xac, 0xe0, 0x7b, 0xb0, 0x6c, 0x91, 0x11, 0xbd, 0x20, 0xba, 0x4b, 0xab, 0x50, 0x1a, 0x7a, 0x0e, - 0x79, 0x1b, 0x7e, 0xf7, 0x11, 0x04, 0xfe, 0x11, 0x2c, 0xe9, 0xa2, 0x7c, 0xb7, 0xbb, 0x50, 0xd7, - 0x6d, 0x46, 0xa5, 0x97, 0xe2, 0xe2, 0x8f, 0x61, 0xc5, 0x22, 0x7d, 0x9f, 0x04, 0x03, 0x1d, 0xe3, - 0x9c, 0x7d, 0xbe, 0x0b, 0x37, 0x3b, 0x84, 0x69, 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0x3b, 0x1d, 0xc2, - 0x0e, 0xb3, 0xb2, 0x1d, 0x2a, 0xea, 0x75, 0x6e, 0xa4, 0xea, 0xfc, 0x67, 0xf0, 0x7e, 0x87, 0x88, - 0x6d, 0x72, 0x94, 0x33, 0x77, 0x4d, 0x98, 0x2c, 0xa4, 0x4c, 0x96, 0xa1, 0xd4, 0x1a, 0x8d, 0xd9, - 0xe5, 0xce, 0x5f, 0x16, 0xa1, 0xac, 0x1e, 0x75, 0x68, 0x1f, 0x6a, 0x5d, 0xdf, 0xee, 0x9d, 0xcb, - 0xcf, 0x83, 0xc8, 0x9c, 0xfa, 0x62, 0xa8, 0xf6, 0x6b, 0xae, 0x65, 0xac, 0xf0, 0x9b, 0xf3, 0xdc, - 0xf7, 0x0c, 0xf4, 0x0a, 0x1a, 0xe9, 0xaf, 0x5e, 0x08, 0x6b, 0xf2, 0x39, 0x1f, 0xf5, 0x9a, 0x9b, - 0x33, 0x65, 0x84, 0x75, 0xb4, 0x07, 0x95, 0xf0, 0xab, 0x10, 0xd2, 0x1f, 0xee, 0xa9, 0xaf, 0x4a, - 0x4d, 0x33, 0x73, 0x4d, 0xda, 0x78, 0x29, 0x26, 0x8e, 0xfe, 0xb9, 0x08, 0x7d, 0x90, 0xdc, 0x3a, - 0xe3, 0x23, 0x53, 0xf3, 0xce, 0x2c, 0x11, 0x69, 0xb8, 0x0b, 0xf5, 0xe4, 0x47, 0x0f, 0xa4, 0x87, - 0x94, 0xf9, 0x51, 0xa5, 0xb9, 0x31, 0x43, 0x22, 0xb2, 0x9a, 0xdc, 0x0f, 0x6d, 0xe6, 0xba, 0x92, - 0x65, 0x35, 0xe3, 0x43, 0x08, 0x9e, 0x43, 0xbf, 0x04, 0x34, 0xfd, 0x92, 0x47, 0x1f, 0x5e, 0xe7, - 0xab, 0x43, 0x13, 0x5f, 0x21, 0x25, 0x77, 0xf8, 0x05, 0x2c, 0x4f, 0xbd, 0x41, 0xd1, 0x77, 0x34, - 0xd5, 0xbc, 0xb7, 0x7d, 0xf3, 0x83, 0xd9, 0x42, 0x51, 0x00, 0xd3, 0x4f, 0xc1, 0x44, 0x00, 0xb9, - 0x8f, 0xce, 0x44, 0x00, 0x39, 0xef, 0x49, 0x59, 0x6b, 0xe1, 0x13, 0x24, 0x51, 0x6b, 0xa9, 0xa7, - 0x4a, 0xa2, 0xd6, 0x12, 0x6f, 0x16, 0x3c, 0x87, 0x1e, 0x41, 0x59, 0xb1, 0xd0, 0xfa, 0xb4, 0x58, - 0x68, 0xe1, 0x56, 0xd6, 0x92, 0x34, 0x70, 0x02, 0x0b, 0xfa, 0x6d, 0x0d, 0x6d, 0xe4, 0xbe, 0x65, - 0xa5, 0xa9, 0x99, 0x6f, 0xdd, 0x28, 0x28, 0x71, 0xf3, 0x48, 0x07, 0xa5, 0xdf, 0xc1, 0xd2, 0x41, - 0xc5, 0x57, 0x15, 0x3c, 0x87, 0xfa, 0xe2, 0x7b, 0xeb, 0xd4, 0xd4, 0x45, 0x77, 0x93, 0x3a, 0x79, - 0x37, 0x94, 0xe6, 0x87, 0x57, 0xca, 0xc9, 0x7d, 0x5a, 0x50, 0x8d, 0x26, 0x1f, 0x7a, 0x4f, 0x53, - 0x4a, 0xcf, 0xe1, 0xe6, 0x7a, 0xf6, 0x62, 0x84, 0x81, 0x9a, 0x3e, 0x09, 0x0c, 0x92, 0x13, 0x2e, - 0x81, 0x81, 0x3e, 0xac, 0xf0, 0x1c, 0x7a, 0x02, 0x10, 0xcf, 0x14, 0x74, 0x3b, 0x31, 0x6e, 0x53, - 0x53, 0xa9, 0xd9, 0xcc, 0x59, 0x0d, 0xb3, 0xbf, 0xa0, 0x8f, 0x98, 0x04, 0x9a, 0x19, 0xb3, 0xa7, - 0xd9, 0xd0, 0xbf, 0xc9, 0xf0, 0x6e, 0x8d, 0xe7, 0xd0, 0x63, 0xa8, 0x27, 0x27, 0x4f, 0xa2, 0x1f, - 0x64, 0x0e, 0xa5, 0x4c, 0x3b, 0xaf, 0xc0, 0xcc, 0x1b, 0x49, 0xe8, 0x7e, 0xd2, 0xe2, 0xac, 0xb9, - 0x95, 0x69, 0xfb, 0x05, 0xac, 0x65, 0xcf, 0x2b, 0xb4, 0x95, 0xb4, 0x9c, 0x3f, 0xd2, 0xb2, 0xec, - 0xee, 0x7d, 0xfe, 0xb7, 0x77, 0x1b, 0xc6, 0x3f, 0xdf, 0x6d, 0x18, 0xff, 0x7e, 0xb7, 0x61, 0xfc, - 0xe1, 0x3f, 0x1b, 0x73, 0x80, 0x7b, 0x83, 0xed, 0x1e, 0xf1, 0xbd, 0x6d, 0xdb, 0x1d, 0xf6, 0xc8, - 0x36, 0xdd, 0xd9, 0x0e, 0x75, 0xfc, 0x71, 0x2f, 0x20, 0xfe, 0x05, 0xf1, 0x5f, 0x15, 0xc6, 0xa7, - 0xa7, 0x37, 0xc4, 0x7f, 0x77, 0x9f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xef, 0x3e, 0xd0, 0xb5, - 0xd5, 0x1b, 0x00, 0x00, + // 2317 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, + 0xf1, 0xd7, 0x50, 0xa4, 0x49, 0x16, 0x25, 0x8a, 0x6a, 0xc9, 0xf2, 0x88, 0xf6, 0xca, 0xda, 0xfe, + 0x2f, 0xbc, 0xb2, 0x77, 0xff, 0x72, 0x56, 0xbb, 0x48, 0x36, 0xc6, 0x6e, 0x1c, 0x7d, 0xd0, 0xb2, + 0x12, 0x4b, 0x74, 0x86, 0xb4, 0x8d, 0x18, 0x08, 0x9c, 0x11, 0xa7, 0x29, 0x72, 0x35, 0x9c, 0xe1, + 0xce, 0x34, 0x65, 0xeb, 0x90, 0x5b, 0x6e, 0x41, 0x90, 0x43, 0x2e, 0xb9, 0x06, 0x41, 0x8e, 0x79, + 0x86, 0x5c, 0x73, 0x09, 0x92, 0xbc, 0x41, 0xe0, 0x00, 0x39, 0xe5, 0x21, 0x82, 0xfe, 0x9a, 0xe9, + 0x19, 0xce, 0x50, 0x02, 0x72, 0x63, 0x55, 0x57, 0x55, 0x57, 0xd5, 0xaf, 0xba, 0xaa, 0xa7, 0x09, + 0x6b, 0xe3, 0xc0, 0xa7, 0x7e, 0xf8, 0xd0, 0xdf, 0xe9, 0xf9, 0x1e, 0x0d, 0x7c, 0x77, 0x9b, 0x33, + 0x50, 0x35, 0x62, 0xe0, 0x35, 0x58, 0x6d, 0x5d, 0x10, 0x8f, 0xbe, 0x39, 0x26, 0xa1, 0x1f, 0x3e, + 0x25, 0x76, 0x40, 0x4f, 0x89, 0x4d, 0xf1, 0x12, 0x2c, 0x76, 0xa8, 0x4d, 0x27, 0xa1, 0x45, 0xbe, + 0x9d, 0x90, 0x90, 0xe2, 0x53, 0xa8, 0x29, 0xc6, 0xd8, 0xbd, 0x44, 0xab, 0x50, 0x0a, 0xa9, 0x4d, + 0x89, 0x69, 0x6c, 0x1a, 0x5b, 0x55, 0x4b, 0x10, 0xe8, 0x6b, 0x58, 0x0c, 0xb9, 0xd0, 0x8b, 0xb1, + 0x63, 0x53, 0x12, 0x9a, 0x85, 0xcd, 0xf9, 0xad, 0xda, 0xce, 0xad, 0xed, 0xd8, 0x83, 0x8e, 0xb6, + 0x6e, 0x25, 0xa5, 0xf1, 0x5f, 0x0d, 0x58, 0xd0, 0xd7, 0xd1, 0xe7, 0x50, 0x72, 0xc9, 0x05, 0x71, + 0xf9, 0x2e, 0xf5, 0x9d, 0x0f, 0x72, 0xec, 0x6c, 0x3f, 0x63, 0x42, 0x96, 0x90, 0x45, 0x47, 0x50, + 0x1f, 0x25, 0x82, 0x31, 0x0b, 0x9b, 0xc6, 0x56, 0x6d, 0xe7, 0xae, 0xa6, 0x9d, 0x15, 0xf3, 0xd3, + 0x39, 0x2b, 0xa5, 0x88, 0xbf, 0x80, 0x12, 0x37, 0x8d, 0xaa, 0x50, 0x3a, 0x68, 0xed, 0xbd, 0x38, + 0x6c, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4e, 0x9e, 0xb4, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xd5, 0xae, + 0x75, 0x72, 0x74, 0x72, 0xd8, 0x28, 0x30, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x5e, 0x19, + 0x4a, 0xdc, 0x3e, 0x5e, 0x87, 0x5b, 0x87, 0x84, 0x3e, 0x09, 0xec, 0x11, 0x79, 0xeb, 0x07, 0xe7, + 0x47, 0x5e, 0xdf, 0x57, 0xe9, 0xfc, 0x83, 0x01, 0xe5, 0x97, 0x24, 0x08, 0x87, 0xbe, 0xc7, 0x72, + 0x39, 0xb2, 0xbf, 0xf1, 0x03, 0x1e, 0x65, 0xc9, 0x12, 0x04, 0xe7, 0x0e, 0x3d, 0x3f, 0xe0, 0xde, + 0x33, 0x2e, 0x23, 0x18, 0x77, 0x6c, 0xd3, 0xde, 0xc0, 0x9c, 0x17, 0x5c, 0x4e, 0x30, 0xee, 0xe9, + 0x64, 0xe8, 0x3a, 0x66, 0x51, 0xa0, 0xc1, 0x09, 0xb4, 0x09, 0xb5, 0x71, 0xe0, 0x3b, 0x93, 0x1e, + 0x3d, 0xb1, 0x47, 0xc4, 0x2c, 0xf1, 0x35, 0x9d, 0x85, 0x36, 0x00, 0x2e, 0x84, 0x13, 0x1d, 0x1a, + 0x98, 0x37, 0xb8, 0x80, 0xc6, 0xc1, 0xbf, 0x29, 0xc0, 0xcd, 0xe9, 0x08, 0x18, 0xfe, 0x9b, 0x50, + 0xeb, 0x47, 0x5c, 0x47, 0x56, 0x81, 0xce, 0x42, 0x9f, 0xc2, 0x32, 0xf1, 0x2e, 0x86, 0x81, 0xef, + 0x8d, 0x88, 0x47, 0xc3, 0x7d, 0x7f, 0xe2, 0x51, 0x19, 0xcb, 0xf4, 0x02, 0xf3, 0x84, 0xda, 0xe1, + 0xb9, 0x14, 0x13, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0xfc, 0x50, + 0x19, 0x2f, 0x09, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x90, 0xda, 0x5e, 0x8f, 0xf0, 0x14, + 0x88, 0x08, 0x13, 0x3c, 0xf4, 0x29, 0x94, 0x65, 0xc4, 0x66, 0x99, 0xd7, 0x09, 0xd2, 0xea, 0x44, + 0x42, 0x64, 0x29, 0x11, 0x7c, 0x1f, 0x96, 0xba, 0xc4, 0x0e, 0x1c, 0xff, 0xad, 0x27, 0xa1, 0x44, + 0x6b, 0x70, 0x23, 0x20, 0x76, 0xe8, 0x7b, 0x32, 0x0b, 0x92, 0x62, 0x47, 0x28, 0x16, 0x1d, 0xbb, + 0x97, 0xd8, 0x84, 0xb5, 0x43, 0x42, 0x5b, 0x5a, 0xec, 0xaa, 0x1a, 0xde, 0xc1, 0xea, 0xd4, 0xca, + 0xf5, 0xb2, 0xfc, 0x03, 0x58, 0xd0, 0x93, 0x29, 0x0f, 0x5c, 0x53, 0x2f, 0xf5, 0x78, 0x99, 0xc3, + 0x97, 0x90, 0xc7, 0xff, 0x30, 0x60, 0x29, 0x25, 0x81, 0xea, 0x50, 0x18, 0xaa, 0xcd, 0x0a, 0x43, + 0x5e, 0x47, 0xbd, 0x80, 0xd8, 0x94, 0x38, 0xaf, 0x06, 0xc4, 0xe3, 0x18, 0x56, 0x2d, 0x9d, 0x15, + 0xa3, 0x33, 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x8e, 0xa0, 0x59, 0xe4, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, + 0xf8, 0x01, 0xed, 0xda, 0xa1, 0xa8, 0x28, 0x21, 0x86, 0x9a, 0x50, 0x09, 0x7c, 0x9f, 0x5a, 0xbe, + 0xab, 0x8a, 0x35, 0xa2, 0xd1, 0x03, 0x68, 0xf4, 0x26, 0x41, 0x40, 0x3c, 0x6a, 0x4d, 0xbc, 0x93, + 0xc9, 0xe8, 0x94, 0x88, 0x7a, 0x5d, 0xb4, 0xa6, 0xf8, 0x78, 0x1f, 0x6e, 0x9e, 0x90, 0xb7, 0x5a, + 0x54, 0x0a, 0xa9, 0x07, 0xd0, 0x60, 0x69, 0xeb, 0xbb, 0xfe, 0xdb, 0x2e, 0x19, 0x8d, 0xdd, 0xb8, + 0x7f, 0x4d, 0xf1, 0x71, 0x07, 0x56, 0xd2, 0x46, 0x18, 0x22, 0x5f, 0x41, 0x4d, 0xcb, 0x1f, 0xd7, + 0x9e, 0x9d, 0x6e, 0x5d, 0x1c, 0x7f, 0xcc, 0x8f, 0x53, 0x86, 0x67, 0xa9, 0x94, 0xe3, 0x5f, 0x1a, + 0xb0, 0x92, 0x96, 0xfc, 0x9f, 0xb7, 0x47, 0x0f, 0xa1, 0xa2, 0xe2, 0x94, 0x3d, 0x71, 0x45, 0x53, + 0x65, 0x79, 0xe6, 0x3a, 0x91, 0x10, 0xfe, 0x9b, 0x01, 0xeb, 0xfb, 0x62, 0xf9, 0x6a, 0xa7, 0xd1, + 0x63, 0x28, 0xd2, 0xcb, 0x31, 0xe1, 0xa6, 0xeb, 0x3b, 0x9f, 0x68, 0xa6, 0x73, 0x6d, 0x6c, 0xb7, + 0xc7, 0x4c, 0xc5, 0xe2, 0x8a, 0xd8, 0x86, 0x1b, 0x82, 0x66, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0xde, + 0x98, 0x43, 0x08, 0xea, 0x9d, 0xee, 0xae, 0xd5, 0x7d, 0xb3, 0xbb, 0xdf, 0x3d, 0x7a, 0x79, 0xd4, + 0xfd, 0x69, 0xc3, 0x40, 0xcb, 0xb0, 0xd8, 0xe9, 0xb6, 0x9f, 0xc7, 0xac, 0x02, 0x5a, 0x84, 0xea, + 0x7e, 0xfb, 0xe4, 0xc9, 0xd1, 0xe1, 0x0b, 0xab, 0xd5, 0x98, 0x67, 0xdd, 0xd8, 0x6a, 0x75, 0x5a, + 0xdd, 0x46, 0x11, 0x2d, 0x40, 0xe5, 0xb0, 0xfd, 0x46, 0xf4, 0xe6, 0x12, 0x3e, 0x87, 0x5b, 0x59, + 0xce, 0xb0, 0xdc, 0xa6, 0xc3, 0x89, 0x8a, 0xba, 0xa0, 0x17, 0x75, 0x56, 0x21, 0xce, 0xe7, 0x14, + 0xe2, 0x6f, 0x0d, 0x30, 0x8f, 0x7d, 0x67, 0xd8, 0xbf, 0xbc, 0x56, 0xf6, 0xc0, 0x1f, 0x93, 0xc0, + 0xa6, 0x43, 0xdf, 0x53, 0xe7, 0xf8, 0x6e, 0x36, 0xb2, 0x6d, 0x25, 0x67, 0x69, 0x2a, 0xe8, 0x1e, + 0xd4, 0x03, 0xd2, 0xf3, 0xbd, 0xfe, 0xf0, 0x6c, 0x12, 0x90, 0x5d, 0xd7, 0xe5, 0x7e, 0x55, 0xac, + 0x14, 0x17, 0xff, 0xde, 0x80, 0xd5, 0x2c, 0x63, 0xe8, 0x91, 0xc4, 0x4f, 0x0c, 0xdb, 0x7b, 0x57, + 0xec, 0x9d, 0x80, 0x4e, 0x9c, 0x5d, 0x57, 0x74, 0xd9, 0x82, 0x3a, 0xbb, 0x82, 0xc6, 0x9f, 0x65, + 0xc0, 0xba, 0x04, 0x35, 0xab, 0x75, 0xdc, 0x7e, 0xd9, 0x7a, 0x63, 0xb5, 0x9f, 0x31, 0xc4, 0x16, + 0xa0, 0xb2, 0x7b, 0x70, 0x20, 0xa8, 0x22, 0xfe, 0x95, 0x01, 0x6b, 0x19, 0x99, 0x63, 0x30, 0xfd, + 0x18, 0x1a, 0x7d, 0x7b, 0xe8, 0x12, 0xa7, 0x1d, 0x67, 0xcb, 0xb8, 0x5e, 0xb6, 0xa6, 0x14, 0x25, + 0x08, 0x85, 0x69, 0xcc, 0xf5, 0x46, 0x86, 0x8f, 0x60, 0xfd, 0x80, 0x84, 0x34, 0xf0, 0xaf, 0x83, + 0xe3, 0x1d, 0xa8, 0x9e, 0x13, 0x32, 0xee, 0xf2, 0xce, 0x57, 0xe0, 0x08, 0xc4, 0x0c, 0x4c, 0xe0, + 0x56, 0x96, 0x29, 0x16, 0xd8, 0x8f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x08, 0x51, 0xce, 0x94, + 0x27, 0xfc, 0x8e, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, 0x1e, + 0x8b, 0x10, 0x14, 0x3d, 0x06, 0x8e, 0x70, 0x94, 0xff, 0x66, 0x93, 0xcb, 0xf5, 0x7b, 0xe7, 0xc4, + 0x91, 0x7e, 0x4a, 0x8a, 0xf1, 0x59, 0x47, 0x3e, 0x72, 0x64, 0x1a, 0x24, 0xc5, 0xf8, 0xe2, 0xc2, + 0x26, 0xa7, 0xb0, 0xa4, 0xe2, 0xac, 0x95, 0xf4, 0x93, 0x72, 0x07, 0xaa, 0x3d, 0xd7, 0x0e, 0x43, + 0x6d, 0xf2, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0xae, 0x7f, 0xa9, 0x5a, 0x95, 0x9c, 0xbe, + 0xfa, 0x1d, 0x8f, 0x39, 0x7f, 0x90, 0x10, 0xb2, 0x52, 0x4a, 0xac, 0x51, 0xa2, 0x69, 0x31, 0x56, + 0x8e, 0xec, 0x1a, 0xa0, 0x45, 0x1c, 0xd1, 0xc8, 0x84, 0xb2, 0x7d, 0xc6, 0x04, 0x15, 0xf0, 0x8a, + 0x64, 0x2b, 0x7e, 0xbf, 0x4f, 0x82, 0x28, 0x70, 0x45, 0xb2, 0x8b, 0x06, 0x79, 0x47, 0x7a, 0x13, + 0xea, 0xb3, 0x45, 0x11, 0xbd, 0xc6, 0xc1, 0xcb, 0xb0, 0x74, 0x48, 0xa8, 0x04, 0x40, 0xcc, 0xf4, + 0xc7, 0xb0, 0x18, 0xb3, 0x18, 0xbe, 0xd1, 0x38, 0x34, 0xae, 0x35, 0x0e, 0xf1, 0x16, 0xd4, 0xa5, + 0x01, 0xed, 0xa6, 0x21, 0x71, 0x31, 0x74, 0x5c, 0xf0, 0xf7, 0x60, 0x21, 0x92, 0x64, 0x3b, 0x7d, + 0x0c, 0x45, 0xb6, 0x22, 0x8b, 0x67, 0x25, 0x95, 0x51, 0xbe, 0x07, 0x17, 0xc0, 0x2d, 0x58, 0x64, + 0x9c, 0x7d, 0x86, 0x4a, 0x6e, 0x95, 0xb0, 0xf1, 0x2f, 0xd4, 0x8f, 0x7d, 0x87, 0x44, 0xe3, 0x3f, + 0x66, 0xe1, 0x5f, 0x40, 0x6d, 0xdf, 0x1f, 0x8d, 0x6c, 0xcf, 0xe1, 0x46, 0x1a, 0x30, 0x4f, 0xbc, + 0x0b, 0x1e, 0x66, 0xd5, 0x62, 0x3f, 0x79, 0x81, 0x0c, 0x88, 0xeb, 0xca, 0x3a, 0x13, 0x04, 0xe3, + 0x5e, 0xd8, 0xee, 0x24, 0x3a, 0x6c, 0x9c, 0x60, 0x65, 0x63, 0x07, 0x67, 0x13, 0x71, 0x9d, 0x29, + 0x72, 0x1b, 0x31, 0x83, 0x39, 0x38, 0x09, 0x49, 0x20, 0x2b, 0x8d, 0xff, 0xc6, 0xc7, 0x50, 0xdb, + 0x1f, 0xd8, 0x9e, 0x47, 0xdc, 0xdc, 0x18, 0x90, 0x36, 0x9a, 0xaa, 0xb2, 0x65, 0xf1, 0x6c, 0x06, + 0x67, 0x84, 0xc6, 0x55, 0xce, 0x28, 0xfc, 0x9f, 0x02, 0x54, 0xa2, 0x63, 0xf3, 0x5d, 0xa8, 0x86, + 0x0c, 0x1c, 0x5e, 0xa1, 0x22, 0x9f, 0xf9, 0xc0, 0xc5, 0xa2, 0x4c, 0xaf, 0xa7, 0xb2, 0x2a, 0x67, + 0xad, 0x99, 0xc2, 0x21, 0xca, 0xba, 0x15, 0x8b, 0xa2, 0x1f, 0xc2, 0xd2, 0xd0, 0x3b, 0xf5, 0x27, + 0x9e, 0x23, 0x43, 0x0a, 0xcd, 0x79, 0x5e, 0x2e, 0x6b, 0x7a, 0x0b, 0x88, 0xa3, 0xb5, 0xd2, 0xe2, + 0x68, 0x0f, 0x1a, 0xfe, 0x84, 0x26, 0x4d, 0x14, 0x67, 0x9a, 0x98, 0x92, 0x47, 0x5f, 0x32, 0xc8, + 0x23, 0x40, 0x79, 0xb2, 0x53, 0xea, 0xf1, 0xaa, 0xa5, 0x8b, 0xb2, 0x83, 0xc7, 0x2a, 0xeb, 0xb9, + 0x4d, 0x07, 0xf2, 0xcc, 0x47, 0x34, 0xc3, 0x9b, 0x78, 0x17, 0x47, 0x0e, 0x3f, 0xe9, 0x55, 0x4b, + 0x10, 0xf8, 0x21, 0xac, 0x24, 0x5b, 0x9a, 0xa8, 0x75, 0x13, 0xca, 0xa2, 0xba, 0x43, 0x59, 0x48, + 0x8a, 0xc4, 0xbf, 0x36, 0x60, 0x79, 0xaa, 0x09, 0xa2, 0x47, 0x50, 0x3b, 0x1f, 0xba, 0x2e, 0x71, + 0xba, 0xd7, 0x3a, 0x63, 0xba, 0x30, 0xfa, 0x0a, 0x16, 0x82, 0x89, 0xe7, 0x0d, 0xbd, 0x33, 0xd5, + 0xb5, 0x67, 0x2b, 0x27, 0xa4, 0xf1, 0x3e, 0x3f, 0xfb, 0xec, 0xf6, 0x14, 0x39, 0x1f, 0x45, 0x6a, + 0x68, 0x91, 0xb2, 0xdc, 0x8c, 0x6d, 0x3a, 0xe8, 0x8c, 0x49, 0x4f, 0xcd, 0x48, 0x45, 0xe3, 0x3f, + 0x19, 0x50, 0x51, 0x17, 0xb0, 0xbc, 0x5e, 0x2d, 0x7b, 0x6f, 0x21, 0xbb, 0xf7, 0x26, 0xae, 0xde, + 0x4d, 0xa8, 0xf4, 0x27, 0xae, 0xcb, 0x61, 0x10, 0xdd, 0x2a, 0xa2, 0xf5, 0xcc, 0x96, 0x12, 0x99, + 0x45, 0xf7, 0xa1, 0xc4, 0x86, 0x76, 0x68, 0xde, 0xe0, 0x09, 0xc8, 0xbc, 0x1c, 0x0a, 0x09, 0xfc, + 0x88, 0x77, 0x37, 0x19, 0x34, 0xcb, 0x7f, 0xa4, 0x6b, 0x5c, 0xa9, 0xfb, 0x47, 0x03, 0x6e, 0x1f, + 0x12, 0xfa, 0x2a, 0x75, 0xe5, 0x8e, 0xb2, 0xb7, 0x09, 0xb5, 0x80, 0x8c, 0xfd, 0xe7, 0x36, 0xa5, + 0x24, 0x50, 0x5f, 0x55, 0x3a, 0x0b, 0x6d, 0xc1, 0x52, 0x40, 0x2e, 0x86, 0xec, 0x8b, 0x4c, 0x49, + 0x89, 0xac, 0xa4, 0xd9, 0xcc, 0x96, 0xed, 0xba, 0x7b, 0x81, 0xed, 0xf5, 0x06, 0x24, 0x94, 0x37, + 0x22, 0x9d, 0xc5, 0xc7, 0x81, 0xeb, 0x76, 0xed, 0x33, 0x31, 0xd5, 0x2a, 0x96, 0x22, 0xf1, 0x29, + 0xac, 0xa6, 0x7d, 0x54, 0xf0, 0x30, 0x67, 0x14, 0x3c, 0xec, 0x37, 0xaf, 0x7b, 0xf5, 0x49, 0x21, + 0xb1, 0x55, 0x34, 0xbf, 0x1b, 0x49, 0xb7, 0x24, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xf5, 0xec, 0x54, + 0xb0, 0x9c, 0x1e, 0xc3, 0x72, 0xfa, 0xbb, 0x24, 0xeb, 0xae, 0x93, 0xe5, 0xa4, 0x35, 0xad, 0x89, + 0x11, 0x34, 0x9e, 0x0d, 0x43, 0x76, 0xdb, 0xf0, 0xb5, 0x67, 0x9d, 0x0a, 0xa3, 0x73, 0xcb, 0xce, + 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0xa5, 0xb2, 0x77, 0x2b, 0x92, 0x61, 0x20, 0x7f, 0x5a, 0xc9, + 0xe0, 0xd2, 0x6c, 0xfc, 0x2d, 0xd4, 0xb5, 0x7d, 0x55, 0xb1, 0x30, 0x2a, 0xab, 0x58, 0xa4, 0x37, + 0x96, 0x90, 0x40, 0x5f, 0xc0, 0xcd, 0x33, 0xd7, 0x3f, 0xb5, 0xdd, 0x83, 0xd4, 0x66, 0x22, 0xcb, + 0xd9, 0x8b, 0xf8, 0x04, 0xea, 0xbb, 0x8e, 0xc3, 0x6c, 0xa9, 0xa2, 0xca, 0x0a, 0x2e, 0x23, 0x84, + 0x42, 0x76, 0x08, 0x16, 0x2c, 0x44, 0xf6, 0xc4, 0x2c, 0x47, 0x1e, 0x79, 0x9b, 0x76, 0x49, 0xd8, + 0xce, 0x58, 0x61, 0xbb, 0x0f, 0xd5, 0x24, 0xa8, 0x5a, 0xfc, 0x37, 0xbe, 0x0f, 0xcb, 0x16, 0x19, + 0xf9, 0x17, 0x44, 0x77, 0x73, 0x15, 0x4a, 0x43, 0xcf, 0x21, 0xef, 0xd4, 0x5b, 0x10, 0x27, 0xf0, + 0xf7, 0x61, 0x49, 0x17, 0x65, 0x1e, 0xdc, 0x83, 0xba, 0xbe, 0x4f, 0x54, 0x8e, 0x29, 0x2e, 0xfe, + 0x04, 0x56, 0x2c, 0xd2, 0x0f, 0x48, 0x38, 0xd0, 0x71, 0xcf, 0xd9, 0xe7, 0xff, 0xe1, 0x66, 0x87, + 0x50, 0x4d, 0x7d, 0xb6, 0xf8, 0xd7, 0x70, 0xb7, 0x43, 0xe8, 0x61, 0x16, 0x02, 0x4a, 0x51, 0xaf, + 0x7d, 0x23, 0x55, 0xfb, 0x3f, 0x81, 0x0f, 0x3a, 0x84, 0x6f, 0x93, 0xa3, 0x9c, 0xb9, 0x6b, 0xc2, + 0x64, 0x21, 0x65, 0xf2, 0x33, 0xb8, 0x9d, 0x67, 0x92, 0x25, 0x4d, 0xc1, 0x60, 0x68, 0x30, 0x94, + 0xa1, 0xd4, 0x1a, 0x8d, 0xe9, 0xe5, 0xce, 0x9f, 0x17, 0xa1, 0x2c, 0xbf, 0x0d, 0xd1, 0x3e, 0xd4, + 0xba, 0x81, 0xdd, 0x3b, 0x17, 0xaf, 0x8c, 0xc8, 0x9c, 0x7a, 0x78, 0x94, 0x2e, 0x36, 0xd7, 0x32, + 0x56, 0xd8, 0x05, 0x7c, 0xee, 0x3b, 0x06, 0x7a, 0x0d, 0x8d, 0xf4, 0xe3, 0x19, 0xc2, 0x9a, 0x7c, + 0xce, 0xdb, 0x60, 0x73, 0x73, 0xa6, 0x0c, 0xb7, 0x8e, 0xf6, 0xa0, 0xa2, 0x1e, 0x97, 0x90, 0xfe, + 0xfd, 0x9f, 0x7a, 0x9c, 0x6a, 0x9a, 0x99, 0x6b, 0xc2, 0xc6, 0x2b, 0x3e, 0xb8, 0xf4, 0x57, 0x27, + 0xf4, 0x61, 0x72, 0xeb, 0x8c, 0xb7, 0xaa, 0xe6, 0xdd, 0x59, 0x22, 0xc2, 0x70, 0x17, 0xea, 0xc9, + 0xb7, 0x13, 0xa4, 0x87, 0x94, 0xf9, 0x36, 0xd3, 0xdc, 0x98, 0x21, 0x11, 0x59, 0x4d, 0xee, 0x87, + 0x36, 0x73, 0x5d, 0xc9, 0xb2, 0x9a, 0xf1, 0x9e, 0x82, 0xe7, 0xd0, 0xcf, 0x01, 0x4d, 0x3f, 0x08, + 0xa0, 0x8f, 0xae, 0xf3, 0x78, 0xd1, 0xc4, 0x57, 0x48, 0x89, 0x1d, 0x7e, 0x06, 0xcb, 0x53, 0x9f, + 0xb2, 0xe8, 0xff, 0x34, 0xd5, 0xbc, 0x27, 0x82, 0xe6, 0x87, 0xb3, 0x85, 0xa2, 0x00, 0xa6, 0xbf, + 0x28, 0x13, 0x01, 0xe4, 0x7e, 0xbb, 0x26, 0x02, 0xc8, 0xf9, 0x2c, 0x15, 0xb5, 0xa6, 0xbe, 0x64, + 0x12, 0xb5, 0x96, 0xfa, 0xe2, 0x49, 0xd4, 0x5a, 0xe2, 0xd3, 0x07, 0xcf, 0xa1, 0xc7, 0x50, 0x96, + 0x2c, 0xb4, 0x3e, 0x2d, 0xa6, 0x2c, 0xdc, 0xca, 0x5a, 0x12, 0x06, 0x4e, 0x60, 0x41, 0xbf, 0xf4, + 0xa1, 0x8d, 0xdc, 0x4f, 0x62, 0x61, 0x6a, 0xe6, 0x27, 0x73, 0x14, 0x14, 0xbf, 0xc0, 0xa4, 0x83, + 0xd2, 0xaf, 0x72, 0xe9, 0xa0, 0xe2, 0x1b, 0x0f, 0x9e, 0x43, 0x7d, 0xfe, 0x6c, 0x3b, 0x35, 0xbc, + 0xd1, 0xbd, 0xa4, 0x4e, 0xde, 0x45, 0xa7, 0xf9, 0xd1, 0x95, 0x72, 0x62, 0x9f, 0x16, 0x54, 0xa3, + 0x01, 0x8a, 0x6e, 0x6b, 0x4a, 0xe9, 0x71, 0xde, 0x5c, 0xcf, 0x5e, 0x8c, 0x30, 0x90, 0x43, 0x2c, + 0x81, 0x41, 0x72, 0x50, 0x26, 0x30, 0xd0, 0x67, 0x1e, 0x9e, 0x43, 0x4f, 0x01, 0xe2, 0x31, 0x84, + 0xee, 0x24, 0xa6, 0x76, 0x6a, 0x90, 0x35, 0x9b, 0x39, 0xab, 0x2a, 0xfb, 0x0b, 0xfa, 0x54, 0x4a, + 0xa0, 0x99, 0x31, 0xae, 0x9a, 0x0d, 0xfd, 0x69, 0x87, 0x75, 0x6b, 0x3c, 0x87, 0x9e, 0x40, 0x3d, + 0x39, 0xac, 0x12, 0xfd, 0x20, 0x73, 0x8e, 0x65, 0xda, 0x79, 0x0d, 0x66, 0xde, 0x14, 0x43, 0x0f, + 0x92, 0x16, 0x67, 0x8d, 0xba, 0x4c, 0xdb, 0x2e, 0xac, 0x65, 0xcf, 0x23, 0xb4, 0x95, 0xb4, 0x9c, + 0x3f, 0x05, 0x9b, 0xf7, 0xae, 0x21, 0xc9, 0xb3, 0xba, 0xf7, 0xe5, 0x5f, 0xde, 0x6f, 0x18, 0x7f, + 0x7f, 0xbf, 0x61, 0xfc, 0xf3, 0xfd, 0x86, 0xf1, 0xbb, 0x7f, 0x6d, 0xcc, 0x01, 0xee, 0x0d, 0xb6, + 0x7b, 0x24, 0xf0, 0xb6, 0x6d, 0x77, 0xd8, 0x23, 0xdb, 0xfe, 0xce, 0xb6, 0xb2, 0x14, 0x8c, 0x7b, + 0x21, 0x09, 0x2e, 0x48, 0xf0, 0xba, 0x30, 0x3e, 0x3d, 0xbd, 0xc1, 0xff, 0x18, 0xfc, 0xfc, 0xbf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x25, 0x1d, 0x58, 0x32, 0x1c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3423,7 +3480,7 @@ type ControlClient interface { RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) } type controlClient struct { @@ -3637,8 +3694,8 @@ func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlo return out, nil } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) if err != nil { return nil, err @@ -3668,7 +3725,7 @@ type ControlServer interface { RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -5939,6 +5996,12 @@ func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) i += copy(dAtA[i:], m.NewDefaultRevision) } + if len(m.Info) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i += copy(dAtA[i:], m.Info) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -6109,6 +6172,33 @@ func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *SetRepoDefaultRevisionReply) 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 *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Info) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i += copy(dAtA[i:], m.Info) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7138,6 +7228,10 @@ func (m *AddRepoReply) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7240,6 +7334,22 @@ func (m *SetRepoDefaultRevisionRequest) Size() (n int) { return n } +func (m *SetRepoDefaultRevisionReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Empty) Size() (n int) { if m == nil { return 0 @@ -12960,6 +13070,38 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { } m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Info = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -13481,6 +13623,92 @@ func (m *SetRepoDefaultRevisionRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control + } + 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Info = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index e0a339ada..c5e0e61df 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2808,6 +2808,7 @@ func (m *AddRepoRequest) GetDefaultRevision() string { type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2853,6 +2854,13 @@ func (m *AddRepoReply) GetNewDefaultRevision() string { return "" } +func (m *AddRepoReply) GetInfo() string { + if m != nil { + return m.Info + } + return "" +} + type RemoveRepoRequest struct { Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3143,6 +3151,53 @@ func (m *SetRepoDefaultRevisionRequest) GetRevision() string { return "" } +type SetRepoDefaultRevisionReply struct { + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } +func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} +} +func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalTo(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) +} +func (m *SetRepoDefaultRevisionReply) XXX_Size() int { + return m.Size() +} +func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) +} + +var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionReply) GetInfo() string { + if m != nil { + return m.Info + } + return "" +} + type Empty struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -3153,7 +3208,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3238,157 +3293,159 @@ func init() { proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") proto.RegisterType((*Empty)(nil), "o2control.Empty") } func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2292 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0x5f, 0x73, 0x1b, 0x49, - 0x11, 0xf7, 0xca, 0x52, 0x24, 0xb5, 0x6c, 0x59, 0x1e, 0x3b, 0xce, 0x5a, 0x97, 0x73, 0x7c, 0xc3, - 0x55, 0xce, 0xc9, 0x1d, 0x0e, 0xf8, 0xae, 0xe0, 0x48, 0xdd, 0x5d, 0xf0, 0x1f, 0xc5, 0x31, 0xc4, - 0x56, 0x58, 0x29, 0x49, 0x91, 0x2a, 0x2a, 0xac, 0xb5, 0x23, 0x4b, 0xe7, 0xd5, 0x8e, 0x6e, 0x77, - 0xe4, 0xc4, 0x0f, 0xbc, 0xf1, 0x46, 0x51, 0x3c, 0xf0, 0xc2, 0x2b, 0x45, 0xf1, 0xc0, 0x03, 0xdf, - 0x83, 0x17, 0x0a, 0xf8, 0x06, 0x54, 0xa8, 0xe2, 0x89, 0x0f, 0x41, 0xcd, 0x9f, 0xdd, 0x9d, 0x5d, - 0xed, 0xca, 0xae, 0xba, 0x37, 0x75, 0x4f, 0x77, 0x4f, 0x77, 0xff, 0x7a, 0xba, 0x67, 0x56, 0xb0, - 0x36, 0xf6, 0x29, 0xa3, 0xc1, 0x03, 0xba, 0xd3, 0xa3, 0x1e, 0xf3, 0xa9, 0xbb, 0x2d, 0x18, 0xa8, - 0x1a, 0x31, 0xf0, 0x1a, 0xac, 0xb6, 0x2e, 0x88, 0xc7, 0x5e, 0x1f, 0x93, 0x80, 0x06, 0x4f, 0x88, - 0xed, 0xb3, 0x53, 0x62, 0x33, 0xbc, 0x04, 0x8b, 0x1d, 0x66, 0xb3, 0x49, 0x60, 0x91, 0x6f, 0x26, - 0x24, 0x60, 0xf8, 0x14, 0x6a, 0x21, 0x63, 0xec, 0x5e, 0xa2, 0x55, 0x28, 0x05, 0xcc, 0x66, 0xc4, - 0x34, 0x36, 0x8d, 0xad, 0xaa, 0x25, 0x09, 0xf4, 0x25, 0x2c, 0x06, 0x42, 0xe8, 0xf9, 0xd8, 0xb1, - 0x19, 0x09, 0xcc, 0xc2, 0xe6, 0xfc, 0x56, 0x6d, 0xe7, 0xd6, 0x76, 0xec, 0x41, 0x47, 0x5b, 0xb7, - 0x92, 0xd2, 0xf8, 0xef, 0x06, 0x2c, 0xe8, 0xeb, 0xe8, 0x53, 0x28, 0xb9, 0xe4, 0x82, 0xb8, 0x62, - 0x97, 0xfa, 0xce, 0xfb, 0x39, 0x76, 0xb6, 0x9f, 0x72, 0x21, 0x4b, 0xca, 0xa2, 0x23, 0xa8, 0x8f, - 0x12, 0xc1, 0x98, 0x85, 0x4d, 0x63, 0xab, 0xb6, 0x73, 0x47, 0xd3, 0xce, 0x8a, 0xf9, 0xc9, 0x9c, - 0x95, 0x52, 0xc4, 0x9f, 0x41, 0x49, 0x98, 0x46, 0x55, 0x28, 0x1d, 0xb4, 0xf6, 0x9e, 0x1f, 0x36, - 0xe6, 0x50, 0x05, 0x8a, 0x47, 0x27, 0x8f, 0xdb, 0x0d, 0x03, 0xd5, 0xa0, 0xfc, 0x72, 0xd7, 0x3a, - 0x39, 0x3a, 0x39, 0x6c, 0x14, 0xb8, 0x44, 0xcb, 0xb2, 0xda, 0x56, 0x63, 0x7e, 0xaf, 0x0c, 0x25, - 0x61, 0x1f, 0xaf, 0xc3, 0xad, 0x43, 0xc2, 0x1e, 0xfb, 0xf6, 0x88, 0xbc, 0xa1, 0xfe, 0xf9, 0x91, - 0xd7, 0xa7, 0x61, 0x3a, 0xff, 0x64, 0x40, 0xf9, 0x05, 0xf1, 0x83, 0x21, 0xf5, 0x78, 0x2e, 0x47, - 0xf6, 0xd7, 0xd4, 0x17, 0x51, 0x96, 0x2c, 0x49, 0x08, 0xee, 0xd0, 0xa3, 0xbe, 0xf0, 0x9e, 0x73, - 0x39, 0xc1, 0xb9, 0x63, 0x9b, 0xf5, 0x06, 0xe6, 0xbc, 0xe4, 0x0a, 0x82, 0x73, 0x4f, 0x27, 0x43, - 0xd7, 0x31, 0x8b, 0x12, 0x0d, 0x41, 0xa0, 0x4d, 0xa8, 0x8d, 0x7d, 0xea, 0x4c, 0x7a, 0xec, 0xc4, - 0x1e, 0x11, 0xb3, 0x24, 0xd6, 0x74, 0x16, 0xda, 0x00, 0xb8, 0x90, 0x4e, 0x74, 0x98, 0x6f, 0xde, - 0x10, 0x02, 0x1a, 0x07, 0xff, 0xae, 0x00, 0x37, 0xa7, 0x23, 0xe0, 0xf8, 0x6f, 0x42, 0xad, 0x1f, - 0x71, 0x1d, 0x55, 0x05, 0x3a, 0x0b, 0x7d, 0x02, 0xcb, 0xc4, 0xbb, 0x18, 0xfa, 0xd4, 0x1b, 0x11, - 0x8f, 0x05, 0xfb, 0x74, 0xe2, 0x31, 0x15, 0xcb, 0xf4, 0x02, 0xf7, 0x84, 0xd9, 0xc1, 0xb9, 0x12, - 0x93, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0x68, 0x10, 0x1a, 0x2f, - 0x49, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x80, 0xd9, 0x5e, 0x8f, 0x88, 0x14, 0xc8, 0x08, - 0x13, 0x3c, 0xf4, 0x09, 0x94, 0x55, 0xc4, 0x66, 0x59, 0xd4, 0x09, 0xd2, 0xea, 0x44, 0x41, 0x64, - 0x85, 0x22, 0xf8, 0x1e, 0x2c, 0x75, 0x89, 0xed, 0x3b, 0xf4, 0x8d, 0xa7, 0xa0, 0x44, 0x6b, 0x70, - 0xc3, 0x27, 0x76, 0x40, 0x3d, 0x95, 0x05, 0x45, 0xf1, 0x23, 0x14, 0x8b, 0x8e, 0xdd, 0x4b, 0x6c, - 0xc2, 0xda, 0x21, 0x61, 0x2d, 0x2d, 0xf6, 0xb0, 0x1a, 0xde, 0xc2, 0xea, 0xd4, 0xca, 0xf5, 0xb2, - 0xfc, 0x15, 0x2c, 0xe8, 0xc9, 0x54, 0x07, 0xae, 0xa9, 0x97, 0x7a, 0xbc, 0x2c, 0xe0, 0x4b, 0xc8, - 0xe3, 0x7f, 0x19, 0xb0, 0x94, 0x92, 0x40, 0x75, 0x28, 0x0c, 0xc3, 0xcd, 0x0a, 0x43, 0x51, 0x47, - 0x3d, 0x9f, 0xd8, 0x8c, 0x38, 0x2f, 0x07, 0xc4, 0x13, 0x18, 0x56, 0x2d, 0x9d, 0x15, 0xa3, 0x33, - 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x81, 0xa0, 0x59, 0x14, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, 0x50, 0x9f, - 0x75, 0xed, 0x40, 0x56, 0x94, 0x14, 0x43, 0x4d, 0xa8, 0xf8, 0x94, 0x32, 0x8b, 0xba, 0x61, 0xb1, - 0x46, 0x34, 0xba, 0x0f, 0x8d, 0xde, 0xc4, 0xf7, 0x89, 0xc7, 0xac, 0x89, 0x77, 0x32, 0x19, 0x9d, - 0x12, 0x59, 0xaf, 0x8b, 0xd6, 0x14, 0x1f, 0xef, 0xc3, 0xcd, 0x13, 0xf2, 0x46, 0x8b, 0x2a, 0x44, - 0xea, 0x3e, 0x34, 0x78, 0xda, 0xfa, 0x2e, 0x7d, 0xd3, 0x25, 0xa3, 0xb1, 0x1b, 0xf7, 0xaf, 0x29, - 0x3e, 0xee, 0xc0, 0x4a, 0xda, 0x08, 0x47, 0xe4, 0x0b, 0xa8, 0x69, 0xf9, 0x13, 0xda, 0xb3, 0xd3, - 0xad, 0x8b, 0xe3, 0x8f, 0xc4, 0x71, 0xca, 0xf0, 0x2c, 0x95, 0x72, 0xfc, 0x6b, 0x03, 0x56, 0xd2, - 0x92, 0xdf, 0x7a, 0x7b, 0xf4, 0x00, 0x2a, 0x61, 0x9c, 0xaa, 0x27, 0xae, 0x68, 0xaa, 0x3c, 0xcf, - 0x42, 0x27, 0x12, 0xc2, 0xff, 0x30, 0x60, 0x7d, 0x5f, 0x2e, 0x5f, 0xed, 0x34, 0x7a, 0x04, 0x45, - 0x76, 0x39, 0x26, 0xc2, 0x74, 0x7d, 0xe7, 0x63, 0xcd, 0x74, 0xae, 0x8d, 0xed, 0xf6, 0x98, 0xab, - 0x58, 0x42, 0x11, 0xdb, 0x70, 0x43, 0xd2, 0xbc, 0xc9, 0x9e, 0xb4, 0xdb, 0xcf, 0x1a, 0x73, 0x08, - 0x41, 0xbd, 0xd3, 0xdd, 0xb5, 0xba, 0xaf, 0x77, 0xf7, 0xbb, 0x47, 0x2f, 0x8e, 0xba, 0x3f, 0x6f, - 0x18, 0x68, 0x19, 0x16, 0x3b, 0xdd, 0xf6, 0xb3, 0x98, 0x55, 0x40, 0x8b, 0x50, 0xdd, 0x6f, 0x9f, - 0x3c, 0x3e, 0x3a, 0x7c, 0x6e, 0xb5, 0x1a, 0xf3, 0xbc, 0x1b, 0x5b, 0xad, 0x4e, 0xab, 0xdb, 0x28, - 0xa2, 0x05, 0xa8, 0x1c, 0xb6, 0x5f, 0xcb, 0xde, 0x5c, 0xc2, 0xe7, 0x70, 0x2b, 0xcb, 0x19, 0x9e, - 0xdb, 0x74, 0x38, 0x51, 0x51, 0x17, 0xf4, 0xa2, 0xce, 0x2a, 0xc4, 0xf9, 0x9c, 0x42, 0xfc, 0xbd, - 0x01, 0xe6, 0x31, 0x75, 0x86, 0xfd, 0xcb, 0x6b, 0x65, 0x0f, 0xe8, 0x98, 0xf8, 0x36, 0x1b, 0x52, - 0x2f, 0x3c, 0xc7, 0x77, 0xb2, 0x91, 0x6d, 0x87, 0x72, 0x96, 0xa6, 0x82, 0xee, 0x42, 0xdd, 0x27, - 0x3d, 0xea, 0xf5, 0x87, 0x67, 0x13, 0x9f, 0xec, 0xba, 0xae, 0xf0, 0xab, 0x62, 0xa5, 0xb8, 0xf8, - 0x8f, 0x06, 0xac, 0x66, 0x19, 0x43, 0x0f, 0x15, 0x7e, 0x72, 0xd8, 0xde, 0xbd, 0x62, 0xef, 0x04, - 0x74, 0xf2, 0xec, 0xba, 0xb2, 0xcb, 0x16, 0xc2, 0xb3, 0x2b, 0x69, 0xfc, 0xfd, 0x0c, 0x58, 0x97, - 0xa0, 0x66, 0xb5, 0x8e, 0xdb, 0x2f, 0x5a, 0xaf, 0xad, 0xf6, 0x53, 0x8e, 0xd8, 0x02, 0x54, 0x76, - 0x0f, 0x0e, 0x24, 0x55, 0xc4, 0xbf, 0x31, 0x60, 0x2d, 0x23, 0x73, 0x1c, 0xa6, 0x9f, 0x42, 0xa3, - 0x6f, 0x0f, 0x5d, 0xe2, 0xb4, 0xe3, 0x6c, 0x19, 0xd7, 0xcb, 0xd6, 0x94, 0xa2, 0x02, 0xa1, 0x30, - 0x8d, 0xb9, 0xde, 0xc8, 0xf0, 0x11, 0xac, 0x1f, 0x90, 0x80, 0xf9, 0xf4, 0x3a, 0x38, 0xde, 0x86, - 0xea, 0x39, 0x21, 0xe3, 0xae, 0xe8, 0x7c, 0x05, 0x81, 0x40, 0xcc, 0xc0, 0x04, 0x6e, 0x65, 0x99, - 0xe2, 0x81, 0xfd, 0x04, 0x96, 0x7b, 0x2e, 0xb1, 0xbd, 0x89, 0x14, 0x15, 0x4c, 0x75, 0xc2, 0x6f, - 0xeb, 0x67, 0x29, 0x2d, 0x63, 0x4d, 0xab, 0xe1, 0xff, 0x1a, 0xb0, 0x98, 0xe8, 0xb1, 0x08, 0x41, - 0xd1, 0xe3, 0xe0, 0x48, 0x47, 0xc5, 0x6f, 0x3e, 0xb9, 0x5c, 0xda, 0x3b, 0x27, 0x8e, 0xf2, 0x53, - 0x51, 0x9c, 0xcf, 0x3b, 0xf2, 0x91, 0xa3, 0xd2, 0xa0, 0x28, 0xce, 0x97, 0x17, 0x36, 0x35, 0x85, - 0x15, 0x15, 0x67, 0xad, 0xa4, 0x9f, 0x94, 0xdb, 0x50, 0xed, 0xb9, 0x76, 0x10, 0x68, 0x93, 0x37, - 0x66, 0xa0, 0x16, 0xd4, 0x1d, 0x32, 0x76, 0xe9, 0x65, 0xd8, 0xaa, 0xd4, 0xf4, 0xd5, 0xef, 0x78, - 0xdc, 0xf9, 0x83, 0x84, 0x90, 0x95, 0x52, 0xe2, 0x8d, 0x12, 0x4d, 0x8b, 0xf1, 0x72, 0xe4, 0xd7, - 0x00, 0x2d, 0xe2, 0x88, 0x46, 0x26, 0x94, 0xed, 0x33, 0x2e, 0x18, 0x02, 0x1f, 0x92, 0x7c, 0x85, - 0xf6, 0xfb, 0xc4, 0x8f, 0x02, 0x0f, 0x49, 0x7e, 0xd1, 0x20, 0x6f, 0x49, 0x6f, 0xc2, 0x28, 0x5f, - 0x94, 0xd1, 0x6b, 0x1c, 0xbc, 0x0c, 0x4b, 0x87, 0x84, 0x29, 0x00, 0xe4, 0x4c, 0x7f, 0x04, 0x8b, - 0x31, 0x8b, 0xe3, 0x1b, 0x8d, 0x43, 0xe3, 0x5a, 0xe3, 0x10, 0x6f, 0x41, 0x5d, 0x19, 0xd0, 0x6e, - 0x1a, 0x0a, 0x17, 0x43, 0xc7, 0x05, 0xff, 0x10, 0x16, 0x22, 0x49, 0xbe, 0xd3, 0x47, 0x50, 0xe4, - 0x2b, 0xaa, 0x78, 0x56, 0x52, 0x19, 0x15, 0x7b, 0x08, 0x01, 0xdc, 0x82, 0x45, 0xce, 0xd9, 0xe7, - 0xa8, 0xe4, 0x56, 0x09, 0x1f, 0xff, 0x52, 0xfd, 0x98, 0x3a, 0x24, 0x1a, 0xff, 0x31, 0x0b, 0xff, - 0x0a, 0x6a, 0xfb, 0x74, 0x34, 0xb2, 0x3d, 0x47, 0x18, 0x69, 0xc0, 0x3c, 0xf1, 0x2e, 0x44, 0x98, - 0x55, 0x8b, 0xff, 0x14, 0x05, 0x32, 0x20, 0xae, 0xab, 0xea, 0x4c, 0x12, 0x9c, 0x7b, 0x61, 0xbb, - 0x93, 0xe8, 0xb0, 0x09, 0x82, 0x97, 0x8d, 0xed, 0x9f, 0x4d, 0xe4, 0x75, 0xa6, 0x28, 0x6c, 0xc4, - 0x0c, 0xee, 0xe0, 0x24, 0x20, 0xbe, 0xaa, 0x34, 0xf1, 0x1b, 0x1f, 0x43, 0x6d, 0x7f, 0x60, 0x7b, - 0x1e, 0x71, 0x73, 0x63, 0x40, 0xda, 0x68, 0xaa, 0xaa, 0x96, 0x25, 0xb2, 0xe9, 0x9f, 0x11, 0x16, - 0x57, 0x39, 0xa7, 0xf0, 0xff, 0x0a, 0x50, 0x89, 0x8e, 0xcd, 0x0f, 0xa0, 0x1a, 0x70, 0x70, 0x44, - 0x85, 0xca, 0x7c, 0xe6, 0x03, 0x17, 0x8b, 0x72, 0xbd, 0x5e, 0x98, 0x55, 0x35, 0x6b, 0xcd, 0x14, - 0x0e, 0x51, 0xd6, 0xad, 0x58, 0x14, 0xfd, 0x18, 0x96, 0x86, 0xde, 0x29, 0x9d, 0x78, 0x8e, 0x0a, - 0x29, 0x30, 0xe7, 0x45, 0xb9, 0xac, 0xe9, 0x2d, 0x20, 0x8e, 0xd6, 0x4a, 0x8b, 0xa3, 0x3d, 0x68, - 0xd0, 0x09, 0x4b, 0x9a, 0x28, 0xce, 0x34, 0x31, 0x25, 0x8f, 0x3e, 0xe7, 0x90, 0x47, 0x80, 0x8a, - 0x64, 0xa7, 0xd4, 0xe3, 0x55, 0x4b, 0x17, 0xe5, 0x07, 0x8f, 0x57, 0xd6, 0x33, 0x9b, 0x0d, 0xd4, - 0x99, 0x8f, 0x68, 0x8e, 0x37, 0xf1, 0x2e, 0x8e, 0x1c, 0x71, 0xd2, 0xab, 0x96, 0x24, 0xf0, 0x03, - 0x58, 0x49, 0xb6, 0x34, 0x59, 0xeb, 0x26, 0x94, 0x65, 0x75, 0x07, 0xaa, 0x90, 0x42, 0x12, 0xff, - 0xd6, 0x80, 0xe5, 0xa9, 0x26, 0x88, 0x1e, 0x42, 0xed, 0x7c, 0xe8, 0xba, 0xc4, 0xe9, 0x5e, 0xeb, - 0x8c, 0xe9, 0xc2, 0xe8, 0x0b, 0x58, 0xf0, 0x27, 0x9e, 0x37, 0xf4, 0xce, 0xc2, 0xae, 0x3d, 0x5b, - 0x39, 0x21, 0x8d, 0xf7, 0xc5, 0xd9, 0xe7, 0xb7, 0xa7, 0xc8, 0xf9, 0x28, 0x52, 0x43, 0x8b, 0x94, - 0xe7, 0x66, 0x6c, 0xb3, 0x41, 0x67, 0x4c, 0x7a, 0xe1, 0x8c, 0x0c, 0x69, 0xfc, 0x57, 0x03, 0x2a, - 0xe1, 0x05, 0x2c, 0xaf, 0x57, 0xab, 0xde, 0x5b, 0xc8, 0xee, 0xbd, 0x89, 0xab, 0x77, 0x13, 0x2a, - 0xfd, 0x89, 0xeb, 0x0a, 0x18, 0x64, 0xb7, 0x8a, 0x68, 0x3d, 0xb3, 0xa5, 0x44, 0x66, 0xd1, 0x3d, - 0x28, 0xf1, 0xa1, 0x1d, 0x98, 0x37, 0x44, 0x02, 0x32, 0x2f, 0x87, 0x52, 0x02, 0x3f, 0x14, 0xdd, - 0x4d, 0x05, 0xcd, 0xf3, 0x1f, 0xe9, 0x1a, 0x57, 0xea, 0xfe, 0xd9, 0x80, 0xf7, 0x0e, 0x09, 0x7b, - 0x99, 0xba, 0x72, 0x47, 0xd9, 0xdb, 0x84, 0x9a, 0x4f, 0xc6, 0xf4, 0x99, 0xcd, 0x18, 0xf1, 0xc3, - 0x57, 0x95, 0xce, 0x42, 0x5b, 0xb0, 0xe4, 0x93, 0x8b, 0x21, 0x7f, 0x91, 0x85, 0x52, 0x32, 0x2b, - 0x69, 0x36, 0xb7, 0x65, 0xbb, 0xee, 0x9e, 0x6f, 0x7b, 0xbd, 0x01, 0x09, 0xd4, 0x8d, 0x48, 0x67, - 0x89, 0x71, 0xe0, 0xba, 0x5d, 0xfb, 0x4c, 0x4e, 0xb5, 0x8a, 0x15, 0x92, 0xf8, 0x14, 0x56, 0xd3, - 0x3e, 0x86, 0xf0, 0x70, 0x67, 0x42, 0x78, 0xf8, 0x6f, 0x51, 0xf7, 0xe1, 0x93, 0x42, 0x61, 0x1b, - 0xd2, 0xe2, 0x6e, 0xa4, 0xdc, 0x52, 0x28, 0x45, 0x34, 0xfe, 0x1a, 0xd6, 0xb3, 0x53, 0xc1, 0x73, - 0x7a, 0x0c, 0xcb, 0xe9, 0x77, 0x49, 0xd6, 0x5d, 0x27, 0xcb, 0x49, 0x6b, 0x5a, 0x13, 0x23, 0x68, - 0x3c, 0x1d, 0x06, 0xfc, 0xb6, 0x41, 0xb5, 0xcf, 0x3a, 0x15, 0x4e, 0xe7, 0x96, 0x9d, 0x09, 0x65, - 0x87, 0xf4, 0xed, 0x89, 0xcb, 0x54, 0xef, 0x0e, 0x49, 0x8e, 0x81, 0xfa, 0x69, 0x25, 0x83, 0x4b, - 0xb3, 0xf1, 0x37, 0x50, 0xd7, 0xf6, 0x0d, 0x8b, 0x85, 0x53, 0x59, 0xc5, 0xa2, 0xbc, 0xb1, 0xa4, - 0x04, 0xfa, 0x0c, 0x6e, 0x9e, 0xb9, 0xf4, 0xd4, 0x76, 0x0f, 0x52, 0x9b, 0xc9, 0x2c, 0x67, 0x2f, - 0xe2, 0x13, 0xa8, 0xef, 0x3a, 0x0e, 0xb7, 0x15, 0x16, 0x55, 0x56, 0x70, 0x19, 0x21, 0x14, 0xb2, - 0x43, 0xf8, 0x0a, 0x16, 0x22, 0x7b, 0x72, 0x96, 0x23, 0x8f, 0xbc, 0x49, 0xbb, 0x24, 0x6d, 0x67, - 0xac, 0xe0, 0x7b, 0xb0, 0x6c, 0x91, 0x11, 0xbd, 0x20, 0xba, 0x4b, 0xab, 0x50, 0x1a, 0x7a, 0x0e, - 0x79, 0x1b, 0x7e, 0xf7, 0x11, 0x04, 0xfe, 0x11, 0x2c, 0xe9, 0xa2, 0x7c, 0xb7, 0xbb, 0x50, 0xd7, - 0x6d, 0x46, 0xa5, 0x97, 0xe2, 0xe2, 0x8f, 0x61, 0xc5, 0x22, 0x7d, 0x9f, 0x04, 0x03, 0x1d, 0xe3, - 0x9c, 0x7d, 0xbe, 0x0b, 0x37, 0x3b, 0x84, 0x69, 0xea, 0xb3, 0xc5, 0xbf, 0x84, 0x3b, 0x1d, 0xc2, - 0x0e, 0xb3, 0xb2, 0x1d, 0x2a, 0xea, 0x75, 0x6e, 0xa4, 0xea, 0xfc, 0x67, 0xf0, 0x7e, 0x87, 0x88, - 0x6d, 0x72, 0x94, 0x33, 0x77, 0x4d, 0x98, 0x2c, 0xa4, 0x4c, 0x96, 0xa1, 0xd4, 0x1a, 0x8d, 0xd9, - 0xe5, 0xce, 0x5f, 0x16, 0xa1, 0xac, 0x1e, 0x75, 0x68, 0x1f, 0x6a, 0x5d, 0xdf, 0xee, 0x9d, 0xcb, - 0xcf, 0x83, 0xc8, 0x9c, 0xfa, 0x62, 0xa8, 0xf6, 0x6b, 0xae, 0x65, 0xac, 0xf0, 0x9b, 0xf3, 0xdc, - 0xf7, 0x0c, 0xf4, 0x0a, 0x1a, 0xe9, 0xaf, 0x5e, 0x08, 0x6b, 0xf2, 0x39, 0x1f, 0xf5, 0x9a, 0x9b, - 0x33, 0x65, 0x84, 0x75, 0xb4, 0x07, 0x95, 0xf0, 0xab, 0x10, 0xd2, 0x1f, 0xee, 0xa9, 0xaf, 0x4a, - 0x4d, 0x33, 0x73, 0x4d, 0xda, 0x78, 0x29, 0x26, 0x8e, 0xfe, 0xb9, 0x08, 0x7d, 0x90, 0xdc, 0x3a, - 0xe3, 0x23, 0x53, 0xf3, 0xce, 0x2c, 0x11, 0x69, 0xb8, 0x0b, 0xf5, 0xe4, 0x47, 0x0f, 0xa4, 0x87, - 0x94, 0xf9, 0x51, 0xa5, 0xb9, 0x31, 0x43, 0x22, 0xb2, 0x9a, 0xdc, 0x0f, 0x6d, 0xe6, 0xba, 0x92, - 0x65, 0x35, 0xe3, 0x43, 0x08, 0x9e, 0x43, 0xbf, 0x04, 0x34, 0xfd, 0x92, 0x47, 0x1f, 0x5e, 0xe7, - 0xab, 0x43, 0x13, 0x5f, 0x21, 0x25, 0x77, 0xf8, 0x05, 0x2c, 0x4f, 0xbd, 0x41, 0xd1, 0x77, 0x34, - 0xd5, 0xbc, 0xb7, 0x7d, 0xf3, 0x83, 0xd9, 0x42, 0x51, 0x00, 0xd3, 0x4f, 0xc1, 0x44, 0x00, 0xb9, - 0x8f, 0xce, 0x44, 0x00, 0x39, 0xef, 0x49, 0x59, 0x6b, 0xe1, 0x13, 0x24, 0x51, 0x6b, 0xa9, 0xa7, - 0x4a, 0xa2, 0xd6, 0x12, 0x6f, 0x16, 0x3c, 0x87, 0x1e, 0x41, 0x59, 0xb1, 0xd0, 0xfa, 0xb4, 0x58, - 0x68, 0xe1, 0x56, 0xd6, 0x92, 0x34, 0x70, 0x02, 0x0b, 0xfa, 0x6d, 0x0d, 0x6d, 0xe4, 0xbe, 0x65, - 0xa5, 0xa9, 0x99, 0x6f, 0xdd, 0x28, 0x28, 0x71, 0xf3, 0x48, 0x07, 0xa5, 0xdf, 0xc1, 0xd2, 0x41, - 0xc5, 0x57, 0x15, 0x3c, 0x87, 0xfa, 0xe2, 0x7b, 0xeb, 0xd4, 0xd4, 0x45, 0x77, 0x93, 0x3a, 0x79, - 0x37, 0x94, 0xe6, 0x87, 0x57, 0xca, 0xc9, 0x7d, 0x5a, 0x50, 0x8d, 0x26, 0x1f, 0x7a, 0x4f, 0x53, - 0x4a, 0xcf, 0xe1, 0xe6, 0x7a, 0xf6, 0x62, 0x84, 0x81, 0x9a, 0x3e, 0x09, 0x0c, 0x92, 0x13, 0x2e, - 0x81, 0x81, 0x3e, 0xac, 0xf0, 0x1c, 0x7a, 0x02, 0x10, 0xcf, 0x14, 0x74, 0x3b, 0x31, 0x6e, 0x53, - 0x53, 0xa9, 0xd9, 0xcc, 0x59, 0x0d, 0xb3, 0xbf, 0xa0, 0x8f, 0x98, 0x04, 0x9a, 0x19, 0xb3, 0xa7, - 0xd9, 0xd0, 0xbf, 0xc9, 0xf0, 0x6e, 0x8d, 0xe7, 0xd0, 0x63, 0xa8, 0x27, 0x27, 0x4f, 0xa2, 0x1f, - 0x64, 0x0e, 0xa5, 0x4c, 0x3b, 0xaf, 0xc0, 0xcc, 0x1b, 0x49, 0xe8, 0x7e, 0xd2, 0xe2, 0xac, 0xb9, - 0x95, 0x69, 0xfb, 0x05, 0xac, 0x65, 0xcf, 0x2b, 0xb4, 0x95, 0xb4, 0x9c, 0x3f, 0xd2, 0xb2, 0xec, - 0xee, 0x7d, 0xfe, 0xb7, 0x77, 0x1b, 0xc6, 0x3f, 0xdf, 0x6d, 0x18, 0xff, 0x7e, 0xb7, 0x61, 0xfc, - 0xe1, 0x3f, 0x1b, 0x73, 0x80, 0x7b, 0x83, 0xed, 0x1e, 0xf1, 0xbd, 0x6d, 0xdb, 0x1d, 0xf6, 0xc8, - 0x36, 0xdd, 0xd9, 0x0e, 0x75, 0xfc, 0x71, 0x2f, 0x20, 0xfe, 0x05, 0xf1, 0x5f, 0x15, 0xc6, 0xa7, - 0xa7, 0x37, 0xc4, 0x7f, 0x77, 0x9f, 0xfe, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xef, 0x3e, 0xd0, 0xb5, - 0xd5, 0x1b, 0x00, 0x00, + // 2317 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, + 0xf1, 0xd7, 0x50, 0xa4, 0x49, 0x16, 0x25, 0x8a, 0x6a, 0xc9, 0xf2, 0x88, 0xf6, 0xca, 0xda, 0xfe, + 0x2f, 0xbc, 0xb2, 0x77, 0xff, 0x72, 0x56, 0xbb, 0x48, 0x36, 0xc6, 0x6e, 0x1c, 0x7d, 0xd0, 0xb2, + 0x12, 0x4b, 0x74, 0x86, 0xb4, 0x8d, 0x18, 0x08, 0x9c, 0x11, 0xa7, 0x29, 0x72, 0x35, 0x9c, 0xe1, + 0xce, 0x34, 0x65, 0xeb, 0x90, 0x5b, 0x6e, 0x41, 0x90, 0x43, 0x2e, 0xb9, 0x06, 0x41, 0x8e, 0x79, + 0x86, 0x5c, 0x73, 0x09, 0x92, 0xbc, 0x41, 0xe0, 0x00, 0x39, 0xe5, 0x21, 0x82, 0xfe, 0x9a, 0xe9, + 0x19, 0xce, 0x50, 0x02, 0x72, 0x63, 0x55, 0x57, 0x55, 0x57, 0xd5, 0xaf, 0xba, 0xaa, 0xa7, 0x09, + 0x6b, 0xe3, 0xc0, 0xa7, 0x7e, 0xf8, 0xd0, 0xdf, 0xe9, 0xf9, 0x1e, 0x0d, 0x7c, 0x77, 0x9b, 0x33, + 0x50, 0x35, 0x62, 0xe0, 0x35, 0x58, 0x6d, 0x5d, 0x10, 0x8f, 0xbe, 0x39, 0x26, 0xa1, 0x1f, 0x3e, + 0x25, 0x76, 0x40, 0x4f, 0x89, 0x4d, 0xf1, 0x12, 0x2c, 0x76, 0xa8, 0x4d, 0x27, 0xa1, 0x45, 0xbe, + 0x9d, 0x90, 0x90, 0xe2, 0x53, 0xa8, 0x29, 0xc6, 0xd8, 0xbd, 0x44, 0xab, 0x50, 0x0a, 0xa9, 0x4d, + 0x89, 0x69, 0x6c, 0x1a, 0x5b, 0x55, 0x4b, 0x10, 0xe8, 0x6b, 0x58, 0x0c, 0xb9, 0xd0, 0x8b, 0xb1, + 0x63, 0x53, 0x12, 0x9a, 0x85, 0xcd, 0xf9, 0xad, 0xda, 0xce, 0xad, 0xed, 0xd8, 0x83, 0x8e, 0xb6, + 0x6e, 0x25, 0xa5, 0xf1, 0x5f, 0x0d, 0x58, 0xd0, 0xd7, 0xd1, 0xe7, 0x50, 0x72, 0xc9, 0x05, 0x71, + 0xf9, 0x2e, 0xf5, 0x9d, 0x0f, 0x72, 0xec, 0x6c, 0x3f, 0x63, 0x42, 0x96, 0x90, 0x45, 0x47, 0x50, + 0x1f, 0x25, 0x82, 0x31, 0x0b, 0x9b, 0xc6, 0x56, 0x6d, 0xe7, 0xae, 0xa6, 0x9d, 0x15, 0xf3, 0xd3, + 0x39, 0x2b, 0xa5, 0x88, 0xbf, 0x80, 0x12, 0x37, 0x8d, 0xaa, 0x50, 0x3a, 0x68, 0xed, 0xbd, 0x38, + 0x6c, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4e, 0x9e, 0xb4, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xd5, 0xae, + 0x75, 0x72, 0x74, 0x72, 0xd8, 0x28, 0x30, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x5e, 0x19, + 0x4a, 0xdc, 0x3e, 0x5e, 0x87, 0x5b, 0x87, 0x84, 0x3e, 0x09, 0xec, 0x11, 0x79, 0xeb, 0x07, 0xe7, + 0x47, 0x5e, 0xdf, 0x57, 0xe9, 0xfc, 0x83, 0x01, 0xe5, 0x97, 0x24, 0x08, 0x87, 0xbe, 0xc7, 0x72, + 0x39, 0xb2, 0xbf, 0xf1, 0x03, 0x1e, 0x65, 0xc9, 0x12, 0x04, 0xe7, 0x0e, 0x3d, 0x3f, 0xe0, 0xde, + 0x33, 0x2e, 0x23, 0x18, 0x77, 0x6c, 0xd3, 0xde, 0xc0, 0x9c, 0x17, 0x5c, 0x4e, 0x30, 0xee, 0xe9, + 0x64, 0xe8, 0x3a, 0x66, 0x51, 0xa0, 0xc1, 0x09, 0xb4, 0x09, 0xb5, 0x71, 0xe0, 0x3b, 0x93, 0x1e, + 0x3d, 0xb1, 0x47, 0xc4, 0x2c, 0xf1, 0x35, 0x9d, 0x85, 0x36, 0x00, 0x2e, 0x84, 0x13, 0x1d, 0x1a, + 0x98, 0x37, 0xb8, 0x80, 0xc6, 0xc1, 0xbf, 0x29, 0xc0, 0xcd, 0xe9, 0x08, 0x18, 0xfe, 0x9b, 0x50, + 0xeb, 0x47, 0x5c, 0x47, 0x56, 0x81, 0xce, 0x42, 0x9f, 0xc2, 0x32, 0xf1, 0x2e, 0x86, 0x81, 0xef, + 0x8d, 0x88, 0x47, 0xc3, 0x7d, 0x7f, 0xe2, 0x51, 0x19, 0xcb, 0xf4, 0x02, 0xf3, 0x84, 0xda, 0xe1, + 0xb9, 0x14, 0x13, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0xfc, 0x50, + 0x19, 0x2f, 0x09, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x90, 0xda, 0x5e, 0x8f, 0xf0, 0x14, + 0x88, 0x08, 0x13, 0x3c, 0xf4, 0x29, 0x94, 0x65, 0xc4, 0x66, 0x99, 0xd7, 0x09, 0xd2, 0xea, 0x44, + 0x42, 0x64, 0x29, 0x11, 0x7c, 0x1f, 0x96, 0xba, 0xc4, 0x0e, 0x1c, 0xff, 0xad, 0x27, 0xa1, 0x44, + 0x6b, 0x70, 0x23, 0x20, 0x76, 0xe8, 0x7b, 0x32, 0x0b, 0x92, 0x62, 0x47, 0x28, 0x16, 0x1d, 0xbb, + 0x97, 0xd8, 0x84, 0xb5, 0x43, 0x42, 0x5b, 0x5a, 0xec, 0xaa, 0x1a, 0xde, 0xc1, 0xea, 0xd4, 0xca, + 0xf5, 0xb2, 0xfc, 0x03, 0x58, 0xd0, 0x93, 0x29, 0x0f, 0x5c, 0x53, 0x2f, 0xf5, 0x78, 0x99, 0xc3, + 0x97, 0x90, 0xc7, 0xff, 0x30, 0x60, 0x29, 0x25, 0x81, 0xea, 0x50, 0x18, 0xaa, 0xcd, 0x0a, 0x43, + 0x5e, 0x47, 0xbd, 0x80, 0xd8, 0x94, 0x38, 0xaf, 0x06, 0xc4, 0xe3, 0x18, 0x56, 0x2d, 0x9d, 0x15, + 0xa3, 0x33, 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x8e, 0xa0, 0x59, 0xe4, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, + 0xf8, 0x01, 0xed, 0xda, 0xa1, 0xa8, 0x28, 0x21, 0x86, 0x9a, 0x50, 0x09, 0x7c, 0x9f, 0x5a, 0xbe, + 0xab, 0x8a, 0x35, 0xa2, 0xd1, 0x03, 0x68, 0xf4, 0x26, 0x41, 0x40, 0x3c, 0x6a, 0x4d, 0xbc, 0x93, + 0xc9, 0xe8, 0x94, 0x88, 0x7a, 0x5d, 0xb4, 0xa6, 0xf8, 0x78, 0x1f, 0x6e, 0x9e, 0x90, 0xb7, 0x5a, + 0x54, 0x0a, 0xa9, 0x07, 0xd0, 0x60, 0x69, 0xeb, 0xbb, 0xfe, 0xdb, 0x2e, 0x19, 0x8d, 0xdd, 0xb8, + 0x7f, 0x4d, 0xf1, 0x71, 0x07, 0x56, 0xd2, 0x46, 0x18, 0x22, 0x5f, 0x41, 0x4d, 0xcb, 0x1f, 0xd7, + 0x9e, 0x9d, 0x6e, 0x5d, 0x1c, 0x7f, 0xcc, 0x8f, 0x53, 0x86, 0x67, 0xa9, 0x94, 0xe3, 0x5f, 0x1a, + 0xb0, 0x92, 0x96, 0xfc, 0x9f, 0xb7, 0x47, 0x0f, 0xa1, 0xa2, 0xe2, 0x94, 0x3d, 0x71, 0x45, 0x53, + 0x65, 0x79, 0xe6, 0x3a, 0x91, 0x10, 0xfe, 0x9b, 0x01, 0xeb, 0xfb, 0x62, 0xf9, 0x6a, 0xa7, 0xd1, + 0x63, 0x28, 0xd2, 0xcb, 0x31, 0xe1, 0xa6, 0xeb, 0x3b, 0x9f, 0x68, 0xa6, 0x73, 0x6d, 0x6c, 0xb7, + 0xc7, 0x4c, 0xc5, 0xe2, 0x8a, 0xd8, 0x86, 0x1b, 0x82, 0x66, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0xde, + 0x98, 0x43, 0x08, 0xea, 0x9d, 0xee, 0xae, 0xd5, 0x7d, 0xb3, 0xbb, 0xdf, 0x3d, 0x7a, 0x79, 0xd4, + 0xfd, 0x69, 0xc3, 0x40, 0xcb, 0xb0, 0xd8, 0xe9, 0xb6, 0x9f, 0xc7, 0xac, 0x02, 0x5a, 0x84, 0xea, + 0x7e, 0xfb, 0xe4, 0xc9, 0xd1, 0xe1, 0x0b, 0xab, 0xd5, 0x98, 0x67, 0xdd, 0xd8, 0x6a, 0x75, 0x5a, + 0xdd, 0x46, 0x11, 0x2d, 0x40, 0xe5, 0xb0, 0xfd, 0x46, 0xf4, 0xe6, 0x12, 0x3e, 0x87, 0x5b, 0x59, + 0xce, 0xb0, 0xdc, 0xa6, 0xc3, 0x89, 0x8a, 0xba, 0xa0, 0x17, 0x75, 0x56, 0x21, 0xce, 0xe7, 0x14, + 0xe2, 0x6f, 0x0d, 0x30, 0x8f, 0x7d, 0x67, 0xd8, 0xbf, 0xbc, 0x56, 0xf6, 0xc0, 0x1f, 0x93, 0xc0, + 0xa6, 0x43, 0xdf, 0x53, 0xe7, 0xf8, 0x6e, 0x36, 0xb2, 0x6d, 0x25, 0x67, 0x69, 0x2a, 0xe8, 0x1e, + 0xd4, 0x03, 0xd2, 0xf3, 0xbd, 0xfe, 0xf0, 0x6c, 0x12, 0x90, 0x5d, 0xd7, 0xe5, 0x7e, 0x55, 0xac, + 0x14, 0x17, 0xff, 0xde, 0x80, 0xd5, 0x2c, 0x63, 0xe8, 0x91, 0xc4, 0x4f, 0x0c, 0xdb, 0x7b, 0x57, + 0xec, 0x9d, 0x80, 0x4e, 0x9c, 0x5d, 0x57, 0x74, 0xd9, 0x82, 0x3a, 0xbb, 0x82, 0xc6, 0x9f, 0x65, + 0xc0, 0xba, 0x04, 0x35, 0xab, 0x75, 0xdc, 0x7e, 0xd9, 0x7a, 0x63, 0xb5, 0x9f, 0x31, 0xc4, 0x16, + 0xa0, 0xb2, 0x7b, 0x70, 0x20, 0xa8, 0x22, 0xfe, 0x95, 0x01, 0x6b, 0x19, 0x99, 0x63, 0x30, 0xfd, + 0x18, 0x1a, 0x7d, 0x7b, 0xe8, 0x12, 0xa7, 0x1d, 0x67, 0xcb, 0xb8, 0x5e, 0xb6, 0xa6, 0x14, 0x25, + 0x08, 0x85, 0x69, 0xcc, 0xf5, 0x46, 0x86, 0x8f, 0x60, 0xfd, 0x80, 0x84, 0x34, 0xf0, 0xaf, 0x83, + 0xe3, 0x1d, 0xa8, 0x9e, 0x13, 0x32, 0xee, 0xf2, 0xce, 0x57, 0xe0, 0x08, 0xc4, 0x0c, 0x4c, 0xe0, + 0x56, 0x96, 0x29, 0x16, 0xd8, 0x8f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x08, 0x51, 0xce, 0x94, + 0x27, 0xfc, 0x8e, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, 0x1e, + 0x8b, 0x10, 0x14, 0x3d, 0x06, 0x8e, 0x70, 0x94, 0xff, 0x66, 0x93, 0xcb, 0xf5, 0x7b, 0xe7, 0xc4, + 0x91, 0x7e, 0x4a, 0x8a, 0xf1, 0x59, 0x47, 0x3e, 0x72, 0x64, 0x1a, 0x24, 0xc5, 0xf8, 0xe2, 0xc2, + 0x26, 0xa7, 0xb0, 0xa4, 0xe2, 0xac, 0x95, 0xf4, 0x93, 0x72, 0x07, 0xaa, 0x3d, 0xd7, 0x0e, 0x43, + 0x6d, 0xf2, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0xae, 0x7f, 0xa9, 0x5a, 0x95, 0x9c, 0xbe, + 0xfa, 0x1d, 0x8f, 0x39, 0x7f, 0x90, 0x10, 0xb2, 0x52, 0x4a, 0xac, 0x51, 0xa2, 0x69, 0x31, 0x56, + 0x8e, 0xec, 0x1a, 0xa0, 0x45, 0x1c, 0xd1, 0xc8, 0x84, 0xb2, 0x7d, 0xc6, 0x04, 0x15, 0xf0, 0x8a, + 0x64, 0x2b, 0x7e, 0xbf, 0x4f, 0x82, 0x28, 0x70, 0x45, 0xb2, 0x8b, 0x06, 0x79, 0x47, 0x7a, 0x13, + 0xea, 0xb3, 0x45, 0x11, 0xbd, 0xc6, 0xc1, 0xcb, 0xb0, 0x74, 0x48, 0xa8, 0x04, 0x40, 0xcc, 0xf4, + 0xc7, 0xb0, 0x18, 0xb3, 0x18, 0xbe, 0xd1, 0x38, 0x34, 0xae, 0x35, 0x0e, 0xf1, 0x16, 0xd4, 0xa5, + 0x01, 0xed, 0xa6, 0x21, 0x71, 0x31, 0x74, 0x5c, 0xf0, 0xf7, 0x60, 0x21, 0x92, 0x64, 0x3b, 0x7d, + 0x0c, 0x45, 0xb6, 0x22, 0x8b, 0x67, 0x25, 0x95, 0x51, 0xbe, 0x07, 0x17, 0xc0, 0x2d, 0x58, 0x64, + 0x9c, 0x7d, 0x86, 0x4a, 0x6e, 0x95, 0xb0, 0xf1, 0x2f, 0xd4, 0x8f, 0x7d, 0x87, 0x44, 0xe3, 0x3f, + 0x66, 0xe1, 0x5f, 0x40, 0x6d, 0xdf, 0x1f, 0x8d, 0x6c, 0xcf, 0xe1, 0x46, 0x1a, 0x30, 0x4f, 0xbc, + 0x0b, 0x1e, 0x66, 0xd5, 0x62, 0x3f, 0x79, 0x81, 0x0c, 0x88, 0xeb, 0xca, 0x3a, 0x13, 0x04, 0xe3, + 0x5e, 0xd8, 0xee, 0x24, 0x3a, 0x6c, 0x9c, 0x60, 0x65, 0x63, 0x07, 0x67, 0x13, 0x71, 0x9d, 0x29, + 0x72, 0x1b, 0x31, 0x83, 0x39, 0x38, 0x09, 0x49, 0x20, 0x2b, 0x8d, 0xff, 0xc6, 0xc7, 0x50, 0xdb, + 0x1f, 0xd8, 0x9e, 0x47, 0xdc, 0xdc, 0x18, 0x90, 0x36, 0x9a, 0xaa, 0xb2, 0x65, 0xf1, 0x6c, 0x06, + 0x67, 0x84, 0xc6, 0x55, 0xce, 0x28, 0xfc, 0x9f, 0x02, 0x54, 0xa2, 0x63, 0xf3, 0x5d, 0xa8, 0x86, + 0x0c, 0x1c, 0x5e, 0xa1, 0x22, 0x9f, 0xf9, 0xc0, 0xc5, 0xa2, 0x4c, 0xaf, 0xa7, 0xb2, 0x2a, 0x67, + 0xad, 0x99, 0xc2, 0x21, 0xca, 0xba, 0x15, 0x8b, 0xa2, 0x1f, 0xc2, 0xd2, 0xd0, 0x3b, 0xf5, 0x27, + 0x9e, 0x23, 0x43, 0x0a, 0xcd, 0x79, 0x5e, 0x2e, 0x6b, 0x7a, 0x0b, 0x88, 0xa3, 0xb5, 0xd2, 0xe2, + 0x68, 0x0f, 0x1a, 0xfe, 0x84, 0x26, 0x4d, 0x14, 0x67, 0x9a, 0x98, 0x92, 0x47, 0x5f, 0x32, 0xc8, + 0x23, 0x40, 0x79, 0xb2, 0x53, 0xea, 0xf1, 0xaa, 0xa5, 0x8b, 0xb2, 0x83, 0xc7, 0x2a, 0xeb, 0xb9, + 0x4d, 0x07, 0xf2, 0xcc, 0x47, 0x34, 0xc3, 0x9b, 0x78, 0x17, 0x47, 0x0e, 0x3f, 0xe9, 0x55, 0x4b, + 0x10, 0xf8, 0x21, 0xac, 0x24, 0x5b, 0x9a, 0xa8, 0x75, 0x13, 0xca, 0xa2, 0xba, 0x43, 0x59, 0x48, + 0x8a, 0xc4, 0xbf, 0x36, 0x60, 0x79, 0xaa, 0x09, 0xa2, 0x47, 0x50, 0x3b, 0x1f, 0xba, 0x2e, 0x71, + 0xba, 0xd7, 0x3a, 0x63, 0xba, 0x30, 0xfa, 0x0a, 0x16, 0x82, 0x89, 0xe7, 0x0d, 0xbd, 0x33, 0xd5, + 0xb5, 0x67, 0x2b, 0x27, 0xa4, 0xf1, 0x3e, 0x3f, 0xfb, 0xec, 0xf6, 0x14, 0x39, 0x1f, 0x45, 0x6a, + 0x68, 0x91, 0xb2, 0xdc, 0x8c, 0x6d, 0x3a, 0xe8, 0x8c, 0x49, 0x4f, 0xcd, 0x48, 0x45, 0xe3, 0x3f, + 0x19, 0x50, 0x51, 0x17, 0xb0, 0xbc, 0x5e, 0x2d, 0x7b, 0x6f, 0x21, 0xbb, 0xf7, 0x26, 0xae, 0xde, + 0x4d, 0xa8, 0xf4, 0x27, 0xae, 0xcb, 0x61, 0x10, 0xdd, 0x2a, 0xa2, 0xf5, 0xcc, 0x96, 0x12, 0x99, + 0x45, 0xf7, 0xa1, 0xc4, 0x86, 0x76, 0x68, 0xde, 0xe0, 0x09, 0xc8, 0xbc, 0x1c, 0x0a, 0x09, 0xfc, + 0x88, 0x77, 0x37, 0x19, 0x34, 0xcb, 0x7f, 0xa4, 0x6b, 0x5c, 0xa9, 0xfb, 0x47, 0x03, 0x6e, 0x1f, + 0x12, 0xfa, 0x2a, 0x75, 0xe5, 0x8e, 0xb2, 0xb7, 0x09, 0xb5, 0x80, 0x8c, 0xfd, 0xe7, 0x36, 0xa5, + 0x24, 0x50, 0x5f, 0x55, 0x3a, 0x0b, 0x6d, 0xc1, 0x52, 0x40, 0x2e, 0x86, 0xec, 0x8b, 0x4c, 0x49, + 0x89, 0xac, 0xa4, 0xd9, 0xcc, 0x96, 0xed, 0xba, 0x7b, 0x81, 0xed, 0xf5, 0x06, 0x24, 0x94, 0x37, + 0x22, 0x9d, 0xc5, 0xc7, 0x81, 0xeb, 0x76, 0xed, 0x33, 0x31, 0xd5, 0x2a, 0x96, 0x22, 0xf1, 0x29, + 0xac, 0xa6, 0x7d, 0x54, 0xf0, 0x30, 0x67, 0x14, 0x3c, 0xec, 0x37, 0xaf, 0x7b, 0xf5, 0x49, 0x21, + 0xb1, 0x55, 0x34, 0xbf, 0x1b, 0x49, 0xb7, 0x24, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xf5, 0xec, 0x54, + 0xb0, 0x9c, 0x1e, 0xc3, 0x72, 0xfa, 0xbb, 0x24, 0xeb, 0xae, 0x93, 0xe5, 0xa4, 0x35, 0xad, 0x89, + 0x11, 0x34, 0x9e, 0x0d, 0x43, 0x76, 0xdb, 0xf0, 0xb5, 0x67, 0x9d, 0x0a, 0xa3, 0x73, 0xcb, 0xce, + 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0xa5, 0xb2, 0x77, 0x2b, 0x92, 0x61, 0x20, 0x7f, 0x5a, 0xc9, + 0xe0, 0xd2, 0x6c, 0xfc, 0x2d, 0xd4, 0xb5, 0x7d, 0x55, 0xb1, 0x30, 0x2a, 0xab, 0x58, 0xa4, 0x37, + 0x96, 0x90, 0x40, 0x5f, 0xc0, 0xcd, 0x33, 0xd7, 0x3f, 0xb5, 0xdd, 0x83, 0xd4, 0x66, 0x22, 0xcb, + 0xd9, 0x8b, 0xf8, 0x04, 0xea, 0xbb, 0x8e, 0xc3, 0x6c, 0xa9, 0xa2, 0xca, 0x0a, 0x2e, 0x23, 0x84, + 0x42, 0x76, 0x08, 0x16, 0x2c, 0x44, 0xf6, 0xc4, 0x2c, 0x47, 0x1e, 0x79, 0x9b, 0x76, 0x49, 0xd8, + 0xce, 0x58, 0x61, 0xbb, 0x0f, 0xd5, 0x24, 0xa8, 0x5a, 0xfc, 0x37, 0xbe, 0x0f, 0xcb, 0x16, 0x19, + 0xf9, 0x17, 0x44, 0x77, 0x73, 0x15, 0x4a, 0x43, 0xcf, 0x21, 0xef, 0xd4, 0x5b, 0x10, 0x27, 0xf0, + 0xf7, 0x61, 0x49, 0x17, 0x65, 0x1e, 0xdc, 0x83, 0xba, 0xbe, 0x4f, 0x54, 0x8e, 0x29, 0x2e, 0xfe, + 0x04, 0x56, 0x2c, 0xd2, 0x0f, 0x48, 0x38, 0xd0, 0x71, 0xcf, 0xd9, 0xe7, 0xff, 0xe1, 0x66, 0x87, + 0x50, 0x4d, 0x7d, 0xb6, 0xf8, 0xd7, 0x70, 0xb7, 0x43, 0xe8, 0x61, 0x16, 0x02, 0x4a, 0x51, 0xaf, + 0x7d, 0x23, 0x55, 0xfb, 0x3f, 0x81, 0x0f, 0x3a, 0x84, 0x6f, 0x93, 0xa3, 0x9c, 0xb9, 0x6b, 0xc2, + 0x64, 0x21, 0x65, 0xf2, 0x33, 0xb8, 0x9d, 0x67, 0x92, 0x25, 0x4d, 0xc1, 0x60, 0x68, 0x30, 0x94, + 0xa1, 0xd4, 0x1a, 0x8d, 0xe9, 0xe5, 0xce, 0x9f, 0x17, 0xa1, 0x2c, 0xbf, 0x0d, 0xd1, 0x3e, 0xd4, + 0xba, 0x81, 0xdd, 0x3b, 0x17, 0xaf, 0x8c, 0xc8, 0x9c, 0x7a, 0x78, 0x94, 0x2e, 0x36, 0xd7, 0x32, + 0x56, 0xd8, 0x05, 0x7c, 0xee, 0x3b, 0x06, 0x7a, 0x0d, 0x8d, 0xf4, 0xe3, 0x19, 0xc2, 0x9a, 0x7c, + 0xce, 0xdb, 0x60, 0x73, 0x73, 0xa6, 0x0c, 0xb7, 0x8e, 0xf6, 0xa0, 0xa2, 0x1e, 0x97, 0x90, 0xfe, + 0xfd, 0x9f, 0x7a, 0x9c, 0x6a, 0x9a, 0x99, 0x6b, 0xc2, 0xc6, 0x2b, 0x3e, 0xb8, 0xf4, 0x57, 0x27, + 0xf4, 0x61, 0x72, 0xeb, 0x8c, 0xb7, 0xaa, 0xe6, 0xdd, 0x59, 0x22, 0xc2, 0x70, 0x17, 0xea, 0xc9, + 0xb7, 0x13, 0xa4, 0x87, 0x94, 0xf9, 0x36, 0xd3, 0xdc, 0x98, 0x21, 0x11, 0x59, 0x4d, 0xee, 0x87, + 0x36, 0x73, 0x5d, 0xc9, 0xb2, 0x9a, 0xf1, 0x9e, 0x82, 0xe7, 0xd0, 0xcf, 0x01, 0x4d, 0x3f, 0x08, + 0xa0, 0x8f, 0xae, 0xf3, 0x78, 0xd1, 0xc4, 0x57, 0x48, 0x89, 0x1d, 0x7e, 0x06, 0xcb, 0x53, 0x9f, + 0xb2, 0xe8, 0xff, 0x34, 0xd5, 0xbc, 0x27, 0x82, 0xe6, 0x87, 0xb3, 0x85, 0xa2, 0x00, 0xa6, 0xbf, + 0x28, 0x13, 0x01, 0xe4, 0x7e, 0xbb, 0x26, 0x02, 0xc8, 0xf9, 0x2c, 0x15, 0xb5, 0xa6, 0xbe, 0x64, + 0x12, 0xb5, 0x96, 0xfa, 0xe2, 0x49, 0xd4, 0x5a, 0xe2, 0xd3, 0x07, 0xcf, 0xa1, 0xc7, 0x50, 0x96, + 0x2c, 0xb4, 0x3e, 0x2d, 0xa6, 0x2c, 0xdc, 0xca, 0x5a, 0x12, 0x06, 0x4e, 0x60, 0x41, 0xbf, 0xf4, + 0xa1, 0x8d, 0xdc, 0x4f, 0x62, 0x61, 0x6a, 0xe6, 0x27, 0x73, 0x14, 0x14, 0xbf, 0xc0, 0xa4, 0x83, + 0xd2, 0xaf, 0x72, 0xe9, 0xa0, 0xe2, 0x1b, 0x0f, 0x9e, 0x43, 0x7d, 0xfe, 0x6c, 0x3b, 0x35, 0xbc, + 0xd1, 0xbd, 0xa4, 0x4e, 0xde, 0x45, 0xa7, 0xf9, 0xd1, 0x95, 0x72, 0x62, 0x9f, 0x16, 0x54, 0xa3, + 0x01, 0x8a, 0x6e, 0x6b, 0x4a, 0xe9, 0x71, 0xde, 0x5c, 0xcf, 0x5e, 0x8c, 0x30, 0x90, 0x43, 0x2c, + 0x81, 0x41, 0x72, 0x50, 0x26, 0x30, 0xd0, 0x67, 0x1e, 0x9e, 0x43, 0x4f, 0x01, 0xe2, 0x31, 0x84, + 0xee, 0x24, 0xa6, 0x76, 0x6a, 0x90, 0x35, 0x9b, 0x39, 0xab, 0x2a, 0xfb, 0x0b, 0xfa, 0x54, 0x4a, + 0xa0, 0x99, 0x31, 0xae, 0x9a, 0x0d, 0xfd, 0x69, 0x87, 0x75, 0x6b, 0x3c, 0x87, 0x9e, 0x40, 0x3d, + 0x39, 0xac, 0x12, 0xfd, 0x20, 0x73, 0x8e, 0x65, 0xda, 0x79, 0x0d, 0x66, 0xde, 0x14, 0x43, 0x0f, + 0x92, 0x16, 0x67, 0x8d, 0xba, 0x4c, 0xdb, 0x2e, 0xac, 0x65, 0xcf, 0x23, 0xb4, 0x95, 0xb4, 0x9c, + 0x3f, 0x05, 0x9b, 0xf7, 0xae, 0x21, 0xc9, 0xb3, 0xba, 0xf7, 0xe5, 0x5f, 0xde, 0x6f, 0x18, 0x7f, + 0x7f, 0xbf, 0x61, 0xfc, 0xf3, 0xfd, 0x86, 0xf1, 0xbb, 0x7f, 0x6d, 0xcc, 0x01, 0xee, 0x0d, 0xb6, + 0x7b, 0x24, 0xf0, 0xb6, 0x6d, 0x77, 0xd8, 0x23, 0xdb, 0xfe, 0xce, 0xb6, 0xb2, 0x14, 0x8c, 0x7b, + 0x21, 0x09, 0x2e, 0x48, 0xf0, 0xba, 0x30, 0x3e, 0x3d, 0xbd, 0xc1, 0xff, 0x18, 0xfc, 0xfc, 0xbf, + 0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x25, 0x1d, 0x58, 0x32, 0x1c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3423,7 +3480,7 @@ type ControlClient interface { RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) } type controlClient struct { @@ -3637,8 +3694,8 @@ func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlo return out, nil } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) if err != nil { return nil, err @@ -3668,7 +3725,7 @@ type ControlServer interface { RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) } func RegisterControlServer(s *grpc.Server, srv ControlServer) { @@ -5939,6 +5996,12 @@ func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) i += copy(dAtA[i:], m.NewDefaultRevision) } + if len(m.Info) > 0 { + dAtA[i] = 0x12 + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i += copy(dAtA[i:], m.Info) + } if m.XXX_unrecognized != nil { i += copy(dAtA[i:], m.XXX_unrecognized) } @@ -6109,6 +6172,33 @@ func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { return i, nil } +func (m *SetRepoDefaultRevisionReply) 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 *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { + var i int + _ = i + var l int + _ = l + if len(m.Info) > 0 { + dAtA[i] = 0xa + i++ + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i += copy(dAtA[i:], m.Info) + } + if m.XXX_unrecognized != nil { + i += copy(dAtA[i:], m.XXX_unrecognized) + } + return i, nil +} + func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -7138,6 +7228,10 @@ func (m *AddRepoReply) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -7240,6 +7334,22 @@ func (m *SetRepoDefaultRevisionRequest) Size() (n int) { return n } +func (m *SetRepoDefaultRevisionReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *Empty) Size() (n int) { if m == nil { return 0 @@ -12960,6 +13070,38 @@ func (m *AddRepoReply) Unmarshal(dAtA []byte) error { } m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Info = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -13481,6 +13623,92 @@ func (m *SetRepoDefaultRevisionRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control + } + 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Info = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *Empty) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 53e8ea725..9e455522a 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -62,7 +62,7 @@ service Control { rpc RefreshRepos(RefreshReposRequest) returns (Empty) {} rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} - rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (Empty) {} + rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (SetRepoDefaultRevisionReply) {} } //////////////////////////////////////// @@ -319,6 +319,7 @@ message AddRepoRequest { message AddRepoReply { string newDefaultRevision = 1; + string info = 2; } message RemoveRepoRequest { @@ -346,6 +347,10 @@ message SetRepoDefaultRevisionRequest { string revision = 2; } +message SetRepoDefaultRevisionReply { + string info = 1; +} + message Empty { } \ No newline at end of file diff --git a/core/repos/repo.go b/core/repos/repo.go index 76c411a09..7878420cf 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -282,16 +282,21 @@ func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]str return revisions, nil } -func (r* Repo) updateDefaultRevision(revision string) error { +func (r* Repo) updateDefaultRevision(revision string) (string, error) { var refs []string refs = append(refs, refRemotePrefix, refTagPrefix) revisionsMatched, err := r.getRevisions(revision, refs) if err != nil{ - return err + return "", err } else if len(revisionsMatched) == 0 { - return errors.New("revision not found") + revisionsMatched, err = r.getRevisions("*", refs) + var availableRevs string + for _, rev := range revisionsMatched { + availableRevs += rev + "\n" + } + return availableRevs, errors.New("revision not found") } r.DefaultRevision = revision - return nil + return "", nil } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 71db17581..a5c1bfeaf 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -101,7 +101,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { defaultRepo = viper.GetString("defaultRepo") } - _, err = rm.AddRepo(defaultRepo, rm.defaultRevisions[defaultRepo]) + _, _, err = rm.AddRepo(defaultRepo, rm.defaultRevisions[defaultRepo]) if err != nil { log.Fatal("Could not open default repo: ", err) } @@ -114,7 +114,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { } for _, repo := range discoveredRepos { - _, err = rm.AddRepo(repo, rm.defaultRevisions[repo]) + _, _, err = rm.AddRepo(repo, rm.defaultRevisions[repo]) if err != nil && err.Error() != "Repo already present" { //Skip error for default repo log.Warning("Failed to add persistent repo: ", repo, " | ", err) } @@ -207,7 +207,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { return nil } -func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (string, error) { +func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (string, bool, error) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -220,7 +220,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st repo, err := NewRepo(repoPath, defaultRevision) if err != nil { - return "", err + return "", false, err } _, exists := manager.repoList[repo.GetIdentifier()] @@ -228,7 +228,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st err = manager.checkDefaultRevision(repo) if err != nil { - return "", err + return "", false, err } _, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ @@ -241,14 +241,14 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st if err == git.ErrRepositoryAlreadyExists { //Make sure the requested revision is checked out checkoutErr := repo.checkoutRevision(repo.Revision) if checkoutErr != nil { - return "", errors.New(err.Error() + " " + checkoutErr.Error()) + return "", false, errors.New(err.Error() + " " + checkoutErr.Error()) } } else { cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) if cleanErr != nil { - return "", errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) + return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) } - return "", err + return "", false, err } } @@ -259,17 +259,17 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st manager.setDefaultRepo(repo) } } else { - return "", errors.New("Repo already present") + return "", false, errors.New("Repo already present") } // Update default revisions manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { - return "", err + return "", false, err } - return repo.DefaultRevision, nil + return repo.DefaultRevision, repo.DefaultRevision == manager.defaultRevision, nil } func cleanCloneParentDirs(parentDirs []string) error { @@ -515,17 +515,19 @@ func (manager *RepoManager) SetGlobalDefaultRevision(revision string) error { return nil } -func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision string) error { +func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision string) (string, error) { orderedRepoList := manager.GetOrderedRepolistKeys() if index >= len(orderedRepoList) { - return errors.New("repository index out of range") + return "", errors.New("repository index out of range") } repo := manager.repoList[orderedRepoList[index]] - err := repo.updateDefaultRevision(revision) + + info, err := repo.updateDefaultRevision(revision) if err != nil { - return errors.New("Could not update default revision for " + repo.GetIdentifier() + " : " + err.Error()) + return info, errors.New("Could not update default revision for " + repo.GetIdentifier() + " : " + err.Error()) } - return nil + + return "", nil } func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (err error) { @@ -543,7 +545,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er for repo := range reposRequired { existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { - _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultRevision) + _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultRevision) if err != nil { return } diff --git a/core/server.go b/core/server.go index c29d0b559..751c33e99 100644 --- a/core/server.go +++ b/core/server.go @@ -537,12 +537,21 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - newDefaultRevision, err := the.RepoManager().AddRepo(req.Name, req.DefaultRevision) + newDefaultRevision, isGlobalDefault, err := the.RepoManager().AddRepo(req.Name, req.DefaultRevision) if err != nil { return nil, err } - return &pb.AddRepoReply{NewDefaultRevision: newDefaultRevision}, nil + var info string + if newDefaultRevision == req.DefaultRevision { + info = "The default revision for this repository has been set to \"" + newDefaultRevision + "\"." + } else if isGlobalDefault { + info = "The default revision for this repository has been set to \"" + newDefaultRevision + "\" (global default value)." + } else { + info = "The default revision for this repository has been set to \"" + newDefaultRevision + "\" (fallback value)." + } + + return &pb.AddRepoReply{NewDefaultRevision: newDefaultRevision, Info: info}, nil } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { @@ -611,17 +620,18 @@ func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlo return &pb.Empty{}, nil } -func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoDefaultRevisionRequest) (*pb.Empty, error) { +func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoDefaultRevisionRequest) (*pb.SetRepoDefaultRevisionReply, error) { m.logMethod() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - err := the.RepoManager().UpdateDefaultRevisionByIndex(int(req.Index), req.Revision) + info, err := the.RepoManager().UpdateDefaultRevisionByIndex(int(req.Index), req.Revision) if err != nil { - return nil, err + return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is filled with available revisions + // err can't be set here, otherwise the response will be empty } - return &pb.Empty{}, nil + return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is empty } From a71b280e08be00cddd4bc27bb916d4324c2de8d8 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 11 Feb 2020 13:15:08 +0100 Subject: [PATCH 0089/2352] [core] Update backend when a default-revision is explicitly set --- core/repos/repomanager.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index a5c1bfeaf..c268ec3c1 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -527,6 +527,13 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str return info, errors.New("Could not update default revision for " + repo.GetIdentifier() + " : " + err.Error()) } + // Update default revisions + manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision + err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + if err != nil { + return "", err + } + return "", nil } From 0fece0d095a8fd04aaf37ff963526d6a024b9349 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 13 Feb 2020 10:12:00 +0100 Subject: [PATCH 0090/2352] [docs] Improve coconut repo add help dialogue --- coconut/cmd/repo_add.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index 3f8bd958c..a90b247dd 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -33,9 +33,10 @@ import ( var repoAddCmd = &cobra.Command{ Use: "add", Aliases: []string{"new", "a"}, + Example: `coconut repo add github.com/AliceO2Group/ControlWorkflows`, Short: "add a new git repository", - Long: "The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration.", - Run: control.WrapCall(control.AddRepo), + Long: "The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration.\nThe `https://` prefix and `.git` suffix should always be omitted.", + Run: control.WrapCall(control.AddRepo), } func init() { From 2bc5e32e7f68ed3111b5a416fceeab211b7cbd7c Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 10 Feb 2020 16:28:25 +0100 Subject: [PATCH 0091/2352] [core]: repos and runcounter.txt are stored inside coreWorkingDir --- core/config.go | 3 +-- core/confsys/service.go | 17 +---------------- hacking/config.yaml | 1 - 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/core/config.go b/core/config.go index 38c6e65a7..9fa23b289 100644 --- a/core/config.go +++ b/core/config.go @@ -84,7 +84,7 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) - viper.SetDefault("repositoriesPath", "/etc/aliecs.d/repos") + viper.SetDefault("repositoriesPath", viper.GetString("coreWorkingDir")+"/repos") //TODO: Remove it from Viper. viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) @@ -124,7 +124,6 @@ func setFlags() error { pflag.Int("metrics.port", viper.GetInt("metrics.port"), "Port of metrics server (listens on server.address)") pflag.String("metrics.path", viper.GetString("metrics.path"), "URI path to metrics endpoint") pflag.Bool("summaryMetrics", viper.GetBool("summaryMetrics"), "Collect summary metrics for tasks launched per-offer-cycle, offer processing time, etc.") - pflag.String("repositoriesPath", viper.GetString("repositoriesPath"), "Path to git-managed configuration repositories") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") pflag.String("globalConfigurationUri", viper.GetString("globalConfigurationUri"), "URI of the Consul server or YAML configuration file, used for global configuration.") diff --git a/core/confsys/service.go b/core/confsys/service.go index d091a7289..8fa0cbf10 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -28,14 +28,12 @@ import ( "encoding/json" "io/ioutil" "os" - "path/filepath" "strconv" "strings" "sync" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration" - "github.com/mitchellh/go-homedir" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -68,8 +66,6 @@ type Service struct { /* Expected structure: /o2/aliecs/ { - run_number_file: "/path/to/rn/file", - - or - run_number: 47102, settings: { @@ -188,19 +184,8 @@ func (s *Service) NewRunNumber() (runNumber uint32, err error) { } else { // Unsafe check-and-set, only for file backend var rnf string - rnf, err = s.src.Get("o2/control/run_number_file") - if err != nil { - return - } - rnf, err = homedir.Expand(rnf) // Resolve ~ into home dir - if err != nil { - return - } + rnf = viper.GetString("coreWorkingDir") + "runcounter.txt" if _, err = os.Stat(rnf); os.IsNotExist(err) { - err = os.MkdirAll(filepath.Dir(rnf), os.ModePerm) - if err != nil { - return - } err = ioutil.WriteFile(rnf, []byte("0"), 0644) if err != nil { return diff --git a/hacking/config.yaml b/hacking/config.yaml index 1ac892d8e..1a4df2e5f 100644 --- a/hacking/config.yaml +++ b/hacking/config.yaml @@ -2,7 +2,6 @@ # This emulates the contents of a Consul instance which serves all O² configuration. o2: control: # Root for O² Control configuration - run_number_file: "~/.local/share/AliECS/runcounter.txt" # Here we have 2 main sections: tasks and workflows. # The tasks section contains a list of task templates, i.e. descriptors for the generic kind of process to be run. # These task templates are then referenced by workflow templates later on. From 5a24a072a463a3a5b4a2171960878ada6211770b Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 11 Feb 2020 11:35:24 +0100 Subject: [PATCH 0092/2352] [core]: sanitize viper paths to remove trailing slash --- common/utils/utils.go | 6 ++++++ core/config.go | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index f8a4a996f..53e26c141 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -53,3 +53,9 @@ func EnsureTrailingSlash(path *string) { // helper func to package strings up nicely for protobuf func ProtoString(s string) *string { return &s } + +func RemoveTrailingSlash(path *string) { + if strings.HasSuffix(*path, "/") { //Remove trailing '/' + strings.TrimRight(*path, "/") + } +} diff --git a/core/config.go b/core/config.go index 9fa23b289..30c5165b7 100644 --- a/core/config.go +++ b/core/config.go @@ -183,7 +183,7 @@ func checkWorkingDirRights() error { func sanitizeWorkingPath() { sanitizeWorkingPath := viper.GetString("coreWorkingDir") - utils.EnsureTrailingSlash(&sanitizeWorkingPath) + utils.RemoveTrailingSlash(&sanitizeWorkingPath) viper.Set("coreWorkingDir", sanitizeWorkingPath) } From 3abad3935a4345495dfe521b481c2bd0b77d1c32 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 11 Feb 2020 11:36:43 +0100 Subject: [PATCH 0093/2352] [core]: use filepath.Join to concatenate paths --- core/confsys/service.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/confsys/service.go b/core/confsys/service.go index 8fa0cbf10..1eaa41995 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -28,6 +28,7 @@ import ( "encoding/json" "io/ioutil" "os" + "path/filepath" "strconv" "strings" "sync" @@ -184,7 +185,7 @@ func (s *Service) NewRunNumber() (runNumber uint32, err error) { } else { // Unsafe check-and-set, only for file backend var rnf string - rnf = viper.GetString("coreWorkingDir") + "runcounter.txt" + rnf = filepath.Join(viper.GetString("coreWorkingDir"), "runcounter.txt") if _, err = os.Stat(rnf); os.IsNotExist(err) { err = ioutil.WriteFile(rnf, []byte("0"), 0644) if err != nil { @@ -239,7 +240,7 @@ func (s *Service) NewMesosFID(fidValue string) error { return cSrc.Put("o2/aliecs/mesos_fid", fidValue) } else { data := []byte(fidValue) - return ioutil.WriteFile(viper.GetString("coreWorkingDir") + "mesos_fid.txt", data, 0644) + return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt"), data, 0644) } } @@ -249,7 +250,7 @@ func (s *Service) GetMesosFID() (fidValue string, err error) { return cSrc.Get("o2/aliecs/mesos_fid") } else { var byteFidValue []byte - byteFidValue, err = ioutil.ReadFile(viper.GetString("coreWorkingDir") + "mesos_fid.txt") + byteFidValue, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt")) if err != nil { return } From c91c4f2c6c90881f058db2190742fbffebfee7d2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 14 Feb 2020 12:12:04 +0100 Subject: [PATCH 0094/2352] [core]: use path/filepath to remove trailing '/' --- common/utils/utils.go | 6 ------ core/config.go | 4 ++-- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index 53e26c141..f8a4a996f 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -53,9 +53,3 @@ func EnsureTrailingSlash(path *string) { // helper func to package strings up nicely for protobuf func ProtoString(s string) *string { return &s } - -func RemoveTrailingSlash(path *string) { - if strings.HasSuffix(*path, "/") { //Remove trailing '/' - strings.TrimRight(*path, "/") - } -} diff --git a/core/config.go b/core/config.go index 30c5165b7..a56f4850f 100644 --- a/core/config.go +++ b/core/config.go @@ -181,9 +181,9 @@ func checkWorkingDirRights() error { return nil } +// Remove trailing '/' func sanitizeWorkingPath() { - sanitizeWorkingPath := viper.GetString("coreWorkingDir") - utils.RemoveTrailingSlash(&sanitizeWorkingPath) + sanitizeWorkingPath := filepath.Clean(viper.GetString("coreWorkingDir")) viper.Set("coreWorkingDir", sanitizeWorkingPath) } From 3972e8156f72116ac34e4963c4a243ffdce8d0fd Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 13 Feb 2020 15:20:46 +0100 Subject: [PATCH 0095/2352] [core]:Handle Unix Signals --- core/core.go | 3 ++ core/signals.go | 122 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 core/signals.go diff --git a/core/core.go b/core/core.go index 6fa5d9ba2..89bbbaadf 100644 --- a/core/core.go +++ b/core/core.go @@ -67,6 +67,9 @@ func Run() error { return err } + // Set up channel to receive Unix Signals. + signals(state) + // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need // to track the lastCallAttempted along with subsequentSubscribeTimeouts. diff --git a/core/signals.go b/core/signals.go new file mode 100644 index 000000000..2bf74a034 --- /dev/null +++ b/core/signals.go @@ -0,0 +1,122 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package core + +import ( + "context" + "fmt" + "os" + "os/signal" + "syscall" + "time" + + "github.com/AliceO2Group/Control/core/environment" + "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" +) + + +func signals(state *internalState) { + + // Create channel to receive unix signals + signal_chan := make(chan os.Signal, 1) + + //Register channel to receive SIGINT and SIGTERM signals + signal.Notify(signal_chan, + syscall.SIGINT, + syscall.SIGTERM) + + // Goroutine executes a blocking receive for signals + go func() { + <-signal_chan + manageKillSignals(state) + + // It seems that if we exit immediately Mesos keeps tasks as active. + // TODO: find a more elegant way to exit after tasks are marked as completed in Mesos + time.Sleep(2 * time.Second) + os.Exit(0) + }() +} + + +func manageKillSignals(state *internalState) { + // Get all enviroment ids + uids := state.environments.Ids() + + for _, uid := range uids { + // Get enviroment + env, err := state.environments.Environment(uid) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot find enviroment %s", uid.String())) + } + + tasks := env.Workflow().GetTasks() + + // This might transition to CONFIGURED if needed, of do nothing if we're already there + if env.CurrentState() == "RUNNING" { + + // we mark this specific task as ok to STOP + for _, t := range tasks { + t.SetSafeToStop(true) + } + // but then we ask the env whether *all* of them are + if env.IsSafeToStop() { + err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot transition enviroment %s from RUNNING to CONFIGURED", uid.String())) + } + } + } + + // This might transition to STANDBY if needed, or do nothing if we're already there + if env.CurrentState() == "CONFIGURED" { + err = env.TryTransition(environment.NewResetTransition(state.taskman)) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot transition enviroment %s from CONFIGURED to STANDBY", uid.String())) + } + } + + // Teardown Enviroment + err = state.environments.TeardownEnvironment(uid) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot teardown enviroment %s", uid.String())) + } + + // Kill all tasks using task.Manager + taskIds := env.Workflow().GetTasks().GetTaskIds() + _, _, err = state.taskman.KillTasks(taskIds) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot kill enviroment %s tasks", uid.String())) + } + + // Request Mesos to kill all tasks, regardless enviroment status and if a task is locked or not. + for _, t := range tasks { + killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) + err = calls.CallNoData(context.TODO(), state.cli, killCall) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) + } + } + } +} \ No newline at end of file From 7dee1204e316ade566a90c1973d5f129bd242c58 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 14 Feb 2020 16:51:03 +0100 Subject: [PATCH 0096/2352] [core]: use taskman to cleanup and to get tasks --- core/signals.go | 42 +++++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/core/signals.go b/core/signals.go index 2bf74a034..45ea821f6 100644 --- a/core/signals.go +++ b/core/signals.go @@ -52,14 +52,12 @@ func signals(state *internalState) { <-signal_chan manageKillSignals(state) - // It seems that if we exit immediately Mesos keeps tasks as active. - // TODO: find a more elegant way to exit after tasks are marked as completed in Mesos + // Mesos calls are async.Sleep for 2s to mark tasks as completed. time.Sleep(2 * time.Second) os.Exit(0) }() } - func manageKillSignals(state *internalState) { // Get all enviroment ids uids := state.environments.Ids() @@ -70,18 +68,16 @@ func manageKillSignals(state *internalState) { if err != nil { log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot find enviroment %s", uid.String())) } - - tasks := env.Workflow().GetTasks() - // This might transition to CONFIGURED if needed, of do nothing if we're already there if env.CurrentState() == "RUNNING" { + tasks := env.Workflow().GetTasks() // we mark this specific task as ok to STOP for _, t := range tasks { - t.SetSafeToStop(true) + t.SetSafeToStop(true) } // but then we ask the env whether *all* of them are - if env.IsSafeToStop() { + if env.IsSafeToStop() { err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) if err != nil { log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot transition enviroment %s from RUNNING to CONFIGURED", uid.String())) @@ -93,7 +89,7 @@ func manageKillSignals(state *internalState) { if env.CurrentState() == "CONFIGURED" { err = env.TryTransition(environment.NewResetTransition(state.taskman)) if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot transition enviroment %s from CONFIGURED to STANDBY", uid.String())) + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot transition enviroment %s from CONFIGURED to STANDBY", uid.String())) } } @@ -102,21 +98,21 @@ func manageKillSignals(state *internalState) { if err != nil { log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot teardown enviroment %s", uid.String())) } + } - // Kill all tasks using task.Manager - taskIds := env.Workflow().GetTasks().GetTaskIds() - _, _, err = state.taskman.KillTasks(taskIds) - if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot kill enviroment %s tasks", uid.String())) - } + // Perform cleanup + _, _, err := state.taskman.Cleanup() + if err != nil { + log.WithPrefix("termination").WithError(err).Error("can't perform cleanup") + } - // Request Mesos to kill all tasks, regardless enviroment status and if a task is locked or not. - for _, t := range tasks { - killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) - err = calls.CallNoData(context.TODO(), state.cli, killCall) - if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) - } + // Request Mesos to kill all tasks, regardless enviroment status and if a task is locked or not. + tasks := state.taskman.GetTasks() + for _, t := range tasks { + killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) + err = calls.CallNoData(context.TODO(), state.cli, killCall) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) } } -} \ No newline at end of file +} From 0ae038df612733a0de8f461b4935a549af0cda6c Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 14 Feb 2020 17:16:46 +0100 Subject: [PATCH 0097/2352] [core]: use proper exit status --- core/signals.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/signals.go b/core/signals.go index 45ea821f6..60c396704 100644 --- a/core/signals.go +++ b/core/signals.go @@ -49,12 +49,17 @@ func signals(state *internalState) { // Goroutine executes a blocking receive for signals go func() { - <-signal_chan + s := <-signal_chan manageKillSignals(state) // Mesos calls are async.Sleep for 2s to mark tasks as completed. time.Sleep(2 * time.Second) - os.Exit(0) + switch s { + case syscall.SIGINT: + os.Exit(130) // 128+2 + case syscall.SIGTERM: + os.Exit(143) // 128+15 + } }() } From ce781c94a33c254bb0f42c875f3b3f7ff192ab2a Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 17 Feb 2020 14:32:04 +0100 Subject: [PATCH 0098/2352] [repos] Consistent trailing slash use for repos --- core/repos/repomanager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index c268ec3c1..4740ffc6f 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -460,7 +460,7 @@ func (manager *RepoManager) setDefaultRepo(repo *Repo) { } // Update default_repo backend - err := manager.cService.NewDefaultRepo(strings.TrimSuffix(repo.GetIdentifier(), "/")) + err := manager.cService.NewDefaultRepo(repo.GetIdentifier()) if err != nil { log.Warning("Failed to update default_repo backend: ", err) } From 8b889fb4d01ce945eecc5faa1f375989f1c052d8 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 17 Feb 2020 14:49:17 +0100 Subject: [PATCH 0099/2352] [config] Add trailing slash to viper defaultRepo field --- core/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config.go b/core/config.go index a56f4850f..05a9a695d 100644 --- a/core/config.go +++ b/core/config.go @@ -51,7 +51,7 @@ func setDefaults() error { viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") - viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows") + viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) viper.SetDefault("executorMemory", envFloat("EXEC_MEMORY", "64")) From bf65e4ba091f900b27aa09f20eea24e611306575 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 17 Feb 2020 10:39:12 +0100 Subject: [PATCH 0100/2352] [core]: remove repositoriesPath from configuration --- core/config.go | 14 ++++---------- core/confsys/service.go | 12 ++++++------ core/repos/repo.go | 5 +++-- core/repos/repomanager.go | 6 ++++-- core/task/manager.go | 3 ++- hacking/settings.yaml | 1 - 6 files changed, 19 insertions(+), 22 deletions(-) diff --git a/core/config.go b/core/config.go index 05a9a695d..f83883bd8 100644 --- a/core/config.go +++ b/core/config.go @@ -84,7 +84,6 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) - viper.SetDefault("repositoriesPath", viper.GetString("coreWorkingDir")+"/repos") //TODO: Remove it from Viper. viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) @@ -160,19 +159,15 @@ func parseCoreConfig() error { } func checkRepoDirRights() error { - err := unix.Access(viper.GetString("repositoriesPath"), unix.W_OK) + repoDir := filepath.Join(viper.GetString("coreWorkingDir"),"repos") + utils.EnsureTrailingSlash(&repoDir) + err := unix.Access(repoDir, unix.W_OK) if err != nil { - return errors.New("No write access for configuration repositories path \"" + viper.GetString("repositoriesPath") + "\": "+ err.Error()) + return errors.New("No write access for configuration repositories path \"" + repoDir + "\": "+ err.Error()) } return nil } -func sanitizeReposPath() { - sanitizedReposPath := viper.GetString("repositoriesPath") - utils.EnsureTrailingSlash(&sanitizedReposPath) - viper.Set("repositoriesPath", sanitizedReposPath) -} - func checkWorkingDirRights() error { err := unix.Access(viper.GetString("coreWorkingDir"), unix.W_OK) if err != nil { @@ -208,7 +203,6 @@ func NewConfig() (err error) { return } bindEnvironmentVariables() - sanitizeReposPath() if err = checkRepoDirRights(); err != nil { return } diff --git a/core/confsys/service.go b/core/confsys/service.go index 1eaa41995..c7b8d8c7f 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -103,7 +103,7 @@ func (s *Service) NewDefaultRepo(defaultRepo string) error { return cSrc.Put("o2/control/default_repo", defaultRepo) } else { data := []byte(defaultRepo) - return ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_repo", data, 0644) + return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_repo"), data, 0644) } } @@ -112,7 +112,7 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { return cSrc.Get("o2/control/default_repo") } else { var defaultRepoData []byte - defaultRepoData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_repo") + defaultRepoData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_repo")) if err != nil { return } @@ -126,7 +126,7 @@ func (s *Service) NewDefaultRevision(defaultRevision string) error { return cSrc.Put("o2/control/default_revision", defaultRevision) } else { data := []byte(defaultRevision) - return ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_revision", data, 0644) + return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revision"), data, 0644) } } @@ -135,7 +135,7 @@ func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { return cSrc.Get("o2/control/default_revision") } else { var defaultRevisionData []byte - defaultRevisionData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_revision") + defaultRevisionData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revision")) if err != nil { return } @@ -156,7 +156,7 @@ func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { return nil, err } } else { - defaultRevisionData, err := ioutil.ReadFile(viper.GetString("repositoriesPath") + "default_revisions.json") + defaultRevisionData, err := ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revisions.json")) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er if cSrc, ok := s.src.(*configuration.ConsulSource); ok { err = cSrc.Put("o2/control/default_revisions", string(data)) } else { - err = ioutil.WriteFile(viper.GetString("repositoriesPath") + "default_revisions.json", data, 0644) + err = ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revisions.json"), data, 0644) } return err } diff --git a/core/repos/repo.go b/core/repos/repo.go index 7878420cf..7fba9894c 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -31,6 +31,7 @@ import ( "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" "io/ioutil" + "path/filepath" "strings" ) @@ -79,7 +80,7 @@ func (r *Repo) GetIdentifier() string { } func (r *Repo) getCloneDir() string { - cloneDir := viper.GetString("repositoriesPath") + cloneDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") if cloneDir[len(cloneDir)-1:] != "/" { cloneDir += "/" } @@ -90,7 +91,7 @@ func (r *Repo) getCloneDir() string { } func (r *Repo) getCloneParentDirs() []string { - cleanDir := viper.GetString("repositoriesPath") + cleanDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") if cleanDir[len(cleanDir)-1:] != "/" { cleanDir += "/" } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 4740ffc6f..a1469aa6c 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -128,7 +128,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ var usernames []string var someRepos []string - hostingSites, err = filepath.Glob(viper.GetString("RepositoriesPath") + "*") + hostingSites, err = filepath.Glob(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "*")) if err != nil { return } @@ -145,7 +145,9 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ } for _, repo := range someRepos { //sanitize path - repo = strings.TrimPrefix(repo, viper.GetString("RepositoriesPath")) + repoDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") + utils.EnsureTrailingSlash(&repoDir) + repo = strings.TrimPrefix(repo, repoDir) utils.EnsureTrailingSlash(&repo) repos = append(repos, repo) } diff --git a/core/task/manager.go b/core/task/manager.go index a1975114b..bcb31e665 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -28,6 +28,7 @@ import ( "errors" "fmt" "io/ioutil" + "path/filepath" "strings" "sync" @@ -128,7 +129,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } - yamlData, err = ioutil.ReadFile(viper.GetString("repositoriesPath") + taskClassFile) + yamlData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", taskClassFile)) if err != nil { return nil, err } diff --git a/hacking/settings.yaml b/hacking/settings.yaml index c70639b06..b93d5dca5 100644 --- a/hacking/settings.yaml +++ b/hacking/settings.yaml @@ -5,4 +5,3 @@ mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" verbose: true veryverbose: true globalconfigurationuri: "file://hacking/config.yaml" -repositoriesPath: "/home/alidock/aliecs.d" From ab2c863dbb07763f097f70ae67c54263b311e4b6 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 17 Feb 2020 14:29:20 +0100 Subject: [PATCH 0101/2352] [core]: cleaner reposPath approach in service --- core/confsys/service.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/confsys/service.go b/core/confsys/service.go index c7b8d8c7f..4807a36eb 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -103,7 +103,7 @@ func (s *Service) NewDefaultRepo(defaultRepo string) error { return cSrc.Put("o2/control/default_repo", defaultRepo) } else { data := []byte(defaultRepo) - return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_repo"), data, 0644) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) } } @@ -112,7 +112,7 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { return cSrc.Get("o2/control/default_repo") } else { var defaultRepoData []byte - defaultRepoData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_repo")) + defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) if err != nil { return } @@ -126,7 +126,7 @@ func (s *Service) NewDefaultRevision(defaultRevision string) error { return cSrc.Put("o2/control/default_revision", defaultRevision) } else { data := []byte(defaultRevision) - return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revision"), data, 0644) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) } } @@ -135,7 +135,7 @@ func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { return cSrc.Get("o2/control/default_revision") } else { var defaultRevisionData []byte - defaultRevisionData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revision")) + defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) if err != nil { return } @@ -156,7 +156,7 @@ func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { return nil, err } } else { - defaultRevisionData, err := ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revisions.json")) + defaultRevisionData, err := ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revisions.json")) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er if cSrc, ok := s.src.(*configuration.ConsulSource); ok { err = cSrc.Put("o2/control/default_revisions", string(data)) } else { - err = ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "default_revisions.json"), data, 0644) + err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) } return err } @@ -257,4 +257,8 @@ func (s *Service) GetMesosFID() (fidValue string, err error) { fidValue = strings.TrimSuffix(string(byteFidValue), "/n") return } +} + +func (s *Service) GetReposPath() string { + return filepath.Join(viper.GetString("coreWorkingDir"), "repos") } \ No newline at end of file From 449db5350ceb24bc17f91094b7d4465470636537 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 17 Feb 2020 14:39:38 +0100 Subject: [PATCH 0102/2352] [core]: use GetReposPath in repos manager --- core/repos/repomanager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index a1469aa6c..fe6695830 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -128,7 +128,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ var usernames []string var someRepos []string - hostingSites, err = filepath.Glob(filepath.Join(viper.GetString("coreWorkingDir"), "repos", "*")) + hostingSites, err = filepath.Glob(filepath.Join(manager.cService.GetReposPath(), "*")) if err != nil { return } @@ -145,7 +145,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ } for _, repo := range someRepos { //sanitize path - repoDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") + repoDir := manager.cService.GetReposPath() utils.EnsureTrailingSlash(&repoDir) repo = strings.TrimPrefix(repo, repoDir) utils.EnsureTrailingSlash(&repo) From a19560e59f91f6d4b34c5cafa0f63eee7006636a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 17 Feb 2020 15:59:27 +0100 Subject: [PATCH 0103/2352] [core]: use service to get reposPath --- core/repos/repo.go | 8 ++++---- core/task/manager.go | 3 +-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 7fba9894c..7f723926a 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -27,12 +27,12 @@ package repos import ( "errors" "github.com/gobwas/glob" - "github.com/spf13/viper" "gopkg.in/src-d/go-git.v4" "gopkg.in/src-d/go-git.v4/plumbing" "io/ioutil" - "path/filepath" "strings" + + "github.com/AliceO2Group/Control/core/confsys" ) type Repo struct { @@ -80,7 +80,7 @@ func (r *Repo) GetIdentifier() string { } func (r *Repo) getCloneDir() string { - cloneDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") + cloneDir := confsys.Instance().GetReposPath() if cloneDir[len(cloneDir)-1:] != "/" { cloneDir += "/" } @@ -91,7 +91,7 @@ func (r *Repo) getCloneDir() string { } func (r *Repo) getCloneParentDirs() []string { - cleanDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") + cleanDir := confsys.Instance().GetReposPath() if cleanDir[len(cleanDir)-1:] != "/" { cleanDir += "/" } diff --git a/core/task/manager.go b/core/task/manager.go index bcb31e665..f2485d4a5 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -35,7 +35,6 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/the" - "github.com/spf13/viper" "gopkg.in/yaml.v2" "github.com/AliceO2Group/Control/core/controlcommands" @@ -129,7 +128,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } - yamlData, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "repos", taskClassFile)) + yamlData, err = ioutil.ReadFile(filepath.Join(the.ConfSvc().GetReposPath(), taskClassFile)) if err != nil { return nil, err } From bfd6cf19188702d40c9f364674203d77326b2a3e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Mar 2020 13:28:24 +0100 Subject: [PATCH 0104/2352] [core] New proposed protofile for DCS integration --- core/protos/dcs.proto | 144 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 core/protos/dcs.proto diff --git a/core/protos/dcs.proto b/core/protos/dcs.proto new file mode 100644 index 000000000..5c46548f5 --- /dev/null +++ b/core/protos/dcs.proto @@ -0,0 +1,144 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +syntax = "proto3"; + +package dcs; +option java_package = "ch.cern.alice.dcs"; +option go_package = "dcspb"; + +////////////////////////////////////////////////////// + +service Configurator { + rpc Subscribe (SubscriptionRequest) returns (stream Event) {} + rpc StartOfRun (SorRequest) returns (stream Event) {} + rpc EndOfRun (EorRequest) returns (stream Event) {} + rpc GetStatus (StatusRequest) returns (StatusReply) {} +} + +////////////////////////////////////////////////////// +// Enum definitions +////////////////////////////////////////////////////// + +enum EventType { + NULL_EVENT = 0; + DETECTOR_STATE_CHANGE_EVENT = 1; + DETECTOR_ERROR_EVENT = 2; + SOR_EVENT = 20; + EOR_EVENT = 30; +} + +enum Detector { + NULL_DETECTOR = 0; + ACO = 1; + EMC = 2; + FIT = 3; + ITS = 4; + MCH = 5; + MFT = 6; + PHOS = 7; + TOF = 8; + TPC = 9; + TRD = 10; + ZDC = 11; + // list to be fixed/completed +} + +enum DetectorState { + NULL_STATE = 0; + READY = 1; + MOVING = 2; + SAFE = 3; + MIXED = 4; + ERROR = 5; + // list to be fixed/completed +} + +enum RunType { + RT_NULL = 0; + RT_PHYSICS = 1; + RT_TECHNICAL = 2; +} + +////////////////////////////////////////////////////// +// Message definitions +////////////////////////////////////////////////////// + +// Subscribe call + +message SubscriptionRequest { + string instanceId = 1; +} + +message Event { + EventType type = 1; + Detector detector = 2; + string name = 3; + string description = 4; + DetectorState state = 5; + + // Note that all fields are optional in Proto3, so some of the above might arrive empty + // from the client. + // However, sometimes we want to add more information for certain types of event but + // not for others. A map is a type-unsafe way to do this, but we can also + // transmit complex optional structures via gRPC/Protobuf with the oneof operator. + // A oneof{} entry makes sure that only one of the contained entries is set. + // This is an example on how to embed additional strongly typed fields to this message: + //oneof ErrorEvent { + // TransitionErrorEvent = 6; + // InternalErrorEvent = 7; + // DetectorNotReadyEvent = 8; + // //... + //} +} + +// SOR/EOR calls + +message SorRequest { + Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command + RunType runType = 2; + map parameters = 3; // this can be a map or something strongly typed as we figure it out +} + +message EorRequest { + Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command + map parameters = 2; // does EOR need params? +} + +// GetStatus call + +message StatusRequest { + Detector detector = 1; + // In proto3 all fields are optional, with Protobuf assuming a zero value for empty fields. + // Thus if the client sends this request with empty detector or detector = NULL_DETECTOR, + // the server should return the status of all detectors. +} +message DetectorInfo { + Detector detector = 1; + DetectorState state = 2; + repeated RunType allowedRunTypes = 3; +} +message StatusReply { + repeated DetectorInfo detectorMatrix = 1; +} \ No newline at end of file From b1ef8850ea411fc8f88e155c2960216c4307ca26 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jan 2020 18:59:21 +0100 Subject: [PATCH 0105/2352] [core] New hierarchical property map --- common/gera/map.go | 165 +++++++++++++++++++++++++++++++++++++++++++++ go.mod | 3 +- go.sum | 4 ++ 3 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 common/gera/map.go diff --git a/common/gera/map.go b/common/gera/map.go new file mode 100644 index 000000000..b2fb7a1d0 --- /dev/null +++ b/common/gera/map.go @@ -0,0 +1,165 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +// Package gera implements a hierarchical key-value store. +// +// A gera.Map uses a map[string]interface{} as backing store, and it can wrap other gera.Map instances. +// Values in child maps override any value provided by a gera.Map that's wrapped in the hierarchy. +package gera + +import "github.com/imdario/mergo" + +type Map interface{ + Wrap(m Map) Map + IsHierarchyRoot() bool + HierarchyContains(m Map) bool + Unwrap() Map + + Get(key string) (interface{}, bool) + Set(key string, value interface{}) bool + Has(key string) bool + Len() int + + Flattened() (map[string]interface{}, error) +} + +func MakeMap() Map { + return &WrapMap{ + theMap: make(map[string]interface{}), + parent: nil, + } +} + +func MakeMapWithMap(fromMap map[string]interface{}) Map { + myMap := &WrapMap{ + theMap: make(map[string]interface{}), + parent: nil, + } + for k, v := range fromMap { + myMap.theMap[k] = v + } + return myMap +} + +type WrapMap struct { + theMap map[string]interface{} + parent Map +} + +func (w *WrapMap) IsHierarchyRoot() bool { + if w == nil || w.parent != nil { + return false + } + return true +} + +func (w *WrapMap) HierarchyContains(m Map) bool { + if w == nil || w.parent == nil { + return false + } + if w.parent == m { + return true + } + return w.parent.HierarchyContains(m) +} + +// Wraps this map around the gera.Map m, which becomes the new parent. +// Returns a pointer to the composite map (i.e. to itself in its new state). +func (w *WrapMap) Wrap(m Map) Map { + if w == nil { + return nil + } + w.parent = m + return w +} + +// Unwraps this map from its parent. +// Returns a pointer to the former parent which was just unwrapped. +func (w *WrapMap) Unwrap() Map { + if w == nil { + return nil + } + p := w.parent + w.parent = nil + return p +} + +func (w *WrapMap) Get(key string) (value interface{}, ok bool) { + if w == nil || w.theMap == nil { + return nil, false + } + if val, ok := w.theMap[key]; ok { + return val, true + } + if w.parent != nil { + return w.parent.Get(key) + } + return nil, false +} + +func (w *WrapMap) Set(key string, value interface{}) (ok bool) { + if w == nil || w.theMap == nil { + return false + } + w.theMap[key] = value + return true +} + +func (w *WrapMap) Has(key string) bool { + _, ok := w.Get(key) + return ok +} + +func (w *WrapMap) Len() int { + if w == nil || w.theMap == nil { + return 0 + } + flattened, err := w.Flattened() + if err != nil { + return 0 + } + return len(flattened) +} + +func (w *WrapMap) Flattened() (map[string]interface{}, error) { + if w == nil { + return nil, nil + } + + out := make(map[string]interface{}) + for k, v := range w.theMap { + out[k] = v + } + if w.parent == nil { + return out, nil + } + + flattenedParent, err := w.parent.Flattened() + if err != nil { + return out, err + } + + err = mergo.Merge(&out, flattenedParent) + return out, err +} diff --git a/go.mod b/go.mod index 17d276ef3..f2b113929 100644 --- a/go.mod +++ b/go.mod @@ -33,6 +33,7 @@ require ( github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/memberlist v0.1.4 // indirect github.com/hashicorp/serf v0.8.5 // indirect + github.com/imdario/mergo v0.3.8 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a github.com/json-iterator/go v1.1.9 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect @@ -73,7 +74,7 @@ require ( go.uber.org/zap v1.13.0 // indirect golang.org/x/crypto v0.0.0-20200117160349-530e935923ad // indirect golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa - golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 + golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 // indirect google.golang.org/grpc v1.26.0 diff --git a/go.sum b/go.sum index 8d9f99551..c97f4cfc9 100644 --- a/go.sum +++ b/go.sum @@ -178,6 +178,8 @@ github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -489,6 +491,8 @@ golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 h1:N19i1HjUnR7TF7rMt8O4p3dLvqvmYyzB6ifMFmrbY50= golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= From 78fe8518a5fabdb9020a70bf388c5c98cf0f26e0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Jan 2020 10:37:29 +0100 Subject: [PATCH 0106/2352] [core] Add WrappedAndFlattened to hierarchical map --- common/gera/map.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/common/gera/map.go b/common/gera/map.go index b2fb7a1d0..048ddb18b 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -42,6 +42,7 @@ type Map interface{ Len() int Flattened() (map[string]interface{}, error) + WrappedAndFlattened(m Map) (map[string]interface{}, error) } func MakeMap() Map { @@ -163,3 +164,25 @@ func (w *WrapMap) Flattened() (map[string]interface{}, error) { err = mergo.Merge(&out, flattenedParent) return out, err } + +func (w *WrapMap) WrappedAndFlattened(m Map) (map[string]interface{}, error) { + if w == nil { + return nil, nil + } + + out := make(map[string]interface{}) + for k, v := range w.theMap { + out[k] = v + } + if m == nil { + return out, nil + } + + flattenedM, err := m.Flattened() + if err != nil { + return out, err + } + + err = mergo.Merge(&out, flattenedM) + return out, err +} From e35126479995a340a4f8a2a16f9b081c1f4bf836 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jan 2020 10:28:21 +0100 Subject: [PATCH 0107/2352] [core] Extend o2control.proto to accept environment properties --- core/protos/o2control.proto | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9e455522a..8a4a52816 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -48,6 +48,9 @@ service Control { rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} rpc DestroyEnvironment (DestroyEnvironmentRequest) returns (DestroyEnvironmentReply) {} + rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} + rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} + rpc GetTasks (GetTasksRequest) returns (GetTasksReply) {} rpc GetTask(GetTaskRequest) returns (GetTaskReply) {} rpc CleanupTasks(CleanupTasksRequest) returns (CleanupTasksReply) {} @@ -134,6 +137,7 @@ message EnvironmentInfo { message NewEnvironmentRequest { string workflowTemplate = 1; + map properties = 2; } message NewEnvironmentReply { EnvironmentInfo environment = 1; @@ -193,6 +197,30 @@ message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; } +//////////////////////////////////////// +// Environment, GET/SET properties +//////////////////////////////////////// +message SetEnvironmentPropertiesRequest { + string id = 1; + // If properties == nil, the core sets nothing + // and reply ok + map properties = 2; +} +message SetEnvironmentPropertiesReply {} + +message GetEnvironmentPropertiesRequest { + string id = 1; + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + repeated string queries = 2; + bool excludeGlobals = 3; +} +message GetEnvironmentPropertiesReply { + map properties = 1; +} + + //////////////////////////////////////// // Tasks //////////////////////////////////////// From de2668973f35ef356385eff806dc41007d371b48 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jan 2020 02:34:54 +0100 Subject: [PATCH 0108/2352] [build] Regenerate proto --- coconut/protos/o2control.pb.go | 5817 +++++++++++++++++++++----------- core/protos/o2control.pb.go | 5817 +++++++++++++++++++++----------- executor/protos/occ.pb.go | 415 ++- go.mod | 2 +- go.sum | 2 + 5 files changed, 7781 insertions(+), 4272 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index c5e0e61df..97a686170 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -882,10 +837,11 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { } type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } @@ -902,7 +858,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -928,6 +884,13 @@ func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { return "" } +func (m *NewEnvironmentRequest) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -949,7 +912,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +959,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +1007,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1062,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1118,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1181,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1243,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1299,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1361,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1415,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1478,6 +1441,218 @@ func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +//////////////////////////////////////// +// Environment, GET/SET properties +//////////////////////////////////////// +type SetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } +func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} +} +func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *SetEnvironmentPropertiesRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + +type SetEnvironmentPropertiesReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } +func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} +} +func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *SetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) +} + +var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo + +type GetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } +func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *GetEnvironmentPropertiesRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { + if m != nil { + return m.Queries + } + return nil +} + +func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if m != nil { + return m.ExcludeGlobals + } + return false +} + +type GetEnvironmentPropertiesReply struct { + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } +func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} +} +func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *GetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo + +func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + //////////////////////////////////////// // Tasks //////////////////////////////////////// @@ -1498,7 +1673,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1683,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1590,7 +1765,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1600,7 +1775,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1657,7 +1832,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,7 +1842,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1697,7 +1872,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1707,7 +1882,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1744,7 +1919,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1754,7 +1929,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1791,7 +1966,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1801,7 +1976,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1839,7 +2014,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1849,7 +2024,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1897,7 +2072,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1907,7 +2082,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1974,7 +2149,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1984,7 +2159,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2041,7 +2216,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2051,7 +2226,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2130,7 +2305,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2140,7 +2315,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2178,7 +2353,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2188,7 +2363,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2236,7 +2411,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2246,7 +2421,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2295,7 +2470,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2305,7 +2480,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2377,7 +2552,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2387,7 +2562,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2427,7 +2602,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2437,7 +2612,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2497,7 +2672,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2507,7 +2682,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2558,7 +2733,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2568,7 +2743,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2604,7 +2779,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2614,7 +2789,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2646,7 +2821,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2831,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2708,7 +2883,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2718,7 +2893,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2763,7 +2938,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2773,7 +2948,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2818,7 +2993,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2828,7 +3003,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2872,7 +3047,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2882,7 +3057,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2919,7 +3094,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2929,7 +3104,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2966,7 +3141,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2976,7 +3151,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3013,7 +3188,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3023,7 +3198,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3060,7 +3235,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3070,7 +3245,7 @@ func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bo return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3108,7 +3283,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3118,7 +3293,7 @@ func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3162,7 +3337,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3172,7 +3347,7 @@ func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3208,7 +3383,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3393,7 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3254,6 +3429,7 @@ func init() { proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.PropertiesEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -3264,6 +3440,12 @@ func init() { proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") + proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") + proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") + proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") + proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") + proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") @@ -3300,152 +3482,163 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2317 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, - 0xf1, 0xd7, 0x50, 0xa4, 0x49, 0x16, 0x25, 0x8a, 0x6a, 0xc9, 0xf2, 0x88, 0xf6, 0xca, 0xda, 0xfe, - 0x2f, 0xbc, 0xb2, 0x77, 0xff, 0x72, 0x56, 0xbb, 0x48, 0x36, 0xc6, 0x6e, 0x1c, 0x7d, 0xd0, 0xb2, - 0x12, 0x4b, 0x74, 0x86, 0xb4, 0x8d, 0x18, 0x08, 0x9c, 0x11, 0xa7, 0x29, 0x72, 0x35, 0x9c, 0xe1, - 0xce, 0x34, 0x65, 0xeb, 0x90, 0x5b, 0x6e, 0x41, 0x90, 0x43, 0x2e, 0xb9, 0x06, 0x41, 0x8e, 0x79, - 0x86, 0x5c, 0x73, 0x09, 0x92, 0xbc, 0x41, 0xe0, 0x00, 0x39, 0xe5, 0x21, 0x82, 0xfe, 0x9a, 0xe9, - 0x19, 0xce, 0x50, 0x02, 0x72, 0x63, 0x55, 0x57, 0x55, 0x57, 0xd5, 0xaf, 0xba, 0xaa, 0xa7, 0x09, - 0x6b, 0xe3, 0xc0, 0xa7, 0x7e, 0xf8, 0xd0, 0xdf, 0xe9, 0xf9, 0x1e, 0x0d, 0x7c, 0x77, 0x9b, 0x33, - 0x50, 0x35, 0x62, 0xe0, 0x35, 0x58, 0x6d, 0x5d, 0x10, 0x8f, 0xbe, 0x39, 0x26, 0xa1, 0x1f, 0x3e, - 0x25, 0x76, 0x40, 0x4f, 0x89, 0x4d, 0xf1, 0x12, 0x2c, 0x76, 0xa8, 0x4d, 0x27, 0xa1, 0x45, 0xbe, - 0x9d, 0x90, 0x90, 0xe2, 0x53, 0xa8, 0x29, 0xc6, 0xd8, 0xbd, 0x44, 0xab, 0x50, 0x0a, 0xa9, 0x4d, - 0x89, 0x69, 0x6c, 0x1a, 0x5b, 0x55, 0x4b, 0x10, 0xe8, 0x6b, 0x58, 0x0c, 0xb9, 0xd0, 0x8b, 0xb1, - 0x63, 0x53, 0x12, 0x9a, 0x85, 0xcd, 0xf9, 0xad, 0xda, 0xce, 0xad, 0xed, 0xd8, 0x83, 0x8e, 0xb6, - 0x6e, 0x25, 0xa5, 0xf1, 0x5f, 0x0d, 0x58, 0xd0, 0xd7, 0xd1, 0xe7, 0x50, 0x72, 0xc9, 0x05, 0x71, - 0xf9, 0x2e, 0xf5, 0x9d, 0x0f, 0x72, 0xec, 0x6c, 0x3f, 0x63, 0x42, 0x96, 0x90, 0x45, 0x47, 0x50, - 0x1f, 0x25, 0x82, 0x31, 0x0b, 0x9b, 0xc6, 0x56, 0x6d, 0xe7, 0xae, 0xa6, 0x9d, 0x15, 0xf3, 0xd3, - 0x39, 0x2b, 0xa5, 0x88, 0xbf, 0x80, 0x12, 0x37, 0x8d, 0xaa, 0x50, 0x3a, 0x68, 0xed, 0xbd, 0x38, - 0x6c, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4e, 0x9e, 0xb4, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xd5, 0xae, - 0x75, 0x72, 0x74, 0x72, 0xd8, 0x28, 0x30, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x5e, 0x19, - 0x4a, 0xdc, 0x3e, 0x5e, 0x87, 0x5b, 0x87, 0x84, 0x3e, 0x09, 0xec, 0x11, 0x79, 0xeb, 0x07, 0xe7, - 0x47, 0x5e, 0xdf, 0x57, 0xe9, 0xfc, 0x83, 0x01, 0xe5, 0x97, 0x24, 0x08, 0x87, 0xbe, 0xc7, 0x72, - 0x39, 0xb2, 0xbf, 0xf1, 0x03, 0x1e, 0x65, 0xc9, 0x12, 0x04, 0xe7, 0x0e, 0x3d, 0x3f, 0xe0, 0xde, - 0x33, 0x2e, 0x23, 0x18, 0x77, 0x6c, 0xd3, 0xde, 0xc0, 0x9c, 0x17, 0x5c, 0x4e, 0x30, 0xee, 0xe9, - 0x64, 0xe8, 0x3a, 0x66, 0x51, 0xa0, 0xc1, 0x09, 0xb4, 0x09, 0xb5, 0x71, 0xe0, 0x3b, 0x93, 0x1e, - 0x3d, 0xb1, 0x47, 0xc4, 0x2c, 0xf1, 0x35, 0x9d, 0x85, 0x36, 0x00, 0x2e, 0x84, 0x13, 0x1d, 0x1a, - 0x98, 0x37, 0xb8, 0x80, 0xc6, 0xc1, 0xbf, 0x29, 0xc0, 0xcd, 0xe9, 0x08, 0x18, 0xfe, 0x9b, 0x50, - 0xeb, 0x47, 0x5c, 0x47, 0x56, 0x81, 0xce, 0x42, 0x9f, 0xc2, 0x32, 0xf1, 0x2e, 0x86, 0x81, 0xef, - 0x8d, 0x88, 0x47, 0xc3, 0x7d, 0x7f, 0xe2, 0x51, 0x19, 0xcb, 0xf4, 0x02, 0xf3, 0x84, 0xda, 0xe1, - 0xb9, 0x14, 0x13, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0xfc, 0x50, - 0x19, 0x2f, 0x09, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x90, 0xda, 0x5e, 0x8f, 0xf0, 0x14, - 0x88, 0x08, 0x13, 0x3c, 0xf4, 0x29, 0x94, 0x65, 0xc4, 0x66, 0x99, 0xd7, 0x09, 0xd2, 0xea, 0x44, - 0x42, 0x64, 0x29, 0x11, 0x7c, 0x1f, 0x96, 0xba, 0xc4, 0x0e, 0x1c, 0xff, 0xad, 0x27, 0xa1, 0x44, - 0x6b, 0x70, 0x23, 0x20, 0x76, 0xe8, 0x7b, 0x32, 0x0b, 0x92, 0x62, 0x47, 0x28, 0x16, 0x1d, 0xbb, - 0x97, 0xd8, 0x84, 0xb5, 0x43, 0x42, 0x5b, 0x5a, 0xec, 0xaa, 0x1a, 0xde, 0xc1, 0xea, 0xd4, 0xca, - 0xf5, 0xb2, 0xfc, 0x03, 0x58, 0xd0, 0x93, 0x29, 0x0f, 0x5c, 0x53, 0x2f, 0xf5, 0x78, 0x99, 0xc3, - 0x97, 0x90, 0xc7, 0xff, 0x30, 0x60, 0x29, 0x25, 0x81, 0xea, 0x50, 0x18, 0xaa, 0xcd, 0x0a, 0x43, - 0x5e, 0x47, 0xbd, 0x80, 0xd8, 0x94, 0x38, 0xaf, 0x06, 0xc4, 0xe3, 0x18, 0x56, 0x2d, 0x9d, 0x15, - 0xa3, 0x33, 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x8e, 0xa0, 0x59, 0xe4, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, - 0xf8, 0x01, 0xed, 0xda, 0xa1, 0xa8, 0x28, 0x21, 0x86, 0x9a, 0x50, 0x09, 0x7c, 0x9f, 0x5a, 0xbe, - 0xab, 0x8a, 0x35, 0xa2, 0xd1, 0x03, 0x68, 0xf4, 0x26, 0x41, 0x40, 0x3c, 0x6a, 0x4d, 0xbc, 0x93, - 0xc9, 0xe8, 0x94, 0x88, 0x7a, 0x5d, 0xb4, 0xa6, 0xf8, 0x78, 0x1f, 0x6e, 0x9e, 0x90, 0xb7, 0x5a, - 0x54, 0x0a, 0xa9, 0x07, 0xd0, 0x60, 0x69, 0xeb, 0xbb, 0xfe, 0xdb, 0x2e, 0x19, 0x8d, 0xdd, 0xb8, - 0x7f, 0x4d, 0xf1, 0x71, 0x07, 0x56, 0xd2, 0x46, 0x18, 0x22, 0x5f, 0x41, 0x4d, 0xcb, 0x1f, 0xd7, - 0x9e, 0x9d, 0x6e, 0x5d, 0x1c, 0x7f, 0xcc, 0x8f, 0x53, 0x86, 0x67, 0xa9, 0x94, 0xe3, 0x5f, 0x1a, - 0xb0, 0x92, 0x96, 0xfc, 0x9f, 0xb7, 0x47, 0x0f, 0xa1, 0xa2, 0xe2, 0x94, 0x3d, 0x71, 0x45, 0x53, - 0x65, 0x79, 0xe6, 0x3a, 0x91, 0x10, 0xfe, 0x9b, 0x01, 0xeb, 0xfb, 0x62, 0xf9, 0x6a, 0xa7, 0xd1, - 0x63, 0x28, 0xd2, 0xcb, 0x31, 0xe1, 0xa6, 0xeb, 0x3b, 0x9f, 0x68, 0xa6, 0x73, 0x6d, 0x6c, 0xb7, - 0xc7, 0x4c, 0xc5, 0xe2, 0x8a, 0xd8, 0x86, 0x1b, 0x82, 0x66, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0xde, - 0x98, 0x43, 0x08, 0xea, 0x9d, 0xee, 0xae, 0xd5, 0x7d, 0xb3, 0xbb, 0xdf, 0x3d, 0x7a, 0x79, 0xd4, - 0xfd, 0x69, 0xc3, 0x40, 0xcb, 0xb0, 0xd8, 0xe9, 0xb6, 0x9f, 0xc7, 0xac, 0x02, 0x5a, 0x84, 0xea, - 0x7e, 0xfb, 0xe4, 0xc9, 0xd1, 0xe1, 0x0b, 0xab, 0xd5, 0x98, 0x67, 0xdd, 0xd8, 0x6a, 0x75, 0x5a, - 0xdd, 0x46, 0x11, 0x2d, 0x40, 0xe5, 0xb0, 0xfd, 0x46, 0xf4, 0xe6, 0x12, 0x3e, 0x87, 0x5b, 0x59, - 0xce, 0xb0, 0xdc, 0xa6, 0xc3, 0x89, 0x8a, 0xba, 0xa0, 0x17, 0x75, 0x56, 0x21, 0xce, 0xe7, 0x14, - 0xe2, 0x6f, 0x0d, 0x30, 0x8f, 0x7d, 0x67, 0xd8, 0xbf, 0xbc, 0x56, 0xf6, 0xc0, 0x1f, 0x93, 0xc0, - 0xa6, 0x43, 0xdf, 0x53, 0xe7, 0xf8, 0x6e, 0x36, 0xb2, 0x6d, 0x25, 0x67, 0x69, 0x2a, 0xe8, 0x1e, - 0xd4, 0x03, 0xd2, 0xf3, 0xbd, 0xfe, 0xf0, 0x6c, 0x12, 0x90, 0x5d, 0xd7, 0xe5, 0x7e, 0x55, 0xac, - 0x14, 0x17, 0xff, 0xde, 0x80, 0xd5, 0x2c, 0x63, 0xe8, 0x91, 0xc4, 0x4f, 0x0c, 0xdb, 0x7b, 0x57, - 0xec, 0x9d, 0x80, 0x4e, 0x9c, 0x5d, 0x57, 0x74, 0xd9, 0x82, 0x3a, 0xbb, 0x82, 0xc6, 0x9f, 0x65, - 0xc0, 0xba, 0x04, 0x35, 0xab, 0x75, 0xdc, 0x7e, 0xd9, 0x7a, 0x63, 0xb5, 0x9f, 0x31, 0xc4, 0x16, - 0xa0, 0xb2, 0x7b, 0x70, 0x20, 0xa8, 0x22, 0xfe, 0x95, 0x01, 0x6b, 0x19, 0x99, 0x63, 0x30, 0xfd, - 0x18, 0x1a, 0x7d, 0x7b, 0xe8, 0x12, 0xa7, 0x1d, 0x67, 0xcb, 0xb8, 0x5e, 0xb6, 0xa6, 0x14, 0x25, - 0x08, 0x85, 0x69, 0xcc, 0xf5, 0x46, 0x86, 0x8f, 0x60, 0xfd, 0x80, 0x84, 0x34, 0xf0, 0xaf, 0x83, - 0xe3, 0x1d, 0xa8, 0x9e, 0x13, 0x32, 0xee, 0xf2, 0xce, 0x57, 0xe0, 0x08, 0xc4, 0x0c, 0x4c, 0xe0, - 0x56, 0x96, 0x29, 0x16, 0xd8, 0x8f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x08, 0x51, 0xce, 0x94, - 0x27, 0xfc, 0x8e, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, 0x1e, - 0x8b, 0x10, 0x14, 0x3d, 0x06, 0x8e, 0x70, 0x94, 0xff, 0x66, 0x93, 0xcb, 0xf5, 0x7b, 0xe7, 0xc4, - 0x91, 0x7e, 0x4a, 0x8a, 0xf1, 0x59, 0x47, 0x3e, 0x72, 0x64, 0x1a, 0x24, 0xc5, 0xf8, 0xe2, 0xc2, - 0x26, 0xa7, 0xb0, 0xa4, 0xe2, 0xac, 0x95, 0xf4, 0x93, 0x72, 0x07, 0xaa, 0x3d, 0xd7, 0x0e, 0x43, - 0x6d, 0xf2, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0xae, 0x7f, 0xa9, 0x5a, 0x95, 0x9c, 0xbe, - 0xfa, 0x1d, 0x8f, 0x39, 0x7f, 0x90, 0x10, 0xb2, 0x52, 0x4a, 0xac, 0x51, 0xa2, 0x69, 0x31, 0x56, - 0x8e, 0xec, 0x1a, 0xa0, 0x45, 0x1c, 0xd1, 0xc8, 0x84, 0xb2, 0x7d, 0xc6, 0x04, 0x15, 0xf0, 0x8a, - 0x64, 0x2b, 0x7e, 0xbf, 0x4f, 0x82, 0x28, 0x70, 0x45, 0xb2, 0x8b, 0x06, 0x79, 0x47, 0x7a, 0x13, - 0xea, 0xb3, 0x45, 0x11, 0xbd, 0xc6, 0xc1, 0xcb, 0xb0, 0x74, 0x48, 0xa8, 0x04, 0x40, 0xcc, 0xf4, - 0xc7, 0xb0, 0x18, 0xb3, 0x18, 0xbe, 0xd1, 0x38, 0x34, 0xae, 0x35, 0x0e, 0xf1, 0x16, 0xd4, 0xa5, - 0x01, 0xed, 0xa6, 0x21, 0x71, 0x31, 0x74, 0x5c, 0xf0, 0xf7, 0x60, 0x21, 0x92, 0x64, 0x3b, 0x7d, - 0x0c, 0x45, 0xb6, 0x22, 0x8b, 0x67, 0x25, 0x95, 0x51, 0xbe, 0x07, 0x17, 0xc0, 0x2d, 0x58, 0x64, - 0x9c, 0x7d, 0x86, 0x4a, 0x6e, 0x95, 0xb0, 0xf1, 0x2f, 0xd4, 0x8f, 0x7d, 0x87, 0x44, 0xe3, 0x3f, - 0x66, 0xe1, 0x5f, 0x40, 0x6d, 0xdf, 0x1f, 0x8d, 0x6c, 0xcf, 0xe1, 0x46, 0x1a, 0x30, 0x4f, 0xbc, - 0x0b, 0x1e, 0x66, 0xd5, 0x62, 0x3f, 0x79, 0x81, 0x0c, 0x88, 0xeb, 0xca, 0x3a, 0x13, 0x04, 0xe3, - 0x5e, 0xd8, 0xee, 0x24, 0x3a, 0x6c, 0x9c, 0x60, 0x65, 0x63, 0x07, 0x67, 0x13, 0x71, 0x9d, 0x29, - 0x72, 0x1b, 0x31, 0x83, 0x39, 0x38, 0x09, 0x49, 0x20, 0x2b, 0x8d, 0xff, 0xc6, 0xc7, 0x50, 0xdb, - 0x1f, 0xd8, 0x9e, 0x47, 0xdc, 0xdc, 0x18, 0x90, 0x36, 0x9a, 0xaa, 0xb2, 0x65, 0xf1, 0x6c, 0x06, - 0x67, 0x84, 0xc6, 0x55, 0xce, 0x28, 0xfc, 0x9f, 0x02, 0x54, 0xa2, 0x63, 0xf3, 0x5d, 0xa8, 0x86, - 0x0c, 0x1c, 0x5e, 0xa1, 0x22, 0x9f, 0xf9, 0xc0, 0xc5, 0xa2, 0x4c, 0xaf, 0xa7, 0xb2, 0x2a, 0x67, - 0xad, 0x99, 0xc2, 0x21, 0xca, 0xba, 0x15, 0x8b, 0xa2, 0x1f, 0xc2, 0xd2, 0xd0, 0x3b, 0xf5, 0x27, - 0x9e, 0x23, 0x43, 0x0a, 0xcd, 0x79, 0x5e, 0x2e, 0x6b, 0x7a, 0x0b, 0x88, 0xa3, 0xb5, 0xd2, 0xe2, - 0x68, 0x0f, 0x1a, 0xfe, 0x84, 0x26, 0x4d, 0x14, 0x67, 0x9a, 0x98, 0x92, 0x47, 0x5f, 0x32, 0xc8, - 0x23, 0x40, 0x79, 0xb2, 0x53, 0xea, 0xf1, 0xaa, 0xa5, 0x8b, 0xb2, 0x83, 0xc7, 0x2a, 0xeb, 0xb9, - 0x4d, 0x07, 0xf2, 0xcc, 0x47, 0x34, 0xc3, 0x9b, 0x78, 0x17, 0x47, 0x0e, 0x3f, 0xe9, 0x55, 0x4b, - 0x10, 0xf8, 0x21, 0xac, 0x24, 0x5b, 0x9a, 0xa8, 0x75, 0x13, 0xca, 0xa2, 0xba, 0x43, 0x59, 0x48, - 0x8a, 0xc4, 0xbf, 0x36, 0x60, 0x79, 0xaa, 0x09, 0xa2, 0x47, 0x50, 0x3b, 0x1f, 0xba, 0x2e, 0x71, - 0xba, 0xd7, 0x3a, 0x63, 0xba, 0x30, 0xfa, 0x0a, 0x16, 0x82, 0x89, 0xe7, 0x0d, 0xbd, 0x33, 0xd5, - 0xb5, 0x67, 0x2b, 0x27, 0xa4, 0xf1, 0x3e, 0x3f, 0xfb, 0xec, 0xf6, 0x14, 0x39, 0x1f, 0x45, 0x6a, - 0x68, 0x91, 0xb2, 0xdc, 0x8c, 0x6d, 0x3a, 0xe8, 0x8c, 0x49, 0x4f, 0xcd, 0x48, 0x45, 0xe3, 0x3f, - 0x19, 0x50, 0x51, 0x17, 0xb0, 0xbc, 0x5e, 0x2d, 0x7b, 0x6f, 0x21, 0xbb, 0xf7, 0x26, 0xae, 0xde, - 0x4d, 0xa8, 0xf4, 0x27, 0xae, 0xcb, 0x61, 0x10, 0xdd, 0x2a, 0xa2, 0xf5, 0xcc, 0x96, 0x12, 0x99, - 0x45, 0xf7, 0xa1, 0xc4, 0x86, 0x76, 0x68, 0xde, 0xe0, 0x09, 0xc8, 0xbc, 0x1c, 0x0a, 0x09, 0xfc, - 0x88, 0x77, 0x37, 0x19, 0x34, 0xcb, 0x7f, 0xa4, 0x6b, 0x5c, 0xa9, 0xfb, 0x47, 0x03, 0x6e, 0x1f, - 0x12, 0xfa, 0x2a, 0x75, 0xe5, 0x8e, 0xb2, 0xb7, 0x09, 0xb5, 0x80, 0x8c, 0xfd, 0xe7, 0x36, 0xa5, - 0x24, 0x50, 0x5f, 0x55, 0x3a, 0x0b, 0x6d, 0xc1, 0x52, 0x40, 0x2e, 0x86, 0xec, 0x8b, 0x4c, 0x49, - 0x89, 0xac, 0xa4, 0xd9, 0xcc, 0x96, 0xed, 0xba, 0x7b, 0x81, 0xed, 0xf5, 0x06, 0x24, 0x94, 0x37, - 0x22, 0x9d, 0xc5, 0xc7, 0x81, 0xeb, 0x76, 0xed, 0x33, 0x31, 0xd5, 0x2a, 0x96, 0x22, 0xf1, 0x29, - 0xac, 0xa6, 0x7d, 0x54, 0xf0, 0x30, 0x67, 0x14, 0x3c, 0xec, 0x37, 0xaf, 0x7b, 0xf5, 0x49, 0x21, - 0xb1, 0x55, 0x34, 0xbf, 0x1b, 0x49, 0xb7, 0x24, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xf5, 0xec, 0x54, - 0xb0, 0x9c, 0x1e, 0xc3, 0x72, 0xfa, 0xbb, 0x24, 0xeb, 0xae, 0x93, 0xe5, 0xa4, 0x35, 0xad, 0x89, - 0x11, 0x34, 0x9e, 0x0d, 0x43, 0x76, 0xdb, 0xf0, 0xb5, 0x67, 0x9d, 0x0a, 0xa3, 0x73, 0xcb, 0xce, - 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0xa5, 0xb2, 0x77, 0x2b, 0x92, 0x61, 0x20, 0x7f, 0x5a, 0xc9, - 0xe0, 0xd2, 0x6c, 0xfc, 0x2d, 0xd4, 0xb5, 0x7d, 0x55, 0xb1, 0x30, 0x2a, 0xab, 0x58, 0xa4, 0x37, - 0x96, 0x90, 0x40, 0x5f, 0xc0, 0xcd, 0x33, 0xd7, 0x3f, 0xb5, 0xdd, 0x83, 0xd4, 0x66, 0x22, 0xcb, - 0xd9, 0x8b, 0xf8, 0x04, 0xea, 0xbb, 0x8e, 0xc3, 0x6c, 0xa9, 0xa2, 0xca, 0x0a, 0x2e, 0x23, 0x84, - 0x42, 0x76, 0x08, 0x16, 0x2c, 0x44, 0xf6, 0xc4, 0x2c, 0x47, 0x1e, 0x79, 0x9b, 0x76, 0x49, 0xd8, - 0xce, 0x58, 0x61, 0xbb, 0x0f, 0xd5, 0x24, 0xa8, 0x5a, 0xfc, 0x37, 0xbe, 0x0f, 0xcb, 0x16, 0x19, - 0xf9, 0x17, 0x44, 0x77, 0x73, 0x15, 0x4a, 0x43, 0xcf, 0x21, 0xef, 0xd4, 0x5b, 0x10, 0x27, 0xf0, - 0xf7, 0x61, 0x49, 0x17, 0x65, 0x1e, 0xdc, 0x83, 0xba, 0xbe, 0x4f, 0x54, 0x8e, 0x29, 0x2e, 0xfe, - 0x04, 0x56, 0x2c, 0xd2, 0x0f, 0x48, 0x38, 0xd0, 0x71, 0xcf, 0xd9, 0xe7, 0xff, 0xe1, 0x66, 0x87, - 0x50, 0x4d, 0x7d, 0xb6, 0xf8, 0xd7, 0x70, 0xb7, 0x43, 0xe8, 0x61, 0x16, 0x02, 0x4a, 0x51, 0xaf, - 0x7d, 0x23, 0x55, 0xfb, 0x3f, 0x81, 0x0f, 0x3a, 0x84, 0x6f, 0x93, 0xa3, 0x9c, 0xb9, 0x6b, 0xc2, - 0x64, 0x21, 0x65, 0xf2, 0x33, 0xb8, 0x9d, 0x67, 0x92, 0x25, 0x4d, 0xc1, 0x60, 0x68, 0x30, 0x94, - 0xa1, 0xd4, 0x1a, 0x8d, 0xe9, 0xe5, 0xce, 0x9f, 0x17, 0xa1, 0x2c, 0xbf, 0x0d, 0xd1, 0x3e, 0xd4, - 0xba, 0x81, 0xdd, 0x3b, 0x17, 0xaf, 0x8c, 0xc8, 0x9c, 0x7a, 0x78, 0x94, 0x2e, 0x36, 0xd7, 0x32, - 0x56, 0xd8, 0x05, 0x7c, 0xee, 0x3b, 0x06, 0x7a, 0x0d, 0x8d, 0xf4, 0xe3, 0x19, 0xc2, 0x9a, 0x7c, - 0xce, 0xdb, 0x60, 0x73, 0x73, 0xa6, 0x0c, 0xb7, 0x8e, 0xf6, 0xa0, 0xa2, 0x1e, 0x97, 0x90, 0xfe, - 0xfd, 0x9f, 0x7a, 0x9c, 0x6a, 0x9a, 0x99, 0x6b, 0xc2, 0xc6, 0x2b, 0x3e, 0xb8, 0xf4, 0x57, 0x27, - 0xf4, 0x61, 0x72, 0xeb, 0x8c, 0xb7, 0xaa, 0xe6, 0xdd, 0x59, 0x22, 0xc2, 0x70, 0x17, 0xea, 0xc9, - 0xb7, 0x13, 0xa4, 0x87, 0x94, 0xf9, 0x36, 0xd3, 0xdc, 0x98, 0x21, 0x11, 0x59, 0x4d, 0xee, 0x87, - 0x36, 0x73, 0x5d, 0xc9, 0xb2, 0x9a, 0xf1, 0x9e, 0x82, 0xe7, 0xd0, 0xcf, 0x01, 0x4d, 0x3f, 0x08, - 0xa0, 0x8f, 0xae, 0xf3, 0x78, 0xd1, 0xc4, 0x57, 0x48, 0x89, 0x1d, 0x7e, 0x06, 0xcb, 0x53, 0x9f, - 0xb2, 0xe8, 0xff, 0x34, 0xd5, 0xbc, 0x27, 0x82, 0xe6, 0x87, 0xb3, 0x85, 0xa2, 0x00, 0xa6, 0xbf, - 0x28, 0x13, 0x01, 0xe4, 0x7e, 0xbb, 0x26, 0x02, 0xc8, 0xf9, 0x2c, 0x15, 0xb5, 0xa6, 0xbe, 0x64, - 0x12, 0xb5, 0x96, 0xfa, 0xe2, 0x49, 0xd4, 0x5a, 0xe2, 0xd3, 0x07, 0xcf, 0xa1, 0xc7, 0x50, 0x96, - 0x2c, 0xb4, 0x3e, 0x2d, 0xa6, 0x2c, 0xdc, 0xca, 0x5a, 0x12, 0x06, 0x4e, 0x60, 0x41, 0xbf, 0xf4, - 0xa1, 0x8d, 0xdc, 0x4f, 0x62, 0x61, 0x6a, 0xe6, 0x27, 0x73, 0x14, 0x14, 0xbf, 0xc0, 0xa4, 0x83, - 0xd2, 0xaf, 0x72, 0xe9, 0xa0, 0xe2, 0x1b, 0x0f, 0x9e, 0x43, 0x7d, 0xfe, 0x6c, 0x3b, 0x35, 0xbc, - 0xd1, 0xbd, 0xa4, 0x4e, 0xde, 0x45, 0xa7, 0xf9, 0xd1, 0x95, 0x72, 0x62, 0x9f, 0x16, 0x54, 0xa3, - 0x01, 0x8a, 0x6e, 0x6b, 0x4a, 0xe9, 0x71, 0xde, 0x5c, 0xcf, 0x5e, 0x8c, 0x30, 0x90, 0x43, 0x2c, - 0x81, 0x41, 0x72, 0x50, 0x26, 0x30, 0xd0, 0x67, 0x1e, 0x9e, 0x43, 0x4f, 0x01, 0xe2, 0x31, 0x84, - 0xee, 0x24, 0xa6, 0x76, 0x6a, 0x90, 0x35, 0x9b, 0x39, 0xab, 0x2a, 0xfb, 0x0b, 0xfa, 0x54, 0x4a, - 0xa0, 0x99, 0x31, 0xae, 0x9a, 0x0d, 0xfd, 0x69, 0x87, 0x75, 0x6b, 0x3c, 0x87, 0x9e, 0x40, 0x3d, - 0x39, 0xac, 0x12, 0xfd, 0x20, 0x73, 0x8e, 0x65, 0xda, 0x79, 0x0d, 0x66, 0xde, 0x14, 0x43, 0x0f, - 0x92, 0x16, 0x67, 0x8d, 0xba, 0x4c, 0xdb, 0x2e, 0xac, 0x65, 0xcf, 0x23, 0xb4, 0x95, 0xb4, 0x9c, - 0x3f, 0x05, 0x9b, 0xf7, 0xae, 0x21, 0xc9, 0xb3, 0xba, 0xf7, 0xe5, 0x5f, 0xde, 0x6f, 0x18, 0x7f, - 0x7f, 0xbf, 0x61, 0xfc, 0xf3, 0xfd, 0x86, 0xf1, 0xbb, 0x7f, 0x6d, 0xcc, 0x01, 0xee, 0x0d, 0xb6, - 0x7b, 0x24, 0xf0, 0xb6, 0x6d, 0x77, 0xd8, 0x23, 0xdb, 0xfe, 0xce, 0xb6, 0xb2, 0x14, 0x8c, 0x7b, - 0x21, 0x09, 0x2e, 0x48, 0xf0, 0xba, 0x30, 0x3e, 0x3d, 0xbd, 0xc1, 0xff, 0x18, 0xfc, 0xfc, 0xbf, - 0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x25, 0x1d, 0x58, 0x32, 0x1c, 0x00, 0x00, + // 2486 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x5d, 0x6f, 0x1b, 0x59, + 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x3a, 0xde, 0x36, 0xc9, 0x5e, 0x56, + 0xdd, 0xb4, 0xbb, 0xa4, 0xbb, 0xd9, 0x15, 0x94, 0x6a, 0x4b, 0xc9, 0x87, 0xeb, 0x06, 0x9a, 0x38, + 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0xe3, 0xd9, 0x8c, 0x67, 0xdc, 0xf9, 0x48, 0x9b, + 0x07, 0xde, 0x78, 0x43, 0x88, 0x07, 0x5e, 0x78, 0x45, 0x08, 0xf1, 0xc4, 0x3b, 0x3f, 0x81, 0x07, + 0x10, 0x20, 0xf1, 0x03, 0x50, 0x91, 0x78, 0xe2, 0x47, 0xa0, 0xfb, 0x35, 0x73, 0x67, 0x3c, 0xe3, + 0x78, 0x85, 0xf6, 0xcd, 0xe7, 0xdc, 0x73, 0xce, 0xbd, 0xe7, 0xfb, 0xcc, 0x31, 0xac, 0x8c, 0x5c, + 0xc7, 0x77, 0xbc, 0x7b, 0xce, 0x76, 0xd7, 0xb1, 0x7d, 0xd7, 0xb1, 0xb6, 0x18, 0x02, 0x95, 0x43, + 0x04, 0x5e, 0x81, 0xe5, 0xe6, 0x05, 0xb1, 0xfd, 0x57, 0x87, 0xc4, 0x73, 0xbc, 0x27, 0xc4, 0x70, + 0xfd, 0x53, 0x62, 0xf8, 0x78, 0x01, 0xe6, 0x4f, 0x7c, 0xc3, 0x0f, 0x3c, 0x9d, 0xbc, 0x0e, 0x88, + 0xe7, 0xe3, 0x53, 0xa8, 0x48, 0xc4, 0xc8, 0xba, 0x44, 0xcb, 0x50, 0xf0, 0x7c, 0xc3, 0x27, 0x75, + 0x6d, 0x43, 0xdb, 0x2c, 0xeb, 0x1c, 0x40, 0x0f, 0x61, 0xde, 0x63, 0x44, 0xcf, 0x46, 0x3d, 0xc3, + 0x27, 0x5e, 0x3d, 0xb7, 0x31, 0xbb, 0x59, 0xd9, 0xbe, 0xb1, 0x15, 0xbd, 0xe0, 0x44, 0x39, 0xd7, + 0xe3, 0xd4, 0xf8, 0xaf, 0x1a, 0xcc, 0xa9, 0xe7, 0xe8, 0x33, 0x28, 0x58, 0xe4, 0x82, 0x58, 0xec, + 0x96, 0xea, 0xf6, 0xad, 0x0c, 0x39, 0x5b, 0x4f, 0x29, 0x91, 0xce, 0x69, 0xd1, 0x01, 0x54, 0x87, + 0x31, 0x65, 0xea, 0xb9, 0x0d, 0x6d, 0xb3, 0xb2, 0xbd, 0xae, 0x70, 0xa7, 0xe9, 0xfc, 0x64, 0x46, + 0x4f, 0x30, 0xe2, 0xcf, 0xa1, 0xc0, 0x44, 0xa3, 0x32, 0x14, 0xf6, 0x9b, 0xbb, 0xcf, 0x5a, 0xb5, + 0x19, 0x54, 0x82, 0xfc, 0xc1, 0xd1, 0xe3, 0x76, 0x4d, 0x43, 0x15, 0x28, 0xbe, 0xd8, 0xd1, 0x8f, + 0x0e, 0x8e, 0x5a, 0xb5, 0x1c, 0xa5, 0x68, 0xea, 0x7a, 0x5b, 0xaf, 0xcd, 0xee, 0x16, 0xa1, 0xc0, + 0xe4, 0xe3, 0x55, 0xb8, 0xd1, 0x22, 0xfe, 0x63, 0xd7, 0x18, 0x92, 0x37, 0x8e, 0x7b, 0x7e, 0x60, + 0xf7, 0x1d, 0x69, 0xce, 0xdf, 0x69, 0x50, 0x7c, 0x4e, 0x5c, 0xcf, 0x74, 0x6c, 0x6a, 0xcb, 0xa1, + 0xf1, 0xa5, 0xe3, 0x32, 0x2d, 0x0b, 0x3a, 0x07, 0x18, 0xd6, 0xb4, 0x1d, 0x97, 0xbd, 0x9e, 0x62, + 0x29, 0x40, 0xb1, 0x23, 0xc3, 0xef, 0x0e, 0xea, 0xb3, 0x1c, 0xcb, 0x00, 0x8a, 0x3d, 0x0d, 0x4c, + 0xab, 0x57, 0xcf, 0x73, 0x6f, 0x30, 0x00, 0x6d, 0x40, 0x65, 0xe4, 0x3a, 0xbd, 0xa0, 0xeb, 0x1f, + 0x19, 0x43, 0x52, 0x2f, 0xb0, 0x33, 0x15, 0x85, 0xd6, 0x00, 0x2e, 0xf8, 0x23, 0x4e, 0x7c, 0xb7, + 0x7e, 0x8d, 0x11, 0x28, 0x18, 0xfc, 0xab, 0x1c, 0x5c, 0x1f, 0xd7, 0x80, 0xfa, 0x7f, 0x03, 0x2a, + 0xfd, 0x10, 0xdb, 0x13, 0x51, 0xa0, 0xa2, 0xd0, 0xc7, 0xb0, 0x48, 0xec, 0x0b, 0xd3, 0x75, 0xec, + 0x21, 0xb1, 0x7d, 0x6f, 0xcf, 0x09, 0x6c, 0x5f, 0xe8, 0x32, 0x7e, 0x40, 0x5f, 0xe2, 0x1b, 0xde, + 0xb9, 0x20, 0xe3, 0xca, 0x29, 0x98, 0x28, 0xde, 0xf2, 0x6a, 0xbc, 0xad, 0x01, 0x0c, 0x1c, 0x4f, + 0x0a, 0x2f, 0x70, 0xae, 0x08, 0x83, 0x30, 0xcc, 0x99, 0xb6, 0xe7, 0x1b, 0x76, 0x97, 0x30, 0x13, + 0x70, 0x0d, 0x63, 0x38, 0xf4, 0x31, 0x14, 0x85, 0xc6, 0xf5, 0x22, 0x8b, 0x13, 0xa4, 0xc4, 0x89, + 0x70, 0x91, 0x2e, 0x49, 0xf0, 0x1d, 0x58, 0xe8, 0x10, 0xc3, 0xed, 0x39, 0x6f, 0x6c, 0xe1, 0x4a, + 0xb4, 0x02, 0xd7, 0x5c, 0x62, 0x78, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, 0x42, 0x11, 0xe9, 0xc8, + 0xba, 0xc4, 0x75, 0x58, 0x69, 0x11, 0xbf, 0xa9, 0xe8, 0x2e, 0xa3, 0xe1, 0x2d, 0x2c, 0x8f, 0x9d, + 0x4c, 0x67, 0xe5, 0xef, 0xc2, 0x9c, 0x6a, 0x4c, 0x91, 0x70, 0x0d, 0x35, 0xd4, 0xa3, 0x63, 0xe6, + 0xbe, 0x18, 0x3d, 0xfe, 0x87, 0x06, 0x0b, 0x09, 0x0a, 0x54, 0x85, 0x9c, 0x29, 0x2f, 0xcb, 0x99, + 0x2c, 0x8e, 0xba, 0x2e, 0x31, 0x7c, 0xd2, 0x7b, 0x31, 0x20, 0x36, 0xf3, 0x61, 0x59, 0x57, 0x51, + 0x91, 0x77, 0x66, 0x55, 0xef, 0x6c, 0x41, 0x81, 0x79, 0xb0, 0x9e, 0x67, 0x8f, 0xaa, 0xab, 0xd9, + 0x3b, 0x70, 0x5c, 0xbf, 0x63, 0x78, 0x3c, 0xa2, 0x38, 0x19, 0x6a, 0x40, 0xc9, 0x75, 0x1c, 0x5f, + 0x77, 0x2c, 0x19, 0xac, 0x21, 0x8c, 0xee, 0x42, 0xad, 0x1b, 0xb8, 0x2e, 0xb1, 0x7d, 0x3d, 0xb0, + 0x8f, 0x82, 0xe1, 0x29, 0xe1, 0xf1, 0x3a, 0xaf, 0x8f, 0xe1, 0xf1, 0x3f, 0x35, 0xb8, 0x7e, 0x44, + 0xde, 0x28, 0x6a, 0x49, 0x57, 0xdd, 0x85, 0x1a, 0xb5, 0x5b, 0xdf, 0x72, 0xde, 0x74, 0xc8, 0x70, + 0x64, 0x45, 0x05, 0x6c, 0x0c, 0x8f, 0x8e, 0x01, 0x46, 0xae, 0x33, 0x22, 0xae, 0x6f, 0x86, 0x85, + 0xec, 0x13, 0x45, 0x85, 0xd4, 0x1b, 0xb6, 0x8e, 0x43, 0x96, 0xa6, 0xed, 0xbb, 0x97, 0xba, 0x22, + 0xa3, 0xf1, 0x10, 0x16, 0x12, 0xc7, 0xa8, 0x06, 0xb3, 0xe7, 0xe4, 0x52, 0xbc, 0x81, 0xfe, 0xa4, + 0xa6, 0xbc, 0x30, 0xac, 0x80, 0x08, 0x33, 0x73, 0xe0, 0x41, 0xee, 0xbe, 0x86, 0x4f, 0x60, 0x29, + 0x79, 0x27, 0x8d, 0x91, 0x2f, 0xa0, 0xa2, 0x78, 0x94, 0x89, 0x9a, 0x1c, 0x00, 0x2a, 0x39, 0xfe, + 0x90, 0x25, 0x78, 0x8a, 0xa9, 0x12, 0x41, 0x80, 0x7f, 0xae, 0xc1, 0x52, 0x92, 0xf2, 0xff, 0xbe, + 0x1e, 0xdd, 0x83, 0x92, 0x34, 0xbc, 0xa8, 0xd2, 0x4b, 0x0a, 0x2b, 0xf5, 0x3c, 0xe3, 0x09, 0x89, + 0xf0, 0xdf, 0x34, 0x58, 0xdd, 0xe3, 0xc7, 0x57, 0x3f, 0x1a, 0x3d, 0x82, 0xbc, 0x7f, 0x39, 0xe2, + 0xb6, 0xac, 0x6e, 0x7f, 0xa4, 0x88, 0xce, 0x94, 0xb1, 0xd5, 0x1e, 0x51, 0x16, 0x9d, 0x31, 0x62, + 0x03, 0xae, 0x71, 0x98, 0x96, 0xfd, 0xa3, 0x76, 0xfb, 0xb8, 0x36, 0x83, 0x10, 0x54, 0x4f, 0x3a, + 0x3b, 0x7a, 0xe7, 0xd5, 0xce, 0x5e, 0xe7, 0xe0, 0xf9, 0x41, 0xe7, 0xc7, 0x35, 0x0d, 0x2d, 0xc2, + 0xfc, 0x49, 0xa7, 0x7d, 0x1c, 0xa1, 0x72, 0x68, 0x1e, 0xca, 0x7b, 0xed, 0xa3, 0xc7, 0x07, 0xad, + 0x67, 0x7a, 0xb3, 0x36, 0x4b, 0xfb, 0x83, 0xde, 0x3c, 0x69, 0x76, 0x6a, 0x79, 0x34, 0x07, 0xa5, + 0x56, 0xfb, 0x15, 0xef, 0x16, 0x05, 0x7c, 0x0e, 0x37, 0xd2, 0x1e, 0x43, 0x6d, 0x9b, 0x54, 0x27, + 0x4c, 0xb3, 0x9c, 0x9a, 0x66, 0x69, 0xa9, 0x31, 0x9b, 0x91, 0x1a, 0xbf, 0xd6, 0xa0, 0x7e, 0xe8, + 0xf4, 0xcc, 0xfe, 0xe5, 0x54, 0xd6, 0x03, 0x1a, 0xad, 0x86, 0x6f, 0x3a, 0xb6, 0xcc, 0x80, 0xf5, + 0x74, 0xcf, 0xb6, 0x25, 0x9d, 0xae, 0xb0, 0xa0, 0xdb, 0x50, 0x75, 0x49, 0xd7, 0xb1, 0xfb, 0xe6, + 0x59, 0xe0, 0x92, 0x1d, 0xcb, 0x62, 0xef, 0x2a, 0xe9, 0x09, 0x2c, 0xfe, 0xad, 0x06, 0xcb, 0x69, + 0xc2, 0xd0, 0x03, 0xe1, 0x3f, 0xde, 0xfe, 0x6f, 0x5f, 0x71, 0x77, 0xcc, 0x75, 0xbc, 0x9a, 0x58, + 0xbc, 0xee, 0xe7, 0x64, 0x35, 0xe1, 0x30, 0xfe, 0x34, 0xc5, 0xad, 0x0b, 0x50, 0xd1, 0x9b, 0x87, + 0xed, 0xe7, 0xcd, 0x57, 0x7a, 0xfb, 0x29, 0xf5, 0xd8, 0x1c, 0x94, 0x76, 0xf6, 0xf7, 0x39, 0x94, + 0xc7, 0xbf, 0xd0, 0x60, 0x25, 0xc5, 0x72, 0xd4, 0x4d, 0x3f, 0x80, 0x5a, 0xdf, 0x30, 0x2d, 0xd2, + 0x6b, 0x47, 0xd6, 0xd2, 0xa6, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x6e, 0xdc, 0xe7, 0x6a, 0x69, + 0xc5, 0x07, 0xb0, 0xba, 0x4f, 0x3c, 0xdf, 0x75, 0xa6, 0xf1, 0xe3, 0x4d, 0x28, 0x9f, 0x13, 0x32, + 0xea, 0xb0, 0x5a, 0x9c, 0x63, 0x1e, 0x88, 0x10, 0x98, 0xc0, 0x8d, 0x34, 0x51, 0x54, 0xb1, 0xef, + 0xc3, 0x62, 0xd7, 0x22, 0x86, 0x1d, 0x70, 0x52, 0x86, 0x14, 0x19, 0x7e, 0x53, 0xcd, 0xa5, 0x24, + 0x8d, 0x3e, 0xce, 0x86, 0xff, 0xa2, 0xc1, 0xfa, 0x49, 0xac, 0x7e, 0x44, 0xb5, 0x30, 0xeb, 0xe1, + 0x2f, 0x53, 0x4a, 0xf0, 0x03, 0xb5, 0x8b, 0x4c, 0x96, 0xf7, 0x75, 0x16, 0xe3, 0x75, 0xb8, 0x95, + 0x7d, 0x3b, 0xd5, 0xd7, 0x83, 0xf5, 0xd6, 0x57, 0x54, 0xb7, 0x0e, 0xc5, 0xd7, 0x01, 0x71, 0xa5, + 0xae, 0x65, 0x5d, 0x82, 0x34, 0x91, 0xc8, 0xdb, 0xae, 0x15, 0xf4, 0x48, 0xcb, 0x72, 0x4e, 0x0d, + 0xcb, 0x93, 0x89, 0x14, 0xc7, 0xe2, 0x3f, 0x69, 0x70, 0xab, 0x35, 0xe9, 0x59, 0xe8, 0x47, 0x31, + 0x93, 0xf2, 0x28, 0xbd, 0xaf, 0x98, 0x74, 0x22, 0xf7, 0xd7, 0x69, 0xd0, 0xff, 0x68, 0x30, 0x1f, + 0x9b, 0x0a, 0x10, 0x82, 0xbc, 0x4d, 0x93, 0x97, 0xb3, 0xb3, 0xdf, 0x74, 0xd6, 0xb2, 0x9c, 0xee, + 0x39, 0xe9, 0x89, 0x38, 0x16, 0x10, 0xc5, 0xd3, 0x19, 0xe2, 0xa0, 0x27, 0xd2, 0x44, 0x40, 0x14, + 0xcf, 0x3f, 0x31, 0xc4, 0xdc, 0x28, 0xa0, 0x28, 0xab, 0x0a, 0x6a, 0x25, 0xbd, 0x09, 0xe5, 0xae, + 0x65, 0x78, 0x9e, 0x32, 0x2b, 0x46, 0x08, 0xd4, 0x84, 0x6a, 0x8f, 0x8c, 0x2c, 0xe7, 0x52, 0xb6, + 0x32, 0x31, 0x2f, 0xaa, 0x5f, 0x25, 0xf4, 0xf1, 0xfb, 0x31, 0x22, 0x3d, 0xc1, 0x44, 0x1b, 0x29, + 0x1a, 0x27, 0xa3, 0xe5, 0x8a, 0x0e, 0xae, 0x8a, 0xc6, 0x21, 0x4c, 0x03, 0xc3, 0x38, 0xa3, 0x84, + 0xb2, 0x30, 0x48, 0x90, 0x9e, 0x38, 0xfd, 0x3e, 0x71, 0x43, 0xc5, 0x25, 0x48, 0x47, 0x63, 0xf2, + 0x96, 0x74, 0x03, 0xdf, 0xa1, 0x87, 0x5c, 0x7b, 0x05, 0x83, 0x17, 0x61, 0xa1, 0x45, 0x7c, 0x91, + 0xa0, 0x7c, 0x0a, 0x7d, 0x04, 0xf3, 0x11, 0x8a, 0x06, 0x4b, 0x38, 0xc0, 0x69, 0x53, 0x0d, 0x70, + 0x78, 0x13, 0xaa, 0x42, 0x80, 0x32, 0x1b, 0x0b, 0xbf, 0x68, 0xaa, 0x5f, 0xf0, 0xb7, 0x61, 0x2e, + 0xa4, 0xa4, 0x37, 0x7d, 0x08, 0x79, 0x7a, 0x22, 0x8a, 0xcb, 0x52, 0xc2, 0xa2, 0xec, 0x0e, 0x46, + 0x80, 0x9b, 0x30, 0x4f, 0x31, 0x7b, 0xd4, 0x2b, 0x99, 0x51, 0x42, 0x07, 0x56, 0xce, 0x7e, 0xe8, + 0xf4, 0x48, 0x38, 0xb0, 0x46, 0x28, 0xfc, 0x33, 0xa8, 0xec, 0x39, 0xc3, 0xa1, 0x61, 0xf7, 0x98, + 0x90, 0x1a, 0xcc, 0x12, 0xfb, 0x82, 0xa9, 0x59, 0xd6, 0xe9, 0x4f, 0x16, 0x20, 0x03, 0x62, 0x59, + 0x22, 0xce, 0x38, 0x10, 0x85, 0xef, 0xac, 0x12, 0xbe, 0x34, 0x6c, 0x0c, 0xf7, 0x2c, 0xe0, 0x03, + 0x78, 0x9e, 0xc9, 0x88, 0x10, 0xf4, 0x81, 0x81, 0x47, 0x5c, 0x11, 0x69, 0xec, 0x37, 0x3e, 0x84, + 0xca, 0xde, 0xc0, 0xb0, 0x6d, 0x62, 0x65, 0xea, 0x80, 0x94, 0xd1, 0xa5, 0x2c, 0x5a, 0x1a, 0xb3, + 0xa6, 0x7b, 0x46, 0xfc, 0x28, 0xca, 0x29, 0x84, 0xff, 0x9b, 0x83, 0x52, 0x98, 0x36, 0xdf, 0x82, + 0xb2, 0x47, 0x9d, 0xc3, 0x22, 0x94, 0xdb, 0x33, 0xdb, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x4a, 0xab, + 0x8a, 0x59, 0xac, 0x9e, 0xf0, 0x43, 0x68, 0x75, 0x3d, 0x22, 0x45, 0xdf, 0x83, 0x05, 0xd3, 0x3e, + 0x75, 0x02, 0xbb, 0x27, 0x54, 0xa2, 0xc5, 0x89, 0x86, 0xcb, 0x8a, 0xda, 0x22, 0x22, 0x6d, 0xf5, + 0x24, 0x39, 0xda, 0x85, 0x9a, 0x13, 0xf8, 0x71, 0x11, 0xf9, 0x89, 0x22, 0xc6, 0xe8, 0xd1, 0x7d, + 0xea, 0xf2, 0xd0, 0xa1, 0xcc, 0xd8, 0x09, 0xf6, 0xe8, 0x54, 0x57, 0x49, 0x69, 0xe2, 0xd1, 0xc8, + 0x3a, 0x36, 0xfc, 0x81, 0xc8, 0xf9, 0x10, 0xa6, 0xfe, 0x26, 0xf6, 0xc5, 0x41, 0x8f, 0x65, 0x7a, + 0x59, 0xe7, 0x00, 0xbe, 0x07, 0x4b, 0xf1, 0x96, 0xc7, 0x63, 0xbd, 0x0e, 0x45, 0x1e, 0xdd, 0x9e, + 0x08, 0x24, 0x09, 0xe2, 0x5f, 0x6a, 0xb0, 0x38, 0xd6, 0x24, 0xd1, 0x03, 0xa8, 0x9c, 0x9b, 0x96, + 0x45, 0x7a, 0x9d, 0xa9, 0x72, 0x4c, 0x25, 0x46, 0x5f, 0xc0, 0x9c, 0x1b, 0xd8, 0xb6, 0x69, 0x9f, + 0xc9, 0xae, 0x3e, 0x99, 0x39, 0x46, 0x8d, 0xf7, 0x58, 0xee, 0xd3, 0xe9, 0x3a, 0x7c, 0x7c, 0xa8, + 0xa9, 0xa6, 0x68, 0x4a, 0x6d, 0x33, 0x32, 0xfc, 0xc1, 0xc9, 0x88, 0x74, 0xe5, 0x0c, 0x25, 0x61, + 0xfc, 0x47, 0x0d, 0x4a, 0x72, 0x40, 0xcf, 0xaa, 0xd5, 0xa2, 0xf6, 0xe6, 0xd2, 0x6b, 0x6f, 0xec, + 0x63, 0xb1, 0x01, 0xa5, 0x7e, 0x60, 0x59, 0xcc, 0x0d, 0xbc, 0x5a, 0x85, 0xb0, 0x6a, 0xd9, 0x42, + 0xcc, 0xb2, 0xe8, 0x0e, 0x14, 0xe8, 0x50, 0xe7, 0xd5, 0xaf, 0x31, 0x03, 0xa4, 0x7e, 0x3c, 0x70, + 0x0a, 0xfc, 0x80, 0x55, 0x37, 0xa1, 0x34, 0xb5, 0x7f, 0xc8, 0xab, 0x5d, 0xc9, 0xfb, 0x7b, 0x0d, + 0xde, 0x6b, 0x11, 0xff, 0x45, 0xe2, 0x1b, 0x31, 0xb4, 0xde, 0x06, 0x54, 0x5c, 0x32, 0x72, 0x8e, + 0x0d, 0xdf, 0x27, 0xae, 0xdc, 0x03, 0xa8, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0xb9, 0x30, 0x3d, 0xd3, + 0xb1, 0x25, 0x15, 0xb7, 0x4a, 0x12, 0x4d, 0x65, 0x19, 0x96, 0xb5, 0xeb, 0x1a, 0x76, 0x77, 0x40, + 0x64, 0xa3, 0x57, 0x51, 0xac, 0x1d, 0x58, 0x56, 0xc7, 0x38, 0xe3, 0x5d, 0xad, 0xa4, 0x4b, 0x10, + 0x9f, 0xc2, 0x72, 0xf2, 0x8d, 0xd2, 0x3d, 0xf4, 0x31, 0xd2, 0x3d, 0xf4, 0x37, 0x8b, 0x7b, 0xf9, + 0x0d, 0x2c, 0x7c, 0x2b, 0x61, 0x36, 0x3b, 0x8b, 0x67, 0x09, 0x2f, 0x85, 0x30, 0xfe, 0x12, 0x56, + 0xd3, 0x4d, 0x41, 0x6d, 0x7a, 0x08, 0x8b, 0xc9, 0x0f, 0xe9, 0xb4, 0x59, 0x38, 0xed, 0x91, 0xfa, + 0x38, 0x27, 0x46, 0x50, 0x7b, 0x6a, 0x7a, 0x74, 0x1a, 0x75, 0x94, 0x45, 0x64, 0x89, 0xc2, 0x99, + 0x61, 0x57, 0x87, 0x62, 0x8f, 0xf4, 0x8d, 0xc0, 0xf2, 0x45, 0xed, 0x96, 0x20, 0xf5, 0x81, 0xf8, + 0xa9, 0xc7, 0x95, 0x4b, 0xa2, 0xf1, 0x6b, 0xa8, 0x2a, 0xf7, 0xca, 0x60, 0xa1, 0x50, 0x5a, 0xb0, + 0x88, 0xd7, 0xe8, 0x9c, 0x02, 0x7d, 0x0e, 0xd7, 0xcf, 0xd8, 0x3c, 0xb6, 0x9f, 0xb8, 0x8c, 0x5b, + 0x39, 0xfd, 0x10, 0x1f, 0x41, 0x75, 0xa7, 0xd7, 0xa3, 0xb2, 0x64, 0x50, 0xa5, 0x29, 0x97, 0xa2, + 0x42, 0x2e, 0x5d, 0x05, 0x1d, 0xe6, 0x42, 0x79, 0xbc, 0x97, 0x23, 0x9b, 0xbc, 0x49, 0x3e, 0x89, + 0xcb, 0x4e, 0x39, 0xa1, 0xb7, 0x9b, 0xb2, 0x13, 0x94, 0x75, 0xf6, 0x1b, 0xdf, 0x81, 0x45, 0x9d, + 0x0c, 0x9d, 0x0b, 0xa2, 0x3e, 0x73, 0x19, 0x0a, 0xa6, 0xdd, 0x23, 0x6f, 0xe5, 0xf6, 0x92, 0x01, + 0xf8, 0x3b, 0xb0, 0xa0, 0x92, 0xd2, 0x17, 0xdc, 0x86, 0xaa, 0x7a, 0x4f, 0x18, 0x8e, 0x09, 0x2c, + 0xfe, 0x08, 0x96, 0x74, 0xd2, 0x77, 0x89, 0x37, 0x50, 0xfd, 0x9e, 0x71, 0xcf, 0x37, 0xe1, 0xfa, + 0x09, 0xf1, 0x15, 0xf6, 0xc9, 0xe4, 0x0f, 0xd9, 0x47, 0x48, 0x2b, 0xcd, 0x03, 0x92, 0x51, 0x8d, + 0x7d, 0x2d, 0x11, 0xfb, 0x3f, 0x64, 0x53, 0x3f, 0xbd, 0x26, 0x83, 0x39, 0xf5, 0xd6, 0x98, 0xc8, + 0x5c, 0x42, 0xe4, 0xa7, 0xf0, 0x5e, 0x96, 0x48, 0x6a, 0x34, 0xe9, 0x06, 0x4d, 0x71, 0x43, 0x11, + 0x0a, 0xcd, 0xe1, 0xc8, 0xbf, 0xdc, 0xfe, 0xc3, 0x02, 0x14, 0xc5, 0xee, 0x00, 0xed, 0x41, 0xa5, + 0xe3, 0x1a, 0xdd, 0x73, 0xbe, 0x17, 0x47, 0xf5, 0xb1, 0x55, 0xb9, 0x78, 0x62, 0x63, 0x25, 0xe5, + 0x84, 0x7e, 0xb0, 0xcc, 0x7c, 0xa2, 0xa1, 0x97, 0x50, 0x4b, 0xae, 0x7b, 0x11, 0x8e, 0x7f, 0x1d, + 0xa4, 0x6d, 0xb3, 0x1b, 0x1b, 0x13, 0x69, 0x98, 0x74, 0xb4, 0x0b, 0x25, 0xb9, 0x0e, 0x45, 0xea, + 0x7e, 0x28, 0xb1, 0x4e, 0x6d, 0xd4, 0x53, 0xcf, 0xb8, 0x8c, 0x17, 0xac, 0x71, 0xa9, 0x7b, 0x52, + 0xf4, 0x7e, 0xe6, 0xc7, 0x4b, 0xa8, 0xf1, 0xfa, 0x24, 0x12, 0x2e, 0xb8, 0x03, 0xd5, 0xf8, 0x6e, + 0x0d, 0x6d, 0x5c, 0xb5, 0xea, 0x6b, 0xac, 0x4d, 0xa0, 0x08, 0xa5, 0xc6, 0xef, 0x43, 0x1b, 0x99, + 0x4f, 0x49, 0x93, 0x9a, 0xb2, 0x6f, 0xc3, 0x33, 0xe8, 0xa7, 0x80, 0xc6, 0x17, 0x46, 0xe8, 0x83, + 0x69, 0x96, 0x5b, 0x0d, 0x7c, 0x05, 0x15, 0xbf, 0xe1, 0x27, 0xb0, 0x38, 0xb6, 0xea, 0x40, 0xdf, + 0x50, 0x58, 0xb3, 0x56, 0x48, 0x8d, 0xf7, 0x27, 0x13, 0x85, 0x0a, 0x8c, 0x6f, 0x1c, 0x62, 0x0a, + 0x64, 0xee, 0x36, 0x62, 0x0a, 0x64, 0xac, 0x2d, 0xf0, 0x0c, 0x72, 0xa1, 0x9e, 0xf5, 0x75, 0x8e, + 0xee, 0x4e, 0xbf, 0x40, 0x68, 0x6c, 0x4e, 0x45, 0x1b, 0xde, 0xd9, 0x9a, 0xe6, 0xce, 0xd6, 0x57, + 0xb8, 0xb3, 0x75, 0xc5, 0x9d, 0xbb, 0x50, 0x92, 0x5f, 0x6c, 0xb1, 0x9c, 0x4a, 0x7c, 0xd9, 0xc5, + 0x72, 0x2a, 0xf6, 0x89, 0x87, 0x67, 0xd0, 0x23, 0x28, 0x0a, 0x14, 0x5a, 0x1d, 0x27, 0x93, 0x12, + 0x6e, 0xa4, 0x1d, 0x71, 0x01, 0x47, 0x30, 0xa7, 0x0e, 0xb7, 0x68, 0x2d, 0x73, 0x35, 0xc4, 0x45, + 0x4d, 0x5c, 0x1d, 0x85, 0x4a, 0xb1, 0x41, 0x2d, 0xa9, 0x94, 0x3a, 0xb2, 0x26, 0x95, 0x8a, 0x26, + 0x3b, 0x3c, 0x83, 0xfa, 0xec, 0x0f, 0x95, 0xb1, 0x21, 0x05, 0xdd, 0x8e, 0xf3, 0x64, 0x0d, 0x74, + 0x8d, 0x0f, 0xae, 0xa4, 0xe3, 0xf7, 0x34, 0xa1, 0x1c, 0x0e, 0x0a, 0xe8, 0x3d, 0x85, 0x29, 0x39, + 0xb6, 0x34, 0x56, 0xd3, 0x0f, 0x43, 0x1f, 0x88, 0x66, 0x1d, 0xf3, 0x41, 0x7c, 0x20, 0x88, 0xf9, + 0x40, 0xed, 0xed, 0x78, 0x06, 0x3d, 0x01, 0x88, 0xda, 0x2d, 0xba, 0x19, 0x9b, 0x4e, 0x12, 0x0d, + 0xbb, 0xd1, 0xc8, 0x38, 0x95, 0xd6, 0x9f, 0x53, 0xbb, 0x6f, 0xcc, 0x9b, 0x29, 0x6d, 0xb9, 0x51, + 0x53, 0x57, 0x9c, 0xb4, 0x2b, 0xe1, 0x19, 0xf4, 0x18, 0xaa, 0xf1, 0xa6, 0x1c, 0xab, 0x7b, 0xa9, + 0xfd, 0x3a, 0x55, 0xce, 0x4b, 0x96, 0xc6, 0xa9, 0xdd, 0x3a, 0x99, 0xc6, 0x93, 0x5a, 0x7a, 0xaa, + 0x6c, 0x0b, 0x56, 0xd2, 0xfb, 0x2e, 0x4a, 0x24, 0x7d, 0x76, 0xb7, 0x6f, 0xdc, 0x9e, 0x82, 0x92, + 0x59, 0x75, 0xf7, 0xfe, 0x9f, 0xdf, 0xad, 0x69, 0x7f, 0x7f, 0xb7, 0xa6, 0xfd, 0xeb, 0xdd, 0x9a, + 0xf6, 0x9b, 0x7f, 0xaf, 0xcd, 0x00, 0xee, 0x0e, 0xb6, 0xba, 0xc4, 0xb5, 0xb7, 0x0c, 0xcb, 0xec, + 0x92, 0x2d, 0x67, 0x7b, 0x4b, 0x4a, 0x72, 0x47, 0x5d, 0x8f, 0xb8, 0x17, 0xc4, 0x7d, 0x99, 0x1b, + 0x9d, 0x9e, 0x5e, 0x63, 0x7f, 0xd9, 0x7f, 0xf6, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1e, 0xeb, + 0xf5, 0xb9, 0xcc, 0x1f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3469,6 +3662,8 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) + GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -3595,6 +3790,24 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } +func (c *controlClient) SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) { + out := new(SetEnvironmentPropertiesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetEnvironmentProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) { + out := new(GetEnvironmentPropertiesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironmentProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -3714,6 +3927,8 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + SetEnvironmentProperties(context.Context, *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) + GetEnvironmentProperties(context.Context, *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -3728,6 +3943,80 @@ type ControlServer interface { SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) SetEnvironmentProperties(ctx context.Context, req *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetEnvironmentProperties not implemented") +} +func (*UnimplementedControlServer) GetEnvironmentProperties(ctx context.Context, req *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironmentProperties not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3897,53 +4186,89 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) +func _Control_SetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetEnvironmentPropertiesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) + return srv.(ControlServer).SetEnvironmentProperties(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTasks", + FullMethod: "/o2control.Control/SetEnvironmentProperties", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + return srv.(ControlServer).SetEnvironmentProperties(ctx, req.(*SetEnvironmentPropertiesRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) +func _Control_GetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentPropertiesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) + return srv.(ControlServer).GetEnvironmentProperties(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTask", + FullMethod: "/o2control.Control/GetEnvironmentProperties", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + return srv.(ControlServer).GetEnvironmentProperties(ctx, req.(*GetEnvironmentPropertiesRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) + return srv.(ControlServer).GetTasks(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", + FullMethod: "/o2control.Control/GetTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) @@ -4149,6 +4474,14 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, + { + MethodName: "SetEnvironmentProperties", + Handler: _Control_SetEnvironmentProperties_Handler, + }, + { + MethodName: "GetEnvironmentProperties", + Handler: _Control_GetEnvironmentProperties_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -4211,7 +4544,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4219,20 +4552,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4240,20 +4579,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4261,38 +4606,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4300,46 +4654,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err := m.Event.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4347,20 +4716,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4368,53 +4743,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4422,63 +4806,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err := m.Version.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 } - return i, nil + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4486,26 +4881,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4513,20 +4915,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4534,20 +4942,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4555,38 +4969,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4594,61 +5017,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4656,26 +5091,52 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4683,30 +5144,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err := m.Environment.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4714,26 +5183,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4741,40 +5217,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err := m.Environment.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err := m.Workflow.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4782,31 +5268,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4814,37 +5307,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4852,48 +5353,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4901,31 +5411,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4933,44 +5450,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4978,36 +5505,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5015,898 +5549,1239 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) - } - if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) - } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 } - i += n8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) - } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) - } - if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) - } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ExcludeGlobals { + i-- + if m.ExcludeGlobals { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Queries) > 0 { + for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Queries[iNdEx]) + copy(dAtA[i:], m.Queries[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { +func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { +func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err := m.Task.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n9 - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 + } + if len(m.OfferId) > 0 { + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } - if m.Shell { - dAtA[i] = 0x10 - i++ - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) - } - if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err := m.ShortInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n10 - } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err := m.ClassInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n11 - } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if m.Task != nil { + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n - } - } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err := m.CommandInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ControlMode) > 0 { + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { +func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } - if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } + if m.Shell { + i-- + if m.Shell { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { +func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.PathSpec) > 0 { + if len(m.Target) > 0 { + i -= len(m.Target) + copy(dAtA[i:], m.Target) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i-- + dAtA[i] = 0x1a + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { +func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 } - if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ + if len(m.OutboundChannels) > 0 { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + i-- + dAtA[i] = 0x22 } } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { +func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Roles) > 0 { - for _, msg := range m.Roles { + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { +func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.RepoPattern) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i += copy(dAtA[i:], m.RepoPattern) - } - if len(m.RevisionPattern) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i += copy(dAtA[i:], m.RevisionPattern) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllBranches { - dAtA[i] = 0x18 - i++ - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.RunningTasks) > 0 { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - i++ } - if m.AllTags { - dAtA[i] = 0x20 - i++ - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - i++ - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { +func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Template) > 0 { + if len(m.PathSpec) > 0 { + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) - } - if len(m.Revision) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { +func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x32 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.FullPath) > 0 { + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i-- + dAtA[i] = 0x22 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { +func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { +func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Default { - dAtA[i] = 0x10 - i++ - if m.Default { + if m.AllTags { + i-- + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if len(m.DefaultRevision) > 0 { + if m.AllBranches { + i-- + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 + } + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i += copy(dAtA[i:], m.DefaultRevision) } + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 + } + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.WorkflowTemplates) > 0 { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *RepoInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x1a } - return i, nil + if m.Default { + i-- + if m.Default { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5914,38 +6789,47 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.GlobalDefaultRevision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.GlobalDefaultRevision) + copy(dAtA[i:], m.GlobalDefaultRevision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i += copy(dAtA[i:], m.GlobalDefaultRevision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repos) > 0 { + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5953,32 +6837,40 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.DefaultRevision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i += copy(dAtA[i:], m.DefaultRevision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5986,32 +6878,40 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.NewDefaultRevision) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i += copy(dAtA[i:], m.NewDefaultRevision) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Info) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Info) + copy(dAtA[i:], m.Info) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i += copy(dAtA[i:], m.Info) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.NewDefaultRevision) > 0 { + i -= len(m.NewDefaultRevision) + copy(dAtA[i:], m.NewDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6019,25 +6919,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6045,26 +6951,33 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6072,25 +6985,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6098,25 +7017,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6124,26 +7049,33 @@ func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { } func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Revision) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6151,31 +7083,38 @@ func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { } func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Index != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Revision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6183,26 +7122,33 @@ func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { } func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Info) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Info) + copy(dAtA[i:], m.Info) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i += copy(dAtA[i:], m.Info) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6210,24 +7156,32 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { } func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -6496,6 +7450,14 @@ func (m *NewEnvironmentRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -6701,6 +7663,87 @@ func (m *DestroyEnvironmentReply) Size() (n int) { return n } +func (m *SetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Queries) > 0 { + for _, s := range m.Queries { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ExcludeGlobals { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ShortTaskInfo) Size() (n int) { if m == nil { return 0 @@ -7363,14 +8406,7 @@ func (m *Empty) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -7573,8 +8609,620 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) + if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusUpdate) 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 ErrIntOverflowO2Control + } + 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: StatusUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= StatusUpdate_Level(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Event_MesosHeartbeat{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &StatusUpdate_MesosHeartbeat{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control + } + 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: GetFrameworkInfoRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Version) 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 ErrIntOverflowO2Control + } + 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: Version: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) + } + m.Major = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Major |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) + } + m.Minor = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Minor |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + } + m.Patch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Patch |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Build = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProductName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VersionStr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control + } + 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: GetFrameworkInfoReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FrameworkId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) + } + m.EnvironmentsCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EnvironmentsCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) + } + m.TasksCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TasksCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) + } + m.HostsCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostsCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstanceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Version == nil { + m.Version = &Version{} + } + if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -7603,7 +9251,7 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *StatusUpdate) Unmarshal(dAtA []byte) error { +func (m *TeardownRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7626,36 +9274,17 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: TeardownRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -7665,26 +9294,23 @@ func (m *StatusUpdate) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} + m.Reason = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -7711,7 +9337,7 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { +func (m *TeardownReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7734,10 +9360,10 @@ func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TeardownReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -7765,7 +9391,7 @@ func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *Version) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7788,104 +9414,69 @@ func (m *Version) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Version: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control + } + 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: GetEnvironmentsReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7913,13 +9504,13 @@ func (m *Version) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ProductName = string(dAtA[iNdEx:postIndex]) + m.FrameworkId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -7929,23 +9520,25 @@ func (m *Version) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.VersionStr = string(dAtA[iNdEx:postIndex]) + m.Environments = append(m.Environments, &EnvironmentInfo{}) + if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -7972,7 +9565,7 @@ func (m *Version) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { +func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7995,15 +9588,15 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetFrameworkInfoReply: wiretype end group for non-group") + return fmt.Errorf("proto: EnvironmentInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvironmentInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8031,13 +9624,13 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.FrameworkId = 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 EnvironmentsCount", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) } - m.EnvironmentsCount = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8047,31 +9640,25 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF } - case 4: + m.CreatedWhen = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -8103,11 +9690,11 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) } - m.HostsCount = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8117,14 +9704,29 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 6: + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tasks = append(m.Tasks, &ShortTaskInfo{}) + if err := m.Tasks[len(m.Tasks)-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 InstanceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RootRole", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8152,13 +9754,13 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.InstanceName = string(dAtA[iNdEx:postIndex]) + m.RootRole = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var msglen int + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8168,28 +9770,11 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8215,7 +9800,7 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *TeardownRequest) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8238,15 +9823,15 @@ func (m *TeardownRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TeardownRequest: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8274,116 +9859,135 @@ func (m *TeardownRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Reason = string(dAtA[iNdEx:postIndex]) + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if skippy < 0 { + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + if m.Properties == nil { + m.Properties = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + m.Properties[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8409,7 +10013,7 @@ func (m *GetEnvironmentsRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8432,47 +10036,15 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentReply: wiretype end group for non-group") } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: + if fieldNum <= 0 { + return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8499,8 +10071,10 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8529,7 +10103,7 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8552,10 +10126,10 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvironmentInfo: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -8590,73 +10164,63 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: + 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: GetEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8683,16 +10247,18 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RootRole", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8702,43 +10268,28 @@ func (m *EnvironmentInfo) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + if m.Workflow == nil { + m.Workflow = &RoleInfo{} } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8764,7 +10315,7 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8787,15 +10338,15 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8823,67 +10374,13 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - var msglen int + m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8893,28 +10390,11 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + if b < 0x80 { + break + } } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8940,7 +10420,7 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8963,10 +10443,10 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9001,6 +10481,57 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + } + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9026,7 +10557,7 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9049,17 +10580,17 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: ModifyEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ModifyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9069,31 +10600,27 @@ func (m *GetEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9120,13 +10647,31 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Operations = append(m.Operations, &EnvironmentOperation{}) + if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ReconfigureAll = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9152,7 +10697,7 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9175,17 +10720,17 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: EnvironmentOperation: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvironmentOperation: 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) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - var stringLen uint64 + m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9195,29 +10740,16 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) } - m.Type = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9227,11 +10759,24 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RoleName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9257,7 +10802,7 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9280,17 +10825,17 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: ModifyEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ModifyEnvironmentReply: 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 FailedOperations", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9300,27 +10845,29 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) + if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -9348,13 +10895,13 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - m.CurrentRunNumber = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9364,11 +10911,24 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9394,7 +10954,7 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9417,10 +10977,10 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: DestroyEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DestroyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9456,42 +11016,8 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -9508,7 +11034,7 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { break } } - m.ReconfigureAll = bool(v != 0) + m.KeepTasks = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9534,7 +11060,7 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { +func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9557,36 +11083,17 @@ func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvironmentOperation: wiretype end group for non-group") + return fmt.Errorf("proto: DestroyEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9596,23 +11103,27 @@ func (m *EnvironmentOperation) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.RoleName = string(dAtA[iNdEx:postIndex]) + if m.CleanupTasksReply == nil { + m.CleanupTasksReply = &CleanupTasksReply{} + } + if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -9639,7 +11150,7 @@ func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { } return nil } -func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *SetEnvironmentPropertiesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9662,17 +11173,17 @@ func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ModifyEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9682,31 +11193,29 @@ func (m *ModifyEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9716,56 +11225,173 @@ func (m *ModifyEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + if m.Properties == nil { + m.Properties = make(map[string]string) } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } } - intStringLen := int(stringLen) - if intStringLen < 0 { + m.Properties[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control + } + 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9791,7 +11417,7 @@ func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentPropertiesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9814,10 +11440,10 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9853,8 +11479,40 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -9871,7 +11529,7 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { break } } - m.KeepTasks = bool(v != 0) + m.ExcludeGlobals = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9897,7 +11555,7 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentPropertiesReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9920,15 +11578,15 @@ func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DestroyEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentPropertiesReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9955,12 +11613,103 @@ func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + if m.Properties == nil { + m.Properties = make(map[string]string) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.Properties[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -13766,6 +15515,7 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13797,10 +15547,8 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13821,55 +15569,30 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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 := skipO2Control(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupO2Control + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") ) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index c5e0e61df..97a686170 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StatusUpdate_Level int32 @@ -139,7 +142,7 @@ func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -181,7 +184,7 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -222,7 +225,7 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -279,7 +282,7 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ type isStatusUpdate_Event interface { } type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} @@ -331,61 +334,13 @@ func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { return nil } -// XXX_OneofFuncs is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _StatusUpdate_OneofMarshaler, _StatusUpdate_OneofUnmarshaler, _StatusUpdate_OneofSizer, []interface{}{ +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } } -func _StatusUpdate_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - _ = b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.MesosHeartbeat); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("StatusUpdate.Event has unexpected type %T", x) - } - return nil -} - -func _StatusUpdate_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*StatusUpdate) - switch tag { - case 2: // Event.mesosHeartbeat - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Event_MesosHeartbeat) - err := b.DecodeMessage(msg) - m.Event = &StatusUpdate_MesosHeartbeat{msg} - return true, err - default: - return false, nil - } -} - -func _StatusUpdate_OneofSizer(msg proto.Message) (n int) { - m := msg.(*StatusUpdate) - // Event - switch x := m.Event.(type) { - case *StatusUpdate_MesosHeartbeat: - s := proto.Size(x.MesosHeartbeat) - n += 1 // tag and wire - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -409,7 +364,7 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -454,7 +409,7 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -542,7 +497,7 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -632,7 +587,7 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -678,7 +633,7 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -720,7 +675,7 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -761,7 +716,7 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -820,7 +775,7 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -882,10 +837,11 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { } type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } @@ -902,7 +858,7 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -928,6 +884,13 @@ func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { return "" } +func (m *NewEnvironmentRequest) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -949,7 +912,7 @@ func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -996,7 +959,7 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1044,7 +1007,7 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1099,7 +1062,7 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1155,7 +1118,7 @@ func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1218,7 +1181,7 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1280,7 +1243,7 @@ func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1336,7 +1299,7 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1398,7 +1361,7 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1452,7 +1415,7 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1478,6 +1441,218 @@ func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +//////////////////////////////////////// +// Environment, GET/SET properties +//////////////////////////////////////// +type SetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } +func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} +} +func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *SetEnvironmentPropertiesRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + +type SetEnvironmentPropertiesReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } +func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} +} +func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *SetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) +} + +var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo + +type GetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } +func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *GetEnvironmentPropertiesRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { + if m != nil { + return m.Queries + } + return nil +} + +func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if m != nil { + return m.ExcludeGlobals + } + return false +} + +type GetEnvironmentPropertiesReply struct { + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } +func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} +} +func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *GetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) +} + +var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo + +func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + //////////////////////////////////////// // Tasks //////////////////////////////////////// @@ -1498,7 +1673,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1508,7 +1683,7 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1590,7 +1765,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1600,7 +1775,7 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1657,7 +1832,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,7 +1842,7 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1697,7 +1872,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1707,7 +1882,7 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1744,7 +1919,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1754,7 +1929,7 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1791,7 +1966,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1801,7 +1976,7 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1839,7 +2014,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1849,7 +2024,7 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1897,7 +2072,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1907,7 +2082,7 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -1974,7 +2149,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1984,7 +2159,7 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2041,7 +2216,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2051,7 +2226,7 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2130,7 +2305,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2140,7 +2315,7 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2178,7 +2353,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2188,7 +2363,7 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2236,7 +2411,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2246,7 +2421,7 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2295,7 +2470,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2305,7 +2480,7 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2377,7 +2552,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2387,7 +2562,7 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2427,7 +2602,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2437,7 +2612,7 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2497,7 +2672,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2507,7 +2682,7 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2558,7 +2733,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2568,7 +2743,7 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2604,7 +2779,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2614,7 +2789,7 @@ func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2646,7 +2821,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2831,7 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2708,7 +2883,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2718,7 +2893,7 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2763,7 +2938,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2773,7 +2948,7 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2818,7 +2993,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2828,7 +3003,7 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2872,7 +3047,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2882,7 +3057,7 @@ func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2919,7 +3094,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2929,7 +3104,7 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -2966,7 +3141,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2976,7 +3151,7 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3013,7 +3188,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3023,7 +3198,7 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3060,7 +3235,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3070,7 +3245,7 @@ func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bo return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3108,7 +3283,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3118,7 +3293,7 @@ func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3162,7 +3337,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3172,7 +3347,7 @@ func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3208,7 +3383,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3393,7 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return xxx_messageInfo_Empty.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -3254,6 +3429,7 @@ func init() { proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.PropertiesEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -3264,6 +3440,12 @@ func init() { proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") + proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") + proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") + proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") + proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") + proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") @@ -3300,152 +3482,163 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2317 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x59, 0xcd, 0x6e, 0x1b, 0xc9, - 0xf1, 0xd7, 0x50, 0xa4, 0x49, 0x16, 0x25, 0x8a, 0x6a, 0xc9, 0xf2, 0x88, 0xf6, 0xca, 0xda, 0xfe, - 0x2f, 0xbc, 0xb2, 0x77, 0xff, 0x72, 0x56, 0xbb, 0x48, 0x36, 0xc6, 0x6e, 0x1c, 0x7d, 0xd0, 0xb2, - 0x12, 0x4b, 0x74, 0x86, 0xb4, 0x8d, 0x18, 0x08, 0x9c, 0x11, 0xa7, 0x29, 0x72, 0x35, 0x9c, 0xe1, - 0xce, 0x34, 0x65, 0xeb, 0x90, 0x5b, 0x6e, 0x41, 0x90, 0x43, 0x2e, 0xb9, 0x06, 0x41, 0x8e, 0x79, - 0x86, 0x5c, 0x73, 0x09, 0x92, 0xbc, 0x41, 0xe0, 0x00, 0x39, 0xe5, 0x21, 0x82, 0xfe, 0x9a, 0xe9, - 0x19, 0xce, 0x50, 0x02, 0x72, 0x63, 0x55, 0x57, 0x55, 0x57, 0xd5, 0xaf, 0xba, 0xaa, 0xa7, 0x09, - 0x6b, 0xe3, 0xc0, 0xa7, 0x7e, 0xf8, 0xd0, 0xdf, 0xe9, 0xf9, 0x1e, 0x0d, 0x7c, 0x77, 0x9b, 0x33, - 0x50, 0x35, 0x62, 0xe0, 0x35, 0x58, 0x6d, 0x5d, 0x10, 0x8f, 0xbe, 0x39, 0x26, 0xa1, 0x1f, 0x3e, - 0x25, 0x76, 0x40, 0x4f, 0x89, 0x4d, 0xf1, 0x12, 0x2c, 0x76, 0xa8, 0x4d, 0x27, 0xa1, 0x45, 0xbe, - 0x9d, 0x90, 0x90, 0xe2, 0x53, 0xa8, 0x29, 0xc6, 0xd8, 0xbd, 0x44, 0xab, 0x50, 0x0a, 0xa9, 0x4d, - 0x89, 0x69, 0x6c, 0x1a, 0x5b, 0x55, 0x4b, 0x10, 0xe8, 0x6b, 0x58, 0x0c, 0xb9, 0xd0, 0x8b, 0xb1, - 0x63, 0x53, 0x12, 0x9a, 0x85, 0xcd, 0xf9, 0xad, 0xda, 0xce, 0xad, 0xed, 0xd8, 0x83, 0x8e, 0xb6, - 0x6e, 0x25, 0xa5, 0xf1, 0x5f, 0x0d, 0x58, 0xd0, 0xd7, 0xd1, 0xe7, 0x50, 0x72, 0xc9, 0x05, 0x71, - 0xf9, 0x2e, 0xf5, 0x9d, 0x0f, 0x72, 0xec, 0x6c, 0x3f, 0x63, 0x42, 0x96, 0x90, 0x45, 0x47, 0x50, - 0x1f, 0x25, 0x82, 0x31, 0x0b, 0x9b, 0xc6, 0x56, 0x6d, 0xe7, 0xae, 0xa6, 0x9d, 0x15, 0xf3, 0xd3, - 0x39, 0x2b, 0xa5, 0x88, 0xbf, 0x80, 0x12, 0x37, 0x8d, 0xaa, 0x50, 0x3a, 0x68, 0xed, 0xbd, 0x38, - 0x6c, 0xcc, 0xa1, 0x0a, 0x14, 0x8f, 0x4e, 0x9e, 0xb4, 0x1b, 0x06, 0xaa, 0x41, 0xf9, 0xd5, 0xae, - 0x75, 0x72, 0x74, 0x72, 0xd8, 0x28, 0x30, 0x89, 0x96, 0x65, 0xb5, 0xad, 0xc6, 0xfc, 0x5e, 0x19, - 0x4a, 0xdc, 0x3e, 0x5e, 0x87, 0x5b, 0x87, 0x84, 0x3e, 0x09, 0xec, 0x11, 0x79, 0xeb, 0x07, 0xe7, - 0x47, 0x5e, 0xdf, 0x57, 0xe9, 0xfc, 0x83, 0x01, 0xe5, 0x97, 0x24, 0x08, 0x87, 0xbe, 0xc7, 0x72, - 0x39, 0xb2, 0xbf, 0xf1, 0x03, 0x1e, 0x65, 0xc9, 0x12, 0x04, 0xe7, 0x0e, 0x3d, 0x3f, 0xe0, 0xde, - 0x33, 0x2e, 0x23, 0x18, 0x77, 0x6c, 0xd3, 0xde, 0xc0, 0x9c, 0x17, 0x5c, 0x4e, 0x30, 0xee, 0xe9, - 0x64, 0xe8, 0x3a, 0x66, 0x51, 0xa0, 0xc1, 0x09, 0xb4, 0x09, 0xb5, 0x71, 0xe0, 0x3b, 0x93, 0x1e, - 0x3d, 0xb1, 0x47, 0xc4, 0x2c, 0xf1, 0x35, 0x9d, 0x85, 0x36, 0x00, 0x2e, 0x84, 0x13, 0x1d, 0x1a, - 0x98, 0x37, 0xb8, 0x80, 0xc6, 0xc1, 0xbf, 0x29, 0xc0, 0xcd, 0xe9, 0x08, 0x18, 0xfe, 0x9b, 0x50, - 0xeb, 0x47, 0x5c, 0x47, 0x56, 0x81, 0xce, 0x42, 0x9f, 0xc2, 0x32, 0xf1, 0x2e, 0x86, 0x81, 0xef, - 0x8d, 0x88, 0x47, 0xc3, 0x7d, 0x7f, 0xe2, 0x51, 0x19, 0xcb, 0xf4, 0x02, 0xf3, 0x84, 0xda, 0xe1, - 0xb9, 0x14, 0x13, 0xc1, 0x69, 0x9c, 0xb8, 0xde, 0x8a, 0x7a, 0xbd, 0x6d, 0x00, 0x0c, 0xfc, 0x50, - 0x19, 0x2f, 0x09, 0xad, 0x98, 0x83, 0x30, 0x2c, 0x0c, 0xbd, 0x90, 0xda, 0x5e, 0x8f, 0xf0, 0x14, - 0x88, 0x08, 0x13, 0x3c, 0xf4, 0x29, 0x94, 0x65, 0xc4, 0x66, 0x99, 0xd7, 0x09, 0xd2, 0xea, 0x44, - 0x42, 0x64, 0x29, 0x11, 0x7c, 0x1f, 0x96, 0xba, 0xc4, 0x0e, 0x1c, 0xff, 0xad, 0x27, 0xa1, 0x44, - 0x6b, 0x70, 0x23, 0x20, 0x76, 0xe8, 0x7b, 0x32, 0x0b, 0x92, 0x62, 0x47, 0x28, 0x16, 0x1d, 0xbb, - 0x97, 0xd8, 0x84, 0xb5, 0x43, 0x42, 0x5b, 0x5a, 0xec, 0xaa, 0x1a, 0xde, 0xc1, 0xea, 0xd4, 0xca, - 0xf5, 0xb2, 0xfc, 0x03, 0x58, 0xd0, 0x93, 0x29, 0x0f, 0x5c, 0x53, 0x2f, 0xf5, 0x78, 0x99, 0xc3, - 0x97, 0x90, 0xc7, 0xff, 0x30, 0x60, 0x29, 0x25, 0x81, 0xea, 0x50, 0x18, 0xaa, 0xcd, 0x0a, 0x43, - 0x5e, 0x47, 0xbd, 0x80, 0xd8, 0x94, 0x38, 0xaf, 0x06, 0xc4, 0xe3, 0x18, 0x56, 0x2d, 0x9d, 0x15, - 0xa3, 0x33, 0xaf, 0xa3, 0xb3, 0x0d, 0x25, 0x8e, 0xa0, 0x59, 0xe4, 0x4e, 0x99, 0xfa, 0xe9, 0x1d, - 0xf8, 0x01, 0xed, 0xda, 0xa1, 0xa8, 0x28, 0x21, 0x86, 0x9a, 0x50, 0x09, 0x7c, 0x9f, 0x5a, 0xbe, - 0xab, 0x8a, 0x35, 0xa2, 0xd1, 0x03, 0x68, 0xf4, 0x26, 0x41, 0x40, 0x3c, 0x6a, 0x4d, 0xbc, 0x93, - 0xc9, 0xe8, 0x94, 0x88, 0x7a, 0x5d, 0xb4, 0xa6, 0xf8, 0x78, 0x1f, 0x6e, 0x9e, 0x90, 0xb7, 0x5a, - 0x54, 0x0a, 0xa9, 0x07, 0xd0, 0x60, 0x69, 0xeb, 0xbb, 0xfe, 0xdb, 0x2e, 0x19, 0x8d, 0xdd, 0xb8, - 0x7f, 0x4d, 0xf1, 0x71, 0x07, 0x56, 0xd2, 0x46, 0x18, 0x22, 0x5f, 0x41, 0x4d, 0xcb, 0x1f, 0xd7, - 0x9e, 0x9d, 0x6e, 0x5d, 0x1c, 0x7f, 0xcc, 0x8f, 0x53, 0x86, 0x67, 0xa9, 0x94, 0xe3, 0x5f, 0x1a, - 0xb0, 0x92, 0x96, 0xfc, 0x9f, 0xb7, 0x47, 0x0f, 0xa1, 0xa2, 0xe2, 0x94, 0x3d, 0x71, 0x45, 0x53, - 0x65, 0x79, 0xe6, 0x3a, 0x91, 0x10, 0xfe, 0x9b, 0x01, 0xeb, 0xfb, 0x62, 0xf9, 0x6a, 0xa7, 0xd1, - 0x63, 0x28, 0xd2, 0xcb, 0x31, 0xe1, 0xa6, 0xeb, 0x3b, 0x9f, 0x68, 0xa6, 0x73, 0x6d, 0x6c, 0xb7, - 0xc7, 0x4c, 0xc5, 0xe2, 0x8a, 0xd8, 0x86, 0x1b, 0x82, 0x66, 0x4d, 0xf6, 0xa4, 0xdd, 0x7e, 0xde, - 0x98, 0x43, 0x08, 0xea, 0x9d, 0xee, 0xae, 0xd5, 0x7d, 0xb3, 0xbb, 0xdf, 0x3d, 0x7a, 0x79, 0xd4, - 0xfd, 0x69, 0xc3, 0x40, 0xcb, 0xb0, 0xd8, 0xe9, 0xb6, 0x9f, 0xc7, 0xac, 0x02, 0x5a, 0x84, 0xea, - 0x7e, 0xfb, 0xe4, 0xc9, 0xd1, 0xe1, 0x0b, 0xab, 0xd5, 0x98, 0x67, 0xdd, 0xd8, 0x6a, 0x75, 0x5a, - 0xdd, 0x46, 0x11, 0x2d, 0x40, 0xe5, 0xb0, 0xfd, 0x46, 0xf4, 0xe6, 0x12, 0x3e, 0x87, 0x5b, 0x59, - 0xce, 0xb0, 0xdc, 0xa6, 0xc3, 0x89, 0x8a, 0xba, 0xa0, 0x17, 0x75, 0x56, 0x21, 0xce, 0xe7, 0x14, - 0xe2, 0x6f, 0x0d, 0x30, 0x8f, 0x7d, 0x67, 0xd8, 0xbf, 0xbc, 0x56, 0xf6, 0xc0, 0x1f, 0x93, 0xc0, - 0xa6, 0x43, 0xdf, 0x53, 0xe7, 0xf8, 0x6e, 0x36, 0xb2, 0x6d, 0x25, 0x67, 0x69, 0x2a, 0xe8, 0x1e, - 0xd4, 0x03, 0xd2, 0xf3, 0xbd, 0xfe, 0xf0, 0x6c, 0x12, 0x90, 0x5d, 0xd7, 0xe5, 0x7e, 0x55, 0xac, - 0x14, 0x17, 0xff, 0xde, 0x80, 0xd5, 0x2c, 0x63, 0xe8, 0x91, 0xc4, 0x4f, 0x0c, 0xdb, 0x7b, 0x57, - 0xec, 0x9d, 0x80, 0x4e, 0x9c, 0x5d, 0x57, 0x74, 0xd9, 0x82, 0x3a, 0xbb, 0x82, 0xc6, 0x9f, 0x65, - 0xc0, 0xba, 0x04, 0x35, 0xab, 0x75, 0xdc, 0x7e, 0xd9, 0x7a, 0x63, 0xb5, 0x9f, 0x31, 0xc4, 0x16, - 0xa0, 0xb2, 0x7b, 0x70, 0x20, 0xa8, 0x22, 0xfe, 0x95, 0x01, 0x6b, 0x19, 0x99, 0x63, 0x30, 0xfd, - 0x18, 0x1a, 0x7d, 0x7b, 0xe8, 0x12, 0xa7, 0x1d, 0x67, 0xcb, 0xb8, 0x5e, 0xb6, 0xa6, 0x14, 0x25, - 0x08, 0x85, 0x69, 0xcc, 0xf5, 0x46, 0x86, 0x8f, 0x60, 0xfd, 0x80, 0x84, 0x34, 0xf0, 0xaf, 0x83, - 0xe3, 0x1d, 0xa8, 0x9e, 0x13, 0x32, 0xee, 0xf2, 0xce, 0x57, 0xe0, 0x08, 0xc4, 0x0c, 0x4c, 0xe0, - 0x56, 0x96, 0x29, 0x16, 0xd8, 0x8f, 0x60, 0xb9, 0xe7, 0x12, 0xdb, 0x9b, 0x08, 0x51, 0xce, 0x94, - 0x27, 0xfc, 0x8e, 0x7e, 0x96, 0xd2, 0x32, 0xd6, 0xb4, 0x1a, 0xfe, 0xb7, 0x01, 0x8b, 0x89, 0x1e, - 0x8b, 0x10, 0x14, 0x3d, 0x06, 0x8e, 0x70, 0x94, 0xff, 0x66, 0x93, 0xcb, 0xf5, 0x7b, 0xe7, 0xc4, - 0x91, 0x7e, 0x4a, 0x8a, 0xf1, 0x59, 0x47, 0x3e, 0x72, 0x64, 0x1a, 0x24, 0xc5, 0xf8, 0xe2, 0xc2, - 0x26, 0xa7, 0xb0, 0xa4, 0xe2, 0xac, 0x95, 0xf4, 0x93, 0x72, 0x07, 0xaa, 0x3d, 0xd7, 0x0e, 0x43, - 0x6d, 0xf2, 0xc6, 0x0c, 0xd4, 0x82, 0xba, 0x43, 0xc6, 0xae, 0x7f, 0xa9, 0x5a, 0x95, 0x9c, 0xbe, - 0xfa, 0x1d, 0x8f, 0x39, 0x7f, 0x90, 0x10, 0xb2, 0x52, 0x4a, 0xac, 0x51, 0xa2, 0x69, 0x31, 0x56, - 0x8e, 0xec, 0x1a, 0xa0, 0x45, 0x1c, 0xd1, 0xc8, 0x84, 0xb2, 0x7d, 0xc6, 0x04, 0x15, 0xf0, 0x8a, - 0x64, 0x2b, 0x7e, 0xbf, 0x4f, 0x82, 0x28, 0x70, 0x45, 0xb2, 0x8b, 0x06, 0x79, 0x47, 0x7a, 0x13, - 0xea, 0xb3, 0x45, 0x11, 0xbd, 0xc6, 0xc1, 0xcb, 0xb0, 0x74, 0x48, 0xa8, 0x04, 0x40, 0xcc, 0xf4, - 0xc7, 0xb0, 0x18, 0xb3, 0x18, 0xbe, 0xd1, 0x38, 0x34, 0xae, 0x35, 0x0e, 0xf1, 0x16, 0xd4, 0xa5, - 0x01, 0xed, 0xa6, 0x21, 0x71, 0x31, 0x74, 0x5c, 0xf0, 0xf7, 0x60, 0x21, 0x92, 0x64, 0x3b, 0x7d, - 0x0c, 0x45, 0xb6, 0x22, 0x8b, 0x67, 0x25, 0x95, 0x51, 0xbe, 0x07, 0x17, 0xc0, 0x2d, 0x58, 0x64, - 0x9c, 0x7d, 0x86, 0x4a, 0x6e, 0x95, 0xb0, 0xf1, 0x2f, 0xd4, 0x8f, 0x7d, 0x87, 0x44, 0xe3, 0x3f, - 0x66, 0xe1, 0x5f, 0x40, 0x6d, 0xdf, 0x1f, 0x8d, 0x6c, 0xcf, 0xe1, 0x46, 0x1a, 0x30, 0x4f, 0xbc, - 0x0b, 0x1e, 0x66, 0xd5, 0x62, 0x3f, 0x79, 0x81, 0x0c, 0x88, 0xeb, 0xca, 0x3a, 0x13, 0x04, 0xe3, - 0x5e, 0xd8, 0xee, 0x24, 0x3a, 0x6c, 0x9c, 0x60, 0x65, 0x63, 0x07, 0x67, 0x13, 0x71, 0x9d, 0x29, - 0x72, 0x1b, 0x31, 0x83, 0x39, 0x38, 0x09, 0x49, 0x20, 0x2b, 0x8d, 0xff, 0xc6, 0xc7, 0x50, 0xdb, - 0x1f, 0xd8, 0x9e, 0x47, 0xdc, 0xdc, 0x18, 0x90, 0x36, 0x9a, 0xaa, 0xb2, 0x65, 0xf1, 0x6c, 0x06, - 0x67, 0x84, 0xc6, 0x55, 0xce, 0x28, 0xfc, 0x9f, 0x02, 0x54, 0xa2, 0x63, 0xf3, 0x5d, 0xa8, 0x86, - 0x0c, 0x1c, 0x5e, 0xa1, 0x22, 0x9f, 0xf9, 0xc0, 0xc5, 0xa2, 0x4c, 0xaf, 0xa7, 0xb2, 0x2a, 0x67, - 0xad, 0x99, 0xc2, 0x21, 0xca, 0xba, 0x15, 0x8b, 0xa2, 0x1f, 0xc2, 0xd2, 0xd0, 0x3b, 0xf5, 0x27, - 0x9e, 0x23, 0x43, 0x0a, 0xcd, 0x79, 0x5e, 0x2e, 0x6b, 0x7a, 0x0b, 0x88, 0xa3, 0xb5, 0xd2, 0xe2, - 0x68, 0x0f, 0x1a, 0xfe, 0x84, 0x26, 0x4d, 0x14, 0x67, 0x9a, 0x98, 0x92, 0x47, 0x5f, 0x32, 0xc8, - 0x23, 0x40, 0x79, 0xb2, 0x53, 0xea, 0xf1, 0xaa, 0xa5, 0x8b, 0xb2, 0x83, 0xc7, 0x2a, 0xeb, 0xb9, - 0x4d, 0x07, 0xf2, 0xcc, 0x47, 0x34, 0xc3, 0x9b, 0x78, 0x17, 0x47, 0x0e, 0x3f, 0xe9, 0x55, 0x4b, - 0x10, 0xf8, 0x21, 0xac, 0x24, 0x5b, 0x9a, 0xa8, 0x75, 0x13, 0xca, 0xa2, 0xba, 0x43, 0x59, 0x48, - 0x8a, 0xc4, 0xbf, 0x36, 0x60, 0x79, 0xaa, 0x09, 0xa2, 0x47, 0x50, 0x3b, 0x1f, 0xba, 0x2e, 0x71, - 0xba, 0xd7, 0x3a, 0x63, 0xba, 0x30, 0xfa, 0x0a, 0x16, 0x82, 0x89, 0xe7, 0x0d, 0xbd, 0x33, 0xd5, - 0xb5, 0x67, 0x2b, 0x27, 0xa4, 0xf1, 0x3e, 0x3f, 0xfb, 0xec, 0xf6, 0x14, 0x39, 0x1f, 0x45, 0x6a, - 0x68, 0x91, 0xb2, 0xdc, 0x8c, 0x6d, 0x3a, 0xe8, 0x8c, 0x49, 0x4f, 0xcd, 0x48, 0x45, 0xe3, 0x3f, - 0x19, 0x50, 0x51, 0x17, 0xb0, 0xbc, 0x5e, 0x2d, 0x7b, 0x6f, 0x21, 0xbb, 0xf7, 0x26, 0xae, 0xde, - 0x4d, 0xa8, 0xf4, 0x27, 0xae, 0xcb, 0x61, 0x10, 0xdd, 0x2a, 0xa2, 0xf5, 0xcc, 0x96, 0x12, 0x99, - 0x45, 0xf7, 0xa1, 0xc4, 0x86, 0x76, 0x68, 0xde, 0xe0, 0x09, 0xc8, 0xbc, 0x1c, 0x0a, 0x09, 0xfc, - 0x88, 0x77, 0x37, 0x19, 0x34, 0xcb, 0x7f, 0xa4, 0x6b, 0x5c, 0xa9, 0xfb, 0x47, 0x03, 0x6e, 0x1f, - 0x12, 0xfa, 0x2a, 0x75, 0xe5, 0x8e, 0xb2, 0xb7, 0x09, 0xb5, 0x80, 0x8c, 0xfd, 0xe7, 0x36, 0xa5, - 0x24, 0x50, 0x5f, 0x55, 0x3a, 0x0b, 0x6d, 0xc1, 0x52, 0x40, 0x2e, 0x86, 0xec, 0x8b, 0x4c, 0x49, - 0x89, 0xac, 0xa4, 0xd9, 0xcc, 0x96, 0xed, 0xba, 0x7b, 0x81, 0xed, 0xf5, 0x06, 0x24, 0x94, 0x37, - 0x22, 0x9d, 0xc5, 0xc7, 0x81, 0xeb, 0x76, 0xed, 0x33, 0x31, 0xd5, 0x2a, 0x96, 0x22, 0xf1, 0x29, - 0xac, 0xa6, 0x7d, 0x54, 0xf0, 0x30, 0x67, 0x14, 0x3c, 0xec, 0x37, 0xaf, 0x7b, 0xf5, 0x49, 0x21, - 0xb1, 0x55, 0x34, 0xbf, 0x1b, 0x49, 0xb7, 0x24, 0x4a, 0x11, 0x8d, 0xbf, 0x81, 0xf5, 0xec, 0x54, - 0xb0, 0x9c, 0x1e, 0xc3, 0x72, 0xfa, 0xbb, 0x24, 0xeb, 0xae, 0x93, 0xe5, 0xa4, 0x35, 0xad, 0x89, - 0x11, 0x34, 0x9e, 0x0d, 0x43, 0x76, 0xdb, 0xf0, 0xb5, 0x67, 0x9d, 0x0a, 0xa3, 0x73, 0xcb, 0xce, - 0x84, 0xb2, 0x43, 0xfa, 0xf6, 0xc4, 0xa5, 0xb2, 0x77, 0x2b, 0x92, 0x61, 0x20, 0x7f, 0x5a, 0xc9, - 0xe0, 0xd2, 0x6c, 0xfc, 0x2d, 0xd4, 0xb5, 0x7d, 0x55, 0xb1, 0x30, 0x2a, 0xab, 0x58, 0xa4, 0x37, - 0x96, 0x90, 0x40, 0x5f, 0xc0, 0xcd, 0x33, 0xd7, 0x3f, 0xb5, 0xdd, 0x83, 0xd4, 0x66, 0x22, 0xcb, - 0xd9, 0x8b, 0xf8, 0x04, 0xea, 0xbb, 0x8e, 0xc3, 0x6c, 0xa9, 0xa2, 0xca, 0x0a, 0x2e, 0x23, 0x84, - 0x42, 0x76, 0x08, 0x16, 0x2c, 0x44, 0xf6, 0xc4, 0x2c, 0x47, 0x1e, 0x79, 0x9b, 0x76, 0x49, 0xd8, - 0xce, 0x58, 0x61, 0xbb, 0x0f, 0xd5, 0x24, 0xa8, 0x5a, 0xfc, 0x37, 0xbe, 0x0f, 0xcb, 0x16, 0x19, - 0xf9, 0x17, 0x44, 0x77, 0x73, 0x15, 0x4a, 0x43, 0xcf, 0x21, 0xef, 0xd4, 0x5b, 0x10, 0x27, 0xf0, - 0xf7, 0x61, 0x49, 0x17, 0x65, 0x1e, 0xdc, 0x83, 0xba, 0xbe, 0x4f, 0x54, 0x8e, 0x29, 0x2e, 0xfe, - 0x04, 0x56, 0x2c, 0xd2, 0x0f, 0x48, 0x38, 0xd0, 0x71, 0xcf, 0xd9, 0xe7, 0xff, 0xe1, 0x66, 0x87, - 0x50, 0x4d, 0x7d, 0xb6, 0xf8, 0xd7, 0x70, 0xb7, 0x43, 0xe8, 0x61, 0x16, 0x02, 0x4a, 0x51, 0xaf, - 0x7d, 0x23, 0x55, 0xfb, 0x3f, 0x81, 0x0f, 0x3a, 0x84, 0x6f, 0x93, 0xa3, 0x9c, 0xb9, 0x6b, 0xc2, - 0x64, 0x21, 0x65, 0xf2, 0x33, 0xb8, 0x9d, 0x67, 0x92, 0x25, 0x4d, 0xc1, 0x60, 0x68, 0x30, 0x94, - 0xa1, 0xd4, 0x1a, 0x8d, 0xe9, 0xe5, 0xce, 0x9f, 0x17, 0xa1, 0x2c, 0xbf, 0x0d, 0xd1, 0x3e, 0xd4, - 0xba, 0x81, 0xdd, 0x3b, 0x17, 0xaf, 0x8c, 0xc8, 0x9c, 0x7a, 0x78, 0x94, 0x2e, 0x36, 0xd7, 0x32, - 0x56, 0xd8, 0x05, 0x7c, 0xee, 0x3b, 0x06, 0x7a, 0x0d, 0x8d, 0xf4, 0xe3, 0x19, 0xc2, 0x9a, 0x7c, - 0xce, 0xdb, 0x60, 0x73, 0x73, 0xa6, 0x0c, 0xb7, 0x8e, 0xf6, 0xa0, 0xa2, 0x1e, 0x97, 0x90, 0xfe, - 0xfd, 0x9f, 0x7a, 0x9c, 0x6a, 0x9a, 0x99, 0x6b, 0xc2, 0xc6, 0x2b, 0x3e, 0xb8, 0xf4, 0x57, 0x27, - 0xf4, 0x61, 0x72, 0xeb, 0x8c, 0xb7, 0xaa, 0xe6, 0xdd, 0x59, 0x22, 0xc2, 0x70, 0x17, 0xea, 0xc9, - 0xb7, 0x13, 0xa4, 0x87, 0x94, 0xf9, 0x36, 0xd3, 0xdc, 0x98, 0x21, 0x11, 0x59, 0x4d, 0xee, 0x87, - 0x36, 0x73, 0x5d, 0xc9, 0xb2, 0x9a, 0xf1, 0x9e, 0x82, 0xe7, 0xd0, 0xcf, 0x01, 0x4d, 0x3f, 0x08, - 0xa0, 0x8f, 0xae, 0xf3, 0x78, 0xd1, 0xc4, 0x57, 0x48, 0x89, 0x1d, 0x7e, 0x06, 0xcb, 0x53, 0x9f, - 0xb2, 0xe8, 0xff, 0x34, 0xd5, 0xbc, 0x27, 0x82, 0xe6, 0x87, 0xb3, 0x85, 0xa2, 0x00, 0xa6, 0xbf, - 0x28, 0x13, 0x01, 0xe4, 0x7e, 0xbb, 0x26, 0x02, 0xc8, 0xf9, 0x2c, 0x15, 0xb5, 0xa6, 0xbe, 0x64, - 0x12, 0xb5, 0x96, 0xfa, 0xe2, 0x49, 0xd4, 0x5a, 0xe2, 0xd3, 0x07, 0xcf, 0xa1, 0xc7, 0x50, 0x96, - 0x2c, 0xb4, 0x3e, 0x2d, 0xa6, 0x2c, 0xdc, 0xca, 0x5a, 0x12, 0x06, 0x4e, 0x60, 0x41, 0xbf, 0xf4, - 0xa1, 0x8d, 0xdc, 0x4f, 0x62, 0x61, 0x6a, 0xe6, 0x27, 0x73, 0x14, 0x14, 0xbf, 0xc0, 0xa4, 0x83, - 0xd2, 0xaf, 0x72, 0xe9, 0xa0, 0xe2, 0x1b, 0x0f, 0x9e, 0x43, 0x7d, 0xfe, 0x6c, 0x3b, 0x35, 0xbc, - 0xd1, 0xbd, 0xa4, 0x4e, 0xde, 0x45, 0xa7, 0xf9, 0xd1, 0x95, 0x72, 0x62, 0x9f, 0x16, 0x54, 0xa3, - 0x01, 0x8a, 0x6e, 0x6b, 0x4a, 0xe9, 0x71, 0xde, 0x5c, 0xcf, 0x5e, 0x8c, 0x30, 0x90, 0x43, 0x2c, - 0x81, 0x41, 0x72, 0x50, 0x26, 0x30, 0xd0, 0x67, 0x1e, 0x9e, 0x43, 0x4f, 0x01, 0xe2, 0x31, 0x84, - 0xee, 0x24, 0xa6, 0x76, 0x6a, 0x90, 0x35, 0x9b, 0x39, 0xab, 0x2a, 0xfb, 0x0b, 0xfa, 0x54, 0x4a, - 0xa0, 0x99, 0x31, 0xae, 0x9a, 0x0d, 0xfd, 0x69, 0x87, 0x75, 0x6b, 0x3c, 0x87, 0x9e, 0x40, 0x3d, - 0x39, 0xac, 0x12, 0xfd, 0x20, 0x73, 0x8e, 0x65, 0xda, 0x79, 0x0d, 0x66, 0xde, 0x14, 0x43, 0x0f, - 0x92, 0x16, 0x67, 0x8d, 0xba, 0x4c, 0xdb, 0x2e, 0xac, 0x65, 0xcf, 0x23, 0xb4, 0x95, 0xb4, 0x9c, - 0x3f, 0x05, 0x9b, 0xf7, 0xae, 0x21, 0xc9, 0xb3, 0xba, 0xf7, 0xe5, 0x5f, 0xde, 0x6f, 0x18, 0x7f, - 0x7f, 0xbf, 0x61, 0xfc, 0xf3, 0xfd, 0x86, 0xf1, 0xbb, 0x7f, 0x6d, 0xcc, 0x01, 0xee, 0x0d, 0xb6, - 0x7b, 0x24, 0xf0, 0xb6, 0x6d, 0x77, 0xd8, 0x23, 0xdb, 0xfe, 0xce, 0xb6, 0xb2, 0x14, 0x8c, 0x7b, - 0x21, 0x09, 0x2e, 0x48, 0xf0, 0xba, 0x30, 0x3e, 0x3d, 0xbd, 0xc1, 0xff, 0x18, 0xfc, 0xfc, 0xbf, - 0x01, 0x00, 0x00, 0xff, 0xff, 0x55, 0x25, 0x1d, 0x58, 0x32, 0x1c, 0x00, 0x00, + // 2486 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x5d, 0x6f, 0x1b, 0x59, + 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x3a, 0xde, 0x36, 0xc9, 0x5e, 0x56, + 0xdd, 0xb4, 0xbb, 0xa4, 0xbb, 0xd9, 0x15, 0x94, 0x6a, 0x4b, 0xc9, 0x87, 0xeb, 0x06, 0x9a, 0x38, + 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0xe3, 0xd9, 0x8c, 0x67, 0xdc, 0xf9, 0x48, 0x9b, + 0x07, 0xde, 0x78, 0x43, 0x88, 0x07, 0x5e, 0x78, 0x45, 0x08, 0xf1, 0xc4, 0x3b, 0x3f, 0x81, 0x07, + 0x10, 0x20, 0xf1, 0x03, 0x50, 0x91, 0x78, 0xe2, 0x47, 0xa0, 0xfb, 0x35, 0x73, 0x67, 0x3c, 0xe3, + 0x78, 0x85, 0xf6, 0xcd, 0xe7, 0xdc, 0x73, 0xce, 0xbd, 0xe7, 0xfb, 0xcc, 0x31, 0xac, 0x8c, 0x5c, + 0xc7, 0x77, 0xbc, 0x7b, 0xce, 0x76, 0xd7, 0xb1, 0x7d, 0xd7, 0xb1, 0xb6, 0x18, 0x02, 0x95, 0x43, + 0x04, 0x5e, 0x81, 0xe5, 0xe6, 0x05, 0xb1, 0xfd, 0x57, 0x87, 0xc4, 0x73, 0xbc, 0x27, 0xc4, 0x70, + 0xfd, 0x53, 0x62, 0xf8, 0x78, 0x01, 0xe6, 0x4f, 0x7c, 0xc3, 0x0f, 0x3c, 0x9d, 0xbc, 0x0e, 0x88, + 0xe7, 0xe3, 0x53, 0xa8, 0x48, 0xc4, 0xc8, 0xba, 0x44, 0xcb, 0x50, 0xf0, 0x7c, 0xc3, 0x27, 0x75, + 0x6d, 0x43, 0xdb, 0x2c, 0xeb, 0x1c, 0x40, 0x0f, 0x61, 0xde, 0x63, 0x44, 0xcf, 0x46, 0x3d, 0xc3, + 0x27, 0x5e, 0x3d, 0xb7, 0x31, 0xbb, 0x59, 0xd9, 0xbe, 0xb1, 0x15, 0xbd, 0xe0, 0x44, 0x39, 0xd7, + 0xe3, 0xd4, 0xf8, 0xaf, 0x1a, 0xcc, 0xa9, 0xe7, 0xe8, 0x33, 0x28, 0x58, 0xe4, 0x82, 0x58, 0xec, + 0x96, 0xea, 0xf6, 0xad, 0x0c, 0x39, 0x5b, 0x4f, 0x29, 0x91, 0xce, 0x69, 0xd1, 0x01, 0x54, 0x87, + 0x31, 0x65, 0xea, 0xb9, 0x0d, 0x6d, 0xb3, 0xb2, 0xbd, 0xae, 0x70, 0xa7, 0xe9, 0xfc, 0x64, 0x46, + 0x4f, 0x30, 0xe2, 0xcf, 0xa1, 0xc0, 0x44, 0xa3, 0x32, 0x14, 0xf6, 0x9b, 0xbb, 0xcf, 0x5a, 0xb5, + 0x19, 0x54, 0x82, 0xfc, 0xc1, 0xd1, 0xe3, 0x76, 0x4d, 0x43, 0x15, 0x28, 0xbe, 0xd8, 0xd1, 0x8f, + 0x0e, 0x8e, 0x5a, 0xb5, 0x1c, 0xa5, 0x68, 0xea, 0x7a, 0x5b, 0xaf, 0xcd, 0xee, 0x16, 0xa1, 0xc0, + 0xe4, 0xe3, 0x55, 0xb8, 0xd1, 0x22, 0xfe, 0x63, 0xd7, 0x18, 0x92, 0x37, 0x8e, 0x7b, 0x7e, 0x60, + 0xf7, 0x1d, 0x69, 0xce, 0xdf, 0x69, 0x50, 0x7c, 0x4e, 0x5c, 0xcf, 0x74, 0x6c, 0x6a, 0xcb, 0xa1, + 0xf1, 0xa5, 0xe3, 0x32, 0x2d, 0x0b, 0x3a, 0x07, 0x18, 0xd6, 0xb4, 0x1d, 0x97, 0xbd, 0x9e, 0x62, + 0x29, 0x40, 0xb1, 0x23, 0xc3, 0xef, 0x0e, 0xea, 0xb3, 0x1c, 0xcb, 0x00, 0x8a, 0x3d, 0x0d, 0x4c, + 0xab, 0x57, 0xcf, 0x73, 0x6f, 0x30, 0x00, 0x6d, 0x40, 0x65, 0xe4, 0x3a, 0xbd, 0xa0, 0xeb, 0x1f, + 0x19, 0x43, 0x52, 0x2f, 0xb0, 0x33, 0x15, 0x85, 0xd6, 0x00, 0x2e, 0xf8, 0x23, 0x4e, 0x7c, 0xb7, + 0x7e, 0x8d, 0x11, 0x28, 0x18, 0xfc, 0xab, 0x1c, 0x5c, 0x1f, 0xd7, 0x80, 0xfa, 0x7f, 0x03, 0x2a, + 0xfd, 0x10, 0xdb, 0x13, 0x51, 0xa0, 0xa2, 0xd0, 0xc7, 0xb0, 0x48, 0xec, 0x0b, 0xd3, 0x75, 0xec, + 0x21, 0xb1, 0x7d, 0x6f, 0xcf, 0x09, 0x6c, 0x5f, 0xe8, 0x32, 0x7e, 0x40, 0x5f, 0xe2, 0x1b, 0xde, + 0xb9, 0x20, 0xe3, 0xca, 0x29, 0x98, 0x28, 0xde, 0xf2, 0x6a, 0xbc, 0xad, 0x01, 0x0c, 0x1c, 0x4f, + 0x0a, 0x2f, 0x70, 0xae, 0x08, 0x83, 0x30, 0xcc, 0x99, 0xb6, 0xe7, 0x1b, 0x76, 0x97, 0x30, 0x13, + 0x70, 0x0d, 0x63, 0x38, 0xf4, 0x31, 0x14, 0x85, 0xc6, 0xf5, 0x22, 0x8b, 0x13, 0xa4, 0xc4, 0x89, + 0x70, 0x91, 0x2e, 0x49, 0xf0, 0x1d, 0x58, 0xe8, 0x10, 0xc3, 0xed, 0x39, 0x6f, 0x6c, 0xe1, 0x4a, + 0xb4, 0x02, 0xd7, 0x5c, 0x62, 0x78, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, 0x42, 0x11, 0xe9, 0xc8, + 0xba, 0xc4, 0x75, 0x58, 0x69, 0x11, 0xbf, 0xa9, 0xe8, 0x2e, 0xa3, 0xe1, 0x2d, 0x2c, 0x8f, 0x9d, + 0x4c, 0x67, 0xe5, 0xef, 0xc2, 0x9c, 0x6a, 0x4c, 0x91, 0x70, 0x0d, 0x35, 0xd4, 0xa3, 0x63, 0xe6, + 0xbe, 0x18, 0x3d, 0xfe, 0x87, 0x06, 0x0b, 0x09, 0x0a, 0x54, 0x85, 0x9c, 0x29, 0x2f, 0xcb, 0x99, + 0x2c, 0x8e, 0xba, 0x2e, 0x31, 0x7c, 0xd2, 0x7b, 0x31, 0x20, 0x36, 0xf3, 0x61, 0x59, 0x57, 0x51, + 0x91, 0x77, 0x66, 0x55, 0xef, 0x6c, 0x41, 0x81, 0x79, 0xb0, 0x9e, 0x67, 0x8f, 0xaa, 0xab, 0xd9, + 0x3b, 0x70, 0x5c, 0xbf, 0x63, 0x78, 0x3c, 0xa2, 0x38, 0x19, 0x6a, 0x40, 0xc9, 0x75, 0x1c, 0x5f, + 0x77, 0x2c, 0x19, 0xac, 0x21, 0x8c, 0xee, 0x42, 0xad, 0x1b, 0xb8, 0x2e, 0xb1, 0x7d, 0x3d, 0xb0, + 0x8f, 0x82, 0xe1, 0x29, 0xe1, 0xf1, 0x3a, 0xaf, 0x8f, 0xe1, 0xf1, 0x3f, 0x35, 0xb8, 0x7e, 0x44, + 0xde, 0x28, 0x6a, 0x49, 0x57, 0xdd, 0x85, 0x1a, 0xb5, 0x5b, 0xdf, 0x72, 0xde, 0x74, 0xc8, 0x70, + 0x64, 0x45, 0x05, 0x6c, 0x0c, 0x8f, 0x8e, 0x01, 0x46, 0xae, 0x33, 0x22, 0xae, 0x6f, 0x86, 0x85, + 0xec, 0x13, 0x45, 0x85, 0xd4, 0x1b, 0xb6, 0x8e, 0x43, 0x96, 0xa6, 0xed, 0xbb, 0x97, 0xba, 0x22, + 0xa3, 0xf1, 0x10, 0x16, 0x12, 0xc7, 0xa8, 0x06, 0xb3, 0xe7, 0xe4, 0x52, 0xbc, 0x81, 0xfe, 0xa4, + 0xa6, 0xbc, 0x30, 0xac, 0x80, 0x08, 0x33, 0x73, 0xe0, 0x41, 0xee, 0xbe, 0x86, 0x4f, 0x60, 0x29, + 0x79, 0x27, 0x8d, 0x91, 0x2f, 0xa0, 0xa2, 0x78, 0x94, 0x89, 0x9a, 0x1c, 0x00, 0x2a, 0x39, 0xfe, + 0x90, 0x25, 0x78, 0x8a, 0xa9, 0x12, 0x41, 0x80, 0x7f, 0xae, 0xc1, 0x52, 0x92, 0xf2, 0xff, 0xbe, + 0x1e, 0xdd, 0x83, 0x92, 0x34, 0xbc, 0xa8, 0xd2, 0x4b, 0x0a, 0x2b, 0xf5, 0x3c, 0xe3, 0x09, 0x89, + 0xf0, 0xdf, 0x34, 0x58, 0xdd, 0xe3, 0xc7, 0x57, 0x3f, 0x1a, 0x3d, 0x82, 0xbc, 0x7f, 0x39, 0xe2, + 0xb6, 0xac, 0x6e, 0x7f, 0xa4, 0x88, 0xce, 0x94, 0xb1, 0xd5, 0x1e, 0x51, 0x16, 0x9d, 0x31, 0x62, + 0x03, 0xae, 0x71, 0x98, 0x96, 0xfd, 0xa3, 0x76, 0xfb, 0xb8, 0x36, 0x83, 0x10, 0x54, 0x4f, 0x3a, + 0x3b, 0x7a, 0xe7, 0xd5, 0xce, 0x5e, 0xe7, 0xe0, 0xf9, 0x41, 0xe7, 0xc7, 0x35, 0x0d, 0x2d, 0xc2, + 0xfc, 0x49, 0xa7, 0x7d, 0x1c, 0xa1, 0x72, 0x68, 0x1e, 0xca, 0x7b, 0xed, 0xa3, 0xc7, 0x07, 0xad, + 0x67, 0x7a, 0xb3, 0x36, 0x4b, 0xfb, 0x83, 0xde, 0x3c, 0x69, 0x76, 0x6a, 0x79, 0x34, 0x07, 0xa5, + 0x56, 0xfb, 0x15, 0xef, 0x16, 0x05, 0x7c, 0x0e, 0x37, 0xd2, 0x1e, 0x43, 0x6d, 0x9b, 0x54, 0x27, + 0x4c, 0xb3, 0x9c, 0x9a, 0x66, 0x69, 0xa9, 0x31, 0x9b, 0x91, 0x1a, 0xbf, 0xd6, 0xa0, 0x7e, 0xe8, + 0xf4, 0xcc, 0xfe, 0xe5, 0x54, 0xd6, 0x03, 0x1a, 0xad, 0x86, 0x6f, 0x3a, 0xb6, 0xcc, 0x80, 0xf5, + 0x74, 0xcf, 0xb6, 0x25, 0x9d, 0xae, 0xb0, 0xa0, 0xdb, 0x50, 0x75, 0x49, 0xd7, 0xb1, 0xfb, 0xe6, + 0x59, 0xe0, 0x92, 0x1d, 0xcb, 0x62, 0xef, 0x2a, 0xe9, 0x09, 0x2c, 0xfe, 0xad, 0x06, 0xcb, 0x69, + 0xc2, 0xd0, 0x03, 0xe1, 0x3f, 0xde, 0xfe, 0x6f, 0x5f, 0x71, 0x77, 0xcc, 0x75, 0xbc, 0x9a, 0x58, + 0xbc, 0xee, 0xe7, 0x64, 0x35, 0xe1, 0x30, 0xfe, 0x34, 0xc5, 0xad, 0x0b, 0x50, 0xd1, 0x9b, 0x87, + 0xed, 0xe7, 0xcd, 0x57, 0x7a, 0xfb, 0x29, 0xf5, 0xd8, 0x1c, 0x94, 0x76, 0xf6, 0xf7, 0x39, 0x94, + 0xc7, 0xbf, 0xd0, 0x60, 0x25, 0xc5, 0x72, 0xd4, 0x4d, 0x3f, 0x80, 0x5a, 0xdf, 0x30, 0x2d, 0xd2, + 0x6b, 0x47, 0xd6, 0xd2, 0xa6, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x6e, 0xdc, 0xe7, 0x6a, 0x69, + 0xc5, 0x07, 0xb0, 0xba, 0x4f, 0x3c, 0xdf, 0x75, 0xa6, 0xf1, 0xe3, 0x4d, 0x28, 0x9f, 0x13, 0x32, + 0xea, 0xb0, 0x5a, 0x9c, 0x63, 0x1e, 0x88, 0x10, 0x98, 0xc0, 0x8d, 0x34, 0x51, 0x54, 0xb1, 0xef, + 0xc3, 0x62, 0xd7, 0x22, 0x86, 0x1d, 0x70, 0x52, 0x86, 0x14, 0x19, 0x7e, 0x53, 0xcd, 0xa5, 0x24, + 0x8d, 0x3e, 0xce, 0x86, 0xff, 0xa2, 0xc1, 0xfa, 0x49, 0xac, 0x7e, 0x44, 0xb5, 0x30, 0xeb, 0xe1, + 0x2f, 0x53, 0x4a, 0xf0, 0x03, 0xb5, 0x8b, 0x4c, 0x96, 0xf7, 0x75, 0x16, 0xe3, 0x75, 0xb8, 0x95, + 0x7d, 0x3b, 0xd5, 0xd7, 0x83, 0xf5, 0xd6, 0x57, 0x54, 0xb7, 0x0e, 0xc5, 0xd7, 0x01, 0x71, 0xa5, + 0xae, 0x65, 0x5d, 0x82, 0x34, 0x91, 0xc8, 0xdb, 0xae, 0x15, 0xf4, 0x48, 0xcb, 0x72, 0x4e, 0x0d, + 0xcb, 0x93, 0x89, 0x14, 0xc7, 0xe2, 0x3f, 0x69, 0x70, 0xab, 0x35, 0xe9, 0x59, 0xe8, 0x47, 0x31, + 0x93, 0xf2, 0x28, 0xbd, 0xaf, 0x98, 0x74, 0x22, 0xf7, 0xd7, 0x69, 0xd0, 0xff, 0x68, 0x30, 0x1f, + 0x9b, 0x0a, 0x10, 0x82, 0xbc, 0x4d, 0x93, 0x97, 0xb3, 0xb3, 0xdf, 0x74, 0xd6, 0xb2, 0x9c, 0xee, + 0x39, 0xe9, 0x89, 0x38, 0x16, 0x10, 0xc5, 0xd3, 0x19, 0xe2, 0xa0, 0x27, 0xd2, 0x44, 0x40, 0x14, + 0xcf, 0x3f, 0x31, 0xc4, 0xdc, 0x28, 0xa0, 0x28, 0xab, 0x0a, 0x6a, 0x25, 0xbd, 0x09, 0xe5, 0xae, + 0x65, 0x78, 0x9e, 0x32, 0x2b, 0x46, 0x08, 0xd4, 0x84, 0x6a, 0x8f, 0x8c, 0x2c, 0xe7, 0x52, 0xb6, + 0x32, 0x31, 0x2f, 0xaa, 0x5f, 0x25, 0xf4, 0xf1, 0xfb, 0x31, 0x22, 0x3d, 0xc1, 0x44, 0x1b, 0x29, + 0x1a, 0x27, 0xa3, 0xe5, 0x8a, 0x0e, 0xae, 0x8a, 0xc6, 0x21, 0x4c, 0x03, 0xc3, 0x38, 0xa3, 0x84, + 0xb2, 0x30, 0x48, 0x90, 0x9e, 0x38, 0xfd, 0x3e, 0x71, 0x43, 0xc5, 0x25, 0x48, 0x47, 0x63, 0xf2, + 0x96, 0x74, 0x03, 0xdf, 0xa1, 0x87, 0x5c, 0x7b, 0x05, 0x83, 0x17, 0x61, 0xa1, 0x45, 0x7c, 0x91, + 0xa0, 0x7c, 0x0a, 0x7d, 0x04, 0xf3, 0x11, 0x8a, 0x06, 0x4b, 0x38, 0xc0, 0x69, 0x53, 0x0d, 0x70, + 0x78, 0x13, 0xaa, 0x42, 0x80, 0x32, 0x1b, 0x0b, 0xbf, 0x68, 0xaa, 0x5f, 0xf0, 0xb7, 0x61, 0x2e, + 0xa4, 0xa4, 0x37, 0x7d, 0x08, 0x79, 0x7a, 0x22, 0x8a, 0xcb, 0x52, 0xc2, 0xa2, 0xec, 0x0e, 0x46, + 0x80, 0x9b, 0x30, 0x4f, 0x31, 0x7b, 0xd4, 0x2b, 0x99, 0x51, 0x42, 0x07, 0x56, 0xce, 0x7e, 0xe8, + 0xf4, 0x48, 0x38, 0xb0, 0x46, 0x28, 0xfc, 0x33, 0xa8, 0xec, 0x39, 0xc3, 0xa1, 0x61, 0xf7, 0x98, + 0x90, 0x1a, 0xcc, 0x12, 0xfb, 0x82, 0xa9, 0x59, 0xd6, 0xe9, 0x4f, 0x16, 0x20, 0x03, 0x62, 0x59, + 0x22, 0xce, 0x38, 0x10, 0x85, 0xef, 0xac, 0x12, 0xbe, 0x34, 0x6c, 0x0c, 0xf7, 0x2c, 0xe0, 0x03, + 0x78, 0x9e, 0xc9, 0x88, 0x10, 0xf4, 0x81, 0x81, 0x47, 0x5c, 0x11, 0x69, 0xec, 0x37, 0x3e, 0x84, + 0xca, 0xde, 0xc0, 0xb0, 0x6d, 0x62, 0x65, 0xea, 0x80, 0x94, 0xd1, 0xa5, 0x2c, 0x5a, 0x1a, 0xb3, + 0xa6, 0x7b, 0x46, 0xfc, 0x28, 0xca, 0x29, 0x84, 0xff, 0x9b, 0x83, 0x52, 0x98, 0x36, 0xdf, 0x82, + 0xb2, 0x47, 0x9d, 0xc3, 0x22, 0x94, 0xdb, 0x33, 0xdb, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x4a, 0xab, + 0x8a, 0x59, 0xac, 0x9e, 0xf0, 0x43, 0x68, 0x75, 0x3d, 0x22, 0x45, 0xdf, 0x83, 0x05, 0xd3, 0x3e, + 0x75, 0x02, 0xbb, 0x27, 0x54, 0xa2, 0xc5, 0x89, 0x86, 0xcb, 0x8a, 0xda, 0x22, 0x22, 0x6d, 0xf5, + 0x24, 0x39, 0xda, 0x85, 0x9a, 0x13, 0xf8, 0x71, 0x11, 0xf9, 0x89, 0x22, 0xc6, 0xe8, 0xd1, 0x7d, + 0xea, 0xf2, 0xd0, 0xa1, 0xcc, 0xd8, 0x09, 0xf6, 0xe8, 0x54, 0x57, 0x49, 0x69, 0xe2, 0xd1, 0xc8, + 0x3a, 0x36, 0xfc, 0x81, 0xc8, 0xf9, 0x10, 0xa6, 0xfe, 0x26, 0xf6, 0xc5, 0x41, 0x8f, 0x65, 0x7a, + 0x59, 0xe7, 0x00, 0xbe, 0x07, 0x4b, 0xf1, 0x96, 0xc7, 0x63, 0xbd, 0x0e, 0x45, 0x1e, 0xdd, 0x9e, + 0x08, 0x24, 0x09, 0xe2, 0x5f, 0x6a, 0xb0, 0x38, 0xd6, 0x24, 0xd1, 0x03, 0xa8, 0x9c, 0x9b, 0x96, + 0x45, 0x7a, 0x9d, 0xa9, 0x72, 0x4c, 0x25, 0x46, 0x5f, 0xc0, 0x9c, 0x1b, 0xd8, 0xb6, 0x69, 0x9f, + 0xc9, 0xae, 0x3e, 0x99, 0x39, 0x46, 0x8d, 0xf7, 0x58, 0xee, 0xd3, 0xe9, 0x3a, 0x7c, 0x7c, 0xa8, + 0xa9, 0xa6, 0x68, 0x4a, 0x6d, 0x33, 0x32, 0xfc, 0xc1, 0xc9, 0x88, 0x74, 0xe5, 0x0c, 0x25, 0x61, + 0xfc, 0x47, 0x0d, 0x4a, 0x72, 0x40, 0xcf, 0xaa, 0xd5, 0xa2, 0xf6, 0xe6, 0xd2, 0x6b, 0x6f, 0xec, + 0x63, 0xb1, 0x01, 0xa5, 0x7e, 0x60, 0x59, 0xcc, 0x0d, 0xbc, 0x5a, 0x85, 0xb0, 0x6a, 0xd9, 0x42, + 0xcc, 0xb2, 0xe8, 0x0e, 0x14, 0xe8, 0x50, 0xe7, 0xd5, 0xaf, 0x31, 0x03, 0xa4, 0x7e, 0x3c, 0x70, + 0x0a, 0xfc, 0x80, 0x55, 0x37, 0xa1, 0x34, 0xb5, 0x7f, 0xc8, 0xab, 0x5d, 0xc9, 0xfb, 0x7b, 0x0d, + 0xde, 0x6b, 0x11, 0xff, 0x45, 0xe2, 0x1b, 0x31, 0xb4, 0xde, 0x06, 0x54, 0x5c, 0x32, 0x72, 0x8e, + 0x0d, 0xdf, 0x27, 0xae, 0xdc, 0x03, 0xa8, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0xb9, 0x30, 0x3d, 0xd3, + 0xb1, 0x25, 0x15, 0xb7, 0x4a, 0x12, 0x4d, 0x65, 0x19, 0x96, 0xb5, 0xeb, 0x1a, 0x76, 0x77, 0x40, + 0x64, 0xa3, 0x57, 0x51, 0xac, 0x1d, 0x58, 0x56, 0xc7, 0x38, 0xe3, 0x5d, 0xad, 0xa4, 0x4b, 0x10, + 0x9f, 0xc2, 0x72, 0xf2, 0x8d, 0xd2, 0x3d, 0xf4, 0x31, 0xd2, 0x3d, 0xf4, 0x37, 0x8b, 0x7b, 0xf9, + 0x0d, 0x2c, 0x7c, 0x2b, 0x61, 0x36, 0x3b, 0x8b, 0x67, 0x09, 0x2f, 0x85, 0x30, 0xfe, 0x12, 0x56, + 0xd3, 0x4d, 0x41, 0x6d, 0x7a, 0x08, 0x8b, 0xc9, 0x0f, 0xe9, 0xb4, 0x59, 0x38, 0xed, 0x91, 0xfa, + 0x38, 0x27, 0x46, 0x50, 0x7b, 0x6a, 0x7a, 0x74, 0x1a, 0x75, 0x94, 0x45, 0x64, 0x89, 0xc2, 0x99, + 0x61, 0x57, 0x87, 0x62, 0x8f, 0xf4, 0x8d, 0xc0, 0xf2, 0x45, 0xed, 0x96, 0x20, 0xf5, 0x81, 0xf8, + 0xa9, 0xc7, 0x95, 0x4b, 0xa2, 0xf1, 0x6b, 0xa8, 0x2a, 0xf7, 0xca, 0x60, 0xa1, 0x50, 0x5a, 0xb0, + 0x88, 0xd7, 0xe8, 0x9c, 0x02, 0x7d, 0x0e, 0xd7, 0xcf, 0xd8, 0x3c, 0xb6, 0x9f, 0xb8, 0x8c, 0x5b, + 0x39, 0xfd, 0x10, 0x1f, 0x41, 0x75, 0xa7, 0xd7, 0xa3, 0xb2, 0x64, 0x50, 0xa5, 0x29, 0x97, 0xa2, + 0x42, 0x2e, 0x5d, 0x05, 0x1d, 0xe6, 0x42, 0x79, 0xbc, 0x97, 0x23, 0x9b, 0xbc, 0x49, 0x3e, 0x89, + 0xcb, 0x4e, 0x39, 0xa1, 0xb7, 0x9b, 0xb2, 0x13, 0x94, 0x75, 0xf6, 0x1b, 0xdf, 0x81, 0x45, 0x9d, + 0x0c, 0x9d, 0x0b, 0xa2, 0x3e, 0x73, 0x19, 0x0a, 0xa6, 0xdd, 0x23, 0x6f, 0xe5, 0xf6, 0x92, 0x01, + 0xf8, 0x3b, 0xb0, 0xa0, 0x92, 0xd2, 0x17, 0xdc, 0x86, 0xaa, 0x7a, 0x4f, 0x18, 0x8e, 0x09, 0x2c, + 0xfe, 0x08, 0x96, 0x74, 0xd2, 0x77, 0x89, 0x37, 0x50, 0xfd, 0x9e, 0x71, 0xcf, 0x37, 0xe1, 0xfa, + 0x09, 0xf1, 0x15, 0xf6, 0xc9, 0xe4, 0x0f, 0xd9, 0x47, 0x48, 0x2b, 0xcd, 0x03, 0x92, 0x51, 0x8d, + 0x7d, 0x2d, 0x11, 0xfb, 0x3f, 0x64, 0x53, 0x3f, 0xbd, 0x26, 0x83, 0x39, 0xf5, 0xd6, 0x98, 0xc8, + 0x5c, 0x42, 0xe4, 0xa7, 0xf0, 0x5e, 0x96, 0x48, 0x6a, 0x34, 0xe9, 0x06, 0x4d, 0x71, 0x43, 0x11, + 0x0a, 0xcd, 0xe1, 0xc8, 0xbf, 0xdc, 0xfe, 0xc3, 0x02, 0x14, 0xc5, 0xee, 0x00, 0xed, 0x41, 0xa5, + 0xe3, 0x1a, 0xdd, 0x73, 0xbe, 0x17, 0x47, 0xf5, 0xb1, 0x55, 0xb9, 0x78, 0x62, 0x63, 0x25, 0xe5, + 0x84, 0x7e, 0xb0, 0xcc, 0x7c, 0xa2, 0xa1, 0x97, 0x50, 0x4b, 0xae, 0x7b, 0x11, 0x8e, 0x7f, 0x1d, + 0xa4, 0x6d, 0xb3, 0x1b, 0x1b, 0x13, 0x69, 0x98, 0x74, 0xb4, 0x0b, 0x25, 0xb9, 0x0e, 0x45, 0xea, + 0x7e, 0x28, 0xb1, 0x4e, 0x6d, 0xd4, 0x53, 0xcf, 0xb8, 0x8c, 0x17, 0xac, 0x71, 0xa9, 0x7b, 0x52, + 0xf4, 0x7e, 0xe6, 0xc7, 0x4b, 0xa8, 0xf1, 0xfa, 0x24, 0x12, 0x2e, 0xb8, 0x03, 0xd5, 0xf8, 0x6e, + 0x0d, 0x6d, 0x5c, 0xb5, 0xea, 0x6b, 0xac, 0x4d, 0xa0, 0x08, 0xa5, 0xc6, 0xef, 0x43, 0x1b, 0x99, + 0x4f, 0x49, 0x93, 0x9a, 0xb2, 0x6f, 0xc3, 0x33, 0xe8, 0xa7, 0x80, 0xc6, 0x17, 0x46, 0xe8, 0x83, + 0x69, 0x96, 0x5b, 0x0d, 0x7c, 0x05, 0x15, 0xbf, 0xe1, 0x27, 0xb0, 0x38, 0xb6, 0xea, 0x40, 0xdf, + 0x50, 0x58, 0xb3, 0x56, 0x48, 0x8d, 0xf7, 0x27, 0x13, 0x85, 0x0a, 0x8c, 0x6f, 0x1c, 0x62, 0x0a, + 0x64, 0xee, 0x36, 0x62, 0x0a, 0x64, 0xac, 0x2d, 0xf0, 0x0c, 0x72, 0xa1, 0x9e, 0xf5, 0x75, 0x8e, + 0xee, 0x4e, 0xbf, 0x40, 0x68, 0x6c, 0x4e, 0x45, 0x1b, 0xde, 0xd9, 0x9a, 0xe6, 0xce, 0xd6, 0x57, + 0xb8, 0xb3, 0x75, 0xc5, 0x9d, 0xbb, 0x50, 0x92, 0x5f, 0x6c, 0xb1, 0x9c, 0x4a, 0x7c, 0xd9, 0xc5, + 0x72, 0x2a, 0xf6, 0x89, 0x87, 0x67, 0xd0, 0x23, 0x28, 0x0a, 0x14, 0x5a, 0x1d, 0x27, 0x93, 0x12, + 0x6e, 0xa4, 0x1d, 0x71, 0x01, 0x47, 0x30, 0xa7, 0x0e, 0xb7, 0x68, 0x2d, 0x73, 0x35, 0xc4, 0x45, + 0x4d, 0x5c, 0x1d, 0x85, 0x4a, 0xb1, 0x41, 0x2d, 0xa9, 0x94, 0x3a, 0xb2, 0x26, 0x95, 0x8a, 0x26, + 0x3b, 0x3c, 0x83, 0xfa, 0xec, 0x0f, 0x95, 0xb1, 0x21, 0x05, 0xdd, 0x8e, 0xf3, 0x64, 0x0d, 0x74, + 0x8d, 0x0f, 0xae, 0xa4, 0xe3, 0xf7, 0x34, 0xa1, 0x1c, 0x0e, 0x0a, 0xe8, 0x3d, 0x85, 0x29, 0x39, + 0xb6, 0x34, 0x56, 0xd3, 0x0f, 0x43, 0x1f, 0x88, 0x66, 0x1d, 0xf3, 0x41, 0x7c, 0x20, 0x88, 0xf9, + 0x40, 0xed, 0xed, 0x78, 0x06, 0x3d, 0x01, 0x88, 0xda, 0x2d, 0xba, 0x19, 0x9b, 0x4e, 0x12, 0x0d, + 0xbb, 0xd1, 0xc8, 0x38, 0x95, 0xd6, 0x9f, 0x53, 0xbb, 0x6f, 0xcc, 0x9b, 0x29, 0x6d, 0xb9, 0x51, + 0x53, 0x57, 0x9c, 0xb4, 0x2b, 0xe1, 0x19, 0xf4, 0x18, 0xaa, 0xf1, 0xa6, 0x1c, 0xab, 0x7b, 0xa9, + 0xfd, 0x3a, 0x55, 0xce, 0x4b, 0x96, 0xc6, 0xa9, 0xdd, 0x3a, 0x99, 0xc6, 0x93, 0x5a, 0x7a, 0xaa, + 0x6c, 0x0b, 0x56, 0xd2, 0xfb, 0x2e, 0x4a, 0x24, 0x7d, 0x76, 0xb7, 0x6f, 0xdc, 0x9e, 0x82, 0x92, + 0x59, 0x75, 0xf7, 0xfe, 0x9f, 0xdf, 0xad, 0x69, 0x7f, 0x7f, 0xb7, 0xa6, 0xfd, 0xeb, 0xdd, 0x9a, + 0xf6, 0x9b, 0x7f, 0xaf, 0xcd, 0x00, 0xee, 0x0e, 0xb6, 0xba, 0xc4, 0xb5, 0xb7, 0x0c, 0xcb, 0xec, + 0x92, 0x2d, 0x67, 0x7b, 0x4b, 0x4a, 0x72, 0x47, 0x5d, 0x8f, 0xb8, 0x17, 0xc4, 0x7d, 0x99, 0x1b, + 0x9d, 0x9e, 0x5e, 0x63, 0x7f, 0xd9, 0x7f, 0xf6, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1e, 0xeb, + 0xf5, 0xb9, 0xcc, 0x1f, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3469,6 +3662,8 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) + GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -3595,6 +3790,24 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } +func (c *controlClient) SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) { + out := new(SetEnvironmentPropertiesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetEnvironmentProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) { + out := new(GetEnvironmentPropertiesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironmentProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -3714,6 +3927,8 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + SetEnvironmentProperties(context.Context, *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) + GetEnvironmentProperties(context.Context, *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -3728,6 +3943,80 @@ type ControlServer interface { SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) } +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) SetEnvironmentProperties(ctx context.Context, req *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetEnvironmentProperties not implemented") +} +func (*UnimplementedControlServer) GetEnvironmentProperties(ctx context.Context, req *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironmentProperties not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} + func RegisterControlServer(s *grpc.Server, srv ControlServer) { s.RegisterService(&_Control_serviceDesc, srv) } @@ -3897,53 +4186,89 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) +func _Control_SetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetEnvironmentPropertiesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) + return srv.(ControlServer).SetEnvironmentProperties(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTasks", + FullMethod: "/o2control.Control/SetEnvironmentProperties", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + return srv.(ControlServer).SetEnvironmentProperties(ctx, req.(*SetEnvironmentPropertiesRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) +func _Control_GetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentPropertiesRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) + return srv.(ControlServer).GetEnvironmentProperties(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTask", + FullMethod: "/o2control.Control/GetEnvironmentProperties", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + return srv.(ControlServer).GetEnvironmentProperties(ctx, req.(*GetEnvironmentPropertiesRequest)) } return interceptor(ctx, in, info, handler) } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) + return srv.(ControlServer).GetTasks(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", + FullMethod: "/o2control.Control/GetTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) @@ -4149,6 +4474,14 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, + { + MethodName: "SetEnvironmentProperties", + Handler: _Control_SetEnvironmentProperties_Handler, + }, + { + MethodName: "GetEnvironmentProperties", + Handler: _Control_GetEnvironmentProperties_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -4211,7 +4544,7 @@ var _Control_serviceDesc = grpc.ServiceDesc{ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4219,20 +4552,26 @@ func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { } func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4240,20 +4579,26 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { } func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4261,38 +4606,47 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { } func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.State) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.StatusUpdates) > 0 { - for _, msg := range m.StatusUpdates { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4300,46 +4654,61 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { } func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Level != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Event != nil { - nn1, err := m.Event.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i += nn1 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - i := 0 + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) if m.MesosHeartbeat != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.MesosHeartbeat.Size())) - n2, err := m.MesosHeartbeat.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n2 + i-- + dAtA[i] = 0x12 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4347,20 +4716,26 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4368,53 +4743,62 @@ func (m *Version) Marshal() (dAtA []byte, err error) { } func (m *Version) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Major != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 } - if m.Patch != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a } if len(m.Build) > 0 { - dAtA[i] = 0x22 - i++ + i -= len(m.Build) + copy(dAtA[i:], m.Build) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i += copy(dAtA[i:], m.Build) + i-- + dAtA[i] = 0x22 } - if len(m.ProductName) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i += copy(dAtA[i:], m.ProductName) + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 } - if len(m.VersionStr) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i += copy(dAtA[i:], m.VersionStr) + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4422,63 +4806,74 @@ func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { } func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) - } - if m.EnvironmentsCount != 0 { - dAtA[i] = 0x10 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.TasksCount != 0 { - dAtA[i] = 0x18 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 } if m.HostsCount != 0 { - dAtA[i] = 0x28 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } - if len(m.InstanceName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i += copy(dAtA[i:], m.InstanceName) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 } - if m.Version != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Version.Size())) - n3, err := m.Version.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n3 + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 } - return i, nil + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4486,26 +4881,33 @@ func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { } func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Reason) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i += copy(dAtA[i:], m.Reason) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4513,20 +4915,26 @@ func (m *TeardownReply) Marshal() (dAtA []byte, err error) { } func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4534,20 +4942,26 @@ func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4555,38 +4969,47 @@ func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FrameworkId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i += copy(dAtA[i:], m.FrameworkId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Environments) > 0 { - for _, msg := range m.Environments { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x12 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4594,61 +5017,73 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.CreatedWhen) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i += copy(dAtA[i:], m.CreatedWhen) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a } if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x22 } } - if len(m.RootRole) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i += copy(dAtA[i:], m.RootRole) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - if m.CurrentRunNumber != 0 { - dAtA[i] = 0x30 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4656,26 +5091,52 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int - _ = i + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } if len(m.WorkflowTemplate) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i += copy(dAtA[i:], m.WorkflowTemplate) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4683,30 +5144,38 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n4, err := m.Environment.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n4 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4714,26 +5183,33 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Id) + copy(dAtA[i:], m.Id) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4741,40 +5217,50 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Environment != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Environment.Size())) - n5, err := m.Environment.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n5 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Workflow != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Workflow.Size())) - n6, err := m.Workflow.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n6 + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4782,31 +5268,38 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Type != 0 { - dAtA[i] = 0x10 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4814,37 +5307,45 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.CurrentRunNumber != 0 { - dAtA[i] = 0x18 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4852,48 +5353,57 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) - } - if len(m.Operations) > 0 { - for _, msg := range m.Operations { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.ReconfigureAll { - dAtA[i] = 0x18 - i++ + i-- if m.ReconfigureAll { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x18 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4901,31 +5411,38 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { } func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.RoleName) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i += copy(dAtA[i:], m.RoleName) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4933,44 +5450,54 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.FailedOperations) > 0 { - for _, msg := range m.FailedOperations { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } - } - if len(m.Id) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -4978,36 +5505,43 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Id) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i += copy(dAtA[i:], m.Id) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.KeepTasks { - dAtA[i] = 0x10 - i++ + i-- if m.KeepTasks { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5015,898 +5549,1239 @@ func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { } func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.CleanupTasksReply != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CleanupTasksReply.Size())) - n7, err := m.CleanupTasksReply.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n7 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if m.Locked { - dAtA[i] = 0x10 - i++ - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if len(m.TaskId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) - } - if len(m.Status) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) - } - if len(m.State) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.ClassName) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i += copy(dAtA[i:], m.ClassName) - } - if m.DeploymentInfo != nil { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.DeploymentInfo.Size())) - n8, err := m.DeploymentInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 } - i += n8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Hostname) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i += copy(dAtA[i:], m.Hostname) - } - if len(m.AgentId) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i += copy(dAtA[i:], m.AgentId) - } - if len(m.OfferId) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i += copy(dAtA[i:], m.OfferId) - } - if len(m.ExecutorId) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i += copy(dAtA[i:], m.ExecutorId) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.ExcludeGlobals { + i-- + if m.ExcludeGlobals { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Queries) > 0 { + for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Queries[iNdEx]) + copy(dAtA[i:], m.Queries[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Tasks) > 0 { - for _, msg := range m.Tasks { + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { +func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } if len(m.TaskId) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i += copy(dAtA[i:], m.TaskId) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { +func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Task != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Task.Size())) - n9, err := m.Task.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n9 - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 + } + if len(m.OfferId) > 0 { + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i-- + dAtA[i] = 0x1a + } + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.ControlMode) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i += copy(dAtA[i:], m.ControlMode) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } - if m.Shell { - dAtA[i] = 0x10 - i++ - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i++ - } - if len(m.Value) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - dAtA[i] = 0x22 - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + i-- + dAtA[i] = 0xa } } - if len(m.User) > 0 { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i += copy(dAtA[i:], m.User) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) - } - if len(m.Type) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i += copy(dAtA[i:], m.Type) - } - if len(m.Target) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i += copy(dAtA[i:], m.Target) - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { +func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.ShortInfo != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ShortInfo.Size())) - n10, err := m.ShortInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n10 - } - if m.ClassInfo != nil { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.ClassInfo.Size())) - n11, err := m.ClassInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n11 - } - if len(m.InboundChannels) > 0 { - for _, msg := range m.InboundChannels { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.OutboundChannels) > 0 { - for _, msg := range m.OutboundChannels { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if m.Task != nil { + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n - } - } - if m.CommandInfo != nil { - dAtA[i] = 0x2a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.CommandInfo.Size())) - n12, err := m.CommandInfo.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n12 - } - if len(m.TaskPath) > 0 { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i += copy(dAtA[i:], m.TaskPath) - } - if len(m.EnvId) > 0 { - dAtA[i] = 0x3a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0xa - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ - } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) - } - } if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.ControlMode) > 0 { + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { +func (m *CommandInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, msg := range m.KilledTasks { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 } } - if len(m.RunningTasks) > 0 { - for _, msg := range m.RunningTasks { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a + } + if m.Shell { + i-- + if m.Shell { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { +func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.EnvId) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i += copy(dAtA[i:], m.EnvId) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.PathSpec) > 0 { + if len(m.Target) > 0 { + i -= len(m.Target) + copy(dAtA[i:], m.Target) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i-- + dAtA[i] = 0x1a + } + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i += copy(dAtA[i:], m.PathSpec) } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { +func (m *TaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Status) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i += copy(dAtA[i:], m.Status) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - if len(m.State) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 } - if len(m.FullPath) > 0 { - dAtA[i] = 0x22 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i += copy(dAtA[i:], m.FullPath) + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - dAtA[i] = 0x2a - i++ - l = len(s) - for l >= 1<<7 { - dAtA[i] = uint8(uint64(l)&0x7f | 0x80) - l >>= 7 - i++ + if len(m.OutboundChannels) > 0 { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - dAtA[i] = uint8(l) - i++ - i += copy(dAtA[i:], s) + i-- + dAtA[i] = 0x22 } } - if len(m.Roles) > 0 { - for _, msg := range m.Roles { - dAtA[i] = 0x32 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } - i += n + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { +func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Roles) > 0 { - for _, msg := range m.Roles { + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { +func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.RepoPattern) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i += copy(dAtA[i:], m.RepoPattern) - } - if len(m.RevisionPattern) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i += copy(dAtA[i:], m.RevisionPattern) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllBranches { - dAtA[i] = 0x18 - i++ - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.RunningTasks) > 0 { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } - i++ } - if m.AllTags { - dAtA[i] = 0x20 - i++ - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - i++ - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { +func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repo) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i += copy(dAtA[i:], m.Repo) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Template) > 0 { + if len(m.PathSpec) > 0 { + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i-- dAtA[i] = 0x12 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i += copy(dAtA[i:], m.Template) - } - if len(m.Revision) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { +func (m *RoleInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.WorkflowTemplates) > 0 { - for _, msg := range m.WorkflowTemplates { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x32 } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } + if len(m.FullPath) > 0 { + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i-- + dAtA[i] = 0x22 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { +func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { +func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } return dAtA[:n], nil } -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - var i int +func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Default { - dAtA[i] = 0x10 - i++ - if m.Default { + if m.AllTags { + i-- + if m.AllTags { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if len(m.DefaultRevision) > 0 { + if m.AllBranches { + i-- + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 + } + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- dAtA[i] = 0x1a - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i += copy(dAtA[i:], m.DefaultRevision) } + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 + } + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.WorkflowTemplates) > 0 { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + +func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *RepoInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x1a } - return i, nil + if m.Default { + i-- + if m.Default { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } func (m *ListReposReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5914,38 +6789,47 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { } func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Repos) > 0 { - for _, msg := range m.Repos { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err - } - i += n - } + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.GlobalDefaultRevision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.GlobalDefaultRevision) + copy(dAtA[i:], m.GlobalDefaultRevision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i += copy(dAtA[i:], m.GlobalDefaultRevision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Repos) > 0 { + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5953,32 +6837,40 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Name) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i += copy(dAtA[i:], m.Name) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.DefaultRevision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i += copy(dAtA[i:], m.DefaultRevision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -5986,32 +6878,40 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { } func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.NewDefaultRevision) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i += copy(dAtA[i:], m.NewDefaultRevision) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Info) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Info) + copy(dAtA[i:], m.Info) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i += copy(dAtA[i:], m.Info) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.NewDefaultRevision) > 0 { + i -= len(m.NewDefaultRevision) + copy(dAtA[i:], m.NewDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6019,25 +6919,31 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6045,26 +6951,33 @@ func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { } func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.NewDefaultRepo) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i += copy(dAtA[i:], m.NewDefaultRepo) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6072,25 +6985,31 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { } func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6098,25 +7017,31 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { } func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Index != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6124,26 +7049,33 @@ func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { } func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Revision) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6151,31 +7083,38 @@ func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { } func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Index != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Revision) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i += copy(dAtA[i:], m.Revision) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6183,26 +7122,33 @@ func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { } func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.Info) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.Info) + copy(dAtA[i:], m.Info) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i += copy(dAtA[i:], m.Info) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *Empty) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -6210,24 +7156,32 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { } func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *Event_MesosHeartbeat) Size() (n int) { if m == nil { @@ -6496,6 +7450,14 @@ func (m *NewEnvironmentRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -6701,6 +7663,87 @@ func (m *DestroyEnvironmentReply) Size() (n int) { return n } +func (m *SetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Queries) > 0 { + for _, s := range m.Queries { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ExcludeGlobals { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *ShortTaskInfo) Size() (n int) { if m == nil { return 0 @@ -7363,14 +8406,7 @@ func (m *Empty) Size() (n int) { } func sovO2Control(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozO2Control(x uint64) (n int) { return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -7573,8 +8609,620 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) + if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusUpdate) 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 ErrIntOverflowO2Control + } + 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: StatusUpdate: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= StatusUpdate_Level(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Event_MesosHeartbeat{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &StatusUpdate_MesosHeartbeat{v} + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control + } + 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: GetFrameworkInfoRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Version) 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 ErrIntOverflowO2Control + } + 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: Version: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) + } + m.Major = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Major |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) + } + m.Minor = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Minor |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) + } + m.Patch = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Patch |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Build = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ProductName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.VersionStr = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control + } + 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: GetFrameworkInfoReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.FrameworkId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) + } + m.EnvironmentsCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EnvironmentsCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) + } + m.TasksCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.TasksCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) + } + m.HostsCount = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.HostsCount |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.InstanceName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Version == nil { + m.Version = &Version{} + } + if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -7603,7 +9251,7 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *StatusUpdate) Unmarshal(dAtA []byte) error { +func (m *TeardownRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7626,36 +9274,17 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: TeardownRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -7665,26 +9294,23 @@ func (m *StatusUpdate) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} + m.Reason = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -7711,7 +9337,7 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { +func (m *TeardownReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7734,10 +9360,10 @@ func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: wiretype end group for non-group") + return fmt.Errorf("proto: TeardownReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { default: @@ -7765,7 +9391,7 @@ func (m *GetFrameworkInfoRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *Version) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7788,104 +9414,69 @@ func (m *Version) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Version: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentsRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control + } + 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: GetEnvironmentsReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -7913,13 +9504,13 @@ func (m *Version) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ProductName = string(dAtA[iNdEx:postIndex]) + m.FrameworkId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 6: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -7929,23 +9520,25 @@ func (m *Version) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.VersionStr = string(dAtA[iNdEx:postIndex]) + m.Environments = append(m.Environments, &EnvironmentInfo{}) + if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -7972,7 +9565,7 @@ func (m *Version) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { +func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -7995,15 +9588,15 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetFrameworkInfoReply: wiretype end group for non-group") + return fmt.Errorf("proto: EnvironmentInfo: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvironmentInfo: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8031,13 +9624,13 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.FrameworkId = 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 EnvironmentsCount", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) } - m.EnvironmentsCount = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8047,31 +9640,25 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF } - case 4: + m.CreatedWhen = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -8103,11 +9690,11 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) } - m.HostsCount = 0 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8117,14 +9704,29 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - case 6: + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Tasks = append(m.Tasks, &ShortTaskInfo{}) + if err := m.Tasks[len(m.Tasks)-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 InstanceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RootRole", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8152,13 +9754,13 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.InstanceName = string(dAtA[iNdEx:postIndex]) + m.RootRole = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var msglen int + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8168,28 +9770,11 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8215,7 +9800,7 @@ func (m *GetFrameworkInfoReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *TeardownRequest) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8238,15 +9823,15 @@ func (m *TeardownRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: TeardownRequest: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8274,116 +9859,135 @@ func (m *TeardownRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Reason = string(dAtA[iNdEx:postIndex]) + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - if skippy < 0 { + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + if m.Properties == nil { + m.Properties = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + m.Properties[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8409,7 +10013,7 @@ func (m *GetEnvironmentsRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8432,47 +10036,15 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentReply: wiretype end group for non-group") } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: + if fieldNum <= 0 { + return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8499,8 +10071,10 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -8529,7 +10103,7 @@ func (m *GetEnvironmentsReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8552,10 +10126,10 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvironmentInfo: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -8590,73 +10164,63 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - stringLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - intStringLen := int(stringLen) - if intStringLen < 0 { + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control } - if postIndex > l { + if iNdEx >= l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: + 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: GetEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8683,16 +10247,18 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RootRole", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8702,43 +10268,28 @@ func (m *EnvironmentInfo) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + if m.Workflow == nil { + m.Workflow = &RoleInfo{} } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } + if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8764,7 +10315,7 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { } return nil } -func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8787,15 +10338,15 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -8823,67 +10374,13 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - var msglen int + m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8893,28 +10390,11 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + if b < 0x80 { + break + } } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -8940,7 +10420,7 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8963,10 +10443,10 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9001,6 +10481,57 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + } + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9026,7 +10557,7 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9049,17 +10580,17 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: ModifyEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ModifyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9069,31 +10600,27 @@ func (m *GetEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9120,13 +10647,31 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + m.Operations = append(m.Operations, &EnvironmentOperation{}) + if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.ReconfigureAll = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9152,7 +10697,7 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9175,17 +10720,17 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: EnvironmentOperation: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: EnvironmentOperation: 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) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) } - var stringLen uint64 + m.Type = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9195,29 +10740,16 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) } - m.Type = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9227,11 +10759,24 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RoleName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9257,7 +10802,7 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9280,17 +10825,17 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: ModifyEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ModifyEnvironmentReply: 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 FailedOperations", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9300,27 +10845,29 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) + if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -9348,13 +10895,13 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - m.CurrentRunNumber = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9364,11 +10911,24 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9394,7 +10954,7 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9417,10 +10977,10 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: DestroyEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DestroyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9456,42 +11016,8 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -9508,7 +11034,7 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { break } } - m.ReconfigureAll = bool(v != 0) + m.KeepTasks = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9534,7 +11060,7 @@ func (m *ModifyEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { +func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9557,36 +11083,17 @@ func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: EnvironmentOperation: wiretype end group for non-group") + return fmt.Errorf("proto: DestroyEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9596,23 +11103,27 @@ func (m *EnvironmentOperation) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.RoleName = string(dAtA[iNdEx:postIndex]) + if m.CleanupTasksReply == nil { + m.CleanupTasksReply = &CleanupTasksReply{} + } + if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex default: iNdEx = preIndex @@ -9639,7 +11150,7 @@ func (m *EnvironmentOperation) Unmarshal(dAtA []byte) error { } return nil } -func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *SetEnvironmentPropertiesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9662,17 +11173,17 @@ func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ModifyEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9682,31 +11193,29 @@ func (m *ModifyEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9716,56 +11225,173 @@ func (m *ModifyEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + if m.Properties == nil { + m.Properties = make(map[string]string) } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy } } - intStringLen := int(stringLen) - if intStringLen < 0 { + m.Properties[mapkey] = mapvalue + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { return ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen - if postIndex < 0 { + if (iNdEx + skippy) < 0 { return ErrInvalidLengthO2Control } - if postIndex > l { + if (iNdEx + skippy) > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control + } + 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9791,7 +11417,7 @@ func (m *ModifyEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentPropertiesRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9814,10 +11440,10 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -9853,8 +11479,40 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 3: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -9871,7 +11529,7 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { break } } - m.KeepTasks = bool(v != 0) + m.ExcludeGlobals = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -9897,7 +11555,7 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentPropertiesReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -9920,15 +11578,15 @@ func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: DestroyEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentPropertiesReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9955,12 +11613,103 @@ func (m *DestroyEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + if m.Properties == nil { + m.Properties = make(map[string]string) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.Properties[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -13766,6 +15515,7 @@ func (m *Empty) Unmarshal(dAtA []byte) error { func skipO2Control(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -13797,10 +15547,8 @@ func skipO2Control(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -13821,55 +15569,30 @@ func skipO2Control(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthO2Control } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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 := skipO2Control(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupO2Control + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthO2Control + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") ) diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 7f71e6750..d452f8ed8 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -8,8 +8,11 @@ import ( fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" io "io" math "math" + math_bits "math/bits" ) // Reference imports to suppress errors if they are not otherwise used. @@ -21,7 +24,7 @@ var _ = math.Inf // 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.ProtoPackageIsVersion2 // please upgrade the proto package +const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package type StateChangeTrigger int32 @@ -124,7 +127,7 @@ func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -165,7 +168,7 @@ func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -218,7 +221,7 @@ func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -258,7 +261,7 @@ func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -305,7 +308,7 @@ func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -351,7 +354,7 @@ func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -391,7 +394,7 @@ func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -439,7 +442,7 @@ func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -495,7 +498,7 @@ func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -559,7 +562,7 @@ func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] - n, err := m.MarshalTo(b) + n, err := m.MarshalToSizedBuffer(b) if err != nil { return nil, err } @@ -787,6 +790,23 @@ type OccServer interface { Transition(context.Context, *TransitionRequest) (*TransitionReply, error) } +// UnimplementedOccServer can be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + func RegisterOccServer(s *grpc.Server, srv OccServer) { s.RegisterService(&_Occ_serviceDesc, srv) } @@ -900,7 +920,7 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -908,20 +928,26 @@ func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -929,31 +955,38 @@ func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { } func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Type != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -961,20 +994,26 @@ func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { } func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -982,25 +1021,31 @@ func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { } func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Type != 0 { - dAtA[i] = 0x8 - i++ i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) - } - return i, nil + return len(dAtA) - i, nil } func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1008,30 +1053,38 @@ func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { } func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if m.Event != nil { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Event.Size())) - n1, err := m.Event.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n1 - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1039,20 +1092,26 @@ func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { } func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return i, nil + return len(dAtA) - i, nil } func (m *GetStateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1060,26 +1119,33 @@ func (m *GetStateReply) Marshal() (dAtA []byte, err error) { } func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } if len(m.State) > 0 { - dAtA[i] = 0xa - i++ + i -= len(m.State) + copy(dAtA[i:], m.State) i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1087,32 +1153,40 @@ func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { } func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.Key) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i += copy(dAtA[i:], m.Key) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Value) > 0 { - dAtA[i] = 0x12 - i++ + i -= len(m.Value) + copy(dAtA[i:], m.Value) i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i += copy(dAtA[i:], m.Value) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1120,44 +1194,54 @@ func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { } func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if len(m.SrcState) > 0 { - dAtA[i] = 0xa - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i += copy(dAtA[i:], m.SrcState) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if len(m.Arguments) > 0 { - for _, msg := range m.Arguments { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(msg.Size())) - n, err := msg.MarshalTo(dAtA[i:]) - if err != nil { - return 0, err + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) } - i += n + i-- + dAtA[i] = 0x1a } } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x12 + } + if len(m.SrcState) > 0 { + i -= len(m.SrcState) + copy(dAtA[i:], m.SrcState) + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i-- + dAtA[i] = 0xa } - return i, nil + return len(dAtA) - i, nil } func (m *TransitionReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) - n, err := m.MarshalTo(dAtA) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) if err != nil { return nil, err } @@ -1165,51 +1249,61 @@ func (m *TransitionReply) Marshal() (dAtA []byte, err error) { } func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - var i int + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) _ = i var l int _ = l - if m.Trigger != 0 { - dAtA[i] = 0x8 - i++ - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - } - if len(m.State) > 0 { - dAtA[i] = 0x12 - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i += copy(dAtA[i:], m.State) - } - if len(m.TransitionEvent) > 0 { - dAtA[i] = 0x1a - i++ - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i += copy(dAtA[i:], m.TransitionEvent) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } if m.Ok { - dAtA[i] = 0x20 - i++ + i-- if m.Ok { dAtA[i] = 1 } else { dAtA[i] = 0 } - i++ + i-- + dAtA[i] = 0x20 } - if m.XXX_unrecognized != nil { - i += copy(dAtA[i:], m.XXX_unrecognized) + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x1a } - return i, nil + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Trigger != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { + offset -= sovOcc(v) + base := offset for v >= 1<<7 { dAtA[offset] = uint8(v&0x7f | 0x80) v >>= 7 offset++ } dAtA[offset] = uint8(v) - return offset + 1 + return base } func (m *StateStreamRequest) Size() (n int) { if m == nil { @@ -1386,14 +1480,7 @@ func (m *TransitionReply) Size() (n int) { } func sovOcc(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n + return (math_bits.Len64(x|1) + 6) / 7 } func sozOcc(x uint64) (n int) { return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) @@ -2344,6 +2431,7 @@ func (m *TransitionReply) Unmarshal(dAtA []byte) error { func skipOcc(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 + depth := 0 for iNdEx < l { var wire uint64 for shift := uint(0); ; shift += 7 { @@ -2375,10 +2463,8 @@ func skipOcc(dAtA []byte) (n int, err error) { break } } - return iNdEx, nil case 1: iNdEx += 8 - return iNdEx, nil case 2: var length int for shift := uint(0); ; shift += 7 { @@ -2399,55 +2485,30 @@ func skipOcc(dAtA []byte) (n int, err error) { return 0, ErrInvalidLengthOcc } iNdEx += length - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - return iNdEx, nil case 3: - for { - var innerWire uint64 - var start int = iNdEx - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - 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 := skipOcc(dAtA[start:]) - if err != nil { - return 0, err - } - iNdEx = start + next - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - } - return iNdEx, nil + depth++ case 4: - return iNdEx, nil + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupOcc + } + depth-- case 5: iNdEx += 4 - return iNdEx, nil default: return 0, fmt.Errorf("proto: illegal wireType %d", wireType) } + if iNdEx < 0 { + return 0, ErrInvalidLengthOcc + } + if depth == 0 { + return iNdEx, nil + } } - panic("unreachable") + return 0, io.ErrUnexpectedEOF } var ( - ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") + ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") ) diff --git a/go.mod b/go.mod index f2b113929..e938089e0 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect - google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 // indirect + google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 // indirect google.golang.org/grpc v1.26.0 gopkg.in/ini.v1 v1.51.1 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 diff --git a/go.sum b/go.sum index c97f4cfc9..fc131cbef 100644 --- a/go.sum +++ b/go.sum @@ -523,6 +523,8 @@ google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT0QnZDg9Uc2dH0Ql513kFvHocz+WM= google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= From 69c25ec4d3234cecf706f32b0d8ea4bf584246b8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jan 2020 02:57:17 +0100 Subject: [PATCH 0109/2352] [common] Make gera.Map implement yaml.Unmarshaler --- common/gera/map.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/common/gera/map.go b/common/gera/map.go index 048ddb18b..f16859363 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -28,9 +28,13 @@ // Values in child maps override any value provided by a gera.Map that's wrapped in the hierarchy. package gera -import "github.com/imdario/mergo" +import ( + "github.com/imdario/mergo" + "gopkg.in/yaml.v2" +) type Map interface{ + yaml.Unmarshaler Wrap(m Map) Map IsHierarchyRoot() bool HierarchyContains(m Map) bool @@ -68,6 +72,18 @@ type WrapMap struct { parent Map } +func (w *WrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { + m := make(map[string]interface{}) + err := unmarshal(&m) + if err == nil { + *w = WrapMap{ + theMap: m, + parent: nil, + } + } + return err +} + func (w *WrapMap) IsHierarchyRoot() bool { if w == nil || w.parent != nil { return false From af0e384c2fb9b98d0f6284e7ee9476c7e1be3ed5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Feb 2020 17:26:29 +0100 Subject: [PATCH 0110/2352] [core] Update proto and regenerate --- coconut/protos/o2control.pb.go | 411 ++++++++++++++------------------- core/protos/o2control.pb.go | 411 ++++++++++++++------------------- core/protos/o2control.proto | 6 +- 3 files changed, 341 insertions(+), 487 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 97a686170..a3dcb3d93 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -838,7 +838,7 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -884,9 +884,9 @@ func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { return "" } -func (m *NewEnvironmentRequest) GetProperties() map[string]string { +func (m *NewEnvironmentRequest) GetVars() map[string]string { if m != nil { - return m.Properties + return m.Vars } return nil } @@ -3429,7 +3429,7 @@ func init() { proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.PropertiesEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -3482,163 +3482,162 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2486 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x5d, 0x6f, 0x1b, 0x59, - 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x3a, 0xde, 0x36, 0xc9, 0x5e, 0x56, - 0xdd, 0xb4, 0xbb, 0xa4, 0xbb, 0xd9, 0x15, 0x94, 0x6a, 0x4b, 0xc9, 0x87, 0xeb, 0x06, 0x9a, 0x38, - 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0xe3, 0xd9, 0x8c, 0x67, 0xdc, 0xf9, 0x48, 0x9b, - 0x07, 0xde, 0x78, 0x43, 0x88, 0x07, 0x5e, 0x78, 0x45, 0x08, 0xf1, 0xc4, 0x3b, 0x3f, 0x81, 0x07, - 0x10, 0x20, 0xf1, 0x03, 0x50, 0x91, 0x78, 0xe2, 0x47, 0xa0, 0xfb, 0x35, 0x73, 0x67, 0x3c, 0xe3, - 0x78, 0x85, 0xf6, 0xcd, 0xe7, 0xdc, 0x73, 0xce, 0xbd, 0xe7, 0xfb, 0xcc, 0x31, 0xac, 0x8c, 0x5c, - 0xc7, 0x77, 0xbc, 0x7b, 0xce, 0x76, 0xd7, 0xb1, 0x7d, 0xd7, 0xb1, 0xb6, 0x18, 0x02, 0x95, 0x43, - 0x04, 0x5e, 0x81, 0xe5, 0xe6, 0x05, 0xb1, 0xfd, 0x57, 0x87, 0xc4, 0x73, 0xbc, 0x27, 0xc4, 0x70, - 0xfd, 0x53, 0x62, 0xf8, 0x78, 0x01, 0xe6, 0x4f, 0x7c, 0xc3, 0x0f, 0x3c, 0x9d, 0xbc, 0x0e, 0x88, - 0xe7, 0xe3, 0x53, 0xa8, 0x48, 0xc4, 0xc8, 0xba, 0x44, 0xcb, 0x50, 0xf0, 0x7c, 0xc3, 0x27, 0x75, - 0x6d, 0x43, 0xdb, 0x2c, 0xeb, 0x1c, 0x40, 0x0f, 0x61, 0xde, 0x63, 0x44, 0xcf, 0x46, 0x3d, 0xc3, - 0x27, 0x5e, 0x3d, 0xb7, 0x31, 0xbb, 0x59, 0xd9, 0xbe, 0xb1, 0x15, 0xbd, 0xe0, 0x44, 0x39, 0xd7, - 0xe3, 0xd4, 0xf8, 0xaf, 0x1a, 0xcc, 0xa9, 0xe7, 0xe8, 0x33, 0x28, 0x58, 0xe4, 0x82, 0x58, 0xec, - 0x96, 0xea, 0xf6, 0xad, 0x0c, 0x39, 0x5b, 0x4f, 0x29, 0x91, 0xce, 0x69, 0xd1, 0x01, 0x54, 0x87, - 0x31, 0x65, 0xea, 0xb9, 0x0d, 0x6d, 0xb3, 0xb2, 0xbd, 0xae, 0x70, 0xa7, 0xe9, 0xfc, 0x64, 0x46, - 0x4f, 0x30, 0xe2, 0xcf, 0xa1, 0xc0, 0x44, 0xa3, 0x32, 0x14, 0xf6, 0x9b, 0xbb, 0xcf, 0x5a, 0xb5, - 0x19, 0x54, 0x82, 0xfc, 0xc1, 0xd1, 0xe3, 0x76, 0x4d, 0x43, 0x15, 0x28, 0xbe, 0xd8, 0xd1, 0x8f, - 0x0e, 0x8e, 0x5a, 0xb5, 0x1c, 0xa5, 0x68, 0xea, 0x7a, 0x5b, 0xaf, 0xcd, 0xee, 0x16, 0xa1, 0xc0, - 0xe4, 0xe3, 0x55, 0xb8, 0xd1, 0x22, 0xfe, 0x63, 0xd7, 0x18, 0x92, 0x37, 0x8e, 0x7b, 0x7e, 0x60, - 0xf7, 0x1d, 0x69, 0xce, 0xdf, 0x69, 0x50, 0x7c, 0x4e, 0x5c, 0xcf, 0x74, 0x6c, 0x6a, 0xcb, 0xa1, - 0xf1, 0xa5, 0xe3, 0x32, 0x2d, 0x0b, 0x3a, 0x07, 0x18, 0xd6, 0xb4, 0x1d, 0x97, 0xbd, 0x9e, 0x62, - 0x29, 0x40, 0xb1, 0x23, 0xc3, 0xef, 0x0e, 0xea, 0xb3, 0x1c, 0xcb, 0x00, 0x8a, 0x3d, 0x0d, 0x4c, - 0xab, 0x57, 0xcf, 0x73, 0x6f, 0x30, 0x00, 0x6d, 0x40, 0x65, 0xe4, 0x3a, 0xbd, 0xa0, 0xeb, 0x1f, - 0x19, 0x43, 0x52, 0x2f, 0xb0, 0x33, 0x15, 0x85, 0xd6, 0x00, 0x2e, 0xf8, 0x23, 0x4e, 0x7c, 0xb7, - 0x7e, 0x8d, 0x11, 0x28, 0x18, 0xfc, 0xab, 0x1c, 0x5c, 0x1f, 0xd7, 0x80, 0xfa, 0x7f, 0x03, 0x2a, - 0xfd, 0x10, 0xdb, 0x13, 0x51, 0xa0, 0xa2, 0xd0, 0xc7, 0xb0, 0x48, 0xec, 0x0b, 0xd3, 0x75, 0xec, - 0x21, 0xb1, 0x7d, 0x6f, 0xcf, 0x09, 0x6c, 0x5f, 0xe8, 0x32, 0x7e, 0x40, 0x5f, 0xe2, 0x1b, 0xde, - 0xb9, 0x20, 0xe3, 0xca, 0x29, 0x98, 0x28, 0xde, 0xf2, 0x6a, 0xbc, 0xad, 0x01, 0x0c, 0x1c, 0x4f, - 0x0a, 0x2f, 0x70, 0xae, 0x08, 0x83, 0x30, 0xcc, 0x99, 0xb6, 0xe7, 0x1b, 0x76, 0x97, 0x30, 0x13, - 0x70, 0x0d, 0x63, 0x38, 0xf4, 0x31, 0x14, 0x85, 0xc6, 0xf5, 0x22, 0x8b, 0x13, 0xa4, 0xc4, 0x89, - 0x70, 0x91, 0x2e, 0x49, 0xf0, 0x1d, 0x58, 0xe8, 0x10, 0xc3, 0xed, 0x39, 0x6f, 0x6c, 0xe1, 0x4a, - 0xb4, 0x02, 0xd7, 0x5c, 0x62, 0x78, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, 0x42, 0x11, 0xe9, 0xc8, - 0xba, 0xc4, 0x75, 0x58, 0x69, 0x11, 0xbf, 0xa9, 0xe8, 0x2e, 0xa3, 0xe1, 0x2d, 0x2c, 0x8f, 0x9d, - 0x4c, 0x67, 0xe5, 0xef, 0xc2, 0x9c, 0x6a, 0x4c, 0x91, 0x70, 0x0d, 0x35, 0xd4, 0xa3, 0x63, 0xe6, - 0xbe, 0x18, 0x3d, 0xfe, 0x87, 0x06, 0x0b, 0x09, 0x0a, 0x54, 0x85, 0x9c, 0x29, 0x2f, 0xcb, 0x99, - 0x2c, 0x8e, 0xba, 0x2e, 0x31, 0x7c, 0xd2, 0x7b, 0x31, 0x20, 0x36, 0xf3, 0x61, 0x59, 0x57, 0x51, - 0x91, 0x77, 0x66, 0x55, 0xef, 0x6c, 0x41, 0x81, 0x79, 0xb0, 0x9e, 0x67, 0x8f, 0xaa, 0xab, 0xd9, - 0x3b, 0x70, 0x5c, 0xbf, 0x63, 0x78, 0x3c, 0xa2, 0x38, 0x19, 0x6a, 0x40, 0xc9, 0x75, 0x1c, 0x5f, - 0x77, 0x2c, 0x19, 0xac, 0x21, 0x8c, 0xee, 0x42, 0xad, 0x1b, 0xb8, 0x2e, 0xb1, 0x7d, 0x3d, 0xb0, - 0x8f, 0x82, 0xe1, 0x29, 0xe1, 0xf1, 0x3a, 0xaf, 0x8f, 0xe1, 0xf1, 0x3f, 0x35, 0xb8, 0x7e, 0x44, - 0xde, 0x28, 0x6a, 0x49, 0x57, 0xdd, 0x85, 0x1a, 0xb5, 0x5b, 0xdf, 0x72, 0xde, 0x74, 0xc8, 0x70, - 0x64, 0x45, 0x05, 0x6c, 0x0c, 0x8f, 0x8e, 0x01, 0x46, 0xae, 0x33, 0x22, 0xae, 0x6f, 0x86, 0x85, - 0xec, 0x13, 0x45, 0x85, 0xd4, 0x1b, 0xb6, 0x8e, 0x43, 0x96, 0xa6, 0xed, 0xbb, 0x97, 0xba, 0x22, - 0xa3, 0xf1, 0x10, 0x16, 0x12, 0xc7, 0xa8, 0x06, 0xb3, 0xe7, 0xe4, 0x52, 0xbc, 0x81, 0xfe, 0xa4, - 0xa6, 0xbc, 0x30, 0xac, 0x80, 0x08, 0x33, 0x73, 0xe0, 0x41, 0xee, 0xbe, 0x86, 0x4f, 0x60, 0x29, - 0x79, 0x27, 0x8d, 0x91, 0x2f, 0xa0, 0xa2, 0x78, 0x94, 0x89, 0x9a, 0x1c, 0x00, 0x2a, 0x39, 0xfe, - 0x90, 0x25, 0x78, 0x8a, 0xa9, 0x12, 0x41, 0x80, 0x7f, 0xae, 0xc1, 0x52, 0x92, 0xf2, 0xff, 0xbe, - 0x1e, 0xdd, 0x83, 0x92, 0x34, 0xbc, 0xa8, 0xd2, 0x4b, 0x0a, 0x2b, 0xf5, 0x3c, 0xe3, 0x09, 0x89, - 0xf0, 0xdf, 0x34, 0x58, 0xdd, 0xe3, 0xc7, 0x57, 0x3f, 0x1a, 0x3d, 0x82, 0xbc, 0x7f, 0x39, 0xe2, - 0xb6, 0xac, 0x6e, 0x7f, 0xa4, 0x88, 0xce, 0x94, 0xb1, 0xd5, 0x1e, 0x51, 0x16, 0x9d, 0x31, 0x62, - 0x03, 0xae, 0x71, 0x98, 0x96, 0xfd, 0xa3, 0x76, 0xfb, 0xb8, 0x36, 0x83, 0x10, 0x54, 0x4f, 0x3a, - 0x3b, 0x7a, 0xe7, 0xd5, 0xce, 0x5e, 0xe7, 0xe0, 0xf9, 0x41, 0xe7, 0xc7, 0x35, 0x0d, 0x2d, 0xc2, - 0xfc, 0x49, 0xa7, 0x7d, 0x1c, 0xa1, 0x72, 0x68, 0x1e, 0xca, 0x7b, 0xed, 0xa3, 0xc7, 0x07, 0xad, - 0x67, 0x7a, 0xb3, 0x36, 0x4b, 0xfb, 0x83, 0xde, 0x3c, 0x69, 0x76, 0x6a, 0x79, 0x34, 0x07, 0xa5, - 0x56, 0xfb, 0x15, 0xef, 0x16, 0x05, 0x7c, 0x0e, 0x37, 0xd2, 0x1e, 0x43, 0x6d, 0x9b, 0x54, 0x27, - 0x4c, 0xb3, 0x9c, 0x9a, 0x66, 0x69, 0xa9, 0x31, 0x9b, 0x91, 0x1a, 0xbf, 0xd6, 0xa0, 0x7e, 0xe8, - 0xf4, 0xcc, 0xfe, 0xe5, 0x54, 0xd6, 0x03, 0x1a, 0xad, 0x86, 0x6f, 0x3a, 0xb6, 0xcc, 0x80, 0xf5, - 0x74, 0xcf, 0xb6, 0x25, 0x9d, 0xae, 0xb0, 0xa0, 0xdb, 0x50, 0x75, 0x49, 0xd7, 0xb1, 0xfb, 0xe6, - 0x59, 0xe0, 0x92, 0x1d, 0xcb, 0x62, 0xef, 0x2a, 0xe9, 0x09, 0x2c, 0xfe, 0xad, 0x06, 0xcb, 0x69, - 0xc2, 0xd0, 0x03, 0xe1, 0x3f, 0xde, 0xfe, 0x6f, 0x5f, 0x71, 0x77, 0xcc, 0x75, 0xbc, 0x9a, 0x58, - 0xbc, 0xee, 0xe7, 0x64, 0x35, 0xe1, 0x30, 0xfe, 0x34, 0xc5, 0xad, 0x0b, 0x50, 0xd1, 0x9b, 0x87, - 0xed, 0xe7, 0xcd, 0x57, 0x7a, 0xfb, 0x29, 0xf5, 0xd8, 0x1c, 0x94, 0x76, 0xf6, 0xf7, 0x39, 0x94, - 0xc7, 0xbf, 0xd0, 0x60, 0x25, 0xc5, 0x72, 0xd4, 0x4d, 0x3f, 0x80, 0x5a, 0xdf, 0x30, 0x2d, 0xd2, - 0x6b, 0x47, 0xd6, 0xd2, 0xa6, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x6e, 0xdc, 0xe7, 0x6a, 0x69, - 0xc5, 0x07, 0xb0, 0xba, 0x4f, 0x3c, 0xdf, 0x75, 0xa6, 0xf1, 0xe3, 0x4d, 0x28, 0x9f, 0x13, 0x32, - 0xea, 0xb0, 0x5a, 0x9c, 0x63, 0x1e, 0x88, 0x10, 0x98, 0xc0, 0x8d, 0x34, 0x51, 0x54, 0xb1, 0xef, - 0xc3, 0x62, 0xd7, 0x22, 0x86, 0x1d, 0x70, 0x52, 0x86, 0x14, 0x19, 0x7e, 0x53, 0xcd, 0xa5, 0x24, - 0x8d, 0x3e, 0xce, 0x86, 0xff, 0xa2, 0xc1, 0xfa, 0x49, 0xac, 0x7e, 0x44, 0xb5, 0x30, 0xeb, 0xe1, - 0x2f, 0x53, 0x4a, 0xf0, 0x03, 0xb5, 0x8b, 0x4c, 0x96, 0xf7, 0x75, 0x16, 0xe3, 0x75, 0xb8, 0x95, - 0x7d, 0x3b, 0xd5, 0xd7, 0x83, 0xf5, 0xd6, 0x57, 0x54, 0xb7, 0x0e, 0xc5, 0xd7, 0x01, 0x71, 0xa5, - 0xae, 0x65, 0x5d, 0x82, 0x34, 0x91, 0xc8, 0xdb, 0xae, 0x15, 0xf4, 0x48, 0xcb, 0x72, 0x4e, 0x0d, - 0xcb, 0x93, 0x89, 0x14, 0xc7, 0xe2, 0x3f, 0x69, 0x70, 0xab, 0x35, 0xe9, 0x59, 0xe8, 0x47, 0x31, - 0x93, 0xf2, 0x28, 0xbd, 0xaf, 0x98, 0x74, 0x22, 0xf7, 0xd7, 0x69, 0xd0, 0xff, 0x68, 0x30, 0x1f, - 0x9b, 0x0a, 0x10, 0x82, 0xbc, 0x4d, 0x93, 0x97, 0xb3, 0xb3, 0xdf, 0x74, 0xd6, 0xb2, 0x9c, 0xee, - 0x39, 0xe9, 0x89, 0x38, 0x16, 0x10, 0xc5, 0xd3, 0x19, 0xe2, 0xa0, 0x27, 0xd2, 0x44, 0x40, 0x14, - 0xcf, 0x3f, 0x31, 0xc4, 0xdc, 0x28, 0xa0, 0x28, 0xab, 0x0a, 0x6a, 0x25, 0xbd, 0x09, 0xe5, 0xae, - 0x65, 0x78, 0x9e, 0x32, 0x2b, 0x46, 0x08, 0xd4, 0x84, 0x6a, 0x8f, 0x8c, 0x2c, 0xe7, 0x52, 0xb6, - 0x32, 0x31, 0x2f, 0xaa, 0x5f, 0x25, 0xf4, 0xf1, 0xfb, 0x31, 0x22, 0x3d, 0xc1, 0x44, 0x1b, 0x29, - 0x1a, 0x27, 0xa3, 0xe5, 0x8a, 0x0e, 0xae, 0x8a, 0xc6, 0x21, 0x4c, 0x03, 0xc3, 0x38, 0xa3, 0x84, - 0xb2, 0x30, 0x48, 0x90, 0x9e, 0x38, 0xfd, 0x3e, 0x71, 0x43, 0xc5, 0x25, 0x48, 0x47, 0x63, 0xf2, - 0x96, 0x74, 0x03, 0xdf, 0xa1, 0x87, 0x5c, 0x7b, 0x05, 0x83, 0x17, 0x61, 0xa1, 0x45, 0x7c, 0x91, - 0xa0, 0x7c, 0x0a, 0x7d, 0x04, 0xf3, 0x11, 0x8a, 0x06, 0x4b, 0x38, 0xc0, 0x69, 0x53, 0x0d, 0x70, - 0x78, 0x13, 0xaa, 0x42, 0x80, 0x32, 0x1b, 0x0b, 0xbf, 0x68, 0xaa, 0x5f, 0xf0, 0xb7, 0x61, 0x2e, - 0xa4, 0xa4, 0x37, 0x7d, 0x08, 0x79, 0x7a, 0x22, 0x8a, 0xcb, 0x52, 0xc2, 0xa2, 0xec, 0x0e, 0x46, - 0x80, 0x9b, 0x30, 0x4f, 0x31, 0x7b, 0xd4, 0x2b, 0x99, 0x51, 0x42, 0x07, 0x56, 0xce, 0x7e, 0xe8, - 0xf4, 0x48, 0x38, 0xb0, 0x46, 0x28, 0xfc, 0x33, 0xa8, 0xec, 0x39, 0xc3, 0xa1, 0x61, 0xf7, 0x98, - 0x90, 0x1a, 0xcc, 0x12, 0xfb, 0x82, 0xa9, 0x59, 0xd6, 0xe9, 0x4f, 0x16, 0x20, 0x03, 0x62, 0x59, - 0x22, 0xce, 0x38, 0x10, 0x85, 0xef, 0xac, 0x12, 0xbe, 0x34, 0x6c, 0x0c, 0xf7, 0x2c, 0xe0, 0x03, - 0x78, 0x9e, 0xc9, 0x88, 0x10, 0xf4, 0x81, 0x81, 0x47, 0x5c, 0x11, 0x69, 0xec, 0x37, 0x3e, 0x84, - 0xca, 0xde, 0xc0, 0xb0, 0x6d, 0x62, 0x65, 0xea, 0x80, 0x94, 0xd1, 0xa5, 0x2c, 0x5a, 0x1a, 0xb3, - 0xa6, 0x7b, 0x46, 0xfc, 0x28, 0xca, 0x29, 0x84, 0xff, 0x9b, 0x83, 0x52, 0x98, 0x36, 0xdf, 0x82, - 0xb2, 0x47, 0x9d, 0xc3, 0x22, 0x94, 0xdb, 0x33, 0xdb, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x4a, 0xab, - 0x8a, 0x59, 0xac, 0x9e, 0xf0, 0x43, 0x68, 0x75, 0x3d, 0x22, 0x45, 0xdf, 0x83, 0x05, 0xd3, 0x3e, - 0x75, 0x02, 0xbb, 0x27, 0x54, 0xa2, 0xc5, 0x89, 0x86, 0xcb, 0x8a, 0xda, 0x22, 0x22, 0x6d, 0xf5, - 0x24, 0x39, 0xda, 0x85, 0x9a, 0x13, 0xf8, 0x71, 0x11, 0xf9, 0x89, 0x22, 0xc6, 0xe8, 0xd1, 0x7d, - 0xea, 0xf2, 0xd0, 0xa1, 0xcc, 0xd8, 0x09, 0xf6, 0xe8, 0x54, 0x57, 0x49, 0x69, 0xe2, 0xd1, 0xc8, - 0x3a, 0x36, 0xfc, 0x81, 0xc8, 0xf9, 0x10, 0xa6, 0xfe, 0x26, 0xf6, 0xc5, 0x41, 0x8f, 0x65, 0x7a, - 0x59, 0xe7, 0x00, 0xbe, 0x07, 0x4b, 0xf1, 0x96, 0xc7, 0x63, 0xbd, 0x0e, 0x45, 0x1e, 0xdd, 0x9e, - 0x08, 0x24, 0x09, 0xe2, 0x5f, 0x6a, 0xb0, 0x38, 0xd6, 0x24, 0xd1, 0x03, 0xa8, 0x9c, 0x9b, 0x96, - 0x45, 0x7a, 0x9d, 0xa9, 0x72, 0x4c, 0x25, 0x46, 0x5f, 0xc0, 0x9c, 0x1b, 0xd8, 0xb6, 0x69, 0x9f, - 0xc9, 0xae, 0x3e, 0x99, 0x39, 0x46, 0x8d, 0xf7, 0x58, 0xee, 0xd3, 0xe9, 0x3a, 0x7c, 0x7c, 0xa8, - 0xa9, 0xa6, 0x68, 0x4a, 0x6d, 0x33, 0x32, 0xfc, 0xc1, 0xc9, 0x88, 0x74, 0xe5, 0x0c, 0x25, 0x61, - 0xfc, 0x47, 0x0d, 0x4a, 0x72, 0x40, 0xcf, 0xaa, 0xd5, 0xa2, 0xf6, 0xe6, 0xd2, 0x6b, 0x6f, 0xec, - 0x63, 0xb1, 0x01, 0xa5, 0x7e, 0x60, 0x59, 0xcc, 0x0d, 0xbc, 0x5a, 0x85, 0xb0, 0x6a, 0xd9, 0x42, - 0xcc, 0xb2, 0xe8, 0x0e, 0x14, 0xe8, 0x50, 0xe7, 0xd5, 0xaf, 0x31, 0x03, 0xa4, 0x7e, 0x3c, 0x70, - 0x0a, 0xfc, 0x80, 0x55, 0x37, 0xa1, 0x34, 0xb5, 0x7f, 0xc8, 0xab, 0x5d, 0xc9, 0xfb, 0x7b, 0x0d, - 0xde, 0x6b, 0x11, 0xff, 0x45, 0xe2, 0x1b, 0x31, 0xb4, 0xde, 0x06, 0x54, 0x5c, 0x32, 0x72, 0x8e, - 0x0d, 0xdf, 0x27, 0xae, 0xdc, 0x03, 0xa8, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0xb9, 0x30, 0x3d, 0xd3, - 0xb1, 0x25, 0x15, 0xb7, 0x4a, 0x12, 0x4d, 0x65, 0x19, 0x96, 0xb5, 0xeb, 0x1a, 0x76, 0x77, 0x40, - 0x64, 0xa3, 0x57, 0x51, 0xac, 0x1d, 0x58, 0x56, 0xc7, 0x38, 0xe3, 0x5d, 0xad, 0xa4, 0x4b, 0x10, - 0x9f, 0xc2, 0x72, 0xf2, 0x8d, 0xd2, 0x3d, 0xf4, 0x31, 0xd2, 0x3d, 0xf4, 0x37, 0x8b, 0x7b, 0xf9, - 0x0d, 0x2c, 0x7c, 0x2b, 0x61, 0x36, 0x3b, 0x8b, 0x67, 0x09, 0x2f, 0x85, 0x30, 0xfe, 0x12, 0x56, - 0xd3, 0x4d, 0x41, 0x6d, 0x7a, 0x08, 0x8b, 0xc9, 0x0f, 0xe9, 0xb4, 0x59, 0x38, 0xed, 0x91, 0xfa, - 0x38, 0x27, 0x46, 0x50, 0x7b, 0x6a, 0x7a, 0x74, 0x1a, 0x75, 0x94, 0x45, 0x64, 0x89, 0xc2, 0x99, - 0x61, 0x57, 0x87, 0x62, 0x8f, 0xf4, 0x8d, 0xc0, 0xf2, 0x45, 0xed, 0x96, 0x20, 0xf5, 0x81, 0xf8, - 0xa9, 0xc7, 0x95, 0x4b, 0xa2, 0xf1, 0x6b, 0xa8, 0x2a, 0xf7, 0xca, 0x60, 0xa1, 0x50, 0x5a, 0xb0, - 0x88, 0xd7, 0xe8, 0x9c, 0x02, 0x7d, 0x0e, 0xd7, 0xcf, 0xd8, 0x3c, 0xb6, 0x9f, 0xb8, 0x8c, 0x5b, - 0x39, 0xfd, 0x10, 0x1f, 0x41, 0x75, 0xa7, 0xd7, 0xa3, 0xb2, 0x64, 0x50, 0xa5, 0x29, 0x97, 0xa2, - 0x42, 0x2e, 0x5d, 0x05, 0x1d, 0xe6, 0x42, 0x79, 0xbc, 0x97, 0x23, 0x9b, 0xbc, 0x49, 0x3e, 0x89, - 0xcb, 0x4e, 0x39, 0xa1, 0xb7, 0x9b, 0xb2, 0x13, 0x94, 0x75, 0xf6, 0x1b, 0xdf, 0x81, 0x45, 0x9d, - 0x0c, 0x9d, 0x0b, 0xa2, 0x3e, 0x73, 0x19, 0x0a, 0xa6, 0xdd, 0x23, 0x6f, 0xe5, 0xf6, 0x92, 0x01, - 0xf8, 0x3b, 0xb0, 0xa0, 0x92, 0xd2, 0x17, 0xdc, 0x86, 0xaa, 0x7a, 0x4f, 0x18, 0x8e, 0x09, 0x2c, - 0xfe, 0x08, 0x96, 0x74, 0xd2, 0x77, 0x89, 0x37, 0x50, 0xfd, 0x9e, 0x71, 0xcf, 0x37, 0xe1, 0xfa, - 0x09, 0xf1, 0x15, 0xf6, 0xc9, 0xe4, 0x0f, 0xd9, 0x47, 0x48, 0x2b, 0xcd, 0x03, 0x92, 0x51, 0x8d, - 0x7d, 0x2d, 0x11, 0xfb, 0x3f, 0x64, 0x53, 0x3f, 0xbd, 0x26, 0x83, 0x39, 0xf5, 0xd6, 0x98, 0xc8, - 0x5c, 0x42, 0xe4, 0xa7, 0xf0, 0x5e, 0x96, 0x48, 0x6a, 0x34, 0xe9, 0x06, 0x4d, 0x71, 0x43, 0x11, - 0x0a, 0xcd, 0xe1, 0xc8, 0xbf, 0xdc, 0xfe, 0xc3, 0x02, 0x14, 0xc5, 0xee, 0x00, 0xed, 0x41, 0xa5, - 0xe3, 0x1a, 0xdd, 0x73, 0xbe, 0x17, 0x47, 0xf5, 0xb1, 0x55, 0xb9, 0x78, 0x62, 0x63, 0x25, 0xe5, - 0x84, 0x7e, 0xb0, 0xcc, 0x7c, 0xa2, 0xa1, 0x97, 0x50, 0x4b, 0xae, 0x7b, 0x11, 0x8e, 0x7f, 0x1d, - 0xa4, 0x6d, 0xb3, 0x1b, 0x1b, 0x13, 0x69, 0x98, 0x74, 0xb4, 0x0b, 0x25, 0xb9, 0x0e, 0x45, 0xea, - 0x7e, 0x28, 0xb1, 0x4e, 0x6d, 0xd4, 0x53, 0xcf, 0xb8, 0x8c, 0x17, 0xac, 0x71, 0xa9, 0x7b, 0x52, - 0xf4, 0x7e, 0xe6, 0xc7, 0x4b, 0xa8, 0xf1, 0xfa, 0x24, 0x12, 0x2e, 0xb8, 0x03, 0xd5, 0xf8, 0x6e, - 0x0d, 0x6d, 0x5c, 0xb5, 0xea, 0x6b, 0xac, 0x4d, 0xa0, 0x08, 0xa5, 0xc6, 0xef, 0x43, 0x1b, 0x99, - 0x4f, 0x49, 0x93, 0x9a, 0xb2, 0x6f, 0xc3, 0x33, 0xe8, 0xa7, 0x80, 0xc6, 0x17, 0x46, 0xe8, 0x83, - 0x69, 0x96, 0x5b, 0x0d, 0x7c, 0x05, 0x15, 0xbf, 0xe1, 0x27, 0xb0, 0x38, 0xb6, 0xea, 0x40, 0xdf, - 0x50, 0x58, 0xb3, 0x56, 0x48, 0x8d, 0xf7, 0x27, 0x13, 0x85, 0x0a, 0x8c, 0x6f, 0x1c, 0x62, 0x0a, - 0x64, 0xee, 0x36, 0x62, 0x0a, 0x64, 0xac, 0x2d, 0xf0, 0x0c, 0x72, 0xa1, 0x9e, 0xf5, 0x75, 0x8e, - 0xee, 0x4e, 0xbf, 0x40, 0x68, 0x6c, 0x4e, 0x45, 0x1b, 0xde, 0xd9, 0x9a, 0xe6, 0xce, 0xd6, 0x57, - 0xb8, 0xb3, 0x75, 0xc5, 0x9d, 0xbb, 0x50, 0x92, 0x5f, 0x6c, 0xb1, 0x9c, 0x4a, 0x7c, 0xd9, 0xc5, - 0x72, 0x2a, 0xf6, 0x89, 0x87, 0x67, 0xd0, 0x23, 0x28, 0x0a, 0x14, 0x5a, 0x1d, 0x27, 0x93, 0x12, - 0x6e, 0xa4, 0x1d, 0x71, 0x01, 0x47, 0x30, 0xa7, 0x0e, 0xb7, 0x68, 0x2d, 0x73, 0x35, 0xc4, 0x45, - 0x4d, 0x5c, 0x1d, 0x85, 0x4a, 0xb1, 0x41, 0x2d, 0xa9, 0x94, 0x3a, 0xb2, 0x26, 0x95, 0x8a, 0x26, - 0x3b, 0x3c, 0x83, 0xfa, 0xec, 0x0f, 0x95, 0xb1, 0x21, 0x05, 0xdd, 0x8e, 0xf3, 0x64, 0x0d, 0x74, - 0x8d, 0x0f, 0xae, 0xa4, 0xe3, 0xf7, 0x34, 0xa1, 0x1c, 0x0e, 0x0a, 0xe8, 0x3d, 0x85, 0x29, 0x39, - 0xb6, 0x34, 0x56, 0xd3, 0x0f, 0x43, 0x1f, 0x88, 0x66, 0x1d, 0xf3, 0x41, 0x7c, 0x20, 0x88, 0xf9, - 0x40, 0xed, 0xed, 0x78, 0x06, 0x3d, 0x01, 0x88, 0xda, 0x2d, 0xba, 0x19, 0x9b, 0x4e, 0x12, 0x0d, - 0xbb, 0xd1, 0xc8, 0x38, 0x95, 0xd6, 0x9f, 0x53, 0xbb, 0x6f, 0xcc, 0x9b, 0x29, 0x6d, 0xb9, 0x51, - 0x53, 0x57, 0x9c, 0xb4, 0x2b, 0xe1, 0x19, 0xf4, 0x18, 0xaa, 0xf1, 0xa6, 0x1c, 0xab, 0x7b, 0xa9, - 0xfd, 0x3a, 0x55, 0xce, 0x4b, 0x96, 0xc6, 0xa9, 0xdd, 0x3a, 0x99, 0xc6, 0x93, 0x5a, 0x7a, 0xaa, - 0x6c, 0x0b, 0x56, 0xd2, 0xfb, 0x2e, 0x4a, 0x24, 0x7d, 0x76, 0xb7, 0x6f, 0xdc, 0x9e, 0x82, 0x92, - 0x59, 0x75, 0xf7, 0xfe, 0x9f, 0xdf, 0xad, 0x69, 0x7f, 0x7f, 0xb7, 0xa6, 0xfd, 0xeb, 0xdd, 0x9a, - 0xf6, 0x9b, 0x7f, 0xaf, 0xcd, 0x00, 0xee, 0x0e, 0xb6, 0xba, 0xc4, 0xb5, 0xb7, 0x0c, 0xcb, 0xec, - 0x92, 0x2d, 0x67, 0x7b, 0x4b, 0x4a, 0x72, 0x47, 0x5d, 0x8f, 0xb8, 0x17, 0xc4, 0x7d, 0x99, 0x1b, - 0x9d, 0x9e, 0x5e, 0x63, 0x7f, 0xd9, 0x7f, 0xf6, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1e, 0xeb, - 0xf5, 0xb9, 0xcc, 0x1f, 0x00, 0x00, + // 2474 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x4d, 0x73, 0x1b, 0x59, + 0xd1, 0x23, 0x4b, 0x91, 0xd4, 0xb2, 0x65, 0xf9, 0xd9, 0x71, 0x64, 0x6d, 0xd6, 0xf6, 0x3e, 0xb6, + 0xb2, 0xde, 0xec, 0xa2, 0xb0, 0xde, 0x2d, 0x36, 0xa4, 0x36, 0x1b, 0xfc, 0xa1, 0x28, 0x86, 0xd8, + 0x0a, 0x63, 0x25, 0x81, 0x54, 0x51, 0x61, 0x2c, 0x3d, 0x59, 0x5a, 0x8f, 0x66, 0x94, 0x37, 0x23, + 0x25, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x1c, 0xb8, 0x70, 0xa5, 0x28, 0x8e, 0xdc, 0x39, 0x50, 0xc5, + 0x95, 0x03, 0x14, 0xf0, 0x0f, 0xa8, 0x50, 0xc5, 0x89, 0x1f, 0x41, 0xbd, 0xaf, 0x99, 0x37, 0xa3, + 0x19, 0xd9, 0x5b, 0x14, 0x37, 0x75, 0xbf, 0xee, 0x7e, 0xfd, 0xf5, 0xba, 0x7b, 0x5a, 0xb0, 0x36, + 0xa2, 0xae, 0xef, 0x7a, 0x77, 0xdc, 0x9d, 0x8e, 0xeb, 0xf8, 0xd4, 0xb5, 0xeb, 0x1c, 0x81, 0x8a, + 0x01, 0x02, 0xaf, 0xc1, 0x6a, 0x63, 0x42, 0x1c, 0xff, 0xe5, 0x11, 0xf1, 0x5c, 0xef, 0x11, 0xb1, + 0xa8, 0x7f, 0x4a, 0x2c, 0x1f, 0x2f, 0xc1, 0xe2, 0x89, 0x6f, 0xf9, 0x63, 0xcf, 0x24, 0xaf, 0xc6, + 0xc4, 0xf3, 0xf1, 0x29, 0x94, 0x14, 0x62, 0x64, 0x5f, 0xa0, 0x55, 0xc8, 0x79, 0xbe, 0xe5, 0x93, + 0xaa, 0xb1, 0x65, 0x6c, 0x17, 0x4d, 0x01, 0xa0, 0xfb, 0xb0, 0xe8, 0x71, 0xa2, 0xa7, 0xa3, 0xae, + 0xe5, 0x13, 0xaf, 0x9a, 0xd9, 0x9a, 0xdf, 0x2e, 0xed, 0xdc, 0xa8, 0x87, 0x1a, 0x9c, 0x68, 0xe7, + 0x66, 0x94, 0x1a, 0xff, 0xd5, 0x80, 0x05, 0xfd, 0x1c, 0x7d, 0x0a, 0x39, 0x9b, 0x4c, 0x88, 0xcd, + 0x6f, 0x29, 0xef, 0xbc, 0x9b, 0x22, 0xa7, 0xfe, 0x98, 0x11, 0x99, 0x82, 0x16, 0x1d, 0x42, 0x79, + 0x18, 0x31, 0xa6, 0x9a, 0xd9, 0x32, 0xb6, 0x4b, 0x3b, 0x9b, 0x1a, 0x77, 0x92, 0xcd, 0x8f, 0xe6, + 0xcc, 0x18, 0x23, 0xfe, 0x0c, 0x72, 0x5c, 0x34, 0x2a, 0x42, 0xee, 0xa0, 0xb1, 0xf7, 0xb4, 0x59, + 0x99, 0x43, 0x05, 0xc8, 0x1e, 0x1e, 0x3f, 0x6c, 0x55, 0x0c, 0x54, 0x82, 0xfc, 0xf3, 0x5d, 0xf3, + 0xf8, 0xf0, 0xb8, 0x59, 0xc9, 0x30, 0x8a, 0x86, 0x69, 0xb6, 0xcc, 0xca, 0xfc, 0x5e, 0x1e, 0x72, + 0x5c, 0x3e, 0x5e, 0x87, 0x1b, 0x4d, 0xe2, 0x3f, 0xa4, 0xd6, 0x90, 0xbc, 0x76, 0xe9, 0xf9, 0xa1, + 0xd3, 0x73, 0x95, 0x3b, 0x7f, 0x6b, 0x40, 0xfe, 0x19, 0xa1, 0xde, 0xc0, 0x75, 0x98, 0x2f, 0x87, + 0xd6, 0x57, 0x2e, 0xe5, 0x56, 0xe6, 0x4c, 0x01, 0x70, 0xec, 0xc0, 0x71, 0x29, 0xd7, 0x9e, 0x61, + 0x19, 0xc0, 0xb0, 0x23, 0xcb, 0xef, 0xf4, 0xab, 0xf3, 0x02, 0xcb, 0x01, 0x86, 0x3d, 0x1d, 0x0f, + 0xec, 0x6e, 0x35, 0x2b, 0xa2, 0xc1, 0x01, 0xb4, 0x05, 0xa5, 0x11, 0x75, 0xbb, 0xe3, 0x8e, 0x7f, + 0x6c, 0x0d, 0x49, 0x35, 0xc7, 0xcf, 0x74, 0x14, 0xda, 0x00, 0x98, 0x08, 0x25, 0x4e, 0x7c, 0x5a, + 0xbd, 0xc6, 0x09, 0x34, 0x0c, 0xfe, 0x65, 0x06, 0xae, 0x4f, 0x5b, 0xc0, 0xe2, 0xbf, 0x05, 0xa5, + 0x5e, 0x80, 0xed, 0xca, 0x2c, 0xd0, 0x51, 0xe8, 0x63, 0x58, 0x26, 0xce, 0x64, 0x40, 0x5d, 0x67, + 0x48, 0x1c, 0xdf, 0xdb, 0x77, 0xc7, 0x8e, 0x2f, 0x6d, 0x99, 0x3e, 0x60, 0x9a, 0xf8, 0x96, 0x77, + 0x2e, 0xc9, 0x84, 0x71, 0x1a, 0x26, 0xcc, 0xb7, 0xac, 0x9e, 0x6f, 0x1b, 0x00, 0x7d, 0xd7, 0x53, + 0xc2, 0x73, 0x82, 0x2b, 0xc4, 0x20, 0x0c, 0x0b, 0x03, 0xc7, 0xf3, 0x2d, 0xa7, 0x43, 0xb8, 0x0b, + 0x84, 0x85, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0xd2, 0xe2, 0x6a, 0x9e, 0xe7, 0x09, 0xd2, 0xf2, 0x44, + 0x86, 0xc8, 0x54, 0x24, 0xf8, 0x43, 0x58, 0x6a, 0x13, 0x8b, 0x76, 0xdd, 0xd7, 0x8e, 0x0c, 0x25, + 0x5a, 0x83, 0x6b, 0x94, 0x58, 0x9e, 0xeb, 0x48, 0x2f, 0x48, 0x88, 0x3d, 0xa1, 0x90, 0x74, 0x64, + 0x5f, 0xe0, 0x2a, 0xac, 0x35, 0x89, 0xdf, 0xd0, 0x6c, 0x57, 0xd9, 0xf0, 0x06, 0x56, 0xa7, 0x4e, + 0xae, 0xe6, 0xe5, 0x2f, 0x61, 0x41, 0x77, 0xa6, 0x7c, 0x70, 0x35, 0x3d, 0xd5, 0xc3, 0x63, 0x1e, + 0xbe, 0x08, 0x3d, 0xfe, 0x87, 0x01, 0x4b, 0x31, 0x0a, 0x54, 0x86, 0xcc, 0x40, 0x5d, 0x96, 0x19, + 0xf0, 0x3c, 0xea, 0x50, 0x62, 0xf9, 0xa4, 0xfb, 0xbc, 0x4f, 0x1c, 0x1e, 0xc3, 0xa2, 0xa9, 0xa3, + 0xc2, 0xe8, 0xcc, 0xeb, 0xd1, 0xa9, 0x43, 0x8e, 0x47, 0xb0, 0x9a, 0xe5, 0x4a, 0x55, 0xf5, 0xd7, + 0xdb, 0x77, 0xa9, 0xdf, 0xb6, 0x3c, 0x91, 0x51, 0x82, 0x0c, 0xd5, 0xa0, 0x40, 0x5d, 0xd7, 0x37, + 0x5d, 0x5b, 0x25, 0x6b, 0x00, 0xa3, 0xdb, 0x50, 0xe9, 0x8c, 0x29, 0x25, 0x8e, 0x6f, 0x8e, 0x9d, + 0xe3, 0xf1, 0xf0, 0x94, 0x88, 0x7c, 0x5d, 0x34, 0xa7, 0xf0, 0xf8, 0x8f, 0x06, 0x5c, 0x3f, 0x26, + 0xaf, 0x35, 0xb3, 0x54, 0xa8, 0x6e, 0x43, 0x85, 0xf9, 0xad, 0x67, 0xbb, 0xaf, 0xdb, 0x64, 0x38, + 0xb2, 0xc3, 0x02, 0x36, 0x85, 0x47, 0x5f, 0x42, 0x76, 0x62, 0x51, 0xe5, 0xd1, 0xdb, 0x9a, 0xf2, + 0x89, 0xb2, 0xeb, 0xcf, 0x2c, 0xea, 0x35, 0x1c, 0x9f, 0x5e, 0x98, 0x9c, 0xaf, 0xf6, 0x39, 0x14, + 0x03, 0x14, 0xaa, 0xc0, 0xfc, 0x39, 0xb9, 0x90, 0x77, 0xb1, 0x9f, 0xcc, 0x65, 0x13, 0xcb, 0x1e, + 0x13, 0xe9, 0x4e, 0x01, 0xdc, 0xcb, 0xdc, 0x35, 0xf0, 0x09, 0xac, 0xc4, 0x6f, 0x60, 0xb9, 0xf0, + 0x05, 0x94, 0xb4, 0xc8, 0x71, 0x51, 0xb3, 0x03, 0xad, 0x93, 0xe3, 0x0f, 0xf8, 0x43, 0x4e, 0x70, + 0x49, 0x2c, 0xd8, 0xf8, 0x67, 0x06, 0xac, 0xc4, 0x29, 0xff, 0xe7, 0xeb, 0xd1, 0x1d, 0x28, 0x28, + 0x07, 0xcb, 0x6a, 0xbc, 0xa2, 0xb1, 0xb2, 0x08, 0x73, 0x9e, 0x80, 0x08, 0xff, 0xcd, 0x80, 0xf5, + 0x7d, 0x71, 0x7c, 0xb9, 0xd2, 0xe8, 0x01, 0x64, 0xfd, 0x8b, 0x91, 0xf0, 0x65, 0x79, 0xe7, 0x23, + 0x4d, 0x74, 0xaa, 0x8c, 0x7a, 0x6b, 0xc4, 0x58, 0x4c, 0xce, 0x88, 0x2d, 0xb8, 0x26, 0x60, 0x56, + 0xde, 0x8f, 0x5b, 0xad, 0x27, 0x95, 0x39, 0x84, 0xa0, 0x7c, 0xd2, 0xde, 0x35, 0xdb, 0x2f, 0x77, + 0xf7, 0xdb, 0x87, 0xcf, 0x0e, 0xdb, 0x3f, 0xaa, 0x18, 0x68, 0x19, 0x16, 0x4f, 0xda, 0xad, 0x27, + 0x21, 0x2a, 0x83, 0x16, 0xa1, 0xb8, 0xdf, 0x3a, 0x7e, 0x78, 0xd8, 0x7c, 0x6a, 0x36, 0x2a, 0xf3, + 0xac, 0x0f, 0x98, 0x8d, 0x93, 0x46, 0xbb, 0x92, 0x45, 0x0b, 0x50, 0x68, 0xb6, 0x5e, 0x8a, 0xae, + 0x90, 0xc3, 0xe7, 0x70, 0x23, 0x49, 0x19, 0xe6, 0xdb, 0xb8, 0x39, 0xc1, 0x73, 0xca, 0xe8, 0xcf, + 0x29, 0xe9, 0x09, 0xcc, 0xa7, 0x3c, 0x81, 0x5f, 0x19, 0x50, 0x3d, 0x72, 0xbb, 0x83, 0xde, 0xc5, + 0x95, 0xbc, 0x07, 0xee, 0x88, 0x50, 0xcb, 0x1f, 0xb8, 0x8e, 0xca, 0xf7, 0xcd, 0xe4, 0xc8, 0xb6, + 0x14, 0x9d, 0xa9, 0xb1, 0xa0, 0x5b, 0x50, 0xa6, 0xa4, 0xe3, 0x3a, 0xbd, 0xc1, 0xd9, 0x98, 0x92, + 0x5d, 0xdb, 0xe6, 0x7a, 0x15, 0xcc, 0x18, 0x16, 0xff, 0xc6, 0x80, 0xd5, 0x24, 0x61, 0xe8, 0x9e, + 0x8c, 0x9f, 0x68, 0xf3, 0xb7, 0x2e, 0xb9, 0x3b, 0x12, 0x3a, 0x51, 0x35, 0x6c, 0x51, 0xdf, 0x33, + 0xaa, 0x6a, 0x08, 0x18, 0x7f, 0x92, 0x10, 0xd6, 0x25, 0x28, 0x99, 0x8d, 0xa3, 0xd6, 0xb3, 0xc6, + 0x4b, 0xb3, 0xf5, 0x98, 0x45, 0x6c, 0x01, 0x0a, 0xbb, 0x07, 0x07, 0x02, 0xca, 0xe2, 0x9f, 0x1b, + 0xb0, 0x96, 0xe0, 0x39, 0x16, 0xa6, 0xef, 0x43, 0xa5, 0x67, 0x0d, 0x6c, 0xd2, 0x6d, 0x85, 0xde, + 0x32, 0xae, 0xe6, 0xad, 0x29, 0x46, 0x19, 0x84, 0xcc, 0x74, 0xcc, 0xf5, 0x12, 0x8a, 0x0f, 0x61, + 0xfd, 0x80, 0x78, 0x3e, 0x75, 0xaf, 0x12, 0xc7, 0x9b, 0x50, 0x3c, 0x27, 0x64, 0xd4, 0xe6, 0x35, + 0x37, 0xc3, 0x23, 0x10, 0x22, 0x30, 0x81, 0x1b, 0x49, 0xa2, 0x98, 0x61, 0xdf, 0x83, 0xe5, 0x8e, + 0x4d, 0x2c, 0x67, 0x2c, 0x48, 0x39, 0x52, 0xbe, 0xf0, 0x9b, 0xfa, 0x5b, 0x8a, 0xd3, 0x98, 0xd3, + 0x6c, 0xf8, 0x2f, 0x06, 0x6c, 0x9e, 0x44, 0xea, 0xc7, 0x13, 0xca, 0x52, 0xc5, 0x1f, 0x10, 0x2f, + 0x4d, 0xf1, 0x17, 0x00, 0xa3, 0x80, 0x48, 0x26, 0xe0, 0x3d, 0xbd, 0x5b, 0xcc, 0x96, 0x57, 0x0f, + 0x31, 0xa2, 0x00, 0x6b, 0xd2, 0x6a, 0xf7, 0x61, 0x29, 0x76, 0xfc, 0xb5, 0x8a, 0xf1, 0x26, 0xbc, + 0x9b, 0x7e, 0x3b, 0xb3, 0xd7, 0x83, 0xcd, 0xe6, 0xd7, 0x34, 0xb7, 0x0a, 0xf9, 0x57, 0x63, 0x42, + 0x95, 0xad, 0x45, 0x53, 0x81, 0xec, 0x21, 0x91, 0x37, 0x1d, 0x7b, 0xdc, 0x25, 0x4d, 0xdb, 0x3d, + 0xb5, 0x6c, 0x4f, 0x3d, 0xa4, 0x28, 0x16, 0xff, 0xc1, 0x80, 0x77, 0x9b, 0xb3, 0xd4, 0x42, 0x3f, + 0x8c, 0xb8, 0x54, 0x64, 0xe9, 0x5d, 0xcd, 0xa5, 0x33, 0xb9, 0xff, 0x9f, 0x0e, 0xfd, 0xb7, 0x01, + 0x8b, 0x91, 0xee, 0x8f, 0x10, 0x64, 0x1d, 0xf6, 0x78, 0x05, 0x3b, 0xff, 0xcd, 0x66, 0x2a, 0xdb, + 0xed, 0x9c, 0x93, 0xae, 0xcc, 0x63, 0x09, 0x31, 0x3c, 0x9b, 0x15, 0x0e, 0xbb, 0xf2, 0x99, 0x48, + 0x88, 0xe1, 0xc5, 0xa7, 0x84, 0x9c, 0x0f, 0x25, 0x14, 0xbe, 0xaa, 0x9c, 0x5e, 0x49, 0x6f, 0x42, + 0xb1, 0x63, 0x5b, 0x9e, 0xa7, 0xcd, 0x84, 0x21, 0x02, 0x35, 0xa0, 0xdc, 0x25, 0x23, 0xdb, 0xbd, + 0x50, 0xad, 0x4c, 0xce, 0x85, 0xfa, 0xd7, 0x07, 0x53, 0xfe, 0x20, 0x42, 0x64, 0xc6, 0x98, 0x58, + 0x23, 0x45, 0xd3, 0x64, 0xac, 0x5c, 0xb1, 0x01, 0x55, 0xb3, 0x38, 0x80, 0x59, 0x62, 0x58, 0x67, + 0x8c, 0x50, 0x15, 0x06, 0x05, 0xb2, 0x13, 0xb7, 0xd7, 0x23, 0x34, 0x30, 0x5c, 0x81, 0x6c, 0x04, + 0x26, 0x6f, 0x48, 0x67, 0xec, 0xbb, 0xec, 0x50, 0x58, 0xaf, 0x61, 0xf0, 0x32, 0x2c, 0x35, 0x89, + 0x2f, 0x1f, 0xa8, 0x98, 0x36, 0x1f, 0xc0, 0x62, 0x88, 0x62, 0xc9, 0x12, 0x0c, 0x6a, 0xc6, 0x95, + 0x06, 0x35, 0xbc, 0x0d, 0x65, 0x29, 0x40, 0x9b, 0x81, 0x65, 0x5c, 0x0c, 0x3d, 0x2e, 0xf8, 0x73, + 0x58, 0x08, 0x28, 0xd9, 0x4d, 0x1f, 0x40, 0x96, 0x9d, 0xc8, 0xe2, 0xb2, 0x12, 0xf3, 0x28, 0xbf, + 0x83, 0x13, 0xe0, 0x06, 0x2c, 0x32, 0xcc, 0x3e, 0x8b, 0x4a, 0x6a, 0x96, 0xb0, 0xc1, 0x54, 0xb0, + 0x1f, 0xb9, 0x5d, 0x12, 0x0c, 0xa6, 0x21, 0x0a, 0xff, 0x14, 0x4a, 0xfb, 0xee, 0x70, 0x68, 0x39, + 0x5d, 0x2e, 0xa4, 0x02, 0xf3, 0xc4, 0x99, 0x70, 0x33, 0x8b, 0x26, 0xfb, 0xc9, 0x13, 0xa4, 0x4f, + 0x6c, 0x5b, 0xe6, 0x99, 0x00, 0xc2, 0xf4, 0x9d, 0xd7, 0xd2, 0x97, 0xa5, 0x8d, 0x45, 0xcf, 0xc6, + 0x62, 0xd0, 0xce, 0x72, 0x19, 0x21, 0x82, 0x29, 0x38, 0xf6, 0x08, 0x95, 0x99, 0xc6, 0x7f, 0xe3, + 0x23, 0x28, 0xed, 0xf7, 0x2d, 0xc7, 0x21, 0x76, 0xaa, 0x0d, 0x48, 0x1b, 0x5d, 0x8a, 0xb2, 0xa5, + 0x71, 0x6f, 0xd2, 0x33, 0xe2, 0x87, 0x59, 0xce, 0x20, 0xfc, 0x9f, 0x0c, 0x14, 0x82, 0x67, 0xf3, + 0x6d, 0x28, 0x7a, 0x2c, 0x38, 0x3c, 0x43, 0x85, 0x3f, 0xd3, 0x03, 0x17, 0x92, 0x32, 0xbe, 0x8e, + 0xf2, 0xaa, 0x9c, 0xc5, 0xaa, 0xb1, 0x38, 0x04, 0x5e, 0x37, 0x43, 0x52, 0xf4, 0x5d, 0x58, 0x1a, + 0x38, 0xa7, 0xee, 0xd8, 0xe9, 0x4a, 0x93, 0x58, 0x71, 0x62, 0xe9, 0xb2, 0xa6, 0xb7, 0x88, 0xd0, + 0x5a, 0x33, 0x4e, 0x8e, 0xf6, 0xa0, 0xe2, 0x8e, 0xfd, 0xa8, 0x88, 0xec, 0x4c, 0x11, 0x53, 0xf4, + 0xe8, 0x2e, 0x0b, 0x79, 0x10, 0x50, 0xee, 0xec, 0x18, 0x7b, 0x78, 0x6a, 0xea, 0xa4, 0xec, 0xe1, + 0xb1, 0xcc, 0x7a, 0x62, 0xf9, 0x7d, 0xf9, 0xe6, 0x03, 0x98, 0xc5, 0x9b, 0x38, 0x93, 0xc3, 0x2e, + 0x7f, 0xe9, 0x45, 0x53, 0x00, 0xf8, 0x0e, 0xac, 0x44, 0x5b, 0x9e, 0xc8, 0xf5, 0x2a, 0xe4, 0x45, + 0x76, 0x7b, 0x32, 0x91, 0x14, 0x88, 0x7f, 0x61, 0xc0, 0xf2, 0x54, 0x93, 0x44, 0xf7, 0xa0, 0x74, + 0x3e, 0xb0, 0x6d, 0xd2, 0x6d, 0x5f, 0xe9, 0x8d, 0xe9, 0xc4, 0xe8, 0x0b, 0x58, 0xa0, 0x63, 0xc7, + 0x19, 0x38, 0x67, 0xaa, 0xab, 0xcf, 0x66, 0x8e, 0x50, 0xe3, 0x7d, 0xfe, 0xf6, 0xd9, 0x74, 0x1d, + 0x28, 0x1f, 0x58, 0x6a, 0x68, 0x96, 0x32, 0xdf, 0x8c, 0x2c, 0xbf, 0x7f, 0x32, 0x22, 0x1d, 0x35, + 0x43, 0x29, 0x18, 0xff, 0xde, 0x80, 0x82, 0x1a, 0xd0, 0xd3, 0x6a, 0xb5, 0xac, 0xbd, 0x99, 0xe4, + 0xda, 0x1b, 0xf9, 0x28, 0xac, 0x41, 0xa1, 0x37, 0xb6, 0x6d, 0x1e, 0x06, 0x51, 0xad, 0x02, 0x58, + 0xf7, 0x6c, 0x2e, 0xe2, 0x59, 0xf4, 0x21, 0xe4, 0xd8, 0x50, 0xe7, 0x55, 0xaf, 0x71, 0x07, 0x24, + 0x7e, 0x3c, 0x08, 0x0a, 0x7c, 0x8f, 0x57, 0x37, 0x69, 0x34, 0xf3, 0x7f, 0xc0, 0x6b, 0x5c, 0xca, + 0xfb, 0x3b, 0x03, 0xde, 0x69, 0x12, 0xff, 0x79, 0xec, 0x5b, 0x30, 0xf0, 0xde, 0x16, 0x94, 0x28, + 0x19, 0xb9, 0x4f, 0x2c, 0xdf, 0x27, 0x54, 0x7d, 0xef, 0xeb, 0x28, 0xb4, 0x0d, 0x4b, 0x94, 0x4c, + 0x06, 0xde, 0xc0, 0x75, 0x14, 0x95, 0xf0, 0x4a, 0x1c, 0xcd, 0x64, 0x59, 0xb6, 0xbd, 0x47, 0x2d, + 0xa7, 0xd3, 0x27, 0xaa, 0xd1, 0xeb, 0x28, 0xde, 0x0e, 0x6c, 0xbb, 0x6d, 0x9d, 0x89, 0xae, 0x56, + 0x30, 0x15, 0x88, 0x4f, 0x61, 0x35, 0xae, 0xa3, 0x0a, 0x0f, 0x53, 0x46, 0x85, 0x87, 0xfd, 0xe6, + 0x79, 0xaf, 0xbe, 0x75, 0x65, 0x6c, 0x15, 0xcc, 0x67, 0x67, 0xa9, 0x96, 0x8c, 0x52, 0x00, 0xe3, + 0xaf, 0x60, 0x3d, 0xd9, 0x15, 0xcc, 0xa7, 0x47, 0xb0, 0x1c, 0xff, 0x60, 0x4e, 0x9a, 0x85, 0x93, + 0x94, 0x34, 0xa7, 0x39, 0x31, 0x82, 0xca, 0xe3, 0x81, 0xc7, 0xa6, 0x51, 0x57, 0x5b, 0x38, 0x16, + 0x18, 0x9c, 0x9a, 0x76, 0x55, 0xc8, 0x77, 0x49, 0xcf, 0x1a, 0xdb, 0xbe, 0xac, 0xdd, 0x0a, 0x64, + 0x31, 0x90, 0x3f, 0xcd, 0xa8, 0x71, 0x71, 0x34, 0x7e, 0x05, 0x65, 0xed, 0x5e, 0x95, 0x2c, 0x0c, + 0x4a, 0x4a, 0x16, 0xa9, 0x8d, 0x29, 0x28, 0xd0, 0x67, 0x70, 0xfd, 0x8c, 0xcf, 0x63, 0x07, 0xb1, + 0xcb, 0x84, 0x97, 0x93, 0x0f, 0xf1, 0x31, 0x94, 0x77, 0xbb, 0x5d, 0x26, 0x4b, 0x25, 0x55, 0x92, + 0x71, 0x09, 0x26, 0x64, 0x92, 0x4d, 0x30, 0x61, 0x21, 0x90, 0x27, 0x7a, 0x39, 0x72, 0xc8, 0xeb, + 0xb8, 0x4a, 0x42, 0x76, 0xc2, 0x09, 0xbb, 0x7d, 0xa0, 0x3a, 0x41, 0xd1, 0xe4, 0xbf, 0xf1, 0x87, + 0xb0, 0x6c, 0x92, 0xa1, 0x3b, 0x21, 0xba, 0x9a, 0xab, 0x90, 0x1b, 0x38, 0x5d, 0xf2, 0x46, 0x6d, + 0x29, 0x39, 0x80, 0xbf, 0x03, 0x4b, 0x3a, 0x29, 0xd3, 0xe0, 0x16, 0x94, 0xf5, 0x7b, 0x82, 0x74, + 0x8c, 0x61, 0xf1, 0x47, 0xb0, 0x62, 0x92, 0x1e, 0x25, 0x5e, 0x5f, 0x8f, 0x7b, 0xca, 0x3d, 0xdf, + 0x84, 0xeb, 0x27, 0xc4, 0xd7, 0xd8, 0x67, 0x93, 0xdf, 0xe7, 0x1f, 0x21, 0xcd, 0xa4, 0x08, 0x28, + 0x46, 0x3d, 0xf7, 0x8d, 0x58, 0xee, 0xff, 0x80, 0x4f, 0xfd, 0xec, 0x9a, 0x14, 0xe6, 0xc4, 0x5b, + 0x23, 0x22, 0x33, 0x31, 0x91, 0x9f, 0xc0, 0x3b, 0x69, 0x22, 0x99, 0xd3, 0x54, 0x18, 0x0c, 0x2d, + 0x0c, 0x79, 0xc8, 0x35, 0x86, 0x23, 0xff, 0x62, 0xe7, 0x4f, 0x8b, 0x90, 0x97, 0xbb, 0x03, 0xb4, + 0x0f, 0xa5, 0x36, 0xb5, 0x3a, 0xe7, 0x62, 0xff, 0x8d, 0xaa, 0x53, 0x2b, 0x71, 0xa9, 0x62, 0x6d, + 0x2d, 0xe1, 0x84, 0x7d, 0xb0, 0xcc, 0x7d, 0xcb, 0x40, 0x2f, 0xa0, 0x12, 0x5f, 0xeb, 0x22, 0x1c, + 0xfd, 0x3a, 0x48, 0xda, 0x5a, 0xd7, 0xb6, 0x66, 0xd2, 0x70, 0xe9, 0x68, 0x0f, 0x0a, 0x6a, 0xed, + 0x89, 0xf4, 0xfd, 0x50, 0x6c, 0x6d, 0x5a, 0xab, 0x26, 0x9e, 0x09, 0x19, 0xcf, 0x79, 0xe3, 0xd2, + 0xf7, 0xa1, 0xe8, 0xbd, 0xd4, 0x8f, 0x97, 0xc0, 0xe2, 0xcd, 0x59, 0x24, 0x42, 0x70, 0x1b, 0xca, + 0xd1, 0xdd, 0x1a, 0xda, 0xba, 0x6c, 0xb1, 0x57, 0xdb, 0x98, 0x41, 0x11, 0x48, 0x8d, 0xde, 0x87, + 0xb6, 0x52, 0x55, 0x49, 0x92, 0x9a, 0xb0, 0x6f, 0xc3, 0x73, 0xe8, 0x27, 0x80, 0xa6, 0x17, 0x46, + 0xe8, 0xfd, 0xab, 0x2c, 0xb7, 0x6a, 0xf8, 0x12, 0x2a, 0x71, 0xc3, 0x8f, 0x61, 0x79, 0x6a, 0xd5, + 0x81, 0xbe, 0xa1, 0xb1, 0xa6, 0xad, 0x90, 0x6a, 0xef, 0xcd, 0x26, 0x0a, 0x0c, 0x98, 0xde, 0x38, + 0x44, 0x0c, 0x48, 0xdd, 0x6d, 0x44, 0x0c, 0x48, 0x59, 0x5b, 0x88, 0x5c, 0x53, 0x5f, 0x32, 0x91, + 0x5c, 0x8b, 0x7d, 0xf1, 0x44, 0x72, 0x2d, 0xf2, 0xe9, 0x83, 0xe7, 0xd0, 0x03, 0xc8, 0x4b, 0x14, + 0x5a, 0x9f, 0x26, 0x53, 0x12, 0x6e, 0x24, 0x1d, 0x09, 0x01, 0xc7, 0xb0, 0xa0, 0x0f, 0x7d, 0x68, + 0x23, 0x75, 0x65, 0x22, 0x44, 0xcd, 0x5c, 0xa9, 0x04, 0x46, 0xf1, 0x01, 0x26, 0x6e, 0x94, 0x3e, + 0xca, 0xc5, 0x8d, 0x0a, 0x27, 0x1e, 0x3c, 0x87, 0x7a, 0xfc, 0x0f, 0x85, 0xa9, 0xe6, 0x8d, 0x6e, + 0x45, 0x79, 0xd2, 0x06, 0x9d, 0xda, 0xfb, 0x97, 0xd2, 0x89, 0x7b, 0x1a, 0x50, 0x0c, 0x1a, 0x28, + 0x7a, 0x47, 0x63, 0x8a, 0xb7, 0xf3, 0xda, 0x7a, 0xf2, 0x61, 0x10, 0x03, 0xd9, 0xc4, 0x22, 0x31, + 0x88, 0x36, 0xca, 0x48, 0x0c, 0xf4, 0x9e, 0x87, 0xe7, 0xd0, 0x23, 0x80, 0xb0, 0x0d, 0xa1, 0x9b, + 0x91, 0xae, 0x1d, 0x6b, 0x64, 0xb5, 0x5a, 0xca, 0xa9, 0xf2, 0xfe, 0x82, 0xde, 0x95, 0x22, 0xd1, + 0x4c, 0x68, 0x57, 0xb5, 0x8a, 0xbe, 0xfa, 0x63, 0xd5, 0x1a, 0xcf, 0xa1, 0x87, 0x50, 0x8e, 0x36, + 0xab, 0x48, 0x3d, 0x48, 0xec, 0x63, 0x89, 0x72, 0x5e, 0x40, 0x35, 0xad, 0x8b, 0xa1, 0xdb, 0x51, + 0x89, 0xb3, 0x5a, 0x5d, 0xa2, 0x6c, 0x1b, 0xd6, 0x92, 0xfb, 0x11, 0xda, 0x8e, 0x4a, 0x4e, 0xef, + 0x82, 0xb5, 0x5b, 0x57, 0xa0, 0xe4, 0x5e, 0xdd, 0xbb, 0xfb, 0xe7, 0xb7, 0x1b, 0xc6, 0xdf, 0xdf, + 0x6e, 0x18, 0xff, 0x7c, 0xbb, 0x61, 0xfc, 0xfa, 0x5f, 0x1b, 0x73, 0x80, 0x3b, 0xfd, 0x7a, 0x87, + 0x50, 0xa7, 0x6e, 0xd9, 0x83, 0x0e, 0xa9, 0xbb, 0x3b, 0x75, 0x25, 0x89, 0x8e, 0x3a, 0x1e, 0xa1, + 0x13, 0x42, 0x5f, 0x64, 0x46, 0xa7, 0xa7, 0xd7, 0xf8, 0x5f, 0xd6, 0x9f, 0xfe, 0x37, 0x00, 0x00, + 0xff, 0xff, 0x5b, 0x99, 0x04, 0x0b, 0xcc, 0x1e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3662,8 +3661,6 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) - GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -3790,24 +3787,6 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } -func (c *controlClient) SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) { - out := new(SetEnvironmentPropertiesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetEnvironmentProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) { - out := new(GetEnvironmentPropertiesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironmentProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -3927,8 +3906,6 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - SetEnvironmentProperties(context.Context, *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) - GetEnvironmentProperties(context.Context, *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -3974,12 +3951,6 @@ func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *M func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } -func (*UnimplementedControlServer) SetEnvironmentProperties(ctx context.Context, req *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetEnvironmentProperties not implemented") -} -func (*UnimplementedControlServer) GetEnvironmentProperties(ctx context.Context, req *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironmentProperties not implemented") -} func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -4186,42 +4157,6 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_SetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetEnvironmentPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetEnvironmentProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetEnvironmentProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetEnvironmentProperties(ctx, req.(*SetEnvironmentPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironmentProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironmentProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironmentProperties(ctx, req.(*GetEnvironmentPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -4474,14 +4409,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, - { - MethodName: "SetEnvironmentProperties", - Handler: _Control_SetEnvironmentProperties_Handler, - }, - { - MethodName: "GetEnvironmentProperties", - Handler: _Control_GetEnvironmentProperties_Handler, - }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -5104,9 +5031,9 @@ func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] baseI := i i -= len(v) copy(dAtA[i:], v) @@ -7450,8 +7377,8 @@ func (m *NewEnvironmentRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { + if len(m.Vars) > 0 { + for k, v := range m.Vars { _ = k _ = v mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) @@ -9863,7 +9790,7 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9890,8 +9817,8 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Properties == nil { - m.Properties = make(map[string]string) + if m.Vars == nil { + m.Vars = make(map[string]string) } var mapkey string var mapvalue string @@ -9986,7 +9913,7 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { iNdEx += skippy } } - m.Properties[mapkey] = mapvalue + m.Vars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 97a686170..a3dcb3d93 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -838,7 +838,7 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -884,9 +884,9 @@ func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { return "" } -func (m *NewEnvironmentRequest) GetProperties() map[string]string { +func (m *NewEnvironmentRequest) GetVars() map[string]string { if m != nil { - return m.Properties + return m.Vars } return nil } @@ -3429,7 +3429,7 @@ func init() { proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.PropertiesEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -3482,163 +3482,162 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2486 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x5d, 0x6f, 0x1b, 0x59, - 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x3a, 0xde, 0x36, 0xc9, 0x5e, 0x56, - 0xdd, 0xb4, 0xbb, 0xa4, 0xbb, 0xd9, 0x15, 0x94, 0x6a, 0x4b, 0xc9, 0x87, 0xeb, 0x06, 0x9a, 0x38, - 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0xe3, 0xd9, 0x8c, 0x67, 0xdc, 0xf9, 0x48, 0x9b, - 0x07, 0xde, 0x78, 0x43, 0x88, 0x07, 0x5e, 0x78, 0x45, 0x08, 0xf1, 0xc4, 0x3b, 0x3f, 0x81, 0x07, - 0x10, 0x20, 0xf1, 0x03, 0x50, 0x91, 0x78, 0xe2, 0x47, 0xa0, 0xfb, 0x35, 0x73, 0x67, 0x3c, 0xe3, - 0x78, 0x85, 0xf6, 0xcd, 0xe7, 0xdc, 0x73, 0xce, 0xbd, 0xe7, 0xfb, 0xcc, 0x31, 0xac, 0x8c, 0x5c, - 0xc7, 0x77, 0xbc, 0x7b, 0xce, 0x76, 0xd7, 0xb1, 0x7d, 0xd7, 0xb1, 0xb6, 0x18, 0x02, 0x95, 0x43, - 0x04, 0x5e, 0x81, 0xe5, 0xe6, 0x05, 0xb1, 0xfd, 0x57, 0x87, 0xc4, 0x73, 0xbc, 0x27, 0xc4, 0x70, - 0xfd, 0x53, 0x62, 0xf8, 0x78, 0x01, 0xe6, 0x4f, 0x7c, 0xc3, 0x0f, 0x3c, 0x9d, 0xbc, 0x0e, 0x88, - 0xe7, 0xe3, 0x53, 0xa8, 0x48, 0xc4, 0xc8, 0xba, 0x44, 0xcb, 0x50, 0xf0, 0x7c, 0xc3, 0x27, 0x75, - 0x6d, 0x43, 0xdb, 0x2c, 0xeb, 0x1c, 0x40, 0x0f, 0x61, 0xde, 0x63, 0x44, 0xcf, 0x46, 0x3d, 0xc3, - 0x27, 0x5e, 0x3d, 0xb7, 0x31, 0xbb, 0x59, 0xd9, 0xbe, 0xb1, 0x15, 0xbd, 0xe0, 0x44, 0x39, 0xd7, - 0xe3, 0xd4, 0xf8, 0xaf, 0x1a, 0xcc, 0xa9, 0xe7, 0xe8, 0x33, 0x28, 0x58, 0xe4, 0x82, 0x58, 0xec, - 0x96, 0xea, 0xf6, 0xad, 0x0c, 0x39, 0x5b, 0x4f, 0x29, 0x91, 0xce, 0x69, 0xd1, 0x01, 0x54, 0x87, - 0x31, 0x65, 0xea, 0xb9, 0x0d, 0x6d, 0xb3, 0xb2, 0xbd, 0xae, 0x70, 0xa7, 0xe9, 0xfc, 0x64, 0x46, - 0x4f, 0x30, 0xe2, 0xcf, 0xa1, 0xc0, 0x44, 0xa3, 0x32, 0x14, 0xf6, 0x9b, 0xbb, 0xcf, 0x5a, 0xb5, - 0x19, 0x54, 0x82, 0xfc, 0xc1, 0xd1, 0xe3, 0x76, 0x4d, 0x43, 0x15, 0x28, 0xbe, 0xd8, 0xd1, 0x8f, - 0x0e, 0x8e, 0x5a, 0xb5, 0x1c, 0xa5, 0x68, 0xea, 0x7a, 0x5b, 0xaf, 0xcd, 0xee, 0x16, 0xa1, 0xc0, - 0xe4, 0xe3, 0x55, 0xb8, 0xd1, 0x22, 0xfe, 0x63, 0xd7, 0x18, 0x92, 0x37, 0x8e, 0x7b, 0x7e, 0x60, - 0xf7, 0x1d, 0x69, 0xce, 0xdf, 0x69, 0x50, 0x7c, 0x4e, 0x5c, 0xcf, 0x74, 0x6c, 0x6a, 0xcb, 0xa1, - 0xf1, 0xa5, 0xe3, 0x32, 0x2d, 0x0b, 0x3a, 0x07, 0x18, 0xd6, 0xb4, 0x1d, 0x97, 0xbd, 0x9e, 0x62, - 0x29, 0x40, 0xb1, 0x23, 0xc3, 0xef, 0x0e, 0xea, 0xb3, 0x1c, 0xcb, 0x00, 0x8a, 0x3d, 0x0d, 0x4c, - 0xab, 0x57, 0xcf, 0x73, 0x6f, 0x30, 0x00, 0x6d, 0x40, 0x65, 0xe4, 0x3a, 0xbd, 0xa0, 0xeb, 0x1f, - 0x19, 0x43, 0x52, 0x2f, 0xb0, 0x33, 0x15, 0x85, 0xd6, 0x00, 0x2e, 0xf8, 0x23, 0x4e, 0x7c, 0xb7, - 0x7e, 0x8d, 0x11, 0x28, 0x18, 0xfc, 0xab, 0x1c, 0x5c, 0x1f, 0xd7, 0x80, 0xfa, 0x7f, 0x03, 0x2a, - 0xfd, 0x10, 0xdb, 0x13, 0x51, 0xa0, 0xa2, 0xd0, 0xc7, 0xb0, 0x48, 0xec, 0x0b, 0xd3, 0x75, 0xec, - 0x21, 0xb1, 0x7d, 0x6f, 0xcf, 0x09, 0x6c, 0x5f, 0xe8, 0x32, 0x7e, 0x40, 0x5f, 0xe2, 0x1b, 0xde, - 0xb9, 0x20, 0xe3, 0xca, 0x29, 0x98, 0x28, 0xde, 0xf2, 0x6a, 0xbc, 0xad, 0x01, 0x0c, 0x1c, 0x4f, - 0x0a, 0x2f, 0x70, 0xae, 0x08, 0x83, 0x30, 0xcc, 0x99, 0xb6, 0xe7, 0x1b, 0x76, 0x97, 0x30, 0x13, - 0x70, 0x0d, 0x63, 0x38, 0xf4, 0x31, 0x14, 0x85, 0xc6, 0xf5, 0x22, 0x8b, 0x13, 0xa4, 0xc4, 0x89, - 0x70, 0x91, 0x2e, 0x49, 0xf0, 0x1d, 0x58, 0xe8, 0x10, 0xc3, 0xed, 0x39, 0x6f, 0x6c, 0xe1, 0x4a, - 0xb4, 0x02, 0xd7, 0x5c, 0x62, 0x78, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, 0x42, 0x11, 0xe9, 0xc8, - 0xba, 0xc4, 0x75, 0x58, 0x69, 0x11, 0xbf, 0xa9, 0xe8, 0x2e, 0xa3, 0xe1, 0x2d, 0x2c, 0x8f, 0x9d, - 0x4c, 0x67, 0xe5, 0xef, 0xc2, 0x9c, 0x6a, 0x4c, 0x91, 0x70, 0x0d, 0x35, 0xd4, 0xa3, 0x63, 0xe6, - 0xbe, 0x18, 0x3d, 0xfe, 0x87, 0x06, 0x0b, 0x09, 0x0a, 0x54, 0x85, 0x9c, 0x29, 0x2f, 0xcb, 0x99, - 0x2c, 0x8e, 0xba, 0x2e, 0x31, 0x7c, 0xd2, 0x7b, 0x31, 0x20, 0x36, 0xf3, 0x61, 0x59, 0x57, 0x51, - 0x91, 0x77, 0x66, 0x55, 0xef, 0x6c, 0x41, 0x81, 0x79, 0xb0, 0x9e, 0x67, 0x8f, 0xaa, 0xab, 0xd9, - 0x3b, 0x70, 0x5c, 0xbf, 0x63, 0x78, 0x3c, 0xa2, 0x38, 0x19, 0x6a, 0x40, 0xc9, 0x75, 0x1c, 0x5f, - 0x77, 0x2c, 0x19, 0xac, 0x21, 0x8c, 0xee, 0x42, 0xad, 0x1b, 0xb8, 0x2e, 0xb1, 0x7d, 0x3d, 0xb0, - 0x8f, 0x82, 0xe1, 0x29, 0xe1, 0xf1, 0x3a, 0xaf, 0x8f, 0xe1, 0xf1, 0x3f, 0x35, 0xb8, 0x7e, 0x44, - 0xde, 0x28, 0x6a, 0x49, 0x57, 0xdd, 0x85, 0x1a, 0xb5, 0x5b, 0xdf, 0x72, 0xde, 0x74, 0xc8, 0x70, - 0x64, 0x45, 0x05, 0x6c, 0x0c, 0x8f, 0x8e, 0x01, 0x46, 0xae, 0x33, 0x22, 0xae, 0x6f, 0x86, 0x85, - 0xec, 0x13, 0x45, 0x85, 0xd4, 0x1b, 0xb6, 0x8e, 0x43, 0x96, 0xa6, 0xed, 0xbb, 0x97, 0xba, 0x22, - 0xa3, 0xf1, 0x10, 0x16, 0x12, 0xc7, 0xa8, 0x06, 0xb3, 0xe7, 0xe4, 0x52, 0xbc, 0x81, 0xfe, 0xa4, - 0xa6, 0xbc, 0x30, 0xac, 0x80, 0x08, 0x33, 0x73, 0xe0, 0x41, 0xee, 0xbe, 0x86, 0x4f, 0x60, 0x29, - 0x79, 0x27, 0x8d, 0x91, 0x2f, 0xa0, 0xa2, 0x78, 0x94, 0x89, 0x9a, 0x1c, 0x00, 0x2a, 0x39, 0xfe, - 0x90, 0x25, 0x78, 0x8a, 0xa9, 0x12, 0x41, 0x80, 0x7f, 0xae, 0xc1, 0x52, 0x92, 0xf2, 0xff, 0xbe, - 0x1e, 0xdd, 0x83, 0x92, 0x34, 0xbc, 0xa8, 0xd2, 0x4b, 0x0a, 0x2b, 0xf5, 0x3c, 0xe3, 0x09, 0x89, - 0xf0, 0xdf, 0x34, 0x58, 0xdd, 0xe3, 0xc7, 0x57, 0x3f, 0x1a, 0x3d, 0x82, 0xbc, 0x7f, 0x39, 0xe2, - 0xb6, 0xac, 0x6e, 0x7f, 0xa4, 0x88, 0xce, 0x94, 0xb1, 0xd5, 0x1e, 0x51, 0x16, 0x9d, 0x31, 0x62, - 0x03, 0xae, 0x71, 0x98, 0x96, 0xfd, 0xa3, 0x76, 0xfb, 0xb8, 0x36, 0x83, 0x10, 0x54, 0x4f, 0x3a, - 0x3b, 0x7a, 0xe7, 0xd5, 0xce, 0x5e, 0xe7, 0xe0, 0xf9, 0x41, 0xe7, 0xc7, 0x35, 0x0d, 0x2d, 0xc2, - 0xfc, 0x49, 0xa7, 0x7d, 0x1c, 0xa1, 0x72, 0x68, 0x1e, 0xca, 0x7b, 0xed, 0xa3, 0xc7, 0x07, 0xad, - 0x67, 0x7a, 0xb3, 0x36, 0x4b, 0xfb, 0x83, 0xde, 0x3c, 0x69, 0x76, 0x6a, 0x79, 0x34, 0x07, 0xa5, - 0x56, 0xfb, 0x15, 0xef, 0x16, 0x05, 0x7c, 0x0e, 0x37, 0xd2, 0x1e, 0x43, 0x6d, 0x9b, 0x54, 0x27, - 0x4c, 0xb3, 0x9c, 0x9a, 0x66, 0x69, 0xa9, 0x31, 0x9b, 0x91, 0x1a, 0xbf, 0xd6, 0xa0, 0x7e, 0xe8, - 0xf4, 0xcc, 0xfe, 0xe5, 0x54, 0xd6, 0x03, 0x1a, 0xad, 0x86, 0x6f, 0x3a, 0xb6, 0xcc, 0x80, 0xf5, - 0x74, 0xcf, 0xb6, 0x25, 0x9d, 0xae, 0xb0, 0xa0, 0xdb, 0x50, 0x75, 0x49, 0xd7, 0xb1, 0xfb, 0xe6, - 0x59, 0xe0, 0x92, 0x1d, 0xcb, 0x62, 0xef, 0x2a, 0xe9, 0x09, 0x2c, 0xfe, 0xad, 0x06, 0xcb, 0x69, - 0xc2, 0xd0, 0x03, 0xe1, 0x3f, 0xde, 0xfe, 0x6f, 0x5f, 0x71, 0x77, 0xcc, 0x75, 0xbc, 0x9a, 0x58, - 0xbc, 0xee, 0xe7, 0x64, 0x35, 0xe1, 0x30, 0xfe, 0x34, 0xc5, 0xad, 0x0b, 0x50, 0xd1, 0x9b, 0x87, - 0xed, 0xe7, 0xcd, 0x57, 0x7a, 0xfb, 0x29, 0xf5, 0xd8, 0x1c, 0x94, 0x76, 0xf6, 0xf7, 0x39, 0x94, - 0xc7, 0xbf, 0xd0, 0x60, 0x25, 0xc5, 0x72, 0xd4, 0x4d, 0x3f, 0x80, 0x5a, 0xdf, 0x30, 0x2d, 0xd2, - 0x6b, 0x47, 0xd6, 0xd2, 0xa6, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x6e, 0xdc, 0xe7, 0x6a, 0x69, - 0xc5, 0x07, 0xb0, 0xba, 0x4f, 0x3c, 0xdf, 0x75, 0xa6, 0xf1, 0xe3, 0x4d, 0x28, 0x9f, 0x13, 0x32, - 0xea, 0xb0, 0x5a, 0x9c, 0x63, 0x1e, 0x88, 0x10, 0x98, 0xc0, 0x8d, 0x34, 0x51, 0x54, 0xb1, 0xef, - 0xc3, 0x62, 0xd7, 0x22, 0x86, 0x1d, 0x70, 0x52, 0x86, 0x14, 0x19, 0x7e, 0x53, 0xcd, 0xa5, 0x24, - 0x8d, 0x3e, 0xce, 0x86, 0xff, 0xa2, 0xc1, 0xfa, 0x49, 0xac, 0x7e, 0x44, 0xb5, 0x30, 0xeb, 0xe1, - 0x2f, 0x53, 0x4a, 0xf0, 0x03, 0xb5, 0x8b, 0x4c, 0x96, 0xf7, 0x75, 0x16, 0xe3, 0x75, 0xb8, 0x95, - 0x7d, 0x3b, 0xd5, 0xd7, 0x83, 0xf5, 0xd6, 0x57, 0x54, 0xb7, 0x0e, 0xc5, 0xd7, 0x01, 0x71, 0xa5, - 0xae, 0x65, 0x5d, 0x82, 0x34, 0x91, 0xc8, 0xdb, 0xae, 0x15, 0xf4, 0x48, 0xcb, 0x72, 0x4e, 0x0d, - 0xcb, 0x93, 0x89, 0x14, 0xc7, 0xe2, 0x3f, 0x69, 0x70, 0xab, 0x35, 0xe9, 0x59, 0xe8, 0x47, 0x31, - 0x93, 0xf2, 0x28, 0xbd, 0xaf, 0x98, 0x74, 0x22, 0xf7, 0xd7, 0x69, 0xd0, 0xff, 0x68, 0x30, 0x1f, - 0x9b, 0x0a, 0x10, 0x82, 0xbc, 0x4d, 0x93, 0x97, 0xb3, 0xb3, 0xdf, 0x74, 0xd6, 0xb2, 0x9c, 0xee, - 0x39, 0xe9, 0x89, 0x38, 0x16, 0x10, 0xc5, 0xd3, 0x19, 0xe2, 0xa0, 0x27, 0xd2, 0x44, 0x40, 0x14, - 0xcf, 0x3f, 0x31, 0xc4, 0xdc, 0x28, 0xa0, 0x28, 0xab, 0x0a, 0x6a, 0x25, 0xbd, 0x09, 0xe5, 0xae, - 0x65, 0x78, 0x9e, 0x32, 0x2b, 0x46, 0x08, 0xd4, 0x84, 0x6a, 0x8f, 0x8c, 0x2c, 0xe7, 0x52, 0xb6, - 0x32, 0x31, 0x2f, 0xaa, 0x5f, 0x25, 0xf4, 0xf1, 0xfb, 0x31, 0x22, 0x3d, 0xc1, 0x44, 0x1b, 0x29, - 0x1a, 0x27, 0xa3, 0xe5, 0x8a, 0x0e, 0xae, 0x8a, 0xc6, 0x21, 0x4c, 0x03, 0xc3, 0x38, 0xa3, 0x84, - 0xb2, 0x30, 0x48, 0x90, 0x9e, 0x38, 0xfd, 0x3e, 0x71, 0x43, 0xc5, 0x25, 0x48, 0x47, 0x63, 0xf2, - 0x96, 0x74, 0x03, 0xdf, 0xa1, 0x87, 0x5c, 0x7b, 0x05, 0x83, 0x17, 0x61, 0xa1, 0x45, 0x7c, 0x91, - 0xa0, 0x7c, 0x0a, 0x7d, 0x04, 0xf3, 0x11, 0x8a, 0x06, 0x4b, 0x38, 0xc0, 0x69, 0x53, 0x0d, 0x70, - 0x78, 0x13, 0xaa, 0x42, 0x80, 0x32, 0x1b, 0x0b, 0xbf, 0x68, 0xaa, 0x5f, 0xf0, 0xb7, 0x61, 0x2e, - 0xa4, 0xa4, 0x37, 0x7d, 0x08, 0x79, 0x7a, 0x22, 0x8a, 0xcb, 0x52, 0xc2, 0xa2, 0xec, 0x0e, 0x46, - 0x80, 0x9b, 0x30, 0x4f, 0x31, 0x7b, 0xd4, 0x2b, 0x99, 0x51, 0x42, 0x07, 0x56, 0xce, 0x7e, 0xe8, - 0xf4, 0x48, 0x38, 0xb0, 0x46, 0x28, 0xfc, 0x33, 0xa8, 0xec, 0x39, 0xc3, 0xa1, 0x61, 0xf7, 0x98, - 0x90, 0x1a, 0xcc, 0x12, 0xfb, 0x82, 0xa9, 0x59, 0xd6, 0xe9, 0x4f, 0x16, 0x20, 0x03, 0x62, 0x59, - 0x22, 0xce, 0x38, 0x10, 0x85, 0xef, 0xac, 0x12, 0xbe, 0x34, 0x6c, 0x0c, 0xf7, 0x2c, 0xe0, 0x03, - 0x78, 0x9e, 0xc9, 0x88, 0x10, 0xf4, 0x81, 0x81, 0x47, 0x5c, 0x11, 0x69, 0xec, 0x37, 0x3e, 0x84, - 0xca, 0xde, 0xc0, 0xb0, 0x6d, 0x62, 0x65, 0xea, 0x80, 0x94, 0xd1, 0xa5, 0x2c, 0x5a, 0x1a, 0xb3, - 0xa6, 0x7b, 0x46, 0xfc, 0x28, 0xca, 0x29, 0x84, 0xff, 0x9b, 0x83, 0x52, 0x98, 0x36, 0xdf, 0x82, - 0xb2, 0x47, 0x9d, 0xc3, 0x22, 0x94, 0xdb, 0x33, 0xdb, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x4a, 0xab, - 0x8a, 0x59, 0xac, 0x9e, 0xf0, 0x43, 0x68, 0x75, 0x3d, 0x22, 0x45, 0xdf, 0x83, 0x05, 0xd3, 0x3e, - 0x75, 0x02, 0xbb, 0x27, 0x54, 0xa2, 0xc5, 0x89, 0x86, 0xcb, 0x8a, 0xda, 0x22, 0x22, 0x6d, 0xf5, - 0x24, 0x39, 0xda, 0x85, 0x9a, 0x13, 0xf8, 0x71, 0x11, 0xf9, 0x89, 0x22, 0xc6, 0xe8, 0xd1, 0x7d, - 0xea, 0xf2, 0xd0, 0xa1, 0xcc, 0xd8, 0x09, 0xf6, 0xe8, 0x54, 0x57, 0x49, 0x69, 0xe2, 0xd1, 0xc8, - 0x3a, 0x36, 0xfc, 0x81, 0xc8, 0xf9, 0x10, 0xa6, 0xfe, 0x26, 0xf6, 0xc5, 0x41, 0x8f, 0x65, 0x7a, - 0x59, 0xe7, 0x00, 0xbe, 0x07, 0x4b, 0xf1, 0x96, 0xc7, 0x63, 0xbd, 0x0e, 0x45, 0x1e, 0xdd, 0x9e, - 0x08, 0x24, 0x09, 0xe2, 0x5f, 0x6a, 0xb0, 0x38, 0xd6, 0x24, 0xd1, 0x03, 0xa8, 0x9c, 0x9b, 0x96, - 0x45, 0x7a, 0x9d, 0xa9, 0x72, 0x4c, 0x25, 0x46, 0x5f, 0xc0, 0x9c, 0x1b, 0xd8, 0xb6, 0x69, 0x9f, - 0xc9, 0xae, 0x3e, 0x99, 0x39, 0x46, 0x8d, 0xf7, 0x58, 0xee, 0xd3, 0xe9, 0x3a, 0x7c, 0x7c, 0xa8, - 0xa9, 0xa6, 0x68, 0x4a, 0x6d, 0x33, 0x32, 0xfc, 0xc1, 0xc9, 0x88, 0x74, 0xe5, 0x0c, 0x25, 0x61, - 0xfc, 0x47, 0x0d, 0x4a, 0x72, 0x40, 0xcf, 0xaa, 0xd5, 0xa2, 0xf6, 0xe6, 0xd2, 0x6b, 0x6f, 0xec, - 0x63, 0xb1, 0x01, 0xa5, 0x7e, 0x60, 0x59, 0xcc, 0x0d, 0xbc, 0x5a, 0x85, 0xb0, 0x6a, 0xd9, 0x42, - 0xcc, 0xb2, 0xe8, 0x0e, 0x14, 0xe8, 0x50, 0xe7, 0xd5, 0xaf, 0x31, 0x03, 0xa4, 0x7e, 0x3c, 0x70, - 0x0a, 0xfc, 0x80, 0x55, 0x37, 0xa1, 0x34, 0xb5, 0x7f, 0xc8, 0xab, 0x5d, 0xc9, 0xfb, 0x7b, 0x0d, - 0xde, 0x6b, 0x11, 0xff, 0x45, 0xe2, 0x1b, 0x31, 0xb4, 0xde, 0x06, 0x54, 0x5c, 0x32, 0x72, 0x8e, - 0x0d, 0xdf, 0x27, 0xae, 0xdc, 0x03, 0xa8, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0xb9, 0x30, 0x3d, 0xd3, - 0xb1, 0x25, 0x15, 0xb7, 0x4a, 0x12, 0x4d, 0x65, 0x19, 0x96, 0xb5, 0xeb, 0x1a, 0x76, 0x77, 0x40, - 0x64, 0xa3, 0x57, 0x51, 0xac, 0x1d, 0x58, 0x56, 0xc7, 0x38, 0xe3, 0x5d, 0xad, 0xa4, 0x4b, 0x10, - 0x9f, 0xc2, 0x72, 0xf2, 0x8d, 0xd2, 0x3d, 0xf4, 0x31, 0xd2, 0x3d, 0xf4, 0x37, 0x8b, 0x7b, 0xf9, - 0x0d, 0x2c, 0x7c, 0x2b, 0x61, 0x36, 0x3b, 0x8b, 0x67, 0x09, 0x2f, 0x85, 0x30, 0xfe, 0x12, 0x56, - 0xd3, 0x4d, 0x41, 0x6d, 0x7a, 0x08, 0x8b, 0xc9, 0x0f, 0xe9, 0xb4, 0x59, 0x38, 0xed, 0x91, 0xfa, - 0x38, 0x27, 0x46, 0x50, 0x7b, 0x6a, 0x7a, 0x74, 0x1a, 0x75, 0x94, 0x45, 0x64, 0x89, 0xc2, 0x99, - 0x61, 0x57, 0x87, 0x62, 0x8f, 0xf4, 0x8d, 0xc0, 0xf2, 0x45, 0xed, 0x96, 0x20, 0xf5, 0x81, 0xf8, - 0xa9, 0xc7, 0x95, 0x4b, 0xa2, 0xf1, 0x6b, 0xa8, 0x2a, 0xf7, 0xca, 0x60, 0xa1, 0x50, 0x5a, 0xb0, - 0x88, 0xd7, 0xe8, 0x9c, 0x02, 0x7d, 0x0e, 0xd7, 0xcf, 0xd8, 0x3c, 0xb6, 0x9f, 0xb8, 0x8c, 0x5b, - 0x39, 0xfd, 0x10, 0x1f, 0x41, 0x75, 0xa7, 0xd7, 0xa3, 0xb2, 0x64, 0x50, 0xa5, 0x29, 0x97, 0xa2, - 0x42, 0x2e, 0x5d, 0x05, 0x1d, 0xe6, 0x42, 0x79, 0xbc, 0x97, 0x23, 0x9b, 0xbc, 0x49, 0x3e, 0x89, - 0xcb, 0x4e, 0x39, 0xa1, 0xb7, 0x9b, 0xb2, 0x13, 0x94, 0x75, 0xf6, 0x1b, 0xdf, 0x81, 0x45, 0x9d, - 0x0c, 0x9d, 0x0b, 0xa2, 0x3e, 0x73, 0x19, 0x0a, 0xa6, 0xdd, 0x23, 0x6f, 0xe5, 0xf6, 0x92, 0x01, - 0xf8, 0x3b, 0xb0, 0xa0, 0x92, 0xd2, 0x17, 0xdc, 0x86, 0xaa, 0x7a, 0x4f, 0x18, 0x8e, 0x09, 0x2c, - 0xfe, 0x08, 0x96, 0x74, 0xd2, 0x77, 0x89, 0x37, 0x50, 0xfd, 0x9e, 0x71, 0xcf, 0x37, 0xe1, 0xfa, - 0x09, 0xf1, 0x15, 0xf6, 0xc9, 0xe4, 0x0f, 0xd9, 0x47, 0x48, 0x2b, 0xcd, 0x03, 0x92, 0x51, 0x8d, - 0x7d, 0x2d, 0x11, 0xfb, 0x3f, 0x64, 0x53, 0x3f, 0xbd, 0x26, 0x83, 0x39, 0xf5, 0xd6, 0x98, 0xc8, - 0x5c, 0x42, 0xe4, 0xa7, 0xf0, 0x5e, 0x96, 0x48, 0x6a, 0x34, 0xe9, 0x06, 0x4d, 0x71, 0x43, 0x11, - 0x0a, 0xcd, 0xe1, 0xc8, 0xbf, 0xdc, 0xfe, 0xc3, 0x02, 0x14, 0xc5, 0xee, 0x00, 0xed, 0x41, 0xa5, - 0xe3, 0x1a, 0xdd, 0x73, 0xbe, 0x17, 0x47, 0xf5, 0xb1, 0x55, 0xb9, 0x78, 0x62, 0x63, 0x25, 0xe5, - 0x84, 0x7e, 0xb0, 0xcc, 0x7c, 0xa2, 0xa1, 0x97, 0x50, 0x4b, 0xae, 0x7b, 0x11, 0x8e, 0x7f, 0x1d, - 0xa4, 0x6d, 0xb3, 0x1b, 0x1b, 0x13, 0x69, 0x98, 0x74, 0xb4, 0x0b, 0x25, 0xb9, 0x0e, 0x45, 0xea, - 0x7e, 0x28, 0xb1, 0x4e, 0x6d, 0xd4, 0x53, 0xcf, 0xb8, 0x8c, 0x17, 0xac, 0x71, 0xa9, 0x7b, 0x52, - 0xf4, 0x7e, 0xe6, 0xc7, 0x4b, 0xa8, 0xf1, 0xfa, 0x24, 0x12, 0x2e, 0xb8, 0x03, 0xd5, 0xf8, 0x6e, - 0x0d, 0x6d, 0x5c, 0xb5, 0xea, 0x6b, 0xac, 0x4d, 0xa0, 0x08, 0xa5, 0xc6, 0xef, 0x43, 0x1b, 0x99, - 0x4f, 0x49, 0x93, 0x9a, 0xb2, 0x6f, 0xc3, 0x33, 0xe8, 0xa7, 0x80, 0xc6, 0x17, 0x46, 0xe8, 0x83, - 0x69, 0x96, 0x5b, 0x0d, 0x7c, 0x05, 0x15, 0xbf, 0xe1, 0x27, 0xb0, 0x38, 0xb6, 0xea, 0x40, 0xdf, - 0x50, 0x58, 0xb3, 0x56, 0x48, 0x8d, 0xf7, 0x27, 0x13, 0x85, 0x0a, 0x8c, 0x6f, 0x1c, 0x62, 0x0a, - 0x64, 0xee, 0x36, 0x62, 0x0a, 0x64, 0xac, 0x2d, 0xf0, 0x0c, 0x72, 0xa1, 0x9e, 0xf5, 0x75, 0x8e, - 0xee, 0x4e, 0xbf, 0x40, 0x68, 0x6c, 0x4e, 0x45, 0x1b, 0xde, 0xd9, 0x9a, 0xe6, 0xce, 0xd6, 0x57, - 0xb8, 0xb3, 0x75, 0xc5, 0x9d, 0xbb, 0x50, 0x92, 0x5f, 0x6c, 0xb1, 0x9c, 0x4a, 0x7c, 0xd9, 0xc5, - 0x72, 0x2a, 0xf6, 0x89, 0x87, 0x67, 0xd0, 0x23, 0x28, 0x0a, 0x14, 0x5a, 0x1d, 0x27, 0x93, 0x12, - 0x6e, 0xa4, 0x1d, 0x71, 0x01, 0x47, 0x30, 0xa7, 0x0e, 0xb7, 0x68, 0x2d, 0x73, 0x35, 0xc4, 0x45, - 0x4d, 0x5c, 0x1d, 0x85, 0x4a, 0xb1, 0x41, 0x2d, 0xa9, 0x94, 0x3a, 0xb2, 0x26, 0x95, 0x8a, 0x26, - 0x3b, 0x3c, 0x83, 0xfa, 0xec, 0x0f, 0x95, 0xb1, 0x21, 0x05, 0xdd, 0x8e, 0xf3, 0x64, 0x0d, 0x74, - 0x8d, 0x0f, 0xae, 0xa4, 0xe3, 0xf7, 0x34, 0xa1, 0x1c, 0x0e, 0x0a, 0xe8, 0x3d, 0x85, 0x29, 0x39, - 0xb6, 0x34, 0x56, 0xd3, 0x0f, 0x43, 0x1f, 0x88, 0x66, 0x1d, 0xf3, 0x41, 0x7c, 0x20, 0x88, 0xf9, - 0x40, 0xed, 0xed, 0x78, 0x06, 0x3d, 0x01, 0x88, 0xda, 0x2d, 0xba, 0x19, 0x9b, 0x4e, 0x12, 0x0d, - 0xbb, 0xd1, 0xc8, 0x38, 0x95, 0xd6, 0x9f, 0x53, 0xbb, 0x6f, 0xcc, 0x9b, 0x29, 0x6d, 0xb9, 0x51, - 0x53, 0x57, 0x9c, 0xb4, 0x2b, 0xe1, 0x19, 0xf4, 0x18, 0xaa, 0xf1, 0xa6, 0x1c, 0xab, 0x7b, 0xa9, - 0xfd, 0x3a, 0x55, 0xce, 0x4b, 0x96, 0xc6, 0xa9, 0xdd, 0x3a, 0x99, 0xc6, 0x93, 0x5a, 0x7a, 0xaa, - 0x6c, 0x0b, 0x56, 0xd2, 0xfb, 0x2e, 0x4a, 0x24, 0x7d, 0x76, 0xb7, 0x6f, 0xdc, 0x9e, 0x82, 0x92, - 0x59, 0x75, 0xf7, 0xfe, 0x9f, 0xdf, 0xad, 0x69, 0x7f, 0x7f, 0xb7, 0xa6, 0xfd, 0xeb, 0xdd, 0x9a, - 0xf6, 0x9b, 0x7f, 0xaf, 0xcd, 0x00, 0xee, 0x0e, 0xb6, 0xba, 0xc4, 0xb5, 0xb7, 0x0c, 0xcb, 0xec, - 0x92, 0x2d, 0x67, 0x7b, 0x4b, 0x4a, 0x72, 0x47, 0x5d, 0x8f, 0xb8, 0x17, 0xc4, 0x7d, 0x99, 0x1b, - 0x9d, 0x9e, 0x5e, 0x63, 0x7f, 0xd9, 0x7f, 0xf6, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1e, 0xeb, - 0xf5, 0xb9, 0xcc, 0x1f, 0x00, 0x00, + // 2474 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x4d, 0x73, 0x1b, 0x59, + 0xd1, 0x23, 0x4b, 0x91, 0xd4, 0xb2, 0x65, 0xf9, 0xd9, 0x71, 0x64, 0x6d, 0xd6, 0xf6, 0x3e, 0xb6, + 0xb2, 0xde, 0xec, 0xa2, 0xb0, 0xde, 0x2d, 0x36, 0xa4, 0x36, 0x1b, 0xfc, 0xa1, 0x28, 0x86, 0xd8, + 0x0a, 0x63, 0x25, 0x81, 0x54, 0x51, 0x61, 0x2c, 0x3d, 0x59, 0x5a, 0x8f, 0x66, 0x94, 0x37, 0x23, + 0x25, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x1c, 0xb8, 0x70, 0xa5, 0x28, 0x8e, 0xdc, 0x39, 0x50, 0xc5, + 0x95, 0x03, 0x14, 0xf0, 0x0f, 0xa8, 0x50, 0xc5, 0x89, 0x1f, 0x41, 0xbd, 0xaf, 0x99, 0x37, 0xa3, + 0x19, 0xd9, 0x5b, 0x14, 0x37, 0x75, 0xbf, 0xee, 0x7e, 0xfd, 0xf5, 0xba, 0x7b, 0x5a, 0xb0, 0x36, + 0xa2, 0xae, 0xef, 0x7a, 0x77, 0xdc, 0x9d, 0x8e, 0xeb, 0xf8, 0xd4, 0xb5, 0xeb, 0x1c, 0x81, 0x8a, + 0x01, 0x02, 0xaf, 0xc1, 0x6a, 0x63, 0x42, 0x1c, 0xff, 0xe5, 0x11, 0xf1, 0x5c, 0xef, 0x11, 0xb1, + 0xa8, 0x7f, 0x4a, 0x2c, 0x1f, 0x2f, 0xc1, 0xe2, 0x89, 0x6f, 0xf9, 0x63, 0xcf, 0x24, 0xaf, 0xc6, + 0xc4, 0xf3, 0xf1, 0x29, 0x94, 0x14, 0x62, 0x64, 0x5f, 0xa0, 0x55, 0xc8, 0x79, 0xbe, 0xe5, 0x93, + 0xaa, 0xb1, 0x65, 0x6c, 0x17, 0x4d, 0x01, 0xa0, 0xfb, 0xb0, 0xe8, 0x71, 0xa2, 0xa7, 0xa3, 0xae, + 0xe5, 0x13, 0xaf, 0x9a, 0xd9, 0x9a, 0xdf, 0x2e, 0xed, 0xdc, 0xa8, 0x87, 0x1a, 0x9c, 0x68, 0xe7, + 0x66, 0x94, 0x1a, 0xff, 0xd5, 0x80, 0x05, 0xfd, 0x1c, 0x7d, 0x0a, 0x39, 0x9b, 0x4c, 0x88, 0xcd, + 0x6f, 0x29, 0xef, 0xbc, 0x9b, 0x22, 0xa7, 0xfe, 0x98, 0x11, 0x99, 0x82, 0x16, 0x1d, 0x42, 0x79, + 0x18, 0x31, 0xa6, 0x9a, 0xd9, 0x32, 0xb6, 0x4b, 0x3b, 0x9b, 0x1a, 0x77, 0x92, 0xcd, 0x8f, 0xe6, + 0xcc, 0x18, 0x23, 0xfe, 0x0c, 0x72, 0x5c, 0x34, 0x2a, 0x42, 0xee, 0xa0, 0xb1, 0xf7, 0xb4, 0x59, + 0x99, 0x43, 0x05, 0xc8, 0x1e, 0x1e, 0x3f, 0x6c, 0x55, 0x0c, 0x54, 0x82, 0xfc, 0xf3, 0x5d, 0xf3, + 0xf8, 0xf0, 0xb8, 0x59, 0xc9, 0x30, 0x8a, 0x86, 0x69, 0xb6, 0xcc, 0xca, 0xfc, 0x5e, 0x1e, 0x72, + 0x5c, 0x3e, 0x5e, 0x87, 0x1b, 0x4d, 0xe2, 0x3f, 0xa4, 0xd6, 0x90, 0xbc, 0x76, 0xe9, 0xf9, 0xa1, + 0xd3, 0x73, 0x95, 0x3b, 0x7f, 0x6b, 0x40, 0xfe, 0x19, 0xa1, 0xde, 0xc0, 0x75, 0x98, 0x2f, 0x87, + 0xd6, 0x57, 0x2e, 0xe5, 0x56, 0xe6, 0x4c, 0x01, 0x70, 0xec, 0xc0, 0x71, 0x29, 0xd7, 0x9e, 0x61, + 0x19, 0xc0, 0xb0, 0x23, 0xcb, 0xef, 0xf4, 0xab, 0xf3, 0x02, 0xcb, 0x01, 0x86, 0x3d, 0x1d, 0x0f, + 0xec, 0x6e, 0x35, 0x2b, 0xa2, 0xc1, 0x01, 0xb4, 0x05, 0xa5, 0x11, 0x75, 0xbb, 0xe3, 0x8e, 0x7f, + 0x6c, 0x0d, 0x49, 0x35, 0xc7, 0xcf, 0x74, 0x14, 0xda, 0x00, 0x98, 0x08, 0x25, 0x4e, 0x7c, 0x5a, + 0xbd, 0xc6, 0x09, 0x34, 0x0c, 0xfe, 0x65, 0x06, 0xae, 0x4f, 0x5b, 0xc0, 0xe2, 0xbf, 0x05, 0xa5, + 0x5e, 0x80, 0xed, 0xca, 0x2c, 0xd0, 0x51, 0xe8, 0x63, 0x58, 0x26, 0xce, 0x64, 0x40, 0x5d, 0x67, + 0x48, 0x1c, 0xdf, 0xdb, 0x77, 0xc7, 0x8e, 0x2f, 0x6d, 0x99, 0x3e, 0x60, 0x9a, 0xf8, 0x96, 0x77, + 0x2e, 0xc9, 0x84, 0x71, 0x1a, 0x26, 0xcc, 0xb7, 0xac, 0x9e, 0x6f, 0x1b, 0x00, 0x7d, 0xd7, 0x53, + 0xc2, 0x73, 0x82, 0x2b, 0xc4, 0x20, 0x0c, 0x0b, 0x03, 0xc7, 0xf3, 0x2d, 0xa7, 0x43, 0xb8, 0x0b, + 0x84, 0x85, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0xd2, 0xe2, 0x6a, 0x9e, 0xe7, 0x09, 0xd2, 0xf2, 0x44, + 0x86, 0xc8, 0x54, 0x24, 0xf8, 0x43, 0x58, 0x6a, 0x13, 0x8b, 0x76, 0xdd, 0xd7, 0x8e, 0x0c, 0x25, + 0x5a, 0x83, 0x6b, 0x94, 0x58, 0x9e, 0xeb, 0x48, 0x2f, 0x48, 0x88, 0x3d, 0xa1, 0x90, 0x74, 0x64, + 0x5f, 0xe0, 0x2a, 0xac, 0x35, 0x89, 0xdf, 0xd0, 0x6c, 0x57, 0xd9, 0xf0, 0x06, 0x56, 0xa7, 0x4e, + 0xae, 0xe6, 0xe5, 0x2f, 0x61, 0x41, 0x77, 0xa6, 0x7c, 0x70, 0x35, 0x3d, 0xd5, 0xc3, 0x63, 0x1e, + 0xbe, 0x08, 0x3d, 0xfe, 0x87, 0x01, 0x4b, 0x31, 0x0a, 0x54, 0x86, 0xcc, 0x40, 0x5d, 0x96, 0x19, + 0xf0, 0x3c, 0xea, 0x50, 0x62, 0xf9, 0xa4, 0xfb, 0xbc, 0x4f, 0x1c, 0x1e, 0xc3, 0xa2, 0xa9, 0xa3, + 0xc2, 0xe8, 0xcc, 0xeb, 0xd1, 0xa9, 0x43, 0x8e, 0x47, 0xb0, 0x9a, 0xe5, 0x4a, 0x55, 0xf5, 0xd7, + 0xdb, 0x77, 0xa9, 0xdf, 0xb6, 0x3c, 0x91, 0x51, 0x82, 0x0c, 0xd5, 0xa0, 0x40, 0x5d, 0xd7, 0x37, + 0x5d, 0x5b, 0x25, 0x6b, 0x00, 0xa3, 0xdb, 0x50, 0xe9, 0x8c, 0x29, 0x25, 0x8e, 0x6f, 0x8e, 0x9d, + 0xe3, 0xf1, 0xf0, 0x94, 0x88, 0x7c, 0x5d, 0x34, 0xa7, 0xf0, 0xf8, 0x8f, 0x06, 0x5c, 0x3f, 0x26, + 0xaf, 0x35, 0xb3, 0x54, 0xa8, 0x6e, 0x43, 0x85, 0xf9, 0xad, 0x67, 0xbb, 0xaf, 0xdb, 0x64, 0x38, + 0xb2, 0xc3, 0x02, 0x36, 0x85, 0x47, 0x5f, 0x42, 0x76, 0x62, 0x51, 0xe5, 0xd1, 0xdb, 0x9a, 0xf2, + 0x89, 0xb2, 0xeb, 0xcf, 0x2c, 0xea, 0x35, 0x1c, 0x9f, 0x5e, 0x98, 0x9c, 0xaf, 0xf6, 0x39, 0x14, + 0x03, 0x14, 0xaa, 0xc0, 0xfc, 0x39, 0xb9, 0x90, 0x77, 0xb1, 0x9f, 0xcc, 0x65, 0x13, 0xcb, 0x1e, + 0x13, 0xe9, 0x4e, 0x01, 0xdc, 0xcb, 0xdc, 0x35, 0xf0, 0x09, 0xac, 0xc4, 0x6f, 0x60, 0xb9, 0xf0, + 0x05, 0x94, 0xb4, 0xc8, 0x71, 0x51, 0xb3, 0x03, 0xad, 0x93, 0xe3, 0x0f, 0xf8, 0x43, 0x4e, 0x70, + 0x49, 0x2c, 0xd8, 0xf8, 0x67, 0x06, 0xac, 0xc4, 0x29, 0xff, 0xe7, 0xeb, 0xd1, 0x1d, 0x28, 0x28, + 0x07, 0xcb, 0x6a, 0xbc, 0xa2, 0xb1, 0xb2, 0x08, 0x73, 0x9e, 0x80, 0x08, 0xff, 0xcd, 0x80, 0xf5, + 0x7d, 0x71, 0x7c, 0xb9, 0xd2, 0xe8, 0x01, 0x64, 0xfd, 0x8b, 0x91, 0xf0, 0x65, 0x79, 0xe7, 0x23, + 0x4d, 0x74, 0xaa, 0x8c, 0x7a, 0x6b, 0xc4, 0x58, 0x4c, 0xce, 0x88, 0x2d, 0xb8, 0x26, 0x60, 0x56, + 0xde, 0x8f, 0x5b, 0xad, 0x27, 0x95, 0x39, 0x84, 0xa0, 0x7c, 0xd2, 0xde, 0x35, 0xdb, 0x2f, 0x77, + 0xf7, 0xdb, 0x87, 0xcf, 0x0e, 0xdb, 0x3f, 0xaa, 0x18, 0x68, 0x19, 0x16, 0x4f, 0xda, 0xad, 0x27, + 0x21, 0x2a, 0x83, 0x16, 0xa1, 0xb8, 0xdf, 0x3a, 0x7e, 0x78, 0xd8, 0x7c, 0x6a, 0x36, 0x2a, 0xf3, + 0xac, 0x0f, 0x98, 0x8d, 0x93, 0x46, 0xbb, 0x92, 0x45, 0x0b, 0x50, 0x68, 0xb6, 0x5e, 0x8a, 0xae, + 0x90, 0xc3, 0xe7, 0x70, 0x23, 0x49, 0x19, 0xe6, 0xdb, 0xb8, 0x39, 0xc1, 0x73, 0xca, 0xe8, 0xcf, + 0x29, 0xe9, 0x09, 0xcc, 0xa7, 0x3c, 0x81, 0x5f, 0x19, 0x50, 0x3d, 0x72, 0xbb, 0x83, 0xde, 0xc5, + 0x95, 0xbc, 0x07, 0xee, 0x88, 0x50, 0xcb, 0x1f, 0xb8, 0x8e, 0xca, 0xf7, 0xcd, 0xe4, 0xc8, 0xb6, + 0x14, 0x9d, 0xa9, 0xb1, 0xa0, 0x5b, 0x50, 0xa6, 0xa4, 0xe3, 0x3a, 0xbd, 0xc1, 0xd9, 0x98, 0x92, + 0x5d, 0xdb, 0xe6, 0x7a, 0x15, 0xcc, 0x18, 0x16, 0xff, 0xc6, 0x80, 0xd5, 0x24, 0x61, 0xe8, 0x9e, + 0x8c, 0x9f, 0x68, 0xf3, 0xb7, 0x2e, 0xb9, 0x3b, 0x12, 0x3a, 0x51, 0x35, 0x6c, 0x51, 0xdf, 0x33, + 0xaa, 0x6a, 0x08, 0x18, 0x7f, 0x92, 0x10, 0xd6, 0x25, 0x28, 0x99, 0x8d, 0xa3, 0xd6, 0xb3, 0xc6, + 0x4b, 0xb3, 0xf5, 0x98, 0x45, 0x6c, 0x01, 0x0a, 0xbb, 0x07, 0x07, 0x02, 0xca, 0xe2, 0x9f, 0x1b, + 0xb0, 0x96, 0xe0, 0x39, 0x16, 0xa6, 0xef, 0x43, 0xa5, 0x67, 0x0d, 0x6c, 0xd2, 0x6d, 0x85, 0xde, + 0x32, 0xae, 0xe6, 0xad, 0x29, 0x46, 0x19, 0x84, 0xcc, 0x74, 0xcc, 0xf5, 0x12, 0x8a, 0x0f, 0x61, + 0xfd, 0x80, 0x78, 0x3e, 0x75, 0xaf, 0x12, 0xc7, 0x9b, 0x50, 0x3c, 0x27, 0x64, 0xd4, 0xe6, 0x35, + 0x37, 0xc3, 0x23, 0x10, 0x22, 0x30, 0x81, 0x1b, 0x49, 0xa2, 0x98, 0x61, 0xdf, 0x83, 0xe5, 0x8e, + 0x4d, 0x2c, 0x67, 0x2c, 0x48, 0x39, 0x52, 0xbe, 0xf0, 0x9b, 0xfa, 0x5b, 0x8a, 0xd3, 0x98, 0xd3, + 0x6c, 0xf8, 0x2f, 0x06, 0x6c, 0x9e, 0x44, 0xea, 0xc7, 0x13, 0xca, 0x52, 0xc5, 0x1f, 0x10, 0x2f, + 0x4d, 0xf1, 0x17, 0x00, 0xa3, 0x80, 0x48, 0x26, 0xe0, 0x3d, 0xbd, 0x5b, 0xcc, 0x96, 0x57, 0x0f, + 0x31, 0xa2, 0x00, 0x6b, 0xd2, 0x6a, 0xf7, 0x61, 0x29, 0x76, 0xfc, 0xb5, 0x8a, 0xf1, 0x26, 0xbc, + 0x9b, 0x7e, 0x3b, 0xb3, 0xd7, 0x83, 0xcd, 0xe6, 0xd7, 0x34, 0xb7, 0x0a, 0xf9, 0x57, 0x63, 0x42, + 0x95, 0xad, 0x45, 0x53, 0x81, 0xec, 0x21, 0x91, 0x37, 0x1d, 0x7b, 0xdc, 0x25, 0x4d, 0xdb, 0x3d, + 0xb5, 0x6c, 0x4f, 0x3d, 0xa4, 0x28, 0x16, 0xff, 0xc1, 0x80, 0x77, 0x9b, 0xb3, 0xd4, 0x42, 0x3f, + 0x8c, 0xb8, 0x54, 0x64, 0xe9, 0x5d, 0xcd, 0xa5, 0x33, 0xb9, 0xff, 0x9f, 0x0e, 0xfd, 0xb7, 0x01, + 0x8b, 0x91, 0xee, 0x8f, 0x10, 0x64, 0x1d, 0xf6, 0x78, 0x05, 0x3b, 0xff, 0xcd, 0x66, 0x2a, 0xdb, + 0xed, 0x9c, 0x93, 0xae, 0xcc, 0x63, 0x09, 0x31, 0x3c, 0x9b, 0x15, 0x0e, 0xbb, 0xf2, 0x99, 0x48, + 0x88, 0xe1, 0xc5, 0xa7, 0x84, 0x9c, 0x0f, 0x25, 0x14, 0xbe, 0xaa, 0x9c, 0x5e, 0x49, 0x6f, 0x42, + 0xb1, 0x63, 0x5b, 0x9e, 0xa7, 0xcd, 0x84, 0x21, 0x02, 0x35, 0xa0, 0xdc, 0x25, 0x23, 0xdb, 0xbd, + 0x50, 0xad, 0x4c, 0xce, 0x85, 0xfa, 0xd7, 0x07, 0x53, 0xfe, 0x20, 0x42, 0x64, 0xc6, 0x98, 0x58, + 0x23, 0x45, 0xd3, 0x64, 0xac, 0x5c, 0xb1, 0x01, 0x55, 0xb3, 0x38, 0x80, 0x59, 0x62, 0x58, 0x67, + 0x8c, 0x50, 0x15, 0x06, 0x05, 0xb2, 0x13, 0xb7, 0xd7, 0x23, 0x34, 0x30, 0x5c, 0x81, 0x6c, 0x04, + 0x26, 0x6f, 0x48, 0x67, 0xec, 0xbb, 0xec, 0x50, 0x58, 0xaf, 0x61, 0xf0, 0x32, 0x2c, 0x35, 0x89, + 0x2f, 0x1f, 0xa8, 0x98, 0x36, 0x1f, 0xc0, 0x62, 0x88, 0x62, 0xc9, 0x12, 0x0c, 0x6a, 0xc6, 0x95, + 0x06, 0x35, 0xbc, 0x0d, 0x65, 0x29, 0x40, 0x9b, 0x81, 0x65, 0x5c, 0x0c, 0x3d, 0x2e, 0xf8, 0x73, + 0x58, 0x08, 0x28, 0xd9, 0x4d, 0x1f, 0x40, 0x96, 0x9d, 0xc8, 0xe2, 0xb2, 0x12, 0xf3, 0x28, 0xbf, + 0x83, 0x13, 0xe0, 0x06, 0x2c, 0x32, 0xcc, 0x3e, 0x8b, 0x4a, 0x6a, 0x96, 0xb0, 0xc1, 0x54, 0xb0, + 0x1f, 0xb9, 0x5d, 0x12, 0x0c, 0xa6, 0x21, 0x0a, 0xff, 0x14, 0x4a, 0xfb, 0xee, 0x70, 0x68, 0x39, + 0x5d, 0x2e, 0xa4, 0x02, 0xf3, 0xc4, 0x99, 0x70, 0x33, 0x8b, 0x26, 0xfb, 0xc9, 0x13, 0xa4, 0x4f, + 0x6c, 0x5b, 0xe6, 0x99, 0x00, 0xc2, 0xf4, 0x9d, 0xd7, 0xd2, 0x97, 0xa5, 0x8d, 0x45, 0xcf, 0xc6, + 0x62, 0xd0, 0xce, 0x72, 0x19, 0x21, 0x82, 0x29, 0x38, 0xf6, 0x08, 0x95, 0x99, 0xc6, 0x7f, 0xe3, + 0x23, 0x28, 0xed, 0xf7, 0x2d, 0xc7, 0x21, 0x76, 0xaa, 0x0d, 0x48, 0x1b, 0x5d, 0x8a, 0xb2, 0xa5, + 0x71, 0x6f, 0xd2, 0x33, 0xe2, 0x87, 0x59, 0xce, 0x20, 0xfc, 0x9f, 0x0c, 0x14, 0x82, 0x67, 0xf3, + 0x6d, 0x28, 0x7a, 0x2c, 0x38, 0x3c, 0x43, 0x85, 0x3f, 0xd3, 0x03, 0x17, 0x92, 0x32, 0xbe, 0x8e, + 0xf2, 0xaa, 0x9c, 0xc5, 0xaa, 0xb1, 0x38, 0x04, 0x5e, 0x37, 0x43, 0x52, 0xf4, 0x5d, 0x58, 0x1a, + 0x38, 0xa7, 0xee, 0xd8, 0xe9, 0x4a, 0x93, 0x58, 0x71, 0x62, 0xe9, 0xb2, 0xa6, 0xb7, 0x88, 0xd0, + 0x5a, 0x33, 0x4e, 0x8e, 0xf6, 0xa0, 0xe2, 0x8e, 0xfd, 0xa8, 0x88, 0xec, 0x4c, 0x11, 0x53, 0xf4, + 0xe8, 0x2e, 0x0b, 0x79, 0x10, 0x50, 0xee, 0xec, 0x18, 0x7b, 0x78, 0x6a, 0xea, 0xa4, 0xec, 0xe1, + 0xb1, 0xcc, 0x7a, 0x62, 0xf9, 0x7d, 0xf9, 0xe6, 0x03, 0x98, 0xc5, 0x9b, 0x38, 0x93, 0xc3, 0x2e, + 0x7f, 0xe9, 0x45, 0x53, 0x00, 0xf8, 0x0e, 0xac, 0x44, 0x5b, 0x9e, 0xc8, 0xf5, 0x2a, 0xe4, 0x45, + 0x76, 0x7b, 0x32, 0x91, 0x14, 0x88, 0x7f, 0x61, 0xc0, 0xf2, 0x54, 0x93, 0x44, 0xf7, 0xa0, 0x74, + 0x3e, 0xb0, 0x6d, 0xd2, 0x6d, 0x5f, 0xe9, 0x8d, 0xe9, 0xc4, 0xe8, 0x0b, 0x58, 0xa0, 0x63, 0xc7, + 0x19, 0x38, 0x67, 0xaa, 0xab, 0xcf, 0x66, 0x8e, 0x50, 0xe3, 0x7d, 0xfe, 0xf6, 0xd9, 0x74, 0x1d, + 0x28, 0x1f, 0x58, 0x6a, 0x68, 0x96, 0x32, 0xdf, 0x8c, 0x2c, 0xbf, 0x7f, 0x32, 0x22, 0x1d, 0x35, + 0x43, 0x29, 0x18, 0xff, 0xde, 0x80, 0x82, 0x1a, 0xd0, 0xd3, 0x6a, 0xb5, 0xac, 0xbd, 0x99, 0xe4, + 0xda, 0x1b, 0xf9, 0x28, 0xac, 0x41, 0xa1, 0x37, 0xb6, 0x6d, 0x1e, 0x06, 0x51, 0xad, 0x02, 0x58, + 0xf7, 0x6c, 0x2e, 0xe2, 0x59, 0xf4, 0x21, 0xe4, 0xd8, 0x50, 0xe7, 0x55, 0xaf, 0x71, 0x07, 0x24, + 0x7e, 0x3c, 0x08, 0x0a, 0x7c, 0x8f, 0x57, 0x37, 0x69, 0x34, 0xf3, 0x7f, 0xc0, 0x6b, 0x5c, 0xca, + 0xfb, 0x3b, 0x03, 0xde, 0x69, 0x12, 0xff, 0x79, 0xec, 0x5b, 0x30, 0xf0, 0xde, 0x16, 0x94, 0x28, + 0x19, 0xb9, 0x4f, 0x2c, 0xdf, 0x27, 0x54, 0x7d, 0xef, 0xeb, 0x28, 0xb4, 0x0d, 0x4b, 0x94, 0x4c, + 0x06, 0xde, 0xc0, 0x75, 0x14, 0x95, 0xf0, 0x4a, 0x1c, 0xcd, 0x64, 0x59, 0xb6, 0xbd, 0x47, 0x2d, + 0xa7, 0xd3, 0x27, 0xaa, 0xd1, 0xeb, 0x28, 0xde, 0x0e, 0x6c, 0xbb, 0x6d, 0x9d, 0x89, 0xae, 0x56, + 0x30, 0x15, 0x88, 0x4f, 0x61, 0x35, 0xae, 0xa3, 0x0a, 0x0f, 0x53, 0x46, 0x85, 0x87, 0xfd, 0xe6, + 0x79, 0xaf, 0xbe, 0x75, 0x65, 0x6c, 0x15, 0xcc, 0x67, 0x67, 0xa9, 0x96, 0x8c, 0x52, 0x00, 0xe3, + 0xaf, 0x60, 0x3d, 0xd9, 0x15, 0xcc, 0xa7, 0x47, 0xb0, 0x1c, 0xff, 0x60, 0x4e, 0x9a, 0x85, 0x93, + 0x94, 0x34, 0xa7, 0x39, 0x31, 0x82, 0xca, 0xe3, 0x81, 0xc7, 0xa6, 0x51, 0x57, 0x5b, 0x38, 0x16, + 0x18, 0x9c, 0x9a, 0x76, 0x55, 0xc8, 0x77, 0x49, 0xcf, 0x1a, 0xdb, 0xbe, 0xac, 0xdd, 0x0a, 0x64, + 0x31, 0x90, 0x3f, 0xcd, 0xa8, 0x71, 0x71, 0x34, 0x7e, 0x05, 0x65, 0xed, 0x5e, 0x95, 0x2c, 0x0c, + 0x4a, 0x4a, 0x16, 0xa9, 0x8d, 0x29, 0x28, 0xd0, 0x67, 0x70, 0xfd, 0x8c, 0xcf, 0x63, 0x07, 0xb1, + 0xcb, 0x84, 0x97, 0x93, 0x0f, 0xf1, 0x31, 0x94, 0x77, 0xbb, 0x5d, 0x26, 0x4b, 0x25, 0x55, 0x92, + 0x71, 0x09, 0x26, 0x64, 0x92, 0x4d, 0x30, 0x61, 0x21, 0x90, 0x27, 0x7a, 0x39, 0x72, 0xc8, 0xeb, + 0xb8, 0x4a, 0x42, 0x76, 0xc2, 0x09, 0xbb, 0x7d, 0xa0, 0x3a, 0x41, 0xd1, 0xe4, 0xbf, 0xf1, 0x87, + 0xb0, 0x6c, 0x92, 0xa1, 0x3b, 0x21, 0xba, 0x9a, 0xab, 0x90, 0x1b, 0x38, 0x5d, 0xf2, 0x46, 0x6d, + 0x29, 0x39, 0x80, 0xbf, 0x03, 0x4b, 0x3a, 0x29, 0xd3, 0xe0, 0x16, 0x94, 0xf5, 0x7b, 0x82, 0x74, + 0x8c, 0x61, 0xf1, 0x47, 0xb0, 0x62, 0x92, 0x1e, 0x25, 0x5e, 0x5f, 0x8f, 0x7b, 0xca, 0x3d, 0xdf, + 0x84, 0xeb, 0x27, 0xc4, 0xd7, 0xd8, 0x67, 0x93, 0xdf, 0xe7, 0x1f, 0x21, 0xcd, 0xa4, 0x08, 0x28, + 0x46, 0x3d, 0xf7, 0x8d, 0x58, 0xee, 0xff, 0x80, 0x4f, 0xfd, 0xec, 0x9a, 0x14, 0xe6, 0xc4, 0x5b, + 0x23, 0x22, 0x33, 0x31, 0x91, 0x9f, 0xc0, 0x3b, 0x69, 0x22, 0x99, 0xd3, 0x54, 0x18, 0x0c, 0x2d, + 0x0c, 0x79, 0xc8, 0x35, 0x86, 0x23, 0xff, 0x62, 0xe7, 0x4f, 0x8b, 0x90, 0x97, 0xbb, 0x03, 0xb4, + 0x0f, 0xa5, 0x36, 0xb5, 0x3a, 0xe7, 0x62, 0xff, 0x8d, 0xaa, 0x53, 0x2b, 0x71, 0xa9, 0x62, 0x6d, + 0x2d, 0xe1, 0x84, 0x7d, 0xb0, 0xcc, 0x7d, 0xcb, 0x40, 0x2f, 0xa0, 0x12, 0x5f, 0xeb, 0x22, 0x1c, + 0xfd, 0x3a, 0x48, 0xda, 0x5a, 0xd7, 0xb6, 0x66, 0xd2, 0x70, 0xe9, 0x68, 0x0f, 0x0a, 0x6a, 0xed, + 0x89, 0xf4, 0xfd, 0x50, 0x6c, 0x6d, 0x5a, 0xab, 0x26, 0x9e, 0x09, 0x19, 0xcf, 0x79, 0xe3, 0xd2, + 0xf7, 0xa1, 0xe8, 0xbd, 0xd4, 0x8f, 0x97, 0xc0, 0xe2, 0xcd, 0x59, 0x24, 0x42, 0x70, 0x1b, 0xca, + 0xd1, 0xdd, 0x1a, 0xda, 0xba, 0x6c, 0xb1, 0x57, 0xdb, 0x98, 0x41, 0x11, 0x48, 0x8d, 0xde, 0x87, + 0xb6, 0x52, 0x55, 0x49, 0x92, 0x9a, 0xb0, 0x6f, 0xc3, 0x73, 0xe8, 0x27, 0x80, 0xa6, 0x17, 0x46, + 0xe8, 0xfd, 0xab, 0x2c, 0xb7, 0x6a, 0xf8, 0x12, 0x2a, 0x71, 0xc3, 0x8f, 0x61, 0x79, 0x6a, 0xd5, + 0x81, 0xbe, 0xa1, 0xb1, 0xa6, 0xad, 0x90, 0x6a, 0xef, 0xcd, 0x26, 0x0a, 0x0c, 0x98, 0xde, 0x38, + 0x44, 0x0c, 0x48, 0xdd, 0x6d, 0x44, 0x0c, 0x48, 0x59, 0x5b, 0x88, 0x5c, 0x53, 0x5f, 0x32, 0x91, + 0x5c, 0x8b, 0x7d, 0xf1, 0x44, 0x72, 0x2d, 0xf2, 0xe9, 0x83, 0xe7, 0xd0, 0x03, 0xc8, 0x4b, 0x14, + 0x5a, 0x9f, 0x26, 0x53, 0x12, 0x6e, 0x24, 0x1d, 0x09, 0x01, 0xc7, 0xb0, 0xa0, 0x0f, 0x7d, 0x68, + 0x23, 0x75, 0x65, 0x22, 0x44, 0xcd, 0x5c, 0xa9, 0x04, 0x46, 0xf1, 0x01, 0x26, 0x6e, 0x94, 0x3e, + 0xca, 0xc5, 0x8d, 0x0a, 0x27, 0x1e, 0x3c, 0x87, 0x7a, 0xfc, 0x0f, 0x85, 0xa9, 0xe6, 0x8d, 0x6e, + 0x45, 0x79, 0xd2, 0x06, 0x9d, 0xda, 0xfb, 0x97, 0xd2, 0x89, 0x7b, 0x1a, 0x50, 0x0c, 0x1a, 0x28, + 0x7a, 0x47, 0x63, 0x8a, 0xb7, 0xf3, 0xda, 0x7a, 0xf2, 0x61, 0x10, 0x03, 0xd9, 0xc4, 0x22, 0x31, + 0x88, 0x36, 0xca, 0x48, 0x0c, 0xf4, 0x9e, 0x87, 0xe7, 0xd0, 0x23, 0x80, 0xb0, 0x0d, 0xa1, 0x9b, + 0x91, 0xae, 0x1d, 0x6b, 0x64, 0xb5, 0x5a, 0xca, 0xa9, 0xf2, 0xfe, 0x82, 0xde, 0x95, 0x22, 0xd1, + 0x4c, 0x68, 0x57, 0xb5, 0x8a, 0xbe, 0xfa, 0x63, 0xd5, 0x1a, 0xcf, 0xa1, 0x87, 0x50, 0x8e, 0x36, + 0xab, 0x48, 0x3d, 0x48, 0xec, 0x63, 0x89, 0x72, 0x5e, 0x40, 0x35, 0xad, 0x8b, 0xa1, 0xdb, 0x51, + 0x89, 0xb3, 0x5a, 0x5d, 0xa2, 0x6c, 0x1b, 0xd6, 0x92, 0xfb, 0x11, 0xda, 0x8e, 0x4a, 0x4e, 0xef, + 0x82, 0xb5, 0x5b, 0x57, 0xa0, 0xe4, 0x5e, 0xdd, 0xbb, 0xfb, 0xe7, 0xb7, 0x1b, 0xc6, 0xdf, 0xdf, + 0x6e, 0x18, 0xff, 0x7c, 0xbb, 0x61, 0xfc, 0xfa, 0x5f, 0x1b, 0x73, 0x80, 0x3b, 0xfd, 0x7a, 0x87, + 0x50, 0xa7, 0x6e, 0xd9, 0x83, 0x0e, 0xa9, 0xbb, 0x3b, 0x75, 0x25, 0x89, 0x8e, 0x3a, 0x1e, 0xa1, + 0x13, 0x42, 0x5f, 0x64, 0x46, 0xa7, 0xa7, 0xd7, 0xf8, 0x5f, 0xd6, 0x9f, 0xfe, 0x37, 0x00, 0x00, + 0xff, 0xff, 0x5b, 0x99, 0x04, 0x0b, 0xcc, 0x1e, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -3662,8 +3661,6 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) - GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -3790,24 +3787,6 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } -func (c *controlClient) SetEnvironmentProperties(ctx context.Context, in *SetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*SetEnvironmentPropertiesReply, error) { - out := new(SetEnvironmentPropertiesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetEnvironmentProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironmentProperties(ctx context.Context, in *GetEnvironmentPropertiesRequest, opts ...grpc.CallOption) (*GetEnvironmentPropertiesReply, error) { - out := new(GetEnvironmentPropertiesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironmentProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -3927,8 +3906,6 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - SetEnvironmentProperties(context.Context, *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) - GetEnvironmentProperties(context.Context, *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -3974,12 +3951,6 @@ func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *M func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } -func (*UnimplementedControlServer) SetEnvironmentProperties(ctx context.Context, req *SetEnvironmentPropertiesRequest) (*SetEnvironmentPropertiesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetEnvironmentProperties not implemented") -} -func (*UnimplementedControlServer) GetEnvironmentProperties(ctx context.Context, req *GetEnvironmentPropertiesRequest) (*GetEnvironmentPropertiesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironmentProperties not implemented") -} func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -4186,42 +4157,6 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_SetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetEnvironmentPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetEnvironmentProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetEnvironmentProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetEnvironmentProperties(ctx, req.(*SetEnvironmentPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironmentProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironmentProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironmentProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironmentProperties(ctx, req.(*GetEnvironmentPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -4474,14 +4409,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, - { - MethodName: "SetEnvironmentProperties", - Handler: _Control_SetEnvironmentProperties_Handler, - }, - { - MethodName: "GetEnvironmentProperties", - Handler: _Control_GetEnvironmentProperties_Handler, - }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -5104,9 +5031,9 @@ func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] baseI := i i -= len(v) copy(dAtA[i:], v) @@ -7450,8 +7377,8 @@ func (m *NewEnvironmentRequest) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { + if len(m.Vars) > 0 { + for k, v := range m.Vars { _ = k _ = v mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) @@ -9863,7 +9790,7 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9890,8 +9817,8 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Properties == nil { - m.Properties = make(map[string]string) + if m.Vars == nil { + m.Vars = make(map[string]string) } var mapkey string var mapvalue string @@ -9986,7 +9913,7 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { iNdEx += skippy } } - m.Properties[mapkey] = mapvalue + m.Vars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 8a4a52816..1cd39681e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -48,8 +48,8 @@ service Control { rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} rpc DestroyEnvironment (DestroyEnvironmentRequest) returns (DestroyEnvironmentReply) {} - rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} - rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} +// rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} +// rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} rpc GetTasks (GetTasksRequest) returns (GetTasksReply) {} rpc GetTask(GetTaskRequest) returns (GetTaskReply) {} @@ -137,7 +137,7 @@ message EnvironmentInfo { message NewEnvironmentRequest { string workflowTemplate = 1; - map properties = 2; + map vars = 2; } message NewEnvironmentReply { EnvironmentInfo environment = 1; From 4784b6beede96c56d251f91ad00cebb6fe2edcbf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Feb 2020 17:29:55 +0100 Subject: [PATCH 0111/2352] [core] Add StringMap to gera package --- common/gera/map.go | 19 ++-- common/gera/stringmap.go | 207 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 220 insertions(+), 6 deletions(-) create mode 100644 common/gera/stringmap.go diff --git a/common/gera/map.go b/common/gera/map.go index f16859363..b5485928f 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -33,18 +33,19 @@ import ( "gopkg.in/yaml.v2" ) -type Map interface{ +type Map interface { yaml.Unmarshaler Wrap(m Map) Map IsHierarchyRoot() bool HierarchyContains(m Map) bool Unwrap() Map - Get(key string) (interface{}, bool) - Set(key string, value interface{}) bool Has(key string) bool Len() int + Get(key string) (interface{}, bool) + Set(key string, value interface{}) bool + Flattened() (map[string]interface{}, error) WrappedAndFlattened(m Map) (map[string]interface{}, error) } @@ -58,13 +59,19 @@ func MakeMap() Map { func MakeMapWithMap(fromMap map[string]interface{}) Map { myMap := &WrapMap{ - theMap: make(map[string]interface{}), + theMap: fromMap, parent: nil, } + return myMap +} + +func MakeMapWithMapCopy(fromMap map[string]interface{}) Map { + newBackingMap := make(map[string]interface{}) for k, v := range fromMap { - myMap.theMap[k] = v + newBackingMap[k] = v } - return myMap + + return MakeMapWithMap(newBackingMap) } type WrapMap struct { diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go new file mode 100644 index 000000000..0841c44c5 --- /dev/null +++ b/common/gera/stringmap.go @@ -0,0 +1,207 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package gera + +import ( + "github.com/imdario/mergo" + "gopkg.in/yaml.v2" +) + +type StringMap interface { + yaml.Unmarshaler + Wrap(m StringMap) StringMap + IsHierarchyRoot() bool + HierarchyContains(m StringMap) bool + Unwrap() StringMap + + Has(key string) bool + Len() int + + Get(key string) (string, bool) + Set(key string, value string) bool + + Flattened() (map[string]string, error) + WrappedAndFlattened(m StringMap) (map[string]string, error) +} + +func MakeStringMap() StringMap { + return &StringWrapMap{ + theMap: make(map[string]string), + parent: nil, + } +} + +func MakeStringMapWithMap(fromMap map[string]string) StringMap { + myMap := &StringWrapMap{ + theMap: fromMap, + parent: nil, + } + return myMap +} + +func MakeStringMapWithMapCopy(fromMap map[string]string) StringMap { + newBackingMap := make(map[string]string) + for k, v := range fromMap { + newBackingMap[k] = v + } + + return MakeStringMapWithMap(newBackingMap) +} + +type StringWrapMap struct { + theMap map[string]string + parent StringMap +} + +func (w *StringWrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { + m := make(map[string]string) + err := unmarshal(&m) + if err == nil { + *w = StringWrapMap{ + theMap: m, + parent: nil, + } + } + return err +} + +func (w *StringWrapMap) IsHierarchyRoot() bool { + if w == nil || w.parent != nil { + return false + } + return true +} + +func (w *StringWrapMap) HierarchyContains(m StringMap) bool { + if w == nil || w.parent == nil { + return false + } + if w.parent == m { + return true + } + return w.parent.HierarchyContains(m) +} + +// Wraps this map around the gera.Map m, which becomes the new parent. +// Returns a pointer to the composite map (i.e. to itself in its new state). +func (w *StringWrapMap) Wrap(m StringMap) StringMap { + if w == nil { + return nil + } + w.parent = m + return w +} + +// Unwraps this map from its parent. +// Returns a pointer to the former parent which was just unwrapped. +func (w *StringWrapMap) Unwrap() StringMap { + if w == nil { + return nil + } + p := w.parent + w.parent = nil + return p +} + +func (w *StringWrapMap) Get(key string) (value string, ok bool) { + if w == nil || w.theMap == nil { + return "", false + } + if val, ok := w.theMap[key]; ok { + return val, true + } + if w.parent != nil { + return w.parent.Get(key) + } + return "", false +} + +func (w *StringWrapMap) Set(key string, value string) (ok bool) { + if w == nil || w.theMap == nil { + return false + } + w.theMap[key] = value + return true +} + +func (w *StringWrapMap) Has(key string) bool { + _, ok := w.Get(key) + return ok +} + +func (w *StringWrapMap) Len() int { + if w == nil || w.theMap == nil { + return 0 + } + flattened, err := w.Flattened() + if err != nil { + return 0 + } + return len(flattened) +} + +func (w *StringWrapMap) Flattened() (map[string]string, error) { + if w == nil { + return nil, nil + } + + out := make(map[string]string) + for k, v := range w.theMap { + out[k] = v + } + if w.parent == nil { + return out, nil + } + + flattenedParent, err := w.parent.Flattened() + if err != nil { + return out, err + } + + err = mergo.Merge(&out, flattenedParent) + return out, err +} + +func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, error) { + if w == nil { + return nil, nil + } + + out := make(map[string]string) + for k, v := range w.theMap { + out[k] = v + } + if m == nil { + return out, nil + } + + flattenedM, err := m.Flattened() + if err != nil { + return out, err + } + + err = mergo.Merge(&out, flattenedM) + return out, err +} From 9a68a291836e34c4d1b6b9f3aaab4ddffe56af55 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Feb 2020 17:35:06 +0100 Subject: [PATCH 0112/2352] [core] Add support for defaults and vars in confsys --- core/confsys/service.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/core/confsys/service.go b/core/confsys/service.go index 4807a36eb..ac119e670 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -216,9 +216,31 @@ func (s *Service) GetROSource() configuration.ROSource { // maybe this one shouldn't exist at all, because vars should get inserted // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right -// before pushing TaskInfos +// before pushing TaskInfos +func (s *Service) GetDefaults() map[string]string { + return s.getStringMap("o2/control/defaults") +} + func (s *Service) GetVars() map[string]string { - //FIXME: implement + return s.getStringMap("o2/control/vars") +} + +func (s *Service) getStringMap(path string) map[string]string { + tree, err := s.src.GetRecursive(path) + if err != nil { + return nil + } + if tree.Type() == configuration.IT_Map { + responseMap := tree.Map() + theMap := make(map[string]string, len(responseMap)) + for k, v := range responseMap { + if v.Type() != configuration.IT_Value { + continue + } + theMap[k] = v.Value() + } + return theMap + } return nil } From c7d3b3e89582ad6a01e09d53fac0d2e5a7c2382e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jan 2020 03:06:49 +0100 Subject: [PATCH 0113/2352] [core] Implement variables KV in workflow --- coconut/protos/o2control.pb.go | 1775 ++++++++++++++++++++++++------- common/gera/map.go | 9 + common/gera/stringmap.go | 9 + core/environment/environment.go | 22 +- core/environment/manager.go | 27 +- core/protos/o2control.pb.go | 1775 ++++++++++++++++++++++++------- core/protos/o2control.proto | 6 + core/server.go | 41 +- core/servertypes.go | 65 ++ core/serverutil.go | 13 +- core/task/manager.go | 7 +- core/workflow/aggregatorrole.go | 3 + core/workflow/iteratorrole.go | 22 + core/workflow/load.go | 2 +- core/workflow/parentadapter.go | 30 +- core/workflow/role.go | 9 + core/workflow/rolebase.go | 46 +- core/workflow/taskrole.go | 7 +- 18 files changed, 3018 insertions(+), 850 deletions(-) create mode 100644 core/servertypes.go diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index a3dcb3d93..7698ce61a 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -750,15 +750,18 @@ func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { } type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } @@ -836,6 +839,27 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { return 0 } +func (m *EnvironmentInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil +} + +func (m *EnvironmentInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *EnvironmentInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} + type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -2455,15 +2479,18 @@ func (m *GetRolesRequest) GetPathSpec() string { } type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleInfo) Reset() { *m = RoleInfo{} } @@ -2541,6 +2568,27 @@ func (m *RoleInfo) GetRoles() []*RoleInfo { return nil } +func (m *RoleInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil +} + +func (m *RoleInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *RoleInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} + type GetRolesReply struct { Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3428,6 +3476,9 @@ func init() { proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") @@ -3460,6 +3511,9 @@ func init() { proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") @@ -3482,162 +3536,169 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2474 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x4d, 0x73, 0x1b, 0x59, - 0xd1, 0x23, 0x4b, 0x91, 0xd4, 0xb2, 0x65, 0xf9, 0xd9, 0x71, 0x64, 0x6d, 0xd6, 0xf6, 0x3e, 0xb6, - 0xb2, 0xde, 0xec, 0xa2, 0xb0, 0xde, 0x2d, 0x36, 0xa4, 0x36, 0x1b, 0xfc, 0xa1, 0x28, 0x86, 0xd8, - 0x0a, 0x63, 0x25, 0x81, 0x54, 0x51, 0x61, 0x2c, 0x3d, 0x59, 0x5a, 0x8f, 0x66, 0x94, 0x37, 0x23, - 0x25, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x1c, 0xb8, 0x70, 0xa5, 0x28, 0x8e, 0xdc, 0x39, 0x50, 0xc5, - 0x95, 0x03, 0x14, 0xf0, 0x0f, 0xa8, 0x50, 0xc5, 0x89, 0x1f, 0x41, 0xbd, 0xaf, 0x99, 0x37, 0xa3, - 0x19, 0xd9, 0x5b, 0x14, 0x37, 0x75, 0xbf, 0xee, 0x7e, 0xfd, 0xf5, 0xba, 0x7b, 0x5a, 0xb0, 0x36, - 0xa2, 0xae, 0xef, 0x7a, 0x77, 0xdc, 0x9d, 0x8e, 0xeb, 0xf8, 0xd4, 0xb5, 0xeb, 0x1c, 0x81, 0x8a, - 0x01, 0x02, 0xaf, 0xc1, 0x6a, 0x63, 0x42, 0x1c, 0xff, 0xe5, 0x11, 0xf1, 0x5c, 0xef, 0x11, 0xb1, - 0xa8, 0x7f, 0x4a, 0x2c, 0x1f, 0x2f, 0xc1, 0xe2, 0x89, 0x6f, 0xf9, 0x63, 0xcf, 0x24, 0xaf, 0xc6, - 0xc4, 0xf3, 0xf1, 0x29, 0x94, 0x14, 0x62, 0x64, 0x5f, 0xa0, 0x55, 0xc8, 0x79, 0xbe, 0xe5, 0x93, - 0xaa, 0xb1, 0x65, 0x6c, 0x17, 0x4d, 0x01, 0xa0, 0xfb, 0xb0, 0xe8, 0x71, 0xa2, 0xa7, 0xa3, 0xae, - 0xe5, 0x13, 0xaf, 0x9a, 0xd9, 0x9a, 0xdf, 0x2e, 0xed, 0xdc, 0xa8, 0x87, 0x1a, 0x9c, 0x68, 0xe7, - 0x66, 0x94, 0x1a, 0xff, 0xd5, 0x80, 0x05, 0xfd, 0x1c, 0x7d, 0x0a, 0x39, 0x9b, 0x4c, 0x88, 0xcd, - 0x6f, 0x29, 0xef, 0xbc, 0x9b, 0x22, 0xa7, 0xfe, 0x98, 0x11, 0x99, 0x82, 0x16, 0x1d, 0x42, 0x79, - 0x18, 0x31, 0xa6, 0x9a, 0xd9, 0x32, 0xb6, 0x4b, 0x3b, 0x9b, 0x1a, 0x77, 0x92, 0xcd, 0x8f, 0xe6, - 0xcc, 0x18, 0x23, 0xfe, 0x0c, 0x72, 0x5c, 0x34, 0x2a, 0x42, 0xee, 0xa0, 0xb1, 0xf7, 0xb4, 0x59, - 0x99, 0x43, 0x05, 0xc8, 0x1e, 0x1e, 0x3f, 0x6c, 0x55, 0x0c, 0x54, 0x82, 0xfc, 0xf3, 0x5d, 0xf3, - 0xf8, 0xf0, 0xb8, 0x59, 0xc9, 0x30, 0x8a, 0x86, 0x69, 0xb6, 0xcc, 0xca, 0xfc, 0x5e, 0x1e, 0x72, - 0x5c, 0x3e, 0x5e, 0x87, 0x1b, 0x4d, 0xe2, 0x3f, 0xa4, 0xd6, 0x90, 0xbc, 0x76, 0xe9, 0xf9, 0xa1, - 0xd3, 0x73, 0x95, 0x3b, 0x7f, 0x6b, 0x40, 0xfe, 0x19, 0xa1, 0xde, 0xc0, 0x75, 0x98, 0x2f, 0x87, - 0xd6, 0x57, 0x2e, 0xe5, 0x56, 0xe6, 0x4c, 0x01, 0x70, 0xec, 0xc0, 0x71, 0x29, 0xd7, 0x9e, 0x61, - 0x19, 0xc0, 0xb0, 0x23, 0xcb, 0xef, 0xf4, 0xab, 0xf3, 0x02, 0xcb, 0x01, 0x86, 0x3d, 0x1d, 0x0f, - 0xec, 0x6e, 0x35, 0x2b, 0xa2, 0xc1, 0x01, 0xb4, 0x05, 0xa5, 0x11, 0x75, 0xbb, 0xe3, 0x8e, 0x7f, - 0x6c, 0x0d, 0x49, 0x35, 0xc7, 0xcf, 0x74, 0x14, 0xda, 0x00, 0x98, 0x08, 0x25, 0x4e, 0x7c, 0x5a, - 0xbd, 0xc6, 0x09, 0x34, 0x0c, 0xfe, 0x65, 0x06, 0xae, 0x4f, 0x5b, 0xc0, 0xe2, 0xbf, 0x05, 0xa5, - 0x5e, 0x80, 0xed, 0xca, 0x2c, 0xd0, 0x51, 0xe8, 0x63, 0x58, 0x26, 0xce, 0x64, 0x40, 0x5d, 0x67, - 0x48, 0x1c, 0xdf, 0xdb, 0x77, 0xc7, 0x8e, 0x2f, 0x6d, 0x99, 0x3e, 0x60, 0x9a, 0xf8, 0x96, 0x77, - 0x2e, 0xc9, 0x84, 0x71, 0x1a, 0x26, 0xcc, 0xb7, 0xac, 0x9e, 0x6f, 0x1b, 0x00, 0x7d, 0xd7, 0x53, - 0xc2, 0x73, 0x82, 0x2b, 0xc4, 0x20, 0x0c, 0x0b, 0x03, 0xc7, 0xf3, 0x2d, 0xa7, 0x43, 0xb8, 0x0b, - 0x84, 0x85, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0xd2, 0xe2, 0x6a, 0x9e, 0xe7, 0x09, 0xd2, 0xf2, 0x44, - 0x86, 0xc8, 0x54, 0x24, 0xf8, 0x43, 0x58, 0x6a, 0x13, 0x8b, 0x76, 0xdd, 0xd7, 0x8e, 0x0c, 0x25, - 0x5a, 0x83, 0x6b, 0x94, 0x58, 0x9e, 0xeb, 0x48, 0x2f, 0x48, 0x88, 0x3d, 0xa1, 0x90, 0x74, 0x64, - 0x5f, 0xe0, 0x2a, 0xac, 0x35, 0x89, 0xdf, 0xd0, 0x6c, 0x57, 0xd9, 0xf0, 0x06, 0x56, 0xa7, 0x4e, - 0xae, 0xe6, 0xe5, 0x2f, 0x61, 0x41, 0x77, 0xa6, 0x7c, 0x70, 0x35, 0x3d, 0xd5, 0xc3, 0x63, 0x1e, - 0xbe, 0x08, 0x3d, 0xfe, 0x87, 0x01, 0x4b, 0x31, 0x0a, 0x54, 0x86, 0xcc, 0x40, 0x5d, 0x96, 0x19, - 0xf0, 0x3c, 0xea, 0x50, 0x62, 0xf9, 0xa4, 0xfb, 0xbc, 0x4f, 0x1c, 0x1e, 0xc3, 0xa2, 0xa9, 0xa3, - 0xc2, 0xe8, 0xcc, 0xeb, 0xd1, 0xa9, 0x43, 0x8e, 0x47, 0xb0, 0x9a, 0xe5, 0x4a, 0x55, 0xf5, 0xd7, - 0xdb, 0x77, 0xa9, 0xdf, 0xb6, 0x3c, 0x91, 0x51, 0x82, 0x0c, 0xd5, 0xa0, 0x40, 0x5d, 0xd7, 0x37, - 0x5d, 0x5b, 0x25, 0x6b, 0x00, 0xa3, 0xdb, 0x50, 0xe9, 0x8c, 0x29, 0x25, 0x8e, 0x6f, 0x8e, 0x9d, - 0xe3, 0xf1, 0xf0, 0x94, 0x88, 0x7c, 0x5d, 0x34, 0xa7, 0xf0, 0xf8, 0x8f, 0x06, 0x5c, 0x3f, 0x26, - 0xaf, 0x35, 0xb3, 0x54, 0xa8, 0x6e, 0x43, 0x85, 0xf9, 0xad, 0x67, 0xbb, 0xaf, 0xdb, 0x64, 0x38, - 0xb2, 0xc3, 0x02, 0x36, 0x85, 0x47, 0x5f, 0x42, 0x76, 0x62, 0x51, 0xe5, 0xd1, 0xdb, 0x9a, 0xf2, - 0x89, 0xb2, 0xeb, 0xcf, 0x2c, 0xea, 0x35, 0x1c, 0x9f, 0x5e, 0x98, 0x9c, 0xaf, 0xf6, 0x39, 0x14, - 0x03, 0x14, 0xaa, 0xc0, 0xfc, 0x39, 0xb9, 0x90, 0x77, 0xb1, 0x9f, 0xcc, 0x65, 0x13, 0xcb, 0x1e, - 0x13, 0xe9, 0x4e, 0x01, 0xdc, 0xcb, 0xdc, 0x35, 0xf0, 0x09, 0xac, 0xc4, 0x6f, 0x60, 0xb9, 0xf0, - 0x05, 0x94, 0xb4, 0xc8, 0x71, 0x51, 0xb3, 0x03, 0xad, 0x93, 0xe3, 0x0f, 0xf8, 0x43, 0x4e, 0x70, - 0x49, 0x2c, 0xd8, 0xf8, 0x67, 0x06, 0xac, 0xc4, 0x29, 0xff, 0xe7, 0xeb, 0xd1, 0x1d, 0x28, 0x28, - 0x07, 0xcb, 0x6a, 0xbc, 0xa2, 0xb1, 0xb2, 0x08, 0x73, 0x9e, 0x80, 0x08, 0xff, 0xcd, 0x80, 0xf5, - 0x7d, 0x71, 0x7c, 0xb9, 0xd2, 0xe8, 0x01, 0x64, 0xfd, 0x8b, 0x91, 0xf0, 0x65, 0x79, 0xe7, 0x23, - 0x4d, 0x74, 0xaa, 0x8c, 0x7a, 0x6b, 0xc4, 0x58, 0x4c, 0xce, 0x88, 0x2d, 0xb8, 0x26, 0x60, 0x56, - 0xde, 0x8f, 0x5b, 0xad, 0x27, 0x95, 0x39, 0x84, 0xa0, 0x7c, 0xd2, 0xde, 0x35, 0xdb, 0x2f, 0x77, - 0xf7, 0xdb, 0x87, 0xcf, 0x0e, 0xdb, 0x3f, 0xaa, 0x18, 0x68, 0x19, 0x16, 0x4f, 0xda, 0xad, 0x27, - 0x21, 0x2a, 0x83, 0x16, 0xa1, 0xb8, 0xdf, 0x3a, 0x7e, 0x78, 0xd8, 0x7c, 0x6a, 0x36, 0x2a, 0xf3, - 0xac, 0x0f, 0x98, 0x8d, 0x93, 0x46, 0xbb, 0x92, 0x45, 0x0b, 0x50, 0x68, 0xb6, 0x5e, 0x8a, 0xae, - 0x90, 0xc3, 0xe7, 0x70, 0x23, 0x49, 0x19, 0xe6, 0xdb, 0xb8, 0x39, 0xc1, 0x73, 0xca, 0xe8, 0xcf, - 0x29, 0xe9, 0x09, 0xcc, 0xa7, 0x3c, 0x81, 0x5f, 0x19, 0x50, 0x3d, 0x72, 0xbb, 0x83, 0xde, 0xc5, - 0x95, 0xbc, 0x07, 0xee, 0x88, 0x50, 0xcb, 0x1f, 0xb8, 0x8e, 0xca, 0xf7, 0xcd, 0xe4, 0xc8, 0xb6, - 0x14, 0x9d, 0xa9, 0xb1, 0xa0, 0x5b, 0x50, 0xa6, 0xa4, 0xe3, 0x3a, 0xbd, 0xc1, 0xd9, 0x98, 0x92, - 0x5d, 0xdb, 0xe6, 0x7a, 0x15, 0xcc, 0x18, 0x16, 0xff, 0xc6, 0x80, 0xd5, 0x24, 0x61, 0xe8, 0x9e, - 0x8c, 0x9f, 0x68, 0xf3, 0xb7, 0x2e, 0xb9, 0x3b, 0x12, 0x3a, 0x51, 0x35, 0x6c, 0x51, 0xdf, 0x33, - 0xaa, 0x6a, 0x08, 0x18, 0x7f, 0x92, 0x10, 0xd6, 0x25, 0x28, 0x99, 0x8d, 0xa3, 0xd6, 0xb3, 0xc6, - 0x4b, 0xb3, 0xf5, 0x98, 0x45, 0x6c, 0x01, 0x0a, 0xbb, 0x07, 0x07, 0x02, 0xca, 0xe2, 0x9f, 0x1b, - 0xb0, 0x96, 0xe0, 0x39, 0x16, 0xa6, 0xef, 0x43, 0xa5, 0x67, 0x0d, 0x6c, 0xd2, 0x6d, 0x85, 0xde, - 0x32, 0xae, 0xe6, 0xad, 0x29, 0x46, 0x19, 0x84, 0xcc, 0x74, 0xcc, 0xf5, 0x12, 0x8a, 0x0f, 0x61, - 0xfd, 0x80, 0x78, 0x3e, 0x75, 0xaf, 0x12, 0xc7, 0x9b, 0x50, 0x3c, 0x27, 0x64, 0xd4, 0xe6, 0x35, - 0x37, 0xc3, 0x23, 0x10, 0x22, 0x30, 0x81, 0x1b, 0x49, 0xa2, 0x98, 0x61, 0xdf, 0x83, 0xe5, 0x8e, - 0x4d, 0x2c, 0x67, 0x2c, 0x48, 0x39, 0x52, 0xbe, 0xf0, 0x9b, 0xfa, 0x5b, 0x8a, 0xd3, 0x98, 0xd3, - 0x6c, 0xf8, 0x2f, 0x06, 0x6c, 0x9e, 0x44, 0xea, 0xc7, 0x13, 0xca, 0x52, 0xc5, 0x1f, 0x10, 0x2f, - 0x4d, 0xf1, 0x17, 0x00, 0xa3, 0x80, 0x48, 0x26, 0xe0, 0x3d, 0xbd, 0x5b, 0xcc, 0x96, 0x57, 0x0f, - 0x31, 0xa2, 0x00, 0x6b, 0xd2, 0x6a, 0xf7, 0x61, 0x29, 0x76, 0xfc, 0xb5, 0x8a, 0xf1, 0x26, 0xbc, - 0x9b, 0x7e, 0x3b, 0xb3, 0xd7, 0x83, 0xcd, 0xe6, 0xd7, 0x34, 0xb7, 0x0a, 0xf9, 0x57, 0x63, 0x42, - 0x95, 0xad, 0x45, 0x53, 0x81, 0xec, 0x21, 0x91, 0x37, 0x1d, 0x7b, 0xdc, 0x25, 0x4d, 0xdb, 0x3d, - 0xb5, 0x6c, 0x4f, 0x3d, 0xa4, 0x28, 0x16, 0xff, 0xc1, 0x80, 0x77, 0x9b, 0xb3, 0xd4, 0x42, 0x3f, - 0x8c, 0xb8, 0x54, 0x64, 0xe9, 0x5d, 0xcd, 0xa5, 0x33, 0xb9, 0xff, 0x9f, 0x0e, 0xfd, 0xb7, 0x01, - 0x8b, 0x91, 0xee, 0x8f, 0x10, 0x64, 0x1d, 0xf6, 0x78, 0x05, 0x3b, 0xff, 0xcd, 0x66, 0x2a, 0xdb, - 0xed, 0x9c, 0x93, 0xae, 0xcc, 0x63, 0x09, 0x31, 0x3c, 0x9b, 0x15, 0x0e, 0xbb, 0xf2, 0x99, 0x48, - 0x88, 0xe1, 0xc5, 0xa7, 0x84, 0x9c, 0x0f, 0x25, 0x14, 0xbe, 0xaa, 0x9c, 0x5e, 0x49, 0x6f, 0x42, - 0xb1, 0x63, 0x5b, 0x9e, 0xa7, 0xcd, 0x84, 0x21, 0x02, 0x35, 0xa0, 0xdc, 0x25, 0x23, 0xdb, 0xbd, - 0x50, 0xad, 0x4c, 0xce, 0x85, 0xfa, 0xd7, 0x07, 0x53, 0xfe, 0x20, 0x42, 0x64, 0xc6, 0x98, 0x58, - 0x23, 0x45, 0xd3, 0x64, 0xac, 0x5c, 0xb1, 0x01, 0x55, 0xb3, 0x38, 0x80, 0x59, 0x62, 0x58, 0x67, - 0x8c, 0x50, 0x15, 0x06, 0x05, 0xb2, 0x13, 0xb7, 0xd7, 0x23, 0x34, 0x30, 0x5c, 0x81, 0x6c, 0x04, - 0x26, 0x6f, 0x48, 0x67, 0xec, 0xbb, 0xec, 0x50, 0x58, 0xaf, 0x61, 0xf0, 0x32, 0x2c, 0x35, 0x89, - 0x2f, 0x1f, 0xa8, 0x98, 0x36, 0x1f, 0xc0, 0x62, 0x88, 0x62, 0xc9, 0x12, 0x0c, 0x6a, 0xc6, 0x95, - 0x06, 0x35, 0xbc, 0x0d, 0x65, 0x29, 0x40, 0x9b, 0x81, 0x65, 0x5c, 0x0c, 0x3d, 0x2e, 0xf8, 0x73, - 0x58, 0x08, 0x28, 0xd9, 0x4d, 0x1f, 0x40, 0x96, 0x9d, 0xc8, 0xe2, 0xb2, 0x12, 0xf3, 0x28, 0xbf, - 0x83, 0x13, 0xe0, 0x06, 0x2c, 0x32, 0xcc, 0x3e, 0x8b, 0x4a, 0x6a, 0x96, 0xb0, 0xc1, 0x54, 0xb0, - 0x1f, 0xb9, 0x5d, 0x12, 0x0c, 0xa6, 0x21, 0x0a, 0xff, 0x14, 0x4a, 0xfb, 0xee, 0x70, 0x68, 0x39, - 0x5d, 0x2e, 0xa4, 0x02, 0xf3, 0xc4, 0x99, 0x70, 0x33, 0x8b, 0x26, 0xfb, 0xc9, 0x13, 0xa4, 0x4f, - 0x6c, 0x5b, 0xe6, 0x99, 0x00, 0xc2, 0xf4, 0x9d, 0xd7, 0xd2, 0x97, 0xa5, 0x8d, 0x45, 0xcf, 0xc6, - 0x62, 0xd0, 0xce, 0x72, 0x19, 0x21, 0x82, 0x29, 0x38, 0xf6, 0x08, 0x95, 0x99, 0xc6, 0x7f, 0xe3, - 0x23, 0x28, 0xed, 0xf7, 0x2d, 0xc7, 0x21, 0x76, 0xaa, 0x0d, 0x48, 0x1b, 0x5d, 0x8a, 0xb2, 0xa5, - 0x71, 0x6f, 0xd2, 0x33, 0xe2, 0x87, 0x59, 0xce, 0x20, 0xfc, 0x9f, 0x0c, 0x14, 0x82, 0x67, 0xf3, - 0x6d, 0x28, 0x7a, 0x2c, 0x38, 0x3c, 0x43, 0x85, 0x3f, 0xd3, 0x03, 0x17, 0x92, 0x32, 0xbe, 0x8e, - 0xf2, 0xaa, 0x9c, 0xc5, 0xaa, 0xb1, 0x38, 0x04, 0x5e, 0x37, 0x43, 0x52, 0xf4, 0x5d, 0x58, 0x1a, - 0x38, 0xa7, 0xee, 0xd8, 0xe9, 0x4a, 0x93, 0x58, 0x71, 0x62, 0xe9, 0xb2, 0xa6, 0xb7, 0x88, 0xd0, - 0x5a, 0x33, 0x4e, 0x8e, 0xf6, 0xa0, 0xe2, 0x8e, 0xfd, 0xa8, 0x88, 0xec, 0x4c, 0x11, 0x53, 0xf4, - 0xe8, 0x2e, 0x0b, 0x79, 0x10, 0x50, 0xee, 0xec, 0x18, 0x7b, 0x78, 0x6a, 0xea, 0xa4, 0xec, 0xe1, - 0xb1, 0xcc, 0x7a, 0x62, 0xf9, 0x7d, 0xf9, 0xe6, 0x03, 0x98, 0xc5, 0x9b, 0x38, 0x93, 0xc3, 0x2e, - 0x7f, 0xe9, 0x45, 0x53, 0x00, 0xf8, 0x0e, 0xac, 0x44, 0x5b, 0x9e, 0xc8, 0xf5, 0x2a, 0xe4, 0x45, - 0x76, 0x7b, 0x32, 0x91, 0x14, 0x88, 0x7f, 0x61, 0xc0, 0xf2, 0x54, 0x93, 0x44, 0xf7, 0xa0, 0x74, - 0x3e, 0xb0, 0x6d, 0xd2, 0x6d, 0x5f, 0xe9, 0x8d, 0xe9, 0xc4, 0xe8, 0x0b, 0x58, 0xa0, 0x63, 0xc7, - 0x19, 0x38, 0x67, 0xaa, 0xab, 0xcf, 0x66, 0x8e, 0x50, 0xe3, 0x7d, 0xfe, 0xf6, 0xd9, 0x74, 0x1d, - 0x28, 0x1f, 0x58, 0x6a, 0x68, 0x96, 0x32, 0xdf, 0x8c, 0x2c, 0xbf, 0x7f, 0x32, 0x22, 0x1d, 0x35, - 0x43, 0x29, 0x18, 0xff, 0xde, 0x80, 0x82, 0x1a, 0xd0, 0xd3, 0x6a, 0xb5, 0xac, 0xbd, 0x99, 0xe4, - 0xda, 0x1b, 0xf9, 0x28, 0xac, 0x41, 0xa1, 0x37, 0xb6, 0x6d, 0x1e, 0x06, 0x51, 0xad, 0x02, 0x58, - 0xf7, 0x6c, 0x2e, 0xe2, 0x59, 0xf4, 0x21, 0xe4, 0xd8, 0x50, 0xe7, 0x55, 0xaf, 0x71, 0x07, 0x24, - 0x7e, 0x3c, 0x08, 0x0a, 0x7c, 0x8f, 0x57, 0x37, 0x69, 0x34, 0xf3, 0x7f, 0xc0, 0x6b, 0x5c, 0xca, - 0xfb, 0x3b, 0x03, 0xde, 0x69, 0x12, 0xff, 0x79, 0xec, 0x5b, 0x30, 0xf0, 0xde, 0x16, 0x94, 0x28, - 0x19, 0xb9, 0x4f, 0x2c, 0xdf, 0x27, 0x54, 0x7d, 0xef, 0xeb, 0x28, 0xb4, 0x0d, 0x4b, 0x94, 0x4c, - 0x06, 0xde, 0xc0, 0x75, 0x14, 0x95, 0xf0, 0x4a, 0x1c, 0xcd, 0x64, 0x59, 0xb6, 0xbd, 0x47, 0x2d, - 0xa7, 0xd3, 0x27, 0xaa, 0xd1, 0xeb, 0x28, 0xde, 0x0e, 0x6c, 0xbb, 0x6d, 0x9d, 0x89, 0xae, 0x56, - 0x30, 0x15, 0x88, 0x4f, 0x61, 0x35, 0xae, 0xa3, 0x0a, 0x0f, 0x53, 0x46, 0x85, 0x87, 0xfd, 0xe6, - 0x79, 0xaf, 0xbe, 0x75, 0x65, 0x6c, 0x15, 0xcc, 0x67, 0x67, 0xa9, 0x96, 0x8c, 0x52, 0x00, 0xe3, - 0xaf, 0x60, 0x3d, 0xd9, 0x15, 0xcc, 0xa7, 0x47, 0xb0, 0x1c, 0xff, 0x60, 0x4e, 0x9a, 0x85, 0x93, - 0x94, 0x34, 0xa7, 0x39, 0x31, 0x82, 0xca, 0xe3, 0x81, 0xc7, 0xa6, 0x51, 0x57, 0x5b, 0x38, 0x16, - 0x18, 0x9c, 0x9a, 0x76, 0x55, 0xc8, 0x77, 0x49, 0xcf, 0x1a, 0xdb, 0xbe, 0xac, 0xdd, 0x0a, 0x64, - 0x31, 0x90, 0x3f, 0xcd, 0xa8, 0x71, 0x71, 0x34, 0x7e, 0x05, 0x65, 0xed, 0x5e, 0x95, 0x2c, 0x0c, - 0x4a, 0x4a, 0x16, 0xa9, 0x8d, 0x29, 0x28, 0xd0, 0x67, 0x70, 0xfd, 0x8c, 0xcf, 0x63, 0x07, 0xb1, - 0xcb, 0x84, 0x97, 0x93, 0x0f, 0xf1, 0x31, 0x94, 0x77, 0xbb, 0x5d, 0x26, 0x4b, 0x25, 0x55, 0x92, - 0x71, 0x09, 0x26, 0x64, 0x92, 0x4d, 0x30, 0x61, 0x21, 0x90, 0x27, 0x7a, 0x39, 0x72, 0xc8, 0xeb, - 0xb8, 0x4a, 0x42, 0x76, 0xc2, 0x09, 0xbb, 0x7d, 0xa0, 0x3a, 0x41, 0xd1, 0xe4, 0xbf, 0xf1, 0x87, - 0xb0, 0x6c, 0x92, 0xa1, 0x3b, 0x21, 0xba, 0x9a, 0xab, 0x90, 0x1b, 0x38, 0x5d, 0xf2, 0x46, 0x6d, - 0x29, 0x39, 0x80, 0xbf, 0x03, 0x4b, 0x3a, 0x29, 0xd3, 0xe0, 0x16, 0x94, 0xf5, 0x7b, 0x82, 0x74, - 0x8c, 0x61, 0xf1, 0x47, 0xb0, 0x62, 0x92, 0x1e, 0x25, 0x5e, 0x5f, 0x8f, 0x7b, 0xca, 0x3d, 0xdf, - 0x84, 0xeb, 0x27, 0xc4, 0xd7, 0xd8, 0x67, 0x93, 0xdf, 0xe7, 0x1f, 0x21, 0xcd, 0xa4, 0x08, 0x28, - 0x46, 0x3d, 0xf7, 0x8d, 0x58, 0xee, 0xff, 0x80, 0x4f, 0xfd, 0xec, 0x9a, 0x14, 0xe6, 0xc4, 0x5b, - 0x23, 0x22, 0x33, 0x31, 0x91, 0x9f, 0xc0, 0x3b, 0x69, 0x22, 0x99, 0xd3, 0x54, 0x18, 0x0c, 0x2d, - 0x0c, 0x79, 0xc8, 0x35, 0x86, 0x23, 0xff, 0x62, 0xe7, 0x4f, 0x8b, 0x90, 0x97, 0xbb, 0x03, 0xb4, - 0x0f, 0xa5, 0x36, 0xb5, 0x3a, 0xe7, 0x62, 0xff, 0x8d, 0xaa, 0x53, 0x2b, 0x71, 0xa9, 0x62, 0x6d, - 0x2d, 0xe1, 0x84, 0x7d, 0xb0, 0xcc, 0x7d, 0xcb, 0x40, 0x2f, 0xa0, 0x12, 0x5f, 0xeb, 0x22, 0x1c, - 0xfd, 0x3a, 0x48, 0xda, 0x5a, 0xd7, 0xb6, 0x66, 0xd2, 0x70, 0xe9, 0x68, 0x0f, 0x0a, 0x6a, 0xed, - 0x89, 0xf4, 0xfd, 0x50, 0x6c, 0x6d, 0x5a, 0xab, 0x26, 0x9e, 0x09, 0x19, 0xcf, 0x79, 0xe3, 0xd2, - 0xf7, 0xa1, 0xe8, 0xbd, 0xd4, 0x8f, 0x97, 0xc0, 0xe2, 0xcd, 0x59, 0x24, 0x42, 0x70, 0x1b, 0xca, - 0xd1, 0xdd, 0x1a, 0xda, 0xba, 0x6c, 0xb1, 0x57, 0xdb, 0x98, 0x41, 0x11, 0x48, 0x8d, 0xde, 0x87, - 0xb6, 0x52, 0x55, 0x49, 0x92, 0x9a, 0xb0, 0x6f, 0xc3, 0x73, 0xe8, 0x27, 0x80, 0xa6, 0x17, 0x46, - 0xe8, 0xfd, 0xab, 0x2c, 0xb7, 0x6a, 0xf8, 0x12, 0x2a, 0x71, 0xc3, 0x8f, 0x61, 0x79, 0x6a, 0xd5, - 0x81, 0xbe, 0xa1, 0xb1, 0xa6, 0xad, 0x90, 0x6a, 0xef, 0xcd, 0x26, 0x0a, 0x0c, 0x98, 0xde, 0x38, - 0x44, 0x0c, 0x48, 0xdd, 0x6d, 0x44, 0x0c, 0x48, 0x59, 0x5b, 0x88, 0x5c, 0x53, 0x5f, 0x32, 0x91, - 0x5c, 0x8b, 0x7d, 0xf1, 0x44, 0x72, 0x2d, 0xf2, 0xe9, 0x83, 0xe7, 0xd0, 0x03, 0xc8, 0x4b, 0x14, - 0x5a, 0x9f, 0x26, 0x53, 0x12, 0x6e, 0x24, 0x1d, 0x09, 0x01, 0xc7, 0xb0, 0xa0, 0x0f, 0x7d, 0x68, - 0x23, 0x75, 0x65, 0x22, 0x44, 0xcd, 0x5c, 0xa9, 0x04, 0x46, 0xf1, 0x01, 0x26, 0x6e, 0x94, 0x3e, - 0xca, 0xc5, 0x8d, 0x0a, 0x27, 0x1e, 0x3c, 0x87, 0x7a, 0xfc, 0x0f, 0x85, 0xa9, 0xe6, 0x8d, 0x6e, - 0x45, 0x79, 0xd2, 0x06, 0x9d, 0xda, 0xfb, 0x97, 0xd2, 0x89, 0x7b, 0x1a, 0x50, 0x0c, 0x1a, 0x28, - 0x7a, 0x47, 0x63, 0x8a, 0xb7, 0xf3, 0xda, 0x7a, 0xf2, 0x61, 0x10, 0x03, 0xd9, 0xc4, 0x22, 0x31, - 0x88, 0x36, 0xca, 0x48, 0x0c, 0xf4, 0x9e, 0x87, 0xe7, 0xd0, 0x23, 0x80, 0xb0, 0x0d, 0xa1, 0x9b, - 0x91, 0xae, 0x1d, 0x6b, 0x64, 0xb5, 0x5a, 0xca, 0xa9, 0xf2, 0xfe, 0x82, 0xde, 0x95, 0x22, 0xd1, - 0x4c, 0x68, 0x57, 0xb5, 0x8a, 0xbe, 0xfa, 0x63, 0xd5, 0x1a, 0xcf, 0xa1, 0x87, 0x50, 0x8e, 0x36, - 0xab, 0x48, 0x3d, 0x48, 0xec, 0x63, 0x89, 0x72, 0x5e, 0x40, 0x35, 0xad, 0x8b, 0xa1, 0xdb, 0x51, - 0x89, 0xb3, 0x5a, 0x5d, 0xa2, 0x6c, 0x1b, 0xd6, 0x92, 0xfb, 0x11, 0xda, 0x8e, 0x4a, 0x4e, 0xef, - 0x82, 0xb5, 0x5b, 0x57, 0xa0, 0xe4, 0x5e, 0xdd, 0xbb, 0xfb, 0xe7, 0xb7, 0x1b, 0xc6, 0xdf, 0xdf, - 0x6e, 0x18, 0xff, 0x7c, 0xbb, 0x61, 0xfc, 0xfa, 0x5f, 0x1b, 0x73, 0x80, 0x3b, 0xfd, 0x7a, 0x87, - 0x50, 0xa7, 0x6e, 0xd9, 0x83, 0x0e, 0xa9, 0xbb, 0x3b, 0x75, 0x25, 0x89, 0x8e, 0x3a, 0x1e, 0xa1, - 0x13, 0x42, 0x5f, 0x64, 0x46, 0xa7, 0xa7, 0xd7, 0xf8, 0x5f, 0xd6, 0x9f, 0xfe, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x5b, 0x99, 0x04, 0x0b, 0xcc, 0x1e, 0x00, 0x00, + // 2581 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0x59, + 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x4e, 0xbc, 0x6d, 0x92, 0x5e, 0xaa, + 0x6e, 0xda, 0x5d, 0x5c, 0x9a, 0x5d, 0xb1, 0xa5, 0xbb, 0xdd, 0x92, 0x0f, 0xd7, 0x0d, 0x34, 0x71, + 0x99, 0xb8, 0x2d, 0x54, 0x42, 0x65, 0x62, 0x5f, 0xc7, 0xde, 0x8c, 0x67, 0xdc, 0x99, 0xb1, 0xdb, + 0x3c, 0xf0, 0xc6, 0x1b, 0x42, 0x08, 0xf1, 0xc2, 0x2b, 0x42, 0xfc, 0x07, 0x1e, 0x90, 0x78, 0x45, + 0x08, 0x04, 0x3f, 0x01, 0x15, 0x89, 0x27, 0x7e, 0x04, 0xba, 0x5f, 0x33, 0x77, 0xc6, 0x33, 0x4e, + 0x0a, 0xe2, 0x85, 0xb7, 0x39, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0x5f, 0xf7, 0x9c, 0x73, 0x6d, 0x58, + 0x19, 0xba, 0x8e, 0xef, 0x78, 0x77, 0x9c, 0xad, 0xb6, 0x63, 0xfb, 0xae, 0x63, 0xd5, 0x18, 0x02, + 0x15, 0x03, 0x04, 0x5e, 0x81, 0xe5, 0xfa, 0x98, 0xd8, 0xfe, 0xab, 0x03, 0xe2, 0x39, 0xde, 0x63, + 0x62, 0xba, 0xfe, 0x31, 0x31, 0x7d, 0xbc, 0x00, 0xf3, 0x47, 0xbe, 0xe9, 0x8f, 0x3c, 0x83, 0xbc, + 0x1e, 0x11, 0xcf, 0xc7, 0xc7, 0x50, 0x92, 0x88, 0xa1, 0x75, 0x86, 0x96, 0x21, 0xe7, 0xf9, 0xa6, + 0x4f, 0x74, 0x6d, 0x43, 0xdb, 0x2c, 0x1a, 0x1c, 0x40, 0x0f, 0x60, 0xde, 0x63, 0x44, 0xcf, 0x86, + 0x1d, 0xd3, 0x27, 0x9e, 0x9e, 0xd9, 0x98, 0xdd, 0x2c, 0x6d, 0x5d, 0xa9, 0x85, 0x27, 0x38, 0x52, + 0xd6, 0x8d, 0x28, 0x35, 0xfe, 0x8b, 0x06, 0x73, 0xea, 0x3a, 0xfa, 0x04, 0x72, 0x16, 0x19, 0x13, + 0x8b, 0xed, 0x52, 0xde, 0xba, 0x96, 0x22, 0xa7, 0xf6, 0x84, 0x12, 0x19, 0x9c, 0x16, 0xed, 0x43, + 0x79, 0x10, 0x51, 0x46, 0xcf, 0x6c, 0x68, 0x9b, 0xa5, 0xad, 0x75, 0x85, 0x3b, 0x49, 0xe7, 0xc7, + 0x33, 0x46, 0x8c, 0x11, 0x7f, 0x0a, 0x39, 0x26, 0x1a, 0x15, 0x21, 0xb7, 0x57, 0xdf, 0x79, 0xd6, + 0xa8, 0xcc, 0xa0, 0x02, 0x64, 0xf7, 0x0f, 0x1f, 0x35, 0x2b, 0x1a, 0x2a, 0x41, 0xfe, 0xc5, 0xb6, + 0x71, 0xb8, 0x7f, 0xd8, 0xa8, 0x64, 0x28, 0x45, 0xdd, 0x30, 0x9a, 0x46, 0x65, 0x76, 0x27, 0x0f, + 0x39, 0x26, 0x1f, 0xaf, 0xc2, 0x95, 0x06, 0xf1, 0x1f, 0xb9, 0xe6, 0x80, 0xbc, 0x71, 0xdc, 0xd3, + 0x7d, 0xbb, 0xeb, 0x48, 0x73, 0xfe, 0x46, 0x83, 0xfc, 0x73, 0xe2, 0x7a, 0x7d, 0xc7, 0xa6, 0xb6, + 0x1c, 0x98, 0x5f, 0x39, 0x2e, 0xd3, 0x32, 0x67, 0x70, 0x80, 0x61, 0xfb, 0xb6, 0xe3, 0xb2, 0xd3, + 0x53, 0x2c, 0x05, 0x28, 0x76, 0x68, 0xfa, 0xed, 0x9e, 0x3e, 0xcb, 0xb1, 0x0c, 0xa0, 0xd8, 0xe3, + 0x51, 0xdf, 0xea, 0xe8, 0x59, 0xee, 0x0d, 0x06, 0xa0, 0x0d, 0x28, 0x0d, 0x5d, 0xa7, 0x33, 0x6a, + 0xfb, 0x87, 0xe6, 0x80, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x1a, 0xc0, 0x98, 0x1f, 0xe2, 0xc8, + 0x77, 0xf5, 0x4b, 0x8c, 0x40, 0xc1, 0xe0, 0x9f, 0x67, 0xe0, 0xf2, 0xa4, 0x06, 0xd4, 0xff, 0x1b, + 0x50, 0xea, 0x06, 0xd8, 0x8e, 0x88, 0x02, 0x15, 0x85, 0x3e, 0x86, 0x45, 0x62, 0x8f, 0xfb, 0xae, + 0x63, 0x0f, 0x88, 0xed, 0x7b, 0xbb, 0xce, 0xc8, 0xf6, 0x85, 0x2e, 0x93, 0x0b, 0xf4, 0x24, 0xbe, + 0xe9, 0x9d, 0x0a, 0x32, 0xae, 0x9c, 0x82, 0x09, 0xe3, 0x2d, 0xab, 0xc6, 0xdb, 0x1a, 0x40, 0xcf, + 0xf1, 0xa4, 0xf0, 0x1c, 0xe7, 0x0a, 0x31, 0x08, 0xc3, 0x5c, 0xdf, 0xf6, 0x7c, 0xd3, 0x6e, 0x13, + 0x66, 0x02, 0xae, 0x61, 0x04, 0x87, 0x3e, 0x86, 0xbc, 0xd0, 0x58, 0xcf, 0xb3, 0x38, 0x41, 0x4a, + 0x9c, 0x08, 0x17, 0x19, 0x92, 0x04, 0xdf, 0x82, 0x85, 0x16, 0x31, 0xdd, 0x8e, 0xf3, 0xc6, 0x16, + 0xae, 0x44, 0x2b, 0x70, 0xc9, 0x25, 0xa6, 0xe7, 0xd8, 0xc2, 0x0a, 0x02, 0xa2, 0x29, 0x14, 0x92, + 0x0e, 0xad, 0x33, 0xac, 0xc3, 0x4a, 0x83, 0xf8, 0x75, 0x45, 0x77, 0x19, 0x0d, 0x6f, 0x61, 0x79, + 0x62, 0xe5, 0x62, 0x56, 0xfe, 0x12, 0xe6, 0x54, 0x63, 0x8a, 0x84, 0xab, 0xaa, 0xa1, 0x1e, 0x2e, + 0x33, 0xf7, 0x45, 0xe8, 0xf1, 0x9f, 0xb2, 0xb0, 0x10, 0xa3, 0x40, 0x65, 0xc8, 0xf4, 0xe5, 0x66, + 0x99, 0x3e, 0x8b, 0xa3, 0xb6, 0x4b, 0x4c, 0x9f, 0x74, 0x5e, 0xf4, 0x88, 0xcd, 0x7c, 0x58, 0x34, + 0x54, 0x54, 0xe8, 0x9d, 0x59, 0xd5, 0x3b, 0x35, 0xc8, 0x31, 0x0f, 0xea, 0x59, 0x76, 0x28, 0x5d, + 0xcd, 0xde, 0x9e, 0xe3, 0xfa, 0x2d, 0xd3, 0xe3, 0x11, 0xc5, 0xc9, 0x50, 0x15, 0x0a, 0xae, 0xe3, + 0xf8, 0x86, 0x63, 0xc9, 0x60, 0x0d, 0x60, 0x74, 0x1b, 0x2a, 0xed, 0x91, 0xeb, 0x12, 0xdb, 0x37, + 0x46, 0xf6, 0xe1, 0x68, 0x70, 0x4c, 0x78, 0xbc, 0xce, 0x1b, 0x13, 0x78, 0xb4, 0x07, 0x85, 0x0e, + 0xe9, 0x9a, 0x23, 0xcb, 0xf7, 0xf4, 0x3c, 0xdb, 0x7a, 0x33, 0xdd, 0x1e, 0xb5, 0x3d, 0x41, 0x5a, + 0xb7, 0x7d, 0xf7, 0xcc, 0x08, 0x38, 0xd1, 0x3d, 0xc8, 0x8e, 0x4d, 0xd7, 0xd3, 0x0b, 0x4c, 0xc2, + 0x8d, 0x29, 0x12, 0x9e, 0x9b, 0xae, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x47, 0x5c, 0x8a, 0xd6, + 0x8b, 0xe7, 0xee, 0xff, 0x4c, 0x90, 0x8a, 0xfd, 0x25, 0x67, 0xf5, 0x73, 0x98, 0x8f, 0x1c, 0x0d, + 0x55, 0x60, 0xf6, 0x94, 0x9c, 0x09, 0xbf, 0xd0, 0x4f, 0x6a, 0xf6, 0xb1, 0x69, 0x8d, 0x88, 0x70, + 0x09, 0x07, 0xee, 0x67, 0xee, 0x69, 0xd5, 0xcf, 0xa0, 0x18, 0xc8, 0x7c, 0x2f, 0xc6, 0xcf, 0x61, + 0x3e, 0x72, 0xa0, 0xf7, 0x61, 0xc6, 0xbf, 0xd7, 0xe0, 0xf2, 0x21, 0x79, 0xa3, 0x68, 0x28, 0x73, + 0xe4, 0x36, 0x54, 0x68, 0xc0, 0x76, 0x2d, 0xe7, 0x4d, 0x8b, 0x0c, 0x86, 0x56, 0x58, 0x39, 0x26, + 0xf0, 0xe8, 0x4b, 0x61, 0x78, 0x1e, 0xca, 0xb7, 0x15, 0xd3, 0x25, 0xca, 0x8e, 0x9b, 0xff, 0x3f, + 0xd6, 0x1d, 0x1f, 0xc1, 0x52, 0x7c, 0x07, 0x9a, 0x84, 0x5f, 0x40, 0x49, 0x49, 0x19, 0x26, 0x6a, + 0x7a, 0x86, 0xa9, 0xe4, 0xf8, 0x43, 0x76, 0x83, 0x26, 0x98, 0x24, 0x96, 0x65, 0xf8, 0x27, 0x1a, + 0x2c, 0xc5, 0x29, 0xff, 0xeb, 0xed, 0xd1, 0x1d, 0x28, 0x48, 0x03, 0x8b, 0x32, 0xb8, 0xa4, 0xb0, + 0xd2, 0xd4, 0x62, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, 0xab, 0xbb, 0x7c, 0xf9, 0xfc, 0x43, 0xa3, + 0x87, 0x90, 0xf5, 0xcf, 0x86, 0xdc, 0x96, 0xe5, 0xad, 0x8f, 0x14, 0xd1, 0xa9, 0x32, 0x6a, 0xcd, + 0x21, 0x65, 0x31, 0x18, 0x23, 0x36, 0xe1, 0x12, 0x87, 0x69, 0x5d, 0x3d, 0x6c, 0x36, 0x9f, 0x56, + 0x66, 0x10, 0x82, 0xf2, 0x51, 0x6b, 0xdb, 0x68, 0xbd, 0xda, 0xde, 0x6d, 0xed, 0x3f, 0xdf, 0x6f, + 0xfd, 0xa0, 0xa2, 0xa1, 0x45, 0x98, 0x3f, 0x6a, 0x35, 0x9f, 0x86, 0xa8, 0x0c, 0x9a, 0x87, 0xe2, + 0x6e, 0xf3, 0xf0, 0xd1, 0x7e, 0xe3, 0x99, 0x51, 0xaf, 0xcc, 0xd2, 0x02, 0x6c, 0xd4, 0x8f, 0xea, + 0xad, 0x4a, 0x16, 0xcd, 0x41, 0xa1, 0xd1, 0x7c, 0xc5, 0xcb, 0x71, 0x0e, 0x9f, 0xc2, 0x95, 0xa4, + 0xc3, 0x50, 0xdb, 0xc6, 0xd5, 0x09, 0xee, 0xb1, 0x8c, 0x7a, 0x8f, 0x25, 0xdd, 0x3d, 0xb3, 0xc9, + 0x77, 0x0f, 0xfe, 0xa5, 0x06, 0xfa, 0x81, 0xd3, 0xe9, 0x77, 0xcf, 0x2e, 0x64, 0x3d, 0x70, 0x86, + 0xc4, 0x35, 0xfd, 0xbe, 0x63, 0xcb, 0x78, 0x5f, 0x4f, 0xf6, 0x6c, 0x53, 0xd2, 0x19, 0x0a, 0x0b, + 0xba, 0x09, 0x65, 0x97, 0xb4, 0x1d, 0xbb, 0xdb, 0x3f, 0x19, 0xb9, 0x64, 0xdb, 0xb2, 0xd8, 0xb9, + 0x0a, 0x46, 0x0c, 0x8b, 0x7f, 0xad, 0xc1, 0x72, 0x92, 0x30, 0x74, 0x5f, 0xf8, 0x8f, 0xf7, 0x57, + 0x37, 0xcf, 0xd9, 0x3b, 0xe2, 0x3a, 0x7e, 0x5d, 0x5b, 0xbc, 0xb0, 0x66, 0xe4, 0x75, 0xcd, 0x61, + 0x7c, 0x37, 0xc1, 0xad, 0x0b, 0x50, 0x32, 0xea, 0x07, 0xcd, 0xe7, 0xf5, 0x57, 0x46, 0xf3, 0x09, + 0xf5, 0xd8, 0x1c, 0x14, 0xb6, 0xf7, 0xf6, 0x38, 0x94, 0xc5, 0x3f, 0xd5, 0x60, 0x25, 0xc1, 0x72, + 0xd4, 0x4d, 0xdf, 0x85, 0x4a, 0xd7, 0xec, 0x5b, 0xa4, 0xd3, 0x0c, 0xad, 0xa5, 0x5d, 0xcc, 0x5a, + 0x13, 0x8c, 0xc2, 0x09, 0x99, 0x49, 0x9f, 0xab, 0xb5, 0x0b, 0xef, 0xc3, 0xea, 0x1e, 0xf1, 0x7c, + 0xd7, 0xb9, 0x88, 0x1f, 0xaf, 0x42, 0xf1, 0x94, 0x90, 0x61, 0x8b, 0x15, 0xbb, 0x0c, 0xf3, 0x40, + 0x88, 0xc0, 0x04, 0xae, 0x24, 0x89, 0xa2, 0x8a, 0x7d, 0x07, 0x16, 0xdb, 0x16, 0x31, 0xed, 0x11, + 0x27, 0x65, 0x48, 0x91, 0xe1, 0x57, 0xd5, 0x5c, 0x8a, 0xd3, 0x18, 0x93, 0x6c, 0xf8, 0xcf, 0x1a, + 0xac, 0x1f, 0x45, 0xee, 0x8f, 0xa7, 0x2e, 0x0d, 0x15, 0xbf, 0x4f, 0xbc, 0xb4, 0x83, 0xbf, 0x04, + 0x18, 0x06, 0x44, 0x22, 0x00, 0xef, 0xab, 0x65, 0x7a, 0xba, 0xbc, 0x5a, 0x88, 0xe1, 0x17, 0xb0, + 0x22, 0xad, 0xfa, 0x00, 0x16, 0x62, 0xcb, 0xef, 0x75, 0x19, 0xaf, 0xc3, 0xb5, 0xf4, 0xdd, 0xa9, + 0xbe, 0x1e, 0xac, 0x37, 0xde, 0x53, 0x5d, 0x1d, 0xf2, 0xaf, 0x47, 0xc4, 0x95, 0xba, 0x16, 0x0d, + 0x09, 0xd2, 0x44, 0x22, 0x6f, 0xdb, 0xd6, 0xa8, 0x43, 0x1a, 0x96, 0x73, 0x6c, 0x5a, 0x9e, 0x4c, + 0xa4, 0x28, 0x16, 0xff, 0x4e, 0x83, 0x6b, 0x8d, 0x69, 0xc7, 0x42, 0xdf, 0x8f, 0x98, 0x94, 0x47, + 0xe9, 0x3d, 0xc5, 0xa4, 0x53, 0xb9, 0xff, 0x97, 0x06, 0xfd, 0xa7, 0x06, 0xf3, 0x91, 0xb6, 0x0b, + 0x21, 0xc8, 0xda, 0x34, 0x79, 0x39, 0x3b, 0xfb, 0xa6, 0xcd, 0xac, 0xe5, 0xb4, 0x4f, 0x49, 0x47, + 0xc4, 0xb1, 0x80, 0x28, 0x9e, 0x36, 0x69, 0xfb, 0x1d, 0x91, 0x26, 0x02, 0xa2, 0x78, 0x3e, 0xc3, + 0x89, 0xc6, 0x5c, 0x40, 0x61, 0x56, 0xe5, 0xd4, 0x9b, 0xf4, 0x2a, 0x14, 0xdb, 0x96, 0xe9, 0x79, + 0x4a, 0x33, 0x1e, 0x22, 0x50, 0x1d, 0xca, 0x1d, 0x32, 0xb4, 0x9c, 0x33, 0x59, 0xca, 0x44, 0x43, + 0xae, 0x8e, 0x7d, 0xf4, 0xf0, 0x7b, 0x11, 0x22, 0x23, 0xc6, 0x44, 0x0b, 0x29, 0x9a, 0x24, 0xa3, + 0xd7, 0x15, 0x9d, 0x0c, 0x14, 0x8d, 0x03, 0x98, 0x06, 0x86, 0x79, 0x42, 0x09, 0xe5, 0xc5, 0x20, + 0x41, 0xba, 0xe2, 0x74, 0xbb, 0xc4, 0x0d, 0x14, 0x97, 0x20, 0x9d, 0x3d, 0xc8, 0x5b, 0xd2, 0x1e, + 0xf9, 0x0e, 0x5d, 0xe4, 0xda, 0x2b, 0x18, 0xbc, 0x08, 0x0b, 0x0d, 0xe2, 0x8b, 0x04, 0xe5, 0x6d, + 0xfe, 0x43, 0x98, 0x0f, 0x51, 0x34, 0x58, 0x82, 0x0e, 0x59, 0xbb, 0x50, 0x87, 0x8c, 0x37, 0xa1, + 0x2c, 0x04, 0x28, 0xc3, 0x87, 0xf0, 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x73, 0x01, 0x25, 0xdd, + 0xe9, 0x43, 0xc8, 0xd2, 0x15, 0x71, 0xb9, 0x2c, 0xc5, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x0e, + 0xf3, 0x14, 0xb3, 0x4b, 0xbd, 0x92, 0x1a, 0x25, 0x74, 0x22, 0xe0, 0xec, 0x07, 0x4e, 0x87, 0x04, + 0x13, 0x41, 0x88, 0xc2, 0x3f, 0x86, 0xd2, 0xae, 0x33, 0x18, 0x98, 0x76, 0x87, 0x09, 0xa9, 0xc0, + 0x2c, 0xb1, 0xc7, 0x4c, 0xcd, 0xa2, 0x41, 0x3f, 0x59, 0x80, 0xf4, 0x88, 0x65, 0x89, 0x38, 0xe3, + 0x40, 0x18, 0xbe, 0xb3, 0x4a, 0xf8, 0xd2, 0xb0, 0x31, 0xdd, 0x93, 0x11, 0x9f, 0x70, 0xb2, 0x4c, + 0x46, 0x88, 0xa0, 0x07, 0xa4, 0x4d, 0xb3, 0x88, 0x34, 0xf6, 0x8d, 0x0f, 0xa0, 0xb4, 0xdb, 0x33, + 0x6d, 0x9b, 0x58, 0xa9, 0x3a, 0x20, 0xa5, 0x75, 0x29, 0x8a, 0x92, 0xc6, 0xac, 0xe9, 0x9e, 0x10, + 0x3f, 0x8c, 0x72, 0x0a, 0xe1, 0x7f, 0x65, 0xa0, 0x10, 0xa4, 0xcd, 0x37, 0xa1, 0xe8, 0x51, 0xe7, + 0xb0, 0x08, 0xe5, 0xf6, 0x4c, 0x77, 0x5c, 0x48, 0x4a, 0xf9, 0xda, 0xd2, 0xaa, 0xa2, 0x17, 0xd3, + 0x63, 0x7e, 0x08, 0xac, 0x6e, 0x84, 0xa4, 0xe8, 0xdb, 0xb0, 0xd0, 0xb7, 0x8f, 0x9d, 0x91, 0xdd, + 0x11, 0x2a, 0xd1, 0xcb, 0x89, 0x86, 0xcb, 0x8a, 0x5a, 0x22, 0x42, 0x6d, 0x8d, 0x38, 0x39, 0xda, + 0x81, 0x8a, 0x33, 0xf2, 0xa3, 0x22, 0xb2, 0x53, 0x45, 0x4c, 0xd0, 0xa3, 0x7b, 0xd4, 0xe5, 0x81, + 0x43, 0x99, 0xb1, 0x63, 0xec, 0xe1, 0xaa, 0xa1, 0x92, 0xd2, 0xc4, 0xa3, 0x91, 0xf5, 0xd4, 0xf4, + 0x7b, 0x22, 0xe7, 0x03, 0x98, 0xfa, 0x9b, 0xd8, 0xe3, 0xfd, 0x0e, 0xcb, 0xf4, 0xa2, 0xc1, 0x01, + 0x7c, 0x07, 0x96, 0xa2, 0x25, 0x8f, 0xc7, 0xba, 0x0e, 0x79, 0x1e, 0xdd, 0x9e, 0x08, 0x24, 0x09, + 0xe2, 0x9f, 0x69, 0xb0, 0x38, 0x51, 0x24, 0xd1, 0x7d, 0x28, 0x9d, 0xf6, 0x2d, 0x8b, 0x74, 0x5a, + 0x17, 0xca, 0x31, 0x95, 0x18, 0x7d, 0x01, 0x73, 0xee, 0xc8, 0xb6, 0xfb, 0xf6, 0x89, 0xac, 0xea, + 0xd3, 0x99, 0x23, 0xd4, 0x78, 0x97, 0xe5, 0x3e, 0xed, 0xae, 0x83, 0xc3, 0x07, 0x9a, 0x6a, 0x8a, + 0xa6, 0xd4, 0x36, 0x43, 0xd3, 0xef, 0x1d, 0x0d, 0x49, 0x5b, 0xf6, 0x50, 0x12, 0xc6, 0xbf, 0xc8, + 0x42, 0x41, 0x36, 0xe8, 0x69, 0x77, 0xb5, 0xb8, 0x7b, 0x33, 0xc9, 0x77, 0x6f, 0x64, 0x1a, 0xaf, + 0x42, 0xa1, 0x3b, 0xb2, 0x2c, 0xe6, 0x06, 0x7e, 0x5b, 0x05, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, + 0xe8, 0x16, 0xe4, 0x68, 0x53, 0xe7, 0xe9, 0x97, 0x98, 0x01, 0x12, 0x87, 0x07, 0x4e, 0x81, 0x1e, + 0x4c, 0x8c, 0xdd, 0xd7, 0x13, 0xa8, 0x53, 0xe7, 0xed, 0xbb, 0x91, 0x79, 0xfb, 0x5a, 0x12, 0x6b, + 0x7c, 0xd0, 0x7e, 0x30, 0x31, 0x68, 0x27, 0xee, 0xf8, 0x7f, 0x34, 0x61, 0xdf, 0x67, 0x15, 0x44, + 0x04, 0x16, 0x8d, 0xf1, 0xc0, 0x3f, 0xda, 0x79, 0xfe, 0xc1, 0xbf, 0xd5, 0xe0, 0x83, 0x06, 0xf1, + 0x5f, 0xc4, 0xe6, 0xed, 0x20, 0x42, 0x37, 0xa0, 0xe4, 0x92, 0xa1, 0xf3, 0xd4, 0xf4, 0x7d, 0xe2, + 0xca, 0xc7, 0x2c, 0x15, 0x85, 0x36, 0x61, 0xc1, 0x25, 0xe3, 0xbe, 0xd7, 0x77, 0x6c, 0x49, 0xc5, + 0x4f, 0x18, 0x47, 0x53, 0x59, 0xa6, 0x65, 0xed, 0xb8, 0xa6, 0xdd, 0xee, 0x11, 0xd9, 0x4c, 0xa9, + 0x28, 0x56, 0x72, 0x2d, 0xab, 0x65, 0x9e, 0xf0, 0xce, 0xa1, 0x60, 0x48, 0x10, 0x1f, 0xc3, 0x72, + 0xfc, 0x8c, 0x32, 0x05, 0xe8, 0x61, 0x64, 0x0a, 0xd0, 0x6f, 0x76, 0xb7, 0xc8, 0xf7, 0x04, 0x91, + 0x3f, 0x12, 0x66, 0xf3, 0x89, 0x38, 0x96, 0xc8, 0x84, 0x00, 0xc6, 0x5f, 0xc1, 0x6a, 0xb2, 0x29, + 0xa8, 0x4d, 0x0f, 0x60, 0x31, 0xfe, 0x28, 0x91, 0x34, 0x6f, 0x24, 0x1d, 0xd2, 0x98, 0xe4, 0xc4, + 0x08, 0x2a, 0x4f, 0xfa, 0x1e, 0xed, 0xf8, 0x1d, 0xe5, 0x35, 0xbd, 0x40, 0xe1, 0xd4, 0xd4, 0xd6, + 0x21, 0x2f, 0x12, 0x43, 0xd4, 0x47, 0x09, 0x52, 0x1f, 0x88, 0x4f, 0x23, 0xaa, 0x5c, 0x1c, 0x8d, + 0x5f, 0x43, 0x59, 0xd9, 0x57, 0x06, 0x0b, 0x85, 0x92, 0x82, 0x45, 0x9c, 0xc6, 0xe0, 0x14, 0xe8, + 0x53, 0xb8, 0x7c, 0xc2, 0x7a, 0xde, 0xbd, 0xd8, 0x66, 0xdc, 0xca, 0xc9, 0x8b, 0xf8, 0x10, 0xca, + 0xdb, 0x9d, 0x0e, 0x95, 0x25, 0x83, 0x2a, 0x49, 0xb9, 0x04, 0x15, 0x32, 0xc9, 0x2a, 0x18, 0x30, + 0x17, 0xc8, 0xe3, 0xfd, 0x12, 0xb2, 0xc9, 0x9b, 0xf8, 0x91, 0xb8, 0xec, 0x84, 0x15, 0xba, 0x7b, + 0x5f, 0x56, 0xdb, 0xa2, 0xc1, 0xbe, 0xf1, 0x2d, 0x58, 0x34, 0xc8, 0xc0, 0x19, 0x13, 0xf5, 0x98, + 0xcb, 0x90, 0xeb, 0xdb, 0x1d, 0xf2, 0x56, 0x3e, 0xc1, 0x33, 0x00, 0x7f, 0x0b, 0x16, 0x54, 0x52, + 0x7a, 0x82, 0x9b, 0x50, 0x56, 0xf7, 0x09, 0xc2, 0x31, 0x86, 0xc5, 0x1f, 0xc1, 0x92, 0x41, 0xba, + 0x2e, 0xf1, 0x7a, 0xaa, 0xdf, 0x53, 0xf6, 0xf9, 0x3a, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, 0x3e, 0x9d, + 0xfc, 0x01, 0x1b, 0xf4, 0x1a, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, 0xff, 0x1e, + 0x9b, 0xac, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, 0xc2, 0x07, + 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, 0xff, 0x6c, + 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0xef, 0x33, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, 0xf2, 0x1f, + 0x77, 0x90, 0x3e, 0xf1, 0x7b, 0x8f, 0x38, 0x62, 0x75, 0x25, 0x61, 0x85, 0x0e, 0x85, 0x33, 0xdf, + 0xd0, 0xd0, 0x4b, 0xa8, 0xc4, 0x7f, 0xb3, 0x40, 0x38, 0x3a, 0x81, 0x25, 0xfd, 0x24, 0x53, 0xdd, + 0x98, 0x4a, 0xc3, 0xa4, 0xa3, 0x1d, 0x28, 0xc8, 0x37, 0x7d, 0xa4, 0xbe, 0xc1, 0xc5, 0x7e, 0x13, + 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x0b, 0xd6, 0x1c, 0xa8, 0x8f, 0xfd, 0xe8, 0x7a, 0xea, 0x80, + 0x18, 0x68, 0xbc, 0x3e, 0x8d, 0x84, 0x0b, 0x6e, 0x41, 0x39, 0xfa, 0x7e, 0x89, 0x36, 0xce, 0x7b, + 0x3c, 0xad, 0xae, 0x4d, 0xa1, 0x08, 0xa4, 0x46, 0xf7, 0x43, 0x1b, 0xa9, 0x47, 0x49, 0x92, 0x9a, + 0xf0, 0xa6, 0x89, 0x67, 0xd0, 0x8f, 0x00, 0x4d, 0x3e, 0xca, 0xa1, 0x1b, 0x17, 0x79, 0x40, 0xac, + 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x84, 0xc5, 0x89, 0xe7, 0x24, 0xf4, 0x35, 0x85, 0x35, 0xed, + 0x99, 0xae, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xab, 0x4e, 0x44, 0x81, 0xd4, 0xf7, 0xa3, + 0x88, 0x02, 0x29, 0x4f, 0x43, 0x3c, 0xd6, 0xe4, 0xb4, 0x18, 0x89, 0xb5, 0xd8, 0x54, 0x19, 0x89, + 0xb5, 0xc8, 0x78, 0x89, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, 0xae, + 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x59, 0x8a, 0x8b, 0x9a, + 0xfa, 0x6c, 0x15, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, 0x78, + 0xf0, 0x0c, 0xea, 0xb2, 0x5f, 0xcb, 0x26, 0x8a, 0x37, 0xba, 0x19, 0xe5, 0x49, 0x6b, 0x74, 0xaa, + 0x37, 0xce, 0xa5, 0xe3, 0xfb, 0xd4, 0xa1, 0x18, 0x14, 0x50, 0xf4, 0x81, 0xc2, 0x14, 0x2f, 0xe7, + 0xd5, 0xd5, 0xe4, 0xc5, 0xc0, 0x07, 0xa2, 0x88, 0x45, 0x7c, 0x10, 0x2d, 0x94, 0x11, 0x1f, 0xa8, + 0x35, 0x0f, 0xcf, 0xa0, 0xc7, 0x00, 0x61, 0x19, 0x42, 0x57, 0x23, 0x55, 0x3b, 0x56, 0xc8, 0xaa, + 0xd5, 0x94, 0x55, 0x69, 0xfd, 0x39, 0xb5, 0x2a, 0x45, 0xbc, 0x99, 0x50, 0xae, 0xaa, 0x15, 0xf5, + 0x79, 0x95, 0xde, 0xd6, 0x78, 0x06, 0x3d, 0x82, 0x72, 0xb4, 0x58, 0x45, 0xee, 0x83, 0xc4, 0x3a, + 0x96, 0x28, 0xe7, 0x25, 0xe8, 0x69, 0x55, 0x0c, 0xdd, 0x8e, 0x4a, 0x9c, 0x56, 0xea, 0x12, 0x65, + 0x5b, 0xb0, 0x92, 0x5c, 0x8f, 0xd0, 0x66, 0x54, 0x72, 0x7a, 0x15, 0xac, 0xde, 0xbc, 0x00, 0x25, + 0xb3, 0xea, 0xce, 0xbd, 0x3f, 0xbe, 0x5b, 0xd3, 0xfe, 0xf6, 0x6e, 0x4d, 0xfb, 0xfb, 0xbb, 0x35, + 0xed, 0x57, 0xff, 0x58, 0x9b, 0x01, 0xdc, 0xee, 0xd5, 0xda, 0xc4, 0xb5, 0x6b, 0xa6, 0xd5, 0x6f, + 0x93, 0x9a, 0xb3, 0x55, 0x93, 0x92, 0xdc, 0x61, 0xdb, 0x23, 0xee, 0x98, 0xb8, 0x2f, 0x33, 0xc3, + 0xe3, 0xe3, 0x4b, 0xec, 0xff, 0x18, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x80, 0xfc, 0x36, + 0x8a, 0xa9, 0x21, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4957,6 +5018,63 @@ func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -6382,6 +6500,63 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } + } if len(m.Roles) > 0 { for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { { @@ -7361,6 +7536,30 @@ func (m *EnvironmentInfo) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8019,6 +8218,30 @@ func (m *RoleInfo) Size() (n int) { n += 1 + l + sovO2Control(uint64(l)) } } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9702,65 +9925,11 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { break } } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9770,33 +9939,128 @@ func (m *NewEnvironmentRequest) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + if m.Defaults == nil { + m.Defaults = make(map[string]string) } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Defaults[mapkey] = mapvalue + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } if iNdEx >= l { return io.ErrUnexpectedEOF } @@ -9915,63 +10179,9 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Vars[mapkey] = mapvalue iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9998,12 +10208,103 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} + if m.UserVars == nil { + m.UserVars = make(map[string]string) } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.UserVars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -10030,7 +10331,7 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10053,15 +10354,15 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentRequest: 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 WorkflowTemplate", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10089,7 +10390,134 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -10116,7 +10544,7 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10139,10 +10567,10 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10181,42 +10609,6 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10242,7 +10634,7 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10265,10 +10657,10 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10303,25 +10695,6 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10347,7 +10720,7 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10370,17 +10743,17 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentReply: 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 Environment", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10390,29 +10763,33 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10422,32 +10799,259 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + if m.Workflow == nil { + m.Workflow = &RoleInfo{} + } + if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: ControlEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlEnvironmentRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: ControlEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlEnvironmentReply: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + } + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13746,6 +14350,387 @@ func (m *RoleInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Defaults == nil { + m.Defaults = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Defaults[mapkey] = mapvalue + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UserVars == nil { + m.UserVars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.UserVars[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/common/gera/map.go b/common/gera/map.go index b5485928f..5e7379e2e 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -48,6 +48,8 @@ type Map interface { Flattened() (map[string]interface{}, error) WrappedAndFlattened(m Map) (map[string]interface{}, error) + + Raw() map[string]interface{} } func MakeMap() Map { @@ -209,3 +211,10 @@ func (w *WrapMap) WrappedAndFlattened(m Map) (map[string]interface{}, error) { err = mergo.Merge(&out, flattenedM) return out, err } + +func (w *WrapMap) Raw() map[string]interface{} { + if w == nil { + return nil + } + return w.theMap +} \ No newline at end of file diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 0841c44c5..3e81a3e49 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -44,6 +44,8 @@ type StringMap interface { Flattened() (map[string]string, error) WrappedAndFlattened(m StringMap) (map[string]string, error) + + Raw() map[string]string } func MakeStringMap() StringMap { @@ -205,3 +207,10 @@ func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, err err = mergo.Merge(&out, flattenedM) return out, err } + +func (w *StringWrapMap) Raw() map[string]string { + if w == nil { + return nil + } + return w.theMap +} \ No newline at end of file diff --git a/core/environment/environment.go b/core/environment/environment.go index c22043e8b..3d8841650 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -31,7 +31,9 @@ import ( "sync" "time" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" @@ -51,16 +53,32 @@ type Environment struct { workflow workflow.Role wfAdapter *workflow.ParentAdapter currentRunNumber uint32 + + GlobalDefaults gera.StringMap // From Consul + GlobalVars gera.StringMap // From Consul + UserVars gera.StringMap // From user input } -func newEnvironment() (env *Environment, err error) { +func newEnvironment(userVars map[string]string) (env *Environment, err error) { envId := uuid.NewUUID() env = &Environment{ id: envId, workflow: nil, ts: time.Now(), + // Every Environment instantiation performs a ConfSvc query for defaults and vars + // these key-values stay frozen throughout the lifetime of the environment + GlobalDefaults: gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults()), + GlobalVars: gera.MakeStringMapWithMap(the.ConfSvc().GetVars()), + UserVars: gera.MakeStringMapWithMap(userVars), } - env.wfAdapter = workflow.NewParentAdapter(func() uuid.Array { return env.Id().Array() }) + + // Make the KVs accessible to the workflow via ParentAdapter + env.wfAdapter = workflow.NewParentAdapter( + func() uuid.Array { return env.Id().Array() }, + func() gera.StringMap { return env.GlobalDefaults }, + func() gera.StringMap { return env.GlobalVars }, + func() gera.StringMap { return env.UserVars }, + ) env.Sm = fsm.NewFSM( "STANDBY", fsm.Events{ diff --git a/core/environment/manager.go b/core/environment/manager.go index ffe211e05..bec4df809 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -50,15 +50,32 @@ func NewEnvManager(tm *task.Manager) *Manager { } } -func (envs *Manager) CreateEnvironment(workflowPath string) (uuid.UUID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uuid.UUID, error) { envs.mu.Lock() defer envs.mu.Unlock() - env, err := newEnvironment() + // userVar identifiers come in 2 forms: + // environment user var: "someKey" + // workflow user var: "path.to.some.role:someKey" + // We need to split them into 2 structures, the first of which is passed to newEnvironment and the other one + // to loadWorkflow as its keys must be injected into one or more specific roles. + + envUserVars := make(map[string]string) + workflowUserVars := make(map[string]string) + for k, v := range userVars { + // If the key contains a ':', means we have a var associated with a specific workflow role + if strings.ContainsRune(k, task.TARGET_SEPARATOR_RUNE) { + workflowUserVars[k] = v + } else { + envUserVars[k] = v + } + } + + env, err := newEnvironment(envUserVars) if err != nil { return uuid.NIL, err } - env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter) + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %s", err.Error()) return env.id, err @@ -159,9 +176,9 @@ func (envs *Manager) environment(environmentId uuid.UUID) (env *Environment, err return } -func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable) (root workflow.Role, err error) { +func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable, workflowUserVars map[string]string) (root workflow.Role, err error) { if strings.Contains(workflowPath, "://") { return nil, errors.New("workflow loading from file not implemented yet") } - return workflow.Load(the.ConfSvc().GetROSource(), workflowPath, parent, envs.taskman) + return workflow.Load(the.ConfSvc().GetROSource(), workflowPath, parent, envs.taskman, workflowUserVars) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index a3dcb3d93..7698ce61a 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -750,15 +750,18 @@ func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { } type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } @@ -836,6 +839,27 @@ func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { return 0 } +func (m *EnvironmentInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil +} + +func (m *EnvironmentInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *EnvironmentInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} + type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` @@ -2455,15 +2479,18 @@ func (m *GetRolesRequest) GetPathSpec() string { } type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleInfo) Reset() { *m = RoleInfo{} } @@ -2541,6 +2568,27 @@ func (m *RoleInfo) GetRoles() []*RoleInfo { return nil } +func (m *RoleInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil +} + +func (m *RoleInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *RoleInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} + type GetRolesReply struct { Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3428,6 +3476,9 @@ func init() { proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") @@ -3460,6 +3511,9 @@ func init() { proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") @@ -3482,162 +3536,169 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2474 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x19, 0x4d, 0x73, 0x1b, 0x59, - 0xd1, 0x23, 0x4b, 0x91, 0xd4, 0xb2, 0x65, 0xf9, 0xd9, 0x71, 0x64, 0x6d, 0xd6, 0xf6, 0x3e, 0xb6, - 0xb2, 0xde, 0xec, 0xa2, 0xb0, 0xde, 0x2d, 0x36, 0xa4, 0x36, 0x1b, 0xfc, 0xa1, 0x28, 0x86, 0xd8, - 0x0a, 0x63, 0x25, 0x81, 0x54, 0x51, 0x61, 0x2c, 0x3d, 0x59, 0x5a, 0x8f, 0x66, 0x94, 0x37, 0x23, - 0x25, 0x3e, 0x70, 0xe3, 0x46, 0x51, 0x1c, 0xb8, 0x70, 0xa5, 0x28, 0x8e, 0xdc, 0x39, 0x50, 0xc5, - 0x95, 0x03, 0x14, 0xf0, 0x0f, 0xa8, 0x50, 0xc5, 0x89, 0x1f, 0x41, 0xbd, 0xaf, 0x99, 0x37, 0xa3, - 0x19, 0xd9, 0x5b, 0x14, 0x37, 0x75, 0xbf, 0xee, 0x7e, 0xfd, 0xf5, 0xba, 0x7b, 0x5a, 0xb0, 0x36, - 0xa2, 0xae, 0xef, 0x7a, 0x77, 0xdc, 0x9d, 0x8e, 0xeb, 0xf8, 0xd4, 0xb5, 0xeb, 0x1c, 0x81, 0x8a, - 0x01, 0x02, 0xaf, 0xc1, 0x6a, 0x63, 0x42, 0x1c, 0xff, 0xe5, 0x11, 0xf1, 0x5c, 0xef, 0x11, 0xb1, - 0xa8, 0x7f, 0x4a, 0x2c, 0x1f, 0x2f, 0xc1, 0xe2, 0x89, 0x6f, 0xf9, 0x63, 0xcf, 0x24, 0xaf, 0xc6, - 0xc4, 0xf3, 0xf1, 0x29, 0x94, 0x14, 0x62, 0x64, 0x5f, 0xa0, 0x55, 0xc8, 0x79, 0xbe, 0xe5, 0x93, - 0xaa, 0xb1, 0x65, 0x6c, 0x17, 0x4d, 0x01, 0xa0, 0xfb, 0xb0, 0xe8, 0x71, 0xa2, 0xa7, 0xa3, 0xae, - 0xe5, 0x13, 0xaf, 0x9a, 0xd9, 0x9a, 0xdf, 0x2e, 0xed, 0xdc, 0xa8, 0x87, 0x1a, 0x9c, 0x68, 0xe7, - 0x66, 0x94, 0x1a, 0xff, 0xd5, 0x80, 0x05, 0xfd, 0x1c, 0x7d, 0x0a, 0x39, 0x9b, 0x4c, 0x88, 0xcd, - 0x6f, 0x29, 0xef, 0xbc, 0x9b, 0x22, 0xa7, 0xfe, 0x98, 0x11, 0x99, 0x82, 0x16, 0x1d, 0x42, 0x79, - 0x18, 0x31, 0xa6, 0x9a, 0xd9, 0x32, 0xb6, 0x4b, 0x3b, 0x9b, 0x1a, 0x77, 0x92, 0xcd, 0x8f, 0xe6, - 0xcc, 0x18, 0x23, 0xfe, 0x0c, 0x72, 0x5c, 0x34, 0x2a, 0x42, 0xee, 0xa0, 0xb1, 0xf7, 0xb4, 0x59, - 0x99, 0x43, 0x05, 0xc8, 0x1e, 0x1e, 0x3f, 0x6c, 0x55, 0x0c, 0x54, 0x82, 0xfc, 0xf3, 0x5d, 0xf3, - 0xf8, 0xf0, 0xb8, 0x59, 0xc9, 0x30, 0x8a, 0x86, 0x69, 0xb6, 0xcc, 0xca, 0xfc, 0x5e, 0x1e, 0x72, - 0x5c, 0x3e, 0x5e, 0x87, 0x1b, 0x4d, 0xe2, 0x3f, 0xa4, 0xd6, 0x90, 0xbc, 0x76, 0xe9, 0xf9, 0xa1, - 0xd3, 0x73, 0x95, 0x3b, 0x7f, 0x6b, 0x40, 0xfe, 0x19, 0xa1, 0xde, 0xc0, 0x75, 0x98, 0x2f, 0x87, - 0xd6, 0x57, 0x2e, 0xe5, 0x56, 0xe6, 0x4c, 0x01, 0x70, 0xec, 0xc0, 0x71, 0x29, 0xd7, 0x9e, 0x61, - 0x19, 0xc0, 0xb0, 0x23, 0xcb, 0xef, 0xf4, 0xab, 0xf3, 0x02, 0xcb, 0x01, 0x86, 0x3d, 0x1d, 0x0f, - 0xec, 0x6e, 0x35, 0x2b, 0xa2, 0xc1, 0x01, 0xb4, 0x05, 0xa5, 0x11, 0x75, 0xbb, 0xe3, 0x8e, 0x7f, - 0x6c, 0x0d, 0x49, 0x35, 0xc7, 0xcf, 0x74, 0x14, 0xda, 0x00, 0x98, 0x08, 0x25, 0x4e, 0x7c, 0x5a, - 0xbd, 0xc6, 0x09, 0x34, 0x0c, 0xfe, 0x65, 0x06, 0xae, 0x4f, 0x5b, 0xc0, 0xe2, 0xbf, 0x05, 0xa5, - 0x5e, 0x80, 0xed, 0xca, 0x2c, 0xd0, 0x51, 0xe8, 0x63, 0x58, 0x26, 0xce, 0x64, 0x40, 0x5d, 0x67, - 0x48, 0x1c, 0xdf, 0xdb, 0x77, 0xc7, 0x8e, 0x2f, 0x6d, 0x99, 0x3e, 0x60, 0x9a, 0xf8, 0x96, 0x77, - 0x2e, 0xc9, 0x84, 0x71, 0x1a, 0x26, 0xcc, 0xb7, 0xac, 0x9e, 0x6f, 0x1b, 0x00, 0x7d, 0xd7, 0x53, - 0xc2, 0x73, 0x82, 0x2b, 0xc4, 0x20, 0x0c, 0x0b, 0x03, 0xc7, 0xf3, 0x2d, 0xa7, 0x43, 0xb8, 0x0b, - 0x84, 0x85, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0xd2, 0xe2, 0x6a, 0x9e, 0xe7, 0x09, 0xd2, 0xf2, 0x44, - 0x86, 0xc8, 0x54, 0x24, 0xf8, 0x43, 0x58, 0x6a, 0x13, 0x8b, 0x76, 0xdd, 0xd7, 0x8e, 0x0c, 0x25, - 0x5a, 0x83, 0x6b, 0x94, 0x58, 0x9e, 0xeb, 0x48, 0x2f, 0x48, 0x88, 0x3d, 0xa1, 0x90, 0x74, 0x64, - 0x5f, 0xe0, 0x2a, 0xac, 0x35, 0x89, 0xdf, 0xd0, 0x6c, 0x57, 0xd9, 0xf0, 0x06, 0x56, 0xa7, 0x4e, - 0xae, 0xe6, 0xe5, 0x2f, 0x61, 0x41, 0x77, 0xa6, 0x7c, 0x70, 0x35, 0x3d, 0xd5, 0xc3, 0x63, 0x1e, - 0xbe, 0x08, 0x3d, 0xfe, 0x87, 0x01, 0x4b, 0x31, 0x0a, 0x54, 0x86, 0xcc, 0x40, 0x5d, 0x96, 0x19, - 0xf0, 0x3c, 0xea, 0x50, 0x62, 0xf9, 0xa4, 0xfb, 0xbc, 0x4f, 0x1c, 0x1e, 0xc3, 0xa2, 0xa9, 0xa3, - 0xc2, 0xe8, 0xcc, 0xeb, 0xd1, 0xa9, 0x43, 0x8e, 0x47, 0xb0, 0x9a, 0xe5, 0x4a, 0x55, 0xf5, 0xd7, - 0xdb, 0x77, 0xa9, 0xdf, 0xb6, 0x3c, 0x91, 0x51, 0x82, 0x0c, 0xd5, 0xa0, 0x40, 0x5d, 0xd7, 0x37, - 0x5d, 0x5b, 0x25, 0x6b, 0x00, 0xa3, 0xdb, 0x50, 0xe9, 0x8c, 0x29, 0x25, 0x8e, 0x6f, 0x8e, 0x9d, - 0xe3, 0xf1, 0xf0, 0x94, 0x88, 0x7c, 0x5d, 0x34, 0xa7, 0xf0, 0xf8, 0x8f, 0x06, 0x5c, 0x3f, 0x26, - 0xaf, 0x35, 0xb3, 0x54, 0xa8, 0x6e, 0x43, 0x85, 0xf9, 0xad, 0x67, 0xbb, 0xaf, 0xdb, 0x64, 0x38, - 0xb2, 0xc3, 0x02, 0x36, 0x85, 0x47, 0x5f, 0x42, 0x76, 0x62, 0x51, 0xe5, 0xd1, 0xdb, 0x9a, 0xf2, - 0x89, 0xb2, 0xeb, 0xcf, 0x2c, 0xea, 0x35, 0x1c, 0x9f, 0x5e, 0x98, 0x9c, 0xaf, 0xf6, 0x39, 0x14, - 0x03, 0x14, 0xaa, 0xc0, 0xfc, 0x39, 0xb9, 0x90, 0x77, 0xb1, 0x9f, 0xcc, 0x65, 0x13, 0xcb, 0x1e, - 0x13, 0xe9, 0x4e, 0x01, 0xdc, 0xcb, 0xdc, 0x35, 0xf0, 0x09, 0xac, 0xc4, 0x6f, 0x60, 0xb9, 0xf0, - 0x05, 0x94, 0xb4, 0xc8, 0x71, 0x51, 0xb3, 0x03, 0xad, 0x93, 0xe3, 0x0f, 0xf8, 0x43, 0x4e, 0x70, - 0x49, 0x2c, 0xd8, 0xf8, 0x67, 0x06, 0xac, 0xc4, 0x29, 0xff, 0xe7, 0xeb, 0xd1, 0x1d, 0x28, 0x28, - 0x07, 0xcb, 0x6a, 0xbc, 0xa2, 0xb1, 0xb2, 0x08, 0x73, 0x9e, 0x80, 0x08, 0xff, 0xcd, 0x80, 0xf5, - 0x7d, 0x71, 0x7c, 0xb9, 0xd2, 0xe8, 0x01, 0x64, 0xfd, 0x8b, 0x91, 0xf0, 0x65, 0x79, 0xe7, 0x23, - 0x4d, 0x74, 0xaa, 0x8c, 0x7a, 0x6b, 0xc4, 0x58, 0x4c, 0xce, 0x88, 0x2d, 0xb8, 0x26, 0x60, 0x56, - 0xde, 0x8f, 0x5b, 0xad, 0x27, 0x95, 0x39, 0x84, 0xa0, 0x7c, 0xd2, 0xde, 0x35, 0xdb, 0x2f, 0x77, - 0xf7, 0xdb, 0x87, 0xcf, 0x0e, 0xdb, 0x3f, 0xaa, 0x18, 0x68, 0x19, 0x16, 0x4f, 0xda, 0xad, 0x27, - 0x21, 0x2a, 0x83, 0x16, 0xa1, 0xb8, 0xdf, 0x3a, 0x7e, 0x78, 0xd8, 0x7c, 0x6a, 0x36, 0x2a, 0xf3, - 0xac, 0x0f, 0x98, 0x8d, 0x93, 0x46, 0xbb, 0x92, 0x45, 0x0b, 0x50, 0x68, 0xb6, 0x5e, 0x8a, 0xae, - 0x90, 0xc3, 0xe7, 0x70, 0x23, 0x49, 0x19, 0xe6, 0xdb, 0xb8, 0x39, 0xc1, 0x73, 0xca, 0xe8, 0xcf, - 0x29, 0xe9, 0x09, 0xcc, 0xa7, 0x3c, 0x81, 0x5f, 0x19, 0x50, 0x3d, 0x72, 0xbb, 0x83, 0xde, 0xc5, - 0x95, 0xbc, 0x07, 0xee, 0x88, 0x50, 0xcb, 0x1f, 0xb8, 0x8e, 0xca, 0xf7, 0xcd, 0xe4, 0xc8, 0xb6, - 0x14, 0x9d, 0xa9, 0xb1, 0xa0, 0x5b, 0x50, 0xa6, 0xa4, 0xe3, 0x3a, 0xbd, 0xc1, 0xd9, 0x98, 0x92, - 0x5d, 0xdb, 0xe6, 0x7a, 0x15, 0xcc, 0x18, 0x16, 0xff, 0xc6, 0x80, 0xd5, 0x24, 0x61, 0xe8, 0x9e, - 0x8c, 0x9f, 0x68, 0xf3, 0xb7, 0x2e, 0xb9, 0x3b, 0x12, 0x3a, 0x51, 0x35, 0x6c, 0x51, 0xdf, 0x33, - 0xaa, 0x6a, 0x08, 0x18, 0x7f, 0x92, 0x10, 0xd6, 0x25, 0x28, 0x99, 0x8d, 0xa3, 0xd6, 0xb3, 0xc6, - 0x4b, 0xb3, 0xf5, 0x98, 0x45, 0x6c, 0x01, 0x0a, 0xbb, 0x07, 0x07, 0x02, 0xca, 0xe2, 0x9f, 0x1b, - 0xb0, 0x96, 0xe0, 0x39, 0x16, 0xa6, 0xef, 0x43, 0xa5, 0x67, 0x0d, 0x6c, 0xd2, 0x6d, 0x85, 0xde, - 0x32, 0xae, 0xe6, 0xad, 0x29, 0x46, 0x19, 0x84, 0xcc, 0x74, 0xcc, 0xf5, 0x12, 0x8a, 0x0f, 0x61, - 0xfd, 0x80, 0x78, 0x3e, 0x75, 0xaf, 0x12, 0xc7, 0x9b, 0x50, 0x3c, 0x27, 0x64, 0xd4, 0xe6, 0x35, - 0x37, 0xc3, 0x23, 0x10, 0x22, 0x30, 0x81, 0x1b, 0x49, 0xa2, 0x98, 0x61, 0xdf, 0x83, 0xe5, 0x8e, - 0x4d, 0x2c, 0x67, 0x2c, 0x48, 0x39, 0x52, 0xbe, 0xf0, 0x9b, 0xfa, 0x5b, 0x8a, 0xd3, 0x98, 0xd3, - 0x6c, 0xf8, 0x2f, 0x06, 0x6c, 0x9e, 0x44, 0xea, 0xc7, 0x13, 0xca, 0x52, 0xc5, 0x1f, 0x10, 0x2f, - 0x4d, 0xf1, 0x17, 0x00, 0xa3, 0x80, 0x48, 0x26, 0xe0, 0x3d, 0xbd, 0x5b, 0xcc, 0x96, 0x57, 0x0f, - 0x31, 0xa2, 0x00, 0x6b, 0xd2, 0x6a, 0xf7, 0x61, 0x29, 0x76, 0xfc, 0xb5, 0x8a, 0xf1, 0x26, 0xbc, - 0x9b, 0x7e, 0x3b, 0xb3, 0xd7, 0x83, 0xcd, 0xe6, 0xd7, 0x34, 0xb7, 0x0a, 0xf9, 0x57, 0x63, 0x42, - 0x95, 0xad, 0x45, 0x53, 0x81, 0xec, 0x21, 0x91, 0x37, 0x1d, 0x7b, 0xdc, 0x25, 0x4d, 0xdb, 0x3d, - 0xb5, 0x6c, 0x4f, 0x3d, 0xa4, 0x28, 0x16, 0xff, 0xc1, 0x80, 0x77, 0x9b, 0xb3, 0xd4, 0x42, 0x3f, - 0x8c, 0xb8, 0x54, 0x64, 0xe9, 0x5d, 0xcd, 0xa5, 0x33, 0xb9, 0xff, 0x9f, 0x0e, 0xfd, 0xb7, 0x01, - 0x8b, 0x91, 0xee, 0x8f, 0x10, 0x64, 0x1d, 0xf6, 0x78, 0x05, 0x3b, 0xff, 0xcd, 0x66, 0x2a, 0xdb, - 0xed, 0x9c, 0x93, 0xae, 0xcc, 0x63, 0x09, 0x31, 0x3c, 0x9b, 0x15, 0x0e, 0xbb, 0xf2, 0x99, 0x48, - 0x88, 0xe1, 0xc5, 0xa7, 0x84, 0x9c, 0x0f, 0x25, 0x14, 0xbe, 0xaa, 0x9c, 0x5e, 0x49, 0x6f, 0x42, - 0xb1, 0x63, 0x5b, 0x9e, 0xa7, 0xcd, 0x84, 0x21, 0x02, 0x35, 0xa0, 0xdc, 0x25, 0x23, 0xdb, 0xbd, - 0x50, 0xad, 0x4c, 0xce, 0x85, 0xfa, 0xd7, 0x07, 0x53, 0xfe, 0x20, 0x42, 0x64, 0xc6, 0x98, 0x58, - 0x23, 0x45, 0xd3, 0x64, 0xac, 0x5c, 0xb1, 0x01, 0x55, 0xb3, 0x38, 0x80, 0x59, 0x62, 0x58, 0x67, - 0x8c, 0x50, 0x15, 0x06, 0x05, 0xb2, 0x13, 0xb7, 0xd7, 0x23, 0x34, 0x30, 0x5c, 0x81, 0x6c, 0x04, - 0x26, 0x6f, 0x48, 0x67, 0xec, 0xbb, 0xec, 0x50, 0x58, 0xaf, 0x61, 0xf0, 0x32, 0x2c, 0x35, 0x89, - 0x2f, 0x1f, 0xa8, 0x98, 0x36, 0x1f, 0xc0, 0x62, 0x88, 0x62, 0xc9, 0x12, 0x0c, 0x6a, 0xc6, 0x95, - 0x06, 0x35, 0xbc, 0x0d, 0x65, 0x29, 0x40, 0x9b, 0x81, 0x65, 0x5c, 0x0c, 0x3d, 0x2e, 0xf8, 0x73, - 0x58, 0x08, 0x28, 0xd9, 0x4d, 0x1f, 0x40, 0x96, 0x9d, 0xc8, 0xe2, 0xb2, 0x12, 0xf3, 0x28, 0xbf, - 0x83, 0x13, 0xe0, 0x06, 0x2c, 0x32, 0xcc, 0x3e, 0x8b, 0x4a, 0x6a, 0x96, 0xb0, 0xc1, 0x54, 0xb0, - 0x1f, 0xb9, 0x5d, 0x12, 0x0c, 0xa6, 0x21, 0x0a, 0xff, 0x14, 0x4a, 0xfb, 0xee, 0x70, 0x68, 0x39, - 0x5d, 0x2e, 0xa4, 0x02, 0xf3, 0xc4, 0x99, 0x70, 0x33, 0x8b, 0x26, 0xfb, 0xc9, 0x13, 0xa4, 0x4f, - 0x6c, 0x5b, 0xe6, 0x99, 0x00, 0xc2, 0xf4, 0x9d, 0xd7, 0xd2, 0x97, 0xa5, 0x8d, 0x45, 0xcf, 0xc6, - 0x62, 0xd0, 0xce, 0x72, 0x19, 0x21, 0x82, 0x29, 0x38, 0xf6, 0x08, 0x95, 0x99, 0xc6, 0x7f, 0xe3, - 0x23, 0x28, 0xed, 0xf7, 0x2d, 0xc7, 0x21, 0x76, 0xaa, 0x0d, 0x48, 0x1b, 0x5d, 0x8a, 0xb2, 0xa5, - 0x71, 0x6f, 0xd2, 0x33, 0xe2, 0x87, 0x59, 0xce, 0x20, 0xfc, 0x9f, 0x0c, 0x14, 0x82, 0x67, 0xf3, - 0x6d, 0x28, 0x7a, 0x2c, 0x38, 0x3c, 0x43, 0x85, 0x3f, 0xd3, 0x03, 0x17, 0x92, 0x32, 0xbe, 0x8e, - 0xf2, 0xaa, 0x9c, 0xc5, 0xaa, 0xb1, 0x38, 0x04, 0x5e, 0x37, 0x43, 0x52, 0xf4, 0x5d, 0x58, 0x1a, - 0x38, 0xa7, 0xee, 0xd8, 0xe9, 0x4a, 0x93, 0x58, 0x71, 0x62, 0xe9, 0xb2, 0xa6, 0xb7, 0x88, 0xd0, - 0x5a, 0x33, 0x4e, 0x8e, 0xf6, 0xa0, 0xe2, 0x8e, 0xfd, 0xa8, 0x88, 0xec, 0x4c, 0x11, 0x53, 0xf4, - 0xe8, 0x2e, 0x0b, 0x79, 0x10, 0x50, 0xee, 0xec, 0x18, 0x7b, 0x78, 0x6a, 0xea, 0xa4, 0xec, 0xe1, - 0xb1, 0xcc, 0x7a, 0x62, 0xf9, 0x7d, 0xf9, 0xe6, 0x03, 0x98, 0xc5, 0x9b, 0x38, 0x93, 0xc3, 0x2e, - 0x7f, 0xe9, 0x45, 0x53, 0x00, 0xf8, 0x0e, 0xac, 0x44, 0x5b, 0x9e, 0xc8, 0xf5, 0x2a, 0xe4, 0x45, - 0x76, 0x7b, 0x32, 0x91, 0x14, 0x88, 0x7f, 0x61, 0xc0, 0xf2, 0x54, 0x93, 0x44, 0xf7, 0xa0, 0x74, - 0x3e, 0xb0, 0x6d, 0xd2, 0x6d, 0x5f, 0xe9, 0x8d, 0xe9, 0xc4, 0xe8, 0x0b, 0x58, 0xa0, 0x63, 0xc7, - 0x19, 0x38, 0x67, 0xaa, 0xab, 0xcf, 0x66, 0x8e, 0x50, 0xe3, 0x7d, 0xfe, 0xf6, 0xd9, 0x74, 0x1d, - 0x28, 0x1f, 0x58, 0x6a, 0x68, 0x96, 0x32, 0xdf, 0x8c, 0x2c, 0xbf, 0x7f, 0x32, 0x22, 0x1d, 0x35, - 0x43, 0x29, 0x18, 0xff, 0xde, 0x80, 0x82, 0x1a, 0xd0, 0xd3, 0x6a, 0xb5, 0xac, 0xbd, 0x99, 0xe4, - 0xda, 0x1b, 0xf9, 0x28, 0xac, 0x41, 0xa1, 0x37, 0xb6, 0x6d, 0x1e, 0x06, 0x51, 0xad, 0x02, 0x58, - 0xf7, 0x6c, 0x2e, 0xe2, 0x59, 0xf4, 0x21, 0xe4, 0xd8, 0x50, 0xe7, 0x55, 0xaf, 0x71, 0x07, 0x24, - 0x7e, 0x3c, 0x08, 0x0a, 0x7c, 0x8f, 0x57, 0x37, 0x69, 0x34, 0xf3, 0x7f, 0xc0, 0x6b, 0x5c, 0xca, - 0xfb, 0x3b, 0x03, 0xde, 0x69, 0x12, 0xff, 0x79, 0xec, 0x5b, 0x30, 0xf0, 0xde, 0x16, 0x94, 0x28, - 0x19, 0xb9, 0x4f, 0x2c, 0xdf, 0x27, 0x54, 0x7d, 0xef, 0xeb, 0x28, 0xb4, 0x0d, 0x4b, 0x94, 0x4c, - 0x06, 0xde, 0xc0, 0x75, 0x14, 0x95, 0xf0, 0x4a, 0x1c, 0xcd, 0x64, 0x59, 0xb6, 0xbd, 0x47, 0x2d, - 0xa7, 0xd3, 0x27, 0xaa, 0xd1, 0xeb, 0x28, 0xde, 0x0e, 0x6c, 0xbb, 0x6d, 0x9d, 0x89, 0xae, 0x56, - 0x30, 0x15, 0x88, 0x4f, 0x61, 0x35, 0xae, 0xa3, 0x0a, 0x0f, 0x53, 0x46, 0x85, 0x87, 0xfd, 0xe6, - 0x79, 0xaf, 0xbe, 0x75, 0x65, 0x6c, 0x15, 0xcc, 0x67, 0x67, 0xa9, 0x96, 0x8c, 0x52, 0x00, 0xe3, - 0xaf, 0x60, 0x3d, 0xd9, 0x15, 0xcc, 0xa7, 0x47, 0xb0, 0x1c, 0xff, 0x60, 0x4e, 0x9a, 0x85, 0x93, - 0x94, 0x34, 0xa7, 0x39, 0x31, 0x82, 0xca, 0xe3, 0x81, 0xc7, 0xa6, 0x51, 0x57, 0x5b, 0x38, 0x16, - 0x18, 0x9c, 0x9a, 0x76, 0x55, 0xc8, 0x77, 0x49, 0xcf, 0x1a, 0xdb, 0xbe, 0xac, 0xdd, 0x0a, 0x64, - 0x31, 0x90, 0x3f, 0xcd, 0xa8, 0x71, 0x71, 0x34, 0x7e, 0x05, 0x65, 0xed, 0x5e, 0x95, 0x2c, 0x0c, - 0x4a, 0x4a, 0x16, 0xa9, 0x8d, 0x29, 0x28, 0xd0, 0x67, 0x70, 0xfd, 0x8c, 0xcf, 0x63, 0x07, 0xb1, - 0xcb, 0x84, 0x97, 0x93, 0x0f, 0xf1, 0x31, 0x94, 0x77, 0xbb, 0x5d, 0x26, 0x4b, 0x25, 0x55, 0x92, - 0x71, 0x09, 0x26, 0x64, 0x92, 0x4d, 0x30, 0x61, 0x21, 0x90, 0x27, 0x7a, 0x39, 0x72, 0xc8, 0xeb, - 0xb8, 0x4a, 0x42, 0x76, 0xc2, 0x09, 0xbb, 0x7d, 0xa0, 0x3a, 0x41, 0xd1, 0xe4, 0xbf, 0xf1, 0x87, - 0xb0, 0x6c, 0x92, 0xa1, 0x3b, 0x21, 0xba, 0x9a, 0xab, 0x90, 0x1b, 0x38, 0x5d, 0xf2, 0x46, 0x6d, - 0x29, 0x39, 0x80, 0xbf, 0x03, 0x4b, 0x3a, 0x29, 0xd3, 0xe0, 0x16, 0x94, 0xf5, 0x7b, 0x82, 0x74, - 0x8c, 0x61, 0xf1, 0x47, 0xb0, 0x62, 0x92, 0x1e, 0x25, 0x5e, 0x5f, 0x8f, 0x7b, 0xca, 0x3d, 0xdf, - 0x84, 0xeb, 0x27, 0xc4, 0xd7, 0xd8, 0x67, 0x93, 0xdf, 0xe7, 0x1f, 0x21, 0xcd, 0xa4, 0x08, 0x28, - 0x46, 0x3d, 0xf7, 0x8d, 0x58, 0xee, 0xff, 0x80, 0x4f, 0xfd, 0xec, 0x9a, 0x14, 0xe6, 0xc4, 0x5b, - 0x23, 0x22, 0x33, 0x31, 0x91, 0x9f, 0xc0, 0x3b, 0x69, 0x22, 0x99, 0xd3, 0x54, 0x18, 0x0c, 0x2d, - 0x0c, 0x79, 0xc8, 0x35, 0x86, 0x23, 0xff, 0x62, 0xe7, 0x4f, 0x8b, 0x90, 0x97, 0xbb, 0x03, 0xb4, - 0x0f, 0xa5, 0x36, 0xb5, 0x3a, 0xe7, 0x62, 0xff, 0x8d, 0xaa, 0x53, 0x2b, 0x71, 0xa9, 0x62, 0x6d, - 0x2d, 0xe1, 0x84, 0x7d, 0xb0, 0xcc, 0x7d, 0xcb, 0x40, 0x2f, 0xa0, 0x12, 0x5f, 0xeb, 0x22, 0x1c, - 0xfd, 0x3a, 0x48, 0xda, 0x5a, 0xd7, 0xb6, 0x66, 0xd2, 0x70, 0xe9, 0x68, 0x0f, 0x0a, 0x6a, 0xed, - 0x89, 0xf4, 0xfd, 0x50, 0x6c, 0x6d, 0x5a, 0xab, 0x26, 0x9e, 0x09, 0x19, 0xcf, 0x79, 0xe3, 0xd2, - 0xf7, 0xa1, 0xe8, 0xbd, 0xd4, 0x8f, 0x97, 0xc0, 0xe2, 0xcd, 0x59, 0x24, 0x42, 0x70, 0x1b, 0xca, - 0xd1, 0xdd, 0x1a, 0xda, 0xba, 0x6c, 0xb1, 0x57, 0xdb, 0x98, 0x41, 0x11, 0x48, 0x8d, 0xde, 0x87, - 0xb6, 0x52, 0x55, 0x49, 0x92, 0x9a, 0xb0, 0x6f, 0xc3, 0x73, 0xe8, 0x27, 0x80, 0xa6, 0x17, 0x46, - 0xe8, 0xfd, 0xab, 0x2c, 0xb7, 0x6a, 0xf8, 0x12, 0x2a, 0x71, 0xc3, 0x8f, 0x61, 0x79, 0x6a, 0xd5, - 0x81, 0xbe, 0xa1, 0xb1, 0xa6, 0xad, 0x90, 0x6a, 0xef, 0xcd, 0x26, 0x0a, 0x0c, 0x98, 0xde, 0x38, - 0x44, 0x0c, 0x48, 0xdd, 0x6d, 0x44, 0x0c, 0x48, 0x59, 0x5b, 0x88, 0x5c, 0x53, 0x5f, 0x32, 0x91, - 0x5c, 0x8b, 0x7d, 0xf1, 0x44, 0x72, 0x2d, 0xf2, 0xe9, 0x83, 0xe7, 0xd0, 0x03, 0xc8, 0x4b, 0x14, - 0x5a, 0x9f, 0x26, 0x53, 0x12, 0x6e, 0x24, 0x1d, 0x09, 0x01, 0xc7, 0xb0, 0xa0, 0x0f, 0x7d, 0x68, - 0x23, 0x75, 0x65, 0x22, 0x44, 0xcd, 0x5c, 0xa9, 0x04, 0x46, 0xf1, 0x01, 0x26, 0x6e, 0x94, 0x3e, - 0xca, 0xc5, 0x8d, 0x0a, 0x27, 0x1e, 0x3c, 0x87, 0x7a, 0xfc, 0x0f, 0x85, 0xa9, 0xe6, 0x8d, 0x6e, - 0x45, 0x79, 0xd2, 0x06, 0x9d, 0xda, 0xfb, 0x97, 0xd2, 0x89, 0x7b, 0x1a, 0x50, 0x0c, 0x1a, 0x28, - 0x7a, 0x47, 0x63, 0x8a, 0xb7, 0xf3, 0xda, 0x7a, 0xf2, 0x61, 0x10, 0x03, 0xd9, 0xc4, 0x22, 0x31, - 0x88, 0x36, 0xca, 0x48, 0x0c, 0xf4, 0x9e, 0x87, 0xe7, 0xd0, 0x23, 0x80, 0xb0, 0x0d, 0xa1, 0x9b, - 0x91, 0xae, 0x1d, 0x6b, 0x64, 0xb5, 0x5a, 0xca, 0xa9, 0xf2, 0xfe, 0x82, 0xde, 0x95, 0x22, 0xd1, - 0x4c, 0x68, 0x57, 0xb5, 0x8a, 0xbe, 0xfa, 0x63, 0xd5, 0x1a, 0xcf, 0xa1, 0x87, 0x50, 0x8e, 0x36, - 0xab, 0x48, 0x3d, 0x48, 0xec, 0x63, 0x89, 0x72, 0x5e, 0x40, 0x35, 0xad, 0x8b, 0xa1, 0xdb, 0x51, - 0x89, 0xb3, 0x5a, 0x5d, 0xa2, 0x6c, 0x1b, 0xd6, 0x92, 0xfb, 0x11, 0xda, 0x8e, 0x4a, 0x4e, 0xef, - 0x82, 0xb5, 0x5b, 0x57, 0xa0, 0xe4, 0x5e, 0xdd, 0xbb, 0xfb, 0xe7, 0xb7, 0x1b, 0xc6, 0xdf, 0xdf, - 0x6e, 0x18, 0xff, 0x7c, 0xbb, 0x61, 0xfc, 0xfa, 0x5f, 0x1b, 0x73, 0x80, 0x3b, 0xfd, 0x7a, 0x87, - 0x50, 0xa7, 0x6e, 0xd9, 0x83, 0x0e, 0xa9, 0xbb, 0x3b, 0x75, 0x25, 0x89, 0x8e, 0x3a, 0x1e, 0xa1, - 0x13, 0x42, 0x5f, 0x64, 0x46, 0xa7, 0xa7, 0xd7, 0xf8, 0x5f, 0xd6, 0x9f, 0xfe, 0x37, 0x00, 0x00, - 0xff, 0xff, 0x5b, 0x99, 0x04, 0x0b, 0xcc, 0x1e, 0x00, 0x00, + // 2581 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0x59, + 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x4e, 0xbc, 0x6d, 0x92, 0x5e, 0xaa, + 0x6e, 0xda, 0x5d, 0x5c, 0x9a, 0x5d, 0xb1, 0xa5, 0xbb, 0xdd, 0x92, 0x0f, 0xd7, 0x0d, 0x34, 0x71, + 0x99, 0xb8, 0x2d, 0x54, 0x42, 0x65, 0x62, 0x5f, 0xc7, 0xde, 0x8c, 0x67, 0xdc, 0x99, 0xb1, 0xdb, + 0x3c, 0xf0, 0xc6, 0x1b, 0x42, 0x08, 0xf1, 0xc2, 0x2b, 0x42, 0xfc, 0x07, 0x1e, 0x90, 0x78, 0x45, + 0x08, 0x04, 0x3f, 0x01, 0x15, 0x89, 0x27, 0x7e, 0x04, 0xba, 0x5f, 0x33, 0x77, 0xc6, 0x33, 0x4e, + 0x0a, 0xe2, 0x85, 0xb7, 0x39, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0x5f, 0xf7, 0x9c, 0x73, 0x6d, 0x58, + 0x19, 0xba, 0x8e, 0xef, 0x78, 0x77, 0x9c, 0xad, 0xb6, 0x63, 0xfb, 0xae, 0x63, 0xd5, 0x18, 0x02, + 0x15, 0x03, 0x04, 0x5e, 0x81, 0xe5, 0xfa, 0x98, 0xd8, 0xfe, 0xab, 0x03, 0xe2, 0x39, 0xde, 0x63, + 0x62, 0xba, 0xfe, 0x31, 0x31, 0x7d, 0xbc, 0x00, 0xf3, 0x47, 0xbe, 0xe9, 0x8f, 0x3c, 0x83, 0xbc, + 0x1e, 0x11, 0xcf, 0xc7, 0xc7, 0x50, 0x92, 0x88, 0xa1, 0x75, 0x86, 0x96, 0x21, 0xe7, 0xf9, 0xa6, + 0x4f, 0x74, 0x6d, 0x43, 0xdb, 0x2c, 0x1a, 0x1c, 0x40, 0x0f, 0x60, 0xde, 0x63, 0x44, 0xcf, 0x86, + 0x1d, 0xd3, 0x27, 0x9e, 0x9e, 0xd9, 0x98, 0xdd, 0x2c, 0x6d, 0x5d, 0xa9, 0x85, 0x27, 0x38, 0x52, + 0xd6, 0x8d, 0x28, 0x35, 0xfe, 0x8b, 0x06, 0x73, 0xea, 0x3a, 0xfa, 0x04, 0x72, 0x16, 0x19, 0x13, + 0x8b, 0xed, 0x52, 0xde, 0xba, 0x96, 0x22, 0xa7, 0xf6, 0x84, 0x12, 0x19, 0x9c, 0x16, 0xed, 0x43, + 0x79, 0x10, 0x51, 0x46, 0xcf, 0x6c, 0x68, 0x9b, 0xa5, 0xad, 0x75, 0x85, 0x3b, 0x49, 0xe7, 0xc7, + 0x33, 0x46, 0x8c, 0x11, 0x7f, 0x0a, 0x39, 0x26, 0x1a, 0x15, 0x21, 0xb7, 0x57, 0xdf, 0x79, 0xd6, + 0xa8, 0xcc, 0xa0, 0x02, 0x64, 0xf7, 0x0f, 0x1f, 0x35, 0x2b, 0x1a, 0x2a, 0x41, 0xfe, 0xc5, 0xb6, + 0x71, 0xb8, 0x7f, 0xd8, 0xa8, 0x64, 0x28, 0x45, 0xdd, 0x30, 0x9a, 0x46, 0x65, 0x76, 0x27, 0x0f, + 0x39, 0x26, 0x1f, 0xaf, 0xc2, 0x95, 0x06, 0xf1, 0x1f, 0xb9, 0xe6, 0x80, 0xbc, 0x71, 0xdc, 0xd3, + 0x7d, 0xbb, 0xeb, 0x48, 0x73, 0xfe, 0x46, 0x83, 0xfc, 0x73, 0xe2, 0x7a, 0x7d, 0xc7, 0xa6, 0xb6, + 0x1c, 0x98, 0x5f, 0x39, 0x2e, 0xd3, 0x32, 0x67, 0x70, 0x80, 0x61, 0xfb, 0xb6, 0xe3, 0xb2, 0xd3, + 0x53, 0x2c, 0x05, 0x28, 0x76, 0x68, 0xfa, 0xed, 0x9e, 0x3e, 0xcb, 0xb1, 0x0c, 0xa0, 0xd8, 0xe3, + 0x51, 0xdf, 0xea, 0xe8, 0x59, 0xee, 0x0d, 0x06, 0xa0, 0x0d, 0x28, 0x0d, 0x5d, 0xa7, 0x33, 0x6a, + 0xfb, 0x87, 0xe6, 0x80, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x1a, 0xc0, 0x98, 0x1f, 0xe2, 0xc8, + 0x77, 0xf5, 0x4b, 0x8c, 0x40, 0xc1, 0xe0, 0x9f, 0x67, 0xe0, 0xf2, 0xa4, 0x06, 0xd4, 0xff, 0x1b, + 0x50, 0xea, 0x06, 0xd8, 0x8e, 0x88, 0x02, 0x15, 0x85, 0x3e, 0x86, 0x45, 0x62, 0x8f, 0xfb, 0xae, + 0x63, 0x0f, 0x88, 0xed, 0x7b, 0xbb, 0xce, 0xc8, 0xf6, 0x85, 0x2e, 0x93, 0x0b, 0xf4, 0x24, 0xbe, + 0xe9, 0x9d, 0x0a, 0x32, 0xae, 0x9c, 0x82, 0x09, 0xe3, 0x2d, 0xab, 0xc6, 0xdb, 0x1a, 0x40, 0xcf, + 0xf1, 0xa4, 0xf0, 0x1c, 0xe7, 0x0a, 0x31, 0x08, 0xc3, 0x5c, 0xdf, 0xf6, 0x7c, 0xd3, 0x6e, 0x13, + 0x66, 0x02, 0xae, 0x61, 0x04, 0x87, 0x3e, 0x86, 0xbc, 0xd0, 0x58, 0xcf, 0xb3, 0x38, 0x41, 0x4a, + 0x9c, 0x08, 0x17, 0x19, 0x92, 0x04, 0xdf, 0x82, 0x85, 0x16, 0x31, 0xdd, 0x8e, 0xf3, 0xc6, 0x16, + 0xae, 0x44, 0x2b, 0x70, 0xc9, 0x25, 0xa6, 0xe7, 0xd8, 0xc2, 0x0a, 0x02, 0xa2, 0x29, 0x14, 0x92, + 0x0e, 0xad, 0x33, 0xac, 0xc3, 0x4a, 0x83, 0xf8, 0x75, 0x45, 0x77, 0x19, 0x0d, 0x6f, 0x61, 0x79, + 0x62, 0xe5, 0x62, 0x56, 0xfe, 0x12, 0xe6, 0x54, 0x63, 0x8a, 0x84, 0xab, 0xaa, 0xa1, 0x1e, 0x2e, + 0x33, 0xf7, 0x45, 0xe8, 0xf1, 0x9f, 0xb2, 0xb0, 0x10, 0xa3, 0x40, 0x65, 0xc8, 0xf4, 0xe5, 0x66, + 0x99, 0x3e, 0x8b, 0xa3, 0xb6, 0x4b, 0x4c, 0x9f, 0x74, 0x5e, 0xf4, 0x88, 0xcd, 0x7c, 0x58, 0x34, + 0x54, 0x54, 0xe8, 0x9d, 0x59, 0xd5, 0x3b, 0x35, 0xc8, 0x31, 0x0f, 0xea, 0x59, 0x76, 0x28, 0x5d, + 0xcd, 0xde, 0x9e, 0xe3, 0xfa, 0x2d, 0xd3, 0xe3, 0x11, 0xc5, 0xc9, 0x50, 0x15, 0x0a, 0xae, 0xe3, + 0xf8, 0x86, 0x63, 0xc9, 0x60, 0x0d, 0x60, 0x74, 0x1b, 0x2a, 0xed, 0x91, 0xeb, 0x12, 0xdb, 0x37, + 0x46, 0xf6, 0xe1, 0x68, 0x70, 0x4c, 0x78, 0xbc, 0xce, 0x1b, 0x13, 0x78, 0xb4, 0x07, 0x85, 0x0e, + 0xe9, 0x9a, 0x23, 0xcb, 0xf7, 0xf4, 0x3c, 0xdb, 0x7a, 0x33, 0xdd, 0x1e, 0xb5, 0x3d, 0x41, 0x5a, + 0xb7, 0x7d, 0xf7, 0xcc, 0x08, 0x38, 0xd1, 0x3d, 0xc8, 0x8e, 0x4d, 0xd7, 0xd3, 0x0b, 0x4c, 0xc2, + 0x8d, 0x29, 0x12, 0x9e, 0x9b, 0xae, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x47, 0x5c, 0x8a, 0xd6, + 0x8b, 0xe7, 0xee, 0xff, 0x4c, 0x90, 0x8a, 0xfd, 0x25, 0x67, 0xf5, 0x73, 0x98, 0x8f, 0x1c, 0x0d, + 0x55, 0x60, 0xf6, 0x94, 0x9c, 0x09, 0xbf, 0xd0, 0x4f, 0x6a, 0xf6, 0xb1, 0x69, 0x8d, 0x88, 0x70, + 0x09, 0x07, 0xee, 0x67, 0xee, 0x69, 0xd5, 0xcf, 0xa0, 0x18, 0xc8, 0x7c, 0x2f, 0xc6, 0xcf, 0x61, + 0x3e, 0x72, 0xa0, 0xf7, 0x61, 0xc6, 0xbf, 0xd7, 0xe0, 0xf2, 0x21, 0x79, 0xa3, 0x68, 0x28, 0x73, + 0xe4, 0x36, 0x54, 0x68, 0xc0, 0x76, 0x2d, 0xe7, 0x4d, 0x8b, 0x0c, 0x86, 0x56, 0x58, 0x39, 0x26, + 0xf0, 0xe8, 0x4b, 0x61, 0x78, 0x1e, 0xca, 0xb7, 0x15, 0xd3, 0x25, 0xca, 0x8e, 0x9b, 0xff, 0x3f, + 0xd6, 0x1d, 0x1f, 0xc1, 0x52, 0x7c, 0x07, 0x9a, 0x84, 0x5f, 0x40, 0x49, 0x49, 0x19, 0x26, 0x6a, + 0x7a, 0x86, 0xa9, 0xe4, 0xf8, 0x43, 0x76, 0x83, 0x26, 0x98, 0x24, 0x96, 0x65, 0xf8, 0x27, 0x1a, + 0x2c, 0xc5, 0x29, 0xff, 0xeb, 0xed, 0xd1, 0x1d, 0x28, 0x48, 0x03, 0x8b, 0x32, 0xb8, 0xa4, 0xb0, + 0xd2, 0xd4, 0x62, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, 0xab, 0xbb, 0x7c, 0xf9, 0xfc, 0x43, 0xa3, + 0x87, 0x90, 0xf5, 0xcf, 0x86, 0xdc, 0x96, 0xe5, 0xad, 0x8f, 0x14, 0xd1, 0xa9, 0x32, 0x6a, 0xcd, + 0x21, 0x65, 0x31, 0x18, 0x23, 0x36, 0xe1, 0x12, 0x87, 0x69, 0x5d, 0x3d, 0x6c, 0x36, 0x9f, 0x56, + 0x66, 0x10, 0x82, 0xf2, 0x51, 0x6b, 0xdb, 0x68, 0xbd, 0xda, 0xde, 0x6d, 0xed, 0x3f, 0xdf, 0x6f, + 0xfd, 0xa0, 0xa2, 0xa1, 0x45, 0x98, 0x3f, 0x6a, 0x35, 0x9f, 0x86, 0xa8, 0x0c, 0x9a, 0x87, 0xe2, + 0x6e, 0xf3, 0xf0, 0xd1, 0x7e, 0xe3, 0x99, 0x51, 0xaf, 0xcc, 0xd2, 0x02, 0x6c, 0xd4, 0x8f, 0xea, + 0xad, 0x4a, 0x16, 0xcd, 0x41, 0xa1, 0xd1, 0x7c, 0xc5, 0xcb, 0x71, 0x0e, 0x9f, 0xc2, 0x95, 0xa4, + 0xc3, 0x50, 0xdb, 0xc6, 0xd5, 0x09, 0xee, 0xb1, 0x8c, 0x7a, 0x8f, 0x25, 0xdd, 0x3d, 0xb3, 0xc9, + 0x77, 0x0f, 0xfe, 0xa5, 0x06, 0xfa, 0x81, 0xd3, 0xe9, 0x77, 0xcf, 0x2e, 0x64, 0x3d, 0x70, 0x86, + 0xc4, 0x35, 0xfd, 0xbe, 0x63, 0xcb, 0x78, 0x5f, 0x4f, 0xf6, 0x6c, 0x53, 0xd2, 0x19, 0x0a, 0x0b, + 0xba, 0x09, 0x65, 0x97, 0xb4, 0x1d, 0xbb, 0xdb, 0x3f, 0x19, 0xb9, 0x64, 0xdb, 0xb2, 0xd8, 0xb9, + 0x0a, 0x46, 0x0c, 0x8b, 0x7f, 0xad, 0xc1, 0x72, 0x92, 0x30, 0x74, 0x5f, 0xf8, 0x8f, 0xf7, 0x57, + 0x37, 0xcf, 0xd9, 0x3b, 0xe2, 0x3a, 0x7e, 0x5d, 0x5b, 0xbc, 0xb0, 0x66, 0xe4, 0x75, 0xcd, 0x61, + 0x7c, 0x37, 0xc1, 0xad, 0x0b, 0x50, 0x32, 0xea, 0x07, 0xcd, 0xe7, 0xf5, 0x57, 0x46, 0xf3, 0x09, + 0xf5, 0xd8, 0x1c, 0x14, 0xb6, 0xf7, 0xf6, 0x38, 0x94, 0xc5, 0x3f, 0xd5, 0x60, 0x25, 0xc1, 0x72, + 0xd4, 0x4d, 0xdf, 0x85, 0x4a, 0xd7, 0xec, 0x5b, 0xa4, 0xd3, 0x0c, 0xad, 0xa5, 0x5d, 0xcc, 0x5a, + 0x13, 0x8c, 0xc2, 0x09, 0x99, 0x49, 0x9f, 0xab, 0xb5, 0x0b, 0xef, 0xc3, 0xea, 0x1e, 0xf1, 0x7c, + 0xd7, 0xb9, 0x88, 0x1f, 0xaf, 0x42, 0xf1, 0x94, 0x90, 0x61, 0x8b, 0x15, 0xbb, 0x0c, 0xf3, 0x40, + 0x88, 0xc0, 0x04, 0xae, 0x24, 0x89, 0xa2, 0x8a, 0x7d, 0x07, 0x16, 0xdb, 0x16, 0x31, 0xed, 0x11, + 0x27, 0x65, 0x48, 0x91, 0xe1, 0x57, 0xd5, 0x5c, 0x8a, 0xd3, 0x18, 0x93, 0x6c, 0xf8, 0xcf, 0x1a, + 0xac, 0x1f, 0x45, 0xee, 0x8f, 0xa7, 0x2e, 0x0d, 0x15, 0xbf, 0x4f, 0xbc, 0xb4, 0x83, 0xbf, 0x04, + 0x18, 0x06, 0x44, 0x22, 0x00, 0xef, 0xab, 0x65, 0x7a, 0xba, 0xbc, 0x5a, 0x88, 0xe1, 0x17, 0xb0, + 0x22, 0xad, 0xfa, 0x00, 0x16, 0x62, 0xcb, 0xef, 0x75, 0x19, 0xaf, 0xc3, 0xb5, 0xf4, 0xdd, 0xa9, + 0xbe, 0x1e, 0xac, 0x37, 0xde, 0x53, 0x5d, 0x1d, 0xf2, 0xaf, 0x47, 0xc4, 0x95, 0xba, 0x16, 0x0d, + 0x09, 0xd2, 0x44, 0x22, 0x6f, 0xdb, 0xd6, 0xa8, 0x43, 0x1a, 0x96, 0x73, 0x6c, 0x5a, 0x9e, 0x4c, + 0xa4, 0x28, 0x16, 0xff, 0x4e, 0x83, 0x6b, 0x8d, 0x69, 0xc7, 0x42, 0xdf, 0x8f, 0x98, 0x94, 0x47, + 0xe9, 0x3d, 0xc5, 0xa4, 0x53, 0xb9, 0xff, 0x97, 0x06, 0xfd, 0xa7, 0x06, 0xf3, 0x91, 0xb6, 0x0b, + 0x21, 0xc8, 0xda, 0x34, 0x79, 0x39, 0x3b, 0xfb, 0xa6, 0xcd, 0xac, 0xe5, 0xb4, 0x4f, 0x49, 0x47, + 0xc4, 0xb1, 0x80, 0x28, 0x9e, 0x36, 0x69, 0xfb, 0x1d, 0x91, 0x26, 0x02, 0xa2, 0x78, 0x3e, 0xc3, + 0x89, 0xc6, 0x5c, 0x40, 0x61, 0x56, 0xe5, 0xd4, 0x9b, 0xf4, 0x2a, 0x14, 0xdb, 0x96, 0xe9, 0x79, + 0x4a, 0x33, 0x1e, 0x22, 0x50, 0x1d, 0xca, 0x1d, 0x32, 0xb4, 0x9c, 0x33, 0x59, 0xca, 0x44, 0x43, + 0xae, 0x8e, 0x7d, 0xf4, 0xf0, 0x7b, 0x11, 0x22, 0x23, 0xc6, 0x44, 0x0b, 0x29, 0x9a, 0x24, 0xa3, + 0xd7, 0x15, 0x9d, 0x0c, 0x14, 0x8d, 0x03, 0x98, 0x06, 0x86, 0x79, 0x42, 0x09, 0xe5, 0xc5, 0x20, + 0x41, 0xba, 0xe2, 0x74, 0xbb, 0xc4, 0x0d, 0x14, 0x97, 0x20, 0x9d, 0x3d, 0xc8, 0x5b, 0xd2, 0x1e, + 0xf9, 0x0e, 0x5d, 0xe4, 0xda, 0x2b, 0x18, 0xbc, 0x08, 0x0b, 0x0d, 0xe2, 0x8b, 0x04, 0xe5, 0x6d, + 0xfe, 0x43, 0x98, 0x0f, 0x51, 0x34, 0x58, 0x82, 0x0e, 0x59, 0xbb, 0x50, 0x87, 0x8c, 0x37, 0xa1, + 0x2c, 0x04, 0x28, 0xc3, 0x87, 0xf0, 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x73, 0x01, 0x25, 0xdd, + 0xe9, 0x43, 0xc8, 0xd2, 0x15, 0x71, 0xb9, 0x2c, 0xc5, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x0e, + 0xf3, 0x14, 0xb3, 0x4b, 0xbd, 0x92, 0x1a, 0x25, 0x74, 0x22, 0xe0, 0xec, 0x07, 0x4e, 0x87, 0x04, + 0x13, 0x41, 0x88, 0xc2, 0x3f, 0x86, 0xd2, 0xae, 0x33, 0x18, 0x98, 0x76, 0x87, 0x09, 0xa9, 0xc0, + 0x2c, 0xb1, 0xc7, 0x4c, 0xcd, 0xa2, 0x41, 0x3f, 0x59, 0x80, 0xf4, 0x88, 0x65, 0x89, 0x38, 0xe3, + 0x40, 0x18, 0xbe, 0xb3, 0x4a, 0xf8, 0xd2, 0xb0, 0x31, 0xdd, 0x93, 0x11, 0x9f, 0x70, 0xb2, 0x4c, + 0x46, 0x88, 0xa0, 0x07, 0xa4, 0x4d, 0xb3, 0x88, 0x34, 0xf6, 0x8d, 0x0f, 0xa0, 0xb4, 0xdb, 0x33, + 0x6d, 0x9b, 0x58, 0xa9, 0x3a, 0x20, 0xa5, 0x75, 0x29, 0x8a, 0x92, 0xc6, 0xac, 0xe9, 0x9e, 0x10, + 0x3f, 0x8c, 0x72, 0x0a, 0xe1, 0x7f, 0x65, 0xa0, 0x10, 0xa4, 0xcd, 0x37, 0xa1, 0xe8, 0x51, 0xe7, + 0xb0, 0x08, 0xe5, 0xf6, 0x4c, 0x77, 0x5c, 0x48, 0x4a, 0xf9, 0xda, 0xd2, 0xaa, 0xa2, 0x17, 0xd3, + 0x63, 0x7e, 0x08, 0xac, 0x6e, 0x84, 0xa4, 0xe8, 0xdb, 0xb0, 0xd0, 0xb7, 0x8f, 0x9d, 0x91, 0xdd, + 0x11, 0x2a, 0xd1, 0xcb, 0x89, 0x86, 0xcb, 0x8a, 0x5a, 0x22, 0x42, 0x6d, 0x8d, 0x38, 0x39, 0xda, + 0x81, 0x8a, 0x33, 0xf2, 0xa3, 0x22, 0xb2, 0x53, 0x45, 0x4c, 0xd0, 0xa3, 0x7b, 0xd4, 0xe5, 0x81, + 0x43, 0x99, 0xb1, 0x63, 0xec, 0xe1, 0xaa, 0xa1, 0x92, 0xd2, 0xc4, 0xa3, 0x91, 0xf5, 0xd4, 0xf4, + 0x7b, 0x22, 0xe7, 0x03, 0x98, 0xfa, 0x9b, 0xd8, 0xe3, 0xfd, 0x0e, 0xcb, 0xf4, 0xa2, 0xc1, 0x01, + 0x7c, 0x07, 0x96, 0xa2, 0x25, 0x8f, 0xc7, 0xba, 0x0e, 0x79, 0x1e, 0xdd, 0x9e, 0x08, 0x24, 0x09, + 0xe2, 0x9f, 0x69, 0xb0, 0x38, 0x51, 0x24, 0xd1, 0x7d, 0x28, 0x9d, 0xf6, 0x2d, 0x8b, 0x74, 0x5a, + 0x17, 0xca, 0x31, 0x95, 0x18, 0x7d, 0x01, 0x73, 0xee, 0xc8, 0xb6, 0xfb, 0xf6, 0x89, 0xac, 0xea, + 0xd3, 0x99, 0x23, 0xd4, 0x78, 0x97, 0xe5, 0x3e, 0xed, 0xae, 0x83, 0xc3, 0x07, 0x9a, 0x6a, 0x8a, + 0xa6, 0xd4, 0x36, 0x43, 0xd3, 0xef, 0x1d, 0x0d, 0x49, 0x5b, 0xf6, 0x50, 0x12, 0xc6, 0xbf, 0xc8, + 0x42, 0x41, 0x36, 0xe8, 0x69, 0x77, 0xb5, 0xb8, 0x7b, 0x33, 0xc9, 0x77, 0x6f, 0x64, 0x1a, 0xaf, + 0x42, 0xa1, 0x3b, 0xb2, 0x2c, 0xe6, 0x06, 0x7e, 0x5b, 0x05, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, + 0xe8, 0x16, 0xe4, 0x68, 0x53, 0xe7, 0xe9, 0x97, 0x98, 0x01, 0x12, 0x87, 0x07, 0x4e, 0x81, 0x1e, + 0x4c, 0x8c, 0xdd, 0xd7, 0x13, 0xa8, 0x53, 0xe7, 0xed, 0xbb, 0x91, 0x79, 0xfb, 0x5a, 0x12, 0x6b, + 0x7c, 0xd0, 0x7e, 0x30, 0x31, 0x68, 0x27, 0xee, 0xf8, 0x7f, 0x34, 0x61, 0xdf, 0x67, 0x15, 0x44, + 0x04, 0x16, 0x8d, 0xf1, 0xc0, 0x3f, 0xda, 0x79, 0xfe, 0xc1, 0xbf, 0xd5, 0xe0, 0x83, 0x06, 0xf1, + 0x5f, 0xc4, 0xe6, 0xed, 0x20, 0x42, 0x37, 0xa0, 0xe4, 0x92, 0xa1, 0xf3, 0xd4, 0xf4, 0x7d, 0xe2, + 0xca, 0xc7, 0x2c, 0x15, 0x85, 0x36, 0x61, 0xc1, 0x25, 0xe3, 0xbe, 0xd7, 0x77, 0x6c, 0x49, 0xc5, + 0x4f, 0x18, 0x47, 0x53, 0x59, 0xa6, 0x65, 0xed, 0xb8, 0xa6, 0xdd, 0xee, 0x11, 0xd9, 0x4c, 0xa9, + 0x28, 0x56, 0x72, 0x2d, 0xab, 0x65, 0x9e, 0xf0, 0xce, 0xa1, 0x60, 0x48, 0x10, 0x1f, 0xc3, 0x72, + 0xfc, 0x8c, 0x32, 0x05, 0xe8, 0x61, 0x64, 0x0a, 0xd0, 0x6f, 0x76, 0xb7, 0xc8, 0xf7, 0x04, 0x91, + 0x3f, 0x12, 0x66, 0xf3, 0x89, 0x38, 0x96, 0xc8, 0x84, 0x00, 0xc6, 0x5f, 0xc1, 0x6a, 0xb2, 0x29, + 0xa8, 0x4d, 0x0f, 0x60, 0x31, 0xfe, 0x28, 0x91, 0x34, 0x6f, 0x24, 0x1d, 0xd2, 0x98, 0xe4, 0xc4, + 0x08, 0x2a, 0x4f, 0xfa, 0x1e, 0xed, 0xf8, 0x1d, 0xe5, 0x35, 0xbd, 0x40, 0xe1, 0xd4, 0xd4, 0xd6, + 0x21, 0x2f, 0x12, 0x43, 0xd4, 0x47, 0x09, 0x52, 0x1f, 0x88, 0x4f, 0x23, 0xaa, 0x5c, 0x1c, 0x8d, + 0x5f, 0x43, 0x59, 0xd9, 0x57, 0x06, 0x0b, 0x85, 0x92, 0x82, 0x45, 0x9c, 0xc6, 0xe0, 0x14, 0xe8, + 0x53, 0xb8, 0x7c, 0xc2, 0x7a, 0xde, 0xbd, 0xd8, 0x66, 0xdc, 0xca, 0xc9, 0x8b, 0xf8, 0x10, 0xca, + 0xdb, 0x9d, 0x0e, 0x95, 0x25, 0x83, 0x2a, 0x49, 0xb9, 0x04, 0x15, 0x32, 0xc9, 0x2a, 0x18, 0x30, + 0x17, 0xc8, 0xe3, 0xfd, 0x12, 0xb2, 0xc9, 0x9b, 0xf8, 0x91, 0xb8, 0xec, 0x84, 0x15, 0xba, 0x7b, + 0x5f, 0x56, 0xdb, 0xa2, 0xc1, 0xbe, 0xf1, 0x2d, 0x58, 0x34, 0xc8, 0xc0, 0x19, 0x13, 0xf5, 0x98, + 0xcb, 0x90, 0xeb, 0xdb, 0x1d, 0xf2, 0x56, 0x3e, 0xc1, 0x33, 0x00, 0x7f, 0x0b, 0x16, 0x54, 0x52, + 0x7a, 0x82, 0x9b, 0x50, 0x56, 0xf7, 0x09, 0xc2, 0x31, 0x86, 0xc5, 0x1f, 0xc1, 0x92, 0x41, 0xba, + 0x2e, 0xf1, 0x7a, 0xaa, 0xdf, 0x53, 0xf6, 0xf9, 0x3a, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, 0x3e, 0x9d, + 0xfc, 0x01, 0x1b, 0xf4, 0x1a, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, 0xff, 0x1e, + 0x9b, 0xac, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, 0xc2, 0x07, + 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, 0xff, 0x6c, + 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0xef, 0x33, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, 0xf2, 0x1f, + 0x77, 0x90, 0x3e, 0xf1, 0x7b, 0x8f, 0x38, 0x62, 0x75, 0x25, 0x61, 0x85, 0x0e, 0x85, 0x33, 0xdf, + 0xd0, 0xd0, 0x4b, 0xa8, 0xc4, 0x7f, 0xb3, 0x40, 0x38, 0x3a, 0x81, 0x25, 0xfd, 0x24, 0x53, 0xdd, + 0x98, 0x4a, 0xc3, 0xa4, 0xa3, 0x1d, 0x28, 0xc8, 0x37, 0x7d, 0xa4, 0xbe, 0xc1, 0xc5, 0x7e, 0x13, + 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x0b, 0xd6, 0x1c, 0xa8, 0x8f, 0xfd, 0xe8, 0x7a, 0xea, 0x80, + 0x18, 0x68, 0xbc, 0x3e, 0x8d, 0x84, 0x0b, 0x6e, 0x41, 0x39, 0xfa, 0x7e, 0x89, 0x36, 0xce, 0x7b, + 0x3c, 0xad, 0xae, 0x4d, 0xa1, 0x08, 0xa4, 0x46, 0xf7, 0x43, 0x1b, 0xa9, 0x47, 0x49, 0x92, 0x9a, + 0xf0, 0xa6, 0x89, 0x67, 0xd0, 0x8f, 0x00, 0x4d, 0x3e, 0xca, 0xa1, 0x1b, 0x17, 0x79, 0x40, 0xac, + 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x84, 0xc5, 0x89, 0xe7, 0x24, 0xf4, 0x35, 0x85, 0x35, 0xed, + 0x99, 0xae, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xab, 0x4e, 0x44, 0x81, 0xd4, 0xf7, 0xa3, + 0x88, 0x02, 0x29, 0x4f, 0x43, 0x3c, 0xd6, 0xe4, 0xb4, 0x18, 0x89, 0xb5, 0xd8, 0x54, 0x19, 0x89, + 0xb5, 0xc8, 0x78, 0x89, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, 0xae, + 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x59, 0x8a, 0x8b, 0x9a, + 0xfa, 0x6c, 0x15, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, 0x78, + 0xf0, 0x0c, 0xea, 0xb2, 0x5f, 0xcb, 0x26, 0x8a, 0x37, 0xba, 0x19, 0xe5, 0x49, 0x6b, 0x74, 0xaa, + 0x37, 0xce, 0xa5, 0xe3, 0xfb, 0xd4, 0xa1, 0x18, 0x14, 0x50, 0xf4, 0x81, 0xc2, 0x14, 0x2f, 0xe7, + 0xd5, 0xd5, 0xe4, 0xc5, 0xc0, 0x07, 0xa2, 0x88, 0x45, 0x7c, 0x10, 0x2d, 0x94, 0x11, 0x1f, 0xa8, + 0x35, 0x0f, 0xcf, 0xa0, 0xc7, 0x00, 0x61, 0x19, 0x42, 0x57, 0x23, 0x55, 0x3b, 0x56, 0xc8, 0xaa, + 0xd5, 0x94, 0x55, 0x69, 0xfd, 0x39, 0xb5, 0x2a, 0x45, 0xbc, 0x99, 0x50, 0xae, 0xaa, 0x15, 0xf5, + 0x79, 0x95, 0xde, 0xd6, 0x78, 0x06, 0x3d, 0x82, 0x72, 0xb4, 0x58, 0x45, 0xee, 0x83, 0xc4, 0x3a, + 0x96, 0x28, 0xe7, 0x25, 0xe8, 0x69, 0x55, 0x0c, 0xdd, 0x8e, 0x4a, 0x9c, 0x56, 0xea, 0x12, 0x65, + 0x5b, 0xb0, 0x92, 0x5c, 0x8f, 0xd0, 0x66, 0x54, 0x72, 0x7a, 0x15, 0xac, 0xde, 0xbc, 0x00, 0x25, + 0xb3, 0xea, 0xce, 0xbd, 0x3f, 0xbe, 0x5b, 0xd3, 0xfe, 0xf6, 0x6e, 0x4d, 0xfb, 0xfb, 0xbb, 0x35, + 0xed, 0x57, 0xff, 0x58, 0x9b, 0x01, 0xdc, 0xee, 0xd5, 0xda, 0xc4, 0xb5, 0x6b, 0xa6, 0xd5, 0x6f, + 0x93, 0x9a, 0xb3, 0x55, 0x93, 0x92, 0xdc, 0x61, 0xdb, 0x23, 0xee, 0x98, 0xb8, 0x2f, 0x33, 0xc3, + 0xe3, 0xe3, 0x4b, 0xec, 0xff, 0x18, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x80, 0xfc, 0x36, + 0x8a, 0xa9, 0x21, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4957,6 +5018,63 @@ func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -6382,6 +6500,63 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a + } + } if len(m.Roles) > 0 { for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { { @@ -7361,6 +7536,30 @@ func (m *EnvironmentInfo) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8019,6 +8218,30 @@ func (m *RoleInfo) Size() (n int) { n += 1 + l + sovO2Control(uint64(l)) } } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9702,65 +9925,11 @@ func (m *EnvironmentInfo) Unmarshal(dAtA []byte) error { break } } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -9770,33 +9939,128 @@ func (m *NewEnvironmentRequest) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + if m.Defaults == nil { + m.Defaults = make(map[string]string) } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Defaults[mapkey] = mapvalue + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } if iNdEx >= l { return io.ErrUnexpectedEOF } @@ -9915,63 +10179,9 @@ func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Vars[mapkey] = mapvalue iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -9998,12 +10208,103 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} + if m.UserVars == nil { + m.UserVars = make(map[string]string) } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var mapkey string + var mapvalue string + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } } + m.UserVars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -10030,7 +10331,7 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10053,15 +10354,15 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentRequest: 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 WorkflowTemplate", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10089,7 +10390,134 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue iNdEx = postIndex default: iNdEx = preIndex @@ -10116,7 +10544,7 @@ func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10139,10 +10567,10 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: NewEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10181,42 +10609,6 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10242,7 +10634,7 @@ func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10265,10 +10657,10 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentRequest: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -10303,25 +10695,6 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } m.Id = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10347,7 +10720,7 @@ func (m *ControlEnvironmentRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { +func (m *GetEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -10370,17 +10743,17 @@ func (m *ControlEnvironmentReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ControlEnvironmentReply: wiretype end group for non-group") + return fmt.Errorf("proto: GetEnvironmentReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: GetEnvironmentReply: 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 Environment", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10390,29 +10763,33 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.Id = string(dAtA[iNdEx:postIndex]) + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10422,32 +10799,259 @@ func (m *ControlEnvironmentReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + if m.Workflow == nil { + m.Workflow = &RoleInfo{} + } + if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: ControlEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlEnvironmentRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: ControlEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ControlEnvironmentReply: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) + } + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control } if iNdEx >= l { return io.ErrUnexpectedEOF @@ -13746,6 +14350,387 @@ func (m *RoleInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Defaults == nil { + m.Defaults = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Defaults[mapkey] = mapvalue + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.UserVars == nil { + m.UserVars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.UserVars[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 1cd39681e..9be1ff4de 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -133,6 +133,9 @@ message EnvironmentInfo { repeated ShortTaskInfo tasks = 4; string rootRole = 5; uint32 currentRunNumber = 6; + map defaults = 7; + map vars = 8; + map userVars = 9; } message NewEnvironmentRequest { @@ -300,6 +303,9 @@ message RoleInfo { string fullPath = 4; repeated string taskIds = 5; repeated RoleInfo roles = 6; + map defaults = 7; + map vars = 8; + map userVars = 9; } message GetRolesReply { diff --git a/core/server.go b/core/server.go index 751c33e99..2a0c81784 100644 --- a/core/server.go +++ b/core/server.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2018-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -128,40 +128,6 @@ func (*RpcServer) Teardown(context.Context, *pb.TeardownRequest) (*pb.TeardownRe return nil, status.New(codes.Unimplemented, "not implemented").Err() } -type EnvironmentInfos []*pb.EnvironmentInfo -func (infos EnvironmentInfos) Len() int { - return len(infos) -} -func (infos EnvironmentInfos) Less(i, j int) bool { - iv := infos[i] - jv := infos[j] - if iv == nil { - return true - } - if jv == nil { - return false - } - iTime, err := time.Parse(time.RFC3339, iv.CreatedWhen) - if err != nil { - return true - } - jTime, err := time.Parse(time.RFC3339, jv.CreatedWhen) - if err != nil { - return false - } - if iTime.Unix() < jTime.Unix() { - return true - } else { - return false - } -} -func (infos EnvironmentInfos) Swap(i, j int) { - var temp *pb.EnvironmentInfo - temp = infos[i] - infos[i] = infos[j] - infos[j] = temp -} - func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { m.logMethod() m.state.RLock() @@ -222,7 +188,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme } // Create new Environment instance with some roles, we get back a UUID - id, err := m.state.environments.CreateEnvironment(request.GetWorkflowTemplate()) + id, err := m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) if err != nil { return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() } @@ -270,6 +236,9 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe Tasks: tasksToShortTaskInfos(tasks), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: env.GlobalDefaults.Raw(), + Vars: env.GlobalVars.Raw(), + UserVars: env.UserVars.Raw(), }, Workflow: workflowToRoleTree(env.Workflow()), } diff --git a/core/servertypes.go b/core/servertypes.go new file mode 100644 index 000000000..88f3a8ca8 --- /dev/null +++ b/core/servertypes.go @@ -0,0 +1,65 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package core + +import ( + "time" + + pb "github.com/AliceO2Group/Control/core/protos" +) + +type EnvironmentInfos []*pb.EnvironmentInfo +func (infos EnvironmentInfos) Len() int { + return len(infos) +} +func (infos EnvironmentInfos) Less(i, j int) bool { + iv := infos[i] + jv := infos[j] + if iv == nil { + return true + } + if jv == nil { + return false + } + iTime, err := time.Parse(time.RFC3339, iv.CreatedWhen) + if err != nil { + return true + } + jTime, err := time.Parse(time.RFC3339, jv.CreatedWhen) + if err != nil { + return false + } + if iTime.Unix() < jTime.Unix() { + return true + } else { + return false + } +} +func (infos EnvironmentInfos) Swap(i, j int) { + var temp *pb.EnvironmentInfo + temp = infos[i] + infos[i] = infos[j] + infos[j] = temp +} diff --git a/core/serverutil.go b/core/serverutil.go index 9cd9d65e5..8239ab45a 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -145,12 +145,15 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { childRoleInfos[i] = workflowToRoleTree(cr) } ri = &pb.RoleInfo{ - Name: root.GetName(), - Status: root.GetStatus().String(), - State: root.GetState().String(), + Name: root.GetName(), + Status: root.GetStatus().String(), + State: root.GetState().String(), FullPath: root.GetPath(), - TaskIds: tasksToTaskIds(root.GetTasks()), - Roles: childRoleInfos, + TaskIds: tasksToTaskIds(root.GetTasks()), + Roles: childRoleInfos, + Defaults: root.GetDefaults().Raw(), + Vars: root.GetVars().Raw(), + UserVars: root.GetUserVars().Raw(), } return } diff --git a/core/task/manager.go b/core/task/manager.go index f2485d4a5..40cbda31b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -47,6 +47,11 @@ import ( type KillTaskFunc func(*Task) error +const ( + TARGET_SEPARATOR_RUNE = ':' + TARGET_SEPARATOR = ":" +) + type Manager struct { AgentCache AgentCache @@ -398,7 +403,7 @@ func (m *Manager) ConfigureTasks(envId uuid.Array, tasks Tasks) error { for _, task := range tasks { taskPath := task.parent.GetPath() for inbChName, port := range task.GetBindPorts() { - bindMap[taskPath + ":" + inbChName] = channel.Endpoint{Host: task.GetHostname(), Port: port} + bindMap[taskPath + TARGET_SEPARATOR + inbChName] = channel.Endpoint{Host: task.GetHostname(), Port: port} } } log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 7da073e9e..50351e301 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -103,6 +103,9 @@ func (r *aggregatorRole) copy() copyable { func (r *aggregatorRole) setParent(role Updatable) { r.parent = role + r.Defaults.Wrap(role.GetDefaults()) + r.Vars.Wrap(role.GetVars()) + r.UserVars.Wrap(role.GetUserVars()) } func (r *aggregatorRole) updateStatus(s task.Status) { diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 5874ff79a..98a8dd8e8 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/repos" "strconv" @@ -215,3 +216,24 @@ func (i *iteratorRole) getConstraints() (cts constraint.Constraints) { } return } + +func (i *iteratorRole) GetDefaults() gera.StringMap { + if i == nil { + return nil + } + return i.template.GetDefaults() +} + +func (i *iteratorRole) GetVars() gera.StringMap { + if i == nil { + return nil + } + return i.template.GetVars() +} + +func (i *iteratorRole) GetUserVars() gera.StringMap { + if i == nil { + return nil + } + return i.template.GetUserVars() +} diff --git a/core/workflow/load.go b/core/workflow/load.go index ae1da12b4..0d7cc8497 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -34,7 +34,7 @@ import ( ) // FIXME: workflowPath should be of type configuration.Path, not string -func Load(cfg configuration.ROSource, workflowPath string, parent Updatable, taskManager *task.Manager) (workflow Role, err error) { +func Load(cfg configuration.ROSource, workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var resolvedWorkflowPath string diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index dbd8571c5..15690074f 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -27,6 +27,7 @@ package workflow import ( "sync" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/pborman/uuid" @@ -34,16 +35,29 @@ import ( type GetEnvIdFunc func() uuid.Array +type GetStringMapFunc func() gera.StringMap + type ParentAdapter struct { mu sync.Mutex getEnvIdFunc GetEnvIdFunc + + getDefaultsFunc GetStringMapFunc + getVarsFunc GetStringMapFunc + getUserVarsFunc GetStringMapFunc + stateSubscriptions map[string]chan task.State statusSubscriptions map[string]chan task.Status } -func NewParentAdapter(getEnvId GetEnvIdFunc) *ParentAdapter { +func NewParentAdapter(getEnvId GetEnvIdFunc, + getDefaults GetStringMapFunc, + getVars GetStringMapFunc, + getUserVars GetStringMapFunc) *ParentAdapter { return &ParentAdapter{ getEnvIdFunc: getEnvId, + getDefaultsFunc: getDefaults, + getVarsFunc: getVars, + getUserVarsFunc: getUserVars, stateSubscriptions: make(map[string]chan task.State), statusSubscriptions: make(map[string]chan task.Status, 0), } @@ -95,7 +109,7 @@ func (p *ParentAdapter) updateStatus(s task.Status) { } } -func (i *ParentAdapter) GetParent() Updatable { +func (p *ParentAdapter) GetParent() Updatable { return nil } @@ -110,4 +124,16 @@ func (*ParentAdapter) GetPath() string { func (*ParentAdapter) CollectOutboundChannels() []channel.Outbound { return make([]channel.Outbound, 0) +} + +func (p *ParentAdapter) GetDefaults() gera.StringMap { + return p.getDefaultsFunc() +} + +func (p *ParentAdapter) GetVars() gera.StringMap { + return p.getVarsFunc() +} + +func (p *ParentAdapter) GetUserVars() gera.StringMap { + return p.getUserVarsFunc() } \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index 30c6cb86b..375bfa4f0 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -29,6 +29,7 @@ package workflow import ( + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" @@ -39,6 +40,7 @@ import ( type Role interface { copyable + VarNode GetParent() Updatable GetParentRole() Role GetRoles() []Role @@ -56,6 +58,7 @@ type Role interface { } type Updatable interface { + VarNode GetParent() Updatable updateStatus(s task.Status) updateState(s task.State) //string? @@ -64,6 +67,12 @@ type Updatable interface { CollectOutboundChannels() []channel.Outbound } +type VarNode interface { + GetDefaults() gera.StringMap + GetVars() gera.StringMap + GetUserVars() gera.StringMap +} + type copyable interface { copy() copyable } diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 3bc8deb12..7435dfa80 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -30,6 +30,7 @@ import ( "fmt" "text/template" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" "github.com/jinzhu/copier" @@ -51,11 +52,14 @@ const( type roleBase struct { Name string `yaml:"name"` parent Updatable - Vars task.VarMap `yaml:"vars,omitempty"` Connect []channel.Outbound `yaml:"connect,omitempty"` Constraints constraint.Constraints `yaml:"constraints,omitempty"` status SafeStatus state SafeState + + Defaults gera.StringMap `yaml:"defaults"` + Vars gera.StringMap `yaml:"vars"` + UserVars gera.StringMap `yaml:"-"` } func (r *roleBase) CollectOutboundChannels() (channels []channel.Outbound) { @@ -78,6 +82,9 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) // recurse back to this function forever type _roleBase roleBase role := _roleBase{ + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), status: SafeStatus{status:task.INACTIVE}, state: SafeState{state:task.STANDBY}, } @@ -146,14 +153,24 @@ func (r *roleBase) copy() copyable { rCopy := roleBase{ Name: r.Name, parent: r.parent, - Vars: make(task.VarMap), + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, state: r.state, } - err := copier.Copy(&rCopy.Vars, &r.Vars) + err := copier.Copy(&rCopy.Defaults, &r.Defaults) + if err != nil { + log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") + } + err = copier.Copy(&rCopy.Vars, &r.Vars) + if err != nil { + log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") + } + err = copier.Copy(&rCopy.UserVars, &r.UserVars) if err != nil { log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") } @@ -261,4 +278,25 @@ func (r *roleBase) getConstraints() (cts constraint.Constraints) { } return -} \ No newline at end of file +} + +func (r *roleBase) GetDefaults() gera.StringMap { + if r == nil { + return nil + } + return r.Defaults +} + +func (r *roleBase) GetVars() gera.StringMap { + if r == nil { + return nil + } + return r.Vars +} + +func (r *roleBase) GetUserVars() gera.StringMap { + if r == nil { + return nil + } + return r.UserVars +} diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 0a2a940cb..eeabd1e6a 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -196,8 +196,7 @@ func (*taskRole) GetRoles() []Role { func (t *taskRole) setParent(role Updatable) { t.parent = role -} - -func (t *taskRole) GetVars() task.VarMap { - panic("niy") + t.Defaults.Wrap(role.GetDefaults()) + t.Vars.Wrap(role.GetVars()) + t.UserVars.Wrap(role.GetUserVars()) } \ No newline at end of file From 83a56b1e859b93e7bdc110af6514a8c9dc4b28a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Feb 2020 18:04:41 +0100 Subject: [PATCH 0114/2352] [coconut] Print variables in coconut env show --- coconut/control/control.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index a9792a648..c0c076d68 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -191,6 +191,22 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } +func stringMapToString(stringMap map[string]string, indent string) string { + if len(stringMap) == 0 { + return "" + } + accumulator := make([]string, len(stringMap)) + i := 0 + for k, v := range stringMap { + value := v + if len(v) == 0 { + value = "" + } + accumulator[i] = indent + k + ": " + value + i++ + } + return strings.Join(accumulator, "\n") +} func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) != 1 { @@ -217,10 +233,25 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com tasks := env.GetTasks() rnString := formatRunNumber(env.GetCurrentRunNumber()) + var ( + defaultsStr = stringMapToString(env.Defaults, "\t") + varsStr = stringMapToString(env.Vars, "\t") + userVarsStr = stringMapToString(env.UserVars, "\t") + ) + _, _ = fmt.Fprintf(o, "environment id: %s\n", env.GetId()) _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) + if len(defaultsStr) != 0 { + _, _ = fmt.Fprintf(o, "global defaults:\n%s\n", defaultsStr) + } + if len(varsStr) != 0 { + _, _ = fmt.Fprintf(o, "global variables:\n%s\n", varsStr) + } + if len(userVarsStr) != 0 { + _, _ = fmt.Fprintf(o, "user-provided variables:\n%s\n", userVarsStr) + } if printTasks { fmt.Fprintln(o, "") From b2da96b2946bf6ee6d804fb9d1fe92fda4e47acb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Feb 2020 14:20:06 +0100 Subject: [PATCH 0115/2352] [build] Make "make generate" independent from $PATH and $GOPATH --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c512e98a7..037625520 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,11 @@ SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/p # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product LDFLAGS=-ldflags "$(PROD).VERSION_MAJOR=$(VERSION_MAJOR) $(PROD).VERSION_MINOR=$(VERSION_MINOR) $(PROD).VERSION_PATCH=$(VERSION_PATCH) $(PROD).BUILD=$(BUILD)" -HAS_GOGOPROTO := $(shell command -v protoc-gen-gofast 2> /dev/null) + +# We expect to find the gogo protobuf executables in $GOPATH/bin +GOPATH := $(shell go env GOPATH) +GOGOPATH=$(GOPATH)/bin/protoc-gen-gofast +HAS_GOGOPROTO := $(shell command -v $(GOGOPATH) 2> /dev/null) GO_GET_U1 := $(addprefix github.com/gogo/protobuf/, proto protoc-gen-gofast protoc-gen-gogofast protoc-gen-gogofaster protoc-gen-gogoslick gogoproto) GO_GET_U2 := $(addprefix github.com/golang/protobuf/, proto protoc-gen-go) @@ -93,7 +97,7 @@ ifndef HAS_GOGOPROTO endif @for gendir in $(GENERATE_DIRS); do \ echo -e "\e[1;33mgo generate\e[0m $$gendir"; \ - go generate $(VERBOSE_$(V)) $$gendir; \ + PATH="$(GOPATH)/bin:$$PATH" go generate $(VERBOSE_$(V)) $$gendir; \ done test: From 737977c34d53727077b80a9f1ee23efed7fa839c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Feb 2020 17:23:12 +0100 Subject: [PATCH 0116/2352] [build] Improve Makefile output --- Makefile | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 037625520..37cee4ca5 100644 --- a/Makefile +++ b/Makefile @@ -31,20 +31,21 @@ ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) HOST_GOOS=$(shell go env GOOS) HOST_GOARCH=$(shell go env GOARCH) CGO_LDFLAGS= +BUILD_FLAGS=$(BUILD_ENV_FLAGS) ifdef WITH_LIBINFOLOGGER CGO_LDFLAGS=CGO_LDFLAGS="$(ROOT_DIR)/vendor/infoLoggerForGo/infoLoggerForGo.a -static-libstdc++ -static-libgcc" -endif BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) +endif REPOPATH = github.com/AliceO2Group/Control VERBOSE_1 := -v VERBOSE_2 := -v -x WHAT := o2control-core o2control-executor coconut peanut -WHAT_o2control-core_BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) -WHAT_o2control-executor_BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) -WHAT_coconut_BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) -WHAT_peanut_BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) +WHAT_o2control-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_o2control-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) @@ -81,13 +82,13 @@ install: $(INSTALL_WHAT) $(WHAT): # @echo -e "WHAT_$@_BUILD_FLAGS $(WHAT_$@_BUILD_FLAGS)" - @echo -e "\e[1;33m$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor\e[0m ./cmd/$@ \e[1;33m==>\e[0m \e[1;34m./bin/$@\e[0m" + @echo -e "\e[1;33mgo build -mod=vendor\e[0m ./cmd/$@ \e[1;33m==>\e[0m \e[1;34m./bin/$@\e[0m" # @echo ${PWD} @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ $(INSTALL_WHAT): # @echo -e "WHAT_$(@:install_%=%)_BUILD_FLAGS $(WHAT_$(@:install_%=%)_BUILD_FLAGS)" - @echo -e "\e[1;33m$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor\e[0m ./cmd/$(@:install_%=%) \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$(@:install_%=%)\e[0m" + @echo -e "\e[1;33mgo install -mod=vendor\e[0m ./cmd/$(@:install_%=%) \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$(@:install_%=%)\e[0m" # @echo ${PWD} @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) From 0d9ac43eee47ed8cec2e5be9fbb4ea5cb534ab78 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Feb 2020 17:33:07 +0100 Subject: [PATCH 0117/2352] [core] Add properties to TaskInfo in protofile --- coconut/protos/o2control.pb.go | 510 ++++++++++++++++++++++----------- core/protos/o2control.pb.go | 510 ++++++++++++++++++++++----------- core/protos/o2control.proto | 1 + 3 files changed, 675 insertions(+), 346 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 7698ce61a..6cd144ea3 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2224,16 +2224,17 @@ func (m *ChannelInfo) GetTarget() string { } type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TaskInfo) Reset() { *m = TaskInfo{} } @@ -2318,6 +2319,13 @@ func (m *TaskInfo) GetEnvId() string { return "" } +func (m *TaskInfo) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + type CleanupTasksRequest struct { TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3507,6 +3515,7 @@ func init() { proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") @@ -3536,169 +3545,170 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2581 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0x59, - 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x4e, 0xbc, 0x6d, 0x92, 0x5e, 0xaa, - 0x6e, 0xda, 0x5d, 0x5c, 0x9a, 0x5d, 0xb1, 0xa5, 0xbb, 0xdd, 0x92, 0x0f, 0xd7, 0x0d, 0x34, 0x71, - 0x99, 0xb8, 0x2d, 0x54, 0x42, 0x65, 0x62, 0x5f, 0xc7, 0xde, 0x8c, 0x67, 0xdc, 0x99, 0xb1, 0xdb, - 0x3c, 0xf0, 0xc6, 0x1b, 0x42, 0x08, 0xf1, 0xc2, 0x2b, 0x42, 0xfc, 0x07, 0x1e, 0x90, 0x78, 0x45, - 0x08, 0x04, 0x3f, 0x01, 0x15, 0x89, 0x27, 0x7e, 0x04, 0xba, 0x5f, 0x33, 0x77, 0xc6, 0x33, 0x4e, - 0x0a, 0xe2, 0x85, 0xb7, 0x39, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0x5f, 0xf7, 0x9c, 0x73, 0x6d, 0x58, - 0x19, 0xba, 0x8e, 0xef, 0x78, 0x77, 0x9c, 0xad, 0xb6, 0x63, 0xfb, 0xae, 0x63, 0xd5, 0x18, 0x02, - 0x15, 0x03, 0x04, 0x5e, 0x81, 0xe5, 0xfa, 0x98, 0xd8, 0xfe, 0xab, 0x03, 0xe2, 0x39, 0xde, 0x63, - 0x62, 0xba, 0xfe, 0x31, 0x31, 0x7d, 0xbc, 0x00, 0xf3, 0x47, 0xbe, 0xe9, 0x8f, 0x3c, 0x83, 0xbc, - 0x1e, 0x11, 0xcf, 0xc7, 0xc7, 0x50, 0x92, 0x88, 0xa1, 0x75, 0x86, 0x96, 0x21, 0xe7, 0xf9, 0xa6, - 0x4f, 0x74, 0x6d, 0x43, 0xdb, 0x2c, 0x1a, 0x1c, 0x40, 0x0f, 0x60, 0xde, 0x63, 0x44, 0xcf, 0x86, - 0x1d, 0xd3, 0x27, 0x9e, 0x9e, 0xd9, 0x98, 0xdd, 0x2c, 0x6d, 0x5d, 0xa9, 0x85, 0x27, 0x38, 0x52, - 0xd6, 0x8d, 0x28, 0x35, 0xfe, 0x8b, 0x06, 0x73, 0xea, 0x3a, 0xfa, 0x04, 0x72, 0x16, 0x19, 0x13, - 0x8b, 0xed, 0x52, 0xde, 0xba, 0x96, 0x22, 0xa7, 0xf6, 0x84, 0x12, 0x19, 0x9c, 0x16, 0xed, 0x43, - 0x79, 0x10, 0x51, 0x46, 0xcf, 0x6c, 0x68, 0x9b, 0xa5, 0xad, 0x75, 0x85, 0x3b, 0x49, 0xe7, 0xc7, - 0x33, 0x46, 0x8c, 0x11, 0x7f, 0x0a, 0x39, 0x26, 0x1a, 0x15, 0x21, 0xb7, 0x57, 0xdf, 0x79, 0xd6, - 0xa8, 0xcc, 0xa0, 0x02, 0x64, 0xf7, 0x0f, 0x1f, 0x35, 0x2b, 0x1a, 0x2a, 0x41, 0xfe, 0xc5, 0xb6, - 0x71, 0xb8, 0x7f, 0xd8, 0xa8, 0x64, 0x28, 0x45, 0xdd, 0x30, 0x9a, 0x46, 0x65, 0x76, 0x27, 0x0f, - 0x39, 0x26, 0x1f, 0xaf, 0xc2, 0x95, 0x06, 0xf1, 0x1f, 0xb9, 0xe6, 0x80, 0xbc, 0x71, 0xdc, 0xd3, - 0x7d, 0xbb, 0xeb, 0x48, 0x73, 0xfe, 0x46, 0x83, 0xfc, 0x73, 0xe2, 0x7a, 0x7d, 0xc7, 0xa6, 0xb6, - 0x1c, 0x98, 0x5f, 0x39, 0x2e, 0xd3, 0x32, 0x67, 0x70, 0x80, 0x61, 0xfb, 0xb6, 0xe3, 0xb2, 0xd3, - 0x53, 0x2c, 0x05, 0x28, 0x76, 0x68, 0xfa, 0xed, 0x9e, 0x3e, 0xcb, 0xb1, 0x0c, 0xa0, 0xd8, 0xe3, - 0x51, 0xdf, 0xea, 0xe8, 0x59, 0xee, 0x0d, 0x06, 0xa0, 0x0d, 0x28, 0x0d, 0x5d, 0xa7, 0x33, 0x6a, - 0xfb, 0x87, 0xe6, 0x80, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x1a, 0xc0, 0x98, 0x1f, 0xe2, 0xc8, - 0x77, 0xf5, 0x4b, 0x8c, 0x40, 0xc1, 0xe0, 0x9f, 0x67, 0xe0, 0xf2, 0xa4, 0x06, 0xd4, 0xff, 0x1b, - 0x50, 0xea, 0x06, 0xd8, 0x8e, 0x88, 0x02, 0x15, 0x85, 0x3e, 0x86, 0x45, 0x62, 0x8f, 0xfb, 0xae, - 0x63, 0x0f, 0x88, 0xed, 0x7b, 0xbb, 0xce, 0xc8, 0xf6, 0x85, 0x2e, 0x93, 0x0b, 0xf4, 0x24, 0xbe, - 0xe9, 0x9d, 0x0a, 0x32, 0xae, 0x9c, 0x82, 0x09, 0xe3, 0x2d, 0xab, 0xc6, 0xdb, 0x1a, 0x40, 0xcf, - 0xf1, 0xa4, 0xf0, 0x1c, 0xe7, 0x0a, 0x31, 0x08, 0xc3, 0x5c, 0xdf, 0xf6, 0x7c, 0xd3, 0x6e, 0x13, - 0x66, 0x02, 0xae, 0x61, 0x04, 0x87, 0x3e, 0x86, 0xbc, 0xd0, 0x58, 0xcf, 0xb3, 0x38, 0x41, 0x4a, - 0x9c, 0x08, 0x17, 0x19, 0x92, 0x04, 0xdf, 0x82, 0x85, 0x16, 0x31, 0xdd, 0x8e, 0xf3, 0xc6, 0x16, - 0xae, 0x44, 0x2b, 0x70, 0xc9, 0x25, 0xa6, 0xe7, 0xd8, 0xc2, 0x0a, 0x02, 0xa2, 0x29, 0x14, 0x92, - 0x0e, 0xad, 0x33, 0xac, 0xc3, 0x4a, 0x83, 0xf8, 0x75, 0x45, 0x77, 0x19, 0x0d, 0x6f, 0x61, 0x79, - 0x62, 0xe5, 0x62, 0x56, 0xfe, 0x12, 0xe6, 0x54, 0x63, 0x8a, 0x84, 0xab, 0xaa, 0xa1, 0x1e, 0x2e, - 0x33, 0xf7, 0x45, 0xe8, 0xf1, 0x9f, 0xb2, 0xb0, 0x10, 0xa3, 0x40, 0x65, 0xc8, 0xf4, 0xe5, 0x66, - 0x99, 0x3e, 0x8b, 0xa3, 0xb6, 0x4b, 0x4c, 0x9f, 0x74, 0x5e, 0xf4, 0x88, 0xcd, 0x7c, 0x58, 0x34, - 0x54, 0x54, 0xe8, 0x9d, 0x59, 0xd5, 0x3b, 0x35, 0xc8, 0x31, 0x0f, 0xea, 0x59, 0x76, 0x28, 0x5d, - 0xcd, 0xde, 0x9e, 0xe3, 0xfa, 0x2d, 0xd3, 0xe3, 0x11, 0xc5, 0xc9, 0x50, 0x15, 0x0a, 0xae, 0xe3, - 0xf8, 0x86, 0x63, 0xc9, 0x60, 0x0d, 0x60, 0x74, 0x1b, 0x2a, 0xed, 0x91, 0xeb, 0x12, 0xdb, 0x37, - 0x46, 0xf6, 0xe1, 0x68, 0x70, 0x4c, 0x78, 0xbc, 0xce, 0x1b, 0x13, 0x78, 0xb4, 0x07, 0x85, 0x0e, - 0xe9, 0x9a, 0x23, 0xcb, 0xf7, 0xf4, 0x3c, 0xdb, 0x7a, 0x33, 0xdd, 0x1e, 0xb5, 0x3d, 0x41, 0x5a, - 0xb7, 0x7d, 0xf7, 0xcc, 0x08, 0x38, 0xd1, 0x3d, 0xc8, 0x8e, 0x4d, 0xd7, 0xd3, 0x0b, 0x4c, 0xc2, - 0x8d, 0x29, 0x12, 0x9e, 0x9b, 0xae, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x47, 0x5c, 0x8a, 0xd6, - 0x8b, 0xe7, 0xee, 0xff, 0x4c, 0x90, 0x8a, 0xfd, 0x25, 0x67, 0xf5, 0x73, 0x98, 0x8f, 0x1c, 0x0d, - 0x55, 0x60, 0xf6, 0x94, 0x9c, 0x09, 0xbf, 0xd0, 0x4f, 0x6a, 0xf6, 0xb1, 0x69, 0x8d, 0x88, 0x70, - 0x09, 0x07, 0xee, 0x67, 0xee, 0x69, 0xd5, 0xcf, 0xa0, 0x18, 0xc8, 0x7c, 0x2f, 0xc6, 0xcf, 0x61, - 0x3e, 0x72, 0xa0, 0xf7, 0x61, 0xc6, 0xbf, 0xd7, 0xe0, 0xf2, 0x21, 0x79, 0xa3, 0x68, 0x28, 0x73, - 0xe4, 0x36, 0x54, 0x68, 0xc0, 0x76, 0x2d, 0xe7, 0x4d, 0x8b, 0x0c, 0x86, 0x56, 0x58, 0x39, 0x26, - 0xf0, 0xe8, 0x4b, 0x61, 0x78, 0x1e, 0xca, 0xb7, 0x15, 0xd3, 0x25, 0xca, 0x8e, 0x9b, 0xff, 0x3f, - 0xd6, 0x1d, 0x1f, 0xc1, 0x52, 0x7c, 0x07, 0x9a, 0x84, 0x5f, 0x40, 0x49, 0x49, 0x19, 0x26, 0x6a, - 0x7a, 0x86, 0xa9, 0xe4, 0xf8, 0x43, 0x76, 0x83, 0x26, 0x98, 0x24, 0x96, 0x65, 0xf8, 0x27, 0x1a, - 0x2c, 0xc5, 0x29, 0xff, 0xeb, 0xed, 0xd1, 0x1d, 0x28, 0x48, 0x03, 0x8b, 0x32, 0xb8, 0xa4, 0xb0, - 0xd2, 0xd4, 0x62, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, 0xab, 0xbb, 0x7c, 0xf9, 0xfc, 0x43, 0xa3, - 0x87, 0x90, 0xf5, 0xcf, 0x86, 0xdc, 0x96, 0xe5, 0xad, 0x8f, 0x14, 0xd1, 0xa9, 0x32, 0x6a, 0xcd, - 0x21, 0x65, 0x31, 0x18, 0x23, 0x36, 0xe1, 0x12, 0x87, 0x69, 0x5d, 0x3d, 0x6c, 0x36, 0x9f, 0x56, - 0x66, 0x10, 0x82, 0xf2, 0x51, 0x6b, 0xdb, 0x68, 0xbd, 0xda, 0xde, 0x6d, 0xed, 0x3f, 0xdf, 0x6f, - 0xfd, 0xa0, 0xa2, 0xa1, 0x45, 0x98, 0x3f, 0x6a, 0x35, 0x9f, 0x86, 0xa8, 0x0c, 0x9a, 0x87, 0xe2, - 0x6e, 0xf3, 0xf0, 0xd1, 0x7e, 0xe3, 0x99, 0x51, 0xaf, 0xcc, 0xd2, 0x02, 0x6c, 0xd4, 0x8f, 0xea, - 0xad, 0x4a, 0x16, 0xcd, 0x41, 0xa1, 0xd1, 0x7c, 0xc5, 0xcb, 0x71, 0x0e, 0x9f, 0xc2, 0x95, 0xa4, - 0xc3, 0x50, 0xdb, 0xc6, 0xd5, 0x09, 0xee, 0xb1, 0x8c, 0x7a, 0x8f, 0x25, 0xdd, 0x3d, 0xb3, 0xc9, - 0x77, 0x0f, 0xfe, 0xa5, 0x06, 0xfa, 0x81, 0xd3, 0xe9, 0x77, 0xcf, 0x2e, 0x64, 0x3d, 0x70, 0x86, - 0xc4, 0x35, 0xfd, 0xbe, 0x63, 0xcb, 0x78, 0x5f, 0x4f, 0xf6, 0x6c, 0x53, 0xd2, 0x19, 0x0a, 0x0b, - 0xba, 0x09, 0x65, 0x97, 0xb4, 0x1d, 0xbb, 0xdb, 0x3f, 0x19, 0xb9, 0x64, 0xdb, 0xb2, 0xd8, 0xb9, - 0x0a, 0x46, 0x0c, 0x8b, 0x7f, 0xad, 0xc1, 0x72, 0x92, 0x30, 0x74, 0x5f, 0xf8, 0x8f, 0xf7, 0x57, - 0x37, 0xcf, 0xd9, 0x3b, 0xe2, 0x3a, 0x7e, 0x5d, 0x5b, 0xbc, 0xb0, 0x66, 0xe4, 0x75, 0xcd, 0x61, - 0x7c, 0x37, 0xc1, 0xad, 0x0b, 0x50, 0x32, 0xea, 0x07, 0xcd, 0xe7, 0xf5, 0x57, 0x46, 0xf3, 0x09, - 0xf5, 0xd8, 0x1c, 0x14, 0xb6, 0xf7, 0xf6, 0x38, 0x94, 0xc5, 0x3f, 0xd5, 0x60, 0x25, 0xc1, 0x72, - 0xd4, 0x4d, 0xdf, 0x85, 0x4a, 0xd7, 0xec, 0x5b, 0xa4, 0xd3, 0x0c, 0xad, 0xa5, 0x5d, 0xcc, 0x5a, - 0x13, 0x8c, 0xc2, 0x09, 0x99, 0x49, 0x9f, 0xab, 0xb5, 0x0b, 0xef, 0xc3, 0xea, 0x1e, 0xf1, 0x7c, - 0xd7, 0xb9, 0x88, 0x1f, 0xaf, 0x42, 0xf1, 0x94, 0x90, 0x61, 0x8b, 0x15, 0xbb, 0x0c, 0xf3, 0x40, - 0x88, 0xc0, 0x04, 0xae, 0x24, 0x89, 0xa2, 0x8a, 0x7d, 0x07, 0x16, 0xdb, 0x16, 0x31, 0xed, 0x11, - 0x27, 0x65, 0x48, 0x91, 0xe1, 0x57, 0xd5, 0x5c, 0x8a, 0xd3, 0x18, 0x93, 0x6c, 0xf8, 0xcf, 0x1a, - 0xac, 0x1f, 0x45, 0xee, 0x8f, 0xa7, 0x2e, 0x0d, 0x15, 0xbf, 0x4f, 0xbc, 0xb4, 0x83, 0xbf, 0x04, - 0x18, 0x06, 0x44, 0x22, 0x00, 0xef, 0xab, 0x65, 0x7a, 0xba, 0xbc, 0x5a, 0x88, 0xe1, 0x17, 0xb0, - 0x22, 0xad, 0xfa, 0x00, 0x16, 0x62, 0xcb, 0xef, 0x75, 0x19, 0xaf, 0xc3, 0xb5, 0xf4, 0xdd, 0xa9, - 0xbe, 0x1e, 0xac, 0x37, 0xde, 0x53, 0x5d, 0x1d, 0xf2, 0xaf, 0x47, 0xc4, 0x95, 0xba, 0x16, 0x0d, - 0x09, 0xd2, 0x44, 0x22, 0x6f, 0xdb, 0xd6, 0xa8, 0x43, 0x1a, 0x96, 0x73, 0x6c, 0x5a, 0x9e, 0x4c, - 0xa4, 0x28, 0x16, 0xff, 0x4e, 0x83, 0x6b, 0x8d, 0x69, 0xc7, 0x42, 0xdf, 0x8f, 0x98, 0x94, 0x47, - 0xe9, 0x3d, 0xc5, 0xa4, 0x53, 0xb9, 0xff, 0x97, 0x06, 0xfd, 0xa7, 0x06, 0xf3, 0x91, 0xb6, 0x0b, - 0x21, 0xc8, 0xda, 0x34, 0x79, 0x39, 0x3b, 0xfb, 0xa6, 0xcd, 0xac, 0xe5, 0xb4, 0x4f, 0x49, 0x47, - 0xc4, 0xb1, 0x80, 0x28, 0x9e, 0x36, 0x69, 0xfb, 0x1d, 0x91, 0x26, 0x02, 0xa2, 0x78, 0x3e, 0xc3, - 0x89, 0xc6, 0x5c, 0x40, 0x61, 0x56, 0xe5, 0xd4, 0x9b, 0xf4, 0x2a, 0x14, 0xdb, 0x96, 0xe9, 0x79, - 0x4a, 0x33, 0x1e, 0x22, 0x50, 0x1d, 0xca, 0x1d, 0x32, 0xb4, 0x9c, 0x33, 0x59, 0xca, 0x44, 0x43, - 0xae, 0x8e, 0x7d, 0xf4, 0xf0, 0x7b, 0x11, 0x22, 0x23, 0xc6, 0x44, 0x0b, 0x29, 0x9a, 0x24, 0xa3, - 0xd7, 0x15, 0x9d, 0x0c, 0x14, 0x8d, 0x03, 0x98, 0x06, 0x86, 0x79, 0x42, 0x09, 0xe5, 0xc5, 0x20, - 0x41, 0xba, 0xe2, 0x74, 0xbb, 0xc4, 0x0d, 0x14, 0x97, 0x20, 0x9d, 0x3d, 0xc8, 0x5b, 0xd2, 0x1e, - 0xf9, 0x0e, 0x5d, 0xe4, 0xda, 0x2b, 0x18, 0xbc, 0x08, 0x0b, 0x0d, 0xe2, 0x8b, 0x04, 0xe5, 0x6d, - 0xfe, 0x43, 0x98, 0x0f, 0x51, 0x34, 0x58, 0x82, 0x0e, 0x59, 0xbb, 0x50, 0x87, 0x8c, 0x37, 0xa1, - 0x2c, 0x04, 0x28, 0xc3, 0x87, 0xf0, 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x73, 0x01, 0x25, 0xdd, - 0xe9, 0x43, 0xc8, 0xd2, 0x15, 0x71, 0xb9, 0x2c, 0xc5, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x0e, - 0xf3, 0x14, 0xb3, 0x4b, 0xbd, 0x92, 0x1a, 0x25, 0x74, 0x22, 0xe0, 0xec, 0x07, 0x4e, 0x87, 0x04, - 0x13, 0x41, 0x88, 0xc2, 0x3f, 0x86, 0xd2, 0xae, 0x33, 0x18, 0x98, 0x76, 0x87, 0x09, 0xa9, 0xc0, - 0x2c, 0xb1, 0xc7, 0x4c, 0xcd, 0xa2, 0x41, 0x3f, 0x59, 0x80, 0xf4, 0x88, 0x65, 0x89, 0x38, 0xe3, - 0x40, 0x18, 0xbe, 0xb3, 0x4a, 0xf8, 0xd2, 0xb0, 0x31, 0xdd, 0x93, 0x11, 0x9f, 0x70, 0xb2, 0x4c, - 0x46, 0x88, 0xa0, 0x07, 0xa4, 0x4d, 0xb3, 0x88, 0x34, 0xf6, 0x8d, 0x0f, 0xa0, 0xb4, 0xdb, 0x33, - 0x6d, 0x9b, 0x58, 0xa9, 0x3a, 0x20, 0xa5, 0x75, 0x29, 0x8a, 0x92, 0xc6, 0xac, 0xe9, 0x9e, 0x10, - 0x3f, 0x8c, 0x72, 0x0a, 0xe1, 0x7f, 0x65, 0xa0, 0x10, 0xa4, 0xcd, 0x37, 0xa1, 0xe8, 0x51, 0xe7, - 0xb0, 0x08, 0xe5, 0xf6, 0x4c, 0x77, 0x5c, 0x48, 0x4a, 0xf9, 0xda, 0xd2, 0xaa, 0xa2, 0x17, 0xd3, - 0x63, 0x7e, 0x08, 0xac, 0x6e, 0x84, 0xa4, 0xe8, 0xdb, 0xb0, 0xd0, 0xb7, 0x8f, 0x9d, 0x91, 0xdd, - 0x11, 0x2a, 0xd1, 0xcb, 0x89, 0x86, 0xcb, 0x8a, 0x5a, 0x22, 0x42, 0x6d, 0x8d, 0x38, 0x39, 0xda, - 0x81, 0x8a, 0x33, 0xf2, 0xa3, 0x22, 0xb2, 0x53, 0x45, 0x4c, 0xd0, 0xa3, 0x7b, 0xd4, 0xe5, 0x81, - 0x43, 0x99, 0xb1, 0x63, 0xec, 0xe1, 0xaa, 0xa1, 0x92, 0xd2, 0xc4, 0xa3, 0x91, 0xf5, 0xd4, 0xf4, - 0x7b, 0x22, 0xe7, 0x03, 0x98, 0xfa, 0x9b, 0xd8, 0xe3, 0xfd, 0x0e, 0xcb, 0xf4, 0xa2, 0xc1, 0x01, - 0x7c, 0x07, 0x96, 0xa2, 0x25, 0x8f, 0xc7, 0xba, 0x0e, 0x79, 0x1e, 0xdd, 0x9e, 0x08, 0x24, 0x09, - 0xe2, 0x9f, 0x69, 0xb0, 0x38, 0x51, 0x24, 0xd1, 0x7d, 0x28, 0x9d, 0xf6, 0x2d, 0x8b, 0x74, 0x5a, - 0x17, 0xca, 0x31, 0x95, 0x18, 0x7d, 0x01, 0x73, 0xee, 0xc8, 0xb6, 0xfb, 0xf6, 0x89, 0xac, 0xea, - 0xd3, 0x99, 0x23, 0xd4, 0x78, 0x97, 0xe5, 0x3e, 0xed, 0xae, 0x83, 0xc3, 0x07, 0x9a, 0x6a, 0x8a, - 0xa6, 0xd4, 0x36, 0x43, 0xd3, 0xef, 0x1d, 0x0d, 0x49, 0x5b, 0xf6, 0x50, 0x12, 0xc6, 0xbf, 0xc8, - 0x42, 0x41, 0x36, 0xe8, 0x69, 0x77, 0xb5, 0xb8, 0x7b, 0x33, 0xc9, 0x77, 0x6f, 0x64, 0x1a, 0xaf, - 0x42, 0xa1, 0x3b, 0xb2, 0x2c, 0xe6, 0x06, 0x7e, 0x5b, 0x05, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, - 0xe8, 0x16, 0xe4, 0x68, 0x53, 0xe7, 0xe9, 0x97, 0x98, 0x01, 0x12, 0x87, 0x07, 0x4e, 0x81, 0x1e, - 0x4c, 0x8c, 0xdd, 0xd7, 0x13, 0xa8, 0x53, 0xe7, 0xed, 0xbb, 0x91, 0x79, 0xfb, 0x5a, 0x12, 0x6b, - 0x7c, 0xd0, 0x7e, 0x30, 0x31, 0x68, 0x27, 0xee, 0xf8, 0x7f, 0x34, 0x61, 0xdf, 0x67, 0x15, 0x44, - 0x04, 0x16, 0x8d, 0xf1, 0xc0, 0x3f, 0xda, 0x79, 0xfe, 0xc1, 0xbf, 0xd5, 0xe0, 0x83, 0x06, 0xf1, - 0x5f, 0xc4, 0xe6, 0xed, 0x20, 0x42, 0x37, 0xa0, 0xe4, 0x92, 0xa1, 0xf3, 0xd4, 0xf4, 0x7d, 0xe2, - 0xca, 0xc7, 0x2c, 0x15, 0x85, 0x36, 0x61, 0xc1, 0x25, 0xe3, 0xbe, 0xd7, 0x77, 0x6c, 0x49, 0xc5, - 0x4f, 0x18, 0x47, 0x53, 0x59, 0xa6, 0x65, 0xed, 0xb8, 0xa6, 0xdd, 0xee, 0x11, 0xd9, 0x4c, 0xa9, - 0x28, 0x56, 0x72, 0x2d, 0xab, 0x65, 0x9e, 0xf0, 0xce, 0xa1, 0x60, 0x48, 0x10, 0x1f, 0xc3, 0x72, - 0xfc, 0x8c, 0x32, 0x05, 0xe8, 0x61, 0x64, 0x0a, 0xd0, 0x6f, 0x76, 0xb7, 0xc8, 0xf7, 0x04, 0x91, - 0x3f, 0x12, 0x66, 0xf3, 0x89, 0x38, 0x96, 0xc8, 0x84, 0x00, 0xc6, 0x5f, 0xc1, 0x6a, 0xb2, 0x29, - 0xa8, 0x4d, 0x0f, 0x60, 0x31, 0xfe, 0x28, 0x91, 0x34, 0x6f, 0x24, 0x1d, 0xd2, 0x98, 0xe4, 0xc4, - 0x08, 0x2a, 0x4f, 0xfa, 0x1e, 0xed, 0xf8, 0x1d, 0xe5, 0x35, 0xbd, 0x40, 0xe1, 0xd4, 0xd4, 0xd6, - 0x21, 0x2f, 0x12, 0x43, 0xd4, 0x47, 0x09, 0x52, 0x1f, 0x88, 0x4f, 0x23, 0xaa, 0x5c, 0x1c, 0x8d, - 0x5f, 0x43, 0x59, 0xd9, 0x57, 0x06, 0x0b, 0x85, 0x92, 0x82, 0x45, 0x9c, 0xc6, 0xe0, 0x14, 0xe8, - 0x53, 0xb8, 0x7c, 0xc2, 0x7a, 0xde, 0xbd, 0xd8, 0x66, 0xdc, 0xca, 0xc9, 0x8b, 0xf8, 0x10, 0xca, - 0xdb, 0x9d, 0x0e, 0x95, 0x25, 0x83, 0x2a, 0x49, 0xb9, 0x04, 0x15, 0x32, 0xc9, 0x2a, 0x18, 0x30, - 0x17, 0xc8, 0xe3, 0xfd, 0x12, 0xb2, 0xc9, 0x9b, 0xf8, 0x91, 0xb8, 0xec, 0x84, 0x15, 0xba, 0x7b, - 0x5f, 0x56, 0xdb, 0xa2, 0xc1, 0xbe, 0xf1, 0x2d, 0x58, 0x34, 0xc8, 0xc0, 0x19, 0x13, 0xf5, 0x98, - 0xcb, 0x90, 0xeb, 0xdb, 0x1d, 0xf2, 0x56, 0x3e, 0xc1, 0x33, 0x00, 0x7f, 0x0b, 0x16, 0x54, 0x52, - 0x7a, 0x82, 0x9b, 0x50, 0x56, 0xf7, 0x09, 0xc2, 0x31, 0x86, 0xc5, 0x1f, 0xc1, 0x92, 0x41, 0xba, - 0x2e, 0xf1, 0x7a, 0xaa, 0xdf, 0x53, 0xf6, 0xf9, 0x3a, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, 0x3e, 0x9d, - 0xfc, 0x01, 0x1b, 0xf4, 0x1a, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, 0xff, 0x1e, - 0x9b, 0xac, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, 0xc2, 0x07, - 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, 0xff, 0x6c, - 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0xef, 0x33, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, 0xf2, 0x1f, - 0x77, 0x90, 0x3e, 0xf1, 0x7b, 0x8f, 0x38, 0x62, 0x75, 0x25, 0x61, 0x85, 0x0e, 0x85, 0x33, 0xdf, - 0xd0, 0xd0, 0x4b, 0xa8, 0xc4, 0x7f, 0xb3, 0x40, 0x38, 0x3a, 0x81, 0x25, 0xfd, 0x24, 0x53, 0xdd, - 0x98, 0x4a, 0xc3, 0xa4, 0xa3, 0x1d, 0x28, 0xc8, 0x37, 0x7d, 0xa4, 0xbe, 0xc1, 0xc5, 0x7e, 0x13, - 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x0b, 0xd6, 0x1c, 0xa8, 0x8f, 0xfd, 0xe8, 0x7a, 0xea, 0x80, - 0x18, 0x68, 0xbc, 0x3e, 0x8d, 0x84, 0x0b, 0x6e, 0x41, 0x39, 0xfa, 0x7e, 0x89, 0x36, 0xce, 0x7b, - 0x3c, 0xad, 0xae, 0x4d, 0xa1, 0x08, 0xa4, 0x46, 0xf7, 0x43, 0x1b, 0xa9, 0x47, 0x49, 0x92, 0x9a, - 0xf0, 0xa6, 0x89, 0x67, 0xd0, 0x8f, 0x00, 0x4d, 0x3e, 0xca, 0xa1, 0x1b, 0x17, 0x79, 0x40, 0xac, - 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x84, 0xc5, 0x89, 0xe7, 0x24, 0xf4, 0x35, 0x85, 0x35, 0xed, - 0x99, 0xae, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xab, 0x4e, 0x44, 0x81, 0xd4, 0xf7, 0xa3, - 0x88, 0x02, 0x29, 0x4f, 0x43, 0x3c, 0xd6, 0xe4, 0xb4, 0x18, 0x89, 0xb5, 0xd8, 0x54, 0x19, 0x89, - 0xb5, 0xc8, 0x78, 0x89, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, 0xae, - 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x59, 0x8a, 0x8b, 0x9a, - 0xfa, 0x6c, 0x15, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, 0x78, - 0xf0, 0x0c, 0xea, 0xb2, 0x5f, 0xcb, 0x26, 0x8a, 0x37, 0xba, 0x19, 0xe5, 0x49, 0x6b, 0x74, 0xaa, - 0x37, 0xce, 0xa5, 0xe3, 0xfb, 0xd4, 0xa1, 0x18, 0x14, 0x50, 0xf4, 0x81, 0xc2, 0x14, 0x2f, 0xe7, - 0xd5, 0xd5, 0xe4, 0xc5, 0xc0, 0x07, 0xa2, 0x88, 0x45, 0x7c, 0x10, 0x2d, 0x94, 0x11, 0x1f, 0xa8, - 0x35, 0x0f, 0xcf, 0xa0, 0xc7, 0x00, 0x61, 0x19, 0x42, 0x57, 0x23, 0x55, 0x3b, 0x56, 0xc8, 0xaa, - 0xd5, 0x94, 0x55, 0x69, 0xfd, 0x39, 0xb5, 0x2a, 0x45, 0xbc, 0x99, 0x50, 0xae, 0xaa, 0x15, 0xf5, - 0x79, 0x95, 0xde, 0xd6, 0x78, 0x06, 0x3d, 0x82, 0x72, 0xb4, 0x58, 0x45, 0xee, 0x83, 0xc4, 0x3a, - 0x96, 0x28, 0xe7, 0x25, 0xe8, 0x69, 0x55, 0x0c, 0xdd, 0x8e, 0x4a, 0x9c, 0x56, 0xea, 0x12, 0x65, - 0x5b, 0xb0, 0x92, 0x5c, 0x8f, 0xd0, 0x66, 0x54, 0x72, 0x7a, 0x15, 0xac, 0xde, 0xbc, 0x00, 0x25, - 0xb3, 0xea, 0xce, 0xbd, 0x3f, 0xbe, 0x5b, 0xd3, 0xfe, 0xf6, 0x6e, 0x4d, 0xfb, 0xfb, 0xbb, 0x35, - 0xed, 0x57, 0xff, 0x58, 0x9b, 0x01, 0xdc, 0xee, 0xd5, 0xda, 0xc4, 0xb5, 0x6b, 0xa6, 0xd5, 0x6f, - 0x93, 0x9a, 0xb3, 0x55, 0x93, 0x92, 0xdc, 0x61, 0xdb, 0x23, 0xee, 0x98, 0xb8, 0x2f, 0x33, 0xc3, - 0xe3, 0xe3, 0x4b, 0xec, 0xff, 0x18, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x80, 0xfc, 0x36, - 0x8a, 0xa9, 0x21, 0x00, 0x00, + // 2598 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, + 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0x6d, 0x93, 0xf4, 0xfe, + 0xaa, 0x6e, 0xda, 0xdd, 0x9f, 0x4b, 0xb3, 0x2b, 0xb6, 0x74, 0xb7, 0x5b, 0xf2, 0xc7, 0x75, 0x03, + 0x4d, 0x5c, 0x26, 0x6e, 0x0b, 0x95, 0x50, 0x99, 0xd8, 0xd7, 0xb1, 0x37, 0xe3, 0x19, 0x77, 0x66, + 0xec, 0x36, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x42, 0xbc, 0xf0, 0x8a, 0x10, 0xdf, 0x81, 0x07, 0x24, + 0x5e, 0x11, 0x02, 0xc1, 0x47, 0x40, 0x45, 0xe2, 0x99, 0x8f, 0x80, 0xee, 0xbf, 0x99, 0x3b, 0xe3, + 0x19, 0x27, 0x05, 0xed, 0x0b, 0x6f, 0x3e, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0xff, 0xee, 0x39, 0xe7, + 0x8e, 0x61, 0x65, 0xe8, 0x3a, 0xbe, 0xe3, 0xdd, 0x71, 0xb6, 0xda, 0x8e, 0xed, 0xbb, 0x8e, 0x55, + 0x63, 0x08, 0x54, 0x0c, 0x10, 0x78, 0x05, 0x96, 0xeb, 0x63, 0x62, 0xfb, 0xaf, 0x0e, 0x88, 0xe7, + 0x78, 0x8f, 0x89, 0xe9, 0xfa, 0xc7, 0xc4, 0xf4, 0xf1, 0x02, 0xcc, 0x1f, 0xf9, 0xa6, 0x3f, 0xf2, + 0x0c, 0xf2, 0x7a, 0x44, 0x3c, 0x1f, 0x1f, 0x43, 0x49, 0x22, 0x86, 0xd6, 0x19, 0x5a, 0x86, 0x9c, + 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x0d, 0x6d, 0xb3, 0x68, 0x70, 0x00, 0x3d, 0x80, 0x79, 0x8f, 0x11, + 0x3d, 0x1b, 0x76, 0x4c, 0x9f, 0x78, 0x7a, 0x66, 0x63, 0x76, 0xb3, 0xb4, 0x75, 0xa5, 0x16, 0x9e, + 0xe0, 0x48, 0x59, 0x37, 0xa2, 0xd4, 0xf8, 0x2f, 0x1a, 0xcc, 0xa9, 0xeb, 0xe8, 0x13, 0xc8, 0x59, + 0x64, 0x4c, 0x2c, 0xb6, 0x4b, 0x79, 0xeb, 0x5a, 0x8a, 0x9c, 0xda, 0x13, 0x4a, 0x64, 0x70, 0x5a, + 0xb4, 0x0f, 0xe5, 0x41, 0x44, 0x19, 0x3d, 0xb3, 0xa1, 0x6d, 0x96, 0xb6, 0xd6, 0x15, 0xee, 0x24, + 0x9d, 0x1f, 0xcf, 0x18, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x5e, 0x7d, + 0xe7, 0x59, 0xa3, 0x32, 0x83, 0x0a, 0x90, 0xdd, 0x3f, 0x7c, 0xd4, 0xac, 0x68, 0xa8, 0x04, 0xf9, + 0x17, 0xdb, 0xc6, 0xe1, 0xfe, 0x61, 0xa3, 0x92, 0xa1, 0x14, 0x75, 0xc3, 0x68, 0x1a, 0x95, 0xd9, + 0x9d, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0a, 0x57, 0x1a, 0xc4, 0x7f, 0xe4, 0x9a, 0x03, 0xf2, 0xc6, + 0x71, 0x4f, 0xf7, 0xed, 0xae, 0x23, 0xcd, 0xf9, 0x1b, 0x0d, 0xf2, 0xcf, 0x89, 0xeb, 0xf5, 0x1d, + 0x9b, 0xda, 0x72, 0x60, 0x7e, 0xe5, 0xb8, 0x4c, 0xcb, 0x9c, 0xc1, 0x01, 0x86, 0xed, 0xdb, 0x8e, + 0xcb, 0x4e, 0x4f, 0xb1, 0x14, 0xa0, 0xd8, 0xa1, 0xe9, 0xb7, 0x7b, 0xfa, 0x2c, 0xc7, 0x32, 0x80, + 0x62, 0x8f, 0x47, 0x7d, 0xab, 0xa3, 0x67, 0xb9, 0x37, 0x18, 0x80, 0x36, 0xa0, 0x34, 0x74, 0x9d, + 0xce, 0xa8, 0xed, 0x1f, 0x9a, 0x03, 0xa2, 0xe7, 0xd8, 0x9a, 0x8a, 0x42, 0x6b, 0x00, 0x63, 0x7e, + 0x88, 0x23, 0xdf, 0xd5, 0x2f, 0x31, 0x02, 0x05, 0x83, 0x7f, 0x9e, 0x81, 0xcb, 0x93, 0x1a, 0x50, + 0xff, 0x6f, 0x40, 0xa9, 0x1b, 0x60, 0x3b, 0x22, 0x0a, 0x54, 0x14, 0xfa, 0x18, 0x16, 0x89, 0x3d, + 0xee, 0xbb, 0x8e, 0x3d, 0x20, 0xb6, 0xef, 0xed, 0x3a, 0x23, 0xdb, 0x17, 0xba, 0x4c, 0x2e, 0xd0, + 0x93, 0xf8, 0xa6, 0x77, 0x2a, 0xc8, 0xb8, 0x72, 0x0a, 0x26, 0x8c, 0xb7, 0xac, 0x1a, 0x6f, 0x6b, + 0x00, 0x3d, 0xc7, 0x93, 0xc2, 0x73, 0x9c, 0x2b, 0xc4, 0x20, 0x0c, 0x73, 0x7d, 0xdb, 0xf3, 0x4d, + 0xbb, 0x4d, 0x98, 0x09, 0xb8, 0x86, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0x42, 0x63, 0x3d, 0xcf, 0xe2, + 0x04, 0x29, 0x71, 0x22, 0x5c, 0x64, 0x48, 0x12, 0x7c, 0x0b, 0x16, 0x5a, 0xc4, 0x74, 0x3b, 0xce, + 0x1b, 0x5b, 0xb8, 0x12, 0xad, 0xc0, 0x25, 0x97, 0x98, 0x9e, 0x63, 0x0b, 0x2b, 0x08, 0x88, 0xa6, + 0x50, 0x48, 0x3a, 0xb4, 0xce, 0xb0, 0x0e, 0x2b, 0x0d, 0xe2, 0xd7, 0x15, 0xdd, 0x65, 0x34, 0xbc, + 0x85, 0xe5, 0x89, 0x95, 0x8b, 0x59, 0xf9, 0x4b, 0x98, 0x53, 0x8d, 0x29, 0x12, 0xae, 0xaa, 0x86, + 0x7a, 0xb8, 0xcc, 0xdc, 0x17, 0xa1, 0xc7, 0x7f, 0xca, 0xc2, 0x42, 0x8c, 0x02, 0x95, 0x21, 0xd3, + 0x97, 0x9b, 0x65, 0xfa, 0x2c, 0x8e, 0xda, 0x2e, 0x31, 0x7d, 0xd2, 0x79, 0xd1, 0x23, 0x36, 0xf3, + 0x61, 0xd1, 0x50, 0x51, 0xa1, 0x77, 0x66, 0x55, 0xef, 0xd4, 0x20, 0xc7, 0x3c, 0xa8, 0x67, 0xd9, + 0xa1, 0x74, 0x35, 0x7b, 0x7b, 0x8e, 0xeb, 0xb7, 0x4c, 0x8f, 0x47, 0x14, 0x27, 0x43, 0x55, 0x28, + 0xb8, 0x8e, 0xe3, 0x1b, 0x8e, 0x25, 0x83, 0x35, 0x80, 0xd1, 0x6d, 0xa8, 0xb4, 0x47, 0xae, 0x4b, + 0x6c, 0xdf, 0x18, 0xd9, 0x87, 0xa3, 0xc1, 0x31, 0xe1, 0xf1, 0x3a, 0x6f, 0x4c, 0xe0, 0xd1, 0x1e, + 0x14, 0x3a, 0xa4, 0x6b, 0x8e, 0x2c, 0xdf, 0xd3, 0xf3, 0x6c, 0xeb, 0xcd, 0x74, 0x7b, 0xd4, 0xf6, + 0x04, 0x69, 0xdd, 0xf6, 0xdd, 0x33, 0x23, 0xe0, 0x44, 0xf7, 0x20, 0x3b, 0x36, 0x5d, 0x4f, 0x2f, + 0x30, 0x09, 0x37, 0xa6, 0x48, 0x78, 0x6e, 0xba, 0x82, 0x9b, 0x71, 0xd0, 0xfd, 0x47, 0x1e, 0x71, + 0x29, 0x5a, 0x2f, 0x9e, 0xbb, 0xff, 0x33, 0x41, 0x2a, 0xf6, 0x97, 0x9c, 0xd5, 0xcf, 0x61, 0x3e, + 0x72, 0x34, 0x54, 0x81, 0xd9, 0x53, 0x72, 0x26, 0xfc, 0x42, 0x7f, 0x52, 0xb3, 0x8f, 0x4d, 0x6b, + 0x44, 0x84, 0x4b, 0x38, 0x70, 0x3f, 0x73, 0x4f, 0xab, 0x7e, 0x06, 0xc5, 0x40, 0xe6, 0x7b, 0x31, + 0x7e, 0x0e, 0xf3, 0x91, 0x03, 0xbd, 0x0f, 0x33, 0xfe, 0xbd, 0x06, 0x97, 0x0f, 0xc9, 0x1b, 0x45, + 0x43, 0x99, 0x23, 0xb7, 0xa1, 0x42, 0x03, 0xb6, 0x6b, 0x39, 0x6f, 0x5a, 0x64, 0x30, 0xb4, 0xc2, + 0xca, 0x31, 0x81, 0x47, 0x5f, 0x0a, 0xc3, 0xf3, 0x50, 0xbe, 0xad, 0x98, 0x2e, 0x51, 0x76, 0xdc, + 0xfc, 0xff, 0xb1, 0xee, 0xf8, 0x08, 0x96, 0xe2, 0x3b, 0xd0, 0x24, 0xfc, 0x02, 0x4a, 0x4a, 0xca, + 0x30, 0x51, 0xd3, 0x33, 0x4c, 0x25, 0xc7, 0x1f, 0xb2, 0x1b, 0x34, 0xc1, 0x24, 0xb1, 0x2c, 0xc3, + 0x3f, 0xd1, 0x60, 0x29, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x40, 0x41, 0x1a, 0x58, 0x94, 0xc1, + 0x25, 0x85, 0x95, 0xa6, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xdd, 0xe5, 0xcb, 0xe7, + 0x1f, 0x1a, 0x3d, 0x84, 0xac, 0x7f, 0x36, 0xe4, 0xb6, 0x2c, 0x6f, 0x7d, 0xa4, 0x88, 0x4e, 0x95, + 0x51, 0x6b, 0x0e, 0x29, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xeb, 0xea, 0x61, 0xb3, + 0xf9, 0xb4, 0x32, 0x83, 0x10, 0x94, 0x8f, 0x5a, 0xdb, 0x46, 0xeb, 0xd5, 0xf6, 0x6e, 0x6b, 0xff, + 0xf9, 0x7e, 0xeb, 0x07, 0x15, 0x0d, 0x2d, 0xc2, 0xfc, 0x51, 0xab, 0xf9, 0x34, 0x44, 0x65, 0xd0, + 0x3c, 0x14, 0x77, 0x9b, 0x87, 0x8f, 0xf6, 0x1b, 0xcf, 0x8c, 0x7a, 0x65, 0x96, 0x16, 0x60, 0xa3, + 0x7e, 0x54, 0x6f, 0x55, 0xb2, 0x68, 0x0e, 0x0a, 0x8d, 0xe6, 0x2b, 0x5e, 0x8e, 0x73, 0xf8, 0x14, + 0xae, 0x24, 0x1d, 0x86, 0xda, 0x36, 0xae, 0x4e, 0x70, 0x8f, 0x65, 0xd4, 0x7b, 0x2c, 0xe9, 0xee, + 0x99, 0x4d, 0xbe, 0x7b, 0xf0, 0x2f, 0x35, 0xd0, 0x0f, 0x9c, 0x4e, 0xbf, 0x7b, 0x76, 0x21, 0xeb, + 0x81, 0x33, 0x24, 0xae, 0xe9, 0xf7, 0x1d, 0x5b, 0xc6, 0xfb, 0x7a, 0xb2, 0x67, 0x9b, 0x92, 0xce, + 0x50, 0x58, 0xd0, 0x4d, 0x28, 0xbb, 0xa4, 0xed, 0xd8, 0xdd, 0xfe, 0xc9, 0xc8, 0x25, 0xdb, 0x96, + 0xc5, 0xce, 0x55, 0x30, 0x62, 0x58, 0xfc, 0x6b, 0x0d, 0x96, 0x93, 0x84, 0xa1, 0xfb, 0xc2, 0x7f, + 0xbc, 0xbf, 0xba, 0x79, 0xce, 0xde, 0x11, 0xd7, 0xf1, 0xeb, 0xda, 0xe2, 0x85, 0x35, 0x23, 0xaf, + 0x6b, 0x0e, 0xe3, 0xbb, 0x09, 0x6e, 0x5d, 0x80, 0x92, 0x51, 0x3f, 0x68, 0x3e, 0xaf, 0xbf, 0x32, + 0x9a, 0x4f, 0xa8, 0xc7, 0xe6, 0xa0, 0xb0, 0xbd, 0xb7, 0xc7, 0xa1, 0x2c, 0xfe, 0xa9, 0x06, 0x2b, + 0x09, 0x96, 0xa3, 0x6e, 0xfa, 0x2e, 0x54, 0xba, 0x66, 0xdf, 0x22, 0x9d, 0x66, 0x68, 0x2d, 0xed, + 0x62, 0xd6, 0x9a, 0x60, 0x14, 0x4e, 0xc8, 0x4c, 0xfa, 0x5c, 0xad, 0x5d, 0x78, 0x1f, 0x56, 0xf7, + 0x88, 0xe7, 0xbb, 0xce, 0x45, 0xfc, 0x78, 0x15, 0x8a, 0xa7, 0x84, 0x0c, 0x5b, 0xac, 0xd8, 0x65, + 0x98, 0x07, 0x42, 0x04, 0x26, 0x70, 0x25, 0x49, 0x14, 0x55, 0xec, 0x3b, 0xb0, 0xd8, 0xb6, 0x88, + 0x69, 0x8f, 0x38, 0x29, 0x43, 0x8a, 0x0c, 0xbf, 0xaa, 0xe6, 0x52, 0x9c, 0xc6, 0x98, 0x64, 0xc3, + 0x7f, 0xd6, 0x60, 0xfd, 0x28, 0x72, 0x7f, 0x3c, 0x75, 0x69, 0xa8, 0xf8, 0x7d, 0xe2, 0xa5, 0x1d, + 0xfc, 0x25, 0xc0, 0x30, 0x20, 0x12, 0x01, 0x78, 0x5f, 0x2d, 0xd3, 0xd3, 0xe5, 0xd5, 0x42, 0x0c, + 0xbf, 0x80, 0x15, 0x69, 0xd5, 0x07, 0xb0, 0x10, 0x5b, 0x7e, 0xaf, 0xcb, 0x78, 0x1d, 0xae, 0xa5, + 0xef, 0x4e, 0xf5, 0xf5, 0x60, 0xbd, 0xf1, 0x9e, 0xea, 0xea, 0x90, 0x7f, 0x3d, 0x22, 0xae, 0xd4, + 0xb5, 0x68, 0x48, 0x90, 0x26, 0x12, 0x79, 0xdb, 0xb6, 0x46, 0x1d, 0xd2, 0xb0, 0x9c, 0x63, 0xd3, + 0xf2, 0x64, 0x22, 0x45, 0xb1, 0xf8, 0x77, 0x1a, 0x5c, 0x6b, 0x4c, 0x3b, 0x16, 0xfa, 0x7e, 0xc4, + 0xa4, 0x3c, 0x4a, 0xef, 0x29, 0x26, 0x9d, 0xca, 0xfd, 0x75, 0x1a, 0xf4, 0x9f, 0x1a, 0xcc, 0x47, + 0xda, 0x2e, 0x84, 0x20, 0x6b, 0xd3, 0xe4, 0xe5, 0xec, 0xec, 0x37, 0x6d, 0x66, 0x2d, 0xa7, 0x7d, + 0x4a, 0x3a, 0x22, 0x8e, 0x05, 0x44, 0xf1, 0xb4, 0x49, 0xdb, 0xef, 0x88, 0x34, 0x11, 0x10, 0xc5, + 0xf3, 0x19, 0x4e, 0x34, 0xe6, 0x02, 0x0a, 0xb3, 0x2a, 0xa7, 0xde, 0xa4, 0x57, 0xa1, 0xd8, 0xb6, + 0x4c, 0xcf, 0x53, 0x9a, 0xf1, 0x10, 0x81, 0xea, 0x50, 0xee, 0x90, 0xa1, 0xe5, 0x9c, 0xc9, 0x52, + 0x26, 0x1a, 0x72, 0x75, 0xec, 0xa3, 0x87, 0xdf, 0x8b, 0x10, 0x19, 0x31, 0x26, 0x5a, 0x48, 0xd1, + 0x24, 0x19, 0xbd, 0xae, 0xe8, 0x64, 0xa0, 0x68, 0x1c, 0xc0, 0x34, 0x30, 0xcc, 0x13, 0x4a, 0x28, + 0x2f, 0x06, 0x09, 0xd2, 0x15, 0xa7, 0xdb, 0x25, 0x6e, 0xa0, 0xb8, 0x04, 0xe9, 0xec, 0x41, 0xde, + 0x92, 0xf6, 0xc8, 0x77, 0xe8, 0x22, 0xd7, 0x5e, 0xc1, 0xe0, 0x45, 0x58, 0x68, 0x10, 0x5f, 0x24, + 0x28, 0x6f, 0xf3, 0x1f, 0xc2, 0x7c, 0x88, 0xa2, 0xc1, 0x12, 0x74, 0xc8, 0xda, 0x85, 0x3a, 0x64, + 0xbc, 0x09, 0x65, 0x21, 0x40, 0x19, 0x3e, 0x84, 0x5f, 0x34, 0xd5, 0x2f, 0xf8, 0x33, 0x98, 0x0b, + 0x28, 0xe9, 0x4e, 0x1f, 0x42, 0x96, 0xae, 0x88, 0xcb, 0x65, 0x29, 0x66, 0x51, 0xb6, 0x07, 0x23, + 0xc0, 0x75, 0x98, 0xa7, 0x98, 0x5d, 0xea, 0x95, 0xd4, 0x28, 0xa1, 0x13, 0x01, 0x67, 0x3f, 0x70, + 0x3a, 0x24, 0x98, 0x08, 0x42, 0x14, 0xfe, 0x31, 0x94, 0x76, 0x9d, 0xc1, 0xc0, 0xb4, 0x3b, 0x4c, + 0x48, 0x05, 0x66, 0x89, 0x3d, 0x66, 0x6a, 0x16, 0x0d, 0xfa, 0x93, 0x05, 0x48, 0x8f, 0x58, 0x96, + 0x88, 0x33, 0x0e, 0x84, 0xe1, 0x3b, 0xab, 0x84, 0x2f, 0x0d, 0x1b, 0xd3, 0x3d, 0x19, 0xf1, 0x09, + 0x27, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, 0x34, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x01, 0x94, + 0x76, 0x7b, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, 0xa4, 0xb4, 0x2e, 0x45, 0x51, 0xd2, 0x98, 0x35, + 0xdd, 0x13, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, 0xaf, 0x59, 0x28, 0x04, 0x69, 0xf3, 0x4d, 0x28, + 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, 0x1d, 0x17, 0x92, 0x52, 0xbe, 0xb6, 0xb4, 0xaa, + 0xe8, 0xc5, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, 0x21, 0x29, 0xfa, 0x36, 0x2c, 0xf4, 0xed, 0x63, + 0x67, 0x64, 0x77, 0x84, 0x4a, 0xf4, 0x72, 0xa2, 0xe1, 0xb2, 0xa2, 0x96, 0x88, 0x50, 0x5b, 0x23, + 0x4e, 0x8e, 0x76, 0xa0, 0xe2, 0x8c, 0xfc, 0xa8, 0x88, 0xec, 0x54, 0x11, 0x13, 0xf4, 0xe8, 0x1e, + 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, + 0x3d, 0x35, 0xfd, 0x9e, 0xc8, 0xf9, 0x00, 0xa6, 0xfe, 0x26, 0xf6, 0x78, 0xbf, 0xc3, 0x32, 0xbd, + 0x68, 0x70, 0x00, 0xed, 0x46, 0xee, 0x50, 0x3e, 0x42, 0xfd, 0x5f, 0x42, 0xc8, 0x7e, 0x9d, 0xd7, + 0xe5, 0x1d, 0x58, 0x8a, 0x96, 0x5d, 0x9e, 0x6f, 0x3a, 0xe4, 0x79, 0x86, 0x79, 0x22, 0x98, 0x25, + 0x88, 0x7f, 0xa6, 0xc1, 0xe2, 0x44, 0xa1, 0x46, 0xf7, 0xa1, 0x74, 0xda, 0xb7, 0x2c, 0xd2, 0x69, + 0x5d, 0x28, 0xcf, 0x55, 0x62, 0xf4, 0x05, 0xcc, 0xb9, 0x23, 0xdb, 0xee, 0xdb, 0x27, 0xb2, 0xb3, + 0x98, 0xce, 0x1c, 0xa1, 0xc6, 0xbb, 0xec, 0xfe, 0xa1, 0x1d, 0x7e, 0x70, 0xf8, 0xc0, 0xda, 0x9a, + 0x6a, 0xed, 0x2a, 0x14, 0x86, 0xa6, 0xdf, 0x3b, 0x1a, 0x92, 0xb6, 0xec, 0xe3, 0x24, 0x8c, 0x7f, + 0x91, 0x85, 0x82, 0x1c, 0x12, 0xd2, 0xea, 0x85, 0xb8, 0xff, 0x33, 0xc9, 0xf7, 0x7f, 0xe4, 0x45, + 0xa0, 0x0a, 0x85, 0xee, 0xc8, 0xb2, 0x58, 0x28, 0xf0, 0x1b, 0x33, 0x80, 0x55, 0xcb, 0xe6, 0x22, + 0x96, 0x45, 0xb7, 0x20, 0x47, 0x1b, 0x4b, 0x4f, 0xbf, 0xc4, 0x0c, 0x90, 0x38, 0xc0, 0x70, 0x0a, + 0xf4, 0x60, 0x62, 0xf4, 0xbf, 0x9e, 0x40, 0x9d, 0x3a, 0xf3, 0xdf, 0x8d, 0xcc, 0xfc, 0xd7, 0x92, + 0x58, 0xe3, 0xc3, 0xfe, 0x83, 0x89, 0x61, 0x3f, 0x71, 0xc7, 0xff, 0xa1, 0x29, 0xff, 0x3e, 0xab, + 0x62, 0x22, 0xb0, 0x68, 0x8c, 0x07, 0xfe, 0xd1, 0xce, 0xf3, 0x0f, 0xfe, 0xad, 0x06, 0x1f, 0x34, + 0x88, 0xff, 0x22, 0x36, 0xf3, 0x07, 0x11, 0xba, 0x01, 0x25, 0x97, 0x0c, 0x9d, 0xa7, 0xa6, 0xef, + 0x13, 0x57, 0x3e, 0xa8, 0xa9, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0x19, 0xf7, 0xbd, 0xbe, 0x63, 0x4b, + 0x2a, 0x7e, 0xc2, 0x38, 0x9a, 0xca, 0x32, 0x2d, 0x6b, 0xc7, 0x35, 0xed, 0x76, 0x8f, 0xc8, 0x86, + 0x4e, 0x45, 0xb1, 0xb2, 0x6f, 0x59, 0x2d, 0xf3, 0x84, 0x77, 0x2f, 0x05, 0x43, 0x82, 0xf8, 0x18, + 0x96, 0xe3, 0x67, 0x94, 0x29, 0x40, 0x0f, 0x23, 0x53, 0x80, 0xfe, 0x66, 0xf7, 0x9b, 0x7c, 0xd3, + 0x10, 0xf9, 0x23, 0x61, 0x36, 0x23, 0x89, 0x63, 0x89, 0x4c, 0x08, 0x60, 0xfc, 0x15, 0xac, 0x26, + 0x9b, 0x82, 0xda, 0xf4, 0x00, 0x16, 0xe3, 0x0f, 0x23, 0x49, 0x33, 0x4f, 0xd2, 0x21, 0x8d, 0x49, + 0x4e, 0x8c, 0xa0, 0xf2, 0xa4, 0xef, 0xd1, 0xa9, 0xc3, 0x51, 0x5e, 0xf4, 0x0b, 0x14, 0x4e, 0x4d, + 0x6d, 0x1d, 0xf2, 0x22, 0x31, 0x44, 0x8d, 0x96, 0x20, 0xf5, 0x81, 0xf8, 0x69, 0x44, 0x95, 0x8b, + 0xa3, 0xf1, 0x6b, 0x28, 0x2b, 0xfb, 0xca, 0x60, 0xa1, 0x50, 0x52, 0xb0, 0x88, 0xd3, 0x18, 0x9c, + 0x02, 0x7d, 0x0a, 0x97, 0x4f, 0x58, 0xdf, 0xbd, 0x17, 0xdb, 0x8c, 0x5b, 0x39, 0x79, 0x11, 0x1f, + 0x42, 0x79, 0xbb, 0xd3, 0xa1, 0xb2, 0x64, 0x50, 0x25, 0x29, 0x97, 0xa0, 0x42, 0x26, 0x59, 0x05, + 0x03, 0xe6, 0x02, 0x79, 0xbc, 0x67, 0x43, 0x36, 0x79, 0x13, 0x3f, 0x12, 0x97, 0x9d, 0xb0, 0x42, + 0x77, 0xef, 0xcb, 0x8a, 0x5f, 0x34, 0xd8, 0x6f, 0x7c, 0x0b, 0x16, 0x0d, 0x32, 0x70, 0xc6, 0x44, + 0x3d, 0xe6, 0x32, 0xe4, 0xfa, 0x76, 0x87, 0xbc, 0x95, 0x9f, 0x01, 0x18, 0x80, 0xbf, 0x05, 0x0b, + 0x2a, 0x29, 0x3d, 0xc1, 0x4d, 0x28, 0xab, 0xfb, 0x04, 0xe1, 0x18, 0xc3, 0xe2, 0x8f, 0x60, 0xc9, + 0x20, 0x5d, 0x97, 0x78, 0x3d, 0xd5, 0xef, 0x29, 0xfb, 0xfc, 0x3f, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, + 0x3e, 0x9d, 0xfc, 0x01, 0x1b, 0x36, 0x1b, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, + 0xff, 0x1e, 0x9b, 0xee, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, + 0xc2, 0x07, 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, + 0xff, 0x6c, 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0x6f, 0x44, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, + 0xf2, 0x0f, 0x4c, 0x48, 0x9f, 0xf8, 0xe6, 0x24, 0x8e, 0x58, 0x5d, 0x49, 0x58, 0xa1, 0x83, 0xe9, + 0xcc, 0x37, 0x34, 0xf4, 0x12, 0x2a, 0xf1, 0xef, 0x26, 0x08, 0x47, 0xa7, 0xc0, 0xa4, 0xcf, 0x42, + 0xd5, 0x8d, 0xa9, 0x34, 0x4c, 0x3a, 0xda, 0x81, 0x82, 0xfc, 0xae, 0x80, 0xd4, 0x77, 0xc0, 0xd8, + 0x77, 0x89, 0xaa, 0x9e, 0xb8, 0xc6, 0x65, 0xbc, 0x60, 0xcd, 0x81, 0xfa, 0xc1, 0x01, 0x5d, 0x4f, + 0x1d, 0x52, 0x03, 0x8d, 0xd7, 0xa7, 0x91, 0x70, 0xc1, 0x2d, 0x28, 0x47, 0xdf, 0x50, 0xd1, 0xc6, + 0x79, 0x0f, 0xb8, 0xd5, 0xb5, 0x29, 0x14, 0x81, 0xd4, 0xe8, 0x7e, 0x68, 0x23, 0xf5, 0x28, 0x49, + 0x52, 0x13, 0xde, 0x55, 0xf1, 0x0c, 0xfa, 0x11, 0xa0, 0xc9, 0x87, 0x41, 0x74, 0xe3, 0x22, 0x8f, + 0x98, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x87, 0xb0, 0x38, 0xf1, 0xa4, 0x85, 0xd4, 0x4e, 0x36, + 0xed, 0xa9, 0xb0, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xcb, 0x52, 0x44, 0x81, 0xd4, 0x37, + 0xac, 0x88, 0x02, 0x29, 0xcf, 0x53, 0x3c, 0xd6, 0xe4, 0xc4, 0x1a, 0x89, 0xb5, 0xd8, 0x64, 0x1b, + 0x89, 0xb5, 0xc8, 0x88, 0x8b, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, + 0xae, 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x69, 0x8c, 0x8b, + 0x9a, 0xfa, 0x74, 0x16, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, + 0x78, 0xf0, 0x0c, 0xea, 0xb2, 0x2f, 0x76, 0x13, 0xc5, 0x1b, 0xdd, 0x8c, 0xf2, 0xa4, 0x35, 0x3a, + 0xd5, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xea, 0x50, 0x0c, 0x0a, 0x28, 0xfa, 0x40, 0x61, 0x8a, 0x97, + 0xf3, 0xea, 0x6a, 0xf2, 0x62, 0xe0, 0x03, 0x51, 0xc4, 0x22, 0x3e, 0x88, 0x16, 0xca, 0x88, 0x0f, + 0xd4, 0x9a, 0x87, 0x67, 0xd0, 0x63, 0x80, 0xb0, 0x0c, 0xa1, 0xab, 0x91, 0xaa, 0x1d, 0x2b, 0x64, + 0xd5, 0x6a, 0xca, 0xaa, 0xb4, 0xfe, 0x9c, 0x5a, 0x95, 0x22, 0xde, 0x4c, 0x28, 0x57, 0xd5, 0x8a, + 0xfa, 0xc4, 0x4b, 0x6f, 0x6b, 0x3c, 0x83, 0x1e, 0x41, 0x39, 0x5a, 0xac, 0x22, 0xf7, 0x41, 0x62, + 0x1d, 0x4b, 0x94, 0xf3, 0x12, 0xf4, 0xb4, 0x2a, 0x86, 0x6e, 0x47, 0x25, 0x4e, 0x2b, 0x75, 0x89, + 0xb2, 0x2d, 0x58, 0x49, 0xae, 0x47, 0x68, 0x33, 0x2a, 0x39, 0xbd, 0x0a, 0x56, 0x6f, 0x5e, 0x80, + 0x92, 0x59, 0x75, 0xe7, 0xde, 0x1f, 0xdf, 0xad, 0x69, 0x7f, 0x7b, 0xb7, 0xa6, 0xfd, 0xfd, 0xdd, + 0x9a, 0xf6, 0xab, 0x7f, 0xac, 0xcd, 0x00, 0x6e, 0xf7, 0x6a, 0x6d, 0xe2, 0xda, 0x35, 0xd3, 0xea, + 0xb7, 0x49, 0xcd, 0xd9, 0xaa, 0x49, 0x49, 0xee, 0xb0, 0xed, 0x11, 0x77, 0x4c, 0xdc, 0x97, 0x99, + 0xe1, 0xf1, 0xf1, 0x25, 0xf6, 0x9f, 0x90, 0x4f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x21, + 0x23, 0x05, 0x2d, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6263,6 +6273,25 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } if len(m.EnvId) > 0 { i -= len(m.EnvId) copy(dAtA[i:], m.EnvId) @@ -8116,6 +8145,14 @@ func (m *TaskInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13776,6 +13813,133 @@ func (m *TaskInfo) Unmarshal(dAtA []byte) error { } m.EnvId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Properties == nil { + m.Properties = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Properties[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 7698ce61a..6cd144ea3 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2224,16 +2224,17 @@ func (m *ChannelInfo) GetTarget() string { } type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TaskInfo) Reset() { *m = TaskInfo{} } @@ -2318,6 +2319,13 @@ func (m *TaskInfo) GetEnvId() string { return "" } +func (m *TaskInfo) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} + type CleanupTasksRequest struct { TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3507,6 +3515,7 @@ func init() { proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") @@ -3536,169 +3545,170 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2581 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0x59, - 0x35, 0xe3, 0xd8, 0xb5, 0x7d, 0x9c, 0x38, 0xce, 0x4d, 0x9a, 0x4e, 0xbc, 0x6d, 0x92, 0x5e, 0xaa, - 0x6e, 0xda, 0x5d, 0x5c, 0x9a, 0x5d, 0xb1, 0xa5, 0xbb, 0xdd, 0x92, 0x0f, 0xd7, 0x0d, 0x34, 0x71, - 0x99, 0xb8, 0x2d, 0x54, 0x42, 0x65, 0x62, 0x5f, 0xc7, 0xde, 0x8c, 0x67, 0xdc, 0x99, 0xb1, 0xdb, - 0x3c, 0xf0, 0xc6, 0x1b, 0x42, 0x08, 0xf1, 0xc2, 0x2b, 0x42, 0xfc, 0x07, 0x1e, 0x90, 0x78, 0x45, - 0x08, 0x04, 0x3f, 0x01, 0x15, 0x89, 0x27, 0x7e, 0x04, 0xba, 0x5f, 0x33, 0x77, 0xc6, 0x33, 0x4e, - 0x0a, 0xe2, 0x85, 0xb7, 0x39, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0x5f, 0xf7, 0x9c, 0x73, 0x6d, 0x58, - 0x19, 0xba, 0x8e, 0xef, 0x78, 0x77, 0x9c, 0xad, 0xb6, 0x63, 0xfb, 0xae, 0x63, 0xd5, 0x18, 0x02, - 0x15, 0x03, 0x04, 0x5e, 0x81, 0xe5, 0xfa, 0x98, 0xd8, 0xfe, 0xab, 0x03, 0xe2, 0x39, 0xde, 0x63, - 0x62, 0xba, 0xfe, 0x31, 0x31, 0x7d, 0xbc, 0x00, 0xf3, 0x47, 0xbe, 0xe9, 0x8f, 0x3c, 0x83, 0xbc, - 0x1e, 0x11, 0xcf, 0xc7, 0xc7, 0x50, 0x92, 0x88, 0xa1, 0x75, 0x86, 0x96, 0x21, 0xe7, 0xf9, 0xa6, - 0x4f, 0x74, 0x6d, 0x43, 0xdb, 0x2c, 0x1a, 0x1c, 0x40, 0x0f, 0x60, 0xde, 0x63, 0x44, 0xcf, 0x86, - 0x1d, 0xd3, 0x27, 0x9e, 0x9e, 0xd9, 0x98, 0xdd, 0x2c, 0x6d, 0x5d, 0xa9, 0x85, 0x27, 0x38, 0x52, - 0xd6, 0x8d, 0x28, 0x35, 0xfe, 0x8b, 0x06, 0x73, 0xea, 0x3a, 0xfa, 0x04, 0x72, 0x16, 0x19, 0x13, - 0x8b, 0xed, 0x52, 0xde, 0xba, 0x96, 0x22, 0xa7, 0xf6, 0x84, 0x12, 0x19, 0x9c, 0x16, 0xed, 0x43, - 0x79, 0x10, 0x51, 0x46, 0xcf, 0x6c, 0x68, 0x9b, 0xa5, 0xad, 0x75, 0x85, 0x3b, 0x49, 0xe7, 0xc7, - 0x33, 0x46, 0x8c, 0x11, 0x7f, 0x0a, 0x39, 0x26, 0x1a, 0x15, 0x21, 0xb7, 0x57, 0xdf, 0x79, 0xd6, - 0xa8, 0xcc, 0xa0, 0x02, 0x64, 0xf7, 0x0f, 0x1f, 0x35, 0x2b, 0x1a, 0x2a, 0x41, 0xfe, 0xc5, 0xb6, - 0x71, 0xb8, 0x7f, 0xd8, 0xa8, 0x64, 0x28, 0x45, 0xdd, 0x30, 0x9a, 0x46, 0x65, 0x76, 0x27, 0x0f, - 0x39, 0x26, 0x1f, 0xaf, 0xc2, 0x95, 0x06, 0xf1, 0x1f, 0xb9, 0xe6, 0x80, 0xbc, 0x71, 0xdc, 0xd3, - 0x7d, 0xbb, 0xeb, 0x48, 0x73, 0xfe, 0x46, 0x83, 0xfc, 0x73, 0xe2, 0x7a, 0x7d, 0xc7, 0xa6, 0xb6, - 0x1c, 0x98, 0x5f, 0x39, 0x2e, 0xd3, 0x32, 0x67, 0x70, 0x80, 0x61, 0xfb, 0xb6, 0xe3, 0xb2, 0xd3, - 0x53, 0x2c, 0x05, 0x28, 0x76, 0x68, 0xfa, 0xed, 0x9e, 0x3e, 0xcb, 0xb1, 0x0c, 0xa0, 0xd8, 0xe3, - 0x51, 0xdf, 0xea, 0xe8, 0x59, 0xee, 0x0d, 0x06, 0xa0, 0x0d, 0x28, 0x0d, 0x5d, 0xa7, 0x33, 0x6a, - 0xfb, 0x87, 0xe6, 0x80, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x1a, 0xc0, 0x98, 0x1f, 0xe2, 0xc8, - 0x77, 0xf5, 0x4b, 0x8c, 0x40, 0xc1, 0xe0, 0x9f, 0x67, 0xe0, 0xf2, 0xa4, 0x06, 0xd4, 0xff, 0x1b, - 0x50, 0xea, 0x06, 0xd8, 0x8e, 0x88, 0x02, 0x15, 0x85, 0x3e, 0x86, 0x45, 0x62, 0x8f, 0xfb, 0xae, - 0x63, 0x0f, 0x88, 0xed, 0x7b, 0xbb, 0xce, 0xc8, 0xf6, 0x85, 0x2e, 0x93, 0x0b, 0xf4, 0x24, 0xbe, - 0xe9, 0x9d, 0x0a, 0x32, 0xae, 0x9c, 0x82, 0x09, 0xe3, 0x2d, 0xab, 0xc6, 0xdb, 0x1a, 0x40, 0xcf, - 0xf1, 0xa4, 0xf0, 0x1c, 0xe7, 0x0a, 0x31, 0x08, 0xc3, 0x5c, 0xdf, 0xf6, 0x7c, 0xd3, 0x6e, 0x13, - 0x66, 0x02, 0xae, 0x61, 0x04, 0x87, 0x3e, 0x86, 0xbc, 0xd0, 0x58, 0xcf, 0xb3, 0x38, 0x41, 0x4a, - 0x9c, 0x08, 0x17, 0x19, 0x92, 0x04, 0xdf, 0x82, 0x85, 0x16, 0x31, 0xdd, 0x8e, 0xf3, 0xc6, 0x16, - 0xae, 0x44, 0x2b, 0x70, 0xc9, 0x25, 0xa6, 0xe7, 0xd8, 0xc2, 0x0a, 0x02, 0xa2, 0x29, 0x14, 0x92, - 0x0e, 0xad, 0x33, 0xac, 0xc3, 0x4a, 0x83, 0xf8, 0x75, 0x45, 0x77, 0x19, 0x0d, 0x6f, 0x61, 0x79, - 0x62, 0xe5, 0x62, 0x56, 0xfe, 0x12, 0xe6, 0x54, 0x63, 0x8a, 0x84, 0xab, 0xaa, 0xa1, 0x1e, 0x2e, - 0x33, 0xf7, 0x45, 0xe8, 0xf1, 0x9f, 0xb2, 0xb0, 0x10, 0xa3, 0x40, 0x65, 0xc8, 0xf4, 0xe5, 0x66, - 0x99, 0x3e, 0x8b, 0xa3, 0xb6, 0x4b, 0x4c, 0x9f, 0x74, 0x5e, 0xf4, 0x88, 0xcd, 0x7c, 0x58, 0x34, - 0x54, 0x54, 0xe8, 0x9d, 0x59, 0xd5, 0x3b, 0x35, 0xc8, 0x31, 0x0f, 0xea, 0x59, 0x76, 0x28, 0x5d, - 0xcd, 0xde, 0x9e, 0xe3, 0xfa, 0x2d, 0xd3, 0xe3, 0x11, 0xc5, 0xc9, 0x50, 0x15, 0x0a, 0xae, 0xe3, - 0xf8, 0x86, 0x63, 0xc9, 0x60, 0x0d, 0x60, 0x74, 0x1b, 0x2a, 0xed, 0x91, 0xeb, 0x12, 0xdb, 0x37, - 0x46, 0xf6, 0xe1, 0x68, 0x70, 0x4c, 0x78, 0xbc, 0xce, 0x1b, 0x13, 0x78, 0xb4, 0x07, 0x85, 0x0e, - 0xe9, 0x9a, 0x23, 0xcb, 0xf7, 0xf4, 0x3c, 0xdb, 0x7a, 0x33, 0xdd, 0x1e, 0xb5, 0x3d, 0x41, 0x5a, - 0xb7, 0x7d, 0xf7, 0xcc, 0x08, 0x38, 0xd1, 0x3d, 0xc8, 0x8e, 0x4d, 0xd7, 0xd3, 0x0b, 0x4c, 0xc2, - 0x8d, 0x29, 0x12, 0x9e, 0x9b, 0xae, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x47, 0x5c, 0x8a, 0xd6, - 0x8b, 0xe7, 0xee, 0xff, 0x4c, 0x90, 0x8a, 0xfd, 0x25, 0x67, 0xf5, 0x73, 0x98, 0x8f, 0x1c, 0x0d, - 0x55, 0x60, 0xf6, 0x94, 0x9c, 0x09, 0xbf, 0xd0, 0x4f, 0x6a, 0xf6, 0xb1, 0x69, 0x8d, 0x88, 0x70, - 0x09, 0x07, 0xee, 0x67, 0xee, 0x69, 0xd5, 0xcf, 0xa0, 0x18, 0xc8, 0x7c, 0x2f, 0xc6, 0xcf, 0x61, - 0x3e, 0x72, 0xa0, 0xf7, 0x61, 0xc6, 0xbf, 0xd7, 0xe0, 0xf2, 0x21, 0x79, 0xa3, 0x68, 0x28, 0x73, - 0xe4, 0x36, 0x54, 0x68, 0xc0, 0x76, 0x2d, 0xe7, 0x4d, 0x8b, 0x0c, 0x86, 0x56, 0x58, 0x39, 0x26, - 0xf0, 0xe8, 0x4b, 0x61, 0x78, 0x1e, 0xca, 0xb7, 0x15, 0xd3, 0x25, 0xca, 0x8e, 0x9b, 0xff, 0x3f, - 0xd6, 0x1d, 0x1f, 0xc1, 0x52, 0x7c, 0x07, 0x9a, 0x84, 0x5f, 0x40, 0x49, 0x49, 0x19, 0x26, 0x6a, - 0x7a, 0x86, 0xa9, 0xe4, 0xf8, 0x43, 0x76, 0x83, 0x26, 0x98, 0x24, 0x96, 0x65, 0xf8, 0x27, 0x1a, - 0x2c, 0xc5, 0x29, 0xff, 0xeb, 0xed, 0xd1, 0x1d, 0x28, 0x48, 0x03, 0x8b, 0x32, 0xb8, 0xa4, 0xb0, - 0xd2, 0xd4, 0x62, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, 0xab, 0xbb, 0x7c, 0xf9, 0xfc, 0x43, 0xa3, - 0x87, 0x90, 0xf5, 0xcf, 0x86, 0xdc, 0x96, 0xe5, 0xad, 0x8f, 0x14, 0xd1, 0xa9, 0x32, 0x6a, 0xcd, - 0x21, 0x65, 0x31, 0x18, 0x23, 0x36, 0xe1, 0x12, 0x87, 0x69, 0x5d, 0x3d, 0x6c, 0x36, 0x9f, 0x56, - 0x66, 0x10, 0x82, 0xf2, 0x51, 0x6b, 0xdb, 0x68, 0xbd, 0xda, 0xde, 0x6d, 0xed, 0x3f, 0xdf, 0x6f, - 0xfd, 0xa0, 0xa2, 0xa1, 0x45, 0x98, 0x3f, 0x6a, 0x35, 0x9f, 0x86, 0xa8, 0x0c, 0x9a, 0x87, 0xe2, - 0x6e, 0xf3, 0xf0, 0xd1, 0x7e, 0xe3, 0x99, 0x51, 0xaf, 0xcc, 0xd2, 0x02, 0x6c, 0xd4, 0x8f, 0xea, - 0xad, 0x4a, 0x16, 0xcd, 0x41, 0xa1, 0xd1, 0x7c, 0xc5, 0xcb, 0x71, 0x0e, 0x9f, 0xc2, 0x95, 0xa4, - 0xc3, 0x50, 0xdb, 0xc6, 0xd5, 0x09, 0xee, 0xb1, 0x8c, 0x7a, 0x8f, 0x25, 0xdd, 0x3d, 0xb3, 0xc9, - 0x77, 0x0f, 0xfe, 0xa5, 0x06, 0xfa, 0x81, 0xd3, 0xe9, 0x77, 0xcf, 0x2e, 0x64, 0x3d, 0x70, 0x86, - 0xc4, 0x35, 0xfd, 0xbe, 0x63, 0xcb, 0x78, 0x5f, 0x4f, 0xf6, 0x6c, 0x53, 0xd2, 0x19, 0x0a, 0x0b, - 0xba, 0x09, 0x65, 0x97, 0xb4, 0x1d, 0xbb, 0xdb, 0x3f, 0x19, 0xb9, 0x64, 0xdb, 0xb2, 0xd8, 0xb9, - 0x0a, 0x46, 0x0c, 0x8b, 0x7f, 0xad, 0xc1, 0x72, 0x92, 0x30, 0x74, 0x5f, 0xf8, 0x8f, 0xf7, 0x57, - 0x37, 0xcf, 0xd9, 0x3b, 0xe2, 0x3a, 0x7e, 0x5d, 0x5b, 0xbc, 0xb0, 0x66, 0xe4, 0x75, 0xcd, 0x61, - 0x7c, 0x37, 0xc1, 0xad, 0x0b, 0x50, 0x32, 0xea, 0x07, 0xcd, 0xe7, 0xf5, 0x57, 0x46, 0xf3, 0x09, - 0xf5, 0xd8, 0x1c, 0x14, 0xb6, 0xf7, 0xf6, 0x38, 0x94, 0xc5, 0x3f, 0xd5, 0x60, 0x25, 0xc1, 0x72, - 0xd4, 0x4d, 0xdf, 0x85, 0x4a, 0xd7, 0xec, 0x5b, 0xa4, 0xd3, 0x0c, 0xad, 0xa5, 0x5d, 0xcc, 0x5a, - 0x13, 0x8c, 0xc2, 0x09, 0x99, 0x49, 0x9f, 0xab, 0xb5, 0x0b, 0xef, 0xc3, 0xea, 0x1e, 0xf1, 0x7c, - 0xd7, 0xb9, 0x88, 0x1f, 0xaf, 0x42, 0xf1, 0x94, 0x90, 0x61, 0x8b, 0x15, 0xbb, 0x0c, 0xf3, 0x40, - 0x88, 0xc0, 0x04, 0xae, 0x24, 0x89, 0xa2, 0x8a, 0x7d, 0x07, 0x16, 0xdb, 0x16, 0x31, 0xed, 0x11, - 0x27, 0x65, 0x48, 0x91, 0xe1, 0x57, 0xd5, 0x5c, 0x8a, 0xd3, 0x18, 0x93, 0x6c, 0xf8, 0xcf, 0x1a, - 0xac, 0x1f, 0x45, 0xee, 0x8f, 0xa7, 0x2e, 0x0d, 0x15, 0xbf, 0x4f, 0xbc, 0xb4, 0x83, 0xbf, 0x04, - 0x18, 0x06, 0x44, 0x22, 0x00, 0xef, 0xab, 0x65, 0x7a, 0xba, 0xbc, 0x5a, 0x88, 0xe1, 0x17, 0xb0, - 0x22, 0xad, 0xfa, 0x00, 0x16, 0x62, 0xcb, 0xef, 0x75, 0x19, 0xaf, 0xc3, 0xb5, 0xf4, 0xdd, 0xa9, - 0xbe, 0x1e, 0xac, 0x37, 0xde, 0x53, 0x5d, 0x1d, 0xf2, 0xaf, 0x47, 0xc4, 0x95, 0xba, 0x16, 0x0d, - 0x09, 0xd2, 0x44, 0x22, 0x6f, 0xdb, 0xd6, 0xa8, 0x43, 0x1a, 0x96, 0x73, 0x6c, 0x5a, 0x9e, 0x4c, - 0xa4, 0x28, 0x16, 0xff, 0x4e, 0x83, 0x6b, 0x8d, 0x69, 0xc7, 0x42, 0xdf, 0x8f, 0x98, 0x94, 0x47, - 0xe9, 0x3d, 0xc5, 0xa4, 0x53, 0xb9, 0xff, 0x97, 0x06, 0xfd, 0xa7, 0x06, 0xf3, 0x91, 0xb6, 0x0b, - 0x21, 0xc8, 0xda, 0x34, 0x79, 0x39, 0x3b, 0xfb, 0xa6, 0xcd, 0xac, 0xe5, 0xb4, 0x4f, 0x49, 0x47, - 0xc4, 0xb1, 0x80, 0x28, 0x9e, 0x36, 0x69, 0xfb, 0x1d, 0x91, 0x26, 0x02, 0xa2, 0x78, 0x3e, 0xc3, - 0x89, 0xc6, 0x5c, 0x40, 0x61, 0x56, 0xe5, 0xd4, 0x9b, 0xf4, 0x2a, 0x14, 0xdb, 0x96, 0xe9, 0x79, - 0x4a, 0x33, 0x1e, 0x22, 0x50, 0x1d, 0xca, 0x1d, 0x32, 0xb4, 0x9c, 0x33, 0x59, 0xca, 0x44, 0x43, - 0xae, 0x8e, 0x7d, 0xf4, 0xf0, 0x7b, 0x11, 0x22, 0x23, 0xc6, 0x44, 0x0b, 0x29, 0x9a, 0x24, 0xa3, - 0xd7, 0x15, 0x9d, 0x0c, 0x14, 0x8d, 0x03, 0x98, 0x06, 0x86, 0x79, 0x42, 0x09, 0xe5, 0xc5, 0x20, - 0x41, 0xba, 0xe2, 0x74, 0xbb, 0xc4, 0x0d, 0x14, 0x97, 0x20, 0x9d, 0x3d, 0xc8, 0x5b, 0xd2, 0x1e, - 0xf9, 0x0e, 0x5d, 0xe4, 0xda, 0x2b, 0x18, 0xbc, 0x08, 0x0b, 0x0d, 0xe2, 0x8b, 0x04, 0xe5, 0x6d, - 0xfe, 0x43, 0x98, 0x0f, 0x51, 0x34, 0x58, 0x82, 0x0e, 0x59, 0xbb, 0x50, 0x87, 0x8c, 0x37, 0xa1, - 0x2c, 0x04, 0x28, 0xc3, 0x87, 0xf0, 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x73, 0x01, 0x25, 0xdd, - 0xe9, 0x43, 0xc8, 0xd2, 0x15, 0x71, 0xb9, 0x2c, 0xc5, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x0e, - 0xf3, 0x14, 0xb3, 0x4b, 0xbd, 0x92, 0x1a, 0x25, 0x74, 0x22, 0xe0, 0xec, 0x07, 0x4e, 0x87, 0x04, - 0x13, 0x41, 0x88, 0xc2, 0x3f, 0x86, 0xd2, 0xae, 0x33, 0x18, 0x98, 0x76, 0x87, 0x09, 0xa9, 0xc0, - 0x2c, 0xb1, 0xc7, 0x4c, 0xcd, 0xa2, 0x41, 0x3f, 0x59, 0x80, 0xf4, 0x88, 0x65, 0x89, 0x38, 0xe3, - 0x40, 0x18, 0xbe, 0xb3, 0x4a, 0xf8, 0xd2, 0xb0, 0x31, 0xdd, 0x93, 0x11, 0x9f, 0x70, 0xb2, 0x4c, - 0x46, 0x88, 0xa0, 0x07, 0xa4, 0x4d, 0xb3, 0x88, 0x34, 0xf6, 0x8d, 0x0f, 0xa0, 0xb4, 0xdb, 0x33, - 0x6d, 0x9b, 0x58, 0xa9, 0x3a, 0x20, 0xa5, 0x75, 0x29, 0x8a, 0x92, 0xc6, 0xac, 0xe9, 0x9e, 0x10, - 0x3f, 0x8c, 0x72, 0x0a, 0xe1, 0x7f, 0x65, 0xa0, 0x10, 0xa4, 0xcd, 0x37, 0xa1, 0xe8, 0x51, 0xe7, - 0xb0, 0x08, 0xe5, 0xf6, 0x4c, 0x77, 0x5c, 0x48, 0x4a, 0xf9, 0xda, 0xd2, 0xaa, 0xa2, 0x17, 0xd3, - 0x63, 0x7e, 0x08, 0xac, 0x6e, 0x84, 0xa4, 0xe8, 0xdb, 0xb0, 0xd0, 0xb7, 0x8f, 0x9d, 0x91, 0xdd, - 0x11, 0x2a, 0xd1, 0xcb, 0x89, 0x86, 0xcb, 0x8a, 0x5a, 0x22, 0x42, 0x6d, 0x8d, 0x38, 0x39, 0xda, - 0x81, 0x8a, 0x33, 0xf2, 0xa3, 0x22, 0xb2, 0x53, 0x45, 0x4c, 0xd0, 0xa3, 0x7b, 0xd4, 0xe5, 0x81, - 0x43, 0x99, 0xb1, 0x63, 0xec, 0xe1, 0xaa, 0xa1, 0x92, 0xd2, 0xc4, 0xa3, 0x91, 0xf5, 0xd4, 0xf4, - 0x7b, 0x22, 0xe7, 0x03, 0x98, 0xfa, 0x9b, 0xd8, 0xe3, 0xfd, 0x0e, 0xcb, 0xf4, 0xa2, 0xc1, 0x01, - 0x7c, 0x07, 0x96, 0xa2, 0x25, 0x8f, 0xc7, 0xba, 0x0e, 0x79, 0x1e, 0xdd, 0x9e, 0x08, 0x24, 0x09, - 0xe2, 0x9f, 0x69, 0xb0, 0x38, 0x51, 0x24, 0xd1, 0x7d, 0x28, 0x9d, 0xf6, 0x2d, 0x8b, 0x74, 0x5a, - 0x17, 0xca, 0x31, 0x95, 0x18, 0x7d, 0x01, 0x73, 0xee, 0xc8, 0xb6, 0xfb, 0xf6, 0x89, 0xac, 0xea, - 0xd3, 0x99, 0x23, 0xd4, 0x78, 0x97, 0xe5, 0x3e, 0xed, 0xae, 0x83, 0xc3, 0x07, 0x9a, 0x6a, 0x8a, - 0xa6, 0xd4, 0x36, 0x43, 0xd3, 0xef, 0x1d, 0x0d, 0x49, 0x5b, 0xf6, 0x50, 0x12, 0xc6, 0xbf, 0xc8, - 0x42, 0x41, 0x36, 0xe8, 0x69, 0x77, 0xb5, 0xb8, 0x7b, 0x33, 0xc9, 0x77, 0x6f, 0x64, 0x1a, 0xaf, - 0x42, 0xa1, 0x3b, 0xb2, 0x2c, 0xe6, 0x06, 0x7e, 0x5b, 0x05, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, - 0xe8, 0x16, 0xe4, 0x68, 0x53, 0xe7, 0xe9, 0x97, 0x98, 0x01, 0x12, 0x87, 0x07, 0x4e, 0x81, 0x1e, - 0x4c, 0x8c, 0xdd, 0xd7, 0x13, 0xa8, 0x53, 0xe7, 0xed, 0xbb, 0x91, 0x79, 0xfb, 0x5a, 0x12, 0x6b, - 0x7c, 0xd0, 0x7e, 0x30, 0x31, 0x68, 0x27, 0xee, 0xf8, 0x7f, 0x34, 0x61, 0xdf, 0x67, 0x15, 0x44, - 0x04, 0x16, 0x8d, 0xf1, 0xc0, 0x3f, 0xda, 0x79, 0xfe, 0xc1, 0xbf, 0xd5, 0xe0, 0x83, 0x06, 0xf1, - 0x5f, 0xc4, 0xe6, 0xed, 0x20, 0x42, 0x37, 0xa0, 0xe4, 0x92, 0xa1, 0xf3, 0xd4, 0xf4, 0x7d, 0xe2, - 0xca, 0xc7, 0x2c, 0x15, 0x85, 0x36, 0x61, 0xc1, 0x25, 0xe3, 0xbe, 0xd7, 0x77, 0x6c, 0x49, 0xc5, - 0x4f, 0x18, 0x47, 0x53, 0x59, 0xa6, 0x65, 0xed, 0xb8, 0xa6, 0xdd, 0xee, 0x11, 0xd9, 0x4c, 0xa9, - 0x28, 0x56, 0x72, 0x2d, 0xab, 0x65, 0x9e, 0xf0, 0xce, 0xa1, 0x60, 0x48, 0x10, 0x1f, 0xc3, 0x72, - 0xfc, 0x8c, 0x32, 0x05, 0xe8, 0x61, 0x64, 0x0a, 0xd0, 0x6f, 0x76, 0xb7, 0xc8, 0xf7, 0x04, 0x91, - 0x3f, 0x12, 0x66, 0xf3, 0x89, 0x38, 0x96, 0xc8, 0x84, 0x00, 0xc6, 0x5f, 0xc1, 0x6a, 0xb2, 0x29, - 0xa8, 0x4d, 0x0f, 0x60, 0x31, 0xfe, 0x28, 0x91, 0x34, 0x6f, 0x24, 0x1d, 0xd2, 0x98, 0xe4, 0xc4, - 0x08, 0x2a, 0x4f, 0xfa, 0x1e, 0xed, 0xf8, 0x1d, 0xe5, 0x35, 0xbd, 0x40, 0xe1, 0xd4, 0xd4, 0xd6, - 0x21, 0x2f, 0x12, 0x43, 0xd4, 0x47, 0x09, 0x52, 0x1f, 0x88, 0x4f, 0x23, 0xaa, 0x5c, 0x1c, 0x8d, - 0x5f, 0x43, 0x59, 0xd9, 0x57, 0x06, 0x0b, 0x85, 0x92, 0x82, 0x45, 0x9c, 0xc6, 0xe0, 0x14, 0xe8, - 0x53, 0xb8, 0x7c, 0xc2, 0x7a, 0xde, 0xbd, 0xd8, 0x66, 0xdc, 0xca, 0xc9, 0x8b, 0xf8, 0x10, 0xca, - 0xdb, 0x9d, 0x0e, 0x95, 0x25, 0x83, 0x2a, 0x49, 0xb9, 0x04, 0x15, 0x32, 0xc9, 0x2a, 0x18, 0x30, - 0x17, 0xc8, 0xe3, 0xfd, 0x12, 0xb2, 0xc9, 0x9b, 0xf8, 0x91, 0xb8, 0xec, 0x84, 0x15, 0xba, 0x7b, - 0x5f, 0x56, 0xdb, 0xa2, 0xc1, 0xbe, 0xf1, 0x2d, 0x58, 0x34, 0xc8, 0xc0, 0x19, 0x13, 0xf5, 0x98, - 0xcb, 0x90, 0xeb, 0xdb, 0x1d, 0xf2, 0x56, 0x3e, 0xc1, 0x33, 0x00, 0x7f, 0x0b, 0x16, 0x54, 0x52, - 0x7a, 0x82, 0x9b, 0x50, 0x56, 0xf7, 0x09, 0xc2, 0x31, 0x86, 0xc5, 0x1f, 0xc1, 0x92, 0x41, 0xba, - 0x2e, 0xf1, 0x7a, 0xaa, 0xdf, 0x53, 0xf6, 0xf9, 0x3a, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, 0x3e, 0x9d, - 0xfc, 0x01, 0x1b, 0xf4, 0x1a, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, 0xff, 0x1e, - 0x9b, 0xac, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, 0xc2, 0x07, - 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, 0xff, 0x6c, - 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0xef, 0x33, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, 0xf2, 0x1f, - 0x77, 0x90, 0x3e, 0xf1, 0x7b, 0x8f, 0x38, 0x62, 0x75, 0x25, 0x61, 0x85, 0x0e, 0x85, 0x33, 0xdf, - 0xd0, 0xd0, 0x4b, 0xa8, 0xc4, 0x7f, 0xb3, 0x40, 0x38, 0x3a, 0x81, 0x25, 0xfd, 0x24, 0x53, 0xdd, - 0x98, 0x4a, 0xc3, 0xa4, 0xa3, 0x1d, 0x28, 0xc8, 0x37, 0x7d, 0xa4, 0xbe, 0xc1, 0xc5, 0x7e, 0x13, - 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x0b, 0xd6, 0x1c, 0xa8, 0x8f, 0xfd, 0xe8, 0x7a, 0xea, 0x80, - 0x18, 0x68, 0xbc, 0x3e, 0x8d, 0x84, 0x0b, 0x6e, 0x41, 0x39, 0xfa, 0x7e, 0x89, 0x36, 0xce, 0x7b, - 0x3c, 0xad, 0xae, 0x4d, 0xa1, 0x08, 0xa4, 0x46, 0xf7, 0x43, 0x1b, 0xa9, 0x47, 0x49, 0x92, 0x9a, - 0xf0, 0xa6, 0x89, 0x67, 0xd0, 0x8f, 0x00, 0x4d, 0x3e, 0xca, 0xa1, 0x1b, 0x17, 0x79, 0x40, 0xac, - 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x84, 0xc5, 0x89, 0xe7, 0x24, 0xf4, 0x35, 0x85, 0x35, 0xed, - 0x99, 0xae, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xab, 0x4e, 0x44, 0x81, 0xd4, 0xf7, 0xa3, - 0x88, 0x02, 0x29, 0x4f, 0x43, 0x3c, 0xd6, 0xe4, 0xb4, 0x18, 0x89, 0xb5, 0xd8, 0x54, 0x19, 0x89, - 0xb5, 0xc8, 0x78, 0x89, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, 0xae, - 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x59, 0x8a, 0x8b, 0x9a, - 0xfa, 0x6c, 0x15, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, 0x78, - 0xf0, 0x0c, 0xea, 0xb2, 0x5f, 0xcb, 0x26, 0x8a, 0x37, 0xba, 0x19, 0xe5, 0x49, 0x6b, 0x74, 0xaa, - 0x37, 0xce, 0xa5, 0xe3, 0xfb, 0xd4, 0xa1, 0x18, 0x14, 0x50, 0xf4, 0x81, 0xc2, 0x14, 0x2f, 0xe7, - 0xd5, 0xd5, 0xe4, 0xc5, 0xc0, 0x07, 0xa2, 0x88, 0x45, 0x7c, 0x10, 0x2d, 0x94, 0x11, 0x1f, 0xa8, - 0x35, 0x0f, 0xcf, 0xa0, 0xc7, 0x00, 0x61, 0x19, 0x42, 0x57, 0x23, 0x55, 0x3b, 0x56, 0xc8, 0xaa, - 0xd5, 0x94, 0x55, 0x69, 0xfd, 0x39, 0xb5, 0x2a, 0x45, 0xbc, 0x99, 0x50, 0xae, 0xaa, 0x15, 0xf5, - 0x79, 0x95, 0xde, 0xd6, 0x78, 0x06, 0x3d, 0x82, 0x72, 0xb4, 0x58, 0x45, 0xee, 0x83, 0xc4, 0x3a, - 0x96, 0x28, 0xe7, 0x25, 0xe8, 0x69, 0x55, 0x0c, 0xdd, 0x8e, 0x4a, 0x9c, 0x56, 0xea, 0x12, 0x65, - 0x5b, 0xb0, 0x92, 0x5c, 0x8f, 0xd0, 0x66, 0x54, 0x72, 0x7a, 0x15, 0xac, 0xde, 0xbc, 0x00, 0x25, - 0xb3, 0xea, 0xce, 0xbd, 0x3f, 0xbe, 0x5b, 0xd3, 0xfe, 0xf6, 0x6e, 0x4d, 0xfb, 0xfb, 0xbb, 0x35, - 0xed, 0x57, 0xff, 0x58, 0x9b, 0x01, 0xdc, 0xee, 0xd5, 0xda, 0xc4, 0xb5, 0x6b, 0xa6, 0xd5, 0x6f, - 0x93, 0x9a, 0xb3, 0x55, 0x93, 0x92, 0xdc, 0x61, 0xdb, 0x23, 0xee, 0x98, 0xb8, 0x2f, 0x33, 0xc3, - 0xe3, 0xe3, 0x4b, 0xec, 0xff, 0x18, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x80, 0xfc, 0x36, - 0x8a, 0xa9, 0x21, 0x00, 0x00, + // 2598 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, + 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0x6d, 0x93, 0xf4, 0xfe, + 0xaa, 0x6e, 0xda, 0xdd, 0x9f, 0x4b, 0xb3, 0x2b, 0xb6, 0x74, 0xb7, 0x5b, 0xf2, 0xc7, 0x75, 0x03, + 0x4d, 0x5c, 0x26, 0x6e, 0x0b, 0x95, 0x50, 0x99, 0xd8, 0xd7, 0xb1, 0x37, 0xe3, 0x19, 0x77, 0x66, + 0xec, 0x36, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x42, 0xbc, 0xf0, 0x8a, 0x10, 0xdf, 0x81, 0x07, 0x24, + 0x5e, 0x11, 0x02, 0xc1, 0x47, 0x40, 0x45, 0xe2, 0x99, 0x8f, 0x80, 0xee, 0xbf, 0x99, 0x3b, 0xe3, + 0x19, 0x27, 0x05, 0xed, 0x0b, 0x6f, 0x3e, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0xff, 0xee, 0x39, 0xe7, + 0x8e, 0x61, 0x65, 0xe8, 0x3a, 0xbe, 0xe3, 0xdd, 0x71, 0xb6, 0xda, 0x8e, 0xed, 0xbb, 0x8e, 0x55, + 0x63, 0x08, 0x54, 0x0c, 0x10, 0x78, 0x05, 0x96, 0xeb, 0x63, 0x62, 0xfb, 0xaf, 0x0e, 0x88, 0xe7, + 0x78, 0x8f, 0x89, 0xe9, 0xfa, 0xc7, 0xc4, 0xf4, 0xf1, 0x02, 0xcc, 0x1f, 0xf9, 0xa6, 0x3f, 0xf2, + 0x0c, 0xf2, 0x7a, 0x44, 0x3c, 0x1f, 0x1f, 0x43, 0x49, 0x22, 0x86, 0xd6, 0x19, 0x5a, 0x86, 0x9c, + 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x0d, 0x6d, 0xb3, 0x68, 0x70, 0x00, 0x3d, 0x80, 0x79, 0x8f, 0x11, + 0x3d, 0x1b, 0x76, 0x4c, 0x9f, 0x78, 0x7a, 0x66, 0x63, 0x76, 0xb3, 0xb4, 0x75, 0xa5, 0x16, 0x9e, + 0xe0, 0x48, 0x59, 0x37, 0xa2, 0xd4, 0xf8, 0x2f, 0x1a, 0xcc, 0xa9, 0xeb, 0xe8, 0x13, 0xc8, 0x59, + 0x64, 0x4c, 0x2c, 0xb6, 0x4b, 0x79, 0xeb, 0x5a, 0x8a, 0x9c, 0xda, 0x13, 0x4a, 0x64, 0x70, 0x5a, + 0xb4, 0x0f, 0xe5, 0x41, 0x44, 0x19, 0x3d, 0xb3, 0xa1, 0x6d, 0x96, 0xb6, 0xd6, 0x15, 0xee, 0x24, + 0x9d, 0x1f, 0xcf, 0x18, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x5e, 0x7d, + 0xe7, 0x59, 0xa3, 0x32, 0x83, 0x0a, 0x90, 0xdd, 0x3f, 0x7c, 0xd4, 0xac, 0x68, 0xa8, 0x04, 0xf9, + 0x17, 0xdb, 0xc6, 0xe1, 0xfe, 0x61, 0xa3, 0x92, 0xa1, 0x14, 0x75, 0xc3, 0x68, 0x1a, 0x95, 0xd9, + 0x9d, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0a, 0x57, 0x1a, 0xc4, 0x7f, 0xe4, 0x9a, 0x03, 0xf2, 0xc6, + 0x71, 0x4f, 0xf7, 0xed, 0xae, 0x23, 0xcd, 0xf9, 0x1b, 0x0d, 0xf2, 0xcf, 0x89, 0xeb, 0xf5, 0x1d, + 0x9b, 0xda, 0x72, 0x60, 0x7e, 0xe5, 0xb8, 0x4c, 0xcb, 0x9c, 0xc1, 0x01, 0x86, 0xed, 0xdb, 0x8e, + 0xcb, 0x4e, 0x4f, 0xb1, 0x14, 0xa0, 0xd8, 0xa1, 0xe9, 0xb7, 0x7b, 0xfa, 0x2c, 0xc7, 0x32, 0x80, + 0x62, 0x8f, 0x47, 0x7d, 0xab, 0xa3, 0x67, 0xb9, 0x37, 0x18, 0x80, 0x36, 0xa0, 0x34, 0x74, 0x9d, + 0xce, 0xa8, 0xed, 0x1f, 0x9a, 0x03, 0xa2, 0xe7, 0xd8, 0x9a, 0x8a, 0x42, 0x6b, 0x00, 0x63, 0x7e, + 0x88, 0x23, 0xdf, 0xd5, 0x2f, 0x31, 0x02, 0x05, 0x83, 0x7f, 0x9e, 0x81, 0xcb, 0x93, 0x1a, 0x50, + 0xff, 0x6f, 0x40, 0xa9, 0x1b, 0x60, 0x3b, 0x22, 0x0a, 0x54, 0x14, 0xfa, 0x18, 0x16, 0x89, 0x3d, + 0xee, 0xbb, 0x8e, 0x3d, 0x20, 0xb6, 0xef, 0xed, 0x3a, 0x23, 0xdb, 0x17, 0xba, 0x4c, 0x2e, 0xd0, + 0x93, 0xf8, 0xa6, 0x77, 0x2a, 0xc8, 0xb8, 0x72, 0x0a, 0x26, 0x8c, 0xb7, 0xac, 0x1a, 0x6f, 0x6b, + 0x00, 0x3d, 0xc7, 0x93, 0xc2, 0x73, 0x9c, 0x2b, 0xc4, 0x20, 0x0c, 0x73, 0x7d, 0xdb, 0xf3, 0x4d, + 0xbb, 0x4d, 0x98, 0x09, 0xb8, 0x86, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0x42, 0x63, 0x3d, 0xcf, 0xe2, + 0x04, 0x29, 0x71, 0x22, 0x5c, 0x64, 0x48, 0x12, 0x7c, 0x0b, 0x16, 0x5a, 0xc4, 0x74, 0x3b, 0xce, + 0x1b, 0x5b, 0xb8, 0x12, 0xad, 0xc0, 0x25, 0x97, 0x98, 0x9e, 0x63, 0x0b, 0x2b, 0x08, 0x88, 0xa6, + 0x50, 0x48, 0x3a, 0xb4, 0xce, 0xb0, 0x0e, 0x2b, 0x0d, 0xe2, 0xd7, 0x15, 0xdd, 0x65, 0x34, 0xbc, + 0x85, 0xe5, 0x89, 0x95, 0x8b, 0x59, 0xf9, 0x4b, 0x98, 0x53, 0x8d, 0x29, 0x12, 0xae, 0xaa, 0x86, + 0x7a, 0xb8, 0xcc, 0xdc, 0x17, 0xa1, 0xc7, 0x7f, 0xca, 0xc2, 0x42, 0x8c, 0x02, 0x95, 0x21, 0xd3, + 0x97, 0x9b, 0x65, 0xfa, 0x2c, 0x8e, 0xda, 0x2e, 0x31, 0x7d, 0xd2, 0x79, 0xd1, 0x23, 0x36, 0xf3, + 0x61, 0xd1, 0x50, 0x51, 0xa1, 0x77, 0x66, 0x55, 0xef, 0xd4, 0x20, 0xc7, 0x3c, 0xa8, 0x67, 0xd9, + 0xa1, 0x74, 0x35, 0x7b, 0x7b, 0x8e, 0xeb, 0xb7, 0x4c, 0x8f, 0x47, 0x14, 0x27, 0x43, 0x55, 0x28, + 0xb8, 0x8e, 0xe3, 0x1b, 0x8e, 0x25, 0x83, 0x35, 0x80, 0xd1, 0x6d, 0xa8, 0xb4, 0x47, 0xae, 0x4b, + 0x6c, 0xdf, 0x18, 0xd9, 0x87, 0xa3, 0xc1, 0x31, 0xe1, 0xf1, 0x3a, 0x6f, 0x4c, 0xe0, 0xd1, 0x1e, + 0x14, 0x3a, 0xa4, 0x6b, 0x8e, 0x2c, 0xdf, 0xd3, 0xf3, 0x6c, 0xeb, 0xcd, 0x74, 0x7b, 0xd4, 0xf6, + 0x04, 0x69, 0xdd, 0xf6, 0xdd, 0x33, 0x23, 0xe0, 0x44, 0xf7, 0x20, 0x3b, 0x36, 0x5d, 0x4f, 0x2f, + 0x30, 0x09, 0x37, 0xa6, 0x48, 0x78, 0x6e, 0xba, 0x82, 0x9b, 0x71, 0xd0, 0xfd, 0x47, 0x1e, 0x71, + 0x29, 0x5a, 0x2f, 0x9e, 0xbb, 0xff, 0x33, 0x41, 0x2a, 0xf6, 0x97, 0x9c, 0xd5, 0xcf, 0x61, 0x3e, + 0x72, 0x34, 0x54, 0x81, 0xd9, 0x53, 0x72, 0x26, 0xfc, 0x42, 0x7f, 0x52, 0xb3, 0x8f, 0x4d, 0x6b, + 0x44, 0x84, 0x4b, 0x38, 0x70, 0x3f, 0x73, 0x4f, 0xab, 0x7e, 0x06, 0xc5, 0x40, 0xe6, 0x7b, 0x31, + 0x7e, 0x0e, 0xf3, 0x91, 0x03, 0xbd, 0x0f, 0x33, 0xfe, 0xbd, 0x06, 0x97, 0x0f, 0xc9, 0x1b, 0x45, + 0x43, 0x99, 0x23, 0xb7, 0xa1, 0x42, 0x03, 0xb6, 0x6b, 0x39, 0x6f, 0x5a, 0x64, 0x30, 0xb4, 0xc2, + 0xca, 0x31, 0x81, 0x47, 0x5f, 0x0a, 0xc3, 0xf3, 0x50, 0xbe, 0xad, 0x98, 0x2e, 0x51, 0x76, 0xdc, + 0xfc, 0xff, 0xb1, 0xee, 0xf8, 0x08, 0x96, 0xe2, 0x3b, 0xd0, 0x24, 0xfc, 0x02, 0x4a, 0x4a, 0xca, + 0x30, 0x51, 0xd3, 0x33, 0x4c, 0x25, 0xc7, 0x1f, 0xb2, 0x1b, 0x34, 0xc1, 0x24, 0xb1, 0x2c, 0xc3, + 0x3f, 0xd1, 0x60, 0x29, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x40, 0x41, 0x1a, 0x58, 0x94, 0xc1, + 0x25, 0x85, 0x95, 0xa6, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xdd, 0xe5, 0xcb, 0xe7, + 0x1f, 0x1a, 0x3d, 0x84, 0xac, 0x7f, 0x36, 0xe4, 0xb6, 0x2c, 0x6f, 0x7d, 0xa4, 0x88, 0x4e, 0x95, + 0x51, 0x6b, 0x0e, 0x29, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xeb, 0xea, 0x61, 0xb3, + 0xf9, 0xb4, 0x32, 0x83, 0x10, 0x94, 0x8f, 0x5a, 0xdb, 0x46, 0xeb, 0xd5, 0xf6, 0x6e, 0x6b, 0xff, + 0xf9, 0x7e, 0xeb, 0x07, 0x15, 0x0d, 0x2d, 0xc2, 0xfc, 0x51, 0xab, 0xf9, 0x34, 0x44, 0x65, 0xd0, + 0x3c, 0x14, 0x77, 0x9b, 0x87, 0x8f, 0xf6, 0x1b, 0xcf, 0x8c, 0x7a, 0x65, 0x96, 0x16, 0x60, 0xa3, + 0x7e, 0x54, 0x6f, 0x55, 0xb2, 0x68, 0x0e, 0x0a, 0x8d, 0xe6, 0x2b, 0x5e, 0x8e, 0x73, 0xf8, 0x14, + 0xae, 0x24, 0x1d, 0x86, 0xda, 0x36, 0xae, 0x4e, 0x70, 0x8f, 0x65, 0xd4, 0x7b, 0x2c, 0xe9, 0xee, + 0x99, 0x4d, 0xbe, 0x7b, 0xf0, 0x2f, 0x35, 0xd0, 0x0f, 0x9c, 0x4e, 0xbf, 0x7b, 0x76, 0x21, 0xeb, + 0x81, 0x33, 0x24, 0xae, 0xe9, 0xf7, 0x1d, 0x5b, 0xc6, 0xfb, 0x7a, 0xb2, 0x67, 0x9b, 0x92, 0xce, + 0x50, 0x58, 0xd0, 0x4d, 0x28, 0xbb, 0xa4, 0xed, 0xd8, 0xdd, 0xfe, 0xc9, 0xc8, 0x25, 0xdb, 0x96, + 0xc5, 0xce, 0x55, 0x30, 0x62, 0x58, 0xfc, 0x6b, 0x0d, 0x96, 0x93, 0x84, 0xa1, 0xfb, 0xc2, 0x7f, + 0xbc, 0xbf, 0xba, 0x79, 0xce, 0xde, 0x11, 0xd7, 0xf1, 0xeb, 0xda, 0xe2, 0x85, 0x35, 0x23, 0xaf, + 0x6b, 0x0e, 0xe3, 0xbb, 0x09, 0x6e, 0x5d, 0x80, 0x92, 0x51, 0x3f, 0x68, 0x3e, 0xaf, 0xbf, 0x32, + 0x9a, 0x4f, 0xa8, 0xc7, 0xe6, 0xa0, 0xb0, 0xbd, 0xb7, 0xc7, 0xa1, 0x2c, 0xfe, 0xa9, 0x06, 0x2b, + 0x09, 0x96, 0xa3, 0x6e, 0xfa, 0x2e, 0x54, 0xba, 0x66, 0xdf, 0x22, 0x9d, 0x66, 0x68, 0x2d, 0xed, + 0x62, 0xd6, 0x9a, 0x60, 0x14, 0x4e, 0xc8, 0x4c, 0xfa, 0x5c, 0xad, 0x5d, 0x78, 0x1f, 0x56, 0xf7, + 0x88, 0xe7, 0xbb, 0xce, 0x45, 0xfc, 0x78, 0x15, 0x8a, 0xa7, 0x84, 0x0c, 0x5b, 0xac, 0xd8, 0x65, + 0x98, 0x07, 0x42, 0x04, 0x26, 0x70, 0x25, 0x49, 0x14, 0x55, 0xec, 0x3b, 0xb0, 0xd8, 0xb6, 0x88, + 0x69, 0x8f, 0x38, 0x29, 0x43, 0x8a, 0x0c, 0xbf, 0xaa, 0xe6, 0x52, 0x9c, 0xc6, 0x98, 0x64, 0xc3, + 0x7f, 0xd6, 0x60, 0xfd, 0x28, 0x72, 0x7f, 0x3c, 0x75, 0x69, 0xa8, 0xf8, 0x7d, 0xe2, 0xa5, 0x1d, + 0xfc, 0x25, 0xc0, 0x30, 0x20, 0x12, 0x01, 0x78, 0x5f, 0x2d, 0xd3, 0xd3, 0xe5, 0xd5, 0x42, 0x0c, + 0xbf, 0x80, 0x15, 0x69, 0xd5, 0x07, 0xb0, 0x10, 0x5b, 0x7e, 0xaf, 0xcb, 0x78, 0x1d, 0xae, 0xa5, + 0xef, 0x4e, 0xf5, 0xf5, 0x60, 0xbd, 0xf1, 0x9e, 0xea, 0xea, 0x90, 0x7f, 0x3d, 0x22, 0xae, 0xd4, + 0xb5, 0x68, 0x48, 0x90, 0x26, 0x12, 0x79, 0xdb, 0xb6, 0x46, 0x1d, 0xd2, 0xb0, 0x9c, 0x63, 0xd3, + 0xf2, 0x64, 0x22, 0x45, 0xb1, 0xf8, 0x77, 0x1a, 0x5c, 0x6b, 0x4c, 0x3b, 0x16, 0xfa, 0x7e, 0xc4, + 0xa4, 0x3c, 0x4a, 0xef, 0x29, 0x26, 0x9d, 0xca, 0xfd, 0x75, 0x1a, 0xf4, 0x9f, 0x1a, 0xcc, 0x47, + 0xda, 0x2e, 0x84, 0x20, 0x6b, 0xd3, 0xe4, 0xe5, 0xec, 0xec, 0x37, 0x6d, 0x66, 0x2d, 0xa7, 0x7d, + 0x4a, 0x3a, 0x22, 0x8e, 0x05, 0x44, 0xf1, 0xb4, 0x49, 0xdb, 0xef, 0x88, 0x34, 0x11, 0x10, 0xc5, + 0xf3, 0x19, 0x4e, 0x34, 0xe6, 0x02, 0x0a, 0xb3, 0x2a, 0xa7, 0xde, 0xa4, 0x57, 0xa1, 0xd8, 0xb6, + 0x4c, 0xcf, 0x53, 0x9a, 0xf1, 0x10, 0x81, 0xea, 0x50, 0xee, 0x90, 0xa1, 0xe5, 0x9c, 0xc9, 0x52, + 0x26, 0x1a, 0x72, 0x75, 0xec, 0xa3, 0x87, 0xdf, 0x8b, 0x10, 0x19, 0x31, 0x26, 0x5a, 0x48, 0xd1, + 0x24, 0x19, 0xbd, 0xae, 0xe8, 0x64, 0xa0, 0x68, 0x1c, 0xc0, 0x34, 0x30, 0xcc, 0x13, 0x4a, 0x28, + 0x2f, 0x06, 0x09, 0xd2, 0x15, 0xa7, 0xdb, 0x25, 0x6e, 0xa0, 0xb8, 0x04, 0xe9, 0xec, 0x41, 0xde, + 0x92, 0xf6, 0xc8, 0x77, 0xe8, 0x22, 0xd7, 0x5e, 0xc1, 0xe0, 0x45, 0x58, 0x68, 0x10, 0x5f, 0x24, + 0x28, 0x6f, 0xf3, 0x1f, 0xc2, 0x7c, 0x88, 0xa2, 0xc1, 0x12, 0x74, 0xc8, 0xda, 0x85, 0x3a, 0x64, + 0xbc, 0x09, 0x65, 0x21, 0x40, 0x19, 0x3e, 0x84, 0x5f, 0x34, 0xd5, 0x2f, 0xf8, 0x33, 0x98, 0x0b, + 0x28, 0xe9, 0x4e, 0x1f, 0x42, 0x96, 0xae, 0x88, 0xcb, 0x65, 0x29, 0x66, 0x51, 0xb6, 0x07, 0x23, + 0xc0, 0x75, 0x98, 0xa7, 0x98, 0x5d, 0xea, 0x95, 0xd4, 0x28, 0xa1, 0x13, 0x01, 0x67, 0x3f, 0x70, + 0x3a, 0x24, 0x98, 0x08, 0x42, 0x14, 0xfe, 0x31, 0x94, 0x76, 0x9d, 0xc1, 0xc0, 0xb4, 0x3b, 0x4c, + 0x48, 0x05, 0x66, 0x89, 0x3d, 0x66, 0x6a, 0x16, 0x0d, 0xfa, 0x93, 0x05, 0x48, 0x8f, 0x58, 0x96, + 0x88, 0x33, 0x0e, 0x84, 0xe1, 0x3b, 0xab, 0x84, 0x2f, 0x0d, 0x1b, 0xd3, 0x3d, 0x19, 0xf1, 0x09, + 0x27, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, 0x34, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x01, 0x94, + 0x76, 0x7b, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, 0xa4, 0xb4, 0x2e, 0x45, 0x51, 0xd2, 0x98, 0x35, + 0xdd, 0x13, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, 0xaf, 0x59, 0x28, 0x04, 0x69, 0xf3, 0x4d, 0x28, + 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, 0x1d, 0x17, 0x92, 0x52, 0xbe, 0xb6, 0xb4, 0xaa, + 0xe8, 0xc5, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, 0x21, 0x29, 0xfa, 0x36, 0x2c, 0xf4, 0xed, 0x63, + 0x67, 0x64, 0x77, 0x84, 0x4a, 0xf4, 0x72, 0xa2, 0xe1, 0xb2, 0xa2, 0x96, 0x88, 0x50, 0x5b, 0x23, + 0x4e, 0x8e, 0x76, 0xa0, 0xe2, 0x8c, 0xfc, 0xa8, 0x88, 0xec, 0x54, 0x11, 0x13, 0xf4, 0xe8, 0x1e, + 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, + 0x3d, 0x35, 0xfd, 0x9e, 0xc8, 0xf9, 0x00, 0xa6, 0xfe, 0x26, 0xf6, 0x78, 0xbf, 0xc3, 0x32, 0xbd, + 0x68, 0x70, 0x00, 0xed, 0x46, 0xee, 0x50, 0x3e, 0x42, 0xfd, 0x5f, 0x42, 0xc8, 0x7e, 0x9d, 0xd7, + 0xe5, 0x1d, 0x58, 0x8a, 0x96, 0x5d, 0x9e, 0x6f, 0x3a, 0xe4, 0x79, 0x86, 0x79, 0x22, 0x98, 0x25, + 0x88, 0x7f, 0xa6, 0xc1, 0xe2, 0x44, 0xa1, 0x46, 0xf7, 0xa1, 0x74, 0xda, 0xb7, 0x2c, 0xd2, 0x69, + 0x5d, 0x28, 0xcf, 0x55, 0x62, 0xf4, 0x05, 0xcc, 0xb9, 0x23, 0xdb, 0xee, 0xdb, 0x27, 0xb2, 0xb3, + 0x98, 0xce, 0x1c, 0xa1, 0xc6, 0xbb, 0xec, 0xfe, 0xa1, 0x1d, 0x7e, 0x70, 0xf8, 0xc0, 0xda, 0x9a, + 0x6a, 0xed, 0x2a, 0x14, 0x86, 0xa6, 0xdf, 0x3b, 0x1a, 0x92, 0xb6, 0xec, 0xe3, 0x24, 0x8c, 0x7f, + 0x91, 0x85, 0x82, 0x1c, 0x12, 0xd2, 0xea, 0x85, 0xb8, 0xff, 0x33, 0xc9, 0xf7, 0x7f, 0xe4, 0x45, + 0xa0, 0x0a, 0x85, 0xee, 0xc8, 0xb2, 0x58, 0x28, 0xf0, 0x1b, 0x33, 0x80, 0x55, 0xcb, 0xe6, 0x22, + 0x96, 0x45, 0xb7, 0x20, 0x47, 0x1b, 0x4b, 0x4f, 0xbf, 0xc4, 0x0c, 0x90, 0x38, 0xc0, 0x70, 0x0a, + 0xf4, 0x60, 0x62, 0xf4, 0xbf, 0x9e, 0x40, 0x9d, 0x3a, 0xf3, 0xdf, 0x8d, 0xcc, 0xfc, 0xd7, 0x92, + 0x58, 0xe3, 0xc3, 0xfe, 0x83, 0x89, 0x61, 0x3f, 0x71, 0xc7, 0xff, 0xa1, 0x29, 0xff, 0x3e, 0xab, + 0x62, 0x22, 0xb0, 0x68, 0x8c, 0x07, 0xfe, 0xd1, 0xce, 0xf3, 0x0f, 0xfe, 0xad, 0x06, 0x1f, 0x34, + 0x88, 0xff, 0x22, 0x36, 0xf3, 0x07, 0x11, 0xba, 0x01, 0x25, 0x97, 0x0c, 0x9d, 0xa7, 0xa6, 0xef, + 0x13, 0x57, 0x3e, 0xa8, 0xa9, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0x19, 0xf7, 0xbd, 0xbe, 0x63, 0x4b, + 0x2a, 0x7e, 0xc2, 0x38, 0x9a, 0xca, 0x32, 0x2d, 0x6b, 0xc7, 0x35, 0xed, 0x76, 0x8f, 0xc8, 0x86, + 0x4e, 0x45, 0xb1, 0xb2, 0x6f, 0x59, 0x2d, 0xf3, 0x84, 0x77, 0x2f, 0x05, 0x43, 0x82, 0xf8, 0x18, + 0x96, 0xe3, 0x67, 0x94, 0x29, 0x40, 0x0f, 0x23, 0x53, 0x80, 0xfe, 0x66, 0xf7, 0x9b, 0x7c, 0xd3, + 0x10, 0xf9, 0x23, 0x61, 0x36, 0x23, 0x89, 0x63, 0x89, 0x4c, 0x08, 0x60, 0xfc, 0x15, 0xac, 0x26, + 0x9b, 0x82, 0xda, 0xf4, 0x00, 0x16, 0xe3, 0x0f, 0x23, 0x49, 0x33, 0x4f, 0xd2, 0x21, 0x8d, 0x49, + 0x4e, 0x8c, 0xa0, 0xf2, 0xa4, 0xef, 0xd1, 0xa9, 0xc3, 0x51, 0x5e, 0xf4, 0x0b, 0x14, 0x4e, 0x4d, + 0x6d, 0x1d, 0xf2, 0x22, 0x31, 0x44, 0x8d, 0x96, 0x20, 0xf5, 0x81, 0xf8, 0x69, 0x44, 0x95, 0x8b, + 0xa3, 0xf1, 0x6b, 0x28, 0x2b, 0xfb, 0xca, 0x60, 0xa1, 0x50, 0x52, 0xb0, 0x88, 0xd3, 0x18, 0x9c, + 0x02, 0x7d, 0x0a, 0x97, 0x4f, 0x58, 0xdf, 0xbd, 0x17, 0xdb, 0x8c, 0x5b, 0x39, 0x79, 0x11, 0x1f, + 0x42, 0x79, 0xbb, 0xd3, 0xa1, 0xb2, 0x64, 0x50, 0x25, 0x29, 0x97, 0xa0, 0x42, 0x26, 0x59, 0x05, + 0x03, 0xe6, 0x02, 0x79, 0xbc, 0x67, 0x43, 0x36, 0x79, 0x13, 0x3f, 0x12, 0x97, 0x9d, 0xb0, 0x42, + 0x77, 0xef, 0xcb, 0x8a, 0x5f, 0x34, 0xd8, 0x6f, 0x7c, 0x0b, 0x16, 0x0d, 0x32, 0x70, 0xc6, 0x44, + 0x3d, 0xe6, 0x32, 0xe4, 0xfa, 0x76, 0x87, 0xbc, 0x95, 0x9f, 0x01, 0x18, 0x80, 0xbf, 0x05, 0x0b, + 0x2a, 0x29, 0x3d, 0xc1, 0x4d, 0x28, 0xab, 0xfb, 0x04, 0xe1, 0x18, 0xc3, 0xe2, 0x8f, 0x60, 0xc9, + 0x20, 0x5d, 0x97, 0x78, 0x3d, 0xd5, 0xef, 0x29, 0xfb, 0xfc, 0x3f, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, + 0x3e, 0x9d, 0xfc, 0x01, 0x1b, 0x36, 0x1b, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, + 0xff, 0x1e, 0x9b, 0xee, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, + 0xc2, 0x07, 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, + 0xff, 0x6c, 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0x6f, 0x44, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, + 0xf2, 0x0f, 0x4c, 0x48, 0x9f, 0xf8, 0xe6, 0x24, 0x8e, 0x58, 0x5d, 0x49, 0x58, 0xa1, 0x83, 0xe9, + 0xcc, 0x37, 0x34, 0xf4, 0x12, 0x2a, 0xf1, 0xef, 0x26, 0x08, 0x47, 0xa7, 0xc0, 0xa4, 0xcf, 0x42, + 0xd5, 0x8d, 0xa9, 0x34, 0x4c, 0x3a, 0xda, 0x81, 0x82, 0xfc, 0xae, 0x80, 0xd4, 0x77, 0xc0, 0xd8, + 0x77, 0x89, 0xaa, 0x9e, 0xb8, 0xc6, 0x65, 0xbc, 0x60, 0xcd, 0x81, 0xfa, 0xc1, 0x01, 0x5d, 0x4f, + 0x1d, 0x52, 0x03, 0x8d, 0xd7, 0xa7, 0x91, 0x70, 0xc1, 0x2d, 0x28, 0x47, 0xdf, 0x50, 0xd1, 0xc6, + 0x79, 0x0f, 0xb8, 0xd5, 0xb5, 0x29, 0x14, 0x81, 0xd4, 0xe8, 0x7e, 0x68, 0x23, 0xf5, 0x28, 0x49, + 0x52, 0x13, 0xde, 0x55, 0xf1, 0x0c, 0xfa, 0x11, 0xa0, 0xc9, 0x87, 0x41, 0x74, 0xe3, 0x22, 0x8f, + 0x98, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x87, 0xb0, 0x38, 0xf1, 0xa4, 0x85, 0xd4, 0x4e, 0x36, + 0xed, 0xa9, 0xb0, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xcb, 0x52, 0x44, 0x81, 0xd4, 0x37, + 0xac, 0x88, 0x02, 0x29, 0xcf, 0x53, 0x3c, 0xd6, 0xe4, 0xc4, 0x1a, 0x89, 0xb5, 0xd8, 0x64, 0x1b, + 0x89, 0xb5, 0xc8, 0x88, 0x8b, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, + 0xae, 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x69, 0x8c, 0x8b, + 0x9a, 0xfa, 0x74, 0x16, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, + 0x78, 0xf0, 0x0c, 0xea, 0xb2, 0x2f, 0x76, 0x13, 0xc5, 0x1b, 0xdd, 0x8c, 0xf2, 0xa4, 0x35, 0x3a, + 0xd5, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xea, 0x50, 0x0c, 0x0a, 0x28, 0xfa, 0x40, 0x61, 0x8a, 0x97, + 0xf3, 0xea, 0x6a, 0xf2, 0x62, 0xe0, 0x03, 0x51, 0xc4, 0x22, 0x3e, 0x88, 0x16, 0xca, 0x88, 0x0f, + 0xd4, 0x9a, 0x87, 0x67, 0xd0, 0x63, 0x80, 0xb0, 0x0c, 0xa1, 0xab, 0x91, 0xaa, 0x1d, 0x2b, 0x64, + 0xd5, 0x6a, 0xca, 0xaa, 0xb4, 0xfe, 0x9c, 0x5a, 0x95, 0x22, 0xde, 0x4c, 0x28, 0x57, 0xd5, 0x8a, + 0xfa, 0xc4, 0x4b, 0x6f, 0x6b, 0x3c, 0x83, 0x1e, 0x41, 0x39, 0x5a, 0xac, 0x22, 0xf7, 0x41, 0x62, + 0x1d, 0x4b, 0x94, 0xf3, 0x12, 0xf4, 0xb4, 0x2a, 0x86, 0x6e, 0x47, 0x25, 0x4e, 0x2b, 0x75, 0x89, + 0xb2, 0x2d, 0x58, 0x49, 0xae, 0x47, 0x68, 0x33, 0x2a, 0x39, 0xbd, 0x0a, 0x56, 0x6f, 0x5e, 0x80, + 0x92, 0x59, 0x75, 0xe7, 0xde, 0x1f, 0xdf, 0xad, 0x69, 0x7f, 0x7b, 0xb7, 0xa6, 0xfd, 0xfd, 0xdd, + 0x9a, 0xf6, 0xab, 0x7f, 0xac, 0xcd, 0x00, 0x6e, 0xf7, 0x6a, 0x6d, 0xe2, 0xda, 0x35, 0xd3, 0xea, + 0xb7, 0x49, 0xcd, 0xd9, 0xaa, 0x49, 0x49, 0xee, 0xb0, 0xed, 0x11, 0x77, 0x4c, 0xdc, 0x97, 0x99, + 0xe1, 0xf1, 0xf1, 0x25, 0xf6, 0x9f, 0x90, 0x4f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x21, + 0x23, 0x05, 0x2d, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -6263,6 +6273,25 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } + } if len(m.EnvId) > 0 { i -= len(m.EnvId) copy(dAtA[i:], m.EnvId) @@ -8116,6 +8145,14 @@ func (m *TaskInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -13776,6 +13813,133 @@ func (m *TaskInfo) Unmarshal(dAtA []byte) error { } m.EnvId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Properties == nil { + m.Properties = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Properties[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9be1ff4de..394c21e1e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -278,6 +278,7 @@ message TaskInfo { CommandInfo commandInfo = 5; string taskPath = 6; string envId = 7; + map properties = 9; } message CleanupTasksRequest { From e190585e09dba68c9f53a7f62d620855192b5fab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Feb 2020 17:31:32 +0100 Subject: [PATCH 0118/2352] [coconut] Variables output in role query --- coconut/control/control.go | 29 +++++++++++++++++++++++------ coconut/control/controlutil.go | 2 +- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index c0c076d68..ba4823026 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -174,6 +174,9 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C err = errors.New("cannot create empty environment") return } + // FIXME: add support for userVars here + // TODO: add support for setting visibility here OCTRL-178 + // TODO: add support for acquiring bot config here OCTRL-177 var response *pb.NewEnvironmentReply response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath}, grpc.EmptyCallOption{}) @@ -507,12 +510,26 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "no roles found") } else { for i, root := range roots { - fmt.Fprintf(o, "(%s)\n", yellow(i)) - fmt.Fprintf(o, "role path: %s\n", root.GetFullPath()) - fmt.Fprintf(o, "status: %s\n", root.GetStatus()) - fmt.Fprintf(o, "state: %s\n", root.GetState()) - - fmt.Fprintf(o, "subtree:\n") + var ( + defaultsStr = stringMapToString(root.Defaults, "\t") + varsStr = stringMapToString(root.Vars, "\t") + userVarsStr = stringMapToString(root.UserVars, "\t") + ) + + _, _ = fmt.Fprintf(o, "(%s)\n", yellow(i)) + _, _ = fmt.Fprintf(o, "role path: %s\n", root.GetFullPath()) + _, _ = fmt.Fprintf(o, "status: %s\n", root.GetStatus()) + _, _ = fmt.Fprintf(o, "state: %s\n", root.GetState()) + if len(defaultsStr) != 0 { + _, _ = fmt.Fprintf(o, "defaults:\n%s\n", defaultsStr) + } + if len(varsStr) != 0 { + _, _ = fmt.Fprintf(o, "variables:\n%s\n", varsStr) + } + if len(userVarsStr) != 0 { + _, _ = fmt.Fprintf(o, "user-provided variables:\n%s\n", userVarsStr) + } + _, _ = fmt.Fprintf(o, "subtree:\n") drawWorkflow(root, o) } } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index 1d71c39ff..a65e7e4ca 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -118,7 +118,7 @@ func drawWorkflow(root *pb.RoleInfo, o io.Writer) { buildTree(&tree, n, 0) } } - fmt.Fprint(o, tree.String()) + _, _ = fmt.Fprint(o, tree.String()) } type linePrintFunc func(t *pb.ShortTaskInfo) []string From a5ff278f51e1ff3648333ea29211b01dee12c64e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Feb 2020 17:38:38 +0100 Subject: [PATCH 0119/2352] [core] Task properties --- core/server.go | 1 + core/task/manager.go | 6 +++++- core/task/task.go | 14 +++++++++++--- core/workflow/taskrole.go | 1 + core/workflow/tasktemplate.go | 6 +++--- 5 files changed, 21 insertions(+), 7 deletions(-) diff --git a/core/server.go b/core/server.go index 2a0c81784..57d186143 100644 --- a/core/server.go +++ b/core/server.go @@ -389,6 +389,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge CommandInfo: commandInfoToPbCommandInfo(commandInfo), TaskPath: taskPath, EnvId: task.GetEnvironmentId().String(), + Properties: task.GetProperties(), }, } return rep, nil diff --git a/core/task/manager.go b/core/task/manager.go index 40cbda31b..5d9c9d3fc 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -88,7 +88,11 @@ func NewManager(resourceOffersDone <-chan DeploymentMap, // constructed Task. // This function should only be called by the Mesos scheduler controller when // matching role requests with offers (matchRoles). -func (m *Manager) NewTaskForMesosOffer(offer *mesos.Offer, descriptor *Descriptor, bindPorts map[string]uint64, executorId mesos.ExecutorID) (t *Task) { +func (m *Manager) NewTaskForMesosOffer( + offer *mesos.Offer, + descriptor *Descriptor, + bindPorts map[string]uint64, + executorId mesos.ExecutorID) (t *Task) { newId := uuid.NewUUID().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), diff --git a/core/task/task.go b/core/task/task.go index bc1ec6043..064440791 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -32,6 +32,7 @@ package task import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" @@ -42,8 +43,6 @@ import ( var log = logger.New(logrus.StandardLogger(),"task") -type VarMap map[string]string - type parentRole interface { UpdateStatus(Status) UpdateState(State) @@ -52,7 +51,9 @@ type parentRole interface { SetTask(*Task) GetEnvironmentId() uuid.Array CollectOutboundChannels() []channel.Outbound - //GetVars() + GetDefaults() gera.StringMap + GetVars() gera.StringMap + GetUserVars() gera.StringMap } /* @@ -95,6 +96,8 @@ type Task struct { state State safeToStop bool + properties controlcommands.PropertyMap + GetTaskClass func() *TaskClass // ↑ to be filled in by NewTaskForMesosOffer in Manager } @@ -289,4 +292,9 @@ func (t Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { Value: t.GetTaskId(), }, } +} + +func (t *Task) GetProperties() controlcommands.PropertyMap { + return t.GetTaskClass().Properties + // FIXME: this should merge TaskClass properties and properties acquired from the workflow } \ No newline at end of file diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index eeabd1e6a..40f8048da 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -111,6 +111,7 @@ func (t *taskRole) updateState(s task.State) { func (t *taskRole) SetTask(taskPtr *task.Task) { t.Task = taskPtr + // FIXME: when this is called, properties or vars should be pushed to the task } func (t *taskRole) copy() copyable { diff --git a/core/workflow/tasktemplate.go b/core/workflow/tasktemplate.go index ab2f8d805..813aa81b0 100644 --- a/core/workflow/tasktemplate.go +++ b/core/workflow/tasktemplate.go @@ -35,11 +35,11 @@ type taskTemplate struct { stringTemplates map[string]template.Template `yaml:"-,omitempty"` } -func (at *taskTemplate) copy() copyable { +func (tt *taskTemplate) copy() copyable { rCopy := taskTemplate{ - taskRole: *at.taskRole.copy().(*taskRole), + taskRole: *tt.taskRole.copy().(*taskRole), } - copier.Copy(&rCopy.stringTemplates, &at.stringTemplates) + copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) return &rCopy } From fad6b65b9d1cfeea7fcdf7b10c6f76cdbeb3ce96 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Feb 2020 15:32:54 +0100 Subject: [PATCH 0120/2352] [coconut] Fix warning --- coconut/control/control.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index ba4823026..53e699c65 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -186,10 +186,10 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C env := response.GetEnvironment() tasks := env.GetTasks() - fmt.Fprintf(o, "new environment created with %s tasks\n", blue(len(tasks))) - fmt.Fprintf(o, "environment id: %s\n", grey(env.GetId())) - fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) - fmt.Fprintf(o, "root role: %s\n", env.GetRootRole()) + _, _ = fmt.Fprintf(o, "new environment created with %s tasks\n", blue(len(tasks))) + _, _ = fmt.Fprintf(o, "environment id: %s\n", grey(env.GetId())) + _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) + _, _ = fmt.Fprintf(o, "root role: %s\n", env.GetRootRole()) return } From d08c6956bb728f7e2d472b9c13cbd16c5a666d99 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Feb 2020 15:35:26 +0100 Subject: [PATCH 0121/2352] [core] Use the full roleBase unmarshal path in aggregatorRole This fixes a crash on GetEnvironment, caused by some fields in roleBase not being populated in the root role, because the roleBase unmarshal was not being called by the aggregatorRole unmarshaler --- core/workflow/aggregatorrole.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 50351e301..7f15afaf6 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -39,16 +39,15 @@ type aggregatorRole struct { func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // NOTE: see NOTE in roleBase.UnmarshalYAML - type _roleBase roleBase - role_base := _roleBase{} - err = unmarshal(&role_base) + innerRoleBase := roleBase{} + err = unmarshal(&innerRoleBase) if err != nil { return } role := aggregatorRole{ - roleBase: roleBase(role_base), + roleBase: innerRoleBase, } err = unmarshal(&role.aggregator) if err != nil { From 18a43678c029254ec23029d13a98f9381b39db92 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Feb 2020 17:48:15 +0100 Subject: [PATCH 0122/2352] [core] Output vars in GetEnvironment --- core/server.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/server.go b/core/server.go index 57d186143..3561d0d35 100644 --- a/core/server.go +++ b/core/server.go @@ -154,6 +154,9 @@ func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) Tasks: tasksToShortTaskInfos(tasks), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: env.GlobalDefaults.Raw(), + Vars: env.GlobalVars.Raw(), + UserVars: env.UserVars.Raw(), } r.Environments = append(r.Environments, e) From 3d6d0d604cf61b1f7c970d3bb852241411f7357b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Feb 2020 17:48:57 +0100 Subject: [PATCH 0123/2352] [coconut] Acquire --extra-vars when creating environment --- coconut/cmd/environment_create.go | 2 ++ coconut/control/control.go | 29 ++++++++++++++++++++++++++--- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index ced7025a7..10efc2f18 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -61,4 +61,6 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") + + environmentCreateCmd.Flags().StringSliceP("extra-vars", "e", []string{}, "values passed in using the key=value syntax, comma-separated, are interpreted as strings `--extra-vars key1=val1,key2=val2`") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 53e699c65..93ea32e96 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -174,12 +174,35 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C err = errors.New("cannot create empty environment") return } - // FIXME: add support for userVars here + + extraVars, err := cmd.Flags().GetStringSlice("extra-vars") + if err != nil { + return + } + if len(extraVars) == 0 { + err = errors.New("empty argument list supplied") + return + } + + extraVarsMap := make(map[string]string) + for _, entry := range extraVars { + if len(entry) < 3 { // can't be shorter than a=b + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + if strings.Count(entry, "=") != 1 { + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + entryKV := strings.Split(entry, "=") + extraVarsMap[entryKV[0]] = entryKV[1] + } + // TODO: add support for setting visibility here OCTRL-178 // TODO: add support for acquiring bot config here OCTRL-177 var response *pb.NewEnvironmentReply - response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath}, grpc.EmptyCallOption{}) + response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) if err != nil { return } @@ -257,7 +280,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } if printTasks { - fmt.Fprintln(o, "") + _, _ = fmt.Fprintln(o, "") drawTableShortTaskInfos(tasks, []string{fmt.Sprintf("task id (%d tasks)", len(tasks)), "class name", "hostname", "status", "state"}, func(t *pb.ShortTaskInfo) []string { From 399eeef3f0be0cd1c6a90aa4caaf877c85265164 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 Feb 2020 10:43:18 +0100 Subject: [PATCH 0124/2352] [misc] Update default executor path to a generic one --- hacking/settings.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hacking/settings.yaml b/hacking/settings.yaml index b93d5dca5..d2e9fe251 100644 --- a/hacking/settings.yaml +++ b/hacking/settings.yaml @@ -1,6 +1,6 @@ --- controlport: 47102 -executor: /opt/alisw/el7/Control-Core/v0.9.4-1/bin/o2control-executor +executor: /opt/o2control-executor mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" verbose: true veryverbose: true From 3f896abb62e96b0367679e54d5b2189ff2b637c9 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Thu, 6 Feb 2020 14:39:58 +0100 Subject: [PATCH 0125/2352] [core][OCTRL-73] Add properties to running task --- core/task/class.go | 4 ++-- core/task/descriptor.go | 6 ++++-- core/task/manager.go | 2 ++ core/task/task.go | 11 ++++++++--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 65146ea2a..ec893708d 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -28,7 +28,7 @@ import ( "fmt" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" - "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" "strconv" @@ -47,7 +47,7 @@ type info struct { Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` - Properties controlcommands.PropertyMap `yaml:"properties"` + Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` } diff --git a/core/task/descriptor.go b/core/task/descriptor.go index b8384c84f..ec6a96707 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -24,7 +24,9 @@ package task -import "github.com/AliceO2Group/Control/core/task/constraint" +import ( + "github.com/AliceO2Group/Control/core/task/constraint" +) /* 1) Role has a method GenerateTaskConfiguration []Descriptor. @@ -35,7 +37,7 @@ import "github.com/AliceO2Group/Control/core/task/constraint" Task's parent. So in ConfigureTransition.do, we first get the []Descriptor with wf.GenerateTaskConfiguration(). -2) Now that we have a list of config items for taks to run, we can port +2) Now that we have a list of config items for tasks to run, we can port task.Manager.AcquireRoles. This one internally uses match.go facilities such as matchRoles, which must return a *Task. This Task must then be added to the roster and a pointer to it set on the relevant TaskRole. diff --git a/core/task/manager.go b/core/task/manager.go index 5d9c9d3fc..08a231c25 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -27,6 +27,7 @@ package task import ( "errors" "fmt" + "github.com/AliceO2Group/Control/common/gera" "io/ioutil" "path/filepath" "strings" @@ -102,6 +103,7 @@ func (m *Manager) NewTaskForMesosOffer( agentId: offer.AgentID.Value, offerId: offer.ID.Value, taskId: newId, + properties: gera.MakeStringMap().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), executorId: executorId.Value, GetTaskClass: nil, bindPorts: nil, diff --git a/core/task/task.go b/core/task/task.go index 064440791..6ae0218ff 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -96,7 +96,7 @@ type Task struct { state State safeToStop bool - properties controlcommands.PropertyMap + properties gera.StringMap GetTaskClass func() *TaskClass // ↑ to be filled in by NewTaskForMesosOffer in Manager @@ -242,6 +242,7 @@ func (t Task) BuildPropertyMap(bindMap channel.BindMap) controlcommands.Property propMap := make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { + // if class.Control.Mode == controlmode.FAIRMQ { for _, inbCh := range class.Bind { port, ok := t.bindPorts[inbCh.Name] @@ -294,7 +295,11 @@ func (t Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { } } -func (t *Task) GetProperties() controlcommands.PropertyMap { - return t.GetTaskClass().Properties +func (t *Task) GetProperties() map[string]string { + propertiesMap, err := t.properties.Flattened() + if err != nil { + return make(map[string]string) + } + return propertiesMap // FIXME: this should merge TaskClass properties and properties acquired from the workflow } \ No newline at end of file From b8aa3844de7244c8ac47d3c8c0c9d5e709023131 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 Feb 2020 11:18:50 +0100 Subject: [PATCH 0126/2352] [core] Correctly unmarshal properties map into task.Class --- core/task/class.go | 53 ++++++++++++++++++++++++++++++++--------- core/task/descriptor.go | 10 ++++---- core/task/manager.go | 16 ++++++------- core/task/task.go | 6 ++--- 4 files changed, 58 insertions(+), 27 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index ec893708d..515522084 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -34,12 +34,10 @@ import ( "strconv" ) -type TaskClass info - // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but // the following information is enough to run the task even with no environment or -// role info. -type info struct { +// role Class. +type Class struct { Identifier taskClassIdentifier `yaml:"name"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` @@ -47,10 +45,43 @@ type info struct { Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` - Properties gera.StringMap `yaml:"properties"` + Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` } +func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + // We need to make a fake type to unmarshal into because + // gera.StringMap is an interface + type _class struct { + Identifier taskClassIdentifier `yaml:"name"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` + Command *common.CommandInfo `yaml:"command"` + Wants ResourceWants `yaml:"wants"` + Bind []channel.Inbound `yaml:"bind"` + Properties map[string]string `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints"` + } + aux := _class{ + Properties: make(map[string]string), + } + err = unmarshal(&aux) + if err == nil { + *c = Class{ + Identifier: aux.Identifier, + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints:aux.Constraints, + } + } + return + +} + type taskClassIdentifier struct { repoIdentifier string hash string @@ -111,13 +142,13 @@ func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err e return } -func (this *info) Equals(other *info) (response bool) { - if this == nil || other == nil { +func (c *Class) Equals(other *Class) (response bool) { + if c == nil || other == nil { return false } - response = this.Command.Equals(other.Command) && - *this.Wants.Cpu == *other.Wants.Cpu && - *this.Wants.Memory == *other.Wants.Memory && - this.Wants.Ports.Equals(other.Wants.Ports) + response = c.Command.Equals(other.Command) && + *c.Wants.Cpu == *other.Wants.Cpu && + *c.Wants.Memory == *other.Wants.Memory && + c.Wants.Ports.Equals(other.Wants.Ports) return } diff --git a/core/task/descriptor.go b/core/task/descriptor.go index ec6a96707..f5aba76eb 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -31,7 +31,7 @@ import ( /* 1) Role has a method GenerateTaskConfiguration []Descriptor. For most roles, this function simply consolidates the output of itself for children. - For TaskRoles, this function generates a single Descriptor from its own TaskClass + For TaskRoles, this function generates a single Descriptor from its own Class and parent role vars. Descriptor must also have a Ptr or path to the TaskRole that should become the new Task's parent. @@ -79,7 +79,7 @@ func (this *Descriptor) EqualsPtr(other *Descriptor) (response bool) { } } - response = this.info.Equals(&other.info) && + response = this.Class.Equals(&other.Class) && this.TaskClassName == other.TaskClassName return } @@ -173,7 +173,7 @@ func roleCfgFromConfiguration(name string, cfgMap configuration.Map) (roleCfg *D } roleCfg = &Descriptor{ - info: *ri, + Class: *ri, TaskClassName: roleClassS, CmdExtraEnv: cmdExtraEnvSlice, CmdExtraArguments: cmdExtraArgumentsSlice, @@ -182,7 +182,7 @@ func roleCfgFromConfiguration(name string, cfgMap configuration.Map) (roleCfg *D } -func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryFields bool) (ri *info, err error) { +func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryFields bool) (ri *Class, err error) { cfgErr := errors.New(fmt.Sprintf("bad configuration for roleClass %s", name)) // Get WantsCPU @@ -295,7 +295,7 @@ func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryF } } - ri = &info{ + ri = &Class{ Name: name, Command: cmdInfo, WantsCPU: wantsCPUF, diff --git a/core/task/manager.go b/core/task/manager.go index 08a231c25..a9e8c9b25 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -57,7 +57,7 @@ type Manager struct { AgentCache AgentCache mu sync.RWMutex - classes map[string]*TaskClass + classes map[string]*Class roster Tasks resourceOffersDone <-chan DeploymentMap @@ -74,7 +74,7 @@ func NewManager(resourceOffersDone <-chan DeploymentMap, cq *controlcommands.CommandQueue, killTaskFunc KillTaskFunc) (taskman *Manager) { taskman = &Manager{ - classes: make(map[string]*TaskClass), + classes: make(map[string]*Class), roster: make(Tasks, 0), resourceOffersDone: resourceOffersDone, tasksToDeploy: tasksToDeploy, @@ -110,7 +110,7 @@ func (m *Manager) NewTaskForMesosOffer( state: STANDBY, status: INACTIVE, } - t.GetTaskClass = func() *TaskClass { + t.GetTaskClass = func() *Class { return m.GetTaskClass(t.className) } t.bindPorts = make(map[string]uint64) @@ -120,11 +120,11 @@ func (m *Manager) NewTaskForMesosOffer( return } -func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, err error) { +func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err error) { repoManager := the.RepoManager() var yamlData []byte - taskClassList = make([]*TaskClass, 0) + taskClassList = make([]*Class, 0) for _, taskClass := range taskClassesRequired { taskClassString := strings.Split(taskClass, "@") @@ -143,7 +143,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*TaskClass, if err != nil { return nil, err } - taskClassStruct := TaskClass{} + taskClassStruct := Class{} err = yaml.Unmarshal(yamlData, &taskClassStruct) if err != nil { return nil, err @@ -189,7 +189,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { m.removeInactiveClasses() - var taskClassList []*TaskClass + var taskClassList []*Class taskClassList, err = getTaskClassList(taskClassesRequired) if err != nil { return err @@ -487,7 +487,7 @@ func (m *Manager) TransitionTasks(tasks Tasks, src string, event string, dest st return nil } -func (m *Manager) GetTaskClass(name string) (b *TaskClass) { +func (m *Manager) GetTaskClass(name string) (b *Class) { if m == nil { return } diff --git a/core/task/task.go b/core/task/task.go index 6ae0218ff..94ec98d4e 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -98,7 +98,7 @@ type Task struct { properties gera.StringMap - GetTaskClass func() *TaskClass + GetTaskClass func() *Class // ↑ to be filled in by NewTaskForMesosOffer in Manager } @@ -145,7 +145,7 @@ func (t *Task) GetClassName() string { } // Returns a consolidated CommandInfo for this Task, based on Roles tree and -// TaskClass. +// Class. func (t Task) BuildTaskCommand() (cmd *common.TaskCommandInfo) { if class := t.GetTaskClass(); class != nil { cmd = &common.TaskCommandInfo{} @@ -301,5 +301,5 @@ func (t *Task) GetProperties() map[string]string { return make(map[string]string) } return propertiesMap - // FIXME: this should merge TaskClass properties and properties acquired from the workflow + // FIXME: this should merge Class properties and properties acquired from the workflow } \ No newline at end of file From 569522c039caf88dcde257170c5509216c858d14 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 7 Feb 2020 15:34:41 +0100 Subject: [PATCH 0127/2352] [OCTRL-73] Add properties to buildcommand properties --- core/task/task.go | 10 ++++++++-- hacking/settings-mac.yaml | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 hacking/settings-mac.yaml diff --git a/core/task/task.go b/core/task/task.go index 94ec98d4e..e59abd9bf 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -277,7 +277,9 @@ func (t Task) BuildPropertyMap(bindMap channel.BindMap) controlcommands.Property } } } - + for k, v := range t.GetProperties() { + propMap[k] = v + } return propMap } @@ -296,10 +298,14 @@ func (t Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { } func (t *Task) GetProperties() map[string]string { + if t == nil { + log.Warn("attempted to get properties of nil task") + return make(map[string]string) + } propertiesMap, err := t.properties.Flattened() if err != nil { return make(map[string]string) } return propertiesMap // FIXME: this should merge Class properties and properties acquired from the workflow -} \ No newline at end of file +} diff --git a/hacking/settings-mac.yaml b/hacking/settings-mac.yaml new file mode 100644 index 000000000..e725afff9 --- /dev/null +++ b/hacking/settings-mac.yaml @@ -0,0 +1,8 @@ +--- +controlport: 47102 +executor: /opt/o2control-executor +mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" +verbose: true +veryverbose: true +globalconfigurationuri: "file://hacking/config.yaml" +repositoriesPath: "/Users/graduta/aliecs.d" From 4d32b9469a7a4e98304806599ece2b510e234116 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Feb 2020 17:38:11 +0100 Subject: [PATCH 0128/2352] [coconut] Correctly handle env create with empty extra-vars --- coconut/control/control.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 93ea32e96..539f0ecbf 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -179,8 +179,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if err != nil { return } - if len(extraVars) == 0 { - err = errors.New("empty argument list supplied") + if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { + err = errors.New("empty list of extra-vars supplied") return } From affad00b0e346575c98f3cec63c29d09b1a62539 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Feb 2020 16:24:42 +0100 Subject: [PATCH 0129/2352] [core] Add Copy method to gera.StringWrapMap --- common/gera/stringmap.go | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 3e81a3e49..c9fd72761 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -46,6 +46,7 @@ type StringMap interface { WrappedAndFlattened(m StringMap) (map[string]string, error) Raw() map[string]string + Copy() StringMap } func MakeStringMap() StringMap { @@ -213,4 +214,15 @@ func (w *StringWrapMap) Raw() map[string]string { return nil } return w.theMap -} \ No newline at end of file +} + +func (w *StringWrapMap) Copy() StringMap { + newMap := &StringWrapMap{ + theMap: make(map[string]string, len(w.theMap)), + parent: w.parent, + } + for k,v := range w.theMap { + newMap.theMap[k] = v + } + return newMap +} From b3704205626c942ed95abaccc1cdc7cbd4e47c05 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Feb 2020 16:26:53 +0100 Subject: [PATCH 0130/2352] [core] Implement new template engine --- common/gera/stringmap.go | 6 +- core/workflow/aggregatorrole.go | 20 +++++ core/workflow/aggregatortemplate.go | 47 ++++++----- core/workflow/iteratorrole.go | 4 +- core/workflow/load.go | 8 +- core/workflow/rolebase.go | 49 +++++++----- core/workflow/taskrole.go | 21 +++++ core/workflow/tasktemplate.go | 30 +++---- core/workflow/template/fields.go | 80 +++++++++++++++++++ .../fieldwrappers.go} | 80 ++++++++++++------- go.mod | 13 +-- go.sum | 25 ++++++ hacking/settings.yaml | 2 + 13 files changed, 285 insertions(+), 100 deletions(-) create mode 100644 core/workflow/template/fields.go rename core/workflow/{templatefields.go => template/fieldwrappers.go} (51%) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index c9fd72761..06e8c5547 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -49,14 +49,14 @@ type StringMap interface { Copy() StringMap } -func MakeStringMap() StringMap { +func MakeStringMap() *StringWrapMap { return &StringWrapMap{ theMap: make(map[string]string), parent: nil, } } -func MakeStringMapWithMap(fromMap map[string]string) StringMap { +func MakeStringMapWithMap(fromMap map[string]string) *StringWrapMap { myMap := &StringWrapMap{ theMap: fromMap, parent: nil, @@ -64,7 +64,7 @@ func MakeStringMapWithMap(fromMap map[string]string) StringMap { return myMap } -func MakeStringMapWithMapCopy(fromMap map[string]string) StringMap { +func MakeStringMapWithMapCopy(fromMap map[string]string) *StringWrapMap { newBackingMap := make(map[string]string) for k, v := range fromMap { newBackingMap[k] = v diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 7f15afaf6..2ce9e5d91 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -26,8 +26,11 @@ package workflow import ( "errors" + texttemplate "text/template" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow/template" "github.com/gobwas/glob" "github.com/sirupsen/logrus" ) @@ -81,6 +84,23 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) return errors.New("role tree error when processing templates") } + var varStack map[string]string + varStack, err = r.consolidateVarStack() + if err != nil { + return + } + + tf := template.Fields{ + template.WrapPointer(&r.Name), + } + tf = append(tf, template.WrapMapItems(r.Defaults.Raw())...) + tf = append(tf, template.WrapMapItems(r.Vars.Raw())...) + + err = tf.Execute(r.GetPath(), varStack, make(map[string]texttemplate.Template)) + if err != nil { + return + } + r.resolveOutboundChannelTargets() for _, role := range r.Roles { diff --git a/core/workflow/aggregatortemplate.go b/core/workflow/aggregatortemplate.go index 9528c06d0..061db49d6 100644 --- a/core/workflow/aggregatortemplate.go +++ b/core/workflow/aggregatortemplate.go @@ -32,6 +32,7 @@ import ( type aggregatorTemplate struct { aggregatorRole + // FIXME: replace ↓ with a map[string]*expr.vm.Program stringTemplates map[string]template.Template `yaml:"-,omitempty"` } @@ -39,38 +40,43 @@ func (at *aggregatorTemplate) copy() copyable { rCopy := aggregatorTemplate{ aggregatorRole: *at.aggregatorRole.copy().(*aggregatorRole), } - copier.Copy(&rCopy.stringTemplates, &at.stringTemplates) + _ = copier.Copy(&rCopy.stringTemplates, &at.stringTemplates) return &rCopy } func (at *aggregatorTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _aggregatorTemplate aggregatorTemplate - role := _aggregatorTemplate{} - err = unmarshal(&role) + aux := _aggregatorTemplate{} + err = unmarshal(&aux) if err != nil { return } - tmpl := template.New(role.GetPath()) - role.stringTemplates = make(map[string]template.Template) + aux.stringTemplates = make(map[string]template.Template) + /* template cache builder + tmpl := template.New(aux.GetPath()) // Fields to parse as templates: - for _, str := range []string{ - role.Name, - } { + templatableFields := []string{ + aux.Name, + } + + // FIXME: actually use these templates + for _, str := range templatableFields { var tempTmpl *template.Template tempTmpl, err = tmpl.Parse(str) if err != nil { return } - role.stringTemplates[str] = *tempTmpl + aux.stringTemplates[str] = *tempTmpl } + */ - *at = aggregatorTemplate(role) + *at = aggregatorTemplate(aux) return } -func (at *aggregatorTemplate) generateRole(t templateMap) (c Role, err error) { +func (at *aggregatorTemplate) generateRole(localVars map[string]string) (c Role, err error) { if at == nil { return nil, errors.New("cannot generate from nil sender") } @@ -80,23 +86,16 @@ func (at *aggregatorTemplate) generateRole(t templateMap) (c Role, err error) { // at.stringTemplates contains cached compiled text/template.Template instances: // these will generate strings for us on request. // In this method: - // 1) create new instance of aggregatorRole - // 2a) for each field not to templatify, just make a deep copy - // 2b) for each field to templatify, execute the template against the templateMap - // 3) ??? - // 4) PROFIT! + // 1) create new instance of aggregatorRole as copy + // 2) push iterator-provided vars into the local Vars map - // 1 + 2a) + // 1 ar := *at.aggregatorRole.copy().(*aggregatorRole) - - // 2b) - tf := templateFields{&ar.Name} - err = tf.execute(at.GetPath(), t, at.stringTemplates) - if err != nil { - return + // 2) + for k, v := range localVars { + ar.Vars.Set(k, v) } - // 3 + 4) c = &ar return } \ No newline at end of file diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 98a8dd8e8..a1ef4bcbe 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -45,7 +45,7 @@ type templateMap map[string]interface{} type roleTemplate interface { Role - generateRole(t templateMap) (Role, error) + generateRole(localVars map[string]string) (Role, error) } func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -146,7 +146,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { } func (i *iteratorRole) expandTemplate() (err error) { - values := make(templateMap) + values := make(map[string]string) roles := make([]Role, 0) diff --git a/core/workflow/load.go b/core/workflow/load.go index 0d7cc8497..62776fde5 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -29,7 +29,9 @@ import ( "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" + "github.com/k0kubun/pp" "gopkg.in/yaml.v2" + "fmt" "io/ioutil" ) @@ -61,9 +63,13 @@ func Load(cfg configuration.ROSource, workflowPath string, parent Updatable, tas } workflow = root + fmt.Println("unprocessed workflow:") + _, _ = pp.Println(workflow) + workflow.ProcessTemplates(workflowRepo) log.WithField("path", workflowPath).Debug("workflow loaded") - //pp.Println(workflow) + fmt.Println("processed workflow:") + _, _ = pp.Println(workflow) // Update class list taskClassesRequired := workflow.GetTaskClasses() diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 7435dfa80..c15dcbb55 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -24,7 +24,6 @@ package workflow - import ( "bytes" "fmt" @@ -33,7 +32,6 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/jinzhu/copier" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" @@ -57,9 +55,31 @@ type roleBase struct { status SafeStatus state SafeState - Defaults gera.StringMap `yaml:"defaults"` - Vars gera.StringMap `yaml:"vars"` - UserVars gera.StringMap `yaml:"-"` + Defaults *gera.StringWrapMap `yaml:"defaults"` + Vars *gera.StringWrapMap `yaml:"vars"` + UserVars *gera.StringWrapMap `yaml:"-"` +} + +func (r *roleBase) consolidateVarStack() (varStack map[string]string, err error) { + var defaults, vars, userVars map[string]string + defaults, err = r.Defaults.Flattened() + if err != nil { + return + } + vars, err = r.Vars.Flattened() + if err != nil { + return + } + userVars, err = r.UserVars.Flattened() + if err != nil { + return + } + consolidated := gera.MakeStringMapWithMap(userVars).Wrap(gera.MakeStringMapWithMap(vars).Wrap(gera.MakeStringMapWithMap(defaults))) + varStack, err = consolidated.Flattened() + if err != nil { + return + } + return } func (r *roleBase) CollectOutboundChannels() (channels []channel.Outbound) { @@ -153,28 +173,15 @@ func (r *roleBase) copy() copyable { rCopy := roleBase{ Name: r.Name, parent: r.parent, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), + Defaults: r.Defaults.Copy().(*gera.StringWrapMap), + Vars: r.Vars.Copy().(*gera.StringWrapMap), + UserVars: r.UserVars.Copy().(*gera.StringWrapMap), Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, state: r.state, } - err := copier.Copy(&rCopy.Defaults, &r.Defaults) - if err != nil { - log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") - } - err = copier.Copy(&rCopy.Vars, &r.Vars) - if err != nil { - log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") - } - err = copier.Copy(&rCopy.UserVars, &r.UserVars) - if err != nil { - log.WithField("role", r.GetPath()).WithError(err).Error("role copy error") - } - copied := copy(rCopy.Connect, r.Connect) if copied != len(r.Connect) { log.WithField("role", r.GetPath()). diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 40f8048da..5cc4460c3 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -26,8 +26,11 @@ package workflow import ( "errors" + texttemplate "text/template" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow/template" "github.com/gobwas/glob" ) @@ -74,6 +77,24 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { return errors.New("role tree error when processing templates") } + var varStack map[string]string + varStack, err = t.consolidateVarStack() + if err != nil { + return + } + + tf := template.Fields{ + template.WrapPointer(&t.Name), + template.WrapPointer(&t.LoadTaskClass), + } + tf = append(tf, template.WrapMapItems(t.Defaults.Raw())...) + tf = append(tf, template.WrapMapItems(t.Vars.Raw())...) + // FIXME: push cached templates here + err = tf.Execute(t.GetPath(), varStack, make(map[string]texttemplate.Template)) + if err != nil { + return + } + t.resolveTaskClassIdentifier(workflowRepo) t.resolveOutboundChannelTargets() diff --git a/core/workflow/tasktemplate.go b/core/workflow/tasktemplate.go index 813aa81b0..a50f73f1a 100644 --- a/core/workflow/tasktemplate.go +++ b/core/workflow/tasktemplate.go @@ -39,49 +39,49 @@ func (tt *taskTemplate) copy() copyable { rCopy := taskTemplate{ taskRole: *tt.taskRole.copy().(*taskRole), } - copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) + _ = copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) return &rCopy } func (tt *taskTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _taskTemplate taskTemplate - role := _taskTemplate{} - err = unmarshal(&role) + aux := _taskTemplate{} + err = unmarshal(&aux) if err != nil { return } - tmpl := template.New(role.GetPath()) - role.stringTemplates = make(map[string]template.Template) + aux.stringTemplates = make(map[string]template.Template) + + /* template cache builder + tmpl := template.New(aux.GetPath()) // Fields to parse as templates: for _, str := range []string{ - role.LoadTaskClass, - role.Name, + aux.LoadTaskClass, + aux.Name, } { var tempTmpl *template.Template tempTmpl, err = tmpl.Parse(str) if err != nil { return } - role.stringTemplates[str] = *tempTmpl + aux.stringTemplates[str] = *tempTmpl } + */ - *tt = taskTemplate(role) + *tt = taskTemplate(aux) return } -func (tt *taskTemplate) generateRole(t templateMap) (c Role, err error) { +func (tt *taskTemplate) generateRole(localVars map[string]string) (c Role, err error) { if tt == nil { return nil, errors.New("cannot generate from nil sender") } // See NOTE for aggregatorTemplate.generateRole tr := *tt.taskRole.copy().(*taskRole) - - tf := templateFields{&tr.Name, &tr.LoadTaskClass} - err = tf.execute(tt.GetPath(), t, tt.stringTemplates) - if err != nil { - return + for k, v := range localVars { + tr.Vars.Set(k, v) } c = &tr diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go new file mode 100644 index 000000000..d085b54a0 --- /dev/null +++ b/core/workflow/template/fields.go @@ -0,0 +1,80 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package template + +import ( + "bytes" + "fmt" + "io" + "text/template" + + "github.com/antonmedv/expr" + "github.com/antonmedv/expr/vm" + "github.com/valyala/fasttemplate" +) + +type Fields []Field + +func (fields Fields) Execute(parentPath string, varStack map[string]string, stringTemplateCache map[string]template.Template) (err error) { + environment := make(map[string]interface{}, len(varStack)) + for k, v := range varStack { + environment[k] = v + } + + for _, str := range fields { + buf := new(bytes.Buffer) + // FIXME: the line below implements the cache + //tmpl, ok := stringTemplateCache[*str] + var tmpl *fasttemplate.Template // dummy + ok := false // dummy + if !ok { + tmpl, err = fasttemplate.NewTemplate(str.Get(), "{{", "}}") + if err != nil { + return + } + } + _, err = tmpl.ExecuteFunc(buf, func(w io.Writer, tag string) (i int, err error) { + var( + program *vm.Program + rawOutput interface{} + ) + program, err = expr.Compile(tag) + if err != nil { + return + } + rawOutput, err = expr.Run(program, environment) + if err != nil { + return + } + + return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) + }) + if err != nil { + return + } + str.Set(buf.String()) + } + return +} \ No newline at end of file diff --git a/core/workflow/templatefields.go b/core/workflow/template/fieldwrappers.go similarity index 51% rename from core/workflow/templatefields.go rename to core/workflow/template/fieldwrappers.go index e0a1c1fcd..92e467fe3 100644 --- a/core/workflow/templatefields.go +++ b/core/workflow/template/fieldwrappers.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2018-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -22,32 +22,54 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package workflow - -import ( - "bytes" - "text/template" -) - -type templateFields []*string - -func (tf templateFields) execute(parentPath string, t templateMap, stringTemplateCache map[string]template.Template) (err error) { - for _, str := range tf { - buf := new(bytes.Buffer) - tmpl, ok := stringTemplateCache[*str] - if !ok { - log.WithField("role", parentPath).Debug("parsed template not in cache, building") - tmpl := template.New(parentPath) - tmpl, err = tmpl.Parse(*str) - if err != nil { - return - } - } - err = tmpl.Execute(buf, t) - if err != nil { - return - } - *str = buf.String() +package template + +type Field interface { + Get() string + Set(value string) +} + +type pointerWrapper struct { + field *string +} + +func WrapPointer(field *string) Field { + return &pointerWrapper{field: field} +} + +func (t *pointerWrapper) Get() string { + return *t.field +} + +func (t *pointerWrapper) Set(value string) { + *t.field = value +} + + +type mapItemWrapper struct { + getter func() string + setter func(value string) +} + +func WrapMapItems(items map[string]string) Fields { + fields := make(Fields, 0) + for k, _ := range items { + fields = append(fields, &mapItemWrapper{ + getter: func() string { + return items[k] + }, + setter: func(value string) { + items[k] = value + }, + }) } - return -} \ No newline at end of file + return fields +} + +func (t *mapItemWrapper) Get() string { + return t.getter() +} + +func (t *mapItemWrapper) Set(value string) { + t.setter(value) +} diff --git a/go.mod b/go.mod index e938089e0..5b5d573de 100644 --- a/go.mod +++ b/go.mod @@ -11,6 +11,8 @@ replace github.com/russross/blackfriday => github.com/russross/blackfriday v1.5. replace github.com/coreos/etcd => github.com/coreos/etcd v3.3.18+incompatible require ( + github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792 // indirect + github.com/antonmedv/expr v1.4.3 github.com/armon/go-metrics v0.3.0 // indirect github.com/briandowns/spinner v1.8.0 github.com/coreos/bbolt v1.3.3 // indirect @@ -21,7 +23,7 @@ require ( github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect - github.com/golang/protobuf v1.3.2 + github.com/golang/protobuf v1.3.3 github.com/google/uuid v1.1.1 github.com/gorilla/websocket v1.4.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect @@ -68,16 +70,17 @@ require ( github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.6.2 github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 + github.com/valyala/fasttemplate v1.1.0 github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xlab/treeprint v1.0.0 go.etcd.io/bbolt v1.3.3 // indirect go.uber.org/zap v1.13.0 // indirect golang.org/x/crypto v0.0.0-20200117160349-530e935923ad // indirect - golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa - golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 + golang.org/x/net v0.0.0-20200202094626-16171245cfb2 + golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect - google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 // indirect - google.golang.org/grpc v1.26.0 + google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898 // indirect + google.golang.org/grpc v1.27.1 gopkg.in/ini.v1 v1.51.1 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 gopkg.in/yaml.v2 v2.2.7 diff --git a/go.sum b/go.sum index fc131cbef..b3eab2014 100644 --- a/go.sum +++ b/go.sum @@ -14,6 +14,12 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca h1:QHbltbNkVcw97h4zA/L8gA4o3dJiFvBZ0gyZHrYXHbs= +github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= +github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792 h1:Fy2NOZhZ5qlthF55mF48+gBJ2kbdw3q4vFoOMINU5Mo= +github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= +github.com/antonmedv/expr v1.4.3 h1:KHGRkfh2a46a99kMsbO476hhjO1RKiyt6drVU4U2Mq0= +github.com/antonmedv/expr v1.4.3/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -77,6 +83,7 @@ github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -105,6 +112,8 @@ github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -332,8 +341,10 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 h1:iSQ9CjsvareuUUlmHAQKpn4+ZjZjMtldyygiOH3G3+s= github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= +github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -342,6 +353,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= @@ -402,6 +414,10 @@ github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= +github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= @@ -462,6 +478,8 @@ golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iM golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -493,6 +511,8 @@ golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 h1:N19i1HjUnR7TF7rMt8O4p3dLv golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -525,6 +545,8 @@ google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898 h1:bKX1IGaSj2XD9yfWNts9HKRdQRH0lOZ0S7Nb8meQSlY= +google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -532,6 +554,9 @@ google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= diff --git a/hacking/settings.yaml b/hacking/settings.yaml index d2e9fe251..b87956fd7 100644 --- a/hacking/settings.yaml +++ b/hacking/settings.yaml @@ -5,3 +5,5 @@ mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" verbose: true veryverbose: true globalconfigurationuri: "file://hacking/config.yaml" +coreWorkingDir: "/home/alidock/aliecs.d" +repositoriesPath: "/home/alidock/aliecs.d/repos" From 015b93973dacbba0e7340d43ca3cd02ced6152a0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Feb 2020 17:22:01 +0100 Subject: [PATCH 0131/2352] [core] Correctly handle precedence of template resolution --- common/gera/stringmap.go | 13 +++ core/workflow/aggregatorrole.go | 30 +++--- core/workflow/load.go | 19 ++-- core/workflow/rolebase.go | 4 + core/workflow/taskrole.go | 25 ++--- core/workflow/tasktemplate.go | 2 +- core/workflow/template/fields.go | 126 +++++++++++++++++++++++- core/workflow/template/fieldwrappers.go | 5 +- 8 files changed, 186 insertions(+), 38 deletions(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 06e8c5547..1708b6c2d 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -43,6 +43,7 @@ type StringMap interface { Set(key string, value string) bool Flattened() (map[string]string, error) + FlattenedParent() (map[string]string, error) WrappedAndFlattened(m StringMap) (map[string]string, error) Raw() map[string]string @@ -187,6 +188,18 @@ func (w *StringWrapMap) Flattened() (map[string]string, error) { return out, err } +func (w *StringWrapMap) FlattenedParent() (map[string]string, error) { + if w == nil { + return nil, nil + } + + if w.parent == nil { + return make(map[string]string), nil + } + + return w.parent.Flattened() +} + func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, error) { if w == nil { return nil, nil diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 2ce9e5d91..83373645d 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -84,19 +84,23 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) return errors.New("role tree error when processing templates") } - var varStack map[string]string - varStack, err = r.consolidateVarStack() - if err != nil { - return - } - - tf := template.Fields{ - template.WrapPointer(&r.Name), - } - tf = append(tf, template.WrapMapItems(r.Defaults.Raw())...) - tf = append(tf, template.WrapMapItems(r.Vars.Raw())...) - - err = tf.Execute(r.GetPath(), varStack, make(map[string]texttemplate.Template)) + templSequence := template.Sequence{ + template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), + template.STAGE1: template.WrapMapItems(r.Vars.Raw()), + template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), + template.STAGE3: template.Fields{ + template.WrapPointer(&r.Name), + // FIXME add template processing of constraints, cmdinfo, etc. here and in taskrole + }, + } + + // TODO: push cached templates here + err = templSequence.Execute(r.GetPath(), template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, make(map[string]texttemplate.Template)) if err != nil { return } diff --git a/core/workflow/load.go b/core/workflow/load.go index 62776fde5..c76d0f076 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -25,14 +25,13 @@ package workflow import ( + "io/ioutil" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" - "github.com/k0kubun/pp" "gopkg.in/yaml.v2" - "fmt" - "io/ioutil" ) // FIXME: workflowPath should be of type configuration.Path, not string @@ -63,13 +62,17 @@ func Load(cfg configuration.ROSource, workflowPath string, parent Updatable, tas } workflow = root - fmt.Println("unprocessed workflow:") - _, _ = pp.Println(workflow) + //fmt.Println("unprocessed workflow:") + //_, _ = pp.Println(workflow) - workflow.ProcessTemplates(workflowRepo) + err = workflow.ProcessTemplates(workflowRepo) + if err != nil { + log.WithError(err).Warn("workflow loading failed: template processing error") + return + } log.WithField("path", workflowPath).Debug("workflow loaded") - fmt.Println("processed workflow:") - _, _ = pp.Println(workflow) + //fmt.Println("processed workflow:") + //_, _ = pp.Println(workflow) // Update class list taskClassesRequired := workflow.GetTaskClasses() diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index c15dcbb55..3d00fd7d1 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -58,9 +58,11 @@ type roleBase struct { Defaults *gera.StringWrapMap `yaml:"defaults"` Vars *gera.StringWrapMap `yaml:"vars"` UserVars *gera.StringWrapMap `yaml:"-"` + Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role } func (r *roleBase) consolidateVarStack() (varStack map[string]string, err error) { + // FIXME: this function is not used any more var defaults, vars, userVars map[string]string defaults, err = r.Defaults.Flattened() if err != nil { @@ -105,6 +107,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) Defaults: gera.MakeStringMap(), Vars: gera.MakeStringMap(), UserVars: gera.MakeStringMap(), + Locals: make(map[string]string), status: SafeStatus{status:task.INACTIVE}, state: SafeState{state:task.STANDBY}, } @@ -176,6 +179,7 @@ func (r *roleBase) copy() copyable { Defaults: r.Defaults.Copy().(*gera.StringWrapMap), Vars: r.Vars.Copy().(*gera.StringWrapMap), UserVars: r.UserVars.Copy().(*gera.StringWrapMap), + Locals: make(map[string]string), Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 5cc4460c3..f4f9c9696 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -77,20 +77,23 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { return errors.New("role tree error when processing templates") } - var varStack map[string]string - varStack, err = t.consolidateVarStack() - if err != nil { - return + templSequence := template.Sequence{ + template.STAGE0: template.WrapMapItems(t.Defaults.Raw()), + template.STAGE1: template.WrapMapItems(t.Vars.Raw()), + template.STAGE2: template.WrapMapItems(t.UserVars.Raw()), + template.STAGE3: template.Fields{ + template.WrapPointer(&t.Name), + template.WrapPointer(&t.LoadTaskClass), + }, } - tf := template.Fields{ - template.WrapPointer(&t.Name), - template.WrapPointer(&t.LoadTaskClass), - } - tf = append(tf, template.WrapMapItems(t.Defaults.Raw())...) - tf = append(tf, template.WrapMapItems(t.Vars.Raw())...) // FIXME: push cached templates here - err = tf.Execute(t.GetPath(), varStack, make(map[string]texttemplate.Template)) + err = templSequence.Execute(t.GetPath(), template.VarStack{ + Locals: t.Locals, + Defaults: t.Defaults, + Vars: t.Vars, + UserVars: t.UserVars, + }, make(map[string]texttemplate.Template)) if err != nil { return } diff --git a/core/workflow/tasktemplate.go b/core/workflow/tasktemplate.go index a50f73f1a..99ad8dcfc 100644 --- a/core/workflow/tasktemplate.go +++ b/core/workflow/tasktemplate.go @@ -81,7 +81,7 @@ func (tt *taskTemplate) generateRole(localVars map[string]string) (c Role, err e // See NOTE for aggregatorTemplate.generateRole tr := *tt.taskRole.copy().(*taskRole) for k, v := range localVars { - tr.Vars.Set(k, v) + tr.Locals[k] = v } c = &tr diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index d085b54a0..c74d95525 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -30,28 +30,147 @@ import ( "io" "text/template" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/logger" "github.com/antonmedv/expr" "github.com/antonmedv/expr/vm" + "github.com/sirupsen/logrus" "github.com/valyala/fasttemplate" ) +var log = logger.New(logrus.StandardLogger(),"template") + +type Sequence map[Stage]Fields + +func (sf Sequence) Execute(parentPath string, varStack VarStack, stringTemplateCache map[string]template.Template) (err error) { + for i := 0; i < int(_STAGE_MAX); i++ { + currentStage := Stage(i) + + var stagedStack map[string]string + stagedStack, err = varStack.consolidated(currentStage) + if err != nil { + return + } + + if fields, ok := sf[currentStage]; ok { + err = fields.Execute(parentPath, stagedStack, stringTemplateCache) + if err != nil { + log.WithError(err).Errorf("template processing error") + return + } + } + } + return +} + type Fields []Field +type Stage int +const ( + STAGE0 Stage = iota + STAGE1 + STAGE2 + STAGE3 + _STAGE_MAX +) + +type VarStack struct { + Locals map[string]string + Defaults *gera.StringWrapMap + Vars *gera.StringWrapMap + UserVars *gera.StringWrapMap +} + +func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]string, err error) { + var defaults, vars, userVars map[string]string + vars, err = vs.Vars.Flattened() + if err != nil { + return + } + userVars, err = vs.UserVars.Flattened() + if err != nil { + return + } + + switch stage { + case STAGE0: + defaults, err = vs.Defaults.FlattenedParent() + if err != nil { + return + } + vars, err = vs.Vars.FlattenedParent() + if err != nil { + return + } + userVars, err = vs.UserVars.FlattenedParent() + if err != nil { + return + } + case STAGE1: + defaults, err = vs.Defaults.Flattened() + if err != nil { + return + } + vars, err = vs.Vars.FlattenedParent() + if err != nil { + return + } + userVars, err = vs.UserVars.FlattenedParent() + if err != nil { + return + } + case STAGE2: + defaults, err = vs.Defaults.Flattened() + if err != nil { + return + } + vars, err = vs.Vars.Flattened() + if err != nil { + return + } + userVars, err = vs.UserVars.FlattenedParent() + if err != nil { + return + } + case STAGE3: + defaults, err = vs.Defaults.Flattened() + if err != nil { + return + } + vars, err = vs.Vars.Flattened() + if err != nil { + return + } + userVars, err = vs.UserVars.Flattened() + if err != nil { + return + } + } + + consolidated := gera.MakeStringMapWithMap(vs.Locals).Wrap(gera.MakeStringMapWithMap(userVars).Wrap(gera.MakeStringMapWithMap(vars).Wrap(gera.MakeStringMapWithMap(defaults)))) + consolidatedStack, err = consolidated.Flattened() + if err != nil { + return + } + return +} + func (fields Fields) Execute(parentPath string, varStack map[string]string, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) for k, v := range varStack { environment[k] = v } - for _, str := range fields { + for _, field := range fields { buf := new(bytes.Buffer) // FIXME: the line below implements the cache //tmpl, ok := stringTemplateCache[*str] var tmpl *fasttemplate.Template // dummy ok := false // dummy if !ok { - tmpl, err = fasttemplate.NewTemplate(str.Get(), "{{", "}}") + tmpl, err = fasttemplate.NewTemplate(field.Get(), "{{", "}}") if err != nil { + log.WithError(err).WithField("role", parentPath).Warn("template processing error (bad workflow file)") return } } @@ -72,9 +191,10 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, stri return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) }) if err != nil { + log.WithError(err).WithField("role", parentPath).Warn("template processing error (bad variable or workflow file)") return } - str.Set(buf.String()) + field.Set(buf.String()) } return } \ No newline at end of file diff --git a/core/workflow/template/fieldwrappers.go b/core/workflow/template/fieldwrappers.go index 92e467fe3..e8d0263fa 100644 --- a/core/workflow/template/fieldwrappers.go +++ b/core/workflow/template/fieldwrappers.go @@ -54,12 +54,13 @@ type mapItemWrapper struct { func WrapMapItems(items map[string]string) Fields { fields := make(Fields, 0) for k, _ := range items { + key := k // we need a local copy for the getter/setter closures fields = append(fields, &mapItemWrapper{ getter: func() string { - return items[k] + return items[key] }, setter: func(value string) { - items[k] = value + items[key] = value }, }) } From f46ee9c94258e86fb1c849ddfa249f6f3b1f1355 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Feb 2020 16:40:57 +0100 Subject: [PATCH 0132/2352] [core] Template support in constraints and objStack --- core/workflow/aggregatorrole.go | 31 ++++++++++---- core/workflow/aggregatortemplate.go | 2 +- core/workflow/rolebase.go | 63 +++++++++++++++++++++++++++-- core/workflow/taskrole.go | 29 ++++++++++--- core/workflow/template/fields.go | 25 ++++++++---- hacking/settings.yaml | 3 +- 6 files changed, 126 insertions(+), 27 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 83373645d..0b7732d06 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -90,21 +90,38 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), template.STAGE3: template.Fields{ template.WrapPointer(&r.Name), - // FIXME add template processing of constraints, cmdinfo, etc. here and in taskrole }, + template.STAGE4: func() (fields template.Fields) { + fields = make(template.Fields, len(r.Constraints) * 2) + for i, constr := range r.Constraints { + fields[i * 2] = template.WrapPointer(&constr.Attribute) + fields[i * 2 + 1] = template.WrapPointer(&constr.Value) + } + return + }(), } + // FIXME add template processing of cmdinfo, etc. here and in taskrole // TODO: push cached templates here - err = templSequence.Execute(r.GetPath(), template.VarStack{ - Locals: r.Locals, - Defaults: r.Defaults, - Vars: r.Vars, - UserVars: r.UserVars, - }, make(map[string]texttemplate.Template)) + err = templSequence.Execute(r.GetPath(), + template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, + r.makeBuildObjectStackFunc(), + make(map[string]texttemplate.Template), + ) if err != nil { return } + // After template processing we write the Locals to Vars in order to make them available to children + for k, v := range r.Locals { + r.Vars.Set(k, v) + } + r.resolveOutboundChannelTargets() for _, role := range r.Roles { diff --git a/core/workflow/aggregatortemplate.go b/core/workflow/aggregatortemplate.go index 061db49d6..910ca465a 100644 --- a/core/workflow/aggregatortemplate.go +++ b/core/workflow/aggregatortemplate.go @@ -93,7 +93,7 @@ func (at *aggregatorTemplate) generateRole(localVars map[string]string) (c Role, ar := *at.aggregatorRole.copy().(*aggregatorRole) // 2) for k, v := range localVars { - ar.Vars.Set(k, v) + ar.Locals[k] = v } c = &ar diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 3d00fd7d1..f1d392dae 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -27,11 +27,12 @@ package workflow import ( "bytes" "fmt" - "text/template" + texttemplate "text/template" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/workflow/template" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" @@ -84,6 +85,62 @@ func (r *roleBase) consolidateVarStack() (varStack map[string]string, err error) return } +func (r *roleBase) makeBuildObjectStackFunc() template.BuildObjectStackFunc { + return func(stage template.Stage) map[string]interface{} { + type wfNode struct { + Name string + Path string + } + objStack := map[string]interface{}{ + "Parent": func() *wfNode { + parentRole := r.GetParentRole() + if parentRole != nil { + return &wfNode{ + Name: parentRole.GetName(), + Path: parentRole.GetPath(), + } + } + return nil + }, + "Up": func(levels int) *wfNode { + type _parentRole interface { + GetParent() Updatable + GetPath() string + } + + if levels <= 0 { + return nil + } + var p _parentRole = r + for i := 0; i < levels; i++ { + p = p.GetParent() + if p == nil { + log.WithFields(logrus.Fields{"error": "role has no ancestor", "role": r.GetPath()}).Error("workflow configuration error") + return nil + } + } + if pr, ok := p.(Role); ok { + return &wfNode{ + Name: pr.GetName(), + Path: pr.GetPath(), + } + } + return nil + }, + } + if stage > 3 { // varStack and object ready + objStack["This"] = func() *wfNode { + return &wfNode{ + Name: r.GetName(), + Path: r.GetPath(), + } + } + } + + return objStack + } +} + func (r *roleBase) CollectOutboundChannels() (channels []channel.Outbound) { if r.parent == nil { channels = make([]channel.Outbound, 0) @@ -126,7 +183,7 @@ func (r *roleBase) resolveOutboundChannelTargets() { GetPath() string } - funcMap := template.FuncMap{ + funcMap := texttemplate.FuncMap{ "this": func() string { return r.GetPath() }, @@ -155,7 +212,7 @@ func (r *roleBase) resolveOutboundChannelTargets() { } for i, ch := range r.Connect { - tmpl := template.New(r.GetPath()) + tmpl := texttemplate.New(r.GetPath()) parsed, err := tmpl.Funcs(funcMap).Parse(ch.Target) if err != nil { log.WithError(err).WithFields(logrus.Fields{"role": r.GetPath(), "channel": ch.Name, "target": ch.Target}).Error("cannot parse template for outbound channel target") diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index f4f9c9696..b5db5e333 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -85,19 +85,36 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.Name), template.WrapPointer(&t.LoadTaskClass), }, + template.STAGE4: func() (fields template.Fields) { + fields = make(template.Fields, len(t.Constraints) * 2) + for i, constr := range t.Constraints { + fields[i * 2] = template.WrapPointer(&constr.Attribute) + fields[i * 2 + 1] = template.WrapPointer(&constr.Value) + } + return + }(), } // FIXME: push cached templates here - err = templSequence.Execute(t.GetPath(), template.VarStack{ - Locals: t.Locals, - Defaults: t.Defaults, - Vars: t.Vars, - UserVars: t.UserVars, - }, make(map[string]texttemplate.Template)) + err = templSequence.Execute(t.GetPath(), + template.VarStack{ + Locals: t.Locals, + Defaults: t.Defaults, + Vars: t.Vars, + UserVars: t.UserVars, + }, + t.makeBuildObjectStackFunc(), + make(map[string]texttemplate.Template), + ) if err != nil { return } + // After template processing we write the Locals to Vars in order to make them available to children + for k, v := range t.Locals { + t.Vars.Set(k, v) + } + t.resolveTaskClassIdentifier(workflowRepo) t.resolveOutboundChannelTargets() diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index c74d95525..0cc53225b 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -41,8 +41,9 @@ import ( var log = logger.New(logrus.StandardLogger(),"template") type Sequence map[Stage]Fields +type BuildObjectStackFunc func(stage Stage) map[string]interface{} -func (sf Sequence) Execute(parentPath string, varStack VarStack, stringTemplateCache map[string]template.Template) (err error) { +func (sf Sequence) Execute(parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { for i := 0; i < int(_STAGE_MAX); i++ { currentStage := Stage(i) @@ -52,8 +53,10 @@ func (sf Sequence) Execute(parentPath string, varStack VarStack, stringTemplateC return } + objectStack := buildObjectStack(currentStage) + if fields, ok := sf[currentStage]; ok { - err = fields.Execute(parentPath, stagedStack, stringTemplateCache) + err = fields.Execute(parentPath, stagedStack, objectStack, stringTemplateCache) if err != nil { log.WithError(err).Errorf("template processing error") return @@ -67,10 +70,12 @@ type Fields []Field type Stage int const ( - STAGE0 Stage = iota - STAGE1 - STAGE2 - STAGE3 + // RESOLUTION STAGE ↓ VALUES AVAILABLE ↓ + STAGE0 Stage = iota // parent stack only + locals + STAGE1 // parent stack + defaults + locals + STAGE2 // parent stack + defaults + vars + locals + STAGE3 // parent stack + defaults + vars + uservars + locals + STAGE4 // parent stack + defaults + vars + uservars + locals + full self-object = full stack _STAGE_MAX ) @@ -132,7 +137,8 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri if err != nil { return } - case STAGE3: + case STAGE3: fallthrough + case STAGE4: defaults, err = vs.Defaults.Flattened() if err != nil { return @@ -155,11 +161,14 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri return } -func (fields Fields) Execute(parentPath string, varStack map[string]string, stringTemplateCache map[string]template.Template) (err error) { +func (fields Fields) Execute(parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) for k, v := range varStack { environment[k] = v } + for k, v := range objStack { + environment[k] = v + } for _, field := range fields { buf := new(bytes.Buffer) diff --git a/hacking/settings.yaml b/hacking/settings.yaml index b87956fd7..8c504509c 100644 --- a/hacking/settings.yaml +++ b/hacking/settings.yaml @@ -5,5 +5,4 @@ mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" verbose: true veryverbose: true globalconfigurationuri: "file://hacking/config.yaml" -coreWorkingDir: "/home/alidock/aliecs.d" -repositoriesPath: "/home/alidock/aliecs.d/repos" +coreWorkingDir: "/home/teo/workspace/aliecs.d" From f3f228066d261e240639436d1b13bc9a1fd834cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Feb 2020 16:34:15 +0100 Subject: [PATCH 0133/2352] [core] Add support for wrapping slices in template --- core/workflow/template/fieldwrappers.go | 29 +++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/workflow/template/fieldwrappers.go b/core/workflow/template/fieldwrappers.go index e8d0263fa..0e83573e9 100644 --- a/core/workflow/template/fieldwrappers.go +++ b/core/workflow/template/fieldwrappers.go @@ -74,3 +74,32 @@ func (t *mapItemWrapper) Get() string { func (t *mapItemWrapper) Set(value string) { t.setter(value) } + +type sliceItemWrapper struct { + getter func() string + setter func(value string) +} + +func WrapSliceItems(items []string) Fields { + fields := make(Fields, 0) + for i, _ := range items { + index := i // we need a local copy for the getter/setter closures + fields = append(fields, &sliceItemWrapper{ + getter: func() string { + return items[index] + }, + setter: func(value string) { + items[index] = value + }, + }) + } + return fields +} + +func (t *sliceItemWrapper) Get() string { + return t.getter() +} + +func (t *sliceItemWrapper) Set(value string) { + t.setter(value) +} From ded895c4bcacbffe5cad1cb6c7cfce3fb4d75e41 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Feb 2020 16:46:53 +0100 Subject: [PATCH 0134/2352] [core] Parametrize basic task arguments and env vars --- core/environment/manager.go | 3 +-- core/scheduler.go | 12 ++++++++-- core/server.go | 2 +- core/task/task.go | 44 ++++++++++++++++++++++++++++++++++--- core/workflow/load.go | 3 +-- core/workflow/rolebase.go | 2 +- 6 files changed, 55 insertions(+), 11 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index bec4df809..5bc056b43 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -31,7 +31,6 @@ import ( "sync" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/pborman/uuid" "github.com/sirupsen/logrus" @@ -180,5 +179,5 @@ func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable if strings.Contains(workflowPath, "://") { return nil, errors.New("workflow loading from file not implemented yet") } - return workflow.Load(the.ConfSvc().GetROSource(), workflowPath, parent, envs.taskman, workflowUserVars) + return workflow.Load(workflowPath, parent, envs.taskman, workflowUserVars) } diff --git a/core/scheduler.go b/core/scheduler.go index 9206b92ab..c63c8ac15 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -566,8 +566,16 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl delete(offerIDsToDecline, offer.ID) } - // Define the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize - cmd := taskPtr.BuildTaskCommand() + // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize + err := taskPtr.BuildTaskCommand(descriptor.TaskRole) + if err != nil { + log.WithPrefix("scheduler"). + WithField("offerId", offer.ID.Value). + WithError(err). + Error("cannot build task command") + continue + } + cmd := taskPtr.GetTaskCommandInfo() // Claim the control port availPorts, ok := resources.Ports(remainingResources...) diff --git a/core/server.go b/core/server.go index 3561d0d35..e01e45ae5 100644 --- a/core/server.go +++ b/core/server.go @@ -363,7 +363,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge return &pb.GetTaskReply{}, status.New(codes.NotFound, "task not found").Err() } taskClass := task.GetTaskClass() - commandInfo := task.BuildTaskCommand() + commandInfo := task.GetTaskCommandInfo() var outbound []channel.Outbound taskPath := "" // TODO: probably not the nicest way to do this... the outbound assignments should be cached diff --git a/core/task/task.go b/core/task/task.go index e59abd9bf..ee2956d5c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -30,12 +30,16 @@ package task import ( + "errors" + texttemplate "text/template" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/workflow/template" "github.com/mesos/mesos-go/api/v1/lib" "github.com/pborman/uuid" "github.com/sirupsen/logrus" @@ -54,6 +58,7 @@ type parentRole interface { GetDefaults() gera.StringMap GetVars() gera.StringMap GetUserVars() gera.StringMap + ConsolidatedVarStack() (varStack map[string]string, err error) } /* @@ -100,6 +105,8 @@ type Task struct { GetTaskClass func() *Class // ↑ to be filled in by NewTaskForMesosOffer in Manager + + commandInfo *common.TaskCommandInfo } func (t *Task) IsSafeToStop() bool { @@ -144,12 +151,40 @@ func (t *Task) GetClassName() string { return "" } +func (t Task) GetTaskCommandInfo() *common.TaskCommandInfo { + return t.commandInfo +} + // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. -func (t Task) BuildTaskCommand() (cmd *common.TaskCommandInfo) { +func (t Task) BuildTaskCommand(role parentRole) (err error) { if class := t.GetTaskClass(); class != nil { - cmd = &common.TaskCommandInfo{} + cmd := &common.TaskCommandInfo{} cmd.CommandInfo = *class.Command.Copy() + + // If it's a basic task, we parametrize its arguments + // TODO: the task payload should be shipped on CONFIGURE and not on deployment, + // because this way we cannot reconfigure a basic task + if class.Control.Mode == controlmode.BASIC { + var varStack map[string]string + varStack, err = role.ConsolidatedVarStack() + if err != nil { + t.commandInfo = &common.TaskCommandInfo{} + log.WithError(err).Error("cannot fetch variables stack for task command info") + return + } + fields := append( + template.WrapSliceItems(cmd.Env), + template.WrapSliceItems(cmd.Arguments)... + ) + err = fields.Execute(t.name, varStack, nil, make(map[string]texttemplate.Template)) + if err != nil { + t.commandInfo = &common.TaskCommandInfo{} + log.WithError(err).Error("cannot resolve templates for task command info") + return + } + } + if class.Control.Mode == controlmode.FAIRMQ { // FIXME read this from configuration contains := func(s []string, str string) bool { @@ -169,9 +204,12 @@ func (t Task) BuildTaskCommand() (cmd *common.TaskCommandInfo) { "-P", "OCC", "--color", "false") } + cmd.ControlMode = class.Control.Mode + t.commandInfo = cmd } else { - cmd = &common.TaskCommandInfo{} + t.commandInfo = &common.TaskCommandInfo{} + err = errors.New("cannot build task command info: task class not available") } return } diff --git a/core/workflow/load.go b/core/workflow/load.go index c76d0f076..6b9b1f1fd 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -27,7 +27,6 @@ package workflow import ( "io/ioutil" - "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -35,7 +34,7 @@ import ( ) // FIXME: workflowPath should be of type configuration.Path, not string -func Load(cfg configuration.ROSource, workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { +func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var resolvedWorkflowPath string diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index f1d392dae..15890a688 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -62,7 +62,7 @@ type roleBase struct { Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role } -func (r *roleBase) consolidateVarStack() (varStack map[string]string, err error) { +func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error) { // FIXME: this function is not used any more var defaults, vars, userVars map[string]string defaults, err = r.Defaults.Flattened() From 9fe6f9e305196e78d1cb315b5fe1b15ba85d2590 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Feb 2020 17:07:33 +0100 Subject: [PATCH 0135/2352] [core] Add defaults map to task template --- core/task/class.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/task/class.go b/core/task/class.go index 515522084..17db8d9a8 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -39,6 +39,7 @@ import ( // role Class. type Class struct { Identifier taskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` @@ -54,6 +55,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // gera.StringMap is an interface type _class struct { Identifier taskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` @@ -64,12 +66,14 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { Constraints []constraint.Constraint `yaml:"constraints"` } aux := _class{ + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) if err == nil { *c = Class{ Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), Control: aux.Control, Command: aux.Command, Wants: aux.Wants, From 0012718dc5cd2a02f114656595f2f75f4e122acc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Feb 2020 17:08:09 +0100 Subject: [PATCH 0136/2352] [core] Run template system on Task.properties --- core/task/task.go | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index ee2956d5c..dc13f6b0e 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -274,13 +274,41 @@ func (t Task) GetBindPorts() map[string]uint64 { return t.bindPorts } -func (t Task) BuildPropertyMap(bindMap channel.BindMap) controlcommands.PropertyMap { +func (t Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { //parentMap := t.parent.GetPropertyMap() //FIXME support parent properties - propMap := make(controlcommands.PropertyMap) + propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { - // + if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task, we template the props + if t.parent == nil { + return + } + varStack, err := t.parent.ConsolidatedVarStack() + if err != nil { + log.WithError(err).Error("cannot fetch variables stack for property map") + return + } + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) + if err != nil { + log.WithError(err).Error("cannot fetch task class defaults for property map") + return + } + + for k, v := range t.GetProperties() { + propMap[k] = v + } + + fields := template.WrapMapItems(propMap) + + err = fields.Execute(t.name, varStack, nil, make(map[string]texttemplate.Template)) + if err != nil { + log.WithError(err).Error("cannot resolve templates for property map") + return + } + } + + // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ { for _, inbCh := range class.Bind { port, ok := t.bindPorts[inbCh.Name] @@ -315,9 +343,6 @@ func (t Task) BuildPropertyMap(bindMap channel.BindMap) controlcommands.Property } } } - for k, v := range t.GetProperties() { - propMap[k] = v - } return propMap } From 0d33e804bc0fa3c36b25ac9ea278f7ba9ffba49f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Feb 2020 14:25:31 +0100 Subject: [PATCH 0137/2352] [coconut] Extract a new componentcfg package from configurationutil.go --- coconut/configuration/configuration.go | 87 ++++++++-------- coconut/configuration/configurationutil.go | 101 +++--------------- configuration/componentcfg/componentcfg.go | 113 +++++++++++++++++++++ core/confsys/service.go | 2 +- 4 files changed, 172 insertions(+), 131 deletions(-) create mode 100644 configuration/componentcfg/componentcfg.go diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 25e857b65..5fa707546 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -27,23 +27,25 @@ package configuration import ( - "github.com/spf13/cobra" - "github.com/spf13/viper" - "github.com/briandowns/spinner" - "strconv" - "time" + "encoding/json" + "errors" + "fmt" "io" - "github.com/sirupsen/logrus" "os" "sort" - "github.com/AliceO2Group/Control/common/logger" - "fmt" + "strconv" "strings" + "time" + + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration" - "errors" - "encoding/json" - "gopkg.in/yaml.v2" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/briandowns/spinner" "github.com/naoina/toml" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "gopkg.in/yaml.v2" ) var log = logger.New(logrus.StandardLogger(), "coconut") @@ -52,7 +54,7 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) -const ( +const ( nonZero = iota invalidArgs = iota // Provided args by the user are invalid invalidArgsErrMsg = "component and entry names cannot contain `/ or `@`" @@ -60,7 +62,6 @@ const ( emptyData = iota // Source retrieved empty data emptyDataErrMsg = "no data was found" logicError = iota // Logic/Output error - componentsPath = "o2/components/" ) func WrapCall(call ConfigurationCall) RunFunc { @@ -71,7 +72,7 @@ func WrapCall(call ConfigurationCall) RunFunc { Debug("initializing configuration client") s := spinner.New(spinner.CharSets[11], 100*time.Millisecond) - s.Color("yellow") + _ = s.Color("yellow") s.Suffix = " working..." s.Start() @@ -137,13 +138,13 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, logicError } - fmt.Fprintln(o, string(output)) + _, _ = fmt.Fprintln(o, string(output)) return nil, nonZero } func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - keyPrefix := componentsPath + keyPrefix := componentcfg.ConfigComponentsPath useTimestamp := false if len(args) > 1 { return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , invalidArgs @@ -153,7 +154,7 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, invalidArgs } if len(args) == 1 { - if !isInputSingleValidWord(args[0]) { + if !componentcfg.IsInputSingleValidWord(args[0]) { return errors.New(invalidArgsErrMsg), invalidArgs } else { keyPrefix += args[0] + "/" @@ -177,7 +178,7 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if err != nil { return err, logicError } - fmt.Fprintln(o, string(output)) + _, _ = fmt.Fprintln(o, string(output)) return nil, nonZero } @@ -195,7 +196,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o switch len(args) { case 1: - if isInputCompEntryTsValid(args[0] ) { + if componentcfg.IsInputCompEntryTsValid(args[0] ) { if strings.Contains(args[0], "@") { if timestamp != "" { err = errors.New("flag `-t / --timestamp` must not be provided when using format /@") @@ -218,7 +219,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return errors.New("please provide entry name"), invalidArgs } case 2: - if !isInputSingleValidWord(args[0]) || !isInputSingleValidWord(args[1]) { + if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { return errors.New(invalidArgsErrMsg), invalidArgs } else { component = args[0] @@ -226,32 +227,32 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } } - var configuration string + var cfgPayload string if timestamp == "" { - keyPrefix := componentsPath + component + "/" + entry + keyPrefix := componentcfg.ConfigComponentsPath + component + "/" + entry keys, err := cfg.GetKeysByPrefix(keyPrefix, "") if err != nil { return err, connectionError } - timestamp, err, code = getLatestTimestamp(keys, component , entry) + timestamp, err = componentcfg.GetLatestTimestamp(keys, component , entry) if err != nil { - return err, code + return err, emptyData } } - key = componentsPath + component + "/" + entry + "/" + timestamp - configuration, err = cfg.Get(key) + key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp + cfgPayload, err = cfg.Get(key) if err != nil { return err, connectionError } - if configuration == "" { + if cfgPayload == "" { return errors.New(emptyDataErrMsg), emptyData } - fmt.Fprintln(o, configuration) + _, _ = fmt.Fprintln(o, cfgPayload) return nil, nonZero } -func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o io.Writer)(err error, code int) { var key, component, entry string if len(args) < 1 || len(args) > 2 { @@ -259,10 +260,10 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } switch len(args) { case 1: - if isInputSingleValidWord(args[0]) { + if componentcfg.IsInputSingleValidWord(args[0]) { component = args[0] entry = "" - } else if isInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ + } else if componentcfg.IsInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ splitCom := strings.Split(args[0], "/") component = splitCom[0] entry = splitCom[1] @@ -270,7 +271,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return errors.New(invalidArgsErrMsg), invalidArgs } case 2: - if isInputSingleValidWord(args[0]) && isInputSingleValidWord(args[1]) { + if componentcfg.IsInputSingleValidWord(args[0]) && componentcfg.IsInputSingleValidWord(args[1]) { component = args[0] entry = args[1] } else { @@ -278,7 +279,7 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } } - key = componentsPath + component + "/" + entry + key = componentcfg.ConfigComponentsPath + component + "/" + entry var keys sort.StringSlice keys , err = cfg.GetKeysByPrefix(key, "") if err != nil { @@ -293,21 +294,21 @@ func History(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } else { maxLen := getMaxLenOfKey(keys) var currentKeys sort.StringSlice - _, entry, _ := getComponentEntryTimestampFromConsul(keys[0]) + _, entry, _ := componentcfg.GetComponentEntryTimestampFromConsul(keys[0]) for _, value := range keys { - _, currentEntry, _ := getComponentEntryTimestampFromConsul(value) + _, currentEntry, _ := componentcfg.GetComponentEntryTimestampFromConsul(value) if currentEntry == entry { currentKeys = append(currentKeys, value) } else { - fmt.Fprintln(o, "- " + entry) + _, _ = fmt.Fprintln(o, "- "+entry) sort.Sort(sort.Reverse(currentKeys)) //sort in reverse of timestamps drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) currentKeys = []string{value} entry = currentEntry } } - fmt.Fprintln(o, "- " + entry) + _, _ = fmt.Fprintln(o, "- "+entry) drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) } } @@ -332,7 +333,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, component, entry, err = getComponentEntryFromUserInput(args[0]) filePath = args[1] case 3: - if !isInputSingleValidWord(args[0]) || !isInputSingleValidWord(args[1]) { + if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { err = errors.New(invalidArgsErrMsg) } else { component = args[0] @@ -363,11 +364,11 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return err, connectionError } - components := getComponentsMapFromKeysList(keys) + components := componentcfg.GetComponentsMapFromKeysList(keys) componentExist := components[component] if !componentExist && !useNewComponent { componentMsg := "" - for key, _ := range components { + for key := range components { componentMsg += "\n- " + key } return errors.New("component " + component + " does not exist. " + @@ -381,7 +382,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, entryExists := false if !useNewComponent { - entriesMap := getEntriesMapOfComponentFromKeysList(component, keys) + entriesMap := componentcfg.GetEntriesMapOfComponentFromKeysList(component, keys) entryExists = entriesMap[entry] } @@ -391,7 +392,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } timestamp := time.Now().Unix() - key := componentsPath + component + "/" + entry + "/" + strconv.FormatInt(timestamp, 10) + key := componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + strconv.FormatInt(timestamp, 10) err = cfg.Put(key, string(fileContent)) if err != nil { return @@ -409,7 +410,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, fullKey := red(component) + "/" + blue(entry) + "@" + strconv.FormatInt(timestamp, 10) userMsg += "Configuration imported: " + fullKey - fmt.Fprintln(o, userMsg) + _, _ = fmt.Fprintln(o, userMsg) return nil, 0 } diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index 7f6618d67..47f57626d 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -25,71 +25,39 @@ package configuration import ( + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/fatih/color" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" - "strconv" + "errors" + "regexp" "time" "io" "io/ioutil" "os" "strings" - "errors" - "regexp" "encoding/json" "gopkg.in/yaml.v2" ) -var ( - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) - inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)$`) -) var( blue = color.New(color.FgHiBlue).SprintFunc() red = color.New(color.FgHiRed).SprintFunc() + inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)$`) ) -func isInputCompEntryTsValid(input string) bool { - return inputFullRegex.MatchString(input) -} func isInputCompEntryValid(input string) bool { return inputComponentEntryRegex.MatchString(input) } -func isInputSingleValidWord(input string) bool { - return !strings.Contains(input, "/") && !strings.Contains(input, "@") -} - -// Method to parse a timestamp in the specified format -func getTimestampInFormat(timestamp string, timeFormat string)(string, error){ - timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) - if err != nil { - return "", errors.New("unable to identify timestamp") - } - tm := time.Unix(timeStampAsInt, 0) - return tm.Format(timeFormat), nil -} - -// Method to return the latest timestamp for a specified component & entry -// If no keys were passed an error and code exit 3 will be returned -func getLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error, code int) { - keyPrefix := componentsPath + component + "/" + entry - if len(keys) == 0 { - err = errors.New("no keys found") - return "", err, emptyData - } - - var maxTimeStamp uint64 - for _, key := range keys { - componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) - if err == nil { - if componentTimestamp > maxTimeStamp { - maxTimeStamp = componentTimestamp - } - } +func getComponentEntryFromUserInput(input string) (string, string, error) { + if isInputCompEntryValid(input) { + splitCom := strings.Split(input, "/") + return splitCom[0], splitCom[1], nil + } else { + return "", "", errors.New(invalidArgsErrMsg) } - return strconv.FormatUint(maxTimeStamp, 10), nil, nonZero } // Method to return a list of components, entries or entries with latest timestamp @@ -137,8 +105,8 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W table.SetColMinWidth(0, max) for _, value := range history { - component, entry, timestamp := getComponentEntryTimestampFromConsul(value) - prettyTimestamp, err := getTimestampInFormat(timestamp, time.RFC822) + component, entry, timestamp := componentcfg.GetComponentEntryTimestampFromConsul(value) + prettyTimestamp, err := componentcfg.GetTimestampInFormat(timestamp, time.RFC822) if err != nil { prettyTimestamp = timestamp } @@ -166,21 +134,11 @@ func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, return parsedOutput, nil } -// Method to split component, entry and timestamp when being passed a key from consul -// e.g. of key o2/components/quality-control/cru-demo/12345678 -func getComponentEntryTimestampFromConsul(key string)(string, string, string) { - key = strings.TrimPrefix(key, componentsPath) - key = strings.TrimPrefix(key, "/'") - key = strings.TrimSuffix(key, "/") - elements := strings.Split(key, "/") - return elements[0], elements[1], elements[2] -} - func getMaxLenOfKey(keys []string) (maxLen int){ maxLen = 0 for _, value := range keys { - if len(value) - len(componentsPath) >= maxLen { - maxLen = len(value) - len(componentsPath) + if len(value) - len(componentcfg.ConfigComponentsPath) >= maxLen { + maxLen = len(value) - len(componentcfg.ConfigComponentsPath) } } return @@ -200,38 +158,7 @@ func getFileContent(filePath string)(fileContent []byte, err error) { return fileContentByte, nil } -func getComponentsMapFromKeysList(keys []string) map[string]bool { - var componentsMap = make(map[string]bool) - for _,value := range keys { - value := strings.TrimPrefix(value, componentsPath) - component := strings.Split(value, "/" )[0] - componentsMap[component] = true - } - return componentsMap -} - -func getEntriesMapOfComponentFromKeysList(component string, keys []string) map[string]bool { - var entriesMap = make(map[string]bool) - for _,value := range keys { - value := strings.TrimPrefix(value, componentsPath) - parts := strings.Split(value, "/" ) - if parts[0] == component { - entriesMap[parts[1]] = true - } - } - return entriesMap -} - func isFileExtensionValid(extension string) bool{ extension = strings.ToUpper(extension) return extension == "JSON" || extension == "YAML" || extension == "YML" || extension == "INI" || extension == "TOML" } - -func getComponentEntryFromUserInput(input string) (string, string, error) { - if isInputCompEntryValid(input) { - splitCom := strings.Split(input, "/") - return splitCom[0], splitCom[1], nil - } else { - return "", "", errors.New(invalidArgsErrMsg) - } -} diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go new file mode 100644 index 000000000..10dd3406a --- /dev/null +++ b/configuration/componentcfg/componentcfg.go @@ -0,0 +1,113 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package componentcfg + +import ( + "errors" + "regexp" + "strconv" + "strings" + "time" +) + +const ( + ConfigComponentsPath = "o2/components/" +) + +var ( + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) +) + +func IsInputCompEntryTsValid(input string) bool { + return inputFullRegex.MatchString(input) +} + +func IsInputSingleValidWord(input string) bool { + return !strings.Contains(input, "/") && !strings.Contains(input, "@") +} + +// Method to parse a timestamp in the specified format +func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ + timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) + if err != nil { + return "", errors.New("unable to identify timestamp") + } + tm := time.Unix(timeStampAsInt, 0) + return tm.Format(timeFormat), nil +} + +// Method to return the latest timestamp for a specified component & entry +// If no keys were passed an error and code exit 3 will be returned +func GetLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error) { + keyPrefix := ConfigComponentsPath + component + "/" + entry + if len(keys) == 0 { + err = errors.New("no keys found") + return "", err + } + + var maxTimeStamp uint64 + for _, key := range keys { + componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) + if err == nil { + if componentTimestamp > maxTimeStamp { + maxTimeStamp = componentTimestamp + } + } + } + return strconv.FormatUint(maxTimeStamp, 10), nil +} + +// Method to split component, entry and timestamp when being passed a key from consul +// e.g. of key o2/components/quality-control/cru-demo/12345678 +func GetComponentEntryTimestampFromConsul(key string)(string, string, string) { + key = strings.TrimPrefix(key, ConfigComponentsPath) + key = strings.TrimPrefix(key, "/'") + key = strings.TrimSuffix(key, "/") + elements := strings.Split(key, "/") + return elements[0], elements[1], elements[2] +} + + +func GetComponentsMapFromKeysList(keys []string) map[string]bool { + var componentsMap = make(map[string]bool) + for _,value := range keys { + value := strings.TrimPrefix(value, ConfigComponentsPath) + component := strings.Split(value, "/" )[0] + componentsMap[component] = true + } + return componentsMap +} + +func GetEntriesMapOfComponentFromKeysList(component string, keys []string) map[string]bool { + var entriesMap = make(map[string]bool) + for _,value := range keys { + value := strings.TrimPrefix(value, ConfigComponentsPath) + parts := strings.Split(value, "/" ) + if parts[0] == component { + entriesMap[parts[1]] = true + } + } + return entriesMap +} diff --git a/core/confsys/service.go b/core/confsys/service.go index ac119e670..d150ed266 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -251,7 +251,7 @@ func (s *Service) RefreshRepositories() { // Returns a YAML file OR even a structure made of Roles or Nodes with: // import() functions already computed and resolved -// vars inserted (todo: figure out which vars get parsed when and where) +// vars inserted func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]string /*vars from cli/gui*/) string { panic("not implemented yet") } From d1d0b1ce5ec00f2031c85aea3298fac1bfea1e53 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Feb 2020 17:26:55 +0100 Subject: [PATCH 0138/2352] [core] Implement GetKeysByPrefix for all configuration.Sources --- coconut/configuration/configuration.go | 8 ++++---- configuration/consulsource.go | 9 +++------ configuration/source.go | 1 + configuration/yamlsource.go | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 5fa707546..99d42858b 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -164,7 +164,7 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } } - keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + keys, err := cfg.GetKeysByPrefix(keyPrefix) if err != nil { return err, connectionError } @@ -230,7 +230,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o var cfgPayload string if timestamp == "" { keyPrefix := componentcfg.ConfigComponentsPath + component + "/" + entry - keys, err := cfg.GetKeysByPrefix(keyPrefix, "") + keys, err := cfg.GetKeysByPrefix(keyPrefix) if err != nil { return err, connectionError } @@ -281,7 +281,7 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o key = componentcfg.ConfigComponentsPath + component + "/" + entry var keys sort.StringSlice - keys , err = cfg.GetKeysByPrefix(key, "") + keys , err = cfg.GetKeysByPrefix(key) if err != nil { return err, connectionError } @@ -359,7 +359,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, extension = strings.ToUpper(useExtension) } - keys, err := cfg.GetKeysByPrefix("", "") + keys, err := cfg.GetKeysByPrefix("") if err != nil { return err, connectionError } diff --git a/configuration/consulsource.go b/configuration/consulsource.go index ffb685d77..9c7d2db24 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -88,13 +88,10 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } -func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string, separator string)(value []string, err error) { +func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { keyPrefix = formatKey(keyPrefix) - keys, _, err := cc.kv.Keys(keyPrefix, separator, nil) - if err != nil { - return - } - return keys, nil + keys, _, err = cc.kv.Keys(keyPrefix, "", nil) + return } func (cc *ConsulSource) GetRecursive(key string) (value Item, err error) { diff --git a/configuration/source.go b/configuration/source.go index 9fba16cb1..24f37d6a0 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -34,6 +34,7 @@ import ( type ROSource interface { Get(string) (string, error) + GetKeysByPrefix(string)([]string, error) GetRecursive(string) (Item, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index c75a071bd..9f6daa358 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -150,6 +150,25 @@ func (yc *YamlSource) Get(key string) (value string, err error) { return } +func (yc *YamlSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { + var recursive Item + recursive, err = yc.GetRecursive(keyPrefix) + if err != nil { + return + } + + keys = []string{} + if recursive.Type() != IT_Map { + err = errors.New("cannot get keys of non-map type") + return + } + for k := range recursive.Map() { + keys = append(keys, k) + } + return +} + + func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { From 61b7654f77c6cd5c0d098c5b0961ab3a48906399 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Feb 2020 17:30:14 +0100 Subject: [PATCH 0139/2352] [core] Implement confsys.GetComponentConfiguration --- core/confsys/service.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/core/confsys/service.go b/core/confsys/service.go index d150ed266..9e900e0bc 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -26,6 +26,7 @@ package confsys import ( "encoding/json" + "errors" "io/ioutil" "os" "path/filepath" @@ -35,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -283,4 +285,42 @@ func (s *Service) GetMesosFID() (fidValue string, err error) { func (s *Service) GetReposPath() string { return filepath.Join(viper.GetString("coreWorkingDir"), "repos") +} + +func (s *Service) GetComponentConfiguration(path string) (payload string, err error) { + var key, component, entry, timestamp string + if componentcfg.IsInputCompEntryTsValid(path) { + if strings.Contains(path, "@") { + // coconut conf show component/entry@timestamp + arg := strings.Replace(path, "@", "/", 1) + params := strings.Split(arg, "/") + component = params[0] + entry = params[1] + timestamp = params[2] + } else if strings.Contains(path, "/") { + // coconut conf show component/entry + params := strings.Split(path, "/") + component = params[0] + entry = params[1] + } + } else { + err = errors.New("bad component configuration key format") + return + } + + if len(timestamp) == 0 { + keyPrefix := componentcfg.ConfigComponentsPath + component + "/" + entry + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, component, entry) + if err != nil { + return + } + } + key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp + payload, err = s.src.Get(key) + return } \ No newline at end of file From bde3315088ee6a41b16f7b658448e77841a1a82b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Feb 2020 17:31:21 +0100 Subject: [PATCH 0140/2352] [core] Implement To/FromJson and GetConfig functions for template system --- core/task/task.go | 5 ++- core/workflow/aggregatorrole.go | 1 - core/workflow/template/stack.go | 74 +++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 core/workflow/template/stack.go diff --git a/core/task/task.go b/core/task/task.go index dc13f6b0e..9f6c9e179 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -295,13 +295,16 @@ func (t Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands return } + objStack := template.MakeJsonConversionFuncMap() + objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) + for k, v := range t.GetProperties() { propMap[k] = v } fields := template.WrapMapItems(propMap) - err = fields.Execute(t.name, varStack, nil, make(map[string]texttemplate.Template)) + err = fields.Execute(t.name, varStack, objStack, make(map[string]texttemplate.Template)) if err != nil { log.WithError(err).Error("cannot resolve templates for property map") return diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0b7732d06..6dae97d7d 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -100,7 +100,6 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) return }(), } - // FIXME add template processing of cmdinfo, etc. here and in taskrole // TODO: push cached templates here err = templSequence.Execute(r.GetPath(), diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go new file mode 100644 index 000000000..0c95152bb --- /dev/null +++ b/core/workflow/template/stack.go @@ -0,0 +1,74 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package template + +import ( + "fmt" + texttemplate "text/template" + + "github.com/AliceO2Group/Control/core/the" + "gopkg.in/yaml.v2" +) + +type GetConfigFunc func(string) string + +func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { + return func(path string) string { + payload, err := the.ConfSvc().GetComponentConfiguration(path) + if err != nil { + log.WithError(err). + WithField("path", path). + Warn("failed to get component configuration") + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + fields := Fields{WrapPointer(&payload)} + err = fields.Execute(path, varStack, nil, make(map[string]texttemplate.Template)) + return payload + } +} + +func MakeJsonConversionFuncMap() map[string]interface{} { + return map[string]interface{} { + "FromJson": func(in string) (out interface{}) { + bytes := []byte(in) + err := yaml.Unmarshal(bytes, out) + if err != nil { + log.WithError(err).Warn("error unmarshaling JSON/YAML in template system") + return + } + return + }, + "ToJson": func(in interface{}) (out string) { + bytes, err := yaml.Marshal(in) + if err != nil { + log.WithError(err).Warn("error marshaling JSON/YAML in template system") + return + } + out = string(bytes) + return + }, + } +} \ No newline at end of file From b4b5810b0a941f4b4a64e9f6c0779f9bd9a6c99f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 21 Feb 2020 13:27:35 +0100 Subject: [PATCH 0141/2352] [core] Template Task.Value and User --- core/task/task.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 9f6c9e179..98515ea85 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -174,8 +174,14 @@ func (t Task) BuildTaskCommand(role parentRole) (err error) { return } fields := append( - template.WrapSliceItems(cmd.Env), - template.WrapSliceItems(cmd.Arguments)... + template.Fields{ + template.WrapPointer(cmd.Value), + template.WrapPointer(cmd.User), + }, + append( + template.WrapSliceItems(cmd.Env), + template.WrapSliceItems(cmd.Arguments)... + )... ) err = fields.Execute(t.name, varStack, nil, make(map[string]texttemplate.Template)) if err != nil { @@ -373,5 +379,4 @@ func (t *Task) GetProperties() map[string]string { return make(map[string]string) } return propertiesMap - // FIXME: this should merge Class properties and properties acquired from the workflow } From 9312e0579cc10aa8588b8901cf8f396789ac7f59 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Feb 2020 18:46:41 +0100 Subject: [PATCH 0142/2352] [core] gera.FlattenStack convenience function --- common/gera/stringmap.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 1708b6c2d..41879a235 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -65,6 +65,21 @@ func MakeStringMapWithMap(fromMap map[string]string) *StringWrapMap { return myMap } +func FlattenStack(stringMaps ...StringMap) (flattened map[string]string, err error) { + flattenedSM := MakeStringMap() + for _, stringMap := range stringMaps { + var localFlattened map[string]string + localFlattened, err = stringMap.Flattened() + if err != nil { + return + } + flattenedSM = MakeStringMapWithMap(localFlattened).Wrap(flattenedSM).(*StringWrapMap) + } + + flattened, err = flattenedSM.Flattened() + return +} + func MakeStringMapWithMapCopy(fromMap map[string]string) *StringWrapMap { newBackingMap := make(map[string]string) for k, v := range fromMap { From 2ce94ae6f48da42a1da560af36de80a08a7fe4ec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Feb 2020 17:35:54 +0100 Subject: [PATCH 0143/2352] [core] Allow variables to control the expansion of an iteratorRole This also implements range-based iterator role syntax and moves iterator role template expansion from the unmarshal phase to the template processing phase. --- core/workflow/iteratorrange.go | 102 +++++++++++++++++++++++++++++++ core/workflow/iteratorrole.go | 107 +++++++++++++++++++-------------- core/workflow/load.go | 11 ++++ 3 files changed, 175 insertions(+), 45 deletions(-) create mode 100644 core/workflow/iteratorrange.go diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go new file mode 100644 index 000000000..26bcacfe3 --- /dev/null +++ b/core/workflow/iteratorrange.go @@ -0,0 +1,102 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "encoding/json" + "strconv" + texttemplate "text/template" + + "github.com/AliceO2Group/Control/core/workflow/template" +) + +type iteratorRange interface { + GetRange(varStack map[string]string) (ran []string, err error) + GetVar() string +} + +type iteratorRangeExpr struct { + Range string `yaml:"range"` + Var string `yaml:"var"` +} + +func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, err error) { + rangeObj := make([]string, 0) + + fields := template.Fields{ + template.WrapPointer(&f.Range), + } + err = fields.Execute("", varStack, template.MakeJsonConversionFuncMap(), make(map[string]texttemplate.Template)) + if err != nil { + return + } + + err = json.Unmarshal([]byte(f.Range), &rangeObj) + ran = rangeObj + return +} + +func (f *iteratorRangeExpr) GetVar() string { + return f.Var +} + + +type iteratorRangeFor struct { + Begin string `yaml:"begin"` + End string `yaml:"end"` + Var string `yaml:"var"` +} + +func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, err error) { + ran = make([]string, 0) + + fields := template.Fields{ + template.WrapPointer(&f.Begin), + template.WrapPointer(&f.End), + } + err = fields.Execute("", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) + if err != nil { + return + } + + var begin, end int + begin, err = strconv.Atoi(f.Begin) + if err != nil { + return + } + end, err = strconv.Atoi(f.End) + if err != nil { + return + } + + for j := begin; j <= end; j++ { + ran = append(ran, strconv.Itoa(j)) + } + return +} + +func (f *iteratorRangeFor) GetVar() string { + return f.Var +} diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index a1ef4bcbe..82cb8852b 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2018-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -26,9 +26,9 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/repos" - "strconv" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" @@ -37,7 +37,7 @@ import ( type iteratorRole struct { aggregator - For iteratorInfo `yaml:"for,omitempty"` + For iteratorRange `yaml:"for,omitempty"` template roleTemplate } @@ -55,14 +55,46 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err if err != nil { return } - auxFor := struct { - For iteratorInfo `yaml:"for"` + + type _iteratorRangeUnion struct { + Begin *string `yaml:"begin"` + End *string `yaml:"end"` + Var *string `yaml:"var"` + Range *string `yaml:"range"` + } + auxForUnion := struct { + For _iteratorRangeUnion `yaml:"for"` }{} - err = unmarshal(&auxFor) + err = unmarshal(&auxForUnion) if err != nil { return } + var forBlock iteratorRange + switch { + case auxForUnion.For.Begin != nil && auxForUnion.For.End != nil && auxForUnion.For.Var != nil: + auxFor := struct { + For *iteratorRangeFor `yaml:"for"` + }{} + err = unmarshal(&auxFor) + if err != nil { + return + } + forBlock = auxFor.For + case auxForUnion.For.Range != nil && auxForUnion.For.Var != nil: + auxFor := struct { + For *iteratorRangeExpr `yaml:"for"` + }{} + err = unmarshal(&auxFor) + if err != nil { + return + } + forBlock = auxFor.For + default: + err = errors.New("invalid range specifier in iterator") + return + } + var template roleTemplate switch { case auxUnion.Roles != nil && auxUnion.Task == nil: @@ -79,47 +111,13 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err } role.template = template - role.For = auxFor.For + role.For = forBlock // FIXME: if Name does not contain {{ }}, we must bail! - - err = role.expandTemplate() - if err != nil { - return - } *i = role return } -type iteratorInfo struct { - Begin int `yaml:"begin"` - End int `yaml:"end"` - Var string `yaml:"var"` -} - -func (f *iteratorInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - aux := struct{ - Begin string `yaml:"begin"` - End string `yaml:"end"` - Var string `yaml:"var"` - }{} - err = unmarshal(&aux) - if err != nil { - return - } - - f.Begin, err = strconv.Atoi(aux.Begin) - if err != nil { - return - } - f.End, err = strconv.Atoi(aux.End) - if err != nil { - return - } - f.Var = aux.Var - return -} - func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) for _, chr := range i.Roles { @@ -136,6 +134,11 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { return errors.New("role tree error when processing templates") } + err = i.expandTemplate() + if err != nil { + return + } + for _, role := range i.Roles { err = role.ProcessTemplates(workflowRepo) if err != nil { @@ -146,14 +149,28 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { } func (i *iteratorRole) expandTemplate() (err error) { - values := make(map[string]string) + varStack := make(map[string]string) + if parent := i.GetParent(); parent != nil { + varStack, _ = gera.FlattenStack( + parent.GetDefaults(), + parent.GetVars(), + parent.GetUserVars(), + ) + } roles := make([]Role, 0) - for j := i.For.Begin; j <= i.For.End; j++ { - values[i.For.Var] = strconv.Itoa(j) + var ran []string + ran, err = i.For.GetRange(varStack) + if err != nil { + return + } + + for _, localValue := range ran { + locals := make(map[string]string) + locals[i.For.GetVar()] = localValue var newRole Role - newRole, err = i.template.generateRole(values) + newRole, err = i.template.generateRole(locals) if err != nil { return } diff --git a/core/workflow/load.go b/core/workflow/load.go index 6b9b1f1fd..59cbfb863 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -25,11 +25,15 @@ package workflow import ( + "fmt" "io/ioutil" + "os" + "time" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" + "github.com/k0kubun/pp" "gopkg.in/yaml.v2" ) @@ -63,6 +67,10 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user workflow = root //fmt.Println("unprocessed workflow:") //_, _ = pp.Println(workflow) + timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) + f, err := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) + _, _ = pp.Fprintln(f, workflow) + defer f.Close() err = workflow.ProcessTemplates(workflowRepo) if err != nil { @@ -72,6 +80,9 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user log.WithField("path", workflowPath).Debug("workflow loaded") //fmt.Println("processed workflow:") //_, _ = pp.Println(workflow) + g, err := os.Create(fmt.Sprintf("wf-processed-%s.json", timestamp)) + _, _ = pp.Fprintln(g, workflow) + defer g.Close() // Update class list taskClassesRequired := workflow.GetTaskClasses() From 2705f39697cf0187be49d094e0024e39f6d6f017 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Feb 2020 18:54:59 +0100 Subject: [PATCH 0144/2352] [core] Fix issue with user provided vars not accessible Plus improved verbose output --- .gitignore | 2 ++ core/workflow/load.go | 25 ++++++++++++++----------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index f980c25ba..b1dec01c8 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,5 @@ build-* vendor tools bin +wf-unprocessed* +wf-processed* diff --git a/core/workflow/load.go b/core/workflow/load.go index 59cbfb863..b2ac39f1f 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/k0kubun/pp" + "github.com/spf13/viper" "gopkg.in/yaml.v2" ) @@ -61,16 +62,17 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return nil, err } if parent != nil { - root.parent = parent + root.setParent(parent) } workflow = root - //fmt.Println("unprocessed workflow:") - //_, _ = pp.Println(workflow) + timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) - f, err := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) - _, _ = pp.Fprintln(f, workflow) - defer f.Close() + if viper.GetBool("veryVerbose") { + f, _ := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) + _, _ = pp.Fprintln(f, workflow) + defer f.Close() + } err = workflow.ProcessTemplates(workflowRepo) if err != nil { @@ -78,11 +80,12 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return } log.WithField("path", workflowPath).Debug("workflow loaded") - //fmt.Println("processed workflow:") - //_, _ = pp.Println(workflow) - g, err := os.Create(fmt.Sprintf("wf-processed-%s.json", timestamp)) - _, _ = pp.Fprintln(g, workflow) - defer g.Close() + + if viper.GetBool("veryVerbose") { + g, _ := os.Create(fmt.Sprintf("wf-processed-%s.json", timestamp)) + _, _ = pp.Fprintln(g, workflow) + defer g.Close() + } // Update class list taskClassesRequired := workflow.GetTaskClasses() From 9082581d5715a3b86364632f5932ffce202c7e2f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Feb 2020 18:56:22 +0100 Subject: [PATCH 0145/2352] [core] Ensure correct template output when the result is a slice --- core/workflow/template/fields.go | 13 ++++++++++++- core/workflow/template/stack.go | 3 ++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index 0cc53225b..4f99a0ff3 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -26,6 +26,7 @@ package template import ( "bytes" + "encoding/json" "fmt" "io" "text/template" @@ -197,7 +198,17 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS return } - return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) + switch rawOutput.(type) { + case []interface{}, []string: + var jsonOutput []byte + jsonOutput, err = json.Marshal(rawOutput) + if err != nil { + return + } + return w.Write(jsonOutput) + default: + return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) + } }) if err != nil { log.WithError(err).WithField("role", parentPath).Warn("template processing error (bad variable or workflow file)") diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 0c95152bb..2a8b3ba11 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -25,6 +25,7 @@ package template import ( + "encoding/json" "fmt" texttemplate "text/template" @@ -62,7 +63,7 @@ func MakeJsonConversionFuncMap() map[string]interface{} { return }, "ToJson": func(in interface{}) (out string) { - bytes, err := yaml.Marshal(in) + bytes, err := json.Marshal(in) if err != nil { log.WithError(err).Warn("error marshaling JSON/YAML in template system") return From 0369763b94626b7c4574d84bf54d256b00ebf3f8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Feb 2020 18:56:53 +0100 Subject: [PATCH 0146/2352] [core] Fix bug with nil TaskCommandInfo preventing deployment --- core/task/task.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 98515ea85..8b57bdeb5 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -151,13 +151,13 @@ func (t *Task) GetClassName() string { return "" } -func (t Task) GetTaskCommandInfo() *common.TaskCommandInfo { +func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { return t.commandInfo } // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. -func (t Task) BuildTaskCommand(role parentRole) (err error) { +func (t *Task) BuildTaskCommand(role parentRole) (err error) { if class := t.GetTaskClass(); class != nil { cmd := &common.TaskCommandInfo{} cmd.CommandInfo = *class.Command.Copy() @@ -261,26 +261,26 @@ func (t *Task) GetExecutorId() string { return t.executorId } -func (t Task) GetAgentId() string { +func (t *Task) GetAgentId() string { return t.agentId } -func (t Task) GetHostname() string { +func (t *Task) GetHostname() string { return t.hostname } -func (t Task) GetEnvironmentId() uuid.Array { +func (t *Task) GetEnvironmentId() uuid.Array { if t.parent == nil { return uuid.NIL.Array() } return t.parent.GetEnvironmentId() } -func (t Task) GetBindPorts() map[string]uint64 { +func (t *Task) GetBindPorts() map[string]uint64 { return t.bindPorts } -func (t Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { +func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { //parentMap := t.parent.GetPropertyMap() //FIXME support parent properties @@ -355,7 +355,7 @@ func (t Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands return propMap } -func (t Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { +func (t *Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { return controlcommands.MesosCommandTarget{ AgentId: mesos.AgentID{ Value: t.GetAgentId(), From b39007599f37faa12bd5c88ee9160467cf8351f4 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 6 Mar 2020 15:56:40 +0100 Subject: [PATCH 0147/2352] [OCTRL-206] Add option in coconut to allow destroy env in running state --- coconut/cmd/environment_destroy.go | 1 + coconut/control/control.go | 18 +- coconut/protos/o2control.pb.go | 368 ++++++++++++++++------------- 3 files changed, 211 insertions(+), 176 deletions(-) diff --git a/coconut/cmd/environment_destroy.go b/coconut/cmd/environment_destroy.go index 01b49dc6a..280650b86 100644 --- a/coconut/cmd/environment_destroy.go +++ b/coconut/cmd/environment_destroy.go @@ -50,4 +50,5 @@ func init() { environmentCmd.AddCommand(environmentDestroyCmd) environmentDestroyCmd.Flags().BoolP("keep-tasks", "k", false, "keep tasks active after destroying the environment") + environmentDestroyCmd.Flags().BoolP("allow-in-running-state", "a", false, "allows destroying an environment while in Running state") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 539f0ecbf..06f412b3f 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -420,26 +420,18 @@ func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. } envId := args[0] - // Check current state first - var envResponse *pb.GetEnvironmentReply - envResponse, err = rpc.GetEnvironment(cxt, &pb.GetEnvironmentRequest{Id: envId}, grpc.EmptyCallOption{}) + keepTasks, err := cmd.Flags().GetBool("keep-tasks") if err != nil { - return - } - - allowedState := "CONFIGURED" - if envResponse.GetEnvironment().GetState() != allowedState { - fmt.Fprint(o, "cannot teardown environment\n") - fmt.Fprintf(o, "teardown is allowed in state %s, but environment %s is in state %s\n", allowedState, envId, envResponse.GetEnvironment().GetState()) - return + keepTasks = false } - keepTasks, err := cmd.Flags().GetBool("keep-tasks") + allowInRunningState, err := cmd.Flags().GetBool("allow-in-running-state") if err != nil { keepTasks = false } - _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks}, grpc.EmptyCallOption{}) + + _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks, AllowInRunningState: allowInRunningState}, grpc.EmptyCallOption{}) if err != nil { return } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6cd144ea3..4289a53b0 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1366,6 +1366,7 @@ func (m *ModifyEnvironmentReply) GetState() string { type DestroyEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1418,6 +1419,13 @@ func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { return false } +func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if m != nil { + return m.AllowInRunningState + } + return false +} + type DestroyEnvironmentReply struct { CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3545,170 +3553,171 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2598 bytes of a gzipped FileDescriptorProto + // 2620 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, - 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0x6d, 0x93, 0xf4, 0xfe, - 0xaa, 0x6e, 0xda, 0xdd, 0x9f, 0x4b, 0xb3, 0x2b, 0xb6, 0x74, 0xb7, 0x5b, 0xf2, 0xc7, 0x75, 0x03, - 0x4d, 0x5c, 0x26, 0x6e, 0x0b, 0x95, 0x50, 0x99, 0xd8, 0xd7, 0xb1, 0x37, 0xe3, 0x19, 0x77, 0x66, - 0xec, 0x36, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x42, 0xbc, 0xf0, 0x8a, 0x10, 0xdf, 0x81, 0x07, 0x24, - 0x5e, 0x11, 0x02, 0xc1, 0x47, 0x40, 0x45, 0xe2, 0x99, 0x8f, 0x80, 0xee, 0xbf, 0x99, 0x3b, 0xe3, - 0x19, 0x27, 0x05, 0xed, 0x0b, 0x6f, 0x3e, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0xff, 0xee, 0x39, 0xe7, - 0x8e, 0x61, 0x65, 0xe8, 0x3a, 0xbe, 0xe3, 0xdd, 0x71, 0xb6, 0xda, 0x8e, 0xed, 0xbb, 0x8e, 0x55, - 0x63, 0x08, 0x54, 0x0c, 0x10, 0x78, 0x05, 0x96, 0xeb, 0x63, 0x62, 0xfb, 0xaf, 0x0e, 0x88, 0xe7, - 0x78, 0x8f, 0x89, 0xe9, 0xfa, 0xc7, 0xc4, 0xf4, 0xf1, 0x02, 0xcc, 0x1f, 0xf9, 0xa6, 0x3f, 0xf2, - 0x0c, 0xf2, 0x7a, 0x44, 0x3c, 0x1f, 0x1f, 0x43, 0x49, 0x22, 0x86, 0xd6, 0x19, 0x5a, 0x86, 0x9c, - 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x0d, 0x6d, 0xb3, 0x68, 0x70, 0x00, 0x3d, 0x80, 0x79, 0x8f, 0x11, - 0x3d, 0x1b, 0x76, 0x4c, 0x9f, 0x78, 0x7a, 0x66, 0x63, 0x76, 0xb3, 0xb4, 0x75, 0xa5, 0x16, 0x9e, - 0xe0, 0x48, 0x59, 0x37, 0xa2, 0xd4, 0xf8, 0x2f, 0x1a, 0xcc, 0xa9, 0xeb, 0xe8, 0x13, 0xc8, 0x59, - 0x64, 0x4c, 0x2c, 0xb6, 0x4b, 0x79, 0xeb, 0x5a, 0x8a, 0x9c, 0xda, 0x13, 0x4a, 0x64, 0x70, 0x5a, - 0xb4, 0x0f, 0xe5, 0x41, 0x44, 0x19, 0x3d, 0xb3, 0xa1, 0x6d, 0x96, 0xb6, 0xd6, 0x15, 0xee, 0x24, - 0x9d, 0x1f, 0xcf, 0x18, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x5e, 0x7d, - 0xe7, 0x59, 0xa3, 0x32, 0x83, 0x0a, 0x90, 0xdd, 0x3f, 0x7c, 0xd4, 0xac, 0x68, 0xa8, 0x04, 0xf9, - 0x17, 0xdb, 0xc6, 0xe1, 0xfe, 0x61, 0xa3, 0x92, 0xa1, 0x14, 0x75, 0xc3, 0x68, 0x1a, 0x95, 0xd9, - 0x9d, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0a, 0x57, 0x1a, 0xc4, 0x7f, 0xe4, 0x9a, 0x03, 0xf2, 0xc6, - 0x71, 0x4f, 0xf7, 0xed, 0xae, 0x23, 0xcd, 0xf9, 0x1b, 0x0d, 0xf2, 0xcf, 0x89, 0xeb, 0xf5, 0x1d, - 0x9b, 0xda, 0x72, 0x60, 0x7e, 0xe5, 0xb8, 0x4c, 0xcb, 0x9c, 0xc1, 0x01, 0x86, 0xed, 0xdb, 0x8e, - 0xcb, 0x4e, 0x4f, 0xb1, 0x14, 0xa0, 0xd8, 0xa1, 0xe9, 0xb7, 0x7b, 0xfa, 0x2c, 0xc7, 0x32, 0x80, - 0x62, 0x8f, 0x47, 0x7d, 0xab, 0xa3, 0x67, 0xb9, 0x37, 0x18, 0x80, 0x36, 0xa0, 0x34, 0x74, 0x9d, - 0xce, 0xa8, 0xed, 0x1f, 0x9a, 0x03, 0xa2, 0xe7, 0xd8, 0x9a, 0x8a, 0x42, 0x6b, 0x00, 0x63, 0x7e, - 0x88, 0x23, 0xdf, 0xd5, 0x2f, 0x31, 0x02, 0x05, 0x83, 0x7f, 0x9e, 0x81, 0xcb, 0x93, 0x1a, 0x50, - 0xff, 0x6f, 0x40, 0xa9, 0x1b, 0x60, 0x3b, 0x22, 0x0a, 0x54, 0x14, 0xfa, 0x18, 0x16, 0x89, 0x3d, - 0xee, 0xbb, 0x8e, 0x3d, 0x20, 0xb6, 0xef, 0xed, 0x3a, 0x23, 0xdb, 0x17, 0xba, 0x4c, 0x2e, 0xd0, - 0x93, 0xf8, 0xa6, 0x77, 0x2a, 0xc8, 0xb8, 0x72, 0x0a, 0x26, 0x8c, 0xb7, 0xac, 0x1a, 0x6f, 0x6b, - 0x00, 0x3d, 0xc7, 0x93, 0xc2, 0x73, 0x9c, 0x2b, 0xc4, 0x20, 0x0c, 0x73, 0x7d, 0xdb, 0xf3, 0x4d, - 0xbb, 0x4d, 0x98, 0x09, 0xb8, 0x86, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0x42, 0x63, 0x3d, 0xcf, 0xe2, - 0x04, 0x29, 0x71, 0x22, 0x5c, 0x64, 0x48, 0x12, 0x7c, 0x0b, 0x16, 0x5a, 0xc4, 0x74, 0x3b, 0xce, - 0x1b, 0x5b, 0xb8, 0x12, 0xad, 0xc0, 0x25, 0x97, 0x98, 0x9e, 0x63, 0x0b, 0x2b, 0x08, 0x88, 0xa6, - 0x50, 0x48, 0x3a, 0xb4, 0xce, 0xb0, 0x0e, 0x2b, 0x0d, 0xe2, 0xd7, 0x15, 0xdd, 0x65, 0x34, 0xbc, - 0x85, 0xe5, 0x89, 0x95, 0x8b, 0x59, 0xf9, 0x4b, 0x98, 0x53, 0x8d, 0x29, 0x12, 0xae, 0xaa, 0x86, - 0x7a, 0xb8, 0xcc, 0xdc, 0x17, 0xa1, 0xc7, 0x7f, 0xca, 0xc2, 0x42, 0x8c, 0x02, 0x95, 0x21, 0xd3, - 0x97, 0x9b, 0x65, 0xfa, 0x2c, 0x8e, 0xda, 0x2e, 0x31, 0x7d, 0xd2, 0x79, 0xd1, 0x23, 0x36, 0xf3, - 0x61, 0xd1, 0x50, 0x51, 0xa1, 0x77, 0x66, 0x55, 0xef, 0xd4, 0x20, 0xc7, 0x3c, 0xa8, 0x67, 0xd9, - 0xa1, 0x74, 0x35, 0x7b, 0x7b, 0x8e, 0xeb, 0xb7, 0x4c, 0x8f, 0x47, 0x14, 0x27, 0x43, 0x55, 0x28, - 0xb8, 0x8e, 0xe3, 0x1b, 0x8e, 0x25, 0x83, 0x35, 0x80, 0xd1, 0x6d, 0xa8, 0xb4, 0x47, 0xae, 0x4b, - 0x6c, 0xdf, 0x18, 0xd9, 0x87, 0xa3, 0xc1, 0x31, 0xe1, 0xf1, 0x3a, 0x6f, 0x4c, 0xe0, 0xd1, 0x1e, - 0x14, 0x3a, 0xa4, 0x6b, 0x8e, 0x2c, 0xdf, 0xd3, 0xf3, 0x6c, 0xeb, 0xcd, 0x74, 0x7b, 0xd4, 0xf6, - 0x04, 0x69, 0xdd, 0xf6, 0xdd, 0x33, 0x23, 0xe0, 0x44, 0xf7, 0x20, 0x3b, 0x36, 0x5d, 0x4f, 0x2f, - 0x30, 0x09, 0x37, 0xa6, 0x48, 0x78, 0x6e, 0xba, 0x82, 0x9b, 0x71, 0xd0, 0xfd, 0x47, 0x1e, 0x71, - 0x29, 0x5a, 0x2f, 0x9e, 0xbb, 0xff, 0x33, 0x41, 0x2a, 0xf6, 0x97, 0x9c, 0xd5, 0xcf, 0x61, 0x3e, - 0x72, 0x34, 0x54, 0x81, 0xd9, 0x53, 0x72, 0x26, 0xfc, 0x42, 0x7f, 0x52, 0xb3, 0x8f, 0x4d, 0x6b, - 0x44, 0x84, 0x4b, 0x38, 0x70, 0x3f, 0x73, 0x4f, 0xab, 0x7e, 0x06, 0xc5, 0x40, 0xe6, 0x7b, 0x31, - 0x7e, 0x0e, 0xf3, 0x91, 0x03, 0xbd, 0x0f, 0x33, 0xfe, 0xbd, 0x06, 0x97, 0x0f, 0xc9, 0x1b, 0x45, - 0x43, 0x99, 0x23, 0xb7, 0xa1, 0x42, 0x03, 0xb6, 0x6b, 0x39, 0x6f, 0x5a, 0x64, 0x30, 0xb4, 0xc2, - 0xca, 0x31, 0x81, 0x47, 0x5f, 0x0a, 0xc3, 0xf3, 0x50, 0xbe, 0xad, 0x98, 0x2e, 0x51, 0x76, 0xdc, - 0xfc, 0xff, 0xb1, 0xee, 0xf8, 0x08, 0x96, 0xe2, 0x3b, 0xd0, 0x24, 0xfc, 0x02, 0x4a, 0x4a, 0xca, - 0x30, 0x51, 0xd3, 0x33, 0x4c, 0x25, 0xc7, 0x1f, 0xb2, 0x1b, 0x34, 0xc1, 0x24, 0xb1, 0x2c, 0xc3, - 0x3f, 0xd1, 0x60, 0x29, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x40, 0x41, 0x1a, 0x58, 0x94, 0xc1, - 0x25, 0x85, 0x95, 0xa6, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xdd, 0xe5, 0xcb, 0xe7, - 0x1f, 0x1a, 0x3d, 0x84, 0xac, 0x7f, 0x36, 0xe4, 0xb6, 0x2c, 0x6f, 0x7d, 0xa4, 0x88, 0x4e, 0x95, - 0x51, 0x6b, 0x0e, 0x29, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xeb, 0xea, 0x61, 0xb3, - 0xf9, 0xb4, 0x32, 0x83, 0x10, 0x94, 0x8f, 0x5a, 0xdb, 0x46, 0xeb, 0xd5, 0xf6, 0x6e, 0x6b, 0xff, - 0xf9, 0x7e, 0xeb, 0x07, 0x15, 0x0d, 0x2d, 0xc2, 0xfc, 0x51, 0xab, 0xf9, 0x34, 0x44, 0x65, 0xd0, - 0x3c, 0x14, 0x77, 0x9b, 0x87, 0x8f, 0xf6, 0x1b, 0xcf, 0x8c, 0x7a, 0x65, 0x96, 0x16, 0x60, 0xa3, - 0x7e, 0x54, 0x6f, 0x55, 0xb2, 0x68, 0x0e, 0x0a, 0x8d, 0xe6, 0x2b, 0x5e, 0x8e, 0x73, 0xf8, 0x14, - 0xae, 0x24, 0x1d, 0x86, 0xda, 0x36, 0xae, 0x4e, 0x70, 0x8f, 0x65, 0xd4, 0x7b, 0x2c, 0xe9, 0xee, - 0x99, 0x4d, 0xbe, 0x7b, 0xf0, 0x2f, 0x35, 0xd0, 0x0f, 0x9c, 0x4e, 0xbf, 0x7b, 0x76, 0x21, 0xeb, - 0x81, 0x33, 0x24, 0xae, 0xe9, 0xf7, 0x1d, 0x5b, 0xc6, 0xfb, 0x7a, 0xb2, 0x67, 0x9b, 0x92, 0xce, - 0x50, 0x58, 0xd0, 0x4d, 0x28, 0xbb, 0xa4, 0xed, 0xd8, 0xdd, 0xfe, 0xc9, 0xc8, 0x25, 0xdb, 0x96, - 0xc5, 0xce, 0x55, 0x30, 0x62, 0x58, 0xfc, 0x6b, 0x0d, 0x96, 0x93, 0x84, 0xa1, 0xfb, 0xc2, 0x7f, - 0xbc, 0xbf, 0xba, 0x79, 0xce, 0xde, 0x11, 0xd7, 0xf1, 0xeb, 0xda, 0xe2, 0x85, 0x35, 0x23, 0xaf, - 0x6b, 0x0e, 0xe3, 0xbb, 0x09, 0x6e, 0x5d, 0x80, 0x92, 0x51, 0x3f, 0x68, 0x3e, 0xaf, 0xbf, 0x32, - 0x9a, 0x4f, 0xa8, 0xc7, 0xe6, 0xa0, 0xb0, 0xbd, 0xb7, 0xc7, 0xa1, 0x2c, 0xfe, 0xa9, 0x06, 0x2b, - 0x09, 0x96, 0xa3, 0x6e, 0xfa, 0x2e, 0x54, 0xba, 0x66, 0xdf, 0x22, 0x9d, 0x66, 0x68, 0x2d, 0xed, - 0x62, 0xd6, 0x9a, 0x60, 0x14, 0x4e, 0xc8, 0x4c, 0xfa, 0x5c, 0xad, 0x5d, 0x78, 0x1f, 0x56, 0xf7, - 0x88, 0xe7, 0xbb, 0xce, 0x45, 0xfc, 0x78, 0x15, 0x8a, 0xa7, 0x84, 0x0c, 0x5b, 0xac, 0xd8, 0x65, - 0x98, 0x07, 0x42, 0x04, 0x26, 0x70, 0x25, 0x49, 0x14, 0x55, 0xec, 0x3b, 0xb0, 0xd8, 0xb6, 0x88, - 0x69, 0x8f, 0x38, 0x29, 0x43, 0x8a, 0x0c, 0xbf, 0xaa, 0xe6, 0x52, 0x9c, 0xc6, 0x98, 0x64, 0xc3, - 0x7f, 0xd6, 0x60, 0xfd, 0x28, 0x72, 0x7f, 0x3c, 0x75, 0x69, 0xa8, 0xf8, 0x7d, 0xe2, 0xa5, 0x1d, - 0xfc, 0x25, 0xc0, 0x30, 0x20, 0x12, 0x01, 0x78, 0x5f, 0x2d, 0xd3, 0xd3, 0xe5, 0xd5, 0x42, 0x0c, - 0xbf, 0x80, 0x15, 0x69, 0xd5, 0x07, 0xb0, 0x10, 0x5b, 0x7e, 0xaf, 0xcb, 0x78, 0x1d, 0xae, 0xa5, - 0xef, 0x4e, 0xf5, 0xf5, 0x60, 0xbd, 0xf1, 0x9e, 0xea, 0xea, 0x90, 0x7f, 0x3d, 0x22, 0xae, 0xd4, - 0xb5, 0x68, 0x48, 0x90, 0x26, 0x12, 0x79, 0xdb, 0xb6, 0x46, 0x1d, 0xd2, 0xb0, 0x9c, 0x63, 0xd3, - 0xf2, 0x64, 0x22, 0x45, 0xb1, 0xf8, 0x77, 0x1a, 0x5c, 0x6b, 0x4c, 0x3b, 0x16, 0xfa, 0x7e, 0xc4, - 0xa4, 0x3c, 0x4a, 0xef, 0x29, 0x26, 0x9d, 0xca, 0xfd, 0x75, 0x1a, 0xf4, 0x9f, 0x1a, 0xcc, 0x47, - 0xda, 0x2e, 0x84, 0x20, 0x6b, 0xd3, 0xe4, 0xe5, 0xec, 0xec, 0x37, 0x6d, 0x66, 0x2d, 0xa7, 0x7d, - 0x4a, 0x3a, 0x22, 0x8e, 0x05, 0x44, 0xf1, 0xb4, 0x49, 0xdb, 0xef, 0x88, 0x34, 0x11, 0x10, 0xc5, - 0xf3, 0x19, 0x4e, 0x34, 0xe6, 0x02, 0x0a, 0xb3, 0x2a, 0xa7, 0xde, 0xa4, 0x57, 0xa1, 0xd8, 0xb6, - 0x4c, 0xcf, 0x53, 0x9a, 0xf1, 0x10, 0x81, 0xea, 0x50, 0xee, 0x90, 0xa1, 0xe5, 0x9c, 0xc9, 0x52, - 0x26, 0x1a, 0x72, 0x75, 0xec, 0xa3, 0x87, 0xdf, 0x8b, 0x10, 0x19, 0x31, 0x26, 0x5a, 0x48, 0xd1, - 0x24, 0x19, 0xbd, 0xae, 0xe8, 0x64, 0xa0, 0x68, 0x1c, 0xc0, 0x34, 0x30, 0xcc, 0x13, 0x4a, 0x28, - 0x2f, 0x06, 0x09, 0xd2, 0x15, 0xa7, 0xdb, 0x25, 0x6e, 0xa0, 0xb8, 0x04, 0xe9, 0xec, 0x41, 0xde, - 0x92, 0xf6, 0xc8, 0x77, 0xe8, 0x22, 0xd7, 0x5e, 0xc1, 0xe0, 0x45, 0x58, 0x68, 0x10, 0x5f, 0x24, - 0x28, 0x6f, 0xf3, 0x1f, 0xc2, 0x7c, 0x88, 0xa2, 0xc1, 0x12, 0x74, 0xc8, 0xda, 0x85, 0x3a, 0x64, - 0xbc, 0x09, 0x65, 0x21, 0x40, 0x19, 0x3e, 0x84, 0x5f, 0x34, 0xd5, 0x2f, 0xf8, 0x33, 0x98, 0x0b, - 0x28, 0xe9, 0x4e, 0x1f, 0x42, 0x96, 0xae, 0x88, 0xcb, 0x65, 0x29, 0x66, 0x51, 0xb6, 0x07, 0x23, - 0xc0, 0x75, 0x98, 0xa7, 0x98, 0x5d, 0xea, 0x95, 0xd4, 0x28, 0xa1, 0x13, 0x01, 0x67, 0x3f, 0x70, - 0x3a, 0x24, 0x98, 0x08, 0x42, 0x14, 0xfe, 0x31, 0x94, 0x76, 0x9d, 0xc1, 0xc0, 0xb4, 0x3b, 0x4c, - 0x48, 0x05, 0x66, 0x89, 0x3d, 0x66, 0x6a, 0x16, 0x0d, 0xfa, 0x93, 0x05, 0x48, 0x8f, 0x58, 0x96, - 0x88, 0x33, 0x0e, 0x84, 0xe1, 0x3b, 0xab, 0x84, 0x2f, 0x0d, 0x1b, 0xd3, 0x3d, 0x19, 0xf1, 0x09, - 0x27, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, 0x34, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x01, 0x94, - 0x76, 0x7b, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, 0xa4, 0xb4, 0x2e, 0x45, 0x51, 0xd2, 0x98, 0x35, - 0xdd, 0x13, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, 0xaf, 0x59, 0x28, 0x04, 0x69, 0xf3, 0x4d, 0x28, - 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, 0x1d, 0x17, 0x92, 0x52, 0xbe, 0xb6, 0xb4, 0xaa, - 0xe8, 0xc5, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, 0x21, 0x29, 0xfa, 0x36, 0x2c, 0xf4, 0xed, 0x63, - 0x67, 0x64, 0x77, 0x84, 0x4a, 0xf4, 0x72, 0xa2, 0xe1, 0xb2, 0xa2, 0x96, 0x88, 0x50, 0x5b, 0x23, - 0x4e, 0x8e, 0x76, 0xa0, 0xe2, 0x8c, 0xfc, 0xa8, 0x88, 0xec, 0x54, 0x11, 0x13, 0xf4, 0xe8, 0x1e, - 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, - 0x3d, 0x35, 0xfd, 0x9e, 0xc8, 0xf9, 0x00, 0xa6, 0xfe, 0x26, 0xf6, 0x78, 0xbf, 0xc3, 0x32, 0xbd, - 0x68, 0x70, 0x00, 0xed, 0x46, 0xee, 0x50, 0x3e, 0x42, 0xfd, 0x5f, 0x42, 0xc8, 0x7e, 0x9d, 0xd7, - 0xe5, 0x1d, 0x58, 0x8a, 0x96, 0x5d, 0x9e, 0x6f, 0x3a, 0xe4, 0x79, 0x86, 0x79, 0x22, 0x98, 0x25, - 0x88, 0x7f, 0xa6, 0xc1, 0xe2, 0x44, 0xa1, 0x46, 0xf7, 0xa1, 0x74, 0xda, 0xb7, 0x2c, 0xd2, 0x69, - 0x5d, 0x28, 0xcf, 0x55, 0x62, 0xf4, 0x05, 0xcc, 0xb9, 0x23, 0xdb, 0xee, 0xdb, 0x27, 0xb2, 0xb3, - 0x98, 0xce, 0x1c, 0xa1, 0xc6, 0xbb, 0xec, 0xfe, 0xa1, 0x1d, 0x7e, 0x70, 0xf8, 0xc0, 0xda, 0x9a, - 0x6a, 0xed, 0x2a, 0x14, 0x86, 0xa6, 0xdf, 0x3b, 0x1a, 0x92, 0xb6, 0xec, 0xe3, 0x24, 0x8c, 0x7f, - 0x91, 0x85, 0x82, 0x1c, 0x12, 0xd2, 0xea, 0x85, 0xb8, 0xff, 0x33, 0xc9, 0xf7, 0x7f, 0xe4, 0x45, - 0xa0, 0x0a, 0x85, 0xee, 0xc8, 0xb2, 0x58, 0x28, 0xf0, 0x1b, 0x33, 0x80, 0x55, 0xcb, 0xe6, 0x22, - 0x96, 0x45, 0xb7, 0x20, 0x47, 0x1b, 0x4b, 0x4f, 0xbf, 0xc4, 0x0c, 0x90, 0x38, 0xc0, 0x70, 0x0a, - 0xf4, 0x60, 0x62, 0xf4, 0xbf, 0x9e, 0x40, 0x9d, 0x3a, 0xf3, 0xdf, 0x8d, 0xcc, 0xfc, 0xd7, 0x92, - 0x58, 0xe3, 0xc3, 0xfe, 0x83, 0x89, 0x61, 0x3f, 0x71, 0xc7, 0xff, 0xa1, 0x29, 0xff, 0x3e, 0xab, - 0x62, 0x22, 0xb0, 0x68, 0x8c, 0x07, 0xfe, 0xd1, 0xce, 0xf3, 0x0f, 0xfe, 0xad, 0x06, 0x1f, 0x34, - 0x88, 0xff, 0x22, 0x36, 0xf3, 0x07, 0x11, 0xba, 0x01, 0x25, 0x97, 0x0c, 0x9d, 0xa7, 0xa6, 0xef, - 0x13, 0x57, 0x3e, 0xa8, 0xa9, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0x19, 0xf7, 0xbd, 0xbe, 0x63, 0x4b, - 0x2a, 0x7e, 0xc2, 0x38, 0x9a, 0xca, 0x32, 0x2d, 0x6b, 0xc7, 0x35, 0xed, 0x76, 0x8f, 0xc8, 0x86, - 0x4e, 0x45, 0xb1, 0xb2, 0x6f, 0x59, 0x2d, 0xf3, 0x84, 0x77, 0x2f, 0x05, 0x43, 0x82, 0xf8, 0x18, - 0x96, 0xe3, 0x67, 0x94, 0x29, 0x40, 0x0f, 0x23, 0x53, 0x80, 0xfe, 0x66, 0xf7, 0x9b, 0x7c, 0xd3, - 0x10, 0xf9, 0x23, 0x61, 0x36, 0x23, 0x89, 0x63, 0x89, 0x4c, 0x08, 0x60, 0xfc, 0x15, 0xac, 0x26, - 0x9b, 0x82, 0xda, 0xf4, 0x00, 0x16, 0xe3, 0x0f, 0x23, 0x49, 0x33, 0x4f, 0xd2, 0x21, 0x8d, 0x49, - 0x4e, 0x8c, 0xa0, 0xf2, 0xa4, 0xef, 0xd1, 0xa9, 0xc3, 0x51, 0x5e, 0xf4, 0x0b, 0x14, 0x4e, 0x4d, - 0x6d, 0x1d, 0xf2, 0x22, 0x31, 0x44, 0x8d, 0x96, 0x20, 0xf5, 0x81, 0xf8, 0x69, 0x44, 0x95, 0x8b, - 0xa3, 0xf1, 0x6b, 0x28, 0x2b, 0xfb, 0xca, 0x60, 0xa1, 0x50, 0x52, 0xb0, 0x88, 0xd3, 0x18, 0x9c, - 0x02, 0x7d, 0x0a, 0x97, 0x4f, 0x58, 0xdf, 0xbd, 0x17, 0xdb, 0x8c, 0x5b, 0x39, 0x79, 0x11, 0x1f, - 0x42, 0x79, 0xbb, 0xd3, 0xa1, 0xb2, 0x64, 0x50, 0x25, 0x29, 0x97, 0xa0, 0x42, 0x26, 0x59, 0x05, - 0x03, 0xe6, 0x02, 0x79, 0xbc, 0x67, 0x43, 0x36, 0x79, 0x13, 0x3f, 0x12, 0x97, 0x9d, 0xb0, 0x42, - 0x77, 0xef, 0xcb, 0x8a, 0x5f, 0x34, 0xd8, 0x6f, 0x7c, 0x0b, 0x16, 0x0d, 0x32, 0x70, 0xc6, 0x44, - 0x3d, 0xe6, 0x32, 0xe4, 0xfa, 0x76, 0x87, 0xbc, 0x95, 0x9f, 0x01, 0x18, 0x80, 0xbf, 0x05, 0x0b, - 0x2a, 0x29, 0x3d, 0xc1, 0x4d, 0x28, 0xab, 0xfb, 0x04, 0xe1, 0x18, 0xc3, 0xe2, 0x8f, 0x60, 0xc9, - 0x20, 0x5d, 0x97, 0x78, 0x3d, 0xd5, 0xef, 0x29, 0xfb, 0xfc, 0x3f, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, - 0x3e, 0x9d, 0xfc, 0x01, 0x1b, 0x36, 0x1b, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, - 0xff, 0x1e, 0x9b, 0xee, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, - 0xc2, 0x07, 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, - 0xff, 0x6c, 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0x6f, 0x44, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, - 0xf2, 0x0f, 0x4c, 0x48, 0x9f, 0xf8, 0xe6, 0x24, 0x8e, 0x58, 0x5d, 0x49, 0x58, 0xa1, 0x83, 0xe9, - 0xcc, 0x37, 0x34, 0xf4, 0x12, 0x2a, 0xf1, 0xef, 0x26, 0x08, 0x47, 0xa7, 0xc0, 0xa4, 0xcf, 0x42, - 0xd5, 0x8d, 0xa9, 0x34, 0x4c, 0x3a, 0xda, 0x81, 0x82, 0xfc, 0xae, 0x80, 0xd4, 0x77, 0xc0, 0xd8, - 0x77, 0x89, 0xaa, 0x9e, 0xb8, 0xc6, 0x65, 0xbc, 0x60, 0xcd, 0x81, 0xfa, 0xc1, 0x01, 0x5d, 0x4f, - 0x1d, 0x52, 0x03, 0x8d, 0xd7, 0xa7, 0x91, 0x70, 0xc1, 0x2d, 0x28, 0x47, 0xdf, 0x50, 0xd1, 0xc6, - 0x79, 0x0f, 0xb8, 0xd5, 0xb5, 0x29, 0x14, 0x81, 0xd4, 0xe8, 0x7e, 0x68, 0x23, 0xf5, 0x28, 0x49, - 0x52, 0x13, 0xde, 0x55, 0xf1, 0x0c, 0xfa, 0x11, 0xa0, 0xc9, 0x87, 0x41, 0x74, 0xe3, 0x22, 0x8f, - 0x98, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x87, 0xb0, 0x38, 0xf1, 0xa4, 0x85, 0xd4, 0x4e, 0x36, - 0xed, 0xa9, 0xb0, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xcb, 0x52, 0x44, 0x81, 0xd4, 0x37, - 0xac, 0x88, 0x02, 0x29, 0xcf, 0x53, 0x3c, 0xd6, 0xe4, 0xc4, 0x1a, 0x89, 0xb5, 0xd8, 0x64, 0x1b, - 0x89, 0xb5, 0xc8, 0x88, 0x8b, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, - 0xae, 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x69, 0x8c, 0x8b, - 0x9a, 0xfa, 0x74, 0x16, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, - 0x78, 0xf0, 0x0c, 0xea, 0xb2, 0x2f, 0x76, 0x13, 0xc5, 0x1b, 0xdd, 0x8c, 0xf2, 0xa4, 0x35, 0x3a, - 0xd5, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xea, 0x50, 0x0c, 0x0a, 0x28, 0xfa, 0x40, 0x61, 0x8a, 0x97, - 0xf3, 0xea, 0x6a, 0xf2, 0x62, 0xe0, 0x03, 0x51, 0xc4, 0x22, 0x3e, 0x88, 0x16, 0xca, 0x88, 0x0f, - 0xd4, 0x9a, 0x87, 0x67, 0xd0, 0x63, 0x80, 0xb0, 0x0c, 0xa1, 0xab, 0x91, 0xaa, 0x1d, 0x2b, 0x64, - 0xd5, 0x6a, 0xca, 0xaa, 0xb4, 0xfe, 0x9c, 0x5a, 0x95, 0x22, 0xde, 0x4c, 0x28, 0x57, 0xd5, 0x8a, - 0xfa, 0xc4, 0x4b, 0x6f, 0x6b, 0x3c, 0x83, 0x1e, 0x41, 0x39, 0x5a, 0xac, 0x22, 0xf7, 0x41, 0x62, - 0x1d, 0x4b, 0x94, 0xf3, 0x12, 0xf4, 0xb4, 0x2a, 0x86, 0x6e, 0x47, 0x25, 0x4e, 0x2b, 0x75, 0x89, - 0xb2, 0x2d, 0x58, 0x49, 0xae, 0x47, 0x68, 0x33, 0x2a, 0x39, 0xbd, 0x0a, 0x56, 0x6f, 0x5e, 0x80, - 0x92, 0x59, 0x75, 0xe7, 0xde, 0x1f, 0xdf, 0xad, 0x69, 0x7f, 0x7b, 0xb7, 0xa6, 0xfd, 0xfd, 0xdd, - 0x9a, 0xf6, 0xab, 0x7f, 0xac, 0xcd, 0x00, 0x6e, 0xf7, 0x6a, 0x6d, 0xe2, 0xda, 0x35, 0xd3, 0xea, - 0xb7, 0x49, 0xcd, 0xd9, 0xaa, 0x49, 0x49, 0xee, 0xb0, 0xed, 0x11, 0x77, 0x4c, 0xdc, 0x97, 0x99, - 0xe1, 0xf1, 0xf1, 0x25, 0xf6, 0x9f, 0x90, 0x4f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x21, - 0x23, 0x05, 0x2d, 0x22, 0x00, 0x00, + 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, + 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, + 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, + 0xd8, 0x69, 0x84, 0x78, 0xe3, 0x0d, 0x21, 0x84, 0x78, 0xe1, 0x15, 0x21, 0xbe, 0x03, 0x0f, 0x48, + 0xbc, 0x22, 0x04, 0x82, 0x8f, 0x80, 0x8a, 0xc4, 0x33, 0x1f, 0x01, 0xdd, 0x7f, 0x33, 0x77, 0xc6, + 0x33, 0x4e, 0x0a, 0xda, 0x17, 0xde, 0x7c, 0xce, 0x3d, 0xe7, 0xdc, 0x7b, 0xfe, 0xdd, 0x73, 0xee, + 0x19, 0xc3, 0xd2, 0xc0, 0x75, 0x7c, 0xc7, 0xbb, 0xeb, 0x6c, 0xb6, 0x1c, 0xdb, 0x77, 0x1d, 0x6b, + 0x83, 0x21, 0x50, 0x31, 0x40, 0xe0, 0x25, 0x58, 0xac, 0x8d, 0x88, 0xed, 0xbf, 0xde, 0x27, 0x9e, + 0xe3, 0x3d, 0x21, 0xa6, 0xeb, 0x1f, 0x11, 0xd3, 0xc7, 0x73, 0x30, 0x7b, 0xe8, 0x9b, 0xfe, 0xd0, + 0x33, 0xc8, 0x9b, 0x21, 0xf1, 0x7c, 0x7c, 0x04, 0x25, 0x89, 0x18, 0x58, 0x67, 0x68, 0x11, 0x72, + 0x9e, 0x6f, 0xfa, 0x44, 0xd7, 0xd6, 0xb4, 0xf5, 0xa2, 0xc1, 0x01, 0xf4, 0x10, 0x66, 0x3d, 0x46, + 0xf4, 0x7c, 0xd0, 0x36, 0x7d, 0xe2, 0xe9, 0x99, 0xb5, 0xe9, 0xf5, 0xd2, 0xe6, 0x95, 0x8d, 0xf0, + 0x04, 0x87, 0xca, 0xba, 0x11, 0xa5, 0xc6, 0x7f, 0xd1, 0x60, 0x46, 0x5d, 0x47, 0x9f, 0x40, 0xce, + 0x22, 0x23, 0x62, 0xb1, 0x5d, 0xca, 0x9b, 0xd7, 0x53, 0xe4, 0x6c, 0x3c, 0xa5, 0x44, 0x06, 0xa7, + 0x45, 0x7b, 0x50, 0xee, 0x47, 0x94, 0xd1, 0x33, 0x6b, 0xda, 0x7a, 0x69, 0x73, 0x55, 0xe1, 0x4e, + 0xd2, 0xf9, 0xc9, 0x94, 0x11, 0x63, 0xc4, 0x9f, 0x42, 0x8e, 0x89, 0x46, 0x45, 0xc8, 0xed, 0xd6, + 0xb6, 0x9f, 0xd7, 0x2b, 0x53, 0xa8, 0x00, 0xd9, 0xbd, 0x83, 0xc7, 0x8d, 0x8a, 0x86, 0x4a, 0x90, + 0x7f, 0xb9, 0x65, 0x1c, 0xec, 0x1d, 0xd4, 0x2b, 0x19, 0x4a, 0x51, 0x33, 0x8c, 0x86, 0x51, 0x99, + 0xde, 0xce, 0x43, 0x8e, 0xc9, 0xc7, 0xcb, 0x70, 0xa5, 0x4e, 0xfc, 0xc7, 0xae, 0xd9, 0x27, 0xa7, + 0x8e, 0x7b, 0xb2, 0x67, 0x77, 0x1c, 0x69, 0xce, 0xdf, 0x68, 0x90, 0x7f, 0x41, 0x5c, 0xaf, 0xe7, + 0xd8, 0xd4, 0x96, 0x7d, 0xf3, 0x2b, 0xc7, 0x65, 0x5a, 0xe6, 0x0c, 0x0e, 0x30, 0x6c, 0xcf, 0x76, + 0x5c, 0x76, 0x7a, 0x8a, 0xa5, 0x00, 0xc5, 0x0e, 0x4c, 0xbf, 0xd5, 0xd5, 0xa7, 0x39, 0x96, 0x01, + 0x14, 0x7b, 0x34, 0xec, 0x59, 0x6d, 0x3d, 0xcb, 0xbd, 0xc1, 0x00, 0xb4, 0x06, 0xa5, 0x81, 0xeb, + 0xb4, 0x87, 0x2d, 0xff, 0xc0, 0xec, 0x13, 0x3d, 0xc7, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0xf1, + 0x43, 0x1c, 0xfa, 0xae, 0x7e, 0x89, 0x11, 0x28, 0x18, 0xfc, 0xf3, 0x0c, 0x5c, 0x1e, 0xd7, 0x80, + 0xfa, 0x7f, 0x0d, 0x4a, 0x9d, 0x00, 0xdb, 0x16, 0x51, 0xa0, 0xa2, 0xd0, 0x47, 0x30, 0x4f, 0xec, + 0x51, 0xcf, 0x75, 0xec, 0x3e, 0xb1, 0x7d, 0x6f, 0xc7, 0x19, 0xda, 0xbe, 0xd0, 0x65, 0x7c, 0x81, + 0x9e, 0xc4, 0x37, 0xbd, 0x13, 0x41, 0xc6, 0x95, 0x53, 0x30, 0x61, 0xbc, 0x65, 0xd5, 0x78, 0x5b, + 0x01, 0xe8, 0x3a, 0x9e, 0x14, 0x9e, 0xe3, 0x5c, 0x21, 0x06, 0x61, 0x98, 0xe9, 0xd9, 0x9e, 0x6f, + 0xda, 0x2d, 0xc2, 0x4c, 0xc0, 0x35, 0x8c, 0xe0, 0xd0, 0x47, 0x90, 0x17, 0x1a, 0xeb, 0x79, 0x16, + 0x27, 0x48, 0x89, 0x13, 0xe1, 0x22, 0x43, 0x92, 0xe0, 0xdb, 0x30, 0xd7, 0x24, 0xa6, 0xdb, 0x76, + 0x4e, 0x6d, 0xe1, 0x4a, 0xb4, 0x04, 0x97, 0x5c, 0x62, 0x7a, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, + 0x42, 0x21, 0xe9, 0xc0, 0x3a, 0xc3, 0x3a, 0x2c, 0xd5, 0x89, 0x5f, 0x53, 0x74, 0x97, 0xd1, 0xf0, + 0x16, 0x16, 0xc7, 0x56, 0x2e, 0x66, 0xe5, 0x2f, 0x61, 0x46, 0x35, 0xa6, 0x48, 0xb8, 0xaa, 0x1a, + 0xea, 0xe1, 0x32, 0x73, 0x5f, 0x84, 0x1e, 0xff, 0x29, 0x0b, 0x73, 0x31, 0x0a, 0x54, 0x86, 0x4c, + 0x4f, 0x6e, 0x96, 0xe9, 0xb1, 0x38, 0x6a, 0xb9, 0xc4, 0xf4, 0x49, 0xfb, 0x65, 0x97, 0xd8, 0xcc, + 0x87, 0x45, 0x43, 0x45, 0x85, 0xde, 0x99, 0x56, 0xbd, 0xb3, 0x01, 0x39, 0xe6, 0x41, 0x3d, 0xcb, + 0x0e, 0xa5, 0xab, 0xd9, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa2, 0x38, 0x19, 0xaa, 0x42, + 0xc1, 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x19, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, + 0x62, 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0x8f, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, + 0xa1, 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xdb, 0x63, 0x63, + 0x57, 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, + 0x02, 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, + 0x97, 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, + 0x23, 0x47, 0x43, 0x15, 0x98, 0x3e, 0x21, 0x67, 0xc2, 0x2f, 0xf4, 0x27, 0x35, 0xfb, 0xc8, 0xb4, + 0x86, 0x44, 0xb8, 0x84, 0x03, 0x0f, 0x32, 0xf7, 0xb5, 0xea, 0x67, 0x50, 0x0c, 0x64, 0xbe, 0x17, + 0xe3, 0xe7, 0x30, 0x1b, 0x39, 0xd0, 0xfb, 0x30, 0xe3, 0xdf, 0x6b, 0x70, 0xf9, 0x80, 0x9c, 0x2a, + 0x1a, 0xca, 0x1c, 0xb9, 0x03, 0x15, 0x1a, 0xb0, 0x1d, 0xcb, 0x39, 0x6d, 0x92, 0xfe, 0xc0, 0x0a, + 0x2b, 0xc7, 0x18, 0x1e, 0x7d, 0x29, 0x0c, 0xcf, 0x43, 0xf9, 0x8e, 0x62, 0xba, 0x44, 0xd9, 0x71, + 0xf3, 0xff, 0xc7, 0xba, 0xe3, 0x43, 0x58, 0x88, 0xef, 0x40, 0x93, 0xf0, 0x0b, 0x28, 0x29, 0x29, + 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, 0x1c, 0x7f, 0xc0, 0x6e, 0xd0, 0x04, 0x93, 0xc4, 0xb2, 0x0c, + 0xff, 0x44, 0x83, 0x85, 0x38, 0xe5, 0x7f, 0xbd, 0x3d, 0xba, 0x0b, 0x05, 0x69, 0x60, 0x51, 0x06, + 0x17, 0x14, 0x56, 0x9a, 0x5a, 0x8c, 0x27, 0x20, 0xc2, 0x7f, 0xd5, 0x60, 0x79, 0x87, 0x2f, 0x9f, + 0x7f, 0x68, 0xf4, 0x08, 0xb2, 0xfe, 0xd9, 0x80, 0xdb, 0xb2, 0xbc, 0xf9, 0xa1, 0x22, 0x3a, 0x55, + 0xc6, 0x46, 0x63, 0x40, 0x59, 0x0c, 0xc6, 0x88, 0x4d, 0xb8, 0xc4, 0x61, 0x5a, 0x57, 0x0f, 0x1a, + 0x8d, 0x67, 0x95, 0x29, 0x84, 0xa0, 0x7c, 0xd8, 0xdc, 0x32, 0x9a, 0xaf, 0xb7, 0x76, 0x9a, 0x7b, + 0x2f, 0xf6, 0x9a, 0xdf, 0xaf, 0x68, 0x68, 0x1e, 0x66, 0x0f, 0x9b, 0x8d, 0x67, 0x21, 0x2a, 0x83, + 0x66, 0xa1, 0xb8, 0xd3, 0x38, 0x78, 0xbc, 0x57, 0x7f, 0x6e, 0xd4, 0x2a, 0xd3, 0xb4, 0x00, 0x1b, + 0xb5, 0xc3, 0x5a, 0xb3, 0x92, 0x45, 0x33, 0x50, 0xa8, 0x37, 0x5e, 0xf3, 0x72, 0x9c, 0xc3, 0x27, + 0x70, 0x25, 0xe9, 0x30, 0xd4, 0xb6, 0x71, 0x75, 0x82, 0x7b, 0x2c, 0xa3, 0xde, 0x63, 0x49, 0x77, + 0xcf, 0x74, 0xf2, 0xdd, 0x83, 0x7f, 0xa9, 0x81, 0xbe, 0xef, 0xb4, 0x7b, 0x9d, 0xb3, 0x0b, 0x59, + 0x0f, 0x9c, 0x01, 0x71, 0x4d, 0xbf, 0xe7, 0xd8, 0x32, 0xde, 0x57, 0x93, 0x3d, 0xdb, 0x90, 0x74, + 0x86, 0xc2, 0x82, 0x6e, 0x41, 0xd9, 0x25, 0x2d, 0xc7, 0xee, 0xf4, 0x8e, 0x87, 0x2e, 0xd9, 0xb2, + 0x2c, 0x76, 0xae, 0x82, 0x11, 0xc3, 0xe2, 0x5f, 0x6b, 0xb0, 0x98, 0x24, 0x0c, 0x3d, 0x10, 0xfe, + 0xe3, 0xfd, 0xd5, 0xad, 0x73, 0xf6, 0x8e, 0xb8, 0x8e, 0x5f, 0xd7, 0x16, 0x2f, 0xac, 0x19, 0x79, + 0x5d, 0x73, 0x18, 0xdf, 0x4b, 0x70, 0xeb, 0x1c, 0x94, 0x8c, 0xda, 0x7e, 0xe3, 0x45, 0xed, 0xb5, + 0xd1, 0x78, 0x4a, 0x3d, 0x36, 0x03, 0x85, 0xad, 0xdd, 0x5d, 0x0e, 0x65, 0xf1, 0x4f, 0x35, 0x58, + 0x4a, 0xb0, 0x1c, 0x75, 0xd3, 0x77, 0xa0, 0xd2, 0x31, 0x7b, 0x16, 0x69, 0x37, 0x42, 0x6b, 0x69, + 0x17, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x66, 0xdc, 0xe7, 0x6a, 0xed, 0xc2, 0x3f, 0x82, 0xe5, + 0x5d, 0xe2, 0xf9, 0xae, 0x73, 0x11, 0x3f, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0x2b, 0x76, + 0x19, 0xe6, 0x81, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, + 0x76, 0xcf, 0x3e, 0x3e, 0x0c, 0xb6, 0x2b, 0x18, 0x49, 0x4b, 0x98, 0xc0, 0x95, 0xa4, 0xcd, 0xa9, + 0x29, 0xbe, 0x0d, 0xf3, 0x2d, 0x8b, 0x98, 0xf6, 0x90, 0x0b, 0x67, 0x48, 0x71, 0x27, 0x5c, 0x53, + 0xb3, 0x2f, 0x4e, 0x63, 0x8c, 0xb3, 0xe1, 0x3f, 0x6b, 0xb0, 0x7a, 0x18, 0xb9, 0x71, 0x9e, 0xb9, + 0x34, 0xb8, 0xfc, 0x1e, 0xf1, 0xd2, 0x54, 0x7d, 0x05, 0x30, 0x08, 0x88, 0x44, 0xc8, 0x3e, 0x50, + 0x0b, 0xfb, 0x64, 0x79, 0x1b, 0x21, 0x86, 0x5f, 0xd9, 0x8a, 0xb4, 0xea, 0x43, 0x98, 0x8b, 0x2d, + 0xbf, 0xd7, 0xf5, 0xbd, 0x0a, 0xd7, 0xd3, 0x77, 0xa7, 0xfa, 0x7a, 0xb0, 0x5a, 0x7f, 0x4f, 0x75, + 0x75, 0xc8, 0xbf, 0x19, 0x12, 0x57, 0xea, 0x5a, 0x34, 0x24, 0x48, 0x53, 0x8f, 0xbc, 0x6d, 0x59, + 0xc3, 0x36, 0xa9, 0x5b, 0xce, 0x91, 0x69, 0x79, 0x32, 0xf5, 0xa2, 0x58, 0xfc, 0x3b, 0x0d, 0xae, + 0xd7, 0x27, 0x1d, 0x0b, 0x7d, 0x2f, 0x62, 0x52, 0x1e, 0xd7, 0xf7, 0x15, 0x93, 0x4e, 0xe4, 0xfe, + 0x3a, 0x0d, 0xfa, 0x4f, 0x0d, 0x66, 0x23, 0x8d, 0x1a, 0x42, 0x90, 0xb5, 0x69, 0xba, 0x73, 0x76, + 0xf6, 0x9b, 0xb6, 0xbf, 0x96, 0xd3, 0x3a, 0x21, 0x6d, 0x11, 0xf9, 0x02, 0xa2, 0x78, 0xda, 0xd6, + 0xed, 0xb5, 0x45, 0x62, 0x09, 0x88, 0xe2, 0xf9, 0xab, 0x4f, 0xb4, 0xf2, 0x02, 0x0a, 0xf3, 0x30, + 0xa7, 0xde, 0xbd, 0xd7, 0xa0, 0xd8, 0xb2, 0x4c, 0xcf, 0x53, 0xda, 0xf7, 0x10, 0x81, 0x6a, 0x50, + 0x6e, 0x93, 0x81, 0xe5, 0x9c, 0xc9, 0xe2, 0x27, 0x5a, 0x78, 0xf5, 0xa1, 0x48, 0x0f, 0xbf, 0x1b, + 0x21, 0x32, 0x62, 0x4c, 0xb4, 0xf4, 0xa2, 0x71, 0x32, 0x7a, 0xc1, 0xd1, 0xb7, 0x84, 0xa2, 0x71, + 0x00, 0xd3, 0xc0, 0x30, 0x8f, 0x29, 0xa1, 0xbc, 0x4a, 0x24, 0x48, 0x57, 0x9c, 0x4e, 0x87, 0xb8, + 0x81, 0xe2, 0x12, 0xa4, 0xaf, 0x15, 0xf2, 0x96, 0xb4, 0x86, 0xbe, 0x43, 0x17, 0xb9, 0xf6, 0x0a, + 0x06, 0xcf, 0xc3, 0x5c, 0x9d, 0xf8, 0x22, 0x41, 0xf9, 0xc3, 0xe0, 0x11, 0xcc, 0x86, 0x28, 0x1a, + 0x2c, 0x41, 0x4f, 0xad, 0x5d, 0xa8, 0xa7, 0xc6, 0xeb, 0x50, 0x16, 0x02, 0x94, 0xe7, 0x8a, 0xf0, + 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x33, 0x01, 0x25, 0xdd, 0xe9, 0x03, 0xc8, 0xd2, 0x15, 0x71, + 0xb9, 0x2c, 0xc4, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x06, 0xb3, 0x14, 0xb3, 0x43, 0xbd, 0x92, + 0x1a, 0x25, 0xf4, 0x0d, 0xc1, 0xd9, 0xf7, 0x9d, 0x36, 0x09, 0xde, 0x10, 0x21, 0x0a, 0xff, 0x18, + 0x4a, 0x3b, 0x4e, 0xbf, 0x6f, 0xda, 0x6d, 0x26, 0xa4, 0x02, 0xd3, 0xc4, 0x1e, 0x31, 0x35, 0x8b, + 0x06, 0xfd, 0xc9, 0x02, 0xa4, 0x4b, 0x2c, 0x4b, 0xc4, 0x19, 0x07, 0xc2, 0xf0, 0x9d, 0x56, 0xc2, + 0x97, 0x86, 0x8d, 0xe9, 0x1e, 0x0f, 0xf9, 0x9b, 0x28, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, + 0x66, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x3e, 0x94, 0x76, 0xba, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, + 0xa4, 0x34, 0x3b, 0x45, 0x51, 0x04, 0x99, 0x35, 0xdd, 0x63, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, + 0xaf, 0x69, 0x28, 0x04, 0x69, 0xf3, 0x0d, 0x28, 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, + 0x1d, 0x17, 0x92, 0x52, 0xbe, 0x96, 0xb4, 0xaa, 0xe8, 0xde, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, + 0x21, 0x29, 0xfa, 0x16, 0xcc, 0xf5, 0xec, 0x23, 0x67, 0x68, 0xb7, 0x85, 0x4a, 0xf4, 0x72, 0xa2, + 0xe1, 0xb2, 0xa4, 0x96, 0x88, 0x50, 0x5b, 0x23, 0x4e, 0x8e, 0xb6, 0xa1, 0xe2, 0x0c, 0xfd, 0xa8, + 0x88, 0xec, 0x44, 0x11, 0x63, 0xf4, 0xe8, 0x3e, 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, + 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, 0x3d, 0x33, 0xfd, 0xae, 0xc8, 0xf9, 0x00, 0xa6, + 0xfe, 0x26, 0xf6, 0x68, 0xaf, 0xcd, 0x32, 0xbd, 0x68, 0x70, 0x00, 0xed, 0x44, 0xee, 0x50, 0xfe, + 0xe8, 0xfa, 0xbf, 0x84, 0x90, 0xfd, 0x3a, 0xaf, 0xcb, 0xbb, 0xb0, 0x10, 0x2d, 0xbb, 0x3c, 0xdf, + 0x74, 0xc8, 0xf3, 0x0c, 0xf3, 0x44, 0x30, 0x4b, 0x10, 0xff, 0x4c, 0x83, 0xf9, 0xb1, 0x42, 0x8d, + 0x1e, 0x40, 0xe9, 0xa4, 0x67, 0x59, 0xa4, 0xdd, 0xbc, 0x50, 0x9e, 0xab, 0xc4, 0xe8, 0x0b, 0x98, + 0x71, 0x79, 0x23, 0x21, 0x7b, 0x91, 0xc9, 0xcc, 0x11, 0x6a, 0xbc, 0xc3, 0xee, 0x1f, 0xfa, 0x26, + 0x08, 0x0e, 0x1f, 0x58, 0x5b, 0x53, 0xad, 0x5d, 0x85, 0xc2, 0xc0, 0xf4, 0xbb, 0x87, 0x03, 0xd2, + 0x92, 0x9d, 0x9f, 0x84, 0xf1, 0x2f, 0xb2, 0x50, 0x90, 0xcf, 0x8a, 0xb4, 0x7a, 0x21, 0xee, 0xff, + 0x4c, 0xf2, 0xfd, 0x1f, 0x99, 0x21, 0x54, 0xa1, 0xd0, 0x19, 0x5a, 0x16, 0x0b, 0x05, 0x7e, 0x63, + 0x06, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, 0xe8, 0x36, 0xe4, 0x68, 0x2b, 0xea, 0xe9, 0x97, 0x98, + 0x01, 0x12, 0x9f, 0x3c, 0x9c, 0x02, 0x3d, 0x1c, 0x1b, 0x16, 0xdc, 0x48, 0xa0, 0x4e, 0x9d, 0x12, + 0xdc, 0x8b, 0x4c, 0x09, 0xae, 0x27, 0xb1, 0xc6, 0xc7, 0x03, 0x0f, 0xc7, 0xc6, 0x03, 0x89, 0x3b, + 0xfe, 0x0f, 0xcd, 0x05, 0x1e, 0xb0, 0x2a, 0x26, 0x02, 0x8b, 0xc6, 0x78, 0xe0, 0x1f, 0xed, 0x3c, + 0xff, 0xe0, 0xdf, 0x6a, 0x70, 0xb5, 0x4e, 0xfc, 0x97, 0xb1, 0x29, 0x41, 0x10, 0xa1, 0x6b, 0x50, + 0x72, 0xc9, 0xc0, 0x79, 0x66, 0xfa, 0x3e, 0x71, 0xe5, 0x08, 0x4e, 0x45, 0xa1, 0x75, 0x98, 0x73, + 0xc9, 0xa8, 0xe7, 0xf5, 0x1c, 0x5b, 0x52, 0xf1, 0x13, 0xc6, 0xd1, 0x54, 0x96, 0x69, 0x59, 0xdb, + 0xae, 0x69, 0xb7, 0xba, 0x44, 0x36, 0x74, 0x2a, 0x8a, 0x95, 0x7d, 0xcb, 0x6a, 0x9a, 0xc7, 0xbc, + 0x7b, 0x29, 0x18, 0x12, 0xc4, 0x47, 0xb0, 0x18, 0x3f, 0xa3, 0x4c, 0x01, 0x7a, 0x18, 0x99, 0x02, + 0xf4, 0x37, 0xbb, 0xdf, 0xe4, 0x14, 0x44, 0xe4, 0x8f, 0x84, 0xd9, 0xab, 0x4a, 0x1c, 0x4b, 0x64, + 0x42, 0x00, 0xe3, 0xaf, 0x60, 0x39, 0xd9, 0x14, 0xd4, 0xa6, 0xfb, 0x30, 0x1f, 0x1f, 0xa5, 0x24, + 0xbd, 0x92, 0x92, 0x0e, 0x69, 0x8c, 0x73, 0x62, 0x04, 0x95, 0xa7, 0x3d, 0x8f, 0xbe, 0x3a, 0x1c, + 0xe5, 0x1b, 0x40, 0x81, 0xc2, 0xa9, 0xa9, 0xad, 0x43, 0x5e, 0x24, 0x86, 0xa8, 0xd1, 0x12, 0xa4, + 0x3e, 0x10, 0x3f, 0x8d, 0xa8, 0x72, 0x71, 0x34, 0x7e, 0x03, 0x65, 0x65, 0x5f, 0x19, 0x2c, 0x14, + 0x4a, 0x0a, 0x16, 0x71, 0x1a, 0x83, 0x53, 0xa0, 0x4f, 0xe1, 0xf2, 0x31, 0xeb, 0xbb, 0x77, 0x63, + 0x9b, 0x71, 0x2b, 0x27, 0x2f, 0xe2, 0x03, 0x28, 0x6f, 0xb5, 0xdb, 0x54, 0x96, 0x0c, 0xaa, 0x24, + 0xe5, 0x12, 0x54, 0xc8, 0x24, 0xab, 0x60, 0xc0, 0x4c, 0x20, 0x8f, 0xf7, 0x6c, 0xc8, 0x26, 0xa7, + 0xf1, 0x23, 0x71, 0xd9, 0x09, 0x2b, 0x74, 0xf7, 0x9e, 0xac, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, + 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0xd4, 0x63, 0x2e, 0x42, 0xae, 0x67, 0xb7, 0xc9, 0x5b, 0xf9, + 0xe1, 0x80, 0x01, 0xf8, 0x9b, 0x30, 0xa7, 0x92, 0xd2, 0x13, 0xdc, 0x82, 0xb2, 0xba, 0x4f, 0x10, + 0x8e, 0x31, 0x2c, 0xfe, 0x10, 0x16, 0x0c, 0xd2, 0x71, 0x89, 0xd7, 0x55, 0xfd, 0x9e, 0xb2, 0xcf, + 0xff, 0xc3, 0xe5, 0x43, 0xe2, 0x2b, 0xec, 0x93, 0xc9, 0x1f, 0xb2, 0xc7, 0x66, 0x3d, 0xc9, 0x03, + 0x92, 0x51, 0x8d, 0x7d, 0x2d, 0x16, 0xfb, 0xdf, 0x65, 0xaf, 0x3b, 0xba, 0x4d, 0x0a, 0x73, 0xe2, + 0xae, 0x11, 0x91, 0x99, 0x98, 0xc8, 0x7b, 0x70, 0x35, 0x4d, 0x24, 0x35, 0x9a, 0x74, 0x83, 0xa6, + 0xb8, 0x21, 0x0f, 0xb9, 0x5a, 0x7f, 0xe0, 0x9f, 0x6d, 0xfe, 0x61, 0x16, 0xf2, 0x62, 0xaa, 0x84, + 0x76, 0xa0, 0xd4, 0x74, 0xcd, 0xd6, 0x09, 0xff, 0x24, 0x85, 0xf4, 0xb1, 0xaf, 0x54, 0xe2, 0x88, + 0xd5, 0xa5, 0x84, 0x15, 0xfa, 0x30, 0x9d, 0xfa, 0x58, 0x43, 0xaf, 0xa0, 0x12, 0xff, 0xd2, 0x82, + 0x70, 0xf4, 0x15, 0x98, 0xf4, 0x21, 0xa9, 0xba, 0x36, 0x91, 0x86, 0x49, 0x47, 0xdb, 0x50, 0x90, + 0x5f, 0x22, 0x90, 0x3a, 0x39, 0x8c, 0x7d, 0xc9, 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x4b, 0xd6, + 0x1c, 0xa8, 0x9f, 0x28, 0xd0, 0x8d, 0xd4, 0x47, 0x6a, 0xa0, 0xf1, 0xea, 0x24, 0x12, 0x2e, 0xb8, + 0x09, 0xe5, 0xe8, 0xd4, 0x15, 0xad, 0x9d, 0x37, 0xf2, 0xad, 0xae, 0x4c, 0xa0, 0x08, 0xa4, 0x46, + 0xf7, 0x43, 0x6b, 0xa9, 0x47, 0x49, 0x92, 0x9a, 0x30, 0x89, 0xc5, 0x53, 0xe8, 0x87, 0x80, 0xc6, + 0x47, 0x89, 0xe8, 0xe6, 0x45, 0xc6, 0x9e, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x07, 0x30, 0x3f, + 0x36, 0x04, 0x43, 0x6a, 0x27, 0x9b, 0x36, 0x5c, 0xac, 0xde, 0x98, 0x4c, 0x14, 0x28, 0x30, 0x3e, + 0x59, 0x8a, 0x28, 0x90, 0x3a, 0xf5, 0x8a, 0x28, 0x90, 0x32, 0x9e, 0xe2, 0xb1, 0x26, 0x5f, 0xac, + 0x91, 0x58, 0x8b, 0xbd, 0x6c, 0x23, 0xb1, 0x16, 0x79, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, + 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x8d, 0x35, + 0x5a, 0x49, 0x1d, 0x8d, 0x71, 0x51, 0x13, 0x47, 0x67, 0x81, 0x52, 0xac, 0x81, 0x89, 0x2b, 0xa5, + 0xb6, 0xcb, 0x71, 0xa5, 0xc2, 0x8e, 0x07, 0x4f, 0xa1, 0x0e, 0xfb, 0xc6, 0x37, 0x56, 0xbc, 0xd1, + 0xad, 0x28, 0x4f, 0x5a, 0xa3, 0x53, 0xbd, 0x79, 0x2e, 0x1d, 0xdf, 0xa7, 0x06, 0xc5, 0xa0, 0x80, + 0xa2, 0xab, 0x0a, 0x53, 0xbc, 0x9c, 0x57, 0x97, 0x93, 0x17, 0x03, 0x1f, 0x88, 0x22, 0x16, 0xf1, + 0x41, 0xb4, 0x50, 0x46, 0x7c, 0xa0, 0xd6, 0x3c, 0x3c, 0x85, 0x9e, 0x00, 0x84, 0x65, 0x08, 0x5d, + 0x8b, 0x54, 0xed, 0x58, 0x21, 0xab, 0x56, 0x53, 0x56, 0xa5, 0xf5, 0x67, 0xd4, 0xaa, 0x14, 0xf1, + 0x66, 0x42, 0xb9, 0xaa, 0x56, 0xd4, 0xa1, 0x30, 0xbd, 0xad, 0xf1, 0x14, 0x7a, 0x0c, 0xe5, 0x68, + 0xb1, 0x8a, 0xdc, 0x07, 0x89, 0x75, 0x2c, 0x51, 0xce, 0x2b, 0xd0, 0xd3, 0xaa, 0x18, 0xba, 0x13, + 0x95, 0x38, 0xa9, 0xd4, 0x25, 0xca, 0xb6, 0x60, 0x29, 0xb9, 0x1e, 0xa1, 0xf5, 0xa8, 0xe4, 0xf4, + 0x2a, 0x58, 0xbd, 0x75, 0x01, 0x4a, 0x66, 0xd5, 0xed, 0xfb, 0x7f, 0x7c, 0xb7, 0xa2, 0xfd, 0xed, + 0xdd, 0x8a, 0xf6, 0xf7, 0x77, 0x2b, 0xda, 0xaf, 0xfe, 0xb1, 0x32, 0x05, 0xb8, 0xd5, 0xdd, 0x68, + 0x11, 0xd7, 0xde, 0x30, 0xad, 0x5e, 0x8b, 0x6c, 0x38, 0x9b, 0x1b, 0x52, 0x92, 0x3b, 0x68, 0x79, + 0xc4, 0x1d, 0x11, 0xf7, 0x55, 0x66, 0x70, 0x74, 0x74, 0x89, 0xfd, 0x8b, 0xe4, 0x93, 0x7f, 0x07, + 0x00, 0x00, 0xff, 0xff, 0x9e, 0xa5, 0x0f, 0x75, 0x5f, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5573,6 +5582,16 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AllowInRunningState { + i-- + if m.AllowInRunningState { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } if m.KeepTasks { i-- if m.KeepTasks { @@ -7796,6 +7815,9 @@ func (m *DestroyEnvironmentRequest) Size() (n int) { if m.KeepTasks { n += 2 } + if m.AllowInRunningState { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -11603,6 +11625,26 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } } m.KeepTasks = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowInRunningState = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) From f5ec6dfc4824b6b0479e847f522b299b917d2af0 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 6 Mar 2020 15:57:55 +0100 Subject: [PATCH 0148/2352] [OCTRL-206] Update core to destroy running env if specified --- coconut/control/control.go | 1 - core/protos/o2control.pb.go | 368 ++++++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/server.go | 13 +- 4 files changed, 216 insertions(+), 167 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 06f412b3f..c4dcc22d6 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -430,7 +430,6 @@ func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. keepTasks = false } - _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks, AllowInRunningState: allowInRunningState}, grpc.EmptyCallOption{}) if err != nil { return diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6cd144ea3..4289a53b0 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1366,6 +1366,7 @@ func (m *ModifyEnvironmentReply) GetState() string { type DestroyEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1418,6 +1419,13 @@ func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { return false } +func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if m != nil { + return m.AllowInRunningState + } + return false +} + type DestroyEnvironmentReply struct { CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3545,170 +3553,171 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2598 bytes of a gzipped FileDescriptorProto + // 2620 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, - 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0x6d, 0x93, 0xf4, 0xfe, - 0xaa, 0x6e, 0xda, 0xdd, 0x9f, 0x4b, 0xb3, 0x2b, 0xb6, 0x74, 0xb7, 0x5b, 0xf2, 0xc7, 0x75, 0x03, - 0x4d, 0x5c, 0x26, 0x6e, 0x0b, 0x95, 0x50, 0x99, 0xd8, 0xd7, 0xb1, 0x37, 0xe3, 0x19, 0x77, 0x66, - 0xec, 0x36, 0x0f, 0xbc, 0xf1, 0x86, 0x10, 0x42, 0xbc, 0xf0, 0x8a, 0x10, 0xdf, 0x81, 0x07, 0x24, - 0x5e, 0x11, 0x02, 0xc1, 0x47, 0x40, 0x45, 0xe2, 0x99, 0x8f, 0x80, 0xee, 0xbf, 0x99, 0x3b, 0xe3, - 0x19, 0x27, 0x05, 0xed, 0x0b, 0x6f, 0x3e, 0xe7, 0x9e, 0x73, 0xee, 0x3d, 0xff, 0xee, 0x39, 0xe7, - 0x8e, 0x61, 0x65, 0xe8, 0x3a, 0xbe, 0xe3, 0xdd, 0x71, 0xb6, 0xda, 0x8e, 0xed, 0xbb, 0x8e, 0x55, - 0x63, 0x08, 0x54, 0x0c, 0x10, 0x78, 0x05, 0x96, 0xeb, 0x63, 0x62, 0xfb, 0xaf, 0x0e, 0x88, 0xe7, - 0x78, 0x8f, 0x89, 0xe9, 0xfa, 0xc7, 0xc4, 0xf4, 0xf1, 0x02, 0xcc, 0x1f, 0xf9, 0xa6, 0x3f, 0xf2, - 0x0c, 0xf2, 0x7a, 0x44, 0x3c, 0x1f, 0x1f, 0x43, 0x49, 0x22, 0x86, 0xd6, 0x19, 0x5a, 0x86, 0x9c, - 0xe7, 0x9b, 0x3e, 0xd1, 0xb5, 0x0d, 0x6d, 0xb3, 0x68, 0x70, 0x00, 0x3d, 0x80, 0x79, 0x8f, 0x11, - 0x3d, 0x1b, 0x76, 0x4c, 0x9f, 0x78, 0x7a, 0x66, 0x63, 0x76, 0xb3, 0xb4, 0x75, 0xa5, 0x16, 0x9e, - 0xe0, 0x48, 0x59, 0x37, 0xa2, 0xd4, 0xf8, 0x2f, 0x1a, 0xcc, 0xa9, 0xeb, 0xe8, 0x13, 0xc8, 0x59, - 0x64, 0x4c, 0x2c, 0xb6, 0x4b, 0x79, 0xeb, 0x5a, 0x8a, 0x9c, 0xda, 0x13, 0x4a, 0x64, 0x70, 0x5a, - 0xb4, 0x0f, 0xe5, 0x41, 0x44, 0x19, 0x3d, 0xb3, 0xa1, 0x6d, 0x96, 0xb6, 0xd6, 0x15, 0xee, 0x24, - 0x9d, 0x1f, 0xcf, 0x18, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x5e, 0x7d, - 0xe7, 0x59, 0xa3, 0x32, 0x83, 0x0a, 0x90, 0xdd, 0x3f, 0x7c, 0xd4, 0xac, 0x68, 0xa8, 0x04, 0xf9, - 0x17, 0xdb, 0xc6, 0xe1, 0xfe, 0x61, 0xa3, 0x92, 0xa1, 0x14, 0x75, 0xc3, 0x68, 0x1a, 0x95, 0xd9, - 0x9d, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0a, 0x57, 0x1a, 0xc4, 0x7f, 0xe4, 0x9a, 0x03, 0xf2, 0xc6, - 0x71, 0x4f, 0xf7, 0xed, 0xae, 0x23, 0xcd, 0xf9, 0x1b, 0x0d, 0xf2, 0xcf, 0x89, 0xeb, 0xf5, 0x1d, - 0x9b, 0xda, 0x72, 0x60, 0x7e, 0xe5, 0xb8, 0x4c, 0xcb, 0x9c, 0xc1, 0x01, 0x86, 0xed, 0xdb, 0x8e, - 0xcb, 0x4e, 0x4f, 0xb1, 0x14, 0xa0, 0xd8, 0xa1, 0xe9, 0xb7, 0x7b, 0xfa, 0x2c, 0xc7, 0x32, 0x80, - 0x62, 0x8f, 0x47, 0x7d, 0xab, 0xa3, 0x67, 0xb9, 0x37, 0x18, 0x80, 0x36, 0xa0, 0x34, 0x74, 0x9d, - 0xce, 0xa8, 0xed, 0x1f, 0x9a, 0x03, 0xa2, 0xe7, 0xd8, 0x9a, 0x8a, 0x42, 0x6b, 0x00, 0x63, 0x7e, - 0x88, 0x23, 0xdf, 0xd5, 0x2f, 0x31, 0x02, 0x05, 0x83, 0x7f, 0x9e, 0x81, 0xcb, 0x93, 0x1a, 0x50, - 0xff, 0x6f, 0x40, 0xa9, 0x1b, 0x60, 0x3b, 0x22, 0x0a, 0x54, 0x14, 0xfa, 0x18, 0x16, 0x89, 0x3d, - 0xee, 0xbb, 0x8e, 0x3d, 0x20, 0xb6, 0xef, 0xed, 0x3a, 0x23, 0xdb, 0x17, 0xba, 0x4c, 0x2e, 0xd0, - 0x93, 0xf8, 0xa6, 0x77, 0x2a, 0xc8, 0xb8, 0x72, 0x0a, 0x26, 0x8c, 0xb7, 0xac, 0x1a, 0x6f, 0x6b, - 0x00, 0x3d, 0xc7, 0x93, 0xc2, 0x73, 0x9c, 0x2b, 0xc4, 0x20, 0x0c, 0x73, 0x7d, 0xdb, 0xf3, 0x4d, - 0xbb, 0x4d, 0x98, 0x09, 0xb8, 0x86, 0x11, 0x1c, 0xfa, 0x18, 0xf2, 0x42, 0x63, 0x3d, 0xcf, 0xe2, - 0x04, 0x29, 0x71, 0x22, 0x5c, 0x64, 0x48, 0x12, 0x7c, 0x0b, 0x16, 0x5a, 0xc4, 0x74, 0x3b, 0xce, - 0x1b, 0x5b, 0xb8, 0x12, 0xad, 0xc0, 0x25, 0x97, 0x98, 0x9e, 0x63, 0x0b, 0x2b, 0x08, 0x88, 0xa6, - 0x50, 0x48, 0x3a, 0xb4, 0xce, 0xb0, 0x0e, 0x2b, 0x0d, 0xe2, 0xd7, 0x15, 0xdd, 0x65, 0x34, 0xbc, - 0x85, 0xe5, 0x89, 0x95, 0x8b, 0x59, 0xf9, 0x4b, 0x98, 0x53, 0x8d, 0x29, 0x12, 0xae, 0xaa, 0x86, - 0x7a, 0xb8, 0xcc, 0xdc, 0x17, 0xa1, 0xc7, 0x7f, 0xca, 0xc2, 0x42, 0x8c, 0x02, 0x95, 0x21, 0xd3, - 0x97, 0x9b, 0x65, 0xfa, 0x2c, 0x8e, 0xda, 0x2e, 0x31, 0x7d, 0xd2, 0x79, 0xd1, 0x23, 0x36, 0xf3, - 0x61, 0xd1, 0x50, 0x51, 0xa1, 0x77, 0x66, 0x55, 0xef, 0xd4, 0x20, 0xc7, 0x3c, 0xa8, 0x67, 0xd9, - 0xa1, 0x74, 0x35, 0x7b, 0x7b, 0x8e, 0xeb, 0xb7, 0x4c, 0x8f, 0x47, 0x14, 0x27, 0x43, 0x55, 0x28, - 0xb8, 0x8e, 0xe3, 0x1b, 0x8e, 0x25, 0x83, 0x35, 0x80, 0xd1, 0x6d, 0xa8, 0xb4, 0x47, 0xae, 0x4b, - 0x6c, 0xdf, 0x18, 0xd9, 0x87, 0xa3, 0xc1, 0x31, 0xe1, 0xf1, 0x3a, 0x6f, 0x4c, 0xe0, 0xd1, 0x1e, - 0x14, 0x3a, 0xa4, 0x6b, 0x8e, 0x2c, 0xdf, 0xd3, 0xf3, 0x6c, 0xeb, 0xcd, 0x74, 0x7b, 0xd4, 0xf6, - 0x04, 0x69, 0xdd, 0xf6, 0xdd, 0x33, 0x23, 0xe0, 0x44, 0xf7, 0x20, 0x3b, 0x36, 0x5d, 0x4f, 0x2f, - 0x30, 0x09, 0x37, 0xa6, 0x48, 0x78, 0x6e, 0xba, 0x82, 0x9b, 0x71, 0xd0, 0xfd, 0x47, 0x1e, 0x71, - 0x29, 0x5a, 0x2f, 0x9e, 0xbb, 0xff, 0x33, 0x41, 0x2a, 0xf6, 0x97, 0x9c, 0xd5, 0xcf, 0x61, 0x3e, - 0x72, 0x34, 0x54, 0x81, 0xd9, 0x53, 0x72, 0x26, 0xfc, 0x42, 0x7f, 0x52, 0xb3, 0x8f, 0x4d, 0x6b, - 0x44, 0x84, 0x4b, 0x38, 0x70, 0x3f, 0x73, 0x4f, 0xab, 0x7e, 0x06, 0xc5, 0x40, 0xe6, 0x7b, 0x31, - 0x7e, 0x0e, 0xf3, 0x91, 0x03, 0xbd, 0x0f, 0x33, 0xfe, 0xbd, 0x06, 0x97, 0x0f, 0xc9, 0x1b, 0x45, - 0x43, 0x99, 0x23, 0xb7, 0xa1, 0x42, 0x03, 0xb6, 0x6b, 0x39, 0x6f, 0x5a, 0x64, 0x30, 0xb4, 0xc2, - 0xca, 0x31, 0x81, 0x47, 0x5f, 0x0a, 0xc3, 0xf3, 0x50, 0xbe, 0xad, 0x98, 0x2e, 0x51, 0x76, 0xdc, - 0xfc, 0xff, 0xb1, 0xee, 0xf8, 0x08, 0x96, 0xe2, 0x3b, 0xd0, 0x24, 0xfc, 0x02, 0x4a, 0x4a, 0xca, - 0x30, 0x51, 0xd3, 0x33, 0x4c, 0x25, 0xc7, 0x1f, 0xb2, 0x1b, 0x34, 0xc1, 0x24, 0xb1, 0x2c, 0xc3, - 0x3f, 0xd1, 0x60, 0x29, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x40, 0x41, 0x1a, 0x58, 0x94, 0xc1, - 0x25, 0x85, 0x95, 0xa6, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xdd, 0xe5, 0xcb, 0xe7, - 0x1f, 0x1a, 0x3d, 0x84, 0xac, 0x7f, 0x36, 0xe4, 0xb6, 0x2c, 0x6f, 0x7d, 0xa4, 0x88, 0x4e, 0x95, - 0x51, 0x6b, 0x0e, 0x29, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xeb, 0xea, 0x61, 0xb3, - 0xf9, 0xb4, 0x32, 0x83, 0x10, 0x94, 0x8f, 0x5a, 0xdb, 0x46, 0xeb, 0xd5, 0xf6, 0x6e, 0x6b, 0xff, - 0xf9, 0x7e, 0xeb, 0x07, 0x15, 0x0d, 0x2d, 0xc2, 0xfc, 0x51, 0xab, 0xf9, 0x34, 0x44, 0x65, 0xd0, - 0x3c, 0x14, 0x77, 0x9b, 0x87, 0x8f, 0xf6, 0x1b, 0xcf, 0x8c, 0x7a, 0x65, 0x96, 0x16, 0x60, 0xa3, - 0x7e, 0x54, 0x6f, 0x55, 0xb2, 0x68, 0x0e, 0x0a, 0x8d, 0xe6, 0x2b, 0x5e, 0x8e, 0x73, 0xf8, 0x14, - 0xae, 0x24, 0x1d, 0x86, 0xda, 0x36, 0xae, 0x4e, 0x70, 0x8f, 0x65, 0xd4, 0x7b, 0x2c, 0xe9, 0xee, - 0x99, 0x4d, 0xbe, 0x7b, 0xf0, 0x2f, 0x35, 0xd0, 0x0f, 0x9c, 0x4e, 0xbf, 0x7b, 0x76, 0x21, 0xeb, - 0x81, 0x33, 0x24, 0xae, 0xe9, 0xf7, 0x1d, 0x5b, 0xc6, 0xfb, 0x7a, 0xb2, 0x67, 0x9b, 0x92, 0xce, - 0x50, 0x58, 0xd0, 0x4d, 0x28, 0xbb, 0xa4, 0xed, 0xd8, 0xdd, 0xfe, 0xc9, 0xc8, 0x25, 0xdb, 0x96, - 0xc5, 0xce, 0x55, 0x30, 0x62, 0x58, 0xfc, 0x6b, 0x0d, 0x96, 0x93, 0x84, 0xa1, 0xfb, 0xc2, 0x7f, - 0xbc, 0xbf, 0xba, 0x79, 0xce, 0xde, 0x11, 0xd7, 0xf1, 0xeb, 0xda, 0xe2, 0x85, 0x35, 0x23, 0xaf, - 0x6b, 0x0e, 0xe3, 0xbb, 0x09, 0x6e, 0x5d, 0x80, 0x92, 0x51, 0x3f, 0x68, 0x3e, 0xaf, 0xbf, 0x32, - 0x9a, 0x4f, 0xa8, 0xc7, 0xe6, 0xa0, 0xb0, 0xbd, 0xb7, 0xc7, 0xa1, 0x2c, 0xfe, 0xa9, 0x06, 0x2b, - 0x09, 0x96, 0xa3, 0x6e, 0xfa, 0x2e, 0x54, 0xba, 0x66, 0xdf, 0x22, 0x9d, 0x66, 0x68, 0x2d, 0xed, - 0x62, 0xd6, 0x9a, 0x60, 0x14, 0x4e, 0xc8, 0x4c, 0xfa, 0x5c, 0xad, 0x5d, 0x78, 0x1f, 0x56, 0xf7, - 0x88, 0xe7, 0xbb, 0xce, 0x45, 0xfc, 0x78, 0x15, 0x8a, 0xa7, 0x84, 0x0c, 0x5b, 0xac, 0xd8, 0x65, - 0x98, 0x07, 0x42, 0x04, 0x26, 0x70, 0x25, 0x49, 0x14, 0x55, 0xec, 0x3b, 0xb0, 0xd8, 0xb6, 0x88, - 0x69, 0x8f, 0x38, 0x29, 0x43, 0x8a, 0x0c, 0xbf, 0xaa, 0xe6, 0x52, 0x9c, 0xc6, 0x98, 0x64, 0xc3, - 0x7f, 0xd6, 0x60, 0xfd, 0x28, 0x72, 0x7f, 0x3c, 0x75, 0x69, 0xa8, 0xf8, 0x7d, 0xe2, 0xa5, 0x1d, - 0xfc, 0x25, 0xc0, 0x30, 0x20, 0x12, 0x01, 0x78, 0x5f, 0x2d, 0xd3, 0xd3, 0xe5, 0xd5, 0x42, 0x0c, - 0xbf, 0x80, 0x15, 0x69, 0xd5, 0x07, 0xb0, 0x10, 0x5b, 0x7e, 0xaf, 0xcb, 0x78, 0x1d, 0xae, 0xa5, - 0xef, 0x4e, 0xf5, 0xf5, 0x60, 0xbd, 0xf1, 0x9e, 0xea, 0xea, 0x90, 0x7f, 0x3d, 0x22, 0xae, 0xd4, - 0xb5, 0x68, 0x48, 0x90, 0x26, 0x12, 0x79, 0xdb, 0xb6, 0x46, 0x1d, 0xd2, 0xb0, 0x9c, 0x63, 0xd3, - 0xf2, 0x64, 0x22, 0x45, 0xb1, 0xf8, 0x77, 0x1a, 0x5c, 0x6b, 0x4c, 0x3b, 0x16, 0xfa, 0x7e, 0xc4, - 0xa4, 0x3c, 0x4a, 0xef, 0x29, 0x26, 0x9d, 0xca, 0xfd, 0x75, 0x1a, 0xf4, 0x9f, 0x1a, 0xcc, 0x47, - 0xda, 0x2e, 0x84, 0x20, 0x6b, 0xd3, 0xe4, 0xe5, 0xec, 0xec, 0x37, 0x6d, 0x66, 0x2d, 0xa7, 0x7d, - 0x4a, 0x3a, 0x22, 0x8e, 0x05, 0x44, 0xf1, 0xb4, 0x49, 0xdb, 0xef, 0x88, 0x34, 0x11, 0x10, 0xc5, - 0xf3, 0x19, 0x4e, 0x34, 0xe6, 0x02, 0x0a, 0xb3, 0x2a, 0xa7, 0xde, 0xa4, 0x57, 0xa1, 0xd8, 0xb6, - 0x4c, 0xcf, 0x53, 0x9a, 0xf1, 0x10, 0x81, 0xea, 0x50, 0xee, 0x90, 0xa1, 0xe5, 0x9c, 0xc9, 0x52, - 0x26, 0x1a, 0x72, 0x75, 0xec, 0xa3, 0x87, 0xdf, 0x8b, 0x10, 0x19, 0x31, 0x26, 0x5a, 0x48, 0xd1, - 0x24, 0x19, 0xbd, 0xae, 0xe8, 0x64, 0xa0, 0x68, 0x1c, 0xc0, 0x34, 0x30, 0xcc, 0x13, 0x4a, 0x28, - 0x2f, 0x06, 0x09, 0xd2, 0x15, 0xa7, 0xdb, 0x25, 0x6e, 0xa0, 0xb8, 0x04, 0xe9, 0xec, 0x41, 0xde, - 0x92, 0xf6, 0xc8, 0x77, 0xe8, 0x22, 0xd7, 0x5e, 0xc1, 0xe0, 0x45, 0x58, 0x68, 0x10, 0x5f, 0x24, - 0x28, 0x6f, 0xf3, 0x1f, 0xc2, 0x7c, 0x88, 0xa2, 0xc1, 0x12, 0x74, 0xc8, 0xda, 0x85, 0x3a, 0x64, - 0xbc, 0x09, 0x65, 0x21, 0x40, 0x19, 0x3e, 0x84, 0x5f, 0x34, 0xd5, 0x2f, 0xf8, 0x33, 0x98, 0x0b, - 0x28, 0xe9, 0x4e, 0x1f, 0x42, 0x96, 0xae, 0x88, 0xcb, 0x65, 0x29, 0x66, 0x51, 0xb6, 0x07, 0x23, - 0xc0, 0x75, 0x98, 0xa7, 0x98, 0x5d, 0xea, 0x95, 0xd4, 0x28, 0xa1, 0x13, 0x01, 0x67, 0x3f, 0x70, - 0x3a, 0x24, 0x98, 0x08, 0x42, 0x14, 0xfe, 0x31, 0x94, 0x76, 0x9d, 0xc1, 0xc0, 0xb4, 0x3b, 0x4c, - 0x48, 0x05, 0x66, 0x89, 0x3d, 0x66, 0x6a, 0x16, 0x0d, 0xfa, 0x93, 0x05, 0x48, 0x8f, 0x58, 0x96, - 0x88, 0x33, 0x0e, 0x84, 0xe1, 0x3b, 0xab, 0x84, 0x2f, 0x0d, 0x1b, 0xd3, 0x3d, 0x19, 0xf1, 0x09, - 0x27, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, 0x34, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x01, 0x94, - 0x76, 0x7b, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, 0xa4, 0xb4, 0x2e, 0x45, 0x51, 0xd2, 0x98, 0x35, - 0xdd, 0x13, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, 0xaf, 0x59, 0x28, 0x04, 0x69, 0xf3, 0x4d, 0x28, - 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, 0x1d, 0x17, 0x92, 0x52, 0xbe, 0xb6, 0xb4, 0xaa, - 0xe8, 0xc5, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, 0x21, 0x29, 0xfa, 0x36, 0x2c, 0xf4, 0xed, 0x63, - 0x67, 0x64, 0x77, 0x84, 0x4a, 0xf4, 0x72, 0xa2, 0xe1, 0xb2, 0xa2, 0x96, 0x88, 0x50, 0x5b, 0x23, - 0x4e, 0x8e, 0x76, 0xa0, 0xe2, 0x8c, 0xfc, 0xa8, 0x88, 0xec, 0x54, 0x11, 0x13, 0xf4, 0xe8, 0x1e, - 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, - 0x3d, 0x35, 0xfd, 0x9e, 0xc8, 0xf9, 0x00, 0xa6, 0xfe, 0x26, 0xf6, 0x78, 0xbf, 0xc3, 0x32, 0xbd, - 0x68, 0x70, 0x00, 0xed, 0x46, 0xee, 0x50, 0x3e, 0x42, 0xfd, 0x5f, 0x42, 0xc8, 0x7e, 0x9d, 0xd7, - 0xe5, 0x1d, 0x58, 0x8a, 0x96, 0x5d, 0x9e, 0x6f, 0x3a, 0xe4, 0x79, 0x86, 0x79, 0x22, 0x98, 0x25, - 0x88, 0x7f, 0xa6, 0xc1, 0xe2, 0x44, 0xa1, 0x46, 0xf7, 0xa1, 0x74, 0xda, 0xb7, 0x2c, 0xd2, 0x69, - 0x5d, 0x28, 0xcf, 0x55, 0x62, 0xf4, 0x05, 0xcc, 0xb9, 0x23, 0xdb, 0xee, 0xdb, 0x27, 0xb2, 0xb3, - 0x98, 0xce, 0x1c, 0xa1, 0xc6, 0xbb, 0xec, 0xfe, 0xa1, 0x1d, 0x7e, 0x70, 0xf8, 0xc0, 0xda, 0x9a, - 0x6a, 0xed, 0x2a, 0x14, 0x86, 0xa6, 0xdf, 0x3b, 0x1a, 0x92, 0xb6, 0xec, 0xe3, 0x24, 0x8c, 0x7f, - 0x91, 0x85, 0x82, 0x1c, 0x12, 0xd2, 0xea, 0x85, 0xb8, 0xff, 0x33, 0xc9, 0xf7, 0x7f, 0xe4, 0x45, - 0xa0, 0x0a, 0x85, 0xee, 0xc8, 0xb2, 0x58, 0x28, 0xf0, 0x1b, 0x33, 0x80, 0x55, 0xcb, 0xe6, 0x22, - 0x96, 0x45, 0xb7, 0x20, 0x47, 0x1b, 0x4b, 0x4f, 0xbf, 0xc4, 0x0c, 0x90, 0x38, 0xc0, 0x70, 0x0a, - 0xf4, 0x60, 0x62, 0xf4, 0xbf, 0x9e, 0x40, 0x9d, 0x3a, 0xf3, 0xdf, 0x8d, 0xcc, 0xfc, 0xd7, 0x92, - 0x58, 0xe3, 0xc3, 0xfe, 0x83, 0x89, 0x61, 0x3f, 0x71, 0xc7, 0xff, 0xa1, 0x29, 0xff, 0x3e, 0xab, - 0x62, 0x22, 0xb0, 0x68, 0x8c, 0x07, 0xfe, 0xd1, 0xce, 0xf3, 0x0f, 0xfe, 0xad, 0x06, 0x1f, 0x34, - 0x88, 0xff, 0x22, 0x36, 0xf3, 0x07, 0x11, 0xba, 0x01, 0x25, 0x97, 0x0c, 0x9d, 0xa7, 0xa6, 0xef, - 0x13, 0x57, 0x3e, 0xa8, 0xa9, 0x28, 0xb4, 0x09, 0x0b, 0x2e, 0x19, 0xf7, 0xbd, 0xbe, 0x63, 0x4b, - 0x2a, 0x7e, 0xc2, 0x38, 0x9a, 0xca, 0x32, 0x2d, 0x6b, 0xc7, 0x35, 0xed, 0x76, 0x8f, 0xc8, 0x86, - 0x4e, 0x45, 0xb1, 0xb2, 0x6f, 0x59, 0x2d, 0xf3, 0x84, 0x77, 0x2f, 0x05, 0x43, 0x82, 0xf8, 0x18, - 0x96, 0xe3, 0x67, 0x94, 0x29, 0x40, 0x0f, 0x23, 0x53, 0x80, 0xfe, 0x66, 0xf7, 0x9b, 0x7c, 0xd3, - 0x10, 0xf9, 0x23, 0x61, 0x36, 0x23, 0x89, 0x63, 0x89, 0x4c, 0x08, 0x60, 0xfc, 0x15, 0xac, 0x26, - 0x9b, 0x82, 0xda, 0xf4, 0x00, 0x16, 0xe3, 0x0f, 0x23, 0x49, 0x33, 0x4f, 0xd2, 0x21, 0x8d, 0x49, - 0x4e, 0x8c, 0xa0, 0xf2, 0xa4, 0xef, 0xd1, 0xa9, 0xc3, 0x51, 0x5e, 0xf4, 0x0b, 0x14, 0x4e, 0x4d, - 0x6d, 0x1d, 0xf2, 0x22, 0x31, 0x44, 0x8d, 0x96, 0x20, 0xf5, 0x81, 0xf8, 0x69, 0x44, 0x95, 0x8b, - 0xa3, 0xf1, 0x6b, 0x28, 0x2b, 0xfb, 0xca, 0x60, 0xa1, 0x50, 0x52, 0xb0, 0x88, 0xd3, 0x18, 0x9c, - 0x02, 0x7d, 0x0a, 0x97, 0x4f, 0x58, 0xdf, 0xbd, 0x17, 0xdb, 0x8c, 0x5b, 0x39, 0x79, 0x11, 0x1f, - 0x42, 0x79, 0xbb, 0xd3, 0xa1, 0xb2, 0x64, 0x50, 0x25, 0x29, 0x97, 0xa0, 0x42, 0x26, 0x59, 0x05, - 0x03, 0xe6, 0x02, 0x79, 0xbc, 0x67, 0x43, 0x36, 0x79, 0x13, 0x3f, 0x12, 0x97, 0x9d, 0xb0, 0x42, - 0x77, 0xef, 0xcb, 0x8a, 0x5f, 0x34, 0xd8, 0x6f, 0x7c, 0x0b, 0x16, 0x0d, 0x32, 0x70, 0xc6, 0x44, - 0x3d, 0xe6, 0x32, 0xe4, 0xfa, 0x76, 0x87, 0xbc, 0x95, 0x9f, 0x01, 0x18, 0x80, 0xbf, 0x05, 0x0b, - 0x2a, 0x29, 0x3d, 0xc1, 0x4d, 0x28, 0xab, 0xfb, 0x04, 0xe1, 0x18, 0xc3, 0xe2, 0x8f, 0x60, 0xc9, - 0x20, 0x5d, 0x97, 0x78, 0x3d, 0xd5, 0xef, 0x29, 0xfb, 0xfc, 0x3f, 0x5c, 0x3e, 0x22, 0xbe, 0xc2, - 0x3e, 0x9d, 0xfc, 0x01, 0x1b, 0x36, 0x1b, 0x49, 0x1e, 0x90, 0x8c, 0x6a, 0xec, 0x6b, 0xb1, 0xd8, - 0xff, 0x1e, 0x9b, 0xee, 0xe8, 0x36, 0x29, 0xcc, 0x89, 0xbb, 0x46, 0x44, 0x66, 0x62, 0x22, 0xef, - 0xc2, 0x07, 0x69, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x79, 0xc8, 0xd5, 0x07, 0x43, - 0xff, 0x6c, 0xeb, 0x0f, 0xf3, 0x90, 0x17, 0x6f, 0x44, 0x68, 0x17, 0x4a, 0x2d, 0xd7, 0x6c, 0x9f, - 0xf2, 0x0f, 0x4c, 0x48, 0x9f, 0xf8, 0xe6, 0x24, 0x8e, 0x58, 0x5d, 0x49, 0x58, 0xa1, 0x83, 0xe9, - 0xcc, 0x37, 0x34, 0xf4, 0x12, 0x2a, 0xf1, 0xef, 0x26, 0x08, 0x47, 0xa7, 0xc0, 0xa4, 0xcf, 0x42, - 0xd5, 0x8d, 0xa9, 0x34, 0x4c, 0x3a, 0xda, 0x81, 0x82, 0xfc, 0xae, 0x80, 0xd4, 0x77, 0xc0, 0xd8, - 0x77, 0x89, 0xaa, 0x9e, 0xb8, 0xc6, 0x65, 0xbc, 0x60, 0xcd, 0x81, 0xfa, 0xc1, 0x01, 0x5d, 0x4f, - 0x1d, 0x52, 0x03, 0x8d, 0xd7, 0xa7, 0x91, 0x70, 0xc1, 0x2d, 0x28, 0x47, 0xdf, 0x50, 0xd1, 0xc6, - 0x79, 0x0f, 0xb8, 0xd5, 0xb5, 0x29, 0x14, 0x81, 0xd4, 0xe8, 0x7e, 0x68, 0x23, 0xf5, 0x28, 0x49, - 0x52, 0x13, 0xde, 0x55, 0xf1, 0x0c, 0xfa, 0x11, 0xa0, 0xc9, 0x87, 0x41, 0x74, 0xe3, 0x22, 0x8f, - 0x98, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x87, 0xb0, 0x38, 0xf1, 0xa4, 0x85, 0xd4, 0x4e, 0x36, - 0xed, 0xa9, 0xb0, 0x7a, 0x7d, 0x3a, 0x51, 0xa0, 0xc0, 0xe4, 0xcb, 0x52, 0x44, 0x81, 0xd4, 0x37, - 0xac, 0x88, 0x02, 0x29, 0xcf, 0x53, 0x3c, 0xd6, 0xe4, 0xc4, 0x1a, 0x89, 0xb5, 0xd8, 0x64, 0x1b, - 0x89, 0xb5, 0xc8, 0x88, 0x8b, 0x67, 0xd0, 0x43, 0xc8, 0x0b, 0x14, 0x5a, 0x9d, 0x24, 0x93, 0x12, - 0xae, 0x24, 0x2d, 0x71, 0x01, 0x87, 0x30, 0xa7, 0x36, 0xd6, 0x68, 0x2d, 0xf5, 0x69, 0x8c, 0x8b, - 0x9a, 0xfa, 0x74, 0x16, 0x28, 0xc5, 0x1a, 0x98, 0xb8, 0x52, 0x6a, 0xbb, 0x1c, 0x57, 0x2a, 0xec, - 0x78, 0xf0, 0x0c, 0xea, 0xb2, 0x2f, 0x76, 0x13, 0xc5, 0x1b, 0xdd, 0x8c, 0xf2, 0xa4, 0x35, 0x3a, - 0xd5, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xea, 0x50, 0x0c, 0x0a, 0x28, 0xfa, 0x40, 0x61, 0x8a, 0x97, - 0xf3, 0xea, 0x6a, 0xf2, 0x62, 0xe0, 0x03, 0x51, 0xc4, 0x22, 0x3e, 0x88, 0x16, 0xca, 0x88, 0x0f, - 0xd4, 0x9a, 0x87, 0x67, 0xd0, 0x63, 0x80, 0xb0, 0x0c, 0xa1, 0xab, 0x91, 0xaa, 0x1d, 0x2b, 0x64, - 0xd5, 0x6a, 0xca, 0xaa, 0xb4, 0xfe, 0x9c, 0x5a, 0x95, 0x22, 0xde, 0x4c, 0x28, 0x57, 0xd5, 0x8a, - 0xfa, 0xc4, 0x4b, 0x6f, 0x6b, 0x3c, 0x83, 0x1e, 0x41, 0x39, 0x5a, 0xac, 0x22, 0xf7, 0x41, 0x62, - 0x1d, 0x4b, 0x94, 0xf3, 0x12, 0xf4, 0xb4, 0x2a, 0x86, 0x6e, 0x47, 0x25, 0x4e, 0x2b, 0x75, 0x89, - 0xb2, 0x2d, 0x58, 0x49, 0xae, 0x47, 0x68, 0x33, 0x2a, 0x39, 0xbd, 0x0a, 0x56, 0x6f, 0x5e, 0x80, - 0x92, 0x59, 0x75, 0xe7, 0xde, 0x1f, 0xdf, 0xad, 0x69, 0x7f, 0x7b, 0xb7, 0xa6, 0xfd, 0xfd, 0xdd, - 0x9a, 0xf6, 0xab, 0x7f, 0xac, 0xcd, 0x00, 0x6e, 0xf7, 0x6a, 0x6d, 0xe2, 0xda, 0x35, 0xd3, 0xea, - 0xb7, 0x49, 0xcd, 0xd9, 0xaa, 0x49, 0x49, 0xee, 0xb0, 0xed, 0x11, 0x77, 0x4c, 0xdc, 0x97, 0x99, - 0xe1, 0xf1, 0xf1, 0x25, 0xf6, 0x9f, 0x90, 0x4f, 0xfe, 0x1d, 0x00, 0x00, 0xff, 0xff, 0xdb, 0x21, - 0x23, 0x05, 0x2d, 0x22, 0x00, 0x00, + 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, + 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, + 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, + 0xd8, 0x69, 0x84, 0x78, 0xe3, 0x0d, 0x21, 0x84, 0x78, 0xe1, 0x15, 0x21, 0xbe, 0x03, 0x0f, 0x48, + 0xbc, 0x22, 0x04, 0x82, 0x8f, 0x80, 0x8a, 0xc4, 0x33, 0x1f, 0x01, 0xdd, 0x7f, 0x33, 0x77, 0xc6, + 0x33, 0x4e, 0x0a, 0xda, 0x17, 0xde, 0x7c, 0xce, 0x3d, 0xe7, 0xdc, 0x7b, 0xfe, 0xdd, 0x73, 0xee, + 0x19, 0xc3, 0xd2, 0xc0, 0x75, 0x7c, 0xc7, 0xbb, 0xeb, 0x6c, 0xb6, 0x1c, 0xdb, 0x77, 0x1d, 0x6b, + 0x83, 0x21, 0x50, 0x31, 0x40, 0xe0, 0x25, 0x58, 0xac, 0x8d, 0x88, 0xed, 0xbf, 0xde, 0x27, 0x9e, + 0xe3, 0x3d, 0x21, 0xa6, 0xeb, 0x1f, 0x11, 0xd3, 0xc7, 0x73, 0x30, 0x7b, 0xe8, 0x9b, 0xfe, 0xd0, + 0x33, 0xc8, 0x9b, 0x21, 0xf1, 0x7c, 0x7c, 0x04, 0x25, 0x89, 0x18, 0x58, 0x67, 0x68, 0x11, 0x72, + 0x9e, 0x6f, 0xfa, 0x44, 0xd7, 0xd6, 0xb4, 0xf5, 0xa2, 0xc1, 0x01, 0xf4, 0x10, 0x66, 0x3d, 0x46, + 0xf4, 0x7c, 0xd0, 0x36, 0x7d, 0xe2, 0xe9, 0x99, 0xb5, 0xe9, 0xf5, 0xd2, 0xe6, 0x95, 0x8d, 0xf0, + 0x04, 0x87, 0xca, 0xba, 0x11, 0xa5, 0xc6, 0x7f, 0xd1, 0x60, 0x46, 0x5d, 0x47, 0x9f, 0x40, 0xce, + 0x22, 0x23, 0x62, 0xb1, 0x5d, 0xca, 0x9b, 0xd7, 0x53, 0xe4, 0x6c, 0x3c, 0xa5, 0x44, 0x06, 0xa7, + 0x45, 0x7b, 0x50, 0xee, 0x47, 0x94, 0xd1, 0x33, 0x6b, 0xda, 0x7a, 0x69, 0x73, 0x55, 0xe1, 0x4e, + 0xd2, 0xf9, 0xc9, 0x94, 0x11, 0x63, 0xc4, 0x9f, 0x42, 0x8e, 0x89, 0x46, 0x45, 0xc8, 0xed, 0xd6, + 0xb6, 0x9f, 0xd7, 0x2b, 0x53, 0xa8, 0x00, 0xd9, 0xbd, 0x83, 0xc7, 0x8d, 0x8a, 0x86, 0x4a, 0x90, + 0x7f, 0xb9, 0x65, 0x1c, 0xec, 0x1d, 0xd4, 0x2b, 0x19, 0x4a, 0x51, 0x33, 0x8c, 0x86, 0x51, 0x99, + 0xde, 0xce, 0x43, 0x8e, 0xc9, 0xc7, 0xcb, 0x70, 0xa5, 0x4e, 0xfc, 0xc7, 0xae, 0xd9, 0x27, 0xa7, + 0x8e, 0x7b, 0xb2, 0x67, 0x77, 0x1c, 0x69, 0xce, 0xdf, 0x68, 0x90, 0x7f, 0x41, 0x5c, 0xaf, 0xe7, + 0xd8, 0xd4, 0x96, 0x7d, 0xf3, 0x2b, 0xc7, 0x65, 0x5a, 0xe6, 0x0c, 0x0e, 0x30, 0x6c, 0xcf, 0x76, + 0x5c, 0x76, 0x7a, 0x8a, 0xa5, 0x00, 0xc5, 0x0e, 0x4c, 0xbf, 0xd5, 0xd5, 0xa7, 0x39, 0x96, 0x01, + 0x14, 0x7b, 0x34, 0xec, 0x59, 0x6d, 0x3d, 0xcb, 0xbd, 0xc1, 0x00, 0xb4, 0x06, 0xa5, 0x81, 0xeb, + 0xb4, 0x87, 0x2d, 0xff, 0xc0, 0xec, 0x13, 0x3d, 0xc7, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0xf1, + 0x43, 0x1c, 0xfa, 0xae, 0x7e, 0x89, 0x11, 0x28, 0x18, 0xfc, 0xf3, 0x0c, 0x5c, 0x1e, 0xd7, 0x80, + 0xfa, 0x7f, 0x0d, 0x4a, 0x9d, 0x00, 0xdb, 0x16, 0x51, 0xa0, 0xa2, 0xd0, 0x47, 0x30, 0x4f, 0xec, + 0x51, 0xcf, 0x75, 0xec, 0x3e, 0xb1, 0x7d, 0x6f, 0xc7, 0x19, 0xda, 0xbe, 0xd0, 0x65, 0x7c, 0x81, + 0x9e, 0xc4, 0x37, 0xbd, 0x13, 0x41, 0xc6, 0x95, 0x53, 0x30, 0x61, 0xbc, 0x65, 0xd5, 0x78, 0x5b, + 0x01, 0xe8, 0x3a, 0x9e, 0x14, 0x9e, 0xe3, 0x5c, 0x21, 0x06, 0x61, 0x98, 0xe9, 0xd9, 0x9e, 0x6f, + 0xda, 0x2d, 0xc2, 0x4c, 0xc0, 0x35, 0x8c, 0xe0, 0xd0, 0x47, 0x90, 0x17, 0x1a, 0xeb, 0x79, 0x16, + 0x27, 0x48, 0x89, 0x13, 0xe1, 0x22, 0x43, 0x92, 0xe0, 0xdb, 0x30, 0xd7, 0x24, 0xa6, 0xdb, 0x76, + 0x4e, 0x6d, 0xe1, 0x4a, 0xb4, 0x04, 0x97, 0x5c, 0x62, 0x7a, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, + 0x42, 0x21, 0xe9, 0xc0, 0x3a, 0xc3, 0x3a, 0x2c, 0xd5, 0x89, 0x5f, 0x53, 0x74, 0x97, 0xd1, 0xf0, + 0x16, 0x16, 0xc7, 0x56, 0x2e, 0x66, 0xe5, 0x2f, 0x61, 0x46, 0x35, 0xa6, 0x48, 0xb8, 0xaa, 0x1a, + 0xea, 0xe1, 0x32, 0x73, 0x5f, 0x84, 0x1e, 0xff, 0x29, 0x0b, 0x73, 0x31, 0x0a, 0x54, 0x86, 0x4c, + 0x4f, 0x6e, 0x96, 0xe9, 0xb1, 0x38, 0x6a, 0xb9, 0xc4, 0xf4, 0x49, 0xfb, 0x65, 0x97, 0xd8, 0xcc, + 0x87, 0x45, 0x43, 0x45, 0x85, 0xde, 0x99, 0x56, 0xbd, 0xb3, 0x01, 0x39, 0xe6, 0x41, 0x3d, 0xcb, + 0x0e, 0xa5, 0xab, 0xd9, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa2, 0x38, 0x19, 0xaa, 0x42, + 0xc1, 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x19, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, + 0x62, 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0x8f, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, + 0xa1, 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xdb, 0x63, 0x63, + 0x57, 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, + 0x02, 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, + 0x97, 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, + 0x23, 0x47, 0x43, 0x15, 0x98, 0x3e, 0x21, 0x67, 0xc2, 0x2f, 0xf4, 0x27, 0x35, 0xfb, 0xc8, 0xb4, + 0x86, 0x44, 0xb8, 0x84, 0x03, 0x0f, 0x32, 0xf7, 0xb5, 0xea, 0x67, 0x50, 0x0c, 0x64, 0xbe, 0x17, + 0xe3, 0xe7, 0x30, 0x1b, 0x39, 0xd0, 0xfb, 0x30, 0xe3, 0xdf, 0x6b, 0x70, 0xf9, 0x80, 0x9c, 0x2a, + 0x1a, 0xca, 0x1c, 0xb9, 0x03, 0x15, 0x1a, 0xb0, 0x1d, 0xcb, 0x39, 0x6d, 0x92, 0xfe, 0xc0, 0x0a, + 0x2b, 0xc7, 0x18, 0x1e, 0x7d, 0x29, 0x0c, 0xcf, 0x43, 0xf9, 0x8e, 0x62, 0xba, 0x44, 0xd9, 0x71, + 0xf3, 0xff, 0xc7, 0xba, 0xe3, 0x43, 0x58, 0x88, 0xef, 0x40, 0x93, 0xf0, 0x0b, 0x28, 0x29, 0x29, + 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, 0x1c, 0x7f, 0xc0, 0x6e, 0xd0, 0x04, 0x93, 0xc4, 0xb2, 0x0c, + 0xff, 0x44, 0x83, 0x85, 0x38, 0xe5, 0x7f, 0xbd, 0x3d, 0xba, 0x0b, 0x05, 0x69, 0x60, 0x51, 0x06, + 0x17, 0x14, 0x56, 0x9a, 0x5a, 0x8c, 0x27, 0x20, 0xc2, 0x7f, 0xd5, 0x60, 0x79, 0x87, 0x2f, 0x9f, + 0x7f, 0x68, 0xf4, 0x08, 0xb2, 0xfe, 0xd9, 0x80, 0xdb, 0xb2, 0xbc, 0xf9, 0xa1, 0x22, 0x3a, 0x55, + 0xc6, 0x46, 0x63, 0x40, 0x59, 0x0c, 0xc6, 0x88, 0x4d, 0xb8, 0xc4, 0x61, 0x5a, 0x57, 0x0f, 0x1a, + 0x8d, 0x67, 0x95, 0x29, 0x84, 0xa0, 0x7c, 0xd8, 0xdc, 0x32, 0x9a, 0xaf, 0xb7, 0x76, 0x9a, 0x7b, + 0x2f, 0xf6, 0x9a, 0xdf, 0xaf, 0x68, 0x68, 0x1e, 0x66, 0x0f, 0x9b, 0x8d, 0x67, 0x21, 0x2a, 0x83, + 0x66, 0xa1, 0xb8, 0xd3, 0x38, 0x78, 0xbc, 0x57, 0x7f, 0x6e, 0xd4, 0x2a, 0xd3, 0xb4, 0x00, 0x1b, + 0xb5, 0xc3, 0x5a, 0xb3, 0x92, 0x45, 0x33, 0x50, 0xa8, 0x37, 0x5e, 0xf3, 0x72, 0x9c, 0xc3, 0x27, + 0x70, 0x25, 0xe9, 0x30, 0xd4, 0xb6, 0x71, 0x75, 0x82, 0x7b, 0x2c, 0xa3, 0xde, 0x63, 0x49, 0x77, + 0xcf, 0x74, 0xf2, 0xdd, 0x83, 0x7f, 0xa9, 0x81, 0xbe, 0xef, 0xb4, 0x7b, 0x9d, 0xb3, 0x0b, 0x59, + 0x0f, 0x9c, 0x01, 0x71, 0x4d, 0xbf, 0xe7, 0xd8, 0x32, 0xde, 0x57, 0x93, 0x3d, 0xdb, 0x90, 0x74, + 0x86, 0xc2, 0x82, 0x6e, 0x41, 0xd9, 0x25, 0x2d, 0xc7, 0xee, 0xf4, 0x8e, 0x87, 0x2e, 0xd9, 0xb2, + 0x2c, 0x76, 0xae, 0x82, 0x11, 0xc3, 0xe2, 0x5f, 0x6b, 0xb0, 0x98, 0x24, 0x0c, 0x3d, 0x10, 0xfe, + 0xe3, 0xfd, 0xd5, 0xad, 0x73, 0xf6, 0x8e, 0xb8, 0x8e, 0x5f, 0xd7, 0x16, 0x2f, 0xac, 0x19, 0x79, + 0x5d, 0x73, 0x18, 0xdf, 0x4b, 0x70, 0xeb, 0x1c, 0x94, 0x8c, 0xda, 0x7e, 0xe3, 0x45, 0xed, 0xb5, + 0xd1, 0x78, 0x4a, 0x3d, 0x36, 0x03, 0x85, 0xad, 0xdd, 0x5d, 0x0e, 0x65, 0xf1, 0x4f, 0x35, 0x58, + 0x4a, 0xb0, 0x1c, 0x75, 0xd3, 0x77, 0xa0, 0xd2, 0x31, 0x7b, 0x16, 0x69, 0x37, 0x42, 0x6b, 0x69, + 0x17, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x66, 0xdc, 0xe7, 0x6a, 0xed, 0xc2, 0x3f, 0x82, 0xe5, + 0x5d, 0xe2, 0xf9, 0xae, 0x73, 0x11, 0x3f, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0x2b, 0x76, + 0x19, 0xe6, 0x81, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, + 0x76, 0xcf, 0x3e, 0x3e, 0x0c, 0xb6, 0x2b, 0x18, 0x49, 0x4b, 0x98, 0xc0, 0x95, 0xa4, 0xcd, 0xa9, + 0x29, 0xbe, 0x0d, 0xf3, 0x2d, 0x8b, 0x98, 0xf6, 0x90, 0x0b, 0x67, 0x48, 0x71, 0x27, 0x5c, 0x53, + 0xb3, 0x2f, 0x4e, 0x63, 0x8c, 0xb3, 0xe1, 0x3f, 0x6b, 0xb0, 0x7a, 0x18, 0xb9, 0x71, 0x9e, 0xb9, + 0x34, 0xb8, 0xfc, 0x1e, 0xf1, 0xd2, 0x54, 0x7d, 0x05, 0x30, 0x08, 0x88, 0x44, 0xc8, 0x3e, 0x50, + 0x0b, 0xfb, 0x64, 0x79, 0x1b, 0x21, 0x86, 0x5f, 0xd9, 0x8a, 0xb4, 0xea, 0x43, 0x98, 0x8b, 0x2d, + 0xbf, 0xd7, 0xf5, 0xbd, 0x0a, 0xd7, 0xd3, 0x77, 0xa7, 0xfa, 0x7a, 0xb0, 0x5a, 0x7f, 0x4f, 0x75, + 0x75, 0xc8, 0xbf, 0x19, 0x12, 0x57, 0xea, 0x5a, 0x34, 0x24, 0x48, 0x53, 0x8f, 0xbc, 0x6d, 0x59, + 0xc3, 0x36, 0xa9, 0x5b, 0xce, 0x91, 0x69, 0x79, 0x32, 0xf5, 0xa2, 0x58, 0xfc, 0x3b, 0x0d, 0xae, + 0xd7, 0x27, 0x1d, 0x0b, 0x7d, 0x2f, 0x62, 0x52, 0x1e, 0xd7, 0xf7, 0x15, 0x93, 0x4e, 0xe4, 0xfe, + 0x3a, 0x0d, 0xfa, 0x4f, 0x0d, 0x66, 0x23, 0x8d, 0x1a, 0x42, 0x90, 0xb5, 0x69, 0xba, 0x73, 0x76, + 0xf6, 0x9b, 0xb6, 0xbf, 0x96, 0xd3, 0x3a, 0x21, 0x6d, 0x11, 0xf9, 0x02, 0xa2, 0x78, 0xda, 0xd6, + 0xed, 0xb5, 0x45, 0x62, 0x09, 0x88, 0xe2, 0xf9, 0xab, 0x4f, 0xb4, 0xf2, 0x02, 0x0a, 0xf3, 0x30, + 0xa7, 0xde, 0xbd, 0xd7, 0xa0, 0xd8, 0xb2, 0x4c, 0xcf, 0x53, 0xda, 0xf7, 0x10, 0x81, 0x6a, 0x50, + 0x6e, 0x93, 0x81, 0xe5, 0x9c, 0xc9, 0xe2, 0x27, 0x5a, 0x78, 0xf5, 0xa1, 0x48, 0x0f, 0xbf, 0x1b, + 0x21, 0x32, 0x62, 0x4c, 0xb4, 0xf4, 0xa2, 0x71, 0x32, 0x7a, 0xc1, 0xd1, 0xb7, 0x84, 0xa2, 0x71, + 0x00, 0xd3, 0xc0, 0x30, 0x8f, 0x29, 0xa1, 0xbc, 0x4a, 0x24, 0x48, 0x57, 0x9c, 0x4e, 0x87, 0xb8, + 0x81, 0xe2, 0x12, 0xa4, 0xaf, 0x15, 0xf2, 0x96, 0xb4, 0x86, 0xbe, 0x43, 0x17, 0xb9, 0xf6, 0x0a, + 0x06, 0xcf, 0xc3, 0x5c, 0x9d, 0xf8, 0x22, 0x41, 0xf9, 0xc3, 0xe0, 0x11, 0xcc, 0x86, 0x28, 0x1a, + 0x2c, 0x41, 0x4f, 0xad, 0x5d, 0xa8, 0xa7, 0xc6, 0xeb, 0x50, 0x16, 0x02, 0x94, 0xe7, 0x8a, 0xf0, + 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x33, 0x01, 0x25, 0xdd, 0xe9, 0x03, 0xc8, 0xd2, 0x15, 0x71, + 0xb9, 0x2c, 0xc4, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x06, 0xb3, 0x14, 0xb3, 0x43, 0xbd, 0x92, + 0x1a, 0x25, 0xf4, 0x0d, 0xc1, 0xd9, 0xf7, 0x9d, 0x36, 0x09, 0xde, 0x10, 0x21, 0x0a, 0xff, 0x18, + 0x4a, 0x3b, 0x4e, 0xbf, 0x6f, 0xda, 0x6d, 0x26, 0xa4, 0x02, 0xd3, 0xc4, 0x1e, 0x31, 0x35, 0x8b, + 0x06, 0xfd, 0xc9, 0x02, 0xa4, 0x4b, 0x2c, 0x4b, 0xc4, 0x19, 0x07, 0xc2, 0xf0, 0x9d, 0x56, 0xc2, + 0x97, 0x86, 0x8d, 0xe9, 0x1e, 0x0f, 0xf9, 0x9b, 0x28, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, + 0x66, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x3e, 0x94, 0x76, 0xba, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, + 0xa4, 0x34, 0x3b, 0x45, 0x51, 0x04, 0x99, 0x35, 0xdd, 0x63, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, + 0xaf, 0x69, 0x28, 0x04, 0x69, 0xf3, 0x0d, 0x28, 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, + 0x1d, 0x17, 0x92, 0x52, 0xbe, 0x96, 0xb4, 0xaa, 0xe8, 0xde, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, + 0x21, 0x29, 0xfa, 0x16, 0xcc, 0xf5, 0xec, 0x23, 0x67, 0x68, 0xb7, 0x85, 0x4a, 0xf4, 0x72, 0xa2, + 0xe1, 0xb2, 0xa4, 0x96, 0x88, 0x50, 0x5b, 0x23, 0x4e, 0x8e, 0xb6, 0xa1, 0xe2, 0x0c, 0xfd, 0xa8, + 0x88, 0xec, 0x44, 0x11, 0x63, 0xf4, 0xe8, 0x3e, 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, + 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, 0x3d, 0x33, 0xfd, 0xae, 0xc8, 0xf9, 0x00, 0xa6, + 0xfe, 0x26, 0xf6, 0x68, 0xaf, 0xcd, 0x32, 0xbd, 0x68, 0x70, 0x00, 0xed, 0x44, 0xee, 0x50, 0xfe, + 0xe8, 0xfa, 0xbf, 0x84, 0x90, 0xfd, 0x3a, 0xaf, 0xcb, 0xbb, 0xb0, 0x10, 0x2d, 0xbb, 0x3c, 0xdf, + 0x74, 0xc8, 0xf3, 0x0c, 0xf3, 0x44, 0x30, 0x4b, 0x10, 0xff, 0x4c, 0x83, 0xf9, 0xb1, 0x42, 0x8d, + 0x1e, 0x40, 0xe9, 0xa4, 0x67, 0x59, 0xa4, 0xdd, 0xbc, 0x50, 0x9e, 0xab, 0xc4, 0xe8, 0x0b, 0x98, + 0x71, 0x79, 0x23, 0x21, 0x7b, 0x91, 0xc9, 0xcc, 0x11, 0x6a, 0xbc, 0xc3, 0xee, 0x1f, 0xfa, 0x26, + 0x08, 0x0e, 0x1f, 0x58, 0x5b, 0x53, 0xad, 0x5d, 0x85, 0xc2, 0xc0, 0xf4, 0xbb, 0x87, 0x03, 0xd2, + 0x92, 0x9d, 0x9f, 0x84, 0xf1, 0x2f, 0xb2, 0x50, 0x90, 0xcf, 0x8a, 0xb4, 0x7a, 0x21, 0xee, 0xff, + 0x4c, 0xf2, 0xfd, 0x1f, 0x99, 0x21, 0x54, 0xa1, 0xd0, 0x19, 0x5a, 0x16, 0x0b, 0x05, 0x7e, 0x63, + 0x06, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, 0xe8, 0x36, 0xe4, 0x68, 0x2b, 0xea, 0xe9, 0x97, 0x98, + 0x01, 0x12, 0x9f, 0x3c, 0x9c, 0x02, 0x3d, 0x1c, 0x1b, 0x16, 0xdc, 0x48, 0xa0, 0x4e, 0x9d, 0x12, + 0xdc, 0x8b, 0x4c, 0x09, 0xae, 0x27, 0xb1, 0xc6, 0xc7, 0x03, 0x0f, 0xc7, 0xc6, 0x03, 0x89, 0x3b, + 0xfe, 0x0f, 0xcd, 0x05, 0x1e, 0xb0, 0x2a, 0x26, 0x02, 0x8b, 0xc6, 0x78, 0xe0, 0x1f, 0xed, 0x3c, + 0xff, 0xe0, 0xdf, 0x6a, 0x70, 0xb5, 0x4e, 0xfc, 0x97, 0xb1, 0x29, 0x41, 0x10, 0xa1, 0x6b, 0x50, + 0x72, 0xc9, 0xc0, 0x79, 0x66, 0xfa, 0x3e, 0x71, 0xe5, 0x08, 0x4e, 0x45, 0xa1, 0x75, 0x98, 0x73, + 0xc9, 0xa8, 0xe7, 0xf5, 0x1c, 0x5b, 0x52, 0xf1, 0x13, 0xc6, 0xd1, 0x54, 0x96, 0x69, 0x59, 0xdb, + 0xae, 0x69, 0xb7, 0xba, 0x44, 0x36, 0x74, 0x2a, 0x8a, 0x95, 0x7d, 0xcb, 0x6a, 0x9a, 0xc7, 0xbc, + 0x7b, 0x29, 0x18, 0x12, 0xc4, 0x47, 0xb0, 0x18, 0x3f, 0xa3, 0x4c, 0x01, 0x7a, 0x18, 0x99, 0x02, + 0xf4, 0x37, 0xbb, 0xdf, 0xe4, 0x14, 0x44, 0xe4, 0x8f, 0x84, 0xd9, 0xab, 0x4a, 0x1c, 0x4b, 0x64, + 0x42, 0x00, 0xe3, 0xaf, 0x60, 0x39, 0xd9, 0x14, 0xd4, 0xa6, 0xfb, 0x30, 0x1f, 0x1f, 0xa5, 0x24, + 0xbd, 0x92, 0x92, 0x0e, 0x69, 0x8c, 0x73, 0x62, 0x04, 0x95, 0xa7, 0x3d, 0x8f, 0xbe, 0x3a, 0x1c, + 0xe5, 0x1b, 0x40, 0x81, 0xc2, 0xa9, 0xa9, 0xad, 0x43, 0x5e, 0x24, 0x86, 0xa8, 0xd1, 0x12, 0xa4, + 0x3e, 0x10, 0x3f, 0x8d, 0xa8, 0x72, 0x71, 0x34, 0x7e, 0x03, 0x65, 0x65, 0x5f, 0x19, 0x2c, 0x14, + 0x4a, 0x0a, 0x16, 0x71, 0x1a, 0x83, 0x53, 0xa0, 0x4f, 0xe1, 0xf2, 0x31, 0xeb, 0xbb, 0x77, 0x63, + 0x9b, 0x71, 0x2b, 0x27, 0x2f, 0xe2, 0x03, 0x28, 0x6f, 0xb5, 0xdb, 0x54, 0x96, 0x0c, 0xaa, 0x24, + 0xe5, 0x12, 0x54, 0xc8, 0x24, 0xab, 0x60, 0xc0, 0x4c, 0x20, 0x8f, 0xf7, 0x6c, 0xc8, 0x26, 0xa7, + 0xf1, 0x23, 0x71, 0xd9, 0x09, 0x2b, 0x74, 0xf7, 0x9e, 0xac, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, + 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0xd4, 0x63, 0x2e, 0x42, 0xae, 0x67, 0xb7, 0xc9, 0x5b, 0xf9, + 0xe1, 0x80, 0x01, 0xf8, 0x9b, 0x30, 0xa7, 0x92, 0xd2, 0x13, 0xdc, 0x82, 0xb2, 0xba, 0x4f, 0x10, + 0x8e, 0x31, 0x2c, 0xfe, 0x10, 0x16, 0x0c, 0xd2, 0x71, 0x89, 0xd7, 0x55, 0xfd, 0x9e, 0xb2, 0xcf, + 0xff, 0xc3, 0xe5, 0x43, 0xe2, 0x2b, 0xec, 0x93, 0xc9, 0x1f, 0xb2, 0xc7, 0x66, 0x3d, 0xc9, 0x03, + 0x92, 0x51, 0x8d, 0x7d, 0x2d, 0x16, 0xfb, 0xdf, 0x65, 0xaf, 0x3b, 0xba, 0x4d, 0x0a, 0x73, 0xe2, + 0xae, 0x11, 0x91, 0x99, 0x98, 0xc8, 0x7b, 0x70, 0x35, 0x4d, 0x24, 0x35, 0x9a, 0x74, 0x83, 0xa6, + 0xb8, 0x21, 0x0f, 0xb9, 0x5a, 0x7f, 0xe0, 0x9f, 0x6d, 0xfe, 0x61, 0x16, 0xf2, 0x62, 0xaa, 0x84, + 0x76, 0xa0, 0xd4, 0x74, 0xcd, 0xd6, 0x09, 0xff, 0x24, 0x85, 0xf4, 0xb1, 0xaf, 0x54, 0xe2, 0x88, + 0xd5, 0xa5, 0x84, 0x15, 0xfa, 0x30, 0x9d, 0xfa, 0x58, 0x43, 0xaf, 0xa0, 0x12, 0xff, 0xd2, 0x82, + 0x70, 0xf4, 0x15, 0x98, 0xf4, 0x21, 0xa9, 0xba, 0x36, 0x91, 0x86, 0x49, 0x47, 0xdb, 0x50, 0x90, + 0x5f, 0x22, 0x90, 0x3a, 0x39, 0x8c, 0x7d, 0xc9, 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x4b, 0xd6, + 0x1c, 0xa8, 0x9f, 0x28, 0xd0, 0x8d, 0xd4, 0x47, 0x6a, 0xa0, 0xf1, 0xea, 0x24, 0x12, 0x2e, 0xb8, + 0x09, 0xe5, 0xe8, 0xd4, 0x15, 0xad, 0x9d, 0x37, 0xf2, 0xad, 0xae, 0x4c, 0xa0, 0x08, 0xa4, 0x46, + 0xf7, 0x43, 0x6b, 0xa9, 0x47, 0x49, 0x92, 0x9a, 0x30, 0x89, 0xc5, 0x53, 0xe8, 0x87, 0x80, 0xc6, + 0x47, 0x89, 0xe8, 0xe6, 0x45, 0xc6, 0x9e, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x07, 0x30, 0x3f, + 0x36, 0x04, 0x43, 0x6a, 0x27, 0x9b, 0x36, 0x5c, 0xac, 0xde, 0x98, 0x4c, 0x14, 0x28, 0x30, 0x3e, + 0x59, 0x8a, 0x28, 0x90, 0x3a, 0xf5, 0x8a, 0x28, 0x90, 0x32, 0x9e, 0xe2, 0xb1, 0x26, 0x5f, 0xac, + 0x91, 0x58, 0x8b, 0xbd, 0x6c, 0x23, 0xb1, 0x16, 0x79, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, + 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x8d, 0x35, + 0x5a, 0x49, 0x1d, 0x8d, 0x71, 0x51, 0x13, 0x47, 0x67, 0x81, 0x52, 0xac, 0x81, 0x89, 0x2b, 0xa5, + 0xb6, 0xcb, 0x71, 0xa5, 0xc2, 0x8e, 0x07, 0x4f, 0xa1, 0x0e, 0xfb, 0xc6, 0x37, 0x56, 0xbc, 0xd1, + 0xad, 0x28, 0x4f, 0x5a, 0xa3, 0x53, 0xbd, 0x79, 0x2e, 0x1d, 0xdf, 0xa7, 0x06, 0xc5, 0xa0, 0x80, + 0xa2, 0xab, 0x0a, 0x53, 0xbc, 0x9c, 0x57, 0x97, 0x93, 0x17, 0x03, 0x1f, 0x88, 0x22, 0x16, 0xf1, + 0x41, 0xb4, 0x50, 0x46, 0x7c, 0xa0, 0xd6, 0x3c, 0x3c, 0x85, 0x9e, 0x00, 0x84, 0x65, 0x08, 0x5d, + 0x8b, 0x54, 0xed, 0x58, 0x21, 0xab, 0x56, 0x53, 0x56, 0xa5, 0xf5, 0x67, 0xd4, 0xaa, 0x14, 0xf1, + 0x66, 0x42, 0xb9, 0xaa, 0x56, 0xd4, 0xa1, 0x30, 0xbd, 0xad, 0xf1, 0x14, 0x7a, 0x0c, 0xe5, 0x68, + 0xb1, 0x8a, 0xdc, 0x07, 0x89, 0x75, 0x2c, 0x51, 0xce, 0x2b, 0xd0, 0xd3, 0xaa, 0x18, 0xba, 0x13, + 0x95, 0x38, 0xa9, 0xd4, 0x25, 0xca, 0xb6, 0x60, 0x29, 0xb9, 0x1e, 0xa1, 0xf5, 0xa8, 0xe4, 0xf4, + 0x2a, 0x58, 0xbd, 0x75, 0x01, 0x4a, 0x66, 0xd5, 0xed, 0xfb, 0x7f, 0x7c, 0xb7, 0xa2, 0xfd, 0xed, + 0xdd, 0x8a, 0xf6, 0xf7, 0x77, 0x2b, 0xda, 0xaf, 0xfe, 0xb1, 0x32, 0x05, 0xb8, 0xd5, 0xdd, 0x68, + 0x11, 0xd7, 0xde, 0x30, 0xad, 0x5e, 0x8b, 0x6c, 0x38, 0x9b, 0x1b, 0x52, 0x92, 0x3b, 0x68, 0x79, + 0xc4, 0x1d, 0x11, 0xf7, 0x55, 0x66, 0x70, 0x74, 0x74, 0x89, 0xfd, 0x8b, 0xe4, 0x93, 0x7f, 0x07, + 0x00, 0x00, 0xff, 0xff, 0x9e, 0xa5, 0x0f, 0x75, 0x5f, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5573,6 +5582,16 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.AllowInRunningState { + i-- + if m.AllowInRunningState { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } if m.KeepTasks { i-- if m.KeepTasks { @@ -7796,6 +7815,9 @@ func (m *DestroyEnvironmentRequest) Size() (n int) { if m.KeepTasks { n += 2 } + if m.AllowInRunningState { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -11603,6 +11625,26 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } } m.KeepTasks = bool(v != 0) + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.AllowInRunningState = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 394c21e1e..998a671ee 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -195,6 +195,7 @@ message ModifyEnvironmentReply { message DestroyEnvironmentRequest { string id = 1; bool keepTasks = 2; + bool allowInRunningState = 3; } message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; diff --git a/core/server.go b/core/server.go index e01e45ae5..be07599c7 100644 --- a/core/server.go +++ b/core/server.go @@ -299,8 +299,16 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } - statesForDestroy := [...]string{"CONFIGURED", "STANDBY"} + if req.AllowInRunningState && env.CurrentState() == "RUNNING" { + err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_CONFIGURE)) + if err != nil { + return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() + } + } + canDestroy := false + statesForDestroy := []string{"CONFIGURED", "STANDBY"} + for _, v := range statesForDestroy { if env.CurrentState() == v { canDestroy = true @@ -308,7 +316,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } } - if !canDestroy { + if !canDestroy { return nil, status.Newf(codes.FailedPrecondition, "cannot destroy environment in state %s", env.CurrentState()).Err() } @@ -429,7 +437,6 @@ func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.Shor return } - func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb.GetRolesReply, error) { m.logMethod() m.state.RLock() From 08d1b371f37c746d02b8cbfae3cf96ef3860887c Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 6 Mar 2020 16:00:08 +0100 Subject: [PATCH 0149/2352] [OCTRL-206] Remove extra white space --- core/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index be07599c7..099912414 100644 --- a/core/server.go +++ b/core/server.go @@ -316,7 +316,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } } - if !canDestroy { + if !canDestroy { return nil, status.Newf(codes.FailedPrecondition, "cannot destroy environment in state %s", env.CurrentState()).Err() } From 7ff3fd392d9818e0ae3b8ae030aaa7f6160548b3 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 6 Mar 2020 16:49:13 +0100 Subject: [PATCH 0150/2352] [OCTRL-206] Use correct command --- core/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 099912414..4325eeabc 100644 --- a/core/server.go +++ b/core/server.go @@ -300,7 +300,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } if req.AllowInRunningState && env.CurrentState() == "RUNNING" { - err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_CONFIGURE)) + err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) if err != nil { return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() } From ecde844c2f48be1625e7d94f9ec5069cdf2665ce Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 9 Mar 2020 15:26:06 +0100 Subject: [PATCH 0151/2352] [build] Update go.sum --- go.sum | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/go.sum b/go.sum index b3eab2014..7c78f7728 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.18+incompatible h1:Zz1aXgDrFFi1nadh58tA9ktt06cmPTwNNP3dXwIq1lE= github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= @@ -353,6 +351,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sanity-io/litter v1.1.0 h1:BllcKWa3VbZmOZbDCoszYLk7zCsKHz5Beossi8SUcTc= github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -476,8 +475,6 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smto golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -507,10 +504,6 @@ golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9 h1:N19i1HjUnR7TF7rMt8O4p3dLvqvmYyzB6ifMFmrbY50= -golang.org/x/sys v0.0.0-20200121082415-34d275377bf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82 h1:ywK/j/KkyTHcdyYSZNXGjMwgmDSfjglYZ3vStQ/gSCU= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -541,10 +534,6 @@ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoA google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24 h1:wDju+RU97qa0FZT0QnZDg9Uc2dH0Ql513kFvHocz+WM= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150 h1:VPpdpQkGvFicX9yo4G5oxZPi9ALBnEOZblPSa/Wa2m4= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898 h1:bKX1IGaSj2XD9yfWNts9HKRdQRH0lOZ0S7Nb8meQSlY= google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -552,8 +541,6 @@ google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= From 3499ce2e88c397fba484a25cc2d74dcefd367d4a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 12:17:59 +0100 Subject: [PATCH 0152/2352] [core] FIXME cleanup --- core/task/task.go | 3 --- core/workflow/aggregatortemplate.go | 1 - core/workflow/rolebase.go | 2 +- core/workflow/tasktemplate.go | 2 +- 4 files changed, 2 insertions(+), 6 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 8b57bdeb5..f1a6d372b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -281,9 +281,6 @@ func (t *Task) GetBindPorts() map[string]uint64 { } func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { - //parentMap := t.parent.GetPropertyMap() - //FIXME support parent properties - propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task, we template the props diff --git a/core/workflow/aggregatortemplate.go b/core/workflow/aggregatortemplate.go index 910ca465a..8c582a63a 100644 --- a/core/workflow/aggregatortemplate.go +++ b/core/workflow/aggregatortemplate.go @@ -81,7 +81,6 @@ func (at *aggregatorTemplate) generateRole(localVars map[string]string) (c Role, return nil, errors.New("cannot generate from nil sender") } - // NOTE: // aggregatorTemplate.UnmarshalYAML exists, and it fills out at.stringTemplates. // at.stringTemplates contains cached compiled text/template.Template instances: // these will generate strings for us on request. diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 15890a688..d896d17f7 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -63,7 +63,7 @@ type roleBase struct { } func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error) { - // FIXME: this function is not used any more + // This function is used in task.go to get the parent role's varStack var defaults, vars, userVars map[string]string defaults, err = r.Defaults.Flattened() if err != nil { diff --git a/core/workflow/tasktemplate.go b/core/workflow/tasktemplate.go index 99ad8dcfc..5fdeced84 100644 --- a/core/workflow/tasktemplate.go +++ b/core/workflow/tasktemplate.go @@ -78,7 +78,7 @@ func (tt *taskTemplate) generateRole(localVars map[string]string) (c Role, err e return nil, errors.New("cannot generate from nil sender") } - // See NOTE for aggregatorTemplate.generateRole + // See note for aggregatorTemplate.generateRole tr := *tt.taskRole.copy().(*taskRole) for k, v := range localVars { tr.Locals[k] = v From cf3eda73fef113d06b66886645b2e52b9da0f0aa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 12:18:19 +0100 Subject: [PATCH 0153/2352] [executor] Make incoming MESSAGE handling concurrent OCTRL-204 #close --- executor/handlers.go | 79 ++++++++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 36 deletions(-) diff --git a/executor/handlers.go b/executor/handlers.go index 11d0346fc..8f5ee50a0 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -134,44 +134,51 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { return } - var cmd *executorcmd.ExecutorCommand_Transition - cmd, err = state.activeTasks[taskId].UnmarshalTransition(data) - if err != nil { + // Unmarshal and perform transition asynchronously. + // This is not thread-safe but we don't expect the core to spam + // transition requests with no regard for MESSAGEs back. + // If we don't do this, we get a choke point (OCTRL-204) + go func() { + var cmd *executorcmd.ExecutorCommand_Transition + cmd, err = activeTask.UnmarshalTransition(data) + if err != nil { + log.WithFields(logrus.Fields{ + "name": cmd.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("cannot unmarshal incoming MESSAGE") + return + } + + if cmd.Event == "CONFIGURE" { + log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") + } + + response := activeTask.Transition(cmd) + + data, marshalError := json.Marshal(response) + if marshalError != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + return + } + + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) log.WithFields(logrus.Fields{ - "name": cmd.Name, - "message": string(data[:]), - "error": err.Error(), - }). - Error("cannot unmarshal incoming MESSAGE") - return - } - - if cmd.Event == "CONFIGURE" { - log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") - } - - response := state.activeTasks[taskId].Transition(cmd) - - data, marshalError := json.Marshal(response) - if marshalError != nil { - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "marshalError": marshalError, - }). - Error("cannot marshal MesosCommandResponse for sending as MESSAGE") - return marshalError - } + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "state": response.CurrentState, + }). + Debug("response sent") + }() - _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "state": response.CurrentState, - }). - Debug("response sent") default: err = errors.New(fmt.Sprintf("unrecognized controlcommand %s", incoming.Name)) From 584cb8d841be0cea17418d8f2e882612c8836fa8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 14:32:14 +0100 Subject: [PATCH 0154/2352] [core] Move NewUnixTimestamp to common/utils --- common/logger/infologger/directhook.go | 8 ++------ common/utils/utils.go | 7 +++++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 7014144ca..f4dfba24f 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -34,8 +34,8 @@ import ( "sort" "strconv" "strings" - "time" + "github.com/AliceO2Group/Control/common/utils" "github.com/sirupsen/logrus" ) @@ -62,10 +62,6 @@ func init() { hostname = strings.Split(hostname, ".")[0] } -func newUnixTimestamp() string { - return fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) -} - type sender struct { stream net.Conn } @@ -164,7 +160,7 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { // Filled automatically by InfoLogger, do not set: PID, hostName, userName payload := make(map[string]string) payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) - payload["timestamp"] = newUnixTimestamp() + payload["timestamp"] = utils.NewUnixTimestamp() payload["hostname"] = hostname payload["pid"] = pid payload["username"] = username diff --git a/common/utils/utils.go b/common/utils/utils.go index f8a4a996f..db8bacde7 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -25,11 +25,18 @@ package utils import ( + "fmt" "io" "os" "strings" + "time" ) +func NewUnixTimestamp() string { + // User for IL direct hook and scheduler.go + return fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) +} + func IsDirEmpty(path string) (bool, error) { dir, err := os.Open(path) if err != nil { From deab9a882f94e19e264836f812736e33b595fdb8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 14:40:33 +0100 Subject: [PATCH 0155/2352] [executor] Ensure correct log level for task stdout/stderr --- executor/executable/basictask.go | 4 ++-- executor/executable/controllabletask.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 881c48a21..ef2fada38 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -59,8 +59,8 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { var errStdout, errStderr error var stdoutBuf, stderrBuf bytes.Buffer - stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).Writer() - stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).Writer() + stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) + stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel) // Each of these multiwriters will push incoming lines to a buffer as well as the logger stdout := io.MultiWriter(stdoutLog, &stdoutBuf) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 5cef7f216..0b3fa442f 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -80,7 +80,7 @@ func (t *ControllableTask) Launch() error { _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stderrIn) + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel), stderrIn) }() log.WithFields(logrus.Fields{ From 005264eec1e446a0607bee06cd8d4e223f4d3a62 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 14:41:14 +0100 Subject: [PATCH 0156/2352] [core] Facilities for pushing runtime variables back up the stack --- core/workflow/iteratorrole.go | 14 ++++++++++++++ core/workflow/role.go | 2 ++ core/workflow/rolebase.go | 10 ++++++++++ 3 files changed, 26 insertions(+) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 82cb8852b..56b6c8204 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -254,3 +254,17 @@ func (i *iteratorRole) GetUserVars() gera.StringMap { } return i.template.GetUserVars() } + +func (i *iteratorRole) SetRuntimeVar(key string, value string) { + if i == nil { + return + } + i.template.SetRuntimeVar(key, value) +} + +func (i *iteratorRole) SetRuntimeVars(kv map[string]string) { + if i == nil { + return + } + i.template.SetRuntimeVars(kv) +} diff --git a/core/workflow/role.go b/core/workflow/role.go index 375bfa4f0..4380a4a78 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -55,6 +55,8 @@ type Role interface { setParent(role Updatable) ProcessTemplates(workflowRepo *repos.Repo) error GlobFilter(g glob.Glob) []Role + SetRuntimeVar(key string, value string) + SetRuntimeVars(kv map[string]string) } type Updatable interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index d896d17f7..418dbf046 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -62,6 +62,16 @@ type roleBase struct { Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role } +func (r *roleBase) SetRuntimeVar(key string, value string) { + r.UserVars.Set(key, value) +} + +func (r *roleBase) SetRuntimeVars(kv map[string]string) { + for k, v := range kv { + r.UserVars.Set(k, v) + } +} + func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error) { // This function is used in task.go to get the parent role's varStack var defaults, vars, userVars map[string]string From ee07c38ddf437e728700dfe1165bb2d89b243580 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 14:41:56 +0100 Subject: [PATCH 0157/2352] [core] Propagate task result to parent taskRole --- core/scheduler.go | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index c63c8ac15..eaa953ec7 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -33,6 +33,8 @@ import ( "errors" "fmt" "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/core/workflow" "github.com/spf13/viper" "io" "strconv" @@ -348,10 +350,29 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { "finalMesosState": btt.FinalMesosState.String(), }). Info("basic task terminated") + + // Propagate this information to the task/role + taskId := evt.GetOrigin().TaskId + t := state.taskman.GetTask(taskId.Value) + if t != nil { + if parentRole, ok := t.GetParentRole().(workflow.Role); ok { + parentRole.SetRuntimeVars(map[string]string{ + "taskResult.exitCode": strconv.Itoa(btt.ExitCode), + "taskResult.stdout": btt.Stdout, + "taskResult.stderr": btt.Stderr, + "taskResult.finalStatus": btt.FinalMesosState.String(), + "taskResult.timestamp": utils.NewUnixTimestamp(), + }) + } else { + log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") + } + } else { + log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + } + if btt.VoluntaryTermination { goto doFallthrough } - // FIXME: handle propagation of exit code, final state, std{err,out} } return doFallthrough: @@ -360,7 +381,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { taskId := evt.GetOrigin().TaskId t := state.taskman.GetTask(taskId.Value) if t == nil { - log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent") + log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent END_OF_STREAM") return } env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) From 7043748db8b9ec3c06677f2a558b96bee2d5a553 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 15:01:13 +0100 Subject: [PATCH 0158/2352] [core] Suppress periodic output unless veryVerbose=true --- core/scheduler.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index eaa953ec7..265f97f29 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -787,13 +787,13 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl if viper.GetBool("summaryMetrics") { state.metricsAPI.launchesPerOfferCycle(float64(tasksLaunchedThisCycle)) } - var msg string if tasksLaunchedThisCycle == 0 { - msg = "offers cycle complete, no tasks launched" + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler").Debug("offers cycle complete, no tasks launched") + } } else { - msg = "offers cycle complete, tasks launched" + log.WithPrefix("scheduler").WithField("tasks", tasksLaunchedThisCycle).Debug("offers cycle complete, tasks launched") } - log.WithPrefix("scheduler").WithField("tasks", tasksLaunchedThisCycle).Debug(msg) return nil } } From 287b16be230a0758868719975d695109ce838afd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 15:45:29 +0100 Subject: [PATCH 0159/2352] [coconut] Add root role column in coconut env list --- coconut/control/control.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index c4dcc22d6..db71e689a 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -146,15 +146,15 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com fmt.Fprintln(o, "no environments running") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "created", "state"}) + table.SetHeader([]string{"id", "root role", "created", "state"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgYellowColor} - table.SetHeaderColor(fg, fg, fg) + table.SetHeaderColor(fg, fg, fg, fg) data := make([][]string, 0, 0) for _, envi := range response.GetEnvironments() { formatted := formatTimestamp(envi.GetCreatedWhen()) - data = append(data, []string{envi.GetId(), formatted, colorState(envi.GetState())}) + data = append(data, []string{envi.GetId(), envi.GetRootRole(), formatted, colorState(envi.GetState())}) } table.AppendBulk(data) From df28fff0cf2f3af30575cf66dca5faf7609670bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 15:56:00 +0100 Subject: [PATCH 0160/2352] [coconut] Sort printed maps by key --- coconut/control/control.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index db71e689a..32098e4fe 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -34,6 +34,7 @@ import ( "io" "os" "regexp" + "sort" "strconv" "strings" "time" @@ -221,7 +222,7 @@ func stringMapToString(stringMap map[string]string, indent string) string { if len(stringMap) == 0 { return "" } - accumulator := make([]string, len(stringMap)) + accumulator := make(sort.StringSlice, len(stringMap)) i := 0 for k, v := range stringMap { value := v @@ -231,6 +232,7 @@ func stringMapToString(stringMap map[string]string, indent string) string { accumulator[i] = indent + k + ": " + value i++ } + accumulator.Sort() return strings.Join(accumulator, "\n") } From 448b70e451865c4924ec9f05b74fd72e03e22e26 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Mar 2020 16:18:04 +0100 Subject: [PATCH 0161/2352] [core] Include task class defaults in varStack for TaskCommandInfo --- core/task/task.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/task/task.go b/core/task/task.go index f1a6d372b..b21e0880f 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -173,6 +173,12 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { log.WithError(err).Error("cannot fetch variables stack for task command info") return } + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) + if err != nil { + log.WithError(err).Error("cannot fetch task class defaults for task command info") + return + } + fields := append( template.Fields{ template.WrapPointer(cmd.Value), From 4a0642068e3407bb6cdb45c8218b8f9e1573be8f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Mar 2020 10:09:45 +0100 Subject: [PATCH 0162/2352] [build] Bump to v0.12.90 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 849747de5..4e153dcda 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,5 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 12 -VERSION_PATCH := 2 +VERSION_PATCH := 90 From 7a1bf9c15c5c98f4daa2b634ac8072cb7e855b95 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Mar 2020 15:33:54 +0100 Subject: [PATCH 0163/2352] [occ] Reduce log verbosity --- occ/occlib/OccInstance.cxx | 12 ++--- occ/occlib/OccServer.cxx | 25 +++-------- occ/occlib/RuntimeControlledObject.cxx | 1 - occ/occlib/examples/dummy-process/main.cxx | 1 - occ/plugin/OccPlugin.cxx | 6 +-- occ/plugin/OccPluginServer.cxx | 51 +++++----------------- 6 files changed, 26 insertions(+), 70 deletions(-) diff --git a/occ/occlib/OccInstance.cxx b/occ/occlib/OccInstance.cxx index d30953cdf..26c4b97d3 100644 --- a/occ/occlib/OccInstance.cxx +++ b/occ/occlib/OccInstance.cxx @@ -40,7 +40,7 @@ OccInstance::OccInstance(RuntimeControlledObject *rco, int controlPort, std::str } else { controlPort = OCC_DEFAULT_PORT; - std::cout << "no control port configured, defaulting to " << OCC_DEFAULT_PORT << std::endl; + std::cout << "[OCC] no control port configured, defaulting to " << OCC_DEFAULT_PORT << std::endl; } } @@ -49,7 +49,7 @@ OccInstance::OccInstance(RuntimeControlledObject *rco, int controlPort, std::str role = std::string(env_role); } else { role = OCC_DEFAULT_ROLE; - std::cout << "no role configured, defaulting to " << OCC_DEFAULT_ROLE << std::endl; + std::cout << "[OCC] no role configured, defaulting to " << OCC_DEFAULT_ROLE << std::endl; } } @@ -92,14 +92,14 @@ void OccInstance::runServer(RuntimeControlledObject *rco, int controlPort, const builder.AddListeningPort(serverAddress, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr server(builder.BuildAndStart()); - std::cout << "gRPC server listening on port " << controlPort << std::endl; + std::cout << "[OCC] gRPC server listening on port " << controlPort << std::endl; std::function teardown = [&server]() { server->Shutdown(); }; addTeardownTask(teardown); m_checkMachineDone = std::bind(&OccServer::checkMachineDone, &service); server->Wait(); - std::cout << "gRPC server stopped" << std::endl; + std::cout << "[OCC] gRPC server stopped" << std::endl; } void OccInstance::addTeardownTask(std::function& func) @@ -129,11 +129,11 @@ int OccInstance::portFromVariablesMap(const boost::program_options::variables_ma controlPort = std::stoi(controlPortStr); } catch (const std::invalid_argument& e) { - std::cerr << "bad program argument " << OCC_CONTROL_PORT_ARG << " error: " << e.what() << std::endl; + std::cerr << "[OCC] bad program argument " << OCC_CONTROL_PORT_ARG << " error: " << e.what() << std::endl; std::exit(1); } catch (const std::out_of_range& e) { - std::cerr << "control port out of range " << OCC_CONTROL_PORT_ARG << " error: " << e.what() << std::endl; + std::cerr << "[OCC] control port out of range " << OCC_CONTROL_PORT_ARG << " error: " << e.what() << std::endl; std::exit(1); } } diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index d54001d43..65a9d4fca 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -60,8 +60,6 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, const occ_pb::EventStreamRequest* request, grpc::ServerWriter* writer) { - std::cout << "[request EventStream] handler BEGIN" << std::endl; - boost::uuids::basic_random_generator gen; std::string id = boost::uuids::to_string(gen()); @@ -87,8 +85,6 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, delete newEvent; } } - - std::cout << "[request EventStream] handler END" << std::endl; return ::grpc::Status::OK; } @@ -96,8 +92,6 @@ grpc::Status OccServer::StateStream(grpc::ServerContext* context, const pb::StateStreamRequest* request, grpc::ServerWriter* writer) { - std::cout << "[request StateStream] handler BEGIN" << std::endl; - (void) context; (void) request; @@ -130,8 +124,6 @@ grpc::Status OccServer::StateStream(grpc::ServerContext* context, isStreamOpen = false; } } - - std::cout << "[request StateStream] handler END" << std::endl; return grpc::Status::OK; } @@ -140,7 +132,6 @@ grpc::Status OccServer::GetState(grpc::ServerContext* context, pb::GetStateReply* response) { std::lock_guard lock(m_mu); - std::cout << "[request GetState] handler BEGIN" << std::endl; (void) context; (void) request; @@ -148,7 +139,6 @@ grpc::Status OccServer::GetState(grpc::ServerContext* context, auto state = getStringFromState(m_rco->getState()); response->set_state(state); - std::cout << "[request GetState] handler END" << std::endl; return grpc::Status::OK; } @@ -165,7 +155,6 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, pb::TransitionReply* response) { std::lock_guard lock(m_mu); - std::cout << "[request Transition] handler BEGIN" << std::endl; (void) context; if (!request) { @@ -189,7 +178,7 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, "transition not possible: current state: " + currentStateStr); } - std::cout << "[request Transition] src: " << srcStateStr + std::cout << "[OCC] transition src: " << srcStateStr << " currentState: " << currentStateStr << " event: " << event << std::endl; @@ -212,7 +201,7 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, response->set_trigger(pb::DEVICE_INTENTIONAL); } - std::cout << "[request Transition] handler END, new state: " << newStateStr << std::endl; + std::cout << "[OCC] new state: " << newStateStr << std::endl; return grpc::Status::OK; } @@ -229,7 +218,7 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: std::string evt = boost::algorithm::to_lower_copy(event); - printf("Object: %s - processing event %s in state %s with run number %llu.\n", + printf("[OCC] Object: %s - processing event %s in state %s with run number %llu.\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str(), @@ -342,12 +331,12 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: } if (invalidEvent) { - printf("Object: %s - invalid event %s received in state %s\n", + printf("[OCC] Object: %s - invalid event %s received in state %s\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str()); } else { - printf("Object: %s - event %s processed in state %s. New state: %s\n", + printf("[OCC] Object: %s - event %s processed in state %s. New state: %s\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str(), @@ -363,7 +352,7 @@ void OccServer::updateState(t_State s) publishState(s); // todo: check if error m_rco->setState(s); - printf("Object: %s - updating state = %s\n", + printf("[OCC] Object: %s - updating state = %s\n", m_rco->getName().c_str(), getStringFromState(s).c_str()); } @@ -380,7 +369,7 @@ void OccServer::pushEvent(pb::DeviceEvent* event) for (auto item : m_eventQueues) { item.second->push(event); } - printf("Object: %s - pushing event = %s\n", + printf("[OCC] Object: %s - pushing event = %s\n", m_rco->getName().c_str(), pb::DeviceEventType_Name(event->type()).c_str()); } diff --git a/occ/occlib/RuntimeControlledObject.cxx b/occ/occlib/RuntimeControlledObject.cxx index a3663059b..42380719d 100644 --- a/occ/occlib/RuntimeControlledObject.cxx +++ b/occ/occlib/RuntimeControlledObject.cxx @@ -101,7 +101,6 @@ int RuntimeControlledObject::executeExit() int RuntimeControlledObject::iterateRunning() { - printf("step run\n"); std::this_thread::sleep_for(1s); return 0; } diff --git a/occ/occlib/examples/dummy-process/main.cxx b/occ/occlib/examples/dummy-process/main.cxx index 0be9833f5..40a4b77fa 100644 --- a/occ/occlib/examples/dummy-process/main.cxx +++ b/occ/occlib/examples/dummy-process/main.cxx @@ -60,7 +60,6 @@ int main(int argc, char* argv[]) { // Block until t_State::done is reached: occ.wait(); - printf("all done\n"); // No need for further cleanup, the OccInstance should destroy its gRPC // interface and extra threads gracefully when it goes out of scope. } \ No newline at end of file diff --git a/occ/plugin/OccPlugin.cxx b/occ/plugin/OccPlugin.cxx index 0b0446491..dbd1ca276 100644 --- a/occ/plugin/OccPlugin.cxx +++ b/occ/plugin/OccPlugin.cxx @@ -45,7 +45,7 @@ OccPlugin::OccPlugin(const std::string& name, controlPort = GetPropertyAsString(OCC_CONTROL_PORT_ARG); } catch (std::exception& e) { - OLOG(INFO) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; + OLOG(DEBUG) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; } try { @@ -77,13 +77,13 @@ void OccPlugin::runServer(fair::mq::PluginServices* pluginServices, const std::s builder.AddListeningPort(serverAddress, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr server(builder.BuildAndStart()); - OLOG(INFO) << "gRPC server listening on port " << controlPort; + OLOG(DEBUG) << "gRPC server listening on port " << controlPort; std::function teardown = [&server]() { server->Shutdown(); }; addTeardownTask(teardown); server->Wait(); - OLOG(INFO) << "gRPC server stopped"; + OLOG(DEBUG) << "gRPC server stopped"; } void OccPlugin::addTeardownTask(std::function& func) diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 1b7cbe9b5..5c5f2a323 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -51,7 +51,6 @@ OccPluginServer::EventStream(grpc::ServerContext* context, const occ_pb::EventStreamRequest* request, grpc::ServerWriter* writer) { - std::cout << "[request EventStream] handler BEGIN" << std::endl; (void) context; (void) request; @@ -60,11 +59,10 @@ OccPluginServer::EventStream(grpc::ServerContext* context, std::mutex finished_mu; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { - OLOG(DEBUG) << "[request EventStream] onDeviceStateChange BEGIN"; std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - OLOG(DEBUG) << "[request EventStream] onDeviceStateChange RESPONSE state: " << state; + OLOG(DEBUG) << "[EventStream] new state: " << state; if (state == "EXITING") { std::unique_lock finished_lk(finished_mu); @@ -77,28 +75,21 @@ OccPluginServer::EventStream(grpc::ServerContext* context, writer->WriteLast(response, grpc::WriteOptions()); delete nilEvent; finished.notify_one(); - OLOG(DEBUG) << "[request EventStream] onDeviceStateChange NOTIFY FINISHED"; } - OLOG(DEBUG) << "[request EventStream] onDeviceStateChange END"; }; auto id = generateSubscriptionId("EventStream"); - OLOG(DEBUG) << "[request EventStream] subscribe, id: " << id; m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ m_pluginServices->UnsubscribeFromDeviceStateChange(id); - OLOG(DEBUG) << "[request EventStream] unsubscribe, id: " << id; }); { - OLOG(DEBUG) << "[request EventStream] blocking until END transition"; std::unique_lock lk(finished_mu); finished.wait(lk); - OLOG(DEBUG) << "[request EventStream] transitioned to END, closing stream"; } - std::cout << "[request StateStream] handler END" << std::endl; return ::grpc::Status::OK; } @@ -108,7 +99,6 @@ OccPluginServer::StateStream(grpc::ServerContext* context, const pb::StateStreamRequest* request, grpc::ServerWriter* writer) { - OLOG(DEBUG) << "[request StateStream] handler BEGIN"; (void) context; (void) request; @@ -118,7 +108,6 @@ OccPluginServer::StateStream(grpc::ServerContext* context, std::mutex finished_mu; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { - OLOG(DEBUG) << "[request StateStream] onDeviceStateChange BEGIN"; std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); pb::StateType sType = isIntermediateState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; @@ -127,7 +116,7 @@ OccPluginServer::StateStream(grpc::ServerContext* context, response.set_type(sType); response.set_state(state); - OLOG(DEBUG) << "[request StateStream] onDeviceStateChange RESPONSE state: " << state << "; type: " + OLOG(DEBUG) << "[StateStream] new state: " << state << "; type: " << pb::StateType_Name(sType); if (state != "EXITING") { @@ -136,27 +125,20 @@ OccPluginServer::StateStream(grpc::ServerContext* context, std::unique_lock finished_lk(finished_mu); writer->WriteLast(response, grpc::WriteOptions()); finished.notify_one(); - OLOG(DEBUG) << "[request StateStream] onDeviceStateChange NOTIFY FINISHED"; } - OLOG(DEBUG) << "[request StateStream] onDeviceStateChange END"; }; auto id = generateSubscriptionId("StateStream"); - OLOG(DEBUG) << "[request StateStream] subscribe, id: " << id; m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ m_pluginServices->UnsubscribeFromDeviceStateChange(id); - OLOG(DEBUG) << "[request StateStream] unsubscribe, id: " << id; }); { - OLOG(DEBUG) << "[request StateStream] blocking until END transition"; std::unique_lock lk(finished_mu); finished.wait(lk); - OLOG(DEBUG) << "[request StateStream] transitioned to END, closing stream"; } - OLOG(DEBUG) << "[request StateStream] handler END"; return grpc::Status::OK; } @@ -165,7 +147,6 @@ grpc::Status OccPluginServer::GetState(grpc::ServerContext* context, pb::GetStateReply* response) { std::lock_guard lock(m_mu); - OLOG(DEBUG) << "[request GetState] handler BEGIN"; (void) context; (void) request; @@ -173,7 +154,6 @@ grpc::Status OccPluginServer::GetState(grpc::ServerContext* context, auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); response->set_state(state); - OLOG(DEBUG) << "[request GetState] handler END"; return grpc::Status::OK; } @@ -223,7 +203,6 @@ OccPluginServer::Transition(grpc::ServerContext* context, std::lock_guard lock(m_mu); - OLOG(DEBUG) << "[request Transition] handler BEGIN"; (void) context; if (!request) { @@ -241,21 +220,17 @@ OccPluginServer::Transition(grpc::ServerContext* context, currentState); } - OLOG(DEBUG) << "[request Transition] src: " << srcState + OLOG(DEBUG) << "transition src: " << srcState << " currentState: " << currentState << " event: " << event; std::vector newStates; const std::string finalState = EXPECTED_FINAL_STATE.at(event); - OLOG(DEBUG) << "[request Transition] finalState: " << finalState; - std::condition_variable cv; std::mutex cv_mu; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { - OLOG(DEBUG) << "[request Transition] onDeviceStateChange BEGIN"; - // CONFIGURE arguments must be pushed during InitializingDevice if (reachedState == fair::mq::PluginServices::DeviceState::InitializingDevice) { @@ -292,18 +267,15 @@ OccPluginServer::Transition(grpc::ServerContext* context, std::unique_lock lk(cv_mu); newStates.push_back(fair::mq::PluginServices::ToStr(reachedState)); - OLOG(DEBUG) << "[request Transition] newStates vector: " << boost::algorithm::join(newStates, ", "); + OLOG(DEBUG) << "transition newStates vector: " << boost::algorithm::join(newStates, ", "); cv.notify_one(); - OLOG(DEBUG) << "[request Transition] onDeviceStateChange END"; }; auto id = generateSubscriptionId("Transition"); - OLOG(DEBUG) << "[request Transition] subscribe, id: " << id; m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ m_pluginServices->UnsubscribeFromDeviceStateChange(id); - OLOG(DEBUG) << "[request Transition] unsubscribe, id: " << id; }); try { @@ -345,7 +317,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, line.push_back(jt->first + "=" + jt->second); } channelLines.push_back(boost::join(line, ",")); - OLOG(DEBUG) << "[request Transition] pushing channel configuration " << channelLines.back(); + OLOG(DEBUG) << "transition pushing channel configuration " << channelLines.back(); } if (!channelLines.empty()) { m_pluginServices->SetProperty("channel-config", channelLines); @@ -359,38 +331,35 @@ OccPluginServer::Transition(grpc::ServerContext* context, } } catch (std::runtime_error &e) { - OLOG(WARNING) << "[request Transition] cannot push RUN transition arguments, reason:" << e.what(); + OLOG(WARNING) << "transition cannot push RUN transition arguments, reason:" << e.what(); } } m_pluginServices->ChangeDeviceState("OCC", evt); } catch (fair::mq::PluginServices::DeviceControlError& e) { - OLOG(ERROR) << "[request Transition] cannot request transition: " << e.what(); + OLOG(ERROR) << "transition cannot request transition: " << e.what(); return grpc::Status(grpc::INTERNAL, "cannot request transition, OCC plugin has no device control"); } catch (std::out_of_range& e) { - OLOG(ERROR) << "[request Transition] invalid transition name: " << request->transitionevent(); + OLOG(ERROR) << "transition invalid event name: " << request->transitionevent(); return grpc::Status(grpc::INVALID_ARGUMENT, "argument " + request->transitionevent() + " is not a valid transition name"); } { std::unique_lock lk(cv_mu); - OLOG(DEBUG) << "[request Transition] states locked, last known state: " - << (newStates.size() ? newStates.back() : "NIL"); // IF we have no states in list yet, OR // we have some states, and the last one is an intermediate state (for which an autotransition is presumably about to happen) if (newStates.empty() || isIntermediateState(newStates.back())) { // We need to block until the transitions are complete for (;;) { - OLOG(DEBUG) << "[request Transition] transitions expected, blocking"; cv.wait(lk); if (newStates.empty()) { OLOG(ERROR) << "[request Transition] notify condition met but no states written"; break; } - OLOG(DEBUG) << "[request Transition] notify condition met, reached state: " << newStates.back(); + OLOG(DEBUG) << "transition notify condition met, reached state: " << newStates.back(); if (isIntermediateState(newStates.back())) { //if it's an auto state continue; } else { @@ -429,7 +398,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, response->set_trigger(pb::DEVICE_INTENTIONAL); } - OLOG(DEBUG) << "[request Transition] handler END, states visited: " << boost::algorithm::join(newStates, ", "); + OLOG(DEBUG) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); return grpc::Status::OK; } From ea043f36e58f0c5b5443b8e674de5ee00a39f9e1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Mar 2020 10:48:39 +0100 Subject: [PATCH 0164/2352] [core] Add dumpWorkflows flag to control generation of wf dumps --- core/config.go | 2 ++ core/workflow/load.go | 4 ++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index f83883bd8..6a8733ab2 100644 --- a/core/config.go +++ b/core/config.go @@ -87,6 +87,7 @@ func setDefaults() error { viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) + viper.SetDefault("dumpWorkflows", false) viper.SetDefault("globalConfigurationUri", "") //TODO: TBD return nil @@ -125,6 +126,7 @@ func setFlags() error { pflag.Bool("summaryMetrics", viper.GetBool("summaryMetrics"), "Collect summary metrics for tasks launched per-offer-cycle, offer processing time, etc.") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") + pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("globalConfigurationUri", viper.GetString("globalConfigurationUri"), "URI of the Consul server or YAML configuration file, used for global configuration.") pflag.Parse() diff --git a/core/workflow/load.go b/core/workflow/load.go index b2ac39f1f..270482934 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -68,7 +68,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user workflow = root timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) - if viper.GetBool("veryVerbose") { + if viper.GetBool("dumpWorkflows") { f, _ := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) _, _ = pp.Fprintln(f, workflow) defer f.Close() @@ -81,7 +81,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user } log.WithField("path", workflowPath).Debug("workflow loaded") - if viper.GetBool("veryVerbose") { + if viper.GetBool("dumpWorkflows") { g, _ := os.Create(fmt.Sprintf("wf-processed-%s.json", timestamp)) _, _ = pp.Fprintln(g, workflow) defer g.Close() From 6063236b42e4d12b6c96ed70e31435967dd7de5d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Mar 2020 14:09:27 +0100 Subject: [PATCH 0165/2352] [coconut] Improve --extra-vars documentation --- coconut/cmd/environment_create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 10efc2f18..23f5cb622 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -62,5 +62,5 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") - environmentCreateCmd.Flags().StringSliceP("extra-vars", "e", []string{}, "values passed in using the key=value syntax, comma-separated, are interpreted as strings `--extra-vars key1=val1,key2=val2`") + environmentCreateCmd.Flags().StringSliceP("extra-vars", "e", []string{}, "values passed in using the key=value syntax, comma-separated, are interpreted as strings `key1=val1,key2=val2`") } From 1be0aef159cf0832366eee5672edfcb90af9d435 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Mar 2020 15:08:13 +0100 Subject: [PATCH 0166/2352] [OCTRL-209] Add no-version to configuration import --- coconut/cmd/configuration_import.go | 6 +++-- coconut/configuration/configuration.go | 33 ++++++++++++++++++++++++-- hacking/settings-mac.yaml | 5 ++-- 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go index 976bf9751..0a2ba9f96 100644 --- a/coconut/cmd/configuration_import.go +++ b/coconut/cmd/configuration_import.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019 CERN and copyright holders of ALICE O². + * Copyright 2020 CERN and copyright holders of ALICE O². * Author: George Raduta * * This program is free software: you can redistribute it and/or modify @@ -37,6 +37,8 @@ coconut conf import / coconut conf import --new-component coconut conf import / --format=json coconut conf import .json +coconut conf import -no-versioning +coconut conf import -no-versioning --new-component `, Short: "Import a configuration file for the specified component and entry", Long: `The configuration import command generates a timestamp and saves @@ -51,5 +53,5 @@ func init() { configurationCmd.AddCommand(configurationImportCmd) configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") - + configurationImportCmd.Flags().Bool("no-versioning", false, "create a new configuration component without timestamp being generated as a version") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 99d42858b..db10b84d7 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -324,6 +324,12 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, if err != nil { return err, invalidArgs } + useNoVersion, err := cmd.Flags().GetBool("no-versioning") + if err != nil { + return err, invalidArgs + } + + // Parse and Format input arguments var component, entry, filePath string if len(args) < 2 || len(args) > 3 { return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), invalidArgs @@ -391,8 +397,28 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, return err, logicError } + // Temporary workaround to allow no-versioning + latestTimestamp, err := componentcfg.GetLatestTimestamp(keys, component, entry) + fmt.Fprintln(o, latestTimestamp) + if err != nil { + return err, invalidArgs + } + // If a timestamp already exists, entry specified by the user cannot be used + if latestTimestamp != "0" && useNoVersion { + return errors.New("Specified entry: '" + entry + "' already contains versioned items. Please " + + "specify a different entry name"), invalidArgs + } + if latestTimestamp == "0" && !useNoVersion { + return errors.New("Specified entry: '" + entry + "' already contains un-versioned items. Please " + + "specify a different entry name"), invalidArgs + } + timestamp := time.Now().Unix() - key := componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + strconv.FormatInt(timestamp, 10) + key := componentcfg.ConfigComponentsPath + component + "/" + entry + if !useNoVersion { + key += "/" + strconv.FormatInt(timestamp, 10) + } + err = cfg.Put(key, string(fileContent)) if err != nil { return @@ -407,7 +433,10 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } else { userMsg += "Entry updated: " + blue(entry) + "\n" } - fullKey := red(component) + "/" + blue(entry) + "@" + strconv.FormatInt(timestamp, 10) + fullKey := red(component) + "/" + blue(entry) + if !useNoVersion { + fullKey += "@" + strconv.FormatInt(timestamp, 10) + } userMsg += "Configuration imported: " + fullKey _, _ = fmt.Fprintln(o, userMsg) diff --git a/hacking/settings-mac.yaml b/hacking/settings-mac.yaml index e725afff9..7c0bd30bc 100644 --- a/hacking/settings-mac.yaml +++ b/hacking/settings-mac.yaml @@ -1,8 +1,9 @@ --- controlport: 47102 executor: /opt/o2control-executor -mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" +mesosurl: "http://localhost:5050/api/v1/scheduler" +# mesosurl: "http://aidrefsrv21.cern.ch:5050/api/v1/scheduler" verbose: true veryverbose: true globalconfigurationuri: "file://hacking/config.yaml" -repositoriesPath: "/Users/graduta/aliecs.d" +coreWorkingDir: "/Users/graduta/aliecs.d" From 85a4c7aca3a9cb2cf8c1dd0de523f823333d5af3 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Mar 2020 15:15:23 +0100 Subject: [PATCH 0167/2352] [OCTRL-209] Refactor --- coconut/configuration/configuration.go | 37 ++++++++++++++------------ 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index db10b84d7..89f6918d5 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -399,27 +399,33 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, // Temporary workaround to allow no-versioning latestTimestamp, err := componentcfg.GetLatestTimestamp(keys, component, entry) - fmt.Fprintln(o, latestTimestamp) if err != nil { return err, invalidArgs } - // If a timestamp already exists, entry specified by the user cannot be used - if latestTimestamp != "0" && useNoVersion { - return errors.New("Specified entry: '" + entry + "' already contains versioned items. Please " + - "specify a different entry name"), invalidArgs - } - if latestTimestamp == "0" && !useNoVersion { - return errors.New("Specified entry: '" + entry + "' already contains un-versioned items. Please " + - "specify a different entry name"), invalidArgs + + if entryExists { + if latestTimestamp != "0" && useNoVersion { + // If a timestamp already exists in the entry specified by the user, than it cannot be used + return errors.New("Specified entry: '" + entry + "' already contains versioned items. Please " + + "specify a different entry name"), invalidArgs + } + if latestTimestamp == "0" && !useNoVersion { + // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown + return errors.New("Specified entry: '" + entry + "' already contains un-versioned items. Please " + + "specify a different entry name"), invalidArgs + } } timestamp := time.Now().Unix() - key := componentcfg.ConfigComponentsPath + component + "/" + entry + fullKey := componentcfg.ConfigComponentsPath + component + "/" + entry + toPrintKey := red(component) + "/" + blue(entry) + if !useNoVersion { - key += "/" + strconv.FormatInt(timestamp, 10) + fullKey += "/" + strconv.FormatInt(timestamp, 10) + toPrintKey += "@" + strconv.FormatInt(timestamp, 10) } - err = cfg.Put(key, string(fileContent)) + err = cfg.Put(fullKey, string(fileContent)) if err != nil { return } @@ -433,11 +439,8 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } else { userMsg += "Entry updated: " + blue(entry) + "\n" } - fullKey := red(component) + "/" + blue(entry) - if !useNoVersion { - fullKey += "@" + strconv.FormatInt(timestamp, 10) - } - userMsg += "Configuration imported: " + fullKey + + userMsg += "Configuration imported: " + toPrintKey _, _ = fmt.Fprintln(o, userMsg) return nil, 0 From 4b8bced658459541748c6e8fc78393bfba78e2fa Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Mar 2020 15:31:16 +0100 Subject: [PATCH 0168/2352] [OCTRL-209] Address comments --- coconut/cmd/configuration_import.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go index 0a2ba9f96..2c2de3c04 100644 --- a/coconut/cmd/configuration_import.go +++ b/coconut/cmd/configuration_import.go @@ -37,8 +37,8 @@ coconut conf import / coconut conf import --new-component coconut conf import / --format=json coconut conf import .json -coconut conf import -no-versioning -coconut conf import -no-versioning --new-component +coconut conf import --no-versioning +coconut conf import --no-versioning --new-component `, Short: "Import a configuration file for the specified component and entry", Long: `The configuration import command generates a timestamp and saves @@ -53,5 +53,5 @@ func init() { configurationCmd.AddCommand(configurationImportCmd) configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") - configurationImportCmd.Flags().Bool("no-versioning", false, "create a new configuration component without timestamp being generated as a version") + configurationImportCmd.Flags().Bool("no-versioning", false, "create an unversioned configuration entry (no timestamps are stored)") } From 630b8faac1f3bd76230b67af3e6bc30aadfe74dc Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 18 Mar 2020 16:46:22 +0100 Subject: [PATCH 0169/2352] [OCTRL-209] Add cases for rest of conf commands on no-version --- coconut/cmd/configuration_list.go | 2 +- coconut/configuration/configuration.go | 6 +++++- coconut/configuration/configurationutil.go | 9 ++++++++- configuration/componentcfg/componentcfg.go | 6 +++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 9b7a8d021..95de8dcb2 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -34,7 +34,7 @@ var configurationListCmd = &cobra.Command{ Aliases: []string{"l", "ls"}, Example: `coconut conf list coconut conf list -coconut conf list -t `, +coconut conf list -t`, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components from O² Configuration as a list and displays it on the standard output`, diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 89f6918d5..4c7aac4cc 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -239,7 +239,11 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, emptyData } } - key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp + key = componentcfg.ConfigComponentsPath + component + "/" + entry + if timestamp != "0" { + //versioned entry + key += "/" + timestamp + } cfgPayload, err = cfg.Get(key) if err != nil { return err, connectionError diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index 47f57626d..e51f64ec3 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019 CERN and copyright holders of ALICE O². + * Copyright 2020 CERN and copyright holders of ALICE O². * Author: George Raduta * * This program is free software: you can redistribute it and/or modify @@ -74,6 +74,10 @@ func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use componentsFullName := strings.TrimPrefix(key, keyPrefix) componentParts := strings.Split(componentsFullName, "/") componentTimestamp := componentParts[len(componentParts) - 1] + + if len(componentParts) == 1 { + componentTimestamp = "unversioned" + } if useTimestamp { componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) } else { @@ -110,6 +114,9 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W if err != nil { prettyTimestamp = timestamp } + if prettyTimestamp == "unversioned" { + prettyTimestamp = red(prettyTimestamp) + } configName := red(component) + "/" + blue(entry) + "@" + timestamp table.Append([]string{configName, prettyTimestamp}) } diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index 10dd3406a..ee7773004 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -86,7 +86,11 @@ func GetComponentEntryTimestampFromConsul(key string)(string, string, string) { key = strings.TrimPrefix(key, "/'") key = strings.TrimSuffix(key, "/") elements := strings.Split(key, "/") - return elements[0], elements[1], elements[2] + if len(elements) == 3 { + return elements[0], elements[1], elements[2] + } else { + return elements[0], elements[1], "unversioned" + } } From 792a857a53b5a415ed1a6285bc99b478d3fe2439 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 Mar 2020 09:27:27 +0100 Subject: [PATCH 0170/2352] [build] Bump to v0.12.91 --- VERSION | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4e153dcda..7e03536b2 100644 --- a/VERSION +++ b/VERSION @@ -1,5 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 12 -VERSION_PATCH := 90 - +VERSION_PATCH := 91 From b471cb7026c42c8a0da7888d23c8b529e45babbc Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 20 Mar 2020 10:40:42 +0200 Subject: [PATCH 0171/2352] [coconut] Fix repo default-revision bug & improve documentation --- coconut/cmd/repo_default_revision.go | 10 +++++++++- coconut/control/control.go | 4 ++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index 2d0c82dc9..a9b5ba675 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -25,6 +25,7 @@ package cmd import ( + "fmt" "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -33,7 +34,14 @@ import ( var repoDefaultRevisionCmd = &cobra.Command{ Use: "default-revision", Short: "set default global and per-repository revision", - Long: "The repository default-revision command sets the global default repository revision as well as the per-repository default revision.", + Long: fmt.Sprintf(`The repository default-revision command sets the global default repository revision. + +To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by ` + "`coconut repo list`." + ` + +Examples: +* ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision +* ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 +* ` + "`coconut repo default-revision 2 vs-sftb" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`), Run: control.WrapCall(control.SetDefaultRevision), } diff --git a/coconut/control/control.go b/coconut/control/control.go index 32098e4fe..e0e1939ef 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -834,6 +834,7 @@ func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. fmt.Fprintln(o, "Operation failed.") return err } + fmt.Fprintln(o, "The global default revision has been succesfuly updated to \"" + args[0] + "\".") } else if len(args) == 2 { // Set per-repo default index, err := strconv.ParseInt(args[0], 10, 32) if err != nil { @@ -851,12 +852,11 @@ func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. fmt.Fprintln(o, "Available revisions for this repo: \n"+response.GetInfo()) return errors.New("Could not update the default revision.") } + fmt.Fprintln(o, "The default revision for this repo has been successfuly updated to \"" + args[1] + "\".") } else { err := errors.New(fmt.Sprintf("expects 1 or 2 args, received %d", len(args))) return err } - fmt.Fprintln(o, "The default revision for this repo has been successfuly updated to \"" + args[1] + "\".") - return nil } \ No newline at end of file From 496d68c7f450671cc4fb11bbf80f6692648e25cc Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 20 Mar 2020 12:38:50 +0200 Subject: [PATCH 0172/2352] [coconut] Drop superfluous fmt.Sprintf from repo default-revision --- coconut/cmd/repo_default_revision.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index a9b5ba675..b08b7afb7 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -25,7 +25,6 @@ package cmd import ( - "fmt" "github.com/AliceO2Group/Control/coconut/control" "github.com/spf13/cobra" ) @@ -34,14 +33,14 @@ import ( var repoDefaultRevisionCmd = &cobra.Command{ Use: "default-revision", Short: "set default global and per-repository revision", - Long: fmt.Sprintf(`The repository default-revision command sets the global default repository revision. + Long: `The repository default-revision command sets the global default repository revision. To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by ` + "`coconut repo list`." + ` Examples: * ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision * ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 -* ` + "`coconut repo default-revision 2 vs-sftb" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`), +* ` + "`coconut repo default-revision 2 vs-sftb" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, Run: control.WrapCall(control.SetDefaultRevision), } From 97000dc841ba6e69d6d5c238121a179b2019ab27 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 20 Mar 2020 12:02:37 +0100 Subject: [PATCH 0173/2352] [core]: fix segfault for unsatisfied constraint or resource --- core/scheduler.go | 10 ++++++++++ core/workflow/taskrole.go | 3 +++ 2 files changed, 13 insertions(+) diff --git a/core/scheduler.go b/core/scheduler.go index 265f97f29..eb783ed1d 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -544,6 +544,16 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl continue } if !task.Resources(remainingResources).Satisfy(wants) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResources.String(), + }). + Warn("descriptor wants not satisfied by offer resources") + } continue } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index b5db5e333..efe089b2b 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -185,6 +185,9 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { } func (t *taskRole) GetTasks() task.Tasks { + if ttask := t.GetTask(); ttask == nil { + return []*task.Task{} + } return []*task.Task{t.GetTask()} } From e274a2c6b7a9546660db0c41945287a1bf0c5fda Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 13:07:02 +0100 Subject: [PATCH 0174/2352] [executor] Prevent endless loop in ERROR state OCTRL-213 #close --- executor/executable/controllabletask.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 0b3fa442f..6aa15d980 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -318,7 +318,8 @@ func (t *ControllableTask) Kill() error { return } - for reachedState != "DONE" { + for reachedState != "DONE" && + reachedState != "ERROR" { cmd := nextTransition(reachedState) log.WithFields(logrus.Fields{ "evt": cmd.Event, @@ -354,7 +355,6 @@ func (t *ControllableTask) Kill() error { t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } - // TODO: do a SIGTERM before the SIGKILL // When killing we must always use syscall.Kill with a negative PID, in order to kill all From 29c322b12fa9dbb56759f1a80a8910311f300e2f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 23 Mar 2020 17:07:31 +0100 Subject: [PATCH 0175/2352] [misc] Attribution in header --- configuration/componentcfg/componentcfg.go | 1 + 1 file changed, 1 insertion(+) diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index ee7773004..fa03de621 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -3,6 +3,7 @@ * * Copyright 2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac + * Author: George Raduta * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From 1e9171f110e3f8a29d681f6c993cc0951f29227f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 11:31:33 +0100 Subject: [PATCH 0176/2352] [build] Dependency update --- go.mod | 1 + go.sum | 2 ++ 2 files changed, 3 insertions(+) diff --git a/go.mod b/go.mod index 5b5d573de..8e229c139 100644 --- a/go.mod +++ b/go.mod @@ -60,6 +60,7 @@ require ( github.com/prometheus/client_golang v1.3.0 github.com/prometheus/common v0.9.1 // indirect github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 + github.com/rs/xid v1.2.1 github.com/russross/blackfriday v2.0.0+incompatible // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.4.2 diff --git a/go.sum b/go.sum index 7c78f7728..321662409 100644 --- a/go.sum +++ b/go.sum @@ -348,6 +348,8 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= +github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= From 8b8f9746af8811da08d6016590b6914f5a32a141 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 11:42:22 +0100 Subject: [PATCH 0177/2352] [core] Overhaul the channel package to support TCP and IPC endpoints --- core/task/channel/channel.go | 10 +++ core/task/channel/endpoint.go | 145 +++++++++++++++++++++++++++++++++ core/task/channel/inbound.go | 10 +-- core/task/channel/outbound.go | 37 +++++---- core/task/channel/transport.go | 82 +++++++++++++++++++ 5 files changed, 264 insertions(+), 20 deletions(-) create mode 100644 core/task/channel/endpoint.go create mode 100644 core/task/channel/transport.go diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index 9b43a3180..752a033ee 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -28,14 +28,20 @@ import ( "strconv" "strings" "errors" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/sirupsen/logrus" ) +var log = logger.New(logrus.StandardLogger(), "channel") + type channel struct { Name string `yaml:"name"` Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize"` RcvBufSize int `yaml:"rcvBufSize"` RateLogging int `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -45,6 +51,7 @@ func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { SndBufSize string `yaml:"sndBufSize"` RcvBufSize string `yaml:"rcvBufSize"` RateLogging string `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } aux := _channel{} err = unmarshal(&aux) @@ -63,6 +70,9 @@ func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { if aux.RateLogging == "" { aux.RateLogging = "0" } + if len(aux.Transport) == 0 { + aux.Transport = DEFAULT + } c.SndBufSize, err = strconv.Atoi(aux.SndBufSize) if err != nil { diff --git a/core/task/channel/endpoint.go b/core/task/channel/endpoint.go new file mode 100644 index 000000000..4796d6a00 --- /dev/null +++ b/core/task/channel/endpoint.go @@ -0,0 +1,145 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package channel + +import ( + "fmt" + "strings" + + "github.com/rs/xid" +) + +const ipcPathFormat = "/tmp/o2ipc-%s" + +type BindMap map[string]Endpoint + + +type Endpoint interface { + GetAddressFormat() AddressFormat + GetAddress() string + GetTransport() TransportType + ToTargetEndpoint(taskHostname string) Endpoint + ToBoundEndpoint() Endpoint +} + +func NewTcpEndpoint(host string, port uint64, transport TransportType) Endpoint { + return TcpEndpoint{ + Host: host, + Port: port, + Transport: transport, + } +} + +func NewBoundTcpEndpoint(port uint64, transport TransportType) Endpoint { + return TcpEndpoint{ + Host: "*", + Port: port, + Transport: transport, + } +} + +func NewIpcEndpoint(path string, transport TransportType) Endpoint { + return IpcEndpoint{ + Path: strings.TrimPrefix(path, "ipc://"), + Transport: transport, + } +} + +func NewBoundIpcEndpoint(transport TransportType) Endpoint { + return IpcEndpoint{ + Path: fmt.Sprintf(ipcPathFormat, xid.New().String()), + Transport: transport, + } +} + + +type TcpEndpoint struct { + Host string + Port uint64 + Transport TransportType +} + +func (TcpEndpoint) GetAddressFormat() AddressFormat { + return TCP +} + +func (t TcpEndpoint) GetAddress() string { + if len(t.Host) == 0 || t.Host == "*" { + return fmt.Sprintf("tcp://*:%d", t.Port) + } + return fmt.Sprintf("tcp://%s:%d", t.Host, t.Port) +} + +func (t TcpEndpoint) GetTransport() TransportType { + return t.Transport +} + +func (t TcpEndpoint) ToTargetEndpoint(taskHostname string) Endpoint { + return TcpEndpoint{ + Host: taskHostname, + Port: t.Port, + Transport: t.Transport, + } +} + +func (t TcpEndpoint) ToBoundEndpoint() Endpoint { + return TcpEndpoint{ + Host: "*", + Port: t.Port, + Transport: t.Transport, + } +} + + +type IpcEndpoint struct { + Path string + Transport TransportType +} + +func (IpcEndpoint) GetAddressFormat() AddressFormat { + return IPC +} + +func (t IpcEndpoint) GetAddress() string { + return fmt.Sprintf("ipc://%s", t.Path) +} + +func (t IpcEndpoint) GetTransport() TransportType { + return t.Transport +} + +func (t IpcEndpoint) ToTargetEndpoint(_ string) Endpoint { + return IpcEndpoint{ + Path: t.Path, + Transport: t.Transport, + } +} + +func (t IpcEndpoint) ToBoundEndpoint() Endpoint { + return IpcEndpoint{ + Path: t.Path, + Transport: t.Transport, + } +} diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 13188f7d6..e014ee44b 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -25,7 +25,6 @@ package channel import ( - "fmt" "strconv" "strings" @@ -34,6 +33,7 @@ import ( type Inbound struct { channel + Addressing AddressFormat `yaml:"addressing"` //default: tcp } /* @@ -50,11 +50,11 @@ chans.data1.0.type = push chans.data1.numSockets = 1 */ -func (inbound *Inbound) ToFMQMap(port uint64) (pm controlcommands.PropertyMap) { - return inbound.buildFMQMap(fmt.Sprintf("tcp://*:%d", port)) +func (inbound *Inbound) ToFMQMap(endpoint Endpoint) (pm controlcommands.PropertyMap) { + return inbound.buildFMQMap(endpoint.ToBoundEndpoint().GetAddress(), endpoint.GetTransport()) } -func (inbound *Inbound) buildFMQMap(address string) (pm controlcommands.PropertyMap) { +func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm controlcommands.PropertyMap) { pm = make(controlcommands.PropertyMap) const chans = "chans" chName := inbound.Name @@ -70,7 +70,7 @@ func (inbound *Inbound) buildFMQMap(address string) (pm controlcommands.Property "rcvKernelSize": "0", //NOTE: hardcoded "sndBufSize": strconv.Itoa(inbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": "default", //NOTE: hardcoded + "transport": transport.String(), "type": inbound.Type.String(), } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 88a5426f9..7aac7147f 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -25,28 +25,21 @@ package channel import ( - "fmt" "strconv" "strings" "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/sirupsen/logrus" ) -type Endpoint struct { - Host string - Port uint64 -} - -type BindMap map[string]Endpoint - type Outbound struct { channel - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { target := struct { - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` }{} err = unmarshal(&target) if err != nil { @@ -85,10 +78,12 @@ func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.Property } var address string + var transport TransportType // If an explicit target was provided, we use it if strings.HasPrefix(outbound.Target, "tcp://") || strings.HasPrefix(outbound.Target, "ipc://") { address = outbound.Target + transport = outbound.Transport } else { // we don't need class.Bind data for this one, only task.bindPorts after resolving paths! for chPath, endpoint := range bindMap { @@ -96,7 +91,8 @@ func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.Property if outbound.Target == chPath { // We have a match, so we generate a resolved target address and break - address = fmt.Sprintf("tcp://%s:%d", endpoint.Host, endpoint.Port) + address = endpoint.GetAddress() + transport = endpoint.GetTransport() break } } @@ -106,10 +102,10 @@ func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.Property return } - return outbound.buildFMQMap(address) + return outbound.buildFMQMap(address, transport) } -func (outbound *Outbound) buildFMQMap(address string) (pm controlcommands.PropertyMap) { +func (outbound *Outbound) buildFMQMap(address string, transport TransportType) (pm controlcommands.PropertyMap) { pm = make(controlcommands.PropertyMap) const chans = "chans" chName := outbound.Name @@ -117,7 +113,7 @@ func (outbound *Outbound) buildFMQMap(address string) (pm controlcommands.Proper pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap{ + chanProps := controlcommands.PropertyMap { "address": address, "method": "connect", "rateLogging": strconv.Itoa(outbound.RateLogging), @@ -125,10 +121,21 @@ func (outbound *Outbound) buildFMQMap(address string) (pm controlcommands.Proper "rcvKernelSize": "0", //NOTE: hardcoded "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": "default", //NOTE: hardcoded + "transport": transport.String(), "type": outbound.Type.String(), } + if (transport != outbound.Transport) && + (outbound.Transport != DEFAULT) { + log.WithFields(logrus.Fields{ + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). + Warn("channel transport mismatch, fix workflow template") + } + for k, v := range chanProps { pm[prefix + "." + k] = v } diff --git a/core/task/channel/transport.go b/core/task/channel/transport.go new file mode 100644 index 000000000..98d6eefe4 --- /dev/null +++ b/core/task/channel/transport.go @@ -0,0 +1,82 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package channel + +import ( + "errors" + "strings" +) + +type TransportType string +const ( + DEFAULT = TransportType("default") + ZEROMQ = TransportType("zeromq") + NANOMSG = TransportType("nanomsg") + SHMEM = TransportType("shmem") +) + +func (tr TransportType) String() string { + return string(tr) +} + +func (tr *TransportType) UnmarshalText(b []byte) error { + str := strings.ToLower(strings.Trim(string(b), `"`)) + + switch str { + case "": + *tr = DEFAULT + case DEFAULT.String(), ZEROMQ.String(), NANOMSG.String(), SHMEM.String(): + *tr = TransportType(str) + default: + return errors.New("invalid transport type: " + str) + } + + return nil +} + +type AddressFormat string +const ( + TCP = AddressFormat("tcp") + IPC = AddressFormat("ipc") +) + +func (af AddressFormat) String() string { + return string(af) +} + +func (af *AddressFormat) UnmarshalText(b []byte) error { + str := strings.ToLower(strings.Trim(string(b), `"`)) + + switch str { + case "": + *af = TCP + case TCP.String(), IPC.String(): + *af = AddressFormat(str) + default: + return errors.New("invalid address format: " + str) + } + + return nil +} From 9994e18d97e16d490d8b40f595e99d1436579cf8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 11:45:36 +0100 Subject: [PATCH 0178/2352] [core] InboundChannels instead of BindPorts to support IPC files --- core/task/match.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/task/match.go b/core/task/match.go index 8922e38de..e3b33230b 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -32,10 +32,10 @@ import ( ) type Wants struct { - Cpu float64 - Memory float64 - StaticPorts Ranges - BindPorts []channel.Inbound + Cpu float64 + Memory float64 + StaticPorts Ranges + InboundChannels []channel.Inbound } func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { @@ -54,8 +54,8 @@ func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { copy(r.StaticPorts, wants.Ports) } if taskClass.Bind != nil { - r.BindPorts = make([]channel.Inbound, len(taskClass.Bind)) - copy(r.BindPorts, taskClass.Bind) + r.InboundChannels = make([]channel.Inbound, len(taskClass.Bind)) + copy(r.InboundChannels, taskClass.Bind) } } return @@ -86,7 +86,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { return false } - wantsBindCount := len(wants.BindPorts) + wantsBindCount := len(wants.InboundChannels) // if total ports minus what we use for static ranges is LESS than the number of dynamic ports we'll need... if availPorts.Size() - wantsStaticRanges.Size() < uint64(wantsBindCount) { return false From d6057d5b2e093c623cb540a826562c7cefa4c8cb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 11:48:17 +0100 Subject: [PATCH 0179/2352] [core] Use IPC-enabled endpoints instead of plain ports in task.Manager --- core/task/manager.go | 15 ++++++++------- core/task/task.go | 14 +++++++------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index a9e8c9b25..3e7a9b326 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -92,7 +92,7 @@ func NewManager(resourceOffersDone <-chan DeploymentMap, func (m *Manager) NewTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, - bindPorts map[string]uint64, + localBindMap channel.BindMap, executorId mesos.ExecutorID) (t *Task) { newId := uuid.NewUUID().String() t = &Task{ @@ -106,16 +106,16 @@ func (m *Manager) NewTaskForMesosOffer( properties: gera.MakeStringMap().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), executorId: executorId.Value, GetTaskClass: nil, - bindPorts: nil, + localBindMap: nil, state: STANDBY, status: INACTIVE, } t.GetTaskClass = func() *Class { return m.GetTaskClass(t.className) } - t.bindPorts = make(map[string]uint64) - for k, v := range bindPorts { - t.bindPorts[k] = v + t.localBindMap = make(channel.BindMap) + for k, v := range localBindMap { + t.localBindMap[k] = v } return } @@ -408,8 +408,9 @@ func (m *Manager) ConfigureTasks(envId uuid.Array, tasks Tasks) error { bindMap := make(channel.BindMap) for _, task := range tasks { taskPath := task.parent.GetPath() - for inbChName, port := range task.GetBindPorts() { - bindMap[taskPath + TARGET_SEPARATOR + inbChName] = channel.Endpoint{Host: task.GetHostname(), Port: port} + for inbChName, endpoint := range task.GetLocalBindMap() { + bindMap[taskPath + TARGET_SEPARATOR + inbChName] = + endpoint.ToTargetEndpoint(task.GetHostname()) } } log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). diff --git a/core/task/task.go b/core/task/task.go index b21e0880f..3c5d694f7 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -78,7 +78,7 @@ type Task interface { GetAgentId() string GetHostname() string GetEnvironmentId() uuid.Array - GetBindPorts() map[string]uint64 + GetLocalBindMap() map[string]uint64 BuildPropertyMap(bindMap channel.BindMap) controlcommands.PropertyMap GetMesosCommandTarget() controlcommands.MesosCommandTarget }*/ @@ -95,7 +95,7 @@ type Task struct { taskId string executorId string - bindPorts map[string]uint64 + localBindMap channel.BindMap status Status state State @@ -282,8 +282,8 @@ func (t *Task) GetEnvironmentId() uuid.Array { return t.parent.GetEnvironmentId() } -func (t *Task) GetBindPorts() map[string]uint64 { - return t.bindPorts +func (t *Task) GetLocalBindMap() channel.BindMap { + return t.localBindMap } func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { @@ -323,18 +323,18 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ { for _, inbCh := range class.Bind { - port, ok := t.bindPorts[inbCh.Name] + endpoint, ok := t.localBindMap[inbCh.Name] if !ok { log.WithFields(logrus.Fields{ "channelName": inbCh.Name, "taskName": t.name, }). - Error("port not allocated for inbound channel") + Error("endpoint not allocated for inbound channel") continue } // We get the FairMQ-formatted propertyMap from the inbound channel spec - chanProps := inbCh.ToFMQMap(port) + chanProps := inbCh.ToFMQMap(endpoint) // And we copy it into the task's propertyMap for k, v := range chanProps { From 929dab360c3a95f50b87b7c3c0cf76efc1807b9e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 11:49:05 +0100 Subject: [PATCH 0180/2352] [core] Update BindMap builder in scheduler to support named pipes --- core/scheduler.go | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index eb783ed1d..91b29769d 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -34,6 +34,7 @@ import ( "fmt" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow" "github.com/spf13/viper" "io" @@ -559,20 +560,24 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // Point of no return, we start subtracting resources - bindMap := make(map[string]uint64) - for _, ch := range wants.BindPorts { - availPorts, ok := resources.Ports(remainingResources...) - if !ok { - continue FOR_DESCRIPTORS + bindMap := make(channel.BindMap) + for _, ch := range wants.InboundChannels { + if ch.Addressing == channel.IPC { + bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) + } else { + availPorts, ok := resources.Ports(remainingResources...) + if !ok { + continue FOR_DESCRIPTORS + } + // TODO: this can be optimized by excluding the base range outside the loop + availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) + port := availPorts.Min() + builder := resources.Build(). + Name(resources.Name("ports")). + Ranges(resources.BuildRanges().Span(port, port).Ranges) + remainingResources.Subtract(builder.Resource) + bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) } - // TODO: this can be optimized by excluding the base range outside the loop - availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) - port := availPorts.Min() - builder := resources.Build(). - Name(resources.Name("ports")). - Ranges(resources.BuildRanges().Span(port, port).Ranges) - remainingResources.Subtract(builder.Resource) - bindMap[ch.Name] = port } agentForCache := task.AgentCacheInfo{ @@ -659,8 +664,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl for _, rng := range wants.StaticPorts { portsBuilder = portsBuilder.Span(rng.Begin, rng.End) } - for _, port := range bindMap { - portsBuilder = portsBuilder.Span(port, port) + for _, endpoint := range bindMap { + // We only add the endpoint to the portsBuilder if it has a port + if tcpEndpoint, ok := endpoint.(channel.TcpEndpoint); ok { + portsBuilder = portsBuilder.Span(tcpEndpoint.Port, tcpEndpoint.Port) + } } portsBuilder = portsBuilder.Span(controlPort, controlPort) From f289c934a8dd4467dc7c07b646b8a724e99174b4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 12:28:19 +0100 Subject: [PATCH 0181/2352] [build] Bump and clean up dependencies --- go.mod | 108 +++++++++++--------- go.sum | 309 ++++++++++++++++++++++++++++++--------------------------- 2 files changed, 226 insertions(+), 191 deletions(-) diff --git a/go.mod b/go.mod index 8e229c139..c1010b5f0 100644 --- a/go.mod +++ b/go.mod @@ -1,89 +1,105 @@ module github.com/AliceO2Group/Control -go 1.12 +go 1.14 -// Hack to build go-md2man needed by viper -// Issue: https://github.com/cpuguy83/go-md2man/issues/58 -replace github.com/russross/blackfriday => github.com/russross/blackfriday v1.5.2 +// github.com/coreos/bbolt@v1.3.4: parsing go.mod: +// module declares its path as: go.etcd.io/bbolt +// but was required as: github.com/coreos/bbolt +replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.3 -// Hack to get a working binary needed by viper -// Issue: https://github.com/spf13/viper/issues/644 -replace github.com/coreos/etcd => github.com/coreos/etcd v3.3.18+incompatible +// Issue: https://github.com/etcd-io/etcd/issues/11563 +replace ( + github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 + google.golang.org/grpc => google.golang.org/grpc v1.26.0 +) require ( - github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792 // indirect - github.com/antonmedv/expr v1.4.3 - github.com/armon/go-metrics v0.3.0 // indirect - github.com/briandowns/spinner v1.8.0 - github.com/coreos/bbolt v1.3.3 // indirect - github.com/coreos/etcd v3.3.18+incompatible // indirect + github.com/antonmedv/expr v1.7.1 + github.com/armon/go-metrics v0.3.3 // indirect + github.com/briandowns/spinner v1.9.0 + github.com/coreos/bbolt v1.3.4 // indirect + github.com/coreos/etcd v3.3.19+incompatible // indirect github.com/coreos/go-semver v0.3.0 // indirect + github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/fatih/color v1.9.0 + github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell v1.3.0 + github.com/gliderlabs/ssh v0.3.0 // indirect github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.1 - github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 // indirect - github.com/golang/protobuf v1.3.3 + github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/protobuf v1.3.5 github.com/google/uuid v1.1.1 - github.com/gorilla/websocket v1.4.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.12.1 // indirect - github.com/hashicorp/consul/api v1.3.0 - github.com/hashicorp/go-immutable-radix v1.1.0 // indirect + github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect + github.com/gorilla/websocket v1.4.2 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect + github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect + github.com/hashicorp/consul/api v1.4.0 + github.com/hashicorp/go-hclog v0.12.1 // indirect + github.com/hashicorp/go-immutable-radix v1.2.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/go-sockaddr v1.0.2 // indirect + github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/memberlist v0.1.4 // indirect - github.com/hashicorp/serf v0.8.5 // indirect + github.com/hashicorp/serf v0.9.0 // indirect github.com/imdario/mergo v0.3.8 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a - github.com/json-iterator/go v1.1.9 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect + github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.1.0 - github.com/lucasb-eyer/go-colorful v1.0.3 // indirect - github.com/mattn/go-isatty v0.0.12 // indirect - github.com/mattn/go-runewidth v0.0.8 // indirect + github.com/mattn/go-colorable v0.1.6 // indirect + github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect + github.com/miekg/dns v1.1.29 // indirect github.com/mitchellh/go-homedir v1.1.0 + github.com/mitchellh/mapstructure v1.2.2 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/olekukonko/tablewriter v0.0.4 - github.com/onsi/ginkgo v1.11.0 - github.com/onsi/gomega v1.8.1 + github.com/onsi/ginkgo v1.12.0 + github.com/onsi/gomega v1.9.0 github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_golang v1.3.0 - github.com/prometheus/common v0.9.1 // indirect - github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 + github.com/prometheus/client_golang v1.5.1 + github.com/prometheus/procfs v0.0.11 // indirect + github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 github.com/rs/xid v1.2.1 - github.com/russross/blackfriday v2.0.0+incompatible // indirect github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.4.2 + github.com/sirupsen/logrus v1.5.0 + github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v0.0.5 + github.com/spf13/cobra v0.0.6 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.6.2 github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 + github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect github.com/valyala/fasttemplate v1.1.0 github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect github.com/xlab/treeprint v1.0.0 - go.etcd.io/bbolt v1.3.3 // indirect - go.uber.org/zap v1.13.0 // indirect - golang.org/x/crypto v0.0.0-20200117160349-530e935923ad // indirect - golang.org/x/net v0.0.0-20200202094626-16171245cfb2 - golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 - golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect - google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898 // indirect - google.golang.org/grpc v1.27.1 - gopkg.in/ini.v1 v1.51.1 // indirect + go.etcd.io/bbolt v1.3.4 // indirect + go.uber.org/zap v1.14.1 // indirect + golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 // indirect + golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect + golang.org/x/net v0.0.0-20200320220750-118fecf932d8 + golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect + golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd + golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect + golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 // indirect + google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 // indirect + google.golang.org/grpc v1.28.0 + gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect + gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 - gopkg.in/yaml.v2 v2.2.7 - sigs.k8s.io/yaml v1.1.0 // indirect + gopkg.in/yaml.v2 v2.2.8 + honnef.co/go/tools v0.0.1-2020.1.3 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index 321662409..ee42b3665 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -14,18 +12,14 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= -github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca h1:QHbltbNkVcw97h4zA/L8gA4o3dJiFvBZ0gyZHrYXHbs= -github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792 h1:Fy2NOZhZ5qlthF55mF48+gBJ2kbdw3q4vFoOMINU5Mo= -github.com/antlr/antlr4 v0.0.0-20200212165322-530c5facc792/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/antonmedv/expr v1.4.3 h1:KHGRkfh2a46a99kMsbO476hhjO1RKiyt6drVU4U2Mq0= -github.com/antonmedv/expr v1.4.3/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= +github.com/antonmedv/expr v1.7.1 h1:KK+VpHu1TtIDQL1ej2kA1VC/4TbtEeuLoNY10y1889Y= +github.com/antonmedv/expr v1.7.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.0 h1:B7AQgHi8QSEi4uHu7Sbsga+IJDU+CENgjxoo81vDUqU= -github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= +github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= +github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -34,8 +28,8 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/briandowns/spinner v1.8.0 h1:SeidJ8ASAayR4Wxl5Of54LHqgi8s6sBvAHg4kxKxia4= -github.com/briandowns/spinner v1.8.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/briandowns/spinner v1.9.0 h1:+OMAisemaHar1hjuJ3Z2hIvNhQl9Y7GLPWUwwz2Pxo8= +github.com/briandowns/spinner v1.9.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -43,24 +37,21 @@ github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/bbolt v1.3.3 h1:n6AiVyVRKQFNb6mJlwESEvvLoDyiTzXX7ORAUlkeBdY= -github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.18+incompatible h1:Zz1aXgDrFFi1nadh58tA9ktt06cmPTwNNP3dXwIq1lE= -github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0 h1:3Jm3tLmsgAYcjC+4Up7hJrFBPr+n7rAqYeSw/SZazuY= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= +github.com/coreos/etcd v3.3.19+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -71,7 +62,6 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -79,15 +69,17 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjr github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= +github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -95,31 +87,33 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -127,48 +121,54 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= +github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= +github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= -github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= +github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= -github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/hashicorp/consul/api v1.3.0 h1:HXNYlRkkM/t+Y/Yhxtwcy02dlYwIaoxzvxPnS+cqy78= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0 h1:UOxjlb4xVNF93jak1mzzoBatyFju9nrkxpVwIp/QqxQ= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= +github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= +github.com/hashicorp/consul/api v1.4.0 h1:jfESivXnO5uLdH650JU/6AnjRoHrLhULq0FnC3Kp9EY= +github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= +github.com/hashicorp/consul/sdk v0.4.0 h1:zBtCfKJZcJDBvSCkQJch4ulp59m1rATFLKwNo/LYY30= +github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0= +github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= +github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.12.1 h1:99niEVkDqsEv3/jINwoOUgGE9L41LHXM4k3jTkV+DdA= +github.com/hashicorp/go-hclog v0.12.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.1.0 h1:vN9wG1D6KG6YHRTWr8512cxGOVgTMEfgEdSj/hr8MPc= -github.com/hashicorp/go-immutable-radix v1.1.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= +github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0 h1:Rqb66Oo1X/eSV1x66xbDccZjhJigjg0+e82kpwzSwCI= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= -github.com/hashicorp/golang-lru v0.5.0 h1:CL2msUPvZTLb5O648aiLNJw3hnBxN2+1Jq8rCOH9wdo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -176,13 +176,13 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= +github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.1.4 h1:gkyML/r71w3FL8gUi74Vk76avkj/9lYAY9lvg0OcoGs= -github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2 h1:YZ7UKsJv+hKjqGVUUbtE3HNj79Eln2oQ75tniF6iPt0= +github.com/hashicorp/memberlist v0.2.0 h1:WeeNspppWi5s1OFefTviPQueC/Bq8dONfvNjPhiEQKE= +github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.8.5 h1:ZynDUIQiA8usmRgPdGPHFdPnb1wgGI9tK3mO9hcAJjc= -github.com/hashicorp/serf v0.8.5/go.mod h1:UpNcs7fFbpKIyZaUuSW6EPiH+eZC7OuyFD+wc1oal+k= +github.com/hashicorp/serf v0.9.0 h1:+Zd/16AJ9lxk9RzfTDyv/TLhZ8UerqYS0/+JGCIDaa0= +github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= @@ -196,10 +196,7 @@ github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt7 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -214,45 +211,47 @@ github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= -github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= +github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= @@ -261,17 +260,22 @@ github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1f github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= +github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= +github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc35r0TV4= +github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -283,15 +287,17 @@ github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hz github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= -github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= +github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= +github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -299,50 +305,46 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0 h1:miYCvYqFXtl/J9FIy8eNpBfYthAEFg+Ys0XyUVEcDsc= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= +github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= +github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= +github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= -github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35 h1:iSQ9CjsvareuUUlmHAQKpn4+ZjZjMtldyygiOH3G3+s= -github.com/rivo/tview v0.0.0-20200108161608-1316ea7a4b35/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= -github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= +github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -350,48 +352,47 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sanity-io/litter v1.1.0 h1:BllcKWa3VbZmOZbDCoszYLk7zCsKHz5Beossi8SUcTc= -github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= +github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= +github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= +github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= +github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2 h1:VUFqw5KcqRf7i70GOzW7N+Q7+gxVBkSSqiXB12+JQ4M= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= @@ -399,22 +400,23 @@ github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jW github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= @@ -429,39 +431,46 @@ github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs= github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= +go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0 h1:sFPn2GLc3poCkfrpIXGhBD2X0CMIo4Q/zSULXrj/+uc= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0 h1:nR6NoDBgAf67s68NhaXbsojM+2gxp3S1hWkHDl27pVU= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= +go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4 h1:HuIa8hRrWRSrqYzx1qI49NNxhdi2PrY7gxVSq1JjLDc= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad h1:Jh8cai0fqIK+f6nG0UgPW5wFk8wmiMhM3AyciDBdtQg= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= +golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -473,28 +482,27 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0 h1:2mqDk8w/o6UmeUCu5Qiq2y7iMf6anbx+YA8d1JFoFrs= +golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2 h1:CCH4IOTTfewWjGOlSp+zGcjutRKlBEZQ6wTn8ozI/nI= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg= +golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -502,63 +510,73 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7 h1:9zdDQZ7Thm29KFXgAX/+yaf3eVbP7djjWp/dXAppNCc= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 h1:oj6yp1cr3vAo7EXJt9jCqfIzrwvFFVD6zI6VO+qNA6s= +golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c h1:hrpEMCZ2O7DR5gC1n2AJGVhrwiEjOi35+jxtIuZpTMo= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898 h1:bKX1IGaSj2XD9yfWNts9HKRdQRH0lOZ0S7Nb8meQSlY= -google.golang.org/genproto v0.0.0-20200211111953-2dc5924e3898/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 h1:XRuIAeTRoXziYGYTVer+YGxVXQBiOhZ8+SpNELP73oQ= +google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.51.1 h1:GyboHr4UqMiLUybYjd22ZjQIKEJEpgtLXtuGbR21Oho= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= +gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= @@ -572,16 +590,17 @@ gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3 h1:fvjTMHxHEw/mxHbtzPi3JCcKXQRAnQTBRo6YCJSVHKI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7 h1:VUgggvou5XRW9mHwD/yXxIYSMtY0zoKQf/v226p2nyo= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= +sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 6355a452f3360e89e3e0512c2c4cc52b95452ab9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 14:57:56 +0100 Subject: [PATCH 0182/2352] [core] Fix issue with misconfigured FairMQ transport --- core/task/channel/channel.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index 752a033ee..e4a1f2d7c 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -86,6 +86,7 @@ func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { if err != nil { return } + c.Transport = aux.Transport return } From 047f1bd3020f0ad95d3957b87f0efa55dc2a9b22 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 15:14:22 +0100 Subject: [PATCH 0183/2352] [core] Correctly acquire TCP/IPC addressing information --- core/task/channel/inbound.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index e014ee44b..f15b5d0ca 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -36,6 +36,29 @@ type Inbound struct { Addressing AddressFormat `yaml:"addressing"` //default: tcp } +func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + aux := struct { + Addressing AddressFormat `yaml:"addressing"` //default: tcp + }{} + err = unmarshal(&aux) + if err != nil { + return + } + + ch := channel{} + err = unmarshal(&ch) + if err != nil { + return + } + if len(aux.Addressing) == 0 { + aux.Addressing = TCP + } + + inbound.Addressing = aux.Addressing + inbound.channel = ch + return +} + /* FairMQ inbound channel property map example: chans.data1.0.address = tcp://*:5555 [provided] From 081028c22319b598e669e3ce9bf34fbaf838235f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Mar 2020 16:04:38 +0100 Subject: [PATCH 0184/2352] [build] Bump to v0.13 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 7e03536b2..9cc4aa225 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 12 -VERSION_PATCH := 91 +VERSION_MINOR := 13 +VERSION_PATCH := 0 From cb8bb2d34832547adf239a98d7d4ad7e09b929d5 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 27 Mar 2020 14:51:20 +0200 Subject: [PATCH 0185/2352] [core] Fix getWorkflowTemplates bug --- core/repos/repomanager.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index fe6695830..14d84c5e9 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -632,10 +632,14 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat for _, repo := range repos { // For every repo get the templates for the revisions matching the revisionPattern; gitRefs to filter tags and/or branches + var templates TemplatesByRevision + var err error if revisionPattern == "" { // If the revision pattern is empty, use the default revision - revisionPattern = repo.DefaultRevision + templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs) + } else { + templates, err = repo.getWorkflows(revisionPattern, gitRefs) } - templates, err := repo.getWorkflows(revisionPattern, gitRefs) + if err != nil { return nil, 0, err } From 38c98f2bfa380c40b193348e6d4469fb28ef5803 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 1 Apr 2020 16:37:49 +0200 Subject: [PATCH 0186/2352] [coconut] Accept CSV as well as JSON-formatted extra-vars --- coconut/cmd/environment_create.go | 2 +- coconut/control/control.go | 66 ++++++++++++++++++++++++++----- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 23f5cb622..c6ce2044c 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -62,5 +62,5 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") - environmentCreateCmd.Flags().StringSliceP("extra-vars", "e", []string{}, "values passed in using the key=value syntax, comma-separated, are interpreted as strings `key1=val1,key2=val2`") + environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } diff --git a/coconut/control/control.go b/coconut/control/control.go index e0e1939ef..4ab0379a2 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -28,9 +28,10 @@ package control import ( "context" + "encoding/csv" + "encoding/json" "errors" "fmt" - "github.com/xlab/treeprint" "io" "os" "regexp" @@ -39,6 +40,9 @@ import ( "strings" "time" + "github.com/xlab/treeprint" + "gopkg.in/yaml.v2" + "github.com/AliceO2Group/Control/coconut" "github.com/AliceO2Group/Control/coconut/protos" "github.com/AliceO2Group/Control/common/logger" @@ -166,6 +170,20 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +func isJson(str string) bool { + var js json.RawMessage + return json.Unmarshal([]byte(str), &js) == nil +} + func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { wfPath, err := cmd.Flags().GetString("workflow-template") if err != nil { @@ -176,27 +194,57 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } - extraVars, err := cmd.Flags().GetStringSlice("extra-vars") + var extraVars string + extraVars, err = cmd.Flags().GetString("extra-vars") if err != nil { return } + + extraVars = strings.TrimSpace(extraVars) if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { err = errors.New("empty list of extra-vars supplied") return } extraVarsMap := make(map[string]string) - for _, entry := range extraVars { - if len(entry) < 3 { // can't be shorter than a=b - err = fmt.Errorf("invalid variable assignment %s", entry) + + if isJson(extraVars) { + extraVarsMapI := make(map[string]interface{}) + err = yaml.Unmarshal([]byte(extraVars), &extraVarsMapI) + if err != nil { + err = fmt.Errorf("cannot parse extra-vars as JSON: %w", err) return } - if strings.Count(entry, "=") != 1 { - err = fmt.Errorf("invalid variable assignment %s", entry) + for k, v := range extraVarsMapI { + marshaledValue, marshalErr := json.Marshal(v) + if marshalErr != nil { + continue + } + extraVarsMap[k] = string(marshaledValue) + } + } else { + extraVarsSlice := make([]string, 0) + extraVarsSlice, err = readAsCSV(extraVars) + if err != nil { + err = fmt.Errorf("cannot parse extra-vars as CSV: %w", err) return } - entryKV := strings.Split(entry, "=") - extraVarsMap[entryKV[0]] = entryKV[1] + + for _, entry := range extraVarsSlice { + if len(entry) < 3 { // can't be shorter than a=b + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + if strings.Count(entry, "=") != 1 { + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + + sanitized := strings.Trim(strings.TrimSpace(entry), "\"'") + + entryKV := strings.Split(sanitized, "=") + extraVarsMap[entryKV[0]] = entryKV[1] + } } // TODO: add support for setting visibility here OCTRL-178 From 54c0c0dca7a7baa384b70dbd8dd8c97f263b8cfd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 1 Apr 2020 16:41:23 +0200 Subject: [PATCH 0187/2352] [core] Fix issue with constraint values not being template-processed --- core/task/task.go | 3 ++- core/workflow/aggregatorrole.go | 9 +------ core/workflow/taskrole.go | 9 +------ core/workflow/template/fieldwrappers.go | 32 +++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 3c5d694f7..8c6053c3c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -321,7 +321,8 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand } // For FAIRMQ tasks, we append FairMQ channel configuration - if class.Control.Mode == controlmode.FAIRMQ { + if class.Control.Mode == controlmode.FAIRMQ || + class.Control.Mode == controlmode.DIRECT { for _, inbCh := range class.Bind { endpoint, ok := t.localBindMap[inbCh.Name] if !ok { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 6dae97d7d..d1bbfd3e1 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -91,14 +91,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) template.STAGE3: template.Fields{ template.WrapPointer(&r.Name), }, - template.STAGE4: func() (fields template.Fields) { - fields = make(template.Fields, len(r.Constraints) * 2) - for i, constr := range r.Constraints { - fields[i * 2] = template.WrapPointer(&constr.Attribute) - fields[i * 2 + 1] = template.WrapPointer(&constr.Value) - } - return - }(), + template.STAGE4: template.WrapConstraints(r.Constraints), } // TODO: push cached templates here diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index efe089b2b..7cc531fac 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -85,14 +85,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.Name), template.WrapPointer(&t.LoadTaskClass), }, - template.STAGE4: func() (fields template.Fields) { - fields = make(template.Fields, len(t.Constraints) * 2) - for i, constr := range t.Constraints { - fields[i * 2] = template.WrapPointer(&constr.Attribute) - fields[i * 2 + 1] = template.WrapPointer(&constr.Value) - } - return - }(), + template.STAGE4: template.WrapConstraints(t.Constraints), } // FIXME: push cached templates here diff --git a/core/workflow/template/fieldwrappers.go b/core/workflow/template/fieldwrappers.go index 0e83573e9..eec15303d 100644 --- a/core/workflow/template/fieldwrappers.go +++ b/core/workflow/template/fieldwrappers.go @@ -24,6 +24,8 @@ package template +import "github.com/AliceO2Group/Control/core/task/constraint" + type Field interface { Get() string Set(value string) @@ -103,3 +105,33 @@ func (t *sliceItemWrapper) Get() string { func (t *sliceItemWrapper) Set(value string) { t.setter(value) } + + +type constraintWrapper struct{ + getter func() string + setter func(value string) +} + +func WrapConstraints(items constraint.Constraints) Fields { + fields := make(Fields, 0) + for i, _ := range items { + index := i // we need a local copy for the getter/setter closures + fields = append(fields, &sliceItemWrapper{ + getter: func() string { + return items[index].Value + }, + setter: func(value string) { + items[index].Value = value + }, + }) + } + return fields +} + +func (a *constraintWrapper) Get() string { + return a.getter() +} + +func (a *constraintWrapper) Set(value string) { + a.setter(value) +} \ No newline at end of file From 06584cc26d4b5e15cfb5f95df3049a986377acd3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 1 Apr 2020 16:51:19 +0200 Subject: [PATCH 0188/2352] [build] Bump to v0.13.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9cc4aa225..a6fb0a633 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 37469376f38ada1abdff7a6be2217bb4ef960bf4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 2 Apr 2020 12:12:54 +0300 Subject: [PATCH 0189/2352] [core] Add type conversion functions to template system --- core/workflow/template/fields.go | 4 ++++ core/workflow/template/stack.go | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index 4f99a0ff3..23cce1618 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -164,12 +164,16 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri func (fields Fields) Execute(parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) + strOpStack := MakeStrOperationFuncMap() for k, v := range varStack { environment[k] = v } for k, v := range objStack { environment[k] = v } + for k, v := range strOpStack { + environment[k] = v + } for _, field := range fields { buf := new(bytes.Buffer) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 2a8b3ba11..ef16baf8c 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -27,6 +27,8 @@ package template import ( "encoding/json" "fmt" + "strconv" + "strings" texttemplate "text/template" "github.com/AliceO2Group/Control/core/the" @@ -72,4 +74,30 @@ func MakeJsonConversionFuncMap() map[string]interface{} { return }, } +} + +func MakeStrOperationFuncMap() map[string]interface{} { + return map[string]interface{}{ + "Atoi": func(in string) (out int) { + var err error + out, err = strconv.Atoi(in) + if err != nil { + log.WithError(err).Warn("error converting string/int in template system") + return + } + return + }, + "Itoa": func(in int) (out string) { + out = strconv.Itoa(in) + return + }, + "TrimQuotes": func(in string) (out string) { + out = strings.Trim(in, "\"") + return + }, + "TrimSpace": func(in string) (out string) { + out = strings.TrimSpace(in) + return + }, + } } \ No newline at end of file From 91eda2efcaf40403d02a9cf620e2f5de26a0ec2a Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 8 Apr 2020 18:36:31 +0300 Subject: [PATCH 0190/2352] [configuration] ensure key exists in GetNextUInt32 --- configuration/consulsource.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 9c7d2db24..2f69d49a4 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -52,10 +52,16 @@ func NewConsulSource(uri string) (cc *ConsulSource, err error) { } func (cc *ConsulSource) GetNextUInt32(key string) (value uint32, err error) { - kvp, _, err := cc.kv.Get(formatKey(key), &api.QueryOptions{RequireConsistent: true}) + var kvp *api.KVPair + kvp, _, err = cc.kv.Get(formatKey(key), &api.QueryOptions{RequireConsistent: true}) if err != nil { return } + if kvp == nil { + // Key doesn't exist and we should create kvp with value 0. We use cas=0, + // in order Check-And-Set to put the key if it does not already exist. + kvp = &api.KVPair{Key: formatKey(key), Value: []byte("0"), ModifyIndex: uint64(0)} + } var value64 uint64 value64, err = strconv.ParseUint(string(kvp.Value[:]), 10, 32) if err != nil { From a4be24c13a1f7df7edb9802b056e81ff75c89715 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 2 Apr 2020 17:16:34 +0200 Subject: [PATCH 0191/2352] [core] Only reconcile tasks if they are killable --- core/scheduler.go | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 91b29769d..22d1a7a6d 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -830,7 +830,8 @@ func statusUpdate(state *internalState) events.HandlerFunc { } // What's the new task state? - switch st := s.GetState(); st { + updatedState := s.GetState() + switch updatedState { case mesos.TASK_FINISHED: log.WithPrefix("scheduler").Debug("state lock") @@ -853,7 +854,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ "taskId": s.GetTaskID().Value, - "state": st.String(), + "state": updatedState.String(), "reason": s.GetReason().String(), "source": s.GetSource().String(), "message": s.GetMessage(), @@ -861,9 +862,15 @@ func statusUpdate(state *internalState) events.HandlerFunc { Info("task inactive exception") } - // This will check if the task update is from a reconciliation and will kill it with a mesos call. - // Reconcilation tasks are not part of the taskman.roster - if s.GetReason().String() == "REASON_RECONCILIATION" { + // This will check if the task update is from a reconciliation, as well as whether the task + // is in a state in which a mesos Kill call is possible. + // Reconcilation tasks are not part of the taskman.roster + if s.GetReason().String() == "REASON_RECONCILIATION" && + (updatedState == mesos.TASK_STAGING || + updatedState == mesos.TASK_STARTING || + updatedState == mesos.TASK_RUNNING || + updatedState == mesos.TASK_KILLING || + updatedState == mesos.TASK_UNKNOWN) { killCall := calls.Kill(s.TaskID.GetValue(), s.AgentID.GetValue()) calls.CallNoData(ctx, state.cli, killCall) } else { From c34e56256f6e047b50e75344c4878e38273696b9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 6 Apr 2020 14:30:13 +0200 Subject: [PATCH 0192/2352] [core] Improve logging of task load error conditions --- core/environment/manager.go | 2 +- core/task/manager.go | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 5bc056b43..ac3936272 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -76,7 +76,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { - err = fmt.Errorf("cannot load workflow template: %s", err.Error()) + err = fmt.Errorf("cannot load workflow template: %w", err) return env.id, err } diff --git a/core/task/manager.go b/core/task/manager.go index 3e7a9b326..25c41a214 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -139,14 +139,15 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } - yamlData, err = ioutil.ReadFile(filepath.Join(the.ConfSvc().GetReposPath(), taskClassFile)) + taskTemplatePath := filepath.Join(the.ConfSvc().GetReposPath(), taskClassFile) + yamlData, err = ioutil.ReadFile(taskTemplatePath) if err != nil { return nil, err } taskClassStruct := Class{} err = yaml.Unmarshal(yamlData, &taskClassStruct) if err != nil { - return nil, err + return nil, fmt.Errorf("task template load error (template=%s): %w", taskTemplatePath, err) } taskClassStruct.Identifier.repoIdentifier = repo.GetIdentifier() From e572c4d461a774994796d0349ae692eb46ccf932 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Apr 2020 15:08:30 +0200 Subject: [PATCH 0193/2352] [core] Fix iterator child reparenting bug which broke constraints --- core/workflow/aggregatorrole.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index d1bbfd3e1..0e350ffac 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -130,6 +130,9 @@ func (r *aggregatorRole) copy() copyable { roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } + for i := 0; i < len(rCopy.Roles); i++ { + rCopy.Roles[i].setParent(&rCopy) + } return &rCopy } From 757ef14b430ef8d294fbb5b69e2ed7b02c5bd04a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Apr 2020 15:54:48 +0200 Subject: [PATCH 0194/2352] [executor] Make debug output more useful --- executor/executable/controllabletask.go | 33 +++++++++++++++++++------ 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6aa15d980..6c2b44ddf 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -103,20 +103,28 @@ func (t *ControllableTask) Launch() error { elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "elapsed": elapsed.String(), - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": t.tci.Value, + "elapsed": elapsed.String(), + }). Debug("polling task for IDLE state reached") response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("task", t.ti.Name). + WithFields(logrus.Fields{ + "state": response.GetState(), + "task": t.ti.Name, + "command": t.tci.Value, + }). Info("cannot query task status") } else { - log.WithField("state", response.GetState()). - WithField("task", t.ti.Name). + log.WithFields(logrus.Fields{ + "state": response.GetState(), + "task": t.ti.Name, + "command": t.tci.Value, + }). Debug("task status queried") } // NOTE: we acquire the transitioner-dependent STANDBY equivalent state @@ -125,6 +133,7 @@ func (t *ControllableTask) Launch() error { if reachedState == "STANDBY" && err == nil { log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). + WithField("command", t.tci.Value). Debug("task running and ready for control input") break } else if reachedState == "DONE" || reachedState == "ERROR" { @@ -143,6 +152,7 @@ func (t *ControllableTask) Launch() error { return } else { log.WithField("task", t.ti.Name). + WithField("command", t.tci.Value). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) time.Sleep(startupPollingInterval) elapsed += startupPollingInterval @@ -201,12 +211,18 @@ func (t *ControllableTask) Launch() error { err = taskCmd.Wait() // ^ when this unblocks, the task is done + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": t.tci.Value, + }).Debug("task done, preparing final update") pendingState := mesos.TASK_FINISHED if err != nil { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, + "command": t.tci.Value, "error": err.Error(), }). Error("process terminated with error") @@ -232,6 +248,7 @@ func (t *ControllableTask) Launch() error { "errStdout": errStdout, "id": t.ti.TaskID.Value, "task": t.ti.Name, + "command": t.tci.Value, }). Warning("failed to capture stdout or stderr of task") } @@ -273,7 +290,7 @@ func (t *ControllableTask) Kill() error { if err != nil { log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Error("cannot query task status") } else { - log.WithField("state", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried") + log.WithField("nativeState", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried for upcoming soft kill") } // NOTE: we acquire the transitioner-dependent STANDBY equivalent state From 75d7067fbfcc2bfb343e328f97124160af86a136 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Apr 2020 16:50:11 +0200 Subject: [PATCH 0195/2352] [core] Ensure early reparenting of generated roles --- core/workflow/aggregatorrole.go | 1 + core/workflow/iteratorrole.go | 3 +++ 2 files changed, 4 insertions(+) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0e350ffac..2481a9aaf 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -117,6 +117,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) r.resolveOutboundChannelTargets() for _, role := range r.Roles { + role.setParent(r) err = role.ProcessTemplates(workflowRepo) if err != nil { return diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 56b6c8204..e55fb748e 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -178,6 +178,9 @@ func (i *iteratorRole) expandTemplate() (err error) { } i.Roles = roles + for j := 0; j < len(i.Roles); j++ { + i.Roles[j].setParent(i.GetParent()) + } return } From 23ec77bd067adbd57bce99d501e9235abc3cf783 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Apr 2020 17:33:30 +0200 Subject: [PATCH 0196/2352] [core] Make JSON template functions available in all contexts --- core/task/task.go | 2 +- core/workflow/iteratorrange.go | 2 +- core/workflow/template/stack.go | 41 +++++++++++++++------------------ 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 8c6053c3c..0c0a590d3 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -304,7 +304,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand return } - objStack := template.MakeJsonConversionFuncMap() + objStack := make(map[string]interface{}) objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) for k, v := range t.GetProperties() { diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index 26bcacfe3..d54248c46 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -48,7 +48,7 @@ func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, fields := template.Fields{ template.WrapPointer(&f.Range), } - err = fields.Execute("", varStack, template.MakeJsonConversionFuncMap(), make(map[string]texttemplate.Template)) + err = fields.Execute("", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) if err != nil { return } diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index ef16baf8c..573de7578 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -53,29 +53,6 @@ func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { } } -func MakeJsonConversionFuncMap() map[string]interface{} { - return map[string]interface{} { - "FromJson": func(in string) (out interface{}) { - bytes := []byte(in) - err := yaml.Unmarshal(bytes, out) - if err != nil { - log.WithError(err).Warn("error unmarshaling JSON/YAML in template system") - return - } - return - }, - "ToJson": func(in interface{}) (out string) { - bytes, err := json.Marshal(in) - if err != nil { - log.WithError(err).Warn("error marshaling JSON/YAML in template system") - return - } - out = string(bytes) - return - }, - } -} - func MakeStrOperationFuncMap() map[string]interface{} { return map[string]interface{}{ "Atoi": func(in string) (out int) { @@ -99,5 +76,23 @@ func MakeStrOperationFuncMap() map[string]interface{} { out = strings.TrimSpace(in) return }, + "FromJson": func(in string) (out interface{}) { + bytes := []byte(in) + err := yaml.Unmarshal(bytes, out) + if err != nil { + log.WithError(err).Warn("error unmarshaling JSON/YAML in template system") + return + } + return + }, + "ToJson": func(in interface{}) (out string) { + bytes, err := json.Marshal(in) + if err != nil { + log.WithError(err).Warn("error marshaling JSON/YAML in template system") + return + } + out = string(bytes) + return + }, } } \ No newline at end of file From 70d49e2c4686e82214af8651978be88072a381ca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Apr 2020 12:22:24 +0200 Subject: [PATCH 0197/2352] [build] Bump to v0.13.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a6fb0a633..3463c3fb0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From a325fd27f3a2277a3ce3f493edd7882b89d3472e Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 17:34:03 +0200 Subject: [PATCH 0198/2352] Add initial basic GH Action --- .github/workflows/control.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 .github/workflows/control.yml diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml new file mode 100644 index 000000000..f63d1c626 --- /dev/null +++ b/.github/workflows/control.yml @@ -0,0 +1,22 @@ +name: Control + +on: + pull_request: + push: + branches: + - 'master' + - 'dev' +jobs: + control-basic-check: + name: Control Basic Make Check + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macOS-latest, ubuntu-18.04] + steps: + - uses: actions/checkout@v1 + - uses: actions/setup-go@v1 + with: + go-version: '1.13' + - run: (make vendor) + - run: make \ No newline at end of file From 926053a063790ce3307c85b7369909b720896210 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 17:34:36 +0200 Subject: [PATCH 0199/2352] Add test branch on push --- .github/workflows/control.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index f63d1c626..a77537e40 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -6,6 +6,7 @@ on: branches: - 'master' - 'dev' + - 'feature/CTRL/add-basic-github-action' jobs: control-basic-check: name: Control Basic Make Check From f805278ba65c056d117f9387ff3f8783907a481a Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 17:38:34 +0200 Subject: [PATCH 0200/2352] Add go version 1.12 --- .github/workflows/control.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index a77537e40..5f7dad04e 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -1,12 +1,11 @@ -name: Control +name: Control Basic Make Check on: pull_request: push: branches: - 'master' - - 'dev' - - 'feature/CTRL/add-basic-github-action' + jobs: control-basic-check: name: Control Basic Make Check @@ -14,10 +13,11 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-18.04] + go: [ '1.13', '1.12' ] steps: - uses: actions/checkout@v1 - uses: actions/setup-go@v1 with: - go-version: '1.13' + go-version: ${{matrix.go}} - run: (make vendor) - - run: make \ No newline at end of file + - run: (make) \ No newline at end of file From e92cb384daf589813326995de9f2f331518f6cef Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 18:17:16 +0200 Subject: [PATCH 0201/2352] [OGUI-225] Tetstfailure of command --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index c1010b5f0..5580204c6 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ replace ( ) require ( - github.com/antonmedv/expr v1.7.1 + github.com/antonm2edv/expr v1.7.1 github.com/armon/go-metrics v0.3.3 // indirect github.com/briandowns/spinner v1.9.0 github.com/coreos/bbolt v1.3.4 // indirect From d38dec1d4524f7677d4f439cdf73113843d62155 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 18:20:20 +0200 Subject: [PATCH 0202/2352] [OGUI-225] Fix build --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 5580204c6..c1010b5f0 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ replace ( ) require ( - github.com/antonm2edv/expr v1.7.1 + github.com/antonmedv/expr v1.7.1 github.com/armon/go-metrics v0.3.3 // indirect github.com/briandowns/spinner v1.9.0 github.com/coreos/bbolt v1.3.4 // indirect From 332907cb19770fb8d0ee5dfae051a24b537909a8 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Fri, 10 Apr 2020 18:29:13 +0200 Subject: [PATCH 0203/2352] [OGUI-525] Change name --- .github/workflows/control.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 5f7dad04e..3201d08d4 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -1,4 +1,4 @@ -name: Control Basic Make Check +name: AliECS Core on: pull_request: @@ -8,7 +8,7 @@ on: jobs: control-basic-check: - name: Control Basic Make Check + name: Basic Make Check runs-on: ${{ matrix.os }} strategy: matrix: From 08c05b3792e691aa41299be9e03e66ec27d618aa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Apr 2020 17:03:35 +0200 Subject: [PATCH 0204/2352] [core] Only set a parent role for successfully deployed tasks --- core/task/manager.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index 25c41a214..ae7bad7df 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -353,9 +353,11 @@ func (m *Manager) AcquireTasks(envId uuid.Array, taskDescriptors Descriptors) (e // Finally, we write to the roster. Point of no return! for taskPtr, _ := range deployedTasks { m.roster = append(m.roster, taskPtr) - taskPtr.parent.SetTask(taskPtr) } if deploymentSuccess { + for taskPtr, _ := range deployedTasks { + taskPtr.parent.SetTask(taskPtr) + } for taskPtr, descriptor := range tasksAlreadyRunning { taskPtr.parent = descriptor.TaskRole taskPtr.parent.SetTask(taskPtr) From 9ebf6a75950bd50575bb73bb13ca46dff75744d3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Apr 2020 17:04:33 +0200 Subject: [PATCH 0205/2352] [core] Fix issue with broken template function FromJson --- core/workflow/template/stack.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 573de7578..2cc7531d4 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -32,7 +32,7 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/core/the" - "gopkg.in/yaml.v2" + "github.com/sirupsen/logrus" ) type GetConfigFunc func(string) string @@ -78,7 +78,12 @@ func MakeStrOperationFuncMap() map[string]interface{} { }, "FromJson": func(in string) (out interface{}) { bytes := []byte(in) - err := yaml.Unmarshal(bytes, out) + err := json.Unmarshal(bytes, &out) + log.WithFields(logrus.Fields{ + "in": in, + "out": out, + }). + Debug("FromJson") if err != nil { log.WithError(err).Warn("error unmarshaling JSON/YAML in template system") return From 27e9488746c8901814c5cf42917fd3b3da32255a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Apr 2020 12:53:33 +0200 Subject: [PATCH 0206/2352] [core] Strip color sequences from workflow dumps --- core/workflow/load.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/workflow/load.go b/core/workflow/load.go index 270482934..bb1c0c714 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -68,6 +68,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user workflow = root timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) + pp.ColoringEnabled = false if viper.GetBool("dumpWorkflows") { f, _ := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) _, _ = pp.Fprintln(f, workflow) From e8ebc04af8281871e7fc80b0c283a9b3dbd9c48f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Apr 2020 12:54:21 +0200 Subject: [PATCH 0207/2352] [core] Refactor template field wrappers and add generic get/set wrapper --- core/workflow/template/fieldwrappers.go | 63 +++++++++---------------- 1 file changed, 22 insertions(+), 41 deletions(-) diff --git a/core/workflow/template/fieldwrappers.go b/core/workflow/template/fieldwrappers.go index eec15303d..c4e5681aa 100644 --- a/core/workflow/template/fieldwrappers.go +++ b/core/workflow/template/fieldwrappers.go @@ -47,17 +47,33 @@ func (t *pointerWrapper) Set(value string) { *t.field = value } +type GetterFunc func() string +type SetterFunc func(value string) +type genericWrapper struct { + getter GetterFunc + setter SetterFunc +} + +func (t *genericWrapper) Get() string { + return t.getter() +} + +func (t *genericWrapper) Set(value string) { + t.setter(value) +} -type mapItemWrapper struct { - getter func() string - setter func(value string) +func WrapGeneric(getterF GetterFunc, setterF SetterFunc) Field { + return &genericWrapper{ + getter: getterF, + setter: setterF, + } } func WrapMapItems(items map[string]string) Fields { fields := make(Fields, 0) for k, _ := range items { key := k // we need a local copy for the getter/setter closures - fields = append(fields, &mapItemWrapper{ + fields = append(fields, &genericWrapper{ getter: func() string { return items[key] }, @@ -69,24 +85,11 @@ func WrapMapItems(items map[string]string) Fields { return fields } -func (t *mapItemWrapper) Get() string { - return t.getter() -} - -func (t *mapItemWrapper) Set(value string) { - t.setter(value) -} - -type sliceItemWrapper struct { - getter func() string - setter func(value string) -} - func WrapSliceItems(items []string) Fields { fields := make(Fields, 0) for i, _ := range items { index := i // we need a local copy for the getter/setter closures - fields = append(fields, &sliceItemWrapper{ + fields = append(fields, &genericWrapper{ getter: func() string { return items[index] }, @@ -98,25 +101,11 @@ func WrapSliceItems(items []string) Fields { return fields } -func (t *sliceItemWrapper) Get() string { - return t.getter() -} - -func (t *sliceItemWrapper) Set(value string) { - t.setter(value) -} - - -type constraintWrapper struct{ - getter func() string - setter func(value string) -} - func WrapConstraints(items constraint.Constraints) Fields { fields := make(Fields, 0) for i, _ := range items { index := i // we need a local copy for the getter/setter closures - fields = append(fields, &sliceItemWrapper{ + fields = append(fields, &genericWrapper{ getter: func() string { return items[index].Value }, @@ -127,11 +116,3 @@ func WrapConstraints(items constraint.Constraints) Fields { } return fields } - -func (a *constraintWrapper) Get() string { - return a.getter() -} - -func (a *constraintWrapper) Set(value string) { - a.setter(value) -} \ No newline at end of file From 9223738ff330572573bb8357f1d603b1c9616f9e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Apr 2020 12:55:04 +0200 Subject: [PATCH 0208/2352] [core] Use new template engine to process channel connections This completes the removal of the old text/template based solution. --- core/workflow/aggregatorrole.go | 6 +-- core/workflow/rolebase.go | 65 ++++++--------------------------- core/workflow/taskrole.go | 5 ++- 3 files changed, 18 insertions(+), 58 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 2481a9aaf..f28640536 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -91,7 +91,9 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) template.STAGE3: template.Fields{ template.WrapPointer(&r.Name), }, - template.STAGE4: template.WrapConstraints(r.Constraints), + template.STAGE4: append( + template.WrapConstraints(r.Constraints), + r.wrapConnectFields()...), } // TODO: push cached templates here @@ -114,8 +116,6 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) r.Vars.Set(k, v) } - r.resolveOutboundChannelTargets() - for _, role := range r.Roles { role.setParent(r) err = role.ProcessTemplates(workflowRepo) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 418dbf046..0f9347f23 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -25,9 +25,7 @@ package workflow import ( - "bytes" "fmt" - texttemplate "text/template" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" @@ -185,58 +183,19 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) return } -func (r *roleBase) resolveOutboundChannelTargets() { - // TODO this func should return err - - type _parentRole interface { - GetParent() Updatable - GetPath() string - } - - funcMap := texttemplate.FuncMap{ - "this": func() string { - return r.GetPath() - }, - "parent": func() string { - p := r.GetParent() - if p == nil { - log.WithFields(logrus.Fields{"error": "role has no parent", "role": r.GetPath()}).Error("workflow configuration error") - return "" - } - return p.GetPath() - }, - "up": func(levels int) string { - if levels <= 0 { - return r.GetPath() - } - var p _parentRole = r - for i := 0; i < levels; i++ { - p = p.GetParent() - if p == nil { - log.WithFields(logrus.Fields{"error": "role has no ancestor", "role": r.GetPath()}).Error("workflow configuration error") - return "" - } - } - return p.GetPath() - }, - } - - for i, ch := range r.Connect { - tmpl := texttemplate.New(r.GetPath()) - parsed, err := tmpl.Funcs(funcMap).Parse(ch.Target) - if err != nil { - log.WithError(err).WithFields(logrus.Fields{"role": r.GetPath(), "channel": ch.Name, "target": ch.Target}).Error("cannot parse template for outbound channel target") - continue - } - buf := new(bytes.Buffer) - err = parsed.Execute(buf, struct{}{}) - if err != nil { - log.WithError(err).WithFields(logrus.Fields{"role": r.GetPath(), "channel": ch.Name, "target": ch.Target}).Error("cannot execute template for outbound channel target") - continue - } - // Finally we write the result back to the target string - r.Connect[i].Target = buf.String() +func (r *roleBase) wrapConnectFields() template.Fields { + connectFields := make(template.Fields, len(r.Connect)) + for i, _ := range r.Connect { + connectFields[i] = template.WrapGeneric( + func() string { + return r.Connect[i].Target + }, + func(value string) { + r.Connect[i].Target = value + }, + ) } + return connectFields } func (r *roleBase) copy() copyable { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 7cc531fac..f00f52d16 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -85,7 +85,9 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.Name), template.WrapPointer(&t.LoadTaskClass), }, - template.STAGE4: template.WrapConstraints(t.Constraints), + template.STAGE4: append( + template.WrapConstraints(t.Constraints), + t.wrapConnectFields()...), } // FIXME: push cached templates here @@ -109,7 +111,6 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { } t.resolveTaskClassIdentifier(workflowRepo) - t.resolveOutboundChannelTargets() return } From b7941ddc230fe81fed77b1b392f644bcc511cba9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Apr 2020 12:57:03 +0200 Subject: [PATCH 0209/2352] [executor] Ensure correct command output in executor debug --- executor/executable/controllabletask.go | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6c2b44ddf..597575a6d 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -60,12 +60,16 @@ func (t *ControllableTask) Launch() error { stderrIn, _ := taskCmd.StderrPipe() err := taskCmd.Start() + var tciCommandStr string + if t.tci.Value != nil { + tciCommandStr = *t.tci.Value + } if err != nil { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err, - "command": *t.tci.Value, + "command": tciCommandStr, }). Error("failed to run task") @@ -105,7 +109,7 @@ func (t *ControllableTask) Launch() error { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, "elapsed": elapsed.String(), }). Debug("polling task for IDLE state reached") @@ -116,14 +120,14 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, }). Info("cannot query task status") } else { log.WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, }). Debug("task status queried") } @@ -133,7 +137,7 @@ func (t *ControllableTask) Launch() error { if reachedState == "STANDBY" && err == nil { log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). - WithField("command", t.tci.Value). + WithField("command", tciCommandStr). Debug("task running and ready for control input") break } else if reachedState == "DONE" || reachedState == "ERROR" { @@ -152,7 +156,7 @@ func (t *ControllableTask) Launch() error { return } else { log.WithField("task", t.ti.Name). - WithField("command", t.tci.Value). + WithField("command", tciCommandStr). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) time.Sleep(startupPollingInterval) elapsed += startupPollingInterval @@ -214,7 +218,7 @@ func (t *ControllableTask) Launch() error { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, }).Debug("task done, preparing final update") pendingState := mesos.TASK_FINISHED @@ -222,7 +226,7 @@ func (t *ControllableTask) Launch() error { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, "error": err.Error(), }). Error("process terminated with error") @@ -248,7 +252,7 @@ func (t *ControllableTask) Launch() error { "errStdout": errStdout, "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": t.tci.Value, + "command": tciCommandStr, }). Warning("failed to capture stdout or stderr of task") } From 030bb367e1ef03bf32cbf2d3d089e40fadbacc59 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Apr 2020 10:27:54 +0200 Subject: [PATCH 0210/2352] [core] Allow parametrizing launch time values for all tasks --- core/task/task.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 0c0a590d3..621be6ac2 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -165,7 +165,15 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // If it's a basic task, we parametrize its arguments // TODO: the task payload should be shipped on CONFIGURE and not on deployment, // because this way we cannot reconfigure a basic task - if class.Control.Mode == controlmode.BASIC { + // FIXME: normally we should only allow parametrizing launch-time options such + // as the command value and argument for BASIC tasks, as they get + // unique classes. + // In order to support non-trivial QC workflows we temporarily allow + // parametrizing these values for all control modes. + // THIS BREAKS TASK CLASS REUSE! See OCTRL-227 + if class.Control.Mode == controlmode.BASIC || + class.Control.Mode == controlmode.DIRECT || + class.Control.Mode == controlmode.FAIRMQ { var varStack map[string]string varStack, err = role.ConsolidatedVarStack() if err != nil { @@ -193,7 +201,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err).Error("cannot resolve templates for task command info") - return } } From d98e2c3cd02ef53fa2fcb4bd55de4f7a7257eb1f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Apr 2020 10:28:36 +0200 Subject: [PATCH 0211/2352] [occ] Bump dependencies --- occ/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index e3ab6c47d..428f1d5ad 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -160,7 +160,7 @@ find_package(Boost 1.68 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) # Protobuf set(protobuf_MODULE_COMPATIBLE TRUE) -find_package(protobuf 3.7.1 CONFIG REQUIRED) +find_package(protobuf 3.11.4 CONFIG REQUIRED) message(STATUS "Using protobuf ${protobuf_VERSION}") # OpenSSL on Mac @@ -169,7 +169,7 @@ if (APPLE) endif() # gRPC -find_package(gRPC 1.19.1 CONFIG REQUIRED) +find_package(gRPC 1.27.3 CONFIG REQUIRED) message(STATUS "Using gRPC ${gRPC_VERSION}") # gRPC C++ plugin From ec37663defd1c5dbe20390742e3666b40746508e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Apr 2020 10:29:04 +0200 Subject: [PATCH 0212/2352] [build] Bump to v0.13.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3463c3fb0..a7d7d0eef 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From 2823c3892258dea9cb4b464c3d37e26df3f3215d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 27 Apr 2020 16:16:14 +0200 Subject: [PATCH 0213/2352] [core] Push special variables to task.BuildTaskCommand task_name task_id task_class_name task_hostname environment_id task_parent_role --- core/task/task.go | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/core/task/task.go b/core/task/task.go index 621be6ac2..0050b305b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -155,6 +155,17 @@ func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { return t.commandInfo } +func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { + varStack := make(map[string]string) + varStack["task_name"] = t.GetName() + varStack["task_id"] = t.GetTaskId() + varStack["task_class_name"] = t.GetClassName() + varStack["task_hostname"] = t.GetHostname() + varStack["environment_id"] = role.GetEnvironmentId().UUID().String() + varStack["task_parent_role"] = role.GetPath() + return varStack +} + // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. func (t *Task) BuildTaskCommand(role parentRole) (err error) { @@ -175,18 +186,32 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { class.Control.Mode == controlmode.DIRECT || class.Control.Mode == controlmode.FAIRMQ { var varStack map[string]string + + // First we get the full varStack from the parent role, and + // consolidate it. varStack, err = role.ConsolidatedVarStack() if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err).Error("cannot fetch variables stack for task command info") return } + + // We wrap the parent varStack around the class Defaults, ensuring + // the class Defaults are overridden by anything else. varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) if err != nil { log.WithError(err).Error("cannot fetch task class defaults for task command info") return } + // Finally we build the task-specific special values, and write them + // into the varStack (overwriting anything). + specialVarStack := t.buildSpecialVarStack(role) + for k, v := range specialVarStack { + varStack[k] = v + } + + // Prepare the fields to be subject to templating fields := append( template.Fields{ template.WrapPointer(cmd.Value), @@ -300,17 +325,30 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand if t.parent == nil { return } + + // First we get the full varStack from the parent role, and + // consolidate it. varStack, err := t.parent.ConsolidatedVarStack() if err != nil { log.WithError(err).Error("cannot fetch variables stack for property map") return } + + // We wrap the parent varStack around the class Defaults, ensuring + // the class Defaults are overridden by anything else. varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) if err != nil { log.WithError(err).Error("cannot fetch task class defaults for property map") return } + // Finally we build the task-specific special values, and write them + // into the varStack (overwriting anything). + specialVarStack := t.buildSpecialVarStack(t.parent) + for k, v := range specialVarStack { + varStack[k] = v + } + objStack := make(map[string]interface{}) objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) From b226f22b9736144e8fc45c39613294d58ea3ea41 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 24 Apr 2020 17:19:00 +0300 Subject: [PATCH 0214/2352] [core] handle external kill of controlled process --- core/environment/transition_error.go | 56 ++++++++++++++++++++++++++++ core/scheduler.go | 12 ++++++ 2 files changed, 68 insertions(+) create mode 100644 core/environment/transition_error.go diff --git a/core/environment/transition_error.go b/core/environment/transition_error.go new file mode 100644 index 000000000..ee0377645 --- /dev/null +++ b/core/environment/transition_error.go @@ -0,0 +1,56 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package environment + +import ( + "errors" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/task" +) + +func NewErrorTransition(taskman *task.Manager) Transition { + return &ErrorTransition{ + baseTransition: baseTransition{ + name: "GO_ERROR", + taskman: taskman, + }, + } +} + +type ErrorTransition struct { + baseTransition +} + +func (t ErrorTransition) do(env *Environment) (err error) { + if env == nil { + return errors.New("cannot transition in NIL environment") + } + + log.WithField(infologger.Run, env.currentRunNumber).Info("error in environment") + + env.currentRunNumber = 0 + + return +} \ No newline at end of file diff --git a/core/scheduler.go b/core/scheduler.go index 22d1a7a6d..8c1d4c998 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -860,6 +860,18 @@ func statusUpdate(state *internalState) events.HandlerFunc { "message": s.GetMessage(), }). Info("task inactive exception") + taskIDValue := s.GetTaskID().Value + t := state.taskman.GetTask(taskIDValue) + if t != nil && t.IsLocked() { + go func() { + env, _ := state.environments.Environment(t.GetEnvironmentId().UUID()) + err := env.TryTransition(environment.NewErrorTransition(state.taskman)) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot transition environment to ERROR") + } + state.taskman.UpdateTaskState(taskIDValue, "ERROR") + }() + } } // This will check if the task update is from a reconciliation, as well as whether the task From d2d3601c7f279cc287eea511d09ffb90bf3ab5a8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 24 Apr 2020 17:24:26 +0300 Subject: [PATCH 0215/2352] [executor] quit executor if killed process was the last active --- executor/executor.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/executor/executor.go b/executor/executor.go index c2c6e3d43..32dd226b5 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -316,6 +316,10 @@ func sendFailedTasks(state *internalState) { } else { // If we have successfully notified Mesos, we clear our list of failed tasks. delete(state.failedTasks, taskID) + // If there aren't any failed and active tasks, we request to shutdown the executor. + if len(state.failedTasks) == 0 && len(state.activeTasks) == 0 { + state.shouldQuit = true + } } } } From 1bb85e30393e12b20475daf85b513ff5d85cb1fa Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 28 Apr 2020 14:39:08 +0300 Subject: [PATCH 0216/2352] [core] Update environment state through the tasks --- core/environment/environment.go | 11 ++++++ core/environment/manager.go | 27 ++++++++++++++ core/environment/transition_error.go | 56 ---------------------------- core/scheduler.go | 9 +---- core/task/state.go | 3 ++ core/workflow/safestate.go | 6 +++ 6 files changed, 48 insertions(+), 64 deletions(-) delete mode 100644 core/environment/transition_error.go diff --git a/core/environment/environment.go b/core/environment/environment.go index 3d8841650..2fe4ac3d2 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -208,4 +208,15 @@ func (env *Environment) GetCurrentRunNumber() (rn uint32) { return 0 } return env.currentRunNumber +} + +// setState will move environment to a given state from current state. +// The call does not trigger any callbacks, if defined. +func (env *Environment) setState(state string) { + if env == nil { + return + } + env.Mu.RLock() + defer env.Mu.RUnlock() + env.Sm.SetState(state) } \ No newline at end of file diff --git a/core/environment/manager.go b/core/environment/manager.go index ac3936272..8ab1f70be 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -115,6 +115,33 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } + // This will subscribe to workflow state change. In case of workflow state + // ERROR will transition environment to ERROR state. The goroutine starts + // after a successful transition to CONFIGURE in order to handle only ERROR + // states triggered by mesos.(TASK_LOST,TASK_KILLED,TASK_FAILED,TASK_ERROR) + go func() { + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.ERROR { + env.setState(wfState.String()) + break WORKFLOW_STATE_LOOP + } + continue + } + } + } + }() + return env.id, err } diff --git a/core/environment/transition_error.go b/core/environment/transition_error.go deleted file mode 100644 index ee0377645..000000000 --- a/core/environment/transition_error.go +++ /dev/null @@ -1,56 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package environment - -import ( - "errors" - "github.com/AliceO2Group/Control/common/logger/infologger" - "github.com/AliceO2Group/Control/core/task" -) - -func NewErrorTransition(taskman *task.Manager) Transition { - return &ErrorTransition{ - baseTransition: baseTransition{ - name: "GO_ERROR", - taskman: taskman, - }, - } -} - -type ErrorTransition struct { - baseTransition -} - -func (t ErrorTransition) do(env *Environment) (err error) { - if env == nil { - return errors.New("cannot transition in NIL environment") - } - - log.WithField(infologger.Run, env.currentRunNumber).Info("error in environment") - - env.currentRunNumber = 0 - - return -} \ No newline at end of file diff --git a/core/scheduler.go b/core/scheduler.go index 8c1d4c998..8b4f96812 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -863,14 +863,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { taskIDValue := s.GetTaskID().Value t := state.taskman.GetTask(taskIDValue) if t != nil && t.IsLocked() { - go func() { - env, _ := state.environments.Environment(t.GetEnvironmentId().UUID()) - err := env.TryTransition(environment.NewErrorTransition(state.taskman)) - if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot transition environment to ERROR") - } - state.taskman.UpdateTaskState(taskIDValue, "ERROR") - }() + go state.taskman.UpdateTaskState(taskIDValue, "ERROR") } } diff --git a/core/task/state.go b/core/task/state.go index 37bad8599..2a09979cf 100644 --- a/core/task/state.go +++ b/core/task/state.go @@ -66,5 +66,8 @@ func (s State) X(other State) State { if s == other { return s } + if s == ERROR { + return ERROR + } return MIXED } diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index f37ac5c99..6aee8f021 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -45,6 +45,9 @@ func aggregateState(roles []Role) (state task.State) { if state == task.MIXED { return } + if state == task.ERROR { + return + } state = state.X(c.GetState()) } } @@ -66,6 +69,9 @@ func (t *SafeState) merge(s task.State, r Role) { case s == task.MIXED: t.state = task.MIXED return + case s == task.ERROR: + t.state = task.ERROR + return default: allRoles := r.GetRoles() t.state = aggregateState(allRoles) From 068306bb2e1fb8e4b3862f239fc640a82b86e219 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 28 Apr 2020 16:18:11 +0300 Subject: [PATCH 0217/2352] [core] Use Lock for env setState --- core/environment/environment.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 2fe4ac3d2..9ebc7e1e4 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -216,7 +216,7 @@ func (env *Environment) setState(state string) { if env == nil { return } - env.Mu.RLock() - defer env.Mu.RUnlock() + env.Mu.Lock() + defer env.Mu.Unlock() env.Sm.SetState(state) } \ No newline at end of file From faa794e9ee38f6aede5fd7e916836a5ae87205ee Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 28 Apr 2020 17:37:28 +0300 Subject: [PATCH 0218/2352] [core] end subscribe wf state on environment destruction --- core/environment/manager.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 8ab1f70be..1dd6a71e0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -137,6 +137,11 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] break WORKFLOW_STATE_LOOP } continue + default: + if _, ok := envs.m[env.id.Array()]; !ok { + break WORKFLOW_STATE_LOOP + } + continue } } } From 0c5bcf0a95c4efcf8ac35b368d7bc559135084ee Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 28 Apr 2020 18:23:09 +0300 Subject: [PATCH 0219/2352] [core] end subscribe wf state when task.DONE --- core/environment/manager.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 1dd6a71e0..21d5b9b22 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -132,6 +132,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] for { select { case wfState = <-notify: + if wfState == task.DONE { + break WORKFLOW_STATE_LOOP + } if wfState == task.ERROR { env.setState(wfState.String()) break WORKFLOW_STATE_LOOP From bcc4f66d5728ca50fc7358230c3e7079724c26b0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 4 May 2020 11:25:04 +0300 Subject: [PATCH 0220/2352] [core] fix comments --- core/task/descriptor.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/descriptor.go b/core/task/descriptor.go index f5aba76eb..42f530861 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -29,14 +29,14 @@ import ( ) /* -1) Role has a method GenerateTaskConfiguration []Descriptor. +1) Role has a method GenerateTaskDescriptors []Descriptor. For most roles, this function simply consolidates the output of itself for children. For TaskRoles, this function generates a single Descriptor from its own Class and parent role vars. Descriptor must also have a Ptr or path to the TaskRole that should become the new Task's parent. So in ConfigureTransition.do, we first get the []Descriptor with - wf.GenerateTaskConfiguration(). + wf.GenerateTaskDescriptors(). 2) Now that we have a list of config items for tasks to run, we can port task.Manager.AcquireRoles. This one internally uses match.go facilities such as matchRoles, which must return a *Task. This Task must then be added to the roster and From 3deeb3aea4d432eb2fd9de2d181b394b99c69fd9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 6 May 2020 11:06:05 +0300 Subject: [PATCH 0221/2352] [core] Allow templating and overriding of channel configuration --- core/server.go | 11 +++++++++-- core/task/channel/inbound.go | 22 ++++++++++++++++++++++ core/task/channel/outbound.go | 22 ++++++++++++++++++++++ core/task/class.go | 3 +++ core/task/descriptor.go | 3 +++ core/task/match.go | 5 +---- core/task/task.go | 6 +++--- core/workflow/parentadapter.go | 4 ++++ core/workflow/role.go | 1 + core/workflow/rolebase.go | 27 ++++++++++++++++++++------- core/workflow/taskrole.go | 2 ++ 11 files changed, 90 insertions(+), 16 deletions(-) diff --git a/core/server.go b/core/server.go index 4325eeabc..dc8a171b9 100644 --- a/core/server.go +++ b/core/server.go @@ -373,6 +373,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge taskClass := task.GetTaskClass() commandInfo := task.GetTaskCommandInfo() var outbound []channel.Outbound + var inbound []channel.Inbound taskPath := "" // TODO: probably not the nicest way to do this... the outbound assignments should be cached // in the Task @@ -380,13 +381,19 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge type parentRole interface { CollectOutboundChannels() []channel.Outbound GetPath() string + CollectInboundChannels() []channel.Inbound } parent, ok := task.GetParentRole().(parentRole) if ok { - outbound = parent.CollectOutboundChannels() + outbound = channel.MergeOutbound(parent.CollectOutboundChannels(), taskClass.Connect) taskPath = parent.GetPath() + inbound = channel.MergeInbound(parent.CollectInboundChannels(), taskClass.Bind) } } + if inbound == nil { + inbound = make([]channel.Inbound, len(taskClass.Bind)) + copy(inbound, taskClass.Bind) + } rep := &pb.GetTaskReply{ Task: &pb.TaskInfo{ @@ -395,7 +402,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge Name: task.GetClassName(), ControlMode: taskClass.Control.Mode.String(), }, - InboundChannels: inboundChannelsToPbChannels(taskClass.Bind), + InboundChannels: inboundChannelsToPbChannels(inbound), OutboundChannels: outboundChannelsToPbChannels(outbound), CommandInfo: commandInfoToPbCommandInfo(commandInfo), TaskPath: taskPath, diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index f15b5d0ca..839b348c1 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -29,6 +29,7 @@ import ( "strings" "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/imdario/mergo" ) type Inbound struct { @@ -100,5 +101,26 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm for k, v := range chanProps { pm[prefix + "." + k] = v } + return +} + +func MergeInbound(hp,lp []Inbound) (channels []Inbound) { + channels = make([]Inbound, len(hp)) + copy(channels, hp) + + for _, v := range lp { + updated := false + for _, pCh := range channels { + if v.Name == pCh.Name { + mergo.Merge(&pCh, v) + updated = true + break + } + } + if !updated { + channels = append(channels, v) + } + } + return } \ No newline at end of file diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 7aac7147f..2df94f45e 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -29,6 +29,7 @@ import ( "strings" "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/imdario/mergo" "github.com/sirupsen/logrus" ) @@ -139,5 +140,26 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( for k, v := range chanProps { pm[prefix + "." + k] = v } + return +} + +func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { + channels = make([]Outbound, len(hp)) + copy(channels, hp) + + for _, v := range lp { + updated := false + for _, pCh := range channels { + if v.Name == pCh.Name { + mergo.Merge(&pCh, v) + updated = true + break + } + } + if !updated { + channels = append(channels, v) + } + } + return } \ No newline at end of file diff --git a/core/task/class.go b/core/task/class.go index 17db8d9a8..9982f3015 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -48,6 +48,7 @@ type Class struct { Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -64,6 +65,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ Defaults: make(map[string]string), @@ -80,6 +82,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { Bind: aux.Bind, Properties: gera.MakeStringMapWithMap(aux.Properties), Constraints:aux.Constraints, + Connect: aux.Connect, } } return diff --git a/core/task/descriptor.go b/core/task/descriptor.go index 42f530861..bfda6e6d8 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -26,6 +26,7 @@ package task import ( "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/task/channel" ) /* @@ -48,6 +49,8 @@ type Descriptor struct { TaskRole parentRole TaskClassName string RoleConstraints constraint.Constraints + RoleConnect []channel.Outbound + RoleInbound []channel.Inbound //CmdExtraEnv []string //CmdExtraArguments []string } diff --git a/core/task/match.go b/core/task/match.go index e3b33230b..63969e305 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -53,10 +53,7 @@ func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { r.StaticPorts = make(Ranges, len(wants.Ports)) copy(r.StaticPorts, wants.Ports) } - if taskClass.Bind != nil { - r.InboundChannels = make([]channel.Inbound, len(taskClass.Bind)) - copy(r.InboundChannels, taskClass.Bind) - } + r.InboundChannels = channel.MergeInbound(descriptor.RoleInbound, taskClass.Bind) } return } diff --git a/core/task/task.go b/core/task/task.go index 0050b305b..90b23b28b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -59,6 +59,7 @@ type parentRole interface { GetVars() gera.StringMap GetUserVars() gera.StringMap ConsolidatedVarStack() (varStack map[string]string, err error) + CollectInboundChannels() []channel.Inbound } /* @@ -368,7 +369,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT { - for _, inbCh := range class.Bind { + for _, inbCh := range channel.MergeInbound(t.parent.CollectInboundChannels(), class.Bind) { endpoint, ok := t.localBindMap[inbCh.Name] if !ok { log.WithFields(logrus.Fields{ @@ -387,8 +388,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap[k] = v } } - - for _, outboundCh := range t.parent.CollectOutboundChannels() { + for _, outboundCh := range channel.MergeOutbound(t.parent.CollectOutboundChannels(), class.Connect) { // We get the FairMQ-formatted propertyMap from the outbound channel spec chanProps := outboundCh.ToFMQMap(bindMap) diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 15690074f..d76a11658 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -136,4 +136,8 @@ func (p *ParentAdapter) GetVars() gera.StringMap { func (p *ParentAdapter) GetUserVars() gera.StringMap { return p.getUserVarsFunc() +} + +func (*ParentAdapter) CollectInboundChannels() []channel.Inbound { + return make([]channel.Inbound, 0) } \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index 4380a4a78..c87c2d82f 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -67,6 +67,7 @@ type Updatable interface { GetEnvironmentId() uuid.Array GetPath() string CollectOutboundChannels() []channel.Outbound + CollectInboundChannels() []channel.Inbound } type VarNode interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 0f9347f23..5fb4f1180 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -58,6 +58,7 @@ type roleBase struct { Vars *gera.StringWrapMap `yaml:"vars"` UserVars *gera.StringWrapMap `yaml:"-"` Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role + Bind []channel.Inbound `yaml:"bind,omitempty"` } func (r *roleBase) SetRuntimeVar(key string, value string) { @@ -153,14 +154,9 @@ func (r *roleBase) CollectOutboundChannels() (channels []channel.Outbound) { if r.parent == nil { channels = make([]channel.Outbound, 0) } else { - channels = r.parent.CollectOutboundChannels() - } - for _, v := range r.Connect { - channels = append(channels, v) - // FIXME: this does not take into account child roles with outbound channels with the same name - // as an outbound channel in the parent. - // The correct behaviour would be OVERRIDE, currently the behavior is UNDEFINED. + channels = channel.MergeOutbound(r.Connect, r.parent.CollectOutboundChannels()) } + return } @@ -210,6 +206,7 @@ func (r *roleBase) copy() copyable { Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, state: r.state, + Bind: make([]channel.Inbound, len(r.Bind)), } copied := copy(rCopy.Connect, r.Connect) @@ -226,6 +223,13 @@ func (r *roleBase) copy() copyable { Error("role copy error") } + copied = copy(rCopy.Bind, r.Bind) + if copied != len(r.Bind) { + log.WithField("role", r.GetPath()). + WithError(fmt.Errorf("slice copy copied %d items, %d expected", copied, len(r.Bind))). + Error("role copy error") + } + return &rCopy } @@ -337,3 +341,12 @@ func (r *roleBase) GetUserVars() gera.StringMap { } return r.UserVars } + +func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { + if r.parent == nil { + channels = make([]channel.Inbound, 0) + } else { + channels = channel.MergeInbound(r.Bind, r.parent.CollectInboundChannels()) + } + return +} \ No newline at end of file diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index f00f52d16..2d2a3a106 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -174,6 +174,8 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { TaskRole: t, TaskClassName: t.LoadTaskClass, RoleConstraints: t.getConstraints(), + RoleConnect: t.CollectOutboundChannels(), + RoleInbound: t.CollectInboundChannels(), }} return } From e4b2e904c0e23f15b4ab8f15c56f7881de4a5c50 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 6 May 2020 16:08:36 +0300 Subject: [PATCH 0222/2352] [core] change RoleInbound to RoleBind --- core/task/descriptor.go | 2 +- core/task/match.go | 2 +- core/workflow/taskrole.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/task/descriptor.go b/core/task/descriptor.go index bfda6e6d8..de941c0d5 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -50,7 +50,7 @@ type Descriptor struct { TaskClassName string RoleConstraints constraint.Constraints RoleConnect []channel.Outbound - RoleInbound []channel.Inbound + RoleBind []channel.Inbound //CmdExtraEnv []string //CmdExtraArguments []string } diff --git a/core/task/match.go b/core/task/match.go index 63969e305..ff5d9f565 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -53,7 +53,7 @@ func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { r.StaticPorts = make(Ranges, len(wants.Ports)) copy(r.StaticPorts, wants.Ports) } - r.InboundChannels = channel.MergeInbound(descriptor.RoleInbound, taskClass.Bind) + r.InboundChannels = channel.MergeInbound(descriptor.RoleBind, taskClass.Bind) } return } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 2d2a3a106..e6808f61a 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -175,7 +175,7 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { TaskClassName: t.LoadTaskClass, RoleConstraints: t.getConstraints(), RoleConnect: t.CollectOutboundChannels(), - RoleInbound: t.CollectInboundChannels(), + RoleBind: t.CollectInboundChannels(), }} return } From 1aec6a5b6ce4b567334c88f72d83960071ef1f1b Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 12 May 2020 11:00:41 +0300 Subject: [PATCH 0223/2352] [core] remove target for outbound channels in task template --- core/task/class.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/task/class.go b/core/task/class.go index 9982f3015..05bf90346 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -73,6 +73,13 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } err = unmarshal(&aux) if err == nil { + for j, ch := range aux.Connect { + if ch.Target != "" { + ch.Target = "" + aux.Connect[j] = ch + log.Warn("task template should lack target entry for outbound channels") + } + } *c = Class{ Identifier: aux.Identifier, Defaults: gera.MakeStringMapWithMap(aux.Defaults), From 9698987557bfaeb03084a49d2ef429b0ed33ce6e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Apr 2020 17:30:52 +0200 Subject: [PATCH 0224/2352] [occ] New OCCLite plugin, without Protobuf --- occ/CMakeLists.txt | 73 +++++++- occ/OccVersion.h.in | 12 +- occ/plugin/OccFMQCommon.cxx | 249 +++++++++++++++++++++++++ occ/plugin/OccFMQCommon.h | 71 +++++++ occ/plugin/OccLiteServer.cxx | 150 +++++++++++++++ occ/plugin/OccLiteServer.h | 81 ++++++++ occ/plugin/OccPlugin.cxx | 11 ++ occ/plugin/OccPlugin.h | 16 +- occ/plugin/OccPluginServer.cxx | 232 +++-------------------- occ/plugin/OccPluginServer.h | 25 +-- occ/plugin/litestructs/EventStream.cxx | 69 +++++++ occ/plugin/litestructs/EventStream.h | 119 ++++++++++++ occ/plugin/litestructs/GetState.cxx | 54 ++++++ occ/plugin/litestructs/GetState.h | 103 ++++++++++ occ/plugin/litestructs/JsonMessage.cxx | 83 +++++++++ occ/plugin/litestructs/JsonMessage.h | 61 ++++++ occ/plugin/litestructs/Transition.cxx | 82 ++++++++ occ/plugin/litestructs/Transition.h | 118 ++++++++++++ 18 files changed, 1360 insertions(+), 249 deletions(-) create mode 100644 occ/plugin/OccFMQCommon.cxx create mode 100644 occ/plugin/OccFMQCommon.h create mode 100644 occ/plugin/OccLiteServer.cxx create mode 100644 occ/plugin/OccLiteServer.h create mode 100644 occ/plugin/litestructs/EventStream.cxx create mode 100644 occ/plugin/litestructs/EventStream.h create mode 100644 occ/plugin/litestructs/GetState.cxx create mode 100644 occ/plugin/litestructs/GetState.h create mode 100644 occ/plugin/litestructs/JsonMessage.cxx create mode 100644 occ/plugin/litestructs/JsonMessage.h create mode 100644 occ/plugin/litestructs/Transition.cxx create mode 100644 occ/plugin/litestructs/Transition.h diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 428f1d5ad..1d7c41b80 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -39,13 +39,17 @@ set(CMAKE_INSTALL_LIBDIR lib) set(OCC_ORGANIZATION_NAME "O²") set(OCC_ORGANIZATION_DOMAIN "github.com/AliceO2Group/Control") +set(OCCLIB_PRODUCT_NAME "OCC Library") +set(OCCLIB_PRODUCT_MAINTAINER "Teo Mrnjavac ") +set(OCCLIB_DESCRIPTION_SUMMARY "The O² Configuration and Control library") + set(OCCPLUGIN_PRODUCT_NAME "OCC Plugin") -set(OCCPLUGIN_PRODUCT_MAINTAINER "Teo Mrnjavac ") +set(OCCPLUGIN_PRODUCT_MAINTAINER "Teo Mrnjavac ") set(OCCPLUGIN_DESCRIPTION_SUMMARY "The O² Configuration and Control plugin for FairMQ devices") -set(OCCLIB_PRODUCT_NAME "OCC Library") -set(OCCLIB_PRODUCT_MAINTAINER "Teo Mrnjavac ") -set(OCCLIB_DESCRIPTION_SUMMARY "The O² Configuration and Control library") +set(OCCLITE_PRODUCT_NAME "OCClite Plugin") +set(OCCLITE_PRODUCT_MAINTAINER "Teo Mrnjavac ") +set(OCCLITE_DESCRIPTION_SUMMARY "The O² Configuration and Control plugin for FairMQ devices") # Read version number from VERSION file in parent dir set(OCC_VERSION_MAJOR 0) @@ -99,7 +103,7 @@ project(occ ### set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) @@ -136,7 +140,8 @@ list(APPEND CMAKE_PREFIX_PATH ${FAIRLOGGERPATH} ${PROTOBUFPATH} ${GRPCPATH} - ${BOOSTPATH}) + ${BOOSTPATH} + ${RAPIDJSON_ROOT}) ### @@ -175,6 +180,9 @@ message(STATUS "Using gRPC ${gRPC_VERSION}") # gRPC C++ plugin set(gRPC_CPP_PLUGIN_EXECUTABLE $) +# RapidJSON for OCClite +find_package(RapidJSON CONFIG REQUIRED) + ### ### Status messages for build options ### @@ -399,7 +407,11 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/OccVersion.h.in set(OCCPLUGIN_SOURCES plugin/OccPlugin.cxx - plugin/OccPluginServer.cxx) + plugin/OccPluginServer.cxx + plugin/OccFMQCommon.cxx + plugin/litestructs/JsonMessage.cxx + plugin/litestructs/Transition.cxx + plugin/litestructs/EventStream.cxx) add_library(${OCCPLUGIN} SHARED ${OCCPLUGIN_SOURCES} @@ -417,7 +429,8 @@ target_include_directories(${OCCPLUGIN} ${CMAKE_CURRENT_BINARY_DIR} ${PROTO_SOURCE_DIR} ${FAIRROOT_INCLUDE_DIR} - ${GRPC_INCLUDE_DIRS}) + ${GRPC_INCLUDE_DIRS} + ${RapidJSON_INCLUDE_DIRS}) set_target_properties(${OCCPLUGIN} PROPERTIES CXX_VISIBILITY_PRESET hidden @@ -426,3 +439,47 @@ set_target_properties(${OCCPLUGIN} PROPERTIES install(TARGETS ${OCCPLUGIN} DESTINATION lib) + +### +### Build target OCCLITE +### + +set(OCCLITE FairMQPlugin_OCClite) + +#set(OCC_LITE_SERVICE 1) +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/OccVersion.h.in + ${CMAKE_CURRENT_BINARY_DIR}/OccVersion.h) + +set(OCCLITE_SOURCES + plugin/OccPlugin.cxx + plugin/OccLiteServer.cxx + plugin/OccFMQCommon.cxx + plugin/litestructs/JsonMessage.cxx + plugin/litestructs/GetState.cxx + plugin/litestructs/Transition.cxx + plugin/litestructs/EventStream.cxx) + +add_library(${OCCLITE} SHARED + ${OCCLITE_SOURCES}) + +target_link_libraries(${OCCLITE} PRIVATE + FairMQ::FairMQ + gRPC::grpc++ + Boost::program_options) + +target_include_directories(${OCCLITE} + PUBLIC + $ + $ + PRIVATE + ${FAIRROOT_INCLUDE_DIR} + ${GRPC_INCLUDE_DIRS} + ${RapidJSON_INCLUDE_DIRS}) + +set_target_properties(${OCCLITE} PROPERTIES + CXX_VISIBILITY_PRESET hidden + VERSION ${OCC_VERSION_SHORT} + SOVERSION ${OCC_VERSION_SHORT}) +target_compile_definitions(${OCCLITE} PUBLIC OCC_LITE_SERVICE) + +install(TARGETS ${OCCLITE} DESTINATION lib) diff --git a/occ/OccVersion.h.in b/occ/OccVersion.h.in index 391d8323d..3229696f5 100644 --- a/occ/OccVersion.h.in +++ b/occ/OccVersion.h.in @@ -4,14 +4,18 @@ #cmakedefine OCC_ORGANIZATION_NAME "${OCC_ORGANIZATION_NAME}" #cmakedefine OCC_ORGANIZATION_DOMAIN "${OCC_ORGANIZATION_DOMAIN}" -#cmakedefine OCCPLUGIN_PRODUCT_NAME "${OCCLIB_PRODUCT_NAME}" -#cmakedefine OCCPLUGIN_PRODUCT_MAINTAINER "${OCCPLUGIN_PRODUCT_MAINTAINER}" -#cmakedefine OCCPLUGIN_DESCRIPTION_SUMMARY "${OCCPLUGIN_DESCRIPTION_SUMMARY}" - #cmakedefine OCCLIB_PRODUCT_NAME "${OCCLIB_PRODUCT_NAME}" #cmakedefine OCCLIB_PRODUCT_MAINTAINER "${OCCLIB_PRODUCT_MAINTAINER}" #cmakedefine OCCLIB_DESCRIPTION_SUMMARY "${OCCLIB_DESCRIPTION_SUMMARY}" +#cmakedefine OCCPLUGIN_PRODUCT_NAME "${OCCPLUGIN_PRODUCT_NAME}" +#cmakedefine OCCPLUGIN_PRODUCT_MAINTAINER "${OCCPLUGIN_PRODUCT_MAINTAINER}" +#cmakedefine OCCPLUGIN_DESCRIPTION_SUMMARY "${OCCPLUGIN_DESCRIPTION_SUMMARY}" + +#cmakedefine OCCLITE_PRODUCT_NAME "${OCCLITE_PRODUCT_NAME}" +#cmakedefine OCCLITE_PRODUCT_MAINTAINER "${OCCLITE_PRODUCT_MAINTAINER}" +#cmakedefine OCCLITE_DESCRIPTION_SUMMARY "${OCCLITE_DESCRIPTION_SUMMARY}" + #cmakedefine OCC_VERSION "${OCC_VERSION}" #cmakedefine OCC_VERSION_SHORT "${OCC_VERSION_SHORT}" diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx new file mode 100644 index 000000000..f69df929c --- /dev/null +++ b/occ/plugin/OccFMQCommon.cxx @@ -0,0 +1,249 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "OccFMQCommon.h" + +#include "util/Defer.h" + +#include +#include + +std::string generateSubscriptionId(const std::string& prefix) +{ + std::string id; + try { + boost::uuids::random_generator gen; + id = boost::uuids::to_string(gen()); + } catch(const boost::uuids::entropy_error &err) { + OLOG(WARNING) << "[generateSubscriptionId] boost::uuids::entropy_error: " << err.what() << " falling back to std::time"; + id = std::to_string(std::time(nullptr)); + } + return "OCC_"s + (prefix.size() ? (prefix + "_") : "") + id; +} + +bool isIntermediateFMQState(const std::string& state) +{ + return state.find("INITIALIZING TASK") != std::string::npos || + state.find("RESETTING") != std::string::npos || + state.find("BINDING") != std::string::npos || + state.find("CONNECTING") != std::string::npos; +} + +std::tuple doTransition(fair::mq::PluginServices* m_pluginServices, const OccLite::nopb::TransitionRequest& request) +{ + std::string srcState = request.srcState; + std::string event = request.transitionEvent; + auto arguments = request.arguments; + + std::string currentState = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); + if (srcState != currentState) { + return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INVALID_ARGUMENT, + "transition not possible: state mismatch: source: " + srcState + " current: " + + currentState)); + } + + OLOG(DEBUG) << "transition src: " << srcState + << " currentState: " << currentState + << " event: " << event; + + std::vector newStates; + const std::string finalState = EXPECTED_FINAL_STATE.at(event); + + std::condition_variable cv; + std::mutex cv_mu; + + auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { + // CONFIGURE arguments must be pushed during InitializingDevice + if (reachedState == fair::mq::PluginServices::DeviceState::InitializingDevice) { + + // FIXME: workaround which special cases a stoi for certain properties + // which must be pushed as int. + // This should be removed once SetPropertyAsString becomes available. + const std::vector intKeys = { + "rateLogging", + "rcvBufSize", + "sndBufSize", + "linger", + "rcvKernelSize", + "sndKernelSize" + }; + for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { + std::string key = it->first; + std::string value = it->second; + if (boost::starts_with(key, "chans.")) { + key.erase(0, 6); + std::vector split; + boost::split(split, key, std::bind1st(std::equal_to(), '.')); + if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { + auto intValue = std::stoi(value); + m_pluginServices->SetProperty(key, intValue); + } + else { + m_pluginServices->SetProperty(key, value); + } + } + else { + m_pluginServices->SetProperty(key, value); + } + } + } + + std::unique_lock lk(cv_mu); + newStates.push_back(fair::mq::PluginServices::ToStr(reachedState)); + OLOG(DEBUG) << "transition newStates vector: " << boost::algorithm::join(newStates, ", "); + cv.notify_one(); + }; + + auto id = generateSubscriptionId("Transition"); + + m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); + DEFER({ + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + }); + + try { + auto evt = fair::mq::PluginServices::ToDeviceStateTransition(event); + + // FIXME: big ugly workaround over here + // Since FairMQ currently (11/2018) can't yet implicitly create channels when receiving + // chans.* properties during INITIALIZING DEVICE, we must fake a --channel-config cli + // parameter during INIT and before the INIT DEVICE event. + // We extract channel related properties from the OCC transition arguments vector and we + // build up a vector of strings which mimics stuff along the lines of + // --channel-config name=data,type=push,method=bind,address=tcp://*:5555,rateLogging=0" + // See https://github.com/FairRootGroup/FairMQ/pull/111 + // When the relevant FairMQ 1.4.x version implements implicit channel creation, this whole + // block should be removed with no loss of functionality. + if (evt == fair::mq::PluginServices::DeviceStateTransition::InitDevice) { + std::unordered_map> channels; + for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { + std::string key = it->first; + std::string value = it->second; + if (boost::starts_with(key, "chans.")) { + key.erase(0, 6); + std::vector split; + boost::split(split, key, std::bind1st(std::equal_to(), '.')); + if (split.size() != 3) + continue; + auto name = split[0]; + auto propKey = split[2]; + if (channels.find(name) == channels.end()) // if map for this chan doesn't exist yet + channels[name] = std::unordered_map(); + channels[name][propKey] = value; + } + } + + std::vector channelLines; + for (auto it = channels.cbegin(); it != channels.cend(); ++it) { + std::vector line; + line.push_back("name=" + it->first); + for (auto jt = it->second.cbegin(); jt != it->second.cend(); ++jt) { + line.push_back(jt->first + "=" + jt->second); + } + channelLines.push_back(boost::join(line, ",")); + OLOG(DEBUG) << "transition pushing channel configuration " << channelLines.back(); + } + if (!channelLines.empty()) { + m_pluginServices->SetProperty("channel-config", channelLines); + } + } + // Run number must be pushed immediately before RUN transition + else if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { + try { + for (auto const& [key, value] : arguments) { + m_pluginServices->SetProperty(key, value); + } + } + catch (std::runtime_error &e) { + OLOG(WARNING) << "transition cannot push RUN transition arguments, reason:" << e.what(); + } + } + m_pluginServices->ChangeDeviceState(FMQ_CONTROLLER_NAME, evt); + } + catch (fair::mq::PluginServices::DeviceControlError& e) { + OLOG(ERROR) << "transition cannot request transition: " << e.what(); + return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INTERNAL, "cannot request transition, OCC plugin has no device control")); + } + catch (std::out_of_range& e) { + OLOG(ERROR) << "transition invalid event name: " << event; + return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INVALID_ARGUMENT, "argument " + event + " is not a valid transition name")); + } + + { + std::unique_lock lk(cv_mu); + + // IF we have no states in list yet, OR + // we have some states, and the last one is an intermediate state (for which an autotransition is presumably about to happen) + if (newStates.empty() || isIntermediateFMQState(newStates.back())) { + // We need to block until the transitions are complete + for (;;) { + cv.wait(lk); + if (newStates.empty()) { + OLOG(ERROR) << "[request Transition] notify condition met but no states written"; + break; + } + + OLOG(DEBUG) << "transition notify condition met, reached state: " << newStates.back(); + if (isIntermediateFMQState(newStates.back())) { //if it's an auto state + continue; + } else { + break; + } + } + } + } + + if (newStates.empty()) { + return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INTERNAL, + "no transitions made, current state stays " + srcState)); + } + + if (srcState == "IDLE" && newStates.back() == "DEVICE READY") { + // Debug: list of FairMQ property keys + auto pk = m_pluginServices->GetPropertyKeys(); + for (const auto &k : pk) { + OLOG(DEBUG) << std::setw(30) << k << " = " + m_pluginServices->GetPropertyAsString(k); + } + auto chi = m_pluginServices->GetChannelInfo(); + OLOG(DEBUG) << "channel info:"; + for (const auto &k : chi) { + OLOG(DEBUG) << k.first << " : " << k.second; + } + } + + auto response = OccLite::nopb::TransitionResponse(); + response.state = newStates.back(); + response.transitionEvent = event; + response.ok = (newStates.back() == finalState); + if (newStates.back() == "ERROR") { // ERROR state + response.trigger = OccLite::nopb::DEVICE_ERROR; + } else if (newStates.back() == finalState) { // correct destination state + response.trigger = OccLite::nopb::EXECUTOR; + } else { // some other state, for whatever reason - we assume DEVICE_INTENTIONAL + response.trigger = OccLite::nopb::DEVICE_INTENTIONAL; + } + + OLOG(DEBUG) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); + return std::make_tuple(response, grpc::Status::OK); +} \ No newline at end of file diff --git a/occ/plugin/OccFMQCommon.h b/occ/plugin/OccFMQCommon.h new file mode 100644 index 000000000..09bfc0eee --- /dev/null +++ b/occ/plugin/OccFMQCommon.h @@ -0,0 +1,71 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_OCCFMQCOMMON_H +#define OCC_OCCFMQCOMMON_H + +// We have to force boost::uuids to rely on /dev/*random instead of getrandom(2) or getentropy(3) +// otherwise on some systems we'd get boost::uuids::entropy_error +#define BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX + +#include "plugin/litestructs/Transition.h" + +#include +#include +#include + +#include + +#include +#include + +#include "util/Logger.h" + +using namespace std::literals; + +#ifdef OCC_LITE_SERVICE +#define FMQ_CONTROLLER_NAME "OCClite" +#else +#define FMQ_CONTROLLER_NAME "OCC" +#endif + +std::string generateSubscriptionId(const std::string& prefix = ""); +bool isIntermediateFMQState(const std::string& state); +std::tuple doTransition(fair::mq::PluginServices* pluginServices, const OccLite::nopb::TransitionRequest& request); + +const std::unordered_map EXPECTED_FINAL_STATE = { + {"INIT DEVICE", "INITIALIZING DEVICE"}, + {"COMPLETE INIT","INITIALIZED"}, + {"BIND", "BOUND"}, + {"CONNECT", "DEVICE READY"}, + {"INIT TASK", "READY"}, + {"RUN", "RUNNING"}, + {"STOP", "READY"}, + {"RESET TASK", "DEVICE READY"}, + {"RESET DEVICE", "IDLE"}, + {"END", "EXITING"}, + {"ERROR FOUND", "ERROR"}, +}; + +#endif //OCC_OCCFMQCOMMON_H diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx new file mode 100644 index 000000000..09d8b9d83 --- /dev/null +++ b/occ/plugin/OccLiteServer.cxx @@ -0,0 +1,150 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "OccLiteServer.h" + +#include "litestructs/GetState.h" +#include "litestructs/Transition.h" +#include "litestructs/EventStream.h" + +#include "util/Defer.h" +#include "util/Logger.h" + +#include + +#include + +#include +#include +#include + +#include +#include + +OccLite::Service::Service(fair::mq::PluginServices* pluginServices) + : ::grpc::Service(), m_pluginServices(pluginServices) +{ + auto getStateHandler = new ::grpc::internal::RpcMethodHandler(&OccLite::Service::GetState, this); + auto getState = new ::grpc::internal::RpcServiceMethod( + "GetState", + ::grpc::internal::RpcMethod::NORMAL_RPC, + getStateHandler); + AddMethod(getState); + + auto transitionHandler = new ::grpc::internal::RpcMethodHandler(&OccLite::Service::Transition, this); + auto transition = new ::grpc::internal::RpcServiceMethod( + "Transition", + ::grpc::internal::RpcMethod::NORMAL_RPC, + transitionHandler); + AddMethod(transition); + + auto eventStreamHandler = new ::grpc::internal::ServerStreamingHandler(&OccLite::Service::EventStream, this); + auto eventStream = new ::grpc::internal::RpcServiceMethod( + "EventStream", + ::grpc::internal::RpcMethod::SERVER_STREAMING, + eventStreamHandler); + AddMethod(eventStream); +} + +::grpc::Status OccLite::Service::GetState(::grpc_impl::ServerContext* context, + const OccLite::nopb::GetStateRequest* request, + OccLite::nopb::GetStateResponse* response) +{ + std::lock_guard lock(m_mu); + + (void) context; + (void) request; + + auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); + response->state = state; + OLOG(INFO) << "GetState response: " << response->state; + + return grpc::Status::OK; +} + +::grpc::Status OccLite::Service::Transition(::grpc_impl::ServerContext* context, + const OccLite::nopb::TransitionRequest* request, + OccLite::nopb::TransitionResponse* response) +{ + OLOG(INFO) << "Incoming Transition request:" << request->JsonMessage::Serialize(); + + auto transitionOutcome = doTransition(m_pluginServices, *request); + ::grpc::Status grpcStatus = std::get<1>(transitionOutcome); + if (!grpcStatus.ok()) { + return grpcStatus; + } + + auto nopbResponse = std::get<0>(transitionOutcome); + *response = nopbResponse; + return grpc::Status::OK; +} + +::grpc::Status + +OccLite::Service::EventStream(::grpc_impl::ServerContext* context, const OccLite::nopb::EventStreamRequest* request, + ::grpc::ServerWriter* writer) +{ + (void) context; + (void) request; + + std::mutex writer_mu; + std::condition_variable finished; + std::mutex finished_mu; + + auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { + std::lock_guard lock(writer_mu); + auto state = fair::mq::PluginServices::ToStr(reachedState); + + OLOG(DEBUG) << "[EventStream] new state: " << state; + + if (state == "EXITING") { + std::unique_lock finished_lk(finished_mu); + + auto nilEvent = new nopb::DeviceEvent; + nilEvent->type = nopb::NULL_DEVICE_EVENT; + nopb::EventStreamResponse response; + response.event = *nilEvent; + + writer->WriteLast(response, grpc::WriteOptions()); + delete nilEvent; + finished.notify_one(); + } + }; + + auto id = generateSubscriptionId("EventStream"); + + m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); + DEFER({ + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + }); + + { + std::unique_lock lk(finished_mu); + finished.wait(lk); + } + + return ::grpc::Status::OK; +} + + diff --git a/occ/plugin/OccLiteServer.h b/occ/plugin/OccLiteServer.h new file mode 100644 index 000000000..5e2a23dfa --- /dev/null +++ b/occ/plugin/OccLiteServer.h @@ -0,0 +1,81 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_OCCLITESERVER_H +#define OCC_OCCLITESERVER_H + +#include "OccFMQCommon.h" + +#include +#include +#include + +#include + +namespace fair +{ +namespace mq +{ +class PluginServices; +} +} + +namespace OccLite { +namespace nopb +{ +class GetStateRequest; +class GetStateResponse; +class TransitionRequest; +class TransitionResponse; +class EventStreamRequest; +class EventStreamResponse; +} + +class Service : public ::grpc::Service +{ +public: + explicit Service(fair::mq::PluginServices*); + + virtual ~Service() + {} + + ::grpc::Status EventStream(::grpc_impl::ServerContext* context, + const nopb::EventStreamRequest* request, + ::grpc::ServerWriter* writer); + + ::grpc::Status GetState(::grpc_impl::ServerContext*, + const nopb::GetStateRequest*, + nopb::GetStateResponse*); + + ::grpc::Status Transition(::grpc_impl::ServerContext* context, + const nopb::TransitionRequest* request, + nopb::TransitionResponse* response); + +private: + fair::mq::PluginServices* m_pluginServices; + std::mutex m_mu; +}; +} // ns OccLite + +#endif //OCC_OCCLITESERVER_H diff --git a/occ/plugin/OccPlugin.cxx b/occ/plugin/OccPlugin.cxx index dbd1ca276..4aae98a7c 100644 --- a/occ/plugin/OccPlugin.cxx +++ b/occ/plugin/OccPlugin.cxx @@ -23,12 +23,19 @@ */ #include "OccPlugin.h" + +#ifdef OCC_LITE_SERVICE +#include "OccLiteServer.h" +#else #include "OccPluginServer.h" +#endif #include "util/Logger.h" #include +#include + OccPlugin::OccPlugin(const std::string& name, const fair::mq::Plugin::Version& version, const std::string& maintainer, @@ -71,7 +78,11 @@ OccPlugin::~OccPlugin() void OccPlugin::runServer(fair::mq::PluginServices* pluginServices, const std::string& controlPort) { std::string serverAddress("0.0.0.0:"s + controlPort); +#ifdef OCC_LITE_SERVICE + OccLite::Service service(pluginServices); +#else OccPluginServer service(pluginServices); +#endif grpc::ServerBuilder builder; builder.AddListeningPort(serverAddress, grpc::InsecureServerCredentials()); diff --git a/occ/plugin/OccPlugin.h b/occ/plugin/OccPlugin.h index 52f1f4184..ee79b4a7b 100644 --- a/occ/plugin/OccPlugin.h +++ b/occ/plugin/OccPlugin.h @@ -30,7 +30,6 @@ #include "OccGlobals.h" #include -#include #include @@ -66,7 +65,18 @@ fair::mq::Plugin::ProgOptions OccPluginProgramOptions() return plugin_options; } - +#ifdef OCC_LITE_SERVICE +REGISTER_FAIRMQ_PLUGIN( + OccPlugin, + OCClite, + (fair::mq::Plugin::Version{OCC_VERSION_MAJOR, + OCC_VERSION_MINOR, + OCC_VERSION_PATCH}), + OCCLITE_PRODUCT_MAINTAINER, + OCC_ORGANIZATION_DOMAIN, + OccPluginProgramOptions +) +#else REGISTER_FAIRMQ_PLUGIN( OccPlugin, OCC, @@ -77,6 +87,6 @@ REGISTER_FAIRMQ_PLUGIN( OCC_ORGANIZATION_DOMAIN, OccPluginProgramOptions ) - +#endif #endif //OCCPLUGIN_OCCPLUGIN_H diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 5c5f2a323..d51933a0e 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -25,16 +25,14 @@ #include "OccPluginServer.h" +#include "plugin/litestructs/Transition.h" #include "util/Defer.h" #include "util/Logger.h" #include #include -#include -#include #include -#include #include #include @@ -91,7 +89,6 @@ OccPluginServer::EventStream(grpc::ServerContext* context, } return ::grpc::Status::OK; - } grpc::Status @@ -110,7 +107,7 @@ OccPluginServer::StateStream(grpc::ServerContext* context, auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - pb::StateType sType = isIntermediateState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; + pb::StateType sType = isIntermediateFMQState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; pb::StateStreamReply response; response.set_type(sType); @@ -209,216 +206,29 @@ OccPluginServer::Transition(grpc::ServerContext* context, return grpc::Status(grpc::INVALID_ARGUMENT, "null request received"); } - std::string srcState = request->srcstate(); - std::string event = request->transitionevent(); - auto arguments = request->arguments(); - - std::string currentState = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); - if (srcState != currentState) { - return grpc::Status(grpc::INVALID_ARGUMENT, - "transition not possible: state mismatch: source: " + srcState + " current: " + - currentState); + auto nopbArgs = std::map(); + for (const auto &kv : request->arguments()) { + nopbArgs[kv.key()] = kv.value(); } - - OLOG(DEBUG) << "transition src: " << srcState - << " currentState: " << currentState - << " event: " << event; - - std::vector newStates; - const std::string finalState = EXPECTED_FINAL_STATE.at(event); - - std::condition_variable cv; - std::mutex cv_mu; - - auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { - // CONFIGURE arguments must be pushed during InitializingDevice - if (reachedState == fair::mq::PluginServices::DeviceState::InitializingDevice) { - - // FIXME: workaround which special cases a stoi for certain properties - // which must be pushed as int. - // This should be removed once SetPropertyAsString becomes available. - const std::vector intKeys = { - "rateLogging", - "rcvBufSize", - "sndBufSize", - "linger", - "rcvKernelSize", - "sndKernelSize" - }; - for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - auto key = it->key(); - if (boost::starts_with(key, "chans.")) { - key.erase(0, 6); - std::vector split; - boost::split(split, key, std::bind1st(std::equal_to(), '.')); - if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { - auto intValue = std::stoi(it->value()); - m_pluginServices->SetProperty(it->key(), intValue); - } - else { - m_pluginServices->SetProperty(it->key(), it->value()); - } - } - else { - m_pluginServices->SetProperty(it->key(), it->value()); - } - } - } - - std::unique_lock lk(cv_mu); - newStates.push_back(fair::mq::PluginServices::ToStr(reachedState)); - OLOG(DEBUG) << "transition newStates vector: " << boost::algorithm::join(newStates, ", "); - cv.notify_one(); - }; - - auto id = generateSubscriptionId("Transition"); - - m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); - DEFER({ - m_pluginServices->UnsubscribeFromDeviceStateChange(id); - }); - - try { - auto evt = fair::mq::PluginServices::ToDeviceStateTransition(event); - - // FIXME: big ugly workaround over here - // Since FairMQ currently (11/2018) can't yet implicitly create channels when receiving - // chans.* properties during INITIALIZING DEVICE, we must fake a --channel-config cli - // parameter during INIT and before the INIT DEVICE event. - // We extract channel related properties from the OCC transition arguments vector and we - // build up a vector of strings which mimics stuff along the lines of - // --channel-config name=data,type=push,method=bind,address=tcp://*:5555,rateLogging=0" - // See https://github.com/FairRootGroup/FairMQ/pull/111 - // When the relevant FairMQ 1.4.x version implements implicit channel creation, this whole - // block should be removed with no loss of functionality. - if (evt == fair::mq::PluginServices::DeviceStateTransition::InitDevice) { - std::unordered_map> channels; - for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - auto key = it->key(); - if (boost::starts_with(key, "chans.")) { - key.erase(0, 6); - std::vector split; - boost::split(split, key, std::bind1st(std::equal_to(), '.')); - if (split.size() != 3) - continue; - auto name = split[0]; - auto propKey = split[2]; - if (channels.find(name) == channels.end()) // if map for this chan doesn't exist yet - channels[name] = std::unordered_map(); - channels[name][propKey] = it->value(); - } - } - - std::vector channelLines; - for (auto it = channels.cbegin(); it != channels.cend(); ++it) { - std::vector line; - line.push_back("name=" + it->first); - for (auto jt = it->second.cbegin(); jt != it->second.cend(); ++jt) { - line.push_back(jt->first + "=" + jt->second); - } - channelLines.push_back(boost::join(line, ",")); - OLOG(DEBUG) << "transition pushing channel configuration " << channelLines.back(); - } - if (!channelLines.empty()) { - m_pluginServices->SetProperty("channel-config", channelLines); - } - } - // Run number must be pushed immediately before RUN transition - else if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { - try { - for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - m_pluginServices->SetProperty(it->key(), it->value()); - } - } - catch (std::runtime_error &e) { - OLOG(WARNING) << "transition cannot push RUN transition arguments, reason:" << e.what(); - } - } - m_pluginServices->ChangeDeviceState("OCC", evt); - } - catch (fair::mq::PluginServices::DeviceControlError& e) { - OLOG(ERROR) << "transition cannot request transition: " << e.what(); - return grpc::Status(grpc::INTERNAL, "cannot request transition, OCC plugin has no device control"); - } - catch (std::out_of_range& e) { - OLOG(ERROR) << "transition invalid event name: " << request->transitionevent(); - return grpc::Status(grpc::INVALID_ARGUMENT, "argument " + request->transitionevent() + " is not a valid transition name"); - } - - { - std::unique_lock lk(cv_mu); - - // IF we have no states in list yet, OR - // we have some states, and the last one is an intermediate state (for which an autotransition is presumably about to happen) - if (newStates.empty() || isIntermediateState(newStates.back())) { - // We need to block until the transitions are complete - for (;;) { - cv.wait(lk); - if (newStates.empty()) { - OLOG(ERROR) << "[request Transition] notify condition met but no states written"; - break; - } - - OLOG(DEBUG) << "transition notify condition met, reached state: " << newStates.back(); - if (isIntermediateState(newStates.back())) { //if it's an auto state - continue; - } else { - break; - } - } - } + OccLite::nopb::TransitionRequest nopbReq; + nopbReq.srcState = request->srcstate(); + nopbReq.transitionEvent = request->transitionevent(); + nopbReq.arguments = nopbArgs; + + auto transitionOutcome = doTransition(m_pluginServices, nopbReq); + auto grpcStatus = std::get<1>(transitionOutcome); + if (!grpcStatus.ok()) { + return grpcStatus; } - if (newStates.empty()) { - return grpc::Status(grpc::INTERNAL, - "no transitions made, current state stays " + srcState); - } + auto nopbResponse = std::get<0>(transitionOutcome); + response->set_state(nopbResponse.state); + auto sct = new pb::StateChangeTrigger; + pb::StateChangeTrigger_Parse(nopbResponse.trigger, sct); + response->set_trigger(*sct); + response->set_transitionevent(nopbResponse.transitionEvent); + response->set_ok(nopbResponse.ok); - if (srcState == "IDLE" && newStates.back() == "DEVICE READY") { - // Debug: list of FairMQ property keys - auto pk = m_pluginServices->GetPropertyKeys(); - for (const auto &k : pk) { - OLOG(DEBUG) << std::setw(30) << k << " = " + m_pluginServices->GetPropertyAsString(k); - } - auto chi = m_pluginServices->GetChannelInfo(); - OLOG(DEBUG) << "channel info:"; - for (const auto &k : chi) { - OLOG(DEBUG) << k.first << " : " << k.second; - } - } - - response->set_state(newStates.back()); - response->set_transitionevent(request->transitionevent()); - response->set_ok(newStates.back() == finalState); - if (newStates.back() == "ERROR") { // ERROR state - response->set_trigger(pb::DEVICE_ERROR); - } else if (newStates.back() == finalState) { // correct destination state - response->set_trigger(pb::EXECUTOR); - } else { // some other state, for whatever reason - we assume DEVICE_INTENTIONAL - response->set_trigger(pb::DEVICE_INTENTIONAL); - } - - OLOG(DEBUG) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); return grpc::Status::OK; } -bool OccPluginServer::isIntermediateState(const std::string& state) -{ - return state.find("INITIALIZING TASK") != std::string::npos || - state.find("RESETTING") != std::string::npos || - state.find("BINDING") != std::string::npos || - state.find("CONNECTING") != std::string::npos; -} - -std::string OccPluginServer::generateSubscriptionId(const std::string& prefix) -{ - std::string id; - try { - boost::uuids::random_generator gen; - id = boost::uuids::to_string(gen()); - } catch(const boost::uuids::entropy_error &err) { - OLOG(WARNING) << "[generateSubscriptionId] boost::uuids::entropy_error: " << err.what() << " falling back to std::time"; - id = std::to_string(std::time(nullptr)); - } - return "OCC_"s + (prefix.size() ? (prefix + "_") : "") + id; -} diff --git a/occ/plugin/OccPluginServer.h b/occ/plugin/OccPluginServer.h index 28c70f527..53c16bdc1 100644 --- a/occ/plugin/OccPluginServer.h +++ b/occ/plugin/OccPluginServer.h @@ -25,15 +25,13 @@ #ifndef OCCPLUGIN_OCCPLUGINSERVER_H #define OCCPLUGIN_OCCPLUGINSERVER_H +#include "OccFMQCommon.h" + #include "protos/occ.pb.h" #include "protos/occ.grpc.pb.h" #include -// We have to force boost::uuids to rely on /dev/*random instead of getrandom(2) or getentropy(3) -// otherwise on some systems we'd get boost::uuids::entropy_error -#define BOOST_UUID_RANDOM_PROVIDER_FORCE_POSIX - namespace pb = occ_pb; namespace fair @@ -44,22 +42,6 @@ class PluginServices; } } -using namespace std::literals; - -const std::unordered_map EXPECTED_FINAL_STATE = { - {"INIT DEVICE", "INITIALIZING DEVICE"}, - {"COMPLETE INIT","INITIALIZED"}, - {"BIND", "BOUND"}, - {"CONNECT", "DEVICE READY"}, - {"INIT TASK", "READY"}, - {"RUN", "RUNNING"}, - {"STOP", "READY"}, - {"RESET TASK", "DEVICE READY"}, - {"RESET DEVICE", "IDLE"}, - {"END", "EXITING"}, - {"ERROR FOUND", "ERROR"}, -}; - class OccPluginServer final : public pb::Occ::Service { public: @@ -85,9 +67,6 @@ class OccPluginServer final : public pb::Occ::Service pb::TransitionReply* response) override; private: - bool isIntermediateState(const std::string& state); - std::string generateSubscriptionId(const std::string& prefix = ""); - fair::mq::PluginServices* m_pluginServices; std::mutex m_mu; }; diff --git a/occ/plugin/litestructs/EventStream.cxx b/occ/plugin/litestructs/EventStream.cxx new file mode 100644 index 000000000..da8b81b6c --- /dev/null +++ b/occ/plugin/litestructs/EventStream.cxx @@ -0,0 +1,69 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "EventStream.h" + +bool OccLite::nopb::EventStreamRequest::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + writer->EndObject(); + return true; +} + +bool OccLite::nopb::EventStreamRequest::Deserialize(const rapidjson::Value& obj) +{ + return true; +} + +bool OccLite::nopb::EventStreamResponse::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + + writer->String("event"); + event.Serialize(writer); + + writer->EndObject(); + return true; +} + +bool OccLite::nopb::EventStreamResponse::Deserialize(const rapidjson::Value& obj) +{ + return false; +} + +bool OccLite::nopb::DeviceEvent::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + + writer->String("type"); + writer->Uint(type); + + writer->EndObject(); + return true; +} + +bool OccLite::nopb::DeviceEvent::Deserialize(const rapidjson::Value& obj) +{ + return false; +} diff --git a/occ/plugin/litestructs/EventStream.h b/occ/plugin/litestructs/EventStream.h new file mode 100644 index 000000000..59e10e575 --- /dev/null +++ b/occ/plugin/litestructs/EventStream.h @@ -0,0 +1,119 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_EVENTSTREAM_H +#define OCC_EVENTSTREAM_H + + +#include "JsonMessage.h" + +#include +#include + +#include +#include + +namespace OccLite +{ +namespace nopb +{ + +struct EventStreamRequest : public JsonMessage +{ + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +enum DeviceEventType : unsigned { + NULL_DEVICE_EVENT = 0, + END_OF_STREAM = 1, + BASIC_TASK_TERMINATED = 2 +}; + +struct DeviceEvent : public JsonMessage +{ + DeviceEventType type; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +struct EventStreamResponse : public JsonMessage +{ + DeviceEvent event; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +} // namespace nopb +} // namespace OccLite + + +namespace grpc +{ +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::EventStreamRequest* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::EventStreamRequest& source, ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::EventStreamResponse* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::EventStreamResponse& source, + ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +} // namespace grpc + +#endif //OCC_EVENTSTREAM_H diff --git a/occ/plugin/litestructs/GetState.cxx b/occ/plugin/litestructs/GetState.cxx new file mode 100644 index 000000000..82984f572 --- /dev/null +++ b/occ/plugin/litestructs/GetState.cxx @@ -0,0 +1,54 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "GetState.h" + +bool OccLite::nopb::GetStateResponse::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + + writer->String("state"); + writer->String(state); + + writer->EndObject(); + return true; +} + +bool OccLite::nopb::GetStateResponse::Deserialize(const rapidjson::Value& obj) +{ + state = obj["state"].GetString(); + return true; +} + +bool OccLite::nopb::GetStateRequest::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + writer->EndObject(); + return true; +} + +bool OccLite::nopb::GetStateRequest::Deserialize(const rapidjson::Value& obj) +{ + return true; +} diff --git a/occ/plugin/litestructs/GetState.h b/occ/plugin/litestructs/GetState.h new file mode 100644 index 000000000..f7671e520 --- /dev/null +++ b/occ/plugin/litestructs/GetState.h @@ -0,0 +1,103 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_GETSTATE_H +#define OCC_GETSTATE_H + +#include "JsonMessage.h" + +#include +#include + +#include +#include + +namespace OccLite +{ +namespace nopb +{ +struct GetStateRequest : public JsonMessage +{ + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +struct GetStateResponse : public JsonMessage +{ + std::string state; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +} // namespace nopb +} // namespace OccLite + + +namespace grpc +{ +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::GetStateRequest* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::GetStateRequest& source, ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::GetStateResponse* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::GetStateResponse& source, + ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +} // namespace grpc + +#endif //OCC_GETSTATE_H diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx new file mode 100644 index 000000000..d18ed3291 --- /dev/null +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -0,0 +1,83 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "JsonMessage.h" + +std::string OccLite::nopb::JsonMessage::Serialize() const +{ + rapidjson::StringBuffer ss; + rapidjson::Writer writer(ss); + if (Serialize(&writer)) + return ss.GetString(); + return ""; +} + +bool OccLite::nopb::JsonMessage::Deserialize(const std::string& s) +{ + rapidjson::Document doc; + if (!InitDocument(s, doc)) { + return false; + } + + Deserialize(doc); + + return true; +} + +bool OccLite::nopb::JsonMessage::InitDocument(const std::string& s, rapidjson::Document& doc) +{ + if (s.empty()) + return false; + + std::string validJson(s); + + return !doc.Parse(validJson.c_str()).HasParseError() ? true : false; +} + +bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) +{ + auto slices = new std::vector<::grpc::Slice>; + auto status = byte_buffer->Dump(slices); + if (slices->size() != 1) return false; + + auto rawSlice = (*slices)[0].c_slice(); + std::string str = grpc::StringFromCopiedSlice(rawSlice); + ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); + OLOG(INFO) << "Deserializing Message:\n" << str; + + return Deserialize(str); +} + +::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const +{ + std::string str = Serialize(); + OLOG(INFO) << "Serialized Message:\n" << str; + + // grpc::string = std::string + // We build a Slice(grpc::string) and we add it to the ByteBuffer + // as first and only item. + auto slice = new grpc::Slice(str); + auto ownBb = new grpc::ByteBuffer(slice, 1); + return ownBb; +} diff --git a/occ/plugin/litestructs/JsonMessage.h b/occ/plugin/litestructs/JsonMessage.h new file mode 100644 index 000000000..7c72fff3b --- /dev/null +++ b/occ/plugin/litestructs/JsonMessage.h @@ -0,0 +1,61 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_JSONMESSAGE_H +#define OCC_JSONMESSAGE_H + +#define RAPIDJSON_HAS_STDSTRING 1 + +#include "util/Logger.h" + +#include +#include +#include +#include + +namespace OccLite +{ +namespace nopb +{ + +class JsonMessage +{ +public: + virtual bool Deserialize(const std::string& s); + virtual bool Deserialize(::grpc::ByteBuffer* byte_buffer); + + virtual std::string Serialize() const; + virtual ::grpc::ByteBuffer* SerializeToByteBuffer() const; + + virtual bool Deserialize(const rapidjson::Value& obj) = 0; + virtual bool Serialize(rapidjson::Writer* writer) const = 0; + +protected: + bool InitDocument(const std::string& s, rapidjson::Document& doc); +}; + +} // namespace nopb +} // namespace OccLite + +#endif //OCC_JSONMESSAGE_H diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx new file mode 100644 index 000000000..8f7318a58 --- /dev/null +++ b/occ/plugin/litestructs/Transition.cxx @@ -0,0 +1,82 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#include "Transition.h" + +bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + + writer->String("srcState"); writer->String(srcState); + writer->String("transitionEvent"); writer->String(transitionEvent); + writer->String("arguments"); writer->StartArray(); + for (const auto& it : arguments) { + writer->StartObject(); + writer->String("key"); writer->String(it.first); + writer->String("value"); writer->String(it.second); + writer->EndObject(); + } + writer->EndArray(); + writer->EndObject(); + return true; +} + +bool OccLite::nopb::TransitionRequest::Deserialize(const rapidjson::Value& obj) +{ + OLOG(INFO) << "Deserializing TransitionRequest"; + + srcState = obj["srcState"].GetString(); + transitionEvent = obj["transitionEvent"].GetString(); + OLOG(INFO) << "state and transitionEvent ok"; + + if (obj.HasMember("arguments")) { + auto array = obj["arguments"].GetArray(); + for (const auto& it : array) { + auto thisItem = it.GetObject(); + arguments[thisItem["key"].GetString()] = thisItem["value"].GetString(); + } + } + OLOG(INFO) << "Deserialized TransitionRequest:"; + OLOG(INFO) << JsonMessage::Serialize(); + + return true; +} + +bool OccLite::nopb::TransitionResponse::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + + writer->String("trigger"); writer->Uint(trigger); + writer->String("state"); writer->String(state); + writer->String("transitionEvent"); writer->String(transitionEvent); + writer->String("ok"); writer->Bool(ok); + + writer->EndObject(); + return true; +} + +bool OccLite::nopb::TransitionResponse::Deserialize(const rapidjson::Value& obj) +{ + return false; +} diff --git a/occ/plugin/litestructs/Transition.h b/occ/plugin/litestructs/Transition.h new file mode 100644 index 000000000..238549f1c --- /dev/null +++ b/occ/plugin/litestructs/Transition.h @@ -0,0 +1,118 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_TRANSITION_H +#define OCC_TRANSITION_H + + +#include "JsonMessage.h" + +#include +#include + +#include +#include + +namespace OccLite +{ +namespace nopb +{ + +struct TransitionRequest : public JsonMessage +{ + std::string srcState; + std::string transitionEvent; + std::map arguments; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +enum StateChangeTrigger : unsigned { + EXECUTOR = 0, + DEVICE_INTENTIONAL = 1, + DEVICE_ERROR = 2 +}; + +struct TransitionResponse : public JsonMessage +{ + StateChangeTrigger trigger; // can be EXECUTOR DEVICE_INTENTIONAL DEVICE_ERROR + std::string state; + std::string transitionEvent; + bool ok; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; + +} // namespace nopb +} // namespace OccLite + + +namespace grpc +{ +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::TransitionRequest* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::TransitionRequest& source, ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +template<> +class SerializationTraits +{ +public: + static Status Deserialize(ByteBuffer* byte_buffer, OccLite::nopb::TransitionResponse* dest) + { + bool ok = dest->JsonMessage::Deserialize(byte_buffer); + std::cout << "ok: " << ok << " slice dump:" << dest->JsonMessage::Serialize() << std::endl; + return ok ? Status::OK : Status::CANCELLED; + } + + static Status Serialize(const OccLite::nopb::TransitionResponse& source, + ByteBuffer* buffer, + bool* own_buffer) + { + *buffer = *source.JsonMessage::SerializeToByteBuffer(); + *own_buffer = true; + return g_core_codegen_interface->ok(); + } +}; + +} // namespace grpc + +#endif //OCC_TRANSITION_H From b156a08c3891cda5bf3d8062ea45ab3e075b478f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 12:21:41 +0200 Subject: [PATCH 0225/2352] [OCC] Fix serialization of Transition arguments --- occ/plugin/OccFMQCommon.cxx | 12 +++++------ occ/plugin/litestructs/GetState.h | 1 - occ/plugin/litestructs/Transition.cxx | 30 ++++++++++++++++++++------- occ/plugin/litestructs/Transition.h | 9 +++++++- 4 files changed, 37 insertions(+), 15 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index f69df929c..1583694b2 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -89,8 +89,8 @@ std::tuple doTransition(fair: "sndKernelSize" }; for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - std::string key = it->first; - std::string value = it->second; + std::string key = it->key; + std::string value = it->value; if (boost::starts_with(key, "chans.")) { key.erase(0, 6); std::vector split; @@ -138,8 +138,8 @@ std::tuple doTransition(fair: if (evt == fair::mq::PluginServices::DeviceStateTransition::InitDevice) { std::unordered_map> channels; for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - std::string key = it->first; - std::string value = it->second; + std::string key = it->key; + std::string value = it->value; if (boost::starts_with(key, "chans.")) { key.erase(0, 6); std::vector split; @@ -171,8 +171,8 @@ std::tuple doTransition(fair: // Run number must be pushed immediately before RUN transition else if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { try { - for (auto const& [key, value] : arguments) { - m_pluginServices->SetProperty(key, value); + for (auto const& entry : arguments) { + m_pluginServices->SetProperty(entry.key, entry.value); } } catch (std::runtime_error &e) { diff --git a/occ/plugin/litestructs/GetState.h b/occ/plugin/litestructs/GetState.h index f7671e520..043c9ff5c 100644 --- a/occ/plugin/litestructs/GetState.h +++ b/occ/plugin/litestructs/GetState.h @@ -54,7 +54,6 @@ struct GetStateResponse : public JsonMessage } // namespace nopb } // namespace OccLite - namespace grpc { template<> diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index 8f7318a58..21057b532 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -32,10 +32,7 @@ bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::WriterString("transitionEvent"); writer->String(transitionEvent); writer->String("arguments"); writer->StartArray(); for (const auto& it : arguments) { - writer->StartObject(); - writer->String("key"); writer->String(it.first); - writer->String("value"); writer->String(it.second); - writer->EndObject(); + it.Serialize(writer); } writer->EndArray(); writer->EndObject(); @@ -52,9 +49,10 @@ bool OccLite::nopb::TransitionRequest::Deserialize(const rapidjson::Value& obj) if (obj.HasMember("arguments")) { auto array = obj["arguments"].GetArray(); - for (const auto& it : array) { - auto thisItem = it.GetObject(); - arguments[thisItem["key"].GetString()] = thisItem["value"].GetString(); + for (auto it = array.Begin(); it != array.End(); ++it) { + ConfigEntry *ce = new ConfigEntry; + ce->Deserialize(*it); + arguments.push_back(*ce); } } OLOG(INFO) << "Deserialized TransitionRequest:"; @@ -80,3 +78,21 @@ bool OccLite::nopb::TransitionResponse::Deserialize(const rapidjson::Value& obj) { return false; } + +bool OccLite::nopb::ConfigEntry::Serialize(rapidjson::Writer* writer) const +{ + writer->StartObject(); + writer->String("key"); + writer->String(key); + writer->String("value"); + writer->String(value); + writer->EndObject(); + return true; +} + +bool OccLite::nopb::ConfigEntry::Deserialize(const rapidjson::Value& obj) +{ + key = obj["key"].GetString(); + value = obj["value"].GetString(); + return true; +} diff --git a/occ/plugin/litestructs/Transition.h b/occ/plugin/litestructs/Transition.h index 238549f1c..71ea37c35 100644 --- a/occ/plugin/litestructs/Transition.h +++ b/occ/plugin/litestructs/Transition.h @@ -39,11 +39,18 @@ namespace OccLite namespace nopb { +struct ConfigEntry : public JsonMessage { + std::string key; + std::string value; + + bool Serialize(rapidjson::Writer* writer) const override; + bool Deserialize(const rapidjson::Value& obj) override; +}; struct TransitionRequest : public JsonMessage { std::string srcState; std::string transitionEvent; - std::map arguments; + std::vector arguments; bool Serialize(rapidjson::Writer* writer) const override; bool Deserialize(const rapidjson::Value& obj) override; From dec0928d0e9d5522fb0ff3a113d842926c6c22bb Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 11 May 2020 18:07:45 +0300 Subject: [PATCH 0226/2352] [core] fix subscribe to workflow state change --- core/environment/manager.go | 35 ---------------------- core/environment/transition_configure.go | 37 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 21d5b9b22..ac3936272 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -115,41 +115,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } - // This will subscribe to workflow state change. In case of workflow state - // ERROR will transition environment to ERROR state. The goroutine starts - // after a successful transition to CONFIGURE in order to handle only ERROR - // states triggered by mesos.(TASK_LOST,TASK_KILLED,TASK_FAILED,TASK_ERROR) - go func() { - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.DONE { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - env.setState(wfState.String()) - break WORKFLOW_STATE_LOOP - } - continue - default: - if _, ok := envs.m[env.id.Array()]; !ok { - break WORKFLOW_STATE_LOOP - } - continue - } - } - } - }() - return env.id, err } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 83373f921..135f5ad67 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -178,7 +178,44 @@ func (t ConfigureTransition) do(env *Environment) (err error) { if len(tasks) != 0 { err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) + if err != nil { + return + } } + // This will subscribe to workflow state change. In case of workflow state + // ERROR will transition environment to ERROR state. The goroutine starts + // after a successful transition to CONFIGURE in order to handle only ERROR + // states triggered by mesos.(TASK_LOST,TASK_KILLED,TASK_FAILED,TASK_ERROR) + go func() { + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.DONE { + break WORKFLOW_STATE_LOOP + } + // We kill the goroutine on a reset or a teardown + // of the environment + if wfState == task.STANDBY { + break WORKFLOW_STATE_LOOP + } + if wfState == task.ERROR { + env.setState(wfState.String()) + break WORKFLOW_STATE_LOOP + } + } + } + } + }() + return } From 468eaea8651b13bc85c46a38ee773faa330dfad7 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 11 May 2020 18:45:09 +0300 Subject: [PATCH 0227/2352] [core] transition remaining tasks to Configured on wf state Error --- core/environment/transition_configure.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 135f5ad67..dcca87e88 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -209,7 +209,17 @@ func (t ConfigureTransition) do(env *Environment) (err error) { break WORKFLOW_STATE_LOOP } if wfState == task.ERROR { + prvState := env.CurrentState() env.setState(wfState.String()) + if prvState == "RUNNING" { + err = t.taskman.TransitionTasks( + env.Workflow().GetTasks(), + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + ) + } break WORKFLOW_STATE_LOOP } } From 4536acb554d3fae835c2d09105c12ef5078df7f9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 02:26:21 +0200 Subject: [PATCH 0228/2352] [executor] OCClite (gRPC+JSON) support --- executor/executorcmd/client.go | 4 +- executor/executorcmd/nopb/jsoncodec.go | 50 ++++++++++++++ executor/executorcmd/nopb/occclient.go | 93 ++++++++++++++++++++++++++ 3 files changed, 146 insertions(+), 1 deletion(-) create mode 100644 executor/executorcmd/nopb/jsoncodec.go create mode 100644 executor/executorcmd/nopb/occclient.go diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 0ddaf2ea2..7ecfc69d7 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -34,6 +34,7 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/executor/executorcmd/nopb" "github.com/k0kubun/pp" "google.golang.org/grpc" @@ -62,7 +63,8 @@ func NewClient(controlPort uint64, controlMode controlmode.ControlMode) *RpcClie } client := &RpcClient { - OccClient: pb.NewOccClient(conn), + //OccClient: pb.NewOccClient(conn), + OccClient: nopb.NewOccClient(conn), conn: conn, } diff --git a/executor/executorcmd/nopb/jsoncodec.go b/executor/executorcmd/nopb/jsoncodec.go new file mode 100644 index 000000000..62576b7eb --- /dev/null +++ b/executor/executorcmd/nopb/jsoncodec.go @@ -0,0 +1,50 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package nopb + +import ( + "encoding/json" + + "google.golang.org/grpc/encoding" +) + +func init() { + encoding.RegisterCodec(&JsonCodec{}) +} + +// Satisfies interface grpc.encoding.Codec +type JsonCodec struct {} + +func (*JsonCodec) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func (*JsonCodec) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} + +func (*JsonCodec) Name() string { + return "json" +} diff --git a/executor/executorcmd/nopb/occclient.go b/executor/executorcmd/nopb/occclient.go new file mode 100644 index 000000000..d85755210 --- /dev/null +++ b/executor/executorcmd/nopb/occclient.go @@ -0,0 +1,93 @@ +package nopb + +import ( + "context" + + "google.golang.org/grpc" + + "github.com/AliceO2Group/Control/executor/protos" +) + +// Equivalent to the pb.OccClient interface so we can use protobuf-generated code +type OccClient interface { + EventStream(ctx context.Context, in *pb.EventStreamRequest, opts ...grpc.CallOption) (pb.Occ_EventStreamClient, error) + StateStream(ctx context.Context, in *pb.StateStreamRequest, opts ...grpc.CallOption) (pb.Occ_StateStreamClient, error) + GetState(ctx context.Context, in *pb.GetStateRequest, opts ...grpc.CallOption) (*pb.GetStateReply, error) + Transition(ctx context.Context, in *pb.TransitionRequest, opts ...grpc.CallOption) (*pb.TransitionReply, error) +} +type occClient struct { + cc *grpc.ClientConn +} + +func NewOccClient(cc *grpc.ClientConn) OccClient { + return &occClient{cc} +} + +type occEventStreamClient struct { + grpc.ClientStream +} +func (x *occEventStreamClient) Recv() (*pb.EventStreamReply, error) { + m := new(pb.EventStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) EventStream(ctx context.Context, in *pb.EventStreamRequest, opts ...grpc.CallOption) (pb.Occ_EventStreamClient, error) { + opts = append(opts, + []grpc.CallOption{ + grpc.CallContentSubtype("json"), + }... + ) + streamDesc := grpc.StreamDesc{ + StreamName: "EventStream", + Handler: nil, + ServerStreams: true, + ClientStreams: false, + } + stream, err := c.cc.NewStream(ctx, &streamDesc, "EventStream", opts...) + if err != nil { + return nil, err + } + x := &occEventStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +func (c *occClient) StateStream(ctx context.Context, in *pb.StateStreamRequest, opts ...grpc.CallOption) (pb.Occ_StateStreamClient, error) { + return nil, nil +} + +func (c *occClient) GetState(ctx context.Context, in *pb.GetStateRequest, opts ...grpc.CallOption) (*pb.GetStateReply, error) { + out := pb.GetStateReply{} + opts = append(opts, + []grpc.CallOption{ + grpc.CallContentSubtype("json"), + }... + ) + err := c.cc.Invoke(ctx, "GetState", in, &out, opts...) + if err != nil { + return nil, err + } + return &out, nil +} + +func (c *occClient) Transition(ctx context.Context, in *pb.TransitionRequest, opts ...grpc.CallOption) (*pb.TransitionReply, error) { + out := new(pb.TransitionReply) + opts = append(opts, + []grpc.CallOption{ + grpc.CallContentSubtype("json"), + }... + ) + err := c.cc.Invoke(ctx, "Transition", in, &out, opts...) + if err != nil { + return nil, err + } + return out, nil +} From 6ab4d6a09c2dd07164b8eb345d57930d7ab40c4e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 02:51:00 +0200 Subject: [PATCH 0229/2352] [executor] OCClite client test --- executor/executorcmd/nopb/test/main.go | 75 ++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 executor/executorcmd/nopb/test/main.go diff --git a/executor/executorcmd/nopb/test/main.go b/executor/executorcmd/nopb/test/main.go new file mode 100644 index 000000000..c3004d9c1 --- /dev/null +++ b/executor/executorcmd/nopb/test/main.go @@ -0,0 +1,75 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +import ( + "context" + "fmt" + "os" + "strconv" + "time" + + "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" + pb "github.com/AliceO2Group/Control/executor/protos" + "github.com/k0kubun/pp" + "google.golang.org/grpc" +) + +func main() { + targetPortS := os.Args[1] + targetPort, _ := strconv.Atoi(targetPortS) + fmt.Printf("target port: %d", targetPort) + + c := executorcmd.NewClient(uint64(targetPort), controlmode.FAIRMQ) + + time.Sleep(3*time.Second) + gsr, err := c.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + if err != nil { + fmt.Println(err.Error()) + } + fmt.Println("GetState RESPONSE:") + _, _ = pp.Println(*gsr) + + tr, err := c.Transition(context.TODO(), &pb.TransitionRequest{ + SrcState: "IDLE", + TransitionEvent: fairmq.EvtINIT_DEVICE, + Arguments: nil, + }) + if err != nil { + fmt.Println(err.Error()) + } + fmt.Printf("RESPONSE:\n%v\n", *tr) + _, _ = pp.Println(*tr) + + gsr, err = c.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + if err != nil { + fmt.Println(err.Error()) + } + fmt.Println("GetState RESPONSE:") + _, _ = pp.Println(*gsr) + +} From 76eb02327083fc2355e6fcdfb6df5e19ffbb2eab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 02:55:47 +0200 Subject: [PATCH 0230/2352] [core] Support FairMQ plugin and plugin path configuration --- core/config.go | 23 ++++++++++++++++++++++- core/task/task.go | 5 +++-- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/config.go b/core/config.go index 6a8733ab2..06e094818 100644 --- a/core/config.go +++ b/core/config.go @@ -37,6 +37,7 @@ import ( "net/url" "os" "path/filepath" + "strings" ) import _ "github.com/spf13/viper/remote" @@ -89,7 +90,8 @@ func setDefaults() error { viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) viper.SetDefault("globalConfigurationUri", "") //TODO: TBD - + viper.SetDefault("fmqPlugin", "OCClite"); + viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/"); return nil } @@ -128,11 +130,27 @@ func setFlags() error { pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("globalConfigurationUri", viper.GetString("globalConfigurationUri"), "URI of the Consul server or YAML configuration file, used for global configuration.") + pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks.") + pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes.") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) } +func checkFmqPluginName() error { + allowedPluginNames := []string{"OCC", "OCClite"} + chosenPlugin := viper.GetString("fmqPlugin") + for _, allowed := range allowedPluginNames { + if chosenPlugin == allowed { + return nil + } + } + return fmt.Errorf("plugin name \"%s\" is invalid, allowed values: %s", + chosenPlugin, + strings.Join(allowedPluginNames, ", "), + ) +} + func parseCoreConfig() error { coreCfgUri := viper.GetString("coreConfigurationUri") uri, err := url.Parse(coreCfgUri) @@ -205,6 +223,9 @@ func NewConfig() (err error) { return } bindEnvironmentVariables() + if err = checkFmqPluginName(); err != nil { + return + } if err = checkRepoDirRights(); err != nil { return } diff --git a/core/task/task.go b/core/task/task.go index 90b23b28b..1e1d732db 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -43,6 +43,7 @@ import ( "github.com/mesos/mesos-go/api/v1/lib" "github.com/pborman/uuid" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) var log = logger.New(logrus.StandardLogger(),"task") @@ -245,8 +246,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.Arguments = append(cmd.Arguments, "--id", t.GetTaskId()) } cmd.Arguments = append(cmd.Arguments, - "-S", "$CONTROL_OCCPLUGIN_ROOT/lib/", - "-P", "OCC", + "-S", viper.GetString("fmqPluginSearchPath"), + "-P", viper.GetString("fmqPlugin"), "--color", "false") } From 77b59ab1fab5eb2bd939c5d87dd6cff6d6356fd9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 11:51:24 +0200 Subject: [PATCH 0231/2352] [core] Extract StringSliceContains to utils --- common/utils/utils.go | 9 +++++++++ core/task/task.go | 11 ++--------- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index db8bacde7..ad1742d5b 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -60,3 +60,12 @@ func EnsureTrailingSlash(path *string) { // helper func to package strings up nicely for protobuf func ProtoString(s string) *string { return &s } + +func StringSliceContains(s []string, str string) bool { + for _, a := range s { + if a == str { + return true + } + } + return false +} diff --git a/core/task/task.go b/core/task/task.go index 1e1d732db..4864e0cc7 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow/template" @@ -233,16 +234,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if class.Control.Mode == controlmode.FAIRMQ { // FIXME read this from configuration - contains := func(s []string, str string) bool { - for _, a := range s { - if a == str { - return true - } - } - return false - } // if the task class doesn't provide an id, we generate one ourselves - if !contains(cmd.Arguments, "--id") { + if !utils.StringSliceContains(cmd.Arguments, "--id") { cmd.Arguments = append(cmd.Arguments, "--id", t.GetTaskId()) } cmd.Arguments = append(cmd.Arguments, From 05664128de93fa146154d1f3eaea8b461d32467b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 11:52:20 +0200 Subject: [PATCH 0232/2352] [executor] Support switching between Protobuf and JSON transport --- executor/executable/controllabletask.go | 8 +++++++- executor/executorcmd/client.go | 20 ++++++++++++++++---- occ/peanut/peanut.go | 2 +- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 597575a6d..2ae1ef58a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -33,6 +33,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -94,7 +95,12 @@ func (t *ControllableTask) Launch() error { "id": t.ti.TaskID.Value, }). Debug("starting gRPC client") - t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode) + + controlTransport := executorcmd.ProtobufTransport + if utils.StringSliceContains(taskCmd.Args, "OCClite") { + controlTransport = executorcmd.JsonTransport + } + t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode, controlTransport) if t.rpc == nil { return errors.New("could not start gRPC client") } diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 7ecfc69d7..816dafe39 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -48,12 +48,18 @@ import ( var log = logger.New(logrus.StandardLogger(), "executorcmd") -func NewClient(controlPort uint64, controlMode controlmode.ControlMode) *RpcClient { +type ControlTransport uint32 +const ( + ProtobufTransport = ControlTransport(0) + JsonTransport = ControlTransport(1) +) + +func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlTransport ControlTransport) *RpcClient { endpoint := fmt.Sprintf("127.0.0.1:%d", controlPort) log.WithField("endpoint", endpoint).Debug("starting new gRPC client") cxt, cancel := context.WithTimeout(context.Background(), 20*time.Second) - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure()) + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). @@ -62,9 +68,15 @@ func NewClient(controlPort uint64, controlMode controlmode.ControlMode) *RpcClie return nil } + var occClient pb.OccClient + if controlTransport == JsonTransport { + occClient = nopb.NewOccClient(conn) + } else { + occClient = pb.NewOccClient(conn) + } + client := &RpcClient { - //OccClient: pb.NewOccClient(conn), - OccClient: nopb.NewOccClient(conn), + OccClient: occClient, conn: conn, } diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index ddf0f88d4..e9e0243df 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -280,7 +280,7 @@ func Run(cmdString string) (err error) { // Setup RPC go func() { // FIXME allow choice of controlmode.FAIRMQ - rpcClient = executorcmd.NewClient(occPort, controlmode.DIRECT) + rpcClient = executorcmd.NewClient(occPort, controlmode.DIRECT, executorcmd.ProtobufTransport) var response *pb.GetStateReply response, err = rpcClient.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { From 66a5e5fa1fb28ffca9579406d6284d03589ad989 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 11:53:16 +0200 Subject: [PATCH 0233/2352] [executor] Update OCClite test --- executor/executorcmd/nopb/test/main.go | 28 +++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/executor/executorcmd/nopb/test/main.go b/executor/executorcmd/nopb/test/main.go index c3004d9c1..d151ad14b 100644 --- a/executor/executorcmd/nopb/test/main.go +++ b/executor/executorcmd/nopb/test/main.go @@ -33,7 +33,6 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/executor/executorcmd" - "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/k0kubun/pp" "google.golang.org/grpc" @@ -45,16 +44,27 @@ func main() { fmt.Printf("target port: %d", targetPort) c := executorcmd.NewClient(uint64(targetPort), controlmode.FAIRMQ) + if c == nil { + fmt.Println("client is nil") + } + + for i := 0; i < 10; i++ { + time.Sleep(100*time.Millisecond) - time.Sleep(3*time.Second) - gsr, err := c.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - fmt.Println(err.Error()) + gsr, err := c.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + if err != nil { + fmt.Println(err.Error()) + continue + } + if gsr == nil { + fmt.Println("nil error and response") + continue + } + fmt.Println("GetState RESPONSE:") + _, _ = pp.Println(*gsr) } - fmt.Println("GetState RESPONSE:") - _, _ = pp.Println(*gsr) - tr, err := c.Transition(context.TODO(), &pb.TransitionRequest{ + /*tr, err := c.Transition(context.TODO(), &pb.TransitionRequest{ SrcState: "IDLE", TransitionEvent: fairmq.EvtINIT_DEVICE, Arguments: nil, @@ -70,6 +80,6 @@ func main() { fmt.Println(err.Error()) } fmt.Println("GetState RESPONSE:") - _, _ = pp.Println(*gsr) + _, _ = pp.Println(*gsr)*/ } From 36fd1ee29dd30be8fa0bee469f2f838c1d366a85 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 12:20:07 +0200 Subject: [PATCH 0234/2352] [build] Bump to v0.13.90 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a7d7d0eef..7dec71e57 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 3 +VERSION_PATCH := 90 From 1cd77b84c615c42bb927b42e027db63c215c490e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 14:22:09 +0200 Subject: [PATCH 0235/2352] [occ] Fix Transition argument handling in legacy OCC plugin --- occ/plugin/OccPluginServer.cxx | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index d51933a0e..ef2e4c85d 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -206,14 +206,15 @@ OccPluginServer::Transition(grpc::ServerContext* context, return grpc::Status(grpc::INVALID_ARGUMENT, "null request received"); } - auto nopbArgs = std::map(); - for (const auto &kv : request->arguments()) { - nopbArgs[kv.key()] = kv.value(); - } OccLite::nopb::TransitionRequest nopbReq; nopbReq.srcState = request->srcstate(); nopbReq.transitionEvent = request->transitionevent(); - nopbReq.arguments = nopbArgs; + for (const auto &kv : request->arguments()) { + auto ce = OccLite::nopb::ConfigEntry(); + ce.key = kv.key(); + ce.value = kv.value(); + nopbReq.arguments.push_back(ce); + } auto transitionOutcome = doTransition(m_pluginServices, nopbReq); auto grpcStatus = std::get<1>(transitionOutcome); @@ -223,9 +224,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, auto nopbResponse = std::get<0>(transitionOutcome); response->set_state(nopbResponse.state); - auto sct = new pb::StateChangeTrigger; - pb::StateChangeTrigger_Parse(nopbResponse.trigger, sct); - response->set_trigger(*sct); + response->set_trigger(static_cast(nopbResponse.trigger)); response->set_transitionevent(nopbResponse.transitionEvent); response->set_ok(nopbResponse.ok); From 9a22477bc56b42916cf6924f3ce714b71a995259 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 14:22:58 +0200 Subject: [PATCH 0236/2352] [occ] Find FairLogger's fmt dependency --- occ/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 1d7c41b80..c95dc0ee8 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -183,6 +183,9 @@ set(gRPC_CPP_PLUGIN_EXECUTABLE $) # RapidJSON for OCClite find_package(RapidJSON CONFIG REQUIRED) +# FairLogger dependency for 1.6.x series +find_package(fmt) + ### ### Status messages for build options ### From 5d6c212422ff895a1500a64ccd24a682839929e5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 May 2020 14:23:37 +0200 Subject: [PATCH 0237/2352] [build] Bump to v0.13.91 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7dec71e57..cf64a9b93 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 90 +VERSION_PATCH := 91 From abebd072777728cd574b5007ce62d28189d4ddbd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 May 2020 11:50:18 +0200 Subject: [PATCH 0238/2352] [occ] Fix Mac build --- occ/plugin/OccFMQCommon.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 1583694b2..3138a1757 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -94,7 +94,7 @@ std::tuple doTransition(fair: if (boost::starts_with(key, "chans.")) { key.erase(0, 6); std::vector split; - boost::split(split, key, std::bind1st(std::equal_to(), '.')); + boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { auto intValue = std::stoi(value); m_pluginServices->SetProperty(key, intValue); @@ -143,7 +143,7 @@ std::tuple doTransition(fair: if (boost::starts_with(key, "chans.")) { key.erase(0, 6); std::vector split; - boost::split(split, key, std::bind1st(std::equal_to(), '.')); + boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); if (split.size() != 3) continue; auto name = split[0]; From 04de09ada2ebc574948e8626c8e06285a2f9fe84 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 May 2020 12:30:14 +0200 Subject: [PATCH 0239/2352] [build] Bump to v0.13.92 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cf64a9b93..4aef41dd2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 91 +VERSION_PATCH := 92 From 80a8dca41917884a789b87e37c7e5e3ef062d682 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 14 May 2020 14:41:52 +0300 Subject: [PATCH 0240/2352] [core] create GetConsulPath for confsys --- core/config.go | 1 + core/confsys/service.go | 28 ++++++++++++++++------------ core/state.go | 2 +- 3 files changed, 18 insertions(+), 13 deletions(-) diff --git a/core/config.go b/core/config.go index 06e094818..64d80b127 100644 --- a/core/config.go +++ b/core/config.go @@ -51,6 +51,7 @@ func setDefaults() error { viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD + viper.SetDefault("consulBasePath", "o2/control") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) diff --git a/core/confsys/service.go b/core/confsys/service.go index 9e900e0bc..2d9c805d7 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -67,7 +67,7 @@ type Service struct { } /* Expected structure: -/o2/aliecs/ +/o2/control/ { run_number: 47102, @@ -102,7 +102,7 @@ func newService(uri string) (svc *Service, err error) { func (s *Service) NewDefaultRepo(defaultRepo string) error { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put("o2/control/default_repo", defaultRepo) + return cSrc.Put(filepath.Join(s.GetConsulPath(),"default_repo"), defaultRepo) } else { data := []byte(defaultRepo) return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) @@ -111,7 +111,7 @@ func (s *Service) NewDefaultRepo(defaultRepo string) error { func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get("o2/control/default_repo") + return cSrc.Get(filepath.Join(s.GetConsulPath(),"default_repo")) } else { var defaultRepoData []byte defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) @@ -125,7 +125,7 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { func (s *Service) NewDefaultRevision(defaultRevision string) error { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put("o2/control/default_revision", defaultRevision) + return cSrc.Put(filepath.Join(s.GetConsulPath(),"default_revision"), defaultRevision) } else { data := []byte(defaultRevision) return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) @@ -134,7 +134,7 @@ func (s *Service) NewDefaultRevision(defaultRevision string) error { func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get("o2/control/default_revision") + return cSrc.Get(filepath.Join(s.GetConsulPath(),"default_revision")) } else { var defaultRevisionData []byte defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) @@ -149,7 +149,7 @@ func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { var defaultRevisions map[string]string if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - data, err := cSrc.Get("o2/control/default_revisions") + data, err := cSrc.Get(filepath.Join(s.GetConsulPath(),"default_revisions")) if err != nil { return nil, err } @@ -174,7 +174,7 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er } if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - err = cSrc.Put("o2/control/default_revisions", string(data)) + err = cSrc.Put(filepath.Join(s.GetConsulPath(),"default_revisions"), string(data)) } else { err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) } @@ -183,7 +183,7 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er func (s *Service) NewRunNumber() (runNumber uint32, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.GetNextUInt32("o2/control/run_number") + return cSrc.GetNextUInt32(filepath.Join(s.GetConsulPath(),"run_number")) } else { // Unsafe check-and-set, only for file backend var rnf string @@ -220,11 +220,11 @@ func (s *Service) GetROSource() configuration.ROSource { // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right // before pushing TaskInfos func (s *Service) GetDefaults() map[string]string { - return s.getStringMap("o2/control/defaults") + return s.getStringMap(filepath.Join(s.GetConsulPath(),"defaults")) } func (s *Service) GetVars() map[string]string { - return s.getStringMap("o2/control/vars") + return s.getStringMap(filepath.Join(s.GetConsulPath(),"vars")) } func (s *Service) getStringMap(path string) map[string]string { @@ -261,7 +261,7 @@ func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]stri // Persist Mesos Framework ID by saving to Consul, or to a local file. func (s *Service) NewMesosFID(fidValue string) error { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put("o2/aliecs/mesos_fid", fidValue) + return cSrc.Put(filepath.Join(s.GetConsulPath(),"mesos_fid"), fidValue) } else { data := []byte(fidValue) return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt"), data, 0644) @@ -271,7 +271,7 @@ func (s *Service) NewMesosFID(fidValue string) error { // Retrieve Mesos Framework ID from Consul, or local file. func (s *Service) GetMesosFID() (fidValue string, err error) { if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get("o2/aliecs/mesos_fid") + return cSrc.Get(filepath.Join(s.GetConsulPath(),"mesos_fid")) } else { var byteFidValue []byte byteFidValue, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt")) @@ -323,4 +323,8 @@ func (s *Service) GetComponentConfiguration(path string) (payload string, err er key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp payload, err = s.src.Get(key) return +} + +func (s *Service) GetConsulPath() string { + return viper.GetString("consulBasePath") } \ No newline at end of file diff --git a/core/state.go b/core/state.go index 3a2fa3470..05584d754 100644 --- a/core/state.go +++ b/core/state.go @@ -65,7 +65,7 @@ func newInternalState(shutdown func()) (*internalState, error) { } if viper.GetBool("veryVerbose") { - cfgDump, err := the.ConfSvc().GetROSource().GetRecursive("o2/control") + cfgDump, err := the.ConfSvc().GetROSource().GetRecursive(the.ConfSvc().GetConsulPath()) if err != nil { log.WithError(err).Fatal("cannot retrieve configuration") return nil, err From 5abf5212b09de236db078e73303a47e83b765c7c Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 14 May 2020 15:37:01 +0300 Subject: [PATCH 0241/2352] [core] remove workflow globals.go --- core/workflow/globals.go | 29 ----------------------------- 1 file changed, 29 deletions(-) delete mode 100644 core/workflow/globals.go diff --git a/core/workflow/globals.go b/core/workflow/globals.go deleted file mode 100644 index 534137dcb..000000000 --- a/core/workflow/globals.go +++ /dev/null @@ -1,29 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2018 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -const( - ConfigBasePath = "o2/control/workflows" -) \ No newline at end of file From fada3c5ede23221689f0f97dda91158d3abd79fc Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 20 May 2020 11:32:33 +0300 Subject: [PATCH 0242/2352] [core] default consul path o2/aliecs --- core/config.go | 2 +- core/confsys/service.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index 64d80b127..c1803b880 100644 --- a/core/config.go +++ b/core/config.go @@ -51,7 +51,7 @@ func setDefaults() error { viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD - viper.SetDefault("consulBasePath", "o2/control") + viper.SetDefault("consulBasePath", "o2/aliecs") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) diff --git a/core/confsys/service.go b/core/confsys/service.go index 2d9c805d7..ef895cc26 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -67,7 +67,7 @@ type Service struct { } /* Expected structure: -/o2/control/ +/o2/aliecs/ { run_number: 47102, From d3a31abbce58e1f03bc5264147fea6739a24e08a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 May 2020 17:01:53 +0200 Subject: [PATCH 0243/2352] [build] Correct project domain string for OCC targets --- occ/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index c95dc0ee8..979516113 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -37,7 +37,7 @@ set(CMAKE_INSTALL_LIBDIR lib) ### set(OCC_ORGANIZATION_NAME "O²") -set(OCC_ORGANIZATION_DOMAIN "github.com/AliceO2Group/Control") +set(OCC_ORGANIZATION_DOMAIN "https://github.com/AliceO2Group/Control") set(OCCLIB_PRODUCT_NAME "OCC Library") set(OCCLIB_PRODUCT_MAINTAINER "Teo Mrnjavac ") From e62b9324af13980bfcfa82b85e82f6cedfaa9eeb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 May 2020 17:05:29 +0200 Subject: [PATCH 0244/2352] [occ] Update product name/version log strings --- occ/plugin/OccPlugin.cxx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccPlugin.cxx b/occ/plugin/OccPlugin.cxx index 4aae98a7c..d010ea56d 100644 --- a/occ/plugin/OccPlugin.cxx +++ b/occ/plugin/OccPlugin.cxx @@ -88,13 +88,18 @@ void OccPlugin::runServer(fair::mq::PluginServices* pluginServices, const std::s builder.AddListeningPort(serverAddress, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr server(builder.BuildAndStart()); - OLOG(DEBUG) << "gRPC server listening on port " << controlPort; + +#ifdef OCC_LITE_SERVICE + OLOG(DEBUG) << OCCLITE_PRODUCT_NAME << " v" << OCC_VERSION << " listening on port " << controlPort; +#else + OLOG(DEBUG) << OCCPLUGIN_PRODUCT_NAME << " (legacy) v" << OCC_VERSION << " listening on port " << controlPort; +#endif std::function teardown = [&server]() { server->Shutdown(); }; addTeardownTask(teardown); server->Wait(); - OLOG(DEBUG) << "gRPC server stopped"; + OLOG(DEBUG) << "OCC control server stopped"; } void OccPlugin::addTeardownTask(std::function& func) From 1098d531e30987e3fd231c664b03acc1d589bab6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 May 2020 17:10:23 +0200 Subject: [PATCH 0245/2352] [executor] Fix detection of OCClite plugin (and JSON transport) --- executor/executable/controllabletask.go | 13 ++++++++++--- executor/executorcmd/client.go | 10 +++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 2ae1ef58a..211a8098c 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -29,11 +29,11 @@ import ( "encoding/json" "errors" "io" + "strings" "syscall" "time" "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -93,13 +93,20 @@ func (t *ControllableTask) Launch() error { "controlMode": t.tci.ControlMode.String(), "task": t.ti.Name, "id": t.ti.TaskID.Value, + "path": taskCmd.Path, + "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", + "argc": len(taskCmd.Args), }). Debug("starting gRPC client") controlTransport := executorcmd.ProtobufTransport - if utils.StringSliceContains(taskCmd.Args, "OCClite") { - controlTransport = executorcmd.JsonTransport + for _, v := range taskCmd.Args { + if strings.Contains(v, "-P OCClite") { + controlTransport = executorcmd.JsonTransport + break + } } + t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode, controlTransport) if t.rpc == nil { return errors.New("could not start gRPC client") diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 816dafe39..bd2b87f13 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -56,13 +56,21 @@ const ( func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlTransport ControlTransport) *RpcClient { endpoint := fmt.Sprintf("127.0.0.1:%d", controlPort) - log.WithField("endpoint", endpoint).Debug("starting new gRPC client") + controlTransportS := "Protobuf" + if controlTransport == JsonTransport { + controlTransportS = "JSON" + } + + log.WithField("endpoint", endpoint). + WithField("transport", controlTransportS). + Debug("starting new gRPC client") cxt, cancel := context.WithTimeout(context.Background(), 20*time.Second) conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). + WithField("transport", controlTransportS). Errorf("gRPC client can't dial") cancel() return nil From 8c3f3c6050b0f55e15da704e533982cceb8c8eb0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 May 2020 17:11:12 +0200 Subject: [PATCH 0246/2352] [misc] Obsolete config file is obsolete --- hacking/config.yaml | 1507 +------------------------------------------ 1 file changed, 1 insertion(+), 1506 deletions(-) diff --git a/hacking/config.yaml b/hacking/config.yaml index 1a4df2e5f..2f6a6cc46 100644 --- a/hacking/config.yaml +++ b/hacking/config.yaml @@ -1,1509 +1,4 @@ --- # This emulates the contents of a Consul instance which serves all O² configuration. o2: - control: # Root for O² Control configuration - # Here we have 2 main sections: tasks and workflows. - # The tasks section contains a list of task templates, i.e. descriptors for the generic kind of process to be run. - # These task templates are then referenced by workflow templates later on. - tasks: - - name: fairmq-ex-1-n-1-sampler # Name of the task, used as a unique identifier in workflows - control: - mode: fairmq # The control mode to be used. This is "fairmq" for all FairMQ devices and "direct" otherwise. - wants: # Includes fields "cpu", "memory", "ports". The first two are float, respectively for number of cores - # and MB of RAM. "ports" is a string, formatted as a comma-separated sequence of static port ranges - # such as "8080-8083,9091-10100". - # Note: the "ports" string has nothing to do with channels, these are static requests for specific ports - # and they should be used sparingly, if at all. - cpu: 0.1 - memory: 128 - bind: # "bind" contains a list of *inbound* channels to configure, and it only applies to FairMQ - # devices (method: bind). - - name: "data1" # channel name - type: "push" # channel type, can be push, pull, pub, sub - sndBufSize: 1000 # other FairMQ channel properties to push - rcvBufSize: 1000 - rateLogging: 0 - properties: # Contains a key-value map of FairMQ properties to push - severity: trace - color: false - command: # Specification of the command to run - env: [] # List of strings, each of which is an environment variable to set like "VAR=value" - shell: true # Generally must be true if we use environment modules - arguments: [] # List of arguments for the command - # "value" is the actual command to run in the shell (if shell == true) or otherwise the path - # of the executable. Since we use environment modules, we must take care to load them - # beforehand, including the Control-OCCPlugin module. - # The module list line is added here for debug purposes. - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-1-n-1-sampler - - name: fairmq-ex-1-n-1-processor - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-1-n-1-processor - - name: fairmq-ex-1-n-1-sink - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: - - name: "data2" - type: "pull" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-1-n-1-sink - - name: fairmq-ex-copypush-sampler - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: - - name: "data" - type: "push" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-copypush-sampler - - name: fairmq-ex-copypush-sink - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-copypush-sink - - name: fairmq-ex-multiple-channels-sampler - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: - - name: "data" - type: "push" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-multiple-channels-sampler - - name: fairmq-ex-multiple-channels-sink - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-multiple-channels-sink - - name: fairmq-ex-multiple-channels-broadcaster - control: - mode: fairmq - wants: - cpu: 0.1 - memory: 128 - bind: - - name: "broadcast" - type: "pub" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: [] - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load FairMQ && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - fairmq-ex-multiple-channels-broadcaster - - - name: qc-basic-producer - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_producer_to_Dispatcher" - type: "push" - rateLogging: 60 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "producer" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunBasic - - name: qc-basic-dispatcher - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_Dispatcher_to_QcTask" - type: "push" - rateLogging: 60 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "Dispatcher" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunBasic - - name: qc-basic-qctask - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_QcTask_to_checker_0" - type: "push" - rateLogging: 60 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "QcTask" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunBasic - - name: qc-basic-qctask-checker - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_checker_0_to_printer" - type: "push" - rateLogging: 60 - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "checker_0" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunBasic - - name: qc-basic-printer - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "printer" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunBasic - - ## QC-advanced tasks - - name: source-1 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_source-1_to_step-1" - type: "push" - - name: "from_source-1_to_sink-1" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "source-1" - - - name: step-1 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_step-1_to_sink-1" - type: "push" - - name: "from_step-1_to_Dispatcher1" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "step-1" - - - name: Dispatcher1 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_Dispatcher1_to_dataSizeTask1" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "Dispatcher1" - - - name: dataSizeTask1 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_dataSizeTask1_to_dataSizeTask-merger" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dataSizeTask1" - - - name: source-2 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_source-2_to_step-2" - type: "push" - - name: "from_source-2_to_sink-2" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "source-2" - - - name: step-2 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_step-2_to_sink-2" - type: "push" - - name: "from_step-2_to_Dispatcher2" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "step-2" - - - name: sink-2 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_sink-2_to_Dispatcher2" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "sink-2" - - - name: Dispatcher2 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_Dispatcher2_to_dataSizeTask2" - type: "push" - - name: "from_Dispatcher2_to_someNumbersTask" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "Dispatcher2" - - - name: dataSizeTask2 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_dataSizeTask2_to_dataSizeTask-merger" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dataSizeTask2" - - - name: source-3 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_source-3_to_step-3" - type: "push" - - name: "from_source-3_to_sink-3" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "source-3" - - - name: step-3 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_step-3_to_sink-3" - type: "push" - - name: "from_step-3_to_Dispatcher3" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "step-3" - - - name: Dispatcher3 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_Dispatcher3_to_dataSizeTask3" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "Dispatcher3" - - - name: dataSizeTask3 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_dataSizeTask3_to_dataSizeTask-merger" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dataSizeTask3" - - - name: dataSizeTask-merger - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_dataSizeTask-merger_to_dataSizeTask-checker" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dataSizeTask-merger" - - - name: dataSizeTask-checker - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_dataSizeTask-checker_to_dpl-global-binary-file-sink" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dataSizeTask-checker" - - - name: someNumbersTask - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_someNumbersTask_to_someNumbersTask-checker" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "someNumbersTask" - - - name: someNumbersTask-checker - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_someNumbersTask-checker_to_dpl-global-binary-file-sink" - type: "push" - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "someNumbersTask-checker" - - - name: sink-1 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "sink-1" - - - name: sink-3 - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "sink-3" - - - name: dpl-global-binary-file-sink - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - shell: true - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcRunAdvanced - arguments: - - "-b" - - "--monitoring-backend" - - "no-op://" - - "--id" - - "dpl-global-binary-file-sink" - - "--keep" - - "--outfile" - - "dpl-out.bin" - - - name: o2-dpl-A - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_A_to_B" - type: "push" - - name: "from_A_to_C" - type: "push" - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "A" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load O2 && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - o2DiamondWorkflow - - name: o2-dpl-B - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_B_to_D" - type: "push" - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "B" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load O2 && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - o2DiamondWorkflow - - name: o2-dpl-C - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: - - name: "from_C_to_D" - type: "push" - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "C" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load O2 && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - o2DiamondWorkflow - - name: o2-dpl-D - control: - mode: fairmq - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: - severity: trace - color: false - command: - env: [] - shell: true - arguments: - - "--id" - - "D" - - "-b" - - "--monitoring-backend" - - "no-op://" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load O2 && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - o2DiamondWorkflow - - - name: readout - control: - mode: direct - wants: - cpu: 0.15 - memory: 128 - bind: [] - properties: {} - command: - env: [] - shell: true - arguments: - - "file:/opt/alisw/el7/Readout/v0.24-occ-1/etc/readout.cfg" - value: >- - source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load Readout && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - readout.exe - - # The workflows section is a key-value map of workflow templates. A workflow is a prototype which, when loaded, - # generates a control tree. The nodes of this tree are roles. - # Each role has a name, and it has either 1-* child roles, or exactly 1 child task. - # There are aggregator and iterator roles which fill the intermediate levels of the control tree, and there are task - # roles which constitute the leaves. - workflows: - readout-1: - name: "readout-1-root" - roles: - - name: "readout-role" - task: - load: readout - - readout-8: - name: "readout-8-root" - roles: - - name: "readout-role-0" - constraints: - - attribute: machine_id - value: aido2-bld4-lab101 - task: - load: readout - - name: "readout-role-1" - constraints: - - attribute: machine_id - value: aido2-bld4-lab102 - task: - load: readout - - name: "readout-role-2" - constraints: - - attribute: machine_id - value: aido2-bld4-lab103 - task: - load: readout - - name: "readout-role-3" - constraints: - - attribute: machine_id - value: aido2-bld4-lab104 - task: - load: readout - - name: "readout-role-4" - constraints: - - attribute: machine_id - value: aido2-bld4-lab105 - task: - load: readout - - name: "readout-role-5" - constraints: - - attribute: machine_id - value: aido2-bld4-lab106 - task: - load: readout - - name: "readout-role-6" - constraints: - - attribute: machine_id - value: aido2-bld4-lab107 - task: - load: readout - - name: "readout-role-7" - constraints: - - attribute: machine_id - value: aido2-bld4-lab108 - task: - load: readout - - readout-n: # FIXME: needs variables support in constraints - name: "readout-n-root" - roles: - - name: "readout-role-{{ .it }}" - for: - begin: 0 - end: 7 - var: it - task: - load: readout - - fairmq-ex-1-n-1: # The name of the workflow, which can then be loaded to create an environment. - name: "diamond" # The name of the root role, which happens to be an aggregator role. - vars: {} # Not used yet. - roles: # A list of child roles. - # Parametrized name of an iterator role, which generates task roles. - # {{}} delimits a string template entry, and the "." operator reads in a variable - # from the current context. - - name: "processor{{ .it }}" - # We know that this is an iterator role because it has a "for" entry. With this - # we declare that we generate 4 roles based on the present template, parametrized - # against a variable called "it" which runs from 0 to 3. - # Note that if there's a "for", the role name must reference the declared variable, and vice versa, otherwise - # the behavior is undefined. - # For more information on the template syntax, see Go package text/template. - for: - begin: 0 - end: 3 - var: it - # "connect" is the *outbound* channel equivalent of the "bind" specification found in the tasks section. - # This is a list of outbound channels, with the same meaning as the entries in "bind", the only difference - # being the "target" value. - # Note that "inbound" and "outbound" here refers only to the initiation of the TCP connections. The data flow - # direction is dictated by the "type" parameter. - connect: - - name: "data1" - # The target entry is a string, with some template functions available for traversing the control tree. - # Available functions: - # parent() - returns the path of the parent role (example: {{parent}}.someRoleName to get a sibling role) - # up(int n) - returns the path of the n-th ancestor (example: {{up 2}}.someRole.otherRole to get a cousin role) - # this() - returns the path of the current role (example: {{this}}.someRole to get a child role) - # Please note that these paths operate on the in-memory control tree and not on the workflow template - # as it appears in the configuration file (or database): the control tree is traversed after the iterator - # roles have already been resolved and expanded. Thus, one can never reference "processor{{.it}}", only - # a specific "processor3". - # By whatever means, the target must ultimately contain a valid complete path to a role, followed by a ":" - # and the name of the inbound channel (as it appears in the bind spec of the task template). - target: "{{ parent }}.sampler:data1" - type: "pull" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - - name: "data2" - target: "{{ up 1 }}.sink:data2" # Same as {{ parent }}.sink:data2 - type: "push" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - task: # The current is an iterator role which templates for a task role, so instead of a "roles" entry - # we have a "task" entry. - load: fairmq-ex-1-n-1-processor # Currently the only key-value item in a task entry is "load", which points - # to a task template - # The following is a plain task role, with no iterator semantics. It simply has a name and a reference to a task - # template as it appears in the "tasks" section. - - name: "sampler" - task: - load: fairmq-ex-1-n-1-sampler - - name: "sink" - task: - load: fairmq-ex-1-n-1-sink - - fairmq-ex-1-n-1-aggregated: - name: "diamond" - vars: {} - roles: - - name: "processors" - roles: - - name: "processor{{ .it }}" - for: - begin: 0 - end: 3 - var: it - connect: - - name: "data1" - target: "{{ up 2 }}.sampler:data1" - type: "pull" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - - name: "data2" - target: "{{ up 2 }}.sink:data2" - type: "push" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - task: - load: fairmq-ex-1-n-1-processor - - name: "sampler" - task: - load: fairmq-ex-1-n-1-sampler - - name: "sink" - task: - load: fairmq-ex-1-n-1-sink - -# FIXME: OCTRL-69 -# fairmq-ex-1-nxm-1: -# name: "diamond" -# vars: {} -# roles: -# - name: "processor{{ .it }}" -# for: -# begin: 0 -# end: 3 -# var: it -# roles: -# - name: "processor{{ .it }}{{ .jt}}" -# for: -# begin: 0 -# end: 1 -# var: jt -# connect: -# - name: "data1" -# target: "{{ up 2 }}.sampler:data1" -# type: "pull" -# sndBufSize: 1000 -# rcvBufSize: 1000 -# rateLogging: 0 -# - name: "data2" -# target: "{{ up 2 }}.sink:data2" -# type: "push" -# sndBufSize: 1000 -# rcvBufSize: 1000 -# rateLogging: 0 -# task: -# load: fairmq-ex-1-n-1-processor -# - name: "sampler" -# task: -# load: fairmq-ex-1-n-1-sampler -# - name: "sink" -# task: -# load: fairmq-ex-1-n-1-sink - - fairmq-ex-copypush: - name: "copypush" - vars: {} - roles: - - name: "sink{{ .it }}" - for: - begin: 0 - end: 3 - var: it - connect: - - name: "data" - target: "{{ parent }}.sampler:data" - type: "pull" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - task: - load: fairmq-ex-copypush-sink - - name: "sampler" - task: - load: fairmq-ex-copypush-sampler - - fairmq-ex-multiple-channels: - name: "multichan" - vars: {} - roles: - - name: "sink" - connect: - - name: "data" - target: "{{ parent }}.sampler:data" - type: "pull" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - - name: "broadcast" - target: "{{ parent }}.broadcaster:broadcast" - type: "sub" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - task: - load: fairmq-ex-multiple-channels-sink - - name: "sampler" - connect: - - name: "broadcast" - target: "{{ parent }}.broadcaster:broadcast" - type: "sub" - sndBufSize: 1000 - rcvBufSize: 1000 - rateLogging: 0 - task: - load: fairmq-ex-multiple-channels-sampler - - name: "broadcaster" - task: - load: fairmq-ex-multiple-channels-broadcaster - - qc-basic: - name: "qc-basic" - vars: {} - roles: - - name: "producer" - task: - load: qc-basic-producer - - name: "dispatcher" - connect: - - name: "from_producer_to_Dispatcher" - target: "{{ parent }}.producer:from_producer_to_Dispatcher" - type: "pull" - rateLogging: 60 - task: - load: qc-basic-dispatcher - - name: "qctask" - connect: - - name: "from_Dispatcher_to_QcTask" - target: "{{ parent }}.dispatcher:from_Dispatcher_to_QcTask" - type: "pull" - rateLogging: 60 - task: - load: qc-basic-qctask - - name: "qctask-checker" - connect: - - name: "from_QcTask_to_checker_0" - target: "{{ parent }}.qctask:from_QcTask_to_checker_0" - type: "pull" - rateLogging: 60 - task: - load: qc-basic-qctask-checker - - name: "printer" - connect: - - name: "from_checker_0_to_printer" - target: "{{ parent }}.qctask-checker:from_checker_0_to_printer" - type: "pull" - rateLogging: 60 - task: - load: qc-basic-printer - - o2-dpl-example: - name: "o2-dpl-ex-root" - vars: {} - roles: - - name: "A" - task: - load: o2-dpl-A - - name: "B" - connect: - - name: "from_A_to_B" - target: "{{ parent }}.A:from_A_to_B" - type: "pull" - task: - load: o2-dpl-B - - name: "C" - connect: - - name: "from_A_to_C" - target: "{{ parent }}.A:from_A_to_C" - type: "pull" - task: - load: o2-dpl-C - - name: "D" - connect: - - name: "from_B_to_D" - target: "{{ parent }}.B:from_B_to_D" - type: "pull" - - name: "from_C_to_D" - target: "{{ parent }}.C:from_C_to_D" - type: "pull" - task: - load: o2-dpl-D - - qc-advanced: - name: "qc-advanced-root" - roles: - - name: "source-1" - task: - load: source-1 - - name: "step-1" - connect: - - name: "from_source-1_to_step-1" - target: "{{parent}}.source-1:from_source-1_to_step-1" - type: "pull" - task: - load: step-1 - - name: "Dispatcher1" - connect: - - name: "from_step-1_to_Dispatcher1" - target: "{{parent}}.step-1:from_step-1_to_Dispatcher1" - type: "pull" - task: - load: Dispatcher1 - - name: "dataSizeTask1" - connect: - - name: "from_Dispatcher1_to_dataSizeTask1" - target: "{{parent}}.Dispatcher1:from_Dispatcher1_to_dataSizeTask1" - type: "pull" - task: - load: dataSizeTask1 - - name: "source-2" - task: - load: source-2 - - name: "step-2" - connect: - - name: "from_source-2_to_step-2" - target: "{{parent}}.source-2:from_source-2_to_step-2" - type: "pull" - task: - load: step-2 - - name: "sink-2" - connect: - - name: "from_source-2_to_sink-2" - target: "{{parent}}.source-2:from_source-2_to_sink-2" - type: "pull" - - name: "from_step-2_to_sink-2" - target: "{{parent}}.step-2:from_step-2_to_sink-2" - type: "pull" - task: - load: sink-2 - - name: "Dispatcher2" - connect: - - name: "from_step-2_to_Dispatcher2" - target: "{{parent}}.step-2:from_step-2_to_Dispatcher2" - type: "pull" - - name: "from_sink-2_to_Dispatcher2" - target: "{{parent}}.sink-2:from_sink-2_to_Dispatcher2" - type: "pull" - task: - load: Dispatcher2 - - name: "dataSizeTask2" - connect: - - name: "from_Dispatcher2_to_dataSizeTask2" - target: "{{parent}}.Dispatcher2:from_Dispatcher2_to_dataSizeTask2" - type: "pull" - task: - load: dataSizeTask2 - - name: "source-3" - task: - load: source-3 - - name: "step-3" - connect: - - name: "from_source-3_to_step-3" - target: "{{parent}}.source-3:from_source-3_to_step-3" - type: "pull" - task: - load: step-3 - - name: "Dispatcher3" - connect: - - name: "from_step-3_to_Dispatcher3" - target: "{{parent}}.step-3:from_step-3_to_Dispatcher3" - type: "pull" - task: - load: Dispatcher3 - - name: "dataSizeTask3" - connect: - - name: "from_Dispatcher3_to_dataSizeTask3" - target: "{{parent}}.Dispatcher3:from_Dispatcher3_to_dataSizeTask3" - type: "pull" - task: - load: dataSizeTask3 - - name: "dataSizeTask-merger" - connect: - - name: "from_dataSizeTask1_to_dataSizeTask-merger" - target: "{{parent}}.dataSizeTask1:from_dataSizeTask1_to_dataSizeTask-merger" - type: "pull" - - name: "from_dataSizeTask2_to_dataSizeTask-merger" - target: "{{parent}}.dataSizeTask2:from_dataSizeTask2_to_dataSizeTask-merger" - type: "pull" - - name: "from_dataSizeTask3_to_dataSizeTask-merger" - target: "{{parent}}.dataSizeTask3:from_dataSizeTask3_to_dataSizeTask-merger" - type: "pull" - task: - load: dataSizeTask-merger - - name: "dataSizeTask-checker" - connect: - - name: "from_dataSizeTask-merger_to_dataSizeTask-checker" - target: "{{parent}}.dataSizeTask-merger:from_dataSizeTask-merger_to_dataSizeTask-checker" - type: "pull" - task: - load: dataSizeTask-checker - - name: "someNumbersTask" - connect: - - name: "from_Dispatcher2_to_someNumbersTask" - target: "{{parent}}.Dispatcher2:from_Dispatcher2_to_someNumbersTask" - type: "pull" - task: - load: someNumbersTask - - name: "someNumbersTask-checker" - connect: - - name: "from_someNumbersTask_to_someNumbersTask-checker" - target: "{{parent}}.someNumbersTask:from_someNumbersTask_to_someNumbersTask-checker" - type: "pull" - task: - load: someNumbersTask-checker - - name: "sink-1" - connect: - - name: "from_source-1_to_sink-1" - target: "{{parent}}.source-1:from_source-1_to_sink-1" - type: "pull" - - name: "from_step-1_to_sink-1" - target: "{{parent}}.step-1:from_step-1_to_sink-1" - type: "pull" - task: - load: sink-1 - - name: "sink-3" - connect: - - name: "from_source-3_to_sink-3" - target: "{{parent}}.source-3:from_source-3_to_sink-3" - type: "pull" - - name: "from_step-3_to_sink-3" - target: "{{parent}}.step-3:from_step-3_to_sink-3" - type: "pull" - task: - load: sink-3 - - name: "dpl-global-binary-file-sink" - connect: - - name: "from_dataSizeTask-checker_to_dpl-global-binary-file-sink" - target: "{{parent}}.dataSizeTask-checker:from_dataSizeTask-checker_to_dpl-global-binary-file-sink" - type: "pull" - - name: "from_someNumbersTask-checker_to_dpl-global-binary-file-sink" - target: "{{parent}}.someNumbersTask-checker:from_someNumbersTask-checker_to_dpl-global-binary-file-sink" - type: "pull" - task: - load: dpl-global-binary-file-sink + aliecs: {} From 0a53e88c33528f85c3ff8bb5030322bb022dab4a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 May 2020 17:12:41 +0200 Subject: [PATCH 0247/2352] [build] Bump to v0.13.93 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4aef41dd2..1bac0c5bc 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 92 +VERSION_PATCH := 93 From f250c8588621f0b61a029020e5066d9048735264 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 May 2020 14:47:21 +0200 Subject: [PATCH 0248/2352] [executor] Support running tasks as non-root user --- executor/executable/basictask.go | 25 +++++++++++++++++++-- executor/executable/controllabletask.go | 17 ++++++++++++-- executor/executable/task.go | 30 +++++++++++++++++++++++-- 3 files changed, 66 insertions(+), 6 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index ef2fada38..ccee328e8 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -183,7 +183,17 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { // looking to rerun it within the same environment, we must recreate // the taskCmd as the exec.Cmd type is single-use: if t.taskCmd.ProcessState != nil && t.taskCmd.ProcessState.Exited() { - t.taskCmd = prepareTaskCmd(t.tci) + t.taskCmd, err = prepareTaskCmd(t.tci) + if err != nil { + msg := "cannot build task command" + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). + Error(msg) + return "CONFIGURED", err + } } err = startBasicTask() if err != nil { @@ -206,7 +216,18 @@ func (t *BasicTask) Launch() error { return errors.New("bad internal state for basic task command") } - t.taskCmd = prepareTaskCmd(t.tci) + var err error + t.taskCmd, err = prepareTaskCmd(t.tci) + if err != nil { + msg := "cannot build task command" + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). + Error(msg) + return err + } if t.taskCmd == nil { return errors.New("could not instantiate basic task command") } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 211a8098c..709741b01 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -50,7 +50,20 @@ type ControllableTask struct { func (t *ControllableTask) Launch() error { t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed - taskCmd := prepareTaskCmd(t.tci) + taskCmd, err := prepareTaskCmd(t.tci) + if err != nil { + msg := "cannot build task command" + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). + Error(msg) + + t.sendStatus(mesos.TASK_FAILED, msg + ": " + err.Error()) + return err + } + log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). Debug("starting task") @@ -60,7 +73,7 @@ func (t *ControllableTask) Launch() error { stdoutIn, _ := taskCmd.StdoutPipe() stderrIn, _ := taskCmd.StderrPipe() - err := taskCmd.Start() + err = taskCmd.Start() var tciCommandStr string if t.tci.Value != nil { tciCommandStr = *t.tci.Value diff --git a/executor/executable/task.go b/executor/executable/task.go index f0a2f3370..646741c99 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -29,6 +29,8 @@ import ( "errors" "os" "os/exec" + "os/user" + "strconv" "strings" "syscall" "time" @@ -121,7 +123,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE return newTask } -func prepareTaskCmd(commandInfo *common.TaskCommandInfo) *exec.Cmd { +func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { var taskCmd *exec.Cmd if *commandInfo.Shell { rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") @@ -135,5 +137,29 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) *exec.Cmd { // the containing shell and all of its children taskCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - return taskCmd + // If the commandInfo specifies a username + if commandInfo.User != nil && len(*commandInfo.User) > 0 { + // we must first look up the uid/gid + targetUser, err := user.Lookup(*commandInfo.User) + if err != nil { + return nil, err + } + + uid, err := strconv.ParseUint(targetUser.Uid, 10, 32) + if err != nil { + return nil, err + } + gid, err := strconv.ParseUint(targetUser.Gid, 10, 32) + if err != nil { + return nil, err + } + + credential := &syscall.Credential{ + Uid: uint32(uid), + Gid: uint32(gid), + } + taskCmd.SysProcAttr.Credential = credential + } + + return taskCmd, nil } From 54f07617956fb953add1000e3440f2324e9cddd1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 May 2020 14:47:53 +0200 Subject: [PATCH 0249/2352] [build] Bump to v0.13.94 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1bac0c5bc..1616dff45 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 93 +VERSION_PATCH := 94 From 77824b722fa9f37cc90a1b6a38b7e8c3d04aa250 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 May 2020 10:08:16 +0200 Subject: [PATCH 0250/2352] [misc] Upgrade to yaml.v3 --- coconut/configuration/configuration.go | 2 +- coconut/configuration/configurationutil.go | 2 +- coconut/control/control.go | 2 +- common/gera/map.go | 2 -- common/gera/stringmap.go | 2 -- configuration/consulsource.go | 2 +- configuration/source_test.go | 2 +- configuration/yamlsource.go | 2 +- core/task/manager.go | 2 +- core/workflow/load.go | 2 +- go.mod | 3 ++- go.sum | 2 ++ occ/peanut/flatten/flatten.go | 2 +- 13 files changed, 13 insertions(+), 14 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 4c7aac4cc..b197d8209 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -45,7 +45,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) var log = logger.New(logrus.StandardLogger(), "coconut") diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index e51f64ec3..e58f70d57 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -37,7 +37,7 @@ import ( "os" "strings" "encoding/json" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) var( diff --git a/coconut/control/control.go b/coconut/control/control.go index 4ab0379a2..35c312bf0 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -41,7 +41,7 @@ import ( "time" "github.com/xlab/treeprint" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/coconut" "github.com/AliceO2Group/Control/coconut/protos" diff --git a/common/gera/map.go b/common/gera/map.go index 5e7379e2e..5eb0a9727 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -30,11 +30,9 @@ package gera import ( "github.com/imdario/mergo" - "gopkg.in/yaml.v2" ) type Map interface { - yaml.Unmarshaler Wrap(m Map) Map IsHierarchyRoot() bool HierarchyContains(m Map) bool diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 41879a235..31763cf38 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -26,11 +26,9 @@ package gera import ( "github.com/imdario/mergo" - "gopkg.in/yaml.v2" ) type StringMap interface { - yaml.Unmarshaler Wrap(m StringMap) StringMap IsHierarchyRoot() bool HierarchyContains(m StringMap) bool diff --git a/configuration/consulsource.go b/configuration/consulsource.go index 2f69d49a4..b995d535c 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -29,7 +29,7 @@ import ( "errors" "strconv" "strings" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) type ConsulSource struct { diff --git a/configuration/source_test.go b/configuration/source_test.go index e0e09f245..f19d0d62c 100644 --- a/configuration/source_test.go +++ b/configuration/source_test.go @@ -4,7 +4,7 @@ import ( . "github.com/AliceO2Group/Control/configuration" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) var _ = Describe("Source", func() { diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index 9f6daa358..f15806921 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -32,7 +32,7 @@ import ( "strconv" "strings" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) type YamlSource struct { diff --git a/core/task/manager.go b/core/task/manager.go index ae7bad7df..92e851949 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -36,7 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/the" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" diff --git a/core/workflow/load.go b/core/workflow/load.go index bb1c0c714..0331cf264 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -35,7 +35,7 @@ import ( "github.com/AliceO2Group/Control/core/the" "github.com/k0kubun/pp" "github.com/spf13/viper" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) // FIXME: workflowPath should be of type configuration.Path, not string diff --git a/go.mod b/go.mod index c1010b5f0..edc8253d0 100644 --- a/go.mod +++ b/go.mod @@ -99,7 +99,8 @@ require ( gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 - gopkg.in/yaml.v2 v2.2.8 + gopkg.in/yaml.v2 v2.2.8 // indirect + gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index ee42b3665..c1b39c4ed 100644 --- a/go.sum +++ b/go.sum @@ -596,6 +596,8 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 h1:OfFoIUYv/me30yv7XlMy4F9RJw8DEm8WQ6QG1Ph4bH0= +gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= diff --git a/occ/peanut/flatten/flatten.go b/occ/peanut/flatten/flatten.go index f2b6315b1..72b2bad1e 100644 --- a/occ/peanut/flatten/flatten.go +++ b/occ/peanut/flatten/flatten.go @@ -97,7 +97,7 @@ import ( "errors" "strconv" - "gopkg.in/yaml.v2" + "gopkg.in/yaml.v3" ) // The presentation style of keys. From 7768800f6d0f870eb2cf7529be3f2ef6ceb1a90d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 May 2020 11:17:33 +0200 Subject: [PATCH 0251/2352] [executor] Fix broken test --- executor/executorcmd/nopb/test/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executorcmd/nopb/test/main.go b/executor/executorcmd/nopb/test/main.go index d151ad14b..ceae677aa 100644 --- a/executor/executorcmd/nopb/test/main.go +++ b/executor/executorcmd/nopb/test/main.go @@ -43,7 +43,7 @@ func main() { targetPort, _ := strconv.Atoi(targetPortS) fmt.Printf("target port: %d", targetPort) - c := executorcmd.NewClient(uint64(targetPort), controlmode.FAIRMQ) + c := executorcmd.NewClient(uint64(targetPort), controlmode.FAIRMQ, executorcmd.JsonTransport) if c == nil { fmt.Println("client is nil") } From 3f7fb35b02d30cee6b3b9fc925e27ba4fb528fe6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 May 2020 11:18:10 +0200 Subject: [PATCH 0252/2352] [misc] Update various dependencies --- go.mod | 32 +++--- go.sum | 318 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 327 insertions(+), 23 deletions(-) diff --git a/go.mod b/go.mod index edc8253d0..37a1364a9 100644 --- a/go.mod +++ b/go.mod @@ -14,9 +14,9 @@ replace ( ) require ( - github.com/antonmedv/expr v1.7.1 + github.com/antonmedv/expr v1.8.8 github.com/armon/go-metrics v0.3.3 // indirect - github.com/briandowns/spinner v1.9.0 + github.com/briandowns/spinner v1.11.1 github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.19+incompatible // indirect github.com/coreos/go-semver v0.3.0 // indirect @@ -28,41 +28,40 @@ require ( github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.3.5 + github.com/golang/protobuf v1.4.2 github.com/google/uuid v1.1.1 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect github.com/hashicorp/consul/api v1.4.0 - github.com/hashicorp/go-hclog v0.12.1 // indirect + github.com/hashicorp/go-hclog v0.14.0 // indirect github.com/hashicorp/go-immutable-radix v1.2.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/serf v0.9.0 // indirect - github.com/imdario/mergo v0.3.8 + github.com/hashicorp/serf v0.9.2 // indirect + github.com/imdario/mergo v0.3.9 github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect - github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac + github.com/mesos/mesos-go v0.0.11 github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect github.com/miekg/dns v1.1.29 // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/mapstructure v1.2.2 // indirect + github.com/mitchellh/mapstructure v1.3.1 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/olekukonko/tablewriter v0.0.4 - github.com/onsi/ginkgo v1.12.0 - github.com/onsi/gomega v1.9.0 + github.com/onsi/ginkgo v1.12.2 + github.com/onsi/gomega v1.10.1 github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -72,11 +71,11 @@ require ( github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 github.com/rs/xid v1.2.1 github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.5.0 + github.com/sirupsen/logrus v1.6.0 github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.2.2 // indirect github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v0.0.6 + github.com/spf13/cobra v1.0.0 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.6.2 @@ -87,11 +86,11 @@ require ( github.com/xlab/treeprint v1.0.0 go.etcd.io/bbolt v1.3.4 // indirect go.uber.org/zap v1.14.1 // indirect - golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 // indirect + golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20200320220750-118fecf932d8 + golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect - golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd + golang.org/x/sys v0.0.0-20200523222454-059865788121 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 // indirect google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 // indirect @@ -99,7 +98,6 @@ require ( gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/src-d/go-git.v4 v4.13.1 - gopkg.in/yaml.v2 v2.2.8 // indirect gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index c1b39c4ed..cd4afaac8 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,50 @@ +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY= +cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= +cloud.google.com/go/firestore v1.2.0 h1:zrl+2VJAYC/C6WzEPnkqZIBeHyHFs/UmtzJdXU4Bvmo= +cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= +cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -11,9 +56,14 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antonmedv/expr v1.7.1 h1:KK+VpHu1TtIDQL1ej2kA1VC/4TbtEeuLoNY10y1889Y= github.com/antonmedv/expr v1.7.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.8 h1:uVwIkIBNO2yn4vY2u2DQUqXTmv9jEEMCEcHa19G5weY= +github.com/antonmedv/expr v1.8.8/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -21,6 +71,7 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -28,18 +79,28 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= +github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/briandowns/spinner v1.9.0 h1:+OMAisemaHar1hjuJ3Z2hIvNhQl9Y7GLPWUwwz2Pxo8= github.com/briandowns/spinner v1.9.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= +github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= +github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= github.com/coreos/etcd v3.3.19+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.22+incompatible h1:AnRMUyVdVvh1k7lHe61YEd227+CLoNogQuAypztGSK4= +github.com/coreos/etcd v3.3.22+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= @@ -58,6 +119,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -75,11 +138,15 @@ github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdk github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= +github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -95,16 +162,32 @@ github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXP github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -114,11 +197,24 @@ github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= @@ -132,10 +228,13 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9G github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= +github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= +github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= +github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.4.0 h1:jfESivXnO5uLdH650JU/6AnjRoHrLhULq0FnC3Kp9EY= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= +github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0 h1:zBtCfKJZcJDBvSCkQJch4ulp59m1rATFLKwNo/LYY30= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= @@ -147,15 +246,21 @@ github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tk github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.1 h1:99niEVkDqsEv3/jINwoOUgGE9L41LHXM4k3jTkV+DdA= github.com/hashicorp/go-hclog v0.12.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.14.0 h1:1X+ga+2ki9aUJJaliI2isvjNLI8rNCGHFkZ1FaVpvCA= +github.com/hashicorp/go-hclog v0.14.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= +github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= +github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= +github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= @@ -170,6 +275,7 @@ github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2I github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -178,15 +284,21 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.0 h1:WeeNspppWi5s1OFefTviPQueC/Bq8dONfvNjPhiEQKE= github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= +github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.0 h1:+Zd/16AJ9lxk9RzfTDyv/TLhZ8UerqYS0/+JGCIDaa0= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= +github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= +github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= +github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -199,6 +311,10 @@ github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= @@ -214,6 +330,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -256,6 +374,8 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= +github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= +github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= @@ -264,10 +384,14 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= +github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= +github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= @@ -276,6 +400,8 @@ github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQz github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc35r0TV4= github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.3.1 h1:cCBH2gTD2K0OtLlv/Y5H01VQCqmlDxz30kS5Y5bqfLA= +github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -289,15 +415,22 @@ github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.12.2 h1:Ke9m3h2Hu0wsZ45yewCqhYr3Z+emcNTuLY2nMWCkrSI= +github.com/onsi/ginkgo v1.12.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= @@ -308,6 +441,8 @@ github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtb github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= +github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= +github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -317,6 +452,7 @@ github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -325,6 +461,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -335,6 +473,8 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= +github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= @@ -345,6 +485,8 @@ github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4 github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= +github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f h1:ITrvUKe4041A8IlJkWx+lm2pSj5QzZwpeYNfCnO5u3U= +github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -369,10 +511,13 @@ github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4 github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= +github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= @@ -386,6 +531,8 @@ github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -395,6 +542,8 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= +github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -413,9 +562,11 @@ github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:m github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966 h1:j6JEOq5QWFker+d7mFQYOhjTZonQ7YkLTHm56dbn+yM= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -432,12 +583,19 @@ github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cim github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -447,51 +605,102 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= +golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg= golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -506,17 +715,27 @@ golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -524,46 +743,122 @@ golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfru golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= +golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 h1:oj6yp1cr3vAo7EXJt9jCqfIzrwvFFVD6zI6VO+qNA6s= golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d h1:SR+e35rACZFBohNb4Om1ibX6N3iO0FtdbwqGSuD9dBU= +golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 h1:XRuIAeTRoXziYGYTVer+YGxVXQBiOhZ8+SpNELP73oQ= google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -577,6 +872,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= +gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= @@ -596,13 +893,22 @@ gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 h1:OfFoIUYv/me30yv7XlMy4F9RJw8DEm8WQ6QG1Ph4bH0= gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= From 23895604edd15f5b436ad89886ba730dd096d256 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 May 2020 15:41:03 +0200 Subject: [PATCH 0253/2352] [build] Bump to v0.13.95 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1616dff45..18905bd91 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 13 -VERSION_PATCH := 94 +VERSION_PATCH := 95 From f30fe1ea1f90b87ad8407ec85fbb8db500bfd815 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Jun 2020 16:28:34 +0200 Subject: [PATCH 0254/2352] [coconut] Correctly parse string values in JSON-formatted --extra-vars --- coconut/control/control.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index 35c312bf0..389e800e1 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -216,6 +216,10 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } for k, v := range extraVarsMapI { + if strVal, ok := v.(string); ok { + extraVarsMap[k] = strVal + continue + } marshaledValue, marshalErr := json.Marshal(v) if marshalErr != nil { continue @@ -263,6 +267,21 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "root role: %s\n", env.GetRootRole()) + var ( + defaultsStr = stringMapToString(env.Defaults, "\t") + varsStr = stringMapToString(env.Vars, "\t") + userVarsStr = stringMapToString(env.UserVars, "\t") + ) + if len(defaultsStr) != 0 { + _, _ = fmt.Fprintf(o, "global defaults:\n%s\n", defaultsStr) + } + if len(varsStr) != 0 { + _, _ = fmt.Fprintf(o, "global variables:\n%s\n", varsStr) + } + if len(userVarsStr) != 0 { + _, _ = fmt.Fprintf(o, "user-provided variables:\n%s\n", userVarsStr) + } + return } From 231caa6fdcc003ca40d3794c3a3751f8b8d9cefe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Jun 2020 16:29:35 +0200 Subject: [PATCH 0255/2352] [executor] Explicitly set additional GIDs when running as custom user --- executor/executable/task.go | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/executor/executable/task.go b/executor/executable/task.go index 646741c99..728d4c913 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -136,6 +136,7 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { // We must setpgid(2) in order to be able to kill the whole process group which consists of // the containing shell and all of its children taskCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} + taskCmd.SysProcAttr.Pdeathsig = syscall.SIGKILL // If the commandInfo specifies a username if commandInfo.User != nil && len(*commandInfo.User) > 0 { @@ -154,11 +155,36 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { return nil, err } + gidStrings, err := targetUser.GroupIds() + if err != nil { + return nil, err + } + + gids := make([]uint32, len(gidStrings)) + for i, v := range gidStrings { + parsed, err := strconv.ParseUint(v, 10, 32) + if err != nil { + return nil, err + } + gids[i] = uint32(parsed) + } + credential := &syscall.Credential{ Uid: uint32(uid), Gid: uint32(gid), + Groups: gids, + NoSetGroups: false, } taskCmd.SysProcAttr.Credential = credential + log.WithFields(logrus.Fields{ + "shell": *commandInfo.Shell, + "value": *commandInfo.Value, + "args": commandInfo.Arguments, + "uid": credential.Uid, + "gid": credential.Gid, + "groups": gidStrings, + }). + Debug("custom credentials set") } return taskCmd, nil From 9f174e99aa0763fd5d6a0e3c86523f263ede0f77 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Jun 2020 16:30:42 +0200 Subject: [PATCH 0256/2352] [build] Bump to v0.14.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 18905bd91..f43cf0d49 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 13 -VERSION_PATCH := 95 +VERSION_MINOR := 14 +VERSION_PATCH := 0 From 8779cc3ad35e46ac54dc88528f0ee0532102daea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Jun 2020 16:47:24 +0200 Subject: [PATCH 0257/2352] [executor] Unbreak build on Mac --- executor/executable/task.go | 2 +- executor/executable/task_pdeathsig_darwin.go | 31 ++++++++++++++++++++ executor/executable/task_pdeathsig_linux.go | 31 ++++++++++++++++++++ 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 executor/executable/task_pdeathsig_darwin.go create mode 100644 executor/executable/task_pdeathsig_linux.go diff --git a/executor/executable/task.go b/executor/executable/task.go index 728d4c913..c6da54461 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -136,7 +136,7 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { // We must setpgid(2) in order to be able to kill the whole process group which consists of // the containing shell and all of its children taskCmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true} - taskCmd.SysProcAttr.Pdeathsig = syscall.SIGKILL + setPdeathsig(taskCmd.SysProcAttr) // If the commandInfo specifies a username if commandInfo.User != nil && len(*commandInfo.User) > 0 { diff --git a/executor/executable/task_pdeathsig_darwin.go b/executor/executable/task_pdeathsig_darwin.go new file mode 100644 index 000000000..14bb68458 --- /dev/null +++ b/executor/executable/task_pdeathsig_darwin.go @@ -0,0 +1,31 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import "syscall" + +func setPdeathsig(sysProcAttr *syscall.SysProcAttr) { + //noop +} diff --git a/executor/executable/task_pdeathsig_linux.go b/executor/executable/task_pdeathsig_linux.go new file mode 100644 index 000000000..61bdaf944 --- /dev/null +++ b/executor/executable/task_pdeathsig_linux.go @@ -0,0 +1,31 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import "syscall" + +func setPdeathsig(sysProcAttr *syscall.SysProcAttr) { + sysProcAttr.Pdeathsig = syscall.SIGKILL +} From bf06726a989b9c73bc8311de1d1fdbfffcfc1799 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 Jun 2020 18:12:04 +0200 Subject: [PATCH 0258/2352] [executor] Set memlock limit to unlimited for child processes O2-1459 #close --- executor/executor.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/executor/executor.go b/executor/executor.go index 32dd226b5..3544a4ee3 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -36,6 +36,7 @@ import ( "io" "net/url" "sync" + "syscall" "time" "github.com/AliceO2Group/Control/common/logger" @@ -75,6 +76,14 @@ func maybeReconnect(cfg config.Config) <-chan struct{} { // Run is the actual entry point of the executor. func Run(cfg config.Config) { + // Set memlock limit for child processes to unlimited. This only needs to + // happen once per executor instance. + // See O2-1459 O2-1412 + _ = syscall.Setrlimit(8 /* memlock magic number */, &syscall.Rlimit{ + Cur: ^uint64(0), + Max: ^uint64(0), + }) + var ( apiURL = url.URL{ Scheme: "http", From 6e6304d57a523713da18a14b07381ab3a4eb3b07 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Jun 2020 09:42:49 +0200 Subject: [PATCH 0259/2352] [build] Bump to v0.14.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f43cf0d49..a97451d04 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From a9e3add95e4f006180963009a0e70073b07e5d27 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Jun 2020 17:29:15 +0200 Subject: [PATCH 0260/2352] [core] Enable TRACE level logging if --veryVerbose (doesn't go to IL) --- core/core.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/core.go b/core/core.go index 89bbbaadf..6b8101211 100644 --- a/core/core.go +++ b/core/core.go @@ -46,9 +46,12 @@ var log = logger.New(logrus.StandardLogger(),"core") // Run is the entry point for this scheduler. // TODO: refactor Config to reflect our specific requirements func Run() error { - if viper.GetBool("verbose") || viper.GetBool("veryVerbose") { + if viper.GetBool("verbose") { logrus.SetLevel(logrus.DebugLevel) } + if viper.GetBool("veryVerbose") { + logrus.SetLevel(logrus.TraceLevel) + } if viper.GetBool("veryVerbose") { log.WithField("configuration", viper.AllSettings()).Debug("core starting up") From 9829c4014385df860f5a4d0f43c67fe6b702d3fe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Jun 2020 17:30:33 +0200 Subject: [PATCH 0261/2352] [core] Improve error wording --- core/task/class.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/class.go b/core/task/class.go index 05bf90346..825f0088f 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -77,7 +77,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { if ch.Target != "" { ch.Target = "" aux.Connect[j] = ch - log.Warn("task template should lack target entry for outbound channels") + log.Warn("task template outbound channel definition has a target (will be ignored)") } } *c = Class{ From d440b92f9a5dce25d6e496c158a3de94ad3a9680 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Jun 2020 17:31:48 +0200 Subject: [PATCH 0262/2352] [core] Fix template processing of channel targets --- core/workflow/rolebase.go | 7 ++++--- core/workflow/template/fields.go | 21 +++++++++++++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 5fb4f1180..1af75aaef 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -182,12 +182,13 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (r *roleBase) wrapConnectFields() template.Fields { connectFields := make(template.Fields, len(r.Connect)) for i, _ := range r.Connect { - connectFields[i] = template.WrapGeneric( + index := i // always keep a local copy for the getter/setter closures + connectFields[index] = template.WrapGeneric( func() string { - return r.Connect[i].Target + return r.Connect[index].Target }, func(value string) { - r.Connect[i].Target = value + r.Connect[index].Target = value }, ) } diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index 23cce1618..4cef46f4f 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -29,6 +29,7 @@ import ( "encoding/json" "fmt" "io" + "strings" "text/template" "github.com/AliceO2Group/Control/common/gera" @@ -57,6 +58,18 @@ func (sf Sequence) Execute(parentPath string, varStack VarStack, buildObjectStac objectStack := buildObjectStack(currentStage) if fields, ok := sf[currentStage]; ok { + log.WithFields(logrus.Fields{ + "path": parentPath, + "stage": currentStage, + "fields": func() string { + accumulator := make([]string, len(fields)) + for i, v := range fields { + accumulator[i] = v.Get() + } + return strings.Join(accumulator, ", ") + }(), + }).Trace("about to process fields for stage") + err = fields.Execute(parentPath, stagedStack, objectStack, stringTemplateCache) if err != nil { log.WithError(err).Errorf("template processing error") @@ -188,6 +201,7 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS return } } + _, err = tmpl.ExecuteFunc(buf, func(w io.Writer, tag string) (i int, err error) { var( program *vm.Program @@ -214,6 +228,13 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) } }) + log.WithFields(logrus.Fields{ + "path": parentPath, + "fieldBefore": field.Get(), + "fieldAfter": buf.String(), + "error": err, + }).Trace("processed field for stage") + if err != nil { log.WithError(err).WithField("role", parentPath).Warn("template processing error (bad variable or workflow file)") return From 8f73b3adb5a868bf8fab2e6686834e33920a00e2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Jun 2020 16:48:05 +0200 Subject: [PATCH 0263/2352] [occ] Make deserialization of transition requests more robust --- occ/plugin/litestructs/Transition.cxx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index 21057b532..82a329fa1 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -51,7 +51,11 @@ bool OccLite::nopb::TransitionRequest::Deserialize(const rapidjson::Value& obj) auto array = obj["arguments"].GetArray(); for (auto it = array.Begin(); it != array.End(); ++it) { ConfigEntry *ce = new ConfigEntry; - ce->Deserialize(*it); + auto ok = ce->Deserialize(*it); + if (!ok) { + OLOG(WARN) << "Some transition parameters could not be deserialized, task configuration might be incomplete"; + continue; + } arguments.push_back(*ce); } } @@ -92,6 +96,10 @@ bool OccLite::nopb::ConfigEntry::Serialize(rapidjson::Writer Date: Thu, 11 Jun 2020 15:39:17 +0200 Subject: [PATCH 0264/2352] [executor] Make task launch asynchronous --- executor/executable/controllabletask.go | 122 +++++++++++++----------- executor/handlers.go | 2 +- 2 files changed, 68 insertions(+), 56 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 709741b01..913084a48 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -66,70 +66,82 @@ func (t *ControllableTask) Launch() error { log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). - Debug("starting task") + Debug("starting task asynchronously") - // Set up pipes for controlled process - var errStdout, errStderr error - stdoutIn, _ := taskCmd.StdoutPipe() - stderrIn, _ := taskCmd.StderrPipe() + // We fork out into a goroutine for the actual process management. + // Control returns to the event loop which can safely access *internalState. + // Anything in the following goroutine must not touch *internalState, except + // via channels. + go func() { + + // Set up pipes for controlled process + var errStdout, errStderr error + stdoutIn, _ := taskCmd.StdoutPipe() + stderrIn, _ := taskCmd.StderrPipe() + + err = taskCmd.Start() + var tciCommandStr string + if t.tci.Value != nil { + tciCommandStr = *t.tci.Value + } + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + "command": tciCommandStr, + }). + Error("failed to run task") + + t.sendStatus(mesos.TASK_FAILED, err.Error()) + return + } + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("task launched") + + go func() { + _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) + }() + go func() { + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel), stderrIn) + }() - err = taskCmd.Start() - var tciCommandStr string - if t.tci.Value != nil { - tciCommandStr = *t.tci.Value - } - if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - "command": tciCommandStr, + "controlPort": t.tci.ControlPort, + "controlMode": t.tci.ControlMode.String(), + "task": t.ti.Name, + "id": t.ti.TaskID.Value, + "path": taskCmd.Path, + "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", + "argc": len(taskCmd.Args), }). - Error("failed to run task") + Debug("starting gRPC client") - t.sendStatus(mesos.TASK_FAILED, err.Error()) - return err - } - log.WithField("id", t.ti.TaskID.Value). - WithField("task", t.ti.Name). - Debug("task started") + controlTransport := executorcmd.ProtobufTransport + for _, v := range taskCmd.Args { + if strings.Contains(v, "-P OCClite") { + controlTransport = executorcmd.JsonTransport + break + } + } - go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) - }() - go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel), stderrIn) - }() + t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode, controlTransport) + if t.rpc == nil { + err = errors.New("rpc client is nil") + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + "command": tciCommandStr, + }). + Error("could not start gRPC client") - log.WithFields(logrus.Fields{ - "controlPort": t.tci.ControlPort, - "controlMode": t.tci.ControlMode.String(), - "task": t.ti.Name, - "id": t.ti.TaskID.Value, - "path": taskCmd.Path, - "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", - "argc": len(taskCmd.Args), - }). - Debug("starting gRPC client") - - controlTransport := executorcmd.ProtobufTransport - for _, v := range taskCmd.Args { - if strings.Contains(v, "-P OCClite") { - controlTransport = executorcmd.JsonTransport - break + t.sendStatus(mesos.TASK_FAILED, err.Error()) + return } - } + t.rpc.TaskCmd = taskCmd - t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode, controlTransport) - if t.rpc == nil { - return errors.New("could not start gRPC client") - } - t.rpc.TaskCmd = taskCmd - - // We fork out into a goroutine for the actual process management. - // Control returns to the event loop which can safely access *internalState. - // Anything in the following goroutine must not touch *internalState, except via channels. - go func() { elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ diff --git a/executor/handlers.go b/executor/handlers.go index 8f5ee50a0..371161ecf 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -201,7 +201,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { if err == nil { state.activeTasks[taskInfo.TaskID] = myTask - log.Trace("task launched") + log.Trace("task launching") } else { log.Error("task launch failed") } From aa0abb4978806cf075254ceb7411c6585e61fd0b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 Jun 2020 12:13:25 +0200 Subject: [PATCH 0265/2352] [build] Bump to v0.14.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a97451d04..6c0985d4f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 9160e141c5caf268049d2f1132d6a497a1ead2f0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Jun 2020 14:29:06 +0300 Subject: [PATCH 0266/2352] [core] protos add force option in DestroyEnvironmentRequest --- coconut/protos/o2control.pb.go | 364 ++++++++++++++++++--------------- core/protos/o2control.pb.go | 364 ++++++++++++++++++--------------- core/protos/o2control.proto | 1 + 3 files changed, 407 insertions(+), 322 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 4289a53b0..88d06ff87 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1367,6 +1367,7 @@ type DestroyEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1426,6 +1427,13 @@ func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { return false } +func (m *DestroyEnvironmentRequest) GetForce() bool { + if m != nil { + return m.Force + } + return false +} + type DestroyEnvironmentReply struct { CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3553,171 +3561,172 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2620 bytes of a gzipped FileDescriptorProto + // 2630 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, - 0xd8, 0x69, 0x84, 0x78, 0xe3, 0x0d, 0x21, 0x84, 0x78, 0xe1, 0x15, 0x21, 0xbe, 0x03, 0x0f, 0x48, - 0xbc, 0x22, 0x04, 0x82, 0x8f, 0x80, 0x8a, 0xc4, 0x33, 0x1f, 0x01, 0xdd, 0x7f, 0x33, 0x77, 0xc6, - 0x33, 0x4e, 0x0a, 0xda, 0x17, 0xde, 0x7c, 0xce, 0x3d, 0xe7, 0xdc, 0x7b, 0xfe, 0xdd, 0x73, 0xee, - 0x19, 0xc3, 0xd2, 0xc0, 0x75, 0x7c, 0xc7, 0xbb, 0xeb, 0x6c, 0xb6, 0x1c, 0xdb, 0x77, 0x1d, 0x6b, - 0x83, 0x21, 0x50, 0x31, 0x40, 0xe0, 0x25, 0x58, 0xac, 0x8d, 0x88, 0xed, 0xbf, 0xde, 0x27, 0x9e, - 0xe3, 0x3d, 0x21, 0xa6, 0xeb, 0x1f, 0x11, 0xd3, 0xc7, 0x73, 0x30, 0x7b, 0xe8, 0x9b, 0xfe, 0xd0, - 0x33, 0xc8, 0x9b, 0x21, 0xf1, 0x7c, 0x7c, 0x04, 0x25, 0x89, 0x18, 0x58, 0x67, 0x68, 0x11, 0x72, - 0x9e, 0x6f, 0xfa, 0x44, 0xd7, 0xd6, 0xb4, 0xf5, 0xa2, 0xc1, 0x01, 0xf4, 0x10, 0x66, 0x3d, 0x46, - 0xf4, 0x7c, 0xd0, 0x36, 0x7d, 0xe2, 0xe9, 0x99, 0xb5, 0xe9, 0xf5, 0xd2, 0xe6, 0x95, 0x8d, 0xf0, - 0x04, 0x87, 0xca, 0xba, 0x11, 0xa5, 0xc6, 0x7f, 0xd1, 0x60, 0x46, 0x5d, 0x47, 0x9f, 0x40, 0xce, - 0x22, 0x23, 0x62, 0xb1, 0x5d, 0xca, 0x9b, 0xd7, 0x53, 0xe4, 0x6c, 0x3c, 0xa5, 0x44, 0x06, 0xa7, - 0x45, 0x7b, 0x50, 0xee, 0x47, 0x94, 0xd1, 0x33, 0x6b, 0xda, 0x7a, 0x69, 0x73, 0x55, 0xe1, 0x4e, - 0xd2, 0xf9, 0xc9, 0x94, 0x11, 0x63, 0xc4, 0x9f, 0x42, 0x8e, 0x89, 0x46, 0x45, 0xc8, 0xed, 0xd6, - 0xb6, 0x9f, 0xd7, 0x2b, 0x53, 0xa8, 0x00, 0xd9, 0xbd, 0x83, 0xc7, 0x8d, 0x8a, 0x86, 0x4a, 0x90, - 0x7f, 0xb9, 0x65, 0x1c, 0xec, 0x1d, 0xd4, 0x2b, 0x19, 0x4a, 0x51, 0x33, 0x8c, 0x86, 0x51, 0x99, - 0xde, 0xce, 0x43, 0x8e, 0xc9, 0xc7, 0xcb, 0x70, 0xa5, 0x4e, 0xfc, 0xc7, 0xae, 0xd9, 0x27, 0xa7, - 0x8e, 0x7b, 0xb2, 0x67, 0x77, 0x1c, 0x69, 0xce, 0xdf, 0x68, 0x90, 0x7f, 0x41, 0x5c, 0xaf, 0xe7, - 0xd8, 0xd4, 0x96, 0x7d, 0xf3, 0x2b, 0xc7, 0x65, 0x5a, 0xe6, 0x0c, 0x0e, 0x30, 0x6c, 0xcf, 0x76, - 0x5c, 0x76, 0x7a, 0x8a, 0xa5, 0x00, 0xc5, 0x0e, 0x4c, 0xbf, 0xd5, 0xd5, 0xa7, 0x39, 0x96, 0x01, - 0x14, 0x7b, 0x34, 0xec, 0x59, 0x6d, 0x3d, 0xcb, 0xbd, 0xc1, 0x00, 0xb4, 0x06, 0xa5, 0x81, 0xeb, - 0xb4, 0x87, 0x2d, 0xff, 0xc0, 0xec, 0x13, 0x3d, 0xc7, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0xf1, - 0x43, 0x1c, 0xfa, 0xae, 0x7e, 0x89, 0x11, 0x28, 0x18, 0xfc, 0xf3, 0x0c, 0x5c, 0x1e, 0xd7, 0x80, - 0xfa, 0x7f, 0x0d, 0x4a, 0x9d, 0x00, 0xdb, 0x16, 0x51, 0xa0, 0xa2, 0xd0, 0x47, 0x30, 0x4f, 0xec, - 0x51, 0xcf, 0x75, 0xec, 0x3e, 0xb1, 0x7d, 0x6f, 0xc7, 0x19, 0xda, 0xbe, 0xd0, 0x65, 0x7c, 0x81, - 0x9e, 0xc4, 0x37, 0xbd, 0x13, 0x41, 0xc6, 0x95, 0x53, 0x30, 0x61, 0xbc, 0x65, 0xd5, 0x78, 0x5b, - 0x01, 0xe8, 0x3a, 0x9e, 0x14, 0x9e, 0xe3, 0x5c, 0x21, 0x06, 0x61, 0x98, 0xe9, 0xd9, 0x9e, 0x6f, - 0xda, 0x2d, 0xc2, 0x4c, 0xc0, 0x35, 0x8c, 0xe0, 0xd0, 0x47, 0x90, 0x17, 0x1a, 0xeb, 0x79, 0x16, - 0x27, 0x48, 0x89, 0x13, 0xe1, 0x22, 0x43, 0x92, 0xe0, 0xdb, 0x30, 0xd7, 0x24, 0xa6, 0xdb, 0x76, - 0x4e, 0x6d, 0xe1, 0x4a, 0xb4, 0x04, 0x97, 0x5c, 0x62, 0x7a, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, - 0x42, 0x21, 0xe9, 0xc0, 0x3a, 0xc3, 0x3a, 0x2c, 0xd5, 0x89, 0x5f, 0x53, 0x74, 0x97, 0xd1, 0xf0, - 0x16, 0x16, 0xc7, 0x56, 0x2e, 0x66, 0xe5, 0x2f, 0x61, 0x46, 0x35, 0xa6, 0x48, 0xb8, 0xaa, 0x1a, - 0xea, 0xe1, 0x32, 0x73, 0x5f, 0x84, 0x1e, 0xff, 0x29, 0x0b, 0x73, 0x31, 0x0a, 0x54, 0x86, 0x4c, - 0x4f, 0x6e, 0x96, 0xe9, 0xb1, 0x38, 0x6a, 0xb9, 0xc4, 0xf4, 0x49, 0xfb, 0x65, 0x97, 0xd8, 0xcc, - 0x87, 0x45, 0x43, 0x45, 0x85, 0xde, 0x99, 0x56, 0xbd, 0xb3, 0x01, 0x39, 0xe6, 0x41, 0x3d, 0xcb, - 0x0e, 0xa5, 0xab, 0xd9, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa2, 0x38, 0x19, 0xaa, 0x42, - 0xc1, 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x19, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, - 0x62, 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0x8f, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, - 0xa1, 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xdb, 0x63, 0x63, - 0x57, 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, - 0x02, 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, - 0x97, 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, - 0x23, 0x47, 0x43, 0x15, 0x98, 0x3e, 0x21, 0x67, 0xc2, 0x2f, 0xf4, 0x27, 0x35, 0xfb, 0xc8, 0xb4, - 0x86, 0x44, 0xb8, 0x84, 0x03, 0x0f, 0x32, 0xf7, 0xb5, 0xea, 0x67, 0x50, 0x0c, 0x64, 0xbe, 0x17, - 0xe3, 0xe7, 0x30, 0x1b, 0x39, 0xd0, 0xfb, 0x30, 0xe3, 0xdf, 0x6b, 0x70, 0xf9, 0x80, 0x9c, 0x2a, - 0x1a, 0xca, 0x1c, 0xb9, 0x03, 0x15, 0x1a, 0xb0, 0x1d, 0xcb, 0x39, 0x6d, 0x92, 0xfe, 0xc0, 0x0a, - 0x2b, 0xc7, 0x18, 0x1e, 0x7d, 0x29, 0x0c, 0xcf, 0x43, 0xf9, 0x8e, 0x62, 0xba, 0x44, 0xd9, 0x71, - 0xf3, 0xff, 0xc7, 0xba, 0xe3, 0x43, 0x58, 0x88, 0xef, 0x40, 0x93, 0xf0, 0x0b, 0x28, 0x29, 0x29, - 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, 0x1c, 0x7f, 0xc0, 0x6e, 0xd0, 0x04, 0x93, 0xc4, 0xb2, 0x0c, - 0xff, 0x44, 0x83, 0x85, 0x38, 0xe5, 0x7f, 0xbd, 0x3d, 0xba, 0x0b, 0x05, 0x69, 0x60, 0x51, 0x06, - 0x17, 0x14, 0x56, 0x9a, 0x5a, 0x8c, 0x27, 0x20, 0xc2, 0x7f, 0xd5, 0x60, 0x79, 0x87, 0x2f, 0x9f, - 0x7f, 0x68, 0xf4, 0x08, 0xb2, 0xfe, 0xd9, 0x80, 0xdb, 0xb2, 0xbc, 0xf9, 0xa1, 0x22, 0x3a, 0x55, - 0xc6, 0x46, 0x63, 0x40, 0x59, 0x0c, 0xc6, 0x88, 0x4d, 0xb8, 0xc4, 0x61, 0x5a, 0x57, 0x0f, 0x1a, - 0x8d, 0x67, 0x95, 0x29, 0x84, 0xa0, 0x7c, 0xd8, 0xdc, 0x32, 0x9a, 0xaf, 0xb7, 0x76, 0x9a, 0x7b, - 0x2f, 0xf6, 0x9a, 0xdf, 0xaf, 0x68, 0x68, 0x1e, 0x66, 0x0f, 0x9b, 0x8d, 0x67, 0x21, 0x2a, 0x83, - 0x66, 0xa1, 0xb8, 0xd3, 0x38, 0x78, 0xbc, 0x57, 0x7f, 0x6e, 0xd4, 0x2a, 0xd3, 0xb4, 0x00, 0x1b, - 0xb5, 0xc3, 0x5a, 0xb3, 0x92, 0x45, 0x33, 0x50, 0xa8, 0x37, 0x5e, 0xf3, 0x72, 0x9c, 0xc3, 0x27, - 0x70, 0x25, 0xe9, 0x30, 0xd4, 0xb6, 0x71, 0x75, 0x82, 0x7b, 0x2c, 0xa3, 0xde, 0x63, 0x49, 0x77, - 0xcf, 0x74, 0xf2, 0xdd, 0x83, 0x7f, 0xa9, 0x81, 0xbe, 0xef, 0xb4, 0x7b, 0x9d, 0xb3, 0x0b, 0x59, - 0x0f, 0x9c, 0x01, 0x71, 0x4d, 0xbf, 0xe7, 0xd8, 0x32, 0xde, 0x57, 0x93, 0x3d, 0xdb, 0x90, 0x74, - 0x86, 0xc2, 0x82, 0x6e, 0x41, 0xd9, 0x25, 0x2d, 0xc7, 0xee, 0xf4, 0x8e, 0x87, 0x2e, 0xd9, 0xb2, - 0x2c, 0x76, 0xae, 0x82, 0x11, 0xc3, 0xe2, 0x5f, 0x6b, 0xb0, 0x98, 0x24, 0x0c, 0x3d, 0x10, 0xfe, - 0xe3, 0xfd, 0xd5, 0xad, 0x73, 0xf6, 0x8e, 0xb8, 0x8e, 0x5f, 0xd7, 0x16, 0x2f, 0xac, 0x19, 0x79, - 0x5d, 0x73, 0x18, 0xdf, 0x4b, 0x70, 0xeb, 0x1c, 0x94, 0x8c, 0xda, 0x7e, 0xe3, 0x45, 0xed, 0xb5, - 0xd1, 0x78, 0x4a, 0x3d, 0x36, 0x03, 0x85, 0xad, 0xdd, 0x5d, 0x0e, 0x65, 0xf1, 0x4f, 0x35, 0x58, - 0x4a, 0xb0, 0x1c, 0x75, 0xd3, 0x77, 0xa0, 0xd2, 0x31, 0x7b, 0x16, 0x69, 0x37, 0x42, 0x6b, 0x69, - 0x17, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x66, 0xdc, 0xe7, 0x6a, 0xed, 0xc2, 0x3f, 0x82, 0xe5, - 0x5d, 0xe2, 0xf9, 0xae, 0x73, 0x11, 0x3f, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0x2b, 0x76, - 0x19, 0xe6, 0x81, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, - 0x76, 0xcf, 0x3e, 0x3e, 0x0c, 0xb6, 0x2b, 0x18, 0x49, 0x4b, 0x98, 0xc0, 0x95, 0xa4, 0xcd, 0xa9, - 0x29, 0xbe, 0x0d, 0xf3, 0x2d, 0x8b, 0x98, 0xf6, 0x90, 0x0b, 0x67, 0x48, 0x71, 0x27, 0x5c, 0x53, - 0xb3, 0x2f, 0x4e, 0x63, 0x8c, 0xb3, 0xe1, 0x3f, 0x6b, 0xb0, 0x7a, 0x18, 0xb9, 0x71, 0x9e, 0xb9, - 0x34, 0xb8, 0xfc, 0x1e, 0xf1, 0xd2, 0x54, 0x7d, 0x05, 0x30, 0x08, 0x88, 0x44, 0xc8, 0x3e, 0x50, - 0x0b, 0xfb, 0x64, 0x79, 0x1b, 0x21, 0x86, 0x5f, 0xd9, 0x8a, 0xb4, 0xea, 0x43, 0x98, 0x8b, 0x2d, - 0xbf, 0xd7, 0xf5, 0xbd, 0x0a, 0xd7, 0xd3, 0x77, 0xa7, 0xfa, 0x7a, 0xb0, 0x5a, 0x7f, 0x4f, 0x75, - 0x75, 0xc8, 0xbf, 0x19, 0x12, 0x57, 0xea, 0x5a, 0x34, 0x24, 0x48, 0x53, 0x8f, 0xbc, 0x6d, 0x59, - 0xc3, 0x36, 0xa9, 0x5b, 0xce, 0x91, 0x69, 0x79, 0x32, 0xf5, 0xa2, 0x58, 0xfc, 0x3b, 0x0d, 0xae, - 0xd7, 0x27, 0x1d, 0x0b, 0x7d, 0x2f, 0x62, 0x52, 0x1e, 0xd7, 0xf7, 0x15, 0x93, 0x4e, 0xe4, 0xfe, - 0x3a, 0x0d, 0xfa, 0x4f, 0x0d, 0x66, 0x23, 0x8d, 0x1a, 0x42, 0x90, 0xb5, 0x69, 0xba, 0x73, 0x76, - 0xf6, 0x9b, 0xb6, 0xbf, 0x96, 0xd3, 0x3a, 0x21, 0x6d, 0x11, 0xf9, 0x02, 0xa2, 0x78, 0xda, 0xd6, - 0xed, 0xb5, 0x45, 0x62, 0x09, 0x88, 0xe2, 0xf9, 0xab, 0x4f, 0xb4, 0xf2, 0x02, 0x0a, 0xf3, 0x30, - 0xa7, 0xde, 0xbd, 0xd7, 0xa0, 0xd8, 0xb2, 0x4c, 0xcf, 0x53, 0xda, 0xf7, 0x10, 0x81, 0x6a, 0x50, - 0x6e, 0x93, 0x81, 0xe5, 0x9c, 0xc9, 0xe2, 0x27, 0x5a, 0x78, 0xf5, 0xa1, 0x48, 0x0f, 0xbf, 0x1b, - 0x21, 0x32, 0x62, 0x4c, 0xb4, 0xf4, 0xa2, 0x71, 0x32, 0x7a, 0xc1, 0xd1, 0xb7, 0x84, 0xa2, 0x71, - 0x00, 0xd3, 0xc0, 0x30, 0x8f, 0x29, 0xa1, 0xbc, 0x4a, 0x24, 0x48, 0x57, 0x9c, 0x4e, 0x87, 0xb8, - 0x81, 0xe2, 0x12, 0xa4, 0xaf, 0x15, 0xf2, 0x96, 0xb4, 0x86, 0xbe, 0x43, 0x17, 0xb9, 0xf6, 0x0a, - 0x06, 0xcf, 0xc3, 0x5c, 0x9d, 0xf8, 0x22, 0x41, 0xf9, 0xc3, 0xe0, 0x11, 0xcc, 0x86, 0x28, 0x1a, - 0x2c, 0x41, 0x4f, 0xad, 0x5d, 0xa8, 0xa7, 0xc6, 0xeb, 0x50, 0x16, 0x02, 0x94, 0xe7, 0x8a, 0xf0, - 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x33, 0x01, 0x25, 0xdd, 0xe9, 0x03, 0xc8, 0xd2, 0x15, 0x71, - 0xb9, 0x2c, 0xc4, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x06, 0xb3, 0x14, 0xb3, 0x43, 0xbd, 0x92, - 0x1a, 0x25, 0xf4, 0x0d, 0xc1, 0xd9, 0xf7, 0x9d, 0x36, 0x09, 0xde, 0x10, 0x21, 0x0a, 0xff, 0x18, - 0x4a, 0x3b, 0x4e, 0xbf, 0x6f, 0xda, 0x6d, 0x26, 0xa4, 0x02, 0xd3, 0xc4, 0x1e, 0x31, 0x35, 0x8b, - 0x06, 0xfd, 0xc9, 0x02, 0xa4, 0x4b, 0x2c, 0x4b, 0xc4, 0x19, 0x07, 0xc2, 0xf0, 0x9d, 0x56, 0xc2, - 0x97, 0x86, 0x8d, 0xe9, 0x1e, 0x0f, 0xf9, 0x9b, 0x28, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, - 0x66, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x3e, 0x94, 0x76, 0xba, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, - 0xa4, 0x34, 0x3b, 0x45, 0x51, 0x04, 0x99, 0x35, 0xdd, 0x63, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, - 0xaf, 0x69, 0x28, 0x04, 0x69, 0xf3, 0x0d, 0x28, 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, - 0x1d, 0x17, 0x92, 0x52, 0xbe, 0x96, 0xb4, 0xaa, 0xe8, 0xde, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, - 0x21, 0x29, 0xfa, 0x16, 0xcc, 0xf5, 0xec, 0x23, 0x67, 0x68, 0xb7, 0x85, 0x4a, 0xf4, 0x72, 0xa2, - 0xe1, 0xb2, 0xa4, 0x96, 0x88, 0x50, 0x5b, 0x23, 0x4e, 0x8e, 0xb6, 0xa1, 0xe2, 0x0c, 0xfd, 0xa8, - 0x88, 0xec, 0x44, 0x11, 0x63, 0xf4, 0xe8, 0x3e, 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, - 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, 0x3d, 0x33, 0xfd, 0xae, 0xc8, 0xf9, 0x00, 0xa6, - 0xfe, 0x26, 0xf6, 0x68, 0xaf, 0xcd, 0x32, 0xbd, 0x68, 0x70, 0x00, 0xed, 0x44, 0xee, 0x50, 0xfe, - 0xe8, 0xfa, 0xbf, 0x84, 0x90, 0xfd, 0x3a, 0xaf, 0xcb, 0xbb, 0xb0, 0x10, 0x2d, 0xbb, 0x3c, 0xdf, - 0x74, 0xc8, 0xf3, 0x0c, 0xf3, 0x44, 0x30, 0x4b, 0x10, 0xff, 0x4c, 0x83, 0xf9, 0xb1, 0x42, 0x8d, - 0x1e, 0x40, 0xe9, 0xa4, 0x67, 0x59, 0xa4, 0xdd, 0xbc, 0x50, 0x9e, 0xab, 0xc4, 0xe8, 0x0b, 0x98, - 0x71, 0x79, 0x23, 0x21, 0x7b, 0x91, 0xc9, 0xcc, 0x11, 0x6a, 0xbc, 0xc3, 0xee, 0x1f, 0xfa, 0x26, - 0x08, 0x0e, 0x1f, 0x58, 0x5b, 0x53, 0xad, 0x5d, 0x85, 0xc2, 0xc0, 0xf4, 0xbb, 0x87, 0x03, 0xd2, - 0x92, 0x9d, 0x9f, 0x84, 0xf1, 0x2f, 0xb2, 0x50, 0x90, 0xcf, 0x8a, 0xb4, 0x7a, 0x21, 0xee, 0xff, - 0x4c, 0xf2, 0xfd, 0x1f, 0x99, 0x21, 0x54, 0xa1, 0xd0, 0x19, 0x5a, 0x16, 0x0b, 0x05, 0x7e, 0x63, - 0x06, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, 0xe8, 0x36, 0xe4, 0x68, 0x2b, 0xea, 0xe9, 0x97, 0x98, - 0x01, 0x12, 0x9f, 0x3c, 0x9c, 0x02, 0x3d, 0x1c, 0x1b, 0x16, 0xdc, 0x48, 0xa0, 0x4e, 0x9d, 0x12, - 0xdc, 0x8b, 0x4c, 0x09, 0xae, 0x27, 0xb1, 0xc6, 0xc7, 0x03, 0x0f, 0xc7, 0xc6, 0x03, 0x89, 0x3b, - 0xfe, 0x0f, 0xcd, 0x05, 0x1e, 0xb0, 0x2a, 0x26, 0x02, 0x8b, 0xc6, 0x78, 0xe0, 0x1f, 0xed, 0x3c, - 0xff, 0xe0, 0xdf, 0x6a, 0x70, 0xb5, 0x4e, 0xfc, 0x97, 0xb1, 0x29, 0x41, 0x10, 0xa1, 0x6b, 0x50, - 0x72, 0xc9, 0xc0, 0x79, 0x66, 0xfa, 0x3e, 0x71, 0xe5, 0x08, 0x4e, 0x45, 0xa1, 0x75, 0x98, 0x73, - 0xc9, 0xa8, 0xe7, 0xf5, 0x1c, 0x5b, 0x52, 0xf1, 0x13, 0xc6, 0xd1, 0x54, 0x96, 0x69, 0x59, 0xdb, - 0xae, 0x69, 0xb7, 0xba, 0x44, 0x36, 0x74, 0x2a, 0x8a, 0x95, 0x7d, 0xcb, 0x6a, 0x9a, 0xc7, 0xbc, - 0x7b, 0x29, 0x18, 0x12, 0xc4, 0x47, 0xb0, 0x18, 0x3f, 0xa3, 0x4c, 0x01, 0x7a, 0x18, 0x99, 0x02, - 0xf4, 0x37, 0xbb, 0xdf, 0xe4, 0x14, 0x44, 0xe4, 0x8f, 0x84, 0xd9, 0xab, 0x4a, 0x1c, 0x4b, 0x64, - 0x42, 0x00, 0xe3, 0xaf, 0x60, 0x39, 0xd9, 0x14, 0xd4, 0xa6, 0xfb, 0x30, 0x1f, 0x1f, 0xa5, 0x24, - 0xbd, 0x92, 0x92, 0x0e, 0x69, 0x8c, 0x73, 0x62, 0x04, 0x95, 0xa7, 0x3d, 0x8f, 0xbe, 0x3a, 0x1c, - 0xe5, 0x1b, 0x40, 0x81, 0xc2, 0xa9, 0xa9, 0xad, 0x43, 0x5e, 0x24, 0x86, 0xa8, 0xd1, 0x12, 0xa4, - 0x3e, 0x10, 0x3f, 0x8d, 0xa8, 0x72, 0x71, 0x34, 0x7e, 0x03, 0x65, 0x65, 0x5f, 0x19, 0x2c, 0x14, - 0x4a, 0x0a, 0x16, 0x71, 0x1a, 0x83, 0x53, 0xa0, 0x4f, 0xe1, 0xf2, 0x31, 0xeb, 0xbb, 0x77, 0x63, - 0x9b, 0x71, 0x2b, 0x27, 0x2f, 0xe2, 0x03, 0x28, 0x6f, 0xb5, 0xdb, 0x54, 0x96, 0x0c, 0xaa, 0x24, - 0xe5, 0x12, 0x54, 0xc8, 0x24, 0xab, 0x60, 0xc0, 0x4c, 0x20, 0x8f, 0xf7, 0x6c, 0xc8, 0x26, 0xa7, - 0xf1, 0x23, 0x71, 0xd9, 0x09, 0x2b, 0x74, 0xf7, 0x9e, 0xac, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, - 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0xd4, 0x63, 0x2e, 0x42, 0xae, 0x67, 0xb7, 0xc9, 0x5b, 0xf9, - 0xe1, 0x80, 0x01, 0xf8, 0x9b, 0x30, 0xa7, 0x92, 0xd2, 0x13, 0xdc, 0x82, 0xb2, 0xba, 0x4f, 0x10, - 0x8e, 0x31, 0x2c, 0xfe, 0x10, 0x16, 0x0c, 0xd2, 0x71, 0x89, 0xd7, 0x55, 0xfd, 0x9e, 0xb2, 0xcf, - 0xff, 0xc3, 0xe5, 0x43, 0xe2, 0x2b, 0xec, 0x93, 0xc9, 0x1f, 0xb2, 0xc7, 0x66, 0x3d, 0xc9, 0x03, - 0x92, 0x51, 0x8d, 0x7d, 0x2d, 0x16, 0xfb, 0xdf, 0x65, 0xaf, 0x3b, 0xba, 0x4d, 0x0a, 0x73, 0xe2, - 0xae, 0x11, 0x91, 0x99, 0x98, 0xc8, 0x7b, 0x70, 0x35, 0x4d, 0x24, 0x35, 0x9a, 0x74, 0x83, 0xa6, - 0xb8, 0x21, 0x0f, 0xb9, 0x5a, 0x7f, 0xe0, 0x9f, 0x6d, 0xfe, 0x61, 0x16, 0xf2, 0x62, 0xaa, 0x84, - 0x76, 0xa0, 0xd4, 0x74, 0xcd, 0xd6, 0x09, 0xff, 0x24, 0x85, 0xf4, 0xb1, 0xaf, 0x54, 0xe2, 0x88, - 0xd5, 0xa5, 0x84, 0x15, 0xfa, 0x30, 0x9d, 0xfa, 0x58, 0x43, 0xaf, 0xa0, 0x12, 0xff, 0xd2, 0x82, - 0x70, 0xf4, 0x15, 0x98, 0xf4, 0x21, 0xa9, 0xba, 0x36, 0x91, 0x86, 0x49, 0x47, 0xdb, 0x50, 0x90, - 0x5f, 0x22, 0x90, 0x3a, 0x39, 0x8c, 0x7d, 0xc9, 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x4b, 0xd6, - 0x1c, 0xa8, 0x9f, 0x28, 0xd0, 0x8d, 0xd4, 0x47, 0x6a, 0xa0, 0xf1, 0xea, 0x24, 0x12, 0x2e, 0xb8, - 0x09, 0xe5, 0xe8, 0xd4, 0x15, 0xad, 0x9d, 0x37, 0xf2, 0xad, 0xae, 0x4c, 0xa0, 0x08, 0xa4, 0x46, - 0xf7, 0x43, 0x6b, 0xa9, 0x47, 0x49, 0x92, 0x9a, 0x30, 0x89, 0xc5, 0x53, 0xe8, 0x87, 0x80, 0xc6, - 0x47, 0x89, 0xe8, 0xe6, 0x45, 0xc6, 0x9e, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x07, 0x30, 0x3f, - 0x36, 0x04, 0x43, 0x6a, 0x27, 0x9b, 0x36, 0x5c, 0xac, 0xde, 0x98, 0x4c, 0x14, 0x28, 0x30, 0x3e, - 0x59, 0x8a, 0x28, 0x90, 0x3a, 0xf5, 0x8a, 0x28, 0x90, 0x32, 0x9e, 0xe2, 0xb1, 0x26, 0x5f, 0xac, - 0x91, 0x58, 0x8b, 0xbd, 0x6c, 0x23, 0xb1, 0x16, 0x79, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, - 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x8d, 0x35, - 0x5a, 0x49, 0x1d, 0x8d, 0x71, 0x51, 0x13, 0x47, 0x67, 0x81, 0x52, 0xac, 0x81, 0x89, 0x2b, 0xa5, - 0xb6, 0xcb, 0x71, 0xa5, 0xc2, 0x8e, 0x07, 0x4f, 0xa1, 0x0e, 0xfb, 0xc6, 0x37, 0x56, 0xbc, 0xd1, - 0xad, 0x28, 0x4f, 0x5a, 0xa3, 0x53, 0xbd, 0x79, 0x2e, 0x1d, 0xdf, 0xa7, 0x06, 0xc5, 0xa0, 0x80, - 0xa2, 0xab, 0x0a, 0x53, 0xbc, 0x9c, 0x57, 0x97, 0x93, 0x17, 0x03, 0x1f, 0x88, 0x22, 0x16, 0xf1, - 0x41, 0xb4, 0x50, 0x46, 0x7c, 0xa0, 0xd6, 0x3c, 0x3c, 0x85, 0x9e, 0x00, 0x84, 0x65, 0x08, 0x5d, - 0x8b, 0x54, 0xed, 0x58, 0x21, 0xab, 0x56, 0x53, 0x56, 0xa5, 0xf5, 0x67, 0xd4, 0xaa, 0x14, 0xf1, - 0x66, 0x42, 0xb9, 0xaa, 0x56, 0xd4, 0xa1, 0x30, 0xbd, 0xad, 0xf1, 0x14, 0x7a, 0x0c, 0xe5, 0x68, - 0xb1, 0x8a, 0xdc, 0x07, 0x89, 0x75, 0x2c, 0x51, 0xce, 0x2b, 0xd0, 0xd3, 0xaa, 0x18, 0xba, 0x13, - 0x95, 0x38, 0xa9, 0xd4, 0x25, 0xca, 0xb6, 0x60, 0x29, 0xb9, 0x1e, 0xa1, 0xf5, 0xa8, 0xe4, 0xf4, - 0x2a, 0x58, 0xbd, 0x75, 0x01, 0x4a, 0x66, 0xd5, 0xed, 0xfb, 0x7f, 0x7c, 0xb7, 0xa2, 0xfd, 0xed, - 0xdd, 0x8a, 0xf6, 0xf7, 0x77, 0x2b, 0xda, 0xaf, 0xfe, 0xb1, 0x32, 0x05, 0xb8, 0xd5, 0xdd, 0x68, - 0x11, 0xd7, 0xde, 0x30, 0xad, 0x5e, 0x8b, 0x6c, 0x38, 0x9b, 0x1b, 0x52, 0x92, 0x3b, 0x68, 0x79, - 0xc4, 0x1d, 0x11, 0xf7, 0x55, 0x66, 0x70, 0x74, 0x74, 0x89, 0xfd, 0x8b, 0xe4, 0x93, 0x7f, 0x07, - 0x00, 0x00, 0xff, 0xff, 0x9e, 0xa5, 0x0f, 0x75, 0x5f, 0x22, 0x00, 0x00, + 0xd8, 0x69, 0x1e, 0x78, 0xe3, 0x0d, 0x21, 0xb4, 0xe2, 0x85, 0x57, 0x84, 0xf8, 0x0e, 0x3c, 0x20, + 0xf1, 0x8a, 0x10, 0x08, 0x3e, 0x02, 0x2a, 0x12, 0xcf, 0x7c, 0x04, 0x74, 0xff, 0xcd, 0xdc, 0x19, + 0xcf, 0x38, 0x29, 0x68, 0x5f, 0x78, 0xf3, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xdf, 0x7b, 0xce, 0xbd, + 0x63, 0x58, 0x1a, 0xb8, 0x8e, 0xef, 0x78, 0x77, 0x9d, 0xcd, 0x96, 0x63, 0xfb, 0xae, 0x63, 0x6d, + 0x30, 0x04, 0x2a, 0x06, 0x08, 0xbc, 0x04, 0x8b, 0xb5, 0x11, 0xb1, 0xfd, 0xd7, 0xfb, 0xc4, 0x73, + 0xbc, 0x27, 0xc4, 0x74, 0xfd, 0x23, 0x62, 0xfa, 0x78, 0x0e, 0x66, 0x0f, 0x7d, 0xd3, 0x1f, 0x7a, + 0x06, 0x79, 0x33, 0x24, 0x9e, 0x8f, 0x8f, 0xa0, 0x24, 0x11, 0x03, 0xeb, 0x0c, 0x2d, 0x42, 0xce, + 0xf3, 0x4d, 0x9f, 0xe8, 0xda, 0x9a, 0xb6, 0x5e, 0x34, 0x38, 0x80, 0x1e, 0xc2, 0xac, 0xc7, 0x88, + 0x9e, 0x0f, 0xda, 0xa6, 0x4f, 0x3c, 0x3d, 0xb3, 0x36, 0xbd, 0x5e, 0xda, 0xbc, 0xb2, 0x11, 0x6a, + 0x70, 0xa8, 0xac, 0x1b, 0x51, 0x6a, 0xfc, 0x17, 0x0d, 0x66, 0xd4, 0x75, 0xf4, 0x09, 0xe4, 0x2c, + 0x32, 0x22, 0x16, 0xdb, 0xa5, 0xbc, 0x79, 0x3d, 0x45, 0xce, 0xc6, 0x53, 0x4a, 0x64, 0x70, 0x5a, + 0xb4, 0x07, 0xe5, 0x7e, 0xc4, 0x18, 0x3d, 0xb3, 0xa6, 0xad, 0x97, 0x36, 0x57, 0x15, 0xee, 0x24, + 0x9b, 0x9f, 0x4c, 0x19, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x6e, 0x6d, + 0xfb, 0x79, 0xbd, 0x32, 0x85, 0x0a, 0x90, 0xdd, 0x3b, 0x78, 0xdc, 0xa8, 0x68, 0xa8, 0x04, 0xf9, + 0x97, 0x5b, 0xc6, 0xc1, 0xde, 0x41, 0xbd, 0x92, 0xa1, 0x14, 0x35, 0xc3, 0x68, 0x18, 0x95, 0xe9, + 0xed, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0c, 0x57, 0xea, 0xc4, 0x7f, 0xec, 0x9a, 0x7d, 0x72, 0xea, + 0xb8, 0x27, 0x7b, 0x76, 0xc7, 0x91, 0xee, 0xfc, 0x8d, 0x06, 0xf9, 0x17, 0xc4, 0xf5, 0x7a, 0x8e, + 0x4d, 0x7d, 0xd9, 0x37, 0xbf, 0x72, 0x5c, 0x66, 0x65, 0xce, 0xe0, 0x00, 0xc3, 0xf6, 0x6c, 0xc7, + 0x65, 0xda, 0x53, 0x2c, 0x05, 0x28, 0x76, 0x60, 0xfa, 0xad, 0xae, 0x3e, 0xcd, 0xb1, 0x0c, 0xa0, + 0xd8, 0xa3, 0x61, 0xcf, 0x6a, 0xeb, 0x59, 0x1e, 0x0d, 0x06, 0xa0, 0x35, 0x28, 0x0d, 0x5c, 0xa7, + 0x3d, 0x6c, 0xf9, 0x07, 0x66, 0x9f, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x0a, 0xc0, 0x88, 0x2b, + 0x71, 0xe8, 0xbb, 0xfa, 0x25, 0x46, 0xa0, 0x60, 0xf0, 0x2f, 0x32, 0x70, 0x79, 0xdc, 0x02, 0x1a, + 0xff, 0x35, 0x28, 0x75, 0x02, 0x6c, 0x5b, 0x64, 0x81, 0x8a, 0x42, 0x1f, 0xc1, 0x3c, 0xb1, 0x47, + 0x3d, 0xd7, 0xb1, 0xfb, 0xc4, 0xf6, 0xbd, 0x1d, 0x67, 0x68, 0xfb, 0xc2, 0x96, 0xf1, 0x05, 0xaa, + 0x89, 0x6f, 0x7a, 0x27, 0x82, 0x8c, 0x1b, 0xa7, 0x60, 0xc2, 0x7c, 0xcb, 0xaa, 0xf9, 0xb6, 0x02, + 0xd0, 0x75, 0x3c, 0x29, 0x3c, 0xc7, 0xb9, 0x42, 0x0c, 0xc2, 0x30, 0xd3, 0xb3, 0x3d, 0xdf, 0xb4, + 0x5b, 0x84, 0xb9, 0x80, 0x5b, 0x18, 0xc1, 0xa1, 0x8f, 0x20, 0x2f, 0x2c, 0xd6, 0xf3, 0x2c, 0x4f, + 0x90, 0x92, 0x27, 0x22, 0x44, 0x86, 0x24, 0xc1, 0xb7, 0x61, 0xae, 0x49, 0x4c, 0xb7, 0xed, 0x9c, + 0xda, 0x22, 0x94, 0x68, 0x09, 0x2e, 0xb9, 0xc4, 0xf4, 0x1c, 0x5b, 0x78, 0x41, 0x40, 0xb4, 0x84, + 0x42, 0xd2, 0x81, 0x75, 0x86, 0x75, 0x58, 0xaa, 0x13, 0xbf, 0xa6, 0xd8, 0x2e, 0xb3, 0xe1, 0x2d, + 0x2c, 0x8e, 0xad, 0x5c, 0xcc, 0xcb, 0x5f, 0xc2, 0x8c, 0xea, 0x4c, 0x51, 0x70, 0x55, 0x35, 0xd5, + 0xc3, 0x65, 0x16, 0xbe, 0x08, 0x3d, 0xfe, 0x53, 0x16, 0xe6, 0x62, 0x14, 0xa8, 0x0c, 0x99, 0x9e, + 0xdc, 0x2c, 0xd3, 0x63, 0x79, 0xd4, 0x72, 0x89, 0xe9, 0x93, 0xf6, 0xcb, 0x2e, 0xb1, 0x59, 0x0c, + 0x8b, 0x86, 0x8a, 0x0a, 0xa3, 0x33, 0xad, 0x46, 0x67, 0x03, 0x72, 0x2c, 0x82, 0x7a, 0x96, 0x29, + 0xa5, 0xab, 0xd5, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa3, 0x38, 0x19, 0xaa, 0x42, 0xc1, + 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x99, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, 0x62, + 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0xcf, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, 0xa1, + 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xfb, 0x63, 0x63, 0x57, + 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, 0x02, + 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, 0x97, + 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, 0x23, + 0xaa, 0xa1, 0x0a, 0x4c, 0x9f, 0x90, 0x33, 0x11, 0x17, 0xfa, 0x93, 0xba, 0x7d, 0x64, 0x5a, 0x43, + 0x22, 0x42, 0xc2, 0x81, 0x07, 0x99, 0xfb, 0x5a, 0xf5, 0x33, 0x28, 0x06, 0x32, 0xdf, 0x8b, 0xf1, + 0x73, 0x98, 0x8d, 0x28, 0xf4, 0x3e, 0xcc, 0xf8, 0xf7, 0x1a, 0x5c, 0x3e, 0x20, 0xa7, 0x8a, 0x85, + 0xb2, 0x46, 0xee, 0x40, 0x85, 0x26, 0x6c, 0xc7, 0x72, 0x4e, 0x9b, 0xa4, 0x3f, 0xb0, 0xc2, 0xce, + 0x31, 0x86, 0x47, 0x5f, 0x0a, 0xc7, 0xf3, 0x54, 0xbe, 0xa3, 0xb8, 0x2e, 0x51, 0x76, 0xdc, 0xfd, + 0xff, 0xb1, 0xed, 0xf8, 0x10, 0x16, 0xe2, 0x3b, 0xd0, 0x22, 0xfc, 0x02, 0x4a, 0x4a, 0xc9, 0x30, + 0x51, 0x93, 0x2b, 0x4c, 0x25, 0xc7, 0x1f, 0xb0, 0x13, 0x34, 0xc1, 0x25, 0xb1, 0x2a, 0xc3, 0x3f, + 0xd5, 0x60, 0x21, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x42, 0x41, 0x3a, 0x58, 0xb4, 0xc1, 0x05, + 0x85, 0x95, 0x96, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xde, 0xe1, 0xcb, 0xe7, 0x2b, + 0x8d, 0x1e, 0x41, 0xd6, 0x3f, 0x1b, 0x70, 0x5f, 0x96, 0x37, 0x3f, 0x54, 0x44, 0xa7, 0xca, 0xd8, + 0x68, 0x0c, 0x28, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xfb, 0xea, 0x41, 0xa3, 0xf1, + 0xac, 0x32, 0x85, 0x10, 0x94, 0x0f, 0x9b, 0x5b, 0x46, 0xf3, 0xf5, 0xd6, 0x4e, 0x73, 0xef, 0xc5, + 0x5e, 0xf3, 0x87, 0x15, 0x0d, 0xcd, 0xc3, 0xec, 0x61, 0xb3, 0xf1, 0x2c, 0x44, 0x65, 0xd0, 0x2c, + 0x14, 0x77, 0x1a, 0x07, 0x8f, 0xf7, 0xea, 0xcf, 0x8d, 0x5a, 0x65, 0x9a, 0x36, 0x60, 0xa3, 0x76, + 0x58, 0x6b, 0x56, 0xb2, 0x68, 0x06, 0x0a, 0xf5, 0xc6, 0x6b, 0xde, 0x8e, 0x73, 0xf8, 0x04, 0xae, + 0x24, 0x29, 0x43, 0x7d, 0x1b, 0x37, 0x27, 0x38, 0xc7, 0x32, 0xea, 0x39, 0x96, 0x74, 0xf6, 0x4c, + 0x27, 0x9f, 0x3d, 0xf8, 0x97, 0x1a, 0xe8, 0xfb, 0x4e, 0xbb, 0xd7, 0x39, 0xbb, 0x90, 0xf7, 0xc0, + 0x19, 0x10, 0xd7, 0xf4, 0x7b, 0x8e, 0x2d, 0xf3, 0x7d, 0x35, 0x39, 0xb2, 0x0d, 0x49, 0x67, 0x28, + 0x2c, 0xe8, 0x16, 0x94, 0x5d, 0xd2, 0x72, 0xec, 0x4e, 0xef, 0x78, 0xe8, 0x92, 0x2d, 0xcb, 0x62, + 0x7a, 0x15, 0x8c, 0x18, 0x16, 0xff, 0x5a, 0x83, 0xc5, 0x24, 0x61, 0xe8, 0x81, 0x88, 0x1f, 0x9f, + 0xaf, 0x6e, 0x9d, 0xb3, 0x77, 0x24, 0x74, 0xfc, 0xb8, 0xb6, 0x78, 0x63, 0xcd, 0xc8, 0xe3, 0x9a, + 0xc3, 0xf8, 0x5e, 0x42, 0x58, 0xe7, 0xa0, 0x64, 0xd4, 0xf6, 0x1b, 0x2f, 0x6a, 0xaf, 0x8d, 0xc6, + 0x53, 0x1a, 0xb1, 0x19, 0x28, 0x6c, 0xed, 0xee, 0x72, 0x28, 0x8b, 0x7f, 0xa6, 0xc1, 0x52, 0x82, + 0xe7, 0x68, 0x98, 0xbe, 0x07, 0x95, 0x8e, 0xd9, 0xb3, 0x48, 0xbb, 0x11, 0x7a, 0x4b, 0xbb, 0x98, + 0xb7, 0xc6, 0x18, 0x45, 0x10, 0x32, 0xe3, 0x31, 0x57, 0x7b, 0x17, 0xfe, 0x5a, 0x83, 0xe5, 0x5d, + 0xe2, 0xf9, 0xae, 0x73, 0x91, 0x40, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0xeb, 0x76, 0x19, + 0x16, 0x82, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, 0x76, + 0xcf, 0x3e, 0x3e, 0x0c, 0xf6, 0x2b, 0x18, 0x49, 0x4b, 0x54, 0xa7, 0x8e, 0xe3, 0xb6, 0xf8, 0xb4, + 0x53, 0x30, 0x38, 0x80, 0x09, 0x5c, 0x49, 0x52, 0x89, 0x7a, 0xe8, 0xbb, 0x30, 0xdf, 0xb2, 0x88, + 0x69, 0x0f, 0xf9, 0x96, 0x0c, 0x29, 0x8e, 0x8a, 0x6b, 0x6a, 0x51, 0xc6, 0x69, 0x8c, 0x71, 0x36, + 0xfc, 0x67, 0x0d, 0x56, 0x0f, 0x23, 0x07, 0xd1, 0x33, 0x97, 0xe6, 0x9c, 0xdf, 0x23, 0x5e, 0x9a, + 0x03, 0x5e, 0x01, 0x0c, 0x02, 0x22, 0x91, 0xc9, 0x0f, 0xd4, 0x7e, 0x3f, 0x59, 0xde, 0x46, 0x88, + 0xe1, 0x27, 0xb9, 0x22, 0xad, 0xfa, 0x10, 0xe6, 0x62, 0xcb, 0xef, 0x75, 0xaa, 0xaf, 0xc2, 0xf5, + 0xf4, 0xdd, 0xa9, 0xbd, 0x1e, 0xac, 0xd6, 0xdf, 0xd3, 0x5c, 0x1d, 0xf2, 0x6f, 0x86, 0xc4, 0x95, + 0xb6, 0x16, 0x0d, 0x09, 0xd2, 0x8a, 0x24, 0x6f, 0x5b, 0xd6, 0xb0, 0x4d, 0xea, 0x96, 0x73, 0x64, + 0x5a, 0x9e, 0xac, 0xc8, 0x28, 0x16, 0xff, 0x4e, 0x83, 0xeb, 0xf5, 0x49, 0x6a, 0xa1, 0x1f, 0x44, + 0x5c, 0xca, 0xd3, 0xfd, 0xbe, 0xe2, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x43, 0xff, 0xa9, 0xc1, 0x6c, + 0x64, 0x7e, 0x43, 0x08, 0xb2, 0x36, 0x3d, 0x05, 0x38, 0x3b, 0xfb, 0x4d, 0xa7, 0x62, 0xcb, 0x69, + 0x9d, 0x90, 0xb6, 0xa8, 0x07, 0x01, 0x51, 0x3c, 0x9d, 0xf6, 0xf6, 0xda, 0xa2, 0xde, 0x04, 0x44, + 0xf1, 0xfc, 0x32, 0x28, 0x26, 0x7c, 0x01, 0x85, 0xe5, 0x99, 0x53, 0x8f, 0xe4, 0x6b, 0x50, 0x6c, + 0x59, 0xa6, 0xe7, 0x29, 0x53, 0x7d, 0x88, 0x40, 0x35, 0x28, 0xb7, 0xc9, 0xc0, 0x72, 0xce, 0x64, + 0x4f, 0x14, 0x93, 0xbd, 0x7a, 0x7f, 0xa4, 0xca, 0xef, 0x46, 0x88, 0x8c, 0x18, 0x13, 0xed, 0xc8, + 0x68, 0x9c, 0x8c, 0x9e, 0x7b, 0xf4, 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x34, 0x31, 0xcc, 0x63, 0x4a, + 0x28, 0x4f, 0x18, 0x09, 0xd2, 0x15, 0xa7, 0xd3, 0x21, 0x6e, 0x60, 0xb8, 0x04, 0xe9, 0x25, 0x86, + 0xbc, 0x25, 0xad, 0xa1, 0xef, 0xd0, 0x45, 0x6e, 0xbd, 0x82, 0xc1, 0xf3, 0x30, 0x57, 0x27, 0xbe, + 0x28, 0x50, 0x7e, 0x5f, 0x78, 0x04, 0xb3, 0x21, 0x8a, 0x26, 0x4b, 0x30, 0x6a, 0x6b, 0x17, 0x1a, + 0xb5, 0xf1, 0x3a, 0x94, 0x85, 0x00, 0xe5, 0x16, 0x23, 0xe2, 0xa2, 0xa9, 0x71, 0xc1, 0x9f, 0xc1, + 0x4c, 0x40, 0x49, 0x77, 0xfa, 0x00, 0xb2, 0x74, 0x45, 0x1c, 0x2e, 0x0b, 0x31, 0x8f, 0xb2, 0x3d, + 0x18, 0x01, 0xae, 0xc1, 0x2c, 0xc5, 0xec, 0xd0, 0xa8, 0xa4, 0x66, 0x09, 0xbd, 0x5a, 0x70, 0xf6, + 0x7d, 0xa7, 0x4d, 0x82, 0xab, 0x45, 0x88, 0xc2, 0x3f, 0x81, 0xd2, 0x8e, 0xd3, 0xef, 0x9b, 0x76, + 0x9b, 0x09, 0xa9, 0xc0, 0x34, 0xb1, 0x47, 0xcc, 0xcc, 0xa2, 0x41, 0x7f, 0xb2, 0x04, 0xe9, 0x12, + 0xcb, 0x12, 0x79, 0xc6, 0x81, 0x30, 0x7d, 0xa7, 0x95, 0xf4, 0xa5, 0x69, 0x63, 0xba, 0xc7, 0x43, + 0x7e, 0x55, 0xca, 0x32, 0x19, 0x21, 0x82, 0x2a, 0x48, 0xa7, 0x6f, 0x91, 0x69, 0xec, 0x37, 0xde, + 0x87, 0xd2, 0x4e, 0xd7, 0xb4, 0x6d, 0x62, 0xa5, 0xda, 0x80, 0x94, 0x19, 0xa8, 0x28, 0x7a, 0x23, + 0xf3, 0xa6, 0x7b, 0x4c, 0xfc, 0x30, 0xcb, 0x29, 0x84, 0xff, 0x35, 0x0d, 0x85, 0xa0, 0x6c, 0xbe, + 0x05, 0x45, 0x8f, 0x06, 0x87, 0x65, 0x28, 0xf7, 0x67, 0x7a, 0xe0, 0x42, 0x52, 0xca, 0xd7, 0x92, + 0x5e, 0x15, 0x43, 0x9d, 0x1e, 0x8b, 0x43, 0xe0, 0x75, 0x23, 0x24, 0x45, 0xdf, 0x81, 0xb9, 0x9e, + 0x7d, 0xe4, 0x0c, 0xed, 0xb6, 0x30, 0x89, 0x1e, 0x4e, 0x34, 0x5d, 0x96, 0xd4, 0x16, 0x11, 0x5a, + 0x6b, 0xc4, 0xc9, 0xd1, 0x36, 0x54, 0x9c, 0xa1, 0x1f, 0x15, 0x91, 0x9d, 0x28, 0x62, 0x8c, 0x1e, + 0xdd, 0xa7, 0x21, 0x0f, 0x02, 0xca, 0x9c, 0x1d, 0x63, 0x0f, 0x57, 0x0d, 0x95, 0x94, 0x16, 0x1e, + 0xcd, 0xac, 0x67, 0xa6, 0xdf, 0x15, 0x35, 0x1f, 0xc0, 0x34, 0xde, 0xc4, 0x1e, 0xed, 0xb5, 0x59, + 0xa5, 0x17, 0x0d, 0x0e, 0xa0, 0x9d, 0xc8, 0x19, 0xca, 0xef, 0x62, 0xff, 0x97, 0x90, 0xb2, 0xdf, + 0xe4, 0x71, 0x79, 0x17, 0x16, 0xa2, 0x6d, 0x97, 0xd7, 0x9b, 0x0e, 0x79, 0x5e, 0x61, 0x9e, 0x48, + 0x66, 0x09, 0xe2, 0x9f, 0x6b, 0x30, 0x3f, 0xd6, 0xa8, 0xd1, 0x03, 0x28, 0x9d, 0xf4, 0x2c, 0x8b, + 0xb4, 0x9b, 0x17, 0xaa, 0x73, 0x95, 0x18, 0x7d, 0x01, 0x33, 0x2e, 0x1f, 0x2f, 0xe4, 0x84, 0x32, + 0x99, 0x39, 0x42, 0x8d, 0x77, 0xd8, 0xf9, 0x43, 0xaf, 0x0a, 0x81, 0xf2, 0x81, 0xb7, 0x35, 0xd5, + 0xdb, 0x55, 0x28, 0x0c, 0x4c, 0xbf, 0x7b, 0x38, 0x20, 0x2d, 0x39, 0x10, 0x4a, 0x18, 0x7f, 0x9d, + 0x85, 0x82, 0xbc, 0x6d, 0xa4, 0xf5, 0x0b, 0x71, 0xfe, 0x67, 0x92, 0xcf, 0xff, 0xc8, 0xd3, 0x42, + 0x15, 0x0a, 0x9d, 0xa1, 0x65, 0xb1, 0x54, 0xe0, 0x27, 0x66, 0x00, 0xab, 0x9e, 0xcd, 0x45, 0x3c, + 0x8b, 0x6e, 0x43, 0x8e, 0x4e, 0xa8, 0x9e, 0x7e, 0x89, 0x39, 0x20, 0xf1, 0x26, 0xc4, 0x29, 0xd0, + 0xc3, 0xb1, 0x37, 0x84, 0x1b, 0x09, 0xd4, 0xa9, 0x8f, 0x07, 0xf7, 0x22, 0x8f, 0x07, 0xd7, 0x93, + 0x58, 0xe3, 0xaf, 0x06, 0x0f, 0xc7, 0x5e, 0x0d, 0x12, 0x77, 0xfc, 0x1f, 0x7a, 0x2e, 0x78, 0xc0, + 0xba, 0x98, 0x48, 0x2c, 0x9a, 0xe3, 0x41, 0x7c, 0xb4, 0xf3, 0xe2, 0x83, 0x7f, 0xab, 0xc1, 0xd5, + 0x3a, 0xf1, 0x5f, 0xc6, 0x1e, 0x0f, 0x82, 0x0c, 0x5d, 0x83, 0x92, 0x4b, 0x06, 0xce, 0x33, 0xd3, + 0xf7, 0x89, 0x2b, 0x5f, 0xe6, 0x54, 0x14, 0x5a, 0x87, 0x39, 0x97, 0x8c, 0x7a, 0x5e, 0xcf, 0xb1, + 0x25, 0x15, 0xd7, 0x30, 0x8e, 0xa6, 0xb2, 0x4c, 0xcb, 0xda, 0x76, 0x4d, 0xbb, 0xd5, 0x25, 0x72, + 0xa0, 0x53, 0x51, 0xac, 0xed, 0x5b, 0x56, 0xd3, 0x3c, 0xf6, 0xc4, 0xc4, 0x2e, 0x41, 0x7c, 0x04, + 0x8b, 0x71, 0x1d, 0x65, 0x09, 0x50, 0x65, 0x64, 0x09, 0xd0, 0xdf, 0xec, 0x7c, 0x93, 0x8f, 0x23, + 0xa2, 0x7e, 0x24, 0xcc, 0x2e, 0x5b, 0x42, 0x2d, 0x51, 0x09, 0x01, 0x8c, 0xbf, 0x82, 0xe5, 0x64, + 0x57, 0x50, 0x9f, 0xee, 0xc3, 0x7c, 0xfc, 0x85, 0x25, 0xe9, 0xf2, 0x94, 0xa4, 0xa4, 0x31, 0xce, + 0x89, 0x11, 0x54, 0x9e, 0xf6, 0x3c, 0x7a, 0xeb, 0x70, 0x94, 0x4f, 0x03, 0x05, 0x0a, 0xa7, 0x96, + 0xb6, 0x0e, 0x79, 0x51, 0x18, 0xa2, 0x47, 0x4b, 0x90, 0xc6, 0x40, 0xfc, 0x34, 0xa2, 0xc6, 0xc5, + 0xd1, 0xf8, 0x0d, 0x94, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x29, 0x59, 0x84, 0x36, 0x06, 0xa7, + 0x40, 0x9f, 0xc2, 0xe5, 0x63, 0x36, 0x77, 0xef, 0xc6, 0x36, 0xe3, 0x5e, 0x4e, 0x5e, 0xc4, 0x07, + 0x50, 0xde, 0x6a, 0xb7, 0xa9, 0x2c, 0x99, 0x54, 0x49, 0xc6, 0x25, 0x98, 0x90, 0x49, 0x36, 0xc1, + 0x80, 0x99, 0x40, 0x1e, 0x9f, 0xd9, 0x90, 0x4d, 0x4e, 0xe3, 0x2a, 0x71, 0xd9, 0x09, 0x2b, 0x74, + 0xf7, 0x9e, 0xec, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0x54, + 0x35, 0x17, 0x21, 0xd7, 0xb3, 0xdb, 0xe4, 0xad, 0xfc, 0x9e, 0xc0, 0x00, 0xfc, 0x6d, 0x98, 0x53, + 0x49, 0xa9, 0x06, 0xb7, 0xa0, 0xac, 0xee, 0x13, 0xa4, 0x63, 0x0c, 0x8b, 0x3f, 0x84, 0x05, 0x83, + 0x74, 0x5c, 0xe2, 0x75, 0xd5, 0xb8, 0xa7, 0xec, 0xf3, 0xff, 0x70, 0xf9, 0x90, 0xf8, 0x0a, 0xfb, + 0x64, 0xf2, 0x87, 0xec, 0xb2, 0x59, 0x4f, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, 0x8b, 0xe5, 0xfe, + 0xf7, 0xd9, 0xed, 0x8e, 0x6e, 0x93, 0xc2, 0x9c, 0xb8, 0x6b, 0x44, 0x64, 0x26, 0x26, 0xf2, 0x1e, + 0x5c, 0x4d, 0x13, 0x49, 0x9d, 0x26, 0xc3, 0xa0, 0x29, 0x61, 0xc8, 0x43, 0xae, 0xd6, 0x1f, 0xf8, + 0x67, 0x9b, 0x7f, 0x98, 0x85, 0xbc, 0x78, 0x6c, 0x42, 0x3b, 0x50, 0x6a, 0xba, 0x66, 0xeb, 0x84, + 0x7f, 0xa9, 0x42, 0xfa, 0xd8, 0xc7, 0x2b, 0xa1, 0x62, 0x75, 0x29, 0x61, 0x85, 0x5e, 0x4c, 0xa7, + 0x3e, 0xd6, 0xd0, 0x2b, 0xa8, 0xc4, 0x3f, 0xc0, 0x20, 0x1c, 0xbd, 0x05, 0x26, 0x7d, 0x5f, 0xaa, + 0xae, 0x4d, 0xa4, 0x61, 0xd2, 0xd1, 0x36, 0x14, 0xe4, 0x07, 0x0a, 0xa4, 0x3e, 0x28, 0xc6, 0x3e, + 0x70, 0x54, 0xf5, 0xc4, 0x35, 0x2e, 0xe3, 0x25, 0x1b, 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0x46, 0xea, + 0x25, 0x35, 0xb0, 0x78, 0x75, 0x12, 0x09, 0x17, 0xdc, 0x84, 0x72, 0xf4, 0x31, 0x16, 0xad, 0x9d, + 0xf7, 0x12, 0x5c, 0x5d, 0x99, 0x40, 0x11, 0x48, 0x8d, 0xee, 0x87, 0xd6, 0x52, 0x55, 0x49, 0x92, + 0x9a, 0xf0, 0x40, 0x8b, 0xa7, 0xd0, 0x8f, 0x01, 0x8d, 0xbf, 0x30, 0xa2, 0x9b, 0x17, 0x79, 0x0d, + 0xad, 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x82, 0xf9, 0xb1, 0xb7, 0x31, 0xa4, 0x4e, 0xb2, 0x69, + 0x6f, 0x8e, 0xd5, 0x1b, 0x93, 0x89, 0x02, 0x03, 0xc6, 0x5f, 0x96, 0x22, 0x06, 0xa4, 0xbe, 0x85, + 0x45, 0x0c, 0x48, 0x79, 0x9e, 0xe2, 0xb9, 0x26, 0x6f, 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, + 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, + 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x83, 0x35, 0x5a, 0x49, 0x7d, 0x1a, 0xe3, 0xa2, + 0x26, 0x3e, 0x9d, 0x05, 0x46, 0xb1, 0x01, 0x26, 0x6e, 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, + 0x1e, 0x3c, 0x85, 0x3a, 0xec, 0xd3, 0xdf, 0x58, 0xf3, 0x46, 0xb7, 0xa2, 0x3c, 0x69, 0x83, 0x4e, + 0xf5, 0xe6, 0xb9, 0x74, 0x7c, 0x9f, 0x1a, 0x14, 0x83, 0x06, 0x8a, 0xae, 0x2a, 0x4c, 0xf1, 0x76, + 0x5e, 0x5d, 0x4e, 0x5e, 0x0c, 0x62, 0x20, 0x9a, 0x58, 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, + 0xda, 0xf3, 0xf0, 0x14, 0x7a, 0x02, 0x10, 0xb6, 0x21, 0x74, 0x2d, 0xd2, 0xb5, 0x63, 0x8d, 0xac, + 0x5a, 0x4d, 0x59, 0x95, 0xde, 0x9f, 0x51, 0xbb, 0x52, 0x24, 0x9a, 0x09, 0xed, 0xaa, 0x5a, 0x51, + 0xdf, 0x8a, 0xe9, 0x69, 0x8d, 0xa7, 0xd0, 0x63, 0x28, 0x47, 0x9b, 0x55, 0xe4, 0x3c, 0x48, 0xec, + 0x63, 0x89, 0x72, 0x5e, 0x81, 0x9e, 0xd6, 0xc5, 0xd0, 0x9d, 0xa8, 0xc4, 0x49, 0xad, 0x2e, 0x51, + 0xb6, 0x05, 0x4b, 0xc9, 0xfd, 0x08, 0xad, 0x47, 0x25, 0xa7, 0x77, 0xc1, 0xea, 0xad, 0x0b, 0x50, + 0x32, 0xaf, 0x6e, 0xdf, 0xff, 0xe3, 0xbb, 0x15, 0xed, 0x6f, 0xef, 0x56, 0xb4, 0xbf, 0xbf, 0x5b, + 0xd1, 0x7e, 0xf5, 0x8f, 0x95, 0x29, 0xc0, 0xad, 0xee, 0x46, 0x8b, 0xb8, 0xf6, 0x86, 0x69, 0xf5, + 0x5a, 0x64, 0xc3, 0xd9, 0xdc, 0x90, 0x92, 0xdc, 0x41, 0xcb, 0x23, 0xee, 0x88, 0xb8, 0xaf, 0x32, + 0x83, 0xa3, 0xa3, 0x4b, 0xec, 0xcf, 0x25, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x92, + 0xbf, 0xa3, 0x76, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5582,6 +5591,16 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Force { + i-- + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } if m.AllowInRunningState { i-- if m.AllowInRunningState { @@ -7818,6 +7837,9 @@ func (m *DestroyEnvironmentRequest) Size() (n int) { if m.AllowInRunningState { n += 2 } + if m.Force { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -11645,6 +11667,26 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } } m.AllowInRunningState = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Force = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 4289a53b0..88d06ff87 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1367,6 +1367,7 @@ type DestroyEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1426,6 +1427,13 @@ func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { return false } +func (m *DestroyEnvironmentRequest) GetForce() bool { + if m != nil { + return m.Force + } + return false +} + type DestroyEnvironmentReply struct { CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -3553,171 +3561,172 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2620 bytes of a gzipped FileDescriptorProto + // 2630 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, - 0xd8, 0x69, 0x84, 0x78, 0xe3, 0x0d, 0x21, 0x84, 0x78, 0xe1, 0x15, 0x21, 0xbe, 0x03, 0x0f, 0x48, - 0xbc, 0x22, 0x04, 0x82, 0x8f, 0x80, 0x8a, 0xc4, 0x33, 0x1f, 0x01, 0xdd, 0x7f, 0x33, 0x77, 0xc6, - 0x33, 0x4e, 0x0a, 0xda, 0x17, 0xde, 0x7c, 0xce, 0x3d, 0xe7, 0xdc, 0x7b, 0xfe, 0xdd, 0x73, 0xee, - 0x19, 0xc3, 0xd2, 0xc0, 0x75, 0x7c, 0xc7, 0xbb, 0xeb, 0x6c, 0xb6, 0x1c, 0xdb, 0x77, 0x1d, 0x6b, - 0x83, 0x21, 0x50, 0x31, 0x40, 0xe0, 0x25, 0x58, 0xac, 0x8d, 0x88, 0xed, 0xbf, 0xde, 0x27, 0x9e, - 0xe3, 0x3d, 0x21, 0xa6, 0xeb, 0x1f, 0x11, 0xd3, 0xc7, 0x73, 0x30, 0x7b, 0xe8, 0x9b, 0xfe, 0xd0, - 0x33, 0xc8, 0x9b, 0x21, 0xf1, 0x7c, 0x7c, 0x04, 0x25, 0x89, 0x18, 0x58, 0x67, 0x68, 0x11, 0x72, - 0x9e, 0x6f, 0xfa, 0x44, 0xd7, 0xd6, 0xb4, 0xf5, 0xa2, 0xc1, 0x01, 0xf4, 0x10, 0x66, 0x3d, 0x46, - 0xf4, 0x7c, 0xd0, 0x36, 0x7d, 0xe2, 0xe9, 0x99, 0xb5, 0xe9, 0xf5, 0xd2, 0xe6, 0x95, 0x8d, 0xf0, - 0x04, 0x87, 0xca, 0xba, 0x11, 0xa5, 0xc6, 0x7f, 0xd1, 0x60, 0x46, 0x5d, 0x47, 0x9f, 0x40, 0xce, - 0x22, 0x23, 0x62, 0xb1, 0x5d, 0xca, 0x9b, 0xd7, 0x53, 0xe4, 0x6c, 0x3c, 0xa5, 0x44, 0x06, 0xa7, - 0x45, 0x7b, 0x50, 0xee, 0x47, 0x94, 0xd1, 0x33, 0x6b, 0xda, 0x7a, 0x69, 0x73, 0x55, 0xe1, 0x4e, - 0xd2, 0xf9, 0xc9, 0x94, 0x11, 0x63, 0xc4, 0x9f, 0x42, 0x8e, 0x89, 0x46, 0x45, 0xc8, 0xed, 0xd6, - 0xb6, 0x9f, 0xd7, 0x2b, 0x53, 0xa8, 0x00, 0xd9, 0xbd, 0x83, 0xc7, 0x8d, 0x8a, 0x86, 0x4a, 0x90, - 0x7f, 0xb9, 0x65, 0x1c, 0xec, 0x1d, 0xd4, 0x2b, 0x19, 0x4a, 0x51, 0x33, 0x8c, 0x86, 0x51, 0x99, - 0xde, 0xce, 0x43, 0x8e, 0xc9, 0xc7, 0xcb, 0x70, 0xa5, 0x4e, 0xfc, 0xc7, 0xae, 0xd9, 0x27, 0xa7, - 0x8e, 0x7b, 0xb2, 0x67, 0x77, 0x1c, 0x69, 0xce, 0xdf, 0x68, 0x90, 0x7f, 0x41, 0x5c, 0xaf, 0xe7, - 0xd8, 0xd4, 0x96, 0x7d, 0xf3, 0x2b, 0xc7, 0x65, 0x5a, 0xe6, 0x0c, 0x0e, 0x30, 0x6c, 0xcf, 0x76, - 0x5c, 0x76, 0x7a, 0x8a, 0xa5, 0x00, 0xc5, 0x0e, 0x4c, 0xbf, 0xd5, 0xd5, 0xa7, 0x39, 0x96, 0x01, - 0x14, 0x7b, 0x34, 0xec, 0x59, 0x6d, 0x3d, 0xcb, 0xbd, 0xc1, 0x00, 0xb4, 0x06, 0xa5, 0x81, 0xeb, - 0xb4, 0x87, 0x2d, 0xff, 0xc0, 0xec, 0x13, 0x3d, 0xc7, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0xf1, - 0x43, 0x1c, 0xfa, 0xae, 0x7e, 0x89, 0x11, 0x28, 0x18, 0xfc, 0xf3, 0x0c, 0x5c, 0x1e, 0xd7, 0x80, - 0xfa, 0x7f, 0x0d, 0x4a, 0x9d, 0x00, 0xdb, 0x16, 0x51, 0xa0, 0xa2, 0xd0, 0x47, 0x30, 0x4f, 0xec, - 0x51, 0xcf, 0x75, 0xec, 0x3e, 0xb1, 0x7d, 0x6f, 0xc7, 0x19, 0xda, 0xbe, 0xd0, 0x65, 0x7c, 0x81, - 0x9e, 0xc4, 0x37, 0xbd, 0x13, 0x41, 0xc6, 0x95, 0x53, 0x30, 0x61, 0xbc, 0x65, 0xd5, 0x78, 0x5b, - 0x01, 0xe8, 0x3a, 0x9e, 0x14, 0x9e, 0xe3, 0x5c, 0x21, 0x06, 0x61, 0x98, 0xe9, 0xd9, 0x9e, 0x6f, - 0xda, 0x2d, 0xc2, 0x4c, 0xc0, 0x35, 0x8c, 0xe0, 0xd0, 0x47, 0x90, 0x17, 0x1a, 0xeb, 0x79, 0x16, - 0x27, 0x48, 0x89, 0x13, 0xe1, 0x22, 0x43, 0x92, 0xe0, 0xdb, 0x30, 0xd7, 0x24, 0xa6, 0xdb, 0x76, - 0x4e, 0x6d, 0xe1, 0x4a, 0xb4, 0x04, 0x97, 0x5c, 0x62, 0x7a, 0x8e, 0x2d, 0xac, 0x20, 0x20, 0x9a, - 0x42, 0x21, 0xe9, 0xc0, 0x3a, 0xc3, 0x3a, 0x2c, 0xd5, 0x89, 0x5f, 0x53, 0x74, 0x97, 0xd1, 0xf0, - 0x16, 0x16, 0xc7, 0x56, 0x2e, 0x66, 0xe5, 0x2f, 0x61, 0x46, 0x35, 0xa6, 0x48, 0xb8, 0xaa, 0x1a, - 0xea, 0xe1, 0x32, 0x73, 0x5f, 0x84, 0x1e, 0xff, 0x29, 0x0b, 0x73, 0x31, 0x0a, 0x54, 0x86, 0x4c, - 0x4f, 0x6e, 0x96, 0xe9, 0xb1, 0x38, 0x6a, 0xb9, 0xc4, 0xf4, 0x49, 0xfb, 0x65, 0x97, 0xd8, 0xcc, - 0x87, 0x45, 0x43, 0x45, 0x85, 0xde, 0x99, 0x56, 0xbd, 0xb3, 0x01, 0x39, 0xe6, 0x41, 0x3d, 0xcb, - 0x0e, 0xa5, 0xab, 0xd9, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa2, 0x38, 0x19, 0xaa, 0x42, - 0xc1, 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x19, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, - 0x62, 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0x8f, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, - 0xa1, 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xdb, 0x63, 0x63, - 0x57, 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, - 0x02, 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, - 0x97, 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, - 0x23, 0x47, 0x43, 0x15, 0x98, 0x3e, 0x21, 0x67, 0xc2, 0x2f, 0xf4, 0x27, 0x35, 0xfb, 0xc8, 0xb4, - 0x86, 0x44, 0xb8, 0x84, 0x03, 0x0f, 0x32, 0xf7, 0xb5, 0xea, 0x67, 0x50, 0x0c, 0x64, 0xbe, 0x17, - 0xe3, 0xe7, 0x30, 0x1b, 0x39, 0xd0, 0xfb, 0x30, 0xe3, 0xdf, 0x6b, 0x70, 0xf9, 0x80, 0x9c, 0x2a, - 0x1a, 0xca, 0x1c, 0xb9, 0x03, 0x15, 0x1a, 0xb0, 0x1d, 0xcb, 0x39, 0x6d, 0x92, 0xfe, 0xc0, 0x0a, - 0x2b, 0xc7, 0x18, 0x1e, 0x7d, 0x29, 0x0c, 0xcf, 0x43, 0xf9, 0x8e, 0x62, 0xba, 0x44, 0xd9, 0x71, - 0xf3, 0xff, 0xc7, 0xba, 0xe3, 0x43, 0x58, 0x88, 0xef, 0x40, 0x93, 0xf0, 0x0b, 0x28, 0x29, 0x29, - 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, 0x1c, 0x7f, 0xc0, 0x6e, 0xd0, 0x04, 0x93, 0xc4, 0xb2, 0x0c, - 0xff, 0x44, 0x83, 0x85, 0x38, 0xe5, 0x7f, 0xbd, 0x3d, 0xba, 0x0b, 0x05, 0x69, 0x60, 0x51, 0x06, - 0x17, 0x14, 0x56, 0x9a, 0x5a, 0x8c, 0x27, 0x20, 0xc2, 0x7f, 0xd5, 0x60, 0x79, 0x87, 0x2f, 0x9f, - 0x7f, 0x68, 0xf4, 0x08, 0xb2, 0xfe, 0xd9, 0x80, 0xdb, 0xb2, 0xbc, 0xf9, 0xa1, 0x22, 0x3a, 0x55, - 0xc6, 0x46, 0x63, 0x40, 0x59, 0x0c, 0xc6, 0x88, 0x4d, 0xb8, 0xc4, 0x61, 0x5a, 0x57, 0x0f, 0x1a, - 0x8d, 0x67, 0x95, 0x29, 0x84, 0xa0, 0x7c, 0xd8, 0xdc, 0x32, 0x9a, 0xaf, 0xb7, 0x76, 0x9a, 0x7b, - 0x2f, 0xf6, 0x9a, 0xdf, 0xaf, 0x68, 0x68, 0x1e, 0x66, 0x0f, 0x9b, 0x8d, 0x67, 0x21, 0x2a, 0x83, - 0x66, 0xa1, 0xb8, 0xd3, 0x38, 0x78, 0xbc, 0x57, 0x7f, 0x6e, 0xd4, 0x2a, 0xd3, 0xb4, 0x00, 0x1b, - 0xb5, 0xc3, 0x5a, 0xb3, 0x92, 0x45, 0x33, 0x50, 0xa8, 0x37, 0x5e, 0xf3, 0x72, 0x9c, 0xc3, 0x27, - 0x70, 0x25, 0xe9, 0x30, 0xd4, 0xb6, 0x71, 0x75, 0x82, 0x7b, 0x2c, 0xa3, 0xde, 0x63, 0x49, 0x77, - 0xcf, 0x74, 0xf2, 0xdd, 0x83, 0x7f, 0xa9, 0x81, 0xbe, 0xef, 0xb4, 0x7b, 0x9d, 0xb3, 0x0b, 0x59, - 0x0f, 0x9c, 0x01, 0x71, 0x4d, 0xbf, 0xe7, 0xd8, 0x32, 0xde, 0x57, 0x93, 0x3d, 0xdb, 0x90, 0x74, - 0x86, 0xc2, 0x82, 0x6e, 0x41, 0xd9, 0x25, 0x2d, 0xc7, 0xee, 0xf4, 0x8e, 0x87, 0x2e, 0xd9, 0xb2, - 0x2c, 0x76, 0xae, 0x82, 0x11, 0xc3, 0xe2, 0x5f, 0x6b, 0xb0, 0x98, 0x24, 0x0c, 0x3d, 0x10, 0xfe, - 0xe3, 0xfd, 0xd5, 0xad, 0x73, 0xf6, 0x8e, 0xb8, 0x8e, 0x5f, 0xd7, 0x16, 0x2f, 0xac, 0x19, 0x79, - 0x5d, 0x73, 0x18, 0xdf, 0x4b, 0x70, 0xeb, 0x1c, 0x94, 0x8c, 0xda, 0x7e, 0xe3, 0x45, 0xed, 0xb5, - 0xd1, 0x78, 0x4a, 0x3d, 0x36, 0x03, 0x85, 0xad, 0xdd, 0x5d, 0x0e, 0x65, 0xf1, 0x4f, 0x35, 0x58, - 0x4a, 0xb0, 0x1c, 0x75, 0xd3, 0x77, 0xa0, 0xd2, 0x31, 0x7b, 0x16, 0x69, 0x37, 0x42, 0x6b, 0x69, - 0x17, 0xb3, 0xd6, 0x18, 0xa3, 0x70, 0x42, 0x66, 0xdc, 0xe7, 0x6a, 0xed, 0xc2, 0x3f, 0x82, 0xe5, - 0x5d, 0xe2, 0xf9, 0xae, 0x73, 0x11, 0x3f, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0x2b, 0x76, - 0x19, 0xe6, 0x81, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, - 0x76, 0xcf, 0x3e, 0x3e, 0x0c, 0xb6, 0x2b, 0x18, 0x49, 0x4b, 0x98, 0xc0, 0x95, 0xa4, 0xcd, 0xa9, - 0x29, 0xbe, 0x0d, 0xf3, 0x2d, 0x8b, 0x98, 0xf6, 0x90, 0x0b, 0x67, 0x48, 0x71, 0x27, 0x5c, 0x53, - 0xb3, 0x2f, 0x4e, 0x63, 0x8c, 0xb3, 0xe1, 0x3f, 0x6b, 0xb0, 0x7a, 0x18, 0xb9, 0x71, 0x9e, 0xb9, - 0x34, 0xb8, 0xfc, 0x1e, 0xf1, 0xd2, 0x54, 0x7d, 0x05, 0x30, 0x08, 0x88, 0x44, 0xc8, 0x3e, 0x50, - 0x0b, 0xfb, 0x64, 0x79, 0x1b, 0x21, 0x86, 0x5f, 0xd9, 0x8a, 0xb4, 0xea, 0x43, 0x98, 0x8b, 0x2d, - 0xbf, 0xd7, 0xf5, 0xbd, 0x0a, 0xd7, 0xd3, 0x77, 0xa7, 0xfa, 0x7a, 0xb0, 0x5a, 0x7f, 0x4f, 0x75, - 0x75, 0xc8, 0xbf, 0x19, 0x12, 0x57, 0xea, 0x5a, 0x34, 0x24, 0x48, 0x53, 0x8f, 0xbc, 0x6d, 0x59, - 0xc3, 0x36, 0xa9, 0x5b, 0xce, 0x91, 0x69, 0x79, 0x32, 0xf5, 0xa2, 0x58, 0xfc, 0x3b, 0x0d, 0xae, - 0xd7, 0x27, 0x1d, 0x0b, 0x7d, 0x2f, 0x62, 0x52, 0x1e, 0xd7, 0xf7, 0x15, 0x93, 0x4e, 0xe4, 0xfe, - 0x3a, 0x0d, 0xfa, 0x4f, 0x0d, 0x66, 0x23, 0x8d, 0x1a, 0x42, 0x90, 0xb5, 0x69, 0xba, 0x73, 0x76, - 0xf6, 0x9b, 0xb6, 0xbf, 0x96, 0xd3, 0x3a, 0x21, 0x6d, 0x11, 0xf9, 0x02, 0xa2, 0x78, 0xda, 0xd6, - 0xed, 0xb5, 0x45, 0x62, 0x09, 0x88, 0xe2, 0xf9, 0xab, 0x4f, 0xb4, 0xf2, 0x02, 0x0a, 0xf3, 0x30, - 0xa7, 0xde, 0xbd, 0xd7, 0xa0, 0xd8, 0xb2, 0x4c, 0xcf, 0x53, 0xda, 0xf7, 0x10, 0x81, 0x6a, 0x50, - 0x6e, 0x93, 0x81, 0xe5, 0x9c, 0xc9, 0xe2, 0x27, 0x5a, 0x78, 0xf5, 0xa1, 0x48, 0x0f, 0xbf, 0x1b, - 0x21, 0x32, 0x62, 0x4c, 0xb4, 0xf4, 0xa2, 0x71, 0x32, 0x7a, 0xc1, 0xd1, 0xb7, 0x84, 0xa2, 0x71, - 0x00, 0xd3, 0xc0, 0x30, 0x8f, 0x29, 0xa1, 0xbc, 0x4a, 0x24, 0x48, 0x57, 0x9c, 0x4e, 0x87, 0xb8, - 0x81, 0xe2, 0x12, 0xa4, 0xaf, 0x15, 0xf2, 0x96, 0xb4, 0x86, 0xbe, 0x43, 0x17, 0xb9, 0xf6, 0x0a, - 0x06, 0xcf, 0xc3, 0x5c, 0x9d, 0xf8, 0x22, 0x41, 0xf9, 0xc3, 0xe0, 0x11, 0xcc, 0x86, 0x28, 0x1a, - 0x2c, 0x41, 0x4f, 0xad, 0x5d, 0xa8, 0xa7, 0xc6, 0xeb, 0x50, 0x16, 0x02, 0x94, 0xe7, 0x8a, 0xf0, - 0x8b, 0xa6, 0xfa, 0x05, 0x7f, 0x06, 0x33, 0x01, 0x25, 0xdd, 0xe9, 0x03, 0xc8, 0xd2, 0x15, 0x71, - 0xb9, 0x2c, 0xc4, 0x2c, 0xca, 0xf6, 0x60, 0x04, 0xb8, 0x06, 0xb3, 0x14, 0xb3, 0x43, 0xbd, 0x92, - 0x1a, 0x25, 0xf4, 0x0d, 0xc1, 0xd9, 0xf7, 0x9d, 0x36, 0x09, 0xde, 0x10, 0x21, 0x0a, 0xff, 0x18, - 0x4a, 0x3b, 0x4e, 0xbf, 0x6f, 0xda, 0x6d, 0x26, 0xa4, 0x02, 0xd3, 0xc4, 0x1e, 0x31, 0x35, 0x8b, - 0x06, 0xfd, 0xc9, 0x02, 0xa4, 0x4b, 0x2c, 0x4b, 0xc4, 0x19, 0x07, 0xc2, 0xf0, 0x9d, 0x56, 0xc2, - 0x97, 0x86, 0x8d, 0xe9, 0x1e, 0x0f, 0xf9, 0x9b, 0x28, 0xcb, 0x64, 0x84, 0x08, 0x7a, 0x40, 0xda, - 0x66, 0x8b, 0x48, 0x63, 0xbf, 0xf1, 0x3e, 0x94, 0x76, 0xba, 0xa6, 0x6d, 0x13, 0x2b, 0x55, 0x07, - 0xa4, 0x34, 0x3b, 0x45, 0x51, 0x04, 0x99, 0x35, 0xdd, 0x63, 0xe2, 0x87, 0x51, 0x4e, 0x21, 0xfc, - 0xaf, 0x69, 0x28, 0x04, 0x69, 0xf3, 0x0d, 0x28, 0x7a, 0xd4, 0x39, 0x2c, 0x42, 0xb9, 0x3d, 0xd3, - 0x1d, 0x17, 0x92, 0x52, 0xbe, 0x96, 0xb4, 0xaa, 0xe8, 0xde, 0xf4, 0x98, 0x1f, 0x02, 0xab, 0x1b, - 0x21, 0x29, 0xfa, 0x16, 0xcc, 0xf5, 0xec, 0x23, 0x67, 0x68, 0xb7, 0x85, 0x4a, 0xf4, 0x72, 0xa2, - 0xe1, 0xb2, 0xa4, 0x96, 0x88, 0x50, 0x5b, 0x23, 0x4e, 0x8e, 0xb6, 0xa1, 0xe2, 0x0c, 0xfd, 0xa8, - 0x88, 0xec, 0x44, 0x11, 0x63, 0xf4, 0xe8, 0x3e, 0x75, 0x79, 0xe0, 0x50, 0x66, 0xec, 0x18, 0x7b, - 0xb8, 0x6a, 0xa8, 0xa4, 0x34, 0xf1, 0x68, 0x64, 0x3d, 0x33, 0xfd, 0xae, 0xc8, 0xf9, 0x00, 0xa6, - 0xfe, 0x26, 0xf6, 0x68, 0xaf, 0xcd, 0x32, 0xbd, 0x68, 0x70, 0x00, 0xed, 0x44, 0xee, 0x50, 0xfe, - 0xe8, 0xfa, 0xbf, 0x84, 0x90, 0xfd, 0x3a, 0xaf, 0xcb, 0xbb, 0xb0, 0x10, 0x2d, 0xbb, 0x3c, 0xdf, - 0x74, 0xc8, 0xf3, 0x0c, 0xf3, 0x44, 0x30, 0x4b, 0x10, 0xff, 0x4c, 0x83, 0xf9, 0xb1, 0x42, 0x8d, - 0x1e, 0x40, 0xe9, 0xa4, 0x67, 0x59, 0xa4, 0xdd, 0xbc, 0x50, 0x9e, 0xab, 0xc4, 0xe8, 0x0b, 0x98, - 0x71, 0x79, 0x23, 0x21, 0x7b, 0x91, 0xc9, 0xcc, 0x11, 0x6a, 0xbc, 0xc3, 0xee, 0x1f, 0xfa, 0x26, - 0x08, 0x0e, 0x1f, 0x58, 0x5b, 0x53, 0xad, 0x5d, 0x85, 0xc2, 0xc0, 0xf4, 0xbb, 0x87, 0x03, 0xd2, - 0x92, 0x9d, 0x9f, 0x84, 0xf1, 0x2f, 0xb2, 0x50, 0x90, 0xcf, 0x8a, 0xb4, 0x7a, 0x21, 0xee, 0xff, - 0x4c, 0xf2, 0xfd, 0x1f, 0x99, 0x21, 0x54, 0xa1, 0xd0, 0x19, 0x5a, 0x16, 0x0b, 0x05, 0x7e, 0x63, - 0x06, 0xb0, 0x6a, 0xd9, 0x5c, 0xc4, 0xb2, 0xe8, 0x36, 0xe4, 0x68, 0x2b, 0xea, 0xe9, 0x97, 0x98, - 0x01, 0x12, 0x9f, 0x3c, 0x9c, 0x02, 0x3d, 0x1c, 0x1b, 0x16, 0xdc, 0x48, 0xa0, 0x4e, 0x9d, 0x12, - 0xdc, 0x8b, 0x4c, 0x09, 0xae, 0x27, 0xb1, 0xc6, 0xc7, 0x03, 0x0f, 0xc7, 0xc6, 0x03, 0x89, 0x3b, - 0xfe, 0x0f, 0xcd, 0x05, 0x1e, 0xb0, 0x2a, 0x26, 0x02, 0x8b, 0xc6, 0x78, 0xe0, 0x1f, 0xed, 0x3c, - 0xff, 0xe0, 0xdf, 0x6a, 0x70, 0xb5, 0x4e, 0xfc, 0x97, 0xb1, 0x29, 0x41, 0x10, 0xa1, 0x6b, 0x50, - 0x72, 0xc9, 0xc0, 0x79, 0x66, 0xfa, 0x3e, 0x71, 0xe5, 0x08, 0x4e, 0x45, 0xa1, 0x75, 0x98, 0x73, - 0xc9, 0xa8, 0xe7, 0xf5, 0x1c, 0x5b, 0x52, 0xf1, 0x13, 0xc6, 0xd1, 0x54, 0x96, 0x69, 0x59, 0xdb, - 0xae, 0x69, 0xb7, 0xba, 0x44, 0x36, 0x74, 0x2a, 0x8a, 0x95, 0x7d, 0xcb, 0x6a, 0x9a, 0xc7, 0xbc, - 0x7b, 0x29, 0x18, 0x12, 0xc4, 0x47, 0xb0, 0x18, 0x3f, 0xa3, 0x4c, 0x01, 0x7a, 0x18, 0x99, 0x02, - 0xf4, 0x37, 0xbb, 0xdf, 0xe4, 0x14, 0x44, 0xe4, 0x8f, 0x84, 0xd9, 0xab, 0x4a, 0x1c, 0x4b, 0x64, - 0x42, 0x00, 0xe3, 0xaf, 0x60, 0x39, 0xd9, 0x14, 0xd4, 0xa6, 0xfb, 0x30, 0x1f, 0x1f, 0xa5, 0x24, - 0xbd, 0x92, 0x92, 0x0e, 0x69, 0x8c, 0x73, 0x62, 0x04, 0x95, 0xa7, 0x3d, 0x8f, 0xbe, 0x3a, 0x1c, - 0xe5, 0x1b, 0x40, 0x81, 0xc2, 0xa9, 0xa9, 0xad, 0x43, 0x5e, 0x24, 0x86, 0xa8, 0xd1, 0x12, 0xa4, - 0x3e, 0x10, 0x3f, 0x8d, 0xa8, 0x72, 0x71, 0x34, 0x7e, 0x03, 0x65, 0x65, 0x5f, 0x19, 0x2c, 0x14, - 0x4a, 0x0a, 0x16, 0x71, 0x1a, 0x83, 0x53, 0xa0, 0x4f, 0xe1, 0xf2, 0x31, 0xeb, 0xbb, 0x77, 0x63, - 0x9b, 0x71, 0x2b, 0x27, 0x2f, 0xe2, 0x03, 0x28, 0x6f, 0xb5, 0xdb, 0x54, 0x96, 0x0c, 0xaa, 0x24, - 0xe5, 0x12, 0x54, 0xc8, 0x24, 0xab, 0x60, 0xc0, 0x4c, 0x20, 0x8f, 0xf7, 0x6c, 0xc8, 0x26, 0xa7, - 0xf1, 0x23, 0x71, 0xd9, 0x09, 0x2b, 0x74, 0xf7, 0x9e, 0xac, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, - 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0xd4, 0x63, 0x2e, 0x42, 0xae, 0x67, 0xb7, 0xc9, 0x5b, 0xf9, - 0xe1, 0x80, 0x01, 0xf8, 0x9b, 0x30, 0xa7, 0x92, 0xd2, 0x13, 0xdc, 0x82, 0xb2, 0xba, 0x4f, 0x10, - 0x8e, 0x31, 0x2c, 0xfe, 0x10, 0x16, 0x0c, 0xd2, 0x71, 0x89, 0xd7, 0x55, 0xfd, 0x9e, 0xb2, 0xcf, - 0xff, 0xc3, 0xe5, 0x43, 0xe2, 0x2b, 0xec, 0x93, 0xc9, 0x1f, 0xb2, 0xc7, 0x66, 0x3d, 0xc9, 0x03, - 0x92, 0x51, 0x8d, 0x7d, 0x2d, 0x16, 0xfb, 0xdf, 0x65, 0xaf, 0x3b, 0xba, 0x4d, 0x0a, 0x73, 0xe2, - 0xae, 0x11, 0x91, 0x99, 0x98, 0xc8, 0x7b, 0x70, 0x35, 0x4d, 0x24, 0x35, 0x9a, 0x74, 0x83, 0xa6, - 0xb8, 0x21, 0x0f, 0xb9, 0x5a, 0x7f, 0xe0, 0x9f, 0x6d, 0xfe, 0x61, 0x16, 0xf2, 0x62, 0xaa, 0x84, - 0x76, 0xa0, 0xd4, 0x74, 0xcd, 0xd6, 0x09, 0xff, 0x24, 0x85, 0xf4, 0xb1, 0xaf, 0x54, 0xe2, 0x88, - 0xd5, 0xa5, 0x84, 0x15, 0xfa, 0x30, 0x9d, 0xfa, 0x58, 0x43, 0xaf, 0xa0, 0x12, 0xff, 0xd2, 0x82, - 0x70, 0xf4, 0x15, 0x98, 0xf4, 0x21, 0xa9, 0xba, 0x36, 0x91, 0x86, 0x49, 0x47, 0xdb, 0x50, 0x90, - 0x5f, 0x22, 0x90, 0x3a, 0x39, 0x8c, 0x7d, 0xc9, 0xa8, 0xea, 0x89, 0x6b, 0x5c, 0xc6, 0x4b, 0xd6, - 0x1c, 0xa8, 0x9f, 0x28, 0xd0, 0x8d, 0xd4, 0x47, 0x6a, 0xa0, 0xf1, 0xea, 0x24, 0x12, 0x2e, 0xb8, - 0x09, 0xe5, 0xe8, 0xd4, 0x15, 0xad, 0x9d, 0x37, 0xf2, 0xad, 0xae, 0x4c, 0xa0, 0x08, 0xa4, 0x46, - 0xf7, 0x43, 0x6b, 0xa9, 0x47, 0x49, 0x92, 0x9a, 0x30, 0x89, 0xc5, 0x53, 0xe8, 0x87, 0x80, 0xc6, - 0x47, 0x89, 0xe8, 0xe6, 0x45, 0xc6, 0x9e, 0x55, 0x7c, 0x0e, 0x15, 0xdf, 0xe1, 0x07, 0x30, 0x3f, - 0x36, 0x04, 0x43, 0x6a, 0x27, 0x9b, 0x36, 0x5c, 0xac, 0xde, 0x98, 0x4c, 0x14, 0x28, 0x30, 0x3e, - 0x59, 0x8a, 0x28, 0x90, 0x3a, 0xf5, 0x8a, 0x28, 0x90, 0x32, 0x9e, 0xe2, 0xb1, 0x26, 0x5f, 0xac, - 0x91, 0x58, 0x8b, 0xbd, 0x6c, 0x23, 0xb1, 0x16, 0x79, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, - 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x8d, 0x35, - 0x5a, 0x49, 0x1d, 0x8d, 0x71, 0x51, 0x13, 0x47, 0x67, 0x81, 0x52, 0xac, 0x81, 0x89, 0x2b, 0xa5, - 0xb6, 0xcb, 0x71, 0xa5, 0xc2, 0x8e, 0x07, 0x4f, 0xa1, 0x0e, 0xfb, 0xc6, 0x37, 0x56, 0xbc, 0xd1, - 0xad, 0x28, 0x4f, 0x5a, 0xa3, 0x53, 0xbd, 0x79, 0x2e, 0x1d, 0xdf, 0xa7, 0x06, 0xc5, 0xa0, 0x80, - 0xa2, 0xab, 0x0a, 0x53, 0xbc, 0x9c, 0x57, 0x97, 0x93, 0x17, 0x03, 0x1f, 0x88, 0x22, 0x16, 0xf1, - 0x41, 0xb4, 0x50, 0x46, 0x7c, 0xa0, 0xd6, 0x3c, 0x3c, 0x85, 0x9e, 0x00, 0x84, 0x65, 0x08, 0x5d, - 0x8b, 0x54, 0xed, 0x58, 0x21, 0xab, 0x56, 0x53, 0x56, 0xa5, 0xf5, 0x67, 0xd4, 0xaa, 0x14, 0xf1, - 0x66, 0x42, 0xb9, 0xaa, 0x56, 0xd4, 0xa1, 0x30, 0xbd, 0xad, 0xf1, 0x14, 0x7a, 0x0c, 0xe5, 0x68, - 0xb1, 0x8a, 0xdc, 0x07, 0x89, 0x75, 0x2c, 0x51, 0xce, 0x2b, 0xd0, 0xd3, 0xaa, 0x18, 0xba, 0x13, - 0x95, 0x38, 0xa9, 0xd4, 0x25, 0xca, 0xb6, 0x60, 0x29, 0xb9, 0x1e, 0xa1, 0xf5, 0xa8, 0xe4, 0xf4, - 0x2a, 0x58, 0xbd, 0x75, 0x01, 0x4a, 0x66, 0xd5, 0xed, 0xfb, 0x7f, 0x7c, 0xb7, 0xa2, 0xfd, 0xed, - 0xdd, 0x8a, 0xf6, 0xf7, 0x77, 0x2b, 0xda, 0xaf, 0xfe, 0xb1, 0x32, 0x05, 0xb8, 0xd5, 0xdd, 0x68, - 0x11, 0xd7, 0xde, 0x30, 0xad, 0x5e, 0x8b, 0x6c, 0x38, 0x9b, 0x1b, 0x52, 0x92, 0x3b, 0x68, 0x79, - 0xc4, 0x1d, 0x11, 0xf7, 0x55, 0x66, 0x70, 0x74, 0x74, 0x89, 0xfd, 0x8b, 0xe4, 0x93, 0x7f, 0x07, - 0x00, 0x00, 0xff, 0xff, 0x9e, 0xa5, 0x0f, 0x75, 0x5f, 0x22, 0x00, 0x00, + 0xd8, 0x69, 0x1e, 0x78, 0xe3, 0x0d, 0x21, 0xb4, 0xe2, 0x85, 0x57, 0x84, 0xf8, 0x0e, 0x3c, 0x20, + 0xf1, 0x8a, 0x10, 0x08, 0x3e, 0x02, 0x2a, 0x12, 0xcf, 0x7c, 0x04, 0x74, 0xff, 0xcd, 0xdc, 0x19, + 0xcf, 0x38, 0x29, 0x68, 0x5f, 0x78, 0xf3, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xdf, 0x7b, 0xce, 0xbd, + 0x63, 0x58, 0x1a, 0xb8, 0x8e, 0xef, 0x78, 0x77, 0x9d, 0xcd, 0x96, 0x63, 0xfb, 0xae, 0x63, 0x6d, + 0x30, 0x04, 0x2a, 0x06, 0x08, 0xbc, 0x04, 0x8b, 0xb5, 0x11, 0xb1, 0xfd, 0xd7, 0xfb, 0xc4, 0x73, + 0xbc, 0x27, 0xc4, 0x74, 0xfd, 0x23, 0x62, 0xfa, 0x78, 0x0e, 0x66, 0x0f, 0x7d, 0xd3, 0x1f, 0x7a, + 0x06, 0x79, 0x33, 0x24, 0x9e, 0x8f, 0x8f, 0xa0, 0x24, 0x11, 0x03, 0xeb, 0x0c, 0x2d, 0x42, 0xce, + 0xf3, 0x4d, 0x9f, 0xe8, 0xda, 0x9a, 0xb6, 0x5e, 0x34, 0x38, 0x80, 0x1e, 0xc2, 0xac, 0xc7, 0x88, + 0x9e, 0x0f, 0xda, 0xa6, 0x4f, 0x3c, 0x3d, 0xb3, 0x36, 0xbd, 0x5e, 0xda, 0xbc, 0xb2, 0x11, 0x6a, + 0x70, 0xa8, 0xac, 0x1b, 0x51, 0x6a, 0xfc, 0x17, 0x0d, 0x66, 0xd4, 0x75, 0xf4, 0x09, 0xe4, 0x2c, + 0x32, 0x22, 0x16, 0xdb, 0xa5, 0xbc, 0x79, 0x3d, 0x45, 0xce, 0xc6, 0x53, 0x4a, 0x64, 0x70, 0x5a, + 0xb4, 0x07, 0xe5, 0x7e, 0xc4, 0x18, 0x3d, 0xb3, 0xa6, 0xad, 0x97, 0x36, 0x57, 0x15, 0xee, 0x24, + 0x9b, 0x9f, 0x4c, 0x19, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x6e, 0x6d, + 0xfb, 0x79, 0xbd, 0x32, 0x85, 0x0a, 0x90, 0xdd, 0x3b, 0x78, 0xdc, 0xa8, 0x68, 0xa8, 0x04, 0xf9, + 0x97, 0x5b, 0xc6, 0xc1, 0xde, 0x41, 0xbd, 0x92, 0xa1, 0x14, 0x35, 0xc3, 0x68, 0x18, 0x95, 0xe9, + 0xed, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0c, 0x57, 0xea, 0xc4, 0x7f, 0xec, 0x9a, 0x7d, 0x72, 0xea, + 0xb8, 0x27, 0x7b, 0x76, 0xc7, 0x91, 0xee, 0xfc, 0x8d, 0x06, 0xf9, 0x17, 0xc4, 0xf5, 0x7a, 0x8e, + 0x4d, 0x7d, 0xd9, 0x37, 0xbf, 0x72, 0x5c, 0x66, 0x65, 0xce, 0xe0, 0x00, 0xc3, 0xf6, 0x6c, 0xc7, + 0x65, 0xda, 0x53, 0x2c, 0x05, 0x28, 0x76, 0x60, 0xfa, 0xad, 0xae, 0x3e, 0xcd, 0xb1, 0x0c, 0xa0, + 0xd8, 0xa3, 0x61, 0xcf, 0x6a, 0xeb, 0x59, 0x1e, 0x0d, 0x06, 0xa0, 0x35, 0x28, 0x0d, 0x5c, 0xa7, + 0x3d, 0x6c, 0xf9, 0x07, 0x66, 0x9f, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x0a, 0xc0, 0x88, 0x2b, + 0x71, 0xe8, 0xbb, 0xfa, 0x25, 0x46, 0xa0, 0x60, 0xf0, 0x2f, 0x32, 0x70, 0x79, 0xdc, 0x02, 0x1a, + 0xff, 0x35, 0x28, 0x75, 0x02, 0x6c, 0x5b, 0x64, 0x81, 0x8a, 0x42, 0x1f, 0xc1, 0x3c, 0xb1, 0x47, + 0x3d, 0xd7, 0xb1, 0xfb, 0xc4, 0xf6, 0xbd, 0x1d, 0x67, 0x68, 0xfb, 0xc2, 0x96, 0xf1, 0x05, 0xaa, + 0x89, 0x6f, 0x7a, 0x27, 0x82, 0x8c, 0x1b, 0xa7, 0x60, 0xc2, 0x7c, 0xcb, 0xaa, 0xf9, 0xb6, 0x02, + 0xd0, 0x75, 0x3c, 0x29, 0x3c, 0xc7, 0xb9, 0x42, 0x0c, 0xc2, 0x30, 0xd3, 0xb3, 0x3d, 0xdf, 0xb4, + 0x5b, 0x84, 0xb9, 0x80, 0x5b, 0x18, 0xc1, 0xa1, 0x8f, 0x20, 0x2f, 0x2c, 0xd6, 0xf3, 0x2c, 0x4f, + 0x90, 0x92, 0x27, 0x22, 0x44, 0x86, 0x24, 0xc1, 0xb7, 0x61, 0xae, 0x49, 0x4c, 0xb7, 0xed, 0x9c, + 0xda, 0x22, 0x94, 0x68, 0x09, 0x2e, 0xb9, 0xc4, 0xf4, 0x1c, 0x5b, 0x78, 0x41, 0x40, 0xb4, 0x84, + 0x42, 0xd2, 0x81, 0x75, 0x86, 0x75, 0x58, 0xaa, 0x13, 0xbf, 0xa6, 0xd8, 0x2e, 0xb3, 0xe1, 0x2d, + 0x2c, 0x8e, 0xad, 0x5c, 0xcc, 0xcb, 0x5f, 0xc2, 0x8c, 0xea, 0x4c, 0x51, 0x70, 0x55, 0x35, 0xd5, + 0xc3, 0x65, 0x16, 0xbe, 0x08, 0x3d, 0xfe, 0x53, 0x16, 0xe6, 0x62, 0x14, 0xa8, 0x0c, 0x99, 0x9e, + 0xdc, 0x2c, 0xd3, 0x63, 0x79, 0xd4, 0x72, 0x89, 0xe9, 0x93, 0xf6, 0xcb, 0x2e, 0xb1, 0x59, 0x0c, + 0x8b, 0x86, 0x8a, 0x0a, 0xa3, 0x33, 0xad, 0x46, 0x67, 0x03, 0x72, 0x2c, 0x82, 0x7a, 0x96, 0x29, + 0xa5, 0xab, 0xd5, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa3, 0x38, 0x19, 0xaa, 0x42, 0xc1, + 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x99, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, 0x62, + 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0xcf, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, 0xa1, + 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xfb, 0x63, 0x63, 0x57, + 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, 0x02, + 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, 0x97, + 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, 0x23, + 0xaa, 0xa1, 0x0a, 0x4c, 0x9f, 0x90, 0x33, 0x11, 0x17, 0xfa, 0x93, 0xba, 0x7d, 0x64, 0x5a, 0x43, + 0x22, 0x42, 0xc2, 0x81, 0x07, 0x99, 0xfb, 0x5a, 0xf5, 0x33, 0x28, 0x06, 0x32, 0xdf, 0x8b, 0xf1, + 0x73, 0x98, 0x8d, 0x28, 0xf4, 0x3e, 0xcc, 0xf8, 0xf7, 0x1a, 0x5c, 0x3e, 0x20, 0xa7, 0x8a, 0x85, + 0xb2, 0x46, 0xee, 0x40, 0x85, 0x26, 0x6c, 0xc7, 0x72, 0x4e, 0x9b, 0xa4, 0x3f, 0xb0, 0xc2, 0xce, + 0x31, 0x86, 0x47, 0x5f, 0x0a, 0xc7, 0xf3, 0x54, 0xbe, 0xa3, 0xb8, 0x2e, 0x51, 0x76, 0xdc, 0xfd, + 0xff, 0xb1, 0xed, 0xf8, 0x10, 0x16, 0xe2, 0x3b, 0xd0, 0x22, 0xfc, 0x02, 0x4a, 0x4a, 0xc9, 0x30, + 0x51, 0x93, 0x2b, 0x4c, 0x25, 0xc7, 0x1f, 0xb0, 0x13, 0x34, 0xc1, 0x25, 0xb1, 0x2a, 0xc3, 0x3f, + 0xd5, 0x60, 0x21, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x42, 0x41, 0x3a, 0x58, 0xb4, 0xc1, 0x05, + 0x85, 0x95, 0x96, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xde, 0xe1, 0xcb, 0xe7, 0x2b, + 0x8d, 0x1e, 0x41, 0xd6, 0x3f, 0x1b, 0x70, 0x5f, 0x96, 0x37, 0x3f, 0x54, 0x44, 0xa7, 0xca, 0xd8, + 0x68, 0x0c, 0x28, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xfb, 0xea, 0x41, 0xa3, 0xf1, + 0xac, 0x32, 0x85, 0x10, 0x94, 0x0f, 0x9b, 0x5b, 0x46, 0xf3, 0xf5, 0xd6, 0x4e, 0x73, 0xef, 0xc5, + 0x5e, 0xf3, 0x87, 0x15, 0x0d, 0xcd, 0xc3, 0xec, 0x61, 0xb3, 0xf1, 0x2c, 0x44, 0x65, 0xd0, 0x2c, + 0x14, 0x77, 0x1a, 0x07, 0x8f, 0xf7, 0xea, 0xcf, 0x8d, 0x5a, 0x65, 0x9a, 0x36, 0x60, 0xa3, 0x76, + 0x58, 0x6b, 0x56, 0xb2, 0x68, 0x06, 0x0a, 0xf5, 0xc6, 0x6b, 0xde, 0x8e, 0x73, 0xf8, 0x04, 0xae, + 0x24, 0x29, 0x43, 0x7d, 0x1b, 0x37, 0x27, 0x38, 0xc7, 0x32, 0xea, 0x39, 0x96, 0x74, 0xf6, 0x4c, + 0x27, 0x9f, 0x3d, 0xf8, 0x97, 0x1a, 0xe8, 0xfb, 0x4e, 0xbb, 0xd7, 0x39, 0xbb, 0x90, 0xf7, 0xc0, + 0x19, 0x10, 0xd7, 0xf4, 0x7b, 0x8e, 0x2d, 0xf3, 0x7d, 0x35, 0x39, 0xb2, 0x0d, 0x49, 0x67, 0x28, + 0x2c, 0xe8, 0x16, 0x94, 0x5d, 0xd2, 0x72, 0xec, 0x4e, 0xef, 0x78, 0xe8, 0x92, 0x2d, 0xcb, 0x62, + 0x7a, 0x15, 0x8c, 0x18, 0x16, 0xff, 0x5a, 0x83, 0xc5, 0x24, 0x61, 0xe8, 0x81, 0x88, 0x1f, 0x9f, + 0xaf, 0x6e, 0x9d, 0xb3, 0x77, 0x24, 0x74, 0xfc, 0xb8, 0xb6, 0x78, 0x63, 0xcd, 0xc8, 0xe3, 0x9a, + 0xc3, 0xf8, 0x5e, 0x42, 0x58, 0xe7, 0xa0, 0x64, 0xd4, 0xf6, 0x1b, 0x2f, 0x6a, 0xaf, 0x8d, 0xc6, + 0x53, 0x1a, 0xb1, 0x19, 0x28, 0x6c, 0xed, 0xee, 0x72, 0x28, 0x8b, 0x7f, 0xa6, 0xc1, 0x52, 0x82, + 0xe7, 0x68, 0x98, 0xbe, 0x07, 0x95, 0x8e, 0xd9, 0xb3, 0x48, 0xbb, 0x11, 0x7a, 0x4b, 0xbb, 0x98, + 0xb7, 0xc6, 0x18, 0x45, 0x10, 0x32, 0xe3, 0x31, 0x57, 0x7b, 0x17, 0xfe, 0x5a, 0x83, 0xe5, 0x5d, + 0xe2, 0xf9, 0xae, 0x73, 0x91, 0x40, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0xeb, 0x76, 0x19, + 0x16, 0x82, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, 0x76, + 0xcf, 0x3e, 0x3e, 0x0c, 0xf6, 0x2b, 0x18, 0x49, 0x4b, 0x54, 0xa7, 0x8e, 0xe3, 0xb6, 0xf8, 0xb4, + 0x53, 0x30, 0x38, 0x80, 0x09, 0x5c, 0x49, 0x52, 0x89, 0x7a, 0xe8, 0xbb, 0x30, 0xdf, 0xb2, 0x88, + 0x69, 0x0f, 0xf9, 0x96, 0x0c, 0x29, 0x8e, 0x8a, 0x6b, 0x6a, 0x51, 0xc6, 0x69, 0x8c, 0x71, 0x36, + 0xfc, 0x67, 0x0d, 0x56, 0x0f, 0x23, 0x07, 0xd1, 0x33, 0x97, 0xe6, 0x9c, 0xdf, 0x23, 0x5e, 0x9a, + 0x03, 0x5e, 0x01, 0x0c, 0x02, 0x22, 0x91, 0xc9, 0x0f, 0xd4, 0x7e, 0x3f, 0x59, 0xde, 0x46, 0x88, + 0xe1, 0x27, 0xb9, 0x22, 0xad, 0xfa, 0x10, 0xe6, 0x62, 0xcb, 0xef, 0x75, 0xaa, 0xaf, 0xc2, 0xf5, + 0xf4, 0xdd, 0xa9, 0xbd, 0x1e, 0xac, 0xd6, 0xdf, 0xd3, 0x5c, 0x1d, 0xf2, 0x6f, 0x86, 0xc4, 0x95, + 0xb6, 0x16, 0x0d, 0x09, 0xd2, 0x8a, 0x24, 0x6f, 0x5b, 0xd6, 0xb0, 0x4d, 0xea, 0x96, 0x73, 0x64, + 0x5a, 0x9e, 0xac, 0xc8, 0x28, 0x16, 0xff, 0x4e, 0x83, 0xeb, 0xf5, 0x49, 0x6a, 0xa1, 0x1f, 0x44, + 0x5c, 0xca, 0xd3, 0xfd, 0xbe, 0xe2, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x43, 0xff, 0xa9, 0xc1, 0x6c, + 0x64, 0x7e, 0x43, 0x08, 0xb2, 0x36, 0x3d, 0x05, 0x38, 0x3b, 0xfb, 0x4d, 0xa7, 0x62, 0xcb, 0x69, + 0x9d, 0x90, 0xb6, 0xa8, 0x07, 0x01, 0x51, 0x3c, 0x9d, 0xf6, 0xf6, 0xda, 0xa2, 0xde, 0x04, 0x44, + 0xf1, 0xfc, 0x32, 0x28, 0x26, 0x7c, 0x01, 0x85, 0xe5, 0x99, 0x53, 0x8f, 0xe4, 0x6b, 0x50, 0x6c, + 0x59, 0xa6, 0xe7, 0x29, 0x53, 0x7d, 0x88, 0x40, 0x35, 0x28, 0xb7, 0xc9, 0xc0, 0x72, 0xce, 0x64, + 0x4f, 0x14, 0x93, 0xbd, 0x7a, 0x7f, 0xa4, 0xca, 0xef, 0x46, 0x88, 0x8c, 0x18, 0x13, 0xed, 0xc8, + 0x68, 0x9c, 0x8c, 0x9e, 0x7b, 0xf4, 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x34, 0x31, 0xcc, 0x63, 0x4a, + 0x28, 0x4f, 0x18, 0x09, 0xd2, 0x15, 0xa7, 0xd3, 0x21, 0x6e, 0x60, 0xb8, 0x04, 0xe9, 0x25, 0x86, + 0xbc, 0x25, 0xad, 0xa1, 0xef, 0xd0, 0x45, 0x6e, 0xbd, 0x82, 0xc1, 0xf3, 0x30, 0x57, 0x27, 0xbe, + 0x28, 0x50, 0x7e, 0x5f, 0x78, 0x04, 0xb3, 0x21, 0x8a, 0x26, 0x4b, 0x30, 0x6a, 0x6b, 0x17, 0x1a, + 0xb5, 0xf1, 0x3a, 0x94, 0x85, 0x00, 0xe5, 0x16, 0x23, 0xe2, 0xa2, 0xa9, 0x71, 0xc1, 0x9f, 0xc1, + 0x4c, 0x40, 0x49, 0x77, 0xfa, 0x00, 0xb2, 0x74, 0x45, 0x1c, 0x2e, 0x0b, 0x31, 0x8f, 0xb2, 0x3d, + 0x18, 0x01, 0xae, 0xc1, 0x2c, 0xc5, 0xec, 0xd0, 0xa8, 0xa4, 0x66, 0x09, 0xbd, 0x5a, 0x70, 0xf6, + 0x7d, 0xa7, 0x4d, 0x82, 0xab, 0x45, 0x88, 0xc2, 0x3f, 0x81, 0xd2, 0x8e, 0xd3, 0xef, 0x9b, 0x76, + 0x9b, 0x09, 0xa9, 0xc0, 0x34, 0xb1, 0x47, 0xcc, 0xcc, 0xa2, 0x41, 0x7f, 0xb2, 0x04, 0xe9, 0x12, + 0xcb, 0x12, 0x79, 0xc6, 0x81, 0x30, 0x7d, 0xa7, 0x95, 0xf4, 0xa5, 0x69, 0x63, 0xba, 0xc7, 0x43, + 0x7e, 0x55, 0xca, 0x32, 0x19, 0x21, 0x82, 0x2a, 0x48, 0xa7, 0x6f, 0x91, 0x69, 0xec, 0x37, 0xde, + 0x87, 0xd2, 0x4e, 0xd7, 0xb4, 0x6d, 0x62, 0xa5, 0xda, 0x80, 0x94, 0x19, 0xa8, 0x28, 0x7a, 0x23, + 0xf3, 0xa6, 0x7b, 0x4c, 0xfc, 0x30, 0xcb, 0x29, 0x84, 0xff, 0x35, 0x0d, 0x85, 0xa0, 0x6c, 0xbe, + 0x05, 0x45, 0x8f, 0x06, 0x87, 0x65, 0x28, 0xf7, 0x67, 0x7a, 0xe0, 0x42, 0x52, 0xca, 0xd7, 0x92, + 0x5e, 0x15, 0x43, 0x9d, 0x1e, 0x8b, 0x43, 0xe0, 0x75, 0x23, 0x24, 0x45, 0xdf, 0x81, 0xb9, 0x9e, + 0x7d, 0xe4, 0x0c, 0xed, 0xb6, 0x30, 0x89, 0x1e, 0x4e, 0x34, 0x5d, 0x96, 0xd4, 0x16, 0x11, 0x5a, + 0x6b, 0xc4, 0xc9, 0xd1, 0x36, 0x54, 0x9c, 0xa1, 0x1f, 0x15, 0x91, 0x9d, 0x28, 0x62, 0x8c, 0x1e, + 0xdd, 0xa7, 0x21, 0x0f, 0x02, 0xca, 0x9c, 0x1d, 0x63, 0x0f, 0x57, 0x0d, 0x95, 0x94, 0x16, 0x1e, + 0xcd, 0xac, 0x67, 0xa6, 0xdf, 0x15, 0x35, 0x1f, 0xc0, 0x34, 0xde, 0xc4, 0x1e, 0xed, 0xb5, 0x59, + 0xa5, 0x17, 0x0d, 0x0e, 0xa0, 0x9d, 0xc8, 0x19, 0xca, 0xef, 0x62, 0xff, 0x97, 0x90, 0xb2, 0xdf, + 0xe4, 0x71, 0x79, 0x17, 0x16, 0xa2, 0x6d, 0x97, 0xd7, 0x9b, 0x0e, 0x79, 0x5e, 0x61, 0x9e, 0x48, + 0x66, 0x09, 0xe2, 0x9f, 0x6b, 0x30, 0x3f, 0xd6, 0xa8, 0xd1, 0x03, 0x28, 0x9d, 0xf4, 0x2c, 0x8b, + 0xb4, 0x9b, 0x17, 0xaa, 0x73, 0x95, 0x18, 0x7d, 0x01, 0x33, 0x2e, 0x1f, 0x2f, 0xe4, 0x84, 0x32, + 0x99, 0x39, 0x42, 0x8d, 0x77, 0xd8, 0xf9, 0x43, 0xaf, 0x0a, 0x81, 0xf2, 0x81, 0xb7, 0x35, 0xd5, + 0xdb, 0x55, 0x28, 0x0c, 0x4c, 0xbf, 0x7b, 0x38, 0x20, 0x2d, 0x39, 0x10, 0x4a, 0x18, 0x7f, 0x9d, + 0x85, 0x82, 0xbc, 0x6d, 0xa4, 0xf5, 0x0b, 0x71, 0xfe, 0x67, 0x92, 0xcf, 0xff, 0xc8, 0xd3, 0x42, + 0x15, 0x0a, 0x9d, 0xa1, 0x65, 0xb1, 0x54, 0xe0, 0x27, 0x66, 0x00, 0xab, 0x9e, 0xcd, 0x45, 0x3c, + 0x8b, 0x6e, 0x43, 0x8e, 0x4e, 0xa8, 0x9e, 0x7e, 0x89, 0x39, 0x20, 0xf1, 0x26, 0xc4, 0x29, 0xd0, + 0xc3, 0xb1, 0x37, 0x84, 0x1b, 0x09, 0xd4, 0xa9, 0x8f, 0x07, 0xf7, 0x22, 0x8f, 0x07, 0xd7, 0x93, + 0x58, 0xe3, 0xaf, 0x06, 0x0f, 0xc7, 0x5e, 0x0d, 0x12, 0x77, 0xfc, 0x1f, 0x7a, 0x2e, 0x78, 0xc0, + 0xba, 0x98, 0x48, 0x2c, 0x9a, 0xe3, 0x41, 0x7c, 0xb4, 0xf3, 0xe2, 0x83, 0x7f, 0xab, 0xc1, 0xd5, + 0x3a, 0xf1, 0x5f, 0xc6, 0x1e, 0x0f, 0x82, 0x0c, 0x5d, 0x83, 0x92, 0x4b, 0x06, 0xce, 0x33, 0xd3, + 0xf7, 0x89, 0x2b, 0x5f, 0xe6, 0x54, 0x14, 0x5a, 0x87, 0x39, 0x97, 0x8c, 0x7a, 0x5e, 0xcf, 0xb1, + 0x25, 0x15, 0xd7, 0x30, 0x8e, 0xa6, 0xb2, 0x4c, 0xcb, 0xda, 0x76, 0x4d, 0xbb, 0xd5, 0x25, 0x72, + 0xa0, 0x53, 0x51, 0xac, 0xed, 0x5b, 0x56, 0xd3, 0x3c, 0xf6, 0xc4, 0xc4, 0x2e, 0x41, 0x7c, 0x04, + 0x8b, 0x71, 0x1d, 0x65, 0x09, 0x50, 0x65, 0x64, 0x09, 0xd0, 0xdf, 0xec, 0x7c, 0x93, 0x8f, 0x23, + 0xa2, 0x7e, 0x24, 0xcc, 0x2e, 0x5b, 0x42, 0x2d, 0x51, 0x09, 0x01, 0x8c, 0xbf, 0x82, 0xe5, 0x64, + 0x57, 0x50, 0x9f, 0xee, 0xc3, 0x7c, 0xfc, 0x85, 0x25, 0xe9, 0xf2, 0x94, 0xa4, 0xa4, 0x31, 0xce, + 0x89, 0x11, 0x54, 0x9e, 0xf6, 0x3c, 0x7a, 0xeb, 0x70, 0x94, 0x4f, 0x03, 0x05, 0x0a, 0xa7, 0x96, + 0xb6, 0x0e, 0x79, 0x51, 0x18, 0xa2, 0x47, 0x4b, 0x90, 0xc6, 0x40, 0xfc, 0x34, 0xa2, 0xc6, 0xc5, + 0xd1, 0xf8, 0x0d, 0x94, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x29, 0x59, 0x84, 0x36, 0x06, 0xa7, + 0x40, 0x9f, 0xc2, 0xe5, 0x63, 0x36, 0x77, 0xef, 0xc6, 0x36, 0xe3, 0x5e, 0x4e, 0x5e, 0xc4, 0x07, + 0x50, 0xde, 0x6a, 0xb7, 0xa9, 0x2c, 0x99, 0x54, 0x49, 0xc6, 0x25, 0x98, 0x90, 0x49, 0x36, 0xc1, + 0x80, 0x99, 0x40, 0x1e, 0x9f, 0xd9, 0x90, 0x4d, 0x4e, 0xe3, 0x2a, 0x71, 0xd9, 0x09, 0x2b, 0x74, + 0xf7, 0x9e, 0xec, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0x54, + 0x35, 0x17, 0x21, 0xd7, 0xb3, 0xdb, 0xe4, 0xad, 0xfc, 0x9e, 0xc0, 0x00, 0xfc, 0x6d, 0x98, 0x53, + 0x49, 0xa9, 0x06, 0xb7, 0xa0, 0xac, 0xee, 0x13, 0xa4, 0x63, 0x0c, 0x8b, 0x3f, 0x84, 0x05, 0x83, + 0x74, 0x5c, 0xe2, 0x75, 0xd5, 0xb8, 0xa7, 0xec, 0xf3, 0xff, 0x70, 0xf9, 0x90, 0xf8, 0x0a, 0xfb, + 0x64, 0xf2, 0x87, 0xec, 0xb2, 0x59, 0x4f, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, 0x8b, 0xe5, 0xfe, + 0xf7, 0xd9, 0xed, 0x8e, 0x6e, 0x93, 0xc2, 0x9c, 0xb8, 0x6b, 0x44, 0x64, 0x26, 0x26, 0xf2, 0x1e, + 0x5c, 0x4d, 0x13, 0x49, 0x9d, 0x26, 0xc3, 0xa0, 0x29, 0x61, 0xc8, 0x43, 0xae, 0xd6, 0x1f, 0xf8, + 0x67, 0x9b, 0x7f, 0x98, 0x85, 0xbc, 0x78, 0x6c, 0x42, 0x3b, 0x50, 0x6a, 0xba, 0x66, 0xeb, 0x84, + 0x7f, 0xa9, 0x42, 0xfa, 0xd8, 0xc7, 0x2b, 0xa1, 0x62, 0x75, 0x29, 0x61, 0x85, 0x5e, 0x4c, 0xa7, + 0x3e, 0xd6, 0xd0, 0x2b, 0xa8, 0xc4, 0x3f, 0xc0, 0x20, 0x1c, 0xbd, 0x05, 0x26, 0x7d, 0x5f, 0xaa, + 0xae, 0x4d, 0xa4, 0x61, 0xd2, 0xd1, 0x36, 0x14, 0xe4, 0x07, 0x0a, 0xa4, 0x3e, 0x28, 0xc6, 0x3e, + 0x70, 0x54, 0xf5, 0xc4, 0x35, 0x2e, 0xe3, 0x25, 0x1b, 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0x46, 0xea, + 0x25, 0x35, 0xb0, 0x78, 0x75, 0x12, 0x09, 0x17, 0xdc, 0x84, 0x72, 0xf4, 0x31, 0x16, 0xad, 0x9d, + 0xf7, 0x12, 0x5c, 0x5d, 0x99, 0x40, 0x11, 0x48, 0x8d, 0xee, 0x87, 0xd6, 0x52, 0x55, 0x49, 0x92, + 0x9a, 0xf0, 0x40, 0x8b, 0xa7, 0xd0, 0x8f, 0x01, 0x8d, 0xbf, 0x30, 0xa2, 0x9b, 0x17, 0x79, 0x0d, + 0xad, 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x82, 0xf9, 0xb1, 0xb7, 0x31, 0xa4, 0x4e, 0xb2, 0x69, + 0x6f, 0x8e, 0xd5, 0x1b, 0x93, 0x89, 0x02, 0x03, 0xc6, 0x5f, 0x96, 0x22, 0x06, 0xa4, 0xbe, 0x85, + 0x45, 0x0c, 0x48, 0x79, 0x9e, 0xe2, 0xb9, 0x26, 0x6f, 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, + 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, + 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x83, 0x35, 0x5a, 0x49, 0x7d, 0x1a, 0xe3, 0xa2, + 0x26, 0x3e, 0x9d, 0x05, 0x46, 0xb1, 0x01, 0x26, 0x6e, 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, + 0x1e, 0x3c, 0x85, 0x3a, 0xec, 0xd3, 0xdf, 0x58, 0xf3, 0x46, 0xb7, 0xa2, 0x3c, 0x69, 0x83, 0x4e, + 0xf5, 0xe6, 0xb9, 0x74, 0x7c, 0x9f, 0x1a, 0x14, 0x83, 0x06, 0x8a, 0xae, 0x2a, 0x4c, 0xf1, 0x76, + 0x5e, 0x5d, 0x4e, 0x5e, 0x0c, 0x62, 0x20, 0x9a, 0x58, 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, + 0xda, 0xf3, 0xf0, 0x14, 0x7a, 0x02, 0x10, 0xb6, 0x21, 0x74, 0x2d, 0xd2, 0xb5, 0x63, 0x8d, 0xac, + 0x5a, 0x4d, 0x59, 0x95, 0xde, 0x9f, 0x51, 0xbb, 0x52, 0x24, 0x9a, 0x09, 0xed, 0xaa, 0x5a, 0x51, + 0xdf, 0x8a, 0xe9, 0x69, 0x8d, 0xa7, 0xd0, 0x63, 0x28, 0x47, 0x9b, 0x55, 0xe4, 0x3c, 0x48, 0xec, + 0x63, 0x89, 0x72, 0x5e, 0x81, 0x9e, 0xd6, 0xc5, 0xd0, 0x9d, 0xa8, 0xc4, 0x49, 0xad, 0x2e, 0x51, + 0xb6, 0x05, 0x4b, 0xc9, 0xfd, 0x08, 0xad, 0x47, 0x25, 0xa7, 0x77, 0xc1, 0xea, 0xad, 0x0b, 0x50, + 0x32, 0xaf, 0x6e, 0xdf, 0xff, 0xe3, 0xbb, 0x15, 0xed, 0x6f, 0xef, 0x56, 0xb4, 0xbf, 0xbf, 0x5b, + 0xd1, 0x7e, 0xf5, 0x8f, 0x95, 0x29, 0xc0, 0xad, 0xee, 0x46, 0x8b, 0xb8, 0xf6, 0x86, 0x69, 0xf5, + 0x5a, 0x64, 0xc3, 0xd9, 0xdc, 0x90, 0x92, 0xdc, 0x41, 0xcb, 0x23, 0xee, 0x88, 0xb8, 0xaf, 0x32, + 0x83, 0xa3, 0xa3, 0x4b, 0xec, 0xcf, 0x25, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x92, + 0xbf, 0xa3, 0x76, 0x22, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5582,6 +5591,16 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Force { + i-- + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } if m.AllowInRunningState { i-- if m.AllowInRunningState { @@ -7818,6 +7837,9 @@ func (m *DestroyEnvironmentRequest) Size() (n int) { if m.AllowInRunningState { n += 2 } + if m.Force { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -11645,6 +11667,26 @@ func (m *DestroyEnvironmentRequest) Unmarshal(dAtA []byte) error { } } m.AllowInRunningState = bool(v != 0) + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Force = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 998a671ee..99d232dc7 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -196,6 +196,7 @@ message DestroyEnvironmentRequest { string id = 1; bool keepTasks = 2; bool allowInRunningState = 3; + bool force = 4; } message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; From b0ec3af1550e2c6774ef6c9f39977ca3554fce1d Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Jun 2020 14:30:30 +0300 Subject: [PATCH 0267/2352] [coconut] add force flag in environment destroy --- coconut/cmd/environment_destroy.go | 1 + coconut/control/control.go | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/coconut/cmd/environment_destroy.go b/coconut/cmd/environment_destroy.go index 280650b86..457595d4a 100644 --- a/coconut/cmd/environment_destroy.go +++ b/coconut/cmd/environment_destroy.go @@ -51,4 +51,5 @@ func init() { environmentDestroyCmd.Flags().BoolP("keep-tasks", "k", false, "keep tasks active after destroying the environment") environmentDestroyCmd.Flags().BoolP("allow-in-running-state", "a", false, "allows destroying an environment while in Running state") + environmentDestroyCmd.Flags().BoolP("force", "f", false, "force destroy of an environment") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 389e800e1..02d9325be 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -499,7 +499,12 @@ func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. keepTasks = false } - _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks, AllowInRunningState: allowInRunningState}, grpc.EmptyCallOption{}) + force, err := cmd.Flags().GetBool("force") + if err != nil { + keepTasks = false + } + + _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks, AllowInRunningState: allowInRunningState, Force: force}, grpc.EmptyCallOption{}) if err != nil { return } From 2d237eea3dc98c2600e0ab8a9f4d5fcf9ad0f9c2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Jun 2020 14:33:35 +0300 Subject: [PATCH 0268/2352] [core] handle force destroy request --- core/environment/manager.go | 4 ++-- core/server.go | 20 +++++++++++++++++++- core/signals.go | 2 +- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index ac3936272..759cdd3d2 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -118,7 +118,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } -func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID) error { +func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID, force bool) error { envs.mu.Lock() defer envs.mu.Unlock() @@ -127,7 +127,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID) error { return err } - if env.CurrentState() != "STANDBY" { + if env.CurrentState() != "STANDBY" && !force { return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } diff --git a/core/server.go b/core/server.go index dc8a171b9..29d72cfd7 100644 --- a/core/server.go +++ b/core/server.go @@ -299,6 +299,24 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } + // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. + if req.Force { + err = m.state.environments.TeardownEnvironment(env.Id(), req.Force) + if err != nil { + return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() + } + + tasksForEnv := env.Workflow().GetTasks().GetTaskIds() + killed, running, err := m.doCleanupTasks(tasksForEnv) + ctr := &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running} + if err != nil { + log.WithError(err).Error("task cleanup error") + return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() + } + + return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil + } + if req.AllowInRunningState && env.CurrentState() == "RUNNING" { err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) if err != nil { @@ -328,7 +346,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } } - err = m.state.environments.TeardownEnvironment(env.Id()) + err = m.state.environments.TeardownEnvironment(env.Id(), req.Force) if err != nil { return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() } diff --git a/core/signals.go b/core/signals.go index 60c396704..e509c7a16 100644 --- a/core/signals.go +++ b/core/signals.go @@ -99,7 +99,7 @@ func manageKillSignals(state *internalState) { } // Teardown Enviroment - err = state.environments.TeardownEnvironment(uid) + err = state.environments.TeardownEnvironment(uid, false) if err != nil { log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("cannot teardown enviroment %s", uid.String())) } From f9fbbd4639890a6c56f87740661e404d27732648 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 12 Jun 2020 17:29:51 +0300 Subject: [PATCH 0269/2352] [executor] add timeout to OCC transition --- executor/executable/controllabletask.go | 37 ++++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 913084a48..7540e532f 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -48,6 +48,11 @@ type ControllableTask struct { pendingFinalTaskStateCh chan mesos.TaskState } +type CommitResponse struct { + newState string + transitionError error +} + func (t *ControllableTask) Launch() error { t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed taskCmd, err := prepareTaskCmd(t.tci) @@ -387,17 +392,35 @@ func (t *ControllableTask) Kill() error { "targetList": cmd.TargetList, }). Debug("state DONE not reached, about to commit transition") + + // Call cmd.Commit() asynchronous + commitDone := make(chan *CommitResponse) + go func() { + var cr CommitResponse + cr.newState, cr.transitionError = cmd.Commit() + commitDone <- &cr + }() + + // Set timeout cause OCC is locking up so killing is not possible. The following approach + // help us to bypass the OCC transition, so we can kill the tasks on force destroy env. + // Currently this will run for every Kill message receive (force or not). + // TODO: Find a better way to distinguish force from plain Kill message. + var _cr *CommitResponse + select { + case _cr = <- commitDone: + case <-time.After(45 * time.Second): + log.Error("deadline exceeded") + break + } - newState, transitionError := cmd.Commit() - - log.WithField("newState", newState). - WithError(transitionError). + log.WithField("newState", _cr.newState). + WithError(_cr.transitionError). Debug("transition committed") - if transitionError != nil || len(cmd.Event) == 0 { - log.WithError(transitionError).Error("cannot gracefully end task") + if _cr.transitionError != nil || len(cmd.Event) == 0 { + log.WithError(_cr.transitionError).Error("cannot gracefully end task") break } - reachedState = newState + reachedState = _cr.newState } log.Debug("end transition loop done") From 68cfb15c69db7b65fb0790e5b7e33f7de60dc942 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 12 Jun 2020 18:01:38 +0300 Subject: [PATCH 0270/2352] [executor] set timeout to 15s for OCC transition --- executor/executable/controllabletask.go | 27 +++++++++++-------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 7540e532f..64b08a81a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -392,35 +392,32 @@ func (t *ControllableTask) Kill() error { "targetList": cmd.TargetList, }). Debug("state DONE not reached, about to commit transition") - + // Call cmd.Commit() asynchronous commitDone := make(chan *CommitResponse) - go func() { + go func() { var cr CommitResponse cr.newState, cr.transitionError = cmd.Commit() commitDone <- &cr }() - // Set timeout cause OCC is locking up so killing is not possible. The following approach - // help us to bypass the OCC transition, so we can kill the tasks on force destroy env. - // Currently this will run for every Kill message receive (force or not). - // TODO: Find a better way to distinguish force from plain Kill message. - var _cr *CommitResponse + // Set timeout cause OCC is locking up so killing is not possible. + var commitResponse *CommitResponse select { - case _cr = <- commitDone: - case <-time.After(45 * time.Second): + case commitResponse = <- commitDone: + case <-time.After(15 * time.Second): log.Error("deadline exceeded") break - } + } - log.WithField("newState", _cr.newState). - WithError(_cr.transitionError). + log.WithField("newState", commitResponse.newState). + WithError(commitResponse.transitionError). Debug("transition committed") - if _cr.transitionError != nil || len(cmd.Event) == 0 { - log.WithError(_cr.transitionError).Error("cannot gracefully end task") + if commitResponse.transitionError != nil || len(cmd.Event) == 0 { + log.WithError(commitResponse.transitionError).Error("cannot gracefully end task") break } - reachedState = _cr.newState + reachedState = commitResponse.newState } log.Debug("end transition loop done") From 2c3fd4b0f6f86a4d784e42d72bead056110bfa62 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Jun 2020 10:40:36 +0200 Subject: [PATCH 0271/2352] [build] Bump to v0.14.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6c0985d4f..c8c7a90e7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From d632275e7778d2c1c7773dba7db0f183e1e57bc3 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 18 Jun 2020 14:07:07 +0300 Subject: [PATCH 0272/2352] [peanut] tview deadlock --- go.mod | 7 +++++-- go.sum | 30 ++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 37a1364a9..deab422a3 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ replace ( ) require ( - github.com/antonmedv/expr v1.8.8 + github.com/antonmedv/expr v1.4.5 github.com/armon/go-metrics v0.3.3 // indirect github.com/briandowns/spinner v1.11.1 github.com/coreos/bbolt v1.3.4 // indirect @@ -49,6 +49,7 @@ require ( github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.1.0 + github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/mattn/go-colorable v0.1.6 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect github.com/mesos/mesos-go v0.0.11 @@ -68,8 +69,9 @@ require ( github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/client_golang v1.5.1 github.com/prometheus/procfs v0.0.11 // indirect - github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 + github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c github.com/rs/xid v1.2.1 + github.com/sanity-io/litter v1.2.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.6.0 github.com/smartystreets/assertions v1.0.1 // indirect @@ -79,6 +81,7 @@ require ( github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.6.2 + github.com/stretchr/testify v1.5.1 // indirect github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect github.com/valyala/fasttemplate v1.1.0 diff --git a/go.sum b/go.sum index cd4afaac8..898c6f925 100644 --- a/go.sum +++ b/go.sum @@ -60,8 +60,31 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= +github.com/antonmedv/expr v1.4.5/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= +github.com/antonmedv/expr v1.5.0/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.1/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.2/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.3/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.4/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.5/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.6/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.7/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.8/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= +github.com/antonmedv/expr v1.5.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.5.10/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.6.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.7.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/antonmedv/expr v1.7.1 h1:KK+VpHu1TtIDQL1ej2kA1VC/4TbtEeuLoNY10y1889Y= github.com/antonmedv/expr v1.7.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.2/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.3/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.4/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.5/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.6/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.7/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/antonmedv/expr v1.8.8 h1:uVwIkIBNO2yn4vY2u2DQUqXTmv9jEEMCEcHa19G5weY= github.com/antonmedv/expr v1.8.8/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= @@ -136,6 +159,7 @@ github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= +github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= @@ -483,10 +507,14 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= +github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c h1:Q1oRqcTvxE0hjV0Gw4bEcYYLM0ztcuARGVSWEF2tKaI= +github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f h1:ITrvUKe4041A8IlJkWx+lm2pSj5QzZwpeYNfCnO5u3U= github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= +github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= @@ -498,6 +526,7 @@ github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -730,6 +759,7 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= From ffd799e44aa38c7bc21d08ca8dcbb79223dc4adf Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 18 Jun 2020 14:37:22 +0300 Subject: [PATCH 0273/2352] [peanut] go.mod inform for tview deadlock issue --- go.mod | 3 +++ 1 file changed, 3 insertions(+) diff --git a/go.mod b/go.mod index deab422a3..55df6c49b 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,9 @@ replace ( google.golang.org/grpc => google.golang.org/grpc v1.26.0 ) +// Issue: https://github.com/rivo/tview/issues/416 +// tview should be version 0ba8301b415c otherwise peanut will deadlock + require ( github.com/antonmedv/expr v1.4.5 github.com/armon/go-metrics v0.3.3 // indirect From 5264ed308ea2e6fd3d475fa7c2e318f49a245cad Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 19 May 2020 20:38:07 +0300 Subject: [PATCH 0274/2352] [core] create message Event stream --- core/protos/o2control.proto | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 99d232dc7..6c38454e7 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -33,6 +33,18 @@ option go_package = "pb"; message Event_MesosHeartbeat { } +message Evnt_EnvironmentStateChanged { +} + +message Evnt_EnvironmentCreated { +} + +message Evnt_EnvironmentDestroyed { +} + +message Evnt_EnvironmentError { +} + ////////////////////////////////////////////////////// service Control { @@ -66,6 +78,7 @@ service Control { rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (SetRepoDefaultRevisionReply) {} + rpc Subscribe(SubscribeRequest) returns (stream Event); } //////////////////////////////////////// @@ -90,6 +103,18 @@ message StatusUpdate { } } +message Event { + string timestamp = 1; + oneof Payload { + Evnt_EnvironmentStateChanged environmentStateChanged = 2; + Evnt_EnvironmentCreated environmentCreated = 3; + Evnt_EnvironmentDestroyed environmentDestroyed = 4; + Evnt_EnvironmentError environmentError = 5; + // and so on, as needed... + } +} + +message SubscribeRequest{} //////////////////////////////////////// // Framework //////////////////////////////////////// From 44c98152d4621d7e7592e84eaf22485621081133 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 8 Jun 2020 13:33:33 +0300 Subject: [PATCH 0275/2352] [core] update protos with Events --- core/protos/o2control.proto | 50 ++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 6c38454e7..edac7a462 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -33,16 +33,44 @@ option go_package = "pb"; message Event_MesosHeartbeat { } -message Evnt_EnvironmentStateChanged { +message Ev_EnvironmentStateChanged { + string event = 1; + string source = 2; + string destination = 3; } -message Evnt_EnvironmentCreated { +message Ev_TaskStateChanged { + string taskid = 1; + string state = 2; +} + +message Ev_TaskStatusChanged { + string taskid = 1; + string status = 2; +} + +message Ev_TaskLaunch { + string taskid = 1; +} + +message Ev_MesosTaskCreated { + string taskresources = 1; + string executorResources = 2; +} + +message Ev_EnvironmentCreated { + EnvironmentInfo environment = 1; +} + +message Ev_EnvironmentDestroyed { + CleanupTasksReply cleanupTasksReply = 1; + string environmentid = 2; } -message Evnt_EnvironmentDestroyed { +message Ev_EnvironmentError { } -message Evnt_EnvironmentError { +message Ev_KillTasksMesos { } ////////////////////////////////////////////////////// @@ -106,11 +134,15 @@ message StatusUpdate { message Event { string timestamp = 1; oneof Payload { - Evnt_EnvironmentStateChanged environmentStateChanged = 2; - Evnt_EnvironmentCreated environmentCreated = 3; - Evnt_EnvironmentDestroyed environmentDestroyed = 4; - Evnt_EnvironmentError environmentError = 5; - // and so on, as needed... + Ev_EnvironmentStateChanged environmentStateChanged = 2; + Ev_EnvironmentCreated environmentCreated = 3; + Ev_TaskStateChanged taskStateChanged = 4; + Ev_TaskStatusChanged taskStatusChanged = 5; + Ev_TaskLaunch tasklaunch = 6; + Ev_MesosTaskCreated mesosTaskcreated = 7; + Ev_EnvironmentDestroyed environmentDestroyed = 8; + Ev_EnvironmentError environmentError = 9; + Ev_KillTasksMesos killtasksMesos =10; } } From 08d79df8aeafded6d46119375076f21b3a7eee5d Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 8 Jun 2020 13:34:50 +0300 Subject: [PATCH 0276/2352] [core] create Subscribe call handler --- core/server.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/server.go b/core/server.go index 29d72cfd7..d0a9bf305 100644 --- a/core/server.go +++ b/core/server.go @@ -640,3 +640,21 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is empty } + +func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { + m.logMethod() + ctx := srv.Context() + for { + select { + case event := <- m.state.Event: + m.state.RLock() + err := srv.Send(event) + if err != nil { + return err + } + m.state.RUnlock() + case <-ctx.Done(): + return ctx.Err() + } + } +} From 18bc3a0a5b6e9f328468903fce2b8b8934226e1d Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 8 Jun 2020 13:38:15 +0300 Subject: [PATCH 0277/2352] [core] create core Events --- core/protos/coreevents.go | 132 ++++++++++++++++++++++++++++++++++++++ core/scheduler.go | 8 +++ core/server.go | 11 ++-- core/state.go | 6 +- 4 files changed, 152 insertions(+), 5 deletions(-) create mode 100644 core/protos/coreevents.go diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go new file mode 100644 index 000000000..953c0b6c8 --- /dev/null +++ b/core/protos/coreevents.go @@ -0,0 +1,132 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package pb + +import ( + "encoding/json" + "time" + + "github.com/mesos/mesos-go/api/v1/lib" +) + +func NewEnvironmentStateEvent(cmdb []byte) *Event { + var te Ev_EnvironmentStateChanged + var tEvnt Event_EnvironmentStateChanged + err := json.Unmarshal(cmdb, &te) + if err != nil { + return nil + } + + tEvnt.EnvironmentStateChanged=&te + return WrapEvent(&tEvnt) +} + +func NewEnvironmentCreatedEvent(ei *EnvironmentInfo) *Event { + var ec Event_EnvironmentCreated + ec.EnvironmentCreated = &Ev_EnvironmentCreated{ + Environment: ei, + } + return WrapEvent(&ec) +} + +func NewEnvironmentDestroyedEvent(ctrl *CleanupTasksReply, envid string) *Event { + var de Event_EnvironmentDestroyed + de.EnvironmentDestroyed = &Ev_EnvironmentDestroyed{ + CleanupTasksReply: ctrl, + Environmentid: envid, + } + return WrapEvent(&de) +} + +func NewEnvironmentErrorEvent() *Event { + var ee Event_EnvironmentError + ee.EnvironmentError = &Ev_EnvironmentError{} + return WrapEvent(&ee) +} + +func NewEventTaskState(taskid,state string) *Event { + var sc Ev_TaskStateChanged + var stCh Event_TaskStateChanged + sc.Taskid = taskid + sc.State = state + stCh.TaskStateChanged = &sc + return WrapEvent(&stCh) +} + +func NewEventTaskStatus(status *mesos.TaskStatus) *Event { + + taskId := status.GetTaskID().Value + var statuschanged Ev_TaskStatusChanged + var etSt Event_TaskStatusChanged + switch st := status.GetState(); st { + case mesos.TASK_RUNNING: + // wrap to create environment ACTIVE + statuschanged.Taskid = taskId + statuschanged.Status = "ACTIVE" + case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + statuschanged.Taskid = taskId + statuschanged.Status = "INACTIVE" + case mesos.TASK_FINISHED: + statuschanged.Taskid = taskId + } + + etSt.TaskStatusChanged = &statuschanged + + return WrapEvent(&etSt) +} + +func NewEventTaskLaunch(taskid string) *Event { + var ltask Ev_TaskLaunch + var eltask Event_Tasklaunch + + ltask.Taskid = taskid + eltask.Tasklaunch = <ask + + return WrapEvent(&eltask) +} + +func NewEventMesosTaskCreated(resourcesRequest,executorResources string) *Event { + var mtask Ev_MesosTaskCreated + var emtask Event_MesosTaskcreated + + mtask.ExecutorResources = executorResources + mtask.Taskresources = resourcesRequest + emtask.MesosTaskcreated = &mtask + + return WrapEvent(&emtask) +} + +func NewKillTasksEvent() *Event { + var ke Event_KilltasksMesos + ke.KilltasksMesos = &Ev_KillTasksMesos{} + return WrapEvent(&ke) +} + +func WrapEvent(ce isEvent_Payload) *Event { + return &Event{ + Timestamp:time.Now().Format(time.RFC3339), + Payload: ce, + } +} \ No newline at end of file diff --git a/core/scheduler.go b/core/scheduler.go index 8b4f96812..442b3fbf8 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -47,6 +47,7 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" + cpb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/executor/protos" "github.com/gogo/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" @@ -324,6 +325,7 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even go func() { state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) state.servent.ProcessResponse(&res, sender) + state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState) }() return default: @@ -683,6 +685,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) + state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()) newTaskId := taskPtr.GetTaskId() @@ -718,6 +721,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl "executorId": state.executor.ExecutorID.Value, "task": mesosTaskInfo, }).Debug("launching task") + state.Event <- cpb.NewEventTaskLaunch(newTaskId) tasks = append(tasks, mesosTaskInfo) descriptorsToDeploy = append(descriptorsToDeploy[:i], descriptorsToDeploy[i+1:]...) @@ -864,6 +868,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { t := state.taskman.GetTask(taskIDValue) if t != nil && t.IsLocked() { go state.taskman.UpdateTaskState(taskIDValue, "ERROR") + state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR") } } @@ -881,6 +886,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { } else { // Enqueue task state update go state.taskman.UpdateTaskStatus(&s) + state.Event <- cpb.NewEventTaskStatus(&s) } return nil @@ -916,6 +922,7 @@ func KillTask(ctx context.Context, state *internalState, receiver controlcommand killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) + state.Event <- cpb.NewKillTasksEvent() return } @@ -940,6 +947,7 @@ func SendCommand(ctx context.Context, state *internalState, command controlcomma "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), }). Debug("outgoing MESSAGE call") + state.Event <- cpb.NewEnvironmentStateEvent(bytes) return err } diff --git a/core/server.go b/core/server.go index d0a9bf305..3d604bdcd 100644 --- a/core/server.go +++ b/core/server.go @@ -202,17 +202,19 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme } tasks := newEnv.Workflow().GetTasks() - r := &pb.NewEnvironmentReply{ - Environment: &pb.EnvironmentInfo{ + ei := &pb.EnvironmentInfo{ Id: newEnv.Id().String(), CreatedWhen: newEnv.CreatedWhen().Format(time.RFC3339), State: newEnv.CurrentState(), Tasks: tasksToShortTaskInfos(tasks), RootRole: newEnv.Workflow().GetName(), CurrentRunNumber: newEnv.GetCurrentRunNumber(), - }, + } + r := &pb.NewEnvironmentReply{ + Environment: ei, } + m.state.Event <- pb.NewEnvironmentCreatedEvent(ei) return r, nil } @@ -362,7 +364,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir log.WithError(err).Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - + + m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()) return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } diff --git a/core/state.go b/core/state.go index 05584d754..30a218e0d 100644 --- a/core/state.go +++ b/core/state.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/looplab/fsm" @@ -81,6 +82,7 @@ func newInternalState(shutdown func()) (*internalState, error) { resourceOffersDone := make(chan task.DeploymentMap) tasksToDeploy := make(chan task.Descriptors) reviveOffersTrg := make(chan struct{}) + Event := make(chan *pb.Event, 100) state := &internalState{ reviveTokens: backoff.BurstNotifier( @@ -91,6 +93,7 @@ func newInternalState(shutdown func()) (*internalState, error) { resourceOffersDone: resourceOffersDone, tasksToDeploy: tasksToDeploy, reviveOffersTrg: reviveOffersTrg, + Event: Event, wantsTaskResources: mesos.Resources{}, executor: executorInfo, metricsAPI: metricsAPI, @@ -154,5 +157,6 @@ type internalState struct { taskman *task.Manager commandqueue *controlcommands.CommandQueue servent *controlcommands.Servent -} + Event chan *pb.Event +} From cab9c5493a7790ed731202553c954ab4d5bc6f62 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 19 Jun 2020 15:59:40 +0300 Subject: [PATCH 0278/2352] [core] consistent var naming --- coconut/protos/o2control.pb.go | 13235 +++++++++++++++++++------------ core/protos/coreevents.go | 6 +- core/protos/o2control.pb.go | 13235 +++++++++++++++++++------------ core/protos/o2control.proto | 4 +- 4 files changed, 16287 insertions(+), 10193 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 88d06ff87..d925a7489 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,27 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -//////////////////////////////////////// -// Global status -//////////////////////////////////////// -type StatusRequest struct { +type Ev_EnvironmentStateChanged struct { + Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } +func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentStateChanged) ProtoMessage() {} +func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,38 +191,59 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) +func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) } -func (m *StatusRequest) XXX_Size() int { +func (m *Ev_EnvironmentStateChanged) XXX_Size() int { return m.Size() } -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) +func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) } -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentStateChanged) GetEvent() string { + if m != nil { + return m.Event + } + return "" } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentStateChanged) GetSource() string { + if m != nil { + return m.Source + } + return "" +} + +func (m *Ev_EnvironmentStateChanged) GetDestination() string { + if m != nil { + return m.Destination + } + return "" +} + +type Ev_TaskStateChanged struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } +func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskStateChanged) ProtoMessage() {} +func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *StatusReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -232,54 +253,52 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) +func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) } -func (m *StatusReply) XXX_Size() int { +func (m *Ev_TaskStateChanged) XXX_Size() int { return m.Size() } -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) +func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo -func (m *StatusReply) GetState() string { +func (m *Ev_TaskStateChanged) GetTaskid() string { if m != nil { - return m.State + return m.Taskid } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { +func (m *Ev_TaskStateChanged) GetState() string { if m != nil { - return m.StatusUpdates + return m.State } - return nil + return "" } -type StatusUpdate struct { - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_TaskStatusChanged struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { +func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } +func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskStatusChanged) ProtoMessage() {} +func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -289,79 +308,51 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) +func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) } -func (m *StatusUpdate) XXX_Size() int { +func (m *Ev_TaskStatusChanged) XXX_Size() int { return m.Size() } -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo - -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int -} - -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { +func (m *Ev_TaskStatusChanged) GetTaskid() string { if m != nil { - return m.Event + return m.Taskid } - return nil + return "" } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { +func (m *Ev_TaskStatusChanged) GetStatus() string { if m != nil { - return m.Level - } - return StatusUpdate_DEBUG -} - -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), + return m.Status } + return "" } -//////////////////////////////////////// -// Framework -//////////////////////////////////////// -type GetFrameworkInfoRequest struct { +type Ev_TaskLaunched struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { +func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } +func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskLaunched) ProtoMessage() {} +func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -371,42 +362,45 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) +func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) } -func (m *GetFrameworkInfoRequest) XXX_Size() int { +func (m *Ev_TaskLaunched) XXX_Size() int { return m.Size() } -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) +func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` +func (m *Ev_TaskLaunched) GetTaskid() string { + if m != nil { + return m.Taskid + } + return "" +} + +type Ev_MesosTaskCreated struct { + Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` + ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { +func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } +func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } +func (*Ev_MesosTaskCreated) ProtoMessage() {} +func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } -func (m *Version) XXX_Unmarshal(b []byte) error { +func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -416,85 +410,99 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) +func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) } -func (m *Version) XXX_Size() int { +func (m *Ev_MesosTaskCreated) XXX_Size() int { return m.Size() } -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) +func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) } -var xxx_messageInfo_Version proto.InternalMessageInfo +var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo -func (m *Version) GetMajor() int32 { +func (m *Ev_MesosTaskCreated) GetTaskresources() string { if m != nil { - return m.Major + return m.Taskresources } - return 0 + return "" } -func (m *Version) GetMinor() int32 { +func (m *Ev_MesosTaskCreated) GetExecutorResources() string { if m != nil { - return m.Minor + return m.ExecutorResources } - return 0 + return "" } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch - } - return 0 +type Ev_EnvironmentCreated struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build - } - return "" +func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } +func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentCreated) ProtoMessage() {} +func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } - -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName +func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) +} +func (m *Ev_EnvironmentCreated) XXX_Size() int { + return m.Size() +} +func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) } -func (m *Version) GetVersionStr() string { +var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo + +func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.VersionStr + return m.Environment } - return "" + return nil } -type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_EnvironmentDestroyed struct { + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} +func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } +func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentDestroyed) ProtoMessage() {} +func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -504,87 +512,50 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) +func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) } -func (m *GetFrameworkInfoReply) XXX_Size() int { +func (m *Ev_EnvironmentDestroyed) XXX_Size() int { return m.Size() } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) +func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo -func (m *GetFrameworkInfoReply) GetFrameworkId() string { +func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { if m != nil { - return m.FrameworkId + return m.CleanupTasksReply } - return "" + return nil } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { +func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { if m != nil { - return m.EnvironmentsCount + return m.Environmentid } - return 0 + return "" } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetState() string { - if m != nil { - return m.State - } - return "" -} - -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName - } - return "" -} - -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version - } - return nil -} - -// Not implemented yet -type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` +type Ev_EnvironmentError struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} +func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } +func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentError) ProtoMessage() {} +func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -594,43 +565,36 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) +func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) } -func (m *TeardownRequest) XXX_Size() int { +func (m *Ev_EnvironmentError) XXX_Size() int { return m.Size() } -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) +func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo - -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason - } - return "" -} +var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type TeardownReply struct { +type Ev_KillTasksMesos struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} +func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } +func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } +func (*Ev_KillTasksMesos) ProtoMessage() {} +func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -640,39 +604,39 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) +func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) } -func (m *TeardownReply) XXX_Size() int { +func (m *Ev_KillTasksMesos) XXX_Size() int { return m.Size() } -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) +func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) } -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo //////////////////////////////////////// -// Environment +// Global status //////////////////////////////////////// -type GetEnvironmentsRequest struct { +type StatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} +func (m *StatusRequest) Reset() { *m = StatusRequest{} } +func (m *StatusRequest) String() string { return proto.CompactTextString(m) } +func (*StatusRequest) ProtoMessage() {} +func (*StatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { +func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -682,38 +646,38 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) +func (m *StatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusRequest.Merge(m, src) } -func (m *GetEnvironmentsRequest) XXX_Size() int { +func (m *StatusRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) +func (m *StatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StatusRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo +var xxx_messageInfo_StatusRequest proto.InternalMessageInfo -type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusReply struct { + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} +func (m *StatusReply) Reset() { *m = StatusReply{} } +func (m *StatusReply) String() string { return proto.CompactTextString(m) } +func (*StatusReply) ProtoMessage() {} +func (*StatusReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { +func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -723,59 +687,54 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) +func (m *StatusReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusReply.Merge(m, src) } -func (m *GetEnvironmentsReply) XXX_Size() int { +func (m *StatusReply) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) +func (m *StatusReply) XXX_DiscardUnknown() { + xxx_messageInfo_StatusReply.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +var xxx_messageInfo_StatusReply proto.InternalMessageInfo -func (m *GetEnvironmentsReply) GetFrameworkId() string { +func (m *StatusReply) GetState() string { if m != nil { - return m.FrameworkId + return m.State } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { +func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { if m != nil { - return m.Environments + return m.StatusUpdates } return nil } -type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusUpdate struct { + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` + // Types that are valid to be assigned to Event: + // *StatusUpdate_MesosHeartbeat + Event isStatusUpdate_Event `protobuf_oneof:"Event"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} +func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } +func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } +func (*StatusUpdate) ProtoMessage() {} +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { +func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -785,101 +744,88 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) +func (m *StatusUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusUpdate.Merge(m, src) } -func (m *EnvironmentInfo) XXX_Size() int { +func (m *StatusUpdate) XXX_Size() int { return m.Size() } -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) +func (m *StatusUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_StatusUpdate.DiscardUnknown(m) } -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo +var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id - } - return "" +type isStatusUpdate_Event interface { + isStatusUpdate_Event() + MarshalTo([]byte) (int, error) + Size() int } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen - } - return "" +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State - } - return "" -} +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { +func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { - return m.Tasks + return m.Event } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole - } - return "" -} - -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { +func (m *StatusUpdate) GetLevel() StatusUpdate_Level { if m != nil { - return m.CurrentRunNumber + return m.Level } - return 0 + return StatusUpdate_DEBUG } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { + return x.MesosHeartbeat } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars - } - return nil -} - -type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Event struct { + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Types that are valid to be assigned to Payload: + // *Event_EnvironmentStateChanged + // *Event_EnvironmentCreated + // *Event_TaskStateChanged + // *Event_TaskStatusChanged + // *Event_Tasklaunched + // *Event_MesosTaskcreated + // *Event_EnvironmentDestroyed + // *Event_EnvironmentError + // *Event_KilltasksMesos + Payload isEvent_Payload `protobuf_oneof:"Payload"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} +func (m *Event) Reset() { *m = Event{} } +func (m *Event) String() string { return proto.CompactTextString(m) } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Event.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -889,98 +835,172 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) +func (m *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(m, src) } -func (m *NewEnvironmentRequest) XXX_Size() int { +func (m *Event) XXX_Size() int { return m.Size() } -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_Event proto.InternalMessageInfo -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { +type isEvent_Payload interface { + isEvent_Payload() + MarshalTo([]byte) (int, error) + Size() int +} + +type Event_EnvironmentStateChanged struct { + EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +} +type Event_EnvironmentCreated struct { + EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +} +type Event_TaskStateChanged struct { + TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` +} +type Event_TaskStatusChanged struct { + TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` +} +type Event_Tasklaunched struct { + Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` +} +type Event_MesosTaskcreated struct { + MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` +} +type Event_EnvironmentDestroyed struct { + EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` +} +type Event_EnvironmentError struct { + EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` +} +type Event_KilltasksMesos struct { + KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +} + +func (*Event_EnvironmentStateChanged) isEvent_Payload() {} +func (*Event_EnvironmentCreated) isEvent_Payload() {} +func (*Event_TaskStateChanged) isEvent_Payload() {} +func (*Event_TaskStatusChanged) isEvent_Payload() {} +func (*Event_Tasklaunched) isEvent_Payload() {} +func (*Event_MesosTaskcreated) isEvent_Payload() {} +func (*Event_EnvironmentDestroyed) isEvent_Payload() {} +func (*Event_EnvironmentError) isEvent_Payload() {} +func (*Event_KilltasksMesos) isEvent_Payload() {} + +func (m *Event) GetPayload() isEvent_Payload { if m != nil { - return m.WorkflowTemplate + return m.Payload } - return "" + return nil } -func (m *NewEnvironmentRequest) GetVars() map[string]string { +func (m *Event) GetTimestamp() string { if m != nil { - return m.Vars + return m.Timestamp } - return nil + return "" } -type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { + if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { + return x.EnvironmentStateChanged + } + return nil } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} +func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { + if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { + return x.EnvironmentCreated + } + return nil } -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) + +func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { + if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { + return x.TaskStateChanged + } + return nil } -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { + if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { + return x.TaskStatusChanged } + return nil } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) + +func (m *Event) GetTasklaunched() *Ev_TaskLaunched { + if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { + return x.Tasklaunched + } + return nil } -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { + if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { + return x.MesosTaskcreated + } + return nil } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { + if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { + return x.EnvironmentDestroyed + } + return nil } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { + if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { + return x.EnvironmentError + } + return nil +} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { + if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { + return x.KilltasksMesos } return nil } -type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Event) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Event_EnvironmentStateChanged)(nil), + (*Event_EnvironmentCreated)(nil), + (*Event_TaskStateChanged)(nil), + (*Event_TaskStatusChanged)(nil), + (*Event_Tasklaunched)(nil), + (*Event_MesosTaskcreated)(nil), + (*Event_EnvironmentDestroyed)(nil), + (*Event_EnvironmentError)(nil), + (*Event_KilltasksMesos)(nil), + } +} + +type SubscribeRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { +func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } +func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } +func (*SubscribeRequest) ProtoMessage() {} +func (*SubscribeRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -990,45 +1010,39 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) +func (m *SubscribeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubscribeRequest.Merge(m, src) } -func (m *GetEnvironmentRequest) XXX_Size() int { +func (m *SubscribeRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) +func (m *SubscribeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo - -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" -} +var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo -type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +//////////////////////////////////////// +// Framework +//////////////////////////////////////// +type GetFrameworkInfoRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { +func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } +func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } +func (*GetFrameworkInfoRequest) ProtoMessage() {} +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1038,52 +1052,42 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) +func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) } -func (m *GetEnvironmentReply) XXX_Size() int { +func (m *GetFrameworkInfoRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo - -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil +func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow - } - return nil -} +var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo -type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Version struct { + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1093,116 +1097,85 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) +func (m *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(m, src) } -func (m *ControlEnvironmentRequest) XXX_Size() int { +func (m *Version) XXX_Size() int { return m.Size() } -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_Version proto.InternalMessageInfo -func (m *ControlEnvironmentRequest) GetId() string { +func (m *Version) GetMajor() int32 { if m != nil { - return m.Id + return m.Major } - return "" + return 0 } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { +func (m *Version) GetMinor() int32 { if m != nil { - return m.Type + return m.Minor } - return ControlEnvironmentRequest_NOOP + return 0 } -type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Version) GetPatch() int32 { + if m != nil { + return m.Patch + } + return 0 } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo - -func (m *ControlEnvironmentReply) GetId() string { +func (m *Version) GetBuild() string { if m != nil { - return m.Id + return m.Build } return "" } -func (m *ControlEnvironmentReply) GetState() string { +func (m *Version) GetProductName() string { if m != nil { - return m.State + return m.ProductName } return "" } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { +func (m *Version) GetVersionStr() string { if m != nil { - return m.CurrentRunNumber + return m.VersionStr } - return 0 + return "" } -type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetFrameworkInfoReply struct { + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} +func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } +func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } +func (*GetFrameworkInfoReply) ProtoMessage() {} +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1212,115 +1185,87 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) +func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) } -func (m *ModifyEnvironmentRequest) XXX_Size() int { +func (m *GetFrameworkInfoReply) XXX_Size() int { return m.Size() } -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) +func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo -func (m *ModifyEnvironmentRequest) GetId() string { +func (m *GetFrameworkInfoReply) GetFrameworkId() string { if m != nil { - return m.Id + return m.FrameworkId } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { +func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { if m != nil { - return m.Operations + return m.EnvironmentsCount } - return nil + return 0 } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { +func (m *GetFrameworkInfoReply) GetTasksCount() int32 { if m != nil { - return m.ReconfigureAll + return m.TasksCount } - return false + return 0 } -type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *GetFrameworkInfoReply) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *GetFrameworkInfoReply) GetHostsCount() int32 { + if m != nil { + return m.HostsCount } + return 0 } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) -} - -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { +func (m *GetFrameworkInfoReply) GetInstanceName() string { if m != nil { - return m.Type + return m.InstanceName } - return EnvironmentOperation_NOOP + return "" } -func (m *EnvironmentOperation) GetRoleName() string { +func (m *GetFrameworkInfoReply) GetVersion() *Version { if m != nil { - return m.RoleName + return m.Version } - return "" + return nil } -type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Not implemented yet +type TeardownRequest struct { + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} +func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } +func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } +func (*TeardownRequest) ProtoMessage() {} +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1330,61 +1275,43 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) +func (m *TeardownRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TeardownRequest.Merge(m, src) } -func (m *ModifyEnvironmentReply) XXX_Size() int { +func (m *TeardownRequest) XXX_Size() int { return m.Size() } -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo - -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations - } - return nil +func (m *TeardownRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TeardownRequest.DiscardUnknown(m) } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id - } - return "" -} +var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo -func (m *ModifyEnvironmentReply) GetState() string { +func (m *TeardownRequest) GetReason() string { if m != nil { - return m.State + return m.Reason } return "" } -type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` +type TeardownReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} +func (m *TeardownReply) Reset() { *m = TeardownReply{} } +func (m *TeardownReply) String() string { return proto.CompactTextString(m) } +func (*TeardownReply) ProtoMessage() {} +func (*TeardownReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} } -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1394,65 +1321,80 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) +func (m *TeardownReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_TeardownReply.Merge(m, src) } -func (m *DestroyEnvironmentRequest) XXX_Size() int { +func (m *TeardownReply) XXX_Size() int { return m.Size() } -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) +func (m *TeardownReply) XXX_DiscardUnknown() { + xxx_messageInfo_TeardownReply.DiscardUnknown(m) } -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_TeardownReply proto.InternalMessageInfo -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" +//////////////////////////////////////// +// Environment +//////////////////////////////////////// +type GetEnvironmentsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks - } - return false +func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } +func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentsRequest) ProtoMessage() {} +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } - -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState - } - return false +func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force +func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return false +} +func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) +} +func (m *GetEnvironmentsRequest) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) } -type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` +var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo + +type GetEnvironmentsReply struct { + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} +func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } +func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentsReply) ProtoMessage() {} +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1462,50 +1404,59 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) +func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) } -func (m *DestroyEnvironmentReply) XXX_Size() int { +func (m *GetEnvironmentsReply) XXX_Size() int { return m.Size() } -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) +func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) } -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { +func (m *GetEnvironmentsReply) GetFrameworkId() string { if m != nil { - return m.CleanupTasksReply + return m.FrameworkId + } + return "" +} + +func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if m != nil { + return m.Environments } return nil } -//////////////////////////////////////// -// Environment, GET/SET properties -//////////////////////////////////////// -type SetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If properties == nil, the core sets nothing - // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type EnvironmentInfo struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} +func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } +func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } +func (*EnvironmentInfo) ProtoMessage() {} +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { +func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1515,95 +1466,101 @@ func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnvironmentInfo.Merge(m, src) } -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { +func (m *EnvironmentInfo) XXX_Size() int { return m.Size() } -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) +func (m *EnvironmentInfo) XXX_DiscardUnknown() { + xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo -func (m *SetEnvironmentPropertiesRequest) GetId() string { +func (m *EnvironmentInfo) GetId() string { if m != nil { return m.Id } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { +func (m *EnvironmentInfo) GetCreatedWhen() string { if m != nil { - return m.Properties + return m.CreatedWhen } - return nil + return "" } -type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *EnvironmentInfo) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if m != nil { + return m.Tasks + } + return nil } -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *EnvironmentInfo) GetRootRole() string { + if m != nil { + return m.RootRole } + return "" } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) + +func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if m != nil { + return m.CurrentRunNumber + } + return 0 } -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (m *EnvironmentInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil } -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (m *EnvironmentInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil } -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo +func (m *EnvironmentInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} -type GetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If len(queries) == 0, we return an - // empty map. - // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type NewEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } +func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewEnvironmentRequest) ProtoMessage() {} +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { +func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1613,58 +1570,51 @@ func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) +func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) } -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { +func (m *NewEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) +func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesRequest) GetId() string { +func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { if m != nil { - return m.Id + return m.WorkflowTemplate } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { +func (m *NewEnvironmentRequest) GetVars() map[string]string { if m != nil { - return m.Queries + return m.Vars } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals - } - return false -} - -type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type NewEnvironmentReply struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} +func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } +func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewEnvironmentReply) ProtoMessage() {} +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { +func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1674,53 +1624,44 @@ func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) +func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewEnvironmentReply.Merge(m, src) } -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { +func (m *NewEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) +func (m *NewEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo +var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { +func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.Properties + return m.Environment } return nil } -//////////////////////////////////////// -// Tasks -//////////////////////////////////////// -type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} +func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } +func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentRequest) ProtoMessage() {} +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1730,89 +1671,100 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) +func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) } -func (m *ShortTaskInfo) XXX_Size() int { +func (m *GetEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) +func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo -func (m *ShortTaskInfo) GetName() string { +func (m *GetEnvironmentRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked - } - return false +type GetEnvironmentReply struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId - } - return "" +func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } +func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentReply) ProtoMessage() {} +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } - -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" +func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State +func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentReply.Merge(m, src) +} +func (m *GetEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) } -func (m *ShortTaskInfo) GetClassName() string { +var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo + +func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.ClassName + return m.Environment } - return "" + return nil } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { +func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { if m != nil { - return m.DeploymentInfo + return m.Workflow } return nil } -type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type ControlEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} +func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } +func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*ControlEnvironmentRequest) ProtoMessage() {} +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { +func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1822,64 +1774,53 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) +func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) } -func (m *TaskDeploymentInfo) XXX_Size() int { +func (m *ControlEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo - -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname - } - return "" +func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId - } - return "" -} +var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo -func (m *TaskDeploymentInfo) GetOfferId() string { +func (m *ControlEnvironmentRequest) GetId() string { if m != nil { - return m.OfferId + return m.Id } return "" } -func (m *TaskDeploymentInfo) GetExecutorId() string { +func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { if m != nil { - return m.ExecutorId + return m.Type } - return "" + return ControlEnvironmentRequest_NOOP } -type GetTasksRequest struct { +type ControlEnvironmentReply struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} +func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } +func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*ControlEnvironmentReply) ProtoMessage() {} +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { +func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1889,37 +1830,60 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) +func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) } -func (m *GetTasksRequest) XXX_Size() int { +func (m *ControlEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) +func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo -type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *ControlEnvironmentReply) GetId() string { + if m != nil { + return m.Id + } + return "" } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} +func (m *ControlEnvironmentReply) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { + +func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if m != nil { + return m.CurrentRunNumber + } + return 0 +} + +type ModifyEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } +func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*ModifyEnvironmentRequest) ProtoMessage() {} +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} +} +func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) + return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1929,44 +1893,59 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) +func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) } -func (m *GetTasksReply) XXX_Size() int { +func (m *ModifyEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) +func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { +func (m *ModifyEnvironmentRequest) GetId() string { if m != nil { - return m.Tasks + return m.Id + } + return "" +} + +func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if m != nil { + return m.Operations } return nil } -type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if m != nil { + return m.ReconfigureAll + } + return false } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} +type EnvironmentOperation struct { + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { + +func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } +func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } +func (*EnvironmentOperation) ProtoMessage() {} +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} +} +func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1976,44 +1955,53 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) +func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnvironmentOperation.Merge(m, src) } -func (m *GetTaskRequest) XXX_Size() int { +func (m *EnvironmentOperation) XXX_Size() int { return m.Size() } -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) +func (m *EnvironmentOperation) XXX_DiscardUnknown() { + xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo -func (m *GetTaskRequest) GetTaskId() string { +func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { if m != nil { - return m.TaskId + return m.Type + } + return EnvironmentOperation_NOOP +} + +func (m *EnvironmentOperation) GetRoleName() string { + if m != nil { + return m.RoleName } return "" } -type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type ModifyEnvironmentReply struct { + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} +func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } +func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*ModifyEnvironmentReply) ProtoMessage() {} +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { +func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) + return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2023,45 +2011,61 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) +func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) } -func (m *GetTaskReply) XXX_Size() int { +func (m *ModifyEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) +func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo -func (m *GetTaskReply) GetTask() *TaskInfo { +func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { if m != nil { - return m.Task + return m.FailedOperations } return nil } -type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` +func (m *ModifyEnvironmentReply) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *ModifyEnvironmentReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +type DestroyEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} +func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } +func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*DestroyEnvironmentRequest) ProtoMessage() {} +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { +func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2071,55 +2075,65 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) +func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) } -func (m *TaskClassInfo) XXX_Size() int { +func (m *DestroyEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) +func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo -func (m *TaskClassInfo) GetName() string { +func (m *DestroyEnvironmentRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *TaskClassInfo) GetControlMode() string { +func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { if m != nil { - return m.ControlMode + return m.KeepTasks } - return "" + return false } -type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if m != nil { + return m.AllowInRunningState + } + return false } -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} +func (m *DestroyEnvironmentRequest) GetForce() bool { + if m != nil { + return m.Force + } + return false } -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { + +type DestroyEnvironmentReply struct { + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } +func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*DestroyEnvironmentReply) ProtoMessage() {} +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} +} +func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2129,74 +2143,148 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) +func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) } -func (m *CommandInfo) XXX_Size() int { +func (m *DestroyEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) +func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo -func (m *CommandInfo) GetEnv() []string { +func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { if m != nil { - return m.Env + return m.CleanupTasksReply } return nil } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell +//////////////////////////////////////// +// Environment, GET/SET properties +//////////////////////////////////////// +type SetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } +func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} +} +func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return false +} +func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) } -func (m *CommandInfo) GetValue() string { +var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *SetEnvironmentPropertiesRequest) GetId() string { if m != nil { - return m.Value + return m.Id } return "" } -func (m *CommandInfo) GetArguments() []string { +func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { if m != nil { - return m.Arguments + return m.Properties } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +type SetEnvironmentPropertiesReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } +func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} +} +func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *SetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) } -type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` +var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo + +type GetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} +func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } +func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2206,65 +2294,58 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) +func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) } -func (m *ChannelInfo) XXX_Size() int { +func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { return m.Size() } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) +func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo -func (m *ChannelInfo) GetName() string { +func (m *GetEnvironmentPropertiesRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *ChannelInfo) GetType() string { +func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { if m != nil { - return m.Type + return m.Queries } - return "" + return nil } -func (m *ChannelInfo) GetTarget() string { +func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { if m != nil { - return m.Target + return m.ExcludeGlobals } - return "" + return false } -type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type GetEnvironmentPropertiesReply struct { + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} +func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } +func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2274,93 +2355,145 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) +func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) } -func (m *TaskInfo) XXX_Size() int { +func (m *GetEnvironmentPropertiesReply) XXX_Size() int { return m.Size() } -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) +func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) } -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { +func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { if m != nil { - return m.ShortInfo + return m.Properties } return nil } -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +//////////////////////////////////////// +// Tasks +//////////////////////////////////////// +type ShortTaskInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } +func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } +func (*ShortTaskInfo) ProtoMessage() {} +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} +} +func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return nil +} +func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShortTaskInfo.Merge(m, src) +} +func (m *ShortTaskInfo) XXX_Size() int { + return m.Size() +} +func (m *ShortTaskInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { +var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo + +func (m *ShortTaskInfo) GetName() string { if m != nil { - return m.InboundChannels + return m.Name } - return nil + return "" } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { +func (m *ShortTaskInfo) GetLocked() bool { if m != nil { - return m.OutboundChannels + return m.Locked } - return nil + return false } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { +func (m *ShortTaskInfo) GetTaskId() string { if m != nil { - return m.CommandInfo + return m.TaskId } - return nil + return "" } -func (m *TaskInfo) GetTaskPath() string { +func (m *ShortTaskInfo) GetStatus() string { if m != nil { - return m.TaskPath + return m.Status } return "" } -func (m *TaskInfo) GetEnvId() string { +func (m *ShortTaskInfo) GetState() string { if m != nil { - return m.EnvId + return m.State } return "" } -func (m *TaskInfo) GetProperties() map[string]string { +func (m *ShortTaskInfo) GetClassName() string { if m != nil { - return m.Properties + return m.ClassName + } + return "" +} + +func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if m != nil { + return m.DeploymentInfo } return nil } -type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` +type TaskDeploymentInfo struct { + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} +func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } +func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } +func (*TaskDeploymentInfo) ProtoMessage() {} +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { +func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2370,45 +2503,64 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) +func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) } -func (m *CleanupTasksRequest) XXX_Size() int { +func (m *TaskDeploymentInfo) XXX_Size() int { return m.Size() } -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) +func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo -func (m *CleanupTasksRequest) GetTaskIds() []string { +func (m *TaskDeploymentInfo) GetHostname() string { if m != nil { - return m.TaskIds + return m.Hostname } - return nil + return "" } -type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *TaskDeploymentInfo) GetAgentId() string { + if m != nil { + return m.AgentId + } + return "" } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} +func (m *TaskDeploymentInfo) GetOfferId() string { + if m != nil { + return m.OfferId + } + return "" } -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { + +func (m *TaskDeploymentInfo) GetExecutorId() string { + if m != nil { + return m.ExecutorId + } + return "" +} + +type GetTasksRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } +func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } +func (*GetTasksRequest) ProtoMessage() {} +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} +} +func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2418,55 +2570,84 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) +func (m *GetTasksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTasksRequest.Merge(m, src) } -func (m *CleanupTasksReply) XXX_Size() int { +func (m *GetTasksRequest) XXX_Size() int { return m.Size() } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) +func (m *GetTasksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +type GetTasksReply struct { + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } +func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } +func (*GetTasksReply) ProtoMessage() {} +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} +} +func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return nil +} +func (m *GetTasksReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTasksReply.Merge(m, src) +} +func (m *GetTasksReply) XXX_Size() int { + return m.Size() +} +func (m *GetTasksReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetTasksReply.DiscardUnknown(m) } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { +var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo + +func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { if m != nil { - return m.RunningTasks + return m.Tasks } return nil } -//////////////////////////////////////// -// Roles -//////////////////////////////////////// -type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` +type GetTaskRequest struct { + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} +func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } +func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } +func (*GetTaskRequest) ProtoMessage() {} +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { +func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2476,59 +2657,44 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) +func (m *GetTaskRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTaskRequest.Merge(m, src) } -func (m *GetRolesRequest) XXX_Size() int { +func (m *GetTaskRequest) XXX_Size() int { return m.Size() } -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) +func (m *GetTaskRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo - -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId - } - return "" -} +var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo -func (m *GetRolesRequest) GetPathSpec() string { +func (m *GetTaskRequest) GetTaskId() string { if m != nil { - return m.PathSpec + return m.TaskId } return "" } -type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetTaskReply struct { + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} +func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } +func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } +func (*GetTaskReply) ProtoMessage() {} +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { +func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2538,100 +2704,45 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) +func (m *GetTaskReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTaskReply.Merge(m, src) } -func (m *RoleInfo) XXX_Size() int { +func (m *GetTaskReply) XXX_Size() int { return m.Size() } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo - -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" -} - -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State - } - return "" -} - -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath - } - return "" -} - -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds - } - return nil -} - -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles - } - return nil -} - -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults - } - return nil +func (m *GetTaskReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetTaskReply.DiscardUnknown(m) } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil -} +var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo -func (m *RoleInfo) GetUserVars() map[string]string { +func (m *GetTaskReply) GetTask() *TaskInfo { if m != nil { - return m.UserVars + return m.Task } return nil } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TaskClassInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} +func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } +func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } +func (*TaskClassInfo) ProtoMessage() {} +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { +func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2641,47 +2752,55 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) +func (m *TaskClassInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskClassInfo.Merge(m, src) } -func (m *GetRolesReply) XXX_Size() int { +func (m *TaskClassInfo) XXX_Size() int { return m.Size() } -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) +func (m *TaskClassInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo -func (m *GetRolesReply) GetRoles() []*RoleInfo { +func (m *TaskClassInfo) GetName() string { if m != nil { - return m.Roles + return m.Name } - return nil + return "" } -type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` +func (m *TaskClassInfo) GetControlMode() string { + if m != nil { + return m.ControlMode + } + return "" +} + +type CommandInfo struct { + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} +func (m *CommandInfo) Reset() { *m = CommandInfo{} } +func (m *CommandInfo) String() string { return proto.CompactTextString(m) } +func (*CommandInfo) ProtoMessage() {} +func (*CommandInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { +func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2691,67 +2810,74 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) +func (m *CommandInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommandInfo.Merge(m, src) } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { +func (m *CommandInfo) XXX_Size() int { return m.Size() } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) +func (m *CommandInfo) XXX_DiscardUnknown() { + xxx_messageInfo_CommandInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +var xxx_messageInfo_CommandInfo proto.InternalMessageInfo -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { +func (m *CommandInfo) GetEnv() []string { if m != nil { - return m.RepoPattern + return m.Env } - return "" + return nil } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { +func (m *CommandInfo) GetShell() bool { if m != nil { - return m.RevisionPattern + return m.Shell + } + return false +} + +func (m *CommandInfo) GetValue() string { + if m != nil { + return m.Value } return "" } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { +func (m *CommandInfo) GetArguments() []string { if m != nil { - return m.AllBranches + return m.Arguments } - return false + return nil } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { +func (m *CommandInfo) GetUser() string { if m != nil { - return m.AllTags + return m.User } - return false + return "" } -type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` +type ChannelInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} +func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } +func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } +func (*ChannelInfo) ProtoMessage() {} +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { +func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2761,58 +2887,65 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) +func (m *ChannelInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChannelInfo.Merge(m, src) } -func (m *WorkflowTemplateInfo) XXX_Size() int { +func (m *ChannelInfo) XXX_Size() int { return m.Size() } -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) +func (m *ChannelInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ChannelInfo.DiscardUnknown(m) } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo +var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo -func (m *WorkflowTemplateInfo) GetRepo() string { +func (m *ChannelInfo) GetName() string { if m != nil { - return m.Repo + return m.Name } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { +func (m *ChannelInfo) GetType() string { if m != nil { - return m.Template + return m.Type } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { +func (m *ChannelInfo) GetTarget() string { if m != nil { - return m.Revision + return m.Target } return "" } -type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TaskInfo struct { + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} +func (m *TaskInfo) Reset() { *m = TaskInfo{} } +func (m *TaskInfo) String() string { return proto.CompactTextString(m) } +func (*TaskInfo) ProtoMessage() {} +func (*TaskInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { +func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2822,85 +2955,93 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) +func (m *TaskInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskInfo.Merge(m, src) } -func (m *GetWorkflowTemplatesReply) XXX_Size() int { +func (m *TaskInfo) XXX_Size() int { return m.Size() } -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) +func (m *TaskInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +var xxx_messageInfo_TaskInfo proto.InternalMessageInfo -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { +func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { if m != nil { - return m.WorkflowTemplates + return m.ShortInfo } return nil } -type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *TaskInfo) GetClassInfo() *TaskClassInfo { + if m != nil { + return m.ClassInfo + } + return nil } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { + if m != nil { + return m.InboundChannels + } + return nil } -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if m != nil { + return m.OutboundChannels } + return nil } -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) + +func (m *TaskInfo) GetCommandInfo() *CommandInfo { + if m != nil { + return m.CommandInfo + } + return nil } -func (m *ListReposRequest) XXX_Size() int { - return m.Size() + +func (m *TaskInfo) GetTaskPath() string { + if m != nil { + return m.TaskPath + } + return "" } -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + +func (m *TaskInfo) GetEnvId() string { + if m != nil { + return m.EnvId + } + return "" } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo +func (m *TaskInfo) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} -type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +type CleanupTasksRequest struct { + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} +func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } +func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } +func (*CleanupTasksRequest) ProtoMessage() {} +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { +func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2910,59 +3051,45 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) +func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CleanupTasksRequest.Merge(m, src) } -func (m *RepoInfo) XXX_Size() int { +func (m *CleanupTasksRequest) XXX_Size() int { return m.Size() } -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo - -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name - } - return "" +func (m *CleanupTasksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default - } - return false -} +var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo -func (m *RepoInfo) GetDefaultRevision() string { +func (m *CleanupTasksRequest) GetTaskIds() []string { if m != nil { - return m.DefaultRevision + return m.TaskIds } - return "" + return nil } -type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type CleanupTasksReply struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} +func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } +func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } +func (*CleanupTasksReply) ProtoMessage() {} +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { +func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) + return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2972,52 +3099,55 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) +func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_CleanupTasksReply.Merge(m, src) } -func (m *ListReposReply) XXX_Size() int { +func (m *CleanupTasksReply) XXX_Size() int { return m.Size() } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) +func (m *CleanupTasksReply) XXX_DiscardUnknown() { + xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo -func (m *ListReposReply) GetRepos() []*RepoInfo { +func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { if m != nil { - return m.Repos + return m.KilledTasks } return nil } -func (m *ListReposReply) GetGlobalDefaultRevision() string { +func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { if m != nil { - return m.GlobalDefaultRevision + return m.RunningTasks } - return "" + return nil } -type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +//////////////////////////////////////// +// Roles +//////////////////////////////////////// +type GetRolesRequest struct { + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} +func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } +func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } +func (*GetRolesRequest) ProtoMessage() {} +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { +func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3027,52 +3157,59 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) +func (m *GetRolesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRolesRequest.Merge(m, src) } -func (m *AddRepoRequest) XXX_Size() int { +func (m *GetRolesRequest) XXX_Size() int { return m.Size() } -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) +func (m *GetRolesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo +var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo -func (m *AddRepoRequest) GetName() string { +func (m *GetRolesRequest) GetEnvId() string { if m != nil { - return m.Name + return m.EnvId } return "" } -func (m *AddRepoRequest) GetDefaultRevision() string { +func (m *GetRolesRequest) GetPathSpec() string { if m != nil { - return m.DefaultRevision + return m.PathSpec } return "" } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type RoleInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} +func (m *RoleInfo) Reset() { *m = RoleInfo{} } +func (m *RoleInfo) String() string { return proto.CompactTextString(m) } +func (*RoleInfo) ProtoMessage() {} +func (*RoleInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { +func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3082,98 +3219,100 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) +func (m *RoleInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_RoleInfo.Merge(m, src) } -func (m *AddRepoReply) XXX_Size() int { +func (m *RoleInfo) XXX_Size() int { return m.Size() } -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) +func (m *RoleInfo) XXX_DiscardUnknown() { + xxx_messageInfo_RoleInfo.DiscardUnknown(m) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +var xxx_messageInfo_RoleInfo proto.InternalMessageInfo -func (m *AddRepoReply) GetNewDefaultRevision() string { +func (m *RoleInfo) GetName() string { if m != nil { - return m.NewDefaultRevision + return m.Name } return "" } -func (m *AddRepoReply) GetInfo() string { +func (m *RoleInfo) GetStatus() string { if m != nil { - return m.Info + return m.Status } return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *RoleInfo) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *RoleInfo) GetFullPath() string { + if m != nil { + return m.FullPath } + return "" } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) + +func (m *RoleInfo) GetTaskIds() []string { + if m != nil { + return m.TaskIds + } + return nil } -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() + +func (m *RoleInfo) GetRoles() []*RoleInfo { + if m != nil { + return m.Roles + } + return nil } -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (m *RoleInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +func (m *RoleInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} -func (m *RemoveRepoRequest) GetIndex() int32 { +func (m *RoleInfo) GetUserVars() map[string]string { if m != nil { - return m.Index + return m.UserVars } - return 0 + return nil } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetRolesReply struct { + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} +func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } +func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } +func (*GetRolesReply) ProtoMessage() {} +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { +func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3183,44 +3322,47 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) +func (m *GetRolesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRolesReply.Merge(m, src) } -func (m *RemoveRepoReply) XXX_Size() int { +func (m *GetRolesReply) XXX_Size() int { return m.Size() } -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) +func (m *GetRolesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetRolesReply.DiscardUnknown(m) } -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo +var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetNewDefaultRepo() string { +func (m *GetRolesReply) GetRoles() []*RoleInfo { if m != nil { - return m.NewDefaultRepo + return m.Roles } - return "" + return nil } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +type GetWorkflowTemplatesRequest struct { + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} +func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } +func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { +func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3230,44 +3372,67 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) +func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) } -func (m *RefreshReposRequest) XXX_Size() int { +func (m *GetWorkflowTemplatesRequest) XXX_Size() int { return m.Size() } -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) +func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo +var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo -func (m *RefreshReposRequest) GetIndex() int32 { +func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { if m != nil { - return m.Index + return m.RepoPattern } - return 0 + return "" } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if m != nil { + return m.RevisionPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if m != nil { + return m.AllBranches + } + return false +} + +func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { + if m != nil { + return m.AllTags + } + return false +} + +type WorkflowTemplateInfo struct { + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} +func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } +func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } +func (*WorkflowTemplateInfo) ProtoMessage() {} +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { +func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3277,44 +3442,58 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) +func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) } -func (m *SetDefaultRepoRequest) XXX_Size() int { +func (m *WorkflowTemplateInfo) XXX_Size() int { return m.Size() } -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) +func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { + xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo -func (m *SetDefaultRepoRequest) GetIndex() int32 { +func (m *WorkflowTemplateInfo) GetRepo() string { if m != nil { - return m.Index + return m.Repo } - return 0 + return "" } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *WorkflowTemplateInfo) GetTemplate() string { + if m != nil { + return m.Template + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} +func (m *WorkflowTemplateInfo) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + +type GetWorkflowTemplatesReply struct { + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } +func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } +func (*GetWorkflowTemplatesReply) ProtoMessage() {} +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} +} +func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3324,45 +3503,43 @@ func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) +func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) } -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { +func (m *GetWorkflowTemplatesReply) XXX_Size() int { return m.Size() } -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) +func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) } -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo +var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { +func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { if m != nil { - return m.Revision + return m.WorkflowTemplates } - return "" + return nil } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` +type ListReposRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} +func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } +func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } +func (*ListReposRequest) ProtoMessage() {} +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { +func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3372,51 +3549,39 @@ func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) +func (m *ListReposRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReposRequest.Merge(m, src) } -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { +func (m *ListReposRequest) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo - -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index - } - return 0 +func (m *ListReposRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListReposRequest.DiscardUnknown(m) } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision - } - return "" -} +var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` +type RepoInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} +func (m *RepoInfo) Reset() { *m = RepoInfo{} } +func (m *RepoInfo) String() string { return proto.CompactTextString(m) } +func (*RepoInfo) ProtoMessage() {} +func (*RepoInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { +func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3426,43 +3591,59 @@ func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) +func (m *RepoInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_RepoInfo.Merge(m, src) } -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { +func (m *RepoInfo) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) +func (m *RepoInfo) XXX_DiscardUnknown() { + xxx_messageInfo_RepoInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +var xxx_messageInfo_RepoInfo proto.InternalMessageInfo -func (m *SetRepoDefaultRevisionReply) GetInfo() string { +func (m *RepoInfo) GetName() string { if m != nil { - return m.Info + return m.Name } return "" } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *RepoInfo) GetDefault() bool { + if m != nil { + return m.Default + } + return false } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} +func (m *RepoInfo) GetDefaultRevision() string { + if m != nil { + return m.DefaultRevision + } + return "" } -func (m *Empty) XXX_Unmarshal(b []byte) error { + +type ListReposReply struct { + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListReposReply) Reset() { *m = ListReposReply{} } +func (m *ListReposReply) String() string { return proto.CompactTextString(m) } +func (*ListReposReply) ProtoMessage() {} +func (*ListReposReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} +} +func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3472,1524 +3653,1706 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) +func (m *ListReposReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReposReply.Merge(m, src) } -func (m *Empty) XXX_Size() int { +func (m *ListReposReply) XXX_Size() int { return m.Size() } -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) +func (m *ListReposReply) XXX_DiscardUnknown() { + xxx_messageInfo_ListReposReply.DiscardUnknown(m) } -var xxx_messageInfo_Empty proto.InternalMessageInfo +var xxx_messageInfo_ListReposReply proto.InternalMessageInfo -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") +func (m *ListReposReply) GetRepos() []*RepoInfo { + if m != nil { + return m.Repos + } + return nil } -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, - 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, - 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, - 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, - 0xd8, 0x69, 0x1e, 0x78, 0xe3, 0x0d, 0x21, 0xb4, 0xe2, 0x85, 0x57, 0x84, 0xf8, 0x0e, 0x3c, 0x20, - 0xf1, 0x8a, 0x10, 0x08, 0x3e, 0x02, 0x2a, 0x12, 0xcf, 0x7c, 0x04, 0x74, 0xff, 0xcd, 0xdc, 0x19, - 0xcf, 0x38, 0x29, 0x68, 0x5f, 0x78, 0xf3, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xdf, 0x7b, 0xce, 0xbd, - 0x63, 0x58, 0x1a, 0xb8, 0x8e, 0xef, 0x78, 0x77, 0x9d, 0xcd, 0x96, 0x63, 0xfb, 0xae, 0x63, 0x6d, - 0x30, 0x04, 0x2a, 0x06, 0x08, 0xbc, 0x04, 0x8b, 0xb5, 0x11, 0xb1, 0xfd, 0xd7, 0xfb, 0xc4, 0x73, - 0xbc, 0x27, 0xc4, 0x74, 0xfd, 0x23, 0x62, 0xfa, 0x78, 0x0e, 0x66, 0x0f, 0x7d, 0xd3, 0x1f, 0x7a, - 0x06, 0x79, 0x33, 0x24, 0x9e, 0x8f, 0x8f, 0xa0, 0x24, 0x11, 0x03, 0xeb, 0x0c, 0x2d, 0x42, 0xce, - 0xf3, 0x4d, 0x9f, 0xe8, 0xda, 0x9a, 0xb6, 0x5e, 0x34, 0x38, 0x80, 0x1e, 0xc2, 0xac, 0xc7, 0x88, - 0x9e, 0x0f, 0xda, 0xa6, 0x4f, 0x3c, 0x3d, 0xb3, 0x36, 0xbd, 0x5e, 0xda, 0xbc, 0xb2, 0x11, 0x6a, - 0x70, 0xa8, 0xac, 0x1b, 0x51, 0x6a, 0xfc, 0x17, 0x0d, 0x66, 0xd4, 0x75, 0xf4, 0x09, 0xe4, 0x2c, - 0x32, 0x22, 0x16, 0xdb, 0xa5, 0xbc, 0x79, 0x3d, 0x45, 0xce, 0xc6, 0x53, 0x4a, 0x64, 0x70, 0x5a, - 0xb4, 0x07, 0xe5, 0x7e, 0xc4, 0x18, 0x3d, 0xb3, 0xa6, 0xad, 0x97, 0x36, 0x57, 0x15, 0xee, 0x24, - 0x9b, 0x9f, 0x4c, 0x19, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x6e, 0x6d, - 0xfb, 0x79, 0xbd, 0x32, 0x85, 0x0a, 0x90, 0xdd, 0x3b, 0x78, 0xdc, 0xa8, 0x68, 0xa8, 0x04, 0xf9, - 0x97, 0x5b, 0xc6, 0xc1, 0xde, 0x41, 0xbd, 0x92, 0xa1, 0x14, 0x35, 0xc3, 0x68, 0x18, 0x95, 0xe9, - 0xed, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0c, 0x57, 0xea, 0xc4, 0x7f, 0xec, 0x9a, 0x7d, 0x72, 0xea, - 0xb8, 0x27, 0x7b, 0x76, 0xc7, 0x91, 0xee, 0xfc, 0x8d, 0x06, 0xf9, 0x17, 0xc4, 0xf5, 0x7a, 0x8e, - 0x4d, 0x7d, 0xd9, 0x37, 0xbf, 0x72, 0x5c, 0x66, 0x65, 0xce, 0xe0, 0x00, 0xc3, 0xf6, 0x6c, 0xc7, - 0x65, 0xda, 0x53, 0x2c, 0x05, 0x28, 0x76, 0x60, 0xfa, 0xad, 0xae, 0x3e, 0xcd, 0xb1, 0x0c, 0xa0, - 0xd8, 0xa3, 0x61, 0xcf, 0x6a, 0xeb, 0x59, 0x1e, 0x0d, 0x06, 0xa0, 0x35, 0x28, 0x0d, 0x5c, 0xa7, - 0x3d, 0x6c, 0xf9, 0x07, 0x66, 0x9f, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x0a, 0xc0, 0x88, 0x2b, - 0x71, 0xe8, 0xbb, 0xfa, 0x25, 0x46, 0xa0, 0x60, 0xf0, 0x2f, 0x32, 0x70, 0x79, 0xdc, 0x02, 0x1a, - 0xff, 0x35, 0x28, 0x75, 0x02, 0x6c, 0x5b, 0x64, 0x81, 0x8a, 0x42, 0x1f, 0xc1, 0x3c, 0xb1, 0x47, - 0x3d, 0xd7, 0xb1, 0xfb, 0xc4, 0xf6, 0xbd, 0x1d, 0x67, 0x68, 0xfb, 0xc2, 0x96, 0xf1, 0x05, 0xaa, - 0x89, 0x6f, 0x7a, 0x27, 0x82, 0x8c, 0x1b, 0xa7, 0x60, 0xc2, 0x7c, 0xcb, 0xaa, 0xf9, 0xb6, 0x02, - 0xd0, 0x75, 0x3c, 0x29, 0x3c, 0xc7, 0xb9, 0x42, 0x0c, 0xc2, 0x30, 0xd3, 0xb3, 0x3d, 0xdf, 0xb4, - 0x5b, 0x84, 0xb9, 0x80, 0x5b, 0x18, 0xc1, 0xa1, 0x8f, 0x20, 0x2f, 0x2c, 0xd6, 0xf3, 0x2c, 0x4f, - 0x90, 0x92, 0x27, 0x22, 0x44, 0x86, 0x24, 0xc1, 0xb7, 0x61, 0xae, 0x49, 0x4c, 0xb7, 0xed, 0x9c, - 0xda, 0x22, 0x94, 0x68, 0x09, 0x2e, 0xb9, 0xc4, 0xf4, 0x1c, 0x5b, 0x78, 0x41, 0x40, 0xb4, 0x84, - 0x42, 0xd2, 0x81, 0x75, 0x86, 0x75, 0x58, 0xaa, 0x13, 0xbf, 0xa6, 0xd8, 0x2e, 0xb3, 0xe1, 0x2d, - 0x2c, 0x8e, 0xad, 0x5c, 0xcc, 0xcb, 0x5f, 0xc2, 0x8c, 0xea, 0x4c, 0x51, 0x70, 0x55, 0x35, 0xd5, - 0xc3, 0x65, 0x16, 0xbe, 0x08, 0x3d, 0xfe, 0x53, 0x16, 0xe6, 0x62, 0x14, 0xa8, 0x0c, 0x99, 0x9e, - 0xdc, 0x2c, 0xd3, 0x63, 0x79, 0xd4, 0x72, 0x89, 0xe9, 0x93, 0xf6, 0xcb, 0x2e, 0xb1, 0x59, 0x0c, - 0x8b, 0x86, 0x8a, 0x0a, 0xa3, 0x33, 0xad, 0x46, 0x67, 0x03, 0x72, 0x2c, 0x82, 0x7a, 0x96, 0x29, - 0xa5, 0xab, 0xd5, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa3, 0x38, 0x19, 0xaa, 0x42, 0xc1, - 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x99, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, 0x62, - 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0xcf, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, 0xa1, - 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xfb, 0x63, 0x63, 0x57, - 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, 0x02, - 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, 0x97, - 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, 0x23, - 0xaa, 0xa1, 0x0a, 0x4c, 0x9f, 0x90, 0x33, 0x11, 0x17, 0xfa, 0x93, 0xba, 0x7d, 0x64, 0x5a, 0x43, - 0x22, 0x42, 0xc2, 0x81, 0x07, 0x99, 0xfb, 0x5a, 0xf5, 0x33, 0x28, 0x06, 0x32, 0xdf, 0x8b, 0xf1, - 0x73, 0x98, 0x8d, 0x28, 0xf4, 0x3e, 0xcc, 0xf8, 0xf7, 0x1a, 0x5c, 0x3e, 0x20, 0xa7, 0x8a, 0x85, - 0xb2, 0x46, 0xee, 0x40, 0x85, 0x26, 0x6c, 0xc7, 0x72, 0x4e, 0x9b, 0xa4, 0x3f, 0xb0, 0xc2, 0xce, - 0x31, 0x86, 0x47, 0x5f, 0x0a, 0xc7, 0xf3, 0x54, 0xbe, 0xa3, 0xb8, 0x2e, 0x51, 0x76, 0xdc, 0xfd, - 0xff, 0xb1, 0xed, 0xf8, 0x10, 0x16, 0xe2, 0x3b, 0xd0, 0x22, 0xfc, 0x02, 0x4a, 0x4a, 0xc9, 0x30, - 0x51, 0x93, 0x2b, 0x4c, 0x25, 0xc7, 0x1f, 0xb0, 0x13, 0x34, 0xc1, 0x25, 0xb1, 0x2a, 0xc3, 0x3f, - 0xd5, 0x60, 0x21, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x42, 0x41, 0x3a, 0x58, 0xb4, 0xc1, 0x05, - 0x85, 0x95, 0x96, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xde, 0xe1, 0xcb, 0xe7, 0x2b, - 0x8d, 0x1e, 0x41, 0xd6, 0x3f, 0x1b, 0x70, 0x5f, 0x96, 0x37, 0x3f, 0x54, 0x44, 0xa7, 0xca, 0xd8, - 0x68, 0x0c, 0x28, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xfb, 0xea, 0x41, 0xa3, 0xf1, - 0xac, 0x32, 0x85, 0x10, 0x94, 0x0f, 0x9b, 0x5b, 0x46, 0xf3, 0xf5, 0xd6, 0x4e, 0x73, 0xef, 0xc5, - 0x5e, 0xf3, 0x87, 0x15, 0x0d, 0xcd, 0xc3, 0xec, 0x61, 0xb3, 0xf1, 0x2c, 0x44, 0x65, 0xd0, 0x2c, - 0x14, 0x77, 0x1a, 0x07, 0x8f, 0xf7, 0xea, 0xcf, 0x8d, 0x5a, 0x65, 0x9a, 0x36, 0x60, 0xa3, 0x76, - 0x58, 0x6b, 0x56, 0xb2, 0x68, 0x06, 0x0a, 0xf5, 0xc6, 0x6b, 0xde, 0x8e, 0x73, 0xf8, 0x04, 0xae, - 0x24, 0x29, 0x43, 0x7d, 0x1b, 0x37, 0x27, 0x38, 0xc7, 0x32, 0xea, 0x39, 0x96, 0x74, 0xf6, 0x4c, - 0x27, 0x9f, 0x3d, 0xf8, 0x97, 0x1a, 0xe8, 0xfb, 0x4e, 0xbb, 0xd7, 0x39, 0xbb, 0x90, 0xf7, 0xc0, - 0x19, 0x10, 0xd7, 0xf4, 0x7b, 0x8e, 0x2d, 0xf3, 0x7d, 0x35, 0x39, 0xb2, 0x0d, 0x49, 0x67, 0x28, - 0x2c, 0xe8, 0x16, 0x94, 0x5d, 0xd2, 0x72, 0xec, 0x4e, 0xef, 0x78, 0xe8, 0x92, 0x2d, 0xcb, 0x62, - 0x7a, 0x15, 0x8c, 0x18, 0x16, 0xff, 0x5a, 0x83, 0xc5, 0x24, 0x61, 0xe8, 0x81, 0x88, 0x1f, 0x9f, - 0xaf, 0x6e, 0x9d, 0xb3, 0x77, 0x24, 0x74, 0xfc, 0xb8, 0xb6, 0x78, 0x63, 0xcd, 0xc8, 0xe3, 0x9a, - 0xc3, 0xf8, 0x5e, 0x42, 0x58, 0xe7, 0xa0, 0x64, 0xd4, 0xf6, 0x1b, 0x2f, 0x6a, 0xaf, 0x8d, 0xc6, - 0x53, 0x1a, 0xb1, 0x19, 0x28, 0x6c, 0xed, 0xee, 0x72, 0x28, 0x8b, 0x7f, 0xa6, 0xc1, 0x52, 0x82, - 0xe7, 0x68, 0x98, 0xbe, 0x07, 0x95, 0x8e, 0xd9, 0xb3, 0x48, 0xbb, 0x11, 0x7a, 0x4b, 0xbb, 0x98, - 0xb7, 0xc6, 0x18, 0x45, 0x10, 0x32, 0xe3, 0x31, 0x57, 0x7b, 0x17, 0xfe, 0x5a, 0x83, 0xe5, 0x5d, - 0xe2, 0xf9, 0xae, 0x73, 0x91, 0x40, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0xeb, 0x76, 0x19, - 0x16, 0x82, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, 0x76, - 0xcf, 0x3e, 0x3e, 0x0c, 0xf6, 0x2b, 0x18, 0x49, 0x4b, 0x54, 0xa7, 0x8e, 0xe3, 0xb6, 0xf8, 0xb4, - 0x53, 0x30, 0x38, 0x80, 0x09, 0x5c, 0x49, 0x52, 0x89, 0x7a, 0xe8, 0xbb, 0x30, 0xdf, 0xb2, 0x88, - 0x69, 0x0f, 0xf9, 0x96, 0x0c, 0x29, 0x8e, 0x8a, 0x6b, 0x6a, 0x51, 0xc6, 0x69, 0x8c, 0x71, 0x36, - 0xfc, 0x67, 0x0d, 0x56, 0x0f, 0x23, 0x07, 0xd1, 0x33, 0x97, 0xe6, 0x9c, 0xdf, 0x23, 0x5e, 0x9a, - 0x03, 0x5e, 0x01, 0x0c, 0x02, 0x22, 0x91, 0xc9, 0x0f, 0xd4, 0x7e, 0x3f, 0x59, 0xde, 0x46, 0x88, - 0xe1, 0x27, 0xb9, 0x22, 0xad, 0xfa, 0x10, 0xe6, 0x62, 0xcb, 0xef, 0x75, 0xaa, 0xaf, 0xc2, 0xf5, - 0xf4, 0xdd, 0xa9, 0xbd, 0x1e, 0xac, 0xd6, 0xdf, 0xd3, 0x5c, 0x1d, 0xf2, 0x6f, 0x86, 0xc4, 0x95, - 0xb6, 0x16, 0x0d, 0x09, 0xd2, 0x8a, 0x24, 0x6f, 0x5b, 0xd6, 0xb0, 0x4d, 0xea, 0x96, 0x73, 0x64, - 0x5a, 0x9e, 0xac, 0xc8, 0x28, 0x16, 0xff, 0x4e, 0x83, 0xeb, 0xf5, 0x49, 0x6a, 0xa1, 0x1f, 0x44, - 0x5c, 0xca, 0xd3, 0xfd, 0xbe, 0xe2, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x43, 0xff, 0xa9, 0xc1, 0x6c, - 0x64, 0x7e, 0x43, 0x08, 0xb2, 0x36, 0x3d, 0x05, 0x38, 0x3b, 0xfb, 0x4d, 0xa7, 0x62, 0xcb, 0x69, - 0x9d, 0x90, 0xb6, 0xa8, 0x07, 0x01, 0x51, 0x3c, 0x9d, 0xf6, 0xf6, 0xda, 0xa2, 0xde, 0x04, 0x44, - 0xf1, 0xfc, 0x32, 0x28, 0x26, 0x7c, 0x01, 0x85, 0xe5, 0x99, 0x53, 0x8f, 0xe4, 0x6b, 0x50, 0x6c, - 0x59, 0xa6, 0xe7, 0x29, 0x53, 0x7d, 0x88, 0x40, 0x35, 0x28, 0xb7, 0xc9, 0xc0, 0x72, 0xce, 0x64, - 0x4f, 0x14, 0x93, 0xbd, 0x7a, 0x7f, 0xa4, 0xca, 0xef, 0x46, 0x88, 0x8c, 0x18, 0x13, 0xed, 0xc8, - 0x68, 0x9c, 0x8c, 0x9e, 0x7b, 0xf4, 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x34, 0x31, 0xcc, 0x63, 0x4a, - 0x28, 0x4f, 0x18, 0x09, 0xd2, 0x15, 0xa7, 0xd3, 0x21, 0x6e, 0x60, 0xb8, 0x04, 0xe9, 0x25, 0x86, - 0xbc, 0x25, 0xad, 0xa1, 0xef, 0xd0, 0x45, 0x6e, 0xbd, 0x82, 0xc1, 0xf3, 0x30, 0x57, 0x27, 0xbe, - 0x28, 0x50, 0x7e, 0x5f, 0x78, 0x04, 0xb3, 0x21, 0x8a, 0x26, 0x4b, 0x30, 0x6a, 0x6b, 0x17, 0x1a, - 0xb5, 0xf1, 0x3a, 0x94, 0x85, 0x00, 0xe5, 0x16, 0x23, 0xe2, 0xa2, 0xa9, 0x71, 0xc1, 0x9f, 0xc1, - 0x4c, 0x40, 0x49, 0x77, 0xfa, 0x00, 0xb2, 0x74, 0x45, 0x1c, 0x2e, 0x0b, 0x31, 0x8f, 0xb2, 0x3d, - 0x18, 0x01, 0xae, 0xc1, 0x2c, 0xc5, 0xec, 0xd0, 0xa8, 0xa4, 0x66, 0x09, 0xbd, 0x5a, 0x70, 0xf6, - 0x7d, 0xa7, 0x4d, 0x82, 0xab, 0x45, 0x88, 0xc2, 0x3f, 0x81, 0xd2, 0x8e, 0xd3, 0xef, 0x9b, 0x76, - 0x9b, 0x09, 0xa9, 0xc0, 0x34, 0xb1, 0x47, 0xcc, 0xcc, 0xa2, 0x41, 0x7f, 0xb2, 0x04, 0xe9, 0x12, - 0xcb, 0x12, 0x79, 0xc6, 0x81, 0x30, 0x7d, 0xa7, 0x95, 0xf4, 0xa5, 0x69, 0x63, 0xba, 0xc7, 0x43, - 0x7e, 0x55, 0xca, 0x32, 0x19, 0x21, 0x82, 0x2a, 0x48, 0xa7, 0x6f, 0x91, 0x69, 0xec, 0x37, 0xde, - 0x87, 0xd2, 0x4e, 0xd7, 0xb4, 0x6d, 0x62, 0xa5, 0xda, 0x80, 0x94, 0x19, 0xa8, 0x28, 0x7a, 0x23, - 0xf3, 0xa6, 0x7b, 0x4c, 0xfc, 0x30, 0xcb, 0x29, 0x84, 0xff, 0x35, 0x0d, 0x85, 0xa0, 0x6c, 0xbe, - 0x05, 0x45, 0x8f, 0x06, 0x87, 0x65, 0x28, 0xf7, 0x67, 0x7a, 0xe0, 0x42, 0x52, 0xca, 0xd7, 0x92, - 0x5e, 0x15, 0x43, 0x9d, 0x1e, 0x8b, 0x43, 0xe0, 0x75, 0x23, 0x24, 0x45, 0xdf, 0x81, 0xb9, 0x9e, - 0x7d, 0xe4, 0x0c, 0xed, 0xb6, 0x30, 0x89, 0x1e, 0x4e, 0x34, 0x5d, 0x96, 0xd4, 0x16, 0x11, 0x5a, - 0x6b, 0xc4, 0xc9, 0xd1, 0x36, 0x54, 0x9c, 0xa1, 0x1f, 0x15, 0x91, 0x9d, 0x28, 0x62, 0x8c, 0x1e, - 0xdd, 0xa7, 0x21, 0x0f, 0x02, 0xca, 0x9c, 0x1d, 0x63, 0x0f, 0x57, 0x0d, 0x95, 0x94, 0x16, 0x1e, - 0xcd, 0xac, 0x67, 0xa6, 0xdf, 0x15, 0x35, 0x1f, 0xc0, 0x34, 0xde, 0xc4, 0x1e, 0xed, 0xb5, 0x59, - 0xa5, 0x17, 0x0d, 0x0e, 0xa0, 0x9d, 0xc8, 0x19, 0xca, 0xef, 0x62, 0xff, 0x97, 0x90, 0xb2, 0xdf, - 0xe4, 0x71, 0x79, 0x17, 0x16, 0xa2, 0x6d, 0x97, 0xd7, 0x9b, 0x0e, 0x79, 0x5e, 0x61, 0x9e, 0x48, - 0x66, 0x09, 0xe2, 0x9f, 0x6b, 0x30, 0x3f, 0xd6, 0xa8, 0xd1, 0x03, 0x28, 0x9d, 0xf4, 0x2c, 0x8b, - 0xb4, 0x9b, 0x17, 0xaa, 0x73, 0x95, 0x18, 0x7d, 0x01, 0x33, 0x2e, 0x1f, 0x2f, 0xe4, 0x84, 0x32, - 0x99, 0x39, 0x42, 0x8d, 0x77, 0xd8, 0xf9, 0x43, 0xaf, 0x0a, 0x81, 0xf2, 0x81, 0xb7, 0x35, 0xd5, - 0xdb, 0x55, 0x28, 0x0c, 0x4c, 0xbf, 0x7b, 0x38, 0x20, 0x2d, 0x39, 0x10, 0x4a, 0x18, 0x7f, 0x9d, - 0x85, 0x82, 0xbc, 0x6d, 0xa4, 0xf5, 0x0b, 0x71, 0xfe, 0x67, 0x92, 0xcf, 0xff, 0xc8, 0xd3, 0x42, - 0x15, 0x0a, 0x9d, 0xa1, 0x65, 0xb1, 0x54, 0xe0, 0x27, 0x66, 0x00, 0xab, 0x9e, 0xcd, 0x45, 0x3c, - 0x8b, 0x6e, 0x43, 0x8e, 0x4e, 0xa8, 0x9e, 0x7e, 0x89, 0x39, 0x20, 0xf1, 0x26, 0xc4, 0x29, 0xd0, - 0xc3, 0xb1, 0x37, 0x84, 0x1b, 0x09, 0xd4, 0xa9, 0x8f, 0x07, 0xf7, 0x22, 0x8f, 0x07, 0xd7, 0x93, - 0x58, 0xe3, 0xaf, 0x06, 0x0f, 0xc7, 0x5e, 0x0d, 0x12, 0x77, 0xfc, 0x1f, 0x7a, 0x2e, 0x78, 0xc0, - 0xba, 0x98, 0x48, 0x2c, 0x9a, 0xe3, 0x41, 0x7c, 0xb4, 0xf3, 0xe2, 0x83, 0x7f, 0xab, 0xc1, 0xd5, - 0x3a, 0xf1, 0x5f, 0xc6, 0x1e, 0x0f, 0x82, 0x0c, 0x5d, 0x83, 0x92, 0x4b, 0x06, 0xce, 0x33, 0xd3, - 0xf7, 0x89, 0x2b, 0x5f, 0xe6, 0x54, 0x14, 0x5a, 0x87, 0x39, 0x97, 0x8c, 0x7a, 0x5e, 0xcf, 0xb1, - 0x25, 0x15, 0xd7, 0x30, 0x8e, 0xa6, 0xb2, 0x4c, 0xcb, 0xda, 0x76, 0x4d, 0xbb, 0xd5, 0x25, 0x72, - 0xa0, 0x53, 0x51, 0xac, 0xed, 0x5b, 0x56, 0xd3, 0x3c, 0xf6, 0xc4, 0xc4, 0x2e, 0x41, 0x7c, 0x04, - 0x8b, 0x71, 0x1d, 0x65, 0x09, 0x50, 0x65, 0x64, 0x09, 0xd0, 0xdf, 0xec, 0x7c, 0x93, 0x8f, 0x23, - 0xa2, 0x7e, 0x24, 0xcc, 0x2e, 0x5b, 0x42, 0x2d, 0x51, 0x09, 0x01, 0x8c, 0xbf, 0x82, 0xe5, 0x64, - 0x57, 0x50, 0x9f, 0xee, 0xc3, 0x7c, 0xfc, 0x85, 0x25, 0xe9, 0xf2, 0x94, 0xa4, 0xa4, 0x31, 0xce, - 0x89, 0x11, 0x54, 0x9e, 0xf6, 0x3c, 0x7a, 0xeb, 0x70, 0x94, 0x4f, 0x03, 0x05, 0x0a, 0xa7, 0x96, - 0xb6, 0x0e, 0x79, 0x51, 0x18, 0xa2, 0x47, 0x4b, 0x90, 0xc6, 0x40, 0xfc, 0x34, 0xa2, 0xc6, 0xc5, - 0xd1, 0xf8, 0x0d, 0x94, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x29, 0x59, 0x84, 0x36, 0x06, 0xa7, - 0x40, 0x9f, 0xc2, 0xe5, 0x63, 0x36, 0x77, 0xef, 0xc6, 0x36, 0xe3, 0x5e, 0x4e, 0x5e, 0xc4, 0x07, - 0x50, 0xde, 0x6a, 0xb7, 0xa9, 0x2c, 0x99, 0x54, 0x49, 0xc6, 0x25, 0x98, 0x90, 0x49, 0x36, 0xc1, - 0x80, 0x99, 0x40, 0x1e, 0x9f, 0xd9, 0x90, 0x4d, 0x4e, 0xe3, 0x2a, 0x71, 0xd9, 0x09, 0x2b, 0x74, - 0xf7, 0x9e, 0xec, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0x54, - 0x35, 0x17, 0x21, 0xd7, 0xb3, 0xdb, 0xe4, 0xad, 0xfc, 0x9e, 0xc0, 0x00, 0xfc, 0x6d, 0x98, 0x53, - 0x49, 0xa9, 0x06, 0xb7, 0xa0, 0xac, 0xee, 0x13, 0xa4, 0x63, 0x0c, 0x8b, 0x3f, 0x84, 0x05, 0x83, - 0x74, 0x5c, 0xe2, 0x75, 0xd5, 0xb8, 0xa7, 0xec, 0xf3, 0xff, 0x70, 0xf9, 0x90, 0xf8, 0x0a, 0xfb, - 0x64, 0xf2, 0x87, 0xec, 0xb2, 0x59, 0x4f, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, 0x8b, 0xe5, 0xfe, - 0xf7, 0xd9, 0xed, 0x8e, 0x6e, 0x93, 0xc2, 0x9c, 0xb8, 0x6b, 0x44, 0x64, 0x26, 0x26, 0xf2, 0x1e, - 0x5c, 0x4d, 0x13, 0x49, 0x9d, 0x26, 0xc3, 0xa0, 0x29, 0x61, 0xc8, 0x43, 0xae, 0xd6, 0x1f, 0xf8, - 0x67, 0x9b, 0x7f, 0x98, 0x85, 0xbc, 0x78, 0x6c, 0x42, 0x3b, 0x50, 0x6a, 0xba, 0x66, 0xeb, 0x84, - 0x7f, 0xa9, 0x42, 0xfa, 0xd8, 0xc7, 0x2b, 0xa1, 0x62, 0x75, 0x29, 0x61, 0x85, 0x5e, 0x4c, 0xa7, - 0x3e, 0xd6, 0xd0, 0x2b, 0xa8, 0xc4, 0x3f, 0xc0, 0x20, 0x1c, 0xbd, 0x05, 0x26, 0x7d, 0x5f, 0xaa, - 0xae, 0x4d, 0xa4, 0x61, 0xd2, 0xd1, 0x36, 0x14, 0xe4, 0x07, 0x0a, 0xa4, 0x3e, 0x28, 0xc6, 0x3e, - 0x70, 0x54, 0xf5, 0xc4, 0x35, 0x2e, 0xe3, 0x25, 0x1b, 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0x46, 0xea, - 0x25, 0x35, 0xb0, 0x78, 0x75, 0x12, 0x09, 0x17, 0xdc, 0x84, 0x72, 0xf4, 0x31, 0x16, 0xad, 0x9d, - 0xf7, 0x12, 0x5c, 0x5d, 0x99, 0x40, 0x11, 0x48, 0x8d, 0xee, 0x87, 0xd6, 0x52, 0x55, 0x49, 0x92, - 0x9a, 0xf0, 0x40, 0x8b, 0xa7, 0xd0, 0x8f, 0x01, 0x8d, 0xbf, 0x30, 0xa2, 0x9b, 0x17, 0x79, 0x0d, - 0xad, 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x82, 0xf9, 0xb1, 0xb7, 0x31, 0xa4, 0x4e, 0xb2, 0x69, - 0x6f, 0x8e, 0xd5, 0x1b, 0x93, 0x89, 0x02, 0x03, 0xc6, 0x5f, 0x96, 0x22, 0x06, 0xa4, 0xbe, 0x85, - 0x45, 0x0c, 0x48, 0x79, 0x9e, 0xe2, 0xb9, 0x26, 0x6f, 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, - 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, - 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x83, 0x35, 0x5a, 0x49, 0x7d, 0x1a, 0xe3, 0xa2, - 0x26, 0x3e, 0x9d, 0x05, 0x46, 0xb1, 0x01, 0x26, 0x6e, 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, - 0x1e, 0x3c, 0x85, 0x3a, 0xec, 0xd3, 0xdf, 0x58, 0xf3, 0x46, 0xb7, 0xa2, 0x3c, 0x69, 0x83, 0x4e, - 0xf5, 0xe6, 0xb9, 0x74, 0x7c, 0x9f, 0x1a, 0x14, 0x83, 0x06, 0x8a, 0xae, 0x2a, 0x4c, 0xf1, 0x76, - 0x5e, 0x5d, 0x4e, 0x5e, 0x0c, 0x62, 0x20, 0x9a, 0x58, 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, - 0xda, 0xf3, 0xf0, 0x14, 0x7a, 0x02, 0x10, 0xb6, 0x21, 0x74, 0x2d, 0xd2, 0xb5, 0x63, 0x8d, 0xac, - 0x5a, 0x4d, 0x59, 0x95, 0xde, 0x9f, 0x51, 0xbb, 0x52, 0x24, 0x9a, 0x09, 0xed, 0xaa, 0x5a, 0x51, - 0xdf, 0x8a, 0xe9, 0x69, 0x8d, 0xa7, 0xd0, 0x63, 0x28, 0x47, 0x9b, 0x55, 0xe4, 0x3c, 0x48, 0xec, - 0x63, 0x89, 0x72, 0x5e, 0x81, 0x9e, 0xd6, 0xc5, 0xd0, 0x9d, 0xa8, 0xc4, 0x49, 0xad, 0x2e, 0x51, - 0xb6, 0x05, 0x4b, 0xc9, 0xfd, 0x08, 0xad, 0x47, 0x25, 0xa7, 0x77, 0xc1, 0xea, 0xad, 0x0b, 0x50, - 0x32, 0xaf, 0x6e, 0xdf, 0xff, 0xe3, 0xbb, 0x15, 0xed, 0x6f, 0xef, 0x56, 0xb4, 0xbf, 0xbf, 0x5b, - 0xd1, 0x7e, 0xf5, 0x8f, 0x95, 0x29, 0xc0, 0xad, 0xee, 0x46, 0x8b, 0xb8, 0xf6, 0x86, 0x69, 0xf5, - 0x5a, 0x64, 0xc3, 0xd9, 0xdc, 0x90, 0x92, 0xdc, 0x41, 0xcb, 0x23, 0xee, 0x88, 0xb8, 0xaf, 0x32, - 0x83, 0xa3, 0xa3, 0x4b, 0xec, 0xcf, 0x25, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x92, - 0xbf, 0xa3, 0x76, 0x22, 0x00, 0x00, +func (m *ListReposReply) GetGlobalDefaultRevision() string { + if m != nil { + return m.GlobalDefaultRevision + } + return "" } -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) +type AddRepoRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -type controlClient struct { - cc *grpc.ClientConn +func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } +func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } +func (*AddRepoRequest) ProtoMessage() {} +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } - -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} +func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return x, nil } - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +func (m *AddRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoRequest.Merge(m, src) } - -type controlTrackStatusClient struct { - grpc.ClientStream +func (m *AddRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *AddRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) } -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo + +func (m *AddRepoRequest) GetName() string { + if m != nil { + return m.Name } - return m, nil + return "" } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoRequest) GetDefaultRevision() string { + if m != nil { + return m.DefaultRevision } - return out, nil + return "" } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type AddRepoReply struct { + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } +func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } +func (*AddRepoReply) ProtoMessage() {} +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} +} +func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *AddRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoReply.Merge(m, src) +} +func (m *AddRepoReply) XXX_Size() int { + return m.Size() +} +func (m *AddRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoReply.DiscardUnknown(m) } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo + +func (m *AddRepoReply) GetNewDefaultRevision() string { + if m != nil { + return m.NewDefaultRevision } - return out, nil + return "" } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoReply) GetInfo() string { + if m != nil { + return m.Info } - return out, nil + return "" } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RemoveRepoRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } +func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } +func (*RemoveRepoRequest) ProtoMessage() {} +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } - -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err +func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil } - -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRepoRequest.Merge(m, src) +} +func (m *RemoveRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *RemoveRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo + +func (m *RemoveRepoRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RemoveRepoReply struct { + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } +func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } +func (*RemoveRepoReply) ProtoMessage() {} +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} +} +func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRepoReply.Merge(m, src) +} +func (m *RemoveRepoReply) XXX_Size() int { + return m.Size() +} +func (m *RemoveRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo + +func (m *RemoveRepoReply) GetNewDefaultRepo() string { + if m != nil { + return m.NewDefaultRepo } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RefreshReposRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } +func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } +func (*RefreshReposRequest) ProtoMessage() {} +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} +} +func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RefreshReposRequest.Merge(m, src) +} +func (m *RefreshReposRequest) XXX_Size() int { + return m.Size() +} +func (m *RefreshReposRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo + +func (m *RefreshReposRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetDefaultRepoRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } +func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } +func (*SetDefaultRepoRequest) ProtoMessage() {} +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} +} +func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) +} +func (m *SetDefaultRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo + +func (m *SetDefaultRepoRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) +type SetGlobalDefaultRevisionRequest struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { +func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } +func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) } -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { + return m.Size() } -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) } -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") + +var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo + +func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") + +type SetRepoDefaultRevisionRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") + +func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } +func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) } -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { + return m.Size() } -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) } -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") + +var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if m != nil { + return m.Index + } + return 0 } -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") + +func (m *SetRepoDefaultRevisionRequest) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") + +type SetRepoDefaultRevisionReply struct { + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") + +func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } +func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) } -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Size() int { + return m.Size() } - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) +func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err +var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionReply) GetInfo() string { + if m != nil { + return m.Info } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) + return "" } -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -type controlTrackStatusServer struct { - grpc.ServerStream +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) +func (m *Empty) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return interceptor(ctx, in, info, handler) } - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) } - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { +func (m *Empty) XXX_Size() int { + return m.Size() +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func init() { + proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) + proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) + proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) + proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") + proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") + proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") + proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") + proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") + proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") + proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") + proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") + proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") + proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") + proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") + proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") + proto.RegisterType((*Event)(nil), "o2control.Event") + proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") + proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") + proto.RegisterType((*Version)(nil), "o2control.Version") + proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") + proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") + proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") + proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") + proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") + proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") + proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") + proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") + proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") + proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") + proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") + proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") + proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") + proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") + proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") + proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") + proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") + proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") + proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") + proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") + proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") + proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") + proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") + proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") + proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") + proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") + proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") + proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") + proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") + proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") + proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") + proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") + proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") + proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") + proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") + proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") + proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") + proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") + proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") + proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") + proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") + proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") + proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") + proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") + proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") + proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") + proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") + proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") + proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") + proto.RegisterType((*Empty)(nil), "o2control.Empty") +} + +func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } + +var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ + // 3040 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, + 0x91, 0x27, 0x91, 0x22, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, + 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x51, 0xb4, 0xa4, 0xc6, 0x16, 0xdd, + 0x15, 0x6d, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, + 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0x29, 0xd0, 0xe7, 0xfe, 0x81, 0x02, 0xc5, 0x7e, 0xdc, + 0xdd, 0xde, 0x17, 0x25, 0x37, 0xcd, 0x4b, 0xdf, 0x38, 0xb3, 0x33, 0xb3, 0xf3, 0xb5, 0x33, 0xb3, + 0x7b, 0x84, 0xd5, 0x91, 0x63, 0x7b, 0xb6, 0xfb, 0x96, 0xbd, 0xd5, 0xb5, 0x2d, 0xcf, 0xb1, 0xcd, + 0x4d, 0x8e, 0x40, 0xe5, 0x00, 0x81, 0x57, 0x61, 0xa5, 0x35, 0xa1, 0x96, 0x77, 0xf4, 0x90, 0xba, + 0xb6, 0xbb, 0x47, 0x75, 0xc7, 0x3b, 0xa6, 0xba, 0x87, 0x4d, 0x68, 0xb4, 0x26, 0x47, 0x2d, 0x6b, + 0x62, 0x38, 0xb6, 0x35, 0xa4, 0x96, 0x77, 0xe8, 0xe9, 0x1e, 0x6d, 0x0e, 0x74, 0xeb, 0x84, 0xf6, + 0xd0, 0x0a, 0x14, 0x28, 0xe3, 0xaa, 0x6b, 0x1b, 0xda, 0xcd, 0x32, 0x11, 0x00, 0x5a, 0x85, 0x39, + 0xd7, 0x1e, 0x3b, 0x5d, 0x5a, 0x9f, 0xe1, 0x68, 0x09, 0xa1, 0x0d, 0xa8, 0xf4, 0xa8, 0xeb, 0x19, + 0x96, 0xee, 0x19, 0xb6, 0x55, 0x9f, 0xe5, 0x8b, 0x2a, 0x0a, 0x37, 0x61, 0xb9, 0x35, 0x39, 0xea, + 0xe8, 0xee, 0x69, 0x64, 0x9b, 0x55, 0x98, 0xf3, 0x74, 0xf7, 0xd4, 0xe8, 0xc9, 0x7d, 0x24, 0xc4, + 0xb6, 0x77, 0x19, 0x9d, 0xdc, 0x47, 0x00, 0xf8, 0x3e, 0x33, 0x25, 0x10, 0x32, 0x76, 0xcf, 0x93, + 0xc2, 0xd4, 0xe5, 0x84, 0x81, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0xa2, 0x94, 0xf3, 0x40, 0x1f, 0x5b, + 0xdd, 0x41, 0xb6, 0x08, 0x6c, 0x70, 0xbd, 0xb9, 0xeb, 0x18, 0x7d, 0xd3, 0xa1, 0xba, 0x47, 0x7b, + 0xe8, 0x3a, 0x2c, 0x30, 0x02, 0x87, 0x0a, 0x07, 0xb8, 0x92, 0x2b, 0x8a, 0x44, 0x6f, 0xc2, 0x12, + 0x7d, 0x41, 0xbb, 0x63, 0xcf, 0x76, 0x48, 0x40, 0x29, 0x54, 0x49, 0x2e, 0xe0, 0xc7, 0x70, 0x29, + 0x1a, 0x10, 0x7f, 0xb3, 0x0f, 0xa1, 0x42, 0x43, 0x2c, 0xdf, 0xaa, 0xb2, 0xd5, 0xd8, 0x0c, 0x63, + 0xae, 0xf0, 0xec, 0x5b, 0x7d, 0x9b, 0xa8, 0xe4, 0xf8, 0xe7, 0x1a, 0xac, 0x45, 0xe5, 0xee, 0x50, + 0xd7, 0x73, 0xec, 0x33, 0xda, 0x43, 0xdf, 0x87, 0xa5, 0xae, 0x49, 0x75, 0x6b, 0x3c, 0x62, 0xc6, + 0xb9, 0x84, 0x8e, 0xcc, 0x33, 0x29, 0xff, 0x8a, 0x22, 0xbf, 0x19, 0xa7, 0x21, 0x49, 0x36, 0xe6, + 0x12, 0x65, 0x5b, 0xa3, 0x27, 0x0d, 0x8d, 0x22, 0xf1, 0x25, 0xee, 0x4f, 0x45, 0x99, 0x96, 0xe3, + 0xd8, 0x0e, 0x5e, 0x86, 0xa5, 0xd6, 0xe4, 0xe8, 0x53, 0xc3, 0x34, 0xb9, 0x44, 0xee, 0x6f, 0xbc, + 0x08, 0x0b, 0x22, 0xce, 0x84, 0x7e, 0x31, 0xa6, 0xae, 0x87, 0x8f, 0xa1, 0xe2, 0x23, 0xd8, 0x8e, + 0x41, 0x92, 0x68, 0x4a, 0x92, 0xa0, 0xbb, 0xb0, 0x20, 0xc2, 0xfc, 0x78, 0xd4, 0xd3, 0x3d, 0xee, + 0xf0, 0xd9, 0x9b, 0x95, 0xad, 0x35, 0xc5, 0x9e, 0x43, 0x65, 0x9d, 0x44, 0xa9, 0xf1, 0x5f, 0x34, + 0x98, 0x57, 0xd7, 0xd1, 0xbb, 0x50, 0x30, 0xe9, 0x84, 0x9a, 0x7c, 0x97, 0xea, 0xd6, 0xd5, 0x0c, + 0x39, 0x9b, 0x0f, 0x18, 0x11, 0x11, 0xb4, 0x68, 0x1f, 0xaa, 0xc3, 0xc8, 0x71, 0xe3, 0xde, 0xa8, + 0x6c, 0x5d, 0x53, 0xa3, 0x96, 0x72, 0x2a, 0xf7, 0x72, 0x24, 0xc6, 0x88, 0xdf, 0x83, 0x02, 0x17, + 0x8d, 0xca, 0x50, 0xd8, 0x69, 0x6d, 0x3f, 0xde, 0xad, 0xe5, 0x50, 0x09, 0xf2, 0xfb, 0x07, 0xf7, + 0xdb, 0x35, 0x0d, 0x55, 0xa0, 0xf8, 0xf4, 0x1e, 0x39, 0xd8, 0x3f, 0xd8, 0xad, 0xcd, 0x30, 0x8a, + 0x16, 0x21, 0x6d, 0x52, 0x9b, 0xdd, 0x2e, 0x42, 0x81, 0xcb, 0xc7, 0x3f, 0x9b, 0x93, 0xbf, 0xd0, + 0x15, 0x28, 0x7b, 0xc6, 0x90, 0xba, 0x9e, 0x3e, 0x1c, 0x49, 0x97, 0x85, 0x08, 0xa4, 0xc3, 0x1a, + 0x4d, 0xaf, 0x05, 0x52, 0xf5, 0x6f, 0x47, 0x54, 0xcf, 0x2a, 0x1c, 0x7b, 0x39, 0x92, 0x25, 0x07, + 0x11, 0x40, 0x34, 0x91, 0xdd, 0xbc, 0x58, 0x54, 0xb6, 0x36, 0x32, 0xa5, 0x4b, 0xba, 0xbd, 0x1c, + 0x49, 0xe1, 0x46, 0x0f, 0xa0, 0xe6, 0xc5, 0x8a, 0x4a, 0x3d, 0xcf, 0x25, 0xae, 0x47, 0x25, 0xc6, + 0x4b, 0xcf, 0x5e, 0x8e, 0x24, 0x38, 0x51, 0x1b, 0x96, 0xbc, 0x78, 0x75, 0xa9, 0x17, 0x52, 0x22, + 0x97, 0x2c, 0x42, 0x7b, 0x39, 0x92, 0xe4, 0x45, 0x9f, 0xc0, 0x3c, 0x43, 0x9a, 0xb2, 0xcc, 0xd4, + 0xe7, 0x92, 0x67, 0x37, 0x5a, 0x88, 0xf6, 0x72, 0x24, 0xc2, 0xc1, 0x0c, 0x1c, 0xfa, 0xd5, 0xa7, + 0x2b, 0x5d, 0x56, 0x4c, 0x33, 0x30, 0x5e, 0xa3, 0x98, 0x81, 0x71, 0x4e, 0xf4, 0x19, 0xac, 0xd0, + 0x94, 0x42, 0x50, 0x2f, 0x71, 0x89, 0x38, 0x33, 0x08, 0x01, 0xe5, 0x5e, 0x8e, 0xa4, 0x4a, 0x60, + 0x7a, 0xd2, 0xd8, 0xa9, 0xae, 0x97, 0xd3, 0xf4, 0x8c, 0x9f, 0x7d, 0xa6, 0x67, 0x9c, 0x13, 0xdd, + 0x87, 0xea, 0xa9, 0x61, 0x9a, 0x5e, 0x50, 0x0c, 0xea, 0x90, 0xa8, 0x4a, 0x89, 0x82, 0xc1, 0x0e, + 0x4f, 0x94, 0x6b, 0xbb, 0x0c, 0xc5, 0x47, 0xfa, 0x99, 0x69, 0xeb, 0x3d, 0x8c, 0xa0, 0x76, 0x38, + 0x3e, 0x76, 0xbb, 0x8e, 0x71, 0x4c, 0xfd, 0x82, 0x72, 0x19, 0xd6, 0x76, 0xa9, 0x77, 0xdf, 0xd1, + 0x87, 0xf4, 0xb9, 0xed, 0x9c, 0xf2, 0xe2, 0x29, 0x97, 0x7e, 0xab, 0x41, 0xf1, 0x09, 0x75, 0x5c, + 0xc3, 0xb6, 0x58, 0xa1, 0x19, 0xea, 0x9f, 0xdb, 0x0e, 0x3f, 0x35, 0x05, 0x22, 0x00, 0x8e, 0x35, + 0x2c, 0xdb, 0xe1, 0xe7, 0x83, 0x61, 0x19, 0xc0, 0xb0, 0x23, 0xdd, 0xeb, 0x0e, 0x78, 0x5e, 0x17, + 0x88, 0x00, 0x18, 0xf6, 0x78, 0x6c, 0x98, 0x22, 0x37, 0xcb, 0x44, 0x00, 0xac, 0x6d, 0x8e, 0x1c, + 0xbb, 0x37, 0xee, 0x7a, 0x07, 0xfa, 0x90, 0xf2, 0x44, 0x2b, 0x13, 0x15, 0x85, 0xd6, 0x01, 0x26, + 0x42, 0x89, 0x43, 0xcf, 0xe1, 0xd9, 0x53, 0x26, 0x0a, 0x06, 0xff, 0x72, 0x06, 0x2e, 0x25, 0x2d, + 0x60, 0xc5, 0x71, 0x03, 0x2a, 0xfd, 0x00, 0xeb, 0x77, 0x35, 0x15, 0xc5, 0xbb, 0x53, 0xe8, 0x77, + 0xb7, 0x69, 0x8f, 0x2d, 0x4f, 0xda, 0x92, 0x5c, 0x60, 0x9a, 0x70, 0xbf, 0x0a, 0x32, 0x61, 0x9c, + 0x82, 0x09, 0x8b, 0x71, 0x5e, 0x2d, 0xc6, 0xeb, 0x00, 0x03, 0xdb, 0xf5, 0x85, 0x17, 0x04, 0x57, + 0x88, 0x41, 0x18, 0xe6, 0x0d, 0xcb, 0xf5, 0x74, 0xab, 0x4b, 0xb9, 0x0b, 0x84, 0x85, 0x11, 0x1c, + 0x7a, 0x13, 0x8a, 0xd2, 0x62, 0x99, 0xf8, 0x48, 0x49, 0x02, 0x19, 0x22, 0xe2, 0x93, 0xb0, 0xde, + 0xde, 0xa1, 0xba, 0xd3, 0xb3, 0x9f, 0x5b, 0x32, 0x94, 0xac, 0xb7, 0x3b, 0x54, 0x77, 0x6d, 0xcb, + 0xef, 0xed, 0x02, 0x62, 0xfd, 0x25, 0x24, 0x1d, 0x99, 0x67, 0xb8, 0x0e, 0xab, 0xbb, 0xd4, 0x53, + 0x12, 0x34, 0xe8, 0x3c, 0x2f, 0x60, 0x25, 0xb1, 0x72, 0x31, 0x2f, 0x7f, 0x04, 0xf3, 0xaa, 0x33, + 0x65, 0x37, 0x9a, 0xd6, 0xbd, 0x23, 0xf4, 0xf8, 0x4f, 0x79, 0x58, 0x8c, 0x51, 0xa0, 0x2a, 0xcc, + 0x04, 0x83, 0xca, 0x8c, 0xc1, 0xf3, 0x48, 0x1e, 0xf0, 0xa7, 0x03, 0x6a, 0xc9, 0xc6, 0xab, 0xa2, + 0xc2, 0xe8, 0xcc, 0xaa, 0xd1, 0xd9, 0x84, 0x02, 0x8f, 0x60, 0x3d, 0xcf, 0x95, 0xaa, 0xab, 0xad, + 0x6d, 0x60, 0x3b, 0x1e, 0x3b, 0x5a, 0x5c, 0x25, 0x41, 0x86, 0x1a, 0x50, 0x72, 0x6c, 0xdb, 0x23, + 0xb6, 0xe9, 0x27, 0x6b, 0x00, 0xa3, 0x5b, 0x50, 0xeb, 0x8e, 0x1d, 0x87, 0x5a, 0x1e, 0x19, 0x5b, + 0x07, 0xe3, 0xe1, 0x31, 0x15, 0xf9, 0xba, 0x40, 0x12, 0x78, 0xb4, 0x03, 0xa5, 0x1e, 0xed, 0xeb, + 0x63, 0xd3, 0x73, 0xeb, 0x45, 0xbe, 0xf5, 0xcd, 0x6c, 0x7f, 0x6c, 0xee, 0x48, 0xd2, 0x96, 0xe5, + 0x39, 0x67, 0x24, 0xe0, 0x44, 0xb7, 0x21, 0x3f, 0xd1, 0x1d, 0xb7, 0x5e, 0xe2, 0x12, 0xae, 0x4f, + 0x91, 0xf0, 0x44, 0x77, 0x24, 0x37, 0xe7, 0x60, 0xfb, 0x8f, 0x5d, 0xea, 0x30, 0x74, 0xbd, 0x7c, + 0xee, 0xfe, 0x8f, 0x25, 0xa9, 0xdc, 0xdf, 0xe7, 0x6c, 0x7c, 0x00, 0x0b, 0x11, 0xd5, 0x50, 0x0d, + 0x66, 0x4f, 0xe9, 0x99, 0x8c, 0x0b, 0xfb, 0xc9, 0xdc, 0x3e, 0xd1, 0xcd, 0x71, 0x30, 0xc6, 0x72, + 0xe0, 0xce, 0xcc, 0x6d, 0xad, 0xf1, 0x3e, 0x94, 0x03, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0x2c, 0x44, + 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x07, 0x0d, 0x2e, 0x1d, 0xd0, 0xe7, 0x8a, 0x85, 0xfe, 0x19, 0xb9, + 0x05, 0x35, 0x96, 0xb0, 0x7d, 0xd3, 0x7e, 0xde, 0xa1, 0xc3, 0x91, 0x19, 0x8e, 0x55, 0x09, 0x3c, + 0xfa, 0x48, 0x3a, 0x5e, 0xa4, 0xf2, 0x2d, 0xc5, 0x75, 0xa9, 0xb2, 0xe3, 0xee, 0xff, 0xaf, 0x6d, + 0xc7, 0x87, 0xb0, 0x1c, 0xdf, 0x81, 0x1d, 0xc2, 0xaf, 0x37, 0x1f, 0xbf, 0xc6, 0x2b, 0x68, 0x8a, + 0x4b, 0x62, 0xa7, 0x0c, 0xff, 0x54, 0x83, 0xe5, 0x38, 0xe5, 0xd7, 0xde, 0x1e, 0xbd, 0x05, 0x25, + 0xdf, 0xc1, 0x72, 0xd0, 0x5a, 0x56, 0x58, 0xd9, 0xd1, 0xe2, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, + 0x97, 0x9b, 0x62, 0xf9, 0x7c, 0xa5, 0xd1, 0xc7, 0x90, 0xf7, 0xce, 0x46, 0xc2, 0x97, 0xd5, 0xad, + 0x37, 0xd4, 0xa1, 0x3e, 0x4b, 0xc6, 0x66, 0x7b, 0xc4, 0x58, 0x08, 0x67, 0xc4, 0x3a, 0xcc, 0x09, + 0x98, 0x0d, 0x9d, 0x07, 0xed, 0xf6, 0xa3, 0x5a, 0x0e, 0x21, 0xa8, 0x1e, 0x76, 0xee, 0x91, 0xce, + 0xd1, 0xbd, 0x66, 0x67, 0xff, 0xc9, 0x7e, 0xe7, 0x87, 0x35, 0x0d, 0x2d, 0xc1, 0xc2, 0x61, 0xa7, + 0xfd, 0x28, 0x44, 0xcd, 0xa0, 0x05, 0x28, 0x37, 0xdb, 0x07, 0xf7, 0xf7, 0x77, 0x1f, 0x93, 0x56, + 0x6d, 0x96, 0x4d, 0xa7, 0xa4, 0x75, 0xd8, 0xea, 0xd4, 0xf2, 0x68, 0x1e, 0x4a, 0xbb, 0xed, 0x23, + 0x31, 0xab, 0x16, 0xf0, 0x29, 0xac, 0xa5, 0x29, 0xc3, 0x7c, 0x1b, 0x37, 0x27, 0xf5, 0x5e, 0x98, + 0x5a, 0x7b, 0x66, 0xd3, 0x6b, 0x0f, 0xfe, 0x95, 0x06, 0xf5, 0x87, 0x76, 0xcf, 0xe8, 0x9f, 0x5d, + 0xc8, 0x7b, 0x60, 0x8f, 0xa8, 0xc3, 0xaf, 0xb0, 0x7e, 0xbe, 0x5f, 0x4b, 0x8f, 0x6c, 0xdb, 0xa7, + 0x23, 0x0a, 0x0b, 0xba, 0x01, 0x55, 0x87, 0x76, 0x6d, 0xab, 0x6f, 0x9c, 0x8c, 0x1d, 0x7a, 0xcf, + 0x34, 0xb9, 0x5e, 0x25, 0x12, 0xc3, 0xe2, 0xdf, 0x68, 0xb0, 0x92, 0x26, 0x0c, 0xdd, 0x91, 0xf1, + 0x13, 0x97, 0x8f, 0x1b, 0xe7, 0xec, 0x1d, 0x09, 0x9d, 0x28, 0xd7, 0xa6, 0x68, 0xac, 0x33, 0x7e, + 0xb9, 0x16, 0x30, 0x7e, 0x27, 0x25, 0xac, 0x8b, 0x50, 0x21, 0xad, 0x87, 0xed, 0x27, 0xad, 0x23, + 0xd2, 0x7e, 0xc0, 0x22, 0x36, 0x0f, 0xa5, 0x7b, 0x3b, 0x3b, 0x02, 0xca, 0xb3, 0x8b, 0xe4, 0x6a, + 0x8a, 0xe7, 0x58, 0x98, 0x3e, 0x85, 0x5a, 0x5f, 0x37, 0x4c, 0xda, 0x6b, 0x87, 0xde, 0xd2, 0x2e, + 0xe6, 0xad, 0x04, 0xa3, 0x0c, 0xc2, 0x4c, 0x32, 0xe6, 0x6a, 0xef, 0xc2, 0x5f, 0x6a, 0x70, 0x59, + 0x4e, 0x9f, 0x17, 0x08, 0xe4, 0x15, 0x28, 0x9f, 0x52, 0x2a, 0xae, 0xab, 0x5c, 0x74, 0x89, 0x84, + 0x08, 0xf4, 0x36, 0x2c, 0xeb, 0xa6, 0x69, 0x3f, 0xdf, 0xb7, 0xc8, 0xd8, 0xb2, 0x0c, 0xeb, 0xe4, + 0x30, 0xd8, 0xaf, 0x44, 0xd2, 0x96, 0x98, 0x4e, 0x7d, 0xdb, 0xe9, 0x8a, 0x69, 0xa7, 0x44, 0x04, + 0x80, 0x29, 0xac, 0xa5, 0xa9, 0xc4, 0x3c, 0xf4, 0x3f, 0xbc, 0x69, 0xe3, 0x3f, 0x6b, 0x70, 0xed, + 0x30, 0x52, 0x88, 0x1e, 0x39, 0x2c, 0xe7, 0x3c, 0x83, 0xba, 0x59, 0x0e, 0x78, 0x06, 0x30, 0x0a, + 0x88, 0x64, 0x26, 0xdf, 0x51, 0xfb, 0xfd, 0x74, 0x79, 0x9b, 0x21, 0x46, 0x54, 0x72, 0x45, 0x5a, + 0xe3, 0x2e, 0x2c, 0xc6, 0x96, 0x5f, 0xaa, 0xaa, 0x5f, 0x83, 0xab, 0xd9, 0xbb, 0x33, 0x7b, 0x5d, + 0xb8, 0xb6, 0xfb, 0x92, 0xe6, 0xd6, 0xa1, 0xf8, 0xc5, 0x98, 0x3a, 0xbe, 0xad, 0x65, 0xe2, 0x83, + 0xec, 0x44, 0xd2, 0x17, 0x5d, 0x73, 0xdc, 0xa3, 0xbb, 0xa6, 0x7d, 0xac, 0x9b, 0xae, 0x7f, 0x22, + 0xa3, 0x58, 0xfc, 0x7b, 0x0d, 0xae, 0xee, 0x4e, 0x53, 0x0b, 0x7d, 0x16, 0x71, 0xa9, 0x48, 0xf7, + 0xdb, 0x8a, 0x4b, 0xa7, 0x72, 0x7f, 0x93, 0x0e, 0xfd, 0xa7, 0x06, 0x0b, 0x91, 0xf9, 0x0d, 0x21, + 0xc8, 0x5b, 0xac, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x4d, 0xc5, 0xa6, 0xdd, 0x3d, 0x95, 0xf7, 0xfb, + 0x12, 0x91, 0x90, 0xff, 0x12, 0xb6, 0xdf, 0x93, 0xe7, 0x4d, 0x42, 0xca, 0x63, 0x5a, 0x5e, 0x7d, + 0x4c, 0x0b, 0x8f, 0x67, 0x41, 0x2d, 0xc9, 0x57, 0xa0, 0xdc, 0x35, 0x75, 0xd7, 0x55, 0xa6, 0xfa, + 0x10, 0x81, 0x5a, 0x50, 0xed, 0xd1, 0x91, 0x69, 0x9f, 0xf9, 0x3d, 0x51, 0x4e, 0xf6, 0xea, 0xe3, + 0x0a, 0x53, 0x7e, 0x27, 0x42, 0x44, 0x62, 0x4c, 0xac, 0x23, 0xa3, 0x24, 0x19, 0xab, 0x7b, 0xec, + 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x2c, 0x31, 0xf4, 0x13, 0x46, 0xe8, 0x57, 0x18, 0x1f, 0x64, 0x2b, + 0x76, 0xbf, 0x4f, 0x9d, 0xc0, 0x70, 0x1f, 0x64, 0x97, 0x18, 0xff, 0xb5, 0x6e, 0xdf, 0xbf, 0xc1, + 0x29, 0x18, 0xbc, 0x04, 0x8b, 0xbb, 0xd4, 0x93, 0x07, 0x54, 0xdc, 0x17, 0x3e, 0x86, 0x85, 0x10, + 0xc5, 0x92, 0x25, 0x18, 0xb5, 0xb5, 0x0b, 0x8d, 0xda, 0xf8, 0x26, 0x54, 0xa5, 0x00, 0xe5, 0x16, + 0x23, 0xe3, 0xa2, 0xa9, 0x71, 0xc1, 0xef, 0xc3, 0x7c, 0x40, 0xc9, 0x76, 0x7a, 0x0d, 0xf2, 0x6c, + 0x45, 0x16, 0x97, 0xe5, 0x98, 0x47, 0xf9, 0x1e, 0x9c, 0x00, 0xb7, 0x60, 0x81, 0x3f, 0x17, 0xb0, + 0xa8, 0x64, 0x66, 0x09, 0xbb, 0x5a, 0x08, 0xf6, 0x87, 0x76, 0x8f, 0x06, 0x57, 0x8b, 0x10, 0x85, + 0x7f, 0x02, 0x95, 0xa6, 0x3d, 0x1c, 0xea, 0x56, 0x8f, 0x0b, 0xa9, 0xc1, 0x2c, 0xb5, 0x26, 0xdc, + 0xcc, 0x32, 0x61, 0x3f, 0x79, 0x82, 0x0c, 0xa8, 0x69, 0xca, 0x3c, 0x13, 0x40, 0x98, 0xbe, 0xb3, + 0x4a, 0xfa, 0xb2, 0xb4, 0xd1, 0x9d, 0x93, 0xb1, 0xb8, 0x2a, 0xe5, 0xb9, 0x8c, 0x10, 0xc1, 0x14, + 0x64, 0xd3, 0xb7, 0xcc, 0x34, 0xfe, 0x1b, 0x3f, 0x84, 0x4a, 0x73, 0xa0, 0x5b, 0x16, 0x35, 0x33, + 0x6d, 0x40, 0xca, 0x0c, 0x54, 0x96, 0xbd, 0x91, 0x7b, 0xd3, 0x39, 0xa1, 0x5e, 0x98, 0xe5, 0x0c, + 0xc2, 0xff, 0x9a, 0x85, 0x52, 0x70, 0x6c, 0xbe, 0x0b, 0x65, 0x97, 0x05, 0x87, 0x67, 0xa8, 0xf0, + 0x67, 0x76, 0xe0, 0x42, 0x52, 0xc6, 0xd7, 0xf5, 0xbd, 0x2a, 0x87, 0xba, 0x7a, 0x2c, 0x0e, 0x81, + 0xd7, 0x49, 0x48, 0x8a, 0x3e, 0x81, 0x45, 0xc3, 0x3a, 0xb6, 0xc7, 0x56, 0x4f, 0x9a, 0xc4, 0x8a, + 0x13, 0x4b, 0x97, 0x55, 0xb5, 0x45, 0x84, 0xd6, 0x92, 0x38, 0x39, 0xda, 0x86, 0x9a, 0x3d, 0xf6, + 0xa2, 0x22, 0xf2, 0x53, 0x45, 0x24, 0xe8, 0xd1, 0x6d, 0x16, 0xf2, 0x20, 0xa0, 0xf2, 0xf9, 0x2b, + 0xc2, 0x1e, 0xae, 0x12, 0x95, 0x94, 0x1d, 0x3c, 0x96, 0x59, 0x8f, 0x74, 0x6f, 0x20, 0xcf, 0x7c, + 0x00, 0xf3, 0x0f, 0x0a, 0xd6, 0x64, 0x5f, 0x3c, 0x5e, 0x95, 0x89, 0x00, 0x50, 0x33, 0x52, 0x43, + 0xc5, 0x5d, 0xec, 0x5b, 0x29, 0x29, 0xfb, 0x4d, 0x96, 0xcb, 0xb7, 0x60, 0x39, 0xda, 0x76, 0xc5, + 0x79, 0xab, 0x43, 0x51, 0x9c, 0x30, 0x57, 0x26, 0xb3, 0x0f, 0xe2, 0x5f, 0x68, 0xb0, 0x94, 0x68, + 0xd4, 0xe8, 0x0e, 0x54, 0x4e, 0x0d, 0xd3, 0xa4, 0xbd, 0xce, 0x85, 0xce, 0xb9, 0x4a, 0x8c, 0x3e, + 0x84, 0x79, 0x47, 0x8c, 0x17, 0xfe, 0x84, 0x32, 0x9d, 0x39, 0x42, 0x8d, 0x9b, 0xbc, 0xfe, 0xb0, + 0xab, 0x42, 0xa0, 0x7c, 0xe0, 0x6d, 0x4d, 0xf5, 0x76, 0x03, 0x4a, 0x23, 0xdd, 0x1b, 0x1c, 0x8e, + 0x68, 0xd7, 0x1f, 0x08, 0x7d, 0x18, 0x7f, 0x99, 0x87, 0x92, 0x7f, 0xdb, 0xc8, 0xea, 0x17, 0x69, + 0x1f, 0x53, 0x32, 0x9e, 0x16, 0x1a, 0x50, 0xea, 0x8f, 0x4d, 0x93, 0xa7, 0x82, 0xa8, 0x98, 0x01, + 0xac, 0x7a, 0xb6, 0x10, 0xf1, 0x2c, 0x7a, 0x1d, 0x0a, 0x6c, 0x42, 0x75, 0xeb, 0x73, 0xdc, 0x01, + 0xa9, 0x37, 0x21, 0x41, 0x81, 0xee, 0x26, 0xde, 0x10, 0x5e, 0x4d, 0xa1, 0xce, 0x7c, 0x3c, 0x78, + 0x27, 0xf2, 0x78, 0x70, 0x35, 0x8d, 0x35, 0xfe, 0x6a, 0x70, 0x37, 0xf1, 0x6a, 0x90, 0xba, 0xe3, + 0xff, 0xd1, 0x73, 0xc1, 0x1d, 0xde, 0xc5, 0x64, 0x62, 0xb1, 0x1c, 0x0f, 0xe2, 0xa3, 0x9d, 0x17, + 0x1f, 0xfc, 0x3b, 0x0d, 0x5e, 0xd9, 0xa5, 0xde, 0xd3, 0xd8, 0xe3, 0x41, 0x90, 0xa1, 0x1b, 0x50, + 0x71, 0xe8, 0xc8, 0x7e, 0xa4, 0x7b, 0x1e, 0x75, 0xfc, 0x97, 0x39, 0x15, 0x85, 0x6e, 0xc2, 0xa2, + 0x43, 0x27, 0x86, 0x6b, 0xd8, 0x96, 0x4f, 0x25, 0x34, 0x8c, 0xa3, 0x99, 0x2c, 0xdd, 0x34, 0xb7, + 0x1d, 0xdd, 0xea, 0x0e, 0xa8, 0x3f, 0xd0, 0xa9, 0x28, 0xde, 0xf6, 0x4d, 0xb3, 0xa3, 0x9f, 0xb8, + 0x72, 0x62, 0xf7, 0x41, 0x7c, 0x0c, 0x2b, 0x71, 0x1d, 0xfd, 0x23, 0xc0, 0x94, 0xf1, 0x8f, 0x00, + 0xfb, 0xcd, 0xeb, 0x9b, 0xff, 0x38, 0x22, 0xcf, 0x8f, 0x0f, 0xf3, 0xcb, 0x96, 0x54, 0x4b, 0x9e, + 0x84, 0x00, 0xc6, 0x9f, 0xc3, 0xe5, 0x74, 0x57, 0x30, 0x9f, 0x3e, 0x84, 0xa5, 0xf8, 0x0b, 0x4b, + 0xda, 0xe5, 0x29, 0x4d, 0x49, 0x92, 0xe4, 0xc4, 0x08, 0x6a, 0x0f, 0x0c, 0x97, 0xdd, 0x3a, 0x6c, + 0xe5, 0xbb, 0x59, 0x89, 0xc1, 0x99, 0x47, 0xbb, 0x0e, 0x45, 0x79, 0x30, 0x64, 0x8f, 0xf6, 0x41, + 0x16, 0x03, 0xf9, 0x93, 0x44, 0x8d, 0x8b, 0xa3, 0xf1, 0x17, 0x50, 0x55, 0xf6, 0xf5, 0x93, 0x85, + 0x41, 0x69, 0xc9, 0x22, 0xb5, 0x21, 0x82, 0x02, 0xbd, 0x07, 0x97, 0x4e, 0xf8, 0xdc, 0xbd, 0x13, + 0xdb, 0x4c, 0x78, 0x39, 0x7d, 0x11, 0x1f, 0x40, 0xf5, 0x5e, 0xaf, 0xc7, 0x64, 0xf9, 0x49, 0x95, + 0x66, 0x5c, 0x8a, 0x09, 0x33, 0xe9, 0x26, 0x10, 0x98, 0x0f, 0xe4, 0x89, 0x99, 0x0d, 0x59, 0xf4, + 0x79, 0x5c, 0x25, 0x21, 0x3b, 0x65, 0x85, 0xed, 0x6e, 0xf8, 0x1d, 0xbf, 0x4c, 0xf8, 0x6f, 0xfc, + 0x3a, 0x2c, 0x11, 0x3a, 0xb4, 0x27, 0x54, 0x55, 0x73, 0x05, 0x0a, 0x86, 0xd5, 0xa3, 0x2f, 0xfc, + 0xef, 0x09, 0x1c, 0xc0, 0xdf, 0x83, 0x45, 0x95, 0x94, 0x69, 0x70, 0x03, 0xaa, 0xea, 0x3e, 0x41, + 0x3a, 0xc6, 0xb0, 0xf8, 0x0d, 0x58, 0x26, 0xb4, 0xef, 0x50, 0x77, 0xa0, 0xc6, 0x3d, 0x63, 0x9f, + 0xef, 0xc0, 0xa5, 0x43, 0xea, 0x29, 0xec, 0xd3, 0xc9, 0xef, 0xf2, 0xcb, 0xe6, 0x6e, 0x5a, 0x04, + 0x7c, 0x46, 0x35, 0xf7, 0xb5, 0x58, 0xee, 0xff, 0x80, 0xdf, 0xee, 0xd8, 0x36, 0x19, 0xcc, 0xa9, + 0xbb, 0x46, 0x44, 0xce, 0xc4, 0x44, 0xbe, 0x03, 0xaf, 0x64, 0x89, 0x64, 0x4e, 0xf3, 0xc3, 0xa0, + 0x29, 0x61, 0x28, 0x42, 0xa1, 0x35, 0x1c, 0x79, 0x67, 0x5b, 0xff, 0x5e, 0x80, 0xa2, 0x7c, 0x6c, + 0x42, 0x4d, 0xa8, 0x74, 0x1c, 0xbd, 0x2b, 0x3f, 0xd9, 0xa1, 0x7a, 0xe2, 0xcb, 0xae, 0x54, 0xb1, + 0xb1, 0x9a, 0xb2, 0xc2, 0x2e, 0xa6, 0xb9, 0xb7, 0x35, 0xf4, 0x0c, 0x6a, 0xf1, 0x0f, 0x30, 0x08, + 0x47, 0x6f, 0x81, 0x69, 0xdf, 0x97, 0x1a, 0x1b, 0x53, 0x69, 0xb8, 0x74, 0xb4, 0x0d, 0x25, 0xff, + 0x03, 0x05, 0x52, 0x1f, 0x14, 0x63, 0x1f, 0x38, 0x1a, 0xf5, 0xd4, 0x35, 0x21, 0xe3, 0x29, 0x1f, + 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0xd5, 0xcc, 0x4b, 0x6a, 0x60, 0xf1, 0xb5, 0x69, 0x24, 0x42, 0x70, + 0x07, 0xaa, 0xd1, 0xc7, 0x58, 0xb4, 0x71, 0xde, 0x4b, 0x70, 0x63, 0x7d, 0x0a, 0x45, 0x20, 0x35, + 0xba, 0x1f, 0xda, 0xc8, 0x54, 0x25, 0x4d, 0x6a, 0xca, 0x03, 0x2d, 0xce, 0xa1, 0x1f, 0x03, 0x4a, + 0xbe, 0x30, 0xa2, 0xeb, 0x17, 0x79, 0x0d, 0x6d, 0xe0, 0x73, 0xa8, 0xc4, 0x0e, 0x3f, 0x82, 0xa5, + 0xc4, 0xdb, 0x18, 0x52, 0x27, 0xd9, 0xac, 0x37, 0xc7, 0xc6, 0xab, 0xd3, 0x89, 0x02, 0x03, 0x92, + 0x2f, 0x4b, 0x11, 0x03, 0x32, 0xdf, 0xc2, 0x22, 0x06, 0x64, 0x3c, 0x4f, 0x89, 0x5c, 0xf3, 0x6f, + 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x1c, 0xfa, 0x18, 0x8a, + 0x12, 0x85, 0x2e, 0x27, 0xc9, 0x7c, 0x09, 0x6b, 0x69, 0x4b, 0x42, 0xc0, 0x01, 0xcc, 0xab, 0x83, + 0x35, 0x5a, 0xcf, 0x7c, 0x1a, 0x13, 0xa2, 0xa6, 0x3e, 0x9d, 0x05, 0x46, 0xf1, 0x01, 0x26, 0x6e, + 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, 0x1e, 0x9c, 0x43, 0x7d, 0xfe, 0xe9, 0x2f, 0xd1, 0xbc, + 0xd1, 0x8d, 0x28, 0x4f, 0xd6, 0xa0, 0xd3, 0xb8, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0xe5, 0xa0, + 0x81, 0xa2, 0x57, 0x14, 0xa6, 0x78, 0x3b, 0x6f, 0x5c, 0x4e, 0x5f, 0x0c, 0x62, 0x20, 0x9b, 0x58, + 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, 0xda, 0xf3, 0x70, 0x0e, 0xed, 0x01, 0x84, 0x6d, 0x08, + 0x5d, 0x89, 0x74, 0xed, 0x58, 0x23, 0x6b, 0x34, 0x32, 0x56, 0x7d, 0xef, 0xcf, 0xab, 0x5d, 0x29, + 0x12, 0xcd, 0x94, 0x76, 0xd5, 0xa8, 0xa9, 0x6f, 0xc5, 0xac, 0x5a, 0xe3, 0x1c, 0xba, 0x0f, 0xd5, + 0x68, 0xb3, 0x8a, 0xd4, 0x83, 0xd4, 0x3e, 0x96, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0xba, 0x18, 0xba, + 0x15, 0x95, 0x38, 0xad, 0xd5, 0xa5, 0xca, 0x36, 0x61, 0x35, 0xbd, 0x1f, 0xa1, 0x9b, 0x51, 0xc9, + 0xd9, 0x5d, 0xb0, 0x71, 0xe3, 0x02, 0x94, 0xc2, 0xab, 0x1f, 0x42, 0x39, 0xf8, 0x1f, 0x43, 0x24, + 0x4f, 0xe2, 0xff, 0x6e, 0x88, 0xea, 0x3a, 0xa1, 0x96, 0xf7, 0xb6, 0xb6, 0x7d, 0xfb, 0x8f, 0x5f, + 0xad, 0x6b, 0x7f, 0xfb, 0x6a, 0x5d, 0xfb, 0xfb, 0x57, 0xeb, 0xda, 0xaf, 0xff, 0xb1, 0x9e, 0x03, + 0xdc, 0x1d, 0x6c, 0x76, 0xa9, 0x63, 0x6d, 0xea, 0xa6, 0xd1, 0xa5, 0x9b, 0xf6, 0xd6, 0xa6, 0xcf, + 0xe3, 0x8c, 0xba, 0x2e, 0x75, 0x26, 0xd4, 0x79, 0x36, 0x33, 0x3a, 0x3e, 0x9e, 0xe3, 0xff, 0x2c, + 0x7c, 0xf7, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x39, 0xf9, 0x3c, 0x20, 0x73, 0x28, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc *grpc.ClientConn +} + +func NewControlClient(cc *grpc.ClientConn) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return x, nil } -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return m, nil } -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", + return out, nil +} + +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + return out, nil +} + +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + if err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + return out, nil +} + +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + return out, nil +} + +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + if err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + return out, nil +} + +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return x, nil } -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream } -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +type controlSubscribeClient struct { + grpc.ClientStream +} + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - return dAtA[:n], nil + return m, nil } -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ControlServer is the server API for Control service. +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error } -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func RegisterControlServer(s *grpc.Server, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlTrackStatusServer struct { + grpc.ServerStream } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return interceptor(ctx, in, info, handler) } -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) } - return len(dAtA) - i, nil + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + return interceptor(ctx, in, info, handler) +} + +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { + return nil, err } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { + return nil, err } - return len(dAtA) - i, nil + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { + return nil, err } - return len(dAtA) - i, nil + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) +} -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) +} + +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlSubscribeServer struct { + grpc.ServerStream +} + +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, + { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, + { + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", +} + +func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -4998,31 +5361,58 @@ func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + return len(dAtA) - i, nil +} + +func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + return dAtA[:n], nil +} + +func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Destination) > 0 { + i -= len(m.Destination) + copy(dAtA[i:], m.Destination) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + i-- + dAtA[i] = 0x1a + } + if len(m.Source) > 0 { + i -= len(m.Source) + copy(dAtA[i:], m.Source) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + i-- + dAtA[i] = 0x12 + } + if len(m.Event) > 0 { + i -= len(m.Event) + copy(dAtA[i:], m.Event) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5032,12 +5422,12 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5046,114 +5436,24 @@ func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- dAtA[i] = 0x12 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5163,12 +5463,12 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5177,36 +5477,24 @@ func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5216,12 +5504,12 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5230,22 +5518,17 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5255,12 +5538,12 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5269,17 +5552,24 @@ func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.ExecutorResources) > 0 { + i -= len(m.ExecutorResources) + copy(dAtA[i:], m.ExecutorResources) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) + i-- + dAtA[i] = 0x12 + } + if len(m.Taskresources) > 0 { + i -= len(m.Taskresources) + copy(dAtA[i:], m.Taskresources) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5289,12 +5579,12 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5303,18 +5593,6 @@ func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } if m.Environment != nil { { size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) @@ -5330,7 +5608,7 @@ func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5340,12 +5618,12 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5354,22 +5632,29 @@ func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if m.CleanupTasksReply != nil { + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5379,12 +5664,12 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5393,29 +5678,10 @@ func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5425,12 +5691,12 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5439,41 +5705,10 @@ func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5483,12 +5718,12 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5497,22 +5732,10 @@ func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5522,12 +5745,12 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5536,24 +5759,10 @@ func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5561,13 +5770,20 @@ func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5577,12 +5793,12 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5591,73 +5807,33 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.Event != nil { + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i-- - dAtA[i] = 0x10 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CleanupTasksReply != nil { + if m.MesosHeartbeat != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5665,12 +5841,11 @@ func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5680,12 +5855,12 @@ func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5694,188 +5869,161 @@ func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentStateChanged != nil { + { + size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { +func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentCreated != nil { + { + size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.TaskStateChanged != nil { + { + size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x22 } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 + return len(dAtA) - i, nil +} +func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskStatusChanged != nil { + { + size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x2a } return len(dAtA) - i, nil } - -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { +func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Tasklaunched != nil { + { + size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + return len(dAtA) - i, nil +} +func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa + if m.MesosTaskcreated != nil { + { + size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a } return len(dAtA) - i, nil } - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.DeploymentInfo != nil { + if m.EnvironmentDestroyed != nil { { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5883,112 +6031,53 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x42 } return len(dAtA) - i, nil } - -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { +func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentError != nil { + { + size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + return len(dAtA) - i, nil +} +func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + if m.KilltasksMesos != nil { + { + size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0xa + dAtA[i] = 0x52 } return len(dAtA) - i, nil } - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5998,12 +6087,12 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6015,7 +6104,7 @@ func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6025,12 +6114,12 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6039,24 +6128,10 @@ func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6066,12 +6141,12 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6080,17 +6155,46 @@ func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6100,12 +6204,12 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6114,9 +6218,9 @@ func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Task != nil { + if m.Version != nil { { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6124,27 +6228,63 @@ func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + dAtA[i] = 0x3a } - return dAtA[:n], nil -} + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6153,24 +6293,17 @@ func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6180,12 +6313,12 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6194,52 +6327,10 @@ func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6249,12 +6340,12 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6263,31 +6354,10 @@ func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6297,12 +6367,12 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6311,69 +6381,10 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6381,37 +6392,20 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6421,144 +6415,12 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6624,10 +6486,22 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x3a } } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 + } + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a + } + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6635,25 +6509,9 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -6661,24 +6519,24 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) i-- dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { +func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6688,12 +6546,12 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6702,24 +6560,36 @@ func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 } } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { +func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6729,12 +6599,12 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6743,44 +6613,22 @@ func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6790,12 +6638,12 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,31 +6652,17 @@ func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6838,12 +6672,12 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6852,24 +6686,34 @@ func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Workflow != nil { + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { +func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6879,12 +6723,12 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6893,10 +6737,22 @@ func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { +func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6906,12 +6762,12 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6920,34 +6776,29 @@ func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { +func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6957,12 +6808,12 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6971,17 +6822,20 @@ func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + if m.ReconfigureAll { i-- - dAtA[i] = 0x12 + if m.ReconfigureAll { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6989,13 +6843,20 @@ func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7005,12 +6866,12 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7019,24 +6880,22 @@ func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + if len(m.RoleName) > 0 { + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) i-- dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { +func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7046,12 +6905,12 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7060,24 +6919,38 @@ func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7087,12 +6960,12 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7101,30 +6974,62 @@ func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if m.Force { i-- - dAtA[i] = 0x8 + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if m.AllowInRunningState { + i-- + if m.AllowInRunningState { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if m.KeepTasks { + i-- + if m.KeepTasks { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7133,17 +7038,22 @@ func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + if m.CleanupTasksReply != nil { + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7153,12 +7063,12 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7167,15 +7077,36 @@ func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7185,12 +7116,12 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7199,15 +7130,10 @@ func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7217,12 +7143,12 @@ func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7231,17 +7157,36 @@ func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + if m.ExcludeGlobals { + i-- + if m.ExcludeGlobals { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Queries) > 0 { + for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Queries[iNdEx]) + copy(dAtA[i:], m.Queries[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7251,12 +7196,12 @@ func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7265,22 +7210,29 @@ func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { +func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7290,12 +7242,12 @@ func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7304,17 +7256,67 @@ func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Empty) Marshal() (dAtA []byte, err error) { +func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7324,12 +7326,12 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { +func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7338,1056 +7340,1428 @@ func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.OfferId) > 0 { + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i-- + dAtA[i] = 0x1a } - return n + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 +func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + return len(dAtA) - i, nil } -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 +func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 +func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 +func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Task != nil { + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 + +func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.ControlMode) > 0 { + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *Version) Size() (n int) { - if m == nil { - return 0 +func (m *CommandInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 + } } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Shell { + i-- + if m.Shell { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 +func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 + if len(m.Target) > 0 { + i -= len(m.Target) + copy(dAtA[i:], m.Target) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i-- + dAtA[i] = 0x1a } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *TaskInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.OutboundChannels) > 0 { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 } } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 +func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.RunningTasks) > 0 { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 +func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) + if len(m.PathSpec) > 0 { + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 +func (m *RoleInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a } } - if m.ReconfigureAll { - n += 2 + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 + if len(m.FullPath) > 0 { + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 +func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.AllTags { + i-- + if m.AllTags { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) + if m.AllBranches { + i-- + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x18 } - if m.ExcludeGlobals { - n += 2 + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0x1a } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.WorkflowTemplates) > 0 { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 +func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + return len(dAtA) - i, nil } -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 +func (m *RepoInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return dAtA[:n], nil } -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } +func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.Default { + i-- + if m.Default { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 } - return n + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 +func (m *ListReposReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.GlobalDefaultRevision) > 0 { + i -= len(m.GlobalDefaultRevision) + copy(dAtA[i:], m.GlobalDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + i-- + dAtA[i] = 0x12 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Repos) > 0 { + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 +func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 +func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.NewDefaultRevision) > 0 { + i -= len(m.NewDefaultRevision) + copy(dAtA[i:], m.NewDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 +func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 +func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 +func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 +func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 +func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 +func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0x12 } - if m.AllBranches { - n += 2 + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.AllTags { - n += 2 + return len(dAtA) - i, nil +} + +func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Empty) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Event_MesosHeartbeat) Size() (n int) { + if m == nil { + return 0 } + var l int + _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *WorkflowTemplateInfo) Size() (n int) { +func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Repo) + l = len(m.Event) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Template) + l = len(m.Source) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Revision) + l = len(m.Destination) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8397,17 +8771,19 @@ func (m *WorkflowTemplateInfo) Size() (n int) { return n } -func (m *GetWorkflowTemplatesReply) Size() (n int) { +func (m *Ev_TaskStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } + l = len(m.Taskid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8415,32 +8791,33 @@ func (m *GetWorkflowTemplatesReply) Size() (n int) { return n } -func (m *ListReposRequest) Size() (n int) { +func (m *Ev_TaskStatusChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Taskid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RepoInfo) Size() (n int) { +func (m *Ev_TaskLaunched) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) + l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8450,19 +8827,17 @@ func (m *RepoInfo) Size() (n int) { return n } -func (m *ListReposReply) Size() (n int) { +func (m *Ev_MesosTaskCreated) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } + l = len(m.Taskresources) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.GlobalDefaultRevision) + l = len(m.ExecutorResources) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8472,18 +8847,14 @@ func (m *ListReposReply) Size() (n int) { return n } -func (m *AddRepoRequest) Size() (n int) { +func (m *Ev_EnvironmentCreated) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { + if m.Environment != nil { + l = m.Environment.Size() n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { @@ -8492,17 +8863,17 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *AddRepoReply) Size() (n int) { +func (m *Ev_EnvironmentDestroyed) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRevision) - if l > 0 { + if m.CleanupTasksReply != nil { + l = m.CleanupTasksReply.Size() n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Info) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8512,60 +8883,57 @@ func (m *AddRepoReply) Size() (n int) { return n } -func (m *RemoveRepoRequest) Size() (n int) { +func (m *Ev_EnvironmentError) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RemoveRepoReply) Size() (n int) { +func (m *Ev_KillTasksMesos) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RefreshReposRequest) Size() (n int) { +func (m *StatusRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *SetDefaultRepoRequest) Size() (n int) { +func (m *StatusReply) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.StatusUpdates) > 0 { + for _, e := range m.StatusUpdates { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8573,15 +8941,17 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { +func (m *StatusUpdate) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Level != 0 { + n += 1 + sovO2Control(uint64(m.Level)) + } + if m.Event != nil { + n += m.Event.Size() } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8589,60 +8959,2510 @@ func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { return n } -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { +func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + if m.MesosHeartbeat != nil { + l = m.MesosHeartbeat.Size() + n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Revision) + return n +} +func (m *Event) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Timestamp) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if m.Payload != nil { + n += m.Payload.Size() + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *SetRepoDefaultRevisionReply) Size() (n int) { +func (m *Event_EnvironmentStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Info) - if l > 0 { + if m.EnvironmentStateChanged != nil { + l = m.EnvironmentStateChanged.Size() n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + return n +} +func (m *Event_EnvironmentCreated) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentCreated != nil { + l = m.EnvironmentCreated.Size() + n += 1 + l + sovO2Control(uint64(l)) } return n } - -func (m *Empty) Size() (n int) { +func (m *Event_TaskStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.TaskStateChanged != nil { + l = m.TaskStateChanged.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_TaskStatusChanged) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TaskStatusChanged != nil { + l = m.TaskStatusChanged.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_Tasklaunched) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Tasklaunched != nil { + l = m.Tasklaunched.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_MesosTaskcreated) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MesosTaskcreated != nil { + l = m.MesosTaskcreated.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_EnvironmentDestroyed) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentDestroyed != nil { + l = m.EnvironmentDestroyed.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_EnvironmentError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentError != nil { + l = m.EnvironmentError.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_KilltasksMesos) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.KilltasksMesos != nil { + l = m.KilltasksMesos.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *SubscribeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetFrameworkInfoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Version) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Major != 0 { + n += 1 + sovO2Control(uint64(m.Major)) + } + if m.Minor != 0 { + n += 1 + sovO2Control(uint64(m.Minor)) + } + if m.Patch != 0 { + n += 1 + sovO2Control(uint64(m.Patch)) + } + l = len(m.Build) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ProductName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.VersionStr) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetFrameworkInfoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FrameworkId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.EnvironmentsCount != 0 { + n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) + } + if m.TasksCount != 0 { + n += 1 + sovO2Control(uint64(m.TasksCount)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.HostsCount != 0 { + n += 1 + sovO2Control(uint64(m.HostsCount)) + } + l = len(m.InstanceName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Version != nil { + l = m.Version.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TeardownRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Reason) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TeardownReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentsReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FrameworkId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Environments) > 0 { + for _, e := range m.Environments { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EnvironmentInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.CreatedWhen) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.RootRole) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) + } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NewEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NewEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Environment != nil { + l = m.Environment.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Environment != nil { + l = m.Environment.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Workflow != nil { + l = m.Workflow.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ControlEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Type != 0 { + n += 1 + sovO2Control(uint64(m.Type)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ControlEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ModifyEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Operations) > 0 { + for _, e := range m.Operations { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ReconfigureAll { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EnvironmentOperation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovO2Control(uint64(m.Type)) + } + l = len(m.RoleName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ModifyEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.FailedOperations) > 0 { + for _, e := range m.FailedOperations { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DestroyEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.KeepTasks { + n += 2 + } + if m.AllowInRunningState { + n += 2 + } + if m.Force { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DestroyEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CleanupTasksReply != nil { + l = m.CleanupTasksReply.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Queries) > 0 { + for _, s := range m.Queries { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ExcludeGlobals { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ShortTaskInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Locked { + n += 2 + } + l = len(m.TaskId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.DeploymentInfo != nil { + l = m.DeploymentInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskDeploymentInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.AgentId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.OfferId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ExecutorId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTasksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTasksReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTaskRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TaskId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTaskReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Task != nil { + l = m.Task.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskClassInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ControlMode) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CommandInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Env) > 0 { + for _, s := range m.Env { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.Shell { + n += 2 + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.User) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChannelInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Target) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ShortInfo != nil { + l = m.ShortInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.ClassInfo != nil { + l = m.ClassInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.InboundChannels) > 0 { + for _, e := range m.InboundChannels { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.OutboundChannels) > 0 { + for _, e := range m.OutboundChannels { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.CommandInfo != nil { + l = m.CommandInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.TaskPath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.EnvId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CleanupTasksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CleanupTasksReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.RunningTasks) > 0 { + for _, e := range m.RunningTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetRolesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EnvId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.PathSpec) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RoleInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.FullPath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.Roles) > 0 { + for _, e := range m.Roles { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetRolesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Roles) > 0 { + for _, e := range m.Roles { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetWorkflowTemplatesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RepoPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.RevisionPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.AllBranches { + n += 2 + } + if m.AllTags { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WorkflowTemplateInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Repo) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Template) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetWorkflowTemplatesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.WorkflowTemplates) > 0 { + for _, e := range m.WorkflowTemplates { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ListReposRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RepoInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Default { + n += 2 + } + l = len(m.DefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ListReposReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Repos) > 0 { + for _, e := range m.Repos { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.GlobalDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.DefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultRepo) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RefreshReposRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetDefaultRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetRepoDefaultRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetRepoDefaultRevisionReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Empty) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control + } + 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_MesosHeartbeat: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentStateChanged: 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Source", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Source = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Destination = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskStateChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskStatusChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskLaunched) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskLaunched: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_MesosTaskCreated) 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 ErrIntOverflowO2Control + } + 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: Ev_MesosTaskCreated: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskresources = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentCreated: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentDestroyed) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentDestroyed: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CleanupTasksReply == nil { + m.CleanupTasksReply = &CleanupTasksReply{} + } + if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Environmentid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentError) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentError: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_KillTasksMesos) 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 ErrIntOverflowO2Control + } + 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: Ev_KillTasksMesos: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusRequest) 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 ErrIntOverflowO2Control + } + 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: StatusRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusReply) 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 ErrIntOverflowO2Control + } + 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: StatusReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) + if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } } - return n -} -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { +func (m *StatusUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8665,125 +11485,402 @@ func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") + return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= StatusUpdate_Level(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Event_MesosHeartbeat{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &StatusUpdate_MesosHeartbeat{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +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 ErrIntOverflowO2Control + } + 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 Timestamp", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timestamp = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_EnvironmentStateChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentStateChanged{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_EnvironmentCreated{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentCreated{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_TaskStateChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_TaskStateChanged{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control + v := &Ev_TaskStatusChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { - return io.ErrUnexpectedEOF + m.Payload = &Event_TaskStatusChanged{v} + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_TaskLaunched{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if skippy < 0 { + m.Payload = &Event_Tasklaunched{v} + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control + v := &Ev_MesosTaskCreated{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { + m.Payload = &Event_MesosTaskcreated{v} + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + v := &Ev_EnvironmentDestroyed{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Payload = &Event_EnvironmentDestroyed{v} + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8793,27 +11890,30 @@ func (m *StatusReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + v := &Ev_EnvironmentError{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentError{v} iNdEx = postIndex - case 2: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8840,10 +11940,11 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &Ev_KillTasksMesos{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Payload = &Event_KilltasksMesos{v} iNdEx = postIndex default: iNdEx = preIndex @@ -8870,7 +11971,7 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *StatusUpdate) Unmarshal(dAtA []byte) error { +func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8893,66 +11994,12 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index 953c0b6c8..7d86359e8 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -98,11 +98,11 @@ func NewEventTaskStatus(status *mesos.TaskStatus) *Event { } func NewEventTaskLaunch(taskid string) *Event { - var ltask Ev_TaskLaunch - var eltask Event_Tasklaunch + var ltask Ev_TaskLaunched + var eltask Event_Tasklaunched ltask.Taskid = taskid - eltask.Tasklaunch = <ask + eltask.Tasklaunched = <ask return WrapEvent(&eltask) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 88d06ff87..d925a7489 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,27 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -//////////////////////////////////////// -// Global status -//////////////////////////////////////// -type StatusRequest struct { +type Ev_EnvironmentStateChanged struct { + Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } +func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentStateChanged) ProtoMessage() {} +func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,38 +191,59 @@ func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) +func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) } -func (m *StatusRequest) XXX_Size() int { +func (m *Ev_EnvironmentStateChanged) XXX_Size() int { return m.Size() } -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) +func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) } -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentStateChanged) GetEvent() string { + if m != nil { + return m.Event + } + return "" } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentStateChanged) GetSource() string { + if m != nil { + return m.Source + } + return "" +} + +func (m *Ev_EnvironmentStateChanged) GetDestination() string { + if m != nil { + return m.Destination + } + return "" +} + +type Ev_TaskStateChanged struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } +func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskStateChanged) ProtoMessage() {} +func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *StatusReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -232,54 +253,52 @@ func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) +func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) } -func (m *StatusReply) XXX_Size() int { +func (m *Ev_TaskStateChanged) XXX_Size() int { return m.Size() } -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) +func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo -func (m *StatusReply) GetState() string { +func (m *Ev_TaskStateChanged) GetTaskid() string { if m != nil { - return m.State + return m.Taskid } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { +func (m *Ev_TaskStateChanged) GetState() string { if m != nil { - return m.StatusUpdates + return m.State } - return nil + return "" } -type StatusUpdate struct { - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_TaskStatusChanged struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { +func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } +func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskStatusChanged) ProtoMessage() {} +func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -289,79 +308,51 @@ func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) +func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) } -func (m *StatusUpdate) XXX_Size() int { +func (m *Ev_TaskStatusChanged) XXX_Size() int { return m.Size() } -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo - -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int -} - -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { +func (m *Ev_TaskStatusChanged) GetTaskid() string { if m != nil { - return m.Event + return m.Taskid } - return nil + return "" } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { +func (m *Ev_TaskStatusChanged) GetStatus() string { if m != nil { - return m.Level - } - return StatusUpdate_DEBUG -} - -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil -} - -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), + return m.Status } + return "" } -//////////////////////////////////////// -// Framework -//////////////////////////////////////// -type GetFrameworkInfoRequest struct { +type Ev_TaskLaunched struct { + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { +func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } +func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskLaunched) ProtoMessage() {} +func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -371,42 +362,45 @@ func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) +func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) } -func (m *GetFrameworkInfoRequest) XXX_Size() int { +func (m *Ev_TaskLaunched) XXX_Size() int { return m.Size() } -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) +func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` +func (m *Ev_TaskLaunched) GetTaskid() string { + if m != nil { + return m.Taskid + } + return "" +} + +type Ev_MesosTaskCreated struct { + Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` + ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { +func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } +func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } +func (*Ev_MesosTaskCreated) ProtoMessage() {} +func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } -func (m *Version) XXX_Unmarshal(b []byte) error { +func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -416,85 +410,99 @@ func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) +func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) } -func (m *Version) XXX_Size() int { +func (m *Ev_MesosTaskCreated) XXX_Size() int { return m.Size() } -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) +func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) } -var xxx_messageInfo_Version proto.InternalMessageInfo +var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo -func (m *Version) GetMajor() int32 { +func (m *Ev_MesosTaskCreated) GetTaskresources() string { if m != nil { - return m.Major + return m.Taskresources } - return 0 + return "" } -func (m *Version) GetMinor() int32 { +func (m *Ev_MesosTaskCreated) GetExecutorResources() string { if m != nil { - return m.Minor + return m.ExecutorResources } - return 0 + return "" } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch - } - return 0 +type Ev_EnvironmentCreated struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build - } - return "" +func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } +func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentCreated) ProtoMessage() {} +func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } - -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName +func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) +} +func (m *Ev_EnvironmentCreated) XXX_Size() int { + return m.Size() +} +func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) } -func (m *Version) GetVersionStr() string { +var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo + +func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.VersionStr + return m.Environment } - return "" + return nil } -type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_EnvironmentDestroyed struct { + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} +func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } +func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentDestroyed) ProtoMessage() {} +func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -504,87 +512,50 @@ func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) +func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) } -func (m *GetFrameworkInfoReply) XXX_Size() int { +func (m *Ev_EnvironmentDestroyed) XXX_Size() int { return m.Size() } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) +func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo -func (m *GetFrameworkInfoReply) GetFrameworkId() string { +func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { if m != nil { - return m.FrameworkId + return m.CleanupTasksReply } - return "" + return nil } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { +func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { if m != nil { - return m.EnvironmentsCount + return m.Environmentid } - return 0 + return "" } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetState() string { - if m != nil { - return m.State - } - return "" -} - -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName - } - return "" -} - -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version - } - return nil -} - -// Not implemented yet -type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` +type Ev_EnvironmentError struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} +func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } +func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentError) ProtoMessage() {} +func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -594,43 +565,36 @@ func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) +func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) } -func (m *TeardownRequest) XXX_Size() int { +func (m *Ev_EnvironmentError) XXX_Size() int { return m.Size() } -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) +func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo - -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason - } - return "" -} +var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type TeardownReply struct { +type Ev_KillTasksMesos struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} +func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } +func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } +func (*Ev_KillTasksMesos) ProtoMessage() {} +func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { +func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -640,39 +604,39 @@ func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) +func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) } -func (m *TeardownReply) XXX_Size() int { +func (m *Ev_KillTasksMesos) XXX_Size() int { return m.Size() } -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) +func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) } -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo +var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo //////////////////////////////////////// -// Environment +// Global status //////////////////////////////////////// -type GetEnvironmentsRequest struct { +type StatusRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} +func (m *StatusRequest) Reset() { *m = StatusRequest{} } +func (m *StatusRequest) String() string { return proto.CompactTextString(m) } +func (*StatusRequest) ProtoMessage() {} +func (*StatusRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { +func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -682,38 +646,38 @@ func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) +func (m *StatusRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusRequest.Merge(m, src) } -func (m *GetEnvironmentsRequest) XXX_Size() int { +func (m *StatusRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) +func (m *StatusRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StatusRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo +var xxx_messageInfo_StatusRequest proto.InternalMessageInfo -type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusReply struct { + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} +func (m *StatusReply) Reset() { *m = StatusReply{} } +func (m *StatusReply) String() string { return proto.CompactTextString(m) } +func (*StatusReply) ProtoMessage() {} +func (*StatusReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { +func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -723,59 +687,54 @@ func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) +func (m *StatusReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusReply.Merge(m, src) } -func (m *GetEnvironmentsReply) XXX_Size() int { +func (m *StatusReply) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) +func (m *StatusReply) XXX_DiscardUnknown() { + xxx_messageInfo_StatusReply.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +var xxx_messageInfo_StatusReply proto.InternalMessageInfo -func (m *GetEnvironmentsReply) GetFrameworkId() string { +func (m *StatusReply) GetState() string { if m != nil { - return m.FrameworkId + return m.State } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { +func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { if m != nil { - return m.Environments + return m.StatusUpdates } return nil } -type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusUpdate struct { + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` + // Types that are valid to be assigned to Event: + // *StatusUpdate_MesosHeartbeat + Event isStatusUpdate_Event `protobuf_oneof:"Event"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} +func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } +func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } +func (*StatusUpdate) ProtoMessage() {} +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { +func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -785,101 +744,88 @@ func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) +func (m *StatusUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_StatusUpdate.Merge(m, src) } -func (m *EnvironmentInfo) XXX_Size() int { +func (m *StatusUpdate) XXX_Size() int { return m.Size() } -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) +func (m *StatusUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_StatusUpdate.DiscardUnknown(m) } -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo +var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id - } - return "" +type isStatusUpdate_Event interface { + isStatusUpdate_Event() + MarshalTo([]byte) (int, error) + Size() int } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen - } - return "" +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State - } - return "" -} +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { +func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { - return m.Tasks + return m.Event } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole - } - return "" -} - -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { +func (m *StatusUpdate) GetLevel() StatusUpdate_Level { if m != nil { - return m.CurrentRunNumber + return m.Level } - return 0 + return StatusUpdate_DEBUG } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { + return x.MesosHeartbeat } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +// XXX_OneofWrappers is for the internal use of the proto package. +func (*StatusUpdate) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars - } - return nil -} - -type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Event struct { + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Types that are valid to be assigned to Payload: + // *Event_EnvironmentStateChanged + // *Event_EnvironmentCreated + // *Event_TaskStateChanged + // *Event_TaskStatusChanged + // *Event_Tasklaunched + // *Event_MesosTaskcreated + // *Event_EnvironmentDestroyed + // *Event_EnvironmentError + // *Event_KilltasksMesos + Payload isEvent_Payload `protobuf_oneof:"Payload"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} +func (m *Event) Reset() { *m = Event{} } +func (m *Event) String() string { return proto.CompactTextString(m) } +func (*Event) ProtoMessage() {} +func (*Event) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Event.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -889,98 +835,172 @@ func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) +func (m *Event) XXX_Merge(src proto.Message) { + xxx_messageInfo_Event.Merge(m, src) } -func (m *NewEnvironmentRequest) XXX_Size() int { +func (m *Event) XXX_Size() int { return m.Size() } -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) +func (m *Event) XXX_DiscardUnknown() { + xxx_messageInfo_Event.DiscardUnknown(m) } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_Event proto.InternalMessageInfo -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { +type isEvent_Payload interface { + isEvent_Payload() + MarshalTo([]byte) (int, error) + Size() int +} + +type Event_EnvironmentStateChanged struct { + EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +} +type Event_EnvironmentCreated struct { + EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +} +type Event_TaskStateChanged struct { + TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` +} +type Event_TaskStatusChanged struct { + TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` +} +type Event_Tasklaunched struct { + Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` +} +type Event_MesosTaskcreated struct { + MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` +} +type Event_EnvironmentDestroyed struct { + EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` +} +type Event_EnvironmentError struct { + EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` +} +type Event_KilltasksMesos struct { + KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +} + +func (*Event_EnvironmentStateChanged) isEvent_Payload() {} +func (*Event_EnvironmentCreated) isEvent_Payload() {} +func (*Event_TaskStateChanged) isEvent_Payload() {} +func (*Event_TaskStatusChanged) isEvent_Payload() {} +func (*Event_Tasklaunched) isEvent_Payload() {} +func (*Event_MesosTaskcreated) isEvent_Payload() {} +func (*Event_EnvironmentDestroyed) isEvent_Payload() {} +func (*Event_EnvironmentError) isEvent_Payload() {} +func (*Event_KilltasksMesos) isEvent_Payload() {} + +func (m *Event) GetPayload() isEvent_Payload { if m != nil { - return m.WorkflowTemplate + return m.Payload } - return "" + return nil } -func (m *NewEnvironmentRequest) GetVars() map[string]string { +func (m *Event) GetTimestamp() string { if m != nil { - return m.Vars + return m.Timestamp } - return nil + return "" } -type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { + if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { + return x.EnvironmentStateChanged + } + return nil } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} +func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { + if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { + return x.EnvironmentCreated + } + return nil } -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) + +func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { + if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { + return x.TaskStateChanged + } + return nil } -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { + if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { + return x.TaskStatusChanged } + return nil } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) + +func (m *Event) GetTasklaunched() *Ev_TaskLaunched { + if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { + return x.Tasklaunched + } + return nil } -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { + if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { + return x.MesosTaskcreated + } + return nil } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { + if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { + return x.EnvironmentDestroyed + } + return nil } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { + if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { + return x.EnvironmentError + } + return nil +} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { + if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { + return x.KilltasksMesos } return nil } -type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +// XXX_OneofWrappers is for the internal use of the proto package. +func (*Event) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*Event_EnvironmentStateChanged)(nil), + (*Event_EnvironmentCreated)(nil), + (*Event_TaskStateChanged)(nil), + (*Event_TaskStatusChanged)(nil), + (*Event_Tasklaunched)(nil), + (*Event_MesosTaskcreated)(nil), + (*Event_EnvironmentDestroyed)(nil), + (*Event_EnvironmentError)(nil), + (*Event_KilltasksMesos)(nil), + } +} + +type SubscribeRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { +func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } +func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } +func (*SubscribeRequest) ProtoMessage() {} +func (*SubscribeRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -990,45 +1010,39 @@ func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) +func (m *SubscribeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubscribeRequest.Merge(m, src) } -func (m *GetEnvironmentRequest) XXX_Size() int { +func (m *SubscribeRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) +func (m *SubscribeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo - -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" -} +var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo -type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +//////////////////////////////////////// +// Framework +//////////////////////////////////////// +type GetFrameworkInfoRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { +func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } +func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } +func (*GetFrameworkInfoRequest) ProtoMessage() {} +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1038,52 +1052,42 @@ func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) +func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) } -func (m *GetEnvironmentReply) XXX_Size() int { +func (m *GetFrameworkInfoRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo - -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil +func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow - } - return nil -} +var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo -type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Version struct { + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { +func (m *Version) Reset() { *m = Version{} } +func (m *Version) String() string { return proto.CompactTextString(m) } +func (*Version) ProtoMessage() {} +func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Version.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1093,116 +1097,85 @@ func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) +func (m *Version) XXX_Merge(src proto.Message) { + xxx_messageInfo_Version.Merge(m, src) } -func (m *ControlEnvironmentRequest) XXX_Size() int { +func (m *Version) XXX_Size() int { return m.Size() } -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) +func (m *Version) XXX_DiscardUnknown() { + xxx_messageInfo_Version.DiscardUnknown(m) } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_Version proto.InternalMessageInfo -func (m *ControlEnvironmentRequest) GetId() string { +func (m *Version) GetMajor() int32 { if m != nil { - return m.Id + return m.Major } - return "" + return 0 } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { +func (m *Version) GetMinor() int32 { if m != nil { - return m.Type + return m.Minor } - return ControlEnvironmentRequest_NOOP + return 0 } -type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Version) GetPatch() int32 { + if m != nil { + return m.Patch + } + return 0 } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo - -func (m *ControlEnvironmentReply) GetId() string { +func (m *Version) GetBuild() string { if m != nil { - return m.Id + return m.Build } return "" } -func (m *ControlEnvironmentReply) GetState() string { +func (m *Version) GetProductName() string { if m != nil { - return m.State + return m.ProductName } return "" } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { +func (m *Version) GetVersionStr() string { if m != nil { - return m.CurrentRunNumber + return m.VersionStr } - return 0 + return "" } -type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetFrameworkInfoReply struct { + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} +func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } +func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } +func (*GetFrameworkInfoReply) ProtoMessage() {} +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1212,115 +1185,87 @@ func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([] return b[:n], nil } } -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) +func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) } -func (m *ModifyEnvironmentRequest) XXX_Size() int { +func (m *GetFrameworkInfoReply) XXX_Size() int { return m.Size() } -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) +func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo -func (m *ModifyEnvironmentRequest) GetId() string { +func (m *GetFrameworkInfoReply) GetFrameworkId() string { if m != nil { - return m.Id + return m.FrameworkId } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { +func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { if m != nil { - return m.Operations + return m.EnvironmentsCount } - return nil + return 0 } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { +func (m *GetFrameworkInfoReply) GetTasksCount() int32 { if m != nil { - return m.ReconfigureAll + return m.TasksCount } - return false + return 0 } -type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *GetFrameworkInfoReply) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *GetFrameworkInfoReply) GetHostsCount() int32 { + if m != nil { + return m.HostsCount } + return 0 } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) -} - -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { +func (m *GetFrameworkInfoReply) GetInstanceName() string { if m != nil { - return m.Type + return m.InstanceName } - return EnvironmentOperation_NOOP + return "" } -func (m *EnvironmentOperation) GetRoleName() string { +func (m *GetFrameworkInfoReply) GetVersion() *Version { if m != nil { - return m.RoleName + return m.Version } - return "" + return nil } -type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Not implemented yet +type TeardownRequest struct { + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} +func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } +func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } +func (*TeardownRequest) ProtoMessage() {} +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1330,61 +1275,43 @@ func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]by return b[:n], nil } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) +func (m *TeardownRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TeardownRequest.Merge(m, src) } -func (m *ModifyEnvironmentReply) XXX_Size() int { +func (m *TeardownRequest) XXX_Size() int { return m.Size() } -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) -} - -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo - -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations - } - return nil +func (m *TeardownRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TeardownRequest.DiscardUnknown(m) } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id - } - return "" -} +var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo -func (m *ModifyEnvironmentReply) GetState() string { +func (m *TeardownRequest) GetReason() string { if m != nil { - return m.State + return m.Reason } return "" } -type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` +type TeardownReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} +func (m *TeardownReply) Reset() { *m = TeardownReply{} } +func (m *TeardownReply) String() string { return proto.CompactTextString(m) } +func (*TeardownReply) ProtoMessage() {} +func (*TeardownReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} } -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { +func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1394,65 +1321,80 @@ func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) +func (m *TeardownReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_TeardownReply.Merge(m, src) } -func (m *DestroyEnvironmentRequest) XXX_Size() int { +func (m *TeardownReply) XXX_Size() int { return m.Size() } -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) +func (m *TeardownReply) XXX_DiscardUnknown() { + xxx_messageInfo_TeardownReply.DiscardUnknown(m) } -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo +var xxx_messageInfo_TeardownReply proto.InternalMessageInfo -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" +//////////////////////////////////////// +// Environment +//////////////////////////////////////// +type GetEnvironmentsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks - } - return false +func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } +func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentsRequest) ProtoMessage() {} +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } - -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState - } - return false +func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force +func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return false +} +func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) +} +func (m *GetEnvironmentsRequest) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) } -type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` +var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo + +type GetEnvironmentsReply struct { + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} +func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } +func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentsReply) ProtoMessage() {} +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1462,50 +1404,59 @@ func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]b return b[:n], nil } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) +func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) } -func (m *DestroyEnvironmentReply) XXX_Size() int { +func (m *GetEnvironmentsReply) XXX_Size() int { return m.Size() } -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) +func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) } -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { +func (m *GetEnvironmentsReply) GetFrameworkId() string { if m != nil { - return m.CleanupTasksReply + return m.FrameworkId + } + return "" +} + +func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if m != nil { + return m.Environments } return nil } -//////////////////////////////////////// -// Environment, GET/SET properties -//////////////////////////////////////// -type SetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If properties == nil, the core sets nothing - // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type EnvironmentInfo struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} +func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } +func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } +func (*EnvironmentInfo) ProtoMessage() {} +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { +func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1515,95 +1466,101 @@ func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnvironmentInfo.Merge(m, src) } -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { +func (m *EnvironmentInfo) XXX_Size() int { return m.Size() } -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) +func (m *EnvironmentInfo) XXX_DiscardUnknown() { + xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo -func (m *SetEnvironmentPropertiesRequest) GetId() string { +func (m *EnvironmentInfo) GetId() string { if m != nil { return m.Id } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { +func (m *EnvironmentInfo) GetCreatedWhen() string { if m != nil { - return m.Properties + return m.CreatedWhen } - return nil + return "" } -type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *EnvironmentInfo) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if m != nil { + return m.Tasks + } + return nil } -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *EnvironmentInfo) GetRootRole() string { + if m != nil { + return m.RootRole } + return "" } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) + +func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if m != nil { + return m.CurrentRunNumber + } + return 0 } -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (m *EnvironmentInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil } -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (m *EnvironmentInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil } -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo +func (m *EnvironmentInfo) GetUserVars() map[string]string { + if m != nil { + return m.UserVars + } + return nil +} -type GetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If len(queries) == 0, we return an - // empty map. - // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type NewEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } +func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewEnvironmentRequest) ProtoMessage() {} +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { +func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1613,58 +1570,51 @@ func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) +func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) } -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { +func (m *NewEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) +func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesRequest) GetId() string { +func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { if m != nil { - return m.Id + return m.WorkflowTemplate } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { +func (m *NewEnvironmentRequest) GetVars() map[string]string { if m != nil { - return m.Queries + return m.Vars } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals - } - return false -} - -type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type NewEnvironmentReply struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} +func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } +func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewEnvironmentReply) ProtoMessage() {} +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { +func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1674,53 +1624,44 @@ func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) +func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewEnvironmentReply.Merge(m, src) } -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { +func (m *NewEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) +func (m *NewEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo +var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { +func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.Properties + return m.Environment } return nil } -//////////////////////////////////////// -// Tasks -//////////////////////////////////////// -type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} +func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } +func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentRequest) ProtoMessage() {} +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1730,89 +1671,100 @@ func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) +func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) } -func (m *ShortTaskInfo) XXX_Size() int { +func (m *GetEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) +func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo -func (m *ShortTaskInfo) GetName() string { +func (m *GetEnvironmentRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked - } - return false +type GetEnvironmentReply struct { + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId - } - return "" +func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } +func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentReply) ProtoMessage() {} +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } - -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" +func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State +func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentReply.Merge(m, src) +} +func (m *GetEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *GetEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) } -func (m *ShortTaskInfo) GetClassName() string { +var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo + +func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { if m != nil { - return m.ClassName + return m.Environment } - return "" + return nil } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { +func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { if m != nil { - return m.DeploymentInfo + return m.Workflow } return nil } -type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type ControlEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} +func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } +func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*ControlEnvironmentRequest) ProtoMessage() {} +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { +func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1822,64 +1774,53 @@ func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) +func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) } -func (m *TaskDeploymentInfo) XXX_Size() int { +func (m *ControlEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo - -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname - } - return "" +func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId - } - return "" -} +var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo -func (m *TaskDeploymentInfo) GetOfferId() string { +func (m *ControlEnvironmentRequest) GetId() string { if m != nil { - return m.OfferId + return m.Id } return "" } -func (m *TaskDeploymentInfo) GetExecutorId() string { +func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { if m != nil { - return m.ExecutorId + return m.Type } - return "" + return ControlEnvironmentRequest_NOOP } -type GetTasksRequest struct { +type ControlEnvironmentReply struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} +func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } +func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*ControlEnvironmentReply) ProtoMessage() {} +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { +func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1889,37 +1830,60 @@ func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) +func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) } -func (m *GetTasksRequest) XXX_Size() int { +func (m *ControlEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) +func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo -type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *ControlEnvironmentReply) GetId() string { + if m != nil { + return m.Id + } + return "" } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} +func (m *ControlEnvironmentReply) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { + +func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if m != nil { + return m.CurrentRunNumber + } + return 0 +} + +type ModifyEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } +func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*ModifyEnvironmentRequest) ProtoMessage() {} +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} +} +func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) + return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1929,44 +1893,59 @@ func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) +func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) } -func (m *GetTasksReply) XXX_Size() int { +func (m *ModifyEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) +func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { +func (m *ModifyEnvironmentRequest) GetId() string { if m != nil { - return m.Tasks + return m.Id + } + return "" +} + +func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if m != nil { + return m.Operations } return nil } -type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if m != nil { + return m.ReconfigureAll + } + return false } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} +type EnvironmentOperation struct { + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { + +func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } +func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } +func (*EnvironmentOperation) ProtoMessage() {} +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} +} +func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -1976,44 +1955,53 @@ func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) +func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { + xxx_messageInfo_EnvironmentOperation.Merge(m, src) } -func (m *GetTaskRequest) XXX_Size() int { +func (m *EnvironmentOperation) XXX_Size() int { return m.Size() } -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) +func (m *EnvironmentOperation) XXX_DiscardUnknown() { + xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo -func (m *GetTaskRequest) GetTaskId() string { +func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { if m != nil { - return m.TaskId + return m.Type + } + return EnvironmentOperation_NOOP +} + +func (m *EnvironmentOperation) GetRoleName() string { + if m != nil { + return m.RoleName } return "" } -type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type ModifyEnvironmentReply struct { + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} +func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } +func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*ModifyEnvironmentReply) ProtoMessage() {} +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { +func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) + return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2023,45 +2011,61 @@ func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) +func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) } -func (m *GetTaskReply) XXX_Size() int { +func (m *ModifyEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) +func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo -func (m *GetTaskReply) GetTask() *TaskInfo { +func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { if m != nil { - return m.Task + return m.FailedOperations } return nil } -type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` +func (m *ModifyEnvironmentReply) GetId() string { + if m != nil { + return m.Id + } + return "" +} + +func (m *ModifyEnvironmentReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +type DestroyEnvironmentRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} +func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } +func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*DestroyEnvironmentRequest) ProtoMessage() {} +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { +func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2071,55 +2075,65 @@ func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) +func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) } -func (m *TaskClassInfo) XXX_Size() int { +func (m *DestroyEnvironmentRequest) XXX_Size() int { return m.Size() } -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) +func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo -func (m *TaskClassInfo) GetName() string { +func (m *DestroyEnvironmentRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *TaskClassInfo) GetControlMode() string { +func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { if m != nil { - return m.ControlMode + return m.KeepTasks } - return "" + return false } -type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if m != nil { + return m.AllowInRunningState + } + return false } -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} +func (m *DestroyEnvironmentRequest) GetForce() bool { + if m != nil { + return m.Force + } + return false } -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { + +type DestroyEnvironmentReply struct { + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } +func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*DestroyEnvironmentReply) ProtoMessage() {} +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} +} +func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2129,74 +2143,148 @@ func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) +func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) } -func (m *CommandInfo) XXX_Size() int { +func (m *DestroyEnvironmentReply) XXX_Size() int { return m.Size() } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) +func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo -func (m *CommandInfo) GetEnv() []string { +func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { if m != nil { - return m.Env + return m.CleanupTasksReply } return nil } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell +//////////////////////////////////////// +// Environment, GET/SET properties +//////////////////////////////////////// +type SetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } +func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} +} +func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return false +} +func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) +} +func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) } -func (m *CommandInfo) GetValue() string { +var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo + +func (m *SetEnvironmentPropertiesRequest) GetId() string { if m != nil { - return m.Value + return m.Id } return "" } -func (m *CommandInfo) GetArguments() []string { +func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { if m != nil { - return m.Arguments + return m.Properties } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +type SetEnvironmentPropertiesReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } +func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} +} +func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return "" +} +func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) +} +func (m *SetEnvironmentPropertiesReply) XXX_Size() int { + return m.Size() +} +func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) } -type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` +var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo + +type GetEnvironmentPropertiesRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} +func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } +func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2206,65 +2294,58 @@ func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) +func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) } -func (m *ChannelInfo) XXX_Size() int { +func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { return m.Size() } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) +func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo -func (m *ChannelInfo) GetName() string { +func (m *GetEnvironmentPropertiesRequest) GetId() string { if m != nil { - return m.Name + return m.Id } return "" } -func (m *ChannelInfo) GetType() string { +func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { if m != nil { - return m.Type + return m.Queries } - return "" + return nil } -func (m *ChannelInfo) GetTarget() string { +func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { if m != nil { - return m.Target + return m.ExcludeGlobals } - return "" + return false } -type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +type GetEnvironmentPropertiesReply struct { + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} +func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } +func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { +func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2274,93 +2355,145 @@ func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) +func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) } -func (m *TaskInfo) XXX_Size() int { +func (m *GetEnvironmentPropertiesReply) XXX_Size() int { return m.Size() } -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) +func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) } -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo +var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { +func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { if m != nil { - return m.ShortInfo + return m.Properties } return nil } -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +//////////////////////////////////////// +// Tasks +//////////////////////////////////////// +type ShortTaskInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } +func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } +func (*ShortTaskInfo) ProtoMessage() {} +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} +} +func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return nil +} +func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShortTaskInfo.Merge(m, src) +} +func (m *ShortTaskInfo) XXX_Size() int { + return m.Size() +} +func (m *ShortTaskInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { +var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo + +func (m *ShortTaskInfo) GetName() string { if m != nil { - return m.InboundChannels + return m.Name } - return nil + return "" } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { +func (m *ShortTaskInfo) GetLocked() bool { if m != nil { - return m.OutboundChannels + return m.Locked } - return nil + return false } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { +func (m *ShortTaskInfo) GetTaskId() string { if m != nil { - return m.CommandInfo + return m.TaskId } - return nil + return "" } -func (m *TaskInfo) GetTaskPath() string { +func (m *ShortTaskInfo) GetStatus() string { if m != nil { - return m.TaskPath + return m.Status } return "" } -func (m *TaskInfo) GetEnvId() string { +func (m *ShortTaskInfo) GetState() string { if m != nil { - return m.EnvId + return m.State } return "" } -func (m *TaskInfo) GetProperties() map[string]string { +func (m *ShortTaskInfo) GetClassName() string { if m != nil { - return m.Properties + return m.ClassName + } + return "" +} + +func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if m != nil { + return m.DeploymentInfo } return nil } -type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` +type TaskDeploymentInfo struct { + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} +func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } +func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } +func (*TaskDeploymentInfo) ProtoMessage() {} +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { +func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2370,45 +2503,64 @@ func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) +func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) } -func (m *CleanupTasksRequest) XXX_Size() int { +func (m *TaskDeploymentInfo) XXX_Size() int { return m.Size() } -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) +func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo -func (m *CleanupTasksRequest) GetTaskIds() []string { +func (m *TaskDeploymentInfo) GetHostname() string { if m != nil { - return m.TaskIds + return m.Hostname } - return nil + return "" } -type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *TaskDeploymentInfo) GetAgentId() string { + if m != nil { + return m.AgentId + } + return "" } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} +func (m *TaskDeploymentInfo) GetOfferId() string { + if m != nil { + return m.OfferId + } + return "" } -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { + +func (m *TaskDeploymentInfo) GetExecutorId() string { + if m != nil { + return m.ExecutorId + } + return "" +} + +type GetTasksRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } +func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } +func (*GetTasksRequest) ProtoMessage() {} +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} +} +func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2418,55 +2570,84 @@ func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) +func (m *GetTasksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTasksRequest.Merge(m, src) } -func (m *CleanupTasksReply) XXX_Size() int { +func (m *GetTasksRequest) XXX_Size() int { return m.Size() } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) +func (m *GetTasksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +type GetTasksReply struct { + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } +func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } +func (*GetTasksReply) ProtoMessage() {} +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} +} +func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return nil +} +func (m *GetTasksReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTasksReply.Merge(m, src) +} +func (m *GetTasksReply) XXX_Size() int { + return m.Size() +} +func (m *GetTasksReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetTasksReply.DiscardUnknown(m) } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { +var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo + +func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { if m != nil { - return m.RunningTasks + return m.Tasks } return nil } -//////////////////////////////////////// -// Roles -//////////////////////////////////////// -type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` +type GetTaskRequest struct { + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} +func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } +func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } +func (*GetTaskRequest) ProtoMessage() {} +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { +func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2476,59 +2657,44 @@ func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) +func (m *GetTaskRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTaskRequest.Merge(m, src) } -func (m *GetRolesRequest) XXX_Size() int { +func (m *GetTaskRequest) XXX_Size() int { return m.Size() } -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) +func (m *GetTaskRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo - -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId - } - return "" -} +var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo -func (m *GetRolesRequest) GetPathSpec() string { +func (m *GetTaskRequest) GetTaskId() string { if m != nil { - return m.PathSpec + return m.TaskId } return "" } -type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetTaskReply struct { + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} +func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } +func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } +func (*GetTaskReply) ProtoMessage() {} +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { +func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2538,100 +2704,45 @@ func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) +func (m *GetTaskReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetTaskReply.Merge(m, src) } -func (m *RoleInfo) XXX_Size() int { +func (m *GetTaskReply) XXX_Size() int { return m.Size() } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo - -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" -} - -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State - } - return "" -} - -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath - } - return "" -} - -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds - } - return nil -} - -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles - } - return nil -} - -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults - } - return nil +func (m *GetTaskReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetTaskReply.DiscardUnknown(m) } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil -} +var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo -func (m *RoleInfo) GetUserVars() map[string]string { +func (m *GetTaskReply) GetTask() *TaskInfo { if m != nil { - return m.UserVars + return m.Task } return nil } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TaskClassInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} +func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } +func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } +func (*TaskClassInfo) ProtoMessage() {} +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { +func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2641,47 +2752,55 @@ func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error return b[:n], nil } } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) +func (m *TaskClassInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskClassInfo.Merge(m, src) } -func (m *GetRolesReply) XXX_Size() int { +func (m *TaskClassInfo) XXX_Size() int { return m.Size() } -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) +func (m *TaskClassInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo -func (m *GetRolesReply) GetRoles() []*RoleInfo { +func (m *TaskClassInfo) GetName() string { if m != nil { - return m.Roles + return m.Name } - return nil + return "" } -type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` +func (m *TaskClassInfo) GetControlMode() string { + if m != nil { + return m.ControlMode + } + return "" +} + +type CommandInfo struct { + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} +func (m *CommandInfo) Reset() { *m = CommandInfo{} } +func (m *CommandInfo) String() string { return proto.CompactTextString(m) } +func (*CommandInfo) ProtoMessage() {} +func (*CommandInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { +func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2691,67 +2810,74 @@ func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) +func (m *CommandInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_CommandInfo.Merge(m, src) } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { +func (m *CommandInfo) XXX_Size() int { return m.Size() } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) +func (m *CommandInfo) XXX_DiscardUnknown() { + xxx_messageInfo_CommandInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +var xxx_messageInfo_CommandInfo proto.InternalMessageInfo -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { +func (m *CommandInfo) GetEnv() []string { if m != nil { - return m.RepoPattern + return m.Env } - return "" + return nil } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { +func (m *CommandInfo) GetShell() bool { if m != nil { - return m.RevisionPattern + return m.Shell + } + return false +} + +func (m *CommandInfo) GetValue() string { + if m != nil { + return m.Value } return "" } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { +func (m *CommandInfo) GetArguments() []string { if m != nil { - return m.AllBranches + return m.Arguments } - return false + return nil } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { +func (m *CommandInfo) GetUser() string { if m != nil { - return m.AllTags + return m.User } - return false + return "" } -type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` +type ChannelInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} +func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } +func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } +func (*ChannelInfo) ProtoMessage() {} +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { +func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2761,58 +2887,65 @@ func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) +func (m *ChannelInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChannelInfo.Merge(m, src) } -func (m *WorkflowTemplateInfo) XXX_Size() int { +func (m *ChannelInfo) XXX_Size() int { return m.Size() } -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) +func (m *ChannelInfo) XXX_DiscardUnknown() { + xxx_messageInfo_ChannelInfo.DiscardUnknown(m) } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo +var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo -func (m *WorkflowTemplateInfo) GetRepo() string { +func (m *ChannelInfo) GetName() string { if m != nil { - return m.Repo + return m.Name } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { +func (m *ChannelInfo) GetType() string { if m != nil { - return m.Template + return m.Type } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { +func (m *ChannelInfo) GetTarget() string { if m != nil { - return m.Revision + return m.Target } return "" } -type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TaskInfo struct { + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} +func (m *TaskInfo) Reset() { *m = TaskInfo{} } +func (m *TaskInfo) String() string { return proto.CompactTextString(m) } +func (*TaskInfo) ProtoMessage() {} +func (*TaskInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { +func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) + return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2822,85 +2955,93 @@ func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([ return b[:n], nil } } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) +func (m *TaskInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_TaskInfo.Merge(m, src) } -func (m *GetWorkflowTemplatesReply) XXX_Size() int { +func (m *TaskInfo) XXX_Size() int { return m.Size() } -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) +func (m *TaskInfo) XXX_DiscardUnknown() { + xxx_messageInfo_TaskInfo.DiscardUnknown(m) } -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +var xxx_messageInfo_TaskInfo proto.InternalMessageInfo -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { +func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { if m != nil { - return m.WorkflowTemplates + return m.ShortInfo } return nil } -type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *TaskInfo) GetClassInfo() *TaskClassInfo { + if m != nil { + return m.ClassInfo + } + return nil } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { + if m != nil { + return m.InboundChannels + } + return nil } -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if m != nil { + return m.OutboundChannels } + return nil } -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) + +func (m *TaskInfo) GetCommandInfo() *CommandInfo { + if m != nil { + return m.CommandInfo + } + return nil } -func (m *ListReposRequest) XXX_Size() int { - return m.Size() + +func (m *TaskInfo) GetTaskPath() string { + if m != nil { + return m.TaskPath + } + return "" } -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + +func (m *TaskInfo) GetEnvId() string { + if m != nil { + return m.EnvId + } + return "" } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo +func (m *TaskInfo) GetProperties() map[string]string { + if m != nil { + return m.Properties + } + return nil +} -type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +type CleanupTasksRequest struct { + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} +func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } +func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } +func (*CleanupTasksRequest) ProtoMessage() {} +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { +func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) + return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2910,59 +3051,45 @@ func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) +func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_CleanupTasksRequest.Merge(m, src) } -func (m *RepoInfo) XXX_Size() int { +func (m *CleanupTasksRequest) XXX_Size() int { return m.Size() } -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo - -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name - } - return "" +func (m *CleanupTasksRequest) XXX_DiscardUnknown() { + xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default - } - return false -} +var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo -func (m *RepoInfo) GetDefaultRevision() string { +func (m *CleanupTasksRequest) GetTaskIds() []string { if m != nil { - return m.DefaultRevision + return m.TaskIds } - return "" + return nil } -type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type CleanupTasksReply struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} +func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } +func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } +func (*CleanupTasksReply) ProtoMessage() {} +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { +func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) + return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -2972,52 +3099,55 @@ func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) +func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_CleanupTasksReply.Merge(m, src) } -func (m *ListReposReply) XXX_Size() int { +func (m *CleanupTasksReply) XXX_Size() int { return m.Size() } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) +func (m *CleanupTasksReply) XXX_DiscardUnknown() { + xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo -func (m *ListReposReply) GetRepos() []*RepoInfo { +func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { if m != nil { - return m.Repos + return m.KilledTasks } return nil } -func (m *ListReposReply) GetGlobalDefaultRevision() string { +func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { if m != nil { - return m.GlobalDefaultRevision + return m.RunningTasks } - return "" + return nil } -type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +//////////////////////////////////////// +// Roles +//////////////////////////////////////// +type GetRolesRequest struct { + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} +func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } +func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } +func (*GetRolesRequest) ProtoMessage() {} +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { +func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3027,52 +3157,59 @@ func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, erro return b[:n], nil } } -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) +func (m *GetRolesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRolesRequest.Merge(m, src) } -func (m *AddRepoRequest) XXX_Size() int { +func (m *GetRolesRequest) XXX_Size() int { return m.Size() } -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) +func (m *GetRolesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo +var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo -func (m *AddRepoRequest) GetName() string { +func (m *GetRolesRequest) GetEnvId() string { if m != nil { - return m.Name + return m.EnvId } return "" } -func (m *AddRepoRequest) GetDefaultRevision() string { +func (m *GetRolesRequest) GetPathSpec() string { if m != nil { - return m.DefaultRevision + return m.PathSpec } return "" } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type RoleInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} +func (m *RoleInfo) Reset() { *m = RoleInfo{} } +func (m *RoleInfo) String() string { return proto.CompactTextString(m) } +func (*RoleInfo) ProtoMessage() {} +func (*RoleInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { +func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3082,98 +3219,100 @@ func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) return b[:n], nil } } -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) +func (m *RoleInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_RoleInfo.Merge(m, src) } -func (m *AddRepoReply) XXX_Size() int { +func (m *RoleInfo) XXX_Size() int { return m.Size() } -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) +func (m *RoleInfo) XXX_DiscardUnknown() { + xxx_messageInfo_RoleInfo.DiscardUnknown(m) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +var xxx_messageInfo_RoleInfo proto.InternalMessageInfo -func (m *AddRepoReply) GetNewDefaultRevision() string { +func (m *RoleInfo) GetName() string { if m != nil { - return m.NewDefaultRevision + return m.Name } return "" } -func (m *AddRepoReply) GetInfo() string { +func (m *RoleInfo) GetStatus() string { if m != nil { - return m.Info + return m.Status } return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *RoleInfo) GetState() string { + if m != nil { + return m.State + } + return "" } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (m *RoleInfo) GetFullPath() string { + if m != nil { + return m.FullPath } + return "" } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) + +func (m *RoleInfo) GetTaskIds() []string { + if m != nil { + return m.TaskIds + } + return nil } -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() + +func (m *RoleInfo) GetRoles() []*RoleInfo { + if m != nil { + return m.Roles + } + return nil } -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (m *RoleInfo) GetDefaults() map[string]string { + if m != nil { + return m.Defaults + } + return nil } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +func (m *RoleInfo) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} -func (m *RemoveRepoRequest) GetIndex() int32 { +func (m *RoleInfo) GetUserVars() map[string]string { if m != nil { - return m.Index + return m.UserVars } - return 0 + return nil } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetRolesReply struct { + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} +func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } +func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } +func (*GetRolesReply) ProtoMessage() {} +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { +func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) + return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3183,44 +3322,47 @@ func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, err return b[:n], nil } } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) +func (m *GetRolesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetRolesReply.Merge(m, src) } -func (m *RemoveRepoReply) XXX_Size() int { +func (m *GetRolesReply) XXX_Size() int { return m.Size() } -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) +func (m *GetRolesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetRolesReply.DiscardUnknown(m) } -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo +var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetNewDefaultRepo() string { +func (m *GetRolesReply) GetRoles() []*RoleInfo { if m != nil { - return m.NewDefaultRepo + return m.Roles } - return "" + return nil } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +type GetWorkflowTemplatesRequest struct { + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} +func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } +func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { +func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3230,44 +3372,67 @@ func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) +func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) } -func (m *RefreshReposRequest) XXX_Size() int { +func (m *GetWorkflowTemplatesRequest) XXX_Size() int { return m.Size() } -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) +func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo +var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo -func (m *RefreshReposRequest) GetIndex() int32 { +func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { if m != nil { - return m.Index + return m.RepoPattern } - return 0 + return "" } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if m != nil { + return m.RevisionPattern + } + return "" +} + +func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if m != nil { + return m.AllBranches + } + return false +} + +func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { + if m != nil { + return m.AllTags + } + return false +} + +type WorkflowTemplateInfo struct { + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} +func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } +func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } +func (*WorkflowTemplateInfo) ProtoMessage() {} +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { +func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3277,44 +3442,58 @@ func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byt return b[:n], nil } } -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) +func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) } -func (m *SetDefaultRepoRequest) XXX_Size() int { +func (m *WorkflowTemplateInfo) XXX_Size() int { return m.Size() } -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) +func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { + xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo -func (m *SetDefaultRepoRequest) GetIndex() int32 { +func (m *WorkflowTemplateInfo) GetRepo() string { if m != nil { - return m.Index + return m.Repo } - return 0 + return "" } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *WorkflowTemplateInfo) GetTemplate() string { + if m != nil { + return m.Template + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} +func (m *WorkflowTemplateInfo) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + +type GetWorkflowTemplatesReply struct { + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } +func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } +func (*GetWorkflowTemplatesReply) ProtoMessage() {} +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} +} +func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3324,45 +3503,43 @@ func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bo return b[:n], nil } } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) +func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) } -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { +func (m *GetWorkflowTemplatesReply) XXX_Size() int { return m.Size() } -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) +func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) } -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo +var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { +func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { if m != nil { - return m.Revision + return m.WorkflowTemplates } - return "" + return nil } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` +type ListReposRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} +func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } +func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } +func (*ListReposRequest) ProtoMessage() {} +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { +func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3372,51 +3549,39 @@ func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool return b[:n], nil } } -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) +func (m *ListReposRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReposRequest.Merge(m, src) } -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { +func (m *ListReposRequest) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo - -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index - } - return 0 +func (m *ListReposRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListReposRequest.DiscardUnknown(m) } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision - } - return "" -} +var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` +type RepoInfo struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} +func (m *RepoInfo) Reset() { *m = RepoInfo{} } +func (m *RepoInfo) String() string { return proto.CompactTextString(m) } +func (*RepoInfo) ProtoMessage() {} +func (*RepoInfo) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { +func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3426,43 +3591,59 @@ func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) return b[:n], nil } } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) +func (m *RepoInfo) XXX_Merge(src proto.Message) { + xxx_messageInfo_RepoInfo.Merge(m, src) } -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { +func (m *RepoInfo) XXX_Size() int { return m.Size() } -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) +func (m *RepoInfo) XXX_DiscardUnknown() { + xxx_messageInfo_RepoInfo.DiscardUnknown(m) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +var xxx_messageInfo_RepoInfo proto.InternalMessageInfo -func (m *SetRepoDefaultRevisionReply) GetInfo() string { +func (m *RepoInfo) GetName() string { if m != nil { - return m.Info + return m.Name } return "" } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *RepoInfo) GetDefault() bool { + if m != nil { + return m.Default + } + return false } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} +func (m *RepoInfo) GetDefaultRevision() string { + if m != nil { + return m.DefaultRevision + } + return "" } -func (m *Empty) XXX_Unmarshal(b []byte) error { + +type ListReposReply struct { + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListReposReply) Reset() { *m = ListReposReply{} } +func (m *ListReposReply) String() string { return proto.CompactTextString(m) } +func (*ListReposReply) ProtoMessage() {} +func (*ListReposReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} +} +func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -3472,1524 +3653,1706 @@ func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { return b[:n], nil } } -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) +func (m *ListReposReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListReposReply.Merge(m, src) } -func (m *Empty) XXX_Size() int { +func (m *ListReposReply) XXX_Size() int { return m.Size() } -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) +func (m *ListReposReply) XXX_DiscardUnknown() { + xxx_messageInfo_ListReposReply.DiscardUnknown(m) } -var xxx_messageInfo_Empty proto.InternalMessageInfo +var xxx_messageInfo_ListReposReply proto.InternalMessageInfo -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") +func (m *ListReposReply) GetRepos() []*RepoInfo { + if m != nil { + return m.Repos + } + return nil } -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2630 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x5f, 0x6f, 0x1b, 0x59, - 0xf5, 0x19, 0xc7, 0xae, 0xed, 0xe3, 0xc4, 0x71, 0x6e, 0xd2, 0x74, 0xe2, 0xb6, 0x49, 0x7a, 0x7f, - 0x55, 0x37, 0xed, 0xee, 0x2f, 0xdd, 0x66, 0x57, 0x6c, 0xe9, 0x6e, 0xb7, 0xe4, 0x8f, 0xeb, 0x06, - 0x9a, 0xb8, 0x4c, 0xdc, 0x16, 0x2a, 0xa1, 0x32, 0xb1, 0xaf, 0x63, 0x6f, 0xc6, 0x33, 0xee, 0xcc, - 0xd8, 0x69, 0x1e, 0x78, 0xe3, 0x0d, 0x21, 0xb4, 0xe2, 0x85, 0x57, 0x84, 0xf8, 0x0e, 0x3c, 0x20, - 0xf1, 0x8a, 0x10, 0x08, 0x3e, 0x02, 0x2a, 0x12, 0xcf, 0x7c, 0x04, 0x74, 0xff, 0xcd, 0xdc, 0x19, - 0xcf, 0x38, 0x29, 0x68, 0x5f, 0x78, 0xf3, 0x39, 0xf7, 0x9c, 0x73, 0xcf, 0xdf, 0x7b, 0xce, 0xbd, - 0x63, 0x58, 0x1a, 0xb8, 0x8e, 0xef, 0x78, 0x77, 0x9d, 0xcd, 0x96, 0x63, 0xfb, 0xae, 0x63, 0x6d, - 0x30, 0x04, 0x2a, 0x06, 0x08, 0xbc, 0x04, 0x8b, 0xb5, 0x11, 0xb1, 0xfd, 0xd7, 0xfb, 0xc4, 0x73, - 0xbc, 0x27, 0xc4, 0x74, 0xfd, 0x23, 0x62, 0xfa, 0x78, 0x0e, 0x66, 0x0f, 0x7d, 0xd3, 0x1f, 0x7a, - 0x06, 0x79, 0x33, 0x24, 0x9e, 0x8f, 0x8f, 0xa0, 0x24, 0x11, 0x03, 0xeb, 0x0c, 0x2d, 0x42, 0xce, - 0xf3, 0x4d, 0x9f, 0xe8, 0xda, 0x9a, 0xb6, 0x5e, 0x34, 0x38, 0x80, 0x1e, 0xc2, 0xac, 0xc7, 0x88, - 0x9e, 0x0f, 0xda, 0xa6, 0x4f, 0x3c, 0x3d, 0xb3, 0x36, 0xbd, 0x5e, 0xda, 0xbc, 0xb2, 0x11, 0x6a, - 0x70, 0xa8, 0xac, 0x1b, 0x51, 0x6a, 0xfc, 0x17, 0x0d, 0x66, 0xd4, 0x75, 0xf4, 0x09, 0xe4, 0x2c, - 0x32, 0x22, 0x16, 0xdb, 0xa5, 0xbc, 0x79, 0x3d, 0x45, 0xce, 0xc6, 0x53, 0x4a, 0x64, 0x70, 0x5a, - 0xb4, 0x07, 0xe5, 0x7e, 0xc4, 0x18, 0x3d, 0xb3, 0xa6, 0xad, 0x97, 0x36, 0x57, 0x15, 0xee, 0x24, - 0x9b, 0x9f, 0x4c, 0x19, 0x31, 0x46, 0xfc, 0x29, 0xe4, 0x98, 0x68, 0x54, 0x84, 0xdc, 0x6e, 0x6d, - 0xfb, 0x79, 0xbd, 0x32, 0x85, 0x0a, 0x90, 0xdd, 0x3b, 0x78, 0xdc, 0xa8, 0x68, 0xa8, 0x04, 0xf9, - 0x97, 0x5b, 0xc6, 0xc1, 0xde, 0x41, 0xbd, 0x92, 0xa1, 0x14, 0x35, 0xc3, 0x68, 0x18, 0x95, 0xe9, - 0xed, 0x3c, 0xe4, 0x98, 0x7c, 0xbc, 0x0c, 0x57, 0xea, 0xc4, 0x7f, 0xec, 0x9a, 0x7d, 0x72, 0xea, - 0xb8, 0x27, 0x7b, 0x76, 0xc7, 0x91, 0xee, 0xfc, 0x8d, 0x06, 0xf9, 0x17, 0xc4, 0xf5, 0x7a, 0x8e, - 0x4d, 0x7d, 0xd9, 0x37, 0xbf, 0x72, 0x5c, 0x66, 0x65, 0xce, 0xe0, 0x00, 0xc3, 0xf6, 0x6c, 0xc7, - 0x65, 0xda, 0x53, 0x2c, 0x05, 0x28, 0x76, 0x60, 0xfa, 0xad, 0xae, 0x3e, 0xcd, 0xb1, 0x0c, 0xa0, - 0xd8, 0xa3, 0x61, 0xcf, 0x6a, 0xeb, 0x59, 0x1e, 0x0d, 0x06, 0xa0, 0x35, 0x28, 0x0d, 0x5c, 0xa7, - 0x3d, 0x6c, 0xf9, 0x07, 0x66, 0x9f, 0xe8, 0x39, 0xb6, 0xa6, 0xa2, 0xd0, 0x0a, 0xc0, 0x88, 0x2b, - 0x71, 0xe8, 0xbb, 0xfa, 0x25, 0x46, 0xa0, 0x60, 0xf0, 0x2f, 0x32, 0x70, 0x79, 0xdc, 0x02, 0x1a, - 0xff, 0x35, 0x28, 0x75, 0x02, 0x6c, 0x5b, 0x64, 0x81, 0x8a, 0x42, 0x1f, 0xc1, 0x3c, 0xb1, 0x47, - 0x3d, 0xd7, 0xb1, 0xfb, 0xc4, 0xf6, 0xbd, 0x1d, 0x67, 0x68, 0xfb, 0xc2, 0x96, 0xf1, 0x05, 0xaa, - 0x89, 0x6f, 0x7a, 0x27, 0x82, 0x8c, 0x1b, 0xa7, 0x60, 0xc2, 0x7c, 0xcb, 0xaa, 0xf9, 0xb6, 0x02, - 0xd0, 0x75, 0x3c, 0x29, 0x3c, 0xc7, 0xb9, 0x42, 0x0c, 0xc2, 0x30, 0xd3, 0xb3, 0x3d, 0xdf, 0xb4, - 0x5b, 0x84, 0xb9, 0x80, 0x5b, 0x18, 0xc1, 0xa1, 0x8f, 0x20, 0x2f, 0x2c, 0xd6, 0xf3, 0x2c, 0x4f, - 0x90, 0x92, 0x27, 0x22, 0x44, 0x86, 0x24, 0xc1, 0xb7, 0x61, 0xae, 0x49, 0x4c, 0xb7, 0xed, 0x9c, - 0xda, 0x22, 0x94, 0x68, 0x09, 0x2e, 0xb9, 0xc4, 0xf4, 0x1c, 0x5b, 0x78, 0x41, 0x40, 0xb4, 0x84, - 0x42, 0xd2, 0x81, 0x75, 0x86, 0x75, 0x58, 0xaa, 0x13, 0xbf, 0xa6, 0xd8, 0x2e, 0xb3, 0xe1, 0x2d, - 0x2c, 0x8e, 0xad, 0x5c, 0xcc, 0xcb, 0x5f, 0xc2, 0x8c, 0xea, 0x4c, 0x51, 0x70, 0x55, 0x35, 0xd5, - 0xc3, 0x65, 0x16, 0xbe, 0x08, 0x3d, 0xfe, 0x53, 0x16, 0xe6, 0x62, 0x14, 0xa8, 0x0c, 0x99, 0x9e, - 0xdc, 0x2c, 0xd3, 0x63, 0x79, 0xd4, 0x72, 0x89, 0xe9, 0x93, 0xf6, 0xcb, 0x2e, 0xb1, 0x59, 0x0c, - 0x8b, 0x86, 0x8a, 0x0a, 0xa3, 0x33, 0xad, 0x46, 0x67, 0x03, 0x72, 0x2c, 0x82, 0x7a, 0x96, 0x29, - 0xa5, 0xab, 0xd5, 0xdb, 0x75, 0x5c, 0xbf, 0x69, 0x7a, 0x3c, 0xa3, 0x38, 0x19, 0xaa, 0x42, 0xc1, - 0x75, 0x1c, 0xdf, 0x70, 0x2c, 0x99, 0xac, 0x01, 0x8c, 0xee, 0x40, 0xa5, 0x35, 0x74, 0x5d, 0x62, - 0xfb, 0xc6, 0xd0, 0x3e, 0x18, 0xf6, 0x8f, 0x08, 0xcf, 0xd7, 0x59, 0x63, 0x0c, 0x8f, 0x76, 0xa1, - 0xd0, 0x26, 0x1d, 0x73, 0x68, 0xf9, 0x9e, 0x9e, 0x67, 0x5b, 0xaf, 0xa7, 0xfb, 0x63, 0x63, 0x57, - 0x90, 0xd6, 0x6c, 0xdf, 0x3d, 0x33, 0x02, 0x4e, 0x74, 0x1f, 0xb2, 0x23, 0xd3, 0xf5, 0xf4, 0x02, - 0x93, 0x70, 0x73, 0x82, 0x84, 0x17, 0xa6, 0x2b, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe8, 0x11, 0x97, - 0xa2, 0xf5, 0xe2, 0xb9, 0xfb, 0x3f, 0x17, 0xa4, 0x62, 0x7f, 0xc9, 0x59, 0xfd, 0x1c, 0x66, 0x23, - 0xaa, 0xa1, 0x0a, 0x4c, 0x9f, 0x90, 0x33, 0x11, 0x17, 0xfa, 0x93, 0xba, 0x7d, 0x64, 0x5a, 0x43, - 0x22, 0x42, 0xc2, 0x81, 0x07, 0x99, 0xfb, 0x5a, 0xf5, 0x33, 0x28, 0x06, 0x32, 0xdf, 0x8b, 0xf1, - 0x73, 0x98, 0x8d, 0x28, 0xf4, 0x3e, 0xcc, 0xf8, 0xf7, 0x1a, 0x5c, 0x3e, 0x20, 0xa7, 0x8a, 0x85, - 0xb2, 0x46, 0xee, 0x40, 0x85, 0x26, 0x6c, 0xc7, 0x72, 0x4e, 0x9b, 0xa4, 0x3f, 0xb0, 0xc2, 0xce, - 0x31, 0x86, 0x47, 0x5f, 0x0a, 0xc7, 0xf3, 0x54, 0xbe, 0xa3, 0xb8, 0x2e, 0x51, 0x76, 0xdc, 0xfd, - 0xff, 0xb1, 0xed, 0xf8, 0x10, 0x16, 0xe2, 0x3b, 0xd0, 0x22, 0xfc, 0x02, 0x4a, 0x4a, 0xc9, 0x30, - 0x51, 0x93, 0x2b, 0x4c, 0x25, 0xc7, 0x1f, 0xb0, 0x13, 0x34, 0xc1, 0x25, 0xb1, 0x2a, 0xc3, 0x3f, - 0xd5, 0x60, 0x21, 0x4e, 0xf9, 0x5f, 0x6f, 0x8f, 0xee, 0x42, 0x41, 0x3a, 0x58, 0xb4, 0xc1, 0x05, - 0x85, 0x95, 0x96, 0x16, 0xe3, 0x09, 0x88, 0xf0, 0x5f, 0x35, 0x58, 0xde, 0xe1, 0xcb, 0xe7, 0x2b, - 0x8d, 0x1e, 0x41, 0xd6, 0x3f, 0x1b, 0x70, 0x5f, 0x96, 0x37, 0x3f, 0x54, 0x44, 0xa7, 0xca, 0xd8, - 0x68, 0x0c, 0x28, 0x8b, 0xc1, 0x18, 0xb1, 0x09, 0x97, 0x38, 0x4c, 0xfb, 0xea, 0x41, 0xa3, 0xf1, - 0xac, 0x32, 0x85, 0x10, 0x94, 0x0f, 0x9b, 0x5b, 0x46, 0xf3, 0xf5, 0xd6, 0x4e, 0x73, 0xef, 0xc5, - 0x5e, 0xf3, 0x87, 0x15, 0x0d, 0xcd, 0xc3, 0xec, 0x61, 0xb3, 0xf1, 0x2c, 0x44, 0x65, 0xd0, 0x2c, - 0x14, 0x77, 0x1a, 0x07, 0x8f, 0xf7, 0xea, 0xcf, 0x8d, 0x5a, 0x65, 0x9a, 0x36, 0x60, 0xa3, 0x76, - 0x58, 0x6b, 0x56, 0xb2, 0x68, 0x06, 0x0a, 0xf5, 0xc6, 0x6b, 0xde, 0x8e, 0x73, 0xf8, 0x04, 0xae, - 0x24, 0x29, 0x43, 0x7d, 0x1b, 0x37, 0x27, 0x38, 0xc7, 0x32, 0xea, 0x39, 0x96, 0x74, 0xf6, 0x4c, - 0x27, 0x9f, 0x3d, 0xf8, 0x97, 0x1a, 0xe8, 0xfb, 0x4e, 0xbb, 0xd7, 0x39, 0xbb, 0x90, 0xf7, 0xc0, - 0x19, 0x10, 0xd7, 0xf4, 0x7b, 0x8e, 0x2d, 0xf3, 0x7d, 0x35, 0x39, 0xb2, 0x0d, 0x49, 0x67, 0x28, - 0x2c, 0xe8, 0x16, 0x94, 0x5d, 0xd2, 0x72, 0xec, 0x4e, 0xef, 0x78, 0xe8, 0x92, 0x2d, 0xcb, 0x62, - 0x7a, 0x15, 0x8c, 0x18, 0x16, 0xff, 0x5a, 0x83, 0xc5, 0x24, 0x61, 0xe8, 0x81, 0x88, 0x1f, 0x9f, - 0xaf, 0x6e, 0x9d, 0xb3, 0x77, 0x24, 0x74, 0xfc, 0xb8, 0xb6, 0x78, 0x63, 0xcd, 0xc8, 0xe3, 0x9a, - 0xc3, 0xf8, 0x5e, 0x42, 0x58, 0xe7, 0xa0, 0x64, 0xd4, 0xf6, 0x1b, 0x2f, 0x6a, 0xaf, 0x8d, 0xc6, - 0x53, 0x1a, 0xb1, 0x19, 0x28, 0x6c, 0xed, 0xee, 0x72, 0x28, 0x8b, 0x7f, 0xa6, 0xc1, 0x52, 0x82, - 0xe7, 0x68, 0x98, 0xbe, 0x07, 0x95, 0x8e, 0xd9, 0xb3, 0x48, 0xbb, 0x11, 0x7a, 0x4b, 0xbb, 0x98, - 0xb7, 0xc6, 0x18, 0x45, 0x10, 0x32, 0xe3, 0x31, 0x57, 0x7b, 0x17, 0xfe, 0x5a, 0x83, 0xe5, 0x5d, - 0xe2, 0xf9, 0xae, 0x73, 0x91, 0x40, 0x5e, 0x83, 0xe2, 0x09, 0x21, 0x83, 0x26, 0xeb, 0x76, 0x19, - 0x16, 0x82, 0x10, 0x81, 0x3e, 0x86, 0x05, 0xd3, 0xb2, 0x9c, 0xd3, 0x3d, 0xdb, 0x18, 0xda, 0x76, - 0xcf, 0x3e, 0x3e, 0x0c, 0xf6, 0x2b, 0x18, 0x49, 0x4b, 0x54, 0xa7, 0x8e, 0xe3, 0xb6, 0xf8, 0xb4, - 0x53, 0x30, 0x38, 0x80, 0x09, 0x5c, 0x49, 0x52, 0x89, 0x7a, 0xe8, 0xbb, 0x30, 0xdf, 0xb2, 0x88, - 0x69, 0x0f, 0xf9, 0x96, 0x0c, 0x29, 0x8e, 0x8a, 0x6b, 0x6a, 0x51, 0xc6, 0x69, 0x8c, 0x71, 0x36, - 0xfc, 0x67, 0x0d, 0x56, 0x0f, 0x23, 0x07, 0xd1, 0x33, 0x97, 0xe6, 0x9c, 0xdf, 0x23, 0x5e, 0x9a, - 0x03, 0x5e, 0x01, 0x0c, 0x02, 0x22, 0x91, 0xc9, 0x0f, 0xd4, 0x7e, 0x3f, 0x59, 0xde, 0x46, 0x88, - 0xe1, 0x27, 0xb9, 0x22, 0xad, 0xfa, 0x10, 0xe6, 0x62, 0xcb, 0xef, 0x75, 0xaa, 0xaf, 0xc2, 0xf5, - 0xf4, 0xdd, 0xa9, 0xbd, 0x1e, 0xac, 0xd6, 0xdf, 0xd3, 0x5c, 0x1d, 0xf2, 0x6f, 0x86, 0xc4, 0x95, - 0xb6, 0x16, 0x0d, 0x09, 0xd2, 0x8a, 0x24, 0x6f, 0x5b, 0xd6, 0xb0, 0x4d, 0xea, 0x96, 0x73, 0x64, - 0x5a, 0x9e, 0xac, 0xc8, 0x28, 0x16, 0xff, 0x4e, 0x83, 0xeb, 0xf5, 0x49, 0x6a, 0xa1, 0x1f, 0x44, - 0x5c, 0xca, 0xd3, 0xfd, 0xbe, 0xe2, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x43, 0xff, 0xa9, 0xc1, 0x6c, - 0x64, 0x7e, 0x43, 0x08, 0xb2, 0x36, 0x3d, 0x05, 0x38, 0x3b, 0xfb, 0x4d, 0xa7, 0x62, 0xcb, 0x69, - 0x9d, 0x90, 0xb6, 0xa8, 0x07, 0x01, 0x51, 0x3c, 0x9d, 0xf6, 0xf6, 0xda, 0xa2, 0xde, 0x04, 0x44, - 0xf1, 0xfc, 0x32, 0x28, 0x26, 0x7c, 0x01, 0x85, 0xe5, 0x99, 0x53, 0x8f, 0xe4, 0x6b, 0x50, 0x6c, - 0x59, 0xa6, 0xe7, 0x29, 0x53, 0x7d, 0x88, 0x40, 0x35, 0x28, 0xb7, 0xc9, 0xc0, 0x72, 0xce, 0x64, - 0x4f, 0x14, 0x93, 0xbd, 0x7a, 0x7f, 0xa4, 0xca, 0xef, 0x46, 0x88, 0x8c, 0x18, 0x13, 0xed, 0xc8, - 0x68, 0x9c, 0x8c, 0x9e, 0x7b, 0xf4, 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x34, 0x31, 0xcc, 0x63, 0x4a, - 0x28, 0x4f, 0x18, 0x09, 0xd2, 0x15, 0xa7, 0xd3, 0x21, 0x6e, 0x60, 0xb8, 0x04, 0xe9, 0x25, 0x86, - 0xbc, 0x25, 0xad, 0xa1, 0xef, 0xd0, 0x45, 0x6e, 0xbd, 0x82, 0xc1, 0xf3, 0x30, 0x57, 0x27, 0xbe, - 0x28, 0x50, 0x7e, 0x5f, 0x78, 0x04, 0xb3, 0x21, 0x8a, 0x26, 0x4b, 0x30, 0x6a, 0x6b, 0x17, 0x1a, - 0xb5, 0xf1, 0x3a, 0x94, 0x85, 0x00, 0xe5, 0x16, 0x23, 0xe2, 0xa2, 0xa9, 0x71, 0xc1, 0x9f, 0xc1, - 0x4c, 0x40, 0x49, 0x77, 0xfa, 0x00, 0xb2, 0x74, 0x45, 0x1c, 0x2e, 0x0b, 0x31, 0x8f, 0xb2, 0x3d, - 0x18, 0x01, 0xae, 0xc1, 0x2c, 0xc5, 0xec, 0xd0, 0xa8, 0xa4, 0x66, 0x09, 0xbd, 0x5a, 0x70, 0xf6, - 0x7d, 0xa7, 0x4d, 0x82, 0xab, 0x45, 0x88, 0xc2, 0x3f, 0x81, 0xd2, 0x8e, 0xd3, 0xef, 0x9b, 0x76, - 0x9b, 0x09, 0xa9, 0xc0, 0x34, 0xb1, 0x47, 0xcc, 0xcc, 0xa2, 0x41, 0x7f, 0xb2, 0x04, 0xe9, 0x12, - 0xcb, 0x12, 0x79, 0xc6, 0x81, 0x30, 0x7d, 0xa7, 0x95, 0xf4, 0xa5, 0x69, 0x63, 0xba, 0xc7, 0x43, - 0x7e, 0x55, 0xca, 0x32, 0x19, 0x21, 0x82, 0x2a, 0x48, 0xa7, 0x6f, 0x91, 0x69, 0xec, 0x37, 0xde, - 0x87, 0xd2, 0x4e, 0xd7, 0xb4, 0x6d, 0x62, 0xa5, 0xda, 0x80, 0x94, 0x19, 0xa8, 0x28, 0x7a, 0x23, - 0xf3, 0xa6, 0x7b, 0x4c, 0xfc, 0x30, 0xcb, 0x29, 0x84, 0xff, 0x35, 0x0d, 0x85, 0xa0, 0x6c, 0xbe, - 0x05, 0x45, 0x8f, 0x06, 0x87, 0x65, 0x28, 0xf7, 0x67, 0x7a, 0xe0, 0x42, 0x52, 0xca, 0xd7, 0x92, - 0x5e, 0x15, 0x43, 0x9d, 0x1e, 0x8b, 0x43, 0xe0, 0x75, 0x23, 0x24, 0x45, 0xdf, 0x81, 0xb9, 0x9e, - 0x7d, 0xe4, 0x0c, 0xed, 0xb6, 0x30, 0x89, 0x1e, 0x4e, 0x34, 0x5d, 0x96, 0xd4, 0x16, 0x11, 0x5a, - 0x6b, 0xc4, 0xc9, 0xd1, 0x36, 0x54, 0x9c, 0xa1, 0x1f, 0x15, 0x91, 0x9d, 0x28, 0x62, 0x8c, 0x1e, - 0xdd, 0xa7, 0x21, 0x0f, 0x02, 0xca, 0x9c, 0x1d, 0x63, 0x0f, 0x57, 0x0d, 0x95, 0x94, 0x16, 0x1e, - 0xcd, 0xac, 0x67, 0xa6, 0xdf, 0x15, 0x35, 0x1f, 0xc0, 0x34, 0xde, 0xc4, 0x1e, 0xed, 0xb5, 0x59, - 0xa5, 0x17, 0x0d, 0x0e, 0xa0, 0x9d, 0xc8, 0x19, 0xca, 0xef, 0x62, 0xff, 0x97, 0x90, 0xb2, 0xdf, - 0xe4, 0x71, 0x79, 0x17, 0x16, 0xa2, 0x6d, 0x97, 0xd7, 0x9b, 0x0e, 0x79, 0x5e, 0x61, 0x9e, 0x48, - 0x66, 0x09, 0xe2, 0x9f, 0x6b, 0x30, 0x3f, 0xd6, 0xa8, 0xd1, 0x03, 0x28, 0x9d, 0xf4, 0x2c, 0x8b, - 0xb4, 0x9b, 0x17, 0xaa, 0x73, 0x95, 0x18, 0x7d, 0x01, 0x33, 0x2e, 0x1f, 0x2f, 0xe4, 0x84, 0x32, - 0x99, 0x39, 0x42, 0x8d, 0x77, 0xd8, 0xf9, 0x43, 0xaf, 0x0a, 0x81, 0xf2, 0x81, 0xb7, 0x35, 0xd5, - 0xdb, 0x55, 0x28, 0x0c, 0x4c, 0xbf, 0x7b, 0x38, 0x20, 0x2d, 0x39, 0x10, 0x4a, 0x18, 0x7f, 0x9d, - 0x85, 0x82, 0xbc, 0x6d, 0xa4, 0xf5, 0x0b, 0x71, 0xfe, 0x67, 0x92, 0xcf, 0xff, 0xc8, 0xd3, 0x42, - 0x15, 0x0a, 0x9d, 0xa1, 0x65, 0xb1, 0x54, 0xe0, 0x27, 0x66, 0x00, 0xab, 0x9e, 0xcd, 0x45, 0x3c, - 0x8b, 0x6e, 0x43, 0x8e, 0x4e, 0xa8, 0x9e, 0x7e, 0x89, 0x39, 0x20, 0xf1, 0x26, 0xc4, 0x29, 0xd0, - 0xc3, 0xb1, 0x37, 0x84, 0x1b, 0x09, 0xd4, 0xa9, 0x8f, 0x07, 0xf7, 0x22, 0x8f, 0x07, 0xd7, 0x93, - 0x58, 0xe3, 0xaf, 0x06, 0x0f, 0xc7, 0x5e, 0x0d, 0x12, 0x77, 0xfc, 0x1f, 0x7a, 0x2e, 0x78, 0xc0, - 0xba, 0x98, 0x48, 0x2c, 0x9a, 0xe3, 0x41, 0x7c, 0xb4, 0xf3, 0xe2, 0x83, 0x7f, 0xab, 0xc1, 0xd5, - 0x3a, 0xf1, 0x5f, 0xc6, 0x1e, 0x0f, 0x82, 0x0c, 0x5d, 0x83, 0x92, 0x4b, 0x06, 0xce, 0x33, 0xd3, - 0xf7, 0x89, 0x2b, 0x5f, 0xe6, 0x54, 0x14, 0x5a, 0x87, 0x39, 0x97, 0x8c, 0x7a, 0x5e, 0xcf, 0xb1, - 0x25, 0x15, 0xd7, 0x30, 0x8e, 0xa6, 0xb2, 0x4c, 0xcb, 0xda, 0x76, 0x4d, 0xbb, 0xd5, 0x25, 0x72, - 0xa0, 0x53, 0x51, 0xac, 0xed, 0x5b, 0x56, 0xd3, 0x3c, 0xf6, 0xc4, 0xc4, 0x2e, 0x41, 0x7c, 0x04, - 0x8b, 0x71, 0x1d, 0x65, 0x09, 0x50, 0x65, 0x64, 0x09, 0xd0, 0xdf, 0xec, 0x7c, 0x93, 0x8f, 0x23, - 0xa2, 0x7e, 0x24, 0xcc, 0x2e, 0x5b, 0x42, 0x2d, 0x51, 0x09, 0x01, 0x8c, 0xbf, 0x82, 0xe5, 0x64, - 0x57, 0x50, 0x9f, 0xee, 0xc3, 0x7c, 0xfc, 0x85, 0x25, 0xe9, 0xf2, 0x94, 0xa4, 0xa4, 0x31, 0xce, - 0x89, 0x11, 0x54, 0x9e, 0xf6, 0x3c, 0x7a, 0xeb, 0x70, 0x94, 0x4f, 0x03, 0x05, 0x0a, 0xa7, 0x96, - 0xb6, 0x0e, 0x79, 0x51, 0x18, 0xa2, 0x47, 0x4b, 0x90, 0xc6, 0x40, 0xfc, 0x34, 0xa2, 0xc6, 0xc5, - 0xd1, 0xf8, 0x0d, 0x94, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x29, 0x59, 0x84, 0x36, 0x06, 0xa7, - 0x40, 0x9f, 0xc2, 0xe5, 0x63, 0x36, 0x77, 0xef, 0xc6, 0x36, 0xe3, 0x5e, 0x4e, 0x5e, 0xc4, 0x07, - 0x50, 0xde, 0x6a, 0xb7, 0xa9, 0x2c, 0x99, 0x54, 0x49, 0xc6, 0x25, 0x98, 0x90, 0x49, 0x36, 0xc1, - 0x80, 0x99, 0x40, 0x1e, 0x9f, 0xd9, 0x90, 0x4d, 0x4e, 0xe3, 0x2a, 0x71, 0xd9, 0x09, 0x2b, 0x74, - 0xf7, 0x9e, 0xec, 0xf8, 0x45, 0x83, 0xfd, 0xc6, 0xb7, 0x61, 0xde, 0x20, 0x7d, 0x67, 0x44, 0x54, - 0x35, 0x17, 0x21, 0xd7, 0xb3, 0xdb, 0xe4, 0xad, 0xfc, 0x9e, 0xc0, 0x00, 0xfc, 0x6d, 0x98, 0x53, - 0x49, 0xa9, 0x06, 0xb7, 0xa0, 0xac, 0xee, 0x13, 0xa4, 0x63, 0x0c, 0x8b, 0x3f, 0x84, 0x05, 0x83, - 0x74, 0x5c, 0xe2, 0x75, 0xd5, 0xb8, 0xa7, 0xec, 0xf3, 0xff, 0x70, 0xf9, 0x90, 0xf8, 0x0a, 0xfb, - 0x64, 0xf2, 0x87, 0xec, 0xb2, 0x59, 0x4f, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, 0x8b, 0xe5, 0xfe, - 0xf7, 0xd9, 0xed, 0x8e, 0x6e, 0x93, 0xc2, 0x9c, 0xb8, 0x6b, 0x44, 0x64, 0x26, 0x26, 0xf2, 0x1e, - 0x5c, 0x4d, 0x13, 0x49, 0x9d, 0x26, 0xc3, 0xa0, 0x29, 0x61, 0xc8, 0x43, 0xae, 0xd6, 0x1f, 0xf8, - 0x67, 0x9b, 0x7f, 0x98, 0x85, 0xbc, 0x78, 0x6c, 0x42, 0x3b, 0x50, 0x6a, 0xba, 0x66, 0xeb, 0x84, - 0x7f, 0xa9, 0x42, 0xfa, 0xd8, 0xc7, 0x2b, 0xa1, 0x62, 0x75, 0x29, 0x61, 0x85, 0x5e, 0x4c, 0xa7, - 0x3e, 0xd6, 0xd0, 0x2b, 0xa8, 0xc4, 0x3f, 0xc0, 0x20, 0x1c, 0xbd, 0x05, 0x26, 0x7d, 0x5f, 0xaa, - 0xae, 0x4d, 0xa4, 0x61, 0xd2, 0xd1, 0x36, 0x14, 0xe4, 0x07, 0x0a, 0xa4, 0x3e, 0x28, 0xc6, 0x3e, - 0x70, 0x54, 0xf5, 0xc4, 0x35, 0x2e, 0xe3, 0x25, 0x1b, 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0x46, 0xea, - 0x25, 0x35, 0xb0, 0x78, 0x75, 0x12, 0x09, 0x17, 0xdc, 0x84, 0x72, 0xf4, 0x31, 0x16, 0xad, 0x9d, - 0xf7, 0x12, 0x5c, 0x5d, 0x99, 0x40, 0x11, 0x48, 0x8d, 0xee, 0x87, 0xd6, 0x52, 0x55, 0x49, 0x92, - 0x9a, 0xf0, 0x40, 0x8b, 0xa7, 0xd0, 0x8f, 0x01, 0x8d, 0xbf, 0x30, 0xa2, 0x9b, 0x17, 0x79, 0x0d, - 0xad, 0xe2, 0x73, 0xa8, 0xf8, 0x0e, 0x3f, 0x82, 0xf9, 0xb1, 0xb7, 0x31, 0xa4, 0x4e, 0xb2, 0x69, - 0x6f, 0x8e, 0xd5, 0x1b, 0x93, 0x89, 0x02, 0x03, 0xc6, 0x5f, 0x96, 0x22, 0x06, 0xa4, 0xbe, 0x85, - 0x45, 0x0c, 0x48, 0x79, 0x9e, 0xe2, 0xb9, 0x26, 0x6f, 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, - 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x29, 0xf4, 0x08, 0xf2, 0x02, 0x85, 0x96, 0xc7, 0xc9, 0xa4, 0x84, - 0x2b, 0x49, 0x4b, 0x5c, 0xc0, 0x01, 0xcc, 0xa8, 0x83, 0x35, 0x5a, 0x49, 0x7d, 0x1a, 0xe3, 0xa2, - 0x26, 0x3e, 0x9d, 0x05, 0x46, 0xb1, 0x01, 0x26, 0x6e, 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, - 0x1e, 0x3c, 0x85, 0x3a, 0xec, 0xd3, 0xdf, 0x58, 0xf3, 0x46, 0xb7, 0xa2, 0x3c, 0x69, 0x83, 0x4e, - 0xf5, 0xe6, 0xb9, 0x74, 0x7c, 0x9f, 0x1a, 0x14, 0x83, 0x06, 0x8a, 0xae, 0x2a, 0x4c, 0xf1, 0x76, - 0x5e, 0x5d, 0x4e, 0x5e, 0x0c, 0x62, 0x20, 0x9a, 0x58, 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, - 0xda, 0xf3, 0xf0, 0x14, 0x7a, 0x02, 0x10, 0xb6, 0x21, 0x74, 0x2d, 0xd2, 0xb5, 0x63, 0x8d, 0xac, - 0x5a, 0x4d, 0x59, 0x95, 0xde, 0x9f, 0x51, 0xbb, 0x52, 0x24, 0x9a, 0x09, 0xed, 0xaa, 0x5a, 0x51, - 0xdf, 0x8a, 0xe9, 0x69, 0x8d, 0xa7, 0xd0, 0x63, 0x28, 0x47, 0x9b, 0x55, 0xe4, 0x3c, 0x48, 0xec, - 0x63, 0x89, 0x72, 0x5e, 0x81, 0x9e, 0xd6, 0xc5, 0xd0, 0x9d, 0xa8, 0xc4, 0x49, 0xad, 0x2e, 0x51, - 0xb6, 0x05, 0x4b, 0xc9, 0xfd, 0x08, 0xad, 0x47, 0x25, 0xa7, 0x77, 0xc1, 0xea, 0xad, 0x0b, 0x50, - 0x32, 0xaf, 0x6e, 0xdf, 0xff, 0xe3, 0xbb, 0x15, 0xed, 0x6f, 0xef, 0x56, 0xb4, 0xbf, 0xbf, 0x5b, - 0xd1, 0x7e, 0xf5, 0x8f, 0x95, 0x29, 0xc0, 0xad, 0xee, 0x46, 0x8b, 0xb8, 0xf6, 0x86, 0x69, 0xf5, - 0x5a, 0x64, 0xc3, 0xd9, 0xdc, 0x90, 0x92, 0xdc, 0x41, 0xcb, 0x23, 0xee, 0x88, 0xb8, 0xaf, 0x32, - 0x83, 0xa3, 0xa3, 0x4b, 0xec, 0xcf, 0x25, 0x9f, 0xfc, 0x3b, 0x00, 0x00, 0xff, 0xff, 0x5e, 0x92, - 0xbf, 0xa3, 0x76, 0x22, 0x00, 0x00, +func (m *ListReposReply) GetGlobalDefaultRevision() string { + if m != nil { + return m.GlobalDefaultRevision + } + return "" } -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) +type AddRepoRequest struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -type controlClient struct { - cc *grpc.ClientConn +func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } +func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } +func (*AddRepoRequest) ProtoMessage() {} +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } - -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} +func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return x, nil } - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +func (m *AddRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoRequest.Merge(m, src) } - -type controlTrackStatusClient struct { - grpc.ClientStream +func (m *AddRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *AddRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) } -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo + +func (m *AddRepoRequest) GetName() string { + if m != nil { + return m.Name } - return m, nil + return "" } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoRequest) GetDefaultRevision() string { + if m != nil { + return m.DefaultRevision } - return out, nil + return "" } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type AddRepoReply struct { + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } +func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } +func (*AddRepoReply) ProtoMessage() {} +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} +} +func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *AddRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_AddRepoReply.Merge(m, src) +} +func (m *AddRepoReply) XXX_Size() int { + return m.Size() +} +func (m *AddRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_AddRepoReply.DiscardUnknown(m) } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo + +func (m *AddRepoReply) GetNewDefaultRevision() string { + if m != nil { + return m.NewDefaultRevision } - return out, nil + return "" } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (m *AddRepoReply) GetInfo() string { + if m != nil { + return m.Info } - return out, nil + return "" } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RemoveRepoRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } +func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } +func (*RemoveRepoRequest) ProtoMessage() {} +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } - -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err +func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil } - -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRepoRequest.Merge(m, src) +} +func (m *RemoveRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *RemoveRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo + +func (m *RemoveRepoRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RemoveRepoReply struct { + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } +func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } +func (*RemoveRepoReply) ProtoMessage() {} +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} +} +func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_RemoveRepoReply.Merge(m, src) +} +func (m *RemoveRepoReply) XXX_Size() int { + return m.Size() +} +func (m *RemoveRepoReply) XXX_DiscardUnknown() { + xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo + +func (m *RemoveRepoReply) GetNewDefaultRepo() string { + if m != nil { + return m.NewDefaultRepo } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RefreshReposRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } +func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } +func (*RefreshReposRequest) ProtoMessage() {} +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} +} +func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RefreshReposRequest.Merge(m, src) +} +func (m *RefreshReposRequest) XXX_Size() int { + return m.Size() +} +func (m *RefreshReposRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo + +func (m *RefreshReposRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetDefaultRepoRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } +func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } +func (*SetDefaultRepoRequest) ProtoMessage() {} +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} +} +func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return out, nil +} +func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) +} +func (m *SetDefaultRepoRequest) XXX_Size() int { + return m.Size() +} +func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo + +func (m *SetDefaultRepoRequest) GetIndex() int32 { + if m != nil { + return m.Index } - return out, nil + return 0 } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) +type SetGlobalDefaultRevisionRequest struct { + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { +func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } +func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } - -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) } -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { + return m.Size() } -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) } -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") + +var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo + +func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") + +type SetRepoDefaultRevisionRequest struct { + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") + +func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } +func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) } -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { + return m.Size() } -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) } -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") + +var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if m != nil { + return m.Index + } + return 0 } -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") + +func (m *SetRepoDefaultRevisionRequest) GetRevision() string { + if m != nil { + return m.Revision + } + return "" } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") + +type SetRepoDefaultRevisionReply struct { + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") + +func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } +func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } } -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) } -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +func (m *SetRepoDefaultRevisionReply) XXX_Size() int { + return m.Size() } - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) +func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { + xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err +var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo + +func (m *SetRepoDefaultRevisionReply) GetInfo() string { + if m != nil { + return m.Info } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) + return "" } -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream +type Empty struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } -type controlTrackStatusServer struct { - grpc.ServerStream +func (m *Empty) Reset() { *m = Empty{} } +func (m *Empty) String() string { return proto.CompactTextString(m) } +func (*Empty) ProtoMessage() {} +func (*Empty) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) +func (m *Empty) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) } - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) +func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Empty.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil } - return interceptor(ctx, in, info, handler) } - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) +func (m *Empty) XXX_Merge(src proto.Message) { + xxx_messageInfo_Empty.Merge(m, src) } - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { +func (m *Empty) XXX_Size() int { + return m.Size() +} +func (m *Empty) XXX_DiscardUnknown() { + xxx_messageInfo_Empty.DiscardUnknown(m) +} + +var xxx_messageInfo_Empty proto.InternalMessageInfo + +func init() { + proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) + proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) + proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) + proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") + proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") + proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") + proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") + proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") + proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") + proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") + proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") + proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") + proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") + proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") + proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") + proto.RegisterType((*Event)(nil), "o2control.Event") + proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") + proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") + proto.RegisterType((*Version)(nil), "o2control.Version") + proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") + proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") + proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") + proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") + proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") + proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") + proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") + proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") + proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") + proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") + proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") + proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") + proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") + proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") + proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") + proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") + proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") + proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") + proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") + proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") + proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") + proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") + proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") + proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") + proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") + proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") + proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") + proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") + proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") + proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") + proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") + proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") + proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") + proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") + proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") + proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") + proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") + proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") + proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") + proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") + proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") + proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") + proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") + proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") + proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") + proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") + proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") + proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") + proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") + proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") + proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") + proto.RegisterType((*Empty)(nil), "o2control.Empty") +} + +func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } + +var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ + // 3040 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, + 0x91, 0x27, 0x91, 0x22, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, + 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x51, 0xb4, 0xa4, 0xc6, 0x16, 0xdd, + 0x15, 0x6d, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, + 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0x29, 0xd0, 0xe7, 0xfe, 0x81, 0x02, 0xc5, 0x7e, 0xdc, + 0xdd, 0xde, 0x17, 0x25, 0x37, 0xcd, 0x4b, 0xdf, 0x38, 0xb3, 0x33, 0xb3, 0xf3, 0xb5, 0x33, 0xb3, + 0x7b, 0x84, 0xd5, 0x91, 0x63, 0x7b, 0xb6, 0xfb, 0x96, 0xbd, 0xd5, 0xb5, 0x2d, 0xcf, 0xb1, 0xcd, + 0x4d, 0x8e, 0x40, 0xe5, 0x00, 0x81, 0x57, 0x61, 0xa5, 0x35, 0xa1, 0x96, 0x77, 0xf4, 0x90, 0xba, + 0xb6, 0xbb, 0x47, 0x75, 0xc7, 0x3b, 0xa6, 0xba, 0x87, 0x4d, 0x68, 0xb4, 0x26, 0x47, 0x2d, 0x6b, + 0x62, 0x38, 0xb6, 0x35, 0xa4, 0x96, 0x77, 0xe8, 0xe9, 0x1e, 0x6d, 0x0e, 0x74, 0xeb, 0x84, 0xf6, + 0xd0, 0x0a, 0x14, 0x28, 0xe3, 0xaa, 0x6b, 0x1b, 0xda, 0xcd, 0x32, 0x11, 0x00, 0x5a, 0x85, 0x39, + 0xd7, 0x1e, 0x3b, 0x5d, 0x5a, 0x9f, 0xe1, 0x68, 0x09, 0xa1, 0x0d, 0xa8, 0xf4, 0xa8, 0xeb, 0x19, + 0x96, 0xee, 0x19, 0xb6, 0x55, 0x9f, 0xe5, 0x8b, 0x2a, 0x0a, 0x37, 0x61, 0xb9, 0x35, 0x39, 0xea, + 0xe8, 0xee, 0x69, 0x64, 0x9b, 0x55, 0x98, 0xf3, 0x74, 0xf7, 0xd4, 0xe8, 0xc9, 0x7d, 0x24, 0xc4, + 0xb6, 0x77, 0x19, 0x9d, 0xdc, 0x47, 0x00, 0xf8, 0x3e, 0x33, 0x25, 0x10, 0x32, 0x76, 0xcf, 0x93, + 0xc2, 0xd4, 0xe5, 0x84, 0x81, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0xa2, 0x94, 0xf3, 0x40, 0x1f, 0x5b, + 0xdd, 0x41, 0xb6, 0x08, 0x6c, 0x70, 0xbd, 0xb9, 0xeb, 0x18, 0x7d, 0xd3, 0xa1, 0xba, 0x47, 0x7b, + 0xe8, 0x3a, 0x2c, 0x30, 0x02, 0x87, 0x0a, 0x07, 0xb8, 0x92, 0x2b, 0x8a, 0x44, 0x6f, 0xc2, 0x12, + 0x7d, 0x41, 0xbb, 0x63, 0xcf, 0x76, 0x48, 0x40, 0x29, 0x54, 0x49, 0x2e, 0xe0, 0xc7, 0x70, 0x29, + 0x1a, 0x10, 0x7f, 0xb3, 0x0f, 0xa1, 0x42, 0x43, 0x2c, 0xdf, 0xaa, 0xb2, 0xd5, 0xd8, 0x0c, 0x63, + 0xae, 0xf0, 0xec, 0x5b, 0x7d, 0x9b, 0xa8, 0xe4, 0xf8, 0xe7, 0x1a, 0xac, 0x45, 0xe5, 0xee, 0x50, + 0xd7, 0x73, 0xec, 0x33, 0xda, 0x43, 0xdf, 0x87, 0xa5, 0xae, 0x49, 0x75, 0x6b, 0x3c, 0x62, 0xc6, + 0xb9, 0x84, 0x8e, 0xcc, 0x33, 0x29, 0xff, 0x8a, 0x22, 0xbf, 0x19, 0xa7, 0x21, 0x49, 0x36, 0xe6, + 0x12, 0x65, 0x5b, 0xa3, 0x27, 0x0d, 0x8d, 0x22, 0xf1, 0x25, 0xee, 0x4f, 0x45, 0x99, 0x96, 0xe3, + 0xd8, 0x0e, 0x5e, 0x86, 0xa5, 0xd6, 0xe4, 0xe8, 0x53, 0xc3, 0x34, 0xb9, 0x44, 0xee, 0x6f, 0xbc, + 0x08, 0x0b, 0x22, 0xce, 0x84, 0x7e, 0x31, 0xa6, 0xae, 0x87, 0x8f, 0xa1, 0xe2, 0x23, 0xd8, 0x8e, + 0x41, 0x92, 0x68, 0x4a, 0x92, 0xa0, 0xbb, 0xb0, 0x20, 0xc2, 0xfc, 0x78, 0xd4, 0xd3, 0x3d, 0xee, + 0xf0, 0xd9, 0x9b, 0x95, 0xad, 0x35, 0xc5, 0x9e, 0x43, 0x65, 0x9d, 0x44, 0xa9, 0xf1, 0x5f, 0x34, + 0x98, 0x57, 0xd7, 0xd1, 0xbb, 0x50, 0x30, 0xe9, 0x84, 0x9a, 0x7c, 0x97, 0xea, 0xd6, 0xd5, 0x0c, + 0x39, 0x9b, 0x0f, 0x18, 0x11, 0x11, 0xb4, 0x68, 0x1f, 0xaa, 0xc3, 0xc8, 0x71, 0xe3, 0xde, 0xa8, + 0x6c, 0x5d, 0x53, 0xa3, 0x96, 0x72, 0x2a, 0xf7, 0x72, 0x24, 0xc6, 0x88, 0xdf, 0x83, 0x02, 0x17, + 0x8d, 0xca, 0x50, 0xd8, 0x69, 0x6d, 0x3f, 0xde, 0xad, 0xe5, 0x50, 0x09, 0xf2, 0xfb, 0x07, 0xf7, + 0xdb, 0x35, 0x0d, 0x55, 0xa0, 0xf8, 0xf4, 0x1e, 0x39, 0xd8, 0x3f, 0xd8, 0xad, 0xcd, 0x30, 0x8a, + 0x16, 0x21, 0x6d, 0x52, 0x9b, 0xdd, 0x2e, 0x42, 0x81, 0xcb, 0xc7, 0x3f, 0x9b, 0x93, 0xbf, 0xd0, + 0x15, 0x28, 0x7b, 0xc6, 0x90, 0xba, 0x9e, 0x3e, 0x1c, 0x49, 0x97, 0x85, 0x08, 0xa4, 0xc3, 0x1a, + 0x4d, 0xaf, 0x05, 0x52, 0xf5, 0x6f, 0x47, 0x54, 0xcf, 0x2a, 0x1c, 0x7b, 0x39, 0x92, 0x25, 0x07, + 0x11, 0x40, 0x34, 0x91, 0xdd, 0xbc, 0x58, 0x54, 0xb6, 0x36, 0x32, 0xa5, 0x4b, 0xba, 0xbd, 0x1c, + 0x49, 0xe1, 0x46, 0x0f, 0xa0, 0xe6, 0xc5, 0x8a, 0x4a, 0x3d, 0xcf, 0x25, 0xae, 0x47, 0x25, 0xc6, + 0x4b, 0xcf, 0x5e, 0x8e, 0x24, 0x38, 0x51, 0x1b, 0x96, 0xbc, 0x78, 0x75, 0xa9, 0x17, 0x52, 0x22, + 0x97, 0x2c, 0x42, 0x7b, 0x39, 0x92, 0xe4, 0x45, 0x9f, 0xc0, 0x3c, 0x43, 0x9a, 0xb2, 0xcc, 0xd4, + 0xe7, 0x92, 0x67, 0x37, 0x5a, 0x88, 0xf6, 0x72, 0x24, 0xc2, 0xc1, 0x0c, 0x1c, 0xfa, 0xd5, 0xa7, + 0x2b, 0x5d, 0x56, 0x4c, 0x33, 0x30, 0x5e, 0xa3, 0x98, 0x81, 0x71, 0x4e, 0xf4, 0x19, 0xac, 0xd0, + 0x94, 0x42, 0x50, 0x2f, 0x71, 0x89, 0x38, 0x33, 0x08, 0x01, 0xe5, 0x5e, 0x8e, 0xa4, 0x4a, 0x60, + 0x7a, 0xd2, 0xd8, 0xa9, 0xae, 0x97, 0xd3, 0xf4, 0x8c, 0x9f, 0x7d, 0xa6, 0x67, 0x9c, 0x13, 0xdd, + 0x87, 0xea, 0xa9, 0x61, 0x9a, 0x5e, 0x50, 0x0c, 0xea, 0x90, 0xa8, 0x4a, 0x89, 0x82, 0xc1, 0x0e, + 0x4f, 0x94, 0x6b, 0xbb, 0x0c, 0xc5, 0x47, 0xfa, 0x99, 0x69, 0xeb, 0x3d, 0x8c, 0xa0, 0x76, 0x38, + 0x3e, 0x76, 0xbb, 0x8e, 0x71, 0x4c, 0xfd, 0x82, 0x72, 0x19, 0xd6, 0x76, 0xa9, 0x77, 0xdf, 0xd1, + 0x87, 0xf4, 0xb9, 0xed, 0x9c, 0xf2, 0xe2, 0x29, 0x97, 0x7e, 0xab, 0x41, 0xf1, 0x09, 0x75, 0x5c, + 0xc3, 0xb6, 0x58, 0xa1, 0x19, 0xea, 0x9f, 0xdb, 0x0e, 0x3f, 0x35, 0x05, 0x22, 0x00, 0x8e, 0x35, + 0x2c, 0xdb, 0xe1, 0xe7, 0x83, 0x61, 0x19, 0xc0, 0xb0, 0x23, 0xdd, 0xeb, 0x0e, 0x78, 0x5e, 0x17, + 0x88, 0x00, 0x18, 0xf6, 0x78, 0x6c, 0x98, 0x22, 0x37, 0xcb, 0x44, 0x00, 0xac, 0x6d, 0x8e, 0x1c, + 0xbb, 0x37, 0xee, 0x7a, 0x07, 0xfa, 0x90, 0xf2, 0x44, 0x2b, 0x13, 0x15, 0x85, 0xd6, 0x01, 0x26, + 0x42, 0x89, 0x43, 0xcf, 0xe1, 0xd9, 0x53, 0x26, 0x0a, 0x06, 0xff, 0x72, 0x06, 0x2e, 0x25, 0x2d, + 0x60, 0xc5, 0x71, 0x03, 0x2a, 0xfd, 0x00, 0xeb, 0x77, 0x35, 0x15, 0xc5, 0xbb, 0x53, 0xe8, 0x77, + 0xb7, 0x69, 0x8f, 0x2d, 0x4f, 0xda, 0x92, 0x5c, 0x60, 0x9a, 0x70, 0xbf, 0x0a, 0x32, 0x61, 0x9c, + 0x82, 0x09, 0x8b, 0x71, 0x5e, 0x2d, 0xc6, 0xeb, 0x00, 0x03, 0xdb, 0xf5, 0x85, 0x17, 0x04, 0x57, + 0x88, 0x41, 0x18, 0xe6, 0x0d, 0xcb, 0xf5, 0x74, 0xab, 0x4b, 0xb9, 0x0b, 0x84, 0x85, 0x11, 0x1c, + 0x7a, 0x13, 0x8a, 0xd2, 0x62, 0x99, 0xf8, 0x48, 0x49, 0x02, 0x19, 0x22, 0xe2, 0x93, 0xb0, 0xde, + 0xde, 0xa1, 0xba, 0xd3, 0xb3, 0x9f, 0x5b, 0x32, 0x94, 0xac, 0xb7, 0x3b, 0x54, 0x77, 0x6d, 0xcb, + 0xef, 0xed, 0x02, 0x62, 0xfd, 0x25, 0x24, 0x1d, 0x99, 0x67, 0xb8, 0x0e, 0xab, 0xbb, 0xd4, 0x53, + 0x12, 0x34, 0xe8, 0x3c, 0x2f, 0x60, 0x25, 0xb1, 0x72, 0x31, 0x2f, 0x7f, 0x04, 0xf3, 0xaa, 0x33, + 0x65, 0x37, 0x9a, 0xd6, 0xbd, 0x23, 0xf4, 0xf8, 0x4f, 0x79, 0x58, 0x8c, 0x51, 0xa0, 0x2a, 0xcc, + 0x04, 0x83, 0xca, 0x8c, 0xc1, 0xf3, 0x48, 0x1e, 0xf0, 0xa7, 0x03, 0x6a, 0xc9, 0xc6, 0xab, 0xa2, + 0xc2, 0xe8, 0xcc, 0xaa, 0xd1, 0xd9, 0x84, 0x02, 0x8f, 0x60, 0x3d, 0xcf, 0x95, 0xaa, 0xab, 0xad, + 0x6d, 0x60, 0x3b, 0x1e, 0x3b, 0x5a, 0x5c, 0x25, 0x41, 0x86, 0x1a, 0x50, 0x72, 0x6c, 0xdb, 0x23, + 0xb6, 0xe9, 0x27, 0x6b, 0x00, 0xa3, 0x5b, 0x50, 0xeb, 0x8e, 0x1d, 0x87, 0x5a, 0x1e, 0x19, 0x5b, + 0x07, 0xe3, 0xe1, 0x31, 0x15, 0xf9, 0xba, 0x40, 0x12, 0x78, 0xb4, 0x03, 0xa5, 0x1e, 0xed, 0xeb, + 0x63, 0xd3, 0x73, 0xeb, 0x45, 0xbe, 0xf5, 0xcd, 0x6c, 0x7f, 0x6c, 0xee, 0x48, 0xd2, 0x96, 0xe5, + 0x39, 0x67, 0x24, 0xe0, 0x44, 0xb7, 0x21, 0x3f, 0xd1, 0x1d, 0xb7, 0x5e, 0xe2, 0x12, 0xae, 0x4f, + 0x91, 0xf0, 0x44, 0x77, 0x24, 0x37, 0xe7, 0x60, 0xfb, 0x8f, 0x5d, 0xea, 0x30, 0x74, 0xbd, 0x7c, + 0xee, 0xfe, 0x8f, 0x25, 0xa9, 0xdc, 0xdf, 0xe7, 0x6c, 0x7c, 0x00, 0x0b, 0x11, 0xd5, 0x50, 0x0d, + 0x66, 0x4f, 0xe9, 0x99, 0x8c, 0x0b, 0xfb, 0xc9, 0xdc, 0x3e, 0xd1, 0xcd, 0x71, 0x30, 0xc6, 0x72, + 0xe0, 0xce, 0xcc, 0x6d, 0xad, 0xf1, 0x3e, 0x94, 0x03, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0x2c, 0x44, + 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x07, 0x0d, 0x2e, 0x1d, 0xd0, 0xe7, 0x8a, 0x85, 0xfe, 0x19, 0xb9, + 0x05, 0x35, 0x96, 0xb0, 0x7d, 0xd3, 0x7e, 0xde, 0xa1, 0xc3, 0x91, 0x19, 0x8e, 0x55, 0x09, 0x3c, + 0xfa, 0x48, 0x3a, 0x5e, 0xa4, 0xf2, 0x2d, 0xc5, 0x75, 0xa9, 0xb2, 0xe3, 0xee, 0xff, 0xaf, 0x6d, + 0xc7, 0x87, 0xb0, 0x1c, 0xdf, 0x81, 0x1d, 0xc2, 0xaf, 0x37, 0x1f, 0xbf, 0xc6, 0x2b, 0x68, 0x8a, + 0x4b, 0x62, 0xa7, 0x0c, 0xff, 0x54, 0x83, 0xe5, 0x38, 0xe5, 0xd7, 0xde, 0x1e, 0xbd, 0x05, 0x25, + 0xdf, 0xc1, 0x72, 0xd0, 0x5a, 0x56, 0x58, 0xd9, 0xd1, 0xe2, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, + 0x97, 0x9b, 0x62, 0xf9, 0x7c, 0xa5, 0xd1, 0xc7, 0x90, 0xf7, 0xce, 0x46, 0xc2, 0x97, 0xd5, 0xad, + 0x37, 0xd4, 0xa1, 0x3e, 0x4b, 0xc6, 0x66, 0x7b, 0xc4, 0x58, 0x08, 0x67, 0xc4, 0x3a, 0xcc, 0x09, + 0x98, 0x0d, 0x9d, 0x07, 0xed, 0xf6, 0xa3, 0x5a, 0x0e, 0x21, 0xa8, 0x1e, 0x76, 0xee, 0x91, 0xce, + 0xd1, 0xbd, 0x66, 0x67, 0xff, 0xc9, 0x7e, 0xe7, 0x87, 0x35, 0x0d, 0x2d, 0xc1, 0xc2, 0x61, 0xa7, + 0xfd, 0x28, 0x44, 0xcd, 0xa0, 0x05, 0x28, 0x37, 0xdb, 0x07, 0xf7, 0xf7, 0x77, 0x1f, 0x93, 0x56, + 0x6d, 0x96, 0x4d, 0xa7, 0xa4, 0x75, 0xd8, 0xea, 0xd4, 0xf2, 0x68, 0x1e, 0x4a, 0xbb, 0xed, 0x23, + 0x31, 0xab, 0x16, 0xf0, 0x29, 0xac, 0xa5, 0x29, 0xc3, 0x7c, 0x1b, 0x37, 0x27, 0xf5, 0x5e, 0x98, + 0x5a, 0x7b, 0x66, 0xd3, 0x6b, 0x0f, 0xfe, 0x95, 0x06, 0xf5, 0x87, 0x76, 0xcf, 0xe8, 0x9f, 0x5d, + 0xc8, 0x7b, 0x60, 0x8f, 0xa8, 0xc3, 0xaf, 0xb0, 0x7e, 0xbe, 0x5f, 0x4b, 0x8f, 0x6c, 0xdb, 0xa7, + 0x23, 0x0a, 0x0b, 0xba, 0x01, 0x55, 0x87, 0x76, 0x6d, 0xab, 0x6f, 0x9c, 0x8c, 0x1d, 0x7a, 0xcf, + 0x34, 0xb9, 0x5e, 0x25, 0x12, 0xc3, 0xe2, 0xdf, 0x68, 0xb0, 0x92, 0x26, 0x0c, 0xdd, 0x91, 0xf1, + 0x13, 0x97, 0x8f, 0x1b, 0xe7, 0xec, 0x1d, 0x09, 0x9d, 0x28, 0xd7, 0xa6, 0x68, 0xac, 0x33, 0x7e, + 0xb9, 0x16, 0x30, 0x7e, 0x27, 0x25, 0xac, 0x8b, 0x50, 0x21, 0xad, 0x87, 0xed, 0x27, 0xad, 0x23, + 0xd2, 0x7e, 0xc0, 0x22, 0x36, 0x0f, 0xa5, 0x7b, 0x3b, 0x3b, 0x02, 0xca, 0xb3, 0x8b, 0xe4, 0x6a, + 0x8a, 0xe7, 0x58, 0x98, 0x3e, 0x85, 0x5a, 0x5f, 0x37, 0x4c, 0xda, 0x6b, 0x87, 0xde, 0xd2, 0x2e, + 0xe6, 0xad, 0x04, 0xa3, 0x0c, 0xc2, 0x4c, 0x32, 0xe6, 0x6a, 0xef, 0xc2, 0x5f, 0x6a, 0x70, 0x59, + 0x4e, 0x9f, 0x17, 0x08, 0xe4, 0x15, 0x28, 0x9f, 0x52, 0x2a, 0xae, 0xab, 0x5c, 0x74, 0x89, 0x84, + 0x08, 0xf4, 0x36, 0x2c, 0xeb, 0xa6, 0x69, 0x3f, 0xdf, 0xb7, 0xc8, 0xd8, 0xb2, 0x0c, 0xeb, 0xe4, + 0x30, 0xd8, 0xaf, 0x44, 0xd2, 0x96, 0x98, 0x4e, 0x7d, 0xdb, 0xe9, 0x8a, 0x69, 0xa7, 0x44, 0x04, + 0x80, 0x29, 0xac, 0xa5, 0xa9, 0xc4, 0x3c, 0xf4, 0x3f, 0xbc, 0x69, 0xe3, 0x3f, 0x6b, 0x70, 0xed, + 0x30, 0x52, 0x88, 0x1e, 0x39, 0x2c, 0xe7, 0x3c, 0x83, 0xba, 0x59, 0x0e, 0x78, 0x06, 0x30, 0x0a, + 0x88, 0x64, 0x26, 0xdf, 0x51, 0xfb, 0xfd, 0x74, 0x79, 0x9b, 0x21, 0x46, 0x54, 0x72, 0x45, 0x5a, + 0xe3, 0x2e, 0x2c, 0xc6, 0x96, 0x5f, 0xaa, 0xaa, 0x5f, 0x83, 0xab, 0xd9, 0xbb, 0x33, 0x7b, 0x5d, + 0xb8, 0xb6, 0xfb, 0x92, 0xe6, 0xd6, 0xa1, 0xf8, 0xc5, 0x98, 0x3a, 0xbe, 0xad, 0x65, 0xe2, 0x83, + 0xec, 0x44, 0xd2, 0x17, 0x5d, 0x73, 0xdc, 0xa3, 0xbb, 0xa6, 0x7d, 0xac, 0x9b, 0xae, 0x7f, 0x22, + 0xa3, 0x58, 0xfc, 0x7b, 0x0d, 0xae, 0xee, 0x4e, 0x53, 0x0b, 0x7d, 0x16, 0x71, 0xa9, 0x48, 0xf7, + 0xdb, 0x8a, 0x4b, 0xa7, 0x72, 0x7f, 0x93, 0x0e, 0xfd, 0xa7, 0x06, 0x0b, 0x91, 0xf9, 0x0d, 0x21, + 0xc8, 0x5b, 0xac, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x4d, 0xc5, 0xa6, 0xdd, 0x3d, 0x95, 0xf7, 0xfb, + 0x12, 0x91, 0x90, 0xff, 0x12, 0xb6, 0xdf, 0x93, 0xe7, 0x4d, 0x42, 0xca, 0x63, 0x5a, 0x5e, 0x7d, + 0x4c, 0x0b, 0x8f, 0x67, 0x41, 0x2d, 0xc9, 0x57, 0xa0, 0xdc, 0x35, 0x75, 0xd7, 0x55, 0xa6, 0xfa, + 0x10, 0x81, 0x5a, 0x50, 0xed, 0xd1, 0x91, 0x69, 0x9f, 0xf9, 0x3d, 0x51, 0x4e, 0xf6, 0xea, 0xe3, + 0x0a, 0x53, 0x7e, 0x27, 0x42, 0x44, 0x62, 0x4c, 0xac, 0x23, 0xa3, 0x24, 0x19, 0xab, 0x7b, 0xec, + 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x2c, 0x31, 0xf4, 0x13, 0x46, 0xe8, 0x57, 0x18, 0x1f, 0x64, 0x2b, + 0x76, 0xbf, 0x4f, 0x9d, 0xc0, 0x70, 0x1f, 0x64, 0x97, 0x18, 0xff, 0xb5, 0x6e, 0xdf, 0xbf, 0xc1, + 0x29, 0x18, 0xbc, 0x04, 0x8b, 0xbb, 0xd4, 0x93, 0x07, 0x54, 0xdc, 0x17, 0x3e, 0x86, 0x85, 0x10, + 0xc5, 0x92, 0x25, 0x18, 0xb5, 0xb5, 0x0b, 0x8d, 0xda, 0xf8, 0x26, 0x54, 0xa5, 0x00, 0xe5, 0x16, + 0x23, 0xe3, 0xa2, 0xa9, 0x71, 0xc1, 0xef, 0xc3, 0x7c, 0x40, 0xc9, 0x76, 0x7a, 0x0d, 0xf2, 0x6c, + 0x45, 0x16, 0x97, 0xe5, 0x98, 0x47, 0xf9, 0x1e, 0x9c, 0x00, 0xb7, 0x60, 0x81, 0x3f, 0x17, 0xb0, + 0xa8, 0x64, 0x66, 0x09, 0xbb, 0x5a, 0x08, 0xf6, 0x87, 0x76, 0x8f, 0x06, 0x57, 0x8b, 0x10, 0x85, + 0x7f, 0x02, 0x95, 0xa6, 0x3d, 0x1c, 0xea, 0x56, 0x8f, 0x0b, 0xa9, 0xc1, 0x2c, 0xb5, 0x26, 0xdc, + 0xcc, 0x32, 0x61, 0x3f, 0x79, 0x82, 0x0c, 0xa8, 0x69, 0xca, 0x3c, 0x13, 0x40, 0x98, 0xbe, 0xb3, + 0x4a, 0xfa, 0xb2, 0xb4, 0xd1, 0x9d, 0x93, 0xb1, 0xb8, 0x2a, 0xe5, 0xb9, 0x8c, 0x10, 0xc1, 0x14, + 0x64, 0xd3, 0xb7, 0xcc, 0x34, 0xfe, 0x1b, 0x3f, 0x84, 0x4a, 0x73, 0xa0, 0x5b, 0x16, 0x35, 0x33, + 0x6d, 0x40, 0xca, 0x0c, 0x54, 0x96, 0xbd, 0x91, 0x7b, 0xd3, 0x39, 0xa1, 0x5e, 0x98, 0xe5, 0x0c, + 0xc2, 0xff, 0x9a, 0x85, 0x52, 0x70, 0x6c, 0xbe, 0x0b, 0x65, 0x97, 0x05, 0x87, 0x67, 0xa8, 0xf0, + 0x67, 0x76, 0xe0, 0x42, 0x52, 0xc6, 0xd7, 0xf5, 0xbd, 0x2a, 0x87, 0xba, 0x7a, 0x2c, 0x0e, 0x81, + 0xd7, 0x49, 0x48, 0x8a, 0x3e, 0x81, 0x45, 0xc3, 0x3a, 0xb6, 0xc7, 0x56, 0x4f, 0x9a, 0xc4, 0x8a, + 0x13, 0x4b, 0x97, 0x55, 0xb5, 0x45, 0x84, 0xd6, 0x92, 0x38, 0x39, 0xda, 0x86, 0x9a, 0x3d, 0xf6, + 0xa2, 0x22, 0xf2, 0x53, 0x45, 0x24, 0xe8, 0xd1, 0x6d, 0x16, 0xf2, 0x20, 0xa0, 0xf2, 0xf9, 0x2b, + 0xc2, 0x1e, 0xae, 0x12, 0x95, 0x94, 0x1d, 0x3c, 0x96, 0x59, 0x8f, 0x74, 0x6f, 0x20, 0xcf, 0x7c, + 0x00, 0xf3, 0x0f, 0x0a, 0xd6, 0x64, 0x5f, 0x3c, 0x5e, 0x95, 0x89, 0x00, 0x50, 0x33, 0x52, 0x43, + 0xc5, 0x5d, 0xec, 0x5b, 0x29, 0x29, 0xfb, 0x4d, 0x96, 0xcb, 0xb7, 0x60, 0x39, 0xda, 0x76, 0xc5, + 0x79, 0xab, 0x43, 0x51, 0x9c, 0x30, 0x57, 0x26, 0xb3, 0x0f, 0xe2, 0x5f, 0x68, 0xb0, 0x94, 0x68, + 0xd4, 0xe8, 0x0e, 0x54, 0x4e, 0x0d, 0xd3, 0xa4, 0xbd, 0xce, 0x85, 0xce, 0xb9, 0x4a, 0x8c, 0x3e, + 0x84, 0x79, 0x47, 0x8c, 0x17, 0xfe, 0x84, 0x32, 0x9d, 0x39, 0x42, 0x8d, 0x9b, 0xbc, 0xfe, 0xb0, + 0xab, 0x42, 0xa0, 0x7c, 0xe0, 0x6d, 0x4d, 0xf5, 0x76, 0x03, 0x4a, 0x23, 0xdd, 0x1b, 0x1c, 0x8e, + 0x68, 0xd7, 0x1f, 0x08, 0x7d, 0x18, 0x7f, 0x99, 0x87, 0x92, 0x7f, 0xdb, 0xc8, 0xea, 0x17, 0x69, + 0x1f, 0x53, 0x32, 0x9e, 0x16, 0x1a, 0x50, 0xea, 0x8f, 0x4d, 0x93, 0xa7, 0x82, 0xa8, 0x98, 0x01, + 0xac, 0x7a, 0xb6, 0x10, 0xf1, 0x2c, 0x7a, 0x1d, 0x0a, 0x6c, 0x42, 0x75, 0xeb, 0x73, 0xdc, 0x01, + 0xa9, 0x37, 0x21, 0x41, 0x81, 0xee, 0x26, 0xde, 0x10, 0x5e, 0x4d, 0xa1, 0xce, 0x7c, 0x3c, 0x78, + 0x27, 0xf2, 0x78, 0x70, 0x35, 0x8d, 0x35, 0xfe, 0x6a, 0x70, 0x37, 0xf1, 0x6a, 0x90, 0xba, 0xe3, + 0xff, 0xd1, 0x73, 0xc1, 0x1d, 0xde, 0xc5, 0x64, 0x62, 0xb1, 0x1c, 0x0f, 0xe2, 0xa3, 0x9d, 0x17, + 0x1f, 0xfc, 0x3b, 0x0d, 0x5e, 0xd9, 0xa5, 0xde, 0xd3, 0xd8, 0xe3, 0x41, 0x90, 0xa1, 0x1b, 0x50, + 0x71, 0xe8, 0xc8, 0x7e, 0xa4, 0x7b, 0x1e, 0x75, 0xfc, 0x97, 0x39, 0x15, 0x85, 0x6e, 0xc2, 0xa2, + 0x43, 0x27, 0x86, 0x6b, 0xd8, 0x96, 0x4f, 0x25, 0x34, 0x8c, 0xa3, 0x99, 0x2c, 0xdd, 0x34, 0xb7, + 0x1d, 0xdd, 0xea, 0x0e, 0xa8, 0x3f, 0xd0, 0xa9, 0x28, 0xde, 0xf6, 0x4d, 0xb3, 0xa3, 0x9f, 0xb8, + 0x72, 0x62, 0xf7, 0x41, 0x7c, 0x0c, 0x2b, 0x71, 0x1d, 0xfd, 0x23, 0xc0, 0x94, 0xf1, 0x8f, 0x00, + 0xfb, 0xcd, 0xeb, 0x9b, 0xff, 0x38, 0x22, 0xcf, 0x8f, 0x0f, 0xf3, 0xcb, 0x96, 0x54, 0x4b, 0x9e, + 0x84, 0x00, 0xc6, 0x9f, 0xc3, 0xe5, 0x74, 0x57, 0x30, 0x9f, 0x3e, 0x84, 0xa5, 0xf8, 0x0b, 0x4b, + 0xda, 0xe5, 0x29, 0x4d, 0x49, 0x92, 0xe4, 0xc4, 0x08, 0x6a, 0x0f, 0x0c, 0x97, 0xdd, 0x3a, 0x6c, + 0xe5, 0xbb, 0x59, 0x89, 0xc1, 0x99, 0x47, 0xbb, 0x0e, 0x45, 0x79, 0x30, 0x64, 0x8f, 0xf6, 0x41, + 0x16, 0x03, 0xf9, 0x93, 0x44, 0x8d, 0x8b, 0xa3, 0xf1, 0x17, 0x50, 0x55, 0xf6, 0xf5, 0x93, 0x85, + 0x41, 0x69, 0xc9, 0x22, 0xb5, 0x21, 0x82, 0x02, 0xbd, 0x07, 0x97, 0x4e, 0xf8, 0xdc, 0xbd, 0x13, + 0xdb, 0x4c, 0x78, 0x39, 0x7d, 0x11, 0x1f, 0x40, 0xf5, 0x5e, 0xaf, 0xc7, 0x64, 0xf9, 0x49, 0x95, + 0x66, 0x5c, 0x8a, 0x09, 0x33, 0xe9, 0x26, 0x10, 0x98, 0x0f, 0xe4, 0x89, 0x99, 0x0d, 0x59, 0xf4, + 0x79, 0x5c, 0x25, 0x21, 0x3b, 0x65, 0x85, 0xed, 0x6e, 0xf8, 0x1d, 0xbf, 0x4c, 0xf8, 0x6f, 0xfc, + 0x3a, 0x2c, 0x11, 0x3a, 0xb4, 0x27, 0x54, 0x55, 0x73, 0x05, 0x0a, 0x86, 0xd5, 0xa3, 0x2f, 0xfc, + 0xef, 0x09, 0x1c, 0xc0, 0xdf, 0x83, 0x45, 0x95, 0x94, 0x69, 0x70, 0x03, 0xaa, 0xea, 0x3e, 0x41, + 0x3a, 0xc6, 0xb0, 0xf8, 0x0d, 0x58, 0x26, 0xb4, 0xef, 0x50, 0x77, 0xa0, 0xc6, 0x3d, 0x63, 0x9f, + 0xef, 0xc0, 0xa5, 0x43, 0xea, 0x29, 0xec, 0xd3, 0xc9, 0xef, 0xf2, 0xcb, 0xe6, 0x6e, 0x5a, 0x04, + 0x7c, 0x46, 0x35, 0xf7, 0xb5, 0x58, 0xee, 0xff, 0x80, 0xdf, 0xee, 0xd8, 0x36, 0x19, 0xcc, 0xa9, + 0xbb, 0x46, 0x44, 0xce, 0xc4, 0x44, 0xbe, 0x03, 0xaf, 0x64, 0x89, 0x64, 0x4e, 0xf3, 0xc3, 0xa0, + 0x29, 0x61, 0x28, 0x42, 0xa1, 0x35, 0x1c, 0x79, 0x67, 0x5b, 0xff, 0x5e, 0x80, 0xa2, 0x7c, 0x6c, + 0x42, 0x4d, 0xa8, 0x74, 0x1c, 0xbd, 0x2b, 0x3f, 0xd9, 0xa1, 0x7a, 0xe2, 0xcb, 0xae, 0x54, 0xb1, + 0xb1, 0x9a, 0xb2, 0xc2, 0x2e, 0xa6, 0xb9, 0xb7, 0x35, 0xf4, 0x0c, 0x6a, 0xf1, 0x0f, 0x30, 0x08, + 0x47, 0x6f, 0x81, 0x69, 0xdf, 0x97, 0x1a, 0x1b, 0x53, 0x69, 0xb8, 0x74, 0xb4, 0x0d, 0x25, 0xff, + 0x03, 0x05, 0x52, 0x1f, 0x14, 0x63, 0x1f, 0x38, 0x1a, 0xf5, 0xd4, 0x35, 0x21, 0xe3, 0x29, 0x1f, + 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0xd5, 0xcc, 0x4b, 0x6a, 0x60, 0xf1, 0xb5, 0x69, 0x24, 0x42, 0x70, + 0x07, 0xaa, 0xd1, 0xc7, 0x58, 0xb4, 0x71, 0xde, 0x4b, 0x70, 0x63, 0x7d, 0x0a, 0x45, 0x20, 0x35, + 0xba, 0x1f, 0xda, 0xc8, 0x54, 0x25, 0x4d, 0x6a, 0xca, 0x03, 0x2d, 0xce, 0xa1, 0x1f, 0x03, 0x4a, + 0xbe, 0x30, 0xa2, 0xeb, 0x17, 0x79, 0x0d, 0x6d, 0xe0, 0x73, 0xa8, 0xc4, 0x0e, 0x3f, 0x82, 0xa5, + 0xc4, 0xdb, 0x18, 0x52, 0x27, 0xd9, 0xac, 0x37, 0xc7, 0xc6, 0xab, 0xd3, 0x89, 0x02, 0x03, 0x92, + 0x2f, 0x4b, 0x11, 0x03, 0x32, 0xdf, 0xc2, 0x22, 0x06, 0x64, 0x3c, 0x4f, 0x89, 0x5c, 0xf3, 0x6f, + 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x1c, 0xfa, 0x18, 0x8a, + 0x12, 0x85, 0x2e, 0x27, 0xc9, 0x7c, 0x09, 0x6b, 0x69, 0x4b, 0x42, 0xc0, 0x01, 0xcc, 0xab, 0x83, + 0x35, 0x5a, 0xcf, 0x7c, 0x1a, 0x13, 0xa2, 0xa6, 0x3e, 0x9d, 0x05, 0x46, 0xf1, 0x01, 0x26, 0x6e, + 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, 0x1e, 0x9c, 0x43, 0x7d, 0xfe, 0xe9, 0x2f, 0xd1, 0xbc, + 0xd1, 0x8d, 0x28, 0x4f, 0xd6, 0xa0, 0xd3, 0xb8, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0xe5, 0xa0, + 0x81, 0xa2, 0x57, 0x14, 0xa6, 0x78, 0x3b, 0x6f, 0x5c, 0x4e, 0x5f, 0x0c, 0x62, 0x20, 0x9b, 0x58, + 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, 0xda, 0xf3, 0x70, 0x0e, 0xed, 0x01, 0x84, 0x6d, 0x08, + 0x5d, 0x89, 0x74, 0xed, 0x58, 0x23, 0x6b, 0x34, 0x32, 0x56, 0x7d, 0xef, 0xcf, 0xab, 0x5d, 0x29, + 0x12, 0xcd, 0x94, 0x76, 0xd5, 0xa8, 0xa9, 0x6f, 0xc5, 0xac, 0x5a, 0xe3, 0x1c, 0xba, 0x0f, 0xd5, + 0x68, 0xb3, 0x8a, 0xd4, 0x83, 0xd4, 0x3e, 0x96, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0xba, 0x18, 0xba, + 0x15, 0x95, 0x38, 0xad, 0xd5, 0xa5, 0xca, 0x36, 0x61, 0x35, 0xbd, 0x1f, 0xa1, 0x9b, 0x51, 0xc9, + 0xd9, 0x5d, 0xb0, 0x71, 0xe3, 0x02, 0x94, 0xc2, 0xab, 0x1f, 0x42, 0x39, 0xf8, 0x1f, 0x43, 0x24, + 0x4f, 0xe2, 0xff, 0x6e, 0x88, 0xea, 0x3a, 0xa1, 0x96, 0xf7, 0xb6, 0xb6, 0x7d, 0xfb, 0x8f, 0x5f, + 0xad, 0x6b, 0x7f, 0xfb, 0x6a, 0x5d, 0xfb, 0xfb, 0x57, 0xeb, 0xda, 0xaf, 0xff, 0xb1, 0x9e, 0x03, + 0xdc, 0x1d, 0x6c, 0x76, 0xa9, 0x63, 0x6d, 0xea, 0xa6, 0xd1, 0xa5, 0x9b, 0xf6, 0xd6, 0xa6, 0xcf, + 0xe3, 0x8c, 0xba, 0x2e, 0x75, 0x26, 0xd4, 0x79, 0x36, 0x33, 0x3a, 0x3e, 0x9e, 0xe3, 0xff, 0x2c, + 0x7c, 0xf7, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x39, 0xf9, 0x3c, 0x20, 0x73, 0x28, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc *grpc.ClientConn +} + +func NewControlClient(cc *grpc.ClientConn) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return x, nil } -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return m, nil } -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", + return out, nil +} + +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + return out, nil +} + +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + if err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + return out, nil +} + +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + return out, nil +} + +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + if err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + return out, nil +} + +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return x, nil } -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream } -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +type controlSubscribeClient struct { + grpc.ClientStream +} + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - return dAtA[:n], nil + return m, nil } -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ControlServer is the server API for Control service. +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error } -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func RegisterControlServer(s *grpc.Server, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlTrackStatusServer struct { + grpc.ServerStream } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return interceptor(ctx, in, info, handler) } -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) } - return len(dAtA) - i, nil + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 + return interceptor(ctx, in, info, handler) +} + +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { + return nil, err } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", } - return len(dAtA) - i, nil + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { + return nil, err } - return len(dAtA) - i, nil + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { + return nil, err } - return len(dAtA) - i, nil + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) +} -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) +} + +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlSubscribeServer struct { + grpc.ServerStream +} + +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, + { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, + { + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", +} + +func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -4998,31 +5361,58 @@ func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + return len(dAtA) - i, nil +} + +func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + return dAtA[:n], nil +} + +func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Destination) > 0 { + i -= len(m.Destination) + copy(dAtA[i:], m.Destination) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + i-- + dAtA[i] = 0x1a + } + if len(m.Source) > 0 { + i -= len(m.Source) + copy(dAtA[i:], m.Source) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + i-- + dAtA[i] = 0x12 + } + if len(m.Event) > 0 { + i -= len(m.Event) + copy(dAtA[i:], m.Event) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5032,12 +5422,12 @@ func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5046,114 +5436,24 @@ func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- dAtA[i] = 0x12 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5163,12 +5463,12 @@ func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5177,36 +5477,24 @@ func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5216,12 +5504,12 @@ func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5230,22 +5518,17 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.Taskid) > 0 { + i -= len(m.Taskid) + copy(dAtA[i:], m.Taskid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5255,12 +5538,12 @@ func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5269,17 +5552,24 @@ func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.ExecutorResources) > 0 { + i -= len(m.ExecutorResources) + copy(dAtA[i:], m.ExecutorResources) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) + i-- + dAtA[i] = 0x12 + } + if len(m.Taskresources) > 0 { + i -= len(m.Taskresources) + copy(dAtA[i:], m.Taskresources) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5289,12 +5579,12 @@ func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5303,18 +5593,6 @@ func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } if m.Environment != nil { { size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) @@ -5330,7 +5608,7 @@ func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5340,12 +5618,12 @@ func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5354,22 +5632,29 @@ func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if m.CleanupTasksReply != nil { + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5379,12 +5664,12 @@ func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5393,29 +5678,10 @@ func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5425,12 +5691,12 @@ func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5439,41 +5705,10 @@ func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5483,12 +5718,12 @@ func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5497,22 +5732,10 @@ func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5522,12 +5745,12 @@ func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5536,24 +5759,10 @@ func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5561,13 +5770,20 @@ func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5577,12 +5793,12 @@ func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5591,73 +5807,33 @@ func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.Event != nil { + { + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } - i-- - dAtA[i] = 0x10 } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CleanupTasksReply != nil { + if m.MesosHeartbeat != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5665,12 +5841,11 @@ func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5680,12 +5855,12 @@ func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5694,188 +5869,161 @@ func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } } } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if m.EnvironmentStateChanged != nil { + { + size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { +func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentCreated != nil { + { + size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + return len(dAtA) - i, nil +} +func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.TaskStateChanged != nil { + { + size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x18 + dAtA[i] = 0x22 } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 + return len(dAtA) - i, nil +} +func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskStatusChanged != nil { + { + size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x2a } return len(dAtA) - i, nil } - -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { +func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.Tasklaunched != nil { + { + size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } + return len(dAtA) - i, nil +} +func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa + if m.MesosTaskcreated != nil { + { + size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a } return len(dAtA) - i, nil } - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.DeploymentInfo != nil { + if m.EnvironmentDestroyed != nil { { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5883,112 +6031,53 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + dAtA[i] = 0x42 } return len(dAtA) - i, nil } - -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { +func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentError != nil { + { + size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x4a + } + return len(dAtA) - i, nil +} +func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + if m.KilltasksMesos != nil { + { + size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- - dAtA[i] = 0xa + dAtA[i] = 0x52 } return len(dAtA) - i, nil } - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5998,12 +6087,12 @@ func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6015,7 +6104,7 @@ func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6025,12 +6114,12 @@ func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6039,24 +6128,10 @@ func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6066,12 +6141,12 @@ func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6080,17 +6155,46 @@ func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6100,12 +6204,12 @@ func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6114,9 +6218,9 @@ func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Task != nil { + if m.Version != nil { { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6124,27 +6228,63 @@ func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + dAtA[i] = 0x3a } - return dAtA[:n], nil -} + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6153,24 +6293,17 @@ func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6180,12 +6313,12 @@ func (m *CommandInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6194,52 +6327,10 @@ func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6249,12 +6340,12 @@ func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6263,31 +6354,10 @@ func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6297,12 +6367,12 @@ func (m *TaskInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6311,69 +6381,10 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6381,37 +6392,20 @@ func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + dAtA[i] = 0x12 } - i-- - dAtA[i] = 0x12 } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6421,144 +6415,12 @@ func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6624,10 +6486,22 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x3a } } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) + i-- + dAtA[i] = 0x30 + } + if len(m.RootRole) > 0 { + i -= len(m.RootRole) + copy(dAtA[i:], m.RootRole) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) + i-- + dAtA[i] = 0x2a + } + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6635,25 +6509,9 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a + dAtA[i] = 0x22 } } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -6661,24 +6519,24 @@ func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x1a } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + if len(m.CreatedWhen) > 0 { + i -= len(m.CreatedWhen) + copy(dAtA[i:], m.CreatedWhen) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) i-- dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { +func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6688,12 +6546,12 @@ func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6702,24 +6560,36 @@ func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) i-- dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 } } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { +func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6729,12 +6599,12 @@ func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6743,44 +6613,22 @@ func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6790,12 +6638,12 @@ func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,31 +6652,17 @@ func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6838,12 +6672,12 @@ func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6852,24 +6686,34 @@ func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Workflow != nil { + { + size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0xa + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.Environment != nil { + { + size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { +func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6879,12 +6723,12 @@ func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6893,10 +6737,22 @@ func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x10 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { +func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6906,12 +6762,12 @@ func (m *RepoInfo) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { +func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6920,34 +6776,29 @@ func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x10 + dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { +func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6957,12 +6808,12 @@ func (m *ListReposReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6971,17 +6822,20 @@ func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + if m.ReconfigureAll { i-- - dAtA[i] = 0x12 + if m.ReconfigureAll { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + if len(m.Operations) > 0 { + for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6989,13 +6843,20 @@ func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7005,12 +6866,12 @@ func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7019,24 +6880,22 @@ func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + if len(m.RoleName) > 0 { + i -= len(m.RoleName) + copy(dAtA[i:], m.RoleName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) i-- dAtA[i] = 0x12 } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + if m.Type != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) i-- - dAtA[i] = 0xa + dAtA[i] = 0x8 } return len(dAtA) - i, nil } -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { +func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7046,12 +6905,12 @@ func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7060,24 +6919,38 @@ func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + if len(m.FailedOperations) > 0 { + for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7087,12 +6960,12 @@ func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7101,30 +6974,62 @@ func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if m.Force { i-- - dAtA[i] = 0x8 + if m.Force { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if m.AllowInRunningState { + i-- + if m.AllowInRunningState { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + if m.KeepTasks { + i-- + if m.KeepTasks { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7133,17 +7038,22 @@ func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + if m.CleanupTasksReply != nil { + { + size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7153,12 +7063,12 @@ func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7167,15 +7077,36 @@ func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { +func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7185,12 +7116,12 @@ func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7199,15 +7130,10 @@ func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } return len(dAtA) - i, nil } -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7217,12 +7143,12 @@ func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7231,17 +7157,36 @@ func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + if m.ExcludeGlobals { + i-- + if m.ExcludeGlobals { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x18 + } + if len(m.Queries) > 0 { + for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Queries[iNdEx]) + copy(dAtA[i:], m.Queries[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7251,12 +7196,12 @@ func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7265,22 +7210,29 @@ func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0xa + } } return len(dAtA) - i, nil } -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { +func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7290,12 +7242,12 @@ func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { +func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7304,17 +7256,67 @@ func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, er i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + if m.DeploymentInfo != nil { + { + size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x3a + } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x2a + } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x22 + } + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0x1a + } + if m.Locked { + i-- + if m.Locked { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Empty) Marshal() (dAtA []byte, err error) { +func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -7324,12 +7326,12 @@ func (m *Empty) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { +func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -7338,1056 +7340,1428 @@ func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 + if len(m.ExecutorId) > 0 { + i -= len(m.ExecutorId) + copy(dAtA[i:], m.ExecutorId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.OfferId) > 0 { + i -= len(m.OfferId) + copy(dAtA[i:], m.OfferId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) + i-- + dAtA[i] = 0x1a } - return n + if len(m.AgentId) > 0 { + i -= len(m.AgentId) + copy(dAtA[i:], m.AgentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) + i-- + dAtA[i] = 0x12 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 +func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + return len(dAtA) - i, nil } -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 +func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Tasks) > 0 { + for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 +func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.TaskId) > 0 { + i -= len(m.TaskId) + copy(dAtA[i:], m.TaskId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 +func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Task != nil { + { + size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 + +func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.ControlMode) > 0 { + i -= len(m.ControlMode) + copy(dAtA[i:], m.ControlMode) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) + i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *Version) Size() (n int) { - if m == nil { - return 0 +func (m *CommandInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) + if len(m.User) > 0 { + i -= len(m.User) + copy(dAtA[i:], m.User) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) + i-- + dAtA[i] = 0x2a } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Arguments[iNdEx]) + copy(dAtA[i:], m.Arguments[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) + i-- + dAtA[i] = 0x22 + } } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x1a } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Shell { + i-- + if m.Shell { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Env) > 0 { + for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.Env[iNdEx]) + copy(dAtA[i:], m.Env[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 +func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 + if len(m.Target) > 0 { + i -= len(m.Target) + copy(dAtA[i:], m.Target) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) + i-- + dAtA[i] = 0x1a } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Type) > 0 { + i -= len(m.Type) + copy(dAtA[i:], m.Type) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *TaskInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Properties) > 0 { + for k := range m.Properties { + v := m.Properties[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0x3a } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.TaskPath) > 0 { + i -= len(m.TaskPath) + copy(dAtA[i:], m.TaskPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) + i-- + dAtA[i] = 0x32 } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.CommandInfo != nil { + { + size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x2a } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.OutboundChannels) > 0 { + for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 } } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.InboundChannels) > 0 { + for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a } } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if m.ClassInfo != nil { + { + size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.ShortInfo != nil { + { + size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 +func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.RunningTasks) > 0 { + for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } } - return n + return len(dAtA) - i, nil } -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 +func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) + if len(m.PathSpec) > 0 { + i -= len(m.PathSpec) + copy(dAtA[i:], m.PathSpec) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.EnvId) > 0 { + i -= len(m.EnvId) + copy(dAtA[i:], m.EnvId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 +func (m *RoleInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 + if len(m.UserVars) > 0 { + for k := range m.UserVars { + v := m.UserVars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x4a + } } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Defaults) > 0 { + for k := range m.Defaults { + v := m.Defaults[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x3a } } - if m.ReconfigureAll { - n += 2 + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x32 + } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.TaskIds) > 0 { + for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TaskIds[iNdEx]) + copy(dAtA[i:], m.TaskIds[iNdEx]) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) + i-- + dAtA[i] = 0x2a + } } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 + if len(m.FullPath) > 0 { + i -= len(m.FullPath) + copy(dAtA[i:], m.FullPath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) + i-- + dAtA[i] = 0x22 } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + if len(m.Roles) > 0 { + for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 +func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.AllTags { + i-- + if m.AllTags { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) + if m.AllBranches { + i-- + if m.AllBranches { + dAtA[i] = 1 + } else { + dAtA[i] = 0 } + i-- + dAtA[i] = 0x18 } - if m.ExcludeGlobals { - n += 2 + if len(m.RevisionPattern) > 0 { + i -= len(m.RevisionPattern) + copy(dAtA[i:], m.RevisionPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.RepoPattern) > 0 { + i -= len(m.RepoPattern) + copy(dAtA[i:], m.RepoPattern) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n +func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } +func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0x1a } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Template) > 0 { + i -= len(m.Template) + copy(dAtA[i:], m.Template) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Repo) > 0 { + i -= len(m.Repo) + copy(dAtA[i:], m.Repo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) +func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - return n + return dAtA[:n], nil } -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } +func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.WorkflowTemplates) > 0 { + for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil } -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 +func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + return len(dAtA) - i, nil } -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 +func (m *RepoInfo) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return dAtA[:n], nil } -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } +func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x1a } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.Default { + i-- + if m.Default { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 } - return n + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 +func (m *ListReposReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.GlobalDefaultRevision) > 0 { + i -= len(m.GlobalDefaultRevision) + copy(dAtA[i:], m.GlobalDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) + i-- + dAtA[i] = 0x12 } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Repos) > 0 { + for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa } } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n + return len(dAtA) - i, nil } -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 +func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.DefaultRevision) > 0 { + i -= len(m.DefaultRevision) + copy(dAtA[i:], m.DefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 +func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0x12 } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if len(m.NewDefaultRevision) > 0 { + i -= len(m.NewDefaultRevision) + copy(dAtA[i:], m.NewDefaultRevision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) + i-- + dAtA[i] = 0xa } - return n + return len(dAtA) - i, nil } -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 +func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 +func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.NewDefaultRepo) > 0 { + i -= len(m.NewDefaultRepo) + copy(dAtA[i:], m.NewDefaultRepo) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 +func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 +func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil } -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 +func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - return n + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil } -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 +func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err } + return dAtA[:n], nil +} + +func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i var l int _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if len(m.Revision) > 0 { + i -= len(m.Revision) + copy(dAtA[i:], m.Revision) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) + i-- + dAtA[i] = 0x12 } - if m.AllBranches { - n += 2 + if m.Index != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) + i-- + dAtA[i] = 0x8 } - if m.AllTags { - n += 2 + return len(dAtA) - i, nil +} + +func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Info) > 0 { + i -= len(m.Info) + copy(dAtA[i:], m.Info) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Empty) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Empty) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { + offset -= sovO2Control(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Event_MesosHeartbeat) Size() (n int) { + if m == nil { + return 0 } + var l int + _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *WorkflowTemplateInfo) Size() (n int) { +func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Repo) + l = len(m.Event) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Template) + l = len(m.Source) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Revision) + l = len(m.Destination) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8397,17 +8771,19 @@ func (m *WorkflowTemplateInfo) Size() (n int) { return n } -func (m *GetWorkflowTemplatesReply) Size() (n int) { +func (m *Ev_TaskStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } + l = len(m.Taskid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8415,32 +8791,33 @@ func (m *GetWorkflowTemplatesReply) Size() (n int) { return n } -func (m *ListReposRequest) Size() (n int) { +func (m *Ev_TaskStatusChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l + l = len(m.Taskid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RepoInfo) Size() (n int) { +func (m *Ev_TaskLaunched) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) + l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8450,19 +8827,17 @@ func (m *RepoInfo) Size() (n int) { return n } -func (m *ListReposReply) Size() (n int) { +func (m *Ev_MesosTaskCreated) Size() (n int) { if m == nil { return 0 } var l int _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } + l = len(m.Taskresources) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.GlobalDefaultRevision) + l = len(m.ExecutorResources) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8472,18 +8847,14 @@ func (m *ListReposReply) Size() (n int) { return n } -func (m *AddRepoRequest) Size() (n int) { +func (m *Ev_EnvironmentCreated) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { + if m.Environment != nil { + l = m.Environment.Size() n += 1 + l + sovO2Control(uint64(l)) } if m.XXX_unrecognized != nil { @@ -8492,17 +8863,17 @@ func (m *AddRepoRequest) Size() (n int) { return n } -func (m *AddRepoReply) Size() (n int) { +func (m *Ev_EnvironmentDestroyed) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRevision) - if l > 0 { + if m.CleanupTasksReply != nil { + l = m.CleanupTasksReply.Size() n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Info) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8512,60 +8883,57 @@ func (m *AddRepoReply) Size() (n int) { return n } -func (m *RemoveRepoRequest) Size() (n int) { +func (m *Ev_EnvironmentError) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RemoveRepoReply) Size() (n int) { +func (m *Ev_KillTasksMesos) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *RefreshReposRequest) Size() (n int) { +func (m *StatusRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *SetDefaultRepoRequest) Size() (n int) { +func (m *StatusReply) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.StatusUpdates) > 0 { + for _, e := range m.StatusUpdates { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8573,15 +8941,17 @@ func (m *SetDefaultRepoRequest) Size() (n int) { return n } -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { +func (m *StatusUpdate) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.Level != 0 { + n += 1 + sovO2Control(uint64(m.Level)) + } + if m.Event != nil { + n += m.Event.Size() } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8589,60 +8959,2510 @@ func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { return n } -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { +func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) + if m.MesosHeartbeat != nil { + l = m.MesosHeartbeat.Size() + n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Revision) + return n +} +func (m *Event) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Timestamp) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + if m.Payload != nil { + n += m.Payload.Size() + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *SetRepoDefaultRevisionReply) Size() (n int) { +func (m *Event_EnvironmentStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Info) - if l > 0 { + if m.EnvironmentStateChanged != nil { + l = m.EnvironmentStateChanged.Size() n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + return n +} +func (m *Event_EnvironmentCreated) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentCreated != nil { + l = m.EnvironmentCreated.Size() + n += 1 + l + sovO2Control(uint64(l)) } return n } - -func (m *Empty) Size() (n int) { +func (m *Event_TaskStateChanged) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) + if m.TaskStateChanged != nil { + l = m.TaskStateChanged.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_TaskStatusChanged) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.TaskStatusChanged != nil { + l = m.TaskStatusChanged.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_Tasklaunched) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Tasklaunched != nil { + l = m.Tasklaunched.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_MesosTaskcreated) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.MesosTaskcreated != nil { + l = m.MesosTaskcreated.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_EnvironmentDestroyed) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentDestroyed != nil { + l = m.EnvironmentDestroyed.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_EnvironmentError) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EnvironmentError != nil { + l = m.EnvironmentError.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *Event_KilltasksMesos) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.KilltasksMesos != nil { + l = m.KilltasksMesos.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + return n +} +func (m *SubscribeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetFrameworkInfoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Version) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Major != 0 { + n += 1 + sovO2Control(uint64(m.Major)) + } + if m.Minor != 0 { + n += 1 + sovO2Control(uint64(m.Minor)) + } + if m.Patch != 0 { + n += 1 + sovO2Control(uint64(m.Patch)) + } + l = len(m.Build) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ProductName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.VersionStr) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetFrameworkInfoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FrameworkId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.EnvironmentsCount != 0 { + n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) + } + if m.TasksCount != 0 { + n += 1 + sovO2Control(uint64(m.TasksCount)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.HostsCount != 0 { + n += 1 + sovO2Control(uint64(m.HostsCount)) + } + l = len(m.InstanceName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Version != nil { + l = m.Version.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TeardownRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Reason) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TeardownReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentsReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.FrameworkId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Environments) > 0 { + for _, e := range m.Environments { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EnvironmentInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.CreatedWhen) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.RootRole) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) + } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NewEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *NewEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Environment != nil { + l = m.Environment.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Environment != nil { + l = m.Environment.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Workflow != nil { + l = m.Workflow.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ControlEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Type != 0 { + n += 1 + sovO2Control(uint64(m.Type)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ControlEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ModifyEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Operations) > 0 { + for _, e := range m.Operations { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ReconfigureAll { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EnvironmentOperation) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovO2Control(uint64(m.Type)) + } + l = len(m.RoleName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ModifyEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.FailedOperations) > 0 { + for _, e := range m.FailedOperations { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DestroyEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.KeepTasks { + n += 2 + } + if m.AllowInRunningState { + n += 2 + } + if m.Force { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DestroyEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.CleanupTasksReply != nil { + l = m.CleanupTasksReply.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Queries) > 0 { + for _, s := range m.Queries { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.ExcludeGlobals { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetEnvironmentPropertiesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ShortTaskInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Locked { + n += 2 + } + l = len(m.TaskId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.DeploymentInfo != nil { + l = m.DeploymentInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskDeploymentInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.AgentId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.OfferId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ExecutorId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTasksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTasksReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Tasks) > 0 { + for _, e := range m.Tasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTaskRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.TaskId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetTaskReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Task != nil { + l = m.Task.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskClassInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ControlMode) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CommandInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Env) > 0 { + for _, s := range m.Env { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.Shell { + n += 2 + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Arguments) > 0 { + for _, s := range m.Arguments { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.User) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ChannelInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Type) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Target) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TaskInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.ShortInfo != nil { + l = m.ShortInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if m.ClassInfo != nil { + l = m.ClassInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.InboundChannels) > 0 { + for _, e := range m.InboundChannels { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.OutboundChannels) > 0 { + for _, e := range m.OutboundChannels { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.CommandInfo != nil { + l = m.CommandInfo.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.TaskPath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.EnvId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Properties) > 0 { + for k, v := range m.Properties { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CleanupTasksRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *CleanupTasksReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.RunningTasks) > 0 { + for _, e := range m.RunningTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetRolesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.EnvId) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.PathSpec) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RoleInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Status) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.FullPath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.TaskIds) > 0 { + for _, s := range m.TaskIds { + l = len(s) + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.Roles) > 0 { + for _, e := range m.Roles { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if len(m.Defaults) > 0 { + for k, v := range m.Defaults { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if len(m.UserVars) > 0 { + for k, v := range m.UserVars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetRolesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Roles) > 0 { + for _, e := range m.Roles { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetWorkflowTemplatesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RepoPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.RevisionPattern) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.AllBranches { + n += 2 + } + if m.AllTags { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *WorkflowTemplateInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Repo) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Template) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetWorkflowTemplatesReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.WorkflowTemplates) > 0 { + for _, e := range m.WorkflowTemplates { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ListReposRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RepoInfo) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Default { + n += 2 + } + l = len(m.DefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ListReposReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Repos) > 0 { + for _, e := range m.Repos { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } + l = len(m.GlobalDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.DefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *AddRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultRevision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RemoveRepoReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.NewDefaultRepo) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *RefreshReposRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetDefaultRepoRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetRepoDefaultRevisionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Index != 0 { + n += 1 + sovO2Control(uint64(m.Index)) + } + l = len(m.Revision) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetRepoDefaultRevisionReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Info) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Empty) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control + } + 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_MesosHeartbeat: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentStateChanged: 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Source", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Source = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Destination = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskStateChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskStatusChanged: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_TaskLaunched) 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 ErrIntOverflowO2Control + } + 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: Ev_TaskLaunched: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_MesosTaskCreated) 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 ErrIntOverflowO2Control + } + 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: Ev_MesosTaskCreated: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Taskresources = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentCreated: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Environment == nil { + m.Environment = &EnvironmentInfo{} + } + if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentDestroyed) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentDestroyed: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.CleanupTasksReply == nil { + m.CleanupTasksReply = &CleanupTasksReply{} + } + if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Environmentid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_EnvironmentError) 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 ErrIntOverflowO2Control + } + 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: Ev_EnvironmentError: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Ev_KillTasksMesos) 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 ErrIntOverflowO2Control + } + 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: Ev_KillTasksMesos: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusRequest) 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 ErrIntOverflowO2Control + } + 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: StatusRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StatusReply) 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 ErrIntOverflowO2Control + } + 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: StatusReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) + if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } } - return n -} -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil } -func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { +func (m *StatusUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8665,125 +11485,402 @@ func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") + return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) + } + m.Level = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Level |= StatusUpdate_Level(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Event_MesosHeartbeat{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Event = &StatusUpdate_MesosHeartbeat{v} + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) if err != nil { return err } - if skippy < 0 { + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +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 ErrIntOverflowO2Control + } + 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 Timestamp", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Timestamp = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_EnvironmentStateChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentStateChanged{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_EnvironmentCreated{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentCreated{v} + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_TaskStateChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_TaskStateChanged{v} + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control + v := &Ev_TaskStatusChanged{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { - return io.ErrUnexpectedEOF + m.Payload = &Event_TaskStatusChanged{v} + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &Ev_TaskLaunched{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - if skippy < 0 { + m.Payload = &Event_Tasklaunched{v} + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) < 0 { + postIndex := iNdEx + msglen + if postIndex < 0 { return ErrInvalidLengthO2Control } - if (iNdEx + skippy) > l { + if postIndex > l { return io.ErrUnexpectedEOF } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control + v := &Ev_MesosTaskCreated{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - if iNdEx >= l { + m.Payload = &Event_MesosTaskcreated{v} + iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { return io.ErrUnexpectedEOF } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + v := &Ev_EnvironmentDestroyed{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + m.Payload = &Event_EnvironmentDestroyed{v} + iNdEx = postIndex + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -8793,27 +11890,30 @@ func (m *StatusReply) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.State = string(dAtA[iNdEx:postIndex]) + v := &Ev_EnvironmentError{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Payload = &Event_EnvironmentError{v} iNdEx = postIndex - case 2: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -8840,10 +11940,11 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + v := &Ev_KillTasksMesos{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } + m.Payload = &Event_KilltasksMesos{v} iNdEx = postIndex default: iNdEx = preIndex @@ -8870,7 +11971,7 @@ func (m *StatusReply) Unmarshal(dAtA []byte) error { } return nil } -func (m *StatusUpdate) Unmarshal(dAtA []byte) error { +func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -8893,66 +11994,12 @@ func (m *StatusUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StatusUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index edac7a462..7ce0f4270 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -49,7 +49,7 @@ message Ev_TaskStatusChanged { string status = 2; } -message Ev_TaskLaunch { +message Ev_TaskLaunched { string taskid = 1; } @@ -138,7 +138,7 @@ message Event { Ev_EnvironmentCreated environmentCreated = 3; Ev_TaskStateChanged taskStateChanged = 4; Ev_TaskStatusChanged taskStatusChanged = 5; - Ev_TaskLaunch tasklaunch = 6; + Ev_TaskLaunched tasklaunched = 6; Ev_MesosTaskCreated mesosTaskcreated = 7; Ev_EnvironmentDestroyed environmentDestroyed = 8; Ev_EnvironmentError environmentError = 9; From 7aa9a91da22aa2ab2185b6c307f5812f1f49a635 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 22 Jun 2020 14:41:23 +0300 Subject: [PATCH 0279/2352] [core] Change warnings about repo access to debug --- core/repos/repomanager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 14d84c5e9..677763e73 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -79,7 +79,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { // Get global default revision rm.defaultRevision, err = rm.cService.GetDefaultRevision() if err != nil || rm.defaultRevision == "" { - log.Warning("Failed to parse default_revision from backend") + log.Debug("Failed to parse default_revision from backend") rm.defaultRevision = viper.GetString("globalDefaultRevision") } else { viper.Set("globalDefaultRevision", rm.defaultRevision) @@ -88,7 +88,7 @@ func initializeRepos(service *confsys.Service) *RepoManager { // Get default revisions revsMap, err := rm.cService.GetRepoDefaultRevisions() if err != nil { - log.Warning("Failed to parse default_revisions from backend") + log.Debug("Failed to parse default_revisions from backend") rm.defaultRevisions = make(map[string]string) } else { rm.defaultRevisions = revsMap From ddcf1ca874b17c44cfcb3810ff1c27aaaeea8ac0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Jun 2020 09:57:29 +0300 Subject: [PATCH 0280/2352] [core] Update go-git dependency --- core/repos/repo.go | 4 ++-- core/repos/repomanager.go | 4 ++-- go.mod | 2 +- go.sum | 12 ++++++++++++ 4 files changed, 17 insertions(+), 5 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 7f723926a..4e141059c 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -27,8 +27,8 @@ package repos import ( "errors" "github.com/gobwas/glob" - "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" "io/ioutil" "strings" diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 677763e73..f22c2fed1 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -32,8 +32,8 @@ import ( "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" - "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" "os" "path/filepath" "sort" diff --git a/go.mod b/go.mod index 55df6c49b..ae06077db 100644 --- a/go.mod +++ b/go.mod @@ -28,6 +28,7 @@ require ( github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell v1.3.0 github.com/gliderlabs/ssh v0.3.0 // indirect + github.com/go-git/go-git/v5 v5.1.0 github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect @@ -103,7 +104,6 @@ require ( google.golang.org/grpc v1.28.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect - gopkg.in/src-d/go-git.v4 v4.13.1 gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index 898c6f925..eca10ec61 100644 --- a/go.sum +++ b/go.sum @@ -60,7 +60,9 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= +github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca h1:QHbltbNkVcw97h4zA/L8gA4o3dJiFvBZ0gyZHrYXHbs= github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= +github.com/antonmedv/expr v1.4.5 h1:yYjQAps1CZTBJBKntVnSEWYp15ML9IWnlrKuFHQ6/HY= github.com/antonmedv/expr v1.4.5/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= github.com/antonmedv/expr v1.5.0/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= github.com/antonmedv/expr v1.5.1/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= @@ -168,6 +170,15 @@ github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= +github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= +github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= +github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= +github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -646,6 +657,7 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= From da3745fd4e3b0ab0e48dd25fc8ea8d3577c2fab5 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Jun 2020 09:57:47 +0300 Subject: [PATCH 0281/2352] [common] Update go-git dependency --- common/product/constants.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/product/constants.go b/common/product/constants.go index d75282e4a..0bbd29f2b 100644 --- a/common/product/constants.go +++ b/common/product/constants.go @@ -30,8 +30,8 @@ import ( "path/filepath" "strings" - "gopkg.in/src-d/go-git.v4" - "gopkg.in/src-d/go-git.v4/plumbing" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" ) func getExecutableDir() string { From d436032449b3f8a7421998e6c05a5c7483124848 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 24 Jun 2020 13:35:35 +0200 Subject: [PATCH 0282/2352] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 881ac41ec..46933c4d6 100644 --- a/README.md +++ b/README.md @@ -28,7 +28,7 @@ What is your use case? * My software is a command line utility with no state machine - :palm_tree: Nothing to do, AliECS natively supports generic commands. + :palm_tree: Nothing to do, AliECS natively supports generic commands. Make sure the task template for your command sets the control mode to `basic` ([see example](https://github.com/AliceO2Group/ControlWorkflows/blob/basic-tasks/tasks/sleep.yaml)). * I want to build and run AliECS for **development** purposes From 3348e5d7990398a884df7c3f1b60cc905d73bd77 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Jun 2020 15:30:03 +0200 Subject: [PATCH 0283/2352] [build] Bump gRPC dependency --- go.mod | 4 ++-- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ae06077db..4d545dea1 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.3 // Issue: https://github.com/etcd-io/etcd/issues/11563 replace ( github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 - google.golang.org/grpc => google.golang.org/grpc v1.26.0 + google.golang.org/grpc => google.golang.org/grpc v1.30.0 ) // Issue: https://github.com/rivo/tview/issues/416 @@ -101,7 +101,7 @@ require ( golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 // indirect google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 // indirect - google.golang.org/grpc v1.28.0 + google.golang.org/grpc v1.30.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 diff --git a/go.sum b/go.sum index eca10ec61..34e46aa01 100644 --- a/go.sum +++ b/go.sum @@ -120,6 +120,7 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= @@ -149,6 +150,7 @@ github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25Kn github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= @@ -894,6 +896,8 @@ google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 h1:XRuIAeTRoXziYGY google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 67558b68b813f11280f669280937ea31f95b02c5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 29 Jun 2020 16:55:36 +0200 Subject: [PATCH 0284/2352] [build] Bump to v0.14.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c8c7a90e7..c0e5b8f61 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 3 +VERSION_PATCH := 4 From ae163b4fd783385b02402fc91e0ea55e04913433 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 29 Jun 2020 19:21:58 +0200 Subject: [PATCH 0285/2352] [coconut] Regenerate coconut documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 2 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_history.md | 2 +- coconut/doc/coconut_configuration_import.md | 5 ++- coconut/doc/coconut_configuration_list.md | 4 +- coconut/doc/coconut_configuration_show.md | 2 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 7 ++-- coconut/doc/coconut_environment_destroy.md | 8 ++-- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 11 +++--- coconut/doc/coconut_repository_add.md | 12 ++++-- .../coconut_repository_default-revision.md | 39 +++++++++++++++++++ coconut/doc/coconut_repository_default.md | 5 +-- coconut/doc/coconut_repository_list.md | 5 +-- coconut/doc/coconut_repository_refresh.md | 5 +-- coconut/doc/coconut_repository_remove.md | 5 +-- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 2 +- 29 files changed, 95 insertions(+), 47 deletions(-) create mode 100644 coconut/doc/coconut_repository_default-revision.md diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index a87ca7296..5a37588ab 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -30,4 +30,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 602bb73b5..9b36c2a0b 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -29,4 +29,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index bdae78ca5..75f4e674f 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -31,4 +31,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index bebb925f8..5603eb40c 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -32,4 +32,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index 77b641804..08c423f6f 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -39,4 +39,4 @@ coconut conf history / * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index 5ee124f35..79d5c1237 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -21,6 +21,8 @@ coconut conf import / coconut conf import --new-component coconut conf import / --format=json coconut conf import .json +coconut conf import --no-versioning +coconut conf import --no-versioning --new-component ``` @@ -30,6 +32,7 @@ coconut conf import .json -f, --format string force a specific configuration file type, overriding any file extension -h, --help help for import -n, --new-component create a new configuration component while importing entry + --no-versioning create an unversioned configuration entry (no timestamps are stored) ``` ### Options inherited from parent commands @@ -45,4 +48,4 @@ coconut conf import .json * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index d133648b5..0e28babb0 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -16,7 +16,7 @@ coconut configuration list [component] [flags] ``` coconut conf list coconut conf list -coconut conf list -t +coconut conf list -t ``` ### Options @@ -40,4 +40,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index b77e13fd6..9e25a22f9 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -42,4 +42,4 @@ coconut conf show /@ * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 890d019d3..2d7dd47d9 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -51,4 +51,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 7b9e2b5d8..1fc750dcb 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -39,4 +39,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index f5236b262..b2d8f9cb5 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -27,8 +27,9 @@ coconut environment create [flags] ### Options ``` - -h, --help help for create - -w, --workflow-template string workflow to be loaded in the new environment + -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` + -h, --help help for create + -w, --workflow-template string workflow to be loaded in the new environment ``` ### Options inherited from parent commands @@ -44,4 +45,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 792bdd9e0..237a37967 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -17,8 +17,10 @@ coconut environment destroy [environment id] [flags] ### Options ``` - -h, --help help for destroy - -k, --keep-tasks keep tasks active after destroying the environment + -a, --allow-in-running-state allows destroying an environment while in Running state + -f, --force force destroy of an environment + -h, --help help for destroy + -k, --keep-tasks keep tasks active after destroying the environment ``` ### Options inherited from parent commands @@ -34,4 +36,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 1da67ad03..3f63c3c7b 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -30,4 +30,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 155584a2b..5356278ff 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -32,4 +32,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index f71cdb333..8c6b2407b 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -30,4 +30,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 0e5348c98..b72a45d02 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -17,16 +17,16 @@ gitlab.cern.ch/tmrnjava/AliECS_conf/ By default, all short task and workflow names are assumed to be in the default repository (see `coconut repo list` command). -Any workflow from any repository can be loaded by providing a full and unique path (the `workflows` directory is omitted from the loading path as it's name and existence is enforced by convention when we know we're dealing with workflows), e.g. the following two are different workflows: +Any workflow from any repository can be loaded by providing a full and unique path, e.g. the following two are different workflows: ``` -github.com/AliceO2Group/ControlWorkflows/readout-qc-1 -gitlab.cern.ch/tmrnjava/AliECS_conf/readout-qc-1 +github.com/AliceO2Group/ControlWorkflows/workflows/readout-qc-1 +gitlab.cern.ch/tmrnjava/AliECS_conf/workflows/readout-qc-1 ``` By default a workflow is loaded from its state at HEAD in the master branch. A request to load a workflow can further be qualified with a branch, tag or commit hash: ``` readout-qc-1@readout-testing -gitlab.cern.ch/tmrnjava/AliECS_conf/readout-qc-1@5c7f1c1f +gitlab.cern.ch/tmrnjava/AliECS_conf/workflows/readout-qc-1@5c7f1c1f ``` Make sure to run `coconut repo refresh` if you make changes to a configuration repository. @@ -51,8 +51,9 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut repository add](coconut_repository_add.md) - add a new git repository * [coconut repository default](coconut_repository_default.md) - set a git repository as default +* [coconut repository default-revision](coconut_repository_default-revision.md) - set default global and per-repository revision * [coconut repository list](coconut_repository_list.md) - list git repositories * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index d2505ad1a..4fc8df26f 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -4,13 +4,19 @@ add a new git repository ### Synopsis -The repository add command adds a git repository -to the catalogue of repositories used for task and workflow configuration. +The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration. +The `https://` prefix and `.git` suffix should always be omitted. ``` coconut repository add [flags] ``` +### Examples + +``` +coconut repo add github.com/AliceO2Group/ControlWorkflows +``` + ### Options ``` @@ -30,4 +36,4 @@ coconut repository add [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md new file mode 100644 index 000000000..ee697c4a9 --- /dev/null +++ b/coconut/doc/coconut_repository_default-revision.md @@ -0,0 +1,39 @@ +## coconut repository default-revision + +set default global and per-repository revision + +### Synopsis + +The repository default-revision command sets the global default repository revision. + +To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by `coconut repo list`. + +Examples: +* `coconut repo default-revision basic-tasks` Sets `basic-tasks`as the global default-revision +* `coconut repo default-revision 0 master` Sets `master`as the default-revision for repo with index 0 +* `coconut repo default-revision 2 vs-sftb Sets `vs-sftb`as the default-revision for repo with index 2 + +``` +coconut repository default-revision [flags] +``` + +### Options + +``` + -h, --help help for default-revision +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + -v, --verbose show verbose output for debug purposes +``` + +### SEE ALSO + +* [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration + +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 95da248df..64b455e7a 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -4,8 +4,7 @@ set a git repository as default ### Synopsis -The repository default command sets a git repository -as the default repository for incoming workflow deployment requests. +The repository default command sets a git repository as the default repository for incoming workflow deployment requests. ``` coconut repository default [flags] @@ -30,4 +29,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 8638821d3..454ff8ec4 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -4,8 +4,7 @@ list git repositories ### Synopsis -The repostory list command lists available git repositories -to be used for task and workflow configuration. +The repostory list command lists available git repositories to be used for task and workflow configuration. ``` coconut repository list [flags] @@ -30,4 +29,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 2853267b2..31cf5901c 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -4,8 +4,7 @@ refresh git repositories ### Synopsis -The repository refresh command makes sure -all git repositories used for task and workflow configuration are up to date. +The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date. ``` coconut repository refresh [flags] @@ -30,4 +29,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index b3bb9b639..2b292dadb 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -4,8 +4,7 @@ remove a git repository ### Synopsis -The repository remove command removes a git repository -from the catalogue of workflow configuration sources. +The repository remove command removes a git repository from the catalogue of workflow configuration sources. ``` coconut repository remove [flags] @@ -30,4 +29,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 5aa350d94..10890a11a 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -27,4 +27,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index a6b5755fe..ed0c0bd41 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -29,4 +29,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 590f7b885..5e70b6166 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -28,4 +28,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index ce78b6ca4..1d1024226 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -31,4 +31,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 0015c1791..586920294 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -30,4 +30,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 3dd0766e3..967d43b61 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -27,4 +27,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 3ae9a2b02..2383477ec 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -52,4 +52,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 20-Jan-2020 +###### Auto generated by spf13/cobra on 29-Jun-2020 From 5482ac6accd468e68e8f6e7eb49bb7b67e0926a6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jul 2020 14:47:03 +0200 Subject: [PATCH 0286/2352] [core] Add ptree marker to properties map with ToPtree function --- core/task/task.go | 26 +++++++++++++++++++++++--- core/workflow/template/stack.go | 14 ++++++++++++++ 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 4864e0cc7..ed6996c4d 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -31,6 +31,7 @@ package task import ( "errors" + "strings" texttemplate "text/template" "github.com/AliceO2Group/Control/common" @@ -344,13 +345,14 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand varStack[k] = v } - objStack := make(map[string]interface{}) - objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) - for k, v := range t.GetProperties() { propMap[k] = v } + objStack := make(map[string]interface{}) + objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) + objStack["ToPtree"] = template.MakeToPtreeFunc(varStack, propMap) + fields := template.WrapMapItems(propMap) err = fields.Execute(t.name, varStack, objStack, make(map[string]texttemplate.Template)) @@ -358,6 +360,24 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand log.WithError(err).Error("cannot resolve templates for property map") return } + + // Post-processing for the ToPtree mechanism. + // The ToPtree function has no access to the keys of propMap, so we need + // to do a second pass here. + // For each run of ToPtree, a temporary __ptree__: key is created + // and the value of the key that pointed to ToPtree is set to this key. + // We need to clear both of these keys, and create a new one __ptree__: + // with the plain payload. + keysToDelete := make([]string, 0) + for k, v := range propMap { + if strings.HasPrefix(v, "__ptree__:") { + keysToDelete = append(keysToDelete, k, v) + propMap["__ptree__:" + k] = propMap[v] + } + } + for _, k := range keysToDelete { + delete(propMap, k) + } } // For FAIRMQ tasks, we append FairMQ channel configuration diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 2cc7531d4..4b3a81de7 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -32,10 +32,12 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/core/the" + "github.com/rs/xid" "github.com/sirupsen/logrus" ) type GetConfigFunc func(string) string +type ToPtreeFunc func(string) string func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { return func(path string) string { @@ -53,6 +55,18 @@ func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { } } +func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { + return func(payload string) string { + // This function is a no-op with respect to the payload, but it stores the payload + // under a new key which the OCC plugin then processes into a ptree. + // The payload in the current key is overwritten. + + ptreeId := fmt.Sprintf("__ptree__:%s", xid.New().String()) + propMap[ptreeId] = payload + return ptreeId + } +} + func MakeStrOperationFuncMap() map[string]interface{} { return map[string]interface{}{ "Atoi": func(in string) (out int) { From f2abe93c9638431b5cc7d39fe109e452ff1895d3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jul 2020 16:27:58 +0200 Subject: [PATCH 0287/2352] [core] Add support for syntax spec in ToPtree template function --- core/task/task.go | 13 +++++++++---- core/workflow/template/stack.go | 21 +++++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index ed6996c4d..59dd1fc3b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -31,6 +31,7 @@ package task import ( "errors" + "fmt" "strings" texttemplate "text/template" @@ -364,15 +365,19 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // Post-processing for the ToPtree mechanism. // The ToPtree function has no access to the keys of propMap, so we need // to do a second pass here. - // For each run of ToPtree, a temporary __ptree__: key is created + // For each run of ToPtree, a temporary __ptree__:: key is created // and the value of the key that pointed to ToPtree is set to this key. - // We need to clear both of these keys, and create a new one __ptree__: - // with the plain payload. + // We need to clear both of these keys, and create a new one like + // __ptree__:: with the plain payload. keysToDelete := make([]string, 0) for k, v := range propMap { + if strings.HasPrefix(v, "__ptree__:") { keysToDelete = append(keysToDelete, k, v) - propMap["__ptree__:" + k] = propMap[v] + splitValue := strings.Split(v, ":") + syntax := splitValue[1] + + propMap[fmt.Sprintf("__ptree__:%s:%s", syntax, k)] = propMap[v] } } for _, k := range keysToDelete { diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 4b3a81de7..59c024feb 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -26,18 +26,20 @@ package template import ( "encoding/json" + "errors" "fmt" "strconv" "strings" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/the" "github.com/rs/xid" "github.com/sirupsen/logrus" ) type GetConfigFunc func(string) string -type ToPtreeFunc func(string) string +type ToPtreeFunc func(string, string) string func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { return func(path string) string { @@ -56,13 +58,24 @@ func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { } func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { - return func(payload string) string { + return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload // under a new key which the OCC plugin then processes into a ptree. // The payload in the current key is overwritten. + localPayload := payload + syntaxLC := strings.ToLower(strings.TrimSpace(syntax)) - ptreeId := fmt.Sprintf("__ptree__:%s", xid.New().String()) - propMap[ptreeId] = payload + if !utils.StringSliceContains([]string{"ini", "json", "xml"}, syntaxLC) { + err := errors.New("bad ToPtree syntax argument, allowed values: ini, json, xml") + log.WithError(err). + WithField("syntax", syntax). + Warn("failed to generate ptree descriptor") + localPayload = fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + syntaxLC = "json" + } + + ptreeId := fmt.Sprintf("__ptree__:%s:%s", syntaxLC, xid.New().String()) + propMap[ptreeId] = localPayload return ptreeId } } From 80c020924b9503406a6166ac741beb5350d9cddb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jul 2020 17:25:14 +0200 Subject: [PATCH 0288/2352] [occ] Process incoming __ptree__ key as ptree --- occ/occlib/OccServer.cxx | 17 ++++++++- occ/plugin/OccFMQCommon.cxx | 12 +++++- occ/util/Common.h | 73 +++++++++++++++++++++++++++++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) create mode 100644 occ/util/Common.h diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 65a9d4fca..fa79064b2 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -26,10 +26,12 @@ #include "OccServer.h" +#include "util/Defer.h" +#include "util/Common.h" + #include #include -#include "util/Defer.h" #include #include #include @@ -184,7 +186,18 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, boost::property_tree::ptree properties; for (auto item : arguments) { - properties.put(item.key(), item.value()); + if (boost::starts_with(item.key(), "__ptree__:")) { + // we need to ptreefy whatever payload we got under this kind of key, on a best-effort basis + auto [newKey, newValue] = propMapEntryToPtree(item.key(), item.value()); + if (newKey == item.key()) { // Means something went wrong and the called function already printed out the message + continue; + } + + properties.put(newKey, newValue); + } + else { + properties.put(item.key(), item.value()); + } } t_State newState = processStateTransition(event, properties); diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 3138a1757..77db7df39 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -24,6 +24,7 @@ #include "OccFMQCommon.h" +#include "util/Common.h" #include "util/Defer.h" #include @@ -103,7 +104,16 @@ std::tuple doTransition(fair: m_pluginServices->SetProperty(key, value); } } - else { + else if (boost::starts_with(key, "__ptree__:")) { + // we need to ptreefy whatever payload we got under this kind of key, on a best-effort basis + auto [newKey, newValue] = propMapEntryToPtree(key, value); + if (newKey == key) { // Means something went wrong and the called function already printed out the message + continue; + } + + m_pluginServices->SetProperty(newKey, newValue); + } + else { // default case, 1 k-v ==> 1 SetProperty m_pluginServices->SetProperty(key, value); } } diff --git a/occ/util/Common.h b/occ/util/Common.h new file mode 100644 index 000000000..705ea8fda --- /dev/null +++ b/occ/util/Common.h @@ -0,0 +1,73 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +#ifndef OCC_COMMON_H +#define OCC_COMMON_H + +#include +#include + +#include +#include +#include +#include + +std::tuple propMapEntryToPtree(std::string key, std::string value) { + // If the returned key equals the input key, something went wrong + + std::vector split; + boost::split(split, key, std::bind(std::equal_to<>(), ':', std::placeholders::_1)); + if (split.size() != 3) { + OLOG(WARN) << "error processing ptree declaration for configuration payload: " << key; + return std::make_tuple(key, boost::property_tree::ptree()); + } + + auto syntax = split[1]; + auto newKey = split[2]; + boost::property_tree::ptree ptree; + + try { + if (syntax == "ini") { + boost::property_tree::read_ini(value, ptree); + } + else if (syntax == "json") { + boost::property_tree::read_json(value, ptree); + } + else if (syntax == "xml") { + boost::property_tree::read_xml(value, ptree); + } + else { + OLOG(WARN) << "error processing syntax declaration for configuration payload: " << key; + return std::make_tuple(key, boost::property_tree::ptree()); + } + } + catch (std::exception &e) { + OLOG(WARN) << "error loading configuration payload into ptree for key: " << key << " error: " << e.what(); + return std::make_tuple(key, boost::property_tree::ptree()); + } + + return std::make_tuple(newKey, ptree); +} + +#endif //OCC_COMMON_H From 16bebc666d359589b51f3b456e79a15c1f5e46f5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jul 2020 16:38:03 +0200 Subject: [PATCH 0289/2352] [core] Add support for timestamp-less payloads in confsys --- configuration/componentcfg/componentcfg.go | 3 +++ core/confsys/service.go | 10 +++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index fa03de621..69be78fc5 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -77,6 +77,9 @@ func GetLatestTimestamp(keys []string, component string, entry string)(timestamp } } } + if maxTimeStamp == 0 { + return "", nil + } return strconv.FormatUint(maxTimeStamp, 10), nil } diff --git a/core/confsys/service.go b/core/confsys/service.go index ef895cc26..f76f0c7ff 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -321,7 +321,15 @@ func (s *Service) GetComponentConfiguration(path string) (payload string, err er } } key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp - payload, err = s.src.Get(key) + if exists, _ := s.src.Exists(key); exists && len(timestamp) > 0 { + payload, err = s.src.Get(key) + log.WithFields(logrus.Fields{"key": key, "value": payload}).Trace("getting key") + } else { + // falling back to timestampless configuration + key = componentcfg.ConfigComponentsPath + component + "/" + entry + payload, err = s.src.Get(key) + log.WithFields(logrus.Fields{"key": key, "value": payload}).Trace("getting key") + } return } From 7f4a3289f538f7291087369454b74e129de646bb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jul 2020 10:27:41 +0200 Subject: [PATCH 0290/2352] [occ] Correctly graft payload ptree --- occ/occlib/OccServer.cxx | 2 +- occ/util/Common.h | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index fa79064b2..56611ba93 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -193,7 +193,7 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, continue; } - properties.put(newKey, newValue); + properties.put_child(newKey, newValue); } else { properties.put(item.key(), item.value()); diff --git a/occ/util/Common.h b/occ/util/Common.h index 705ea8fda..957dbfd70 100644 --- a/occ/util/Common.h +++ b/occ/util/Common.h @@ -27,43 +27,45 @@ #include #include +#include #include #include #include #include -std::tuple propMapEntryToPtree(std::string key, std::string value) { +std::tuple propMapEntryToPtree(const std::string& key, const std::string& value) { // If the returned key equals the input key, something went wrong std::vector split; boost::split(split, key, std::bind(std::equal_to<>(), ':', std::placeholders::_1)); if (split.size() != 3) { - OLOG(WARN) << "error processing ptree declaration for configuration payload: " << key; + std::cout << "error processing ptree declaration for configuration payload: " << key; return std::make_tuple(key, boost::property_tree::ptree()); } auto syntax = split[1]; auto newKey = split[2]; boost::property_tree::ptree ptree; + auto stream = std::stringstream(value); try { if (syntax == "ini") { - boost::property_tree::read_ini(value, ptree); + boost::property_tree::read_ini(stream, ptree); } else if (syntax == "json") { - boost::property_tree::read_json(value, ptree); + boost::property_tree::read_json(stream, ptree); } else if (syntax == "xml") { - boost::property_tree::read_xml(value, ptree); + boost::property_tree::read_xml(stream, ptree); } else { - OLOG(WARN) << "error processing syntax declaration for configuration payload: " << key; + std::cout << "error processing syntax declaration for configuration payload: " << key; return std::make_tuple(key, boost::property_tree::ptree()); } } catch (std::exception &e) { - OLOG(WARN) << "error loading configuration payload into ptree for key: " << key << " error: " << e.what(); + std::cout << "error loading configuration payload into ptree for key: " << key << " error: " << e.what(); return std::make_tuple(key, boost::property_tree::ptree()); } From c1625bacb71848432c0e0b39900463c218569006 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jul 2020 14:39:50 +0200 Subject: [PATCH 0291/2352] [core] Set periodic output severity to Trace OCTRL-283 #close --- core/scheduler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 442b3fbf8..286249c28 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -428,7 +428,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl log.WithPrefix("scheduler").WithFields(logrus.Fields{ "offerIds": strings.Join(offerIds, ", "), //"offers": strings.Join(prettyOffers, "\n"), - }).Debug("received offers") + }).Trace("received offers") } var descriptorsToDeploy task.Descriptors @@ -811,7 +811,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } if tasksLaunchedThisCycle == 0 { if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler").Debug("offers cycle complete, no tasks launched") + log.WithPrefix("scheduler").Trace("offers cycle complete, no tasks launched") } } else { log.WithPrefix("scheduler").WithField("tasks", tasksLaunchedThisCycle).Debug("offers cycle complete, tasks launched") From 31eb7f37a28137210793c0bdc7c07b7a8d53c8c8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 14 Jul 2020 12:52:06 +0300 Subject: [PATCH 0292/2352] [executor] Do a SIGTERM before the SIGKILL --- executor/executable/controllabletask.go | 31 +++++++++++++++++++------ 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 64b08a81a..4df3375b8 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -434,15 +434,32 @@ func (t *ControllableTask) Kill() error { t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } - // TODO: do a SIGTERM before the SIGKILL - + killErrCh := make(chan error) + var killErr error // When killing we must always use syscall.Kill with a negative PID, in order to kill all // children which were assigned the same PGID at launch - killErr := syscall.Kill(-pid, syscall.SIGKILL) - if killErr != nil { - log.WithError(killErr). - WithField("taskId", t.ti.GetTaskID()). - Warning("could not kill task") + go func() { + killErr = syscall.Kill(-pid, syscall.SIGTERM) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") + return + } + killErrCh <- killErr + }() + + // Set a small timeout to SIGTERM if SIGTERM fails or timeout passes, + // we perform a SIGKILL. + select { + case killErr = <- killErrCh: + case <-time.After(10 * time.Second): + killErr = syscall.Kill(-pid, syscall.SIGKILL) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") + } } return killErr From c15c5de049940c5e184e14ca993921c91380aa26 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 14 Jul 2020 13:09:41 +0300 Subject: [PATCH 0293/2352] [executor] Handle Kill concurrently --- executor/handlers.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/executor/handlers.go b/executor/handlers.go index 371161ecf..a3c168538 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -213,11 +213,12 @@ func handleKillEvent(state *internalState, e *executor.Event_Kill) error { if !ok { return errors.New("invalid task ID") } - - _ = activeTask.Kill() - - activeTask = nil delete(state.activeTasks, e.GetTaskID()) + go func() { + _ = activeTask.Kill() + activeTask = nil + }() + return nil } From 09c3e87266faf6b8025765e66d6217ef4d51abf1 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 15 Jul 2020 14:03:57 +0300 Subject: [PATCH 0294/2352] [executor] Run SIGKILL immediately after a failed SIGTERM --- executor/executable/controllabletask.go | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 4df3375b8..ba31c8d2c 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -435,31 +435,34 @@ func (t *ControllableTask) Kill() error { } killErrCh := make(chan error) - var killErr error // When killing we must always use syscall.Kill with a negative PID, in order to kill all // children which were assigned the same PGID at launch go func() { - killErr = syscall.Kill(-pid, syscall.SIGTERM) - if killErr != nil { - log.WithError(killErr). + err := syscall.Kill(-pid, syscall.SIGTERM) + if err != nil { + log.WithError(err). WithField("taskId", t.ti.GetTaskID()). - Warning("could not kill task") - return + Warning("could not gracefully kill task") } - killErrCh <- killErr + killErrCh <- err }() - + + // Set a small timeout to SIGTERM if SIGTERM fails or timeout passes, // we perform a SIGKILL. select { - case killErr = <- killErrCh: - case <-time.After(10 * time.Second): - killErr = syscall.Kill(-pid, syscall.SIGKILL) - if killErr != nil { - log.WithError(killErr). - WithField("taskId", t.ti.GetTaskID()). - Warning("could not kill task") + case killErr := <- killErrCh: + if killErr == nil { + return killErr } + case <-time.After(10 * time.Second): + } + + killErr := syscall.Kill(-pid, syscall.SIGKILL) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") } return killErr From 687dd1ebc6f079f752cdc828b6c35bcae41cf5c4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 15 Jul 2020 14:05:33 +0300 Subject: [PATCH 0295/2352] [executor] Fix SIGSEV --- executor/executable/controllabletask.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index ba31c8d2c..0ca49ba38 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -407,6 +407,9 @@ func (t *ControllableTask) Kill() error { case commitResponse = <- commitDone: case <-time.After(15 * time.Second): log.Error("deadline exceeded") + } + // timeout we should break + if commitResponse == nil { break } From 300d8450761dee4fcbf3598dda47e2d2810320bb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 17 Jul 2020 10:06:37 +0200 Subject: [PATCH 0296/2352] Remove obsolete wording --- coconut/README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/coconut/README.md b/coconut/README.md index f5a6ddb43..b00f05628 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -167,11 +167,3 @@ transition complete environment id: 8132d249-e1b4-11e8-9f09-a08cfdc880fc state: CONFIGURED ``` - -As of 11/2018 InfoLogger integration is work in progress, so the best way to check what's up with a specific -task is with the Mesos GUI. -On the DC/OS Vagrant test cluster, this is accessible at [http://m1.dcos/mesos/](). -Pick the correct task by ID, Name, State, etc. and click on *Sandbox* in the rightmost column, and then open -`stderr`. - -Environment teardown is also work in progress, so in the short term `pkill` will have to do. From cdb9e706ef715a95a78586b9dc54b1d849502775 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Jul 2020 16:43:41 +0200 Subject: [PATCH 0297/2352] [executor] Handle HEARTBEAT event OCTRL-151 #close --- executor/executor.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/executor/executor.go b/executor/executor.go index 3544a4ee3..7aef2ec8f 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -306,8 +306,12 @@ func buildEventHandler(state *internalState) events.Handler { log.WithField("event", e.Type.String()).Trace("handling event") return errMustAbort }, + executor.Event_HEARTBEAT: func(_ context.Context, e *executor.Event) error { + log.WithField("event", e.Type.String()).Trace("heartbeat received from Mesos") + return nil + }, }.Otherwise(func(_ context.Context, e *executor.Event) error { - log.Error("unexpected event", e) + log.Warn("unexpected event received", e) return nil }) } From 4a55833efa697dd62bf18fe2406183d1cd46a9c0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Jun 2020 14:09:27 +0200 Subject: [PATCH 0298/2352] [odcshim] Initial commit for ODC shim task --- Makefile | 6 +- cmd/o2-aliecs-odc-shim/main.go | 39 + odcshim/occserver/occserver.go | 342 +++ odcshim/odcclient/odcclient.go | 71 + odcshim/odcprotos/odc.pb.go | 4163 ++++++++++++++++++++++++++++++++ odcshim/odcprotos/odc.proto | 137 ++ odcshim/odcshim.go | 92 + odcshim/protos/occ.pb.go | 2514 +++++++++++++++++++ 8 files changed, 7363 insertions(+), 1 deletion(-) create mode 100644 cmd/o2-aliecs-odc-shim/main.go create mode 100644 odcshim/occserver/occserver.go create mode 100644 odcshim/odcclient/odcclient.go create mode 100644 odcshim/odcprotos/odc.pb.go create mode 100644 odcshim/odcprotos/odc.proto create mode 100644 odcshim/odcshim.go create mode 100644 odcshim/protos/occ.pb.go diff --git a/Makefile b/Makefile index 37cee4ca5..86249332a 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ CGO_LDFLAGS=CGO_LDFLAGS="$(ROOT_DIR)/vendor/infoLoggerForGo/infoLoggerForGo.a -s BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) endif REPOPATH = github.com/AliceO2Group/Control +ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto/odc.proto" VERBOSE_1 := -v VERBOSE_2 := -v -x @@ -50,7 +51,7 @@ WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./core ./executor ./coconut/cmd +GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut # Use linker flags to provide version/build settings to the target @@ -125,6 +126,9 @@ vendor: @echo -e "\e[1;33mgo mod vendor\e[0m" @go mod vendor + @echo -e "\e[1;33mcurl odc.proto\e[0m" + @mkdir -p odcshim/odcprotos + @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto # vendor: tools/dep # @echo -e "\e[1;33mdep ensure\e[0m" # @./tools/dep ensure diff --git a/cmd/o2-aliecs-odc-shim/main.go b/cmd/o2-aliecs-odc-shim/main.go new file mode 100644 index 000000000..73ef02578 --- /dev/null +++ b/cmd/o2-aliecs-odc-shim/main.go @@ -0,0 +1,39 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +import ( + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/odcshim" + "github.com/sirupsen/logrus" +) + +var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") + +func main() { + if err := odcshim.Run(); err != nil { + log.Fatal(err) + } +} diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go new file mode 100644 index 000000000..8f0fc1a5d --- /dev/null +++ b/odcshim/occserver/occserver.go @@ -0,0 +1,342 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package occserver + +import ( + "errors" + "fmt" + "runtime" + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/odcshim/odcclient" + odc "github.com/AliceO2Group/Control/odcshim/odcprotos" + pb "github.com/AliceO2Group/Control/odcshim/protos" + "github.com/k0kubun/pp" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "golang.org/x/net/context" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/reflection" + "google.golang.org/grpc/status" +) + +var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") + +const CALL_TIMEOUT = 60*time.Second + +type OccServerImpl struct { + odcHost string + odcPort int + odcClient *odcclient.RpcClient +} + +func (s *OccServerImpl) ensureClientConnected() error { + // create the clientconn + // instantiate the odcClient and Initialize + // report error or nil + endpoint := fmt.Sprintf("%s:%d", s.odcHost, s.odcPort) + + cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) + + s.odcClient = odcclient.NewClient(cxt, cancel, endpoint) + if s.odcClient == nil { + return fmt.Errorf("cannot dial ODC endpoint: %s", endpoint) + } + return nil +} + +func NewServer(host string, port int) *grpc.Server { + grpcServer := grpc.NewServer() + srvImpl := &OccServerImpl{ + odcHost: host, + odcPort: port, + } + pb.RegisterOccServer(grpcServer, srvImpl) + // Register reflection service on gRPC server. + reflection.Register(grpcServer) + + return grpcServer +} + +func (s *OccServerImpl) logMethod() { + if !viper.GetBool("verbose") { + return + } + pc, _, _, ok := runtime.Caller(1) + if !ok { + return + } + fun := runtime.FuncForPC(pc) + if fun == nil { + return + } + log.WithField("method", fun.Name()). + Debug("handling RPC request") +} + +func (*OccServerImpl) EventStream(req *pb.EventStreamRequest, srv pb.Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*OccServerImpl) StateStream(req *pb.StateStreamRequest, srv pb.Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) (*pb.GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionRequest) (*pb.TransitionReply, error) { + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") + } + switch event := req.TransitionEvent; event { + case "CONFIGURE": + if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { + err := s.ensureClientConnected() + if err != nil { + log.WithError(err). + WithFields(logrus.Fields{ + "host": s.odcHost, + "port": s.odcPort, + }). + Error("cannot connect to ODC endpoint") + return nil, err + } + } + + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Configure + var envId string + var topology string + configureMap := make(map[string]string) + for _, entry := range req.Arguments { + if entry.Key == "environment_id" { + envId = entry.Value + } else if entry.Key == "topology" { + topology = entry.Value + } else { + configureMap[entry.Key] = entry.Value + } + + } + + // Provisional response + rep := &pb.TransitionReply{ + Trigger: pb.StateChangeTrigger_EXECUTOR, + State: req.SrcState, + TransitionEvent: req.TransitionEvent, + Ok: false, + } + + // INITIALIZE + initializeRequest := &odc.InitializeRequest{ + Runid: 0, //FIXME: not available at this time + Sessionid: envId, + } + + initializeResponse, err := s.odcClient.Initialize(ctx, initializeRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + status, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": status.Code().String(), + "message": status.Message(), + "details": status.Details(), + "error": status.Err().Error(), + "ppStatus": pp.Sprint(status), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return nil, err + } + + if initializeResponse != nil { + if odcErr := initializeResponse.GetError(); odcErr != nil { + return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := initializeResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": initializeResponse.Msg, + "odcStatus": initializeResponse.Status.String(), + "odcExectime": initializeResponse.Exectime, + "odcRunid": initializeResponse.Runid, + "odcSessionid": initializeResponse.Sessionid, + }). + Debug("call to ODC complete") + } + + // SUBMIT + submitRequest := &odc.SubmitRequest{} + + submitResponse, err := s.odcClient.Submit(ctx, submitRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + status, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": status.Code().String(), + "message": status.Message(), + "details": status.Details(), + "error": status.Err().Error(), + "ppStatus": pp.Sprint(status), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return nil, err + } + + if submitResponse != nil { + if odcErr := submitResponse.GetError(); odcErr != nil { + return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := submitResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": submitResponse.Msg, + "odcStatus": submitResponse.Status.String(), + "odcExectime": submitResponse.Exectime, + "odcRunid": submitResponse.Runid, + "odcSessionid": submitResponse.Sessionid, + }). + Debug("call to ODC complete") + } + + // ACTIVATE + activateRequest := &odc.ActivateRequest{ + Topology: topology, + } + + activateResponse, err := s.odcClient.Activate(ctx, activateRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + status, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": status.Code().String(), + "message": status.Message(), + "details": status.Details(), + "error": status.Err().Error(), + "ppStatus": pp.Sprint(status), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return nil, err + } + + if activateResponse != nil { + if odcErr := activateResponse.GetError(); odcErr != nil { + return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := activateResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": activateResponse.Msg, + "odcStatus": activateResponse.Status.String(), + "odcExectime": activateResponse.Exectime, + "odcRunid": activateResponse.Runid, + "odcSessionid": activateResponse.Sessionid, + }). + Debug("call to ODC complete") + } + + // FIXME: implement SetProperty calls before Configure + + // CONFIGURE + configureRequest := &odc.ConfigureRequest{ + Request: &odc.StateChangeRequest{ + Path: "", + Detailed: false, + }, + } + + configureResponse, err := s.odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + status, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": status.Code().String(), + "message": status.Message(), + "details": status.Details(), + "error": status.Err().Error(), + "ppStatus": pp.Sprint(status), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return nil, err + } + + if configureResponse != nil && configureResponse.Reply != nil { + if odcErr := configureResponse.Reply.GetError(); odcErr != nil { + return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := configureResponse.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "odcRunid": configureResponse.Reply.Runid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). + Debug("call to ODC complete") + } + + + + } + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} diff --git a/odcshim/odcclient/odcclient.go b/odcshim/odcclient/odcclient.go new file mode 100644 index 000000000..b09c50646 --- /dev/null +++ b/odcshim/odcclient/odcclient.go @@ -0,0 +1,71 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package odcclient + +import ( + "context" + + "github.com/AliceO2Group/Control/common/logger" + odc "github.com/AliceO2Group/Control/odcshim/odcprotos" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") + +type RpcClient struct { + odc.ODCClient + conn *grpc.ClientConn +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + client := &RpcClient { + ODCClient: odc.NewODCClient(conn), + conn: conn, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + return m.conn.Close() +} \ No newline at end of file diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go new file mode 100644 index 000000000..3c23a590a --- /dev/null +++ b/odcshim/odcprotos/odc.pb.go @@ -0,0 +1,4163 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: odcprotos/odc.proto + +package odc + +import ( + context "context" + fmt "fmt" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// 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.ProtoPackageIsVersion3 // please upgrade the proto package + +// Request status +type ReplyStatus int32 + +const ( + ReplyStatus_UNKNOWN ReplyStatus = 0 + ReplyStatus_SUCCESS ReplyStatus = 1 + ReplyStatus_ERROR ReplyStatus = 2 +) + +var ReplyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SUCCESS", + 2: "ERROR", +} + +var ReplyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "SUCCESS": 1, + "ERROR": 2, +} + +func (x ReplyStatus) String() string { + return proto.EnumName(ReplyStatus_name, int32(x)) +} + +func (ReplyStatus) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{0} +} + +// General error +type Error struct { + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Error) Reset() { *m = Error{} } +func (m *Error) String() string { return proto.CompactTextString(m) } +func (*Error) ProtoMessage() {} +func (*Error) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{0} +} +func (m *Error) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Error.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Error) XXX_Merge(src proto.Message) { + xxx_messageInfo_Error.Merge(m, src) +} +func (m *Error) XXX_Size() int { + return m.Size() +} +func (m *Error) XXX_DiscardUnknown() { + xxx_messageInfo_Error.DiscardUnknown(m) +} + +var xxx_messageInfo_Error proto.InternalMessageInfo + +func (m *Error) GetMsg() string { + if m != nil { + return m.Msg + } + return "" +} + +func (m *Error) GetCode() int32 { + if m != nil { + return m.Code + } + return 0 +} + +// General reply to requests +type GeneralReply struct { + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` + Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` + Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GeneralReply) Reset() { *m = GeneralReply{} } +func (m *GeneralReply) String() string { return proto.CompactTextString(m) } +func (*GeneralReply) ProtoMessage() {} +func (*GeneralReply) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{1} +} +func (m *GeneralReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GeneralReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GeneralReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GeneralReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GeneralReply.Merge(m, src) +} +func (m *GeneralReply) XXX_Size() int { + return m.Size() +} +func (m *GeneralReply) XXX_DiscardUnknown() { + xxx_messageInfo_GeneralReply.DiscardUnknown(m) +} + +var xxx_messageInfo_GeneralReply proto.InternalMessageInfo + +func (m *GeneralReply) GetMsg() string { + if m != nil { + return m.Msg + } + return "" +} + +func (m *GeneralReply) GetStatus() ReplyStatus { + if m != nil { + return m.Status + } + return ReplyStatus_UNKNOWN +} + +func (m *GeneralReply) GetError() *Error { + if m != nil { + return m.Error + } + return nil +} + +func (m *GeneralReply) GetExectime() int32 { + if m != nil { + return m.Exectime + } + return 0 +} + +func (m *GeneralReply) GetRunid() uint64 { + if m != nil { + return m.Runid + } + return 0 +} + +func (m *GeneralReply) GetSessionid() string { + if m != nil { + return m.Sessionid + } + return "" +} + +// Device path +type Device struct { + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Device) Reset() { *m = Device{} } +func (m *Device) String() string { return proto.CompactTextString(m) } +func (*Device) ProtoMessage() {} +func (*Device) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{2} +} +func (m *Device) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Device.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Device) XXX_Merge(src proto.Message) { + xxx_messageInfo_Device.Merge(m, src) +} +func (m *Device) XXX_Size() int { + return m.Size() +} +func (m *Device) XXX_DiscardUnknown() { + xxx_messageInfo_Device.DiscardUnknown(m) +} + +var xxx_messageInfo_Device proto.InternalMessageInfo + +func (m *Device) GetId() uint64 { + if m != nil { + return m.Id + } + return 0 +} + +func (m *Device) GetState() string { + if m != nil { + return m.State + } + return "" +} + +func (m *Device) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +// State change request +type StateChangeRequest struct { + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + Detailed bool `protobuf:"varint,2,opt,name=detailed,proto3" json:"detailed,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StateChangeRequest) Reset() { *m = StateChangeRequest{} } +func (m *StateChangeRequest) String() string { return proto.CompactTextString(m) } +func (*StateChangeRequest) ProtoMessage() {} +func (*StateChangeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{3} +} +func (m *StateChangeRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StateChangeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StateChangeRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StateChangeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateChangeRequest.Merge(m, src) +} +func (m *StateChangeRequest) XXX_Size() int { + return m.Size() +} +func (m *StateChangeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StateChangeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StateChangeRequest proto.InternalMessageInfo + +func (m *StateChangeRequest) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +func (m *StateChangeRequest) GetDetailed() bool { + if m != nil { + return m.Detailed + } + return false +} + +// State change reply +type StateChangeReply struct { + Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` + Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StateChangeReply) Reset() { *m = StateChangeReply{} } +func (m *StateChangeReply) String() string { return proto.CompactTextString(m) } +func (*StateChangeReply) ProtoMessage() {} +func (*StateChangeReply) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{4} +} +func (m *StateChangeReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StateChangeReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StateChangeReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StateChangeReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateChangeReply.Merge(m, src) +} +func (m *StateChangeReply) XXX_Size() int { + return m.Size() +} +func (m *StateChangeReply) XXX_DiscardUnknown() { + xxx_messageInfo_StateChangeReply.DiscardUnknown(m) +} + +var xxx_messageInfo_StateChangeReply proto.InternalMessageInfo + +func (m *StateChangeReply) GetReply() *GeneralReply { + if m != nil { + return m.Reply + } + return nil +} + +func (m *StateChangeReply) GetDevices() []*Device { + if m != nil { + return m.Devices + } + return nil +} + +// Initialize request +type InitializeRequest struct { + Runid uint64 `protobuf:"varint,1,opt,name=runid,proto3" json:"runid,omitempty"` + Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *InitializeRequest) Reset() { *m = InitializeRequest{} } +func (m *InitializeRequest) String() string { return proto.CompactTextString(m) } +func (*InitializeRequest) ProtoMessage() {} +func (*InitializeRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{5} +} +func (m *InitializeRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *InitializeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_InitializeRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *InitializeRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_InitializeRequest.Merge(m, src) +} +func (m *InitializeRequest) XXX_Size() int { + return m.Size() +} +func (m *InitializeRequest) XXX_DiscardUnknown() { + xxx_messageInfo_InitializeRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_InitializeRequest proto.InternalMessageInfo + +func (m *InitializeRequest) GetRunid() uint64 { + if m != nil { + return m.Runid + } + return 0 +} + +func (m *InitializeRequest) GetSessionid() string { + if m != nil { + return m.Sessionid + } + return "" +} + +// Submit request +type SubmitRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SubmitRequest) Reset() { *m = SubmitRequest{} } +func (m *SubmitRequest) String() string { return proto.CompactTextString(m) } +func (*SubmitRequest) ProtoMessage() {} +func (*SubmitRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{6} +} +func (m *SubmitRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SubmitRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SubmitRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SubmitRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SubmitRequest.Merge(m, src) +} +func (m *SubmitRequest) XXX_Size() int { + return m.Size() +} +func (m *SubmitRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SubmitRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SubmitRequest proto.InternalMessageInfo + +// Activate request +type ActivateRequest struct { + Topology string `protobuf:"bytes,1,opt,name=topology,proto3" json:"topology,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ActivateRequest) Reset() { *m = ActivateRequest{} } +func (m *ActivateRequest) String() string { return proto.CompactTextString(m) } +func (*ActivateRequest) ProtoMessage() {} +func (*ActivateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{7} +} +func (m *ActivateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ActivateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ActivateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ActivateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ActivateRequest.Merge(m, src) +} +func (m *ActivateRequest) XXX_Size() int { + return m.Size() +} +func (m *ActivateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ActivateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ActivateRequest proto.InternalMessageInfo + +func (m *ActivateRequest) GetTopology() string { + if m != nil { + return m.Topology + } + return "" +} + +// Update request +type UpdateRequest struct { + Topology string `protobuf:"bytes,1,opt,name=topology,proto3" json:"topology,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *UpdateRequest) Reset() { *m = UpdateRequest{} } +func (m *UpdateRequest) String() string { return proto.CompactTextString(m) } +func (*UpdateRequest) ProtoMessage() {} +func (*UpdateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{8} +} +func (m *UpdateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *UpdateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_UpdateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *UpdateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_UpdateRequest.Merge(m, src) +} +func (m *UpdateRequest) XXX_Size() int { + return m.Size() +} +func (m *UpdateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_UpdateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_UpdateRequest proto.InternalMessageInfo + +func (m *UpdateRequest) GetTopology() string { + if m != nil { + return m.Topology + } + return "" +} + +// Shutdown request +type ShutdownRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ShutdownRequest) Reset() { *m = ShutdownRequest{} } +func (m *ShutdownRequest) String() string { return proto.CompactTextString(m) } +func (*ShutdownRequest) ProtoMessage() {} +func (*ShutdownRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{9} +} +func (m *ShutdownRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ShutdownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ShutdownRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ShutdownRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ShutdownRequest.Merge(m, src) +} +func (m *ShutdownRequest) XXX_Size() int { + return m.Size() +} +func (m *ShutdownRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ShutdownRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ShutdownRequest proto.InternalMessageInfo + +// Set property request +type SetPropertyRequest struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetPropertyRequest) Reset() { *m = SetPropertyRequest{} } +func (m *SetPropertyRequest) String() string { return proto.CompactTextString(m) } +func (*SetPropertyRequest) ProtoMessage() {} +func (*SetPropertyRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{10} +} +func (m *SetPropertyRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetPropertyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetPropertyRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetPropertyRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetPropertyRequest.Merge(m, src) +} +func (m *SetPropertyRequest) XXX_Size() int { + return m.Size() +} +func (m *SetPropertyRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetPropertyRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetPropertyRequest proto.InternalMessageInfo + +func (m *SetPropertyRequest) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *SetPropertyRequest) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +func (m *SetPropertyRequest) GetPath() string { + if m != nil { + return m.Path + } + return "" +} + +// Configure request +type ConfigureRequest struct { + Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConfigureRequest) Reset() { *m = ConfigureRequest{} } +func (m *ConfigureRequest) String() string { return proto.CompactTextString(m) } +func (*ConfigureRequest) ProtoMessage() {} +func (*ConfigureRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{11} +} +func (m *ConfigureRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConfigureRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConfigureRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ConfigureRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConfigureRequest.Merge(m, src) +} +func (m *ConfigureRequest) XXX_Size() int { + return m.Size() +} +func (m *ConfigureRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ConfigureRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ConfigureRequest proto.InternalMessageInfo + +func (m *ConfigureRequest) GetRequest() *StateChangeRequest { + if m != nil { + return m.Request + } + return nil +} + +// Start request +type StartRequest struct { + Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StartRequest) Reset() { *m = StartRequest{} } +func (m *StartRequest) String() string { return proto.CompactTextString(m) } +func (*StartRequest) ProtoMessage() {} +func (*StartRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{12} +} +func (m *StartRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StartRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StartRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StartRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StartRequest.Merge(m, src) +} +func (m *StartRequest) XXX_Size() int { + return m.Size() +} +func (m *StartRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StartRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StartRequest proto.InternalMessageInfo + +func (m *StartRequest) GetRequest() *StateChangeRequest { + if m != nil { + return m.Request + } + return nil +} + +// Stop request +type StopRequest struct { + Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StopRequest) Reset() { *m = StopRequest{} } +func (m *StopRequest) String() string { return proto.CompactTextString(m) } +func (*StopRequest) ProtoMessage() {} +func (*StopRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{13} +} +func (m *StopRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StopRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StopRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StopRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StopRequest.Merge(m, src) +} +func (m *StopRequest) XXX_Size() int { + return m.Size() +} +func (m *StopRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StopRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StopRequest proto.InternalMessageInfo + +func (m *StopRequest) GetRequest() *StateChangeRequest { + if m != nil { + return m.Request + } + return nil +} + +// Reset request +type ResetRequest struct { + Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ResetRequest) Reset() { *m = ResetRequest{} } +func (m *ResetRequest) String() string { return proto.CompactTextString(m) } +func (*ResetRequest) ProtoMessage() {} +func (*ResetRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{14} +} +func (m *ResetRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ResetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ResetRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ResetRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ResetRequest.Merge(m, src) +} +func (m *ResetRequest) XXX_Size() int { + return m.Size() +} +func (m *ResetRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ResetRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ResetRequest proto.InternalMessageInfo + +func (m *ResetRequest) GetRequest() *StateChangeRequest { + if m != nil { + return m.Request + } + return nil +} + +// Terminate request +type TerminateRequest struct { + Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TerminateRequest) Reset() { *m = TerminateRequest{} } +func (m *TerminateRequest) String() string { return proto.CompactTextString(m) } +func (*TerminateRequest) ProtoMessage() {} +func (*TerminateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{15} +} +func (m *TerminateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TerminateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TerminateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TerminateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TerminateRequest.Merge(m, src) +} +func (m *TerminateRequest) XXX_Size() int { + return m.Size() +} +func (m *TerminateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TerminateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TerminateRequest proto.InternalMessageInfo + +func (m *TerminateRequest) GetRequest() *StateChangeRequest { + if m != nil { + return m.Request + } + return nil +} + +func init() { + proto.RegisterEnum("odc.ReplyStatus", ReplyStatus_name, ReplyStatus_value) + proto.RegisterType((*Error)(nil), "odc.Error") + proto.RegisterType((*GeneralReply)(nil), "odc.GeneralReply") + proto.RegisterType((*Device)(nil), "odc.Device") + proto.RegisterType((*StateChangeRequest)(nil), "odc.StateChangeRequest") + proto.RegisterType((*StateChangeReply)(nil), "odc.StateChangeReply") + proto.RegisterType((*InitializeRequest)(nil), "odc.InitializeRequest") + proto.RegisterType((*SubmitRequest)(nil), "odc.SubmitRequest") + proto.RegisterType((*ActivateRequest)(nil), "odc.ActivateRequest") + proto.RegisterType((*UpdateRequest)(nil), "odc.UpdateRequest") + proto.RegisterType((*ShutdownRequest)(nil), "odc.ShutdownRequest") + proto.RegisterType((*SetPropertyRequest)(nil), "odc.SetPropertyRequest") + proto.RegisterType((*ConfigureRequest)(nil), "odc.ConfigureRequest") + proto.RegisterType((*StartRequest)(nil), "odc.StartRequest") + proto.RegisterType((*StopRequest)(nil), "odc.StopRequest") + proto.RegisterType((*ResetRequest)(nil), "odc.ResetRequest") + proto.RegisterType((*TerminateRequest)(nil), "odc.TerminateRequest") +} + +func init() { proto.RegisterFile("odcprotos/odc.proto", fileDescriptor_289c0e4bbb6a131e) } + +var fileDescriptor_289c0e4bbb6a131e = []byte{ + // 704 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x6e, 0xd3, 0x4c, + 0x14, 0xad, 0x93, 0x38, 0x8d, 0xaf, 0xfb, 0xe3, 0xcc, 0xd7, 0x7e, 0x44, 0x11, 0x8a, 0x22, 0x4b, + 0x88, 0x08, 0xd4, 0xa2, 0xa6, 0xea, 0x02, 0xb1, 0xa1, 0x4d, 0xa3, 0x0a, 0x21, 0xb5, 0xd5, 0x98, + 0x8a, 0xb5, 0x6b, 0x0f, 0xe9, 0x88, 0xc4, 0x63, 0xc6, 0xe3, 0x42, 0x79, 0x12, 0x1e, 0x86, 0x07, + 0x60, 0xc9, 0x23, 0xa0, 0xb2, 0xe1, 0x31, 0xd0, 0x8c, 0xed, 0x69, 0x9a, 0x38, 0x08, 0x94, 0xdd, + 0xbd, 0xb9, 0x7f, 0xe7, 0x9e, 0x7b, 0xc6, 0x81, 0xff, 0x58, 0x18, 0xc4, 0x9c, 0x09, 0x96, 0x3c, + 0x63, 0x61, 0xb0, 0xab, 0x4c, 0x54, 0x65, 0x61, 0xe0, 0xee, 0x80, 0x39, 0xe4, 0x9c, 0x71, 0xe4, + 0x40, 0x75, 0x92, 0x8c, 0x5a, 0x46, 0xd7, 0xe8, 0x59, 0x58, 0x9a, 0x08, 0x41, 0x2d, 0x60, 0x21, + 0x69, 0x55, 0xba, 0x46, 0xcf, 0xc4, 0xca, 0x76, 0xbf, 0x1a, 0xb0, 0x76, 0x42, 0x22, 0xc2, 0xfd, + 0x31, 0x26, 0xf1, 0xf8, 0xa6, 0xa4, 0xac, 0x07, 0xf5, 0x44, 0xf8, 0x22, 0x4d, 0x54, 0xe1, 0x46, + 0xdf, 0xd9, 0x95, 0x23, 0x55, 0xb6, 0xa7, 0x7e, 0xc7, 0x79, 0x1c, 0x75, 0xc1, 0x24, 0x72, 0x76, + 0xab, 0xda, 0x35, 0x7a, 0x76, 0x1f, 0x54, 0xa2, 0x42, 0x83, 0xb3, 0x00, 0x6a, 0x43, 0x83, 0x7c, + 0x22, 0x81, 0xa0, 0x13, 0xd2, 0xaa, 0x29, 0x18, 0xda, 0x47, 0x5b, 0x60, 0xf2, 0x34, 0xa2, 0x61, + 0xcb, 0xec, 0x1a, 0xbd, 0x1a, 0xce, 0x1c, 0xf4, 0x10, 0xac, 0x84, 0x24, 0x09, 0x65, 0x32, 0x52, + 0x57, 0xa8, 0xee, 0x7e, 0x70, 0x8f, 0xa0, 0x7e, 0x4c, 0xae, 0x69, 0x40, 0xd0, 0x06, 0x54, 0x68, + 0xa8, 0x60, 0xd7, 0x70, 0x85, 0x86, 0xb2, 0x9b, 0x44, 0x95, 0x6d, 0x6b, 0xe1, 0xcc, 0x91, 0x14, + 0xc4, 0xbe, 0xb8, 0x52, 0x00, 0x2d, 0xac, 0x6c, 0xf7, 0x18, 0x90, 0xdc, 0x83, 0x0c, 0xae, 0xfc, + 0x68, 0x44, 0x30, 0xf9, 0x90, 0x92, 0x44, 0xe8, 0x4c, 0xe3, 0x2e, 0x53, 0xa2, 0x0f, 0x89, 0xf0, + 0xe9, 0x98, 0x84, 0xaa, 0x6d, 0x03, 0x6b, 0xdf, 0xbd, 0x04, 0xe7, 0x5e, 0x17, 0xc9, 0xe5, 0x63, + 0x30, 0xb9, 0x34, 0x54, 0x13, 0xbb, 0xdf, 0x54, 0x7c, 0x4c, 0xb3, 0x8d, 0xb3, 0x38, 0x7a, 0x04, + 0xab, 0xa1, 0x5a, 0x43, 0x72, 0x5c, 0xed, 0xd9, 0x7d, 0x5b, 0xa5, 0x66, 0xab, 0xe1, 0x22, 0xe6, + 0x9e, 0x40, 0xf3, 0x55, 0x44, 0x05, 0xf5, 0xc7, 0xf4, 0xb3, 0x06, 0xaa, 0x69, 0x33, 0x16, 0xd2, + 0x56, 0x99, 0xa5, 0x6d, 0x13, 0xd6, 0xbd, 0xf4, 0x72, 0x42, 0x45, 0xde, 0xc4, 0xdd, 0x81, 0xcd, + 0xc3, 0x40, 0xd0, 0x6b, 0x5f, 0xe8, 0xbe, 0x6d, 0x68, 0x08, 0x16, 0xb3, 0x31, 0x1b, 0xdd, 0xe4, + 0x24, 0x68, 0xdf, 0x7d, 0x0a, 0xeb, 0x17, 0x71, 0xf8, 0x97, 0xc9, 0x4d, 0xd8, 0xf4, 0xae, 0x52, + 0x11, 0xb2, 0x8f, 0x51, 0x31, 0xee, 0x1c, 0x90, 0x47, 0xc4, 0x39, 0x67, 0x31, 0xe1, 0xe2, 0xa6, + 0x68, 0xe2, 0x40, 0xf5, 0x3d, 0x29, 0xea, 0xa5, 0x29, 0x77, 0xbb, 0xf6, 0xc7, 0xa9, 0x3e, 0xa2, + 0x72, 0x4a, 0x8f, 0x38, 0x04, 0x67, 0xc0, 0xa2, 0x77, 0x74, 0x94, 0x72, 0x0d, 0x6a, 0x0f, 0x56, + 0x79, 0x66, 0xe6, 0x07, 0x78, 0xa0, 0x58, 0x9d, 0x3f, 0x36, 0x2e, 0xf2, 0xdc, 0x43, 0x58, 0xf3, + 0x84, 0xcf, 0xc5, 0x12, 0x2d, 0x5e, 0x82, 0xed, 0x09, 0x16, 0x2f, 0x07, 0x02, 0x93, 0x84, 0x2c, + 0x03, 0x62, 0x08, 0xce, 0x1b, 0xc2, 0x27, 0x34, 0x9a, 0xba, 0xd1, 0xbf, 0xb7, 0x79, 0xd2, 0x07, + 0x7b, 0xea, 0x9d, 0x23, 0x1b, 0x56, 0x2f, 0x4e, 0x5f, 0x9f, 0x9e, 0xbd, 0x3d, 0x75, 0x56, 0xa4, + 0xe3, 0x5d, 0x0c, 0x06, 0x43, 0xcf, 0x73, 0x0c, 0x64, 0x81, 0x39, 0xc4, 0xf8, 0x0c, 0x3b, 0x95, + 0xfe, 0xaf, 0x1a, 0x54, 0xcf, 0x8e, 0x07, 0xe8, 0x39, 0xc0, 0x9d, 0x58, 0xd1, 0xff, 0x6a, 0xd6, + 0x9c, 0x7a, 0xdb, 0xf3, 0x6f, 0xc2, 0x5d, 0x41, 0x7b, 0x50, 0xcf, 0xe4, 0x89, 0x50, 0x06, 0x71, + 0x5a, 0xab, 0xe5, 0x25, 0x07, 0xd0, 0x28, 0x04, 0x8c, 0xb6, 0x54, 0xc2, 0x8c, 0x9e, 0x17, 0x4e, + 0xca, 0x84, 0x9c, 0x4f, 0xba, 0xa7, 0xea, 0xf2, 0x92, 0x17, 0x60, 0x69, 0xa5, 0xa1, 0x6d, 0x95, + 0x31, 0xab, 0xbc, 0xf6, 0xf6, 0x3c, 0xb3, 0x45, 0xb1, 0x3d, 0x25, 0x7c, 0x94, 0x5f, 0x60, 0xee, + 0x29, 0x94, 0x4f, 0xde, 0x07, 0x53, 0x89, 0x13, 0x35, 0x8b, 0xf6, 0x5a, 0xa8, 0x8b, 0x27, 0xee, + 0x41, 0x4d, 0xca, 0x11, 0x39, 0x79, 0x82, 0x56, 0xe6, 0xe2, 0x92, 0x7d, 0x30, 0x95, 0xfe, 0xf2, + 0x39, 0xd3, 0x5a, 0xfc, 0xd3, 0x66, 0x96, 0x56, 0x5c, 0x4e, 0xcb, 0xac, 0x02, 0x17, 0x17, 0x1f, + 0x40, 0xa3, 0xf8, 0x44, 0xe4, 0xd7, 0x9b, 0xf9, 0x62, 0x94, 0x12, 0x72, 0xe4, 0x7c, 0xbb, 0xed, + 0x18, 0xdf, 0x6f, 0x3b, 0xc6, 0x8f, 0xdb, 0x8e, 0xf1, 0xe5, 0x67, 0x67, 0xe5, 0xb2, 0xae, 0xfe, + 0x09, 0xf7, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x87, 0xec, 0xe8, 0x20, 0x07, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// ODCClient is the client API for ODC service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ODCClient interface { + // Initialize + Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Submit agents. Can be called multiple times in order to submit more agents. + Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Activate topology. + Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Update topology. Can be called multiple times in order to scale up or down the topology. + Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Configure + Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateChangeReply, error) + // Set property + SetProperty(ctx context.Context, in *SetPropertyRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Start + Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateChangeReply, error) + // Stop + Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateChangeReply, error) + // Reset + Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateChangeReply, error) + // Terminate + Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateChangeReply, error) + // Shutdown + Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) +} + +type oDCClient struct { + cc *grpc.ClientConn +} + +func NewODCClient(cc *grpc.ClientConn) ODCClient { + return &oDCClient{cc} +} + +func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { + out := new(StateChangeReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) SetProperty(ctx context.Context, in *SetPropertyRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/SetProperty", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { + out := new(StateChangeReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { + out := new(StateChangeReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { + out := new(StateChangeReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { + out := new(StateChangeReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ODCServer is the server API for ODC service. +type ODCServer interface { + // Initialize + Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) + // Submit agents. Can be called multiple times in order to submit more agents. + Submit(context.Context, *SubmitRequest) (*GeneralReply, error) + // Activate topology. + Activate(context.Context, *ActivateRequest) (*GeneralReply, error) + // Update topology. Can be called multiple times in order to scale up or down the topology. + Update(context.Context, *UpdateRequest) (*GeneralReply, error) + // Configure + Configure(context.Context, *ConfigureRequest) (*StateChangeReply, error) + // Set property + SetProperty(context.Context, *SetPropertyRequest) (*GeneralReply, error) + // Start + Start(context.Context, *StartRequest) (*StateChangeReply, error) + // Stop + Stop(context.Context, *StopRequest) (*StateChangeReply, error) + // Reset + Reset(context.Context, *ResetRequest) (*StateChangeReply, error) + // Terminate + Terminate(context.Context, *TerminateRequest) (*StateChangeReply, error) + // Shutdown + Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) +} + +// UnimplementedODCServer can be embedded to have forward compatible implementations. +type UnimplementedODCServer struct { +} + +func (*UnimplementedODCServer) Initialize(ctx context.Context, req *InitializeRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") +} +func (*UnimplementedODCServer) Submit(ctx context.Context, req *SubmitRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") +} +func (*UnimplementedODCServer) Activate(ctx context.Context, req *ActivateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") +} +func (*UnimplementedODCServer) Update(ctx context.Context, req *UpdateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (*UnimplementedODCServer) Configure(ctx context.Context, req *ConfigureRequest) (*StateChangeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") +} +func (*UnimplementedODCServer) SetProperty(ctx context.Context, req *SetPropertyRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetProperty not implemented") +} +func (*UnimplementedODCServer) Start(ctx context.Context, req *StartRequest) (*StateChangeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") +} +func (*UnimplementedODCServer) Stop(ctx context.Context, req *StopRequest) (*StateChangeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") +} +func (*UnimplementedODCServer) Reset(ctx context.Context, req *ResetRequest) (*StateChangeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") +} +func (*UnimplementedODCServer) Terminate(ctx context.Context, req *TerminateRequest) (*StateChangeReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") +} +func (*UnimplementedODCServer) Shutdown(ctx context.Context, req *ShutdownRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") +} + +func RegisterODCServer(s *grpc.Server, srv ODCServer) { + s.RegisterService(&_ODC_serviceDesc, srv) +} + +func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitializeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Initialize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Initialize", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubmitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Submit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Submit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ActivateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Activate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Activate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfigureRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Configure(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Configure", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_SetProperty_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetPropertyRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).SetProperty(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/SetProperty", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).SetProperty(ctx, req.(*SetPropertyRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Start(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Start", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Start(ctx, req.(*StartRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Stop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Stop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Reset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Reset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TerminateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Terminate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Terminate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ShutdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Shutdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Shutdown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _ODC_serviceDesc = grpc.ServiceDesc{ + ServiceName: "odc.ODC", + HandlerType: (*ODCServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Initialize", + Handler: _ODC_Initialize_Handler, + }, + { + MethodName: "Submit", + Handler: _ODC_Submit_Handler, + }, + { + MethodName: "Activate", + Handler: _ODC_Activate_Handler, + }, + { + MethodName: "Update", + Handler: _ODC_Update_Handler, + }, + { + MethodName: "Configure", + Handler: _ODC_Configure_Handler, + }, + { + MethodName: "SetProperty", + Handler: _ODC_SetProperty_Handler, + }, + { + MethodName: "Start", + Handler: _ODC_Start_Handler, + }, + { + MethodName: "Stop", + Handler: _ODC_Stop_Handler, + }, + { + MethodName: "Reset", + Handler: _ODC_Reset_Handler, + }, + { + MethodName: "Terminate", + Handler: _ODC_Terminate_Handler, + }, + { + MethodName: "Shutdown", + Handler: _ODC_Shutdown_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "odcprotos/odc.proto", +} + +func (m *Error) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Error) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Error) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Code != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Code)) + i-- + dAtA[i] = 0x10 + } + if len(m.Msg) > 0 { + i -= len(m.Msg) + copy(dAtA[i:], m.Msg) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Msg))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GeneralReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GeneralReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GeneralReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Sessionid) > 0 { + i -= len(m.Sessionid) + copy(dAtA[i:], m.Sessionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Sessionid))) + i-- + dAtA[i] = 0x32 + } + if m.Runid != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + i-- + dAtA[i] = 0x28 + } + if m.Exectime != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Exectime)) + i-- + dAtA[i] = 0x20 + } + if m.Error != nil { + { + size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + if m.Status != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Status)) + i-- + dAtA[i] = 0x10 + } + if len(m.Msg) > 0 { + i -= len(m.Msg) + copy(dAtA[i:], m.Msg) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Msg))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Device) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Device) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x1a + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOdc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Id != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Id)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StateChangeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StateChangeRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateChangeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Detailed { + i-- + if m.Detailed { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *StateChangeReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StateChangeReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateChangeReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Devices) > 0 { + for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if m.Reply != nil { + { + size, err := m.Reply.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *InitializeRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *InitializeRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *InitializeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Sessionid) > 0 { + i -= len(m.Sessionid) + copy(dAtA[i:], m.Sessionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Sessionid))) + i-- + dAtA[i] = 0x12 + } + if m.Runid != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *SubmitRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SubmitRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SubmitRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *ActivateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ActivateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ActivateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Topology) > 0 { + i -= len(m.Topology) + copy(dAtA[i:], m.Topology) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *UpdateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *UpdateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *UpdateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Topology) > 0 { + i -= len(m.Topology) + copy(dAtA[i:], m.Topology) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ShutdownRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ShutdownRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ShutdownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *SetPropertyRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetPropertyRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetPropertyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0x1a + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConfigureRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfigureRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigureRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Request != nil { + { + size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *StartRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StartRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StartRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Request != nil { + { + size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *StopRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StopRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StopRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Request != nil { + { + size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ResetRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ResetRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ResetRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Request != nil { + { + size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TerminateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TerminateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TerminateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Request != nil { + { + size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintOdc(dAtA []byte, offset int, v uint64) int { + offset -= sovOdc(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Error) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Msg) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.Code != 0 { + n += 1 + sovOdc(uint64(m.Code)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GeneralReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Msg) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.Status != 0 { + n += 1 + sovOdc(uint64(m.Status)) + } + if m.Error != nil { + l = m.Error.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.Exectime != 0 { + n += 1 + sovOdc(uint64(m.Exectime)) + } + if m.Runid != 0 { + n += 1 + sovOdc(uint64(m.Runid)) + } + l = len(m.Sessionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *Device) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Id != 0 { + n += 1 + sovOdc(uint64(m.Id)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + l = len(m.Path) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StateChangeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Path) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.Detailed { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StateChangeReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Reply != nil { + l = m.Reply.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if len(m.Devices) > 0 { + for _, e := range m.Devices { + l = e.Size() + n += 1 + l + sovOdc(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *InitializeRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Runid != 0 { + n += 1 + sovOdc(uint64(m.Runid)) + } + l = len(m.Sessionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SubmitRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ActivateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Topology) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *UpdateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Topology) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ShutdownRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetPropertyRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + l = len(m.Path) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfigureRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Request != nil { + l = m.Request.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StartRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Request != nil { + l = m.Request.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StopRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Request != nil { + l = m.Request.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ResetRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Request != nil { + l = m.Request.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TerminateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Request != nil { + l = m.Request.Size() + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovOdc(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozOdc(x uint64) (n int) { + return sovOdc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Error) 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 ErrIntOverflowOdc + } + 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: Error: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Msg = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) + } + m.Code = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Code |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GeneralReply) 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 ErrIntOverflowOdc + } + 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: GeneralReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GeneralReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Msg = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + m.Status = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Status |= ReplyStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Error == nil { + m.Error = &Error{} + } + if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Exectime", wireType) + } + m.Exectime = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Exectime |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + } + m.Runid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Runid |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sessionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *Device) 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 ErrIntOverflowOdc + } + 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: Device: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + m.Id = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Id |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + 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 ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StateChangeRequest) 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 ErrIntOverflowOdc + } + 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: StateChangeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateChangeRequest: 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 ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Detailed", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Detailed = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StateChangeReply) 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 ErrIntOverflowOdc + } + 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: StateChangeReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateChangeReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Reply", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Reply == nil { + m.Reply = &GeneralReply{} + } + if err := m.Reply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Devices = append(m.Devices, &Device{}) + if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *InitializeRequest) 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 ErrIntOverflowOdc + } + 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: InitializeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: InitializeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + } + m.Runid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Runid |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Sessionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SubmitRequest) 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 ErrIntOverflowOdc + } + 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: SubmitRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubmitRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ActivateRequest) 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 ErrIntOverflowOdc + } + 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: ActivateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ActivateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Topology = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *UpdateRequest) 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 ErrIntOverflowOdc + } + 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: UpdateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: UpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Topology = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ShutdownRequest) 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 ErrIntOverflowOdc + } + 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: ShutdownRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ShutdownRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetPropertyRequest) 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 ErrIntOverflowOdc + } + 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: SetPropertyRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetPropertyRequest: 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 ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + 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 Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + 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 ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Path = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfigureRequest) 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 ErrIntOverflowOdc + } + 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: ConfigureRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigureRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &StateChangeRequest{} + } + if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StartRequest) 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 ErrIntOverflowOdc + } + 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: StartRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StartRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &StateChangeRequest{} + } + if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StopRequest) 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 ErrIntOverflowOdc + } + 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: StopRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StopRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &StateChangeRequest{} + } + if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ResetRequest) 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 ErrIntOverflowOdc + } + 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: ResetRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ResetRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &StateChangeRequest{} + } + if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TerminateRequest) 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 ErrIntOverflowOdc + } + 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: TerminateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TerminateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Request == nil { + m.Request = &StateChangeRequest{} + } + if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipOdc(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOdc + } + 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, ErrIntOverflowOdc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOdc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthOdc + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupOdc + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthOdc + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthOdc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOdc = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupOdc = fmt.Errorf("proto: unexpected end of group") +) diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto new file mode 100644 index 000000000..c056dc23e --- /dev/null +++ b/odcshim/odcprotos/odc.proto @@ -0,0 +1,137 @@ +syntax = "proto3"; + +package odc; + +// The ODC service definition. +service ODC { + // Initialize + rpc Initialize (InitializeRequest) returns (GeneralReply) {} + // Submit agents. Can be called multiple times in order to submit more agents. + rpc Submit (SubmitRequest) returns (GeneralReply) {} + // Activate topology. + rpc Activate (ActivateRequest) returns (GeneralReply) {} + // Update topology. Can be called multiple times in order to scale up or down the topology. + rpc Update (UpdateRequest) returns (GeneralReply) {} + // Configure + rpc Configure (ConfigureRequest) returns (StateChangeReply) {} + // Set property + rpc SetProperty (SetPropertyRequest) returns (GeneralReply) {} + // Start + rpc Start (StartRequest) returns (StateChangeReply) {} + // Stop + rpc Stop (StopRequest) returns (StateChangeReply) {} + // Reset + rpc Reset (ResetRequest) returns (StateChangeReply) {} + // Terminate + rpc Terminate (TerminateRequest) returns (StateChangeReply) {} + // Shutdown + rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} +} + +// Request status +enum ReplyStatus { + UNKNOWN = 0; + SUCCESS = 1; + ERROR = 2; +} + +// General error +message Error { + string msg = 1; + int32 code = 2; +} + +// General reply to requests +message GeneralReply { + string msg = 1; + ReplyStatus status = 2; + Error error = 3; + int32 exectime = 4; // Execution time in ms + uint64 runid = 5; + string sessionid = 6; +} + +// Device path +message Device { + uint64 id = 1; + string state = 2; + string path = 3; +} + +// State change request +message StateChangeRequest { + string path = 1; + bool detailed = 2; +} + +// State change reply +message StateChangeReply { + GeneralReply reply = 1; + repeated Device devices = 2; +} + +// +// Requests +// + +// Initialize request +message InitializeRequest { + uint64 runid = 1; + string sessionid = 2; +} + +// Submit request +message SubmitRequest { + // TODO: Add request parameters here +} + +// Activate request +message ActivateRequest { + string topology = 1; +} + +// Update request +message UpdateRequest { + string topology = 1; +} + +// Shutdown request +message ShutdownRequest { + // TODO: Add request parameters here +} + +// Set property request +message SetPropertyRequest { + string key = 1; + string value = 2; + string path = 3; +} + +// +// FairMQ device state change requests +// + +// Configure request +message ConfigureRequest { + StateChangeRequest request = 1; +} + +// Start request +message StartRequest { + StateChangeRequest request = 1; +} + +// Stop request +message StopRequest { + StateChangeRequest request = 1; +} + +// Reset request +message ResetRequest { + StateChangeRequest request = 1; +} + +// Terminate request +message TerminateRequest { + StateChangeRequest request = 1; +} diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go new file mode 100644 index 000000000..4f392bb67 --- /dev/null +++ b/odcshim/odcshim.go @@ -0,0 +1,92 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package odcshim + +import ( + "fmt" + "net" + "os" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/odcshim/occserver" + "github.com/sirupsen/logrus" + "github.com/spf13/pflag" + "github.com/spf13/viper" +) + +//go:generate protoc -I ../occ --gofast_out=plugins=grpc:. protos/occ.proto +//go:generate protoc -I ../odcshim --gofast_out=plugins=grpc:. odcprotos/odc.proto + +var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") + + +func setDefaults() error { + viper.SetDefault("odcPort", 50051) + viper.SetDefault("odcHost", "127.0.0.1") + viper.SetDefault("verbose", false) + return nil +} + +func setFlags() error { + pflag.Int("occPort", viper.GetInt("occPort"), "OCC control port") + pflag.IntP("odcPort", "p", viper.GetInt("odcPort"), "Remote ODC server port") + pflag.StringP("odcHost", "h", viper.GetString("odcHost"), "Remote ODC server hostname") + pflag.BoolP("verbose", "v", viper.GetBool("verbose"), "Verbose logging") + + pflag.Parse() + return viper.BindPFlags(pflag.CommandLine) +} + +func Run() (err error) { + if err = setDefaults(); err != nil { + return + } + if err = setFlags(); err != nil { + return + } + + host := viper.GetString("odcHost") + port := viper.GetInt("odcPort") + occPort := os.Getenv("OCC_CONTROL_PORT") + + server := occserver.NewServer(host, port) + if server == nil { + return fmt.Errorf("cannot start OCC-ODC bridge to %s:%d", host, port) + } + + var lis net.Listener + lis, err = net.Listen("tcp", fmt.Sprintf(":%s", occPort)) + if err != nil { + log.WithField("error", err). + WithField("port", occPort). + Fatal("net.Listener failed to listen") + return + } + if err = server.Serve(lis); err != nil { + log.WithField("error", err).Fatal("GRPC server failed to serve") + } + + return +} diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go new file mode 100644 index 000000000..d452f8ed8 --- /dev/null +++ b/odcshim/protos/occ.pb.go @@ -0,0 +1,2514 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: protos/occ.proto + +package pb + +import ( + context "context" + fmt "fmt" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// 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.ProtoPackageIsVersion3 // please upgrade the proto package + +type StateChangeTrigger int32 + +const ( + StateChangeTrigger_EXECUTOR StateChangeTrigger = 0 + StateChangeTrigger_DEVICE_INTENTIONAL StateChangeTrigger = 1 + StateChangeTrigger_DEVICE_ERROR StateChangeTrigger = 2 +) + +var StateChangeTrigger_name = map[int32]string{ + 0: "EXECUTOR", + 1: "DEVICE_INTENTIONAL", + 2: "DEVICE_ERROR", +} + +var StateChangeTrigger_value = map[string]int32{ + "EXECUTOR": 0, + "DEVICE_INTENTIONAL": 1, + "DEVICE_ERROR": 2, +} + +func (x StateChangeTrigger) String() string { + return proto.EnumName(StateChangeTrigger_name, int32(x)) +} + +func (StateChangeTrigger) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{0} +} + +type StateType int32 + +const ( + StateType_STATE_STABLE StateType = 0 + StateType_STATE_INTERMEDIATE StateType = 1 +) + +var StateType_name = map[int32]string{ + 0: "STATE_STABLE", + 1: "STATE_INTERMEDIATE", +} + +var StateType_value = map[string]int32{ + "STATE_STABLE": 0, + "STATE_INTERMEDIATE": 1, +} + +func (x StateType) String() string { + return proto.EnumName(StateType_name, int32(x)) +} + +func (StateType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{1} +} + +type DeviceEventType int32 + +const ( + DeviceEventType_NULL_DEVICE_EVENT DeviceEventType = 0 + DeviceEventType_END_OF_STREAM DeviceEventType = 1 + DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 +) + +var DeviceEventType_name = map[int32]string{ + 0: "NULL_DEVICE_EVENT", + 1: "END_OF_STREAM", + 2: "BASIC_TASK_TERMINATED", +} + +var DeviceEventType_value = map[string]int32{ + "NULL_DEVICE_EVENT": 0, + "END_OF_STREAM": 1, + "BASIC_TASK_TERMINATED": 2, +} + +func (x DeviceEventType) String() string { + return proto.EnumName(DeviceEventType_name, int32(x)) +} + +func (DeviceEventType) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{2} +} + +type StateStreamRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StateStreamRequest) Reset() { *m = StateStreamRequest{} } +func (m *StateStreamRequest) String() string { return proto.CompactTextString(m) } +func (*StateStreamRequest) ProtoMessage() {} +func (*StateStreamRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{0} +} +func (m *StateStreamRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StateStreamRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateStreamRequest.Merge(m, src) +} +func (m *StateStreamRequest) XXX_Size() int { + return m.Size() +} +func (m *StateStreamRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StateStreamRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_StateStreamRequest proto.InternalMessageInfo + +type StateStreamReply struct { + Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *StateStreamReply) Reset() { *m = StateStreamReply{} } +func (m *StateStreamReply) String() string { return proto.CompactTextString(m) } +func (*StateStreamReply) ProtoMessage() {} +func (*StateStreamReply) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{1} +} +func (m *StateStreamReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *StateStreamReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateStreamReply.Merge(m, src) +} +func (m *StateStreamReply) XXX_Size() int { + return m.Size() +} +func (m *StateStreamReply) XXX_DiscardUnknown() { + xxx_messageInfo_StateStreamReply.DiscardUnknown(m) +} + +var xxx_messageInfo_StateStreamReply proto.InternalMessageInfo + +func (m *StateStreamReply) GetType() StateType { + if m != nil { + return m.Type + } + return StateType_STATE_STABLE +} + +func (m *StateStreamReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +type EventStreamRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EventStreamRequest) Reset() { *m = EventStreamRequest{} } +func (m *EventStreamRequest) String() string { return proto.CompactTextString(m) } +func (*EventStreamRequest) ProtoMessage() {} +func (*EventStreamRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{2} +} +func (m *EventStreamRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventStreamRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventStreamRequest.Merge(m, src) +} +func (m *EventStreamRequest) XXX_Size() int { + return m.Size() +} +func (m *EventStreamRequest) XXX_DiscardUnknown() { + xxx_messageInfo_EventStreamRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_EventStreamRequest proto.InternalMessageInfo + +type DeviceEvent struct { + Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *DeviceEvent) Reset() { *m = DeviceEvent{} } +func (m *DeviceEvent) String() string { return proto.CompactTextString(m) } +func (*DeviceEvent) ProtoMessage() {} +func (*DeviceEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{3} +} +func (m *DeviceEvent) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *DeviceEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_DeviceEvent.Merge(m, src) +} +func (m *DeviceEvent) XXX_Size() int { + return m.Size() +} +func (m *DeviceEvent) XXX_DiscardUnknown() { + xxx_messageInfo_DeviceEvent.DiscardUnknown(m) +} + +var xxx_messageInfo_DeviceEvent proto.InternalMessageInfo + +func (m *DeviceEvent) GetType() DeviceEventType { + if m != nil { + return m.Type + } + return DeviceEventType_NULL_DEVICE_EVENT +} + +type EventStreamReply struct { + Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *EventStreamReply) Reset() { *m = EventStreamReply{} } +func (m *EventStreamReply) String() string { return proto.CompactTextString(m) } +func (*EventStreamReply) ProtoMessage() {} +func (*EventStreamReply) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{4} +} +func (m *EventStreamReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *EventStreamReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_EventStreamReply.Merge(m, src) +} +func (m *EventStreamReply) XXX_Size() int { + return m.Size() +} +func (m *EventStreamReply) XXX_DiscardUnknown() { + xxx_messageInfo_EventStreamReply.DiscardUnknown(m) +} + +var xxx_messageInfo_EventStreamReply proto.InternalMessageInfo + +func (m *EventStreamReply) GetEvent() *DeviceEvent { + if m != nil { + return m.Event + } + return nil +} + +type GetStateRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetStateRequest) Reset() { *m = GetStateRequest{} } +func (m *GetStateRequest) String() string { return proto.CompactTextString(m) } +func (*GetStateRequest) ProtoMessage() {} +func (*GetStateRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{5} +} +func (m *GetStateRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetStateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetStateRequest.Merge(m, src) +} +func (m *GetStateRequest) XXX_Size() int { + return m.Size() +} +func (m *GetStateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_GetStateRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_GetStateRequest proto.InternalMessageInfo + +type GetStateReply struct { + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *GetStateReply) Reset() { *m = GetStateReply{} } +func (m *GetStateReply) String() string { return proto.CompactTextString(m) } +func (*GetStateReply) ProtoMessage() {} +func (*GetStateReply) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{6} +} +func (m *GetStateReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *GetStateReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_GetStateReply.Merge(m, src) +} +func (m *GetStateReply) XXX_Size() int { + return m.Size() +} +func (m *GetStateReply) XXX_DiscardUnknown() { + xxx_messageInfo_GetStateReply.DiscardUnknown(m) +} + +var xxx_messageInfo_GetStateReply proto.InternalMessageInfo + +func (m *GetStateReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +type ConfigEntry struct { + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ConfigEntry) Reset() { *m = ConfigEntry{} } +func (m *ConfigEntry) String() string { return proto.CompactTextString(m) } +func (*ConfigEntry) ProtoMessage() {} +func (*ConfigEntry) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{7} +} +func (m *ConfigEntry) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *ConfigEntry) XXX_Merge(src proto.Message) { + xxx_messageInfo_ConfigEntry.Merge(m, src) +} +func (m *ConfigEntry) XXX_Size() int { + return m.Size() +} +func (m *ConfigEntry) XXX_DiscardUnknown() { + xxx_messageInfo_ConfigEntry.DiscardUnknown(m) +} + +var xxx_messageInfo_ConfigEntry proto.InternalMessageInfo + +func (m *ConfigEntry) GetKey() string { + if m != nil { + return m.Key + } + return "" +} + +func (m *ConfigEntry) GetValue() string { + if m != nil { + return m.Value + } + return "" +} + +type TransitionRequest struct { + SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` + TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TransitionRequest) Reset() { *m = TransitionRequest{} } +func (m *TransitionRequest) String() string { return proto.CompactTextString(m) } +func (*TransitionRequest) ProtoMessage() {} +func (*TransitionRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{8} +} +func (m *TransitionRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TransitionRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransitionRequest.Merge(m, src) +} +func (m *TransitionRequest) XXX_Size() int { + return m.Size() +} +func (m *TransitionRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TransitionRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TransitionRequest proto.InternalMessageInfo + +func (m *TransitionRequest) GetSrcState() string { + if m != nil { + return m.SrcState + } + return "" +} + +func (m *TransitionRequest) GetTransitionEvent() string { + if m != nil { + return m.TransitionEvent + } + return "" +} + +func (m *TransitionRequest) GetArguments() []*ConfigEntry { + if m != nil { + return m.Arguments + } + return nil +} + +type TransitionReply struct { + Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *TransitionReply) Reset() { *m = TransitionReply{} } +func (m *TransitionReply) String() string { return proto.CompactTextString(m) } +func (*TransitionReply) ProtoMessage() {} +func (*TransitionReply) Descriptor() ([]byte, []int) { + return fileDescriptor_17fd8faceeeb3e6c, []int{9} +} +func (m *TransitionReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TransitionReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_TransitionReply.Merge(m, src) +} +func (m *TransitionReply) XXX_Size() int { + return m.Size() +} +func (m *TransitionReply) XXX_DiscardUnknown() { + xxx_messageInfo_TransitionReply.DiscardUnknown(m) +} + +var xxx_messageInfo_TransitionReply proto.InternalMessageInfo + +func (m *TransitionReply) GetTrigger() StateChangeTrigger { + if m != nil { + return m.Trigger + } + return StateChangeTrigger_EXECUTOR +} + +func (m *TransitionReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +func (m *TransitionReply) GetTransitionEvent() string { + if m != nil { + return m.TransitionEvent + } + return "" +} + +func (m *TransitionReply) GetOk() bool { + if m != nil { + return m.Ok + } + return false +} + +func init() { + proto.RegisterEnum("occ_pb.StateChangeTrigger", StateChangeTrigger_name, StateChangeTrigger_value) + proto.RegisterEnum("occ_pb.StateType", StateType_name, StateType_value) + proto.RegisterEnum("occ_pb.DeviceEventType", DeviceEventType_name, DeviceEventType_value) + proto.RegisterType((*StateStreamRequest)(nil), "occ_pb.StateStreamRequest") + proto.RegisterType((*StateStreamReply)(nil), "occ_pb.StateStreamReply") + proto.RegisterType((*EventStreamRequest)(nil), "occ_pb.EventStreamRequest") + proto.RegisterType((*DeviceEvent)(nil), "occ_pb.DeviceEvent") + proto.RegisterType((*EventStreamReply)(nil), "occ_pb.EventStreamReply") + proto.RegisterType((*GetStateRequest)(nil), "occ_pb.GetStateRequest") + proto.RegisterType((*GetStateReply)(nil), "occ_pb.GetStateReply") + proto.RegisterType((*ConfigEntry)(nil), "occ_pb.ConfigEntry") + proto.RegisterType((*TransitionRequest)(nil), "occ_pb.TransitionRequest") + proto.RegisterType((*TransitionReply)(nil), "occ_pb.TransitionReply") +} + +func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } + +var fileDescriptor_17fd8faceeeb3e6c = []byte{ + // 623 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xc1, 0x6e, 0xd3, 0x40, + 0x10, 0xcd, 0x3a, 0x6d, 0x49, 0x27, 0x6d, 0xe3, 0x2c, 0x2d, 0x4d, 0x23, 0x14, 0x45, 0x96, 0x2a, + 0x85, 0x22, 0x19, 0x08, 0xf4, 0x82, 0xe0, 0xe0, 0x24, 0x4b, 0x15, 0x91, 0x3a, 0xd2, 0x7a, 0x5b, + 0x21, 0x2e, 0x96, 0x6b, 0x2d, 0x69, 0xd4, 0xd4, 0x36, 0xce, 0xb6, 0x52, 0xfe, 0x81, 0x3b, 0xf0, + 0x47, 0x1c, 0xf9, 0x04, 0x54, 0x7e, 0x04, 0xed, 0x26, 0x71, 0xec, 0x24, 0xdc, 0xbc, 0x33, 0x6f, + 0xdf, 0x7b, 0xb3, 0x33, 0x63, 0xd0, 0xa3, 0x38, 0x14, 0xe1, 0xf8, 0x45, 0xe8, 0xfb, 0xa6, 0xfa, + 0xc4, 0x5b, 0xa1, 0xef, 0xbb, 0xd1, 0x95, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, 0x8e, 0x88, 0xb9, + 0x77, 0x4b, 0xf9, 0xd7, 0x3b, 0x3e, 0x16, 0x46, 0x1f, 0xf4, 0x4c, 0x34, 0x1a, 0x4d, 0xf0, 0x31, + 0x6c, 0x88, 0x49, 0xc4, 0x2b, 0xa8, 0x8e, 0x1a, 0x7b, 0xcd, 0xb2, 0x39, 0x25, 0x30, 0x15, 0x8e, + 0x4d, 0x22, 0x4e, 0x55, 0x1a, 0xef, 0xc3, 0xe6, 0x58, 0x86, 0x2a, 0x5a, 0x1d, 0x35, 0xb6, 0xe9, + 0xf4, 0x20, 0x65, 0xc8, 0x3d, 0x0f, 0x44, 0x56, 0xe6, 0x2d, 0x14, 0x3b, 0xfc, 0x7e, 0xe8, 0x73, + 0x95, 0xc3, 0xcf, 0x33, 0x0a, 0x87, 0x73, 0x85, 0x14, 0x64, 0xa1, 0x63, 0xbc, 0x07, 0x3d, 0xc3, + 0x28, 0x2d, 0x3e, 0x83, 0x4d, 0x2e, 0x63, 0x8a, 0xa1, 0xd8, 0x7c, 0xbc, 0x86, 0x81, 0x4e, 0x11, + 0x46, 0x19, 0x4a, 0x67, 0x5c, 0x28, 0xf3, 0x73, 0x37, 0xc7, 0xb0, 0xbb, 0x08, 0x49, 0xba, 0xa4, + 0x14, 0x94, 0x2e, 0xe5, 0x14, 0x8a, 0xed, 0x30, 0xf8, 0x32, 0x1c, 0x90, 0x40, 0xc4, 0x13, 0xac, + 0x43, 0xfe, 0x86, 0x4f, 0x66, 0x10, 0xf9, 0x29, 0xaf, 0xdd, 0x7b, 0xa3, 0xbb, 0xe4, 0x05, 0xd4, + 0xc1, 0xf8, 0x86, 0xa0, 0xcc, 0x62, 0x2f, 0x18, 0x0f, 0xc5, 0x30, 0x0c, 0x66, 0x9a, 0xb8, 0x0a, + 0x85, 0x71, 0xec, 0x3b, 0x29, 0x95, 0xe4, 0x8c, 0x1b, 0x50, 0x12, 0xc9, 0x05, 0x65, 0x7e, 0xc6, + 0xb8, 0x1c, 0xc6, 0xaf, 0x60, 0xdb, 0x8b, 0x07, 0x77, 0xb7, 0x3c, 0x10, 0xe3, 0x4a, 0xbe, 0x9e, + 0x4f, 0xd7, 0x9e, 0xf2, 0x4a, 0x17, 0x28, 0xe3, 0x3b, 0x82, 0x52, 0xda, 0x8e, 0xac, 0xf7, 0x0d, + 0x3c, 0x12, 0xf1, 0x70, 0x30, 0xe0, 0xf1, 0xac, 0x05, 0xd5, 0x4c, 0x93, 0xdb, 0xd7, 0x5e, 0x30, + 0xe0, 0x6c, 0x8a, 0xa0, 0x73, 0xe8, 0xfa, 0x86, 0xaf, 0x33, 0x9f, 0x5f, 0x6f, 0x7e, 0x0f, 0xb4, + 0xf0, 0xa6, 0xb2, 0x51, 0x47, 0x8d, 0x02, 0xd5, 0xc2, 0x9b, 0x93, 0xde, 0x6c, 0x22, 0x33, 0x72, + 0x78, 0x07, 0x0a, 0xe4, 0x13, 0x69, 0x5f, 0xb0, 0x3e, 0xd5, 0x73, 0xf8, 0x09, 0xe0, 0x0e, 0xb9, + 0xec, 0xb6, 0x89, 0xdb, 0xb5, 0x19, 0xb1, 0x59, 0xb7, 0x6f, 0x5b, 0x3d, 0x1d, 0x61, 0x1d, 0x76, + 0x66, 0x71, 0x42, 0x69, 0x9f, 0xea, 0xda, 0xc9, 0x29, 0x6c, 0x27, 0x13, 0x2a, 0xd3, 0x0e, 0xb3, + 0x18, 0x71, 0x1d, 0x66, 0xb5, 0x7a, 0x64, 0x4a, 0x34, 0x8d, 0x48, 0x1e, 0x7a, 0x4e, 0x3a, 0x5d, + 0x8b, 0x11, 0x1d, 0x9d, 0x5c, 0x42, 0x69, 0x69, 0xec, 0xf0, 0x01, 0x94, 0xed, 0x8b, 0x5e, 0xcf, + 0x9d, 0x0b, 0x5c, 0x12, 0x9b, 0xe9, 0x39, 0x5c, 0x86, 0x5d, 0x62, 0x77, 0xdc, 0xfe, 0x07, 0xd7, + 0x61, 0x94, 0x58, 0xe7, 0x3a, 0xc2, 0x47, 0x70, 0xd0, 0xb2, 0x9c, 0x6e, 0xdb, 0x65, 0x96, 0xf3, + 0xd1, 0x95, 0xbc, 0x5d, 0xdb, 0x62, 0xa4, 0xa3, 0x6b, 0xcd, 0x9f, 0x1a, 0xe4, 0xfb, 0xbe, 0x8f, + 0xcf, 0xa0, 0x98, 0x9a, 0x5e, 0x9c, 0x3c, 0xf4, 0xea, 0x92, 0x54, 0x2b, 0x6b, 0x73, 0xd1, 0x68, + 0x62, 0xe4, 0x5e, 0x22, 0x49, 0x94, 0xda, 0x54, 0x9c, 0xed, 0xd8, 0x7f, 0x88, 0x96, 0x57, 0x5b, + 0x11, 0xbd, 0x83, 0xc2, 0x7c, 0xfa, 0x71, 0xb2, 0x7a, 0x4b, 0x2b, 0x52, 0x3d, 0x58, 0x4d, 0xa8, + 0xfb, 0xb8, 0x05, 0xb0, 0x98, 0x26, 0x7c, 0x34, 0x87, 0xad, 0x0c, 0x7c, 0xf5, 0x70, 0x5d, 0x4a, + 0x71, 0xb4, 0x9a, 0xbf, 0x1e, 0x6a, 0xe8, 0xf7, 0x43, 0x0d, 0xfd, 0x79, 0xa8, 0xa1, 0x1f, 0x7f, + 0x6b, 0x39, 0x78, 0xea, 0x5f, 0x9b, 0x3e, 0x8f, 0x03, 0xd3, 0x1b, 0x0d, 0x7d, 0x6e, 0x86, 0x4d, + 0xd3, 0x0f, 0x03, 0x11, 0x87, 0x23, 0x49, 0xf2, 0x59, 0x8b, 0xae, 0xae, 0xb6, 0xd4, 0xdf, 0xec, + 0xf5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xf5, 0x41, 0x08, 0xe1, 0x04, 0x00, 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// OccClient is the client API for Occ service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type OccClient interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) + StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) + GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) + Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) +} + +type occClient struct { + cc *grpc.ClientConn +} + +func NewOccClient(cc *grpc.ClientConn) OccClient { + return &occClient{cc} +} + +func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + if err != nil { + return nil, err + } + x := &occEventStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_EventStreamClient interface { + Recv() (*EventStreamReply, error) + grpc.ClientStream +} + +type occEventStreamClient struct { + grpc.ClientStream +} + +func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { + m := new(EventStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + if err != nil { + return nil, err + } + x := &occStateStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_StateStreamClient interface { + Recv() (*StateStreamReply, error) + grpc.ClientStream +} + +type occStateStreamClient struct { + grpc.ClientStream +} + +func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { + m := new(StateStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { + out := new(GetStateReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { + out := new(TransitionReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OccServer is the server API for Occ service. +type OccServer interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(*EventStreamRequest, Occ_EventStreamServer) error + StateStream(*StateStreamRequest, Occ_StateStreamServer) error + GetState(context.Context, *GetStateRequest) (*GetStateReply, error) + Transition(context.Context, *TransitionRequest) (*TransitionReply, error) +} + +// UnimplementedOccServer can be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + +func RegisterOccServer(s *grpc.Server, srv OccServer) { + s.RegisterService(&_Occ_serviceDesc, srv) +} + +func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(EventStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) +} + +type Occ_EventStreamServer interface { + Send(*EventStreamReply) error + grpc.ServerStream +} + +type occEventStreamServer struct { + grpc.ServerStream +} + +func (x *occEventStreamServer) Send(m *EventStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StateStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) +} + +type Occ_StateStreamServer interface { + Send(*StateStreamReply) error + grpc.ServerStream +} + +type occStateStreamServer struct { + grpc.ServerStream +} + +func (x *occStateStreamServer) Send(m *StateStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TransitionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).Transition(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/Transition", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Occ_serviceDesc = grpc.ServiceDesc{ + ServiceName: "occ_pb.Occ", + HandlerType: (*OccServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetState", + Handler: _Occ_GetState_Handler, + }, + { + MethodName: "Transition", + Handler: _Occ_Transition_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "EventStream", + Handler: _Occ_EventStream_Handler, + ServerStreams: true, + }, + { + StreamName: "StateStream", + Handler: _Occ_StateStream_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/occ.proto", +} + +func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Type != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Type)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Event != nil { + { + size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + +func (m *GetStateReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Value) > 0 { + i -= len(m.Value) + copy(dAtA[i:], m.Value) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) + i-- + dAtA[i] = 0x12 + } + if len(m.Key) > 0 { + i -= len(m.Key) + copy(dAtA[i:], m.Key) + i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Arguments) > 0 { + for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOcc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x12 + } + if len(m.SrcState) > 0 { + i -= len(m.SrcState) + copy(dAtA[i:], m.SrcState) + i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *TransitionReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.Ok { + i-- + if m.Ok { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x20 + } + if len(m.TransitionEvent) > 0 { + i -= len(m.TransitionEvent) + copy(dAtA[i:], m.TransitionEvent) + i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) + i-- + dAtA[i] = 0x1a + } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x12 + } + if m.Trigger != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { + offset -= sovOcc(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *StateStreamRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *StateStreamReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovOcc(uint64(m.Type)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EventStreamRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *DeviceEvent) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Type != 0 { + n += 1 + sovOcc(uint64(m.Type)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *EventStreamReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Event != nil { + l = m.Event.Size() + n += 1 + l + sovOcc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetStateRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *GetStateReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.State) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ConfigEntry) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Key) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + l = len(m.Value) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TransitionRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.SrcState) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + l = len(m.TransitionEvent) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + if len(m.Arguments) > 0 { + for _, e := range m.Arguments { + l = e.Size() + n += 1 + l + sovOcc(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *TransitionReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Trigger != 0 { + n += 1 + sovOcc(uint64(m.Trigger)) + } + l = len(m.State) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + l = len(m.TransitionEvent) + if l > 0 { + n += 1 + l + sovOcc(uint64(l)) + } + if m.Ok { + n += 2 + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovOcc(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozOcc(x uint64) (n int) { + return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *StateStreamRequest) 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 ErrIntOverflowOcc + } + 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: StateStreamRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *StateStreamReply) 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 ErrIntOverflowOcc + } + 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: StateStreamReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: StateStreamReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= StateType(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventStreamRequest) 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 ErrIntOverflowOcc + } + 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: EventStreamRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *DeviceEvent) 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 ErrIntOverflowOcc + } + 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: DeviceEvent: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: DeviceEvent: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) + } + m.Type = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Type |= DeviceEventType(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *EventStreamReply) 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 ErrIntOverflowOcc + } + 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: EventStreamReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: EventStreamReply: 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 msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOcc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Event == nil { + m.Event = &DeviceEvent{} + } + if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetStateRequest) 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 ErrIntOverflowOcc + } + 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: GetStateRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *GetStateReply) 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 ErrIntOverflowOcc + } + 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: GetStateReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GetStateReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ConfigEntry) 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 ErrIntOverflowOcc + } + 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: ConfigEntry: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ConfigEntry: 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 ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + 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 Value", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TransitionRequest) 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 ErrIntOverflowOcc + } + 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: TransitionRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransitionRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SrcState", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SrcState = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TransitionEvent = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOcc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Arguments = append(m.Arguments, &ConfigEntry{}) + if err := m.Arguments[len(m.Arguments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TransitionReply) 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 ErrIntOverflowOcc + } + 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: TransitionReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TransitionReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Trigger", wireType) + } + m.Trigger = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Trigger |= StateChangeTrigger(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + 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 ErrInvalidLengthOcc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOcc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TransitionEvent = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Ok = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipOcc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOcc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipOcc(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOcc + } + 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, ErrIntOverflowOcc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowOcc + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthOcc + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupOcc + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthOcc + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") +) From e638458ba24a7e14026b18eab2734182f31fb189 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Jul 2020 17:06:53 +0200 Subject: [PATCH 0299/2352] [odcshim] Update to newest ODC protofile --- odcshim/odcprotos/odc.pb.go | 1034 +++++++++++++++++++++++++++-------- odcshim/odcprotos/odc.proto | 144 +++-- 2 files changed, 881 insertions(+), 297 deletions(-) diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 3c23a590a..8eb5bbf67 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -113,15 +113,17 @@ func (m *Error) GetCode() int32 { // General reply to requests type GeneralReply struct { - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` - Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` - Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` - Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` - Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` + Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` + Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` + // TODO: FIXME: find a better undefined state value, for the moment there is no undefined state in FairMQ + State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GeneralReply) Reset() { *m = GeneralReply{} } @@ -199,7 +201,16 @@ func (m *GeneralReply) GetSessionid() string { return "" } -// Device path +func (m *GeneralReply) GetState() string { + if m != nil { + return m.State + } + return "" +} + +// Device information +// Runtime task ID and path are the same as in DDS. +// To get task details use DDS Topology API. type Device struct { Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` @@ -263,8 +274,8 @@ func (m *Device) GetPath() string { return "" } -// State change request -type StateChangeRequest struct { +// Device change/get state request +type StateRequest struct { Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` Detailed bool `protobuf:"varint,2,opt,name=detailed,proto3" json:"detailed,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -272,18 +283,18 @@ type StateChangeRequest struct { XXX_sizecache int32 `json:"-"` } -func (m *StateChangeRequest) Reset() { *m = StateChangeRequest{} } -func (m *StateChangeRequest) String() string { return proto.CompactTextString(m) } -func (*StateChangeRequest) ProtoMessage() {} -func (*StateChangeRequest) Descriptor() ([]byte, []int) { +func (m *StateRequest) Reset() { *m = StateRequest{} } +func (m *StateRequest) String() string { return proto.CompactTextString(m) } +func (*StateRequest) ProtoMessage() {} +func (*StateRequest) Descriptor() ([]byte, []int) { return fileDescriptor_289c0e4bbb6a131e, []int{3} } -func (m *StateChangeRequest) XXX_Unmarshal(b []byte) error { +func (m *StateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StateChangeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StateChangeRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_StateRequest.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -293,34 +304,34 @@ func (m *StateChangeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *StateChangeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateChangeRequest.Merge(m, src) +func (m *StateRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateRequest.Merge(m, src) } -func (m *StateChangeRequest) XXX_Size() int { +func (m *StateRequest) XXX_Size() int { return m.Size() } -func (m *StateChangeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StateChangeRequest.DiscardUnknown(m) +func (m *StateRequest) XXX_DiscardUnknown() { + xxx_messageInfo_StateRequest.DiscardUnknown(m) } -var xxx_messageInfo_StateChangeRequest proto.InternalMessageInfo +var xxx_messageInfo_StateRequest proto.InternalMessageInfo -func (m *StateChangeRequest) GetPath() string { +func (m *StateRequest) GetPath() string { if m != nil { return m.Path } return "" } -func (m *StateChangeRequest) GetDetailed() bool { +func (m *StateRequest) GetDetailed() bool { if m != nil { return m.Detailed } return false } -// State change reply -type StateChangeReply struct { +// Device change/get state reply +type StateReply struct { Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -328,18 +339,18 @@ type StateChangeReply struct { XXX_sizecache int32 `json:"-"` } -func (m *StateChangeReply) Reset() { *m = StateChangeReply{} } -func (m *StateChangeReply) String() string { return proto.CompactTextString(m) } -func (*StateChangeReply) ProtoMessage() {} -func (*StateChangeReply) Descriptor() ([]byte, []int) { +func (m *StateReply) Reset() { *m = StateReply{} } +func (m *StateReply) String() string { return proto.CompactTextString(m) } +func (*StateReply) ProtoMessage() {} +func (*StateReply) Descriptor() ([]byte, []int) { return fileDescriptor_289c0e4bbb6a131e, []int{4} } -func (m *StateChangeReply) XXX_Unmarshal(b []byte) error { +func (m *StateReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *StateChangeReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *StateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_StateChangeReply.Marshal(b, m, deterministic) + return xxx_messageInfo_StateReply.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -349,26 +360,26 @@ func (m *StateChangeReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, er return b[:n], nil } } -func (m *StateChangeReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateChangeReply.Merge(m, src) +func (m *StateReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_StateReply.Merge(m, src) } -func (m *StateChangeReply) XXX_Size() int { +func (m *StateReply) XXX_Size() int { return m.Size() } -func (m *StateChangeReply) XXX_DiscardUnknown() { - xxx_messageInfo_StateChangeReply.DiscardUnknown(m) +func (m *StateReply) XXX_DiscardUnknown() { + xxx_messageInfo_StateReply.DiscardUnknown(m) } -var xxx_messageInfo_StateChangeReply proto.InternalMessageInfo +var xxx_messageInfo_StateReply proto.InternalMessageInfo -func (m *StateChangeReply) GetReply() *GeneralReply { +func (m *StateReply) GetReply() *GeneralReply { if m != nil { return m.Reply } return nil } -func (m *StateChangeReply) GetDevices() []*Device { +func (m *StateReply) GetDevices() []*Device { if m != nil { return m.Devices } @@ -519,6 +530,62 @@ func (m *ActivateRequest) GetTopology() string { return "" } +// Run request +type RunRequest struct { + Runid uint64 `protobuf:"varint,1,opt,name=runid,proto3" json:"runid,omitempty"` + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *RunRequest) Reset() { *m = RunRequest{} } +func (m *RunRequest) String() string { return proto.CompactTextString(m) } +func (*RunRequest) ProtoMessage() {} +func (*RunRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{8} +} +func (m *RunRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *RunRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_RunRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *RunRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_RunRequest.Merge(m, src) +} +func (m *RunRequest) XXX_Size() int { + return m.Size() +} +func (m *RunRequest) XXX_DiscardUnknown() { + xxx_messageInfo_RunRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_RunRequest proto.InternalMessageInfo + +func (m *RunRequest) GetRunid() uint64 { + if m != nil { + return m.Runid + } + return 0 +} + +func (m *RunRequest) GetTopology() string { + if m != nil { + return m.Topology + } + return "" +} + // Update request type UpdateRequest struct { Topology string `protobuf:"bytes,1,opt,name=topology,proto3" json:"topology,omitempty"` @@ -531,7 +598,7 @@ func (m *UpdateRequest) Reset() { *m = UpdateRequest{} } func (m *UpdateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateRequest) ProtoMessage() {} func (*UpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{8} + return fileDescriptor_289c0e4bbb6a131e, []int{9} } func (m *UpdateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -578,7 +645,7 @@ func (m *ShutdownRequest) Reset() { *m = ShutdownRequest{} } func (m *ShutdownRequest) String() string { return proto.CompactTextString(m) } func (*ShutdownRequest) ProtoMessage() {} func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{9} + return fileDescriptor_289c0e4bbb6a131e, []int{10} } func (m *ShutdownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -607,28 +674,27 @@ func (m *ShutdownRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ShutdownRequest proto.InternalMessageInfo -// Set property request -type SetPropertyRequest struct { +// Key-Value property +type Property struct { Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *SetPropertyRequest) Reset() { *m = SetPropertyRequest{} } -func (m *SetPropertyRequest) String() string { return proto.CompactTextString(m) } -func (*SetPropertyRequest) ProtoMessage() {} -func (*SetPropertyRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{10} +func (m *Property) Reset() { *m = Property{} } +func (m *Property) String() string { return proto.CompactTextString(m) } +func (*Property) ProtoMessage() {} +func (*Property) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{11} } -func (m *SetPropertyRequest) XXX_Unmarshal(b []byte) error { +func (m *Property) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *SetPropertyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_SetPropertyRequest.Marshal(b, m, deterministic) + return xxx_messageInfo_Property.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -638,52 +704,101 @@ func (m *SetPropertyRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *SetPropertyRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetPropertyRequest.Merge(m, src) +func (m *Property) XXX_Merge(src proto.Message) { + xxx_messageInfo_Property.Merge(m, src) } -func (m *SetPropertyRequest) XXX_Size() int { +func (m *Property) XXX_Size() int { return m.Size() } -func (m *SetPropertyRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetPropertyRequest.DiscardUnknown(m) +func (m *Property) XXX_DiscardUnknown() { + xxx_messageInfo_Property.DiscardUnknown(m) } -var xxx_messageInfo_SetPropertyRequest proto.InternalMessageInfo +var xxx_messageInfo_Property proto.InternalMessageInfo -func (m *SetPropertyRequest) GetKey() string { +func (m *Property) GetKey() string { if m != nil { return m.Key } return "" } -func (m *SetPropertyRequest) GetValue() string { +func (m *Property) GetValue() string { if m != nil { return m.Value } return "" } -func (m *SetPropertyRequest) GetPath() string { +// Set properties request +type SetPropertiesRequest struct { + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + Properties []*Property `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SetPropertiesRequest) Reset() { *m = SetPropertiesRequest{} } +func (m *SetPropertiesRequest) String() string { return proto.CompactTextString(m) } +func (*SetPropertiesRequest) ProtoMessage() {} +func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_289c0e4bbb6a131e, []int{12} +} +func (m *SetPropertiesRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SetPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SetPropertiesRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *SetPropertiesRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_SetPropertiesRequest.Merge(m, src) +} +func (m *SetPropertiesRequest) XXX_Size() int { + return m.Size() +} +func (m *SetPropertiesRequest) XXX_DiscardUnknown() { + xxx_messageInfo_SetPropertiesRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_SetPropertiesRequest proto.InternalMessageInfo + +func (m *SetPropertiesRequest) GetPath() string { if m != nil { return m.Path } return "" } +func (m *SetPropertiesRequest) GetProperties() []*Property { + if m != nil { + return m.Properties + } + return nil +} + // Configure request type ConfigureRequest struct { - Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ConfigureRequest) Reset() { *m = ConfigureRequest{} } func (m *ConfigureRequest) String() string { return proto.CompactTextString(m) } func (*ConfigureRequest) ProtoMessage() {} func (*ConfigureRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{11} + return fileDescriptor_289c0e4bbb6a131e, []int{13} } func (m *ConfigureRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -712,7 +827,7 @@ func (m *ConfigureRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ConfigureRequest proto.InternalMessageInfo -func (m *ConfigureRequest) GetRequest() *StateChangeRequest { +func (m *ConfigureRequest) GetRequest() *StateRequest { if m != nil { return m.Request } @@ -721,17 +836,17 @@ func (m *ConfigureRequest) GetRequest() *StateChangeRequest { // Start request type StartRequest struct { - Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *StartRequest) Reset() { *m = StartRequest{} } func (m *StartRequest) String() string { return proto.CompactTextString(m) } func (*StartRequest) ProtoMessage() {} func (*StartRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{12} + return fileDescriptor_289c0e4bbb6a131e, []int{14} } func (m *StartRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -760,7 +875,7 @@ func (m *StartRequest) XXX_DiscardUnknown() { var xxx_messageInfo_StartRequest proto.InternalMessageInfo -func (m *StartRequest) GetRequest() *StateChangeRequest { +func (m *StartRequest) GetRequest() *StateRequest { if m != nil { return m.Request } @@ -769,17 +884,17 @@ func (m *StartRequest) GetRequest() *StateChangeRequest { // Stop request type StopRequest struct { - Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *StopRequest) Reset() { *m = StopRequest{} } func (m *StopRequest) String() string { return proto.CompactTextString(m) } func (*StopRequest) ProtoMessage() {} func (*StopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{13} + return fileDescriptor_289c0e4bbb6a131e, []int{15} } func (m *StopRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -808,7 +923,7 @@ func (m *StopRequest) XXX_DiscardUnknown() { var xxx_messageInfo_StopRequest proto.InternalMessageInfo -func (m *StopRequest) GetRequest() *StateChangeRequest { +func (m *StopRequest) GetRequest() *StateRequest { if m != nil { return m.Request } @@ -817,17 +932,17 @@ func (m *StopRequest) GetRequest() *StateChangeRequest { // Reset request type ResetRequest struct { - Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *ResetRequest) Reset() { *m = ResetRequest{} } func (m *ResetRequest) String() string { return proto.CompactTextString(m) } func (*ResetRequest) ProtoMessage() {} func (*ResetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{14} + return fileDescriptor_289c0e4bbb6a131e, []int{16} } func (m *ResetRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -856,7 +971,7 @@ func (m *ResetRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ResetRequest proto.InternalMessageInfo -func (m *ResetRequest) GetRequest() *StateChangeRequest { +func (m *ResetRequest) GetRequest() *StateRequest { if m != nil { return m.Request } @@ -865,17 +980,17 @@ func (m *ResetRequest) GetRequest() *StateChangeRequest { // Terminate request type TerminateRequest struct { - Request *StateChangeRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *TerminateRequest) Reset() { *m = TerminateRequest{} } func (m *TerminateRequest) String() string { return proto.CompactTextString(m) } func (*TerminateRequest) ProtoMessage() {} func (*TerminateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{15} + return fileDescriptor_289c0e4bbb6a131e, []int{17} } func (m *TerminateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -904,7 +1019,7 @@ func (m *TerminateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_TerminateRequest proto.InternalMessageInfo -func (m *TerminateRequest) GetRequest() *StateChangeRequest { +func (m *TerminateRequest) GetRequest() *StateRequest { if m != nil { return m.Request } @@ -916,14 +1031,16 @@ func init() { proto.RegisterType((*Error)(nil), "odc.Error") proto.RegisterType((*GeneralReply)(nil), "odc.GeneralReply") proto.RegisterType((*Device)(nil), "odc.Device") - proto.RegisterType((*StateChangeRequest)(nil), "odc.StateChangeRequest") - proto.RegisterType((*StateChangeReply)(nil), "odc.StateChangeReply") + proto.RegisterType((*StateRequest)(nil), "odc.StateRequest") + proto.RegisterType((*StateReply)(nil), "odc.StateReply") proto.RegisterType((*InitializeRequest)(nil), "odc.InitializeRequest") proto.RegisterType((*SubmitRequest)(nil), "odc.SubmitRequest") proto.RegisterType((*ActivateRequest)(nil), "odc.ActivateRequest") + proto.RegisterType((*RunRequest)(nil), "odc.RunRequest") proto.RegisterType((*UpdateRequest)(nil), "odc.UpdateRequest") proto.RegisterType((*ShutdownRequest)(nil), "odc.ShutdownRequest") - proto.RegisterType((*SetPropertyRequest)(nil), "odc.SetPropertyRequest") + proto.RegisterType((*Property)(nil), "odc.Property") + proto.RegisterType((*SetPropertiesRequest)(nil), "odc.SetPropertiesRequest") proto.RegisterType((*ConfigureRequest)(nil), "odc.ConfigureRequest") proto.RegisterType((*StartRequest)(nil), "odc.StartRequest") proto.RegisterType((*StopRequest)(nil), "odc.StopRequest") @@ -934,51 +1051,55 @@ func init() { func init() { proto.RegisterFile("odcprotos/odc.proto", fileDescriptor_289c0e4bbb6a131e) } var fileDescriptor_289c0e4bbb6a131e = []byte{ - // 704 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x55, 0xcd, 0x6e, 0xd3, 0x4c, - 0x14, 0xad, 0x93, 0x38, 0x8d, 0xaf, 0xfb, 0xe3, 0xcc, 0xd7, 0x7e, 0x44, 0x11, 0x8a, 0x22, 0x4b, - 0x88, 0x08, 0xd4, 0xa2, 0xa6, 0xea, 0x02, 0xb1, 0xa1, 0x4d, 0xa3, 0x0a, 0x21, 0xb5, 0xd5, 0x98, - 0x8a, 0xb5, 0x6b, 0x0f, 0xe9, 0x88, 0xc4, 0x63, 0xc6, 0xe3, 0x42, 0x79, 0x12, 0x1e, 0x86, 0x07, - 0x60, 0xc9, 0x23, 0xa0, 0xb2, 0xe1, 0x31, 0xd0, 0x8c, 0xed, 0x69, 0x9a, 0x38, 0x08, 0x94, 0xdd, - 0xbd, 0xb9, 0x7f, 0xe7, 0x9e, 0x7b, 0xc6, 0x81, 0xff, 0x58, 0x18, 0xc4, 0x9c, 0x09, 0x96, 0x3c, - 0x63, 0x61, 0xb0, 0xab, 0x4c, 0x54, 0x65, 0x61, 0xe0, 0xee, 0x80, 0x39, 0xe4, 0x9c, 0x71, 0xe4, - 0x40, 0x75, 0x92, 0x8c, 0x5a, 0x46, 0xd7, 0xe8, 0x59, 0x58, 0x9a, 0x08, 0x41, 0x2d, 0x60, 0x21, - 0x69, 0x55, 0xba, 0x46, 0xcf, 0xc4, 0xca, 0x76, 0xbf, 0x1a, 0xb0, 0x76, 0x42, 0x22, 0xc2, 0xfd, - 0x31, 0x26, 0xf1, 0xf8, 0xa6, 0xa4, 0xac, 0x07, 0xf5, 0x44, 0xf8, 0x22, 0x4d, 0x54, 0xe1, 0x46, - 0xdf, 0xd9, 0x95, 0x23, 0x55, 0xb6, 0xa7, 0x7e, 0xc7, 0x79, 0x1c, 0x75, 0xc1, 0x24, 0x72, 0x76, - 0xab, 0xda, 0x35, 0x7a, 0x76, 0x1f, 0x54, 0xa2, 0x42, 0x83, 0xb3, 0x00, 0x6a, 0x43, 0x83, 0x7c, - 0x22, 0x81, 0xa0, 0x13, 0xd2, 0xaa, 0x29, 0x18, 0xda, 0x47, 0x5b, 0x60, 0xf2, 0x34, 0xa2, 0x61, - 0xcb, 0xec, 0x1a, 0xbd, 0x1a, 0xce, 0x1c, 0xf4, 0x10, 0xac, 0x84, 0x24, 0x09, 0x65, 0x32, 0x52, - 0x57, 0xa8, 0xee, 0x7e, 0x70, 0x8f, 0xa0, 0x7e, 0x4c, 0xae, 0x69, 0x40, 0xd0, 0x06, 0x54, 0x68, - 0xa8, 0x60, 0xd7, 0x70, 0x85, 0x86, 0xb2, 0x9b, 0x44, 0x95, 0x6d, 0x6b, 0xe1, 0xcc, 0x91, 0x14, - 0xc4, 0xbe, 0xb8, 0x52, 0x00, 0x2d, 0xac, 0x6c, 0xf7, 0x18, 0x90, 0xdc, 0x83, 0x0c, 0xae, 0xfc, - 0x68, 0x44, 0x30, 0xf9, 0x90, 0x92, 0x44, 0xe8, 0x4c, 0xe3, 0x2e, 0x53, 0xa2, 0x0f, 0x89, 0xf0, - 0xe9, 0x98, 0x84, 0xaa, 0x6d, 0x03, 0x6b, 0xdf, 0xbd, 0x04, 0xe7, 0x5e, 0x17, 0xc9, 0xe5, 0x63, - 0x30, 0xb9, 0x34, 0x54, 0x13, 0xbb, 0xdf, 0x54, 0x7c, 0x4c, 0xb3, 0x8d, 0xb3, 0x38, 0x7a, 0x04, - 0xab, 0xa1, 0x5a, 0x43, 0x72, 0x5c, 0xed, 0xd9, 0x7d, 0x5b, 0xa5, 0x66, 0xab, 0xe1, 0x22, 0xe6, - 0x9e, 0x40, 0xf3, 0x55, 0x44, 0x05, 0xf5, 0xc7, 0xf4, 0xb3, 0x06, 0xaa, 0x69, 0x33, 0x16, 0xd2, - 0x56, 0x99, 0xa5, 0x6d, 0x13, 0xd6, 0xbd, 0xf4, 0x72, 0x42, 0x45, 0xde, 0xc4, 0xdd, 0x81, 0xcd, - 0xc3, 0x40, 0xd0, 0x6b, 0x5f, 0xe8, 0xbe, 0x6d, 0x68, 0x08, 0x16, 0xb3, 0x31, 0x1b, 0xdd, 0xe4, - 0x24, 0x68, 0xdf, 0x7d, 0x0a, 0xeb, 0x17, 0x71, 0xf8, 0x97, 0xc9, 0x4d, 0xd8, 0xf4, 0xae, 0x52, - 0x11, 0xb2, 0x8f, 0x51, 0x31, 0xee, 0x1c, 0x90, 0x47, 0xc4, 0x39, 0x67, 0x31, 0xe1, 0xe2, 0xa6, - 0x68, 0xe2, 0x40, 0xf5, 0x3d, 0x29, 0xea, 0xa5, 0x29, 0x77, 0xbb, 0xf6, 0xc7, 0xa9, 0x3e, 0xa2, - 0x72, 0x4a, 0x8f, 0x38, 0x04, 0x67, 0xc0, 0xa2, 0x77, 0x74, 0x94, 0x72, 0x0d, 0x6a, 0x0f, 0x56, - 0x79, 0x66, 0xe6, 0x07, 0x78, 0xa0, 0x58, 0x9d, 0x3f, 0x36, 0x2e, 0xf2, 0xdc, 0x43, 0x58, 0xf3, - 0x84, 0xcf, 0xc5, 0x12, 0x2d, 0x5e, 0x82, 0xed, 0x09, 0x16, 0x2f, 0x07, 0x02, 0x93, 0x84, 0x2c, - 0x03, 0x62, 0x08, 0xce, 0x1b, 0xc2, 0x27, 0x34, 0x9a, 0xba, 0xd1, 0xbf, 0xb7, 0x79, 0xd2, 0x07, - 0x7b, 0xea, 0x9d, 0x23, 0x1b, 0x56, 0x2f, 0x4e, 0x5f, 0x9f, 0x9e, 0xbd, 0x3d, 0x75, 0x56, 0xa4, - 0xe3, 0x5d, 0x0c, 0x06, 0x43, 0xcf, 0x73, 0x0c, 0x64, 0x81, 0x39, 0xc4, 0xf8, 0x0c, 0x3b, 0x95, - 0xfe, 0xaf, 0x1a, 0x54, 0xcf, 0x8e, 0x07, 0xe8, 0x39, 0xc0, 0x9d, 0x58, 0xd1, 0xff, 0x6a, 0xd6, - 0x9c, 0x7a, 0xdb, 0xf3, 0x6f, 0xc2, 0x5d, 0x41, 0x7b, 0x50, 0xcf, 0xe4, 0x89, 0x50, 0x06, 0x71, - 0x5a, 0xab, 0xe5, 0x25, 0x07, 0xd0, 0x28, 0x04, 0x8c, 0xb6, 0x54, 0xc2, 0x8c, 0x9e, 0x17, 0x4e, - 0xca, 0x84, 0x9c, 0x4f, 0xba, 0xa7, 0xea, 0xf2, 0x92, 0x17, 0x60, 0x69, 0xa5, 0xa1, 0x6d, 0x95, - 0x31, 0xab, 0xbc, 0xf6, 0xf6, 0x3c, 0xb3, 0x45, 0xb1, 0x3d, 0x25, 0x7c, 0x94, 0x5f, 0x60, 0xee, - 0x29, 0x94, 0x4f, 0xde, 0x07, 0x53, 0x89, 0x13, 0x35, 0x8b, 0xf6, 0x5a, 0xa8, 0x8b, 0x27, 0xee, - 0x41, 0x4d, 0xca, 0x11, 0x39, 0x79, 0x82, 0x56, 0xe6, 0xe2, 0x92, 0x7d, 0x30, 0x95, 0xfe, 0xf2, - 0x39, 0xd3, 0x5a, 0xfc, 0xd3, 0x66, 0x96, 0x56, 0x5c, 0x4e, 0xcb, 0xac, 0x02, 0x17, 0x17, 0x1f, - 0x40, 0xa3, 0xf8, 0x44, 0xe4, 0xd7, 0x9b, 0xf9, 0x62, 0x94, 0x12, 0x72, 0xe4, 0x7c, 0xbb, 0xed, - 0x18, 0xdf, 0x6f, 0x3b, 0xc6, 0x8f, 0xdb, 0x8e, 0xf1, 0xe5, 0x67, 0x67, 0xe5, 0xb2, 0xae, 0xfe, - 0x09, 0xf7, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x87, 0xec, 0xe8, 0x20, 0x07, 0x00, 0x00, + // 753 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xdd, 0x6e, 0xd3, 0x4a, + 0x10, 0xae, 0x93, 0x38, 0x3f, 0x93, 0xa6, 0x71, 0xf7, 0xf4, 0x1c, 0xe5, 0x44, 0x47, 0x51, 0xb4, + 0xd2, 0x11, 0x11, 0x51, 0x0a, 0x04, 0xf5, 0x02, 0x90, 0x5a, 0xd1, 0xb4, 0xaa, 0x10, 0x52, 0x8b, + 0xd6, 0x54, 0x08, 0x89, 0x9b, 0x34, 0x5e, 0xda, 0x15, 0x49, 0xd6, 0xd8, 0xeb, 0x42, 0x79, 0x12, + 0x5e, 0x82, 0xf7, 0xe0, 0x12, 0xf1, 0x04, 0xa8, 0xbc, 0x08, 0xda, 0xb1, 0xb3, 0x71, 0x53, 0xa7, + 0x82, 0xde, 0xcd, 0x64, 0xbe, 0x6f, 0xe7, 0xef, 0x1b, 0x07, 0xfe, 0x92, 0xde, 0xc8, 0x0f, 0xa4, + 0x92, 0xe1, 0x3d, 0xe9, 0x8d, 0x36, 0xd1, 0x24, 0x79, 0xe9, 0x8d, 0x68, 0x0f, 0xec, 0xfd, 0x20, + 0x90, 0x01, 0x71, 0x20, 0x3f, 0x09, 0x4f, 0x1b, 0x56, 0xdb, 0xea, 0x54, 0x98, 0x36, 0x09, 0x81, + 0xc2, 0x48, 0x7a, 0xbc, 0x91, 0x6b, 0x5b, 0x1d, 0x9b, 0xa1, 0x4d, 0xbf, 0x5b, 0xb0, 0x7a, 0xc0, + 0xa7, 0x3c, 0x18, 0x8e, 0x19, 0xf7, 0xc7, 0x17, 0x19, 0xb4, 0x0e, 0x14, 0x43, 0x35, 0x54, 0x51, + 0x88, 0xc4, 0xb5, 0xbe, 0xb3, 0xa9, 0x53, 0x22, 0xda, 0xc5, 0xdf, 0x59, 0x12, 0x27, 0x6d, 0xb0, + 0xb9, 0xce, 0xdd, 0xc8, 0xb7, 0xad, 0x4e, 0xb5, 0x0f, 0x08, 0xc4, 0x6a, 0x58, 0x1c, 0x20, 0x4d, + 0x28, 0xf3, 0x8f, 0x7c, 0xa4, 0xc4, 0x84, 0x37, 0x0a, 0x58, 0x86, 0xf1, 0xc9, 0x06, 0xd8, 0x41, + 0x34, 0x15, 0x5e, 0xc3, 0x6e, 0x5b, 0x9d, 0x02, 0x8b, 0x1d, 0xf2, 0x1f, 0x54, 0x42, 0x1e, 0x86, + 0x42, 0xea, 0x48, 0x11, 0xab, 0x9a, 0xff, 0xa0, 0x39, 0x3a, 0x37, 0x6f, 0x94, 0x30, 0x12, 0x3b, + 0x74, 0x17, 0x8a, 0x7b, 0xfc, 0x5c, 0x8c, 0x38, 0x59, 0x83, 0x9c, 0xf0, 0xb0, 0x99, 0x02, 0xcb, + 0xa5, 0xf1, 0xb9, 0x14, 0x5e, 0x0f, 0xc6, 0x1f, 0xaa, 0x33, 0x2c, 0xbb, 0xc2, 0xd0, 0xa6, 0xdb, + 0xb0, 0xaa, 0xbb, 0xe3, 0x8c, 0xbf, 0x8f, 0x78, 0xa8, 0x0c, 0xc6, 0x9a, 0x63, 0x74, 0x37, 0x1e, + 0x57, 0x43, 0x31, 0xe6, 0x1e, 0x3e, 0x58, 0x66, 0xc6, 0xa7, 0x6f, 0x00, 0x12, 0xbe, 0x9e, 0xea, + 0x1d, 0xb0, 0x03, 0x6d, 0x20, 0xbd, 0xda, 0x5f, 0xc7, 0xc9, 0xa4, 0xe7, 0xce, 0xe2, 0x38, 0xf9, + 0x1f, 0x4a, 0x1e, 0x96, 0xae, 0xa7, 0x9d, 0xef, 0x54, 0xfb, 0x55, 0x84, 0xc6, 0xed, 0xb0, 0x59, + 0x8c, 0x1e, 0xc0, 0xfa, 0xb3, 0xa9, 0x50, 0x62, 0x38, 0x16, 0x9f, 0x4c, 0x89, 0x66, 0x80, 0xd6, + 0xd2, 0x01, 0xe6, 0x16, 0x06, 0x48, 0xeb, 0x50, 0x73, 0xa3, 0x93, 0x89, 0x50, 0xc9, 0x23, 0xb4, + 0x07, 0xf5, 0xa7, 0x23, 0x25, 0xce, 0x53, 0xad, 0x37, 0xa1, 0xac, 0xa4, 0x2f, 0xc7, 0xf2, 0xf4, + 0x22, 0x69, 0xdf, 0xf8, 0x74, 0x1b, 0x80, 0x45, 0xd3, 0x9b, 0x2b, 0x48, 0xf3, 0x73, 0x0b, 0xfc, + 0x2e, 0xd4, 0x8e, 0x7d, 0xef, 0x37, 0x93, 0xad, 0x43, 0xdd, 0x3d, 0x8b, 0x94, 0x27, 0x3f, 0xcc, + 0x32, 0xd2, 0x3e, 0x94, 0x5f, 0x04, 0xd2, 0xe7, 0x81, 0x42, 0xe9, 0xbe, 0xe3, 0x33, 0x96, 0x36, + 0x75, 0x3d, 0xe7, 0xc3, 0x71, 0x64, 0xd6, 0x8d, 0x0e, 0x7d, 0x0d, 0x1b, 0x2e, 0x57, 0x09, 0x4d, + 0xf0, 0xf0, 0xa6, 0x15, 0xf7, 0x00, 0x7c, 0x03, 0x4c, 0x56, 0x52, 0xc3, 0x95, 0xcc, 0xd2, 0xb2, + 0x14, 0x80, 0xee, 0x80, 0x33, 0x90, 0xd3, 0xb7, 0xe2, 0x34, 0x0a, 0x4c, 0x47, 0x5d, 0x28, 0x05, + 0xb1, 0x79, 0x65, 0xfb, 0x69, 0x75, 0xb1, 0x19, 0x82, 0x3e, 0x41, 0xd9, 0x05, 0xea, 0x56, 0xe4, + 0xc7, 0x50, 0x75, 0x95, 0xf4, 0x6f, 0x9b, 0x98, 0xf1, 0x90, 0xdf, 0x2e, 0xf1, 0x0e, 0x38, 0x2f, + 0x79, 0x30, 0x11, 0xd3, 0xd4, 0x22, 0xff, 0xe4, 0x81, 0xbb, 0x7d, 0xa8, 0xa6, 0x3e, 0x28, 0xa4, + 0x0a, 0xa5, 0xe3, 0xc3, 0xe7, 0x87, 0x47, 0xaf, 0x0e, 0x9d, 0x15, 0xed, 0xb8, 0xc7, 0x83, 0xc1, + 0xbe, 0xeb, 0x3a, 0x16, 0xa9, 0x80, 0xbd, 0xcf, 0xd8, 0x11, 0x73, 0x72, 0xfd, 0x2f, 0x36, 0xe4, + 0x8f, 0xf6, 0x06, 0xe4, 0x11, 0xc0, 0xfc, 0x16, 0xc8, 0x3f, 0x98, 0xe5, 0xda, 0x71, 0x34, 0xaf, + 0x9f, 0x1c, 0x5d, 0x21, 0x0f, 0xa0, 0x18, 0xab, 0x9f, 0x90, 0xb8, 0xb8, 0xf4, 0x29, 0x64, 0x53, + 0xb6, 0xa0, 0x3c, 0xbb, 0x0f, 0xb2, 0x81, 0x80, 0x85, 0x73, 0xc9, 0xa6, 0x75, 0x21, 0xcf, 0xa2, + 0x29, 0xa9, 0xc7, 0xdf, 0x4e, 0x73, 0x31, 0x4b, 0xcb, 0x8a, 0x8f, 0x22, 0x29, 0xeb, 0xca, 0x85, + 0x2c, 0x2b, 0xab, 0x62, 0x84, 0x47, 0xfe, 0x46, 0xc4, 0xa2, 0x10, 0x9b, 0xf5, 0xf4, 0x02, 0x62, + 0xda, 0x0e, 0xd4, 0xae, 0x9c, 0x02, 0xf9, 0x37, 0xc6, 0x64, 0x9c, 0x47, 0x76, 0xde, 0xfb, 0x50, + 0x3e, 0xe0, 0x0a, 0xdf, 0x24, 0xd7, 0x17, 0x9c, 0x95, 0xb2, 0x07, 0x36, 0x2a, 0x7c, 0x0e, 0x37, + 0x6a, 0xcf, 0x82, 0x77, 0xa1, 0xa0, 0x35, 0x4d, 0x9c, 0x24, 0x64, 0xe4, 0xbd, 0xe4, 0x6d, 0x14, + 0x71, 0xf2, 0x76, 0x5a, 0xd0, 0x59, 0xf0, 0x2d, 0xa8, 0x18, 0xd9, 0x26, 0x43, 0x5b, 0x94, 0x71, + 0x36, 0xad, 0x3c, 0xfb, 0x0c, 0x25, 0x12, 0x58, 0xf8, 0x2a, 0x65, 0x8e, 0x6a, 0xd7, 0xf9, 0x7a, + 0xd9, 0xb2, 0xbe, 0x5d, 0xb6, 0xac, 0x1f, 0x97, 0x2d, 0xeb, 0xf3, 0xcf, 0xd6, 0xca, 0x49, 0x11, + 0xff, 0xb7, 0x1f, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc3, 0x83, 0x01, 0xce, 0x07, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -993,27 +1114,35 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type ODCClient interface { - // Initialize + // Creates a new DDS session or attaches to an existing DDS session. Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Submit agents. Can be called multiple times in order to submit more agents. + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Activate topology. + // Activates a given topology. Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Update topology. Can be called multiple times in order to scale up or down the topology. + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Configure - Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateChangeReply, error) - // Set property - SetProperty(ctx context.Context, in *SetPropertyRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Start - Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateChangeReply, error) - // Stop - Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateChangeReply, error) - // Reset - Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateChangeReply, error) - // Terminate - Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateChangeReply, error) - // Shutdown + // Transitions devices into Ready state. + Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) + // Changes devices configuration. + SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transition devices into Running state. + Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Ready state. + Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Idle state. + Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shutdown DDS session. Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) } @@ -1052,6 +1181,15 @@ func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...g return out, nil } +func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) @@ -1061,8 +1199,8 @@ func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc. return out, nil } -func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { - out := new(StateChangeReply) +func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) if err != nil { return nil, err @@ -1070,17 +1208,26 @@ func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts .. return out, nil } -func (c *oDCClient) SetProperty(ctx context.Context, in *SetPropertyRequest, opts ...grpc.CallOption) (*GeneralReply, error) { +func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/SetProperty", in, out, opts...) + err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { - out := new(StateChangeReply) +func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) if err != nil { return nil, err @@ -1088,8 +1235,8 @@ func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.Ca return out, nil } -func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { - out := new(StateChangeReply) +func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) if err != nil { return nil, err @@ -1097,8 +1244,8 @@ func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.Call return out, nil } -func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { - out := new(StateChangeReply) +func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) if err != nil { return nil, err @@ -1106,8 +1253,8 @@ func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.Ca return out, nil } -func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateChangeReply, error) { - out := new(StateChangeReply) +func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) if err != nil { return nil, err @@ -1126,27 +1273,35 @@ func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...g // ODCServer is the server API for ODC service. type ODCServer interface { - // Initialize + // Creates a new DDS session or attaches to an existing DDS session. Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) - // Submit agents. Can be called multiple times in order to submit more agents. + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). Submit(context.Context, *SubmitRequest) (*GeneralReply, error) - // Activate topology. + // Activates a given topology. Activate(context.Context, *ActivateRequest) (*GeneralReply, error) - // Update topology. Can be called multiple times in order to scale up or down the topology. + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(context.Context, *RunRequest) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. Update(context.Context, *UpdateRequest) (*GeneralReply, error) - // Configure - Configure(context.Context, *ConfigureRequest) (*StateChangeReply, error) - // Set property - SetProperty(context.Context, *SetPropertyRequest) (*GeneralReply, error) - // Start - Start(context.Context, *StartRequest) (*StateChangeReply, error) - // Stop - Stop(context.Context, *StopRequest) (*StateChangeReply, error) - // Reset - Reset(context.Context, *ResetRequest) (*StateChangeReply, error) - // Terminate - Terminate(context.Context, *TerminateRequest) (*StateChangeReply, error) - // Shutdown + // Transitions devices into Ready state. + Configure(context.Context, *ConfigureRequest) (*StateReply, error) + // Changes devices configuration. + SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(context.Context, *StateRequest) (*StateReply, error) + // Transition devices into Running state. + Start(context.Context, *StartRequest) (*StateReply, error) + // Transitions devices into Ready state. + Stop(context.Context, *StopRequest) (*StateReply, error) + // Transitions devices into Idle state. + Reset(context.Context, *ResetRequest) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(context.Context, *TerminateRequest) (*StateReply, error) + // Shutdown DDS session. Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) } @@ -1163,25 +1318,31 @@ func (*UnimplementedODCServer) Submit(ctx context.Context, req *SubmitRequest) ( func (*UnimplementedODCServer) Activate(ctx context.Context, req *ActivateRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") } +func (*UnimplementedODCServer) Run(ctx context.Context, req *RunRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") +} func (*UnimplementedODCServer) Update(ctx context.Context, req *UpdateRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") } -func (*UnimplementedODCServer) Configure(ctx context.Context, req *ConfigureRequest) (*StateChangeReply, error) { +func (*UnimplementedODCServer) Configure(ctx context.Context, req *ConfigureRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") } -func (*UnimplementedODCServer) SetProperty(ctx context.Context, req *SetPropertyRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetProperty not implemented") +func (*UnimplementedODCServer) SetProperties(ctx context.Context, req *SetPropertiesRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") +} +func (*UnimplementedODCServer) GetState(ctx context.Context, req *StateRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") } -func (*UnimplementedODCServer) Start(ctx context.Context, req *StartRequest) (*StateChangeReply, error) { +func (*UnimplementedODCServer) Start(ctx context.Context, req *StartRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") } -func (*UnimplementedODCServer) Stop(ctx context.Context, req *StopRequest) (*StateChangeReply, error) { +func (*UnimplementedODCServer) Stop(ctx context.Context, req *StopRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") } -func (*UnimplementedODCServer) Reset(ctx context.Context, req *ResetRequest) (*StateChangeReply, error) { +func (*UnimplementedODCServer) Reset(ctx context.Context, req *ResetRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") } -func (*UnimplementedODCServer) Terminate(ctx context.Context, req *TerminateRequest) (*StateChangeReply, error) { +func (*UnimplementedODCServer) Terminate(ctx context.Context, req *TerminateRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") } func (*UnimplementedODCServer) Shutdown(ctx context.Context, req *ShutdownRequest) (*GeneralReply, error) { @@ -1246,6 +1407,24 @@ func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Run(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Run", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Run(ctx, req.(*RunRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UpdateRequest) if err := dec(in); err != nil { @@ -1282,20 +1461,38 @@ func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(inter return interceptor(ctx, in, info, handler) } -func _ODC_SetProperty_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetPropertyRequest) +func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetPropertiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).SetProperties(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/SetProperties", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StateRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ODCServer).SetProperty(ctx, in) + return srv.(ODCServer).GetState(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/SetProperty", + FullMethod: "/odc.ODC/GetState", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).SetProperty(ctx, req.(*SetPropertyRequest)) + return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) } return interceptor(ctx, in, info, handler) } @@ -1406,6 +1603,10 @@ var _ODC_serviceDesc = grpc.ServiceDesc{ MethodName: "Activate", Handler: _ODC_Activate_Handler, }, + { + MethodName: "Run", + Handler: _ODC_Run_Handler, + }, { MethodName: "Update", Handler: _ODC_Update_Handler, @@ -1415,8 +1616,12 @@ var _ODC_serviceDesc = grpc.ServiceDesc{ Handler: _ODC_Configure_Handler, }, { - MethodName: "SetProperty", - Handler: _ODC_SetProperty_Handler, + MethodName: "SetProperties", + Handler: _ODC_SetProperties_Handler, + }, + { + MethodName: "GetState", + Handler: _ODC_GetState_Handler, }, { MethodName: "Start", @@ -1506,6 +1711,13 @@ func (m *GeneralReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintOdc(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x3a + } if len(m.Sessionid) > 0 { i -= len(m.Sessionid) copy(dAtA[i:], m.Sessionid) @@ -1596,7 +1808,7 @@ func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *StateChangeRequest) Marshal() (dAtA []byte, err error) { +func (m *StateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1606,12 +1818,12 @@ func (m *StateChangeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StateChangeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *StateRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StateChangeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1640,7 +1852,7 @@ func (m *StateChangeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *StateChangeReply) Marshal() (dAtA []byte, err error) { +func (m *StateReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1650,12 +1862,12 @@ func (m *StateChangeReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StateChangeReply) MarshalTo(dAtA []byte) (int, error) { +func (m *StateReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StateChangeReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1793,6 +2005,45 @@ func (m *ActivateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *RunRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *RunRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *RunRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Topology) > 0 { + i -= len(m.Topology) + copy(dAtA[i:], m.Topology) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) + i-- + dAtA[i] = 0x12 + } + if m.Runid != 0 { + i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + func (m *UpdateRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1854,7 +2105,7 @@ func (m *ShutdownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *SetPropertyRequest) Marshal() (dAtA []byte, err error) { +func (m *Property) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -1864,12 +2115,12 @@ func (m *SetPropertyRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SetPropertyRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Property) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SetPropertyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Property) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -1878,13 +2129,6 @@ func (m *SetPropertyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Path) > 0 { - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x1a - } if len(m.Value) > 0 { i -= len(m.Value) copy(dAtA[i:], m.Value) @@ -1902,6 +2146,54 @@ func (m *SetPropertyRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SetPropertiesRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *SetPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SetPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if len(m.Properties) > 0 { + for iNdEx := len(m.Properties) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Properties[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintOdc(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.Path) > 0 { + i -= len(m.Path) + copy(dAtA[i:], m.Path) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *ConfigureRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -2154,6 +2446,10 @@ func (m *GeneralReply) Size() (n int) { if l > 0 { n += 1 + l + sovOdc(uint64(l)) } + l = len(m.State) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2183,7 +2479,7 @@ func (m *Device) Size() (n int) { return n } -func (m *StateChangeRequest) Size() (n int) { +func (m *StateRequest) Size() (n int) { if m == nil { return 0 } @@ -2202,7 +2498,7 @@ func (m *StateChangeRequest) Size() (n int) { return n } -func (m *StateChangeReply) Size() (n int) { +func (m *StateReply) Size() (n int) { if m == nil { return 0 } @@ -2271,6 +2567,25 @@ func (m *ActivateRequest) Size() (n int) { return n } +func (m *RunRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Runid != 0 { + n += 1 + sovOdc(uint64(m.Runid)) + } + l = len(m.Topology) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *UpdateRequest) Size() (n int) { if m == nil { return 0 @@ -2299,7 +2614,7 @@ func (m *ShutdownRequest) Size() (n int) { return n } -func (m *SetPropertyRequest) Size() (n int) { +func (m *Property) Size() (n int) { if m == nil { return 0 } @@ -2313,10 +2628,28 @@ func (m *SetPropertyRequest) Size() (n int) { if l > 0 { n += 1 + l + sovOdc(uint64(l)) } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SetPropertiesRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l l = len(m.Path) if l > 0 { n += 1 + l + sovOdc(uint64(l)) } + if len(m.Properties) > 0 { + for _, e := range m.Properties { + l = e.Size() + n += 1 + l + sovOdc(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2700,6 +3033,38 @@ func (m *GeneralReply) Unmarshal(dAtA []byte) error { } m.Sessionid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipOdc(dAtA[iNdEx:]) @@ -2862,7 +3227,7 @@ func (m *Device) Unmarshal(dAtA []byte) error { } return nil } -func (m *StateChangeRequest) Unmarshal(dAtA []byte) error { +func (m *StateRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2885,10 +3250,10 @@ func (m *StateChangeRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StateChangeRequest: wiretype end group for non-group") + return fmt.Errorf("proto: StateRequest: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StateChangeRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StateRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -2968,7 +3333,7 @@ func (m *StateChangeRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *StateChangeReply) Unmarshal(dAtA []byte) error { +func (m *StateReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -2991,10 +3356,10 @@ func (m *StateChangeReply) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StateChangeReply: wiretype end group for non-group") + return fmt.Errorf("proto: StateReply: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StateChangeReply: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StateReply: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -3337,6 +3702,111 @@ func (m *ActivateRequest) Unmarshal(dAtA []byte) error { } return nil } +func (m *RunRequest) 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 ErrIntOverflowOdc + } + 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: RunRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: RunRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + } + m.Runid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Runid |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Topology = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *UpdateRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -3477,7 +3947,7 @@ func (m *ShutdownRequest) Unmarshal(dAtA []byte) error { } return nil } -func (m *SetPropertyRequest) Unmarshal(dAtA []byte) error { +func (m *Property) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -3500,10 +3970,10 @@ func (m *SetPropertyRequest) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SetPropertyRequest: wiretype end group for non-group") + return fmt.Errorf("proto: Property: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SetPropertyRequest: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Property: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -3570,7 +4040,61 @@ func (m *SetPropertyRequest) Unmarshal(dAtA []byte) error { } m.Value = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + default: + iNdEx = preIndex + skippy, err := skipOdc(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthOdc + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *SetPropertiesRequest) 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 ErrIntOverflowOdc + } + 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: SetPropertiesRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SetPropertiesRequest: 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) } @@ -3602,6 +4126,40 @@ func (m *SetPropertyRequest) Unmarshal(dAtA []byte) error { } m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Properties = append(m.Properties, &Property{}) + if err := m.Properties[len(m.Properties)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipOdc(dAtA[iNdEx:]) @@ -3686,7 +4244,7 @@ func (m *ConfigureRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &StateChangeRequest{} + m.Request = &StateRequest{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3776,7 +4334,7 @@ func (m *StartRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &StateChangeRequest{} + m.Request = &StateRequest{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3866,7 +4424,7 @@ func (m *StopRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &StateChangeRequest{} + m.Request = &StateRequest{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -3956,7 +4514,7 @@ func (m *ResetRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &StateChangeRequest{} + m.Request = &StateRequest{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err @@ -4046,7 +4604,7 @@ func (m *TerminateRequest) Unmarshal(dAtA []byte) error { return io.ErrUnexpectedEOF } if m.Request == nil { - m.Request = &StateChangeRequest{} + m.Request = &StateRequest{} } if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto index c056dc23e..822db6923 100644 --- a/odcshim/odcprotos/odc.proto +++ b/odcshim/odcprotos/odc.proto @@ -3,71 +3,86 @@ syntax = "proto3"; package odc; // The ODC service definition. +// For details also see https://github.com/FairRootGroup/ODC#command-mapping service ODC { - // Initialize + // Creates a new DDS session or attaches to an existing DDS session. rpc Initialize (InitializeRequest) returns (GeneralReply) {} - // Submit agents. Can be called multiple times in order to submit more agents. + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). rpc Submit (SubmitRequest) returns (GeneralReply) {} - // Activate topology. + // Activates a given topology. rpc Activate (ActivateRequest) returns (GeneralReply) {} - // Update topology. Can be called multiple times in order to scale up or down the topology. + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + rpc Run (RunRequest) returns (GeneralReply) {} + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. rpc Update (UpdateRequest) returns (GeneralReply) {} - // Configure - rpc Configure (ConfigureRequest) returns (StateChangeReply) {} - // Set property - rpc SetProperty (SetPropertyRequest) returns (GeneralReply) {} - // Start - rpc Start (StartRequest) returns (StateChangeReply) {} - // Stop - rpc Stop (StopRequest) returns (StateChangeReply) {} - // Reset - rpc Reset (ResetRequest) returns (StateChangeReply) {} - // Terminate - rpc Terminate (TerminateRequest) returns (StateChangeReply) {} - // Shutdown + // Transitions devices into Ready state. + rpc Configure (ConfigureRequest) returns (StateReply) {} + // Changes devices configuration. + rpc SetProperties (SetPropertiesRequest) returns (GeneralReply) {} + // Get current aggregated state of devices. + rpc GetState (StateRequest) returns (StateReply) {} + // Transition devices into Running state. + rpc Start (StartRequest) returns (StateReply) {} + // Transitions devices into Ready state. + rpc Stop (StopRequest) returns (StateReply) {} + // Transitions devices into Idle state. + rpc Reset (ResetRequest) returns (StateReply) {} + // Shuts devices down via End transition. + rpc Terminate (TerminateRequest) returns (StateReply) {} + // Shutdown DDS session. rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} } // Request status enum ReplyStatus { - UNKNOWN = 0; - SUCCESS = 1; - ERROR = 2; + UNKNOWN = 0; // Status is unknown + SUCCESS = 1; // Request performed successfully + ERROR = 2; // Failed to perform request } // General error message Error { - string msg = 1; - int32 code = 2; + string msg = 1; // Detailed error message + int32 code = 2; // Error code. + // TODO: Make error codes specific for each concrete request and/or error type. + // TODO: Add link to a documented error codes. } // General reply to requests message GeneralReply { - string msg = 1; - ReplyStatus status = 2; - Error error = 3; - int32 exectime = 4; // Execution time in ms - uint64 runid = 5; - string sessionid = 6; -} - -// Device path + string msg = 1; // Detailed reply message + ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) + Error error = 3; // If status is ERROR than this field containes error description otherwise it's empty + int32 exectime = 4; // Request execution time in ms + uint64 runid = 5; // TODO: run ID from ECS, check if we need it in ODC + string sessionid = 6; // DDS session ID + // TODO: FIXME: find a better undefined state value, for the moment there is no undefined state in FairMQ + string state = 7; // if successfull than contains an aggregated FairMQ device state, otherwise TODO: FIXME: "OK". +} + +// Device information +// Runtime task ID and path are the same as in DDS. +// To get task details use DDS Topology API. message Device { - uint64 id = 1; - string state = 2; - string path = 3; + uint64 id = 1; // Runtime task ID (same as in DDS) + string state = 2; // FairMQ device state as string + string path = 3; // Runtime task path (same as in DDS) } -// State change request -message StateChangeRequest { - string path = 1; - bool detailed = 2; +// Device change/get state request +message StateRequest { + string path = 1; // Task path in the DDS topology. Can be a regular expression. + bool detailed = 2; // If true than a list of affected devices is populated in the reply. } -// State change reply -message StateChangeReply { - GeneralReply reply = 1; - repeated Device devices = 2; +// Device change/get state reply +message StateReply { + GeneralReply reply = 1; // Genaral reply. See GeneralReply message for details. + repeated Device devices = 2; // If detailed reply is requested than this field contains a list of affected devices otherwise it's empty. } // @@ -76,35 +91,46 @@ message StateChangeReply { // Initialize request message InitializeRequest { - uint64 runid = 1; - string sessionid = 2; + uint64 runid = 1; // TODO: run ID from ECS, check if we need it in ODC + string sessionid = 2; // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. } // Submit request message SubmitRequest { - // TODO: Add request parameters here + // No configuration parameters required for this request } // Activate request message ActivateRequest { - string topology = 1; + string topology = 1; // Filepath to a DDS topology file +} + +// Run request +message RunRequest { + uint64 runid = 1; // TODO: run ID from ECS, check if we need it in ODC + string topology = 2; // Filepath to a DDS topology file } // Update request message UpdateRequest { - string topology = 1; + string topology = 1; // Filepath to a DDS topology file } // Shutdown request message ShutdownRequest { - // TODO: Add request parameters here + // No configuration parameters required for this request } -// Set property request -message SetPropertyRequest { - string key = 1; - string value = 2; - string path = 3; +// Key-Value property +message Property { + string key = 1; // Property key + string value = 2; // Property value +} + +// Set properties request +message SetPropertiesRequest { + string path = 1; // Task path in the DDS topology. Can be a regular expression. + repeated Property properties = 2; // List of properties to be set } // @@ -113,25 +139,25 @@ message SetPropertyRequest { // Configure request message ConfigureRequest { - StateChangeRequest request = 1; + StateRequest request = 1; // State change request. See StateRequest for details. } // Start request message StartRequest { - StateChangeRequest request = 1; + StateRequest request = 1; // State change request. See StateRequest for details. } // Stop request message StopRequest { - StateChangeRequest request = 1; + StateRequest request = 1; // State change request. See StateRequest for details. } // Reset request message ResetRequest { - StateChangeRequest request = 1; + StateRequest request = 1; // State change request. See StateRequest for details. } // Terminate request message TerminateRequest { - StateChangeRequest request = 1; -} + StateRequest request = 1; // State change request. See StateRequest for details. +} \ No newline at end of file From 841985fbd9d0643590c3a50098cd2690458320be Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Jul 2020 17:10:28 +0200 Subject: [PATCH 0300/2352] [odcshim] Use RUN instead of lower level API + refactor OCC handler --- odcshim/occserver/handlers.go | 160 +++++++++++++++++++++ odcshim/occserver/occserver.go | 246 ++++----------------------------- 2 files changed, 184 insertions(+), 222 deletions(-) create mode 100644 odcshim/occserver/handlers.go diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go new file mode 100644 index 000000000..6fa74dd2a --- /dev/null +++ b/odcshim/occserver/handlers.go @@ -0,0 +1,160 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package occserver + +import ( + "context" + "errors" + "fmt" + + "github.com/AliceO2Group/Control/odcshim/odcclient" + odc "github.com/AliceO2Group/Control/odcshim/odcprotos" + pb "github.com/AliceO2Group/Control/odcshim/protos" + "github.com/k0kubun/pp" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Configure + var topology string + configureMap := make(map[string]string) + for _, entry := range arguments { + if entry.Key == "topology" { + topology = entry.Value + } else { + configureMap[entry.Key] = entry.Value + } + } + + // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE + runRequest := &odc.RunRequest{ + Topology: topology, + } + + var err error = nil + var runResponse *odc.GeneralReply + + runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + grpcStatus, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + "ppStatus": pp.Sprint(grpcStatus), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) + } else { + err = errors.New("invalid gRPC grpcStatus") + log.WithField("error", "invalid gRPC grpcStatus").Error("transition call error") + } + return err + } + + if runResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := runResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := runResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": runResponse.Msg, + "odcStatus": runResponse.Status.String(), + "odcExectime": runResponse.Exectime, + "odcRunid": runResponse.Runid, + "odcSessionid": runResponse.Sessionid, + }). + Debug("call to ODC complete") + + + // FIXME: implement SetProperty calls before Configure + + // CONFIGURE + configureRequest := &odc.ConfigureRequest{ + Request: &odc.StateRequest{ + Path: "", + Detailed: false, + }, + } + + var configureResponse *odc.StateReply + configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) + if err != nil { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + grpcStatus, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + "ppStatus": pp.Sprint(grpcStatus), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return err + } + + if configureResponse == nil || configureResponse.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := configureResponse.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := configureResponse.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "odcRunid": configureResponse.Reply.Runid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} \ No newline at end of file diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go index 8f0fc1a5d..59ee1356e 100644 --- a/odcshim/occserver/occserver.go +++ b/odcshim/occserver/occserver.go @@ -25,19 +25,16 @@ package occserver import ( - "errors" + "context" "fmt" "runtime" "time" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/odcshim/odcclient" - odc "github.com/AliceO2Group/Control/odcshim/odcprotos" pb "github.com/AliceO2Group/Control/odcshim/protos" - "github.com/k0kubun/pp" "github.com/sirupsen/logrus" "github.com/spf13/viper" - "golang.org/x/net/context" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" @@ -112,231 +109,36 @@ func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionReques if req == nil { return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") } - switch event := req.TransitionEvent; event { - case "CONFIGURE": - if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { - err := s.ensureClientConnected() - if err != nil { - log.WithError(err). - WithFields(logrus.Fields{ - "host": s.odcHost, - "port": s.odcPort, - }). - Error("cannot connect to ODC endpoint") - return nil, err - } - } - - // Extract relevant parameters from Arguments payload - // and build payload for SetProperty+Configure - var envId string - var topology string - configureMap := make(map[string]string) - for _, entry := range req.Arguments { - if entry.Key == "environment_id" { - envId = entry.Value - } else if entry.Key == "topology" { - topology = entry.Value - } else { - configureMap[entry.Key] = entry.Value - } - - } - - // Provisional response - rep := &pb.TransitionReply{ - Trigger: pb.StateChangeTrigger_EXECUTOR, - State: req.SrcState, - TransitionEvent: req.TransitionEvent, - Ok: false, - } - - // INITIALIZE - initializeRequest := &odc.InitializeRequest{ - Runid: 0, //FIXME: not available at this time - Sessionid: envId, - } - - initializeResponse, err := s.odcClient.Initialize(ctx, initializeRequest, grpc.EmptyCallOption{}) - if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - status, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": status.Code().String(), - "message": status.Message(), - "details": status.Details(), - "error": status.Err().Error(), - "ppStatus": pp.Sprint(status), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } - return nil, err - } - - if initializeResponse != nil { - if odcErr := initializeResponse.GetError(); odcErr != nil { - return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := initializeResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": initializeResponse.Msg, - "odcStatus": initializeResponse.Status.String(), - "odcExectime": initializeResponse.Exectime, - "odcRunid": initializeResponse.Runid, - "odcSessionid": initializeResponse.Sessionid, - }). - Debug("call to ODC complete") - } - - // SUBMIT - submitRequest := &odc.SubmitRequest{} - - submitResponse, err := s.odcClient.Submit(ctx, submitRequest, grpc.EmptyCallOption{}) - if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - status, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": status.Code().String(), - "message": status.Message(), - "details": status.Details(), - "error": status.Err().Error(), - "ppStatus": pp.Sprint(status), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } - return nil, err - } - if submitResponse != nil { - if odcErr := submitResponse.GetError(); odcErr != nil { - return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := submitResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": submitResponse.Msg, - "odcStatus": submitResponse.Status.String(), - "odcExectime": submitResponse.Exectime, - "odcRunid": submitResponse.Runid, - "odcSessionid": submitResponse.Sessionid, - }). - Debug("call to ODC complete") - } - - // ACTIVATE - activateRequest := &odc.ActivateRequest{ - Topology: topology, - } + // Provisional response + rep := &pb.TransitionReply{ + Trigger: pb.StateChangeTrigger_EXECUTOR, + State: req.SrcState, + TransitionEvent: req.TransitionEvent, + Ok: false, + } - activateResponse, err := s.odcClient.Activate(ctx, activateRequest, grpc.EmptyCallOption{}) + if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { + err := s.ensureClientConnected() if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - status, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": status.Code().String(), - "message": status.Message(), - "details": status.Details(), - "error": status.Err().Error(), - "ppStatus": pp.Sprint(status), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } - return nil, err - } - - if activateResponse != nil { - if odcErr := activateResponse.GetError(); odcErr != nil { - return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := activateResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": activateResponse.Msg, - "odcStatus": activateResponse.Status.String(), - "odcExectime": activateResponse.Exectime, - "odcRunid": activateResponse.Runid, - "odcSessionid": activateResponse.Sessionid, + log.WithError(err). + WithFields(logrus.Fields{ + "host": s.odcHost, + "port": s.odcPort, }). - Debug("call to ODC complete") - } - - // FIXME: implement SetProperty calls before Configure - - // CONFIGURE - configureRequest := &odc.ConfigureRequest{ - Request: &odc.StateChangeRequest{ - Path: "", - Detailed: false, - }, - } - - configureResponse, err := s.odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) - if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - status, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": status.Code().String(), - "message": status.Message(), - "details": status.Details(), - "error": status.Err().Error(), - "ppStatus": pp.Sprint(status), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", status.Code().String(), status.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } + Error("cannot connect to ODC endpoint") return nil, err } + } - if configureResponse != nil && configureResponse.Reply != nil { - if odcErr := configureResponse.Reply.GetError(); odcErr != nil { - return rep, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := configureResponse.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return rep, fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "odcRunid": configureResponse.Reply.Runid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). - Debug("call to ODC complete") + var err error = nil + switch event := req.TransitionEvent; event { + case "CONFIGURE": + err = handleConfigure(ctx, s.odcClient, req.Arguments) + if err == nil { + rep.Ok = true + rep.State = "CONFIGURED" } - - - } - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") + return rep, err } From 727900c2ef2a00bbd1de0716424509dcf4da79d0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Jul 2020 17:46:19 +0200 Subject: [PATCH 0301/2352] [odcshim] Do SetProperties before Configure --- odcshim/occserver/handlers.go | 101 +++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go index 6fa74dd2a..dcd687a6a 100644 --- a/odcshim/occserver/handlers.go +++ b/odcshim/occserver/handlers.go @@ -61,25 +61,7 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - grpcStatus, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": grpcStatus.Code().String(), - "message": grpcStatus.Message(), - "details": grpcStatus.Details(), - "error": grpcStatus.Err().Error(), - "ppStatus": pp.Sprint(grpcStatus), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) - } else { - err = errors.New("invalid gRPC grpcStatus") - log.WithField("error", "invalid gRPC grpcStatus").Error("transition call error") - } - return err + return printGrpcError(err) } if runResponse == nil { @@ -102,8 +84,45 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume }). Debug("call to ODC complete") + // SetProperties before CONFIGURE + setPropertiesRequest := &odc.SetPropertiesRequest{ + Path: "", + Properties: make([]*odc.Property, len(configureMap)), + } + i := 0 + for k, v := range configureMap { + setPropertiesRequest.Properties[i] = &odc.Property{ + Key: k, + Value: v, + } + i++ + } + var setPropertiesResponse *odc.GeneralReply + setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if setPropertiesResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := setPropertiesResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "odcRunid": setPropertiesResponse.Runid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). + Debug("call to ODC complete") - // FIXME: implement SetProperty calls before Configure // CONFIGURE configureRequest := &odc.ConfigureRequest{ @@ -116,25 +135,7 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume var configureResponse *odc.StateReply configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. - grpcStatus, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": grpcStatus.Code().String(), - "message": grpcStatus.Message(), - "details": grpcStatus.Details(), - "error": grpcStatus.Err().Error(), - "ppStatus": pp.Sprint(grpcStatus), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), status.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } - return err + return printGrpcError(err) } if configureResponse == nil || configureResponse.Reply == nil { @@ -157,4 +158,26 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume }). Debug("call to ODC complete") return err +} + +func printGrpcError(err error) error { + // We must process the error explicitly here, otherwise we get an error because gRPC's + // Status is different from what gogoproto expects. + grpcStatus, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + "ppStatus": pp.Sprint(grpcStatus), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), status.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return err } \ No newline at end of file From 6301d09c6e4b4edbe613953cc7b302c42f7ccbca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jul 2020 17:04:08 +0200 Subject: [PATCH 0302/2352] [build] Add o2-aliecs-odc-shim to Makefile --- Makefile | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 86249332a..263608f71 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ # === This file is part of ALICE O² === # -# Copyright 2017-2018 CERN and copyright holders of ALICE O². +# Copyright 2017-2020 CERN and copyright holders of ALICE O². # Author: Teo Mrnjavac # -# Based on Torus project Makefile +# Partially derived from Torus Makefile # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -42,17 +42,18 @@ ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto VERBOSE_1 := -v VERBOSE_2 := -v -x -WHAT := o2control-core o2control-executor coconut peanut +WHAT := o2control-core o2control-executor coconut peanut o2-aliecs-odc-shim WHAT_o2control-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2control-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_o2-aliecs-odc-shim_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim -SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut +SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product From f7d4644b648bfa764cb75ef1c5d48f6a95e9d9ef Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jul 2020 18:02:33 +0200 Subject: [PATCH 0303/2352] [odcshim] Topology provided as env var + implement remaining commands --- odcshim/occserver/handlers.go | 257 +++++++++++++++++++++++++++++++-- odcshim/occserver/occserver.go | 108 ++++++++++++-- odcshim/odcshim.go | 3 +- 3 files changed, 342 insertions(+), 26 deletions(-) diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go index dcd687a6a..ed48eb25c 100644 --- a/odcshim/occserver/handlers.go +++ b/odcshim/occserver/handlers.go @@ -38,20 +38,242 @@ import ( "google.golang.org/grpc/status" ) -func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { - // Extract relevant parameters from Arguments payload - // and build payload for SetProperty+Configure +func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string, error) { + req := &odc.StateRequest{ + Path: "", + Detailed: false, + } + + var ( + err error = nil + newState = "UNKNOWN" + rep *odc.StateReply + ) + + rep, err = odcClient.GetState(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return newState, printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return newState, errors.New("nil response error") + } + + newState = rep.Reply.State + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return newState, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return newState, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Runid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return newState, err +} + +func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + req := &odc.StartRequest{ + Request: &odc.StateRequest{ + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odc.StateReply + + rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Runid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + req := &odc.StopRequest{ + Request: &odc.StateRequest{ + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odc.StateReply + + rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Runid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + req := &odc.ResetRequest{ + Request: &odc.StateRequest{ + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odc.StateReply + + rep, err = odcClient.Reset(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Runid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + // TERMINATE + req := &odc.TerminateRequest{ + Request: &odc.StateRequest{ + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odc.StateReply + + rep, err = odcClient.Terminate(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Runid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + + // SHUTDOWN + shutdownRequest := &odc.ShutdownRequest{} + + var shutdownResponse *odc.GeneralReply + shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if shutdownResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := shutdownResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := shutdownResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": shutdownResponse.Msg, + "odcStatus": shutdownResponse.Status.String(), + "odcExectime": shutdownResponse.Exectime, + "odcRunid": shutdownResponse.Runid, + "odcSessionid": shutdownResponse.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE var topology string - configureMap := make(map[string]string) for _, entry := range arguments { if entry.Key == "topology" { topology = entry.Value - } else { - configureMap[entry.Key] = entry.Value } } - // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE + if len(topology) == 0 { + return errors.New("empty topology received") + } + runRequest := &odc.RunRequest{ Topology: topology, } @@ -83,20 +305,27 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume "odcSessionid": runResponse.Sessionid, }). Debug("call to ODC complete") + return err +} + +func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { // SetProperties before CONFIGURE setPropertiesRequest := &odc.SetPropertiesRequest{ Path: "", - Properties: make([]*odc.Property, len(configureMap)), + Properties: make([]*odc.Property, len(arguments)), } - i := 0 - for k, v := range configureMap { + + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Configure + for i, entry := range arguments { setPropertiesRequest.Properties[i] = &odc.Property{ - Key: k, - Value: v, + Key: entry.Key, + Value: entry.Value, } - i++ } + + var err error = nil var setPropertiesResponse *odc.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { @@ -174,7 +403,7 @@ func printGrpcError(err error) error { "ppErr": pp.Sprint(err), }). Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), status.Message()) + err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) } else { err = errors.New("invalid gRPC status") log.WithField("error", "invalid gRPC status").Error("transition call error") diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go index 59ee1356e..9f62947e6 100644 --- a/odcshim/occserver/occserver.go +++ b/odcshim/occserver/occserver.go @@ -27,7 +27,9 @@ package occserver import ( "context" "fmt" + "os" "runtime" + "strings" "time" "github.com/AliceO2Group/Control/common/logger" @@ -49,13 +51,29 @@ const CALL_TIMEOUT = 60*time.Second type OccServerImpl struct { odcHost string odcPort int + topology string odcClient *odcclient.RpcClient } +func (s *OccServerImpl) disconnectAndTerminate() { + _ = s.odcClient.Close() + s.odcClient = nil + + // We sleep half a second so gRPC can send the EXIT response, and then quit + time.Sleep(500*time.Millisecond) + os.Exit(0) +} + func (s *OccServerImpl) ensureClientConnected() error { - // create the clientconn - // instantiate the odcClient and Initialize - // report error or nil + // If we're already connected we assume all is well & return nil + if s.odcClient != nil && s.odcClient.GetConnState() == connectivity.Ready { + return nil + } + + // Otherwise we need to connect & deploy the topology. Specifically: + // * create the clientconn + // * instantiate the odcClient and RUN + // * report error or nil endpoint := fmt.Sprintf("%s:%d", s.odcHost, s.odcPort) cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) @@ -64,14 +82,20 @@ func (s *OccServerImpl) ensureClientConnected() error { if s.odcClient == nil { return fmt.Errorf("cannot dial ODC endpoint: %s", endpoint) } - return nil + + err := handleRun(cxt, s.odcClient, []*pb.ConfigEntry{{ + Key: "topology", + Value: s.topology, + }}) + return err } -func NewServer(host string, port int) *grpc.Server { +func NewServer(host string, port int, topology string) *grpc.Server { grpcServer := grpc.NewServer() srvImpl := &OccServerImpl{ odcHost: host, odcPort: port, + topology: topology, } pb.RegisterOccServer(grpcServer, srvImpl) // Register reflection service on gRPC server. @@ -96,16 +120,51 @@ func (s *OccServerImpl) logMethod() { Debug("handling RPC request") } -func (*OccServerImpl) EventStream(req *pb.EventStreamRequest, srv pb.Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +// FIXME: this is a dummy implementation +func (s *OccServerImpl) EventStream(req *pb.EventStreamRequest, srv pb.Occ_EventStreamServer) error { + s.logMethod() + ctx := srv.Context() + for { + select { + // FIXME: make a channel s.eventCh and receive events from all over the place + //case event := <- s.eventCh: + //err := srv.Send(event) + //if err != nil { + // return err + //} + case <-ctx.Done(): + return ctx.Err() + } + } } -func (*OccServerImpl) StateStream(req *pb.StateStreamRequest, srv pb.Occ_StateStreamServer) error { +func (s *OccServerImpl) StateStream(req *pb.StateStreamRequest, srv pb.Occ_StateStreamServer) error { + s.logMethod() return status.Errorf(codes.Unimplemented, "method StateStream not implemented") } -func (*OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) (*pb.GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +func (s *OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) (*pb.GetStateReply, error) { + s.logMethod() + if req == nil { + return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") + } + + if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { + return nil, status.Errorf(codes.Internal, "ODC not connected") + } + + // Provisional response + rep := &pb.GetStateReply{ + State: "UNKNOWN", + } + + newState, err := handleGetState(ctx, s.odcClient) + if err == nil { + rep.State = newState + } + return rep, err } + func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionRequest) (*pb.TransitionReply, error) { + s.logMethod() if req == nil { return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") } @@ -132,13 +191,40 @@ func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionReques } var err error = nil - switch event := req.TransitionEvent; event { + switch event := strings.ToUpper(req.TransitionEvent); event { case "CONFIGURE": err = handleConfigure(ctx, s.odcClient, req.Arguments) if err == nil { rep.Ok = true rep.State = "CONFIGURED" } + case "START": + err = handleStart(ctx, s.odcClient, req.Arguments) + if err == nil { + rep.Ok = true + rep.State = "RUNNING" + } + case "STOP": + err = handleStop(ctx, s.odcClient, req.Arguments) + if err == nil { + rep.Ok = true + rep.State = "CONFIGURED" + } + case "RESET": + err = handleReset(ctx, s.odcClient, req.Arguments) + if err == nil { + rep.Ok = true + rep.State = "STANDBY" + } + case "EXIT": + err = handleExit(ctx, s.odcClient, req.Arguments) + if err == nil { + rep.Ok = true + rep.State = "DONE" + } + go s.disconnectAndTerminate() + default: + rep.State = "UNDEFINED" } return rep, err } diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go index 4f392bb67..85fb5c8f3 100644 --- a/odcshim/odcshim.go +++ b/odcshim/odcshim.go @@ -70,8 +70,9 @@ func Run() (err error) { host := viper.GetString("odcHost") port := viper.GetInt("odcPort") occPort := os.Getenv("OCC_CONTROL_PORT") + topology := os.Getenv("ODC_TOPOLOGY") - server := occserver.NewServer(host, port) + server := occserver.NewServer(host, port, topology) if server == nil { return fmt.Errorf("cannot start OCC-ODC bridge to %s:%d", host, port) } From faa438132e12e44359f82c39b6506925d72e77e3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 17 Jul 2020 12:12:14 +0200 Subject: [PATCH 0304/2352] [core] Export GetConfig function in all template environments --- core/task/task.go | 1 - core/workflow/template/fields.go | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index 59dd1fc3b..ec401383b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -351,7 +351,6 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand } objStack := make(map[string]interface{}) - objStack["GetConfig"] = template.MakeGetConfigFunc(varStack) objStack["ToPtree"] = template.MakeToPtreeFunc(varStack, propMap) fields := template.WrapMapItems(propMap) diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index 4cef46f4f..db5bf4a0a 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -187,6 +187,7 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS for k, v := range strOpStack { environment[k] = v } + environment["GetConfig"] = MakeGetConfigFunc(varStack) for _, field := range fields { buf := new(bytes.Buffer) From a57ecf3a90a68baa036801aec06993ac6a353244 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Jul 2020 16:38:24 +0200 Subject: [PATCH 0305/2352] [odcshim] Set debug level --- cmd/o2-aliecs-odc-shim/main.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/o2-aliecs-odc-shim/main.go b/cmd/o2-aliecs-odc-shim/main.go index 73ef02578..1ac581ec4 100644 --- a/cmd/o2-aliecs-odc-shim/main.go +++ b/cmd/o2-aliecs-odc-shim/main.go @@ -33,6 +33,8 @@ import ( var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") func main() { + logrus.SetLevel(logrus.DebugLevel) + if err := odcshim.Run(); err != nil { log.Fatal(err) } From c057c634d906ba369c321edf07e289f3405764da Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Jul 2020 16:40:14 +0200 Subject: [PATCH 0306/2352] [odcshim] Fix command line flags --- odcshim/odcshim.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go index 85fb5c8f3..a2bcefe2b 100644 --- a/odcshim/odcshim.go +++ b/odcshim/odcshim.go @@ -50,9 +50,9 @@ func setDefaults() error { } func setFlags() error { - pflag.Int("occPort", viper.GetInt("occPort"), "OCC control port") - pflag.IntP("odcPort", "p", viper.GetInt("odcPort"), "Remote ODC server port") - pflag.StringP("odcHost", "h", viper.GetString("odcHost"), "Remote ODC server hostname") + pflag.String("control-port", viper.GetString("control-port"), "OCC control port") + pflag.Int("odcPort", viper.GetInt("odcPort"), "Remote ODC server port") + pflag.String("odcHost", viper.GetString("odcHost"), "Remote ODC server hostname") pflag.BoolP("verbose", "v", viper.GetBool("verbose"), "Verbose logging") pflag.Parse() @@ -69,7 +69,10 @@ func Run() (err error) { host := viper.GetString("odcHost") port := viper.GetInt("odcPort") - occPort := os.Getenv("OCC_CONTROL_PORT") + occPort := viper.GetString("control-port") + if len(occPort) == 0 { + occPort = os.Getenv("OCC_CONTROL_PORT") + } topology := os.Getenv("ODC_TOPOLOGY") server := occserver.NewServer(host, port, topology) From a0caa9e50b139fb78d94f0b1e35af586642b7e70 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Jul 2020 16:44:09 +0200 Subject: [PATCH 0307/2352] [peanut] Simulate run number --- occ/peanut/peanut.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index e9e0243df..30098a0d3 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -31,6 +31,7 @@ import ( "io/ioutil" "os" "strconv" + "time" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/executor/executorcmd" @@ -67,6 +68,14 @@ func transition(evt string) error { args = append(args, &pb.ConfigEntry{Key: k, Value: v}) } + // We simulate a new run number on every START event + if evt == "START" { + args = append(args, &pb.ConfigEntry{ + Key: "runNumber", + Value: time.Now().Format("0102150405"), + }) + } + response, err := rpcClient.Transition(context.TODO(), &pb.TransitionRequest{ TransitionEvent: evt, Arguments: args, From 9ad4550d7531adadede42bd29b605068df4cbd52 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jul 2020 16:59:28 +0200 Subject: [PATCH 0308/2352] [odcshim] AliECS<->ODC state conversion facilities --- odcshim/occserver/state.go | 60 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 odcshim/occserver/state.go diff --git a/odcshim/occserver/state.go b/odcshim/occserver/state.go new file mode 100644 index 000000000..8c06a0850 --- /dev/null +++ b/odcshim/occserver/state.go @@ -0,0 +1,60 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package occserver + +import "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" + +var( + stateMap = map[string]string{ + "STANDBY": fairmq.IDLE, + "CONFIGURED": fairmq.READY, + "RUNNING": fairmq.RUNNING, + "ERROR": fairmq.ERROR, + "DONE": fairmq.EXITING, + } + invStateMap = func() (inv map[string]string) { // invert stateMap + inv = make(map[string]string, len(stateMap)) + for k, v := range stateMap { + inv[v] = k + } + return + }() +) + +func odcStateForState(stateName string) string { + fmqState, ok := stateMap[stateName] + if !ok { + return "" + } + return fmqState +} + +func stateForOdcState(fmqStateName string) string { + state, ok := invStateMap[fmqStateName] + if !ok { + return "" + } + return state +} From 23c26dcb1af7dc5700c3d7808419fe3397129340 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jul 2020 17:06:26 +0200 Subject: [PATCH 0309/2352] [odcshim] Correctly report ODC state --- odcshim/occserver/handlers.go | 9 ++++++--- odcshim/occserver/occserver.go | 13 ++++++++++++- odcshim/odcclient/odcclient.go | 3 +++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go index ed48eb25c..d5a72f79b 100644 --- a/odcshim/occserver/handlers.go +++ b/odcshim/occserver/handlers.go @@ -74,9 +74,10 @@ func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string "odcExectime": rep.Reply.Exectime, "odcRunid": rep.Reply.Runid, "odcSessionid": rep.Reply.Sessionid, + "odcState": rep.Reply.State, }). Debug("call to ODC complete") - return newState, err + return stateForOdcState(newState), err } func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { @@ -262,6 +263,8 @@ func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments [ } func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + log.Trace("BEGIN handleRun") + defer log.Trace("END handleRun") // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE var topology string for _, entry := range arguments { @@ -292,10 +295,10 @@ func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments [] } if odcErr := runResponse.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) } if replyStatus := runResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) + return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) } log.WithFields(logrus.Fields{ "odcMsg": runResponse.Msg, diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go index 9f62947e6..193de6d55 100644 --- a/odcshim/occserver/occserver.go +++ b/odcshim/occserver/occserver.go @@ -46,7 +46,7 @@ import ( var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") -const CALL_TIMEOUT = 60*time.Second +const CALL_TIMEOUT = 30*time.Second type OccServerImpl struct { odcHost string @@ -65,6 +65,8 @@ func (s *OccServerImpl) disconnectAndTerminate() { } func (s *OccServerImpl) ensureClientConnected() error { + log.Trace("BEGIN ensureClientConnected") + defer log.Trace("END ensureClientConnected") // If we're already connected we assume all is well & return nil if s.odcClient != nil && s.odcClient.GetConnState() == connectivity.Ready { return nil @@ -101,6 +103,15 @@ func NewServer(host string, port int, topology string) *grpc.Server { // Register reflection service on gRPC server. reflection.Register(grpcServer) + go func() { + err := srvImpl.ensureClientConnected() + if err != nil { + log.WithError(err).Error("ODC client cannot connect") + return + } + log.Info("ODC client connected") + }() + return grpcServer } diff --git a/odcshim/odcclient/odcclient.go b/odcshim/odcclient/odcclient.go index b09c50646..9705c7910 100644 --- a/odcshim/odcclient/odcclient.go +++ b/odcshim/odcclient/odcclient.go @@ -42,6 +42,9 @@ type RpcClient struct { } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing odcClient") conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.WithField("error", err.Error()). From c77c1018ad7a4eff29650a260f42618f8c43add1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jul 2020 17:10:18 +0200 Subject: [PATCH 0310/2352] [odcshim] Update proto --- odcshim/odcprotos/odc.pb.go | 21 ++++++++++----------- odcshim/odcprotos/odc.proto | 17 ++++++++--------- 2 files changed, 18 insertions(+), 20 deletions(-) diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 8eb5bbf67..b26eaf087 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -113,17 +113,16 @@ func (m *Error) GetCode() int32 { // General reply to requests type GeneralReply struct { - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` - Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` - Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` - Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` - Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` - // TODO: FIXME: find a better undefined state value, for the moment there is no undefined state in FairMQ - State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` + Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` + Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` + State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *GeneralReply) Reset() { *m = GeneralReply{} } diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto index 822db6923..bd4d531ef 100644 --- a/odcshim/odcprotos/odc.proto +++ b/odcshim/odcprotos/odc.proto @@ -48,20 +48,19 @@ enum ReplyStatus { message Error { string msg = 1; // Detailed error message int32 code = 2; // Error code. - // TODO: Make error codes specific for each concrete request and/or error type. - // TODO: Add link to a documented error codes. + // TODO: Make error codes specific for each concrete request and/or error type. + // TODO: Add link to a documented error codes. } // General reply to requests message GeneralReply { string msg = 1; // Detailed reply message ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) - Error error = 3; // If status is ERROR than this field containes error description otherwise it's empty + Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty int32 exectime = 4; // Request execution time in ms uint64 runid = 5; // TODO: run ID from ECS, check if we need it in ODC string sessionid = 6; // DDS session ID - // TODO: FIXME: find a better undefined state value, for the moment there is no undefined state in FairMQ - string state = 7; // if successfull than contains an aggregated FairMQ device state, otherwise TODO: FIXME: "OK". + string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. } // Device information @@ -76,13 +75,13 @@ message Device { // Device change/get state request message StateRequest { string path = 1; // Task path in the DDS topology. Can be a regular expression. - bool detailed = 2; // If true than a list of affected devices is populated in the reply. + bool detailed = 2; // If true then a list of affected devices is populated in the reply. } // Device change/get state reply message StateReply { - GeneralReply reply = 1; // Genaral reply. See GeneralReply message for details. - repeated Device devices = 2; // If detailed reply is requested than this field contains a list of affected devices otherwise it's empty. + GeneralReply reply = 1; // General reply. See GeneralReply message for details. + repeated Device devices = 2; // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. } // @@ -160,4 +159,4 @@ message ResetRequest { // Terminate request message TerminateRequest { StateRequest request = 1; // State change request. See StateRequest for details. -} \ No newline at end of file +} From 592c6a661ac4524ab5812f33f5941fa6d487e4e1 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 22 Jul 2020 18:14:29 +0300 Subject: [PATCH 0311/2352] [executor] kill process using PID from OCC --- executor/executable/controllabletask.go | 26 ++++++++--- executor/executable/pid_util.go | 59 +++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 executor/executable/pid_util.go diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 0ca49ba38..1ae85303a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -425,7 +425,7 @@ func (t *ControllableTask) Kill() error { log.Debug("end transition loop done") - pid := t.rpc.TaskCmd.Process.Pid + pid := int(response.GetPid()) _ = t.rpc.Close() t.rpc = nil @@ -439,9 +439,10 @@ func (t *ControllableTask) Kill() error { killErrCh := make(chan error) // When killing we must always use syscall.Kill with a negative PID, in order to kill all - // children which were assigned the same PGID at launch + // children which were assigned the same PGID at launch. Since we kill the child process, + // it should also terminate the shell that is wrapping the command, we avoid using negative PID go func() { - err := syscall.Kill(-pid, syscall.SIGTERM) + err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { log.WithError(err). WithField("taskId", t.ti.GetTaskID()). @@ -450,18 +451,31 @@ func (t *ControllableTask) Kill() error { killErrCh <- err }() - // Set a small timeout to SIGTERM if SIGTERM fails or timeout passes, // we perform a SIGKILL. select { case killErr := <- killErrCh: if killErr == nil { - return killErr + time.Sleep(10 * time.Second) + if pidExists(pid) { + // SIGINT for the "Waiting for graceful device shutdown. + // Hit Ctrl-C again to abort immediately" message. + killErr = syscall.Kill(pid, syscall.SIGINT) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not gracefully kill task") + } + } + time.Sleep(10 * time.Second) + if !pidExists(pid) { + return killErr + } } case <-time.After(10 * time.Second): } - killErr := syscall.Kill(-pid, syscall.SIGKILL) + killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { log.WithError(killErr). WithField("taskId", t.ti.GetTaskID()). diff --git a/executor/executable/pid_util.go b/executor/executable/pid_util.go new file mode 100644 index 000000000..d78d06b1c --- /dev/null +++ b/executor/executable/pid_util.go @@ -0,0 +1,59 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "os" + "syscall" +) + +// pidExists will check if a pid process is running +func pidExists(pid int) (bool) { + if pid <= 0 { + return false + } + proc, err := os.FindProcess(pid) + if err != nil { + return false + } + err = proc.Signal(syscall.Signal(0)) + if err == nil { + return true + } + if err.Error() == "os: process already finished" { + return false + } + errno, ok := err.(syscall.Errno) + if !ok { + return false + } + switch errno { + case syscall.ESRCH: + return false + case syscall.EPERM: + return true + } + return false +} \ No newline at end of file From 5eb7cf9e785862ce2c932dccf638d0aaa7e8807c Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 22 Jul 2020 18:14:55 +0300 Subject: [PATCH 0312/2352] [executor] Update proto to export PID --- executor/protos/occ.pb.go | 116 +++++++++++++++++++++++++------------- 1 file changed, 76 insertions(+), 40 deletions(-) diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index d452f8ed8..a75b761a1 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -375,6 +375,7 @@ var xxx_messageInfo_GetStateRequest proto.InternalMessageInfo type GetStateReply struct { State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -420,6 +421,13 @@ func (m *GetStateReply) GetState() string { return "" } +func (m *GetStateReply) GetPid() int32 { + if m != nil { + return m.Pid + } + return 0 +} + type ConfigEntry struct { Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` @@ -628,46 +636,47 @@ func init() { func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } var fileDescriptor_17fd8faceeeb3e6c = []byte{ - // 623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xc1, 0x6e, 0xd3, 0x40, - 0x10, 0xcd, 0x3a, 0x6d, 0x49, 0x27, 0x6d, 0xe3, 0x2c, 0x2d, 0x4d, 0x23, 0x14, 0x45, 0x96, 0x2a, - 0x85, 0x22, 0x19, 0x08, 0xf4, 0x82, 0xe0, 0xe0, 0x24, 0x4b, 0x15, 0x91, 0x3a, 0xd2, 0x7a, 0x5b, - 0x21, 0x2e, 0x96, 0x6b, 0x2d, 0x69, 0xd4, 0xd4, 0x36, 0xce, 0xb6, 0x52, 0xfe, 0x81, 0x3b, 0xf0, - 0x47, 0x1c, 0xf9, 0x04, 0x54, 0x7e, 0x04, 0xed, 0x26, 0x71, 0xec, 0x24, 0xdc, 0xbc, 0x33, 0x6f, - 0xdf, 0x7b, 0xb3, 0x33, 0x63, 0xd0, 0xa3, 0x38, 0x14, 0xe1, 0xf8, 0x45, 0xe8, 0xfb, 0xa6, 0xfa, - 0xc4, 0x5b, 0xa1, 0xef, 0xbb, 0xd1, 0x95, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, 0x8e, 0x88, 0xb9, - 0x77, 0x4b, 0xf9, 0xd7, 0x3b, 0x3e, 0x16, 0x46, 0x1f, 0xf4, 0x4c, 0x34, 0x1a, 0x4d, 0xf0, 0x31, - 0x6c, 0x88, 0x49, 0xc4, 0x2b, 0xa8, 0x8e, 0x1a, 0x7b, 0xcd, 0xb2, 0x39, 0x25, 0x30, 0x15, 0x8e, - 0x4d, 0x22, 0x4e, 0x55, 0x1a, 0xef, 0xc3, 0xe6, 0x58, 0x86, 0x2a, 0x5a, 0x1d, 0x35, 0xb6, 0xe9, - 0xf4, 0x20, 0x65, 0xc8, 0x3d, 0x0f, 0x44, 0x56, 0xe6, 0x2d, 0x14, 0x3b, 0xfc, 0x7e, 0xe8, 0x73, - 0x95, 0xc3, 0xcf, 0x33, 0x0a, 0x87, 0x73, 0x85, 0x14, 0x64, 0xa1, 0x63, 0xbc, 0x07, 0x3d, 0xc3, - 0x28, 0x2d, 0x3e, 0x83, 0x4d, 0x2e, 0x63, 0x8a, 0xa1, 0xd8, 0x7c, 0xbc, 0x86, 0x81, 0x4e, 0x11, - 0x46, 0x19, 0x4a, 0x67, 0x5c, 0x28, 0xf3, 0x73, 0x37, 0xc7, 0xb0, 0xbb, 0x08, 0x49, 0xba, 0xa4, - 0x14, 0x94, 0x2e, 0xe5, 0x14, 0x8a, 0xed, 0x30, 0xf8, 0x32, 0x1c, 0x90, 0x40, 0xc4, 0x13, 0xac, - 0x43, 0xfe, 0x86, 0x4f, 0x66, 0x10, 0xf9, 0x29, 0xaf, 0xdd, 0x7b, 0xa3, 0xbb, 0xe4, 0x05, 0xd4, - 0xc1, 0xf8, 0x86, 0xa0, 0xcc, 0x62, 0x2f, 0x18, 0x0f, 0xc5, 0x30, 0x0c, 0x66, 0x9a, 0xb8, 0x0a, - 0x85, 0x71, 0xec, 0x3b, 0x29, 0x95, 0xe4, 0x8c, 0x1b, 0x50, 0x12, 0xc9, 0x05, 0x65, 0x7e, 0xc6, - 0xb8, 0x1c, 0xc6, 0xaf, 0x60, 0xdb, 0x8b, 0x07, 0x77, 0xb7, 0x3c, 0x10, 0xe3, 0x4a, 0xbe, 0x9e, - 0x4f, 0xd7, 0x9e, 0xf2, 0x4a, 0x17, 0x28, 0xe3, 0x3b, 0x82, 0x52, 0xda, 0x8e, 0xac, 0xf7, 0x0d, - 0x3c, 0x12, 0xf1, 0x70, 0x30, 0xe0, 0xf1, 0xac, 0x05, 0xd5, 0x4c, 0x93, 0xdb, 0xd7, 0x5e, 0x30, - 0xe0, 0x6c, 0x8a, 0xa0, 0x73, 0xe8, 0xfa, 0x86, 0xaf, 0x33, 0x9f, 0x5f, 0x6f, 0x7e, 0x0f, 0xb4, - 0xf0, 0xa6, 0xb2, 0x51, 0x47, 0x8d, 0x02, 0xd5, 0xc2, 0x9b, 0x93, 0xde, 0x6c, 0x22, 0x33, 0x72, - 0x78, 0x07, 0x0a, 0xe4, 0x13, 0x69, 0x5f, 0xb0, 0x3e, 0xd5, 0x73, 0xf8, 0x09, 0xe0, 0x0e, 0xb9, - 0xec, 0xb6, 0x89, 0xdb, 0xb5, 0x19, 0xb1, 0x59, 0xb7, 0x6f, 0x5b, 0x3d, 0x1d, 0x61, 0x1d, 0x76, - 0x66, 0x71, 0x42, 0x69, 0x9f, 0xea, 0xda, 0xc9, 0x29, 0x6c, 0x27, 0x13, 0x2a, 0xd3, 0x0e, 0xb3, - 0x18, 0x71, 0x1d, 0x66, 0xb5, 0x7a, 0x64, 0x4a, 0x34, 0x8d, 0x48, 0x1e, 0x7a, 0x4e, 0x3a, 0x5d, - 0x8b, 0x11, 0x1d, 0x9d, 0x5c, 0x42, 0x69, 0x69, 0xec, 0xf0, 0x01, 0x94, 0xed, 0x8b, 0x5e, 0xcf, - 0x9d, 0x0b, 0x5c, 0x12, 0x9b, 0xe9, 0x39, 0x5c, 0x86, 0x5d, 0x62, 0x77, 0xdc, 0xfe, 0x07, 0xd7, - 0x61, 0x94, 0x58, 0xe7, 0x3a, 0xc2, 0x47, 0x70, 0xd0, 0xb2, 0x9c, 0x6e, 0xdb, 0x65, 0x96, 0xf3, - 0xd1, 0x95, 0xbc, 0x5d, 0xdb, 0x62, 0xa4, 0xa3, 0x6b, 0xcd, 0x9f, 0x1a, 0xe4, 0xfb, 0xbe, 0x8f, - 0xcf, 0xa0, 0x98, 0x9a, 0x5e, 0x9c, 0x3c, 0xf4, 0xea, 0x92, 0x54, 0x2b, 0x6b, 0x73, 0xd1, 0x68, - 0x62, 0xe4, 0x5e, 0x22, 0x49, 0x94, 0xda, 0x54, 0x9c, 0xed, 0xd8, 0x7f, 0x88, 0x96, 0x57, 0x5b, - 0x11, 0xbd, 0x83, 0xc2, 0x7c, 0xfa, 0x71, 0xb2, 0x7a, 0x4b, 0x2b, 0x52, 0x3d, 0x58, 0x4d, 0xa8, - 0xfb, 0xb8, 0x05, 0xb0, 0x98, 0x26, 0x7c, 0x34, 0x87, 0xad, 0x0c, 0x7c, 0xf5, 0x70, 0x5d, 0x4a, - 0x71, 0xb4, 0x9a, 0xbf, 0x1e, 0x6a, 0xe8, 0xf7, 0x43, 0x0d, 0xfd, 0x79, 0xa8, 0xa1, 0x1f, 0x7f, - 0x6b, 0x39, 0x78, 0xea, 0x5f, 0x9b, 0x3e, 0x8f, 0x03, 0xd3, 0x1b, 0x0d, 0x7d, 0x6e, 0x86, 0x4d, - 0xd3, 0x0f, 0x03, 0x11, 0x87, 0x23, 0x49, 0xf2, 0x59, 0x8b, 0xae, 0xae, 0xb6, 0xd4, 0xdf, 0xec, - 0xf5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xf5, 0x41, 0x08, 0xe1, 0x04, 0x00, 0x00, + // 637 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xd1, 0x6e, 0xda, 0x4a, + 0x10, 0x65, 0x4d, 0x92, 0x4b, 0x86, 0x24, 0x98, 0xbd, 0xc9, 0x0d, 0x41, 0x57, 0x08, 0x59, 0xba, + 0x12, 0x37, 0x95, 0xdc, 0x96, 0x36, 0xaa, 0x54, 0xb5, 0x0f, 0x06, 0xb6, 0x11, 0x2a, 0x31, 0xd2, + 0x7a, 0x13, 0x55, 0x7d, 0xb1, 0x1c, 0x77, 0x4b, 0xac, 0x10, 0xdb, 0x35, 0x9b, 0x48, 0xfc, 0x43, + 0xdf, 0xdb, 0xfe, 0x51, 0x1f, 0xfb, 0x09, 0x55, 0xfa, 0x23, 0xd5, 0x2e, 0x60, 0x6c, 0x42, 0xdf, + 0xbc, 0x33, 0x67, 0xcf, 0x39, 0x33, 0x3b, 0x63, 0xd0, 0xe3, 0x24, 0x12, 0xd1, 0xe4, 0x71, 0xe4, + 0xfb, 0xa6, 0xfa, 0xc4, 0x5b, 0x91, 0xef, 0xbb, 0xf1, 0xa5, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, + 0x8e, 0x48, 0xb8, 0x77, 0x43, 0xf9, 0xa7, 0x5b, 0x3e, 0x11, 0xc6, 0x10, 0xf4, 0x5c, 0x34, 0x1e, + 0x4f, 0xf1, 0x7f, 0xb0, 0x21, 0xa6, 0x31, 0xaf, 0xa1, 0x26, 0x6a, 0xed, 0xb5, 0xab, 0xe6, 0x8c, + 0xc0, 0x54, 0x38, 0x36, 0x8d, 0x39, 0x55, 0x69, 0xbc, 0x0f, 0x9b, 0x13, 0x19, 0xaa, 0x69, 0x4d, + 0xd4, 0xda, 0xa6, 0xb3, 0x83, 0x94, 0x21, 0x77, 0x3c, 0x14, 0x79, 0x99, 0x97, 0x50, 0xee, 0xf1, + 0xbb, 0xc0, 0xe7, 0x2a, 0x87, 0x1f, 0xe5, 0x14, 0x0e, 0x17, 0x0a, 0x19, 0xc8, 0x52, 0xc7, 0x78, + 0x0d, 0x7a, 0x8e, 0x51, 0x5a, 0xfc, 0x1f, 0x36, 0xb9, 0x8c, 0x29, 0x86, 0x72, 0xfb, 0xef, 0x35, + 0x0c, 0x74, 0x86, 0x30, 0xaa, 0x50, 0x39, 0xe5, 0x42, 0x99, 0x5f, 0xb8, 0x79, 0x01, 0xbb, 0xcb, + 0x90, 0xa4, 0x4b, 0x4b, 0x41, 0x99, 0x52, 0xb0, 0x0e, 0xc5, 0x38, 0xf8, 0xa0, 0xca, 0xdb, 0xa4, + 0xf2, 0xd3, 0x38, 0x81, 0x72, 0x37, 0x0a, 0x3f, 0x06, 0x23, 0x12, 0x8a, 0x64, 0x2a, 0x01, 0xd7, + 0x7c, 0x3a, 0xbf, 0x24, 0x3f, 0x25, 0xd1, 0x9d, 0x37, 0xbe, 0x4d, 0x7b, 0xa2, 0x0e, 0xc6, 0x67, + 0x04, 0x55, 0x96, 0x78, 0xe1, 0x24, 0x10, 0x41, 0x14, 0xce, 0x5d, 0xe0, 0x3a, 0x94, 0x26, 0x89, + 0xef, 0x64, 0x74, 0xd3, 0x33, 0x6e, 0x41, 0x45, 0xa4, 0x17, 0x54, 0x39, 0x73, 0xc6, 0xd5, 0x30, + 0x7e, 0x0a, 0xdb, 0x5e, 0x32, 0xba, 0xbd, 0xe1, 0xa1, 0x98, 0xd4, 0x8a, 0xcd, 0x62, 0xb6, 0x1b, + 0x19, 0xaf, 0x74, 0x89, 0x32, 0xbe, 0x20, 0xa8, 0x64, 0xed, 0xc8, 0x0e, 0x3c, 0x87, 0xbf, 0x44, + 0x12, 0x8c, 0x46, 0x3c, 0x99, 0x3f, 0x4a, 0x3d, 0xf7, 0xec, 0xdd, 0x2b, 0x2f, 0x1c, 0x71, 0x36, + 0x43, 0xd0, 0x05, 0x74, 0xfd, 0x08, 0xac, 0x33, 0x5f, 0x5c, 0x6f, 0x7e, 0x0f, 0xb4, 0xe8, 0xba, + 0xb6, 0xd1, 0x44, 0xad, 0x12, 0xd5, 0xa2, 0xeb, 0xe3, 0xc1, 0x7c, 0x46, 0x73, 0x72, 0x78, 0x07, + 0x4a, 0xe4, 0x1d, 0xe9, 0x9e, 0xb3, 0x21, 0xd5, 0x0b, 0xf8, 0x1f, 0xc0, 0x3d, 0x72, 0xd1, 0xef, + 0x12, 0xb7, 0x6f, 0x33, 0x62, 0xb3, 0xfe, 0xd0, 0xb6, 0x06, 0x3a, 0xc2, 0x3a, 0xec, 0xcc, 0xe3, + 0x84, 0xd2, 0x21, 0xd5, 0xb5, 0xe3, 0x13, 0xd8, 0x4e, 0x67, 0x56, 0xa6, 0x1d, 0x66, 0x31, 0xe2, + 0x3a, 0xcc, 0xea, 0x0c, 0xc8, 0x8c, 0x68, 0x16, 0x91, 0x3c, 0xf4, 0x8c, 0xf4, 0xfa, 0x16, 0x23, + 0x3a, 0x3a, 0xbe, 0x80, 0xca, 0xca, 0x20, 0xe2, 0x03, 0xa8, 0xda, 0xe7, 0x83, 0x81, 0xbb, 0x10, + 0xb8, 0x20, 0x36, 0xd3, 0x0b, 0xb8, 0x0a, 0xbb, 0xc4, 0xee, 0xb9, 0xc3, 0x37, 0xae, 0xc3, 0x28, + 0xb1, 0xce, 0x74, 0x84, 0x8f, 0xe0, 0xa0, 0x63, 0x39, 0xfd, 0xae, 0xcb, 0x2c, 0xe7, 0xad, 0x2b, + 0x79, 0xfb, 0xb6, 0xc5, 0x48, 0x4f, 0xd7, 0xda, 0xdf, 0x34, 0x28, 0x0e, 0x7d, 0x1f, 0x9f, 0x42, + 0x39, 0x33, 0xcf, 0x38, 0x6d, 0xf4, 0xc3, 0xb5, 0xa9, 0xd7, 0xd6, 0xe6, 0xe2, 0xf1, 0xd4, 0x28, + 0x3c, 0x41, 0x92, 0x28, 0xb3, 0xbb, 0x38, 0xff, 0x62, 0x7f, 0x20, 0x5a, 0x5d, 0x76, 0x45, 0xf4, + 0x0a, 0x4a, 0x8b, 0x7d, 0xc0, 0xe9, 0x32, 0xae, 0x2c, 0x4d, 0xfd, 0xe0, 0x61, 0x42, 0xdd, 0xc7, + 0x1d, 0x80, 0xe5, 0x34, 0xe1, 0xa3, 0x05, 0xec, 0xc1, 0xc0, 0xd7, 0x0f, 0xd7, 0xa5, 0x14, 0x47, + 0xa7, 0xfd, 0xfd, 0xbe, 0x81, 0x7e, 0xdc, 0x37, 0xd0, 0xcf, 0xfb, 0x06, 0xfa, 0xfa, 0xab, 0x51, + 0x80, 0x7f, 0xfd, 0x2b, 0xd3, 0xe7, 0x49, 0x68, 0x7a, 0xe3, 0xc0, 0xe7, 0x66, 0xd4, 0x36, 0xfd, + 0x28, 0x14, 0x49, 0x34, 0x96, 0x24, 0xef, 0xb5, 0xf8, 0xf2, 0x72, 0x4b, 0xfd, 0xdf, 0x9e, 0xfd, + 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x94, 0x47, 0x22, 0xf3, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1132,6 +1141,11 @@ func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Pid != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Pid)) + i-- + dAtA[i] = 0x10 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -1401,6 +1415,9 @@ func (m *GetStateReply) Size() (n int) { if l > 0 { n += 1 + l + sovOcc(uint64(l)) } + if m.Pid != 0 { + n += 1 + sovOcc(uint64(m.Pid)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -1976,6 +1993,25 @@ func (m *GetStateReply) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) + } + m.Pid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Pid |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipOcc(dAtA[iNdEx:]) From d7e053ca767c92070a9da18e47a60e54da5189eb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Jul 2020 17:26:19 +0200 Subject: [PATCH 0313/2352] [build] Bump to v0.14.90 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c0e5b8f61..879e5d2d6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 4 +VERSION_PATCH := 90 From e970ce6fb49fe90d4cc6c274c1ba010cce5ebbe9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 22 Jul 2020 18:22:21 +0300 Subject: [PATCH 0314/2352] [occ] Export PID to protobuf --- occ/occlib/OccServer.cxx | 6 ++++++ occ/plugin/OccLiteServer.cxx | 6 ++++++ occ/plugin/OccPluginServer.cxx | 7 ++++++- occ/plugin/litestructs/GetState.cxx | 4 ++++ occ/plugin/litestructs/GetState.h | 1 + occ/protos/occ.proto | 1 + 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 56611ba93..c0b611d0c 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -37,6 +37,9 @@ #include #include +#include +#include + #include "RuntimeControlledObject.h" #include "RuntimeControlledObjectPrivate.h" @@ -139,7 +142,10 @@ grpc::Status OccServer::GetState(grpc::ServerContext* context, (void) request; auto state = getStringFromState(m_rco->getState()); + pid_t pid = getpid(); + response->set_state(state); + response->set_pid(pid); return grpc::Status::OK; } diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 09d8b9d83..833e183ba 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -39,6 +39,9 @@ #include #include +#include +#include + #include #include @@ -77,7 +80,10 @@ ::grpc::Status OccLite::Service::GetState(::grpc_impl::ServerContext* context, (void) request; auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); + pid_t pid = getpid(); + response->state = state; + response->pid = pid; OLOG(INFO) << "GetState response: " << response->state; return grpc::Status::OK; diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index ef2e4c85d..e013a866a 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -38,6 +38,9 @@ #include #include +#include +#include + OccPluginServer::OccPluginServer(fair::mq::PluginServices* pluginServices) : Service(), m_pluginServices(pluginServices) { @@ -149,7 +152,10 @@ grpc::Status OccPluginServer::GetState(grpc::ServerContext* context, (void) request; auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); + pid_t pid = getpid(); + response->set_state(state); + response->set_pid(pid); return grpc::Status::OK; } @@ -230,4 +236,3 @@ OccPluginServer::Transition(grpc::ServerContext* context, return grpc::Status::OK; } - diff --git a/occ/plugin/litestructs/GetState.cxx b/occ/plugin/litestructs/GetState.cxx index 82984f572..439c31721 100644 --- a/occ/plugin/litestructs/GetState.cxx +++ b/occ/plugin/litestructs/GetState.cxx @@ -31,6 +31,9 @@ bool OccLite::nopb::GetStateResponse::Serialize(rapidjson::WriterString("state"); writer->String(state); + writer->String("pid"); + writer->Int(pid); + writer->EndObject(); return true; } @@ -38,6 +41,7 @@ bool OccLite::nopb::GetStateResponse::Serialize(rapidjson::Writer* writer) const override; bool Deserialize(const rapidjson::Value& obj) override; diff --git a/occ/protos/occ.proto b/occ/protos/occ.proto index c047a9dba..c4fa429bc 100644 --- a/occ/protos/occ.proto +++ b/occ/protos/occ.proto @@ -74,6 +74,7 @@ message EventStreamReply { message GetStateRequest {} message GetStateReply { string state = 1; + int32 pid = 2; } message ConfigEntry { From 1ed89083bedcd33000533e5ad0da31f6ecdcd4a0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 10:32:14 +0300 Subject: [PATCH 0315/2352] [executor] use OCC pid to kill task on ERROR --- executor/executable/controllabletask.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 1ae85303a..8d93a0812 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -185,7 +185,7 @@ func (t *ControllableTask) Launch() error { break } else if reachedState == "DONE" || reachedState == "ERROR" { // something went wrong, the device moved to DONE or ERROR on startup - _ = syscall.Kill(-taskCmd.Process.Pid, syscall.SIGKILL) + _ = syscall.Kill(int(response.GetPid()), syscall.SIGKILL) log.WithField("task", t.ti.Name).Debug("task killed") t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") From dc05890d911e1b1ab3b6c19fec0d34703ea6c91b Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:22:57 +0300 Subject: [PATCH 0316/2352] [executor] Send TaskMessage with PID to scheduler --- executor/executable/basictask.go | 7 +++++++ executor/executable/controllabletask.go | 10 ++++++++++ executor/executable/task.go | 6 +++++- executor/handlers.go | 10 +++++++++- 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index ccee328e8..7568de2e8 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -238,6 +238,13 @@ func (t *BasicTask) Launch() error { Debug("basic task staged") go t.sendStatus(mesos.TASK_RUNNING, "") + taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.taskCmd.Process.Pid)) + jsonEvent, err := json.Marshal(taskMessage) + if err != nil { + log.WithError(err).Warning("error marshaling message from task") + } else { + t.sendMessage(jsonEvent) + } return nil } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8d93a0812..5a5857c25 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -147,6 +147,7 @@ func (t *ControllableTask) Launch() error { } t.rpc.TaskCmd = taskCmd + var pid int32 elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ @@ -176,6 +177,7 @@ func (t *ControllableTask) Launch() error { } // NOTE: we acquire the transitioner-dependent STANDBY equivalent state reachedState := t.rpc.FromDeviceState(response.GetState()) + pid = response.GetPid() if reachedState == "STANDBY" && err == nil { log.WithField("id", t.ti.TaskID.Value). @@ -222,6 +224,14 @@ func (t *ControllableTask) Launch() error { // send RUNNING t.sendStatus(mesos.TASK_RUNNING, "") + taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),pid) + jsonEvent, err := json.Marshal(taskMessage) + if err != nil { + log.WithError(err).Warning("error marshaling message from task") + } else { + t.sendMessage(jsonEvent) + } + // Process events from task in yet another goroutine go func() { diff --git a/executor/executable/task.go b/executor/executable/task.go index c6da54461..8dab65609 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -54,6 +54,7 @@ var log = logger.New(logrus.StandardLogger(), "executor") type SendStatusFunc func(state mesos.TaskState, message string) type SendDeviceEventFunc func(event event.DeviceEvent) +type SendMessageFunc func(message []byte) type Task interface { Launch() error @@ -68,9 +69,10 @@ type taskBase struct { sendStatus SendStatusFunc sendDeviceEvent SendDeviceEventFunc + sendMessage SendMessageFunc } -func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc) Task { +func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc, sendMessageFunc SendMessageFunc) Task { var commandInfo common.TaskCommandInfo tciData := taskInfo.GetData() @@ -104,6 +106,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE tci: &commandInfo, sendStatus: sendStatusFunc, sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, }, } case controlmode.DIRECT: @@ -115,6 +118,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE tci: &commandInfo, sendStatus: sendStatusFunc, sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, }, rpc: nil, } diff --git a/executor/handlers.go b/executor/handlers.go index a3c168538..b1bd49537 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -60,6 +60,13 @@ func makeSendDeviceEventFunc(state *internalState) executable.SendDeviceEventFun } } +func makeSendMessageFunc(state *internalState) executable.SendMessageFunc { + return func(message []byte) { + // to send task events using state. + state.messageCh <- message + } +} + func handleOutgoingMessage(state *internalState, message []byte) { _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(message))) log.WithFields(logrus.Fields{ @@ -195,7 +202,8 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { myTask := executable.NewTask(taskInfo, makeSendStatusUpdateFunc(state, taskInfo), - makeSendDeviceEventFunc(state)) + makeSendDeviceEventFunc(state), + makeSendMessageFunc(state)) err := myTask.Launch() From a4fe9c6bae7489f2c27d3fc3861e52040cb62e80 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:25:07 +0300 Subject: [PATCH 0317/2352] [core] Handle TaskMessage in scheduler --- core/scheduler.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/scheduler.go b/core/scheduler.go index 286249c28..6ff462843 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -331,6 +331,21 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even default: return errors.New(fmt.Sprintf("unrecognized response for controlcommand %s", incomingCommand.CommandName)) } + case "TaskMessage": + var taskMessage event.TaskMessageBase + err = json.Unmarshal(data, &taskMessage) + if err != nil { + return + } + + t := state.taskman.GetTask(taskMessage.GetTaskId()) + if t != nil { + if parentRole, ok := t.GetParentRole().(workflow.Role); ok { + parentRole.SetRuntimeVar("taskPID",strconv.Itoa(taskMessage.GetTaskPID())) + } else { + log.WithPrefix("scheduler").Error("TaskMessage received for task with no parent role") + } + } } return } From cf658086db1168bd318cf262f97bb27e7af5a739 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:27:19 +0300 Subject: [PATCH 0318/2352] [common] Create TaskMessage event --- common/event/taskevent.go | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 common/event/taskevent.go diff --git a/common/event/taskevent.go b/common/event/taskevent.go new file mode 100644 index 000000000..12983851a --- /dev/null +++ b/common/event/taskevent.go @@ -0,0 +1,60 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type TaskMessage interface { + GetName() string + GetTaskId() string + GetTaskPID() int +} + +type TaskMessageBase struct { + Name string `json:"name"` + TaskId string `json:"taskId"` + PID int32 `json:"pid"` + MessageType string `json:"_messageType"` +} + +func (tmb *TaskMessageBase) GetName() string { + return tmb.Name +} + +func (tmb *TaskMessageBase) GetTaskId() string { + return tmb.TaskId +} + +func (tmb *TaskMessageBase) GetTaskPID() int { + return int(tmb.PID) +} + +func NewTaskMessage(name,id string, pid int32) (tm TaskMessage) { + tm = &TaskMessageBase{ + Name: name, + TaskId: id, + PID: pid, + MessageType: "TaskMessage", + } + return tm +} From c5dbbf7a65e50187190629130a71c60df61885fc Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:31:15 +0300 Subject: [PATCH 0319/2352] [core] Extend role with GetTaskPID --- core/workflow/iteratorrole.go | 8 ++++++++ core/workflow/role.go | 1 + core/workflow/rolebase.go | 8 ++++++++ 3 files changed, 17 insertions(+) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index e55fb748e..9a7a45f65 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -271,3 +271,11 @@ func (i *iteratorRole) SetRuntimeVars(kv map[string]string) { } i.template.SetRuntimeVars(kv) } + +func (i *iteratorRole) GetTaskPID() string { + if i == nil { + return "" + } + pid, _ := i.template.GetUserVars().Get("taskPID") + return pid +} \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index c87c2d82f..872955ced 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -57,6 +57,7 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) + GetTaskPID() string } type Updatable interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 1af75aaef..62ddd64c9 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -350,4 +350,12 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { channels = channel.MergeInbound(r.Bind, r.parent.CollectInboundChannels()) } return +} + +func (r *roleBase) GetTaskPID() string { + if r == nil { + return "" + } + pid, _ := r.UserVars.Get("taskPID") + return pid } \ No newline at end of file From 49e259af541ae1ebdefaf74b010ca74b27324193 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:31:56 +0300 Subject: [PATCH 0320/2352] [core] Export Task PID to API --- core/protos/o2control.pb.go | 430 ++++++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/serverutil.go | 2 + 3 files changed, 244 insertions(+), 189 deletions(-) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index d925a7489..91254d084 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2385,6 +2385,7 @@ type ShortTaskInfo struct { State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2472,6 +2473,13 @@ func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { return nil } +func (m *ShortTaskInfo) GetPid() string { + if m != nil { + return m.Pid + } + return "" +} + type TaskDeploymentInfo struct { Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` @@ -4253,197 +4261,198 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3040 bytes of a gzipped FileDescriptorProto + // 3048 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x22, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x51, 0xb4, 0xa4, 0xc6, 0x16, 0xdd, - 0x15, 0x6d, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, + 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, + 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, - 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0x29, 0xd0, 0xe7, 0xfe, 0x81, 0x02, 0xc5, 0x7e, 0xdc, - 0xdd, 0xde, 0x17, 0x25, 0x37, 0xcd, 0x4b, 0xdf, 0x38, 0xb3, 0x33, 0xb3, 0xf3, 0xb5, 0x33, 0xb3, - 0x7b, 0x84, 0xd5, 0x91, 0x63, 0x7b, 0xb6, 0xfb, 0x96, 0xbd, 0xd5, 0xb5, 0x2d, 0xcf, 0xb1, 0xcd, - 0x4d, 0x8e, 0x40, 0xe5, 0x00, 0x81, 0x57, 0x61, 0xa5, 0x35, 0xa1, 0x96, 0x77, 0xf4, 0x90, 0xba, - 0xb6, 0xbb, 0x47, 0x75, 0xc7, 0x3b, 0xa6, 0xba, 0x87, 0x4d, 0x68, 0xb4, 0x26, 0x47, 0x2d, 0x6b, - 0x62, 0x38, 0xb6, 0x35, 0xa4, 0x96, 0x77, 0xe8, 0xe9, 0x1e, 0x6d, 0x0e, 0x74, 0xeb, 0x84, 0xf6, - 0xd0, 0x0a, 0x14, 0x28, 0xe3, 0xaa, 0x6b, 0x1b, 0xda, 0xcd, 0x32, 0x11, 0x00, 0x5a, 0x85, 0x39, - 0xd7, 0x1e, 0x3b, 0x5d, 0x5a, 0x9f, 0xe1, 0x68, 0x09, 0xa1, 0x0d, 0xa8, 0xf4, 0xa8, 0xeb, 0x19, - 0x96, 0xee, 0x19, 0xb6, 0x55, 0x9f, 0xe5, 0x8b, 0x2a, 0x0a, 0x37, 0x61, 0xb9, 0x35, 0x39, 0xea, - 0xe8, 0xee, 0x69, 0x64, 0x9b, 0x55, 0x98, 0xf3, 0x74, 0xf7, 0xd4, 0xe8, 0xc9, 0x7d, 0x24, 0xc4, - 0xb6, 0x77, 0x19, 0x9d, 0xdc, 0x47, 0x00, 0xf8, 0x3e, 0x33, 0x25, 0x10, 0x32, 0x76, 0xcf, 0x93, - 0xc2, 0xd4, 0xe5, 0x84, 0x81, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0xa2, 0x94, 0xf3, 0x40, 0x1f, 0x5b, - 0xdd, 0x41, 0xb6, 0x08, 0x6c, 0x70, 0xbd, 0xb9, 0xeb, 0x18, 0x7d, 0xd3, 0xa1, 0xba, 0x47, 0x7b, - 0xe8, 0x3a, 0x2c, 0x30, 0x02, 0x87, 0x0a, 0x07, 0xb8, 0x92, 0x2b, 0x8a, 0x44, 0x6f, 0xc2, 0x12, - 0x7d, 0x41, 0xbb, 0x63, 0xcf, 0x76, 0x48, 0x40, 0x29, 0x54, 0x49, 0x2e, 0xe0, 0xc7, 0x70, 0x29, - 0x1a, 0x10, 0x7f, 0xb3, 0x0f, 0xa1, 0x42, 0x43, 0x2c, 0xdf, 0xaa, 0xb2, 0xd5, 0xd8, 0x0c, 0x63, - 0xae, 0xf0, 0xec, 0x5b, 0x7d, 0x9b, 0xa8, 0xe4, 0xf8, 0xe7, 0x1a, 0xac, 0x45, 0xe5, 0xee, 0x50, - 0xd7, 0x73, 0xec, 0x33, 0xda, 0x43, 0xdf, 0x87, 0xa5, 0xae, 0x49, 0x75, 0x6b, 0x3c, 0x62, 0xc6, - 0xb9, 0x84, 0x8e, 0xcc, 0x33, 0x29, 0xff, 0x8a, 0x22, 0xbf, 0x19, 0xa7, 0x21, 0x49, 0x36, 0xe6, - 0x12, 0x65, 0x5b, 0xa3, 0x27, 0x0d, 0x8d, 0x22, 0xf1, 0x25, 0xee, 0x4f, 0x45, 0x99, 0x96, 0xe3, - 0xd8, 0x0e, 0x5e, 0x86, 0xa5, 0xd6, 0xe4, 0xe8, 0x53, 0xc3, 0x34, 0xb9, 0x44, 0xee, 0x6f, 0xbc, - 0x08, 0x0b, 0x22, 0xce, 0x84, 0x7e, 0x31, 0xa6, 0xae, 0x87, 0x8f, 0xa1, 0xe2, 0x23, 0xd8, 0x8e, - 0x41, 0x92, 0x68, 0x4a, 0x92, 0xa0, 0xbb, 0xb0, 0x20, 0xc2, 0xfc, 0x78, 0xd4, 0xd3, 0x3d, 0xee, - 0xf0, 0xd9, 0x9b, 0x95, 0xad, 0x35, 0xc5, 0x9e, 0x43, 0x65, 0x9d, 0x44, 0xa9, 0xf1, 0x5f, 0x34, - 0x98, 0x57, 0xd7, 0xd1, 0xbb, 0x50, 0x30, 0xe9, 0x84, 0x9a, 0x7c, 0x97, 0xea, 0xd6, 0xd5, 0x0c, - 0x39, 0x9b, 0x0f, 0x18, 0x11, 0x11, 0xb4, 0x68, 0x1f, 0xaa, 0xc3, 0xc8, 0x71, 0xe3, 0xde, 0xa8, - 0x6c, 0x5d, 0x53, 0xa3, 0x96, 0x72, 0x2a, 0xf7, 0x72, 0x24, 0xc6, 0x88, 0xdf, 0x83, 0x02, 0x17, - 0x8d, 0xca, 0x50, 0xd8, 0x69, 0x6d, 0x3f, 0xde, 0xad, 0xe5, 0x50, 0x09, 0xf2, 0xfb, 0x07, 0xf7, - 0xdb, 0x35, 0x0d, 0x55, 0xa0, 0xf8, 0xf4, 0x1e, 0x39, 0xd8, 0x3f, 0xd8, 0xad, 0xcd, 0x30, 0x8a, - 0x16, 0x21, 0x6d, 0x52, 0x9b, 0xdd, 0x2e, 0x42, 0x81, 0xcb, 0xc7, 0x3f, 0x9b, 0x93, 0xbf, 0xd0, - 0x15, 0x28, 0x7b, 0xc6, 0x90, 0xba, 0x9e, 0x3e, 0x1c, 0x49, 0x97, 0x85, 0x08, 0xa4, 0xc3, 0x1a, - 0x4d, 0xaf, 0x05, 0x52, 0xf5, 0x6f, 0x47, 0x54, 0xcf, 0x2a, 0x1c, 0x7b, 0x39, 0x92, 0x25, 0x07, - 0x11, 0x40, 0x34, 0x91, 0xdd, 0xbc, 0x58, 0x54, 0xb6, 0x36, 0x32, 0xa5, 0x4b, 0xba, 0xbd, 0x1c, - 0x49, 0xe1, 0x46, 0x0f, 0xa0, 0xe6, 0xc5, 0x8a, 0x4a, 0x3d, 0xcf, 0x25, 0xae, 0x47, 0x25, 0xc6, - 0x4b, 0xcf, 0x5e, 0x8e, 0x24, 0x38, 0x51, 0x1b, 0x96, 0xbc, 0x78, 0x75, 0xa9, 0x17, 0x52, 0x22, - 0x97, 0x2c, 0x42, 0x7b, 0x39, 0x92, 0xe4, 0x45, 0x9f, 0xc0, 0x3c, 0x43, 0x9a, 0xb2, 0xcc, 0xd4, - 0xe7, 0x92, 0x67, 0x37, 0x5a, 0x88, 0xf6, 0x72, 0x24, 0xc2, 0xc1, 0x0c, 0x1c, 0xfa, 0xd5, 0xa7, - 0x2b, 0x5d, 0x56, 0x4c, 0x33, 0x30, 0x5e, 0xa3, 0x98, 0x81, 0x71, 0x4e, 0xf4, 0x19, 0xac, 0xd0, - 0x94, 0x42, 0x50, 0x2f, 0x71, 0x89, 0x38, 0x33, 0x08, 0x01, 0xe5, 0x5e, 0x8e, 0xa4, 0x4a, 0x60, - 0x7a, 0xd2, 0xd8, 0xa9, 0xae, 0x97, 0xd3, 0xf4, 0x8c, 0x9f, 0x7d, 0xa6, 0x67, 0x9c, 0x13, 0xdd, - 0x87, 0xea, 0xa9, 0x61, 0x9a, 0x5e, 0x50, 0x0c, 0xea, 0x90, 0xa8, 0x4a, 0x89, 0x82, 0xc1, 0x0e, - 0x4f, 0x94, 0x6b, 0xbb, 0x0c, 0xc5, 0x47, 0xfa, 0x99, 0x69, 0xeb, 0x3d, 0x8c, 0xa0, 0x76, 0x38, - 0x3e, 0x76, 0xbb, 0x8e, 0x71, 0x4c, 0xfd, 0x82, 0x72, 0x19, 0xd6, 0x76, 0xa9, 0x77, 0xdf, 0xd1, - 0x87, 0xf4, 0xb9, 0xed, 0x9c, 0xf2, 0xe2, 0x29, 0x97, 0x7e, 0xab, 0x41, 0xf1, 0x09, 0x75, 0x5c, - 0xc3, 0xb6, 0x58, 0xa1, 0x19, 0xea, 0x9f, 0xdb, 0x0e, 0x3f, 0x35, 0x05, 0x22, 0x00, 0x8e, 0x35, - 0x2c, 0xdb, 0xe1, 0xe7, 0x83, 0x61, 0x19, 0xc0, 0xb0, 0x23, 0xdd, 0xeb, 0x0e, 0x78, 0x5e, 0x17, - 0x88, 0x00, 0x18, 0xf6, 0x78, 0x6c, 0x98, 0x22, 0x37, 0xcb, 0x44, 0x00, 0xac, 0x6d, 0x8e, 0x1c, - 0xbb, 0x37, 0xee, 0x7a, 0x07, 0xfa, 0x90, 0xf2, 0x44, 0x2b, 0x13, 0x15, 0x85, 0xd6, 0x01, 0x26, - 0x42, 0x89, 0x43, 0xcf, 0xe1, 0xd9, 0x53, 0x26, 0x0a, 0x06, 0xff, 0x72, 0x06, 0x2e, 0x25, 0x2d, - 0x60, 0xc5, 0x71, 0x03, 0x2a, 0xfd, 0x00, 0xeb, 0x77, 0x35, 0x15, 0xc5, 0xbb, 0x53, 0xe8, 0x77, - 0xb7, 0x69, 0x8f, 0x2d, 0x4f, 0xda, 0x92, 0x5c, 0x60, 0x9a, 0x70, 0xbf, 0x0a, 0x32, 0x61, 0x9c, - 0x82, 0x09, 0x8b, 0x71, 0x5e, 0x2d, 0xc6, 0xeb, 0x00, 0x03, 0xdb, 0xf5, 0x85, 0x17, 0x04, 0x57, - 0x88, 0x41, 0x18, 0xe6, 0x0d, 0xcb, 0xf5, 0x74, 0xab, 0x4b, 0xb9, 0x0b, 0x84, 0x85, 0x11, 0x1c, - 0x7a, 0x13, 0x8a, 0xd2, 0x62, 0x99, 0xf8, 0x48, 0x49, 0x02, 0x19, 0x22, 0xe2, 0x93, 0xb0, 0xde, - 0xde, 0xa1, 0xba, 0xd3, 0xb3, 0x9f, 0x5b, 0x32, 0x94, 0xac, 0xb7, 0x3b, 0x54, 0x77, 0x6d, 0xcb, - 0xef, 0xed, 0x02, 0x62, 0xfd, 0x25, 0x24, 0x1d, 0x99, 0x67, 0xb8, 0x0e, 0xab, 0xbb, 0xd4, 0x53, - 0x12, 0x34, 0xe8, 0x3c, 0x2f, 0x60, 0x25, 0xb1, 0x72, 0x31, 0x2f, 0x7f, 0x04, 0xf3, 0xaa, 0x33, - 0x65, 0x37, 0x9a, 0xd6, 0xbd, 0x23, 0xf4, 0xf8, 0x4f, 0x79, 0x58, 0x8c, 0x51, 0xa0, 0x2a, 0xcc, - 0x04, 0x83, 0xca, 0x8c, 0xc1, 0xf3, 0x48, 0x1e, 0xf0, 0xa7, 0x03, 0x6a, 0xc9, 0xc6, 0xab, 0xa2, - 0xc2, 0xe8, 0xcc, 0xaa, 0xd1, 0xd9, 0x84, 0x02, 0x8f, 0x60, 0x3d, 0xcf, 0x95, 0xaa, 0xab, 0xad, - 0x6d, 0x60, 0x3b, 0x1e, 0x3b, 0x5a, 0x5c, 0x25, 0x41, 0x86, 0x1a, 0x50, 0x72, 0x6c, 0xdb, 0x23, - 0xb6, 0xe9, 0x27, 0x6b, 0x00, 0xa3, 0x5b, 0x50, 0xeb, 0x8e, 0x1d, 0x87, 0x5a, 0x1e, 0x19, 0x5b, - 0x07, 0xe3, 0xe1, 0x31, 0x15, 0xf9, 0xba, 0x40, 0x12, 0x78, 0xb4, 0x03, 0xa5, 0x1e, 0xed, 0xeb, - 0x63, 0xd3, 0x73, 0xeb, 0x45, 0xbe, 0xf5, 0xcd, 0x6c, 0x7f, 0x6c, 0xee, 0x48, 0xd2, 0x96, 0xe5, - 0x39, 0x67, 0x24, 0xe0, 0x44, 0xb7, 0x21, 0x3f, 0xd1, 0x1d, 0xb7, 0x5e, 0xe2, 0x12, 0xae, 0x4f, - 0x91, 0xf0, 0x44, 0x77, 0x24, 0x37, 0xe7, 0x60, 0xfb, 0x8f, 0x5d, 0xea, 0x30, 0x74, 0xbd, 0x7c, - 0xee, 0xfe, 0x8f, 0x25, 0xa9, 0xdc, 0xdf, 0xe7, 0x6c, 0x7c, 0x00, 0x0b, 0x11, 0xd5, 0x50, 0x0d, - 0x66, 0x4f, 0xe9, 0x99, 0x8c, 0x0b, 0xfb, 0xc9, 0xdc, 0x3e, 0xd1, 0xcd, 0x71, 0x30, 0xc6, 0x72, - 0xe0, 0xce, 0xcc, 0x6d, 0xad, 0xf1, 0x3e, 0x94, 0x03, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0x2c, 0x44, - 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x07, 0x0d, 0x2e, 0x1d, 0xd0, 0xe7, 0x8a, 0x85, 0xfe, 0x19, 0xb9, - 0x05, 0x35, 0x96, 0xb0, 0x7d, 0xd3, 0x7e, 0xde, 0xa1, 0xc3, 0x91, 0x19, 0x8e, 0x55, 0x09, 0x3c, - 0xfa, 0x48, 0x3a, 0x5e, 0xa4, 0xf2, 0x2d, 0xc5, 0x75, 0xa9, 0xb2, 0xe3, 0xee, 0xff, 0xaf, 0x6d, - 0xc7, 0x87, 0xb0, 0x1c, 0xdf, 0x81, 0x1d, 0xc2, 0xaf, 0x37, 0x1f, 0xbf, 0xc6, 0x2b, 0x68, 0x8a, - 0x4b, 0x62, 0xa7, 0x0c, 0xff, 0x54, 0x83, 0xe5, 0x38, 0xe5, 0xd7, 0xde, 0x1e, 0xbd, 0x05, 0x25, - 0xdf, 0xc1, 0x72, 0xd0, 0x5a, 0x56, 0x58, 0xd9, 0xd1, 0xe2, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, - 0x97, 0x9b, 0x62, 0xf9, 0x7c, 0xa5, 0xd1, 0xc7, 0x90, 0xf7, 0xce, 0x46, 0xc2, 0x97, 0xd5, 0xad, - 0x37, 0xd4, 0xa1, 0x3e, 0x4b, 0xc6, 0x66, 0x7b, 0xc4, 0x58, 0x08, 0x67, 0xc4, 0x3a, 0xcc, 0x09, - 0x98, 0x0d, 0x9d, 0x07, 0xed, 0xf6, 0xa3, 0x5a, 0x0e, 0x21, 0xa8, 0x1e, 0x76, 0xee, 0x91, 0xce, - 0xd1, 0xbd, 0x66, 0x67, 0xff, 0xc9, 0x7e, 0xe7, 0x87, 0x35, 0x0d, 0x2d, 0xc1, 0xc2, 0x61, 0xa7, - 0xfd, 0x28, 0x44, 0xcd, 0xa0, 0x05, 0x28, 0x37, 0xdb, 0x07, 0xf7, 0xf7, 0x77, 0x1f, 0x93, 0x56, - 0x6d, 0x96, 0x4d, 0xa7, 0xa4, 0x75, 0xd8, 0xea, 0xd4, 0xf2, 0x68, 0x1e, 0x4a, 0xbb, 0xed, 0x23, - 0x31, 0xab, 0x16, 0xf0, 0x29, 0xac, 0xa5, 0x29, 0xc3, 0x7c, 0x1b, 0x37, 0x27, 0xf5, 0x5e, 0x98, - 0x5a, 0x7b, 0x66, 0xd3, 0x6b, 0x0f, 0xfe, 0x95, 0x06, 0xf5, 0x87, 0x76, 0xcf, 0xe8, 0x9f, 0x5d, - 0xc8, 0x7b, 0x60, 0x8f, 0xa8, 0xc3, 0xaf, 0xb0, 0x7e, 0xbe, 0x5f, 0x4b, 0x8f, 0x6c, 0xdb, 0xa7, - 0x23, 0x0a, 0x0b, 0xba, 0x01, 0x55, 0x87, 0x76, 0x6d, 0xab, 0x6f, 0x9c, 0x8c, 0x1d, 0x7a, 0xcf, - 0x34, 0xb9, 0x5e, 0x25, 0x12, 0xc3, 0xe2, 0xdf, 0x68, 0xb0, 0x92, 0x26, 0x0c, 0xdd, 0x91, 0xf1, - 0x13, 0x97, 0x8f, 0x1b, 0xe7, 0xec, 0x1d, 0x09, 0x9d, 0x28, 0xd7, 0xa6, 0x68, 0xac, 0x33, 0x7e, - 0xb9, 0x16, 0x30, 0x7e, 0x27, 0x25, 0xac, 0x8b, 0x50, 0x21, 0xad, 0x87, 0xed, 0x27, 0xad, 0x23, - 0xd2, 0x7e, 0xc0, 0x22, 0x36, 0x0f, 0xa5, 0x7b, 0x3b, 0x3b, 0x02, 0xca, 0xb3, 0x8b, 0xe4, 0x6a, - 0x8a, 0xe7, 0x58, 0x98, 0x3e, 0x85, 0x5a, 0x5f, 0x37, 0x4c, 0xda, 0x6b, 0x87, 0xde, 0xd2, 0x2e, - 0xe6, 0xad, 0x04, 0xa3, 0x0c, 0xc2, 0x4c, 0x32, 0xe6, 0x6a, 0xef, 0xc2, 0x5f, 0x6a, 0x70, 0x59, - 0x4e, 0x9f, 0x17, 0x08, 0xe4, 0x15, 0x28, 0x9f, 0x52, 0x2a, 0xae, 0xab, 0x5c, 0x74, 0x89, 0x84, - 0x08, 0xf4, 0x36, 0x2c, 0xeb, 0xa6, 0x69, 0x3f, 0xdf, 0xb7, 0xc8, 0xd8, 0xb2, 0x0c, 0xeb, 0xe4, - 0x30, 0xd8, 0xaf, 0x44, 0xd2, 0x96, 0x98, 0x4e, 0x7d, 0xdb, 0xe9, 0x8a, 0x69, 0xa7, 0x44, 0x04, - 0x80, 0x29, 0xac, 0xa5, 0xa9, 0xc4, 0x3c, 0xf4, 0x3f, 0xbc, 0x69, 0xe3, 0x3f, 0x6b, 0x70, 0xed, - 0x30, 0x52, 0x88, 0x1e, 0x39, 0x2c, 0xe7, 0x3c, 0x83, 0xba, 0x59, 0x0e, 0x78, 0x06, 0x30, 0x0a, - 0x88, 0x64, 0x26, 0xdf, 0x51, 0xfb, 0xfd, 0x74, 0x79, 0x9b, 0x21, 0x46, 0x54, 0x72, 0x45, 0x5a, - 0xe3, 0x2e, 0x2c, 0xc6, 0x96, 0x5f, 0xaa, 0xaa, 0x5f, 0x83, 0xab, 0xd9, 0xbb, 0x33, 0x7b, 0x5d, - 0xb8, 0xb6, 0xfb, 0x92, 0xe6, 0xd6, 0xa1, 0xf8, 0xc5, 0x98, 0x3a, 0xbe, 0xad, 0x65, 0xe2, 0x83, - 0xec, 0x44, 0xd2, 0x17, 0x5d, 0x73, 0xdc, 0xa3, 0xbb, 0xa6, 0x7d, 0xac, 0x9b, 0xae, 0x7f, 0x22, - 0xa3, 0x58, 0xfc, 0x7b, 0x0d, 0xae, 0xee, 0x4e, 0x53, 0x0b, 0x7d, 0x16, 0x71, 0xa9, 0x48, 0xf7, - 0xdb, 0x8a, 0x4b, 0xa7, 0x72, 0x7f, 0x93, 0x0e, 0xfd, 0xa7, 0x06, 0x0b, 0x91, 0xf9, 0x0d, 0x21, - 0xc8, 0x5b, 0xac, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x4d, 0xc5, 0xa6, 0xdd, 0x3d, 0x95, 0xf7, 0xfb, - 0x12, 0x91, 0x90, 0xff, 0x12, 0xb6, 0xdf, 0x93, 0xe7, 0x4d, 0x42, 0xca, 0x63, 0x5a, 0x5e, 0x7d, - 0x4c, 0x0b, 0x8f, 0x67, 0x41, 0x2d, 0xc9, 0x57, 0xa0, 0xdc, 0x35, 0x75, 0xd7, 0x55, 0xa6, 0xfa, - 0x10, 0x81, 0x5a, 0x50, 0xed, 0xd1, 0x91, 0x69, 0x9f, 0xf9, 0x3d, 0x51, 0x4e, 0xf6, 0xea, 0xe3, - 0x0a, 0x53, 0x7e, 0x27, 0x42, 0x44, 0x62, 0x4c, 0xac, 0x23, 0xa3, 0x24, 0x19, 0xab, 0x7b, 0xec, - 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x2c, 0x31, 0xf4, 0x13, 0x46, 0xe8, 0x57, 0x18, 0x1f, 0x64, 0x2b, - 0x76, 0xbf, 0x4f, 0x9d, 0xc0, 0x70, 0x1f, 0x64, 0x97, 0x18, 0xff, 0xb5, 0x6e, 0xdf, 0xbf, 0xc1, - 0x29, 0x18, 0xbc, 0x04, 0x8b, 0xbb, 0xd4, 0x93, 0x07, 0x54, 0xdc, 0x17, 0x3e, 0x86, 0x85, 0x10, - 0xc5, 0x92, 0x25, 0x18, 0xb5, 0xb5, 0x0b, 0x8d, 0xda, 0xf8, 0x26, 0x54, 0xa5, 0x00, 0xe5, 0x16, - 0x23, 0xe3, 0xa2, 0xa9, 0x71, 0xc1, 0xef, 0xc3, 0x7c, 0x40, 0xc9, 0x76, 0x7a, 0x0d, 0xf2, 0x6c, - 0x45, 0x16, 0x97, 0xe5, 0x98, 0x47, 0xf9, 0x1e, 0x9c, 0x00, 0xb7, 0x60, 0x81, 0x3f, 0x17, 0xb0, - 0xa8, 0x64, 0x66, 0x09, 0xbb, 0x5a, 0x08, 0xf6, 0x87, 0x76, 0x8f, 0x06, 0x57, 0x8b, 0x10, 0x85, - 0x7f, 0x02, 0x95, 0xa6, 0x3d, 0x1c, 0xea, 0x56, 0x8f, 0x0b, 0xa9, 0xc1, 0x2c, 0xb5, 0x26, 0xdc, - 0xcc, 0x32, 0x61, 0x3f, 0x79, 0x82, 0x0c, 0xa8, 0x69, 0xca, 0x3c, 0x13, 0x40, 0x98, 0xbe, 0xb3, - 0x4a, 0xfa, 0xb2, 0xb4, 0xd1, 0x9d, 0x93, 0xb1, 0xb8, 0x2a, 0xe5, 0xb9, 0x8c, 0x10, 0xc1, 0x14, - 0x64, 0xd3, 0xb7, 0xcc, 0x34, 0xfe, 0x1b, 0x3f, 0x84, 0x4a, 0x73, 0xa0, 0x5b, 0x16, 0x35, 0x33, - 0x6d, 0x40, 0xca, 0x0c, 0x54, 0x96, 0xbd, 0x91, 0x7b, 0xd3, 0x39, 0xa1, 0x5e, 0x98, 0xe5, 0x0c, - 0xc2, 0xff, 0x9a, 0x85, 0x52, 0x70, 0x6c, 0xbe, 0x0b, 0x65, 0x97, 0x05, 0x87, 0x67, 0xa8, 0xf0, - 0x67, 0x76, 0xe0, 0x42, 0x52, 0xc6, 0xd7, 0xf5, 0xbd, 0x2a, 0x87, 0xba, 0x7a, 0x2c, 0x0e, 0x81, - 0xd7, 0x49, 0x48, 0x8a, 0x3e, 0x81, 0x45, 0xc3, 0x3a, 0xb6, 0xc7, 0x56, 0x4f, 0x9a, 0xc4, 0x8a, - 0x13, 0x4b, 0x97, 0x55, 0xb5, 0x45, 0x84, 0xd6, 0x92, 0x38, 0x39, 0xda, 0x86, 0x9a, 0x3d, 0xf6, - 0xa2, 0x22, 0xf2, 0x53, 0x45, 0x24, 0xe8, 0xd1, 0x6d, 0x16, 0xf2, 0x20, 0xa0, 0xf2, 0xf9, 0x2b, - 0xc2, 0x1e, 0xae, 0x12, 0x95, 0x94, 0x1d, 0x3c, 0x96, 0x59, 0x8f, 0x74, 0x6f, 0x20, 0xcf, 0x7c, - 0x00, 0xf3, 0x0f, 0x0a, 0xd6, 0x64, 0x5f, 0x3c, 0x5e, 0x95, 0x89, 0x00, 0x50, 0x33, 0x52, 0x43, - 0xc5, 0x5d, 0xec, 0x5b, 0x29, 0x29, 0xfb, 0x4d, 0x96, 0xcb, 0xb7, 0x60, 0x39, 0xda, 0x76, 0xc5, - 0x79, 0xab, 0x43, 0x51, 0x9c, 0x30, 0x57, 0x26, 0xb3, 0x0f, 0xe2, 0x5f, 0x68, 0xb0, 0x94, 0x68, - 0xd4, 0xe8, 0x0e, 0x54, 0x4e, 0x0d, 0xd3, 0xa4, 0xbd, 0xce, 0x85, 0xce, 0xb9, 0x4a, 0x8c, 0x3e, - 0x84, 0x79, 0x47, 0x8c, 0x17, 0xfe, 0x84, 0x32, 0x9d, 0x39, 0x42, 0x8d, 0x9b, 0xbc, 0xfe, 0xb0, - 0xab, 0x42, 0xa0, 0x7c, 0xe0, 0x6d, 0x4d, 0xf5, 0x76, 0x03, 0x4a, 0x23, 0xdd, 0x1b, 0x1c, 0x8e, - 0x68, 0xd7, 0x1f, 0x08, 0x7d, 0x18, 0x7f, 0x99, 0x87, 0x92, 0x7f, 0xdb, 0xc8, 0xea, 0x17, 0x69, - 0x1f, 0x53, 0x32, 0x9e, 0x16, 0x1a, 0x50, 0xea, 0x8f, 0x4d, 0x93, 0xa7, 0x82, 0xa8, 0x98, 0x01, - 0xac, 0x7a, 0xb6, 0x10, 0xf1, 0x2c, 0x7a, 0x1d, 0x0a, 0x6c, 0x42, 0x75, 0xeb, 0x73, 0xdc, 0x01, - 0xa9, 0x37, 0x21, 0x41, 0x81, 0xee, 0x26, 0xde, 0x10, 0x5e, 0x4d, 0xa1, 0xce, 0x7c, 0x3c, 0x78, - 0x27, 0xf2, 0x78, 0x70, 0x35, 0x8d, 0x35, 0xfe, 0x6a, 0x70, 0x37, 0xf1, 0x6a, 0x90, 0xba, 0xe3, - 0xff, 0xd1, 0x73, 0xc1, 0x1d, 0xde, 0xc5, 0x64, 0x62, 0xb1, 0x1c, 0x0f, 0xe2, 0xa3, 0x9d, 0x17, - 0x1f, 0xfc, 0x3b, 0x0d, 0x5e, 0xd9, 0xa5, 0xde, 0xd3, 0xd8, 0xe3, 0x41, 0x90, 0xa1, 0x1b, 0x50, - 0x71, 0xe8, 0xc8, 0x7e, 0xa4, 0x7b, 0x1e, 0x75, 0xfc, 0x97, 0x39, 0x15, 0x85, 0x6e, 0xc2, 0xa2, - 0x43, 0x27, 0x86, 0x6b, 0xd8, 0x96, 0x4f, 0x25, 0x34, 0x8c, 0xa3, 0x99, 0x2c, 0xdd, 0x34, 0xb7, - 0x1d, 0xdd, 0xea, 0x0e, 0xa8, 0x3f, 0xd0, 0xa9, 0x28, 0xde, 0xf6, 0x4d, 0xb3, 0xa3, 0x9f, 0xb8, - 0x72, 0x62, 0xf7, 0x41, 0x7c, 0x0c, 0x2b, 0x71, 0x1d, 0xfd, 0x23, 0xc0, 0x94, 0xf1, 0x8f, 0x00, - 0xfb, 0xcd, 0xeb, 0x9b, 0xff, 0x38, 0x22, 0xcf, 0x8f, 0x0f, 0xf3, 0xcb, 0x96, 0x54, 0x4b, 0x9e, - 0x84, 0x00, 0xc6, 0x9f, 0xc3, 0xe5, 0x74, 0x57, 0x30, 0x9f, 0x3e, 0x84, 0xa5, 0xf8, 0x0b, 0x4b, - 0xda, 0xe5, 0x29, 0x4d, 0x49, 0x92, 0xe4, 0xc4, 0x08, 0x6a, 0x0f, 0x0c, 0x97, 0xdd, 0x3a, 0x6c, - 0xe5, 0xbb, 0x59, 0x89, 0xc1, 0x99, 0x47, 0xbb, 0x0e, 0x45, 0x79, 0x30, 0x64, 0x8f, 0xf6, 0x41, - 0x16, 0x03, 0xf9, 0x93, 0x44, 0x8d, 0x8b, 0xa3, 0xf1, 0x17, 0x50, 0x55, 0xf6, 0xf5, 0x93, 0x85, - 0x41, 0x69, 0xc9, 0x22, 0xb5, 0x21, 0x82, 0x02, 0xbd, 0x07, 0x97, 0x4e, 0xf8, 0xdc, 0xbd, 0x13, - 0xdb, 0x4c, 0x78, 0x39, 0x7d, 0x11, 0x1f, 0x40, 0xf5, 0x5e, 0xaf, 0xc7, 0x64, 0xf9, 0x49, 0x95, - 0x66, 0x5c, 0x8a, 0x09, 0x33, 0xe9, 0x26, 0x10, 0x98, 0x0f, 0xe4, 0x89, 0x99, 0x0d, 0x59, 0xf4, - 0x79, 0x5c, 0x25, 0x21, 0x3b, 0x65, 0x85, 0xed, 0x6e, 0xf8, 0x1d, 0xbf, 0x4c, 0xf8, 0x6f, 0xfc, - 0x3a, 0x2c, 0x11, 0x3a, 0xb4, 0x27, 0x54, 0x55, 0x73, 0x05, 0x0a, 0x86, 0xd5, 0xa3, 0x2f, 0xfc, - 0xef, 0x09, 0x1c, 0xc0, 0xdf, 0x83, 0x45, 0x95, 0x94, 0x69, 0x70, 0x03, 0xaa, 0xea, 0x3e, 0x41, - 0x3a, 0xc6, 0xb0, 0xf8, 0x0d, 0x58, 0x26, 0xb4, 0xef, 0x50, 0x77, 0xa0, 0xc6, 0x3d, 0x63, 0x9f, - 0xef, 0xc0, 0xa5, 0x43, 0xea, 0x29, 0xec, 0xd3, 0xc9, 0xef, 0xf2, 0xcb, 0xe6, 0x6e, 0x5a, 0x04, - 0x7c, 0x46, 0x35, 0xf7, 0xb5, 0x58, 0xee, 0xff, 0x80, 0xdf, 0xee, 0xd8, 0x36, 0x19, 0xcc, 0xa9, - 0xbb, 0x46, 0x44, 0xce, 0xc4, 0x44, 0xbe, 0x03, 0xaf, 0x64, 0x89, 0x64, 0x4e, 0xf3, 0xc3, 0xa0, - 0x29, 0x61, 0x28, 0x42, 0xa1, 0x35, 0x1c, 0x79, 0x67, 0x5b, 0xff, 0x5e, 0x80, 0xa2, 0x7c, 0x6c, - 0x42, 0x4d, 0xa8, 0x74, 0x1c, 0xbd, 0x2b, 0x3f, 0xd9, 0xa1, 0x7a, 0xe2, 0xcb, 0xae, 0x54, 0xb1, - 0xb1, 0x9a, 0xb2, 0xc2, 0x2e, 0xa6, 0xb9, 0xb7, 0x35, 0xf4, 0x0c, 0x6a, 0xf1, 0x0f, 0x30, 0x08, - 0x47, 0x6f, 0x81, 0x69, 0xdf, 0x97, 0x1a, 0x1b, 0x53, 0x69, 0xb8, 0x74, 0xb4, 0x0d, 0x25, 0xff, - 0x03, 0x05, 0x52, 0x1f, 0x14, 0x63, 0x1f, 0x38, 0x1a, 0xf5, 0xd4, 0x35, 0x21, 0xe3, 0x29, 0x1f, - 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0xd5, 0xcc, 0x4b, 0x6a, 0x60, 0xf1, 0xb5, 0x69, 0x24, 0x42, 0x70, - 0x07, 0xaa, 0xd1, 0xc7, 0x58, 0xb4, 0x71, 0xde, 0x4b, 0x70, 0x63, 0x7d, 0x0a, 0x45, 0x20, 0x35, - 0xba, 0x1f, 0xda, 0xc8, 0x54, 0x25, 0x4d, 0x6a, 0xca, 0x03, 0x2d, 0xce, 0xa1, 0x1f, 0x03, 0x4a, - 0xbe, 0x30, 0xa2, 0xeb, 0x17, 0x79, 0x0d, 0x6d, 0xe0, 0x73, 0xa8, 0xc4, 0x0e, 0x3f, 0x82, 0xa5, - 0xc4, 0xdb, 0x18, 0x52, 0x27, 0xd9, 0xac, 0x37, 0xc7, 0xc6, 0xab, 0xd3, 0x89, 0x02, 0x03, 0x92, - 0x2f, 0x4b, 0x11, 0x03, 0x32, 0xdf, 0xc2, 0x22, 0x06, 0x64, 0x3c, 0x4f, 0x89, 0x5c, 0xf3, 0x6f, - 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x1c, 0xfa, 0x18, 0x8a, - 0x12, 0x85, 0x2e, 0x27, 0xc9, 0x7c, 0x09, 0x6b, 0x69, 0x4b, 0x42, 0xc0, 0x01, 0xcc, 0xab, 0x83, - 0x35, 0x5a, 0xcf, 0x7c, 0x1a, 0x13, 0xa2, 0xa6, 0x3e, 0x9d, 0x05, 0x46, 0xf1, 0x01, 0x26, 0x6e, - 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, 0x1e, 0x9c, 0x43, 0x7d, 0xfe, 0xe9, 0x2f, 0xd1, 0xbc, - 0xd1, 0x8d, 0x28, 0x4f, 0xd6, 0xa0, 0xd3, 0xb8, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0xe5, 0xa0, - 0x81, 0xa2, 0x57, 0x14, 0xa6, 0x78, 0x3b, 0x6f, 0x5c, 0x4e, 0x5f, 0x0c, 0x62, 0x20, 0x9b, 0x58, - 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, 0xda, 0xf3, 0x70, 0x0e, 0xed, 0x01, 0x84, 0x6d, 0x08, - 0x5d, 0x89, 0x74, 0xed, 0x58, 0x23, 0x6b, 0x34, 0x32, 0x56, 0x7d, 0xef, 0xcf, 0xab, 0x5d, 0x29, - 0x12, 0xcd, 0x94, 0x76, 0xd5, 0xa8, 0xa9, 0x6f, 0xc5, 0xac, 0x5a, 0xe3, 0x1c, 0xba, 0x0f, 0xd5, - 0x68, 0xb3, 0x8a, 0xd4, 0x83, 0xd4, 0x3e, 0x96, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0xba, 0x18, 0xba, - 0x15, 0x95, 0x38, 0xad, 0xd5, 0xa5, 0xca, 0x36, 0x61, 0x35, 0xbd, 0x1f, 0xa1, 0x9b, 0x51, 0xc9, - 0xd9, 0x5d, 0xb0, 0x71, 0xe3, 0x02, 0x94, 0xc2, 0xab, 0x1f, 0x42, 0x39, 0xf8, 0x1f, 0x43, 0x24, - 0x4f, 0xe2, 0xff, 0x6e, 0x88, 0xea, 0x3a, 0xa1, 0x96, 0xf7, 0xb6, 0xb6, 0x7d, 0xfb, 0x8f, 0x5f, - 0xad, 0x6b, 0x7f, 0xfb, 0x6a, 0x5d, 0xfb, 0xfb, 0x57, 0xeb, 0xda, 0xaf, 0xff, 0xb1, 0x9e, 0x03, - 0xdc, 0x1d, 0x6c, 0x76, 0xa9, 0x63, 0x6d, 0xea, 0xa6, 0xd1, 0xa5, 0x9b, 0xf6, 0xd6, 0xa6, 0xcf, - 0xe3, 0x8c, 0xba, 0x2e, 0x75, 0x26, 0xd4, 0x79, 0x36, 0x33, 0x3a, 0x3e, 0x9e, 0xe3, 0xff, 0x2c, - 0x7c, 0xf7, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x39, 0xf9, 0x3c, 0x20, 0x73, 0x28, 0x00, 0x00, + 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0xe9, 0x1f, 0xe8, 0x63, 0x5f, 0x0a, 0x14, 0xfb, 0x75, + 0xb7, 0xf7, 0x45, 0xc9, 0x4d, 0xf3, 0xd2, 0x37, 0xce, 0xec, 0xcc, 0xec, 0xec, 0xcc, 0xec, 0xcc, + 0xec, 0x1c, 0x61, 0x69, 0xe0, 0xb9, 0x81, 0xeb, 0xbf, 0xe5, 0xae, 0xb7, 0x5d, 0x27, 0xf0, 0x5c, + 0x7b, 0x8d, 0x23, 0x50, 0x25, 0x44, 0xe0, 0x25, 0x58, 0x6c, 0x8d, 0xa8, 0x13, 0x1c, 0x3d, 0xa4, + 0xbe, 0xeb, 0xef, 0x50, 0xd3, 0x0b, 0x8e, 0xa9, 0x19, 0x60, 0x1b, 0x9a, 0xad, 0xd1, 0x51, 0xcb, + 0x19, 0x59, 0x9e, 0xeb, 0xf4, 0xa9, 0x13, 0x1c, 0x04, 0x66, 0x40, 0x37, 0x7b, 0xa6, 0x73, 0x42, + 0x3b, 0x68, 0x11, 0x4a, 0x94, 0x71, 0x35, 0x8c, 0x55, 0xe3, 0x66, 0x85, 0x08, 0x00, 0x2d, 0xc1, + 0x94, 0xef, 0x0e, 0xbd, 0x36, 0x6d, 0x4c, 0x70, 0xb4, 0x84, 0xd0, 0x2a, 0x54, 0x3b, 0xd4, 0x0f, + 0x2c, 0xc7, 0x0c, 0x2c, 0xd7, 0x69, 0x4c, 0xf2, 0x45, 0x1d, 0x85, 0x37, 0x61, 0xa1, 0x35, 0x3a, + 0x3a, 0x34, 0xfd, 0xd3, 0xd8, 0x36, 0x4b, 0x30, 0x15, 0x98, 0xfe, 0xa9, 0xd5, 0x91, 0xfb, 0x48, + 0x88, 0x6d, 0xef, 0x33, 0x3a, 0xb9, 0x8f, 0x00, 0xf0, 0x7d, 0x76, 0x94, 0x50, 0xc8, 0xd0, 0x3f, + 0x4f, 0x0a, 0x53, 0x97, 0x13, 0x86, 0xea, 0x72, 0x08, 0xbf, 0x0e, 0x73, 0x52, 0xce, 0x03, 0x73, + 0xe8, 0xb4, 0x7b, 0xf9, 0x22, 0xb0, 0xc5, 0xf5, 0xe6, 0xa6, 0x63, 0xf4, 0x9b, 0x1e, 0x35, 0x03, + 0xda, 0x41, 0xd7, 0x61, 0x96, 0x11, 0x78, 0x54, 0x18, 0xc0, 0x97, 0x5c, 0x71, 0x24, 0x7a, 0x13, + 0xe6, 0xe9, 0x0b, 0xda, 0x1e, 0x06, 0xae, 0x47, 0x42, 0x4a, 0xa1, 0x4a, 0x7a, 0x01, 0x3f, 0x86, + 0x4b, 0x71, 0x87, 0xa8, 0xcd, 0x3e, 0x84, 0x2a, 0x8d, 0xb0, 0x7c, 0xab, 0xea, 0x7a, 0x73, 0x2d, + 0xf2, 0xb9, 0xc6, 0xb3, 0xeb, 0x74, 0x5d, 0xa2, 0x93, 0xe3, 0x9f, 0x1b, 0xb0, 0x1c, 0x97, 0xbb, + 0x45, 0xfd, 0xc0, 0x73, 0xcf, 0x68, 0x07, 0x7d, 0x1f, 0xe6, 0xdb, 0x36, 0x35, 0x9d, 0xe1, 0x80, + 0x1d, 0xce, 0x27, 0x74, 0x60, 0x9f, 0x49, 0xf9, 0x57, 0x34, 0xf9, 0x9b, 0x49, 0x1a, 0x92, 0x66, + 0x63, 0x26, 0xd1, 0xb6, 0xb5, 0x3a, 0xf2, 0xa0, 0x71, 0x24, 0xbe, 0xc4, 0xed, 0xa9, 0x29, 0xd3, + 0xf2, 0x3c, 0xd7, 0xc3, 0x0b, 0x30, 0xdf, 0x1a, 0x1d, 0x7d, 0x6a, 0xd9, 0x36, 0x97, 0xc8, 0xed, + 0x8d, 0xe7, 0x60, 0x56, 0xf8, 0x99, 0xd0, 0x2f, 0x86, 0xd4, 0x0f, 0xf0, 0x31, 0x54, 0x15, 0x82, + 0xed, 0x18, 0x06, 0x89, 0xa1, 0x05, 0x09, 0xba, 0x0b, 0xb3, 0xc2, 0xcd, 0x8f, 0x07, 0x1d, 0x33, + 0xe0, 0x06, 0x9f, 0xbc, 0x59, 0x5d, 0x5f, 0xd6, 0xce, 0x73, 0xa0, 0xad, 0x93, 0x38, 0x35, 0xfe, + 0x8b, 0x01, 0x33, 0xfa, 0x3a, 0x7a, 0x17, 0x4a, 0x36, 0x1d, 0x51, 0x9b, 0xef, 0x52, 0x5b, 0xbf, + 0x9a, 0x23, 0x67, 0xed, 0x01, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xad, 0x1f, 0xbb, 0x6e, 0xdc, + 0x1a, 0xd5, 0xf5, 0x6b, 0xba, 0xd7, 0x32, 0x6e, 0xe5, 0x4e, 0x81, 0x24, 0x18, 0xf1, 0x7b, 0x50, + 0xe2, 0xa2, 0x51, 0x05, 0x4a, 0x5b, 0xad, 0x8d, 0xc7, 0xdb, 0xf5, 0x02, 0x2a, 0x43, 0x71, 0x77, + 0xef, 0xfe, 0x7e, 0xdd, 0x40, 0x55, 0x98, 0x7e, 0x7a, 0x8f, 0xec, 0xed, 0xee, 0x6d, 0xd7, 0x27, + 0x18, 0x45, 0x8b, 0x90, 0x7d, 0x52, 0x9f, 0xdc, 0x98, 0x86, 0x12, 0x97, 0x8f, 0x7f, 0x36, 0x25, + 0x7f, 0xa1, 0x2b, 0x50, 0x09, 0xac, 0x3e, 0xf5, 0x03, 0xb3, 0x3f, 0x90, 0x26, 0x8b, 0x10, 0xc8, + 0x84, 0x65, 0x9a, 0x9d, 0x0b, 0xa4, 0xea, 0xdf, 0x8e, 0xa9, 0x9e, 0x97, 0x38, 0x76, 0x0a, 0x24, + 0x4f, 0x0e, 0x22, 0x80, 0x68, 0x2a, 0xba, 0x79, 0xb2, 0xa8, 0xae, 0xaf, 0xe6, 0x4a, 0x97, 0x74, + 0x3b, 0x05, 0x92, 0xc1, 0x8d, 0x1e, 0x40, 0x3d, 0x48, 0x24, 0x95, 0x46, 0x91, 0x4b, 0x5c, 0x89, + 0x4b, 0x4c, 0xa6, 0x9e, 0x9d, 0x02, 0x49, 0x71, 0xa2, 0x7d, 0x98, 0x0f, 0x92, 0xd9, 0xa5, 0x51, + 0xca, 0xf0, 0x5c, 0x3a, 0x09, 0xed, 0x14, 0x48, 0x9a, 0x17, 0x7d, 0x02, 0x33, 0x0c, 0x69, 0xcb, + 0x34, 0xd3, 0x98, 0x4a, 0xdf, 0xdd, 0x78, 0x22, 0xda, 0x29, 0x90, 0x18, 0x07, 0x3b, 0x60, 0x5f, + 0x65, 0x9f, 0xb6, 0x34, 0xd9, 0x74, 0xd6, 0x01, 0x93, 0x39, 0x8a, 0x1d, 0x30, 0xc9, 0x89, 0x3e, + 0x83, 0x45, 0x9a, 0x91, 0x08, 0x1a, 0x65, 0x2e, 0x11, 0xe7, 0x3a, 0x21, 0xa4, 0xdc, 0x29, 0x90, + 0x4c, 0x09, 0x4c, 0x4f, 0x9a, 0xb8, 0xd5, 0x8d, 0x4a, 0x96, 0x9e, 0xc9, 0xbb, 0xcf, 0xf4, 0x4c, + 0x72, 0xa2, 0xfb, 0x50, 0x3b, 0xb5, 0x6c, 0x3b, 0x08, 0x93, 0x41, 0x03, 0x52, 0x59, 0x29, 0x95, + 0x30, 0xd8, 0xe5, 0x89, 0x73, 0x6d, 0x54, 0x60, 0xfa, 0x91, 0x79, 0x66, 0xbb, 0x66, 0x07, 0x23, + 0xa8, 0x1f, 0x0c, 0x8f, 0xfd, 0xb6, 0x67, 0x1d, 0x53, 0x95, 0x50, 0x2e, 0xc3, 0xf2, 0x36, 0x0d, + 0xee, 0x7b, 0x66, 0x9f, 0x3e, 0x77, 0xbd, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0x6f, 0x0d, 0x98, 0x7e, + 0x42, 0x3d, 0xdf, 0x72, 0x1d, 0x96, 0x68, 0xfa, 0xe6, 0xe7, 0xae, 0xc7, 0x6f, 0x4d, 0x89, 0x08, + 0x80, 0x63, 0x2d, 0xc7, 0xf5, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0xec, 0xc0, 0x0c, 0xda, 0x3d, + 0x1e, 0xd7, 0x25, 0x22, 0x00, 0x86, 0x3d, 0x1e, 0x5a, 0xb6, 0x88, 0xcd, 0x0a, 0x11, 0x00, 0x2b, + 0x9b, 0x03, 0xcf, 0xed, 0x0c, 0xdb, 0xc1, 0x9e, 0xd9, 0xa7, 0x3c, 0xd0, 0x2a, 0x44, 0x47, 0xa1, + 0x15, 0x80, 0x91, 0x50, 0xe2, 0x20, 0xf0, 0x78, 0xf4, 0x54, 0x88, 0x86, 0xc1, 0xbf, 0x9c, 0x80, + 0x4b, 0xe9, 0x13, 0xb0, 0xe4, 0xb8, 0x0a, 0xd5, 0x6e, 0x88, 0x55, 0x55, 0x4d, 0x47, 0xf1, 0xea, + 0x14, 0xd9, 0xdd, 0xdf, 0x74, 0x87, 0x4e, 0x20, 0xcf, 0x92, 0x5e, 0x60, 0x9a, 0x70, 0xbb, 0x0a, + 0x32, 0x71, 0x38, 0x0d, 0x13, 0x25, 0xe3, 0xa2, 0x9e, 0x8c, 0x57, 0x00, 0x7a, 0xae, 0xaf, 0x84, + 0x97, 0x04, 0x57, 0x84, 0x41, 0x18, 0x66, 0x2c, 0xc7, 0x0f, 0x4c, 0xa7, 0x4d, 0xb9, 0x09, 0xc4, + 0x09, 0x63, 0x38, 0xf4, 0x26, 0x4c, 0xcb, 0x13, 0xcb, 0xc0, 0x47, 0x5a, 0x10, 0x48, 0x17, 0x11, + 0x45, 0xc2, 0x6a, 0xfb, 0x21, 0x35, 0xbd, 0x8e, 0xfb, 0xdc, 0x91, 0xae, 0x64, 0xb5, 0xdd, 0xa3, + 0xa6, 0xef, 0x3a, 0xaa, 0xb6, 0x0b, 0x88, 0xd5, 0x97, 0x88, 0x74, 0x60, 0x9f, 0xe1, 0x06, 0x2c, + 0x6d, 0xd3, 0x40, 0x0b, 0xd0, 0xb0, 0xf2, 0xbc, 0x80, 0xc5, 0xd4, 0xca, 0xc5, 0xac, 0xfc, 0x11, + 0xcc, 0xe8, 0xc6, 0x94, 0xd5, 0x68, 0x5c, 0xf5, 0x8e, 0xd1, 0xe3, 0x3f, 0x15, 0x61, 0x2e, 0x41, + 0x81, 0x6a, 0x30, 0x11, 0x36, 0x2a, 0x13, 0x16, 0x8f, 0x23, 0x79, 0xc1, 0x9f, 0xf6, 0xa8, 0x23, + 0x0b, 0xaf, 0x8e, 0x8a, 0xbc, 0x33, 0xa9, 0x7b, 0x67, 0x0d, 0x4a, 0xdc, 0x83, 0x8d, 0x22, 0x57, + 0xaa, 0xa1, 0x97, 0xb6, 0x9e, 0xeb, 0x05, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, 0xd9, + 0x73, 0xdd, 0x80, 0xb8, 0xb6, 0x0a, 0xd6, 0x10, 0x46, 0xb7, 0xa0, 0xde, 0x1e, 0x7a, 0x1e, 0x75, + 0x02, 0x32, 0x74, 0xf6, 0x86, 0xfd, 0x63, 0x2a, 0xe2, 0x75, 0x96, 0xa4, 0xf0, 0x68, 0x0b, 0xca, + 0x1d, 0xda, 0x35, 0x87, 0x76, 0xe0, 0x37, 0xa6, 0xf9, 0xd6, 0x37, 0xf3, 0xed, 0xb1, 0xb6, 0x25, + 0x49, 0x5b, 0x4e, 0xe0, 0x9d, 0x91, 0x90, 0x13, 0xdd, 0x86, 0xe2, 0xc8, 0xf4, 0xfc, 0x46, 0x99, + 0x4b, 0xb8, 0x3e, 0x46, 0xc2, 0x13, 0xd3, 0x93, 0xdc, 0x9c, 0x83, 0xed, 0x3f, 0xf4, 0xa9, 0xc7, + 0xd0, 0x8d, 0xca, 0xb9, 0xfb, 0x3f, 0x96, 0xa4, 0x72, 0x7f, 0xc5, 0xd9, 0xfc, 0x00, 0x66, 0x63, + 0xaa, 0xa1, 0x3a, 0x4c, 0x9e, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x64, 0xda, 0xc3, + 0xb0, 0x8d, 0xe5, 0xc0, 0x9d, 0x89, 0xdb, 0x46, 0xf3, 0x7d, 0xa8, 0x84, 0x32, 0x5f, 0x8a, 0xf1, + 0x03, 0x98, 0x8d, 0x29, 0xf4, 0x32, 0xcc, 0xf8, 0x0f, 0x06, 0x5c, 0xda, 0xa3, 0xcf, 0xb5, 0x13, + 0xaa, 0x3b, 0x72, 0x0b, 0xea, 0x2c, 0x60, 0xbb, 0xb6, 0xfb, 0xfc, 0x90, 0xf6, 0x07, 0x76, 0xd4, + 0x56, 0xa5, 0xf0, 0xe8, 0x23, 0x69, 0x78, 0x11, 0xca, 0xb7, 0x34, 0xd3, 0x65, 0xca, 0x4e, 0x9a, + 0xff, 0xbf, 0x3e, 0x3b, 0x3e, 0x80, 0x85, 0xe4, 0x0e, 0xec, 0x12, 0x7e, 0xbd, 0xfe, 0xf8, 0x35, + 0x9e, 0x41, 0x33, 0x4c, 0x92, 0xb8, 0x65, 0xf8, 0xa7, 0x06, 0x2c, 0x24, 0x29, 0xbf, 0xf6, 0xf6, + 0xe8, 0x2d, 0x28, 0x2b, 0x03, 0xcb, 0x46, 0x6b, 0x41, 0x63, 0x65, 0x57, 0x8b, 0xf3, 0x84, 0x44, + 0xf8, 0xaf, 0x06, 0x5c, 0xde, 0x14, 0xcb, 0xe7, 0x2b, 0x8d, 0x3e, 0x86, 0x62, 0x70, 0x36, 0x10, + 0xb6, 0xac, 0xad, 0xbf, 0xa1, 0x37, 0xf5, 0x79, 0x32, 0xd6, 0xf6, 0x07, 0x8c, 0x85, 0x70, 0x46, + 0x6c, 0xc2, 0x94, 0x80, 0x59, 0xd3, 0xb9, 0xb7, 0xbf, 0xff, 0xa8, 0x5e, 0x40, 0x08, 0x6a, 0x07, + 0x87, 0xf7, 0xc8, 0xe1, 0xd1, 0xbd, 0xcd, 0xc3, 0xdd, 0x27, 0xbb, 0x87, 0x3f, 0xac, 0x1b, 0x68, + 0x1e, 0x66, 0x0f, 0x0e, 0xf7, 0x1f, 0x45, 0xa8, 0x09, 0x34, 0x0b, 0x95, 0xcd, 0xfd, 0xbd, 0xfb, + 0xbb, 0xdb, 0x8f, 0x49, 0xab, 0x3e, 0xc9, 0xba, 0x53, 0xd2, 0x3a, 0x68, 0x1d, 0xd6, 0x8b, 0x68, + 0x06, 0xca, 0xdb, 0xfb, 0x47, 0xa2, 0x57, 0x2d, 0xe1, 0x53, 0x58, 0xce, 0x52, 0x86, 0xd9, 0x36, + 0x79, 0x9c, 0xcc, 0x77, 0x61, 0x66, 0xee, 0x99, 0xcc, 0xce, 0x3d, 0xf8, 0x57, 0x06, 0x34, 0x1e, + 0xba, 0x1d, 0xab, 0x7b, 0x76, 0x21, 0xeb, 0x81, 0x3b, 0xa0, 0x1e, 0x7f, 0xc2, 0xaa, 0x78, 0xbf, + 0x96, 0xed, 0xd9, 0x7d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x03, 0x6a, 0x1e, 0x6d, 0xbb, 0x4e, 0xd7, + 0x3a, 0x19, 0x7a, 0xf4, 0x9e, 0x6d, 0x73, 0xbd, 0xca, 0x24, 0x81, 0xc5, 0xbf, 0x31, 0x60, 0x31, + 0x4b, 0x18, 0xba, 0x23, 0xfd, 0x27, 0x1e, 0x1f, 0x37, 0xce, 0xd9, 0x3b, 0xe6, 0x3a, 0x91, 0xae, + 0x6d, 0x51, 0x58, 0x27, 0x54, 0xba, 0x16, 0x30, 0x7e, 0x27, 0xc3, 0xad, 0x73, 0x50, 0x25, 0xad, + 0x87, 0xfb, 0x4f, 0x5a, 0x47, 0x64, 0xff, 0x01, 0xf3, 0xd8, 0x0c, 0x94, 0xef, 0x6d, 0x6d, 0x09, + 0xa8, 0xc8, 0x1e, 0x92, 0x4b, 0x19, 0x96, 0x63, 0x6e, 0xfa, 0x14, 0xea, 0x5d, 0xd3, 0xb2, 0x69, + 0x67, 0x3f, 0xb2, 0x96, 0x71, 0x31, 0x6b, 0xa5, 0x18, 0xa5, 0x13, 0x26, 0xd2, 0x3e, 0xd7, 0x6b, + 0x17, 0xfe, 0xd2, 0x80, 0xcb, 0xb2, 0xfb, 0xbc, 0x80, 0x23, 0xaf, 0x40, 0xe5, 0x94, 0x52, 0xf1, + 0x5c, 0xe5, 0xa2, 0xcb, 0x24, 0x42, 0xa0, 0xb7, 0x61, 0xc1, 0xb4, 0x6d, 0xf7, 0xf9, 0xae, 0x43, + 0x86, 0x8e, 0x63, 0x39, 0x27, 0x07, 0xe1, 0x7e, 0x65, 0x92, 0xb5, 0xc4, 0x74, 0xea, 0xba, 0x5e, + 0x5b, 0x74, 0x3b, 0x65, 0x22, 0x00, 0x4c, 0x61, 0x39, 0x4b, 0x25, 0x66, 0xa1, 0xff, 0xe1, 0x4b, + 0x1b, 0xff, 0xd9, 0x80, 0x6b, 0x07, 0xb1, 0x44, 0xf4, 0xc8, 0x63, 0x31, 0x17, 0x58, 0xd4, 0xcf, + 0x33, 0xc0, 0x33, 0x80, 0x41, 0x48, 0x24, 0x23, 0xf9, 0x8e, 0x5e, 0xef, 0xc7, 0xcb, 0x5b, 0x8b, + 0x30, 0x22, 0x93, 0x6b, 0xd2, 0x9a, 0x77, 0x61, 0x2e, 0xb1, 0xfc, 0x52, 0x59, 0xfd, 0x1a, 0x5c, + 0xcd, 0xdf, 0x9d, 0x9d, 0xd7, 0x87, 0x6b, 0xdb, 0x2f, 0x79, 0xdc, 0x06, 0x4c, 0x7f, 0x31, 0xa4, + 0x9e, 0x3a, 0x6b, 0x85, 0x28, 0x90, 0xdd, 0x48, 0xfa, 0xa2, 0x6d, 0x0f, 0x3b, 0x74, 0xdb, 0x76, + 0x8f, 0x4d, 0xdb, 0x57, 0x37, 0x32, 0x8e, 0xc5, 0xbf, 0x37, 0xe0, 0xea, 0xf6, 0x38, 0xb5, 0xd0, + 0x67, 0x31, 0x93, 0x8a, 0x70, 0xbf, 0xad, 0x99, 0x74, 0x2c, 0xf7, 0x37, 0x69, 0xd0, 0x7f, 0x19, + 0x30, 0x1b, 0xeb, 0xdf, 0x10, 0x82, 0xa2, 0xc3, 0xb2, 0x80, 0x60, 0xe7, 0xbf, 0x59, 0x57, 0x6c, + 0xbb, 0xed, 0x53, 0xf9, 0xbe, 0x2f, 0x13, 0x09, 0xa9, 0x49, 0xd8, 0x6e, 0x47, 0xde, 0x37, 0x09, + 0x69, 0xc3, 0xb4, 0xa2, 0x3e, 0x4c, 0x8b, 0xae, 0x67, 0x49, 0x4f, 0xc9, 0x57, 0xa0, 0xd2, 0xb6, + 0x4d, 0xdf, 0xd7, 0xba, 0xfa, 0x08, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x81, 0xed, 0x9e, 0xa9, 0x9a, + 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x8a, 0x11, 0x91, 0x04, 0x13, 0x33, 0xca, 0xc0, + 0x12, 0x8f, 0xd7, 0x0a, 0x61, 0x3f, 0x59, 0x8d, 0x46, 0x69, 0x46, 0x96, 0x09, 0xd9, 0xa3, 0x43, + 0xb3, 0x41, 0x08, 0xb3, 0x50, 0x31, 0x4f, 0x18, 0xa1, 0xca, 0x39, 0x0a, 0x64, 0x2b, 0x6e, 0xb7, + 0x4b, 0xbd, 0xd0, 0x14, 0x0a, 0x64, 0xcf, 0x1a, 0x35, 0xbf, 0xdb, 0x55, 0x6f, 0x3a, 0x0d, 0x83, + 0xe7, 0x61, 0x6e, 0x9b, 0x06, 0xf2, 0xca, 0x8a, 0x17, 0xc4, 0xc7, 0x30, 0x1b, 0xa1, 0x58, 0xf8, + 0x84, 0xcd, 0xb7, 0x71, 0xa1, 0xe6, 0x1b, 0xdf, 0x84, 0x9a, 0x14, 0xa0, 0xbd, 0x6b, 0xa4, 0xa7, + 0x0c, 0xdd, 0x53, 0xf8, 0x7d, 0x98, 0x09, 0x29, 0xd9, 0x4e, 0xaf, 0x41, 0x91, 0xad, 0xc8, 0x74, + 0xb3, 0x90, 0xb0, 0x31, 0xdf, 0x83, 0x13, 0xe0, 0x16, 0xcc, 0xf2, 0x01, 0x02, 0xf3, 0x53, 0x6e, + 0xdc, 0xb0, 0xc7, 0x86, 0x60, 0x7f, 0xe8, 0x76, 0x68, 0xf8, 0xd8, 0x88, 0x50, 0xf8, 0x27, 0x50, + 0xdd, 0x74, 0xfb, 0x7d, 0xd3, 0xe9, 0x28, 0x2f, 0x51, 0x67, 0xc4, 0x8f, 0x59, 0x21, 0xec, 0x27, + 0x0f, 0x99, 0x1e, 0xb5, 0x6d, 0x19, 0x79, 0x02, 0x88, 0x02, 0x7a, 0x52, 0x0b, 0x68, 0x16, 0x48, + 0xa6, 0x77, 0x32, 0x14, 0x8f, 0xa7, 0x22, 0x97, 0x11, 0x21, 0x98, 0x82, 0xac, 0x1f, 0x97, 0xb1, + 0xc7, 0x7f, 0xe3, 0x87, 0x50, 0xdd, 0xec, 0x99, 0x8e, 0x43, 0xed, 0xdc, 0x33, 0x20, 0xad, 0x2b, + 0xaa, 0xc8, 0x6a, 0xc9, 0xad, 0xe9, 0x9d, 0xd0, 0x20, 0x8a, 0x7b, 0x06, 0xe1, 0x7f, 0x4e, 0x42, + 0x39, 0xbc, 0x48, 0xdf, 0x85, 0x8a, 0xcf, 0x9c, 0xc3, 0x63, 0x56, 0xd8, 0x33, 0xdf, 0x71, 0x11, + 0x29, 0xe3, 0x6b, 0x2b, 0xab, 0xca, 0x36, 0xaf, 0x91, 0xf0, 0x43, 0x68, 0x75, 0x12, 0x91, 0xa2, + 0x4f, 0x60, 0xce, 0x72, 0x8e, 0xdd, 0xa1, 0xd3, 0x91, 0x47, 0x62, 0xe9, 0x8a, 0x85, 0xcb, 0x92, + 0x5e, 0x34, 0xa2, 0xd3, 0x92, 0x24, 0x39, 0xda, 0x80, 0xba, 0x3b, 0x0c, 0xe2, 0x22, 0x8a, 0x63, + 0x45, 0xa4, 0xe8, 0xd1, 0x6d, 0xe6, 0xf2, 0xd0, 0xa1, 0x72, 0x20, 0x16, 0x63, 0x8f, 0x56, 0x89, + 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x66, 0xd0, 0x93, 0x59, 0x20, 0x84, 0xf9, 0x27, 0x06, + 0x67, 0xb4, 0x2b, 0xc6, 0x59, 0x15, 0x22, 0x00, 0xb4, 0x19, 0xcb, 0xaa, 0xe2, 0x75, 0xf6, 0xad, + 0x8c, 0x90, 0xfd, 0x26, 0x13, 0xe8, 0x5b, 0xb0, 0x10, 0x2f, 0xc4, 0xe2, 0xbe, 0x35, 0x60, 0x5a, + 0xdc, 0x30, 0x5f, 0x06, 0xb3, 0x02, 0xf1, 0x2f, 0x0c, 0x98, 0x4f, 0x95, 0x6e, 0x74, 0x07, 0xaa, + 0xa7, 0x96, 0x6d, 0xd3, 0xce, 0xe1, 0x85, 0xee, 0xb9, 0x4e, 0x8c, 0x3e, 0x84, 0x19, 0x4f, 0x34, + 0x1c, 0xaa, 0x67, 0x19, 0xcf, 0x1c, 0xa3, 0xc6, 0x9b, 0x3c, 0xff, 0xb0, 0xc7, 0x43, 0xa8, 0x7c, + 0x68, 0x6d, 0x43, 0xb7, 0x76, 0x13, 0xca, 0x03, 0x33, 0xe8, 0x1d, 0x0c, 0x68, 0x5b, 0xb5, 0x88, + 0x0a, 0xc6, 0x5f, 0x16, 0xa1, 0xac, 0xde, 0x1f, 0x79, 0x15, 0x24, 0xeb, 0xf3, 0x4a, 0xce, 0xb0, + 0xa1, 0x09, 0xe5, 0xee, 0xd0, 0xb6, 0x79, 0x28, 0x88, 0x8c, 0x19, 0xc2, 0xba, 0x65, 0x4b, 0x31, + 0xcb, 0xa2, 0xd7, 0xa1, 0xc4, 0x7a, 0x56, 0xbf, 0x31, 0xc5, 0x0d, 0x90, 0xf9, 0x36, 0x12, 0x14, + 0xe8, 0x6e, 0x6a, 0xaa, 0xf0, 0x6a, 0x06, 0x75, 0xee, 0x38, 0xe1, 0x9d, 0xd8, 0x38, 0xe1, 0x6a, + 0x16, 0x6b, 0x72, 0x8e, 0x70, 0x37, 0x35, 0x47, 0xc8, 0xdc, 0xf1, 0xff, 0x68, 0x80, 0x70, 0x87, + 0x57, 0x31, 0x19, 0x58, 0x2c, 0xc6, 0x43, 0xff, 0x18, 0xe7, 0xf9, 0x07, 0xff, 0xce, 0x80, 0x57, + 0xb6, 0x69, 0xf0, 0x34, 0x31, 0x4e, 0x08, 0x23, 0x74, 0x15, 0xaa, 0x1e, 0x1d, 0xb8, 0x8f, 0xcc, + 0x20, 0xa0, 0x9e, 0x9a, 0xd5, 0xe9, 0x28, 0x74, 0x13, 0xe6, 0x3c, 0x3a, 0xb2, 0x7c, 0xcb, 0x75, + 0x14, 0x95, 0xd0, 0x30, 0x89, 0x66, 0xb2, 0x4c, 0xdb, 0xde, 0xf0, 0x4c, 0xa7, 0xdd, 0xa3, 0xaa, + 0xc5, 0xd3, 0x51, 0xbc, 0xec, 0xdb, 0xf6, 0xa1, 0x79, 0xe2, 0xcb, 0x1e, 0x5e, 0x81, 0xf8, 0x18, + 0x16, 0x93, 0x3a, 0xaa, 0x2b, 0xc0, 0x94, 0x51, 0x57, 0x80, 0xfd, 0xe6, 0xf9, 0x4d, 0x8d, 0x4b, + 0xe4, 0xfd, 0x51, 0x30, 0x7f, 0x7e, 0x49, 0xb5, 0xe4, 0x4d, 0x08, 0x61, 0xfc, 0x39, 0x5c, 0xce, + 0x36, 0x05, 0xb3, 0xe9, 0x43, 0x98, 0x4f, 0xce, 0x5c, 0xb2, 0x9e, 0x53, 0x59, 0x4a, 0x92, 0x34, + 0x27, 0x46, 0x50, 0x7f, 0x60, 0xf9, 0xec, 0x1d, 0xe2, 0x6a, 0x5f, 0xd2, 0xca, 0x0c, 0xce, 0xbd, + 0xda, 0x0d, 0x98, 0x96, 0x17, 0x43, 0xd6, 0x68, 0x05, 0x32, 0x1f, 0xc8, 0x9f, 0x24, 0x7e, 0xb8, + 0x24, 0x1a, 0x7f, 0x01, 0x35, 0x6d, 0x5f, 0x15, 0x2c, 0x0c, 0xca, 0x0a, 0x16, 0xa9, 0x0d, 0x11, + 0x14, 0xe8, 0x3d, 0xb8, 0x74, 0xc2, 0x3b, 0xf1, 0xad, 0xc4, 0x66, 0xc2, 0xca, 0xd9, 0x8b, 0x78, + 0x0f, 0x6a, 0xf7, 0x3a, 0x1d, 0x26, 0x4b, 0x05, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x30, 0x91, 0x7d, + 0x04, 0x02, 0x33, 0xa1, 0x3c, 0xd1, 0xb3, 0x21, 0x87, 0x3e, 0x4f, 0xaa, 0x24, 0x64, 0x67, 0xac, + 0xb0, 0xdd, 0x2d, 0x55, 0xf1, 0x2b, 0x84, 0xff, 0xc6, 0xaf, 0xc3, 0x3c, 0xa1, 0x7d, 0x77, 0x44, + 0x75, 0x35, 0x17, 0xa1, 0x64, 0x39, 0x1d, 0xfa, 0x42, 0x7d, 0x61, 0xe0, 0x00, 0xfe, 0x1e, 0xcc, + 0xe9, 0xa4, 0x4c, 0x83, 0x1b, 0x50, 0xd3, 0xf7, 0x09, 0xc3, 0x31, 0x81, 0xc5, 0x6f, 0xc0, 0x02, + 0xa1, 0x5d, 0x8f, 0xfa, 0x3d, 0xdd, 0xef, 0x39, 0xfb, 0x7c, 0x07, 0x2e, 0x1d, 0xd0, 0x40, 0x63, + 0x1f, 0x4f, 0x7e, 0x97, 0x3f, 0x3f, 0xb7, 0xb3, 0x3c, 0xa0, 0x18, 0xf5, 0xd8, 0x37, 0x12, 0xb1, + 0xff, 0x03, 0xfe, 0xde, 0x63, 0xdb, 0xe4, 0x30, 0x67, 0xee, 0x1a, 0x13, 0x39, 0x91, 0x10, 0xf9, + 0x0e, 0xbc, 0x92, 0x27, 0x92, 0x19, 0x4d, 0xb9, 0xc1, 0xd0, 0xdc, 0x30, 0x0d, 0xa5, 0x56, 0x7f, + 0x10, 0x9c, 0xad, 0xff, 0x7b, 0x16, 0xa6, 0xe5, 0xf8, 0x09, 0x6d, 0x42, 0xf5, 0xd0, 0x33, 0xdb, + 0xf2, 0x23, 0x1e, 0x6a, 0xa4, 0xbe, 0xf5, 0x4a, 0x15, 0x9b, 0x4b, 0x19, 0x2b, 0xec, 0xa9, 0x5a, + 0x78, 0xdb, 0x40, 0xcf, 0xa0, 0x9e, 0xfc, 0x24, 0x83, 0x70, 0xfc, 0x5d, 0x98, 0xf5, 0xc5, 0xa9, + 0xb9, 0x3a, 0x96, 0x86, 0x4b, 0x47, 0x1b, 0x50, 0x56, 0x9f, 0x2c, 0x90, 0x3e, 0x62, 0x4c, 0x7c, + 0xf2, 0x68, 0x36, 0x32, 0xd7, 0x84, 0x8c, 0xa7, 0xbc, 0x39, 0xd0, 0xbf, 0x65, 0xa0, 0x57, 0x73, + 0x9f, 0xad, 0xe1, 0x89, 0xaf, 0x8d, 0x23, 0x11, 0x82, 0x0f, 0xa1, 0x16, 0x1f, 0xcf, 0xa2, 0xd5, + 0xf3, 0x66, 0xc3, 0xcd, 0x95, 0x31, 0x14, 0xa1, 0xd4, 0xf8, 0x7e, 0x68, 0x35, 0x57, 0x95, 0x2c, + 0xa9, 0x19, 0x23, 0x5b, 0x5c, 0x40, 0x3f, 0x06, 0x94, 0x9e, 0x39, 0xa2, 0xeb, 0x17, 0x99, 0x8f, + 0x36, 0xf1, 0x39, 0x54, 0x62, 0x87, 0x1f, 0xc1, 0x7c, 0x6a, 0x5a, 0x86, 0xf4, 0x4e, 0x36, 0x6f, + 0x0a, 0xd9, 0x7c, 0x75, 0x3c, 0x51, 0x78, 0x80, 0xf4, 0xac, 0x29, 0x76, 0x80, 0xdc, 0xe9, 0x58, + 0xec, 0x00, 0x39, 0x03, 0x2b, 0x11, 0x6b, 0xea, 0xc5, 0x1a, 0x8b, 0xb5, 0xc4, 0xcb, 0x36, 0x16, + 0x6b, 0xb1, 0x27, 0x2e, 0x2e, 0xa0, 0x8f, 0x61, 0x5a, 0xa2, 0xd0, 0xe5, 0x34, 0x99, 0x92, 0xb0, + 0x9c, 0xb5, 0x24, 0x04, 0xec, 0xc1, 0x8c, 0xde, 0x58, 0xa3, 0x95, 0xdc, 0x61, 0x99, 0x10, 0x35, + 0x76, 0x98, 0x16, 0x1e, 0x8a, 0x37, 0x30, 0xc9, 0x43, 0xe9, 0xed, 0x72, 0xf2, 0x50, 0x51, 0xc7, + 0x83, 0x0b, 0xa8, 0xcb, 0x3f, 0x06, 0xa6, 0x8a, 0x37, 0xba, 0x11, 0xe7, 0xc9, 0x6b, 0x74, 0x9a, + 0xd7, 0xcf, 0xa5, 0x13, 0xfb, 0xb4, 0xa0, 0x12, 0x16, 0x50, 0xf4, 0x8a, 0xc6, 0x94, 0x2c, 0xe7, + 0xcd, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x64, 0x11, 0x8b, 0xf9, 0x20, 0x5e, 0x28, 0x63, 0x3e, 0xd0, + 0x6b, 0x1e, 0x2e, 0xa0, 0x1d, 0x80, 0xa8, 0x0c, 0xa1, 0x2b, 0xb1, 0xaa, 0x9d, 0x28, 0x64, 0xcd, + 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x8c, 0x5e, 0x95, 0x62, 0xde, 0xcc, 0x28, 0x57, 0xcd, 0xba, 0x3e, + 0x3d, 0x66, 0xd9, 0x1a, 0x17, 0xd0, 0x7d, 0xa8, 0xc5, 0x8b, 0x55, 0x2c, 0x1f, 0x64, 0xd6, 0xb1, + 0x4c, 0x39, 0xcf, 0xa0, 0x91, 0x57, 0xc5, 0xd0, 0xad, 0xb8, 0xc4, 0x71, 0xa5, 0x2e, 0x53, 0xb6, + 0x0d, 0x4b, 0xd9, 0xf5, 0x08, 0xdd, 0x8c, 0x4b, 0xce, 0xaf, 0x82, 0xcd, 0x1b, 0x17, 0xa0, 0x14, + 0x56, 0xfd, 0x10, 0x2a, 0xe1, 0x3f, 0x1b, 0x62, 0x71, 0x92, 0xfc, 0xbf, 0x43, 0x5c, 0xd7, 0x11, + 0x75, 0x82, 0xb7, 0x8d, 0x8d, 0xdb, 0x7f, 0xfc, 0x6a, 0xc5, 0xf8, 0xdb, 0x57, 0x2b, 0xc6, 0xdf, + 0xbf, 0x5a, 0x31, 0x7e, 0xfd, 0x8f, 0x95, 0x02, 0xe0, 0x76, 0x6f, 0xad, 0x4d, 0x3d, 0x67, 0xcd, + 0xb4, 0xad, 0x36, 0x5d, 0x73, 0xd7, 0xd7, 0x14, 0x8f, 0x37, 0x68, 0xfb, 0xd4, 0x1b, 0x51, 0xef, + 0xd9, 0xc4, 0xe0, 0xf8, 0x78, 0x8a, 0xff, 0xd7, 0xf0, 0xdd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, + 0x94, 0x33, 0x95, 0x63, 0x85, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7256,6 +7265,13 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Pid) > 0 { + i -= len(m.Pid) + copy(dAtA[i:], m.Pid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) + i-- + dAtA[i] = 0x42 + } if m.DeploymentInfo != nil { { size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) @@ -9658,6 +9674,10 @@ func (m *ShortTaskInfo) Size() (n int) { l = m.DeploymentInfo.Size() n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Pid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15680,6 +15700,38 @@ func (m *ShortTaskInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 7ce0f4270..c12fcb25e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -294,6 +294,7 @@ message ShortTaskInfo { string state = 5; string className = 6; TaskDeploymentInfo deploymentInfo = 7; + string pid = 8; } message TaskDeploymentInfo { string hostname = 1; diff --git a/core/serverutil.go b/core/serverutil.go index 8239ab45a..4abf375a8 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -103,11 +103,13 @@ func taskToShortTaskInfo(t *task.Task) (sti *pb.ShortTaskInfo) { OfferId: t.GetOfferId(), ExecutorId: t.GetExecutorId(), }, + Pid: "UNKNOWN", } parentRole, ok := t.GetParentRole().(workflow.Role) if ok && parentRole != nil { sti.Status = parentRole.GetStatus().String() sti.State = parentRole.GetState().String() + sti.Pid = parentRole.GetTaskPID() } return } From 41f92bc1a50fddc70a8e9985ae35ace8bd050c77 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:32:56 +0300 Subject: [PATCH 0321/2352] [coconut] Print PID on GetTasks --- coconut/control/control.go | 6 +- coconut/protos/o2control.pb.go | 430 ++++++++++++++++++--------------- 2 files changed, 245 insertions(+), 191 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 02d9325be..cc8603bb4 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -528,7 +528,7 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a fmt.Fprintln(o, "no tasks running") } else { drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d tasks)", len(tasks)), "class name", "hostname", "locked", "status", "state"}, + []string{fmt.Sprintf("task id (%d tasks)", len(tasks)), "class name", "hostname", "locked", "status", "state","PID"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), @@ -536,7 +536,9 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a t.GetDeploymentInfo().GetHostname(), strconv.FormatBool(t.GetLocked()), t.GetStatus(), - colorState(t.GetState())} + colorState(t.GetState()), + t.GetPid(), + } }, o) } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index d925a7489..91254d084 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2385,6 +2385,7 @@ type ShortTaskInfo struct { State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2472,6 +2473,13 @@ func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { return nil } +func (m *ShortTaskInfo) GetPid() string { + if m != nil { + return m.Pid + } + return "" +} + type TaskDeploymentInfo struct { Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` @@ -4253,197 +4261,198 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3040 bytes of a gzipped FileDescriptorProto + // 3048 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x22, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x51, 0xb4, 0xa4, 0xc6, 0x16, 0xdd, - 0x15, 0x6d, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, + 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, + 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, - 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0x29, 0xd0, 0xe7, 0xfe, 0x81, 0x02, 0xc5, 0x7e, 0xdc, - 0xdd, 0xde, 0x17, 0x25, 0x37, 0xcd, 0x4b, 0xdf, 0x38, 0xb3, 0x33, 0xb3, 0xf3, 0xb5, 0x33, 0xb3, - 0x7b, 0x84, 0xd5, 0x91, 0x63, 0x7b, 0xb6, 0xfb, 0x96, 0xbd, 0xd5, 0xb5, 0x2d, 0xcf, 0xb1, 0xcd, - 0x4d, 0x8e, 0x40, 0xe5, 0x00, 0x81, 0x57, 0x61, 0xa5, 0x35, 0xa1, 0x96, 0x77, 0xf4, 0x90, 0xba, - 0xb6, 0xbb, 0x47, 0x75, 0xc7, 0x3b, 0xa6, 0xba, 0x87, 0x4d, 0x68, 0xb4, 0x26, 0x47, 0x2d, 0x6b, - 0x62, 0x38, 0xb6, 0x35, 0xa4, 0x96, 0x77, 0xe8, 0xe9, 0x1e, 0x6d, 0x0e, 0x74, 0xeb, 0x84, 0xf6, - 0xd0, 0x0a, 0x14, 0x28, 0xe3, 0xaa, 0x6b, 0x1b, 0xda, 0xcd, 0x32, 0x11, 0x00, 0x5a, 0x85, 0x39, - 0xd7, 0x1e, 0x3b, 0x5d, 0x5a, 0x9f, 0xe1, 0x68, 0x09, 0xa1, 0x0d, 0xa8, 0xf4, 0xa8, 0xeb, 0x19, - 0x96, 0xee, 0x19, 0xb6, 0x55, 0x9f, 0xe5, 0x8b, 0x2a, 0x0a, 0x37, 0x61, 0xb9, 0x35, 0x39, 0xea, - 0xe8, 0xee, 0x69, 0x64, 0x9b, 0x55, 0x98, 0xf3, 0x74, 0xf7, 0xd4, 0xe8, 0xc9, 0x7d, 0x24, 0xc4, - 0xb6, 0x77, 0x19, 0x9d, 0xdc, 0x47, 0x00, 0xf8, 0x3e, 0x33, 0x25, 0x10, 0x32, 0x76, 0xcf, 0x93, - 0xc2, 0xd4, 0xe5, 0x84, 0x81, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0xa2, 0x94, 0xf3, 0x40, 0x1f, 0x5b, - 0xdd, 0x41, 0xb6, 0x08, 0x6c, 0x70, 0xbd, 0xb9, 0xeb, 0x18, 0x7d, 0xd3, 0xa1, 0xba, 0x47, 0x7b, - 0xe8, 0x3a, 0x2c, 0x30, 0x02, 0x87, 0x0a, 0x07, 0xb8, 0x92, 0x2b, 0x8a, 0x44, 0x6f, 0xc2, 0x12, - 0x7d, 0x41, 0xbb, 0x63, 0xcf, 0x76, 0x48, 0x40, 0x29, 0x54, 0x49, 0x2e, 0xe0, 0xc7, 0x70, 0x29, - 0x1a, 0x10, 0x7f, 0xb3, 0x0f, 0xa1, 0x42, 0x43, 0x2c, 0xdf, 0xaa, 0xb2, 0xd5, 0xd8, 0x0c, 0x63, - 0xae, 0xf0, 0xec, 0x5b, 0x7d, 0x9b, 0xa8, 0xe4, 0xf8, 0xe7, 0x1a, 0xac, 0x45, 0xe5, 0xee, 0x50, - 0xd7, 0x73, 0xec, 0x33, 0xda, 0x43, 0xdf, 0x87, 0xa5, 0xae, 0x49, 0x75, 0x6b, 0x3c, 0x62, 0xc6, - 0xb9, 0x84, 0x8e, 0xcc, 0x33, 0x29, 0xff, 0x8a, 0x22, 0xbf, 0x19, 0xa7, 0x21, 0x49, 0x36, 0xe6, - 0x12, 0x65, 0x5b, 0xa3, 0x27, 0x0d, 0x8d, 0x22, 0xf1, 0x25, 0xee, 0x4f, 0x45, 0x99, 0x96, 0xe3, - 0xd8, 0x0e, 0x5e, 0x86, 0xa5, 0xd6, 0xe4, 0xe8, 0x53, 0xc3, 0x34, 0xb9, 0x44, 0xee, 0x6f, 0xbc, - 0x08, 0x0b, 0x22, 0xce, 0x84, 0x7e, 0x31, 0xa6, 0xae, 0x87, 0x8f, 0xa1, 0xe2, 0x23, 0xd8, 0x8e, - 0x41, 0x92, 0x68, 0x4a, 0x92, 0xa0, 0xbb, 0xb0, 0x20, 0xc2, 0xfc, 0x78, 0xd4, 0xd3, 0x3d, 0xee, - 0xf0, 0xd9, 0x9b, 0x95, 0xad, 0x35, 0xc5, 0x9e, 0x43, 0x65, 0x9d, 0x44, 0xa9, 0xf1, 0x5f, 0x34, - 0x98, 0x57, 0xd7, 0xd1, 0xbb, 0x50, 0x30, 0xe9, 0x84, 0x9a, 0x7c, 0x97, 0xea, 0xd6, 0xd5, 0x0c, - 0x39, 0x9b, 0x0f, 0x18, 0x11, 0x11, 0xb4, 0x68, 0x1f, 0xaa, 0xc3, 0xc8, 0x71, 0xe3, 0xde, 0xa8, - 0x6c, 0x5d, 0x53, 0xa3, 0x96, 0x72, 0x2a, 0xf7, 0x72, 0x24, 0xc6, 0x88, 0xdf, 0x83, 0x02, 0x17, - 0x8d, 0xca, 0x50, 0xd8, 0x69, 0x6d, 0x3f, 0xde, 0xad, 0xe5, 0x50, 0x09, 0xf2, 0xfb, 0x07, 0xf7, - 0xdb, 0x35, 0x0d, 0x55, 0xa0, 0xf8, 0xf4, 0x1e, 0x39, 0xd8, 0x3f, 0xd8, 0xad, 0xcd, 0x30, 0x8a, - 0x16, 0x21, 0x6d, 0x52, 0x9b, 0xdd, 0x2e, 0x42, 0x81, 0xcb, 0xc7, 0x3f, 0x9b, 0x93, 0xbf, 0xd0, - 0x15, 0x28, 0x7b, 0xc6, 0x90, 0xba, 0x9e, 0x3e, 0x1c, 0x49, 0x97, 0x85, 0x08, 0xa4, 0xc3, 0x1a, - 0x4d, 0xaf, 0x05, 0x52, 0xf5, 0x6f, 0x47, 0x54, 0xcf, 0x2a, 0x1c, 0x7b, 0x39, 0x92, 0x25, 0x07, - 0x11, 0x40, 0x34, 0x91, 0xdd, 0xbc, 0x58, 0x54, 0xb6, 0x36, 0x32, 0xa5, 0x4b, 0xba, 0xbd, 0x1c, - 0x49, 0xe1, 0x46, 0x0f, 0xa0, 0xe6, 0xc5, 0x8a, 0x4a, 0x3d, 0xcf, 0x25, 0xae, 0x47, 0x25, 0xc6, - 0x4b, 0xcf, 0x5e, 0x8e, 0x24, 0x38, 0x51, 0x1b, 0x96, 0xbc, 0x78, 0x75, 0xa9, 0x17, 0x52, 0x22, - 0x97, 0x2c, 0x42, 0x7b, 0x39, 0x92, 0xe4, 0x45, 0x9f, 0xc0, 0x3c, 0x43, 0x9a, 0xb2, 0xcc, 0xd4, - 0xe7, 0x92, 0x67, 0x37, 0x5a, 0x88, 0xf6, 0x72, 0x24, 0xc2, 0xc1, 0x0c, 0x1c, 0xfa, 0xd5, 0xa7, - 0x2b, 0x5d, 0x56, 0x4c, 0x33, 0x30, 0x5e, 0xa3, 0x98, 0x81, 0x71, 0x4e, 0xf4, 0x19, 0xac, 0xd0, - 0x94, 0x42, 0x50, 0x2f, 0x71, 0x89, 0x38, 0x33, 0x08, 0x01, 0xe5, 0x5e, 0x8e, 0xa4, 0x4a, 0x60, - 0x7a, 0xd2, 0xd8, 0xa9, 0xae, 0x97, 0xd3, 0xf4, 0x8c, 0x9f, 0x7d, 0xa6, 0x67, 0x9c, 0x13, 0xdd, - 0x87, 0xea, 0xa9, 0x61, 0x9a, 0x5e, 0x50, 0x0c, 0xea, 0x90, 0xa8, 0x4a, 0x89, 0x82, 0xc1, 0x0e, - 0x4f, 0x94, 0x6b, 0xbb, 0x0c, 0xc5, 0x47, 0xfa, 0x99, 0x69, 0xeb, 0x3d, 0x8c, 0xa0, 0x76, 0x38, - 0x3e, 0x76, 0xbb, 0x8e, 0x71, 0x4c, 0xfd, 0x82, 0x72, 0x19, 0xd6, 0x76, 0xa9, 0x77, 0xdf, 0xd1, - 0x87, 0xf4, 0xb9, 0xed, 0x9c, 0xf2, 0xe2, 0x29, 0x97, 0x7e, 0xab, 0x41, 0xf1, 0x09, 0x75, 0x5c, - 0xc3, 0xb6, 0x58, 0xa1, 0x19, 0xea, 0x9f, 0xdb, 0x0e, 0x3f, 0x35, 0x05, 0x22, 0x00, 0x8e, 0x35, - 0x2c, 0xdb, 0xe1, 0xe7, 0x83, 0x61, 0x19, 0xc0, 0xb0, 0x23, 0xdd, 0xeb, 0x0e, 0x78, 0x5e, 0x17, - 0x88, 0x00, 0x18, 0xf6, 0x78, 0x6c, 0x98, 0x22, 0x37, 0xcb, 0x44, 0x00, 0xac, 0x6d, 0x8e, 0x1c, - 0xbb, 0x37, 0xee, 0x7a, 0x07, 0xfa, 0x90, 0xf2, 0x44, 0x2b, 0x13, 0x15, 0x85, 0xd6, 0x01, 0x26, - 0x42, 0x89, 0x43, 0xcf, 0xe1, 0xd9, 0x53, 0x26, 0x0a, 0x06, 0xff, 0x72, 0x06, 0x2e, 0x25, 0x2d, - 0x60, 0xc5, 0x71, 0x03, 0x2a, 0xfd, 0x00, 0xeb, 0x77, 0x35, 0x15, 0xc5, 0xbb, 0x53, 0xe8, 0x77, - 0xb7, 0x69, 0x8f, 0x2d, 0x4f, 0xda, 0x92, 0x5c, 0x60, 0x9a, 0x70, 0xbf, 0x0a, 0x32, 0x61, 0x9c, - 0x82, 0x09, 0x8b, 0x71, 0x5e, 0x2d, 0xc6, 0xeb, 0x00, 0x03, 0xdb, 0xf5, 0x85, 0x17, 0x04, 0x57, - 0x88, 0x41, 0x18, 0xe6, 0x0d, 0xcb, 0xf5, 0x74, 0xab, 0x4b, 0xb9, 0x0b, 0x84, 0x85, 0x11, 0x1c, - 0x7a, 0x13, 0x8a, 0xd2, 0x62, 0x99, 0xf8, 0x48, 0x49, 0x02, 0x19, 0x22, 0xe2, 0x93, 0xb0, 0xde, - 0xde, 0xa1, 0xba, 0xd3, 0xb3, 0x9f, 0x5b, 0x32, 0x94, 0xac, 0xb7, 0x3b, 0x54, 0x77, 0x6d, 0xcb, - 0xef, 0xed, 0x02, 0x62, 0xfd, 0x25, 0x24, 0x1d, 0x99, 0x67, 0xb8, 0x0e, 0xab, 0xbb, 0xd4, 0x53, - 0x12, 0x34, 0xe8, 0x3c, 0x2f, 0x60, 0x25, 0xb1, 0x72, 0x31, 0x2f, 0x7f, 0x04, 0xf3, 0xaa, 0x33, - 0x65, 0x37, 0x9a, 0xd6, 0xbd, 0x23, 0xf4, 0xf8, 0x4f, 0x79, 0x58, 0x8c, 0x51, 0xa0, 0x2a, 0xcc, - 0x04, 0x83, 0xca, 0x8c, 0xc1, 0xf3, 0x48, 0x1e, 0xf0, 0xa7, 0x03, 0x6a, 0xc9, 0xc6, 0xab, 0xa2, - 0xc2, 0xe8, 0xcc, 0xaa, 0xd1, 0xd9, 0x84, 0x02, 0x8f, 0x60, 0x3d, 0xcf, 0x95, 0xaa, 0xab, 0xad, - 0x6d, 0x60, 0x3b, 0x1e, 0x3b, 0x5a, 0x5c, 0x25, 0x41, 0x86, 0x1a, 0x50, 0x72, 0x6c, 0xdb, 0x23, - 0xb6, 0xe9, 0x27, 0x6b, 0x00, 0xa3, 0x5b, 0x50, 0xeb, 0x8e, 0x1d, 0x87, 0x5a, 0x1e, 0x19, 0x5b, - 0x07, 0xe3, 0xe1, 0x31, 0x15, 0xf9, 0xba, 0x40, 0x12, 0x78, 0xb4, 0x03, 0xa5, 0x1e, 0xed, 0xeb, - 0x63, 0xd3, 0x73, 0xeb, 0x45, 0xbe, 0xf5, 0xcd, 0x6c, 0x7f, 0x6c, 0xee, 0x48, 0xd2, 0x96, 0xe5, - 0x39, 0x67, 0x24, 0xe0, 0x44, 0xb7, 0x21, 0x3f, 0xd1, 0x1d, 0xb7, 0x5e, 0xe2, 0x12, 0xae, 0x4f, - 0x91, 0xf0, 0x44, 0x77, 0x24, 0x37, 0xe7, 0x60, 0xfb, 0x8f, 0x5d, 0xea, 0x30, 0x74, 0xbd, 0x7c, - 0xee, 0xfe, 0x8f, 0x25, 0xa9, 0xdc, 0xdf, 0xe7, 0x6c, 0x7c, 0x00, 0x0b, 0x11, 0xd5, 0x50, 0x0d, - 0x66, 0x4f, 0xe9, 0x99, 0x8c, 0x0b, 0xfb, 0xc9, 0xdc, 0x3e, 0xd1, 0xcd, 0x71, 0x30, 0xc6, 0x72, - 0xe0, 0xce, 0xcc, 0x6d, 0xad, 0xf1, 0x3e, 0x94, 0x03, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0x2c, 0x44, - 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x07, 0x0d, 0x2e, 0x1d, 0xd0, 0xe7, 0x8a, 0x85, 0xfe, 0x19, 0xb9, - 0x05, 0x35, 0x96, 0xb0, 0x7d, 0xd3, 0x7e, 0xde, 0xa1, 0xc3, 0x91, 0x19, 0x8e, 0x55, 0x09, 0x3c, - 0xfa, 0x48, 0x3a, 0x5e, 0xa4, 0xf2, 0x2d, 0xc5, 0x75, 0xa9, 0xb2, 0xe3, 0xee, 0xff, 0xaf, 0x6d, - 0xc7, 0x87, 0xb0, 0x1c, 0xdf, 0x81, 0x1d, 0xc2, 0xaf, 0x37, 0x1f, 0xbf, 0xc6, 0x2b, 0x68, 0x8a, - 0x4b, 0x62, 0xa7, 0x0c, 0xff, 0x54, 0x83, 0xe5, 0x38, 0xe5, 0xd7, 0xde, 0x1e, 0xbd, 0x05, 0x25, - 0xdf, 0xc1, 0x72, 0xd0, 0x5a, 0x56, 0x58, 0xd9, 0xd1, 0xe2, 0x3c, 0x01, 0x11, 0xfe, 0xab, 0x06, - 0x97, 0x9b, 0x62, 0xf9, 0x7c, 0xa5, 0xd1, 0xc7, 0x90, 0xf7, 0xce, 0x46, 0xc2, 0x97, 0xd5, 0xad, - 0x37, 0xd4, 0xa1, 0x3e, 0x4b, 0xc6, 0x66, 0x7b, 0xc4, 0x58, 0x08, 0x67, 0xc4, 0x3a, 0xcc, 0x09, - 0x98, 0x0d, 0x9d, 0x07, 0xed, 0xf6, 0xa3, 0x5a, 0x0e, 0x21, 0xa8, 0x1e, 0x76, 0xee, 0x91, 0xce, - 0xd1, 0xbd, 0x66, 0x67, 0xff, 0xc9, 0x7e, 0xe7, 0x87, 0x35, 0x0d, 0x2d, 0xc1, 0xc2, 0x61, 0xa7, - 0xfd, 0x28, 0x44, 0xcd, 0xa0, 0x05, 0x28, 0x37, 0xdb, 0x07, 0xf7, 0xf7, 0x77, 0x1f, 0x93, 0x56, - 0x6d, 0x96, 0x4d, 0xa7, 0xa4, 0x75, 0xd8, 0xea, 0xd4, 0xf2, 0x68, 0x1e, 0x4a, 0xbb, 0xed, 0x23, - 0x31, 0xab, 0x16, 0xf0, 0x29, 0xac, 0xa5, 0x29, 0xc3, 0x7c, 0x1b, 0x37, 0x27, 0xf5, 0x5e, 0x98, - 0x5a, 0x7b, 0x66, 0xd3, 0x6b, 0x0f, 0xfe, 0x95, 0x06, 0xf5, 0x87, 0x76, 0xcf, 0xe8, 0x9f, 0x5d, - 0xc8, 0x7b, 0x60, 0x8f, 0xa8, 0xc3, 0xaf, 0xb0, 0x7e, 0xbe, 0x5f, 0x4b, 0x8f, 0x6c, 0xdb, 0xa7, - 0x23, 0x0a, 0x0b, 0xba, 0x01, 0x55, 0x87, 0x76, 0x6d, 0xab, 0x6f, 0x9c, 0x8c, 0x1d, 0x7a, 0xcf, - 0x34, 0xb9, 0x5e, 0x25, 0x12, 0xc3, 0xe2, 0xdf, 0x68, 0xb0, 0x92, 0x26, 0x0c, 0xdd, 0x91, 0xf1, - 0x13, 0x97, 0x8f, 0x1b, 0xe7, 0xec, 0x1d, 0x09, 0x9d, 0x28, 0xd7, 0xa6, 0x68, 0xac, 0x33, 0x7e, - 0xb9, 0x16, 0x30, 0x7e, 0x27, 0x25, 0xac, 0x8b, 0x50, 0x21, 0xad, 0x87, 0xed, 0x27, 0xad, 0x23, - 0xd2, 0x7e, 0xc0, 0x22, 0x36, 0x0f, 0xa5, 0x7b, 0x3b, 0x3b, 0x02, 0xca, 0xb3, 0x8b, 0xe4, 0x6a, - 0x8a, 0xe7, 0x58, 0x98, 0x3e, 0x85, 0x5a, 0x5f, 0x37, 0x4c, 0xda, 0x6b, 0x87, 0xde, 0xd2, 0x2e, - 0xe6, 0xad, 0x04, 0xa3, 0x0c, 0xc2, 0x4c, 0x32, 0xe6, 0x6a, 0xef, 0xc2, 0x5f, 0x6a, 0x70, 0x59, - 0x4e, 0x9f, 0x17, 0x08, 0xe4, 0x15, 0x28, 0x9f, 0x52, 0x2a, 0xae, 0xab, 0x5c, 0x74, 0x89, 0x84, - 0x08, 0xf4, 0x36, 0x2c, 0xeb, 0xa6, 0x69, 0x3f, 0xdf, 0xb7, 0xc8, 0xd8, 0xb2, 0x0c, 0xeb, 0xe4, - 0x30, 0xd8, 0xaf, 0x44, 0xd2, 0x96, 0x98, 0x4e, 0x7d, 0xdb, 0xe9, 0x8a, 0x69, 0xa7, 0x44, 0x04, - 0x80, 0x29, 0xac, 0xa5, 0xa9, 0xc4, 0x3c, 0xf4, 0x3f, 0xbc, 0x69, 0xe3, 0x3f, 0x6b, 0x70, 0xed, - 0x30, 0x52, 0x88, 0x1e, 0x39, 0x2c, 0xe7, 0x3c, 0x83, 0xba, 0x59, 0x0e, 0x78, 0x06, 0x30, 0x0a, - 0x88, 0x64, 0x26, 0xdf, 0x51, 0xfb, 0xfd, 0x74, 0x79, 0x9b, 0x21, 0x46, 0x54, 0x72, 0x45, 0x5a, - 0xe3, 0x2e, 0x2c, 0xc6, 0x96, 0x5f, 0xaa, 0xaa, 0x5f, 0x83, 0xab, 0xd9, 0xbb, 0x33, 0x7b, 0x5d, - 0xb8, 0xb6, 0xfb, 0x92, 0xe6, 0xd6, 0xa1, 0xf8, 0xc5, 0x98, 0x3a, 0xbe, 0xad, 0x65, 0xe2, 0x83, - 0xec, 0x44, 0xd2, 0x17, 0x5d, 0x73, 0xdc, 0xa3, 0xbb, 0xa6, 0x7d, 0xac, 0x9b, 0xae, 0x7f, 0x22, - 0xa3, 0x58, 0xfc, 0x7b, 0x0d, 0xae, 0xee, 0x4e, 0x53, 0x0b, 0x7d, 0x16, 0x71, 0xa9, 0x48, 0xf7, - 0xdb, 0x8a, 0x4b, 0xa7, 0x72, 0x7f, 0x93, 0x0e, 0xfd, 0xa7, 0x06, 0x0b, 0x91, 0xf9, 0x0d, 0x21, - 0xc8, 0x5b, 0xac, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x4d, 0xc5, 0xa6, 0xdd, 0x3d, 0x95, 0xf7, 0xfb, - 0x12, 0x91, 0x90, 0xff, 0x12, 0xb6, 0xdf, 0x93, 0xe7, 0x4d, 0x42, 0xca, 0x63, 0x5a, 0x5e, 0x7d, - 0x4c, 0x0b, 0x8f, 0x67, 0x41, 0x2d, 0xc9, 0x57, 0xa0, 0xdc, 0x35, 0x75, 0xd7, 0x55, 0xa6, 0xfa, - 0x10, 0x81, 0x5a, 0x50, 0xed, 0xd1, 0x91, 0x69, 0x9f, 0xf9, 0x3d, 0x51, 0x4e, 0xf6, 0xea, 0xe3, - 0x0a, 0x53, 0x7e, 0x27, 0x42, 0x44, 0x62, 0x4c, 0xac, 0x23, 0xa3, 0x24, 0x19, 0xab, 0x7b, 0xec, - 0x8a, 0xa1, 0x58, 0x1c, 0xc0, 0x2c, 0x31, 0xf4, 0x13, 0x46, 0xe8, 0x57, 0x18, 0x1f, 0x64, 0x2b, - 0x76, 0xbf, 0x4f, 0x9d, 0xc0, 0x70, 0x1f, 0x64, 0x97, 0x18, 0xff, 0xb5, 0x6e, 0xdf, 0xbf, 0xc1, - 0x29, 0x18, 0xbc, 0x04, 0x8b, 0xbb, 0xd4, 0x93, 0x07, 0x54, 0xdc, 0x17, 0x3e, 0x86, 0x85, 0x10, - 0xc5, 0x92, 0x25, 0x18, 0xb5, 0xb5, 0x0b, 0x8d, 0xda, 0xf8, 0x26, 0x54, 0xa5, 0x00, 0xe5, 0x16, - 0x23, 0xe3, 0xa2, 0xa9, 0x71, 0xc1, 0xef, 0xc3, 0x7c, 0x40, 0xc9, 0x76, 0x7a, 0x0d, 0xf2, 0x6c, - 0x45, 0x16, 0x97, 0xe5, 0x98, 0x47, 0xf9, 0x1e, 0x9c, 0x00, 0xb7, 0x60, 0x81, 0x3f, 0x17, 0xb0, - 0xa8, 0x64, 0x66, 0x09, 0xbb, 0x5a, 0x08, 0xf6, 0x87, 0x76, 0x8f, 0x06, 0x57, 0x8b, 0x10, 0x85, - 0x7f, 0x02, 0x95, 0xa6, 0x3d, 0x1c, 0xea, 0x56, 0x8f, 0x0b, 0xa9, 0xc1, 0x2c, 0xb5, 0x26, 0xdc, - 0xcc, 0x32, 0x61, 0x3f, 0x79, 0x82, 0x0c, 0xa8, 0x69, 0xca, 0x3c, 0x13, 0x40, 0x98, 0xbe, 0xb3, - 0x4a, 0xfa, 0xb2, 0xb4, 0xd1, 0x9d, 0x93, 0xb1, 0xb8, 0x2a, 0xe5, 0xb9, 0x8c, 0x10, 0xc1, 0x14, - 0x64, 0xd3, 0xb7, 0xcc, 0x34, 0xfe, 0x1b, 0x3f, 0x84, 0x4a, 0x73, 0xa0, 0x5b, 0x16, 0x35, 0x33, - 0x6d, 0x40, 0xca, 0x0c, 0x54, 0x96, 0xbd, 0x91, 0x7b, 0xd3, 0x39, 0xa1, 0x5e, 0x98, 0xe5, 0x0c, - 0xc2, 0xff, 0x9a, 0x85, 0x52, 0x70, 0x6c, 0xbe, 0x0b, 0x65, 0x97, 0x05, 0x87, 0x67, 0xa8, 0xf0, - 0x67, 0x76, 0xe0, 0x42, 0x52, 0xc6, 0xd7, 0xf5, 0xbd, 0x2a, 0x87, 0xba, 0x7a, 0x2c, 0x0e, 0x81, - 0xd7, 0x49, 0x48, 0x8a, 0x3e, 0x81, 0x45, 0xc3, 0x3a, 0xb6, 0xc7, 0x56, 0x4f, 0x9a, 0xc4, 0x8a, - 0x13, 0x4b, 0x97, 0x55, 0xb5, 0x45, 0x84, 0xd6, 0x92, 0x38, 0x39, 0xda, 0x86, 0x9a, 0x3d, 0xf6, - 0xa2, 0x22, 0xf2, 0x53, 0x45, 0x24, 0xe8, 0xd1, 0x6d, 0x16, 0xf2, 0x20, 0xa0, 0xf2, 0xf9, 0x2b, - 0xc2, 0x1e, 0xae, 0x12, 0x95, 0x94, 0x1d, 0x3c, 0x96, 0x59, 0x8f, 0x74, 0x6f, 0x20, 0xcf, 0x7c, - 0x00, 0xf3, 0x0f, 0x0a, 0xd6, 0x64, 0x5f, 0x3c, 0x5e, 0x95, 0x89, 0x00, 0x50, 0x33, 0x52, 0x43, - 0xc5, 0x5d, 0xec, 0x5b, 0x29, 0x29, 0xfb, 0x4d, 0x96, 0xcb, 0xb7, 0x60, 0x39, 0xda, 0x76, 0xc5, - 0x79, 0xab, 0x43, 0x51, 0x9c, 0x30, 0x57, 0x26, 0xb3, 0x0f, 0xe2, 0x5f, 0x68, 0xb0, 0x94, 0x68, - 0xd4, 0xe8, 0x0e, 0x54, 0x4e, 0x0d, 0xd3, 0xa4, 0xbd, 0xce, 0x85, 0xce, 0xb9, 0x4a, 0x8c, 0x3e, - 0x84, 0x79, 0x47, 0x8c, 0x17, 0xfe, 0x84, 0x32, 0x9d, 0x39, 0x42, 0x8d, 0x9b, 0xbc, 0xfe, 0xb0, - 0xab, 0x42, 0xa0, 0x7c, 0xe0, 0x6d, 0x4d, 0xf5, 0x76, 0x03, 0x4a, 0x23, 0xdd, 0x1b, 0x1c, 0x8e, - 0x68, 0xd7, 0x1f, 0x08, 0x7d, 0x18, 0x7f, 0x99, 0x87, 0x92, 0x7f, 0xdb, 0xc8, 0xea, 0x17, 0x69, - 0x1f, 0x53, 0x32, 0x9e, 0x16, 0x1a, 0x50, 0xea, 0x8f, 0x4d, 0x93, 0xa7, 0x82, 0xa8, 0x98, 0x01, - 0xac, 0x7a, 0xb6, 0x10, 0xf1, 0x2c, 0x7a, 0x1d, 0x0a, 0x6c, 0x42, 0x75, 0xeb, 0x73, 0xdc, 0x01, - 0xa9, 0x37, 0x21, 0x41, 0x81, 0xee, 0x26, 0xde, 0x10, 0x5e, 0x4d, 0xa1, 0xce, 0x7c, 0x3c, 0x78, - 0x27, 0xf2, 0x78, 0x70, 0x35, 0x8d, 0x35, 0xfe, 0x6a, 0x70, 0x37, 0xf1, 0x6a, 0x90, 0xba, 0xe3, - 0xff, 0xd1, 0x73, 0xc1, 0x1d, 0xde, 0xc5, 0x64, 0x62, 0xb1, 0x1c, 0x0f, 0xe2, 0xa3, 0x9d, 0x17, - 0x1f, 0xfc, 0x3b, 0x0d, 0x5e, 0xd9, 0xa5, 0xde, 0xd3, 0xd8, 0xe3, 0x41, 0x90, 0xa1, 0x1b, 0x50, - 0x71, 0xe8, 0xc8, 0x7e, 0xa4, 0x7b, 0x1e, 0x75, 0xfc, 0x97, 0x39, 0x15, 0x85, 0x6e, 0xc2, 0xa2, - 0x43, 0x27, 0x86, 0x6b, 0xd8, 0x96, 0x4f, 0x25, 0x34, 0x8c, 0xa3, 0x99, 0x2c, 0xdd, 0x34, 0xb7, - 0x1d, 0xdd, 0xea, 0x0e, 0xa8, 0x3f, 0xd0, 0xa9, 0x28, 0xde, 0xf6, 0x4d, 0xb3, 0xa3, 0x9f, 0xb8, - 0x72, 0x62, 0xf7, 0x41, 0x7c, 0x0c, 0x2b, 0x71, 0x1d, 0xfd, 0x23, 0xc0, 0x94, 0xf1, 0x8f, 0x00, - 0xfb, 0xcd, 0xeb, 0x9b, 0xff, 0x38, 0x22, 0xcf, 0x8f, 0x0f, 0xf3, 0xcb, 0x96, 0x54, 0x4b, 0x9e, - 0x84, 0x00, 0xc6, 0x9f, 0xc3, 0xe5, 0x74, 0x57, 0x30, 0x9f, 0x3e, 0x84, 0xa5, 0xf8, 0x0b, 0x4b, - 0xda, 0xe5, 0x29, 0x4d, 0x49, 0x92, 0xe4, 0xc4, 0x08, 0x6a, 0x0f, 0x0c, 0x97, 0xdd, 0x3a, 0x6c, - 0xe5, 0xbb, 0x59, 0x89, 0xc1, 0x99, 0x47, 0xbb, 0x0e, 0x45, 0x79, 0x30, 0x64, 0x8f, 0xf6, 0x41, - 0x16, 0x03, 0xf9, 0x93, 0x44, 0x8d, 0x8b, 0xa3, 0xf1, 0x17, 0x50, 0x55, 0xf6, 0xf5, 0x93, 0x85, - 0x41, 0x69, 0xc9, 0x22, 0xb5, 0x21, 0x82, 0x02, 0xbd, 0x07, 0x97, 0x4e, 0xf8, 0xdc, 0xbd, 0x13, - 0xdb, 0x4c, 0x78, 0x39, 0x7d, 0x11, 0x1f, 0x40, 0xf5, 0x5e, 0xaf, 0xc7, 0x64, 0xf9, 0x49, 0x95, - 0x66, 0x5c, 0x8a, 0x09, 0x33, 0xe9, 0x26, 0x10, 0x98, 0x0f, 0xe4, 0x89, 0x99, 0x0d, 0x59, 0xf4, - 0x79, 0x5c, 0x25, 0x21, 0x3b, 0x65, 0x85, 0xed, 0x6e, 0xf8, 0x1d, 0xbf, 0x4c, 0xf8, 0x6f, 0xfc, - 0x3a, 0x2c, 0x11, 0x3a, 0xb4, 0x27, 0x54, 0x55, 0x73, 0x05, 0x0a, 0x86, 0xd5, 0xa3, 0x2f, 0xfc, - 0xef, 0x09, 0x1c, 0xc0, 0xdf, 0x83, 0x45, 0x95, 0x94, 0x69, 0x70, 0x03, 0xaa, 0xea, 0x3e, 0x41, - 0x3a, 0xc6, 0xb0, 0xf8, 0x0d, 0x58, 0x26, 0xb4, 0xef, 0x50, 0x77, 0xa0, 0xc6, 0x3d, 0x63, 0x9f, - 0xef, 0xc0, 0xa5, 0x43, 0xea, 0x29, 0xec, 0xd3, 0xc9, 0xef, 0xf2, 0xcb, 0xe6, 0x6e, 0x5a, 0x04, - 0x7c, 0x46, 0x35, 0xf7, 0xb5, 0x58, 0xee, 0xff, 0x80, 0xdf, 0xee, 0xd8, 0x36, 0x19, 0xcc, 0xa9, - 0xbb, 0x46, 0x44, 0xce, 0xc4, 0x44, 0xbe, 0x03, 0xaf, 0x64, 0x89, 0x64, 0x4e, 0xf3, 0xc3, 0xa0, - 0x29, 0x61, 0x28, 0x42, 0xa1, 0x35, 0x1c, 0x79, 0x67, 0x5b, 0xff, 0x5e, 0x80, 0xa2, 0x7c, 0x6c, - 0x42, 0x4d, 0xa8, 0x74, 0x1c, 0xbd, 0x2b, 0x3f, 0xd9, 0xa1, 0x7a, 0xe2, 0xcb, 0xae, 0x54, 0xb1, - 0xb1, 0x9a, 0xb2, 0xc2, 0x2e, 0xa6, 0xb9, 0xb7, 0x35, 0xf4, 0x0c, 0x6a, 0xf1, 0x0f, 0x30, 0x08, - 0x47, 0x6f, 0x81, 0x69, 0xdf, 0x97, 0x1a, 0x1b, 0x53, 0x69, 0xb8, 0x74, 0xb4, 0x0d, 0x25, 0xff, - 0x03, 0x05, 0x52, 0x1f, 0x14, 0x63, 0x1f, 0x38, 0x1a, 0xf5, 0xd4, 0x35, 0x21, 0xe3, 0x29, 0x1f, - 0x0e, 0xd4, 0x2f, 0x17, 0xe8, 0xd5, 0xcc, 0x4b, 0x6a, 0x60, 0xf1, 0xb5, 0x69, 0x24, 0x42, 0x70, - 0x07, 0xaa, 0xd1, 0xc7, 0x58, 0xb4, 0x71, 0xde, 0x4b, 0x70, 0x63, 0x7d, 0x0a, 0x45, 0x20, 0x35, - 0xba, 0x1f, 0xda, 0xc8, 0x54, 0x25, 0x4d, 0x6a, 0xca, 0x03, 0x2d, 0xce, 0xa1, 0x1f, 0x03, 0x4a, - 0xbe, 0x30, 0xa2, 0xeb, 0x17, 0x79, 0x0d, 0x6d, 0xe0, 0x73, 0xa8, 0xc4, 0x0e, 0x3f, 0x82, 0xa5, - 0xc4, 0xdb, 0x18, 0x52, 0x27, 0xd9, 0xac, 0x37, 0xc7, 0xc6, 0xab, 0xd3, 0x89, 0x02, 0x03, 0x92, - 0x2f, 0x4b, 0x11, 0x03, 0x32, 0xdf, 0xc2, 0x22, 0x06, 0x64, 0x3c, 0x4f, 0x89, 0x5c, 0xf3, 0x6f, - 0xac, 0x91, 0x5c, 0x8b, 0xdd, 0x6c, 0x23, 0xb9, 0x16, 0xb9, 0xe2, 0xe2, 0x1c, 0xfa, 0x18, 0x8a, - 0x12, 0x85, 0x2e, 0x27, 0xc9, 0x7c, 0x09, 0x6b, 0x69, 0x4b, 0x42, 0xc0, 0x01, 0xcc, 0xab, 0x83, - 0x35, 0x5a, 0xcf, 0x7c, 0x1a, 0x13, 0xa2, 0xa6, 0x3e, 0x9d, 0x05, 0x46, 0xf1, 0x01, 0x26, 0x6e, - 0x94, 0x3a, 0x2e, 0xc7, 0x8d, 0x0a, 0x27, 0x1e, 0x9c, 0x43, 0x7d, 0xfe, 0xe9, 0x2f, 0xd1, 0xbc, - 0xd1, 0x8d, 0x28, 0x4f, 0xd6, 0xa0, 0xd3, 0xb8, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0xe5, 0xa0, - 0x81, 0xa2, 0x57, 0x14, 0xa6, 0x78, 0x3b, 0x6f, 0x5c, 0x4e, 0x5f, 0x0c, 0x62, 0x20, 0x9b, 0x58, - 0x24, 0x06, 0xd1, 0x46, 0x19, 0x89, 0x81, 0xda, 0xf3, 0x70, 0x0e, 0xed, 0x01, 0x84, 0x6d, 0x08, - 0x5d, 0x89, 0x74, 0xed, 0x58, 0x23, 0x6b, 0x34, 0x32, 0x56, 0x7d, 0xef, 0xcf, 0xab, 0x5d, 0x29, - 0x12, 0xcd, 0x94, 0x76, 0xd5, 0xa8, 0xa9, 0x6f, 0xc5, 0xac, 0x5a, 0xe3, 0x1c, 0xba, 0x0f, 0xd5, - 0x68, 0xb3, 0x8a, 0xd4, 0x83, 0xd4, 0x3e, 0x96, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0xba, 0x18, 0xba, - 0x15, 0x95, 0x38, 0xad, 0xd5, 0xa5, 0xca, 0x36, 0x61, 0x35, 0xbd, 0x1f, 0xa1, 0x9b, 0x51, 0xc9, - 0xd9, 0x5d, 0xb0, 0x71, 0xe3, 0x02, 0x94, 0xc2, 0xab, 0x1f, 0x42, 0x39, 0xf8, 0x1f, 0x43, 0x24, - 0x4f, 0xe2, 0xff, 0x6e, 0x88, 0xea, 0x3a, 0xa1, 0x96, 0xf7, 0xb6, 0xb6, 0x7d, 0xfb, 0x8f, 0x5f, - 0xad, 0x6b, 0x7f, 0xfb, 0x6a, 0x5d, 0xfb, 0xfb, 0x57, 0xeb, 0xda, 0xaf, 0xff, 0xb1, 0x9e, 0x03, - 0xdc, 0x1d, 0x6c, 0x76, 0xa9, 0x63, 0x6d, 0xea, 0xa6, 0xd1, 0xa5, 0x9b, 0xf6, 0xd6, 0xa6, 0xcf, - 0xe3, 0x8c, 0xba, 0x2e, 0x75, 0x26, 0xd4, 0x79, 0x36, 0x33, 0x3a, 0x3e, 0x9e, 0xe3, 0xff, 0x2c, - 0x7c, 0xf7, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x39, 0xf9, 0x3c, 0x20, 0x73, 0x28, 0x00, 0x00, + 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0xe9, 0x1f, 0xe8, 0x63, 0x5f, 0x0a, 0x14, 0xfb, 0x75, + 0xb7, 0xf7, 0x45, 0xc9, 0x4d, 0xf3, 0xd2, 0x37, 0xce, 0xec, 0xcc, 0xec, 0xec, 0xcc, 0xec, 0xcc, + 0xec, 0x1c, 0x61, 0x69, 0xe0, 0xb9, 0x81, 0xeb, 0xbf, 0xe5, 0xae, 0xb7, 0x5d, 0x27, 0xf0, 0x5c, + 0x7b, 0x8d, 0x23, 0x50, 0x25, 0x44, 0xe0, 0x25, 0x58, 0x6c, 0x8d, 0xa8, 0x13, 0x1c, 0x3d, 0xa4, + 0xbe, 0xeb, 0xef, 0x50, 0xd3, 0x0b, 0x8e, 0xa9, 0x19, 0x60, 0x1b, 0x9a, 0xad, 0xd1, 0x51, 0xcb, + 0x19, 0x59, 0x9e, 0xeb, 0xf4, 0xa9, 0x13, 0x1c, 0x04, 0x66, 0x40, 0x37, 0x7b, 0xa6, 0x73, 0x42, + 0x3b, 0x68, 0x11, 0x4a, 0x94, 0x71, 0x35, 0x8c, 0x55, 0xe3, 0x66, 0x85, 0x08, 0x00, 0x2d, 0xc1, + 0x94, 0xef, 0x0e, 0xbd, 0x36, 0x6d, 0x4c, 0x70, 0xb4, 0x84, 0xd0, 0x2a, 0x54, 0x3b, 0xd4, 0x0f, + 0x2c, 0xc7, 0x0c, 0x2c, 0xd7, 0x69, 0x4c, 0xf2, 0x45, 0x1d, 0x85, 0x37, 0x61, 0xa1, 0x35, 0x3a, + 0x3a, 0x34, 0xfd, 0xd3, 0xd8, 0x36, 0x4b, 0x30, 0x15, 0x98, 0xfe, 0xa9, 0xd5, 0x91, 0xfb, 0x48, + 0x88, 0x6d, 0xef, 0x33, 0x3a, 0xb9, 0x8f, 0x00, 0xf0, 0x7d, 0x76, 0x94, 0x50, 0xc8, 0xd0, 0x3f, + 0x4f, 0x0a, 0x53, 0x97, 0x13, 0x86, 0xea, 0x72, 0x08, 0xbf, 0x0e, 0x73, 0x52, 0xce, 0x03, 0x73, + 0xe8, 0xb4, 0x7b, 0xf9, 0x22, 0xb0, 0xc5, 0xf5, 0xe6, 0xa6, 0x63, 0xf4, 0x9b, 0x1e, 0x35, 0x03, + 0xda, 0x41, 0xd7, 0x61, 0x96, 0x11, 0x78, 0x54, 0x18, 0xc0, 0x97, 0x5c, 0x71, 0x24, 0x7a, 0x13, + 0xe6, 0xe9, 0x0b, 0xda, 0x1e, 0x06, 0xae, 0x47, 0x42, 0x4a, 0xa1, 0x4a, 0x7a, 0x01, 0x3f, 0x86, + 0x4b, 0x71, 0x87, 0xa8, 0xcd, 0x3e, 0x84, 0x2a, 0x8d, 0xb0, 0x7c, 0xab, 0xea, 0x7a, 0x73, 0x2d, + 0xf2, 0xb9, 0xc6, 0xb3, 0xeb, 0x74, 0x5d, 0xa2, 0x93, 0xe3, 0x9f, 0x1b, 0xb0, 0x1c, 0x97, 0xbb, + 0x45, 0xfd, 0xc0, 0x73, 0xcf, 0x68, 0x07, 0x7d, 0x1f, 0xe6, 0xdb, 0x36, 0x35, 0x9d, 0xe1, 0x80, + 0x1d, 0xce, 0x27, 0x74, 0x60, 0x9f, 0x49, 0xf9, 0x57, 0x34, 0xf9, 0x9b, 0x49, 0x1a, 0x92, 0x66, + 0x63, 0x26, 0xd1, 0xb6, 0xb5, 0x3a, 0xf2, 0xa0, 0x71, 0x24, 0xbe, 0xc4, 0xed, 0xa9, 0x29, 0xd3, + 0xf2, 0x3c, 0xd7, 0xc3, 0x0b, 0x30, 0xdf, 0x1a, 0x1d, 0x7d, 0x6a, 0xd9, 0x36, 0x97, 0xc8, 0xed, + 0x8d, 0xe7, 0x60, 0x56, 0xf8, 0x99, 0xd0, 0x2f, 0x86, 0xd4, 0x0f, 0xf0, 0x31, 0x54, 0x15, 0x82, + 0xed, 0x18, 0x06, 0x89, 0xa1, 0x05, 0x09, 0xba, 0x0b, 0xb3, 0xc2, 0xcd, 0x8f, 0x07, 0x1d, 0x33, + 0xe0, 0x06, 0x9f, 0xbc, 0x59, 0x5d, 0x5f, 0xd6, 0xce, 0x73, 0xa0, 0xad, 0x93, 0x38, 0x35, 0xfe, + 0x8b, 0x01, 0x33, 0xfa, 0x3a, 0x7a, 0x17, 0x4a, 0x36, 0x1d, 0x51, 0x9b, 0xef, 0x52, 0x5b, 0xbf, + 0x9a, 0x23, 0x67, 0xed, 0x01, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xad, 0x1f, 0xbb, 0x6e, 0xdc, + 0x1a, 0xd5, 0xf5, 0x6b, 0xba, 0xd7, 0x32, 0x6e, 0xe5, 0x4e, 0x81, 0x24, 0x18, 0xf1, 0x7b, 0x50, + 0xe2, 0xa2, 0x51, 0x05, 0x4a, 0x5b, 0xad, 0x8d, 0xc7, 0xdb, 0xf5, 0x02, 0x2a, 0x43, 0x71, 0x77, + 0xef, 0xfe, 0x7e, 0xdd, 0x40, 0x55, 0x98, 0x7e, 0x7a, 0x8f, 0xec, 0xed, 0xee, 0x6d, 0xd7, 0x27, + 0x18, 0x45, 0x8b, 0x90, 0x7d, 0x52, 0x9f, 0xdc, 0x98, 0x86, 0x12, 0x97, 0x8f, 0x7f, 0x36, 0x25, + 0x7f, 0xa1, 0x2b, 0x50, 0x09, 0xac, 0x3e, 0xf5, 0x03, 0xb3, 0x3f, 0x90, 0x26, 0x8b, 0x10, 0xc8, + 0x84, 0x65, 0x9a, 0x9d, 0x0b, 0xa4, 0xea, 0xdf, 0x8e, 0xa9, 0x9e, 0x97, 0x38, 0x76, 0x0a, 0x24, + 0x4f, 0x0e, 0x22, 0x80, 0x68, 0x2a, 0xba, 0x79, 0xb2, 0xa8, 0xae, 0xaf, 0xe6, 0x4a, 0x97, 0x74, + 0x3b, 0x05, 0x92, 0xc1, 0x8d, 0x1e, 0x40, 0x3d, 0x48, 0x24, 0x95, 0x46, 0x91, 0x4b, 0x5c, 0x89, + 0x4b, 0x4c, 0xa6, 0x9e, 0x9d, 0x02, 0x49, 0x71, 0xa2, 0x7d, 0x98, 0x0f, 0x92, 0xd9, 0xa5, 0x51, + 0xca, 0xf0, 0x5c, 0x3a, 0x09, 0xed, 0x14, 0x48, 0x9a, 0x17, 0x7d, 0x02, 0x33, 0x0c, 0x69, 0xcb, + 0x34, 0xd3, 0x98, 0x4a, 0xdf, 0xdd, 0x78, 0x22, 0xda, 0x29, 0x90, 0x18, 0x07, 0x3b, 0x60, 0x5f, + 0x65, 0x9f, 0xb6, 0x34, 0xd9, 0x74, 0xd6, 0x01, 0x93, 0x39, 0x8a, 0x1d, 0x30, 0xc9, 0x89, 0x3e, + 0x83, 0x45, 0x9a, 0x91, 0x08, 0x1a, 0x65, 0x2e, 0x11, 0xe7, 0x3a, 0x21, 0xa4, 0xdc, 0x29, 0x90, + 0x4c, 0x09, 0x4c, 0x4f, 0x9a, 0xb8, 0xd5, 0x8d, 0x4a, 0x96, 0x9e, 0xc9, 0xbb, 0xcf, 0xf4, 0x4c, + 0x72, 0xa2, 0xfb, 0x50, 0x3b, 0xb5, 0x6c, 0x3b, 0x08, 0x93, 0x41, 0x03, 0x52, 0x59, 0x29, 0x95, + 0x30, 0xd8, 0xe5, 0x89, 0x73, 0x6d, 0x54, 0x60, 0xfa, 0x91, 0x79, 0x66, 0xbb, 0x66, 0x07, 0x23, + 0xa8, 0x1f, 0x0c, 0x8f, 0xfd, 0xb6, 0x67, 0x1d, 0x53, 0x95, 0x50, 0x2e, 0xc3, 0xf2, 0x36, 0x0d, + 0xee, 0x7b, 0x66, 0x9f, 0x3e, 0x77, 0xbd, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0x6f, 0x0d, 0x98, 0x7e, + 0x42, 0x3d, 0xdf, 0x72, 0x1d, 0x96, 0x68, 0xfa, 0xe6, 0xe7, 0xae, 0xc7, 0x6f, 0x4d, 0x89, 0x08, + 0x80, 0x63, 0x2d, 0xc7, 0xf5, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0xec, 0xc0, 0x0c, 0xda, 0x3d, + 0x1e, 0xd7, 0x25, 0x22, 0x00, 0x86, 0x3d, 0x1e, 0x5a, 0xb6, 0x88, 0xcd, 0x0a, 0x11, 0x00, 0x2b, + 0x9b, 0x03, 0xcf, 0xed, 0x0c, 0xdb, 0xc1, 0x9e, 0xd9, 0xa7, 0x3c, 0xd0, 0x2a, 0x44, 0x47, 0xa1, + 0x15, 0x80, 0x91, 0x50, 0xe2, 0x20, 0xf0, 0x78, 0xf4, 0x54, 0x88, 0x86, 0xc1, 0xbf, 0x9c, 0x80, + 0x4b, 0xe9, 0x13, 0xb0, 0xe4, 0xb8, 0x0a, 0xd5, 0x6e, 0x88, 0x55, 0x55, 0x4d, 0x47, 0xf1, 0xea, + 0x14, 0xd9, 0xdd, 0xdf, 0x74, 0x87, 0x4e, 0x20, 0xcf, 0x92, 0x5e, 0x60, 0x9a, 0x70, 0xbb, 0x0a, + 0x32, 0x71, 0x38, 0x0d, 0x13, 0x25, 0xe3, 0xa2, 0x9e, 0x8c, 0x57, 0x00, 0x7a, 0xae, 0xaf, 0x84, + 0x97, 0x04, 0x57, 0x84, 0x41, 0x18, 0x66, 0x2c, 0xc7, 0x0f, 0x4c, 0xa7, 0x4d, 0xb9, 0x09, 0xc4, + 0x09, 0x63, 0x38, 0xf4, 0x26, 0x4c, 0xcb, 0x13, 0xcb, 0xc0, 0x47, 0x5a, 0x10, 0x48, 0x17, 0x11, + 0x45, 0xc2, 0x6a, 0xfb, 0x21, 0x35, 0xbd, 0x8e, 0xfb, 0xdc, 0x91, 0xae, 0x64, 0xb5, 0xdd, 0xa3, + 0xa6, 0xef, 0x3a, 0xaa, 0xb6, 0x0b, 0x88, 0xd5, 0x97, 0x88, 0x74, 0x60, 0x9f, 0xe1, 0x06, 0x2c, + 0x6d, 0xd3, 0x40, 0x0b, 0xd0, 0xb0, 0xf2, 0xbc, 0x80, 0xc5, 0xd4, 0xca, 0xc5, 0xac, 0xfc, 0x11, + 0xcc, 0xe8, 0xc6, 0x94, 0xd5, 0x68, 0x5c, 0xf5, 0x8e, 0xd1, 0xe3, 0x3f, 0x15, 0x61, 0x2e, 0x41, + 0x81, 0x6a, 0x30, 0x11, 0x36, 0x2a, 0x13, 0x16, 0x8f, 0x23, 0x79, 0xc1, 0x9f, 0xf6, 0xa8, 0x23, + 0x0b, 0xaf, 0x8e, 0x8a, 0xbc, 0x33, 0xa9, 0x7b, 0x67, 0x0d, 0x4a, 0xdc, 0x83, 0x8d, 0x22, 0x57, + 0xaa, 0xa1, 0x97, 0xb6, 0x9e, 0xeb, 0x05, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, 0xd9, + 0x73, 0xdd, 0x80, 0xb8, 0xb6, 0x0a, 0xd6, 0x10, 0x46, 0xb7, 0xa0, 0xde, 0x1e, 0x7a, 0x1e, 0x75, + 0x02, 0x32, 0x74, 0xf6, 0x86, 0xfd, 0x63, 0x2a, 0xe2, 0x75, 0x96, 0xa4, 0xf0, 0x68, 0x0b, 0xca, + 0x1d, 0xda, 0x35, 0x87, 0x76, 0xe0, 0x37, 0xa6, 0xf9, 0xd6, 0x37, 0xf3, 0xed, 0xb1, 0xb6, 0x25, + 0x49, 0x5b, 0x4e, 0xe0, 0x9d, 0x91, 0x90, 0x13, 0xdd, 0x86, 0xe2, 0xc8, 0xf4, 0xfc, 0x46, 0x99, + 0x4b, 0xb8, 0x3e, 0x46, 0xc2, 0x13, 0xd3, 0x93, 0xdc, 0x9c, 0x83, 0xed, 0x3f, 0xf4, 0xa9, 0xc7, + 0xd0, 0x8d, 0xca, 0xb9, 0xfb, 0x3f, 0x96, 0xa4, 0x72, 0x7f, 0xc5, 0xd9, 0xfc, 0x00, 0x66, 0x63, + 0xaa, 0xa1, 0x3a, 0x4c, 0x9e, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x64, 0xda, 0xc3, + 0xb0, 0x8d, 0xe5, 0xc0, 0x9d, 0x89, 0xdb, 0x46, 0xf3, 0x7d, 0xa8, 0x84, 0x32, 0x5f, 0x8a, 0xf1, + 0x03, 0x98, 0x8d, 0x29, 0xf4, 0x32, 0xcc, 0xf8, 0x0f, 0x06, 0x5c, 0xda, 0xa3, 0xcf, 0xb5, 0x13, + 0xaa, 0x3b, 0x72, 0x0b, 0xea, 0x2c, 0x60, 0xbb, 0xb6, 0xfb, 0xfc, 0x90, 0xf6, 0x07, 0x76, 0xd4, + 0x56, 0xa5, 0xf0, 0xe8, 0x23, 0x69, 0x78, 0x11, 0xca, 0xb7, 0x34, 0xd3, 0x65, 0xca, 0x4e, 0x9a, + 0xff, 0xbf, 0x3e, 0x3b, 0x3e, 0x80, 0x85, 0xe4, 0x0e, 0xec, 0x12, 0x7e, 0xbd, 0xfe, 0xf8, 0x35, + 0x9e, 0x41, 0x33, 0x4c, 0x92, 0xb8, 0x65, 0xf8, 0xa7, 0x06, 0x2c, 0x24, 0x29, 0xbf, 0xf6, 0xf6, + 0xe8, 0x2d, 0x28, 0x2b, 0x03, 0xcb, 0x46, 0x6b, 0x41, 0x63, 0x65, 0x57, 0x8b, 0xf3, 0x84, 0x44, + 0xf8, 0xaf, 0x06, 0x5c, 0xde, 0x14, 0xcb, 0xe7, 0x2b, 0x8d, 0x3e, 0x86, 0x62, 0x70, 0x36, 0x10, + 0xb6, 0xac, 0xad, 0xbf, 0xa1, 0x37, 0xf5, 0x79, 0x32, 0xd6, 0xf6, 0x07, 0x8c, 0x85, 0x70, 0x46, + 0x6c, 0xc2, 0x94, 0x80, 0x59, 0xd3, 0xb9, 0xb7, 0xbf, 0xff, 0xa8, 0x5e, 0x40, 0x08, 0x6a, 0x07, + 0x87, 0xf7, 0xc8, 0xe1, 0xd1, 0xbd, 0xcd, 0xc3, 0xdd, 0x27, 0xbb, 0x87, 0x3f, 0xac, 0x1b, 0x68, + 0x1e, 0x66, 0x0f, 0x0e, 0xf7, 0x1f, 0x45, 0xa8, 0x09, 0x34, 0x0b, 0x95, 0xcd, 0xfd, 0xbd, 0xfb, + 0xbb, 0xdb, 0x8f, 0x49, 0xab, 0x3e, 0xc9, 0xba, 0x53, 0xd2, 0x3a, 0x68, 0x1d, 0xd6, 0x8b, 0x68, + 0x06, 0xca, 0xdb, 0xfb, 0x47, 0xa2, 0x57, 0x2d, 0xe1, 0x53, 0x58, 0xce, 0x52, 0x86, 0xd9, 0x36, + 0x79, 0x9c, 0xcc, 0x77, 0x61, 0x66, 0xee, 0x99, 0xcc, 0xce, 0x3d, 0xf8, 0x57, 0x06, 0x34, 0x1e, + 0xba, 0x1d, 0xab, 0x7b, 0x76, 0x21, 0xeb, 0x81, 0x3b, 0xa0, 0x1e, 0x7f, 0xc2, 0xaa, 0x78, 0xbf, + 0x96, 0xed, 0xd9, 0x7d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x03, 0x6a, 0x1e, 0x6d, 0xbb, 0x4e, 0xd7, + 0x3a, 0x19, 0x7a, 0xf4, 0x9e, 0x6d, 0x73, 0xbd, 0xca, 0x24, 0x81, 0xc5, 0xbf, 0x31, 0x60, 0x31, + 0x4b, 0x18, 0xba, 0x23, 0xfd, 0x27, 0x1e, 0x1f, 0x37, 0xce, 0xd9, 0x3b, 0xe6, 0x3a, 0x91, 0xae, + 0x6d, 0x51, 0x58, 0x27, 0x54, 0xba, 0x16, 0x30, 0x7e, 0x27, 0xc3, 0xad, 0x73, 0x50, 0x25, 0xad, + 0x87, 0xfb, 0x4f, 0x5a, 0x47, 0x64, 0xff, 0x01, 0xf3, 0xd8, 0x0c, 0x94, 0xef, 0x6d, 0x6d, 0x09, + 0xa8, 0xc8, 0x1e, 0x92, 0x4b, 0x19, 0x96, 0x63, 0x6e, 0xfa, 0x14, 0xea, 0x5d, 0xd3, 0xb2, 0x69, + 0x67, 0x3f, 0xb2, 0x96, 0x71, 0x31, 0x6b, 0xa5, 0x18, 0xa5, 0x13, 0x26, 0xd2, 0x3e, 0xd7, 0x6b, + 0x17, 0xfe, 0xd2, 0x80, 0xcb, 0xb2, 0xfb, 0xbc, 0x80, 0x23, 0xaf, 0x40, 0xe5, 0x94, 0x52, 0xf1, + 0x5c, 0xe5, 0xa2, 0xcb, 0x24, 0x42, 0xa0, 0xb7, 0x61, 0xc1, 0xb4, 0x6d, 0xf7, 0xf9, 0xae, 0x43, + 0x86, 0x8e, 0x63, 0x39, 0x27, 0x07, 0xe1, 0x7e, 0x65, 0x92, 0xb5, 0xc4, 0x74, 0xea, 0xba, 0x5e, + 0x5b, 0x74, 0x3b, 0x65, 0x22, 0x00, 0x4c, 0x61, 0x39, 0x4b, 0x25, 0x66, 0xa1, 0xff, 0xe1, 0x4b, + 0x1b, 0xff, 0xd9, 0x80, 0x6b, 0x07, 0xb1, 0x44, 0xf4, 0xc8, 0x63, 0x31, 0x17, 0x58, 0xd4, 0xcf, + 0x33, 0xc0, 0x33, 0x80, 0x41, 0x48, 0x24, 0x23, 0xf9, 0x8e, 0x5e, 0xef, 0xc7, 0xcb, 0x5b, 0x8b, + 0x30, 0x22, 0x93, 0x6b, 0xd2, 0x9a, 0x77, 0x61, 0x2e, 0xb1, 0xfc, 0x52, 0x59, 0xfd, 0x1a, 0x5c, + 0xcd, 0xdf, 0x9d, 0x9d, 0xd7, 0x87, 0x6b, 0xdb, 0x2f, 0x79, 0xdc, 0x06, 0x4c, 0x7f, 0x31, 0xa4, + 0x9e, 0x3a, 0x6b, 0x85, 0x28, 0x90, 0xdd, 0x48, 0xfa, 0xa2, 0x6d, 0x0f, 0x3b, 0x74, 0xdb, 0x76, + 0x8f, 0x4d, 0xdb, 0x57, 0x37, 0x32, 0x8e, 0xc5, 0xbf, 0x37, 0xe0, 0xea, 0xf6, 0x38, 0xb5, 0xd0, + 0x67, 0x31, 0x93, 0x8a, 0x70, 0xbf, 0xad, 0x99, 0x74, 0x2c, 0xf7, 0x37, 0x69, 0xd0, 0x7f, 0x19, + 0x30, 0x1b, 0xeb, 0xdf, 0x10, 0x82, 0xa2, 0xc3, 0xb2, 0x80, 0x60, 0xe7, 0xbf, 0x59, 0x57, 0x6c, + 0xbb, 0xed, 0x53, 0xf9, 0xbe, 0x2f, 0x13, 0x09, 0xa9, 0x49, 0xd8, 0x6e, 0x47, 0xde, 0x37, 0x09, + 0x69, 0xc3, 0xb4, 0xa2, 0x3e, 0x4c, 0x8b, 0xae, 0x67, 0x49, 0x4f, 0xc9, 0x57, 0xa0, 0xd2, 0xb6, + 0x4d, 0xdf, 0xd7, 0xba, 0xfa, 0x08, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x81, 0xed, 0x9e, 0xa9, 0x9a, + 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x8a, 0x11, 0x91, 0x04, 0x13, 0x33, 0xca, 0xc0, + 0x12, 0x8f, 0xd7, 0x0a, 0x61, 0x3f, 0x59, 0x8d, 0x46, 0x69, 0x46, 0x96, 0x09, 0xd9, 0xa3, 0x43, + 0xb3, 0x41, 0x08, 0xb3, 0x50, 0x31, 0x4f, 0x18, 0xa1, 0xca, 0x39, 0x0a, 0x64, 0x2b, 0x6e, 0xb7, + 0x4b, 0xbd, 0xd0, 0x14, 0x0a, 0x64, 0xcf, 0x1a, 0x35, 0xbf, 0xdb, 0x55, 0x6f, 0x3a, 0x0d, 0x83, + 0xe7, 0x61, 0x6e, 0x9b, 0x06, 0xf2, 0xca, 0x8a, 0x17, 0xc4, 0xc7, 0x30, 0x1b, 0xa1, 0x58, 0xf8, + 0x84, 0xcd, 0xb7, 0x71, 0xa1, 0xe6, 0x1b, 0xdf, 0x84, 0x9a, 0x14, 0xa0, 0xbd, 0x6b, 0xa4, 0xa7, + 0x0c, 0xdd, 0x53, 0xf8, 0x7d, 0x98, 0x09, 0x29, 0xd9, 0x4e, 0xaf, 0x41, 0x91, 0xad, 0xc8, 0x74, + 0xb3, 0x90, 0xb0, 0x31, 0xdf, 0x83, 0x13, 0xe0, 0x16, 0xcc, 0xf2, 0x01, 0x02, 0xf3, 0x53, 0x6e, + 0xdc, 0xb0, 0xc7, 0x86, 0x60, 0x7f, 0xe8, 0x76, 0x68, 0xf8, 0xd8, 0x88, 0x50, 0xf8, 0x27, 0x50, + 0xdd, 0x74, 0xfb, 0x7d, 0xd3, 0xe9, 0x28, 0x2f, 0x51, 0x67, 0xc4, 0x8f, 0x59, 0x21, 0xec, 0x27, + 0x0f, 0x99, 0x1e, 0xb5, 0x6d, 0x19, 0x79, 0x02, 0x88, 0x02, 0x7a, 0x52, 0x0b, 0x68, 0x16, 0x48, + 0xa6, 0x77, 0x32, 0x14, 0x8f, 0xa7, 0x22, 0x97, 0x11, 0x21, 0x98, 0x82, 0xac, 0x1f, 0x97, 0xb1, + 0xc7, 0x7f, 0xe3, 0x87, 0x50, 0xdd, 0xec, 0x99, 0x8e, 0x43, 0xed, 0xdc, 0x33, 0x20, 0xad, 0x2b, + 0xaa, 0xc8, 0x6a, 0xc9, 0xad, 0xe9, 0x9d, 0xd0, 0x20, 0x8a, 0x7b, 0x06, 0xe1, 0x7f, 0x4e, 0x42, + 0x39, 0xbc, 0x48, 0xdf, 0x85, 0x8a, 0xcf, 0x9c, 0xc3, 0x63, 0x56, 0xd8, 0x33, 0xdf, 0x71, 0x11, + 0x29, 0xe3, 0x6b, 0x2b, 0xab, 0xca, 0x36, 0xaf, 0x91, 0xf0, 0x43, 0x68, 0x75, 0x12, 0x91, 0xa2, + 0x4f, 0x60, 0xce, 0x72, 0x8e, 0xdd, 0xa1, 0xd3, 0x91, 0x47, 0x62, 0xe9, 0x8a, 0x85, 0xcb, 0x92, + 0x5e, 0x34, 0xa2, 0xd3, 0x92, 0x24, 0x39, 0xda, 0x80, 0xba, 0x3b, 0x0c, 0xe2, 0x22, 0x8a, 0x63, + 0x45, 0xa4, 0xe8, 0xd1, 0x6d, 0xe6, 0xf2, 0xd0, 0xa1, 0x72, 0x20, 0x16, 0x63, 0x8f, 0x56, 0x89, + 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x66, 0xd0, 0x93, 0x59, 0x20, 0x84, 0xf9, 0x27, 0x06, + 0x67, 0xb4, 0x2b, 0xc6, 0x59, 0x15, 0x22, 0x00, 0xb4, 0x19, 0xcb, 0xaa, 0xe2, 0x75, 0xf6, 0xad, + 0x8c, 0x90, 0xfd, 0x26, 0x13, 0xe8, 0x5b, 0xb0, 0x10, 0x2f, 0xc4, 0xe2, 0xbe, 0x35, 0x60, 0x5a, + 0xdc, 0x30, 0x5f, 0x06, 0xb3, 0x02, 0xf1, 0x2f, 0x0c, 0x98, 0x4f, 0x95, 0x6e, 0x74, 0x07, 0xaa, + 0xa7, 0x96, 0x6d, 0xd3, 0xce, 0xe1, 0x85, 0xee, 0xb9, 0x4e, 0x8c, 0x3e, 0x84, 0x19, 0x4f, 0x34, + 0x1c, 0xaa, 0x67, 0x19, 0xcf, 0x1c, 0xa3, 0xc6, 0x9b, 0x3c, 0xff, 0xb0, 0xc7, 0x43, 0xa8, 0x7c, + 0x68, 0x6d, 0x43, 0xb7, 0x76, 0x13, 0xca, 0x03, 0x33, 0xe8, 0x1d, 0x0c, 0x68, 0x5b, 0xb5, 0x88, + 0x0a, 0xc6, 0x5f, 0x16, 0xa1, 0xac, 0xde, 0x1f, 0x79, 0x15, 0x24, 0xeb, 0xf3, 0x4a, 0xce, 0xb0, + 0xa1, 0x09, 0xe5, 0xee, 0xd0, 0xb6, 0x79, 0x28, 0x88, 0x8c, 0x19, 0xc2, 0xba, 0x65, 0x4b, 0x31, + 0xcb, 0xa2, 0xd7, 0xa1, 0xc4, 0x7a, 0x56, 0xbf, 0x31, 0xc5, 0x0d, 0x90, 0xf9, 0x36, 0x12, 0x14, + 0xe8, 0x6e, 0x6a, 0xaa, 0xf0, 0x6a, 0x06, 0x75, 0xee, 0x38, 0xe1, 0x9d, 0xd8, 0x38, 0xe1, 0x6a, + 0x16, 0x6b, 0x72, 0x8e, 0x70, 0x37, 0x35, 0x47, 0xc8, 0xdc, 0xf1, 0xff, 0x68, 0x80, 0x70, 0x87, + 0x57, 0x31, 0x19, 0x58, 0x2c, 0xc6, 0x43, 0xff, 0x18, 0xe7, 0xf9, 0x07, 0xff, 0xce, 0x80, 0x57, + 0xb6, 0x69, 0xf0, 0x34, 0x31, 0x4e, 0x08, 0x23, 0x74, 0x15, 0xaa, 0x1e, 0x1d, 0xb8, 0x8f, 0xcc, + 0x20, 0xa0, 0x9e, 0x9a, 0xd5, 0xe9, 0x28, 0x74, 0x13, 0xe6, 0x3c, 0x3a, 0xb2, 0x7c, 0xcb, 0x75, + 0x14, 0x95, 0xd0, 0x30, 0x89, 0x66, 0xb2, 0x4c, 0xdb, 0xde, 0xf0, 0x4c, 0xa7, 0xdd, 0xa3, 0xaa, + 0xc5, 0xd3, 0x51, 0xbc, 0xec, 0xdb, 0xf6, 0xa1, 0x79, 0xe2, 0xcb, 0x1e, 0x5e, 0x81, 0xf8, 0x18, + 0x16, 0x93, 0x3a, 0xaa, 0x2b, 0xc0, 0x94, 0x51, 0x57, 0x80, 0xfd, 0xe6, 0xf9, 0x4d, 0x8d, 0x4b, + 0xe4, 0xfd, 0x51, 0x30, 0x7f, 0x7e, 0x49, 0xb5, 0xe4, 0x4d, 0x08, 0x61, 0xfc, 0x39, 0x5c, 0xce, + 0x36, 0x05, 0xb3, 0xe9, 0x43, 0x98, 0x4f, 0xce, 0x5c, 0xb2, 0x9e, 0x53, 0x59, 0x4a, 0x92, 0x34, + 0x27, 0x46, 0x50, 0x7f, 0x60, 0xf9, 0xec, 0x1d, 0xe2, 0x6a, 0x5f, 0xd2, 0xca, 0x0c, 0xce, 0xbd, + 0xda, 0x0d, 0x98, 0x96, 0x17, 0x43, 0xd6, 0x68, 0x05, 0x32, 0x1f, 0xc8, 0x9f, 0x24, 0x7e, 0xb8, + 0x24, 0x1a, 0x7f, 0x01, 0x35, 0x6d, 0x5f, 0x15, 0x2c, 0x0c, 0xca, 0x0a, 0x16, 0xa9, 0x0d, 0x11, + 0x14, 0xe8, 0x3d, 0xb8, 0x74, 0xc2, 0x3b, 0xf1, 0xad, 0xc4, 0x66, 0xc2, 0xca, 0xd9, 0x8b, 0x78, + 0x0f, 0x6a, 0xf7, 0x3a, 0x1d, 0x26, 0x4b, 0x05, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x30, 0x91, 0x7d, + 0x04, 0x02, 0x33, 0xa1, 0x3c, 0xd1, 0xb3, 0x21, 0x87, 0x3e, 0x4f, 0xaa, 0x24, 0x64, 0x67, 0xac, + 0xb0, 0xdd, 0x2d, 0x55, 0xf1, 0x2b, 0x84, 0xff, 0xc6, 0xaf, 0xc3, 0x3c, 0xa1, 0x7d, 0x77, 0x44, + 0x75, 0x35, 0x17, 0xa1, 0x64, 0x39, 0x1d, 0xfa, 0x42, 0x7d, 0x61, 0xe0, 0x00, 0xfe, 0x1e, 0xcc, + 0xe9, 0xa4, 0x4c, 0x83, 0x1b, 0x50, 0xd3, 0xf7, 0x09, 0xc3, 0x31, 0x81, 0xc5, 0x6f, 0xc0, 0x02, + 0xa1, 0x5d, 0x8f, 0xfa, 0x3d, 0xdd, 0xef, 0x39, 0xfb, 0x7c, 0x07, 0x2e, 0x1d, 0xd0, 0x40, 0x63, + 0x1f, 0x4f, 0x7e, 0x97, 0x3f, 0x3f, 0xb7, 0xb3, 0x3c, 0xa0, 0x18, 0xf5, 0xd8, 0x37, 0x12, 0xb1, + 0xff, 0x03, 0xfe, 0xde, 0x63, 0xdb, 0xe4, 0x30, 0x67, 0xee, 0x1a, 0x13, 0x39, 0x91, 0x10, 0xf9, + 0x0e, 0xbc, 0x92, 0x27, 0x92, 0x19, 0x4d, 0xb9, 0xc1, 0xd0, 0xdc, 0x30, 0x0d, 0xa5, 0x56, 0x7f, + 0x10, 0x9c, 0xad, 0xff, 0x7b, 0x16, 0xa6, 0xe5, 0xf8, 0x09, 0x6d, 0x42, 0xf5, 0xd0, 0x33, 0xdb, + 0xf2, 0x23, 0x1e, 0x6a, 0xa4, 0xbe, 0xf5, 0x4a, 0x15, 0x9b, 0x4b, 0x19, 0x2b, 0xec, 0xa9, 0x5a, + 0x78, 0xdb, 0x40, 0xcf, 0xa0, 0x9e, 0xfc, 0x24, 0x83, 0x70, 0xfc, 0x5d, 0x98, 0xf5, 0xc5, 0xa9, + 0xb9, 0x3a, 0x96, 0x86, 0x4b, 0x47, 0x1b, 0x50, 0x56, 0x9f, 0x2c, 0x90, 0x3e, 0x62, 0x4c, 0x7c, + 0xf2, 0x68, 0x36, 0x32, 0xd7, 0x84, 0x8c, 0xa7, 0xbc, 0x39, 0xd0, 0xbf, 0x65, 0xa0, 0x57, 0x73, + 0x9f, 0xad, 0xe1, 0x89, 0xaf, 0x8d, 0x23, 0x11, 0x82, 0x0f, 0xa1, 0x16, 0x1f, 0xcf, 0xa2, 0xd5, + 0xf3, 0x66, 0xc3, 0xcd, 0x95, 0x31, 0x14, 0xa1, 0xd4, 0xf8, 0x7e, 0x68, 0x35, 0x57, 0x95, 0x2c, + 0xa9, 0x19, 0x23, 0x5b, 0x5c, 0x40, 0x3f, 0x06, 0x94, 0x9e, 0x39, 0xa2, 0xeb, 0x17, 0x99, 0x8f, + 0x36, 0xf1, 0x39, 0x54, 0x62, 0x87, 0x1f, 0xc1, 0x7c, 0x6a, 0x5a, 0x86, 0xf4, 0x4e, 0x36, 0x6f, + 0x0a, 0xd9, 0x7c, 0x75, 0x3c, 0x51, 0x78, 0x80, 0xf4, 0xac, 0x29, 0x76, 0x80, 0xdc, 0xe9, 0x58, + 0xec, 0x00, 0x39, 0x03, 0x2b, 0x11, 0x6b, 0xea, 0xc5, 0x1a, 0x8b, 0xb5, 0xc4, 0xcb, 0x36, 0x16, + 0x6b, 0xb1, 0x27, 0x2e, 0x2e, 0xa0, 0x8f, 0x61, 0x5a, 0xa2, 0xd0, 0xe5, 0x34, 0x99, 0x92, 0xb0, + 0x9c, 0xb5, 0x24, 0x04, 0xec, 0xc1, 0x8c, 0xde, 0x58, 0xa3, 0x95, 0xdc, 0x61, 0x99, 0x10, 0x35, + 0x76, 0x98, 0x16, 0x1e, 0x8a, 0x37, 0x30, 0xc9, 0x43, 0xe9, 0xed, 0x72, 0xf2, 0x50, 0x51, 0xc7, + 0x83, 0x0b, 0xa8, 0xcb, 0x3f, 0x06, 0xa6, 0x8a, 0x37, 0xba, 0x11, 0xe7, 0xc9, 0x6b, 0x74, 0x9a, + 0xd7, 0xcf, 0xa5, 0x13, 0xfb, 0xb4, 0xa0, 0x12, 0x16, 0x50, 0xf4, 0x8a, 0xc6, 0x94, 0x2c, 0xe7, + 0xcd, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x64, 0x11, 0x8b, 0xf9, 0x20, 0x5e, 0x28, 0x63, 0x3e, 0xd0, + 0x6b, 0x1e, 0x2e, 0xa0, 0x1d, 0x80, 0xa8, 0x0c, 0xa1, 0x2b, 0xb1, 0xaa, 0x9d, 0x28, 0x64, 0xcd, + 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x8c, 0x5e, 0x95, 0x62, 0xde, 0xcc, 0x28, 0x57, 0xcd, 0xba, 0x3e, + 0x3d, 0x66, 0xd9, 0x1a, 0x17, 0xd0, 0x7d, 0xa8, 0xc5, 0x8b, 0x55, 0x2c, 0x1f, 0x64, 0xd6, 0xb1, + 0x4c, 0x39, 0xcf, 0xa0, 0x91, 0x57, 0xc5, 0xd0, 0xad, 0xb8, 0xc4, 0x71, 0xa5, 0x2e, 0x53, 0xb6, + 0x0d, 0x4b, 0xd9, 0xf5, 0x08, 0xdd, 0x8c, 0x4b, 0xce, 0xaf, 0x82, 0xcd, 0x1b, 0x17, 0xa0, 0x14, + 0x56, 0xfd, 0x10, 0x2a, 0xe1, 0x3f, 0x1b, 0x62, 0x71, 0x92, 0xfc, 0xbf, 0x43, 0x5c, 0xd7, 0x11, + 0x75, 0x82, 0xb7, 0x8d, 0x8d, 0xdb, 0x7f, 0xfc, 0x6a, 0xc5, 0xf8, 0xdb, 0x57, 0x2b, 0xc6, 0xdf, + 0xbf, 0x5a, 0x31, 0x7e, 0xfd, 0x8f, 0x95, 0x02, 0xe0, 0x76, 0x6f, 0xad, 0x4d, 0x3d, 0x67, 0xcd, + 0xb4, 0xad, 0x36, 0x5d, 0x73, 0xd7, 0xd7, 0x14, 0x8f, 0x37, 0x68, 0xfb, 0xd4, 0x1b, 0x51, 0xef, + 0xd9, 0xc4, 0xe0, 0xf8, 0x78, 0x8a, 0xff, 0xd7, 0xf0, 0xdd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, + 0x94, 0x33, 0x95, 0x63, 0x85, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7256,6 +7265,13 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Pid) > 0 { + i -= len(m.Pid) + copy(dAtA[i:], m.Pid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) + i-- + dAtA[i] = 0x42 + } if m.DeploymentInfo != nil { { size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) @@ -9658,6 +9674,10 @@ func (m *ShortTaskInfo) Size() (n int) { l = m.DeploymentInfo.Size() n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Pid) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15680,6 +15700,38 @@ func (m *ShortTaskInfo) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Pid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) From 7db1484c2d999801e15509aff79f6cb0fecddb9f Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 13:54:19 +0300 Subject: [PATCH 0322/2352] [common] Fix formatting --- common/event/taskevent.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/common/event/taskevent.go b/common/event/taskevent.go index 12983851a..7fd11e7b4 100644 --- a/common/event/taskevent.go +++ b/common/event/taskevent.go @@ -31,10 +31,10 @@ type TaskMessage interface { } type TaskMessageBase struct { - Name string `json:"name"` - TaskId string `json:"taskId"` - PID int32 `json:"pid"` - MessageType string `json:"_messageType"` + Name string `json:"name"` + TaskId string `json:"taskId"` + PID int32 `json:"pid"` + MessageType string `json:"_messageType"` } func (tmb *TaskMessageBase) GetName() string { @@ -49,12 +49,12 @@ func (tmb *TaskMessageBase) GetTaskPID() int { return int(tmb.PID) } -func NewTaskMessage(name,id string, pid int32) (tm TaskMessage) { +func NewTaskMessage(name, id string, pid int32) (tm TaskMessage) { tm = &TaskMessageBase{ - Name: name, - TaskId: id, - PID: pid, - MessageType: "TaskMessage", - } + Name: name, + TaskId: id, + PID: pid, + MessageType: "TaskMessage", + } return tm } From a4ffc5a5459e633961f22822f7f98be92f00a0e2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 23 Jul 2020 17:22:06 +0300 Subject: [PATCH 0323/2352] [core] Move PID to task.Task from role --- core/scheduler.go | 6 +----- core/serverutil.go | 3 +-- core/task/task.go | 16 ++++++++++++++++ core/workflow/iteratorrole.go | 8 -------- core/workflow/role.go | 1 - core/workflow/rolebase.go | 8 -------- 6 files changed, 18 insertions(+), 24 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 6ff462843..6c3037a07 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -340,11 +340,7 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even t := state.taskman.GetTask(taskMessage.GetTaskId()) if t != nil { - if parentRole, ok := t.GetParentRole().(workflow.Role); ok { - parentRole.SetRuntimeVar("taskPID",strconv.Itoa(taskMessage.GetTaskPID())) - } else { - log.WithPrefix("scheduler").Error("TaskMessage received for task with no parent role") - } + t.SetTaskPID(taskMessage.GetTaskPID()) } } return diff --git a/core/serverutil.go b/core/serverutil.go index 4abf375a8..7345d9544 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -103,13 +103,12 @@ func taskToShortTaskInfo(t *task.Task) (sti *pb.ShortTaskInfo) { OfferId: t.GetOfferId(), ExecutorId: t.GetExecutorId(), }, - Pid: "UNKNOWN", + Pid: t.GetTaskPID(), } parentRole, ok := t.GetParentRole().(workflow.Role) if ok && parentRole != nil { sti.Status = parentRole.GetStatus().String() sti.State = parentRole.GetState().String() - sti.Pid = parentRole.GetTaskPID() } return } diff --git a/core/task/task.go b/core/task/task.go index ec401383b..2d4f91f78 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -32,6 +32,7 @@ package task import ( "errors" "fmt" + "strconv" "strings" texttemplate "text/template" @@ -112,6 +113,7 @@ type Task struct { // ↑ to be filled in by NewTaskForMesosOffer in Manager commandInfo *common.TaskCommandInfo + pid string } func (t *Task) IsSafeToStop() bool { @@ -447,3 +449,17 @@ func (t *Task) GetProperties() map[string]string { } return propertiesMap } + +func (t *Task) SetTaskPID(pid int) { + if t == nil { + return + } + t.pid = strconv.Itoa(pid) +} + +func (t *Task) GetTaskPID() string { + if t == nil { + return "" + } + return t.pid +} \ No newline at end of file diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 9a7a45f65..e55fb748e 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -271,11 +271,3 @@ func (i *iteratorRole) SetRuntimeVars(kv map[string]string) { } i.template.SetRuntimeVars(kv) } - -func (i *iteratorRole) GetTaskPID() string { - if i == nil { - return "" - } - pid, _ := i.template.GetUserVars().Get("taskPID") - return pid -} \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index 872955ced..c87c2d82f 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -57,7 +57,6 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) - GetTaskPID() string } type Updatable interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 62ddd64c9..2e19f9218 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -351,11 +351,3 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { } return } - -func (r *roleBase) GetTaskPID() string { - if r == nil { - return "" - } - pid, _ := r.UserVars.Get("taskPID") - return pid -} \ No newline at end of file From 6a9190bfcd8b797caa4aab02bcd519044a5b355f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jul 2020 14:54:25 +0200 Subject: [PATCH 0324/2352] [coconut] Adapt config import to new behavior of GetLatestTimestamp --- coconut/configuration/configuration.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index b197d8209..75ec59b47 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -408,12 +408,12 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } if entryExists { - if latestTimestamp != "0" && useNoVersion { + if (latestTimestamp != "0" && latestTimestamp != "") && useNoVersion { // If a timestamp already exists in the entry specified by the user, than it cannot be used return errors.New("Specified entry: '" + entry + "' already contains versioned items. Please " + "specify a different entry name"), invalidArgs } - if latestTimestamp == "0" && !useNoVersion { + if (latestTimestamp == "0" || latestTimestamp == "") && !useNoVersion { // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown return errors.New("Specified entry: '" + entry + "' already contains un-versioned items. Please " + "specify a different entry name"), invalidArgs From f218282b4ccedf815bc364b954498ae2ebca8447 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 24 Jul 2020 14:57:55 +0200 Subject: [PATCH 0325/2352] [build] Bump to v0.14.91 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 879e5d2d6..6890d1035 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 14 -VERSION_PATCH := 90 +VERSION_PATCH := 91 From dfb3427fcc1ec1254ac3ddfbfe5323c51364ff69 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 27 Jul 2020 13:54:11 +0300 Subject: [PATCH 0326/2352] [core] Fix deadlock caused from state.Event --- core/scheduler.go | 15 +++++++-------- core/server.go | 6 ++---- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 6c3037a07..ec0a272b1 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -47,7 +47,6 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" - cpb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/executor/protos" "github.com/gogo/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" @@ -325,7 +324,7 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even go func() { state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) state.servent.ProcessResponse(&res, sender) - state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState) + // state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState) }() return default: @@ -696,7 +695,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()) + // state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()) newTaskId := taskPtr.GetTaskId() @@ -732,7 +731,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl "executorId": state.executor.ExecutorID.Value, "task": mesosTaskInfo, }).Debug("launching task") - state.Event <- cpb.NewEventTaskLaunch(newTaskId) + // state.Event <- cpb.NewEventTaskLaunch(newTaskId) tasks = append(tasks, mesosTaskInfo) descriptorsToDeploy = append(descriptorsToDeploy[:i], descriptorsToDeploy[i+1:]...) @@ -879,7 +878,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { t := state.taskman.GetTask(taskIDValue) if t != nil && t.IsLocked() { go state.taskman.UpdateTaskState(taskIDValue, "ERROR") - state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR") + // state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR") } } @@ -897,7 +896,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { } else { // Enqueue task state update go state.taskman.UpdateTaskStatus(&s) - state.Event <- cpb.NewEventTaskStatus(&s) + // state.Event <- cpb.NewEventTaskStatus(&s) } return nil @@ -933,7 +932,7 @@ func KillTask(ctx context.Context, state *internalState, receiver controlcommand killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) - state.Event <- cpb.NewKillTasksEvent() + // state.Event <- cpb.NewKillTasksEvent() return } @@ -958,7 +957,7 @@ func SendCommand(ctx context.Context, state *internalState, command controlcomma "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), }). Debug("outgoing MESSAGE call") - state.Event <- cpb.NewEnvironmentStateEvent(bytes) + // state.Event <- cpb.NewEnvironmentStateEvent(bytes) return err } diff --git a/core/server.go b/core/server.go index 3d604bdcd..904adb090 100644 --- a/core/server.go +++ b/core/server.go @@ -213,8 +213,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - - m.state.Event <- pb.NewEnvironmentCreatedEvent(ei) + // m.state.Event <- pb.NewEnvironmentCreatedEvent(ei) return r, nil } @@ -364,8 +363,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir log.WithError(err).Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - - m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()) + // m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()) return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } From e72226a99a04608d4501d575f9923e953b130227 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 27 Jul 2020 13:57:15 +0300 Subject: [PATCH 0327/2352] [executor] Set kill timeout to 3 seconds --- executor/executable/controllabletask.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 5a5857c25..bf700115c 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -42,6 +42,11 @@ import ( "google.golang.org/grpc" ) +const( + KILL_TIMEOUT = 3*time.Second + TRANSITION_TIMEOUT = 10*time.Second +) + type ControllableTask struct { taskBase rpc *executorcmd.RpcClient @@ -466,7 +471,7 @@ func (t *ControllableTask) Kill() error { select { case killErr := <- killErrCh: if killErr == nil { - time.Sleep(10 * time.Second) + time.Sleep(KILL_TIMEOUT) if pidExists(pid) { // SIGINT for the "Waiting for graceful device shutdown. // Hit Ctrl-C again to abort immediately" message. @@ -477,12 +482,12 @@ func (t *ControllableTask) Kill() error { Warning("could not gracefully kill task") } } - time.Sleep(10 * time.Second) + time.Sleep(KILL_TIMEOUT) if !pidExists(pid) { return killErr } } - case <-time.After(10 * time.Second): + case <-time.After(TRANSITION_TIMEOUT): } killErr := syscall.Kill(pid, syscall.SIGKILL) From 35d4ba68a8bb491ef898e6272f30e4cc62d46805 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 27 Jul 2020 14:30:23 +0300 Subject: [PATCH 0328/2352] [core] Make state.Event unbuffered channel --- core/scheduler.go | 44 ++++++++++++++++++++++++++++++++++++-------- core/server.go | 12 ++++++++++-- core/state.go | 2 +- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index ec0a272b1..0c1ee2b73 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -45,6 +45,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/environment" + cpb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/executor/protos" @@ -324,7 +325,11 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even go func() { state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) state.servent.ProcessResponse(&res, sender) - // state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState) + select { + case state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): + default: + log.Debug("state.Event channel is full") + } }() return default: @@ -695,7 +700,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - // state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()) + select { + case state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()): + default: + log.Debug("state.Event channel is full") + } newTaskId := taskPtr.GetTaskId() @@ -731,7 +740,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl "executorId": state.executor.ExecutorID.Value, "task": mesosTaskInfo, }).Debug("launching task") - // state.Event <- cpb.NewEventTaskLaunch(newTaskId) + select { + case state.Event <- cpb.NewEventTaskLaunch(newTaskId): + default: + log.Debug("state.Event channel is full") + } tasks = append(tasks, mesosTaskInfo) descriptorsToDeploy = append(descriptorsToDeploy[:i], descriptorsToDeploy[i+1:]...) @@ -878,7 +891,11 @@ func statusUpdate(state *internalState) events.HandlerFunc { t := state.taskman.GetTask(taskIDValue) if t != nil && t.IsLocked() { go state.taskman.UpdateTaskState(taskIDValue, "ERROR") - // state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR") + select { + case state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR"): + default: + log.Debug("state.Event channel is full") + } } } @@ -896,7 +913,11 @@ func statusUpdate(state *internalState) events.HandlerFunc { } else { // Enqueue task state update go state.taskman.UpdateTaskStatus(&s) - // state.Event <- cpb.NewEventTaskStatus(&s) + select { + case state.Event <- cpb.NewEventTaskStatus(&s): + default: + log.Debug("state.Event channel is full") + } } return nil @@ -932,7 +953,11 @@ func KillTask(ctx context.Context, state *internalState, receiver controlcommand killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) - // state.Event <- cpb.NewKillTasksEvent() + select { + case state.Event <- cpb.NewKillTasksEvent(): + default: + log.Debug("state.Event channel is full") + } return } @@ -957,8 +982,11 @@ func SendCommand(ctx context.Context, state *internalState, command controlcomma "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), }). Debug("outgoing MESSAGE call") - // state.Event <- cpb.NewEnvironmentStateEvent(bytes) - + select { + case state.Event <- cpb.NewEnvironmentStateEvent(bytes): + default: + log.Debug("state.Event channel is full") + } return err } diff --git a/core/server.go b/core/server.go index 904adb090..92fa0e3d3 100644 --- a/core/server.go +++ b/core/server.go @@ -213,7 +213,11 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - // m.state.Event <- pb.NewEnvironmentCreatedEvent(ei) + select { + case m.state.Event <- pb.NewEnvironmentCreatedEvent(ei): + default: + log.Debug("state.Event channel is full") + } return r, nil } @@ -363,7 +367,11 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir log.WithError(err).Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - // m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()) + select { + case m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): + default: + log.Debug("state.Event channel is full") + } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } diff --git a/core/state.go b/core/state.go index 30a218e0d..f1fbf1e0c 100644 --- a/core/state.go +++ b/core/state.go @@ -82,7 +82,7 @@ func newInternalState(shutdown func()) (*internalState, error) { resourceOffersDone := make(chan task.DeploymentMap) tasksToDeploy := make(chan task.Descriptors) reviveOffersTrg := make(chan struct{}) - Event := make(chan *pb.Event, 100) + Event := make(chan *pb.Event) state := &internalState{ reviveTokens: backoff.BurstNotifier( From c4b7aa168c36b6a37447f3ee5869bbe23a1f6a82 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 27 Jul 2020 15:05:05 +0200 Subject: [PATCH 0329/2352] [build] Bump to v0.15.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 6890d1035..3cd3e924d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 14 -VERSION_PATCH := 91 +VERSION_MINOR := 15 +VERSION_PATCH := 0 From 1d4aef41f818a083d45bc7c01042ab054ca073ec Mon Sep 17 00:00:00 2001 From: Adam Wegrzynek Date: Fri, 31 Jul 2020 15:05:45 +0200 Subject: [PATCH 0330/2352] Fill configuration ptree with local file --- occ/occlib/OccServer.cxx | 6 +++++- occ/occlib/RuntimeControlledObject.cxx | 15 ++++++++++++--- occ/occlib/RuntimeControlledObject.h | 2 ++ occ/occlib/RuntimeControlledObjectPrivate.h | 9 +++++++++ occ/occlib/examples/dummy-process/CMakeLists.txt | 6 ++++-- occ/occlib/examples/dummy-process/main.cxx | 13 +++++++++++-- 6 files changed, 43 insertions(+), 8 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index c0b611d0c..5322cd732 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -247,7 +247,11 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: // STANDBY if (currentState==t_State::standby) { if (evt=="configure") { - err = m_rco->executeConfigure(properties); + if (!m_rco->getConfig().empty()) { + err = m_rco->executeConfigure(m_rco->getConfig()); + } else { + err = m_rco->executeConfigure(properties); + } if (!err) { newState = t_State::configured; } else { diff --git a/occ/occlib/RuntimeControlledObject.cxx b/occ/occlib/RuntimeControlledObject.cxx index 42380719d..723446fb6 100644 --- a/occ/occlib/RuntimeControlledObject.cxx +++ b/occ/occlib/RuntimeControlledObject.cxx @@ -25,9 +25,8 @@ #include "RuntimeControlledObject.h" -#include "RuntimeControlledObjectPrivate.h" - #include +#include "RuntimeControlledObjectPrivate.h" #include @@ -59,6 +58,16 @@ const std::string RuntimeControlledObject::getName() const return dPtr->mName; } +void RuntimeControlledObject::setConfig(const boost::property_tree::ptree& properties) +{ + dPtr->setConfig(properties); +} + +boost::property_tree::ptree RuntimeControlledObject::getConfig() +{ + return dPtr->getConfig(); +} + int RuntimeControlledObject::executeConfigure(const boost::property_tree::ptree& properties) { return 0; @@ -126,4 +135,4 @@ void RuntimeControlledObject::setState(t_State state) void RuntimeControlledObject::setRole(const std::string& role) { dPtr->mRole = role; -} \ No newline at end of file +} diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index fe9d0afc8..f5b01c85d 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -77,6 +77,8 @@ class OCC_EXPORT RuntimeControlledObject { */ t_State getState() const; + void setConfig(const boost::property_tree::ptree& properties); + boost::property_tree::ptree getConfig(); /// Transition from standby to configured. /// /// @param properties a boost::property_tree pushed by the control agent, containing diff --git a/occ/occlib/RuntimeControlledObjectPrivate.h b/occ/occlib/RuntimeControlledObjectPrivate.h index 30322de98..385fa21df 100644 --- a/occ/occlib/RuntimeControlledObjectPrivate.h +++ b/occ/occlib/RuntimeControlledObjectPrivate.h @@ -35,6 +35,15 @@ class RuntimeControlledObjectPrivate { friend class RuntimeControlledObject; friend class OccServer; private: + boost::property_tree::ptree mProps; + void setConfig(const boost::property_tree::ptree& properties) + { + mProps = properties; + } + boost::property_tree::ptree getConfig() + { + return mProps; + } t_State mCurrentState; std::string mName; RunNumber mCurrentRunNumber; diff --git a/occ/occlib/examples/dummy-process/CMakeLists.txt b/occ/occlib/examples/dummy-process/CMakeLists.txt index 1b298c7b4..9330f3143 100644 --- a/occ/occlib/examples/dummy-process/CMakeLists.txt +++ b/occ/occlib/examples/dummy-process/CMakeLists.txt @@ -20,8 +20,9 @@ # immunities granted to it by virtue of its status as an # Intergovernmental Organization or submit itself to any jurisdiction. -set(DUMMYPROCESS occexample-dummy-process) +find_package(Configuration REQUIRED) +set(DUMMYPROCESS occexample-dummy-process) set(DUMMYPROCESS_SOURCES @@ -33,6 +34,7 @@ add_executable(${DUMMYPROCESS} target_link_libraries(${DUMMYPROCESS} PUBLIC ${OCCLIBRARY} + AliceO2::Configuration Boost::program_options) target_include_directories(${DUMMYPROCESS} PUBLIC @@ -42,4 +44,4 @@ target_include_directories(${DUMMYPROCESS} PUBLIC $) install(TARGETS ${DUMMYPROCESS} - RUNTIME DESTINATION bin) \ No newline at end of file + RUNTIME DESTINATION bin) diff --git a/occ/occlib/examples/dummy-process/main.cxx b/occ/occlib/examples/dummy-process/main.cxx index 40a4b77fa..716bd3691 100644 --- a/occ/occlib/examples/dummy-process/main.cxx +++ b/occ/occlib/examples/dummy-process/main.cxx @@ -27,8 +27,10 @@ #include #include +#include namespace po = boost::program_options; +using o2::configuration::ConfigurationFactory; int main(int argc, char* argv[]) { po::options_description desc("Program options"); @@ -37,15 +39,22 @@ int main(int argc, char* argv[]) { // finally, the ones from OccInstance must be appended in order to handle --control-port: desc.add(OccInstance::ProgramOptions()); + desc.add_options()("config", po::value(), "Config file URL"); + // Boost::program_options boilerplate... po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); // Instantiate your state machine which inherits from RuntimeControlledObject: - ControlledStateMachine csm; + ControlledStateMachine csm{}; // Nothing is happening yet, the state machine starts in t_State::undefined. + // Habdle loading file from config + if (vm.count("config")) { + csm.setConfig(ConfigurationFactory::getConfiguration(vm["config"].as())->getRecursive("")); + } + // Instantiate the O² Control and Configuration interface: OccInstance occ(&csm, vm); // The OccInstance constructor immediately starts the gRPC server thread, which @@ -62,4 +71,4 @@ int main(int argc, char* argv[]) { // No need for further cleanup, the OccInstance should destroy its gRPC // interface and extra threads gracefully when it goes out of scope. -} \ No newline at end of file +} From e860201552aad0145fc51f4b2d35f931d7256268 Mon Sep 17 00:00:00 2001 From: Adam Wegrzynek Date: Mon, 3 Aug 2020 11:42:13 +0200 Subject: [PATCH 0331/2352] [OCTRL-295] Improve code documentation of PR#156 --- occ/occlib/RuntimeControlledObject.h | 4 ++++ occ/occlib/examples/dummy-process/main.cxx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index f5b01c85d..92dc2a2a7 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -77,8 +77,12 @@ class OCC_EXPORT RuntimeControlledObject { */ t_State getState() const; + /// Manually sets configuration ptree that is passed to user conde in the CONFIGURED state void setConfig(const boost::property_tree::ptree& properties); + + /// Configuration ptree getter boost::property_tree::ptree getConfig(); + /// Transition from standby to configured. /// /// @param properties a boost::property_tree pushed by the control agent, containing diff --git a/occ/occlib/examples/dummy-process/main.cxx b/occ/occlib/examples/dummy-process/main.cxx index 716bd3691..4230fc797 100644 --- a/occ/occlib/examples/dummy-process/main.cxx +++ b/occ/occlib/examples/dummy-process/main.cxx @@ -50,7 +50,7 @@ int main(int argc, char* argv[]) { ControlledStateMachine csm{}; // Nothing is happening yet, the state machine starts in t_State::undefined. - // Habdle loading file from config + // Handle loading configuration from a file if (vm.count("config")) { csm.setConfig(ConfigurationFactory::getConfiguration(vm["config"].as())->getRecursive("")); } From 58d3c8997b1e034ac376da13f85063e22e1db40c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:09:44 +0200 Subject: [PATCH 0332/2352] [core] New MesosCommand_TriggerHook --- .../mesoscommand_triggerhook.go | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core/controlcommands/mesoscommand_triggerhook.go diff --git a/core/controlcommands/mesoscommand_triggerhook.go b/core/controlcommands/mesoscommand_triggerhook.go new file mode 100644 index 000000000..7de832bf5 --- /dev/null +++ b/core/controlcommands/mesoscommand_triggerhook.go @@ -0,0 +1,63 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controlcommands + +type MesosCommand_TriggerHook struct { + MesosCommandBase +} + +func (m *MesosCommand_TriggerHook) MakeSingleTarget(target MesosCommandTarget) (cmd MesosCommand) { + if m == nil { + return + } + mc := m.MesosCommandBase.MakeSingleTarget(target) + mcb, ok := mc.(*MesosCommandBase) + if !ok { + return + } + + cmd = &MesosCommand_TriggerHook{ + MesosCommandBase: *mcb, + } + return +} + +func NewMesosCommand_TriggerHook(receivers []MesosCommandTarget) (*MesosCommand_TriggerHook) { + return &MesosCommand_TriggerHook{ + MesosCommandBase: *NewMesosCommand("MesosCommand_TriggerHook", receivers, PropertyMapsMap{}), + } +} + +type MesosCommandResponse_TriggerHook struct { + MesosCommandResponseBase + TaskId string `json:"taskId"` +} + +func NewMesosCommandResponse_TriggerHook(mesosCommand *MesosCommand_TriggerHook, err error, taskId string) *MesosCommandResponse_TriggerHook { + return &MesosCommandResponse_TriggerHook{ + MesosCommandResponseBase: *NewMesosCommandResponse(mesosCommand, err), + TaskId: taskId, + } +} \ No newline at end of file From e5b2baa42c3ec71e928d77c7c0696c7c2a46385e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:16:14 +0200 Subject: [PATCH 0333/2352] [executor] New HookTask + BasicTask refactor --- common/controlmode/controlmode.go | 5 + executor/executable/basictask.go | 208 +--------------------- executor/executable/basictaskcommon.go | 234 +++++++++++++++++++++++++ executor/executable/hooktask.go | 48 +++++ executor/executable/task.go | 26 ++- 5 files changed, 311 insertions(+), 210 deletions(-) create mode 100644 executor/executable/basictaskcommon.go create mode 100644 executor/executable/hooktask.go diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index 42a221c15..fc03b5c2e 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -38,6 +38,7 @@ const( DIRECT ControlMode = iota FAIRMQ BASIC + HOOK ) func (cm *ControlMode) String() string { @@ -52,6 +53,8 @@ func (cm *ControlMode) String() string { return "fairmq" case BASIC: return "basic" + case HOOK: + return "hook" } return "direct" } @@ -70,6 +73,8 @@ func (cm *ControlMode) UnmarshalText(b []byte) error { *cm = FAIRMQ case "basic": *cm = BASIC + case "hook": + *cm = HOOK default: *cm = DIRECT } diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 7568de2e8..2ffba9c3f 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -25,152 +25,15 @@ package executable import ( - "bytes" - "encoding/json" - "errors" - "io" - "os/exec" - "syscall" - - "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/executor/executorcmd" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" - pb "github.com/AliceO2Group/Control/executor/protos" - mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" ) type BasicTask struct { - taskBase - taskCmd *exec.Cmd - transitioner transitioner.Transitioner - pendingFinalTaskStateCh chan mesos.TaskState -} - -type HookTask struct { - taskBase + basicTaskBase } - func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { - startBasicTask := func() (err error) { - // Set up pipes for controlled process - var errStdout, errStderr error - var stdoutBuf, stderrBuf bytes.Buffer - - stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) - stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel) - - // Each of these multiwriters will push incoming lines to a buffer as well as the logger - stdout := io.MultiWriter(stdoutLog, &stdoutBuf) - stderr := io.MultiWriter(stderrLog, &stderrBuf) - - stdoutIn, _ := t.taskCmd.StdoutPipe() - stderrIn, _ := t.taskCmd.StderrPipe() - - err = t.taskCmd.Start() - - if err != nil { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - "command": *t.tci.Value, - }). - Error("failed to run basic task") - - return err - } - log.WithField("id", t.ti.TaskID.Value). - WithField("task", t.ti.Name). - Debug("basic task started") - - go func() { - _, errStdout = io.Copy(stdout, stdoutIn) - }() - go func() { - _, errStderr = io.Copy(stderr, stderrIn) - }() - - go func() { - err = t.taskCmd.Wait() - // ^ when this unblocks, the task is done - - pendingState := mesos.TASK_FINISHED - if err != nil { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - }). - Error("process terminated with error") - pendingState = mesos.TASK_FAILED - } - - // Can be -1 if the process was killed - exitCode := t.taskCmd.ProcessState.ExitCode() - processTerminatedOnItsOwn := true - - select { - case pending := <- t.pendingFinalTaskStateCh: - pendingState = pending - processTerminatedOnItsOwn = false - default: - } - - if errStdout != nil || errStderr != nil { - log.WithFields(logrus.Fields{ - "errStderr": errStderr, - "errStdout": errStdout, - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - }). - Warning("failed to capture stdout or stderr of task") - } - - deo := event.DeviceEventOrigin{ - AgentId: t.ti.AgentID, - ExecutorId: t.ti.GetExecutor().ExecutorID, - TaskId: t.ti.TaskID, - } - deviceEvent := event.NewDeviceEvent(deo, pb.DeviceEventType_BASIC_TASK_TERMINATED) - if btt, ok := deviceEvent.(*event.BasicTaskTerminated); ok { - btt.VoluntaryTermination = processTerminatedOnItsOwn - btt.ExitCode = exitCode - btt.FinalMesosState = pendingState - btt.Stderr = stderrBuf.String() - btt.Stdout = stdoutBuf.String() - t.sendDeviceEvent(btt) - } - }() - - return err - } - - ensureBasicTaskKilled := func() (err error) { - if t.taskCmd == nil { - return nil - } - if t.taskCmd.ProcessState.Exited() { - return nil - } - - // Preparing to kill running task - t.pendingFinalTaskStateCh <- mesos.TASK_KILLED - - // TODO: SIGTERM before SIGKILL - - pid := t.taskCmd.Process.Pid - err = syscall.Kill(-pid, syscall.SIGKILL) - if err != nil { - log.WithError(err). - WithField("taskId", t.ti.GetTaskID()). - Warning("could not kill task") - } - - return - } // If it's a basic task role, we make a RUNNING-state based transition function // otherwise we process the hooks spec. return func(ei transitioner.EventInfo) (newState string, err error) { @@ -195,13 +58,13 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { return "CONFIGURED", err } } - err = startBasicTask() + err = t.startBasicTask() if err != nil { return "CONFIGURED", err } return "RUNNING", err case ei.Src == "RUNNING" && ei.Evt == "STOP" && ei.Dst == "CONFIGURED": - err = ensureBasicTaskKilled() + err = t.ensureBasicTaskKilled() return "CONFIGURED", err default: // By default we declare any transition as valid and executed as NOOP @@ -211,68 +74,5 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { } func (t *BasicTask) Launch() error { - t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed - if t.taskCmd != nil { - return errors.New("bad internal state for basic task command") - } - - var err error - t.taskCmd, err = prepareTaskCmd(t.tci) - if err != nil { - msg := "cannot build task command" - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - }). - Error(msg) - return err - } - if t.taskCmd == nil { - return errors.New("could not instantiate basic task command") - } - - t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, t.makeTransitionFunc()) - log.WithField("payload", string(t.ti.GetData()[:])). - WithField("task", t.ti.Name). - Debug("basic task staged") - - go t.sendStatus(mesos.TASK_RUNNING, "") - taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.taskCmd.Process.Pid)) - jsonEvent, err := json.Marshal(taskMessage) - if err != nil { - log.WithError(err).Warning("error marshaling message from task") - } else { - t.sendMessage(jsonEvent) - } - - return nil -} - -func (t *BasicTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { - cmd = new(executorcmd.ExecutorCommand_Transition) - - cmd.Transitioner = t.transitioner - err = json.Unmarshal(data, cmd) - if err != nil { - cmd = nil - } - return -} - -func (t *BasicTask) Transition(cmd *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { - newState, transitionError := cmd.Commit() - - response := cmd.PrepareResponse(transitionError, newState, t.ti.TaskID.Value) - return response -} - -func (t *BasicTask) Kill() error { - if t.taskCmd != nil { - t.taskCmd = nil - log.Debug("exec.Cmd wrapper removed") - } - - go t.sendStatus(mesos.TASK_FINISHED, "") - return nil + return t.doLaunch(t.makeTransitionFunc()) } diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go new file mode 100644 index 000000000..0d223af80 --- /dev/null +++ b/executor/executable/basictaskcommon.go @@ -0,0 +1,234 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "bytes" + "encoding/json" + "errors" + "io" + "os/exec" + "syscall" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" + pb "github.com/AliceO2Group/Control/executor/protos" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/sirupsen/logrus" +) + +type basicTaskBase struct { + taskBase + taskCmd *exec.Cmd + transitioner transitioner.Transitioner + pendingFinalTaskStateCh chan mesos.TaskState +} + +func (t *basicTaskBase) startBasicTask() (err error) { + // Set up pipes for controlled process + var errStdout, errStderr error + var stdoutBuf, stderrBuf bytes.Buffer + + stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) + stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel) + + // Each of these multiwriters will push incoming lines to a buffer as well as the logger + stdout := io.MultiWriter(stdoutLog, &stdoutBuf) + stderr := io.MultiWriter(stderrLog, &stderrBuf) + + stdoutIn, _ := t.taskCmd.StdoutPipe() + stderrIn, _ := t.taskCmd.StderrPipe() + + err = t.taskCmd.Start() + + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "command": *t.tci.Value, + }). + Error("failed to run basic task") + + return err + } + log.WithField("id", t.ti.TaskID.Value). + WithField("task", t.ti.Name). + Debug("basic task started") + + go func() { + _, errStdout = io.Copy(stdout, stdoutIn) + }() + go func() { + _, errStderr = io.Copy(stderr, stderrIn) + }() + + go func() { + err = t.taskCmd.Wait() + // ^ when this unblocks, the task is done + + pendingState := mesos.TASK_FINISHED + if err != nil { + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + }). + Error("process terminated with error") + pendingState = mesos.TASK_FAILED + } + + // Can be -1 if the process was killed + exitCode := t.taskCmd.ProcessState.ExitCode() + processTerminatedOnItsOwn := true + + select { + case pending := <- t.pendingFinalTaskStateCh: + pendingState = pending + processTerminatedOnItsOwn = false + default: + } + + if errStdout != nil || errStderr != nil { + log.WithFields(logrus.Fields{ + "errStderr": errStderr, + "errStdout": errStdout, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + }). + Warning("failed to capture stdout or stderr of task") + } + + deo := event.DeviceEventOrigin{ + AgentId: t.ti.AgentID, + ExecutorId: t.ti.GetExecutor().ExecutorID, + TaskId: t.ti.TaskID, + } + deviceEvent := event.NewDeviceEvent(deo, pb.DeviceEventType_BASIC_TASK_TERMINATED) + if btt, ok := deviceEvent.(*event.BasicTaskTerminated); ok { + btt.VoluntaryTermination = processTerminatedOnItsOwn + btt.ExitCode = exitCode + btt.FinalMesosState = pendingState + btt.Stderr = stderrBuf.String() + btt.Stdout = stdoutBuf.String() + t.sendDeviceEvent(btt) + } + }() + + return err +} + +func (t *basicTaskBase) ensureBasicTaskKilled() (err error) { + if t.taskCmd == nil { + return nil + } + if t.taskCmd.ProcessState.Exited() { + return nil + } + + // Preparing to kill running task + t.pendingFinalTaskStateCh <- mesos.TASK_KILLED + + // TODO: SIGTERM before SIGKILL + + pid := t.taskCmd.Process.Pid + err = syscall.Kill(-pid, syscall.SIGKILL) + if err != nil { + log.WithError(err). + WithField("taskId", t.ti.GetTaskID()). + Warning("could not kill task") + } + + return +} + +func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) error { + t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed + if t.taskCmd != nil { + return errors.New("bad internal state for basic task command") + } + + var err error + t.taskCmd, err = prepareTaskCmd(t.tci) + if err != nil { + msg := "cannot build task command" + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). + Error(msg) + return err + } + if t.taskCmd == nil { + return errors.New("could not instantiate basic task command") + } + + t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, transitionFunc) + log.WithField("payload", string(t.ti.GetData()[:])). + WithField("task", t.ti.Name). + Debug("basic task staged") + + go t.sendStatus(mesos.TASK_RUNNING, "") + taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.taskCmd.Process.Pid)) + jsonEvent, err := json.Marshal(taskMessage) + if err != nil { + log.WithError(err).Warning("error marshaling message from task") + } else { + t.sendMessage(jsonEvent) + } + + return nil +} + +func (t *basicTaskBase) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { + cmd = new(executorcmd.ExecutorCommand_Transition) + + cmd.Transitioner = t.transitioner + err = json.Unmarshal(data, cmd) + if err != nil { + cmd = nil + } + return +} + +func (t *basicTaskBase) Transition(cmd *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { + newState, transitionError := cmd.Commit() + + response := cmd.PrepareResponse(transitionError, newState, t.ti.TaskID.Value) + return response +} + +func (t *basicTaskBase) Kill() error { + if t.taskCmd != nil { + t.taskCmd = nil + log.Debug("exec.Cmd wrapper removed") + } + + go t.sendStatus(mesos.TASK_FINISHED, "") + return nil +} diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go new file mode 100644 index 000000000..6c7d7747c --- /dev/null +++ b/executor/executable/hooktask.go @@ -0,0 +1,48 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" +) + +type HookTask struct { + basicTaskBase +} + +func (t *HookTask) makeTransitionFunc() transitioner.DoTransitionFunc { + // NOOP transition function, because hooks don't obey any transition + return func(ei transitioner.EventInfo) (newState string, err error) { + log.WithField("event", ei.Evt). + Debug("executor hook task transitioner requesting transition") + + return ei.Dst, nil + } +} + +func (t *HookTask) Launch() error { + return t.doLaunch(t.makeTransitionFunc()) +} + diff --git a/executor/executable/task.go b/executor/executable/task.go index 8dab65609..22731dae8 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -101,12 +101,26 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE switch commandInfo.ControlMode { case controlmode.BASIC: newTask = &BasicTask{ - taskBase: taskBase{ - ti: &taskInfo, - tci: &commandInfo, - sendStatus: sendStatusFunc, - sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + basicTaskBase: basicTaskBase{ + taskBase: taskBase{ + ti: &taskInfo, + tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + }, + }, + } + case controlmode.HOOK: + newTask = &HookTask{ + basicTaskBase: basicTaskBase{ + taskBase: taskBase{ + ti: &taskInfo, + tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + }, }, } case controlmode.DIRECT: From 3489d8b1f7892e6afce2ed7c8064672437926df0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:17:14 +0200 Subject: [PATCH 0334/2352] [core] Support for loading hook definitions from workflow template --- core/task/task.go | 37 +++++++++++++++++++++++- core/workflow/aggregator.go | 18 ++++++++++-- core/workflow/role.go | 1 + core/workflow/taskrole.go | 56 +++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 2d4f91f78..f72757285 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -35,6 +35,7 @@ import ( "strconv" "strings" texttemplate "text/template" + "time" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" @@ -57,6 +58,7 @@ type parentRole interface { UpdateState(State) GetPath() string GetTaskClass() string + GetTaskTraits() Traits SetTask(*Task) GetEnvironmentId() uuid.Array CollectOutboundChannels() []channel.Outbound @@ -67,6 +69,13 @@ type parentRole interface { CollectInboundChannels() []channel.Inbound } + +type Traits struct { + Trigger string + Timeout time.Duration + Critical bool +} + /* type Task interface { GetParentRole() interface{} @@ -173,6 +182,31 @@ func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { return varStack } +func (t *Task) GetControlMode() controlmode.ControlMode { + if class := t.GetTaskClass(); class != nil { + // If it's a BASIC task but its parent role uses it as a HOOK, + // we modify the actual control mode of the task. + // The class itself can never be HOOK, only BASIC + if class.Control.Mode == controlmode.BASIC && t.parent != nil { + traits := t.parent.GetTaskTraits() + if len(traits.Trigger) > 0 { + return controlmode.HOOK + } + } + return class.Control.Mode + } + return controlmode.DIRECT +} + +func (t *Task) GetTraits() Traits { + if class := t.GetTaskClass(); class != nil { + if class.Control.Mode == controlmode.BASIC && t.parent != nil { + return t.parent.GetTaskTraits() + } + } + return Traits{} +} + // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. func (t *Task) BuildTaskCommand(role parentRole) (err error) { @@ -248,7 +282,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { "--color", "false") } - cmd.ControlMode = class.Control.Mode + cmd.ControlMode = t.GetControlMode() // This might change BASIC->HOOK + t.commandInfo = cmd } else { t.commandInfo = &common.TaskCommandInfo{} diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index c1a440f7e..3e7d394cf 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -35,7 +35,7 @@ type aggregator struct { Roles []Role `yaml:"roles,omitempty"` } -func (r* aggregator) copy() copyable { +func (r *aggregator) copy() copyable { rCopy := aggregator{ Roles: make([]Role, len(r.Roles)), } @@ -77,7 +77,7 @@ func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (union return } -func (a *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We define a fake aggregator, whose Roles member is a slice of _roleUnions // The _roleUnions, when unmarshaling, will have probed for the actual role type // through their own fake types, and unmarshaled the true role inside each of them. @@ -104,7 +104,7 @@ func (a *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error return } } - a.Roles = roles + r.Roles = roles return } @@ -132,6 +132,18 @@ func (r *aggregator) GetTasks() (tasks task.Tasks) { return } +func (r * aggregator) GetHooksForTrigger(trigger string) (tasks task.Tasks) { + if r == nil { + return nil + } + + tasks = make(task.Tasks, 0) + for _, role := range r.GetRoles() { + tasks = append(tasks, role.GetHooksForTrigger(trigger)...) + } + return +} + func (r *aggregator) GetTaskClasses() (taskClassesSlice []string) { if r == nil { return nil diff --git a/core/workflow/role.go b/core/workflow/role.go index c87c2d82f..194ac70e0 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -57,6 +57,7 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) + GetHooksForTrigger(trigger string) task.Tasks } type Updatable interface { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index e6808f61a..424afeee7 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -27,6 +27,7 @@ package workflow import ( "errors" texttemplate "text/template" + "time" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -36,6 +37,7 @@ import ( type taskRole struct { roleBase + task.Traits Task *task.Task `yaml:"-,omitempty"` LoadTaskClass string `yaml:"-,omitempty"` } @@ -44,6 +46,9 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) aux := struct{ Task struct{ Load string + Trigger *string + Timeout *string + Critical *bool } }{} @@ -61,6 +66,35 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } role.LoadTaskClass = aux.Task.Load + + // Set up basicTaskTraits defaults + if aux.Task.Trigger != nil && len(*aux.Task.Trigger) > 0 { // hook + role.Trigger = *aux.Task.Trigger + if aux.Task.Timeout != nil && len(*aux.Task.Timeout) > 0 { + role.Timeout, err = time.ParseDuration(*aux.Task.Timeout) + if err != nil { + return + } + } else { + role.Timeout = 30 * time.Second + } + } else { // basic task + if aux.Task.Timeout != nil && len(*aux.Task.Timeout) > 0 { + role.Timeout, err = time.ParseDuration(*aux.Task.Timeout) + if err != nil { + return + } + } else { + role.Timeout = 0 + } + } + + if aux.Task.Critical != nil { // default for critical is always true + role.Critical = *aux.Task.Critical + } else { + role.Critical = true + } + *t = taskRole(role) return } @@ -187,6 +221,16 @@ func (t *taskRole) GetTasks() task.Tasks { return []*task.Task{t.GetTask()} } +func (t *taskRole) GetHooksForTrigger(trigger string) (tasks task.Tasks) { + if ttask := t.GetTask(); ttask == nil { + return []*task.Task{} + } + if len(t.Trigger) > 0 && t.Trigger == trigger { + return []*task.Task{t.GetTask()} + } + return []*task.Task{} +} + func (t *taskRole) GetTask() *task.Task { if t == nil { return nil @@ -201,6 +245,18 @@ func (t* taskRole) GetTaskClass() string { return t.LoadTaskClass } +func (t* taskRole) GetTaskTraits() task.Traits { + if t == nil { + return task.Traits{ + Trigger: "", + Timeout: 0, + Critical: false, + } + } + return t.Traits +} + + func (t* taskRole) GetTaskClasses() []string { if t == nil { return nil From cf239674bba567dfef81b6d9524201f70c2a49d1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:18:21 +0200 Subject: [PATCH 0335/2352] [core] MesosCommand_TriggerHook handling --- core/scheduler.go | 55 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 0c1ee2b73..c80e80835 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -302,17 +302,41 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even log.WithPrefix("scheduler").WithField("commandName", incomingCommand.CommandName).Debug("processing incoming MESSAGE") switch incomingCommand.CommandName { + case "MesosCommand_TriggerHook": + var res controlcommands.MesosCommandResponse_TriggerHook + err = json.Unmarshal(data, &res) + if err != nil { + log.WithPrefix("scheduler").WithFields(logrus.Fields{ + "commandName": incomingCommand.CommandName, + "agentId": agentId.GetValue(), + "executorId": executorId.GetValue(), + "message": string(data[:]), + "error": err.Error(), + }). + Error("cannot unmarshal incoming MESSAGE") + return + } + sender := controlcommands.MesosCommandTarget{ + AgentId: agentId, + ExecutorId: executorId, + TaskId: mesos.TaskID{Value: res.TaskId}, + } + + go func() { + state.servent.ProcessResponse(&res, sender) + }() + return case "MesosCommand_Transition": var res controlcommands.MesosCommandResponse_Transition err = json.Unmarshal(data, &res) if err != nil { log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "commandName": incomingCommand.CommandName, - "agentId": agentId.GetValue(), - "executorId": executorId.GetValue(), - "message": string(data[:]), - "error": err.Error(), - }). + "commandName": incomingCommand.CommandName, + "agentId": agentId.GetValue(), + "executorId": executorId.GetValue(), + "message": string(data[:]), + "error": err.Error(), + }). Error("cannot unmarshal incoming MESSAGE") return } @@ -372,6 +396,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { // Propagate this information to the task/role taskId := evt.GetOrigin().TaskId t := state.taskman.GetTask(taskId.Value) + isHook := false if t != nil { if parentRole, ok := t.GetParentRole().(workflow.Role); ok { parentRole.SetRuntimeVars(map[string]string{ @@ -381,6 +406,16 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { "taskResult.finalStatus": btt.FinalMesosState.String(), "taskResult.timestamp": utils.NewUnixTimestamp(), }) + + // If it's an update following a HOOK execution + if t.GetControlMode() == controlmode.HOOK { + isHook = true + env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + } + env.NotifyEvent(evt) + } } else { log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") } @@ -388,7 +423,9 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") } - if btt.VoluntaryTermination { + // If the task hasn't already been killed + // AND it's not a hook + if btt.VoluntaryTermination && !isHook { goto doFallthrough } } @@ -528,7 +565,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } } - log.WithPrefix("scheduler").Debug("state lock") + log.WithPrefix("scheduler").Debug("state lock to process descriptors to deploy") state.Lock() // We iterate down over the descriptors, and we remove them as we match @@ -861,7 +898,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { switch updatedState { case mesos.TASK_FINISHED: - log.WithPrefix("scheduler").Debug("state lock") + log.WithPrefix("scheduler").Debug("state lock for task finished") state.Lock() state.tasksFinished++ state.metricsAPI.tasksFinished() From 76d105e58fe2f64818806c462df144c51921f9dd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:19:02 +0200 Subject: [PATCH 0336/2352] [executor] MesosCommand_TriggerHook handling --- executor/executor.go | 2 +- executor/handlers.go | 71 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/executor/executor.go b/executor/executor.go index 7aef2ec8f..52bd45df8 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Copyright 2018-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * Portions from examples in : diff --git a/executor/handlers.go b/executor/handlers.go index b1bd49537..25eed1745 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executable" "github.com/AliceO2Group/Control/executor/executorcmd" mesos "github.com/mesos/mesos-go/api/v1/lib" @@ -124,20 +125,76 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { WithField("payload", string(data[:])). Debug("processing incoming MESSAGE") + taskId := incoming.TargetList[0].TaskId + switch incoming.Name { - case "MesosCommand_Transition": - taskId := incoming.TargetList[0].TaskId + case "MesosCommand_TriggerHook": + // Check whether the task exists and is active + activeTask, ok := state.activeTasks[taskId] + if !ok || activeTask == nil { + err = fmt.Errorf("no active task %s", taskId.Value) + log.WithFields(logrus.Fields{ + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("no task for incoming MESSAGE") + return + } + + // Asynchronous and thread-unsafe, but probably ok because a hook only fires + // once per environment cycle + go func() { + var cmd *controlcommands.MesosCommand_TriggerHook + err = json.Unmarshal(data, cmd) + if err != nil { + log.WithFields(logrus.Fields{ + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("cannot unmarshal incoming MESSAGE") + return + } + + response := controlcommands.NewMesosCommandResponse_TriggerHook(cmd, nil, taskId.String()) + err = activeTask.Launch() + if err != nil { + response.ErrorString = err.Error() + } + data, marshalError := json.Marshal(response) + if marshalError != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + return + } + + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + }). + Debug("response sent") + }() + + case "MesosCommand_Transition": // Check whether the task exists and is active activeTask, ok := state.activeTasks[taskId] if !ok || activeTask == nil { err = fmt.Errorf("no active task %s", taskId.Value) log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": err.Error(), - }). - Error("no task for incoming MESSAGE") + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). + Error("no task for incoming MESSAGE") return } From 11d39c83d6bf79ad958a2fbf865e8978db56f621 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:19:44 +0200 Subject: [PATCH 0337/2352] [core] task.Manager.TriggerHook implementation --- core/task/manager.go | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index 92e851949..e3299898d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -491,6 +491,38 @@ func (m *Manager) TransitionTasks(tasks Tasks, src string, event string, dest st return nil } +func (m *Manager) TriggerHooks(tasks Tasks) error { + if len(tasks) == 0 { + return nil + } + + notify := make(chan controlcommands.MesosCommandResponse) + receivers, err := tasks.GetMesosCommandTargets() + + if err != nil { + return err + } + + cmd := controlcommands.NewMesosCommand_TriggerHook(receivers) + m.cq.Enqueue(cmd, notify) + + response := <- notify + close(notify) + + if response == nil { + return errors.New("unknown MesosCommand error: nil response received") + } + + errText := response.Err().Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + + // FIXME: improve error handling ↑ + + return nil +} + func (m *Manager) GetTaskClass(name string) (b *Class) { if m == nil { return From b1613ed89e9759c30e96b369fa19f738ea1278b9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Jul 2020 15:20:14 +0200 Subject: [PATCH 0338/2352] [core] Tie hooks to environment state machine triggers --- core/environment/environment.go | 113 +++++++++++++++++++++++++++++++- core/environment/manager.go | 3 + 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 9ebc7e1e4..a88699139 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -28,11 +28,14 @@ package environment import ( "errors" + "fmt" "sync" "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" @@ -53,18 +56,30 @@ type Environment struct { workflow workflow.Role wfAdapter *workflow.ParentAdapter currentRunNumber uint32 + hookHandlerF func(hooks task.Tasks) error + incomingEvents chan event.DeviceEvent GlobalDefaults gera.StringMap // From Consul GlobalVars gera.StringMap // From Consul UserVars gera.StringMap // From user input } +func (env *Environment) NotifyEvent(e event.DeviceEvent) { + if e != nil && env.incomingEvents != nil { + select { + case env.incomingEvents <- e: + default: + } + } +} + func newEnvironment(userVars map[string]string) (env *Environment, err error) { envId := uuid.NewUUID() env = &Environment{ id: envId, workflow: nil, ts: time.Now(), + incomingEvents: make(chan event.DeviceEvent), // Every Environment instantiation performs a ConfSvc query for defaults and vars // these key-values stay frozen throughout the lifetime of the environment GlobalDefaults: gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults()), @@ -91,7 +106,17 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "STANDBY"}, }, fsm.Callbacks{ + "before_event": func(e *fsm.Event) { + env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) + + env.handlerFunc()(e) + }, + "leave_state": func(e *fsm.Event) { + env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) + }, "enter_state": func(e *fsm.Event) { + env.handleHooks(env.Workflow(), fmt.Sprintf("enter_%s", e.Dst)) + log.WithFields(logrus.Fields{ "event": e.Event, "src": e.Src, @@ -99,12 +124,98 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { "environmentId": envId, }).Debug("environment.sm entering state") }, - "before_event": env.handlerFunc(), + "after_event": func(e *fsm.Event) { + env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) + }, }, ) return } +func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err error) { + hooksToTrigger := workflow.GetHooksForTrigger(trigger) + if len(hooksToTrigger) == 0 { + return nil + } + + err = env.hookHandlerF(hooksToTrigger) + if err != nil { + return + } + + timeoutCh := make(chan *task.Task) + hookTimers := make(map[*task.Task]*time.Timer) + + for _, hook := range hooksToTrigger { + hookTimers[hook] = time.AfterFunc(hook.GetTraits().Timeout, + func() { + thisHook := hook + timeoutCh <- thisHook + }) + } + + successfulHooks := make(task.Tasks, 0) + failedHooks := make(task.Tasks, 0) + + for { + select { + case e := <- env.incomingEvents: + switch evt := e.(type) { + case *event.BasicTaskTerminated: + tid := evt.GetOrigin().TaskId + thisHook := hooksToTrigger.GetByTaskId(tid.String()) + if thisHook == nil { + continue + } + + hookTimers[thisHook].Stop() + delete(hookTimers, thisHook) + if evt.ExitCode != 0 || !evt.VoluntaryTermination { + failedHooks = append(failedHooks, thisHook) + log.WithField("task", thisHook.GetName()). + WithFields(logrus.Fields{ + "exitCode": evt.ExitCode, + "stdout": evt.Stdout, + "stderr": evt.Stderr, + "finalMesosState": evt.FinalMesosState.String(), + }). + Warn("hook failed") + } else { + successfulHooks = append(successfulHooks, thisHook) + log.WithField("task", thisHook.GetName()).Trace("hook completed") + } + + default: + continue + } + case thisHook := <- timeoutCh: + log.WithField("task", thisHook.GetName()).Warn("hook response timed out") + delete(hookTimers, thisHook) + failedHooks = append(failedHooks, thisHook) + } + + if len(hookTimers) == 0 { + break + } + } + + if len(hooksToTrigger) == len(successfulHooks) { + err = nil + return + } + + // We only report non-nil error if at least one CRITICAL HOOK failed + hookCounter := 0 + for _, thisHook := range failedHooks { + if thisHook.GetTraits().Critical { + hookCounter++ + err = fmt.Errorf("%d hooks failed", hookCounter) + } + } + + return +} + func (env *Environment) TryTransition(t Transition) (err error) { err = t.check() if err != nil { diff --git a/core/environment/manager.go b/core/environment/manager.go index 759cdd3d2..5bb14ce5b 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -74,6 +74,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { return uuid.NIL, err } + env.hookHandlerF = func(hooks task.Tasks) error { + return envs.taskman.TriggerHooks(hooks) + } env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) From ad0db56b2ff03adbfa62b45f91912c1b7a4d6f8f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 15:59:11 +0200 Subject: [PATCH 0339/2352] [coconut] Accept lowercase event names as well as short start/stop --- coconut/control/control.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index cc8603bb4..b6ee4a3ad 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -380,6 +380,12 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. if err != nil { return } + event = strings.ToUpper(event) + switch event { + case "START": fallthrough + case "STOP": + event = event + "_ACTIVITY" + } var response *pb.ControlEnvironmentReply response, err = rpc.ControlEnvironment(cxt, &pb.ControlEnvironmentRequest{Id: args[0], Type: pb.ControlEnvironmentRequest_Optype(pb.ControlEnvironmentRequest_Optype_value[event])}, grpc.EmptyCallOption{}) From 4faf4616ffa23ed53a62c1e9df00e1754329ccfa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:11:51 +0200 Subject: [PATCH 0340/2352] [common] controlmode.String should not have ptr receiver --- common/controlmode/controlmode.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index fc03b5c2e..075db220e 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -41,12 +41,8 @@ const( HOOK ) -func (cm *ControlMode) String() string { - if cm == nil { - return "" - } - - switch *cm { +func (cm ControlMode) String() string { + switch cm { case DIRECT: return "direct" case FAIRMQ: From 76411bacea6f86362e6a7aee556f27d813afc929 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:14:18 +0200 Subject: [PATCH 0341/2352] [core] Better error output on failed MesosCommandResponse --- core/controlcommands/mesoscommandservent.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index b0aad4565..ea17cf375 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -25,7 +25,7 @@ package controlcommands import ( - "errors" + "fmt" "sync" "time" @@ -114,7 +114,7 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes log.Debug("servent mutex locking") s.mu.Lock() log.Debug("servent mutex locked") - call.Error = errors.New("MesosCommand timed out") + call.Error = fmt.Errorf("MesosCommand timed out %s", cmd.GetName()) delete(s.pending, callId) s.mu.Unlock() log.Debug("servent mutex unlocked") From 68abf7081ed7cb10fedc0c2f2bdcbac83fd17b83 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:16:06 +0200 Subject: [PATCH 0342/2352] [executor] Refactor taskCmd lifetime for basic+hooks --- common/taskcmdinfo.go | 9 ++++- executor/executable/basictask.go | 17 -------- executor/executable/basictaskcommon.go | 56 +++++++++++--------------- 3 files changed, 32 insertions(+), 50 deletions(-) diff --git a/common/taskcmdinfo.go b/common/taskcmdinfo.go index d2f2ea0a7..93698b3dc 100644 --- a/common/taskcmdinfo.go +++ b/common/taskcmdinfo.go @@ -24,10 +24,17 @@ package common -import "github.com/AliceO2Group/Control/common/controlmode" +import ( + "time" + + "github.com/AliceO2Group/Control/common/controlmode" +) type TaskCommandInfo struct { CommandInfo ControlPort uint64 `json:"controlPort"` ControlMode controlmode.ControlMode `json:"controlMode"` + + // Only applies to hooks and basic tasks + Timeout time.Duration `json:"timeout,omitempty"` } diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index 2ffba9c3f..c1f9a5c86 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -26,7 +26,6 @@ package executable import ( "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" - "github.com/sirupsen/logrus" ) type BasicTask struct { @@ -42,22 +41,6 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { switch { case ei.Src == "CONFIGURED" && ei.Evt == "START" && ei.Dst == "RUNNING": - // If we've already run the task, went back to CONFIGURED and are now - // looking to rerun it within the same environment, we must recreate - // the taskCmd as the exec.Cmd type is single-use: - if t.taskCmd.ProcessState != nil && t.taskCmd.ProcessState.Exited() { - t.taskCmd, err = prepareTaskCmd(t.tci) - if err != nil { - msg := "cannot build task command" - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - }). - Error(msg) - return "CONFIGURED", err - } - } err = t.startBasicTask() if err != nil { return "CONFIGURED", err diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 0d223af80..3373c6ced 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -49,6 +49,21 @@ type basicTaskBase struct { } func (t *basicTaskBase) startBasicTask() (err error) { + t.taskCmd, err = prepareTaskCmd(t.tci) + if err != nil { + msg := "cannot build task command" + log.WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). + Error(msg) + return err + } + if t.taskCmd == nil { + return errors.New("could not instantiate basic task command") + } + // Set up pipes for controlled process var errStdout, errStderr error var stdoutBuf, stderrBuf bytes.Buffer @@ -67,11 +82,11 @@ func (t *basicTaskBase) startBasicTask() (err error) { if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - "command": *t.tci.Value, - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "command": *t.tci.Value, + }). Error("failed to run basic task") return err @@ -94,10 +109,10 @@ func (t *basicTaskBase) startBasicTask() (err error) { pendingState := mesos.TASK_FINISHED if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + }). Error("process terminated with error") pendingState = mesos.TASK_FAILED } @@ -172,35 +187,12 @@ func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) e return errors.New("bad internal state for basic task command") } - var err error - t.taskCmd, err = prepareTaskCmd(t.tci) - if err != nil { - msg := "cannot build task command" - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - }). - Error(msg) - return err - } - if t.taskCmd == nil { - return errors.New("could not instantiate basic task command") - } - t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, transitionFunc) log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). Debug("basic task staged") go t.sendStatus(mesos.TASK_RUNNING, "") - taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.taskCmd.Process.Pid)) - jsonEvent, err := json.Marshal(taskMessage) - if err != nil { - log.WithError(err).Warning("error marshaling message from task") - } else { - t.sendMessage(jsonEvent) - } return nil } From 48f7696c25fa1a303a0acf7dc68af3904e1bc6e1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:17:40 +0200 Subject: [PATCH 0343/2352] [executor] Add basic/hook task timeout support via context --- executor/executable/task.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/executor/executable/task.go b/executor/executable/task.go index 22731dae8..0cecf3967 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -25,6 +25,7 @@ package executable import ( + "context" "encoding/json" "errors" "os" @@ -84,6 +85,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE "value": *commandInfo.Value, "args": commandInfo.Arguments, "task": taskInfo.Name, + "controlmode": commandInfo.ControlMode.String(), }). Info("instantiating task") } else { @@ -143,11 +145,16 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { var taskCmd *exec.Cmd + ctx := context.Background() + if commandInfo.Timeout.Seconds() > 0 { // if a timeout is defined, we add a context + ctx, _ = context.WithTimeout(ctx, commandInfo.Timeout) + } + if *commandInfo.Shell { rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") - taskCmd = exec.Command("/bin/sh", []string{"-c", rawCommand}...) + taskCmd = exec.CommandContext(ctx, "/bin/sh", []string{"-c", rawCommand}...) } else { - taskCmd = exec.Command(*commandInfo.Value, commandInfo.Arguments...) + taskCmd = exec.CommandContext(ctx, *commandInfo.Value, commandInfo.Arguments...) } taskCmd.Env = append(os.Environ(), commandInfo.Env...) From 736e006cce162cd85abaf177fb016afc5ca93c30 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:21:17 +0200 Subject: [PATCH 0344/2352] [executor] Implement triggering of hook tasks --- executor/executable/hooktask.go | 3 +++ .../executorcmd/transitioner/transitioner.go | 1 + executor/handlers.go | 22 ++++++++++++++----- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go index 6c7d7747c..26b172929 100644 --- a/executor/executable/hooktask.go +++ b/executor/executable/hooktask.go @@ -46,3 +46,6 @@ func (t *HookTask) Launch() error { return t.doLaunch(t.makeTransitionFunc()) } +func (t *HookTask) Trigger() error { + return t.startBasicTask() +} \ No newline at end of file diff --git a/executor/executorcmd/transitioner/transitioner.go b/executor/executorcmd/transitioner/transitioner.go index 47119d2d5..458a8075d 100644 --- a/executor/executorcmd/transitioner/transitioner.go +++ b/executor/executorcmd/transitioner/transitioner.go @@ -53,6 +53,7 @@ func NewTransitioner(cm controlmode.ControlMode, transitionFunc DoTransitionFunc case controlmode.FAIRMQ: return NewFairMQTransitioner(transitionFunc) case controlmode.BASIC: fallthrough + case controlmode.HOOK: fallthrough case controlmode.DIRECT: fallthrough default: return NewDirectTransitioner(transitionFunc) diff --git a/executor/handlers.go b/executor/handlers.go index 25eed1745..ab4c2cf50 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -145,7 +145,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { // Asynchronous and thread-unsafe, but probably ok because a hook only fires // once per environment cycle go func() { - var cmd *controlcommands.MesosCommand_TriggerHook + var cmd = new(controlcommands.MesosCommand_TriggerHook) err = json.Unmarshal(data, cmd) if err != nil { log.WithFields(logrus.Fields{ @@ -157,8 +157,19 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { return } - response := controlcommands.NewMesosCommandResponse_TriggerHook(cmd, nil, taskId.String()) - err = activeTask.Launch() + response := controlcommands.NewMesosCommandResponse_TriggerHook(cmd, nil, taskId.Value) + hookTask, ok := activeTask.(*executable.HookTask) + if !ok { + log.WithFields(logrus.Fields{ + "name": incoming.Name, + "message": string(data[:]), + "error": "type assertion error", + }). + Warning("received TriggerHook for non-hook task") + return + } + + err = hookTask.Trigger() if err != nil { response.ErrorString = err.Error() } @@ -179,9 +190,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { log.WithFields(logrus.Fields{ "commandName": response.GetCommandName(), "commandId": response.GetCommandId(), + "taskId": response.TaskId, "error": response.Err().Error(), }). - Debug("response sent") + Trace("response sent") }() case "MesosCommand_Transition": @@ -240,7 +252,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "error": response.Err().Error(), "state": response.CurrentState, }). - Debug("response sent") + Trace("response sent") }() From dfe20c6ff2f64c272f4db4440a47dac27ba250d0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:30:15 +0200 Subject: [PATCH 0345/2352] [core] Fix timeout representation --- core/workflow/taskrole.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 424afeee7..ff479abfc 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -71,21 +71,15 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) if aux.Task.Trigger != nil && len(*aux.Task.Trigger) > 0 { // hook role.Trigger = *aux.Task.Trigger if aux.Task.Timeout != nil && len(*aux.Task.Timeout) > 0 { - role.Timeout, err = time.ParseDuration(*aux.Task.Timeout) - if err != nil { - return - } + role.Timeout = *aux.Task.Timeout } else { - role.Timeout = 30 * time.Second + role.Timeout = (30 * time.Second).String() } } else { // basic task if aux.Task.Timeout != nil && len(*aux.Task.Timeout) > 0 { - role.Timeout, err = time.ParseDuration(*aux.Task.Timeout) - if err != nil { - return - } + role.Timeout = *aux.Task.Timeout } else { - role.Timeout = 0 + role.Timeout = "0s" } } @@ -118,6 +112,8 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.STAGE3: template.Fields{ template.WrapPointer(&t.Name), template.WrapPointer(&t.LoadTaskClass), + template.WrapPointer(&t.Timeout), + template.WrapPointer(&t.Trigger), }, template.STAGE4: append( template.WrapConstraints(t.Constraints), @@ -188,6 +184,7 @@ func (t *taskRole) copy() copyable { roleBase: *t.roleBase.copy().(*roleBase), Task: nil, LoadTaskClass: t.LoadTaskClass, + Traits: t.Traits, } rCopy.status = SafeStatus{status:task.INACTIVE} rCopy.state = SafeState{state:task.STANDBY} @@ -249,7 +246,7 @@ func (t* taskRole) GetTaskTraits() task.Traits { if t == nil { return task.Traits{ Trigger: "", - Timeout: 0, + Timeout: "0s", Critical: false, } } From 6de45bdc1fcf3f0b360c9f35955bfc33db6da182 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:30:43 +0200 Subject: [PATCH 0346/2352] [core] Improve commandqueue error handling --- core/task/manager.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index e3299898d..8f01c35d9 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -504,7 +504,10 @@ func (m *Manager) TriggerHooks(tasks Tasks) error { } cmd := controlcommands.NewMesosCommand_TriggerHook(receivers) - m.cq.Enqueue(cmd, notify) + err = m.cq.Enqueue(cmd, notify) + if err != nil { + return err + } response := <- notify close(notify) From 86fcde9249c788f9b3863f1e988c53a5dada0986 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:32:18 +0200 Subject: [PATCH 0347/2352] [core] Timeout support in task.Task --- core/task/task.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index f72757285..9c4673d85 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -72,7 +72,7 @@ type parentRole interface { type Traits struct { Trigger string - Timeout time.Duration + Timeout string Critical bool } @@ -126,7 +126,7 @@ type Task struct { } func (t *Task) IsSafeToStop() bool { - if t.GetTaskClass().Control.Mode != controlmode.BASIC { + if t.GetControlMode() != controlmode.BASIC { return t.state == RUNNING } return t.state == RUNNING && t.safeToStop @@ -284,6 +284,13 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.ControlMode = t.GetControlMode() // This might change BASIC->HOOK + // If it's a HOOK, we must pass the Timeout to the TCI for + // executor-side timeout enforcement + if cmd.ControlMode == controlmode.HOOK || cmd.ControlMode == controlmode.BASIC { + traits := t.parent.GetTaskTraits() + cmd.Timeout, err = time.ParseDuration(traits.Timeout) + } + t.commandInfo = cmd } else { t.commandInfo = &common.TaskCommandInfo{} @@ -355,7 +362,7 @@ func (t *Task) GetLocalBindMap() channel.BindMap { func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { - if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task, we template the props + if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task or hook, we template the props if t.parent == nil { return } From 72562b9647e4c545fb19a69fe2cf7bee2b1331aa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:33:17 +0200 Subject: [PATCH 0348/2352] [core] Improve error output, controlmode representation, GetRoles lock --- core/server.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/server.go b/core/server.go index 92fa0e3d3..7eda0be1f 100644 --- a/core/server.go +++ b/core/server.go @@ -280,7 +280,11 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir CurrentRunNumber: env.GetCurrentRunNumber(), } - return reply, err + if err != nil { + return reply, status.Newf(codes.Aborted, err.Error()).Err() + } + + return reply, nil } func (*RpcServer) ModifyEnvironment(context.Context, *pb.ModifyEnvironmentRequest) (*pb.ModifyEnvironmentReply, error) { @@ -427,7 +431,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge ShortInfo: taskToShortTaskInfo(task), ClassInfo: &pb.TaskClassInfo{ Name: task.GetClassName(), - ControlMode: taskClass.Control.Mode.String(), + ControlMode: task.GetControlMode().String(), }, InboundChannels: inboundChannelsToPbChannels(inbound), OutboundChannels: outboundChannelsToPbChannels(outbound), @@ -473,14 +477,14 @@ func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.Shor func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb.GetRolesReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() if req == nil || len(req.EnvId) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } + m.state.RLock() env, err := m.state.environments.Environment(uuid.Parse(req.EnvId)) + m.state.RUnlock() if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } From bfb3c7e1481ab21c046c4978b6753698aa6d05a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:35:06 +0200 Subject: [PATCH 0349/2352] [core] Handle hooks in scheduler --- core/scheduler.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index c80e80835..c64f64ac7 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -425,7 +425,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { // If the task hasn't already been killed // AND it's not a hook - if btt.VoluntaryTermination && !isHook { + if !isHook { goto doFallthrough } } @@ -683,7 +683,8 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // Append control port to arguments // For the control port parameter and/or environment variable, see occ/OccGlobals.h - if cmd.ControlMode != controlmode.BASIC { + if cmd.ControlMode != controlmode.BASIC && + cmd.ControlMode != controlmode.HOOK { cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) cmd.ControlPort = controlPort cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) From 2b782dffdcca95669b44d2a47086fb506f010676 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Aug 2020 16:36:13 +0200 Subject: [PATCH 0350/2352] [core] Hook timeout support and hook handling fixes in environment --- core/environment/environment.go | 58 ++++++++++++++++++++++++--------- 1 file changed, 43 insertions(+), 15 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index a88699139..a634709f3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,6 +29,8 @@ package environment import ( "errors" "fmt" + "sort" + "strings" "sync" "time" @@ -107,15 +109,26 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { - env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) - - env.handlerFunc()(e) + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) + if errHooks != nil { + e.Cancel(errHooks) + } }, "leave_state": func(e *fsm.Event) { - env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) + if errHooks != nil { + e.Cancel(errHooks) + return + } + + env.handlerFunc()(e) }, "enter_state": func(e *fsm.Event) { - env.handleHooks(env.Workflow(), fmt.Sprintf("enter_%s", e.Dst)) + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("enter_%s", e.Dst)) + if errHooks != nil { + e.Cancel(errHooks) + return + } log.WithFields(logrus.Fields{ "event": e.Event, @@ -125,7 +138,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }).Debug("environment.sm entering state") }, "after_event": func(e *fsm.Event) { - env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) + if errHooks != nil { + e.Cancel(errHooks) + } }, }, ) @@ -147,7 +163,8 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err hookTimers := make(map[*task.Task]*time.Timer) for _, hook := range hooksToTrigger { - hookTimers[hook] = time.AfterFunc(hook.GetTraits().Timeout, + timeout, _ := time.ParseDuration(hook.GetTraits().Timeout) + hookTimers[hook] = time.AfterFunc(timeout, func() { thisHook := hook timeoutCh <- thisHook @@ -155,7 +172,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err } successfulHooks := make(task.Tasks, 0) - failedHooks := make(task.Tasks, 0) + failedHooksById := make(map[string]*task.Task) for { select { @@ -163,7 +180,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err switch evt := e.(type) { case *event.BasicTaskTerminated: tid := evt.GetOrigin().TaskId - thisHook := hooksToTrigger.GetByTaskId(tid.String()) + thisHook := hooksToTrigger.GetByTaskId(tid.Value) if thisHook == nil { continue } @@ -171,7 +188,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err hookTimers[thisHook].Stop() delete(hookTimers, thisHook) if evt.ExitCode != 0 || !evt.VoluntaryTermination { - failedHooks = append(failedHooks, thisHook) + failedHooksById[thisHook.GetTaskId()] = thisHook log.WithField("task", thisHook.GetName()). WithFields(logrus.Fields{ "exitCode": evt.ExitCode, @@ -191,7 +208,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err case thisHook := <- timeoutCh: log.WithField("task", thisHook.GetName()).Warn("hook response timed out") delete(hookTimers, thisHook) - failedHooks = append(failedHooks, thisHook) + failedHooksById[thisHook.GetTaskId()] = thisHook } if len(hookTimers) == 0 { @@ -205,13 +222,19 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err } // We only report non-nil error if at least one CRITICAL HOOK failed - hookCounter := 0 - for _, thisHook := range failedHooks { + failedCriticalHookNames := make([]string, 0) + for _, thisHook := range failedHooksById { if thisHook.GetTraits().Critical { - hookCounter++ - err = fmt.Errorf("%d hooks failed", hookCounter) + failedCriticalHookNames = append(failedCriticalHookNames, thisHook.GetParentRolePath()) } } + sort.Strings(failedCriticalHookNames) + + if len(failedCriticalHookNames) > 0 { + err = fmt.Errorf("%d critical hooks failed: %s", + len(failedCriticalHookNames), + strings.Join(failedCriticalHookNames, ", ")) + } return } @@ -230,6 +253,9 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { return nil } return func(e *fsm.Event) { + if e.Err != nil { // If the event was already cancelled + return + } log.WithFields(logrus.Fields{ "event": e.Event, "src": e.Src, @@ -302,6 +328,8 @@ func (env *Environment) Workflow() workflow.Role { } func (env *Environment) QueryRoles(pathSpec string) (rs []workflow.Role) { + env.Mu.RLock() + defer env.Mu.RUnlock() g := glob.MustCompile(pathSpec, workflow.PATH_SEPARATOR_RUNE) rs = env.workflow.GlobFilter(g) return From 053ba105dbf179614381b57116e6ec9b54b42bfc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Aug 2020 09:12:22 +0200 Subject: [PATCH 0351/2352] [core] Minor whitespace fixes --- core/task/task.go | 2 +- core/workflow/aggregator.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 9c4673d85..bf2e07eec 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -58,7 +58,7 @@ type parentRole interface { UpdateState(State) GetPath() string GetTaskClass() string - GetTaskTraits() Traits + GetTaskTraits() Traits SetTask(*Task) GetEnvironmentId() uuid.Array CollectOutboundChannels() []channel.Outbound diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 3e7d394cf..8967db85a 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -132,7 +132,7 @@ func (r *aggregator) GetTasks() (tasks task.Tasks) { return } -func (r * aggregator) GetHooksForTrigger(trigger string) (tasks task.Tasks) { +func (r *aggregator) GetHooksForTrigger(trigger string) (tasks task.Tasks) { if r == nil { return nil } From 8009437d76c1187c00ba6f1d469a71c8378a8915 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Aug 2020 11:23:05 +0200 Subject: [PATCH 0352/2352] [coconut] Support for --nospinner flag OCTRL-222 #close --- coconut/cmd/root.go | 3 +++ coconut/control/control.go | 14 ++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/coconut/cmd/root.go b/coconut/cmd/root.go index 94ce87512..76ad02042 100644 --- a/coconut/cmd/root.go +++ b/coconut/cmd/root.go @@ -82,10 +82,12 @@ func init() { rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:47102", product.PRETTY_SHORTNAME + " core endpoint as HOST:PORT") rootCmd.PersistentFlags().String("config_endpoint", "consul://127.0.0.1:8500", "configuration endpoint used by AliECS core as PROTO://HOST:PORT") rootCmd.PersistentFlags().BoolP("verbose", "v", false, "show verbose output for debug purposes") + rootCmd.PersistentFlags().Bool("nospinner", false, "disable animations in output") viper.BindPFlag("endpoint", rootCmd.PersistentFlags().Lookup("endpoint")) viper.BindPFlag("config_endpoint", rootCmd.PersistentFlags().Lookup("config_endpoint")) viper.BindPFlag("verbose", rootCmd.PersistentFlags().Lookup("verbose")) + viper.BindPFlag("nospinner", rootCmd.PersistentFlags().Lookup("nospinner")) // Cobra also supports local flags, which will only run // when this action is called directly. @@ -98,6 +100,7 @@ func initConfig() { viper.SetDefault("endpoint", "127.0.0.1:47102") viper.SetDefault("config_endpoint", "127.0.0.1:8500") viper.SetDefault("verbose", false) + viper.SetDefault("nospinner", false) if cfgFile != "" { // Use config file from the flag. diff --git a/coconut/control/control.go b/coconut/control/control.go index b6ee4a3ad..5e1789333 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -74,9 +74,11 @@ func WrapCall(call ControlCall) RunFunc { Debug("initializing gRPC client") s := spinner.New(spinner.CharSets[11], SPINNER_TICK) - _ = s.Color("yellow") - s.Suffix = " working..." - s.Start() + if !viper.GetBool("nospinner") { + _ = s.Color("yellow") + s.Suffix = " working..." + s.Start() + } cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) rpc := coconut.NewClient(cxt, cancel, endpoint) @@ -88,7 +90,11 @@ func WrapCall(call ControlCall) RunFunc { os.Stdout,_ = os.Open(os.DevNull) err := call(cxt, rpc, cmd, args, &out) os.Stdout = stdout - s.Stop() + + if !viper.GetBool("nospinner") { + s.Stop() + } + fmt.Print(out.String()) if err != nil { From 1211cd62ffcfb551bbeb10c959431fe7742bfa08 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Aug 2020 18:15:28 +0200 Subject: [PATCH 0353/2352] [core] Add support for enabling/disabling roles at deployment time --- core/workflow/aggregatorrole.go | 18 +++++++++++++++++- core/workflow/iteratorrole.go | 19 +++++++++++++++++++ core/workflow/role.go | 1 + core/workflow/rolebase.go | 10 ++++++++++ core/workflow/taskrole.go | 6 +++++- 5 files changed, 52 insertions(+), 2 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index f28640536..0a2678b8a 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "strings" texttemplate "text/template" "github.com/AliceO2Group/Control/core/repos" @@ -91,9 +92,10 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) template.STAGE3: template.Fields{ template.WrapPointer(&r.Name), }, - template.STAGE4: append( + template.STAGE4: append(append( template.WrapConstraints(r.Constraints), r.wrapConnectFields()...), + template.WrapPointer(&r.Enabled)), } // TODO: push cached templates here @@ -116,6 +118,9 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) r.Vars.Set(k, v) } + r.Enabled = strings.TrimSpace(r.Enabled) + + // Process templates for child roles for _, role := range r.Roles { role.setParent(r) err = role.ProcessTemplates(workflowRepo) @@ -123,6 +128,17 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) return } } + + // If any child is not Enabled after template resolution, + // we filter it out of existence + enabledRoles := make([]Role, 0) + for _, role := range r.Roles { + if role.IsEnabled() { + enabledRoles = append(enabledRoles, role) + } + } + r.Roles = enabledRoles + return } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index e55fb748e..c7da68db8 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -139,12 +139,24 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { return } + // Process templates for child roles for _, role := range i.Roles { err = role.ProcessTemplates(workflowRepo) if err != nil { return } } + + // If any child is not Enabled after template resolution, + // we filter it out of existence + enabledRoles := make([]Role, 0) + for _, role := range i.Roles { + if role.IsEnabled() { + enabledRoles = append(enabledRoles, role) + } + } + i.Roles = enabledRoles + return } @@ -220,6 +232,13 @@ func (i *iteratorRole) GetState() task.State { panic("implement me") } +func (i *iteratorRole) IsEnabled() bool { + if i == nil || i.template == nil { + return false + } + return i.template.IsEnabled() +} + func (i *iteratorRole) setParent(role Updatable) { i.template.setParent(role) for _, v := range i.Roles { diff --git a/core/workflow/role.go b/core/workflow/role.go index 194ac70e0..d92ca80c7 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -58,6 +58,7 @@ type Role interface { SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) GetHooksForTrigger(trigger string) task.Tasks + IsEnabled() bool } type Updatable interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 2e19f9218..d2e60ac62 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -26,6 +26,7 @@ package workflow import ( "fmt" + "strings" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" @@ -59,6 +60,13 @@ type roleBase struct { UserVars *gera.StringWrapMap `yaml:"-"` Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role Bind []channel.Inbound `yaml:"bind,omitempty"` + Enabled string `yaml:"enabled,omitempty"` +} + +func (r *roleBase) IsEnabled() bool { + // Only valid after ProcessTemplates + trimmed := strings.ToLower(strings.TrimSpace(r.Enabled)) + return trimmed == "true" || trimmed == "1" } func (r *roleBase) SetRuntimeVar(key string, value string) { @@ -171,6 +179,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) Locals: make(map[string]string), status: SafeStatus{status:task.INACTIVE}, state: SafeState{state:task.STANDBY}, + Enabled: "true", } err = unmarshal(&role) if err == nil { @@ -208,6 +217,7 @@ func (r *roleBase) copy() copyable { status: r.status, state: r.state, Bind: make([]channel.Inbound, len(r.Bind)), + Enabled: r.Enabled, } copied := copy(rCopy.Connect, r.Connect) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index ff479abfc..63fa8e34b 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "strings" texttemplate "text/template" "time" @@ -115,9 +116,10 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.Timeout), template.WrapPointer(&t.Trigger), }, - template.STAGE4: append( + template.STAGE4: append(append( template.WrapConstraints(t.Constraints), t.wrapConnectFields()...), + template.WrapPointer(&t.Enabled)), } // FIXME: push cached templates here @@ -140,6 +142,8 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { t.Vars.Set(k, v) } + t.Enabled = strings.TrimSpace(t.Enabled) + t.resolveTaskClassIdentifier(workflowRepo) return From 07a7060f7d56507cf53bced0d67956a07e1fdc0d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Aug 2020 17:10:05 +0200 Subject: [PATCH 0354/2352] [core] Make iteratorRange/iteratorRole copyable --- core/workflow/iteratorrange.go | 18 ++++++++++++++++++ core/workflow/iteratorrole.go | 9 +++++++++ 2 files changed, 27 insertions(+) diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index d54248c46..f09ad94cc 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -33,6 +33,7 @@ import ( ) type iteratorRange interface { + copyable GetRange(varStack map[string]string) (ran []string, err error) GetVar() string } @@ -42,6 +43,14 @@ type iteratorRangeExpr struct { Var string `yaml:"var"` } +func (f *iteratorRangeExpr) copy() copyable { + itrCopy := iteratorRangeExpr{ + Range: f.Range, + Var: f.Var, + } + return &itrCopy +} + func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, err error) { rangeObj := make([]string, 0) @@ -69,6 +78,15 @@ type iteratorRangeFor struct { Var string `yaml:"var"` } +func (f *iteratorRangeFor) copy() copyable { + itrCopy := iteratorRangeFor{ + Begin: f.Begin, + End: f.End, + Var: f.Var, + } + return &itrCopy +} + func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, err error) { ran = make([]string, 0) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index c7da68db8..2e8731e75 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -196,6 +196,15 @@ func (i *iteratorRole) expandTemplate() (err error) { return } +func (i *iteratorRole) copy() copyable { + iCopy := iteratorRole{ + aggregator: *i.aggregator.copy().(*aggregator), + For: i.For.copy().(iteratorRange), + template: i.template, // no copy because the template stays the same + } + return &iCopy +} + func (i *iteratorRole) GetParent() Updatable { if i == nil || i.template == nil { return nil From 7d98d16ddc2c17a8f819a448d9edd80798fcd999 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Aug 2020 18:17:54 +0200 Subject: [PATCH 0355/2352] [build] Bump to v0.16.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3cd3e924d..1abae9a30 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 15 +VERSION_MINOR := 16 VERSION_PATCH := 0 From 73eebe3f3a19f2231afa804d6be7f4c0c5c9d7f5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Aug 2020 17:16:29 +0200 Subject: [PATCH 0356/2352] Create mkdocs.yml --- mkdocs.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 mkdocs.yml diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 000000000..b493950cb --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,5 @@ +site_name: AliECS Handbook + +nav: + - Reference: "reference.md" + - Changelog: "changelog.md" From 9f63725771905cd0b79e08a691971d3a08f087fc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 14:38:54 +0200 Subject: [PATCH 0357/2352] [misc] Mkdocs stub --- docs/changelog.md | 1 + docs/reference.md | 1 + mkdocs.yml | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) create mode 100644 docs/changelog.md create mode 100644 docs/reference.md diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 000000000..825c32f0d --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1 @@ +# Changelog diff --git a/docs/reference.md b/docs/reference.md new file mode 100644 index 000000000..cf5aa0741 --- /dev/null +++ b/docs/reference.md @@ -0,0 +1 @@ +# Reference diff --git a/mkdocs.yml b/mkdocs.yml index b493950cb..b41b15263 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: AliECS Handbook +site_name: aliecs nav: - Reference: "reference.md" From cf89f1e7da9d0f261cbcf0e2500f47ec86e6c350 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 16:17:47 +0200 Subject: [PATCH 0358/2352] [misc] Rebuild coconut documentation --- coconut/doc/coconut.md | 3 ++- coconut/doc/coconut_about.md | 3 ++- coconut/doc/coconut_configuration.md | 3 ++- coconut/doc/coconut_configuration_dump.md | 3 ++- coconut/doc/coconut_configuration_history.md | 3 ++- coconut/doc/coconut_configuration_import.md | 3 ++- coconut/doc/coconut_configuration_list.md | 3 ++- coconut/doc/coconut_configuration_show.md | 3 ++- coconut/doc/coconut_environment.md | 3 ++- coconut/doc/coconut_environment_control.md | 3 ++- coconut/doc/coconut_environment_create.md | 3 ++- coconut/doc/coconut_environment_destroy.md | 3 ++- coconut/doc/coconut_environment_list.md | 3 ++- coconut/doc/coconut_environment_show.md | 3 ++- coconut/doc/coconut_info.md | 3 ++- coconut/doc/coconut_repository.md | 3 ++- coconut/doc/coconut_repository_add.md | 3 ++- coconut/doc/coconut_repository_default-revision.md | 3 ++- coconut/doc/coconut_repository_default.md | 3 ++- coconut/doc/coconut_repository_list.md | 3 ++- coconut/doc/coconut_repository_refresh.md | 3 ++- coconut/doc/coconut_repository_remove.md | 3 ++- coconut/doc/coconut_role.md | 3 ++- coconut/doc/coconut_role_query.md | 3 ++- coconut/doc/coconut_task.md | 3 ++- coconut/doc/coconut_task_clean.md | 3 ++- coconut/doc/coconut_task_list.md | 3 ++- coconut/doc/coconut_template.md | 3 ++- coconut/doc/coconut_template_list.md | 3 ++- 29 files changed, 58 insertions(+), 29 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 5a37588ab..d3eb92354 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -16,6 +16,7 @@ For more information on the available commands, see the individual documentation --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") -h, --help help for coconut + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +31,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 9b36c2a0b..cec3ceebb 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -22,6 +22,7 @@ coconut about [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 75f4e674f..c91d3ae4e 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -19,6 +19,7 @@ configuration store. --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +32,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 5603eb40c..9e7b5f484 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -25,6 +25,7 @@ coconut configuration dump [key] [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +33,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index 08c423f6f..785617bf7 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -32,6 +32,7 @@ coconut conf history / --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -39,4 +40,4 @@ coconut conf history / * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index 79d5c1237..f630fe6e7 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -41,6 +41,7 @@ coconut conf import --no-versioning --new-compon --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -48,4 +49,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 0e28babb0..aec40242e 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -33,6 +33,7 @@ coconut conf list -t --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -40,4 +41,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 9e25a22f9..63d2623dd 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -35,6 +35,7 @@ coconut conf show /@ --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -42,4 +43,4 @@ coconut conf show /@ * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 2d7dd47d9..9ce7102bb 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -39,6 +39,7 @@ For more information on the behavior of coconut environments, see the subcommand --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -51,4 +52,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 1fc750dcb..02bec5425 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -32,6 +32,7 @@ coconut environment control [environment id] [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -39,4 +40,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index b2d8f9cb5..77b0f5221 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -38,6 +38,7 @@ coconut environment create [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -45,4 +46,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 237a37967..24f1091f4 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -29,6 +29,7 @@ coconut environment destroy [environment id] [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -36,4 +37,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 3f63c3c7b..aa544c753 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -23,6 +23,7 @@ coconut environment list [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +31,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 5356278ff..2f33237c4 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -25,6 +25,7 @@ coconut environment show [environment id] [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +33,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index 8c6b2407b..b42f26b77 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -23,6 +23,7 @@ coconut info [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +31,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index b72a45d02..723082086 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -43,6 +43,7 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -56,4 +57,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 4fc8df26f..658974ccc 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -29,6 +29,7 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -36,4 +37,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index ee697c4a9..1c4f31ecd 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -29,6 +29,7 @@ coconut repository default-revision [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -36,4 +37,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 64b455e7a..faa219ac6 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -22,6 +22,7 @@ coconut repository default [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 454ff8ec4..86d3360d8 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -22,6 +22,7 @@ coconut repository list [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 31cf5901c..6d1747279 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -22,6 +22,7 @@ coconut repository refresh [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 2b292dadb..c8860b937 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -22,6 +22,7 @@ coconut repository remove [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 10890a11a..488c2c2c8 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -19,6 +19,7 @@ display information on active roles. --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -27,4 +28,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index ed0c0bd41..5af5bcfa6 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -22,6 +22,7 @@ coconut role query [environment id] [query path] [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +30,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 5e70b6166..983e99af8 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -19,6 +19,7 @@ manage active tasks. --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -28,4 +29,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 1d1024226..bcb3dd96f 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -24,6 +24,7 @@ coconut task clean [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +32,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 586920294..f2895392a 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -23,6 +23,7 @@ coconut task list [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +31,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 967d43b61..588ba8a09 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -19,6 +19,7 @@ display information on available workflow templates. --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -27,4 +28,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 2383477ec..195bcbddb 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -45,6 +45,7 @@ coconut template list [flags] --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -52,4 +53,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 29-Jun-2020 +###### Auto generated by spf13/cobra on 28-Aug-2020 From c2dad0102ce16699ae86e358e5a72cfd639461bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 16:18:43 +0200 Subject: [PATCH 0359/2352] [build] Minor make doc/docs improvement --- Makefile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 263608f71..7bccb7f0d 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ GO_GET_U1 := $(addprefix github.com/gogo/protobuf/, proto protoc-gen-gofast prot GO_GET_U2 := $(addprefix github.com/golang/protobuf/, proto protoc-gen-go) GO_GET_U2 += google.golang.org/grpc -.PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor +.PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs build: $(WHAT) @@ -148,6 +148,8 @@ tools/protoc: go get -u $(GO_GET_U1) go get -u $(GO_GET_U2) +docs: doc + doc: @echo -e "generating coconut documentation \e[1;33m==>\e[0m \e[1;34m./coconut/doc\e[0m" @cd coconut/doc && go run . From 88c1df4ebba6388098d1021e6e83f548af9f72fa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 16:19:21 +0200 Subject: [PATCH 0360/2352] [misc] Split peanut docs from OCC --- docs/changelog.md | 1 - occ/README.md | 37 +------------------------------ occ/peanut/README.md | 42 ++++++++++++++++++++++++++++++++++++ occ/{ => peanut}/peanut.png | Bin 4 files changed, 43 insertions(+), 37 deletions(-) delete mode 100644 docs/changelog.md create mode 100644 occ/peanut/README.md rename occ/{ => peanut}/peanut.png (100%) diff --git a/docs/changelog.md b/docs/changelog.md deleted file mode 100644 index 825c32f0d..000000000 --- a/docs/changelog.md +++ /dev/null @@ -1 +0,0 @@ -# Changelog diff --git a/occ/README.md b/occ/README.md index bc5c7e05e..9e9c19846 100644 --- a/occ/README.md +++ b/occ/README.md @@ -38,42 +38,7 @@ Note: a PAUSED state with events PAUSE/RESUME is foreseen but not used yet. ## Single process control with `peanut` -`peanut` is the Process Execution And coNtrol UTility for OCClib-based O² processes. Its purpose -is to be a debugging and development aid for non-FairMQ O² devices, where FairMQ's interactive -controller is not available. - -In aliBuild it is part of the `coconut` package. - -`peanut` can connect to a running OCClib-based process, query its status, drive its state machine -and push runtime configuration data. - -Peanut is an interactive tool, the only information it picks up from its environment is the -`OCC_CONTROL_PORT` variable, which is used to connect to a running OCClib-based process. - -```bash -$ OCC_CONTROL_PORT= peanut -``` - -![Screenshot of peanut](peanut.png) - -Peanut commands are documented inline. Each transition is applied immediately and -the state is updated in real time. - -Compared to the raw gRPC API, the following limitations apply: -* It is not possible to perform a `GO_ERROR` transition, as this transition is only triggered from -user code. -* The `CONFIGURE` transition may be triggered both with and without runtime configuration data, which -may or may not be suitable depending on user code. All other transitions send no payload. - -The last two commands are **not** transitions: -* `Load configuration` allows the user to read in a JSON or YAML file containing sample -configuration data that is then available to be pushed to the controlled process during a future -`CONFIGURE` transition. On startup, there is no file loaded, so a `CONFIGURE` transition will push -an empty payload. Once a runtime configuration file is loaded, its title bar reports `NOT PUSHED` -until the next `CONFIGURE` transition, at which point it becomes `PUSHED`. -* `Quit` disconnects from the controlled process and quits `peanut`, but it performs no transitions -or other data exchange with the controlled process. A future instance of `peanut` may reattach itself -to the same process and continue from there. +See [`peanut` Overview](peanut/README.md). ## OCC API debugging with `grpcc` diff --git a/occ/peanut/README.md b/occ/peanut/README.md new file mode 100644 index 000000000..b6d488e3f --- /dev/null +++ b/occ/peanut/README.md @@ -0,0 +1,42 @@ +# `peanut` + +`peanut` is the **p**rocess **e**xecution **a**nd co**n**trol **ut**ility for OCClib-based O² processes. Its purpose +is to be a debugging and development aid for non-FairMQ O² devices, where FairMQ's interactive +controller is not available. + +In aliBuild it is part of the `coconut` package. + +`peanut` can connect to a running OCClib-based process, query its status, drive its state machine +and push runtime configuration data. + +`peanut` is an interactive tool, the only information it picks up from its environment is the +`OCC_CONTROL_PORT` variable, which is used to connect to a running OCClib-based process. + +```bash +$ OCC_CONTROL_PORT= peanut +``` + +![Screenshot of peanut](peanut.png) + +`peanut` commands are documented inline. Each transition is applied immediately and +the state is updated in real time. + +Compared to the raw gRPC API, the following limitations apply: + +* It is not possible to perform a `GO_ERROR` transition, as this transition is only triggered from +user code. + +* The `CONFIGURE` transition may be triggered both with and without runtime configuration data, which +may or may not be suitable depending on user code. All other transitions send no payload. + +The last two commands are **not** transitions: + +* `Load configuration` allows the user to read in a JSON or YAML file containing sample +configuration data that is then available to be pushed to the controlled process during a future +`CONFIGURE` transition. On startup, there is no file loaded, so a `CONFIGURE` transition will push +an empty payload. Once a runtime configuration file is loaded, its title bar reports `NOT PUSHED` +until the next `CONFIGURE` transition, at which point it becomes `PUSHED`. + +* `Quit` disconnects from the controlled process and quits `peanut`, but it performs no transitions +or other data exchange with the controlled process. A future instance of `peanut` may reattach itself +to the same process and continue from there. diff --git a/occ/peanut.png b/occ/peanut/peanut.png similarity index 100% rename from occ/peanut.png rename to occ/peanut/peanut.png From 40c5f474430578970515817784d05d4bf34c09bc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 16:19:47 +0200 Subject: [PATCH 0361/2352] [misc] Update documentation TOC --- mkdocs.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index b41b15263..78f12e8b9 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,5 +1,19 @@ site_name: aliecs nav: + - Index: ./docs/ - Reference: "reference.md" - - Changelog: "changelog.md" + - 'Command Reference': + - coconut: + - Overview: './coconut/doc/coconut.md' + - coconut about: './coconut/doc/coconut_about.md' + - coconut configuration: './coconut/doc/coconut_configuration.md' + - coconut environment: './coconut/doc/coconut_environment.md' + - coconut info: './coconut/doc/coconut_info.md' + - coconut repository: './coconut/doc/coconut_repository.md' + - coconut role: './coconut/doc/coconut_role.md' + - coconut task: './coconut/doc/coconut_task.md' + - coconut template: './coconut/doc/coconut_template.md' + - peanut: './occ/peanut/README.md' + + - Changelog: https://github.com/AliceO2Group/Control/releases From 344db4b30bb72f4c5eeec72fc5bafc23963306b0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Aug 2020 13:14:57 +0200 Subject: [PATCH 0362/2352] [executor] Ensure we always have a PID we can use to kill a task --- executor/executable/controllabletask.go | 207 +++++++++++++----------- executor/executorcmd/client.go | 2 +- 2 files changed, 118 insertions(+), 91 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index bf700115c..8e382f765 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "io" + "reflect" "strings" "syscall" "time" @@ -40,6 +41,8 @@ import ( mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) const( @@ -51,6 +54,7 @@ type ControllableTask struct { taskBase rpc *executorcmd.RpcClient pendingFinalTaskStateCh chan mesos.TaskState + knownPid int } type CommitResponse struct { @@ -152,7 +156,6 @@ func (t *ControllableTask) Launch() error { } t.rpc.TaskCmd = taskCmd - var pid int32 elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ @@ -179,10 +182,10 @@ func (t *ControllableTask) Launch() error { "command": tciCommandStr, }). Debug("task status queried") + t.knownPid = int(response.GetPid()) } // NOTE: we acquire the transitioner-dependent STANDBY equivalent state reachedState := t.rpc.FromDeviceState(response.GetState()) - pid = response.GetPid() if reachedState == "STANDBY" && err == nil { log.WithField("id", t.ti.TaskID.Value). @@ -192,7 +195,7 @@ func (t *ControllableTask) Launch() error { break } else if reachedState == "DONE" || reachedState == "ERROR" { // something went wrong, the device moved to DONE or ERROR on startup - _ = syscall.Kill(int(response.GetPid()), syscall.SIGKILL) + _ = syscall.Kill(t.knownPid, syscall.SIGKILL) log.WithField("task", t.ti.Name).Debug("task killed") t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") @@ -229,7 +232,7 @@ func (t *ControllableTask) Launch() error { // send RUNNING t.sendStatus(mesos.TASK_RUNNING, "") - taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),pid) + taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.knownPid)) jsonEvent, err := json.Marshal(taskMessage) if err != nil { log.WithError(err).Warning("error marshaling message from task") @@ -256,7 +259,12 @@ func (t *ControllableTask) Launch() error { break } if err != nil { - log.WithError(err).Warning("error receiving event from task") + log.WithError(err). + WithField("errorType", reflect.TypeOf(err)). + Warning("error receiving event from task") + if status.Code(err) == codes.Unavailable { + break + } continue } ev := esr.GetEvent() @@ -348,99 +356,121 @@ func (t *ControllableTask) Transition(cmd *executorcmd.ExecutorCommand_Transitio } func (t *ControllableTask) Kill() error { + var( + pid = 0 + reachedState = "UNKNOWN" // FIXME: should be LAUNCHING or similar + ) response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Error("cannot query task status") - } else { + if err == nil { // we successfully got the state from the task log.WithField("nativeState", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried for upcoming soft kill") - } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - reachedState := t.rpc.FromDeviceState(response.GetState()) - - nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { - log.WithField("currentState", currentState). - Debug("nextTransition(currentState) BEGIN") - var evt, destination string - switch currentState { - case "RUNNING": - evt = "STOP" - destination = "CONFIGURED" - case "CONFIGURED": - evt = "RESET" - destination = "STANDBY" - case "ERROR": - evt = "RECOVER" - destination = "STANDBY" - case "STANDBY": - evt = "EXIT" - destination = "DONE" - } - log.WithField("evt", evt). - WithField("dst", destination). - Debug("nextTransition(currentState) BEGIN") - - exc = executorcmd.NewLocalExecutorCommand_Transition( - t.rpc.Transitioner, - []controlcommands.MesosCommandTarget{ - { - AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a - ExecutorId: mesos.ExecutorID{}, // local transition - TaskId: t.ti.GetTaskID(), + // NOTE: we acquire the transitioner-dependent STANDBY equivalent state + reachedState = t.rpc.FromDeviceState(response.GetState()) + + nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { + log.WithField("currentState", currentState). + Debug("nextTransition(currentState) BEGIN") + var evt, destination string + switch currentState { + case "RUNNING": + evt = "STOP" + destination = "CONFIGURED" + case "CONFIGURED": + evt = "RESET" + destination = "STANDBY" + case "ERROR": + evt = "RECOVER" + destination = "STANDBY" + case "STANDBY": + evt = "EXIT" + destination = "DONE" + } + log.WithField("evt", evt). + WithField("dst", destination). + Debug("nextTransition(currentState) BEGIN") + + exc = executorcmd.NewLocalExecutorCommand_Transition( + t.rpc.Transitioner, + []controlcommands.MesosCommandTarget{ + { + AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a + ExecutorId: mesos.ExecutorID{}, // local transition + TaskId: t.ti.GetTaskID(), + }, }, - }, - reachedState, - evt, - destination, - nil, - ) - return - } + reachedState, + evt, + destination, + nil, + ) + return + } - for reachedState != "DONE" && - reachedState != "ERROR" { - cmd := nextTransition(reachedState) - log.WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - }). - Debug("state DONE not reached, about to commit transition") + for reachedState != "DONE" && + reachedState != "ERROR" { + cmd := nextTransition(reachedState) + log.WithFields(logrus.Fields{ + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + }). + Debug("state DONE not reached, about to commit transition") + + // Call cmd.Commit() asynchronous + commitDone := make(chan *CommitResponse) + go func() { + var cr CommitResponse + cr.newState, cr.transitionError = cmd.Commit() + commitDone <- &cr + }() + + // Set timeout cause OCC is locking up so killing is not possible. + var commitResponse *CommitResponse + select { + case commitResponse = <-commitDone: + case <-time.After(15 * time.Second): + log.Error("deadline exceeded") + } + // timeout we should break + if commitResponse == nil { + break + } - // Call cmd.Commit() asynchronous - commitDone := make(chan *CommitResponse) - go func() { - var cr CommitResponse - cr.newState, cr.transitionError = cmd.Commit() - commitDone <- &cr - }() - - // Set timeout cause OCC is locking up so killing is not possible. - var commitResponse *CommitResponse - select { - case commitResponse = <- commitDone: - case <-time.After(15 * time.Second): - log.Error("deadline exceeded") - } - // timeout we should break - if commitResponse == nil { - break + log.WithField("newState", commitResponse.newState). + WithError(commitResponse.transitionError). + Debug("transition committed") + if commitResponse.transitionError != nil || len(cmd.Event) == 0 { + log.WithError(commitResponse.transitionError).Error("cannot gracefully end task") + break + } + reachedState = commitResponse.newState } - log.WithField("newState", commitResponse.newState). - WithError(commitResponse.transitionError). - Debug("transition committed") - if commitResponse.transitionError != nil || len(cmd.Event) == 0 { - log.WithError(commitResponse.transitionError).Error("cannot gracefully end task") - break + log.Debug("end transition loop done") + pid = int(response.GetPid()) + if pid == 0 { + // t.knownPid must be valid because GetState was sure to have been successful in the past + pid = t.knownPid + } + } else { + log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Warn("cannot query task status for graceful process termination") + pid = t.knownPid + if pid == 0 { + // The pid was never known through a successful `GetState` in the lifetime + // of this process, so we must rely on the PGID of the containing shell + pid = -t.rpc.TaskCmd.Process.Pid + // When killing the containing shell we must use syscall.Kill with a negative PID, in order to kill all + // children which were assigned the same PGID at launch. + + // Otherwise, when we kill the child process directly, it should also + // terminate the shell that is wrapping the command, so we avoid using + // negative PID is all other cases in order to allow FairMQ cleanup to + // run. + log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Warn("task PID not known from task, using containing shell PGID") } - reachedState = commitResponse.newState } - log.Debug("end transition loop done") - - pid := int(response.GetPid()) _ = t.rpc.Close() t.rpc = nil @@ -453,9 +483,6 @@ func (t *ControllableTask) Kill() error { } killErrCh := make(chan error) - // When killing we must always use syscall.Kill with a negative PID, in order to kill all - // children which were assigned the same PGID at launch. Since we kill the child process, - // it should also terminate the shell that is wrapping the command, we avoid using negative PID go func() { err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index bd2b87f13..9195fdd82 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -140,8 +140,8 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er // We must process the error explicitly here, otherwise we get an error because gRPC's // Status is different from what gogoproto expects. status, ok := status.FromError(err) - log.Debug("got status from error") if ok { + log.Debug("got status from error") log.WithFields(logrus.Fields{ "code": status.Code().String(), "message": status.Message(), From 8d830268b1c5f983b259e869f48d0f52dc3bcbef Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:07:52 +0200 Subject: [PATCH 0363/2352] [misc] Update deployment instructions --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 46933c4d6..c1ec8c99b 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ The ALICE Experiment Control System What is your use case? -* I want to run AliECS (and other O²/FLP software) on a **single machine** +* I want to **run AliECS** and other O²/FLP software - :arrow_right: [Single node O²/FLP software deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/ansible/docs/O2_INSTALL_FLP_STANDALONE.md) + :arrow_right: [O²/FLP Suite deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/utils/o2-flp-setup/README.md) -* I want to run AliECS (and other O²/FLP software) in a **multi-node setup** + These instructions apply to both single-node and multi-node deployments. - :arrow_right: [Multi node O²/FLP software deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/utils/o2-flp-setup/README.md) (**BETA**) - or contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. + Contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. * I want to ensure AliECS can **run and control my process** From e2171108fcab6e023a7bdb9ed0d25a02101fcd83 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:16:30 +0200 Subject: [PATCH 0364/2352] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c1ec8c99b..81c52ec16 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ What is your use case? * I want to **run AliECS** and other O²/FLP software - :arrow_right: [O²/FLP Suite deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/utils/o2-flp-setup/README.md) + :arrow_right: [O²/FLP Suite deployment instructions](https://alice-flp-suite.docs.cern.ch/installation/) These instructions apply to both single-node and multi-node deployments. @@ -48,4 +48,4 @@ There are two ways of interacting with AliECS: :arrow_right: [Using `coconut`](coconut/README.md) - :arrow_right: [`coconut` command reference](coconut/doc/coconut.md) + :arrow_right: [`coconut` command reference](https://alice-flp-suite.docs.cern.ch/aliecs/coconut/doc/coconut/) From c11ff0e653d830c433d5db4a54a0d8f7cab1946a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:34:19 +0200 Subject: [PATCH 0365/2352] [misc] Fix coconut env create documentation --- coconut/cmd/environment_create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index c6ce2044c..858d53648 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -48,7 +48,7 @@ Workflows and tasks are managed with a git based configuration system, so the wo Examples: * ` + "`coconut env create -w myworkflow`" + ` - loads workflow ` + "`myworkflow`" + ` from default configuration repository at HEAD of master branch * ` + "`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow`" + ` - loads a workflow from a specific git repository, HEAD of master branch - * ` + "`myworkflow@rev`" + ` - loads a workflow from default repository, on branch, tag or revision ` + "`rev`" + ` + * ` + "`coconut env create -w myworkflow@rev`" + ` - loads a workflow from default repository, on branch, tag or revision ` + "`rev`" + ` * ` + "`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev`" + ` - loads a workflow from a specific git repository, on branch, tag or revision ` + "`rev`" + ` For more information on the %s workflow configuration system, see documentation for the ` + "`coconut repository`" + ` command.`, product.PRETTY_SHORTNAME, product.PRETTY_SHORTNAME), From 294395c46cb8f7a76457465a924990e455ea619d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:43:10 +0200 Subject: [PATCH 0366/2352] Update README.md --- coconut/README.md | 95 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 65 insertions(+), 30 deletions(-) diff --git a/coconut/README.md b/coconut/README.md index b00f05628..eedbe4e8d 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -1,13 +1,14 @@ # `coconut` - the O² control and configuration utility -The O² **co**ntrol and **con**figuration **ut**ility is a command line program for interacting with the O² -Control core. +The O² **co**ntrol and **con**figuration **ut**ility is a command line program for interacting with the AliECS core. ## Configuration file -`coconut` can be used with no config file, and by default it will look for a running O² Control +`coconut` can be used with no config file, and by default it will look for a running AliECS core at `127.0.0.1:47102`. +On `aliBuild` it is provided by the `coconut` recipe (RPM `alisw-coconut`, `alienv`/`aliswmod enter coconut`). Once built, it is a portable, static executable that can safely be copied to another Linux machine and executed. + You can check the local `coconut` configuration with ``` $ coconut about @@ -15,15 +16,16 @@ $ coconut about If no config file is used, the previous command will print out `config: builtin`. -To override this, create a file `~/.config/coconut/settings.yaml` and fill it in along these lines: +To override this, you may create a file `~/.config/coconut/settings.yaml` and fill it as follows: ```yaml --- -endpoint: "127.0.0.1:47102" -config_endpoint: "consul://some-host-with-consul:8500" # or: "file:///path/to/o2control-core/config.yaml" +endpoint: "127.0.0.1:47102" # host:port of AliECS core +config_endpoint: "consul://some-host-with-consul:8500" # or: "file:///path/to/o2control-core/config.yaml", AliECS configuration endpoint log: - #values: panic fatal error warning info debug - level: info + level: info # values: panic fatal error warning info debug +verbose: false # set to true to debug coconut +nospinner: false # set to true if calling coconut from a script ``` ## Using `coconut` @@ -37,7 +39,7 @@ At any step, you can type `$ coconut help ` to get information on wh ``` $ coconut help environment list The environment list command shows a list of currently active environments. -This includes O² environments in any state. +This includes environments in any state. Usage: coconut environment list [flags] @@ -49,22 +51,24 @@ Flags: -h, --help help for list Global Flags: - --config string configuration file (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string O² Configuration endpoint as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string O² Control endpoint as HOST:PORT (default "127.0.0.1:47102") + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes - ``` -Assuming there's a running O² Control core and `coconut` is correctly configured, the following command should -return some details on the O² Control core: +Assuming there's a running AliECS core and `coconut` is correctly configured, the following command should +return some details on the AliECS core: ``` $ coconut info -O² Control core running on 127.0.0.1:47102 -framework id: 1f303909-7beb-4bd2-800d-d71470e211d4-0078 +instance name: AliECS instance +endpoint: 127.0.0.1:47102 +core version: AliECS 0.16.0 revision 977208f +framework id: fde7f033-0aaf-4d02-9f4e-9ee5ee5824e3-0000 environments count: 0 -roles count: 0 +active tasks count: 0 global state: CONNECTED ``` @@ -73,18 +77,31 @@ resource management system (Apache Mesos). No environments and roles running yet ### Creating an environment -If you started the core with the provided `config.yaml`, it should come preloaded with some FairMQ examples. -The main subcommand for dealing with environments is (unsurprisingly) `environment`. Most subcommands have +Assuming AliECS was deployed as O²/FLP Suite, FairMQ examples should be available. +The main subcommand for dealing with environments is `environment`. Most subcommands have shortened variants, so you might as well type `env` or `e`. Let's see what's running. ``` $ coconut env list no environments running ``` -How do we create one? We can always ask `coconut`. +How do we create one? We can always ask `coconut` for a detailed overview. ``` $ coconut help env create -The environment create command requests from O² Control the -creation of a new O² environment. +The environment create command requests from AliECS the +creation of a new environment. + +The operation may or may not be successful depending on available resources and configuration. + +A valid workflow template (sometimes called simply "workflow" for brevity) must be passed to this command via the mandatory workflow-template flag. + +Workflows and tasks are managed with a git based configuration system, so the workflow template may be provided simply by name or with repository and branch/tag/hash constraints. +Examples: + * `coconut env create -w myworkflow` - loads workflow `myworkflow` from default configuration repository at HEAD of master branch + * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow` - loads a workflow from a specific git repository, HEAD of master branch + * `coconut env create -w myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` + * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev` - loads a workflow from a specific git repository, on branch, tag or revision `rev` + +For more information on the AliECS workflow configuration system, see documentation for the `coconut repository` command. Usage: coconut environment create [flags] @@ -93,22 +110,40 @@ Aliases: create, new, c, n Flags: - -h, --help help for create - -w, --workflow string workflow to be loaded in the new environment -# ... + -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` + -h, --help help for create + -w, --workflow-template string workflow to be loaded in the new environment + +Global Flags: + --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --nospinner disable animations in output + -v, --verbose show verbose output for debug purposes ``` Note that if your `coconut` instance is configured correctly to point to the core's configuration (either Consul -or file), you can use the low level `dump` subcommand to list the available workflow templates. +or file), you can use the `coconut template list` command to view the available workflow templates. As usual, see +`coconut help template list` for a detailed explanation of the query syntax. ``` -$ coconut config dump /o2/control/workflows +$ coconut template list +Available templates in loaded configuration: +github.com/AliceO2Group/ControlWorkflows/ +└── [revision] flp-suite-v0.9.0 + ├── odc-shim + ├── readout-qc + ├── readout-stfb-qc + ├── readout-stfb-stfs-odc + ├── readout-stfb-stfs + ├── readout-stfb + └── readout ``` Let's create an environment by loading the workflow template for the FairMQ 1-n-1 example. This will take a few seconds. ``` -$ coconut env create -w fairmq-ex-1-n-1 +$ coconut env create -w fairmq-ex-1-n-1@master new environment created environment id: 8132d249-e1b4-11e8-9f09-a08cfdc880fc state: CONFIGURED @@ -141,7 +176,7 @@ $ coconut role list ### Controlling an environment -Let's start the data flow. If all goes well, `START_ACTIVITY` takes us to `RUNNING`. +Let's start the data flow. If all goes well, `START_ACTIVITY` (or `start`) takes us to `RUNNING`. ``` $ coconut env control 8132d249-e1b4-11e8-9f09-a08cfdc880fc --event START_ACTIVITY From fb5f80a19c59cde53945d5c26c2c434222bc15de Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:47:32 +0200 Subject: [PATCH 0367/2352] [misc] Fix template list documentation --- coconut/cmd/template_list.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/coconut/cmd/template_list.go b/coconut/cmd/template_list.go index f086859c1..b39e00daa 100644 --- a/coconut/cmd/template_list.go +++ b/coconut/cmd/template_list.go @@ -42,13 +42,13 @@ These workflow templates can then be loaded to create an environment. 2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing.`, Example: ` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories - * ` + "`coconut templ list *AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * ` + "`coconut templ list *@v*`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories - * ` + "`coconut templ list --repository=*AliceO2Group*`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * ` + "`coconut templ list --revision=dev*`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories - * ` + "`coconut templ list --repository=*gitlab.cern.ch* --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` + * ` + "`coconut templ list '*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list '*@v*'`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories + * ` + "`coconut templ list --repository='*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list --revision='dev*'`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories + * ` + "`coconut templ list --repository='*gitlab.cern.ch*' --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` * ` + "`coconut templ list --all-branches`" + ` lists templates from all branches for all git repositories - * ` + "`coconut templ list --repository=*github.com* --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern + * ` + "`coconut templ list --repository='*github.com*' --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern * ` + "`coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 `" + ` lists templates from the commit corresponding to the hash for all git repositories`, Run: control.WrapCall(control.ListWorkflowTemplates), From 75f5818681116c2556e0ed25733997da49ce86e3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Aug 2020 17:46:56 +0200 Subject: [PATCH 0368/2352] [misc] Update doc nav --- mkdocs.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 78f12e8b9..a7d8f30a0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,7 +5,8 @@ nav: - Reference: "reference.md" - 'Command Reference': - coconut: - - Overview: './coconut/doc/coconut.md' + - Overview: './coconut/README.md' + - coconut: './coconut/doc/coconut.md' - coconut about: './coconut/doc/coconut_about.md' - coconut configuration: './coconut/doc/coconut_configuration.md' - coconut environment: './coconut/doc/coconut_environment.md' From f03d4120f95d8a4ec0f5e6cc99e56a42177a98bb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 13:47:42 +0200 Subject: [PATCH 0369/2352] [misc] Update documentation --- README.md | 4 +- docs/building.md | 91 +++++++++++++++++++++++++++ docs/development.md | 21 +++++++ docs/makefile_reference.md | 23 +++++++ hacking/RUNNING.md => docs/running.md | 2 +- hacking/BUILDING.md | 56 ----------------- mkdocs.yml | 35 ++++++----- 7 files changed, 156 insertions(+), 76 deletions(-) create mode 100644 docs/building.md create mode 100644 docs/development.md create mode 100644 docs/makefile_reference.md rename hacking/RUNNING.md => docs/running.md (98%) delete mode 100644 hacking/BUILDING.md diff --git a/README.md b/README.md index 81c52ec16..a149456a7 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ What is your use case? * I want to build and run AliECS for **development** purposes - :hammer_and_wrench: [Building instructions](hacking/BUILDING.md) + :hammer_and_wrench: [Building instructions](docs/building.md) - :arrow_right: [Running instructions](hacking/RUNNING.md) + :arrow_right: [Running instructions](hacking/running.md) ## Using AliECS diff --git a/docs/building.md b/docs/building.md new file mode 100644 index 000000000..cd76e4916 --- /dev/null +++ b/docs/building.md @@ -0,0 +1,91 @@ +# Building AliECS + +> **WARNING**: The building instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the [O²/FLP Suite instructions](../../installation/) instead. + + +## Overview + +AliECS consists of: + +* core - Go, runs locally for testing purposes and connects to a Mesos master +* executor - Go, runs throughout the cluster +* coconut - Go, runs locally or wherever you like and connects to core +* process control plugin + library (OCC) - C++, runs throughout the cluster linked by user processes +* peanut - Go, local debugging tool +* walnut - Go, local workflow conversion tool +* o2-aliecs-odc-shim - Go, runs on the cluster as an intermediary between AliECS and the EPN cluster + +## Building with aliBuild + +Assuming you already have an [aliBuild environment](https://alisw.github.io/alibuild/quick.html), building all AliECS components is as easy as: + +```bash +$ aliBuild init --defaults o2-dataflow Control +$ aliBuild build --defaults o2-dataflow Control +``` + +For development purposes, due to the significant differences in building and deployment between the Go and C++ components, it is recommended to manually initialize two separate build instances instead: +```bash +# Includes OCC library, OCC plugin and OCC library example +$ aliBuild init --defaults o2-dataflow Control-OCCPlugin +$ aliBuild build --defaults o2-dataflow Control-OCCPlugin + +# Includes core, executor and o2-aliecs-odc-shim in default build, can be used to build coconut, peanut and walnut locally +$ aliBuild init --defaults o2-dataflow Control-Core +$ aliBuild build --defaults o2-dataflow Control-Core +``` + +Once the `Control-Core` directory is initialized, the user can also follow the manual build instructions below to customize their build. + + +## Manual build + +### Go environment + +```bash +$ sudo yum update +$ sudo yum install golang # or latest alisw-golang and load the module +``` + +Setting `GOPATH` and `PATH`: +```bash +$ export GOPATH=$HOME/go # or some other path for local Go binaries, packages and sources +$ export PATH=$GOPATH/bin:$PATH +``` + +Check if all is well: +```bash +$ go version +$ go env +``` + +We also need to get the `protoc` binary for Protobuf 3.5 or later. +It is available as an aliDist recipe, or as `alisw-protobuf+v3.12.3-1` (or newer) in the alisw YUM repository. +Pick your favorite way to install it, and make sure to load the Protobuf module (with `alienv` or `aliswmod`) before continuing. + +Installing the `protobuf3-compiler` package from regular CentOS repositories and then creating a `protoc` +symlink to the `protoc3` binary might also work, but is unsupported. + + +### Clone and build (Go components only) + +```bash +$ git clone git@github.com:AliceO2Group/Control.git +# or via HTTPS: $ git clone https://github.com/AliceO2Group/Control.git +$ cd Control +``` + +Normally in many Go projects you'd just do `go build`, but with AliECS this would give you a "no buildable Go source files" error. This happens because AliECS has its own Makefile instead of using plain `go build`, so we must run `make`. + +Running `make` will take a while as all dependencies are gathered, built and installed. +```bash +$ make all +``` + +You should find several executables including `o2control-core`, `o2control-executor` and `coconut` in `bin`. + +For subsequent builds (after the first one), plain `make` (instead of `make all`) is sufficient. See the [Makefile reference](makefile_reference.md) for more information. + +If you wish to also build the process control library and/or plugin, see [the OCC readme](../occ/README.md). + +This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. \ No newline at end of file diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 000000000..8341d8ceb --- /dev/null +++ b/docs/development.md @@ -0,0 +1,21 @@ +# Development Information + +Generated API documentation is available on [pkg.go.dev](https:///pkg.go.dev/github.com/AliceO2Group/Control?tab=subdirectories/). + +The release log is managed via [GitHub](https://github.com/AliceO2Group/Control/releases/). + +Bugs go to [JIRA](https://alice.its.cern.ch/jira/browse/OCTRL). + +## Release Procedure + +1) Update documentation if necessary. +2) Bump `VERSION` file, commit. +3) Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. +4) Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. +5) Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. +6) Go to your local clone of `alice-o2-flp-suite-documentation`, descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). +7) Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). +8) Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). +9) Submit pull request with the above to `alisw/alidist`. +10) Go to [Jenkins](https://alijenkins.cern.ch/job/BuildRPM). Accept the certificate warning and find a previous build of `Control` or `O2Suite`. Pick it, and rebuild either `Control` or both, always with `DEFAULTS` set to `o2-dataflow` and `ALIDIST_SLUG` set to `alisw/alidist@aliecs-bump`. +11) Go to your local copy of `system-configuration`, open file `ansible/roles/basevars/vars/main.yml`. Bump what's relevant, commit, push, merge request. \ No newline at end of file diff --git a/docs/makefile_reference.md b/docs/makefile_reference.md new file mode 100644 index 000000000..ea85ff412 --- /dev/null +++ b/docs/makefile_reference.md @@ -0,0 +1,23 @@ +# Makefile Reference + +AliECS comes with a `make`-based build system, with all `.PHONY` targets. + +| Command | Description | +|-------------|-------------| +| `make` | builds all AliECS components, output in `./bin` | +| `make all` | equivalent to `make vendor && make generate && make build` +| `make build` | same as `make` | +| `make generate` | runs `go generate` as configured (mostly for generating gRPC/Protobuf stub code) | +| `make test` | runs unit tests | +| `make debugtest` | runs unit tests in verbose mode | +| `make vet` | runs `go vet` on all source directories | +| `make fmt` | runs `go fmt` on all source directories | +| `make clean` | cleans the default build output directory (`./bin`) | +| `make cleanall` | cleans the default build output directory (`./bin`, same as `make clean`), as well as `./tools` and `./vendor` | +| `make vendor` | rebuilds/refreshes the tree of vendored dependencies (`go mod vendor`) and fetches 3rd party Protobuf files | +| `make tools` | ensures all build tools are present (currently only `gogo-proto` executables) | +| `make tools/protoc` | ensures `gogo-proto` executables are present (included in `make tools`) | +| `make doc`
`make docs` | regenerates command reference documentation for command line tools | +| `make help` | displays inline documentation | + +The variable `WHAT` is obeyed by `make build` (or `make`) and `make install` in order to customize the components to build. For example `make WHAT=coconut install` builds and installs only `coconut`. By default `WHAT` includes all components. \ No newline at end of file diff --git a/hacking/RUNNING.md b/docs/running.md similarity index 98% rename from hacking/RUNNING.md rename to docs/running.md index 46bb14288..e7359c809 100644 --- a/hacking/RUNNING.md +++ b/docs/running.md @@ -1,4 +1,4 @@ -# Running the O² control system +# Running AliECS :warning: :construction: **this section is out of date** diff --git a/hacking/BUILDING.md b/hacking/BUILDING.md deleted file mode 100644 index c1298fe30..000000000 --- a/hacking/BUILDING.md +++ /dev/null @@ -1,56 +0,0 @@ -# Building O² Control - -## Overview - -O² Control consists of four main components: -* core - Go, runs locally for testing purposes and connects to a Mesos master -* executor - Go, runs throughout the cluster -* coconut - Go, runs locally or wherever you like and connects to core -* process control plugin + library - C++, runs throughout the cluster linked by user processes - -## Go environment - -```bash -$ sudo yum update -$ sudo yum install golang # or alisw-golang+1.11.1-1 and load the module -``` - -We also need to get the `protoc` binary for Protobuf 3.5 or later. -It is available as an aliDist recipe, or as `alisw-protobuf+v3.5.2-4` (or newer) in the alisw YUM repository. -Pick your favorite way to install it, and make sure to load the Protobuf module before continuing. - -Installing the `protobuf3-compiler` package from regular CentOS repositories and then creating a `protoc` -symlink to the `protoc3` binary might also work, but is unsupported. - -Setting `GOPATH` and `PATH`: -```bash -$ export GOPATH=$HOME/go # or some other path for local Go binaries, packages and sources -$ export PATH=$GOPATH/bin:$PATH -``` - -Check if all is well: -```bash -$ go version -$ go env -``` - -## Clone and build the Go bits - -Fetching the sources. You'll get a "no buildable Go source files" error and that's ok, -it happens because O² Control has its own Makefile instead of using plain `go build`. -```bash -$ go get -d github.com/AliceO2Group/Control -``` - -Running make. This will take a while as all dependencies are gathered, built and installed. -```bash -$ cd go/src/github.com/AliceO2Group/Control -$ make all -``` - -You should find `o2control-core`, `o2control-executor` and `coconut` in `bin`. - -If you wish to also build the process control library and/or plugin, see [the OCC readme](../occ/README.md). - -Otherwise, continue with [setting up the development cluster](DCOS.md) which includes instructions on -installing these components from RPM. diff --git a/mkdocs.yml b/mkdocs.yml index a7d8f30a0..66f6ff071 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,20 +1,21 @@ site_name: aliecs nav: - - Index: ./docs/ - - Reference: "reference.md" - - 'Command Reference': - - coconut: - - Overview: './coconut/README.md' - - coconut: './coconut/doc/coconut.md' - - coconut about: './coconut/doc/coconut_about.md' - - coconut configuration: './coconut/doc/coconut_configuration.md' - - coconut environment: './coconut/doc/coconut_environment.md' - - coconut info: './coconut/doc/coconut_info.md' - - coconut repository: './coconut/doc/coconut_repository.md' - - coconut role: './coconut/doc/coconut_role.md' - - coconut task: './coconut/doc/coconut_task.md' - - coconut template: './coconut/doc/coconut_template.md' - - peanut: './occ/peanut/README.md' - - - Changelog: https://github.com/AliceO2Group/Control/releases + - Reference: "reference.md" + - 'Command Reference': + - coconut: + - Overview: './coconut/README.md' + - coconut: './coconut/doc/coconut.md' + - coconut about: './coconut/doc/coconut_about.md' + - coconut configuration: './coconut/doc/coconut_configuration.md' + - coconut environment: './coconut/doc/coconut_environment.md' + - coconut info: './coconut/doc/coconut_info.md' + - coconut repository: './coconut/doc/coconut_repository.md' + - coconut role: './coconut/doc/coconut_role.md' + - coconut task: './coconut/doc/coconut_task.md' + - coconut template: './coconut/doc/coconut_template.md' + - peanut: './occ/peanut/README.md' + - 'Developer Documentation': + - 'Building Instructions': 'building.md' + - 'Makefile Reference': 'makefile_reference.md' + - 'Development Information': 'development.md' From 608749e8a38d5b2f71b3196a25a6336db2e2bfb6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 14:53:54 +0200 Subject: [PATCH 0370/2352] [misc] Trash all Minimesos and DCOS stuff --- hacking/DCOS.md | 45 ------------ hacking/MINIMESOS.md | 11 --- hacking/VagrantConfig.yaml | 37 ---------- hacking/inventory | 20 ------ hacking/minimesos/minimesosFile | 109 ----------------------------- hacking/minimesos/weave-scope.json | 38 ---------- 6 files changed, 260 deletions(-) delete mode 100644 hacking/DCOS.md delete mode 100644 hacking/MINIMESOS.md delete mode 100644 hacking/VagrantConfig.yaml delete mode 100644 hacking/inventory delete mode 100644 hacking/minimesos/minimesosFile delete mode 100644 hacking/minimesos/weave-scope.json diff --git a/hacking/DCOS.md b/hacking/DCOS.md deleted file mode 100644 index 5966f888c..000000000 --- a/hacking/DCOS.md +++ /dev/null @@ -1,45 +0,0 @@ -# Setting up the DC/OS Vagrant development environment - -Unfortunately there is no suitable setup with just Mesos, so we're going to have to roll out the -official DC/OS development environment which is based on Vagrant and VirtualBox. Do not try this -with less than 32GB of RAM. - -## DC/OS Vagrant quick start - -1. Install Vagrant and VirtualBox. -2. Install vagrant-hostmanager plugin. -```bash -$ vagrant plugin install vagrant-hostmanager -``` -3. Clone, configure, deploy. This will take a while. -```bash -$ git clone https://github.com/dcos/dcos-vagrant -$ cd dcos-vagrant -$ cp /VagrantConfig.yaml . -$ vagrant up -``` -See [the DC/OS Vagrant README](https://github.com/dcos/dcos-vagrant/blob/master/README.md) for more information. - -## Setting up O² software - -This bit really depends on what we want to run. As a minimum, the executor and occ plugin must be installed -on the DC/OS cluster, and the easiest way to do this is from aliBuild-generated RPMs `alisw-Control` including -`alisw-Control-OCCPlugin`. - -[`fpctl`](https://github.com/AliceO2Group/Control/tree/master/fpctl) can help with this. Install it -as [instructed](https://github.com/AliceO2Group/Control/blob/master/fpctl/README.md) with -`fpctl setup`, then copy into the `fpctl` configuration directory the inventory file for DC/OS Vagrant. -```bash -$ cp /inventory ~/.config/fpctl/ -``` - -Then we run `fpctl` to install O² software and configuration. This will also set some Mesos agent -attributes which can be useful for matching an O² role to the correct machine. Ansible will spit -out some errors, which are generally safe to ignore in this case. -```bash -$ fpctl deploy -e "ignore_errors=yes" -``` - -If `fpctl` prompts for it, the password for the `vagrant` user on the DC/OS VMs is `vagrant`. - -Continue with [running O² Control](RUNNING.md). diff --git a/hacking/MINIMESOS.md b/hacking/MINIMESOS.md deleted file mode 100644 index fbc9ab12e..000000000 --- a/hacking/MINIMESOS.md +++ /dev/null @@ -1,11 +0,0 @@ -# O² Control with Minimesos - -## Getting started -Install minimesos, then: -```bash -% cd minimesos -% minimesos up -% cd .. -% make -% bin/o2control-core -mesos.url http://172.17.0.5:5050/api/v1/scheduler -executor.binary bin/o2control-executor -verbose -``` \ No newline at end of file diff --git a/hacking/VagrantConfig.yaml b/hacking/VagrantConfig.yaml deleted file mode 100644 index 9bf9509f3..000000000 --- a/hacking/VagrantConfig.yaml +++ /dev/null @@ -1,37 +0,0 @@ -m1: - ip: 192.168.65.90 - cpus: 2 - memory: 2048 - type: master -a1: - ip: 192.168.65.111 - cpus: 4 - memory: 6144 - memory-reserved: 512 - type: agent-private -a2: - ip: 192.168.65.121 - cpus: 4 - memory: 6144 - memory-reserved: 512 - type: agent-private -a3: - ip: 192.168.65.131 - cpus: 4 - memory: 6144 - memory-reserved: 512 - type: agent-private -#p1: -# ip: 192.168.65.60 -# cpus: 2 -# memory: 1536 -# memory-reserved: 512 -# type: agent-public -# aliases: -# - spring.acme.org -# - oinker.acme.org -boot: - ip: 192.168.65.50 - cpus: 2 - memory: 1024 - type: boot diff --git a/hacking/inventory b/hacking/inventory deleted file mode 100644 index 5a24548e0..000000000 --- a/hacking/inventory +++ /dev/null @@ -1,20 +0,0 @@ -[flp-readout] -a1.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout01 -a2.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=qctask02 -a3.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout03 -[qc-task] -a1.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout01 -a2.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=qctask02 -a3.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout03 -[qc-checker] -a1.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout01 -a2.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=qctask02 -a3.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout03 -[qc-repository] -a1.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout01 -a2.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=qctask02 -a3.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout03 -[infologger-server] -a1.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout01 -a2.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=qctask02 -a3.dcos ignore_errors=yes ansible_user=vagrant ansible_pass=vagrant o2role=readout03 diff --git a/hacking/minimesos/minimesosFile b/hacking/minimesos/minimesosFile deleted file mode 100644 index 7934ba27e..000000000 --- a/hacking/minimesos/minimesosFile +++ /dev/null @@ -1,109 +0,0 @@ -minimesos { - clusterName = "MyTestCluster" - loggingLevel = "INFO" - mapAgentSandboxVolume = false - mapPortsToHost = false - mesosVersion = "1.0.0" - timeout = 60 - - agent { - imageName = "containersol/mesos-agent" - imageTag = "1.0.0-0.1.0" - loggingLevel = "# INHERIT FROM CLUSTER" - portNumber = 5051 - - resources { - - cpu { - role = "*" - value = 4 - } - - disk { - role = "*" - value = 2000 - } - - mem { - role = "*" - value = 1024 - } - - ports { - role = "*" - value = "[31000-32000]" - } - } - } - - agent { - imageName = "containersol/mesos-agent" - imageTag = "1.0.0-0.1.0" - loggingLevel = "# INHERIT FROM CLUSTER" - portNumber = 5051 - - resources { - - cpu { - role = "flps" - value = 4 - } - - disk { - role = "flps" - value = 2000 - } - - mem { - role = "flps" - value = 1024 - } - - ports { - role = "flps" - value = "[32000-33000]" - } - } - } - - consul { - imageName = "consul" - imageTag = "0.7.1" - } - - marathon { - // BEWARE: this option customize the marathon starting command, changing it can break the cluster - cmd = "--master zk://minimesos-zookeeper:2181/mesos --zk zk://minimesos-zookeeper:2181/marathon" - imageName = "mesosphere/marathon" - imageTag = "v1.3.5" - - // Add 'app { marathonJson = "" }' for every task you want to execute - app { - marathonJson = "weave-scope.json" - } - - } - - master { - aclJson = null - authenticate = false - imageName = "containersol/mesos-master" - imageTag = "1.0.0-0.1.0" - loggingLevel = "# INHERIT FROM CLUSTER" - } - - mesosdns { - imageName = "xebia/mesos-dns" - imageTag = "0.0.5" - } - - registrator { - imageName = "gliderlabs/registrator" - imageTag = "v6" - } - - zookeeper { - imageName = "jplock/zookeeper" - imageTag = "3.4.6" - } -} diff --git a/hacking/minimesos/weave-scope.json b/hacking/minimesos/weave-scope.json deleted file mode 100644 index 7a28c63d1..000000000 --- a/hacking/minimesos/weave-scope.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "id": "weave-scope", - "cpus": 1, - "mem": 128, - "instances": 1, - "constraints": [ - [ - "hostname", - "UNIQUE" - ] - ], - "container": { - "type": "DOCKER", - "docker": { - "image": "weaveworks/scope:0.13.1", - "network": "HOST", - "privileged": true, - "parameters": [ - { "key": "pid", "value": "host" }, - { "key": "name", "value": "weavescope" } - ] - }, - "volumes": [ - { - "containerPath": "/var/run/docker.sock", - "hostPath": "/var/run/docker.sock", - "mode": "RW" - } - ] - }, - "args": ["--probe.docker", "true"], - "env": { - "CHECKPOINT_DISABLE": "" - }, - "portDefinitions": [ - { "port": 4040, "protocol": "tcp", "name": "http" } - ] -} From 5ba3cfd1d15f6faccc00a16e33076d553d73413c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 14:55:10 +0200 Subject: [PATCH 0371/2352] [misc] Update running and development instructions --- README.md | 2 +- docs/building.md | 2 +- docs/development.md | 22 ++--- docs/running.md | 64 ++++---------- docs/using_grpcc_occ.md | 76 +++++++++++++++++ mkdocs.yml | 7 +- occ/README.md | 94 ++++----------------- occ/occlib/examples/dummy-process/README.md | 9 +- 8 files changed, 134 insertions(+), 142 deletions(-) create mode 100644 docs/using_grpcc_occ.md diff --git a/README.md b/README.md index a149456a7..a4e167f1f 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ What is your use case? :hammer_and_wrench: [Building instructions](docs/building.md) - :arrow_right: [Running instructions](hacking/running.md) + :arrow_right: [Running instructions](docs/running.md) ## Using AliECS diff --git a/docs/building.md b/docs/building.md index cd76e4916..a4dbdd88e 100644 --- a/docs/building.md +++ b/docs/building.md @@ -86,6 +86,6 @@ You should find several executables including `o2control-core`, `o2control-execu For subsequent builds (after the first one), plain `make` (instead of `make all`) is sufficient. See the [Makefile reference](makefile_reference.md) for more information. -If you wish to also build the process control library and/or plugin, see [the OCC readme](../occ/README.md). +If you wish to also build the process control library and/or plugin, see [the OCC readme](./occ/README.md). This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. \ No newline at end of file diff --git a/docs/development.md b/docs/development.md index 8341d8ceb..6883f4fa9 100644 --- a/docs/development.md +++ b/docs/development.md @@ -8,14 +8,14 @@ Bugs go to [JIRA](https://alice.its.cern.ch/jira/browse/OCTRL). ## Release Procedure -1) Update documentation if necessary. -2) Bump `VERSION` file, commit. -3) Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. -4) Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. -5) Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. -6) Go to your local clone of `alice-o2-flp-suite-documentation`, descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). -7) Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). -8) Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). -9) Submit pull request with the above to `alisw/alidist`. -10) Go to [Jenkins](https://alijenkins.cern.ch/job/BuildRPM). Accept the certificate warning and find a previous build of `Control` or `O2Suite`. Pick it, and rebuild either `Control` or both, always with `DEFAULTS` set to `o2-dataflow` and `ALIDIST_SLUG` set to `alisw/alidist@aliecs-bump`. -11) Go to your local copy of `system-configuration`, open file `ansible/roles/basevars/vars/main.yml`. Bump what's relevant, commit, push, merge request. \ No newline at end of file +1. Update documentation if necessary. +2. Bump `VERSION` file, commit. +3. Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. +4. Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. +5. Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. +6. Go to your local clone of `alice-o2-flp-suite-documentation`, descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). +7. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). +8. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). +9. Submit pull request with the above to `alisw/alidist`. +10. Go to [Jenkins](https://alijenkins.cern.ch/job/BuildRPM). Accept the certificate warning and find a previous build of `Control` or `O2Suite`. Pick it, and rebuild either `Control` or both, always with `DEFAULTS` set to `o2-dataflow` and `ALIDIST_SLUG` set to `alisw/alidist@aliecs-bump`. +11. Go to your local copy of `system-configuration`, open file `ansible/roles/basevars/vars/main.yml`. Bump what's relevant, commit, push, merge request. \ No newline at end of file diff --git a/docs/running.md b/docs/running.md index e7359c809..abf6ec5cc 100644 --- a/docs/running.md +++ b/docs/running.md @@ -1,55 +1,27 @@ -# Running AliECS +# Running AliECS as a developer -:warning: :construction: **this section is out of date** +**Looking to run your own software with AliECS? Please refer to [O²/FLP Suite deployment instructions](https://alice-flp-suite.docs.cern.ch/installation/)** -**User? See [Single node O²/FLP software deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/ansible/docs/O2_INSTALL_FLP_STANDALONE.md)** +## Running the AliECS core -**Developer? See [the run script](run.sh) and the configuration files in the [hacking directory](.) instead** +This part assumes you have already set up the Go environment, fetched the sources and built all AliECS Go components. -This part assumes you have already set up the Go environment, fetched the sources and built -`o2control-core` and `o2control-executor` in `bin`, deployed the DC/OS Vagrant development -environment and set up the software you wish to run on this cluster (for example with `fpctl`). +The recommended way to set up a Mesos cluster is by performing a complete deployment of the O²/FLP Suite with `o2-flp-setup`. The AliECS core on the head node should be stopped (`systemctl stop o2-aliecs-core`) and your own AliECS core should be made to point to the head node. -## grpcc +The following example flags assume a remote head node `centosvmtest`, the use of the default `settings.yaml` file, very verbose output, verbose workflow dumps on every workflow deployment, and the executor having been copied (`scp`) to `/opt/o2control-executor` on all controlled nodes: -In order to talk to `o2control-core` we can use `coconut`, or we can make calls directly with a gRPC client, -such as [`grpcc`](https://github.com/njpatel/grpcc). - -Assuming you have installed Node.js and `npm` (on CC7 `$ sudo yum install http-parser nodejs npm`), the -installation with `npm` is straightforward. -```bash -$ sudo npm install -g grpcc -``` - -## Putting it all together - -Assuming the DC/OS Vagrant environment is up, a Mesos master will be running at `m1.dcos` with: -* DC/OS interface at [`http://m1.dcos/`](http://m1.dcos/), -* Mesos interface at [`http://m1.dcos/mesos/`](http://m1.dcos/mesos/), -* Marathon interface at [`http://m1.dcos/marathon/`](http://m1.dcos/marathon/). - -The `hacking` directory contains some wrapper scripts that rely on a Mesos master at `m1.dcos` and -make running `o2control-core` easy. - -It also contains a dummy configuration file (`config.yaml`) which simulates what should normally be -a Consul instance. - -Run `o2control-core`: -```bash -$ hacking/run.sh -``` -or: -```bash -$ bin/o2control-core -mesos.url http://m1.dcos:5050/api/v1/scheduler -executor.binary -verbose -config "file://hacking/example-config.yaml" -``` - -Use `grpcc` to talk to it: -```bash -$ hacking/grpcc.sh -``` -or: ```bash -$ grpcc -i --proto core/protos/o2control.proto --address 127.0.0.1:47102 +--coreConfigurationUri +"file://$HOME/workspace/Control/hacking/settings.yaml" +--globalConfigurationUri +"consul://centosvmtest:8500" +--mesosUrl +http://centosvmtest:5050/api/v1/scheduler +--verbose +--veryVerbose +--executor +/opt/o2control-executor +--dumpWorkflows ``` -See [Using `coconut`](../coconut/README.md) for instructions on the O² Control core command line interface. +See [Using `coconut`](./coconut/README.md) for instructions on the O² Control core command line interface. diff --git a/docs/using_grpcc_occ.md b/docs/using_grpcc_occ.md new file mode 100644 index 000000000..68e535aee --- /dev/null +++ b/docs/using_grpcc_occ.md @@ -0,0 +1,76 @@ +# OCC API debugging with grpcc + +In order to talk to the AliECS core we can use `coconut`, or we can make calls directly with a gRPC client, +such as [`grpcc`](https://github.com/njpatel/grpcc). + +Assuming you have installed Node.js and `npm` (on CC7 `$ sudo yum install http-parser nodejs npm`), the +installation with `npm` is straightforward. + +```bash +$ sudo yum install http-parser nodejs npm +$ npm install -g grpcc +``` + +In a new terminal, we go to the `occ` directory (not the `build` dir) and connect via gRPC: +```bash +$ grpcc -i --proto protos/occ.proto --address 127.0.0.1:47100 +``` + +If all went well, we get an interactive environment like so: +``` + +Connecting to occ_pb.Occ on 127.0.0.1:47100. Available globals: + + client - the client connection to Occ + stateStream (StateStreamRequest, callback) returns StateStreamReply + getState (GetStateRequest, callback) returns GetStateReply + transition (TransitionRequest, callback) returns TransitionReply + + printReply - function to easily print a unary call reply (alias: pr) + streamReply - function to easily print stream call replies (alias: sr) + createMetadata - convert JS objects into grpc metadata instances (alias: cm) + printMetadata - function to easily print a unary call's metadata (alias: pm) + +Occ@127.0.0.1:47100> +``` + +Let's try to send some commands. State changes will be reported in the standard output of the process. +``` +Occ@127.0.0.1:47100> client.getState({}, pr) +{ + "state": "STANDBY" +} +Occ@127.0.0.1:47100> client.transition({srcState:"STANDBY", transitionEvent:"CONFIGURE", arguments:[]}, pr) +{ + "trigger": "EXECUTOR", + "state": "CONFIGURED", + "transitionEvent": "CONFIGURE", + "ok": true +} +Occ@127.0.0.1:47100> client.getState({}, pr) +{ + "state": "CONFIGURED" +} +Occ@127.0.0.1:47100> client.transition({srcState:"CONFIGURED", transitionEvent:"START", arguments:[]}, pr) +{ + "trigger": "EXECUTOR", + "state": "RUNNING", + "transitionEvent": "START", + "ok": true +} +Occ@127.0.0.1:47100> client.transition({srcState:"RUNNING", transitionEvent:"STOP", arguments:[]}, pr) +{ + "trigger": "EXECUTOR", + "state": "CONFIGURED", + "transitionEvent": "STOP", + "ok": true +} +Occ@127.0.0.1:47100> client.transition({srcState:"CONFIGURED", transitionEvent:"EXIT", arguments:[]}, pr) +{ + "trigger": "EXECUTOR", + "state": "DONE", + "transitionEvent": "EXIT", + "ok": true +} +# no further commands possible, EXIT stops the process +``` diff --git a/mkdocs.yml b/mkdocs.yml index 66f6ff071..6834166f8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,6 +16,11 @@ nav: - coconut template: './coconut/doc/coconut_template.md' - peanut: './occ/peanut/README.md' - 'Developer Documentation': + - 'Development Information': 'development.md' - 'Building Instructions': 'building.md' + - 'Development Environment': 'running.md' - 'Makefile Reference': 'makefile_reference.md' - - 'Development Information': 'development.md' + - 'OCC Components': + - Overview: './occ/README.md' + - OCClib example: './occ/occlib/examples/dummy-process/README.md' + - OCC debugging with grpcc: './docs/using_grpcc_occ.md' diff --git a/occ/README.md b/occ/README.md index 9e9c19846..330a370ec 100644 --- a/occ/README.md +++ b/occ/README.md @@ -1,6 +1,19 @@ -# O² Control and Configuration +# O² Control and Configuration Components -## Build +The O² Control and Configuration (OCC) interface is the bidirectional intermediary between AliECS and all stateful controlled processes. + +For FairMQ devices, the OCC interface is implemented by the OCCLite Plugin (default) and previously by the OCC Plugin (deprecated). The OCCLite plugin interfaces with the FairMQ plugin system, therefore no user code changes are necessary to make a FairMQ device compatible with AliECS. + +For stateful tasks that do not use FairMQ, the OCC interface is implemented by the OCC library (OCClib). The task implementor who wishes to make use of AliECS must link against OCClib and implement the `RuntimeControlledObject` C++ interface. + +## Developer quick start instructions for OCClib + +1. Build & install the OCC library either manually or via aliBuild (`Control-OCCPlugin`); +2. check out [the dummy process example](occlib/examples/dummy-process) and [its entry point](occlib/examples/dummy-process/main.cxx) and to see how to instantiate OCC; +3. implement interface at [`occlib/RuntimeControlledObject.h`](occlib/RuntimeControlledObject.h), +4. link your non-FairMQ O² process against the target `AliceO2::Occ` as described in [the dummy process README](occlib/examples/dummy-process/README.md#standalone-build). + +## Manual build instructions Starting from the `occ` directory. ```bash @@ -42,79 +55,4 @@ See [`peanut` Overview](peanut/README.md). ## OCC API debugging with `grpcc` -We can send gRPC-based OCC commands manually with an interactive gRPC client -like [`grpcc`](https://github.com/njpatel/grpcc): -```bash -$ sudo yum install http-parser nodejs npm -$ npm install -g grpcc -``` - -In a new terminal, we go to the `occ` directory (not the `build` dir) and connect via gRPC: -```bash -$ grpcc -i --proto protos/occ.proto --address 127.0.0.1:47100 -``` - -If all went well, we get an interactive environment like so: -``` - -Connecting to occ_pb.Occ on 127.0.0.1:47100. Available globals: - - client - the client connection to Occ - stateStream (StateStreamRequest, callback) returns StateStreamReply - getState (GetStateRequest, callback) returns GetStateReply - transition (TransitionRequest, callback) returns TransitionReply - - printReply - function to easily print a unary call reply (alias: pr) - streamReply - function to easily print stream call replies (alias: sr) - createMetadata - convert JS objects into grpc metadata instances (alias: cm) - printMetadata - function to easily print a unary call's metadata (alias: pm) - -Occ@127.0.0.1:47100> -``` - -Let's try to send some commands. State changes will be reported in the standard output of the process. -``` -Occ@127.0.0.1:47100> client.getState({}, pr) -{ - "state": "STANDBY" -} -Occ@127.0.0.1:47100> client.transition({srcState:"STANDBY", transitionEvent:"CONFIGURE", arguments:[]}, pr) -{ - "trigger": "EXECUTOR", - "state": "CONFIGURED", - "transitionEvent": "CONFIGURE", - "ok": true -} -Occ@127.0.0.1:47100> client.getState({}, pr) -{ - "state": "CONFIGURED" -} -Occ@127.0.0.1:47100> client.transition({srcState:"CONFIGURED", transitionEvent:"START", arguments:[]}, pr) -{ - "trigger": "EXECUTOR", - "state": "RUNNING", - "transitionEvent": "START", - "ok": true -} -Occ@127.0.0.1:47100> client.transition({srcState:"RUNNING", transitionEvent:"STOP", arguments:[]}, pr) -{ - "trigger": "EXECUTOR", - "state": "CONFIGURED", - "transitionEvent": "STOP", - "ok": true -} -Occ@127.0.0.1:47100> client.transition({srcState:"CONFIGURED", transitionEvent:"EXIT", arguments:[]}, pr) -{ - "trigger": "EXECUTOR", - "state": "DONE", - "transitionEvent": "EXIT", - "ok": true -} -# no further commands possible, EXIT stops the process -``` - -## Developer reference -1. Build & install the OCC library either manually or via aliBuild (`Control-OCCPlugin`); -2. check out [the dummy process example](occlib/examples/dummy-process) and [its entry point](occlib/examples/dummy-process/main.cxx) and to see how to instantiate OCC; -3. implement interface at [`occlib/RuntimeControlledObject.h`](occlib/RuntimeControlledObject.h), -4. link your non-FairMQ O² process against the target `AliceO2::Occ` as described in [the dummy process README](occlib/examples/dummy-process/README.md#standalone-build). +See [OCC API debugging with `grpcc`](../docs/using_grpcc_occ.md). \ No newline at end of file diff --git a/occ/occlib/examples/dummy-process/README.md b/occ/occlib/examples/dummy-process/README.md index 2529b747a..905a427d1 100644 --- a/occ/occlib/examples/dummy-process/README.md +++ b/occ/occlib/examples/dummy-process/README.md @@ -9,8 +9,9 @@ For instructions on running it, see [Run example](../../../README.md#run-example For guidelines on building the example as a standalone project, see [CMakeLists.txt.example](CMakeLists.txt.example). Dependencies in aliBuild: + * Control-OCCPlugin (provides the OCC library), which in turn requires - * boost (for boost::program_options) - * grpc - * protobuf - * FairMQ + FairLogger (only for the OCC plugin, not linked by OCC library) + * boost (for boost::program_options) + * grpc + * protobuf + * FairMQ + FairLogger (only for the OCC plugin, not linked by OCC library) From d5d8e6f0f27a1c57998474958fd2810ccb7bbdce Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 15:09:24 +0200 Subject: [PATCH 0372/2352] [misc] Update README --- README.md | 6 +++--- docs/running.md | 4 +++- mkdocs.yml | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a4e167f1f..7a976da98 100644 --- a/README.md +++ b/README.md @@ -32,9 +32,9 @@ What is your use case? * I want to build and run AliECS for **development** purposes - :hammer_and_wrench: [Building instructions](docs/building.md) + :hammer_and_wrench: [Building instructions](https://alice-flp-suite.docs.cern.ch/aliecs/building/) - :arrow_right: [Running instructions](docs/running.md) + :arrow_right: [Running instructions](https://alice-flp-suite.docs.cern.ch/aliecs/running/) ## Using AliECS @@ -46,6 +46,6 @@ There are two ways of interacting with AliECS: * `coconut` - the command-line control and configuration utility, included with AliECS core - :arrow_right: [Using `coconut`](coconut/README.md) + :arrow_right: [Using `coconut`](https://alice-flp-suite.docs.cern.ch/aliecs/coconut/) :arrow_right: [`coconut` command reference](https://alice-flp-suite.docs.cern.ch/aliecs/coconut/doc/coconut/) diff --git a/docs/running.md b/docs/running.md index abf6ec5cc..2be658ccc 100644 --- a/docs/running.md +++ b/docs/running.md @@ -1,6 +1,8 @@ # Running AliECS as a developer -**Looking to run your own software with AliECS? Please refer to [O²/FLP Suite deployment instructions](https://alice-flp-suite.docs.cern.ch/installation/)** + +> **WARNING**: The running instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the [O²/FLP Suite instructions](https://alice-flp-suite.docs.cern.ch/installation/) instead. + ## Running the AliECS core diff --git a/mkdocs.yml b/mkdocs.yml index 6834166f8..faf1ff117 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -16,7 +16,7 @@ nav: - coconut template: './coconut/doc/coconut_template.md' - peanut: './occ/peanut/README.md' - 'Developer Documentation': - - 'Development Information': 'development.md' + - 'Development Overview': 'development.md' - 'Building Instructions': 'building.md' - 'Development Environment': 'running.md' - 'Makefile Reference': 'makefile_reference.md' From fecc277cd8682fe2a7526a3551407832483ebc1f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 16:20:49 +0200 Subject: [PATCH 0373/2352] [misc] Add FAQ page stub --- docs/faq.md | 2 ++ docs/reference.md | 1 - 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 docs/faq.md delete mode 100644 docs/reference.md diff --git a/docs/faq.md b/docs/faq.md new file mode 100644 index 000000000..d39935874 --- /dev/null +++ b/docs/faq.md @@ -0,0 +1,2 @@ +# Frequently Asked Questions + diff --git a/docs/reference.md b/docs/reference.md deleted file mode 100644 index cf5aa0741..000000000 --- a/docs/reference.md +++ /dev/null @@ -1 +0,0 @@ -# Reference From 916b1833998824809c84267e354c92f52d79f834 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 31 Aug 2020 17:25:46 +0200 Subject: [PATCH 0374/2352] [misc] Begin AliECS Handbook with user-oriented documentation --- docs/handbook/AliECS-configuration.png | Bin 0 -> 1280644 bytes docs/handbook/AliECS-diag.png | Bin 0 -> 146284 bytes docs/handbook/AliECS-envsm.png | Bin 0 -> 419355 bytes docs/handbook/FLP-EPN-ECS-HQ.png | Bin 0 -> 364409 bytes docs/handbook/appconfiguration.md | 1 + docs/handbook/concepts.md | 11 +++++++ docs/handbook/configuration.md | 1 + docs/handbook/index.md | 13 ++++++++ docs/handbook/overview.md | 43 +++++++++++++++++++++++++ mkdocs.yml | 9 +++++- 10 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 docs/handbook/AliECS-configuration.png create mode 100644 docs/handbook/AliECS-diag.png create mode 100644 docs/handbook/AliECS-envsm.png create mode 100644 docs/handbook/FLP-EPN-ECS-HQ.png create mode 100644 docs/handbook/appconfiguration.md create mode 100644 docs/handbook/concepts.md create mode 100644 docs/handbook/configuration.md create mode 100644 docs/handbook/index.md create mode 100644 docs/handbook/overview.md diff --git a/docs/handbook/AliECS-configuration.png b/docs/handbook/AliECS-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..805ff61abb9fa782cd460ee2b2440ae31aa720ba GIT binary patch literal 1280644 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 z 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

V=K_BJ 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νFLM14?mUR1CxwBIm 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

JU~#X?yL*PV1-o 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 Uy2Id2&fbXlLsWd9VG;8&# zC@@t*3pZ^o`4EIbHX}o{`D%P%9g0X4D#@;(5z-G<7KG!%PDu8~Lt}ZG>(}cfzQ%CC zCc!+SS0@cwt43(?q9*u=e!B7`gV*cqM*PQ8YsU3bc8__l)mCcX@Wz~mEgldQMNMeN zF7YpB>;S(;Lgm zAdrvQX6oRRR{pD1*1V@sA$DUCHCH)8F|-^wsG_YMWy?}<)n;{K6xdd3xUFY?8|_R; zCnE6p9Nq_-q^qy?8)8s){u!<|N#o>^eglJ@Tvh8AhfrIw7; zfOlloQUY%gqn1;{4n3!REgle$3$0z)-jn3j z*+&j=UgGR%P#f~u9{UQQgo3#KuY=gK${nLK_j1ug%W<5M&kYPqnu&dFam0d%mp3?T z`f0#gyX{;dom(-Szzpm0pV({CwZB;ML64K^qbASS5Cp0@yseGZ*MQ0hHw$Grbyv)m z7<8NPC^CVw5q^`tbmL0Q@p6EW{A*WRl0n-b91IkI9V}auZ|`4JG+GFPhl=$>*vAX1 zJ<3RulFux@O?h_h+8x|D!v={iNY_e1CoD_#$h42h>bb{Go8*FV<&;8Pgt_A*m`0|v zIQhv-j8u*K0l=u(7qge}D6k-gn(fwOdo8&?SR32J+PNH1>|H2M11JlR9Wne7EPGRVZRF2JH!<&-!CzrAKE#XFsO6C_1B$y z!Teowy#<$X!n}!2Wy{qlV1)Z_F7z+cv52Eq+eQ^-wM znVG?=RZ6wVI6er(!g{*K6Bk@>b^6Ebaz~1}UoPKA&3jeyNs;oIrs&h{`#z@()c!@* zKq1awKK+dE2w~3@Wj(p_5RXXlz!JP~AJJ*ieD8-sj&%c668EyWH_+ha?>#f5TQ2xGdQ}=fi`X>Z8r2 zwJPy&Gw!&unUA_i55_}gV!limuz+Sndk&I-2Pi>wLvRBS?3XLe&Gpv-bGJ+P>Ehqa zLV;0o+9n3@g%ITeT_O)jVkjo3v-B9I%jWf766GPEbF(LQAHtNb3yoq*QXn8?I~Z}0 z+h9g)v^y^tNasTA@0Mk}9$r0dn^by*d`j@FU`(@Ky8}L!&~{|#7U%|L#&dZJI|#sV zL2#5MEqlWMBksN9n#`K_;T1szRImVI11lm`MUWcQRirD5NDYdBNK<+Z1}v*6id1Pq zr7R$z^d3+Vr5B|`kltJ95c19)i0-be?$_V$^ZxPV^K8^4=bSk+*IaYW+~zs5W}8v) zB*C7jokdG+H%GeS&d=fZusM*ME1iSw?rpq3slD>^$_ZvHj*wvY0bSoEyXZc)BJQJf zY4>q)Xh+=?k)XlxyM3h1!3lB3KZ!Ay^3R3JA)d+Pt7yT72p4nq5jLFcxY0Ey*cnbE zY7+t5#^SxEQ5Kv~Tu(r5)wQ378Aq=7-!y4RQ*5?x+oqmvk?f7mc`U4gm6krHzQd>? zF7|A%y_Xh{f|UgBz=858w|2I6c{823%li6vGquGeK*AFq7gx&dm%S5dc`6w)_vPD? z@;*h8<9+&}uF8wQ-9O4*{_N!~g)6~Ex-t@D77C7c!PBPo34TA@fZMT$4tTF1C(?wl=b*ikQp4?j`;#?;bOfPIAQ zT)imk38a!NI#KUZ5B)UQhM64i@64jSMS?6~%oqk#I$7T5Rq}KN zHFh_oIBSBDCyos^$j_`vJ2}IYA*?Z|{xRYd6ysE+I#2E1iS+TMS9P_!@ipkztQ7BP zX=dt}s%W!#m81|IW2_=|az!ZHl}{Ny#hJ!&3hDYFU8|~6cZpRMFImd)*_@B>9NmyF z&0)=8fd3t-*QK+YC%XxrSvGRKi!O7B`=3xT`o! zA6Qx@@$C+lLW@BYM)}gP7?u`gl1E>T3)X8@ojp0%(e$6f5-o20PUt=HqfASHrk1o@ ziJz|>;Y(%+U^#V1XE<) zR&@Ez=ife7e>??!E$7aklk4zd5Vamn+A8j(fIJz~(Pq$x=n>Ob)Yi*#>yjcLcA z0D%vl>+JO`}mF-QQ!L$K8X&UW*nN3r#`P}^^4E~ABm#)L^N|=9&hHOVYb0_;`6aM8Nds8D7|ezAS4>f-e?)q_s^eqr-a%`{ z2m>UU@#oqap8PC~k#^R0PTFma=*s-a)AFL0qxYeMFCzT>KAzp_>FE_JWvqOfr(l3X z@awvX%4|d19;i%P^)#OlvmM|q(G;>RG$2Zf-=VZQ#dsw~mLUmHJ9L0sbmv|a#kBhe zNnqsQR&4}@)^&y}O{Vr!Xinx;M~nqz#B6$Yqi1^A^xyTfS0s1G$(HOo3&U)xUaa@r zh|IJI6suenhKF{eJKz!G>zRaxCqb@BHpZ3px7SY-i2^dc`wugCO6wLE8~VMd>UZN^ z@FRcQbqsY`eU9y3<0$9XGtzXW9D!TNk}!i{*;l|L%L>f`9B_LyAVS(s4!9(rl;gLV~^bxJwQTp4i6|E;Hi>#;G z{MstY%b7{hwhWj0f)A>vo=!=ro{o<5j4s@d2t*BGqYpuUTE!cgj_#+=Ee4D2xq0~H z9Yt37r`^cZX*|}ZHeszYe_;!$M?dg5;7ESBbfwAF!TvAfx;|s;= zqVs&=iVec0YMx2^udy$p2oI0jtuXkjGs3z$N(U-$6lr2 z#OJJv_S^#1ZEu8!5KWJOU`)F<{jcx9(H&Iv<6drc0)EX;$stS(9yOb&h>y({8snV1^I>v7G_i&M-WSw#XLUOhsOgu41Dr z<>3(KBgX|99IbpSTu5{a|0LI(3Vy?(-N-cmkPbZWUhRf!on825Lg`Ot8vZnFrP`15 zWIT$H8`DbQ_3(|E8DD3`ptoGKM3AEVIwGMlkuZ2rktB55y&j!U~ey*S$HmvRB&lMA;Iw_nH9%{>Ow z-!kwFC?VdYFO<*|gc3?xni3ivse)w9#mG6d@iptgkvlH>3qEIo(SM```JH^6hzue! zqon34e5bW-)SGAKk5|9BQkR|BIL5aak3bo@*qNgQ*>KZi!(1r5M8bhzKj!?};3t#m zw;Pc;UPXR|FyGIwqX%T@l@j9qWqOdC=>#ZhFVbn8I{BM_oOh34>G z`MrpP*WAxNfp`q(MUSyTDbL8T4_kf5@dFQ9)C7?@gRx${qx;PD^OjO~Yt&bgM+nK% zJ}#N1oyN4@e?b!IGS9joWx*H-+97nR!iFy!#C$3RK}ecGZC?=*%kMeuP_nBT92k3Ts{+5Q0$IoT(&JS2x zOaZ33Ufi>_4J&<{(Q4?E_Ka4QOee+xd4!p0^tx3-ibDpJ-I`q?_X=IbYqf0|GJHS< z=B0!u&N}rS7y7ud@Ls$&GJN1#{EcqWnH3Li}ZSgo4U9piy%EM z3po{ffYHEGL&!^(Ji6w`Wu)KJtxh!0#gPbxW)nO_rc{4rHaNcF&HHC zJc79`VKHE38Bcz)e!roQe7Q=DWBOOJNBQY9CL+CES_f^-V&-_ctM>hx5LQ!6 z5RiOPw^DuK3O$Ab{R^dlB_mN>kOY_UytU^z)*^uIeHfXj_(LaHKgyu)OkNJxu{k~a zJ}GndKP16h*YC?dy|+sV=VOQ=-AC+ez1b@HBU?RqicYT5QltSc5!y%_?aP8kd&&sh zruE65&~|*dhg+uvSl1q3xd2Kf|0JN~)ZEyI*50}U-1(ekg$Z=qkhuyuPP2{ac{g}p zod6Am1869wziKEn5e>zWC85^2AW?y#`Jy+~D+`T$1-#~m(0`f~w-h7zQT1Hm7Q*!1 zalruFt6X~c#N7WdeDh;_qu~hyFCO~{~xtDm1n9Le|)dub_tyF}0v2O>KXv&Ldm$H2wvXw-1i%?EHY{57TaIpHHLj z2&DH8n@YrzJg-l>(fvW z9KXE39aTTQdC#ts4~N^&#l2hDvJ%RcaZ$GH{D)2SzgF*CkzUR1zbyutf0Isc?!Nq5 zHs3L68a(cm-3RS|W@jNhKDL-C#=hnH9UX<yJ1Cmmq0%PDdx>ShK?bA2(i$AKK^W2izX48-6Z*G?B(gy;cQkft;zOnW`B!L;JUh zSued~p;MlkCteo~tYp8iw`efX6j#>RE>CpNyeyO8VN4suQBFRhH&W?R`89t98uxsp z;k)8yFa9k}Z(xy}5Cq-Jl7@#Rm1xjO*s>RCTb4Z)zAHK$-c%F-%# zsD*6k-5~svgc|1#EJ6f8n&QVQ;HAo=;|Eh0ilCc+H%xHayfO zNgXEGXhswV@#d$pK`U0=%^;V_*6W86f>LvbQ7^*DXh2D+nI?Y^j^*y$JIo_27ic}p z8oCaNOcxGV4td{@h+Vg8gQ z6|@?zJg0WkGSsTe`i8O?Ovvgjq6!hE0eg{$3+B{J_?$j}s&Q0VV7uB`1nIIoj=(hY zI&EVC402^Zw)KQdPk%3Jz?RMaG<4!;I7?Z2@eKJ-h7!59^Xmuq6AMNoEw* z-qq9ZY6{{d&&|?8miE+p%%9LJDBC8R>n?q%w*)mN{e~vru(>Nb1FHDRMH-uL-MZu zA}hb76)OD9*9Y}o#BOgAN$p9j5KR(D{TkNOp98*0Y$d)W6PnWtZn~<2m#@AMM9Vb29Ti;xkd* z*W_sJ2U4F8?V5Y#A2v6I>tB4DmXFgx&1ng`F%*f_O2c-i(Se7 zsH{+)F(jeX@XEE00b&j_{jZpCG1BR4Q+&!Oym~Uz>&1;!M|ifS!QV$;wfDWV94}Fi zh&r$TIz)LX==baEb@tl(9S00eq&pSX+}JYu6niyXw4n(#2G- z`RK8+m?AI7y|`!O(Aey2PU>y2Ks1{mXAN7#z=eO}lDLrzIUF z;Zr(Wpm%(^;(VD4L&q(8W=`oFzbvDn4cKsvR1=i!2_HatWBHELB#&A3A@ZbmG)g|l z_d?u$f6`6Yy7l7hG_>{HkFv=zx+yjnS&CCE34w=~(b&V6+CR@wYiAJKSX@0jnn=Dx z^D2qNM)cad@C6GWjI~+S-b~)_KQJN&F9%+}*#KWBeL;7SXj!%4A7 zCO%87$)b&~r$T1CVwn`tBmjl3FxgbM%z+nY^YPASve6K*d4WidP-Jdj)H0&KicONve-TkII%34wQ(_ zJszDK-cu%VnJgPTm}ZRe*HTdHmPRaQm-WX22nM zPH@X8%UyONm zaHpE4Z_y3o|jMRNhO7k_&tw}JEYPC@H;=FzqCa?cnK?P}8rQgWBRxopcdgqV{~TVHi%TFsn^zc1cOpRc&2N9-!)6YHM}-wVBc z9Q*&@x0K;s%2}!wVCn5Wk2OmTWZhUIHQ8v{6A%-p$Tr_v({s-~{uDmFKh?-=T;73k zK2w0kZD)CpRpr!3Ta}Fffj`?M(l0#N76^}5$A;GVw{r0kzKV-s*OjX zHXSg717=m#?Y&t?i7i&vJ2G(R@W_#9z18=ERHH(9{p%quzlmVH_nZX$_^I+OJRYNlB(Tb`Id@?4m;b- z^2HVSA+8{6DOd0^^und1dB3(B$CrT(ZrE6Sa5BB=R^{rCEM8h{-nyx}m8jrO z$w{Y*ni0P*3C~^EuoJMk|n#;`2az?CDm$Lq=Pvr2@_op`Z+z(5x(dID~G6E`Eby@Ya8@v4SpUs)CM}U+CJD>3PVt zaq(Boe%OqquA7s$Wkx`u`xolgR?`O&KkHRCM&kGaCf`q8H;UIIKi$XkD}+U1hRZ_` z%VV|Sd`uh1I~8u^J_9$Ty)m3jI{Y(sTW*Op46zrMBz-*F)0{b^IN5kzIb*govr5vo z>8vv$bC^8YLSl;G;&3@ANuDF#GjPn={N`|O+Vx$?%{Q86Q9BhAn{(BnqTV7RxMOGs7GeP7skDZ0?2?Yq$<;r;`s|06nJaw&m z6c2xt&DLES=vOM$>IL3*ZtPCwRQQUn=40KLZ&FQHPb+tvunDajDYF>FrWk3uFjI$m zrXz9O3GD1@EX5e88?FmsUPcqU@qIH{RZufC4xadsKA;GI@C5T|!OT^s4hwu>vD)V! zJK14K&ZoU(G%L`_rMUQk3t?=4`F%G0+lDslbAk+lqS$Zrq#_-yn+NZ)?X5tHtqLcGtB_F z$q{R2J=D`b>9SL(d^>JlH{j*R$4~WEAy|`Q=0dw#X5!fmpHn0L3fY#%=P|Bzk%bHf zXUD}qcmeb{Dz?pX2VhfWx`as=mg4Fe9{+)!39D-~v@`oaNOl|dGp^$S1Mj}yoFir$ zTG+flNKJI>QQ+-E)QsJD*(claGRAq*E1B)e$`bRxI*i`ss;W|!%pM*ulbmeC6&ZH% z@rI0_&^_wepLV^i^5&ksVS9Wp?Bq)xQ(?sWX=3Vn9jB983wgqP&Z~>YW);dIZbhLe zKFvwPr~^eJx>nZRl~*z`&Fg0)9OlVdHkH5XP92!9$IhUOAA|6i~Mw51LN{H+!BZD%3iRYKtW?KRb zUC{(JfthH`0mD%cPO{d~uj4G2!}gN^+a~u#>!$cLG(+sWKntMQ{l+=s zWVR|OCMbT##@{hUmU%U<7IoL#3c~lqJgdDc&;P_%J8r*kY>wIm`~0NBXr9PV=h1wz z88gvFKA+CZ%JU~*);PVY-Z$QhpHx;K6+*n#SEPIk-KvInwwQ(epMHqjjm5J03lqmb zjemMbL!7e+I7G_E&Yk|%P&qKA_vYO;{@;~ss@~Jvs&rX;DF<0!Zr_wZ*}6~yvi&?@ zj!SI+%&hXw!NUV1A9hvU>=j5No}jvi^0fe?2QF|W?q0kOy!=?A)M)xxqn8V>RAVy$ z=B_flrKS_}Q8=NbUpXDgYI!CDa{K*FKb#a%q@g{@7piOX@iKYWqo270&TJRJg@qom zIeNE0QT1;Bp)v`t5XXu1TZFQ*;J{8PvQq%c91|eoqSISSKD#4UfQAuclz6C87I872 z;OghV)gK$re!G4{^y@m5PpMK++OMk8nm$G6$=Qnd_9r}3T9fI)ueaPl-@oP$uHoH; zhY%La>MyM4&>PW4V>xH13Qbbdn0?Pa3Di4hh*dm)#wA`EjDOS26>OtEc4Ty6Z*j=p z&U}mduAFS?-!(639W$#Oj*g#yyUyrthcEYoB1k$Gy$eLp_>0%xP~Vv09VWWWXgN&W zmCoz$nm=G2O+Zb+X<#ohFS_?Nfcf4i-?iK=7=(OjU&znwEBxwBf>^D*{ygz4^IQXo z3ss-lG#>^*isc_qS-)6Y_f-szH$;zX+YV>!h!Vx<@%r{Dvu^w&HsVBJ*DI^2tS*Ejb0ZrQzUL&_V}E~Fe0pyp+qQ7Rqv-p^6e@1CA(-}7GPghW+G}}U%SA*gfs-4 zOn)X%gWs;3OKU-gV=(AryN@nY$msOnI<|npt$h!4~*Yg5TBwj9~A+dsFQWHGRU&$1qUBgwoAY`ON!&m&=)NJKr z9$rH6uI9sY{^1hO^HQBJ#qW$yp=i6 z8+tIioP2{z!)Jp8`#L_i9a;FKO~1g(U!8z07z3P7Q!J(XyRL9MkHQVkY7YNBWma;szIrZ)O z|355%9R*;Di94k2{hW4{(H(O15!7wB#7IR=>(_6uvz?1f>$!BKWLGp(n-qSNM;r5k zFBn3urTo%0v>`EXp@<~o>Oo$9KiDmhtI~Ablbq5ou}(u z4qz|T&$~~{enB(HWtA4EwHN}JGGVt3UN+T!rozqTdmr&kofFi=>&{);BGv^_x|2sy zHrtmUN0iOdMXFQY4cR-ApoW5;Vc;ufFdQra8zK4!wCY?vbwwB2oT(d6O?+ z*Fg-(bp4`V3}P^7NNOnY`2|}6dBwH|)r{!C{}qnP(UehxsVOdn+3To)5{&$7iT4ENa1!)FJeiIBa=9y(Z>ZB5K|T+=6GT zQU6F(w5|>G$mQQ~g}5uX=ocNpFMhHSQ3t=c1N`E~3of6-eAiu3T@_Io9P))DyJp>{~l`POgbbz~gLRgwk(hQh3If}9pW14mvW8Qno(N=LuT8~=DQ6{l(_`@>X>%4W^sPG6Nxl&WrP5#ysKuoy;Nc< z*#&KnfemYTf*+FN3bN_EBp$My65X-OARXJHNxSqW$VmBxIF3GqO_=etjnuEcko^4% zL5DlSPa2uOb1!lv+C_Y)q88@K!mictUL=P^fp0fT4dhuy^Bi_xd~+;Yj_|)7Bzo`L zf0{eV&}AnBGpaBbZHn_t#oBWvGnxiP-G|<06bx9lM%@v}X%k&fIlfJ+kr-jUbc`T( zl|>qIkdK2;m}?tL>UTfSLveKr@k@vYfReiT^DjV&Z#YJIyWjjZ^HAN1MNmPAyyyfW zRA}eo4s6?4ES#XY=GYBs4kY_4|9AbOE}hOHy<16_9e4%tgmZL>4RoV=dmXB=E908C z)nvPj1fQPF86g%7j0Siq=je}Yt6Hd+Spq3dqgWe- zsJVI{6)9ao!o!=E+q)LA`H6O)3dlM8{k7vLW`h-`U!+@!Ms1CZle?JphI0^x?_I^u5H{RJ$t)ON*e2^-m!>RT4?Xcj;m zlmx7>%l=*9q&B9#?(Rc@(!?GcF^<~Fo9YGprFvql3#PCUF$JF`O#wgE?GjE<3Cbt!!5U8B;Acf7kAa1z88w^W5-d%R|`p#^32{P|XFq^4j(-{cI}J|93UD>vGsM|f?>en>pk zS%|0qQ#+4|J#P%T*J=B_{!*E29zJ}jd%%+yXQKDj4w z(*_Q69*+0AvSwufZmY5svo2>?&sn~oN(@Blrl>YFU8ZN=bPK-sj4tVxU*}KMAd#QG zLV;6l7(Ne^HyN{y$qHb_DFg?W6aV;N5yKi0W462 zeUVy0-4GIMT6ZEOO#_f*WRi%4h;TK{^#AoGh$wcFQGGn~Aa~9qn!(^9eY+;RB=OO5 zly64U!wKC{Q0BKzbDw>PB2{eP+OUJNmfT##AM)K=${(h+5OMJs3*RC!7&OU zj*;ceQh5}cQ)}8-!7RuA?Is1g2uLDz_J`Y%x!*rK#%^;aroGAN$>H;S|LgQYmoB1s zDiu)cu6$yj4ULLt!%J>4~rtTO}p=GOMrt z&lAcQxgXnd0#v%1I*5VfUZJjGoFBB2*}pqFJ9O~i!O^EzBUX-?r8GUC6dn1fJUKY! zp+JE?E98+tA-QCrh)0bl!`9BX=IP8&n#=N-X6bxCgOJY|ZW`+@vE8WL#v;QJ;Hzo; z;C~Jq&+8TzbA&5Rj^`7%_@&53D&aGZpmOu-sv=^=F1Du8h%6G$RPH;oPRC>vb_@AL7Fg2K@hUE0WmN!p!R9 z>@f1A>pfPlJ(bzIR_;5}rFiyy!0;Snx%sbDEx=8;Xzpzv2O>xglF4Rrsr`9c zwiYbVZ*EAbC1wATe8aOc%q~fcBVdV%A$v;={i-#A-^UXAXn^15`vm-(dX^6<@Vtlz zKBLs3v3KX|JSdpFp=d|7(rg=z!6!HP!t8Qsl6d+!SmR)Y($1lGoo7_uvUNqjT7?z&^#7 z3Z(FSAtKL%4g+=0l85hZb_}F9wz_4p2A2%CCy>KFZi`~juW}vQwng%eQic_7gOa`d zbG^;?7l5Td0xVsZ1eWfo$$_z2c)}OcM8X?_|M@1Tw(k=TejHF})zQ=u%xqg{F3)3@ zri531GldWi)OrU@`Z2v6xcTNUSSbX}Jni~dQKd9P|154pRodM$+Rljv;C&jTb1J&a z){5%7+eal@2H+;-f=iD!eGD$|rj5>v#y{xc@luxPkW_qVEU^GHuOKj!=h>2`F+FEn z`8>5zU7}V#62Buhr6cV7yP;M*b7T-(|-4wiFAGZ6%Milw)X0xE`Mnu2d9JBRUb=y_B-kQkRR0QNZ{WL~>N?07}lksyW%Q zUxFu7O4HLjVV_c)lfF;c`JhodB(Hs11G&k3wz*P_Ny5edd2YfjXx)ib747?gO?Td3 z@?@Urc?sI4_Tq*RrxvV!r?P)$@gYkt-YWJdYR(Te4YX1-t$OeCdUcke4Rj(i6?#2* ztJH@LdtZo@?@1tw=ZXfGW*z6k31()!GDu3(p(vhcHFhF#`1F!-I6(l|3=wa>dlDX_qlk|#D|_7o;bdccSUPmj%!#GWxoT|9yxA5dGuHgA4vi!IPOv)*7t{z}xP*Po0=(=wqZBxHw)Y>+e< zm5nUj{=BOzi2}HDFCpB&9;l$dtqXn$C6s-5!C;WOP~BQ^DBn`P*Hl4_h7i8tRfI?9 z8&vX4@HG_>h=q17GQK;2@l8~Q!m2cpCcW$8#<1#mS;{WJL%~40tBv_b>fI%)!XBj} zlZ=O-iwCG}=zfq3st&q6iQ#At?bdr^_dI9i+w^#Avf~@rMGXiW47Q2CQ!4IRD1C$= zfZ!FVjlT6DJO=aoB&RY7Y)mO7noJ7DISP3u2SPb1o(D>N7oq;M#%+rSC18P8-w+#< zV=0$0IZ9wDYYo3cQq?exVPm6ELgjlGDXt=*q!crov;dbrkRG((L>Dz400kh-+({zw zNPSJc%X5}lTzuC*lG-ER`wh+2-|b|HKYb|Ux&2{m^D3vo>DWqmZWN!?l%a3h5!1t? zr>>7?Q!wZodnm6aK#2pxM zO~Q12Xmx6EYw|7~u>Lb{b-+Zgix<5(p1+Irbj7*YC5jnt3>(m8D1nP{IX*7hQ>aYsjge&Q; z8!&SWn0{8#OJu%-K5P^@JoRj)-RTy~;@AIN7Kbgma2ZgnyF&8tEzDB`D;=FC4y-LI zQ!^tr(`2N@(pQ4#filsZ7|UoQ<_F+osx+%~1Sy7xS`$SsE+BAe1cAFRN%Uf72fV7B z)wDDv{9WrVi5;cV7HC>6^7yT$(8VLd=Fra#P66BV3&w$U~=1hw9QzbDYtyIf79j;Qb zbZblMdP9-*GCp4_<9J4=rD#1Av3NV9?=v*UE>jpiS;DFVI~bIvMz)ZYo1Ss?<4>fH$}O7JLNvJ&PwiTX{o1uc30TW$ z+~Ka;ct)}2lmqrDEs6Sn)2537(M%g>TYxlXL2*I+O^jY3EeKetdbYWd>KA! zf4=RG)Y}f;h@{mva0Sfd*utXErOb2@ zxuCDGgB0}e)k0NAkO8T3FVVLZur950s;(!_9iu5xYY-n8R84Tc^L_L?;#wC4By9>w zYE2ukprPxi^}JBs6i?Hu%pkMoY_a!me#UbucCv&eXt=GW2zPom-Y;X3Ii@ndZaXP0 z8aAiT7fMjyqj*={P};d;CDMF%KFrZ!dAi~Q=0B&8?)2tv8$9JA@;Tsqt&K|86SGK7 zmO`7dKAV%J4N%NxOS#m#cfqf`dx@lptxJMDW6U*&jK0@A?kgMmL$j-9;vMY2f93m> z#l)ND-R18^zWNjh(JdJC&3{wI;o4hB_kkob5ZNGTO7h+1TG<`c}$K}wy#s`mc4;M`vN4U7e%^m$s!~-vyZ9Vs3xnXLk zf^hiYIJb55P;Z&1Cvh)%svW(y@mIy)DBrL;9a;E_C9C)~bHn$oYU1PfZ8xb}J}I{) z%c0==$6Ql3W0XP4atDo9K6(IrLr3`ECONBwxE?u%oH}}yq|uHzy1owOL{g2scEO)J zNRO_gIC}AYJo?)gmb|zzf~RTH(W}^h{}51onxXhfrp`=dBcFR2>E%dGxZ69z`Jjj3 z-mF}DBW|5YXo6P0;NG(9O?{K3&)lTIb7Nuc3r5aNkCZM`mV|SIH*sO&rT8qnmx}1w zfTX?tN+CsS}E2$`F;n=*T2icCTxSFu{kT(s=KlA!bX`|x3 zGSc$4csa)h_{@C-+2F1imD zBbtz&+#p*cApSYM&sKbXOvZf$+hP;u3aFfzn6NJy2*Ia48Jz0Shd^kN8)EcE(sqGf z{#(5NCaNo}p)~y^?9SE%WewZZfxp#!F<(*QoRsi%{Wz2Se$g2i{9l{_@*AG712sc! zbnWkC$;e$EU7{_N9s9*6t!%hlA5(SPaX{t!h3832 zOo*B2tZS>0iOq1c5lJm4>+gg~zhFC&LhlPpIxebeb=jX=Y&WgIHg>IKFt~G(?TE~u zU<}B&`{@-V&1|6Pmpt`W%!nxDI5WQBHDJ}cza!dc-z9plN>(*qD^#vB?b6Ybs14(e zm)oM;`~$_EVkB9j$>}_>54ixsKQS20W_!Hjk`85Gj7E&0zkcF;6{$KVQ7V=B7C*hB z;E}%GFdKfUSML9oYZ!3g)OehCcT?`|UP&Tm#z}*Q>A&B1Co9DXWA4&R-k4IYxAOqWQ&yZfhXd zX?n@)^Z+7%EY`J-t|Ng_&cK;kEn1ay9N1^^>JPjWR}5d_F0Xquz2Eh5T_sGP54W&@ zV>q)Yi%kGoY+Ia&Aso$^4swBx{QL!CXFAW7eD(8P$q;A?ekI65ZCf}6yAueX{nsu( z5G!CN?0bB1^U-!MA57NqDb^49e6dhq#to1Tr#@4mMZ=cH)0s&T=d7yO@%uvF{n>>q z0s8-+Jwg&YQAOmz#*o@r*yxkD)E6MU^bK$ZE!!cmFE5tjjO0va^+%hKK}RmQi3X3# z-tR9N0}%fChs-cGW&3g6p!@1nC$s7@tVjQD7B%4#jG$$8nn-Qg{Bq2=(pxS30oRbm zWD|(Dbk{ zQh@CkBsjAlk)aM(0ucv$4-&I4Q!gt23`$nhq?a)v{XP8GJpS}2@cV1m*OH68D(6P< zOhF&(j7rBoV6*lu?0{f9ay7Rg#y2!JV9fOL2|O+f2g5u-#(xg_Ku^+|&3q83D*0sF zQ?tTxFi2QZx2!U4D|P#%-+*t}yh4QfMravL>U@7q&$}wn^5us)+bVBSBjf;H7F@l! zs8qO*7pJ(dBR_IeHms^5kVM|_^QVRx@8Eu*we?682XqIUuWmoFaHp|5*uVfAzOY8h zc*mzyEx^~#dg!t0JXEGE5L}DpR(3cik=qy}B)<_beyNT8U#{sn9ZS9t=fBF-++^_Zsns(+yHAwEd zrh-Tc2wUE}FZ#yg{0JqsY)N>;XGq>p!jwYCl<9EqwyKDggQ{PgB^c7Ty0;V}zmiDt zjM0dYaJ{47SZh@L-cb7UUMEcL2?6;3{PEI37TuWEFz-fG4?(%#j(j}I>@cp9Z zybe_N_2V+sT}_g0nZTig;!vW{{ig=8T@jjGsvCjT-p95;ZMs9Fz0;5^Y^5$Q(s>qZ z7S{qwv4t@moPX|ae#7}_b`Cf*!G4-9s+OAiP51e*QHPqSB0&yHBf5P9 zDbDqCkDPx1U9ZpU_hf7+%}400oMiT7sDc9!6C)gP&5TxA?=miqwGxAZ1V-Jg`Ou{IEH+*=92iKah~X2HO}S7RvedDBwyw0l8pX-)ijOh zT2z&cnwK3360t){W{-eZmOe^DtFdRXP9_PxAy+d4kr6wa5%>1|=iS?Q+M%<(3j9)0 z)4_^W?01?jd~sB_5vXMXw{wZompI1WC}Z$#;=PrcT`UdZd<4PpFAx_9#BWAXP&}*ztu`N{n!lXV3&*q=mec^PatOyFy5e#gi*r7m2Ljm3*Q%J?Erixps?eRMmnM_(xYLxCF;It*&$88+d5hwD!OdU+*r_)*ATyOS=;Yu1$ zhr_ljT1Lcc`Lj@^;Jk=TvSI1w!&0=iXB?@59a&MEF!-(c@1upm^r>j8@kwPs3kYFf zKe}di!JRHqb>%D%g81ie{gcsX8}>Lxf?tx<-8j0Tx6!+E>qP5l*6u~123uvt1hJ0Z zfaB5GM;eU90x4vGBAZrYGx@U)Y7^b6+_@5=Y#52u55IU8z@p!_&>@x6j2XvB5Pk*+ zr^+Mcm<0p>ww-brO$owssdxP(Y+ZL`I3^~tOJ-02^|W*k?6yaTz3ig7z*co5ImQMg z$IwmrLylpK9%~rOY%^q2HYo8k^+~bsGyXw%b*vkzR3%7;+imXaAA6kC5g75`9TGRX zS;G1qTGQ!Rla&FC*~$58K+=1z4Y0=#RUb9U={pm26=60~WG0rub6t~j=Pu2{%phzY zbJ}bxfYe#&)DUp!VeQ#tE`CK&=^gJEN;&}mdBU$ci_wXB(^;BH9gJc|uXy6UGNagS zsj`}Qd-8wfCw9FgtJ%sDW%&2OflXEgy_wID5TMcqa9B;tAyT>4t!#%ZhKA@qfXqW% zal9o&K3+-9W$0t;hkZW~i8-t3cwuH^0g)}*YEB6u7l8;W)b4&zQ(B~MM#zf+O5z64_nW{90B1J$pohN-2Sn2 zooo#*kejW(oty1P;@2K;8ht2JU28*38W3N*{l3=$#zh1E1&c%~UQaeEKz`?)3(Et! zXvjGyC1X=GOK}barSI^#aJA0-^wsj8NVbg_oQq$n)QyI2BMwGt=ClmKcaGpNR>Qm@ z80)N|i+M$Yp+C@k*yuQYxF>q3cz;OoW`R0h)7jFRFW?Xy%@R5TvPexN!HM{`)hMew zTrGV3VPw^ecKS*GK9g!`Az_MNd= zq5B{-1X5#>J%Uc!lPOV0!FiU8A)s$h(YK%vtHU5MI@Q)Q;W(sddyZh+?1&CXYIZQf zY1{U6JX)+0&Ock=mW0HxvWJviq{fR6k=urc$bonzoLDQ#bH~D@Um{Xxiza zhxIyOztPqToU(CvVgzBy)Bbk(!@?C6W6|@lw=m4@_4qCHfvNPlls-ID2$NH^xK-!Whhs`K~tcj(OT)?TL;d zwz5l~K(#9%KKI~f_>FaNh1W^K01FBppwLiz)!tnA#wLHujmd#wSrh4z%kNA%!}I}J zP64VA{Q{*EXx);G!0{SYcoGnwfWNlA*P6<;L!>@~y~fl|v0t#rC>p`13p0(t3ux>a zhW4m%kb0x@Ep@CDA5<32PbmJk>&iiEayGOG12!~%)z_HLNa5FD6wtT)n%&fG z%_@ELJZ40fM_EH)U^pjr)#ydmhufdfg5#Y(5!JE3!NvG3gfgoa zRA>m#X5tldkrz2XD#wQWAL(Cp@lP5eJO_QS$Ah48bvyId$j*vLMNF5Ri!uBjc3&P3 zyYCj8R*_*;Fp2*`mF~F+!IOXbwJlt((Y;$>EQ8D6%7t!7TOxs~dI{c|8G)S@NJRqa zT%gdqrWS|qe;JELbsN8}>bGswF$%M^X<;USewo1j50^D$uIz^yaYUB&Sv_W{Qs_=>dh!ISF2|Il34OzV0eTGMuKyMxeS4txve7_XK)@)tgvQe~^JY4*<`J`|ABiX`>`x%m8R zW`;!}WUMLOk{;!~B4mFqD;Nw!E{G%T+&^f+(@TY$T7b#4E9EguGOHgUng4C?^50R~ z9W-yW1jY3yo2q1SsFbbB7R4aO-gZd7=U1>!!On$)-A2^R{lW}Vtyb?OaHx~2U8A>J zi9J?Q=U@_L#8-l9DiH|>=a&oz51Uk26rA9s++ttOYZyf`Wj+7;50_%L+ESZ>k^Ve5 z+UswuD?MbgV*jtZn|+mV^TA)agO)Pn zhG@bgzrQVOO4w*Zgzis;xOXud(pk5~9@>R#zXoPS8*gg7w&(|7KAZ$*HoFHJF`wJ9 z!r$ycc;csvJTZj&hS!Sbh47cJNF!N`=wIry(&@Q^Y{lD&dAq6z**%IKc8~Rt!9M=# za$GP(4SPUff#LTj&?r%-iczoVrbB?;oWjNY-XIH%0GAs12VJ!b()QHAup}G)s$mc+ zHh5Ku+R?t8eFJk(ZNHx=*|nBBR^2M_W-I2$HwPGXG36xw?fivbu+(U5k3WO$E(Z{=MC!4xkb81c^38(-S6sDAd{eNcBOor)r6j1t*X z^#X`-@`c35)cr>xUpKI{lYP5wGK>*LENRU{`oYKUJ!kq#4KA5zyw#ozXC$}vfyrW; z;OLM4efu=?6$LoZ`+p_=7YXOE)x%A5tJ9DO9 zk;iC%KMBu!3}U1e)wQYe{_r@&w{z>m!nAdqy254}ACAF;AhBs|r?Xw8b4?n}m$4#G zap8m~L4SR@zUz^XWWfdbl?8pWrxg6k1d436ly^}7!Z61&8iVl^nq`Rr7~0~i%l2~! z?$$kDjcjvV@!MO3r^eaEz+hud6M#yM0bR2w84V<&|K+UH5&11 zb6=x}m&HR4x#$)i*mi3bXUp+r9bI_Z;s6_;8|oZp4iWd^x217P=f2pUu)pQz4RuTO zT&;@(&ADChqf6;rHwy-yk<_kso{Y6TvcFC4#*MnPt6c6!VGCL{q{sh1-rhPc%B>3< zJ|IX5A}9z*gNR570sMGYl2bO?yFbi=prVet4I zIN$TU-|zi>e;m#@j?8_pz4ltyy4JP!y^DpFZ$02a;r-_gqHoojH88C5<9$U@Z?lWx z))GqRx|CiVd}xLleBIy+20gX*08b50@$q9Xz^!g5flHagAIt8$&`$6Eb)l(ksxw^I z@f6SW*+6K0&`;T{HpFU%b3L^cId~)C2`-_4d3fqx2R=A8t#xy-6K${9dK+2Pjx_s1v^6Ra(I?NhuidYGGC-Q=G%p(2L9rDhCZ(_*8 zRhg$J<)J~%8e9Lpl9*Sd>ew1R<-RK_HYM-*C9BQ#y$eHsKi_f-AADaiBYtG(GP9l< z(cKMCMy!0zs?*G#o+8ll1epZ*K6cA5C@V}t4X6uerGRI79o(x9xYs!sTfu`j65fG( zwG2z$TMHgFQE9q@Z8XoK*L9fzT2>CsvaW`BYQQWU&w~dA;g_6;mbLKcWp%B|t*vtn zIO#|tWe9q_JT&UF2A9DdiE9&m7!(8EoYmLz{cq<&zha~Jy?dYq09LWYQE=mz2zIdQ zyx($(S#Oop&qems{yP2TwMPiuIMvZNj!RQ~7K@x3E8m_s2_>pt%BL~+n6ym0F;EPBEVVtcH5T?Oeljhm0#`3!-Ts&S#s z6R3*C1{{3rd+lyJc>*=C=dUVp&EmPd@{GpCTX0%FP2mDl6X$EkPPKwvt0onoi8ip{ z{u)mk36@YE?8d)0?yyS25YmE$v7*(a^w~{v!JxOjpflGtWVLj>H` zFgI4`79KEJdVC|rZ&y2bg6)%wj~C@cla)TH)FMxM4~8r}#S{9&CA;N7G_0HjxB8wQ zc(G>#9{A0ji^*rPaQaWR5=Tlm@c^G>1G~-An)1MF#bKUH@l}lK7{|cE*=EVHMLGa~ zajsR)QYwGHT(xFeyK)+O)|&^}U5{P4>I@SR0?I>Wpyiui%^f#X-w4HnRp6RhAsEq&yoYI_uTr2SQj{aZ}s z#LD+Cri1(dY&j?>=^hG772LqoYp$oqsK|I|#^&-Jz!z4-u+!E~;zzEii$!rB@>3ku zgguT3nUWb*uz<))UXMBn|7muxUG^_^l?-^Ol?eE@NvY}#iiAZh32dW6H+GQH9C7T9 zomVnd3Aui9(b1`YlH%_hTn33{lEw!2z*HbpKJT*`_uh)Ly*3^iJy}B^S=PMo(w^}+ zq49fUJZ8NL*hV`AeNi0HN`Z54^If{qJjt<*n%o!k_a+JM`ho541Ox6gzjmRHk3~YHSW$r-2mH&wu=mKJ zyA%A^yStd89+F6Z{=d5C-2zeA`JpY}QT8Rg_vhO0fn9$6G{!O2fn$!mH*SC~6*MFo zrx^b)Ic9!*U{3#-+s23&ujNng=IPYmi?+)K#TLtdi7gX9kZWsKPey)-(e1>Kto#^T zZ}WTW{e@)#Qb_MJ?cWCc6((*yM>4vDNTF>JN_OF&Tq1>#!T)gz`Tr7H0{Ooa2em%; zkDw={<ZQl86Veb}4-Ir)WB%!FFa zKc?de3N^)Pye?UtAu{lt>%e@TRew#0xl3dnY+?L$nS_FbR;Rsrn14!)`L4m z^@E$l!#2|CdEbu%BKI$Fd`i9xr}7crxTGbx8@AhDzba`fF_j}5l5CWMlT@-UO{%8L8qM}94Xv9F6uh!CAJ8N*=~L^yVm7sN zyf<>BCR59>cRt@BZY1Asg<7M?$j`jL>^32xk3q_UkoemNA;B>fwMnwFuREIR0&Ak8 z+AieB6`1s@lsWulz$><74fDHfS&1K6$TeHLs|llJhHh$pA5sD=V({X?2*2T;r>C@< zL)^!^O^jdFs05RWK5I4{BvP*(^!7P@^!8C2jgUiB$}{T;uxj|zdZdeljQ{qlzp#6O z(F+Jle}By|hnLRtue_5*wIK3c{t60(&k&Zxf|4VQ0D~pt0WdNx=Yt+bUJag^XSDL+ z2rTItf6S~P@mGRP4#y==Tz|SS zCRI7YSfXc?4JB_aVo}Pk4y-Z50i_iGqf^Sy<9AeK6~ag3pt9+|0J-!Jx6Tg;_b-H! zbI`!`rmP3|Y)?poVs>2?Q+w@z3PrsywjR2`EU5O9$|StXsMpm`DYhCP_g5!y2hTO! z?bAFo1j{iGa2h;>?4#Y*mbe$Up5Q7OF^?&y(D+SthCHCuWr&Eif1h*~u{1TVe&fO0 zip3GBV9_7PG^!jd?xgetk&TD^@W^;lb?TTZBes&=5^t8QtieBcouQocwyHE zHF*!GQG1j2jMQ=Je6NL$p%0#qPeDt~jDb|riIK+-K`MsF;$9&z6PBe%dNeLHU1Vi#u-+>h_^-gfyyR9@=~sXopDgSSEmZ8Of3q0d z1rRFOb8!iVZ6q&pqdG&5Cae#_JJ%t+ll|a`;8#73mH(BMb+NNxa^7bOT@U(D|K!IdUJQnNEIEfl8dm^sFdMsI*iQm8W%%;9liw#SPc0w)VD}aQep; z5!gn|AG6%K%5MF*r18+%{Z-h-`fkd&kg9=ltt_F|YNwfO0YXX$+h1eZcgK_bKB>QJ zo4k@`JUNETGLwT<4#Skfh zjdT5=G!X;{@SBlw8sxb?5CVK~6awVNYt-HOB{u#!8xh`5D{>9b*<Fg$Zk0;-j+tm-W|b!#X{@N5UUj}6;MG}kW*2dW)}pfIfY?uejKagN7zRbCJ| zG2}k4@r7B~F*qRJLz6cxMg8Zwc#mm|(xoWlaY+zUAOu!&8+Kd=QdEBf_-W1R*$c(snd9)xd%E-E$JQoRplTf9oz+A`D}1E z5jI)Rkc0MF>Fqb{=Sbu(j9u&I zC*vHca2c9ZZ_3~_sZsB26jmy{p(A5;-%9Z>PVV2n`Vu6#C*Ag45P=8nw;L2MJ2wEbVYlq>)hVZl2!PKW-6_m(91k#pkbj z(f7)o7rhVvvk0XakZ!}Lld-U89IS_?Zod#fBv0CW+K3dH8&} zYM4pOHAlyXf_KC39-y3!Tq|8Eao!>{#Q~A{7d9RFzDaATYwV6N=?*X{{gvHf*K^2c zHz^ysKU)1s>a2sg^?VntCx=U~8)S8`VwoaN4fei>>>!I8^`KKc$mwcqc0h7A{qReA zv7nl-s+`)Dz@>ciR-NIdnPm1dn&~QRL0=)rzyA?*B%%pL)p#Ic8bv(Uzn6R=!=eH9ng=dhO&!f2?EOnPbg17I7_AOIiJ!*=#!H z@y&irAM^6BZ;Gd>r9Rx^JwwIwrd;29xor5RMukn-xHBs4p2YjAl^0j6x?64JosT_j zgK@HeD(o+;00K1K*`-gcFMMzp2g#kmv)Ti2yWG@!ePRBFWS`iO6A}o!Kd}8TLFlrJ zj!0bJH4+{p1$xRJm7436C>3$)uzz(H`R-hL8KyP9oTij-sGMpaxX}5&G^s0#YRT2+ z*ulQ8_6HS_h~`vo%wC72FD9USy*@L%O{oKKhJRZbGsS0ktcRg{E$Ok1Hs&BSNO}Qk zRaCmaJ<5c1JX=k^^sLiUX66!IcN8PkjyKAz1DxaG7Yog5b{!QbE@?1HkqE~>fAdT z>pU9|f8N1V!ssQ0qlqB7!$c6nAWl&u?4s5W?hsC*aG8%Unih(#DQ2>9=KFV8_T4ls z_Hip*?&yy^fkA;dQh>X3t^Bb)5y$U{wlWC($A|!5Yvl-jv_y+Al3qDj3Ic4Sr>nG| zT_CSA0~uD+R=D-T5uD!eif7M&WUKKKxni)qmMzK4o;+)Pp?9`yLV32vldXBlpz;1i zt<}t0=GC@}-Z-j}kBo_l>`%asE!!MQ6#Y*`27#+H=hFVwd};e(lt# zs#MR2wuo{E1h@=zRlrL3u9psX>=v2sUcdTir}NW0!0eL#iu9b?IR;X47ti~re{YS0 zS2JvZD~payBZ;)gP*v0OFzu?gKTvM<5W0jTJ6yv3DzDD^^swieW3Kt8ZSJW{<@X)V zgsr>FRK>s_%I2No?bDp1>(`vJd&CKfYWGr-^AKeSxxygj@b-isoi(68=p%74$&VCz zkINSG-U1Vb^HC$`q2V4P$bjI-%Pc6+#r+FhKJ}5tTa1glN^BDm2@+n2%Sxy|$vl^o z-4siqX~#=yI~H>RvP;w(ueXgwvM;i;=NWvW48A8ipb(XrOAqIhIX>X>CNsKj*rm|4 zeox0SGbY0R^|PCdeJk)Yr>V}ubc6cwrUWF;M)UV5ah+zo}4))7t0S(O1yUDV_dTy^4TtB?M`zg-;*=NI=y;JOc zm0F)_)O)gY^2!T3)-ML-eJ5k*VBgemdlrS9a$}E~&>Gu0Pwz<@juc~kS>vDuHSG#djo-z|) zIymF6Z~0!yn7H<{u!6>856Qjwc$I^9rFf_zwxzvz=%Pf+^}a6cz3bhxo;^K26!qUI zVHZXGhV+Xzr{H$mQDJfUT$Ti020XvC$YeIlA}Cq_PJ`-_uI#Xb23Y=4UN@ zzo44 z${!r)Ydirq<_BqzMfKAa#nVc&FESh#10x%>4V@s2dUX@6GwKPf5{?f&Xbxtz={Hob zTitd;DqjWBa>JuT8aX<9LK{$21!609BCNq0V<;Bg2)(3J zxrr#gnxQWhwY@1l+o~!E_#0|OME~eEk>PlmeR!&Hp$YSlpNo8(k}@ai+#@~Gt#rQ{ zbUWuH1|3K=J-mpyqkWG=yQO$3y7RkN87vX23P6$apPk=vbOZGAVW>K6?`45hLvF$* z8aAVB4b>mKi3^VTOeLIJDGRRZps{mMX%kBR1`36qKYbK?q2nY!B zHs56Hll>H4990}k^WJM&)Mh#+=ClZF+xvOF$Ta2z7dvNItyCpfK&60ELqmf>O}Q2F zW2Tl!X~%VbOWek}-byWn(kauZZR8!KZI*g^_#M|Rc@vfFIEb3LF=M4NT!IfSe)!aW zyV51;-kskiBnA{gm`8p1i#i{R$(q`P@LQN+|FGqsjgwW-|5US5KVnPxU?)ok&h*9` zAvfdqLM!-liN)jrowhO#48-6TKbUq%^L3P%pN${v6>!H~%it zer0w#$Wvp5P9G|BNpC@0pwAv#smWax>+<>tW#9bWEPwDzzvu#3XFK{mm~8TKFIAq= zs3fv!eLX5A2{u0%UaLjxwBf#n?9;E+psiwCxBIr9OGZ#>Kh5u0uM~CNEL{8YaK?xJ zwoK0+Om^#Cj8P5_G5ns+jeI~WqM3D%_{2lF>iKO~;65Ny?6($`1<`%GKRg{=2#(@G z2YlnxXITAxA4;bKEkMazHlgg4-@HmU)Yq%j0Zi3D+r-=i=2}IXUAtH1x~N9-Mjl^1 zubi$~9H(N{cFXjNB~vGjVDMO4=R+HM1gyY7s%k7tm$^?pJGdWU(c1IVh;=jL*|&G4 zsn0Uz69@cc;@7%Tq}*^HjfL(&Ees5O{Ikh&Z?_5ENS9XeL>&HYqa(Iirpm1AocLTl{ z5Ta0^nn-=_%Wm48^)=|%#$#HXDVDrYQGO7?_g~@1Ro8Q`gvt^q({f*9u|jq;QeOR| z1%E*bvaQ8Yw#Cob8ducd+i~nEvQzCyQ7+XiJEh&LZ7RT56)nJrZI~{(LwBP@uil?F z&tjagr|4lRSPbpgOH1#nW}-RYNGH;HOF#Wg;=fr~%7BR*PI3VM7H{4gG{3s%jF4)? zh*QKsLAT^ljCs$?>3|w5Cy4Y*nLpkIX*q6za-`>{Mz|yEzxZ_F0;)X)nTpa*p<9nX zWgPGHq++8^j5DBE_*V`*h6B!}Yi_?D7ua_nXFxMf{Pgh}VZGG|A=|MMB%U0A#^XJM z{Og3J#y?4sqnRYYi8Fh7NFcQObRVtmwBG*lTb}W|g7|o*&SmmM(6a#AW6#D+K({XP zPj&$uUjw>zz&HNct^05RY98dd^k(OoPGu{FhR}4Hs95#i=hZ9-_6_Gu(lpxnp!>#W zM~eae*`;2i?2b)1XHb7eIvVa(3Q%HFw%2R&;ca#6)o&$y z6NpC_Y>4+=;R$Q?M$6C+C^_bLFT3JYaAA-v1?XO`&^B)aFY$T}sm+S!aFU|8(y$-? z`pjK4^j4b|g1D6c;+l?bKZ#XJS-UsowMS)b5YfCiP=~q%?3%L_bOw zwHW4*I=-NL?kv)?hghqqE@(oBVOr3tsA3tbmY&;6bW@Sw`OR>%jQ<1U{)`vB^@;b> zW%2uS!3z@a_9pOX6<;2Rw_bwt&_In3R2BaW3&psvize#R>JfEm?0klfGA13C@!#Gh zcUZPdniiTehqb5Qo-Nas=DZsd!L3Ef9n4vy-kg^_h3&(9k(Es*WN;u!CjK)^vSiuU zi!U(5qbCXw5zd*+n@c0xDOPo7_BYo{V-O=2P#_*Gpp?~~fkqsLBfE{$sJ2Y<12FBL zo`SeQ`DFnE;b2V_3I{NAghZ(@6r^3j4P;UoFaKl}@p*lT*z((lpvJ9jWjX!X6H^bK zz1oSg$YyLD?d+pQ2KTQsgh4-wt80cMhi!*9^F19QmFut9)8Fq2^TeW2bz?6IQr_|6pak$F!VnPIXGJMftrLRCYgBK92!r@lu4{qfR9cTE1S4U1wVH=z~#WJB^FMG#!~7 z?L!{Qyk@8(ZGA@o-^@@i7oeq#z-YS0=PnB#inQVk99z!EMoeo-8HFTjNM7y6)7xER z{9QAFvkN0Tre$@R2 z>RU>8WrTLnQanuf>$OwA;xNshH=ujIwt9sRy&S&~P&q5Ag8K!nVTd2xO@y>=k0l^u zHViahmx4MrCXZLrR1HT@4rx)F8Mn?VigGFZT`hq?S`G9QN6{|88MgaMI3?~{b>Of zW1gM1##+N&?8*uvw*67}UMSyC-TKukPW1BJ`KEw*Mt1(T!tAdH$}0w8V9wOtwEI8fBnxRK$Q}YP!(> zGW{W|itAZ_DK_KH$|B{ znHlb!=w1_)J)1!|6|yCgJu`twu#2`w+YCnrR26|`7VylNy_q-nyu?Wlwmm0)B=L7g zVly-Y{IU>o)K6)iXVLPn_C7dTTx;>`ZWCLcw?3(Lf0h*{?@#wsA;i{uHuI&)G)ggfTBA4Wp~Qy9wc{lk{4fD z0(xKF>9b2mw8T~^>Kb(Qwoy;dC9<4Hg(`CQV1(aj{FML>;sQ)A?&0nJjy(t3?33#4 z2B1{yGUOAn4?iATE)Ad_lEVXc(bu!b9^S}{ZM@g2Y4FfAt>9X2$`z3x_?gpp4_Y&; zfW7DuB(lMsKpY4a@xSh+yfEwhk8GnEzzk|1@u5=G4`rUvCjOhoU_ z@Ra9&klxg_N!`wU95gLcpp+MlGz%}9` zUx01IT`{UawbY3UpMXP{YW!tHl1*NDz*D?TL^#bSacHgZu+!qf1i{J;@+c;ZY5q1P zj*8xJqyc-s+Kk)ETYFy1#}a>P7snw9XffYm6DBYR7Q0kl+IW~}9#{Tl!7!~Ojg`2Z z)(8hlck%5roLbb|);;WzJYMEUtAZLLOO!pO_UWUzos+Gynk&=HlYY}8RmTs+#&;pL zm4oCJ;EuPIL(KM}5-AOci@DasQ>sFHxP?m@G+sLg+t>m>a=e@n9qPS)LKkS9b|^TC zUpwCTW3HPK&ZWuXqn;Ifn?t=JZDra}S-~G{RvjA~+vJj@u_0J;vXarZrEvkwBsDe9 zzBlv{Y!!i`aT=B9UEQkp&xX~nyZ`WzS_$`26q8r@`As62jGPw6(e?Zrex$ow$Fxn0 zZHrc%Y5Q?vgI+Bw>Dg$0PSh=1y}(TxdBH5G_*N1trL3HO!o zfmi8QJa+@FCCVQCA>s%{%VBB`CnryGuRNV{gZlOQJh!$JY~!w`X@*9!iIxM&x+x0& z**6|+6Pm|}YIQYkYb*+yKdz|zQA@|3sW8b*K)3r&rsTaO-c96keYC7#6b^WCN#ZNOuZ8SB(YmXlLKK!}0TrM723k z!rY0uECDJ!9S>d)G27j|aWWF`fnkm{x?IpawAh|AS+hM}UsQ2zmfr|)d>ZbXb*b(F z;SjeCGJQcdRTI(A0Mv(+(+A6N0RniHen%9o<=E54%|W;I z5h3p^N*(0Ze6!Vn&_MJ%ek$s1Vxr6IC#*TvbLTXcMgxKo-!xjyA^r7xI4pI@Z-*iy z_OmI}Yr%O3WE|Yl(b{sLbW&vff`CMuV9T#U=*p^*c9*SsBVfQ&oaex;0VhZNV~sd{ zKRabY*{SNVb=UdziZU`9@xylR>29s-Z}j4y;=IUi{S?_I`jD1~ChE&Gc4for92&#o z5zpfK@hdYVPnv4gUQzb=2P!S*{F1jhpA6=j+$sKK&D7 zofC(woOy(m)3HU0%|mX-D+c@JQ{3n5G1k_M6>b}=qf^Qr{pdf%PFPf3BLr_qqiRpq zTQZU&T`4OF6G)-sP&Gx_sVJV>4`nw_16cYc%hk9EqEv{C&;uK!=RolII9W)k-muZ) zqw_!k|BC{qHNKA1SYv5r1I=apxZgG-&Arakhbg(QM7qd3q^# zvAZrP@8PVl;7jwN&widgbxBMlPwAcRej3S{71Cs{`=F}>De5*?<|^6j_!ox;JcNiN zn>a26CURBWr?>>ObZ+=;Rdz2+q(vkEj`tQ3{^s-l5|tUuzOYJG&q(`qigAp-(9XW6 z$bJyJ@1i?KG*1urP1JDI6m~TzJU0EFIYwwuRkcJmbhag%w8XUyw`LWYv5ODSV^4c* zsj4ZwIsbLTxybrv7};1tdqBv0_p-jMWVD0+<&^-E7m;RdWw|aOsAh@z(3RgyZm34> zR20j8u@oO)UfX{v2g3m<-vK#)o?j9JSXIGtrz?#I0M6)=YegB{-)pSkvcDhj( zppT)+iop788N492t+%nuw)~SZUTiO8e8G~~cWt+9yv`kp0fHFpDoI&_cVM-@X~W@L z!=a~&WiBj#2x)_(p3MhYOVB&$DzYAY667PW_e74cuMv7S3OC-3Q;YIaKJl3}m3sW} z*+MpLfzz@%I*M4>cx3qA$kk_!Sup~g_@aXrG-+ym6m6@%_r;mhog^2fF*3;gp388EX%c3NN#>dQR!zNUuM41$Eu03C~- zCQ2#ZLy!LTll}s6*W;r?>BcLzF~64Uj!$oG(OH5RdVXu-`&XM0TF3fr!&NwaZ~a4M z4)t&^wzvxt&2$VpeZ`J81W0~Rb?}*?!u#S~dKX2RjzMf}gO*htAjkXCZ1sWu2t_P5 z=LJH43F|&0D;EBUwlzAF{QaXGJHl!F#KQ#JT6s#w!+@%%VPA7=TpR zP%nmj5>VxU(=i+vUzo4QobG}up%`A%B}I?D|ZDEhr9?Ze6s5~2(Xts7;QswdAzFn+CpJ51XzKk%-f zjeuPYg4cW>2aX!drw~C0xGUV}&x_vM-OV@R-H9z`X%ow?{9cIAwKcj9C0qY}bYO3n z3iUevk-i?XgBErl)5ucH5R=_|Uz+V#OD-4DsRfE%i|G7Ib=Z*W<>C(%vKse($@N?_ z&b5e%Zi<#$8gyr=v}W!rJk2ny!eF&xs&RcB58_&9(pcFz5Io7U_<@yzd%N$e#lwAbK`R z(Q5A=)Fm%r93J=Vk^V6AO5#PskC=0U7v4DpyvC2*FgNMR*IOK zDe3%NXATIhwLEuzR;%bPapB55P>fv{o;eN$Wt*=%C%enk4SsFxy%Hqaj<_sbiN3EfS3U+hc6tNMrPGeH~j1%cy-ORiOl z`(n2Kja$QVJ*xK&h|ZUqMqd$|dXzdePO4>pLXsgGpoSeTBz#?0*5Pz_nfXK0*9G)W z!5#Bm-_&TI?k^l*8-bg)ejU#8T7o@xZD~Ni9Rq1METs&;g8!$l)A1a`dB=)j15B}v z5(~*oN%n&iW|jyLRsXbXr)SR@GnCAb9Cygd8$q+nEG#V269N`VX5Oo9Z&f)=04aFo zgO-#j>H{MrwO4xh4%D&i^WS!2Zt%K(V;V21^L!07-eynC1S~@-hv+%8;hU*rV?Q*a zi{}zvjyF-lSRA#jOIejU)@-SHXi8UE9fvsP-4~vR_08}ZjY*trNKoGF$+FF7(A}JV zPqhY-K@U06%g}S*(Q_JtYWro`@7hBF%&6>2u=LlPl(NiNa>T<5TmPp>u`b6zcB$N@ z;Z7d|ak)dt52>}VFAZT9C?!wv0$hhPl*q+-L`Wf`cL?d{>exqq1-VZPc_rY3ye6A6 z>KYrf_q`mE0rB$U3}p~GGhN?#Q4-JwUrTJ&ao%xaY;OZ>U&&lbw}0VGkUACnFjlBI z%L8fXL|YKzKe#leUNW2}tiLx<)^Ix|?jqaD6gyRCx=2~`;B5~gVBWc}FUCvi#p=pO z5rI}7+xM9EM7y%HX8VvpbQb~2y58b8g2;hf+mv(8gBy8H;}^A-K4>Ptz60OlgcRbL zWv|c9tnI2jqgsOou^#Tn;-35UwmSce9;D*p>I@vNPpx0M_;V|3riQ!OJNy6HRyc+( zkNFSRc2H&4NF#c~Mm;nC`Msv~Y%~QVSvPk66@GMo?@KY!|?_^56L3>xX=#+N3kv!Gfr=_;!*&CYft)L&&zaH@1 zXY7LyR}pOnO^=uu7-dLeVKZwQYI-QPijt?FgNnB=V3r)BZgS`TLhYmX{|M4Cga(G* zvEkJA<%a!%xBi?mK89|x3mq~oo|ayduLkd0rFGG%=#?4Prp{S@~vZ@6k) zwn&@pbGRxfM@`%F)qxhHDRI&P-7b{Kmu)+M8YT&q0-%jVY6aZ(duC$B#5{P>O^&~= zd@xoHrjO&d;xy13&PfZ3#Jfkti$c$yA<9dEP=*@Gsg!a~PfDsIavWlvSQQaEZ@xgv zQ!aSti{t9MuV6OBR}{u)w8O}noP4h^UAHjpj@yc1W)5rsfZ->))S{9vL>uO}mPa~_gFYgw?5#b`K9vW}2x-BKR*jhK=(`6M|Jal#5zz|$gsv}~{D zKuE0o5E8R~jQa!rD>);Yx1B=V<>~RZscv#8zd>O*feCj}Ejx%cq$<3^e%f3ibYI6ifcCZzEv!|<#`Nn&guhYGi%Zr+Gv`dU}OZ+Uu+;D;>z4FC{&n<=xAkFDfv2%xLX6`#_;w zRn$VF@9v`9hFx2+l8Vy9KC}5J(&A<-3@0`Yv;Zt0I_o(!0jayVxH^;BNh8o5Ey+@` zKCw0w_MVu!J8fxEk9!4$RA>YuEYci~edCtD^F3nQ_mkF9TW3iBr18^|54M)@Z~uc* zxS9Yt?3=?5n*%94%hcNw6(dU zm}}$GDax2%*ta06N9E^*cDp!$$R?uHc!CJYK!5heuYUBHe8MN-tg2^41y>=FQ^1uc zCJYG}uT5pZ%6Id@kZI6R`pTUnd{(J?hB$yE;*@?(x8`bQgf0^lQ8TI8o<2RzQ(mkH z#GSsI%Y4q8nZ<_renav*DG>zu?(~g5S z4TLW;g~d)}{oLLB_)-We4b^bb{RA`BU~BXZ{l^c_H`qJ*cry0~zm<${fwH%hdIgML zU=Rb|X-F_*3sS;=j)#-@SEtc?1Z~iJ7@B>IiWQcd2GUho8JVJ~v%X-HJ4A#xe9x{5 zCC=Z=;cs#{rVx5wiqo3@T>t zQ+iw#6IivLdiErEOypQXnHGEwTu%y6@BO1I;|WHS-q69{f$_x7#XP<=^@!)AHL`^T z7sJhBNKTkm&%ks+MX;ES8VZDjNXg|6Jw`JgzdkO0rb#qM-R9F1uvr=bg+*lxLeG`% zGgpN;UFnERpS=hBhY!1(U%j2tw%m`YX19Yb|A!gT2J`I0-qEE#Pe7n3TxD@}ImVaX zE%uMRk3|moLJ{6S@$Gj#{7c*B!5NWPK6gDlDO?)gAvShbi~ocq(BDkM_v9%Q)<1QH zzM*wZI%n6L`#YM7-v+2E9p8R#(jJNc^Q24YimDa3Yf7S&MFnI|RC8XI(?KwO1G2C8 zJa!j)b%)X8jKc2@n^7IxXo6Gcyf?|UzOG=al3_PzyKZ72;UXacB^k^T!F`{>SXb;$ zm(`&88=D`IYsvcQYDH7;00lN44Y*&jNI$k~iLu~NC zzzSC1+0X4WM>MypeL#T_aJIc{V4>raO|~!nV&MN`z;y~RrDVAJCcf^)&<_pWM};m? zZ9hVlfegbP$$#QjbvE_}O&9Xr!YC_z^f*$k?pi^mUD>Y_1gy_4K|ufw;EKV1E@f?U z-v&sjB|BDs5WT*5z(s2Z#jCZU76T5J)j<(!4ceZzFg_0SKZQe7I7;k@7)r*o)!9PHCf%16GSPK7%mQCVTSl-iI!zL?de&oH9lm^#cb{d_Mdbl+I@ zMl%mI3mLbF%~qIpeqcmY>}7#M0;Lc&UsKit8yewx09o_azBSGN&6>=9COY5UOh-5j z`&&=_sfHuD1kHTT9U{5UA+W!eZYkOxi>M6}X*TF5v1iu|eiGAY~zW3+6 zUq04(BLQNUxJ!+EYT7n}`I2o`OvBC2?laWl84$~&8980M-_v55Mzb%#l62w+O`Dt5 z@)&Zv2*hkbM-Ft|LW=(y3gfYAhbb)31QQfn;C9{}SOZ@R=8esxc{Rv5RP(eG`M`l6 z?kfkq*COeY^Bpqh5p>RX`ZhU0D?6whzSZ6mY`?;*|L52Y4|H~nmFuBc z>96Qj!A~<55JZn`=Iq+DaZ4ZdkB}TV8K6k2_S_TKi(hPy1?16355^GQDygxIvD~7{ zZ8V0OSq~WYtDjupf|MK@Su~J#?R#lCq*f+<2}uYShV<3WLVDV7g5$68ub#n-(SUSbi|+-t7LWO1hm46~Sk*?eKcj5!I@t%#up%>Hb}c0IlfSK3{>W@$Dcw|ZE98oyWhnE*|t!HG8>XV_e7-Morfzg zh{+~rK}!p1`}#yF6^J~%mahTJ;wX&3o8;_Xhmepl@*Jx#d+c5$m{J+ z#5dFk*IQT$<%{^tviE{wrDospO##_BjbmFUv6aTHwwlb z48K}p8;wqudljOu)#)}=LMR+jRs!2WOE_+Z($rmKm!f5*7u`wvZM)TXw_QJJ%vRJO z)}Nen{W20RhwfR`bt_yDG#zs)lcBW*ZFp17-h&knf?jwje#EMO$FZahb~IwQ9sc`j}wq zo$-Yex4@Z9NW`9knnJvh^Tuq;bq(sZDO2cdF0`vZhLUsYIeYv_U@v{|eUqpHw^JAS zT(J$9=9YO{gIy0yBs4Jtz4z&6U3F8AkXtaOWmc( z^pw78PP265yN@|)<88Gc0O4N$0|?gwz|oSKVB|SfqeZrNqii*lxPv_?3J7DV})1oPqYAD2&KlGKVjsq_a zhBARpbOO;$W9zL4>`LUYr{Vq;AESf>%?`E3s_`sz{9NFKN^tlQ<&12#c{UMOC>Ws8 z(6#CN(PY>qMSq_zn~#U=8Z`k!;U*!FR6qx0M9Og&H{==jpS1D~p2MRzFa0qgwilYn zRrY0ZordcwjE>gf>G%Si_!1X;&~-`}Q$9tvtM9d3CDy3rUJe_l6osPs$rZ>o?T`I{ zdZOK@_Fa=!zUFt?vLEUp=di?&S$t?kpt|{SBlDB3LI2(9c$ce)Q(>4-kluw5IknZYO zN_*}{BcEed6*4s*Vm*t&%pc?4yuT9;2F^fPbD}@T(8mt6`Gv9*s%@OXIXFY{zmm1x zPy^vQOvjAj+d%~;T^%-lS^xwQKu+s_)~;%%yR?0Ao9Wn_j%;qR$~AxJAQ9Dx6_9UG z)5jZ6f(Q)+acJp}NVM+}&5?f6pL>fMWF+vP>uL`+6lzWi{ds(y=S?U;ao#*+QUtcc zC)Qvk<)odcV@XEsM!PyZd{W@F#-dDZ#-;1KcV&ruE;T(1)R4P_KFowPhY{@N;}jC7 zUOoZ7d4a)(039efLCn;2JI$=81$Mm!FCppUOBl{r3)_g+N|bOvP+;f)iNi9fY@Eiy z#V;X?V0xuja}mXDj0BW%Z(1&2Nk+zpzac9Su zLh;f8Q-G_7F8uA92d@BF-bA>CfjNOEH5QV{62^%?l_>wZ`IUcf{%AMZ73#Ky3@;`A z{J7)=U_CIA3eFL@_rq=3>-4x~@t2O(4DuwC__^>JUVJD4LogR)o|8C#Gw;xwr@(vI zzu!X*W6le(QwB}Yig_wEw0aG#d0z27G6KwqjMg9x*9MKv>QS+R(l3VW5;LhqK+ArC z)p@KFH50n+II~KhA_ue)iJGe4ESc9=>jeixZb!>=i=1+_dF|BHtuUJ`JV8YD$*KnfX7&r&&}fkRf+(`!LcJ~ z=lz#sM_j?|`@G<8cBNv$NPXH1HX{{feyv-@@Ir0msmMZ9i^%Lw>Y$=TX}nVom)!nKW+dk~dhGzA8NrFS}?{2mB~q*nhj5G>t=$b2)wCLcfmZjod_cgbk*@VR##(C159bW-VH!RLNdy-s@aUy?H|@iX`W7m7 z!Q55z-$t(l1!yik>8}?c$5}0VX+Y8W1{evZe8!b8DF%2GNM4;7e_(W7aDZ6FRups| zrl+Sm)ZU%;Jrd>nW$=TO7YU*Zm&$iiq zoz3aM=*&xR@(o@s3-8^8HUXcGNoUfl?e)1nrNY3yCxKdxBJ(Pka>KFe5GaZuBGbwgdA3E4w2S`3@Um@`m=S*+m7 z$np!nvElrd@FW#ugq!i?`4cx8hOv{Mi;TBi)@QMrrIsVp;i6>#%Amq4;h5s;7Ub$D zNq>byR$qDA16|6(1yCu_l{ZBHX8Cn7ohK6_fX+5aj6Kko>;X}Y*=9$$I=kNL-~=oX zP;)(+4mWQ;aog?Bx9Ja(>Q3XZ`en&{clBe0&}kVRWi>-S@$fZK zAjyD-xi-E0JXyOO_J+IkK8Xd2D{XCO`XQkI>T_yeAk*oo0<`+vZa-1q+a6;E11?1u zIW7WaOuhQ`ZRxC?3Fe|7G*oUt4rAEy`D9NP(L=Ze^F451_)hoti5EIcI%RYMM*~#M z4=+!`n8igEg6FQnFn6Z}Um8tUG})N(QSlQE=1nS z;2Dx++xryP8&jyh6|XK8H+k@Od*kDydM$lUgQC9937O2N(IN=OeLUj@Ne3d;^6$n2 z^s%JzIg$%_!!R?5JJ-RXK*XUSjfxk(`C4{x{-Gr}GWNUCxEk92UJ!ke-Fc+_9l%g* z+ipiYE7`K?M3~XG!UD(1er{tr$BbCO3p8t$-N}M4--}wDw(`%;b$q}gz2YsX8}V7# z;bp_hAOuK2ehhzN6)@AL!8J1kYZe}Hl2MfNY1k11a{2z98QVO&6;mmc>u#3F_+ox@ zfsR%X04((+;OLo+^*1s_6S3|?l{Vi@QZ%!OOyQizE<=>vFRy(ChkNU-_XpbdzqbJv zIjD)vGfKinRlRRYA-g|@{8`X}2SEb`CDS1VMo@8z3Ds5A*9a%JVQ9J7`PF!gya1}g$Rfbmign0le>UKja6ix3Z7 z=Wij5r)Lz{7pr*K-!L11T^O8qG8CeXIc)|Y(N)hQq7GrCU&h)yk@?_nFpu#^la%ou z(ftlR$!!%6B#rkpQ@eMAGwzq#i=%;^H6;+xmsQ7tx)adyE&wV;A=)&-)xods+Y;|L5VKxnM5Lc4>UV zcrZ9t%O;dOQw`x|Cp>XZMmF=^IV3o>>t&X>$%w+n(#{&IRpln7L3&4X;2a9Z5SFg) zGsjYbo_-eB2I1ewM9&5^iqk@kT%^Kv^ z`Z>YrZ2F}}^InL?C}uX|(l)i6Sue}exgasr$5r>$tneip6`BT{mawp%pDXq7xZ!2q zGQ>y}!5y)I43~Leotr2$uXCE9bjM-LtSwW*RSK2%6Jqh;mscCW2?jI!O}I02@7anvs6f?ei|BkM4Rq@PD{ z;Jy*yn7^BUTVDvA+0PnEs^o8o{&MlhAk9G1s4LgOi?34j8qk>^cZ0yXT~vy9W!8hv zmv-m7NP0C8GbSZ?5;Wwj_L&RPe{INtCbB`3V#V$YC?Z*28d?<1n=e=2jj!DLDKyja_%i;6?S>ghF0Dn7O5?RG=2&+<=w?==<;l|QHb{KB(myFa^RTy3LC zRUJ>aW;oG5^d4f%;$vCCyp`TvLMYMu;M&cD*@Hr-rO1P+|9xlxEn(8#;hb*+Non6l ze{nc!o1D`CnW2*+*!v38cfCgHQID zsYRayFY0^b)F8!hsD$ShOsIp39MmLpa3c>D=3kYbtI*Mgq9?&9(6xwt(DD+RdgoKt zf%L+IRqIi)XuYtP5`Ontp6RlzjyUJ=Ypb7pk{Me4t;09>F7NF`Ok|p`b>Y!BWYyAg zmuf3$6+1i?+1;cR+GNAS%W~Z;V$4wCBOo(iIb&3C#p@i}hliTuEy}E0 znS)x&ozIp%hOq|ZEV&NJjd+LY~#jG2tKtEczCt*F$fa(TD-9%C2_TVVQ@A> zaL+}t)p?w+2-?r=U4Y1vwBsrwT7XKc034*X+yY{@+8#{kS{@;ot&b=)p95y=@F@Lb z^7Gh))FzH=cW+(A@L}0aq15hLbu6n}#Xgo>!x)0$xe=(H_})2IzEgQc;9Ag+hoOQ=m5N``xAoe? z9+;#$_eaVl)xA0f1O#KgfZ#671((@i4zxPI6tj&9hD;Fc$r?si>q=E!?>ySf&U&}C z-`}2C^Ksa|AQ7Bu4{@Hr`>^^nH#M#IQZst)xnX&?HoHV53=gf)oL{D3lLUpw5xd%Pe~_Lghy$8iy@y zi1H)BTPTKr!k*>O)2kuYs;B#bL2ElA8ZLfhzrrmmBa>67Xb)@U%sp5a2xQV}-KY>M zIKRZSqi$NVy6s9dvbje2YGm}Nl69%8u3jA)!t!MPeK_QC4rQ;hsw9rl->c) z@4OM*jH;p$P0Bab7;f_6BZG={Pok02S&9w_p3i1pGAD#cx8Vr z-7@M!-S~O8Ur0k=A+MHmLmv=aV!=EBVdnuR(6!rON-ReWSwrGLn%cXvxi`V`&c=)W z$FS&mYs5a}B})VrtyH!5PVGlomK%0GC)P01LsXLa(L;J-KuR&t7}6XgPKpo#YZrg) zXjaM760MJ^8rFWq_sne@;{~Fzq1h&AGrVKS#s&$7%PxRT4GOJFp(?`)hjlid<0`{M zoNR6&Zbvql1Wo7!>QuNI_NjQ+=;~99yB`U|kDhU7!k?nn+fTO^O?@4=$bGT?Ok=Zj z9mINX!;mTm7Kj}3G+mz9EE>IPRkLdTOUTQ-Rczy6Z>-Bq>agTce-1~lv(!TC`M?$C zaE-piE#*DA8Vi?R>lyU=W&uZ=%0fnogY?=MBp?Gglt{w|K+QeR4;6hGdiO$XQl36T%dw~e%SHYNQRe28BRb|CH$IX4j6fV|)g6qi-h zVz}uQ#7mW#!q2P8gBldk8gb*E#rv3DGhJ2?X*s z5yi677)XO>bvDmsE;cC?jZ!#WWmgINNPmmAIo59VhSC#j7sJkibjt|)h9&>m2s(|{ z$i@CbA%!4&{&kuD7&RWF=(|La$ZtsD-?r;K`7foBX5XFo)XCxQR|xg;c;~zV1C&CR{)b6F`X2w# z+_x^J7!|8HAX_NTb(gN(Bovr<|MhqT1wwK2gMeYnW$GJnN$(3F>v*3j&;Vn2dK!YC z*`cWK^%}9x!lVjt2VP}WXs4gW>MD!}C)`J|wjLtL|72%ht3CNx@TRqFkZsNW-4>jCQc>$ELsS|%3gvMLbA;f zlD+z;WP9ANUfRLZXbHPPsnD=Aj7$1qnojXSQ{JGjBNYJ_f43E2UA<`!;Zt?o^KG84 z6d|MIioU-+AXcYtW|6R|R*`o@3@{LU1t>U&;m*8ldI3{srM+Ntx$AYWHmX5izwa^~ z1!l8x7j+@4kfU+5>Xf@^N`r#6ys*5D-@%7xSZ^H-+zkH zZe4D;J(ParQ}g_SBCjmb;*qBG&r+Khd=QU{P4xq7`P+{3pd<|+_}Oo_qz^Qj57_9= zv#g;Z%%HOxa%UYsdESV<98W64_A(9MIg%uV;6v&F^CjF1PMV91aw5;ree1b0c2plK zNZt?0eMMCUqb<@hGz`f$4z!7bg(ip`UrS)7dCvZa?Un=EO}Z!DOMGMpZ<6lSBXhtD z)9aMr@UPkKS9QB)k??)kwEin>3R6P{PS)f!Y??eIux_ecXun6~;JrU=qMc0?kLSz1 zInzwpF2ID%caQ5lqqF z-?a16i9{Y?nyPX7)kKwj4-m;R@JnlI613Q>6CE6_K7$9z_LUQJxjw_f{=167c^E4w z0n3}--f=Wug>ZCIG`-*f$c350N#>*TTvz zl;SO~FLRDQ*^e;yEF=LQV6~)6W6=oxX4URJo{~tP_J$d|mAD@V0EF6Wb%ezXG|l73&SRZwoHeEx7&OpE3e+~iqS;lBL&q_wV6aNIwWt${ycUS7^J4&_1^vcwU^?G&q<_Ajh%t!U< z<|{2Y`^&6M_P$vT&Ywr?dv*lcw0$Aa2&mVv6;*dybzo1Hn({ta4fMWaj@Bo4yH%IY ztFd#$pL4`XgFl?*d15;On{H#o-sXpImzB#O!06RVS?LRda`okgRX7yQmh;Ema)p8! zbMF@!=T34AHW&*GDBsC9A!|*TyTOXI&B^-c4g?vzKlahtsgrK$ zJ}bJ6q6cI`#U-i4OuNa5v$?}{RDW>A<};4oXn_~v1i?E^&{V^i9PR4fUqYh;PZ=QD z3TUFazzEzh5Kz8|tPbu97a7_v!LcJrLyeSo)K0{3>}9P%g|ix|GlTQUpiW|IyS9Dl z5K)2hL(u}mhkb1LCUbmSezb`CvG|VbevLD7ECX-VGbfj*C*7(pmm;RIAq-TtJ1{c* ze!OA8wEx|Ud!p__05^?qIam@~rm`iqDmNdpB|g>)!^md*`_k%F2aL;9y`#_M`X__m z6r98)I0C@4SRZ85c@J18I|8_T5U1Bg3kaxK9e*wc${`TiO*)~ne9U7PW77kNIec3e zXA!|py$Pl4bkcs;3b+cQy{&z z?J7ft_oH5e2y)7O(EdDNT=};cssD@?9cf7|{ zI#Kt=fHGyux7R`p9Zt0lwC|Q81W<>CA|^+jSwx40pG!I8VvUA~LWq4Gv_76L;m1z+ zopT9Wa+zqDJSP^(;B66p^_N`!E||B}Lm>BA7=#{R0E_`j3hXtQEF)Zr7pxwm*T!pe zl-1j~kyIP?rf9KCdH(|Gb)U%(jsfohz$t|PQca0^)cOs52z#elMA|}6Zm&>HLh0nb zP$YIFLTK=y*w55qp2URqp$EO3VbSkV;4g~F!~NKvulI@Q{OLpK;iR-ik!KD)&F<<2eU6yk{G9%Vqyc%X z&uIHRemCb69hl4hqGFWo>H5h`~DEV`eiqaaoGI(t1GBr*UwD%lEz? zMclmX$Ib`Qwc#~gI5%T~{9b;>h6e;uS_iCDd*qCpNcCm#^wAKdGh0^h0Gjz11-Q)_ zLG@vxh}iAR6G+@HcKvQlex5P7Nu@i$6R3Mm7W$(+72%{oKN9YecfO4Bu(R1sEX5X^ z^r-pkmsuLSpaDxyv|Oy>pJ%K%)|ssS(Q3u+0nZ#3?EFJed3&mbVdFF1=19&@Akt`M8caxejQSV?X2Kf31+orRCsOrV$!$>S>EZ^poz>ZMQ-QE6 zz1mZ|d8(T@GcbwUjCVHY>CUIb(RrE=7MT|y-W)lOIJmdWOe&OqSHSZ0`t^Fi<ejNFAt0nKFM&_-SBZ?PpbBs^619_+lQmA(Dhuq;PQo`t!QdGrIHX02^fMFx z2P+i1G^iiScaNz%=()E2aK+zzDiByL;-(3*{ejJSF=fxCmuxIW3wxDapXKiRXt&Iu zO7c>3o#qP~8o6d-b-ffnMKnJ=VsqXQltPbdE6iTIjyr%z_-4qdycCfyP(?F`P0_-LBp&W;@)N)noOw&=gUya|}sUdkEhmE||S2&L0fwaH$& zAJ30y9*{izS?V72qDgqK{npxAPAg#`-FHG{y)CBa6afC!)9fmfmEl@nXLjmsQ9rF-50 zku1K6fJ-+1hqZR87X=lU_`d%*-(bs{Y3%>2=lFlZ6%!NaQy-avbs0$*yk^@ruO$qQ z96T(7Vc#5iFbCR8J-e~iC@0lK)6TcZJ=;Ul6YRjmFF~7@_N;&dF+i3II^YhgkSz*n z2*a;6O;iF)j==+x{3y2NDjF3qRT>-HAMjC6qXSx`ywB~|@Q#|cP{=t`~a*SKBtSvHebu6|v9EFe4S&$x;df2*xK7_l|Y(G{to|{nxf1& z@!wb9J-9f~W=8^No6qi6JeFj0^cL9e^HAGfk^!OB-$Fi5NGtEwy>}K20H)@Kjg>Mn zG8&ZvI7?Zpj}{a^Tn)R^z`zEjWx%d5ln^>0L3?PagFL^bW+2T4sTkcRCTJhTy$pv!bvko zV*A*XS}+TkQ#+R(GRKEWQnuY@B*d%vpT4K^Fm4-YBSCL_846^d5&-F%22O>Nx|1;E zP`(Cn9wx0YXnOou6~f@Ix1MNXUQ(2nq`m%{0YpIKiHLzR{%cJ5fZ`X#1?&{E&RI?N&JTb1$aAPVk~U&VBj#1Q^$dfVG-ch9j0&GrganXmADnS{ zfJU#8`#`(Kkx1qdGl@luk;mJ65^8Zhtvk8C5?@?M-z;sgn;jB1ch^(%?CUn;32@!@)03bXe8LX^!6Rt3UT;2^JJncXLk zf;@>56OgGz>7WE!iO;U}(WRTf5LL;Fvibaf<5bKehc4k2d{Mi{)M+90VV%+#`=2fL zj?1)!*i@>2Z^K3sb-Uz2gmrHI>HvGG%RCtSbD4n|zR9GuVZ>>dnUhwkvQ1`_B(G5P zC?C}evYLjt;7|vBn8{EAAmvMV&_D~^qfoH=fRd~Xj30iKBR9$kg28~&@^P|@l^UU_ zIuMHL>HnmtLiOK8{>9YE_n1gT{DQ{M&P8KTi*vYQYXQg#{C2!|fcfEPBoo*!*L4ry zUZEV^A;TGt`3_QCsW{fFpV2p_KQu-e3@?mTXdSo+NV=Z)LU>KUeb8-|WX47bfB-og zyC%?Xhnx^vYmRRQG7>S+)cwVDEvX?VnrezhvoIt%uo9uDI%uJwukF7M`Ytn!-3icZ zAY{nt7#6L2Z#|fT?fC=JiH5xJx3pj1|DmT|pj>fc(}>!Kbw@>V2LC{OH0Coi5L%|5{N|VO}VID%Z#mZJhtWN=Ssz zY5&RJyvP4DHi*9zV!3*Mqn|Cy*0RT_3YIv?e;~|8UIA3=0t&y)HsRjXd@^ruMQtT4 zp+2TYR=4Ig*h-gIAQYf;zw`XMA0xQP^8+S|pl9h%H##_Si{*KB4wWTHq4^n2B}xi-a3BQQ3R z=0S8Lduyze+h#q?K&$cfUew~~&O~QoYaNN4-j_IN#j@yc;i;sjTmZ28pxcw=e!t{) zErI&ZGY|;5h%5@!cW_svwp!~+q_8;#oU6^#)|23D+&K9W%%# za65>Cs@3jOD3DQQIFOvRr}-U-Z|arZR~u9|tFh<#E|#tgi&!4cJInLrScCJ5=>r1o z$si6#BVVfk;XxbZNou--C!TGwtYo5IeiVkN_+U$J;2AH^Feu3|@ z-@PjmvEZq80 z*MSUXuo8P1MArQg1csy2hw+I-m6(6frCBs8&sn;Y(Pl`V2A$+8ih2nn-Dq3X@_f!} zZL(OnH_tOS2+5E}0ZS1QOcVqBOmLm+ks$P@3FHy7%8%ar2oeFMm1x@AS)_BEX8RM# zC@ii+Nw7UwK(<_?J56~0bR}Inj)7OzFb7S%T1eXichJi~ zTrjODi&67@)kKt(Edu-e;a20^^gf1T6Z_8}C*gm7nljX@xN8RuCqP2E4kUqqf?5sC znIQ+e;8Oeosw80J;UBQGr$C5O_nkr~!l`Lc*dVAYzdQk|4+&Rxf#C+U!6%-I5P4E)X|QT9 zNBGfmH9zTr6diE^fGe{06DY(FZ(YR9e>oh>>iFg2uV@%Duz18chM#8s&oqH(AJBe^E+%jyPNy+Q4;1)V`0HFi;W_Sey<@d+hVZX^B?wdcQtf<5G?E_Eh3v<^e$M1DF5RCkY) zmQ+iu1}7TDWe#P3v^Ynekw+c1k@VKYO6nbB{JXPW3WCd+Y3=B__v)J7j;{)RrBQ>v zW*#r4ku*hJuA)=8TaY@JskvxASlPQ+c!2pQ_SY zkFY`Y8Z<19T~f4CDQ-)JGU)ag&ae-4 z2E3Xc#Jl+zsS}CT#{lSKE3l`Q<0q)bJAhE^=82qUd+?yaI&4b7u>ufjrTmYq?D3WB zJBBneNDjWxpX_SP5F*1_S|vx3Eda)#(r%bjr@#C%sI526u(9@)TZq(a1-kZH=v`g# zyVtK3M zbnt5XU&~m0;v9>EOxCmV&_N)f01!lB#A%nJ-IFZRy4bLE(HHsqBRL>lXIu(^yqHph zKoUwi6fU7`g1<`uNT%36Rvtgf1QbZ}+trG{Iq|@7KY+=$v)(-?DhFYnTHgbG1c;1# zvZu7~lTS5I5`~saxOt}{^a}k#Y2hb&ebZ2`6+(Rs{2Niifkdl}spd?wOm> z4Ec*(OwzdRRv6zG&5bP4=V~TU7STgJM(2Cmgnap>%IEb#b>oSZ^>3pYgHC>#9~#)3 z)+ejVi7{j*4U6;^*jnCeSB8On|B5z#r3#CgPbM$bpuo|?IlQ@XQ%U1i^A!f# z$30KO8MKPbBr!S|pq>kW90c@Jy+3$T1$w$a7q;-7(UTOesCdpZp98<#j|)i2yFuA2Zv~ft;M6)|Dud-b2K&*zaq*cg zV3Y$Dj={-?Dt6+`+yc%Fs?_C=CoN%Gpv>GL^S`)GUC3t@{8ZcavWN9CQb4!Xjx<)2n(b053Nv(Y^IX-{L(k zed)sMw51T$9lrcc%#uHrV+!p9q%r4#mJMEk>29I*-2}T(2Q|AU_oD*aBsw6`^IDJ< zLK>fwDc6RbVu`GvkmNn0R0zDyAYwx<{fiCx01OPjezAMERJbhGB1_NZ)RY00I;_2p zfIVhtSX8w-APk+s|H93Gh%)SzX!?b$2Bf70FQMo!FkPmEQ3jpM!+xp*Of1U54zKLgbb}^FAxm76-)QXHc4&nz;7%rH4?;9?#hJuiy*> z)vFyBcw2u(lhZ@B=RgTvMdX3>fNcWT+CCNG13|}!I76K5V@i!O&-OdzlPe{din6a! zR3blDellA&fUJH{X4vdy&C7|7IE26yPni)nvHBX*Ff2D5quVje+q zWS6~YC&oaNvf8|45}*Bd<~*7^Xu|Qp-4P_`1Dny22U`06f>Yvnc!A9*Uc%daK<)s2 zUNkGJk#k)C;0xS7Q75--{^ONT&_E%1)I72!c%#ikDDwEZD}umGA?U=*eKa}QK#q`Xb}uZFQA2dzBKQ3O~F^<7sHy>~u=_4gT*;EIsrgZ0biw9*4o z*duxnGJY9@EP@NTMyL~UIn$>O;ay}M27xj06Jfza2+RDx5SCjgtXs)xFZ+ovy6MYq znRpbFrD)c`-_dP$waa#E5O1v#r$ldc3z#Gv4Yn=xwmSHj#bdlBp2%ZpMeKJaL5g0n z%C()0Gvv71Zr_7NEt-+LzT$zy#_$Yv=;Pd5!TkqP{6sL60_fT*CEPyNT zO3vh$DjxUG31Q}DDH2E4sV zZD*N=2kQ>~g#SE5DR`I!gimXQF8v<4C=kAY{O}BrayJA~yKW65GsqaMK|a9V!+;aA zNm00SKNTPGW6Wbi-Uy1@5us;DbdT_?dKMBEBE&vRICUv z29+#oFU_weg?bd!3z7$_#pv{Nd>4D?jilPmjZpL~a-PQxth1$#3tK;rd&7!1F`?|Ydebs1Z>RI~^4OgOqaw&0z zfwkm*k0H-sSmg>pfV3gNP(G2EyKsHpo8|qJA&So^D%a` ziF$1;*YRglzt+fUw|Eq73FSlI*F?@d=c%vUVT-wCTi`ks!O(r7OQ2b)r=`Wus%(VJP#(? zx(kKwKs*ung>%2NrU5(6@7a&XOlt$)JB=B=N%)3+nP8kfk9A5Vr3&=lZs3HNPj2OE z&a}Lyv=~TqUt-;zyWH}Y0x}r8Kgi-8z_()ZE^7z+LA*Eu2)Liv-}r^fd!RyO90<=1&jHM9FP$~=k41NOgeE(I(+!y zlh9?m4UqRpilacTMAgqdpC&z9?@**sG_JHTl50$!f7ktI-&9B7+ik_m7hn7XKORAD z4*%Hj#p`IL|HUF18I|f%4$TL!i_ZAS(G|O|?Z59nXfL_;y%#eftuzRKQ~NUXnGui* z!@)~4AZ-hAIqy(7LIaJ)oZyoe0Fr$|&F(BEIssKL0(#hf%hTcG!|8)4+5IDP|J-e; z#Y<^Dl0&^2wdjOqm3`Z%xY5ZD!NX?(H5nX9#P#{OH~a`;Z2q2u7kh3ifZ@&0ekt6* zc?9%~v?09e531)g6PI}=i6G9^tF!$teA(IpdKR;=p>SK%wR*y4bE?(=KFu8*>7+;( zzC6nHLrwXb9TdRVbo&!cj8B*H?(Rym$Cq5IH9-!wi zbKEKxaDKrX_ZXU(|MMvI8HQFauKW(n0o&iq(ht36baOb$4eX@g6DaAh*v7I-1uPXo z%Jd<_VZabN?bRx3d%n|1)L9T3XHiq)pds`-H6y2}`h%NOGknCpN;4j7xG+GSCZ)>D z6&jMF>3^E#eezN`e5pM0JL!>}mrjd3B*}JA@R>)@f&ye3=!s1eA;{0vGy=O40rtlu z9_SIS6(TcrwG-&@Jg6v)k~%(na?Nmv;KdX7Z}bIupo6N#Xw58+S3-_4U$l`PgzSF- zil^Utl`K!nO;BPxdZM8umSFPXoA>GIn7`T>S@5s?UXFrpM!(sZCyzC4IxmM>e;eg{ zSGX!5$gw9dp>}t9=moGd(ok|}dIYIXUUR2*fdU&uK0V^^zDFiiBOB#5|Fke`Svf|oLhd4 zZSuob8{A*a!JNF3_QKmx;&}p)iww(meEVtc$0Qw%PH@$`slT5*jDAn-DEe#O$Pd^H zx3>qGe`ZGiLS|EUkW;VPLXwKBXy=ns$=5pzjrY_Hs?HVinku2oT8oft5A^Y4gn<#9 zBM7+jW)WE3tJO1;z%W2I_UUxW{WC845JYo;t_ef?0@1zgcYH##PU+k-AaA658GJ3I zmHVini|_NVE`Ea+LCVVD{#C- z*B;6yzV}O)#J8Y>3kTJZmG&P_8o`wi+fEp(S(7R%F;tf^Z!@%x10k7;80C&TYOJ&I z*qCjf%vK{4fW1`VwnC65KR{)*B~yfen-K@R3If;b4&W9Jfa{QGRIkj0+z4DV5I~9# z>L2I&ZK%*fBnH{swh$00081drw@dhUlCPFgYBFu+kxHv+N$?*epZdT>rGX=sKyG|H zIERuH5-k*3MIF|`mR7h-dxaV)-E{yz*-12|k`=Rn`rB412 zqVcO6Q~jGQW(f)hmM2F~A6g}-UOYqFUb4lvY~7zCvRftA)a1%`3*27v1R(l;F9FWt z%nt5-Mn48MXcoW%Q7QwypM?R<0N^GvcgnU?^A9>WO@bCECuxyJAc{SP8vn*I2mXSp z`0&OKALKFSkGumKZlbvAqbX(G2PfGUs0AwkN}%8U4nKvk`)))NxA3B>Vo5A7Z&wC( zJo=B(o_Yw2GYcx^{*EyjtB*y(`Dvs1_hj!zZIxLDjnG70fU-lH1=Sx0js0z+oz!3Y zsFG%vnF}n?C}z1dLh(x?5OO72y}G-=O9Ua0%KRr2a}P zI4;>~1>DJTddZj1} zD>4hHaNy7(t~1A_ksizrEM5sex2PXbSITkjm)`NQP%2fTC>Jz0_zjkwL5-@QryJw7 zzj(?87;TGC^V3a-VSixQ86oBe<7=|*=Ve2A3_j8yZL7`?RM=(o{xua&u=~Aac4{&? z>SjZp`mDEh^k~;-2s0*+0UKg^p#w^b?3J~EA9gJmz+XHmdkh^0Xz#x<7(h3&Scnbo#L%T_n}$=$rz}ZdniXU( z&g(&$Y4*Gk-tb13>DKa>s~25DfQ%7$dOsg{cj@Y5IBp}i@70Xiv%t(m{?Z>p@CEQ7 z?stBo|AR%)HHPh4?{A5wI(`pSzueSu#9`LcVUmV$o@|Y#HgtC}TXPN1?NW&xG zjqoDE+?Q?Fwye-ga;MvPn)ixE47XH5o^ZLKvgtM?5Sy&gkF4(KKHL%>g;jWryTwA> z3eW}=fH5W%n7fkTdWpCICM3{PIBS4`)E;q4vb?(C~r$*xU zFsj?bP51tQHGA=QC-xdQdWLZ^I`Sa`3-6-g98R{%n9>2+O|L8TYwRMR?v;ALLYJm#TPFo^26z_($RoIH|gsC95Ysj%olrebo$8PaVf|8z8In1i0tr1b%$T0Z9 zWgAEq<{>7}NQG2KQwjWr9%pOMU$FKTsG#m4;J;LvFPU{HA+~7A$zce7sQRsg^pu+k zI=62}XzL)xN`f!?QQGs5QDGJ!h73u@n+~&Yo(a)vZx`Xq7UT!zKT&7!=@cGn+WL~( zCrGPkj;GY++bQH)Z=CtpR;ee~U|JZ+2#eLAw+G{karmEaSAW)rJ>$tT^{it+LSN ztC9!8g2To_&jlWqVT4qCjfs*y5n@5|d?3ZK^NLsgAfcCMRtHv<$%3W~kNuMB$3-3{ zM_RgJA*F*?%(k_Abf@HmIw1YBMR9qs3CW4KD8cL*g6DY}0HH$}x%Vop20;0nX(;1^ zs2nQLRgto#gK|+D#e-b5I|9U3uH5q{lrd4zwP)q+`oT#sAgvEc+n0Z66+M~!u91!(XKIUG)<%1mq!d$ z-7$ZoKB$OlmX{72>mcr7US8FpxC4^~wWX3`Sz6<^tN?LZG}c0L#lCWBlXxVtsenRN zW$Zu&RdX^=V3U+1*EA}9plt__S1R?52Hni)1wzw)qOXeNEzgH4NGk$_T(!Z z1sEsYMxW#p>Ij=89Yx5CUMX4bCS0ZV8I-8lwvw$fPN-Wdex;tdzu6%(-gtfQ%w+At z=xnM}bPib2j{IP6cXVVRgwb6wijuJuuQvP;HoiaMc)4x)AdPEOYQrF>Yd|0Hav~#(?`Km z!xsxVR-8VUzc6w?v6h^k&dNM(EI;zOWKaT&=i)yESZXg_HJ1`oK9u-WyuzaIjI=;Q zhC+0d!}_4zM&4D^n;?0EpO8oE?rz&7d2aG_WSQ=L65SXg(*rc&R`+DuH=bn)tKVs~ zry8E1ID}cq*bS3T%&4z@YkZ=Y(R`k2-{~4lX*hj4m(22B`~CgYG38kn{GP{Ib;k1W zrG2s|ovdC>2PiZV)y0mnTFpn zqtT-YX`H#A2g{tk(LGB#z#p&g*T^WZHhs1l#ycWwCigkzlE7hAWsA(@?0q*FpMKWh zBiBfc1a(zO1ylwY{wG5VZ=%_ZGs~Eqd=p6*wQ6%6sAgAUXZ%N%@L$pqKj_#=lT1pV zZH`|sAHLy(it_l)=r#r5gM5rE^Bb(HW8v z83&?YYXVc1thnmO+OJsoVT8b>zCP7MOeOL>=|A9LhVAyYer(<0fz$Vbr zD-)%e=QO`+i1rwC`g*&iD&K)#X$!N+U2|GkrDa%~Gi`~@t##b1$_s?x2|s=id(IDT zCS-;{1tAhl6RwNmNPPJG?P4Lk`%^+( zwhamrqXk1=TqEe8-R7%nE@dv1|85`H`K@bpB`;=4M#JS|QE6V7dvRy0 zyZJ0_iy~^BcgRAzMGnz)4YS5Pt9&i0kNmi+nkTzB8>~$!)k3McqsPf#M6&7p>c{O% zRGKD2LP|C-`v_2JLa;TT+}^ov;pUh;AWxu6(e|ln!TdQLpjhVdjqZe{3OtNlZ0@ew zrd<)NT^c4yQ4g-O@d0;f=NyWygI>-%UM_3P&sgVu2JXHJvPvHvz41M>tZjrgVc%wS zD;?SBAbndTU4Y}Sr? zD^=6);KD4y!NzGUhcU2jHFu5QM&BHjb>(onV*YsG2i-^p#GM97z>xpF(bIYuvXu8> zFnttT7J0Lz2q^>c&Kwdkat~lQJcV5eGJk#2Rx4{PEqRDsJU~|@rP6HwG)FV( zE}?JfOet&?s2x<4zE)H5MuJ>^kux!FLE1vG@`6Gn({k+E5=^q)Nkhg0%1kG-2%OT};)4uqKP|r}Iyxzd_ zR8|nw0g$T!qXdrnEsg;gbWwnyg<10K832QR$cL4CZ^h|u{tJUQr{V8AXJukZ7BfTu z2Ev+d=z{WK|3ibWgB-eliI$xKezEYQ4vCN~pPFk%luCzRw>V5x9~R%W)a#{%niN^w zR+Z3tuF4N;_%RTawJ(TdXY7qJ6p<}iRdDe@tc^r&g1pXGJ9LQwySH_%psj%T5;L)9 zYu-&cCqG-pY0%zSXw+tkk5Qg4EpO5>Vdl`EYoWfig049&D$w1%ZJmz@G=!ADtFAHR z36rm0Vp}xl0xYV4X1>@XJCV_Y4*QyR0Aq`dI%wtYq!)_p8f)ykwWmw34hYV6uU<34 z0>hK%=%2fXqUt-Y;()7Z@CeemTG(5qOH7)Im(2y%4|rRPh`(lgm2yg<%jOEJiom$J zGL1WbrH#8mh7IWtr~mNHX_gS5Ds`n##*)nRjuzS%kcfTv*icTCW=|G&Q!h+zmoim7 znUo>YZs+EF#8m*e;`~5m~4$nWG- zu|c!bAC({=djbWR5B^zzNgh#+#98pMusN4jQwB9dWvk&Gozq7SlB28?iu5-tdbcFZ z7Q36I3iP-38jIWFJK}0{HmXxc@f?g@khh0EgP<~reMWxpWqz?SzkI&Jx7pH_GlBAB zqmH!KjAX`g&_gbY&nQcW!(44gj_wzvdK69yR+KF89*QIijwIYe5B8MHdGd+^K0AZS{&2wy&e=U>=B%m^Hxc7 zR$ie=FXZ}qL^bDldCIw$$d-6x;w~BEQ-SkgF3aOsX;!#H1=%b$tcjln}a)d0N*dhSH+)(jyeA zBY|Em1M>R%UB3P^+lt2cm2>bON6>)+xt7G*M1Z_KL%`w$4rWbo_g|%jIgZ2H* zX2<&<6-ddku_NX1-mLOm#2cfoQXF@5+JkSV>TyX%1dZoTW8zy3%K+Xup$p_Pi7RH4 z2UbYKMl|9VzZNI^c9|VqCKNbS3__bH+L`G_0vEOXv$}>`YH#qO)7)1Js?IgP{hj;Q z2WqNPj+~auvVtg<#B@`)mmPXP#K%&?6_ETzMDFBQAmy2)@GTMctGtP9?|>BU-c!3b z%TljaXzpTJFI(J~kJ;DH3cu^ApxR3qf0V&{T@xSdA%rRcrPcsNDe-@RX}jlLl(I_H zDjin?UsHk7;Sj@~BC=oaCbvUJ`o>Ysp6}f-C&OX~&UveucCkA&=OC=G2~dZ#hIp!X zWgvqo%SPy6deScn$3qe5-2ABTit6B+PHz>Nnu8+E6$~?4suL=9&3%xdI+-Vi^Y0Q= zXw-m%^GGl3z(fJhh+HjO*}A~;#w?Z}Iwgive4AE=y|rrR5IluZU!wGu%raf>v&PRG zWBr?69O`~&I01R`u3Ob(?qH;?15wvakNsptq44l3pUv6nGZyMm+r5Wnpkd9q3EIA5 zjsr~m8C#*0wkM%9KD-n@n<B95-1Xbu)ZqlW3$P?x`$iwZ@ zqaC{1XO8M$ktuz)tI;}~C)>+H?+XCEO|!|fm~s`JEt1Bs1vy%4SCg#2SUG$`{qCJ2Fq#sO!jnY#54V)p@tXi>o;&fH%0ZG}Xu#yk zm=o(c0vAwqz$_zdFXkR400W&Knp;tId*ezA4tKMv^3Au!p?dzCJ^){tDDE(@0UmEq z{qT$o(7EM2(8Ss%sFl={jrXd@eF40!qCqKcg_B-*#YsLIyosJ&UAFr13ob#;S`2;v zVLtjbx)zbKOsoS9DxH4emit0gW#az+C`8Q` zO#bVXM@-V*t96-_p-T?>l`<$@4lzAPKE?QCVyNf75>&Q^)nNxcO|kC#CaMQf zD&uariKR8MuU2#DuFn|^GrmSCE@@Mv^;kk7{F+^%GU=6;hs8hpL2h|OT6gNA>2Ox9 zMWrHqNO;dE<>-K;$xv!5Js0yp+Dz}7|7r~!jO~Lfx~k|1lab4=hwLvmIY+{z_ymsV zOK!v~Sid^5s2P1e)qoM&r5%&Tr-46JqXXluRG2mNxI?xly*x(-G<^6u8wb;=SNNJ0 z3*jASGneV{74`(4cP&16;OptB&T84W=wh4RN*dQTSmUCv$R3rh-aDdH<(Sl_anxSF zM~kM4>dFIL`68vN!a$7ql>HIqf__PuyzABHTLF8yakYgTV`KepungKF4$YpDd#)(6 z(eQ7)uOr$IJ<_AUz0k>4VH%R^p}3eUAX*xY!mS$W_HBV(`+;8o`#|Z2Dxrpz@-I1G zr2CM-o%s`=x$&b=^4bA>fpbD$Uhr3=V9ZD(1*<)9iW)qrk`%kcbgW!XB?{_(TN~hQ zQUxTc%&G;D=sW=en8lU(T?LBBr}K&|v;Z|?<-(@^Y1z@mz-)NzTe6vFYMED zK0p}Wpv5E|dDI#+Ng&U)uqCU!=l7muBe5{LCTp3tIi0o1K16>|b+A(UtkO{eaBL+9{f-{uRm%=7f^>FisZEYZpGYyIrGeKzu>>ETM*uoyd)rU?^yzxZ&C$rb*6 zwW4=&rhe~SFdV>+8_x!qY+I*1bKbIa_MyS8IJI-PlVFEWodTzcx9qU5%%-5y8a(9Qt&TerdR56cQxA{hj+|x-P zTM6@SsTB$3o`nj*yIHU-;~NYr-vja6(Dhpd6eg$M6xHx%2Gy0a)!=2y1?ovV>3q6y zW@od({fx#^^0<}Jh)h*l%mK6S&}4`8K=V`D@K5Nk_%})L*dYB^s*3l*3Amy_|FQM6 zq}d$#kgSY1-C8il+1R^k{4nh}h4Ryb|04mPbva~j;C85O{QdzlChtkPmMbP=4$P(S zPqgz7XpZ}!SGAld#IYNJOe$6^}7(|B!t# z&7gEaFQaXFx3t;5U~ACBxqnVw;~HUBR1IM&VdCp(x>58U6*bK}ndP6h9ciitONGnA z+|s+11q=${NyysTukT3vruKd(=!&Sq=r%DE+RN^5Qmm4#+FCr5#XY){|L~)NWe^CB z-Wl>c-brgUPKZ*?gWXo^pE+>YR+IkX_W9_LP94Axfis-keMbqKjaW(o$v( zxE(Fnzo+Ap+)URCSTN!IVApQo*+nx7kO6~$9*(87?b#b!WF+vOHvA5*LwoqLL*Wzl zVEZQL=rfx5T}#(!KvH5d&&mNbE35DZkVbg|vd50!fT3c=3RdrAbMFGmNb)w^)RcDQ z1N9E({MVoi1$`j)Py>^aRKntHAKDZ-f zCP&W_>jDT9D$n^(%>2Cba8B*UKG!U7U%2K%sH>QMer^O;mG(gi}yN#Y=L=ig+*Cfy6%W=l+A+~ zp4lkd_T`1n;jUhSTbqr875D7nl{Zb_u+m?9ffvmxhQC9VN>6BjmrS`mh;8alyD6Br zxt3Pna)#A`L+MJI(W{8GRhz6E1&*s(x~8f0nO#jL*Zh$jwr27jI)sc3yvNnQx+QzNvLlKD(bNM$V%`kmA;rYQIsvqAmW zQ8SXwcj#LKe9?Wav)#=qO5|AL8BuDysDj zA3cg<0E*Hef+7u40@4_Ov_p3fNOuc}SfmOJFr?CrGIWa4Dczu?w8Vfz%-nAyob!uw z*FC?r?)~58T4&8-b9B~z<9XiaeZIYmXI|Fjl1X;a5Q5KB@;}*57F=LONJ+HI2b*?9 z;8=*P-w2-Kj%khq4D`p-g4!r|I-lDsu^l5eY-cX2(e(qV>m+d|-l-VeqGZI< z5GyaP|Kkhm#G9K*Oe|)^Pb3rQKkaKWkLYD6g<}eoigowQkhmh)wRWBpU0r@WF&#tK z2+f_V{I#zheLa7ovqs$3rL0wiZrm}&)AF|tzcTcX9DV!y0Z#^(3<=Fsx|y?~AH6|J zMqlDgefM2cuCMhh0?fE`g{+&JBAaXlQk6{G(dQa^tITTrCWX2+7TYM;Y64*w28FcQ z_QcIeO|OSBkd)W?sol`d?dZaR3@^8SE(Ug9Z^oFaap`mymbxMiyFYgbMtCgDuD<33)ZY=41L2JaC%ikr_#%JxN6 zw(J7@LqJ_Ftzq(?-}!e^O43uGsxkooD@~|4>@*0vfBUH^_+XA-n0xWH^infeK)`Go zUo>^2l=4+BPF1FIpOEv;GaB%(f}dC#wU&i1)2YAr>h0%tN##8y(!|YFJ=Xq5VY+B- zcCF~${w<9GE1iT)Zdi8v<>2B?;f;_*T?*UkeByv%{?wpWJJP{wJ&FXcWyLo^HP3gw zl3J7R`@!KN3L+z+u5Vh!`HIjB&nVl?r60NZ$Rd%odA{5ELRsFG6`flb$F|12RLywq zL|-C8+}WRJGZk6M4O2~R|K9H`|KJQh3VVky$!v2Mwlf!zpGJFQu4=&#ua$W*wgM$3 z`u;elB|pVNC3*J0O7cTqN77VIa z$g_09u?(1iGvx9pfjsMODrYw6FBZ7*X}>8yGZd7jm8mAmS*hJ``1=F$vy$|+=eTjR z?zqevb0~%(F5owYXfTqWHa9_C@s(T(7=Ao7+jsVNPG#zX@-JR0jjp=@zT)G+7f10r zu1Nn!#6P_bg6nKslk&8t+~xFbF4cmpW?dTyqagg>2Wl0LYk&DKIT+WO4d?`P=`FPJ(0n#3^zr6OLxupo@4|FPJd;WJ)<;N*l3u`e4R)lw?TBK+}!A{n) zlf5--W^4}a$^#@X!+;={QZ!}2aC@_DKG%|Yjj~utSI?@w?d3)i!JOXmzHgEF>bdw- zKUTosw>#bRc&ejgZWl%|7xB5!ZmLY#J3t}F!$6-stnd{x>2Xe<)gt+1G;rY>J}PP- z+@q5}JOjXIjmPK6k$YH+jqS{COIXp66Z`O9h{3z3k_MMP8C@?JA+!2uFXm9YFT7V- zWR1-ONBxIa{fLU0$OFKgB^Ed_SNkClWk3mn^7&nSk~IjG#bhS+N#f?4;L`HO4c%L3 zxp7h{7h$ne8polmq!(YmPGPS=kcG5|YR@4N^gYuS>F^ zK{i+-u5ECLJz`g{ZM!o3z?@W*s{U7WBMB>?rGCKo$<+16xYihws6E4nQlM>6C5@xu zuB)Yy3p;n-$N1{nzIgJqGU{qdNR?t@#8uV7x(K{%^DjjpME5$N5UuXQ_U0ozECXX5 zWxN6uG92jCHnCLL>A+`yX6ZJRzNWA0av3EE&GY{7nlJ*N$qb)Lnb-V$@mSc-Nr%*S zd+459kUJjPsf{40BlhQmcXXthRPFzq@U|Qr`?v?|!8YUF%?oUR?%gxRCm1f9say(t z5D#va`FZMgKg_UTHYkijd2p#xw1u1q6jt|-d!#u=*kBXQOiQ1mw&>Vv#NB3k{wRU` zGeJfSdZyT(X&H*<@Y9poQzhIi4lj7;mW%)yaHHzJYeH13&V=G53iruc+z<8_ukNe$ z*S*d3V!d8Z{jv3mv;IUGQbE|~V~K&xtGZ=2x#wwO4UUO@ceY=e7mj4e(13DSuNPyh z(;ktHAM#h3m?yIJQM?P9#Pp`0k2YeE46YPErpvaMme{s9*S(TB7p}LSv)xkJnWHki zLu^}}M;xH-{Is3ft9{>4VzKe@Wo5k#NrRL#C?<8z-Mi;-#IKG6Mc)L)$r`l5|Ewj< zqjo-C>&2}imJvF)vLcC@hY#=27XX&snEx@utjfHUZWOT)9WC69&O20RG!Vwsef;yIFwql(cQ_OPHWMnHlnH^OWCwWI z!wyNHB452TiuYO77&lYw#^?L*d2RE!**f3)$$73bNb?L6Q!u^A(%GX)3u3(ZcKyJB zKPXFfx$Bc{35R-PLqsrzPQe<2J~8I~4R7xj?0$7h`=hqtdCMhNfJOPqq+FE-LcRuh z0XAukZ?9!jXj(4WK3^|nSNFMB)LXX5qp2;br)wAiAg=w_zP{nWjLVEh@k@Lybf&tb6yCKIuHNJ!%+P8fCco1E{7FwK z09931nwbsQU*FGctoKg$0dD5{C{m?pv)p48>) z%lu>d_>j-v<2szWzw4}W&oGQ>>!6*5DSIlp{*mLXN5FEx z7WMRx4b=4-vW3Rqva4e*H_FRL=Bzw8AkI)@+l|#{7*q}e?0>8#pUW@RMT$yG)1DnM z&+&E5l2g5r1l5PMP4jeL{G}x#TTSR+mD>?|%$3wD4mFFy%MW6I)`* z`I4{?=W#P={(&Nt`cS*`-?qE&^YHkFI(l}lArpyye7hP!u zal^hQMMXSr{s#sF8W~kwNSzH<0{=GNZ#0s${T;6Af6DfuaG9j!TgfJPl2Tztz49)n8zy;jrub56hCa$51%G2Fj*H;`e=1>g@1#^p37H@UK}Eeooy9_B zLrwy775!M6ZSz9gwKGeld&d|R!;w85D56&49Lme2S%f$@k2NAi)eQB0>UgW0R^{=e zKbEO(y`DtQH{R_mK8ioZDXo?_;YxnTM=kZ5vN&C&G{ zOTBratmRSJ+KDN)e$zJD}N za{#pbd7H?jhAFnKGz`WCa7q!vsZ`l~mP-JqR0NYX2{sM4yzWXZT|UAoT?nUO$655h z;?$=Xr_Q%^UT&&xIvYB@%slHec`GO|yNug0@U~Mh%=4ob4b|klOiGMRQ1In(1Z+rE znpJ<^4E_ca0|T!fAsnk(Zy=FJWWFzTNSo4!ua-rp57g#ek?|~=?wscsE-$h7$*#v_oD(ABEXSn#e?m*%}fVm36JQ54|kX zsn|;T>wHQKx`DFHbNY*s8(E46lGol95ty_3-QYSI;}@6yfr`)dQmtCM0tcd|aJt5umI6|XvK|@zA zhqE+NVAP&#bgekrrU+v$z zv8p;NWwzq+=lP)&FL|OD~%v$!e13TK%>35 z*FPQYjr318y}tQol7a&!9gHUW8loosW}fm#3OlFVtxKBZG-N-TiCMV>xYKX7=5vKH zr?ahJ+dZ+7u&677ckn_*HKNdlav4c_MOpOyOq1nHwWg7ldhyA>1`$peK8nHhOOo2XkEz}*R;vFC9Oo2@rRQ5S>!KN>>tq;pHP!MV8ive9lPQE}1oZzf$}TGn$Yg(HRUa+8rj8%?;&F>UxQW4-^!3f} zgQW@ZS;C@MvlO@|dGy}D<{haR}`mUarvG03KhT^x{bLj zgJ4x#lIS6?4w|8)Ab4SBo%BWzQl7|UU-k@9P|H>cftmxs%BlQ%M4e4qNevTF)sX8* z14EVJEAuX_YkP0h4L=jEZW*a&;k+%>-6@K5y+WFAW}(iao}mXm8);C~EMSZHW8mW5 zEA4FhLkB!LP{UcT_skx{@o{=`9-QUhF?e)IndL89cOFU&?!TdReg^B|kNFo6MU*3S zUNNb@R@3jTx#NU)u60Q;cL+?}=6q4kSNnFaph~4?Z;Nj-b9d6+o_;RTj+eFIH4QU~ zT-(f`=jP)<3+kavOI4x$nTVN8K5yACjiHKP^3cT%M%!^0CBk{`*+<$->^8>+Dm|@T zEls-O*8nf{+}jr3sOoQz7nV|ySO{AYroApwFEY1+f!zk*+h5^08TQ3q#NhTFbtQr@ zTq0KnyFTwz5NZ|z*umU+0+56&Gof`qnzj&P-qeS=&5}~YG*8G^I>_d7K zU1>k;A1hK?(UP#_h_a1bD)NjBwJo1k4yNSAi=smEs=5BkOJc^V^be5*2x7%=Cp&!LQ;@W!2o%o<57W6Xp<6g#hZaVP&;-IG1 zOod)Yn4oSw$$8MZf3r()FM;3@@}Gi7-clW%nD`y@>Rk;TLJ=2n>5{RGdwKO{Cfp)F zTX=fRM{TWVey%jpwIwthn6)HJX~f$l?iQvhP!)Ra-*!$Hz5UY)iEd#YR5tNF zmetf}6uJ7L78aj(dy>dJqLs32qqA}bbLMJfU(y%RMgB+h342>nDF`744srtLg|7p# zVx|?3vCDjxgVydpCkopF_3!1pe10fW$^xpvj_!h_Fj(M>tPpVp z(1Jqwbs0!A$LiN_J-M6y8+sQ=XOFf5*`RNbEB`KY`3l_2J%cK02CLG&=4Z}xNxg|A zI=i)90cG-04E{K2$H`ZEz5aCei_y?U2a_{$o^&Lp9q4TWe7nRdpdANfez1wZz4|e+ zU4!6?C#*I2b>F}qStH5CoUf{cpDkFN#k?s_0`AHn$p6!2mLZE{qW|6N?{Xp+vY9(Z zwpD^Js7dfw3O>_?Ddre+=ZxY(`C!xv<%4>~hdon`gaTyKw=MDpqnvbYGfAAi_Ei3p2ghCjxjBj2nO9)dV1;)AqM;wQdBE>j z&Pn)a_#)coKHqzc4tEK|+p5x@V>za3PiFg7ef}T|@;F<~x4+^gt@Huz=&R~z}jk#39PdMuPyBu@% z05ia>QzQUkhHZx&gc)o~fzFm-+^I@syFFGk!@oOo$!b+`_S;_)y%0phX?+RJIWflE z)~CO2;@<-+hF=5dZwu~X*Ec0FY@9E~m2b=H9L#bRUycZ@TOKaO%4~~Hy>h+1FKnMU z=F!7i_+vgP53}s`{y<$8N2Zsv=r3>km)feoAWD*-XFY0wIn61^1MiT}e**;zLK zfe>qa8pG=+Ktma4dR8rgRCWO?YitMo!MR}~MVO)*YXTeh^k2lt@4ke%p z5c_{yDNR;f-EaJ`XZF2)Yw}Flj-|zeU^gav<@t*+l7Qief^wY;%iRZE5zhLW(uwXh zk2iK{w1vK>bS*PV%_mtTu)}Y9cRi7x{gPFnHGiJ1j=c55uYDN2rwAVWE=mh2NJnHo z-<8Pu#Vdiewxd*#vy*9TK-Zp=V%)j(mVL3TK=0hG!2(oGMCnyPiitQ!?OD(06Cj zq?H|RNga1}(_{J$g3 zt8Rza8;cOo zAaAyd?>HY4s5lkL(=4?!p5rx8&!lK(LeX&mOP>^DvlZ(odBl0f5OxLW#d-=_ zI0*plaDgg>2M2c^4CKbyHb;O(q<1?z&1MqCHQ$TC$zgt2*5yN!(41L5`v(379`QnuZ5*uj5O{lJ~FG54+Mx4F;@0mH6Tu2mBBk7!^A3?3rAOrl#h zctb?D+yx*zaSf8wvbROw?4XWrqw`ZM88bdJi2*3o48v=2 zH*tfd_iGM*Fidj9-m<^B;x?=;FmAMH{Bqa+`Q;+-&Zxb{cBkSl zuK7`tsc;+BJ-eU!rjaM3S?*0*GOQ`+s!VIpv>4;Wx#SpC37|nD7l_Nfe3YhGpgWHQ zHSb`*>!)x6kM`ZC-P+jh@@4aJA zDESjo0!^3yvDL@*T)li#&~34zk7X*1hz6n}G>oE=L^X8L!+-| zdhNt^pA6IEm~AMfYRKh0!U7szHtOQM8xi*G&Vx}Ce+!?_z76CS~Cp|d(@LgCha!J&`X>gJ93MizuY4i_Tm;lZupO& z472HGU5MkD<(If3qe8RIfCW!%@D=j}ELKd+HRlv%yVcY4EG}}g!+BG(LgvIFpc~n zX3q^i2ifai^j%o|Ubs9cWyy2JrB15noi<7*u%+I}tv0zV-fQI@;!5L~M}z{c7?ZVv z$?4NhZPo=3s&|X?js8Q^tK5^A0Z!zBG{N>5EyH!5Fow zd9Gw-%v36iqx&*QT*UV{SVecPOs*qOZnhY0cQ2i3TT%|?oBR4fmSos)rNf7S0B#Mx zx#SUpzNyYsM_0RD(e5!v<%yeRt!Xz`uJC$yr4N#Gg5fkm1 z0$v1oJH#pahocbkK&>gSaubOw^kxKX;-+$fO}n3P^HHKc1|q; zJM+uNo%o%Pbr;%wgWS0#PI8+`5q-Do6}+Og2VMTKDuw)l*V(1ntfIz3}eK zVUa8W!_Q#tBhZ2ah!whgDIS)Z@K^hhyJ^Tf#q0!#;W-Cww$hfFspk_!zwSBi|G?ka zduqVu_HH-MwrE;|Kp%NiqWKPQN?Ge|0e#R!kud3lT@_U{?V9zCj;Pu!-{QC~pQ&uI z?EL9Y9~FDdDbK|!jQD2mIj~NrHV!@ac_OKu+1!V)Qo_7HaHiF$By&s4k=EJ$wL}s@ zLPlDly?bx36zJ(k1K3k~h=!{F4GpEZSu2$t#i1Dd{Y~(h2i4M{K-B^erGHWEevm!g z%}tB0s5-H*2q2XgHl}vCjkbJZmfq{!={Q5z`V-Z;t**K^?jC)WVkg>mXY9+)E{J}t zD8EhF{?C5RMxiTBZ++eOla^h+ooM`MZ~_DDJ5z!iRRmQ^76FrVeW;i92qAk^sGvZY z;_3DTOlU|oS_AV#9kuq|rmrYVkIydmmVJNgU4PMIQmp+@H zR;%js@h;n$e;IRypfOkHZy2qp=O;y#YS9DtXS7}mvnmg3eGdhW%8@7EKGxlvDgKyM z`h$;7QKuxb8jE$uEcw!=u5A0g4HcMFpcb&a&JGqa5T#L`>WWpXvs%*E0arR+{u$%rR8Q#i<$gZGuZ#zT7%nEKq; z#yd^96`+jB5#yQWQaGi{`OeSPwiVaZj9X8L{i%z5fLhLJQ8Ix0|2YGRX5ok(b9(*g zzJ1puY!5nNNh%aa*FVnk_%g5-O z*tK>|9;G7=>MTS*LsVQRPV?Xe(QMUQ_m&dxl`Ps6hW#J?gJx>D;7|qgGot%%Y^paq zg%=pI93x~swZ$&<&??k~HUMn)7trys21L%^C&;t#r z2ILE1N^^;DEMH2?zC|N@oYn7LF!9m4j=>G=PKOXP$NlCL@L8h-w(kF9Q__c<{-5t> z6*jU9d{$BaDwnu&fPyKg0Y1HwT|^MlniI}BGdv|E&2#5faI2DPy75KoG&fp!{IGlB zU$C{*k=fMTk=hFL9$Z-Fyr9lwm^UEH7BqR@3?K!cY3ME*ey}(lINxVT3op{t)6UEv zm1%hv9?4_N4Q$JG4n*F5yh$-=o@H!|I>`KCk11pIMOM&0x|x*`LB3g6t{f-4B>gj- zr3zZ?<}VHCM{(&}6-`jxd)X|WAVSp;^NN|N^#h4)ee?PLDc}`!Gsy(~u zZUqB;cWhxhCs{)P4FPHMdBAeT0(j;m4ptiXGn#@x@KqnO&DFkZ4u=;0XAbA5;fV~O zp4>;`wr-zJGr+tAIF?Z`B@>u(DkAnDs1wIa4r}Qpmq5r~%DKoIa#d1~|!_%~v@oS_1r#*YE>a#b;P>gAmvD z$KbZKcyJ4j=T#c^DQ@UH0TKxVm!SpPLCb!IOeB;8Z$J*vFNBXq9SuA8L+Wx@F5LL@ zz={oI0uRd^Tq+&eUmIL*zH~eW{khS`-2ZLk#q=p!0Re9Dg8%29&3@3DLX?IAX<24{ zCb)mwZeH-lR8Qts&0GR$C6SyURF+7V1CCQG<# z!$#!mr-F2K6Ch}h9Z|PtHuFq5!Mm{4pxvgUdL5McG*sp*pv*=3aEaC>hQQbzKfWAm zTk?sGA0OqL>DhEBhE#bMmR$d{(67T|Yw|41{T9a;SMc}^cJwL#w5jz;LCneZZ>D6* zfOBF2feL$OIJ@zgqyQ}0qDHKQcZr^#%|%(Jh>@j|2`}q%r!7;Jf;)ICl(nA?edE~$ zuk2jZ-ridqVO`9rz*mow-_*z}GUYv&V)MJEOLX0}KRzxWC>O9DzMJpq6@SaJ`>y<& zX3@`#Br}Jd#6p{v%Xy>;ox-Y9^Hen*1qh)lZwDp5f@3!E;vdcf|Bm?K;7adCyJ={i z4W`;<;m!DVzq$5TU@);db99jxnm&m4*hT@a7b-?R9=`GI_txFflsm3t{K1jw0{C8` zt-DB&LBS;GcK_gH66oS!6ISn<#Qk}y^_+^fXd@(k+oj3K_aM#G5~t%?XMNTLgU;Or zi}l=|M3XnW7FjGMl_)a68^masE`9ZDeuVYz}`VZxGQ zGfN|P!p7KU8}N$IC7(U6^IOwpB%})uC_yLDbd!{{BDL~sLf+M^iRwPUV`b0Z_&598 zb%-e%{mq_Kx#FSE#iX2?dmJ5(zYuu+?i`I)jOoa=TCOjhANXP(mG&z2;IQ8Jcx?46 z&yl&0u|}*`cV%)h;so!y3H_o^p`=+)^uuCyBR1w-`9`y`QT^jhR9E z=Xd?lK-HgVFwcDN1Yw-t?_H^Zs^!I755yFyEUy~9n|w%JQkQ7?v7FaIw^9kX=PKOx zKQtDmE=x?q7?8_ehzJVb$c6XIJ_A`H2W3TmO{R_Jtj@Z>QX8)CnWcGP zT`tVJsNpajRt9oOUqH&(eJ7qImugffZ;2Apcu&k%%{e9TZONo7v?Dq?Dxw46z5jEh z#rV{BVvf7{J7n@O}1;0&7o{$anT=(}JJNF9NdJ)D8-koYq^I6AU% zNdg~rXH^NphC^Wg_7b4FZ)RTLKRyirwqO?QLLlMBEceg!+nuMhzl(E_1a~N;agrM_LyPho5a-wTsVcfJ1`oS6LM|&L z$wV55ET`f85JefFT|0BV1Z+G)sHxCPGB*j$D-mvQQa95tH5E66DQG%R*VIg(J0`Gy zoYZE5G=_(NqcODL*@Z98s)G#pb3nYcd9VW?qQVj}g^8}HEll8&zYagXjV6=TdsMQz zAV?T>K|kzV^+1LlEfbgc{;TeaVP1~V?7HQ_wHoHq1kWge2%k!~x4rm=1$kXB9JC5h zW^>+amT8M)dp4}18A(wBa>R7YDo;)y@$8)A5Ey>qxOK&iZhgX;^FC4`-d~pi~BeeVB0J@ zJPgNutHp)uZBV$eMuQQM!oitMTIq}I-K-OLcihlgOI);T_AH7yK)hUeXR@s(F`Avk z*{|GcRQ`5XmdcDvT|&OE>+vP`65fae#(dt4(DJnhu1*zdi4nYJoh$yJ4PX!3fVhFM zo^3e+kwEWS;Ugt^Ps^|811NDoK0iRUks^Z+S{^4)w&`uj)C#}Vqik=K*(MGQ)L;bZl~*dDX#~*@`O-zb%`fLgEcHjX+;mOVm%GNFw5tF&VImFkqPi>u?iN z)ri~K_^6bZ6D$QGo_F{5cQ4Q}Rnoe}l!()Oo?oprY{jiz$Wt3#EzU?)@ZVg~I+l^( zgNHJbrDRP4IT|9XUx6!X9&$q{TYG~iLcRcpRkya4zCz^wTm&6ZxOsnbfgNUu3%uED zV-nmGb(5mZD3eu;rwEM1dX9D&lYuYP#e9@q1=4ehr%E>#W>i!$ML7szvBEpBseeF zTg=tEYJ(4J3G~3+aHoe6z&Ek$Z>V2`9YXz1OwvB^J!D=YVLEOB;MRQ^%LDJNJ8A(J zAm0NEW)J{=67AdL@$NY2#I)c>NoP=~K~~RCA(Enw&(Bj@k{o@413C(-?7I~cbvVwfx zpXv~kys23`c?apVI9a?hjvQm>j_DW+0GkU9O*-X$$Rk6*gKx(Cb?qwq^AB5(7qfguYtUY*e$dv^8 z{{K^<9qhSq*?Hm?L3kWup>OsDPj@5*qX3!aT=vwJgOlSh6|5e#y$%)R&0<6xoc_boI zt$U)2|FD|Tjn6oCu^B~_!dt5h9Rj0O8YUao+?7q2Xw!D`N@t$65L`UaY#bLDd$dB6 z7?;|vBghlflK!ij!Z5s&i^?c+Bjo)(v!u?15R(B4nQkMukzY=p9$$+`=3VP0l;2*B z*2~T7N_Tiz6}P{Cu%pAOTr+1S^x#zt^o-u= z1!xC7^Wu-qr1Cn-&7@%iI9B&dFs939?NpXImLU9QIbd#?B#;hA;PsjpIIB-rH|@_@ zU^nlD#&92>z;H9-rkS&Ya~`)e7r@wa?zPkcy9aLh&x5B&wC)f89{}70gsb0OhJN4t z6#k(RHA}=narNuI9u*Y|GXf+`4^A9GYYDupv(NWpVZ53_ zX@zC&Ea^-GHBs@75d)} z^u3Yc(%nYe-|q~z6s=DeYsZWK5?=UPoKqqm_xX~~ZYu@fM33C?dSpb}{1f@2BG{z^ zVe6R12k4e>CtUsU39%NyX2#J1F9d*?=c?`7O*IbDq;Py=)=Dx z*Rohqw=5G>*NIiLPl`o2XSmxKMG9!(Q4{JDN`>Vfz8Wx=og@^uU;m3+jV@qVS~0Hm&3uw79Tk7`xd>}v_qWd_7HY-Hj$1?OKru!2MsteU zI@d1U#}%jMIu+h2x15TUN8BQ1^NzgkbAq4?fQ@dOK;=q0=mI~nZ3U5~iQY==vvx19 zviaE8D$3K4b^mEri~ns_6Jq?geh*m_HcJm;a2k%#2fwGUfbja1O$hXW$Kc=$Fe^2J z1_4@uX%aHGZr|cAf$hzs-ArSN5qDg$ep~EuO_*H=#O%W!Ucj&sCY<)qQaQr%&)2}! z+wq4_Es^8~XXAu}r^QVp$9^CEl;(kvxls5;;zS z100@NE-}4o_(XD6iw7;|Nd{Ra2C47|T_GdU$G~fAO|A8=6!#jjGtblJgQr8d&t4cb zD*2fo+Q9li?1Ibdd9unBmj?euC-i>P#MD!X-*ws8wS1{VW)4i2ZQ+12w zA2x;^?8l8Sx>;)h*_b0=YdKFDVTGVCq500jm~1Dd@QoimR_(RmT~ZKsOIy1O?{Nes zd56Iih^M|=prZ;VJY_`Cz=p^)s2Kk)uRxZPKVaC5mo@r|!yC1NuYQ$38Yz;ZnK*TI z9Dma64}H6~F*5W~=ezD&6^hW~*EIH0rvAm6LDoF!PzL8d{E=B9Dkk*e;EujhA0aR_Vh!>+d-h&2yY^%`(+RA& zPR`rY{HpK3y=8qZmXAmWz7?kfRMu;`jro{EtGmtaTBz-Bt9!X;?)*h5HlU|(00T)9 z5+Vw<37z}QpFvKnogxD{L8`q0asnfH=xYq|`Trm%zMZWn8O)j)q~!e89NcQ8fh-ix zhv|_vNWmQ)$DO|POdzD3g`4FAG$(?K7p1G5z{3rmDPwZ!zoFqc5j5SnxD)H_yBX4lE0+Z_8GT z$3?fX;$4ZRPLmtq2=`qzcp$W5&z9&9z!uRA2QoX%e z@_pm;JzT#^lL-%%xER_|7JG#+L+Ndwa)oK7(#z%x>tPt@yK0b`@6(gxY^a;lk#GHf zAs?PdI-IH^^x}yj3KK&fH;yBY1)bgoPr7P~ML^QPseA7ZkpQcJs6u`}InPd#EkbCT z%=(&nLgV=gTrGZjUl+NY-tHM75=N&_FHbI7K>qdCkNp(VCLvhAfUxy*W1s?ogOssU z4f08_7wHMrC-T*DiJ9FpBX>OSsV31CdJN;W8g06)nCQzsfI9}37-$Z``!rPEJchO4 zl4%MP^X+Kb8|Bq6()P;-d_jz=ad8Q};*Mx+%h&W?vO>L+=nJO46&2m7x5z%A{16-g zeQx`nYEdrNK%UBP+dg*pn_0Op)>OP@Y*cTj$$GwlM46?<(V$Sm&yd!dnPl&AMxLRe zmez>sm3i68^{^0i{P|tBkCIykG&CT^u9!e7~JZTh-u=COk<<->0uU#U1e0qF$ z#zRd8$YnZ=wu?WS&H^XO<0R!iyqAjJ`iuP+*DHrO{GnqpyxxslMcQtQjzu=k_1LH! z;=>~nv0x3b1s$T>Uo)PQxHKn$+hcz90POfO!$|-Kr8ravjF;6Rb%1*t*#aK#!&LNj z?&kcD?C;KF?nC&#`qNy1j z(&QFI*f*;pjg3FZv`X5PZz6&CGcQTLVbP3GV={1r&j|CpiB*v$Ao)`N7AuVbelmp5 zj;i!4&|3~i3l^RjFj^Q7gAHfm3eivHhU@Sc&wQ6(-)ngvJ?x>sSAmA(L?b$Z6@tvCMLPcBfLbM#W){2cFF55FnF*&;%*FO9G6=3 zv+o9Q_^*Sr=-EsEYAyoyQNTRC{QqWoV6l5$K+9UuTr6PmtUWpLOMR`40`z* zv%Zgdrzr9NWX!d??cQp8Oq|ax@%W6+@niq-P+>q*A-9iZD|Ba-%lzMy0G&Z8YKZ){NNdBgVF+$#=_}yV*$@k;7w- zUjE{0>pk-b*1@+g-pbdzRig> ztX+T%^y@0{#f1=9?N|@5;kZDIVqGv0tWd3w24);y0&9X~#93uq*s$fIqibzXgJ|)> zsW9gX-Uoio?p2mXu1Rltg630LE>z6(9YD#B8uZlN?p?;-Hou6cy7zBtF=pq z9uxXx7F>|x8ZY1PT31gzzN7M&v*3h2Xse6i+1g;&{a+3vTyFtufgU``LJYxQ3wgMnLE6LVU~%@i&vsaTb;T zsVG0Kv$^TUX${HKhgjnO4agHTS9E!g7fk?94jYUlq+8G=7(6@&(NmF=piCo;$9=@Z zImjIM*zu}W=sxnlydshNk;Bp}aTneiX`dn?l|QP>CcoM;B5cjP=r$M@&f%eappN%t zzYT#kfj^sXy6^lYO;~J5jhdrco=0r_!v(UbFpbAbx575hfBMuB{IJzSMeIWA?+1Gn z8*caX?M9PDC8V}%)AcKTlk>~sxSF3gc!@l8L}P3wT5j=2Gb&d*d4qFz+9E9bn=^X8 ztABdN)>2PQsxdxpSN~^|c;If2#$49_MciLUMZHCR!1xtG5kyeB1Vy?*KqQr`NDhrO zlF|s$F(8T}-O?)EN;epEjFQqyH_{R_^PVp-T<`UH)_T_Z{oeKdA;Otq_@1-({_M|= zbIvnu3XbiBiark+(3L{@Igg$8Itvs3kUon{rA(3s^1542-#Gch0#LfBdHiCiP1AB+ zn^TSrr5AN;@7kvdf@x?MdpdrB>fQWoDr-8`$v&sK`-}09i9Zw9Mn8@!(4CLTW-cA= zvkrG3iKoj(N&qwzwXc0~q<(hBkorXe^#f;EjA$Pqdf?Ql7))_I)JH zpv?C&(f?5Fy5l(0nk&@1+@E7(IC>B;SX~k^uJgN68 zLoY;C-Qt8k+8Xrcr)VZSN$<(?%Z#qMWe2TB@>y)TJg)N~&Mto&dP5N&ZMZ=d!J*;r z2;Z=|F{`ewJi%r#IadPmgz1oY6F66RE2;aag-OdB5;4 zK!9;UX(K=hoay7POFK!x`}Z?;^#$!6iANE}ea0)dOi^)sJ_IX2jrV3-Xc{>Stp5-5=X{|3u2fb5-+SCvRaL zHf5{*4?2{?C^z-2-A*C!3K@IYrve^ia@N7?c%VZ&2E0mR@oDH$oe;j5T0P2+yFY%d zgADBUm{+juZu4|(>jUOwa7I$u4a+megnAp?Zp98yRyP9NzkeZTlIscX_e5CqE+#ol zD#LDdk@(Zoa#;0dlsU`$$aS6PT z+Dl;R3qIOV?)7k1XJ3*9EB_}>&kR{M;@a8I0i*1#qzC{5_@WzW9p9<0g+`=3*37ss z7F8E6-H}lAulTqG|H>&t=@k3Hh5`D$7fIa~HA;ZhJ-9(gl|$N8PXG?GEdgF%Lz zSY|6e9nG1WJ1_Dm-X>GmcZaMBS`x}=q-35CN2u`XHf<<+NDkNk_AYw*6TX=$mQCNdDK2NQ3kic$8nZ53mtII1?Q~^DEfK|4%vi-f&%U3%y_jLH1o%OIBEx0 z#^8qL9{#(P92>Kp4fH+JJ2QeTA;yoc06&@_vYqz_PyYdqJrES_&%*}qq^H4pW_p%Y zvn)0$`+-+GPV``&=j(OP9Mpb3pO|i%w~EWYpfbEXe9x}!FDvt{4f07R8p^BFjhd9r z^Vn(U?G`m*n%y=|QcG!U{Lf#Hl`W@3@JMwwz@Hn~AFPGyt`iAG6-Cdlv9G zCy`F=z-pn2SGuoK5?LubGQ~8}B&eDZPusid!jt7zpf)hBz?8fdIk&2J-b~e}I@Fq* z-H0w%!Y%Girj>N*UgNc`jkkOP-s)oGp4{y@-Z6|4XfA5IA(fm3o3}NuTvQR1`>YCJ zdP1FbT*?Rm>8#mTvr%K8g(sOy;d}SoT6^Lbf5kSogB+#K48Jd*wM!;T@t|F=8!FGz zHt+J;eD#7+v|;b-nHq40_SaLXZ+A7Gz*0XM31M5Kc??3SO( z2Kzs|5nh~!bW{7k0RzxYeaeWiMu~$cvc@s<%?L6bTlGby>4Xn?*|&U&16!ASRL51L z_a_4>?OI=mdj;bOujTkU{Cp&K94mJ8(s%6y%(B@3O6a+!@qMe-R+!DU))bzEOsd&x zKw1P^3}uwk@V&c1)u?i~Gr$Mhx#Zhf3i(|96ph?h=nmIG&h{$=1w86ZsTH`SzjftaO^bQ?u_!X?++^yImhL=vbmOPeEvAoA9~L$RVOfi^ zgaVo~A27WDk?&|M;L3Mn7{M+QSB(K~HW5W#P2QH>_qs-{45ps-nwlDyU}+tX%X_o% z{095N@Z`8P?`8^F^5DZJZko%Pj(ey}tf~hlThzVFO@^r=m>UaUHCx_&TvHf+T?h4S z#=A#;fz`u+%I-jj((!hiYtO-pAxI&r#DcWp{o@ZFP=UsioJH4;CK{y2)~^9KE*?0| zMNAjYU)UVLc&$#sp8dCg5o;JunI76!6Iv%9Xf$hF-9A&Dv-&8sZB_er5v;Y<%~71>Fw;Z`T&9?1r66#qJ&Q*h1-PjJP=U@72z3q%n3r9^ zdlUt-UD2?oJ0RtdVlBOnGAIj(;Ks!?n2CS}vn5%FeYP26L-EBjn{w)OR`);x7$?p(E*QoZ6B1ng?F zuwL7~_@?7pl>Z*_u|c6i(CE1G?ZM^jY!QIPMXRD2LsoE0mpK7 zaEHY_uU4Vm^3!Jl{GY@3PwN>YrwTlL)nX1(3I$SsfrNBXMzr!0Vu+ek-fyrV0NM8$ z-C;*x?DA5ux>Vu z4II^U1Jq4=D|%X)>rv8>SskCcnWBu{i{X_o7mC`~nx{H)AoH(x*pEQC=*z%cUv8ZZ#Ea4cubo6)J^3lYE{AxP;|&lEHI0u_(puCWpc zf8t>3Umj>K@BmLYTSb6C>8>HeZ7niTpzJtmDt^J-r4FxAMqckBY>Qjxjbq4c51Poy zQ~R=<%z3TS$iJ zSRP5Urmod3auC5ra#3jcPj_P5*1?J1X+7lBAma@VbV&U>-0k)13xi(AnG0=CU6LR9 zXNiMcK%S+k+J5oO?#j8X=E;&BJO=D zHyeP{)^|Trug_Psg45OqjR^-?$MTOT3p3g=u;yUS_^ua)=scyx`}quL%ZzGM4yzwd z7!{>c?!T&p(i!6H*F8aII<5Aoxwh6^oeI#!}Z$O+u zrtoLx++EvC!7W6)!MzU(($E_^QM*rw-g%*8eYE79vCRBj+2V)~uW$rkS`xusGI7P` zrkFd4jxTro2`+aeK*UFb3$T1Ua1%u*3VksQFJVtAm1ld!Fd zzWMT0|FDZyd}ywcM)`xJd9j!67f5?N`KKJ28>4RV6{J~b1~(FCkB@gb+52L5pe|?c zd}+GG?y7)XJpZhNYDX@XQK6N;R`^Ro{PhJ40M%h-b4D zjegP;sG{`E;I2UtQ?JbRBFpGgpb$|tIGgPb1ReWR#RXB=*s#-+b~h|@fqwG zEap4@`EZclN75Bs)$DKHDGS~uIfFA1klM?%qB{Qkc}1Ko>8q`v&ups^ys_|$6ICMI zPU|nkOs&@K*uJe^+6wHG8fm8qh!bji$tC?O!y6-zkzcUhlpnpk*ak)&-XLl zPV7{F#wC6#85PUyl=5DLcE?vNe>K&5gWhP9q5`V=YKkUbBUx$z={Ko+n|^}1KFixG z;y>j&-O6H{<#tp(Xwy-5&W_KFxV;^?rePltRQXtDNMItpJjZL~han+$N5&mK0#>$a zeKB*^X6*|cPX6*?_e*n4J4_7*6^l4c%5;N^QEHW}I%)6rF28vmyW?f8nLTpwYRJG~ zxY(60Y;Ta3OGjv&i?~34);&H8y}PsMI|obDv*9`m_RxwKqB=x+DE}r+JwM4o%7=V1 z>yCGFkFF1Z+CD!VK8P#1_)OnUHO4e#6w*t%zhO!aHLjGxg{H{f6e4UhGe2ouRkP(b16ey z*|lcRne1TBdBC4T-Aa_TuPml*?iT)N%-Ngb;x%zY!wL)gw@VfM{u*%CIlpm=Qitzu zzUi5YkgZ;zL=1*y3;XPBB06G%h@0NF@|B8B(V}y%o@M8k5?P{}9HQ{hqEa@(Tea2Y z`3ci(hW+EP(j6)lDI)<}C6DSm%NFEz`#D9H8Lws}Ohy`FZDu(Xqq2y`RE8g2#qJoo zvPC&`I|9dr1+mfl1*`hUiudS&WXHErK3ku?jfTbnfGsbzc3%&vE({j#wTA^PAma47 z%(h$}D$nn-QEb=>SUA!#qhyekyHVGScUpe6*KLW~^`Z~@^sg0Uv|efr`Qubaz)i`U2WLTXG6dqY2<06REkfISDUeB!6&xr;W3OV`uh zLeF-w8{F+dPq!;LDq<7aUzJ3g7ygYlw~MmHE=0F-7sA)~Qg+N+3T5{s>aWEyKRh+O z13&kwv<3@s6Ytw`bQo@e3+}ZXw6E0ymjOe62=j%WA57h>DM=kzkncm>O{%ZDIgAM9 z1Yrd)7maauU-t|S65i%q`kMDea-UlH7CQ33-gp?Vm$-J@Y1d7in>V<)?}gg8mCNz_ z0)2z#SxR3t88v<;230PxckUjrhPpRg2A*V`|5UL^bs}#`h#JXAmiLvd1w@7|MQ{dQ9cr&IqeYPs(6tU>xhlT5eg-6q1sIoFW4-Ky#pvvL=jhXtZ1x1hq=aktaFmrJ}X)a^pd!f3=O@-xb`{v4^ zQ!3(yPx}w58qG%xwd6$PL+y}POxZ0kZq(4xZAdy6AcJpFeKze>}!X%@m1 zMJy3gLv2@(ip>`xLW2(o&AwIFp@%}!BAu}hJrpJIP~1YD!WShQ0szL;UIPD=t1i}{ znCoj$t&8xnlq>aY^XP*JljPSp*5hbK!~S(Vz*hIpnR=h-h%UH0_|uk|0A}Er)^^|$ zf!l>#H12?(-!dyDW^rB;k&n>Ow&)?*1N(%NAafEXWVr93I_DJT>Y}MX> z*5Jj?EA=dkir>`Ax+E685^vYnKUn(lTMiq){7+abp$zZf>RG z-m&u=_qX=v-Yo2dA$wODv&H%~$4h&6$iRdAy?=8H>9;2~#V=r1uqS4oVXZ5uFh-TQ zCl*u4a*l*xSSRS4^1@|x-0Dg+8l@}$EIbn>FOQ7-xq)6$8_mtex*F`ZP@gM7Y@})` zj~1?@OCJbxS5eydn{>+kiFTo1e0{z(=ZFE*rp}LjZGGk?{*q^EWXV|{jZ`I0FCbK9 zwk}m85gkhCku-0c{F|RHO_zR;O*zFY5p(|yUv;nBgx>(t)R-12BRCdcE!Iq&QT=2* zn2S3g8=flky#EZ#U5x$akkK1zthRzL|8{q4g1&`K^_&K<#Q2!hwGXsuHZ?a6bx`mb zdKI5L#%?wz_9u<^@>osfh`3qFr>`H*>tGPARrO6yw!L~%VHQqMdY6Mo;Z?0-&&o;T z(iQu6x;x)eLz?-&=zrf>e_v$XwN!F?M|l3>V7ZISegK6pM3j7hmLVCHr6aM5=AX#{^GhKU~SU`cTqI-S-rm~oMmv3QD z?cQ~RW74H>IGkcWZe?u}jt6t0t|)jg}vqw8aV^Q-ea@ua(FMUQUZ63@2-$+ojO z!oM)r-vV?15#U%70L*#mhCH&@%V*C6LcgBwn$XZhnrpH^`-wxi3O!H8YxF+xN_&&f zU|eA>Q)sS-{YKwv%1-MQu@D#4iN$Z`s}-taaMO}WVbuo}E(&gX`&xlU4d2qjL)$9e z^h=o6KWB5ByCwW{E|q4Vm#5YzPQGn;XT((I@up3z-11$52M`xqzYP=+6`x9U=wo5^ zA%L3MMsqXFqt~Z1gqg8$Z;-x57stLu7YpTB0v~Im38iroiU0v)pue*FB%Mh)3HLZU~s+pvu^z%t|faqbntOr?niM$hO~Axa{f?1Ulp$Fu)P zLT@N2Z_|IGRYX5E>60n)m=1C$We8YRZ+S8TY&u#iUwRNTN#xA0Zq+&Mo1E&H+= zT(b6a^@}qmsm^F{zH@DQyz9{YxkR+O)Phm3K$K1#GV?;PW_g7oc&Cat;a%`+|ND|Q zfh7%*twGIBWuLP>k2J6^>sYGyS>CV5?$CY?$n3`L5*M~nb)co3!LZ8ATi6$WZR5P-Hm!X@9Wk$ED z3%i2Rb)wfm`Q0l(XufxmCl}}8{wXPdot~^?Ts-JL)*{2UeXyj~@URk*N*K^gtA?ei z=F73~(Qe=R#5U{E;|^cmkLvaP;{ElkdNtfdx^~Vr=i@@(bVzGtn)7H?h*dYFn)fXW zVI%A0alDTrayOEMemT!OueXBWtERZ2hPSY7y%Mb;*HhK}qdNmeI0q%$YAyj&u3O2% z?&wAf@4rt2(Nz>Ibq>8gUnb0cWa+6uC-ZL5HZQ_Oc}8w0=yMmN{77_-Tn2gTM(RrpOSPo%vpw0=Kk|HCKr!Qx&andhV;DWzD%v@XsATh%~`GT1FaBIZtP`kzDL zSqnQr)y2gS*#-`fQ=*dtORKoc_wpoJpaWjslPE_7^||V!bG4rjpbtFT5)pUMvm-CV zzaA&2+XJtHa~cu6)hEH;!6lGO3{^z3$AwxwtxT8kZo+jOwFYGL5l+<0$pV90O>)&ZFQsJU+hW*g}Pf#vTd9YUjwVvuz*9lOn=v-$P0hW^rn-ep84j9m0+M z6p}p&4+bFyu%r)p$shyZI@It{=9mHW5{?@ZG1jsQVujgqmJJ+E!+jK(UyLU3Twh=; z8z-pz1E?8wfl%(1e`mr>?m`LHiek1CR3-rTHWgYj_|e)lUFVK`bXxi*6?Ok>aMfUG z@5PW<{vdqyh9%X1n8a)Bi2y~*1xl(OMD%)u-}T>d0|-+i6jXx#6DWw_dG2&I^R3dU z(Y0ZE0UBj2v=)}$XFjgv_~z67ZspqWX*2WsHUFTRwa|i!p!@Q&m)(^v-00qI|5ZSy zD%y6!rNafnR{dkV+)`#aN zZILSjOCuYE4j&{|qFzI!+0;TMa3JfF6h zwQ+HW4KBWt@-m1$2PJ^4iC&}S;Bw0NuhP-Qr~nW+%(~F*Nx*61aDZ3208-rufGOwXj>%l%6Q99%$!h&4AoKAeP!<49M%*6B zLt&2=5G57=$^iqi(|4NbkDxdNYcckKzGsEC*hF|@!7AN7>82JecKK9sHoj|xNmvK^ zm$9ac^8Hl*^R7QnfjiMOHJudCz*rPoo)%qH^k3nbY5Qz%;h0tbBe{HQiP1_k&%Pvf zG(jkKxH-uAdVk?9>Vbl25k+AIZ|&lytti?M34N}EX4;6V_SbbCCMx1II$Xwdm)RCI z3l2=<%xs2QK!T79r!V(xsWttEt;Utg9)Hn?$o-*|GxtU_Jg|$zBcWWAGC3p?sbi5? zyhZoykNTrvh)_$2EhZc??8nKPz_S(r4%3zYSQ;Qy0sU4S#t&Fs0b~WnX?2pg`T!DF z)QOz`@R=iE`CA$o%G?N!$cdyrlCw~KRScRk4Zq;KyA$7GD ze3x+sy4X-hF@sEESXAI@?XXjl-iJ~1WJbCAy&>Cg-1V0O8>hxx#v-Untwg9+2VN64 z2SsO|MR)c*&VDx#xPp3q-F9?H)vM~Q+PiN{LgNuKY%H#8u?8#GIkq|y*D@vcs?5Gb za-ts>ba)7O`Pc`$J57BPDI{>G?g#~#{ zqw}$=<|#y1k`4UKxGIf3l+3r+UI%2X`#rm|Y;(;duX~fN!Ro@j~;y#M0Bhy|OK`U^DT}RS6?C zI&EjiCJOw&9*gOkQlhJ*{8yQX3N4(>aq=%KuOQexWC~xPlu{@t(EbH4pa$t_InE8*=O`0S~T&v{n2e zv?Z9w4*(~$ED9XY=0T#`#$F0BW7FRX7;p>n8O##!Ma;mAe zV!{VGxy8v`npkEEJyD+p2HMP5>t^Q_&wmONWP7;%PTVVP^uZ_%PBaRzs}8SO+PLlY zhg#d6LdpHX>bXn<;(ISjZqCueww&)w`V+*;ga(yRZ=>P0E4J0GeGHe1%yTtF`m6_Q zw93@fZWKML`HntQU{EQ$BC;c@Rc-WaxEn1|cQ;?Vdp<3>Tgz)TAL})Kj%IlhJIKzg z)W}5Hb)NQBFCNS_UeOB;h!dsJ3aO!s-?pLk$9Sj zzFCMCE?>VH0nD&XIaUT!E4hqi#=pB+B#1G$@AZ)VCGas|29E7-6J&CN$CBPLoY`yB;RzWu~k4k?*Um9GR|GAiZ%I}gYhylHQU}WP-2Nlev&x~gHfiZLyDG(LadW3y zZ9&jBqR+GP5>GE}S??pvGDX7YAfz!8UBuKa(6JNb_wGR*9bORwF z*SJRzffsXsZ)>2)Y}X;*Nu@D!%+-&^V?}sqBQ4>3Afb5Fn^=P%mMAQz{_SQOPKE8k z+1M(lT#Z&X)4jfqxb8R7gq1(L>Z{`s^WSlbXIsKhr%kL((|aOHCh^oOtc#I5v3EU6 z!}NB(N#R-bN2$H|8KaOeHJjocQ7Vxa*4G|`ymUUXO0&=)pKzXjAc!SWP02p0zMor% zjsJ4#1uF5GZT7VO6@s^(=MSS2Y%WQ(robb$(`NJNoH}k0{nYnH-a?cAqNC&hq7eo~ zF=;gLel;lbongvC^x(O*Mclb_$C+dvkeEQw^_^HvFC@jG;CFPGwLUUkUwSZ3a61~5 zN{$DtiND}i?ib!%xv>@S!zHcAuu6We{PyB6^BN^R!2;`4amJB5@*58YG+|q#^2S}@ zB=6e%pgNP_CYq=t!~b3=DY}*#Z!d(1v<=VT%QngWKhTs%pa)?rIxHn79d1$Sv@@AD z9WHGqV8Dgbk->G96t(vy9cj9ZS6hz#v7+}^v}Oz4p5CQ76%fu(l}T)>y~&~W(#m{y zm!Q&d{aUtqW(fBN(mMi5r^3b@a<4_UO3n}(b@!lMBWWDBwQk8T4=0Y-?Id%!?st}K zEO%Fg(>Tcm*e&v21S%TV3Bq@gas4Q0-JQX@*MEnfeT&8)dqoO-g)a}VzB%+0&oPi| zHrLZfDD*%)rr7|B>Ae!t_z^A0NiE6oP3zMl&#baP0v z%44q{2rOnZn=J2)XO2E-HwM?Is=|VPp8G}x9vvi?k>g$c%7lQK5ASw?b>9{9J4~ZM zSqwf-$O6cF`CAs@^QM5AqccN5RzS$K$sYT-sCN}8_pGofDMsn(IiU1@gc&Vn;8^M9 zK^T=Fxeek+3=uOC#mj9zdnuFt=xKr9efy!e<{Ls{A5LoEz)c&Y@{*{7WQ(I#o1M^xbs>dhDYJVUZHAd@YpU0dh)QrP4Hz+p0|T=Ug3>oqS<5l{)mY@8YAvZ-?3x_RfJQ$l}!><(R-w_MJ~Ye$nE=l!Q;%w$mX z|CU1%UB0nwA_aWNc*xFO^elRn?=b%dfj<%HA%Ck+xdZq$QybvdiHSjgy)nxM1>|7Z z8!cdOUPXiCM+yciTnYfX?QGTl8;HgNr!weduyjJTa1~$AG7zNOFEU&Dl6~O3G}AFd z0NQL&Jenq)M^d3VN5c5>bC`p)aqi{KD!f->%BjgJ7=h8-Lv;GZA9OlV->{8tHL@*5 zD3kWfOqzaoiRx?~V@Dr|^`9La^xSn@=Pqv>aTyEvjJ$3=q{dY_YiluxYWT9lKOMk4 z-S^!8SJ_I6fvbM}616q`e0O18%*BCmdI>J=so^>&W;Pa%sL3t~nEQ6Ue9k~#wum0f zmYi8f*lr|KnqKZ}GpG4S<8)Gk_<>MTbPynO`J{rW+{x-9R&RjSy}^eMt*+D2>Lx3L z)nx`js(vzS7BFkS2vdE`z_H%4Kv7Nlup##e&S&84 zMO~)X36`;>?&Pl}4c>xZ;+0MFZ0MnKRC;;jg6**y(_;fI&iCE_evy=C*x>)Ry4%Ku zEk#->8MI&QSG}gb7b9AM_Fi~}+yXHkzs6mOpFRgA&U#HN^I^p9EraEwY^96+o!>5B zuKaN~ZevELE)PE9HVZ{EtL?fPk=8>M%5BdtM7kuyZ*`dP{oLy2G^Fr1sN*BQ z?i)4Pu-!u{u5PLQ!;2w^F#i)GHnHR~5z)f1kg{tx*M}C<-#IVmnRGk{D%_X{xMfpp zj4YdVnL~TbmzA7B?|qr^#e!%g;Ud{k{5+ZLGXc>@?fHB=NiHQjDw(%VR~mO?XKN_E z7K@EMSBKo>ciVdNd@6UIKk@vIjXVcgsNc9kO^ z$hV`J^oE|7G9D&0ia_bmuGy-s38by+ZCvi5XHn%KJ+fn_2CYaXJp{s;8#Ewl2pQYf zh87#(@z_Y#%Mc7!kew?2>J~G2?gT5I15og0;X8{NID%ElUMSMrBX}=?(QT8{lH;?X)qID!ZfTRB-_yp_)Q&P?MDGCSNYwtpfykw3ddBD6pqjkM z3e`Oi!@JucGSMK6`@_Y};g-m7Zx&B!$@6~-2CKc@r9C0MKU z^rXpTm6Px2U|o_(>!aBu=H+TS2LA`xWg)`>ohB+x1k_xSbnx3MXsy}Bmp?v%Q_J<7 zGVJvd-1V6ywkteuZt2O`jxJPq>!eQ5;^^%&I?M<-rx)zsbDNNYdbhM$+^=v zIhK(2S|hk+If($m&^VIU=wW3E9f*aLo%;d`IipWOnE-@F8*Om7*nUHodlH7at@)iZFAb zl=w;edlvi(XqL%+{)eU;S@~+2BH9TZ>*YnVZsqoO{}|aQir^i`GK1HqwQ=g0jCu5! z%%sVzH#YZ}e#%kT-igHvxA|I-MDy6%WxjWVusiDxe*W$gF8wA%eR-cmDwH5;}f)b^RoyLg6bE5#uE)oxzz!(aYE zHyy3~cRsBj{YC{biz0_IJVWr2=4QgzR?B>o1Jm(;71eJ+p_a)Xp_UFl2MQEbz1;Jr zUwTi?H zu9UOMRxeKmz@L77)Wu*h(^%S~CqI`&qwsRJW5#yX+y?hG(wLfw>Q$5J2*x5=FFW0G z{j!6D4Q`i*Opz+J8Vamxrz%VP;;61$aDd1!8j8eX&eG6xs=c-j9x7#U;u`HdsBzBs zB7B-ENx&@$28XdbYF`Ecg)a@B0(X)5iMVh;TH~ES- zokeg}ci9}%e9ymth?Y|b6`@XP2nlyVz0w*rD$IOBA`hhuDlI;Po;6NgK^U`hC8ZF( z!9*t{q7pO}VENLx*M)hDc9XeMGfTiM;FW5hMCQGGf4Yloi(6RPQV@o_ z0nJs`H+tBodh%IM>7k-N-yfxq{1a#sez-d6(W3vH_5ve#PNH+ZtKzN(b#BHlr}f=O zJR(VYb1nuTi_QVtr?&(Ou3UX_8x+Q!!MD!04{m~AX;_4do(Af#1BNP{Qg+>`j+!k! zuY&~`NTKP%bSqV|fdwcSD9lKT{USHRF?*&A~E>-oOMw^_rMX%}+=K)Lq^eVJcpeOS`-LA_x z;%=LaTBz2VlGBTVwj4?OdS((A86cP?!Zs7#dy!{Q#<48xak*RZ!n}(%uE>MKwekSg zUbM6FO&DvJMG_qwTHX~0x()3Bx2wMsM|cYR3BYfBmDtKpmyQ~c+H*m6ERQ+b31j-c z_E6;A9H)*MIEDZ|P|UJ6Lu%3f8xnvXtjmCVu(5eNT9ZSq+eE+ym+IdG>oD+feSUxB z|KHa(6lrakY#VcHU08bjwNa%oZm+uQut|xJ<(=)?)wtcylQAN5_N^A(6~@))S0d6O zFq^~wg1&9)O1KjplGIpen8)v-mw&>k17f=*0zbm7Ag#R53Xe zI<6d0`*&$tCt1V8QAzqp$l0i*lwxQX=KYfN_1G_^b=l0;F9u6VFita)TmBz}mvm0P za(7%sOF7)xzNbqsO#u;^sL;d$DKot&L8!CDd6c~Rq{xmDuCF!Oi`cO%Mk5PI+?ga0?+E@*2!B9sa`sO*X^xc= z9M3WiQ=l8VuasIv<2FiQ^f^a3Axs(kIUfX;nL}>Pjt}0au@d3s4$hF3t7j8$QIsJz z69GjNHPBchuBc!=7Y~P8PCqYhvAn`;$ z=?!DdA#6QT%fs*JB_OXG>M;}bAF%@1!~r+b4jZ-bCYKvgF}GEmD)jihK}`nor4Rq` zr6T06=sIbW(YK}+_zUF^uh4Q=wCp|&f_SMX$*Zki;v#TmO;6YTLN{aKgV5OBimR&7 zyeqkZlMR?HdAqGWJhq^9#1K8_= z@E_UsZi&zR2Ko^n-2?Pw3$v;N_`)DB@Rd$m<(GWhS%ahb)uLl--AN zUoGxnHhJ~8FC2w$(@T90JYe)45Sl-?&otOhln;bPC|!UNS~L)vmBhtF42G=h8BWZ5 zDX{w)+f@pT2i%Z2a=a(cdI4(9J{{X~@jr71Xds6@ajqRLjXkW|YpEo4H>q;andUU+ zZNBHBfXwC8AAMZTT<_A~-X1&XK^n!+qca~*`ia~dc74AgLkX?oFZ!QuyP)!7?mQF+ z$_kS!mHK#Aed`YdG9WpuO9N3f7<|5km6V)y|8 zRodBY{SWjQ}T=Fu=G)(_UpZySSbF__s6}Wjq?|U~e zt=Uu2U;=JVqckT8utOtl(E$majqL^D<3?i4w7~42vMK30`@Wiqq_Ps{o@O++`rQu# zmB_m+@CS(*#rNF&5?QpjxY|ud)?dIWt?QLf@&46*Yc}-Pba7v`rpZ&UzqTH%;I&cr z^V*Im7|@+F((pe_NgU|=phC^D0D^Gb@zj z-I#kK-o5$7Pq(8@2?9UgaiFPd^1$({0cpNMgYdcpU~apzj(8!8lUM7nw5j5$(@z*sI z;#e-Eo+0IP{?7A%u|+#9J3>_GL5-!&(8N&nGLxR%8MlN)Ht3JNX^;;1QS@lKtt8b- zFpqomtiiOspg)AUxc4E4;0Y#30!`2!e+kqc)*+-h+-OH+1911@IAQe$*D;>~9jor} z?W_}Xc?(*Dtx4>ji5-60KjQku3Dj-;Z3hOC{*fQ98Y2-*UIV>{jkuBV*;Kdn#{X@0 z`1&bK8_hKjv_`nRiU1kAl|M3`A6ezI!&ic6<2T$6*UgJs_10QL%6&QHZSP%l*>OrO4G-P%cfY@o zDTFWNL5)-!D5JI~36$0<03n8Mq%!zU987ojeB0x2Ofazz+8k9v`4djMR!X3UVlu({ zwKs9-Mt^m%H+#_ZcBrkvihZA~Pb3DXl^4qHT7G4tki>`sTa}C0TKj_*R&P@Hy zJ7n^1;|@=p!KwVoXUlf#a1WENq*(0|N$eZ?v^Ex)cI1P@CG`ZM(8k5cY@ow{m8GzA zoq=Xo2XuD#ZtLHGZmR&g%}DX77~>mOqkIPQJf;SZy8&?N4Ot}{I0$hu_6U9(OhZx} za`%Mg9h4Z{II&LpVk|LYg*2s@ht@{vQL#$}$}m>UFB9beKz1Mb!`E+f{oIImTHjul z;$Y6IHaDL4oHrdKe*-CD)@{S47HJdYx@nByDB8QUcck>P_u)c{1Nh&4(W(X}Aqyr! zO6~_e%Q#R}&s3AEAcMdPG6J($jya2s`SH*>fD`&4 zF7RAu=A@VXaK_M=FfHGSi_Zh%JPnMA0n4&B{~b4#AT5~uQ#F$t%u|`#c2qNU6uVcZ z#EZ=L{Wi(oQh`7EE2RN6kVm^2>z8gmeDs)H__xdj%1Y;&v*XT&kt|5AfthXmPcy@8rC}aSS7s0{fd`D;K1>Ru ziGR8NecN06{m1UfxnZu@pi{-P|#as?Z|Zy|shk=?)lp^p9Jzm|5_){!3koXnPvD%=)B*~KU$r~v84`OakK ze4NCiC+W8W8AMu7nQwJjF<*fCvamr#l)Quow1+knLQ}(srgk0j36BVuuzWp1#McgK z6)Pr(r37R#i;Gdd7Ea*L92dofkITjw$w~HsAYk3(AHQ(&-7S2QXmKY0NAH{X2EbWf zME@6MtUKBL#GIpCo=oFB9lZd5*}O?^at1^La;JLa+s+b7a3u5>7K@_4mg{kqQVVp* zF>waWuS6ok7*_y4WOBo|3A>o zFQ5WZ-WX*p%56;1$mc9s`MWC!gS7HA^M89T-%DU^+*OEL%}^{)%E2tF`{UVU_~k{cpcj zWoO7&xJUNW9QxS9kGS%`1V(7=nNT+=vKsMDhmRSwA~Fg3wMd<)IDmuP*fTH+ZaK5g z5>YEaRl)?B=~Boq(?HJR#Y>=rYPL_j=)*jq3A$t^0t0i90uvNk30I{jx&wsEGKS}Y zr*f>LyI?EW`n-uP#&`b@dk~?Qe18IMBN$I4#egElY$fSau-&6C)At3z1VU==x5>r- zD`en;LI&YKLIxypR^GR3c7)#d+1S}Qn3o@a0J%XNbn%dco7ruE-u+(a+78c!bL~=O zy*Z44ZL$KoG9`E>6Y>sMnSjZ?$A2J#JM{ugH$?YZGkCy6NVKh1(@MA|x?sAKnhj_8 z=#L#=`RxYlGnchvPS_R}w6RT6H{;*ga-tVO01v|}@dQD#>Ob-oW>wN9Bk!SEL|V_N z0S6KEyMurhr;q@3rAO9s;M}e%GP9xARjkz$JJiGd_19$>qcAovXOw+B8I5D%s z^{eN)7k+(m==br1IIuEcm4WNa?}V_6RKZL{R)h5zd?Zo8K&KIUjw;w6!4@lgxp=3y z*N&$*09a>Kvf1{@Q~xhE_Z4*82=2LjzVN3I6L2O>2VT4)bQgbOA<6~1h$nvUB0de} zVcz_ihk^ULtje~)+BNPg*1%V-&*Z)GD5Yu7vn}hX9$&xzfk{9_tFE}eQtD4w z?XrRl%)-c4yEWtZ%4RPi1#IK9?Vxd?$^L65#lHZIOt#r`@jr&mtJpd9C5E4cJQ~z@ zkHjf$CM5tv1xVO&!vLDwnNtf`1+sL9Wa;lgeB6F$dIq{s2lEq)$07@P4HRm2GRKbo zkC%grWst^j910C%9zGMzj?59#MsC=mtv`4vDC-@m=*AvxiB#hj1oc#(+K2@dAyH?jnW9g%)Y z!TbND)r!S+KR(@x{#H~NWvqTHFz6!Z7O}F{hfjFD&Q=IrT~C|KVtrZOwRezn2%6c_ zM_1PA%sQ11_hrqwqgdZ}j$q$9{%O=9YSelqQV4>Kn$N@P5A76OjlSZKy~;SvJ2+^8 z6HWkYkp9zrdUh%55Pn(n<_y>m3rMX{^NDzbK8h4XL?!*k_rcA(Mr|xxV@K1S!P$aT zv5;>5+qEF50Vmji9Zk?rd ze8l(DMDAFQ;6S9cEja#fBREgT%xnZk;%DZ1 zEm%p+9H$?2XYPIcWc3`h)u^-3iEEG%EFLSmZ9@H)im;#>tB?k4>;kx@C2DdCP^xNm zY9Ds`iQWXS{;7-ujJZ-1_=2;!(wglfx(s2GWAS!0TPMS<(skK;CPCPzZ`cZqL43z) z02=Q+)gh3sX@KXx*E{%+pAuAwKA60HYudV4vGfV?aOSM1oUE&?Ij@T~8{e2kUNdNbsV7eB>>qS zlkmL`vTgR-ce+&S^56inou7K_1<(~{6`sg=k**b>6#6xw%z;Rb7)-fd0ChW z{{`JAe_-$&lxdA2n;zdPrDr9vaBT?f-W`~FI!?e0^o|aLxC)WxA+RLWR!!Rb$gT%= zPHJiN>b*5wOVn}e$AV6Y0vZ_R2Ak1a2+igq%Un7c==v$PaI?g zAf9x8Z`V7P`afqpL8*tpi~g^N+=H~?Kw$b9Et}30UFkNU+mtD@9Q{fN79*1KCfWR4 zD4;$*wRE|{UViuR; z_Dbq^{EP#&{Za5QhhKjwN_de}b7zM)0;kV>K(Rt+2$o4i>|1(E?e0H50oazK1^3f} z$*&P*sc9}7l$N;5M7DKx{M6G#dDl8cqV<;w`lU5(JC`@b` zUhZEy4*GszE^&V^dZOW2$3upppudT<<3D-v<0CKu&-v{iT|N=3RFbL2*;|<%O4{bp z@2on)*4~`uDB@{5t}8{~g6UAIUMHvZn(Kde42>bF+y5hJF z0JiJ~T1J@{aGxw4{HZJCO7d^Q3b_O#&1{g+neg z@7JbL>s?ay?jh}4rz8mgvH{Il|64P*(Ky=@B8lvk*^%1bj?2y&Jys(P)>mpl*ISb* z-)m4QdiAH|@F=f&ZK4BNNO^5jx6?CRR7#f*ZLPWf2!LWB`H3XyZ@&ht(+Aoo=RyEZ z5dcF?_D@9JPT(#N0C%PTF@{lvMMoE^=yW4so zQ~`)!K{e>aZm`6u6Qa`Sg-2$lnR~bWu4`&CP337AYY%UI)J?VfP6#g^q`4J9!(B78 zNw$6s)T%j4tqOHTpfW}y;~5I)E;FaE`EC$ACx zl3C2LG)AbTxmq|g>9}Rd60g#n{qWb}Il=?hk2GkXu%pr#IaSLRcW3%+&Vr(yQDS5S zX3m{Wwdfm#ViQp-f&eM%8cpt#4IzQAEFOh{pZdfGXjRPv4nj0dP(4Hzt2Z@@o%9)E zLA9EK8E*8uR$cR%;Mjj_uCz3xBALA$8S{Qclyp0DS+M6AAU#gOtzcVccZUgUS*FYWbQfwlEog=o zM$HP1;Tr~oter_XOjBA}P&y?spvr6$u&L@l`{>%SPIIZ%Mhbq(;p9idwm~U)Bv*Iku```RzC~u+J_z&rdES3_&8+<51K*fkvPD7jtn zn*4F2RLRtpBV9b{j9xw?0y*3sLpCVSsD$#2g_;3YG%u)!bG=2d{3PD?gRL=ahYpW< zev2>rL@pYXV{$L*X(ZxKxB#Encp5%Tth5){hFO}s6zf#C%(u;1XNn3MNi?8ihm5CP+UG;9tHjvUJ!~G%w6z#uL}flzcFbUxWn%98$YKx3G&U` zfBELl>^jUtHhs;S&w<8U-Wqu--}oj(KyF2s>%ViX8t{j#{k#OcIQO(xgh~yffi8C7g?{V zM{pZ3+EGK}JD==(Jd6(P*&c9}&~BxKuY>)0Tn4&^I)|ixq$Z%*n@uVFS8Bq^oWH!6 zx^^HUF=U5$Lh+YZ@GHSwbDm z4vQkak+R&aVC-(uj>AS#(gE6L?x@p^ZK(5*gqke&DD4D)d?UEQCZH_4?%EW4Yx)jI zz2m1=aZjOK>0mIsS;Y`WZ zjQ*-}hl*dv-oq5T-DAyGv(z+nY4(C316v2aNW+QuC{PEfi2F)VJnav0kdOuv8=%wz zO2tuauzf(tYbu0R?H%!b8o=J_ox(=R-z2@JN`1}$6MWGdZ+@RQQnJPKTFw`a-;{)> zkz73=(vNm8K{ERQ*~R`}b`j)TSM}i1Ol8J*E8aqry-m_RVMeq{VbP4#T^*DR_I_%hYemft9 zIE*#~Nad-b+ezs^54bJF*z(|Ef>e(4E;Z?fQj|pjG|GM=aja=*plru+Jno231Mtg+ zHs9A#XDMuMno%-MVGe=o5>}u8s{~%OUn@80{7Ekf#$MsjZHyp?|BkBGgX4tjf=~Pp zF7uxD*Q$5I8&#N>MdiB)33A4qV4=<I-jwYj6BkaH2kR?H(XZ36`4%9fd;CX|Vb&y_d4fu}0x2CEsxoKWziC zp}%Tl1IRf%`BBrmw4J8`d)|wqm~kq-qlc^G@m4I=>V%4f`A;z1g9*dqzdTK%|JLw% zIoaR!Vi*JRylb~df_J8WL7}OvYydV*>+-9C!0M#r8y{{|OKEDfZk8W%5>OF6ToKxe zi!SF}kDlWWHsqTdu^+2-H^CQhuT{1+`*GlKYL(qA!2M{R!HVJrtIhkczOJ7GJJSL^ z=E*62d|9<;Qpb_1F>q%WdGqaZaE*vTlUvDqkfEoj>vud=pF!^6yUQnkurT497>0#S zCX5OVcOPZ*?&t%DMhdLpLK7;S{KF|7lv0^0JV8>;VWJH()PeSrdFv}B+8;a6BAq2- zP#N{arIVlXL4gOCy|nFIwpeLCHrjp5S$$+zuth-SMZ2|R(<&c?KAx(eVJT3UL0y>I z5iLe^7V94K3W+V-n$QF>>5cWa{vB%tu@kixm7vzz(JtoQDUpw?9vY+Lo)NkEQ$hXY z+tfKg17lV%-L&`#c0>{;&EbJX?_@jOd^%{c#NO06Y2!;4N`5e|2fG1eGg+*G!22W6 zu9C1vl+LwpI{q+7*JG=epjbqG2OLC!%o8NcsW+?_*xO$1NUlhh1bDiSoqxE_d|v?l zGdnnkeeOrT6GXo}z-11DPOky8*`>?M_;d{xs51C5GE?AIL~Cvu{Bub`)%iND!P4vG zw*~(=gLmKzG&NKro}*DJ9r7LN>S z_KD_i8Ggts;R1zn&-tDl4K|#WUBA4uK^4ABG^9e@zFe1lsZZu(?vPNVK8p{ z#J$c4IHLmkvVz2^+&dt-6M+;*46IuX{71+JEK=@kj_jPc?6UQ#$!KSa-9q9la38UGVY&H!g)8nK`uyda|m(y%Bkz z{$VmIdVB?4$}$m(ljHT_0xbp$HQ@a4z(P-Mw2i7yVDkzsjNeaPe*(4=iO8#-;`?-A zw4yDF-Baq7`^JW)40t`sTv4%6V$JO?Z|SL$oCHj`cl$$*Sql<(l!E|=vy27g9Hy2 zPm3V&GmBtKfb|;4L>^KKf`PmzbI{7n68BAzPJKCT3_vxZ_=M8j#EYxD0N|``hG8MZcFUt*ucVvQ_d}t;U)5pE*0z+{PC6bTTNx$_)H^ zP8eEbPA#!pBecW)ISBGHgOvokecrr~WNY-h?vK8qe??p@cp>USOX_c@Do@a?=H*%Z5%k!h3FeM<>TWZmu&5har9ER>nUr^Z)#Z&u%T1$*|=1K8}GemZ86>jM%d(?sdHkSmBWU z{hcoq(`7au_bVvBju)~*x&W|Lbr1`d`x3%Ue8HQyf4Ec#87GGncuKGOx_mYnJk`nO zw~#M6Rt9abJwMFTmqYlsbC@8GV&q(hr!3=fx6xX57R~)iQ2P2&l!s+R-+rJ$1E)20 z|26{FzgZXX2S>CVI)&w)nDFCMum%=WuS;co95LC>-!l+VZHqU~pPmP*5&wTtjZR#j zjuo~rb(`|Ge#1)2q`Srpgd7Vvuf?&hU@u;Xj7t4%r0(w5Mt^~ObC+EvkFXv$SlSuo z6m4HSpqM41339<&scXN*4{J$bGH zd?f*iU&fIdg&3fH)1dL0mGMzuYIRO2*)R3k`+hoI11_=zvGG2zmapJy4_eW#t6+yT z_gbp`ES9B6X1pYmI)QQ9qfp;%VHJP{uz98xTd=uKdK>Zp@p&s1QlvaZr=_`(cmm%0L&;>4* zmEp7i2V&s)e%jCke;orYTxo|wBJR*+T`_*w=}j9|l@1L?=xBWjPf05hRsk!?9Wh_O znLMkjMsLKKeW6wV#k*M!NeYo$T@B>x zheBQP@Y-S3O4W`HfnO zPrUkEVv=5Mkn#fQ`-JMALO(Yr)h=U%Y*kH;a-M~M@T$8^vAdL3Y~ov2-X4?vU51YK zu(Xc%UpfS&CRgiw7xv%5xxJFK3?{j2!rX{6Oxn_GsB)CmvcCAUtHZQ!gjQj|t@oX$ zGt6?LO+GD59rjx8vm#Yl6;#JdFO9F@tIgGYg0Jiz?vYEzVfwFZ1t#+23oG^4OZR$( z^P7yR!o2TSU)o8lppW5L5yYAgka?8%K`Q`HxN`f85~rj5uY-+$(`yJT(8T*Iy^hmF zv(VGJ@p?IPlY5@+?77y^FnXznb8Iz3-vK>o9|sC9uZ=t2>^fR_I`U7prE>gy-Y|?I zcofsVUeZ5IpSy2?{^mL`7R`bH)C_rkDaffh&!c~aq7AvDKJg&)NqU|5WN@*XM+0J& zoVe7b^CR@76y5YzE5j;Ga4ot>A(!aOj#49=doAx>B??El57^8G!^?;U#@^r8^7YcK zNhr&UImxb$J|*cocsXK{KvXpCrcvadx@SAZzI}U>ID=8)`NduLx1CqgKJVA0f3D9} zqQFKv4voUQ;J3%Wno?!YKc7#R6kIdvbxn4oe|qkj@Q}(sqiDsQn%(db+V!;T3;ZE! zwWc%m@Ul5`gp`qidTVM)6_c4?`^N6hi;3O#_J!|Wo(nw-j}&U_m#v*AHr{n#EWcaL z<9Q#MCsw?>Y?l4hB);k1WH@|)8{TF8Qgyxhicr0n@%Qmhim zzPc#(42g5kz&{vwi8$&8+xwY!Yo%yg>8IPe2+)9!?RW(a=pDG4L;OhsFSrEAVp?Xd z{gMV^5zWlk#Y_1-w(EEiZEuFzUyBBX;uI+Ga zt01D2jzy0JIZbNvQG$FrkUw3dt4E1qn^^yFF7}l#7TtXiPn0xBFZ*<19XksX+%ttb zivJ28YdWFMAzGM=CbR(=o+$T}JL%>0{po`8NU1rm_$|KH2>g=f#Ws^HZSkd1_~Oe# znHSTP!m4R(yixqRCwUW8D^O!X&B;&6g@(|7Orh^%YE;03#?hj=H8CarOm~Cqx);+f zJ>^a2Ws=miN!t!pSFWyPl)yKbXVP`yxe6kMQbnsU*n_;<`*4K%iyAjU`VnEpA+1B1 z>Q3EDKe=6C^_6Qu*ipz5H{IA3$L*p6#Q#huT4f|xJIG-m6is?!`WBDCHK2H zoZ$;*x+^9Z5}xG+?|r6nHep~i{h&B^=m^ilmp1p*aaE1C2=DG*rF5NcZE*cmpI7&s z6xriPki9kRk+?Jz!{1zWH71}jiSxv;LX07?WB(6gzpSyk(N#kD)TyOf7}+VFRTKJ&!=@FEydY#|oUoX=m*6(K^U+*+ z(HYxqDNZ1@yx#F0&Uab#Scz8$$~nkNb0OW0KEs~fGekG}1vd^s%_8PK+ ztbD-jeWstAG`q4=$AR`2TQByUKyO8#bVQ7&eW7bhPP%{C7W=a=d2eIZuAM{9|2vcp z>L$%X4p0vLr~J3aP!rsF!xFvzArAwD^^khDntN`zr0^^u00I11M{{J3XcO2PXJEw( ztZ@<7a|puaTR?|dnH`nmPpCkK>-E<3*%Kk~#U=~sd6fM`0b%M}Z``H+0KQ1F+Yl3l z)vZIf5e(l4cZVIuz5m_YMzbV+HcC`l7pb2mYt*?VF29{tJ8t2&%-hv6yj5kj{%i7; zK6u$)*!YoV^`5B#FKu*5nzh>5 zp^NWc<2lwU+DoJ3&yse?)!K)xZI?Uzv<+*I8A%(jj;DNhA<8lJKL6&8l7d;woW$`k zpM~#vDj`lSm5>zkY7BZ8R-SrZ@Pz#Fn=O3X5#@c#p`=k7|LH_#`#epHo4(b#-{zZM z-&D)fJ=q6u}u!2JL@GFR&m=fw9rw8JaQ9&*!pqYHr*2FQs;U zco1D}Y8)&|hR(yL$70hJy|mZ-ylpov84TD1a3T!^Qn{Nkv;>O4wnT4Npi)B(P|Tae zzdb`ZkPf~rkBhE!8eTy|p(i1a{I_eZd>pVpJRTIuoEq1+zkm#0W>5X7WJ_}}89h?Q z%uU2yuw3lOlOBo{jm*G~M%rXOynqF)?*bk`^UcSZX zKl-5)d8q3BDy3m`{LYwK|Fq+pBDfTbyX%u$sw%Jlf*1R*R^2(Z4Ax5F$KL#>#pgA^ zMe55Y_^bHr^zb24sAZ8c7MXOvR^KJ0aE?Nt&)J=f1`I=55LYp+ba@Z()*rb_c;S%C zQBD#<2TV-rsgVZy0c+hsuri8KLv0EC=Vvv-*)S{cML|w-Hp3-!L1;p>WRwH2OwXI} z*`KCtfTg7awk!sV($nA5?m_a0HVOXRLr=(w1cWvM8JdqS>Wp|d9W_i;s& zv2S_%Jo*N zp7LLwj%-|hcE0m*Dn)Bv#eU^CeqGktiRg(qy!L;R;sqboF18S7S^mYe4kB>fkRtglyIM`0&~=0 zuCLy*9x zWzbH_h(Kh)XAYQ`BWEepY{ngW$s_=@wsltSmHcm?0To7l2exlHAF-hNGyv|^I^)N2 zAH#2KvxTk~AML#=(@&K~&6sUD^L?r-!K!u(cP6KW@*3w&1S3Yzj73ULb43dnJzLG6 zxDXYe3wP1|!99ByxjzXBu;5$g7-WKO2&7L%uJvy1JDJR$rnRLDk%8MnaR{ee_pBZ@ z9UIS)&2xf0YSd?qg0NRuq~>jrRF;L39sxbFx>L2U#bxxUw)F2Ccq<(qE|A&Ho9|X& zN7mM9m3dUCJ=`n%HlS_ZO#2jnA>u=wmGF74+terE7d0IU^L+Xj<~c~4Kb!iZ;AgJ+ zI1b#ofsn)e^9x8YK022)1h>u%=9`AD7*VaxD3LmRzB0aKcGTZGMRb2@LU;}#>JT3S zpGmTbeXCX$R4kEZL4#~nrrzv+L26)8lwO)a&w6LD`%A+)^Tl9yjP>a4Nu zP7u&;p0B%hsmH!@(A;DWvb6YJ{x!@Dw!^;VcTMUEY=m=!h;*7-KWQZa^~vRE$lJZ) zIxz8z=i*c#gDT-1aACC&61AuJPH{`r-q<8|*VzabsOs&a7T`&_=()({+P zZE74Q5)IOYsXIEhk+&xU*do`6v(9q<8TSIgTWTsx6GL+wh995k)lJx_)=fA&Sp?Lk z)?!N|MUjlFEy_-mq0LvK1!g+xp2=0D7B04WE0L34b-@kI$y~`|s$%tb*LSi3mU!_FWiZEjEH-kBEG`)qbXMQYZWA(>c>T_DJ{~iQj^~O-6f} zaM*+KU>I+sIt3Hq)_q5;+VeR6!DH?+)xOo&b1OA@8#UMS-<_WnJvoZdsF|$D*WaI0jr(|7X=5T^#e;39kuU z9=HWwnMLKhP)#8TftZFLIE-^4a4KB75Znt2QBeS7r7ol?XAYcpYG3U8YxyF_U7fAz zYx)ruzp-w77Kwm+HYX|~D=z;mCW9Z&>Ft)*ac!n0QIK(^%Y7UkWuEU2NS;O|m_~xX zRWbz47tU0RCNFAmW}&K^X09{U|FqSDJTPxb?~&9D>*VczO&#m3%UeI`3h8+m-j@dV?-?^ zu%)VoscKB$soATvdl6$pbESX0J{*?0d7cC*L3b!0?cSla6jZJvQhQq`@q9*mB~Tog zZDNRHr)xJXVT&{wS%lrWU&zHD+-fj0yeW_>#fg(@yKo!fwr0>fi(adIC@a8VSE8ce zN}~v?jhB98WIlSUwqxttvJerCTh?@`&<%W9-DSQ`5`$5d#br$Ygr#Gw{w~F=W{^D-j;k=;e)0v)G za;d>qrpLQ-7anOk-HbHv;`-*ir(<^eVI$wgV39}pBhKKkC7&HQoX#)ag{CAl8UMzv z;?WRU{cWFXN7$jRKy{s1jY|;uV~>0)&0S$EJVLCGb?`{oo77+-xVtZf`_|iA>M#~v z{GTh8_;^PEf@B1wJuMv8JfJz;HVZF+2ujp@KxvG;12x}yLRFF+DWOjiS^{+A@Gu*= zcIr--;O=jZp1|6NDWjr=Xv>|)WYFG4p?rF|VX4B2%6cSx5EjjK4Z%4;9a`Yqf3@R|9=X*?&~z zR_!SUX2Z(9ZfQaNvPK=pkCz?SceA<1#k!C3zB2|u_KnYRLuf(%XP5Go1u&`!n$LiT ze2RtjmL!@`j;YWm%~b!4%yZ>U37Fo(=x^B(}loRy9cp3o4=$M8b{x z9$`2uKiP6RUiZLoyMNZoP^`DXqwq~P2ED&`Yn1OYP9zrHb*9*n_`$s(&ktf!PhR}G zd87YiBkY%^b#52(&I`nDk2}&zsZ9pGc6P}=I=4vj9!3&n<#I5GmDb1{-};Vms_I-; z{~{boX)=D6S8}yek7HpN&nLLDHYm)PSXylKH9Rl4k8(Iv%fD3jT5*4`+19AKpMe1e z$Jgj&53k&Vin(R_^Uh5|V&+Wydg*S;6NuGId8RC@zJ`;5Qt?f(-NcNcuF7f)4r`X$ z{8Km=gAY|ayF@%itZH*NWlCLw!d~Mge-z0y8Yl3WUtZ}!I2rtofqzE%5!S!`$S4}H zR^F93+69<<)7IU}jRkhUh_{lF2WLID-d#hBX3FTM?22 ztYfC%J13RsOsPsnBFzFpxBd5`a|G7}rrW}U^%!@)^!bj=Rgsl&HH*j`Fj}!%sm&r+ z?!@$ZH@%hFxfuJ5;}0s7VaY$vHik~fC?ViwLaw5@o$-@NEkl@^HN(;$^Ov4YS$1>q zrvD;zNK;79;PrTRY9ezbHfZ7f#9Zt>kiEn9E5ygo`8RZhmPd%(Vj^t6;!M?p9qmYK zkm}Tm7FdpHK{oqD6JB~4W9NBJV0^2WIiNpX&vVOWqLl}+#`oX_o3J%THrJ*MQQWRr z&PN@8X)D(pH7b!nnMb^t{XOH`X1mcmK`K&?n)iRKFfUR38X0zzzO%mt-x~=x-#-kA zDY&O^Y)1)7d0Qb7r~FrHdYLccuyRRAbDoaynjyZM=_qmE(RHs?)xEHzQW|NvSP>TZ zG{JE;#LVjbN56|ic!E|EOe%5)e`KwpP}ch8@2u4tt7`AZRKdP&b(bZX?STvF(j_FM_LT53jgwN^wj+Ekrse9TT$6ppH7d%Z01vK&hEtYFkuO}J8N*4w>?P8hdsQq0qGyW&nOgSD-!?{6COj}I=GMCEz*x~T`mGoLuZ zuQ<0yGIeUQ5;!+kraD6-_AQJKinWy8M!WsSqdSIkdv6|Tgh5M`mc-7gf@TV zaBhvg^*B*-T>l4%L&yvImGlJ&(Na-~DS~p4$KM;6bi2OAcgZlQkM_GYrg$(_^LCoQy-KkQC(ihXAEU z?y3+bYWnyWYZA%hsO@+C3vk!=nkMJN8{9MF(rzEd)A99`TwmYrbgb!LkPOGZ!?HCh zELm^5Xx+QSk*GVIA}8KlwRTU^dX4fSUR0{rQh(gS_XBRiv<2n7n!SP#>M%i>>g5_^ zicC7SjJwpxS~dQ)d^anhakyZzs)+i#WRX7db?!lMF_WO9>U-nbU)*zu)v%bijR#D* z9;)vpvw#`C<6wP}h^5Ja#44uZQ#EH|;+~DxmSd1>4fAC$A!Dsz<d z@d*L&l!Y4D5&9p-&s;=Z+83(knY z>hY(M60y=|A_+q!mHE`5 zWrao~W>^G0Wupq~x^^N&OCUr)HsXj=D4sf`7c{grb3QABxnjPb4R@5*<}SvH?NVBd z;jJ6?u4j3aZVf)Jz>Y>FnoZa%#{8BVLRBlk09?5Z8X-Y0pO3;M_p)^I!{)2vPkr)j z{@FbmfBin1#HLXi>)~rk?z-_^o1bFj$~==Aw8xd>1$M61A&aq7_TJT&oY8)9OFv@Q zl_YH8`>ifn4l%(6?d zFYBg}Ic^FWf2JE3lBUddX>v}?=b1*V7KZz)3Fm%ZsQpo?lWSku6QR3MDTJp?t4MY= zBX{A;In3cyJrj@R9NeJ0|I!lgLr~3~ziEkE=wv09qZAyKGe{z>*Hm_Ej2w&Yg+;qx zulU?N&*Bc3(p=rQ*HVV_c{DFS9s~r<;@xk@G^v|VL9fgmCBp>OYD%$3D9Uq)j}n#n zNk@qh^clm4$Z^ha9?OUXTuM^74hUPPDKyseJJj?aul5Rh8Q25f<7UL`B4Ymg|Q&A#{pA31;itxv{v=G{aTf@Sb8rQgu>Q!74c5RK`P(H*3#x?e3 zc6WmZyPJlkKV8$aHbbw=`a*#R%#&@`p52UbU^;6lK|Ii0_zT(6u#HyoScsj&c!=~J zjnZNaH{6DWDHEUMk1yaj@42_rGuBs4$d=4vumNZ4ym{7o(x-Q0ijG1=03vL7?+M!8$}kaN$@erHWu8 zdP>lk_&2Gb6GdI)lz%O=54*Fsk_GcyrZDVomx7BGEsffd8+r-wF1{UvC9no+Uw!5< zZbL=H;a-3p?fD6wg!>!q^dB@*(A~Eb4}aYPxkWxEed5O-I8;*a(|HB-$m_nf`($dF z!9V*+IJi=I4F^92Gj|AHSgl!zla3$W*X(Cb;JxP~xvvr}fZ!{9R`OjS0A#jZl_NTd zW8!zTp3m&!>W#arG*8aliOB6`Als8HUYV*?u(ve@;nMz_WHKHKd^!f%OOqvd zp+gIBuHEOQjCsL{IdWVj8lDeRR-W>$82~IUb!C%FHc&L_$4>>hj!@0a+%RQMO=!37 z(TUK3i{&*r4gMBWNgbSIETnWL_nY_?x7G}fjR4N#y>DlHRB%|lcNsMgMhb`gg!b1y zkU#EzFogVh1W}3(07<;4zT4iV0xFRVY9vZ?3*>;&l&HQ%EJ7^@do-W+%g2099KhBw zPS|SyZGgn*c^#{r%$!FHxIRe36hQsd3T*DbIOcmw!*Z?#HV%ID@*AKUcEVpIHzN5K9;Tt*bMOX%;E%__zO=Qf4`Jg{d~#9%_bVgw z$zIk~QeF*z+sR4hu1B##=iTJs1q?@IwVy{cD<7j>NyPj9^zO#oVy5=Jp5z+IHWis z)o8qJ9lEbmetH&vt|?KQ|M1oS`{9BE>8*#)bFSqCtZ!zQ&XgajhF;DMpAe=rbPVI7 z@On0)Xyd4I?)O1Op8#m#A8l&`9h4`MlVA})F2n2~LbOO*)u(J$RJ>&tHz>_CkVkmy zI6uXX%Gn$ryW3{ExM%(rwnx_Dm=HEppzK+U*L}khvK|;wxiFFs!;Hvxfm6|Q^ddrQ zQ!(Va#g>2LY?koU{?=uZX%M`Fn=zp$hbv_ACy;I{=6c9sv>&kk(bKsEb>^u5s`bTx82C6F3$bJ+ zNO^#}#0|cFG%y;7Hj(mr5UMAkMH_A2jK>2L$9?v9Oo4FsR<}i!_`NA=bLeek%mK$1_v5wev3qpg7c>BQ$#S z2K-#nARKh;+xw-_Q~SXxk=O64C?CFTRLgpHVa@f2u^HPkW3W#7cN2Gk4tiOU`;(z2 zo_Mp;uZu2kNe+?MliZX+?#ErxN%VUAwD^2IA_F!)$i%h&Mjz+GS7tJIMMTVxN)v6v z{Px&4WhEVy-v;cs>j(nx=qa%=m>1zYE7#O|)(EG59RHxWceNOMPP|ci=`Dtqr)iwd znQD7?DtlW6wKK!)bk1)A!07FfJ4=y=+?mDShV#qJ$1#uX&AqSpEX3Xu%RZcw=UCj} zG^%?bVF6hV4@O`0Y6Z()zjAk#*veAN{^W(qXGWL-LZ4?Ht{kDVKv_Zg1RcvBAZ#~f z9PONWQUi?0lhf@vL^E+Q|0GLr^Mt4C52%kqXXk%I)kNVKpxp-ReNbz@-ux_xitc)8 z1jxE~HSF`^nHR=2Y#c|*8f+4nlxxi#75}u9uYjg-b@$?}J5c_3<{SR){VO@DG&^F3 z%iI>qxh`Id`YmCpWKEuGFYpu6zKzL$m#Srs@Rj$k6h|(dk874v5}LU$fH`jQ_9o=i z4zGh$z$SH=1CUItJt=l_R3g14oHKleB@DJQYA$(hl@i|6<~N8cTgCUJvUe8SVqkJu zBXRS*I~3F3JlzML5{I3 z%~nN)A@q-hP`%*c?Kmb-_l?jVic z8Fws)PEx|cHN#@L_r8sk)IFb_Q(ut4}o%a#lJR$9VVbJGs&%;yuH^~a| zL@RC0p-nC+) z!(XFg#-KiBJI%b=Sv;n)MnYCjQwvN7d!|U@24{dn_^G$aMi< zyA5h;?yU1?3VppmP&wl^rVmENL)qgAO%?Q;D&z_bJ827CTl|I;<@FM9`DRoQg7?Xr zhE|#^x}IGaWcX2GtGPO258ufyv)UEOT;>MLfL*`co)=7V-kit>>s_IK5H3j2NYT25 z7(s}6^SL$Y=w~m2o@SFj!6_J6mwU_`z>%-Z9$gRpc65}ehLU7NoosY;>HQK*=LW_S z#{fyadyV7#dgmwwzV?MMlA6@VUQKb6E^Zi}>IEnmU26ALT8LwdTp6Z)XL z(9I#HGW89p&puE9a(S%K8dnWy^M??cn&Dwf4JFsS3T4-V z+H0d^L*R(-7qBe|)*V{zL4xv$Wix`m?R{(?vT3!jO5G{}1M| zkCpARYvj7+)1(rWe!%WR;y7O+VCeMYR?{xuWh(+xb^Rp^94Egv9;>|m2)iCUVp_KS zWL&-}m!%p9)Jcj`_k)JujMkU>O1(|*Qx$Dy1F6`cYL~1Y9>8*PDeWcdYLCV7TB%IS3!t;G9k&d191xZ!c-_G6Tk!K>SRAyax^+U$q zJNfRmH{tKYNWW0w;ZuHmI zOFIsZe^1stip|_XquHM^Uvmu&TWKjd7T#Xw^|(->*5Me^1@0De5Zjr|ISX~%7AP7d zEZ}oz=auEkgb`H^+Ua|{JvlZdnC%fGZXvf_sZ7Jag|A3j?bsCWJ}`W-E-D4v%1nIQSYcJ6>s-3homWf#c+$Un3VaEUc9va&Ts_I zGbG!U(H$Lno>obrTx36k5d@KYz2!4SOwd8C2KJ#Fy}| z<_KzE9}!NoUF>Bla?BTZuauK9s3lal-rzHhjj^bKB=q?rNRT(+jfjl7)M5TnC>1Ld z(l6oSk+0V4>}P&&|FP$7$G3$`-F;QUyUemu+4sm@6}dat`#-5?iTA=a5gsZ+RAC<% zz(%LNOcb_i&icdurT7$&M5czHl3Dv_Mn8J{GW#)nO4!3(v-7Z!Ru|O^3YUq%e}K)xgl&e(5>%y0T2r>f+?cmzw8FE zC3(0~^=Xb=84<7>hZ%|tRuMs~yQEjM{X2 zwQnETQ={KyKdvA9LY@qMO`McHZZSiuA^{2&%gM-awXF1F*i+`88q|@U+x z&^xGP7-7u`%<1c!c{QAtAePqJ!`*kzi2CF;p*$EXP_*E)_1!{IdX#uWFd!S5>=2^Pw@NL`p0 zh7oX9YE0iopYTZ z{P?_(k1g}Q&x(89>t5?|3km2}R`lH_bGYKiN82%>eX>8w59_kv525>zFpK`oe*;w} zZRVCI>BNhT7I72d(K?>bFtnKeTX$W*fb4u;StgX>}0tr(;7$_yGlOj9%N9NsMCE21?8iJ?`^R=moMP%YM`@$ z2HMk*-}?8a-E&{Tl{eKvDeU-JMa>t=EuZ^r%v=l;er2A@iCIi2U4Kn#)-oGtMJqVC z8vW;}=`=BjPi5N_*d-dEi0VFyzosReYg~+4Ps9_HX!y#($ognW z@EJ$ylDzrZ+jB@M+e*_nU9We7mvy#8RKVhkR6*(sIX36|x?1Ymc$WR}Ta%_wjB*Xh zYtv=3sl%!YWjx-kNhC!s{p(*_G!O@tBNDT0R#l$#Qvi~%r9Tq40+hJF{Ex)lhm&?z zYH1|4N1%l z8BRo4dySJO{t^pJc$cty|CK5jY-eu3Gj`;j!!W#Hg%)IjxOD}PE2Ph_{_B7@hqxa7VfS6vr)mfhisC%`U?}3f5d*{w)~PT2Std z9MV?!I>-LEHtv2DaDeHYsjt}I>5BV>>S^H`PfQkXM{xSDl2RX&srxYEnEY?3QsE0A zH|H8RAd_kWS8DS!S~9yhJC5YUXH|I9YyU{rm2zC&3iC!-sKsM6#uf|C64Gp6u+b+;Iwr_zD%`28{=bZAGm>yN7&MnA$@d-b+2 z8JvjZPOi_SGlLgzY4x>oos+^4mfhm^yI(%!%q?HLA3@cZ?e7382I1o=Ca$q1JkPN zQR*r<21!v`Pl^Ck4H)QMMP6D(CGhBQs5w?R1y5fc(zl5hc_~eTGKa0cDi!EW`i@(0 zCMbW);?w8zQ9rxenxm;=uQ!X-ZNO+3wyi&~_we~%rG6(pawjH>v;9ZyF~JyAb$h7S z%rJWT_gc1p!5w9)ImQ3Ae0ROmbG?NkL4u1hsZI;*^si@HD=JpF=bldU&ag~>PYVmY zb?G`cj&EQ7H!<&_x4wu{#=fqM0;@Nl6Dh6vUax+|hgV_DR2fj#kRs>AeTTp{M@8V*UNV%7tjp zM6DpjmQv&SH~g>g-wDKuiboM%i;vb7GZ|xj_|!c}vqW#KL_%+Dv_`JLMfI0ExS|Zu z>8vY_W2b`hZqy6ySU+fT0q)PY>gh31!hOQA-mShVz*&5eeXZB>9Ic)G@)8UzMcd23 z|J^e(Lb6`ARqmWcWT9{*VI$ulR5^quxZm2-hL?p?&;~y1mBzZc)YID8Z{W>#OIp5s ze62_{y~q6TzEnFjZsr7r#v#T!n*QACv#PQ#d9pCtbjemtgIBp3${%gMZHT9sKh-U@ zea2^lcA7PBm+^lO!PBC&dF`l285Z?N4d@ZXbstg{YeSdjHaJN${MF*SjQK`ZnOZxQ zu1fPIKbNlfgj#Kz$>?&3y*D~l-=CB*YunJ;`J>z2SfAcUiPKIqQZkH$lk7$FZhUwq zbP}6%@&221@8=1PbvmhTtk7r6;Wp*77pU;M0KzF~u!}t{kb;J?*dE#AZLs_M&T#;ff0W{};nI!yK+Xzw z149nd!vJ!_W^%*M`lECA3--oWt^$jNAGdb-?FsH0q#-xjt{&B^6s!Lj%zoOoYhlBU zPy2WjUw7}D4_x2tr(qA^!E#0N1unpAcF#6AF;OWV9%Nh@GVV7wL(P0xp zfe2vrP_4vC*B^{zDS`DrAH}(~c7l>4HYoM=ZvPHSNKT}5L!g>I!-6a%r#3;JGSSt7 z$tzsydb@bL_ETn$HT7tC%3wdQ2xZ~-na`R%H~gGmwJR{>@|fSiS0W=%^qD#lRh*+> zT>t6>LPloq`7W12g+j-x{}u{y647}d#g+IAgn$%Fh^)XghsW3a#R&;;B5xzX)zz9P zf=nKc7xRSO<*pH?8^glHH%k=q)710>WAh10=Gu5rs)2jE{KE3anzg{ z#RqiMS&`aZ|0n=;guY!_5BLL8?L8vh^$v;qm8RV-Pbc?xXuO%nx#d|F+sRcw$wLt4 z5)zJzO6;Xz1?#XTm0P~@u2o#~LkW8OlY;#ldfsEV_7?YIV`7|2NNy9R3xTZn*HC)R#^g+w_3v>na~^voB6Z6>Z*3 zL%k|oX!?94{Ix=*X$;f8iZ>P8*^B#cXYcYE920Fv2_->HaXUP-6=ma9Y!gUz;_N#r z;STGs4{7K6dr-Hm9#u|K^2V9hSS6{KOU?*r+>q*Gb}tYqF}_?N(upo|V1zth8aqe`n|Sr+zUf zU`s+!bGTRTlm(B#Od@#O@Rl_v%_nbrv#%0Am_;qT^F3RIWi6VS0L_;nX+pV^oXIxx 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%0A@052b6? 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 literal 0 HcmV?d00001 diff --git a/docs/handbook/AliECS-diag.png b/docs/handbook/AliECS-diag.png new file mode 100644 index 0000000000000000000000000000000000000000..8f6aef2f2181c00ac54fa9164ef486c26794cd81 GIT binary patch literal 146284 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�RS?x|3HQ*P#NI?X}AFzE}#YjJPU1XE?rL) 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

d02H=M;WiRGifu=4J%wPMtuw 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 bkmxKcT(O?FUV^6o4g6>w(bdROxA^Jb0c!k- literal 0 HcmV?d00001 diff --git a/docs/handbook/FLP-EPN-ECS-HQ.png b/docs/handbook/FLP-EPN-ECS-HQ.png new file mode 100644 index 0000000000000000000000000000000000000000..c4074739bf62204d1019d88cea28109dd1b5c09b GIT binary patch literal 364409 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

Dkv4d= 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 m%VjOCDNejluKA*-0fhdZLPxp&?HyZ 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

l}exP}~63@Gl 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 Mi%N-P32DFnKLQsUG5`Po literal 0 HcmV?d00001 diff --git a/docs/handbook/appconfiguration.md b/docs/handbook/appconfiguration.md new file mode 100644 index 000000000..88250ac3f --- /dev/null +++ b/docs/handbook/appconfiguration.md @@ -0,0 +1 @@ +# Component Configuration \ No newline at end of file diff --git a/docs/handbook/concepts.md b/docs/handbook/concepts.md new file mode 100644 index 000000000..c5eace31e --- /dev/null +++ b/docs/handbook/concepts.md @@ -0,0 +1,11 @@ +# Basic Concepts + +From a logical point of view of data processing deployment and control, AliECS deals with concepts such as **environments**, **roles** and **tasks**, the understanding of which is paramount for using AliECS effectively. + +The basic unit of scheduling in AliECS is a **task**. A task generally corresponds to a process. Sometimes this is a process that can receive and respond to OCC-compatible control messages (also called a **stateful task**), and other times this is simply a shell script or command line tool invocation (also called a **stateless task** or **basic task**). + +All AliECS **workflows** are collections of tasks, which together form a coherent data processing chain. + +Tasks are the leaves in a tree of roles. A **role** is a runtime subdivision of the complete system, it represents a kind of operation along with its resources (but less than a complete data processing chain). Each task implements one or more roles. Roles allow binding tasks or groups of tasks to specific host attributes, detectors and configuration values. Each role represents either a single task, or a group of child roles. If tasks are leaves, roles are all the other nodes in the control tree of an environment. + +These novel, more flexible and more easily deployable abstractions represent the evolution of Run 2 abstractions such as ECS partitions. In memory, a tree of O² roles, along with their tasks and their configuration is a **workflow**. A workflow aggregates the collective state of its constituent O2 roles. A running workflow, along with associated detectors and other hardware and software resources required for experiment operation constitutes an **environment**. diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md new file mode 100644 index 000000000..5c794a61c --- /dev/null +++ b/docs/handbook/configuration.md @@ -0,0 +1 @@ +# Workflow and Task Configuration \ No newline at end of file diff --git a/docs/handbook/index.md b/docs/handbook/index.md new file mode 100644 index 000000000..b9668f4a8 --- /dev/null +++ b/docs/handbook/index.md @@ -0,0 +1,13 @@ +# Introduction + +The ALICE Experiment Control System (**AliECS**) is a distributed system that combines state of the art cluster resource management and experiment control functionalities into a single comprehensive solution. + +## The O²/FLP Computing Cluster + +The primary production target of AliECS is the O²/FLP cluster, a subunit of the O² cluster. + +AliECS is being developed as a complete solution for controlling all the synchronous data processing of the ALICE experiment during LHC Run 3. + +Besides interfacing with the trigger system, the DCS (Detector Control System) and other O² components, AliECS keeps fine-grained control over the O²/FLP cluster, while delegating control of the O²/EPN cluster to a third party package. + +![](FLP-EPN-ECS-HQ.png) diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md new file mode 100644 index 000000000..4bae6a76f --- /dev/null +++ b/docs/handbook/overview.md @@ -0,0 +1,43 @@ +# Design Overview + +AliECS in a distributed application, using Apache Mesos as toolkit. It integrates a task scheduler component, a purpose-built distributed state machine system, a multi-source stateful process configuration mechanism, and a control plugin and library compatible with any data-driven O2 process. + +## AliECS Structure + +![](AliECS-diag.png) + +| Component | Description | +|-------------|-------------| +| core | Main AliECS service and API entry point. Runs on the head node. Interfaces with the configuration system, the DCS, the trigger system and user interfaces. | +| executor | Runs on every FLP node in the cluster. Started as needed by the AliECS core. An executor handles all the controlled processes of a given node. | +| OCC plugin | FairMQ plugin that translates the FairMQ plugin interface (and state machine) into the O² Control and Configuration interface in order to interact with the executor. | +| OCC libary | Equivalent of the OCC plugin, but for tasks that aren't based on FairMQ. Provides a task state machine and an O² Control and Configuration endpoint. | +| configuration | A Consul data store, running on the head node on port 8500. Used for AliECS configuration as well as application-specific component configuration. | +| Mesos master | Main service of the Mesos resource management system, running on the head node on port 5050. | +| Mesos agent | Agent service of the Mesos RMS, running on every FLP. | +| O²/EPN cluster control | Instance of Online Device Control (ODC) running on the O²/EPN cluster. Used for workflows that include `o2-aliecs-odc-shim` as controlled task. | +| AliECS GUI | Instance of the user-facing web interface for AliECS (`cog`), running on the head node. This is the main entry point for regular users. | +| AliECS CLI | The `coconut` command, provided by the package with the same name. This is the reference client for advanced users and developers. | + + +## Resource Management + +Apache Mesos is a cluster resource management system. It greatly streamlines distributed application development by providing a unified distributed execution environment. Mesos facilitates the management of O²/FLP components, resources and tasks inside the O²/FLP facility, effectively enabling the developer to program against the datacenter (i.e., the O²/FLP facility at LHC Point 2) as if it was a single pool of resources. + +For AliECS, Mesos acts as an authoritative source of knowledge on the state of the cluster, as well as providing transport facilities for communication between the AliECS core and the executor. + +You can view the state of the cluster as presented by Mesos via the Mesos web interface, served on port `5050` of your head node when deployed via the [O²/FLP Suite setup tool](../../installation/). + + +## FairMQ + +The O² project has chosen FairMQ as the common message passing and data transport framework for its data-driven processes. It has been developed in the context of FairRoot, a simulation, reconstruction and analysis framework for particle physics experiments. FairMQ provides the basic building blocks to implement complex data processing workflows, including a message queue, a configuration mechanism, a state machine, and a plugin system. + +Thus, when we discuss the state machine of an AliECS-controlled process, we usually refer to the [FairMQ state machine](https://github.com/FairRootGroup/FairMQ/blob/master/docs/Device.md#13-state-machine). + +## State machines + +The main state machine of AliECS is the environment state machine, which represents the collective state of all the tasks involved in a given data processing activity. +![](AliECS-envsm.png) + +While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](https://alice-flp-suite.docs.cern.ch/aliecs/occ/) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index faf1ff117..7ee80b72c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,7 +1,13 @@ site_name: aliecs nav: - - Reference: "reference.md" + - 'Handbook': + - Introduction: handbook/index.md + - Overview: handbook/overview.md + - Basic Concepts: handbook/concepts.md + - Configuration: + - Workflow Configuration: handbook/configuration.md + - Component Configuration: handbook/appconfiguration.md - 'Command Reference': - coconut: - Overview: './coconut/README.md' @@ -15,6 +21,7 @@ nav: - coconut task: './coconut/doc/coconut_task.md' - coconut template: './coconut/doc/coconut_template.md' - peanut: './occ/peanut/README.md' + - 'FAQ': faq.md - 'Developer Documentation': - 'Development Overview': 'development.md' - 'Building Instructions': 'building.md' From 79d12e8780ce1d5b165e3f9df1db6785530dfe6d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 1 Sep 2020 15:31:51 +0200 Subject: [PATCH 0375/2352] [misc] Point to ControlWorkflows readme in mkdocs.yml --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index 7ee80b72c..dcf5bb0cc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,6 +8,7 @@ nav: - Configuration: - Workflow Configuration: handbook/configuration.md - Component Configuration: handbook/appconfiguration.md + - Workflow Variables: '../controlworkflows/README.md' - 'Command Reference': - coconut: - Overview: './coconut/README.md' From 84c2289bed29fabbdc7a418c3cf259e6fe65f6f4 Mon Sep 17 00:00:00 2001 From: George Raduta Date: Tue, 1 Sep 2020 17:46:05 +0200 Subject: [PATCH 0376/2352] Bump Go and actions version --- .github/workflows/control.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 3201d08d4..663dfe15b 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,10 +13,10 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-18.04] - go: [ '1.13', '1.12' ] + go: [ '1.14', '1.15' ] steps: - - uses: actions/checkout@v1 - - uses: actions/setup-go@v1 + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 with: go-version: ${{matrix.go}} - run: (make vendor) From 3a8647fb0dd5a20220ab78bd032532d3c63973cd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Sep 2020 11:25:50 +0200 Subject: [PATCH 0377/2352] [coconut] Fix documentation string for coconut repo default-revision --- coconut/cmd/repo_default_revision.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index b08b7afb7..31e61c5a4 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -40,7 +40,7 @@ To set a per repository default revision, the default revision specified needs t Examples: * ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision * ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 -* ` + "`coconut repo default-revision 2 vs-sftb" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, +* ` + "`coconut repo default-revision 2 vs-sftb`" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, Run: control.WrapCall(control.SetDefaultRevision), } From 5cdb9db3de457b07122bd3ccb092f75d963c3fe5 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 20 May 2020 20:55:16 +0530 Subject: [PATCH 0378/2352] [walnut] init walnut --- walnut/README.md | 4 ++ walnut/app/constants.go | 31 +++++++++++++ walnut/cmd/check.go | 60 +++++++++++++++++++++++++ walnut/cmd/root.go | 99 +++++++++++++++++++++++++++++++++++++++++ walnut/main.go | 22 +++++++++ 5 files changed, 216 insertions(+) create mode 100644 walnut/README.md create mode 100644 walnut/app/constants.go create mode 100644 walnut/cmd/check.go create mode 100644 walnut/cmd/root.go create mode 100644 walnut/main.go diff --git a/walnut/README.md b/walnut/README.md new file mode 100644 index 000000000..e862f2577 --- /dev/null +++ b/walnut/README.md @@ -0,0 +1,4 @@ +# `walnut` - the O² workflow administration and linting utility + +The O² **w**orkflow **a**dministration and **l**i**n**ting **ut**ility is a command line program for workflow configuration +and import validation. \ No newline at end of file diff --git a/walnut/app/constants.go b/walnut/app/constants.go new file mode 100644 index 000000000..d0f0c89c6 --- /dev/null +++ b/walnut/app/constants.go @@ -0,0 +1,31 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package app + +const ( + NAME = "walnut" + PRETTY_SHORTNAME = "walnut" + PRETTY_FULLNAME = "O² Workflow Administation and Linting Utility" +) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go new file mode 100644 index 000000000..f4745c84c --- /dev/null +++ b/walnut/cmd/check.go @@ -0,0 +1,60 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + package cmd + +import ( + "fmt" + + "github.com/spf13/cobra" +) + +// checkCmd represents the check command +var checkCmd = &cobra.Command{ + Use: "check", + Short: "A brief description of your command", + Long: `A longer description that spans multiple lines and likely contains examples +and usage of using your command. For example: + +Cobra is a CLI library for Go that empowers applications. +This application is a tool to generate the needed files +to quickly create a Cobra application.`, + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("check called") + }, +} + +func init() { + rootCmd.AddCommand(checkCmd) + + // Here you will define your flags and configuration settings. + + // Cobra supports Persistent Flags which will work for this command + // and all subcommands, e.g.: + // checkCmd.PersistentFlags().String("foo", "", "A help for foo") + + // Cobra supports local flags which will only run when this command + // is called directly, e.g.: + // checkCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go new file mode 100644 index 000000000..2a8f1f371 --- /dev/null +++ b/walnut/cmd/root.go @@ -0,0 +1,99 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + "os" + + "github.com/AliceO2Group/Control/coconut/app" + "github.com/spf13/cobra" + + homedir "github.com/mitchellh/go-homedir" + "github.com/spf13/viper" +) + +var cfgFile string + +// rootCmd represents the base command when called without any subcommands +var rootCmd = &cobra.Command{ + Use: app.NAME, + Short: app.PRETTY_FULLNAME, + Long: fmt.Sprintf(`%s is a command line program for interacting with the %s. + +For more information on the available commands, see the individual documentation for each command.`, app.PRETTY_SHORTNAME, app.PRETTY_FULLNAME), + // Uncomment the following line if your bare application + // has an action associated with it: + // Run: func(cmd *cobra.Command, args []string) { }, +} + +// Execute adds all child commands to the root command and sets flags appropriately. +// This is called by main.main(). It only needs to happen once to the rootCmd. +func Execute() { + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} + +func init() { + cobra.OnInitialize(initConfig) + + // Here you will define your flags and configuration settings. + // Cobra supports persistent flags, which, if defined here, + // will be global for your application. + + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.walnut.yaml)") + + // Cobra also supports local flags, which will only run + // when this action is called directly. + rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") +} + +// initConfig reads in config file and ENV variables if set. +func initConfig() { + if cfgFile != "" { + // Use config file from the flag. + viper.SetConfigFile(cfgFile) + } else { + // Find home directory. + home, err := homedir.Dir() + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + // Search config in home directory with name ".walnut" (without extension). + viper.AddConfigPath(home) + viper.SetConfigName(".walnut") + } + + viper.AutomaticEnv() // read in environment variables that match + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + fmt.Println("Using config file:", viper.ConfigFileUsed()) + } +} diff --git a/walnut/main.go b/walnut/main.go new file mode 100644 index 000000000..84cfb374b --- /dev/null +++ b/walnut/main.go @@ -0,0 +1,22 @@ +/* +Copyright © 2020 NAME HERE + +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 main + +import "github.com/AliceO2Group/Control/walnut/cmd" + +func main() { + cmd.Execute() +} From 6d48405f61b30444090618fb8a04891e44c8a894 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 21 May 2020 20:41:34 +0530 Subject: [PATCH 0379/2352] [walnut] Added format flag to check.go --- walnut/cmd/check.go | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index f4745c84c..fd67151a4 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ - package cmd +package cmd import ( "fmt" @@ -33,13 +33,17 @@ import ( // checkCmd represents the check command var checkCmd = &cobra.Command{ Use: "check", - Short: "A brief description of your command", - Long: `A longer description that spans multiple lines and likely contains examples -and usage of using your command. For example: + Short: "check the file passed against a specified schema.", + Long: `The check command validates the given file against a specified schema. -Cobra is a CLI library for Go that empowers applications. -This application is a tool to generate the needed files -to quickly create a Cobra application.`, +Usage: + walnut check --format template file + +Example: + walnut check --format workflow_template readout-sftb.yaml + +Valid Schema formats: + workflow_template task_template dpl_dump`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("check called") }, @@ -48,13 +52,6 @@ to quickly create a Cobra application.`, func init() { rootCmd.AddCommand(checkCmd) - // Here you will define your flags and configuration settings. - - // Cobra supports Persistent Flags which will work for this command - // and all subcommands, e.g.: - // checkCmd.PersistentFlags().String("foo", "", "A help for foo") - - // Cobra supports local flags which will only run when this command - // is called directly, e.g.: - // checkCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") + checkCmd.Flags().StringP("format", "f", "", "format to validate against") + checkCmd.MarkFlagRequired("format") } From 49db20d0eee933e082dc186fb4cf26194672f0bb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 21 May 2020 20:44:52 +0530 Subject: [PATCH 0380/2352] [walnut] Added walnut references to Makefile --- Makefile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 7bccb7f0d..866a3e8bc 100644 --- a/Makefile +++ b/Makefile @@ -42,18 +42,19 @@ ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto VERBOSE_1 := -v VERBOSE_2 := -v -x -WHAT := o2control-core o2control-executor coconut peanut o2-aliecs-odc-shim +WHAT := o2control-core o2control-executor coconut peanut o2-aliecs-odc-shim walnut WHAT_o2control-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2control-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-aliecs-odc-shim_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim -SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim +GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim ./walnut/cmd +SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product From e31806f4ed05ce35dd05eeff1d31dd18fa010ac7 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 22 May 2020 03:36:42 +0530 Subject: [PATCH 0381/2352] [walnut] Added basic task workflow validation --- go.mod | 3 + go.sum | 8 +++ walnut/app/schemata.go | 114 ++++++++++++++++++++++++++++++++++++ walnut/cmd/check.go | 17 ++++-- walnut/main.go | 36 ++++++++---- walnut/validate/validate.go | 68 +++++++++++++++++++++ 6 files changed, 228 insertions(+), 18 deletions(-) create mode 100644 walnut/app/schemata.go create mode 100644 walnut/validate/validate.go diff --git a/go.mod b/go.mod index 4d545dea1..302f60d19 100644 --- a/go.mod +++ b/go.mod @@ -29,6 +29,7 @@ require ( github.com/gdamore/tcell v1.3.0 github.com/gliderlabs/ssh v0.3.0 // indirect github.com/go-git/go-git/v5 v5.1.0 + github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect @@ -90,6 +91,7 @@ require ( github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect github.com/valyala/fasttemplate v1.1.0 github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect + github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.0.0 go.etcd.io/bbolt v1.3.4 // indirect go.uber.org/zap v1.14.1 // indirect @@ -104,6 +106,7 @@ require ( google.golang.org/grpc v1.30.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect + gopkg.in/yaml.v2 v2.3.0 gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index 34e46aa01..e7a3c4b30 100644 --- a/go.sum +++ b/go.sum @@ -189,6 +189,8 @@ github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -618,6 +620,12 @@ github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJ github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= +github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= +github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= +github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs= diff --git a/walnut/app/schemata.go b/walnut/app/schemata.go new file mode 100644 index 000000000..6fd96027d --- /dev/null +++ b/walnut/app/schemata.go @@ -0,0 +1,114 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package app + +// TaskSchema struct holds unmarshaled YAML data of task templates +var TaskSchema string = ` + { + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "AliECS Task Descriptor", + "description": "Validate task descriptor files for AliECS", + "type": "object", + "properties": { + "name": { + "description": "The unique identifier for a task", + "type": "string" + }, + "control": { + "type": "object", + "title": "Type of control", + "properties": { + "mode": { + "type": "string", + "title": "Mode", + "enum": [ + "fairmq", + "basic", + "direct" + ] + } + } + }, + "wants": { + "description": "Amount of CPU and memory required for task", + "type": "object", + "properties": { + "cpu": { + "description": "Amount of CPU", + "type": "number" + }, + "memory": { + "description": "Amount of Memory", + "type": "number" + } + } + }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + } + } + } + }, + "command": { + "type": "object", + "title": "Commands for Task", + "properties": { + "shell": { + "type": "boolean" + }, + "value": { + "type": "string" + }, + "arguments": { + "type": "array", + "title": "Arguments", + "items": { + "type": "string" + } + } + } + } + } + } + ` diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index fd67151a4..c0e5f81f6 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -26,6 +26,9 @@ package cmd import ( "fmt" + "strings" + + "github.com/AliceO2Group/Control/walnut/validate" "github.com/spf13/cobra" ) @@ -37,16 +40,20 @@ var checkCmd = &cobra.Command{ Long: `The check command validates the given file against a specified schema. Usage: - walnut check --format template file + walnut check --format [template] [file] Example: - walnut check --format workflow_template readout-sftb.yaml + walnut check --format workflow_template readout-sftb.yaml -Valid Schema formats: - workflow_template task_template dpl_dump`, +Valid schemas: + workflow_template task_template dpl_dump`, Run: func(cmd *cobra.Command, args []string) { - fmt.Println("check called") + fmt.Println("check called with arg: " + strings.Join(args, " ")) + for _, filename := range args { + validate.Task(filename) + } }, + // Args: cobra.ExactArgs(1), } func init() { diff --git a/walnut/main.go b/walnut/main.go index 84cfb374b..5c41f873b 100644 --- a/walnut/main.go +++ b/walnut/main.go @@ -1,18 +1,28 @@ /* -Copyright © 2020 NAME HERE + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ -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 walnut implements the O² Workflow Administration and Linting Utility. package main import "github.com/AliceO2Group/Control/walnut/cmd" diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go new file mode 100644 index 000000000..88f6f57eb --- /dev/null +++ b/walnut/validate/validate.go @@ -0,0 +1,68 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package validate + +import ( + "fmt" + "io/ioutil" + "os" + + "github.com/AliceO2Group/Control/walnut/app" + + "github.com/xeipuuv/gojsonschema" + "gopkg.in/yaml.v2" +) + +type yamlData struct { + yamlData []yamlData `yaml:"entries"` +} + +// Task accepts a task filename and validate against the task schema +func Task(filename string) { + + rawYAML, err := ioutil.ReadFile(filename) // import YAML file + if err != nil { + fmt.Println("ReadFile failed.") + os.Exit(1) + } + dataFromYAML := yamlData{} // create empty struct of expected YAML file + err = yaml.Unmarshal([]byte(rawYAML), &dataFromYAML) // unmarshal YAML data into struct + + schemaLoader := gojsonschema.NewStringLoader(app.TaskSchema) // load schema + documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load Go struct + + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + if err != nil { + panic(err.Error()) + } + + if result.Valid() { + os.Exit(0) + } else { + err := "Schema validation failed." + fmt.Printf("ERROR: %v", err) + os.Exit(1) + } +} From 4fbd21e23fa634e3144d80fd5ffca17aa8389516 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 22 May 2020 05:40:37 +0530 Subject: [PATCH 0382/2352] [walnut] Added workflow template schema --- walnut/app/schemata.go | 291 +++++++++++++++++++++++++----------- walnut/cmd/check.go | 4 +- walnut/validate/validate.go | 45 +++++- 3 files changed, 247 insertions(+), 93 deletions(-) diff --git a/walnut/app/schemata.go b/walnut/app/schemata.go index 6fd96027d..9a7f49400 100644 --- a/walnut/app/schemata.go +++ b/walnut/app/schemata.go @@ -26,89 +26,212 @@ package app // TaskSchema struct holds unmarshaled YAML data of task templates var TaskSchema string = ` +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "AliECS Task Descriptor", + "description": "Validate task descriptor files for AliECS", + "type": "object", + "properties": { + "name": { + "description": "The unique identifier for a task", + "type": "string" + }, + "control": { + "type": "object", + "title": "Type of control", + "properties": { + "mode": { + "type": "string", + "title": "Mode", + "enum": [ + "fairmq", + "basic", + "direct" + ] + } + } + }, + "wants": { + "description": "Amount of CPU and memory required for task", + "type": "object", + "properties": { + "cpu": { + "description": "Amount of CPU", + "type": "number" + }, + "memory": { + "description": "Amount of Memory", + "type": "number" + } + } + }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + } + } + } + }, + "command": { + "type": "object", + "title": "Commands for Task", + "properties": { + "shell": { + "type": "boolean" + }, + "value": { + "type": "string" + }, + "arguments": { + "type": "array", + "title": "Arguments", + "items": { + "type": "string" + } + } + } + } + } +} + ` + +// WorkflowSchema struct holds unmarshaled YAML data of workflow templates +var WorkflowSchema string = ` { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://example.com/product.schema.json", - "title": "AliECS Task Descriptor", - "description": "Validate task descriptor files for AliECS", - "type": "object", - "properties": { - "name": { - "description": "The unique identifier for a task", - "type": "string" - }, - "control": { - "type": "object", - "title": "Type of control", - "properties": { - "mode": { - "type": "string", - "title": "Mode", - "enum": [ - "fairmq", - "basic", - "direct" - ] - } - } - }, - "wants": { - "description": "Amount of CPU and memory required for task", - "type": "object", - "properties": { - "cpu": { - "description": "Amount of CPU", - "type": "number" - }, - "memory": { - "description": "Amount of Memory", - "type": "number" - } - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "required": [ - "type" - ], - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - } - } - } - }, - "command": { - "type": "object", - "title": "Commands for Task", - "properties": { - "shell": { - "type": "boolean" - }, - "value": { - "type": "string" - }, - "arguments": { - "type": "array", - "title": "Arguments", - "items": { - "type": "string" - } - } - } - } - } - } + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "AliECS Workflow Template", + "description": "Workflow template schema for AliECS", + "type": "object", + "properties": { + "name": { + "description": "The name of the root role, which happens to be an aggregator role.", + "type": "string" + }, + "defaults": { + "type": "object", + "title": "Variable definitions", + "description": "Variable definitions: defaults, overridden by anything", + "properties": { + "nProcessors": { + "type": "number", + "title": "Number of processors" + }, + "nSinks": { + "type": "number", + "title": "Number of sinks" + }, + "monitoring_qc_url": { + "type": "string" + }, + "monitoring_dd_url": { + "type": "string" + }, + "monitoring_readout_url": { + "type": "string" + } + } + }, + "vars": { + "type": "object", + "title": "User variable definitions", + "description": "Variable definitions: vars, override defaults, overridden by user vars." + }, + "roles": { + "title": "Roles", + "description": "A list of child roles.", + "type": "array", + "properties": { + "name": { + "description": "Parametrized name of an iterator role", + "type": "string" + }, + "for": { + "description": "Amount of Memory", + "type": "object", + "properties": { + "begin": { + "title": "Begin", + "type": "number" + }, + "end": { + "title": "End", + "type": "number" + }, + "var": { + "title": "variable", + "type": "string", + "enum": [ + "it" + ] + } + } + }, + "connect": { + "title": "Connect", + "type": "object", + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + } + } + }, + "task": { + "title": "Task entry", + "type": "object", + "properties": { + "load": { + "title": "Task template to load", + "type": "string" + } + } + } + } + } + } +} ` diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index c0e5f81f6..6721458ec 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -49,9 +49,7 @@ Valid schemas: workflow_template task_template dpl_dump`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("check called with arg: " + strings.Join(args, " ")) - for _, filename := range args { - validate.Task(filename) - } + validate.Template(args[0], args[1]) //TODO: Handle two arguments in cobra }, // Args: cobra.ExactArgs(1), } diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index 88f6f57eb..d4bd0a3f9 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -39,19 +39,36 @@ type yamlData struct { yamlData []yamlData `yaml:"entries"` } -// Task accepts a task filename and validate against the task schema -func Task(filename string) { +// Template accepts a filename and format then validate against the schema specified (either workflow or task) +func Template(filename string, format string) { rawYAML, err := ioutil.ReadFile(filename) // import YAML file if err != nil { fmt.Println("ReadFile failed.") os.Exit(1) } - dataFromYAML := yamlData{} // create empty struct of expected YAML file - err = yaml.Unmarshal([]byte(rawYAML), &dataFromYAML) // unmarshal YAML data into struct - schemaLoader := gojsonschema.NewStringLoader(app.TaskSchema) // load schema - documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load Go struct + var dataFromYAML interface{} // create empty struct of expected YAML file + if err := yaml.Unmarshal([]byte(rawYAML), &dataFromYAML); err != nil { // unmarshal YAML data into struct + fmt.Println("Unmarshaling YAML failed.") + os.Exit(1) + } + + dataFromYAML = convert(dataFromYAML) + + var schema string + switch format { + case "task": + schema = app.TaskSchema + case "workflow": + schema = app.WorkflowSchema + default: + fmt.Print("ERROR: Invalid format.") + os.Exit(1) + } + + schemaLoader := gojsonschema.NewStringLoader(schema) // load schema + documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load Go struct result, err := gojsonschema.Validate(schemaLoader, documentLoader) if err != nil { @@ -66,3 +83,19 @@ func Task(filename string) { os.Exit(1) } } + +func convert(i interface{}) interface{} { + switch x := i.(type) { + case map[interface{}]interface{}: + m2 := map[string]interface{}{} + for k, v := range x { + m2[k.(string)] = convert(v) + } + return m2 + case []interface{}: + for i, v := range x { + x[i] = convert(v) + } + } + return i +} From a3c7e415a7d1f7fb2b4b0b04815f86cc6546d016 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 22 May 2020 06:00:31 +0530 Subject: [PATCH 0383/2352] [walnut] Added cobra flag for specifying format --- walnut/cmd/check.go | 6 +++++- walnut/cmd/root.go | 2 +- walnut/validate/validate.go | 1 + 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 6721458ec..36463b589 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -49,7 +49,11 @@ Valid schemas: workflow_template task_template dpl_dump`, Run: func(cmd *cobra.Command, args []string) { fmt.Println("check called with arg: " + strings.Join(args, " ")) - validate.Template(args[0], args[1]) //TODO: Handle two arguments in cobra + + format, _ := cmd.Flags().GetString("format") + for _, filename := range args { + validate.Template(filename, format) + } }, // Args: cobra.ExactArgs(1), } diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index 2a8f1f371..123029178 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -28,7 +28,7 @@ import ( "fmt" "os" - "github.com/AliceO2Group/Control/coconut/app" + "github.com/AliceO2Group/Control/walnut/app" "github.com/spf13/cobra" homedir "github.com/mitchellh/go-homedir" diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index d4bd0a3f9..1ca8e3499 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -76,6 +76,7 @@ func Template(filename string, format string) { } if result.Valid() { + fmt.Printf("\nSUCCESS! File: %s is valid against %s schema.", filename, format) os.Exit(0) } else { err := "Schema validation failed." From 7ef5fccaeed5a3b0bafd0e9483a7a68ce05d4d63 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 22 May 2020 06:18:00 +0530 Subject: [PATCH 0384/2352] [walnut] Added walnut main.go to cmd --- {walnut => cmd/walnut}/main.go | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {walnut => cmd/walnut}/main.go (100%) diff --git a/walnut/main.go b/cmd/walnut/main.go similarity index 100% rename from walnut/main.go rename to cmd/walnut/main.go From 034651a7506a5cd5eb6fe4d6d5a01ccc47157d92 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 25 May 2020 08:25:04 +0530 Subject: [PATCH 0385/2352] [walnut] Better comments and error handling --- walnut/app/schemata.go | 12 ++++++++++-- walnut/cmd/check.go | 7 +++++-- walnut/validate/validate.go | 18 ++++++++---------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/walnut/app/schemata.go b/walnut/app/schemata.go index 9a7f49400..b551b3497 100644 --- a/walnut/app/schemata.go +++ b/walnut/app/schemata.go @@ -24,7 +24,8 @@ package app -// TaskSchema struct holds unmarshaled YAML data of task templates +// TaskSchema is the task template schema, i.e. the expected format of +// the task templates necessary for AliECS. var TaskSchema string = ` { "$schema": "http://json-schema.org/draft-07/schema#", @@ -113,7 +114,8 @@ var TaskSchema string = ` } ` -// WorkflowSchema struct holds unmarshaled YAML data of workflow templates +// WorkflowSchema is the workflow template schema, i.e. the expected format of +// the workflow templates necessary for AliECS. var WorkflowSchema string = ` { "$schema": "http://json-schema.org/draft-07/schema#", @@ -235,3 +237,9 @@ var WorkflowSchema string = ` } } ` + +// DPLSchema is the DPL Dump schema, the format that DPL dumps +// generated by O2 adhere to. +var DPLSchema string = ` + // TODO: Formulate DPL Schema + ` diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 36463b589..cdb7a10a4 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -37,7 +37,9 @@ import ( var checkCmd = &cobra.Command{ Use: "check", Short: "check the file passed against a specified schema.", - Long: `The check command validates the given file against a specified schema. + Long: `The check command validates the given file against a specified +schema. This file can be a task template, a workflow template or an O2 +DPL Dump. Each of those have a schema provided to validate against. Usage: walnut check --format [template] [file] @@ -46,7 +48,8 @@ Example: walnut check --format workflow_template readout-sftb.yaml Valid schemas: - workflow_template task_template dpl_dump`, + workflow task dpl_dump`, + Run: func(cmd *cobra.Command, args []string) { fmt.Println("check called with arg: " + strings.Join(args, " ")) diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index 1ca8e3499..913aaba88 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -35,22 +35,18 @@ import ( "gopkg.in/yaml.v2" ) -type yamlData struct { - yamlData []yamlData `yaml:"entries"` -} - // Template accepts a filename and format then validate against the schema specified (either workflow or task) func Template(filename string, format string) { rawYAML, err := ioutil.ReadFile(filename) // import YAML file if err != nil { - fmt.Println("ReadFile failed.") + fmt.Printf("ReadFile failed: %v", err) os.Exit(1) } - var dataFromYAML interface{} // create empty struct of expected YAML file - if err := yaml.Unmarshal([]byte(rawYAML), &dataFromYAML); err != nil { // unmarshal YAML data into struct - fmt.Println("Unmarshaling YAML failed.") + var dataFromYAML interface{} + if err := yaml.Unmarshal([]byte(rawYAML), &dataFromYAML); err != nil { + fmt.Printf("Unmarshaling YAML failed: %v", err) os.Exit(1) } @@ -63,12 +59,12 @@ func Template(filename string, format string) { case "workflow": schema = app.WorkflowSchema default: - fmt.Print("ERROR: Invalid format.") + fmt.Print("ERROR: Invalid format specified.") os.Exit(1) } schemaLoader := gojsonschema.NewStringLoader(schema) // load schema - documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load Go struct + documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load empty interface result, err := gojsonschema.Validate(schemaLoader, documentLoader) if err != nil { @@ -85,6 +81,8 @@ func Template(filename string, format string) { } } +// convert takes a interface{} as input and recursively converts all child +// map[interface{}]interface{} to map[string]interface{} func convert(i interface{}) interface{} { switch x := i.(type) { case map[interface{}]interface{}: From 499a5e74df4fa4fe51bbb599da92fea746e99435 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 25 May 2020 22:53:27 +0530 Subject: [PATCH 0386/2352] [walnut] generate schema at build --- walnut/schemata/Task.json | 85 ++++++++++++ .../schemata.go => schemata/Workflow.json} | 128 +----------------- walnut/schemata/includeSchemata.go | 63 +++++++++ walnut/schemata/includeSchemata_test.go | 33 +++++ walnut/validate/validate.go | 8 +- 5 files changed, 187 insertions(+), 130 deletions(-) create mode 100644 walnut/schemata/Task.json rename walnut/{app/schemata.go => schemata/Workflow.json} (52%) create mode 100644 walnut/schemata/includeSchemata.go create mode 100644 walnut/schemata/includeSchemata_test.go diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json new file mode 100644 index 000000000..6752db5a1 --- /dev/null +++ b/walnut/schemata/Task.json @@ -0,0 +1,85 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "http://example.com/product.schema.json", + "title": "AliECS Task Descriptor", + "description": "Validate task descriptor files for AliECS", + "type": "object", + "properties": { + "name": { + "description": "The unique identifier for a task", + "type": "string" + }, + "control": { + "type": "object", + "title": "Type of control", + "properties": { + "mode": { + "type": "string", + "title": "Mode", + "enum": [ + "fairmq", + "basic", + "direct" + ] + } + } + }, + "wants": { + "description": "Amount of CPU and memory required for task", + "type": "object", + "properties": { + "cpu": { + "description": "Amount of CPU", + "type": "number" + }, + "memory": { + "description": "Amount of Memory", + "type": "number" + } + } + }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + } + } + } + }, + "command": { + "type": "object", + "title": "Commands for Task", + "properties": { + "shell": { + "type": "boolean" + }, + "value": { + "type": "string" + }, + "arguments": { + "type": "array", + "title": "Arguments", + "items": { + "type": "string" + } + } + } + } + } +} \ No newline at end of file diff --git a/walnut/app/schemata.go b/walnut/schemata/Workflow.json similarity index 52% rename from walnut/app/schemata.go rename to walnut/schemata/Workflow.json index b551b3497..58e542f1c 100644 --- a/walnut/app/schemata.go +++ b/walnut/schemata/Workflow.json @@ -1,123 +1,4 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package app - -// TaskSchema is the task template schema, i.e. the expected format of -// the task templates necessary for AliECS. -var TaskSchema string = ` { - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://example.com/product.schema.json", - "title": "AliECS Task Descriptor", - "description": "Validate task descriptor files for AliECS", - "type": "object", - "properties": { - "name": { - "description": "The unique identifier for a task", - "type": "string" - }, - "control": { - "type": "object", - "title": "Type of control", - "properties": { - "mode": { - "type": "string", - "title": "Mode", - "enum": [ - "fairmq", - "basic", - "direct" - ] - } - } - }, - "wants": { - "description": "Amount of CPU and memory required for task", - "type": "object", - "properties": { - "cpu": { - "description": "Amount of CPU", - "type": "number" - }, - "memory": { - "description": "Amount of Memory", - "type": "number" - } - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "required": [ - "type" - ], - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - } - } - } - }, - "command": { - "type": "object", - "title": "Commands for Task", - "properties": { - "shell": { - "type": "boolean" - }, - "value": { - "type": "string" - }, - "arguments": { - "type": "array", - "title": "Arguments", - "items": { - "type": "string" - } - } - } - } - } -} - ` - -// WorkflowSchema is the workflow template schema, i.e. the expected format of -// the workflow templates necessary for AliECS. -var WorkflowSchema string = ` - { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "http://example.com/product.schema.json", "title": "AliECS Workflow Template", @@ -235,11 +116,4 @@ var WorkflowSchema string = ` } } } -} - ` - -// DPLSchema is the DPL Dump schema, the format that DPL dumps -// generated by O2 adhere to. -var DPLSchema string = ` - // TODO: Formulate DPL Schema - ` +} \ No newline at end of file diff --git a/walnut/schemata/includeSchemata.go b/walnut/schemata/includeSchemata.go new file mode 100644 index 000000000..b8569e0ff --- /dev/null +++ b/walnut/schemata/includeSchemata.go @@ -0,0 +1,63 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package schemata + +import ( + "fmt" + "io" + "io/ioutil" + "os" + "strings" +) + +// Reads all .json files in the current folder +// and encodes them as strings literals in schemata.go +func generateSchema() { + + var err error + + fs, err := ioutil.ReadDir(".") + if err != nil { + fmt.Printf("Error opening Schema: %s", err) + os.Exit(1) + } + + out, err := os.Create("schemata.go") + if err != nil { + fmt.Printf("Error creating schemata.go: %s", err) + os.Exit(1) + } + + out.Write([]byte("package schemata \n\nconst (\n")) + for _, f := range fs { + if strings.HasSuffix(f.Name(), ".json") { + out.Write([]byte(strings.TrimSuffix(f.Name(), ".json") + " = `\n")) + f, _ := os.Open(f.Name()) + io.Copy(out, f) + out.Write([]byte("`\n")) + } + } + out.Write([]byte(")\n")) +} diff --git a/walnut/schemata/includeSchemata_test.go b/walnut/schemata/includeSchemata_test.go new file mode 100644 index 000000000..9574388d2 --- /dev/null +++ b/walnut/schemata/includeSchemata_test.go @@ -0,0 +1,33 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package schemata + +import "testing" + +func TestSchemaGeneration(t *testing.T) { + t.Run("Testing Schema Generation", func(t *testing.T) { + generateSchema() + }) +} diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index 913aaba88..8bd4c4beb 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -24,12 +24,14 @@ package validate +//go:generate go run ../schemata/includeSchemata.go + import ( "fmt" "io/ioutil" "os" - "github.com/AliceO2Group/Control/walnut/app" + "github.com/AliceO2Group/Control/walnut/schemata" "github.com/xeipuuv/gojsonschema" "gopkg.in/yaml.v2" @@ -55,9 +57,9 @@ func Template(filename string, format string) { var schema string switch format { case "task": - schema = app.TaskSchema + schema = schemata.Task case "workflow": - schema = app.WorkflowSchema + schema = schemata.Workflow default: fmt.Print("ERROR: Invalid format specified.") os.Exit(1) From 5f7ee0578a8ca29e583524d63e8f599ac50adc94 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 26 May 2020 01:34:42 +0530 Subject: [PATCH 0387/2352] [walnut] corrections to Task.json --- walnut/schemata/Task.json | 89 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 84 insertions(+), 5 deletions(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index 6752db5a1..381299b64 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -1,8 +1,8 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://example.com/product.schema.json", - "title": "AliECS Task Descriptor", - "description": "Validate task descriptor files for AliECS", + "$id": "https://github.com/obviyus/Controlss/walnut/schemata/Task.json", + "title": "AliECS Task Template", + "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", "type": "object", "properties": { "name": { @@ -25,7 +25,7 @@ } }, "wants": { - "description": "Amount of CPU and memory required for task", + "description": "CPU, memory and ports required for task execution", "type": "object", "properties": { "cpu": { @@ -35,6 +35,10 @@ "memory": { "description": "Amount of Memory", "type": "number" + }, + "ports": { + "description": "Range of ports to use", + "type": "string" } } }, @@ -44,6 +48,7 @@ "items": { "type": "object", "required": [ + "name", "type" ], "properties": { @@ -58,14 +63,85 @@ "push", "pull" ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + }, + "transport": { + "type": "string", + "enum": [ + "default", + "zeromq", + "nanomsg", + "shmem" + ] } } } }, + "connect": { + "title": "Connect", + "type": "object", + "required": [ + "name", + "type", + "target" + ], + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + } + } + }, "command": { "type": "object", - "title": "Commands for Task", + "title": "Command for Task execution", + "required": [ + "name" + ], "properties": { + "env": { + "type": "array", + "title": "Environment", + "items": { + "type": "string" + } + }, "shell": { "type": "boolean" }, @@ -78,6 +154,9 @@ "items": { "type": "string" } + }, + "user": { + "type": "string" } } } From aeeec1ead7e814181593d3dfd66327720e82ea84 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 26 May 2020 01:46:50 +0530 Subject: [PATCH 0388/2352] [walnut] corrections to Workflow.json --- walnut/schemata/Workflow.json | 189 ++++++++++++++++++++++++---------- 1 file changed, 137 insertions(+), 52 deletions(-) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 58e542f1c..4c406ddf8 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -1,47 +1,12 @@ { "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "http://example.com/product.schema.json", + "$id": "https://github.com/obviyus/Control/walnut/schemata/Workflow.json", "title": "AliECS Workflow Template", "description": "Workflow template schema for AliECS", - "type": "object", - "properties": { - "name": { - "description": "The name of the root role, which happens to be an aggregator role.", - "type": "string" - }, - "defaults": { - "type": "object", - "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything", - "properties": { - "nProcessors": { - "type": "number", - "title": "Number of processors" - }, - "nSinks": { - "type": "number", - "title": "Number of sinks" - }, - "monitoring_qc_url": { - "type": "string" - }, - "monitoring_dd_url": { - "type": "string" - }, - "monitoring_readout_url": { - "type": "string" - } - } - }, - "vars": { - "type": "object", - "title": "User variable definitions", - "description": "Variable definitions: vars, override defaults, overridden by user vars." - }, + "definitions": { "roles": { "title": "Roles", - "description": "A list of child roles.", - "type": "array", + "type": "object", "properties": { "name": { "description": "Parametrized name of an iterator role", @@ -50,27 +15,66 @@ "for": { "description": "Amount of Memory", "type": "object", - "properties": { - "begin": { - "title": "Begin", - "type": "number" + "oneOf": [ + { + "properties": { + "begin": { + "title": "Begin port", + "type": "number" + }, + "end": { + "title": "End port", + "type": "number" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + } + } }, - "end": { - "title": "End", - "type": "number" + { + "properties": { + "range": { + "title": "Port ranges", + "type": "string" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + } + } + } + ] + }, + "constraints": { + "type": "array", + "properties": { + "attribute": { + "type": "string" }, - "var": { - "title": "variable", - "type": "string", - "enum": [ - "it" - ] + "value": { + "type": "string" } } }, + "vars": { + "type": "object", + "description": "User defined variables" + }, "connect": { "title": "Connect", - "type": "object", + "type": "array", + "required": [ + "name", + "type", + "target" + ], "properties": { "name": { "description": "Name of the inbound channel", @@ -103,17 +107,98 @@ } } }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + }, + "transport": { + "type": "string", + "enum": [ + "default", + "zeromq", + "nanomsg", + "shmem" + ] + } + } + } + }, "task": { "title": "Task entry", "type": "object", + "required": [ + "load" + ], "properties": { "load": { "title": "Task template to load", "type": "string" } } + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/definitions/roles" + } } } } + }, + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "The name of the root role, which happens to be an aggregator role.", + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/definitions/roles" + }, + "defaults": { + "type": "object", + "title": "Variable definitions", + "description": "Variable definitions: defaults, overridden by anything", + }, + "vars": { + "type": "string", + "title": "User variable definitions", + "description": "Variable definitions: vars, override defaults, overridden by user vars." + } + } } } \ No newline at end of file From 6ab47e87795e6ccb7c5b97828478e0329c5b5f1f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 26 May 2020 02:03:32 +0530 Subject: [PATCH 0389/2352] [walnut] minor review corrections --- walnut/cmd/check.go | 4 ++-- walnut/cmd/root.go | 2 +- walnut/validate/validate.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index cdb7a10a4..3134afce6 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -42,12 +42,12 @@ schema. This file can be a task template, a workflow template or an O2 DPL Dump. Each of those have a schema provided to validate against. Usage: - walnut check --format [template] [file] + walnut check --format [format] [file] Example: walnut check --format workflow_template readout-sftb.yaml -Valid schemas: +Valid schemata: workflow task dpl_dump`, Run: func(cmd *cobra.Command, args []string) { diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index 123029178..200c3cf69 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -65,7 +65,7 @@ func init() { // Cobra supports persistent flags, which, if defined here, // will be global for your application. - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.walnut.yaml)") + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) // Cobra also supports local flags, which will only run // when this action is called directly. diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index 8bd4c4beb..68bab0b5a 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -37,8 +37,8 @@ import ( "gopkg.in/yaml.v2" ) -// Template accepts a filename and format then validate against the schema specified (either workflow or task) -func Template(filename string, format string) { +// CheckSchema accepts a filename and format then validate against the schema specified (either workflow or task) +func CheckSchema(filename string, format string) { rawYAML, err := ioutil.ReadFile(filename) // import YAML file if err != nil { From a2e93838a5082f3bab54dac726ffa496183f3452 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 26 May 2020 02:56:14 +0530 Subject: [PATCH 0390/2352] [walnut] created empty schemata.go to pass build --- walnut/cmd/check.go | 4 +++- walnut/schemata/schemata.go | 6 ++++++ walnut/validate/validate.go | 2 -- 3 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 walnut/schemata/schemata.go diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 3134afce6..59cd68160 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +//go:generate go run ../schemata/includeSchemata.go + package cmd import ( @@ -55,7 +57,7 @@ Valid schemata: format, _ := cmd.Flags().GetString("format") for _, filename := range args { - validate.Template(filename, format) + validate.CheckSchema(filename, format) } }, // Args: cobra.ExactArgs(1), diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go new file mode 100644 index 000000000..8ad5ba7f0 --- /dev/null +++ b/walnut/schemata/schemata.go @@ -0,0 +1,6 @@ +package schemata + +const ( + Task = `` + Workflow = `` +) diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index 68bab0b5a..fc2e9d044 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -24,8 +24,6 @@ package validate -//go:generate go run ../schemata/includeSchemata.go - import ( "fmt" "io/ioutil" From 6bb159b134b6552aebf28f634ff4755e2e8a2906 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 26 May 2020 03:13:25 +0530 Subject: [PATCH 0391/2352] [walnut] schema corrections --- walnut/schemata/Task.json | 3 ++- walnut/schemata/Workflow.json | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index 381299b64..436314897 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -132,7 +132,8 @@ "type": "object", "title": "Command for Task execution", "required": [ - "name" + "name", + "value" ], "properties": { "env": { diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 4c406ddf8..8b2ee407c 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -7,6 +7,9 @@ "roles": { "title": "Roles", "type": "object", + "required": [ + "name" + ], "properties": { "name": { "description": "Parametrized name of an iterator role", From 94e89853eec1bc095ab2212919ab4abde3c3ce00 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 27 May 2020 06:28:48 +0530 Subject: [PATCH 0392/2352] [walnut] review corrections --- walnut/cmd/check.go | 18 +- walnut/schemata/Task.json | 5 +- walnut/schemata/Workflow.json | 4 +- walnut/schemata/includeSchemata.go | 12 +- walnut/schemata/schemata.go | 377 ++++++++++++++++++++++++++++- walnut/validate/task_test.yaml | 24 ++ walnut/validate/validate.go | 43 ++-- walnut/validate/validate_test.go | 50 ++++ walnut/validate/workflow_test.yaml | 23 ++ 9 files changed, 520 insertions(+), 36 deletions(-) create mode 100644 walnut/validate/task_test.yaml create mode 100644 walnut/validate/validate_test.go create mode 100644 walnut/validate/workflow_test.yaml diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 59cd68160..08cfa2158 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -28,10 +28,11 @@ package cmd import ( "fmt" + "io/ioutil" + "os" "strings" "github.com/AliceO2Group/Control/walnut/validate" - "github.com/spf13/cobra" ) @@ -40,7 +41,7 @@ var checkCmd = &cobra.Command{ Use: "check", Short: "check the file passed against a specified schema.", Long: `The check command validates the given file against a specified -schema. This file can be a task template, a workflow template or an O2 +schema. This file can be a task template, a workflow template or an O² DPL Dump. Each of those have a schema provided to validate against. Usage: @@ -57,10 +58,19 @@ Valid schemata: format, _ := cmd.Flags().GetString("format") for _, filename := range args { - validate.CheckSchema(filename, format) + rawYAML, err := ioutil.ReadFile(filename) + if err != nil { + fmt.Printf("failed to open file %s: %v", filename, err) + os.Exit(1) + } + err = validate.CheckSchema(rawYAML, format) + if err != nil { + fmt.Printf("validation failed: %v", err) + os.Exit(1) + } } }, - // Args: cobra.ExactArgs(1), + Args: cobra.ExactArgs(1), } func init() { diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index 436314897..d5ec2436d 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -74,7 +74,7 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "number" + "type": "string" }, "transport": { "type": "string", @@ -124,7 +124,7 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "number" + "type": "string" } } }, @@ -132,7 +132,6 @@ "type": "object", "title": "Command for Task execution", "required": [ - "name", "value" ], "properties": { diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 8b2ee407c..16cc179d7 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -18,7 +18,7 @@ "for": { "description": "Amount of Memory", "type": "object", - "oneOf": [ + "anyOf": [ { "properties": { "begin": { @@ -195,7 +195,7 @@ "defaults": { "type": "object", "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything", + "description": "Variable definitions: defaults, overridden by anything" }, "vars": { "type": "string", diff --git a/walnut/schemata/includeSchemata.go b/walnut/schemata/includeSchemata.go index b8569e0ff..a5098b0f4 100644 --- a/walnut/schemata/includeSchemata.go +++ b/walnut/schemata/includeSchemata.go @@ -34,20 +34,16 @@ import ( // Reads all .json files in the current folder // and encodes them as strings literals in schemata.go -func generateSchema() { - - var err error +func generateSchema() (err error) { fs, err := ioutil.ReadDir(".") if err != nil { - fmt.Printf("Error opening Schema: %s", err) - os.Exit(1) + return fmt.Errorf("error opening Schema: %w", err) } out, err := os.Create("schemata.go") if err != nil { - fmt.Printf("Error creating schemata.go: %s", err) - os.Exit(1) + return fmt.Errorf("error creating schemata.go: %w", err) } out.Write([]byte("package schemata \n\nconst (\n")) @@ -60,4 +56,6 @@ func generateSchema() { } } out.Write([]byte(")\n")) + + return nil } diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index 8ad5ba7f0..fc1351a90 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -1,6 +1,377 @@ -package schemata +package schemata const ( - Task = `` - Workflow = `` +Task = ` +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/obviyus/Controlss/walnut/schemata/Task.json", + "title": "AliECS Task Template", + "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", + "type": "object", + "properties": { + "name": { + "description": "The unique identifier for a task", + "type": "string" + }, + "control": { + "type": "object", + "title": "Type of control", + "properties": { + "mode": { + "type": "string", + "title": "Mode", + "enum": [ + "fairmq", + "basic", + "direct" + ] + } + } + }, + "wants": { + "description": "CPU, memory and ports required for task execution", + "type": "object", + "properties": { + "cpu": { + "description": "Amount of CPU", + "type": "number" + }, + "memory": { + "description": "Amount of Memory", + "type": "number" + }, + "ports": { + "description": "Range of ports to use", + "type": "string" + } + } + }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + }, + "transport": { + "type": "string", + "enum": [ + "default", + "zeromq", + "nanomsg", + "shmem" + ] + } + } + } + }, + "connect": { + "title": "Connect", + "type": "object", + "required": [ + "name", + "type", + "target" + ], + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + } + } + }, + "command": { + "type": "object", + "title": "Command for Task execution", + "required": [ + "value" + ], + "properties": { + "env": { + "type": "array", + "title": "Environment", + "items": { + "type": "string" + } + }, + "shell": { + "type": "boolean" + }, + "value": { + "type": "string" + }, + "arguments": { + "type": "array", + "title": "Arguments", + "items": { + "type": "string" + } + }, + "user": { + "type": "string" + } + } + } + } +}` +Workflow = ` +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "$id": "https://github.com/obviyus/Control/walnut/schemata/Workflow.json", + "title": "AliECS Workflow Template", + "description": "Workflow template schema for AliECS", + "definitions": { + "roles": { + "title": "Roles", + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "Parametrized name of an iterator role", + "type": "string" + }, + "for": { + "description": "Amount of Memory", + "type": "object", + "anyOf": [ + { + "properties": { + "begin": { + "title": "Begin port", + "type": "number" + }, + "end": { + "title": "End port", + "type": "number" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + } + } + }, + { + "properties": { + "range": { + "title": "Port ranges", + "type": "string" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + } + } + } + ] + }, + "constraints": { + "type": "array", + "properties": { + "attribute": { + "type": "string" + }, + "value": { + "type": "string" + } + } + }, + "vars": { + "type": "object", + "description": "User defined variables" + }, + "connect": { + "title": "Connect", + "type": "array", + "required": [ + "name", + "type", + "target" + ], + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + } + } + }, + "bind": { + "type": "array", + "title": "Bind array schema", + "items": { + "type": "object", + "required": [ + "name", + "type" + ], + "properties": { + "name": { + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "number" + }, + "transport": { + "type": "string", + "enum": [ + "default", + "zeromq", + "nanomsg", + "shmem" + ] + } + } + } + }, + "task": { + "title": "Task entry", + "type": "object", + "required": [ + "load" + ], + "properties": { + "load": { + "title": "Task template to load", + "type": "string" + } + } + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/definitions/roles" + } + } + } + } + }, + "type": "object", + "required": [ + "name" + ], + "properties": { + "name": { + "description": "The name of the root role, which happens to be an aggregator role.", + "type": "string" + }, + "roles": { + "type": "array", + "items": { + "$ref": "#/definitions/roles" + }, + "defaults": { + "type": "object", + "title": "Variable definitions", + "description": "Variable definitions: defaults, overridden by anything" + }, + "vars": { + "type": "string", + "title": "User variable definitions", + "description": "Variable definitions: vars, override defaults, overridden by user vars." + } + } + } +}` ) diff --git a/walnut/validate/task_test.yaml b/walnut/validate/task_test.yaml new file mode 100644 index 000000000..219989675 --- /dev/null +++ b/walnut/validate/task_test.yaml @@ -0,0 +1,24 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "file:/home/flp/readout.cfg" +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "1" + addressing: ipc + transport: shmem +properties: {} +command: + env: [] + shell: true + arguments: + - "{{ readout_cfg_uri }}" + value: >- + eval `aliswmod load Readout Control-OCCPlugin` && + readout.exe + \ No newline at end of file diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index fc2e9d044..fdeb24b6a 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -25,29 +25,36 @@ package validate import ( + "errors" "fmt" - "io/ioutil" "os" "github.com/AliceO2Group/Control/walnut/schemata" + "gopkg.in/yaml.v2" "github.com/xeipuuv/gojsonschema" - "gopkg.in/yaml.v2" ) -// CheckSchema accepts a filename and format then validate against the schema specified (either workflow or task) -func CheckSchema(filename string, format string) { +type inputYAML map[string]interface{} - rawYAML, err := ioutil.ReadFile(filename) // import YAML file +func (m *inputYAML) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _inputYAML map[string]interface{} + + data := _inputYAML{} + err = unmarshal(&data) if err != nil { - fmt.Printf("ReadFile failed: %v", err) - os.Exit(1) + return } + return +} + +// CheckSchema accepts YAML file and format then validate against the schema specified (either workflow or task) +func CheckSchema(rawYAML []byte, format string) (err error) { + var dataFromYAML interface{} - if err := yaml.Unmarshal([]byte(rawYAML), &dataFromYAML); err != nil { - fmt.Printf("Unmarshaling YAML failed: %v", err) - os.Exit(1) + if err := yaml.Unmarshal(rawYAML, &dataFromYAML); err != nil { + return fmt.Errorf("Unmarshaling YAML failed: %w", err) } dataFromYAML = convert(dataFromYAML) @@ -59,26 +66,28 @@ func CheckSchema(filename string, format string) { case "workflow": schema = schemata.Workflow default: - fmt.Print("ERROR: Invalid format specified.") - os.Exit(1) + err = errors.New("format not task or workflow") + return fmt.Errorf("Failed to obtain schema: %w", err) } schemaLoader := gojsonschema.NewStringLoader(schema) // load schema documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load empty interface + // fmt.Printf("RAWYAML: %v\n", dataFromYAML.value) + result, err := gojsonschema.Validate(schemaLoader, documentLoader) if err != nil { - panic(err.Error()) + return fmt.Errorf("Error loading data: %w", err) } if result.Valid() { - fmt.Printf("\nSUCCESS! File: %s is valid against %s schema.", filename, format) + fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) os.Exit(0) } else { - err := "Schema validation failed." - fmt.Printf("ERROR: %v", err) - os.Exit(1) + err = errors.New("file is not valid against schema\n") + return fmt.Errorf("schema validation: %w", err) } + return nil } // convert takes a interface{} as input and recursively converts all child diff --git a/walnut/validate/validate_test.go b/walnut/validate/validate_test.go new file mode 100644 index 000000000..c48f30d29 --- /dev/null +++ b/walnut/validate/validate_test.go @@ -0,0 +1,50 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package validate + +import ( + "io/ioutil" + "testing" +) + +func TestTaskSchemaValidation(t *testing.T) { + t.Run("Testing Validation with Task", func(t *testing.T) { + testfile, _ := ioutil.ReadFile("task_test.yaml") + err := CheckSchema(testfile, "task") + if err != nil { + t.Errorf("task validation failed: %v", err) + } + }) +} + +func TestWorkflowSchemaValidation(t *testing.T) { + t.Run("Testing Validation with Workflow", func(t *testing.T) { + testfile, _ := ioutil.ReadFile("workflow_test.yaml") + err := CheckSchema(testfile, "workflow") + if err != nil { + t.Errorf("workflow validation failed: %v", err) + } + }) +} diff --git a/walnut/validate/workflow_test.yaml b/walnut/validate/workflow_test.yaml new file mode 100644 index 000000000..86ddc109b --- /dev/null +++ b/walnut/validate/workflow_test.yaml @@ -0,0 +1,23 @@ +name: readout-stfb +roles: + - name: host-{{ it }} + for: + range: "{{ hosts }}" + var: it + vars: + readout_cfg_uri: "file:/home/flp/readout_stfb_emu.cfg" + constraints: + - attribute: machine_id + value: "{{ it }}" + roles: + - name: "readout" + task: + load: readout + - name: "stfb" + connect: + - name: readout + type: pull + target: "{{ Parent().Path }}.readout:readout" + rateLogging: "1" + task: + load: stfbuilder-nooutput From 6e3cbbe17fa9808184de9c147008e3aa608b78c2 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 27 May 2020 07:06:54 +0530 Subject: [PATCH 0393/2352] [walnut] added conditionals --- walnut/schemata/Workflow.json | 96 ++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 16cc179d7..3233dea40 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -18,40 +18,40 @@ "for": { "description": "Amount of Memory", "type": "object", - "anyOf": [ + "properties": { + "begin": { + "title": "Begin port", + "type": "number" + }, + "end": { + "title": "End port", + "type": "number" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + }, + "range": { + "title": "Port ranges", + "type": "string" + } + }, + "oneOf": [ { - "properties": { - "begin": { - "title": "Begin port", - "type": "number" - }, - "end": { - "title": "End port", - "type": "number" - }, - "var": { - "title": "variables", - "type": "string", - "enum": [ - "it" - ] - } - } + "required": [ + "begin", + "end", + "var" + ] }, { - "properties": { - "range": { - "title": "Port ranges", - "type": "string" - }, - "var": { - "title": "variables", - "type": "string", - "enum": [ - "it" - ] - } - } + "required": [ + "range", + "var" + ] } ] }, @@ -175,7 +175,19 @@ "$ref": "#/definitions/roles" } } - } + }, + "oneOf": [ + { + "required": [ + "roles" + ] + }, + { + "required": [ + "task" + ] + } + ] } }, "type": "object", @@ -191,17 +203,17 @@ "type": "array", "items": { "$ref": "#/definitions/roles" - }, - "defaults": { - "type": "object", - "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything" - }, - "vars": { - "type": "string", - "title": "User variable definitions", - "description": "Variable definitions: vars, override defaults, overridden by user vars." } + }, + "defaults": { + "type": "object", + "title": "Variable definitions", + "description": "Variable definitions: defaults, overridden by anything" + }, + "vars": { + "type": "string", + "title": "User variable definitions", + "description": "Variable definitions: vars, override defaults, overridden by user vars." } } } \ No newline at end of file From 9c906fc94d05767217f90f84b86a25dc46cb3900 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 27 May 2020 07:30:41 +0530 Subject: [PATCH 0394/2352] [walnut] schemata improvements --- walnut/schemata/Task.json | 93 ++++++------ walnut/schemata/Workflow.json | 82 +++++----- walnut/schemata/schemata.go | 271 ++++++++++++++++++---------------- walnut/validate/validate.go | 8 +- 4 files changed, 240 insertions(+), 214 deletions(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index d5ec2436d..2c8a05a99 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -4,6 +4,9 @@ "title": "AliECS Task Template", "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", "type": "object", + "required": [ + "name" + ], "properties": { "name": { "description": "The unique identifier for a task", @@ -42,15 +45,53 @@ } } }, + "connect": { + "title": "Connect", + "type": "array", + "items": { + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + } + }, + "required": [ + "name", + "type", + "target" + ] + } + }, "bind": { "type": "array", "title": "Bind array schema", "items": { "type": "object", - "required": [ - "name", - "type" - ], "properties": { "name": { "type": "string" @@ -85,47 +126,11 @@ "shmem" ] } - } - } - }, - "connect": { - "title": "Connect", - "type": "object", - "required": [ - "name", - "type", - "target" - ], - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": "number" - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": "number" }, - "rateLogging": { - "title": "Rate Logging", - "type": "string" - } + "required": [ + "name", + "type" + ] } }, "command": { diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 3233dea40..cd8c388e5 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -73,41 +73,43 @@ "connect": { "title": "Connect", "type": "array", - "required": [ - "name", - "type", - "target" - ], - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": "number" - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": "number" + "items": { + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + } }, - "rateLogging": { - "title": "Rate Logging", - "type": "number" - } + "required": [ + "name", + "type", + "target" + ] } }, "bind": { @@ -115,10 +117,6 @@ "title": "Bind array schema", "items": { "type": "object", - "required": [ - "name", - "type" - ], "properties": { "name": { "type": "string" @@ -142,7 +140,7 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "number" + "type": "string" }, "transport": { "type": "string", @@ -153,7 +151,11 @@ "shmem" ] } - } + }, + "required": [ + "name", + "type" + ] } }, "task": { diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index fc1351a90..4b0f2ef13 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -8,6 +8,9 @@ Task = ` "title": "AliECS Task Template", "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", "type": "object", + "required": [ + "name" + ], "properties": { "name": { "description": "The unique identifier for a task", @@ -46,15 +49,53 @@ Task = ` } } }, + "connect": { + "title": "Connect", + "type": "array", + "items": { + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + } + }, + "required": [ + "name", + "type", + "target" + ] + } + }, "bind": { "type": "array", "title": "Bind array schema", "items": { "type": "object", - "required": [ - "name", - "type" - ], "properties": { "name": { "type": "string" @@ -89,47 +130,11 @@ Task = ` "shmem" ] } - } - } - }, - "connect": { - "title": "Connect", - "type": "object", - "required": [ - "name", - "type", - "target" - ], - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": "number" - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": "number" - }, - "rateLogging": { - "title": "Rate Logging", - "type": "string" - } + "required": [ + "name", + "type" + ] } }, "command": { @@ -187,40 +192,40 @@ Workflow = ` "for": { "description": "Amount of Memory", "type": "object", - "anyOf": [ + "properties": { + "begin": { + "title": "Begin port", + "type": "number" + }, + "end": { + "title": "End port", + "type": "number" + }, + "var": { + "title": "variables", + "type": "string", + "enum": [ + "it" + ] + }, + "range": { + "title": "Port ranges", + "type": "string" + } + }, + "oneOf": [ { - "properties": { - "begin": { - "title": "Begin port", - "type": "number" - }, - "end": { - "title": "End port", - "type": "number" - }, - "var": { - "title": "variables", - "type": "string", - "enum": [ - "it" - ] - } - } + "required": [ + "begin", + "end", + "var" + ] }, { - "properties": { - "range": { - "title": "Port ranges", - "type": "string" - }, - "var": { - "title": "variables", - "type": "string", - "enum": [ - "it" - ] - } - } + "required": [ + "range", + "var" + ] } ] }, @@ -242,41 +247,43 @@ Workflow = ` "connect": { "title": "Connect", "type": "array", - "required": [ - "name", - "type", - "target" - ], - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": "number" - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": "number" + "items": { + "properties": { + "name": { + "description": "Name of the inbound channel", + "type": "string" + }, + "target": { + "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", + "type": "string" + }, + "type": { + "type": "string", + "enum": [ + "pub", + "sub", + "push", + "pull" + ] + }, + "sndBufSize": { + "title": "Send Buffer Size", + "type": "number" + }, + "rcvBufSize": { + "title": "Receive Buffer Size", + "type": "number" + }, + "rateLogging": { + "title": "Rate Logging", + "type": "string" + } }, - "rateLogging": { - "title": "Rate Logging", - "type": "number" - } + "required": [ + "name", + "type", + "target" + ] } }, "bind": { @@ -284,10 +291,6 @@ Workflow = ` "title": "Bind array schema", "items": { "type": "object", - "required": [ - "name", - "type" - ], "properties": { "name": { "type": "string" @@ -311,7 +314,7 @@ Workflow = ` }, "rateLogging": { "title": "Rate Logging", - "type": "number" + "type": "string" }, "transport": { "type": "string", @@ -322,7 +325,11 @@ Workflow = ` "shmem" ] } - } + }, + "required": [ + "name", + "type" + ] } }, "task": { @@ -344,7 +351,19 @@ Workflow = ` "$ref": "#/definitions/roles" } } - } + }, + "oneOf": [ + { + "required": [ + "roles" + ] + }, + { + "required": [ + "task" + ] + } + ] } }, "type": "object", @@ -360,17 +379,17 @@ Workflow = ` "type": "array", "items": { "$ref": "#/definitions/roles" - }, - "defaults": { - "type": "object", - "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything" - }, - "vars": { - "type": "string", - "title": "User variable definitions", - "description": "Variable definitions: vars, override defaults, overridden by user vars." } + }, + "defaults": { + "type": "object", + "title": "Variable definitions", + "description": "Variable definitions: defaults, overridden by anything" + }, + "vars": { + "type": "string", + "title": "User variable definitions", + "description": "Variable definitions: vars, override defaults, overridden by user vars." } } }` diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go index fdeb24b6a..3b30c4cfe 100644 --- a/walnut/validate/validate.go +++ b/walnut/validate/validate.go @@ -38,14 +38,14 @@ import ( type inputYAML map[string]interface{} func (m *inputYAML) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - type _inputYAML map[string]interface{} - - data := _inputYAML{} + var data interface{} err = unmarshal(&data) if err != nil { - return + return err } + data = convert(data) + return } From c4dafd3af3aeb7eff827dc61010f7184e20dcaeb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 28 May 2020 07:38:54 +0530 Subject: [PATCH 0395/2352] [walnut] rename package validate to schemata --- ...{includeSchemata.go => includeschemata.go} | 0 ...hemata_test.go => includeschemata_test.go} | 0 walnut/schemata/task_test.yaml | 24 +++ walnut/schemata/validate.go | 137 ++++++++++++++++++ walnut/schemata/validate_test.go | 50 +++++++ walnut/schemata/workflow_test.yaml | 23 +++ 6 files changed, 234 insertions(+) rename walnut/schemata/{includeSchemata.go => includeschemata.go} (100%) rename walnut/schemata/{includeSchemata_test.go => includeschemata_test.go} (100%) create mode 100644 walnut/schemata/task_test.yaml create mode 100644 walnut/schemata/validate.go create mode 100644 walnut/schemata/validate_test.go create mode 100644 walnut/schemata/workflow_test.yaml diff --git a/walnut/schemata/includeSchemata.go b/walnut/schemata/includeschemata.go similarity index 100% rename from walnut/schemata/includeSchemata.go rename to walnut/schemata/includeschemata.go diff --git a/walnut/schemata/includeSchemata_test.go b/walnut/schemata/includeschemata_test.go similarity index 100% rename from walnut/schemata/includeSchemata_test.go rename to walnut/schemata/includeschemata_test.go diff --git a/walnut/schemata/task_test.yaml b/walnut/schemata/task_test.yaml new file mode 100644 index 000000000..219989675 --- /dev/null +++ b/walnut/schemata/task_test.yaml @@ -0,0 +1,24 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "file:/home/flp/readout.cfg" +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "1" + addressing: ipc + transport: shmem +properties: {} +command: + env: [] + shell: true + arguments: + - "{{ readout_cfg_uri }}" + value: >- + eval `aliswmod load Readout Control-OCCPlugin` && + readout.exe + \ No newline at end of file diff --git a/walnut/schemata/validate.go b/walnut/schemata/validate.go new file mode 100644 index 000000000..6fe0b8af4 --- /dev/null +++ b/walnut/schemata/validate.go @@ -0,0 +1,137 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package schemata + +import ( + "errors" + "fmt" + "os" + + "gopkg.in/yaml.v3" + + "github.com/xeipuuv/gojsonschema" +) + +// Validate accepts YAML file and format then validate against the schema specified (either workflow or task) +func Validate(input []byte, format string) (err error) { + + //inputData := inputYAML{} + + var inputData interface{} + if err := yaml.Unmarshal(input, &inputData); err != nil { + return fmt.Errorf("Unmarshaling YAML failed: %w", err) + } + + // inputData = convert(inputData) + + var schema string + switch format { + case "task": + schema = Task + case "workflow": + schema = Workflow + default: + err = errors.New("format not task or workflow") + return fmt.Errorf("Failed to obtain schema: %w", err) + } + + schemaLoader := gojsonschema.NewStringLoader(schema) // load schema + documentLoader := gojsonschema.NewGoLoader(inputData) // load empty interface + + // fmt.Printf("RAWYAML: %v\n", inputData.value) + + result, err := gojsonschema.Validate(schemaLoader, documentLoader) + if err != nil { + return fmt.Errorf("Error loading data: %w", err) + } + + if result.Valid() { + fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) + os.Exit(0) + } else { + err = errors.New("file is not valid against schema\n") + return fmt.Errorf("schema validation: %w", err) + } + return nil +} + +/* +type inputYAML map[string]interface{} + +func (ms *inputYAML) UnmarshalYAML(unmarshal func(interface{}) error) error { + var result map[interface{}]interface{} + err := unmarshal(&result) + if err != nil { + panic(err) + } + *ms = cleanUpInterfaceMap(result) + return nil +} + +func cleanUpInterfaceArray(in []interface{}) []interface{} { + result := make([]interface{}, len(in)) + for i, v := range in { + result[i] = cleanUpMapValue(v) + } + return result +} + +func cleanUpInterfaceMap(in map[interface{}]interface{}) inputYAML { + result := make(inputYAML) + for k, v := range in { + result[fmt.Sprintf("%v", k)] = cleanUpMapValue(v) + } + return result +} + +func cleanUpMapValue(v interface{}) interface{} { + switch v := v.(type) { + case []interface{}: + return cleanUpInterfaceArray(v) + case map[interface{}]interface{}: + return cleanUpInterfaceMap(v) + case string: + return v + default: + return fmt.Sprintf("%v", v) + } +} + +func convert(i interface{}) interface{} { + switch x := i.(type) { + case map[interface{}]interface{}: + m2 := map[string]interface{}{} + for k, v := range x { + m2[k.(string)] = convert(v) + } + return m2 + case []interface{}: + for i, v := range x { + x[i] = convert(v) + } + } + return i +} +*/ diff --git a/walnut/schemata/validate_test.go b/walnut/schemata/validate_test.go new file mode 100644 index 000000000..9227096bf --- /dev/null +++ b/walnut/schemata/validate_test.go @@ -0,0 +1,50 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package schemata + +import ( + "io/ioutil" + "testing" +) + +func TestTaskSchemaValidation(t *testing.T) { + t.Run("Testing Validation with Task", func(t *testing.T) { + testfile, _ := ioutil.ReadFile("task_test.yaml") + err := Validate(testfile, "task") + if err != nil { + t.Errorf("task validation failed: %v", err) + } + }) +} + +func TestWorkflowSchemaValidation(t *testing.T) { + t.Run("Testing Validation with Workflow", func(t *testing.T) { + testfile, _ := ioutil.ReadFile("workflow_test.yaml") + err := Validate(testfile, "workflow") + if err != nil { + t.Errorf("workflow validation failed: %v", err) + } + }) +} diff --git a/walnut/schemata/workflow_test.yaml b/walnut/schemata/workflow_test.yaml new file mode 100644 index 000000000..86ddc109b --- /dev/null +++ b/walnut/schemata/workflow_test.yaml @@ -0,0 +1,23 @@ +name: readout-stfb +roles: + - name: host-{{ it }} + for: + range: "{{ hosts }}" + var: it + vars: + readout_cfg_uri: "file:/home/flp/readout_stfb_emu.cfg" + constraints: + - attribute: machine_id + value: "{{ it }}" + roles: + - name: "readout" + task: + load: readout + - name: "stfb" + connect: + - name: readout + type: pull + target: "{{ Parent().Path }}.readout:readout" + rateLogging: "1" + task: + load: stfbuilder-nooutput From 410ef55e48c0ea13e5fa4a59a09160317f0320c9 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 28 May 2020 07:39:29 +0530 Subject: [PATCH 0396/2352] [walnut] misc reference fixes --- walnut/cmd/check.go | 6 +- walnut/validate/task_test.yaml | 24 ------- walnut/validate/validate.go | 109 ----------------------------- walnut/validate/validate_test.go | 50 ------------- walnut/validate/workflow_test.yaml | 23 ------ 5 files changed, 3 insertions(+), 209 deletions(-) delete mode 100644 walnut/validate/task_test.yaml delete mode 100644 walnut/validate/validate.go delete mode 100644 walnut/validate/validate_test.go delete mode 100644 walnut/validate/workflow_test.yaml diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 08cfa2158..1e1addc9a 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -32,7 +32,7 @@ import ( "os" "strings" - "github.com/AliceO2Group/Control/walnut/validate" + "github.com/AliceO2Group/Control/walnut/schemata" "github.com/spf13/cobra" ) @@ -58,12 +58,12 @@ Valid schemata: format, _ := cmd.Flags().GetString("format") for _, filename := range args { - rawYAML, err := ioutil.ReadFile(filename) + file, err := ioutil.ReadFile(filename) if err != nil { fmt.Printf("failed to open file %s: %v", filename, err) os.Exit(1) } - err = validate.CheckSchema(rawYAML, format) + err = schemata.Validate(file, format) if err != nil { fmt.Printf("validation failed: %v", err) os.Exit(1) diff --git a/walnut/validate/task_test.yaml b/walnut/validate/task_test.yaml deleted file mode 100644 index 219989675..000000000 --- a/walnut/validate/task_test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: readout # read by workflow -defaults: - readout_cfg_uri: "file:/home/flp/readout.cfg" -control: - mode: direct -wants: - cpu: 0.15 - memory: 128 -bind: - - name: readout - type: push - rateLogging: "1" - addressing: ipc - transport: shmem -properties: {} -command: - env: [] - shell: true - arguments: - - "{{ readout_cfg_uri }}" - value: >- - eval `aliswmod load Readout Control-OCCPlugin` && - readout.exe - \ No newline at end of file diff --git a/walnut/validate/validate.go b/walnut/validate/validate.go deleted file mode 100644 index 3b30c4cfe..000000000 --- a/walnut/validate/validate.go +++ /dev/null @@ -1,109 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package validate - -import ( - "errors" - "fmt" - "os" - - "github.com/AliceO2Group/Control/walnut/schemata" - "gopkg.in/yaml.v2" - - "github.com/xeipuuv/gojsonschema" -) - -type inputYAML map[string]interface{} - -func (m *inputYAML) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - var data interface{} - err = unmarshal(&data) - if err != nil { - return err - } - - data = convert(data) - - return -} - -// CheckSchema accepts YAML file and format then validate against the schema specified (either workflow or task) -func CheckSchema(rawYAML []byte, format string) (err error) { - - var dataFromYAML interface{} - if err := yaml.Unmarshal(rawYAML, &dataFromYAML); err != nil { - return fmt.Errorf("Unmarshaling YAML failed: %w", err) - } - - dataFromYAML = convert(dataFromYAML) - - var schema string - switch format { - case "task": - schema = schemata.Task - case "workflow": - schema = schemata.Workflow - default: - err = errors.New("format not task or workflow") - return fmt.Errorf("Failed to obtain schema: %w", err) - } - - schemaLoader := gojsonschema.NewStringLoader(schema) // load schema - documentLoader := gojsonschema.NewGoLoader(dataFromYAML) // load empty interface - - // fmt.Printf("RAWYAML: %v\n", dataFromYAML.value) - - result, err := gojsonschema.Validate(schemaLoader, documentLoader) - if err != nil { - return fmt.Errorf("Error loading data: %w", err) - } - - if result.Valid() { - fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) - os.Exit(0) - } else { - err = errors.New("file is not valid against schema\n") - return fmt.Errorf("schema validation: %w", err) - } - return nil -} - -// convert takes a interface{} as input and recursively converts all child -// map[interface{}]interface{} to map[string]interface{} -func convert(i interface{}) interface{} { - switch x := i.(type) { - case map[interface{}]interface{}: - m2 := map[string]interface{}{} - for k, v := range x { - m2[k.(string)] = convert(v) - } - return m2 - case []interface{}: - for i, v := range x { - x[i] = convert(v) - } - } - return i -} diff --git a/walnut/validate/validate_test.go b/walnut/validate/validate_test.go deleted file mode 100644 index c48f30d29..000000000 --- a/walnut/validate/validate_test.go +++ /dev/null @@ -1,50 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package validate - -import ( - "io/ioutil" - "testing" -) - -func TestTaskSchemaValidation(t *testing.T) { - t.Run("Testing Validation with Task", func(t *testing.T) { - testfile, _ := ioutil.ReadFile("task_test.yaml") - err := CheckSchema(testfile, "task") - if err != nil { - t.Errorf("task validation failed: %v", err) - } - }) -} - -func TestWorkflowSchemaValidation(t *testing.T) { - t.Run("Testing Validation with Workflow", func(t *testing.T) { - testfile, _ := ioutil.ReadFile("workflow_test.yaml") - err := CheckSchema(testfile, "workflow") - if err != nil { - t.Errorf("workflow validation failed: %v", err) - } - }) -} diff --git a/walnut/validate/workflow_test.yaml b/walnut/validate/workflow_test.yaml deleted file mode 100644 index 86ddc109b..000000000 --- a/walnut/validate/workflow_test.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: readout-stfb -roles: - - name: host-{{ it }} - for: - range: "{{ hosts }}" - var: it - vars: - readout_cfg_uri: "file:/home/flp/readout_stfb_emu.cfg" - constraints: - - attribute: machine_id - value: "{{ it }}" - roles: - - name: "readout" - task: - load: readout - - name: "stfb" - connect: - - name: readout - type: pull - target: "{{ Parent().Path }}.readout:readout" - rateLogging: "1" - task: - load: stfbuilder-nooutput From 5b5d7a79ad9e989fe66b4b729435366606b149d5 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 30 May 2020 09:27:26 +0530 Subject: [PATCH 0397/2352] [walnut] minor optimisations and clea-up --- cmd/walnut/main.go | 3 ++ walnut/cmd/check.go | 9 ++-- walnut/schemata/validate.go | 74 +++----------------------------- walnut/schemata/validate_test.go | 2 - 4 files changed, 12 insertions(+), 76 deletions(-) diff --git a/cmd/walnut/main.go b/cmd/walnut/main.go index 5c41f873b..2580c2989 100644 --- a/cmd/walnut/main.go +++ b/cmd/walnut/main.go @@ -25,6 +25,9 @@ // Package walnut implements the O² Workflow Administration and Linting Utility. package main +// Generate latest schemas from .json files +//go:generate go run ../../walnut/schemata/includeschemata.go + import "github.com/AliceO2Group/Control/walnut/cmd" func main() { diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 1e1addc9a..07d505a5f 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -22,15 +22,12 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate go run ../schemata/includeSchemata.go - package cmd import ( "fmt" "io/ioutil" "os" - "strings" "github.com/AliceO2Group/Control/walnut/schemata" "github.com/spf13/cobra" @@ -48,13 +45,13 @@ Usage: walnut check --format [format] [file] Example: - walnut check --format workflow_template readout-sftb.yaml + walnut check --format workflow readout-sftb.yaml -Valid schemata: +Valid schemata formats: workflow task dpl_dump`, Run: func(cmd *cobra.Command, args []string) { - fmt.Println("check called with arg: " + strings.Join(args, " ")) + // fmt.Println("check called with arg: " + strings.Join(args, " ")) format, _ := cmd.Flags().GetString("format") for _, filename := range args { diff --git a/walnut/schemata/validate.go b/walnut/schemata/validate.go index 6fe0b8af4..b04e1b95b 100644 --- a/walnut/schemata/validate.go +++ b/walnut/schemata/validate.go @@ -34,18 +34,15 @@ import ( "github.com/xeipuuv/gojsonschema" ) -// Validate accepts YAML file and format then validate against the schema specified (either workflow or task) +// Validate takes a YAML file and format then perform schema validation +// on the file against the schema specified (either workflow or task) func Validate(input []byte, format string) (err error) { - //inputData := inputYAML{} - var inputData interface{} if err := yaml.Unmarshal(input, &inputData); err != nil { return fmt.Errorf("Unmarshaling YAML failed: %w", err) } - // inputData = convert(inputData) - var schema string switch format { case "task": @@ -58,7 +55,7 @@ func Validate(input []byte, format string) (err error) { } schemaLoader := gojsonschema.NewStringLoader(schema) // load schema - documentLoader := gojsonschema.NewGoLoader(inputData) // load empty interface + documentLoader := gojsonschema.NewGoLoader(inputData) // load unmarhsaled YAML // fmt.Printf("RAWYAML: %v\n", inputData.value) @@ -68,70 +65,11 @@ func Validate(input []byte, format string) (err error) { } if result.Valid() { - fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) + // fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) os.Exit(0) } else { - err = errors.New("file is not valid against schema\n") - return fmt.Errorf("schema validation: %w", err) + err = errors.New("file is invalid against schema") + return fmt.Errorf("schema validation: %w\n", err) } return nil } - -/* -type inputYAML map[string]interface{} - -func (ms *inputYAML) UnmarshalYAML(unmarshal func(interface{}) error) error { - var result map[interface{}]interface{} - err := unmarshal(&result) - if err != nil { - panic(err) - } - *ms = cleanUpInterfaceMap(result) - return nil -} - -func cleanUpInterfaceArray(in []interface{}) []interface{} { - result := make([]interface{}, len(in)) - for i, v := range in { - result[i] = cleanUpMapValue(v) - } - return result -} - -func cleanUpInterfaceMap(in map[interface{}]interface{}) inputYAML { - result := make(inputYAML) - for k, v := range in { - result[fmt.Sprintf("%v", k)] = cleanUpMapValue(v) - } - return result -} - -func cleanUpMapValue(v interface{}) interface{} { - switch v := v.(type) { - case []interface{}: - return cleanUpInterfaceArray(v) - case map[interface{}]interface{}: - return cleanUpInterfaceMap(v) - case string: - return v - default: - return fmt.Sprintf("%v", v) - } -} - -func convert(i interface{}) interface{} { - switch x := i.(type) { - case map[interface{}]interface{}: - m2 := map[string]interface{}{} - for k, v := range x { - m2[k.(string)] = convert(v) - } - return m2 - case []interface{}: - for i, v := range x { - x[i] = convert(v) - } - } - return i -} -*/ diff --git a/walnut/schemata/validate_test.go b/walnut/schemata/validate_test.go index 9227096bf..064d82fb9 100644 --- a/walnut/schemata/validate_test.go +++ b/walnut/schemata/validate_test.go @@ -37,9 +37,7 @@ func TestTaskSchemaValidation(t *testing.T) { t.Errorf("task validation failed: %v", err) } }) -} -func TestWorkflowSchemaValidation(t *testing.T) { t.Run("Testing Validation with Workflow", func(t *testing.T) { testfile, _ := ioutil.ReadFile("workflow_test.yaml") err := Validate(testfile, "workflow") From ec9517f018efcb3bde22f8559e09af18069a78b6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 30 May 2020 09:28:02 +0530 Subject: [PATCH 0398/2352] [walnut] nit newline at EOF --- walnut/schemata/Task.json | 2 +- walnut/schemata/Workflow.json | 2 +- walnut/schemata/workflow_test.yaml | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index 2c8a05a99..b0e404009 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -166,4 +166,4 @@ } } } -} \ No newline at end of file +} diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index cd8c388e5..44fb5656b 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -218,4 +218,4 @@ "description": "Variable definitions: vars, override defaults, overridden by user vars." } } -} \ No newline at end of file +} diff --git a/walnut/schemata/workflow_test.yaml b/walnut/schemata/workflow_test.yaml index 86ddc109b..9ae8a1d99 100644 --- a/walnut/schemata/workflow_test.yaml +++ b/walnut/schemata/workflow_test.yaml @@ -21,3 +21,4 @@ roles: rateLogging: "1" task: load: stfbuilder-nooutput + \ No newline at end of file From 5f25ab14cc7a203580c846fce09a4594b8a6d225 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 6 Jun 2020 19:13:11 +0530 Subject: [PATCH 0399/2352] [walnut] Init importer --- walnut/converter/dump.json | 364 ++++++++++++++++++++++++++++++ walnut/converter/importer.go | 68 ++++++ walnut/converter/importer_test.go | 36 +++ 3 files changed, 468 insertions(+) create mode 100644 walnut/converter/dump.json create mode 100644 walnut/converter/importer.go create mode 100644 walnut/converter/importer_test.go diff --git a/walnut/converter/dump.json b/walnut/converter/dump.json new file mode 100644 index 000000000..92d70645d --- /dev/null +++ b/walnut/converter/dump.json @@ -0,0 +1,364 @@ +[INFO] Using config file 'json:///home/alidock/.sw/slc8_x86-64/QualityControl/master-1/etc/basic.json' +2020-06-04 16:59:04.933371 QC infologger initialized +2020-06-04 16:59:04.933395 QC version 0.26.1 +2020-06-04 16:59:04.933554 policyName : tst-raw +2020-06-04 16:59:04.933588 Configuration loaded : +2020-06-04 16:59:04.933595 >> Task name : QcTask +2020-06-04 16:59:04.933599 >> Module name : QcSkeleton +2020-06-04 16:59:04.933604 >> Detector name : TST +2020-06-04 16:59:04.933614 >> Cycle duration seconds : 10 +2020-06-04 16:59:04.933619 >> Max number cycles : -1 +2020-06-04 16:59:04.933736 >> Check name : QcCheck +2020-06-04 16:59:04.933843 >> Inputs (1): QC_QcTask-mo_0 checks (1): QcCheck stores (1): QC_QcTask-mo_0 +{ + "workflow": [ + { + "name": "producer-0", + "inputs": [], + "outputs": [ + { + "binding": "out", + "origin": "TST", + "description": "RAWDATA", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + }, + { + "name": "Dispatcher", + "inputs": [ + { + "binding": "random", + "origin": "TST", + "description": "RAWDATA", + "subspec": 0, + "lifetime": 0 + }, + { + "binding": "timer-stats", + "origin": "DS", + "description": "TIMER-Dispatcher", + "subspec": 0, + "lifetime": 4 + } + ], + "outputs": [ + { + "binding": "random", + "origin": "DS", + "description": "tst-raw-0", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [ + { + "name": "period-timer-stats", + "type": "0", + "defaultValue": "10000000", + "help": "Dispatcher's stats timer period" + } + ], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + }, + { + "name": "QC-TASK-RUNNER-QcTask", + "inputs": [ + { + "binding": "random", + "origin": "DS", + "description": "tst-raw-0", + "subspec": 0, + "lifetime": 0 + }, + { + "binding": "timer-cycle", + "origin": "QC", + "description": "TIMER-QcTask-mo", + "subspec": 0, + "lifetime": 4 + } + ], + "outputs": [ + { + "binding": "mo", + "origin": "QC", + "description": "QcTask-mo", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [ + { + "name": "period-timer-cycle", + "type": "0", + "defaultValue": "10000000", + "help": "timer period" + } + ], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + }, + { + "name": "QC-CHECK-RUNNER-QcCheck", + "inputs": [ + { + "binding": "QcTask", + "origin": "QC", + "description": "QcTask-mo", + "subspec": 0, + "lifetime": 0 + } + ], + "outputs": [ + { + "binding": "QC/QcCheck-chk/0", + "origin": "QC", + "description": "QcCheck-chk", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + }, + { + "name": "printer", + "inputs": [ + { + "binding": "checked-mo", + "origin": "QC", + "description": "QcCheck-chk", + "subspec": 0, + "lifetime": 0 + } + ], + "outputs": [], + "options": [], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + } + ], + "metadata": [ + { + "name": "internal-dpl-clock", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + }, + { + "name": "producer-0", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + }, + { + "name": "Dispatcher", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + }, + { + "name": "QC-TASK-RUNNER-QcTask", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + }, + { + "name": "QC-CHECK-RUNNER-QcCheck", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + }, + { + "name": "printer", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + } + ] +} diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go new file mode 100644 index 000000000..9b6caf543 --- /dev/null +++ b/walnut/converter/importer.go @@ -0,0 +1,68 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package converter + +import ( + "bufio" + "encoding/json" + "fmt" + "os" + + "github.com/AliceO2Group/Control/core/workflow" +) + +func importer(filename string) (err error) { + file, err := os.Open(filename) + if err != nil { + return err + } + defer file.Close() + + scanner := bufio.NewScanner(file) + var inputJSON string + // TODO: Probably a better way to handle this + for scanner.Scan() { + line := scanner.Text() + if line[0] == '{' { + inputJSON += line + "\n" + for scanner.Scan() { + inputJSON += scanner.Text() + "\n" + } + break + } + } + // fmt.Printf("JSON: %s", json) + + var data workflow.Role + if err := json.Unmarshal([]byte(inputJSON), &data); err != nil { + return fmt.Errorf("Unmarshaling Error: %w", err) + } + + fmt.Printf("workflow.Role: %s", data) + + // var DPL workflow.Role + + return nil +} diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go new file mode 100644 index 000000000..85d28e45a --- /dev/null +++ b/walnut/converter/importer_test.go @@ -0,0 +1,36 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package converter + +import "testing" + +func TestImportUnmarshal(t *testing.T) { + t.Run("Testing dump reading", func(t *testing.T) { + err := importer("dump.json") + if err != nil { + t.Errorf("import failed: %v", err) + } + }) +} From a81a217a38f62b7c201be09c5d436f35c3ead5a1 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 9 Jun 2020 16:35:01 +0530 Subject: [PATCH 0400/2352] [walnut] load DPL dump into task.Class --- core/task/channel/channel.go | 31 +++++----- core/task/channel/inbound.go | 6 +- core/task/channel/outbound.go | 47 ++++++++------- core/task/class.go | 65 ++++++++++----------- walnut/converter/converter.go | 91 ++++++++++++++++++++++++++++++ walnut/converter/converter_test.go | 51 +++++++++++++++++ walnut/converter/example.json | 66 ++++++++++++++++++++++ walnut/converter/importer.go | 66 ++++++++++++++++------ walnut/converter/importer_test.go | 18 +++++- 9 files changed, 348 insertions(+), 93 deletions(-) create mode 100644 walnut/converter/converter.go create mode 100644 walnut/converter/converter_test.go create mode 100644 walnut/converter/example.json diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index e4a1f2d7c..e3e7adef6 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -25,9 +25,9 @@ package channel import ( + "errors" "strconv" "strings" - "errors" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" @@ -35,23 +35,23 @@ import ( var log = logger.New(logrus.StandardLogger(), "channel") -type channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging int `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` //default: default +type Channel struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging int `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } -func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize string `yaml:"sndBufSize"` - RcvBufSize string `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` //default: default + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize string `yaml:"sndBufSize"` + RcvBufSize string `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } aux := _channel{} err = unmarshal(&aux) @@ -95,6 +95,7 @@ func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // push/pull/pub/sub/spub/xsub/pair/req/rep/dealer/router // Do we need to support them all? type ChannelType string + const ( PUSH = ChannelType("push") PULL = ChannelType("pull") diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 839b348c1..1487320f5 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -33,7 +33,7 @@ import ( ) type Inbound struct { - channel + Channel Addressing AddressFormat `yaml:"addressing"` //default: tcp } @@ -46,7 +46,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } - ch := channel{} + ch := Channel{} err = unmarshal(&ch) if err != nil { return @@ -56,7 +56,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er } inbound.Addressing = aux.Addressing - inbound.channel = ch + inbound.Channel = ch return } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 2df94f45e..ddf030fc4 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -34,31 +34,30 @@ import ( ) type Outbound struct { - channel - Target string `json:"target" yaml:"target"` + Channel + Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { target := struct { - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` }{} err = unmarshal(&target) if err != nil { return } - ch := channel{} + ch := Channel{} err = unmarshal(&ch) if err != nil { return } outbound.Target = target.Target - outbound.channel = ch + outbound.Channel = ch return } - /* FairMQ outbound channel property map example: chans.data1.0.address = tcp://localhost:5555 [provided] @@ -114,43 +113,43 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap { - "address": address, - "method": "connect", - "rateLogging": strconv.Itoa(outbound.RateLogging), - "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), + chanProps := controlcommands.PropertyMap{ + "address": address, + "method": "connect", + "rateLogging": strconv.Itoa(outbound.RateLogging), + "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(outbound.SndBufSize), + "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": outbound.Type.String(), + "transport": transport.String(), + "type": outbound.Type.String(), } if (transport != outbound.Transport) && (outbound.Transport != DEFAULT) { log.WithFields(logrus.Fields{ - "address": address, - "oubound": outbound.Name, - "actualInboundTransport": transport, - "outboundTransport": outbound.Transport, - }). + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). Warn("channel transport mismatch, fix workflow template") } for k, v := range chanProps { - pm[prefix + "." + k] = v + pm[prefix+"."+k] = v } return } -func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { +func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { channels = make([]Outbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -160,6 +159,6 @@ func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { channels = append(channels, v) } } - + return -} \ No newline at end of file +} diff --git a/core/task/class.go b/core/task/class.go index 825f0088f..18a878e5c 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -26,49 +26,50 @@ package task import ( "fmt" + "strconv" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" - "strconv" ) // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier taskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier taskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -81,47 +82,47 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints:aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, } } return } -type taskClassIdentifier struct { +type TaskClassIdentifier struct { repoIdentifier string hash string Name string } -func (tcID taskClassIdentifier) String() string { +func (tcID TaskClassIdentifier) String() string { return fmt.Sprintf("%stasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) } -func (tcID *taskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { err = unmarshal(&tcID.Name) return } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go new file mode 100644 index 000000000..241dc6ef1 --- /dev/null +++ b/walnut/converter/converter.go @@ -0,0 +1,91 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package converter + +import ( + "fmt" + + "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/channel" +) + +// return pointer to float64 +func create(x float64) *float64 { + return &x +} + +// ExtractTaskClasses takes in a DPL Dump string and extracts +// an array of Tasks +func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { + var tasks []*task.Class + for index := range DPL.Workflows { + + defaultBindChannel := channel.Inbound{ + Channel: channel.Channel{ + Name: DPL.Workflows[index].Name, + Type: channel.ChannelType(""), + SndBufSize: 1000, + RcvBufSize: 1000, + RateLogging: 60, + Transport: channel.TransportType("shmem"), + }, + Addressing: "ipc", + } + + defaultConnectChannel := channel.Outbound{ + Channel: channel.Channel{ + Name: DPL.Workflows[index].Name, + Type: channel.ChannelType(""), + SndBufSize: 1000, + RcvBufSize: 1000, + RateLogging: 60, + Transport: channel.TransportType("shmem"), + }, + Target: "", + } + + var task = task.Class{ + Identifier: task.TaskClassIdentifier{ + Name: DPL.Workflows[index].Name, + }, + Defaults: nil, + Control: struct { + Mode controlmode.ControlMode "yaml:\"mode\"" + }{Mode: 0}, + Wants: task.ResourceWants{ + Cpu: create(0.15), + Memory: create(128), + Ports: nil, //begin - end OR range + }, + Bind: []channel.Inbound{defaultBindChannel}, + Properties: nil, + Connect: []channel.Outbound{defaultConnectChannel}, + } + fmt.Printf("Task: \n%v\n", task) + tasks = append(tasks, &task) + } + return tasks, nil +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go new file mode 100644 index 000000000..f270361b7 --- /dev/null +++ b/walnut/converter/converter_test.go @@ -0,0 +1,51 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package converter + +import ( + "os" + "testing" +) + +func TestExtractClass(t *testing.T) { + t.Run("Testing class extraction", func(t *testing.T) { + file, err := os.Open("dump.json") + if err != nil { + t.Errorf("Opening file failed: %w", err) + } + defer file.Close() + + DplDump, err := jsonImporter(file) + if err != nil { + t.Errorf("Import failed: %w", err) + } + + // jsonImport, _ := jsonImporter(file) + _, err = ExtractTaskClasses(DplDump) + if err != nil { + t.Errorf("import failed: %v", err) + } + }) +} diff --git a/walnut/converter/example.json b/walnut/converter/example.json new file mode 100644 index 000000000..8f2c2a327 --- /dev/null +++ b/walnut/converter/example.json @@ -0,0 +1,66 @@ +{ + "workflow": [ + { + "name": "QC-CHECK-RUNNER-QcCheck", + "inputs": [ + { + "binding": "QcTask", + "origin": "QC", + "description": "QcTask-mo", + "subspec": 0, + "lifetime": 0 + } + ], + "outputs": [ + { + "binding": "QC/QcCheck-chk/0", + "origin": "QC", + "description": "QcCheck-chk", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + } + ], + "metadata": [ + { + "name": "QC-CHECK-RUNNER-QcCheck", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ] + } + ] +} \ No newline at end of file diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 9b6caf543..8aa592511 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -29,19 +29,50 @@ import ( "encoding/json" "fmt" "os" - - "github.com/AliceO2Group/Control/core/workflow" ) -func importer(filename string) (err error) { - file, err := os.Open(filename) - if err != nil { - return err - } - defer file.Close() +type io struct { + Binding string `json:"binding"` + Origin string `json:"origin"` + Description string `json:"description"` + Subspec int `json:"subspec"` + Lifetime int `json:"lifetime"` +} + +type options struct { + Name string `json:"name"` + Type string `json:"type"` + DefaultValue string `json:"defaultValue"` + Help string `json:"help"` +} +type workflow struct { + Name string `json:"name"` + Inputs []io `json:"inputs"` + Ouputs []io `json:"outputs"` + Options []options `json:"options"` + Rank int `json:"rank"` + NSlots int `json:"nSlots"` + InputTimeSliceID int `json:"inputTimeSliceId"` + MaxInputTimeslices int `json:"maxInputTimeslices"` +} - scanner := bufio.NewScanner(file) +type metadata struct { + Name string `json:"name"` + Executable string `json:"executable"` + CmdlLineArgs []string `json:"cmdLineArgs"` + WorkflowOptions []options `json:"workflowOptions"` +} + +// Dump is a 1:1 struct representation of a DPL Dump +type Dump struct { + Workflows []workflow `json:"workflow"` + Metadatas []metadata `json:"metadata"` +} + +func jsonImporter(input *os.File) (importedJSON Dump, err error) { + scanner := bufio.NewScanner(input) var inputJSON string + // TODO: Probably a better way to handle this for scanner.Scan() { line := scanner.Text() @@ -53,16 +84,19 @@ func importer(filename string) (err error) { break } } - // fmt.Printf("JSON: %s", json) - var data workflow.Role - if err := json.Unmarshal([]byte(inputJSON), &data); err != nil { - return fmt.Errorf("Unmarshaling Error: %w", err) + var dump Dump + err = json.Unmarshal([]byte(inputJSON), &dump) + if err != nil { + return dump, fmt.Errorf("JSON Unmarshal failed: %w", err) } - fmt.Printf("workflow.Role: %s", data) + return dump, nil - // var DPL workflow.Role + /* + if err := json.Unmarshal([]byte(inputJSON), &data); err != nil { + return fmt.Errorf("Unmarshaling Error: %w", err) + } + */ - return nil } diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index 85d28e45a..53cc563aa 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -24,13 +24,25 @@ package converter -import "testing" +import ( + "fmt" + "os" + "testing" +) func TestImportUnmarshal(t *testing.T) { t.Run("Testing dump reading", func(t *testing.T) { - err := importer("dump.json") + file, err := os.Open("dump.json") if err != nil { - t.Errorf("import failed: %v", err) + t.Errorf("Opening file failed: %w", err) + } + defer file.Close() + + DplDump, err := jsonImporter(file) + if err != nil { + t.Errorf("Import failed: %w", err) + } else { + fmt.Printf("Imported JSON: \n%v", DplDump) } }) } From f4bac04eff9a3f5ca60271966aa2108b66c86226 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 9 Jun 2020 22:59:36 +0530 Subject: [PATCH 0401/2352] [walnut] added explicit defaults to ExtractTaskClasses --- walnut/converter/converter.go | 26 +++++++++++++++----------- walnut/converter/converter_test.go | 3 +-- walnut/converter/example.json | 2 +- walnut/converter/importer.go | 6 ------ 4 files changed, 17 insertions(+), 20 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 241dc6ef1..14d8d6805 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -25,9 +25,8 @@ package converter import ( - "fmt" - "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" ) @@ -41,8 +40,8 @@ func create(x float64) *float64 { // an array of Tasks func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { var tasks []*task.Class - for index := range DPL.Workflows { + for index := range DPL.Workflows { defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ Name: DPL.Workflows[index].Name, @@ -64,27 +63,32 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { RateLogging: 60, Transport: channel.TransportType("shmem"), }, - Target: "", + // Target: "", No default value } var task = task.Class{ Identifier: task.TaskClassIdentifier{ Name: DPL.Workflows[index].Name, }, - Defaults: nil, + Defaults: gera.MakeStringMapWithMap(map[string]string{ + "user": "flp", + }), Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" - }{Mode: 0}, + }{Mode: controlmode.FAIRMQ}, Wants: task.ResourceWants{ Cpu: create(0.15), Memory: create(128), - Ports: nil, //begin - end OR range + Ports: task.Ranges{}, //begin - end OR range }, - Bind: []channel.Inbound{defaultBindChannel}, - Properties: nil, - Connect: []channel.Outbound{defaultConnectChannel}, + Bind: []channel.Inbound{defaultBindChannel}, + Properties: gera.MakeStringMapWithMap(map[string]string{ + "severity": "trace", + "color": "false", + }), + Connect: []channel.Outbound{defaultConnectChannel}, } - fmt.Printf("Task: \n%v\n", task) + // fmt.Printf("Task: %v\n", task) tasks = append(tasks, &task) } return tasks, nil diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index f270361b7..e54d0becc 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -42,10 +42,9 @@ func TestExtractClass(t *testing.T) { t.Errorf("Import failed: %w", err) } - // jsonImport, _ := jsonImporter(file) _, err = ExtractTaskClasses(DplDump) if err != nil { - t.Errorf("import failed: %v", err) + t.Errorf("Extract Task Class failed: %w", err) } }) } diff --git a/walnut/converter/example.json b/walnut/converter/example.json index 8f2c2a327..9938bd41b 100644 --- a/walnut/converter/example.json +++ b/walnut/converter/example.json @@ -63,4 +63,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 8aa592511..c0a6c2db4 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -93,10 +93,4 @@ func jsonImporter(input *os.File) (importedJSON Dump, err error) { return dump, nil - /* - if err := json.Unmarshal([]byte(inputJSON), &data); err != nil { - return fmt.Errorf("Unmarshaling Error: %w", err) - } - */ - } From b19be479feae829f5965d6f5d5d6818f4064a191 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 17 Jun 2020 11:52:48 +0530 Subject: [PATCH 0402/2352] [walnut] implement writing tasks to a YAML file --- walnut/converter/converter.go | 76 +++++++++++++++++++++++++++++- walnut/converter/converter_test.go | 25 ++++++++++ walnut/converter/example.json | 66 -------------------------- 3 files changed, 100 insertions(+), 67 deletions(-) delete mode 100644 walnut/converter/example.json diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 14d8d6805..ed8907b21 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -25,10 +25,16 @@ package converter import ( + "fmt" + "io/ioutil" + + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/constraint" + "gopkg.in/yaml.v3" ) // return pointer to float64 @@ -36,6 +42,20 @@ func create(x float64) *float64 { return &x } +type class struct { + Identifier task.TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` + Command *common.CommandInfo `yaml:"command"` + Wants task.ResourceWants `yaml:"wants"` + Bind []channel.Inbound `yaml:"bind"` + Properties gera.StringMap `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` +} + // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { @@ -66,7 +86,7 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { // Target: "", No default value } - var task = task.Class{ + task := task.Class{ Identifier: task.TaskClassIdentifier{ Name: DPL.Workflows[index].Name, }, @@ -93,3 +113,57 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { } return tasks, nil } + +func taskToYAML(extractedTasks []*task.Class) (err error) { + for _, SingleTask := range extractedTasks { + YAMLData, err := yaml.Marshal(&SingleTask) + if err != nil { + return fmt.Errorf("Marshal failed: %w", err) + } + + // Write marshaled YAML to file + err = ioutil.WriteFile(SingleTask.Identifier.Name+".yaml", YAMLData, 0644) + if err != nil { + return fmt.Errorf("Creating file failed: %w", err) + } + + } + return +} + +func (t *class) MarshalYAML(marshal func(interface{}) error) (err error) { + type _class struct { + Identifier task.TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` + Command *common.CommandInfo `yaml:"command"` + Wants task.ResourceWants `yaml:"wants"` + Bind []channel.Inbound `yaml:"bind"` + Properties map[string]string `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` + } + + aux := _class{ + Defaults: make(map[string]string), + Properties: make(map[string]string), + } + err = marshal(&aux) + + if err == nil { + *t = class{ + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, + } + } + return +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index e54d0becc..a59b8af63 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -48,3 +48,28 @@ func TestExtractClass(t *testing.T) { } }) } + +func TestTaskToYAML(t *testing.T) { + t.Run("Testing Task -> YAML", func(t *testing.T) { + file, err := os.Open("dump.json") + if err != nil { + t.Errorf("Opening file failed: %w", err) + } + defer file.Close() + + DplDump, err := jsonImporter(file) + if err != nil { + t.Errorf("Import failed: %w", err) + } + + allTasks, err := ExtractTaskClasses(DplDump) + if err != nil { + t.Errorf("Extract Task Class failed: %w", err) + } + + err = taskToYAML(allTasks) + if err != nil { + t.Errorf("Filed to write YAML to file: %w", err) + } + }) +} diff --git a/walnut/converter/example.json b/walnut/converter/example.json deleted file mode 100644 index 9938bd41b..000000000 --- a/walnut/converter/example.json +++ /dev/null @@ -1,66 +0,0 @@ -{ - "workflow": [ - { - "name": "QC-CHECK-RUNNER-QcCheck", - "inputs": [ - { - "binding": "QcTask", - "origin": "QC", - "description": "QcTask-mo", - "subspec": 0, - "lifetime": 0 - } - ], - "outputs": [ - { - "binding": "QC/QcCheck-chk/0", - "origin": "QC", - "description": "QcCheck-chk", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - } - ], - "metadata": [ - { - "name": "QC-CHECK-RUNNER-QcCheck", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ] - } - ] -} From 45845838c52714f57aaefb0801ade8d34f25e91a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 17 Jun 2020 13:12:08 +0530 Subject: [PATCH 0403/2352] [walnut] read and marshal args from DPL Dump --- walnut/converter/converter.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index ed8907b21..c29d28f9c 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -54,17 +54,18 @@ type class struct { Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` Connect []channel.Outbound `yaml:"connect"` + Arguments []string `yaml:"arguments"` } // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { - var tasks []*task.Class +func ExtractTaskClasses(DPL Dump) (tasks []*class, err error) { for index := range DPL.Workflows { + workflowName := DPL.Workflows[index].Name defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ - Name: DPL.Workflows[index].Name, + Name: workflowName, Type: channel.ChannelType(""), SndBufSize: 1000, RcvBufSize: 1000, @@ -76,7 +77,7 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { defaultConnectChannel := channel.Outbound{ Channel: channel.Channel{ - Name: DPL.Workflows[index].Name, + Name: workflowName, Type: channel.ChannelType(""), SndBufSize: 1000, RcvBufSize: 1000, @@ -86,9 +87,15 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { // Target: "", No default value } - task := task.Class{ + var arguments []string + for _, arg := range DPL.Metadatas[index+1].CmdlLineArgs { + arg = fmt.Sprintf("%q", arg) + arguments = append(arguments, arg) + } + + task := class{ Identifier: task.TaskClassIdentifier{ - Name: DPL.Workflows[index].Name, + Name: workflowName, }, Defaults: gera.MakeStringMapWithMap(map[string]string{ "user": "flp", @@ -107,6 +114,7 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { "color": "false", }), Connect: []channel.Outbound{defaultConnectChannel}, + Arguments: arguments, } // fmt.Printf("Task: %v\n", task) tasks = append(tasks, &task) @@ -114,7 +122,7 @@ func ExtractTaskClasses(DPL Dump) ([]*task.Class, error) { return tasks, nil } -func taskToYAML(extractedTasks []*task.Class) (err error) { +func taskToYAML(extractedTasks []*class) (err error) { for _, SingleTask := range extractedTasks { YAMLData, err := yaml.Marshal(&SingleTask) if err != nil { From 5f68d071c16f6c755d5e8b99b91adcf852fdb84f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 17 Jun 2020 12:51:30 +0530 Subject: [PATCH 0404/2352] [walnut] channel names follow expected template --- walnut/converter/converter.go | 70 ++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 26 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index c29d28f9c..587303396 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -27,6 +27,7 @@ package converter import ( "fmt" "io/ioutil" + "os" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" @@ -42,7 +43,7 @@ func create(x float64) *float64 { return &x } -type class struct { +type TaskTemplate struct { Identifier task.TaskClassIdentifier `yaml:"name"` Defaults gera.StringMap `yaml:"defaults"` Control struct { @@ -53,19 +54,24 @@ type class struct { Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` Arguments []string `yaml:"arguments"` } // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(DPL Dump) (tasks []*class, err error) { +func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { + var channelName string for index := range DPL.Workflows { + if index+1 == len(DPL.Workflows) { + channelName = DPL.Workflows[index].Name + } else { + channelName = "from_"+DPL.Workflows[index].Name+"_to_"+DPL.Workflows[index+1].Name + } workflowName := DPL.Workflows[index].Name defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ - Name: workflowName, + Name: channelName, Type: channel.ChannelType(""), SndBufSize: 1000, RcvBufSize: 1000, @@ -75,17 +81,19 @@ func ExtractTaskClasses(DPL Dump) (tasks []*class, err error) { Addressing: "ipc", } - defaultConnectChannel := channel.Outbound{ - Channel: channel.Channel{ - Name: workflowName, - Type: channel.ChannelType(""), - SndBufSize: 1000, - RcvBufSize: 1000, - RateLogging: 60, - Transport: channel.TransportType("shmem"), - }, - // Target: "", No default value - } + /* + defaultConnectChannel := channel.Outbound{ + Channel: channel.Channel{ + Name: workflowName, + Type: channel.ChannelType(""), + SndBufSize: 1000, + RcvBufSize: 1000, + RateLogging: 60, + Transport: channel.TransportType("shmem"), + }, + // Target: "", No default value + } + */ var arguments []string for _, arg := range DPL.Metadatas[index+1].CmdlLineArgs { @@ -93,7 +101,7 @@ func ExtractTaskClasses(DPL Dump) (tasks []*class, err error) { arguments = append(arguments, arg) } - task := class{ + task := TaskTemplate{ Identifier: task.TaskClassIdentifier{ Name: workflowName, }, @@ -113,16 +121,26 @@ func ExtractTaskClasses(DPL Dump) (tasks []*class, err error) { "severity": "trace", "color": "false", }), - Connect: []channel.Outbound{defaultConnectChannel}, + // Connect: []channel.Outbound{defaultConnectChannel}, Arguments: arguments, } - // fmt.Printf("Task: %v\n", task) + fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) } return tasks, nil } -func taskToYAML(extractedTasks []*class) (err error) { +func taskToYAML(extractedTasks []*TaskTemplate) (err error) { + + _, err = os.Stat("tasks") + + if os.IsNotExist(err) { + errDir := os.MkdirAll("tasks", 0755) + if errDir != nil { + return fmt.Errorf("create dir failed: %w", err) + } + } + for _, SingleTask := range extractedTasks { YAMLData, err := yaml.Marshal(&SingleTask) if err != nil { @@ -130,7 +148,7 @@ func taskToYAML(extractedTasks []*class) (err error) { } // Write marshaled YAML to file - err = ioutil.WriteFile(SingleTask.Identifier.Name+".yaml", YAMLData, 0644) + err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0644) if err != nil { return fmt.Errorf("Creating file failed: %w", err) } @@ -139,10 +157,10 @@ func taskToYAML(extractedTasks []*class) (err error) { return } -func (t *class) MarshalYAML(marshal func(interface{}) error) (err error) { +func (t *TaskTemplate) MarshalYAML(marshal func(interface{}) error) (err error) { type _class struct { - Identifier task.TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` + Identifier task.TaskClassIdentifier + Defaults map[string]string `yaml:"defaults"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` @@ -151,7 +169,7 @@ func (t *class) MarshalYAML(marshal func(interface{}) error) (err error) { Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + // Connect []channel.Outbound `yaml:"connect"` } aux := _class{ @@ -161,7 +179,7 @@ func (t *class) MarshalYAML(marshal func(interface{}) error) (err error) { err = marshal(&aux) if err == nil { - *t = class{ + *t = TaskTemplate{ Identifier: aux.Identifier, Defaults: gera.MakeStringMapWithMap(aux.Defaults), Control: aux.Control, @@ -170,7 +188,7 @@ func (t *class) MarshalYAML(marshal func(interface{}) error) (err error) { Bind: aux.Bind, Properties: gera.MakeStringMapWithMap(aux.Properties), Constraints: aux.Constraints, - Connect: aux.Connect, + // Connect: aux.Connect, } } return From e604fabebf3d14f6dfbdbd8024e6a7b4b955e198 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 17 Jun 2020 19:48:59 +0530 Subject: [PATCH 0405/2352] [walnut] handle value under command --- walnut/converter/converter.go | 55 ++++++++++++++++++------------ walnut/converter/converter_test.go | 2 +- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 587303396..12d801fce 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -39,7 +39,17 @@ import ( ) // return pointer to float64 -func create(x float64) *float64 { +func createFloat(x float64) *float64 { + return &x +} + +// return pointer to bool +func createBool(x bool) *bool { + return &x +} + +// return pointer to string +func createString(x string) *string { return &x } @@ -54,25 +64,25 @@ type TaskTemplate struct { Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Arguments []string `yaml:"arguments"` } // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { +func ExtractTaskClasses(DPL Dump) (tasks []*task.Class, err error) { - var channelName string for index := range DPL.Workflows { + var channelName string if index+1 == len(DPL.Workflows) { channelName = DPL.Workflows[index].Name } else { - channelName = "from_"+DPL.Workflows[index].Name+"_to_"+DPL.Workflows[index+1].Name + channelName = "from_" + DPL.Workflows[index].Name + "_to_" + DPL.Workflows[index+1].Name } - workflowName := DPL.Workflows[index].Name + + taskName := DPL.Workflows[index].Name defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ Name: channelName, - Type: channel.ChannelType(""), + Type: channel.ChannelType("push"), // defaulting to push SndBufSize: 1000, RcvBufSize: 1000, RateLogging: 60, @@ -81,6 +91,7 @@ func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { Addressing: "ipc", } + // Not required for Task Templates /* defaultConnectChannel := channel.Outbound{ Channel: channel.Channel{ @@ -95,15 +106,9 @@ func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { } */ - var arguments []string - for _, arg := range DPL.Metadatas[index+1].CmdlLineArgs { - arg = fmt.Sprintf("%q", arg) - arguments = append(arguments, arg) - } - - task := TaskTemplate{ + task := task.Class{ Identifier: task.TaskClassIdentifier{ - Name: workflowName, + Name: taskName, }, Defaults: gera.MakeStringMapWithMap(map[string]string{ "user": "flp", @@ -111,9 +116,16 @@ func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, + Command: &common.CommandInfo{ + // Env: []string, -> Default to empty array + Shell: createBool(true), + Value: &DPL.Metadatas[index+1].Executable, + Arguments: DPL.Metadatas[index+1].CmdlLineArgs, + User: createString("flp"), + }, Wants: task.ResourceWants{ - Cpu: create(0.15), - Memory: create(128), + Cpu: createFloat(0.15), + Memory: createFloat(128), Ports: task.Ranges{}, //begin - end OR range }, Bind: []channel.Inbound{defaultBindChannel}, @@ -122,18 +134,19 @@ func ExtractTaskClasses(DPL Dump) (tasks []*TaskTemplate, err error) { "color": "false", }), // Connect: []channel.Outbound{defaultConnectChannel}, - Arguments: arguments, } - fmt.Printf("\nTASK:\n%v\n", task) + // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) } return tasks, nil } -func taskToYAML(extractedTasks []*TaskTemplate) (err error) { +// TaskToYAML takes as input an array of pointers to task.Class +// and writes them to a AliECS friendly YAML file +func TaskToYAML(extractedTasks []*task.Class) (err error) { + // Check if "tasks" directory exists. If not, create it _, err = os.Stat("tasks") - if os.IsNotExist(err) { errDir := os.MkdirAll("tasks", 0755) if errDir != nil { diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index a59b8af63..f057afed4 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -67,7 +67,7 @@ func TestTaskToYAML(t *testing.T) { t.Errorf("Extract Task Class failed: %w", err) } - err = taskToYAML(allTasks) + err = TaskToYAML(allTasks) if err != nil { t.Errorf("Filed to write YAML to file: %w", err) } From 71f788442fadee0aa77bd002a1229cfd54ea6a26 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 01:09:08 +0530 Subject: [PATCH 0406/2352] [walnut] improved marshaler handling --- core/task/class.go | 59 +++++++++++++++++++++++++++++++++- walnut/converter/converter.go | 60 +++-------------------------------- 2 files changed, 62 insertions(+), 57 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 18a878e5c..55a661fbf 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -97,6 +97,63 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } +func (c *Class) MarshalYAML() (interface{}, error) { + type _bind struct { + Name string `yaml:"name"` + Type channel.ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport channel.TransportType `yaml:"transport"` + Addressing channel.AddressFormat `yaml:"addressing"` + } + + type _class struct { + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` + } `yaml:"control"` + Wants ResourceWants `yaml:"wants"` + Bind []_bind `yaml:"bind"` + Properties map[string]string `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints,omitempty"` + Command *common.CommandInfo `yaml:"command"` + } + aux := _class{ + Name: c.Identifier.Name, + Defaults: c.Defaults.Raw(), + Properties: c.Properties.Raw(), + Wants: c.Wants, + Constraints: c.Constraints, + Command: c.Command, + } + + // Flatten bind struct to have channel elements and addressing together + for _, bind := range c.Bind { + auxBind := _bind{ + Name: bind.Name, + Type: bind.Type, + SndBufSize: bind.SndBufSize, + RcvBufSize: bind.RcvBufSize, + RateLogging: strconv.Itoa(bind.RateLogging), + Transport: bind.Transport, + Addressing: bind.Addressing, + } + aux.Bind = append(aux.Bind, auxBind) + } + + if c.Control.Mode == controlmode.FAIRMQ { + aux.Control.Mode = "fairmq" + } else if c.Control.Mode == controlmode.BASIC { + aux.Control.Mode = "basic" + } else { + aux.Control.Mode = "direct" + } + + return aux, nil +} + type TaskClassIdentifier struct { repoIdentifier string hash string @@ -115,7 +172,7 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error type ResourceWants struct { Cpu *float64 `yaml:"cpu"` Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Ports Ranges `yaml:"ports,omitempty"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 12d801fce..fb9560bb0 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -26,6 +26,7 @@ package converter import ( "fmt" + "gopkg.in/yaml.v3" "io/ioutil" "os" @@ -34,8 +35,6 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/task/constraint" - "gopkg.in/yaml.v3" ) // return pointer to float64 @@ -53,19 +52,6 @@ func createString(x string) *string { return &x } -type TaskTemplate struct { - Identifier task.TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` - Command *common.CommandInfo `yaml:"command"` - Wants task.ResourceWants `yaml:"wants"` - Bind []channel.Inbound `yaml:"bind"` - Properties gera.StringMap `yaml:"properties"` - Constraints []constraint.Constraint `yaml:"constraints"` -} - // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks func ExtractTaskClasses(DPL Dump) (tasks []*task.Class, err error) { @@ -155,54 +141,16 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } for _, SingleTask := range extractedTasks { - YAMLData, err := yaml.Marshal(&SingleTask) + YAMLData, err := yaml.Marshal(SingleTask) if err != nil { - return fmt.Errorf("Marshal failed: %w", err) + return fmt.Errorf("marshal failed: %w", err) } // Write marshaled YAML to file - err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0644) + err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0755) if err != nil { return fmt.Errorf("Creating file failed: %w", err) } - - } - return -} - -func (t *TaskTemplate) MarshalYAML(marshal func(interface{}) error) (err error) { - type _class struct { - Identifier task.TaskClassIdentifier - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` - Command *common.CommandInfo `yaml:"command"` - Wants task.ResourceWants `yaml:"wants"` - Bind []channel.Inbound `yaml:"bind"` - Properties map[string]string `yaml:"properties"` - Constraints []constraint.Constraint `yaml:"constraints"` - // Connect []channel.Outbound `yaml:"connect"` - } - - aux := _class{ - Defaults: make(map[string]string), - Properties: make(map[string]string), - } - err = marshal(&aux) - - if err == nil { - *t = TaskTemplate{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints: aux.Constraints, - // Connect: aux.Connect, - } } return } From 9ac6093ef036aa7972de6a776b251dbd9d570039 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 01:11:55 +0530 Subject: [PATCH 0407/2352] [walnut] reorder CommandInfo elements --- common/cmdinfo.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/common/cmdinfo.go b/common/cmdinfo.go index a86ed0d86..3768b9bdf 100644 --- a/common/cmdinfo.go +++ b/common/cmdinfo.go @@ -32,8 +32,8 @@ type CommandInfo struct { Env []string `json:"env,omitempty" yaml:"env,omitempty"` Shell *bool `json:"shell,omitempty" yaml:"shell,omitempty"` Value *string `json:"value,omitempty" yaml:"value,omitempty"` - Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` User *string `json:"user,omitempty" yaml:"user,omitempty"` + Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` } func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -41,8 +41,8 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro Env []string `json:"env,omitempty" yaml:"env,omitempty"` Shell *string `json:"shell,omitempty" yaml:"shell,omitempty"` Value *string `json:"value,omitempty" yaml:"value,omitempty"` - Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` User *string `json:"user,omitempty" yaml:"user,omitempty"` + Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` } aux := _commandInfo{} err = unmarshal(&aux) @@ -68,8 +68,8 @@ func (m *CommandInfo) Copy() *CommandInfo { Env: append([]string{}, m.Env...), Shell: new(bool), Value: new(string), - Arguments: append([]string{}, m.Arguments...), User: new(string), + Arguments: append([]string{}, m.Arguments...), } if m.Shell != nil { *cmd.Shell = *m.Shell From 0b16bf5187bc4f78f4662205b1a924499de20931 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 01:41:39 +0530 Subject: [PATCH 0408/2352] [walnut] removed log handling from workflow importer --- walnut/converter/dump.json | 14 +------------- walnut/converter/importer.go | 21 ++++++--------------- walnut/converter/importer_test.go | 1 - 3 files changed, 7 insertions(+), 29 deletions(-) diff --git a/walnut/converter/dump.json b/walnut/converter/dump.json index 92d70645d..ab427c922 100644 --- a/walnut/converter/dump.json +++ b/walnut/converter/dump.json @@ -1,15 +1,3 @@ -[INFO] Using config file 'json:///home/alidock/.sw/slc8_x86-64/QualityControl/master-1/etc/basic.json' -2020-06-04 16:59:04.933371 QC infologger initialized -2020-06-04 16:59:04.933395 QC version 0.26.1 -2020-06-04 16:59:04.933554 policyName : tst-raw -2020-06-04 16:59:04.933588 Configuration loaded : -2020-06-04 16:59:04.933595 >> Task name : QcTask -2020-06-04 16:59:04.933599 >> Module name : QcSkeleton -2020-06-04 16:59:04.933604 >> Detector name : TST -2020-06-04 16:59:04.933614 >> Cycle duration seconds : 10 -2020-06-04 16:59:04.933619 >> Max number cycles : -1 -2020-06-04 16:59:04.933736 >> Check name : QcCheck -2020-06-04 16:59:04.933843 >> Inputs (1): QC_QcTask-mo_0 checks (1): QcCheck stores (1): QC_QcTask-mo_0 { "workflow": [ { @@ -361,4 +349,4 @@ ] } ] -} +} \ No newline at end of file diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index c0a6c2db4..6da8400c2 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -25,9 +25,9 @@ package converter import ( - "bufio" "encoding/json" "fmt" + "io/ioutil" "os" ) @@ -70,23 +70,14 @@ type Dump struct { } func jsonImporter(input *os.File) (importedJSON Dump, err error) { - scanner := bufio.NewScanner(input) - var inputJSON string + var dump Dump - // TODO: Probably a better way to handle this - for scanner.Scan() { - line := scanner.Text() - if line[0] == '{' { - inputJSON += line + "\n" - for scanner.Scan() { - inputJSON += scanner.Text() + "\n" - } - break - } + byteValue, err := ioutil.ReadAll(input) + if err != nil { + return dump, fmt.Errorf("reading file failed: %w", err) } - var dump Dump - err = json.Unmarshal([]byte(inputJSON), &dump) + err = json.Unmarshal(byteValue, &dump) if err != nil { return dump, fmt.Errorf("JSON Unmarshal failed: %w", err) } diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index 53cc563aa..7ab008051 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -36,7 +36,6 @@ func TestImportUnmarshal(t *testing.T) { if err != nil { t.Errorf("Opening file failed: %w", err) } - defer file.Close() DplDump, err := jsonImporter(file) if err != nil { From 0ba6d7a6d1e210f3f4ade4a4bee677e23a69ec08 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 15:09:09 +0530 Subject: [PATCH 0409/2352] [walnut] revert changes to core\task --- core/task/channel/channel.go | 31 +++++---- core/task/channel/inbound.go | 6 +- core/task/channel/outbound.go | 47 ++++++------- core/task/class.go | 122 +++++++++------------------------- 4 files changed, 74 insertions(+), 132 deletions(-) diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index e3e7adef6..e4a1f2d7c 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -25,9 +25,9 @@ package channel import ( - "errors" "strconv" "strings" + "errors" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" @@ -35,23 +35,23 @@ import ( var log = logger.New(logrus.StandardLogger(), "channel") -type Channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging int `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` //default: default +type channel struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging int `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } -func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize string `yaml:"sndBufSize"` - RcvBufSize string `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` //default: default + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize string `yaml:"sndBufSize"` + RcvBufSize string `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` //default: default } aux := _channel{} err = unmarshal(&aux) @@ -95,7 +95,6 @@ func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // push/pull/pub/sub/spub/xsub/pair/req/rep/dealer/router // Do we need to support them all? type ChannelType string - const ( PUSH = ChannelType("push") PULL = ChannelType("pull") diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 1487320f5..839b348c1 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -33,7 +33,7 @@ import ( ) type Inbound struct { - Channel + channel Addressing AddressFormat `yaml:"addressing"` //default: tcp } @@ -46,7 +46,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } - ch := Channel{} + ch := channel{} err = unmarshal(&ch) if err != nil { return @@ -56,7 +56,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er } inbound.Addressing = aux.Addressing - inbound.Channel = ch + inbound.channel = ch return } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index ddf030fc4..2df94f45e 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -34,30 +34,31 @@ import ( ) type Outbound struct { - Channel - Target string `json:"target" yaml:"target"` + channel + Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { target := struct { - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` }{} err = unmarshal(&target) if err != nil { return } - ch := Channel{} + ch := channel{} err = unmarshal(&ch) if err != nil { return } outbound.Target = target.Target - outbound.Channel = ch + outbound.channel = ch return } + /* FairMQ outbound channel property map example: chans.data1.0.address = tcp://localhost:5555 [provided] @@ -113,43 +114,43 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap{ - "address": address, - "method": "connect", - "rateLogging": strconv.Itoa(outbound.RateLogging), - "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), + chanProps := controlcommands.PropertyMap { + "address": address, + "method": "connect", + "rateLogging": strconv.Itoa(outbound.RateLogging), + "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(outbound.SndBufSize), + "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": outbound.Type.String(), + "transport": transport.String(), + "type": outbound.Type.String(), } if (transport != outbound.Transport) && (outbound.Transport != DEFAULT) { log.WithFields(logrus.Fields{ - "address": address, - "oubound": outbound.Name, - "actualInboundTransport": transport, - "outboundTransport": outbound.Transport, - }). + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). Warn("channel transport mismatch, fix workflow template") } for k, v := range chanProps { - pm[prefix+"."+k] = v + pm[prefix + "." + k] = v } return } -func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { +func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { channels = make([]Outbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -159,6 +160,6 @@ func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { channels = append(channels, v) } } - + return -} +} \ No newline at end of file diff --git a/core/task/class.go b/core/task/class.go index 55a661fbf..825f0088f 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -26,50 +26,49 @@ package task import ( "fmt" - "strconv" - "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "strconv" ) // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier taskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier taskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -82,104 +81,47 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints: aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints:aux.Constraints, + Connect: aux.Connect, } } return } -func (c *Class) MarshalYAML() (interface{}, error) { - type _bind struct { - Name string `yaml:"name"` - Type channel.ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` - Transport channel.TransportType `yaml:"transport"` - Addressing channel.AddressFormat `yaml:"addressing"` - } - - type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` - Wants ResourceWants `yaml:"wants"` - Bind []_bind `yaml:"bind"` - Properties map[string]string `yaml:"properties"` - Constraints []constraint.Constraint `yaml:"constraints,omitempty"` - Command *common.CommandInfo `yaml:"command"` - } - aux := _class{ - Name: c.Identifier.Name, - Defaults: c.Defaults.Raw(), - Properties: c.Properties.Raw(), - Wants: c.Wants, - Constraints: c.Constraints, - Command: c.Command, - } - - // Flatten bind struct to have channel elements and addressing together - for _, bind := range c.Bind { - auxBind := _bind{ - Name: bind.Name, - Type: bind.Type, - SndBufSize: bind.SndBufSize, - RcvBufSize: bind.RcvBufSize, - RateLogging: strconv.Itoa(bind.RateLogging), - Transport: bind.Transport, - Addressing: bind.Addressing, - } - aux.Bind = append(aux.Bind, auxBind) - } - - if c.Control.Mode == controlmode.FAIRMQ { - aux.Control.Mode = "fairmq" - } else if c.Control.Mode == controlmode.BASIC { - aux.Control.Mode = "basic" - } else { - aux.Control.Mode = "direct" - } - - return aux, nil -} - -type TaskClassIdentifier struct { +type taskClassIdentifier struct { repoIdentifier string hash string Name string } -func (tcID TaskClassIdentifier) String() string { +func (tcID taskClassIdentifier) String() string { return fmt.Sprintf("%stasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) } -func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (tcID *taskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { err = unmarshal(&tcID.Name) return } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports,omitempty"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) From bf97a95dfff65381368467a4d44de70fb51f66fa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 15:12:51 +0530 Subject: [PATCH 0410/2352] [walnut] export Channel, TaskClassIdentifier --- core/task/channel/channel.go | 4 +-- core/task/channel/inbound.go | 6 ++-- core/task/channel/outbound.go | 6 ++-- core/task/class.go | 67 ++++++++++++++++++++++++++++++++--- 4 files changed, 70 insertions(+), 13 deletions(-) diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index e4a1f2d7c..db2fdac74 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -35,7 +35,7 @@ import ( var log = logger.New(logrus.StandardLogger(), "channel") -type channel struct { +type Channel struct { Name string `yaml:"name"` Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize"` @@ -44,7 +44,7 @@ type channel struct { Transport TransportType `yaml:"transport"` //default: default } -func (c *channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _channel struct { Name string `yaml:"name"` Type ChannelType `yaml:"type"` diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 839b348c1..1487320f5 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -33,7 +33,7 @@ import ( ) type Inbound struct { - channel + Channel Addressing AddressFormat `yaml:"addressing"` //default: tcp } @@ -46,7 +46,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } - ch := channel{} + ch := Channel{} err = unmarshal(&ch) if err != nil { return @@ -56,7 +56,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er } inbound.Addressing = aux.Addressing - inbound.channel = ch + inbound.Channel = ch return } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 2df94f45e..9dfb8d8de 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -34,7 +34,7 @@ import ( ) type Outbound struct { - channel + Channel Target string `json:"target" yaml:"target"` } @@ -47,14 +47,14 @@ func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err return } - ch := channel{} + ch := Channel{} err = unmarshal(&ch) if err != nil { return } outbound.Target = target.Target - outbound.channel = ch + outbound.Channel = ch return } diff --git a/core/task/class.go b/core/task/class.go index 825f0088f..b0ce1b134 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -38,7 +38,7 @@ import ( // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier taskClassIdentifier `yaml:"name"` + Identifier TaskClassIdentifier `yaml:"name"` Defaults gera.StringMap `yaml:"defaults"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` @@ -55,7 +55,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier taskClassIdentifier `yaml:"name"` + Identifier TaskClassIdentifier `yaml:"name"` Defaults map[string]string `yaml:"defaults"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` @@ -96,17 +96,74 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } -type taskClassIdentifier struct { +func (c *Class) MarshalYAML() (interface{}, error) { + type _bind struct { + Name string `yaml:"name"` + Type channel.ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport channel.TransportType `yaml:"transport"` + Addressing channel.AddressFormat `yaml:"addressing"` + } + + type _class struct { + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` + } `yaml:"control"` + Wants ResourceWants `yaml:"wants"` + Bind []_bind `yaml:"bind"` + Properties map[string]string `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints,omitempty"` + Command *common.CommandInfo `yaml:"command"` + } + aux := _class{ + Name: c.Identifier.Name, + Defaults: c.Defaults.Raw(), + Properties: c.Properties.Raw(), + Wants: c.Wants, + Constraints: c.Constraints, + Command: c.Command, + } + + // Flatten bind struct to have channel elements and addressing together + for _, bind := range c.Bind { + auxBind := _bind{ + Name: bind.Name, + Type: bind.Type, + SndBufSize: bind.SndBufSize, + RcvBufSize: bind.RcvBufSize, + RateLogging: strconv.Itoa(bind.RateLogging), + Transport: bind.Transport, + Addressing: bind.Addressing, + } + aux.Bind = append(aux.Bind, auxBind) + } + + if c.Control.Mode == controlmode.FAIRMQ { + aux.Control.Mode = "fairmq" + } else if c.Control.Mode == controlmode.BASIC { + aux.Control.Mode = "basic" + } else { + aux.Control.Mode = "direct" + } + + return aux, nil +} + +type TaskClassIdentifier struct { repoIdentifier string hash string Name string } -func (tcID taskClassIdentifier) String() string { +func (tcID TaskClassIdentifier) String() string { return fmt.Sprintf("%stasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) } -func (tcID *taskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { err = unmarshal(&tcID.Name) return } From f4ca784144300ff6e3cfd3496af6d5cb12c96b24 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 15:31:13 +0530 Subject: [PATCH 0411/2352] [walnut] change indentation to spaces --- core/task/class.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index b0ce1b134..61e75c7dc 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -108,11 +108,11 @@ func (c *Class) MarshalYAML() (interface{}, error) { } type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []_bind `yaml:"bind"` Properties map[string]string `yaml:"properties"` From 9a3d4561a711fdf7b88863e790b017007d43bfdf Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 15:51:17 +0530 Subject: [PATCH 0412/2352] [walnut] rename variables and fix nits --- walnut/converter/converter.go | 23 +++++++++++++---------- walnut/converter/dump.json | 2 +- walnut/converter/importer.go | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index fb9560bb0..1003d51dd 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -26,10 +26,11 @@ package converter import ( "fmt" - "gopkg.in/yaml.v3" "io/ioutil" "os" + "gopkg.in/yaml.v3" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" @@ -54,21 +55,23 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(DPL Dump) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { - for index := range DPL.Workflows { + for index := range dplDump.Workflows { var channelName string - if index+1 == len(DPL.Workflows) { - channelName = DPL.Workflows[index].Name + correspondingMetadata := index+1 // offset to match workflows with correct metadata + + if correspondingMetadata == len(dplDump.Workflows) { + channelName = dplDump.Workflows[index].Name } else { - channelName = "from_" + DPL.Workflows[index].Name + "_to_" + DPL.Workflows[index+1].Name + channelName = "from_" + dplDump.Workflows[index].Name + "_to_" + dplDump.Workflows[correspondingMetadata].Name } - taskName := DPL.Workflows[index].Name + taskName := dplDump.Workflows[index].Name defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ Name: channelName, - Type: channel.ChannelType("push"), // defaulting to push + Type: channel.ChannelType("push"), // defaulting to push for bind SndBufSize: 1000, RcvBufSize: 1000, RateLogging: 60, @@ -105,8 +108,8 @@ func ExtractTaskClasses(DPL Dump) (tasks []*task.Class, err error) { Command: &common.CommandInfo{ // Env: []string, -> Default to empty array Shell: createBool(true), - Value: &DPL.Metadatas[index+1].Executable, - Arguments: DPL.Metadatas[index+1].CmdlLineArgs, + Value: &dplDump.Metadata[correspondingMetadata].Executable, + Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, User: createString("flp"), }, Wants: task.ResourceWants{ diff --git a/walnut/converter/dump.json b/walnut/converter/dump.json index ab427c922..3ac15e0af 100644 --- a/walnut/converter/dump.json +++ b/walnut/converter/dump.json @@ -349,4 +349,4 @@ ] } ] -} \ No newline at end of file +} diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 6da8400c2..47f6ad7dd 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -66,7 +66,7 @@ type metadata struct { // Dump is a 1:1 struct representation of a DPL Dump type Dump struct { Workflows []workflow `json:"workflow"` - Metadatas []metadata `json:"metadata"` + Metadata []metadata `json:"metadata"` } func jsonImporter(input *os.File) (importedJSON Dump, err error) { From d916838e997fe8d4300bc9326ab6f7661aedc4d6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 15:51:51 +0530 Subject: [PATCH 0413/2352] [walnut] fix file perms --- walnut/converter/converter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 1003d51dd..ba8a84a17 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -150,7 +150,7 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } // Write marshaled YAML to file - err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0755) + err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0644) if err != nil { return fmt.Errorf("Creating file failed: %w", err) } From 094fdb7d55efaac7e8d159927f951728ac6c3d94 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 16:08:49 +0530 Subject: [PATCH 0414/2352] [walnut] include connect defaults when importing task.Class --- core/task/class.go | 29 +++++++++++++++++++++++++++-- walnut/converter/converter.go | 31 +++++++++++++++---------------- 2 files changed, 42 insertions(+), 18 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 61e75c7dc..7dff43ae7 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -26,12 +26,13 @@ package task import ( "fmt" + "strconv" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" - "strconv" ) // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but @@ -105,6 +106,16 @@ func (c *Class) MarshalYAML() (interface{}, error) { RateLogging string `yaml:"rateLogging"` Transport channel.TransportType `yaml:"transport"` Addressing channel.AddressFormat `yaml:"addressing"` + } + + type _connect struct { + Name string `yaml:"name"` + Type channel.ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport channel.TransportType `yaml:"transport"` + Target string `yaml:"target,omitempty"` } type _class struct { @@ -115,6 +126,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []_bind `yaml:"bind"` + Connect []_connect `yaml:"connect"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` @@ -128,7 +140,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { Command: c.Command, } - // Flatten bind struct to have channel elements and addressing together + // Flatten connect struct to have channel elements and addressing together for _, bind := range c.Bind { auxBind := _bind{ Name: bind.Name, @@ -142,6 +154,19 @@ func (c *Class) MarshalYAML() (interface{}, error) { aux.Bind = append(aux.Bind, auxBind) } + for _, connect := range c.Connect { + auxConnect := _connect{ + Name: connect.Name, + Type: connect.Type, + SndBufSize: connect.SndBufSize, + RcvBufSize: connect.RcvBufSize, + RateLogging: strconv.Itoa(connect.RateLogging), + Transport: connect.Transport, + Target: connect.Target, + } + aux.Connect = append(aux.Connect, auxConnect) + } + if c.Control.Mode == controlmode.FAIRMQ { aux.Control.Mode = "fairmq" } else if c.Control.Mode == controlmode.BASIC { diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index ba8a84a17..56d8a1211 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -59,6 +59,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { var channelName string + taskName := dplDump.Workflows[index].Name correspondingMetadata := index+1 // offset to match workflows with correct metadata if correspondingMetadata == len(dplDump.Workflows) { @@ -67,7 +68,6 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { channelName = "from_" + dplDump.Workflows[index].Name + "_to_" + dplDump.Workflows[correspondingMetadata].Name } - taskName := dplDump.Workflows[index].Name defaultBindChannel := channel.Inbound{ Channel: channel.Channel{ Name: channelName, @@ -81,19 +81,18 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { } // Not required for Task Templates - /* - defaultConnectChannel := channel.Outbound{ - Channel: channel.Channel{ - Name: workflowName, - Type: channel.ChannelType(""), - SndBufSize: 1000, - RcvBufSize: 1000, - RateLogging: 60, - Transport: channel.TransportType("shmem"), - }, - // Target: "", No default value - } - */ + defaultConnectChannel := channel.Outbound{ + Channel: channel.Channel{ + Name: channelName, + Type: channel.ChannelType("pull"), + SndBufSize: 1000, + RcvBufSize: 1000, + RateLogging: 60, + Transport: channel.TransportType("shmem"), + }, + Target: "", // cannot be set in TT + } + task := task.Class{ Identifier: task.TaskClassIdentifier{ @@ -106,7 +105,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, Command: &common.CommandInfo{ - // Env: []string, -> Default to empty array + Env: []string{}, // -> Default to empty array Shell: createBool(true), Value: &dplDump.Metadata[correspondingMetadata].Executable, Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, @@ -122,7 +121,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { "severity": "trace", "color": "false", }), - // Connect: []channel.Outbound{defaultConnectChannel}, + Connect: []channel.Outbound{defaultConnectChannel}, } // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) From 3ba0173572c4a5e8701c320723aca7f17387371e Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 16:11:38 +0530 Subject: [PATCH 0415/2352] [walnut] rename items in workflow/metadata arrays --- walnut/converter/converter.go | 2 +- walnut/converter/importer.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 56d8a1211..368ea299f 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,7 +60,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { var channelName string taskName := dplDump.Workflows[index].Name - correspondingMetadata := index+1 // offset to match workflows with correct metadata + correspondingMetadata := index+1 // offset to match workflowEntry with correct metadataEntry if correspondingMetadata == len(dplDump.Workflows) { channelName = dplDump.Workflows[index].Name diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 47f6ad7dd..6a87bbdc2 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -45,7 +45,7 @@ type options struct { DefaultValue string `json:"defaultValue"` Help string `json:"help"` } -type workflow struct { +type workflowEntry struct { Name string `json:"name"` Inputs []io `json:"inputs"` Ouputs []io `json:"outputs"` @@ -56,7 +56,7 @@ type workflow struct { MaxInputTimeslices int `json:"maxInputTimeslices"` } -type metadata struct { +type metadataEntry struct { Name string `json:"name"` Executable string `json:"executable"` CmdlLineArgs []string `json:"cmdLineArgs"` @@ -65,8 +65,8 @@ type metadata struct { // Dump is a 1:1 struct representation of a DPL Dump type Dump struct { - Workflows []workflow `json:"workflow"` - Metadata []metadata `json:"metadata"` + Workflows []workflowEntry `json:"workflowEntry"` + Metadata []metadataEntry `json:"metadataEntry"` } func jsonImporter(input *os.File) (importedJSON Dump, err error) { From 40a4bd5b9d3883f5748c651b98bf0f8531297db6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 19:23:37 +0530 Subject: [PATCH 0416/2352] [walnut] improved readability and formatting --- walnut/converter/converter.go | 8 ++++---- walnut/converter/converter_test.go | 4 ++-- walnut/converter/importer.go | 17 +++++++---------- walnut/converter/importer_test.go | 4 ++-- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 368ea299f..866c085da 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,12 +60,13 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { var channelName string taskName := dplDump.Workflows[index].Name - correspondingMetadata := index+1 // offset to match workflowEntry with correct metadataEntry + correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry if correspondingMetadata == len(dplDump.Workflows) { channelName = dplDump.Workflows[index].Name } else { - channelName = "from_" + dplDump.Workflows[index].Name + "_to_" + dplDump.Workflows[correspondingMetadata].Name + channelName = "from_" + dplDump.Workflows[index].Name + "_to_" + + dplDump.Workflows[correspondingMetadata].Name } defaultBindChannel := channel.Inbound{ @@ -92,7 +93,6 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { }, Target: "", // cannot be set in TT } - task := task.Class{ Identifier: task.TaskClassIdentifier{ @@ -121,7 +121,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { "severity": "trace", "color": "false", }), - Connect: []channel.Outbound{defaultConnectChannel}, + Connect: []channel.Outbound{defaultConnectChannel}, } // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index f057afed4..034df1df0 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -37,7 +37,7 @@ func TestExtractClass(t *testing.T) { } defer file.Close() - DplDump, err := jsonImporter(file) + DplDump, err := JSONImporter(file) if err != nil { t.Errorf("Import failed: %w", err) } @@ -57,7 +57,7 @@ func TestTaskToYAML(t *testing.T) { } defer file.Close() - DplDump, err := jsonImporter(file) + DplDump, err := JSONImporter(file) if err != nil { t.Errorf("Import failed: %w", err) } diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 6a87bbdc2..723e96d32 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -65,23 +65,20 @@ type metadataEntry struct { // Dump is a 1:1 struct representation of a DPL Dump type Dump struct { - Workflows []workflowEntry `json:"workflowEntry"` - Metadata []metadataEntry `json:"metadataEntry"` + Workflows []workflowEntry `json:"workflow"` + Metadata []metadataEntry `json:"metadata"` } -func jsonImporter(input *os.File) (importedJSON Dump, err error) { - var dump Dump - +func JSONImporter(input *os.File) (importedJSON Dump, err error) { byteValue, err := ioutil.ReadAll(input) if err != nil { - return dump, fmt.Errorf("reading file failed: %w", err) + return importedJSON, fmt.Errorf("reading file failed: %w", err) } - err = json.Unmarshal(byteValue, &dump) + err = json.Unmarshal(byteValue, &importedJSON) if err != nil { - return dump, fmt.Errorf("JSON Unmarshal failed: %w", err) + return importedJSON, fmt.Errorf("JSON Unmarshal failed: %w", err) } - return dump, nil - + return importedJSON, nil } diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index 7ab008051..13552a2d0 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -37,11 +37,11 @@ func TestImportUnmarshal(t *testing.T) { t.Errorf("Opening file failed: %w", err) } - DplDump, err := jsonImporter(file) + dplDump, err := JSONImporter(file) if err != nil { t.Errorf("Import failed: %w", err) } else { - fmt.Printf("Imported JSON: \n%v", DplDump) + fmt.Printf("Imported JSON: \n%v", dplDump) } }) } From 0b9e3587bdfee4c51615413df3e75350b7638892 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 19:25:17 +0530 Subject: [PATCH 0417/2352] [walnut] remove default channel values --- core/task/class.go | 12 ++++++------ walnut/converter/converter.go | 6 ------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 7dff43ae7..445d60daa 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -101,9 +101,9 @@ func (c *Class) MarshalYAML() (interface{}, error) { type _bind struct { Name string `yaml:"name"` Type channel.ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` Transport channel.TransportType `yaml:"transport"` Addressing channel.AddressFormat `yaml:"addressing"` } @@ -111,9 +111,9 @@ func (c *Class) MarshalYAML() (interface{}, error) { type _connect struct { Name string `yaml:"name"` Type channel.ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` Transport channel.TransportType `yaml:"transport"` Target string `yaml:"target,omitempty"` } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 866c085da..6b3dabc51 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -73,9 +73,6 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { Channel: channel.Channel{ Name: channelName, Type: channel.ChannelType("push"), // defaulting to push for bind - SndBufSize: 1000, - RcvBufSize: 1000, - RateLogging: 60, Transport: channel.TransportType("shmem"), }, Addressing: "ipc", @@ -86,9 +83,6 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { Channel: channel.Channel{ Name: channelName, Type: channel.ChannelType("pull"), - SndBufSize: 1000, - RcvBufSize: 1000, - RateLogging: 60, Transport: channel.TransportType("shmem"), }, Target: "", // cannot be set in TT From ded98799ca80e4d116f6a63cb78962785129b441 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 22 Jun 2020 21:21:22 +0530 Subject: [PATCH 0418/2352] [walnut] load DPL dumps into workflow.Role --- core/workflow/loadDPL.go | 74 ++++++++++++++++++++++++++++++ walnut/converter/converter_test.go | 30 ++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 core/workflow/loadDPL.go diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go new file mode 100644 index 000000000..1e7ee9069 --- /dev/null +++ b/core/workflow/loadDPL.go @@ -0,0 +1,74 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "sync" + + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/core/task" +) + +func LoadDPL(tasks []*task.Class) (workflow Role, err error) { + root := new(aggregatorRole) + + for _, taskItem := range tasks { + SingleTaskRole := taskRole{ + roleBase: roleBase{ + Name: taskItem.Identifier.Name, + parent: root, + Connect: taskItem.Connect, + Constraints: taskItem.Constraints, + status: SafeStatus{ + mu: sync.RWMutex{}, + status: 0, + }, + state: SafeState{ + mu: sync.RWMutex{}, + state: 0, + }, + /* + Defaults: &gera.StringWrapMap{ + theMap: taskItem.Defaults.Raw(), + parent: nil, + }, + */ + Defaults: &gera.StringWrapMap{}, + Vars: &gera.StringWrapMap{}, + UserVars: &gera.StringWrapMap{}, + Locals: nil, + Bind: taskItem.Bind, + }, + Task: &task.Task{ + GetTaskClass: nil, + }, + LoadTaskClass: "", + } + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + } + + workflow = root + return workflow, nil +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 034df1df0..c5963167e 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -25,6 +25,8 @@ package converter import ( + "github.com/AliceO2Group/Control/core/workflow" + "github.com/k0kubun/pp" "os" "testing" ) @@ -73,3 +75,31 @@ func TestTaskToYAML(t *testing.T) { } }) } + +func TestTaskToRole(t *testing.T) { + t.Run("Testing Task -> workflow.Role", func(t *testing.T) { + file, err := os.Open("dump.json") + if err != nil { + t.Errorf("Opening file failed: %w", err) + } + defer file.Close() + + DplDump, err := JSONImporter(file) + if err != nil { + t.Errorf("Import failed: %w", err) + } + + allTasks, err := ExtractTaskClasses(DplDump) + if err != nil { + t.Errorf("Extract Task Class failed: %w", err) + } + + role, err := workflow.LoadDPL(allTasks) + if err != nil { + t.Errorf("error loading task to role: %w", err) + } + + pp.Print(role) + + }) +} From ef745c46a3041ee4d77efec5c9693f85bf6fb2bc Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 23 Jun 2020 13:02:17 +0530 Subject: [PATCH 0419/2352] [walnut] load default StringMap in taskRole --- core/workflow/loadDPL.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 1e7ee9069..00d37f0c7 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -49,13 +49,7 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { mu: sync.RWMutex{}, state: 0, }, - /* - Defaults: &gera.StringWrapMap{ - theMap: taskItem.Defaults.Raw(), - parent: nil, - }, - */ - Defaults: &gera.StringWrapMap{}, + Defaults: gera.MakeStringMapWithMap(taskItem.Defaults.Raw()), Vars: &gera.StringWrapMap{}, UserVars: &gera.StringWrapMap{}, Locals: nil, From ba66d19a982e251529477e763a638a6c318b9f8a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 23 Jun 2020 21:29:07 +0530 Subject: [PATCH 0420/2352] [walnut] conversion of task.Class to task.Task --- core/task/classToTask.go | 61 ++++++++++++++++++++++++++++++ core/workflow/loadDPL.go | 5 +-- walnut/converter/converter_test.go | 1 - 3 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 core/task/classToTask.go diff --git a/core/task/classToTask.go b/core/task/classToTask.go new file mode 100644 index 000000000..78bd7a77c --- /dev/null +++ b/core/task/classToTask.go @@ -0,0 +1,61 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import "github.com/AliceO2Group/Control/common" + +func ClassToTask(input *Class, parent parentRole) *Task { + output := Task{ + parent: parent, + className: "", + name: "", + hostname: "", + agentId: "", + offerId: "", + taskId: "", + executorId: "", + localBindMap: nil, + status: 0, + state: 0, + safeToStop: false, + properties: nil, + GetTaskClass: func() *Class { + return input + }, + commandInfo: &common.TaskCommandInfo{ + CommandInfo: common.CommandInfo{ + Env: nil, + Shell: nil, + Value: nil, + User: nil, + Arguments: nil, + }, + ControlPort: 0, + ControlMode: 0, + }, + } + + return &output +} diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 00d37f0c7..49c58b2fb 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -55,11 +55,8 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { Locals: nil, Bind: taskItem.Bind, }, - Task: &task.Task{ - GetTaskClass: nil, - }, - LoadTaskClass: "", } + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index c5963167e..66098d08a 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -100,6 +100,5 @@ func TestTaskToRole(t *testing.T) { } pp.Print(role) - }) } From c9a24d1349c9d80774491caefce299eb80cc6fd8 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 23 Jun 2020 19:20:19 +0530 Subject: [PATCH 0421/2352] [walnut] update dump.json and handlers --- walnut/converter/converter.go | 56 ++++++++++++++++-------------- walnut/converter/converter_test.go | 2 +- walnut/converter/dump.json | 50 ++++++++++++++++++++++---- walnut/converter/importer.go | 3 +- 4 files changed, 77 insertions(+), 34 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 6b3dabc51..dc360dfbb 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -28,6 +28,7 @@ import ( "fmt" "io/ioutil" "os" + "strings" "gopkg.in/yaml.v3" @@ -58,35 +59,35 @@ func createString(x string) *string { func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { - var channelName string taskName := dplDump.Workflows[index].Name correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry - - if correspondingMetadata == len(dplDump.Workflows) { - channelName = dplDump.Workflows[index].Name - } else { - channelName = "from_" + dplDump.Workflows[index].Name + "_to_" + - dplDump.Workflows[correspondingMetadata].Name - } - - defaultBindChannel := channel.Inbound{ - Channel: channel.Channel{ - Name: channelName, - Type: channel.ChannelType("push"), // defaulting to push for bind - Transport: channel.TransportType("shmem"), - }, - Addressing: "ipc", + channelNames := dplDump.Metadata[correspondingMetadata].Channels + var bind []channel.Inbound + var connect []channel.Outbound + + for _, channelName := range channelNames { + // To avoid duplication, only "push" channels are included + if strings.Contains(channelName, "from_"+taskName) { + singleBind := channel.Inbound{ + Channel: channel.Channel{ + Name: channelName, + Type: channel.ChannelType("push"), + Transport: channel.TransportType("shmem"), + }, + Addressing: "ipc", + } + bind = append(bind, singleBind) + } } // Not required for Task Templates defaultConnectChannel := channel.Outbound{ Channel: channel.Channel{ - Name: channelName, - Type: channel.ChannelType("pull"), - Transport: channel.TransportType("shmem"), + Type: channel.ChannelType("pull"), + Transport: channel.TransportType("shmem"), }, - Target: "", // cannot be set in TT } + connect = append(connect, defaultConnectChannel) task := task.Class{ Identifier: task.TaskClassIdentifier{ @@ -110,12 +111,12 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { Memory: createFloat(128), Ports: task.Ranges{}, //begin - end OR range }, - Bind: []channel.Inbound{defaultBindChannel}, + Bind: bind, Properties: gera.MakeStringMapWithMap(map[string]string{ "severity": "trace", "color": "false", }), - Connect: []channel.Outbound{defaultConnectChannel}, + Connect: connect, } // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) @@ -132,20 +133,23 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { if os.IsNotExist(err) { errDir := os.MkdirAll("tasks", 0755) if errDir != nil { - return fmt.Errorf("create dir failed: %w", err) + return fmt.Errorf("create dir failed: %v", err) } } for _, SingleTask := range extractedTasks { YAMLData, err := yaml.Marshal(SingleTask) if err != nil { - return fmt.Errorf("marshal failed: %w", err) + return fmt.Errorf("marshal failed: %v", err) } + fileName := "tasks/"+SingleTask.Identifier.Name+".yaml" + f, err := os.Create(fileName) + defer f.Close() // Write marshaled YAML to file - err = ioutil.WriteFile("tasks/"+SingleTask.Identifier.Name+".yaml", YAMLData, 0644) + err = ioutil.WriteFile(fileName, YAMLData, 0644) if err != nil { - return fmt.Errorf("Creating file failed: %w", err) + return fmt.Errorf("creating file failed: %v", err) } } return diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 66098d08a..6e0e5ce81 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -71,7 +71,7 @@ func TestTaskToYAML(t *testing.T) { err = TaskToYAML(allTasks) if err != nil { - t.Errorf("Filed to write YAML to file: %w", err) + t.Errorf("Filed to write YAML to file: %v", err) } }) } diff --git a/walnut/converter/dump.json b/walnut/converter/dump.json index 3ac15e0af..591b5c1ca 100644 --- a/walnut/converter/dump.json +++ b/walnut/converter/dump.json @@ -149,7 +149,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -176,6 +178,11 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_internal-dpl-clock_to_producer-0", + "from_internal-dpl-clock_to_Dispatcher", + "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask" ] }, { @@ -183,7 +190,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -210,6 +219,10 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_internal-dpl-clock_to_producer-0", + "from_producer-0_to_Dispatcher" ] }, { @@ -217,7 +230,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -244,6 +259,11 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_internal-dpl-clock_to_Dispatcher", + "from_producer-0_to_Dispatcher", + "from_Dispatcher_to_QC-TASK-RUNNER-QcTask" ] }, { @@ -251,7 +271,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -278,6 +300,11 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask", + "from_Dispatcher_to_QC-TASK-RUNNER-QcTask", + "from_QC-TASK-RUNNER-QcTask_to_QC-CHECK-RUNNER-QcCheck" ] }, { @@ -285,7 +312,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -312,6 +341,10 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_QC-TASK-RUNNER-QcTask_to_QC-CHECK-RUNNER-QcCheck", + "from_QC-CHECK-RUNNER-QcCheck_to_printer" ] }, { @@ -319,7 +352,9 @@ "executable": "o2-qc-run-basic", "cmdLineArgs": [ "-b", - "--dump-workflow" + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" ], "workflowOptions": [ { @@ -346,6 +381,9 @@ "defaultValue": "", "help": "override default pipeline size" } + ], + "channels": [ + "from_QC-CHECK-RUNNER-QcCheck_to_printer" ] } ] diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 723e96d32..c1e156aa2 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -48,7 +48,7 @@ type options struct { type workflowEntry struct { Name string `json:"name"` Inputs []io `json:"inputs"` - Ouputs []io `json:"outputs"` + Outputs []io `json:"outputs"` Options []options `json:"options"` Rank int `json:"rank"` NSlots int `json:"nSlots"` @@ -61,6 +61,7 @@ type metadataEntry struct { Executable string `json:"executable"` CmdlLineArgs []string `json:"cmdLineArgs"` WorkflowOptions []options `json:"workflowOptions"` + Channels []string `json:"channels"` } // Dump is a 1:1 struct representation of a DPL Dump From c4d926e4627744bca4af38750005731446132a37 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 24 Jun 2020 22:25:49 +0530 Subject: [PATCH 0422/2352] [walnut] improvements to testing --- walnut/converter/converter.go | 5 +- walnut/converter/converter_test.go | 55 ++----- walnut/converter/importer.go | 11 +- walnut/converter/importer_test.go | 17 +- walnut/converter/testvalues.go | 239 +++++++++++++++++++++++++++++ 5 files changed, 262 insertions(+), 65 deletions(-) create mode 100644 walnut/converter/testvalues.go diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index dc360dfbb..1f5dcd560 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -131,7 +131,8 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { // Check if "tasks" directory exists. If not, create it _, err = os.Stat("tasks") if os.IsNotExist(err) { - errDir := os.MkdirAll("tasks", 0755) + // FIXME: use absolute paths + errDir := os.Mkdir("tasks", 0755) if errDir != nil { return fmt.Errorf("create dir failed: %v", err) } @@ -142,7 +143,7 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { if err != nil { return fmt.Errorf("marshal failed: %v", err) } - fileName := "tasks/"+SingleTask.Identifier.Name+".yaml" + fileName := "tasks/" + SingleTask.Identifier.Name + ".yaml" f, err := os.Create(fileName) defer f.Close() diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 6e0e5ce81..ddf30db80 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -25,80 +25,47 @@ package converter import ( + "testing" + "github.com/AliceO2Group/Control/core/workflow" "github.com/k0kubun/pp" - "os" - "testing" ) func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - file, err := os.Open("dump.json") - if err != nil { - t.Errorf("Opening file failed: %w", err) - } - defer file.Close() - - DplDump, err := JSONImporter(file) + extractedClasses, err := ExtractTaskClasses(TestDump) + pp.Print(extractedClasses) if err != nil { - t.Errorf("Import failed: %w", err) - } - - _, err = ExtractTaskClasses(DplDump) - if err != nil { - t.Errorf("Extract Task Class failed: %w", err) + t.Errorf("extract Task Class failed: %v", err) } }) } func TestTaskToYAML(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - file, err := os.Open("dump.json") - if err != nil { - t.Errorf("Opening file failed: %w", err) - } - defer file.Close() - - DplDump, err := JSONImporter(file) - if err != nil { - t.Errorf("Import failed: %w", err) - } - - allTasks, err := ExtractTaskClasses(DplDump) + allTasks, err := ExtractTaskClasses(TestDump) if err != nil { - t.Errorf("Extract Task Class failed: %w", err) + t.Errorf("extract Task Class failed: %v", err) } err = TaskToYAML(allTasks) if err != nil { - t.Errorf("Filed to write YAML to file: %v", err) + t.Errorf("failed to write YAML to file: %v", err) } }) } func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - file, err := os.Open("dump.json") + allTasks, err := ExtractTaskClasses(TestDump) if err != nil { - t.Errorf("Opening file failed: %w", err) - } - defer file.Close() - - DplDump, err := JSONImporter(file) - if err != nil { - t.Errorf("Import failed: %w", err) - } - - allTasks, err := ExtractTaskClasses(DplDump) - if err != nil { - t.Errorf("Extract Task Class failed: %w", err) + t.Errorf("extract Task Class failed: %v", err) } role, err := workflow.LoadDPL(allTasks) if err != nil { - t.Errorf("error loading task to role: %w", err) + t.Errorf("error loading task to role: %v", err) } - pp.Print(role) }) } diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index c1e156aa2..64dde89fe 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -27,8 +27,6 @@ package converter import ( "encoding/json" "fmt" - "io/ioutil" - "os" ) type io struct { @@ -70,13 +68,8 @@ type Dump struct { Metadata []metadataEntry `json:"metadata"` } -func JSONImporter(input *os.File) (importedJSON Dump, err error) { - byteValue, err := ioutil.ReadAll(input) - if err != nil { - return importedJSON, fmt.Errorf("reading file failed: %w", err) - } - - err = json.Unmarshal(byteValue, &importedJSON) +func JSONImporter(input []byte) (importedJSON Dump, err error) { + err = json.Unmarshal(input, &importedJSON) if err != nil { return importedJSON, fmt.Errorf("JSON Unmarshal failed: %w", err) } diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index 13552a2d0..b6f7f8437 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -25,23 +25,20 @@ package converter import ( - "fmt" - "os" + "reflect" "testing" ) func TestImportUnmarshal(t *testing.T) { t.Run("Testing dump reading", func(t *testing.T) { - file, err := os.Open("dump.json") + got, err := JSONImporter([]byte(TestJSON)) + want := TestDump if err != nil { - t.Errorf("Opening file failed: %w", err) - } - - dplDump, err := JSONImporter(file) - if err != nil { - t.Errorf("Import failed: %w", err) + t.Errorf("Import failed: %v", err) } else { - fmt.Printf("Imported JSON: \n%v", dplDump) + if !reflect.DeepEqual(got, want) { + t.Error("Unmarshalled value does not match") + } } }) } diff --git a/walnut/converter/testvalues.go b/walnut/converter/testvalues.go new file mode 100644 index 000000000..3c91d1d36 --- /dev/null +++ b/walnut/converter/testvalues.go @@ -0,0 +1,239 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package converter + +var TestDump = Dump{ + Workflows: []workflowEntry{ + { + Name: "producer-0", + Inputs: []io{}, + Outputs: []io{ + io{ + Binding: "out", + Origin: "TST", + Description: "RAWDATA", + Subspec: 0, + Lifetime: 0, + }, + }, + Options: []options{}, + Rank: 0, + NSlots: 1, + InputTimeSliceID: 0, + MaxInputTimeslices: 1, + }, + }, + Metadata: []metadataEntry{ + { + Name: "internal-dpl-clock", + Executable: "o2-qc-run-basic", + CmdlLineArgs: []string{ + "-b", + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json", + }, + WorkflowOptions: []options{ + { + Name: "config-path", + Type: "4", + DefaultValue: "", + Help: "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling.", + }, + { + Name: "no-data-sampling", + Type: "5", + DefaultValue: "0", + Help: "Skips data sampling, connects directly the task to the producer.", + }, + { + Name: "readers", + Type: "1", + DefaultValue: "1", + Help: "number of parallel readers to use", + }, + { + Name: "pipeline", + Type: "4", + DefaultValue: "", + Help: "override default pipeline size", + }, + }, + Channels: []string{ + "from_internal-dpl-clock_to_producer-0", + "from_internal-dpl-clock_to_Dispatcher", + "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask", + }, + }, + { + Name: "producer-0", + Executable: "o2-qc-run-basic", + CmdlLineArgs: []string{ + "-b", + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json", + }, + WorkflowOptions: []options{ + options{ + Name: "config-path", + Type: "4", + DefaultValue: "", + Help: "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling.", + }, + options{ + Name: "no-data-sampling", + Type: "5", + DefaultValue: "0", + Help: "Skips data sampling, connects directly the task to the producer.", + }, + options{ + Name: "readers", + Type: "1", + DefaultValue: "1", + Help: "number of parallel readers to use", + }, + options{ + Name: "pipeline", + Type: "4", + DefaultValue: "", + Help: "override default pipeline size", + }, + }, + Channels: []string{ + "from_internal-dpl-clock_to_producer-0", + "from_producer-0_to_Dispatcher", + }, + }, + }, +} + +var TestJSON = ` +{ + "workflow": [ + { + "name": "producer-0", + "inputs": [], + "outputs": [ + { + "binding": "out", + "origin": "TST", + "description": "RAWDATA", + "subspec": 0, + "lifetime": 0 + } + ], + "options": [], + "rank": 0, + "nSlots": 1, + "inputTimeSliceId": 0, + "maxInputTimeslices": 1 + } + ], + "metadata": [ + { + "name": "internal-dpl-clock", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ], + "channels": [ + "from_internal-dpl-clock_to_producer-0", + "from_internal-dpl-clock_to_Dispatcher", + "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask" + ] + }, + { + "name": "producer-0", + "executable": "o2-qc-run-basic", + "cmdLineArgs": [ + "-b", + "--dump-workflow", + "--dump-workflow-file", + "dpl-dump.json" + ], + "workflowOptions": [ + { + "name": "config-path", + "type": "4", + "defaultValue": "", + "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." + }, + { + "name": "no-data-sampling", + "type": "5", + "defaultValue": "0", + "help": "Skips data sampling, connects directly the task to the producer." + }, + { + "name": "readers", + "type": "1", + "defaultValue": "1", + "help": "number of parallel readers to use" + }, + { + "name": "pipeline", + "type": "4", + "defaultValue": "", + "help": "override default pipeline size" + } + ], + "channels": [ + "from_internal-dpl-clock_to_producer-0", + "from_producer-0_to_Dispatcher" + ] + } + ] +} +` From d35ff596baba94a5fddde742c923e26ca3cdbc24 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 26 Jun 2020 21:36:09 +0530 Subject: [PATCH 0423/2352] [walnut] initialize roleBase elements to nil --- core/task/classToTask.go | 14 +------------- core/workflow/loadDPL.go | 29 +++++++++++------------------ 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/core/task/classToTask.go b/core/task/classToTask.go index 78bd7a77c..8de9464c3 100644 --- a/core/task/classToTask.go +++ b/core/task/classToTask.go @@ -24,8 +24,6 @@ package task -import "github.com/AliceO2Group/Control/common" - func ClassToTask(input *Class, parent parentRole) *Task { output := Task{ parent: parent, @@ -44,17 +42,7 @@ func ClassToTask(input *Class, parent parentRole) *Task { GetTaskClass: func() *Class { return input }, - commandInfo: &common.TaskCommandInfo{ - CommandInfo: common.CommandInfo{ - Env: nil, - Shell: nil, - Value: nil, - User: nil, - Arguments: nil, - }, - ControlPort: 0, - ControlMode: 0, - }, + commandInfo: nil, } return &output diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 49c58b2fb..46c6db8db 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -25,8 +25,6 @@ package workflow import ( - "sync" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" ) @@ -38,25 +36,20 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { SingleTaskRole := taskRole{ roleBase: roleBase{ Name: taskItem.Identifier.Name, - parent: root, - Connect: taskItem.Connect, - Constraints: taskItem.Constraints, - status: SafeStatus{ - mu: sync.RWMutex{}, - status: 0, - }, - state: SafeState{ - mu: sync.RWMutex{}, - state: 0, - }, - Defaults: gera.MakeStringMapWithMap(taskItem.Defaults.Raw()), - Vars: &gera.StringWrapMap{}, - UserVars: &gera.StringWrapMap{}, - Locals: nil, - Bind: taskItem.Bind, + Connect: nil, + Constraints: nil, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + Bind: nil, }, } + + SingleTaskRole.Connect = taskItem.Connect + SingleTaskRole.Constraints = taskItem.Constraints + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) + SingleTaskRole.Bind = taskItem.Bind SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } From 9d31e8e6e114d73a98b34c87808cab3cc25975c1 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 30 Jun 2020 00:08:16 +0530 Subject: [PATCH 0424/2352] [walnut] deep copy slices --- core/workflow/loadDPL.go | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 46c6db8db..c8ac79bbd 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -36,18 +36,31 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { SingleTaskRole := taskRole{ roleBase: roleBase{ Name: taskItem.Identifier.Name, + parent: root, Connect: nil, Constraints: nil, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), + Defaults: &gera.StringWrapMap{}, + Vars: &gera.StringWrapMap{}, + UserVars: &gera.StringWrapMap{}, + Locals: nil, Bind: nil, }, } - SingleTaskRole.Connect = taskItem.Connect - SingleTaskRole.Constraints = taskItem.Constraints + for _, eachConnect := range taskItem.Connect { + SingleTaskRole.Connect = append(SingleTaskRole.Connect, eachConnect) + } + + for _, eachConstraint := range taskItem.Constraints { + SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, eachConstraint) + } + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) - SingleTaskRole.Bind = taskItem.Bind + + for _, eachBind := range taskItem.Bind { + SingleTaskRole.Bind = append(SingleTaskRole.Bind, eachBind) + } + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) From 8930011ec3963c90235d070b21a9c8f4d59d1d78 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 30 Jun 2020 21:19:05 +0530 Subject: [PATCH 0425/2352] [walnut] defaults init to gera.MakeStringMap --- core/workflow/loadDPL.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index c8ac79bbd..d6564768d 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -39,9 +39,9 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { parent: root, Connect: nil, Constraints: nil, - Defaults: &gera.StringWrapMap{}, - Vars: &gera.StringWrapMap{}, - UserVars: &gera.StringWrapMap{}, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), Locals: nil, Bind: nil, }, @@ -62,7 +62,6 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { } SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } From 2ae0a54842bcd4a51f3bfc8ff4ccc56f3dd250b4 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 10:42:20 +0530 Subject: [PATCH 0426/2352] [walnut] idiomatic deep copy slices --- core/workflow/loadDPL.go | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index d6564768d..3272ee110 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -47,21 +47,12 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { }, } - for _, eachConnect := range taskItem.Connect { - SingleTaskRole.Connect = append(SingleTaskRole.Connect, eachConnect) - } - - for _, eachConstraint := range taskItem.Constraints { - SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, eachConstraint) - } - - SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) - - for _, eachBind := range taskItem.Bind { - SingleTaskRole.Bind = append(SingleTaskRole.Bind, eachBind) - } + SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) + SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) + SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } From af7f50d9fc8a83b2cb623d7131037bbc71f1fcf0 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 26 Jun 2020 20:38:02 +0530 Subject: [PATCH 0427/2352] [walnut] convert Role to YAML --- core/workflow/aggregatorrole.go | 38 ++++++++++++++++++++++++++++++ core/workflow/loadDPL.go | 26 ++++++++++++++++++++ core/workflow/rolebase.go | 22 +++++++++++++++++ go.mod | 2 +- walnut/converter/converter.go | 22 +++++++++++++++++ walnut/converter/converter_test.go | 19 +++++++++++++++ 6 files changed, 128 insertions(+), 1 deletion(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0a2678b8a..0e173d4eb 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,6 +29,10 @@ import ( "strings" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -65,6 +69,40 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e return } +func (r *aggregatorRole) MarshalYAML() (interface{}, error) { + type auxRoleBase struct { + Name string `yaml:"name"` + Connect []channel.Outbound `yaml:"connect,omitempty"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` + Vars *gera.StringWrapMap `yaml:"vars,omitempty"` + Bind []channel.Inbound `yaml:"bind,omitempty"` + } + + type auxAggregator struct { + Roles []Role `yaml:"roles,omitempty"` + } + + type auxAggregatorRole struct { + auxRoleBase + auxAggregator + } + + output := auxAggregatorRole{ + auxRoleBase: auxRoleBase{ + Name: r.Name, + Connect: r.Connect, + Constraints: r.Constraints, + Defaults: gera.MakeStringMapWithMap(r.Defaults.Raw()), + Vars: &gera.StringWrapMap{}, + Bind: r.Bind, + }, + auxAggregator: auxAggregator(r.aggregator), + } + + return output, nil +} + func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) if g.Match(r.GetPath()) { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 3272ee110..222471a02 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -25,6 +25,8 @@ package workflow import ( + "gopkg.in/yaml.v3" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" ) @@ -59,3 +61,27 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { workflow = root return workflow, nil } + +func RoleToYAML(input Role) (YAMLData []byte, err error) { + type _aggregatorRole struct { + RoleBase roleBase + Aggregator aggregator + } + + var auxRoles []Role + for _, eachRole := range input.GetRoles() { + auxRoles = append(auxRoles, eachRole) + } + + auxRoleBase := roleBase{} + auxAggregator := _aggregatorRole{ + RoleBase: auxRoleBase, + Aggregator: aggregator{ + Roles: auxRoles, + }, + } + + YAMLData, err = yaml.Marshal(auxAggregator) + + return +} diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index d2e60ac62..b510a5b5c 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -188,6 +188,28 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) return } +func (r *roleBase) MarshalYAML() (interface{}, error) { + type auxRoleBase struct { + Name string `yaml:"name"` + Connect []channel.Outbound `yaml:"connect,omitempty"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` + Vars *gera.StringWrapMap `yaml:"vars,omitempty"` + Bind []channel.Inbound `yaml:"bind,omitempty"` + } + + aux := auxRoleBase{ + Name: r.Name, + Connect: r.Connect, + Constraints: r.Constraints, + Defaults: gera.MakeStringMapWithMap(r.Defaults.Raw()), + Vars: &gera.StringWrapMap{}, + Bind: r.Bind, + } + + return aux, nil +} + func (r *roleBase) wrapConnectFields() template.Fields { connectFields := make(template.Fields, len(r.Connect)) for i, _ := range r.Connect { diff --git a/go.mod b/go.mod index 302f60d19..148795ad4 100644 --- a/go.mod +++ b/go.mod @@ -106,7 +106,7 @@ require ( google.golang.org/grpc v1.30.0 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect - gopkg.in/yaml.v2 v2.3.0 + gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 1f5dcd560..9a6f7007d 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -26,6 +26,7 @@ package converter import ( "fmt" + "github.com/AliceO2Group/Control/core/workflow" "io/ioutil" "os" "strings" @@ -155,3 +156,24 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } return } + +func RoleToYAML(input workflow.Role) (err error) { + yamlDATA, err := workflow.RoleToYAML(input) + if err != nil { + return fmt.Errorf("error converting role to YAML: %v", err) + } + + var fileName string + if input.GetName() == "" { + fileName = "no-name.yaml" + } else { + fileName = input.GetName() + } + + err = ioutil.WriteFile(fileName, yamlDATA, 0644) + if err != nil { + return fmt.Errorf("error writing role to file: %v", err) + } + + return +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index ddf30db80..0c9105788 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -69,3 +69,22 @@ func TestTaskToRole(t *testing.T) { pp.Print(role) }) } + +func TestRoleToYAML(t *testing.T) { + t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { + allTasks, err := ExtractTaskClasses(TestDump) + if err != nil { + t.Errorf("extract Task Class failed: %v", err) + } + + role, err := workflow.LoadDPL(allTasks) + if err != nil { + t.Errorf("error loading task to role: %v", err) + } + + err = RoleToYAML(role) + if err != nil { + t.Errorf("error converting Role to YAML: %v", err) + } + }) +} From 877addf7ad5ed56262f6e814c324613e543c238b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 27 Jun 2020 15:54:18 +0530 Subject: [PATCH 0428/2352] [walnut] handle channel marshalling at struct definition --- core/task/channel/inbound.go | 25 ++++++++++++++ core/task/channel/outbound.go | 24 ++++++++++++++ core/task/class.go | 61 +++++------------------------------ 3 files changed, 57 insertions(+), 53 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 1487320f5..81af34d78 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -60,6 +60,31 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } +func (inbound Inbound) MarshalYAML() (interface{}, error) { + // Flatten Inbound to have Addressing and Channel elements on the same "level" + type _inbound struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` + Transport TransportType `yaml:"transport"` + Addressing AddressFormat `yaml:"target"` + } + + auxInbound := _inbound{ + Name: inbound.Channel.Name, + Type: inbound.Channel.Type, + SndBufSize: inbound.Channel.SndBufSize, + RcvBufSize: inbound.Channel.RcvBufSize, + RateLogging: strconv.Itoa(inbound.Channel.RateLogging), + Transport: inbound.Channel.Transport, + Addressing: inbound.Addressing, + } + + return auxInbound, nil +} + /* FairMQ inbound channel property map example: chans.data1.0.address = tcp://*:5555 [provided] diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 9dfb8d8de..dced55c50 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -58,6 +58,30 @@ func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err return } +func (outbound Outbound) MarshalYAML() (interface{}, error) { + // Flatten Outbound to have Target and Channel elements on the same "level" + type _outbound struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` + Transport TransportType `yaml:"transport"` + Target string `yaml:"target"` + } + + auxOutbound := _outbound{ + Name: outbound.Channel.Name, + Type: outbound.Channel.Type, + SndBufSize: outbound.Channel.SndBufSize, + RcvBufSize: outbound.Channel.RcvBufSize, + RateLogging: strconv.Itoa(outbound.Channel.RateLogging), + Transport: outbound.Channel.Transport, + Target: outbound.Target, + } + + return auxOutbound, nil +} /* FairMQ outbound channel property map example: diff --git a/core/task/class.go b/core/task/class.go index 445d60daa..26570b3ce 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -98,35 +98,15 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } func (c *Class) MarshalYAML() (interface{}, error) { - type _bind struct { - Name string `yaml:"name"` - Type channel.ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize,omitempty"` - RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging string `yaml:"rateLogging,omitempty"` - Transport channel.TransportType `yaml:"transport"` - Addressing channel.AddressFormat `yaml:"addressing"` - } - - type _connect struct { - Name string `yaml:"name"` - Type channel.ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize,omitempty"` - RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging string `yaml:"rateLogging,omitempty"` - Transport channel.TransportType `yaml:"transport"` - Target string `yaml:"target,omitempty"` - } - type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode string `yaml:"mode"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` } `yaml:"control"` Wants ResourceWants `yaml:"wants"` - Bind []_bind `yaml:"bind"` - Connect []_connect `yaml:"connect"` + Bind []channel.Inbound `yaml:"bind"` + Connect []channel.Outbound `yaml:"connect"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` @@ -136,37 +116,12 @@ func (c *Class) MarshalYAML() (interface{}, error) { Defaults: c.Defaults.Raw(), Properties: c.Properties.Raw(), Wants: c.Wants, + Bind: c.Bind, + Connect: c.Connect, Constraints: c.Constraints, Command: c.Command, } - // Flatten connect struct to have channel elements and addressing together - for _, bind := range c.Bind { - auxBind := _bind{ - Name: bind.Name, - Type: bind.Type, - SndBufSize: bind.SndBufSize, - RcvBufSize: bind.RcvBufSize, - RateLogging: strconv.Itoa(bind.RateLogging), - Transport: bind.Transport, - Addressing: bind.Addressing, - } - aux.Bind = append(aux.Bind, auxBind) - } - - for _, connect := range c.Connect { - auxConnect := _connect{ - Name: connect.Name, - Type: connect.Type, - SndBufSize: connect.SndBufSize, - RcvBufSize: connect.RcvBufSize, - RateLogging: strconv.Itoa(connect.RateLogging), - Transport: connect.Transport, - Target: connect.Target, - } - aux.Connect = append(aux.Connect, auxConnect) - } - if c.Control.Mode == controlmode.FAIRMQ { aux.Control.Mode = "fairmq" } else if c.Control.Mode == controlmode.BASIC { From 6f89ab16d72dd9b996fb1ef776e90bf32c765c54 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sat, 27 Jun 2020 16:19:43 +0530 Subject: [PATCH 0429/2352] [walnut] improved marshalling of workflow.Role --- core/workflow/aggregatorrole.go | 38 ------------- core/workflow/loadDPL.go | 96 +++++++++++++++++++++++++++------ core/workflow/rolebase.go | 22 -------- walnut/converter/converter.go | 16 ++++-- 4 files changed, 94 insertions(+), 78 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0e173d4eb..0a2678b8a 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,10 +29,6 @@ import ( "strings" texttemplate "text/template" - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/task/constraint" - "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -69,40 +65,6 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e return } -func (r *aggregatorRole) MarshalYAML() (interface{}, error) { - type auxRoleBase struct { - Name string `yaml:"name"` - Connect []channel.Outbound `yaml:"connect,omitempty"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` - Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` - Vars *gera.StringWrapMap `yaml:"vars,omitempty"` - Bind []channel.Inbound `yaml:"bind,omitempty"` - } - - type auxAggregator struct { - Roles []Role `yaml:"roles,omitempty"` - } - - type auxAggregatorRole struct { - auxRoleBase - auxAggregator - } - - output := auxAggregatorRole{ - auxRoleBase: auxRoleBase{ - Name: r.Name, - Connect: r.Connect, - Constraints: r.Constraints, - Defaults: gera.MakeStringMapWithMap(r.Defaults.Raw()), - Vars: &gera.StringWrapMap{}, - Bind: r.Bind, - }, - auxAggregator: auxAggregator(r.aggregator), - } - - return output, nil -} - func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) if g.Match(r.GetPath()) { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 222471a02..16cfcf9c4 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -25,6 +25,8 @@ package workflow import ( + "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/constraint" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/common/gera" @@ -32,6 +34,7 @@ import ( ) func LoadDPL(tasks []*task.Class) (workflow Role, err error) { + // FIXME: base roleBase of root defaults to all empty values root := new(aggregatorRole) for _, taskItem := range tasks { @@ -59,29 +62,92 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { } workflow = root + + // FIXME: either get rid of err or add handling of errors return workflow, nil } -func RoleToYAML(input Role) (YAMLData []byte, err error) { - type _aggregatorRole struct { - RoleBase roleBase - Aggregator aggregator +// Aux struct to fulfil export requirement by yaml.Marshal +type auxAggregatorRole struct { + RoleBase roleBase + Aggregator aggregator +} + +func RoleToYAML(input Role) ([]byte, error) { + auxRole := auxAggregatorRole{ + RoleBase: roleBase{}, + Aggregator: aggregator{ + Roles: input.GetRoles(), + }, } - var auxRoles []Role - for _, eachRole := range input.GetRoles() { - auxRoles = append(auxRoles, eachRole) + yamlDATA, err := yaml.Marshal(auxRole) + return yamlDATA, err +} + +// Cannot invoke MarshalYAML on aggregatorRole (unexported members) +// auxAggregatorRole flattens roleBase and aggregator to have them +// marshalled at the same depth +func (a auxAggregatorRole) MarshalYAML() (interface{}, error) { + type _task struct { + Load string `yaml:"load"` } - auxRoleBase := roleBase{} - auxAggregator := _aggregatorRole{ - RoleBase: auxRoleBase, - Aggregator: aggregator{ - Roles: auxRoles, - }, + type _class struct { + Name string `yaml:"name"` + Connect []channel.Outbound + Bind []channel.Inbound + Task _task `yaml:"task"` } - YAMLData, err = yaml.Marshal(auxAggregator) + type _role struct { + SubRole _class `yaml:"roles"` + } - return + type flatAggregatorRole struct { + Name string `yaml:"name"` + Connect []channel.Outbound `yaml:"connect"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Defaults gera.StringMap `yaml:"defaults"` + Vars gera.StringMap `yaml:"vars"` + Bind []channel.Inbound `yaml:"bind,omitempty"` + Aggregator []_role `yaml:"roles"` + } + + aux := flatAggregatorRole{ + Name: a.RoleBase.Name, + Connect: nil, + Constraints: nil, + Defaults: nil, + Vars: nil, + Bind: nil, + Aggregator: nil, + } + + var auxAggregator []_role + + for _, eachTask := range a.Aggregator.GetTasks(){ + taskClass := *eachTask.GetTaskClass() + auxRole := _role{ + SubRole: _class{ + Name: taskClass.Identifier.Name, + Connect: taskClass.Connect, + Bind: taskClass.Bind, + Task: _task{ + Load: taskClass.Identifier.Name, + }, + }, + } + auxAggregator = append(auxAggregator, auxRole) + } + + aux.Connect = a.RoleBase.Connect + aux.Constraints = a.RoleBase.Constraints + aux.Defaults = a.RoleBase.Defaults + aux.Vars = a.RoleBase.Vars + aux.Bind = a.RoleBase.Bind + aux.Aggregator = auxAggregator + + return aux, nil } + diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index b510a5b5c..d2e60ac62 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -188,28 +188,6 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) return } -func (r *roleBase) MarshalYAML() (interface{}, error) { - type auxRoleBase struct { - Name string `yaml:"name"` - Connect []channel.Outbound `yaml:"connect,omitempty"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` - Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` - Vars *gera.StringWrapMap `yaml:"vars,omitempty"` - Bind []channel.Inbound `yaml:"bind,omitempty"` - } - - aux := auxRoleBase{ - Name: r.Name, - Connect: r.Connect, - Constraints: r.Constraints, - Defaults: gera.MakeStringMapWithMap(r.Defaults.Raw()), - Vars: &gera.StringWrapMap{}, - Bind: r.Bind, - } - - return aux, nil -} - func (r *roleBase) wrapConnectFields() template.Fields { connectFields := make(template.Fields, len(r.Connect)) for i, _ := range r.Connect { diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 9a6f7007d..7219f3a65 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -158,16 +158,26 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } func RoleToYAML(input workflow.Role) (err error) { + // Check if "tasks" directory exists. If not, create it + _, err = os.Stat("workflows") + if os.IsNotExist(err) { + // FIXME: use absolute paths + errDir := os.Mkdir("workflows", 0755) + if errDir != nil { + return fmt.Errorf("create dir failed: %v", err) + } + } + yamlDATA, err := workflow.RoleToYAML(input) if err != nil { return fmt.Errorf("error converting role to YAML: %v", err) } - var fileName string + var fileName = "workflows/" if input.GetName() == "" { - fileName = "no-name.yaml" + fileName += "no-name.yaml" } else { - fileName = input.GetName() + fileName += input.GetName() } err = ioutil.WriteFile(fileName, yamlDATA, 0644) From 5c388ec2590e60488b633606f4bf284cffccc675 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 30 Jun 2020 14:16:10 +0530 Subject: [PATCH 0430/2352] [walnut] change Marshaller receivers to pointers --- core/task/channel/inbound.go | 9 +++++++-- core/task/channel/outbound.go | 9 +++++++-- core/task/class.go | 14 ++++++++++---- core/workflow/loadDPL.go | 33 +++++++++++++++++++++++---------- walnut/converter/converter.go | 4 ++-- 5 files changed, 49 insertions(+), 20 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 81af34d78..3b89ba1dc 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -60,7 +60,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } -func (inbound Inbound) MarshalYAML() (interface{}, error) { +func (inbound *Inbound) MarshalYAML() (interface{}, error) { // Flatten Inbound to have Addressing and Channel elements on the same "level" type _inbound struct { Name string `yaml:"name"` @@ -77,11 +77,16 @@ func (inbound Inbound) MarshalYAML() (interface{}, error) { Type: inbound.Channel.Type, SndBufSize: inbound.Channel.SndBufSize, RcvBufSize: inbound.Channel.RcvBufSize, - RateLogging: strconv.Itoa(inbound.Channel.RateLogging), Transport: inbound.Channel.Transport, Addressing: inbound.Addressing, } + if inbound.Channel.RateLogging == 0 { + auxInbound.RateLogging = "" + } else { + auxInbound.RateLogging = strconv.Itoa(inbound.Channel.RateLogging) + } + return auxInbound, nil } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index dced55c50..d22ec0795 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -58,7 +58,7 @@ func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err return } -func (outbound Outbound) MarshalYAML() (interface{}, error) { +func (outbound *Outbound) MarshalYAML() (interface{}, error) { // Flatten Outbound to have Target and Channel elements on the same "level" type _outbound struct { Name string `yaml:"name"` @@ -75,11 +75,16 @@ func (outbound Outbound) MarshalYAML() (interface{}, error) { Type: outbound.Channel.Type, SndBufSize: outbound.Channel.SndBufSize, RcvBufSize: outbound.Channel.RcvBufSize, - RateLogging: strconv.Itoa(outbound.Channel.RateLogging), Transport: outbound.Channel.Transport, Target: outbound.Target, } + if outbound.Channel.RateLogging == 0 { + auxOutbound.RateLogging = "" + } else { + auxOutbound.RateLogging = strconv.Itoa(outbound.Channel.RateLogging) + } + return auxOutbound, nil } diff --git a/core/task/class.go b/core/task/class.go index 26570b3ce..ef48a632a 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -105,8 +105,8 @@ func (c *Class) MarshalYAML() (interface{}, error) { Mode string `yaml:"mode"` } `yaml:"control"` Wants ResourceWants `yaml:"wants"` - Bind []channel.Inbound `yaml:"bind"` - Connect []channel.Outbound `yaml:"connect"` + Bind []*channel.Inbound `yaml:"bind"` + Connect []*channel.Outbound `yaml:"connect"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` @@ -116,12 +116,18 @@ func (c *Class) MarshalYAML() (interface{}, error) { Defaults: c.Defaults.Raw(), Properties: c.Properties.Raw(), Wants: c.Wants, - Bind: c.Bind, - Connect: c.Connect, Constraints: c.Constraints, Command: c.Command, } + for _, eachBind := range c.Bind { + aux.Bind = append(aux.Bind, &eachBind) + } + + for _, eachConnect := range c.Connect { + aux.Connect = append(aux.Connect, &eachConnect) + } + if c.Control.Mode == controlmode.FAIRMQ { aux.Control.Mode = "fairmq" } else if c.Control.Mode == controlmode.BASIC { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 16cfcf9c4..8b1e2fc2b 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -81,22 +81,22 @@ func RoleToYAML(input Role) ([]byte, error) { }, } - yamlDATA, err := yaml.Marshal(auxRole) + yamlDATA, err := yaml.Marshal(&auxRole) return yamlDATA, err } // Cannot invoke MarshalYAML on aggregatorRole (unexported members) // auxAggregatorRole flattens roleBase and aggregator to have them // marshalled at the same depth -func (a auxAggregatorRole) MarshalYAML() (interface{}, error) { +func (a *auxAggregatorRole) MarshalYAML() (interface{}, error) { type _task struct { Load string `yaml:"load"` } type _class struct { Name string `yaml:"name"` - Connect []channel.Outbound - Bind []channel.Inbound + Connect []*channel.Outbound + Bind []*channel.Inbound Task _task `yaml:"task"` } @@ -106,11 +106,11 @@ func (a auxAggregatorRole) MarshalYAML() (interface{}, error) { type flatAggregatorRole struct { Name string `yaml:"name"` - Connect []channel.Outbound `yaml:"connect"` + Connect []*channel.Outbound `yaml:"connect"` Constraints constraint.Constraints `yaml:"constraints,omitempty"` Defaults gera.StringMap `yaml:"defaults"` Vars gera.StringMap `yaml:"vars"` - Bind []channel.Inbound `yaml:"bind,omitempty"` + Bind []*channel.Inbound `yaml:"bind,omitempty"` Aggregator []_role `yaml:"roles"` } @@ -131,23 +131,36 @@ func (a auxAggregatorRole) MarshalYAML() (interface{}, error) { auxRole := _role{ SubRole: _class{ Name: taskClass.Identifier.Name, - Connect: taskClass.Connect, - Bind: taskClass.Bind, Task: _task{ Load: taskClass.Identifier.Name, }, }, } + + for _, eachConnect := range taskClass.Connect { + auxRole.SubRole.Connect = append(auxRole.SubRole.Connect, &eachConnect) + } + + for _, eachBind := range taskClass.Bind { + auxRole.SubRole.Bind = append(auxRole.SubRole.Bind, &eachBind) + } + auxAggregator = append(auxAggregator, auxRole) } - aux.Connect = a.RoleBase.Connect aux.Constraints = a.RoleBase.Constraints aux.Defaults = a.RoleBase.Defaults aux.Vars = a.RoleBase.Vars - aux.Bind = a.RoleBase.Bind aux.Aggregator = auxAggregator + for _, eachConnect := range a.RoleBase.Connect { + aux.Connect = append(aux.Connect, &eachConnect) + } + + for _, eachBind := range a.RoleBase.Bind { + aux.Bind = append(aux.Bind, &eachBind) + } + return aux, nil } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 7219f3a65..6b4cbec68 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -140,19 +140,19 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } for _, SingleTask := range extractedTasks { - YAMLData, err := yaml.Marshal(SingleTask) + YAMLData, err := yaml.Marshal(&SingleTask) if err != nil { return fmt.Errorf("marshal failed: %v", err) } fileName := "tasks/" + SingleTask.Identifier.Name + ".yaml" f, err := os.Create(fileName) - defer f.Close() // Write marshaled YAML to file err = ioutil.WriteFile(fileName, YAMLData, 0644) if err != nil { return fmt.Errorf("creating file failed: %v", err) } + f.Close() } return } From a79fdac08fbe3d0613207e2ec6057b59247555aa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 30 Jun 2020 22:00:48 +0530 Subject: [PATCH 0431/2352] [walnut] better mimic final WFT --- core/workflow/loadDPL.go | 64 +++++++++++-------------- walnut/converter/converter_test.go | 5 +- walnut/converter/workflows/no-name.yaml | 47 ++++++++++++++++++ 3 files changed, 78 insertions(+), 38 deletions(-) create mode 100644 walnut/converter/workflows/no-name.yaml diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 8b1e2fc2b..4d6466e1a 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -90,37 +90,39 @@ func RoleToYAML(input Role) ([]byte, error) { // marshalled at the same depth func (a *auxAggregatorRole) MarshalYAML() (interface{}, error) { type _task struct { - Load string `yaml:"load"` + Load string `yaml:"load"` } - type _class struct { - Name string `yaml:"name"` + type _role struct { + Name string `yaml:"name"` Connect []*channel.Outbound - Bind []*channel.Inbound - Task _task `yaml:"task"` + Task _task `yaml:"task"` } - type _role struct { - SubRole _class `yaml:"roles"` + type flatAggregatorRole struct { + Name string `yaml:"name"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Defaults gera.StringMap `yaml:"defaults"` + Vars gera.StringMap `yaml:"vars"` + Aggregator []_role `yaml:"roles"` } - type flatAggregatorRole struct { - Name string `yaml:"name"` - Connect []*channel.Outbound `yaml:"connect"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` - Defaults gera.StringMap `yaml:"defaults"` - Vars gera.StringMap `yaml:"vars"` - Bind []*channel.Inbound `yaml:"bind,omitempty"` - Aggregator []_role `yaml:"roles"` + type rootWorkflow struct { + Name string `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Roles []flatAggregatorRole `yaml:"roles"` + } + + root := rootWorkflow{ + Name: a.RoleBase.Name, + Defaults: nil, } aux := flatAggregatorRole{ Name: a.RoleBase.Name, - Connect: nil, Constraints: nil, - Defaults: nil, - Vars: nil, - Bind: nil, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), Aggregator: nil, } @@ -129,20 +131,14 @@ func (a *auxAggregatorRole) MarshalYAML() (interface{}, error) { for _, eachTask := range a.Aggregator.GetTasks(){ taskClass := *eachTask.GetTaskClass() auxRole := _role{ - SubRole: _class{ - Name: taskClass.Identifier.Name, - Task: _task{ - Load: taskClass.Identifier.Name, - }, + Name: taskClass.Identifier.Name, + Task: _task{ + Load: taskClass.Identifier.Name, }, } for _, eachConnect := range taskClass.Connect { - auxRole.SubRole.Connect = append(auxRole.SubRole.Connect, &eachConnect) - } - - for _, eachBind := range taskClass.Bind { - auxRole.SubRole.Bind = append(auxRole.SubRole.Bind, &eachBind) + auxRole.Connect = append(auxRole.Connect, &eachConnect) } auxAggregator = append(auxAggregator, auxRole) @@ -153,14 +149,8 @@ func (a *auxAggregatorRole) MarshalYAML() (interface{}, error) { aux.Vars = a.RoleBase.Vars aux.Aggregator = auxAggregator - for _, eachConnect := range a.RoleBase.Connect { - aux.Connect = append(aux.Connect, &eachConnect) - } - - for _, eachBind := range a.RoleBase.Bind { - aux.Bind = append(aux.Bind, &eachBind) - } + root.Roles = append(root.Roles, aux) - return aux, nil + return root, nil } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 0c9105788..6ff9195d2 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -25,6 +25,7 @@ package converter import ( + "io/ioutil" "testing" "github.com/AliceO2Group/Control/core/workflow" @@ -72,7 +73,9 @@ func TestTaskToRole(t *testing.T) { func TestRoleToYAML(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump) + dumpFile, err := ioutil.ReadFile("dump.json") + dump, err := JSONImporter(dumpFile) + allTasks, err := ExtractTaskClasses(dump) if err != nil { t.Errorf("extract Task Class failed: %v", err) } diff --git a/walnut/converter/workflows/no-name.yaml b/walnut/converter/workflows/no-name.yaml new file mode 100644 index 000000000..b17f906f7 --- /dev/null +++ b/walnut/converter/workflows/no-name.yaml @@ -0,0 +1,47 @@ +name: "" +defaults: null +roles: + - name: "" + defaults: null + vars: null + roles: + - name: producer-0 + connect: + - name: "" + type: pull + transport: shmem + target: "" + task: + load: producer-0 + - name: Dispatcher + connect: + - name: "" + type: pull + transport: shmem + target: "" + task: + load: Dispatcher + - name: QC-TASK-RUNNER-QcTask + connect: + - name: "" + type: pull + transport: shmem + target: "" + task: + load: QC-TASK-RUNNER-QcTask + - name: QC-CHECK-RUNNER-QcCheck + connect: + - name: "" + type: pull + transport: shmem + target: "" + task: + load: QC-CHECK-RUNNER-QcCheck + - name: printer + connect: + - name: "" + type: pull + transport: shmem + target: "" + task: + load: printer From b107dcc35b79d946520357e26f3a4a5540c3e586 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 00:21:43 +0530 Subject: [PATCH 0432/2352] [walnut] fix incorrect YAML tag --- core/task/channel/inbound.go | 2 +- core/task/class.go | 4 +-- walnut/converter/workflows/no-name.yaml | 47 ------------------------- 3 files changed, 3 insertions(+), 50 deletions(-) delete mode 100644 walnut/converter/workflows/no-name.yaml diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 3b89ba1dc..9aa832784 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -69,7 +69,7 @@ func (inbound *Inbound) MarshalYAML() (interface{}, error) { RcvBufSize int `yaml:"rcvBufSize,omitempty"` RateLogging string `yaml:"rateLogging,omitempty"` Transport TransportType `yaml:"transport"` - Addressing AddressFormat `yaml:"target"` + Addressing AddressFormat `yaml:"addressing"` } auxInbound := _inbound{ diff --git a/core/task/class.go b/core/task/class.go index ef48a632a..3d6d0ef66 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -105,8 +105,8 @@ func (c *Class) MarshalYAML() (interface{}, error) { Mode string `yaml:"mode"` } `yaml:"control"` Wants ResourceWants `yaml:"wants"` - Bind []*channel.Inbound `yaml:"bind"` - Connect []*channel.Outbound `yaml:"connect"` + Bind []*channel.Inbound `yaml:"bind"` + Connect []*channel.Outbound `yaml:"connect"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` diff --git a/walnut/converter/workflows/no-name.yaml b/walnut/converter/workflows/no-name.yaml deleted file mode 100644 index b17f906f7..000000000 --- a/walnut/converter/workflows/no-name.yaml +++ /dev/null @@ -1,47 +0,0 @@ -name: "" -defaults: null -roles: - - name: "" - defaults: null - vars: null - roles: - - name: producer-0 - connect: - - name: "" - type: pull - transport: shmem - target: "" - task: - load: producer-0 - - name: Dispatcher - connect: - - name: "" - type: pull - transport: shmem - target: "" - task: - load: Dispatcher - - name: QC-TASK-RUNNER-QcTask - connect: - - name: "" - type: pull - transport: shmem - target: "" - task: - load: QC-TASK-RUNNER-QcTask - - name: QC-CHECK-RUNNER-QcCheck - connect: - - name: "" - type: pull - transport: shmem - target: "" - task: - load: QC-CHECK-RUNNER-QcCheck - - name: printer - connect: - - name: "" - type: pull - transport: shmem - target: "" - task: - load: printer From a6e6799fc67fd8783e5bcb061e4297ce3f6e4efa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 00:22:33 +0530 Subject: [PATCH 0433/2352] [walnut] handle Connect target during Dump to Class --- walnut/converter/converter.go | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 6b4cbec68..c6acfbf4b 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -26,11 +26,12 @@ package converter import ( "fmt" - "github.com/AliceO2Group/Control/core/workflow" "io/ioutil" "os" "strings" + "github.com/AliceO2Group/Control/core/workflow" + "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/common" @@ -79,16 +80,22 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { } bind = append(bind, singleBind) } - } - // Not required for Task Templates - defaultConnectChannel := channel.Outbound{ - Channel: channel.Channel{ - Type: channel.ChannelType("pull"), - Transport: channel.TransportType("shmem"), - }, + if strings.Contains(channelName, "to_" + taskName) { + // String manipulation to generate channel target of the form: + // {{ Parent().Path }}.taskName:from_{initiator}_to_{receiver} + initiator := channelName[5:strings.Index(channelName, "_to")] + singleConnect := channel.Outbound{ + Channel: channel.Channel{ + Name: channelName, + Type: channel.ChannelType("pull"), + Transport: channel.TransportType("shmem"), + }, + Target: "{{ Parent().Path }}." + initiator + ":" + channelName, + } + connect = append(connect, singleConnect) + } } - connect = append(connect, defaultConnectChannel) task := task.Class{ Identifier: task.TaskClassIdentifier{ From da060000c687b452b588937c893774952a37b506 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 00:31:43 +0530 Subject: [PATCH 0434/2352] [walnut] remove Connect from final TT YAML --- core/task/class.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 3d6d0ef66..aff5b42ed 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -106,7 +106,6 @@ func (c *Class) MarshalYAML() (interface{}, error) { } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []*channel.Inbound `yaml:"bind"` - Connect []*channel.Outbound `yaml:"connect"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` @@ -124,10 +123,6 @@ func (c *Class) MarshalYAML() (interface{}, error) { aux.Bind = append(aux.Bind, &eachBind) } - for _, eachConnect := range c.Connect { - aux.Connect = append(aux.Connect, &eachConnect) - } - if c.Control.Mode == controlmode.FAIRMQ { aux.Control.Mode = "fairmq" } else if c.Control.Mode == controlmode.BASIC { From 5b3dbcf463db37302b060ec619adb7f6a211bd30 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 00:49:38 +0530 Subject: [PATCH 0435/2352] [walnut] append channels without dummy var --- walnut/converter/converter.go | 63 +++++++++++++++++------------------ 1 file changed, 30 insertions(+), 33 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index c6acfbf4b..766d73f1f 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -64,8 +64,34 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { taskName := dplDump.Workflows[index].Name correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry channelNames := dplDump.Metadata[correspondingMetadata].Channels - var bind []channel.Inbound - var connect []channel.Outbound + + task := task.Class{ + Identifier: task.TaskClassIdentifier{ + Name: taskName, + }, + Defaults: gera.MakeStringMapWithMap(map[string]string{ + "user": "flp", + }), + Control: struct { + Mode controlmode.ControlMode "yaml:\"mode\"" + }{Mode: controlmode.FAIRMQ}, + Command: &common.CommandInfo{ + Env: []string{}, // -> Default to empty array + Shell: createBool(true), + Value: &dplDump.Metadata[correspondingMetadata].Executable, + Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, + User: createString("flp"), + }, + Wants: task.ResourceWants{ + Cpu: createFloat(0.15), + Memory: createFloat(128), + Ports: task.Ranges{}, //begin - end OR range + }, + Properties: gera.MakeStringMapWithMap(map[string]string{ + "severity": "trace", + "color": "false", + }), + } for _, channelName := range channelNames { // To avoid duplication, only "push" channels are included @@ -78,7 +104,7 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { }, Addressing: "ipc", } - bind = append(bind, singleBind) + task.Bind = append(task.Bind, singleBind) } if strings.Contains(channelName, "to_" + taskName) { @@ -93,39 +119,10 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { }, Target: "{{ Parent().Path }}." + initiator + ":" + channelName, } - connect = append(connect, singleConnect) + task.Connect = append(task.Connect, singleConnect) } } - task := task.Class{ - Identifier: task.TaskClassIdentifier{ - Name: taskName, - }, - Defaults: gera.MakeStringMapWithMap(map[string]string{ - "user": "flp", - }), - Control: struct { - Mode controlmode.ControlMode "yaml:\"mode\"" - }{Mode: controlmode.FAIRMQ}, - Command: &common.CommandInfo{ - Env: []string{}, // -> Default to empty array - Shell: createBool(true), - Value: &dplDump.Metadata[correspondingMetadata].Executable, - Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, - User: createString("flp"), - }, - Wants: task.ResourceWants{ - Cpu: createFloat(0.15), - Memory: createFloat(128), - Ports: task.Ranges{}, //begin - end OR range - }, - Bind: bind, - Properties: gera.MakeStringMapWithMap(map[string]string{ - "severity": "trace", - "color": "false", - }), - Connect: connect, - } // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) } From 25be37ccc51e0cbe0a522d682a13162c2ffb225c Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 1 Jul 2020 20:48:19 +0530 Subject: [PATCH 0436/2352] [walnut] use map[string]interface{} during marshalling --- core/workflow/aggregator.go | 8 ++++ core/workflow/aggregatorrole.go | 21 +++++++++ core/workflow/loadDPL.go | 78 ++------------------------------- core/workflow/rolebase.go | 22 ++++++++++ 4 files changed, 54 insertions(+), 75 deletions(-) diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 8967db85a..3c6c820af 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -108,6 +108,14 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error return } +func (a *aggregator) MarshalYAML() (interface{}, error) { + aux := make(map[string]interface{}) + + aux["roles"] = a.Roles + + return aux, nil +} + func (r *aggregator) GenerateTaskDescriptors() (ds task.Descriptors) { if r == nil { return nil diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0a2678b8a..cc05e2964 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -65,6 +65,27 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e return } +func (r *aggregatorRole) MarshalYAML() (interface{}, error) { + aux := make(map[string]interface{}) + + auxRoleBase, err := r.roleBase.MarshalYAML() + auxAggregator, err := r.aggregator.MarshalYAML() + + // Cast from interface{} to map[string]interface{} + mapRoleBase := auxRoleBase.(map[string]interface{}) + mapAggregator := auxAggregator.(map[string]interface{}) + + for k, v := range mapRoleBase { + aux[k] = v + } + + for k,v := range mapAggregator { + aux[k] =v + } + + return aux, err +} + func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) if g.Match(r.GetPath()) { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 4d6466e1a..84ff38534 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -25,8 +25,6 @@ package workflow import ( - "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/task/constraint" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/common/gera" @@ -74,9 +72,9 @@ type auxAggregatorRole struct { } func RoleToYAML(input Role) ([]byte, error) { - auxRole := auxAggregatorRole{ - RoleBase: roleBase{}, - Aggregator: aggregator{ + auxRole := aggregatorRole{ + roleBase: roleBase{}, + aggregator: aggregator{ Roles: input.GetRoles(), }, } @@ -84,73 +82,3 @@ func RoleToYAML(input Role) ([]byte, error) { yamlDATA, err := yaml.Marshal(&auxRole) return yamlDATA, err } - -// Cannot invoke MarshalYAML on aggregatorRole (unexported members) -// auxAggregatorRole flattens roleBase and aggregator to have them -// marshalled at the same depth -func (a *auxAggregatorRole) MarshalYAML() (interface{}, error) { - type _task struct { - Load string `yaml:"load"` - } - - type _role struct { - Name string `yaml:"name"` - Connect []*channel.Outbound - Task _task `yaml:"task"` - } - - type flatAggregatorRole struct { - Name string `yaml:"name"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` - Defaults gera.StringMap `yaml:"defaults"` - Vars gera.StringMap `yaml:"vars"` - Aggregator []_role `yaml:"roles"` - } - - type rootWorkflow struct { - Name string `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Roles []flatAggregatorRole `yaml:"roles"` - } - - root := rootWorkflow{ - Name: a.RoleBase.Name, - Defaults: nil, - } - - aux := flatAggregatorRole{ - Name: a.RoleBase.Name, - Constraints: nil, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - Aggregator: nil, - } - - var auxAggregator []_role - - for _, eachTask := range a.Aggregator.GetTasks(){ - taskClass := *eachTask.GetTaskClass() - auxRole := _role{ - Name: taskClass.Identifier.Name, - Task: _task{ - Load: taskClass.Identifier.Name, - }, - } - - for _, eachConnect := range taskClass.Connect { - auxRole.Connect = append(auxRole.Connect, &eachConnect) - } - - auxAggregator = append(auxAggregator, auxRole) - } - - aux.Constraints = a.RoleBase.Constraints - aux.Defaults = a.RoleBase.Defaults - aux.Vars = a.RoleBase.Vars - aux.Aggregator = auxAggregator - - root.Roles = append(root.Roles, aux) - - return root, nil -} - diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index d2e60ac62..3abe69493 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -188,6 +188,28 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) return } +func (r *roleBase) MarshalYAML() (interface{}, error) { + aux := make(map[string]interface{}) + + task := map[string]interface{}{ + "load": r.Name, + } + + var connect []interface{} + for _, eachConnect := range r.Connect{ + marshalled, _ := eachConnect.MarshalYAML() + connect = append(connect, marshalled) + } + + aux["name"] = r.Name + aux["defaults"] = r.Defaults + aux["constraints"] = r.Constraints + aux["connect"] = connect + aux["task"] = task + + return aux, nil +} + func (r *roleBase) wrapConnectFields() template.Fields { connectFields := make(template.Fields, len(r.Connect)) for i, _ := range r.Connect { From 5a34f61bb4de6210593ce461a2c0082c9df12b72 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 2 Jul 2020 23:47:53 +0530 Subject: [PATCH 0437/2352] [walnut] improved marshalling Role to YAML --- core/workflow/aggregatorrole.go | 17 +++++++++++++++-- core/workflow/loadDPL.go | 24 +++++++++++++++--------- core/workflow/rolebase.go | 5 ----- core/workflow/taskrole.go | 17 +++++++++++++++++ walnut/converter/converter.go | 4 +++- walnut/converter/converter_test.go | 4 ++-- 6 files changed, 52 insertions(+), 19 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index cc05e2964..8880ccb55 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,6 +29,8 @@ import ( "strings" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -66,8 +68,13 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e } func (r *aggregatorRole) MarshalYAML() (interface{}, error) { - aux := make(map[string]interface{}) + type rootWorkflow struct { + Name string `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Roles map[string]interface{} `yaml:"roles"` + } + aux := make(map[string]interface{}) auxRoleBase, err := r.roleBase.MarshalYAML() auxAggregator, err := r.aggregator.MarshalYAML() @@ -83,7 +90,13 @@ func (r *aggregatorRole) MarshalYAML() (interface{}, error) { aux[k] =v } - return aux, err + output := rootWorkflow{ + Name: r.roleBase.Name, + Defaults: r.roleBase.Defaults, + Roles: aux, + } + + return output, err } func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 84ff38534..da3427c3e 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -26,15 +26,20 @@ package workflow import ( "gopkg.in/yaml.v3" + "strings" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" ) -func LoadDPL(tasks []*task.Class) (workflow Role, err error) { +func LoadDPL(tasks []*task.Class, filename string) (workflow Role, err error) { // FIXME: base roleBase of root defaults to all empty values root := new(aggregatorRole) + if strings.Contains(filename, ".json"){ + root.roleBase.Name = filename[:len(filename)-5] + } + for _, taskItem := range tasks { SingleTaskRole := taskRole{ roleBase: roleBase{ @@ -56,7 +61,7 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } workflow = root @@ -65,15 +70,16 @@ func LoadDPL(tasks []*task.Class) (workflow Role, err error) { return workflow, nil } -// Aux struct to fulfil export requirement by yaml.Marshal -type auxAggregatorRole struct { - RoleBase roleBase - Aggregator aggregator -} - func RoleToYAML(input Role) ([]byte, error) { + // Auxiliary struct for marshalling auxRole := aggregatorRole{ - roleBase: roleBase{}, + roleBase: roleBase{ + Name: input.GetName(), + Constraints: input.getConstraints(), + Defaults: gera.MakeStringMapWithMap(input.GetDefaults().Raw()), + Vars: gera.MakeStringMapWithMap(input.GetVars().Raw()), + UserVars: gera.MakeStringMapWithMap(input.GetUserVars().Raw()), + }, aggregator: aggregator{ Roles: input.GetRoles(), }, diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 3abe69493..82973e105 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -191,10 +191,6 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - task := map[string]interface{}{ - "load": r.Name, - } - var connect []interface{} for _, eachConnect := range r.Connect{ marshalled, _ := eachConnect.MarshalYAML() @@ -205,7 +201,6 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { aux["defaults"] = r.Defaults aux["constraints"] = r.Constraints aux["connect"] = connect - aux["task"] = task return aux, nil } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 63fa8e34b..13e89d8d0 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -94,6 +94,23 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) return } +func (t *taskRole) MarshalYAML() (interface{}, error) { + auxRoleBase, err := t.roleBase.MarshalYAML() + + type _task struct { + Load string `yaml:"load"` + } + + auxTask := _task{ + Load: t.LoadTaskClass, + } + + aux := auxRoleBase.(map[string]interface{}) + aux["task"] = auxTask + + return aux, err +} + func (t *taskRole) GlobFilter(g glob.Glob) (rs []Role) { if g.Match(t.GetPath()) { rs = []Role{t} diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 766d73f1f..a54692e0a 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -179,11 +179,13 @@ func RoleToYAML(input workflow.Role) (err error) { var fileName = "workflows/" if input.GetName() == "" { - fileName += "no-name.yaml" + fileName += "no-name" } else { fileName += input.GetName() } + fileName += ".yaml" + err = ioutil.WriteFile(fileName, yamlDATA, 0644) if err != nil { return fmt.Errorf("error writing role to file: %v", err) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 6ff9195d2..07d1ecc09 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -63,7 +63,7 @@ func TestTaskToRole(t *testing.T) { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks) + role, err := workflow.LoadDPL(allTasks, "dump.json") if err != nil { t.Errorf("error loading task to role: %v", err) } @@ -80,7 +80,7 @@ func TestRoleToYAML(t *testing.T) { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks) + role, err := workflow.LoadDPL(allTasks, "dump.json") if err != nil { t.Errorf("error loading task to role: %v", err) } From c75414f3be318a273ff2ab5e931df6480a4dd87a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 3 Jul 2020 00:09:55 +0530 Subject: [PATCH 0438/2352] [walnut] fixes to file handling --- walnut/converter/converter.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index a54692e0a..c5af13bc6 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -150,13 +150,13 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { } fileName := "tasks/" + SingleTask.Identifier.Name + ".yaml" f, err := os.Create(fileName) + defer f.Close() // Write marshaled YAML to file err = ioutil.WriteFile(fileName, YAMLData, 0644) if err != nil { return fmt.Errorf("creating file failed: %v", err) } - f.Close() } return } @@ -179,7 +179,7 @@ func RoleToYAML(input workflow.Role) (err error) { var fileName = "workflows/" if input.GetName() == "" { - fileName += "no-name" + return fmt.Errorf("no filename provided") } else { fileName += input.GetName() } From ab4db47f3165635ff4b00bef1b9b3d5748290d74 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 6 Jul 2020 14:34:58 +0530 Subject: [PATCH 0439/2352] [walnut] marshal taskRole without aux struct --- core/workflow/taskrole.go | 38 +++++++++++++++++--------------------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 13e89d8d0..aa5e2c978 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -44,8 +44,8 @@ type taskRole struct { } func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - aux := struct{ - Task struct{ + aux := struct { + Task struct { Load string Trigger *string Timeout *string @@ -97,16 +97,12 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *taskRole) MarshalYAML() (interface{}, error) { auxRoleBase, err := t.roleBase.MarshalYAML() - type _task struct { - Load string `yaml:"load"` + load := map[string]string{ + // t.LoadTaskClass returns empty string + "load": t.roleBase.Name, } - - auxTask := _task{ - Load: t.LoadTaskClass, - } - aux := auxRoleBase.(map[string]interface{}) - aux["task"] = auxTask + aux["task"] = load return aux, err } @@ -170,11 +166,11 @@ func (t *taskRole) resolveTaskClassIdentifier(repo *repos.Repo) { t.LoadTaskClass = repo.ResolveTaskClassIdentifier(t.LoadTaskClass) } -func (t* taskRole) UpdateStatus(s task.Status) { +func (t *taskRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t* taskRole) UpdateState(s task.State) { +func (t *taskRole) UpdateState(s task.State) { t.updateState(s) } @@ -207,8 +203,8 @@ func (t *taskRole) copy() copyable { LoadTaskClass: t.LoadTaskClass, Traits: t.Traits, } - rCopy.status = SafeStatus{status:task.INACTIVE} - rCopy.state = SafeState{state:task.STANDBY} + rCopy.status = SafeStatus{status: task.INACTIVE} + rCopy.state = SafeState{state: task.STANDBY} return &rCopy } @@ -223,11 +219,11 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { } ds = task.Descriptors{{ - TaskRole: t, - TaskClassName: t.LoadTaskClass, + TaskRole: t, + TaskClassName: t.LoadTaskClass, RoleConstraints: t.getConstraints(), - RoleConnect: t.CollectOutboundChannels(), - RoleBind: t.CollectInboundChannels(), + RoleConnect: t.CollectOutboundChannels(), + RoleBind: t.CollectInboundChannels(), }} return } @@ -256,7 +252,7 @@ func (t *taskRole) GetTask() *task.Task { return t.Task } -func (t* taskRole) GetTaskClass() string { +func (t *taskRole) GetTaskClass() string { if t == nil { return "" } @@ -275,7 +271,7 @@ func (t* taskRole) GetTaskTraits() task.Traits { } -func (t* taskRole) GetTaskClasses() []string { +func (t *taskRole) GetTaskClasses() []string { if t == nil { return nil } @@ -314,4 +310,4 @@ func (t *taskRole) setParent(role Updatable) { t.Defaults.Wrap(role.GetDefaults()) t.Vars.Wrap(role.GetVars()) t.UserVars.Wrap(role.GetUserVars()) -} \ No newline at end of file +} From 6498d677ac4d5a183161bda4576c0446b80034e4 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 7 Jul 2020 19:45:52 +0530 Subject: [PATCH 0440/2352] [walnut] added module parameter to ExtractTaskClasses --- walnut/converter/converter.go | 29 +++++++++++++++++++++-------- walnut/converter/converter_test.go | 8 ++++---- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index c5af13bc6..bd58b8ea0 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -58,8 +58,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { - +func ExtractTaskClasses(dplDump Dump, module []string) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { taskName := dplDump.Workflows[index].Name correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry @@ -78,7 +77,6 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { Command: &common.CommandInfo{ Env: []string{}, // -> Default to empty array Shell: createBool(true), - Value: &dplDump.Metadata[correspondingMetadata].Executable, Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, User: createString("flp"), }, @@ -93,6 +91,21 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { }), } + module = append(module, "Control-OCCPlugin") + loadModule := "eval `aliswmod load " + for _, modules := range module { + if modules == "Control-OCCPlugin" { + loadModule += modules + break + } else { + loadModule += modules + " " + } + } + loadModule += "` &&" + value := loadModule + "\n" + dplDump.Metadata[correspondingMetadata].Executable + + task.Command.Value = &value + for _, channelName := range channelNames { // To avoid duplication, only "push" channels are included if strings.Contains(channelName, "from_"+taskName) { @@ -107,17 +120,17 @@ func ExtractTaskClasses(dplDump Dump) (tasks []*task.Class, err error) { task.Bind = append(task.Bind, singleBind) } - if strings.Contains(channelName, "to_" + taskName) { + if strings.Contains(channelName, "to_"+taskName) { // String manipulation to generate channel target of the form: // {{ Parent().Path }}.taskName:from_{initiator}_to_{receiver} initiator := channelName[5:strings.Index(channelName, "_to")] singleConnect := channel.Outbound{ Channel: channel.Channel{ - Name: channelName, - Type: channel.ChannelType("pull"), - Transport: channel.TransportType("shmem"), + Name: channelName, + Type: channel.ChannelType("pull"), + Transport: channel.TransportType("shmem"), }, - Target: "{{ Parent().Path }}." + initiator + ":" + channelName, + Target: "{{ Parent().Path }}." + initiator + ":" + channelName, } task.Connect = append(task.Connect, singleConnect) } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 07d1ecc09..2282e7e67 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -34,7 +34,7 @@ import ( func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump) + extractedClasses, err := ExtractTaskClasses(TestDump, []string{}) pp.Print(extractedClasses) if err != nil { t.Errorf("extract Task Class failed: %v", err) @@ -44,7 +44,7 @@ func TestExtractClass(t *testing.T) { func TestTaskToYAML(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump) + allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -58,7 +58,7 @@ func TestTaskToYAML(t *testing.T) { func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump) + allTasks, err := ExtractTaskClasses(TestDump, []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -75,7 +75,7 @@ func TestRoleToYAML(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { dumpFile, err := ioutil.ReadFile("dump.json") dump, err := JSONImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump) + allTasks, err := ExtractTaskClasses(dump, []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } From 4d4dd5a40213e55fb185b577fe4d5a0f4b3a883a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 7 Jul 2020 21:33:11 +0530 Subject: [PATCH 0441/2352] [walnut] marshal roles as []roleBase, omitempty ports --- core/task/class.go | 66 ++++++++++++++++----------------- core/workflow/aggregatorrole.go | 31 +++++++++------- walnut/converter/converter.go | 1 + 3 files changed, 51 insertions(+), 47 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index aff5b42ed..a5115a22d 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -39,37 +39,37 @@ import ( // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -82,15 +82,15 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints:aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, } } return @@ -99,11 +99,11 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []*channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` @@ -150,16 +150,16 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports,omitempty"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 8880ccb55..5575f6f11 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -68,32 +68,36 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e } func (r *aggregatorRole) MarshalYAML() (interface{}, error) { + // Aux struct to cast Roles as an array type rootWorkflow struct { - Name string `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Roles map[string]interface{} `yaml:"roles"` + Name string `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Roles []map[string]interface{} `yaml:"roles"` } + // TODO: Handle multiple Roles + var finalAux []map[string]interface{} aux := make(map[string]interface{}) - auxRoleBase, err := r.roleBase.MarshalYAML() + auxRoleBase, err := r.roleBase.MarshalYAML() auxAggregator, err := r.aggregator.MarshalYAML() // Cast from interface{} to map[string]interface{} - mapRoleBase := auxRoleBase.(map[string]interface{}) + mapRoleBase := auxRoleBase.(map[string]interface{}) mapAggregator := auxAggregator.(map[string]interface{}) for k, v := range mapRoleBase { aux[k] = v } - for k,v := range mapAggregator { - aux[k] =v + for k, v := range mapAggregator { + aux[k] = v } + finalAux = append(finalAux, aux) output := rootWorkflow{ Name: r.roleBase.Name, Defaults: r.roleBase.Defaults, - Roles: aux, + Roles: finalAux, } return output, err @@ -113,7 +117,6 @@ func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { return } - func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { if r == nil { return errors.New("role tree error when processing templates") @@ -178,7 +181,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ - roleBase: *r.roleBase.copy().(*roleBase), + roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } for i := 0; i < len(rCopy.Roles); i++ { @@ -199,10 +202,10 @@ func (r *aggregatorRole) updateStatus(s task.Status) { return } log.WithFields(logrus.Fields{ - "child status": s.String(), - "aggregator status": r.status.get().String(), - "aggregator role": r.Name, - }). + "child status": s.String(), + "aggregator status": r.status.get().String(), + "aggregator role": r.Name, + }). Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index bd58b8ea0..a11b999e1 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -94,6 +94,7 @@ func ExtractTaskClasses(dplDump Dump, module []string) (tasks []*task.Class, err module = append(module, "Control-OCCPlugin") loadModule := "eval `aliswmod load " for _, modules := range module { + // Control-OCCPlugin would appear twice without this check if modules == "Control-OCCPlugin" { loadModule += modules break From 04e23d8535952f8779fa674d7ee976be4eb03595 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 16:20:07 +0530 Subject: [PATCH 0442/2352] [walnut] fixes to formatting [walnut] remove editor formatting [walnut] fix incorrect formatting [walnut] further formatting fixes [walnut] remove testing files [walnut] fix auto-formatting --- core/task/class.go | 66 ++++++++++++++++----------------- core/workflow/aggregatorrole.go | 10 ++--- core/workflow/taskrole.go | 24 ++++++------ 3 files changed, 50 insertions(+), 50 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index a5115a22d..aff5b42ed 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -39,37 +39,37 @@ import ( // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -82,15 +82,15 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints: aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints:aux.Constraints, + Connect: aux.Connect, } } return @@ -99,11 +99,11 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []*channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` @@ -150,16 +150,16 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports,omitempty"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 5575f6f11..6d284c88c 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -181,7 +181,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ - roleBase: *r.roleBase.copy().(*roleBase), + roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } for i := 0; i < len(rCopy.Roles); i++ { @@ -202,10 +202,10 @@ func (r *aggregatorRole) updateStatus(s task.Status) { return } log.WithFields(logrus.Fields{ - "child status": s.String(), - "aggregator status": r.status.get().String(), - "aggregator role": r.Name, - }). + "child status": s.String(), + "aggregator status": r.status.get().String(), + "aggregator role": r.Name, + }). Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index aa5e2c978..443d8580f 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -44,8 +44,8 @@ type taskRole struct { } func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - aux := struct { - Task struct { + aux := struct{ + Task struct{ Load string Trigger *string Timeout *string @@ -166,11 +166,11 @@ func (t *taskRole) resolveTaskClassIdentifier(repo *repos.Repo) { t.LoadTaskClass = repo.ResolveTaskClassIdentifier(t.LoadTaskClass) } -func (t *taskRole) UpdateStatus(s task.Status) { +func (t* taskRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t *taskRole) UpdateState(s task.State) { +func (t* taskRole) UpdateState(s task.State) { t.updateState(s) } @@ -203,8 +203,8 @@ func (t *taskRole) copy() copyable { LoadTaskClass: t.LoadTaskClass, Traits: t.Traits, } - rCopy.status = SafeStatus{status: task.INACTIVE} - rCopy.state = SafeState{state: task.STANDBY} + rCopy.status = SafeStatus{status:task.INACTIVE} + rCopy.state = SafeState{state:task.STANDBY} return &rCopy } @@ -219,11 +219,11 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { } ds = task.Descriptors{{ - TaskRole: t, - TaskClassName: t.LoadTaskClass, + TaskRole: t, + TaskClassName: t.LoadTaskClass, RoleConstraints: t.getConstraints(), - RoleConnect: t.CollectOutboundChannels(), - RoleBind: t.CollectInboundChannels(), + RoleConnect: t.CollectOutboundChannels(), + RoleBind: t.CollectInboundChannels(), }} return } @@ -252,7 +252,7 @@ func (t *taskRole) GetTask() *task.Task { return t.Task } -func (t *taskRole) GetTaskClass() string { +func (t* taskRole) GetTaskClass() string { if t == nil { return "" } @@ -271,7 +271,7 @@ func (t* taskRole) GetTaskTraits() task.Traits { } -func (t *taskRole) GetTaskClasses() []string { +func (t* taskRole) GetTaskClasses() []string { if t == nil { return nil } From 2b61c518f112593c12514db287941419caa7bcfb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 21:39:07 +0530 Subject: [PATCH 0443/2352] [walnut] change channel receivers to non-pointers --- core/task/channel/inbound.go | 44 ++++++++++----------- core/task/channel/outbound.go | 54 ++++++++++++------------- core/task/class.go | 74 +++++++++++++++++------------------ 3 files changed, 85 insertions(+), 87 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 9aa832784..2db4aa7fe 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -34,12 +34,12 @@ import ( type Inbound struct { Channel - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Addressing AddressFormat `yaml:"addressing"` //default: tcp } func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { aux := struct { - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Addressing AddressFormat `yaml:"addressing"` //default: tcp }{} err = unmarshal(&aux) if err != nil { @@ -60,7 +60,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er return } -func (inbound *Inbound) MarshalYAML() (interface{}, error) { +func (inbound Inbound) MarshalYAML() (interface{}, error) { // Flatten Inbound to have Addressing and Channel elements on the same "level" type _inbound struct { Name string `yaml:"name"` @@ -73,12 +73,12 @@ func (inbound *Inbound) MarshalYAML() (interface{}, error) { } auxInbound := _inbound{ - Name: inbound.Channel.Name, - Type: inbound.Channel.Type, - SndBufSize: inbound.Channel.SndBufSize, - RcvBufSize: inbound.Channel.RcvBufSize, - Transport: inbound.Channel.Transport, - Addressing: inbound.Addressing, + Name: inbound.Channel.Name, + Type: inbound.Channel.Type, + SndBufSize: inbound.Channel.SndBufSize, + RcvBufSize: inbound.Channel.RcvBufSize, + Transport: inbound.Channel.Transport, + Addressing: inbound.Addressing, } if inbound.Channel.RateLogging == 0 { @@ -102,7 +102,7 @@ chans.data1.0.sndKernelSize = 0 chans.data1.0.transport = default [provided] chans.data1.0.type = push [provided] chans.data1.numSockets = 1 - */ +*/ func (inbound *Inbound) ToFMQMap(endpoint Endpoint) (pm controlcommands.PropertyMap) { return inbound.buildFMQMap(endpoint.ToBoundEndpoint().GetAddress(), endpoint.GetTransport()) @@ -117,31 +117,31 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm prefix := strings.Join([]string{chans, chName, "0"}, ".") chanProps := controlcommands.PropertyMap{ - "address": address, - "method": "bind", - "rateLogging": strconv.Itoa(inbound.RateLogging), - "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), + "address": address, + "method": "bind", + "rateLogging": strconv.Itoa(inbound.RateLogging), + "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(inbound.SndBufSize), + "sndBufSize": strconv.Itoa(inbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": inbound.Type.String(), + "transport": transport.String(), + "type": inbound.Type.String(), } for k, v := range chanProps { - pm[prefix + "." + k] = v + pm[prefix+"."+k] = v } return } -func MergeInbound(hp,lp []Inbound) (channels []Inbound) { +func MergeInbound(hp, lp []Inbound) (channels []Inbound) { channels = make([]Inbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -151,6 +151,6 @@ func MergeInbound(hp,lp []Inbound) (channels []Inbound) { channels = append(channels, v) } } - + return -} \ No newline at end of file +} diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index d22ec0795..221798c8b 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -35,12 +35,12 @@ import ( type Outbound struct { Channel - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { target := struct { - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` }{} err = unmarshal(&target) if err != nil { @@ -58,7 +58,7 @@ func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err return } -func (outbound *Outbound) MarshalYAML() (interface{}, error) { +func (outbound Outbound) MarshalYAML() (interface{}, error) { // Flatten Outbound to have Target and Channel elements on the same "level" type _outbound struct { Name string `yaml:"name"` @@ -71,12 +71,12 @@ func (outbound *Outbound) MarshalYAML() (interface{}, error) { } auxOutbound := _outbound{ - Name: outbound.Channel.Name, - Type: outbound.Channel.Type, - SndBufSize: outbound.Channel.SndBufSize, - RcvBufSize: outbound.Channel.RcvBufSize, - Transport: outbound.Channel.Transport, - Target: outbound.Target, + Name: outbound.Channel.Name, + Type: outbound.Channel.Type, + SndBufSize: outbound.Channel.SndBufSize, + RcvBufSize: outbound.Channel.RcvBufSize, + Transport: outbound.Channel.Transport, + Target: outbound.Target, } if outbound.Channel.RateLogging == 0 { @@ -143,43 +143,43 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap { - "address": address, - "method": "connect", - "rateLogging": strconv.Itoa(outbound.RateLogging), - "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), + chanProps := controlcommands.PropertyMap{ + "address": address, + "method": "connect", + "rateLogging": strconv.Itoa(outbound.RateLogging), + "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(outbound.SndBufSize), + "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": outbound.Type.String(), + "transport": transport.String(), + "type": outbound.Type.String(), } if (transport != outbound.Transport) && (outbound.Transport != DEFAULT) { log.WithFields(logrus.Fields{ - "address": address, - "oubound": outbound.Name, - "actualInboundTransport": transport, - "outboundTransport": outbound.Transport, - }). + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). Warn("channel transport mismatch, fix workflow template") } for k, v := range chanProps { - pm[prefix + "." + k] = v + pm[prefix+"."+k] = v } return } -func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { +func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { channels = make([]Outbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -189,6 +189,6 @@ func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { channels = append(channels, v) } } - + return -} \ No newline at end of file +} diff --git a/core/task/class.go b/core/task/class.go index aff5b42ed..28eef52d9 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -39,37 +39,37 @@ import ( // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -82,15 +82,15 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints:aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, } } return @@ -99,30 +99,28 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` - Bind []*channel.Inbound `yaml:"bind"` + Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` } + aux := _class{ Name: c.Identifier.Name, Defaults: c.Defaults.Raw(), Properties: c.Properties.Raw(), Wants: c.Wants, + Bind: c.Bind, Constraints: c.Constraints, Command: c.Command, } - for _, eachBind := range c.Bind { - aux.Bind = append(aux.Bind, &eachBind) - } - if c.Control.Mode == controlmode.FAIRMQ { aux.Control.Mode = "fairmq" } else if c.Control.Mode == controlmode.BASIC { @@ -150,16 +148,16 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) From e7ab5c9d845d6be38fb870957442643c034b2815 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 21:41:33 +0530 Subject: [PATCH 0444/2352] [walnut] change RateLogging marshal to int --- core/task/channel/inbound.go | 21 ++++++++------------- core/task/channel/outbound.go | 21 ++++++++------------- 2 files changed, 16 insertions(+), 26 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 2db4aa7fe..0c491b5e7 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -67,24 +67,19 @@ func (inbound Inbound) MarshalYAML() (interface{}, error) { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize,omitempty"` RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging string `yaml:"rateLogging,omitempty"` + RateLogging int `yaml:"rateLogging,omitempty"` Transport TransportType `yaml:"transport"` Addressing AddressFormat `yaml:"addressing"` } auxInbound := _inbound{ - Name: inbound.Channel.Name, - Type: inbound.Channel.Type, - SndBufSize: inbound.Channel.SndBufSize, - RcvBufSize: inbound.Channel.RcvBufSize, - Transport: inbound.Channel.Transport, - Addressing: inbound.Addressing, - } - - if inbound.Channel.RateLogging == 0 { - auxInbound.RateLogging = "" - } else { - auxInbound.RateLogging = strconv.Itoa(inbound.Channel.RateLogging) + Name: inbound.Channel.Name, + Type: inbound.Channel.Type, + SndBufSize: inbound.Channel.SndBufSize, + RcvBufSize: inbound.Channel.RcvBufSize, + RateLogging: inbound.RateLogging, + Transport: inbound.Channel.Transport, + Addressing: inbound.Addressing, } return auxInbound, nil diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 221798c8b..8faba7325 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -65,24 +65,19 @@ func (outbound Outbound) MarshalYAML() (interface{}, error) { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize,omitempty"` RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging string `yaml:"rateLogging,omitempty"` + RateLogging int `yaml:"rateLogging,omitempty"` Transport TransportType `yaml:"transport"` Target string `yaml:"target"` } auxOutbound := _outbound{ - Name: outbound.Channel.Name, - Type: outbound.Channel.Type, - SndBufSize: outbound.Channel.SndBufSize, - RcvBufSize: outbound.Channel.RcvBufSize, - Transport: outbound.Channel.Transport, - Target: outbound.Target, - } - - if outbound.Channel.RateLogging == 0 { - auxOutbound.RateLogging = "" - } else { - auxOutbound.RateLogging = strconv.Itoa(outbound.Channel.RateLogging) + Name: outbound.Channel.Name, + Type: outbound.Channel.Type, + SndBufSize: outbound.Channel.SndBufSize, + RcvBufSize: outbound.Channel.RcvBufSize, + RateLogging: outbound.Channel.RateLogging, + Transport: outbound.Channel.Transport, + Target: outbound.Target, } return auxOutbound, nil From 0a667c07ff6b106cfd8c40332ceab28e0c696716 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 22:56:25 +0530 Subject: [PATCH 0445/2352] [walnut] rename auxiliary struct to _aggregatorRole --- core/workflow/aggregatorrole.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 6d284c88c..0262ae916 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -69,7 +69,7 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e func (r *aggregatorRole) MarshalYAML() (interface{}, error) { // Aux struct to cast Roles as an array - type rootWorkflow struct { + type _aggregatorRole struct { Name string `yaml:"name"` Defaults gera.StringMap `yaml:"defaults"` Roles []map[string]interface{} `yaml:"roles"` @@ -94,7 +94,7 @@ func (r *aggregatorRole) MarshalYAML() (interface{}, error) { } finalAux = append(finalAux, aux) - output := rootWorkflow{ + output := _aggregatorRole{ Name: r.roleBase.Name, Defaults: r.roleBase.Defaults, Roles: finalAux, @@ -181,7 +181,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ - roleBase: *r.roleBase.copy().(*roleBase), + roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } for i := 0; i < len(rCopy.Roles); i++ { @@ -202,10 +202,10 @@ func (r *aggregatorRole) updateStatus(s task.Status) { return } log.WithFields(logrus.Fields{ - "child status": s.String(), - "aggregator status": r.status.get().String(), - "aggregator role": r.Name, - }). + "child status": s.String(), + "aggregator status": r.status.get().String(), + "aggregator role": r.Name, + }). Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") From 7d9cb5bca888f91b5d804609e84983018860da45 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:09:05 +0530 Subject: [PATCH 0446/2352] [walnut] generate filename of root outside workflow package --- core/workflow/loadDPL.go | 23 +++++++++-------------- walnut/converter/converter_test.go | 6 +++--- 2 files changed, 12 insertions(+), 17 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index da3427c3e..24355e405 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -25,20 +25,15 @@ package workflow import ( - "gopkg.in/yaml.v3" - "strings" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" + "gopkg.in/yaml.v3" ) -func LoadDPL(tasks []*task.Class, filename string) (workflow Role, err error) { +func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error) { // FIXME: base roleBase of root defaults to all empty values root := new(aggregatorRole) - - if strings.Contains(filename, ".json"){ - root.roleBase.Name = filename[:len(filename)-5] - } + root.roleBase.Name = rootRoleName for _, taskItem := range tasks { SingleTaskRole := taskRole{ @@ -55,13 +50,13 @@ func LoadDPL(tasks []*task.Class, filename string) (workflow Role, err error) { }, } - SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) + SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) - SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) - SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) - SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) + SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } workflow = root @@ -73,7 +68,7 @@ func LoadDPL(tasks []*task.Class, filename string) (workflow Role, err error) { func RoleToYAML(input Role) ([]byte, error) { // Auxiliary struct for marshalling auxRole := aggregatorRole{ - roleBase: roleBase{ + roleBase: roleBase{ Name: input.GetName(), Constraints: input.getConstraints(), Defaults: gera.MakeStringMapWithMap(input.GetDefaults().Raw()), diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 2282e7e67..542e61a39 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -63,11 +63,11 @@ func TestTaskToRole(t *testing.T) { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks, "dump.json") + role, err := workflow.LoadDPL(allTasks, "dump") if err != nil { t.Errorf("error loading task to role: %v", err) } - pp.Print(role) + _, _ = pp.Print(role) }) } @@ -80,7 +80,7 @@ func TestRoleToYAML(t *testing.T) { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks, "dump.json") + role, err := workflow.LoadDPL(allTasks, "dump") if err != nil { t.Errorf("error loading task to role: %v", err) } From b9f6e693a2b9e011a2b52fa53ce25fcfb7bfdd27 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:14:13 +0530 Subject: [PATCH 0447/2352] [walnut] type assert Role to *aggregatorRole --- core/workflow/loadDPL.go | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 24355e405..0aed3450d 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -66,20 +66,5 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error } func RoleToYAML(input Role) ([]byte, error) { - // Auxiliary struct for marshalling - auxRole := aggregatorRole{ - roleBase: roleBase{ - Name: input.GetName(), - Constraints: input.getConstraints(), - Defaults: gera.MakeStringMapWithMap(input.GetDefaults().Raw()), - Vars: gera.MakeStringMapWithMap(input.GetVars().Raw()), - UserVars: gera.MakeStringMapWithMap(input.GetUserVars().Raw()), - }, - aggregator: aggregator{ - Roles: input.GetRoles(), - }, - } - - yamlDATA, err := yaml.Marshal(&auxRole) - return yamlDATA, err + return yaml.Marshal(input.(*aggregatorRole)) } From 33ad286a6e99bd3812540c60bf93145df0ef059f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:16:25 +0530 Subject: [PATCH 0448/2352] [walnut] rename module to envModules --- walnut/converter/converter.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index a11b999e1..4a65307d7 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -58,7 +58,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, module []string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, err error) { for index := range dplDump.Workflows { taskName := dplDump.Workflows[index].Name correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry @@ -91,15 +91,15 @@ func ExtractTaskClasses(dplDump Dump, module []string) (tasks []*task.Class, err }), } - module = append(module, "Control-OCCPlugin") + envModules = append(envModules, "Control-OCCPlugin") loadModule := "eval `aliswmod load " - for _, modules := range module { + for _, module := range envModules { // Control-OCCPlugin would appear twice without this check - if modules == "Control-OCCPlugin" { - loadModule += modules + if module == "Control-OCCPlugin" { + loadModule += module break } else { - loadModule += modules + " " + loadModule += module + " " } } loadModule += "` &&" From 97c77bf958dad0595c4e703d02cdac28589a3f00 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:24:43 +0530 Subject: [PATCH 0449/2352] [walnut] use fmt.Sprintf for string manipulation --- walnut/converter/converter.go | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 4a65307d7..da406f0c3 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -92,18 +92,8 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, } envModules = append(envModules, "Control-OCCPlugin") - loadModule := "eval `aliswmod load " - for _, module := range envModules { - // Control-OCCPlugin would appear twice without this check - if module == "Control-OCCPlugin" { - loadModule += module - break - } else { - loadModule += module + " " - } - } - loadModule += "` &&" - value := loadModule + "\n" + dplDump.Metadata[correspondingMetadata].Executable + value := fmt.Sprintf("eval `aliswmod load %s` &&\n%s", strings.Join(envModules, " "), + dplDump.Metadata[correspondingMetadata].Executable) task.Command.Value = &value @@ -131,7 +121,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, Type: channel.ChannelType("pull"), Transport: channel.TransportType("shmem"), }, - Target: "{{ Parent().Path }}." + initiator + ":" + channelName, + Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), } task.Connect = append(task.Connect, singleConnect) } From a7dffaad84498a858bb35bab925e088c96741b95 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:38:49 +0530 Subject: [PATCH 0450/2352] [walnut] rename functions to be more idiomatic --- core/workflow/loadDPL.go | 2 ++ walnut/converter/converter.go | 6 +++--- walnut/converter/converter_test.go | 8 ++++---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 0aed3450d..88529ad67 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -65,6 +65,8 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error return workflow, nil } +// RoleToYAML exists to avoid exporting aggregatorRole. Simply put, this function is nothing but a wrapper +// which allows marshalling Roles outside the workflow package func RoleToYAML(input Role) ([]byte, error) { return yaml.Marshal(input.(*aggregatorRole)) } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index da406f0c3..2292a722e 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -133,9 +133,9 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, return tasks, nil } -// TaskToYAML takes as input an array of pointers to task.Class +// GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file -func TaskToYAML(extractedTasks []*task.Class) (err error) { +func GenerateTaskTemplate(extractedTasks []*task.Class) (err error) { // Check if "tasks" directory exists. If not, create it _, err = os.Stat("tasks") @@ -165,7 +165,7 @@ func TaskToYAML(extractedTasks []*task.Class) (err error) { return } -func RoleToYAML(input workflow.Role) (err error) { +func GenerateWorkflowTemplate(input workflow.Role) (err error) { // Check if "tasks" directory exists. If not, create it _, err = os.Stat("workflows") if os.IsNotExist(err) { diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 542e61a39..18393eec6 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -42,14 +42,14 @@ func TestExtractClass(t *testing.T) { }) } -func TestTaskToYAML(t *testing.T) { +func TestGenerateTaskTemplate(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } - err = TaskToYAML(allTasks) + err = GenerateTaskTemplate(allTasks) if err != nil { t.Errorf("failed to write YAML to file: %v", err) } @@ -71,7 +71,7 @@ func TestTaskToRole(t *testing.T) { }) } -func TestRoleToYAML(t *testing.T) { +func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { dumpFile, err := ioutil.ReadFile("dump.json") dump, err := JSONImporter(dumpFile) @@ -85,7 +85,7 @@ func TestRoleToYAML(t *testing.T) { t.Errorf("error loading task to role: %v", err) } - err = RoleToYAML(role) + err = GenerateWorkflowTemplate(role) if err != nil { t.Errorf("error converting Role to YAML: %v", err) } From 4e49441d92d316960995abaa9fd96b2ae01704a8 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:39:16 +0530 Subject: [PATCH 0451/2352] [walnut] simplify marshalling []connect --- core/workflow/rolebase.go | 59 +++++++++++++++++---------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 82973e105..dd0e7f4b4 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -41,17 +41,16 @@ import ( var log = logger.New(logrus.StandardLogger(), "workflow") -const( - PATH_SEPARATOR = "." +const ( + PATH_SEPARATOR = "." PATH_SEPARATOR_RUNE = '.' ) - type roleBase struct { - Name string `yaml:"name"` + Name string `yaml:"name"` parent Updatable - Connect []channel.Outbound `yaml:"connect,omitempty"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Connect []channel.Outbound `yaml:"connect,omitempty"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` status SafeStatus state SafeState @@ -174,12 +173,12 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) type _roleBase roleBase role := _roleBase{ Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), UserVars: gera.MakeStringMap(), - Locals: make(map[string]string), - status: SafeStatus{status:task.INACTIVE}, - state: SafeState{state:task.STANDBY}, - Enabled: "true", + Locals: make(map[string]string), + status: SafeStatus{status:task.INACTIVE}, + state: SafeState{state:task.STANDBY}, + Enabled: "true", } err = unmarshal(&role) if err == nil { @@ -191,16 +190,10 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - var connect []interface{} - for _, eachConnect := range r.Connect{ - marshalled, _ := eachConnect.MarshalYAML() - connect = append(connect, marshalled) - } - - aux["name"] = r.Name - aux["defaults"] = r.Defaults + aux["name"] = r.Name + aux["defaults"] = r.Defaults aux["constraints"] = r.Constraints - aux["connect"] = connect + aux["connect"] = r.Connect return aux, nil } @@ -223,18 +216,18 @@ func (r *roleBase) wrapConnectFields() template.Fields { func (r *roleBase) copy() copyable { rCopy := roleBase{ - Name: r.Name, - parent: r.parent, - Defaults: r.Defaults.Copy().(*gera.StringWrapMap), - Vars: r.Vars.Copy().(*gera.StringWrapMap), - UserVars: r.UserVars.Copy().(*gera.StringWrapMap), - Locals: make(map[string]string), - Connect: make([]channel.Outbound, len(r.Connect)), + Name: r.Name, + parent: r.parent, + Defaults: r.Defaults.Copy().(*gera.StringWrapMap), + Vars: r.Vars.Copy().(*gera.StringWrapMap), + UserVars: r.UserVars.Copy().(*gera.StringWrapMap), + Locals: make(map[string]string), + Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), - status: r.status, - state: r.state, - Bind: make([]channel.Inbound, len(r.Bind)), - Enabled: r.Enabled, + status: r.status, + state: r.state, + Bind: make([]channel.Inbound, len(r.Bind)), + Enabled: r.Enabled, } copied := copy(rCopy.Connect, r.Connect) @@ -290,7 +283,7 @@ func (r *roleBase) GetName() string { return r.Name } -func (r* roleBase) GetEnvironmentId() uuid.Array { +func (r *roleBase) GetEnvironmentId() uuid.Array { if r.parent == nil { return uuid.NIL.Array() } @@ -375,6 +368,6 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { channels = make([]channel.Inbound, 0) } else { channels = channel.MergeInbound(r.Bind, r.parent.CollectInboundChannels()) - } + } return } From 6eedd715a9c12c30520b3f14ba8a500af6c7c763 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 23:58:39 +0530 Subject: [PATCH 0452/2352] [walnut] undo auto-format changes --- core/task/channel/inbound.go | 70 ++++++++++++++++----------------- core/task/channel/outbound.go | 40 +++++++++---------- core/task/class.go | 64 +++++++++++++++--------------- core/workflow/aggregatorrole.go | 68 ++++++++++++++++---------------- core/workflow/loadDPL.go | 10 ++--- core/workflow/rolebase.go | 31 ++++++++------- 6 files changed, 142 insertions(+), 141 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 0c491b5e7..a18239271 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -34,12 +34,12 @@ import ( type Inbound struct { Channel - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Addressing AddressFormat `yaml:"addressing"` //default: tcp } func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { aux := struct { - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Addressing AddressFormat `yaml:"addressing"` //default: tcp }{} err = unmarshal(&aux) if err != nil { @@ -61,28 +61,28 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er } func (inbound Inbound) MarshalYAML() (interface{}, error) { - // Flatten Inbound to have Addressing and Channel elements on the same "level" - type _inbound struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize,omitempty"` - RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging int `yaml:"rateLogging,omitempty"` - Transport TransportType `yaml:"transport"` - Addressing AddressFormat `yaml:"addressing"` - } +// Flatten Inbound to have Addressing and Channel elements on the same "level" +type _inbound struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging int `yaml:"rateLogging,omitempty"` + Transport TransportType `yaml:"transport"` + Addressing AddressFormat `yaml:"addressing"` +} - auxInbound := _inbound{ - Name: inbound.Channel.Name, - Type: inbound.Channel.Type, - SndBufSize: inbound.Channel.SndBufSize, - RcvBufSize: inbound.Channel.RcvBufSize, - RateLogging: inbound.RateLogging, - Transport: inbound.Channel.Transport, - Addressing: inbound.Addressing, - } +auxInbound := _inbound{ + Name: inbound.Channel.Name, + Type: inbound.Channel.Type, + SndBufSize: inbound.Channel.SndBufSize, + RcvBufSize: inbound.Channel.RcvBufSize, + RateLogging: inbound.RateLogging, + Transport: inbound.Channel.Transport, + Addressing: inbound.Addressing, +} - return auxInbound, nil +return auxInbound, nil } /* @@ -97,7 +97,7 @@ chans.data1.0.sndKernelSize = 0 chans.data1.0.transport = default [provided] chans.data1.0.type = push [provided] chans.data1.numSockets = 1 -*/ + */ func (inbound *Inbound) ToFMQMap(endpoint Endpoint) (pm controlcommands.PropertyMap) { return inbound.buildFMQMap(endpoint.ToBoundEndpoint().GetAddress(), endpoint.GetTransport()) @@ -112,31 +112,31 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm prefix := strings.Join([]string{chans, chName, "0"}, ".") chanProps := controlcommands.PropertyMap{ - "address": address, - "method": "bind", - "rateLogging": strconv.Itoa(inbound.RateLogging), - "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), + "address": address, + "method": "bind", + "rateLogging": strconv.Itoa(inbound.RateLogging), + "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(inbound.SndBufSize), + "sndBufSize": strconv.Itoa(inbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": inbound.Type.String(), + "transport": transport.String(), + "type": inbound.Type.String(), } for k, v := range chanProps { - pm[prefix+"."+k] = v + pm[prefix + "." + k] = v } return } -func MergeInbound(hp, lp []Inbound) (channels []Inbound) { +func MergeInbound(hp,lp []Inbound) (channels []Inbound) { channels = make([]Inbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -146,6 +146,6 @@ func MergeInbound(hp, lp []Inbound) (channels []Inbound) { channels = append(channels, v) } } - + return -} +} \ No newline at end of file diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index 8faba7325..aa7f214d3 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -35,12 +35,12 @@ import ( type Outbound struct { Channel - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { target := struct { - Target string `json:"target" yaml:"target"` + Target string `json:"target" yaml:"target"` }{} err = unmarshal(&target) if err != nil { @@ -138,43 +138,43 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap{ - "address": address, - "method": "connect", - "rateLogging": strconv.Itoa(outbound.RateLogging), - "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), + chanProps := controlcommands.PropertyMap { + "address": address, + "method": "connect", + "rateLogging": strconv.Itoa(outbound.RateLogging), + "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(outbound.SndBufSize), + "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": outbound.Type.String(), + "transport": transport.String(), + "type": outbound.Type.String(), } if (transport != outbound.Transport) && (outbound.Transport != DEFAULT) { log.WithFields(logrus.Fields{ - "address": address, - "oubound": outbound.Name, - "actualInboundTransport": transport, - "outboundTransport": outbound.Transport, - }). + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). Warn("channel transport mismatch, fix workflow template") } for k, v := range chanProps { - pm[prefix+"."+k] = v + pm[prefix + "." + k] = v } return } -func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { +func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { channels = make([]Outbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -184,6 +184,6 @@ func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { channels = append(channels, v) } } - + return -} +} \ No newline at end of file diff --git a/core/task/class.go b/core/task/class.go index 28eef52d9..d0230dd2b 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -39,37 +39,37 @@ import ( // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier TaskClassIdentifier `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), + Defaults: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -82,15 +82,15 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints: aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints:aux.Constraints, + Connect: aux.Connect, } } return @@ -99,11 +99,11 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` @@ -148,16 +148,16 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports Ranges `yaml:"ports"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 0262ae916..37d97f57a 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -68,41 +68,41 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e } func (r *aggregatorRole) MarshalYAML() (interface{}, error) { - // Aux struct to cast Roles as an array - type _aggregatorRole struct { - Name string `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Roles []map[string]interface{} `yaml:"roles"` - } +// Aux struct to cast Roles as an array +type _aggregatorRole struct { + Name string `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Roles []map[string]interface{} `yaml:"roles"` +} - // TODO: Handle multiple Roles - var finalAux []map[string]interface{} - aux := make(map[string]interface{}) - auxRoleBase, err := r.roleBase.MarshalYAML() - auxAggregator, err := r.aggregator.MarshalYAML() +// TODO: Handle multiple Roles +var finalAux []map[string]interface{} +aux := make(map[string]interface{}) +auxRoleBase, err := r.roleBase.MarshalYAML() +auxAggregator, err := r.aggregator.MarshalYAML() - // Cast from interface{} to map[string]interface{} - mapRoleBase := auxRoleBase.(map[string]interface{}) - mapAggregator := auxAggregator.(map[string]interface{}) +// Cast from interface{} to map[string]interface{} +mapRoleBase := auxRoleBase.(map[string]interface{}) +mapAggregator := auxAggregator.(map[string]interface{}) - for k, v := range mapRoleBase { - aux[k] = v - } - - for k, v := range mapAggregator { - aux[k] = v - } +for k, v := range mapRoleBase { + aux[k] = v +} - finalAux = append(finalAux, aux) - output := _aggregatorRole{ - Name: r.roleBase.Name, - Defaults: r.roleBase.Defaults, - Roles: finalAux, - } +for k, v := range mapAggregator { + aux[k] = v +} - return output, err +finalAux = append(finalAux, aux) +output := _aggregatorRole{ + Name: r.roleBase.Name, + Defaults: r.roleBase.Defaults, + Roles: finalAux, } +return output, err +} + func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) if g.Match(r.GetPath()) { @@ -181,7 +181,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ - roleBase: *r.roleBase.copy().(*roleBase), + roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } for i := 0; i < len(rCopy.Roles); i++ { @@ -202,10 +202,10 @@ func (r *aggregatorRole) updateStatus(s task.Status) { return } log.WithFields(logrus.Fields{ - "child status": s.String(), - "aggregator status": r.status.get().String(), - "aggregator role": r.Name, - }). + "child status": s.String(), + "aggregator status": r.status.get().String(), + "aggregator role": r.Name, + }). Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") @@ -223,4 +223,4 @@ func (r *aggregatorRole) updateState(s task.State) { if r.parent != nil { r.parent.updateState(r.state.get()) } -} +} \ No newline at end of file diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 88529ad67..e84437683 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -50,13 +50,13 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error }, } - SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) + SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) - SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) - SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) - SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) + SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } workflow = root diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index dd0e7f4b4..0355fc054 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -41,16 +41,17 @@ import ( var log = logger.New(logrus.StandardLogger(), "workflow") -const ( - PATH_SEPARATOR = "." +const( + PATH_SEPARATOR = "." PATH_SEPARATOR_RUNE = '.' ) + type roleBase struct { - Name string `yaml:"name"` + Name string `yaml:"name"` parent Updatable - Connect []channel.Outbound `yaml:"connect,omitempty"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Connect []channel.Outbound `yaml:"connect,omitempty"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` status SafeStatus state SafeState @@ -173,7 +174,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) type _roleBase roleBase role := _roleBase{ Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), UserVars: gera.MakeStringMap(), Locals: make(map[string]string), status: SafeStatus{status:task.INACTIVE}, @@ -216,13 +217,13 @@ func (r *roleBase) wrapConnectFields() template.Fields { func (r *roleBase) copy() copyable { rCopy := roleBase{ - Name: r.Name, - parent: r.parent, - Defaults: r.Defaults.Copy().(*gera.StringWrapMap), - Vars: r.Vars.Copy().(*gera.StringWrapMap), - UserVars: r.UserVars.Copy().(*gera.StringWrapMap), - Locals: make(map[string]string), - Connect: make([]channel.Outbound, len(r.Connect)), + Name: r.Name, + parent: r.parent, + Defaults: r.Defaults.Copy().(*gera.StringWrapMap), + Vars: r.Vars.Copy().(*gera.StringWrapMap), + UserVars: r.UserVars.Copy().(*gera.StringWrapMap), + Locals: make(map[string]string), + Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, state: r.state, @@ -283,7 +284,7 @@ func (r *roleBase) GetName() string { return r.Name } -func (r *roleBase) GetEnvironmentId() uuid.Array { +func (r* roleBase) GetEnvironmentId() uuid.Array { if r.parent == nil { return uuid.NIL.Array() } @@ -368,6 +369,6 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { channels = make([]channel.Inbound, 0) } else { channels = channel.MergeInbound(r.Bind, r.parent.CollectInboundChannels()) - } + } return } From 52629b9360307a52431c80a62f5531743ca60696 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 9 Jul 2020 18:35:48 +0530 Subject: [PATCH 0453/2352] [walnut] improvements to template structure --- core/task/class.go | 2 +- core/workflow/aggregatorrole.go | 42 ++++++++++----------------------- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index d0230dd2b..d6803b2a9 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -150,7 +150,7 @@ func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error type ResourceWants struct { Cpu *float64 `yaml:"cpu"` Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports"` + Ports Ranges `yaml:"ports,omitempty"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 37d97f57a..7ec8f5cdb 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,8 +29,6 @@ import ( "strings" texttemplate "text/template" - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -68,39 +66,23 @@ func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err e } func (r *aggregatorRole) MarshalYAML() (interface{}, error) { -// Aux struct to cast Roles as an array -type _aggregatorRole struct { - Name string `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Roles []map[string]interface{} `yaml:"roles"` -} + aux := make(map[string]interface{}) -// TODO: Handle multiple Roles -var finalAux []map[string]interface{} -aux := make(map[string]interface{}) -auxRoleBase, err := r.roleBase.MarshalYAML() -auxAggregator, err := r.aggregator.MarshalYAML() + auxAggregator, err := r.aggregator.MarshalYAML() + auxRoleBase, err := r.roleBase.MarshalYAML() -// Cast from interface{} to map[string]interface{} -mapRoleBase := auxRoleBase.(map[string]interface{}) -mapAggregator := auxAggregator.(map[string]interface{}) - -for k, v := range mapRoleBase { - aux[k] = v -} + mapRoleBase := auxRoleBase.(map[string]interface{}) + mapAggregator := auxAggregator.(map[string]interface{}) -for k, v := range mapAggregator { - aux[k] = v -} + for k, v := range mapRoleBase { + aux[k] = v + } -finalAux = append(finalAux, aux) -output := _aggregatorRole{ - Name: r.roleBase.Name, - Defaults: r.roleBase.Defaults, - Roles: finalAux, -} + for k, v := range mapAggregator { + aux[k] = v + } -return output, err + return aux, err } func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { From 455aeb9563a5c1a8ab7d71bcc46e8ab807708836 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 9 Jul 2020 18:37:43 +0530 Subject: [PATCH 0454/2352] [walnut] rename JSONImporter to DPLImportter --- walnut/converter/converter_test.go | 2 +- walnut/converter/importer.go | 2 +- walnut/converter/importer_test.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 18393eec6..8b6bad78a 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -74,7 +74,7 @@ func TestTaskToRole(t *testing.T) { func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { dumpFile, err := ioutil.ReadFile("dump.json") - dump, err := JSONImporter(dumpFile) + dump, err := DPLImporter(dumpFile) allTasks, err := ExtractTaskClasses(dump, []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go index 64dde89fe..a8e927396 100644 --- a/walnut/converter/importer.go +++ b/walnut/converter/importer.go @@ -68,7 +68,7 @@ type Dump struct { Metadata []metadataEntry `json:"metadata"` } -func JSONImporter(input []byte) (importedJSON Dump, err error) { +func DPLImporter(input []byte) (importedJSON Dump, err error) { err = json.Unmarshal(input, &importedJSON) if err != nil { return importedJSON, fmt.Errorf("JSON Unmarshal failed: %w", err) diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index b6f7f8437..1b093b86f 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -31,7 +31,7 @@ import ( func TestImportUnmarshal(t *testing.T) { t.Run("Testing dump reading", func(t *testing.T) { - got, err := JSONImporter([]byte(TestJSON)) + got, err := DPLImporter([]byte(TestJSON)) want := TestDump if err != nil { t.Errorf("Import failed: %v", err) From 0a5ecdc00c1d44af57c403433486b00b16cba333 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 17:47:26 +0530 Subject: [PATCH 0455/2352] [walnut] indentation fixes + omitempty tags --- core/task/channel/inbound.go | 40 ++++++++++++++++++------------------ core/task/class.go | 6 +++--- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index a18239271..a17e2465b 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -61,28 +61,28 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er } func (inbound Inbound) MarshalYAML() (interface{}, error) { -// Flatten Inbound to have Addressing and Channel elements on the same "level" -type _inbound struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize,omitempty"` - RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging int `yaml:"rateLogging,omitempty"` - Transport TransportType `yaml:"transport"` - Addressing AddressFormat `yaml:"addressing"` -} + // Flatten Inbound to have Addressing and Channel elements on the same "level" + type _inbound struct { + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize,omitempty"` + RcvBufSize int `yaml:"rcvBufSize,omitempty"` + RateLogging int `yaml:"rateLogging,omitempty"` + Transport TransportType `yaml:"transport"` + Addressing AddressFormat `yaml:"addressing"` + } -auxInbound := _inbound{ - Name: inbound.Channel.Name, - Type: inbound.Channel.Type, - SndBufSize: inbound.Channel.SndBufSize, - RcvBufSize: inbound.Channel.RcvBufSize, - RateLogging: inbound.RateLogging, - Transport: inbound.Channel.Transport, - Addressing: inbound.Addressing, -} + auxInbound := _inbound{ + Name: inbound.Channel.Name, + Type: inbound.Channel.Type, + SndBufSize: inbound.Channel.SndBufSize, + RcvBufSize: inbound.Channel.RcvBufSize, + RateLogging: inbound.RateLogging, + Transport: inbound.Channel.Transport, + Addressing: inbound.Addressing, + } -return auxInbound, nil + return auxInbound, nil } /* diff --git a/core/task/class.go b/core/task/class.go index d6803b2a9..aa1254344 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -100,13 +100,13 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` + Defaults map[string]string `yaml:"defaults,omitempty"` Control struct { Mode string `yaml:"mode"` } `yaml:"control"` Wants ResourceWants `yaml:"wants"` - Bind []channel.Inbound `yaml:"bind"` - Properties map[string]string `yaml:"properties"` + Bind []channel.Inbound `yaml:"bind,omitempty"` + Properties map[string]string `yaml:"properties,omitempty"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` Command *common.CommandInfo `yaml:"command"` } From 511bedba701f7206d50671e024ebe7dabbbe68a6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 30 Jun 2020 16:22:18 +0530 Subject: [PATCH 0456/2352] [walnut] add convert option to CLI --- walnut/cmd/check.go | 11 +---- walnut/cmd/convert.go | 97 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 9 deletions(-) create mode 100644 walnut/cmd/convert.go diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 07d505a5f..447c3d25a 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -37,15 +37,8 @@ import ( var checkCmd = &cobra.Command{ Use: "check", Short: "check the file passed against a specified schema.", - Long: `The check command validates the given file against a specified -schema. This file can be a task template, a workflow template or an O² -DPL Dump. Each of those have a schema provided to validate against. - -Usage: - walnut check --format [format] [file] - -Example: - walnut check --format workflow readout-sftb.yaml + Long: `The check command validates the given file against a specified schema. This file can be a task template, +a workflow template or an O² DPL Dump. Each of those have a schema provided to validate against. Valid schemata formats: workflow task dpl_dump`, diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go new file mode 100644 index 000000000..3b2f52cb3 --- /dev/null +++ b/walnut/cmd/convert.go @@ -0,0 +1,97 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/walnut/converter" + "io/ioutil" + "os" + "strings" + + "github.com/spf13/cobra" +) + +// convertCmd represents the convert command +var convertCmd = &cobra.Command{ + Use: "convert", + Short: "Converts a DPL Dump to the required formats.", + Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to +selectively output task or workflow templates. By default, both templates are produced. +`, + + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("convert called with args: " + strings.Join(args, " ")) + + template, _ := cmd.Flags().GetString("template") + for _, filename := range args { + file, err := ioutil.ReadFile(filename) + if err != nil { + fmt.Errorf("failed to open file &s: &v", filename, err) + os.Exit(1) + } + + dplDump, err := converter.JSONImporter(file) + taskClass, err := converter.ExtractTaskClasses(dplDump) + + if template == "task" { + err = converter.TaskToYAML(taskClass) + if err != nil { + fmt.Errorf("conversion to task failed for %s: %v", filename, err) + os.Exit(1) + } + } else if template == "workflow" { + workflowRole, err := workflow.LoadDPL(taskClass) + err = converter.RoleToYAML(workflowRole) + if err != nil { + fmt.Errorf("conversion to workflow failed for %s: %v", filename, err) + os.Exit(1) + } + } else { + err = converter.TaskToYAML(taskClass) + if err != nil { + fmt.Errorf("conversion to task failed for %s: %v", filename, err) + os.Exit(1) + } + + workflowRole, err := workflow.LoadDPL(taskClass) + err = converter.RoleToYAML(workflowRole) + if err != nil { + fmt.Errorf("conversion to workflow failed for %s: %v", filename, err) + os.Exit(1) + } + } + } + }, + Args: cobra.ExactArgs(1), +} + +func init() { + rootCmd.AddCommand(convertCmd) + + convertCmd.Flags().StringP("template", "t", "", "template to generate") + convertCmd.MarkFlagRequired("filename") +} From 4f5a0401536a2c9b8a9edca30b008bcd2a0cccaa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 7 Jul 2020 23:44:44 +0530 Subject: [PATCH 0457/2352] [walnut] add modules in CLI --- walnut/cmd/check.go | 20 +++++++++---- walnut/cmd/convert.go | 69 +++++++++++++++++++------------------------ walnut/cmd/root.go | 3 +- 3 files changed, 46 insertions(+), 46 deletions(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 447c3d25a..c24963cf3 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -26,6 +26,7 @@ package cmd import ( "fmt" + "github.com/spf13/viper" "io/ioutil" "os" @@ -44,11 +45,11 @@ Valid schemata formats: workflow task dpl_dump`, Run: func(cmd *cobra.Command, args []string) { - // fmt.Println("check called with arg: " + strings.Join(args, " ")) - format, _ := cmd.Flags().GetString("format") - for _, filename := range args { - file, err := ioutil.ReadFile(filename) + filename, _ := cmd.Flags().GetStringArray("filename") + + for _, file := range filename { + file, err := ioutil.ReadFile(file) if err != nil { fmt.Printf("failed to open file %s: %v", filename, err) os.Exit(1) @@ -60,12 +61,19 @@ Valid schemata formats: } } }, - Args: cobra.ExactArgs(1), } +var filename []string +var format string + func init() { rootCmd.AddCommand(checkCmd) - checkCmd.Flags().StringP("format", "f", "", "format to validate against") + checkCmd.Flags().StringArrayP("filename", "f", []string{}, "files to validate") + viper.BindPFlag("filename", checkCmd.Flags().Lookup("filename")) + checkCmd.MarkFlagRequired("filename") + + checkCmd.Flags().StringP("format", "", "", "format to validate against") + viper.BindPFlag("format", checkCmd.Flags().Lookup("format")) checkCmd.MarkFlagRequired("format") } diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 3b2f52cb3..3dd1932a1 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -28,70 +28,61 @@ import ( "fmt" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/walnut/converter" + "github.com/spf13/cobra" + "github.com/spf13/viper" "io/ioutil" "os" - "strings" - - "github.com/spf13/cobra" ) // convertCmd represents the convert command var convertCmd = &cobra.Command{ Use: "convert", Short: "Converts a DPL Dump to the required formats.", - Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to -selectively output task or workflow templates. By default, both templates are produced. + Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to: +- selectively output task or workflow templates +- specify which modules were used during dump generation +By default, both templates are produced. Control-OCCPlugin is always used as module. `, - Run: func(cmd *cobra.Command, args []string) { - fmt.Println("convert called with args: " + strings.Join(args, " ")) + filename, _ := cmd.Flags().GetStringArray("filename") + // FIXME: only accepting first string + modules, _ := cmd.Flags().GetStringArray("modules") - template, _ := cmd.Flags().GetString("template") - for _, filename := range args { - file, err := ioutil.ReadFile(filename) + for _, dump := range filename { + file, err := ioutil.ReadFile(dump) if err != nil { - fmt.Errorf("failed to open file &s: &v", filename, err) + fmt.Errorf("failed to open file &s: &v", file, err) os.Exit(1) } dplDump, err := converter.JSONImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules) - if template == "task" { - err = converter.TaskToYAML(taskClass) - if err != nil { - fmt.Errorf("conversion to task failed for %s: %v", filename, err) - os.Exit(1) - } - } else if template == "workflow" { - workflowRole, err := workflow.LoadDPL(taskClass) - err = converter.RoleToYAML(workflowRole) - if err != nil { - fmt.Errorf("conversion to workflow failed for %s: %v", filename, err) - os.Exit(1) - } - } else { - err = converter.TaskToYAML(taskClass) - if err != nil { - fmt.Errorf("conversion to task failed for %s: %v", filename, err) - os.Exit(1) - } + err = converter.TaskToYAML(taskClass) + if err != nil { + fmt.Errorf("conversion to task failed for %s: %v", file, err) + os.Exit(1) + } - workflowRole, err := workflow.LoadDPL(taskClass) - err = converter.RoleToYAML(workflowRole) - if err != nil { - fmt.Errorf("conversion to workflow failed for %s: %v", filename, err) - os.Exit(1) - } + role, err := workflow.LoadDPL(taskClass, dump) + err = converter.RoleToYAML(role) + if err != nil { + fmt.Errorf("conversion to workflow failed for %s: %v", file, err) + os.Exit(1) } } }, - Args: cobra.ExactArgs(1), } +var modules []string + func init() { rootCmd.AddCommand(convertCmd) - convertCmd.Flags().StringP("template", "t", "", "template to generate") + convertCmd.Flags().StringArrayP("filename", "f", []string{}, "DPL dump to convert") + viper.BindPFlag("filename", convertCmd.Flags().Lookup("filename")) convertCmd.MarkFlagRequired("filename") + + convertCmd.Flags().StringArrayP("modules", "m", []string{}, "modules to include") + viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) } diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index 200c3cf69..f1c190c0b 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -65,7 +65,8 @@ func init() { // Cobra supports persistent flags, which, if defined here, // will be global for your application. - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", + fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) // Cobra also supports local flags, which will only run // when this action is called directly. From 1a492207ffd79010e1c128684dc3a9df7844e40d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 00:12:26 +0530 Subject: [PATCH 0458/2352] [walnut] auto-generate documentation --- walnut/cmd/root.go | 4 ++++ walnut/doc/generate.go | 43 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 walnut/doc/generate.go diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index f1c190c0b..40e87a98a 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -58,6 +58,10 @@ func Execute() { } } +func GetRootCmd() *cobra.Command { // Used for docs generator + return rootCmd +} + func init() { cobra.OnInitialize(initConfig) diff --git a/walnut/doc/generate.go b/walnut/doc/generate.go new file mode 100644 index 000000000..8bb8159fc --- /dev/null +++ b/walnut/doc/generate.go @@ -0,0 +1,43 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +import ( + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/walnut/app" + "github.com/AliceO2Group/Control/walnut/cmd" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra/doc" +) + +var log = logger.New(logrus.StandardLogger(), app.NAME) + +func main() { + rootCmd := cmd.GetRootCmd() + err := doc.GenMarkdownTree(rootCmd, "./") + if err != nil { + log.Fatal(err) + } +} From db5dfb5829c3c42cc261517ea75c7fc065943a02 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 8 Jul 2020 00:12:58 +0530 Subject: [PATCH 0459/2352] [walnut] improved documentation --- walnut/README.md | 74 +++++++++++++++++++++++++++++++++++- walnut/app/constants.go | 2 +- walnut/cmd/check.go | 6 +-- walnut/cmd/convert.go | 9 ++--- walnut/doc/walnut.md | 24 ++++++++++++ walnut/doc/walnut_check.md | 35 +++++++++++++++++ walnut/doc/walnut_convert.md | 32 ++++++++++++++++ 7 files changed, 171 insertions(+), 11 deletions(-) create mode 100644 walnut/doc/walnut.md create mode 100644 walnut/doc/walnut_check.md create mode 100644 walnut/doc/walnut_convert.md diff --git a/walnut/README.md b/walnut/README.md index e862f2577..889f8a0cf 100644 --- a/walnut/README.md +++ b/walnut/README.md @@ -1,4 +1,76 @@ # `walnut` - the O² workflow administration and linting utility The O² **w**orkflow **a**dministration and **l**i**n**ting **ut**ility is a command line program for workflow configuration -and import validation. \ No newline at end of file +and import validation. + +## Configuration file + +You can check the local `walnut` configuration with +```bash +$ walnut about +``` + +## Using `walnut` + +At any step, you can type `$ walnut help ` to get information on what you can do and how, for example: + +```bash +$ walnut help +walnut is a command line program for interacting with the O² Workflow Administration and Linting Utility. + +For more information on the available commands, see the individual documentation for each command. + +Usage: + walnut [command] + +Available Commands: + check check the file passed against a specified schema. + convert Converts a DPL Dump to the required formats. + help Help about any command + +Flags: + --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) + -h, --help help for walnut + -t, --toggle Help message for toggle + +Use "walnut [command] --help" for more information about a command. +``` + +### Validating a file + +To check if a file conforms to the pre-defined schemas, run the `check` command: +```bash +$ walnut check +``` +Example usage: +```bash +$ walnut check --filename dump.json --format workflow +``` + +A successful validation will return no output while any errors will cause the program to exit. + +#### SEE ALSO + +* [walnut check](./doc/walnut_check.md) + + +### Converting a DPL Dump to Task/Workflow Templates + +The goal of `walnut` is to convert O²/DPL generated dumps to the required number of task templates and workflow templates. The +command used is `convert`: +```bash +$ walnut convert +``` + +Convert can also receive optional arguments to specify which modules to consider while generating task templates. + +Example usage: +```bash +$ walnut convert --filename dump.json --modules TestValue1 TestValue2 +``` + +A successful validation will return no output while any errors will cause the program to exit. + +#### SEE ALSO + +* [walnut convert](./doc/walnut_convert.md) \ No newline at end of file diff --git a/walnut/app/constants.go b/walnut/app/constants.go index d0f0c89c6..e7e5a2bc6 100644 --- a/walnut/app/constants.go +++ b/walnut/app/constants.go @@ -27,5 +27,5 @@ package app const ( NAME = "walnut" PRETTY_SHORTNAME = "walnut" - PRETTY_FULLNAME = "O² Workflow Administation and Linting Utility" + PRETTY_FULLNAME = "O² Workflow Administration and Linting Utility" ) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index c24963cf3..ea831236d 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -37,11 +37,11 @@ import ( // checkCmd represents the check command var checkCmd = &cobra.Command{ Use: "check", - Short: "check the file passed against a specified schema.", + Short: "validate the file against a specified schema", Long: `The check command validates the given file against a specified schema. This file can be a task template, -a workflow template or an O² DPL Dump. Each of those have a schema provided to validate against. +a workflow template or an O² DPL Dump. Each of these have a schema to validate against. -Valid schemata formats: +Valid schema formats: workflow task dpl_dump`, Run: func(cmd *cobra.Command, args []string) { diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 3dd1932a1..56d9eea37 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -37,12 +37,9 @@ import ( // convertCmd represents the convert command var convertCmd = &cobra.Command{ Use: "convert", - Short: "Converts a DPL Dump to the required formats.", - Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to: -- selectively output task or workflow templates -- specify which modules were used during dump generation -By default, both templates are produced. Control-OCCPlugin is always used as module. -`, + Short: "converts a DPL Dump to the required formats", + Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to +specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module.`, Run: func(cmd *cobra.Command, args []string) { filename, _ := cmd.Flags().GetStringArray("filename") // FIXME: only accepting first string diff --git a/walnut/doc/walnut.md b/walnut/doc/walnut.md new file mode 100644 index 000000000..b63ae12b7 --- /dev/null +++ b/walnut/doc/walnut.md @@ -0,0 +1,24 @@ +## walnut + +O² Workflow Administration and Linting Utility + +### Synopsis + +walnut is a command line program for interacting with the O² Workflow Administration and Linting Utility. + +For more information on the available commands, see the individual documentation for each command. + +### Options + +``` + --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) + -h, --help help for walnut + -t, --toggle Help message for toggle +``` + +### SEE ALSO + +* [walnut check](walnut_check.md) - validate the file against a specified schema +* [walnut convert](walnut_convert.md) - converts a DPL Dump to the required formats + +###### Auto generated by spf13/cobra on 9-Jul-2020 diff --git a/walnut/doc/walnut_check.md b/walnut/doc/walnut_check.md new file mode 100644 index 000000000..eed64e556 --- /dev/null +++ b/walnut/doc/walnut_check.md @@ -0,0 +1,35 @@ +## walnut check + +validate the file against a specified schema + +### Synopsis + +The check command validates the given file against a specified schema. This file can be a task template, +a workflow template or an O² DPL Dump. Each of these have a schema to validate against. + +Valid schema formats: + workflow task dpl_dump + +``` +walnut check [flags] +``` + +### Options + +``` + -f, --filename stringArray files to validate + --format string format to validate against + -h, --help help for check +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) +``` + +### SEE ALSO + +* [walnut](walnut.md) - O² Workflow Administration and Linting Utility + +###### Auto generated by spf13/cobra on 9-Jul-2020 diff --git a/walnut/doc/walnut_convert.md b/walnut/doc/walnut_convert.md new file mode 100644 index 000000000..fcf720108 --- /dev/null +++ b/walnut/doc/walnut_convert.md @@ -0,0 +1,32 @@ +## walnut convert + +converts a DPL Dump to the required formats + +### Synopsis + +The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to +specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module. + +``` +walnut convert [flags] +``` + +### Options + +``` + -f, --filename stringArray DPL dump to convert + -h, --help help for convert + -m, --modules stringArray modules to include +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) +``` + +### SEE ALSO + +* [walnut](walnut.md) - O² Workflow Administration and Linting Utility + +###### Auto generated by spf13/cobra on 9-Jul-2020 From c4ae00c3ec24c7bf1c9ee39599b21e1da9847776 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 9 Jul 2020 19:05:29 +0530 Subject: [PATCH 0460/2352] [walnut] better error reporting --- walnut/cmd/convert.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 56d9eea37..94ddec2ea 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -48,7 +48,8 @@ specify which modules should be used when generating task templates. Control-OCC for _, dump := range filename { file, err := ioutil.ReadFile(dump) if err != nil { - fmt.Errorf("failed to open file &s: &v", file, err) + err = fmt.Errorf("failed to open file &s: &v", dump, err) + fmt.Println(err.Error()) os.Exit(1) } @@ -57,14 +58,16 @@ specify which modules should be used when generating task templates. Control-OCC err = converter.TaskToYAML(taskClass) if err != nil { - fmt.Errorf("conversion to task failed for %s: %v", file, err) + err = fmt.Errorf("conversion to task failed for %s: %v", dump, err) + fmt.Println(err.Error()) os.Exit(1) } role, err := workflow.LoadDPL(taskClass, dump) err = converter.RoleToYAML(role) if err != nil { - fmt.Errorf("conversion to workflow failed for %s: %v", file, err) + err = fmt.Errorf("conversion to workflow failed for %s: %v", file, err) + fmt.Println(err.Error()) os.Exit(1) } } From 017a2127ccfb80e81fa03b9b313610f5138d82aa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 9 Jul 2020 19:31:51 +0530 Subject: [PATCH 0461/2352] [walnut] generate templates in single directory per dump --- walnut/cmd/convert.go | 21 ++++++++------ walnut/converter/converter.go | 44 ++++++++---------------------- walnut/converter/converter_test.go | 4 +-- walnut/converter/importer_test.go | 2 +- 4 files changed, 27 insertions(+), 44 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 94ddec2ea..95f930bfe 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -45,28 +45,31 @@ specify which modules should be used when generating task templates. Control-OCC // FIXME: only accepting first string modules, _ := cmd.Flags().GetStringArray("modules") - for _, dump := range filename { - file, err := ioutil.ReadFile(dump) + for _, dumpFile := range filename { + // Strip .json from end of filename + nameOfDump := dumpFile[:len(dumpFile)-5] + + file, err := ioutil.ReadFile(dumpFile) if err != nil { - err = fmt.Errorf("failed to open file &s: &v", dump, err) + err = fmt.Errorf("failed to open file &s: &v", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } - dplDump, err := converter.JSONImporter(file) + dplDump, err := converter.DPLImporter(file) taskClass, err := converter.ExtractTaskClasses(dplDump, modules) - err = converter.TaskToYAML(taskClass) + err = converter.GenerateTaskTemplate(taskClass, nameOfDump) if err != nil { - err = fmt.Errorf("conversion to task failed for %s: %v", dump, err) + err = fmt.Errorf("conversion to task failed for %s: %v", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } - role, err := workflow.LoadDPL(taskClass, dump) - err = converter.RoleToYAML(role) + role, err := workflow.LoadDPL(taskClass, nameOfDump) + err = converter.GenerateWorkflowTemplate(role, nameOfDump) if err != nil { - err = fmt.Errorf("conversion to workflow failed for %s: %v", file, err) + err = fmt.Errorf("conversion to workflow failed for %s: %v", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 2292a722e..f185234e2 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -28,6 +28,7 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "strings" "github.com/AliceO2Group/Control/core/workflow" @@ -83,7 +84,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, Wants: task.ResourceWants{ Cpu: createFloat(0.15), Memory: createFloat(128), - Ports: task.Ranges{}, //begin - end OR range + Ports: task.Ranges{}, // begin - end OR range }, Properties: gera.MakeStringMapWithMap(map[string]string{ "severity": "trace", @@ -135,24 +136,17 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file -func GenerateTaskTemplate(extractedTasks []*task.Class) (err error) { - - // Check if "tasks" directory exists. If not, create it - _, err = os.Stat("tasks") - if os.IsNotExist(err) { - // FIXME: use absolute paths - errDir := os.Mkdir("tasks", 0755) - if errDir != nil { - return fmt.Errorf("create dir failed: %v", err) - } - } +func GenerateTaskTemplate(extractedTasks []*task.Class, dumpFileName string) (err error) { + dir, _ := os.Getwd() + path := filepath.Join(dir, dumpFileName, "tasks") + os.MkdirAll(path, os.ModePerm) for _, SingleTask := range extractedTasks { YAMLData, err := yaml.Marshal(&SingleTask) if err != nil { return fmt.Errorf("marshal failed: %v", err) } - fileName := "tasks/" + SingleTask.Identifier.Name + ".yaml" + fileName := filepath.Join(path, SingleTask.Identifier.Name + ".yaml") f, err := os.Create(fileName) defer f.Close() @@ -165,31 +159,17 @@ func GenerateTaskTemplate(extractedTasks []*task.Class) (err error) { return } -func GenerateWorkflowTemplate(input workflow.Role) (err error) { - // Check if "tasks" directory exists. If not, create it - _, err = os.Stat("workflows") - if os.IsNotExist(err) { - // FIXME: use absolute paths - errDir := os.Mkdir("workflows", 0755) - if errDir != nil { - return fmt.Errorf("create dir failed: %v", err) - } - } +func GenerateWorkflowTemplate(input workflow.Role, dumpFileName string) (err error) { + dir, _ := os.Getwd() + path := filepath.Join(dir, dumpFileName, "workflows") + os.MkdirAll(path, os.ModePerm) yamlDATA, err := workflow.RoleToYAML(input) if err != nil { return fmt.Errorf("error converting role to YAML: %v", err) } - var fileName = "workflows/" - if input.GetName() == "" { - return fmt.Errorf("no filename provided") - } else { - fileName += input.GetName() - } - - fileName += ".yaml" - + fileName := filepath.Join(path, input.GetName() + ".yaml") err = ioutil.WriteFile(fileName, yamlDATA, 0644) if err != nil { return fmt.Errorf("error writing role to file: %v", err) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 8b6bad78a..973a3cdd9 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -49,7 +49,7 @@ func TestGenerateTaskTemplate(t *testing.T) { t.Errorf("extract Task Class failed: %v", err) } - err = GenerateTaskTemplate(allTasks) + err = GenerateTaskTemplate(allTasks, "dump") if err != nil { t.Errorf("failed to write YAML to file: %v", err) } @@ -85,7 +85,7 @@ func TestGenerateWorkflowTemplate(t *testing.T) { t.Errorf("error loading task to role: %v", err) } - err = GenerateWorkflowTemplate(role) + err = GenerateWorkflowTemplate(role, "dump") if err != nil { t.Errorf("error converting Role to YAML: %v", err) } diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go index 1b093b86f..1a53f2bb9 100644 --- a/walnut/converter/importer_test.go +++ b/walnut/converter/importer_test.go @@ -29,7 +29,7 @@ import ( "testing" ) -func TestImportUnmarshal(t *testing.T) { +func TestDPLImporter(t *testing.T) { t.Run("Testing dump reading", func(t *testing.T) { got, err := DPLImporter([]byte(TestJSON)) want := TestDump From 260f19c464c2048af859e10ce35cd9280d2e16de Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 9 Jul 2020 22:24:34 +0530 Subject: [PATCH 0462/2352] [walnut] sanitize CmdLineArgs --- walnut/converter/converter.go | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index f185234e2..aac471cae 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,6 +60,8 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, err error) { + envModules = append(envModules, "Control-OCCPlugin") + for index := range dplDump.Workflows { taskName := dplDump.Workflows[index].Name correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry @@ -78,7 +80,8 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, Command: &common.CommandInfo{ Env: []string{}, // -> Default to empty array Shell: createBool(true), - Arguments: dplDump.Metadata[correspondingMetadata].CmdlLineArgs, + Arguments: sanitizeCmdLineArgs(dplDump.Metadata[correspondingMetadata].CmdlLineArgs, + taskName), User: createString("flp"), }, Wants: task.ResourceWants{ @@ -92,12 +95,11 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, }), } - envModules = append(envModules, "Control-OCCPlugin") value := fmt.Sprintf("eval `aliswmod load %s` &&\n%s", strings.Join(envModules, " "), dplDump.Metadata[correspondingMetadata].Executable) - task.Command.Value = &value + for _, channelName := range channelNames { // To avoid duplication, only "push" channels are included if strings.Contains(channelName, "from_"+taskName) { @@ -128,12 +130,26 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, } } - // fmt.Printf("\nTASK:\n%v\n", task) tasks = append(tasks, &task) } return tasks, nil } +func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { + for _, value := range input { + // Check args for dump arguments and remove them + if strings.Contains(value, "--dump-workflow") || + strings.Contains(value, "--dump-workflow-file") || + strings.Contains(value, ".json") {} else { + output = append(output, value) + } + } + // Add --id parameter along with name of task to arguments + output = append(output, "--id", taskName) + + return output +} + // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file func GenerateTaskTemplate(extractedTasks []*task.Class, dumpFileName string) (err error) { From 91fae93e0e265965080833f6dc7ec161aafde528 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 18:14:22 +0530 Subject: [PATCH 0463/2352] [walnut] init walnut about --- walnut/cmd/about.go | 83 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 walnut/cmd/about.go diff --git a/walnut/cmd/about.go b/walnut/cmd/about.go new file mode 100644 index 000000000..ac8039341 --- /dev/null +++ b/walnut/cmd/about.go @@ -0,0 +1,83 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + "time" + + "github.com/AliceO2Group/Control/walnut/app" + "github.com/fatih/color" + "github.com/spf13/cobra" + "github.com/spf13/viper" +) + +// aboutCmd represents the about command +var aboutCmd = &cobra.Command{ + Use: "about", + Aliases: []string{}, + Short: fmt.Sprintf("about %s", app.NAME), + Long: `The about command shows some basic information on this utility.`, + Run: func(*cobra.Command, []string) { + color.Set(color.FgHiWhite) + fmt.Print(app.PRETTY_SHORTNAME + " *** ") + color.Set(color.FgHiGreen) + fmt.Printf("The ALICE %s\n", app.PRETTY_FULLNAME) + color.Unset() + fmt.Printf(` +version: %s +config: %s +`, + color.HiGreenString(viper.GetString("version")), + color.HiGreenString(func() string { + if len(viper.ConfigFileUsed()) > 0 { + return viper.ConfigFileUsed() + } + return "builtin" + }())) + + color.Set(color.FgHiBlue) + fmt.Printf("\nCopyright 2017-%d CERN and the copyright holders of ALICE O².\n"+ + "This program is free software: you can redistribute it and/or modify \n"+ + "it under the terms of the GNU General Public License as published by \n"+ + "the Free Software Foundation, either version 3 of the License, or \n"+ + "(at your option) any later version.\n", time.Now().Year()) + color.Unset() + + fmt.Printf(` +bugs: %s +code: %s +maintainer: %s +`, + + color.HiBlueString("https://alice.its.cern.ch/jira/projects/OCTRL"), + color.HiBlueString("https://github.com/AliceO2Group/Control"), + color.HiBlueString("Ayaan Zaidi, ")) + }, +} + +func init() { + rootCmd.AddCommand(aboutCmd) +} From a92337bee524e453981c07373bf31a12eacd76ac Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 18:57:44 +0530 Subject: [PATCH 0464/2352] [walnut] change filename from flag to arg --- walnut/cmd/check.go | 14 +++++--------- walnut/cmd/convert.go | 25 ++++++++++--------------- walnut/converter/converter.go | 3 +-- 3 files changed, 16 insertions(+), 26 deletions(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index ea831236d..02e6d7937 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -26,10 +26,11 @@ package cmd import ( "fmt" - "github.com/spf13/viper" "io/ioutil" "os" + "github.com/spf13/viper" + "github.com/AliceO2Group/Control/walnut/schemata" "github.com/spf13/cobra" ) @@ -46,10 +47,9 @@ Valid schema formats: Run: func(cmd *cobra.Command, args []string) { format, _ := cmd.Flags().GetString("format") - filename, _ := cmd.Flags().GetStringArray("filename") - for _, file := range filename { - file, err := ioutil.ReadFile(file) + for _, filename := range args { + file, err := ioutil.ReadFile(filename) if err != nil { fmt.Printf("failed to open file %s: %v", filename, err) os.Exit(1) @@ -61,18 +61,14 @@ Valid schema formats: } } }, + Args: cobra.MinimumNArgs(1), } -var filename []string var format string func init() { rootCmd.AddCommand(checkCmd) - checkCmd.Flags().StringArrayP("filename", "f", []string{}, "files to validate") - viper.BindPFlag("filename", checkCmd.Flags().Lookup("filename")) - checkCmd.MarkFlagRequired("filename") - checkCmd.Flags().StringP("format", "", "", "format to validate against") viper.BindPFlag("format", checkCmd.Flags().Lookup("format")) checkCmd.MarkFlagRequired("format") diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 95f930bfe..59296f678 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -26,12 +26,13 @@ package cmd import ( "fmt" - "github.com/AliceO2Group/Control/core/workflow" - "github.com/AliceO2Group/Control/walnut/converter" - "github.com/spf13/cobra" "github.com/spf13/viper" "io/ioutil" "os" + + "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/walnut/converter" + "github.com/spf13/cobra" ) // convertCmd represents the convert command @@ -40,12 +41,9 @@ var convertCmd = &cobra.Command{ Short: "converts a DPL Dump to the required formats", Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module.`, - Run: func(cmd *cobra.Command, args []string) { - filename, _ := cmd.Flags().GetStringArray("filename") - // FIXME: only accepting first string - modules, _ := cmd.Flags().GetStringArray("modules") - for _, dumpFile := range filename { + Run: func(cmd *cobra.Command, args []string) { + for _, dumpFile := range args { // Strip .json from end of filename nameOfDump := dumpFile[:len(dumpFile)-5] @@ -75,17 +73,14 @@ specify which modules should be used when generating task templates. Control-OCC } } }, + Args: cobra.MinimumNArgs(1), } var modules []string func init() { - rootCmd.AddCommand(convertCmd) - - convertCmd.Flags().StringArrayP("filename", "f", []string{}, "DPL dump to convert") - viper.BindPFlag("filename", convertCmd.Flags().Lookup("filename")) - convertCmd.MarkFlagRequired("filename") + convertCmd.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules to load") + _ = viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) - convertCmd.Flags().StringArrayP("modules", "m", []string{}, "modules to include") - viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) + rootCmd.AddCommand(convertCmd) } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index aac471cae..18cb5235c 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -139,8 +139,7 @@ func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { for _, value := range input { // Check args for dump arguments and remove them if strings.Contains(value, "--dump-workflow") || - strings.Contains(value, "--dump-workflow-file") || - strings.Contains(value, ".json") {} else { + strings.Contains(value, "--dump-workflow-file") {} else { output = append(output, value) } } From 8d2def4fbcbd876d9e5d10840b0b0c8608c990bb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 18:58:35 +0530 Subject: [PATCH 0465/2352] [walnut] doc fixes --- walnut/README.md | 5 ++--- walnut/doc/walnut.md | 4 ++-- walnut/doc/walnut_about.md | 29 +++++++++++++++++++++++++++++ walnut/doc/walnut_check.md | 9 ++++----- walnut/doc/walnut_convert.md | 9 ++++----- 5 files changed, 41 insertions(+), 15 deletions(-) create mode 100644 walnut/doc/walnut_about.md diff --git a/walnut/README.md b/walnut/README.md index 889f8a0cf..61e437428 100644 --- a/walnut/README.md +++ b/walnut/README.md @@ -31,7 +31,6 @@ Available Commands: Flags: --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) -h, --help help for walnut - -t, --toggle Help message for toggle Use "walnut [command] --help" for more information about a command. ``` @@ -44,7 +43,7 @@ $ walnut check ``` Example usage: ```bash -$ walnut check --filename dump.json --format workflow +$ walnut check dump.json --format workflow ``` A successful validation will return no output while any errors will cause the program to exit. @@ -66,7 +65,7 @@ Convert can also receive optional arguments to specify which modules to consider Example usage: ```bash -$ walnut convert --filename dump.json --modules TestValue1 TestValue2 +$ walnut convert dump.json --modules "TestValue1 TestValue2 TestValue3" ``` A successful validation will return no output while any errors will cause the program to exit. diff --git a/walnut/doc/walnut.md b/walnut/doc/walnut.md index b63ae12b7..8451401ab 100644 --- a/walnut/doc/walnut.md +++ b/walnut/doc/walnut.md @@ -13,12 +13,12 @@ For more information on the available commands, see the individual documentation ``` --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) -h, --help help for walnut - -t, --toggle Help message for toggle ``` ### SEE ALSO +* [walnut about](walnut_about.md) - about walnut * [walnut check](walnut_check.md) - validate the file against a specified schema * [walnut convert](walnut_convert.md) - converts a DPL Dump to the required formats -###### Auto generated by spf13/cobra on 9-Jul-2020 +###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_about.md b/walnut/doc/walnut_about.md new file mode 100644 index 000000000..9006334ad --- /dev/null +++ b/walnut/doc/walnut_about.md @@ -0,0 +1,29 @@ +## walnut about + +about walnut + +### Synopsis + +The about command shows some basic information on this utility. + +``` +walnut about [flags] +``` + +### Options + +``` + -h, --help help for about +``` + +### Options inherited from parent commands + +``` + --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) +``` + +### SEE ALSO + +* [walnut](walnut.md) - O² Workflow Administration and Linting Utility + +###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_check.md b/walnut/doc/walnut_check.md index eed64e556..877c3450e 100644 --- a/walnut/doc/walnut_check.md +++ b/walnut/doc/walnut_check.md @@ -11,15 +11,14 @@ Valid schema formats: workflow task dpl_dump ``` -walnut check [flags] +walnut check [agrs] [flags] ``` ### Options ``` - -f, --filename stringArray files to validate - --format string format to validate against - -h, --help help for check + --format string format to validate against + -h, --help help for check ``` ### Options inherited from parent commands @@ -32,4 +31,4 @@ walnut check [flags] * [walnut](walnut.md) - O² Workflow Administration and Linting Utility -###### Auto generated by spf13/cobra on 9-Jul-2020 +###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_convert.md b/walnut/doc/walnut_convert.md index fcf720108..872de6d46 100644 --- a/walnut/doc/walnut_convert.md +++ b/walnut/doc/walnut_convert.md @@ -8,15 +8,14 @@ The convert command takes a DPL input and outputs task and workflow templates. O specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module. ``` -walnut convert [flags] +walnut convert [args] [flags] ``` ### Options ``` - -f, --filename stringArray DPL dump to convert - -h, --help help for convert - -m, --modules stringArray modules to include + -h, --help help for convert + -m, --modules stringArray modules to include ``` ### Options inherited from parent commands @@ -29,4 +28,4 @@ walnut convert [flags] * [walnut](walnut.md) - O² Workflow Administration and Linting Utility -###### Auto generated by spf13/cobra on 9-Jul-2020 +###### Auto generated by spf13/cobra on 10-Jul-2020 From ed7b5eaddf298d61cd486862feaf3787f698994d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 19:31:44 +0530 Subject: [PATCH 0466/2352] [walnut] re-added format flag --- walnut/cmd/check.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go index 02e6d7937..587e0d4b5 100644 --- a/walnut/cmd/check.go +++ b/walnut/cmd/check.go @@ -69,7 +69,7 @@ var format string func init() { rootCmd.AddCommand(checkCmd) - checkCmd.Flags().StringP("format", "", "", "format to validate against") + checkCmd.Flags().StringP("format", "f", "", "format to validate against") viper.BindPFlag("format", checkCmd.Flags().Lookup("format")) checkCmd.MarkFlagRequired("format") } From 92e5f0504a707bbfa508488c4f49b0790fb8fb29 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 19:32:00 +0530 Subject: [PATCH 0467/2352] [walnut] improve sanitizeArgs checks --- walnut/converter/converter.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 18cb5235c..d44fff95a 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -136,10 +136,11 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, } func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { - for _, value := range input { + for index, value := range input { // Check args for dump arguments and remove them if strings.Contains(value, "--dump-workflow") || - strings.Contains(value, "--dump-workflow-file") {} else { + strings.Contains(value, "--dump-workflow-file") || + strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file" {} else { output = append(output, value) } } From 2084d03f37374a629038971a1ff3c00f54bb836a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 10 Jul 2020 19:44:17 +0530 Subject: [PATCH 0468/2352] [walnut] change errors from %v to %w --- walnut/cmd/convert.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 59296f678..e6868acbc 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -49,7 +49,7 @@ specify which modules should be used when generating task templates. Control-OCC file, err := ioutil.ReadFile(dumpFile) if err != nil { - err = fmt.Errorf("failed to open file &s: &v", dumpFile, err) + err = fmt.Errorf("failed to open file &s: &w", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } @@ -59,7 +59,7 @@ specify which modules should be used when generating task templates. Control-OCC err = converter.GenerateTaskTemplate(taskClass, nameOfDump) if err != nil { - err = fmt.Errorf("conversion to task failed for %s: %v", dumpFile, err) + err = fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } @@ -67,7 +67,7 @@ specify which modules should be used when generating task templates. Control-OCC role, err := workflow.LoadDPL(taskClass, nameOfDump) err = converter.GenerateWorkflowTemplate(role, nameOfDump) if err != nil { - err = fmt.Errorf("conversion to workflow failed for %s: %v", dumpFile, err) + err = fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) fmt.Println(err.Error()) os.Exit(1) } From 318bba61541fe5a25b3561de2a2b00c41470b9b7 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 13 Jul 2020 19:04:37 +0530 Subject: [PATCH 0469/2352] [walnut] add output-dir flag --- walnut/cmd/convert.go | 6 ++++-- walnut/cmd/root.go | 6 +++--- walnut/converter/converter.go | 33 ++++++++++++++++++++++----------- 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index e6868acbc..1e030ca40 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -57,7 +57,7 @@ specify which modules should be used when generating task templates. Control-OCC dplDump, err := converter.DPLImporter(file) taskClass, err := converter.ExtractTaskClasses(dplDump, modules) - err = converter.GenerateTaskTemplate(taskClass, nameOfDump) + err = converter.GenerateTaskTemplate(taskClass, outputDir) if err != nil { err = fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) fmt.Println(err.Error()) @@ -65,7 +65,7 @@ specify which modules should be used when generating task templates. Control-OCC } role, err := workflow.LoadDPL(taskClass, nameOfDump) - err = converter.GenerateWorkflowTemplate(role, nameOfDump) + err = converter.GenerateWorkflowTemplate(role, outputDir) if err != nil { err = fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) fmt.Println(err.Error()) @@ -82,5 +82,7 @@ func init() { convertCmd.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules to load") _ = viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) + viper.BindPFlag("output-dir", rootCmd.Flags().Lookup("output-dir")) + rootCmd.AddCommand(convertCmd) } diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index 40e87a98a..1fffef3b0 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -36,6 +36,7 @@ import ( ) var cfgFile string +var outputDir string // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ @@ -71,10 +72,9 @@ func init() { rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) + rootCmd.PersistentFlags().StringVarP(&outputDir, "output-dir", "o", "", + "optional output directory") - // Cobra also supports local flags, which will only run - // when this action is called directly. - rootCmd.Flags().BoolP("toggle", "t", false, "Help message for toggle") } // initConfig reads in config file and ENV variables if set. diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index d44fff95a..c45be4755 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -31,8 +31,7 @@ import ( "path/filepath" "strings" - "github.com/AliceO2Group/Control/core/workflow" - + "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/common" @@ -40,6 +39,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/workflow" ) // return pointer to float64 @@ -99,7 +99,6 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, dplDump.Metadata[correspondingMetadata].Executable) task.Command.Value = &value - for _, channelName := range channelNames { // To avoid duplication, only "push" channels are included if strings.Contains(channelName, "from_"+taskName) { @@ -152,9 +151,15 @@ func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file -func GenerateTaskTemplate(extractedTasks []*task.Class, dumpFileName string) (err error) { - dir, _ := os.Getwd() - path := filepath.Join(dir, dumpFileName, "tasks") +func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err error) { + var dir string + if outputDir == "" { + dir, _ = os.Getwd() + } else { + dir = outputDir + } + path := filepath.Join(dir, "tasks") + path, _ = homedir.Expand(path) os.MkdirAll(path, os.ModePerm) for _, SingleTask := range extractedTasks { @@ -162,7 +167,7 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, dumpFileName string) (er if err != nil { return fmt.Errorf("marshal failed: %v", err) } - fileName := filepath.Join(path, SingleTask.Identifier.Name + ".yaml") + fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") f, err := os.Create(fileName) defer f.Close() @@ -175,9 +180,15 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, dumpFileName string) (er return } -func GenerateWorkflowTemplate(input workflow.Role, dumpFileName string) (err error) { - dir, _ := os.Getwd() - path := filepath.Join(dir, dumpFileName, "workflows") +func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { + var dir string + if outputDir == "" { + dir, _ = os.Getwd() + } else { + dir = outputDir + } + path := filepath.Join(dir, "workflows") + path, _ = homedir.Expand(path) os.MkdirAll(path, os.ModePerm) yamlDATA, err := workflow.RoleToYAML(input) @@ -185,7 +196,7 @@ func GenerateWorkflowTemplate(input workflow.Role, dumpFileName string) (err err return fmt.Errorf("error converting role to YAML: %v", err) } - fileName := filepath.Join(path, input.GetName() + ".yaml") + fileName := filepath.Join(path, input.GetName()+".yaml") err = ioutil.WriteFile(fileName, yamlDATA, 0644) if err != nil { return fmt.Errorf("error writing role to file: %v", err) From eb3001e7ab378d061a5862daebfab61b759e916d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 13 Jul 2020 19:35:30 +0530 Subject: [PATCH 0470/2352] [walnut] confirm overwrite if file exists --- walnut/converter/converter.go | 41 ++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index c45be4755..6fd6fb0a1 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -25,8 +25,10 @@ package converter import ( + "bufio" "fmt" "io/ioutil" + "log" "os" "path/filepath" "strings" @@ -167,7 +169,14 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e if err != nil { return fmt.Errorf("marshal failed: %v", err) } + fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") + if _, err := os.Stat(fileName); os.IsNotExist(err) {} else { + if confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) {} else { + continue + } + } + f, err := os.Create(fileName) defer f.Close() @@ -180,6 +189,29 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return } +// confirmOverwrite takes an input string message to show the user and receive a yes/no response +// if anything other than y/n provided, keep asking +func confirmOverwrite (ask string) bool { + reader := bufio.NewReader(os.Stdin) + + for { + fmt.Printf("%s [y/n]", ask) + response, err := reader.ReadString('\n') + if err != nil { + log.Fatal(err) + } + response = strings.ToLower(strings.TrimSpace(response)) + + if response == "y" || response == "yes" { + return true + } else if response == "n" || response == "no" { + return false + } else { + fmt.Printf("Invalid response\n") + } + } +} + func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { var dir string if outputDir == "" { @@ -197,10 +229,17 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) } fileName := filepath.Join(path, input.GetName()+".yaml") + if _, err := os.Stat(fileName); os.IsNotExist(err) {} else { + if confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) {} else { + // return here get shadowed + goto EXIT + } + } + err = ioutil.WriteFile(fileName, yamlDATA, 0644) if err != nil { return fmt.Errorf("error writing role to file: %v", err) } - return + EXIT: return } From 5b5ed7e86aadd9429f99ab027dbcdb81c7c7f23e Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 15 Jul 2020 14:20:46 +0530 Subject: [PATCH 0471/2352] [walnut] move output flag to convertCmd --- walnut/cmd/convert.go | 7 +++++-- walnut/cmd/root.go | 4 ---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 1e030ca40..55905ecb4 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -35,6 +35,9 @@ import ( "github.com/spf13/cobra" ) +var outputDir string +var modules []string + // convertCmd represents the convert command var convertCmd = &cobra.Command{ Use: "convert", @@ -76,12 +79,12 @@ specify which modules should be used when generating task templates. Control-OCC Args: cobra.MinimumNArgs(1), } -var modules []string - func init() { convertCmd.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules to load") _ = viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) + convertCmd.PersistentFlags().StringVarP(&outputDir, "output-dir", "o", "", + "optional output directory") viper.BindPFlag("output-dir", rootCmd.Flags().Lookup("output-dir")) rootCmd.AddCommand(convertCmd) diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go index 1fffef3b0..ef6a7db1b 100644 --- a/walnut/cmd/root.go +++ b/walnut/cmd/root.go @@ -36,7 +36,6 @@ import ( ) var cfgFile string -var outputDir string // rootCmd represents the base command when called without any subcommands var rootCmd = &cobra.Command{ @@ -72,9 +71,6 @@ func init() { rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) - rootCmd.PersistentFlags().StringVarP(&outputDir, "output-dir", "o", "", - "optional output directory") - } // initConfig reads in config file and ENV variables if set. From 3437ac9d9e22c3e852e74c7643cfa682847f8dcb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 15 Jul 2020 14:25:56 +0530 Subject: [PATCH 0472/2352] [walnut] make if blocks more idiomatic --- walnut/converter/converter.go | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 6fd6fb0a1..a1fd9263d 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -139,9 +139,9 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { for index, value := range input { // Check args for dump arguments and remove them - if strings.Contains(value, "--dump-workflow") || - strings.Contains(value, "--dump-workflow-file") || - strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file" {} else { + if !strings.Contains(value, "--dump-workflow") || + !strings.Contains(value, "--dump-workflow-file") || + !strings.Contains(value, ".json") && input[index-1] != "--dump-workflow-file" { output = append(output, value) } } @@ -171,8 +171,8 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e } fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") - if _, err := os.Stat(fileName); os.IsNotExist(err) {} else { - if confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) {} else { + if _, err := os.Stat(fileName); !os.IsNotExist(err) { + if !confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) { continue } } @@ -229,10 +229,9 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) } fileName := filepath.Join(path, input.GetName()+".yaml") - if _, err := os.Stat(fileName); os.IsNotExist(err) {} else { - if confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) {} else { - // return here get shadowed - goto EXIT + if _, err := os.Stat(fileName); !os.IsNotExist(err) { + if !confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) { + return nil } } @@ -241,5 +240,5 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) return fmt.Errorf("error writing role to file: %v", err) } - EXIT: return + return } From 0309956b2668070dbf526221115e61972050839f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 15 Jul 2020 14:42:09 +0530 Subject: [PATCH 0473/2352] [walnut] use promptui for user input --- walnut/converter/converter.go | 38 ++++++++++------------------------- 1 file changed, 11 insertions(+), 27 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index a1fd9263d..d0988a47f 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -25,14 +25,13 @@ package converter import ( - "bufio" "fmt" "io/ioutil" - "log" "os" "path/filepath" "strings" + "github.com/manifoldco/promptui" "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v3" @@ -172,7 +171,11 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - if !confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) { + prompt := promptui.Select{ + Label: fmt.Sprintf("%s already exists, overwrite?", fileName), + Items: []string{"yes", "no"}, + } + if _, result, _ := prompt.Run(); result == "no" { continue } } @@ -189,29 +192,6 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return } -// confirmOverwrite takes an input string message to show the user and receive a yes/no response -// if anything other than y/n provided, keep asking -func confirmOverwrite (ask string) bool { - reader := bufio.NewReader(os.Stdin) - - for { - fmt.Printf("%s [y/n]", ask) - response, err := reader.ReadString('\n') - if err != nil { - log.Fatal(err) - } - response = strings.ToLower(strings.TrimSpace(response)) - - if response == "y" || response == "yes" { - return true - } else if response == "n" || response == "no" { - return false - } else { - fmt.Printf("Invalid response\n") - } - } -} - func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { var dir string if outputDir == "" { @@ -230,7 +210,11 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) fileName := filepath.Join(path, input.GetName()+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - if !confirmOverwrite(fmt.Sprintf("%s already exists, overwrite?", fileName)) { + prompt := promptui.Select{ + Label: fmt.Sprintf("%s already exists, overwrite?", fileName), + Items: []string{"yes", "no"}, + } + if _, result, _ := prompt.Run(); result == "no" { return nil } } From 3867dee4613431df44cc63b1fac09053eec7a7a4 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 17 Jul 2020 00:03:15 +0530 Subject: [PATCH 0474/2352] [walnut] detect if output is git directory --- walnut/cmd/convert.go | 42 +++++++++++++++++++++++++++++++++-- walnut/converter/converter.go | 21 +++++------------- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 55905ecb4..e4f95b882 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -25,14 +25,21 @@ package cmd import ( + "bufio" "fmt" - "github.com/spf13/viper" "io/ioutil" + "log" "os" + "os/exec" + "strconv" + "strings" + + "github.com/mitchellh/go-homedir" + "github.com/spf13/cobra" + "github.com/spf13/viper" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/walnut/converter" - "github.com/spf13/cobra" ) var outputDir string @@ -60,6 +67,25 @@ specify which modules should be used when generating task templates. Control-OCC dplDump, err := converter.DPLImporter(file) taskClass, err := converter.ExtractTaskClasses(dplDump, modules) + if outputDir == "" { + outputDir, _ = os.Getwd() + } + outputDir, _ = homedir.Expand(outputDir) + + runGitCmd := func(args []string) string { + cmd := exec.Command("git", args...) + cmd.Dir = outputDir + out, err := cmd.Output() + if err != nil { + log.Fatal(err) + } + + return string(out) + } + + isGitRepo, _ := strconv.ParseBool(strings.TrimSpace( + runGitCmd([]string{"rev-parse", "--is-inside-work-tree"}))) + err = converter.GenerateTaskTemplate(taskClass, outputDir) if err != nil { err = fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) @@ -74,6 +100,18 @@ specify which modules should be used when generating task templates. Control-OCC fmt.Println(err.Error()) os.Exit(1) } + + if isGitRepo { + fmt.Print("Press 'Enter' to view git diff...") + bufio.NewReader(os.Stdin).ReadBytes('\n') + fmt.Print(runGitCmd([]string{"diff"})) + + fmt.Print("Press 'Enter' to view git status...") + bufio.NewReader(os.Stdin).ReadBytes('\n') + fmt.Printf(runGitCmd([]string{"status"})) + + fmt.Print("You can commit/reset the changes") + } } }, Args: cobra.MinimumNArgs(1), diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index d0988a47f..57c4aa4f3 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -153,15 +153,9 @@ func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err error) { - var dir string - if outputDir == "" { - dir, _ = os.Getwd() - } else { - dir = outputDir - } - path := filepath.Join(dir, "tasks") + path := filepath.Join(outputDir, "tasks") path, _ = homedir.Expand(path) - os.MkdirAll(path, os.ModePerm) + _ = os.MkdirAll(path, os.ModePerm) for _, SingleTask := range extractedTasks { YAMLData, err := yaml.Marshal(&SingleTask) @@ -189,19 +183,14 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return fmt.Errorf("creating file failed: %v", err) } } + return } func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { - var dir string - if outputDir == "" { - dir, _ = os.Getwd() - } else { - dir = outputDir - } - path := filepath.Join(dir, "workflows") + path := filepath.Join(outputDir, "workflows") path, _ = homedir.Expand(path) - os.MkdirAll(path, os.ModePerm) + _ = os.MkdirAll(path, os.ModePerm) yamlDATA, err := workflow.RoleToYAML(input) if err != nil { From 7d8e2406c9a5832b900c725c33b6f6890ea396ea Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sun, 19 Jul 2020 04:40:05 +0530 Subject: [PATCH 0475/2352] [walnut] replace promptui with survey/v2 --- walnut/cmd/convert.go | 18 ++++++++++-------- walnut/converter/converter.go | 24 ++++++++++++++---------- 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index e4f95b882..322df7869 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -25,7 +25,6 @@ package cmd import ( - "bufio" "fmt" "io/ioutil" "log" @@ -34,6 +33,7 @@ import ( "strconv" "strings" + "github.com/AlecAivazis/survey/v2" "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" @@ -102,15 +102,17 @@ specify which modules should be used when generating task templates. Control-OCC } if isGitRepo { - fmt.Print("Press 'Enter' to view git diff...") - bufio.NewReader(os.Stdin).ReadBytes('\n') - fmt.Print(runGitCmd([]string{"diff"})) - - fmt.Print("Press 'Enter' to view git status...") - bufio.NewReader(os.Stdin).ReadBytes('\n') fmt.Printf(runGitCmd([]string{"status"})) - fmt.Print("You can commit/reset the changes") + result := true + prompt := &survey.Confirm{ + Message: "Would you like to view the git diff?", + } + _ = survey.AskOne(prompt, &result) + + if result { + fmt.Printf(runGitCmd([]string{"diff"})) + } } } }, diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 57c4aa4f3..26665faa7 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -31,7 +31,7 @@ import ( "path/filepath" "strings" - "github.com/manifoldco/promptui" + "github.com/AlecAivazis/survey/v2" "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v3" @@ -165,11 +165,13 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - prompt := promptui.Select{ - Label: fmt.Sprintf("%s already exists, overwrite?", fileName), - Items: []string{"yes", "no"}, + // default to false + result := false + prompt := &survey.Confirm{ + Message: fmt.Sprintf("%s already exists, overwrite?", fileName), } - if _, result, _ := prompt.Run(); result == "no" { + _ = survey.AskOne(prompt, &result) + if result { continue } } @@ -183,7 +185,7 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return fmt.Errorf("creating file failed: %v", err) } } - + return } @@ -199,11 +201,13 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) fileName := filepath.Join(path, input.GetName()+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - prompt := promptui.Select{ - Label: fmt.Sprintf("%s already exists, overwrite?", fileName), - Items: []string{"yes", "no"}, + // default to false + result := false + prompt := &survey.Confirm{ + Message: fmt.Sprintf("%s already exists, overwrite?", fileName), } - if _, result, _ := prompt.Run(); result == "no" { + _ = survey.AskOne(prompt, &result) + if result { return nil } } From e811da353cfcd253afe5de6e02bf75f6597c60da Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sun, 19 Jul 2020 04:44:51 +0530 Subject: [PATCH 0476/2352] [walnut] capitalize default prompt response --- walnut/cmd/convert.go | 1 + walnut/converter/converter.go | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 322df7869..b87f0491d 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -107,6 +107,7 @@ specify which modules should be used when generating task templates. Control-OCC result := true prompt := &survey.Confirm{ Message: "Would you like to view the git diff?", + Default: true, } _ = survey.AskOne(prompt, &result) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 26665faa7..f4876ce59 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -165,10 +165,10 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - // default to false result := false prompt := &survey.Confirm{ Message: fmt.Sprintf("%s already exists, overwrite?", fileName), + Default: false, } _ = survey.AskOne(prompt, &result) if result { @@ -201,10 +201,10 @@ func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) fileName := filepath.Join(path, input.GetName()+".yaml") if _, err := os.Stat(fileName); !os.IsNotExist(err) { - // default to false result := false prompt := &survey.Confirm{ Message: fmt.Sprintf("%s already exists, overwrite?", fileName), + Default: false, } _ = survey.AskOne(prompt, &result) if result { From e51a9a5f55dec210f5773f0ae35027fd865a7683 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sun, 19 Jul 2020 05:18:45 +0530 Subject: [PATCH 0477/2352] [walnut] fix if block negations --- walnut/converter/converter.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index f4876ce59..df5965a06 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -138,10 +138,9 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { for index, value := range input { // Check args for dump arguments and remove them - if !strings.Contains(value, "--dump-workflow") || - !strings.Contains(value, "--dump-workflow-file") || - !strings.Contains(value, ".json") && input[index-1] != "--dump-workflow-file" { - output = append(output, value) + if !(strings.Contains(value, "--dump-workflow") || + (strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file")) { + output = append(output, value) } } // Add --id parameter along with name of task to arguments From 3d6784058f4d76d8a423c2c29cfcae601e50bba6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 27 Jul 2020 04:30:53 +0530 Subject: [PATCH 0478/2352] [walnut] load existing workflows --- core/workflow/iteratorrole.go | 23 +++++++++ core/workflow/loadWorkflow.go | 38 ++++++++++++++ walnut/converter/converter_test.go | 22 ++++++++ walnut/converter/readout-qc.yaml | 83 ++++++++++++++++++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 core/workflow/loadWorkflow.go create mode 100644 walnut/converter/readout-qc.yaml diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 2e8731e75..48376c31b 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -118,6 +118,29 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err return } +func (i *iteratorRole) MarshalYAML() (interface{}, error) { + aux := make(map[string]interface{}) + + base := i.template.GetParentRole().(*aggregatorRole) + auxRole, err := base.MarshalYAML() + auxAggregator, err := i.aggregator.MarshalYAML() + + mapRole := auxRole.(map[string]interface{}) + mapAggregator := auxAggregator.(map[string]interface{}) + + for k, v := range mapRole { + aux[k] = v + } + + for k, v := range mapAggregator { + aux[k] = v + } + + aux["for"], err = IteratorRoleToYAML(i.For) + + return aux, err +} + func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) for _, chr := range i.Roles { diff --git a/core/workflow/loadWorkflow.go b/core/workflow/loadWorkflow.go new file mode 100644 index 000000000..003c7dc0f --- /dev/null +++ b/core/workflow/loadWorkflow.go @@ -0,0 +1,38 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "gopkg.in/yaml.v2" +) + +func LoadWorkflow(input []byte) (loaded iteratorRole, err error) { + err = yaml.Unmarshal(input, &loaded) + return loaded, err +} + +func IteratorRoleToYAML(input iteratorRange) ([]byte, error) { + return yaml.Marshal(input.(*iteratorRangeFor)) +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 973a3cdd9..e1fe5cc5d 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -26,6 +26,7 @@ package converter import ( "io/ioutil" + "os" "testing" "github.com/AliceO2Group/Control/core/workflow" @@ -91,3 +92,24 @@ func TestGenerateWorkflowTemplate(t *testing.T) { } }) } + +func TestLoadWorkflow(t *testing.T) { + t.Run("test loading WFT", func(t *testing.T) { + f, err := ioutil.ReadFile("readout-qc.yaml") + if err != nil { + t.Errorf("opening file failed: %s", err) + } + + output, err := workflow.LoadWorkflow(f) + if err != nil { + t.Errorf("load workflow failed: %s", err) + } + pp.Println(output) + + var holder workflow.Role + holder = &output + wd, _ := os.Getwd() + + _ = GenerateWorkflowTemplate(holder, wd +"/test") + }) +} \ No newline at end of file diff --git a/walnut/converter/readout-qc.yaml b/walnut/converter/readout-qc.yaml new file mode 100644 index 000000000..3d4ac88c2 --- /dev/null +++ b/walnut/converter/readout-qc.yaml @@ -0,0 +1,83 @@ +name: readout-qc +defaults: + monitoring_qc_url: "no-op://" + monitoring_dd_url: "no-op://" + monitoring_readout_url: "no-op://" +roles: + - name: readout-{{ it }} + for: + range: "{{ hosts }}" + var: it + constraints: + - attribute: machine_id + value: "{{ it }}" + vars: + readout_cfg_uri: "file:/home/flp/readout.cfg" + roles: + - name: "readout" + task: + load: readout + - name: qc-single-subwf + defaults: + qchost: "{{ FromJson(hosts)[0] }}" + dpl_config: "/etc/flp.d/qc/readout-qc.dpl.json" + constraints: + - attribute: machine_id + value: "{{ qchost }}" + roles: + - name: "readout-proxy" + connect: + - name: "from_internal-dpl-clock_to_readout-proxy" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_readout-proxy" + type: "pull" + rateLogging: "60" + - name: "readout-proxy" + target: "ipc:///tmp/readout-pipe-1" + # readout.cfg [consumer-data-sampling] is hardcoded as channel "data-out" with type: pub and transport: zeromq + # shmem is only possible in push-pull mode + type: "sub" + rateLogging: "1" + task: + load: readout-proxy + - name: "internal-dpl-clock" + task: + load: readout-internal-dpl-clock + - name: "Dispatcher" + connect: + - name: "from_readout-proxy_to_Dispatcher" + target: "{{Parent().Path}}.readout-proxy:from_readout-proxy_to_Dispatcher" + type: "pull" + rateLogging: "60" + - name: "from_internal-dpl-clock_to_Dispatcher" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_Dispatcher" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-dispatcher + - name: "QC-TASK-RUNNER-daqTask" + connect: + - name: "from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" + type: "pull" + rateLogging: "60" + - name: "from_Dispatcher_to_QC-TASK-RUNNER-daqTask" + target: "{{Parent().Path}}.Dispatcher:from_Dispatcher_to_QC-TASK-RUNNER-daqTask" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-task-runner + - name: "QC-CHECK-RUNNER-Q4H0" + connect: + - name: "from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" + target: "{{Parent().Path}}.QC-TASK-RUNNER-daqTask:from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-check-runner + - name: "internal-dpl-global-binary-file-sink" + connect: + - name: "from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" + target: "{{Parent().Path}}.QC-CHECK-RUNNER-Q4H0:from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" + type: "pull" + task: + load: readout-internal-dpl-global-binary-file-sink From 35c918b8df894d864b7517f2e3c0db5f02b9d611 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 28 Jul 2020 06:57:38 +0530 Subject: [PATCH 0479/2352] [walnut] check if YAML is aggregator or iterator --- core/workflow/iteratorrole.go | 21 +++---------- core/workflow/loadDPL.go | 8 +++-- core/workflow/loadWorkflow.go | 50 +++++++++++++++++++++++++++--- walnut/converter/converter.go | 4 +-- walnut/converter/converter_test.go | 25 ++++++++++----- 5 files changed, 75 insertions(+), 33 deletions(-) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 48376c31b..5a753ccaa 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -121,24 +121,11 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err func (i *iteratorRole) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - base := i.template.GetParentRole().(*aggregatorRole) - auxRole, err := base.MarshalYAML() - auxAggregator, err := i.aggregator.MarshalYAML() + aux["aggregator"] = i.aggregator + aux["for"] = i.For + aux["roles"] = i.template - mapRole := auxRole.(map[string]interface{}) - mapAggregator := auxAggregator.(map[string]interface{}) - - for k, v := range mapRole { - aux[k] = v - } - - for k, v := range mapAggregator { - aux[k] = v - } - - aux["for"], err = IteratorRoleToYAML(i.For) - - return aux, err + return aux, nil } func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index e84437683..882a6d05d 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -67,6 +67,10 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error // RoleToYAML exists to avoid exporting aggregatorRole. Simply put, this function is nothing but a wrapper // which allows marshalling Roles outside the workflow package -func RoleToYAML(input Role) ([]byte, error) { - return yaml.Marshal(input.(*aggregatorRole)) +func RoleToYAML(input Role, isAggregator bool) ([]byte, error) { + if isAggregator { + return yaml.Marshal(input.(*aggregatorRole)) + } else { + return yaml.Marshal(input.(*iteratorRole)) + } } diff --git a/core/workflow/loadWorkflow.go b/core/workflow/loadWorkflow.go index 003c7dc0f..120d5085e 100644 --- a/core/workflow/loadWorkflow.go +++ b/core/workflow/loadWorkflow.go @@ -25,14 +25,54 @@ package workflow import ( + "fmt" + + "github.com/k0kubun/pp" "gopkg.in/yaml.v2" ) -func LoadWorkflow(input []byte) (loaded iteratorRole, err error) { - err = yaml.Unmarshal(input, &loaded) - return loaded, err +func LoadWorkflow(input []byte) (i *iteratorRole, a *aggregatorRole, err error) { + // Unmarshal given YAML to map[string]interface{} + var yamlData map[string]interface{} + err = yaml.Unmarshal(input, &yamlData) + if err != nil { + log.Fatal(err) + } + isFor := false + + if _, ok := yamlData["roles"]; ok { + for idx := range yamlData["roles"].([]interface{}) { + switch v := yamlData["roles"].([]interface{})[idx].(type) { + case map[interface{}]interface{}: + if _, ok := v["for"]; ok { + isFor = ok + } + } + } + } + + if isFor { + err := yaml.Unmarshal(input, &i) + if err != nil { + return i, a, fmt.Errorf("%w", err) + } + return i, a, nil + } else { + err := yaml.Unmarshal(input, &a) + if err != nil { + log.Fatal(err) + } + return i, a, nil + } + + return } -func IteratorRoleToYAML(input iteratorRange) ([]byte, error) { - return yaml.Marshal(input.(*iteratorRangeFor)) +func UnmarshalIterator(input []byte) (output *iteratorRole, err error) { + err = yaml.Unmarshal(input, &output) + if err != nil { + log.Fatal(err) + } + _, _ = pp.Println(&output) + return } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index df5965a06..a1965d00e 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -188,12 +188,12 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return } -func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { +func GenerateWorkflowTemplate(input workflow.Role, isIterator bool, outputDir string) (err error) { path := filepath.Join(outputDir, "workflows") path, _ = homedir.Expand(path) _ = os.MkdirAll(path, os.ModePerm) - yamlDATA, err := workflow.RoleToYAML(input) + yamlDATA, err := workflow.RoleToYAML(input, isIterator) if err != nil { return fmt.Errorf("error converting role to YAML: %v", err) } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index e1fe5cc5d..e0d7a14a9 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -29,8 +29,9 @@ import ( "os" "testing" - "github.com/AliceO2Group/Control/core/workflow" "github.com/k0kubun/pp" + + "github.com/AliceO2Group/Control/core/workflow" ) func TestExtractClass(t *testing.T) { @@ -86,7 +87,7 @@ func TestGenerateWorkflowTemplate(t *testing.T) { t.Errorf("error loading task to role: %v", err) } - err = GenerateWorkflowTemplate(role, "dump") + err = GenerateWorkflowTemplate(role, false, "dump") if err != nil { t.Errorf("error converting Role to YAML: %v", err) } @@ -100,16 +101,26 @@ func TestLoadWorkflow(t *testing.T) { t.Errorf("opening file failed: %s", err) } - output, err := workflow.LoadWorkflow(f) + i, a, err := workflow.LoadWorkflow(f) if err != nil { t.Errorf("load workflow failed: %s", err) } - pp.Println(output) var holder workflow.Role - holder = &output + if i == nil { + holder = a + } else if a == nil { + holder = i + } + wd, _ := os.Getwd() + _ = GenerateWorkflowTemplate(holder, i == nil, wd+"/test") + }) +} - _ = GenerateWorkflowTemplate(holder, wd +"/test") +func TestIteratorUnmarshal(t *testing.T) { + t.Run("unmarshal iterator", func(t *testing.T) { + f, _ := ioutil.ReadFile("readout-qc.yaml") + _, _ = workflow.UnmarshalIterator(f) }) -} \ No newline at end of file +} From 85cfff857cb37b731c5d986637fcf4eb4b00334b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 30 Jul 2020 06:37:43 +0530 Subject: [PATCH 0480/2352] [walnut] modify MarshalYAML for roleBase, aggregatorRole and iteratorRole --- core/workflow/aggregatorrole.go | 10 ++++------ core/workflow/iteratorrole.go | 12 ++++++++---- core/workflow/rolebase.go | 10 ++++++---- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 7ec8f5cdb..54cb05d23 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -69,16 +69,14 @@ func (r *aggregatorRole) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) auxAggregator, err := r.aggregator.MarshalYAML() - auxRoleBase, err := r.roleBase.MarshalYAML() - - mapRoleBase := auxRoleBase.(map[string]interface{}) mapAggregator := auxAggregator.(map[string]interface{}) - - for k, v := range mapRoleBase { + for k, v := range mapAggregator { aux[k] = v } - for k, v := range mapAggregator { + auxRoleBase, err := r.roleBase.MarshalYAML() + mapRoleBase := auxRoleBase.(map[string]interface{}) + for k, v := range mapRoleBase { aux[k] = v } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 5a753ccaa..6e9934b71 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -121,11 +121,15 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err func (i *iteratorRole) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - aux["aggregator"] = i.aggregator - aux["for"] = i.For - aux["roles"] = i.template + auxRole, err := i.template.(Role).(*aggregatorTemplate).aggregatorRole.MarshalYAML() + mapRoleBase := auxRole.(map[string]interface{}) + for k, v := range mapRoleBase { + aux[k] = v + } + + aux["for"] = i.For - return aux, nil + return aux, err } func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 0355fc054..be8c9d428 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -55,8 +55,8 @@ type roleBase struct { status SafeStatus state SafeState - Defaults *gera.StringWrapMap `yaml:"defaults"` - Vars *gera.StringWrapMap `yaml:"vars"` + Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` + Vars *gera.StringWrapMap `yaml:"vars,omitempty"` UserVars *gera.StringWrapMap `yaml:"-"` Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role Bind []channel.Inbound `yaml:"bind,omitempty"` @@ -192,9 +192,11 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) aux["name"] = r.Name - aux["defaults"] = r.Defaults - aux["constraints"] = r.Constraints aux["connect"] = r.Connect + aux["constraints"] = r.Constraints + aux["defaults"] = r.Defaults.Raw() + aux["vars"] = r.Vars.Raw() + aux["bind"] = r.Bind return aux, nil } From f3904203ba6d5ea5f27203497e159247f7148209 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 30 Jul 2020 06:38:14 +0530 Subject: [PATCH 0481/2352] [walnut] remove isAggregator flag --- core/workflow/loadDPL.go | 9 ++-- core/workflow/loadWorkflow.go | 49 +++--------------- walnut/converter/converter.go | 4 +- walnut/converter/converter_test.go | 31 +++-------- walnut/converter/readout-qc.yaml | 83 ------------------------------ 5 files changed, 21 insertions(+), 155 deletions(-) delete mode 100644 walnut/converter/readout-qc.yaml diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 882a6d05d..7eb897c57 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -67,10 +67,13 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error // RoleToYAML exists to avoid exporting aggregatorRole. Simply put, this function is nothing but a wrapper // which allows marshalling Roles outside the workflow package -func RoleToYAML(input Role, isAggregator bool) ([]byte, error) { - if isAggregator { +func RoleToYAML(input Role) ([]byte, error) { + switch input.(type) { + case *aggregatorRole: return yaml.Marshal(input.(*aggregatorRole)) - } else { + case *iteratorRole: return yaml.Marshal(input.(*iteratorRole)) + default: + return nil, nil } } diff --git a/core/workflow/loadWorkflow.go b/core/workflow/loadWorkflow.go index 120d5085e..8f38c8053 100644 --- a/core/workflow/loadWorkflow.go +++ b/core/workflow/loadWorkflow.go @@ -25,54 +25,17 @@ package workflow import ( - "fmt" - - "github.com/k0kubun/pp" "gopkg.in/yaml.v2" ) -func LoadWorkflow(input []byte) (i *iteratorRole, a *aggregatorRole, err error) { - // Unmarshal given YAML to map[string]interface{} - var yamlData map[string]interface{} - err = yaml.Unmarshal(input, &yamlData) +func LoadWorkflow(input []byte) (workflow Role, err error) { + root := new(aggregatorRole) + err = yaml.Unmarshal(input, &root) if err != nil { - log.Fatal(err) - } - isFor := false - - if _, ok := yamlData["roles"]; ok { - for idx := range yamlData["roles"].([]interface{}) { - switch v := yamlData["roles"].([]interface{})[idx].(type) { - case map[interface{}]interface{}: - if _, ok := v["for"]; ok { - isFor = ok - } - } - } - } - - if isFor { - err := yaml.Unmarshal(input, &i) - if err != nil { - return i, a, fmt.Errorf("%w", err) - } - return i, a, nil - } else { - err := yaml.Unmarshal(input, &a) - if err != nil { - log.Fatal(err) - } - return i, a, nil + return workflow, err } - return -} + workflow = root -func UnmarshalIterator(input []byte) (output *iteratorRole, err error) { - err = yaml.Unmarshal(input, &output) - if err != nil { - log.Fatal(err) - } - _, _ = pp.Println(&output) - return + return workflow, nil } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index a1965d00e..df5965a06 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -188,12 +188,12 @@ func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err e return } -func GenerateWorkflowTemplate(input workflow.Role, isIterator bool, outputDir string) (err error) { +func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { path := filepath.Join(outputDir, "workflows") path, _ = homedir.Expand(path) _ = os.MkdirAll(path, os.ModePerm) - yamlDATA, err := workflow.RoleToYAML(input, isIterator) + yamlDATA, err := workflow.RoleToYAML(input) if err != nil { return fmt.Errorf("error converting role to YAML: %v", err) } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index e0d7a14a9..d6497fc7d 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -87,40 +87,23 @@ func TestGenerateWorkflowTemplate(t *testing.T) { t.Errorf("error loading task to role: %v", err) } - err = GenerateWorkflowTemplate(role, false, "dump") + err = GenerateWorkflowTemplate(role, "dump") if err != nil { t.Errorf("error converting Role to YAML: %v", err) } }) } -func TestLoadWorkflow(t *testing.T) { - t.Run("test loading WFT", func(t *testing.T) { - f, err := ioutil.ReadFile("readout-qc.yaml") - if err != nil { - t.Errorf("opening file failed: %s", err) - } - i, a, err := workflow.LoadWorkflow(f) +func TestLoadWorkflow(t *testing.T) { + t.Run("unmarshal iterator", func(t *testing.T) { + f, _ := ioutil.ReadFile("dump.yaml") + result, err := workflow.LoadWorkflow(f) if err != nil { - t.Errorf("load workflow failed: %s", err) + t.Errorf("iterator role unmarshal failed: %s", err) } - - var holder workflow.Role - if i == nil { - holder = a - } else if a == nil { - holder = i - } - wd, _ := os.Getwd() - _ = GenerateWorkflowTemplate(holder, i == nil, wd+"/test") - }) -} -func TestIteratorUnmarshal(t *testing.T) { - t.Run("unmarshal iterator", func(t *testing.T) { - f, _ := ioutil.ReadFile("readout-qc.yaml") - _, _ = workflow.UnmarshalIterator(f) + _ = GenerateWorkflowTemplate(result, wd+"/test/") }) } diff --git a/walnut/converter/readout-qc.yaml b/walnut/converter/readout-qc.yaml deleted file mode 100644 index 3d4ac88c2..000000000 --- a/walnut/converter/readout-qc.yaml +++ /dev/null @@ -1,83 +0,0 @@ -name: readout-qc -defaults: - monitoring_qc_url: "no-op://" - monitoring_dd_url: "no-op://" - monitoring_readout_url: "no-op://" -roles: - - name: readout-{{ it }} - for: - range: "{{ hosts }}" - var: it - constraints: - - attribute: machine_id - value: "{{ it }}" - vars: - readout_cfg_uri: "file:/home/flp/readout.cfg" - roles: - - name: "readout" - task: - load: readout - - name: qc-single-subwf - defaults: - qchost: "{{ FromJson(hosts)[0] }}" - dpl_config: "/etc/flp.d/qc/readout-qc.dpl.json" - constraints: - - attribute: machine_id - value: "{{ qchost }}" - roles: - - name: "readout-proxy" - connect: - - name: "from_internal-dpl-clock_to_readout-proxy" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_readout-proxy" - type: "pull" - rateLogging: "60" - - name: "readout-proxy" - target: "ipc:///tmp/readout-pipe-1" - # readout.cfg [consumer-data-sampling] is hardcoded as channel "data-out" with type: pub and transport: zeromq - # shmem is only possible in push-pull mode - type: "sub" - rateLogging: "1" - task: - load: readout-proxy - - name: "internal-dpl-clock" - task: - load: readout-internal-dpl-clock - - name: "Dispatcher" - connect: - - name: "from_readout-proxy_to_Dispatcher" - target: "{{Parent().Path}}.readout-proxy:from_readout-proxy_to_Dispatcher" - type: "pull" - rateLogging: "60" - - name: "from_internal-dpl-clock_to_Dispatcher" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_Dispatcher" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-dispatcher - - name: "QC-TASK-RUNNER-daqTask" - connect: - - name: "from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" - type: "pull" - rateLogging: "60" - - name: "from_Dispatcher_to_QC-TASK-RUNNER-daqTask" - target: "{{Parent().Path}}.Dispatcher:from_Dispatcher_to_QC-TASK-RUNNER-daqTask" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-task-runner - - name: "QC-CHECK-RUNNER-Q4H0" - connect: - - name: "from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" - target: "{{Parent().Path}}.QC-TASK-RUNNER-daqTask:from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-check-runner - - name: "internal-dpl-global-binary-file-sink" - connect: - - name: "from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" - target: "{{Parent().Path}}.QC-CHECK-RUNNER-Q4H0:from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" - type: "pull" - task: - load: readout-internal-dpl-global-binary-file-sink From 7272d4691b1fe3dbdbfb37e47ae277a759ef6212 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 30 Jul 2020 07:02:24 +0530 Subject: [PATCH 0482/2352] [walnut] move LoadWorkflow into loadDPL.go --- core/workflow/loadDPL.go | 16 ++++++++++++-- core/workflow/loadWorkflow.go | 41 ----------------------------------- 2 files changed, 14 insertions(+), 43 deletions(-) delete mode 100644 core/workflow/loadWorkflow.go diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go index 7eb897c57..fd260afee 100644 --- a/core/workflow/loadDPL.go +++ b/core/workflow/loadDPL.go @@ -65,8 +65,8 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error return workflow, nil } -// RoleToYAML exists to avoid exporting aggregatorRole. Simply put, this function is nothing but a wrapper -// which allows marshalling Roles outside the workflow package +// RoleToYAML exists to avoid exporting aggregatorRole/iteratorRole. +// Simply put, this function is nothing but a wrapper which allows marshalling Roles outside the workflow package func RoleToYAML(input Role) ([]byte, error) { switch input.(type) { case *aggregatorRole: @@ -77,3 +77,15 @@ func RoleToYAML(input Role) ([]byte, error) { return nil, nil } } + +func LoadWorkflow(input []byte) (workflow Role, err error) { + root := new(aggregatorRole) + err = yaml.Unmarshal(input, &root) + if err != nil { + return workflow, err + } + + workflow = root + + return workflow, nil +} diff --git a/core/workflow/loadWorkflow.go b/core/workflow/loadWorkflow.go deleted file mode 100644 index 8f38c8053..000000000 --- a/core/workflow/loadWorkflow.go +++ /dev/null @@ -1,41 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -import ( - "gopkg.in/yaml.v2" -) - -func LoadWorkflow(input []byte) (workflow Role, err error) { - root := new(aggregatorRole) - err = yaml.Unmarshal(input, &root) - if err != nil { - return workflow, err - } - - workflow = root - - return workflow, nil -} From 5043f84611584822cd1d04d57ff5c2dbd23f6bb3 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 31 Jul 2020 04:29:19 +0530 Subject: [PATCH 0483/2352] [walnut] move LoadDPL/Workflow to load.go --- core/workflow/load.go | 61 +++++++++++++++++++++++++++ core/workflow/loadDPL.go | 91 ---------------------------------------- 2 files changed, 61 insertions(+), 91 deletions(-) delete mode 100644 core/workflow/loadDPL.go diff --git a/core/workflow/load.go b/core/workflow/load.go index 0331cf264..6e9e73b2f 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -30,6 +30,7 @@ import ( "os" "time" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -97,3 +98,63 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user err = taskManager.RefreshClasses(taskClassesRequired) return } + +func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error) { + // FIXME: base roleBase of root defaults to all empty values + root := new(aggregatorRole) + root.roleBase.Name = rootRoleName + + for _, taskItem := range tasks { + SingleTaskRole := taskRole{ + roleBase: roleBase{ + Name: taskItem.Identifier.Name, + parent: root, + Connect: nil, + Constraints: nil, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), + Locals: nil, + Bind: nil, + }, + } + + SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) + SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) + SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) + SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) + + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + } + + workflow = root + + // FIXME: either get rid of err or add handling of errors + return workflow, nil +} + +// RoleToYAML exists to avoid exporting aggregatorRole/iteratorRole. +// Simply put, this function is nothing but a wrapper which allows marshalling Roles outside the workflow package +func RoleToYAML(input Role) ([]byte, error) { + switch input.(type) { + case *aggregatorRole: + return yaml.Marshal(input.(*aggregatorRole)) + case *iteratorRole: + return yaml.Marshal(input.(*iteratorRole)) + default: + return nil, nil + } +} + +func LoadWorkflow(input []byte) (workflow Role, err error) { + root := new(aggregatorRole) + err = yaml.Unmarshal(input, &root) + if err != nil { + return workflow, err + } + + workflow = root + + return workflow, nil +} diff --git a/core/workflow/loadDPL.go b/core/workflow/loadDPL.go deleted file mode 100644 index fd260afee..000000000 --- a/core/workflow/loadDPL.go +++ /dev/null @@ -1,91 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -import ( - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task" - "gopkg.in/yaml.v3" -) - -func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error) { - // FIXME: base roleBase of root defaults to all empty values - root := new(aggregatorRole) - root.roleBase.Name = rootRoleName - - for _, taskItem := range tasks { - SingleTaskRole := taskRole{ - roleBase: roleBase{ - Name: taskItem.Identifier.Name, - parent: root, - Connect: nil, - Constraints: nil, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), - Locals: nil, - Bind: nil, - }, - } - - SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) - SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) - SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) - SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) - SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) - } - - workflow = root - - // FIXME: either get rid of err or add handling of errors - return workflow, nil -} - -// RoleToYAML exists to avoid exporting aggregatorRole/iteratorRole. -// Simply put, this function is nothing but a wrapper which allows marshalling Roles outside the workflow package -func RoleToYAML(input Role) ([]byte, error) { - switch input.(type) { - case *aggregatorRole: - return yaml.Marshal(input.(*aggregatorRole)) - case *iteratorRole: - return yaml.Marshal(input.(*iteratorRole)) - default: - return nil, nil - } -} - -func LoadWorkflow(input []byte) (workflow Role, err error) { - root := new(aggregatorRole) - err = yaml.Unmarshal(input, &root) - if err != nil { - return workflow, err - } - - workflow = root - - return workflow, nil -} From d291c5af3e604b7638d28b5fe3ac6b8acccb4925 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 24 Jul 2020 03:21:53 +0530 Subject: [PATCH 0484/2352] [walnut] verbose validation errors --- walnut/schemata/validate.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/walnut/schemata/validate.go b/walnut/schemata/validate.go index b04e1b95b..9f58bf793 100644 --- a/walnut/schemata/validate.go +++ b/walnut/schemata/validate.go @@ -57,19 +57,17 @@ func Validate(input []byte, format string) (err error) { schemaLoader := gojsonschema.NewStringLoader(schema) // load schema documentLoader := gojsonschema.NewGoLoader(inputData) // load unmarhsaled YAML - // fmt.Printf("RAWYAML: %v\n", inputData.value) - result, err := gojsonschema.Validate(schemaLoader, documentLoader) if err != nil { return fmt.Errorf("Error loading data: %w", err) } if result.Valid() { - // fmt.Printf("\nSUCCESS! File is valid against %s schema\n", format) os.Exit(0) } else { - err = errors.New("file is invalid against schema") - return fmt.Errorf("schema validation: %w\n", err) + err = errors.New(fmt.Sprintf("%v", result.Errors()[0])) + return err } + return nil } From e3a3224c7165e4443a21051ba2b53c4d8acdef42 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 27 Jul 2020 04:28:40 +0530 Subject: [PATCH 0485/2352] [walnut] condense gojsonschema error --- walnut/schemata/validate.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/walnut/schemata/validate.go b/walnut/schemata/validate.go index 9f58bf793..ec9545b60 100644 --- a/walnut/schemata/validate.go +++ b/walnut/schemata/validate.go @@ -65,8 +65,7 @@ func Validate(input []byte, format string) (err error) { if result.Valid() { os.Exit(0) } else { - err = errors.New(fmt.Sprintf("%v", result.Errors()[0])) - return err + return fmt.Errorf("%s", result.Errors()[0]) } return nil From e0a8d750d05ffbcd8b0ac662fc3cbbc4beadb330 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 08:51:45 +0530 Subject: [PATCH 0486/2352] [walnut] add support for hook task specification --- core/workflow/taskrole.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 443d8580f..d05e4dd45 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -97,12 +97,15 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *taskRole) MarshalYAML() (interface{}, error) { auxRoleBase, err := t.roleBase.MarshalYAML() - load := map[string]string{ - // t.LoadTaskClass returns empty string + taskRole := map[string]interface{} { + "trigger": t.Traits.Trigger, + "timeout": t.Traits.Timeout, + "critical": t.Traits.Critical, "load": t.roleBase.Name, } + aux := auxRoleBase.(map[string]interface{}) - aux["task"] = load + aux["task"] = taskRole return aux, err } From d1eccb3e4985f59275f2007b095659eefc5aaeff Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 08:54:55 +0530 Subject: [PATCH 0487/2352] [walnut] modify workflow schema to check for task hook specifications --- walnut/schemata/Workflow.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 44fb5656b..8d375cf02 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -168,6 +168,15 @@ "load": { "title": "Task template to load", "type": "string" + }, + "trigger": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "critical": { + "type": "boolean" } } }, From 7fd7bf11905e80040f16f36e21e5c40a183081c8 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 14:11:34 +0530 Subject: [PATCH 0488/2352] [walnut] change range subfields to string --- walnut/schemata/Workflow.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 8d375cf02..282c5151f 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -21,11 +21,11 @@ "properties": { "begin": { "title": "Begin port", - "type": "number" + "type": "string" }, "end": { "title": "End port", - "type": "number" + "type": "string" }, "var": { "title": "variables", From 3da8dfcd95894a040a24a0e6290a5af4aa9a395a Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 12 Aug 2020 10:53:56 +0530 Subject: [PATCH 0489/2352] [walnut] omit empty fields during marshaling --- core/workflow/load.go | 7 ------- core/workflow/rolebase.go | 11 +++++------ 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/core/workflow/load.go b/core/workflow/load.go index 6e9e73b2f..63c3feee8 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -109,13 +109,6 @@ func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error roleBase: roleBase{ Name: taskItem.Identifier.Name, parent: root, - Connect: nil, - Constraints: nil, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), - Locals: nil, - Bind: nil, }, } diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index be8c9d428..53ac8acda 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -191,12 +191,11 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - aux["name"] = r.Name - aux["connect"] = r.Connect - aux["constraints"] = r.Constraints - aux["defaults"] = r.Defaults.Raw() - aux["vars"] = r.Vars.Raw() - aux["bind"] = r.Bind + if r.Connect != nil { aux["connect"] = r.Connect } + if r.Constraints != nil { aux["constraints"] = r.Constraints } + if r.Defaults.Raw() != nil { aux["defaults"] = r.Defaults.Raw() } + if r.Vars.Raw() != nil { aux["vars"] = r.Vars.Raw() } + if r.Bind != nil { aux["bind"] = r.Bind } return aux, nil } From b5d30974a582e78eee2bff1da3a0f866fb01962d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 31 Jul 2020 06:42:29 +0530 Subject: [PATCH 0490/2352] [walnut] add support for workflow grafting --- core/workflow/graft.go | 64 ++++++++++++++++++++++++++++++ walnut/converter/converter_test.go | 12 ++++++ 2 files changed, 76 insertions(+) create mode 100644 core/workflow/graft.go diff --git a/core/workflow/graft.go b/core/workflow/graft.go new file mode 100644 index 000000000..e173e0a7f --- /dev/null +++ b/core/workflow/graft.go @@ -0,0 +1,64 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/core/task/constraint" +) + +func Graft(root Role, toAdd Role) (output Role){ + roles := root.(*aggregatorRole) + roles.aggregator.Roles = append(roles.aggregator.Roles, toAdd) + + output = roles + + return output +} + +var TestRoleBase = roleBase{ + Name: "readout-{{ it }}", + Connect: nil, + Constraints: constraint.Constraints{ + constraint.Constraint{ + Attribute: "machine_id", + Value: "{{ it }}", + }, + }, + Defaults: nil, + Vars: gera.MakeStringMapWithMap(map[string]string{ + "readout_cfg_uri": "file:/home/flp/readout.cfg", + }), + UserVars: nil, + Locals: nil, + Bind: nil, +} + +var TestAggregatorRole = aggregatorRole{ + roleBase: TestRoleBase, + aggregator: aggregator{}, +} + +var TestRole Role = &TestAggregatorRole \ No newline at end of file diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index d6497fc7d..481e6c25a 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -107,3 +107,15 @@ func TestLoadWorkflow(t *testing.T) { _ = GenerateWorkflowTemplate(result, wd+"/test/") }) } + +func TestGraft(t *testing.T) { + t.Run("test grafting role", func(t *testing.T) { + f1, _ := ioutil.ReadFile("readout.yaml") + f2, _ := ioutil.ReadFile("readout-stfb-qc.yaml") + roleOne, _ := workflow.LoadWorkflow(f1) + roleTwo, _ := workflow.LoadWorkflow(f2) + + grafted := workflow.Graft(roleOne, roleTwo) + _ = GenerateWorkflowTemplate(grafted, "dump") + }) +} From b62b068ff4396191e9fcee2ae9254113e721f3da Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 6 Aug 2020 13:11:26 +0530 Subject: [PATCH 0491/2352] [walnut] load WFTs into yaml.Node --- core/workflow/graft.go | 66 +++++++++++++++++------------- core/workflow/load.go | 11 ++--- walnut/converter/converter_test.go | 25 ++++++----- 3 files changed, 56 insertions(+), 46 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index e173e0a7f..bc49de092 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -25,40 +25,50 @@ package workflow import ( - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task/constraint" + "gopkg.in/yaml.v3" + "strings" ) -func Graft(root Role, toAdd Role) (output Role){ - roles := root.(*aggregatorRole) - roles.aggregator.Roles = append(roles.aggregator.Roles, toAdd) +func Graft(root yaml.Node, path string, toAdd []byte) (out Role, err error) { + roleToAdd, err := LoadWorkflow(toAdd) - output = roles + destinationNode := navigateNode(root, path) + destinationNode.Content = append(destinationNode.Content, navigateNode(root, path)) + destinationNode.Content = append(destinationNode.Content, roleToAdd.Content[0].Content...) + destinationNode.Tag = "!!seq" - return output -} + var result aggregatorRole + err = root.Decode(&result) + if err != nil{ + return nil, err + } + + out = &result -var TestRoleBase = roleBase{ - Name: "readout-{{ it }}", - Connect: nil, - Constraints: constraint.Constraints{ - constraint.Constraint{ - Attribute: "machine_id", - Value: "{{ it }}", - }, - }, - Defaults: nil, - Vars: gera.MakeStringMapWithMap(map[string]string{ - "readout_cfg_uri": "file:/home/flp/readout.cfg", - }), - UserVars: nil, - Locals: nil, - Bind: nil, + return out, nil } -var TestAggregatorRole = aggregatorRole{ - roleBase: TestRoleBase, - aggregator: aggregator{}, +func navigateNode(root yaml.Node, path string) (out *yaml.Node) { + steps := strings.Split(path, PATH_SEPARATOR) + + for _, step := range steps { + out = iterateNode(&root, step) + } + + return out } -var TestRole Role = &TestAggregatorRole \ No newline at end of file +func iterateNode(node *yaml.Node, identifier string) *yaml.Node { + for _, n := range node.Content { + if n.Value == identifier { + return node + } + if len(n.Content) > 0 { + acNode := iterateNode(n, identifier) + if acNode != nil { + return acNode + } + } + } + return nil +} diff --git a/core/workflow/load.go b/core/workflow/load.go index 63c3feee8..614a69039 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -140,14 +140,11 @@ func RoleToYAML(input Role) ([]byte, error) { } } -func LoadWorkflow(input []byte) (workflow Role, err error) { - root := new(aggregatorRole) - err = yaml.Unmarshal(input, &root) +func LoadWorkflow(in []byte) (out yaml.Node, err error) { + err = yaml.Unmarshal(in, &out) if err != nil { - return workflow, err + log.Fatal(err) } - workflow = root - - return workflow, nil + return out, nil } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 481e6c25a..4e3f09907 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -94,28 +94,31 @@ func TestGenerateWorkflowTemplate(t *testing.T) { }) } - func TestLoadWorkflow(t *testing.T) { t.Run("unmarshal iterator", func(t *testing.T) { f, _ := ioutil.ReadFile("dump.yaml") - result, err := workflow.LoadWorkflow(f) + _, err := workflow.LoadWorkflow(f) if err != nil { t.Errorf("iterator role unmarshal failed: %s", err) } - wd, _ := os.Getwd() - - _ = GenerateWorkflowTemplate(result, wd+"/test/") + //wd, _ := os.Getwd() + // + //_ = GenerateWorkflowTemplate(result, wd+"/test/") }) } func TestGraft(t *testing.T) { t.Run("test grafting role", func(t *testing.T) { - f1, _ := ioutil.ReadFile("readout.yaml") - f2, _ := ioutil.ReadFile("readout-stfb-qc.yaml") - roleOne, _ := workflow.LoadWorkflow(f1) - roleTwo, _ := workflow.LoadWorkflow(f2) + f1, _ := ioutil.ReadFile("dump.yaml") + root, _ := workflow.LoadWorkflow(f1) + f2, _ := ioutil.ReadFile("small.yaml") - grafted := workflow.Graft(roleOne, roleTwo) - _ = GenerateWorkflowTemplate(grafted, "dump") + result, err := workflow.Graft(root, "qc-single-subwf.readout-proxy", f2) + if err != nil{ + t.Error(err) + } + + wd, _ := os.Getwd() + _ = GenerateWorkflowTemplate(result, wd+"/test/") }) } From 6227620fc33aabb9deff04a610a262f16d158dfa Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 6 Aug 2020 17:35:39 +0530 Subject: [PATCH 0492/2352] [walnut] alternate test YAML --- walnut/converter/dump.yaml | 83 +++++++++++++++++++++++++++++++++++++ walnut/converter/small.yaml | 25 +++++++++++ 2 files changed, 108 insertions(+) create mode 100644 walnut/converter/dump.yaml create mode 100644 walnut/converter/small.yaml diff --git a/walnut/converter/dump.yaml b/walnut/converter/dump.yaml new file mode 100644 index 000000000..3d4ac88c2 --- /dev/null +++ b/walnut/converter/dump.yaml @@ -0,0 +1,83 @@ +name: readout-qc +defaults: + monitoring_qc_url: "no-op://" + monitoring_dd_url: "no-op://" + monitoring_readout_url: "no-op://" +roles: + - name: readout-{{ it }} + for: + range: "{{ hosts }}" + var: it + constraints: + - attribute: machine_id + value: "{{ it }}" + vars: + readout_cfg_uri: "file:/home/flp/readout.cfg" + roles: + - name: "readout" + task: + load: readout + - name: qc-single-subwf + defaults: + qchost: "{{ FromJson(hosts)[0] }}" + dpl_config: "/etc/flp.d/qc/readout-qc.dpl.json" + constraints: + - attribute: machine_id + value: "{{ qchost }}" + roles: + - name: "readout-proxy" + connect: + - name: "from_internal-dpl-clock_to_readout-proxy" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_readout-proxy" + type: "pull" + rateLogging: "60" + - name: "readout-proxy" + target: "ipc:///tmp/readout-pipe-1" + # readout.cfg [consumer-data-sampling] is hardcoded as channel "data-out" with type: pub and transport: zeromq + # shmem is only possible in push-pull mode + type: "sub" + rateLogging: "1" + task: + load: readout-proxy + - name: "internal-dpl-clock" + task: + load: readout-internal-dpl-clock + - name: "Dispatcher" + connect: + - name: "from_readout-proxy_to_Dispatcher" + target: "{{Parent().Path}}.readout-proxy:from_readout-proxy_to_Dispatcher" + type: "pull" + rateLogging: "60" + - name: "from_internal-dpl-clock_to_Dispatcher" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_Dispatcher" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-dispatcher + - name: "QC-TASK-RUNNER-daqTask" + connect: + - name: "from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" + target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" + type: "pull" + rateLogging: "60" + - name: "from_Dispatcher_to_QC-TASK-RUNNER-daqTask" + target: "{{Parent().Path}}.Dispatcher:from_Dispatcher_to_QC-TASK-RUNNER-daqTask" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-task-runner + - name: "QC-CHECK-RUNNER-Q4H0" + connect: + - name: "from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" + target: "{{Parent().Path}}.QC-TASK-RUNNER-daqTask:from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" + type: "pull" + rateLogging: "60" + task: + load: readout-qc-check-runner + - name: "internal-dpl-global-binary-file-sink" + connect: + - name: "from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" + target: "{{Parent().Path}}.QC-CHECK-RUNNER-Q4H0:from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" + type: "pull" + task: + load: readout-internal-dpl-global-binary-file-sink diff --git a/walnut/converter/small.yaml b/walnut/converter/small.yaml new file mode 100644 index 000000000..9241cee0e --- /dev/null +++ b/walnut/converter/small.yaml @@ -0,0 +1,25 @@ +name: qc-postprocessing # read by workflow +defaults: + pp_task_name: "ExampleTrend" + pp_task_period: "10" + user: flp +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: [] +properties: + qcConfiguration: "{{ GetConfig(qc/postprocessing) }}" +command: + env: [] + shell: true + user: "{{ user }}" + arguments: + - "--name" + - "{{pp_task_name}}" + - "--period" + - "{{pp_task_period}}" + value: >- + eval `aliswmod load QualityControl Control-OCCPlugin` && + o2-qc-run-postprocessing-occ \ No newline at end of file From 2a8d01d6104e9b1735c337ecaa7494fe12f6565b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Fri, 7 Aug 2020 13:40:58 +0530 Subject: [PATCH 0493/2352] [walnut] modifications to grafting --- core/workflow/graft.go | 43 ++++++++++++++++-------------- walnut/converter/converter_test.go | 4 +-- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index bc49de092..180b74c72 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -25,45 +25,48 @@ package workflow import ( + "fmt" "gopkg.in/yaml.v3" "strings" ) -func Graft(root yaml.Node, path string, toAdd []byte) (out Role, err error) { +var parent *yaml.Node + +// Graft takes a root node, a path to a role in root, byte array with an existing role and appends this +// role to the role in root where the path specifies.. +func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) { roleToAdd, err := LoadWorkflow(toAdd) - destinationNode := navigateNode(root, path) - destinationNode.Content = append(destinationNode.Content, navigateNode(root, path)) - destinationNode.Content = append(destinationNode.Content, roleToAdd.Content[0].Content...) - destinationNode.Tag = "!!seq" + for _, step := range strings.Split(path, PATH_SEPARATOR) { + // FIXME: no return value + _ = iterateNode(root, step) + } + + if &parent == nil { + return out, fmt.Errorf("specified path not found") + } - var result aggregatorRole - err = root.Decode(&result) + parent.Content = append(parent.Content, roleToAdd.Content[0]) + out, err = yaml.Marshal(root) if err != nil{ return nil, err } - out = &result - return out, nil } -func navigateNode(root yaml.Node, path string) (out *yaml.Node) { - steps := strings.Split(path, PATH_SEPARATOR) - - for _, step := range steps { - out = iterateNode(&root, step) - } - - return out -} - -func iterateNode(node *yaml.Node, identifier string) *yaml.Node { +// When passed a node, iterate through each node of its node.Content array. If found, return that node. +// If not found, call iterateNode on the current node's node.Content. The goal of this function is to get +// the parent node of where the search string is found. +func iterateNode(node *yaml.Node, identifier string) (found *yaml.Node) { for _, n := range node.Content { if n.Value == identifier { return node } if len(n.Content) > 0 { + if n.Tag == "!!seq" { + parent = n + } acNode := iterateNode(n, identifier) if acNode != nil { return acNode diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 4e3f09907..49f4249dc 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -113,12 +113,12 @@ func TestGraft(t *testing.T) { root, _ := workflow.LoadWorkflow(f1) f2, _ := ioutil.ReadFile("small.yaml") - result, err := workflow.Graft(root, "qc-single-subwf.readout-proxy", f2) + result, err := workflow.Graft(&root, "qc-single-subwf.readout-proxy", f2) if err != nil{ t.Error(err) } wd, _ := os.Getwd() - _ = GenerateWorkflowTemplate(result, wd+"/test/") + err = ioutil.WriteFile(wd+"/test/grafted.yaml", result, 0644) }) } From b4a19c924cecd83831aa8ffd327687d35c4b0a3b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 07:50:40 +0530 Subject: [PATCH 0494/2352] [walnut] add graft to CLI --- walnut/cmd/convert.go | 129 ++++++++++++++++++++++++++++++------------ 1 file changed, 93 insertions(+), 36 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index b87f0491d..6d1831212 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -30,6 +30,7 @@ import ( "log" "os" "os/exec" + "path/filepath" "strconv" "strings" @@ -38,12 +39,15 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/walnut/converter" ) var outputDir string var modules []string +var graft string +var workflowName string // convertCmd represents the convert command var convertCmd = &cobra.Command{ @@ -54,9 +58,6 @@ specify which modules should be used when generating task templates. Control-OCC Run: func(cmd *cobra.Command, args []string) { for _, dumpFile := range args { - // Strip .json from end of filename - nameOfDump := dumpFile[:len(dumpFile)-5] - file, err := ioutil.ReadFile(dumpFile) if err != nil { err = fmt.Errorf("failed to open file &s: &w", dumpFile, err) @@ -72,61 +73,117 @@ specify which modules should be used when generating task templates. Control-OCC } outputDir, _ = homedir.Expand(outputDir) - runGitCmd := func(args []string) string { - cmd := exec.Command("git", args...) - cmd.Dir = outputDir - out, err := cmd.Output() + if graft == "" { + err = WriteTemplates(taskClass, dumpFile) if err != nil { - log.Fatal(err) + fmt.Println(err.Error()) + os.Exit(1) + } + } else { + rolePath := strings.Split(graft, ":") + if workflowName == "" { + workflowName = rolePath[0] } + targetRolePath := rolePath[1] - return string(out) - } + // Open existing workflow + f, err := ioutil.ReadFile(filepath.Join(outputDir, rolePath[0]+".yaml")) + if err != nil { + log.Fatal(err) + } + root, err := workflow.LoadWorkflow(f) + if err != nil { + log.Fatal(err) + } - isGitRepo, _ := strconv.ParseBool(strings.TrimSpace( - runGitCmd([]string{"rev-parse", "--is-inside-work-tree"}))) + // Convert DPL to yaml.Node + roleToGraft, err := workflow.LoadDPL(taskClass, dumpFile[:len(dumpFile)-5]) + if err != nil { + log.Fatal(err) + } + roleData, err := workflow.RoleToYAML(roleToGraft) + if err != nil { + log.Fatal(err) + } - err = converter.GenerateTaskTemplate(taskClass, outputDir) - if err != nil { - err = fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) - fmt.Println(err.Error()) - os.Exit(1) + grafted, err := workflow.Graft(&root, targetRolePath, roleData) + if err != nil { + log.Fatal(err) + } + path := filepath.Join(outputDir, workflowName+".yaml") + fmt.Println("Writing to: ", path) + err = ioutil.WriteFile(path, grafted, 0644) + if err != nil { + log.Fatal(err) + } } + } - role, err := workflow.LoadDPL(taskClass, nameOfDump) - err = converter.GenerateWorkflowTemplate(role, outputDir) - if err != nil { - err = fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) - fmt.Println(err.Error()) - os.Exit(1) - } + isGitRepo, _ := strconv.ParseBool(strings.TrimSpace( + runGitCmd([]string{"rev-parse", "--is-inside-work-tree"}))) - if isGitRepo { - fmt.Printf(runGitCmd([]string{"status"})) + if isGitRepo { + fmt.Printf(runGitCmd([]string{"status"})) - result := true - prompt := &survey.Confirm{ - Message: "Would you like to view the git diff?", - Default: true, - } - _ = survey.AskOne(prompt, &result) + result := true + prompt := &survey.Confirm{ + Message: "Would you like to view the git diff?", + Default: true, + } + _ = survey.AskOne(prompt, &result) - if result { - fmt.Printf(runGitCmd([]string{"diff"})) - } + if result { + fmt.Printf(runGitCmd([]string{"diff"})) } } }, Args: cobra.MinimumNArgs(1), } +func runGitCmd(args []string) string { + cmd := exec.Command("git", args...) + cmd.Dir = outputDir + out, err := cmd.Output() + if err != nil { + log.Fatal(err) + } + + return string(out) +} + +func WriteTemplates(taskClass []*task.Class, dumpFile string) (err error) { + // Strip .json from end of filename + nameOfDump := dumpFile[:len(dumpFile)-5] + + err = converter.GenerateTaskTemplate(taskClass, outputDir) + if err != nil { + return fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) + } + + role, err := workflow.LoadDPL(taskClass, nameOfDump) + err = converter.GenerateWorkflowTemplate(role, outputDir) + if err != nil { + return fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) + } + + return nil +} + func init() { convertCmd.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules to load") _ = viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) convertCmd.PersistentFlags().StringVarP(&outputDir, "output-dir", "o", "", "optional output directory") - viper.BindPFlag("output-dir", rootCmd.Flags().Lookup("output-dir")) + _ = viper.BindPFlag("output-dir", rootCmd.Flags().Lookup("output-dir")) + + convertCmd.PersistentFlags().StringVarP(&graft, "graft", "g", "", + "graft converted DPL to an existing template") + _ = viper.BindPFlag("graft", rootCmd.Flags().Lookup("graft")) + + convertCmd.PersistentFlags().StringVarP(&workflowName, "workflow-name", "w", "", + "workflow to graft to") + _ = viper.BindPFlag("workflow-name", rootCmd.Flags().Lookup("workflow-name")) rootCmd.AddCommand(convertCmd) } From d7220bd89219aa5191e0bba62d4d98621f831e50 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 08:30:58 +0530 Subject: [PATCH 0495/2352] [walnut] remove TestLoadWorkflow --- core/workflow/graft.go | 7 +++++-- core/workflow/load.go | 2 +- walnut/cmd/convert.go | 3 +++ walnut/converter/converter_test.go | 13 ------------- 4 files changed, 9 insertions(+), 16 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index 180b74c72..1ac81446c 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -36,6 +36,9 @@ var parent *yaml.Node // role to the role in root where the path specifies.. func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) { roleToAdd, err := LoadWorkflow(toAdd) + if err != nil { + return nil, err + } for _, step := range strings.Split(path, PATH_SEPARATOR) { // FIXME: no return value @@ -43,7 +46,7 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) } if &parent == nil { - return out, fmt.Errorf("specified path not found") + return nil, fmt.Errorf("specified path not found") } parent.Content = append(parent.Content, roleToAdd.Content[0]) @@ -56,7 +59,7 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) } // When passed a node, iterate through each node of its node.Content array. If found, return that node. -// If not found, call iterateNode on the current node's node.Content. The goal of this function is to get +// If not found, call iterateNode on the current node's node.Content array. The goal of this function is to get // the parent node of where the search string is found. func iterateNode(node *yaml.Node, identifier string) (found *yaml.Node) { for _, n := range node.Content { diff --git a/core/workflow/load.go b/core/workflow/load.go index 614a69039..11f2b8496 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -143,7 +143,7 @@ func RoleToYAML(input Role) ([]byte, error) { func LoadWorkflow(in []byte) (out yaml.Node, err error) { err = yaml.Unmarshal(in, &out) if err != nil { - log.Fatal(err) + return } return out, nil diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 6d1831212..eade7a6de 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -58,6 +58,7 @@ specify which modules should be used when generating task templates. Control-OCC Run: func(cmd *cobra.Command, args []string) { for _, dumpFile := range args { + // Open specified DPL Dump file, err := ioutil.ReadFile(dumpFile) if err != nil { err = fmt.Errorf("failed to open file &s: &w", dumpFile, err) @@ -65,6 +66,7 @@ specify which modules should be used when generating task templates. Control-OCC os.Exit(1) } + // Import the dump and conver it to []*task.Class dplDump, err := converter.DPLImporter(file) taskClass, err := converter.ExtractTaskClasses(dplDump, modules) @@ -74,6 +76,7 @@ specify which modules should be used when generating task templates. Control-OCC outputDir, _ = homedir.Expand(outputDir) if graft == "" { + // If not grafting, simply convert dump to WFTs and TTs err = WriteTemplates(taskClass, dumpFile) if err != nil { fmt.Println(err.Error()) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 49f4249dc..a8f73fef2 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -94,19 +94,6 @@ func TestGenerateWorkflowTemplate(t *testing.T) { }) } -func TestLoadWorkflow(t *testing.T) { - t.Run("unmarshal iterator", func(t *testing.T) { - f, _ := ioutil.ReadFile("dump.yaml") - _, err := workflow.LoadWorkflow(f) - if err != nil { - t.Errorf("iterator role unmarshal failed: %s", err) - } - //wd, _ := os.Getwd() - // - //_ = GenerateWorkflowTemplate(result, wd+"/test/") - }) -} - func TestGraft(t *testing.T) { t.Run("test grafting role", func(t *testing.T) { f1, _ := ioutil.ReadFile("dump.yaml") From fb7b4b0dd0e2ce45ff269dc9d60eeef959e6ea98 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 10 Aug 2020 15:28:05 +0530 Subject: [PATCH 0496/2352] [walnut] improvements to iterateNode --- core/workflow/graft.go | 18 ++++++++++-------- walnut/converter/converter_test.go | 6 +++++- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index 1ac81446c..d01196e81 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -30,8 +30,6 @@ import ( "strings" ) -var parent *yaml.Node - // Graft takes a root node, a path to a role in root, byte array with an existing role and appends this // role to the role in root where the path specifies.. func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) { @@ -40,16 +38,20 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) return nil, err } + var parent *yaml.Node + for _, step := range strings.Split(path, PATH_SEPARATOR) { // FIXME: no return value - _ = iterateNode(root, step) + _ = iterateNode(root, &parent, step) } - if &parent == nil { + if parent == nil { return nil, fmt.Errorf("specified path not found") } + // Not appending to root, only to a copy of root parent.Content = append(parent.Content, roleToAdd.Content[0]) + out, err = yaml.Marshal(root) if err != nil{ return nil, err @@ -61,16 +63,16 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) // When passed a node, iterate through each node of its node.Content array. If found, return that node. // If not found, call iterateNode on the current node's node.Content array. The goal of this function is to get // the parent node of where the search string is found. -func iterateNode(node *yaml.Node, identifier string) (found *yaml.Node) { +func iterateNode(node *yaml.Node, parent **yaml.Node,identifier string) (found *yaml.Node) { for _, n := range node.Content { if n.Value == identifier { - return node + return n } if len(n.Content) > 0 { if n.Tag == "!!seq" { - parent = n + *parent = n } - acNode := iterateNode(n, identifier) + acNode := iterateNode(n, parent, identifier) if acNode != nil { return acNode } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index a8f73fef2..cb3a38fdd 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -27,6 +27,7 @@ package converter import ( "io/ioutil" "os" + "path/filepath" "testing" "github.com/k0kubun/pp" @@ -106,6 +107,9 @@ func TestGraft(t *testing.T) { } wd, _ := os.Getwd() - err = ioutil.WriteFile(wd+"/test/grafted.yaml", result, 0644) + err = ioutil.WriteFile(filepath.Join(wd, "test", "grafted.yaml"), result, 0644) + if err != nil{ + t.Error(err) + } }) } From 90167c4f5d13a4f907394dcec968a7578b6408e4 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 19:41:33 +0530 Subject: [PATCH 0497/2352] [walnut] add enabled flag in workflow schema --- walnut/schemata/Workflow.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 282c5151f..17ab204d2 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -15,6 +15,9 @@ "description": "Parametrized name of an iterator role", "type": "string" }, + "enabled": { + "type": "string" + }, "for": { "description": "Amount of Memory", "type": "object", From 0550a525764a5745ed6854b59473881b964090b9 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 19:44:39 +0530 Subject: [PATCH 0498/2352] [walnut] support enabled flag in roleBase --- core/workflow/rolebase.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 53ac8acda..0305b74de 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -196,6 +196,7 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { if r.Defaults.Raw() != nil { aux["defaults"] = r.Defaults.Raw() } if r.Vars.Raw() != nil { aux["vars"] = r.Vars.Raw() } if r.Bind != nil { aux["bind"] = r.Bind } + if r.Enabled != "" { aux["enabled"] = r.Enabled } return aux, nil } From bab9c0a0d8ace9aa8f042f6311227ef0b3e7cd9d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 12 Aug 2020 14:42:45 +0530 Subject: [PATCH 0499/2352] [walnut] variabilize config_uri --- core/workflow/rolebase.go | 1 + walnut/cmd/convert.go | 2 +- walnut/converter/converter.go | 6 ++---- walnut/converter/converter_test.go | 12 ++++++------ walnut/converter/testvalues.go | 5 +++++ 5 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 0305b74de..8fc5a38bb 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -190,6 +190,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) + aux["name"] = r.Name if r.Connect != nil { aux["connect"] = r.Connect } if r.Constraints != nil { aux["constraints"] = r.Constraints } diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index eade7a6de..18ffcd073 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -68,7 +68,7 @@ specify which modules should be used when generating task templates. Control-OCC // Import the dump and conver it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules, vars) if outputDir == "" { outputDir, _ = os.Getwd() diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index df5965a06..35aa55ca2 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,7 +60,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, envModules []string, vars map[string]string) (tasks []*task.Class, err error) { envModules = append(envModules, "Control-OCCPlugin") for index := range dplDump.Workflows { @@ -72,9 +72,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, Identifier: task.TaskClassIdentifier{ Name: taskName, }, - Defaults: gera.MakeStringMapWithMap(map[string]string{ - "user": "flp", - }), + Defaults: gera.MakeStringMapWithMap(vars), Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index cb3a38fdd..c4564bc16 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -37,7 +37,7 @@ import ( func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump, []string{}) + extractedClasses, err := ExtractTaskClasses(TestDump, []string{}, vars) pp.Print(extractedClasses) if err != nil { t.Errorf("extract Task Class failed: %v", err) @@ -47,7 +47,7 @@ func TestExtractClass(t *testing.T) { func TestGenerateTaskTemplate(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}) + allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}, vars) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -61,7 +61,7 @@ func TestGenerateTaskTemplate(t *testing.T) { func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{}) + allTasks, err := ExtractTaskClasses(TestDump, []string{}, vars) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -76,14 +76,14 @@ func TestTaskToRole(t *testing.T) { func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { - dumpFile, err := ioutil.ReadFile("dump.json") + dumpFile, err := ioutil.ReadFile("test-dump-1.json") dump, err := DPLImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump, []string{}) + allTasks, err := ExtractTaskClasses(dump, []string{}, vars) if err != nil { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks, "dump") + role, err := workflow.LoadDPL(allTasks, "test-dump-1") if err != nil { t.Errorf("error loading task to role: %v", err) } diff --git a/walnut/converter/testvalues.go b/walnut/converter/testvalues.go index 3c91d1d36..8095df793 100644 --- a/walnut/converter/testvalues.go +++ b/walnut/converter/testvalues.go @@ -24,6 +24,11 @@ package converter +var vars = map[string]string { + "qc_config_uri": "json:///etc/flp.d/qc/readout.json", + "user": "test-user-1", +} + var TestDump = Dump{ Workflows: []workflowEntry{ { From 5a599aade0e612f059b68a488ab601943742995e Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Wed, 12 Aug 2020 16:21:04 +0530 Subject: [PATCH 0500/2352] [walnut] add config-uri-varname and static-config-uri flags --- walnut/cmd/convert.go | 2 +- walnut/converter/converter.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 18ffcd073..916aaeb21 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -68,7 +68,7 @@ specify which modules should be used when generating task templates. Control-OCC // Import the dump and conver it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules, vars) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules, defaults) if outputDir == "" { outputDir, _ = os.Getwd() diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 35aa55ca2..67dfbbf27 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,7 +60,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, envModules []string, vars map[string]string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]string) (tasks []*task.Class, err error) { envModules = append(envModules, "Control-OCCPlugin") for index := range dplDump.Workflows { @@ -72,7 +72,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string, vars map[string]strin Identifier: task.TaskClassIdentifier{ Name: taskName, }, - Defaults: gera.MakeStringMapWithMap(vars), + Defaults: gera.MakeStringMapWithMap(defaults), Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, From 16775906b9392e7d9ca12b90e508e6565a81108d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Mon, 17 Aug 2020 19:52:56 +0530 Subject: [PATCH 0501/2352] [walnut] add user var to command --- walnut/converter/converter.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 67dfbbf27..66265d52a 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -81,7 +81,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]s Shell: createBool(true), Arguments: sanitizeCmdLineArgs(dplDump.Metadata[correspondingMetadata].CmdlLineArgs, taskName), - User: createString("flp"), + User: createString("{{ user }}"), }, Wants: task.ResourceWants{ Cpu: createFloat(0.15), @@ -96,6 +96,7 @@ func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]s value := fmt.Sprintf("eval `aliswmod load %s` &&\n%s", strings.Join(envModules, " "), dplDump.Metadata[correspondingMetadata].Executable) + value = fmt.Sprintf("%s &&\n%s", value, "cat {{ dpl_config }} | dump-name") task.Command.Value = &value for _, channelName := range channelNames { From 5fef1343f95053835ee6e1fcbc73507b68c86bb0 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 19:19:04 +0530 Subject: [PATCH 0502/2352] [walnut] refactor parsing extraVars --- coconut/control/control.go | 65 +++----------------------------------- common/utils/utils.go | 64 +++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 61 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 5e1789333..eb7a4e65e 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -28,8 +28,6 @@ package control import ( "context" - "encoding/csv" - "encoding/json" "errors" "fmt" "io" @@ -41,11 +39,11 @@ import ( "time" "github.com/xlab/treeprint" - "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/coconut" "github.com/AliceO2Group/Control/coconut/protos" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" "github.com/briandowns/spinner" "github.com/olekukonko/tablewriter" "github.com/sirupsen/logrus" @@ -175,21 +173,6 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com return nil } - -func readAsCSV(val string) ([]string, error) { - if val == "" { - return []string{}, nil - } - stringReader := strings.NewReader(val) - csvReader := csv.NewReader(stringReader) - return csvReader.Read() -} - -func isJson(str string) bool { - var js json.RawMessage - return json.Unmarshal([]byte(str), &js) == nil -} - func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { wfPath, err := cmd.Flags().GetString("workflow-template") if err != nil { @@ -212,49 +195,9 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } - extraVarsMap := make(map[string]string) - - if isJson(extraVars) { - extraVarsMapI := make(map[string]interface{}) - err = yaml.Unmarshal([]byte(extraVars), &extraVarsMapI) - if err != nil { - err = fmt.Errorf("cannot parse extra-vars as JSON: %w", err) - return - } - for k, v := range extraVarsMapI { - if strVal, ok := v.(string); ok { - extraVarsMap[k] = strVal - continue - } - marshaledValue, marshalErr := json.Marshal(v) - if marshalErr != nil { - continue - } - extraVarsMap[k] = string(marshaledValue) - } - } else { - extraVarsSlice := make([]string, 0) - extraVarsSlice, err = readAsCSV(extraVars) - if err != nil { - err = fmt.Errorf("cannot parse extra-vars as CSV: %w", err) - return - } - - for _, entry := range extraVarsSlice { - if len(entry) < 3 { // can't be shorter than a=b - err = fmt.Errorf("invalid variable assignment %s", entry) - return - } - if strings.Count(entry, "=") != 1 { - err = fmt.Errorf("invalid variable assignment %s", entry) - return - } - - sanitized := strings.Trim(strings.TrimSpace(entry), "\"'") - - entryKV := strings.Split(sanitized, "=") - extraVarsMap[entryKV[0]] = entryKV[1] - } + extraVarsMap, err := utils.ParseExtraVars(extraVars) + if err != nil { + return } // TODO: add support for setting visibility here OCTRL-178 diff --git a/common/utils/utils.go b/common/utils/utils.go index ad1742d5b..6a45c504a 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -25,11 +25,15 @@ package utils import ( + "encoding/csv" + "encoding/json" "fmt" "io" "os" "strings" "time" + + "gopkg.in/yaml.v3" ) func NewUnixTimestamp() string { @@ -69,3 +73,63 @@ func StringSliceContains(s []string, str string) bool { } return false } + +func readAsCSV(val string) ([]string, error) { + if val == "" { + return []string{}, nil + } + stringReader := strings.NewReader(val) + csvReader := csv.NewReader(stringReader) + return csvReader.Read() +} + +func isJson(str string) bool { + var js json.RawMessage + return json.Unmarshal([]byte(str), &js) == nil +} + +func ParseExtraVars(extraVars string) (extraVarsMap map[string]string, err error) { + if isJson(extraVars) { + extraVarsMapI := make(map[string]interface{}) + err = yaml.Unmarshal([]byte(extraVars), &extraVarsMapI) + if err != nil { + err = fmt.Errorf("cannot parse extra-vars as JSON: %w", err) + return + } + for k, v := range extraVarsMapI { + if strVal, ok := v.(string); ok { + extraVarsMap[k] = strVal + continue + } + marshaledValue, marshalErr := json.Marshal(v) + if marshalErr != nil { + continue + } + extraVarsMap[k] = string(marshaledValue) + } + } else { + extraVarsSlice := make([]string, 0) + extraVarsSlice, err = readAsCSV(extraVars) + if err != nil { + err = fmt.Errorf("cannot parse extra-vars as CSV: %w", err) + return + } + + for _, entry := range extraVarsSlice { + if len(entry) < 3 { // can't be shorter than a=b + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + if strings.Count(entry, "=") != 1 { + err = fmt.Errorf("invalid variable assignment %s", entry) + return + } + + sanitized := strings.Trim(strings.TrimSpace(entry), "\"'") + + entryKV := strings.Split(sanitized, "=") + extraVarsMap[entryKV[0]] = entryKV[1] + } + } + return +} From 1171abbbfbdd2ca989546959d9d5b6ec628781a1 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 19:22:02 +0530 Subject: [PATCH 0503/2352] [walnut] add support for extraVars --- core/workflow/load.go | 4 +++- walnut/cmd/convert.go | 31 ++++++++++++++++++++++++------ walnut/converter/converter_test.go | 14 +++++++------- walnut/converter/testvalues.go | 6 +++++- 4 files changed, 40 insertions(+), 15 deletions(-) diff --git a/core/workflow/load.go b/core/workflow/load.go index 11f2b8496..c1ed10975 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -99,10 +99,12 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return } -func LoadDPL(tasks []*task.Class, rootRoleName string) (workflow Role, err error) { +func LoadDPL(tasks []*task.Class, rootRoleName string, extraVarsMap map[string]string) (workflow Role, err error) { // FIXME: base roleBase of root defaults to all empty values root := new(aggregatorRole) + root.roleBase.Name = rootRoleName + root.roleBase.Vars = gera.MakeStringMapWithMap(extraVarsMap) for _, taskItem := range tasks { SingleTaskRole := taskRole{ diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 916aaeb21..3a1b22368 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -25,6 +25,7 @@ package cmd import ( + "errors" "fmt" "io/ioutil" "log" @@ -39,6 +40,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/walnut/converter" @@ -66,18 +68,35 @@ specify which modules should be used when generating task templates. Control-OCC os.Exit(1) } - // Import the dump and conver it to []*task.Class + // Import the dump and convert it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules, defaults) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules, map[string]string{}) if outputDir == "" { outputDir, _ = os.Getwd() } outputDir, _ = homedir.Expand(outputDir) + var extraVars string + extraVars, err = cmd.Flags().GetString("extra-vars") + if err != nil { + return + } + + extraVars = strings.TrimSpace(extraVars) + if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { + err = errors.New("empty list of extra-vars supplied") + return + } + + extraVarsMap, err := utils.ParseExtraVars(extraVars) + if err != nil { + return + } + if graft == "" { // If not grafting, simply convert dump to WFTs and TTs - err = WriteTemplates(taskClass, dumpFile) + err = WriteTemplates(taskClass, dumpFile, extraVarsMap) if err != nil { fmt.Println(err.Error()) os.Exit(1) @@ -100,7 +119,7 @@ specify which modules should be used when generating task templates. Control-OCC } // Convert DPL to yaml.Node - roleToGraft, err := workflow.LoadDPL(taskClass, dumpFile[:len(dumpFile)-5]) + roleToGraft, err := workflow.LoadDPL(taskClass, dumpFile[:len(dumpFile)-5], extraVarsMap) if err != nil { log.Fatal(err) } @@ -154,7 +173,7 @@ func runGitCmd(args []string) string { return string(out) } -func WriteTemplates(taskClass []*task.Class, dumpFile string) (err error) { +func WriteTemplates(taskClass []*task.Class, dumpFile string, extraVarsMap map[string]string) (err error) { // Strip .json from end of filename nameOfDump := dumpFile[:len(dumpFile)-5] @@ -163,7 +182,7 @@ func WriteTemplates(taskClass []*task.Class, dumpFile string) (err error) { return fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) } - role, err := workflow.LoadDPL(taskClass, nameOfDump) + role, err := workflow.LoadDPL(taskClass, nameOfDump, extraVarsMap) err = converter.GenerateWorkflowTemplate(role, outputDir) if err != nil { return fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index c4564bc16..bb70a1ec8 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -37,7 +37,7 @@ import ( func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump, []string{}, vars) + extractedClasses, err := ExtractTaskClasses(TestDump, []string{}, defaults) pp.Print(extractedClasses) if err != nil { t.Errorf("extract Task Class failed: %v", err) @@ -47,7 +47,7 @@ func TestExtractClass(t *testing.T) { func TestGenerateTaskTemplate(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}, vars) + allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}, defaults) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -61,12 +61,12 @@ func TestGenerateTaskTemplate(t *testing.T) { func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{}, vars) + allTasks, err := ExtractTaskClasses(TestDump, []string{}, defaults) if err != nil { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks, "dump") + role, err := workflow.LoadDPL(allTasks, "dump", extraVars) if err != nil { t.Errorf("error loading task to role: %v", err) } @@ -76,14 +76,14 @@ func TestTaskToRole(t *testing.T) { func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { - dumpFile, err := ioutil.ReadFile("test-dump-1.json") + dumpFile, err := ioutil.ReadFile("dump.json") dump, err := DPLImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump, []string{}, vars) + allTasks, err := ExtractTaskClasses(dump, []string{}, defaults) if err != nil { t.Errorf("extract Task Class failed: %v", err) } - role, err := workflow.LoadDPL(allTasks, "test-dump-1") + role, err := workflow.LoadDPL(allTasks, "dump", extraVars) if err != nil { t.Errorf("error loading task to role: %v", err) } diff --git a/walnut/converter/testvalues.go b/walnut/converter/testvalues.go index 8095df793..028bb1562 100644 --- a/walnut/converter/testvalues.go +++ b/walnut/converter/testvalues.go @@ -24,11 +24,15 @@ package converter -var vars = map[string]string { +var defaults = map[string]string { "qc_config_uri": "json:///etc/flp.d/qc/readout.json", "user": "test-user-1", } +var extraVars = map[string]string { + "readout_cfg_uri": "file:/home/flp/readout_stfb_emu.cfg", +} + var TestDump = Dump{ Workflows: []workflowEntry{ { From 87b69c6b7fa4cb4810ddf737883eccf724b8e82b Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 19:36:59 +0530 Subject: [PATCH 0504/2352] [walnut] fix missing default map --- walnut/cmd/convert.go | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 3a1b22368..271c9b332 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -50,6 +50,9 @@ var outputDir string var modules []string var graft string var workflowName string +var configURIVarname string +var staticConfigURI string + // convertCmd represents the convert command var convertCmd = &cobra.Command{ @@ -60,6 +63,14 @@ specify which modules should be used when generating task templates. Control-OCC Run: func(cmd *cobra.Command, args []string) { for _, dumpFile := range args { + // Strip .json from end of filename + nameOfDump := dumpFile[:len(dumpFile)-5] + defaults := map[string]string { + "user": "flp", + nameOfDump + "_monitoring_qc_url": "no-op://", + "dpl_config": "", + } + // Open specified DPL Dump file, err := ioutil.ReadFile(dumpFile) if err != nil { @@ -68,9 +79,16 @@ specify which modules should be used when generating task templates. Control-OCC os.Exit(1) } + if configURIVarname != "" { + defaults[configURIVarname] = staticConfigURI + } else { + defaults[nameOfDump + "_config_uri"] = staticConfigURI + } + + // Import the dump and convert it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules, map[string]string{}) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules, defaults) if outputDir == "" { outputDir, _ = os.Getwd() @@ -207,5 +225,14 @@ func init() { "workflow to graft to") _ = viper.BindPFlag("workflow-name", rootCmd.Flags().Lookup("workflow-name")) + convertCmd.PersistentFlags().StringVarP(&configURIVarname, "config-uri-varname", "", "", + "name of config uri var") + _ = viper.BindPFlag("config-uri-varname", rootCmd.Flags().Lookup("config-uri-varname")) + + convertCmd.PersistentFlags().StringVarP(&staticConfigURI, "static-config-uri", "", "", + "path of config uri") + _ = viper.BindPFlag("static-config-uri", rootCmd.Flags().Lookup("static-config-uri")) + + rootCmd.AddCommand(convertCmd) } From 7574a9079c14a8b670d61d5714d71e036e970130 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 20 Aug 2020 20:05:07 +0530 Subject: [PATCH 0505/2352] [walnut] reposition extra-vars declaration --- walnut/cmd/convert.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 271c9b332..cde7b3e6e 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -52,6 +52,7 @@ var graft string var workflowName string var configURIVarname string var staticConfigURI string +var extraVars string // convertCmd represents the convert command @@ -67,7 +68,7 @@ specify which modules should be used when generating task templates. Control-OCC nameOfDump := dumpFile[:len(dumpFile)-5] defaults := map[string]string { "user": "flp", - nameOfDump + "_monitoring_qc_url": "no-op://", + nameOfDump + "_monitoring_url": "no-op://", "dpl_config": "", } @@ -95,23 +96,20 @@ specify which modules should be used when generating task templates. Control-OCC } outputDir, _ = homedir.Expand(outputDir) - var extraVars string - extraVars, err = cmd.Flags().GetString("extra-vars") - if err != nil { - return - } - extraVars = strings.TrimSpace(extraVars) if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { - err = errors.New("empty list of extra-vars supplied") - return + fmt.Println(errors.New("empty list of extra-vars supplied").Error()) + os.Exit(1) } extraVarsMap, err := utils.ParseExtraVars(extraVars) if err != nil { - return + fmt.Println(err.Error()) + os.Exit(1) } + fmt.Printf("OPENED: %s", dumpFile) + if graft == "" { // If not grafting, simply convert dump to WFTs and TTs err = WriteTemplates(taskClass, dumpFile, extraVarsMap) @@ -233,6 +231,9 @@ func init() { "path of config uri") _ = viper.BindPFlag("static-config-uri", rootCmd.Flags().Lookup("static-config-uri")) + convertCmd.PersistentFlags().StringVarP(&extraVars, "extra-vars", "", "", + "extra vars") + _ = viper.BindPFlag("extra-vars", rootCmd.Flags().Lookup("static-config-uri")) rootCmd.AddCommand(convertCmd) } From f632d101579b4fd4264cedb7f3513e512fef3e70 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Sun, 23 Aug 2020 18:33:03 +0530 Subject: [PATCH 0506/2352] [walnut] graft role as child of specified role --- core/workflow/graft.go | 41 +++++++++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index d01196e81..c2bc1fa20 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -31,26 +31,17 @@ import ( ) // Graft takes a root node, a path to a role in root, byte array with an existing role and appends this -// role to the role in root where the path specifies.. +// role asa child of the role in root where the path specifies. func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) { - roleToAdd, err := LoadWorkflow(toAdd) - if err != nil { - return nil, err - } - var parent *yaml.Node - for _, step := range strings.Split(path, PATH_SEPARATOR) { - // FIXME: no return value _ = iterateNode(root, &parent, step) } - if parent == nil { return nil, fmt.Errorf("specified path not found") } - // Not appending to root, only to a copy of root - parent.Content = append(parent.Content, roleToAdd.Content[0]) + err = appendRole(parent, toAdd) out, err = yaml.Marshal(root) if err != nil{ @@ -69,7 +60,7 @@ func iterateNode(node *yaml.Node, parent **yaml.Node,identifier string) (found * return n } if len(n.Content) > 0 { - if n.Tag == "!!seq" { + if n.Tag == "!!map" { *parent = n } acNode := iterateNode(n, parent, identifier) @@ -80,3 +71,29 @@ func iterateNode(node *yaml.Node, parent **yaml.Node,identifier string) (found * } return nil } + +// appendRole checks if the yaml.Node passed has a "roles" field. If it exists, the toAdd yaml.Node will +// be appended. If not, a "roles" field will be created and toAdd will be appended to that. +func appendRole(parent *yaml.Node, toAdd []byte) (err error) { + var childRole yaml.Node + err = yaml.Unmarshal(toAdd, &childRole) + var auxParent *yaml.Node // dummy value to run iterateNode successfully + + if iterateNode(parent, &auxParent, "roles") != nil { + for i, v := range parent.Content { + if v.Value == "roles" { + // If a !!str yaml.Node with value "roles" found, append toAdd to the next yaml.Node's Content + parent.Content[i + 1].Content = append(parent.Content[i + 1].Content, childRole.Content[0]) + } + } + } else { + // Create a yaml.Node with just a string "roles" as value + var aux yaml.Node + err = yaml.Unmarshal([]byte("roles"), &aux) + if err != nil { + return err + } + parent.Content = append(parent.Content, aux.Content[0], childRole.Content[0]) + } + return +} From 46dddefb8faa020388f9141ab5fa1b0362dd577f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 12:10:50 +0530 Subject: [PATCH 0507/2352] [walnut] error out if "roles" not present in node --- core/workflow/graft.go | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index c2bc1fa20..5b861ddff 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -42,6 +42,9 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) } err = appendRole(parent, toAdd) + if err != nil { + return nil, err + } out, err = yaml.Marshal(root) if err != nil{ @@ -73,7 +76,7 @@ func iterateNode(node *yaml.Node, parent **yaml.Node,identifier string) (found * } // appendRole checks if the yaml.Node passed has a "roles" field. If it exists, the toAdd yaml.Node will -// be appended. If not, a "roles" field will be created and toAdd will be appended to that. +// be appended. If not, appendRole will error out. func appendRole(parent *yaml.Node, toAdd []byte) (err error) { var childRole yaml.Node err = yaml.Unmarshal(toAdd, &childRole) @@ -87,13 +90,8 @@ func appendRole(parent *yaml.Node, toAdd []byte) (err error) { } } } else { - // Create a yaml.Node with just a string "roles" as value - var aux yaml.Node - err = yaml.Unmarshal([]byte("roles"), &aux) - if err != nil { - return err - } - parent.Content = append(parent.Content, aux.Content[0], childRole.Content[0]) + // error out if current yaml.Node does not have a "roles" field + return fmt.Errorf("specified node does not have a 'roles' field") } return } From c51a10e39e27d0dbe66cbced561316b1ff3f796f Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 12:25:02 +0530 Subject: [PATCH 0508/2352] [walnut] use first arg of target role as path to workflow --- walnut/cmd/convert.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index cde7b3e6e..ca915022c 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -119,13 +119,15 @@ specify which modules should be used when generating task templates. Control-OCC } } else { rolePath := strings.Split(graft, ":") + workflowPath := rolePath[0] + targetRolePath := rolePath[1] + if workflowName == "" { - workflowName = rolePath[0] + workflowName = filepath.Base(workflowPath) } - targetRolePath := rolePath[1] // Open existing workflow - f, err := ioutil.ReadFile(filepath.Join(outputDir, rolePath[0]+".yaml")) + f, err := ioutil.ReadFile(filepath.Join(outputDir, workflowPath)) if err != nil { log.Fatal(err) } From cf2ff0f69e4b5e6a87209b710fa704d6b1229c17 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 12:38:56 +0530 Subject: [PATCH 0509/2352] [walnut] change name of root Node to workflowName --- core/workflow/graft.go | 3 ++- walnut/cmd/convert.go | 2 +- walnut/converter/converter_test.go | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index 5b861ddff..fa331b946 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -32,7 +32,7 @@ import ( // Graft takes a root node, a path to a role in root, byte array with an existing role and appends this // role asa child of the role in root where the path specifies. -func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) { +func Graft(root *yaml.Node, path string, toAdd []byte, graftedName string) (out []byte, err error) { var parent *yaml.Node for _, step := range strings.Split(path, PATH_SEPARATOR) { _ = iterateNode(root, &parent, step) @@ -46,6 +46,7 @@ func Graft(root *yaml.Node, path string, toAdd []byte) (out []byte, err error) return nil, err } + root.Content[0].Content[1].Value = graftedName out, err = yaml.Marshal(root) if err != nil{ return nil, err diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index ca915022c..991760b55 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -146,7 +146,7 @@ specify which modules should be used when generating task templates. Control-OCC log.Fatal(err) } - grafted, err := workflow.Graft(&root, targetRolePath, roleData) + grafted, err := workflow.Graft(&root, targetRolePath, roleData, workflowName) if err != nil { log.Fatal(err) } diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index bb70a1ec8..9a07f3e4c 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -97,11 +97,11 @@ func TestGenerateWorkflowTemplate(t *testing.T) { func TestGraft(t *testing.T) { t.Run("test grafting role", func(t *testing.T) { - f1, _ := ioutil.ReadFile("dump.yaml") + f1, _ := ioutil.ReadFile("small.yaml") root, _ := workflow.LoadWorkflow(f1) - f2, _ := ioutil.ReadFile("small.yaml") + f2, _ := ioutil.ReadFile("dump.yaml") - result, err := workflow.Graft(&root, "qc-single-subwf.readout-proxy", f2) + result, err := workflow.Graft(&root, "readout.host-{{ it }}", f2, "small") if err != nil{ t.Error(err) } From 112087e9ea38226b6b216ab6516c34b227092862 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 21:19:37 +0530 Subject: [PATCH 0510/2352] [walnut] remove hard coded location of node name --- core/workflow/graft.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index fa331b946..0b3c07d59 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -46,7 +46,15 @@ func Graft(root *yaml.Node, path string, toAdd []byte, graftedName string) (out return nil, err } - root.Content[0].Content[1].Value = graftedName + nameNode := iterateNode(root, &parent, "name") + for index, node := range parent.Content { + // Search for the name node and change the Value field for the subsequent node + if node == nameNode { + parent.Content[index + 1].Value = graftedName + break + } + } + out, err = yaml.Marshal(root) if err != nil{ return nil, err From 2446cb930af32ee5a775094a912e68c055ee04a0 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 21:20:03 +0530 Subject: [PATCH 0511/2352] [walnut] fix example WFT --- walnut/converter/small.yaml | 66 +++++++++++++++++++++++-------------- 1 file changed, 42 insertions(+), 24 deletions(-) diff --git a/walnut/converter/small.yaml b/walnut/converter/small.yaml index 9241cee0e..1d4d055e2 100644 --- a/walnut/converter/small.yaml +++ b/walnut/converter/small.yaml @@ -1,25 +1,43 @@ -name: qc-postprocessing # read by workflow +name: readout-stfb defaults: - pp_task_name: "ExampleTrend" - pp_task_period: "10" - user: flp -control: - mode: direct -wants: - cpu: 0.15 - memory: 128 -bind: [] -properties: - qcConfiguration: "{{ GetConfig(qc/postprocessing) }}" -command: - env: [] - shell: true - user: "{{ user }}" - arguments: - - "--name" - - "{{pp_task_name}}" - - "--period" - - "{{pp_task_period}}" - value: >- - eval `aliswmod load QualityControl Control-OCCPlugin` && - o2-qc-run-postprocessing-occ \ No newline at end of file + roc_ctp_emulator_enabled: "true" + stfb_enabled: "true" +roles: + - name: host-{{ it }} + for: + range: "{{ hosts }}" + var: it + vars: + readout_cfg_uri: '{{stfb_enabled == "true" ? "file:/home/flp/readout_stfb_emu.cfg" : "file:/home/flp/readout.cfg"}}' + constraints: + - attribute: machine_id + value: "{{ it }}" + roles: + - name: "readout" + task: + load: readout + - name: "stfb" + enabled: "{{ stfb_enabled }}" + connect: + - name: readout + type: pull + target: "{{ Parent().Path }}.readout:readout" + rateLogging: "1" + task: + load: stfbuilder-nooutput + - name: roc-ctp-emulators + enabled: "{{roc_ctp_emulator_enabled}}" + defaults: + roc_ctp_emulator_endpoints: '["#0"]' + roles: + - name: "endpoint-{{ endpoint_id }}" + for: + range: "{{roc_ctp_emulator_endpoints}}" + var: endpoint_id + roles: + - name: roc-ctp-emulator + task: + load: "roc-ctp-emulator" + trigger: "enter_RUNNING" + timeout: 10s + critical: false \ No newline at end of file From 6777d7e2d654f5777074e8b5895074d657058d6d Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 21:22:22 +0530 Subject: [PATCH 0512/2352] [walnut] add check for empty graftedName --- core/workflow/graft.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/core/workflow/graft.go b/core/workflow/graft.go index 0b3c07d59..4a1cd9b8c 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -46,12 +46,14 @@ func Graft(root *yaml.Node, path string, toAdd []byte, graftedName string) (out return nil, err } - nameNode := iterateNode(root, &parent, "name") - for index, node := range parent.Content { - // Search for the name node and change the Value field for the subsequent node - if node == nameNode { - parent.Content[index + 1].Value = graftedName - break + if graftedName != "" { + nameNode := iterateNode(root, &parent, "name") + for index, node := range parent.Content { + // Search for the name node and change the Value field for the subsequent node + if node == nameNode { + parent.Content[index+1].Value = graftedName + break + } } } From 073175d1ccb53c3a4f89c9fb247ae524a65ececb Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 13:10:32 +0530 Subject: [PATCH 0513/2352] [walnut] move defaults from WFT to TT --- walnut/cmd/convert.go | 8 ++++---- walnut/converter/converter.go | 9 +++++---- walnut/converter/converter_test.go | 10 +++++----- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 991760b55..3cd05dbae 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -89,7 +89,7 @@ specify which modules should be used when generating task templates. Control-OCC // Import the dump and convert it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules, defaults) + taskClass, err := converter.ExtractTaskClasses(dplDump, modules) if outputDir == "" { outputDir, _ = os.Getwd() @@ -112,7 +112,7 @@ specify which modules should be used when generating task templates. Control-OCC if graft == "" { // If not grafting, simply convert dump to WFTs and TTs - err = WriteTemplates(taskClass, dumpFile, extraVarsMap) + err = WriteTemplates(taskClass, dumpFile, extraVarsMap, defaults) if err != nil { fmt.Println(err.Error()) os.Exit(1) @@ -191,11 +191,11 @@ func runGitCmd(args []string) string { return string(out) } -func WriteTemplates(taskClass []*task.Class, dumpFile string, extraVarsMap map[string]string) (err error) { +func WriteTemplates(taskClass []*task.Class, dumpFile string, extraVarsMap map[string]string, defaults map[string]string) (err error) { // Strip .json from end of filename nameOfDump := dumpFile[:len(dumpFile)-5] - err = converter.GenerateTaskTemplate(taskClass, outputDir) + err = converter.GenerateTaskTemplate(taskClass, outputDir, defaults) if err != nil { return fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 66265d52a..4773be8fb 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,7 +60,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, err error) { envModules = append(envModules, "Control-OCCPlugin") for index := range dplDump.Workflows { @@ -72,7 +72,6 @@ func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]s Identifier: task.TaskClassIdentifier{ Name: taskName, }, - Defaults: gera.MakeStringMapWithMap(defaults), Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, @@ -81,7 +80,6 @@ func ExtractTaskClasses(dplDump Dump, envModules []string, defaults map[string]s Shell: createBool(true), Arguments: sanitizeCmdLineArgs(dplDump.Metadata[correspondingMetadata].CmdlLineArgs, taskName), - User: createString("{{ user }}"), }, Wants: task.ResourceWants{ Cpu: createFloat(0.15), @@ -150,12 +148,15 @@ func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file -func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string) (err error) { +func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string, defaults map[string]string) (err error) { path := filepath.Join(outputDir, "tasks") path, _ = homedir.Expand(path) _ = os.MkdirAll(path, os.ModePerm) for _, SingleTask := range extractedTasks { + SingleTask.Defaults = gera.MakeStringMapWithMap(defaults) + SingleTask.Command.User = createString("{{ user }}") + YAMLData, err := yaml.Marshal(&SingleTask) if err != nil { return fmt.Errorf("marshal failed: %v", err) diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 9a07f3e4c..0858aadce 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -37,7 +37,7 @@ import ( func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump, []string{}, defaults) + extractedClasses, err := ExtractTaskClasses(TestDump, []string{}) pp.Print(extractedClasses) if err != nil { t.Errorf("extract Task Class failed: %v", err) @@ -47,12 +47,12 @@ func TestExtractClass(t *testing.T) { func TestGenerateTaskTemplate(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}, defaults) + allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } - err = GenerateTaskTemplate(allTasks, "dump") + err = GenerateTaskTemplate(allTasks, "dump", defaults) if err != nil { t.Errorf("failed to write YAML to file: %v", err) } @@ -61,7 +61,7 @@ func TestGenerateTaskTemplate(t *testing.T) { func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{}, defaults) + allTasks, err := ExtractTaskClasses(TestDump, []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -78,7 +78,7 @@ func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { dumpFile, err := ioutil.ReadFile("dump.json") dump, err := DPLImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump, []string{}, defaults) + allTasks, err := ExtractTaskClasses(dump, []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } From ff966bd5373c2c2f2183ec78b97cb8aa4bf18852 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Tue, 25 Aug 2020 21:35:00 +0530 Subject: [PATCH 0514/2352] [walnut] omitmepty task.Traits --- core/workflow/load.go | 1 - core/workflow/taskrole.go | 14 ++++++-------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/core/workflow/load.go b/core/workflow/load.go index c1ed10975..4561fa400 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -116,7 +116,6 @@ func LoadDPL(tasks []*task.Class, rootRoleName string, extraVarsMap map[string]s SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) - SingleTaskRole.Defaults = gera.MakeStringMapWithMap(taskItem.Defaults.Raw()) SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index d05e4dd45..f9167d41d 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -95,15 +95,13 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } func (t *taskRole) MarshalYAML() (interface{}, error) { - auxRoleBase, err := t.roleBase.MarshalYAML() - - taskRole := map[string]interface{} { - "trigger": t.Traits.Trigger, - "timeout": t.Traits.Timeout, - "critical": t.Traits.Critical, - "load": t.roleBase.Name, - } + taskRole := make(map[string]interface{}) + if t.Traits.Trigger != "" { taskRole["trigger"] = t.Traits.Trigger } + if t.Traits.Timeout != "" { taskRole["timeout"] = t.Traits.Timeout } + taskRole["critical"] = t.Traits.Critical + taskRole["load"] = t.roleBase.Name + auxRoleBase, err := t.roleBase.MarshalYAML() aux := auxRoleBase.(map[string]interface{}) aux["task"] = taskRole From 5c7bbce87599741439eb6c1e70ce5736b908cba6 Mon Sep 17 00:00:00 2001 From: Ayaan Zaidi Date: Thu, 27 Aug 2020 18:54:30 +0530 Subject: [PATCH 0515/2352] [walnut] add workflow-name and tas-name-prefix flags --- core/task/classToTask.go | 12 ---- core/workflow/load.go | 1 - go.mod | 13 ++--- go.sum | 89 ++++++++++++++++++++++++++++++ walnut/cmd/convert.go | 28 ++++++---- walnut/converter/converter.go | 8 ++- walnut/converter/converter_test.go | 8 +-- 7 files changed, 121 insertions(+), 38 deletions(-) diff --git a/core/task/classToTask.go b/core/task/classToTask.go index 8de9464c3..c775d2c64 100644 --- a/core/task/classToTask.go +++ b/core/task/classToTask.go @@ -27,18 +27,6 @@ package task func ClassToTask(input *Class, parent parentRole) *Task { output := Task{ parent: parent, - className: "", - name: "", - hostname: "", - agentId: "", - offerId: "", - taskId: "", - executorId: "", - localBindMap: nil, - status: 0, - state: 0, - safeToStop: false, - properties: nil, GetTaskClass: func() *Class { return input }, diff --git a/core/workflow/load.go b/core/workflow/load.go index 4561fa400..acab68f96 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -100,7 +100,6 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user } func LoadDPL(tasks []*task.Class, rootRoleName string, extraVarsMap map[string]string) (workflow Role, err error) { - // FIXME: base roleBase of root defaults to all empty values root := new(aggregatorRole) root.roleBase.Name = rootRoleName diff --git a/go.mod b/go.mod index 148795ad4..fc85fe499 100644 --- a/go.mod +++ b/go.mod @@ -17,6 +17,7 @@ replace ( // tview should be version 0ba8301b415c otherwise peanut will deadlock require ( + github.com/AlecAivazis/survey/v2 v2.1.1 github.com/antonmedv/expr v1.4.5 github.com/armon/go-metrics v0.3.3 // indirect github.com/briandowns/spinner v1.11.1 @@ -95,19 +96,15 @@ require ( github.com/xlab/treeprint v1.0.0 go.etcd.io/bbolt v1.3.4 // indirect go.uber.org/zap v1.14.1 // indirect - golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 - golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a // indirect - golang.org/x/sys v0.0.0-20200523222454-059865788121 + golang.org/x/net v0.0.0-20200707034311-ab3426394381 + golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect - golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 // indirect - google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 // indirect - google.golang.org/grpc v1.30.0 + google.golang.org/grpc v1.31.0 + google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 - honnef.co/go/tools v0.0.1-2020.1.3 // indirect sigs.k8s.io/yaml v1.2.0 // indirect ) diff --git a/go.sum b/go.sum index e7a3c4b30..2a457ebf1 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5 cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= @@ -41,12 +43,18 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/AlecAivazis/survey v1.8.8 h1:Y4yypp763E8cbqb5RBqZhGgkCFLRFnbRBHrxnpMMsgQ= +github.com/AlecAivazis/survey/v2 v2.1.1 h1:LEMbHE0pLj75faaVEKClEX1TM4AJmmnOh9eimREzLWI= +github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= +github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= @@ -178,6 +186,7 @@ github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agR github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= +github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= @@ -211,6 +220,7 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -238,15 +248,20 @@ github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= @@ -267,6 +282,7 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9G github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= @@ -291,6 +307,7 @@ github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= +github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= @@ -331,6 +348,8 @@ github.com/hashicorp/serf v0.9.0 h1:+Zd/16AJ9lxk9RzfTDyv/TLhZ8UerqYS0/+JGCIDaa0= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= +github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -361,6 +380,8 @@ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= @@ -376,6 +397,8 @@ github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= +github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -542,6 +565,7 @@ github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= +github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= @@ -559,6 +583,7 @@ github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= @@ -594,6 +619,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= @@ -606,6 +632,7 @@ github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:m github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966 h1:j6JEOq5QWFker+d7mFQYOhjTZonQ7YkLTHm56dbn+yM= github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -634,6 +661,7 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwY github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= @@ -646,6 +674,7 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -655,6 +684,7 @@ go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKY go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= @@ -663,6 +693,7 @@ golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= @@ -672,6 +703,8 @@ golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+v golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -722,6 +755,7 @@ golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -741,6 +775,9 @@ golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dD golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -757,6 +794,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -771,6 +810,7 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -807,11 +847,15 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -871,18 +915,35 @@ golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d h1:SR+e35rACZFBohNb4Om1ibX6N3iO0FtdbwqGSuD9dBU= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200806022845-90696ccdc692 h1:fsn47thVa7Ar/TMyXYlZgOoT7M4+kRpb+KpSAqRQx1w= +golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= @@ -900,19 +961,47 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 h1:XRuIAeTRoXziYGYTVer+YGxVXQBiOhZ8+SpNELP73oQ= google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= +google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d h1:vV+xpotnpsR73kzOS8o8hxDlc7Er+H5WZqOBwWcGktk= +google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d/go.mod h1:Lh55/1hxmVHEkOvSIQ2uj0P12QyOCUNyRwnUlSS13hw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 3cd05dbae..9f6a9b44f 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -53,6 +53,7 @@ var workflowName string var configURIVarname string var staticConfigURI string var extraVars string +var taskNamePrefix string // convertCmd represents the convert command @@ -65,7 +66,7 @@ specify which modules should be used when generating task templates. Control-OCC Run: func(cmd *cobra.Command, args []string) { for _, dumpFile := range args { // Strip .json from end of filename - nameOfDump := dumpFile[:len(dumpFile)-5] + nameOfDump := filepath.Base(dumpFile)[:len(filepath.Base(dumpFile))-5] defaults := map[string]string { "user": "flp", nameOfDump + "_monitoring_url": "no-op://", @@ -89,7 +90,7 @@ specify which modules should be used when generating task templates. Control-OCC // Import the dump and convert it to []*task.Class dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, modules) + taskClass, err := converter.ExtractTaskClasses(dplDump, taskNamePrefix, modules) if outputDir == "" { outputDir, _ = os.Getwd() @@ -111,8 +112,12 @@ specify which modules should be used when generating task templates. Control-OCC fmt.Printf("OPENED: %s", dumpFile) if graft == "" { + if workflowName == "" { + workflowName = nameOfDump + } + // If not grafting, simply convert dump to WFTs and TTs - err = WriteTemplates(taskClass, dumpFile, extraVarsMap, defaults) + err = WriteTemplates(taskClass, workflowName, extraVarsMap, defaults) if err != nil { fmt.Println(err.Error()) os.Exit(1) @@ -127,7 +132,7 @@ specify which modules should be used when generating task templates. Control-OCC } // Open existing workflow - f, err := ioutil.ReadFile(filepath.Join(outputDir, workflowPath)) + f, err := ioutil.ReadFile(workflowPath) if err != nil { log.Fatal(err) } @@ -191,19 +196,16 @@ func runGitCmd(args []string) string { return string(out) } -func WriteTemplates(taskClass []*task.Class, dumpFile string, extraVarsMap map[string]string, defaults map[string]string) (err error) { - // Strip .json from end of filename - nameOfDump := dumpFile[:len(dumpFile)-5] - +func WriteTemplates(taskClass []*task.Class, nameOfDump string, extraVarsMap map[string]string, defaults map[string]string) (err error) { err = converter.GenerateTaskTemplate(taskClass, outputDir, defaults) if err != nil { - return fmt.Errorf("conversion to task failed for %s: %w", dumpFile, err) + return fmt.Errorf("conversion to task failed for %s: %w", nameOfDump, err) } role, err := workflow.LoadDPL(taskClass, nameOfDump, extraVarsMap) err = converter.GenerateWorkflowTemplate(role, outputDir) if err != nil { - return fmt.Errorf("conversion to workflow failed for %s: %w", dumpFile, err) + return fmt.Errorf("conversion to workflow failed for %s: %w", nameOfDump, err) } return nil @@ -235,7 +237,11 @@ func init() { convertCmd.PersistentFlags().StringVarP(&extraVars, "extra-vars", "", "", "extra vars") - _ = viper.BindPFlag("extra-vars", rootCmd.Flags().Lookup("static-config-uri")) + _ = viper.BindPFlag("extra-vars", rootCmd.Flags().Lookup("extra-vars")) + + convertCmd.PersistentFlags().StringVarP(&taskNamePrefix, "task-name-prefix", "", "", + "prefix for task name fields") + _ = viper.BindPFlag("task-name-prefix", rootCmd.Flags().Lookup("task-name-prefix")) rootCmd.AddCommand(convertCmd) } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 4773be8fb..c4e5ce29e 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -60,17 +60,21 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, envModules []string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string) (tasks []*task.Class, err error) { envModules = append(envModules, "Control-OCCPlugin") for index := range dplDump.Workflows { taskName := dplDump.Workflows[index].Name + if taskNamePrefix != "" { + taskNamePrefix += "_" + } + correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry channelNames := dplDump.Metadata[correspondingMetadata].Channels task := task.Class{ Identifier: task.TaskClassIdentifier{ - Name: taskName, + Name: taskNamePrefix + taskName, }, Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index 0858aadce..c16f2ed94 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -37,7 +37,7 @@ import ( func TestExtractClass(t *testing.T) { t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump, []string{}) + extractedClasses, err := ExtractTaskClasses(TestDump, "", []string{}) pp.Print(extractedClasses) if err != nil { t.Errorf("extract Task Class failed: %v", err) @@ -47,7 +47,7 @@ func TestExtractClass(t *testing.T) { func TestGenerateTaskTemplate(t *testing.T) { t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{"QualityControl"}) + allTasks, err := ExtractTaskClasses(TestDump, "testPrefix", []string{"QualityControl"}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -61,7 +61,7 @@ func TestGenerateTaskTemplate(t *testing.T) { func TestTaskToRole(t *testing.T) { t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, []string{}) + allTasks, err := ExtractTaskClasses(TestDump, "", []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } @@ -78,7 +78,7 @@ func TestGenerateWorkflowTemplate(t *testing.T) { t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { dumpFile, err := ioutil.ReadFile("dump.json") dump, err := DPLImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump, []string{}) + allTasks, err := ExtractTaskClasses(dump, "testPrefix", []string{}) if err != nil { t.Errorf("extract Task Class failed: %v", err) } From d39f47394840b9f3f5bfa24f155ae2e60120ea6c Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 3 Sep 2020 12:46:12 +0200 Subject: [PATCH 0516/2352] [walnut] fix make generate --- Makefile | 2 +- cmd/walnut/main.go | 2 -- walnut/includeschemata.go | 65 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 walnut/includeschemata.go diff --git a/Makefile b/Makefile index 866a3e8bc..0adc63c3c 100644 --- a/Makefile +++ b/Makefile @@ -53,7 +53,7 @@ WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim ./walnut/cmd +GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim ./walnut SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target diff --git a/cmd/walnut/main.go b/cmd/walnut/main.go index 2580c2989..f013878d9 100644 --- a/cmd/walnut/main.go +++ b/cmd/walnut/main.go @@ -25,8 +25,6 @@ // Package walnut implements the O² Workflow Administration and Linting Utility. package main -// Generate latest schemas from .json files -//go:generate go run ../../walnut/schemata/includeschemata.go import "github.com/AliceO2Group/Control/walnut/cmd" diff --git a/walnut/includeschemata.go b/walnut/includeschemata.go new file mode 100644 index 000000000..655f2f4c0 --- /dev/null +++ b/walnut/includeschemata.go @@ -0,0 +1,65 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Ayaan Zaidi + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +// Generate latest schemas from .json files +//go:generate go run includeschemata.go + +import ( + "io" + "io/ioutil" + "path/filepath" + "os" + "strings" +) + +// Reads all .json files in the current folder +// and encodes them as strings literals in schemata.go +func main() { + + schemasPath := "./schemata/" + + fs, err := ioutil.ReadDir(schemasPath) + if err != nil { + return + } + + out, err := os.Create(filepath.Join(schemasPath,"schemata.go")) + if err != nil { + return + } + + out.Write([]byte("package schemata \n\nconst (\n")) + for _, f := range fs { + if strings.HasSuffix(f.Name(), ".json") { + out.Write([]byte(strings.TrimSuffix(f.Name(), ".json") + " = `\n")) + f, _ := os.Open(filepath.Join(schemasPath,f.Name())) + io.Copy(out, f) + out.Write([]byte("`\n")) + } + } + out.Write([]byte(")\n")) + +} From 1a5a32adf02d1df1212ecd14d0e9efc771b9787d Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 3 Sep 2020 12:47:50 +0200 Subject: [PATCH 0517/2352] [walnut] update json schemas --- walnut/schemata/Task.json | 23 +++++++++--- walnut/schemata/Workflow.json | 25 +++++++++---- walnut/schemata/schemata.go | 70 ++++++++++++++++++++++++++--------- 3 files changed, 86 insertions(+), 32 deletions(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index b0e404009..49f30cfea 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -69,11 +69,17 @@ }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -82,8 +88,7 @@ }, "required": [ "name", - "type", - "target" + "type" ] } }, @@ -107,11 +112,17 @@ }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 17ab204d2..1813a8d39 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -32,10 +32,7 @@ }, "var": { "title": "variables", - "type": "string", - "enum": [ - "it" - ] + "type": "string" }, "range": { "title": "Port ranges", @@ -97,11 +94,17 @@ }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -135,11 +138,17 @@ }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index 4b0f2ef13..307523420 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -73,11 +73,17 @@ Task = ` }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -86,8 +92,7 @@ Task = ` }, "required": [ "name", - "type", - "target" + "type" ] } }, @@ -111,11 +116,17 @@ Task = ` }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -170,7 +181,8 @@ Task = ` } } } -}` +} +` Workflow = ` { "$schema": "http://json-schema.org/draft-07/schema#", @@ -189,24 +201,24 @@ Workflow = ` "description": "Parametrized name of an iterator role", "type": "string" }, + "enabled": { + "type": "string" + }, "for": { "description": "Amount of Memory", "type": "object", "properties": { "begin": { "title": "Begin port", - "type": "number" + "type": "string" }, "end": { "title": "End port", - "type": "number" + "type": "string" }, "var": { "title": "variables", - "type": "string", - "enum": [ - "it" - ] + "type": "string" }, "range": { "title": "Port ranges", @@ -268,11 +280,17 @@ Workflow = ` }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -306,11 +324,17 @@ Workflow = ` }, "sndBufSize": { "title": "Send Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rcvBufSize": { "title": "Receive Buffer Size", - "type": "number" + "type": [ + "integer", + "string" + ] }, "rateLogging": { "title": "Rate Logging", @@ -342,6 +366,15 @@ Workflow = ` "load": { "title": "Task template to load", "type": "string" + }, + "trigger": { + "type": "string" + }, + "timeout": { + "type": "string" + }, + "critical": { + "type": "boolean" } } }, @@ -392,5 +425,6 @@ Workflow = ` "description": "Variable definitions: vars, override defaults, overridden by user vars." } } -}` +} +` ) From 43a4c5b3da713a55f6abfdaf8f9aa8f0a2e646c8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 4 Sep 2020 13:17:11 +0200 Subject: [PATCH 0518/2352] [walnut] update schemata with correct rateLogging --- walnut/schemata/Task.json | 10 ++++++++-- walnut/schemata/Workflow.json | 10 ++++++++-- walnut/schemata/schemata.go | 20 ++++++++++++++++---- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json index 49f30cfea..4f073ba27 100644 --- a/walnut/schemata/Task.json +++ b/walnut/schemata/Task.json @@ -83,7 +83,10 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] } }, "required": [ @@ -126,7 +129,10 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] }, "transport": { "type": "string", diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 1813a8d39..03ab2eb18 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -108,7 +108,10 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] } }, "required": [ @@ -152,7 +155,10 @@ }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] }, "transport": { "type": "string", diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index 307523420..65d00d22d 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -87,7 +87,10 @@ Task = ` }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] } }, "required": [ @@ -130,7 +133,10 @@ Task = ` }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] }, "transport": { "type": "string", @@ -294,7 +300,10 @@ Workflow = ` }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] } }, "required": [ @@ -338,7 +347,10 @@ Workflow = ` }, "rateLogging": { "title": "Rate Logging", - "type": "string" + "type": [ + "integer", + "string" + ] }, "transport": { "type": "string", From 0bde1efbe7d6662229f070771841054278307871 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Sep 2020 16:29:52 +0200 Subject: [PATCH 0519/2352] [core][executor] Update logger facility field --- cmd/o2control-core/main.go | 2 +- cmd/o2control-executor/main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/o2control-core/main.go b/cmd/o2control-core/main.go index a132cf7b8..ecc6981f8 100644 --- a/cmd/o2control-core/main.go +++ b/cmd/o2control-core/main.go @@ -44,7 +44,7 @@ func init() { ForceFormatting: true, }) log.SetOutput(os.Stdout) - ilHook, err := infologger.NewDirectHook("ECS", "AliECS core") + ilHook, err := infologger.NewDirectHook("ECS", "core") if err == nil { log.AddHook(ilHook) } diff --git a/cmd/o2control-executor/main.go b/cmd/o2control-executor/main.go index 69c616103..2c6a26410 100644 --- a/cmd/o2control-executor/main.go +++ b/cmd/o2control-executor/main.go @@ -36,7 +36,7 @@ import ( func init() { logrus.SetOutput(os.Stdout) - ilHook, err := infologger.NewDirectHook("ECS", "AliECS executor") + ilHook, err := infologger.NewDirectHook("ECS", "executor") if err == nil { logrus.AddHook(ilHook) } From 4648eb006134d021183e4a8a7979c02ed70a1b47 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Sep 2020 16:30:11 +0200 Subject: [PATCH 0520/2352] [common] Default InfoLogger role field to detected hostname --- common/logger/infologger/directhook.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index f4dfba24f..97cb551d0 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -105,6 +105,7 @@ type DirectHook struct { il *sender system string facility string + role string } func paddedAbstractSocket(name string) string { @@ -138,6 +139,7 @@ func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, e il: sender, system: defaultSystem, facility: defaultFacility, + role: hostname, // FIXME: We set a default value for the role = hostname }, nil } From 033f93307f4636991b61d11eb4e818ac3fb97486 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Sep 2020 16:47:02 +0200 Subject: [PATCH 0521/2352] [core] Always set system to FLP for controlled tasks --- core/scheduler.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/scheduler.go b/core/scheduler.go index c64f64ac7..3949d1a31 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -689,7 +689,9 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl cmd.ControlPort = controlPort cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) } + // FIXME: the role should be customizable cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "O2_ROLE", offer.Hostname)) + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "O2_SYSTEM", "FLP")) runCommand := *cmd From 9eca6ee9cb424d89bd1bdba2995c3af2769ca7d2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Sep 2020 13:53:25 +0200 Subject: [PATCH 0522/2352] [common] Pass correct username to IL --- common/logger/infologger/directhook.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 97cb551d0..80e14beaa 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -51,7 +51,7 @@ func init() { unixUser, _ := user.Current() if unixUser != nil { - username = unixUser.Name + username = unixUser.Username } hostname, err = os.Hostname() From 3c03c518c02829a301ede651869929e16c88f335 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Sep 2020 13:54:06 +0200 Subject: [PATCH 0523/2352] [core] Override system for O2_ROLE/O2_SYSTEM env vars passed to tasks --- core/scheduler.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 3949d1a31..53ba4a8e3 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -689,9 +689,31 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl cmd.ControlPort = controlPort cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) } - // FIXME: the role should be customizable - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "O2_ROLE", offer.Hostname)) - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", "O2_SYSTEM", "FLP")) + + // Convenience function that scans through cmd.Env and appends the + // given key-value pair if the given variable isn't already + // provided by the user. + fillEnvDefault := func(varName string, defaultValue string) { + varIsUserProvided := false + for _, envVar := range cmd.Env { + if strings.HasPrefix(envVar, varName) { + varIsUserProvided = true + break + } + } + if !varIsUserProvided { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) + } + } + + // Iterated call of the above function for the given kv-map of + // env var defaults + for varName, defaultValue := range map[string]string{ + "O2_ROLE": offer.Hostname, + "O2_SYSTEM": "FLP", + } { + fillEnvDefault(varName, defaultValue) + } runCommand := *cmd From 6940f329ea3ec0f248ad4a2a40de10d841d9ec8a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Sep 2020 15:58:04 +0200 Subject: [PATCH 0524/2352] [common] Ensure a default rolename is always passed to IL --- common/logger/infologger/directhook.go | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 80e14beaa..72f43d2b6 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -102,10 +102,10 @@ func (s *sender) Send(fields map[string]string) error { } type DirectHook struct { - il *sender - system string - facility string - role string + il *sender + system string + facility string + role string } func paddedAbstractSocket(name string) string { @@ -139,10 +139,18 @@ func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, e il: sender, system: defaultSystem, facility: defaultFacility, - role: hostname, // FIXME: We set a default value for the role = hostname + role: hostname, }, nil } +func NewDirectHookWithRole(defaultSystem string, defaultFacility string, defaultRole string) (*DirectHook, error) { + dh, err := NewDirectHook(defaultSystem, defaultFacility) + if dh != nil { + dh.role = defaultRole + } + return dh, err +} + func (h *DirectHook) Levels() []logrus.Level { // Everything except logrus.TraceLevel return []logrus.Level{ @@ -207,13 +215,16 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { } } - // If a System and/or Facility isn't passed manually, we fall back on defaults + // If a System, Facility or Role isn't passed manually, we fall back on defaults if _, ok := e.Data[System]; !ok { payload[System] = h.system } if _, ok := e.Data[Facility]; !ok { payload[Facility] = buildFineFacility(h.facility, e.Data) } + if _, ok := e.Data[Role]; !ok { + payload[Role] = h.role + } unmappableFields.Sort() From 8b3f5ea96e6d9ce4e753f62dd91543d7d68c832e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Sep 2020 16:47:39 +0200 Subject: [PATCH 0525/2352] [core] Set less relevant messages to Trace severity --- core/core.go | 14 +++++++------- core/util.go | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/core/core.go b/core/core.go index 6b8101211..21878bb6a 100644 --- a/core/core.go +++ b/core/core.go @@ -88,7 +88,7 @@ func Run() error { if err != nil { log.WithField("error", err).Error("cannot write to configuration") } - log.WithField("frameworkId", v).Debug("frameworkId") + log.WithField("frameworkId acquired", v).Trace("frameworkId") return nil })) @@ -122,29 +122,29 @@ func Run() error { "event": e.Event, "src": e.Src, "dst": e.Dst, - }).Debug("state.sm starting transition") + }).Trace("state.sm starting transition") }, "enter_state": func(e *fsm.Event) { log.WithFields(logrus.Fields{ "event": e.Event, "src": e.Src, "dst": e.Dst, - }).Debug("state.sm entering state") + }).Trace("state.sm entering state") }, "leave_CONNECTED": func(e *fsm.Event) { - log.Debug("leave_CONNECTED") + log.Trace("leave_CONNECTED") }, "before_NEW_ENVIRONMENT": func(e *fsm.Event) { - log.Debug("before_NEW_ENVIRONMENT") + log.Trace("before_NEW_ENVIRONMENT") e.Async() //transition frozen until the corresponding fsm.Transition call }, "enter_CONNECTED": func(e *fsm.Event) { - log.Debug("enter_CONNECTED") + log.Trace("enter_CONNECTED") log.Info("scheduler connected") }, "after_NEW_ENVIRONMENT": func(e *fsm.Event) { - log.Debug("after_NEW_ENVIRONMENT") + log.Trace("after_NEW_ENVIRONMENT") }, }, ) diff --git a/core/util.go b/core/util.go index f42725a6b..047975772 100644 --- a/core/util.go +++ b/core/util.go @@ -104,7 +104,7 @@ func buildWantsExecutorResources(executorCPU float64, executorMemory float64) (r resources.NewCPUs(executorCPU).Resource, resources.NewMemory(executorMemory).Resource, ) - log.Debug("wants-executor-resources = " + r.String()) + log.Trace("wants-executor-resources = " + r.String()) return } From 84c36dd44160b566afb6adda6a8f9d4c6efeb011 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Sep 2020 13:44:52 +0200 Subject: [PATCH 0526/2352] [common] Set IL level for all messages --- common/logger/infologger/directhook.go | 4 +++- common/logger/infologger/utils.go | 31 ++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 72f43d2b6..6c927a223 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -152,7 +152,7 @@ func NewDirectHookWithRole(defaultSystem string, defaultFacility string, default } func (h *DirectHook) Levels() []logrus.Level { - // Everything except logrus.TraceLevel + // Everything except Trace return []logrus.Level{ logrus.PanicLevel, logrus.FatalLevel, @@ -160,6 +160,7 @@ func (h *DirectHook) Levels() []logrus.Level { logrus.WarnLevel, logrus.InfoLevel, logrus.DebugLevel, + // logrus.TraceLevel, } } @@ -170,6 +171,7 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { // Filled automatically by InfoLogger, do not set: PID, hostName, userName payload := make(map[string]string) payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) + payload["level"] = logrusEntryToInfoLoggerLevel(e) payload["timestamp"] = utils.NewUnixTimestamp() payload["hostname"] = hostname payload["pid"] = pid diff --git a/common/logger/infologger/utils.go b/common/logger/infologger/utils.go index 432ca0438..42c450d96 100644 --- a/common/logger/infologger/utils.go +++ b/common/logger/infologger/utils.go @@ -26,6 +26,37 @@ package infologger import "github.com/sirupsen/logrus" +// Severity/priority constants: +// https://github.com/AliceO2Group/InfoLogger/blob/master/include/InfoLogger/InfoLogger.hxx + +// Extract InfoLogger level number from logrus Level +func logrusEntryToInfoLoggerLevel(e *logrus.Entry) string { + /// Some predefined constants that may be used to set the message level + /// (i.e. visibility of the message, based on who reads it) + /// The level is an integer in the 1-99 range (1: topmost visibility) + /// The enum below provides the main boundaries for typical operations, + /// and one may use finer granularity within each range. + /// operations (1-5) support (6-10) developer (11-20) trace (21-99). + /// Trace messages should typically not be enabled in normal running conditions, + /// and usually related to debugging activities (also akin to the 'Debug' severity). + // enum Level { + // Ops = 1, + // Support = 6, + // Devel = 11, + // Trace = 21 + // }; + switch e.Level { + case logrus.TraceLevel: + return "21" + case logrus.DebugLevel: + return "11" + default: + return "1" + } + +} + +// Extract InfoLogger severity char from logrus Level func logrusLevelToInfoLoggerSeverity(level logrus.Level) string { switch level { case logrus.PanicLevel: From 15b1406adf0c55b550ec4ef997fc22ab6d12ba06 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Sep 2020 16:17:58 +0200 Subject: [PATCH 0527/2352] [core] Push envId as partition in core --- core/environment/environment.go | 23 ++++++++++++---------- core/scheduler.go | 34 +++++++++++++++++++++++---------- core/server.go | 18 +++++++++++------ core/task/manager.go | 4 ++-- 4 files changed, 51 insertions(+), 28 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index a634709f3..c5e20a275 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -131,10 +131,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } log.WithFields(logrus.Fields{ - "event": e.Event, - "src": e.Src, - "dst": e.Dst, - "environmentId": envId, + "event": e.Event, + "src": e.Src, + "dst": e.Dst, + "partition": envId, }).Debug("environment.sm entering state") }, "after_event": func(e *fsm.Event) { @@ -194,19 +194,22 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err "exitCode": evt.ExitCode, "stdout": evt.Stdout, "stderr": evt.Stderr, + "partition": env.Id().String(), "finalMesosState": evt.FinalMesosState.String(), }). Warn("hook failed") } else { successfulHooks = append(successfulHooks, thisHook) - log.WithField("task", thisHook.GetName()).Trace("hook completed") + log.WithField("partition", env.Id().String()). + WithField("task", thisHook.GetName()).Trace("hook completed") } default: continue } case thisHook := <- timeoutCh: - log.WithField("task", thisHook.GetName()).Warn("hook response timed out") + log.WithField("partition", env.Id().String()). + WithField("task", thisHook.GetName()).Warn("hook response timed out") delete(hookTimers, thisHook) failedHooksById[thisHook.GetTaskId()] = thisHook } @@ -257,10 +260,10 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { return } log.WithFields(logrus.Fields{ - "event": e.Event, - "src": e.Src, - "dst": e.Dst, - "environmentId": env.id.String(), + "event": e.Event, + "src": e.Src, + "dst": e.Dst, + "partition": env.id.String(), }).Debug("environment.sm starting transition") transition, ok := e.Args[0].(Transition) diff --git a/core/scheduler.go b/core/scheduler.go index 53ba4a8e3..4bd82afe7 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -300,7 +300,9 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even return } - log.WithPrefix("scheduler").WithField("commandName", incomingCommand.CommandName).Debug("processing incoming MESSAGE") + log.WithPrefix("scheduler"). + WithField("commandName", incomingCommand.CommandName). + Trace("processing incoming MESSAGE") switch incomingCommand.CommandName { case "MesosCommand_TriggerHook": var res controlcommands.MesosCommandResponse_TriggerHook @@ -377,7 +379,7 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { if evt == nil { - log.WithPrefix("scheduler").Error("cannot handle null DeviceEvent") + log.WithPrefix("scheduler").Warn("cannot handle null DeviceEvent") return } @@ -412,15 +414,19 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { isHook = true env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + log.WithPrefix("scheduler"). + WithError(err). + Error("cannot find environment for DeviceEvent") } env.NotifyEvent(evt) } } else { - log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") + log.WithPrefix("scheduler"). + Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") } } else { - log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + log.WithPrefix("scheduler"). + Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") } // If the task hasn't already been killed @@ -436,12 +442,15 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { taskId := evt.GetOrigin().TaskId t := state.taskman.GetTask(taskId.Value) if t == nil { - log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent END_OF_STREAM") + log.WithPrefix("scheduler"). + Error("cannot find task for DeviceEvent END_OF_STREAM") return } env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + log.WithPrefix("scheduler"). + WithError(err). + Error("cannot find environment for DeviceEvent") } if env.CurrentState() == "RUNNING" { t.SetSafeToStop(true) // we mark this specific task as ok to STOP @@ -449,7 +458,10 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { if env.IsSafeToStop() { // but then we ask the env whether *all* of them are err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + log.WithPrefix("scheduler"). + WithError(err). + WithField("partition", env.Id().String()). + Error("cannot stop run after END_OF_STREAM event") } } }() @@ -502,7 +514,8 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } default: if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler").Trace("no roles need deployment") + log.WithPrefix("scheduler"). + Trace("no roles need deployment") } } @@ -731,7 +744,8 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl }). Error("cannot serialize mesos.CommandInfo for executor") state.Unlock() - log.WithPrefix("scheduler").Debug("state unlock") + log.WithPrefix("scheduler"). + Debug("state unlock") continue } diff --git a/core/server.go b/core/server.go index 7eda0be1f..5138b0b03 100644 --- a/core/server.go +++ b/core/server.go @@ -76,7 +76,7 @@ func (m *RpcServer) logMethod() { } log.WithPrefix("rpcserver"). WithField("method", fun.Name()). - Debug("handling RPC request") + Trace("handling RPC request") } // Implements interface pb.ControlServer @@ -142,7 +142,7 @@ func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) if err != nil { log.WithPrefix("rpcserver"). WithField("error", err). - WithField("envId", id.String()). + WithField("partition", id.String()). Error("cannot get environment") continue } @@ -216,7 +216,8 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme select { case m.state.Event <- pb.NewEnvironmentCreatedEvent(ei): default: - log.Debug("state.Event channel is full") + log.WithField("partition", newEnv.Id().String()). + Debug("state.Event channel is full") } return r, nil } @@ -319,7 +320,9 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir killed, running, err := m.doCleanupTasks(tasksForEnv) ctr := &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running} if err != nil { - log.WithError(err).Error("task cleanup error") + log.WithError(err). + WithField("partition", env.Id().String()). + Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } @@ -368,13 +371,16 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir killed, running, err := m.doCleanupTasks(tasksForEnv) ctr := &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running} if err != nil { - log.WithError(err).Error("task cleanup error") + log.WithError(err). + WithField("partition", env.Id().String()). + Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } select { case m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): default: - log.Debug("state.Event channel is full") + log.WithField("partition", env.Id().String()). + Debug("state.Event channel is full") } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } diff --git a/core/task/manager.go b/core/task/manager.go index 8f01c35d9..609bb5eea 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -308,7 +308,7 @@ func (m *Manager) AcquireTasks(envId uuid.Array, taskDescriptors Descriptors) (e <- m.reviveOffersTrg // we only continue when it's done m.tasksToDeploy <- tasksToRun // blocks until received - log.WithField("environmentId", envId). + log.WithField("partition", envId). Debug("scheduler should have received request to deploy") // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static @@ -416,7 +416,7 @@ func (m *Manager) ConfigureTasks(envId uuid.Array, tasks Tasks) error { endpoint.ToTargetEndpoint(task.GetHostname()) } } - log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). + log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "partition": envId.String()}). Debug("generated inbound bindMap for environment configuration") src := STANDBY.String() From 88d0f7b75026f95f41822fbd73c3baf8471227c0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 17:48:46 +0200 Subject: [PATCH 0528/2352] [core] Remove obsolete locking in server.go --- core/server.go | 20 -------------------- core/task/tasks.go | 2 ++ 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/core/server.go b/core/server.go index 5138b0b03..9d39a6720 100644 --- a/core/server.go +++ b/core/server.go @@ -95,8 +95,6 @@ func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) e func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoRequest) (*pb.GetFrameworkInfoReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() maj, _ := strconv.ParseInt(product.VERSION_MAJOR, 10, 32) min, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) @@ -130,8 +128,6 @@ func (*RpcServer) Teardown(context.Context, *pb.TeardownRequest) (*pb.TeardownRe func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() r := &pb.GetEnvironmentsReply{ FrameworkId: store.GetIgnoreErrors(m.fidStore)(), @@ -224,8 +220,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (*pb.GetEnvironmentReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -256,8 +250,6 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvironmentRequest) (*pb.ControlEnvironmentReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -297,8 +289,6 @@ func (*RpcServer) ModifyEnvironment(context.Context, *pb.ModifyEnvironmentReques func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvironmentRequest) (*pb.DestroyEnvironmentReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -387,8 +377,6 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasksReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() tasks := m.state.taskman.GetTasks() r := &pb.GetTasksReply{ @@ -400,8 +388,6 @@ func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasks func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.GetTaskReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() task := m.state.taskman.GetTask(req.TaskId) if task == nil { @@ -452,8 +438,6 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge func (m *RpcServer) CleanupTasks(cxt context.Context, req *pb.CleanupTasksRequest) (*pb.CleanupTasksReply, error) { m.logMethod() - m.state.Lock() - defer m.state.Unlock() idsToKill := req.GetTaskIds() killed, running, err := m.doCleanupTasks(idsToKill) @@ -488,9 +472,7 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - m.state.RLock() env, err := m.state.environments.Environment(uuid.Parse(req.EnvId)) - m.state.RUnlock() if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } @@ -506,8 +488,6 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflowTemplatesRequest) (*pb.GetWorkflowTemplatesReply, error) { m.logMethod() - m.state.RLock() - defer m.state.RUnlock() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() diff --git a/core/task/tasks.go b/core/task/tasks.go index 4bef1588e..7900f190e 100644 --- a/core/task/tasks.go +++ b/core/task/tasks.go @@ -39,6 +39,8 @@ var Filter_NIL Filter = func(*Task) bool { return true } +// FIXME: make this structure thread-safe to fully replace big state lock in server.go + func (m Tasks) GetTaskIds() []string { taskIds := make([]string, len(m)) for i, taskPtr := range m { From f34407ca2f541603e6811c44dc3af5fc235aaa52 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 18:17:07 +0200 Subject: [PATCH 0529/2352] [core] Environment ID is now a 20-char xid vs. 36 for earlier UUID --- core/environment/environment.go | 12 ++++---- core/environment/manager.go | 38 ++++++++++++------------ core/environment/transition_configure.go | 4 +-- core/scheduler.go | 4 +-- core/server.go | 30 +++++++++++++++---- core/task/errors.go | 7 +++-- core/task/manager.go | 10 ++++--- core/task/task.go | 10 +++---- core/workflow/parentadapter.go | 6 ++-- core/workflow/role.go | 4 +-- core/workflow/rolebase.go | 6 ++-- 11 files changed, 77 insertions(+), 54 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index c5e20a275..bc0f983af 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -42,7 +42,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" - "github.com/pborman/uuid" + "github.com/rs/xid" "github.com/sirupsen/logrus" ) @@ -53,7 +53,7 @@ type Environment struct { Mu sync.RWMutex Sm *fsm.FSM name string - id uuid.UUID + id xid.ID ts time.Time workflow workflow.Role wfAdapter *workflow.ParentAdapter @@ -76,7 +76,7 @@ func (env *Environment) NotifyEvent(e event.DeviceEvent) { } func newEnvironment(userVars map[string]string) (env *Environment, err error) { - envId := uuid.NewUUID() + envId := xid.New() env = &Environment{ id: envId, workflow: nil, @@ -91,7 +91,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { // Make the KVs accessible to the workflow via ParentAdapter env.wfAdapter = workflow.NewParentAdapter( - func() uuid.Array { return env.Id().Array() }, + func() xid.ID { return env.Id() }, func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, @@ -284,9 +284,9 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { // Accessors -func (env *Environment) Id() uuid.UUID { +func (env *Environment) Id() xid.ID { if env == nil { - return uuid.NIL + return xid.NilID() } env.Mu.RLock() defer env.Mu.RUnlock() diff --git a/core/environment/manager.go b/core/environment/manager.go index 5bb14ce5b..2adb945c4 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -32,24 +32,24 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" - "github.com/pborman/uuid" + "github.com/rs/xid" "github.com/sirupsen/logrus" ) type Manager struct { mu sync.RWMutex - m map[uuid.Array]*Environment + m map[xid.ID]*Environment taskman *task.Manager } func NewEnvManager(tm *task.Manager) *Manager { return &Manager{ - m: make(map[uuid.Array]*Environment), + m: make(map[xid.ID]*Environment), taskman: tm, } } -func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uuid.UUID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (xid.ID, error) { envs.mu.Lock() defer envs.mu.Unlock() @@ -72,7 +72,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env, err := newEnvironment(envUserVars) if err != nil { - return uuid.NIL, err + return xid.NilID(), err } env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) @@ -83,7 +83,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } - envs.m[env.id.Array()] = env + envs.m[env.id] = env err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -93,12 +93,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { envState := env.CurrentState() envTasks := env.Workflow().GetTasks() - rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) + rlsErr := envs.taskman.ReleaseTasks(env.id, envTasks) if rlsErr != nil { log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") } - delete(envs.m, env.id.Array()) + delete(envs.m, env.id) // As this is a failed env deployment, we must clean up any running & released tasks. // This is an important step as env deploy failures are often caused by bad task @@ -121,7 +121,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } -func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID, force bool) error { +func (envs *Manager) TeardownEnvironment(environmentId xid.ID, force bool) error { envs.mu.Lock() defer envs.mu.Unlock() @@ -134,12 +134,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID, force bool) er return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks()) + err = envs.taskman.ReleaseTasks(environmentId, env.Workflow().GetTasks()) if err != nil { return err } - delete(envs.m, environmentId.Array()) + delete(envs.m, environmentId) return err } @@ -149,29 +149,29 @@ func (envs *Manager) TeardownEnvironment(environmentId uuid.UUID, force bool) er return envs.m[environmentId.Array()].cfg }*/ -func (envs *Manager) Ids() (keys []uuid.UUID) { +func (envs *Manager) Ids() (keys []xid.ID) { envs.mu.RLock() defer envs.mu.RUnlock() - keys = make([]uuid.UUID, len(envs.m)) + keys = make([]xid.ID, len(envs.m)) i := 0 for k := range envs.m { - keys[i] = k.UUID() + keys[i] = k i++ } return } -func (envs *Manager) Environment(environmentId uuid.UUID) (env *Environment, err error) { +func (envs *Manager) Environment(environmentId xid.ID) (env *Environment, err error) { envs.mu.RLock() defer envs.mu.RUnlock() return envs.environment(environmentId) } -func (envs *Manager) environment(environmentId uuid.UUID) (env *Environment, err error) { - if len(environmentId.String()) == 0 { // invalid uuid - return nil, fmt.Errorf("invalid uuid: %s", environmentId) +func (envs *Manager) environment(environmentId xid.ID) (env *Environment, err error) { + if len(environmentId.String()) == 0 { // invalid xid + return nil, fmt.Errorf("invalid id: %s", environmentId) } - env, ok := envs.m[environmentId.Array()] + env, ok := envs.m[environmentId] if !ok { err = errors.New(fmt.Sprintf("no environment with id %s", environmentId)) } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index dcca87e88..c59445303 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -141,7 +141,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { taskDescriptors := wf.GenerateTaskDescriptors() if len(taskDescriptors) != 0 { - err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) + err = t.taskman.AcquireTasks(env.Id(), taskDescriptors) } if err != nil { return @@ -177,7 +177,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { tasks := wf.GetTasks() if len(tasks) != 0 { - err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) + err = t.taskman.ConfigureTasks(env.Id(), tasks) if err != nil { return } diff --git a/core/scheduler.go b/core/scheduler.go index 4bd82afe7..5b1047928 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -412,7 +412,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { // If it's an update following a HOOK execution if t.GetControlMode() == controlmode.HOOK { isHook = true - env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) + env, err := state.environments.Environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler"). WithError(err). @@ -446,7 +446,7 @@ func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { Error("cannot find task for DeviceEvent END_OF_STREAM") return } - env, err := state.environments.Environment(t.GetEnvironmentId().UUID()) + env, err := state.environments.Environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler"). WithError(err). diff --git a/core/server.go b/core/server.go index 9d39a6720..99152f050 100644 --- a/core/server.go +++ b/core/server.go @@ -27,6 +27,7 @@ package core import ( "fmt" + "github.com/rs/xid" "github.com/spf13/viper" "runtime" "sort" @@ -44,7 +45,6 @@ import ( "github.com/AliceO2Group/Control/core/protos" "github.com/looplab/fsm" "github.com/mesos/mesos-go/api/v1/lib/extras/store" - "github.com/pborman/uuid" "google.golang.org/grpc/codes" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" @@ -225,7 +225,12 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - env, err := m.state.environments.Environment(uuid.Parse(req.Id)) + envId, err := xid.FromString(req.Id) + if err != nil { + return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() + } + + env, err := m.state.environments.Environment(envId) if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } @@ -255,7 +260,12 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - env, err := m.state.environments.Environment(uuid.Parse(req.Id)) + envId, err := xid.FromString(req.Id) + if err != nil { + return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() + } + + env, err := m.state.environments.Environment(envId) if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } @@ -294,7 +304,12 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - env, err := m.state.environments.Environment(uuid.Parse(req.Id)) + envId, err := xid.FromString(req.Id) + if err != nil { + return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() + } + + env, err := m.state.environments.Environment(envId) if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } @@ -472,7 +487,12 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - env, err := m.state.environments.Environment(uuid.Parse(req.EnvId)) + envId, err := xid.FromString(req.EnvId) + if err != nil { + return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() + } + + env, err := m.state.environments.Environment(envId) if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } diff --git a/core/task/errors.go b/core/task/errors.go index fb6b53880..24fd5f27b 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -27,7 +27,8 @@ package task import ( "fmt" "strings" - "github.com/pborman/uuid" + + "github.com/rs/xid" ) type TaskError interface { @@ -87,11 +88,11 @@ func (r TaskNotFoundError) Error() string { type TaskLockedError struct { taskErrorBase - envId uuid.Array + envId xid.ID } func (r TaskLockedError) Error() string { return fmt.Sprintf("task %s is locked by environment %s", r.taskId, r.envId) } -func (r TaskLockedError) EnvironmentId() uuid.Array { +func (r TaskLockedError) EnvironmentId() xid.ID { return r.envId } \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index 609bb5eea..e1f825901 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -28,6 +28,8 @@ import ( "errors" "fmt" "github.com/AliceO2Group/Control/common/gera" + "github.com/rs/xid" + "io/ioutil" "path/filepath" "strings" @@ -208,7 +210,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { return } -func (m *Manager) AcquireTasks(envId uuid.Array, taskDescriptors Descriptors) (err error) { +func (m *Manager) AcquireTasks(envId xid.ID, taskDescriptors Descriptors) (err error) { m.mu.Lock() defer m.mu.Unlock() @@ -367,7 +369,7 @@ func (m *Manager) AcquireTasks(envId uuid.Array, taskDescriptors Descriptors) (e return } -func (m *Manager) ReleaseTasks(envId uuid.Array, tasks Tasks) error { +func (m *Manager) ReleaseTasks(envId xid.ID, tasks Tasks) error { m.mu.Lock() defer m.mu.Unlock() @@ -386,7 +388,7 @@ func (m *Manager) ReleaseTasks(envId uuid.Array, tasks Tasks) error { return nil } -func (m *Manager) releaseTask(envId uuid.Array, task *Task) error { +func (m *Manager) releaseTask(envId xid.ID, task *Task) error { if task == nil { return TaskNotFoundError{} } @@ -399,7 +401,7 @@ func (m *Manager) releaseTask(envId uuid.Array, task *Task) error { return nil } -func (m *Manager) ConfigureTasks(envId uuid.Array, tasks Tasks) error { +func (m *Manager) ConfigureTasks(envId xid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() if err != nil { diff --git a/core/task/task.go b/core/task/task.go index bf2e07eec..7ec8e70c1 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -46,7 +46,7 @@ import ( "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow/template" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/pborman/uuid" + "github.com/rs/xid" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -60,7 +60,7 @@ type parentRole interface { GetTaskClass() string GetTaskTraits() Traits SetTask(*Task) - GetEnvironmentId() uuid.Array + GetEnvironmentId() xid.ID CollectOutboundChannels() []channel.Outbound GetDefaults() gera.StringMap GetVars() gera.StringMap @@ -177,7 +177,7 @@ func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { varStack["task_id"] = t.GetTaskId() varStack["task_class_name"] = t.GetClassName() varStack["task_hostname"] = t.GetHostname() - varStack["environment_id"] = role.GetEnvironmentId().UUID().String() + varStack["environment_id"] = role.GetEnvironmentId().String() varStack["task_parent_role"] = role.GetPath() return varStack } @@ -348,9 +348,9 @@ func (t *Task) GetHostname() string { return t.hostname } -func (t *Task) GetEnvironmentId() uuid.Array { +func (t *Task) GetEnvironmentId() xid.ID { if t.parent == nil { - return uuid.NIL.Array() + return xid.NilID() } return t.parent.GetEnvironmentId() } diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index d76a11658..1c5c04262 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -30,10 +30,10 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/pborman/uuid" + "github.com/rs/xid" ) -type GetEnvIdFunc func() uuid.Array +type GetEnvIdFunc func() xid.ID type GetStringMapFunc func() gera.StringMap @@ -114,7 +114,7 @@ func (p *ParentAdapter) GetParent() Updatable { } -func (p *ParentAdapter) GetEnvironmentId() uuid.Array { +func (p *ParentAdapter) GetEnvironmentId() xid.ID { return p.getEnvIdFunc() } diff --git a/core/workflow/role.go b/core/workflow/role.go index d92ca80c7..ab4ef558e 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -35,7 +35,7 @@ import ( "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/gobwas/glob" - "github.com/pborman/uuid" + "github.com/rs/xid" ) type Role interface { @@ -66,7 +66,7 @@ type Updatable interface { GetParent() Updatable updateStatus(s task.Status) updateState(s task.State) //string? - GetEnvironmentId() uuid.Array + GetEnvironmentId() xid.ID GetPath() string CollectOutboundChannels() []channel.Outbound CollectInboundChannels() []channel.Inbound diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 8fc5a38bb..11b9ebe83 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -32,11 +32,11 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow/template" + "github.com/rs/xid" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" - "github.com/pborman/uuid" ) var log = logger.New(logrus.StandardLogger(), "workflow") @@ -287,9 +287,9 @@ func (r *roleBase) GetName() string { return r.Name } -func (r* roleBase) GetEnvironmentId() uuid.Array { +func (r* roleBase) GetEnvironmentId() xid.ID { if r.parent == nil { - return uuid.NIL.Array() + return xid.NilID() } return r.parent.GetEnvironmentId() } From 00ce55ea3c87d953d398ddcb317e2a106aa15067 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 18:26:41 +0200 Subject: [PATCH 0530/2352] [core] Task ID is now a xid --- core/task/manager.go | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index e1f825901..6599fc960 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -27,14 +27,14 @@ package task import ( "errors" "fmt" - "github.com/AliceO2Group/Control/common/gera" - "github.com/rs/xid" - "io/ioutil" "path/filepath" "strings" "sync" + "github.com/AliceO2Group/Control/common/gera" + "github.com/rs/xid" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/the" @@ -44,7 +44,6 @@ import ( "github.com/AliceO2Group/Control/core/task/channel" "github.com/k0kubun/pp" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -96,7 +95,7 @@ func (m *Manager) NewTaskForMesosOffer( descriptor *Descriptor, localBindMap channel.BindMap, executorId mesos.ExecutorID) (t *Task) { - newId := uuid.NewUUID().String() + newId := xid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), parent: descriptor.TaskRole, From 3ceea0e1dfd569563194ae6721841687513be83e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 18:31:10 +0200 Subject: [PATCH 0531/2352] [core] Executor ID is now a xid --- core/scheduler.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 5b1047928..4249efdc4 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -32,15 +32,17 @@ import ( "encoding/json" "errors" "fmt" + "io" + "strconv" + "strings" + "time" + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow" + "github.com/rs/xid" "github.com/spf13/viper" - "io" - "strconv" - "strings" - "time" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" @@ -61,7 +63,6 @@ import ( "github.com/mesos/mesos-go/api/v1/lib/scheduler" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" "github.com/mesos/mesos-go/api/v1/lib/scheduler/events" - "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -555,7 +556,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl ) if len(offer.ExecutorIDs) == 0 { - targetExecutorId.Value = uuid.NewUUID().String() + targetExecutorId.Value = xid.New().String() } else { targetExecutorId.Value = offer.ExecutorIDs[0].Value } From 480a57a969d0f1c8fc5387b8fbd641f6c8da2e45 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 18:35:48 +0200 Subject: [PATCH 0532/2352] [core] MesosCommand ID is now a xid --- core/controlcommands/mesoscommand.go | 13 +++++++------ core/controlcommands/mesoscommandresponse.go | 10 +++++----- core/controlcommands/mesoscommandservent.go | 4 ++-- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/core/controlcommands/mesoscommand.go b/core/controlcommands/mesoscommand.go index 29d1b5cbe..22f2b37fb 100644 --- a/core/controlcommands/mesoscommand.go +++ b/core/controlcommands/mesoscommand.go @@ -26,7 +26,8 @@ package controlcommands import ( "github.com/mesos/mesos-go/api/v1/lib" - "github.com/pborman/uuid" + "github.com/rs/xid" + "time" ) @@ -36,7 +37,7 @@ const ( type MesosCommand interface { GetName() string - GetId() uuid.Array + GetId() xid.ID IsMultiCmd() bool MakeSingleTarget(target MesosCommandTarget) MesosCommand IsMutator() bool @@ -56,7 +57,7 @@ type PropertyMapsMap map[MesosCommandTarget]PropertyMap type MesosCommandBase struct { Name string `json:"name"` - Id uuid.Array `json:"id"` + Id xid.ID `json:"id"` ResponseTimeout time.Duration `json:"timeout"` Arguments PropertyMap `json:"arguments"` TargetList []MesosCommandTarget `json:"targetList"` @@ -66,7 +67,7 @@ type MesosCommandBase struct { func NewMesosCommand(name string, receivers []MesosCommandTarget, argMap PropertyMapsMap) (*MesosCommandBase) { return &MesosCommandBase{ Name: name, - Id: uuid.NewUUID().Array(), + Id: xid.New(), ResponseTimeout: defaultResponseTimeout, TargetList: receivers, argMap: argMap, @@ -80,11 +81,11 @@ func (m *MesosCommandBase) GetName() string { return "" } -func (m *MesosCommandBase) GetId() uuid.Array { +func (m *MesosCommandBase) GetId() xid.ID { if m != nil { return m.Id } - return uuid.NIL.Array() + return xid.NilID() } func (m *MesosCommandBase) IsMultiCmd() bool { diff --git a/core/controlcommands/mesoscommandresponse.go b/core/controlcommands/mesoscommandresponse.go index 78a15dd1d..776d0da16 100644 --- a/core/controlcommands/mesoscommandresponse.go +++ b/core/controlcommands/mesoscommandresponse.go @@ -27,19 +27,19 @@ package controlcommands import ( "errors" - "github.com/pborman/uuid" + "github.com/rs/xid" ) type MesosCommandResponse interface { GetCommandName() string - GetCommandId() uuid.Array + GetCommandId() xid.ID IsMultiResponse() bool Err() error } type MesosCommandResponseBase struct { CommandName string `json:"name"` - CommandId uuid.Array `json:"id"` + CommandId xid.ID `json:"id"` ErrorString string `json:"error"` MessageType string `json:"_messageType"` } @@ -72,11 +72,11 @@ func (m *MesosCommandResponseBase) GetCommandName() string { return "" } -func (m *MesosCommandResponseBase) GetCommandId() uuid.Array { +func (m *MesosCommandResponseBase) GetCommandId() xid.ID { if m != nil { return m.CommandId } - return uuid.NIL.Array() + return xid.NilID() } func (m *MesosCommandResponseBase) IsMultiResponse() bool { diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index ea17cf375..b56aae668 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -29,7 +29,7 @@ import ( "sync" "time" - "github.com/pborman/uuid" + "github.com/rs/xid" "github.com/sirupsen/logrus" ) @@ -53,7 +53,7 @@ func NewCall(cmd MesosCommand) *Call { } type CallId struct { - Id uuid.Array + Id xid.ID Target MesosCommandTarget } From 936b037aea498a416f6f990dcf4a702754e00ab6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 19:00:46 +0200 Subject: [PATCH 0533/2352] [build] Ensure we build a true static binary --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0adc63c3c..78f290b0e 100644 --- a/Makefile +++ b/Makefile @@ -58,7 +58,8 @@ SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/p # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product -LDFLAGS=-ldflags "$(PROD).VERSION_MAJOR=$(VERSION_MAJOR) $(PROD).VERSION_MINOR=$(VERSION_MINOR) $(PROD).VERSION_PATCH=$(VERSION_PATCH) $(PROD).BUILD=$(BUILD)" +EXTLDFLAGS :="-static" +LDFLAGS=-ldflags "-extldflags $(EXTLDFLAGS) $(PROD).VERSION_MAJOR=$(VERSION_MAJOR) $(PROD).VERSION_MINOR=$(VERSION_MINOR) $(PROD).VERSION_PATCH=$(VERSION_PATCH) $(PROD).BUILD=$(BUILD)" -tags osusergo,netgo # We expect to find the gogo protobuf executables in $GOPATH/bin GOPATH := $(shell go env GOPATH) From de86c964ba0f36e7cd1789d901842b51f5037890 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Sep 2020 19:08:17 +0200 Subject: [PATCH 0534/2352] [coconut] Unbreak --- common/utils/utils.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/utils/utils.go b/common/utils/utils.go index 6a45c504a..db184e759 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -89,6 +89,7 @@ func isJson(str string) bool { } func ParseExtraVars(extraVars string) (extraVarsMap map[string]string, err error) { + extraVarsMap = make(map[string]string) if isJson(extraVars) { extraVarsMapI := make(map[string]interface{}) err = yaml.Unmarshal([]byte(extraVars), &extraVarsMapI) From 3c2f4ec75a586af59d010ba5b73e0b8243a5c5c4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 28 Sep 2020 12:19:13 +0200 Subject: [PATCH 0535/2352] [executor] Workaround for os.user.GroupIds unavailable with !osusergo --- executor/executable/task.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/executor/executable/task.go b/executor/executable/task.go index 0cecf3967..e07f3d513 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -182,12 +182,20 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { gidStrings, err := targetUser.GroupIds() if err != nil { - return nil, err + // Non-nil error means we're building with !osusergo, so our binary is fully + // static and therefore certain CGO calls needed by os.user aren't available. + // We work around by calling `id -G username` like in the shell. + idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user + output, err := idCmd.Output() + if err != nil { + return nil, err + } + gidStrings = strings.Split(string(output[:]), " ") } gids := make([]uint32, len(gidStrings)) for i, v := range gidStrings { - parsed, err := strconv.ParseUint(v, 10, 32) + parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32) if err != nil { return nil, err } From d7040ab4f80ee4afcae22bde270eb987b054ea74 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Oct 2020 17:10:14 +0200 Subject: [PATCH 0536/2352] [core] Clarify naming of some task slices/maps in scheduler.go --- core/scheduler.go | 70 ++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 34 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index 4249efdc4..aee91cdbb 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -496,13 +496,13 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl }).Trace("received offers") } - var descriptorsToDeploy task.Descriptors + var descriptorsStillToDeploy task.Descriptors select { - case descriptorsToDeploy = <- state.tasksToDeploy: + case descriptorsStillToDeploy = <- state.tasksToDeploy: if viper.GetBool("veryVerbose") { - rolePaths := make([]string, len(descriptorsToDeploy)) - taskClasses := make([]string, len(descriptorsToDeploy)) - for i, d := range descriptorsToDeploy { + rolePaths := make([]string, len(descriptorsStillToDeploy)) + taskClasses := make([]string, len(descriptorsStillToDeploy)) + for i, d := range descriptorsStillToDeploy { rolePaths[i] = d.TaskRole.GetPath() taskClasses[i] = d.TaskClassName } @@ -528,7 +528,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl tasksDeployed := make(task.DeploymentMap) - if len(descriptorsToDeploy) > 0 { + if len(descriptorsStillToDeploy) > 0 { // 3 ways to make decisions // * FLP1, FLP2, ... , EPN1, EPN2, ... o2-roles as mesos attributes of an agent // * readout cards as resources @@ -544,15 +544,17 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // We make a map[Descriptor]constraint.Constraints and for each descriptor to deploy we // fill it with the pre-computed total constraints for that Descriptor. - descriptorConstraints := state.taskman.BuildDescriptorConstraints(descriptorsToDeploy) + descriptorConstraints := state.taskman.BuildDescriptorConstraints(descriptorsStillToDeploy) // NOTE: 1 offer per host + // FIXME: this for should be parallelized with a sync.WaitGroup + // for a likely significant multinode launch performance increase for _, offer := range offers { var ( - remainingResources = mesos.Resources(offer.Resources) - tasks = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(task.DeploymentMap) - targetExecutorId = mesos.ExecutorID{} + remainingResourcesInOffer = mesos.Resources(offer.Resources) + taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) + tasksDeployedForCurrentOffer = make(task.DeploymentMap) + targetExecutorId = mesos.ExecutorID{} ) if len(offer.ExecutorIDs) == 0 { @@ -564,10 +566,10 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl log.WithPrefix("scheduler"). WithFields(logrus.Fields{ "offerId": offer.ID.Value, - "resources": remainingResources.String(), + "resources": remainingResourcesInOffer.String(), }).Debug("processing offer") - remainingResourcesFlattened := resources.Flatten(remainingResources) + remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) // avoid the expense of computing these if we can... if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { @@ -584,8 +586,8 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // We iterate down over the descriptors, and we remove them as we match FOR_DESCRIPTORS: - for i := len(descriptorsToDeploy)-1; i >= 0; i-- { - descriptor := descriptorsToDeploy[i] + for i := len(descriptorsStillToDeploy)-1; i >= 0; i-- { + descriptor := descriptorsStillToDeploy[i] log.WithPrefix("scheduler"). WithField("taskClass", descriptor.TaskClassName). Debug("processing descriptor") @@ -594,11 +596,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, + "taskClass": descriptor.TaskClassName, "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResources.String(), - "attributes": offerAttributes.String(), + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), }). Warn("descriptor constraints not satisfied by offer attributes") } @@ -612,14 +614,14 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl Warning("no resource demands for descriptor, invalid class perhaps?") continue } - if !task.Resources(remainingResources).Satisfy(wants) { + if !task.Resources(remainingResourcesInOffer).Satisfy(wants) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResources.String(), + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), }). Warn("descriptor wants not satisfied by offer resources") } @@ -633,7 +635,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl if ch.Addressing == channel.IPC { bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) } else { - availPorts, ok := resources.Ports(remainingResources...) + availPorts, ok := resources.Ports(remainingResourcesInOffer...) if !ok { continue FOR_DESCRIPTORS } @@ -643,7 +645,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl builder := resources.Build(). Name(resources.Name("ports")). Ranges(resources.BuildRanges().Span(port, port).Ranges) - remainingResources.Subtract(builder.Resource) + remainingResourcesInOffer.Subtract(builder.Resource) bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) } } @@ -682,7 +684,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl cmd := taskPtr.GetTaskCommandInfo() // Claim the control port - availPorts, ok := resources.Ports(remainingResources...) + availPorts, ok := resources.Ports(remainingResourcesInOffer...) if !ok { continue FOR_DESCRIPTORS } @@ -693,7 +695,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl builder := resources.Build(). Name(resources.Name("ports")). Ranges(resources.BuildRanges().Span(controlPort, controlPort).Ranges) - remainingResources.Subtract(builder.Resource) + remainingResourcesInOffer.Subtract(builder.Resource) // Append control port to arguments // For the control port parameter and/or environment variable, see occ/OccGlobals.h @@ -823,16 +825,16 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl log.Debug("state.Event channel is full") } - tasks = append(tasks, mesosTaskInfo) - descriptorsToDeploy = append(descriptorsToDeploy[:i], descriptorsToDeploy[i+1:]...) + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) tasksDeployedForCurrentOffer[taskPtr] = descriptor - } + } // end FOR_DESCRIPTORS state.Unlock() log.WithPrefix("scheduler").Debug("state unlock") // build ACCEPT call to launch all of the tasks we've assembled accept := calls.Accept( - calls.OfferOperations{calls.OpLaunch(tasks...)}.WithOffers(offer.ID), + calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), ).With(callOption) // handles refuseSeconds etc. // send ACCEPT call to mesos @@ -842,11 +844,11 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl Error("failed to launch tasks") // FIXME: we probably need to react to a failed ACCEPT here } else { - if n := len(tasks); n > 0 { + if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { tasksLaunchedThisCycle += n log.WithPrefix("scheduler").WithField("tasks", n). Info("tasks launched") - for _, taskInfo := range tasks { + for _, taskInfo := range taskInfosToLaunchForCurrentOffer { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ "executorId": taskInfo.GetExecutor().ExecutorID.Value, @@ -866,7 +868,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } } } // end for _, offerUsed := range offersUsed - } // end if len(descriptorsToDeploy) > 0 + } // end if len(descriptorsStillToDeploy) > 0 // build DECLINE call to reject offers we don't need any more declineSlice := make([]mesos.OfferID, len(offerIDsToDecline)) From 0e6dd684e3a5287a8fe5a7bfdba31101b48c3628 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 2 Oct 2020 14:36:32 +0200 Subject: [PATCH 0537/2352] [core] Adjust executor name string --- core/util.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/util.go b/core/util.go index 047975772..62e7aa95b 100644 --- a/core/util.go +++ b/core/util.go @@ -58,7 +58,7 @@ func prepareExecutorInfo( return &mesos.ExecutorInfo{ Type: mesos.ExecutorInfo_CUSTOM, ExecutorID: mesos.ExecutorID{Value: product.NAME + "-container-executor"}, - Name: proto.String("O² container executor"), + Name: proto.String("AliECS container executor"), Command: &mesos.CommandInfo{ Shell: func() *bool { x := false; return &x }(), }, @@ -88,7 +88,7 @@ func prepareExecutorInfo( return &mesos.ExecutorInfo{ Type: mesos.ExecutorInfo_CUSTOM, ExecutorID: mesos.ExecutorID{Value: product.NAME + "-executor"}, - Name: proto.String("O² executor"), + Name: proto.String("AliECS executor"), Command: &mesos.CommandInfo{ Value: proto.String(executorCommand), URIs: executorUris, From 17928aa202f2be85632368682b248e9e02c0a463 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Oct 2020 14:02:53 +0200 Subject: [PATCH 0538/2352] [core] Use sony/sonyflake via indigo for short environment IDs --- common/utils/uid/uid.go | 70 +++++++++++++++++++++++++++++++++ core/environment/environment.go | 12 +++--- core/environment/manager.go | 22 +++++------ core/server.go | 13 +++--- core/task/errors.go | 6 +-- core/task/manager.go | 9 +++-- core/task/task.go | 8 ++-- core/workflow/parentadapter.go | 6 +-- core/workflow/role.go | 4 +- core/workflow/rolebase.go | 6 +-- go.mod | 1 + go.sum | 5 +++ 12 files changed, 120 insertions(+), 42 deletions(-) create mode 100644 common/utils/uid/uid.go diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go new file mode 100644 index 000000000..c312eccca --- /dev/null +++ b/common/utils/uid/uid.go @@ -0,0 +1,70 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package uid + +import ( + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/osamingo/indigo" + "github.com/rs/xid" + "github.com/sirupsen/logrus" +) + +var ( + log = logger.New(logrus.StandardLogger(),"utils") + uidGen = indigo.New(nil, indigo.StartTime(time.Unix(1257894000, 0))) +) + +type ID string + +func (u ID) String() string { + return string(u) +} + +func (u ID) IsNil() bool { + return len(u) == 0 +} + +func FromString(s string) (ID, error) { + _, err := uidGen.Decompose(s) + if err != nil { + return "", err + } + return ID(s), nil +} + +func NilID() ID { + return "" +} + +func New() ID { + id, err := uidGen.NextID() + if err != nil { + log.Warnf("indigo.NextID() failed with %s, reverting to XID", err) + return ID(xid.New().String()) + } + return ID(id) +} diff --git a/core/environment/environment.go b/core/environment/environment.go index bc0f983af..b285e7e97 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -37,12 +37,12 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" - "github.com/rs/xid" "github.com/sirupsen/logrus" ) @@ -53,7 +53,7 @@ type Environment struct { Mu sync.RWMutex Sm *fsm.FSM name string - id xid.ID + id uid.ID ts time.Time workflow workflow.Role wfAdapter *workflow.ParentAdapter @@ -76,7 +76,7 @@ func (env *Environment) NotifyEvent(e event.DeviceEvent) { } func newEnvironment(userVars map[string]string) (env *Environment, err error) { - envId := xid.New() + envId := uid.New() env = &Environment{ id: envId, workflow: nil, @@ -91,7 +91,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { // Make the KVs accessible to the workflow via ParentAdapter env.wfAdapter = workflow.NewParentAdapter( - func() xid.ID { return env.Id() }, + func() uid.ID { return env.Id() }, func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, @@ -284,9 +284,9 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { // Accessors -func (env *Environment) Id() xid.ID { +func (env *Environment) Id() uid.ID { if env == nil { - return xid.NilID() + return uid.NilID() } env.Mu.RLock() defer env.Mu.RUnlock() diff --git a/core/environment/manager.go b/core/environment/manager.go index 2adb945c4..ed6c5e19a 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -30,26 +30,26 @@ import ( "strings" "sync" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" - "github.com/rs/xid" "github.com/sirupsen/logrus" ) type Manager struct { mu sync.RWMutex - m map[xid.ID]*Environment + m map[uid.ID]*Environment taskman *task.Manager } func NewEnvManager(tm *task.Manager) *Manager { return &Manager{ - m: make(map[xid.ID]*Environment), + m: make(map[uid.ID]*Environment), taskman: tm, } } -func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (xid.ID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uid.ID, error) { envs.mu.Lock() defer envs.mu.Unlock() @@ -72,7 +72,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env, err := newEnvironment(envUserVars) if err != nil { - return xid.NilID(), err + return uid.NilID(), err } env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) @@ -121,7 +121,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } -func (envs *Manager) TeardownEnvironment(environmentId xid.ID, force bool) error { +func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error { envs.mu.Lock() defer envs.mu.Unlock() @@ -149,10 +149,10 @@ func (envs *Manager) TeardownEnvironment(environmentId xid.ID, force bool) error return envs.m[environmentId.Array()].cfg }*/ -func (envs *Manager) Ids() (keys []xid.ID) { +func (envs *Manager) Ids() (keys []uid.ID) { envs.mu.RLock() defer envs.mu.RUnlock() - keys = make([]xid.ID, len(envs.m)) + keys = make([]uid.ID, len(envs.m)) i := 0 for k := range envs.m { keys[i] = k @@ -161,14 +161,14 @@ func (envs *Manager) Ids() (keys []xid.ID) { return } -func (envs *Manager) Environment(environmentId xid.ID) (env *Environment, err error) { +func (envs *Manager) Environment(environmentId uid.ID) (env *Environment, err error) { envs.mu.RLock() defer envs.mu.RUnlock() return envs.environment(environmentId) } -func (envs *Manager) environment(environmentId xid.ID) (env *Environment, err error) { - if len(environmentId.String()) == 0 { // invalid xid +func (envs *Manager) environment(environmentId uid.ID) (env *Environment, err error) { + if len(environmentId) == 0 { // invalid id return nil, fmt.Errorf("invalid id: %s", environmentId) } env, ok := envs.m[environmentId] diff --git a/core/server.go b/core/server.go index 99152f050..ca3e5e821 100644 --- a/core/server.go +++ b/core/server.go @@ -27,13 +27,14 @@ package core import ( "fmt" - "github.com/rs/xid" - "github.com/spf13/viper" "runtime" "sort" "strconv" "time" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/spf13/viper" + "github.com/AliceO2Group/Control/common/product" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" @@ -225,7 +226,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - envId, err := xid.FromString(req.Id) + envId, err := uid.FromString(req.Id) if err != nil { return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() } @@ -260,7 +261,7 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - envId, err := xid.FromString(req.Id) + envId, err := uid.FromString(req.Id) if err != nil { return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() } @@ -304,7 +305,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - envId, err := xid.FromString(req.Id) + envId, err := uid.FromString(req.Id) if err != nil { return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() } @@ -487,7 +488,7 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - envId, err := xid.FromString(req.EnvId) + envId, err := uid.FromString(req.EnvId) if err != nil { return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() } diff --git a/core/task/errors.go b/core/task/errors.go index 24fd5f27b..b203ef6ae 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -28,7 +28,7 @@ import ( "fmt" "strings" - "github.com/rs/xid" + "github.com/AliceO2Group/Control/common/utils/uid" ) type TaskError interface { @@ -88,11 +88,11 @@ func (r TaskNotFoundError) Error() string { type TaskLockedError struct { taskErrorBase - envId xid.ID + envId uid.ID } func (r TaskLockedError) Error() string { return fmt.Sprintf("task %s is locked by environment %s", r.taskId, r.envId) } -func (r TaskLockedError) EnvironmentId() xid.ID { +func (r TaskLockedError) EnvironmentId() uid.ID { return r.envId } \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index 6599fc960..6262ebd32 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -33,6 +33,7 @@ import ( "sync" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/rs/xid" "github.com/AliceO2Group/Control/common/utils" @@ -209,7 +210,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { return } -func (m *Manager) AcquireTasks(envId xid.ID, taskDescriptors Descriptors) (err error) { +func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { m.mu.Lock() defer m.mu.Unlock() @@ -368,7 +369,7 @@ func (m *Manager) AcquireTasks(envId xid.ID, taskDescriptors Descriptors) (err e return } -func (m *Manager) ReleaseTasks(envId xid.ID, tasks Tasks) error { +func (m *Manager) ReleaseTasks(envId uid.ID, tasks Tasks) error { m.mu.Lock() defer m.mu.Unlock() @@ -387,7 +388,7 @@ func (m *Manager) ReleaseTasks(envId xid.ID, tasks Tasks) error { return nil } -func (m *Manager) releaseTask(envId xid.ID, task *Task) error { +func (m *Manager) releaseTask(envId uid.ID, task *Task) error { if task == nil { return TaskNotFoundError{} } @@ -400,7 +401,7 @@ func (m *Manager) releaseTask(envId xid.ID, task *Task) error { return nil } -func (m *Manager) ConfigureTasks(envId xid.ID, tasks Tasks) error { +func (m *Manager) ConfigureTasks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() if err != nil { diff --git a/core/task/task.go b/core/task/task.go index 7ec8e70c1..3f4aca4a2 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -42,11 +42,11 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow/template" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/rs/xid" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -60,7 +60,7 @@ type parentRole interface { GetTaskClass() string GetTaskTraits() Traits SetTask(*Task) - GetEnvironmentId() xid.ID + GetEnvironmentId() uid.ID CollectOutboundChannels() []channel.Outbound GetDefaults() gera.StringMap GetVars() gera.StringMap @@ -348,9 +348,9 @@ func (t *Task) GetHostname() string { return t.hostname } -func (t *Task) GetEnvironmentId() xid.ID { +func (t *Task) GetEnvironmentId() uid.ID { if t.parent == nil { - return xid.NilID() + return uid.NilID() } return t.parent.GetEnvironmentId() } diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 1c5c04262..17d2eedd8 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -28,12 +28,12 @@ import ( "sync" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/rs/xid" ) -type GetEnvIdFunc func() xid.ID +type GetEnvIdFunc func() uid.ID type GetStringMapFunc func() gera.StringMap @@ -114,7 +114,7 @@ func (p *ParentAdapter) GetParent() Updatable { } -func (p *ParentAdapter) GetEnvironmentId() xid.ID { +func (p *ParentAdapter) GetEnvironmentId() uid.ID { return p.getEnvIdFunc() } diff --git a/core/workflow/role.go b/core/workflow/role.go index ab4ef558e..f14612a1a 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -30,12 +30,12 @@ package workflow import ( "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/gobwas/glob" - "github.com/rs/xid" ) type Role interface { @@ -66,7 +66,7 @@ type Updatable interface { GetParent() Updatable updateStatus(s task.Status) updateState(s task.State) //string? - GetEnvironmentId() xid.ID + GetEnvironmentId() uid.ID GetPath() string CollectOutboundChannels() []channel.Outbound CollectInboundChannels() []channel.Inbound diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 11b9ebe83..786c9dd1b 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -30,9 +30,9 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow/template" - "github.com/rs/xid" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" @@ -287,9 +287,9 @@ func (r *roleBase) GetName() string { return r.Name } -func (r* roleBase) GetEnvironmentId() xid.ID { +func (r* roleBase) GetEnvironmentId() uid.ID { if r.parent == nil { - return xid.NilID() + return uid.NilID() } return r.parent.GetEnvironmentId() } diff --git a/go.mod b/go.mod index fc85fe499..4ab45073f 100644 --- a/go.mod +++ b/go.mod @@ -69,6 +69,7 @@ require ( github.com/olekukonko/tablewriter v0.0.4 github.com/onsi/ginkgo v1.12.2 github.com/onsi/gomega v1.10.1 + github.com/osamingo/indigo v1.0.1 github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index 2a457ebf1..dc1a07b85 100644 --- a/go.sum +++ b/go.sum @@ -150,6 +150,7 @@ github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -494,6 +495,8 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/osamingo/indigo v1.0.1 h1:zYzUDKDD4ihcz+8nz1HkZeKxn2Fff40UD/FuV0rXXQQ= +github.com/osamingo/indigo v1.0.1/go.mod h1:P3iMtCzPHsVZfeO/XLHVgrm/fe454OsfnDoUYn/GTjw= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -591,6 +594,8 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= +github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= From 18359fa739eb224985b1ba203b06f4a965461092 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 2 Oct 2020 15:43:57 +0200 Subject: [PATCH 0539/2352] [core] Use short UID for task ID and executor ID --- core/scheduler.go | 6 ++++-- core/task/manager.go | 6 ++---- core/task/task.go | 2 +- core/workflow/template/stack.go | 4 ++-- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/scheduler.go b/core/scheduler.go index aee91cdbb..9c643b2f3 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -39,9 +39,9 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow" - "github.com/rs/xid" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/event" @@ -557,8 +557,10 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl targetExecutorId = mesos.ExecutorID{} ) + // If there are no executors provided by the offer, + // we start a new one by generating a new ID if len(offer.ExecutorIDs) == 0 { - targetExecutorId.Value = xid.New().String() + targetExecutorId.Value = uid.New().String() } else { targetExecutorId.Value = offer.ExecutorIDs[0].Value } diff --git a/core/task/manager.go b/core/task/manager.go index 6262ebd32..eb563f204 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -33,10 +33,8 @@ import ( "sync" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/rs/xid" - "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" @@ -96,7 +94,7 @@ func (m *Manager) NewTaskForMesosOffer( descriptor *Descriptor, localBindMap channel.BindMap, executorId mesos.ExecutorID) (t *Task) { - newId := xid.New().String() + newId := uid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), parent: descriptor.TaskRole, diff --git a/core/task/task.go b/core/task/task.go index 3f4aca4a2..08eab6525 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -408,7 +408,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // Post-processing for the ToPtree mechanism. // The ToPtree function has no access to the keys of propMap, so we need // to do a second pass here. - // For each run of ToPtree, a temporary __ptree__:: key is created + // For each run of ToPtree, a temporary __ptree__:: key is created // and the value of the key that pointed to ToPtree is set to this key. // We need to clear both of these keys, and create a new one like // __ptree__:: with the plain payload. diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 59c024feb..eac76e28f 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -33,8 +33,8 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/the" - "github.com/rs/xid" "github.com/sirupsen/logrus" ) @@ -74,7 +74,7 @@ func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPt syntaxLC = "json" } - ptreeId := fmt.Sprintf("__ptree__:%s:%s", syntaxLC, xid.New().String()) + ptreeId := fmt.Sprintf("__ptree__:%s:%s", syntaxLC, uid.New().String()) propMap[ptreeId] = localPayload return ptreeId } From b70744ae47c765c8df0fe6421f86563c8002e50b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 2 Oct 2020 15:44:21 +0200 Subject: [PATCH 0540/2352] [coconut] Adapt task id table for short UID --- coconut/control/control.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index eb7a4e65e..d9898f668 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -300,7 +300,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com if printTasks { _, _ = fmt.Fprintln(o, "") drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d tasks)", len(tasks)), "class name", "hostname", "status", "state"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "status", "state"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), @@ -483,7 +483,7 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a fmt.Fprintln(o, "no tasks running") } else { drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d tasks)", len(tasks)), "class name", "hostname", "locked", "status", "state","PID"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "status", "state","PID"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), @@ -520,7 +520,7 @@ func CleanTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, fmt.Fprintln(o, "0 tasks killed") } else { drawTableShortTaskInfos(response.KilledTasks, - []string{fmt.Sprintf("task id (%d tasks killed)", len(response.KilledTasks)), "class name", "hostname"}, + []string{fmt.Sprintf("task id (%d killed)", len(response.KilledTasks)), "class name", "hostname"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), From b9cc9d01f7764a236ffcc8ac84a7689c761abf0b Mon Sep 17 00:00:00 2001 From: David Rohr Date: Thu, 8 Oct 2020 20:13:33 +0200 Subject: [PATCH 0541/2352] Fix compiler warning about incorrect format string (run number is unsigned long, not long long) --- occ/occlib/OccServer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 5322cd732..a605d0528 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -237,7 +237,7 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: std::string evt = boost::algorithm::to_lower_copy(event); - printf("[OCC] Object: %s - processing event %s in state %s with run number %llu.\n", + printf("[OCC] Object: %s - processing event %s in state %s with run number %lu.\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str(), From a1652d4a198765badd137691ad19388507b44010 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 12 Oct 2020 14:04:57 +0200 Subject: [PATCH 0542/2352] [build] Bump to v0.17.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1abae9a30..e472f1115 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 16 +VERSION_MINOR := 17 VERSION_PATCH := 0 From 5f049d199d4b8df23d46b89af93e97fd0cf86bad Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 13 Oct 2020 13:55:34 +0200 Subject: [PATCH 0543/2352] [common] Ensure a machine ID is always passed to the uid generator --- common/utils/uid/uid.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go index c312eccca..19419c89f 100644 --- a/common/utils/uid/uid.go +++ b/common/utils/uid/uid.go @@ -35,7 +35,9 @@ import ( var ( log = logger.New(logrus.StandardLogger(),"utils") - uidGen = indigo.New(nil, indigo.StartTime(time.Unix(1257894000, 0))) + uidGen = indigo.New(nil, indigo.StartTime( + time.Unix(1257894000, 0)), + indigo.MachineID(func() (uint16, error){return 42, nil})) ) type ID string From 4ed8b757d97a987e56d4a50627b58e556ca8f1a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 13 Oct 2020 13:57:01 +0200 Subject: [PATCH 0544/2352] [build] Bump to v0.17.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e472f1115..d907bd87b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 17 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 595a103c7c54b6970737f21473b6802f77eb5bc2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Oct 2020 16:17:53 +0200 Subject: [PATCH 0545/2352] [common] Acquire machine-id for Sonyflake generator --- common/utils/uid/uid.go | 46 +++++++++++++++++++++++++++++++++++++---- go.mod | 3 ++- go.sum | 4 ++++ 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go index 19419c89f..e865fcaa4 100644 --- a/common/utils/uid/uid.go +++ b/common/utils/uid/uid.go @@ -25,22 +25,60 @@ package uid import ( + "encoding/binary" "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/denisbrodbeck/machineid" "github.com/osamingo/indigo" + "github.com/pborman/uuid" "github.com/rs/xid" "github.com/sirupsen/logrus" ) +type ID string var ( log = logger.New(logrus.StandardLogger(),"utils") - uidGen = indigo.New(nil, indigo.StartTime( - time.Unix(1257894000, 0)), - indigo.MachineID(func() (uint16, error){return 42, nil})) + uidGen *indigo.Generator ) -type ID string + +func init() { + // In order to correctly seed ID generation and ensure that all generated IDs + // are reasonably unique to a given machine, we need to provide a uint16 + // that represents the current machine. + // By default, Sonyflake/Indigo attempt to acquire such an ID from the machine's + // private IP address, but this doesn't always work (e.g. on some Docker + // instances). + // So we use denisbrodbeck/machineid to read in the standard machine-id in a + // cross-platform way. On CentOS and similar Linuxes, this means that we read + // the file /etc/machine-id. + // This file contains a standard UUID as string, so we need to parse it into + // a []byte, and fetch 2 of these bytes to generate the uint16 ID. If this + // fails, the uint16 ID defaults to 42. + var machineId uint16 = 42 + + id, err := machineid.ID() + if err == nil { + parsed := uuid.Parse(id) + if parsed != nil { + // The NodeID consists of the last 6 bytes of the full UUID. + // We use the first 2 bytes of this 6-byte block instead of the full + // uuid.Array because the first 10 bits are clock-dependent. + array := parsed.NodeID() + machineId = binary.BigEndian.Uint16(array[0:2]) + } + } else { + id = "" + } + log.Infof("machine UUID: %s generator machine ID: %d", id, machineId) + + uidGen = indigo.New( + nil, + indigo.StartTime(time.Unix(1257894000, 0)), // Go epoch + indigo.MachineID(func() (uint16, error){return machineId, nil}), + ) +} func (u ID) String() string { return string(u) diff --git a/go.mod b/go.mod index 4ab45073f..a5468d707 100644 --- a/go.mod +++ b/go.mod @@ -25,6 +25,7 @@ require ( github.com/coreos/etcd v3.3.19+incompatible // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect + github.com/denisbrodbeck/machineid v1.0.1 github.com/fatih/color v1.9.0 github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell v1.3.0 @@ -99,7 +100,7 @@ require ( go.uber.org/zap v1.14.1 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect golang.org/x/net v0.0.0-20200707034311-ab3426394381 - golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 + golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect google.golang.org/grpc v1.31.0 google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect diff --git a/go.sum b/go.sum index dc1a07b85..d8bc8de91 100644 --- a/go.sum +++ b/go.sum @@ -151,6 +151,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= +github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= +github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= @@ -854,6 +856,8 @@ golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zr golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc h1:HVFDs9bKvTxP6bh1Rj9MCSo+UmafQtI8ZWDPVwVk9g4= +golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From c3fd332a1ffcc19c72553423a96af04f43f298f9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Oct 2020 10:38:28 +0100 Subject: [PATCH 0546/2352] [executor] Increase gRPC dial timeout to workaround slow aliswmod issue --- executor/executorcmd/client.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 9195fdd82..63de737fb 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -53,6 +53,8 @@ const ( ProtobufTransport = ControlTransport(0) JsonTransport = ControlTransport(1) ) +const GRPC_DIAL_TIMEOUT = 75 * time.Second +// Very long timeout to work around very slow aliswmod issue func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlTransport ControlTransport) *RpcClient { endpoint := fmt.Sprintf("127.0.0.1:%d", controlPort) @@ -65,7 +67,7 @@ func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlT WithField("transport", controlTransportS). Debug("starting new gRPC client") - cxt, cancel := context.WithTimeout(context.Background(), 20*time.Second) + cxt, cancel := context.WithTimeout(context.Background(), GRPC_DIAL_TIMEOUT) conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { log.WithField("error", err.Error()). From 78bc37f16b0be62b2a199f433fbe499603207041 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Oct 2020 10:39:39 +0100 Subject: [PATCH 0547/2352] [build] Bump to v0.17.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d907bd87b..0a2b9d06b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 17 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 7bddd042c904b68c63b01dd64f43b46889313538 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Aug 2020 17:00:43 +0200 Subject: [PATCH 0548/2352] [build] Use latest FSM --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a5468d707..1eaf71442 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/k0kubun/pp v3.0.1+incompatible github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/looplab/fsm v0.1.0 + github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1 github.com/lucasb-eyer/go-colorful v1.0.3 // indirect github.com/mattn/go-colorable v0.1.6 // indirect github.com/mattn/go-runewidth v0.0.9 // indirect diff --git a/go.sum b/go.sum index d8bc8de91..6532488cd 100644 --- a/go.sum +++ b/go.sum @@ -411,6 +411,8 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= +github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1 h1:o8x6Bd9wEjQk/8+bNzmmLb+OUvrc4syw0JUVfa10v8k= +github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1/go.mod h1:p+IElwgCnAByqr2DWMuNbPjgMwqcHvTRZZn3dvKEke0= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= From dd667a1904ec0982559b32ff10cf27482ba66af4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 7 Aug 2020 14:10:48 +0300 Subject: [PATCH 0549/2352] [common] create MessageType --- common/event/messagetype.go | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 common/event/messagetype.go diff --git a/common/event/messagetype.go b/common/event/messagetype.go new file mode 100644 index 000000000..a415e1e85 --- /dev/null +++ b/common/event/messagetype.go @@ -0,0 +1,84 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "errors" + "fmt" + "strings" +) + +type MessageType int + +const( + AcquireTasks MessageType = iota + ConfigureTasks + TransitionTasks + ReleaseTasks + KillTasks + MesosEvent +) + +func (mt MessageType) String() string { + return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks"}[mt] +} + +func (mt *MessageType) UnmarshalJSON(b []byte) error { + return mt.UnmarshalText(b) +} + +func (mt *MessageType) UnmarshalText(b []byte) error { + str := strings.Trim(string(b), `"`) + + switch str { + case "AcquireTasks": + *mt = AcquireTasks + case "ConfigureTasks": + *mt = ConfigureTasks + case "TransitionTasks": + *mt = TransitionTasks + case "ReleaseTasks": + *mt = ReleaseTasks + case "KillTasks": + *mt = KillTasks + case "MesosEvent": + *mt = MesosEvent + } + + return nil +} + +func (mt *MessageType) MarshalJSON() (text []byte, err error) { + text, err = mt.MarshalText() + return []byte(fmt.Sprintf("\"%s\"", text)), err +} + +func (mt *MessageType) MarshalText() (text []byte, err error) { + if mt == nil { + return []byte{}, errors.New("cannot marshal nil MessageType") + } + + return []byte(mt.String()), nil +} From 3eb757ae0a87937d859f21c75f2fcf6d223d0fef Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 7 Aug 2020 14:16:04 +0300 Subject: [PATCH 0550/2352] [core] draft of managerV2 --- core/environment/manager.go | 35 +- core/environment/transition.go | 4 +- core/environment/transition_configure.go | 27 +- core/environment/transition_reset.go | 31 +- core/environment/transition_startactivity.go | 33 +- core/environment/transition_stopactivity.go | 31 +- core/scheduler.go | 53 +- core/state.go | 8 +- core/task/coreevent.go | 176 +++++ core/task/managerV2.go | 704 +++++++++++++++++++ core/task/match.go | 4 +- core/workflow/load.go | 2 +- 12 files changed, 997 insertions(+), 111 deletions(-) create mode 100644 core/task/coreevent.go create mode 100644 core/task/managerV2.go diff --git a/core/environment/manager.go b/core/environment/manager.go index ed6c5e19a..c033d2417 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -33,16 +33,17 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/common/event" "github.com/sirupsen/logrus" ) type Manager struct { mu sync.RWMutex m map[uid.ID]*Environment - taskman *task.Manager + taskman *task.ManagerV2 } -func NewEnvManager(tm *task.Manager) *Manager { +func NewEnvManager(tm *task.ManagerV2) *Manager { return &Manager{ m: make(map[uid.ID]*Environment), taskman: tm, @@ -93,10 +94,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { envState := env.CurrentState() envTasks := env.Workflow().GetTasks() - rlsErr := envs.taskman.ReleaseTasks(env.id, envTasks) - if rlsErr != nil { - log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") - } + taskmanMessage := task.NewenvironmentMessage(event.ReleaseTasks,env.id.Array(), envTasks, nil) + envs.taskman.MessageChannel <- taskmanMessage + // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) + // if rlsErr != nil { + // log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") + // } delete(envs.m, env.id) @@ -105,10 +108,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, // so there's no point in keeping it for future recovery & reconfiguration. var killedTasks task.Tasks - killedTasks, _, rlsErr = envs.taskman.KillTasks(envTasks.GetTaskIds()) - if rlsErr != nil { - log.WithError(rlsErr).Warn("task teardown error") - } + taskmanMessage = task.NewkillTasksMessage(envTasks.GetTaskIds()) + envs.taskman.MessageChannel <- taskmanMessage + // killedTasks, _, rlsErr = envs.taskman.KillTasks(envTasks.GetTaskIds()) + // if rlsErr != nil { + // log.WithError(rlsErr).Warn("task teardown error") + // } log.WithFields(logrus.Fields{ "killedCount": len(killedTasks), "lastEnvState": envState, @@ -134,10 +139,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - err = envs.taskman.ReleaseTasks(environmentId, env.Workflow().GetTasks()) - if err != nil { - return err - } + taskmanMessage := task.NewenvironmentMessage(event.ReleaseTasks,environmentId.Array(), env.Workflow().GetTasks(), nil) + envs.taskman.MessageChannel <- taskmanMessage + // err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks()) + // if err != nil { + // return err + // } delete(envs.m, environmentId) return err diff --git a/core/environment/transition.go b/core/environment/transition.go index 87a0d0ac9..9d2f0ee35 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -37,7 +37,7 @@ type Transition interface { do(*Environment) error } -func MakeTransition(taskman *task.Manager, optype pb.ControlEnvironmentRequest_Optype) Transition { +func MakeTransition(taskman *task.ManagerV2, optype pb.ControlEnvironmentRequest_Optype) Transition { switch optype { case pb.ControlEnvironmentRequest_CONFIGURE: return NewConfigureTransition(taskman, nil, nil, true) @@ -58,7 +58,7 @@ func MakeTransition(taskman *task.Manager, optype pb.ControlEnvironmentRequest_O } type baseTransition struct { - taskman *task.Manager + taskman *task.ManagerV2 name string } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index c59445303..81504be80 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -29,11 +29,12 @@ import ( "time" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/common/event" "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) -func NewConfigureTransition(taskman *task.Manager, addRoles []string, removeRoles []string, reconfigureAll bool) Transition { +func NewConfigureTransition(taskman *task.ManagerV2, addRoles []string, removeRoles []string, reconfigureAll bool) Transition { return &ConfigureTransition{ baseTransition: baseTransition{ name: "CONFIGURE", @@ -141,7 +142,9 @@ func (t ConfigureTransition) do(env *Environment) (err error) { taskDescriptors := wf.GenerateTaskDescriptors() if len(taskDescriptors) != 0 { - err = t.taskman.AcquireTasks(env.Id(), taskDescriptors) + // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) + taskmanMessage := task.NewenvironmentMessage(event.AcquireTasks, env.Id().Array(), nil, taskDescriptors) + t.taskman.MessageChannel <- taskmanMessage } if err != nil { return @@ -177,10 +180,12 @@ func (t ConfigureTransition) do(env *Environment) (err error) { tasks := wf.GetTasks() if len(tasks) != 0 { - err = t.taskman.ConfigureTasks(env.Id(), tasks) - if err != nil { - return - } + // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) + taskmanMessage := task.NewenvironmentMessage(event.ConfigureTasks, env.Id().Array(), tasks, nil) + t.taskman.MessageChannel <- taskmanMessage + // if err != nil { + // return + // } } // This will subscribe to workflow state change. In case of workflow state @@ -212,13 +217,21 @@ func (t ConfigureTransition) do(env *Environment) (err error) { prvState := env.CurrentState() env.setState(wfState.String()) if prvState == "RUNNING" { - err = t.taskman.TransitionTasks( + taskmanMessage := task.NewtransitionTaskMessage( env.Workflow().GetTasks(), task.RUNNING.String(), task.STOP.String(), task.CONFIGURED.String(), nil, ) + t.taskman.MessageChannel <- taskmanMessage + // err = t.taskman.TransitionTasks( + // env.Workflow().GetTasks(), + // task.RUNNING.String(), + // task.STOP.String(), + // task.CONFIGURED.String(), + // nil, + // ) } break WORKFLOW_STATE_LOOP } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index 841af9a04..d9b7af4c2 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -29,7 +29,7 @@ import ( "github.com/AliceO2Group/Control/core/task" ) -func NewResetTransition(taskman *task.Manager) Transition { +func NewResetTransition(taskman *task.ManagerV2) Transition { return &ResetTransition{ baseTransition: baseTransition{ name: "RESET", @@ -47,16 +47,25 @@ func (t ResetTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } - err = t.taskman.TransitionTasks( - env.Workflow().GetTasks(), - task.CONFIGURED.String(), - task.RESET.String(), - task.STANDBY.String(), - nil, - ) - if err != nil { - return - } + taskmanMessage := task.NewtransitionTaskMessage( + env.Workflow().GetTasks(), + task.CONFIGURED.String(), + task.RESET.String(), + task.STANDBY.String(), + nil, + ) + t.taskman.MessageChannel <- taskmanMessage + + // err = t.taskman.TransitionTasks( + // env.Workflow().GetTasks(), + // task.CONFIGURED.String(), + // task.RESET.String(), + // task.STANDBY.String(), + // nil, + // ) + // if err != nil { + // return + // } return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 2002a4604..79fcad4d3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -34,7 +34,7 @@ import ( "github.com/AliceO2Group/Control/core/the" ) -func NewStartActivityTransition(taskman *task.Manager) Transition { +func NewStartActivityTransition(taskman *task.ManagerV2) Transition { return &StartActivityTransition{ baseTransition: baseTransition{ name: "START_ACTIVITY", @@ -65,18 +65,27 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), } - err = t.taskman.TransitionTasks( - env.Workflow().GetTasks(), - task.CONFIGURED.String(), - task.START.String(), - task.RUNNING.String(), - args, - ) + taskmanMessage := task.NewtransitionTaskMessage( + env.Workflow().GetTasks(), + task.CONFIGURED.String(), + task.START.String(), + task.RUNNING.String(), + args, + ) + t.taskman.MessageChannel <- taskmanMessage - if err != nil { - env.currentRunNumber = 0 - return - } + // err = t.taskman.TransitionTasks( + // env.Workflow().GetTasks(), + // task.CONFIGURED.String(), + // task.START.String(), + // task.RUNNING.String(), + // args, + // ) + + // if err != nil { + // env.currentRunNumber = 0 + // return + // } log.WithField(infologger.Run, env.currentRunNumber).Info("run started") return diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 5a438b5b5..914abb7d6 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -30,7 +30,7 @@ import ( "github.com/AliceO2Group/Control/core/task" ) -func NewStopActivityTransition(taskman *task.Manager) Transition { +func NewStopActivityTransition(taskman *task.ManagerV2) Transition { return &StopActivityTransition{ baseTransition: baseTransition{ name: "STOP_ACTIVITY", @@ -51,18 +51,27 @@ func (t StopActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber).Info("stopping run") env.currentRunNumber = 0 + + taskmanMessage := task.NewtransitionTaskMessage( + env.Workflow().GetTasks(), + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + ) + t.taskman.MessageChannel <- taskmanMessage - err = t.taskman.TransitionTasks( - env.Workflow().GetTasks(), - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), - nil, - ) + // err = t.taskman.TransitionTasks( + // env.Workflow().GetTasks(), + // task.RUNNING.String(), + // task.STOP.String(), + // task.CONFIGURED.String(), + // nil, + // ) - if err != nil { - return - } + // if err != nil { + // return + // } return } diff --git a/core/scheduler.go b/core/scheduler.go index 9c643b2f3..e74b6a160 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -350,7 +350,7 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even } go func() { - state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) + // state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) state.servent.ProcessResponse(&res, sender) select { case state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): @@ -942,9 +942,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { switch updatedState { case mesos.TASK_FINISHED: - log.WithPrefix("scheduler").Debug("state lock for task finished") - state.Lock() - state.tasksFinished++ + // log.WithPrefix("scheduler").Debug("state lock") state.metricsAPI.tasksFinished() // FIXME: this should not quit when all tasks are done, but rather do some transition @@ -955,51 +953,12 @@ func statusUpdate(state *internalState) events.HandlerFunc { } else { tryReviveOffers(ctx, state) }*/ - state.Unlock() - log.WithPrefix("scheduler").Debug("state unlock") - - case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "taskId": s.GetTaskID().Value, - "state": updatedState.String(), - "reason": s.GetReason().String(), - "source": s.GetSource().String(), - "message": s.GetMessage(), - }). - Info("task inactive exception") - taskIDValue := s.GetTaskID().Value - t := state.taskman.GetTask(taskIDValue) - if t != nil && t.IsLocked() { - go state.taskman.UpdateTaskState(taskIDValue, "ERROR") - select { - case state.Event <- cpb.NewEventTaskState(taskIDValue, "ERROR"): - default: - log.Debug("state.Event channel is full") - } - } + // log.WithPrefix("scheduler").Debug("state unlock") } - // This will check if the task update is from a reconciliation, as well as whether the task - // is in a state in which a mesos Kill call is possible. - // Reconcilation tasks are not part of the taskman.roster - if s.GetReason().String() == "REASON_RECONCILIATION" && - (updatedState == mesos.TASK_STAGING || - updatedState == mesos.TASK_STARTING || - updatedState == mesos.TASK_RUNNING || - updatedState == mesos.TASK_KILLING || - updatedState == mesos.TASK_UNKNOWN) { - killCall := calls.Kill(s.TaskID.GetValue(), s.AgentID.GetValue()) - calls.CallNoData(ctx, state.cli, killCall) - } else { - // Enqueue task state update - go state.taskman.UpdateTaskStatus(&s) - select { - case state.Event <- cpb.NewEventTaskStatus(&s): - default: - log.Debug("state.Event channel is full") - } - } + taskmanMessage := task.NewmesosTaskMessage(s) + state.taskman.MessageChannel <- taskmanMessage + return nil } diff --git a/core/state.go b/core/state.go index f1fbf1e0c..b0a1996d2 100644 --- a/core/state.go +++ b/core/state.go @@ -110,7 +110,7 @@ func newInternalState(shutdown func()) (*internalState, error) { ) state.commandqueue = controlcommands.NewCommandQueue(state.servent) - taskman := task.NewManager( + taskman := task.NewManagerV2( resourceOffersDone, tasksToDeploy, reviveOffersTrg, @@ -118,8 +118,10 @@ func newInternalState(shutdown func()) (*internalState, error) { func(task *task.Task) error { return KillTask(context.TODO(), state, task.GetMesosCommandTarget()) }, + buildHTTPSched(creds), ) state.taskman = taskman + state.taskman.Start() state.environments = environment.NewEnvManager(state.taskman) state.commandqueue.Start() // FIXME: there should be 1 cq per env @@ -131,8 +133,6 @@ type internalState struct { // needs locking: wantsTaskResources mesos.Resources - tasksLaunched int - tasksFinished int err error // not used in multiple goroutines: @@ -154,7 +154,7 @@ type internalState struct { // uses locks, so thread safe sm *fsm.FSM environments *environment.Manager - taskman *task.Manager + taskman *task.ManagerV2 commandqueue *controlcommands.CommandQueue servent *controlcommands.Servent diff --git a/core/task/coreevent.go b/core/task/coreevent.go new file mode 100644 index 000000000..ff7dc84d7 --- /dev/null +++ b/core/task/coreevent.go @@ -0,0 +1,176 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "github.com/pborman/uuid" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/mesos/mesos-go/api/v1/lib" +) + +type TaskmanMessage struct { + MessageType event.MessageType `json:"_messageType"` + + environmentMessage + transitionTasksMessage + mesosTaskMessage + killTasksMessage +} + +func NewTaskmanMessage(mt event.MessageType) (t *TaskmanMessage) { + t = &TaskmanMessage{ + MessageType: mt, + } + return t +} + +func (tm *TaskmanMessage) GetMessageType() event.MessageType { + return tm.MessageType +} + +type environmentMessage struct { + envId uuid.Array + tasks Tasks + descriptors Descriptors +} + +func (em *environmentMessage) GetEnvironmentId() (envid uuid.Array) { + if em == nil { + return + } + return em.envId +} + +func (em *environmentMessage) GetTasks() Tasks { + if em == nil { + return nil + } + return em.tasks +} + +func (em *environmentMessage) GetDescriptors() Descriptors { + if em == nil { + return nil + } + return em.descriptors +} + +func NewenvironmentMessage(mt event.MessageType, envId uuid.Array, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { + t = NewTaskmanMessage(mt) + t.environmentMessage = environmentMessage{ + envId: envId, + tasks: tasks, + descriptors: desc, + } + return t +} + +type transitionTasksMessage struct { + src string + event string + dest string + commonArgs controlcommands.PropertyMap +} + +func (trm *transitionTasksMessage) GetSource() string { + if trm == nil { + return "" + } + return trm.src +} + +func (trm *transitionTasksMessage) GetEvent() string { + if trm == nil { + return "" + } + return trm.event +} + +func (trm *transitionTasksMessage) GetDestination() string { + if trm == nil { + return "" + } + return trm.dest +} + +func (trm *transitionTasksMessage) GetArguements() controlcommands.PropertyMap { + if trm == nil { + return nil + } + return trm.commonArgs +} + +func NewtransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap) (t *TaskmanMessage) { + t = NewTaskmanMessage(event.TransitionTasks) + t.transitionTasksMessage = transitionTasksMessage{ + src: src, + event: transitionEvent, + dest: dest, + commonArgs: cargs, + } + t.environmentMessage = environmentMessage{ + tasks: tasks, + } + return t +} + +type mesosTaskMessage struct { + mesosStatus mesos.TaskStatus +} + +func (ut *mesosTaskMessage) GetMesosStatus() (st mesos.TaskStatus) { + if ut == nil { + return + } + return ut.mesosStatus +} + +func NewmesosTaskMessage(mesosSt mesos.TaskStatus) (t *TaskmanMessage) { + t = NewTaskmanMessage(event.MesosEvent) + t.mesosTaskMessage = mesosTaskMessage{ + mesosStatus: mesosSt, + } + return t +} + +type killTasksMessage struct { + taskIds []string +} + +func(km *killTasksMessage) GetTaskIds() []string { + if km == nil { + return nil + } + return km.taskIds +} + +func NewkillTasksMessage(taskids []string) (t *TaskmanMessage) { + t = NewTaskmanMessage(event.KillTasks) + t.killTasksMessage = killTasksMessage{ + taskIds: taskids, + } + return t +} diff --git a/core/task/managerV2.go b/core/task/managerV2.go new file mode 100644 index 000000000..1f59aa916 --- /dev/null +++ b/core/task/managerV2.go @@ -0,0 +1,704 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +// This a draft refactor of manager.go with goal to achieve event-driven +// architecture. + +package task + +import ( + "context" + "errors" + "fmt" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" + "strings" + "sync" + + "github.com/AliceO2Group/Control/common/utils" + + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/task/channel" + "github.com/k0kubun/pp" + "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" + "github.com/pborman/uuid" + "github.com/sirupsen/logrus" +) + +type ManagerV2 struct { + AgentCache AgentCache + MessageChannel chan *TaskmanMessage + + mu sync.RWMutex + classes map[string]*Class + roster Tasks + + resourceOffersDone <-chan DeploymentMap + tasksToDeploy chan<- Descriptors + reviveOffersTrg chan struct{} + cq *controlcommands.CommandQueue + + doKillTask KillTaskFunc + tasksLaunched int + tasksFinished int + cli calls.Caller +} + +func NewManagerV2(resourceOffersDone <-chan DeploymentMap, + tasksToDeploy chan<- Descriptors, + reviveOffersTrg chan struct{}, + cq *controlcommands.CommandQueue, + killTaskFunc KillTaskFunc, + cli calls.Caller) (taskman *ManagerV2) { + taskman = &ManagerV2{ + classes: make(map[string]*Class), + roster: make(Tasks, 0), + resourceOffersDone: resourceOffersDone, + tasksToDeploy: tasksToDeploy, + reviveOffersTrg: reviveOffersTrg, + cq: cq, + doKillTask: killTaskFunc, + cli: cli, + } + return +} + +// NewTaskForMesosOffer accepts a Mesos offer and a Descriptor and returns a newly +// constructed Task. +// This function should only be called by the Mesos scheduler controller when +// matching role requests with offers (matchRoles). +func (m *ManagerV2) NewTaskForMesosOffer( + offer *mesos.Offer, + descriptor *Descriptor, + localBindMap channel.BindMap, + executorId mesos.ExecutorID) (t *Task) { + newId := uuid.NewUUID().String() + t = &Task{ + name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), + parent: descriptor.TaskRole, + className: descriptor.TaskClassName, + hostname: offer.Hostname, + agentId: offer.AgentID.Value, + offerId: offer.ID.Value, + taskId: newId, + properties: gera.MakeStringMap().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), + executorId: executorId.Value, + GetTaskClass: nil, + localBindMap: nil, + state: STANDBY, + status: INACTIVE, + } + t.GetTaskClass = func() *Class { + return m.GetTaskClass(t.className) + } + t.localBindMap = make(channel.BindMap) + for k, v := range localBindMap { + t.localBindMap[k] = v + } + return +} + +func (m *ManagerV2) removeInactiveClasses() { + + for taskClassIdentifier := range m.classes{ + if len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { + delete(m.classes, taskClassIdentifier) + } + } + + return +} + +func (m *ManagerV2) RemoveReposClasses(repoPath string) { //Currently unused + m.mu.Lock() + defer m.mu.Unlock() + + utils.EnsureTrailingSlash(&repoPath) + + for taskClassIdentifier := range m.classes{ + if strings.HasPrefix(taskClassIdentifier, repoPath) && + len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { + delete(m.classes, taskClassIdentifier) + } + } + + return +} + +func (m *ManagerV2) RefreshClasses(taskClassesRequired []string) (err error) { + m.mu.Lock() + defer m.mu.Unlock() + + m.removeInactiveClasses() + + var taskClassList []*Class + taskClassList, err = getTaskClassList(taskClassesRequired) + if err != nil { + return err + } + + for _, class := range taskClassList { + taskClassIdentifier := class.Identifier.String() + // If it already exists we update, otherwise we add the new class + if _, ok := m.classes[taskClassIdentifier]; ok { + *m.classes[taskClassIdentifier] = *class + } else { + m.classes[taskClassIdentifier] = class + } + } + return +} + +func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) (err error) { + m.mu.Lock() + defer m.mu.Unlock() + + /* + Here's what's gonna happen: + 1) check if any tasks are already in Roster, whether they are already locked + in an environment, and whether their host has attributes that satisfy the + constraints + 1a) TODO: for each of them in Roster with matching attributes but wrong class, + mark for teardown and mesos-deployment + 1b) for each of them in Roster with matching attributes and class, mark for + takeover and reconfiguration + 3) TODO: teardown the tasks in tasksToTeardown + 4) start the tasks in tasksToRun + 5) ensure that all of them reach a CONFIGURED state + */ + + tasksToRun := make(Descriptors, 0) + // TODO: also filter for tasks that satisfy attributes but are of wrong class, + // to be torn down and mesosed. + // tasksToTeardown := make([]TaskPtr, 0) + tasksAlreadyRunning := make(DeploymentMap) + for _, descriptor := range taskDescriptors { + /* + For each descriptor we check m.AgentCache for agent attributes: + this allows us for each idle task in roster, get agentid and plug it in cache to get the + attributes for that host, and then we know whether + 1) a running task of the same class on that agent would qualify + 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify + */ + + // Filter function that accepts a Task if + // a) it's !Locked + // b) has className matching Descriptor + // c) its Agent's Attributes satisfy the Descriptor's Constraints + taskMatches := func(taskPtr *Task) (ok bool) { + if taskPtr != nil { + if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { + agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) + taskClass, classFound := m.classes[descriptor.TaskClassName] + if classFound && taskClass != nil && agentInfo != nil { + targetConstraints := descriptor. + RoleConstraints.MergeParent(taskClass.Constraints) + if agentInfo.Attributes.Satisfy(targetConstraints) { + ok = true + return + } + } + } + } + return + } + runningTasksForThisDescriptor := m.roster.Filtered(taskMatches) + claimed := false + if len(runningTasksForThisDescriptor) > 0 { + // We have received a list of running, unlocked candidates to take over + // the current Descriptor. + // We now go through them, and if one of them is already claimed in + // tasksAlreadyRunning, we go to the next one until we exhaust our options. + for _, taskPtr := range runningTasksForThisDescriptor { + if _, ok := tasksAlreadyRunning[taskPtr]; ok { + continue + } else { // task not claimed yet, we do so now + tasksAlreadyRunning[taskPtr] = descriptor + claimed = true + break + } + } + } + + if !claimed { + tasksToRun = append(tasksToRun, descriptor) + } + } + + // TODO: fill out tasksToTeardown in the previous loop + //if len(tasksToTeardown) > 0 { + // err = m.TeardownTasks(tasksToTeardown) + // if err != nil { + // return errors.New(fmt.Sprintf("cannot restart roles: %s", err.Error())) + // } + //} + + // At this point, all descriptors are either + // - matched to a TaskPtr in tasksAlreadyRunning + // - awaiting Task deployment in tasksToRun + deploymentSuccess := true // hopefully + + deployedTasks := make(DeploymentMap) + if len(tasksToRun) > 0 { + // Alright, so we have some descriptors whose requirements should be met with + // new Tasks we're about to deploy here. + // First we ask Mesos to revive offers and block until done, then upon receiving + // the offers, we ask Mesos to run the required roles - if any. + + m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers + <- m.reviveOffersTrg // we only continue when it's done + + m.tasksToDeploy <- tasksToRun // blocks until received + log.WithField("environmentId", envId). + Debug("scheduler should have received request to deploy") + + // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static + // reservation for that mesos-role on behalf of our scheduler + + deployedTasks = <- m.resourceOffersDone + log.WithField("tasks", deployedTasks). + Debug("resourceOffers is done, new tasks running") + + if len(deployedTasks) != len(tasksToRun) { + // ↑ Not all roles could be deployed. We cannot proceed + // with running this environment, but we keep the roles + // running since they might be useful in the future. + deploymentSuccess = false + } + } + + if deploymentSuccess { + // ↑ means all the required processes are now running, and we + // are ready to update the envId + for taskPtr, descriptor := range deployedTasks { + taskPtr.parent = descriptor.TaskRole + // Ensure everything is filled out properly + if !taskPtr.IsLocked() { + log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") + deploymentSuccess = false + } + } + } + if !deploymentSuccess { + // While all the required roles are running, for some reason we + // can't lock some of them, so we must roll back and keep them + // unlocked in the roster. + var deployedTaskIds []string + for taskPtr, _ := range deployedTasks { + taskPtr.parent = nil + deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) + } + err = TasksDeploymentError{taskIds: deployedTaskIds} + } + + // Finally, we write to the roster. Point of no return! + for taskPtr, _ := range deployedTasks { + m.roster = append(m.roster, taskPtr) + } + if deploymentSuccess { + for taskPtr, _ := range deployedTasks { + taskPtr.parent.SetTask(taskPtr) + } + for taskPtr, descriptor := range tasksAlreadyRunning { + taskPtr.parent = descriptor.TaskRole + taskPtr.parent.SetTask(taskPtr) + } + } + + return +} + +func (m *ManagerV2) releaseTasks(envId uuid.Array, tasks Tasks) error { + m.mu.Lock() + defer m.mu.Unlock() + + for _, task := range tasks { + err := m.releaseTask(envId, task) + if err != nil { + switch err.(type) { + case TaskAlreadyReleasedError: + continue + default: + return err + } + } + } + + return nil +} + +func (m *ManagerV2) releaseTask(envId uuid.Array, task *Task) error { + if task == nil { + return TaskNotFoundError{} + } + if task.IsLocked() && task.GetEnvironmentId() != envId { + return TaskLockedError{taskErrorBase: taskErrorBase{taskId: task.name}, envId: envId} + } + + task.parent = nil + + return nil +} + +func (m *ManagerV2) configureTasks(envId uuid.Array, tasks Tasks) error { + notify := make(chan controlcommands.MesosCommandResponse) + receivers, err := tasks.GetMesosCommandTargets() + if err != nil { + return err + } + + m.mu.RLock() + // We generate a "bindMap" i.e. a map of the paths of registered inbound channels and their ports + bindMap := make(channel.BindMap) + for _, task := range tasks { + taskPath := task.parent.GetPath() + for inbChName, endpoint := range task.GetLocalBindMap() { + bindMap[taskPath + TARGET_SEPARATOR + inbChName] = + endpoint.ToTargetEndpoint(task.GetHostname()) + } + } + log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). + Debug("generated inbound bindMap for environment configuration") + + src := STANDBY.String() + event := "CONFIGURE" + dest := CONFIGURED.String() + args := make(controlcommands.PropertyMapsMap) + args, err = tasks.BuildPropertyMaps(bindMap) + if err != nil { + m.mu.RUnlock() + return err + } + log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") + m.mu.RUnlock() + + cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) + m.cq.Enqueue(cmd, notify) + + response := <- notify + close(notify) + + if response == nil { + return errors.New("nil response") + } + + errText := response.Err().Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + + // FIXME: improve error handling ↑ + + return nil +} + +func (m *ManagerV2) transitionTasks(tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { + notify := make(chan controlcommands.MesosCommandResponse) + receivers, err := tasks.GetMesosCommandTargets() + + if err != nil { + return err + } + + args := make(controlcommands.PropertyMapsMap) + + // If we're pushing some arg values to all targets... + if len(commonArgs) > 0 { + for _, rec := range receivers { + args[rec] = make(controlcommands.PropertyMap) + for k, v := range commonArgs { + args[rec][k] = v + } + } + } + + cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) + m.cq.Enqueue(cmd, notify) + + response := <- notify + close(notify) + + if response == nil { + return errors.New("unknown MesosCommand error: nil response received") + } + + errText := response.Err().Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + + // FIXME: improve error handling ↑ + + return nil +} + +func (m *ManagerV2) GetTaskClass(name string) (b *Class) { + if m == nil { + return + } + b = m.classes[name] + return +} + +func (m *ManagerV2) TaskCount() int { + if m == nil { + return -1 + } + return len(m.roster) +} + +func (m *ManagerV2) GetTasks() Tasks { + if m == nil { + return nil + } + return m.roster +} + +func (m *ManagerV2) GetTask(id string) *Task { + if m == nil { + return nil + } + for _, t := range m.roster { + if t.taskId == id { + return t + } + } + return nil +} + +func (m *ManagerV2) updateTaskState(taskId string, state string) { + m.mu.RLock() + defer m.mu.RUnlock() + + taskPtr := m.roster.GetByTaskId(taskId) + if taskPtr == nil { + log.WithField("taskId", taskId). + Warn("attempted state update of task not in roster") + return + } + + st := StateFromString(state) + taskPtr.state = st + taskPtr.safeToStop = false + if taskPtr.parent != nil { + taskPtr.parent.UpdateState(st) + } +} + +func (m *ManagerV2) updateTaskStatus(status *mesos.TaskStatus) { + m.mu.RLock() + defer m.mu.RUnlock() + + taskId := status.GetTaskID().Value + taskPtr := m.roster.GetByTaskId(taskId) + if taskPtr == nil { + log.WithField("taskId", taskId). + Warn("attempted status update of task not in roster") + return + } + + switch st := status.GetState(); st { + case mesos.TASK_RUNNING: + log.WithField("taskId", taskId). + WithField("name", taskPtr.GetName()). + Debug("task running") + taskPtr.status = ACTIVE + if taskPtr.parent != nil { + taskPtr.parent.UpdateStatus(ACTIVE) + } + case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + taskPtr.status = INACTIVE + if taskPtr.parent != nil { + taskPtr.parent.UpdateStatus(INACTIVE) + } + } +} + +// Kill all tasks outside an environment (all unlocked tasks) +func (m *ManagerV2) cleanup() (killed Tasks, running Tasks, err error) { + m.mu.Lock() + defer m.mu.Unlock() + + toKill := m.roster.Filtered(func(t *Task) bool { + return !t.IsLocked() + }) + + killed, running, err = m.doKillTasks(toKill) + return +} + +// Kill a specific list of tasks. +// If the task list includes locked tasks, TaskNotFoundError is returned. +func (m *ManagerV2) killTasks(taskIds []string) (killed Tasks, running Tasks, err error) { + m.mu.Lock() + defer m.mu.Unlock() + + toKill := m.roster.Filtered(func(t *Task) bool { + if t.IsLocked() { + return false + } + for _, id := range taskIds { + if t.taskId == id { + return true + } + } + return false + }) + + if len(toKill) < len(taskIds) { + err = TaskNotFoundError{} + return + } + + killed, running, err = m.doKillTasks(toKill) + return +} + +func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err error) { + // We assume all tasks are unlocked + + // Build slice of tasks with status !ACTIVE + inactiveTasks := tasks.Filtered(func(task *Task) bool { + return task.status != ACTIVE + }) + // Remove from the roster the tasks which are also in the inactiveTasks list to delete + m.roster = m.roster.Filtered(func(task *Task) bool { + return !inactiveTasks.Contains(func(t *Task) bool { + return t.taskId == task.taskId + }) + }) + + for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { + e := m.doKillTask(task) + if e != nil { + log.WithError(e).WithField("taskId", task.taskId).Error("could not kill task") + err = errors.New("could not kill some tasks") + } else { + killed = append(killed, task) + } + } + + // Remove from the roster the tasks we've just killed + m.roster = m.roster.Filtered(func(task *Task) bool { + return !killed.Contains(func(t *Task) bool { + return t.taskId == task.taskId + }) + }) + running = m.roster + + return +} + +func (m *ManagerV2) Start() { + m.mu.Lock() + m.MessageChannel = make(chan *TaskmanMessage, QUEUE_SIZE) + m.mu.Unlock() + + go func() { + for { + select { + case taskmanMessage, ok := <-m.MessageChannel: + if !ok { // if the channel is closed, we bail + return + } + err := m.handleMessage(taskmanMessage) + if err != nil { + log.Debug(err) + } + } + } + }() +} + +func (m *ManagerV2) stop() { + m.mu.Lock() + defer m.mu.Unlock() + close(m.MessageChannel) +} + +func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { + if m == nil { + return errors.New("manager is nil") + } + + messageType := tm.GetMessageType() + + switch messageType{ + case event.AcquireTasks: + m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) + case event.ConfigureTasks: + m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + case event.TransitionTasks: + m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguements()) + case event.MesosEvent: + mesosStatus := tm.GetMesosStatus() + mesosState := mesosStatus.GetState() + switch mesosState { + case mesos.TASK_FINISHED: + m.tasksFinished++ + case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + log.WithPrefix("taskman"). + WithFields(logrus.Fields{ + "taskId": mesosStatus.GetTaskID().Value, + "state": mesosState.String(), + "reason": mesosStatus.GetReason().String(), + "source": mesosStatus.GetSource().String(), + "message": mesosStatus.GetMessage(), + }). + Info("task inactive exception") + taskIDValue := mesosStatus.GetTaskID().Value + t := m.GetTask(taskIDValue) + if t != nil && t.IsLocked() { + go m.updateTaskState(taskIDValue, "ERROR") + } + } + + // This will check if the task update is from a reconciliation, as well as whether the task + // is in a state in which a mesos Kill call is possible. + // Reconcilation tasks are not part of the taskman.roster + if mesosStatus.GetReason().String() == "REASON_RECONCILIATION" && + (mesosState == mesos.TASK_STAGING || + mesosState == mesos.TASK_STARTING || + mesosState == mesos.TASK_RUNNING || + mesosState == mesos.TASK_KILLING || + mesosState == mesos.TASK_UNKNOWN) { + killCall := calls.Kill(mesosStatus.TaskID.GetValue(), mesosStatus.AgentID.GetValue()) + calls.CallNoData(context.TODO(), m.cli, killCall) + } else { + // Enqueue task state update + go m.updateTaskStatus(&mesosStatus) + } + case event.KillTasks: + m.killTasks(tm.GetTaskIds()) + // noop + case event.ReleaseTasks: + m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + // noop + } + + + return nil +} \ No newline at end of file diff --git a/core/task/match.go b/core/task/match.go index ff5d9f565..04f6c956a 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -38,7 +38,7 @@ type Wants struct { InboundChannels []channel.Inbound } -func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { +func (m *ManagerV2) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { taskClass, ok := m.classes[descriptor.TaskClassName] if ok && taskClass != nil { r = &Wants{} @@ -93,7 +93,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { return true } -func (m *Manager) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { +func (m *ManagerV2) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { cm = make(map[*Descriptor]constraint.Constraints) for _, descriptor := range descriptors { taskClass, ok := m.classes[descriptor.TaskClassName] diff --git a/core/workflow/load.go b/core/workflow/load.go index acab68f96..9a4b2f1da 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -40,7 +40,7 @@ import ( ) // FIXME: workflowPath should be of type configuration.Path, not string -func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { +func Load(workflowPath string, parent Updatable, taskManager *task.ManagerV2, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var resolvedWorkflowPath string From d7e13a02e8015522a0970cc92544a19a9c404717 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 7 Aug 2020 20:47:01 +0300 Subject: [PATCH 0551/2352] [core] Rebase and add TriggerHooks --- common/event/messagetype.go | 11 ++++--- core/environment/manager.go | 19 +++++++---- core/scheduler.go | 8 +++-- core/task/coreevent.go | 64 ++++++++++++++++++++----------------- core/task/managerV2.go | 56 ++++++++++++++++++++++++++------ 5 files changed, 106 insertions(+), 52 deletions(-) diff --git a/common/event/messagetype.go b/common/event/messagetype.go index a415e1e85..f4f9882d2 100644 --- a/common/event/messagetype.go +++ b/common/event/messagetype.go @@ -38,11 +38,12 @@ const( TransitionTasks ReleaseTasks KillTasks - MesosEvent + TaskStatusMessage + TaskStateMessage ) func (mt MessageType) String() string { - return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks"}[mt] + return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage"}[mt] } func (mt *MessageType) UnmarshalJSON(b []byte) error { @@ -63,8 +64,10 @@ func (mt *MessageType) UnmarshalText(b []byte) error { *mt = ReleaseTasks case "KillTasks": *mt = KillTasks - case "MesosEvent": - *mt = MesosEvent + case "TaskStatusMessage": + *mt = TaskStatusMessage + case "TaskStateMessage": + *mt = TaskStateMessage } return nil diff --git a/core/environment/manager.go b/core/environment/manager.go index c033d2417..0e79656cf 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -107,13 +107,18 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // This is an important step as env deploy failures are often caused by bad task // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, // so there's no point in keeping it for future recovery & reconfiguration. - var killedTasks task.Tasks - taskmanMessage = task.NewkillTasksMessage(envTasks.GetTaskIds()) - envs.taskman.MessageChannel <- taskmanMessage - // killedTasks, _, rlsErr = envs.taskman.KillTasks(envTasks.GetTaskIds()) - // if rlsErr != nil { - // log.WithError(rlsErr).Warn("task teardown error") - // } + + // draft mostly on Cleanup() and KillTasks() we need the killedTasks + // either to print them or return them to server. We need to setup a way + // to communicate back such info from taskman (channel ?) + // var killedTasks task.Tasks + // taskmanMessage = task.NewkillTasksMessage(envTasks.GetTaskIds()) + // envs.taskman.MessageChannel <- taskmanMessage + + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } log.WithFields(logrus.Fields{ "killedCount": len(killedTasks), "lastEnvState": envState, diff --git a/core/scheduler.go b/core/scheduler.go index e74b6a160..368e0ffed 100644 --- a/core/scheduler.go +++ b/core/scheduler.go @@ -350,7 +350,11 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even } go func() { - // state.taskman.UpdateTaskState(res.TaskId, res.CurrentState) + taskmanMessage := task.NewTaskStateMessage(res.TaskId, res.CurrentState) + state.taskman.MessageChannel <-taskmanMessage + + // servent should be inside taskman and eventually + // all this handling. state.servent.ProcessResponse(&res, sender) select { case state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): @@ -956,7 +960,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { // log.WithPrefix("scheduler").Debug("state unlock") } - taskmanMessage := task.NewmesosTaskMessage(s) + taskmanMessage := task.NewTaskStatusMessage(s) state.taskman.MessageChannel <- taskmanMessage diff --git a/core/task/coreevent.go b/core/task/coreevent.go index ff7dc84d7..16ea66bc1 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -36,8 +36,8 @@ type TaskmanMessage struct { environmentMessage transitionTasksMessage - mesosTaskMessage - killTasksMessage + updateTaskMessage + // killTasksMessage } func NewTaskmanMessage(mt event.MessageType) (t *TaskmanMessage) { @@ -137,40 +137,44 @@ func NewtransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg return t } -type mesosTaskMessage struct { - mesosStatus mesos.TaskStatus +type updateTaskMessage struct { + taskId string + state string + status mesos.TaskStatus } -func (ut *mesosTaskMessage) GetMesosStatus() (st mesos.TaskStatus) { - if ut == nil { - return - } - return ut.mesosStatus -} - -func NewmesosTaskMessage(mesosSt mesos.TaskStatus) (t *TaskmanMessage) { - t = NewTaskmanMessage(event.MesosEvent) - t.mesosTaskMessage = mesosTaskMessage{ - mesosStatus: mesosSt, +func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { + t = NewTaskmanMessage(event.TaskStatusMessage) + t.updateTaskMessage = updateTaskMessage{ + status: mesosStatus, } return t } -type killTasksMessage struct { - taskIds []string -} - -func(km *killTasksMessage) GetTaskIds() []string { - if km == nil { - return nil - } - return km.taskIds -} - -func NewkillTasksMessage(taskids []string) (t *TaskmanMessage) { - t = NewTaskmanMessage(event.KillTasks) - t.killTasksMessage = killTasksMessage{ - taskIds: taskids, +func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { + t = NewTaskmanMessage(event.TaskStateMessage) + t.updateTaskMessage = updateTaskMessage{ + taskId: taskid, + state: state, } return t } + +// type killTasksMessage struct { +// taskIds []string +// } + +// func(km *killTasksMessage) GetTaskIds() []string { +// if km == nil { +// return nil +// } +// return km.taskIds +// } + +// func NewkillTasksMessage(taskids []string) (t *TaskmanMessage) { +// t = NewTaskmanMessage(event.KillTasks) +// t.killTasksMessage = killTasksMessage{ +// taskIds: taskids, +// } +// return t +// } diff --git a/core/task/managerV2.go b/core/task/managerV2.go index 1f59aa916..d2a6f240c 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -48,6 +48,9 @@ import ( "github.com/sirupsen/logrus" ) +const TaskMan_QUEUE = 1024 + + type ManagerV2 struct { AgentCache AgentCache MessageChannel chan *TaskmanMessage @@ -455,6 +458,41 @@ func (m *ManagerV2) transitionTasks(tasks Tasks, src string, event string, dest return nil } +func (m *ManagerV2) TriggerHooks(tasks Tasks) error { + if len(tasks) == 0 { + return nil + } + + notify := make(chan controlcommands.MesosCommandResponse) + receivers, err := tasks.GetMesosCommandTargets() + + if err != nil { + return err + } + + cmd := controlcommands.NewMesosCommand_TriggerHook(receivers) + err = m.cq.Enqueue(cmd, notify) + if err != nil { + return err + } + + response := <- notify + close(notify) + + if response == nil { + return errors.New("unknown MesosCommand error: nil response received") + } + + errText := response.Err().Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + + // FIXME: improve error handling ↑ + + return nil +} + func (m *ManagerV2) GetTaskClass(name string) (b *Class) { if m == nil { return @@ -538,7 +576,7 @@ func (m *ManagerV2) updateTaskStatus(status *mesos.TaskStatus) { } // Kill all tasks outside an environment (all unlocked tasks) -func (m *ManagerV2) cleanup() (killed Tasks, running Tasks, err error) { +func (m *ManagerV2) Cleanup() (killed Tasks, running Tasks, err error) { m.mu.Lock() defer m.mu.Unlock() @@ -552,7 +590,7 @@ func (m *ManagerV2) cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. -func (m *ManagerV2) killTasks(taskIds []string) (killed Tasks, running Tasks, err error) { +func (m *ManagerV2) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { m.mu.Lock() defer m.mu.Unlock() @@ -614,7 +652,7 @@ func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err e func (m *ManagerV2) Start() { m.mu.Lock() - m.MessageChannel = make(chan *TaskmanMessage, QUEUE_SIZE) + m.MessageChannel = make(chan *TaskmanMessage, TaskMan_QUEUE) m.mu.Unlock() go func() { @@ -653,8 +691,8 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) case event.TransitionTasks: m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguements()) - case event.MesosEvent: - mesosStatus := tm.GetMesosStatus() + case event.TaskStatusMessage: + mesosStatus := tm.status mesosState := mesosStatus.GetState() switch mesosState { case mesos.TASK_FINISHED: @@ -691,12 +729,12 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { // Enqueue task state update go m.updateTaskStatus(&mesosStatus) } - case event.KillTasks: - m.killTasks(tm.GetTaskIds()) - // noop + case event.TaskStateMessage: + go m.updateTaskState(tm.taskId, tm.state) + // case event.KillTasks: + // m.killTasks(tm.GetTaskIds()) case event.ReleaseTasks: m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) - // noop } From 7ee4d0b1611918f0cedc8b8c88e5e5c8be247372 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 17 Aug 2020 17:28:46 +0200 Subject: [PATCH 0552/2352] [core] Refactor scheduler into task.Manager --- .../{taskevent.go => announcetaskpidevent.go} | 25 +- common/event/deviceevent.go | 9 +- common/event/event.go | 52 +++++ core/config.go | 28 +-- core/core.go | 110 +-------- core/environment/manager.go | 118 +++++++++- core/environment/transition_configure.go | 8 +- core/environment/transition_reset.go | 2 +- core/environment/transition_startactivity.go | 2 +- core/environment/transition_stopactivity.go | 2 +- core/{env.go => envutil.go} | 0 core/globalstate.go | 89 ++++++++ core/server.go | 47 ++-- core/signals.go | 14 +- core/state.go | 162 ------------- core/task/coreevent.go | 22 +- core/task/managerV2.go | 115 ++++++++-- core/{ => task}/metrics.go | 5 +- core/{ => task}/scheduler.go | 196 +++++----------- core/task/schedulerstate.go | 215 ++++++++++++++++++ core/task/schedutil/credentials.go | 58 +++++ core/{ => task/schedutil}/flags.go | 18 +- core/{ => task/schedutil}/forever.go | 4 +- core/{util.go => task/schedutil/mesosutil.go} | 58 ++--- .../event => core/task/taskop}/messagetype.go | 2 +- executor/executable/controllabletask.go | 2 +- 26 files changed, 769 insertions(+), 594 deletions(-) rename common/event/{taskevent.go => announcetaskpidevent.go} (73%) create mode 100644 common/event/event.go rename core/{env.go => envutil.go} (100%) create mode 100644 core/globalstate.go delete mode 100644 core/state.go rename core/{ => task}/metrics.go (94%) rename core/{ => task}/scheduler.go (84%) create mode 100644 core/task/schedulerstate.go create mode 100644 core/task/schedutil/credentials.go rename core/{ => task/schedutil}/flags.go (86%) rename core/{ => task/schedutil}/forever.go (94%) rename core/{util.go => task/schedutil/mesosutil.go} (86%) rename {common/event => core/task/taskop}/messagetype.go (99%) diff --git a/common/event/taskevent.go b/common/event/announcetaskpidevent.go similarity index 73% rename from common/event/taskevent.go rename to common/event/announcetaskpidevent.go index 7fd11e7b4..53971da4b 100644 --- a/common/event/taskevent.go +++ b/common/event/announcetaskpidevent.go @@ -24,37 +24,26 @@ package event -type TaskMessage interface { - GetName() string - GetTaskId() string - GetTaskPID() int -} - -type TaskMessageBase struct { - Name string `json:"name"` +type AnnounceTaskPIDEvent struct { + eventBase TaskId string `json:"taskId"` PID int32 `json:"pid"` MessageType string `json:"_messageType"` } -func (tmb *TaskMessageBase) GetName() string { - return tmb.Name -} - -func (tmb *TaskMessageBase) GetTaskId() string { +func (tmb *AnnounceTaskPIDEvent) GetTaskId() string { return tmb.TaskId } -func (tmb *TaskMessageBase) GetTaskPID() int { +func (tmb *AnnounceTaskPIDEvent) GetTaskPID() int { return int(tmb.PID) } -func NewTaskMessage(name, id string, pid int32) (tm TaskMessage) { - tm = &TaskMessageBase{ - Name: name, +func NewAnnounceTaskPIDEvent(id string, pid int32) (tm *AnnounceTaskPIDEvent) { + tm = &AnnounceTaskPIDEvent{ TaskId: id, PID: pid, - MessageType: "TaskMessage", + MessageType: "AnnounceTaskPIDEvent", } return tm } diff --git a/common/event/deviceevent.go b/common/event/deviceevent.go index 92ad2cdc8..702faa089 100644 --- a/common/event/deviceevent.go +++ b/common/event/deviceevent.go @@ -30,21 +30,22 @@ import ( ) type DeviceEventOrigin struct { + // FIXME: replace these Mesos-tainted string wrappers with plain strings AgentId mesos.AgentID `json:"agentId"` ExecutorId mesos.ExecutorID `json:"executorId"` TaskId mesos.TaskID `json:"taskId"` } type DeviceEvent interface { - GetName() string + Event GetOrigin() DeviceEventOrigin GetType() pb.DeviceEventType } type DeviceEventBase struct { + eventBase Type pb.DeviceEventType `json:"type"` Origin DeviceEventOrigin `json:"origin"` - MessageType string `json:"_messageType"` } func (b *DeviceEventBase) GetOrigin() DeviceEventOrigin { @@ -66,17 +67,17 @@ func NewDeviceEvent(origin DeviceEventOrigin, t pb.DeviceEventType) (de DeviceEv case pb.DeviceEventType_END_OF_STREAM: de = &EndOfStream{ DeviceEventBase: DeviceEventBase{ + eventBase: *newDeviceEventBase("DeviceEvent", nil), Type: t, Origin: origin, - MessageType: "DeviceEvent", }, } case pb.DeviceEventType_BASIC_TASK_TERMINATED: de = &BasicTaskTerminated{ DeviceEventBase: DeviceEventBase{ + eventBase: *newDeviceEventBase("DeviceEvent", nil), Type: t, Origin: origin, - MessageType: "DeviceEvent", }, } case pb.DeviceEventType_NULL_DEVICE_EVENT: diff --git a/common/event/event.go b/common/event/event.go new file mode 100644 index 000000000..316dfccba --- /dev/null +++ b/common/event/event.go @@ -0,0 +1,52 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import "github.com/AliceO2Group/Control/common/utils" + +type Event interface { + GetName() string + GetTimestamp() string +} + +type eventBase struct { + Timestamp string `json:"timestamp"` + MessageType string `json:"_messageType"` +} + +func (e *eventBase) GetTimestamp() string { + return e.Timestamp +} + +func newDeviceEventBase(messageType string, optionalTimestamp *string) (e *eventBase) { + timestamp := utils.NewUnixTimestamp() + if optionalTimestamp != nil { + timestamp = *optionalTimestamp + } + return &eventBase{ + Timestamp: timestamp, + MessageType: messageType, + } +} \ No newline at end of file diff --git a/core/config.go b/core/config.go index c1803b880..12834f5f2 100644 --- a/core/config.go +++ b/core/config.go @@ -27,21 +27,20 @@ package core import ( "errors" "fmt" + "net/url" + "os" + "path/filepath" + "strings" + "github.com/AliceO2Group/Control/common/product" "github.com/AliceO2Group/Control/common/utils" - "github.com/mesos/mesos-go/api/v1/cmd" - "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" + "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/spf13/pflag" "github.com/spf13/viper" + _ "github.com/spf13/viper/remote" "golang.org/x/sys/unix" - "net/url" - "os" - "path/filepath" - "strings" ) -import _ "github.com/spf13/viper/remote" - func setDefaults() error { exe, err := os.Executable() if err != nil { @@ -62,11 +61,10 @@ func setDefaults() error { viper.SetDefault("mesosApiTimeout", envDuration("MESOS_CONNECT_TIMEOUT", "20s")) viper.SetDefault("mesosAuthMode", env("AUTH_MODE", "")) viper.SetDefault("mesosCheckpoint", true) - viper.SetDefault("mesosCodec", codec{Codec: codecs.ByMediaType[codecs.MediaTypeProtobuf]}) viper.SetDefault("mesosCompression", false) viper.SetDefault("mesosCredentials.username", env("AUTH_USER", "")) viper.SetDefault("mesosCredentials.passwordFile", env("AUTH_PASSWORD_FILE", "")) - viper.SetDefault("mesosExecutorImage", env("EXEC_IMAGE", cmd.DockerImageTag)) + viper.SetDefault("mesosExecutorImage", env("EXEC_IMAGE", "")) viper.SetDefault("mesosFailoverTimeout", envDuration("SCHEDULER_FAILOVER_TIMEOUT", "1000h")) viper.SetDefault("mesosFrameworkHostname", "") viper.SetDefault("mesosFrameworkName", env("FRAMEWORK_NAME", product.NAME)) @@ -74,7 +72,7 @@ func setDefaults() error { viper.SetDefault("mesosFrameworkUser", env("FRAMEWORK_USER", "root")) viper.SetDefault("mesosGpuClusterCompat", false) viper.SetDefault("mesosJobRestartDelay", envDuration("JOB_RESTART_DELAY", "5s")) - viper.SetDefault("mesosLabels", Labels{}) + viper.SetDefault("mesosLabels", schedutil.Labels{}) viper.SetDefault("mesosMaxRefuseSeconds", envDuration("MAX_REFUSE_SECONDS", "5s")) viper.SetDefault("mesosPrincipal", "") viper.SetDefault("mesosReviveBurst", envInt("REVIVE_BURST", "3")) @@ -104,7 +102,7 @@ func setFlags() error { pflag.Float64("executorMemory", viper.GetFloat64("executorMemory"), "Memory resources (MB) to consume per-executor") pflag.String("instanceName", viper.GetString("instanceName"), "User-visible name for this AliECS instance.") pflag.Duration("mesosApiTimeout", viper.GetDuration("mesosApiTimeout"), "Mesos scheduler API connection timeout") - pflag.String("mesosAuthMode", viper.GetString("mesosAuthMode"), "Method to use for Mesos authentication; specify '"+AuthModeBasic+"' for simple HTTP authentication") + pflag.String("mesosAuthMode", viper.GetString("mesosAuthMode"), "Method to use for Mesos authentication; specify '"+schedutil.AuthModeBasic+"' for simple HTTP authentication") pflag.Bool("mesosCheckpoint", viper.GetBool("mesosCheckpoint"), "Enable/disable agent checkpointing for framework tasks (recover from agent failure)") pflag.Bool("mesosCompression", viper.GetBool("mesosCompression"), "When true attempt to use compression for HTTP streams.") pflag.String("mesosExecutorImage", viper.GetString("mesosExecutorImage"), "Name of the docker image to run the executor") @@ -210,7 +208,6 @@ func bindEnvironmentVariables() { viper.AutomaticEnv() } -const AuthModeBasic = "basic" // NewConfig is the constructor for a new config. func NewConfig() (err error) { @@ -238,8 +235,3 @@ func NewConfig() (err error) { return } - -type credentials struct { - username string - password string -} diff --git a/core/core.go b/core/core.go index 21878bb6a..2711305af 100644 --- a/core/core.go +++ b/core/core.go @@ -26,19 +26,13 @@ package core import ( "context" - "github.com/AliceO2Group/Control/common/product" - "github.com/AliceO2Group/Control/core/the" - "github.com/spf13/viper" - "time" - "fmt" + "net" + "github.com/AliceO2Group/Control/common/logger" - "github.com/looplab/fsm" - "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/callrules" - "github.com/mesos/mesos-go/api/v1/lib/extras/store" - "github.com/mesos/mesos-go/api/v1/lib/scheduler" + "github.com/AliceO2Group/Control/common/product" "github.com/sirupsen/logrus" - "net" + "github.com/spf13/viper" ) var log = logger.New(logrus.StandardLogger(),"core") @@ -59,13 +53,13 @@ func Run() error { log.Infof("%s (%s v%s build %s) starting up", product.PRETTY_FULLNAME, product.PRETTY_SHORTNAME, product.VERSION, product.BUILD) // We create a context and use its cancel func as a shutdown func to release - // all resources. The shutdown func is stored in the app.internalState. + // all resources. The shutdown func is stored in the scheduler.internalState. ctx, cancel := context.WithCancel(context.Background()) // This only runs once to create a container for all data which comprises the // scheduler's state. // It also keeps count of the tasks launched/finished - state, err := newInternalState(cancel) + state, err := newGlobalState(cancel) if err != nil { return err } @@ -73,99 +67,11 @@ func Run() error { // Set up channel to receive Unix Signals. signals(state) - // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should - // probably tolerate X number of subsequent subscribe failures before bailing. we'll need - // to track the lastCallAttempted along with subsequentSubscribeTimeouts. - - // store.Singleton is a thread-safe abstraction to load and store and string, - // provided by mesos-go. - // We also make sure that a log message is printed with the FrameworkID. - fidStore := store.DecorateSingleton( - store.NewInMemorySingleton(), - store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { - // Store Mesos Framework ID to configuration. - err = the.ConfSvc().NewMesosFID(v) - if err != nil { - log.WithField("error", err).Error("cannot write to configuration") - } - log.WithField("frameworkId acquired", v).Trace("frameworkId") - return nil - })) - - // Set Framework ID from the configuration - if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { - store.SetOrPanic(fidStore)(fidValue) - } - - // callrules.New returns a Rules and accept a bunch of Rule values as arguments. - // WithFrameworkID returns a Rule which injects a frameworkID to outgoing calls. - // logCalls returns a rule which prints to the log all calls of type SUBSCRIBE. - // callMetrics logs metrics for every outgoing call. - state.cli = callrules.New( - callrules.WithFrameworkID(store.GetIgnoreErrors(fidStore)), - logCalls(map[scheduler.Call_Type]string{scheduler.Call_SUBSCRIBE: "subscribe connecting"}), - callMetrics(state.metricsAPI, time.Now, viper.GetBool("summaryMetrics")), - ).Caller(state.cli) - - state.sm = fsm.NewFSM( - "INITIAL", - fsm.Events{ - {Name: "CONNECT", Src: []string{"INITIAL"}, Dst: "CONNECTED"}, - {Name: "NEW_ENVIRONMENT", Src: []string{"CONNECTED"}, Dst: "CONNECTED"}, - {Name: "GO_ERROR", Src: []string{"CONNECTED"}, Dst: "ERROR"}, - {Name: "RESET", Src: []string{"ERROR"}, Dst: "INITIAL"}, - {Name: "EXIT", Src: []string{"CONNECTED"}, Dst: "FINAL"}, - }, - fsm.Callbacks{ - "before_event": func(e *fsm.Event) { - log.WithFields(logrus.Fields{ - "event": e.Event, - "src": e.Src, - "dst": e.Dst, - }).Trace("state.sm starting transition") - }, - "enter_state": func(e *fsm.Event) { - log.WithFields(logrus.Fields{ - "event": e.Event, - "src": e.Src, - "dst": e.Dst, - }).Trace("state.sm entering state") - }, - "leave_CONNECTED": func(e *fsm.Event) { - log.Trace("leave_CONNECTED") - - }, - "before_NEW_ENVIRONMENT": func(e *fsm.Event) { - log.Trace("before_NEW_ENVIRONMENT") - e.Async() //transition frozen until the corresponding fsm.Transition call - }, - "enter_CONNECTED": func(e *fsm.Event) { - log.Trace("enter_CONNECTED") - log.Info("scheduler connected") - }, - "after_NEW_ENVIRONMENT": func(e *fsm.Event) { - log.Trace("after_NEW_ENVIRONMENT") - }, - }, - ) // We now build the Control server - s := NewServer(state, fidStore) + s := NewServer(state) - // Async start of the scheduler controller. This runs in parallel with the grpc server. - go func() { - err = runSchedulerController(ctx, state, fidStore) - state.RLock() - defer state.RUnlock() - if state.err != nil { - err = state.err - log.WithField("error", err.Error()).Debug("scheduler quit with error, main state machine GO_ERROR") - state.sm.Event("GO_ERROR", err) //TODO: use error information in GO_ERROR - } else { - log.Debug("scheduler quit, no errors") - state.sm.Event("EXIT") - } - }() + state.taskman.Start(ctx) lis, err := net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("controlPort"))) if err != nil { diff --git a/core/environment/manager.go b/core/environment/manager.go index 0e79656cf..fb606280b 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -27,13 +27,18 @@ package environment import ( "errors" "fmt" + "strconv" "strings" "sync" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" - "github.com/AliceO2Group/Control/common/event" + pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" ) @@ -41,13 +46,30 @@ type Manager struct { mu sync.RWMutex m map[uid.ID]*Environment taskman *task.ManagerV2 + incomingEventCh <-chan event.Event } -func NewEnvManager(tm *task.ManagerV2) *Manager { - return &Manager{ - m: make(map[uid.ID]*Environment), - taskman: tm, +func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Manager { + envman := &Manager{ + m: make(map[uid.ID]*Environment), + taskman: tm, + incomingEventCh: incomingEventCh, } + + go func() { + for ;; { + select { + case incomingEvent := <- envman.incomingEventCh: + switch typedEvent := incomingEvent.(type) { + case event.DeviceEvent: + envman.handleDeviceEvent(typedEvent) + default: + // noop + } + } + } + }() + return envman } func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uid.ID, error) { @@ -94,7 +116,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { envState := env.CurrentState() envTasks := env.Workflow().GetTasks() - taskmanMessage := task.NewenvironmentMessage(event.ReleaseTasks,env.id.Array(), envTasks, nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id.Array(), envTasks, nil) envs.taskman.MessageChannel <- taskmanMessage // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) // if rlsErr != nil { @@ -144,7 +166,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - taskmanMessage := task.NewenvironmentMessage(event.ReleaseTasks,environmentId.Array(), env.Workflow().GetTasks(), nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId.Array(), env.Workflow().GetTasks(), nil) envs.taskman.MessageChannel <- taskmanMessage // err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks()) // if err != nil { @@ -196,3 +218,85 @@ func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable } return workflow.Load(workflowPath, parent, envs.taskman, workflowUserVars) } + +func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { + if evt == nil { + log.Error("cannot handle null DeviceEvent") + return + } + + switch evt.GetType() { + case pb.DeviceEventType_BASIC_TASK_TERMINATED: + if btt, ok := evt.(*event.BasicTaskTerminated); ok { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "exitCode": btt.ExitCode, + "stdout": btt.Stdout, + "stderr": btt.Stderr, + "finalMesosState": btt.FinalMesosState.String(), + }). + Info("basic task terminated") + + // Propagate this information to the task/role + taskId := evt.GetOrigin().TaskId + t := envs.taskman.GetTask(taskId.Value) + isHook := false + if t != nil { + if parentRole, ok := t.GetParentRole().(workflow.Role); ok { + parentRole.SetRuntimeVars(map[string]string{ + "taskResult.exitCode": strconv.Itoa(btt.ExitCode), + "taskResult.stdout": btt.Stdout, + "taskResult.stderr": btt.Stderr, + "taskResult.finalStatus": btt.FinalMesosState.String(), + "taskResult.timestamp": utils.NewUnixTimestamp(), + }) + + // If it's an update following a HOOK execution + if t.GetControlMode() == controlmode.HOOK { + isHook = true + env, err := envs.environment(t.GetEnvironmentId().UUID()) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + } + env.NotifyEvent(evt) + } + } else { + log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") + } + } else { + log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + } + + // If the task hasn't already been killed + // AND it's not a hook + if !isHook { + goto doFallthrough + } + } + return + doFallthrough: + fallthrough + case pb.DeviceEventType_END_OF_STREAM: + taskId := evt.GetOrigin().TaskId + t := envs.taskman.GetTask(taskId.Value) + if t == nil { + log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent END_OF_STREAM") + return + } + env, err := envs.environment(t.GetEnvironmentId().UUID()) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + } + if env.CurrentState() == "RUNNING" { + t.SetSafeToStop(true) // we mark this specific task as ok to STOP + go func() { + if env.IsSafeToStop() { // but then we ask the env whether *all* of them are + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + } + } + }() + } + } +} diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 81504be80..3a8f2f03a 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -29,7 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/task/taskop" "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -143,7 +143,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { taskDescriptors := wf.GenerateTaskDescriptors() if len(taskDescriptors) != 0 { // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) - taskmanMessage := task.NewenvironmentMessage(event.AcquireTasks, env.Id().Array(), nil, taskDescriptors) + taskmanMessage := task.NewEnvironmentMessage(taskop.AcquireTasks, env.Id().Array(), nil, taskDescriptors) t.taskman.MessageChannel <- taskmanMessage } if err != nil { @@ -181,7 +181,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { if len(tasks) != 0 { // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) - taskmanMessage := task.NewenvironmentMessage(event.ConfigureTasks, env.Id().Array(), tasks, nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id().Array(), tasks, nil) t.taskman.MessageChannel <- taskmanMessage // if err != nil { // return @@ -217,7 +217,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { prvState := env.CurrentState() env.setState(wfState.String()) if prvState == "RUNNING" { - taskmanMessage := task.NewtransitionTaskMessage( + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.RUNNING.String(), task.STOP.String(), diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index d9b7af4c2..353321a79 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -47,7 +47,7 @@ func (t ResetTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } - taskmanMessage := task.NewtransitionTaskMessage( + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.CONFIGURED.String(), task.RESET.String(), diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 79fcad4d3..c8d17018d 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -65,7 +65,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), } - taskmanMessage := task.NewtransitionTaskMessage( + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.CONFIGURED.String(), task.START.String(), diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 914abb7d6..04233fb2f 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -52,7 +52,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { env.currentRunNumber = 0 - taskmanMessage := task.NewtransitionTaskMessage( + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.RUNNING.String(), task.STOP.String(), diff --git a/core/env.go b/core/envutil.go similarity index 100% rename from core/env.go rename to core/envutil.go diff --git a/core/globalstate.go b/core/globalstate.go new file mode 100644 index 000000000..68111a153 --- /dev/null +++ b/core/globalstate.go @@ -0,0 +1,89 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2017-2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * Portions from examples in : + * Copyright 2013-2015, Mesosphere, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + *ù + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package core + +import ( + "encoding/json" + "sync" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" + "github.com/spf13/viper" +) + +func newGlobalState(shutdown func()) (*globalState, error) { + if viper.GetBool("veryVerbose") { + cfgDump, err := the.ConfSvc().GetROSource().GetRecursive(the.ConfSvc().GetConsulPath()) + if err != nil { + log.WithError(err).Fatal("cannot retrieve configuration") + return nil, err + } + cfgBytes, err := json.MarshalIndent(cfgDump,"", "\t") + if err != nil { + log.WithError(err).Fatal("cannot marshal configuration dump") + return nil, err + } + log.WithField("data", string(cfgBytes)).Trace("configuration dump") + } + + publicEventCh := make(chan *pb.Event) + + state := &globalState{ + PublicEvent: publicEventCh, + shutdown: shutdown, + environments: nil, + } + + internalEventCh := make(chan event.Event) + taskman, err := task.NewManagerV2(shutdown, publicEventCh, internalEventCh) + if err != nil { + return nil, err + } + + state.taskman = taskman + //state.taskman.Start() + state.environments = environment.NewEnvManager(state.taskman, internalEventCh) + + return state, nil +} + +type globalState struct { + sync.RWMutex + + shutdown func() + + // uses locks, so thread safe + environments *environment.Manager + taskman *task.ManagerV2 + + PublicEvent chan *pb.Event + +} diff --git a/core/server.go b/core/server.go index ca3e5e821..0fe64c5da 100644 --- a/core/server.go +++ b/core/server.go @@ -52,11 +52,10 @@ import ( ) -func NewServer(state *internalState, fidStore store.Singleton) *grpc.Server { +func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ state: state, - fidStore: fidStore, }) // Register reflection service on gRPC server. reflection.Register(s) @@ -82,8 +81,7 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { - state *internalState - fidStore store.Singleton + state *globalState } func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { @@ -102,10 +100,10 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) r := &pb.GetFrameworkInfoReply{ - FrameworkId: store.GetIgnoreErrors(m.fidStore)(), + FrameworkId: m.state.taskman.GetFrameworkID(), EnvironmentsCount: int32(len(m.state.environments.Ids())), TasksCount: int32(m.state.taskman.TaskCount()), - State: m.state.sm.Current(), + State: m.state.taskman.GetState(), HostsCount: int32(m.state.taskman.AgentCache.Count()), InstanceName: viper.GetString("instanceName"), Version: &pb.Version{ @@ -131,7 +129,7 @@ func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) m.logMethod() r := &pb.GetEnvironmentsReply{ - FrameworkId: store.GetIgnoreErrors(m.fidStore)(), + FrameworkId: m.state.taskman.GetFrameworkID(), Environments: make(EnvironmentInfos, 0, 0), } for _, id := range m.state.environments.Ids() { @@ -175,17 +173,18 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme // make sure they are now successfully in CONFIGURED // 5) Report back here with the new environment id and error code, if needed. - if m.state.sm.Cannot("NEW_ENVIRONMENT") { - msg := fmt.Sprintf("NEW_ENVIRONMENT transition impossible, current state: %s", - m.state.sm.Current()) - return nil, status.Error(codes.Internal, msg) - } - err := m.state.sm.Event("NEW_ENVIRONMENT") //Async until Transition call - defer m.state.sm.Transition() - - if _, ok := err.(fsm.NoTransitionError); !ok && err != nil { - return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() - } + // FIXME: figure out if the state.sm becomes a task.Manager sm, or no global sm at all + //if m.state.sm.Cannot("NEW_ENVIRONMENT") { + // msg := fmt.Sprintf("NEW_ENVIRONMENT transition impossible, current state: %s", + // m.state.sm.Current()) + // return nil, status.Error(codes.Internal, msg) + //} + //err := m.state.sm.Event("NEW_ENVIRONMENT") //Async until Transition call + //defer m.state.sm.Transition() + // + //if _, ok := err.(fsm.NoTransitionError); !ok && err != nil { + // return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() + //} // Create new Environment instance with some roles, we get back a UUID id, err := m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) @@ -211,10 +210,9 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Environment: ei, } select { - case m.state.Event <- pb.NewEnvironmentCreatedEvent(ei): + case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): default: - log.WithField("partition", newEnv.Id().String()). - Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } return r, nil } @@ -383,10 +381,9 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } select { - case m.state.Event <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): + case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): default: - log.WithField("partition", env.Id().String()). - Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } @@ -666,7 +663,7 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe ctx := srv.Context() for { select { - case event := <- m.state.Event: + case event := <- m.state.PublicEvent: m.state.RLock() err := srv.Send(event) if err != nil { diff --git a/core/signals.go b/core/signals.go index e509c7a16..3775135e8 100644 --- a/core/signals.go +++ b/core/signals.go @@ -25,7 +25,6 @@ package core import ( - "context" "fmt" "os" "os/signal" @@ -33,11 +32,10 @@ import ( "time" "github.com/AliceO2Group/Control/core/environment" - "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" ) -func signals(state *internalState) { +func signals(state *globalState) { // Create channel to receive unix signals signal_chan := make(chan os.Signal, 1) @@ -63,7 +61,7 @@ func signals(state *internalState) { }() } -func manageKillSignals(state *internalState) { +func manageKillSignals(state *globalState) { // Get all enviroment ids uids := state.environments.Ids() @@ -113,11 +111,5 @@ func manageKillSignals(state *internalState) { // Request Mesos to kill all tasks, regardless enviroment status and if a task is locked or not. tasks := state.taskman.GetTasks() - for _, t := range tasks { - killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) - err = calls.CallNoData(context.TODO(), state.cli, killCall) - if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) - } - } + state.taskman.EmergencyKillTasks(tasks) } diff --git a/core/state.go b/core/state.go deleted file mode 100644 index b0a1996d2..000000000 --- a/core/state.go +++ /dev/null @@ -1,162 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2017-2018 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * Portions from examples in : - * Copyright 2013-2015, Mesosphere, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - *ù - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package core - -import ( - "context" - "encoding/json" - "math/rand" - "sync" - "time" - - "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/core/environment" - "github.com/AliceO2Group/Control/core/protos" - "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" - "github.com/looplab/fsm" - "github.com/mesos/mesos-go/api/v1/lib" - "github.com/mesos/mesos-go/api/v1/lib/backoff" - "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" - "github.com/spf13/viper" -) - -func newInternalState(shutdown func()) (*internalState, error) { - metricsAPI := initMetrics() - executorInfo, err := prepareExecutorInfo( - viper.GetString("executor"), - viper.GetString("mesosExecutorImage"), - buildWantsExecutorResources(viper.GetFloat64("executorCPU"), - viper.GetFloat64("executorMemory")), - viper.GetDuration("mesosJobRestartDelay"), - metricsAPI, - ) - if err != nil { - return nil, err - } - creds, err := loadCredentials(viper.GetString("mesosCredentials.username"), - viper.GetString("mesosCredentials.password")) - if err != nil { - return nil, err - } - - if viper.GetBool("veryVerbose") { - cfgDump, err := the.ConfSvc().GetROSource().GetRecursive(the.ConfSvc().GetConsulPath()) - if err != nil { - log.WithError(err).Fatal("cannot retrieve configuration") - return nil, err - } - cfgBytes, err := json.MarshalIndent(cfgDump,"", "\t") - if err != nil { - log.WithError(err).Fatal("cannot marshal configuration dump") - return nil, err - } - log.WithField("data", string(cfgBytes)).Trace("configuration dump") - } - - resourceOffersDone := make(chan task.DeploymentMap) - tasksToDeploy := make(chan task.Descriptors) - reviveOffersTrg := make(chan struct{}) - Event := make(chan *pb.Event) - - state := &internalState{ - reviveTokens: backoff.BurstNotifier( - viper.GetInt("mesosReviveBurst"), - viper.GetDuration("mesosReviveWait"), - viper.GetDuration("mesosReviveWait"), - nil), - resourceOffersDone: resourceOffersDone, - tasksToDeploy: tasksToDeploy, - reviveOffersTrg: reviveOffersTrg, - Event: Event, - wantsTaskResources: mesos.Resources{}, - executor: executorInfo, - metricsAPI: metricsAPI, - cli: buildHTTPSched(creds), - random: rand.New(rand.NewSource(time.Now().Unix())), - shutdown: shutdown, - environments: nil, - } - - state.servent = controlcommands.NewServent( - func(command controlcommands.MesosCommand, receiver controlcommands.MesosCommandTarget) error { - return SendCommand(context.TODO(), state, command, receiver) - }, - ) - state.commandqueue = controlcommands.NewCommandQueue(state.servent) - - taskman := task.NewManagerV2( - resourceOffersDone, - tasksToDeploy, - reviveOffersTrg, - state.commandqueue, - func(task *task.Task) error { - return KillTask(context.TODO(), state, task.GetMesosCommandTarget()) - }, - buildHTTPSched(creds), - ) - state.taskman = taskman - state.taskman.Start() - state.environments = environment.NewEnvManager(state.taskman) - state.commandqueue.Start() // FIXME: there should be 1 cq per env - - return state, nil -} - -type internalState struct { - sync.RWMutex - - // needs locking: - wantsTaskResources mesos.Resources - err error - - // not used in multiple goroutines: - executor *mesos.ExecutorInfo - reviveTokens <-chan struct{} - resourceOffersDone chan task.DeploymentMap - tasksToDeploy chan task.Descriptors - reviveOffersTrg chan struct{} - random *rand.Rand - - // shouldn't change at runtime, so thread safe: - role string - cli calls.Caller - shutdown func() - - // uses prometheus counters, so thread safe - metricsAPI *metricsAPI - - // uses locks, so thread safe - sm *fsm.FSM - environments *environment.Manager - taskman *task.ManagerV2 - commandqueue *controlcommands.CommandQueue - servent *controlcommands.Servent - - Event chan *pb.Event -} diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 16ea66bc1..42b84d508 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -25,14 +25,14 @@ package task import ( - "github.com/pborman/uuid" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/task/taskop" "github.com/mesos/mesos-go/api/v1/lib" + "github.com/pborman/uuid" ) type TaskmanMessage struct { - MessageType event.MessageType `json:"_messageType"` + MessageType taskop.MessageType `json:"_messageType"` environmentMessage transitionTasksMessage @@ -40,14 +40,14 @@ type TaskmanMessage struct { // killTasksMessage } -func NewTaskmanMessage(mt event.MessageType) (t *TaskmanMessage) { +func NewTaskmanMessage(mt taskop.MessageType) (t *TaskmanMessage) { t = &TaskmanMessage{ MessageType: mt, } return t } -func (tm *TaskmanMessage) GetMessageType() event.MessageType { +func (tm *TaskmanMessage) GetMessageType() taskop.MessageType { return tm.MessageType } @@ -78,7 +78,7 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } -func NewenvironmentMessage(mt event.MessageType, envId uuid.Array, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { +func NewEnvironmentMessage(mt taskop.MessageType, envId uuid.Array, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { t = NewTaskmanMessage(mt) t.environmentMessage = environmentMessage{ envId: envId, @@ -116,15 +116,15 @@ func (trm *transitionTasksMessage) GetDestination() string { return trm.dest } -func (trm *transitionTasksMessage) GetArguements() controlcommands.PropertyMap { +func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { if trm == nil { return nil } return trm.commonArgs } -func NewtransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap) (t *TaskmanMessage) { - t = NewTaskmanMessage(event.TransitionTasks) +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap) (t *TaskmanMessage) { + t = NewTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, event: transitionEvent, @@ -144,7 +144,7 @@ type updateTaskMessage struct { } func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { - t = NewTaskmanMessage(event.TaskStatusMessage) + t = NewTaskmanMessage(taskop.TaskStatusMessage) t.updateTaskMessage = updateTaskMessage{ status: mesosStatus, } @@ -152,7 +152,7 @@ func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { } func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { - t = NewTaskmanMessage(event.TaskStateMessage) + t = NewTaskmanMessage(taskop.TaskStateMessage) t.updateTaskMessage = updateTaskMessage{ taskId: taskid, state: state, diff --git a/core/task/managerV2.go b/core/task/managerV2.go index d2a6f240c..e06a961c6 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -32,11 +32,16 @@ import ( "context" "errors" "fmt" - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/common/event" "strings" "sync" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/gera" + pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/the" + "github.com/mesos/mesos-go/api/v1/lib/extras/store" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" @@ -52,6 +57,8 @@ const TaskMan_QUEUE = 1024 type ManagerV2 struct { + ctx context.Context + fidStore store.Singleton AgentCache AgentCache MessageChannel chan *TaskmanMessage @@ -64,31 +71,71 @@ type ManagerV2 struct { reviveOffersTrg chan struct{} cq *controlcommands.CommandQueue - doKillTask KillTaskFunc tasksLaunched int tasksFinished int - cli calls.Caller + + schedulerState *schedulerState + publicEventCh chan<- *pb.Event + internalEventCh chan<- event.Event } -func NewManagerV2(resourceOffersDone <-chan DeploymentMap, - tasksToDeploy chan<- Descriptors, - reviveOffersTrg chan struct{}, - cq *controlcommands.CommandQueue, - killTaskFunc KillTaskFunc, - cli calls.Caller) (taskman *ManagerV2) { +func NewManagerV2(shutdown func(), + publicEventCh chan<- *pb.Event, + internalEventCh chan<- event.Event) (taskman *ManagerV2, err error) { + // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should + // probably tolerate X number of subsequent subscribe failures before bailing. we'll need + // to track the lastCallAttempted along with subsequentSubscribeTimeouts. + + // store.Singleton is a thread-safe abstraction to load and store and string, + // provided by mesos-go. + // We also make sure that a log message is printed with the FrameworkID. + fidStore := store.DecorateSingleton( + store.NewInMemorySingleton(), + store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { + // Store Mesos Framework ID to configuration. + err = the.ConfSvc().NewMesosFID(v) + if err != nil { + log.WithField("error", err).Error("cannot write to configuration") + } + log.WithField("frameworkId", v).Debug("frameworkId") + return nil + })) + + // Set Framework ID from the configuration + if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { + store.SetOrPanic(fidStore)(fidValue) + } + taskman = &ManagerV2{ classes: make(map[string]*Class), roster: make(Tasks, 0), - resourceOffersDone: resourceOffersDone, - tasksToDeploy: tasksToDeploy, - reviveOffersTrg: reviveOffersTrg, - cq: cq, - doKillTask: killTaskFunc, - cli: cli, + publicEventCh: publicEventCh, + internalEventCh: internalEventCh, } + schedulerState, err := NewScheduler(taskman, fidStore, shutdown) + if err != nil { + return nil, err + } + taskman.schedulerState = schedulerState + taskman.cq = taskman.schedulerState.commandqueue // FIXME remove + taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone + taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy + taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg + + schedulerState.setupCli() + return } +func (m *ManagerV2) GetState() string { + return m.schedulerState.sm.Current() +} + +func (m *ManagerV2) GetFrameworkID() string { + return m.schedulerState.GetFrameworkID() +} + + // NewTaskForMesosOffer accepts a Mesos offer and a Descriptor and returns a newly // constructed Task. // This function should only be called by the Mesos scheduler controller when @@ -615,6 +662,11 @@ func (m *ManagerV2) KillTasks(taskIds []string) (killed Tasks, running Tasks, er return } +func (m *ManagerV2) doKillTask(task *Task) error { + return m.schedulerState.killTask(context.TODO(), task.GetMesosCommandTarget()) +} + + func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err error) { // We assume all tasks are unlocked @@ -650,11 +702,13 @@ func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err e return } -func (m *ManagerV2) Start() { +func (m *ManagerV2) Start(ctx context.Context) { m.mu.Lock() m.MessageChannel = make(chan *TaskmanMessage, TaskMan_QUEUE) m.mu.Unlock() + m.schedulerState.Start(ctx) + go func() { for { select { @@ -685,13 +739,13 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { messageType := tm.GetMessageType() switch messageType{ - case event.AcquireTasks: + case taskop.AcquireTasks: m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) - case event.ConfigureTasks: + case taskop.ConfigureTasks: m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) - case event.TransitionTasks: - m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguements()) - case event.TaskStatusMessage: + case taskop.TransitionTasks: + m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + case taskop.TaskStatusMessage: mesosStatus := tm.status mesosState := mesosStatus.GetState() switch mesosState { @@ -724,19 +778,30 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { mesosState == mesos.TASK_KILLING || mesosState == mesos.TASK_UNKNOWN) { killCall := calls.Kill(mesosStatus.TaskID.GetValue(), mesosStatus.AgentID.GetValue()) - calls.CallNoData(context.TODO(), m.cli, killCall) + calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) } else { // Enqueue task state update go m.updateTaskStatus(&mesosStatus) } - case event.TaskStateMessage: + case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) // case event.KillTasks: // m.killTasks(tm.GetTaskIds()) - case event.ReleaseTasks: + case taskop.ReleaseTasks: m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) } return nil +} + +// This function should only be called from the SIGINT/SIGTERM handler +func (m *ManagerV2) EmergencyKillTasks(tasks Tasks) { + for _, t := range tasks { + killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) + err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) + } + } } \ No newline at end of file diff --git a/core/metrics.go b/core/task/metrics.go similarity index 94% rename from core/metrics.go rename to core/task/metrics.go index 3f040ccfc..079dd89df 100644 --- a/core/metrics.go +++ b/core/task/metrics.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package core +package task import ( "net" @@ -33,6 +33,7 @@ import ( "strconv" schedmetrics "github.com/AliceO2Group/Control/core/metrics" + "github.com/AliceO2Group/Control/core/task/schedutil" xmetrics "github.com/mesos/mesos-go/api/v1/lib/extras/metrics" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" @@ -45,7 +46,7 @@ func initMetrics() *metricsAPI { metricsAddress := net.JoinHostPort(viper.GetString("metrics.address"), strconv.Itoa(viper.GetInt("metrics.port"))) http.Handle(viper.GetString("metrics.path"), promhttp.Handler()) api := newMetricsAPI() - go forever("api-server", viper.GetDuration("mesosJobRestartDelay"), api.jobStartCount, func() error { return http.ListenAndServe(metricsAddress, nil) }) + go schedutil.Forever("api-server", viper.GetDuration("mesosJobRestartDelay"), api.jobStartCount, func() error { return http.ListenAndServe(metricsAddress, nil) }) return api } diff --git a/core/scheduler.go b/core/task/scheduler.go similarity index 84% rename from core/scheduler.go rename to core/task/scheduler.go index 368e0ffed..53b5cfa67 100644 --- a/core/scheduler.go +++ b/core/task/scheduler.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package core +package task import ( "context" @@ -38,17 +38,13 @@ import ( "time" "github.com/AliceO2Group/Control/common/controlmode" - "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/core/environment" cpb "github.com/AliceO2Group/Control/core/protos" - "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/executor/protos" "github.com/gogo/protobuf/proto" @@ -71,6 +67,7 @@ var ( RegistrationMaxBackoff = 15 * time.Second ) + // StateError is returned when the system encounters an unresolvable state transition error and // should likely exit. type StateError string @@ -80,7 +77,7 @@ func (err StateError) Error() string { return string(err) } var schedEventsCh = make(chan scheduler.Event_Type) func runSchedulerController(ctx context.Context, - state *internalState, + state *schedulerState, fidStore store.Singleton) error { // Set up communication from controller to state machine. go func() { @@ -112,9 +109,9 @@ func runSchedulerController(ctx context.Context, // ID, as well as additional information such as Roles, WebUI URL, etc. return controller.Run( ctx, - buildFrameworkInfo(), + schedutil.BuildFrameworkInfo(), state.cli, /* controller.Option...: */ - controller.WithEventHandler(buildEventHandler(state, fidStore)), + controller.WithEventHandler(state.buildEventHandler(fidStore)), controller.WithFrameworkID(store.GetIgnoreErrors(fidStore)), controller.WithRegistrationTokens( // Limit the rate of reregistration. @@ -143,7 +140,7 @@ func runSchedulerController(ctx context.Context, // buildEventHandler generates and returns a handler to process events received // from the subscription. The handler is then passed as controller.Option to // controller.Run. -func buildEventHandler(state *internalState, fidStore store.Singleton) events.Handler { +func (state *schedulerState) buildEventHandler(fidStore store.Singleton) events.Handler { // disable brief logs when verbose logs are enabled (there's no sense logging twice!) logger := controller.LogEvents(nil).Unless(viper.GetBool("verbose")) @@ -151,25 +148,25 @@ func buildEventHandler(state *internalState, fidStore store.Singleton) events.Ha logAllEvents().If(viper.GetBool("verbose")), eventMetrics(state.metricsAPI, time.Now, viper.GetBool("summaryMetrics")), controller.LiftErrors().DropOnError(), - eventrules.HandleF(notifyStateMachine(state)), + eventrules.HandleF(state.notifyStateMachine()), ).Handle(events.Handlers{ // scheduler.Event_Type: events.Handler scheduler.Event_FAILURE: logger.HandleF(failure), // wrapper + print error - scheduler.Event_OFFERS: trackOffersReceived(state).HandleF(resourceOffers(state, fidStore)), - scheduler.Event_UPDATE: controller.AckStatusUpdates(state.cli).AndThen().HandleF(statusUpdate(state)), + scheduler.Event_OFFERS: state.trackOffersReceived().HandleF(state.resourceOffers(fidStore)), + scheduler.Event_UPDATE: controller.AckStatusUpdates(state.cli).AndThen().HandleF(state.statusUpdate()), scheduler.Event_SUBSCRIBED: eventrules.New( logger, controller.TrackSubscription(fidStore, viper.GetDuration("mesosFailoverTimeout")), - eventrules.New().HandleF(reconciliationCall(state)), + eventrules.New().HandleF(state.reconciliationCall()), ), - scheduler.Event_MESSAGE: eventrules.HandleF(incomingMessageHandler(state, fidStore)), + scheduler.Event_MESSAGE: eventrules.HandleF(state.incomingMessageHandler()), }.Otherwise(logger.HandleEvent)) } // Channel the event type of the newly received event to an asynchronous dispatcher // in runSchedulerController -func notifyStateMachine(state *internalState) events.HandlerFunc { +func (state *schedulerState) notifyStateMachine() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { schedEventsCh <- e.GetType() return nil @@ -178,16 +175,16 @@ func notifyStateMachine(state *internalState) events.HandlerFunc { // Implicit Reconciliation Call that sends an empty list of tasks and the master responds // with the latest state for all currently known non-terminal tasks. -func reconciliationCall(state *internalState) events.HandlerFunc { +func (state *schedulerState) reconciliationCall() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { reconcileCall := calls.Reconcile(calls.ReconcileTasks(nil)) - calls.CallNoData(ctx, state.cli, reconcileCall) + _ = calls.CallNoData(ctx, state.cli, reconcileCall) return nil } } // Update metrics when we receive an offer -func trackOffersReceived(state *internalState) eventrules.Rule { +func (state *schedulerState)trackOffersReceived() eventrules.Rule { return func(ctx context.Context, e *scheduler.Event, err error, chain eventrules.Chain) (context.Context, *scheduler.Event, error) { if err == nil { state.metricsAPI.offersReceived.Int(len(e.GetOffers().GetOffers())) @@ -223,10 +220,10 @@ func failure(_ context.Context, e *scheduler.Event) error { } // Handler for Event_MESSAGE -func incomingMessageHandler(state *internalState, fidStore store.Singleton) events.HandlerFunc { +func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // instantiate map of MCtargets, command IDs and timeouts here // what should happen - // SendCommand sends a command, pushes the targets list, command id and timeout (maybe + // sendCommand sends a command, pushes the targets list, command id and timeout (maybe // through a channel) to a structure accessible here. // then when we receive a response, if its id, target and timeout is satisfied by one and // only one entry in the list, we signal back to commandqueue @@ -283,7 +280,8 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even if err != nil { return } - handleDeviceEvent(state, ev) + state.taskman.internalEventCh <- ev + //state.handleDeviceEvent(ev) } else { log.WithFields(logrus.Fields{ "type": incomingEvent.Type.String(), @@ -350,24 +348,24 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even } go func() { - taskmanMessage := task.NewTaskStateMessage(res.TaskId, res.CurrentState) + taskmanMessage := NewTaskStateMessage(res.TaskId, res.CurrentState) state.taskman.MessageChannel <-taskmanMessage // servent should be inside taskman and eventually // all this handling. state.servent.ProcessResponse(&res, sender) select { - case state.Event <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): + case state.taskman.publicEventCh <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): default: - log.Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } }() return default: return errors.New(fmt.Sprintf("unrecognized response for controlcommand %s", incomingCommand.CommandName)) } - case "TaskMessage": - var taskMessage event.TaskMessageBase + case "AnnounceTaskPIDEvent": + var taskMessage event.AnnounceTaskPIDEvent err = json.Unmarshal(data, &taskMessage) if err != nil { return @@ -382,100 +380,8 @@ func incomingMessageHandler(state *internalState, fidStore store.Singleton) even } } -func handleDeviceEvent(state *internalState, evt event.DeviceEvent) { - if evt == nil { - log.WithPrefix("scheduler").Warn("cannot handle null DeviceEvent") - return - } - - switch evt.GetType() { - case pb.DeviceEventType_BASIC_TASK_TERMINATED: - if btt, ok := evt.(*event.BasicTaskTerminated); ok { - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "exitCode": btt.ExitCode, - "stdout": btt.Stdout, - "stderr": btt.Stderr, - "finalMesosState": btt.FinalMesosState.String(), - }). - Info("basic task terminated") - - // Propagate this information to the task/role - taskId := evt.GetOrigin().TaskId - t := state.taskman.GetTask(taskId.Value) - isHook := false - if t != nil { - if parentRole, ok := t.GetParentRole().(workflow.Role); ok { - parentRole.SetRuntimeVars(map[string]string{ - "taskResult.exitCode": strconv.Itoa(btt.ExitCode), - "taskResult.stdout": btt.Stdout, - "taskResult.stderr": btt.Stderr, - "taskResult.finalStatus": btt.FinalMesosState.String(), - "taskResult.timestamp": utils.NewUnixTimestamp(), - }) - - // If it's an update following a HOOK execution - if t.GetControlMode() == controlmode.HOOK { - isHook = true - env, err := state.environments.Environment(t.GetEnvironmentId()) - if err != nil { - log.WithPrefix("scheduler"). - WithError(err). - Error("cannot find environment for DeviceEvent") - } - env.NotifyEvent(evt) - } - } else { - log.WithPrefix("scheduler"). - Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") - } - } else { - log.WithPrefix("scheduler"). - Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") - } - - // If the task hasn't already been killed - // AND it's not a hook - if !isHook { - goto doFallthrough - } - } - return - doFallthrough: - fallthrough - case pb.DeviceEventType_END_OF_STREAM: - taskId := evt.GetOrigin().TaskId - t := state.taskman.GetTask(taskId.Value) - if t == nil { - log.WithPrefix("scheduler"). - Error("cannot find task for DeviceEvent END_OF_STREAM") - return - } - env, err := state.environments.Environment(t.GetEnvironmentId()) - if err != nil { - log.WithPrefix("scheduler"). - WithError(err). - Error("cannot find environment for DeviceEvent") - } - if env.CurrentState() == "RUNNING" { - t.SetSafeToStop(true) // we mark this specific task as ok to STOP - go func() { - if env.IsSafeToStop() { // but then we ask the env whether *all* of them are - err = env.TryTransition(environment.NewStopActivityTransition(state.taskman)) - if err != nil { - log.WithPrefix("scheduler"). - WithError(err). - WithField("partition", env.Id().String()). - Error("cannot stop run after END_OF_STREAM event") - } - } - }() - } - } -} - // Handler for Event_OFFERS -func resourceOffers(state *internalState, fidStore store.Singleton) events.HandlerFunc { +func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { var ( offers = e.GetOffers().GetOffers() @@ -500,7 +406,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl }).Trace("received offers") } - var descriptorsStillToDeploy task.Descriptors + var descriptorsToDeploy Descriptors select { case descriptorsStillToDeploy = <- state.tasksToDeploy: if viper.GetBool("veryVerbose") { @@ -530,7 +436,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl offerIDsToDecline[offers[i].ID] = struct{}{} } - tasksDeployed := make(task.DeploymentMap) + tasksDeployed := make(DeploymentMap) if len(descriptorsStillToDeploy) > 0 { // 3 ways to make decisions @@ -555,10 +461,10 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // for a likely significant multinode launch performance increase for _, offer := range offers { var ( - remainingResourcesInOffer = mesos.Resources(offer.Resources) - taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(task.DeploymentMap) - targetExecutorId = mesos.ExecutorID{} + remainingResources = mesos.Resources(offer.Resources) + tasks = make([]mesos.TaskInfo, 0) + tasksDeployedForCurrentOffer = make(DeploymentMap) + targetExecutorId = mesos.ExecutorID{} ) // If there are no executors provided by the offer, @@ -620,7 +526,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl Warning("no resource demands for descriptor, invalid class perhaps?") continue } - if !task.Resources(remainingResourcesInOffer).Satisfy(wants) { + if !Resources(remainingResources).Satisfy(wants) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ @@ -656,7 +562,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl } } - agentForCache := task.AgentCacheInfo{ + agentForCache := AgentCacheInfo{ AgentId: offer.AgentID, Attributes: offer.Attributes, Hostname: offer.Hostname, @@ -786,9 +692,9 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl Debug("creating Mesos task") resourcesRequest.Add(executorResources...) select { - case state.Event <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()): + case state.taskman.publicEventCh <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()): default: - log.Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } newTaskId := taskPtr.GetTaskId() @@ -826,9 +732,9 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl "task": mesosTaskInfo, }).Debug("launching task") select { - case state.Event <- cpb.NewEventTaskLaunch(newTaskId): + case state.taskman.publicEventCh <- cpb.NewEventTaskLaunch(newTaskId): default: - log.Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) @@ -930,7 +836,7 @@ func resourceOffers(state *internalState, fidStore store.Singleton) events.Handl // statusUpdate handles an incoming UPDATE event. // This func runs after acknowledgement. -func statusUpdate(state *internalState) events.HandlerFunc { +func (state *schedulerState) statusUpdate() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { s := e.GetUpdate().GetStatus() if viper.GetBool("verbose") { @@ -955,12 +861,12 @@ func statusUpdate(state *internalState) events.HandlerFunc { log.Println("Mission accomplished, all tasks completed. Terminating scheduler.") state.shutdown() } else { - tryReviveOffers(ctx, state) + state.tryReviveOffers(ctx) }*/ // log.WithPrefix("scheduler").Debug("state unlock") } - taskmanMessage := task.NewTaskStatusMessage(s) + taskmanMessage := NewTaskStatusMessage(s) state.taskman.MessageChannel <- taskmanMessage @@ -972,7 +878,7 @@ func statusUpdate(state *internalState) events.HandlerFunc { // have set through ACCEPT or DECLINE calls, in the hope that Mesos then sends us new resource offers. // This should generally run when we have received a TASK_FINISHED for some tasks, and we have more // tasks to run. -func tryReviveOffers(ctx context.Context, state *internalState) { +func (state *schedulerState) tryReviveOffers(ctx context.Context) { // limit the rate at which we request offer revival select { case <-state.reviveTokens: @@ -983,7 +889,7 @@ func tryReviveOffers(ctx context.Context, state *internalState) { } } -func doReviveOffers(ctx context.Context, state *internalState) { +func doReviveOffers(ctx context.Context, state *schedulerState) { err := calls.CallNoData(ctx, state.cli, calls.Revive()) if err != nil { log.WithPrefix("scheduler").WithField("error", err.Error()). @@ -993,21 +899,21 @@ func doReviveOffers(ctx context.Context, state *internalState) { log.WithPrefix("scheduler").Debug("revive offers done") } -func KillTask(ctx context.Context, state *internalState, receiver controlcommands.MesosCommandTarget) (err error) { +func (state *schedulerState) killTask(ctx context.Context, receiver controlcommands.MesosCommandTarget) (err error) { killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) select { - case state.Event <- cpb.NewKillTasksEvent(): + case state.taskman.publicEventCh <- cpb.NewKillTasksEvent(): default: - log.Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } return } -func SendCommand(ctx context.Context, state *internalState, command controlcommands.MesosCommand, receiver controlcommands.MesosCommandTarget) (err error) { - log.Debug("SendCommand BEGIN") - defer log.Debug("SendCommand END") +func (state *schedulerState) sendCommand(ctx context.Context, command controlcommands.MesosCommand, receiver controlcommands.MesosCommandTarget) (err error) { + log.Debug("sendCommand BEGIN") + defer log.Debug("sendCommand END") var bytes []byte bytes, err = json.Marshal(command) if err != nil { @@ -1027,9 +933,9 @@ func SendCommand(ctx context.Context, state *internalState, command controlcomma }). Debug("outgoing MESSAGE call") select { - case state.Event <- cpb.NewEnvironmentStateEvent(bytes): + case state.taskman.publicEventCh <- cpb.NewEnvironmentStateEvent(bytes): default: - log.Debug("state.Event channel is full") + log.Debug("state.PublicEvent channel is full") } return err } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go new file mode 100644 index 000000000..1d433332d --- /dev/null +++ b/core/task/schedulerstate.go @@ -0,0 +1,215 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2017-2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * Portions from examples in : + * Copyright 2013-2015, Mesosphere, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "context" + "math/rand" + "sync" + "time" + + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/task/schedutil" + "github.com/looplab/fsm" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/backoff" + "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/callrules" + "github.com/mesos/mesos-go/api/v1/lib/extras/store" + "github.com/mesos/mesos-go/api/v1/lib/scheduler" + "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + + +type schedulerState struct { + sync.RWMutex + + sm *fsm.FSM + + fidStore store.Singleton + + // needs locking: + wantsTaskResources mesos.Resources + err error + + // not used in multiple goroutines: + executor *mesos.ExecutorInfo + reviveTokens <-chan struct{} + resourceOffersDone chan DeploymentMap + tasksToDeploy chan Descriptors + reviveOffersTrg chan struct{} + random *rand.Rand + + // shouldn't change at runtime, so thread safe: + role string + cli calls.Caller + shutdown func() + + // uses prometheus counters, so thread safe + metricsAPI *metricsAPI + + // uses locks, so thread safe + servent *controlcommands.Servent + commandqueue *controlcommands.CommandQueue + taskman *ManagerV2 + +} + + +func NewScheduler(taskman *ManagerV2, fidStore store.Singleton, shutdown func()) (*schedulerState, error) { + metricsAPI := initMetrics() + executorInfo, err := schedutil.PrepareExecutorInfo( + viper.GetString("executor"), + viper.GetString("mesosExecutorImage"), + schedutil.BuildWantsExecutorResources(viper.GetFloat64("executorCPU"), + viper.GetFloat64("executorMemory")), + viper.GetDuration("mesosJobRestartDelay"), + ) + + if err != nil { + return nil, err + } + creds, err := schedutil.LoadCredentials(viper.GetString("mesosCredentials.username"), + viper.GetString("mesosCredentials.password")) + if err != nil { + return nil, err + } + + resourceOffersDone := make(chan DeploymentMap) + tasksToDeploy := make(chan Descriptors) + reviveOffersTrg := make(chan struct{}) + + state := &schedulerState{ + taskman: taskman, + fidStore: fidStore, + reviveTokens: backoff.BurstNotifier( + viper.GetInt("mesosReviveBurst"), + viper.GetDuration("mesosReviveWait"), + viper.GetDuration("mesosReviveWait"), + nil), + resourceOffersDone: resourceOffersDone, + tasksToDeploy: tasksToDeploy, + reviveOffersTrg: reviveOffersTrg, + wantsTaskResources: mesos.Resources{}, + executor: executorInfo, + metricsAPI: metricsAPI, + cli: schedutil.BuildHTTPSched(creds), + random: rand.New(rand.NewSource(time.Now().Unix())), + shutdown: shutdown, + } + + state.servent = controlcommands.NewServent( + func(command controlcommands.MesosCommand, receiver controlcommands.MesosCommandTarget) error { + return state.sendCommand(context.Background(), command, receiver) + }, + ) + state.commandqueue = controlcommands.NewCommandQueue(state.servent) + + state.commandqueue.Start() // FIXME: should there be 1 cq per env? + + state.sm = fsm.NewFSM( + "INITIAL", + fsm.Events{ + {Name: "CONNECT", Src: []string{"INITIAL"}, Dst: "CONNECTED"}, + {Name: "NEW_ENVIRONMENT", Src: []string{"CONNECTED"}, Dst: "CONNECTED"}, + {Name: "GO_ERROR", Src: []string{"CONNECTED"}, Dst: "ERROR"}, + {Name: "RESET", Src: []string{"ERROR"}, Dst: "INITIAL"}, + {Name: "EXIT", Src: []string{"CONNECTED"}, Dst: "FINAL"}, + }, + fsm.Callbacks{ + "before_event": func(e *fsm.Event) { + log.WithFields(logrus.Fields{ + "event": e.Event, + "src": e.Src, + "dst": e.Dst, + }).Debug("state.sm starting transition") + }, + "enter_state": func(e *fsm.Event) { + log.WithFields(logrus.Fields{ + "event": e.Event, + "src": e.Src, + "dst": e.Dst, + }).Debug("state.sm entering state") + }, + "leave_CONNECTED": func(e *fsm.Event) { + log.Debug("leave_CONNECTED") + + }, + "before_NEW_ENVIRONMENT": func(e *fsm.Event) { + log.Debug("before_NEW_ENVIRONMENT") + e.Async() //transition frozen until the corresponding fsm.Transition call + }, + "enter_CONNECTED": func(e *fsm.Event) { + log.Debug("enter_CONNECTED") + log.Info("scheduler connected") + }, + "after_NEW_ENVIRONMENT": func(e *fsm.Event) { + log.Debug("after_NEW_ENVIRONMENT") + }, + }, + ) + + return state, nil +} + +func (state *schedulerState) setupCli() calls.Caller { + // callrules.New returns a Rules and accept a bunch of Rule values as arguments. + // WithFrameworkID returns a Rule which injects a frameworkID to outgoing calls. + // logCalls returns a rule which prints to the log all calls of type SUBSCRIBE. + // callMetrics logs metrics for every outgoing call. + state.cli = callrules.New( + callrules.WithFrameworkID(store.GetIgnoreErrors(state.fidStore)), + logCalls(map[scheduler.Call_Type]string{scheduler.Call_SUBSCRIBE: "subscribe connecting"}), + callMetrics(state.metricsAPI, time.Now, viper.GetBool("summaryMetrics")), + ).Caller(state.cli) + + return state.cli +} + +func (state *schedulerState) GetFrameworkID() string { + return store.GetIgnoreErrors(state.fidStore)() +} + +func (state *schedulerState) Start(ctx context.Context) { + // Async start of the scheduler controller. This runs in parallel with the grpc server. + go func() { + err := runSchedulerController(ctx, state, state.fidStore) + state.RLock() + defer state.RUnlock() + if state.err != nil { + err = state.err + log.WithField("error", err.Error()).Debug("scheduler quit with error, main state machine GO_ERROR") + state.sm.Event("GO_ERROR", err) //TODO: use error information in GO_ERROR + } else { + log.Debug("scheduler quit, no errors") + state.sm.Event("EXIT") + } + }() +} + diff --git a/core/task/schedutil/credentials.go b/core/task/schedutil/credentials.go new file mode 100644 index 000000000..f2d034125 --- /dev/null +++ b/core/task/schedutil/credentials.go @@ -0,0 +1,58 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2017 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * Portions from examples in : + * Copyright 2013-2015, Mesosphere, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package schedutil + +import ( + "io/ioutil" + "os" +) + + +func LoadCredentials(username string, password string) (result credentials, err error) { + result = credentials{username, password} + if result.password != "" { + // this is the path to a file containing the password + _, err = os.Stat(result.password) + if err != nil { + return + } + var f *os.File + f, err = os.Open(result.password) + if err != nil { + return + } + defer f.Close() + var bytes []byte + bytes, err = ioutil.ReadAll(f) + if err != nil { + return + } + result.password = string(bytes) + } + return +} diff --git a/core/flags.go b/core/task/schedutil/flags.go similarity index 86% rename from core/flags.go rename to core/task/schedutil/flags.go index 12dcc092a..1c8aba217 100644 --- a/core/flags.go +++ b/core/task/schedutil/flags.go @@ -25,17 +25,14 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package core +package schedutil import ( "errors" - "fmt" "net/url" "strings" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/mesos/mesos-go/api/v1/lib/encoding" - "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" ) var ( @@ -53,19 +50,6 @@ func (u *URL) Set(value string) error { return nil } -type codec struct{ encoding.Codec } - -func (c *codec) Set(value string) error { - v := strings.ToLower(value) - for _, codec := range codecs.ByMediaType { - if v == codec.Name { - c.Codec = codec - return nil - } - } - return fmt.Errorf("bad codec %q", value) -} - type Labels []mesos.Label func (labels *Labels) Set(value string) error { diff --git a/core/forever.go b/core/task/schedutil/forever.go similarity index 94% rename from core/forever.go rename to core/task/schedutil/forever.go index d3a87129c..5fb0b8ddc 100644 --- a/core/forever.go +++ b/core/task/schedutil/forever.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package core +package schedutil import ( "time" @@ -34,7 +34,7 @@ import ( "github.com/sirupsen/logrus" ) -func forever(name string, jobRestartDelay time.Duration, counter xmetrics.Counter, f func() error) { +func Forever(name string, jobRestartDelay time.Duration, counter xmetrics.Counter, f func() error) { for { counter(name) err := f() diff --git a/core/util.go b/core/task/schedutil/mesosutil.go similarity index 86% rename from core/util.go rename to core/task/schedutil/mesosutil.go index 62e7aa95b..d3560e417 100644 --- a/core/util.go +++ b/core/task/schedutil/mesosutil.go @@ -25,16 +25,19 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package core +package schedutil import ( "errors" "fmt" - "github.com/spf13/viper" - "io/ioutil" - "os" + "path/filepath" "time" + "github.com/AliceO2Group/Control/common/logger" + "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "github.com/AliceO2Group/Control/common/product" proto "github.com/gogo/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" @@ -42,15 +45,16 @@ import ( "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpsched" "github.com/mesos/mesos-go/api/v1/lib/resources" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" - "path/filepath" ) +const AuthModeBasic = "basic" + +var log = logger.New(logrus.StandardLogger(),"scheduler") -func prepareExecutorInfo( +func PrepareExecutorInfo( execBinary, execImage string, wantsResources mesos.Resources, jobRestartDelay time.Duration, - metricsAPI *metricsAPI, ) (*mesos.ExecutorInfo, error) { if execImage != "" { log.Trace("executor container image specified, will run") @@ -99,7 +103,7 @@ func prepareExecutorInfo( return nil, errors.New("must specify an executor binary or image") } -func buildWantsExecutorResources(executorCPU float64, executorMemory float64) (r mesos.Resources) { +func BuildWantsExecutorResources(executorCPU float64, executorMemory float64) (r mesos.Resources) { r.Add( resources.NewCPUs(executorCPU).Resource, resources.NewMemory(executorMemory).Resource, @@ -108,7 +112,13 @@ func buildWantsExecutorResources(executorCPU float64, executorMemory float64) (r return } -func buildHTTPSched(creds credentials) calls.Caller { + +type credentials struct { + username string + password string +} + +func BuildHTTPSched(creds credentials) calls.Caller { var authConfigOpt httpcli.ConfigOpt // TODO(jdef) make this auth-mode configuration more pluggable if viper.GetString("mesosAuthMode") == AuthModeBasic { @@ -116,10 +126,10 @@ func buildHTTPSched(creds credentials) calls.Caller { // TODO(jdef) this needs testing once mesos 0.29 is available authConfigOpt = httpcli.BasicAuth(creds.username, creds.password) } - mesosCodec := viper.Get("mesosCodec").(codec) + mesosCodec := codecs.ByMediaType[codecs.MediaTypeProtobuf] cli := httpcli.New( httpcli.Endpoint(viper.GetString("mesosUrl")), - httpcli.Codec(mesosCodec.Codec), + httpcli.Codec(mesosCodec), httpcli.Do(httpcli.With( authConfigOpt, httpcli.Timeout(viper.GetDuration("mesosApiTimeout")), @@ -134,7 +144,7 @@ func buildHTTPSched(creds credentials) calls.Caller { return httpsched.NewCaller(cli) } -func buildFrameworkInfo() *mesos.FrameworkInfo { +func BuildFrameworkInfo() *mesos.FrameworkInfo { mesosCheckpoint := viper.GetBool("mesosCheckpoint") frameworkInfo := &mesos.FrameworkInfo{ User: viper.GetString("mesosFrameworkUser"), @@ -169,27 +179,3 @@ func buildFrameworkInfo() *mesos.FrameworkInfo { } return frameworkInfo } - -func loadCredentials(username string, password string) (result credentials, err error) { - result = credentials{username, password} - if result.password != "" { - // this is the path to a file containing the password - _, err = os.Stat(result.password) - if err != nil { - return - } - var f *os.File - f, err = os.Open(result.password) - if err != nil { - return - } - defer f.Close() - var bytes []byte - bytes, err = ioutil.ReadAll(f) - if err != nil { - return - } - result.password = string(bytes) - } - return -} diff --git a/common/event/messagetype.go b/core/task/taskop/messagetype.go similarity index 99% rename from common/event/messagetype.go rename to core/task/taskop/messagetype.go index f4f9882d2..d29c9d0b1 100644 --- a/common/event/messagetype.go +++ b/core/task/taskop/messagetype.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package event +package taskop import ( "errors" diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8e382f765..f6abce642 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -232,7 +232,7 @@ func (t *ControllableTask) Launch() error { // send RUNNING t.sendStatus(mesos.TASK_RUNNING, "") - taskMessage := event.NewTaskMessage(t.ti.Name,t.ti.TaskID.GetValue(),int32(t.knownPid)) + taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) jsonEvent, err := json.Marshal(taskMessage) if err != nil { log.WithError(err).Warning("error marshaling message from task") From 8f3ff129bd7a1a95fe35e7659795c437d2fa9dee Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Aug 2020 15:50:48 +0200 Subject: [PATCH 0553/2352] [core] Fix pending teardown with asynchronous ReleaseTasks --- common/event/announcetaskpidevent.go | 12 ++++- common/event/tasksreleasedevent.go | 66 ++++++++++++++++++++++++++++ core/environment/manager.go | 41 +++++++++++++++-- core/task/managerV2.go | 11 ++++- 4 files changed, 122 insertions(+), 8 deletions(-) create mode 100644 common/event/tasksreleasedevent.go diff --git a/common/event/announcetaskpidevent.go b/common/event/announcetaskpidevent.go index 53971da4b..e870484c2 100644 --- a/common/event/announcetaskpidevent.go +++ b/common/event/announcetaskpidevent.go @@ -24,11 +24,16 @@ package event +import "github.com/AliceO2Group/Control/common/utils" + type AnnounceTaskPIDEvent struct { eventBase TaskId string `json:"taskId"` PID int32 `json:"pid"` - MessageType string `json:"_messageType"` +} + +func (tmb *AnnounceTaskPIDEvent) GetName() string { + return "ANNOUNCE_TASK_PID" } func (tmb *AnnounceTaskPIDEvent) GetTaskId() string { @@ -41,9 +46,12 @@ func (tmb *AnnounceTaskPIDEvent) GetTaskPID() int { func NewAnnounceTaskPIDEvent(id string, pid int32) (tm *AnnounceTaskPIDEvent) { tm = &AnnounceTaskPIDEvent{ + eventBase: eventBase{ + Timestamp: utils.NewUnixTimestamp(), + MessageType: "AnnounceTaskPIDEvent", + }, TaskId: id, PID: pid, - MessageType: "AnnounceTaskPIDEvent", } return tm } diff --git a/common/event/tasksreleasedevent.go b/common/event/tasksreleasedevent.go new file mode 100644 index 000000000..c6e584839 --- /dev/null +++ b/common/event/tasksreleasedevent.go @@ -0,0 +1,66 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "github.com/AliceO2Group/Control/common/utils" + "github.com/pborman/uuid" +) + +type TasksReleasedEvent struct { + eventBase + EnvironmentId uuid.Array `json:"environmentId"` + TaskIdsReleased []string `json:"taskIdsReleased"` + TaskReleaseErrors map[string]error `json:"taskReleaseErrors"` +} + +func (tr *TasksReleasedEvent) GetName() string { + return "TASK_RELEASED" +} + +func (tr *TasksReleasedEvent) GetEnvironmentId() uuid.Array { + return tr.EnvironmentId +} + +func (tr *TasksReleasedEvent) GetTaskIds() []string { + return tr.TaskIdsReleased +} + +func (tr *TasksReleasedEvent) GetTaskReleaseErrors() map[string]error { + return tr.TaskReleaseErrors +} + +func NewTasksReleasedEvent(envId uuid.Array, taskIdsReleased []string, taskReleaseErrors map[string]error) (tr *TasksReleasedEvent) { + tr = &TasksReleasedEvent{ + eventBase: eventBase{ + Timestamp: utils.NewUnixTimestamp(), + MessageType: "TasksReleasedEvent", + }, + EnvironmentId: envId, + TaskIdsReleased: taskIdsReleased, + TaskReleaseErrors: taskReleaseErrors, + } + return tr +} diff --git a/core/environment/manager.go b/core/environment/manager.go index fb606280b..aacdf56b4 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -43,10 +43,11 @@ import ( ) type Manager struct { - mu sync.RWMutex - m map[uid.ID]*Environment - taskman *task.ManagerV2 - incomingEventCh <-chan event.Event + mu sync.RWMutex + m map[uid.ID]*Environment + taskman *task.ManagerV2 + incomingEventCh <-chan event.Event + pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent } func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Manager { @@ -54,6 +55,7 @@ func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Mana m: make(map[uid.ID]*Environment), taskman: tm, incomingEventCh: incomingEventCh, + pendingTeardownsCh: make(map[uid.ID]chan *event.TasksReleasedEvent), } go func() { @@ -63,6 +65,14 @@ func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Mana switch typedEvent := incomingEvent.(type) { case event.DeviceEvent: envman.handleDeviceEvent(typedEvent) + case *event.TasksReleasedEvent: + // If we got a TasksReleasedEvent, it must be matched with a pending + // environment teardown. + if thisEnvCh, ok := envman.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { + thisEnvCh <- typedEvent + close(thisEnvCh) + delete(envman.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + } default: // noop } @@ -167,7 +177,30 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId.Array(), env.Workflow().GetTasks(), nil) + + pendingCh := make(chan *event.TasksReleasedEvent) + envs.pendingTeardownsCh[environmentId.Array()] = pendingCh + envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage + + incomingEv := <- pendingCh + envs.mu.Lock() + + // If some tasks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": environmentId, + }). + WithError(err). + Warn("task failed to release") + } + err = fmt.Errorf("%d tasks failed to release for environment %s", + len(taskReleaseErrors), environmentId) + return err + } + // err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks()) // if err != nil { // return err diff --git a/core/task/managerV2.go b/core/task/managerV2.go index e06a961c6..c3473aa26 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -385,18 +385,25 @@ func (m *ManagerV2) releaseTasks(envId uuid.Array, tasks Tasks) error { m.mu.Lock() defer m.mu.Unlock() + taskReleaseErrors := make(map[string]error) + taskIdsReleased := make([]string, 0) + for _, task := range tasks { err := m.releaseTask(envId, task) - if err != nil { + if err == nil { + taskIdsReleased = append(taskIdsReleased, task.GetTaskId()) + } else { switch err.(type) { case TaskAlreadyReleasedError: continue default: - return err + taskReleaseErrors[task.GetTaskId()] = err } } } + m.internalEventCh <- event.NewTasksReleasedEvent(envId, taskIdsReleased, taskReleaseErrors) + return nil } From 9a91bdd810b1149342a5e10938700b6266c31c0c Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 22 Oct 2020 16:26:10 +0200 Subject: [PATCH 0554/2352] [core] remove mutex from TaskMan, use mutex for roster, classes and Task --- core/task/class.go | 58 ++++++++++++++++++++ core/task/managerV2.go | 121 +++++++++++++++++------------------------ core/task/match.go | 4 +- core/task/roster.go | 111 +++++++++++++++++++++++++++++++++++++ core/task/scheduler.go | 4 +- core/task/task.go | 79 +++++++++++++++++++++++---- 6 files changed, 290 insertions(+), 87 deletions(-) create mode 100644 core/task/roster.go diff --git a/core/task/class.go b/core/task/class.go index aa1254344..9764638c5 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -27,6 +27,7 @@ package task import ( "fmt" "strconv" + "sync" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" @@ -202,3 +203,60 @@ func (c *Class) Equals(other *Class) (response bool) { c.Wants.Ports.Equals(other.Wants.Ports) return } + +type classes struct { + mu sync.RWMutex + classMap map[string]*Class +} + + +func (c *classes) getMap() map[string]*Class { + c.mu.RLock() + defer c.mu.RUnlock() + + return c.classMap +} + +func (c *classes) deleteKey(key string) { + c.mu.Lock() + defer c.mu.Unlock() + + delete(c.classMap, key) +} + +func (c *classes) contains(key string) bool { + c.mu.RLock() + defer c.mu.RUnlock() + + _, ok := c.classMap[key] + + return ok +} + +func (c *classes) updateClass(key string,class *Class) { + c.mu.Lock() + defer c.mu.Unlock() + + *c.classMap[key] = *class +} + +func (c *classes) addClass(key string,class *Class) { + c.mu.Lock() + defer c.mu.Unlock() + + c.classMap[key] = class +} + +func (c *classes) getClass(key string) (class *Class, ok bool) { + c.mu.Lock() + defer c.mu.Unlock() + + class, ok = c.classMap[key] + return +} + +func newClasses() *classes { + return &classes{ + classMap: make(map[string]*Class), + } +} \ No newline at end of file diff --git a/core/task/managerV2.go b/core/task/managerV2.go index c3473aa26..0cc368b65 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -33,7 +33,6 @@ import ( "errors" "fmt" "strings" - "sync" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" @@ -62,9 +61,8 @@ type ManagerV2 struct { AgentCache AgentCache MessageChannel chan *TaskmanMessage - mu sync.RWMutex - classes map[string]*Class - roster Tasks + classes *classes + roster *roster resourceOffersDone <-chan DeploymentMap tasksToDeploy chan<- Descriptors @@ -107,8 +105,8 @@ func NewManagerV2(shutdown func(), } taskman = &ManagerV2{ - classes: make(map[string]*Class), - roster: make(Tasks, 0), + classes: newClasses(), + roster: newRoster(), publicEventCh: publicEventCh, internalEventCh: internalEventCh, } @@ -140,7 +138,7 @@ func (m *ManagerV2) GetFrameworkID() string { // constructed Task. // This function should only be called by the Mesos scheduler controller when // matching role requests with offers (matchRoles). -func (m *ManagerV2) NewTaskForMesosOffer( +func (m *ManagerV2) newTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, localBindMap channel.BindMap, @@ -173,9 +171,11 @@ func (m *ManagerV2) NewTaskForMesosOffer( func (m *ManagerV2) removeInactiveClasses() { - for taskClassIdentifier := range m.classes{ - if len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { - delete(m.classes, taskClassIdentifier) + classMap := m.classes.getMap() + + for taskClassIdentifier := range classMap { + if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + m.classes.deleteKey(taskClassIdentifier) } } @@ -183,15 +183,13 @@ func (m *ManagerV2) removeInactiveClasses() { } func (m *ManagerV2) RemoveReposClasses(repoPath string) { //Currently unused - m.mu.Lock() - defer m.mu.Unlock() utils.EnsureTrailingSlash(&repoPath) - for taskClassIdentifier := range m.classes{ + for taskClassIdentifier := range m.classes.getMap() { if strings.HasPrefix(taskClassIdentifier, repoPath) && - len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { - delete(m.classes, taskClassIdentifier) + len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + m.classes.deleteKey(taskClassIdentifier) } } @@ -199,8 +197,6 @@ func (m *ManagerV2) RemoveReposClasses(repoPath string) { //Currently unused } func (m *ManagerV2) RefreshClasses(taskClassesRequired []string) (err error) { - m.mu.Lock() - defer m.mu.Unlock() m.removeInactiveClasses() @@ -213,18 +209,16 @@ func (m *ManagerV2) RefreshClasses(taskClassesRequired []string) (err error) { for _, class := range taskClassList { taskClassIdentifier := class.Identifier.String() // If it already exists we update, otherwise we add the new class - if _, ok := m.classes[taskClassIdentifier]; ok { - *m.classes[taskClassIdentifier] = *class + if m.classes.contains(taskClassIdentifier) { + m.classes.updateClass(taskClassIdentifier, class) } else { - m.classes[taskClassIdentifier] = class + m.classes.addClass(taskClassIdentifier, class) } } return } func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) (err error) { - m.mu.Lock() - defer m.mu.Unlock() /* Here's what's gonna happen: @@ -262,7 +256,7 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) if taskPtr != nil { if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) - taskClass, classFound := m.classes[descriptor.TaskClassName] + taskClass, classFound := m.classes.getClass(descriptor.TaskClassName) if classFound && taskClass != nil && agentInfo != nil { targetConstraints := descriptor. RoleConstraints.MergeParent(taskClass.Constraints) @@ -275,7 +269,7 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) } return } - runningTasksForThisDescriptor := m.roster.Filtered(taskMatches) + runningTasksForThisDescriptor := m.roster.filtered(taskMatches) claimed := false if len(runningTasksForThisDescriptor) > 0 { // We have received a list of running, unlocked candidates to take over @@ -344,7 +338,7 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) // ↑ means all the required processes are now running, and we // are ready to update the envId for taskPtr, descriptor := range deployedTasks { - taskPtr.parent = descriptor.TaskRole + taskPtr.SetParent(descriptor.TaskRole) // Ensure everything is filled out properly if !taskPtr.IsLocked() { log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") @@ -358,7 +352,7 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) // unlocked in the roster. var deployedTaskIds []string for taskPtr, _ := range deployedTasks { - taskPtr.parent = nil + taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } err = TasksDeploymentError{taskIds: deployedTaskIds} @@ -366,15 +360,15 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) // Finally, we write to the roster. Point of no return! for taskPtr, _ := range deployedTasks { - m.roster = append(m.roster, taskPtr) + m.roster.append(taskPtr) } if deploymentSuccess { for taskPtr, _ := range deployedTasks { - taskPtr.parent.SetTask(taskPtr) + taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { - taskPtr.parent = descriptor.TaskRole - taskPtr.parent.SetTask(taskPtr) + taskPtr.SetParent(descriptor.TaskRole) + taskPtr.GetParent().SetTask(taskPtr) } } @@ -382,8 +376,6 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) } func (m *ManagerV2) releaseTasks(envId uuid.Array, tasks Tasks) error { - m.mu.Lock() - defer m.mu.Unlock() taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -415,7 +407,7 @@ func (m *ManagerV2) releaseTask(envId uuid.Array, task *Task) error { return TaskLockedError{taskErrorBase: taskErrorBase{taskId: task.name}, envId: envId} } - task.parent = nil + task.SetParent(nil) return nil } @@ -427,11 +419,10 @@ func (m *ManagerV2) configureTasks(envId uuid.Array, tasks Tasks) error { return err } - m.mu.RLock() // We generate a "bindMap" i.e. a map of the paths of registered inbound channels and their ports bindMap := make(channel.BindMap) for _, task := range tasks { - taskPath := task.parent.GetPath() + taskPath := task.GetParent().GetPath() for inbChName, endpoint := range task.GetLocalBindMap() { bindMap[taskPath + TARGET_SEPARATOR + inbChName] = endpoint.ToTargetEndpoint(task.GetHostname()) @@ -446,11 +437,9 @@ func (m *ManagerV2) configureTasks(envId uuid.Array, tasks Tasks) error { args := make(controlcommands.PropertyMapsMap) args, err = tasks.BuildPropertyMaps(bindMap) if err != nil { - m.mu.RUnlock() return err } log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") - m.mu.RUnlock() cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) m.cq.Enqueue(cmd, notify) @@ -551,7 +540,7 @@ func (m *ManagerV2) GetTaskClass(name string) (b *Class) { if m == nil { return } - b = m.classes[name] + b, _ = m.classes.getClass(name) return } @@ -559,21 +548,21 @@ func (m *ManagerV2) TaskCount() int { if m == nil { return -1 } - return len(m.roster) + return len(m.roster.getTasks()) } func (m *ManagerV2) GetTasks() Tasks { if m == nil { return nil } - return m.roster + return m.roster.getTasks() } func (m *ManagerV2) GetTask(id string) *Task { if m == nil { return nil } - for _, t := range m.roster { + for _, t := range m.roster.getTasks() { if t.taskId == id { return t } @@ -582,10 +571,8 @@ func (m *ManagerV2) GetTask(id string) *Task { } func (m *ManagerV2) updateTaskState(taskId string, state string) { - m.mu.RLock() - defer m.mu.RUnlock() - taskPtr := m.roster.GetByTaskId(taskId) + taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). Warn("attempted state update of task not in roster") @@ -595,17 +582,15 @@ func (m *ManagerV2) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - if taskPtr.parent != nil { - taskPtr.parent.UpdateState(st) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateState(st) } } func (m *ManagerV2) updateTaskStatus(status *mesos.TaskStatus) { - m.mu.RLock() - defer m.mu.RUnlock() taskId := status.GetTaskID().Value - taskPtr := m.roster.GetByTaskId(taskId) + taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") @@ -618,23 +603,21 @@ func (m *ManagerV2) updateTaskStatus(status *mesos.TaskStatus) { WithField("name", taskPtr.GetName()). Debug("task running") taskPtr.status = ACTIVE - if taskPtr.parent != nil { - taskPtr.parent.UpdateStatus(ACTIVE) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateStatus(ACTIVE) } case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: taskPtr.status = INACTIVE - if taskPtr.parent != nil { - taskPtr.parent.UpdateStatus(INACTIVE) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateStatus(INACTIVE) } } } // Kill all tasks outside an environment (all unlocked tasks) func (m *ManagerV2) Cleanup() (killed Tasks, running Tasks, err error) { - m.mu.Lock() - defer m.mu.Unlock() - toKill := m.roster.Filtered(func(t *Task) bool { + toKill := m.roster.filtered(func(t *Task) bool { return !t.IsLocked() }) @@ -645,10 +628,8 @@ func (m *ManagerV2) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *ManagerV2) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - m.mu.Lock() - defer m.mu.Unlock() - toKill := m.roster.Filtered(func(t *Task) bool { + toKill := m.roster.filtered(func(t *Task) bool { if t.IsLocked() { return false } @@ -682,11 +663,11 @@ func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err e return task.status != ACTIVE }) // Remove from the roster the tasks which are also in the inactiveTasks list to delete - m.roster = m.roster.Filtered(func(task *Task) bool { + m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !inactiveTasks.Contains(func(t *Task) bool { return t.taskId == task.taskId }) - }) + })) for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { e := m.doKillTask(task) @@ -699,20 +680,18 @@ func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err e } // Remove from the roster the tasks we've just killed - m.roster = m.roster.Filtered(func(task *Task) bool { + m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !killed.Contains(func(t *Task) bool { return t.taskId == task.taskId }) - }) - running = m.roster + })) + running = m.roster.getTasks() return } func (m *ManagerV2) Start(ctx context.Context) { - m.mu.Lock() m.MessageChannel = make(chan *TaskmanMessage, TaskMan_QUEUE) - m.mu.Unlock() m.schedulerState.Start(ctx) @@ -733,8 +712,6 @@ func (m *ManagerV2) Start(ctx context.Context) { } func (m *ManagerV2) stop() { - m.mu.Lock() - defer m.mu.Unlock() close(m.MessageChannel) } @@ -747,11 +724,11 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { switch messageType{ case taskop.AcquireTasks: - m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) + go m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) case taskop.ConfigureTasks: - m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + go m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) case taskop.TransitionTasks: - m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + go m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) case taskop.TaskStatusMessage: mesosStatus := tm.status mesosState := mesosStatus.GetState() @@ -795,7 +772,7 @@ func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { // case event.KillTasks: // m.killTasks(tm.GetTaskIds()) case taskop.ReleaseTasks: - m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) } diff --git a/core/task/match.go b/core/task/match.go index 04f6c956a..1a93a04ea 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -39,7 +39,7 @@ type Wants struct { } func (m *ManagerV2) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { - taskClass, ok := m.classes[descriptor.TaskClassName] + taskClass, ok := m.classes.getClass(descriptor.TaskClassName) if ok && taskClass != nil { r = &Wants{} wants := taskClass.Wants @@ -96,7 +96,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { func (m *ManagerV2) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { cm = make(map[*Descriptor]constraint.Constraints) for _, descriptor := range descriptors { - taskClass, ok := m.classes[descriptor.TaskClassName] + taskClass, ok := m.classes.getClass(descriptor.TaskClassName) if ok && taskClass != nil { cm[descriptor] = descriptor.RoleConstraints.MergeParent(taskClass.Constraints) } else { diff --git a/core/task/roster.go b/core/task/roster.go new file mode 100644 index 000000000..14d5c2eb5 --- /dev/null +++ b/core/task/roster.go @@ -0,0 +1,111 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "sync" + + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/task/channel" +) + +type roster struct { + mu sync.RWMutex + tasks Tasks +} + +func (m *roster) getTaskIds() []string { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.GetTaskIds() +} + +func (m *roster) getByTaskId(id string) *Task { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.GetByTaskId(id) +} + +func (m *roster) contains(filter Filter) (has bool) { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.Contains(filter) +} + +func (m *roster) filteredForClass(className string) (tasks Tasks) { + return m.tasks.FilteredForClass(className) +} + +func (m *roster) filtered(filter Filter) (tasks Tasks) { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.Filtered(filter) +} + +func (m *roster) getMesosCommandTargets() (receivers []controlcommands.MesosCommandTarget, err error) { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.GetMesosCommandTargets() +} + +func (m *roster) buildPropertyMaps(bindMap channel.BindMap) (propMapMap controlcommands.PropertyMapsMap, err error) { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.BuildPropertyMaps(bindMap) +} + +func (m *roster) getTasks() Tasks { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks +} + +func(m *roster) updateTasks(tasks Tasks) { + m.mu.Lock() + defer m.mu.Unlock() + + m.tasks = tasks +} + +func (m *roster) append(task *Task) { + m.mu.Lock() + defer m.mu.Unlock() + + m.tasks = append(m.tasks, task) +} + +func newRoster() *roster { + roster := &roster{ + tasks: make(Tasks, 0), + } + return roster +} \ No newline at end of file diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 53b5cfa67..2710a4e00 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -373,7 +373,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { t := state.taskman.GetTask(taskMessage.GetTaskId()) if t != nil { - t.SetTaskPID(taskMessage.GetTaskPID()) + t.setTaskPID(taskMessage.GetTaskPID()) } } return @@ -569,7 +569,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } state.taskman.AgentCache.Update(agentForCache) //thread safe - taskPtr := state.taskman.NewTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) + taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) if taskPtr == nil { log.WithPrefix("scheduler"). WithField("offerId", offer.ID.Value). diff --git a/core/task/task.go b/core/task/task.go index 08eab6525..cfb8afdd1 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -34,6 +34,7 @@ import ( "fmt" "strconv" "strings" + "sync" texttemplate "text/template" "time" @@ -100,6 +101,7 @@ type Task interface { type Task struct { + mu sync.RWMutex parent parentRole className string //configuration Descriptor @@ -126,6 +128,8 @@ type Task struct { } func (t *Task) IsSafeToStop() bool { + t.mu.RLock() + defer t.mu.RUnlock() if t.GetControlMode() != controlmode.BASIC { return t.state == RUNNING } @@ -133,18 +137,27 @@ func (t *Task) IsSafeToStop() bool { } func (t *Task) SetSafeToStop(done bool) { + t.mu.Lock() + defer t.mu.Unlock() + t.safeToStop = done } func (t *Task) GetParentRole() interface{} { + t.mu.RLock() + defer t.mu.RUnlock() return t.parent } func (t *Task) GetParentRolePath() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.parent.GetPath() } func (t *Task) IsLocked() bool { + t.mu.RLock() + defer t.mu.RUnlock() return len(t.hostname) > 0 && len(t.agentId) > 0 && len(t.offerId) > 0 && @@ -154,6 +167,8 @@ func (t *Task) IsLocked() bool { } func (t *Task) GetName() string { + t.mu.RLock() + defer t.mu.RUnlock() if t != nil { return t.name } @@ -161,6 +176,8 @@ func (t *Task) GetName() string { } func (t *Task) GetClassName() string { + t.mu.RLock() + defer t.mu.RUnlock() if t != nil { return t.className } @@ -168,6 +185,8 @@ func (t *Task) GetClassName() string { } func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { + t.mu.RLock() + defer t.mu.RUnlock() return t.commandInfo } @@ -187,8 +206,8 @@ func (t *Task) GetControlMode() controlmode.ControlMode { // If it's a BASIC task but its parent role uses it as a HOOK, // we modify the actual control mode of the task. // The class itself can never be HOOK, only BASIC - if class.Control.Mode == controlmode.BASIC && t.parent != nil { - traits := t.parent.GetTaskTraits() + if class.Control.Mode == controlmode.BASIC && t.GetParent() != nil { + traits := t.GetParent().GetTaskTraits() if len(traits.Trigger) > 0 { return controlmode.HOOK } @@ -200,8 +219,8 @@ func (t *Task) GetControlMode() controlmode.ControlMode { func (t *Task) GetTraits() Traits { if class := t.GetTaskClass(); class != nil { - if class.Control.Mode == controlmode.BASIC && t.parent != nil { - return t.parent.GetTaskTraits() + if class.Control.Mode == controlmode.BASIC && t.GetParent() != nil { + return t.GetParent().GetTaskTraits() } } return Traits{} @@ -287,7 +306,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // If it's a HOOK, we must pass the Timeout to the TCI for // executor-side timeout enforcement if cmd.ControlMode == controlmode.HOOK || cmd.ControlMode == controlmode.BASIC { - traits := t.parent.GetTaskTraits() + traits := t.GetParent().GetTaskTraits() cmd.Timeout, err = time.ParseDuration(traits.Timeout) } @@ -329,26 +348,39 @@ func (t *Task) GetWantsPorts() Ranges { } func (t *Task) GetOfferId() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.offerId } func (t *Task) GetTaskId() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.taskId } func (t *Task) GetExecutorId() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.executorId } func (t *Task) GetAgentId() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.agentId } func (t *Task) GetHostname() string { + t.mu.RLock() + defer t.mu.RUnlock() return t.hostname } func (t *Task) GetEnvironmentId() uid.ID { + t.mu.RLock() + defer t.mu.RUnlock() + if t.parent == nil { return uid.NilID() } @@ -356,6 +388,8 @@ func (t *Task) GetEnvironmentId() uid.ID { } func (t *Task) GetLocalBindMap() channel.BindMap { + t.mu.RLock() + defer t.mu.RUnlock() return t.localBindMap } @@ -363,13 +397,13 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task or hook, we template the props - if t.parent == nil { + if t.GetParent() == nil { return } // First we get the full varStack from the parent role, and // consolidate it. - varStack, err := t.parent.ConsolidatedVarStack() + varStack, err := t.GetParent().ConsolidatedVarStack() if err != nil { log.WithError(err).Error("cannot fetch variables stack for property map") return @@ -385,7 +419,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // Finally we build the task-specific special values, and write them // into the varStack (overwriting anything). - specialVarStack := t.buildSpecialVarStack(t.parent) + specialVarStack := t.buildSpecialVarStack(t.GetParent()) for k, v := range specialVarStack { varStack[k] = v } @@ -431,7 +465,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT { - for _, inbCh := range channel.MergeInbound(t.parent.CollectInboundChannels(), class.Bind) { + for _, inbCh := range channel.MergeInbound(t.GetParent().CollectInboundChannels(), class.Bind) { endpoint, ok := t.localBindMap[inbCh.Name] if !ok { log.WithFields(logrus.Fields{ @@ -450,7 +484,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap[k] = v } } - for _, outboundCh := range channel.MergeOutbound(t.parent.CollectOutboundChannels(), class.Connect) { + for _, outboundCh := range channel.MergeOutbound(t.GetParent().CollectOutboundChannels(), class.Connect) { // We get the FairMQ-formatted propertyMap from the outbound channel spec chanProps := outboundCh.ToFMQMap(bindMap) @@ -481,6 +515,9 @@ func (t *Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { } func (t *Task) GetProperties() map[string]string { + t.mu.RLock() + defer t.mu.RUnlock() + if t == nil { log.Warn("attempted to get properties of nil task") return make(map[string]string) @@ -492,7 +529,10 @@ func (t *Task) GetProperties() map[string]string { return propertiesMap } -func (t *Task) SetTaskPID(pid int) { +func (t *Task) setTaskPID(pid int) { + t.mu.Lock() + defer t.mu.Unlock() + if t == nil { return } @@ -500,8 +540,25 @@ func (t *Task) SetTaskPID(pid int) { } func (t *Task) GetTaskPID() string { + t.mu.RLock() + defer t.mu.RUnlock() + if t == nil { return "" } return t.pid +} + +func (t *Task) GetParent() parentRole { + t.mu.RLock() + defer t.mu.RUnlock() + + return t.parent +} + +func (t *Task) SetParent(parent parentRole) { + t.mu.Lock() + defer t.mu.Unlock() + + t.parent = parent } \ No newline at end of file From ee4584fa9971ec0562eb0aa815659baa9e26e34a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 2 Nov 2020 09:39:53 +0100 Subject: [PATCH 0555/2352] [core] rebase taskman --- common/event/tasksreleasedevent.go | 8 ++++---- core/environment/manager.go | 10 +++++----- core/environment/transition_configure.go | 4 ++-- core/server.go | 3 --- core/task/coreevent.go | 9 +++++---- core/task/managerV2.go | 9 +++++---- core/task/scheduler.go | 11 ++++++----- 7 files changed, 27 insertions(+), 27 deletions(-) diff --git a/common/event/tasksreleasedevent.go b/common/event/tasksreleasedevent.go index c6e584839..c218ee704 100644 --- a/common/event/tasksreleasedevent.go +++ b/common/event/tasksreleasedevent.go @@ -26,12 +26,12 @@ package event import ( "github.com/AliceO2Group/Control/common/utils" - "github.com/pborman/uuid" + "github.com/AliceO2Group/Control/common/utils/uid" ) type TasksReleasedEvent struct { eventBase - EnvironmentId uuid.Array `json:"environmentId"` + EnvironmentId uid.ID `json:"environmentId"` TaskIdsReleased []string `json:"taskIdsReleased"` TaskReleaseErrors map[string]error `json:"taskReleaseErrors"` } @@ -40,7 +40,7 @@ func (tr *TasksReleasedEvent) GetName() string { return "TASK_RELEASED" } -func (tr *TasksReleasedEvent) GetEnvironmentId() uuid.Array { +func (tr *TasksReleasedEvent) GetEnvironmentId() uid.ID { return tr.EnvironmentId } @@ -52,7 +52,7 @@ func (tr *TasksReleasedEvent) GetTaskReleaseErrors() map[string]error { return tr.TaskReleaseErrors } -func NewTasksReleasedEvent(envId uuid.Array, taskIdsReleased []string, taskReleaseErrors map[string]error) (tr *TasksReleasedEvent) { +func NewTasksReleasedEvent(envId uid.ID, taskIdsReleased []string, taskReleaseErrors map[string]error) (tr *TasksReleasedEvent) { tr = &TasksReleasedEvent{ eventBase: eventBase{ Timestamp: utils.NewUnixTimestamp(), diff --git a/core/environment/manager.go b/core/environment/manager.go index aacdf56b4..e0eaed464 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -126,7 +126,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { envState := env.CurrentState() envTasks := env.Workflow().GetTasks() - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id.Array(), envTasks, nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) envs.taskman.MessageChannel <- taskmanMessage // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) // if rlsErr != nil { @@ -176,10 +176,10 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId.Array(), env.Workflow().GetTasks(), nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId, env.Workflow().GetTasks(), nil) pendingCh := make(chan *event.TasksReleasedEvent) - envs.pendingTeardownsCh[environmentId.Array()] = pendingCh + envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage @@ -287,7 +287,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { // If it's an update following a HOOK execution if t.GetControlMode() == controlmode.HOOK { isHook = true - env, err := envs.environment(t.GetEnvironmentId().UUID()) + env, err := envs.environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") } @@ -316,7 +316,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent END_OF_STREAM") return } - env, err := envs.environment(t.GetEnvironmentId().UUID()) + env, err := envs.environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 3a8f2f03a..1cc8012ab 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -143,7 +143,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { taskDescriptors := wf.GenerateTaskDescriptors() if len(taskDescriptors) != 0 { // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) - taskmanMessage := task.NewEnvironmentMessage(taskop.AcquireTasks, env.Id().Array(), nil, taskDescriptors) + taskmanMessage := task.NewEnvironmentMessage(taskop.AcquireTasks, env.Id(), nil, taskDescriptors) t.taskman.MessageChannel <- taskmanMessage } if err != nil { @@ -181,7 +181,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { if len(tasks) != 0 { // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) - taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id().Array(), tasks, nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id(), tasks, nil) t.taskman.MessageChannel <- taskmanMessage // if err != nil { // return diff --git a/core/server.go b/core/server.go index 0fe64c5da..9facac25c 100644 --- a/core/server.go +++ b/core/server.go @@ -26,7 +26,6 @@ package core import ( - "fmt" "runtime" "sort" "strconv" @@ -44,8 +43,6 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/protos" - "github.com/looplab/fsm" - "github.com/mesos/mesos-go/api/v1/lib/extras/store" "google.golang.org/grpc/codes" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 42b84d508..0ea147535 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -28,7 +28,8 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/pborman/uuid" + "github.com/AliceO2Group/Control/common/utils/uid" + ) type TaskmanMessage struct { @@ -52,12 +53,12 @@ func (tm *TaskmanMessage) GetMessageType() taskop.MessageType { } type environmentMessage struct { - envId uuid.Array + envId uid.ID tasks Tasks descriptors Descriptors } -func (em *environmentMessage) GetEnvironmentId() (envid uuid.Array) { +func (em *environmentMessage) GetEnvironmentId() (envid uid.ID) { if em == nil { return } @@ -78,7 +79,7 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } -func NewEnvironmentMessage(mt taskop.MessageType, envId uuid.Array, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { +func NewEnvironmentMessage(mt taskop.MessageType, envId uid.ID, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { t = NewTaskmanMessage(mt) t.environmentMessage = environmentMessage{ envId: envId, diff --git a/core/task/managerV2.go b/core/task/managerV2.go index 0cc368b65..9d6238c92 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -39,6 +39,7 @@ import ( pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/mesos/mesos-go/api/v1/lib/extras/store" "github.com/AliceO2Group/Control/common/utils" @@ -218,7 +219,7 @@ func (m *ManagerV2) RefreshClasses(taskClassesRequired []string) (err error) { return } -func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) (err error) { +func (m *ManagerV2) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { /* Here's what's gonna happen: @@ -375,7 +376,7 @@ func (m *ManagerV2) acquireTasks(envId uuid.Array, taskDescriptors Descriptors) return } -func (m *ManagerV2) releaseTasks(envId uuid.Array, tasks Tasks) error { +func (m *ManagerV2) releaseTasks(envId uid.ID, tasks Tasks) error { taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -399,7 +400,7 @@ func (m *ManagerV2) releaseTasks(envId uuid.Array, tasks Tasks) error { return nil } -func (m *ManagerV2) releaseTask(envId uuid.Array, task *Task) error { +func (m *ManagerV2) releaseTask(envId uid.ID, task *Task) error { if task == nil { return TaskNotFoundError{} } @@ -412,7 +413,7 @@ func (m *ManagerV2) releaseTask(envId uuid.Array, task *Task) error { return nil } -func (m *ManagerV2) configureTasks(envId uuid.Array, tasks Tasks) error { +func (m *ManagerV2) configureTasks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() if err != nil { diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 2710a4e00..9579ea4ad 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -38,6 +38,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/spf13/viper" @@ -184,7 +185,7 @@ func (state *schedulerState) reconciliationCall() events.HandlerFunc { } // Update metrics when we receive an offer -func (state *schedulerState)trackOffersReceived() eventrules.Rule { +func (state *schedulerState) trackOffersReceived() eventrules.Rule { return func(ctx context.Context, e *scheduler.Event, err error, chain eventrules.Chain) (context.Context, *scheduler.Event, error) { if err == nil { state.metricsAPI.offersReceived.Int(len(e.GetOffers().GetOffers())) @@ -406,7 +407,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han }).Trace("received offers") } - var descriptorsToDeploy Descriptors + var descriptorsStillToDeploy Descriptors select { case descriptorsStillToDeploy = <- state.tasksToDeploy: if viper.GetBool("veryVerbose") { @@ -461,8 +462,8 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // for a likely significant multinode launch performance increase for _, offer := range offers { var ( - remainingResources = mesos.Resources(offer.Resources) - tasks = make([]mesos.TaskInfo, 0) + remainingResourcesInOffer = mesos.Resources(offer.Resources) + taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) tasksDeployedForCurrentOffer = make(DeploymentMap) targetExecutorId = mesos.ExecutorID{} ) @@ -526,7 +527,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Warning("no resource demands for descriptor, invalid class perhaps?") continue } - if !Resources(remainingResources).Satisfy(wants) { + if !Resources(remainingResourcesInOffer).Satisfy(wants) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ From 067cd2c81ea02a4042398d09762d68190b00cb29 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Nov 2020 10:48:59 +0100 Subject: [PATCH 0556/2352] [coconut] Remove usage of UUID --- coconut/control/control.go | 2 +- coconut/control/controlutil.go | 6 ------ 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index d9898f668..d4801ab89 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -504,7 +504,7 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a func CleanTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) > 0 { for _, id := range args { - if !isValidUUID(id) { + if len(id) == 0 { err = errors.New(fmt.Sprintf("%s is not a valid task ID", id)) return } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index a65e7e4ca..4ecb76b2b 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -32,7 +32,6 @@ import ( "github.com/AliceO2Group/Control/coconut/protos" "github.com/fatih/color" - "github.com/google/uuid" "github.com/olekukonko/tablewriter" "github.com/xlab/treeprint" ) @@ -153,8 +152,3 @@ func formatTimestamp(rfc3339timestamp string) string { } return formatted } - -func isValidUUID(u string) bool { - _, err := uuid.Parse(u) - return err == nil -} From 73719b335068b312b2edb6229dde77614dd64f5f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Nov 2020 10:49:46 +0100 Subject: [PATCH 0557/2352] [core] Correct task ID generation --- core/task/managerV2.go | 3 +-- core/task/task.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/task/managerV2.go b/core/task/managerV2.go index 9d6238c92..56efac739 100644 --- a/core/task/managerV2.go +++ b/core/task/managerV2.go @@ -49,7 +49,6 @@ import ( "github.com/k0kubun/pp" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" - "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -144,7 +143,7 @@ func (m *ManagerV2) newTaskForMesosOffer( descriptor *Descriptor, localBindMap channel.BindMap, executorId mesos.ExecutorID) (t *Task) { - newId := uuid.NewUUID().String() + newId := uid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), parent: descriptor.TaskRole, diff --git a/core/task/task.go b/core/task/task.go index cfb8afdd1..12abe1c5b 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -93,7 +93,7 @@ type Task interface { GetExecutorId() string GetAgentId() string GetHostname() string - GetEnvironmentId() uuid.Array + GetEnvironmentId() uid.ID GetLocalBindMap() map[string]uint64 BuildPropertyMap(bindMap channel.BindMap) controlcommands.PropertyMap GetMesosCommandTarget() controlcommands.MesosCommandTarget From a5a1df537758e7b45021467657955bbf5ecdfd18 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Nov 2020 10:50:05 +0100 Subject: [PATCH 0558/2352] [executor] Send TASK_FAILED status more preemptively --- executor/handlers.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/executor/handlers.go b/executor/handlers.go index ab4c2cf50..2e4af9a31 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -139,6 +139,9 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "error": err.Error(), }). Error("no task for incoming MESSAGE") + st := newStatus(state, taskId) + *st.State = mesos.TASK_FAILED + _ = update(state, st) return } @@ -207,6 +210,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "error": err.Error(), }). Error("no task for incoming MESSAGE") + st := newStatus(state, taskId) + mesosState := mesos.TASK_FAILED + st.State = &mesosState + _ = update(state, st) return } @@ -281,6 +288,10 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { log.Trace("task launching") } else { log.Error("task launch failed") + st := newStatus(state, taskInfo.TaskID) + mesosState := mesos.TASK_FAILED + st.State = &mesosState + _ = update(state, st) } } From 9e58bd037dcff3f45f45656ff5c7f435fd94ddbd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Nov 2020 12:35:14 +0100 Subject: [PATCH 0559/2352] [core] Remove obsolete warning from repo.Manager --- core/repos/repo.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 4e141059c..8f9138523 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -55,7 +55,6 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { if len(revSlice) == 2 { //revision specified in the repo path repoUrlSlice = strings.Split(revSlice[0], "/") revision = revSlice[1] - log.Warning("Using revision : " + revision + " from repo path: " + repoPath) } else if len(revSlice) == 1 { //no revision specified in the repo path repoUrlSlice = strings.Split(revSlice[0], "/") revision = defaultRevision From 86d15fb6740cb458bc6eab3b3c0be593fd2e7af6 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 4 Nov 2020 12:14:28 +0100 Subject: [PATCH 0560/2352] [core] merge manager with managerv2 --- core/environment/manager.go | 4 +- core/environment/transition.go | 5 +- core/environment/transition_configure.go | 2 +- core/environment/transition_reset.go | 2 +- core/environment/transition_startactivity.go | 2 +- core/environment/transition_stopactivity.go | 2 +- core/globalstate.go | 4 +- core/task/manager.go | 324 +++++--- core/task/managerV2.go | 791 ------------------- core/task/match.go | 4 +- core/task/roster.go | 3 + core/task/schedulerstate.go | 5 +- core/task/task.go | 10 + core/workflow/load.go | 2 +- core/workflow/taskrole.go | 2 +- 15 files changed, 265 insertions(+), 897 deletions(-) delete mode 100644 core/task/managerV2.go diff --git a/core/environment/manager.go b/core/environment/manager.go index e0eaed464..a2a4c8738 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -45,12 +45,12 @@ import ( type Manager struct { mu sync.RWMutex m map[uid.ID]*Environment - taskman *task.ManagerV2 + taskman *task.Manager incomingEventCh <-chan event.Event pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent } -func NewEnvManager(tm *task.ManagerV2, incomingEventCh <-chan event.Event) *Manager { +func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manager { envman := &Manager{ m: make(map[uid.ID]*Environment), taskman: tm, diff --git a/core/environment/transition.go b/core/environment/transition.go index 9d2f0ee35..a22b44fba 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -37,7 +37,7 @@ type Transition interface { do(*Environment) error } -func MakeTransition(taskman *task.ManagerV2, optype pb.ControlEnvironmentRequest_Optype) Transition { +func MakeTransition(taskman *task.Manager, optype pb.ControlEnvironmentRequest_Optype) Transition { switch optype { case pb.ControlEnvironmentRequest_CONFIGURE: return NewConfigureTransition(taskman, nil, nil, true) @@ -58,7 +58,7 @@ func MakeTransition(taskman *task.ManagerV2, optype pb.ControlEnvironmentRequest } type baseTransition struct { - taskman *task.ManagerV2 + taskman *task.Manager name string } @@ -72,4 +72,3 @@ func (t baseTransition) check() (err error) { func (t baseTransition) eventName() string { return t.name } - diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 1cc8012ab..50e0dcd3b 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -34,7 +34,7 @@ import ( "github.com/sirupsen/logrus" ) -func NewConfigureTransition(taskman *task.ManagerV2, addRoles []string, removeRoles []string, reconfigureAll bool) Transition { +func NewConfigureTransition(taskman *task.Manager, addRoles []string, removeRoles []string, reconfigureAll bool) Transition { return &ConfigureTransition{ baseTransition: baseTransition{ name: "CONFIGURE", diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index 353321a79..da2b5cc4c 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -29,7 +29,7 @@ import ( "github.com/AliceO2Group/Control/core/task" ) -func NewResetTransition(taskman *task.ManagerV2) Transition { +func NewResetTransition(taskman *task.Manager) Transition { return &ResetTransition{ baseTransition: baseTransition{ name: "RESET", diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index c8d17018d..69c8cc0f3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -34,7 +34,7 @@ import ( "github.com/AliceO2Group/Control/core/the" ) -func NewStartActivityTransition(taskman *task.ManagerV2) Transition { +func NewStartActivityTransition(taskman *task.Manager) Transition { return &StartActivityTransition{ baseTransition: baseTransition{ name: "START_ACTIVITY", diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 04233fb2f..3388ff4f2 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -30,7 +30,7 @@ import ( "github.com/AliceO2Group/Control/core/task" ) -func NewStopActivityTransition(taskman *task.ManagerV2) Transition { +func NewStopActivityTransition(taskman *task.Manager) Transition { return &StopActivityTransition{ baseTransition: baseTransition{ name: "STOP_ACTIVITY", diff --git a/core/globalstate.go b/core/globalstate.go index 68111a153..1d5622f7f 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -63,7 +63,7 @@ func newGlobalState(shutdown func()) (*globalState, error) { } internalEventCh := make(chan event.Event) - taskman, err := task.NewManagerV2(shutdown, publicEventCh, internalEventCh) + taskman, err := task.NewManager(shutdown, publicEventCh, internalEventCh) if err != nil { return nil, err } @@ -82,7 +82,7 @@ type globalState struct { // uses locks, so thread safe environments *environment.Manager - taskman *task.ManagerV2 + taskman *task.Manager PublicEvent chan *pb.Event diff --git a/core/task/manager.go b/core/task/manager.go index eb563f204..eefa58218 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -25,24 +25,29 @@ package task import ( + "context" "errors" - "fmt" "io/ioutil" "path/filepath" + "fmt" "strings" - "sync" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/common/utils" + pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/repos" - "github.com/AliceO2Group/Control/core/the" + "github.com/mesos/mesos-go/api/v1/lib/extras/store" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/k0kubun/pp" "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" "github.com/sirupsen/logrus" ) @@ -53,35 +58,75 @@ const ( TARGET_SEPARATOR = ":" ) +const TaskMan_QUEUE = 1024 + type Manager struct { + ctx context.Context + fidStore store.Singleton AgentCache AgentCache + MessageChannel chan *TaskmanMessage - mu sync.RWMutex - classes map[string]*Class - roster Tasks + classes *classes + roster *roster resourceOffersDone <-chan DeploymentMap tasksToDeploy chan<- Descriptors reviveOffersTrg chan struct{} cq *controlcommands.CommandQueue - doKillTask KillTaskFunc + tasksLaunched int + tasksFinished int + + schedulerState *schedulerState + publicEventCh chan<- *pb.Event + internalEventCh chan<- event.Event } -func NewManager(resourceOffersDone <-chan DeploymentMap, - tasksToDeploy chan<- Descriptors, - reviveOffersTrg chan struct{}, - cq *controlcommands.CommandQueue, - killTaskFunc KillTaskFunc) (taskman *Manager) { +func NewManager(shutdown func(), + publicEventCh chan<- *pb.Event, + internalEventCh chan<- event.Event) (taskman *Manager, err error) { + // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should + // probably tolerate X number of subsequent subscribe failures before bailing. we'll need + // to track the lastCallAttempted along with subsequentSubscribeTimeouts. + + // store.Singleton is a thread-safe abstraction to load and store and string, + // provided by mesos-go. + // We also make sure that a log message is printed with the FrameworkID. + fidStore := store.DecorateSingleton( + store.NewInMemorySingleton(), + store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { + // Store Mesos Framework ID to configuration. + err = the.ConfSvc().NewMesosFID(v) + if err != nil { + log.WithField("error", err).Error("cannot write to configuration") + } + log.WithField("frameworkId", v).Debug("frameworkId") + return nil + })) + + // Set Framework ID from the configuration + if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { + store.SetOrPanic(fidStore)(fidValue) + } + taskman = &Manager{ - classes: make(map[string]*Class), - roster: make(Tasks, 0), - resourceOffersDone: resourceOffersDone, - tasksToDeploy: tasksToDeploy, - reviveOffersTrg: reviveOffersTrg, - cq: cq, - doKillTask: killTaskFunc, + classes: newClasses(), + roster: newRoster(), + publicEventCh: publicEventCh, + internalEventCh: internalEventCh, + } + schedulerState, err := NewScheduler(taskman, fidStore, shutdown) + if err != nil { + return nil, err } + taskman.schedulerState = schedulerState + taskman.cq = taskman.schedulerState.commandqueue + taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone + taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy + taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg + + schedulerState.setupCli() + return } @@ -89,7 +134,7 @@ func NewManager(resourceOffersDone <-chan DeploymentMap, // constructed Task. // This function should only be called by the Mesos scheduler controller when // matching role requests with offers (matchRoles). -func (m *Manager) NewTaskForMesosOffer( +func (m *Manager) newTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, localBindMap channel.BindMap, @@ -157,11 +202,21 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return taskClassList, nil } +func (m *Manager) GetState() string { + return m.schedulerState.sm.Current() +} + +func (m *Manager) GetFrameworkID() string { + return m.schedulerState.GetFrameworkID() +} + func (m *Manager) removeInactiveClasses() { - for taskClassIdentifier := range m.classes{ - if len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { - delete(m.classes, taskClassIdentifier) + classMap := m.classes.getMap() + + for taskClassIdentifier := range classMap { + if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + m.classes.deleteKey(taskClassIdentifier) } } @@ -169,15 +224,13 @@ func (m *Manager) removeInactiveClasses() { } func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused - m.mu.Lock() - defer m.mu.Unlock() utils.EnsureTrailingSlash(&repoPath) - for taskClassIdentifier := range m.classes{ + for taskClassIdentifier := range m.classes.getMap() { if strings.HasPrefix(taskClassIdentifier, repoPath) && - len(m.roster.FilteredForClass(taskClassIdentifier)) == 0 { - delete(m.classes, taskClassIdentifier) + len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + m.classes.deleteKey(taskClassIdentifier) } } @@ -185,8 +238,6 @@ func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused } func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { - m.mu.Lock() - defer m.mu.Unlock() m.removeInactiveClasses() @@ -199,18 +250,16 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { for _, class := range taskClassList { taskClassIdentifier := class.Identifier.String() // If it already exists we update, otherwise we add the new class - if _, ok := m.classes[taskClassIdentifier]; ok { - *m.classes[taskClassIdentifier] = *class + if m.classes.contains(taskClassIdentifier) { + m.classes.updateClass(taskClassIdentifier, class) } else { - m.classes[taskClassIdentifier] = class + m.classes.addClass(taskClassIdentifier, class) } } return } -func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { - m.mu.Lock() - defer m.mu.Unlock() +func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { /* Here's what's gonna happen: @@ -248,7 +297,7 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e if taskPtr != nil { if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) - taskClass, classFound := m.classes[descriptor.TaskClassName] + taskClass, classFound := m.classes.getClass(descriptor.TaskClassName) if classFound && taskClass != nil && agentInfo != nil { targetConstraints := descriptor. RoleConstraints.MergeParent(taskClass.Constraints) @@ -261,7 +310,7 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } return } - runningTasksForThisDescriptor := m.roster.Filtered(taskMatches) + runningTasksForThisDescriptor := m.roster.filtered(taskMatches) claimed := false if len(runningTasksForThisDescriptor) > 0 { // We have received a list of running, unlocked candidates to take over @@ -308,7 +357,7 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e <- m.reviveOffersTrg // we only continue when it's done m.tasksToDeploy <- tasksToRun // blocks until received - log.WithField("partition", envId). + log.WithField("environmentId", envId). Debug("scheduler should have received request to deploy") // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static @@ -330,7 +379,7 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // ↑ means all the required processes are now running, and we // are ready to update the envId for taskPtr, descriptor := range deployedTasks { - taskPtr.parent = descriptor.TaskRole + taskPtr.SetParent(descriptor.TaskRole) // Ensure everything is filled out properly if !taskPtr.IsLocked() { log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") @@ -344,7 +393,7 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // unlocked in the roster. var deployedTaskIds []string for taskPtr, _ := range deployedTasks { - taskPtr.parent = nil + taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } err = TasksDeploymentError{taskIds: deployedTaskIds} @@ -352,37 +401,42 @@ func (m *Manager) AcquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // Finally, we write to the roster. Point of no return! for taskPtr, _ := range deployedTasks { - m.roster = append(m.roster, taskPtr) + m.roster.append(taskPtr) } if deploymentSuccess { for taskPtr, _ := range deployedTasks { - taskPtr.parent.SetTask(taskPtr) + taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { - taskPtr.parent = descriptor.TaskRole - taskPtr.parent.SetTask(taskPtr) + taskPtr.SetParent(descriptor.TaskRole) + taskPtr.GetParent().SetTask(taskPtr) } } return } -func (m *Manager) ReleaseTasks(envId uid.ID, tasks Tasks) error { - m.mu.Lock() - defer m.mu.Unlock() +func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { + + taskReleaseErrors := make(map[string]error) + taskIdsReleased := make([]string, 0) for _, task := range tasks { err := m.releaseTask(envId, task) - if err != nil { + if err == nil { + taskIdsReleased = append(taskIdsReleased, task.GetTaskId()) + } else { switch err.(type) { case TaskAlreadyReleasedError: continue default: - return err + taskReleaseErrors[task.GetTaskId()] = err } } } + m.internalEventCh <- event.NewTasksReleasedEvent(envId, taskIdsReleased, taskReleaseErrors) + return nil } @@ -394,29 +448,28 @@ func (m *Manager) releaseTask(envId uid.ID, task *Task) error { return TaskLockedError{taskErrorBase: taskErrorBase{taskId: task.name}, envId: envId} } - task.parent = nil + task.SetParent(nil) return nil } -func (m *Manager) ConfigureTasks(envId uid.ID, tasks Tasks) error { +func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() if err != nil { return err } - m.mu.RLock() // We generate a "bindMap" i.e. a map of the paths of registered inbound channels and their ports bindMap := make(channel.BindMap) for _, task := range tasks { - taskPath := task.parent.GetPath() + taskPath := task.GetParent().GetPath() for inbChName, endpoint := range task.GetLocalBindMap() { bindMap[taskPath + TARGET_SEPARATOR + inbChName] = endpoint.ToTargetEndpoint(task.GetHostname()) } } - log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "partition": envId.String()}). + log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). Debug("generated inbound bindMap for environment configuration") src := STANDBY.String() @@ -425,11 +478,9 @@ func (m *Manager) ConfigureTasks(envId uid.ID, tasks Tasks) error { args := make(controlcommands.PropertyMapsMap) args, err = tasks.BuildPropertyMaps(bindMap) if err != nil { - m.mu.RUnlock() return err } log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") - m.mu.RUnlock() cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) m.cq.Enqueue(cmd, notify) @@ -451,7 +502,7 @@ func (m *Manager) ConfigureTasks(envId uid.ID, tasks Tasks) error { return nil } -func (m *Manager) TransitionTasks(tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { +func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() @@ -530,7 +581,7 @@ func (m *Manager) GetTaskClass(name string) (b *Class) { if m == nil { return } - b = m.classes[name] + b, _ = m.classes.getClass(name) return } @@ -538,21 +589,21 @@ func (m *Manager) TaskCount() int { if m == nil { return -1 } - return len(m.roster) + return len(m.roster.getTasks()) } func (m *Manager) GetTasks() Tasks { if m == nil { return nil } - return m.roster + return m.roster.getTasks() } func (m *Manager) GetTask(id string) *Task { if m == nil { return nil } - for _, t := range m.roster { + for _, t := range m.roster.getTasks() { if t.taskId == id { return t } @@ -560,11 +611,9 @@ func (m *Manager) GetTask(id string) *Task { return nil } -func (m *Manager) UpdateTaskState(taskId string, state string) { - m.mu.RLock() - defer m.mu.RUnlock() +func (m *Manager) updateTaskState(taskId string, state string) { - taskPtr := m.roster.GetByTaskId(taskId) + taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). Warn("attempted state update of task not in roster") @@ -574,17 +623,15 @@ func (m *Manager) UpdateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - if taskPtr.parent != nil { - taskPtr.parent.UpdateState(st) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateState(st) } } -func (m *Manager) UpdateTaskStatus(status *mesos.TaskStatus) { - m.mu.RLock() - defer m.mu.RUnlock() +func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskId := status.GetTaskID().Value - taskPtr := m.roster.GetByTaskId(taskId) + taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") @@ -597,23 +644,21 @@ func (m *Manager) UpdateTaskStatus(status *mesos.TaskStatus) { WithField("name", taskPtr.GetName()). Debug("task running") taskPtr.status = ACTIVE - if taskPtr.parent != nil { - taskPtr.parent.UpdateStatus(ACTIVE) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateStatus(ACTIVE) } case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: taskPtr.status = INACTIVE - if taskPtr.parent != nil { - taskPtr.parent.UpdateStatus(INACTIVE) + if taskPtr.GetParent() != nil { + taskPtr.GetParent().UpdateStatus(INACTIVE) } } } // Kill all tasks outside an environment (all unlocked tasks) func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { - m.mu.Lock() - defer m.mu.Unlock() - toKill := m.roster.Filtered(func(t *Task) bool { + toKill := m.roster.filtered(func(t *Task) bool { return !t.IsLocked() }) @@ -624,10 +669,8 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - m.mu.Lock() - defer m.mu.Unlock() - toKill := m.roster.Filtered(func(t *Task) bool { + toKill := m.roster.filtered(func(t *Task) bool { if t.IsLocked() { return false } @@ -648,6 +691,11 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err return } +func (m *Manager) doKillTask(task *Task) error { + return m.schedulerState.killTask(context.TODO(), task.GetMesosCommandTarget()) +} + + func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err error) { // We assume all tasks are unlocked @@ -656,11 +704,11 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err return task.status != ACTIVE }) // Remove from the roster the tasks which are also in the inactiveTasks list to delete - m.roster = m.roster.Filtered(func(task *Task) bool { + m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !inactiveTasks.Contains(func(t *Task) bool { return t.taskId == task.taskId }) - }) + })) for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { e := m.doKillTask(task) @@ -673,12 +721,112 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err } // Remove from the roster the tasks we've just killed - m.roster = m.roster.Filtered(func(task *Task) bool { + m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !killed.Contains(func(t *Task) bool { return t.taskId == task.taskId }) - }) - running = m.roster + })) + running = m.roster.getTasks() return } + +func (m *Manager) Start(ctx context.Context) { + m.MessageChannel = make(chan *TaskmanMessage, TaskMan_QUEUE) + + m.schedulerState.Start(ctx) + + go func() { + for { + select { + case taskmanMessage, ok := <-m.MessageChannel: + if !ok { // if the channel is closed, we bail + return + } + err := m.handleMessage(taskmanMessage) + if err != nil { + log.Debug(err) + } + } + } + }() +} + +func (m *Manager) stop() { + close(m.MessageChannel) +} + +func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { + if m == nil { + return errors.New("manager is nil") + } + + messageType := tm.GetMessageType() + + switch messageType{ + case taskop.AcquireTasks: + go m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) + case taskop.ConfigureTasks: + go m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + case taskop.TransitionTasks: + go m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + case taskop.TaskStatusMessage: + mesosStatus := tm.status + mesosState := mesosStatus.GetState() + switch mesosState { + case mesos.TASK_FINISHED: + m.tasksFinished++ + case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + log.WithPrefix("taskman"). + WithFields(logrus.Fields{ + "taskId": mesosStatus.GetTaskID().Value, + "state": mesosState.String(), + "reason": mesosStatus.GetReason().String(), + "source": mesosStatus.GetSource().String(), + "message": mesosStatus.GetMessage(), + }). + Info("task inactive exception") + taskIDValue := mesosStatus.GetTaskID().Value + t := m.GetTask(taskIDValue) + if t != nil && t.IsLocked() { + go m.updateTaskState(taskIDValue, "ERROR") + } + } + + // This will check if the task update is from a reconciliation, as well as whether the task + // is in a state in which a mesos Kill call is possible. + // Reconcilation tasks are not part of the taskman.roster + if mesosStatus.GetReason().String() == "REASON_RECONCILIATION" && + (mesosState == mesos.TASK_STAGING || + mesosState == mesos.TASK_STARTING || + mesosState == mesos.TASK_RUNNING || + mesosState == mesos.TASK_KILLING || + mesosState == mesos.TASK_UNKNOWN) { + killCall := calls.Kill(mesosStatus.TaskID.GetValue(), mesosStatus.AgentID.GetValue()) + calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + } else { + // Enqueue task state update + go m.updateTaskStatus(&mesosStatus) + } + case taskop.TaskStateMessage: + go m.updateTaskState(tm.taskId, tm.state) + // case event.KillTasks: + // m.killTasks(tm.GetTaskIds()) + case taskop.ReleaseTasks: + go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + } + + + return nil +} + +// This function should only be called from the SIGINT/SIGTERM handler +func (m *Manager) EmergencyKillTasks(tasks Tasks) { + for _, t := range tasks { + killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) + err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + if err != nil { + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) + } + } +} \ No newline at end of file diff --git a/core/task/managerV2.go b/core/task/managerV2.go deleted file mode 100644 index 56efac739..000000000 --- a/core/task/managerV2.go +++ /dev/null @@ -1,791 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - - -// This a draft refactor of manager.go with goal to achieve event-driven -// architecture. - -package task - -import ( - "context" - "errors" - "fmt" - "strings" - - "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/common/gera" - pb "github.com/AliceO2Group/Control/core/protos" - "github.com/AliceO2Group/Control/core/task/taskop" - "github.com/AliceO2Group/Control/core/the" - "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/mesos/mesos-go/api/v1/lib/extras/store" - - "github.com/AliceO2Group/Control/common/utils" - - "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/core/task/channel" - "github.com/k0kubun/pp" - "github.com/mesos/mesos-go/api/v1/lib" - "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" - "github.com/sirupsen/logrus" -) - -const TaskMan_QUEUE = 1024 - - -type ManagerV2 struct { - ctx context.Context - fidStore store.Singleton - AgentCache AgentCache - MessageChannel chan *TaskmanMessage - - classes *classes - roster *roster - - resourceOffersDone <-chan DeploymentMap - tasksToDeploy chan<- Descriptors - reviveOffersTrg chan struct{} - cq *controlcommands.CommandQueue - - tasksLaunched int - tasksFinished int - - schedulerState *schedulerState - publicEventCh chan<- *pb.Event - internalEventCh chan<- event.Event -} - -func NewManagerV2(shutdown func(), - publicEventCh chan<- *pb.Event, - internalEventCh chan<- event.Event) (taskman *ManagerV2, err error) { - // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should - // probably tolerate X number of subsequent subscribe failures before bailing. we'll need - // to track the lastCallAttempted along with subsequentSubscribeTimeouts. - - // store.Singleton is a thread-safe abstraction to load and store and string, - // provided by mesos-go. - // We also make sure that a log message is printed with the FrameworkID. - fidStore := store.DecorateSingleton( - store.NewInMemorySingleton(), - store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { - // Store Mesos Framework ID to configuration. - err = the.ConfSvc().NewMesosFID(v) - if err != nil { - log.WithField("error", err).Error("cannot write to configuration") - } - log.WithField("frameworkId", v).Debug("frameworkId") - return nil - })) - - // Set Framework ID from the configuration - if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { - store.SetOrPanic(fidStore)(fidValue) - } - - taskman = &ManagerV2{ - classes: newClasses(), - roster: newRoster(), - publicEventCh: publicEventCh, - internalEventCh: internalEventCh, - } - schedulerState, err := NewScheduler(taskman, fidStore, shutdown) - if err != nil { - return nil, err - } - taskman.schedulerState = schedulerState - taskman.cq = taskman.schedulerState.commandqueue // FIXME remove - taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone - taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy - taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - - schedulerState.setupCli() - - return -} - -func (m *ManagerV2) GetState() string { - return m.schedulerState.sm.Current() -} - -func (m *ManagerV2) GetFrameworkID() string { - return m.schedulerState.GetFrameworkID() -} - - -// NewTaskForMesosOffer accepts a Mesos offer and a Descriptor and returns a newly -// constructed Task. -// This function should only be called by the Mesos scheduler controller when -// matching role requests with offers (matchRoles). -func (m *ManagerV2) newTaskForMesosOffer( - offer *mesos.Offer, - descriptor *Descriptor, - localBindMap channel.BindMap, - executorId mesos.ExecutorID) (t *Task) { - newId := uid.New().String() - t = &Task{ - name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), - parent: descriptor.TaskRole, - className: descriptor.TaskClassName, - hostname: offer.Hostname, - agentId: offer.AgentID.Value, - offerId: offer.ID.Value, - taskId: newId, - properties: gera.MakeStringMap().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), - executorId: executorId.Value, - GetTaskClass: nil, - localBindMap: nil, - state: STANDBY, - status: INACTIVE, - } - t.GetTaskClass = func() *Class { - return m.GetTaskClass(t.className) - } - t.localBindMap = make(channel.BindMap) - for k, v := range localBindMap { - t.localBindMap[k] = v - } - return -} - -func (m *ManagerV2) removeInactiveClasses() { - - classMap := m.classes.getMap() - - for taskClassIdentifier := range classMap { - if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { - m.classes.deleteKey(taskClassIdentifier) - } - } - - return -} - -func (m *ManagerV2) RemoveReposClasses(repoPath string) { //Currently unused - - utils.EnsureTrailingSlash(&repoPath) - - for taskClassIdentifier := range m.classes.getMap() { - if strings.HasPrefix(taskClassIdentifier, repoPath) && - len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { - m.classes.deleteKey(taskClassIdentifier) - } - } - - return -} - -func (m *ManagerV2) RefreshClasses(taskClassesRequired []string) (err error) { - - m.removeInactiveClasses() - - var taskClassList []*Class - taskClassList, err = getTaskClassList(taskClassesRequired) - if err != nil { - return err - } - - for _, class := range taskClassList { - taskClassIdentifier := class.Identifier.String() - // If it already exists we update, otherwise we add the new class - if m.classes.contains(taskClassIdentifier) { - m.classes.updateClass(taskClassIdentifier, class) - } else { - m.classes.addClass(taskClassIdentifier, class) - } - } - return -} - -func (m *ManagerV2) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { - - /* - Here's what's gonna happen: - 1) check if any tasks are already in Roster, whether they are already locked - in an environment, and whether their host has attributes that satisfy the - constraints - 1a) TODO: for each of them in Roster with matching attributes but wrong class, - mark for teardown and mesos-deployment - 1b) for each of them in Roster with matching attributes and class, mark for - takeover and reconfiguration - 3) TODO: teardown the tasks in tasksToTeardown - 4) start the tasks in tasksToRun - 5) ensure that all of them reach a CONFIGURED state - */ - - tasksToRun := make(Descriptors, 0) - // TODO: also filter for tasks that satisfy attributes but are of wrong class, - // to be torn down and mesosed. - // tasksToTeardown := make([]TaskPtr, 0) - tasksAlreadyRunning := make(DeploymentMap) - for _, descriptor := range taskDescriptors { - /* - For each descriptor we check m.AgentCache for agent attributes: - this allows us for each idle task in roster, get agentid and plug it in cache to get the - attributes for that host, and then we know whether - 1) a running task of the same class on that agent would qualify - 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify - */ - - // Filter function that accepts a Task if - // a) it's !Locked - // b) has className matching Descriptor - // c) its Agent's Attributes satisfy the Descriptor's Constraints - taskMatches := func(taskPtr *Task) (ok bool) { - if taskPtr != nil { - if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { - agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) - taskClass, classFound := m.classes.getClass(descriptor.TaskClassName) - if classFound && taskClass != nil && agentInfo != nil { - targetConstraints := descriptor. - RoleConstraints.MergeParent(taskClass.Constraints) - if agentInfo.Attributes.Satisfy(targetConstraints) { - ok = true - return - } - } - } - } - return - } - runningTasksForThisDescriptor := m.roster.filtered(taskMatches) - claimed := false - if len(runningTasksForThisDescriptor) > 0 { - // We have received a list of running, unlocked candidates to take over - // the current Descriptor. - // We now go through them, and if one of them is already claimed in - // tasksAlreadyRunning, we go to the next one until we exhaust our options. - for _, taskPtr := range runningTasksForThisDescriptor { - if _, ok := tasksAlreadyRunning[taskPtr]; ok { - continue - } else { // task not claimed yet, we do so now - tasksAlreadyRunning[taskPtr] = descriptor - claimed = true - break - } - } - } - - if !claimed { - tasksToRun = append(tasksToRun, descriptor) - } - } - - // TODO: fill out tasksToTeardown in the previous loop - //if len(tasksToTeardown) > 0 { - // err = m.TeardownTasks(tasksToTeardown) - // if err != nil { - // return errors.New(fmt.Sprintf("cannot restart roles: %s", err.Error())) - // } - //} - - // At this point, all descriptors are either - // - matched to a TaskPtr in tasksAlreadyRunning - // - awaiting Task deployment in tasksToRun - deploymentSuccess := true // hopefully - - deployedTasks := make(DeploymentMap) - if len(tasksToRun) > 0 { - // Alright, so we have some descriptors whose requirements should be met with - // new Tasks we're about to deploy here. - // First we ask Mesos to revive offers and block until done, then upon receiving - // the offers, we ask Mesos to run the required roles - if any. - - m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers - <- m.reviveOffersTrg // we only continue when it's done - - m.tasksToDeploy <- tasksToRun // blocks until received - log.WithField("environmentId", envId). - Debug("scheduler should have received request to deploy") - - // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static - // reservation for that mesos-role on behalf of our scheduler - - deployedTasks = <- m.resourceOffersDone - log.WithField("tasks", deployedTasks). - Debug("resourceOffers is done, new tasks running") - - if len(deployedTasks) != len(tasksToRun) { - // ↑ Not all roles could be deployed. We cannot proceed - // with running this environment, but we keep the roles - // running since they might be useful in the future. - deploymentSuccess = false - } - } - - if deploymentSuccess { - // ↑ means all the required processes are now running, and we - // are ready to update the envId - for taskPtr, descriptor := range deployedTasks { - taskPtr.SetParent(descriptor.TaskRole) - // Ensure everything is filled out properly - if !taskPtr.IsLocked() { - log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") - deploymentSuccess = false - } - } - } - if !deploymentSuccess { - // While all the required roles are running, for some reason we - // can't lock some of them, so we must roll back and keep them - // unlocked in the roster. - var deployedTaskIds []string - for taskPtr, _ := range deployedTasks { - taskPtr.SetParent(nil) - deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) - } - err = TasksDeploymentError{taskIds: deployedTaskIds} - } - - // Finally, we write to the roster. Point of no return! - for taskPtr, _ := range deployedTasks { - m.roster.append(taskPtr) - } - if deploymentSuccess { - for taskPtr, _ := range deployedTasks { - taskPtr.GetParent().SetTask(taskPtr) - } - for taskPtr, descriptor := range tasksAlreadyRunning { - taskPtr.SetParent(descriptor.TaskRole) - taskPtr.GetParent().SetTask(taskPtr) - } - } - - return -} - -func (m *ManagerV2) releaseTasks(envId uid.ID, tasks Tasks) error { - - taskReleaseErrors := make(map[string]error) - taskIdsReleased := make([]string, 0) - - for _, task := range tasks { - err := m.releaseTask(envId, task) - if err == nil { - taskIdsReleased = append(taskIdsReleased, task.GetTaskId()) - } else { - switch err.(type) { - case TaskAlreadyReleasedError: - continue - default: - taskReleaseErrors[task.GetTaskId()] = err - } - } - } - - m.internalEventCh <- event.NewTasksReleasedEvent(envId, taskIdsReleased, taskReleaseErrors) - - return nil -} - -func (m *ManagerV2) releaseTask(envId uid.ID, task *Task) error { - if task == nil { - return TaskNotFoundError{} - } - if task.IsLocked() && task.GetEnvironmentId() != envId { - return TaskLockedError{taskErrorBase: taskErrorBase{taskId: task.name}, envId: envId} - } - - task.SetParent(nil) - - return nil -} - -func (m *ManagerV2) configureTasks(envId uid.ID, tasks Tasks) error { - notify := make(chan controlcommands.MesosCommandResponse) - receivers, err := tasks.GetMesosCommandTargets() - if err != nil { - return err - } - - // We generate a "bindMap" i.e. a map of the paths of registered inbound channels and their ports - bindMap := make(channel.BindMap) - for _, task := range tasks { - taskPath := task.GetParent().GetPath() - for inbChName, endpoint := range task.GetLocalBindMap() { - bindMap[taskPath + TARGET_SEPARATOR + inbChName] = - endpoint.ToTargetEndpoint(task.GetHostname()) - } - } - log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). - Debug("generated inbound bindMap for environment configuration") - - src := STANDBY.String() - event := "CONFIGURE" - dest := CONFIGURED.String() - args := make(controlcommands.PropertyMapsMap) - args, err = tasks.BuildPropertyMaps(bindMap) - if err != nil { - return err - } - log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") - - cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) - m.cq.Enqueue(cmd, notify) - - response := <- notify - close(notify) - - if response == nil { - return errors.New("nil response") - } - - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) - } - - // FIXME: improve error handling ↑ - - return nil -} - -func (m *ManagerV2) transitionTasks(tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { - notify := make(chan controlcommands.MesosCommandResponse) - receivers, err := tasks.GetMesosCommandTargets() - - if err != nil { - return err - } - - args := make(controlcommands.PropertyMapsMap) - - // If we're pushing some arg values to all targets... - if len(commonArgs) > 0 { - for _, rec := range receivers { - args[rec] = make(controlcommands.PropertyMap) - for k, v := range commonArgs { - args[rec][k] = v - } - } - } - - cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) - m.cq.Enqueue(cmd, notify) - - response := <- notify - close(notify) - - if response == nil { - return errors.New("unknown MesosCommand error: nil response received") - } - - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) - } - - // FIXME: improve error handling ↑ - - return nil -} - -func (m *ManagerV2) TriggerHooks(tasks Tasks) error { - if len(tasks) == 0 { - return nil - } - - notify := make(chan controlcommands.MesosCommandResponse) - receivers, err := tasks.GetMesosCommandTargets() - - if err != nil { - return err - } - - cmd := controlcommands.NewMesosCommand_TriggerHook(receivers) - err = m.cq.Enqueue(cmd, notify) - if err != nil { - return err - } - - response := <- notify - close(notify) - - if response == nil { - return errors.New("unknown MesosCommand error: nil response received") - } - - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) - } - - // FIXME: improve error handling ↑ - - return nil -} - -func (m *ManagerV2) GetTaskClass(name string) (b *Class) { - if m == nil { - return - } - b, _ = m.classes.getClass(name) - return -} - -func (m *ManagerV2) TaskCount() int { - if m == nil { - return -1 - } - return len(m.roster.getTasks()) -} - -func (m *ManagerV2) GetTasks() Tasks { - if m == nil { - return nil - } - return m.roster.getTasks() -} - -func (m *ManagerV2) GetTask(id string) *Task { - if m == nil { - return nil - } - for _, t := range m.roster.getTasks() { - if t.taskId == id { - return t - } - } - return nil -} - -func (m *ManagerV2) updateTaskState(taskId string, state string) { - - taskPtr := m.roster.getByTaskId(taskId) - if taskPtr == nil { - log.WithField("taskId", taskId). - Warn("attempted state update of task not in roster") - return - } - - st := StateFromString(state) - taskPtr.state = st - taskPtr.safeToStop = false - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateState(st) - } -} - -func (m *ManagerV2) updateTaskStatus(status *mesos.TaskStatus) { - - taskId := status.GetTaskID().Value - taskPtr := m.roster.getByTaskId(taskId) - if taskPtr == nil { - log.WithField("taskId", taskId). - Warn("attempted status update of task not in roster") - return - } - - switch st := status.GetState(); st { - case mesos.TASK_RUNNING: - log.WithField("taskId", taskId). - WithField("name", taskPtr.GetName()). - Debug("task running") - taskPtr.status = ACTIVE - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateStatus(ACTIVE) - } - case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: - taskPtr.status = INACTIVE - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateStatus(INACTIVE) - } - } -} - -// Kill all tasks outside an environment (all unlocked tasks) -func (m *ManagerV2) Cleanup() (killed Tasks, running Tasks, err error) { - - toKill := m.roster.filtered(func(t *Task) bool { - return !t.IsLocked() - }) - - killed, running, err = m.doKillTasks(toKill) - return -} - -// Kill a specific list of tasks. -// If the task list includes locked tasks, TaskNotFoundError is returned. -func (m *ManagerV2) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - - toKill := m.roster.filtered(func(t *Task) bool { - if t.IsLocked() { - return false - } - for _, id := range taskIds { - if t.taskId == id { - return true - } - } - return false - }) - - if len(toKill) < len(taskIds) { - err = TaskNotFoundError{} - return - } - - killed, running, err = m.doKillTasks(toKill) - return -} - -func (m *ManagerV2) doKillTask(task *Task) error { - return m.schedulerState.killTask(context.TODO(), task.GetMesosCommandTarget()) -} - - -func (m *ManagerV2) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err error) { - // We assume all tasks are unlocked - - // Build slice of tasks with status !ACTIVE - inactiveTasks := tasks.Filtered(func(task *Task) bool { - return task.status != ACTIVE - }) - // Remove from the roster the tasks which are also in the inactiveTasks list to delete - m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { - return !inactiveTasks.Contains(func(t *Task) bool { - return t.taskId == task.taskId - }) - })) - - for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { - e := m.doKillTask(task) - if e != nil { - log.WithError(e).WithField("taskId", task.taskId).Error("could not kill task") - err = errors.New("could not kill some tasks") - } else { - killed = append(killed, task) - } - } - - // Remove from the roster the tasks we've just killed - m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { - return !killed.Contains(func(t *Task) bool { - return t.taskId == task.taskId - }) - })) - running = m.roster.getTasks() - - return -} - -func (m *ManagerV2) Start(ctx context.Context) { - m.MessageChannel = make(chan *TaskmanMessage, TaskMan_QUEUE) - - m.schedulerState.Start(ctx) - - go func() { - for { - select { - case taskmanMessage, ok := <-m.MessageChannel: - if !ok { // if the channel is closed, we bail - return - } - err := m.handleMessage(taskmanMessage) - if err != nil { - log.Debug(err) - } - } - } - }() -} - -func (m *ManagerV2) stop() { - close(m.MessageChannel) -} - -func (m *ManagerV2) handleMessage(tm *TaskmanMessage) (error) { - if m == nil { - return errors.New("manager is nil") - } - - messageType := tm.GetMessageType() - - switch messageType{ - case taskop.AcquireTasks: - go m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) - case taskop.ConfigureTasks: - go m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) - case taskop.TransitionTasks: - go m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) - case taskop.TaskStatusMessage: - mesosStatus := tm.status - mesosState := mesosStatus.GetState() - switch mesosState { - case mesos.TASK_FINISHED: - m.tasksFinished++ - case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: - log.WithPrefix("taskman"). - WithFields(logrus.Fields{ - "taskId": mesosStatus.GetTaskID().Value, - "state": mesosState.String(), - "reason": mesosStatus.GetReason().String(), - "source": mesosStatus.GetSource().String(), - "message": mesosStatus.GetMessage(), - }). - Info("task inactive exception") - taskIDValue := mesosStatus.GetTaskID().Value - t := m.GetTask(taskIDValue) - if t != nil && t.IsLocked() { - go m.updateTaskState(taskIDValue, "ERROR") - } - } - - // This will check if the task update is from a reconciliation, as well as whether the task - // is in a state in which a mesos Kill call is possible. - // Reconcilation tasks are not part of the taskman.roster - if mesosStatus.GetReason().String() == "REASON_RECONCILIATION" && - (mesosState == mesos.TASK_STAGING || - mesosState == mesos.TASK_STARTING || - mesosState == mesos.TASK_RUNNING || - mesosState == mesos.TASK_KILLING || - mesosState == mesos.TASK_UNKNOWN) { - killCall := calls.Kill(mesosStatus.TaskID.GetValue(), mesosStatus.AgentID.GetValue()) - calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) - } else { - // Enqueue task state update - go m.updateTaskStatus(&mesosStatus) - } - case taskop.TaskStateMessage: - go m.updateTaskState(tm.taskId, tm.state) - // case event.KillTasks: - // m.killTasks(tm.GetTaskIds()) - case taskop.ReleaseTasks: - go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) - } - - - return nil -} - -// This function should only be called from the SIGINT/SIGTERM handler -func (m *ManagerV2) EmergencyKillTasks(tasks Tasks) { - for _, t := range tasks { - killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) - err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) - if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) - } - } -} \ No newline at end of file diff --git a/core/task/match.go b/core/task/match.go index 1a93a04ea..03b69a904 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -38,7 +38,7 @@ type Wants struct { InboundChannels []channel.Inbound } -func (m *ManagerV2) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { +func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { taskClass, ok := m.classes.getClass(descriptor.TaskClassName) if ok && taskClass != nil { r = &Wants{} @@ -93,7 +93,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { return true } -func (m *ManagerV2) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { +func (m *Manager) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { cm = make(map[*Descriptor]constraint.Constraints) for _, descriptor := range descriptors { taskClass, ok := m.classes.getClass(descriptor.TaskClassName) diff --git a/core/task/roster.go b/core/task/roster.go index 14d5c2eb5..301dee222 100644 --- a/core/task/roster.go +++ b/core/task/roster.go @@ -58,6 +58,9 @@ func (m *roster) contains(filter Filter) (has bool) { } func (m *roster) filteredForClass(className string) (tasks Tasks) { + m.mu.RLock() + defer m.mu.RUnlock() + return m.tasks.FilteredForClass(className) } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 1d433332d..667f4508b 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -77,12 +77,12 @@ type schedulerState struct { // uses locks, so thread safe servent *controlcommands.Servent commandqueue *controlcommands.CommandQueue - taskman *ManagerV2 + taskman *Manager } -func NewScheduler(taskman *ManagerV2, fidStore store.Singleton, shutdown func()) (*schedulerState, error) { +func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) (*schedulerState, error) { metricsAPI := initMetrics() executorInfo, err := schedutil.PrepareExecutorInfo( viper.GetString("executor"), @@ -212,4 +212,3 @@ func (state *schedulerState) Start(ctx context.Context) { } }() } - diff --git a/core/task/task.go b/core/task/task.go index 12abe1c5b..6488ed2a1 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -561,4 +561,14 @@ func (t *Task) SetParent(parent parentRole) { defer t.mu.Unlock() t.parent = parent +} + +func (t *Task) GetTask() *Task { + if t == nil { + return nil + } + t.mu.RLock() + defer t.mu.RUnlock() + + return t } \ No newline at end of file diff --git a/core/workflow/load.go b/core/workflow/load.go index 9a4b2f1da..acab68f96 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -40,7 +40,7 @@ import ( ) // FIXME: workflowPath should be of type configuration.Path, not string -func Load(workflowPath string, parent Updatable, taskManager *task.ManagerV2, userProperties map[string]string) (workflow Role, err error) { +func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var resolvedWorkflowPath string diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index f9167d41d..1b7683cec 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -250,7 +250,7 @@ func (t *taskRole) GetTask() *task.Task { if t == nil { return nil } - return t.Task + return t.Task.GetTask() } func (t* taskRole) GetTaskClass() string { From f3c658851e00665de06d456e924322cfb34e341c Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 4 Nov 2020 12:17:04 +0100 Subject: [PATCH 0561/2352] [core] Force shutdown reply when all processes are gone --- core/task/manager.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index eefa58218..baac1dcff 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -80,6 +80,7 @@ type Manager struct { schedulerState *schedulerState publicEventCh chan<- *pb.Event internalEventCh chan<- event.Event + ackKilledTasks map[string]chan struct{} } func NewManager(shutdown func(), @@ -124,6 +125,7 @@ func NewManager(shutdown func(), taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg + taskman.ackKilledTasks = make(map[string]chan struct{}) schedulerState.setupCli() @@ -635,6 +637,11 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if taskPtr == nil { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") + + if val, ok := m.ackKilledTasks[taskId]; ok { + val <- struct{}{} + } + return } @@ -687,7 +694,16 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err return } + for _, id := range toKill.GetTaskIds() { + m.ackKilledTasks[id] = make(chan struct{}) + } + killed, running, err = m.doKillTasks(toKill) + for _, id := range killed.GetTaskIds() { + <- m.ackKilledTasks[id] + close(m.ackKilledTasks[id]) + delete(m.ackKilledTasks, id) + } return } From 94da0f490cdfcdac56ba80f620a5e88e6198a0e2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Nov 2020 12:29:49 +0100 Subject: [PATCH 0562/2352] [core] Make log output more relevant --- core/task/scheduler.go | 44 +++++++++++++++++++++++++++++--- core/workflow/template/fields.go | 42 ++++++++++++++++-------------- 2 files changed, 64 insertions(+), 22 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 9579ea4ad..47f8d16bd 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -730,7 +730,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "taskId": newTaskId, "offerId": offer.ID.Value, "executorId": state.executor.ExecutorID.Value, - "task": mesosTaskInfo, + "command": mesosTaskInfo.Command.GetValue(), + "arguments": mesosTaskInfo.Command.GetArguments(), + "shenv": mesosTaskInfo.Command.GetEnvironment().String(), + "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") select { case state.taskman.publicEventCh <- cpb.NewEventTaskLaunch(newTaskId): @@ -945,8 +948,43 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom // the config is verbose. func logAllEvents() eventrules.Rule { return func(ctx context.Context, e *scheduler.Event, err error, ch eventrules.Chain) (context.Context, *scheduler.Event, error) { - log.WithPrefix("scheduler").WithField("event", fmt.Sprintf("%+v", *e)). - Trace("incoming event") + fields := logrus.Fields{ + "type": e.GetType().String(), + } + switch e.GetType() { + case scheduler.Event_MESSAGE: + fields["agentId"] = e.GetMessage().GetAgentID() + fields["executorId"] = e.GetMessage().GetExecutorID() + case scheduler.Event_UPDATE: + status := e.GetUpdate().GetStatus() + fields["agentId"] = status.GetAgentID().String() + fields["executorId"] = status.GetExecutorID().String() + fields["taskId"] = status.GetTaskID().Value + fields["taskStatus"] = status.GetState().String() + case scheduler.Event_OFFERS: + off := e.GetOffers().Offers + if len(off) > 0 { + fields["agentId"] = off[0].GetAgentID() + fields["hostname"] = off[0].GetHostname() + exids := off[0].GetExecutorIDs() + if len(exids) > 0 { + fields["executorId"] = exids[0].GetValue() + } + } + offerIds := make([]string, len(off)) + for _, v := range off { + offerIds = append(offerIds, v.GetID().Value) + } + fields["offerIds"] = strings.Join(offerIds, ",") + case scheduler.Event_SUBSCRIBED: + fields["frameworkId"] = e.GetSubscribed().GetFrameworkID().Value + fields["heartbeatInterval"] = fmt.Sprintf("%f", e.GetSubscribed().GetHeartbeatIntervalSeconds()) + case scheduler.Event_HEARTBEAT: + default: + fields["raw"] = fmt.Sprintf("%+v", *e) + } + log.WithPrefix("scheduler"). + WithFields(fields).Trace("incoming event") return ch(ctx, e, err) } } diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index db5bf4a0a..54c99152d 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -40,6 +40,8 @@ import ( "github.com/valyala/fasttemplate" ) +const DEBUG_TEMPLATE_SYSTEM=false + var log = logger.New(logrus.StandardLogger(),"template") type Sequence map[Stage]Fields @@ -58,18 +60,19 @@ func (sf Sequence) Execute(parentPath string, varStack VarStack, buildObjectStac objectStack := buildObjectStack(currentStage) if fields, ok := sf[currentStage]; ok { - log.WithFields(logrus.Fields{ - "path": parentPath, - "stage": currentStage, - "fields": func() string { - accumulator := make([]string, len(fields)) - for i, v := range fields { - accumulator[i] = v.Get() - } - return strings.Join(accumulator, ", ") - }(), - }).Trace("about to process fields for stage") - + if DEBUG_TEMPLATE_SYSTEM { + log.WithFields(logrus.Fields{ + "path": parentPath, + "stage": currentStage, + "fields": func() string { + accumulator := make([]string, len(fields)) + for i, v := range fields { + accumulator[i] = v.Get() + } + return strings.Join(accumulator, ", ") + }(), + }).Trace("about to process fields for stage") + } err = fields.Execute(parentPath, stagedStack, objectStack, stringTemplateCache) if err != nil { log.WithError(err).Errorf("template processing error") @@ -229,13 +232,14 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS return w.Write([]byte(fmt.Sprintf("%v", rawOutput))) } }) - log.WithFields(logrus.Fields{ - "path": parentPath, - "fieldBefore": field.Get(), - "fieldAfter": buf.String(), - "error": err, - }).Trace("processed field for stage") - + if DEBUG_TEMPLATE_SYSTEM { + log.WithFields(logrus.Fields{ + "path": parentPath, + "fieldBefore": field.Get(), + "fieldAfter": buf.String(), + "error": err, + }).Trace("processed field for stage") + } if err != nil { log.WithError(err).WithField("role", parentPath).Warn("template processing error (bad variable or workflow file)") return From 6fd3381e3d448d6dde4dcbbe66ca2d23ecae2aec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Nov 2020 12:29:49 +0100 Subject: [PATCH 0563/2352] [core] Make log output more relevant --- core/task/scheduler.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 47f8d16bd..07de96063 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -953,18 +953,18 @@ func logAllEvents() eventrules.Rule { } switch e.GetType() { case scheduler.Event_MESSAGE: - fields["agentId"] = e.GetMessage().GetAgentID() - fields["executorId"] = e.GetMessage().GetExecutorID() + fields["agentId"] = e.GetMessage().GetAgentID().Value + fields["executorId"] = e.GetMessage().GetExecutorID().Value case scheduler.Event_UPDATE: status := e.GetUpdate().GetStatus() - fields["agentId"] = status.GetAgentID().String() - fields["executorId"] = status.GetExecutorID().String() + fields["agentId"] = status.GetAgentID().GetValue() + fields["executorId"] = status.GetExecutorID().GetValue() fields["taskId"] = status.GetTaskID().Value fields["taskStatus"] = status.GetState().String() case scheduler.Event_OFFERS: off := e.GetOffers().Offers if len(off) > 0 { - fields["agentId"] = off[0].GetAgentID() + fields["agentId"] = off[0].GetAgentID().Value fields["hostname"] = off[0].GetHostname() exids := off[0].GetExecutorIDs() if len(exids) > 0 { @@ -972,8 +972,8 @@ func logAllEvents() eventrules.Rule { } } offerIds := make([]string, len(off)) - for _, v := range off { - offerIds = append(offerIds, v.GetID().Value) + for i, _ := range off { + offerIds[i] = off[i].GetID().Value } fields["offerIds"] = strings.Join(offerIds, ",") case scheduler.Event_SUBSCRIBED: From c1bdbe954708980c7588493a3b09e0c88042715b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Nov 2020 16:26:11 +0100 Subject: [PATCH 0564/2352] Revert "[executor] Send TASK_FAILED status more preemptively" This reverts commit c36c6401a5b4c20abfda658e35fcc4a39dc3ff8f. --- executor/handlers.go | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/executor/handlers.go b/executor/handlers.go index 2e4af9a31..ab4c2cf50 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -139,9 +139,6 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "error": err.Error(), }). Error("no task for incoming MESSAGE") - st := newStatus(state, taskId) - *st.State = mesos.TASK_FAILED - _ = update(state, st) return } @@ -210,10 +207,6 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "error": err.Error(), }). Error("no task for incoming MESSAGE") - st := newStatus(state, taskId) - mesosState := mesos.TASK_FAILED - st.State = &mesosState - _ = update(state, st) return } @@ -288,10 +281,6 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { log.Trace("task launching") } else { log.Error("task launch failed") - st := newStatus(state, taskInfo.TaskID) - mesosState := mesos.TASK_FAILED - st.State = &mesosState - _ = update(state, st) } } From 45081df0f6a7a25b064344aa542446712de310a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Nov 2020 17:00:43 +0100 Subject: [PATCH 0565/2352] [misc] New benchmark script --- hacking/test.sh | 119 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100755 hacking/test.sh diff --git a/hacking/test.sh b/hacking/test.sh new file mode 100755 index 000000000..eb31276d4 --- /dev/null +++ b/hacking/test.sh @@ -0,0 +1,119 @@ +#!/bin/zsh + +# === This file is part of ALICE O² === +# +# Copyright 2020 CERN and copyright holders of ALICE O². +# Author: Teo Mrnjavac +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# In applying this license CERN does not waive the privileges and +# immunities granted to it by virtue of its status as an +# Intergovernmental Organization or submit itself to any jurisdiction. + + +# Usage example for 200 iterations: +# ./test.sh 200 +# The test may take up to 20s per iteration. + + +# Configuration +ENVCREATE_FILE="envcreate.csv" +ENVSTART_FILE="envstart.csv" + +STARTTIME=$(date +%s.%N) # reset script timer +TIMEFMT=$'total time: %*E' # make zsh function time only output the total time + +# CSV append function (really only appends a line for now) +function csv_append() { + echo "$2" >> $1 +} + +# If the number of iterations is not passed as argument, we default to 1 +if [ -z ${1+x} ]; then ITERATIONS=1; else ITERATIONS=$1; fi + +# Prepare create command... +read -r -d '' CMD_CREATE << EOM +coconut e c -w readout-dataflow@flp-suite-v0.11.0 -e '{"hosts":["centosvmtest0"],"dd_enabled":"true","qcdd_enabled":"true"}' +EOM + +# Zero the output files +truncate -s 0 $ENVCREATE_FILE +truncate -s 0 $ENVSTART_FILE + + +# Main loop starts here +echo "iter\tenv \tcreate\tstart" +for ((iter=0; iter<$ITERATIONS; iter++)); do + + +### TEST CODE ### UNCOMMENT FROM HERE ### +# read -r -d '' OUTPUT << EOM +# new environment created with 8 tasks +# environment id: 2MFXZxnvRCj +# state: CONFIGURED +# root role: readout-dataflow +# EOM +# read -r -d '' CMD_CREATE << EOM +# echo "$OUTPUT" +# EOM +### END TEST CODE + + OUTPUT=$({time (eval $CMD_CREATE)} 2>&1) + + # sleep 1 + ENV=`echo $OUTPUT|grep "environment id"|awk '{ print $3}'` + CREATE_TIME=`echo $OUTPUT|grep "total time:"|awk '{ print $3}'` + + # Append measured time to file + csv_append $ENVCREATE_FILE $CREATE_TIME + + CMD_START="coconut e t -e start $ENV" + +### TEST CODE ### UNCOMMENT FROM HERE ### +# read -r -d '' OUTPUT << EOM +# transition complete +# environment id: 2MFXZxnvRCj +# state: RUNNING +# run number: 154 +# EOM +# read -r -d '' CMD_START << EOM +# echo "$OUTPUT" +# EOM +### END TEST CODE + + OUTPUT=$({time (eval $CMD_START)} 2>&1) + # sleep 1 + START_TIME=`echo $OUTPUT|grep "total time:"|awk '{ print $3}'` + + # Append measured time to file + csv_append $ENVSTART_FILE $START_TIME + + coconut e d -f $ENV > /dev/null 2>&1 + # sleep 1 + ssh root@centosvmtest0 rm -rf "/dev/shm/*" + + echo "${(l:3::0:)iter}\t$ENV\t$CREATE_TIME\t$START_TIME" +done + +ENDTIME=$(date +%s.%N) +dt=$(echo "$ENDTIME - $STARTTIME" | bc) +dd=$(echo "$dt/86400" | bc) +dt2=$(echo "$dt-86400*$dd" | bc) +dh=$(echo "$dt2/3600" | bc) +dt3=$(echo "$dt2-3600*$dh" | bc) +dm=$(echo "$dt3/60" | bc) +ds=$(echo "$dt3-60*$dm" | bc) + +LC_NUMERIC=C printf "${(l:3::0:)ITERATIONS} iterations done in %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds \ No newline at end of file From 6c98d3ecbc9967c1a53ca217d781e2e2cf070626 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Nov 2020 12:40:34 +0100 Subject: [PATCH 0566/2352] [core] Only append --control-port parameter to FairMQ tasks --- core/task/scheduler.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 07de96063..872a5e92f 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -614,11 +614,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // For the control port parameter and/or environment variable, see occ/OccGlobals.h if cmd.ControlMode != controlmode.BASIC && cmd.ControlMode != controlmode.HOOK { - cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) cmd.ControlPort = controlPort cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) } + if cmd.ControlMode == controlmode.FAIRMQ { + cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) + } + // Convenience function that scans through cmd.Env and appends the // given key-value pair if the given variable isn't already // provided by the user. From 1c56cb94b45e318ff8e1cd632ae1ea353d8254ed Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Nov 2020 12:42:37 +0100 Subject: [PATCH 0567/2352] [occ] Always prefer OCC_CONTROL_PORT variable to --control-port param --- occ/plugin/OccPlugin.cxx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/occ/plugin/OccPlugin.cxx b/occ/plugin/OccPlugin.cxx index d010ea56d..264972e1f 100644 --- a/occ/plugin/OccPlugin.cxx +++ b/occ/plugin/OccPlugin.cxx @@ -48,11 +48,16 @@ OccPlugin::OccPlugin(const std::string& name, // std::for_each( pk.begin(), pk.end(), [](auto it){OLOG(DEBUG) << "\t" << it; } ); auto controlPort = std::to_string(OCC_DEFAULT_PORT); - try { - controlPort = GetPropertyAsString(OCC_CONTROL_PORT_ARG); + if (const char* env_controlPort = std::getenv(OCC_CONTROL_PORT_ENV)) { + controlPort = env_controlPort; } - catch (std::exception& e) { - OLOG(DEBUG) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; + else { + try { + controlPort = GetPropertyAsString(OCC_CONTROL_PORT_ARG); + } + catch (std::exception& e) { + OLOG(DEBUG) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; + } } try { From a277ecf76c9b27be9b3bd9824d7a78f50d1ad98e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Nov 2020 14:24:18 +0100 Subject: [PATCH 0568/2352] [build] Bump to v0.17.80 == v0.18.0-beta1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0a2b9d06b..f426c7eaa 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 17 -VERSION_PATCH := 2 +VERSION_PATCH := 80 From aba6e4c444052d0614c72f5fa5396bcdc6eb054f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Nov 2020 14:30:39 +0100 Subject: [PATCH 0569/2352] [core] Push environment_id as property to all tasks --- core/task/task.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/task/task.go b/core/task/task.go index 6488ed2a1..7ca799a2d 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -393,6 +393,11 @@ func (t *Task) GetLocalBindMap() channel.BindMap { return t.localBindMap } +func fillCommonProperties(t *Task, propMap controlcommands.PropertyMap) { + envId := t.GetEnvironmentId() + propMap["environment_id"] = envId.String() +} + func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { @@ -401,6 +406,9 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand return } + // The baseline prop list that we then complete or overwrite as needed + fillCommonProperties(t, propMap) + // First we get the full varStack from the parent role, and // consolidate it. varStack, err := t.GetParent().ConsolidatedVarStack() From 50ee02193cc1276b426deeb7cbbfb28f09ff5801 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Nov 2020 14:43:00 +0100 Subject: [PATCH 0570/2352] [occ] Ensure the run number is always a uint32_t in the C++ interface --- occ/occlib/OccServer.cxx | 2 +- occ/occlib/RuntimeControlledObject.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index a605d0528..a179f082e 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -233,7 +233,7 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: t_State newState = currentState; std::string rns = properties.get("runNumber", "0"); - RunNumber newRunNumber = std::strtoul(rns.c_str(), nullptr, 10); + RunNumber newRunNumber = static_cast(std::strtoul(rns.c_str(), nullptr, 10)); std::string evt = boost::algorithm::to_lower_copy(event); diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index 92dc2a2a7..c898667ca 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -39,7 +39,7 @@ typedef basic_ptree< std::string, std::string, std::less > ptree; } } -typedef uint64_t RunNumber; +typedef uint32_t RunNumber; const RunNumber RunNumber_UNDEFINED = 0; From 11f15b44f778a62c28bce39983d226fdd6ef35d5 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 9 Nov 2020 13:07:02 +0100 Subject: [PATCH 0571/2352] [core] fix discrepancy between task and environment states --- core/environment/transition_configure.go | 32 +++++++++++------ core/environment/transition_reset.go | 35 ++++++++++++------ core/environment/transition_startactivity.go | 37 ++++++++++++++------ core/environment/transition_stopactivity.go | 34 ++++++++++++------ 4 files changed, 97 insertions(+), 41 deletions(-) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 50e0dcd3b..ab83bb15a 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -183,9 +183,28 @@ func (t ConfigureTransition) do(env *Environment) (err error) { // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id(), tasks, nil) t.taskman.MessageChannel <- taskmanMessage - // if err != nil { - // return - // } + + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.CONFIGURED { + break WORKFLOW_STATE_LOOP + } + if wfState == task.ERROR { + return + } + } + } + } } // This will subscribe to workflow state change. In case of workflow state @@ -225,13 +244,6 @@ func (t ConfigureTransition) do(env *Environment) (err error) { nil, ) t.taskman.MessageChannel <- taskmanMessage - // err = t.taskman.TransitionTasks( - // env.Workflow().GetTasks(), - // task.RUNNING.String(), - // task.STOP.String(), - // task.CONFIGURED.String(), - // nil, - // ) } break WORKFLOW_STATE_LOOP } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index da2b5cc4c..cd2132b4b 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -27,6 +27,7 @@ package environment import ( "errors" "github.com/AliceO2Group/Control/core/task" + "github.com/pborman/uuid" ) func NewResetTransition(taskman *task.Manager) Transition { @@ -56,16 +57,30 @@ func (t ResetTransition) do(env *Environment) (err error) { ) t.taskman.MessageChannel <- taskmanMessage - // err = t.taskman.TransitionTasks( - // env.Workflow().GetTasks(), - // task.CONFIGURED.String(), - // task.RESET.String(), - // task.STANDBY.String(), - // nil, - // ) - // if err != nil { - // return - // } + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.STANDBY { + break WORKFLOW_STATE_LOOP + } + if wfState == task.ERROR { + break WORKFLOW_STATE_LOOP + } + if wfState == task.MIXED { + break WORKFLOW_STATE_LOOP + } + } + } + } return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 69c8cc0f3..aec718fc0 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" + "github.com/pborman/uuid" ) func NewStartActivityTransition(taskman *task.Manager) Transition { @@ -74,18 +75,32 @@ func (t StartActivityTransition) do(env *Environment) (err error) { ) t.taskman.MessageChannel <- taskmanMessage - // err = t.taskman.TransitionTasks( - // env.Workflow().GetTasks(), - // task.CONFIGURED.String(), - // task.START.String(), - // task.RUNNING.String(), - // args, - // ) + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.RUNNING { + break WORKFLOW_STATE_LOOP + } + if wfState == task.ERROR { + env.currentRunNumber = 0 + return + } + if wfState == task.MIXED { + return + } + } + } + } - // if err != nil { - // env.currentRunNumber = 0 - // return - // } log.WithField(infologger.Run, env.currentRunNumber).Info("run started") return diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 3388ff4f2..c81886590 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -28,6 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" + "github.com/pborman/uuid" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -61,17 +62,30 @@ func (t StopActivityTransition) do(env *Environment) (err error) { ) t.taskman.MessageChannel <- taskmanMessage - // err = t.taskman.TransitionTasks( - // env.Workflow().GetTasks(), - // task.RUNNING.String(), - // task.STOP.String(), - // task.CONFIGURED.String(), - // nil, - // ) + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - // if err != nil { - // return - // } + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.CONFIGURED { + break WORKFLOW_STATE_LOOP + } + if wfState == task.ERROR { + break WORKFLOW_STATE_LOOP + } + if wfState == task.MIXED { + break WORKFLOW_STATE_LOOP + } + } + } + } return } From 6049428d79118338f8e918d42babea9521c30719 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 10 Nov 2020 11:36:02 +0100 Subject: [PATCH 0572/2352] [core] fix infinite loop due to wfState --- common/event/taskstatechangedevent.go | 66 ++++++++++++++++++++ core/environment/environment.go | 2 + core/environment/manager.go | 27 +++++--- core/environment/transition_configure.go | 28 ++------- core/environment/transition_reset.go | 29 ++------- core/environment/transition_startactivity.go | 31 ++------- core/environment/transition_stopactivity.go | 29 ++------- core/task/coreevent.go | 3 +- core/task/manager.go | 10 ++- 9 files changed, 117 insertions(+), 108 deletions(-) create mode 100644 common/event/taskstatechangedevent.go diff --git a/common/event/taskstatechangedevent.go b/common/event/taskstatechangedevent.go new file mode 100644 index 000000000..b3ce618fb --- /dev/null +++ b/common/event/taskstatechangedevent.go @@ -0,0 +1,66 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" +) + +type TasksStateChangedEvent struct { + eventBase + EnvironmentId uid.ID `json:"environmentId"` + TaskIdsStateChanged []string `json:"taskIdsStatesChanged"` + TaskStateChangedErr error `json:"taskStateChangedErr"` +} + +func (tr *TasksStateChangedEvent) GetName() string { + return "TASK_STATE" +} + +func (tr *TasksStateChangedEvent) GetEnvironmentId() uid.ID { + return tr.EnvironmentId +} + +func (tr *TasksStateChangedEvent) GetTaskIds() []string { + return tr.TaskIdsStateChanged +} + +func (tr *TasksStateChangedEvent) GetTasksStateChangedError() error { + return tr.TaskStateChangedErr +} + +func NewTasksStateChangedEvent(envId uid.ID, taskIdsChangeState []string, taskStateChangedErr error) (tr *TasksStateChangedEvent) { + tr = &TasksStateChangedEvent{ + eventBase: eventBase{ + Timestamp: utils.NewUnixTimestamp(), + MessageType: "TasksStateEvent", + }, + EnvironmentId: envId, + TaskIdsStateChanged: taskIdsChangeState, + TaskStateChangedErr: taskStateChangedErr, + } + return tr +} diff --git a/core/environment/environment.go b/core/environment/environment.go index b285e7e97..763b27642 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -64,6 +64,7 @@ type Environment struct { GlobalDefaults gera.StringMap // From Consul GlobalVars gera.StringMap // From Consul UserVars gera.StringMap // From user input + stateChangedCh chan *event.TasksStateChangedEvent } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -87,6 +88,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { GlobalDefaults: gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults()), GlobalVars: gera.MakeStringMapWithMap(the.ConfSvc().GetVars()), UserVars: gera.MakeStringMapWithMap(userVars), + stateChangedCh: make(chan *event.TasksStateChangedEvent), } // Make the KVs accessible to the workflow via ParentAdapter diff --git a/core/environment/manager.go b/core/environment/manager.go index a2a4c8738..859ea561e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -43,11 +43,12 @@ import ( ) type Manager struct { - mu sync.RWMutex - m map[uid.ID]*Environment - taskman *task.Manager - incomingEventCh <-chan event.Event - pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent + mu sync.RWMutex + m map[uid.ID]*Environment + taskman *task.Manager + incomingEventCh <-chan event.Event + pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent + pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent } func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manager { @@ -56,6 +57,7 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage taskman: tm, incomingEventCh: incomingEventCh, pendingTeardownsCh: make(map[uid.ID]chan *event.TasksReleasedEvent), + pendingStateChangeCh: make(map[uid.ID]chan *event.TasksStateChangedEvent), } go func() { @@ -73,6 +75,12 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage close(thisEnvCh) delete(envman.pendingTeardownsCh, typedEvent.GetEnvironmentId()) } + case *event.TasksStateChangedEvent: + // If we got a TasksStateChangedEvent, it must be matched with a pending + // environment transition. + if thisEnvCh, ok := envman.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { + thisEnvCh <- typedEvent + } default: // noop } @@ -117,6 +125,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } envs.m[env.id] = env + envs.pendingStateChangeCh[env.id] = env.stateChangedCh err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -177,6 +186,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId, env.Workflow().GetTasks(), nil) + // close state channel + close(envs.pendingStateChangeCh[environmentId]) + delete(envs.pendingStateChangeCh, environmentId) pendingCh := make(chan *event.TasksReleasedEvent) envs.pendingTeardownsCh[environmentId] = pendingCh @@ -201,11 +213,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } - // err = envs.taskman.ReleaseTasks(environmentId.Array(), env.Workflow().GetTasks()) - // if err != nil { - // return err - // } - delete(envs.m, environmentId) return err } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index ab83bb15a..5f3a28a7f 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -183,28 +183,11 @@ func (t ConfigureTransition) do(env *Environment) (err error) { // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id(), tasks, nil) t.taskman.MessageChannel <- taskmanMessage - - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.CONFIGURED { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - return - } - } - } - } + } + incomingEv := <-env.stateChangedCh + // If some tasks failed to transition + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + return tasksStateErrors } // This will subscribe to workflow state change. In case of workflow state @@ -242,6 +225,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { task.STOP.String(), task.CONFIGURED.String(), nil, + env.Id(), ) t.taskman.MessageChannel <- taskmanMessage } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index cd2132b4b..b09883d92 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -27,7 +27,6 @@ package environment import ( "errors" "github.com/AliceO2Group/Control/core/task" - "github.com/pborman/uuid" ) func NewResetTransition(taskman *task.Manager) Transition { @@ -54,32 +53,14 @@ func (t ResetTransition) do(env *Environment) (err error) { task.RESET.String(), task.STANDBY.String(), nil, + env.Id(), ) t.taskman.MessageChannel <- taskmanMessage - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.STANDBY { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - break WORKFLOW_STATE_LOOP - } - if wfState == task.MIXED { - break WORKFLOW_STATE_LOOP - } - } - } + incomingEv := <-env.stateChangedCh + // If some tasks failed to transition + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + return tasksStateErrors } return diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index aec718fc0..ee684b4c0 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -32,7 +32,6 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" - "github.com/pborman/uuid" ) func NewStartActivityTransition(taskman *task.Manager) Transition { @@ -72,33 +71,15 @@ func (t StartActivityTransition) do(env *Environment) (err error) { task.START.String(), task.RUNNING.String(), args, + env.Id(), ) t.taskman.MessageChannel <- taskmanMessage - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.RUNNING { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - env.currentRunNumber = 0 - return - } - if wfState == task.MIXED { - return - } - } - } + incomingEv := <-env.stateChangedCh + // If some tasks failed to transition + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + env.currentRunNumber = 0 + return tasksStateErrors } log.WithField(infologger.Run, env.currentRunNumber).Info("run started") diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index c81886590..bebd6d2e5 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -28,7 +28,6 @@ import ( "errors" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" - "github.com/pborman/uuid" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -59,32 +58,14 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.STOP.String(), task.CONFIGURED.String(), nil, + env.Id(), ) t.taskman.MessageChannel <- taskmanMessage - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.CONFIGURED { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - break WORKFLOW_STATE_LOOP - } - if wfState == task.MIXED { - break WORKFLOW_STATE_LOOP - } - } - } + incomingEv := <-env.stateChangedCh + // If some tasks failed to transition + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + return tasksStateErrors } return diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 0ea147535..1ed862aef 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -124,7 +124,7 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap) (t *TaskmanMessage) { +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envId uid.ID) (t *TaskmanMessage) { t = NewTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, @@ -134,6 +134,7 @@ func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg } t.environmentMessage = environmentMessage{ tasks: tasks, + envId: envId, } return t } diff --git a/core/task/manager.go b/core/task/manager.go index baac1dcff..6800a5dbe 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -783,9 +783,15 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { case taskop.AcquireTasks: go m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) case taskop.ConfigureTasks: - go m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + go func(){ + err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + }() case taskop.TransitionTasks: - go m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + go func(){ + err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + }() case taskop.TaskStatusMessage: mesosStatus := tm.status mesosState := mesosStatus.GetState() From 065bd2ffde92399557b43c8168c2e58f64d43618 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 10 Nov 2020 13:28:14 +0100 Subject: [PATCH 0573/2352] [core] fix email in license statement --- common/event/taskstatechangedevent.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/event/taskstatechangedevent.go b/common/event/taskstatechangedevent.go index b3ce618fb..aac107eb6 100644 --- a/common/event/taskstatechangedevent.go +++ b/common/event/taskstatechangedevent.go @@ -2,7 +2,7 @@ * === This file is part of ALICE O² === * * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis + * Author: Miltiadis Alexis * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From f1d2e74f31d6451a8185442d8a2bc36cce5f329d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Nov 2020 15:06:01 +0100 Subject: [PATCH 0574/2352] [build] Bump to v0.17.81 == v0.18.0-beta2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f426c7eaa..d388379b4 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 17 -VERSION_PATCH := 80 +VERSION_PATCH := 81 From 118acf5cfa0092f56ecd820fe2965c17eb669951 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Nov 2020 16:46:51 +0100 Subject: [PATCH 0575/2352] [odcshim] Add support for ODC partitioning --- go.mod | 2 +- odcshim/occserver/handlers.go | 117 +++++-- odcshim/occserver/occserver.go | 33 +- odcshim/odcprotos/odc.pb.go | 550 +++++++++++++++++++++++++++------ odcshim/odcprotos/odc.proto | 26 +- odcshim/protos/occ.pb.go | 116 ++++--- 6 files changed, 657 insertions(+), 187 deletions(-) diff --git a/go.mod b/go.mod index 1eaf71442..421f0d20a 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect github.com/golang/protobuf v1.4.2 - github.com/google/uuid v1.1.1 + github.com/google/uuid v1.1.1 // indirect github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go index d5a72f79b..789d482c4 100644 --- a/odcshim/occserver/handlers.go +++ b/odcshim/occserver/handlers.go @@ -38,8 +38,9 @@ import ( "google.golang.org/grpc/status" ) -func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string, error) { +func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient, envId string) (string, error) { req := &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, } @@ -50,6 +51,10 @@ func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string rep *odc.StateReply ) + if envId == "" { + return newState, errors.New("cannot proceed with empty environment id") + } + rep, err = odcClient.GetState(ctx, req, grpc.EmptyCallOption{}) if err != nil { return newState, printGrpcError(err) @@ -72,7 +77,7 @@ func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Runid, + "odcRunid": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, "odcState": rep.Reply.State, }). @@ -80,9 +85,10 @@ func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient) (string return stateForOdcState(newState), err } -func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { req := &odc.StartRequest{ Request: &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, }, @@ -91,6 +97,10 @@ func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments var err error = nil var rep *odc.StateReply + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) if err != nil { return printGrpcError(err) @@ -111,16 +121,17 @@ func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Runid, + "odcRunid": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete") return err } -func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { req := &odc.StopRequest{ Request: &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, }, @@ -129,6 +140,10 @@ func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments [ var err error = nil var rep *odc.StateReply + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) if err != nil { return printGrpcError(err) @@ -149,16 +164,40 @@ func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments [ "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Runid, + "odcRunid": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete") return err } -func handleReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func handleReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + err := doReset(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + + err = doTerminate(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + + err = doShutdown(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + return nil +} + +func doReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { + // RESET req := &odc.ResetRequest{ Request: &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, }, @@ -187,17 +226,18 @@ func handleReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Runid, + "odcRunid": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete") return err } -func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func doTerminate(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { // TERMINATE req := &odc.TerminateRequest{ Request: &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, }, @@ -226,14 +266,20 @@ func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments [ "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Runid, + "odcRunid": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete") + return err +} +func doShutdown(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error{ // SHUTDOWN - shutdownRequest := &odc.ShutdownRequest{} + shutdownRequest := &odc.ShutdownRequest{ + Partitionid: envId, + } + var err error = nil var shutdownResponse *odc.GeneralReply shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) if err != nil { @@ -252,17 +298,25 @@ func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments [ return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": shutdownResponse.Msg, - "odcStatus": shutdownResponse.Status.String(), - "odcExectime": shutdownResponse.Exectime, - "odcRunid": shutdownResponse.Runid, - "odcSessionid": shutdownResponse.Sessionid, - }). + "odcMsg": shutdownResponse.Msg, + "odcStatus": shutdownResponse.Status.String(), + "odcExectime": shutdownResponse.Exectime, + "odcRunid": shutdownResponse.Partitionid, + "odcSessionid": shutdownResponse.Sessionid, + }). Debug("call to ODC complete") return err } -func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { + return nil +} + +func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + log.Trace("BEGIN handleRun") defer log.Trace("END handleRun") // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE @@ -278,6 +332,7 @@ func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments [] } runRequest := &odc.RunRequest{ + Partitionid: envId, Topology: topology, } @@ -304,7 +359,7 @@ func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments [] "odcMsg": runResponse.Msg, "odcStatus": runResponse.Status.String(), "odcExectime": runResponse.Exectime, - "odcRunid": runResponse.Runid, + "odcRunid": runResponse.Partitionid, "odcSessionid": runResponse.Sessionid, }). Debug("call to ODC complete") @@ -312,9 +367,16 @@ func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments [] } -func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { +func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, topology string, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + var err error = nil + // SetProperties before CONFIGURE setPropertiesRequest := &odc.SetPropertiesRequest{ + Partitionid: envId, Path: "", Properties: make([]*odc.Property, len(arguments)), } @@ -328,7 +390,15 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume } } - var err error = nil + err = handleRun(ctx, odcClient, []*pb.ConfigEntry{{ + Key: "topology", + Value: topology, + }}, envId) + if err != nil { + return printGrpcError(err) + } + + var setPropertiesResponse *odc.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { @@ -350,7 +420,7 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume "odcMsg": setPropertiesResponse.Msg, "odcStatus": setPropertiesResponse.Status.String(), "odcExectime": setPropertiesResponse.Exectime, - "odcRunid": setPropertiesResponse.Runid, + "odcRunid": setPropertiesResponse.Partitionid, "odcSessionid": setPropertiesResponse.Sessionid, }). Debug("call to ODC complete") @@ -359,6 +429,7 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume // CONFIGURE configureRequest := &odc.ConfigureRequest{ Request: &odc.StateRequest{ + Partitionid: envId, Path: "", Detailed: false, }, @@ -385,7 +456,7 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume "odcMsg": configureResponse.Reply.Msg, "odcStatus": configureResponse.Reply.Status.String(), "odcExectime": configureResponse.Reply.Exectime, - "odcRunid": configureResponse.Reply.Runid, + "odcRunid": configureResponse.Reply.Partitionid, "odcSessionid": configureResponse.Reply.Sessionid, }). Debug("call to ODC complete") diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go index 193de6d55..bbfe776a9 100644 --- a/odcshim/occserver/occserver.go +++ b/odcshim/occserver/occserver.go @@ -49,10 +49,11 @@ var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") const CALL_TIMEOUT = 30*time.Second type OccServerImpl struct { - odcHost string - odcPort int - topology string - odcClient *odcclient.RpcClient + odcHost string + odcPort int + topology string + environmentId string + odcClient *odcclient.RpcClient } func (s *OccServerImpl) disconnectAndTerminate() { @@ -85,11 +86,7 @@ func (s *OccServerImpl) ensureClientConnected() error { return fmt.Errorf("cannot dial ODC endpoint: %s", endpoint) } - err := handleRun(cxt, s.odcClient, []*pb.ConfigEntry{{ - Key: "topology", - Value: s.topology, - }}) - return err + return nil } func NewServer(host string, port int, topology string) *grpc.Server { @@ -167,7 +164,7 @@ func (s *OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) ( State: "UNKNOWN", } - newState, err := handleGetState(ctx, s.odcClient) + newState, err := handleGetState(ctx, s.odcClient, s.environmentId) if err == nil { rep.State = newState } @@ -204,26 +201,34 @@ func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionReques var err error = nil switch event := strings.ToUpper(req.TransitionEvent); event { case "CONFIGURE": - err = handleConfigure(ctx, s.odcClient, req.Arguments) + // Extract environment ID from Arguments payload + for _, entry := range req.Arguments { + if entry.Key == "environment_id" { + s.environmentId = entry.Value + } + } + + err = handleConfigure(ctx, s.odcClient, req.Arguments, s.topology, s.environmentId) if err == nil { rep.Ok = true rep.State = "CONFIGURED" } case "START": - err = handleStart(ctx, s.odcClient, req.Arguments) + err = handleStart(ctx, s.odcClient, req.Arguments, s.environmentId) if err == nil { rep.Ok = true rep.State = "RUNNING" } case "STOP": - err = handleStop(ctx, s.odcClient, req.Arguments) + err = handleStop(ctx, s.odcClient, req.Arguments, s.environmentId) if err == nil { rep.Ok = true rep.State = "CONFIGURED" } case "RESET": - err = handleReset(ctx, s.odcClient, req.Arguments) + err = handleReset(ctx, s.odcClient, req.Arguments, s.environmentId) if err == nil { + s.environmentId = "" rep.Ok = true rep.State = "STANDBY" } diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index b26eaf087..3c4adadae 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -117,7 +117,7 @@ type GeneralReply struct { Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` - Runid uint64 `protobuf:"varint,5,opt,name=runid,proto3" json:"runid,omitempty"` + Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -186,11 +186,11 @@ func (m *GeneralReply) GetExectime() int32 { return 0 } -func (m *GeneralReply) GetRunid() uint64 { +func (m *GeneralReply) GetPartitionid() string { if m != nil { - return m.Runid + return m.Partitionid } - return 0 + return "" } func (m *GeneralReply) GetSessionid() string { @@ -275,8 +275,9 @@ func (m *Device) GetPath() string { // Device change/get state request type StateRequest struct { - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Detailed bool `protobuf:"varint,2,opt,name=detailed,proto3" json:"detailed,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -315,6 +316,13 @@ func (m *StateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_StateRequest proto.InternalMessageInfo +func (m *StateRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + func (m *StateRequest) GetPath() string { if m != nil { return m.Path @@ -387,7 +395,7 @@ func (m *StateReply) GetDevices() []*Device { // Initialize request type InitializeRequest struct { - Runid uint64 `protobuf:"varint,1,opt,name=runid,proto3" json:"runid,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -427,11 +435,11 @@ func (m *InitializeRequest) XXX_DiscardUnknown() { var xxx_messageInfo_InitializeRequest proto.InternalMessageInfo -func (m *InitializeRequest) GetRunid() uint64 { +func (m *InitializeRequest) GetPartitionid() string { if m != nil { - return m.Runid + return m.Partitionid } - return 0 + return "" } func (m *InitializeRequest) GetSessionid() string { @@ -443,6 +451,7 @@ func (m *InitializeRequest) GetSessionid() string { // Submit request type SubmitRequest struct { + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -481,9 +490,17 @@ func (m *SubmitRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SubmitRequest proto.InternalMessageInfo +func (m *SubmitRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + // Activate request type ActivateRequest struct { - Topology string `protobuf:"bytes,1,opt,name=topology,proto3" json:"topology,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -522,6 +539,13 @@ func (m *ActivateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ActivateRequest proto.InternalMessageInfo +func (m *ActivateRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + func (m *ActivateRequest) GetTopology() string { if m != nil { return m.Topology @@ -531,7 +555,7 @@ func (m *ActivateRequest) GetTopology() string { // Run request type RunRequest struct { - Runid uint64 `protobuf:"varint,1,opt,name=runid,proto3" json:"runid,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -571,11 +595,11 @@ func (m *RunRequest) XXX_DiscardUnknown() { var xxx_messageInfo_RunRequest proto.InternalMessageInfo -func (m *RunRequest) GetRunid() uint64 { +func (m *RunRequest) GetPartitionid() string { if m != nil { - return m.Runid + return m.Partitionid } - return 0 + return "" } func (m *RunRequest) GetTopology() string { @@ -587,7 +611,8 @@ func (m *RunRequest) GetTopology() string { // Update request type UpdateRequest struct { - Topology string `protobuf:"bytes,1,opt,name=topology,proto3" json:"topology,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -626,6 +651,13 @@ func (m *UpdateRequest) XXX_DiscardUnknown() { var xxx_messageInfo_UpdateRequest proto.InternalMessageInfo +func (m *UpdateRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + func (m *UpdateRequest) GetTopology() string { if m != nil { return m.Topology @@ -635,6 +667,7 @@ func (m *UpdateRequest) GetTopology() string { // Shutdown request type ShutdownRequest struct { + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -673,6 +706,13 @@ func (m *ShutdownRequest) XXX_DiscardUnknown() { var xxx_messageInfo_ShutdownRequest proto.InternalMessageInfo +func (m *ShutdownRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + // Key-Value property type Property struct { Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` @@ -731,8 +771,9 @@ func (m *Property) GetValue() string { // Set properties request type SetPropertiesRequest struct { - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` - Properties []*Property `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty"` + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -771,6 +812,13 @@ func (m *SetPropertiesRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SetPropertiesRequest proto.InternalMessageInfo +func (m *SetPropertiesRequest) GetPartitionid() string { + if m != nil { + return m.Partitionid + } + return "" +} + func (m *SetPropertiesRequest) GetPath() string { if m != nil { return m.Path @@ -1050,55 +1098,55 @@ func init() { func init() { proto.RegisterFile("odcprotos/odc.proto", fileDescriptor_289c0e4bbb6a131e) } var fileDescriptor_289c0e4bbb6a131e = []byte{ - // 753 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x55, 0xdd, 0x6e, 0xd3, 0x4a, - 0x10, 0xae, 0x93, 0x38, 0x3f, 0x93, 0xa6, 0x71, 0xf7, 0xf4, 0x1c, 0xe5, 0x44, 0x47, 0x51, 0xb4, - 0xd2, 0x11, 0x11, 0x51, 0x0a, 0x04, 0xf5, 0x02, 0x90, 0x5a, 0xd1, 0xb4, 0xaa, 0x10, 0x52, 0x8b, - 0xd6, 0x54, 0x08, 0x89, 0x9b, 0x34, 0x5e, 0xda, 0x15, 0x49, 0xd6, 0xd8, 0xeb, 0x42, 0x79, 0x12, - 0x5e, 0x82, 0xf7, 0xe0, 0x12, 0xf1, 0x04, 0xa8, 0xbc, 0x08, 0xda, 0xb1, 0xb3, 0x71, 0x53, 0xa7, - 0x82, 0xde, 0xcd, 0x64, 0xbe, 0x6f, 0xe7, 0xef, 0x1b, 0x07, 0xfe, 0x92, 0xde, 0xc8, 0x0f, 0xa4, - 0x92, 0xe1, 0x3d, 0xe9, 0x8d, 0x36, 0xd1, 0x24, 0x79, 0xe9, 0x8d, 0x68, 0x0f, 0xec, 0xfd, 0x20, - 0x90, 0x01, 0x71, 0x20, 0x3f, 0x09, 0x4f, 0x1b, 0x56, 0xdb, 0xea, 0x54, 0x98, 0x36, 0x09, 0x81, - 0xc2, 0x48, 0x7a, 0xbc, 0x91, 0x6b, 0x5b, 0x1d, 0x9b, 0xa1, 0x4d, 0xbf, 0x5b, 0xb0, 0x7a, 0xc0, - 0xa7, 0x3c, 0x18, 0x8e, 0x19, 0xf7, 0xc7, 0x17, 0x19, 0xb4, 0x0e, 0x14, 0x43, 0x35, 0x54, 0x51, - 0x88, 0xc4, 0xb5, 0xbe, 0xb3, 0xa9, 0x53, 0x22, 0xda, 0xc5, 0xdf, 0x59, 0x12, 0x27, 0x6d, 0xb0, - 0xb9, 0xce, 0xdd, 0xc8, 0xb7, 0xad, 0x4e, 0xb5, 0x0f, 0x08, 0xc4, 0x6a, 0x58, 0x1c, 0x20, 0x4d, - 0x28, 0xf3, 0x8f, 0x7c, 0xa4, 0xc4, 0x84, 0x37, 0x0a, 0x58, 0x86, 0xf1, 0xc9, 0x06, 0xd8, 0x41, - 0x34, 0x15, 0x5e, 0xc3, 0x6e, 0x5b, 0x9d, 0x02, 0x8b, 0x1d, 0xf2, 0x1f, 0x54, 0x42, 0x1e, 0x86, - 0x42, 0xea, 0x48, 0x11, 0xab, 0x9a, 0xff, 0xa0, 0x39, 0x3a, 0x37, 0x6f, 0x94, 0x30, 0x12, 0x3b, - 0x74, 0x17, 0x8a, 0x7b, 0xfc, 0x5c, 0x8c, 0x38, 0x59, 0x83, 0x9c, 0xf0, 0xb0, 0x99, 0x02, 0xcb, - 0xa5, 0xf1, 0xb9, 0x14, 0x5e, 0x0f, 0xc6, 0x1f, 0xaa, 0x33, 0x2c, 0xbb, 0xc2, 0xd0, 0xa6, 0xdb, - 0xb0, 0xaa, 0xbb, 0xe3, 0x8c, 0xbf, 0x8f, 0x78, 0xa8, 0x0c, 0xc6, 0x9a, 0x63, 0x74, 0x37, 0x1e, - 0x57, 0x43, 0x31, 0xe6, 0x1e, 0x3e, 0x58, 0x66, 0xc6, 0xa7, 0x6f, 0x00, 0x12, 0xbe, 0x9e, 0xea, - 0x1d, 0xb0, 0x03, 0x6d, 0x20, 0xbd, 0xda, 0x5f, 0xc7, 0xc9, 0xa4, 0xe7, 0xce, 0xe2, 0x38, 0xf9, - 0x1f, 0x4a, 0x1e, 0x96, 0xae, 0xa7, 0x9d, 0xef, 0x54, 0xfb, 0x55, 0x84, 0xc6, 0xed, 0xb0, 0x59, - 0x8c, 0x1e, 0xc0, 0xfa, 0xb3, 0xa9, 0x50, 0x62, 0x38, 0x16, 0x9f, 0x4c, 0x89, 0x66, 0x80, 0xd6, - 0xd2, 0x01, 0xe6, 0x16, 0x06, 0x48, 0xeb, 0x50, 0x73, 0xa3, 0x93, 0x89, 0x50, 0xc9, 0x23, 0xb4, - 0x07, 0xf5, 0xa7, 0x23, 0x25, 0xce, 0x53, 0xad, 0x37, 0xa1, 0xac, 0xa4, 0x2f, 0xc7, 0xf2, 0xf4, - 0x22, 0x69, 0xdf, 0xf8, 0x74, 0x1b, 0x80, 0x45, 0xd3, 0x9b, 0x2b, 0x48, 0xf3, 0x73, 0x0b, 0xfc, - 0x2e, 0xd4, 0x8e, 0x7d, 0xef, 0x37, 0x93, 0xad, 0x43, 0xdd, 0x3d, 0x8b, 0x94, 0x27, 0x3f, 0xcc, - 0x32, 0xd2, 0x3e, 0x94, 0x5f, 0x04, 0xd2, 0xe7, 0x81, 0x42, 0xe9, 0xbe, 0xe3, 0x33, 0x96, 0x36, - 0x75, 0x3d, 0xe7, 0xc3, 0x71, 0x64, 0xd6, 0x8d, 0x0e, 0x7d, 0x0d, 0x1b, 0x2e, 0x57, 0x09, 0x4d, - 0xf0, 0xf0, 0xa6, 0x15, 0xf7, 0x00, 0x7c, 0x03, 0x4c, 0x56, 0x52, 0xc3, 0x95, 0xcc, 0xd2, 0xb2, - 0x14, 0x80, 0xee, 0x80, 0x33, 0x90, 0xd3, 0xb7, 0xe2, 0x34, 0x0a, 0x4c, 0x47, 0x5d, 0x28, 0x05, - 0xb1, 0x79, 0x65, 0xfb, 0x69, 0x75, 0xb1, 0x19, 0x82, 0x3e, 0x41, 0xd9, 0x05, 0xea, 0x56, 0xe4, - 0xc7, 0x50, 0x75, 0x95, 0xf4, 0x6f, 0x9b, 0x98, 0xf1, 0x90, 0xdf, 0x2e, 0xf1, 0x0e, 0x38, 0x2f, - 0x79, 0x30, 0x11, 0xd3, 0xd4, 0x22, 0xff, 0xe4, 0x81, 0xbb, 0x7d, 0xa8, 0xa6, 0x3e, 0x28, 0xa4, - 0x0a, 0xa5, 0xe3, 0xc3, 0xe7, 0x87, 0x47, 0xaf, 0x0e, 0x9d, 0x15, 0xed, 0xb8, 0xc7, 0x83, 0xc1, - 0xbe, 0xeb, 0x3a, 0x16, 0xa9, 0x80, 0xbd, 0xcf, 0xd8, 0x11, 0x73, 0x72, 0xfd, 0x2f, 0x36, 0xe4, - 0x8f, 0xf6, 0x06, 0xe4, 0x11, 0xc0, 0xfc, 0x16, 0xc8, 0x3f, 0x98, 0xe5, 0xda, 0x71, 0x34, 0xaf, - 0x9f, 0x1c, 0x5d, 0x21, 0x0f, 0xa0, 0x18, 0xab, 0x9f, 0x90, 0xb8, 0xb8, 0xf4, 0x29, 0x64, 0x53, - 0xb6, 0xa0, 0x3c, 0xbb, 0x0f, 0xb2, 0x81, 0x80, 0x85, 0x73, 0xc9, 0xa6, 0x75, 0x21, 0xcf, 0xa2, - 0x29, 0xa9, 0xc7, 0xdf, 0x4e, 0x73, 0x31, 0x4b, 0xcb, 0x8a, 0x8f, 0x22, 0x29, 0xeb, 0xca, 0x85, - 0x2c, 0x2b, 0xab, 0x62, 0x84, 0x47, 0xfe, 0x46, 0xc4, 0xa2, 0x10, 0x9b, 0xf5, 0xf4, 0x02, 0x62, - 0xda, 0x0e, 0xd4, 0xae, 0x9c, 0x02, 0xf9, 0x37, 0xc6, 0x64, 0x9c, 0x47, 0x76, 0xde, 0xfb, 0x50, - 0x3e, 0xe0, 0x0a, 0xdf, 0x24, 0xd7, 0x17, 0x9c, 0x95, 0xb2, 0x07, 0x36, 0x2a, 0x7c, 0x0e, 0x37, - 0x6a, 0xcf, 0x82, 0x77, 0xa1, 0xa0, 0x35, 0x4d, 0x9c, 0x24, 0x64, 0xe4, 0xbd, 0xe4, 0x6d, 0x14, - 0x71, 0xf2, 0x76, 0x5a, 0xd0, 0x59, 0xf0, 0x2d, 0xa8, 0x18, 0xd9, 0x26, 0x43, 0x5b, 0x94, 0x71, - 0x36, 0xad, 0x3c, 0xfb, 0x0c, 0x25, 0x12, 0x58, 0xf8, 0x2a, 0x65, 0x8e, 0x6a, 0xd7, 0xf9, 0x7a, - 0xd9, 0xb2, 0xbe, 0x5d, 0xb6, 0xac, 0x1f, 0x97, 0x2d, 0xeb, 0xf3, 0xcf, 0xd6, 0xca, 0x49, 0x11, - 0xff, 0xb7, 0x1f, 0xfe, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x24, 0xc3, 0x83, 0x01, 0xce, 0x07, 0x00, - 0x00, + // 763 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcd, 0x6e, 0xd3, 0x40, + 0x10, 0xae, 0x93, 0x38, 0x3f, 0xe3, 0xa6, 0x71, 0x97, 0x82, 0x42, 0x84, 0xa2, 0x68, 0x25, 0x44, + 0x44, 0xd5, 0x42, 0x53, 0xf5, 0x00, 0x1c, 0x2a, 0x9a, 0x56, 0x15, 0x20, 0x1a, 0xb4, 0xa6, 0xe2, + 0xc2, 0x81, 0x34, 0x5e, 0xda, 0x55, 0x93, 0xac, 0xb1, 0xd7, 0x85, 0xc0, 0x8b, 0xf0, 0x12, 0xbc, + 0x07, 0x47, 0x9e, 0x00, 0xa1, 0xf2, 0x22, 0xc8, 0x63, 0xc7, 0x71, 0x12, 0x57, 0x6a, 0x4b, 0x6f, + 0xbb, 0x9e, 0x6f, 0x66, 0xbe, 0x9d, 0xfd, 0xbe, 0x4d, 0xe0, 0x96, 0xb4, 0x7b, 0x8e, 0x2b, 0x95, + 0xf4, 0x1e, 0x49, 0xbb, 0xb7, 0x8e, 0x4b, 0x92, 0x95, 0x76, 0x8f, 0xae, 0x81, 0xbe, 0xe7, 0xba, + 0xd2, 0x25, 0x26, 0x64, 0x07, 0xde, 0x71, 0x55, 0x6b, 0x68, 0xcd, 0x12, 0x0b, 0x96, 0x84, 0x40, + 0xae, 0x27, 0x6d, 0x5e, 0xcd, 0x34, 0xb4, 0xa6, 0xce, 0x70, 0x4d, 0x7f, 0x6b, 0xb0, 0xb8, 0xcf, + 0x87, 0xdc, 0xed, 0xf6, 0x19, 0x77, 0xfa, 0xa3, 0x94, 0xb4, 0x26, 0xe4, 0x3d, 0xd5, 0x55, 0xbe, + 0x87, 0x89, 0x4b, 0x2d, 0x73, 0x3d, 0x68, 0x89, 0x68, 0x0b, 0xbf, 0xb3, 0x28, 0x4e, 0x1a, 0xa0, + 0xf3, 0xa0, 0x77, 0x35, 0xdb, 0xd0, 0x9a, 0x46, 0x0b, 0x10, 0x88, 0x6c, 0x58, 0x18, 0x20, 0x35, + 0x28, 0xf2, 0x2f, 0xbc, 0xa7, 0xc4, 0x80, 0x57, 0x73, 0x48, 0x23, 0xde, 0x93, 0x06, 0x18, 0x4e, + 0xd7, 0x55, 0x42, 0x09, 0x39, 0x14, 0x76, 0x55, 0x47, 0x06, 0xc9, 0x4f, 0xe4, 0x1e, 0x94, 0x3c, + 0xee, 0x79, 0x61, 0x3c, 0x8f, 0xf1, 0xc9, 0x07, 0xb2, 0x02, 0x7a, 0xc0, 0x83, 0x57, 0x0b, 0x18, + 0x09, 0x37, 0x74, 0x07, 0xf2, 0xbb, 0xfc, 0x4c, 0xf4, 0x38, 0x59, 0x82, 0x8c, 0xb0, 0xf1, 0x60, + 0x39, 0x96, 0x49, 0xe2, 0x33, 0x09, 0x7c, 0x30, 0x24, 0xa7, 0xab, 0x4e, 0xf0, 0x08, 0x25, 0x86, + 0x6b, 0xfa, 0x01, 0x16, 0x83, 0x93, 0x72, 0xc6, 0x3f, 0xf9, 0xdc, 0x53, 0xb3, 0x4c, 0xb5, 0x79, + 0xa6, 0xe3, 0x2a, 0x99, 0x49, 0x95, 0xe0, 0xec, 0x36, 0x57, 0x5d, 0xd1, 0xe7, 0x36, 0x56, 0x2f, + 0xb2, 0x78, 0x4f, 0xdf, 0x03, 0x44, 0x1d, 0x82, 0x3b, 0x78, 0x00, 0xba, 0x1b, 0x2c, 0xb0, 0xb2, + 0xd1, 0x5a, 0xc6, 0x39, 0x26, 0x6f, 0x89, 0x85, 0x71, 0x72, 0x1f, 0x0a, 0x36, 0x1e, 0x2e, 0xb8, + 0x9b, 0x6c, 0xd3, 0x68, 0x19, 0x08, 0x0d, 0x0f, 0xcc, 0xc6, 0x31, 0x6a, 0xc1, 0xf2, 0x8b, 0xa1, + 0x50, 0xa2, 0xdb, 0x17, 0x5f, 0xaf, 0x70, 0x88, 0xa9, 0x71, 0x67, 0x66, 0xc6, 0x4d, 0x37, 0xa0, + 0x6c, 0xf9, 0x47, 0x03, 0xa1, 0x2e, 0x5d, 0x90, 0x76, 0xa0, 0xf2, 0xbc, 0xa7, 0xc4, 0xd9, 0x95, + 0x46, 0x59, 0x83, 0xa2, 0x92, 0x8e, 0xec, 0xcb, 0xe3, 0x51, 0x44, 0x22, 0xde, 0xd3, 0x97, 0x00, + 0xcc, 0x1f, 0xde, 0x4c, 0xad, 0xd7, 0x50, 0x3e, 0x74, 0xec, 0x1b, 0xa3, 0xb6, 0x09, 0x15, 0xeb, + 0xc4, 0x57, 0xb6, 0xfc, 0x7c, 0x79, 0x7e, 0xb4, 0x05, 0xc5, 0x37, 0xae, 0x74, 0xb8, 0xab, 0xd0, + 0x88, 0xa7, 0x7c, 0x34, 0x36, 0xe2, 0x29, 0x1f, 0x05, 0x82, 0x3d, 0xeb, 0xf6, 0xfd, 0x58, 0xb0, + 0xb8, 0xa1, 0xdf, 0x60, 0xc5, 0xe2, 0x2a, 0x4a, 0x13, 0xdc, 0xfb, 0x3f, 0x91, 0xae, 0x01, 0x38, + 0x71, 0xa9, 0x6a, 0x16, 0x45, 0x55, 0x46, 0x51, 0x8d, 0x89, 0xb1, 0x04, 0x80, 0x6e, 0x83, 0xd9, + 0x96, 0xc3, 0x8f, 0xe2, 0xd8, 0x77, 0xe3, 0xb9, 0xad, 0x42, 0xc1, 0x0d, 0x97, 0x53, 0xfa, 0x4d, + 0x3a, 0x88, 0x8d, 0x11, 0xf4, 0x19, 0x5a, 0xcb, 0x55, 0xd7, 0x4a, 0x7e, 0x0a, 0x86, 0xa5, 0xa4, + 0x73, 0xdd, 0xc6, 0x8c, 0x7b, 0xfc, 0x7a, 0x8d, 0xb7, 0xc1, 0x7c, 0xcb, 0xdd, 0x81, 0x18, 0x26, + 0xe4, 0x72, 0x95, 0x02, 0x0f, 0x5b, 0x60, 0x24, 0x1e, 0x50, 0x62, 0x40, 0xe1, 0xf0, 0xe0, 0xd5, + 0x41, 0xe7, 0xdd, 0x81, 0xb9, 0x10, 0x6c, 0xac, 0xc3, 0x76, 0x7b, 0xcf, 0xb2, 0x4c, 0x8d, 0x94, + 0x40, 0xdf, 0x63, 0xac, 0xc3, 0xcc, 0x4c, 0xeb, 0x87, 0x0e, 0xd9, 0xce, 0x6e, 0x9b, 0x3c, 0x01, + 0x98, 0xb8, 0x99, 0xdc, 0xc1, 0x2e, 0x73, 0xf6, 0xae, 0xcd, 0x3f, 0x1a, 0x74, 0x81, 0x6c, 0x40, + 0x3e, 0xf4, 0x2c, 0x21, 0x21, 0xb9, 0xa4, 0x81, 0xd3, 0x53, 0xb6, 0xa0, 0x38, 0xf6, 0x2c, 0x59, + 0x41, 0xc0, 0x8c, 0x85, 0xd3, 0xd3, 0x56, 0x21, 0xcb, 0xfc, 0x21, 0xa9, 0x84, 0xbf, 0x15, 0xb1, + 0x47, 0x2f, 0xa4, 0x15, 0x5a, 0x2f, 0xa2, 0x35, 0xe5, 0xc3, 0x8b, 0x68, 0x95, 0x62, 0xe1, 0x91, + 0xdb, 0x88, 0x98, 0x15, 0x62, 0xad, 0x92, 0xbc, 0x80, 0x30, 0x6d, 0x1b, 0xca, 0x53, 0x66, 0x21, + 0x77, 0x43, 0x4c, 0x8a, 0x81, 0xd2, 0xfb, 0x3e, 0x86, 0xe2, 0x3e, 0x57, 0x58, 0x93, 0xcc, 0x5f, + 0x70, 0x5a, 0xcb, 0x35, 0xd0, 0x51, 0xe1, 0x13, 0x78, 0xac, 0xf6, 0x34, 0xf8, 0x2a, 0xe4, 0x02, + 0x4d, 0x13, 0x33, 0x0a, 0xc5, 0xf2, 0xbe, 0xa0, 0x36, 0x8a, 0x38, 0xaa, 0x9d, 0x14, 0x74, 0x1a, + 0x7c, 0x0b, 0x4a, 0xb1, 0x6c, 0xa3, 0xa1, 0xcd, 0xca, 0x38, 0x3d, 0xad, 0x38, 0x7e, 0xca, 0x22, + 0x09, 0xcc, 0xbc, 0x6c, 0xa9, 0xa3, 0xda, 0x31, 0x7f, 0x9e, 0xd7, 0xb5, 0x5f, 0xe7, 0x75, 0xed, + 0xcf, 0x79, 0x5d, 0xfb, 0xfe, 0xb7, 0xbe, 0x70, 0x94, 0xc7, 0xff, 0x29, 0x9b, 0xff, 0x02, 0x00, + 0x00, 0xff, 0xff, 0xd5, 0xf4, 0x1f, 0xfc, 0xbe, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1724,10 +1772,12 @@ func (m *GeneralReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x32 } - if m.Runid != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) i-- - dAtA[i] = 0x28 + dAtA[i] = 0x2a } if m.Exectime != 0 { i = encodeVarintOdc(dAtA, i, uint64(m.Exectime)) @@ -1839,13 +1889,20 @@ func (m *StateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0 } i-- - dAtA[i] = 0x10 + dAtA[i] = 0x18 } if len(m.Path) > 0 { i -= len(m.Path) copy(dAtA[i:], m.Path) i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) i-- + dAtA[i] = 0x12 + } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -1935,10 +1992,12 @@ func (m *InitializeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if m.Runid != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -1967,6 +2026,13 @@ func (m *SubmitRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -1999,6 +2065,13 @@ func (m *ActivateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Topology) i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) i-- + dAtA[i] = 0x12 + } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -2035,10 +2108,12 @@ func (m *RunRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if m.Runid != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Runid)) + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } @@ -2072,6 +2147,13 @@ func (m *UpdateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Topology) i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) i-- + dAtA[i] = 0x12 + } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -2101,6 +2183,13 @@ func (m *ShutdownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } @@ -2180,7 +2269,7 @@ func (m *SetPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintOdc(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } } if len(m.Path) > 0 { @@ -2188,6 +2277,13 @@ func (m *SetPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.Path) i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) i-- + dAtA[i] = 0x12 + } + if len(m.Partitionid) > 0 { + i -= len(m.Partitionid) + copy(dAtA[i:], m.Partitionid) + i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -2438,8 +2534,9 @@ func (m *GeneralReply) Size() (n int) { if m.Exectime != 0 { n += 1 + sovOdc(uint64(m.Exectime)) } - if m.Runid != 0 { - n += 1 + sovOdc(uint64(m.Runid)) + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) } l = len(m.Sessionid) if l > 0 { @@ -2484,6 +2581,10 @@ func (m *StateRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } l = len(m.Path) if l > 0 { n += 1 + l + sovOdc(uint64(l)) @@ -2525,8 +2626,9 @@ func (m *InitializeRequest) Size() (n int) { } var l int _ = l - if m.Runid != 0 { - n += 1 + sovOdc(uint64(m.Runid)) + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) } l = len(m.Sessionid) if l > 0 { @@ -2544,6 +2646,10 @@ func (m *SubmitRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2556,6 +2662,10 @@ func (m *ActivateRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } l = len(m.Topology) if l > 0 { n += 1 + l + sovOdc(uint64(l)) @@ -2572,8 +2682,9 @@ func (m *RunRequest) Size() (n int) { } var l int _ = l - if m.Runid != 0 { - n += 1 + sovOdc(uint64(m.Runid)) + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) } l = len(m.Topology) if l > 0 { @@ -2591,6 +2702,10 @@ func (m *UpdateRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } l = len(m.Topology) if l > 0 { n += 1 + l + sovOdc(uint64(l)) @@ -2607,6 +2722,10 @@ func (m *ShutdownRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -2639,6 +2758,10 @@ func (m *SetPropertiesRequest) Size() (n int) { } var l int _ = l + l = len(m.Partitionid) + if l > 0 { + n += 1 + l + sovOdc(uint64(l)) + } l = len(m.Path) if l > 0 { n += 1 + l + sovOdc(uint64(l)) @@ -2982,10 +3105,10 @@ func (m *GeneralReply) Unmarshal(dAtA []byte) error { } } case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) } - m.Runid = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOdc @@ -2995,11 +3118,24 @@ func (m *GeneralReply) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Runid |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 6: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) @@ -3256,6 +3392,38 @@ func (m *StateRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) } @@ -3287,7 +3455,7 @@ func (m *StateRequest) Unmarshal(dAtA []byte) error { } m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 0 { return fmt.Errorf("proto: wrong wireType = %d for field Detailed", wireType) } @@ -3486,10 +3654,10 @@ func (m *InitializeRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) } - m.Runid = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOdc @@ -3499,11 +3667,24 @@ func (m *InitializeRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Runid |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) @@ -3590,6 +3771,38 @@ func (m *SubmitRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: SubmitRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipOdc(dAtA[iNdEx:]) @@ -3645,6 +3858,38 @@ func (m *ActivateRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) } @@ -3731,10 +3976,10 @@ func (m *RunRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Runid", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) } - m.Runid = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowOdc @@ -3744,11 +3989,24 @@ func (m *RunRequest) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.Runid |= uint64(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) @@ -3836,6 +4094,38 @@ func (m *UpdateRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) } @@ -3921,6 +4211,38 @@ func (m *ShutdownRequest) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: ShutdownRequest: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipOdc(dAtA[iNdEx:]) @@ -4094,6 +4416,38 @@ func (m *SetPropertiesRequest) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOdc + } + 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 ErrInvalidLengthOdc + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthOdc + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Partitionid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Path", wireType) } @@ -4125,7 +4479,7 @@ func (m *SetPropertiesRequest) Unmarshal(dAtA []byte) error { } m.Path = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) } diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto index bd4d531ef..b5ba78054 100644 --- a/odcshim/odcprotos/odc.proto +++ b/odcshim/odcprotos/odc.proto @@ -58,7 +58,7 @@ message GeneralReply { ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty int32 exectime = 4; // Request execution time in ms - uint64 runid = 5; // TODO: run ID from ECS, check if we need it in ODC + string partitionid = 5; // Partition ID from ECS string sessionid = 6; // DDS session ID string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. } @@ -74,8 +74,9 @@ message Device { // Device change/get state request message StateRequest { - string path = 1; // Task path in the DDS topology. Can be a regular expression. - bool detailed = 2; // If true then a list of affected devices is populated in the reply. + string partitionid = 1; // Partition ID from ECS + string path = 2; // Task path in the DDS topology. Can be a regular expression. + bool detailed = 3; // If true then a list of affected devices is populated in the reply. } // Device change/get state reply @@ -90,34 +91,36 @@ message StateReply { // Initialize request message InitializeRequest { - uint64 runid = 1; // TODO: run ID from ECS, check if we need it in ODC + string partitionid = 1; // Partition ID from ECS string sessionid = 2; // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. } // Submit request message SubmitRequest { - // No configuration parameters required for this request + string partitionid = 1; // Partition ID from ECS } // Activate request message ActivateRequest { - string topology = 1; // Filepath to a DDS topology file + string partitionid = 1; // Partition ID from ECS + string topology = 2; // Filepath to a DDS topology file } // Run request message RunRequest { - uint64 runid = 1; // TODO: run ID from ECS, check if we need it in ODC + string partitionid = 1; // Partition ID from ECS string topology = 2; // Filepath to a DDS topology file } // Update request message UpdateRequest { - string topology = 1; // Filepath to a DDS topology file + string partitionid = 1; // Partition ID from ECS + string topology = 2; // Filepath to a DDS topology file } // Shutdown request message ShutdownRequest { - // No configuration parameters required for this request + string partitionid = 1; // Partition ID from ECS } // Key-Value property @@ -128,8 +131,9 @@ message Property { // Set properties request message SetPropertiesRequest { - string path = 1; // Task path in the DDS topology. Can be a regular expression. - repeated Property properties = 2; // List of properties to be set + string partitionid = 1; // Partition ID from ECS + string path = 2; // Task path in the DDS topology. Can be a regular expression. + repeated Property properties = 3; // List of properties to be set } // diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index d452f8ed8..a75b761a1 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -375,6 +375,7 @@ var xxx_messageInfo_GetStateRequest proto.InternalMessageInfo type GetStateReply struct { State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -420,6 +421,13 @@ func (m *GetStateReply) GetState() string { return "" } +func (m *GetStateReply) GetPid() int32 { + if m != nil { + return m.Pid + } + return 0 +} + type ConfigEntry struct { Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` @@ -628,46 +636,47 @@ func init() { func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } var fileDescriptor_17fd8faceeeb3e6c = []byte{ - // 623 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xc1, 0x6e, 0xd3, 0x40, - 0x10, 0xcd, 0x3a, 0x6d, 0x49, 0x27, 0x6d, 0xe3, 0x2c, 0x2d, 0x4d, 0x23, 0x14, 0x45, 0x96, 0x2a, - 0x85, 0x22, 0x19, 0x08, 0xf4, 0x82, 0xe0, 0xe0, 0x24, 0x4b, 0x15, 0x91, 0x3a, 0xd2, 0x7a, 0x5b, - 0x21, 0x2e, 0x96, 0x6b, 0x2d, 0x69, 0xd4, 0xd4, 0x36, 0xce, 0xb6, 0x52, 0xfe, 0x81, 0x3b, 0xf0, - 0x47, 0x1c, 0xf9, 0x04, 0x54, 0x7e, 0x04, 0xed, 0x26, 0x71, 0xec, 0x24, 0xdc, 0xbc, 0x33, 0x6f, - 0xdf, 0x7b, 0xb3, 0x33, 0x63, 0xd0, 0xa3, 0x38, 0x14, 0xe1, 0xf8, 0x45, 0xe8, 0xfb, 0xa6, 0xfa, - 0xc4, 0x5b, 0xa1, 0xef, 0xbb, 0xd1, 0x95, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, 0x8e, 0x88, 0xb9, - 0x77, 0x4b, 0xf9, 0xd7, 0x3b, 0x3e, 0x16, 0x46, 0x1f, 0xf4, 0x4c, 0x34, 0x1a, 0x4d, 0xf0, 0x31, - 0x6c, 0x88, 0x49, 0xc4, 0x2b, 0xa8, 0x8e, 0x1a, 0x7b, 0xcd, 0xb2, 0x39, 0x25, 0x30, 0x15, 0x8e, - 0x4d, 0x22, 0x4e, 0x55, 0x1a, 0xef, 0xc3, 0xe6, 0x58, 0x86, 0x2a, 0x5a, 0x1d, 0x35, 0xb6, 0xe9, - 0xf4, 0x20, 0x65, 0xc8, 0x3d, 0x0f, 0x44, 0x56, 0xe6, 0x2d, 0x14, 0x3b, 0xfc, 0x7e, 0xe8, 0x73, - 0x95, 0xc3, 0xcf, 0x33, 0x0a, 0x87, 0x73, 0x85, 0x14, 0x64, 0xa1, 0x63, 0xbc, 0x07, 0x3d, 0xc3, - 0x28, 0x2d, 0x3e, 0x83, 0x4d, 0x2e, 0x63, 0x8a, 0xa1, 0xd8, 0x7c, 0xbc, 0x86, 0x81, 0x4e, 0x11, - 0x46, 0x19, 0x4a, 0x67, 0x5c, 0x28, 0xf3, 0x73, 0x37, 0xc7, 0xb0, 0xbb, 0x08, 0x49, 0xba, 0xa4, - 0x14, 0x94, 0x2e, 0xe5, 0x14, 0x8a, 0xed, 0x30, 0xf8, 0x32, 0x1c, 0x90, 0x40, 0xc4, 0x13, 0xac, - 0x43, 0xfe, 0x86, 0x4f, 0x66, 0x10, 0xf9, 0x29, 0xaf, 0xdd, 0x7b, 0xa3, 0xbb, 0xe4, 0x05, 0xd4, - 0xc1, 0xf8, 0x86, 0xa0, 0xcc, 0x62, 0x2f, 0x18, 0x0f, 0xc5, 0x30, 0x0c, 0x66, 0x9a, 0xb8, 0x0a, - 0x85, 0x71, 0xec, 0x3b, 0x29, 0x95, 0xe4, 0x8c, 0x1b, 0x50, 0x12, 0xc9, 0x05, 0x65, 0x7e, 0xc6, - 0xb8, 0x1c, 0xc6, 0xaf, 0x60, 0xdb, 0x8b, 0x07, 0x77, 0xb7, 0x3c, 0x10, 0xe3, 0x4a, 0xbe, 0x9e, - 0x4f, 0xd7, 0x9e, 0xf2, 0x4a, 0x17, 0x28, 0xe3, 0x3b, 0x82, 0x52, 0xda, 0x8e, 0xac, 0xf7, 0x0d, - 0x3c, 0x12, 0xf1, 0x70, 0x30, 0xe0, 0xf1, 0xac, 0x05, 0xd5, 0x4c, 0x93, 0xdb, 0xd7, 0x5e, 0x30, - 0xe0, 0x6c, 0x8a, 0xa0, 0x73, 0xe8, 0xfa, 0x86, 0xaf, 0x33, 0x9f, 0x5f, 0x6f, 0x7e, 0x0f, 0xb4, - 0xf0, 0xa6, 0xb2, 0x51, 0x47, 0x8d, 0x02, 0xd5, 0xc2, 0x9b, 0x93, 0xde, 0x6c, 0x22, 0x33, 0x72, - 0x78, 0x07, 0x0a, 0xe4, 0x13, 0x69, 0x5f, 0xb0, 0x3e, 0xd5, 0x73, 0xf8, 0x09, 0xe0, 0x0e, 0xb9, - 0xec, 0xb6, 0x89, 0xdb, 0xb5, 0x19, 0xb1, 0x59, 0xb7, 0x6f, 0x5b, 0x3d, 0x1d, 0x61, 0x1d, 0x76, - 0x66, 0x71, 0x42, 0x69, 0x9f, 0xea, 0xda, 0xc9, 0x29, 0x6c, 0x27, 0x13, 0x2a, 0xd3, 0x0e, 0xb3, - 0x18, 0x71, 0x1d, 0x66, 0xb5, 0x7a, 0x64, 0x4a, 0x34, 0x8d, 0x48, 0x1e, 0x7a, 0x4e, 0x3a, 0x5d, - 0x8b, 0x11, 0x1d, 0x9d, 0x5c, 0x42, 0x69, 0x69, 0xec, 0xf0, 0x01, 0x94, 0xed, 0x8b, 0x5e, 0xcf, - 0x9d, 0x0b, 0x5c, 0x12, 0x9b, 0xe9, 0x39, 0x5c, 0x86, 0x5d, 0x62, 0x77, 0xdc, 0xfe, 0x07, 0xd7, - 0x61, 0x94, 0x58, 0xe7, 0x3a, 0xc2, 0x47, 0x70, 0xd0, 0xb2, 0x9c, 0x6e, 0xdb, 0x65, 0x96, 0xf3, - 0xd1, 0x95, 0xbc, 0x5d, 0xdb, 0x62, 0xa4, 0xa3, 0x6b, 0xcd, 0x9f, 0x1a, 0xe4, 0xfb, 0xbe, 0x8f, - 0xcf, 0xa0, 0x98, 0x9a, 0x5e, 0x9c, 0x3c, 0xf4, 0xea, 0x92, 0x54, 0x2b, 0x6b, 0x73, 0xd1, 0x68, - 0x62, 0xe4, 0x5e, 0x22, 0x49, 0x94, 0xda, 0x54, 0x9c, 0xed, 0xd8, 0x7f, 0x88, 0x96, 0x57, 0x5b, - 0x11, 0xbd, 0x83, 0xc2, 0x7c, 0xfa, 0x71, 0xb2, 0x7a, 0x4b, 0x2b, 0x52, 0x3d, 0x58, 0x4d, 0xa8, - 0xfb, 0xb8, 0x05, 0xb0, 0x98, 0x26, 0x7c, 0x34, 0x87, 0xad, 0x0c, 0x7c, 0xf5, 0x70, 0x5d, 0x4a, - 0x71, 0xb4, 0x9a, 0xbf, 0x1e, 0x6a, 0xe8, 0xf7, 0x43, 0x0d, 0xfd, 0x79, 0xa8, 0xa1, 0x1f, 0x7f, - 0x6b, 0x39, 0x78, 0xea, 0x5f, 0x9b, 0x3e, 0x8f, 0x03, 0xd3, 0x1b, 0x0d, 0x7d, 0x6e, 0x86, 0x4d, - 0xd3, 0x0f, 0x03, 0x11, 0x87, 0x23, 0x49, 0xf2, 0x59, 0x8b, 0xae, 0xae, 0xb6, 0xd4, 0xdf, 0xec, - 0xf5, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, 0x20, 0xf5, 0x41, 0x08, 0xe1, 0x04, 0x00, 0x00, + // 637 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xd1, 0x6e, 0xda, 0x4a, + 0x10, 0x65, 0x4d, 0x92, 0x4b, 0x86, 0x24, 0x98, 0xbd, 0xc9, 0x0d, 0x41, 0x57, 0x08, 0x59, 0xba, + 0x12, 0x37, 0x95, 0xdc, 0x96, 0x36, 0xaa, 0x54, 0xb5, 0x0f, 0x06, 0xb6, 0x11, 0x2a, 0x31, 0xd2, + 0x7a, 0x13, 0x55, 0x7d, 0xb1, 0x1c, 0x77, 0x4b, 0xac, 0x10, 0xdb, 0x35, 0x9b, 0x48, 0xfc, 0x43, + 0xdf, 0xdb, 0xfe, 0x51, 0x1f, 0xfb, 0x09, 0x55, 0xfa, 0x23, 0xd5, 0x2e, 0x60, 0x6c, 0x42, 0xdf, + 0xbc, 0x33, 0x67, 0xcf, 0x39, 0x33, 0x3b, 0x63, 0xd0, 0xe3, 0x24, 0x12, 0xd1, 0xe4, 0x71, 0xe4, + 0xfb, 0xa6, 0xfa, 0xc4, 0x5b, 0x91, 0xef, 0xbb, 0xf1, 0xa5, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, + 0x8e, 0x48, 0xb8, 0x77, 0x43, 0xf9, 0xa7, 0x5b, 0x3e, 0x11, 0xc6, 0x10, 0xf4, 0x5c, 0x34, 0x1e, + 0x4f, 0xf1, 0x7f, 0xb0, 0x21, 0xa6, 0x31, 0xaf, 0xa1, 0x26, 0x6a, 0xed, 0xb5, 0xab, 0xe6, 0x8c, + 0xc0, 0x54, 0x38, 0x36, 0x8d, 0x39, 0x55, 0x69, 0xbc, 0x0f, 0x9b, 0x13, 0x19, 0xaa, 0x69, 0x4d, + 0xd4, 0xda, 0xa6, 0xb3, 0x83, 0x94, 0x21, 0x77, 0x3c, 0x14, 0x79, 0x99, 0x97, 0x50, 0xee, 0xf1, + 0xbb, 0xc0, 0xe7, 0x2a, 0x87, 0x1f, 0xe5, 0x14, 0x0e, 0x17, 0x0a, 0x19, 0xc8, 0x52, 0xc7, 0x78, + 0x0d, 0x7a, 0x8e, 0x51, 0x5a, 0xfc, 0x1f, 0x36, 0xb9, 0x8c, 0x29, 0x86, 0x72, 0xfb, 0xef, 0x35, + 0x0c, 0x74, 0x86, 0x30, 0xaa, 0x50, 0x39, 0xe5, 0x42, 0x99, 0x5f, 0xb8, 0x79, 0x01, 0xbb, 0xcb, + 0x90, 0xa4, 0x4b, 0x4b, 0x41, 0x99, 0x52, 0xb0, 0x0e, 0xc5, 0x38, 0xf8, 0xa0, 0xca, 0xdb, 0xa4, + 0xf2, 0xd3, 0x38, 0x81, 0x72, 0x37, 0x0a, 0x3f, 0x06, 0x23, 0x12, 0x8a, 0x64, 0x2a, 0x01, 0xd7, + 0x7c, 0x3a, 0xbf, 0x24, 0x3f, 0x25, 0xd1, 0x9d, 0x37, 0xbe, 0x4d, 0x7b, 0xa2, 0x0e, 0xc6, 0x67, + 0x04, 0x55, 0x96, 0x78, 0xe1, 0x24, 0x10, 0x41, 0x14, 0xce, 0x5d, 0xe0, 0x3a, 0x94, 0x26, 0x89, + 0xef, 0x64, 0x74, 0xd3, 0x33, 0x6e, 0x41, 0x45, 0xa4, 0x17, 0x54, 0x39, 0x73, 0xc6, 0xd5, 0x30, + 0x7e, 0x0a, 0xdb, 0x5e, 0x32, 0xba, 0xbd, 0xe1, 0xa1, 0x98, 0xd4, 0x8a, 0xcd, 0x62, 0xb6, 0x1b, + 0x19, 0xaf, 0x74, 0x89, 0x32, 0xbe, 0x20, 0xa8, 0x64, 0xed, 0xc8, 0x0e, 0x3c, 0x87, 0xbf, 0x44, + 0x12, 0x8c, 0x46, 0x3c, 0x99, 0x3f, 0x4a, 0x3d, 0xf7, 0xec, 0xdd, 0x2b, 0x2f, 0x1c, 0x71, 0x36, + 0x43, 0xd0, 0x05, 0x74, 0xfd, 0x08, 0xac, 0x33, 0x5f, 0x5c, 0x6f, 0x7e, 0x0f, 0xb4, 0xe8, 0xba, + 0xb6, 0xd1, 0x44, 0xad, 0x12, 0xd5, 0xa2, 0xeb, 0xe3, 0xc1, 0x7c, 0x46, 0x73, 0x72, 0x78, 0x07, + 0x4a, 0xe4, 0x1d, 0xe9, 0x9e, 0xb3, 0x21, 0xd5, 0x0b, 0xf8, 0x1f, 0xc0, 0x3d, 0x72, 0xd1, 0xef, + 0x12, 0xb7, 0x6f, 0x33, 0x62, 0xb3, 0xfe, 0xd0, 0xb6, 0x06, 0x3a, 0xc2, 0x3a, 0xec, 0xcc, 0xe3, + 0x84, 0xd2, 0x21, 0xd5, 0xb5, 0xe3, 0x13, 0xd8, 0x4e, 0x67, 0x56, 0xa6, 0x1d, 0x66, 0x31, 0xe2, + 0x3a, 0xcc, 0xea, 0x0c, 0xc8, 0x8c, 0x68, 0x16, 0x91, 0x3c, 0xf4, 0x8c, 0xf4, 0xfa, 0x16, 0x23, + 0x3a, 0x3a, 0xbe, 0x80, 0xca, 0xca, 0x20, 0xe2, 0x03, 0xa8, 0xda, 0xe7, 0x83, 0x81, 0xbb, 0x10, + 0xb8, 0x20, 0x36, 0xd3, 0x0b, 0xb8, 0x0a, 0xbb, 0xc4, 0xee, 0xb9, 0xc3, 0x37, 0xae, 0xc3, 0x28, + 0xb1, 0xce, 0x74, 0x84, 0x8f, 0xe0, 0xa0, 0x63, 0x39, 0xfd, 0xae, 0xcb, 0x2c, 0xe7, 0xad, 0x2b, + 0x79, 0xfb, 0xb6, 0xc5, 0x48, 0x4f, 0xd7, 0xda, 0xdf, 0x34, 0x28, 0x0e, 0x7d, 0x1f, 0x9f, 0x42, + 0x39, 0x33, 0xcf, 0x38, 0x6d, 0xf4, 0xc3, 0xb5, 0xa9, 0xd7, 0xd6, 0xe6, 0xe2, 0xf1, 0xd4, 0x28, + 0x3c, 0x41, 0x92, 0x28, 0xb3, 0xbb, 0x38, 0xff, 0x62, 0x7f, 0x20, 0x5a, 0x5d, 0x76, 0x45, 0xf4, + 0x0a, 0x4a, 0x8b, 0x7d, 0xc0, 0xe9, 0x32, 0xae, 0x2c, 0x4d, 0xfd, 0xe0, 0x61, 0x42, 0xdd, 0xc7, + 0x1d, 0x80, 0xe5, 0x34, 0xe1, 0xa3, 0x05, 0xec, 0xc1, 0xc0, 0xd7, 0x0f, 0xd7, 0xa5, 0x14, 0x47, + 0xa7, 0xfd, 0xfd, 0xbe, 0x81, 0x7e, 0xdc, 0x37, 0xd0, 0xcf, 0xfb, 0x06, 0xfa, 0xfa, 0xab, 0x51, + 0x80, 0x7f, 0xfd, 0x2b, 0xd3, 0xe7, 0x49, 0x68, 0x7a, 0xe3, 0xc0, 0xe7, 0x66, 0xd4, 0x36, 0xfd, + 0x28, 0x14, 0x49, 0x34, 0x96, 0x24, 0xef, 0xb5, 0xf8, 0xf2, 0x72, 0x4b, 0xfd, 0xdf, 0x9e, 0xfd, + 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x94, 0x47, 0x22, 0xf3, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1132,6 +1141,11 @@ func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Pid != 0 { + i = encodeVarintOcc(dAtA, i, uint64(m.Pid)) + i-- + dAtA[i] = 0x10 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -1401,6 +1415,9 @@ func (m *GetStateReply) Size() (n int) { if l > 0 { n += 1 + l + sovOcc(uint64(l)) } + if m.Pid != 0 { + n += 1 + sovOcc(uint64(m.Pid)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -1976,6 +1993,25 @@ func (m *GetStateReply) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) + } + m.Pid = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowOcc + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Pid |= int32(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipOcc(dAtA[iNdEx:]) From 38e2e5c2561ceac1e2bcba4dbe304300a191bc2b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Nov 2020 16:07:16 +0100 Subject: [PATCH 0576/2352] [misc] Test script workflow template default to @master --- hacking/test.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hacking/test.sh b/hacking/test.sh index eb31276d4..ac6b67583 100755 --- a/hacking/test.sh +++ b/hacking/test.sh @@ -45,7 +45,7 @@ if [ -z ${1+x} ]; then ITERATIONS=1; else ITERATIONS=$1; fi # Prepare create command... read -r -d '' CMD_CREATE << EOM -coconut e c -w readout-dataflow@flp-suite-v0.11.0 -e '{"hosts":["centosvmtest0"],"dd_enabled":"true","qcdd_enabled":"true"}' +coconut e c -w readout-dataflow@master -e '{"hosts":["centosvmtest0"],"dd_enabled":"true","qcdd_enabled":"true"}' EOM # Zero the output files @@ -116,4 +116,4 @@ dt3=$(echo "$dt2-3600*$dh" | bc) dm=$(echo "$dt3/60" | bc) ds=$(echo "$dt3-60*$dm" | bc) -LC_NUMERIC=C printf "${(l:3::0:)ITERATIONS} iterations done in %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds \ No newline at end of file +LC_NUMERIC=C printf "${(l:3::0:)ITERATIONS} iterations done in %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds From ed55bdb28140cbe43dd87f9356a59bf9dd434a5c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Nov 2020 16:08:10 +0100 Subject: [PATCH 0577/2352] [core] Expose deployment constants (including consul_endpoint) to env --- core/confsys/service.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/core/confsys/service.go b/core/confsys/service.go index f76f0c7ff..38e06c5df 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -28,6 +28,7 @@ import ( "encoding/json" "errors" "io/ioutil" + "net/url" "os" "path/filepath" "strconv" @@ -220,7 +221,23 @@ func (s *Service) GetROSource() configuration.ROSource { // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right // before pushing TaskInfos func (s *Service) GetDefaults() map[string]string { - return s.getStringMap(filepath.Join(s.GetConsulPath(),"defaults")) + smap := s.getStringMap(filepath.Join(s.GetConsulPath(),"defaults")) + + // Fill in some global constants we want to make available everywhere + globalConfigurationUri := viper.GetString("globalConfigurationUri") + smap["consul_base_uri"] = globalConfigurationUri + consulUrl, err := url.ParseRequestURI(globalConfigurationUri) + if err == nil { + smap["consul_hostname"] = consulUrl.Hostname() + smap["consul_port"] = consulUrl.Port() + smap["consul_endpoint"] = consulUrl.Host + } else { + log.WithField("globalConfigurationUri", globalConfigurationUri). + Warn("cannot parse global configuration endpoint") + } + smap["framework_id"], _ = s.GetMesosFID() + smap["core_hostname"], _ = os.Hostname() + return smap } func (s *Service) GetVars() map[string]string { From c9548ec7013aaac323e1190b5cd9d41b3ac2eb3e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Nov 2020 16:21:58 +0100 Subject: [PATCH 0578/2352] [build] Bump to v0.17.82 == v0.18.0-beta3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d388379b4..b0711dd9e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 17 -VERSION_PATCH := 81 +VERSION_PATCH := 82 From 3e3a7621297d2510f41631c15206eba728de4e7e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Nov 2020 15:18:31 +0100 Subject: [PATCH 0579/2352] [core] Remove trailing semicolons --- core/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index 12834f5f2..8153abe9c 100644 --- a/core/config.go +++ b/core/config.go @@ -89,8 +89,8 @@ func setDefaults() error { viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) viper.SetDefault("globalConfigurationUri", "") //TODO: TBD - viper.SetDefault("fmqPlugin", "OCClite"); - viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/"); + viper.SetDefault("fmqPlugin", "OCClite") + viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") return nil } From 06ed7b41d99a1629039ff6a9fc559a0f7743ecec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Nov 2020 15:38:07 +0100 Subject: [PATCH 0580/2352] [build] Bump to v0.18.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index b0711dd9e..8af1aa4a2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 17 -VERSION_PATCH := 82 +VERSION_MINOR := 18 +VERSION_PATCH := 0 From f795c0622df53beb3a78b10e8cb4f736f363dee3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Nov 2020 15:39:24 +0100 Subject: [PATCH 0581/2352] [misc] Regenerate coconut documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 2 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_history.md | 2 +- coconut/doc/coconut_configuration_import.md | 2 +- coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 2 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 4 ++-- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- coconut/doc/coconut_repository_default-revision.md | 4 ++-- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 14 +++++++------- 29 files changed, 37 insertions(+), 37 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index d3eb92354..55e1b5648 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -31,4 +31,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index cec3ceebb..aa79849c4 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -30,4 +30,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index c91d3ae4e..0ada20176 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -32,4 +32,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 9e7b5f484..317c233bf 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -33,4 +33,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index 785617bf7..aca80ca51 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -40,4 +40,4 @@ coconut conf history / * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index f630fe6e7..a2f55f755 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -49,4 +49,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index aec40242e..c2f286b45 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -41,4 +41,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 63d2623dd..5e77b640c 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -43,4 +43,4 @@ coconut conf show /@ * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 9ce7102bb..0ef48f27c 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -52,4 +52,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 02bec5425..82c6fa8b4 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -40,4 +40,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 77b0f5221..3f7b90d25 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -15,7 +15,7 @@ Workflows and tasks are managed with a git based configuration system, so the wo Examples: * `coconut env create -w myworkflow` - loads workflow `myworkflow` from default configuration repository at HEAD of master branch * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow` - loads a workflow from a specific git repository, HEAD of master branch - * `myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` + * `coconut env create -w myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev` - loads a workflow from a specific git repository, on branch, tag or revision `rev` For more information on the AliECS workflow configuration system, see documentation for the `coconut repository` command. @@ -46,4 +46,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 24f1091f4..e21a7b316 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -37,4 +37,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index aa544c753..188bfb8cf 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -31,4 +31,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 2f33237c4..1717be906 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -33,4 +33,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index b42f26b77..cc922c500 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -31,4 +31,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 723082086..35ac1799e 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -57,4 +57,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 658974ccc..9f5adaed9 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -37,4 +37,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index 1c4f31ecd..cf33cacb4 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -11,7 +11,7 @@ To set a per repository default revision, the default revision specified needs t Examples: * `coconut repo default-revision basic-tasks` Sets `basic-tasks`as the global default-revision * `coconut repo default-revision 0 master` Sets `master`as the default-revision for repo with index 0 -* `coconut repo default-revision 2 vs-sftb Sets `vs-sftb`as the default-revision for repo with index 2 +* `coconut repo default-revision 2 vs-sftb` Sets `vs-sftb`as the default-revision for repo with index 2 ``` coconut repository default-revision [flags] @@ -37,4 +37,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index faa219ac6..cfa6887c0 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 86d3360d8..2b4002024 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 6d1747279..f75cf9561 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index c8860b937..2e2c8b959 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 488c2c2c8..13eef1e8b 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -28,4 +28,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 5af5bcfa6..9171eb098 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -30,4 +30,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 983e99af8..2729096b4 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -29,4 +29,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index bcb3dd96f..3825dbdc3 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -32,4 +32,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index f2895392a..04d652470 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -31,4 +31,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 588ba8a09..aabaf7e48 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -28,4 +28,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 195bcbddb..af3d3dbf6 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -19,13 +19,13 @@ coconut template list [flags] ``` * `coconut templ list` lists templates from the HEAD of master for all git repositories - * `coconut templ list *AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * `coconut templ list *@v*` lists templates coming from revisions matching the `v*`pattern for all git repositories - * `coconut templ list --repository=*AliceO2Group*` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * `coconut templ list --revision=dev*` lists templates coming from revisions matching the `dev*`pattern for all git repositories - * `coconut templ list --repository=*gitlab.cern.ch* --revision=master` lists templates for revisions `master`for git repositories matching `*gitlab.cern.ch*` + * `coconut templ list '*AliceO2Group*'` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * `coconut templ list '*@v*'` lists templates coming from revisions matching the `v*`pattern for all git repositories + * `coconut templ list --repository='*AliceO2Group*'` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * `coconut templ list --revision='dev*'` lists templates coming from revisions matching the `dev*`pattern for all git repositories + * `coconut templ list --repository='*gitlab.cern.ch*' --revision=master` lists templates for revisions `master`for git repositories matching `*gitlab.cern.ch*` * `coconut templ list --all-branches` lists templates from all branches for all git repositories - * `coconut templ list --repository=*github.com* --all-tags` lists templates from all tags for git repositories which match the *github.com* pattern + * `coconut templ list --repository='*github.com*' --all-tags` lists templates from all tags for git repositories which match the *github.com* pattern * `coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 ` lists templates from the commit corresponding to the hash for all git repositories ``` @@ -53,4 +53,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 28-Aug-2020 +###### Auto generated by spf13/cobra on 16-Nov-2020 From 0597898afea60d952afebc4c85a91a6a7e0e87c8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 19 Nov 2020 15:44:13 +0100 Subject: [PATCH 0582/2352] [core] Always get the stateChanged after a transition --- core/environment/transition_configure.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 5f3a28a7f..be4fb0536 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -228,6 +228,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { env.Id(), ) t.taskman.MessageChannel <- taskmanMessage + <-env.stateChangedCh } break WORKFLOW_STATE_LOOP } From 8134b758cab3f35784ae9b2e637b531d40b502b7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 Nov 2020 16:08:31 +0100 Subject: [PATCH 0583/2352] [build] Bump to v0.18.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8af1aa4a2..7dffb704d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 18 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 6b6d03770fcc11dcd26f06987382968972d96a1b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 23 Nov 2020 11:54:50 +0100 Subject: [PATCH 0584/2352] [executor] Improve executorcmd log output --- executor/executable/controllabletask.go | 13 +++++++++- executor/executorcmd/client.go | 34 ++++++++++++++----------- executor/executorcmd/nopb/test/main.go | 7 ++++- occ/peanut/peanut.go | 7 ++++- 4 files changed, 43 insertions(+), 18 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index f6abce642..79e80fc69 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -140,7 +140,18 @@ func (t *ControllableTask) Launch() error { } } - t.rpc = executorcmd.NewClient(t.tci.ControlPort, t.tci.ControlMode, controlTransport) + t.rpc = executorcmd.NewClient( + t.tci.ControlPort, + t.tci.ControlMode, + controlTransport, + log.WithPrefix("executorcmd"). + WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + }, + ), + ) if t.rpc == nil { err = errors.New("rpc client is nil") log.WithFields(logrus.Fields{ diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 63de737fb..0253950b5 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -39,15 +39,12 @@ import ( "google.golang.org/grpc" "github.com/AliceO2Group/Control/common/controlmode" - "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" "google.golang.org/grpc/status" ) -var log = logger.New(logrus.StandardLogger(), "executorcmd") - type ControlTransport uint32 const ( ProtobufTransport = ControlTransport(0) @@ -56,7 +53,12 @@ const ( const GRPC_DIAL_TIMEOUT = 75 * time.Second // Very long timeout to work around very slow aliswmod issue -func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlTransport ControlTransport) *RpcClient { +func NewClient( + controlPort uint64, + controlMode controlmode.ControlMode, + controlTransport ControlTransport, + log *logrus.Entry, +) *RpcClient { endpoint := fmt.Sprintf("127.0.0.1:%d", controlPort) controlTransportS := "Protobuf" if controlTransport == JsonTransport { @@ -92,6 +94,7 @@ func NewClient(controlPort uint64, controlMode controlmode.ControlMode, controlT log.WithFields(logrus.Fields{"endpoint": endpoint, "controlMode": controlMode.String()}).Debug("instantiating new transitioner") client.Transitioner = transitioner.NewTransitioner(controlMode, client.doTransition) + client.log = log return client } @@ -100,6 +103,7 @@ type RpcClient struct { conn *grpc.ClientConn Transitioner transitioner.Transitioner TaskCmd *exec.Cmd + log *logrus.Entry } func (r *RpcClient) Close() error { @@ -111,7 +115,7 @@ func (r *RpcClient) FromDeviceState(state string) string { } func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, err error) { - log.WithField("event", ei.Evt). + r.log.WithField("event", ei.Evt). Debug("executor<->occplugin interface requesting transition") var response *pb.TransitionReply @@ -123,7 +127,7 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er } for k, v := range ei.Args { cfg = append(cfg, &pb.ConfigEntry{Key: k, Value: v}) - log.WithField("key", k). + r.log.WithField("key", k). WithField("value", v). Debug("pushing argument") } @@ -136,31 +140,29 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er SrcState: ei.Src, }, grpc.EmptyCallOption{}) - log.Debug("response received, about to parse status") - if err != nil { // We must process the error explicitly here, otherwise we get an error because gRPC's // Status is different from what gogoproto expects. status, ok := status.FromError(err) if ok { - log.Debug("got status from error") - log.WithFields(logrus.Fields{ + r.log.WithFields(logrus.Fields{ "code": status.Code().String(), "message": status.Message(), "details": status.Details(), "error": status.Err().Error(), "ppStatus": pp.Sprint(status), - "ppErr": pp.Sprint(err), }). Error("transition call error") err = errors.New(fmt.Sprintf("occplugin returned %s: %s", status.Code().String(), status.Message())) } else { err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") + r.log.WithField("error", "invalid gRPC status response received from occplugin"). + Error("transition call error") } return } + taskId, _ := r.log.Data["id"] if response != nil && response.GetOk() && response.GetTrigger() == pb.StateChangeTrigger_EXECUTOR && @@ -168,16 +170,18 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er response.GetState() == ei.Dst { newState = response.GetState() err = nil + r.log.WithField("dst", newState).Debug("occ transition complete") } else if response != nil { newState = response.GetState() - err = errors.New(fmt.Sprintf("transition unsuccessful: ok: %s, trigger: %s, event: %s, state: %s", + err = fmt.Errorf("transition unsuccessful: ok: %s, trigger: %s, event: %s, state: %s, id: %s", strconv.FormatBool(response.GetOk()), response.GetTrigger().String(), response.GetTransitionEvent(), - response.GetState())) + response.GetState(), + taskId) } else { newState = "" - err = errors.New("transition unsuccessful: invalid response but no gRPC error") + err = fmt.Errorf("transition unsuccessful: id: %s invalid response but no gRPC error", taskId) } return } \ No newline at end of file diff --git a/executor/executorcmd/nopb/test/main.go b/executor/executorcmd/nopb/test/main.go index ceae677aa..757417aa2 100644 --- a/executor/executorcmd/nopb/test/main.go +++ b/executor/executorcmd/nopb/test/main.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/k0kubun/pp" + log "github.com/sirupsen/logrus" "google.golang.org/grpc" ) @@ -43,7 +44,11 @@ func main() { targetPort, _ := strconv.Atoi(targetPortS) fmt.Printf("target port: %d", targetPort) - c := executorcmd.NewClient(uint64(targetPort), controlmode.FAIRMQ, executorcmd.JsonTransport) + c := executorcmd.NewClient( + uint64(targetPort), + controlmode.FAIRMQ, + executorcmd.JsonTransport, + log.WithField("id", "")) if c == nil { fmt.Println("client is nil") } diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index 30098a0d3..98cf76917 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -39,6 +39,7 @@ import ( "github.com/AliceO2Group/Control/occ/peanut/flatten" "github.com/gdamore/tcell" "github.com/rivo/tview" + log "github.com/sirupsen/logrus" "google.golang.org/grpc" ) @@ -289,7 +290,11 @@ func Run(cmdString string) (err error) { // Setup RPC go func() { // FIXME allow choice of controlmode.FAIRMQ - rpcClient = executorcmd.NewClient(occPort, controlmode.DIRECT, executorcmd.ProtobufTransport) + rpcClient = executorcmd.NewClient( + occPort, + controlmode.DIRECT, + executorcmd.ProtobufTransport, + log.WithField("id", "")) var response *pb.GetStateReply response, err = rpcClient.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { From d335a34b2276c351ba97020081db8aaed9691705 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 23 Nov 2020 12:08:20 +0100 Subject: [PATCH 0585/2352] [core] remove goroutine from transition_configure --- core/environment/transition_configure.go | 47 ------------------------ 1 file changed, 47 deletions(-) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index be4fb0536..318ca1961 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -190,52 +190,5 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return tasksStateErrors } - // This will subscribe to workflow state change. In case of workflow state - // ERROR will transition environment to ERROR state. The goroutine starts - // after a successful transition to CONFIGURE in order to handle only ERROR - // states triggered by mesos.(TASK_LOST,TASK_KILLED,TASK_FAILED,TASK_ERROR) - go func() { - wf := env.Workflow() - notify := make(chan task.State) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - wfState := wf.GetState() - if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: - for { - select { - case wfState = <-notify: - if wfState == task.DONE { - break WORKFLOW_STATE_LOOP - } - // We kill the goroutine on a reset or a teardown - // of the environment - if wfState == task.STANDBY { - break WORKFLOW_STATE_LOOP - } - if wfState == task.ERROR { - prvState := env.CurrentState() - env.setState(wfState.String()) - if prvState == "RUNNING" { - taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), - nil, - env.Id(), - ) - t.taskman.MessageChannel <- taskmanMessage - <-env.stateChangedCh - } - break WORKFLOW_STATE_LOOP - } - } - } - } - }() - return } From 71dd256afe38525e5ffb714aad4e44e08d764e92 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 23 Nov 2020 16:36:47 +0100 Subject: [PATCH 0586/2352] [core] handle workflow state error --- core/environment/environment.go | 55 +++++++++++++++++++++++++++++++++ core/environment/manager.go | 2 ++ 2 files changed, 57 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 763b27642..21155af15 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -43,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" + "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -65,6 +66,7 @@ type Environment struct { GlobalVars gera.StringMap // From Consul UserVars gera.StringMap // From user input stateChangedCh chan *event.TasksStateChangedEvent + unsubscribe chan struct{} } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -363,4 +365,57 @@ func (env *Environment) setState(state string) { env.Mu.Lock() defer env.Mu.Unlock() env.Sm.SetState(state) +} + +func (env *Environment) subscribeToWfState(taskman *task.Manager) { + go func() { + wf := env.Workflow() + notify := make(chan task.State) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + env.unsubscribe = make(chan struct{}) + + wfState := wf.GetState() + if wfState != task.ERROR { + WORKFLOW_STATE_LOOP: + for { + select { + case wfState = <-notify: + if wfState == task.ERROR { + env.setState(wfState.String()) + toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { + t.SetSafeToStop(true) + return t.IsSafeToStop() + }) + if len(toStop) > 0 { + taskmanMessage := task.NewTransitionTaskMessage( + toStop, + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + env.Id(), + ) + taskman.MessageChannel <- taskmanMessage + <-env.stateChangedCh + } + break WORKFLOW_STATE_LOOP + } + if wfState == task.DONE { + break WORKFLOW_STATE_LOOP + } + case <- env.unsubscribe: + env.unsubscribe = nil + break WORKFLOW_STATE_LOOP + } + } + } + }() +} + +func (env *Environment) unsubscribeFromWfState() { + if env.unsubscribe != nil { + env.unsubscribe <- struct{}{} + } } \ No newline at end of file diff --git a/core/environment/manager.go b/core/environment/manager.go index 859ea561e..c394ca5a7 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -126,6 +126,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh + env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -214,6 +215,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } delete(envs.m, environmentId) + env.unsubscribeFromWfState() return err } From dbab4925dfc4097a6469f702baa147effcf7be0a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 23 Nov 2020 18:06:55 +0100 Subject: [PATCH 0587/2352] [core] Fix hanging force shutdown --- core/environment/environment.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 21155af15..f4e47a7b9 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -400,9 +400,11 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { taskman.MessageChannel <- taskmanMessage <-env.stateChangedCh } + env.unsubscribe = nil break WORKFLOW_STATE_LOOP } if wfState == task.DONE { + env.unsubscribe = nil break WORKFLOW_STATE_LOOP } case <- env.unsubscribe: From d03302f65a4d0accd405b0baa12c47fa0d64f10f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Nov 2020 13:24:13 +0100 Subject: [PATCH 0588/2352] [build] Bump to v0.18.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7dffb704d..9b1815b3e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 18 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 35fbc1ab6a75fc9d948f40a9e746b1777433718a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Nov 2020 15:00:46 +0100 Subject: [PATCH 0589/2352] [core] Allow underscore in configuration path --- configuration/componentcfg/componentcfg.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index 69be78fc5..6058c9dca 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -38,7 +38,7 @@ const ( ) var ( - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+){1}(\@[0-9]+)?$`) + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) ) func IsInputCompEntryTsValid(input string) bool { From d77cef2c954f40fc442e4e731801febd45f69ec7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Nov 2020 16:20:38 +0100 Subject: [PATCH 0590/2352] [executor] Tweak timeout system for the task kill procedure --- executor/executable/controllabletask.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 79e80fc69..650435c06 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -47,6 +47,7 @@ import ( const( KILL_TIMEOUT = 3*time.Second + KILL_TRANSITION_TIMEOUT = 3*time.Second TRANSITION_TIMEOUT = 10*time.Second ) @@ -421,11 +422,11 @@ func (t *ControllableTask) Kill() error { reachedState != "ERROR" { cmd := nextTransition(reachedState) log.WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - }). + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + }). Debug("state DONE not reached, about to commit transition") // Call cmd.Commit() asynchronous @@ -440,7 +441,7 @@ func (t *ControllableTask) Kill() error { var commitResponse *CommitResponse select { case commitResponse = <-commitDone: - case <-time.After(15 * time.Second): + case <-time.After(KILL_TRANSITION_TIMEOUT): log.Error("deadline exceeded") } // timeout we should break @@ -519,13 +520,13 @@ func (t *ControllableTask) Kill() error { WithField("taskId", t.ti.GetTaskID()). Warning("could not gracefully kill task") } + time.Sleep(KILL_TIMEOUT) } - time.Sleep(KILL_TIMEOUT) if !pidExists(pid) { return killErr } } - case <-time.After(TRANSITION_TIMEOUT): + case <-time.After(KILL_TRANSITION_TIMEOUT): } killErr := syscall.Kill(pid, syscall.SIGKILL) From 29328c72c9ebaf442751533d22c4116408fd74e3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Nov 2020 16:47:27 +0100 Subject: [PATCH 0591/2352] [executor] Always use the shell PGID as backup PID for killing --- executor/executable/controllabletask.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 650435c06..8e910233f 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -46,7 +46,7 @@ import ( ) const( - KILL_TIMEOUT = 3*time.Second + KILL_TIMEOUT = 2*time.Second KILL_TRANSITION_TIMEOUT = 3*time.Second TRANSITION_TIMEOUT = 10*time.Second ) @@ -207,7 +207,14 @@ func (t *ControllableTask) Launch() error { break } else if reachedState == "DONE" || reachedState == "ERROR" { // something went wrong, the device moved to DONE or ERROR on startup - _ = syscall.Kill(t.knownPid, syscall.SIGKILL) + pid := t.knownPid + if pid == 0 { + // The pid was never known through a successful `GetState` in the lifetime + // of this process, so we must rely on the PGID of the containing shell + pid = -t.rpc.TaskCmd.Process.Pid + } + + _ = syscall.Kill(pid, syscall.SIGKILL) log.WithField("task", t.ti.Name).Debug("task killed") t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") From 9feec2a5d6794987fa71473552ebb6bbc0ddbb19 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Nov 2020 16:50:57 +0100 Subject: [PATCH 0592/2352] [executor] Further tweak kill timeouts --- executor/executable/controllabletask.go | 43 ++++++++++++++++--------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8e910233f..3d9cab145 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -46,8 +46,9 @@ import ( ) const( - KILL_TIMEOUT = 2*time.Second - KILL_TRANSITION_TIMEOUT = 3*time.Second + SIGTERM_TIMEOUT = 1*time.Second + SIGINT_TIMEOUT = 3*time.Second + KILL_TRANSITION_TIMEOUT = 1*time.Second TRANSITION_TIMEOUT = 10*time.Second ) @@ -449,7 +450,8 @@ func (t *ControllableTask) Kill() error { select { case commitResponse = <-commitDone: case <-time.After(KILL_TRANSITION_TIMEOUT): - log.Error("deadline exceeded") + log.WithField("task", t.ti.TaskID.Value). + Warn("teardown transition sequence timed out") } // timeout we should break if commitResponse == nil { @@ -458,22 +460,28 @@ func (t *ControllableTask) Kill() error { log.WithField("newState", commitResponse.newState). WithError(commitResponse.transitionError). + WithField("task", t.ti.TaskID.Value). Debug("transition committed") if commitResponse.transitionError != nil || len(cmd.Event) == 0 { - log.WithError(commitResponse.transitionError).Error("cannot gracefully end task") + log.WithError(commitResponse.transitionError). + WithField("task", t.ti.TaskID.Value). + Warn("teardown transition sequence error") break } reachedState = commitResponse.newState } - log.Debug("end transition loop done") + log.WithField("task", t.ti.TaskID.Value). + Debug("teardown transition sequence done") pid = int(response.GetPid()) if pid == 0 { // t.knownPid must be valid because GetState was sure to have been successful in the past pid = t.knownPid } - } else { - log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Warn("cannot query task status for graceful process termination") + } else { // If a true PID was never acquired during the lifetime of this task + log.WithError(err). + WithField("taskId", t.ti.GetTaskID()). + Warn("cannot query task status for graceful process termination") pid = t.knownPid if pid == 0 { // The pid was never known through a successful `GetState` in the lifetime @@ -486,7 +494,8 @@ func (t *ControllableTask) Kill() error { // terminate the shell that is wrapping the command, so we avoid using // negative PID is all other cases in order to allow FairMQ cleanup to // run. - log.WithError(err).WithField("taskId", t.ti.GetTaskID()).Warn("task PID not known from task, using containing shell PGID") + log.WithError(err).WithField("taskId", t.ti.GetTaskID()). + Warn("task PID not known from task, using containing shell PGID") } } @@ -494,10 +503,12 @@ func (t *ControllableTask) Kill() error { t.rpc = nil if reachedState == "DONE" { - log.Debug("task exited correctly") + log.WithField("taskId", t.ti.TaskID.Value). + Debug("task exited correctly") t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED } else { // something went wrong - log.Debug("task killed") + log.WithField("taskId", t.ti.TaskID.Value). + Debug("task killed") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } @@ -507,7 +518,7 @@ func (t *ControllableTask) Kill() error { if err != nil { log.WithError(err). WithField("taskId", t.ti.GetTaskID()). - Warning("could not gracefully kill task") + Warning("task SIGTERM failed") } killErrCh <- err }() @@ -517,7 +528,7 @@ func (t *ControllableTask) Kill() error { select { case killErr := <- killErrCh: if killErr == nil { - time.Sleep(KILL_TIMEOUT) + time.Sleep(SIGTERM_TIMEOUT) // Waiting for the SIGTERM to kick in if pidExists(pid) { // SIGINT for the "Waiting for graceful device shutdown. // Hit Ctrl-C again to abort immediately" message. @@ -525,22 +536,22 @@ func (t *ControllableTask) Kill() error { if killErr != nil { log.WithError(killErr). WithField("taskId", t.ti.GetTaskID()). - Warning("could not gracefully kill task") + Warning("task SIGINT failed") } - time.Sleep(KILL_TIMEOUT) + time.Sleep(SIGINT_TIMEOUT) } if !pidExists(pid) { return killErr } } - case <-time.After(KILL_TRANSITION_TIMEOUT): + case <-time.After(SIGTERM_TIMEOUT + SIGINT_TIMEOUT): } killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { log.WithError(killErr). WithField("taskId", t.ti.GetTaskID()). - Warning("could not kill task") + Warning("task SIGKILL failed") } return killErr From 21cdac43076ccb5a9a08faaaa7ce7ab9150bd608 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 Nov 2020 16:07:32 +0100 Subject: [PATCH 0593/2352] [misc] Gather more metrics in the test script --- hacking/test.sh | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/hacking/test.sh b/hacking/test.sh index ac6b67583..59fec89b4 100755 --- a/hacking/test.sh +++ b/hacking/test.sh @@ -29,6 +29,7 @@ # Configuration +HOST="centosvmtest2" ENVCREATE_FILE="envcreate.csv" ENVSTART_FILE="envstart.csv" @@ -45,7 +46,7 @@ if [ -z ${1+x} ]; then ITERATIONS=1; else ITERATIONS=$1; fi # Prepare create command... read -r -d '' CMD_CREATE << EOM -coconut e c -w readout-dataflow@master -e '{"hosts":["centosvmtest0"],"dd_enabled":"true","qcdd_enabled":"true"}' +coconut e c -w readout-dataflow@master -e '{"hosts":["$HOST"],"dd_enabled":"true","qcdd_enabled":"true"}' EOM # Zero the output files @@ -54,7 +55,7 @@ truncate -s 0 $ENVSTART_FILE # Main loop starts here -echo "iter\tenv \tcreate\tstart" +echo "iter\tenv \twarm\tcreate\tstart\tdestroy\troster\tzombies\tshmmon\tshmfiles" for ((iter=0; iter<$ITERATIONS; iter++)); do @@ -93,6 +94,8 @@ for ((iter=0; iter<$ITERATIONS; iter++)); do # EOM ### END TEST CODE + WARM_START=`ssh root@$HOST pgrep -f 'o2control-executor' -c` + OUTPUT=$({time (eval $CMD_START)} 2>&1) # sleep 1 START_TIME=`echo $OUTPUT|grep "total time:"|awk '{ print $3}'` @@ -100,11 +103,24 @@ for ((iter=0; iter<$ITERATIONS; iter++)); do # Append measured time to file csv_append $ENVSTART_FILE $START_TIME - coconut e d -f $ENV > /dev/null 2>&1 + CMD_DESTROY="coconut e d -f $ENV" + OUTPUT=$({time (eval $CMD_DESTROY)} 2>&1) + DESTROY_TIME=`echo $OUTPUT|grep "total time:"|awk '{ print $3}'` + + COCONUT_TASKS_LEFT_OVER="$(( `coconut t l|wc -l` - 1))" + ZOMBIE_TASKS=`ssh root@$HOST pgrep -f 'OCCPlugin' -c` + + # Experimentally determined that shmmonitor needs about 3s to clean up and die + sleep 3 + + SHMMONITOR_RUNNING=`ssh root@$HOST pgrep -f 'fairmq-shmmonitor' -c` + + SHM_LINES=`ssh root@$HOST ls /dev/shm|wc -l` + # sleep 1 - ssh root@centosvmtest0 rm -rf "/dev/shm/*" + ssh root@$HOST rm -rf "/dev/shm/*" - echo "${(l:3::0:)iter}\t$ENV\t$CREATE_TIME\t$START_TIME" + echo "${(l:3::0:)iter}\t$ENV\t$WARM_START\t$CREATE_TIME\t$START_TIME\t$DESTROY_TIME\t$COCONUT_TASKS_LEFT_OVER\t$ZOMBIE_TASKS\t$SHMMONITOR_RUNNING\t$SHM_LINES" done ENDTIME=$(date +%s.%N) From bd1712f550a07598b8a1e6773029f0ef53cf621b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 27 Nov 2020 13:12:47 +0100 Subject: [PATCH 0594/2352] [odcshim] Correctly handle early GetState calls --- odcshim/occserver/occserver.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go index bbfe776a9..87313ba0b 100644 --- a/odcshim/occserver/occserver.go +++ b/odcshim/occserver/occserver.go @@ -159,16 +159,20 @@ func (s *OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) ( return nil, status.Errorf(codes.Internal, "ODC not connected") } - // Provisional response + // Provisional response STANDBY when we know we're connected but haven't + // reached CONFIGURE yet so we don't have an envId to use for an ODC.GetState call rep := &pb.GetStateReply{ - State: "UNKNOWN", + State: "STANDBY", } - newState, err := handleGetState(ctx, s.odcClient, s.environmentId) - if err == nil { - rep.State = newState + if len(s.environmentId) > 0 { + newState, err := handleGetState(ctx, s.odcClient, s.environmentId) + if err == nil { + rep.State = newState + } + return rep, err } - return rep, err + return rep, nil } func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionRequest) (*pb.TransitionReply, error) { From 46501e86ea73327321c394fbefd0bff37e782d58 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Dec 2020 14:55:23 +0100 Subject: [PATCH 0595/2352] [occ] Avoid using private namespace in gRPC --- occ/plugin/OccLiteServer.cxx | 6 +++--- occ/plugin/OccLiteServer.h | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 833e183ba..e7f1efbaa 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -70,7 +70,7 @@ OccLite::Service::Service(fair::mq::PluginServices* pluginServices) AddMethod(eventStream); } -::grpc::Status OccLite::Service::GetState(::grpc_impl::ServerContext* context, +::grpc::Status OccLite::Service::GetState(::grpc::ServerContext* context, const OccLite::nopb::GetStateRequest* request, OccLite::nopb::GetStateResponse* response) { @@ -89,7 +89,7 @@ ::grpc::Status OccLite::Service::GetState(::grpc_impl::ServerContext* context, return grpc::Status::OK; } -::grpc::Status OccLite::Service::Transition(::grpc_impl::ServerContext* context, +::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, const OccLite::nopb::TransitionRequest* request, OccLite::nopb::TransitionResponse* response) { @@ -108,7 +108,7 @@ ::grpc::Status OccLite::Service::Transition(::grpc_impl::ServerContext* context, ::grpc::Status -OccLite::Service::EventStream(::grpc_impl::ServerContext* context, const OccLite::nopb::EventStreamRequest* request, +OccLite::Service::EventStream(::grpc::ServerContext* context, const OccLite::nopb::EventStreamRequest* request, ::grpc::ServerWriter* writer) { (void) context; diff --git a/occ/plugin/OccLiteServer.h b/occ/plugin/OccLiteServer.h index 5e2a23dfa..45d200fcc 100644 --- a/occ/plugin/OccLiteServer.h +++ b/occ/plugin/OccLiteServer.h @@ -29,7 +29,7 @@ #include #include -#include +#include #include @@ -60,15 +60,15 @@ class Service : public ::grpc::Service virtual ~Service() {} - ::grpc::Status EventStream(::grpc_impl::ServerContext* context, + ::grpc::Status EventStream(::grpc::ServerContext* context, const nopb::EventStreamRequest* request, ::grpc::ServerWriter* writer); - ::grpc::Status GetState(::grpc_impl::ServerContext*, + ::grpc::Status GetState(::grpc::ServerContext*, const nopb::GetStateRequest*, nopb::GetStateResponse*); - ::grpc::Status Transition(::grpc_impl::ServerContext* context, + ::grpc::Status Transition(::grpc::ServerContext* context, const nopb::TransitionRequest* request, nopb::TransitionResponse* response); From 010b9debeb4df6c6bbce57603e39a06095b5464e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Dec 2020 15:05:13 +0100 Subject: [PATCH 0596/2352] [build] Bump to v0.18.90 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9b1815b3e..fbefd1da8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 18 -VERSION_PATCH := 2 +VERSION_PATCH := 90 From a23de7e49c9370cf95e271e5d5a02ef5125af140 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 10 Dec 2020 11:22:29 +0100 Subject: [PATCH 0597/2352] Makefile pretty print on macOS --- Makefile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile b/Makefile index 78f290b0e..41018e77f 100644 --- a/Makefile +++ b/Makefile @@ -80,19 +80,19 @@ install: $(INSTALL_WHAT) # @for w in $(WHAT); do \ # FLAGS="WHAT_$${w}_BUILD_FLAGS"; \ # echo -e "${$${FLAGS}}"; \ -# echo -e "\e[1;33mgo install\e[0m ./cmd/$$w \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$$w\e[0m"; \ +# echo -e "\033[1;33mgo install\033[0m ./cmd/$$w \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/$$w\033[0m"; \ # $(WHAT_$${w}_BUILD_FLAGS) go install $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$$w; \ # done $(WHAT): # @echo -e "WHAT_$@_BUILD_FLAGS $(WHAT_$@_BUILD_FLAGS)" - @echo -e "\e[1;33mgo build -mod=vendor\e[0m ./cmd/$@ \e[1;33m==>\e[0m \e[1;34m./bin/$@\e[0m" + @echo -e "\033[1;33mgo build -mod=vendor\033[0m ./cmd/$@ \033[1;33m==>\033[0m \033[1;34m./bin/$@\033[0m" # @echo ${PWD} @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ $(INSTALL_WHAT): # @echo -e "WHAT_$(@:install_%=%)_BUILD_FLAGS $(WHAT_$(@:install_%=%)_BUILD_FLAGS)" - @echo -e "\e[1;33mgo install -mod=vendor\e[0m ./cmd/$(@:install_%=%) \e[1;33m==>\e[0m \e[1;34m$$GOPATH/bin/$(@:install_%=%)\e[0m" + @echo -e "\033[1;33mgo install -mod=vendor\033[0m ./cmd/$(@:install_%=%) \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/$(@:install_%=%)\033[0m" # @echo ${PWD} @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) @@ -101,7 +101,7 @@ ifndef HAS_GOGOPROTO $(MAKE) tools/protoc endif @for gendir in $(GENERATE_DIRS); do \ - echo -e "\e[1;33mgo generate\e[0m $$gendir"; \ + echo -e "\033[1;33mgo generate\033[0m $$gendir"; \ PATH="$(GOPATH)/bin:$$PATH" go generate $(VERBOSE_$(V)) $$gendir; \ done @@ -119,21 +119,21 @@ fmt: clean: @rm -rf ./bin/* - @echo -e "clean done: \e[1;34mbin\e[0m" + @echo -e "clean done: \033[1;34mbin\033[0m" cleanall: @rm -rf bin tools vendor - @echo -e "clean done: \e[1;34mbin tools vendor\e[0m" + @echo -e "clean done: \033[1;34mbin tools vendor\033[0m" vendor: - @echo -e "\e[1;33mgo mod vendor\e[0m" + @echo -e "\033[1;33mgo mod vendor\033[0m" @go mod vendor - @echo -e "\e[1;33mcurl odc.proto\e[0m" + @echo -e "\033[1;33mcurl odc.proto\033[0m" @mkdir -p odcshim/odcprotos @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto # vendor: tools/dep -# @echo -e "\e[1;33mdep ensure\e[0m" +# @echo -e "\033[1;33mdep ensure\033[0m" # @./tools/dep ensure # @mkdir -p vendor/infoLoggerForGo @@ -153,7 +153,7 @@ tools/protoc: docs: doc doc: - @echo -e "generating coconut documentation \e[1;33m==>\e[0m \e[1;34m./coconut/doc\e[0m" + @echo -e "generating coconut documentation \033[1;33m==>\033[0m \033[1;34m./coconut/doc\033[0m" @cd coconut/doc && go run . help: From 1591cc554bddff860b787bbc8c29cc3bfcd64c61 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Dec 2020 13:36:09 +0100 Subject: [PATCH 0598/2352] [build] Update Go version for GitHub actions --- .github/workflows/control.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 663dfe15b..e66d4e87e 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,11 +13,11 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-18.04] - go: [ '1.14', '1.15' ] + go: [ '1.15.6' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 with: go-version: ${{matrix.go}} - run: (make vendor) - - run: (make) \ No newline at end of file + - run: (make) From 3a3f3e9bbfc53ee53966a083a7e1704103826c69 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Dec 2020 14:08:40 +0100 Subject: [PATCH 0599/2352] [core] Bump to v0.19.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index fbefd1da8..8a837f64e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 18 -VERSION_PATCH := 90 +VERSION_MINOR := 19 +VERSION_PATCH := 0 From 740f269973d435c75aec6725f048734bbff9b95c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 5 Jan 2021 15:13:46 +0100 Subject: [PATCH 0600/2352] [misc] New script to create FLP-compatible LXD containers on demand --- hacking/newcontainer.sh | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 hacking/newcontainer.sh diff --git a/hacking/newcontainer.sh b/hacking/newcontainer.sh new file mode 100644 index 000000000..4f1eb1a55 --- /dev/null +++ b/hacking/newcontainer.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# Requirements: +# LXD installed and running +# created profile "macvlan" to enable host bridge networking +# +# Usage: +# ./newcontainer.sh hostname1 hostname2 hostname3... + + +echo -n New password for container root: +read -s ROOTPASS +echo + +for GUEST in "$@" +do + echo guest is $GUEST + lxc launch images:centos/7/amd64 $GUEST -p default -p macvlan + + # Normally we'd use lxc-wait, but it's broken as of Nov 2020 + #lxc-wait -n $GUEST -s RUNNING + # Workaround: + lxc exec $GUEST -- bash -c 'while [ "$(systemctl is-system-running 2>/dev/null)" != "running" ] && [ "$(systemctl is-system-running 2>/dev/null)" != "degraded" ]; do :; done' + + # Set root password + lxc exec $GUEST -- bash -c "echo 'root:$ROOTPASS' | chpasswd" + lxc exec $GUEST -- bash -c "yum -y install openssh-server sudo nano which numactl-libs firewalld" + + # Set persistent hostname + lxc exec $GUEST -- bash -c "hostnamectl set-hostname $GUEST" + + # Allow root login + lxc exec $GUEST -- bash -c "sed -i 's/#PermitRootLogin yes/PermitRootLogin yes/g' /etc/ssh/sshd_config" + lxc exec $GUEST -- bash -c "systemctl restart sshd" + lxc exec $GUEST -- bash -c "systemctl enable sshd" +done From eb836384ef80bb56f5b0530ea5b761fd43721bff Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Jan 2021 17:01:34 +0100 Subject: [PATCH 0601/2352] [misc] Better wording for new root password prompt --- hacking/newcontainer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hacking/newcontainer.sh b/hacking/newcontainer.sh index 4f1eb1a55..b82ef80dd 100644 --- a/hacking/newcontainer.sh +++ b/hacking/newcontainer.sh @@ -8,7 +8,7 @@ # ./newcontainer.sh hostname1 hostname2 hostname3... -echo -n New password for container root: +echo -n New root password for containers $@: read -s ROOTPASS echo From 72435d4dcd796d54ad1acd415b7fee495693877b Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 11 Jan 2021 10:40:39 +0100 Subject: [PATCH 0602/2352] [core] Fix clean up after failed creation of a new environment --- core/environment/manager.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index c394ca5a7..71ce26cda 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -137,7 +137,23 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envState := env.CurrentState() envTasks := env.Workflow().GetTasks() taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) + pendingCh := make(chan *event.TasksReleasedEvent) + envs.pendingTeardownsCh[env.Id()] = pendingCh envs.taskman.MessageChannel <- taskmanMessage + + incomingEv := <- pendingCh + + // If some tasks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": env.Id().String(), + }). + WithError(err). + Warn("task failed to release") + } + } // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) // if rlsErr != nil { // log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") @@ -167,6 +183,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }). Warn("environment deployment failed, tasks were cleaned up") + // close state channels + close(envs.pendingStateChangeCh[env.Id()]) + delete(envs.pendingStateChangeCh, env.Id()) + return env.id, err } From 9b9921b568519883a3b471ee2699b09bd8e46282 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jan 2021 12:02:43 +0100 Subject: [PATCH 0603/2352] [build] Bump to v0.19.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8a837f64e..ad5d87e50 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 19 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From b760f1d23b98f24d2abedde5dff1856373448e04 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Jan 2021 14:09:49 +0100 Subject: [PATCH 0604/2352] [executor] stderr output of controlled processes now forwarded at DebugLevel OCTRL-362 #close --- executor/executable/basictaskcommon.go | 2 +- executor/executable/controllabletask.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 3373c6ced..87aee254d 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -69,7 +69,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { var stdoutBuf, stderrBuf bytes.Buffer stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) - stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel) + stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) // Each of these multiwriters will push incoming lines to a buffer as well as the logger stdout := io.MultiWriter(stdoutLog, &stdoutBuf) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 3d9cab145..8b81e5bd9 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -120,7 +120,7 @@ func (t *ControllableTask) Launch() error { _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.ErrorLevel), stderrIn) + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stderrIn) }() log.WithFields(logrus.Fields{ From 85faf5b74f2f30f1a9a14d7cad10813646367c32 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Jan 2021 14:53:02 +0100 Subject: [PATCH 0605/2352] [common] Strip newlines from outbound InfoLogger messages OCTRL-361 #close --- common/logger/infologger/directhook.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 6c927a223..e3b720caf 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -30,6 +30,7 @@ import ( "net" "os" "os/user" + "regexp" "runtime" "sort" "strconv" @@ -45,6 +46,8 @@ var ( username string ) +var lineBreaksRe = regexp.MustCompile(`\r?\n`) + func init() { var err error pid = fmt.Sprintf("%d", os.Getpid()) @@ -58,6 +61,7 @@ func init() { if err != nil { return } + // We only take the short hostname hostname = strings.Split(hostname, ".")[0] } @@ -90,6 +94,11 @@ func (s *sender) format(fields map[string]string, version protoVersion) string { stringLog += value } } + + // We sanitize away all linebreaks from the payload, and then we append one. + // This is necessary because IL treats \n as a message terminator character. + stringLog = lineBreaksRe.ReplaceAllString(stringLog, " ") + return stringLog + "\n" } From 9d3d1e19e24bc1e742f60979131c587162f992ca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Jan 2021 09:21:47 +0100 Subject: [PATCH 0606/2352] [core] Reduce log verbosity --- core/task/scheduler.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 872a5e92f..8ecf10463 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -515,7 +515,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "resources": remainingResourcesInOffer.String(), "attributes": offerAttributes.String(), }). - Warn("descriptor constraints not satisfied by offer attributes") + Trace("descriptor constraints not satisfied by offer attributes") } continue } @@ -536,7 +536,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "offerId": offer.ID.Value, "resources": remainingResourcesInOffer.String(), }). - Warn("descriptor wants not satisfied by offer resources") + Trace("descriptor wants not satisfied by offer resources") } continue } From f4ffb6956bf66cd211b3cd34dfc275bceab092e5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Jan 2021 10:19:28 +0100 Subject: [PATCH 0607/2352] [executor] Pipe controlled task stdout/stderr at TRACE level --- executor/executable/basictaskcommon.go | 4 ++-- executor/executable/controllabletask.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 87aee254d..88cb73f8b 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -68,8 +68,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { var errStdout, errStderr error var stdoutBuf, stderrBuf bytes.Buffer - stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) - stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel) + stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel) + stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel) // Each of these multiwriters will push incoming lines to a buffer as well as the logger stdout := io.MultiWriter(stdoutLog, &stdoutBuf) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8b81e5bd9..819385600 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -117,10 +117,10 @@ func (t *ControllableTask) Launch() error { Debug("task launched") go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stdoutIn) + _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel), stdoutIn) }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.DebugLevel), stderrIn) + _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel), stderrIn) }() log.WithFields(logrus.Fields{ From 73d7efc779e15983aa22e53b70c9650584097fd4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 22 Jan 2021 09:57:52 +0100 Subject: [PATCH 0608/2352] [core] Fix deadlock when unsubscribing from Wf state --- core/environment/environment.go | 12 +++++++----- core/environment/manager.go | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index f4e47a7b9..cae462a2c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -400,15 +400,12 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { taskman.MessageChannel <- taskmanMessage <-env.stateChangedCh } - env.unsubscribe = nil break WORKFLOW_STATE_LOOP } if wfState == task.DONE { - env.unsubscribe = nil break WORKFLOW_STATE_LOOP } case <- env.unsubscribe: - env.unsubscribe = nil break WORKFLOW_STATE_LOOP } } @@ -417,7 +414,12 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { } func (env *Environment) unsubscribeFromWfState() { - if env.unsubscribe != nil { - env.unsubscribe <- struct{}{} + // Use select to unblock in case the above goroutine + // exits due to an ERROR state. If that's the case + // we close the channel. + select { + case env.unsubscribe <- struct{}{}: + default: + close(env.unsubscribe) } } \ No newline at end of file diff --git a/core/environment/manager.go b/core/environment/manager.go index 71ce26cda..8f402e8cf 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -126,7 +126,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh - env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -189,6 +188,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } + env.subscribeToWfState(envs.taskman) return env.id, err } From 47a136d2b81e51f51aeb187338b2fafa50df91a3 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 22 Jan 2021 09:59:08 +0100 Subject: [PATCH 0609/2352] [common] Fix nil pointer crash when event is nil --- common/event/tasksreleasedevent.go | 9 +++++++++ common/event/taskstatechangedevent.go | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/common/event/tasksreleasedevent.go b/common/event/tasksreleasedevent.go index c218ee704..635fdc755 100644 --- a/common/event/tasksreleasedevent.go +++ b/common/event/tasksreleasedevent.go @@ -41,14 +41,23 @@ func (tr *TasksReleasedEvent) GetName() string { } func (tr *TasksReleasedEvent) GetEnvironmentId() uid.ID { + if tr == nil { + return "" + } return tr.EnvironmentId } func (tr *TasksReleasedEvent) GetTaskIds() []string { + if tr == nil { + return nil + } return tr.TaskIdsReleased } func (tr *TasksReleasedEvent) GetTaskReleaseErrors() map[string]error { + if tr == nil { + return nil + } return tr.TaskReleaseErrors } diff --git a/common/event/taskstatechangedevent.go b/common/event/taskstatechangedevent.go index aac107eb6..f316bb6b0 100644 --- a/common/event/taskstatechangedevent.go +++ b/common/event/taskstatechangedevent.go @@ -41,14 +41,23 @@ func (tr *TasksStateChangedEvent) GetName() string { } func (tr *TasksStateChangedEvent) GetEnvironmentId() uid.ID { + if tr == nil { + return "" + } return tr.EnvironmentId } func (tr *TasksStateChangedEvent) GetTaskIds() []string { + if tr == nil { + return nil + } return tr.TaskIdsStateChanged } func (tr *TasksStateChangedEvent) GetTasksStateChangedError() error { + if tr == nil { + return nil + } return tr.TaskStateChangedErr } From 02518ff68bb7f830b0f307e76599d9d66da14de8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 22 Jan 2021 12:16:18 +0100 Subject: [PATCH 0610/2352] [core] Fix data race when gathering responses --- core/controlcommands/commandqueue.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 4a4ca3bcd..063e42e35 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -112,9 +112,15 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon return nil, errors.New("command queue is nil") } + type _responseSemaphore struct{ + receiver MesosCommandTarget + response MesosCommandResponse + err error + } + // Parallel for sendErrorList := make([]error, 0) - semaphore := make(chan empty, len(command.targets())) + semaphore := make(chan _responseSemaphore, len(command.targets())) responses := make(map[MesosCommandTarget]MesosCommandResponse) @@ -136,10 +142,12 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon res, err := m.servent.RunCommand(singleCommand, receiver) if err != nil { log.WithError(err).Warning("MesosCommand send error") - sendErrorList = append(sendErrorList, err) - responses[receiver] = res - semaphore <- empty{} + semaphore <- _responseSemaphore{ + receiver: receiver, + response: res, + err: err, + } return } @@ -148,14 +156,20 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon "error": res.Err().Error(), }). Debug("received MesosCommandResponse") - responses[receiver] = res - semaphore <- empty{} + semaphore <- _responseSemaphore{ + receiver: receiver, + response: res, + } }(rec) } // Wait for goroutines to finish for i := 0; i < len(command.targets()); i++ { - <- semaphore + _respSemaphore := <- semaphore + responses[_respSemaphore.receiver] = _respSemaphore.response + if _respSemaphore.err != nil { + sendErrorList = append(sendErrorList, _respSemaphore.err) + } } close(semaphore) From b256d0ef55c585f7b0b4f469819448637313e73a Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 22 Jan 2021 12:27:07 +0100 Subject: [PATCH 0611/2352] [core] Remove underscore from variable name --- core/controlcommands/commandqueue.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 063e42e35..1a52d1b10 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -112,7 +112,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon return nil, errors.New("command queue is nil") } - type _responseSemaphore struct{ + type responseSemaphore struct{ receiver MesosCommandTarget response MesosCommandResponse err error @@ -120,7 +120,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon // Parallel for sendErrorList := make([]error, 0) - semaphore := make(chan _responseSemaphore, len(command.targets())) + semaphore := make(chan responseSemaphore, len(command.targets())) responses := make(map[MesosCommandTarget]MesosCommandResponse) @@ -143,7 +143,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon if err != nil { log.WithError(err).Warning("MesosCommand send error") - semaphore <- _responseSemaphore{ + semaphore <- responseSemaphore{ receiver: receiver, response: res, err: err, @@ -157,7 +157,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon }). Debug("received MesosCommandResponse") - semaphore <- _responseSemaphore{ + semaphore <- responseSemaphore{ receiver: receiver, response: res, } @@ -165,10 +165,10 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } // Wait for goroutines to finish for i := 0; i < len(command.targets()); i++ { - _respSemaphore := <- semaphore - responses[_respSemaphore.receiver] = _respSemaphore.response - if _respSemaphore.err != nil { - sendErrorList = append(sendErrorList, _respSemaphore.err) + respSemaphore := <- semaphore + responses[respSemaphore.receiver] = respSemaphore.response + if respSemaphore.err != nil { + sendErrorList = append(sendErrorList, respSemaphore.err) } } close(semaphore) From 10ac6aa0261fd04283093c39a73ec08ff5909371 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Jan 2021 17:12:44 +0100 Subject: [PATCH 0612/2352] [build] Bump to v0.19.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ad5d87e50..3e968f54f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 19 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 23d876782a763a0fcdbb1ef3bb442518fda24be0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Jan 2021 13:59:05 +0100 Subject: [PATCH 0613/2352] [core] Output sandbox log URI in each ShortTaskInfo OCTRL-380 #close --- coconut/control/control.go | 2 +- coconut/protos/o2control.pb.go | 430 ++++++++++++++++++--------------- core/protos/o2control.pb.go | 430 ++++++++++++++++++--------------- core/protos/o2control.proto | 1 + core/server.go | 14 +- core/serverutil.go | 30 ++- 6 files changed, 518 insertions(+), 389 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index d4801ab89..be4047709 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -483,7 +483,7 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a fmt.Fprintln(o, "no tasks running") } else { drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "status", "state","PID"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "status", "state", "PID"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 91254d084..89265c7ac 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -2386,6 +2386,7 @@ type ShortTaskInfo struct { ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2480,6 +2481,13 @@ func (m *ShortTaskInfo) GetPid() string { return "" } +func (m *ShortTaskInfo) GetSandboxStdout() string { + if m != nil { + return m.SandboxStdout + } + return "" +} + type TaskDeploymentInfo struct { Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` @@ -4261,198 +4269,199 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3048 bytes of a gzipped FileDescriptorProto + // 3069 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, - 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0xe9, 0x1f, 0xe8, 0x63, 0x5f, 0x0a, 0x14, 0xfb, 0x75, - 0xb7, 0xf7, 0x45, 0xc9, 0x4d, 0xf3, 0xd2, 0x37, 0xce, 0xec, 0xcc, 0xec, 0xec, 0xcc, 0xec, 0xcc, - 0xec, 0x1c, 0x61, 0x69, 0xe0, 0xb9, 0x81, 0xeb, 0xbf, 0xe5, 0xae, 0xb7, 0x5d, 0x27, 0xf0, 0x5c, - 0x7b, 0x8d, 0x23, 0x50, 0x25, 0x44, 0xe0, 0x25, 0x58, 0x6c, 0x8d, 0xa8, 0x13, 0x1c, 0x3d, 0xa4, - 0xbe, 0xeb, 0xef, 0x50, 0xd3, 0x0b, 0x8e, 0xa9, 0x19, 0x60, 0x1b, 0x9a, 0xad, 0xd1, 0x51, 0xcb, - 0x19, 0x59, 0x9e, 0xeb, 0xf4, 0xa9, 0x13, 0x1c, 0x04, 0x66, 0x40, 0x37, 0x7b, 0xa6, 0x73, 0x42, - 0x3b, 0x68, 0x11, 0x4a, 0x94, 0x71, 0x35, 0x8c, 0x55, 0xe3, 0x66, 0x85, 0x08, 0x00, 0x2d, 0xc1, - 0x94, 0xef, 0x0e, 0xbd, 0x36, 0x6d, 0x4c, 0x70, 0xb4, 0x84, 0xd0, 0x2a, 0x54, 0x3b, 0xd4, 0x0f, - 0x2c, 0xc7, 0x0c, 0x2c, 0xd7, 0x69, 0x4c, 0xf2, 0x45, 0x1d, 0x85, 0x37, 0x61, 0xa1, 0x35, 0x3a, - 0x3a, 0x34, 0xfd, 0xd3, 0xd8, 0x36, 0x4b, 0x30, 0x15, 0x98, 0xfe, 0xa9, 0xd5, 0x91, 0xfb, 0x48, - 0x88, 0x6d, 0xef, 0x33, 0x3a, 0xb9, 0x8f, 0x00, 0xf0, 0x7d, 0x76, 0x94, 0x50, 0xc8, 0xd0, 0x3f, - 0x4f, 0x0a, 0x53, 0x97, 0x13, 0x86, 0xea, 0x72, 0x08, 0xbf, 0x0e, 0x73, 0x52, 0xce, 0x03, 0x73, - 0xe8, 0xb4, 0x7b, 0xf9, 0x22, 0xb0, 0xc5, 0xf5, 0xe6, 0xa6, 0x63, 0xf4, 0x9b, 0x1e, 0x35, 0x03, - 0xda, 0x41, 0xd7, 0x61, 0x96, 0x11, 0x78, 0x54, 0x18, 0xc0, 0x97, 0x5c, 0x71, 0x24, 0x7a, 0x13, - 0xe6, 0xe9, 0x0b, 0xda, 0x1e, 0x06, 0xae, 0x47, 0x42, 0x4a, 0xa1, 0x4a, 0x7a, 0x01, 0x3f, 0x86, - 0x4b, 0x71, 0x87, 0xa8, 0xcd, 0x3e, 0x84, 0x2a, 0x8d, 0xb0, 0x7c, 0xab, 0xea, 0x7a, 0x73, 0x2d, - 0xf2, 0xb9, 0xc6, 0xb3, 0xeb, 0x74, 0x5d, 0xa2, 0x93, 0xe3, 0x9f, 0x1b, 0xb0, 0x1c, 0x97, 0xbb, - 0x45, 0xfd, 0xc0, 0x73, 0xcf, 0x68, 0x07, 0x7d, 0x1f, 0xe6, 0xdb, 0x36, 0x35, 0x9d, 0xe1, 0x80, - 0x1d, 0xce, 0x27, 0x74, 0x60, 0x9f, 0x49, 0xf9, 0x57, 0x34, 0xf9, 0x9b, 0x49, 0x1a, 0x92, 0x66, - 0x63, 0x26, 0xd1, 0xb6, 0xb5, 0x3a, 0xf2, 0xa0, 0x71, 0x24, 0xbe, 0xc4, 0xed, 0xa9, 0x29, 0xd3, - 0xf2, 0x3c, 0xd7, 0xc3, 0x0b, 0x30, 0xdf, 0x1a, 0x1d, 0x7d, 0x6a, 0xd9, 0x36, 0x97, 0xc8, 0xed, - 0x8d, 0xe7, 0x60, 0x56, 0xf8, 0x99, 0xd0, 0x2f, 0x86, 0xd4, 0x0f, 0xf0, 0x31, 0x54, 0x15, 0x82, - 0xed, 0x18, 0x06, 0x89, 0xa1, 0x05, 0x09, 0xba, 0x0b, 0xb3, 0xc2, 0xcd, 0x8f, 0x07, 0x1d, 0x33, - 0xe0, 0x06, 0x9f, 0xbc, 0x59, 0x5d, 0x5f, 0xd6, 0xce, 0x73, 0xa0, 0xad, 0x93, 0x38, 0x35, 0xfe, - 0x8b, 0x01, 0x33, 0xfa, 0x3a, 0x7a, 0x17, 0x4a, 0x36, 0x1d, 0x51, 0x9b, 0xef, 0x52, 0x5b, 0xbf, - 0x9a, 0x23, 0x67, 0xed, 0x01, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xad, 0x1f, 0xbb, 0x6e, 0xdc, - 0x1a, 0xd5, 0xf5, 0x6b, 0xba, 0xd7, 0x32, 0x6e, 0xe5, 0x4e, 0x81, 0x24, 0x18, 0xf1, 0x7b, 0x50, - 0xe2, 0xa2, 0x51, 0x05, 0x4a, 0x5b, 0xad, 0x8d, 0xc7, 0xdb, 0xf5, 0x02, 0x2a, 0x43, 0x71, 0x77, - 0xef, 0xfe, 0x7e, 0xdd, 0x40, 0x55, 0x98, 0x7e, 0x7a, 0x8f, 0xec, 0xed, 0xee, 0x6d, 0xd7, 0x27, - 0x18, 0x45, 0x8b, 0x90, 0x7d, 0x52, 0x9f, 0xdc, 0x98, 0x86, 0x12, 0x97, 0x8f, 0x7f, 0x36, 0x25, - 0x7f, 0xa1, 0x2b, 0x50, 0x09, 0xac, 0x3e, 0xf5, 0x03, 0xb3, 0x3f, 0x90, 0x26, 0x8b, 0x10, 0xc8, - 0x84, 0x65, 0x9a, 0x9d, 0x0b, 0xa4, 0xea, 0xdf, 0x8e, 0xa9, 0x9e, 0x97, 0x38, 0x76, 0x0a, 0x24, - 0x4f, 0x0e, 0x22, 0x80, 0x68, 0x2a, 0xba, 0x79, 0xb2, 0xa8, 0xae, 0xaf, 0xe6, 0x4a, 0x97, 0x74, - 0x3b, 0x05, 0x92, 0xc1, 0x8d, 0x1e, 0x40, 0x3d, 0x48, 0x24, 0x95, 0x46, 0x91, 0x4b, 0x5c, 0x89, - 0x4b, 0x4c, 0xa6, 0x9e, 0x9d, 0x02, 0x49, 0x71, 0xa2, 0x7d, 0x98, 0x0f, 0x92, 0xd9, 0xa5, 0x51, - 0xca, 0xf0, 0x5c, 0x3a, 0x09, 0xed, 0x14, 0x48, 0x9a, 0x17, 0x7d, 0x02, 0x33, 0x0c, 0x69, 0xcb, - 0x34, 0xd3, 0x98, 0x4a, 0xdf, 0xdd, 0x78, 0x22, 0xda, 0x29, 0x90, 0x18, 0x07, 0x3b, 0x60, 0x5f, - 0x65, 0x9f, 0xb6, 0x34, 0xd9, 0x74, 0xd6, 0x01, 0x93, 0x39, 0x8a, 0x1d, 0x30, 0xc9, 0x89, 0x3e, - 0x83, 0x45, 0x9a, 0x91, 0x08, 0x1a, 0x65, 0x2e, 0x11, 0xe7, 0x3a, 0x21, 0xa4, 0xdc, 0x29, 0x90, - 0x4c, 0x09, 0x4c, 0x4f, 0x9a, 0xb8, 0xd5, 0x8d, 0x4a, 0x96, 0x9e, 0xc9, 0xbb, 0xcf, 0xf4, 0x4c, - 0x72, 0xa2, 0xfb, 0x50, 0x3b, 0xb5, 0x6c, 0x3b, 0x08, 0x93, 0x41, 0x03, 0x52, 0x59, 0x29, 0x95, - 0x30, 0xd8, 0xe5, 0x89, 0x73, 0x6d, 0x54, 0x60, 0xfa, 0x91, 0x79, 0x66, 0xbb, 0x66, 0x07, 0x23, - 0xa8, 0x1f, 0x0c, 0x8f, 0xfd, 0xb6, 0x67, 0x1d, 0x53, 0x95, 0x50, 0x2e, 0xc3, 0xf2, 0x36, 0x0d, - 0xee, 0x7b, 0x66, 0x9f, 0x3e, 0x77, 0xbd, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0x6f, 0x0d, 0x98, 0x7e, - 0x42, 0x3d, 0xdf, 0x72, 0x1d, 0x96, 0x68, 0xfa, 0xe6, 0xe7, 0xae, 0xc7, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x2d, 0xc7, 0xf5, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0xec, 0xc0, 0x0c, 0xda, 0x3d, - 0x1e, 0xd7, 0x25, 0x22, 0x00, 0x86, 0x3d, 0x1e, 0x5a, 0xb6, 0x88, 0xcd, 0x0a, 0x11, 0x00, 0x2b, - 0x9b, 0x03, 0xcf, 0xed, 0x0c, 0xdb, 0xc1, 0x9e, 0xd9, 0xa7, 0x3c, 0xd0, 0x2a, 0x44, 0x47, 0xa1, - 0x15, 0x80, 0x91, 0x50, 0xe2, 0x20, 0xf0, 0x78, 0xf4, 0x54, 0x88, 0x86, 0xc1, 0xbf, 0x9c, 0x80, - 0x4b, 0xe9, 0x13, 0xb0, 0xe4, 0xb8, 0x0a, 0xd5, 0x6e, 0x88, 0x55, 0x55, 0x4d, 0x47, 0xf1, 0xea, - 0x14, 0xd9, 0xdd, 0xdf, 0x74, 0x87, 0x4e, 0x20, 0xcf, 0x92, 0x5e, 0x60, 0x9a, 0x70, 0xbb, 0x0a, - 0x32, 0x71, 0x38, 0x0d, 0x13, 0x25, 0xe3, 0xa2, 0x9e, 0x8c, 0x57, 0x00, 0x7a, 0xae, 0xaf, 0x84, - 0x97, 0x04, 0x57, 0x84, 0x41, 0x18, 0x66, 0x2c, 0xc7, 0x0f, 0x4c, 0xa7, 0x4d, 0xb9, 0x09, 0xc4, - 0x09, 0x63, 0x38, 0xf4, 0x26, 0x4c, 0xcb, 0x13, 0xcb, 0xc0, 0x47, 0x5a, 0x10, 0x48, 0x17, 0x11, - 0x45, 0xc2, 0x6a, 0xfb, 0x21, 0x35, 0xbd, 0x8e, 0xfb, 0xdc, 0x91, 0xae, 0x64, 0xb5, 0xdd, 0xa3, - 0xa6, 0xef, 0x3a, 0xaa, 0xb6, 0x0b, 0x88, 0xd5, 0x97, 0x88, 0x74, 0x60, 0x9f, 0xe1, 0x06, 0x2c, - 0x6d, 0xd3, 0x40, 0x0b, 0xd0, 0xb0, 0xf2, 0xbc, 0x80, 0xc5, 0xd4, 0xca, 0xc5, 0xac, 0xfc, 0x11, - 0xcc, 0xe8, 0xc6, 0x94, 0xd5, 0x68, 0x5c, 0xf5, 0x8e, 0xd1, 0xe3, 0x3f, 0x15, 0x61, 0x2e, 0x41, - 0x81, 0x6a, 0x30, 0x11, 0x36, 0x2a, 0x13, 0x16, 0x8f, 0x23, 0x79, 0xc1, 0x9f, 0xf6, 0xa8, 0x23, - 0x0b, 0xaf, 0x8e, 0x8a, 0xbc, 0x33, 0xa9, 0x7b, 0x67, 0x0d, 0x4a, 0xdc, 0x83, 0x8d, 0x22, 0x57, - 0xaa, 0xa1, 0x97, 0xb6, 0x9e, 0xeb, 0x05, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, 0xd9, - 0x73, 0xdd, 0x80, 0xb8, 0xb6, 0x0a, 0xd6, 0x10, 0x46, 0xb7, 0xa0, 0xde, 0x1e, 0x7a, 0x1e, 0x75, - 0x02, 0x32, 0x74, 0xf6, 0x86, 0xfd, 0x63, 0x2a, 0xe2, 0x75, 0x96, 0xa4, 0xf0, 0x68, 0x0b, 0xca, - 0x1d, 0xda, 0x35, 0x87, 0x76, 0xe0, 0x37, 0xa6, 0xf9, 0xd6, 0x37, 0xf3, 0xed, 0xb1, 0xb6, 0x25, - 0x49, 0x5b, 0x4e, 0xe0, 0x9d, 0x91, 0x90, 0x13, 0xdd, 0x86, 0xe2, 0xc8, 0xf4, 0xfc, 0x46, 0x99, - 0x4b, 0xb8, 0x3e, 0x46, 0xc2, 0x13, 0xd3, 0x93, 0xdc, 0x9c, 0x83, 0xed, 0x3f, 0xf4, 0xa9, 0xc7, - 0xd0, 0x8d, 0xca, 0xb9, 0xfb, 0x3f, 0x96, 0xa4, 0x72, 0x7f, 0xc5, 0xd9, 0xfc, 0x00, 0x66, 0x63, - 0xaa, 0xa1, 0x3a, 0x4c, 0x9e, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x64, 0xda, 0xc3, - 0xb0, 0x8d, 0xe5, 0xc0, 0x9d, 0x89, 0xdb, 0x46, 0xf3, 0x7d, 0xa8, 0x84, 0x32, 0x5f, 0x8a, 0xf1, - 0x03, 0x98, 0x8d, 0x29, 0xf4, 0x32, 0xcc, 0xf8, 0x0f, 0x06, 0x5c, 0xda, 0xa3, 0xcf, 0xb5, 0x13, - 0xaa, 0x3b, 0x72, 0x0b, 0xea, 0x2c, 0x60, 0xbb, 0xb6, 0xfb, 0xfc, 0x90, 0xf6, 0x07, 0x76, 0xd4, - 0x56, 0xa5, 0xf0, 0xe8, 0x23, 0x69, 0x78, 0x11, 0xca, 0xb7, 0x34, 0xd3, 0x65, 0xca, 0x4e, 0x9a, - 0xff, 0xbf, 0x3e, 0x3b, 0x3e, 0x80, 0x85, 0xe4, 0x0e, 0xec, 0x12, 0x7e, 0xbd, 0xfe, 0xf8, 0x35, - 0x9e, 0x41, 0x33, 0x4c, 0x92, 0xb8, 0x65, 0xf8, 0xa7, 0x06, 0x2c, 0x24, 0x29, 0xbf, 0xf6, 0xf6, - 0xe8, 0x2d, 0x28, 0x2b, 0x03, 0xcb, 0x46, 0x6b, 0x41, 0x63, 0x65, 0x57, 0x8b, 0xf3, 0x84, 0x44, - 0xf8, 0xaf, 0x06, 0x5c, 0xde, 0x14, 0xcb, 0xe7, 0x2b, 0x8d, 0x3e, 0x86, 0x62, 0x70, 0x36, 0x10, - 0xb6, 0xac, 0xad, 0xbf, 0xa1, 0x37, 0xf5, 0x79, 0x32, 0xd6, 0xf6, 0x07, 0x8c, 0x85, 0x70, 0x46, - 0x6c, 0xc2, 0x94, 0x80, 0x59, 0xd3, 0xb9, 0xb7, 0xbf, 0xff, 0xa8, 0x5e, 0x40, 0x08, 0x6a, 0x07, - 0x87, 0xf7, 0xc8, 0xe1, 0xd1, 0xbd, 0xcd, 0xc3, 0xdd, 0x27, 0xbb, 0x87, 0x3f, 0xac, 0x1b, 0x68, - 0x1e, 0x66, 0x0f, 0x0e, 0xf7, 0x1f, 0x45, 0xa8, 0x09, 0x34, 0x0b, 0x95, 0xcd, 0xfd, 0xbd, 0xfb, - 0xbb, 0xdb, 0x8f, 0x49, 0xab, 0x3e, 0xc9, 0xba, 0x53, 0xd2, 0x3a, 0x68, 0x1d, 0xd6, 0x8b, 0x68, - 0x06, 0xca, 0xdb, 0xfb, 0x47, 0xa2, 0x57, 0x2d, 0xe1, 0x53, 0x58, 0xce, 0x52, 0x86, 0xd9, 0x36, - 0x79, 0x9c, 0xcc, 0x77, 0x61, 0x66, 0xee, 0x99, 0xcc, 0xce, 0x3d, 0xf8, 0x57, 0x06, 0x34, 0x1e, - 0xba, 0x1d, 0xab, 0x7b, 0x76, 0x21, 0xeb, 0x81, 0x3b, 0xa0, 0x1e, 0x7f, 0xc2, 0xaa, 0x78, 0xbf, - 0x96, 0xed, 0xd9, 0x7d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x03, 0x6a, 0x1e, 0x6d, 0xbb, 0x4e, 0xd7, - 0x3a, 0x19, 0x7a, 0xf4, 0x9e, 0x6d, 0x73, 0xbd, 0xca, 0x24, 0x81, 0xc5, 0xbf, 0x31, 0x60, 0x31, - 0x4b, 0x18, 0xba, 0x23, 0xfd, 0x27, 0x1e, 0x1f, 0x37, 0xce, 0xd9, 0x3b, 0xe6, 0x3a, 0x91, 0xae, - 0x6d, 0x51, 0x58, 0x27, 0x54, 0xba, 0x16, 0x30, 0x7e, 0x27, 0xc3, 0xad, 0x73, 0x50, 0x25, 0xad, - 0x87, 0xfb, 0x4f, 0x5a, 0x47, 0x64, 0xff, 0x01, 0xf3, 0xd8, 0x0c, 0x94, 0xef, 0x6d, 0x6d, 0x09, - 0xa8, 0xc8, 0x1e, 0x92, 0x4b, 0x19, 0x96, 0x63, 0x6e, 0xfa, 0x14, 0xea, 0x5d, 0xd3, 0xb2, 0x69, - 0x67, 0x3f, 0xb2, 0x96, 0x71, 0x31, 0x6b, 0xa5, 0x18, 0xa5, 0x13, 0x26, 0xd2, 0x3e, 0xd7, 0x6b, - 0x17, 0xfe, 0xd2, 0x80, 0xcb, 0xb2, 0xfb, 0xbc, 0x80, 0x23, 0xaf, 0x40, 0xe5, 0x94, 0x52, 0xf1, - 0x5c, 0xe5, 0xa2, 0xcb, 0x24, 0x42, 0xa0, 0xb7, 0x61, 0xc1, 0xb4, 0x6d, 0xf7, 0xf9, 0xae, 0x43, - 0x86, 0x8e, 0x63, 0x39, 0x27, 0x07, 0xe1, 0x7e, 0x65, 0x92, 0xb5, 0xc4, 0x74, 0xea, 0xba, 0x5e, - 0x5b, 0x74, 0x3b, 0x65, 0x22, 0x00, 0x4c, 0x61, 0x39, 0x4b, 0x25, 0x66, 0xa1, 0xff, 0xe1, 0x4b, - 0x1b, 0xff, 0xd9, 0x80, 0x6b, 0x07, 0xb1, 0x44, 0xf4, 0xc8, 0x63, 0x31, 0x17, 0x58, 0xd4, 0xcf, - 0x33, 0xc0, 0x33, 0x80, 0x41, 0x48, 0x24, 0x23, 0xf9, 0x8e, 0x5e, 0xef, 0xc7, 0xcb, 0x5b, 0x8b, - 0x30, 0x22, 0x93, 0x6b, 0xd2, 0x9a, 0x77, 0x61, 0x2e, 0xb1, 0xfc, 0x52, 0x59, 0xfd, 0x1a, 0x5c, - 0xcd, 0xdf, 0x9d, 0x9d, 0xd7, 0x87, 0x6b, 0xdb, 0x2f, 0x79, 0xdc, 0x06, 0x4c, 0x7f, 0x31, 0xa4, - 0x9e, 0x3a, 0x6b, 0x85, 0x28, 0x90, 0xdd, 0x48, 0xfa, 0xa2, 0x6d, 0x0f, 0x3b, 0x74, 0xdb, 0x76, - 0x8f, 0x4d, 0xdb, 0x57, 0x37, 0x32, 0x8e, 0xc5, 0xbf, 0x37, 0xe0, 0xea, 0xf6, 0x38, 0xb5, 0xd0, - 0x67, 0x31, 0x93, 0x8a, 0x70, 0xbf, 0xad, 0x99, 0x74, 0x2c, 0xf7, 0x37, 0x69, 0xd0, 0x7f, 0x19, - 0x30, 0x1b, 0xeb, 0xdf, 0x10, 0x82, 0xa2, 0xc3, 0xb2, 0x80, 0x60, 0xe7, 0xbf, 0x59, 0x57, 0x6c, - 0xbb, 0xed, 0x53, 0xf9, 0xbe, 0x2f, 0x13, 0x09, 0xa9, 0x49, 0xd8, 0x6e, 0x47, 0xde, 0x37, 0x09, - 0x69, 0xc3, 0xb4, 0xa2, 0x3e, 0x4c, 0x8b, 0xae, 0x67, 0x49, 0x4f, 0xc9, 0x57, 0xa0, 0xd2, 0xb6, - 0x4d, 0xdf, 0xd7, 0xba, 0xfa, 0x08, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x81, 0xed, 0x9e, 0xa9, 0x9a, - 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x8a, 0x11, 0x91, 0x04, 0x13, 0x33, 0xca, 0xc0, - 0x12, 0x8f, 0xd7, 0x0a, 0x61, 0x3f, 0x59, 0x8d, 0x46, 0x69, 0x46, 0x96, 0x09, 0xd9, 0xa3, 0x43, - 0xb3, 0x41, 0x08, 0xb3, 0x50, 0x31, 0x4f, 0x18, 0xa1, 0xca, 0x39, 0x0a, 0x64, 0x2b, 0x6e, 0xb7, - 0x4b, 0xbd, 0xd0, 0x14, 0x0a, 0x64, 0xcf, 0x1a, 0x35, 0xbf, 0xdb, 0x55, 0x6f, 0x3a, 0x0d, 0x83, - 0xe7, 0x61, 0x6e, 0x9b, 0x06, 0xf2, 0xca, 0x8a, 0x17, 0xc4, 0xc7, 0x30, 0x1b, 0xa1, 0x58, 0xf8, - 0x84, 0xcd, 0xb7, 0x71, 0xa1, 0xe6, 0x1b, 0xdf, 0x84, 0x9a, 0x14, 0xa0, 0xbd, 0x6b, 0xa4, 0xa7, - 0x0c, 0xdd, 0x53, 0xf8, 0x7d, 0x98, 0x09, 0x29, 0xd9, 0x4e, 0xaf, 0x41, 0x91, 0xad, 0xc8, 0x74, - 0xb3, 0x90, 0xb0, 0x31, 0xdf, 0x83, 0x13, 0xe0, 0x16, 0xcc, 0xf2, 0x01, 0x02, 0xf3, 0x53, 0x6e, - 0xdc, 0xb0, 0xc7, 0x86, 0x60, 0x7f, 0xe8, 0x76, 0x68, 0xf8, 0xd8, 0x88, 0x50, 0xf8, 0x27, 0x50, - 0xdd, 0x74, 0xfb, 0x7d, 0xd3, 0xe9, 0x28, 0x2f, 0x51, 0x67, 0xc4, 0x8f, 0x59, 0x21, 0xec, 0x27, - 0x0f, 0x99, 0x1e, 0xb5, 0x6d, 0x19, 0x79, 0x02, 0x88, 0x02, 0x7a, 0x52, 0x0b, 0x68, 0x16, 0x48, - 0xa6, 0x77, 0x32, 0x14, 0x8f, 0xa7, 0x22, 0x97, 0x11, 0x21, 0x98, 0x82, 0xac, 0x1f, 0x97, 0xb1, - 0xc7, 0x7f, 0xe3, 0x87, 0x50, 0xdd, 0xec, 0x99, 0x8e, 0x43, 0xed, 0xdc, 0x33, 0x20, 0xad, 0x2b, - 0xaa, 0xc8, 0x6a, 0xc9, 0xad, 0xe9, 0x9d, 0xd0, 0x20, 0x8a, 0x7b, 0x06, 0xe1, 0x7f, 0x4e, 0x42, - 0x39, 0xbc, 0x48, 0xdf, 0x85, 0x8a, 0xcf, 0x9c, 0xc3, 0x63, 0x56, 0xd8, 0x33, 0xdf, 0x71, 0x11, - 0x29, 0xe3, 0x6b, 0x2b, 0xab, 0xca, 0x36, 0xaf, 0x91, 0xf0, 0x43, 0x68, 0x75, 0x12, 0x91, 0xa2, - 0x4f, 0x60, 0xce, 0x72, 0x8e, 0xdd, 0xa1, 0xd3, 0x91, 0x47, 0x62, 0xe9, 0x8a, 0x85, 0xcb, 0x92, - 0x5e, 0x34, 0xa2, 0xd3, 0x92, 0x24, 0x39, 0xda, 0x80, 0xba, 0x3b, 0x0c, 0xe2, 0x22, 0x8a, 0x63, - 0x45, 0xa4, 0xe8, 0xd1, 0x6d, 0xe6, 0xf2, 0xd0, 0xa1, 0x72, 0x20, 0x16, 0x63, 0x8f, 0x56, 0x89, - 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x66, 0xd0, 0x93, 0x59, 0x20, 0x84, 0xf9, 0x27, 0x06, - 0x67, 0xb4, 0x2b, 0xc6, 0x59, 0x15, 0x22, 0x00, 0xb4, 0x19, 0xcb, 0xaa, 0xe2, 0x75, 0xf6, 0xad, - 0x8c, 0x90, 0xfd, 0x26, 0x13, 0xe8, 0x5b, 0xb0, 0x10, 0x2f, 0xc4, 0xe2, 0xbe, 0x35, 0x60, 0x5a, - 0xdc, 0x30, 0x5f, 0x06, 0xb3, 0x02, 0xf1, 0x2f, 0x0c, 0x98, 0x4f, 0x95, 0x6e, 0x74, 0x07, 0xaa, - 0xa7, 0x96, 0x6d, 0xd3, 0xce, 0xe1, 0x85, 0xee, 0xb9, 0x4e, 0x8c, 0x3e, 0x84, 0x19, 0x4f, 0x34, - 0x1c, 0xaa, 0x67, 0x19, 0xcf, 0x1c, 0xa3, 0xc6, 0x9b, 0x3c, 0xff, 0xb0, 0xc7, 0x43, 0xa8, 0x7c, - 0x68, 0x6d, 0x43, 0xb7, 0x76, 0x13, 0xca, 0x03, 0x33, 0xe8, 0x1d, 0x0c, 0x68, 0x5b, 0xb5, 0x88, - 0x0a, 0xc6, 0x5f, 0x16, 0xa1, 0xac, 0xde, 0x1f, 0x79, 0x15, 0x24, 0xeb, 0xf3, 0x4a, 0xce, 0xb0, - 0xa1, 0x09, 0xe5, 0xee, 0xd0, 0xb6, 0x79, 0x28, 0x88, 0x8c, 0x19, 0xc2, 0xba, 0x65, 0x4b, 0x31, - 0xcb, 0xa2, 0xd7, 0xa1, 0xc4, 0x7a, 0x56, 0xbf, 0x31, 0xc5, 0x0d, 0x90, 0xf9, 0x36, 0x12, 0x14, - 0xe8, 0x6e, 0x6a, 0xaa, 0xf0, 0x6a, 0x06, 0x75, 0xee, 0x38, 0xe1, 0x9d, 0xd8, 0x38, 0xe1, 0x6a, - 0x16, 0x6b, 0x72, 0x8e, 0x70, 0x37, 0x35, 0x47, 0xc8, 0xdc, 0xf1, 0xff, 0x68, 0x80, 0x70, 0x87, - 0x57, 0x31, 0x19, 0x58, 0x2c, 0xc6, 0x43, 0xff, 0x18, 0xe7, 0xf9, 0x07, 0xff, 0xce, 0x80, 0x57, - 0xb6, 0x69, 0xf0, 0x34, 0x31, 0x4e, 0x08, 0x23, 0x74, 0x15, 0xaa, 0x1e, 0x1d, 0xb8, 0x8f, 0xcc, - 0x20, 0xa0, 0x9e, 0x9a, 0xd5, 0xe9, 0x28, 0x74, 0x13, 0xe6, 0x3c, 0x3a, 0xb2, 0x7c, 0xcb, 0x75, - 0x14, 0x95, 0xd0, 0x30, 0x89, 0x66, 0xb2, 0x4c, 0xdb, 0xde, 0xf0, 0x4c, 0xa7, 0xdd, 0xa3, 0xaa, - 0xc5, 0xd3, 0x51, 0xbc, 0xec, 0xdb, 0xf6, 0xa1, 0x79, 0xe2, 0xcb, 0x1e, 0x5e, 0x81, 0xf8, 0x18, - 0x16, 0x93, 0x3a, 0xaa, 0x2b, 0xc0, 0x94, 0x51, 0x57, 0x80, 0xfd, 0xe6, 0xf9, 0x4d, 0x8d, 0x4b, - 0xe4, 0xfd, 0x51, 0x30, 0x7f, 0x7e, 0x49, 0xb5, 0xe4, 0x4d, 0x08, 0x61, 0xfc, 0x39, 0x5c, 0xce, - 0x36, 0x05, 0xb3, 0xe9, 0x43, 0x98, 0x4f, 0xce, 0x5c, 0xb2, 0x9e, 0x53, 0x59, 0x4a, 0x92, 0x34, - 0x27, 0x46, 0x50, 0x7f, 0x60, 0xf9, 0xec, 0x1d, 0xe2, 0x6a, 0x5f, 0xd2, 0xca, 0x0c, 0xce, 0xbd, - 0xda, 0x0d, 0x98, 0x96, 0x17, 0x43, 0xd6, 0x68, 0x05, 0x32, 0x1f, 0xc8, 0x9f, 0x24, 0x7e, 0xb8, - 0x24, 0x1a, 0x7f, 0x01, 0x35, 0x6d, 0x5f, 0x15, 0x2c, 0x0c, 0xca, 0x0a, 0x16, 0xa9, 0x0d, 0x11, - 0x14, 0xe8, 0x3d, 0xb8, 0x74, 0xc2, 0x3b, 0xf1, 0xad, 0xc4, 0x66, 0xc2, 0xca, 0xd9, 0x8b, 0x78, - 0x0f, 0x6a, 0xf7, 0x3a, 0x1d, 0x26, 0x4b, 0x05, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x30, 0x91, 0x7d, - 0x04, 0x02, 0x33, 0xa1, 0x3c, 0xd1, 0xb3, 0x21, 0x87, 0x3e, 0x4f, 0xaa, 0x24, 0x64, 0x67, 0xac, - 0xb0, 0xdd, 0x2d, 0x55, 0xf1, 0x2b, 0x84, 0xff, 0xc6, 0xaf, 0xc3, 0x3c, 0xa1, 0x7d, 0x77, 0x44, - 0x75, 0x35, 0x17, 0xa1, 0x64, 0x39, 0x1d, 0xfa, 0x42, 0x7d, 0x61, 0xe0, 0x00, 0xfe, 0x1e, 0xcc, - 0xe9, 0xa4, 0x4c, 0x83, 0x1b, 0x50, 0xd3, 0xf7, 0x09, 0xc3, 0x31, 0x81, 0xc5, 0x6f, 0xc0, 0x02, - 0xa1, 0x5d, 0x8f, 0xfa, 0x3d, 0xdd, 0xef, 0x39, 0xfb, 0x7c, 0x07, 0x2e, 0x1d, 0xd0, 0x40, 0x63, - 0x1f, 0x4f, 0x7e, 0x97, 0x3f, 0x3f, 0xb7, 0xb3, 0x3c, 0xa0, 0x18, 0xf5, 0xd8, 0x37, 0x12, 0xb1, - 0xff, 0x03, 0xfe, 0xde, 0x63, 0xdb, 0xe4, 0x30, 0x67, 0xee, 0x1a, 0x13, 0x39, 0x91, 0x10, 0xf9, - 0x0e, 0xbc, 0x92, 0x27, 0x92, 0x19, 0x4d, 0xb9, 0xc1, 0xd0, 0xdc, 0x30, 0x0d, 0xa5, 0x56, 0x7f, - 0x10, 0x9c, 0xad, 0xff, 0x7b, 0x16, 0xa6, 0xe5, 0xf8, 0x09, 0x6d, 0x42, 0xf5, 0xd0, 0x33, 0xdb, - 0xf2, 0x23, 0x1e, 0x6a, 0xa4, 0xbe, 0xf5, 0x4a, 0x15, 0x9b, 0x4b, 0x19, 0x2b, 0xec, 0xa9, 0x5a, - 0x78, 0xdb, 0x40, 0xcf, 0xa0, 0x9e, 0xfc, 0x24, 0x83, 0x70, 0xfc, 0x5d, 0x98, 0xf5, 0xc5, 0xa9, - 0xb9, 0x3a, 0x96, 0x86, 0x4b, 0x47, 0x1b, 0x50, 0x56, 0x9f, 0x2c, 0x90, 0x3e, 0x62, 0x4c, 0x7c, - 0xf2, 0x68, 0x36, 0x32, 0xd7, 0x84, 0x8c, 0xa7, 0xbc, 0x39, 0xd0, 0xbf, 0x65, 0xa0, 0x57, 0x73, - 0x9f, 0xad, 0xe1, 0x89, 0xaf, 0x8d, 0x23, 0x11, 0x82, 0x0f, 0xa1, 0x16, 0x1f, 0xcf, 0xa2, 0xd5, - 0xf3, 0x66, 0xc3, 0xcd, 0x95, 0x31, 0x14, 0xa1, 0xd4, 0xf8, 0x7e, 0x68, 0x35, 0x57, 0x95, 0x2c, - 0xa9, 0x19, 0x23, 0x5b, 0x5c, 0x40, 0x3f, 0x06, 0x94, 0x9e, 0x39, 0xa2, 0xeb, 0x17, 0x99, 0x8f, - 0x36, 0xf1, 0x39, 0x54, 0x62, 0x87, 0x1f, 0xc1, 0x7c, 0x6a, 0x5a, 0x86, 0xf4, 0x4e, 0x36, 0x6f, - 0x0a, 0xd9, 0x7c, 0x75, 0x3c, 0x51, 0x78, 0x80, 0xf4, 0xac, 0x29, 0x76, 0x80, 0xdc, 0xe9, 0x58, - 0xec, 0x00, 0x39, 0x03, 0x2b, 0x11, 0x6b, 0xea, 0xc5, 0x1a, 0x8b, 0xb5, 0xc4, 0xcb, 0x36, 0x16, - 0x6b, 0xb1, 0x27, 0x2e, 0x2e, 0xa0, 0x8f, 0x61, 0x5a, 0xa2, 0xd0, 0xe5, 0x34, 0x99, 0x92, 0xb0, - 0x9c, 0xb5, 0x24, 0x04, 0xec, 0xc1, 0x8c, 0xde, 0x58, 0xa3, 0x95, 0xdc, 0x61, 0x99, 0x10, 0x35, - 0x76, 0x98, 0x16, 0x1e, 0x8a, 0x37, 0x30, 0xc9, 0x43, 0xe9, 0xed, 0x72, 0xf2, 0x50, 0x51, 0xc7, - 0x83, 0x0b, 0xa8, 0xcb, 0x3f, 0x06, 0xa6, 0x8a, 0x37, 0xba, 0x11, 0xe7, 0xc9, 0x6b, 0x74, 0x9a, - 0xd7, 0xcf, 0xa5, 0x13, 0xfb, 0xb4, 0xa0, 0x12, 0x16, 0x50, 0xf4, 0x8a, 0xc6, 0x94, 0x2c, 0xe7, - 0xcd, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x64, 0x11, 0x8b, 0xf9, 0x20, 0x5e, 0x28, 0x63, 0x3e, 0xd0, - 0x6b, 0x1e, 0x2e, 0xa0, 0x1d, 0x80, 0xa8, 0x0c, 0xa1, 0x2b, 0xb1, 0xaa, 0x9d, 0x28, 0x64, 0xcd, - 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x8c, 0x5e, 0x95, 0x62, 0xde, 0xcc, 0x28, 0x57, 0xcd, 0xba, 0x3e, - 0x3d, 0x66, 0xd9, 0x1a, 0x17, 0xd0, 0x7d, 0xa8, 0xc5, 0x8b, 0x55, 0x2c, 0x1f, 0x64, 0xd6, 0xb1, - 0x4c, 0x39, 0xcf, 0xa0, 0x91, 0x57, 0xc5, 0xd0, 0xad, 0xb8, 0xc4, 0x71, 0xa5, 0x2e, 0x53, 0xb6, - 0x0d, 0x4b, 0xd9, 0xf5, 0x08, 0xdd, 0x8c, 0x4b, 0xce, 0xaf, 0x82, 0xcd, 0x1b, 0x17, 0xa0, 0x14, - 0x56, 0xfd, 0x10, 0x2a, 0xe1, 0x3f, 0x1b, 0x62, 0x71, 0x92, 0xfc, 0xbf, 0x43, 0x5c, 0xd7, 0x11, - 0x75, 0x82, 0xb7, 0x8d, 0x8d, 0xdb, 0x7f, 0xfc, 0x6a, 0xc5, 0xf8, 0xdb, 0x57, 0x2b, 0xc6, 0xdf, - 0xbf, 0x5a, 0x31, 0x7e, 0xfd, 0x8f, 0x95, 0x02, 0xe0, 0x76, 0x6f, 0xad, 0x4d, 0x3d, 0x67, 0xcd, - 0xb4, 0xad, 0x36, 0x5d, 0x73, 0xd7, 0xd7, 0x14, 0x8f, 0x37, 0x68, 0xfb, 0xd4, 0x1b, 0x51, 0xef, - 0xd9, 0xc4, 0xe0, 0xf8, 0x78, 0x8a, 0xff, 0xd7, 0xf0, 0xdd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x94, 0x33, 0x95, 0x63, 0x85, 0x28, 0x00, 0x00, + 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, + 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, + 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, + 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, + 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, + 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, + 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, + 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, + 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, + 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, + 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, + 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, + 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, + 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, + 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, + 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, + 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, + 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, + 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, + 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, + 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, + 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, + 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, + 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, + 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, + 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, + 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, + 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, + 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, + 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, + 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, + 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, + 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, + 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, + 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, + 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, + 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, + 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, + 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, + 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, + 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, + 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, + 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, + 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, + 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, + 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, + 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, + 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, + 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, + 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, + 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, + 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, + 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, + 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, + 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, + 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, + 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, + 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, + 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, + 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, + 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, + 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, + 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, + 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, + 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, + 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, + 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, + 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, + 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, + 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, + 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, + 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, + 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, + 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, + 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, + 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, + 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, + 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, + 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, + 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, + 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, + 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, + 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, + 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, + 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, + 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, + 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, + 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, + 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, + 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, + 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, + 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, + 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, + 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, + 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, + 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, + 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, + 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, + 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, + 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, + 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, + 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, + 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, + 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, + 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, + 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, + 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, + 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, + 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, + 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, + 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, + 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, + 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, + 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, + 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, + 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, + 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, + 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, + 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, + 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, + 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, + 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, + 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, + 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, + 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, + 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, + 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, + 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, + 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, + 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, + 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, + 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, + 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, + 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, + 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, + 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, + 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, + 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, + 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, + 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, + 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, + 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, + 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, + 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, + 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, + 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, + 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, + 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, + 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, + 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, + 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, + 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, + 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, + 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, + 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, + 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, + 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, + 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, + 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, + 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, + 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, + 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, + 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, + 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, + 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, + 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, + 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, + 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, + 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, + 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, + 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, + 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, + 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, + 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, + 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, + 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, + 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, + 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, + 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, + 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, + 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, + 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, + 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, + 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, + 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, + 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, + 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, + 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7265,6 +7274,13 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SandboxStdout) > 0 { + i -= len(m.SandboxStdout) + copy(dAtA[i:], m.SandboxStdout) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) + i-- + dAtA[i] = 0x4a + } if len(m.Pid) > 0 { i -= len(m.Pid) copy(dAtA[i:], m.Pid) @@ -9678,6 +9694,10 @@ func (m *ShortTaskInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.SandboxStdout) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15732,6 +15752,38 @@ func (m *ShortTaskInfo) Unmarshal(dAtA []byte) error { } m.Pid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SandboxStdout = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 91254d084..89265c7ac 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -2386,6 +2386,7 @@ type ShortTaskInfo struct { ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -2480,6 +2481,13 @@ func (m *ShortTaskInfo) GetPid() string { return "" } +func (m *ShortTaskInfo) GetSandboxStdout() string { + if m != nil { + return m.SandboxStdout + } + return "" +} + type TaskDeploymentInfo struct { Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` @@ -4261,198 +4269,199 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3048 bytes of a gzipped FileDescriptorProto + // 3069 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0x2e, 0xc5, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2d, 0x8a, 0xfe, 0x87, 0x3e, 0xf4, - 0x07, 0x14, 0x45, 0x8b, 0xf6, 0x27, 0x14, 0xe9, 0x1f, 0xe8, 0x63, 0x5f, 0x0a, 0x14, 0xfb, 0x75, - 0xb7, 0xf7, 0x45, 0xc9, 0x4d, 0xf3, 0xd2, 0x37, 0xce, 0xec, 0xcc, 0xec, 0xec, 0xcc, 0xec, 0xcc, - 0xec, 0x1c, 0x61, 0x69, 0xe0, 0xb9, 0x81, 0xeb, 0xbf, 0xe5, 0xae, 0xb7, 0x5d, 0x27, 0xf0, 0x5c, - 0x7b, 0x8d, 0x23, 0x50, 0x25, 0x44, 0xe0, 0x25, 0x58, 0x6c, 0x8d, 0xa8, 0x13, 0x1c, 0x3d, 0xa4, - 0xbe, 0xeb, 0xef, 0x50, 0xd3, 0x0b, 0x8e, 0xa9, 0x19, 0x60, 0x1b, 0x9a, 0xad, 0xd1, 0x51, 0xcb, - 0x19, 0x59, 0x9e, 0xeb, 0xf4, 0xa9, 0x13, 0x1c, 0x04, 0x66, 0x40, 0x37, 0x7b, 0xa6, 0x73, 0x42, - 0x3b, 0x68, 0x11, 0x4a, 0x94, 0x71, 0x35, 0x8c, 0x55, 0xe3, 0x66, 0x85, 0x08, 0x00, 0x2d, 0xc1, - 0x94, 0xef, 0x0e, 0xbd, 0x36, 0x6d, 0x4c, 0x70, 0xb4, 0x84, 0xd0, 0x2a, 0x54, 0x3b, 0xd4, 0x0f, - 0x2c, 0xc7, 0x0c, 0x2c, 0xd7, 0x69, 0x4c, 0xf2, 0x45, 0x1d, 0x85, 0x37, 0x61, 0xa1, 0x35, 0x3a, - 0x3a, 0x34, 0xfd, 0xd3, 0xd8, 0x36, 0x4b, 0x30, 0x15, 0x98, 0xfe, 0xa9, 0xd5, 0x91, 0xfb, 0x48, - 0x88, 0x6d, 0xef, 0x33, 0x3a, 0xb9, 0x8f, 0x00, 0xf0, 0x7d, 0x76, 0x94, 0x50, 0xc8, 0xd0, 0x3f, - 0x4f, 0x0a, 0x53, 0x97, 0x13, 0x86, 0xea, 0x72, 0x08, 0xbf, 0x0e, 0x73, 0x52, 0xce, 0x03, 0x73, - 0xe8, 0xb4, 0x7b, 0xf9, 0x22, 0xb0, 0xc5, 0xf5, 0xe6, 0xa6, 0x63, 0xf4, 0x9b, 0x1e, 0x35, 0x03, - 0xda, 0x41, 0xd7, 0x61, 0x96, 0x11, 0x78, 0x54, 0x18, 0xc0, 0x97, 0x5c, 0x71, 0x24, 0x7a, 0x13, - 0xe6, 0xe9, 0x0b, 0xda, 0x1e, 0x06, 0xae, 0x47, 0x42, 0x4a, 0xa1, 0x4a, 0x7a, 0x01, 0x3f, 0x86, - 0x4b, 0x71, 0x87, 0xa8, 0xcd, 0x3e, 0x84, 0x2a, 0x8d, 0xb0, 0x7c, 0xab, 0xea, 0x7a, 0x73, 0x2d, - 0xf2, 0xb9, 0xc6, 0xb3, 0xeb, 0x74, 0x5d, 0xa2, 0x93, 0xe3, 0x9f, 0x1b, 0xb0, 0x1c, 0x97, 0xbb, - 0x45, 0xfd, 0xc0, 0x73, 0xcf, 0x68, 0x07, 0x7d, 0x1f, 0xe6, 0xdb, 0x36, 0x35, 0x9d, 0xe1, 0x80, - 0x1d, 0xce, 0x27, 0x74, 0x60, 0x9f, 0x49, 0xf9, 0x57, 0x34, 0xf9, 0x9b, 0x49, 0x1a, 0x92, 0x66, - 0x63, 0x26, 0xd1, 0xb6, 0xb5, 0x3a, 0xf2, 0xa0, 0x71, 0x24, 0xbe, 0xc4, 0xed, 0xa9, 0x29, 0xd3, - 0xf2, 0x3c, 0xd7, 0xc3, 0x0b, 0x30, 0xdf, 0x1a, 0x1d, 0x7d, 0x6a, 0xd9, 0x36, 0x97, 0xc8, 0xed, - 0x8d, 0xe7, 0x60, 0x56, 0xf8, 0x99, 0xd0, 0x2f, 0x86, 0xd4, 0x0f, 0xf0, 0x31, 0x54, 0x15, 0x82, - 0xed, 0x18, 0x06, 0x89, 0xa1, 0x05, 0x09, 0xba, 0x0b, 0xb3, 0xc2, 0xcd, 0x8f, 0x07, 0x1d, 0x33, - 0xe0, 0x06, 0x9f, 0xbc, 0x59, 0x5d, 0x5f, 0xd6, 0xce, 0x73, 0xa0, 0xad, 0x93, 0x38, 0x35, 0xfe, - 0x8b, 0x01, 0x33, 0xfa, 0x3a, 0x7a, 0x17, 0x4a, 0x36, 0x1d, 0x51, 0x9b, 0xef, 0x52, 0x5b, 0xbf, - 0x9a, 0x23, 0x67, 0xed, 0x01, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xad, 0x1f, 0xbb, 0x6e, 0xdc, - 0x1a, 0xd5, 0xf5, 0x6b, 0xba, 0xd7, 0x32, 0x6e, 0xe5, 0x4e, 0x81, 0x24, 0x18, 0xf1, 0x7b, 0x50, - 0xe2, 0xa2, 0x51, 0x05, 0x4a, 0x5b, 0xad, 0x8d, 0xc7, 0xdb, 0xf5, 0x02, 0x2a, 0x43, 0x71, 0x77, - 0xef, 0xfe, 0x7e, 0xdd, 0x40, 0x55, 0x98, 0x7e, 0x7a, 0x8f, 0xec, 0xed, 0xee, 0x6d, 0xd7, 0x27, - 0x18, 0x45, 0x8b, 0x90, 0x7d, 0x52, 0x9f, 0xdc, 0x98, 0x86, 0x12, 0x97, 0x8f, 0x7f, 0x36, 0x25, - 0x7f, 0xa1, 0x2b, 0x50, 0x09, 0xac, 0x3e, 0xf5, 0x03, 0xb3, 0x3f, 0x90, 0x26, 0x8b, 0x10, 0xc8, - 0x84, 0x65, 0x9a, 0x9d, 0x0b, 0xa4, 0xea, 0xdf, 0x8e, 0xa9, 0x9e, 0x97, 0x38, 0x76, 0x0a, 0x24, - 0x4f, 0x0e, 0x22, 0x80, 0x68, 0x2a, 0xba, 0x79, 0xb2, 0xa8, 0xae, 0xaf, 0xe6, 0x4a, 0x97, 0x74, - 0x3b, 0x05, 0x92, 0xc1, 0x8d, 0x1e, 0x40, 0x3d, 0x48, 0x24, 0x95, 0x46, 0x91, 0x4b, 0x5c, 0x89, - 0x4b, 0x4c, 0xa6, 0x9e, 0x9d, 0x02, 0x49, 0x71, 0xa2, 0x7d, 0x98, 0x0f, 0x92, 0xd9, 0xa5, 0x51, - 0xca, 0xf0, 0x5c, 0x3a, 0x09, 0xed, 0x14, 0x48, 0x9a, 0x17, 0x7d, 0x02, 0x33, 0x0c, 0x69, 0xcb, - 0x34, 0xd3, 0x98, 0x4a, 0xdf, 0xdd, 0x78, 0x22, 0xda, 0x29, 0x90, 0x18, 0x07, 0x3b, 0x60, 0x5f, - 0x65, 0x9f, 0xb6, 0x34, 0xd9, 0x74, 0xd6, 0x01, 0x93, 0x39, 0x8a, 0x1d, 0x30, 0xc9, 0x89, 0x3e, - 0x83, 0x45, 0x9a, 0x91, 0x08, 0x1a, 0x65, 0x2e, 0x11, 0xe7, 0x3a, 0x21, 0xa4, 0xdc, 0x29, 0x90, - 0x4c, 0x09, 0x4c, 0x4f, 0x9a, 0xb8, 0xd5, 0x8d, 0x4a, 0x96, 0x9e, 0xc9, 0xbb, 0xcf, 0xf4, 0x4c, - 0x72, 0xa2, 0xfb, 0x50, 0x3b, 0xb5, 0x6c, 0x3b, 0x08, 0x93, 0x41, 0x03, 0x52, 0x59, 0x29, 0x95, - 0x30, 0xd8, 0xe5, 0x89, 0x73, 0x6d, 0x54, 0x60, 0xfa, 0x91, 0x79, 0x66, 0xbb, 0x66, 0x07, 0x23, - 0xa8, 0x1f, 0x0c, 0x8f, 0xfd, 0xb6, 0x67, 0x1d, 0x53, 0x95, 0x50, 0x2e, 0xc3, 0xf2, 0x36, 0x0d, - 0xee, 0x7b, 0x66, 0x9f, 0x3e, 0x77, 0xbd, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0x6f, 0x0d, 0x98, 0x7e, - 0x42, 0x3d, 0xdf, 0x72, 0x1d, 0x96, 0x68, 0xfa, 0xe6, 0xe7, 0xae, 0xc7, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x2d, 0xc7, 0xf5, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0xec, 0xc0, 0x0c, 0xda, 0x3d, - 0x1e, 0xd7, 0x25, 0x22, 0x00, 0x86, 0x3d, 0x1e, 0x5a, 0xb6, 0x88, 0xcd, 0x0a, 0x11, 0x00, 0x2b, - 0x9b, 0x03, 0xcf, 0xed, 0x0c, 0xdb, 0xc1, 0x9e, 0xd9, 0xa7, 0x3c, 0xd0, 0x2a, 0x44, 0x47, 0xa1, - 0x15, 0x80, 0x91, 0x50, 0xe2, 0x20, 0xf0, 0x78, 0xf4, 0x54, 0x88, 0x86, 0xc1, 0xbf, 0x9c, 0x80, - 0x4b, 0xe9, 0x13, 0xb0, 0xe4, 0xb8, 0x0a, 0xd5, 0x6e, 0x88, 0x55, 0x55, 0x4d, 0x47, 0xf1, 0xea, - 0x14, 0xd9, 0xdd, 0xdf, 0x74, 0x87, 0x4e, 0x20, 0xcf, 0x92, 0x5e, 0x60, 0x9a, 0x70, 0xbb, 0x0a, - 0x32, 0x71, 0x38, 0x0d, 0x13, 0x25, 0xe3, 0xa2, 0x9e, 0x8c, 0x57, 0x00, 0x7a, 0xae, 0xaf, 0x84, - 0x97, 0x04, 0x57, 0x84, 0x41, 0x18, 0x66, 0x2c, 0xc7, 0x0f, 0x4c, 0xa7, 0x4d, 0xb9, 0x09, 0xc4, - 0x09, 0x63, 0x38, 0xf4, 0x26, 0x4c, 0xcb, 0x13, 0xcb, 0xc0, 0x47, 0x5a, 0x10, 0x48, 0x17, 0x11, - 0x45, 0xc2, 0x6a, 0xfb, 0x21, 0x35, 0xbd, 0x8e, 0xfb, 0xdc, 0x91, 0xae, 0x64, 0xb5, 0xdd, 0xa3, - 0xa6, 0xef, 0x3a, 0xaa, 0xb6, 0x0b, 0x88, 0xd5, 0x97, 0x88, 0x74, 0x60, 0x9f, 0xe1, 0x06, 0x2c, - 0x6d, 0xd3, 0x40, 0x0b, 0xd0, 0xb0, 0xf2, 0xbc, 0x80, 0xc5, 0xd4, 0xca, 0xc5, 0xac, 0xfc, 0x11, - 0xcc, 0xe8, 0xc6, 0x94, 0xd5, 0x68, 0x5c, 0xf5, 0x8e, 0xd1, 0xe3, 0x3f, 0x15, 0x61, 0x2e, 0x41, - 0x81, 0x6a, 0x30, 0x11, 0x36, 0x2a, 0x13, 0x16, 0x8f, 0x23, 0x79, 0xc1, 0x9f, 0xf6, 0xa8, 0x23, - 0x0b, 0xaf, 0x8e, 0x8a, 0xbc, 0x33, 0xa9, 0x7b, 0x67, 0x0d, 0x4a, 0xdc, 0x83, 0x8d, 0x22, 0x57, - 0xaa, 0xa1, 0x97, 0xb6, 0x9e, 0xeb, 0x05, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, 0xd9, - 0x73, 0xdd, 0x80, 0xb8, 0xb6, 0x0a, 0xd6, 0x10, 0x46, 0xb7, 0xa0, 0xde, 0x1e, 0x7a, 0x1e, 0x75, - 0x02, 0x32, 0x74, 0xf6, 0x86, 0xfd, 0x63, 0x2a, 0xe2, 0x75, 0x96, 0xa4, 0xf0, 0x68, 0x0b, 0xca, - 0x1d, 0xda, 0x35, 0x87, 0x76, 0xe0, 0x37, 0xa6, 0xf9, 0xd6, 0x37, 0xf3, 0xed, 0xb1, 0xb6, 0x25, - 0x49, 0x5b, 0x4e, 0xe0, 0x9d, 0x91, 0x90, 0x13, 0xdd, 0x86, 0xe2, 0xc8, 0xf4, 0xfc, 0x46, 0x99, - 0x4b, 0xb8, 0x3e, 0x46, 0xc2, 0x13, 0xd3, 0x93, 0xdc, 0x9c, 0x83, 0xed, 0x3f, 0xf4, 0xa9, 0xc7, - 0xd0, 0x8d, 0xca, 0xb9, 0xfb, 0x3f, 0x96, 0xa4, 0x72, 0x7f, 0xc5, 0xd9, 0xfc, 0x00, 0x66, 0x63, - 0xaa, 0xa1, 0x3a, 0x4c, 0x9e, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x64, 0xda, 0xc3, - 0xb0, 0x8d, 0xe5, 0xc0, 0x9d, 0x89, 0xdb, 0x46, 0xf3, 0x7d, 0xa8, 0x84, 0x32, 0x5f, 0x8a, 0xf1, - 0x03, 0x98, 0x8d, 0x29, 0xf4, 0x32, 0xcc, 0xf8, 0x0f, 0x06, 0x5c, 0xda, 0xa3, 0xcf, 0xb5, 0x13, - 0xaa, 0x3b, 0x72, 0x0b, 0xea, 0x2c, 0x60, 0xbb, 0xb6, 0xfb, 0xfc, 0x90, 0xf6, 0x07, 0x76, 0xd4, - 0x56, 0xa5, 0xf0, 0xe8, 0x23, 0x69, 0x78, 0x11, 0xca, 0xb7, 0x34, 0xd3, 0x65, 0xca, 0x4e, 0x9a, - 0xff, 0xbf, 0x3e, 0x3b, 0x3e, 0x80, 0x85, 0xe4, 0x0e, 0xec, 0x12, 0x7e, 0xbd, 0xfe, 0xf8, 0x35, - 0x9e, 0x41, 0x33, 0x4c, 0x92, 0xb8, 0x65, 0xf8, 0xa7, 0x06, 0x2c, 0x24, 0x29, 0xbf, 0xf6, 0xf6, - 0xe8, 0x2d, 0x28, 0x2b, 0x03, 0xcb, 0x46, 0x6b, 0x41, 0x63, 0x65, 0x57, 0x8b, 0xf3, 0x84, 0x44, - 0xf8, 0xaf, 0x06, 0x5c, 0xde, 0x14, 0xcb, 0xe7, 0x2b, 0x8d, 0x3e, 0x86, 0x62, 0x70, 0x36, 0x10, - 0xb6, 0xac, 0xad, 0xbf, 0xa1, 0x37, 0xf5, 0x79, 0x32, 0xd6, 0xf6, 0x07, 0x8c, 0x85, 0x70, 0x46, - 0x6c, 0xc2, 0x94, 0x80, 0x59, 0xd3, 0xb9, 0xb7, 0xbf, 0xff, 0xa8, 0x5e, 0x40, 0x08, 0x6a, 0x07, - 0x87, 0xf7, 0xc8, 0xe1, 0xd1, 0xbd, 0xcd, 0xc3, 0xdd, 0x27, 0xbb, 0x87, 0x3f, 0xac, 0x1b, 0x68, - 0x1e, 0x66, 0x0f, 0x0e, 0xf7, 0x1f, 0x45, 0xa8, 0x09, 0x34, 0x0b, 0x95, 0xcd, 0xfd, 0xbd, 0xfb, - 0xbb, 0xdb, 0x8f, 0x49, 0xab, 0x3e, 0xc9, 0xba, 0x53, 0xd2, 0x3a, 0x68, 0x1d, 0xd6, 0x8b, 0x68, - 0x06, 0xca, 0xdb, 0xfb, 0x47, 0xa2, 0x57, 0x2d, 0xe1, 0x53, 0x58, 0xce, 0x52, 0x86, 0xd9, 0x36, - 0x79, 0x9c, 0xcc, 0x77, 0x61, 0x66, 0xee, 0x99, 0xcc, 0xce, 0x3d, 0xf8, 0x57, 0x06, 0x34, 0x1e, - 0xba, 0x1d, 0xab, 0x7b, 0x76, 0x21, 0xeb, 0x81, 0x3b, 0xa0, 0x1e, 0x7f, 0xc2, 0xaa, 0x78, 0xbf, - 0x96, 0xed, 0xd9, 0x7d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x03, 0x6a, 0x1e, 0x6d, 0xbb, 0x4e, 0xd7, - 0x3a, 0x19, 0x7a, 0xf4, 0x9e, 0x6d, 0x73, 0xbd, 0xca, 0x24, 0x81, 0xc5, 0xbf, 0x31, 0x60, 0x31, - 0x4b, 0x18, 0xba, 0x23, 0xfd, 0x27, 0x1e, 0x1f, 0x37, 0xce, 0xd9, 0x3b, 0xe6, 0x3a, 0x91, 0xae, - 0x6d, 0x51, 0x58, 0x27, 0x54, 0xba, 0x16, 0x30, 0x7e, 0x27, 0xc3, 0xad, 0x73, 0x50, 0x25, 0xad, - 0x87, 0xfb, 0x4f, 0x5a, 0x47, 0x64, 0xff, 0x01, 0xf3, 0xd8, 0x0c, 0x94, 0xef, 0x6d, 0x6d, 0x09, - 0xa8, 0xc8, 0x1e, 0x92, 0x4b, 0x19, 0x96, 0x63, 0x6e, 0xfa, 0x14, 0xea, 0x5d, 0xd3, 0xb2, 0x69, - 0x67, 0x3f, 0xb2, 0x96, 0x71, 0x31, 0x6b, 0xa5, 0x18, 0xa5, 0x13, 0x26, 0xd2, 0x3e, 0xd7, 0x6b, - 0x17, 0xfe, 0xd2, 0x80, 0xcb, 0xb2, 0xfb, 0xbc, 0x80, 0x23, 0xaf, 0x40, 0xe5, 0x94, 0x52, 0xf1, - 0x5c, 0xe5, 0xa2, 0xcb, 0x24, 0x42, 0xa0, 0xb7, 0x61, 0xc1, 0xb4, 0x6d, 0xf7, 0xf9, 0xae, 0x43, - 0x86, 0x8e, 0x63, 0x39, 0x27, 0x07, 0xe1, 0x7e, 0x65, 0x92, 0xb5, 0xc4, 0x74, 0xea, 0xba, 0x5e, - 0x5b, 0x74, 0x3b, 0x65, 0x22, 0x00, 0x4c, 0x61, 0x39, 0x4b, 0x25, 0x66, 0xa1, 0xff, 0xe1, 0x4b, - 0x1b, 0xff, 0xd9, 0x80, 0x6b, 0x07, 0xb1, 0x44, 0xf4, 0xc8, 0x63, 0x31, 0x17, 0x58, 0xd4, 0xcf, - 0x33, 0xc0, 0x33, 0x80, 0x41, 0x48, 0x24, 0x23, 0xf9, 0x8e, 0x5e, 0xef, 0xc7, 0xcb, 0x5b, 0x8b, - 0x30, 0x22, 0x93, 0x6b, 0xd2, 0x9a, 0x77, 0x61, 0x2e, 0xb1, 0xfc, 0x52, 0x59, 0xfd, 0x1a, 0x5c, - 0xcd, 0xdf, 0x9d, 0x9d, 0xd7, 0x87, 0x6b, 0xdb, 0x2f, 0x79, 0xdc, 0x06, 0x4c, 0x7f, 0x31, 0xa4, - 0x9e, 0x3a, 0x6b, 0x85, 0x28, 0x90, 0xdd, 0x48, 0xfa, 0xa2, 0x6d, 0x0f, 0x3b, 0x74, 0xdb, 0x76, - 0x8f, 0x4d, 0xdb, 0x57, 0x37, 0x32, 0x8e, 0xc5, 0xbf, 0x37, 0xe0, 0xea, 0xf6, 0x38, 0xb5, 0xd0, - 0x67, 0x31, 0x93, 0x8a, 0x70, 0xbf, 0xad, 0x99, 0x74, 0x2c, 0xf7, 0x37, 0x69, 0xd0, 0x7f, 0x19, - 0x30, 0x1b, 0xeb, 0xdf, 0x10, 0x82, 0xa2, 0xc3, 0xb2, 0x80, 0x60, 0xe7, 0xbf, 0x59, 0x57, 0x6c, - 0xbb, 0xed, 0x53, 0xf9, 0xbe, 0x2f, 0x13, 0x09, 0xa9, 0x49, 0xd8, 0x6e, 0x47, 0xde, 0x37, 0x09, - 0x69, 0xc3, 0xb4, 0xa2, 0x3e, 0x4c, 0x8b, 0xae, 0x67, 0x49, 0x4f, 0xc9, 0x57, 0xa0, 0xd2, 0xb6, - 0x4d, 0xdf, 0xd7, 0xba, 0xfa, 0x08, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x81, 0xed, 0x9e, 0xa9, 0x9a, - 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x8a, 0x11, 0x91, 0x04, 0x13, 0x33, 0xca, 0xc0, - 0x12, 0x8f, 0xd7, 0x0a, 0x61, 0x3f, 0x59, 0x8d, 0x46, 0x69, 0x46, 0x96, 0x09, 0xd9, 0xa3, 0x43, - 0xb3, 0x41, 0x08, 0xb3, 0x50, 0x31, 0x4f, 0x18, 0xa1, 0xca, 0x39, 0x0a, 0x64, 0x2b, 0x6e, 0xb7, - 0x4b, 0xbd, 0xd0, 0x14, 0x0a, 0x64, 0xcf, 0x1a, 0x35, 0xbf, 0xdb, 0x55, 0x6f, 0x3a, 0x0d, 0x83, - 0xe7, 0x61, 0x6e, 0x9b, 0x06, 0xf2, 0xca, 0x8a, 0x17, 0xc4, 0xc7, 0x30, 0x1b, 0xa1, 0x58, 0xf8, - 0x84, 0xcd, 0xb7, 0x71, 0xa1, 0xe6, 0x1b, 0xdf, 0x84, 0x9a, 0x14, 0xa0, 0xbd, 0x6b, 0xa4, 0xa7, - 0x0c, 0xdd, 0x53, 0xf8, 0x7d, 0x98, 0x09, 0x29, 0xd9, 0x4e, 0xaf, 0x41, 0x91, 0xad, 0xc8, 0x74, - 0xb3, 0x90, 0xb0, 0x31, 0xdf, 0x83, 0x13, 0xe0, 0x16, 0xcc, 0xf2, 0x01, 0x02, 0xf3, 0x53, 0x6e, - 0xdc, 0xb0, 0xc7, 0x86, 0x60, 0x7f, 0xe8, 0x76, 0x68, 0xf8, 0xd8, 0x88, 0x50, 0xf8, 0x27, 0x50, - 0xdd, 0x74, 0xfb, 0x7d, 0xd3, 0xe9, 0x28, 0x2f, 0x51, 0x67, 0xc4, 0x8f, 0x59, 0x21, 0xec, 0x27, - 0x0f, 0x99, 0x1e, 0xb5, 0x6d, 0x19, 0x79, 0x02, 0x88, 0x02, 0x7a, 0x52, 0x0b, 0x68, 0x16, 0x48, - 0xa6, 0x77, 0x32, 0x14, 0x8f, 0xa7, 0x22, 0x97, 0x11, 0x21, 0x98, 0x82, 0xac, 0x1f, 0x97, 0xb1, - 0xc7, 0x7f, 0xe3, 0x87, 0x50, 0xdd, 0xec, 0x99, 0x8e, 0x43, 0xed, 0xdc, 0x33, 0x20, 0xad, 0x2b, - 0xaa, 0xc8, 0x6a, 0xc9, 0xad, 0xe9, 0x9d, 0xd0, 0x20, 0x8a, 0x7b, 0x06, 0xe1, 0x7f, 0x4e, 0x42, - 0x39, 0xbc, 0x48, 0xdf, 0x85, 0x8a, 0xcf, 0x9c, 0xc3, 0x63, 0x56, 0xd8, 0x33, 0xdf, 0x71, 0x11, - 0x29, 0xe3, 0x6b, 0x2b, 0xab, 0xca, 0x36, 0xaf, 0x91, 0xf0, 0x43, 0x68, 0x75, 0x12, 0x91, 0xa2, - 0x4f, 0x60, 0xce, 0x72, 0x8e, 0xdd, 0xa1, 0xd3, 0x91, 0x47, 0x62, 0xe9, 0x8a, 0x85, 0xcb, 0x92, - 0x5e, 0x34, 0xa2, 0xd3, 0x92, 0x24, 0x39, 0xda, 0x80, 0xba, 0x3b, 0x0c, 0xe2, 0x22, 0x8a, 0x63, - 0x45, 0xa4, 0xe8, 0xd1, 0x6d, 0xe6, 0xf2, 0xd0, 0xa1, 0x72, 0x20, 0x16, 0x63, 0x8f, 0x56, 0x89, - 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x66, 0xd0, 0x93, 0x59, 0x20, 0x84, 0xf9, 0x27, 0x06, - 0x67, 0xb4, 0x2b, 0xc6, 0x59, 0x15, 0x22, 0x00, 0xb4, 0x19, 0xcb, 0xaa, 0xe2, 0x75, 0xf6, 0xad, - 0x8c, 0x90, 0xfd, 0x26, 0x13, 0xe8, 0x5b, 0xb0, 0x10, 0x2f, 0xc4, 0xe2, 0xbe, 0x35, 0x60, 0x5a, - 0xdc, 0x30, 0x5f, 0x06, 0xb3, 0x02, 0xf1, 0x2f, 0x0c, 0x98, 0x4f, 0x95, 0x6e, 0x74, 0x07, 0xaa, - 0xa7, 0x96, 0x6d, 0xd3, 0xce, 0xe1, 0x85, 0xee, 0xb9, 0x4e, 0x8c, 0x3e, 0x84, 0x19, 0x4f, 0x34, - 0x1c, 0xaa, 0x67, 0x19, 0xcf, 0x1c, 0xa3, 0xc6, 0x9b, 0x3c, 0xff, 0xb0, 0xc7, 0x43, 0xa8, 0x7c, - 0x68, 0x6d, 0x43, 0xb7, 0x76, 0x13, 0xca, 0x03, 0x33, 0xe8, 0x1d, 0x0c, 0x68, 0x5b, 0xb5, 0x88, - 0x0a, 0xc6, 0x5f, 0x16, 0xa1, 0xac, 0xde, 0x1f, 0x79, 0x15, 0x24, 0xeb, 0xf3, 0x4a, 0xce, 0xb0, - 0xa1, 0x09, 0xe5, 0xee, 0xd0, 0xb6, 0x79, 0x28, 0x88, 0x8c, 0x19, 0xc2, 0xba, 0x65, 0x4b, 0x31, - 0xcb, 0xa2, 0xd7, 0xa1, 0xc4, 0x7a, 0x56, 0xbf, 0x31, 0xc5, 0x0d, 0x90, 0xf9, 0x36, 0x12, 0x14, - 0xe8, 0x6e, 0x6a, 0xaa, 0xf0, 0x6a, 0x06, 0x75, 0xee, 0x38, 0xe1, 0x9d, 0xd8, 0x38, 0xe1, 0x6a, - 0x16, 0x6b, 0x72, 0x8e, 0x70, 0x37, 0x35, 0x47, 0xc8, 0xdc, 0xf1, 0xff, 0x68, 0x80, 0x70, 0x87, - 0x57, 0x31, 0x19, 0x58, 0x2c, 0xc6, 0x43, 0xff, 0x18, 0xe7, 0xf9, 0x07, 0xff, 0xce, 0x80, 0x57, - 0xb6, 0x69, 0xf0, 0x34, 0x31, 0x4e, 0x08, 0x23, 0x74, 0x15, 0xaa, 0x1e, 0x1d, 0xb8, 0x8f, 0xcc, - 0x20, 0xa0, 0x9e, 0x9a, 0xd5, 0xe9, 0x28, 0x74, 0x13, 0xe6, 0x3c, 0x3a, 0xb2, 0x7c, 0xcb, 0x75, - 0x14, 0x95, 0xd0, 0x30, 0x89, 0x66, 0xb2, 0x4c, 0xdb, 0xde, 0xf0, 0x4c, 0xa7, 0xdd, 0xa3, 0xaa, - 0xc5, 0xd3, 0x51, 0xbc, 0xec, 0xdb, 0xf6, 0xa1, 0x79, 0xe2, 0xcb, 0x1e, 0x5e, 0x81, 0xf8, 0x18, - 0x16, 0x93, 0x3a, 0xaa, 0x2b, 0xc0, 0x94, 0x51, 0x57, 0x80, 0xfd, 0xe6, 0xf9, 0x4d, 0x8d, 0x4b, - 0xe4, 0xfd, 0x51, 0x30, 0x7f, 0x7e, 0x49, 0xb5, 0xe4, 0x4d, 0x08, 0x61, 0xfc, 0x39, 0x5c, 0xce, - 0x36, 0x05, 0xb3, 0xe9, 0x43, 0x98, 0x4f, 0xce, 0x5c, 0xb2, 0x9e, 0x53, 0x59, 0x4a, 0x92, 0x34, - 0x27, 0x46, 0x50, 0x7f, 0x60, 0xf9, 0xec, 0x1d, 0xe2, 0x6a, 0x5f, 0xd2, 0xca, 0x0c, 0xce, 0xbd, - 0xda, 0x0d, 0x98, 0x96, 0x17, 0x43, 0xd6, 0x68, 0x05, 0x32, 0x1f, 0xc8, 0x9f, 0x24, 0x7e, 0xb8, - 0x24, 0x1a, 0x7f, 0x01, 0x35, 0x6d, 0x5f, 0x15, 0x2c, 0x0c, 0xca, 0x0a, 0x16, 0xa9, 0x0d, 0x11, - 0x14, 0xe8, 0x3d, 0xb8, 0x74, 0xc2, 0x3b, 0xf1, 0xad, 0xc4, 0x66, 0xc2, 0xca, 0xd9, 0x8b, 0x78, - 0x0f, 0x6a, 0xf7, 0x3a, 0x1d, 0x26, 0x4b, 0x05, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x30, 0x91, 0x7d, - 0x04, 0x02, 0x33, 0xa1, 0x3c, 0xd1, 0xb3, 0x21, 0x87, 0x3e, 0x4f, 0xaa, 0x24, 0x64, 0x67, 0xac, - 0xb0, 0xdd, 0x2d, 0x55, 0xf1, 0x2b, 0x84, 0xff, 0xc6, 0xaf, 0xc3, 0x3c, 0xa1, 0x7d, 0x77, 0x44, - 0x75, 0x35, 0x17, 0xa1, 0x64, 0x39, 0x1d, 0xfa, 0x42, 0x7d, 0x61, 0xe0, 0x00, 0xfe, 0x1e, 0xcc, - 0xe9, 0xa4, 0x4c, 0x83, 0x1b, 0x50, 0xd3, 0xf7, 0x09, 0xc3, 0x31, 0x81, 0xc5, 0x6f, 0xc0, 0x02, - 0xa1, 0x5d, 0x8f, 0xfa, 0x3d, 0xdd, 0xef, 0x39, 0xfb, 0x7c, 0x07, 0x2e, 0x1d, 0xd0, 0x40, 0x63, - 0x1f, 0x4f, 0x7e, 0x97, 0x3f, 0x3f, 0xb7, 0xb3, 0x3c, 0xa0, 0x18, 0xf5, 0xd8, 0x37, 0x12, 0xb1, - 0xff, 0x03, 0xfe, 0xde, 0x63, 0xdb, 0xe4, 0x30, 0x67, 0xee, 0x1a, 0x13, 0x39, 0x91, 0x10, 0xf9, - 0x0e, 0xbc, 0x92, 0x27, 0x92, 0x19, 0x4d, 0xb9, 0xc1, 0xd0, 0xdc, 0x30, 0x0d, 0xa5, 0x56, 0x7f, - 0x10, 0x9c, 0xad, 0xff, 0x7b, 0x16, 0xa6, 0xe5, 0xf8, 0x09, 0x6d, 0x42, 0xf5, 0xd0, 0x33, 0xdb, - 0xf2, 0x23, 0x1e, 0x6a, 0xa4, 0xbe, 0xf5, 0x4a, 0x15, 0x9b, 0x4b, 0x19, 0x2b, 0xec, 0xa9, 0x5a, - 0x78, 0xdb, 0x40, 0xcf, 0xa0, 0x9e, 0xfc, 0x24, 0x83, 0x70, 0xfc, 0x5d, 0x98, 0xf5, 0xc5, 0xa9, - 0xb9, 0x3a, 0x96, 0x86, 0x4b, 0x47, 0x1b, 0x50, 0x56, 0x9f, 0x2c, 0x90, 0x3e, 0x62, 0x4c, 0x7c, - 0xf2, 0x68, 0x36, 0x32, 0xd7, 0x84, 0x8c, 0xa7, 0xbc, 0x39, 0xd0, 0xbf, 0x65, 0xa0, 0x57, 0x73, - 0x9f, 0xad, 0xe1, 0x89, 0xaf, 0x8d, 0x23, 0x11, 0x82, 0x0f, 0xa1, 0x16, 0x1f, 0xcf, 0xa2, 0xd5, - 0xf3, 0x66, 0xc3, 0xcd, 0x95, 0x31, 0x14, 0xa1, 0xd4, 0xf8, 0x7e, 0x68, 0x35, 0x57, 0x95, 0x2c, - 0xa9, 0x19, 0x23, 0x5b, 0x5c, 0x40, 0x3f, 0x06, 0x94, 0x9e, 0x39, 0xa2, 0xeb, 0x17, 0x99, 0x8f, - 0x36, 0xf1, 0x39, 0x54, 0x62, 0x87, 0x1f, 0xc1, 0x7c, 0x6a, 0x5a, 0x86, 0xf4, 0x4e, 0x36, 0x6f, - 0x0a, 0xd9, 0x7c, 0x75, 0x3c, 0x51, 0x78, 0x80, 0xf4, 0xac, 0x29, 0x76, 0x80, 0xdc, 0xe9, 0x58, - 0xec, 0x00, 0x39, 0x03, 0x2b, 0x11, 0x6b, 0xea, 0xc5, 0x1a, 0x8b, 0xb5, 0xc4, 0xcb, 0x36, 0x16, - 0x6b, 0xb1, 0x27, 0x2e, 0x2e, 0xa0, 0x8f, 0x61, 0x5a, 0xa2, 0xd0, 0xe5, 0x34, 0x99, 0x92, 0xb0, - 0x9c, 0xb5, 0x24, 0x04, 0xec, 0xc1, 0x8c, 0xde, 0x58, 0xa3, 0x95, 0xdc, 0x61, 0x99, 0x10, 0x35, - 0x76, 0x98, 0x16, 0x1e, 0x8a, 0x37, 0x30, 0xc9, 0x43, 0xe9, 0xed, 0x72, 0xf2, 0x50, 0x51, 0xc7, - 0x83, 0x0b, 0xa8, 0xcb, 0x3f, 0x06, 0xa6, 0x8a, 0x37, 0xba, 0x11, 0xe7, 0xc9, 0x6b, 0x74, 0x9a, - 0xd7, 0xcf, 0xa5, 0x13, 0xfb, 0xb4, 0xa0, 0x12, 0x16, 0x50, 0xf4, 0x8a, 0xc6, 0x94, 0x2c, 0xe7, - 0xcd, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x64, 0x11, 0x8b, 0xf9, 0x20, 0x5e, 0x28, 0x63, 0x3e, 0xd0, - 0x6b, 0x1e, 0x2e, 0xa0, 0x1d, 0x80, 0xa8, 0x0c, 0xa1, 0x2b, 0xb1, 0xaa, 0x9d, 0x28, 0x64, 0xcd, - 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x8c, 0x5e, 0x95, 0x62, 0xde, 0xcc, 0x28, 0x57, 0xcd, 0xba, 0x3e, - 0x3d, 0x66, 0xd9, 0x1a, 0x17, 0xd0, 0x7d, 0xa8, 0xc5, 0x8b, 0x55, 0x2c, 0x1f, 0x64, 0xd6, 0xb1, - 0x4c, 0x39, 0xcf, 0xa0, 0x91, 0x57, 0xc5, 0xd0, 0xad, 0xb8, 0xc4, 0x71, 0xa5, 0x2e, 0x53, 0xb6, - 0x0d, 0x4b, 0xd9, 0xf5, 0x08, 0xdd, 0x8c, 0x4b, 0xce, 0xaf, 0x82, 0xcd, 0x1b, 0x17, 0xa0, 0x14, - 0x56, 0xfd, 0x10, 0x2a, 0xe1, 0x3f, 0x1b, 0x62, 0x71, 0x92, 0xfc, 0xbf, 0x43, 0x5c, 0xd7, 0x11, - 0x75, 0x82, 0xb7, 0x8d, 0x8d, 0xdb, 0x7f, 0xfc, 0x6a, 0xc5, 0xf8, 0xdb, 0x57, 0x2b, 0xc6, 0xdf, - 0xbf, 0x5a, 0x31, 0x7e, 0xfd, 0x8f, 0x95, 0x02, 0xe0, 0x76, 0x6f, 0xad, 0x4d, 0x3d, 0x67, 0xcd, - 0xb4, 0xad, 0x36, 0x5d, 0x73, 0xd7, 0xd7, 0x14, 0x8f, 0x37, 0x68, 0xfb, 0xd4, 0x1b, 0x51, 0xef, - 0xd9, 0xc4, 0xe0, 0xf8, 0x78, 0x8a, 0xff, 0xd7, 0xf0, 0xdd, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, - 0x94, 0x33, 0x95, 0x63, 0x85, 0x28, 0x00, 0x00, + 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, + 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, + 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, + 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, + 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, + 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, + 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, + 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, + 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, + 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, + 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, + 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, + 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, + 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, + 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, + 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, + 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, + 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, + 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, + 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, + 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, + 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, + 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, + 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, + 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, + 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, + 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, + 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, + 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, + 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, + 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, + 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, + 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, + 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, + 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, + 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, + 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, + 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, + 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, + 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, + 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, + 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, + 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, + 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, + 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, + 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, + 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, + 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, + 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, + 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, + 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, + 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, + 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, + 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, + 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, + 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, + 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, + 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, + 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, + 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, + 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, + 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, + 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, + 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, + 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, + 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, + 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, + 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, + 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, + 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, + 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, + 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, + 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, + 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, + 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, + 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, + 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, + 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, + 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, + 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, + 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, + 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, + 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, + 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, + 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, + 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, + 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, + 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, + 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, + 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, + 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, + 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, + 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, + 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, + 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, + 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, + 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, + 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, + 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, + 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, + 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, + 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, + 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, + 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, + 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, + 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, + 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, + 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, + 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, + 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, + 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, + 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, + 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, + 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, + 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, + 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, + 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, + 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, + 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, + 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, + 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, + 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, + 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, + 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, + 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, + 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, + 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, + 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, + 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, + 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, + 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, + 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, + 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, + 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, + 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, + 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, + 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, + 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, + 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, + 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, + 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, + 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, + 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, + 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, + 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, + 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, + 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, + 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, + 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, + 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, + 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, + 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, + 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, + 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, + 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, + 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, + 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, + 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, + 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, + 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, + 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, + 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, + 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, + 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, + 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, + 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, + 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, + 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, + 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, + 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, + 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, + 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, + 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, + 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, + 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, + 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, + 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, + 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, + 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, + 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, + 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, + 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, + 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, + 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, + 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, + 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, + 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, + 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, + 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -7265,6 +7274,13 @@ func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SandboxStdout) > 0 { + i -= len(m.SandboxStdout) + copy(dAtA[i:], m.SandboxStdout) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) + i-- + dAtA[i] = 0x4a + } if len(m.Pid) > 0 { i -= len(m.Pid) copy(dAtA[i:], m.Pid) @@ -9678,6 +9694,10 @@ func (m *ShortTaskInfo) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.SandboxStdout) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -15732,6 +15752,38 @@ func (m *ShortTaskInfo) Unmarshal(dAtA []byte) error { } m.Pid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 9: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SandboxStdout = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index c12fcb25e..0f7df49de 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -295,6 +295,7 @@ message ShortTaskInfo { string className = 6; TaskDeploymentInfo deploymentInfo = 7; string pid = 8; + string sandboxStdout = 9; } message TaskDeploymentInfo { string hostname = 1; diff --git a/core/server.go b/core/server.go index 9facac25c..d8eb18b00 100644 --- a/core/server.go +++ b/core/server.go @@ -143,7 +143,7 @@ func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) Id: env.Id().String(), CreatedWhen: env.CreatedWhen().Format(time.RFC3339), State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), @@ -199,7 +199,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Id: newEnv.Id().String(), CreatedWhen: newEnv.CreatedWhen().Format(time.RFC3339), State: newEnv.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: newEnv.Workflow().GetName(), CurrentRunNumber: newEnv.GetCurrentRunNumber(), } @@ -237,7 +237,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe Id: env.Id().String(), CreatedWhen: env.CreatedWhen().Format(time.RFC3339), State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), @@ -390,7 +390,7 @@ func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasks tasks := m.state.taskman.GetTasks() r := &pb.GetTasksReply{ - Tasks: tasksToShortTaskInfos(tasks), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), } return r, nil @@ -430,7 +430,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge rep := &pb.GetTaskReply{ Task: &pb.TaskInfo{ - ShortInfo: taskToShortTaskInfo(task), + ShortInfo: taskToShortTaskInfo(task, m.state.taskman), ClassInfo: &pb.TaskClassInfo{ Name: task.GetClassName(), ControlMode: task.GetControlMode().String(), @@ -469,8 +469,8 @@ func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.Shor killedTasks, runningTasks, err = m.state.taskman.KillTasks(taskIds) } - killedTaskInfos = tasksToShortTaskInfos(killedTasks) - runningTaskInfos = tasksToShortTaskInfos(runningTasks) + killedTaskInfos = tasksToShortTaskInfos(killedTasks, m.state.taskman) + runningTaskInfos = tasksToShortTaskInfos(runningTasks, m.state.taskman) return } diff --git a/core/serverutil.go b/core/serverutil.go index 7345d9544..7de68938a 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -25,6 +25,8 @@ package core import ( + "fmt" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/channel" @@ -33,6 +35,8 @@ import ( "github.com/AliceO2Group/Control/core/workflow" ) +const MESOS_AGENT_PORT = 5051 + func commandInfoToPbCommandInfo(c *common.TaskCommandInfo) (pci *pb.CommandInfo) { if c == nil { return @@ -86,10 +90,29 @@ func outboundChannelToPbChannel(ch channel.Outbound) (pch *pb.ChannelInfo) { return } -func taskToShortTaskInfo(t *task.Task) (sti *pb.ShortTaskInfo) { +func taskToShortTaskInfo(t *task.Task, taskman *task.Manager) (sti *pb.ShortTaskInfo) { if t == nil { return } + + var( + slaveHost = t.GetHostname() + slavePort = MESOS_AGENT_PORT + workDir = "/var/mesos" + slaveId = t.GetAgentId() + frameworkId = taskman.GetFrameworkID() + executorId = t.GetExecutorId() + containerId = "latest" + ) + sandboxStdoutUri := fmt.Sprintf("http://%s:%d/files/download?path=%s/slaves/%s/frameworks/%s/executors/%s/runs/%s/stdout", + slaveHost, + slavePort, + workDir, + slaveId, + frameworkId, + executorId, + containerId) + sti = &pb.ShortTaskInfo{ Name: t.GetName(), Locked: t.IsLocked(), @@ -104,6 +127,7 @@ func taskToShortTaskInfo(t *task.Task) (sti *pb.ShortTaskInfo) { ExecutorId: t.GetExecutorId(), }, Pid: t.GetTaskPID(), + SandboxStdout: sandboxStdoutUri, } parentRole, ok := t.GetParentRole().(workflow.Role) if ok && parentRole != nil { @@ -113,13 +137,13 @@ func taskToShortTaskInfo(t *task.Task) (sti *pb.ShortTaskInfo) { return } -func tasksToShortTaskInfos(tasks []*task.Task) (stis []*pb.ShortTaskInfo) { +func tasksToShortTaskInfos(tasks []*task.Task, taskman *task.Manager) (stis []*pb.ShortTaskInfo) { if tasks == nil { return } stis = make([]*pb.ShortTaskInfo, len(tasks)) for i, t := range tasks { - shortTaskInfo := taskToShortTaskInfo(t) + shortTaskInfo := taskToShortTaskInfo(t, taskman) stis[i] = shortTaskInfo } return From f751b58c892d81176507aec15a9e1c8092d1e309 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:24:54 +0100 Subject: [PATCH 0614/2352] [coconut] create auto subcommand for environment --- coconut/cmd/environment_autorun.go | 55 +++++++++++++++++++++++++ coconut/control/control.go | 66 ++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 coconut/cmd/environment_autorun.go diff --git a/coconut/cmd/environment_autorun.go b/coconut/cmd/environment_autorun.go new file mode 100644 index 000000000..b076abcb7 --- /dev/null +++ b/coconut/cmd/environment_autorun.go @@ -0,0 +1,55 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + + "github.com/AliceO2Group/Control/coconut/control" + "github.com/AliceO2Group/Control/common/product" + "github.com/spf13/cobra" +) + +// environmentCreateCmd represents the environment list command +var environmentCreateAutoCmd = &cobra.Command{ + Use: "auto", + Aliases: []string{"a",}, + Short: "create auto run environment", + Long: fmt.Sprintf(`The environment create auto command requests from %s the +creation of a new autorun environment. + +The operation may or may not be successful depending on available resources and configuration.`, product.PRETTY_SHORTNAME), + Run: control.WrapCall(control.CreateAutoEnvironment), + +} + +func init() { + environmentCreateCmd.AddCommand(environmentCreateAutoCmd) + + environmentCreateAutoCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") + environmentCreateAutoCmd.MarkFlagRequired("workflow-template") + + environmentCreateAutoCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") +} diff --git a/coconut/control/control.go b/coconut/control/control.go index be4047709..5a64906cf 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -234,6 +234,72 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } +func CreateAutoEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error){ + wfPath, err := cmd.Flags().GetString("workflow-template") + if err != nil { + return + } + if len(wfPath) == 0 { + err = errors.New("cannot create empty environment") + return + } + + var extraVars string + extraVars, err = cmd.Flags().GetString("extra-vars") + if err != nil { + return + } + + extraVars = strings.TrimSpace(extraVars) + if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { + err = errors.New("empty list of extra-vars supplied") + return + } + + extraVarsMap, err := utils.ParseExtraVars(extraVars) + if err != nil { + return + } + + // subscribe to core to receive events + responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + // response is empty we should receive all the info through subscribe call + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + if err != nil { + return + } + for { + rcv, err := responseS.Recv() + if err != nil { + if err == io.EOF { + break + } + log.WithPrefix("sub"). + WithError(err). + Fatal("command finished with error") + } + if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt.Error != "" { + log.WithPrefix("ERROR"). + Info(rcv) + } + if evt.Closestream { + return nil + } + + } + log.WithPrefix("EVENT"). + Info(rcv) + } + + return +} + func stringMapToString(stringMap map[string]string, indent string) string { if len(stringMap) == 0 { return "" From cf5a6a0b962f18c4158a9a318e6778eaaa64aff5 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:26:54 +0100 Subject: [PATCH 0615/2352] [core] update protos --- coconut/protos/o2control.pb.go | 971 ++++++++++++++++++++++----------- core/protos/coreevents.go | 48 +- core/protos/o2control.pb.go | 971 ++++++++++++++++++++++----------- core/protos/o2control.proto | 21 +- 4 files changed, 1315 insertions(+), 696 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 89265c7ac..6a46de750 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} } type Event_MesosHeartbeat struct { @@ -162,9 +162,9 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo type Ev_EnvironmentStateChanged struct { - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -203,25 +203,25 @@ func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEvent() string { +func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { if m != nil { - return m.Event + return m.Environmentid } return "" } -func (m *Ev_EnvironmentStateChanged) GetSource() string { +func (m *Ev_EnvironmentStateChanged) GetState() string { if m != nil { - return m.Source + return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetDestination() string { +func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { if m != nil { - return m.Destination + return m.CurrentRunNumber } - return "" + return 0 } type Ev_TaskStateChanged struct { @@ -539,6 +539,8 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { } type Ev_EnvironmentError struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -577,24 +579,39 @@ func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type Ev_KillTasksMesos struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentError) GetError() string { + if m != nil { + return m.Error + } + return "" } -func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } -func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } -func (*Ev_KillTasksMesos) ProtoMessage() {} -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentError) GetClosestream() bool { + if m != nil { + return m.Closestream + } + return false +} + +type Ev_TasksKilled struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } +func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } +func (*Ev_TasksKilled) ProtoMessage() {} +func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { +func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -604,17 +621,24 @@ func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) +func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TasksKilled.Merge(m, src) } -func (m *Ev_KillTasksMesos) XXX_Size() int { +func (m *Ev_TasksKilled) XXX_Size() int { return m.Size() } -func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) +func (m *Ev_TasksKilled) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) } -var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo +var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo + +func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { + if m != nil { + return m.KilledTasks + } + return nil +} //////////////////////////////////////// // Global status @@ -807,7 +831,7 @@ type Event struct { // *Event_MesosTaskcreated // *Event_EnvironmentDestroyed // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_Taskskilled Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -877,8 +901,8 @@ type Event_EnvironmentDestroyed struct { type Event_EnvironmentError struct { EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` } -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +type Event_Taskskilled struct { + Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` } func (*Event_EnvironmentStateChanged) isEvent_Payload() {} @@ -889,7 +913,7 @@ func (*Event_Tasklaunched) isEvent_Payload() {} func (*Event_MesosTaskcreated) isEvent_Payload() {} func (*Event_EnvironmentDestroyed) isEvent_Payload() {} func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_Taskskilled) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -961,9 +985,9 @@ func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { return nil } -func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (m *Event) GetTaskskilled() *Ev_TasksKilled { + if x, ok := m.GetPayload().(*Event_Taskskilled); ok { + return x.Taskskilled } return nil } @@ -979,7 +1003,7 @@ func (*Event) XXX_OneofWrappers() []interface{} { (*Event_MesosTaskcreated)(nil), (*Event_EnvironmentDestroyed)(nil), (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + (*Event_Taskskilled)(nil), } } @@ -1643,6 +1667,45 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } +func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) +} +func (m *NewAutoEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo + type GetEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1654,7 +1717,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1765,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1757,7 +1820,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1813,7 +1876,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1939,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1938,7 +2001,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1994,7 +2057,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2121,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2126,7 +2189,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2179,7 +2242,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2232,7 +2295,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2277,7 +2340,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2338,7 +2401,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2459,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2502,7 +2565,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2569,7 +2632,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2609,7 +2672,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2719,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,7 +2766,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2751,7 +2814,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2809,7 +2872,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2949,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2954,7 +3017,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3113,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3098,7 +3161,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3156,7 +3219,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3281,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3321,7 +3384,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3434,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3441,7 +3504,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3565,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3548,7 +3611,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3590,7 +3653,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3652,7 +3715,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3707,7 +3770,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3825,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3816,7 +3879,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3863,7 +3926,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3910,7 +3973,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3957,7 +4020,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4004,7 +4067,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4052,7 +4115,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4106,7 +4169,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4152,7 +4215,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{69} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4194,7 +4257,7 @@ func init() { proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4214,6 +4277,7 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") @@ -4269,199 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3069 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, - 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, - 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, - 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, - 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, - 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, - 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, - 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, - 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, - 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, - 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, - 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, - 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, - 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, - 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, - 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, - 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, - 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, - 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, - 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, - 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, - 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, - 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, - 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, - 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, - 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, - 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, - 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, - 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, - 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, - 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, - 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, - 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, - 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, - 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, - 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, - 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, - 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, - 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, - 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, - 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, - 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, - 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, - 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, - 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, - 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, - 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, - 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, - 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, - 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, - 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, - 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, - 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, - 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, - 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, - 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, - 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, - 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, - 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, - 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, - 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, - 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, - 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, - 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, - 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, - 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, - 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, - 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, - 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, - 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, - 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, - 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, - 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, - 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, - 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, - 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, - 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, - 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, - 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, - 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, - 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, - 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, - 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, - 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, - 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, - 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, - 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, - 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, - 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, - 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, - 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, - 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, - 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, - 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, - 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, - 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, - 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, - 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, - 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, - 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, - 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, - 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, - 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, - 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, - 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, - 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, - 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, - 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, - 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, - 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, - 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, - 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, - 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, - 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, - 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, - 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, - 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, - 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, - 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, - 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, - 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, - 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, - 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, - 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, - 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, - 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, - 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, - 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, - 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, - 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, - 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, - 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, - 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, - 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, - 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, - 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, - 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, - 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, - 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, - 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, - 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, - 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, - 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, - 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, - 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, - 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, - 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, - 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, - 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, - 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, - 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, - 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, - 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, - 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, - 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, - 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, - 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, - 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, - 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, - 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, - 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, - 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, - 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, - 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, - 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, - 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, - 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, - 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, - 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, - 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, - 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, - 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, - 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, - 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, - 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, - 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, - 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, - 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, - 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, - 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, - 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, - 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, - 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, - 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, - 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, - 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, - 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, + // 3101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, + 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, + 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, + 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, + 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, + 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, + 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, + 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, + 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, + 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, + 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, + 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, + 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, + 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, + 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, + 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, + 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, + 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, + 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, + 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, + 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, + 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, + 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, + 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, + 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, + 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, + 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, + 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, + 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, + 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, + 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, + 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, + 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, + 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, + 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, + 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, + 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, + 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, + 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, + 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, + 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, + 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, + 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, + 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, + 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, + 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, + 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, + 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, + 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, + 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, + 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, + 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, + 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, + 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, + 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, + 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, + 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, + 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, + 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, + 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, + 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, + 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, + 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, + 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, + 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, + 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, + 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, + 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, + 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, + 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, + 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, + 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, + 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, + 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, + 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, + 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, + 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, + 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, + 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, + 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, + 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, + 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, + 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, + 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, + 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, + 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, + 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, + 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, + 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, + 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, + 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, + 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, + 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, + 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, + 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, + 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, + 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, + 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, + 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, + 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, + 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, + 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, + 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, + 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, + 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, + 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, + 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, + 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, + 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, + 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, + 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, + 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, + 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, + 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, + 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, + 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, + 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, + 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, + 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, + 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, + 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, + 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, + 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, + 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, + 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, + 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, + 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, + 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, + 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, + 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, + 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, + 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, + 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, + 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, + 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, + 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, + 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, + 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, + 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, + 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, + 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, + 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, + 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, + 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, + 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, + 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, + 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, + 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, + 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, + 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, + 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, + 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, + 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, + 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, + 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, + 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, + 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, + 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, + 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, + 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, + 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, + 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, + 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, + 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, + 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, + 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, + 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, + 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, + 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, + 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, + 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, + 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, + 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, + 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, + 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, + 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, + 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, + 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, + 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, + 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, + 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, + 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, + 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, + 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, + 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, + 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, + 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4480,6 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4567,6 +4634,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -4758,6 +4834,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4794,6 +4871,9 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -4928,6 +5008,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -5271,6 +5369,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5406,24 +5508,22 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Destination) > 0 { - i -= len(m.Destination) - copy(dAtA[i:], m.Destination) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if len(m.Source) > 0 { - i -= len(m.Source) - copy(dAtA[i:], m.Source) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x12 } - if len(m.Event) > 0 { - i -= len(m.Event) - copy(dAtA[i:], m.Event) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- dAtA[i] = 0xa } @@ -5696,10 +5796,27 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Closestream { + i-- + if m.Closestream { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { +func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5709,12 +5826,12 @@ func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5723,6 +5840,20 @@ func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -6074,16 +6205,16 @@ func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.KilltasksMesos != nil { + if m.Taskskilled != nil { { - size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6646,6 +6777,33 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8785,17 +8943,16 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { } var l int _ = l - l = len(m.Event) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Source) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Destination) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8921,18 +9078,31 @@ func (m *Ev_EnvironmentError) Size() (n int) { } var l int _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Closestream { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *Ev_KillTasksMesos) Size() (n int) { +func (m *Ev_TasksKilled) Size() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9118,14 +9288,14 @@ func (m *Event_EnvironmentError) Size() (n int) { } return n } -func (m *Event_KilltasksMesos) Size() (n int) { +func (m *Event_Taskskilled) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.KilltasksMesos != nil { - l = m.KilltasksMesos.Size() + if m.Taskskilled != nil { + l = m.Taskskilled.Size() n += 1 + l + sovO2Control(uint64(l)) } return n @@ -9387,6 +9557,18 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *GetEnvironmentRequest) Size() (n int) { if m == nil { return 0 @@ -10449,7 +10631,7 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10477,11 +10659,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Event = string(dAtA[iNdEx:postIndex]) + m.Environmentid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10509,13 +10691,13 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Source = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var stringLen uint64 + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10525,24 +10707,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Destination = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11249,6 +11418,58 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Closestream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11274,7 +11495,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { +func (m *Ev_TasksKilled) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11297,12 +11518,46 @@ func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_KillTasksMesos: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TasksKilled: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) + if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11953,7 +12208,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11980,11 +12235,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_KillTasksMesos{} + v := &Ev_TasksKilled{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_KilltasksMesos{v} + m.Payload = &Event_Taskskilled{v} iNdEx = postIndex default: iNdEx = preIndex @@ -13802,6 +14057,60 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index 7d86359e8..881311b3e 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -25,19 +25,17 @@ package pb import ( - "encoding/json" "time" - "github.com/mesos/mesos-go/api/v1/lib" + "github.com/AliceO2Group/Control/common/utils/uid" ) -func NewEnvironmentStateEvent(cmdb []byte) *Event { +func NewEnvironmentStateEvent(envId uid.ID, state string, rn uint32) *Event { var te Ev_EnvironmentStateChanged var tEvnt Event_EnvironmentStateChanged - err := json.Unmarshal(cmdb, &te) - if err != nil { - return nil - } + te.State = state + te.Environmentid = envId.String() + te.CurrentRunNumber = rn tEvnt.EnvironmentStateChanged=&te return WrapEvent(&tEvnt) @@ -60,9 +58,12 @@ func NewEnvironmentDestroyedEvent(ctrl *CleanupTasksReply, envid string) *Event return WrapEvent(&de) } -func NewEnvironmentErrorEvent() *Event { +func NewEnvironmentErrorEvent(errSt string, close bool) *Event { var ee Event_EnvironmentError - ee.EnvironmentError = &Ev_EnvironmentError{} + ee.EnvironmentError = &Ev_EnvironmentError{ + Error: errSt, + Closestream: close, + } return WrapEvent(&ee) } @@ -75,24 +76,13 @@ func NewEventTaskState(taskid,state string) *Event { return WrapEvent(&stCh) } -func NewEventTaskStatus(status *mesos.TaskStatus) *Event { - - taskId := status.GetTaskID().Value - var statuschanged Ev_TaskStatusChanged +func NewEventTaskStatus(taskid,status string) *Event { var etSt Event_TaskStatusChanged - switch st := status.GetState(); st { - case mesos.TASK_RUNNING: - // wrap to create environment ACTIVE - statuschanged.Taskid = taskId - statuschanged.Status = "ACTIVE" - case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: - statuschanged.Taskid = taskId - statuschanged.Status = "INACTIVE" - case mesos.TASK_FINISHED: - statuschanged.Taskid = taskId - } - etSt.TaskStatusChanged = &statuschanged + etSt.TaskStatusChanged = &Ev_TaskStatusChanged{ + Taskid: taskid, + Status: status, + } return WrapEvent(&etSt) } @@ -118,9 +108,11 @@ func NewEventMesosTaskCreated(resourcesRequest,executorResources string) *Event return WrapEvent(&emtask) } -func NewKillTasksEvent() *Event { - var ke Event_KilltasksMesos - ke.KilltasksMesos = &Ev_KillTasksMesos{} +func NewKillTasksEvent(killed []*ShortTaskInfo) *Event { + var ke Event_Taskskilled + ke.Taskskilled = &Ev_TasksKilled{ + KilledTasks: killed, + } return WrapEvent(&ke) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 89265c7ac..6a46de750 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} } type Event_MesosHeartbeat struct { @@ -162,9 +162,9 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo type Ev_EnvironmentStateChanged struct { - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -203,25 +203,25 @@ func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEvent() string { +func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { if m != nil { - return m.Event + return m.Environmentid } return "" } -func (m *Ev_EnvironmentStateChanged) GetSource() string { +func (m *Ev_EnvironmentStateChanged) GetState() string { if m != nil { - return m.Source + return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetDestination() string { +func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { if m != nil { - return m.Destination + return m.CurrentRunNumber } - return "" + return 0 } type Ev_TaskStateChanged struct { @@ -539,6 +539,8 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { } type Ev_EnvironmentError struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -577,24 +579,39 @@ func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type Ev_KillTasksMesos struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentError) GetError() string { + if m != nil { + return m.Error + } + return "" } -func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } -func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } -func (*Ev_KillTasksMesos) ProtoMessage() {} -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentError) GetClosestream() bool { + if m != nil { + return m.Closestream + } + return false +} + +type Ev_TasksKilled struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } +func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } +func (*Ev_TasksKilled) ProtoMessage() {} +func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { +func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -604,17 +621,24 @@ func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) +func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TasksKilled.Merge(m, src) } -func (m *Ev_KillTasksMesos) XXX_Size() int { +func (m *Ev_TasksKilled) XXX_Size() int { return m.Size() } -func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) +func (m *Ev_TasksKilled) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) } -var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo +var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo + +func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { + if m != nil { + return m.KilledTasks + } + return nil +} //////////////////////////////////////// // Global status @@ -807,7 +831,7 @@ type Event struct { // *Event_MesosTaskcreated // *Event_EnvironmentDestroyed // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_Taskskilled Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -877,8 +901,8 @@ type Event_EnvironmentDestroyed struct { type Event_EnvironmentError struct { EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` } -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +type Event_Taskskilled struct { + Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` } func (*Event_EnvironmentStateChanged) isEvent_Payload() {} @@ -889,7 +913,7 @@ func (*Event_Tasklaunched) isEvent_Payload() {} func (*Event_MesosTaskcreated) isEvent_Payload() {} func (*Event_EnvironmentDestroyed) isEvent_Payload() {} func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_Taskskilled) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -961,9 +985,9 @@ func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { return nil } -func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (m *Event) GetTaskskilled() *Ev_TasksKilled { + if x, ok := m.GetPayload().(*Event_Taskskilled); ok { + return x.Taskskilled } return nil } @@ -979,7 +1003,7 @@ func (*Event) XXX_OneofWrappers() []interface{} { (*Event_MesosTaskcreated)(nil), (*Event_EnvironmentDestroyed)(nil), (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + (*Event_Taskskilled)(nil), } } @@ -1643,6 +1667,45 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } +func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) +} +func (m *NewAutoEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo + type GetEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1654,7 +1717,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1765,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1757,7 +1820,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1813,7 +1876,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1939,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1938,7 +2001,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1994,7 +2057,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2121,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2126,7 +2189,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2179,7 +2242,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2232,7 +2295,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2277,7 +2340,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2338,7 +2401,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2459,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2502,7 +2565,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2569,7 +2632,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2609,7 +2672,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2719,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,7 +2766,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2751,7 +2814,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2809,7 +2872,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2949,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2954,7 +3017,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3113,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3098,7 +3161,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3156,7 +3219,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3281,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3321,7 +3384,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3434,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3441,7 +3504,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3565,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3548,7 +3611,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3590,7 +3653,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3652,7 +3715,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3707,7 +3770,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3825,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3816,7 +3879,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3863,7 +3926,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3910,7 +3973,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3957,7 +4020,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4004,7 +4067,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4052,7 +4115,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4106,7 +4169,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4152,7 +4215,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{69} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4194,7 +4257,7 @@ func init() { proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4214,6 +4277,7 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") @@ -4269,199 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3069 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, - 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, - 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, - 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, - 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, - 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, - 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, - 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, - 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, - 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, - 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, - 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, - 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, - 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, - 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, - 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, - 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, - 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, - 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, - 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, - 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, - 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, - 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, - 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, - 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, - 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, - 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, - 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, - 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, - 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, - 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, - 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, - 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, - 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, - 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, - 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, - 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, - 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, - 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, - 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, - 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, - 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, - 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, - 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, - 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, - 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, - 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, - 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, - 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, - 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, - 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, - 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, - 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, - 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, - 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, - 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, - 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, - 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, - 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, - 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, - 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, - 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, - 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, - 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, - 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, - 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, - 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, - 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, - 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, - 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, - 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, - 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, - 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, - 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, - 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, - 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, - 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, - 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, - 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, - 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, - 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, - 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, - 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, - 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, - 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, - 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, - 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, - 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, - 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, - 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, - 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, - 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, - 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, - 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, - 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, - 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, - 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, - 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, - 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, - 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, - 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, - 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, - 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, - 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, - 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, - 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, - 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, - 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, - 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, - 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, - 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, - 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, - 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, - 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, - 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, - 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, - 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, - 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, - 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, - 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, - 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, - 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, - 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, - 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, - 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, - 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, - 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, - 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, - 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, - 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, - 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, - 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, - 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, - 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, - 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, - 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, - 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, - 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, - 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, - 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, - 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, - 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, - 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, - 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, - 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, - 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, - 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, - 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, - 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, - 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, - 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, - 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, - 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, - 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, - 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, - 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, - 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, - 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, - 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, - 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, - 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, - 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, - 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, - 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, - 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, - 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, - 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, - 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, - 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, - 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, - 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, - 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, - 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, - 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, - 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, - 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, - 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, - 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, - 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, - 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, - 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, - 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, - 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, - 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, - 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, - 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, - 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, + // 3101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, + 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, + 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, + 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, + 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, + 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, + 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, + 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, + 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, + 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, + 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, + 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, + 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, + 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, + 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, + 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, + 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, + 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, + 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, + 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, + 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, + 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, + 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, + 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, + 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, + 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, + 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, + 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, + 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, + 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, + 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, + 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, + 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, + 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, + 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, + 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, + 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, + 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, + 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, + 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, + 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, + 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, + 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, + 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, + 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, + 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, + 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, + 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, + 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, + 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, + 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, + 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, + 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, + 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, + 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, + 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, + 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, + 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, + 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, + 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, + 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, + 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, + 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, + 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, + 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, + 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, + 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, + 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, + 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, + 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, + 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, + 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, + 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, + 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, + 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, + 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, + 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, + 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, + 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, + 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, + 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, + 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, + 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, + 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, + 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, + 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, + 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, + 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, + 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, + 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, + 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, + 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, + 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, + 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, + 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, + 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, + 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, + 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, + 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, + 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, + 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, + 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, + 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, + 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, + 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, + 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, + 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, + 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, + 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, + 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, + 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, + 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, + 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, + 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, + 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, + 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, + 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, + 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, + 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, + 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, + 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, + 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, + 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, + 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, + 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, + 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, + 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, + 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, + 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, + 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, + 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, + 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, + 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, + 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, + 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, + 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, + 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, + 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, + 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, + 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, + 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, + 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, + 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, + 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, + 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, + 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, + 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, + 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, + 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, + 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, + 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, + 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, + 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, + 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, + 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, + 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, + 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, + 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, + 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, + 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, + 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, + 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, + 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, + 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, + 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, + 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, + 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, + 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, + 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, + 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, + 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, + 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, + 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, + 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, + 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, + 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, + 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, + 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, + 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, + 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, + 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, + 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, + 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, + 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, + 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, + 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, + 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4480,6 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4567,6 +4634,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -4758,6 +4834,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4794,6 +4871,9 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -4928,6 +5008,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -5271,6 +5369,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5406,24 +5508,22 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Destination) > 0 { - i -= len(m.Destination) - copy(dAtA[i:], m.Destination) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if len(m.Source) > 0 { - i -= len(m.Source) - copy(dAtA[i:], m.Source) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x12 } - if len(m.Event) > 0 { - i -= len(m.Event) - copy(dAtA[i:], m.Event) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- dAtA[i] = 0xa } @@ -5696,10 +5796,27 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Closestream { + i-- + if m.Closestream { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { +func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5709,12 +5826,12 @@ func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5723,6 +5840,20 @@ func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -6074,16 +6205,16 @@ func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.KilltasksMesos != nil { + if m.Taskskilled != nil { { - size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6646,6 +6777,33 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8785,17 +8943,16 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { } var l int _ = l - l = len(m.Event) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Source) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Destination) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8921,18 +9078,31 @@ func (m *Ev_EnvironmentError) Size() (n int) { } var l int _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Closestream { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *Ev_KillTasksMesos) Size() (n int) { +func (m *Ev_TasksKilled) Size() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9118,14 +9288,14 @@ func (m *Event_EnvironmentError) Size() (n int) { } return n } -func (m *Event_KilltasksMesos) Size() (n int) { +func (m *Event_Taskskilled) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.KilltasksMesos != nil { - l = m.KilltasksMesos.Size() + if m.Taskskilled != nil { + l = m.Taskskilled.Size() n += 1 + l + sovO2Control(uint64(l)) } return n @@ -9387,6 +9557,18 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *GetEnvironmentRequest) Size() (n int) { if m == nil { return 0 @@ -10449,7 +10631,7 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10477,11 +10659,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Event = string(dAtA[iNdEx:postIndex]) + m.Environmentid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10509,13 +10691,13 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Source = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var stringLen uint64 + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10525,24 +10707,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Destination = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11249,6 +11418,58 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Closestream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11274,7 +11495,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { +func (m *Ev_TasksKilled) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11297,12 +11518,46 @@ func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_KillTasksMesos: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TasksKilled: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) + if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11953,7 +12208,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11980,11 +12235,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_KillTasksMesos{} + v := &Ev_TasksKilled{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_KilltasksMesos{v} + m.Payload = &Event_Taskskilled{v} iNdEx = postIndex default: iNdEx = preIndex @@ -13802,6 +14057,60 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 0f7df49de..e1d81afed 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -34,9 +34,9 @@ message Event_MesosHeartbeat { } message Ev_EnvironmentStateChanged { - string event = 1; - string source = 2; - string destination = 3; + string environmentid = 1; + string state = 2; + uint32 currentRunNumber = 3; } message Ev_TaskStateChanged { @@ -68,9 +68,12 @@ message Ev_EnvironmentDestroyed { } message Ev_EnvironmentError { + string error = 1; + bool closestream = 2; } -message Ev_KillTasksMesos { +message Ev_TasksKilled { + repeated ShortTaskInfo killedTasks = 1; } ////////////////////////////////////////////////////// @@ -82,6 +85,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} + rpc NewAutoEnvironment (NewEnvironmentRequest) returns (NewAutoEnvironmentReply) {} rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} @@ -142,11 +146,13 @@ message Event { Ev_MesosTaskCreated mesosTaskcreated = 7; Ev_EnvironmentDestroyed environmentDestroyed = 8; Ev_EnvironmentError environmentError = 9; - Ev_KillTasksMesos killtasksMesos =10; + Ev_TasksKilled taskskilled = 10; } } -message SubscribeRequest{} +message SubscribeRequest{ + +} //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -202,6 +208,9 @@ message NewEnvironmentRequest { message NewEnvironmentReply { EnvironmentInfo environment = 1; } +message NewAutoEnvironmentReply { + +} message GetEnvironmentRequest { string id = 1; From d0725baee5cba34c7362a5d1789b55db70965eba Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:39:49 +0100 Subject: [PATCH 0616/2352] [core] environment autorun feature --- core/environment/manager.go | 64 ++++++++++++++++++++ core/environment/transition_reset.go | 1 + core/environment/transition_startactivity.go | 1 + core/environment/transition_stopactivity.go | 1 + core/server.go | 11 +++- 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 8f402e8cf..e1a9ac69d 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -362,3 +362,67 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } } + +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string) { + id, err := envs.CreateEnvironment(workflowPath, userVars) + + // report error through events during the procces + // this stays here as a reminder that we should remove it + if err != nil { + // environment error should report + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + env, err := envs.Environment(id) + + // now we have the environment we should transition to start + trans := NewStartActivityTransition(envs.taskman) + if trans == nil { + // environment error should report + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + err = env.TryTransition(trans) + // this stays here as a reminder that we should remove it + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + for { + envState := env.CurrentState() + switch envState { + case "CONFIGURED": + // RUN finished so we can reset and delete the environment + err := env.TryTransition(NewResetTransition(envs.taskman)) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + err = envs.TeardownEnvironment(id, false) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + tasksForEnv := env.Workflow().GetTasks().GetTaskIds() + _, _, err = envs.taskman.KillTasks(tasksForEnv) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("") + return + case "ERROR": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment ERROR state") + return + case "MIXED": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment MIXED state") + return + case "": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment not found") + return + } + } +} \ No newline at end of file diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index b09883d92..a3669303c 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -54,6 +54,7 @@ func (t ResetTransition) do(env *Environment) (err error) { task.STANDBY.String(), nil, env.Id(), + env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index ee684b4c0..19c5d52d7 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -72,6 +72,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { task.RUNNING.String(), args, env.Id(), + runNumber, ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bebd6d2e5..bf9797817 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -59,6 +59,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.CONFIGURED.String(), nil, env.Id(), + env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/server.go b/core/server.go index d8eb18b00..4cf944fa2 100644 --- a/core/server.go +++ b/core/server.go @@ -661,14 +661,21 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe for { select { case event := <- m.state.PublicEvent: - m.state.RLock() err := srv.Send(event) if err != nil { return err } - m.state.RUnlock() case <-ctx.Done(): return ctx.Err() } } } + +func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { + m.logMethod() + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars()) + r := &pb.NewAutoEnvironmentReply{ + } + + return r, nil +} \ No newline at end of file From 18ecfe648e712b237e805483f09e2be6ad829c2f Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:44:48 +0100 Subject: [PATCH 0617/2352] [core] redifine Events --- core/globalstate.go | 2 +- core/task/coreevent.go | 39 +++++++++++++++++++++++++++------ core/task/manager.go | 38 ++++++++++++++++++++++++++++++++ core/task/scheduler.go | 15 ------------- core/task/taskop/messagetype.go | 5 ++++- 5 files changed, 75 insertions(+), 24 deletions(-) diff --git a/core/globalstate.go b/core/globalstate.go index 1d5622f7f..ef461a39e 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -54,7 +54,7 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - publicEventCh := make(chan *pb.Event) + publicEventCh := make(chan *pb.Event,100) state := &globalState{ PublicEvent: publicEventCh, diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 1ed862aef..fd0d55bed 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -41,7 +41,7 @@ type TaskmanMessage struct { // killTasksMessage } -func NewTaskmanMessage(mt taskop.MessageType) (t *TaskmanMessage) { +func newTaskmanMessage(mt taskop.MessageType) (t *TaskmanMessage) { t = &TaskmanMessage{ MessageType: mt, } @@ -56,6 +56,8 @@ type environmentMessage struct { envId uid.ID tasks Tasks descriptors Descriptors + runNumber uint32 + errSt string } func (em *environmentMessage) GetEnvironmentId() (envid uid.ID) { @@ -79,8 +81,22 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } +func (em *environmentMessage) GetRunNumber() uint32 { + if em == nil { + return 0 + } + return em.runNumber +} + +func (em *environmentMessage) GetError() string { + if em == nil { + return "" + } + return em.errSt +} + func NewEnvironmentMessage(mt taskop.MessageType, envId uid.ID, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { - t = NewTaskmanMessage(mt) + t = newTaskmanMessage(mt) t.environmentMessage = environmentMessage{ envId: envId, tasks: tasks, @@ -124,8 +140,8 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envId uid.ID) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TransitionTasks) +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID, rn uint32) (t *TaskmanMessage) { + t = newTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, event: transitionEvent, @@ -134,7 +150,8 @@ func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg } t.environmentMessage = environmentMessage{ tasks: tasks, - envId: envId, + envId: envID, + runNumber: rn, } return t } @@ -146,7 +163,7 @@ type updateTaskMessage struct { } func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TaskStatusMessage) + t = newTaskmanMessage(taskop.TaskStatusMessage) t.updateTaskMessage = updateTaskMessage{ status: mesosStatus, } @@ -154,7 +171,7 @@ func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { } func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TaskStateMessage) + t = newTaskmanMessage(taskop.TaskStateMessage) t.updateTaskMessage = updateTaskMessage{ taskId: taskid, state: state, @@ -162,6 +179,14 @@ func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { return t } +func NewEnvironmentErrorMessage(err string) (t *TaskmanMessage) { + t = newTaskmanMessage(taskop.Error) + t.environmentMessage = environmentMessage{ + errSt: err, + } + return t +} + // type killTasksMessage struct { // taskIds []string // } diff --git a/core/task/manager.go b/core/task/manager.go index 6800a5dbe..f93cd8929 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -640,6 +640,11 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks[taskId]; ok { val <- struct{}{} + select { + case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): + default: + log.Debug("state.PublicEvent channel is full") + } } return @@ -660,6 +665,11 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } + select { + case m.publicEventCh <- pb.NewEventTaskStatus(taskId, taskPtr.status.String()): + default: + log.Debug("state.PublicEvent channel is full") + } } // Kill all tasks outside an environment (all unlocked tasks) @@ -703,6 +713,10 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err <- m.ackKilledTasks[id] close(m.ackKilledTasks[id]) delete(m.ackKilledTasks, id) + select { + case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): + default: + log.Debug("state.PublicEvent channel is full") } return } @@ -786,11 +800,21 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + select { + case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber()): + default: + log.Debug("state.PublicEvent channel is full") + } }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + select { + case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber()): + default: + log.Debug("state.PublicEvent channel is full") + } }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -834,8 +858,22 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go m.updateTaskState(tm.taskId, tm.state) // case event.KillTasks: // m.killTasks(tm.GetTaskIds()) + select { + case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): + default: + log.Debug("state.PublicEvent channel is full") + } case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + case taskop.Error: + // error reported from environment need to inform stream + // FIXME: A better way to publish errors to stream that + // are not from the taskman. + select { + case m.publicEventCh <- pb.NewEnvironmentErrorEvent(tm.GetError(), true): + default: + log.Debug("state.PublicEvent channel is full") + } } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 8ecf10463..623afce44 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -355,11 +355,6 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // servent should be inside taskman and eventually // all this handling. state.servent.ProcessResponse(&res, sender) - select { - case state.taskman.publicEventCh <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): - default: - log.Debug("state.PublicEvent channel is full") - } }() return default: @@ -910,11 +905,6 @@ func (state *schedulerState) killTask(ctx context.Context, receiver controlcomma killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) - select { - case state.taskman.publicEventCh <- cpb.NewKillTasksEvent(): - default: - log.Debug("state.PublicEvent channel is full") - } return } @@ -939,11 +929,6 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), }). Debug("outgoing MESSAGE call") - select { - case state.taskman.publicEventCh <- cpb.NewEnvironmentStateEvent(bytes): - default: - log.Debug("state.PublicEvent channel is full") - } return err } diff --git a/core/task/taskop/messagetype.go b/core/task/taskop/messagetype.go index d29c9d0b1..cf8548e49 100644 --- a/core/task/taskop/messagetype.go +++ b/core/task/taskop/messagetype.go @@ -40,10 +40,11 @@ const( KillTasks TaskStatusMessage TaskStateMessage + Error ) func (mt MessageType) String() string { - return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage"}[mt] + return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage","Error"}[mt] } func (mt *MessageType) UnmarshalJSON(b []byte) error { @@ -68,6 +69,8 @@ func (mt *MessageType) UnmarshalText(b []byte) error { *mt = TaskStatusMessage case "TaskStateMessage": *mt = TaskStateMessage + case "Error": + *mt = Error } return nil From 3f3c766075a9ae6e324cc2781202623c57dd7399 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:46:04 +0100 Subject: [PATCH 0618/2352] [core] taskman utilize safeAcks --- core/task/manager.go | 19 ++++--- core/task/taskutil.go | 112 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 core/task/taskutil.go diff --git a/core/task/manager.go b/core/task/manager.go index f93cd8929..da06915b3 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -80,7 +80,7 @@ type Manager struct { schedulerState *schedulerState publicEventCh chan<- *pb.Event internalEventCh chan<- event.Event - ackKilledTasks map[string]chan struct{} + ackKilledTasks *safeAcks } func NewManager(shutdown func(), @@ -125,7 +125,7 @@ func NewManager(shutdown func(), taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - taskman.ackKilledTasks = make(map[string]chan struct{}) + taskman.ackKilledTasks = newAcks() schedulerState.setupCli() @@ -498,7 +498,6 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { if len(strings.TrimSpace(errText)) != 0 { return errors.New(response.Err().Error()) } - // FIXME: improve error handling ↑ return nil @@ -638,7 +637,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") - if val, ok := m.ackKilledTasks[taskId]; ok { + if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} select { case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): @@ -705,14 +704,16 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } for _, id := range toKill.GetTaskIds() { - m.ackKilledTasks[id] = make(chan struct{}) + m.ackKilledTasks.addAckChannel(id) } killed, running, err = m.doKillTasks(toKill) for _, id := range killed.GetTaskIds() { - <- m.ackKilledTasks[id] - close(m.ackKilledTasks[id]) - delete(m.ackKilledTasks, id) + ack,_ := m.ackKilledTasks.getValue(id) + <- ack + close(ack) + m.ackKilledTasks.deleteKey(id) + } select { case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): default: @@ -856,8 +857,6 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - // case event.KillTasks: - // m.killTasks(tm.GetTaskIds()) select { case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): default: diff --git a/core/task/taskutil.go b/core/task/taskutil.go new file mode 100644 index 000000000..6782fc134 --- /dev/null +++ b/core/task/taskutil.go @@ -0,0 +1,112 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "sync" + "github.com/AliceO2Group/Control/core/protos" +) + +func taskToShortTaskInfo(t *Task) (sti *pb.ShortTaskInfo) { + if t == nil { + return + } + sti = &pb.ShortTaskInfo{ + Name: t.GetName(), + Locked: t.IsLocked(), + TaskId: t.GetTaskId(), + ClassName: t.GetClassName(), + DeploymentInfo: &pb.TaskDeploymentInfo{ + Hostname: t.GetHostname(), + AgentId: t.GetAgentId(), + OfferId: t.GetOfferId(), + ExecutorId: t.GetExecutorId(), + }, + Pid: t.GetTaskPID(), + } + return +} + +func tasksToShortTaskInfos(tasks []*Task) (stis []*pb.ShortTaskInfo) { + if tasks == nil { + return + } + stis = make([]*pb.ShortTaskInfo, len(tasks)) + for i, t := range tasks { + shortTaskInfo := taskToShortTaskInfo(t) + stis[i] = shortTaskInfo + } + return +} + +type safeAcks struct { + mu sync.RWMutex + acks map[string]chan struct{} +} + +func (a *safeAcks) getMap() map[string]chan struct{} { + a.mu.RLock() + defer a.mu.RUnlock() + + return a.acks +} + +func (a *safeAcks) deleteKey(key string) { + a.mu.Lock() + defer a.mu.Unlock() + + delete(a.acks, key) +} + +func (a *safeAcks) contains(key string) bool { + a.mu.RLock() + defer a.mu.RUnlock() + + _, ok := a.acks[key] + + return ok +} + + +func (a *safeAcks) addAckChannel(key string) { + a.mu.Lock() + defer a.mu.Unlock() + + a.acks[key] = make(chan struct{}) +} + +func (a *safeAcks) getValue(key string) (ch chan struct{}, ok bool) { + a.mu.Lock() + defer a.mu.Unlock() + + ch, ok = a.acks[key] + return +} + +func newAcks() *safeAcks { + return &safeAcks{ + acks: make(map[string]chan struct{}), + } +} \ No newline at end of file From 2f3091941a0fbb14e5ba22110148f6443fcdacae Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 11:44:34 +0100 Subject: [PATCH 0619/2352] [coconut] use --auto flag instead of subcommand --- coconut/cmd/environment_autorun.go | 55 --------------- coconut/cmd/environment_create.go | 1 + coconut/control/control.go | 107 +++++++++++------------------ 3 files changed, 41 insertions(+), 122 deletions(-) delete mode 100644 coconut/cmd/environment_autorun.go diff --git a/coconut/cmd/environment_autorun.go b/coconut/cmd/environment_autorun.go deleted file mode 100644 index b076abcb7..000000000 --- a/coconut/cmd/environment_autorun.go +++ /dev/null @@ -1,55 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "fmt" - - "github.com/AliceO2Group/Control/coconut/control" - "github.com/AliceO2Group/Control/common/product" - "github.com/spf13/cobra" -) - -// environmentCreateCmd represents the environment list command -var environmentCreateAutoCmd = &cobra.Command{ - Use: "auto", - Aliases: []string{"a",}, - Short: "create auto run environment", - Long: fmt.Sprintf(`The environment create auto command requests from %s the -creation of a new autorun environment. - -The operation may or may not be successful depending on available resources and configuration.`, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.CreateAutoEnvironment), - -} - -func init() { - environmentCreateCmd.AddCommand(environmentCreateAutoCmd) - - environmentCreateAutoCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") - environmentCreateAutoCmd.MarkFlagRequired("workflow-template") - - environmentCreateAutoCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") -} diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 858d53648..e029b119d 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -61,6 +61,7 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") + environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 5a64906cf..a0e41e979 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -72,7 +72,7 @@ func WrapCall(call ControlCall) RunFunc { Debug("initializing gRPC client") s := spinner.New(spinner.CharSets[11], SPINNER_TICK) - if !viper.GetBool("nospinner") { + if !viper.GetBool("nospinner") && !cmd.Flags().Changed("auto") { _ = s.Color("yellow") s.Suffix = " working..." s.Start() @@ -200,6 +200,45 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } + if cmd.Flags().Changed("auto") { + // subscribe to core to receive events + responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + // response is empty we should receive all the info through subscribe call + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + if err != nil { + return err + } + for { + rcv, err := responseS.Recv() + if err != nil { + if err == io.EOF { + break + } + log.WithPrefix("sub"). + WithError(err). + Fatal("command finished with error") + } + if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt.Error != "" { + log.WithPrefix("ERROR"). + Info(rcv) + } + if evt.Closestream { + return nil + } + + } + log.WithPrefix("EVENT"). + Info(rcv) + } + return nil + } + // TODO: add support for setting visibility here OCTRL-178 // TODO: add support for acquiring bot config here OCTRL-177 @@ -234,72 +273,6 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } -func CreateAutoEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error){ - wfPath, err := cmd.Flags().GetString("workflow-template") - if err != nil { - return - } - if len(wfPath) == 0 { - err = errors.New("cannot create empty environment") - return - } - - var extraVars string - extraVars, err = cmd.Flags().GetString("extra-vars") - if err != nil { - return - } - - extraVars = strings.TrimSpace(extraVars) - if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { - err = errors.New("empty list of extra-vars supplied") - return - } - - extraVarsMap, err := utils.ParseExtraVars(extraVars) - if err != nil { - return - } - - // subscribe to core to receive events - responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithPrefix("Subscribe"). - WithError(err). - Fatal("command finished with error") - } - // response is empty we should receive all the info through subscribe call - _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) - if err != nil { - return - } - for { - rcv, err := responseS.Recv() - if err != nil { - if err == io.EOF { - break - } - log.WithPrefix("sub"). - WithError(err). - Fatal("command finished with error") - } - if evt:= rcv.GetEnvironmentError(); evt != nil{ - if evt.Error != "" { - log.WithPrefix("ERROR"). - Info(rcv) - } - if evt.Closestream { - return nil - } - - } - log.WithPrefix("EVENT"). - Info(rcv) - } - - return -} - func stringMapToString(stringMap map[string]string, indent string) string { if len(stringMap) == 0 { return "" From b44f0e285c81d4814a91529d095bee83e38e2265 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 11:45:17 +0100 Subject: [PATCH 0620/2352] [coconut] fix log output --- coconut/control/control.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index a0e41e979..7831b9057 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -219,21 +219,22 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if err == io.EOF { break } - log.WithPrefix("sub"). + log.WithPrefix("Subscribe"). WithError(err). Fatal("command finished with error") } if evt:= rcv.GetEnvironmentError(); evt != nil{ if evt.Error != "" { - log.WithPrefix("ERROR"). - Info(rcv) + log.WithPrefix("Event"). + WithError(err). + Error("environment error") } if evt.Closestream { return nil } } - log.WithPrefix("EVENT"). + log.WithPrefix("Event"). Info(rcv) } return nil From 7018aa216070f17abeaee4221c463d4c158ed42a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 17:29:11 +0100 Subject: [PATCH 0621/2352] [coconut] make AutoEnvironment return a stream --- coconut/control/control.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 7831b9057..104ea414a 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -201,15 +201,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } if cmd.Flags().Changed("auto") { - // subscribe to core to receive events - responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithPrefix("Subscribe"). - WithError(err). - Fatal("command finished with error") - } - // response is empty we should receive all the info through subscribe call - _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + // new auto environment should be a stream of events + responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) if err != nil { return err } @@ -229,7 +222,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Error("environment error") } - if evt.Closestream { + if evt.CloseStream { return nil } From 677cdb736e9acebb17f65a2067cb2aed9a79a4d9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 18:01:37 +0100 Subject: [PATCH 0622/2352] [core] NewAutoEnvironment should be a stream --- coconut/protos/o2control.pb.go | 489 +++++++++++++++++---------------- core/protos/coreevents.go | 2 +- core/protos/o2control.pb.go | 489 +++++++++++++++++---------------- core/protos/o2control.proto | 4 +- 4 files changed, 519 insertions(+), 465 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6a46de750..9cfa28fee 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -540,7 +540,7 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { type Ev_EnvironmentError struct { Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` + CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -586,9 +586,9 @@ func (m *Ev_EnvironmentError) GetError() string { return "" } -func (m *Ev_EnvironmentError) GetClosestream() bool { +func (m *Ev_EnvironmentError) GetCloseStream() bool { if m != nil { - return m.Closestream + return m.CloseStream } return false } @@ -4333,201 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3101 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, - 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, - 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, - 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, - 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, - 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, - 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, - 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, - 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, - 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, - 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, - 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, - 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, - 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, - 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, - 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, - 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, - 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, - 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, - 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, - 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, - 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, - 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, - 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, - 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, - 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, - 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, - 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, - 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, - 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, - 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, - 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, - 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, - 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, - 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, - 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, - 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, - 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, - 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, - 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, - 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, - 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, - 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, - 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, - 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, - 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, - 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, - 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, - 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, - 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, - 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, - 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, - 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, - 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, - 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, - 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, - 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, - 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, - 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, - 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, - 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, - 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, - 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, - 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, - 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, - 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, - 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, - 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, - 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, - 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, - 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, - 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, - 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, - 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, - 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, - 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, - 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, - 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, - 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, - 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, - 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, - 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, - 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, - 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, - 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, - 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, - 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, - 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, - 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, - 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, - 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, - 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, - 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, - 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, - 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, - 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, - 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, - 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, - 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, - 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, - 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, - 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, - 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, - 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, - 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, - 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, - 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, - 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, - 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, - 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, - 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, - 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, - 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, - 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, - 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, - 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, - 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, - 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, - 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, - 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, - 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, - 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, - 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, - 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, - 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, - 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, - 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, - 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, - 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, - 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, - 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, - 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, - 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, - 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, - 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, - 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, - 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, - 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, - 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, - 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, - 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, - 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, - 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, - 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, - 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, - 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, - 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, - 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, - 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, - 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, - 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, - 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, - 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, - 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, - 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, - 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, - 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, - 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, - 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, - 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, - 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, - 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, - 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, - 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, - 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, - 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, - 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, - 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, - 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, - 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, - 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, - 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, - 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, - 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, - 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, - 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, - 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, - 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, - 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, - 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, - 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, - 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, - 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, - 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, - 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, - 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, - 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, - 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, + // 3094 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, + 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, + 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, + 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, + 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, + 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, + 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, + 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, + 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, + 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, + 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, + 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, + 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, + 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, + 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, + 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, + 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, + 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, + 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, + 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, + 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, + 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, + 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, + 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, + 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, + 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, + 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, + 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, + 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, + 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, + 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, + 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, + 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, + 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, + 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, + 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, + 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, + 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, + 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, + 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, + 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, + 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, + 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, + 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, + 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, + 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, + 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, + 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, + 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, + 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, + 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, + 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, + 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, + 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, + 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, + 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, + 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, + 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, + 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, + 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, + 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, + 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, + 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, + 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, + 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, + 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, + 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, + 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, + 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, + 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, + 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, + 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, + 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, + 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, + 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, + 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, + 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, + 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, + 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, + 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, + 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, + 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, + 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, + 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, + 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, + 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, + 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, + 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, + 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, + 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, + 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, + 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, + 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, + 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, + 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, + 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, + 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, + 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, + 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, + 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, + 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, + 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, + 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, + 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, + 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, + 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, + 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, + 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, + 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, + 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, + 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, + 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, + 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, + 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, + 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, + 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, + 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, + 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, + 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, + 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, + 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, + 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, + 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, + 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, + 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, + 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, + 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, + 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, + 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, + 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, + 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, + 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, + 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, + 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, + 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, + 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, + 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, + 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, + 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, + 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, + 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, + 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, + 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, + 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, + 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, + 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, + 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, + 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, + 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, + 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, + 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, + 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, + 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, + 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, + 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, + 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, + 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, + 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, + 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, + 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, + 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, + 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, + 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, + 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, + 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, + 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, + 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, + 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, + 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, + 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, + 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, + 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, + 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, + 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, + 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, + 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, + 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, + 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, + 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, + 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, + 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, + 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, + 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, + 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, + 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, + 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, + 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, + 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,13 +4634,36 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) if err != nil { return nil, err } - return out, nil + x := &controlNewAutoEnvironmentClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_NewAutoEnvironmentClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlNewAutoEnvironmentClient struct { + grpc.ClientStream +} + +func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4797,7 +4820,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4834,7 +4857,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4871,8 +4894,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { + return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5008,22 +5031,25 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) +func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(NewEnvironmentRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) +} + +type Control_NewAutoEnvironmentServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlNewAutoEnvironmentServer struct { + grpc.ServerStream +} + +func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5369,10 +5395,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5448,6 +5470,11 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, + { + StreamName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + ServerStreams: true, + }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5796,9 +5823,9 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Closestream { + if m.CloseStream { i-- - if m.Closestream { + if m.CloseStream { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -9082,7 +9109,7 @@ func (m *Ev_EnvironmentError) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.Closestream { + if m.CloseStream { n += 2 } if m.XXX_unrecognized != nil { @@ -11452,7 +11479,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11469,7 +11496,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { break } } - m.Closestream = bool(v != 0) + m.CloseStream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index 881311b3e..eb2218c99 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -62,7 +62,7 @@ func NewEnvironmentErrorEvent(errSt string, close bool) *Event { var ee Event_EnvironmentError ee.EnvironmentError = &Ev_EnvironmentError{ Error: errSt, - Closestream: close, + CloseStream: close, } return WrapEvent(&ee) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6a46de750..9cfa28fee 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -540,7 +540,7 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { type Ev_EnvironmentError struct { Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` + CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -586,9 +586,9 @@ func (m *Ev_EnvironmentError) GetError() string { return "" } -func (m *Ev_EnvironmentError) GetClosestream() bool { +func (m *Ev_EnvironmentError) GetCloseStream() bool { if m != nil { - return m.Closestream + return m.CloseStream } return false } @@ -4333,201 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3101 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, - 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, - 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, - 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, - 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, - 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, - 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, - 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, - 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, - 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, - 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, - 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, - 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, - 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, - 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, - 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, - 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, - 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, - 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, - 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, - 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, - 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, - 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, - 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, - 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, - 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, - 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, - 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, - 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, - 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, - 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, - 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, - 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, - 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, - 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, - 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, - 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, - 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, - 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, - 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, - 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, - 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, - 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, - 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, - 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, - 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, - 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, - 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, - 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, - 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, - 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, - 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, - 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, - 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, - 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, - 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, - 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, - 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, - 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, - 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, - 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, - 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, - 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, - 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, - 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, - 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, - 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, - 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, - 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, - 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, - 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, - 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, - 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, - 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, - 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, - 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, - 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, - 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, - 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, - 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, - 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, - 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, - 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, - 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, - 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, - 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, - 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, - 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, - 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, - 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, - 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, - 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, - 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, - 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, - 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, - 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, - 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, - 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, - 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, - 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, - 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, - 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, - 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, - 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, - 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, - 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, - 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, - 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, - 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, - 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, - 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, - 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, - 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, - 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, - 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, - 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, - 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, - 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, - 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, - 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, - 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, - 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, - 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, - 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, - 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, - 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, - 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, - 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, - 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, - 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, - 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, - 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, - 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, - 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, - 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, - 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, - 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, - 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, - 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, - 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, - 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, - 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, - 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, - 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, - 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, - 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, - 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, - 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, - 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, - 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, - 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, - 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, - 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, - 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, - 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, - 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, - 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, - 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, - 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, - 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, - 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, - 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, - 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, - 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, - 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, - 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, - 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, - 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, - 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, - 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, - 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, - 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, - 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, - 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, - 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, - 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, - 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, - 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, - 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, - 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, - 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, - 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, - 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, - 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, - 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, - 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, - 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, - 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, + // 3094 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, + 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, + 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, + 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, + 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, + 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, + 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, + 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, + 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, + 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, + 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, + 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, + 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, + 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, + 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, + 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, + 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, + 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, + 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, + 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, + 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, + 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, + 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, + 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, + 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, + 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, + 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, + 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, + 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, + 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, + 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, + 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, + 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, + 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, + 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, + 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, + 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, + 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, + 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, + 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, + 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, + 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, + 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, + 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, + 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, + 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, + 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, + 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, + 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, + 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, + 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, + 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, + 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, + 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, + 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, + 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, + 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, + 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, + 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, + 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, + 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, + 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, + 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, + 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, + 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, + 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, + 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, + 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, + 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, + 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, + 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, + 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, + 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, + 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, + 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, + 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, + 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, + 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, + 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, + 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, + 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, + 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, + 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, + 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, + 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, + 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, + 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, + 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, + 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, + 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, + 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, + 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, + 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, + 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, + 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, + 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, + 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, + 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, + 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, + 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, + 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, + 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, + 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, + 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, + 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, + 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, + 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, + 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, + 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, + 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, + 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, + 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, + 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, + 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, + 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, + 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, + 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, + 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, + 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, + 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, + 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, + 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, + 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, + 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, + 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, + 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, + 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, + 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, + 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, + 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, + 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, + 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, + 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, + 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, + 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, + 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, + 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, + 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, + 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, + 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, + 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, + 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, + 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, + 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, + 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, + 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, + 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, + 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, + 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, + 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, + 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, + 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, + 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, + 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, + 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, + 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, + 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, + 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, + 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, + 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, + 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, + 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, + 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, + 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, + 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, + 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, + 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, + 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, + 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, + 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, + 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, + 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, + 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, + 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, + 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, + 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, + 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, + 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, + 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, + 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, + 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, + 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, + 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, + 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, + 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, + 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, + 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, + 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,13 +4634,36 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) if err != nil { return nil, err } - return out, nil + x := &controlNewAutoEnvironmentClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_NewAutoEnvironmentClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlNewAutoEnvironmentClient struct { + grpc.ClientStream +} + +func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4797,7 +4820,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4834,7 +4857,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4871,8 +4894,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { + return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5008,22 +5031,25 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) +func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(NewEnvironmentRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) +} + +type Control_NewAutoEnvironmentServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlNewAutoEnvironmentServer struct { + grpc.ServerStream +} + +func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5369,10 +5395,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5448,6 +5470,11 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, + { + StreamName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + ServerStreams: true, + }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5796,9 +5823,9 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Closestream { + if m.CloseStream { i-- - if m.Closestream { + if m.CloseStream { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -9082,7 +9109,7 @@ func (m *Ev_EnvironmentError) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.Closestream { + if m.CloseStream { n += 2 } if m.XXX_unrecognized != nil { @@ -11452,7 +11479,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11469,7 +11496,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { break } } - m.Closestream = bool(v != 0) + m.CloseStream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index e1d81afed..29edd372e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -69,7 +69,7 @@ message Ev_EnvironmentDestroyed { message Ev_EnvironmentError { string error = 1; - bool closestream = 2; + bool closeStream = 2; } message Ev_TasksKilled { @@ -85,7 +85,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} - rpc NewAutoEnvironment (NewEnvironmentRequest) returns (NewAutoEnvironmentReply) {} + rpc NewAutoEnvironment(NewEnvironmentRequest) returns (stream Event); rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} From 1fbf77470e974d16118671eb29c37dfa1eb7c2cc Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 18:06:35 +0100 Subject: [PATCH 0623/2352] [core] use EventFeed for subscriptions --- core/environment/manager.go | 3 +- core/globalstate.go | 10 ++-- core/server.go | 62 +++++++++++++++--------- core/task/manager.go | 48 ++++-------------- core/task/scheduler.go | 12 +---- core/task/subscriber.go | 97 +++++++++++++++++++++++++++++++++++++ 6 files changed, 156 insertions(+), 76 deletions(-) create mode 100644 core/task/subscriber.go diff --git a/core/environment/manager.go b/core/environment/manager.go index e1a9ac69d..92e60f0ad 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -363,7 +363,8 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } -func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string) { +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub task.Subscription) { + defer sub.Unsubscribe() id, err := envs.CreateEnvironment(workflowPath, userVars) // report error through events during the procces diff --git a/core/globalstate.go b/core/globalstate.go index ef461a39e..c539ccafe 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -33,7 +33,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/environment" - "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" @@ -54,16 +54,16 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - publicEventCh := make(chan *pb.Event,100) + eventFeed := task.NewEventFeed() state := &globalState{ - PublicEvent: publicEventCh, + PublicEventFeed: eventFeed, shutdown: shutdown, environments: nil, } internalEventCh := make(chan event.Event) - taskman, err := task.NewManager(shutdown, publicEventCh, internalEventCh) + taskman, err := task.NewManager(shutdown, eventFeed, internalEventCh) if err != nil { return nil, err } @@ -84,6 +84,6 @@ type globalState struct { environments *environment.Manager taskman *task.Manager - PublicEvent chan *pb.Event + PublicEventFeed *task.EventFeed } diff --git a/core/server.go b/core/server.go index 4cf944fa2..7182aaefe 100644 --- a/core/server.go +++ b/core/server.go @@ -206,11 +206,11 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - select { - case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): - default: - log.Debug("state.PublicEvent channel is full") - } + // select { + // case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): + // default: + // log.Debug("state.PublicEvent channel is full") + // } return r, nil } @@ -377,11 +377,11 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - select { - case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): - default: - log.Debug("state.PublicEvent channel is full") - } + // select { + // case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): + // default: + // log.Debug("state.PublicEvent channel is full") + // } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } @@ -657,25 +657,43 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() - ctx := srv.Context() + ch := make(chan *pb.Event) + // use to subscribe to taskman + // here just do it + sub := m.state.PublicEventFeed.Subscribe(ch) for { select { - case event := <- m.state.PublicEvent: - err := srv.Send(event) - if err != nil { - return err + case event, ok := <- ch: + if ok { + err := srv.Send(event) + if err != nil { + return err + } } - case <-ctx.Done(): - return ctx.Err() + case err := <- sub.Err(): + return err } } } -func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { +func (m *RpcServer) NewAutoEnvironment(request *pb.NewEnvironmentRequest, srv pb.Control_NewAutoEnvironmentServer) error { m.logMethod() - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars()) - r := &pb.NewAutoEnvironmentReply{ + ch := make(chan *pb.Event) + // use to subscribe to taskman + // here just do it + sub := m.state.PublicEventFeed.Subscribe(ch) + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) + for { + select { + case event, ok := <- ch: + if ok { + err := srv.Send(event) + if err != nil { + return err + } + } + case err := <- sub.Err(): + return err + } } - - return r, nil } \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index da06915b3..aaafe5c8a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -78,13 +78,13 @@ type Manager struct { tasksFinished int schedulerState *schedulerState - publicEventCh chan<- *pb.Event + publicEventFeed *EventFeed internalEventCh chan<- event.Event ackKilledTasks *safeAcks } func NewManager(shutdown func(), - publicEventCh chan<- *pb.Event, + publicEventFeed *EventFeed, internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need @@ -113,7 +113,7 @@ func NewManager(shutdown func(), taskman = &Manager{ classes: newClasses(), roster: newRoster(), - publicEventCh: publicEventCh, + publicEventFeed: publicEventFeed, internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) @@ -639,11 +639,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} - select { - case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId,"KILLED")) } return @@ -664,11 +660,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - select { - case m.publicEventCh <- pb.NewEventTaskStatus(taskId, taskPtr.status.String()): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId, taskPtr.status.String())) } // Kill all tasks outside an environment (all unlocked tasks) @@ -714,11 +706,7 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err close(ack) m.ackKilledTasks.deleteKey(id) } - select { - case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewKillTasksEvent(tasksToShortTaskInfos(killed))) return } @@ -801,21 +789,13 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - select { - case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber()): - default: - log.Debug("state.PublicEvent channel is full") - } + m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber())) }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - select { - case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber()): - default: - log.Debug("state.PublicEvent channel is full") - } + m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber())) }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -857,22 +837,14 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - select { - case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskState(tm.taskId, tm.state)) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) case taskop.Error: // error reported from environment need to inform stream // FIXME: A better way to publish errors to stream that // are not from the taskman. - select { - case m.publicEventCh <- pb.NewEnvironmentErrorEvent(tm.GetError(), true): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEnvironmentErrorEvent(tm.GetError(), true)) } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 623afce44..ca3cc1857 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -690,11 +690,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - select { - case state.taskman.publicEventCh <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()): - default: - log.Debug("state.PublicEvent channel is full") - } + go state.taskman.publicEventFeed.Send(cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String())) newTaskId := taskPtr.GetTaskId() @@ -733,11 +729,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - select { - case state.taskman.publicEventCh <- cpb.NewEventTaskLaunch(newTaskId): - default: - log.Debug("state.PublicEvent channel is full") - } + go state.taskman.publicEventFeed.Send(cpb.NewEventTaskLaunch(newTaskId)) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/subscriber.go b/core/task/subscriber.go new file mode 100644 index 000000000..14b465923 --- /dev/null +++ b/core/task/subscriber.go @@ -0,0 +1,97 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package task + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/core/protos" +) + +type Subscription interface { + Unsubscribe() + Err() <-chan error +} + +type EventFeed struct { + mu sync.RWMutex + streams []chan *pb.Event +} + +func (e *EventFeed) Send(data *pb.Event) { + e.mu.RLock() + defer e.mu.RUnlock() + for _, stream := range e.streams { + stream <- data + } +} + +func (e *EventFeed) Subscribe(stream chan *pb.Event) Subscription { + e.mu.Lock() + defer e.mu.Unlock() + e.streams = append(e.streams, stream) + return &sub{ + feed: e, + channelIndex: len(e.streams)-1, + channel: stream, + err: make(chan error, 1), + } +} + +// removes an channel at index i efficiently as order does not +// matter for listeners we keep track of. +func (e *EventFeed) remove(i int) { + e.mu.Lock() + close(e.streams[i]) + e.streams[i] = e.streams[len(e.streams)-1] + e.streams = e.streams[:len(e.streams)-1] + e.mu.Unlock() +} + +func NewEventFeed() *EventFeed { + return &EventFeed{ + streams: make([]chan *pb.Event, 0), + } +} + +type sub struct { + feed *EventFeed + channelIndex int + channel chan *pb.Event + once sync.Once + err chan error +} + +func (s *sub) Unsubscribe() { + s.once.Do(func() { + s.feed.remove(s.channelIndex) + close(s.err) + }) +} + +func (s *sub) Err() <-chan error { + return s.err +} From d703fca02dee2f99c32478f20f92f7bb0f283a7b Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 09:50:39 +0100 Subject: [PATCH 0624/2352] [coconut] use GetBool to retrieve boolean flags --- coconut/control/control.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 104ea414a..a278927b1 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -72,7 +72,8 @@ func WrapCall(call ControlCall) RunFunc { Debug("initializing gRPC client") s := spinner.New(spinner.CharSets[11], SPINNER_TICK) - if !viper.GetBool("nospinner") && !cmd.Flags().Changed("auto") { + auto, _ := cmd.Flags().GetBool("auto") + if !viper.GetBool("nospinner") && !auto { _ = s.Color("yellow") s.Suffix = " working..." s.Start() @@ -200,7 +201,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } - if cmd.Flags().Changed("auto") { + auto, _ := cmd.Flags().GetBool("auto") + if auto { // new auto environment should be a stream of events responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) if err != nil { From 4fc3309820d93e1a08568a181d5132b5ff197be6 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 09:54:00 +0100 Subject: [PATCH 0625/2352] [core] Get run number from args --- core/environment/manager.go | 4 ---- core/environment/transition_reset.go | 1 - core/environment/transition_startactivity.go | 1 - core/environment/transition_stopactivity.go | 1 - core/protos/coreevents.go | 10 +++++++--- core/task/coreevent.go | 10 +++++----- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 92e60f0ad..e8280e8d0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -367,10 +367,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str defer sub.Unsubscribe() id, err := envs.CreateEnvironment(workflowPath, userVars) - // report error through events during the procces - // this stays here as a reminder that we should remove it if err != nil { - // environment error should report envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) return } @@ -386,7 +383,6 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } err = env.TryTransition(trans) - // this stays here as a reminder that we should remove it if err != nil { envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) return diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index a3669303c..b09883d92 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -54,7 +54,6 @@ func (t ResetTransition) do(env *Environment) (err error) { task.STANDBY.String(), nil, env.Id(), - env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 19c5d52d7..ee684b4c0 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -72,7 +72,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { task.RUNNING.String(), args, env.Id(), - runNumber, ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bf9797817..bebd6d2e5 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -59,7 +59,6 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.CONFIGURED.String(), nil, env.Id(), - env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index eb2218c99..83a209dcd 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -25,17 +25,21 @@ package pb import ( + "strconv" "time" "github.com/AliceO2Group/Control/common/utils/uid" ) -func NewEnvironmentStateEvent(envId uid.ID, state string, rn uint32) *Event { +func NewEnvironmentStateEvent(envId uid.ID, state, rn string) *Event { var te Ev_EnvironmentStateChanged var tEvnt Event_EnvironmentStateChanged te.State = state te.Environmentid = envId.String() - te.CurrentRunNumber = rn + currentRunNumber, err := strconv.ParseUint(rn, 10, 32) + if err != nil { + te.CurrentRunNumber = uint32(currentRunNumber) + } tEvnt.EnvironmentStateChanged=&te return WrapEvent(&tEvnt) @@ -121,4 +125,4 @@ func WrapEvent(ce isEvent_Payload) *Event { Timestamp:time.Now().Format(time.RFC3339), Payload: ce, } -} \ No newline at end of file +} diff --git a/core/task/coreevent.go b/core/task/coreevent.go index fd0d55bed..143b856f7 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -56,7 +56,7 @@ type environmentMessage struct { envId uid.ID tasks Tasks descriptors Descriptors - runNumber uint32 + runNumber string errSt string } @@ -81,9 +81,9 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } -func (em *environmentMessage) GetRunNumber() uint32 { +func (em *environmentMessage) GetRunNumber() string { if em == nil { - return 0 + return "" } return em.runNumber } @@ -140,7 +140,7 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID, rn uint32) (t *TaskmanMessage) { +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID) (t *TaskmanMessage) { t = newTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, @@ -151,7 +151,7 @@ func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg t.environmentMessage = environmentMessage{ tasks: tasks, envId: envID, - runNumber: rn, + runNumber: cargs["runNumber"], } return t } From b388a61014385de7704b20bc450f6944cf5182c8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 16:54:39 +0100 Subject: [PATCH 0626/2352] [coconut] Subscribe using xid --- coconut/control/control.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index a278927b1..ce74273d2 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -50,6 +50,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "google.golang.org/grpc" + "github.com/rs/xid" ) const( @@ -203,13 +204,20 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C auto, _ := cmd.Flags().GetBool("auto") if auto { - // new auto environment should be a stream of events - responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + // subscribe to core to receive events + id := xid.New().String() + stream, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{Id: id}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewAutoEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Id: id}, grpc.EmptyCallOption{}) if err != nil { return err } for { - rcv, err := responseS.Recv() + rcv, err := stream.Recv() if err != nil { if err == io.EOF { break From c77ec9dc671f5dbe8daf33b062c7636375c35435 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 16:58:59 +0100 Subject: [PATCH 0627/2352] [core] Connections struct to keep track of streams --- core/server.go | 38 +++++++++++++++----------------------- core/serverutil.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/core/server.go b/core/server.go index 7182aaefe..5b9597847 100644 --- a/core/server.go +++ b/core/server.go @@ -53,6 +53,7 @@ func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ state: state, + conns: newConnectionsInstance(), }) // Register reflection service on gRPC server. reflection.Register(s) @@ -79,6 +80,7 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { state *globalState + conns Connections } func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { @@ -658,9 +660,7 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() ch := make(chan *pb.Event) - // use to subscribe to taskman - // here just do it - sub := m.state.PublicEventFeed.Subscribe(ch) + m.conns.add(req.GetId(), ch) for { select { case event, ok := <- ch: @@ -669,31 +669,23 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe if err != nil { return err } + } else { + return nil } case err := <- sub.Err(): - return err + return err } } } -func (m *RpcServer) NewAutoEnvironment(request *pb.NewEnvironmentRequest, srv pb.Control_NewAutoEnvironmentServer) error { +func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch := make(chan *pb.Event) - // use to subscribe to taskman - // here just do it - sub := m.state.PublicEventFeed.Subscribe(ch) - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) - for { - select { - case event, ok := <- ch: - if ok { - err := srv.Send(event) - if err != nil { - return err - } - } - case err := <- sub.Err(): - return err - } + ch, ok := m.conns.GetChannel(request.GetId()) + var sub environment.Subscription + if ok { + sub = environment.SubscribeToStream(ch) } -} \ No newline at end of file + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) + r := &pb.NewAutoEnvironmentReply{} + return r, nil +} diff --git a/core/serverutil.go b/core/serverutil.go index 7de68938a..002e3670f 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,6 +26,7 @@ package core import ( "fmt" + "sync" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/core/protos" @@ -182,3 +183,34 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { } return } + + +type Connections struct { + mu sync.RWMutex + streams map[string]chan *pb.Event +} + +func (c *Connections) add(id string, ch chan *pb.Event) { + c.mu.Lock() + c.streams[id] = ch + c.mu.Unlock() +} + +func (c *Connections) delete(id string) { + c.mu.Lock() + delete(c.streams, id) + c.mu.Unlock() +} + +func (c *Connections) GetChannel(id string) (ch chan *pb.Event, ok bool) { + c.mu.RLock() + defer c.mu.RUnlock() + ch, ok = c.streams[id] + return +} + +func newConnectionsInstance() Connections { + return Connections{ + streams: make(map[string]chan *pb.Event), + } +} \ No newline at end of file From 7f9d19d8d235d3ac416c3a8af046e51b51635080 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:52:52 +0100 Subject: [PATCH 0628/2352] [coconut] Handle auto environment error --- coconut/control/control.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index ce74273d2..5bcef0ad6 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -226,16 +226,13 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt:= rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { log.WithPrefix("Event"). WithError(err). Error("environment error") - } - if evt.CloseStream { return nil } - } log.WithPrefix("Event"). Info(rcv) From ec486df9f6f016f33ee7432c3aeac39f25f6b215 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:53:55 +0100 Subject: [PATCH 0629/2352] [common] Introduce Role, Task, Environment Event --- common/event/environmentevents.go | 52 +++++++++++++++++++++++++++++++ common/event/roleevent.go | 44 ++++++++++++++++++++++++++ common/event/taskevents.go | 44 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 common/event/environmentevents.go create mode 100644 common/event/roleevent.go create mode 100644 common/event/taskevents.go diff --git a/common/event/environmentevents.go b/common/event/environmentevents.go new file mode 100644 index 000000000..9e2f5b1cf --- /dev/null +++ b/common/event/environmentevents.go @@ -0,0 +1,52 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type EnvironmentEvent struct { + eventBase + EnvironmentID string + Run uint32 + State string + Error error +} + +func (r *EnvironmentEvent) GetName() string { + return r.EnvironmentID +} + +func (r *EnvironmentEvent) GetRun() uint32 { + return r.Run +} + +func (r *EnvironmentEvent) GetState() string { + return r.State +} + +func (r *EnvironmentEvent) GetError() string { + if r.Error == nil { + return "" + } + return r.Error.Error() +} \ No newline at end of file diff --git a/common/event/roleevent.go b/common/event/roleevent.go new file mode 100644 index 000000000..6de7d09f9 --- /dev/null +++ b/common/event/roleevent.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type RoleEvent struct { + eventBase + Name string + Status string + State string +} + +func (r *RoleEvent) GetName() string { + return r.Name +} + +func (r *RoleEvent) GetStatus() string { + return r.Status +} + +func (r *RoleEvent) GetState() string { + return r.State +} \ No newline at end of file diff --git a/common/event/taskevents.go b/common/event/taskevents.go new file mode 100644 index 000000000..b3afd10bc --- /dev/null +++ b/common/event/taskevents.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type TaskEvent struct { + eventBase + TaskID string + Status string + State string +} + +func (r *TaskEvent) GetName() string { + return r.TaskID +} + +func (r *TaskEvent) GetStatus() string { + return r.Status +} + +func (r *TaskEvent) GetState() string { + return r.State +} \ No newline at end of file From d7baf48bbd7b7bfeab037cb66f8eb715cba3f879 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:57:14 +0100 Subject: [PATCH 0630/2352] [core] Remove obsolete events and update protos --- coconut/protos/o2control.pb.go | 3734 ++++++++---------------- core/globalstate.go | 7 +- core/protos/coreevents.go | 128 - core/protos/o2control.pb.go | 3734 ++++++++---------------- core/protos/o2control.proto | 61 +- core/protos/protoutils.go | 37 + core/server.go | 2 - core/task/coreevent.go | 29 +- core/task/manager.go | 16 - core/task/{taskutil.go => safeacks.go} | 33 - core/task/scheduler.go | 3 - core/task/subscriber.go | 97 - 12 files changed, 2591 insertions(+), 5290 deletions(-) delete mode 100644 core/protos/coreevents.go create mode 100644 core/protos/protoutils.go rename core/task/{taskutil.go => safeacks.go} (71%) delete mode 100644 core/task/subscriber.go diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 9cfa28fee..b2d5f0a6b 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,28 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -type Ev_EnvironmentStateChanged struct { - Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` +type Ev_EnvironmentEvent struct { + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } -func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } +func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentEvent) ProtoMessage() {} +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,114 +192,67 @@ func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) +func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) } -func (m *Ev_EnvironmentStateChanged) XXX_Size() int { +func (m *Ev_EnvironmentEvent) XXX_Size() int { return m.Size() } -func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) +func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { +func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { if m != nil { - return m.Environmentid + return m.EnvironmentId } return "" } -func (m *Ev_EnvironmentStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetState() string { if m != nil { return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { +func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if m != nil { return m.CurrentRunNumber } return 0 } -type Ev_TaskStateChanged struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } -func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStateChanged) ProtoMessage() {} -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) -} -func (m *Ev_TaskStateChanged) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo - -func (m *Ev_TaskStateChanged) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" -} - -func (m *Ev_TaskStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetError() string { if m != nil { - return m.State + return m.Error } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } -func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} +func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } +func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskEvent) ProtoMessage() {} +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -308,99 +262,60 @@ func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) +func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskEvent.Merge(m, src) } -func (m *Ev_TaskStatusChanged) XXX_Size() int { +func (m *Ev_TaskEvent) XXX_Size() int { return m.Size() } -func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) +func (m *Ev_TaskEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo -func (m *Ev_TaskStatusChanged) GetTaskid() string { +func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid } return "" } -func (m *Ev_TaskStatusChanged) GetStatus() string { +func (m *Ev_TaskEvent) GetState() string { if m != nil { - return m.Status + return m.State } return "" } -type Ev_TaskLaunched struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } -func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskLaunched) ProtoMessage() {} -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) -} -func (m *Ev_TaskLaunched) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo - -func (m *Ev_TaskLaunched) GetTaskid() string { +func (m *Ev_TaskEvent) GetStatus() string { if m != nil { - return m.Taskid + return m.Status } return "" } -type Ev_MesosTaskCreated struct { - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` +type Ev_RoleEvent struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } -func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_MesosTaskCreated) ProtoMessage() {} -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} +func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } +func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_RoleEvent) ProtoMessage() {} +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { +func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -410,236 +325,39 @@ func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) +func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_RoleEvent.Merge(m, src) } -func (m *Ev_MesosTaskCreated) XXX_Size() int { +func (m *Ev_RoleEvent) XXX_Size() int { return m.Size() } -func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) +func (m *Ev_RoleEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo - -func (m *Ev_MesosTaskCreated) GetTaskresources() string { - if m != nil { - return m.Taskresources - } - return "" -} +var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo -func (m *Ev_MesosTaskCreated) GetExecutorResources() string { +func (m *Ev_RoleEvent) GetName() string { if m != nil { - return m.ExecutorResources + return m.Name } return "" } -type Ev_EnvironmentCreated struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } -func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentCreated) ProtoMessage() {} -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) -} -func (m *Ev_EnvironmentCreated) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo - -func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil -} - -type Ev_EnvironmentDestroyed struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } -func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) -} -func (m *Ev_EnvironmentDestroyed) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo - -func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil -} - -func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (m *Ev_RoleEvent) GetStatus() string { if m != nil { - return m.Environmentid + return m.Status } return "" } -type Ev_EnvironmentError struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } -func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentError) ProtoMessage() {} -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) -} -func (m *Ev_EnvironmentError) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo - -func (m *Ev_EnvironmentError) GetError() string { +func (m *Ev_RoleEvent) GetState() string { if m != nil { - return m.Error + return m.State } return "" } -func (m *Ev_EnvironmentError) GetCloseStream() bool { - if m != nil { - return m.CloseStream - } - return false -} - -type Ev_TasksKilled struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } -func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } -func (*Ev_TasksKilled) ProtoMessage() {} -func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TasksKilled.Merge(m, src) -} -func (m *Ev_TasksKilled) XXX_Size() int { - return m.Size() -} -func (m *Ev_TasksKilled) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo - -func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks - } - return nil -} - //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -653,7 +371,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} + return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +412,7 @@ func (m *StatusReply) Reset() { *m = StatusReply{} } func (m *StatusReply) String() string { return proto.CompactTextString(m) } func (*StatusReply) ProtoMessage() {} func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} + return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -751,7 +469,7 @@ func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } func (*StatusUpdate) ProtoMessage() {} func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -823,15 +541,9 @@ func (*StatusUpdate) XXX_OneofWrappers() []interface{} { type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are valid to be assigned to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_Taskskilled + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -842,7 +554,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -877,43 +589,19 @@ type isEvent_Payload interface { Size() int } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` -} -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` -} -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` -} -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` -} -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` -} -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` -} -type Event_Taskskilled struct { - Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` } -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (*Event_EnvironmentCreated) isEvent_Payload() {} -func (*Event_TaskStateChanged) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} -func (*Event_MesosTaskcreated) isEvent_Payload() {} -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} -func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_Taskskilled) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -929,65 +617,23 @@ func (m *Event) GetTimestamp() string { return "" } -func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated - } - return nil -} - -func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged - } - return nil -} - -func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (m *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed +func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError +func (m *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := m.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (m *Event) GetTaskskilled() *Ev_TasksKilled { - if x, ok := m.GetPayload().(*Event_Taskskilled); ok { - return x.Taskskilled +func (m *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := m.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -995,19 +641,14 @@ func (m *Event) GetTaskskilled() *Ev_TasksKilled { // XXX_OneofWrappers is for the internal use of the proto package. func (*Event) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_Taskskilled)(nil), + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } } type SubscribeRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1017,7 +658,7 @@ func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeRequest) ProtoMessage() {} func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1046,6 +687,13 @@ func (m *SubscribeRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (m *SubscribeRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -1059,7 +707,7 @@ func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoRequest) ProtoMessage() {} func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1104,7 +752,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1192,7 +840,7 @@ func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoReply) ProtoMessage() {} func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +930,7 @@ func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } func (*TeardownRequest) ProtoMessage() {} func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +976,7 @@ func (m *TeardownReply) Reset() { *m = TeardownReply{} } func (m *TeardownReply) String() string { return proto.CompactTextString(m) } func (*TeardownReply) ProtoMessage() {} func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1370,7 +1018,7 @@ func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsRequest) ProtoMessage() {} func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} + return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1411,7 +1059,7 @@ func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsReply) ProtoMessage() {} func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} + return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1473,7 +1121,7 @@ func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } func (*EnvironmentInfo) ProtoMessage() {} func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} + return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1577,7 +1225,7 @@ func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentRequest) ProtoMessage() {} func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1631,7 +1279,7 @@ func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentReply) ProtoMessage() {} func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,6 +1315,69 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } +func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} +} +func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) +} +func (m *NewAutoEnvironmentRequest) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo + +func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if m != nil { + return m.WorkflowTemplate + } + return "" +} + +func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *NewAutoEnvironmentRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + type NewAutoEnvironmentReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1677,7 +1388,7 @@ func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewAutoEnvironmentReply) ProtoMessage() {} func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1717,7 +1428,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1765,7 +1476,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1820,7 +1531,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1587,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1939,7 +1650,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2001,7 +1712,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2057,7 +1768,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2121,7 +1832,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2189,7 +1900,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +1953,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2295,7 +2006,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2051,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2112,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2459,7 +2170,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2565,7 +2276,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2632,7 +2343,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2383,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2719,7 +2430,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2766,7 +2477,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2814,7 +2525,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,7 +2583,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,7 +2660,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3017,7 +2728,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3113,7 +2824,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +2872,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3219,7 +2930,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3281,7 +2992,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3095,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3434,7 +3145,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3504,7 +3215,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3565,7 +3276,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3322,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3653,7 +3364,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3715,7 +3426,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3481,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3825,7 +3536,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3879,7 +3590,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3926,7 +3637,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3973,7 +3684,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4020,7 +3731,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4067,7 +3778,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4115,7 +3826,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4169,7 +3880,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4215,7 +3926,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{69} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4249,15 +3960,9 @@ func init() { proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") - proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") - proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") - proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") - proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") - proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") - proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") - proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") + proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") + proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") + proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4277,6 +3982,8 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -4333,201 +4040,188 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, - 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, - 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, - 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, - 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, - 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, - 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, - 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, - 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, - 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, - 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, - 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, - 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, - 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, - 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, - 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, - 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, - 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, - 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, - 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, - 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, - 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, - 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, - 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, - 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, - 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, - 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, - 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, - 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, - 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, - 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, - 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, - 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, - 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, - 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, - 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, - 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, - 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, - 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, - 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, - 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, - 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, - 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, - 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, - 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, - 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, - 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, - 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, - 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, - 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, - 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, - 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, - 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, - 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, - 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, - 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, - 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, - 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, - 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, - 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, - 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, - 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, - 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, - 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, - 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, - 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, - 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, - 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, - 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, - 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, - 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, - 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, - 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, - 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, - 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, - 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, - 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, - 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, - 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, - 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, - 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, - 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, - 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, - 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, - 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, - 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, - 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, - 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, - 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, - 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, - 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, - 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, - 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, - 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, - 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, - 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, - 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, - 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, - 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, - 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, - 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, - 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, - 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, - 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, - 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, - 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, - 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, - 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, - 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, - 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, - 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, - 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, - 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, - 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, - 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, - 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, - 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, - 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, - 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, - 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, - 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, - 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, - 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, - 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, - 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, - 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, - 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, - 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, - 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, - 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, - 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, - 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, - 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, - 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, - 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, - 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, - 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, - 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, - 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, - 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, - 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, - 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, - 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, - 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, - 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, - 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, - 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, - 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, - 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, - 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, - 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, - 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, - 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, - 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, - 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, - 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, - 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, - 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, - 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, - 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, - 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, - 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, - 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, - 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, - 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, - 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, - 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, - 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, - 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, - 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, - 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, - 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, - 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, - 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, - 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, - 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, - 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, - 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, - 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, - 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, - 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, - 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, - 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, - 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, - 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, - 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, - 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, - 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, + // 2890 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, + 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, + 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, + 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, + 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, + 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, + 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, + 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, + 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, + 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, + 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, + 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, + 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, + 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, + 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, + 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, + 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, + 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, + 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, + 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, + 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, + 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, + 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, + 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, + 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, + 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, + 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, + 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, + 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, + 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, + 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, + 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, + 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, + 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, + 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, + 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, + 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, + 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, + 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, + 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, + 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, + 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, + 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, + 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, + 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, + 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, + 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, + 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, + 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, + 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, + 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, + 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, + 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, + 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, + 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, + 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, + 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, + 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, + 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, + 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, + 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, + 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, + 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, + 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, + 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, + 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, + 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, + 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, + 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, + 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, + 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, + 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, + 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, + 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, + 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, + 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, + 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, + 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, + 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, + 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, + 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, + 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, + 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, + 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, + 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, + 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, + 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, + 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, + 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, + 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, + 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, + 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, + 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, + 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, + 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, + 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, + 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, + 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, + 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, + 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, + 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, + 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, + 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, + 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, + 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, + 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, + 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, + 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, + 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, + 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, + 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, + 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, + 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, + 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, + 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, + 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, + 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, + 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, + 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, + 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, + 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, + 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, + 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, + 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, + 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, + 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, + 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, + 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, + 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, + 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, + 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, + 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, + 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, + 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, + 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, + 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, + 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, + 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, + 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, + 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, + 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, + 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, + 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, + 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, + 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, + 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, + 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, + 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, + 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, + 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, + 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, + 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, + 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, + 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, + 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, + 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, + 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, + 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, + 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, + 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, + 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, + 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, + 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, + 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, + 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, + 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, + 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, + 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, + 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, + 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, + 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, + 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, + 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, + 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, + 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, + 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, + 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, + 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, + 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4240,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,36 +4328,13 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) if err != nil { return nil, err } - x := &controlNewAutoEnvironmentClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_NewAutoEnvironmentClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlNewAutoEnvironmentClient struct { - grpc.ClientStream -} - -func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil + return out, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4820,7 +4491,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4857,7 +4528,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4894,8 +4565,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { - return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5031,25 +4702,22 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(NewEnvironmentRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) -} - -type Control_NewAutoEnvironmentServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlNewAutoEnvironmentServer struct { - grpc.ServerStream -} - -func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5395,6 +5063,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5470,11 +5142,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, - { - StreamName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - ServerStreams: true, - }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5511,7 +5178,7 @@ func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5521,12 +5188,12 @@ func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5535,6 +5202,13 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x22 + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -5547,17 +5221,17 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i-- dAtA[i] = 0x12 } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if len(m.EnvironmentId) > 0 { + i -= len(m.EnvironmentId) + copy(dAtA[i:], m.EnvironmentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5567,12 +5241,12 @@ func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5581,6 +5255,13 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x1a + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -5598,7 +5279,7 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5608,12 +5289,12 @@ func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5622,6 +5303,13 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) @@ -5629,17 +5317,17 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5649,12 +5337,12 @@ func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5663,17 +5351,10 @@ func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5683,12 +5364,12 @@ func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5697,24 +5378,31 @@ func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ExecutorResources) > 0 { - i -= len(m.ExecutorResources) - copy(dAtA[i:], m.ExecutorResources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) - i-- - dAtA[i] = 0x12 + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if len(m.Taskresources) > 0 { - i -= len(m.Taskresources) - copy(dAtA[i:], m.Taskresources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) - i-- + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5724,12 +5412,12 @@ func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5738,9 +5426,33 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { + if m.Event != nil { { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MesosHeartbeat != nil { + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5748,12 +5460,11 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5763,12 +5474,12 @@ func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5777,16 +5488,56 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentEvent != nil { + { + size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } - if m.CleanupTasksReply != nil { + return len(dAtA) - i, nil +} +func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskEvent != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5794,12 +5545,32 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } return len(dAtA) - i, nil } +func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} -func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { +func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.RoleEvent != nil { + { + size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5809,12 +5580,12 @@ func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5823,27 +5594,17 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CloseStream { - i-- - if m.CloseStream { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5853,12 +5614,12 @@ func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5867,24 +5628,10 @@ func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5894,12 +5641,12 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5908,10 +5655,46 @@ func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5921,12 +5704,12 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5935,31 +5718,58 @@ func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a + } + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5969,12 +5779,12 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5983,45 +5793,17 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6031,12 +5813,12 @@ func (m *Event) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6045,215 +5827,10 @@ func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentStateChanged != nil { - { - size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentCreated != nil { - { - size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStateChanged != nil { - { - size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStatusChanged != nil { - { - size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Tasklaunched != nil { - { - size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} -func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosTaskcreated != nil { - { - size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentDestroyed != nil { - { - size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentError != nil { - { - size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } return len(dAtA) - i, nil } -func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} -func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Taskskilled != nil { - { - size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6263,12 +5840,12 @@ func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6280,7 +5857,7 @@ func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6290,12 +5867,12 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6304,10 +5881,31 @@ func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Version) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6317,286 +5915,12 @@ func (m *Version) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Version) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,7 +6128,7 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6814,12 +6138,12 @@ func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6828,7 +6152,67 @@ func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { @@ -8964,13 +8348,13 @@ func (m *Event_MesosHeartbeat) Size() (n int) { return n } -func (m *Ev_EnvironmentStateChanged) Size() (n int) { +func (m *Ev_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Environmentid) + l = len(m.EnvironmentId) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8981,23 +8365,7 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) + l = len(m.Error) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9007,7 +8375,7 @@ func (m *Ev_TaskStateChanged) Size() (n int) { return n } -func (m *Ev_TaskStatusChanged) Size() (n int) { +func (m *Ev_TaskEvent) Size() (n int) { if m == nil { return 0 } @@ -9017,23 +8385,11 @@ func (m *Ev_TaskStatusChanged) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Status) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskLaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9043,93 +8399,24 @@ func (m *Ev_TaskLaunched) Size() (n int) { return n } -func (m *Ev_MesosTaskCreated) Size() (n int) { +func (m *Ev_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Taskresources) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorResources) + l = len(m.Name) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentDestroyed) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Environmentid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.CloseStream { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TasksKilled) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9219,120 +8506,52 @@ func (m *Event) Size() (n int) { return n } -func (m *Event_EnvironmentStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentStateChanged != nil { - l = m.EnvironmentStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentCreated != nil { - l = m.EnvironmentCreated.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStateChanged != nil { - l = m.TaskStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStatusChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStatusChanged != nil { - l = m.TaskStatusChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_Tasklaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Tasklaunched != nil { - l = m.Tasklaunched.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_MesosTaskcreated) Size() (n int) { +func (m *Event_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.MesosTaskcreated != nil { - l = m.MesosTaskcreated.Size() + if m.EnvironmentEvent != nil { + l = m.EnvironmentEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentDestroyed) Size() (n int) { +func (m *Event_TaskEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentDestroyed != nil { - l = m.EnvironmentDestroyed.Size() + if m.TaskEvent != nil { + l = m.TaskEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentError) Size() (n int) { +func (m *Event_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentError != nil { - l = m.EnvironmentError.Size() + if m.RoleEvent != nil { + l = m.RoleEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_Taskskilled) Size() (n int) { +func (m *SubscribeRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Taskskilled != nil { - l = m.Taskskilled.Size() + l = len(m.Id) + if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9584,6 +8803,34 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *NewAutoEnvironmentReply) Size() (n int) { if m == nil { return 0 @@ -10555,452 +9802,25 @@ func (m *SetRepoDefaultRevisionReply) Size() (n int) { return n } -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environmentid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStatusChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *Empty) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 } -func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11023,44 +9843,12 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_TaskLaunched: wiretype end group for non-group") + return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11086,7 +9874,7 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { +func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11109,15 +9897,15 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_EnvironmentEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11145,11 +9933,11 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Taskresources = string(dAtA[iNdEx:postIndex]) + m.EnvironmentId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11177,67 +9965,32 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11247,27 +10000,23 @@ func (m *Ev_EnvironmentCreated) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11294,7 +10043,7 @@ func (m *Ev_EnvironmentCreated) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { +func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11317,17 +10066,17 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TaskEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TaskEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11337,31 +10086,59 @@ func (m *Ev_EnvironmentDestroyed) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11389,7 +10166,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environmentid = string(dAtA[iNdEx:postIndex]) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11416,7 +10193,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { +func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11439,15 +10216,15 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentError: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_RoleEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_RoleEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11475,13 +10252,13 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11491,71 +10268,29 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.CloseStream = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TasksKilled) 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 ErrIntOverflowO2Control - } - 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: Ev_TasksKilled: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11565,25 +10300,23 @@ func (m *Ev_TasksKilled) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11955,7 +10688,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11982,15 +10715,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentStateChanged{} + v := &Ev_EnvironmentEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentStateChanged{v} + m.Payload = &Event_EnvironmentEvent{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12017,225 +10750,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentCreated{} + v := &Ev_TaskEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentCreated{v} + m.Payload = &Event_TaskEvent{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStateChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStateChanged{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStatusChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStatusChanged{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskLaunched{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_Tasklaunched{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_MesosTaskCreated{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_MesosTaskcreated{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentDestroyed{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentDestroyed{v} - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentError{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentError{v} - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12262,11 +10785,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_TasksKilled{} + v := &Ev_RoleEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_Taskskilled{v} + m.Payload = &Event_RoleEvent{v} iNdEx = postIndex default: iNdEx = preIndex @@ -12312,16 +10835,48 @@ func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubscribeRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -14084,6 +12639,251 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NewAutoEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/globalstate.go b/core/globalstate.go index c539ccafe..871e62a81 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -54,16 +54,13 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - eventFeed := task.NewEventFeed() - state := &globalState{ - PublicEventFeed: eventFeed, shutdown: shutdown, environments: nil, } internalEventCh := make(chan event.Event) - taskman, err := task.NewManager(shutdown, eventFeed, internalEventCh) + taskman, err := task.NewManager(shutdown, internalEventCh) if err != nil { return nil, err } @@ -84,6 +81,4 @@ type globalState struct { environments *environment.Manager taskman *task.Manager - PublicEventFeed *task.EventFeed - } diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go deleted file mode 100644 index 83a209dcd..000000000 --- a/core/protos/coreevents.go +++ /dev/null @@ -1,128 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package pb - -import ( - "strconv" - "time" - - "github.com/AliceO2Group/Control/common/utils/uid" -) - -func NewEnvironmentStateEvent(envId uid.ID, state, rn string) *Event { - var te Ev_EnvironmentStateChanged - var tEvnt Event_EnvironmentStateChanged - te.State = state - te.Environmentid = envId.String() - currentRunNumber, err := strconv.ParseUint(rn, 10, 32) - if err != nil { - te.CurrentRunNumber = uint32(currentRunNumber) - } - - tEvnt.EnvironmentStateChanged=&te - return WrapEvent(&tEvnt) -} - -func NewEnvironmentCreatedEvent(ei *EnvironmentInfo) *Event { - var ec Event_EnvironmentCreated - ec.EnvironmentCreated = &Ev_EnvironmentCreated{ - Environment: ei, - } - return WrapEvent(&ec) -} - -func NewEnvironmentDestroyedEvent(ctrl *CleanupTasksReply, envid string) *Event { - var de Event_EnvironmentDestroyed - de.EnvironmentDestroyed = &Ev_EnvironmentDestroyed{ - CleanupTasksReply: ctrl, - Environmentid: envid, - } - return WrapEvent(&de) -} - -func NewEnvironmentErrorEvent(errSt string, close bool) *Event { - var ee Event_EnvironmentError - ee.EnvironmentError = &Ev_EnvironmentError{ - Error: errSt, - CloseStream: close, - } - return WrapEvent(&ee) -} - -func NewEventTaskState(taskid,state string) *Event { - var sc Ev_TaskStateChanged - var stCh Event_TaskStateChanged - sc.Taskid = taskid - sc.State = state - stCh.TaskStateChanged = &sc - return WrapEvent(&stCh) -} - -func NewEventTaskStatus(taskid,status string) *Event { - var etSt Event_TaskStatusChanged - - etSt.TaskStatusChanged = &Ev_TaskStatusChanged{ - Taskid: taskid, - Status: status, - } - - return WrapEvent(&etSt) -} - -func NewEventTaskLaunch(taskid string) *Event { - var ltask Ev_TaskLaunched - var eltask Event_Tasklaunched - - ltask.Taskid = taskid - eltask.Tasklaunched = <ask - - return WrapEvent(&eltask) -} - -func NewEventMesosTaskCreated(resourcesRequest,executorResources string) *Event { - var mtask Ev_MesosTaskCreated - var emtask Event_MesosTaskcreated - - mtask.ExecutorResources = executorResources - mtask.Taskresources = resourcesRequest - emtask.MesosTaskcreated = &mtask - - return WrapEvent(&emtask) -} - -func NewKillTasksEvent(killed []*ShortTaskInfo) *Event { - var ke Event_Taskskilled - ke.Taskskilled = &Ev_TasksKilled{ - KilledTasks: killed, - } - return WrapEvent(&ke) -} - -func WrapEvent(ce isEvent_Payload) *Event { - return &Event{ - Timestamp:time.Now().Format(time.RFC3339), - Payload: ce, - } -} diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 9cfa28fee..b2d5f0a6b 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,28 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -type Ev_EnvironmentStateChanged struct { - Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` +type Ev_EnvironmentEvent struct { + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } -func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } +func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentEvent) ProtoMessage() {} +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,114 +192,67 @@ func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) +func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) } -func (m *Ev_EnvironmentStateChanged) XXX_Size() int { +func (m *Ev_EnvironmentEvent) XXX_Size() int { return m.Size() } -func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) +func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { +func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { if m != nil { - return m.Environmentid + return m.EnvironmentId } return "" } -func (m *Ev_EnvironmentStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetState() string { if m != nil { return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { +func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if m != nil { return m.CurrentRunNumber } return 0 } -type Ev_TaskStateChanged struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } -func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStateChanged) ProtoMessage() {} -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) -} -func (m *Ev_TaskStateChanged) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo - -func (m *Ev_TaskStateChanged) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" -} - -func (m *Ev_TaskStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetError() string { if m != nil { - return m.State + return m.Error } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } -func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} +func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } +func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskEvent) ProtoMessage() {} +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -308,99 +262,60 @@ func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) +func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskEvent.Merge(m, src) } -func (m *Ev_TaskStatusChanged) XXX_Size() int { +func (m *Ev_TaskEvent) XXX_Size() int { return m.Size() } -func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) +func (m *Ev_TaskEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo -func (m *Ev_TaskStatusChanged) GetTaskid() string { +func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid } return "" } -func (m *Ev_TaskStatusChanged) GetStatus() string { +func (m *Ev_TaskEvent) GetState() string { if m != nil { - return m.Status + return m.State } return "" } -type Ev_TaskLaunched struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } -func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskLaunched) ProtoMessage() {} -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) -} -func (m *Ev_TaskLaunched) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo - -func (m *Ev_TaskLaunched) GetTaskid() string { +func (m *Ev_TaskEvent) GetStatus() string { if m != nil { - return m.Taskid + return m.Status } return "" } -type Ev_MesosTaskCreated struct { - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` +type Ev_RoleEvent struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } -func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_MesosTaskCreated) ProtoMessage() {} -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} +func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } +func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_RoleEvent) ProtoMessage() {} +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { +func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -410,236 +325,39 @@ func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) +func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_RoleEvent.Merge(m, src) } -func (m *Ev_MesosTaskCreated) XXX_Size() int { +func (m *Ev_RoleEvent) XXX_Size() int { return m.Size() } -func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) +func (m *Ev_RoleEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo - -func (m *Ev_MesosTaskCreated) GetTaskresources() string { - if m != nil { - return m.Taskresources - } - return "" -} +var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo -func (m *Ev_MesosTaskCreated) GetExecutorResources() string { +func (m *Ev_RoleEvent) GetName() string { if m != nil { - return m.ExecutorResources + return m.Name } return "" } -type Ev_EnvironmentCreated struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } -func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentCreated) ProtoMessage() {} -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) -} -func (m *Ev_EnvironmentCreated) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo - -func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil -} - -type Ev_EnvironmentDestroyed struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } -func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) -} -func (m *Ev_EnvironmentDestroyed) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo - -func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil -} - -func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (m *Ev_RoleEvent) GetStatus() string { if m != nil { - return m.Environmentid + return m.Status } return "" } -type Ev_EnvironmentError struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } -func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentError) ProtoMessage() {} -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) -} -func (m *Ev_EnvironmentError) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo - -func (m *Ev_EnvironmentError) GetError() string { +func (m *Ev_RoleEvent) GetState() string { if m != nil { - return m.Error + return m.State } return "" } -func (m *Ev_EnvironmentError) GetCloseStream() bool { - if m != nil { - return m.CloseStream - } - return false -} - -type Ev_TasksKilled struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } -func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } -func (*Ev_TasksKilled) ProtoMessage() {} -func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TasksKilled.Merge(m, src) -} -func (m *Ev_TasksKilled) XXX_Size() int { - return m.Size() -} -func (m *Ev_TasksKilled) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo - -func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks - } - return nil -} - //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -653,7 +371,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} + return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +412,7 @@ func (m *StatusReply) Reset() { *m = StatusReply{} } func (m *StatusReply) String() string { return proto.CompactTextString(m) } func (*StatusReply) ProtoMessage() {} func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} + return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -751,7 +469,7 @@ func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } func (*StatusUpdate) ProtoMessage() {} func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -823,15 +541,9 @@ func (*StatusUpdate) XXX_OneofWrappers() []interface{} { type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are valid to be assigned to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_Taskskilled + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -842,7 +554,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -877,43 +589,19 @@ type isEvent_Payload interface { Size() int } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` -} -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` -} -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` -} -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` -} -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` -} -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` -} -type Event_Taskskilled struct { - Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` } -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (*Event_EnvironmentCreated) isEvent_Payload() {} -func (*Event_TaskStateChanged) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} -func (*Event_MesosTaskcreated) isEvent_Payload() {} -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} -func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_Taskskilled) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -929,65 +617,23 @@ func (m *Event) GetTimestamp() string { return "" } -func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated - } - return nil -} - -func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged - } - return nil -} - -func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (m *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed +func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError +func (m *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := m.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (m *Event) GetTaskskilled() *Ev_TasksKilled { - if x, ok := m.GetPayload().(*Event_Taskskilled); ok { - return x.Taskskilled +func (m *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := m.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -995,19 +641,14 @@ func (m *Event) GetTaskskilled() *Ev_TasksKilled { // XXX_OneofWrappers is for the internal use of the proto package. func (*Event) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_Taskskilled)(nil), + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } } type SubscribeRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1017,7 +658,7 @@ func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeRequest) ProtoMessage() {} func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1046,6 +687,13 @@ func (m *SubscribeRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (m *SubscribeRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -1059,7 +707,7 @@ func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoRequest) ProtoMessage() {} func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1104,7 +752,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1192,7 +840,7 @@ func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoReply) ProtoMessage() {} func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +930,7 @@ func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } func (*TeardownRequest) ProtoMessage() {} func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +976,7 @@ func (m *TeardownReply) Reset() { *m = TeardownReply{} } func (m *TeardownReply) String() string { return proto.CompactTextString(m) } func (*TeardownReply) ProtoMessage() {} func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1370,7 +1018,7 @@ func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsRequest) ProtoMessage() {} func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} + return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1411,7 +1059,7 @@ func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsReply) ProtoMessage() {} func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} + return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1473,7 +1121,7 @@ func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } func (*EnvironmentInfo) ProtoMessage() {} func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} + return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1577,7 +1225,7 @@ func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentRequest) ProtoMessage() {} func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1631,7 +1279,7 @@ func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentReply) ProtoMessage() {} func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,6 +1315,69 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } +func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} +} +func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) +} +func (m *NewAutoEnvironmentRequest) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo + +func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if m != nil { + return m.WorkflowTemplate + } + return "" +} + +func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *NewAutoEnvironmentRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + type NewAutoEnvironmentReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1677,7 +1388,7 @@ func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewAutoEnvironmentReply) ProtoMessage() {} func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1717,7 +1428,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1765,7 +1476,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1820,7 +1531,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1587,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1939,7 +1650,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2001,7 +1712,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2057,7 +1768,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2121,7 +1832,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2189,7 +1900,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +1953,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2295,7 +2006,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2051,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2112,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2459,7 +2170,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2565,7 +2276,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2632,7 +2343,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2383,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2719,7 +2430,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2766,7 +2477,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2814,7 +2525,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,7 +2583,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,7 +2660,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3017,7 +2728,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3113,7 +2824,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +2872,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3219,7 +2930,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3281,7 +2992,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3095,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3434,7 +3145,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3504,7 +3215,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3565,7 +3276,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3322,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3653,7 +3364,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3715,7 +3426,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3481,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3825,7 +3536,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3879,7 +3590,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3926,7 +3637,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3973,7 +3684,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4020,7 +3731,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4067,7 +3778,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4115,7 +3826,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4169,7 +3880,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4215,7 +3926,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{69} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4249,15 +3960,9 @@ func init() { proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") - proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") - proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") - proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") - proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") - proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") - proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") - proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") + proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") + proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") + proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4277,6 +3982,8 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -4333,201 +4040,188 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, - 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, - 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, - 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, - 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, - 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, - 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, - 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, - 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, - 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, - 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, - 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, - 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, - 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, - 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, - 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, - 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, - 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, - 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, - 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, - 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, - 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, - 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, - 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, - 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, - 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, - 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, - 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, - 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, - 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, - 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, - 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, - 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, - 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, - 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, - 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, - 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, - 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, - 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, - 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, - 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, - 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, - 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, - 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, - 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, - 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, - 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, - 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, - 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, - 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, - 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, - 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, - 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, - 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, - 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, - 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, - 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, - 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, - 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, - 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, - 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, - 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, - 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, - 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, - 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, - 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, - 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, - 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, - 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, - 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, - 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, - 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, - 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, - 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, - 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, - 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, - 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, - 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, - 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, - 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, - 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, - 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, - 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, - 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, - 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, - 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, - 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, - 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, - 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, - 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, - 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, - 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, - 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, - 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, - 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, - 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, - 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, - 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, - 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, - 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, - 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, - 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, - 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, - 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, - 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, - 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, - 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, - 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, - 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, - 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, - 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, - 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, - 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, - 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, - 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, - 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, - 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, - 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, - 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, - 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, - 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, - 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, - 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, - 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, - 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, - 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, - 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, - 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, - 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, - 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, - 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, - 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, - 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, - 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, - 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, - 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, - 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, - 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, - 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, - 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, - 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, - 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, - 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, - 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, - 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, - 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, - 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, - 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, - 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, - 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, - 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, - 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, - 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, - 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, - 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, - 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, - 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, - 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, - 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, - 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, - 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, - 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, - 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, - 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, - 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, - 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, - 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, - 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, - 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, - 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, - 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, - 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, - 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, - 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, - 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, - 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, - 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, - 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, - 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, - 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, - 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, - 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, - 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, - 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, - 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, - 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, - 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, - 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, + // 2890 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, + 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, + 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, + 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, + 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, + 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, + 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, + 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, + 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, + 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, + 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, + 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, + 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, + 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, + 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, + 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, + 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, + 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, + 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, + 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, + 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, + 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, + 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, + 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, + 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, + 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, + 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, + 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, + 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, + 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, + 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, + 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, + 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, + 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, + 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, + 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, + 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, + 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, + 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, + 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, + 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, + 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, + 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, + 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, + 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, + 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, + 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, + 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, + 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, + 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, + 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, + 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, + 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, + 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, + 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, + 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, + 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, + 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, + 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, + 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, + 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, + 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, + 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, + 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, + 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, + 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, + 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, + 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, + 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, + 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, + 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, + 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, + 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, + 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, + 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, + 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, + 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, + 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, + 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, + 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, + 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, + 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, + 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, + 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, + 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, + 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, + 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, + 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, + 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, + 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, + 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, + 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, + 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, + 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, + 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, + 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, + 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, + 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, + 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, + 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, + 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, + 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, + 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, + 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, + 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, + 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, + 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, + 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, + 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, + 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, + 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, + 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, + 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, + 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, + 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, + 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, + 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, + 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, + 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, + 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, + 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, + 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, + 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, + 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, + 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, + 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, + 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, + 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, + 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, + 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, + 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, + 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, + 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, + 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, + 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, + 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, + 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, + 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, + 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, + 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, + 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, + 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, + 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, + 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, + 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, + 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, + 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, + 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, + 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, + 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, + 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, + 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, + 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, + 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, + 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, + 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, + 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, + 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, + 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, + 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, + 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, + 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, + 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, + 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, + 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, + 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, + 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, + 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, + 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, + 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, + 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, + 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, + 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, + 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, + 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, + 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, + 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, + 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, + 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4240,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,36 +4328,13 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) if err != nil { return nil, err } - x := &controlNewAutoEnvironmentClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_NewAutoEnvironmentClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlNewAutoEnvironmentClient struct { - grpc.ClientStream -} - -func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil + return out, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4820,7 +4491,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4857,7 +4528,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4894,8 +4565,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { - return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5031,25 +4702,22 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(NewEnvironmentRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) -} - -type Control_NewAutoEnvironmentServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlNewAutoEnvironmentServer struct { - grpc.ServerStream -} - -func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5395,6 +5063,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5470,11 +5142,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, - { - StreamName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - ServerStreams: true, - }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5511,7 +5178,7 @@ func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5521,12 +5188,12 @@ func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5535,6 +5202,13 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x22 + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -5547,17 +5221,17 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i-- dAtA[i] = 0x12 } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if len(m.EnvironmentId) > 0 { + i -= len(m.EnvironmentId) + copy(dAtA[i:], m.EnvironmentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5567,12 +5241,12 @@ func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5581,6 +5255,13 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x1a + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -5598,7 +5279,7 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5608,12 +5289,12 @@ func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5622,6 +5303,13 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) @@ -5629,17 +5317,17 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5649,12 +5337,12 @@ func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5663,17 +5351,10 @@ func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5683,12 +5364,12 @@ func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5697,24 +5378,31 @@ func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ExecutorResources) > 0 { - i -= len(m.ExecutorResources) - copy(dAtA[i:], m.ExecutorResources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) - i-- - dAtA[i] = 0x12 + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if len(m.Taskresources) > 0 { - i -= len(m.Taskresources) - copy(dAtA[i:], m.Taskresources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) - i-- + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5724,12 +5412,12 @@ func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5738,9 +5426,33 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { + if m.Event != nil { { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MesosHeartbeat != nil { + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5748,12 +5460,11 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5763,12 +5474,12 @@ func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5777,16 +5488,56 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentEvent != nil { + { + size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } - if m.CleanupTasksReply != nil { + return len(dAtA) - i, nil +} +func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskEvent != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5794,12 +5545,32 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } return len(dAtA) - i, nil } +func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} -func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { +func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.RoleEvent != nil { + { + size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5809,12 +5580,12 @@ func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5823,27 +5594,17 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CloseStream { - i-- - if m.CloseStream { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5853,12 +5614,12 @@ func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5867,24 +5628,10 @@ func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5894,12 +5641,12 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5908,10 +5655,46 @@ func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5921,12 +5704,12 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5935,31 +5718,58 @@ func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a + } + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5969,12 +5779,12 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5983,45 +5793,17 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6031,12 +5813,12 @@ func (m *Event) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6045,215 +5827,10 @@ func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentStateChanged != nil { - { - size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentCreated != nil { - { - size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStateChanged != nil { - { - size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStatusChanged != nil { - { - size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Tasklaunched != nil { - { - size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} -func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosTaskcreated != nil { - { - size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentDestroyed != nil { - { - size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentError != nil { - { - size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } return len(dAtA) - i, nil } -func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} -func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Taskskilled != nil { - { - size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6263,12 +5840,12 @@ func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6280,7 +5857,7 @@ func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6290,12 +5867,12 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6304,10 +5881,31 @@ func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Version) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6317,286 +5915,12 @@ func (m *Version) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Version) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,7 +6128,7 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6814,12 +6138,12 @@ func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6828,7 +6152,67 @@ func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { @@ -8964,13 +8348,13 @@ func (m *Event_MesosHeartbeat) Size() (n int) { return n } -func (m *Ev_EnvironmentStateChanged) Size() (n int) { +func (m *Ev_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Environmentid) + l = len(m.EnvironmentId) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8981,23 +8365,7 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) + l = len(m.Error) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9007,7 +8375,7 @@ func (m *Ev_TaskStateChanged) Size() (n int) { return n } -func (m *Ev_TaskStatusChanged) Size() (n int) { +func (m *Ev_TaskEvent) Size() (n int) { if m == nil { return 0 } @@ -9017,23 +8385,11 @@ func (m *Ev_TaskStatusChanged) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Status) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskLaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9043,93 +8399,24 @@ func (m *Ev_TaskLaunched) Size() (n int) { return n } -func (m *Ev_MesosTaskCreated) Size() (n int) { +func (m *Ev_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Taskresources) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorResources) + l = len(m.Name) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentDestroyed) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Environmentid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.CloseStream { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TasksKilled) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9219,120 +8506,52 @@ func (m *Event) Size() (n int) { return n } -func (m *Event_EnvironmentStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentStateChanged != nil { - l = m.EnvironmentStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentCreated != nil { - l = m.EnvironmentCreated.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStateChanged != nil { - l = m.TaskStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStatusChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStatusChanged != nil { - l = m.TaskStatusChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_Tasklaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Tasklaunched != nil { - l = m.Tasklaunched.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_MesosTaskcreated) Size() (n int) { +func (m *Event_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.MesosTaskcreated != nil { - l = m.MesosTaskcreated.Size() + if m.EnvironmentEvent != nil { + l = m.EnvironmentEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentDestroyed) Size() (n int) { +func (m *Event_TaskEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentDestroyed != nil { - l = m.EnvironmentDestroyed.Size() + if m.TaskEvent != nil { + l = m.TaskEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentError) Size() (n int) { +func (m *Event_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentError != nil { - l = m.EnvironmentError.Size() + if m.RoleEvent != nil { + l = m.RoleEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_Taskskilled) Size() (n int) { +func (m *SubscribeRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Taskskilled != nil { - l = m.Taskskilled.Size() + l = len(m.Id) + if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9584,6 +8803,34 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *NewAutoEnvironmentReply) Size() (n int) { if m == nil { return 0 @@ -10555,452 +9802,25 @@ func (m *SetRepoDefaultRevisionReply) Size() (n int) { return n } -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environmentid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStatusChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *Empty) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 } -func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11023,44 +9843,12 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_TaskLaunched: wiretype end group for non-group") + return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11086,7 +9874,7 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { +func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11109,15 +9897,15 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_EnvironmentEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11145,11 +9933,11 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Taskresources = string(dAtA[iNdEx:postIndex]) + m.EnvironmentId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11177,67 +9965,32 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11247,27 +10000,23 @@ func (m *Ev_EnvironmentCreated) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11294,7 +10043,7 @@ func (m *Ev_EnvironmentCreated) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { +func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11317,17 +10066,17 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TaskEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TaskEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11337,31 +10086,59 @@ func (m *Ev_EnvironmentDestroyed) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11389,7 +10166,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environmentid = string(dAtA[iNdEx:postIndex]) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11416,7 +10193,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { +func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11439,15 +10216,15 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentError: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_RoleEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_RoleEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11475,13 +10252,13 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11491,71 +10268,29 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.CloseStream = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TasksKilled) 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 ErrIntOverflowO2Control - } - 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: Ev_TasksKilled: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11565,25 +10300,23 @@ func (m *Ev_TasksKilled) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11955,7 +10688,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11982,15 +10715,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentStateChanged{} + v := &Ev_EnvironmentEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentStateChanged{v} + m.Payload = &Event_EnvironmentEvent{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12017,225 +10750,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentCreated{} + v := &Ev_TaskEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentCreated{v} + m.Payload = &Event_TaskEvent{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStateChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStateChanged{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStatusChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStatusChanged{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskLaunched{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_Tasklaunched{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_MesosTaskCreated{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_MesosTaskcreated{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentDestroyed{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentDestroyed{v} - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentError{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentError{v} - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12262,11 +10785,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_TasksKilled{} + v := &Ev_RoleEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_Taskskilled{v} + m.Payload = &Event_RoleEvent{v} iNdEx = postIndex default: iNdEx = preIndex @@ -12312,16 +10835,48 @@ func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubscribeRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -14084,6 +12639,251 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NewAutoEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 29edd372e..9c538be96 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -33,47 +33,23 @@ option go_package = "pb"; message Event_MesosHeartbeat { } -message Ev_EnvironmentStateChanged { - string environmentid = 1; +message Ev_EnvironmentEvent { + string environmentId = 1; string state = 2; uint32 currentRunNumber = 3; + string error = 4; } -message Ev_TaskStateChanged { +message Ev_TaskEvent { string taskid = 1; string state = 2; + string status = 3; } -message Ev_TaskStatusChanged { - string taskid = 1; +message Ev_RoleEvent { + string name = 1; string status = 2; -} - -message Ev_TaskLaunched { - string taskid = 1; -} - -message Ev_MesosTaskCreated { - string taskresources = 1; - string executorResources = 2; -} - -message Ev_EnvironmentCreated { - EnvironmentInfo environment = 1; -} - -message Ev_EnvironmentDestroyed { - CleanupTasksReply cleanupTasksReply = 1; - string environmentid = 2; -} - -message Ev_EnvironmentError { - string error = 1; - bool closeStream = 2; -} - -message Ev_TasksKilled { - repeated ShortTaskInfo killedTasks = 1; + string state = 3; } ////////////////////////////////////////////////////// @@ -85,7 +61,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} - rpc NewAutoEnvironment(NewEnvironmentRequest) returns (stream Event); + rpc NewAutoEnvironment (NewAutoEnvironmentRequest) returns (NewAutoEnvironmentReply) {} rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} @@ -138,20 +114,14 @@ message StatusUpdate { message Event { string timestamp = 1; oneof Payload { - Ev_EnvironmentStateChanged environmentStateChanged = 2; - Ev_EnvironmentCreated environmentCreated = 3; - Ev_TaskStateChanged taskStateChanged = 4; - Ev_TaskStatusChanged taskStatusChanged = 5; - Ev_TaskLaunched tasklaunched = 6; - Ev_MesosTaskCreated mesosTaskcreated = 7; - Ev_EnvironmentDestroyed environmentDestroyed = 8; - Ev_EnvironmentError environmentError = 9; - Ev_TasksKilled taskskilled = 10; + Ev_EnvironmentEvent environmentEvent = 2; + Ev_TaskEvent taskEvent = 3; + Ev_RoleEvent roleEvent = 4; } } message SubscribeRequest{ - + string id = 1; } //////////////////////////////////////// // Framework @@ -208,6 +178,11 @@ message NewEnvironmentRequest { message NewEnvironmentReply { EnvironmentInfo environment = 1; } +message NewAutoEnvironmentRequest { + string workflowTemplate = 1; + map vars = 2; + string id = 3; +} message NewAutoEnvironmentReply { } diff --git a/core/protos/protoutils.go b/core/protos/protoutils.go new file mode 100644 index 000000000..0a6541e51 --- /dev/null +++ b/core/protos/protoutils.go @@ -0,0 +1,37 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package pb + +import ( + "time" +) + +func WrapEvent(ce isEvent_Payload) *Event { + return &Event{ + Timestamp:time.Now().Format(time.RFC3339), + Payload: ce, + } +} diff --git a/core/server.go b/core/server.go index 5b9597847..08591928a 100644 --- a/core/server.go +++ b/core/server.go @@ -672,8 +672,6 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe } else { return nil } - case err := <- sub.Err(): - return err } } } diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 143b856f7..71934468a 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -177,31 +177,4 @@ func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { state: state, } return t -} - -func NewEnvironmentErrorMessage(err string) (t *TaskmanMessage) { - t = newTaskmanMessage(taskop.Error) - t.environmentMessage = environmentMessage{ - errSt: err, - } - return t -} - -// type killTasksMessage struct { -// taskIds []string -// } - -// func(km *killTasksMessage) GetTaskIds() []string { -// if km == nil { -// return nil -// } -// return km.taskIds -// } - -// func NewkillTasksMessage(taskids []string) (t *TaskmanMessage) { -// t = NewTaskmanMessage(event.KillTasks) -// t.killTasksMessage = killTasksMessage{ -// taskIds: taskids, -// } -// return t -// } +} \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index aaafe5c8a..01cbaa1a8 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -34,7 +34,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" - pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/common/utils/uid" @@ -78,13 +77,11 @@ type Manager struct { tasksFinished int schedulerState *schedulerState - publicEventFeed *EventFeed internalEventCh chan<- event.Event ackKilledTasks *safeAcks } func NewManager(shutdown func(), - publicEventFeed *EventFeed, internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need @@ -113,7 +110,6 @@ func NewManager(shutdown func(), taskman = &Manager{ classes: newClasses(), roster: newRoster(), - publicEventFeed: publicEventFeed, internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) @@ -639,7 +635,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} - go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId,"KILLED")) } return @@ -660,7 +655,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId, taskPtr.status.String())) } // Kill all tasks outside an environment (all unlocked tasks) @@ -677,7 +671,6 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - toKill := m.roster.filtered(func(t *Task) bool { if t.IsLocked() { return false @@ -706,7 +699,6 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err close(ack) m.ackKilledTasks.deleteKey(id) } - go m.publicEventFeed.Send(pb.NewKillTasksEvent(tasksToShortTaskInfos(killed))) return } @@ -789,13 +781,11 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber())) }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber())) }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -837,14 +827,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - go m.publicEventFeed.Send(pb.NewEventTaskState(tm.taskId, tm.state)) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) - case taskop.Error: - // error reported from environment need to inform stream - // FIXME: A better way to publish errors to stream that - // are not from the taskman. - go m.publicEventFeed.Send(pb.NewEnvironmentErrorEvent(tm.GetError(), true)) } diff --git a/core/task/taskutil.go b/core/task/safeacks.go similarity index 71% rename from core/task/taskutil.go rename to core/task/safeacks.go index 6782fc134..e458ee7fe 100644 --- a/core/task/taskutil.go +++ b/core/task/safeacks.go @@ -26,41 +26,8 @@ package task import ( "sync" - "github.com/AliceO2Group/Control/core/protos" ) -func taskToShortTaskInfo(t *Task) (sti *pb.ShortTaskInfo) { - if t == nil { - return - } - sti = &pb.ShortTaskInfo{ - Name: t.GetName(), - Locked: t.IsLocked(), - TaskId: t.GetTaskId(), - ClassName: t.GetClassName(), - DeploymentInfo: &pb.TaskDeploymentInfo{ - Hostname: t.GetHostname(), - AgentId: t.GetAgentId(), - OfferId: t.GetOfferId(), - ExecutorId: t.GetExecutorId(), - }, - Pid: t.GetTaskPID(), - } - return -} - -func tasksToShortTaskInfos(tasks []*Task) (stis []*pb.ShortTaskInfo) { - if tasks == nil { - return - } - stis = make([]*pb.ShortTaskInfo, len(tasks)) - for i, t := range tasks { - shortTaskInfo := taskToShortTaskInfo(t) - stis[i] = shortTaskInfo - } - return -} - type safeAcks struct { mu sync.RWMutex acks map[string]chan struct{} diff --git a/core/task/scheduler.go b/core/task/scheduler.go index ca3cc1857..6d1bbbf37 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -45,7 +45,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" - cpb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/executor/protos" "github.com/gogo/protobuf/proto" @@ -690,7 +689,6 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - go state.taskman.publicEventFeed.Send(cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String())) newTaskId := taskPtr.GetTaskId() @@ -729,7 +727,6 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - go state.taskman.publicEventFeed.Send(cpb.NewEventTaskLaunch(newTaskId)) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/subscriber.go b/core/task/subscriber.go deleted file mode 100644 index 14b465923..000000000 --- a/core/task/subscriber.go +++ /dev/null @@ -1,97 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - - -package task - -import ( - "sync" - - pb "github.com/AliceO2Group/Control/core/protos" -) - -type Subscription interface { - Unsubscribe() - Err() <-chan error -} - -type EventFeed struct { - mu sync.RWMutex - streams []chan *pb.Event -} - -func (e *EventFeed) Send(data *pb.Event) { - e.mu.RLock() - defer e.mu.RUnlock() - for _, stream := range e.streams { - stream <- data - } -} - -func (e *EventFeed) Subscribe(stream chan *pb.Event) Subscription { - e.mu.Lock() - defer e.mu.Unlock() - e.streams = append(e.streams, stream) - return &sub{ - feed: e, - channelIndex: len(e.streams)-1, - channel: stream, - err: make(chan error, 1), - } -} - -// removes an channel at index i efficiently as order does not -// matter for listeners we keep track of. -func (e *EventFeed) remove(i int) { - e.mu.Lock() - close(e.streams[i]) - e.streams[i] = e.streams[len(e.streams)-1] - e.streams = e.streams[:len(e.streams)-1] - e.mu.Unlock() -} - -func NewEventFeed() *EventFeed { - return &EventFeed{ - streams: make([]chan *pb.Event, 0), - } -} - -type sub struct { - feed *EventFeed - channelIndex int - channel chan *pb.Event - once sync.Once - err chan error -} - -func (s *sub) Unsubscribe() { - s.once.Do(func() { - s.feed.remove(s.channelIndex) - close(s.err) - }) -} - -func (s *sub) Err() <-chan error { - return s.err -} From 073d30c31e2bbeb27e5973e606b4d03a588291b4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 19:04:24 +0100 Subject: [PATCH 0631/2352] [core] stream events per environment --- core/environment/environment.go | 29 ++++- core/environment/eventStream.go | 122 +++++++++++++++++++ core/environment/manager.go | 84 ++++++++++--- core/environment/transition_configure.go | 2 + core/environment/transition_reset.go | 2 + core/environment/transition_startactivity.go | 6 + core/environment/transition_stopactivity.go | 2 + core/task/manager.go | 2 + core/task/scheduler.go | 1 + core/task/task.go | 15 +++ core/workflow/aggregatorrole.go | 3 + core/workflow/parentadapter.go | 12 +- core/workflow/role.go | 2 + core/workflow/rolebase.go | 8 ++ core/workflow/taskrole.go | 3 + 15 files changed, 274 insertions(+), 19 deletions(-) create mode 100644 core/environment/eventStream.go diff --git a/core/environment/environment.go b/core/environment/environment.go index cae462a2c..10e3b4074 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -67,6 +67,7 @@ type Environment struct { UserVars gera.StringMap // From user input stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} + eventStream Subscription } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -99,6 +100,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, + func(ev event.Event) { + if env.eventStream != nil{ + env.eventStream.Send(ev) + }}, ) env.Sm = fsm.NewFSM( "STANDBY", @@ -422,4 +427,26 @@ func (env *Environment) unsubscribeFromWfState() { default: close(env.unsubscribe) } -} \ No newline at end of file +} + +func (env *Environment) addSubscription(sub Subscription) { + env.Mu.Lock() + env.eventStream = sub + env.Mu.Unlock() +} + +func (env *Environment) sendEnvironmentEvent(ev event.Event) { + env.Mu.Lock() + if env.eventStream != nil { + env.eventStream.Send(ev) + } + env.Mu.Unlock() +} + +func (env *Environment) closeStream() { + env.Mu.Lock() + if env.eventStream != nil { + env.eventStream.Unsubscribe() + } + env.Mu.Unlock() +} diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go new file mode 100644 index 000000000..40ee93d65 --- /dev/null +++ b/core/environment/eventStream.go @@ -0,0 +1,122 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package environment + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/common/event" +) + +type Subscription interface { + Unsubscribe() + GetFeed() chan *pb.Event + Send(event.Event) + Err() <-chan error +} + +type eventStream struct { + stream chan *pb.Event +} + +func SubscribeToStream(ch chan *pb.Event) Subscription { + return &eventSub{ + feed: &eventStream{ + stream: ch, + }, + err: make(chan error), + } +} + +func (e *eventStream) send(data *pb.Event) { + if e.stream != nil { + e.stream <- data + } +} + +func (e *eventStream) closeStream() { + close(e.stream) +} + +type eventSub struct { + feed *eventStream + once sync.Once + err chan error +} + +func (s *eventSub) Unsubscribe() { + s.once.Do(func() { + s.feed.closeStream() + close(s.err) + }) +} + +func (s *eventSub) GetFeed() chan *pb.Event { + return s.feed.stream +} + +func (s *eventSub) Send(ev event.Event) { + var data *pb.Event + + switch typedEvent := ev.(type) { + case *event.RoleEvent: + re := pb.Event_RoleEvent{ + RoleEvent: &pb.Ev_RoleEvent{ + Name: typedEvent.GetName(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + }, + } + data = pb.WrapEvent(&re) + case *event.TaskEvent: + re := pb.Event_TaskEvent{ + TaskEvent: &pb.Ev_TaskEvent{ + Taskid: typedEvent.GetName(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + }, + } + data = pb.WrapEvent(&re) + case *event.EnvironmentEvent: + re := pb.Event_EnvironmentEvent{ + EnvironmentEvent: &pb.Ev_EnvironmentEvent{ + EnvironmentId: typedEvent.GetName(), + State: typedEvent.GetState(), + CurrentRunNumber: typedEvent.GetRun(), + Error: typedEvent.GetError(), + }, + } + data = pb.WrapEvent(&re) + default: + // noop + } + s.feed.send(data) +} + +func (s *eventSub) Err() <-chan error { + return s.err +} \ No newline at end of file diff --git a/core/environment/manager.go b/core/environment/manager.go index e8280e8d0..707cfca9f 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -236,6 +236,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error delete(envs.m, environmentId) env.unsubscribeFromWfState() + env.closeStream() return err } @@ -363,28 +364,81 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } -func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub task.Subscription) { - defer sub.Unsubscribe() - id, err := envs.CreateEnvironment(workflowPath, userVars) - +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { + // defer sub.Unsubscribe() + // id, err := envs.CreateEnvironment(workflowPath, userVars) + envs.mu.Lock() + + envUserVars := make(map[string]string) + workflowUserVars := make(map[string]string) + for k, v := range userVars { + if strings.ContainsRune(k, task.TARGET_SEPARATOR_RUNE) { + workflowUserVars[k] = v + } else { + envUserVars[k] = v + } + } + + env, err := newEnvironment(envUserVars) + if err != nil { + return + } + env.addSubscription(sub) + env.hookHandlerF = func(hooks task.Tasks) error { + return envs.taskman.TriggerHooks(hooks) + } + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) + if err != nil { + err = fmt.Errorf("cannot load workflow template: %w", err) + return + } + + envs.m[env.id] = env + envs.pendingStateChangeCh[env.id] = env.stateChangedCh + env.subscribeToWfState(envs.taskman) + + err = env.TryTransition(NewConfigureTransition( + envs.taskman, + nil, //roles, + nil, + true )) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + envState := env.CurrentState() + envTasks := env.Workflow().GetTasks() + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) + envs.taskman.MessageChannel <- taskmanMessage + + delete(envs.m, env.id) + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + }). + Warn("environment deployment failed, tasks were cleaned up") + return } - env, err := envs.Environment(id) + envs.mu.Unlock() + + if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + return + } // now we have the environment we should transition to start trans := NewStartActivityTransition(envs.taskman) if trans == nil { - // environment error should report - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } err = env.TryTransition(trans) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } @@ -395,30 +449,26 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // RUN finished so we can reset and delete the environment err := env.TryTransition(NewResetTransition(envs.taskman)) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } - err = envs.TeardownEnvironment(id, false) + err = envs.TeardownEnvironment(env.id, false) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } tasksForEnv := env.Workflow().GetTasks().GetTaskIds() _, _, err = envs.taskman.KillTasks(tasksForEnv) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("") return case "ERROR": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment ERROR state") return case "MIXED": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment MIXED state") return case "": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment not found") return } } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 318ca1961..770da5f33 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -28,6 +28,7 @@ import ( "errors" "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/pborman/uuid" @@ -190,5 +191,6 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index b09883d92..8aed45c4f 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" ) @@ -63,5 +64,6 @@ func (t ResetTransition) do(env *Environment) (err error) { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "RESET"}) return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index ee684b4c0..37dc77c12 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -28,6 +28,7 @@ import ( "errors" "strconv" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" @@ -83,6 +84,11 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } log.WithField(infologger.Run, env.currentRunNumber).Info("run started") + env.sendEnvironmentEvent(&event.EnvironmentEvent{ + EnvironmentID: env.Id().String(), + State: "RUNNING", + Run: env.currentRunNumber, + }) return } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bebd6d2e5..9aa22c4d9 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" ) @@ -67,6 +68,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return } diff --git a/core/task/manager.go b/core/task/manager.go index 01cbaa1a8..fb4bbc287 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,6 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false + taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, State: state}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -655,6 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } + taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, Status: taskPtr.status.String()}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 6d1bbbf37..c8aa64cb8 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,6 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") + taskPtr.SendEvent(&event.TaskEvent{TaskID: newTaskId, State:"LAUNCHED"}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/task.go b/core/task/task.go index 7ca799a2d..406cf73f5 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -43,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" @@ -68,6 +69,7 @@ type parentRole interface { GetUserVars() gera.StringMap ConsolidatedVarStack() (varStack map[string]string, err error) CollectInboundChannels() []channel.Inbound + SendEvent(event.Event) } @@ -387,6 +389,19 @@ func (t *Task) GetEnvironmentId() uid.ID { return t.parent.GetEnvironmentId() } +func (t *Task) SendEvent(ev event.Event) { + if t == nil { + return + } + t.mu.RLock() + defer t.mu.RUnlock() + + if t.parent == nil { + return + } + t.parent.SendEvent(ev) +} + func (t *Task) GetLocalBindMap() channel.BindMap { t.mu.RLock() defer t.mu.RUnlock() diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 54cb05d23..3500fc878 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,6 +29,7 @@ import ( "strings" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -189,6 +190,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") + r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) } @@ -200,6 +202,7 @@ func (r *aggregatorRole) updateState(s task.State) { } log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") r.state.merge(s, r) + r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String()}) if r.parent != nil { r.parent.updateState(r.state.get()) } diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 17d2eedd8..e42f8cc81 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -28,6 +28,7 @@ import ( "sync" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" @@ -37,6 +38,8 @@ type GetEnvIdFunc func() uid.ID type GetStringMapFunc func() gera.StringMap +type SendEvents func(event.Event) + type ParentAdapter struct { mu sync.Mutex getEnvIdFunc GetEnvIdFunc @@ -44,6 +47,7 @@ type ParentAdapter struct { getDefaultsFunc GetStringMapFunc getVarsFunc GetStringMapFunc getUserVarsFunc GetStringMapFunc + SendEvents SendEvents stateSubscriptions map[string]chan task.State statusSubscriptions map[string]chan task.Status @@ -52,12 +56,14 @@ type ParentAdapter struct { func NewParentAdapter(getEnvId GetEnvIdFunc, getDefaults GetStringMapFunc, getVars GetStringMapFunc, - getUserVars GetStringMapFunc) *ParentAdapter { + getUserVars GetStringMapFunc, + SendEvents SendEvents) *ParentAdapter { return &ParentAdapter{ getEnvIdFunc: getEnvId, getDefaultsFunc: getDefaults, getVarsFunc: getVars, getUserVarsFunc: getUserVars, + SendEvents: SendEvents, stateSubscriptions: make(map[string]chan task.State), statusSubscriptions: make(map[string]chan task.Status, 0), } @@ -140,4 +146,8 @@ func (p *ParentAdapter) GetUserVars() gera.StringMap { func (*ParentAdapter) CollectInboundChannels() []channel.Inbound { return make([]channel.Inbound, 0) +} + +func (p *ParentAdapter) SendEvent(ev event.Event) { + p.SendEvents(ev) } \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index f14612a1a..e55213d58 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -30,6 +30,7 @@ package workflow import ( "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -70,6 +71,7 @@ type Updatable interface { GetPath() string CollectOutboundChannels() []channel.Outbound CollectInboundChannels() []channel.Inbound + SendEvent(event.Event) } type VarNode interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 786c9dd1b..5020b2897 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -29,6 +29,7 @@ import ( "strings" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" @@ -294,6 +295,13 @@ func (r* roleBase) GetEnvironmentId() uid.ID { return r.parent.GetEnvironmentId() } +func (r* roleBase) SendEvent(ev event.Event) { + if r.parent == nil { + return + } + r.parent.SendEvent(ev) +} + func (r *roleBase) GetPath() string { if r == nil { return "" diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 1b7683cec..94c75595b 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -30,6 +30,7 @@ import ( texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -180,6 +181,7 @@ func (t *taskRole) updateStatus(s task.Status) { log.WithField("status", s.String()).Error("cannot update status with nil parent") } t.status.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String()}) t.parent.updateStatus(s) } @@ -189,6 +191,7 @@ func (t *taskRole) updateState(s task.State) { } log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") t.state.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String()}) t.parent.updateState(s) } From 498554373d36a4389805351fa5d8d324d250675f Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 2 Dec 2020 12:16:00 +0100 Subject: [PATCH 0632/2352] [coconut] Report environment error --- coconut/control/control.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 5bcef0ad6..0fcc23f4e 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -226,11 +226,11 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - if evt:= rcv.GetEnvironmentEvent(); evt != nil{ + if evt := rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { log.WithPrefix("Event"). - WithError(err). - Error("environment error") + WithError(fmt.Errorf(evt.Error)). + Error(evt.EnvironmentId) return nil } } From 10493f9a9ec4fe24c93b6a45444ae5f896818bde Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 2 Dec 2020 12:29:05 +0100 Subject: [PATCH 0633/2352] [core] Wait for release tasks when cleanup a failing new Environment --- core/environment/environment.go | 1 + core/environment/manager.go | 40 ++++++++++++++++++++++++++++----- core/server.go | 11 +++++---- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 10e3b4074..7c9e90f6c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -447,6 +447,7 @@ func (env *Environment) closeStream() { env.Mu.Lock() if env.eventStream != nil { env.eventStream.Unsubscribe() + env.eventStream = nil } env.Mu.Unlock() } diff --git a/core/environment/manager.go b/core/environment/manager.go index 707cfca9f..d996e9ba0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -182,7 +182,8 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }). Warn("environment deployment failed, tasks were cleaned up") - // close state channels + // close state channels and stream + env.closeStream() close(envs.pendingStateChangeCh[env.Id()]) delete(envs.pendingStateChangeCh, env.Id()) @@ -365,9 +366,6 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { - // defer sub.Unsubscribe() - // id, err := envs.CreateEnvironment(workflowPath, userVars) - envs.mu.Lock() envUserVars := make(map[string]string) workflowUserVars := make(map[string]string) @@ -381,20 +379,25 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str env, err := newEnvironment(envUserVars) if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } env.addSubscription(sub) + defer env.closeStream() env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) } env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } + envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh + envs.mu.Unlock() env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( @@ -406,9 +409,29 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envState := env.CurrentState() envTasks := env.Workflow().GetTasks() taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) + pendingCh := make(chan *event.TasksReleasedEvent) + envs.mu.Lock() + envs.pendingTeardownsCh[env.Id()] = pendingCh + envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage + incomingEv := <- pendingCh + + // If some tasks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": env.Id().String(), + }). + WithError(err). + Warn("task failed to release") + } + } + + envs.mu.Lock() delete(envs.m, env.id) + envs.mu.Unlock() killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { log.WithError(rlsErr).Warn("task teardown error") @@ -418,11 +441,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "lastEnvState": envState, }). Warn("environment deployment failed, tasks were cleaned up") - + + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + // close state channel + envs.mu.Lock() + close(envs.pendingStateChangeCh[env.Id()]) + delete(envs.pendingStateChangeCh, env.Id()) + envs.mu.Unlock() return } - envs.mu.Unlock() if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) diff --git a/core/server.go b/core/server.go index 08591928a..5d4cc26aa 100644 --- a/core/server.go +++ b/core/server.go @@ -664,14 +664,13 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe for { select { case event, ok := <- ch: - if ok { - err := srv.Send(event) - if err != nil { - return err - } - } else { + if !ok { return nil } + err := srv.Send(event) + if err != nil { + return err + } } } } From 94f9d6e8e59283ff373d89b52fdf8e05e34a0c1b Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 4 Dec 2020 17:55:40 +0100 Subject: [PATCH 0634/2352] [common] Add more info to the events structs --- common/event/roleevent.go | 5 +++++ common/event/taskevents.go | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/common/event/roleevent.go b/common/event/roleevent.go index 6de7d09f9..cdd907b40 100644 --- a/common/event/roleevent.go +++ b/common/event/roleevent.go @@ -29,6 +29,7 @@ type RoleEvent struct { Name string Status string State string + RolePath string } func (r *RoleEvent) GetName() string { @@ -41,4 +42,8 @@ func (r *RoleEvent) GetStatus() string { func (r *RoleEvent) GetState() string { return r.State +} + +func (r *RoleEvent) GetRolePath() string { + return r.RolePath } \ No newline at end of file diff --git a/common/event/taskevents.go b/common/event/taskevents.go index b3afd10bc..94c533dc7 100644 --- a/common/event/taskevents.go +++ b/common/event/taskevents.go @@ -26,12 +26,19 @@ package event type TaskEvent struct { eventBase - TaskID string + Name string + TaskID string Status string State string + Hostname string + ClassName string } func (r *TaskEvent) GetName() string { + return r.Name +} + +func (r *TaskEvent) GetTaskID() string { return r.TaskID } @@ -41,4 +48,12 @@ func (r *TaskEvent) GetStatus() string { func (r *TaskEvent) GetState() string { return r.State +} + +func (r *TaskEvent) GetHostname() string { + return r.Hostname +} + +func (r *TaskEvent) GetClassName() string { + return r.ClassName } \ No newline at end of file From 0d4599b9b52cd59ad67771c49d6bfb2623b94d31 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 4 Dec 2020 18:01:02 +0100 Subject: [PATCH 0635/2352] [core] Stream events with more info --- coconut/protos/o2control.pb.go | 583 +++++++++++++++++++++----------- core/environment/eventStream.go | 6 +- core/protos/o2control.pb.go | 583 +++++++++++++++++++++----------- core/protos/o2control.proto | 10 +- core/task/manager.go | 4 +- core/task/scheduler.go | 2 +- core/workflow/aggregatorrole.go | 4 +- core/workflow/taskrole.go | 4 +- 8 files changed, 807 insertions(+), 389 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index b2d5f0a6b..fc1db7fb1 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -233,9 +233,12 @@ func (m *Ev_EnvironmentEvent) GetError() string { } type Ev_TaskEvent struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -274,6 +277,13 @@ func (m *Ev_TaskEvent) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (m *Ev_TaskEvent) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid @@ -295,10 +305,25 @@ func (m *Ev_TaskEvent) GetStatus() string { return "" } +func (m *Ev_TaskEvent) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Ev_TaskEvent) GetClassName() string { + if m != nil { + return m.ClassName + } + return "" +} + type Ev_RoleEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -358,6 +383,13 @@ func (m *Ev_RoleEvent) GetState() string { return "" } +func (m *Ev_RoleEvent) GetRolePath() string { + if m != nil { + return m.RolePath + } + return "" +} + //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -4040,188 +4072,189 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2890 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, - 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, - 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, - 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, - 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, - 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, - 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, - 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, - 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, - 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, - 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, - 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, - 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, - 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, - 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, - 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, - 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, - 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, - 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, - 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, - 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, - 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, - 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, - 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, - 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, - 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, - 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, - 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, - 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, - 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, - 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, - 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, - 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, - 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, - 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, - 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, - 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, - 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, - 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, - 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, - 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, - 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, - 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, - 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, - 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, - 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, - 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, - 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, - 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, - 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, - 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, - 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, - 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, - 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, - 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, - 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, - 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, - 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, - 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, - 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, - 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, - 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, - 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, - 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, - 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, - 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, - 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, - 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, - 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, - 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, - 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, - 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, - 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, - 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, - 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, - 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, - 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, - 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, - 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, - 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, - 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, - 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, - 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, - 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, - 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, - 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, - 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, - 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, - 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, - 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, - 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, - 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, - 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, - 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, - 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, - 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, - 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, - 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, - 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, - 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, - 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, - 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, - 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, - 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, - 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, - 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, - 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, - 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, - 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, - 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, - 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, - 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, - 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, - 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, - 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, - 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, - 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, - 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, - 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, - 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, - 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, - 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, - 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, - 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, - 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, - 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, - 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, - 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, - 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, - 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, - 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, - 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, - 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, - 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, - 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, - 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, - 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, - 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, - 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, - 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, - 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, - 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, - 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, - 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, - 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, - 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, - 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, - 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, - 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, - 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, - 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, - 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, - 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, - 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, - 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, - 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, - 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, - 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, - 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, - 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, - 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, - 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, - 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, - 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, - 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, - 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, - 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, - 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, - 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, - 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, - 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, - 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, - 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, - 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, - 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, - 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, - 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, - 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, - 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, + // 2906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, + 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, + 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, + 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, + 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, + 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, + 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, + 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, + 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, + 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, + 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, + 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, + 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, + 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, + 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, + 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, + 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, + 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, + 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, + 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, + 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, + 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, + 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, + 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, + 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, + 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, + 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, + 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, + 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, + 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, + 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, + 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, + 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, + 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, + 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, + 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, + 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, + 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, + 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, + 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, + 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, + 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, + 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, + 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, + 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, + 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, + 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, + 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, + 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, + 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, + 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, + 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, + 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, + 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, + 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, + 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, + 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, + 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, + 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, + 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, + 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, + 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, + 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, + 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, + 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, + 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, + 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, + 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, + 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, + 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, + 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, + 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, + 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, + 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, + 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, + 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, + 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, + 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, + 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, + 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, + 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, + 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, + 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, + 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, + 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, + 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, + 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, + 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, + 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, + 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, + 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, + 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, + 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, + 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, + 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, + 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, + 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, + 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, + 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, + 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, + 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, + 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, + 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, + 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, + 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, + 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, + 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, + 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, + 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, + 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, + 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, + 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, + 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, + 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, + 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, + 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, + 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, + 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, + 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, + 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, + 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, + 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, + 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, + 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, + 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, + 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, + 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, + 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, + 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, + 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, + 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, + 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, + 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, + 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, + 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, + 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, + 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, + 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, + 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, + 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, + 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, + 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, + 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, + 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, + 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, + 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, + 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, + 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, + 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, + 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, + 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, + 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, + 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, + 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, + 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, + 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, + 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, + 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, + 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, + 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, + 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, + 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, + 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, + 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, + 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, + 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, + 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, + 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, + 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, + 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, + 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, + 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, + 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, + 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, + 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, + 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, + 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, + 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, + 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, + 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, + 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5255,25 +5288,46 @@ func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0x2a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.Taskid) > 0 { i -= len(m.Taskid) copy(dAtA[i:], m.Taskid) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -5303,6 +5357,13 @@ func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.RolePath) > 0 { + i -= len(m.RolePath) + copy(dAtA[i:], m.RolePath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) + i-- + dAtA[i] = 0x22 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -8381,6 +8442,10 @@ func (m *Ev_TaskEvent) Size() (n int) { } var l int _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -8393,6 +8458,14 @@ func (m *Ev_TaskEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8417,6 +8490,10 @@ func (m *Ev_RoleEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.RolePath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10073,6 +10150,38 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Taskid", wireType) } @@ -10104,7 +10213,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Taskid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -10136,7 +10245,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } @@ -10168,6 +10277,70 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10318,6 +10491,38 @@ func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RolePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index 40ee93d65..fed9f63a2 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -89,15 +89,19 @@ func (s *eventSub) Send(ev event.Event) { Name: typedEvent.GetName(), State: typedEvent.GetState(), Status: typedEvent.GetStatus(), + RolePath: typedEvent.GetRolePath(), }, } data = pb.WrapEvent(&re) case *event.TaskEvent: re := pb.Event_TaskEvent{ TaskEvent: &pb.Ev_TaskEvent{ - Taskid: typedEvent.GetName(), + Name: typedEvent.GetName(), + Taskid: typedEvent.GetTaskID(), State: typedEvent.GetState(), Status: typedEvent.GetStatus(), + Hostname: typedEvent.GetHostname(), + ClassName: typedEvent.GetClassName(), }, } data = pb.WrapEvent(&re) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index b2d5f0a6b..fc1db7fb1 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -233,9 +233,12 @@ func (m *Ev_EnvironmentEvent) GetError() string { } type Ev_TaskEvent struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -274,6 +277,13 @@ func (m *Ev_TaskEvent) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (m *Ev_TaskEvent) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid @@ -295,10 +305,25 @@ func (m *Ev_TaskEvent) GetStatus() string { return "" } +func (m *Ev_TaskEvent) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Ev_TaskEvent) GetClassName() string { + if m != nil { + return m.ClassName + } + return "" +} + type Ev_RoleEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -358,6 +383,13 @@ func (m *Ev_RoleEvent) GetState() string { return "" } +func (m *Ev_RoleEvent) GetRolePath() string { + if m != nil { + return m.RolePath + } + return "" +} + //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -4040,188 +4072,189 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2890 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, - 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, - 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, - 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, - 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, - 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, - 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, - 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, - 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, - 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, - 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, - 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, - 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, - 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, - 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, - 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, - 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, - 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, - 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, - 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, - 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, - 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, - 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, - 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, - 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, - 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, - 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, - 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, - 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, - 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, - 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, - 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, - 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, - 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, - 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, - 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, - 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, - 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, - 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, - 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, - 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, - 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, - 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, - 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, - 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, - 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, - 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, - 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, - 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, - 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, - 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, - 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, - 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, - 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, - 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, - 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, - 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, - 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, - 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, - 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, - 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, - 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, - 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, - 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, - 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, - 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, - 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, - 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, - 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, - 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, - 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, - 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, - 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, - 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, - 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, - 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, - 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, - 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, - 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, - 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, - 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, - 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, - 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, - 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, - 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, - 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, - 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, - 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, - 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, - 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, - 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, - 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, - 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, - 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, - 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, - 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, - 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, - 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, - 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, - 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, - 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, - 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, - 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, - 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, - 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, - 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, - 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, - 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, - 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, - 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, - 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, - 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, - 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, - 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, - 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, - 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, - 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, - 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, - 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, - 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, - 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, - 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, - 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, - 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, - 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, - 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, - 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, - 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, - 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, - 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, - 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, - 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, - 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, - 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, - 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, - 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, - 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, - 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, - 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, - 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, - 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, - 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, - 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, - 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, - 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, - 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, - 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, - 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, - 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, - 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, - 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, - 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, - 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, - 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, - 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, - 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, - 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, - 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, - 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, - 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, - 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, - 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, - 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, - 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, - 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, - 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, - 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, - 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, - 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, - 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, - 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, - 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, - 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, - 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, - 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, - 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, - 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, - 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, - 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, + // 2906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, + 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, + 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, + 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, + 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, + 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, + 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, + 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, + 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, + 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, + 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, + 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, + 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, + 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, + 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, + 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, + 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, + 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, + 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, + 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, + 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, + 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, + 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, + 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, + 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, + 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, + 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, + 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, + 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, + 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, + 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, + 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, + 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, + 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, + 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, + 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, + 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, + 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, + 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, + 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, + 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, + 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, + 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, + 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, + 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, + 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, + 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, + 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, + 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, + 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, + 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, + 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, + 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, + 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, + 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, + 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, + 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, + 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, + 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, + 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, + 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, + 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, + 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, + 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, + 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, + 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, + 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, + 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, + 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, + 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, + 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, + 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, + 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, + 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, + 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, + 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, + 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, + 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, + 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, + 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, + 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, + 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, + 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, + 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, + 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, + 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, + 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, + 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, + 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, + 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, + 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, + 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, + 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, + 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, + 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, + 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, + 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, + 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, + 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, + 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, + 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, + 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, + 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, + 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, + 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, + 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, + 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, + 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, + 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, + 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, + 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, + 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, + 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, + 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, + 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, + 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, + 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, + 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, + 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, + 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, + 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, + 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, + 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, + 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, + 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, + 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, + 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, + 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, + 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, + 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, + 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, + 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, + 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, + 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, + 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, + 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, + 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, + 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, + 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, + 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, + 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, + 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, + 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, + 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, + 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, + 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, + 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, + 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, + 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, + 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, + 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, + 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, + 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, + 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, + 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, + 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, + 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, + 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, + 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, + 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, + 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, + 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, + 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, + 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, + 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, + 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, + 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, + 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, + 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, + 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, + 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, + 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, + 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, + 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, + 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, + 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, + 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, + 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, + 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, + 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, + 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5255,25 +5288,46 @@ func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0x2a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.Taskid) > 0 { i -= len(m.Taskid) copy(dAtA[i:], m.Taskid) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -5303,6 +5357,13 @@ func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.RolePath) > 0 { + i -= len(m.RolePath) + copy(dAtA[i:], m.RolePath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) + i-- + dAtA[i] = 0x22 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -8381,6 +8442,10 @@ func (m *Ev_TaskEvent) Size() (n int) { } var l int _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -8393,6 +8458,14 @@ func (m *Ev_TaskEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8417,6 +8490,10 @@ func (m *Ev_RoleEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.RolePath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10073,6 +10150,38 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Taskid", wireType) } @@ -10104,7 +10213,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Taskid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -10136,7 +10245,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } @@ -10168,6 +10277,70 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10318,6 +10491,38 @@ func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RolePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9c538be96..29ee73eb6 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -41,15 +41,19 @@ message Ev_EnvironmentEvent { } message Ev_TaskEvent { - string taskid = 1; - string state = 2; - string status = 3; + string name = 1; + string taskid = 2; + string state = 3; + string status = 4; + string hostname = 5; + string className = 6; } message Ev_RoleEvent { string name = 1; string status = 2; string state = 3; + string rolePath = 4; } ////////////////////////////////////////////////////// diff --git a/core/task/manager.go b/core/task/manager.go index fb4bbc287..6744cd4d1 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,7 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, State: state}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.className}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -656,7 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, Status: taskPtr.status.String()}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.className}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index c8aa64cb8..858bf0c6d 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,7 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{TaskID: newTaskId, State:"LAUNCHED"}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.className}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 3500fc878..6ce5c14cc 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -190,7 +190,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") - r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String()}) + r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) } @@ -202,7 +202,7 @@ func (r *aggregatorRole) updateState(s task.State) { } log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") r.state.merge(s, r) - r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String()}) + r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 94c75595b..10cb28fc8 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -181,7 +181,7 @@ func (t *taskRole) updateStatus(s task.Status) { log.WithField("status", s.String()).Error("cannot update status with nil parent") } t.status.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String()}) + t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) t.parent.updateStatus(s) } @@ -191,7 +191,7 @@ func (t *taskRole) updateState(s task.State) { } log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") t.state.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String()}) + t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) } From db8f04d0058caccb004bd64405c8a93d4a42b047 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:10:46 +0100 Subject: [PATCH 0636/2352] [common] Add message field to Environment Events --- common/event/environmentevents.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/common/event/environmentevents.go b/common/event/environmentevents.go index 9e2f5b1cf..eee78b554 100644 --- a/common/event/environmentevents.go +++ b/common/event/environmentevents.go @@ -30,23 +30,28 @@ type EnvironmentEvent struct { Run uint32 State string Error error + Message string } -func (r *EnvironmentEvent) GetName() string { - return r.EnvironmentID +func (e *EnvironmentEvent) GetName() string { + return e.EnvironmentID } -func (r *EnvironmentEvent) GetRun() uint32 { - return r.Run +func (e *EnvironmentEvent) GetRun() uint32 { + return e.Run } -func (r *EnvironmentEvent) GetState() string { - return r.State +func (e *EnvironmentEvent) GetState() string { + return e.State } -func (r *EnvironmentEvent) GetError() string { - if r.Error == nil { +func (e *EnvironmentEvent) GetError() string { + if e.Error == nil { return "" } - return r.Error.Error() + return e.Error.Error() +} + +func(e *EnvironmentEvent) GetMessage() string { + return e.Message } \ No newline at end of file From fe6781e9e0b7e69261adb8e911d930391e8ba19e Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:13:10 +0100 Subject: [PATCH 0637/2352] [coconut] Print events and respect verbosity --- coconut/control/control.go | 39 ++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 0fcc23f4e..00ee708d5 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -36,6 +36,7 @@ import ( "sort" "strconv" "strings" + "text/template" "time" "github.com/xlab/treeprint" @@ -87,7 +88,9 @@ func WrapCall(call ControlCall) RunFunc { // redirect stdout to null, the only way to output is stdout := os.Stdout - os.Stdout,_ = os.Open(os.DevNull) + if !auto { + os.Stdout,_ = os.Open(os.DevNull) + } err := call(cxt, rpc, cmd, args, &out) os.Stdout = stdout @@ -228,14 +231,38 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } if evt := rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { - log.WithPrefix("Event"). - WithError(fmt.Errorf(evt.Error)). - Error(evt.EnvironmentId) + if viper.GetBool("verbose") { + log.WithPrefix("Event"). + WithError(fmt.Errorf(evt.Error)). + Error(evt.EnvironmentId) + return nil + } + fmt.Printf("\nEnvironment with id %s failed with error: %s\n", evt.EnvironmentId, evt.Error) return nil } + tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}}{{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") + if err != nil { + return err + } + err = tmpl.Execute(os.Stdout, evt) + if err != nil { + return err + } + } + if viper.GetBool("verbose") { + log.WithPrefix("Event"). + Info(rcv) + } + if evt := rcv.GetTaskEvent(); evt != nil { + tmpl, err := template.New("taskEvents").Parse("Task {{.Taskid}} of class {{.ClassName}} changed{{if .State}} state to {{.State}}{{end}}{{if .Status}} status to {{.Status}}{{end}} on machine {{.Hostname}}\n") + if err != nil { + return err + } + err = tmpl.Execute(os.Stdout, evt) + if err != nil { + return err + } } - log.WithPrefix("Event"). - Info(rcv) } return nil } From e734ce3907a63f8afe3491fafb6a93ceebae4af0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:17:38 +0100 Subject: [PATCH 0638/2352] [core] Log error when client disconnects --- core/server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 5d4cc26aa..f41cb5902 100644 --- a/core/server.go +++ b/core/server.go @@ -669,7 +669,9 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe } err := srv.Send(event) if err != nil { - return err + log.WithError(err). + WithField("subscribe", req.GetId()). + Error(err.Error()) } } } From 248f76c169e35d0d13821f89d617a4be8a832a6a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:18:08 +0100 Subject: [PATCH 0639/2352] [core] Send Environment teardown message --- coconut/protos/o2control.pb.go | 418 ++++++++++++++++++-------------- core/environment/eventStream.go | 5 +- core/environment/manager.go | 1 + core/protos/o2control.pb.go | 418 ++++++++++++++++++-------------- core/protos/o2control.proto | 1 + core/task/manager.go | 4 +- core/task/scheduler.go | 2 +- 7 files changed, 478 insertions(+), 371 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index fc1db7fb1..3194363ff 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -166,6 +166,7 @@ type Ev_EnvironmentEvent struct { State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -232,6 +233,13 @@ func (m *Ev_EnvironmentEvent) GetError() string { return "" } +func (m *Ev_EnvironmentEvent) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + type Ev_TaskEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` @@ -4072,189 +4080,190 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2906 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, - 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, - 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, - 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, - 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, - 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, - 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, - 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, - 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, - 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, - 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, - 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, - 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, - 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, - 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, - 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, - 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, - 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, - 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, - 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, - 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, - 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, - 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, - 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, - 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, - 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, - 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, - 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, - 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, - 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, - 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, - 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, - 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, - 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, - 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, - 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, - 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, - 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, - 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, - 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, - 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, - 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, - 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, - 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, - 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, - 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, - 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, - 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, - 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, - 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, - 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, - 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, - 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, - 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, - 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, - 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, - 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, - 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, - 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, - 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, - 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, - 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, - 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, - 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, - 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, - 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, - 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, - 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, - 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, - 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, - 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, - 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, - 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, - 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, - 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, - 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, - 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, - 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, - 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, - 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, - 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, - 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, - 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, - 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, - 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, - 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, - 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, - 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, - 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, - 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, - 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, - 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, - 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, - 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, - 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, - 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, - 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, - 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, - 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, - 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, - 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, - 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, - 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, - 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, - 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, - 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, - 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, - 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, - 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, - 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, - 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, - 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, - 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, - 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, - 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, - 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, - 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, - 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, - 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, - 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, - 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, - 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, - 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, - 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, - 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, - 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, - 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, - 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, - 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, - 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, - 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, - 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, - 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, - 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, - 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, - 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, - 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, - 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, - 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, - 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, - 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, - 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, - 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, - 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, - 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, - 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, - 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, - 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, - 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, - 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, - 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, - 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, - 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, - 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, - 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, - 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, - 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, - 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, - 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, - 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, - 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, - 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, - 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, - 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, - 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, - 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, - 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, - 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, - 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, - 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, - 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, - 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, - 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, - 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, - 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, - 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, - 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, - 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, - 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, - 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, - 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, + // 2918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, + 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, + 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, + 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, + 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, + 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, + 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, + 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, + 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, + 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, + 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, + 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, + 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, + 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, + 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, + 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, + 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, + 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, + 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, + 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, + 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, + 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, + 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, + 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, + 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, + 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, + 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, + 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, + 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, + 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, + 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, + 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, + 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, + 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, + 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, + 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, + 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, + 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, + 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, + 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, + 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, + 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, + 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, + 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, + 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, + 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, + 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, + 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, + 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, + 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, + 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, + 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, + 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, + 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, + 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, + 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, + 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, + 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, + 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, + 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, + 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, + 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, + 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, + 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, + 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, + 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, + 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, + 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, + 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, + 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, + 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, + 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, + 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, + 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, + 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, + 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, + 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, + 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, + 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, + 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, + 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, + 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, + 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, + 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, + 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, + 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, + 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, + 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, + 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, + 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, + 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, + 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, + 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, + 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, + 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, + 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, + 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, + 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, + 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, + 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, + 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, + 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, + 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, + 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, + 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, + 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, + 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, + 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, + 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, + 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, + 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, + 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, + 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, + 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, + 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, + 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, + 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, + 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, + 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, + 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, + 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, + 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, + 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, + 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, + 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, + 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, + 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, + 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, + 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, + 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, + 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, + 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, + 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, + 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, + 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, + 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, + 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, + 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, + 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, + 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, + 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, + 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, + 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, + 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, + 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, + 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, + 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, + 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, + 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, + 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, + 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, + 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, + 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, + 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, + 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, + 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, + 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, + 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, + 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, + 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, + 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, + 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, + 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, + 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, + 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, + 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, + 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, + 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, + 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, + 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, + 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, + 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, + 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, + 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, + 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, + 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, + 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, + 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, + 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, + 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, + 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, + 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, + 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5235,6 +5244,13 @@ func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x2a + } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -8430,6 +8446,10 @@ func (m *Ev_EnvironmentEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Message) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10095,6 +10115,38 @@ func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index fed9f63a2..ddef68eec 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -54,7 +54,7 @@ func SubscribeToStream(ch chan *pb.Event) Subscription { func (e *eventStream) send(data *pb.Event) { if e.stream != nil { - e.stream <- data + e.stream <- data } } @@ -70,7 +70,7 @@ type eventSub struct { func (s *eventSub) Unsubscribe() { s.once.Do(func() { - s.feed.closeStream() + s.feed.closeStream() close(s.err) }) } @@ -112,6 +112,7 @@ func (s *eventSub) Send(ev event.Event) { State: typedEvent.GetState(), CurrentRunNumber: typedEvent.GetRun(), Error: typedEvent.GetError(), + Message: typedEvent.GetMessage(), }, } data = pb.WrapEvent(&re) diff --git a/core/environment/manager.go b/core/environment/manager.go index d996e9ba0..b59726028 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -234,6 +234,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) return err } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete"}) delete(envs.m, environmentId) env.unsubscribeFromWfState() diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index fc1db7fb1..3194363ff 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -166,6 +166,7 @@ type Ev_EnvironmentEvent struct { State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -232,6 +233,13 @@ func (m *Ev_EnvironmentEvent) GetError() string { return "" } +func (m *Ev_EnvironmentEvent) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + type Ev_TaskEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` @@ -4072,189 +4080,190 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2906 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, - 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, - 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, - 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, - 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, - 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, - 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, - 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, - 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, - 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, - 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, - 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, - 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, - 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, - 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, - 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, - 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, - 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, - 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, - 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, - 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, - 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, - 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, - 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, - 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, - 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, - 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, - 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, - 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, - 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, - 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, - 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, - 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, - 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, - 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, - 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, - 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, - 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, - 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, - 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, - 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, - 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, - 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, - 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, - 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, - 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, - 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, - 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, - 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, - 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, - 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, - 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, - 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, - 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, - 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, - 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, - 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, - 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, - 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, - 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, - 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, - 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, - 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, - 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, - 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, - 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, - 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, - 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, - 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, - 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, - 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, - 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, - 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, - 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, - 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, - 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, - 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, - 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, - 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, - 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, - 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, - 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, - 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, - 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, - 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, - 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, - 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, - 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, - 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, - 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, - 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, - 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, - 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, - 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, - 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, - 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, - 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, - 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, - 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, - 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, - 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, - 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, - 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, - 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, - 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, - 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, - 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, - 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, - 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, - 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, - 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, - 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, - 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, - 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, - 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, - 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, - 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, - 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, - 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, - 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, - 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, - 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, - 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, - 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, - 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, - 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, - 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, - 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, - 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, - 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, - 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, - 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, - 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, - 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, - 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, - 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, - 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, - 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, - 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, - 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, - 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, - 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, - 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, - 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, - 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, - 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, - 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, - 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, - 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, - 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, - 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, - 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, - 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, - 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, - 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, - 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, - 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, - 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, - 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, - 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, - 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, - 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, - 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, - 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, - 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, - 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, - 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, - 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, - 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, - 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, - 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, - 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, - 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, - 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, - 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, - 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, - 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, - 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, - 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, - 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, - 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, + // 2918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, + 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, + 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, + 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, + 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, + 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, + 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, + 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, + 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, + 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, + 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, + 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, + 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, + 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, + 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, + 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, + 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, + 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, + 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, + 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, + 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, + 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, + 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, + 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, + 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, + 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, + 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, + 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, + 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, + 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, + 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, + 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, + 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, + 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, + 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, + 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, + 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, + 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, + 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, + 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, + 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, + 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, + 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, + 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, + 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, + 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, + 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, + 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, + 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, + 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, + 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, + 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, + 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, + 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, + 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, + 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, + 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, + 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, + 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, + 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, + 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, + 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, + 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, + 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, + 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, + 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, + 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, + 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, + 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, + 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, + 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, + 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, + 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, + 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, + 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, + 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, + 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, + 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, + 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, + 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, + 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, + 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, + 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, + 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, + 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, + 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, + 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, + 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, + 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, + 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, + 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, + 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, + 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, + 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, + 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, + 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, + 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, + 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, + 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, + 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, + 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, + 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, + 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, + 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, + 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, + 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, + 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, + 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, + 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, + 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, + 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, + 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, + 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, + 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, + 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, + 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, + 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, + 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, + 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, + 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, + 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, + 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, + 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, + 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, + 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, + 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, + 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, + 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, + 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, + 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, + 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, + 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, + 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, + 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, + 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, + 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, + 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, + 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, + 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, + 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, + 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, + 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, + 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, + 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, + 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, + 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, + 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, + 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, + 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, + 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, + 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, + 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, + 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, + 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, + 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, + 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, + 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, + 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, + 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, + 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, + 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, + 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, + 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, + 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, + 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, + 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, + 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, + 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, + 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, + 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, + 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, + 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, + 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, + 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, + 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, + 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, + 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, + 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, + 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, + 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, + 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, + 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, + 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5235,6 +5244,13 @@ func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x2a + } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -8430,6 +8446,10 @@ func (m *Ev_EnvironmentEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Message) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10095,6 +10115,38 @@ func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 29ee73eb6..9ae3960d6 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -38,6 +38,7 @@ message Ev_EnvironmentEvent { string state = 2; uint32 currentRunNumber = 3; string error = 4; + string message = 5; } message Ev_TaskEvent { diff --git a/core/task/manager.go b/core/task/manager.go index 6744cd4d1..e2868ffc4 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,7 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -656,7 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 858bf0c6d..d01fbba4b 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,7 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) From 3939c2e66e4bf87a40851735b6857282dfd78c06 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 8 Dec 2020 16:30:47 +0100 Subject: [PATCH 0640/2352] [core] Describe structs and remove obsolete comments --- core/server.go | 19 +++++-------------- core/serverutil.go | 35 +++++++++++++++++++---------------- core/task/safeacks.go | 6 ++++++ 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core/server.go b/core/server.go index f41cb5902..d35bf82a8 100644 --- a/core/server.go +++ b/core/server.go @@ -53,7 +53,7 @@ func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ state: state, - conns: newConnectionsInstance(), + streams: newSafeStreamsMap(), }) // Register reflection service on gRPC server. reflection.Register(s) @@ -80,7 +80,7 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { state *globalState - conns Connections + streams SafeStreamsMap } func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { @@ -208,11 +208,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - // select { - // case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): - // default: - // log.Debug("state.PublicEvent channel is full") - // } return r, nil } @@ -379,11 +374,6 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - // select { - // case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): - // default: - // log.Debug("state.PublicEvent channel is full") - // } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } @@ -660,11 +650,12 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() ch := make(chan *pb.Event) - m.conns.add(req.GetId(), ch) + m.streams.add(req.GetId(), ch) for { select { case event, ok := <- ch: if !ok { + m.streams.delete(req.GetId()) return nil } err := srv.Send(event) @@ -679,7 +670,7 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch, ok := m.conns.GetChannel(request.GetId()) + ch, ok := m.streams.GetChannel(request.GetId()) var sub environment.Subscription if ok { sub = environment.SubscribeToStream(ch) diff --git a/core/serverutil.go b/core/serverutil.go index 002e3670f..24030b85a 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -184,33 +184,36 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { return } - -type Connections struct { +// SafeStreamsMap is a safe map where the key is usually a +// subscriptionID received from the grpc call and as a value +// a channel where get events from the environment +// and we stream them to the grpc client. +type SafeStreamsMap struct { mu sync.RWMutex streams map[string]chan *pb.Event } -func (c *Connections) add(id string, ch chan *pb.Event) { - c.mu.Lock() - c.streams[id] = ch - c.mu.Unlock() +func (s *SafeStreamsMap) add(id string, ch chan *pb.Event) { + s.mu.Lock() + s.streams[id] = ch + s.mu.Unlock() } -func (c *Connections) delete(id string) { - c.mu.Lock() - delete(c.streams, id) - c.mu.Unlock() +func (s *SafeStreamsMap) delete(id string) { + s.mu.Lock() + delete(s.streams, id) + s.mu.Unlock() } -func (c *Connections) GetChannel(id string) (ch chan *pb.Event, ok bool) { - c.mu.RLock() - defer c.mu.RUnlock() - ch, ok = c.streams[id] +func (s *SafeStreamsMap) GetChannel(id string) (ch chan *pb.Event, ok bool) { + s.mu.RLock() + defer s.mu.RUnlock() + ch, ok = s.streams[id] return } -func newConnectionsInstance() Connections { - return Connections{ +func newSafeStreamsMap() SafeStreamsMap { + return SafeStreamsMap{ streams: make(map[string]chan *pb.Event), } } \ No newline at end of file diff --git a/core/task/safeacks.go b/core/task/safeacks.go index e458ee7fe..b6ca867c6 100644 --- a/core/task/safeacks.go +++ b/core/task/safeacks.go @@ -28,6 +28,12 @@ import ( "sync" ) +// safeAcks is a thread safe map where key is a string usually a taskID +// and the value is a channel of empty struct. It is being used +// when we want to acknowledge that an action happened to the task +// such as task KILLED. At the moment we utilize +// safeAcks to acknowledge that all the requested tasks +// where killed by mesos (task/manager.go). type safeAcks struct { mu sync.RWMutex acks map[string]chan struct{} From f7d1110f404bf28dab0d7e2e8f3f813e4af9673e Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 11 Dec 2020 10:12:59 +0100 Subject: [PATCH 0641/2352] [core] create channel and add stream in NewAutoEnvironment --- core/server.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/server.go b/core/server.go index d35bf82a8..a8eb1926e 100644 --- a/core/server.go +++ b/core/server.go @@ -649,9 +649,11 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() - ch := make(chan *pb.Event) - m.streams.add(req.GetId(), ch) for { + ch, ok := m.streams.GetChannel(req.GetId()) + if !ok { + continue + } select { case event, ok := <- ch: if !ok { @@ -670,11 +672,9 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch, ok := m.streams.GetChannel(request.GetId()) - var sub environment.Subscription - if ok { - sub = environment.SubscribeToStream(ch) - } + ch := make(chan *pb.Event) + m.streams.add(request.GetId(), ch) + sub := environment.SubscribeToStream(ch) go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) r := &pb.NewAutoEnvironmentReply{} return r, nil From ac0025b069fdad6e52aaa2b3dd4d573ad1a3d794 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 27 Jan 2021 15:31:09 +0100 Subject: [PATCH 0642/2352] [core] Environment unsubscribe once --- core/environment/environment.go | 13 ++++++++----- core/environment/manager.go | 12 +++--------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 7c9e90f6c..df1f2deb3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -52,6 +52,7 @@ var log = logger.New(logrus.StandardLogger(),"env") type Environment struct { Mu sync.RWMutex + once sync.Once Sm *fsm.FSM name string id uid.ID @@ -422,11 +423,13 @@ func (env *Environment) unsubscribeFromWfState() { // Use select to unblock in case the above goroutine // exits due to an ERROR state. If that's the case // we close the channel. - select { - case env.unsubscribe <- struct{}{}: - default: - close(env.unsubscribe) - } + env.once.Do(func() { + select { + case env.unsubscribe <- struct{}{}: + default: + close(env.unsubscribe) + } + }) } func (env *Environment) addSubscription(sub Subscription) { diff --git a/core/environment/manager.go b/core/environment/manager.go index b59726028..c4e48bba3 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -182,8 +182,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }). Warn("environment deployment failed, tasks were cleaned up") - // close state channels and stream - env.closeStream() + // close state channels close(envs.pendingStateChangeCh[env.Id()]) delete(envs.pendingStateChangeCh, env.Id()) @@ -238,7 +237,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error delete(envs.m, environmentId) env.unsubscribeFromWfState() - env.closeStream() return err } @@ -399,7 +397,6 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh envs.mu.Unlock() - env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -452,11 +449,8 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - - if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - return - } + env.subscribeToWfState(envs.taskman) + defer env.unsubscribeFromWfState() // now we have the environment we should transition to start trans := NewStartActivityTransition(envs.taskman) From d9ca5fd1ace5e54ea407c823d4f103e1138c2dd9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 27 Jan 2021 15:50:56 +0100 Subject: [PATCH 0643/2352] [core] Environment fix push to closed channel crash --- core/environment/eventStream.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index ddef68eec..1f45677e5 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -60,6 +60,7 @@ func (e *eventStream) send(data *pb.Event) { func (e *eventStream) closeStream() { close(e.stream) + e.stream = nil } type eventSub struct { From 4bbad2d590f5d6d631e68606c2508f421f8c46c1 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:24:54 +0100 Subject: [PATCH 0644/2352] [coconut] create auto subcommand for environment --- coconut/cmd/environment_autorun.go | 55 +++++++++++++++++++++++++ coconut/control/control.go | 66 ++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) create mode 100644 coconut/cmd/environment_autorun.go diff --git a/coconut/cmd/environment_autorun.go b/coconut/cmd/environment_autorun.go new file mode 100644 index 000000000..b076abcb7 --- /dev/null +++ b/coconut/cmd/environment_autorun.go @@ -0,0 +1,55 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cmd + +import ( + "fmt" + + "github.com/AliceO2Group/Control/coconut/control" + "github.com/AliceO2Group/Control/common/product" + "github.com/spf13/cobra" +) + +// environmentCreateCmd represents the environment list command +var environmentCreateAutoCmd = &cobra.Command{ + Use: "auto", + Aliases: []string{"a",}, + Short: "create auto run environment", + Long: fmt.Sprintf(`The environment create auto command requests from %s the +creation of a new autorun environment. + +The operation may or may not be successful depending on available resources and configuration.`, product.PRETTY_SHORTNAME), + Run: control.WrapCall(control.CreateAutoEnvironment), + +} + +func init() { + environmentCreateCmd.AddCommand(environmentCreateAutoCmd) + + environmentCreateAutoCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") + environmentCreateAutoCmd.MarkFlagRequired("workflow-template") + + environmentCreateAutoCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") +} diff --git a/coconut/control/control.go b/coconut/control/control.go index be4047709..5a64906cf 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -234,6 +234,72 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } +func CreateAutoEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error){ + wfPath, err := cmd.Flags().GetString("workflow-template") + if err != nil { + return + } + if len(wfPath) == 0 { + err = errors.New("cannot create empty environment") + return + } + + var extraVars string + extraVars, err = cmd.Flags().GetString("extra-vars") + if err != nil { + return + } + + extraVars = strings.TrimSpace(extraVars) + if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { + err = errors.New("empty list of extra-vars supplied") + return + } + + extraVarsMap, err := utils.ParseExtraVars(extraVars) + if err != nil { + return + } + + // subscribe to core to receive events + responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + // response is empty we should receive all the info through subscribe call + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + if err != nil { + return + } + for { + rcv, err := responseS.Recv() + if err != nil { + if err == io.EOF { + break + } + log.WithPrefix("sub"). + WithError(err). + Fatal("command finished with error") + } + if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt.Error != "" { + log.WithPrefix("ERROR"). + Info(rcv) + } + if evt.Closestream { + return nil + } + + } + log.WithPrefix("EVENT"). + Info(rcv) + } + + return +} + func stringMapToString(stringMap map[string]string, indent string) string { if len(stringMap) == 0 { return "" From a4dd12a7a13387092c13991fdf8414ba67ffea10 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:26:54 +0100 Subject: [PATCH 0645/2352] [core] update protos --- coconut/protos/o2control.pb.go | 971 ++++++++++++++++++++++----------- core/protos/coreevents.go | 48 +- core/protos/o2control.pb.go | 971 ++++++++++++++++++++++----------- core/protos/o2control.proto | 21 +- 4 files changed, 1315 insertions(+), 696 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 89265c7ac..6a46de750 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} } type Event_MesosHeartbeat struct { @@ -162,9 +162,9 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo type Ev_EnvironmentStateChanged struct { - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -203,25 +203,25 @@ func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEvent() string { +func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { if m != nil { - return m.Event + return m.Environmentid } return "" } -func (m *Ev_EnvironmentStateChanged) GetSource() string { +func (m *Ev_EnvironmentStateChanged) GetState() string { if m != nil { - return m.Source + return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetDestination() string { +func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { if m != nil { - return m.Destination + return m.CurrentRunNumber } - return "" + return 0 } type Ev_TaskStateChanged struct { @@ -539,6 +539,8 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { } type Ev_EnvironmentError struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -577,24 +579,39 @@ func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type Ev_KillTasksMesos struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentError) GetError() string { + if m != nil { + return m.Error + } + return "" } -func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } -func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } -func (*Ev_KillTasksMesos) ProtoMessage() {} -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentError) GetClosestream() bool { + if m != nil { + return m.Closestream + } + return false +} + +type Ev_TasksKilled struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } +func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } +func (*Ev_TasksKilled) ProtoMessage() {} +func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { +func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -604,17 +621,24 @@ func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) +func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TasksKilled.Merge(m, src) } -func (m *Ev_KillTasksMesos) XXX_Size() int { +func (m *Ev_TasksKilled) XXX_Size() int { return m.Size() } -func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) +func (m *Ev_TasksKilled) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) } -var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo +var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo + +func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { + if m != nil { + return m.KilledTasks + } + return nil +} //////////////////////////////////////// // Global status @@ -807,7 +831,7 @@ type Event struct { // *Event_MesosTaskcreated // *Event_EnvironmentDestroyed // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_Taskskilled Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -877,8 +901,8 @@ type Event_EnvironmentDestroyed struct { type Event_EnvironmentError struct { EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` } -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +type Event_Taskskilled struct { + Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` } func (*Event_EnvironmentStateChanged) isEvent_Payload() {} @@ -889,7 +913,7 @@ func (*Event_Tasklaunched) isEvent_Payload() {} func (*Event_MesosTaskcreated) isEvent_Payload() {} func (*Event_EnvironmentDestroyed) isEvent_Payload() {} func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_Taskskilled) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -961,9 +985,9 @@ func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { return nil } -func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (m *Event) GetTaskskilled() *Ev_TasksKilled { + if x, ok := m.GetPayload().(*Event_Taskskilled); ok { + return x.Taskskilled } return nil } @@ -979,7 +1003,7 @@ func (*Event) XXX_OneofWrappers() []interface{} { (*Event_MesosTaskcreated)(nil), (*Event_EnvironmentDestroyed)(nil), (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + (*Event_Taskskilled)(nil), } } @@ -1643,6 +1667,45 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } +func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) +} +func (m *NewAutoEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo + type GetEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1654,7 +1717,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1765,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1757,7 +1820,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1813,7 +1876,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1939,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1938,7 +2001,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1994,7 +2057,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2121,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2126,7 +2189,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2179,7 +2242,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2232,7 +2295,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2277,7 +2340,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2338,7 +2401,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2459,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2502,7 +2565,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2569,7 +2632,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2609,7 +2672,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2719,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,7 +2766,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2751,7 +2814,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2809,7 +2872,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2949,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2954,7 +3017,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3113,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3098,7 +3161,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3156,7 +3219,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3281,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3321,7 +3384,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3434,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3441,7 +3504,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3565,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3548,7 +3611,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3590,7 +3653,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3652,7 +3715,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3707,7 +3770,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3825,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3816,7 +3879,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3863,7 +3926,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3910,7 +3973,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3957,7 +4020,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4004,7 +4067,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4052,7 +4115,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4106,7 +4169,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4152,7 +4215,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{69} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4194,7 +4257,7 @@ func init() { proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4214,6 +4277,7 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") @@ -4269,199 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3069 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, - 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, - 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, - 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, - 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, - 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, - 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, - 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, - 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, - 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, - 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, - 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, - 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, - 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, - 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, - 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, - 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, - 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, - 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, - 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, - 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, - 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, - 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, - 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, - 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, - 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, - 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, - 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, - 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, - 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, - 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, - 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, - 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, - 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, - 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, - 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, - 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, - 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, - 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, - 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, - 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, - 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, - 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, - 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, - 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, - 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, - 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, - 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, - 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, - 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, - 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, - 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, - 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, - 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, - 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, - 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, - 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, - 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, - 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, - 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, - 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, - 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, - 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, - 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, - 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, - 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, - 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, - 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, - 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, - 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, - 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, - 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, - 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, - 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, - 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, - 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, - 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, - 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, - 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, - 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, - 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, - 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, - 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, - 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, - 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, - 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, - 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, - 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, - 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, - 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, - 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, - 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, - 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, - 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, - 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, - 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, - 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, - 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, - 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, - 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, - 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, - 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, - 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, - 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, - 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, - 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, - 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, - 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, - 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, - 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, - 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, - 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, - 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, - 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, - 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, - 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, - 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, - 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, - 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, - 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, - 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, - 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, - 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, - 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, - 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, - 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, - 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, - 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, - 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, - 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, - 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, - 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, - 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, - 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, - 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, - 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, - 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, - 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, - 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, - 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, - 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, - 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, - 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, - 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, - 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, - 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, - 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, - 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, - 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, - 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, - 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, - 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, - 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, - 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, - 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, - 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, - 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, - 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, - 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, - 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, - 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, - 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, - 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, - 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, - 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, - 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, - 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, - 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, - 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, - 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, - 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, - 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, - 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, - 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, - 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, - 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, - 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, - 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, - 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, - 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, - 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, - 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, - 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, - 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, - 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, - 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, - 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, + // 3101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, + 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, + 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, + 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, + 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, + 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, + 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, + 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, + 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, + 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, + 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, + 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, + 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, + 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, + 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, + 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, + 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, + 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, + 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, + 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, + 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, + 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, + 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, + 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, + 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, + 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, + 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, + 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, + 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, + 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, + 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, + 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, + 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, + 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, + 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, + 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, + 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, + 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, + 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, + 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, + 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, + 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, + 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, + 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, + 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, + 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, + 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, + 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, + 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, + 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, + 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, + 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, + 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, + 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, + 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, + 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, + 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, + 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, + 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, + 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, + 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, + 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, + 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, + 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, + 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, + 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, + 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, + 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, + 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, + 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, + 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, + 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, + 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, + 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, + 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, + 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, + 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, + 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, + 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, + 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, + 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, + 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, + 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, + 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, + 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, + 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, + 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, + 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, + 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, + 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, + 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, + 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, + 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, + 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, + 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, + 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, + 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, + 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, + 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, + 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, + 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, + 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, + 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, + 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, + 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, + 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, + 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, + 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, + 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, + 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, + 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, + 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, + 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, + 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, + 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, + 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, + 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, + 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, + 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, + 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, + 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, + 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, + 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, + 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, + 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, + 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, + 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, + 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, + 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, + 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, + 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, + 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, + 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, + 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, + 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, + 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, + 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, + 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, + 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, + 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, + 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, + 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, + 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, + 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, + 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, + 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, + 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, + 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, + 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, + 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, + 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, + 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, + 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, + 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, + 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, + 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, + 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, + 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, + 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, + 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, + 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, + 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, + 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, + 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, + 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, + 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, + 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, + 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, + 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, + 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, + 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, + 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, + 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, + 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, + 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, + 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, + 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, + 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, + 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, + 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, + 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, + 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, + 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, + 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, + 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, + 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, + 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4480,6 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4567,6 +4634,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -4758,6 +4834,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4794,6 +4871,9 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -4928,6 +5008,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -5271,6 +5369,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5406,24 +5508,22 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Destination) > 0 { - i -= len(m.Destination) - copy(dAtA[i:], m.Destination) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if len(m.Source) > 0 { - i -= len(m.Source) - copy(dAtA[i:], m.Source) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x12 } - if len(m.Event) > 0 { - i -= len(m.Event) - copy(dAtA[i:], m.Event) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- dAtA[i] = 0xa } @@ -5696,10 +5796,27 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Closestream { + i-- + if m.Closestream { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { +func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5709,12 +5826,12 @@ func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5723,6 +5840,20 @@ func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -6074,16 +6205,16 @@ func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.KilltasksMesos != nil { + if m.Taskskilled != nil { { - size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6646,6 +6777,33 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8785,17 +8943,16 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { } var l int _ = l - l = len(m.Event) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Source) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Destination) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8921,18 +9078,31 @@ func (m *Ev_EnvironmentError) Size() (n int) { } var l int _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Closestream { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *Ev_KillTasksMesos) Size() (n int) { +func (m *Ev_TasksKilled) Size() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9118,14 +9288,14 @@ func (m *Event_EnvironmentError) Size() (n int) { } return n } -func (m *Event_KilltasksMesos) Size() (n int) { +func (m *Event_Taskskilled) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.KilltasksMesos != nil { - l = m.KilltasksMesos.Size() + if m.Taskskilled != nil { + l = m.Taskskilled.Size() n += 1 + l + sovO2Control(uint64(l)) } return n @@ -9387,6 +9557,18 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *GetEnvironmentRequest) Size() (n int) { if m == nil { return 0 @@ -10449,7 +10631,7 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10477,11 +10659,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Event = string(dAtA[iNdEx:postIndex]) + m.Environmentid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10509,13 +10691,13 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Source = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var stringLen uint64 + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10525,24 +10707,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Destination = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11249,6 +11418,58 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Closestream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11274,7 +11495,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { +func (m *Ev_TasksKilled) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11297,12 +11518,46 @@ func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_KillTasksMesos: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TasksKilled: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) + if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11953,7 +12208,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11980,11 +12235,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_KillTasksMesos{} + v := &Ev_TasksKilled{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_KilltasksMesos{v} + m.Payload = &Event_Taskskilled{v} iNdEx = postIndex default: iNdEx = preIndex @@ -13802,6 +14057,60 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index 7d86359e8..881311b3e 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -25,19 +25,17 @@ package pb import ( - "encoding/json" "time" - "github.com/mesos/mesos-go/api/v1/lib" + "github.com/AliceO2Group/Control/common/utils/uid" ) -func NewEnvironmentStateEvent(cmdb []byte) *Event { +func NewEnvironmentStateEvent(envId uid.ID, state string, rn uint32) *Event { var te Ev_EnvironmentStateChanged var tEvnt Event_EnvironmentStateChanged - err := json.Unmarshal(cmdb, &te) - if err != nil { - return nil - } + te.State = state + te.Environmentid = envId.String() + te.CurrentRunNumber = rn tEvnt.EnvironmentStateChanged=&te return WrapEvent(&tEvnt) @@ -60,9 +58,12 @@ func NewEnvironmentDestroyedEvent(ctrl *CleanupTasksReply, envid string) *Event return WrapEvent(&de) } -func NewEnvironmentErrorEvent() *Event { +func NewEnvironmentErrorEvent(errSt string, close bool) *Event { var ee Event_EnvironmentError - ee.EnvironmentError = &Ev_EnvironmentError{} + ee.EnvironmentError = &Ev_EnvironmentError{ + Error: errSt, + Closestream: close, + } return WrapEvent(&ee) } @@ -75,24 +76,13 @@ func NewEventTaskState(taskid,state string) *Event { return WrapEvent(&stCh) } -func NewEventTaskStatus(status *mesos.TaskStatus) *Event { - - taskId := status.GetTaskID().Value - var statuschanged Ev_TaskStatusChanged +func NewEventTaskStatus(taskid,status string) *Event { var etSt Event_TaskStatusChanged - switch st := status.GetState(); st { - case mesos.TASK_RUNNING: - // wrap to create environment ACTIVE - statuschanged.Taskid = taskId - statuschanged.Status = "ACTIVE" - case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: - statuschanged.Taskid = taskId - statuschanged.Status = "INACTIVE" - case mesos.TASK_FINISHED: - statuschanged.Taskid = taskId - } - etSt.TaskStatusChanged = &statuschanged + etSt.TaskStatusChanged = &Ev_TaskStatusChanged{ + Taskid: taskid, + Status: status, + } return WrapEvent(&etSt) } @@ -118,9 +108,11 @@ func NewEventMesosTaskCreated(resourcesRequest,executorResources string) *Event return WrapEvent(&emtask) } -func NewKillTasksEvent() *Event { - var ke Event_KilltasksMesos - ke.KilltasksMesos = &Ev_KillTasksMesos{} +func NewKillTasksEvent(killed []*ShortTaskInfo) *Event { + var ke Event_Taskskilled + ke.Taskskilled = &Ev_TasksKilled{ + KilledTasks: killed, + } return WrapEvent(&ke) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 89265c7ac..6a46de750 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} } type Event_MesosHeartbeat struct { @@ -162,9 +162,9 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo type Ev_EnvironmentStateChanged struct { - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -203,25 +203,25 @@ func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEvent() string { +func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { if m != nil { - return m.Event + return m.Environmentid } return "" } -func (m *Ev_EnvironmentStateChanged) GetSource() string { +func (m *Ev_EnvironmentStateChanged) GetState() string { if m != nil { - return m.Source + return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetDestination() string { +func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { if m != nil { - return m.Destination + return m.CurrentRunNumber } - return "" + return 0 } type Ev_TaskStateChanged struct { @@ -539,6 +539,8 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { } type Ev_EnvironmentError struct { + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -577,24 +579,39 @@ func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo -type Ev_KillTasksMesos struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (m *Ev_EnvironmentError) GetError() string { + if m != nil { + return m.Error + } + return "" } -func (m *Ev_KillTasksMesos) Reset() { *m = Ev_KillTasksMesos{} } -func (m *Ev_KillTasksMesos) String() string { return proto.CompactTextString(m) } -func (*Ev_KillTasksMesos) ProtoMessage() {} -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentError) GetClosestream() bool { + if m != nil { + return m.Closestream + } + return false +} + +type Ev_TasksKilled struct { + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } +func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } +func (*Ev_TasksKilled) ProtoMessage() {} +func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } -func (m *Ev_KillTasksMesos) XXX_Unmarshal(b []byte) error { +func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_KillTasksMesos.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -604,17 +621,24 @@ func (m *Ev_KillTasksMesos) XXX_Marshal(b []byte, deterministic bool) ([]byte, e return b[:n], nil } } -func (m *Ev_KillTasksMesos) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_KillTasksMesos.Merge(m, src) +func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TasksKilled.Merge(m, src) } -func (m *Ev_KillTasksMesos) XXX_Size() int { +func (m *Ev_TasksKilled) XXX_Size() int { return m.Size() } -func (m *Ev_KillTasksMesos) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_KillTasksMesos.DiscardUnknown(m) +func (m *Ev_TasksKilled) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) } -var xxx_messageInfo_Ev_KillTasksMesos proto.InternalMessageInfo +var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo + +func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { + if m != nil { + return m.KilledTasks + } + return nil +} //////////////////////////////////////// // Global status @@ -807,7 +831,7 @@ type Event struct { // *Event_MesosTaskcreated // *Event_EnvironmentDestroyed // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_Taskskilled Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -877,8 +901,8 @@ type Event_EnvironmentDestroyed struct { type Event_EnvironmentError struct { EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` } -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof" json:"killtasksMesos,omitempty"` +type Event_Taskskilled struct { + Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` } func (*Event_EnvironmentStateChanged) isEvent_Payload() {} @@ -889,7 +913,7 @@ func (*Event_Tasklaunched) isEvent_Payload() {} func (*Event_MesosTaskcreated) isEvent_Payload() {} func (*Event_EnvironmentDestroyed) isEvent_Payload() {} func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_Taskskilled) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -961,9 +985,9 @@ func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { return nil } -func (m *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := m.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (m *Event) GetTaskskilled() *Ev_TasksKilled { + if x, ok := m.GetPayload().(*Event_Taskskilled); ok { + return x.Taskskilled } return nil } @@ -979,7 +1003,7 @@ func (*Event) XXX_OneofWrappers() []interface{} { (*Event_MesosTaskcreated)(nil), (*Event_EnvironmentDestroyed)(nil), (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + (*Event_Taskskilled)(nil), } } @@ -1643,6 +1667,45 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentReply struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } +func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} +} +func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) +} +func (m *NewAutoEnvironmentReply) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo + type GetEnvironmentRequest struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -1654,7 +1717,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1702,7 +1765,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1757,7 +1820,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1813,7 +1876,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1939,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1938,7 +2001,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1994,7 +2057,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2058,7 +2121,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2126,7 +2189,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2179,7 +2242,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2232,7 +2295,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2277,7 +2340,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2338,7 +2401,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2396,7 +2459,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2502,7 +2565,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2569,7 +2632,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2609,7 +2672,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2656,7 +2719,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2703,7 +2766,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2751,7 +2814,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2809,7 +2872,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2886,7 +2949,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2954,7 +3017,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3050,7 +3113,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3098,7 +3161,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3156,7 +3219,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3218,7 +3281,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3321,7 +3384,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3371,7 +3434,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3441,7 +3504,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3502,7 +3565,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3548,7 +3611,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3590,7 +3653,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3652,7 +3715,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3707,7 +3770,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3762,7 +3825,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3816,7 +3879,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3863,7 +3926,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3910,7 +3973,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3957,7 +4020,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{65} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4004,7 +4067,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{66} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4052,7 +4115,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{67} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4106,7 +4169,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{68} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4152,7 +4215,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{69} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4194,7 +4257,7 @@ func init() { proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_KillTasksMesos)(nil), "o2control.Ev_KillTasksMesos") + proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4214,6 +4277,7 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") @@ -4269,199 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3069 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x6f, 0x1b, 0xc7, - 0x91, 0x27, 0x91, 0x12, 0x39, 0x94, 0x28, 0x6a, 0x25, 0x4b, 0x34, 0x63, 0xcb, 0xca, 0xd6, 0x75, - 0x1c, 0x27, 0x55, 0x12, 0x25, 0x68, 0x5c, 0x27, 0x4e, 0x62, 0x49, 0xb4, 0xa4, 0xc6, 0x96, 0xdc, - 0x95, 0x6c, 0xa7, 0x06, 0x0a, 0xf5, 0x44, 0xae, 0xa4, 0x8b, 0x8e, 0x77, 0xcc, 0xdd, 0x91, 0xb6, - 0x1e, 0xfa, 0x56, 0xf4, 0xa5, 0x28, 0x8a, 0xa0, 0x2f, 0x7d, 0x2a, 0x50, 0x14, 0xfd, 0x0f, 0x7d, - 0xe8, 0x0f, 0x28, 0x8a, 0x16, 0xed, 0x4f, 0x28, 0xd2, 0x3f, 0xd0, 0x3f, 0x50, 0xa0, 0xd8, 0xaf, - 0xe3, 0xee, 0x7d, 0x50, 0x72, 0xd3, 0xbc, 0xf4, 0x8d, 0x33, 0x3b, 0x33, 0x3b, 0x3b, 0x33, 0x3b, - 0x33, 0x3b, 0x47, 0x58, 0xe8, 0x05, 0x7e, 0xe4, 0x87, 0x6f, 0xf9, 0xab, 0x6d, 0xdf, 0x8b, 0x02, - 0xdf, 0x5d, 0xe1, 0x08, 0x54, 0x89, 0x11, 0x78, 0x01, 0xe6, 0x5b, 0x03, 0xea, 0x45, 0x07, 0x0f, - 0x69, 0xe8, 0x87, 0x5b, 0xd4, 0x0e, 0xa2, 0x43, 0x6a, 0x47, 0xd8, 0x85, 0x66, 0x6b, 0x70, 0xd0, - 0xf2, 0x06, 0x4e, 0xe0, 0x7b, 0x5d, 0xea, 0x45, 0x7b, 0x91, 0x1d, 0xd1, 0xf5, 0x13, 0xdb, 0x3b, - 0xa6, 0x1d, 0x34, 0x0f, 0x25, 0xca, 0xb8, 0x1a, 0xd6, 0xb2, 0x75, 0xb3, 0x42, 0x04, 0x80, 0x16, - 0x60, 0x22, 0xf4, 0xfb, 0x41, 0x9b, 0x36, 0xc6, 0x38, 0x5a, 0x42, 0x68, 0x19, 0xaa, 0x1d, 0x1a, - 0x46, 0x8e, 0x67, 0x47, 0x8e, 0xef, 0x35, 0xc6, 0xf9, 0xa2, 0x8e, 0xc2, 0xeb, 0x30, 0xd7, 0x1a, - 0x1c, 0xec, 0xdb, 0xe1, 0xa9, 0xb1, 0xcd, 0x02, 0x4c, 0x44, 0x76, 0x78, 0xea, 0x74, 0xe4, 0x3e, - 0x12, 0x62, 0xdb, 0x87, 0x8c, 0x4e, 0xee, 0x23, 0x00, 0x7c, 0x9f, 0x1d, 0x25, 0x16, 0xd2, 0x0f, - 0xcf, 0x93, 0xc2, 0xd4, 0xe5, 0x84, 0xb1, 0xba, 0x1c, 0xc2, 0xaf, 0xc3, 0x8c, 0x94, 0xf3, 0xc0, - 0xee, 0x7b, 0xed, 0x93, 0x7c, 0x11, 0xd8, 0xe1, 0x7a, 0x73, 0xd3, 0x31, 0xfa, 0xf5, 0x80, 0xda, - 0x11, 0xed, 0xa0, 0xeb, 0x30, 0xcd, 0x08, 0x02, 0x2a, 0x0c, 0x10, 0x4a, 0x2e, 0x13, 0x89, 0xde, - 0x84, 0x59, 0xfa, 0x82, 0xb6, 0xfb, 0x91, 0x1f, 0x90, 0x98, 0x52, 0xa8, 0x92, 0x5e, 0xc0, 0x8f, - 0xe1, 0x92, 0xe9, 0x10, 0xb5, 0xd9, 0x87, 0x50, 0xa5, 0x43, 0x2c, 0xdf, 0xaa, 0xba, 0xda, 0x5c, - 0x19, 0xfa, 0x5c, 0xe3, 0xd9, 0xf6, 0x8e, 0x7c, 0xa2, 0x93, 0xe3, 0x9f, 0x5b, 0xb0, 0x68, 0xca, - 0xdd, 0xa0, 0x61, 0x14, 0xf8, 0x67, 0xb4, 0x83, 0xbe, 0x0f, 0xb3, 0x6d, 0x97, 0xda, 0x5e, 0xbf, - 0xc7, 0x0e, 0x17, 0x12, 0xda, 0x73, 0xcf, 0xa4, 0xfc, 0x2b, 0x9a, 0xfc, 0xf5, 0x24, 0x0d, 0x49, - 0xb3, 0x31, 0x93, 0x68, 0xdb, 0x3a, 0x1d, 0x79, 0x50, 0x13, 0x89, 0x2f, 0x71, 0x7b, 0x6a, 0xca, - 0xb4, 0x82, 0xc0, 0x0f, 0xf0, 0x1c, 0xcc, 0xb6, 0x06, 0x07, 0x9f, 0x3a, 0xae, 0xcb, 0x25, 0x72, - 0x7b, 0xe3, 0x19, 0x98, 0x16, 0x7e, 0x26, 0xf4, 0x8b, 0x3e, 0x0d, 0x23, 0x7c, 0x08, 0x55, 0x85, - 0x60, 0x3b, 0xc6, 0x41, 0x62, 0x69, 0x41, 0x82, 0xee, 0xc2, 0xb4, 0x70, 0xf3, 0xe3, 0x5e, 0xc7, - 0x8e, 0xb8, 0xc1, 0xc7, 0x6f, 0x56, 0x57, 0x17, 0xb5, 0xf3, 0xec, 0x69, 0xeb, 0xc4, 0xa4, 0xc6, - 0x7f, 0xb5, 0x60, 0x4a, 0x5f, 0x47, 0xef, 0x42, 0xc9, 0xa5, 0x03, 0xea, 0xf2, 0x5d, 0x6a, 0xab, - 0x57, 0x73, 0xe4, 0xac, 0x3c, 0x60, 0x44, 0x44, 0xd0, 0xa2, 0x6d, 0xa8, 0x75, 0x8d, 0xeb, 0xc6, - 0xad, 0x51, 0x5d, 0xbd, 0xa6, 0x7b, 0x2d, 0xe3, 0x56, 0x6e, 0x15, 0x48, 0x82, 0x11, 0xbf, 0x07, - 0x25, 0x2e, 0x1a, 0x55, 0xa0, 0xb4, 0xd1, 0x5a, 0x7b, 0xbc, 0x59, 0x2f, 0xa0, 0x32, 0x14, 0xb7, - 0x77, 0xee, 0xef, 0xd6, 0x2d, 0x54, 0x85, 0xc9, 0xa7, 0xf7, 0xc8, 0xce, 0xf6, 0xce, 0x66, 0x7d, - 0x8c, 0x51, 0xb4, 0x08, 0xd9, 0x25, 0xf5, 0xf1, 0xb5, 0x49, 0x28, 0x71, 0xf9, 0xf8, 0x67, 0x13, - 0xf2, 0x17, 0xba, 0x02, 0x95, 0xc8, 0xe9, 0xd2, 0x30, 0xb2, 0xbb, 0x3d, 0x69, 0xb2, 0x21, 0x02, - 0xd9, 0xb0, 0x48, 0xb3, 0x73, 0x81, 0x54, 0xfd, 0xdb, 0x86, 0xea, 0x79, 0x89, 0x63, 0xab, 0x40, - 0xf2, 0xe4, 0x20, 0x02, 0x88, 0xa6, 0xa2, 0x9b, 0x27, 0x8b, 0xea, 0xea, 0x72, 0xae, 0x74, 0x49, - 0xb7, 0x55, 0x20, 0x19, 0xdc, 0xe8, 0x01, 0xd4, 0xa3, 0x44, 0x52, 0x69, 0x14, 0xb9, 0xc4, 0x25, - 0x53, 0x62, 0x32, 0xf5, 0x6c, 0x15, 0x48, 0x8a, 0x13, 0xed, 0xc2, 0x6c, 0x94, 0xcc, 0x2e, 0x8d, - 0x52, 0x86, 0xe7, 0xd2, 0x49, 0x68, 0xab, 0x40, 0xd2, 0xbc, 0xe8, 0x13, 0x98, 0x62, 0x48, 0x57, - 0xa6, 0x99, 0xc6, 0x44, 0xfa, 0xee, 0x9a, 0x89, 0x68, 0xab, 0x40, 0x0c, 0x0e, 0x76, 0xc0, 0xae, - 0xca, 0x3e, 0x6d, 0x69, 0xb2, 0xc9, 0xac, 0x03, 0x26, 0x73, 0x14, 0x3b, 0x60, 0x92, 0x13, 0x7d, - 0x06, 0xf3, 0x34, 0x23, 0x11, 0x34, 0xca, 0x5c, 0x22, 0xce, 0x75, 0x42, 0x4c, 0xb9, 0x55, 0x20, - 0x99, 0x12, 0x98, 0x9e, 0x34, 0x71, 0xab, 0x1b, 0x95, 0x2c, 0x3d, 0x93, 0x77, 0x9f, 0xe9, 0x99, - 0xe4, 0x44, 0xf7, 0xa1, 0x76, 0xea, 0xb8, 0x6e, 0x14, 0x27, 0x83, 0x06, 0xa4, 0xb2, 0x52, 0x2a, - 0x61, 0xb0, 0xcb, 0x63, 0x72, 0xad, 0x55, 0x60, 0xf2, 0x91, 0x7d, 0xe6, 0xfa, 0x76, 0x07, 0x23, - 0xa8, 0xef, 0xf5, 0x0f, 0xc3, 0x76, 0xe0, 0x1c, 0x52, 0x95, 0x50, 0x2e, 0xc3, 0xe2, 0x26, 0x8d, - 0xee, 0x07, 0x76, 0x97, 0x3e, 0xf7, 0x83, 0x53, 0x9e, 0x3c, 0xe5, 0xd2, 0xef, 0x2c, 0x98, 0x7c, - 0x42, 0x83, 0xd0, 0xf1, 0x3d, 0x96, 0x68, 0xba, 0xf6, 0xe7, 0x7e, 0xc0, 0x6f, 0x4d, 0x89, 0x08, - 0x80, 0x63, 0x1d, 0xcf, 0x0f, 0xf8, 0xfd, 0x60, 0x58, 0x06, 0x30, 0x6c, 0xcf, 0x8e, 0xda, 0x27, - 0x3c, 0xae, 0x4b, 0x44, 0x00, 0x0c, 0x7b, 0xd8, 0x77, 0x5c, 0x11, 0x9b, 0x15, 0x22, 0x00, 0x56, - 0x36, 0x7b, 0x81, 0xdf, 0xe9, 0xb7, 0xa3, 0x1d, 0xbb, 0x4b, 0x79, 0xa0, 0x55, 0x88, 0x8e, 0x42, - 0x4b, 0x00, 0x03, 0xa1, 0xc4, 0x5e, 0x14, 0xf0, 0xe8, 0xa9, 0x10, 0x0d, 0x83, 0x7f, 0x39, 0x06, - 0x97, 0xd2, 0x27, 0x60, 0xc9, 0x71, 0x19, 0xaa, 0x47, 0x31, 0x56, 0x55, 0x35, 0x1d, 0xc5, 0xab, - 0xd3, 0xd0, 0xee, 0xe1, 0xba, 0xdf, 0xf7, 0x22, 0x79, 0x96, 0xf4, 0x02, 0xd3, 0x84, 0xdb, 0x55, - 0x90, 0x89, 0xc3, 0x69, 0x98, 0x61, 0x32, 0x2e, 0xea, 0xc9, 0x78, 0x09, 0xe0, 0xc4, 0x0f, 0x95, - 0xf0, 0x92, 0xe0, 0x1a, 0x62, 0x10, 0x86, 0x29, 0xc7, 0x0b, 0x23, 0xdb, 0x6b, 0x53, 0x6e, 0x02, - 0x71, 0x42, 0x03, 0x87, 0xde, 0x84, 0x49, 0x79, 0x62, 0x19, 0xf8, 0x48, 0x0b, 0x02, 0xe9, 0x22, - 0xa2, 0x48, 0x58, 0x6d, 0xdf, 0xa7, 0x76, 0xd0, 0xf1, 0x9f, 0x7b, 0xd2, 0x95, 0xac, 0xb6, 0x07, - 0xd4, 0x0e, 0x7d, 0x4f, 0xd5, 0x76, 0x01, 0xb1, 0xfa, 0x32, 0x24, 0xed, 0xb9, 0x67, 0xb8, 0x01, - 0x0b, 0x9b, 0x34, 0xd2, 0x02, 0x34, 0xae, 0x3c, 0x2f, 0x60, 0x3e, 0xb5, 0x72, 0x31, 0x2b, 0x7f, - 0x04, 0x53, 0xba, 0x31, 0x65, 0x35, 0x1a, 0x55, 0xbd, 0x0d, 0x7a, 0xfc, 0xe7, 0x22, 0xcc, 0x24, - 0x28, 0x50, 0x0d, 0xc6, 0xe2, 0x46, 0x65, 0xcc, 0xe1, 0x71, 0x24, 0x2f, 0xf8, 0xd3, 0x13, 0xea, - 0xc9, 0xc2, 0xab, 0xa3, 0x86, 0xde, 0x19, 0xd7, 0xbd, 0xb3, 0x02, 0x25, 0xee, 0xc1, 0x46, 0x91, - 0x2b, 0xd5, 0xd0, 0x4b, 0xdb, 0x89, 0x1f, 0x44, 0xec, 0x6a, 0x71, 0x95, 0x04, 0x19, 0x6a, 0x42, - 0x39, 0xf0, 0xfd, 0x88, 0xf8, 0xae, 0x0a, 0xd6, 0x18, 0x46, 0xb7, 0xa0, 0xde, 0xee, 0x07, 0x01, - 0xf5, 0x22, 0xd2, 0xf7, 0x76, 0xfa, 0xdd, 0x43, 0x2a, 0xe2, 0x75, 0x9a, 0xa4, 0xf0, 0x68, 0x03, - 0xca, 0x1d, 0x7a, 0x64, 0xf7, 0xdd, 0x28, 0x6c, 0x4c, 0xf2, 0xad, 0x6f, 0xe6, 0xdb, 0x63, 0x65, - 0x43, 0x92, 0xb6, 0xbc, 0x28, 0x38, 0x23, 0x31, 0x27, 0xba, 0x0d, 0xc5, 0x81, 0x1d, 0x84, 0x8d, - 0x32, 0x97, 0x70, 0x7d, 0x84, 0x84, 0x27, 0x76, 0x20, 0xb9, 0x39, 0x07, 0xdb, 0xbf, 0x1f, 0xd2, - 0x80, 0xa1, 0x1b, 0x95, 0x73, 0xf7, 0x7f, 0x2c, 0x49, 0xe5, 0xfe, 0x8a, 0xb3, 0xf9, 0x01, 0x4c, - 0x1b, 0xaa, 0xa1, 0x3a, 0x8c, 0x9f, 0xd2, 0x33, 0xe9, 0x17, 0xf6, 0x93, 0x99, 0x7d, 0x60, 0xbb, - 0xfd, 0xb8, 0x8d, 0xe5, 0xc0, 0x9d, 0xb1, 0xdb, 0x56, 0xf3, 0x7d, 0xa8, 0xc4, 0x32, 0x5f, 0x8a, - 0xf1, 0x03, 0x98, 0x36, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x47, 0x0b, 0x2e, 0xed, 0xd0, 0xe7, 0xda, - 0x09, 0xd5, 0x1d, 0xb9, 0x05, 0x75, 0x16, 0xb0, 0x47, 0xae, 0xff, 0x7c, 0x9f, 0x76, 0x7b, 0xee, - 0xb0, 0xad, 0x4a, 0xe1, 0xd1, 0x47, 0xd2, 0xf0, 0x22, 0x94, 0x6f, 0x69, 0xa6, 0xcb, 0x94, 0x9d, - 0x34, 0xff, 0x7f, 0x7d, 0x76, 0xbc, 0x07, 0x73, 0xc9, 0x1d, 0xd8, 0x25, 0xfc, 0x7a, 0xfd, 0xf1, - 0x6b, 0x3c, 0x83, 0x66, 0x98, 0x24, 0x71, 0xcb, 0xf0, 0x4f, 0x2d, 0x98, 0x4b, 0x52, 0x7e, 0xed, - 0xed, 0xd1, 0x5b, 0x50, 0x56, 0x06, 0x96, 0x8d, 0xd6, 0x9c, 0xc6, 0xca, 0xae, 0x16, 0xe7, 0x89, - 0x89, 0xf0, 0xdf, 0x2c, 0xb8, 0xbc, 0x2e, 0x96, 0xcf, 0x57, 0x1a, 0x7d, 0x0c, 0xc5, 0xe8, 0xac, - 0x27, 0x6c, 0x59, 0x5b, 0x7d, 0x43, 0x6f, 0xea, 0xf3, 0x64, 0xac, 0xec, 0xf6, 0x18, 0x0b, 0xe1, - 0x8c, 0xd8, 0x86, 0x09, 0x01, 0xb3, 0xa6, 0x73, 0x67, 0x77, 0xf7, 0x51, 0xbd, 0x80, 0x10, 0xd4, - 0xf6, 0xf6, 0xef, 0x91, 0xfd, 0x83, 0x7b, 0xeb, 0xfb, 0xdb, 0x4f, 0xb6, 0xf7, 0x7f, 0x58, 0xb7, - 0xd0, 0x2c, 0x4c, 0xef, 0xed, 0xef, 0x3e, 0x1a, 0xa2, 0xc6, 0xd0, 0x34, 0x54, 0xd6, 0x77, 0x77, - 0xee, 0x6f, 0x6f, 0x3e, 0x26, 0xad, 0xfa, 0x38, 0xeb, 0x4e, 0x49, 0x6b, 0xaf, 0xb5, 0x5f, 0x2f, - 0xa2, 0x29, 0x28, 0x6f, 0xee, 0x1e, 0x88, 0x5e, 0xb5, 0x84, 0x4f, 0x61, 0x31, 0x4b, 0x19, 0x66, - 0xdb, 0xe4, 0x71, 0x32, 0xdf, 0x85, 0x99, 0xb9, 0x67, 0x3c, 0x3b, 0xf7, 0xe0, 0x5f, 0x59, 0xd0, - 0x78, 0xe8, 0x77, 0x9c, 0xa3, 0xb3, 0x0b, 0x59, 0x0f, 0xfc, 0x1e, 0x0d, 0xf8, 0x13, 0x56, 0xc5, - 0xfb, 0xb5, 0x6c, 0xcf, 0xee, 0x2a, 0x3a, 0xa2, 0xb1, 0xa0, 0x1b, 0x50, 0x0b, 0x68, 0xdb, 0xf7, - 0x8e, 0x9c, 0xe3, 0x7e, 0x40, 0xef, 0xb9, 0x2e, 0xd7, 0xab, 0x4c, 0x12, 0x58, 0xfc, 0x5b, 0x0b, - 0xe6, 0xb3, 0x84, 0xa1, 0x3b, 0xd2, 0x7f, 0xe2, 0xf1, 0x71, 0xe3, 0x9c, 0xbd, 0x0d, 0xd7, 0x89, - 0x74, 0xed, 0x8a, 0xc2, 0x3a, 0xa6, 0xd2, 0xb5, 0x80, 0xf1, 0x3b, 0x19, 0x6e, 0x9d, 0x81, 0x2a, - 0x69, 0x3d, 0xdc, 0x7d, 0xd2, 0x3a, 0x20, 0xbb, 0x0f, 0x98, 0xc7, 0xa6, 0xa0, 0x7c, 0x6f, 0x63, - 0x43, 0x40, 0x45, 0xf6, 0x90, 0x5c, 0xc8, 0xb0, 0x1c, 0x73, 0xd3, 0xa7, 0x50, 0x3f, 0xb2, 0x1d, - 0x97, 0x76, 0x76, 0x87, 0xd6, 0xb2, 0x2e, 0x66, 0xad, 0x14, 0xa3, 0x74, 0xc2, 0x58, 0xda, 0xe7, - 0x7a, 0xed, 0xc2, 0x5f, 0x5a, 0x70, 0x59, 0x76, 0x9f, 0x17, 0x70, 0xe4, 0x15, 0xa8, 0x9c, 0x52, - 0x2a, 0x9e, 0xab, 0x5c, 0x74, 0x99, 0x0c, 0x11, 0xe8, 0x6d, 0x98, 0xb3, 0x5d, 0xd7, 0x7f, 0xbe, - 0xed, 0x91, 0xbe, 0xe7, 0x39, 0xde, 0xf1, 0x5e, 0xbc, 0x5f, 0x99, 0x64, 0x2d, 0x31, 0x9d, 0x8e, - 0xfc, 0xa0, 0x2d, 0xba, 0x9d, 0x32, 0x11, 0x00, 0xa6, 0xb0, 0x98, 0xa5, 0x12, 0xb3, 0xd0, 0xff, - 0xf0, 0xa5, 0x8d, 0xff, 0x62, 0xc1, 0xb5, 0x3d, 0x23, 0x11, 0x3d, 0x0a, 0x58, 0xcc, 0x45, 0x0e, - 0x0d, 0xf3, 0x0c, 0xf0, 0x0c, 0xa0, 0x17, 0x13, 0xc9, 0x48, 0xbe, 0xa3, 0xd7, 0xfb, 0xd1, 0xf2, - 0x56, 0x86, 0x18, 0x91, 0xc9, 0x35, 0x69, 0xcd, 0xbb, 0x30, 0x93, 0x58, 0x7e, 0xa9, 0xac, 0x7e, - 0x0d, 0xae, 0xe6, 0xef, 0xce, 0xce, 0x1b, 0xc2, 0xb5, 0xcd, 0x97, 0x3c, 0x6e, 0x03, 0x26, 0xbf, - 0xe8, 0xd3, 0x40, 0x9d, 0xb5, 0x42, 0x14, 0xc8, 0x6e, 0x24, 0x7d, 0xd1, 0x76, 0xfb, 0x1d, 0xba, - 0xe9, 0xfa, 0x87, 0xb6, 0x1b, 0xaa, 0x1b, 0x69, 0x62, 0xf1, 0x1f, 0x2c, 0xb8, 0xba, 0x39, 0x4a, - 0x2d, 0xf4, 0x99, 0x61, 0x52, 0x11, 0xee, 0xb7, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x26, 0x0d, 0xfa, - 0x9b, 0x31, 0x98, 0x36, 0xfa, 0x37, 0x84, 0xa0, 0xe8, 0xb1, 0x2c, 0x20, 0xd8, 0xf9, 0x6f, 0xd6, - 0x15, 0xbb, 0x7e, 0xfb, 0x54, 0xbe, 0xef, 0xcb, 0x44, 0x42, 0x6a, 0x12, 0xb6, 0xdd, 0x91, 0xf7, - 0x4d, 0x42, 0xda, 0x30, 0xad, 0xa8, 0x0f, 0xd3, 0x86, 0xd7, 0xb3, 0xa4, 0xa7, 0xe4, 0x2b, 0x50, - 0x69, 0xbb, 0x76, 0x18, 0x6a, 0x5d, 0xfd, 0x10, 0x81, 0x5a, 0x50, 0xeb, 0xd0, 0x9e, 0xeb, 0x9f, - 0xa9, 0x9a, 0x28, 0x3b, 0x7b, 0x7d, 0xb8, 0xc2, 0x94, 0xdf, 0x30, 0x88, 0x48, 0x82, 0x89, 0x19, - 0xa5, 0xe7, 0x88, 0xc7, 0x6b, 0x85, 0xb0, 0x9f, 0xe8, 0x3a, 0x4c, 0x87, 0xb6, 0xd7, 0x39, 0xf4, - 0x5f, 0xec, 0x45, 0x1d, 0xbf, 0x1f, 0xf1, 0x27, 0x68, 0x85, 0x98, 0x48, 0x56, 0xc9, 0x51, 0x5a, - 0x3c, 0xcb, 0x97, 0xec, 0x69, 0xa2, 0x59, 0x2a, 0x86, 0x59, 0x40, 0xd9, 0xc7, 0x8c, 0x50, 0x65, - 0x26, 0x05, 0xb2, 0x15, 0xff, 0xe8, 0x88, 0x06, 0xb1, 0xc1, 0x14, 0xc8, 0x1e, 0x3f, 0x6a, 0xca, - 0xb7, 0xad, 0x5e, 0x7e, 0x1a, 0x06, 0xcf, 0xc2, 0xcc, 0x26, 0x8d, 0xe4, 0xc5, 0x16, 0xef, 0x8c, - 0x8f, 0x61, 0x7a, 0x88, 0x62, 0x41, 0x16, 0xb7, 0xe8, 0xd6, 0x85, 0x5a, 0x74, 0x7c, 0x13, 0x6a, - 0x52, 0x80, 0xf6, 0xfa, 0x91, 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0xf7, 0x61, 0x2a, 0xa6, 0x64, 0x3b, - 0xbd, 0x06, 0x45, 0xb6, 0x22, 0x93, 0xd2, 0x5c, 0xc2, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x5b, 0x30, - 0xcd, 0xc7, 0x0c, 0xcc, 0x9b, 0xb9, 0xd1, 0xc5, 0x9e, 0x24, 0x82, 0xfd, 0xa1, 0xdf, 0xa1, 0xf1, - 0x93, 0x64, 0x88, 0xc2, 0x3f, 0x81, 0xea, 0xba, 0xdf, 0xed, 0xda, 0x5e, 0x47, 0xf9, 0x92, 0x7a, - 0x03, 0x7e, 0xcc, 0x0a, 0x61, 0x3f, 0x79, 0x60, 0x9d, 0x50, 0xd7, 0x95, 0xf1, 0x29, 0x80, 0x61, - 0xd8, 0x8f, 0x6b, 0x61, 0xcf, 0xc2, 0xcd, 0x0e, 0x8e, 0xfb, 0xe2, 0x89, 0x55, 0xe4, 0x32, 0x86, - 0x08, 0xa6, 0x20, 0xeb, 0xda, 0x65, 0x84, 0xf2, 0xdf, 0xf8, 0x21, 0x54, 0xd7, 0x4f, 0x6c, 0xcf, - 0xa3, 0x6e, 0xee, 0x19, 0x90, 0xd6, 0x3b, 0x55, 0x64, 0x4d, 0xe5, 0xd6, 0x0c, 0x8e, 0x69, 0x34, - 0xbc, 0x1d, 0x0c, 0xc2, 0xff, 0x1a, 0x87, 0x72, 0x7c, 0xdd, 0xbe, 0x0b, 0x95, 0x90, 0x39, 0x87, - 0x47, 0xb6, 0xb0, 0x67, 0xbe, 0xe3, 0x86, 0xa4, 0x8c, 0xaf, 0xad, 0xac, 0x2a, 0x9b, 0xc1, 0x46, - 0xc2, 0x0f, 0xb1, 0xd5, 0xc9, 0x90, 0x14, 0x7d, 0x02, 0x33, 0x8e, 0x77, 0xe8, 0xf7, 0xbd, 0x8e, - 0x3c, 0x12, 0x4b, 0x6a, 0x2c, 0x5c, 0x16, 0xf4, 0xd2, 0x32, 0x3c, 0x2d, 0x49, 0x92, 0xa3, 0x35, - 0xa8, 0xfb, 0xfd, 0xc8, 0x14, 0x51, 0x1c, 0x29, 0x22, 0x45, 0x8f, 0x6e, 0x33, 0x97, 0xc7, 0x0e, - 0x95, 0x63, 0x33, 0x83, 0x7d, 0xb8, 0x4a, 0x74, 0x52, 0x76, 0xf1, 0x58, 0x64, 0x3d, 0xb2, 0xa3, - 0x13, 0x99, 0x2b, 0x62, 0x98, 0x7f, 0x88, 0xf0, 0x06, 0xdb, 0x62, 0xe8, 0x55, 0x21, 0x02, 0x40, - 0xeb, 0x46, 0xee, 0x15, 0x6f, 0xb8, 0x6f, 0x65, 0x84, 0xec, 0x37, 0x99, 0x66, 0xdf, 0x82, 0x39, - 0xb3, 0x5c, 0x8b, 0xfb, 0xd6, 0x80, 0x49, 0x71, 0xc3, 0x42, 0x19, 0xcc, 0x0a, 0xc4, 0xbf, 0xb0, - 0x60, 0x36, 0x55, 0xe0, 0xd1, 0x1d, 0xa8, 0x9e, 0x3a, 0xae, 0x4b, 0x3b, 0xfb, 0x17, 0xba, 0xe7, - 0x3a, 0x31, 0xfa, 0x10, 0xa6, 0x02, 0xd1, 0x96, 0xa8, 0xce, 0x66, 0x34, 0xb3, 0x41, 0x8d, 0xd7, - 0x79, 0xfe, 0x61, 0x4f, 0x8c, 0x58, 0xf9, 0xd8, 0xda, 0x96, 0x6e, 0xed, 0x26, 0x94, 0x7b, 0x76, - 0x74, 0xb2, 0xd7, 0xa3, 0x6d, 0xd5, 0x48, 0x2a, 0x18, 0x7f, 0x59, 0x84, 0xb2, 0x7a, 0xa5, 0xe4, - 0xd5, 0x99, 0xac, 0x8f, 0x30, 0x39, 0x23, 0x89, 0x26, 0x94, 0x8f, 0xfa, 0xae, 0xcb, 0x43, 0x41, - 0x64, 0xcc, 0x18, 0xd6, 0x2d, 0x5b, 0x32, 0x2c, 0x8b, 0x5e, 0x87, 0x12, 0xeb, 0x6c, 0xc3, 0xc6, - 0x04, 0x37, 0x40, 0xe6, 0x0b, 0x4a, 0x50, 0xa0, 0xbb, 0xa9, 0xd9, 0xc3, 0xab, 0x19, 0xd4, 0xb9, - 0x43, 0x87, 0x77, 0x8c, 0xa1, 0xc3, 0xd5, 0x2c, 0xd6, 0xe4, 0xb4, 0xe1, 0x6e, 0x6a, 0xda, 0x90, - 0xb9, 0xe3, 0xff, 0xd1, 0x98, 0xe1, 0x0e, 0xaf, 0x62, 0x32, 0xb0, 0x58, 0x8c, 0xc7, 0xfe, 0xb1, - 0xce, 0xf3, 0x0f, 0xfe, 0xbd, 0x05, 0xaf, 0x6c, 0xd2, 0xe8, 0x69, 0x62, 0xe8, 0x10, 0x47, 0xe8, - 0x32, 0x54, 0x03, 0xda, 0xf3, 0x1f, 0xd9, 0x51, 0x44, 0x03, 0x35, 0xd1, 0xd3, 0x51, 0xe8, 0x26, - 0xcc, 0x04, 0x74, 0xe0, 0x84, 0x8e, 0xef, 0x29, 0x2a, 0xa1, 0x61, 0x12, 0xcd, 0x64, 0xd9, 0xae, - 0xbb, 0x16, 0xd8, 0x5e, 0xfb, 0x84, 0xaa, 0x46, 0x50, 0x47, 0xf1, 0xb2, 0xef, 0xba, 0xfb, 0xf6, - 0x71, 0x28, 0x3b, 0x7d, 0x05, 0xe2, 0x43, 0x98, 0x4f, 0xea, 0xa8, 0xae, 0x00, 0x53, 0x46, 0x5d, - 0x01, 0xf6, 0x9b, 0xe7, 0x37, 0x35, 0x54, 0x91, 0xf7, 0x47, 0xc1, 0xfc, 0x91, 0x26, 0xd5, 0x92, - 0x37, 0x21, 0x86, 0xf1, 0xe7, 0x70, 0x39, 0xdb, 0x14, 0xcc, 0xa6, 0x0f, 0x61, 0x36, 0x39, 0x99, - 0xc9, 0x7a, 0x74, 0x65, 0x29, 0x49, 0xd2, 0x9c, 0x18, 0x41, 0xfd, 0x81, 0x13, 0xb2, 0xd7, 0x8a, - 0xaf, 0x7d, 0x6f, 0x2b, 0x33, 0x38, 0xf7, 0x6a, 0x37, 0x60, 0x52, 0x5e, 0x0c, 0x59, 0xa3, 0x15, - 0xc8, 0x7c, 0x20, 0x7f, 0x12, 0xf3, 0x70, 0x49, 0x34, 0xfe, 0x02, 0x6a, 0xda, 0xbe, 0x2a, 0x58, - 0x18, 0x94, 0x15, 0x2c, 0x52, 0x1b, 0x22, 0x28, 0xd0, 0x7b, 0x70, 0xe9, 0x98, 0xf7, 0xeb, 0x1b, - 0x89, 0xcd, 0x84, 0x95, 0xb3, 0x17, 0xf1, 0x0e, 0xd4, 0xee, 0x75, 0x3a, 0x4c, 0x96, 0x0a, 0xaa, - 0xac, 0xc3, 0x65, 0x1c, 0x61, 0x2c, 0xfb, 0x08, 0x04, 0xa6, 0x62, 0x79, 0xa2, 0x67, 0x43, 0x1e, - 0x7d, 0x9e, 0x54, 0x49, 0xc8, 0xce, 0x58, 0x61, 0xbb, 0x3b, 0xaa, 0xe2, 0x57, 0x08, 0xff, 0x8d, - 0x5f, 0x87, 0x59, 0x42, 0xbb, 0xfe, 0x80, 0xea, 0x6a, 0xce, 0x43, 0xc9, 0xf1, 0x3a, 0xf4, 0x85, - 0xfa, 0x0e, 0xc1, 0x01, 0xfc, 0x3d, 0x98, 0xd1, 0x49, 0x99, 0x06, 0x37, 0xa0, 0xa6, 0xef, 0x13, - 0x87, 0x63, 0x02, 0x8b, 0xdf, 0x80, 0x39, 0x42, 0x8f, 0x02, 0x1a, 0x9e, 0xe8, 0x7e, 0xcf, 0xd9, - 0xe7, 0x3b, 0x70, 0x69, 0x8f, 0x46, 0x1a, 0xfb, 0x68, 0xf2, 0xbb, 0xfc, 0x91, 0xba, 0x99, 0xe5, - 0x01, 0xc5, 0xa8, 0xc7, 0xbe, 0x95, 0x88, 0xfd, 0x1f, 0xf0, 0x57, 0x21, 0xdb, 0x26, 0x87, 0x39, - 0x73, 0x57, 0x43, 0xe4, 0x58, 0x42, 0xe4, 0x3b, 0xf0, 0x4a, 0x9e, 0x48, 0x66, 0x34, 0xe5, 0x06, - 0x4b, 0x73, 0xc3, 0x24, 0x94, 0x5a, 0xdd, 0x5e, 0x74, 0xb6, 0xfa, 0xef, 0x69, 0x98, 0x94, 0x43, - 0x2a, 0xb4, 0x0e, 0xd5, 0xfd, 0xc0, 0x6e, 0xcb, 0x4f, 0x7d, 0xa8, 0x91, 0xfa, 0x22, 0x2c, 0x55, - 0x6c, 0x2e, 0x64, 0xac, 0xb0, 0x07, 0x6d, 0xe1, 0x6d, 0x0b, 0x3d, 0x83, 0x7a, 0xf2, 0xc3, 0x0d, - 0xc2, 0xe6, 0xeb, 0x31, 0xeb, 0xbb, 0x54, 0x73, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0xd6, 0xa0, 0xac, - 0x3e, 0x6c, 0x20, 0x7d, 0x10, 0x99, 0xf8, 0x30, 0xd2, 0x6c, 0x64, 0xae, 0x09, 0x19, 0x4f, 0x79, - 0x73, 0xa0, 0x7f, 0xf1, 0x40, 0xaf, 0xe6, 0x3e, 0x6e, 0xe3, 0x13, 0x5f, 0x1b, 0x45, 0x22, 0x04, - 0xef, 0x43, 0xcd, 0x1c, 0xe2, 0xa2, 0xe5, 0xf3, 0x26, 0xc8, 0xcd, 0xa5, 0x11, 0x14, 0xb1, 0x54, - 0x73, 0x3f, 0xb4, 0x9c, 0xab, 0x4a, 0x96, 0xd4, 0x8c, 0xc1, 0x2e, 0x2e, 0xa0, 0x1f, 0x03, 0x4a, - 0x4f, 0x26, 0xd1, 0xf5, 0x8b, 0x4c, 0x51, 0x9b, 0xf8, 0x1c, 0x2a, 0xb1, 0xc3, 0x8f, 0x60, 0x36, - 0x35, 0x53, 0x43, 0x7a, 0x27, 0x9b, 0x37, 0xab, 0x6c, 0xbe, 0x3a, 0x9a, 0x28, 0x3e, 0x40, 0x7a, - 0x22, 0x65, 0x1c, 0x20, 0x77, 0x86, 0x66, 0x1c, 0x20, 0x67, 0xac, 0x25, 0x62, 0x4d, 0xbd, 0x58, - 0x8d, 0x58, 0x4b, 0xbc, 0x6c, 0x8d, 0x58, 0x33, 0x9e, 0xb8, 0xb8, 0x80, 0x3e, 0x86, 0x49, 0x89, - 0x42, 0x97, 0xd3, 0x64, 0x4a, 0xc2, 0x62, 0xd6, 0x92, 0x10, 0xb0, 0x03, 0x53, 0x7a, 0x63, 0x8d, - 0x96, 0x72, 0x47, 0x6a, 0x42, 0xd4, 0xc8, 0x91, 0x5b, 0x7c, 0x28, 0xde, 0xc0, 0x24, 0x0f, 0xa5, - 0xb7, 0xcb, 0xc9, 0x43, 0x0d, 0x3b, 0x1e, 0x5c, 0x40, 0x47, 0xfc, 0x93, 0x61, 0xaa, 0x78, 0xa3, - 0x1b, 0x26, 0x4f, 0x5e, 0xa3, 0xd3, 0xbc, 0x7e, 0x2e, 0x9d, 0xd8, 0xa7, 0x05, 0x95, 0xb8, 0x80, - 0xa2, 0x57, 0x34, 0xa6, 0x64, 0x39, 0x6f, 0x5e, 0xce, 0x5e, 0x8c, 0x7d, 0x20, 0x8b, 0x98, 0xe1, - 0x03, 0xb3, 0x50, 0x1a, 0x3e, 0xd0, 0x6b, 0x1e, 0x2e, 0xa0, 0x2d, 0x80, 0x61, 0x19, 0x42, 0x57, - 0x8c, 0xaa, 0x9d, 0x28, 0x64, 0xcd, 0x66, 0xce, 0xaa, 0xb2, 0xfe, 0x94, 0x5e, 0x95, 0x0c, 0x6f, - 0x66, 0x94, 0xab, 0x66, 0x5d, 0x9f, 0x31, 0xb3, 0x6c, 0x8d, 0x0b, 0xe8, 0x3e, 0xd4, 0xcc, 0x62, - 0x65, 0xe4, 0x83, 0xcc, 0x3a, 0x96, 0x29, 0xe7, 0x19, 0x34, 0xf2, 0xaa, 0x18, 0xba, 0x65, 0x4a, - 0x1c, 0x55, 0xea, 0x32, 0x65, 0xbb, 0xb0, 0x90, 0x5d, 0x8f, 0xd0, 0x4d, 0x53, 0x72, 0x7e, 0x15, - 0x6c, 0xde, 0xb8, 0x00, 0xa5, 0xb0, 0xea, 0x87, 0x50, 0x89, 0xff, 0xff, 0x60, 0xc4, 0x49, 0xf2, - 0x5f, 0x11, 0xa6, 0xae, 0x03, 0xea, 0x45, 0x6f, 0x5b, 0x6b, 0xb7, 0xff, 0xf4, 0xd5, 0x92, 0xf5, - 0xf7, 0xaf, 0x96, 0xac, 0x7f, 0x7c, 0xb5, 0x64, 0xfd, 0xfa, 0x9f, 0x4b, 0x05, 0xc0, 0xed, 0x93, - 0x95, 0x36, 0x0d, 0xbc, 0x15, 0xdb, 0x75, 0xda, 0x74, 0xc5, 0x5f, 0x5d, 0x51, 0x3c, 0x41, 0xaf, - 0x1d, 0xd2, 0x60, 0x40, 0x83, 0x67, 0x63, 0xbd, 0xc3, 0xc3, 0x09, 0xfe, 0x8f, 0xc4, 0x77, 0xff, - 0x13, 0x00, 0x00, 0xff, 0xff, 0x44, 0x61, 0xcd, 0x31, 0xab, 0x28, 0x00, 0x00, + // 3101 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, + 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, + 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, + 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, + 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, + 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, + 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, + 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, + 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, + 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, + 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, + 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, + 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, + 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, + 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, + 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, + 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, + 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, + 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, + 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, + 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, + 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, + 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, + 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, + 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, + 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, + 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, + 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, + 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, + 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, + 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, + 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, + 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, + 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, + 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, + 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, + 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, + 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, + 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, + 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, + 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, + 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, + 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, + 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, + 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, + 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, + 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, + 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, + 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, + 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, + 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, + 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, + 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, + 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, + 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, + 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, + 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, + 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, + 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, + 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, + 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, + 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, + 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, + 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, + 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, + 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, + 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, + 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, + 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, + 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, + 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, + 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, + 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, + 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, + 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, + 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, + 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, + 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, + 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, + 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, + 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, + 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, + 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, + 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, + 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, + 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, + 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, + 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, + 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, + 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, + 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, + 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, + 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, + 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, + 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, + 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, + 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, + 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, + 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, + 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, + 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, + 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, + 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, + 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, + 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, + 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, + 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, + 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, + 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, + 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, + 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, + 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, + 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, + 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, + 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, + 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, + 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, + 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, + 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, + 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, + 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, + 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, + 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, + 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, + 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, + 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, + 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, + 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, + 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, + 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, + 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, + 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, + 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, + 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, + 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, + 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, + 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, + 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, + 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, + 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, + 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, + 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, + 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, + 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, + 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, + 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, + 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, + 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, + 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, + 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, + 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, + 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, + 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, + 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, + 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, + 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, + 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, + 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, + 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, + 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, + 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, + 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, + 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, + 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, + 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, + 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, + 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, + 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, + 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, + 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, + 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, + 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, + 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, + 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, + 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, + 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, + 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, + 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, + 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, + 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, + 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, + 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, + 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, + 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, + 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, + 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, + 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, + 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4480,6 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4567,6 +4634,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -4758,6 +4834,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4794,6 +4871,9 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -4928,6 +5008,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -5271,6 +5369,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5406,24 +5508,22 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Destination) > 0 { - i -= len(m.Destination) - copy(dAtA[i:], m.Destination) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Destination))) + if m.CurrentRunNumber != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x18 } - if len(m.Source) > 0 { - i -= len(m.Source) - copy(dAtA[i:], m.Source) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Source))) + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- dAtA[i] = 0x12 } - if len(m.Event) > 0 { - i -= len(m.Event) - copy(dAtA[i:], m.Event) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Event))) + if len(m.Environmentid) > 0 { + i -= len(m.Environmentid) + copy(dAtA[i:], m.Environmentid) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) i-- dAtA[i] = 0xa } @@ -5696,10 +5796,27 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.Closestream { + i-- + if m.Closestream { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { +func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5709,12 +5826,12 @@ func (m *Ev_KillTasksMesos) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_KillTasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5723,6 +5840,20 @@ func (m *Ev_KillTasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.KilledTasks) > 0 { + for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -6074,16 +6205,16 @@ func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *Event_KilltasksMesos) MarshalTo(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event_KilltasksMesos) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) - if m.KilltasksMesos != nil { + if m.Taskskilled != nil { { - size, err := m.KilltasksMesos.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -6646,6 +6777,33 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil +} + func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -8785,17 +8943,16 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { } var l int _ = l - l = len(m.Event) + l = len(m.Environmentid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Source) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Destination) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) + if m.CurrentRunNumber != 0 { + n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) @@ -8921,18 +9078,31 @@ func (m *Ev_EnvironmentError) Size() (n int) { } var l int _ = l + l = len(m.Error) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.Closestream { + n += 2 + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } return n } -func (m *Ev_KillTasksMesos) Size() (n int) { +func (m *Ev_TasksKilled) Size() (n int) { if m == nil { return 0 } var l int _ = l + if len(m.KilledTasks) > 0 { + for _, e := range m.KilledTasks { + l = e.Size() + n += 1 + l + sovO2Control(uint64(l)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9118,14 +9288,14 @@ func (m *Event_EnvironmentError) Size() (n int) { } return n } -func (m *Event_KilltasksMesos) Size() (n int) { +func (m *Event_Taskskilled) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.KilltasksMesos != nil { - l = m.KilltasksMesos.Size() + if m.Taskskilled != nil { + l = m.Taskskilled.Size() n += 1 + l + sovO2Control(uint64(l)) } return n @@ -9387,6 +9557,18 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentReply) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *GetEnvironmentRequest) Size() (n int) { if m == nil { return 0 @@ -10449,7 +10631,7 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Event", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10477,11 +10659,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Event = string(dAtA[iNdEx:postIndex]) + m.Environmentid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Source", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -10509,13 +10691,13 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Source = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Destination", wireType) + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - var stringLen uint64 + m.CurrentRunNumber = 0 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -10525,24 +10707,11 @@ func (m *Ev_EnvironmentStateChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + m.CurrentRunNumber |= uint32(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Destination = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11249,6 +11418,58 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Error = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Closestream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11274,7 +11495,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { +func (m *Ev_TasksKilled) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11297,12 +11518,46 @@ func (m *Ev_KillTasksMesos) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_KillTasksMesos: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TasksKilled: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_KillTasksMesos: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) + if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11953,7 +12208,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilltasksMesos", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11980,11 +12235,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_KillTasksMesos{} + v := &Ev_TasksKilled{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_KilltasksMesos{v} + m.Payload = &Event_Taskskilled{v} iNdEx = postIndex default: iNdEx = preIndex @@ -13802,6 +14057,60 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentReply: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *GetEnvironmentRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 0f7df49de..e1d81afed 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -34,9 +34,9 @@ message Event_MesosHeartbeat { } message Ev_EnvironmentStateChanged { - string event = 1; - string source = 2; - string destination = 3; + string environmentid = 1; + string state = 2; + uint32 currentRunNumber = 3; } message Ev_TaskStateChanged { @@ -68,9 +68,12 @@ message Ev_EnvironmentDestroyed { } message Ev_EnvironmentError { + string error = 1; + bool closestream = 2; } -message Ev_KillTasksMesos { +message Ev_TasksKilled { + repeated ShortTaskInfo killedTasks = 1; } ////////////////////////////////////////////////////// @@ -82,6 +85,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} + rpc NewAutoEnvironment (NewEnvironmentRequest) returns (NewAutoEnvironmentReply) {} rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} @@ -142,11 +146,13 @@ message Event { Ev_MesosTaskCreated mesosTaskcreated = 7; Ev_EnvironmentDestroyed environmentDestroyed = 8; Ev_EnvironmentError environmentError = 9; - Ev_KillTasksMesos killtasksMesos =10; + Ev_TasksKilled taskskilled = 10; } } -message SubscribeRequest{} +message SubscribeRequest{ + +} //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -202,6 +208,9 @@ message NewEnvironmentRequest { message NewEnvironmentReply { EnvironmentInfo environment = 1; } +message NewAutoEnvironmentReply { + +} message GetEnvironmentRequest { string id = 1; From 25baf60f7401521accc1f1aab37c0959150a20b9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:39:49 +0100 Subject: [PATCH 0646/2352] [core] environment autorun feature --- core/environment/manager.go | 64 ++++++++++++++++++++ core/environment/transition_reset.go | 1 + core/environment/transition_startactivity.go | 1 + core/environment/transition_stopactivity.go | 1 + core/server.go | 11 +++- 5 files changed, 76 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 8f402e8cf..e1a9ac69d 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -362,3 +362,67 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } } + +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string) { + id, err := envs.CreateEnvironment(workflowPath, userVars) + + // report error through events during the procces + // this stays here as a reminder that we should remove it + if err != nil { + // environment error should report + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + env, err := envs.Environment(id) + + // now we have the environment we should transition to start + trans := NewStartActivityTransition(envs.taskman) + if trans == nil { + // environment error should report + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + err = env.TryTransition(trans) + // this stays here as a reminder that we should remove it + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + + for { + envState := env.CurrentState() + switch envState { + case "CONFIGURED": + // RUN finished so we can reset and delete the environment + err := env.TryTransition(NewResetTransition(envs.taskman)) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + err = envs.TeardownEnvironment(id, false) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + tasksForEnv := env.Workflow().GetTasks().GetTaskIds() + _, _, err = envs.taskman.KillTasks(tasksForEnv) + if err != nil { + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + return + } + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("") + return + case "ERROR": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment ERROR state") + return + case "MIXED": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment MIXED state") + return + case "": + envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment not found") + return + } + } +} \ No newline at end of file diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index b09883d92..a3669303c 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -54,6 +54,7 @@ func (t ResetTransition) do(env *Environment) (err error) { task.STANDBY.String(), nil, env.Id(), + env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index ee684b4c0..19c5d52d7 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -72,6 +72,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { task.RUNNING.String(), args, env.Id(), + runNumber, ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bebd6d2e5..bf9797817 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -59,6 +59,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.CONFIGURED.String(), nil, env.Id(), + env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/server.go b/core/server.go index d8eb18b00..4cf944fa2 100644 --- a/core/server.go +++ b/core/server.go @@ -661,14 +661,21 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe for { select { case event := <- m.state.PublicEvent: - m.state.RLock() err := srv.Send(event) if err != nil { return err } - m.state.RUnlock() case <-ctx.Done(): return ctx.Err() } } } + +func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { + m.logMethod() + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars()) + r := &pb.NewAutoEnvironmentReply{ + } + + return r, nil +} \ No newline at end of file From a8e8cdee439869b3d946b214b769b0cf89813173 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:44:48 +0100 Subject: [PATCH 0647/2352] [core] redifine Events --- core/globalstate.go | 2 +- core/task/coreevent.go | 39 +++++++++++++++++++++++++++------ core/task/manager.go | 38 ++++++++++++++++++++++++++++++++ core/task/scheduler.go | 15 ------------- core/task/taskop/messagetype.go | 5 ++++- 5 files changed, 75 insertions(+), 24 deletions(-) diff --git a/core/globalstate.go b/core/globalstate.go index 1d5622f7f..ef461a39e 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -54,7 +54,7 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - publicEventCh := make(chan *pb.Event) + publicEventCh := make(chan *pb.Event,100) state := &globalState{ PublicEvent: publicEventCh, diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 1ed862aef..fd0d55bed 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -41,7 +41,7 @@ type TaskmanMessage struct { // killTasksMessage } -func NewTaskmanMessage(mt taskop.MessageType) (t *TaskmanMessage) { +func newTaskmanMessage(mt taskop.MessageType) (t *TaskmanMessage) { t = &TaskmanMessage{ MessageType: mt, } @@ -56,6 +56,8 @@ type environmentMessage struct { envId uid.ID tasks Tasks descriptors Descriptors + runNumber uint32 + errSt string } func (em *environmentMessage) GetEnvironmentId() (envid uid.ID) { @@ -79,8 +81,22 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } +func (em *environmentMessage) GetRunNumber() uint32 { + if em == nil { + return 0 + } + return em.runNumber +} + +func (em *environmentMessage) GetError() string { + if em == nil { + return "" + } + return em.errSt +} + func NewEnvironmentMessage(mt taskop.MessageType, envId uid.ID, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { - t = NewTaskmanMessage(mt) + t = newTaskmanMessage(mt) t.environmentMessage = environmentMessage{ envId: envId, tasks: tasks, @@ -124,8 +140,8 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envId uid.ID) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TransitionTasks) +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID, rn uint32) (t *TaskmanMessage) { + t = newTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, event: transitionEvent, @@ -134,7 +150,8 @@ func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg } t.environmentMessage = environmentMessage{ tasks: tasks, - envId: envId, + envId: envID, + runNumber: rn, } return t } @@ -146,7 +163,7 @@ type updateTaskMessage struct { } func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TaskStatusMessage) + t = newTaskmanMessage(taskop.TaskStatusMessage) t.updateTaskMessage = updateTaskMessage{ status: mesosStatus, } @@ -154,7 +171,7 @@ func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { } func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { - t = NewTaskmanMessage(taskop.TaskStateMessage) + t = newTaskmanMessage(taskop.TaskStateMessage) t.updateTaskMessage = updateTaskMessage{ taskId: taskid, state: state, @@ -162,6 +179,14 @@ func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { return t } +func NewEnvironmentErrorMessage(err string) (t *TaskmanMessage) { + t = newTaskmanMessage(taskop.Error) + t.environmentMessage = environmentMessage{ + errSt: err, + } + return t +} + // type killTasksMessage struct { // taskIds []string // } diff --git a/core/task/manager.go b/core/task/manager.go index 6800a5dbe..f93cd8929 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -640,6 +640,11 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks[taskId]; ok { val <- struct{}{} + select { + case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): + default: + log.Debug("state.PublicEvent channel is full") + } } return @@ -660,6 +665,11 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } + select { + case m.publicEventCh <- pb.NewEventTaskStatus(taskId, taskPtr.status.String()): + default: + log.Debug("state.PublicEvent channel is full") + } } // Kill all tasks outside an environment (all unlocked tasks) @@ -703,6 +713,10 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err <- m.ackKilledTasks[id] close(m.ackKilledTasks[id]) delete(m.ackKilledTasks, id) + select { + case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): + default: + log.Debug("state.PublicEvent channel is full") } return } @@ -786,11 +800,21 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + select { + case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber()): + default: + log.Debug("state.PublicEvent channel is full") + } }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) + select { + case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber()): + default: + log.Debug("state.PublicEvent channel is full") + } }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -834,8 +858,22 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go m.updateTaskState(tm.taskId, tm.state) // case event.KillTasks: // m.killTasks(tm.GetTaskIds()) + select { + case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): + default: + log.Debug("state.PublicEvent channel is full") + } case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + case taskop.Error: + // error reported from environment need to inform stream + // FIXME: A better way to publish errors to stream that + // are not from the taskman. + select { + case m.publicEventCh <- pb.NewEnvironmentErrorEvent(tm.GetError(), true): + default: + log.Debug("state.PublicEvent channel is full") + } } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 8ecf10463..623afce44 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -355,11 +355,6 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // servent should be inside taskman and eventually // all this handling. state.servent.ProcessResponse(&res, sender) - select { - case state.taskman.publicEventCh <- cpb.NewEventTaskState(res.TaskId, res.CurrentState): - default: - log.Debug("state.PublicEvent channel is full") - } }() return default: @@ -910,11 +905,6 @@ func (state *schedulerState) killTask(ctx context.Context, receiver controlcomma killCall := calls.Kill(receiver.TaskId.GetValue(), receiver.AgentId.GetValue()) err = calls.CallNoData(ctx, state.cli, killCall) - select { - case state.taskman.publicEventCh <- cpb.NewKillTasksEvent(): - default: - log.Debug("state.PublicEvent channel is full") - } return } @@ -939,11 +929,6 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), }). Debug("outgoing MESSAGE call") - select { - case state.taskman.publicEventCh <- cpb.NewEnvironmentStateEvent(bytes): - default: - log.Debug("state.PublicEvent channel is full") - } return err } diff --git a/core/task/taskop/messagetype.go b/core/task/taskop/messagetype.go index d29c9d0b1..cf8548e49 100644 --- a/core/task/taskop/messagetype.go +++ b/core/task/taskop/messagetype.go @@ -40,10 +40,11 @@ const( KillTasks TaskStatusMessage TaskStateMessage + Error ) func (mt MessageType) String() string { - return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage"}[mt] + return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage","Error"}[mt] } func (mt *MessageType) UnmarshalJSON(b []byte) error { @@ -68,6 +69,8 @@ func (mt *MessageType) UnmarshalText(b []byte) error { *mt = TaskStatusMessage case "TaskStateMessage": *mt = TaskStateMessage + case "Error": + *mt = Error } return nil From 2360b3f39d1b94c3074e0a0529682604ebd410a9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 12 Nov 2020 12:46:04 +0100 Subject: [PATCH 0648/2352] [core] taskman utilize safeAcks --- core/task/manager.go | 19 ++++--- core/task/taskutil.go | 112 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+), 10 deletions(-) create mode 100644 core/task/taskutil.go diff --git a/core/task/manager.go b/core/task/manager.go index f93cd8929..da06915b3 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -80,7 +80,7 @@ type Manager struct { schedulerState *schedulerState publicEventCh chan<- *pb.Event internalEventCh chan<- event.Event - ackKilledTasks map[string]chan struct{} + ackKilledTasks *safeAcks } func NewManager(shutdown func(), @@ -125,7 +125,7 @@ func NewManager(shutdown func(), taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - taskman.ackKilledTasks = make(map[string]chan struct{}) + taskman.ackKilledTasks = newAcks() schedulerState.setupCli() @@ -498,7 +498,6 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { if len(strings.TrimSpace(errText)) != 0 { return errors.New(response.Err().Error()) } - // FIXME: improve error handling ↑ return nil @@ -638,7 +637,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") - if val, ok := m.ackKilledTasks[taskId]; ok { + if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} select { case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): @@ -705,14 +704,16 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } for _, id := range toKill.GetTaskIds() { - m.ackKilledTasks[id] = make(chan struct{}) + m.ackKilledTasks.addAckChannel(id) } killed, running, err = m.doKillTasks(toKill) for _, id := range killed.GetTaskIds() { - <- m.ackKilledTasks[id] - close(m.ackKilledTasks[id]) - delete(m.ackKilledTasks, id) + ack,_ := m.ackKilledTasks.getValue(id) + <- ack + close(ack) + m.ackKilledTasks.deleteKey(id) + } select { case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): default: @@ -856,8 +857,6 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - // case event.KillTasks: - // m.killTasks(tm.GetTaskIds()) select { case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): default: diff --git a/core/task/taskutil.go b/core/task/taskutil.go new file mode 100644 index 000000000..6782fc134 --- /dev/null +++ b/core/task/taskutil.go @@ -0,0 +1,112 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "sync" + "github.com/AliceO2Group/Control/core/protos" +) + +func taskToShortTaskInfo(t *Task) (sti *pb.ShortTaskInfo) { + if t == nil { + return + } + sti = &pb.ShortTaskInfo{ + Name: t.GetName(), + Locked: t.IsLocked(), + TaskId: t.GetTaskId(), + ClassName: t.GetClassName(), + DeploymentInfo: &pb.TaskDeploymentInfo{ + Hostname: t.GetHostname(), + AgentId: t.GetAgentId(), + OfferId: t.GetOfferId(), + ExecutorId: t.GetExecutorId(), + }, + Pid: t.GetTaskPID(), + } + return +} + +func tasksToShortTaskInfos(tasks []*Task) (stis []*pb.ShortTaskInfo) { + if tasks == nil { + return + } + stis = make([]*pb.ShortTaskInfo, len(tasks)) + for i, t := range tasks { + shortTaskInfo := taskToShortTaskInfo(t) + stis[i] = shortTaskInfo + } + return +} + +type safeAcks struct { + mu sync.RWMutex + acks map[string]chan struct{} +} + +func (a *safeAcks) getMap() map[string]chan struct{} { + a.mu.RLock() + defer a.mu.RUnlock() + + return a.acks +} + +func (a *safeAcks) deleteKey(key string) { + a.mu.Lock() + defer a.mu.Unlock() + + delete(a.acks, key) +} + +func (a *safeAcks) contains(key string) bool { + a.mu.RLock() + defer a.mu.RUnlock() + + _, ok := a.acks[key] + + return ok +} + + +func (a *safeAcks) addAckChannel(key string) { + a.mu.Lock() + defer a.mu.Unlock() + + a.acks[key] = make(chan struct{}) +} + +func (a *safeAcks) getValue(key string) (ch chan struct{}, ok bool) { + a.mu.Lock() + defer a.mu.Unlock() + + ch, ok = a.acks[key] + return +} + +func newAcks() *safeAcks { + return &safeAcks{ + acks: make(map[string]chan struct{}), + } +} \ No newline at end of file From eb99f522893e008e63772503004e18f4d4ba630d Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 11:44:34 +0100 Subject: [PATCH 0649/2352] [coconut] use --auto flag instead of subcommand --- coconut/cmd/environment_autorun.go | 55 --------------- coconut/cmd/environment_create.go | 1 + coconut/control/control.go | 107 +++++++++++------------------ 3 files changed, 41 insertions(+), 122 deletions(-) delete mode 100644 coconut/cmd/environment_autorun.go diff --git a/coconut/cmd/environment_autorun.go b/coconut/cmd/environment_autorun.go deleted file mode 100644 index b076abcb7..000000000 --- a/coconut/cmd/environment_autorun.go +++ /dev/null @@ -1,55 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "fmt" - - "github.com/AliceO2Group/Control/coconut/control" - "github.com/AliceO2Group/Control/common/product" - "github.com/spf13/cobra" -) - -// environmentCreateCmd represents the environment list command -var environmentCreateAutoCmd = &cobra.Command{ - Use: "auto", - Aliases: []string{"a",}, - Short: "create auto run environment", - Long: fmt.Sprintf(`The environment create auto command requests from %s the -creation of a new autorun environment. - -The operation may or may not be successful depending on available resources and configuration.`, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.CreateAutoEnvironment), - -} - -func init() { - environmentCreateCmd.AddCommand(environmentCreateAutoCmd) - - environmentCreateAutoCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") - environmentCreateAutoCmd.MarkFlagRequired("workflow-template") - - environmentCreateAutoCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") -} diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 858d53648..e029b119d 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -61,6 +61,7 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") + environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 5a64906cf..a0e41e979 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -72,7 +72,7 @@ func WrapCall(call ControlCall) RunFunc { Debug("initializing gRPC client") s := spinner.New(spinner.CharSets[11], SPINNER_TICK) - if !viper.GetBool("nospinner") { + if !viper.GetBool("nospinner") && !cmd.Flags().Changed("auto") { _ = s.Color("yellow") s.Suffix = " working..." s.Start() @@ -200,6 +200,45 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } + if cmd.Flags().Changed("auto") { + // subscribe to core to receive events + responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + // response is empty we should receive all the info through subscribe call + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + if err != nil { + return err + } + for { + rcv, err := responseS.Recv() + if err != nil { + if err == io.EOF { + break + } + log.WithPrefix("sub"). + WithError(err). + Fatal("command finished with error") + } + if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt.Error != "" { + log.WithPrefix("ERROR"). + Info(rcv) + } + if evt.Closestream { + return nil + } + + } + log.WithPrefix("EVENT"). + Info(rcv) + } + return nil + } + // TODO: add support for setting visibility here OCTRL-178 // TODO: add support for acquiring bot config here OCTRL-177 @@ -234,72 +273,6 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } -func CreateAutoEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error){ - wfPath, err := cmd.Flags().GetString("workflow-template") - if err != nil { - return - } - if len(wfPath) == 0 { - err = errors.New("cannot create empty environment") - return - } - - var extraVars string - extraVars, err = cmd.Flags().GetString("extra-vars") - if err != nil { - return - } - - extraVars = strings.TrimSpace(extraVars) - if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { - err = errors.New("empty list of extra-vars supplied") - return - } - - extraVarsMap, err := utils.ParseExtraVars(extraVars) - if err != nil { - return - } - - // subscribe to core to receive events - responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithPrefix("Subscribe"). - WithError(err). - Fatal("command finished with error") - } - // response is empty we should receive all the info through subscribe call - _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) - if err != nil { - return - } - for { - rcv, err := responseS.Recv() - if err != nil { - if err == io.EOF { - break - } - log.WithPrefix("sub"). - WithError(err). - Fatal("command finished with error") - } - if evt:= rcv.GetEnvironmentError(); evt != nil{ - if evt.Error != "" { - log.WithPrefix("ERROR"). - Info(rcv) - } - if evt.Closestream { - return nil - } - - } - log.WithPrefix("EVENT"). - Info(rcv) - } - - return -} - func stringMapToString(stringMap map[string]string, indent string) string { if len(stringMap) == 0 { return "" From 8919dcfa6c4ad2c5378fab071661ab4800faad63 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 11:45:17 +0100 Subject: [PATCH 0650/2352] [coconut] fix log output --- coconut/control/control.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index a0e41e979..7831b9057 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -219,21 +219,22 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if err == io.EOF { break } - log.WithPrefix("sub"). + log.WithPrefix("Subscribe"). WithError(err). Fatal("command finished with error") } if evt:= rcv.GetEnvironmentError(); evt != nil{ if evt.Error != "" { - log.WithPrefix("ERROR"). - Info(rcv) + log.WithPrefix("Event"). + WithError(err). + Error("environment error") } if evt.Closestream { return nil } } - log.WithPrefix("EVENT"). + log.WithPrefix("Event"). Info(rcv) } return nil From 0fefa855dc978843fd92466c15abd17152e24be9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 17:29:11 +0100 Subject: [PATCH 0651/2352] [coconut] make AutoEnvironment return a stream --- coconut/control/control.go | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 7831b9057..104ea414a 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -201,15 +201,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } if cmd.Flags().Changed("auto") { - // subscribe to core to receive events - responseS, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithPrefix("Subscribe"). - WithError(err). - Fatal("command finished with error") - } - // response is empty we should receive all the info through subscribe call - _, err = rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + // new auto environment should be a stream of events + responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) if err != nil { return err } @@ -229,7 +222,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Error("environment error") } - if evt.Closestream { + if evt.CloseStream { return nil } From d058448d4898d93aaa2628ad5b653c39058f364b Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 18:01:37 +0100 Subject: [PATCH 0652/2352] [core] NewAutoEnvironment should be a stream --- coconut/protos/o2control.pb.go | 489 +++++++++++++++++---------------- core/protos/coreevents.go | 2 +- core/protos/o2control.pb.go | 489 +++++++++++++++++---------------- core/protos/o2control.proto | 4 +- 4 files changed, 519 insertions(+), 465 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6a46de750..9cfa28fee 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -540,7 +540,7 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { type Ev_EnvironmentError struct { Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` + CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -586,9 +586,9 @@ func (m *Ev_EnvironmentError) GetError() string { return "" } -func (m *Ev_EnvironmentError) GetClosestream() bool { +func (m *Ev_EnvironmentError) GetCloseStream() bool { if m != nil { - return m.Closestream + return m.CloseStream } return false } @@ -4333,201 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3101 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, - 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, - 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, - 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, - 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, - 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, - 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, - 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, - 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, - 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, - 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, - 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, - 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, - 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, - 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, - 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, - 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, - 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, - 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, - 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, - 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, - 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, - 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, - 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, - 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, - 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, - 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, - 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, - 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, - 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, - 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, - 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, - 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, - 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, - 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, - 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, - 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, - 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, - 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, - 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, - 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, - 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, - 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, - 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, - 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, - 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, - 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, - 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, - 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, - 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, - 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, - 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, - 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, - 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, - 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, - 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, - 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, - 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, - 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, - 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, - 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, - 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, - 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, - 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, - 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, - 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, - 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, - 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, - 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, - 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, - 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, - 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, - 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, - 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, - 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, - 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, - 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, - 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, - 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, - 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, - 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, - 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, - 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, - 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, - 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, - 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, - 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, - 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, - 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, - 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, - 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, - 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, - 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, - 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, - 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, - 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, - 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, - 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, - 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, - 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, - 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, - 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, - 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, - 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, - 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, - 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, - 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, - 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, - 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, - 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, - 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, - 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, - 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, - 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, - 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, - 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, - 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, - 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, - 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, - 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, - 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, - 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, - 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, - 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, - 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, - 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, - 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, - 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, - 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, - 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, - 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, - 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, - 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, - 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, - 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, - 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, - 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, - 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, - 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, - 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, - 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, - 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, - 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, - 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, - 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, - 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, - 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, - 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, - 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, - 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, - 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, - 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, - 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, - 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, - 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, - 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, - 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, - 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, - 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, - 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, - 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, - 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, - 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, - 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, - 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, - 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, - 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, - 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, - 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, - 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, - 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, - 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, - 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, - 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, - 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, - 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, - 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, - 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, - 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, - 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, - 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, - 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, - 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, - 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, - 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, - 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, - 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, - 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, + // 3094 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, + 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, + 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, + 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, + 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, + 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, + 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, + 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, + 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, + 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, + 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, + 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, + 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, + 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, + 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, + 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, + 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, + 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, + 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, + 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, + 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, + 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, + 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, + 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, + 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, + 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, + 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, + 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, + 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, + 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, + 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, + 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, + 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, + 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, + 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, + 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, + 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, + 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, + 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, + 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, + 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, + 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, + 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, + 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, + 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, + 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, + 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, + 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, + 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, + 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, + 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, + 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, + 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, + 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, + 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, + 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, + 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, + 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, + 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, + 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, + 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, + 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, + 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, + 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, + 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, + 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, + 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, + 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, + 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, + 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, + 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, + 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, + 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, + 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, + 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, + 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, + 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, + 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, + 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, + 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, + 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, + 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, + 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, + 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, + 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, + 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, + 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, + 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, + 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, + 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, + 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, + 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, + 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, + 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, + 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, + 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, + 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, + 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, + 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, + 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, + 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, + 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, + 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, + 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, + 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, + 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, + 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, + 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, + 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, + 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, + 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, + 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, + 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, + 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, + 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, + 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, + 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, + 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, + 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, + 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, + 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, + 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, + 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, + 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, + 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, + 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, + 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, + 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, + 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, + 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, + 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, + 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, + 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, + 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, + 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, + 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, + 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, + 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, + 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, + 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, + 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, + 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, + 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, + 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, + 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, + 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, + 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, + 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, + 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, + 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, + 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, + 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, + 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, + 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, + 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, + 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, + 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, + 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, + 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, + 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, + 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, + 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, + 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, + 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, + 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, + 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, + 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, + 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, + 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, + 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, + 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, + 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, + 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, + 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, + 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, + 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, + 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, + 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, + 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, + 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, + 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, + 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, + 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, + 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, + 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, + 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, + 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, + 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,13 +4634,36 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) if err != nil { return nil, err } - return out, nil + x := &controlNewAutoEnvironmentClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_NewAutoEnvironmentClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlNewAutoEnvironmentClient struct { + grpc.ClientStream +} + +func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4797,7 +4820,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4834,7 +4857,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4871,8 +4894,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { + return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5008,22 +5031,25 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) +func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(NewEnvironmentRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) +} + +type Control_NewAutoEnvironmentServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlNewAutoEnvironmentServer struct { + grpc.ServerStream +} + +func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5369,10 +5395,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5448,6 +5470,11 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, + { + StreamName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + ServerStreams: true, + }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5796,9 +5823,9 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Closestream { + if m.CloseStream { i-- - if m.Closestream { + if m.CloseStream { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -9082,7 +9109,7 @@ func (m *Ev_EnvironmentError) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.Closestream { + if m.CloseStream { n += 2 } if m.XXX_unrecognized != nil { @@ -11452,7 +11479,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11469,7 +11496,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { break } } - m.Closestream = bool(v != 0) + m.CloseStream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index 881311b3e..eb2218c99 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -62,7 +62,7 @@ func NewEnvironmentErrorEvent(errSt string, close bool) *Event { var ee Event_EnvironmentError ee.EnvironmentError = &Ev_EnvironmentError{ Error: errSt, - Closestream: close, + CloseStream: close, } return WrapEvent(&ee) } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6a46de750..9cfa28fee 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -540,7 +540,7 @@ func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { type Ev_EnvironmentError struct { Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - Closestream bool `protobuf:"varint,2,opt,name=closestream,proto3" json:"closestream,omitempty"` + CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -586,9 +586,9 @@ func (m *Ev_EnvironmentError) GetError() string { return "" } -func (m *Ev_EnvironmentError) GetClosestream() bool { +func (m *Ev_EnvironmentError) GetCloseStream() bool { if m != nil { - return m.Closestream + return m.CloseStream } return false } @@ -4333,201 +4333,201 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3101 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x10, 0x81, 0x06, 0x09, 0x82, 0x43, 0x89, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe9, - 0xc9, 0xb4, 0xec, 0x47, 0xdb, 0xb4, 0xeb, 0x59, 0x4f, 0xb6, 0x6c, 0xf3, 0x03, 0x22, 0xf9, 0x2c, - 0x92, 0xca, 0x90, 0x92, 0x1c, 0x55, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x0f, 0xb9, 0xe5, 0x96, 0x4a, 0xa5, 0x5c, 0xb9, 0xe4, 0x94, 0xaa, 0x54, 0x2a, 0xff, - 0x21, 0x87, 0xfc, 0x80, 0x54, 0x2a, 0xa9, 0xe4, 0x9e, 0x4b, 0xca, 0xf9, 0x03, 0xf9, 0x03, 0xa9, - 0x4a, 0xcd, 0xd7, 0x62, 0x66, 0x3f, 0x40, 0x2a, 0x8a, 0x2f, 0xb9, 0xa1, 0x7b, 0xba, 0x7b, 0xa6, - 0x3f, 0xa6, 0xbb, 0xa7, 0x17, 0x30, 0xdb, 0xf3, 0xbd, 0xd0, 0x0b, 0xde, 0xf1, 0x56, 0x5a, 0x9e, - 0x1b, 0xfa, 0x9e, 0xb3, 0xcc, 0x11, 0xa8, 0x1c, 0x21, 0xf0, 0x2c, 0x5c, 0x6d, 0x0e, 0xa8, 0x1b, - 0x3e, 0xdf, 0xa1, 0x81, 0x17, 0x6c, 0x51, 0xdb, 0x0f, 0x0f, 0xa9, 0x1d, 0xe2, 0x1f, 0x59, 0xd0, - 0x68, 0x0e, 0x9e, 0x37, 0xdd, 0x41, 0xc7, 0xf7, 0xdc, 0x2e, 0x75, 0xc3, 0xfd, 0xd0, 0x0e, 0xe9, - 0xfa, 0x89, 0xed, 0x1e, 0xd3, 0x36, 0xba, 0x05, 0x93, 0x74, 0xb8, 0xd4, 0x69, 0xd7, 0xad, 0x45, - 0x6b, 0xa9, 0x4c, 0x4c, 0x24, 0xba, 0x0a, 0xc5, 0x80, 0x71, 0xd5, 0xf3, 0x7c, 0x55, 0x00, 0xe8, - 0x0e, 0xd4, 0x5a, 0x7d, 0xdf, 0xa7, 0x6e, 0x48, 0xfa, 0xee, 0x6e, 0xbf, 0x7b, 0x48, 0xfd, 0xfa, - 0xd8, 0xa2, 0xb5, 0x34, 0x49, 0x12, 0x78, 0xbc, 0x0e, 0x33, 0xcd, 0xc1, 0xf3, 0x03, 0x3b, 0x38, - 0x35, 0xb6, 0x9f, 0x85, 0x2b, 0xa1, 0x1d, 0x9c, 0x46, 0xfb, 0x4a, 0x28, 0x7d, 0x43, 0xfc, 0x80, - 0xe9, 0x18, 0x09, 0xe9, 0x07, 0x17, 0x49, 0x99, 0x85, 0x2b, 0x01, 0x27, 0x94, 0x62, 0x24, 0x84, - 0xdf, 0x84, 0x29, 0x29, 0xe7, 0xa1, 0xdd, 0x77, 0x5b, 0x27, 0xd9, 0x22, 0x70, 0x87, 0x9f, 0x9b, - 0xdb, 0x94, 0xd1, 0xaf, 0xfb, 0xd4, 0x0e, 0x85, 0xd9, 0x18, 0x81, 0x4f, 0x03, 0xaf, 0xef, 0xb7, - 0x68, 0xa0, 0xcc, 0x66, 0x20, 0xd1, 0xdb, 0x30, 0x4d, 0x5f, 0xd0, 0x56, 0x3f, 0xf4, 0x7c, 0x12, - 0x51, 0x8a, 0xa3, 0x24, 0x17, 0xf0, 0x63, 0xb8, 0x66, 0x3a, 0x4a, 0x6d, 0xf6, 0x31, 0x54, 0x34, - 0x77, 0xf0, 0xad, 0x2a, 0x2b, 0x8d, 0xe5, 0x61, 0x30, 0x68, 0x3c, 0xdb, 0xee, 0x91, 0x47, 0x74, - 0x72, 0xfc, 0x63, 0x0b, 0xe6, 0x4c, 0xb9, 0x1b, 0x34, 0x08, 0x7d, 0xef, 0x9c, 0xb6, 0xd1, 0xff, - 0xc3, 0x74, 0xcb, 0xa1, 0xb6, 0xdb, 0xef, 0x31, 0xe5, 0x02, 0x42, 0x7b, 0xce, 0xb9, 0x94, 0x7f, - 0x5d, 0x93, 0xbf, 0x1e, 0xa7, 0x21, 0x49, 0xb6, 0x64, 0x24, 0xe5, 0x53, 0x22, 0x09, 0xef, 0x70, - 0x7b, 0x6a, 0x87, 0x69, 0xfa, 0xbe, 0xe7, 0x33, 0x7f, 0x53, 0xf6, 0x43, 0xda, 0x51, 0x00, 0x68, - 0x11, 0x2a, 0x2d, 0xc7, 0x0b, 0xd8, 0x71, 0xa9, 0xdd, 0xe5, 0x02, 0x4b, 0x44, 0x47, 0xe1, 0x87, - 0x50, 0x95, 0x9e, 0x0c, 0x3e, 0xef, 0x38, 0x0e, 0x6d, 0xa3, 0x7b, 0x50, 0x39, 0xe5, 0xbf, 0x38, - 0xb2, 0x6e, 0x2d, 0x8e, 0x2d, 0x55, 0x56, 0xea, 0x9a, 0x32, 0xfb, 0x27, 0x9e, 0x1f, 0xb2, 0x45, - 0x61, 0x2a, 0x8d, 0x18, 0x4f, 0xc1, 0xa4, 0x08, 0x2c, 0x42, 0xbf, 0xea, 0xd3, 0x20, 0xc4, 0x87, - 0x50, 0x51, 0x08, 0xa6, 0x62, 0x14, 0x95, 0x96, 0x7e, 0x0d, 0xee, 0xc3, 0xa4, 0x88, 0xab, 0xc7, - 0xbd, 0xb6, 0x1d, 0x72, 0x0f, 0xb3, 0x3d, 0xe7, 0xf4, 0x3d, 0xb5, 0x75, 0x62, 0x52, 0xe3, 0x3f, - 0x5a, 0x30, 0xa1, 0xaf, 0xa3, 0xf7, 0xa1, 0xe8, 0xd0, 0x01, 0x75, 0xf8, 0x2e, 0xd5, 0x95, 0x1b, - 0x19, 0x72, 0x96, 0x1f, 0x32, 0x22, 0x22, 0x68, 0xd1, 0x36, 0x54, 0xbb, 0xc6, 0xc5, 0xe7, 0xd6, - 0xaa, 0xac, 0xdc, 0xd4, 0xc3, 0x24, 0x25, 0x3f, 0x6c, 0xe5, 0x48, 0x8c, 0x11, 0x7f, 0x00, 0x45, - 0x2e, 0x1a, 0x95, 0xa1, 0xb8, 0xd1, 0x5c, 0x7b, 0xbc, 0x59, 0xcb, 0xa1, 0x12, 0x14, 0xb6, 0x77, - 0x1f, 0xec, 0xd5, 0x2c, 0x54, 0x81, 0xf1, 0xa7, 0xab, 0x64, 0x77, 0x7b, 0x77, 0xb3, 0x96, 0x67, - 0x14, 0x4d, 0x42, 0xf6, 0x48, 0x6d, 0x6c, 0x6d, 0x1c, 0x8a, 0x5c, 0x3e, 0xfe, 0x47, 0x51, 0xfe, - 0x42, 0xd7, 0xa1, 0x1c, 0x76, 0xba, 0x34, 0x08, 0xed, 0x6e, 0x4f, 0x9a, 0x6c, 0x88, 0x40, 0x36, - 0xcc, 0xd1, 0xf4, 0xa4, 0x24, 0x8f, 0xfe, 0xdf, 0xc6, 0xd1, 0xb3, 0x32, 0xd8, 0x56, 0x8e, 0x64, - 0xc9, 0x41, 0x04, 0x10, 0x4d, 0x5c, 0x27, 0x9e, 0xa2, 0x2a, 0x2b, 0x8b, 0x99, 0xd2, 0x25, 0xdd, - 0x56, 0x8e, 0xa4, 0x70, 0xa3, 0x87, 0x50, 0x0b, 0x63, 0x59, 0xac, 0x5e, 0xe0, 0x12, 0x17, 0x4c, - 0x89, 0xf1, 0x5c, 0xb7, 0x95, 0x23, 0x09, 0x4e, 0xb4, 0x07, 0xd3, 0x61, 0x3c, 0x9d, 0xd5, 0x8b, - 0x29, 0x9e, 0x4b, 0x66, 0xbd, 0xad, 0x1c, 0x49, 0xf2, 0xa2, 0xcf, 0x60, 0x82, 0x21, 0x1d, 0x99, - 0xd7, 0xea, 0x57, 0x92, 0xc9, 0xc2, 0xcc, 0x7c, 0x5b, 0x39, 0x62, 0x70, 0x30, 0x05, 0xbb, 0x2a, - 0xdd, 0xb5, 0xa4, 0xc9, 0xc6, 0xd3, 0x14, 0x8c, 0x27, 0x45, 0xa6, 0x60, 0x9c, 0x13, 0x7d, 0x01, - 0x57, 0x69, 0x4a, 0xe6, 0xa9, 0x97, 0xb8, 0x44, 0x9c, 0xe9, 0x84, 0x88, 0x72, 0x2b, 0x47, 0x52, - 0x25, 0xb0, 0x73, 0xd2, 0x58, 0x1a, 0xa9, 0x97, 0xd3, 0xce, 0x19, 0x4f, 0x36, 0xec, 0x9c, 0x71, - 0x4e, 0x74, 0x1f, 0x2a, 0xcc, 0x0a, 0x81, 0x48, 0x07, 0x75, 0xe0, 0x82, 0xe6, 0x93, 0x66, 0x93, - 0x69, 0x66, 0x2b, 0x47, 0x74, 0xfa, 0xb5, 0x32, 0x8c, 0x3f, 0xb2, 0xcf, 0x1d, 0xcf, 0x6e, 0x63, - 0x04, 0xb5, 0xfd, 0xfe, 0x61, 0xd0, 0xf2, 0x3b, 0x87, 0x54, 0xe5, 0x91, 0x79, 0x98, 0xdb, 0xa4, - 0xe1, 0x03, 0xdf, 0xee, 0xd2, 0x33, 0xcf, 0x17, 0x99, 0x47, 0x2e, 0xfd, 0xca, 0x82, 0xf1, 0x27, - 0xd4, 0x0f, 0x3a, 0x9e, 0xcb, 0xf2, 0x4b, 0xd7, 0xfe, 0x52, 0x66, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x5c, 0xcf, 0xe7, 0xd7, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x3d, 0x3b, 0x6c, 0x9d, 0xf0, 0x70, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0x61, 0xbf, 0xe3, 0x88, 0x90, 0x2c, 0x13, 0x01, 0xb0, 0x3c, 0xda, - 0xf3, 0xbd, 0x76, 0xbf, 0x15, 0xee, 0xda, 0x5d, 0xca, 0xe3, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x00, - 0x18, 0x88, 0x43, 0xec, 0x87, 0x3e, 0x0f, 0x9a, 0x32, 0xd1, 0x30, 0xf8, 0xa7, 0x79, 0xb8, 0x96, - 0xd4, 0x80, 0xe5, 0xc4, 0x45, 0xa8, 0x1c, 0x45, 0x58, 0x55, 0x3d, 0x75, 0x14, 0xaf, 0x82, 0x43, - 0x73, 0x07, 0xeb, 0x5e, 0xdf, 0x0d, 0xa5, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0x6e, 0x58, 0x41, 0x26, - 0x94, 0xd3, 0x30, 0xc3, 0x1c, 0x5c, 0xd0, 0x73, 0xf0, 0x02, 0xc0, 0x89, 0x17, 0x28, 0xe1, 0x45, - 0xc1, 0x35, 0xc4, 0x20, 0x0c, 0x13, 0x1d, 0x37, 0x08, 0x6d, 0xb7, 0x45, 0xb9, 0x09, 0x84, 0x86, - 0x06, 0x0e, 0xbd, 0x0d, 0xe3, 0x52, 0x63, 0x19, 0xef, 0x48, 0x73, 0xbf, 0x74, 0x11, 0x51, 0x24, - 0xac, 0x87, 0x38, 0xa0, 0xb6, 0xdf, 0xf6, 0xce, 0x5c, 0xe9, 0x4a, 0xd6, 0x43, 0xf8, 0xd4, 0x0e, - 0x3c, 0x57, 0xf5, 0x10, 0x02, 0x62, 0x65, 0x65, 0x48, 0xda, 0x73, 0xce, 0x71, 0x1d, 0x66, 0x37, - 0x69, 0xa8, 0xc5, 0x65, 0x54, 0x70, 0x5e, 0xc0, 0xd5, 0xc4, 0xca, 0xe5, 0xac, 0xfc, 0x09, 0x4c, - 0xe8, 0xc6, 0x94, 0x45, 0x68, 0x54, 0x97, 0x60, 0xd0, 0xe3, 0xdf, 0x17, 0x60, 0x2a, 0x46, 0x81, - 0xaa, 0x90, 0x8f, 0x1a, 0xa2, 0x7c, 0x87, 0xc7, 0x91, 0xbc, 0xd7, 0x4f, 0x4f, 0xa8, 0x2b, 0x0b, - 0xbc, 0x8e, 0x1a, 0x7a, 0x67, 0x4c, 0xf7, 0xce, 0x32, 0x14, 0xb9, 0x07, 0xeb, 0x85, 0x0b, 0xaa, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xf9, 0x9e, 0x17, 0x12, 0xcf, 0x51, 0xc1, 0x1a, 0xc1, 0xa9, 0x4d, - 0xe7, 0x95, 0xf4, 0xa6, 0x13, 0x6d, 0x40, 0xa9, 0x4d, 0x8f, 0xec, 0xbe, 0x13, 0x06, 0xf5, 0x71, - 0xbe, 0xf5, 0x52, 0xb6, 0x3d, 0x96, 0x37, 0x24, 0x69, 0xd3, 0x0d, 0xfd, 0x73, 0x12, 0x71, 0xa2, - 0xbb, 0x50, 0x18, 0xd8, 0x7e, 0x50, 0x2f, 0x71, 0x09, 0xb7, 0x46, 0x48, 0x78, 0x62, 0xfb, 0x92, - 0x9b, 0x73, 0xb0, 0xfd, 0xfb, 0x01, 0xf5, 0x19, 0xba, 0x5e, 0xbe, 0x70, 0xff, 0xc7, 0x92, 0x54, - 0xee, 0xaf, 0x38, 0x1b, 0x1f, 0xc1, 0xa4, 0x71, 0x34, 0x54, 0x83, 0xb1, 0x53, 0x7a, 0x2e, 0xfd, - 0xc2, 0x7e, 0x32, 0xb3, 0x0f, 0x6c, 0xa7, 0x1f, 0xb5, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x35, - 0x3e, 0x84, 0x72, 0x24, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0x49, 0xe3, 0x40, 0x2f, 0xc3, 0x8c, 0x7f, - 0x6b, 0xc1, 0xb5, 0x5d, 0x7a, 0xa6, 0x69, 0xa8, 0xee, 0xc8, 0x1d, 0xa8, 0xb1, 0x80, 0x3d, 0x72, - 0xbc, 0xb3, 0x03, 0xda, 0xed, 0x39, 0xc3, 0x6e, 0x2a, 0x81, 0x47, 0x9f, 0x48, 0xc3, 0x8b, 0x50, - 0xbe, 0xa3, 0x99, 0x2e, 0x55, 0x76, 0xdc, 0xfc, 0xff, 0xb2, 0xee, 0x78, 0x1f, 0x66, 0xe2, 0x3b, - 0xb0, 0x4b, 0xf8, 0x6a, 0x7d, 0xf8, 0x3c, 0xcc, 0xed, 0xd2, 0xb3, 0xd5, 0x7e, 0xe8, 0xc5, 0x05, - 0xe3, 0x37, 0x78, 0x72, 0x4d, 0xb1, 0x56, 0xec, 0x02, 0xb2, 0xc7, 0xdc, 0x4c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xb2, 0xbd, 0x6c, 0xbd, 0x66, 0x34, 0x56, 0x76, 0xeb, 0x38, 0x4f, - 0x44, 0x84, 0xff, 0x64, 0xc1, 0xfc, 0xba, 0x58, 0xbe, 0xf8, 0xd0, 0xe8, 0x53, 0x28, 0x84, 0xe7, - 0x3d, 0x61, 0xe6, 0xea, 0xca, 0x5b, 0xfa, 0xbb, 0x22, 0x4b, 0xc6, 0xf2, 0x5e, 0x8f, 0xb1, 0x10, - 0xce, 0x88, 0x6d, 0xb8, 0x22, 0x60, 0xd6, 0x86, 0xee, 0xee, 0xed, 0x3d, 0xaa, 0xe5, 0x10, 0x82, - 0xea, 0xfe, 0xc1, 0x2a, 0x39, 0x78, 0xbe, 0xba, 0x7e, 0xb0, 0xfd, 0x64, 0xfb, 0xe0, 0xbb, 0x35, - 0x0b, 0x4d, 0xc3, 0xe4, 0xfe, 0xc1, 0xde, 0xa3, 0x21, 0x2a, 0x8f, 0x26, 0xa1, 0xbc, 0xbe, 0xb7, - 0xfb, 0x60, 0x7b, 0xf3, 0x31, 0x69, 0xd6, 0xc6, 0x58, 0xbf, 0x4a, 0x9a, 0xfb, 0xcd, 0x83, 0x5a, - 0x01, 0x4d, 0x40, 0x69, 0x73, 0xef, 0xb9, 0xe8, 0x5e, 0x8b, 0xf8, 0x14, 0xe6, 0xd2, 0x0e, 0xc3, - 0x6c, 0x1b, 0x57, 0xe7, 0xd5, 0xdf, 0xc2, 0x3f, 0xb3, 0xa0, 0xbe, 0xe3, 0xb5, 0x3b, 0x47, 0xe7, - 0x97, 0xb2, 0x1e, 0x78, 0x3d, 0xea, 0xdb, 0x61, 0xc7, 0x73, 0xd5, 0x55, 0xb8, 0x99, 0xee, 0xd9, - 0x3d, 0x45, 0x47, 0x34, 0x16, 0x74, 0x1b, 0xaa, 0x3e, 0x6d, 0x79, 0xee, 0x51, 0xe7, 0xb8, 0xef, - 0xd3, 0x55, 0xc7, 0xe1, 0xe7, 0x2a, 0x91, 0x18, 0x16, 0xff, 0xd2, 0x82, 0xab, 0x69, 0xc2, 0xd0, - 0x3d, 0xe9, 0x3f, 0xf1, 0x1c, 0xb9, 0x7d, 0xc1, 0xde, 0x86, 0xeb, 0x44, 0x26, 0x77, 0x44, 0xcd, - 0xcd, 0xab, 0x4c, 0x2e, 0x60, 0xfc, 0x5e, 0x8a, 0x5b, 0xa7, 0xa0, 0x42, 0x9a, 0x3b, 0x7b, 0x4f, - 0x9a, 0xcf, 0xc9, 0xde, 0x43, 0xe6, 0xb1, 0x09, 0x28, 0xad, 0x6e, 0x6c, 0x08, 0xa8, 0xc0, 0xde, - 0xb2, 0xb3, 0x29, 0x96, 0x63, 0x6e, 0xfa, 0x1c, 0x6a, 0x47, 0x76, 0xc7, 0xa1, 0xed, 0xbd, 0xa1, - 0xb5, 0xac, 0xcb, 0x59, 0x2b, 0xc1, 0x28, 0x9d, 0x90, 0x4f, 0xfa, 0x5c, 0x2f, 0x6b, 0xf8, 0x6b, - 0x0b, 0xe6, 0x65, 0x3f, 0x7a, 0x09, 0x47, 0x5e, 0x87, 0xf2, 0x29, 0xa5, 0xe2, 0xc5, 0x2c, 0x9f, - 0xb2, 0x43, 0x04, 0x7a, 0x17, 0x66, 0x6c, 0xc7, 0xf1, 0xce, 0xb6, 0x5d, 0xd2, 0x77, 0xdd, 0x8e, - 0x7b, 0xbc, 0x1f, 0xed, 0x57, 0x22, 0x69, 0x4b, 0xec, 0x4c, 0x47, 0x9e, 0xdf, 0x12, 0x8d, 0x50, - 0x89, 0x08, 0x00, 0x53, 0x98, 0x4b, 0x3b, 0x12, 0xb3, 0xd0, 0xbf, 0xf1, 0xb1, 0x8f, 0xff, 0x60, - 0xc1, 0xcd, 0x7d, 0x23, 0x11, 0x3d, 0xf2, 0x59, 0xcc, 0x85, 0x1d, 0x1a, 0x64, 0x19, 0xe0, 0x19, - 0x40, 0x2f, 0x22, 0x92, 0x91, 0x7c, 0x4f, 0x6f, 0x05, 0x46, 0xcb, 0x5b, 0x1e, 0x62, 0x44, 0x92, - 0xd7, 0xa4, 0x35, 0xee, 0xc3, 0x54, 0x6c, 0xf9, 0xa5, 0x12, 0xfe, 0x4d, 0xb8, 0x91, 0xbd, 0x3b, - 0xd3, 0x37, 0x80, 0x9b, 0x9b, 0x2f, 0xa9, 0x6e, 0x1d, 0xc6, 0xbf, 0xea, 0x53, 0x5f, 0xe9, 0x5a, - 0x26, 0x0a, 0x64, 0x37, 0x92, 0xbe, 0x68, 0x39, 0xfd, 0x36, 0xdd, 0x74, 0xbc, 0x43, 0xdb, 0x09, - 0xd4, 0x8d, 0x34, 0xb1, 0xf8, 0x37, 0x16, 0xdc, 0xd8, 0x1c, 0x75, 0x2c, 0xf4, 0x85, 0x61, 0x52, - 0x11, 0xee, 0x77, 0x35, 0x93, 0x8e, 0xe4, 0xfe, 0x36, 0x0d, 0xfa, 0x8b, 0x3c, 0x4c, 0x1a, 0xad, - 0x1d, 0x42, 0x50, 0x70, 0x59, 0x16, 0x10, 0xec, 0xfc, 0x37, 0x6b, 0x98, 0x1d, 0xaf, 0x75, 0x2a, - 0x5f, 0xfc, 0x25, 0x22, 0x21, 0x35, 0x8c, 0xdb, 0x6e, 0xcb, 0xfb, 0x26, 0x21, 0x6d, 0x9e, 0x57, - 0xd0, 0xe7, 0x79, 0xc3, 0xeb, 0x59, 0xd4, 0x53, 0xf2, 0x75, 0x28, 0xb7, 0x1c, 0x3b, 0x08, 0xb4, - 0x86, 0x7f, 0x88, 0x40, 0x4d, 0xa8, 0xb6, 0x69, 0xcf, 0xf1, 0xce, 0x55, 0x4d, 0x94, 0x4d, 0xbf, - 0x3e, 0x6e, 0x61, 0x87, 0xdf, 0x30, 0x88, 0x48, 0x8c, 0x89, 0x19, 0xa5, 0xd7, 0x11, 0xcf, 0xd9, - 0x32, 0x61, 0x3f, 0xd1, 0x2d, 0x98, 0x0c, 0x6c, 0xb7, 0x7d, 0xe8, 0xbd, 0xd8, 0x0f, 0xdb, 0x5e, - 0x3f, 0xe4, 0x8f, 0xd2, 0x32, 0x31, 0x91, 0xac, 0x92, 0xa3, 0xa4, 0x78, 0x96, 0x2f, 0xd9, 0xab, - 0x45, 0xb3, 0x54, 0x04, 0xb3, 0x80, 0xb2, 0x8f, 0x19, 0xa1, 0xca, 0x4c, 0x0a, 0x64, 0x2b, 0xde, - 0xd1, 0x11, 0xf5, 0x23, 0x83, 0x29, 0x90, 0xbd, 0x8b, 0xd4, 0xa0, 0x71, 0x5b, 0x3d, 0x0a, 0x35, - 0x0c, 0x9e, 0x86, 0xa9, 0x4d, 0x1a, 0xca, 0x8b, 0x2d, 0x9e, 0x20, 0x9f, 0xc2, 0xe4, 0x10, 0xc5, - 0x82, 0x2c, 0xea, 0xde, 0xad, 0x4b, 0x75, 0xef, 0x78, 0x09, 0xaa, 0x52, 0x80, 0xf6, 0x30, 0x92, - 0xfe, 0xb4, 0x74, 0x7f, 0xe2, 0x0f, 0x61, 0x22, 0xa2, 0x64, 0x3b, 0xbd, 0x01, 0x05, 0xb6, 0x22, - 0x93, 0xd2, 0x4c, 0xcc, 0x13, 0x7c, 0x0f, 0x4e, 0x80, 0x9b, 0x30, 0xc9, 0x07, 0x0f, 0xcc, 0x9b, - 0x99, 0xd1, 0xc5, 0x5e, 0x2b, 0x82, 0x7d, 0xc7, 0x6b, 0xd3, 0xe8, 0xb5, 0x32, 0x44, 0xe1, 0x1f, - 0x42, 0x65, 0xdd, 0xeb, 0x76, 0x6d, 0xb7, 0xad, 0x7c, 0x49, 0xdd, 0x01, 0x57, 0xb3, 0x4c, 0xd8, - 0x4f, 0x1e, 0x58, 0x27, 0xd4, 0x71, 0x64, 0x7c, 0x0a, 0x60, 0x18, 0xf6, 0x63, 0x5a, 0xd8, 0xb3, - 0x70, 0xb3, 0xfd, 0xe3, 0xbe, 0x78, 0x7d, 0x15, 0xb8, 0x8c, 0x21, 0x82, 0x1d, 0x90, 0x35, 0xf4, - 0x32, 0x42, 0xf9, 0x6f, 0xbc, 0x03, 0x95, 0xf5, 0x13, 0xdb, 0x75, 0xa9, 0x93, 0xa9, 0x03, 0xd2, - 0x7a, 0xa7, 0xb2, 0xac, 0xa9, 0xdc, 0x9a, 0xfe, 0x31, 0x0d, 0x87, 0xb7, 0x83, 0x41, 0xf8, 0xef, - 0x63, 0x50, 0x8a, 0xae, 0xdb, 0xff, 0x42, 0x39, 0x60, 0xce, 0xe1, 0x91, 0x2d, 0xec, 0x99, 0xed, - 0xb8, 0x21, 0x29, 0xe3, 0x6b, 0x29, 0xab, 0xca, 0x66, 0xb0, 0x1e, 0xf3, 0x43, 0x64, 0x75, 0x32, - 0x24, 0x45, 0x9f, 0xc1, 0x54, 0xc7, 0x3d, 0xf4, 0xfa, 0x6e, 0x5b, 0xaa, 0xc4, 0x92, 0x1a, 0x0b, - 0x97, 0x59, 0xbd, 0xb4, 0x0c, 0xb5, 0x25, 0x71, 0x72, 0xb4, 0x06, 0x35, 0xaf, 0x1f, 0x9a, 0x22, - 0x0a, 0x23, 0x45, 0x24, 0xe8, 0xd1, 0x5d, 0xe6, 0xf2, 0xc8, 0xa1, 0x72, 0x90, 0x66, 0xb0, 0x0f, - 0x57, 0x89, 0x4e, 0xca, 0x2e, 0x1e, 0x8b, 0xac, 0x47, 0x76, 0x78, 0x22, 0x73, 0x45, 0x04, 0xf3, - 0xe1, 0xb4, 0x3b, 0xd8, 0x16, 0x63, 0xb0, 0x32, 0x11, 0x00, 0x5a, 0x37, 0x72, 0xaf, 0x78, 0xde, - 0xfd, 0x57, 0x4a, 0xc8, 0x7e, 0x9b, 0x69, 0xf6, 0x1d, 0x98, 0x31, 0xcb, 0xb5, 0xb8, 0x6f, 0x75, - 0x18, 0x17, 0x37, 0x2c, 0x90, 0xc1, 0xac, 0x40, 0xfc, 0x13, 0x0b, 0xa6, 0x13, 0x05, 0xfe, 0x55, - 0x66, 0xe6, 0xe8, 0x63, 0x98, 0xf0, 0x45, 0x5b, 0xa2, 0x3a, 0x9b, 0xd1, 0xcc, 0x06, 0x35, 0x5e, - 0xe7, 0xf9, 0x87, 0x3d, 0x31, 0xa2, 0xc3, 0x47, 0xd6, 0xb6, 0x74, 0x6b, 0x37, 0xa0, 0xd4, 0xb3, - 0xc3, 0x93, 0xfd, 0x1e, 0x6d, 0xa9, 0x46, 0x52, 0xc1, 0xf8, 0xeb, 0x02, 0x94, 0xd4, 0x2b, 0x25, - 0xab, 0xce, 0xa4, 0x7d, 0x07, 0xca, 0x98, 0x56, 0x34, 0xa0, 0x74, 0xd4, 0x77, 0x1c, 0x1e, 0x0a, - 0x22, 0x63, 0x46, 0xb0, 0x6e, 0xd9, 0xa2, 0x61, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x67, 0x1b, 0xd4, - 0xaf, 0x70, 0x03, 0xa4, 0xbe, 0xa0, 0x04, 0x05, 0xba, 0x9f, 0x18, 0x4b, 0xbc, 0x9e, 0x42, 0x9d, - 0x39, 0x8f, 0x78, 0xcf, 0x98, 0x47, 0xdc, 0x48, 0x63, 0x8d, 0x0f, 0x22, 0xee, 0x27, 0x06, 0x11, - 0xa9, 0x3b, 0xfe, 0x07, 0x4d, 0x20, 0xee, 0xf1, 0x2a, 0x26, 0x03, 0x8b, 0xc5, 0x78, 0xe4, 0x1f, - 0xeb, 0x22, 0xff, 0xe0, 0x5f, 0x5b, 0xf0, 0xda, 0x26, 0x0d, 0x9f, 0xc6, 0xe6, 0x11, 0x51, 0x84, - 0x2e, 0x42, 0xc5, 0xa7, 0x3d, 0xef, 0x91, 0x1d, 0x86, 0xd4, 0x57, 0xc3, 0x3e, 0x1d, 0x85, 0x96, - 0x60, 0xca, 0xa7, 0x83, 0x4e, 0xd0, 0xf1, 0x5c, 0x45, 0x25, 0x4e, 0x18, 0x47, 0x33, 0x59, 0xb6, - 0xe3, 0xac, 0xf9, 0xb6, 0xdb, 0x3a, 0xa1, 0xaa, 0x11, 0xd4, 0x51, 0xbc, 0xec, 0x3b, 0xce, 0x81, - 0x7d, 0x1c, 0xc8, 0x4e, 0x5f, 0x81, 0xf8, 0x10, 0xae, 0xc6, 0xcf, 0xa8, 0xae, 0x00, 0x3b, 0x8c, - 0xba, 0x02, 0xec, 0x37, 0xcf, 0x6f, 0x6a, 0xde, 0x22, 0xef, 0x8f, 0x82, 0xf9, 0x23, 0x4d, 0x1e, - 0x4b, 0xde, 0x84, 0x08, 0xc6, 0x5f, 0xc2, 0x7c, 0xba, 0x29, 0x98, 0x4d, 0x77, 0x60, 0x3a, 0x3e, - 0xb4, 0x49, 0x7b, 0x74, 0xa5, 0x1d, 0x92, 0x24, 0x39, 0x31, 0x82, 0xda, 0xc3, 0x4e, 0xc0, 0x5e, - 0x2b, 0x9e, 0xf6, 0x05, 0xae, 0xc4, 0xe0, 0xcc, 0xab, 0x5d, 0x87, 0x71, 0x79, 0x31, 0x64, 0x8d, - 0x56, 0x20, 0xf3, 0x81, 0xfc, 0x49, 0x4c, 0xe5, 0xe2, 0x68, 0xfc, 0x15, 0x54, 0xb5, 0x7d, 0x55, - 0xb0, 0x30, 0x28, 0x2d, 0x58, 0xe4, 0x69, 0x88, 0xa0, 0x40, 0x1f, 0xc0, 0xb5, 0x63, 0xde, 0xaf, - 0x6f, 0xc4, 0x36, 0x13, 0x56, 0x4e, 0x5f, 0xc4, 0xbb, 0x50, 0x5d, 0x6d, 0xb7, 0x99, 0x2c, 0x15, - 0x54, 0x69, 0xca, 0xa5, 0xa8, 0x90, 0x4f, 0x57, 0x81, 0xc0, 0x44, 0x24, 0x4f, 0xf4, 0x6c, 0xc8, - 0xa5, 0x67, 0xf1, 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0x8e, 0xaa, 0xf8, 0x65, 0xc2, 0x7f, - 0xe3, 0x37, 0x61, 0x9a, 0xd0, 0xae, 0x37, 0xa0, 0xfa, 0x31, 0xaf, 0x42, 0xb1, 0xe3, 0xb6, 0xe9, - 0x0b, 0xf5, 0x89, 0x82, 0x03, 0xf8, 0xff, 0x60, 0x4a, 0x27, 0x65, 0x27, 0xb8, 0x0d, 0x55, 0x7d, - 0x9f, 0x28, 0x1c, 0x63, 0x58, 0xfc, 0x16, 0xcc, 0x10, 0x7a, 0xe4, 0xd3, 0xe0, 0x44, 0xf7, 0x7b, - 0xc6, 0x3e, 0xff, 0x03, 0xd7, 0xf6, 0x69, 0xa8, 0xb1, 0x8f, 0x26, 0xbf, 0xcf, 0x1f, 0xa9, 0x9b, - 0x69, 0x1e, 0x50, 0x8c, 0x7a, 0xec, 0x5b, 0xb1, 0xd8, 0xff, 0x0e, 0x7f, 0x15, 0xb2, 0x6d, 0x32, - 0x98, 0x53, 0x77, 0x35, 0x44, 0xe6, 0x63, 0x22, 0xdf, 0x83, 0xd7, 0xb2, 0x44, 0x32, 0xa3, 0x29, - 0x37, 0x58, 0x9a, 0x1b, 0xc6, 0xa1, 0xd8, 0xec, 0xf6, 0xc2, 0xf3, 0x95, 0xbf, 0x54, 0x61, 0x5c, - 0x0e, 0xa9, 0xd0, 0x3a, 0x54, 0x0e, 0x7c, 0xbb, 0x25, 0x3f, 0xfe, 0xa1, 0x7a, 0xe2, 0x1b, 0xb1, - 0x3c, 0x62, 0x63, 0x36, 0x65, 0x85, 0x3d, 0x68, 0x73, 0xef, 0x5a, 0xe8, 0x19, 0xd4, 0xe2, 0xdf, - 0x74, 0x10, 0x36, 0x5f, 0x8f, 0x69, 0x9f, 0xac, 0x1a, 0x8b, 0x23, 0x69, 0xb8, 0x74, 0xb4, 0x06, - 0x25, 0xf5, 0xcd, 0x03, 0xe9, 0x83, 0xc8, 0xd8, 0x37, 0x93, 0x46, 0x3d, 0x75, 0x4d, 0xc8, 0x78, - 0xca, 0x9b, 0x03, 0xfd, 0x63, 0x08, 0x7a, 0x3d, 0xf3, 0x71, 0x1b, 0x69, 0x7c, 0x73, 0x14, 0x89, - 0x10, 0xfc, 0x3d, 0x40, 0xc9, 0x51, 0x2c, 0x5a, 0xbc, 0x68, 0xc0, 0xdc, 0xc0, 0x26, 0x45, 0xea, - 0x2c, 0x37, 0x87, 0x0e, 0xa0, 0x6a, 0xb2, 0x5f, 0x42, 0xf2, 0xc2, 0x08, 0x8a, 0x48, 0xaa, 0xa9, - 0x0d, 0x5a, 0xcc, 0x54, 0x34, 0x4d, 0x6a, 0xca, 0xd8, 0x18, 0xe7, 0xd0, 0x0f, 0x00, 0x25, 0xe7, - 0x9e, 0xe8, 0xd6, 0x65, 0x66, 0xb4, 0x86, 0x35, 0x32, 0x86, 0xa7, 0x38, 0x87, 0xbe, 0x0f, 0xd3, - 0x89, 0x89, 0x1d, 0xd2, 0xfb, 0xe4, 0xac, 0x49, 0x68, 0xe3, 0xf5, 0xd1, 0x44, 0x91, 0x02, 0xc9, - 0x79, 0x97, 0xa1, 0x40, 0xe6, 0x84, 0xce, 0x50, 0x20, 0x63, 0x68, 0x26, 0x22, 0x59, 0xbd, 0x87, - 0x8d, 0x48, 0x8e, 0xbd, 0x9b, 0x8d, 0x48, 0x36, 0x1e, 0xd0, 0x38, 0x87, 0x3e, 0x85, 0x71, 0x89, - 0x42, 0xf3, 0x49, 0x32, 0x25, 0x61, 0x2e, 0x6d, 0x49, 0x08, 0xd8, 0x85, 0x09, 0xbd, 0x6d, 0x47, - 0x0b, 0x99, 0x03, 0x3b, 0x21, 0x6a, 0xe4, 0x40, 0x2f, 0x52, 0x8a, 0xb7, 0x47, 0x71, 0xa5, 0xf4, - 0x66, 0x3c, 0xae, 0xd4, 0xb0, 0x9f, 0xc2, 0x39, 0x74, 0xc4, 0xbf, 0x55, 0x26, 0x5a, 0x03, 0x74, - 0xdb, 0xe4, 0xc9, 0x6a, 0xa3, 0x1a, 0xb7, 0x2e, 0xa4, 0x13, 0xfb, 0x34, 0xa1, 0x1c, 0x95, 0x67, - 0xf4, 0x9a, 0xc6, 0x14, 0x6f, 0x16, 0x1a, 0xf3, 0xe9, 0x8b, 0x91, 0x0f, 0x64, 0x89, 0x34, 0x7c, - 0x60, 0x96, 0x61, 0xc3, 0x07, 0x7a, 0x45, 0xc5, 0x39, 0xb4, 0x05, 0x30, 0x2c, 0x72, 0xe8, 0xba, - 0xd1, 0x13, 0xc4, 0xca, 0x64, 0xa3, 0x91, 0xb1, 0xaa, 0xac, 0x3f, 0xa1, 0xd7, 0x3c, 0xc3, 0x9b, - 0x29, 0xc5, 0xb0, 0x51, 0xd3, 0x27, 0xd8, 0xac, 0x16, 0xe0, 0x1c, 0x7a, 0x00, 0x55, 0xb3, 0x14, - 0x1a, 0xf9, 0x20, 0xb5, 0x4a, 0xa6, 0xca, 0x79, 0x06, 0xf5, 0xac, 0x1a, 0x89, 0xee, 0x98, 0x12, - 0x47, 0x15, 0xd2, 0x54, 0xd9, 0x0e, 0xcc, 0xa6, 0x57, 0x3b, 0xb4, 0x64, 0x4a, 0xce, 0xae, 0xb1, - 0x8d, 0xdb, 0x97, 0xa0, 0x14, 0x56, 0xfd, 0x18, 0xca, 0xd1, 0x1f, 0x2f, 0x8c, 0x38, 0x89, 0xff, - 0x1d, 0xc3, 0x3c, 0xeb, 0x80, 0xba, 0xe1, 0xbb, 0xd6, 0xda, 0xdd, 0xdf, 0x7d, 0xb3, 0x60, 0xfd, - 0xf9, 0x9b, 0x05, 0xeb, 0xaf, 0xdf, 0x2c, 0x58, 0x3f, 0xff, 0xdb, 0x42, 0x0e, 0x70, 0xeb, 0x64, - 0xb9, 0x45, 0x7d, 0x77, 0xd9, 0x76, 0x3a, 0x2d, 0xba, 0xec, 0xad, 0x2c, 0x2b, 0x1e, 0xbf, 0xd7, - 0x0a, 0xa8, 0x3f, 0xa0, 0xfe, 0xb3, 0x7c, 0xef, 0xf0, 0xf0, 0x0a, 0xff, 0x2f, 0xe6, 0xfb, 0xff, - 0x0c, 0x00, 0x00, 0xff, 0xff, 0x73, 0xcf, 0xd1, 0xeb, 0xa5, 0x29, 0x00, 0x00, + // 3094 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, + 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, + 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, + 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, + 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, + 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, + 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, + 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, + 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, + 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, + 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, + 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, + 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, + 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, + 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, + 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, + 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, + 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, + 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, + 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, + 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, + 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, + 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, + 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, + 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, + 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, + 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, + 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, + 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, + 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, + 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, + 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, + 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, + 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, + 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, + 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, + 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, + 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, + 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, + 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, + 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, + 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, + 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, + 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, + 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, + 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, + 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, + 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, + 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, + 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, + 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, + 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, + 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, + 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, + 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, + 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, + 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, + 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, + 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, + 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, + 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, + 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, + 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, + 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, + 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, + 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, + 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, + 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, + 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, + 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, + 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, + 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, + 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, + 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, + 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, + 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, + 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, + 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, + 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, + 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, + 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, + 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, + 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, + 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, + 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, + 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, + 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, + 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, + 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, + 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, + 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, + 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, + 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, + 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, + 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, + 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, + 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, + 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, + 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, + 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, + 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, + 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, + 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, + 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, + 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, + 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, + 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, + 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, + 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, + 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, + 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, + 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, + 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, + 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, + 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, + 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, + 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, + 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, + 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, + 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, + 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, + 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, + 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, + 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, + 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, + 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, + 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, + 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, + 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, + 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, + 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, + 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, + 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, + 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, + 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, + 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, + 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, + 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, + 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, + 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, + 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, + 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, + 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, + 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, + 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, + 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, + 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, + 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, + 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, + 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, + 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, + 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, + 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, + 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, + 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, + 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, + 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, + 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, + 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, + 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, + 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, + 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, + 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, + 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, + 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, + 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, + 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, + 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, + 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, + 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, + 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, + 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, + 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, + 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, + 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, + 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, + 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, + 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, + 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, + 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, + 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, + 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, + 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, + 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, + 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, + 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, + 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, + 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, + 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, + 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, + 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, + 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, + 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, + 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4546,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,13 +4634,36 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) if err != nil { return nil, err } - return out, nil + x := &controlNewAutoEnvironmentClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_NewAutoEnvironmentClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlNewAutoEnvironmentClient struct { + grpc.ClientStream +} + +func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4797,7 +4820,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4834,7 +4857,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) + NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4871,8 +4894,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { + return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5008,22 +5031,25 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewEnvironmentRequest)) +func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(NewEnvironmentRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) +} + +type Control_NewAutoEnvironmentServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlNewAutoEnvironmentServer struct { + grpc.ServerStream +} + +func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5369,10 +5395,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5448,6 +5470,11 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, + { + StreamName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + ServerStreams: true, + }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5796,9 +5823,9 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Closestream { + if m.CloseStream { i-- - if m.Closestream { + if m.CloseStream { dAtA[i] = 1 } else { dAtA[i] = 0 @@ -9082,7 +9109,7 @@ func (m *Ev_EnvironmentError) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.Closestream { + if m.CloseStream { n += 2 } if m.XXX_unrecognized != nil { @@ -11452,7 +11479,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Closestream", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) } var v int for shift := uint(0); ; shift += 7 { @@ -11469,7 +11496,7 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { break } } - m.Closestream = bool(v != 0) + m.CloseStream = bool(v != 0) default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index e1d81afed..29edd372e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -69,7 +69,7 @@ message Ev_EnvironmentDestroyed { message Ev_EnvironmentError { string error = 1; - bool closestream = 2; + bool closeStream = 2; } message Ev_TasksKilled { @@ -85,7 +85,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} - rpc NewAutoEnvironment (NewEnvironmentRequest) returns (NewAutoEnvironmentReply) {} + rpc NewAutoEnvironment(NewEnvironmentRequest) returns (stream Event); rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} From b4cfddab322f22f628dcfe9614ee212d185a8da7 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 16 Nov 2020 18:06:35 +0100 Subject: [PATCH 0653/2352] [core] use EventFeed for subscriptions --- core/environment/manager.go | 3 +- core/globalstate.go | 10 ++-- core/server.go | 62 +++++++++++++++--------- core/task/manager.go | 48 ++++-------------- core/task/scheduler.go | 12 +---- core/task/subscriber.go | 97 +++++++++++++++++++++++++++++++++++++ 6 files changed, 156 insertions(+), 76 deletions(-) create mode 100644 core/task/subscriber.go diff --git a/core/environment/manager.go b/core/environment/manager.go index e1a9ac69d..92e60f0ad 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -363,7 +363,8 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } -func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string) { +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub task.Subscription) { + defer sub.Unsubscribe() id, err := envs.CreateEnvironment(workflowPath, userVars) // report error through events during the procces diff --git a/core/globalstate.go b/core/globalstate.go index ef461a39e..c539ccafe 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -33,7 +33,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/environment" - "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" @@ -54,16 +54,16 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - publicEventCh := make(chan *pb.Event,100) + eventFeed := task.NewEventFeed() state := &globalState{ - PublicEvent: publicEventCh, + PublicEventFeed: eventFeed, shutdown: shutdown, environments: nil, } internalEventCh := make(chan event.Event) - taskman, err := task.NewManager(shutdown, publicEventCh, internalEventCh) + taskman, err := task.NewManager(shutdown, eventFeed, internalEventCh) if err != nil { return nil, err } @@ -84,6 +84,6 @@ type globalState struct { environments *environment.Manager taskman *task.Manager - PublicEvent chan *pb.Event + PublicEventFeed *task.EventFeed } diff --git a/core/server.go b/core/server.go index 4cf944fa2..7182aaefe 100644 --- a/core/server.go +++ b/core/server.go @@ -206,11 +206,11 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - select { - case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): - default: - log.Debug("state.PublicEvent channel is full") - } + // select { + // case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): + // default: + // log.Debug("state.PublicEvent channel is full") + // } return r, nil } @@ -377,11 +377,11 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - select { - case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): - default: - log.Debug("state.PublicEvent channel is full") - } + // select { + // case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): + // default: + // log.Debug("state.PublicEvent channel is full") + // } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } @@ -657,25 +657,43 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() - ctx := srv.Context() + ch := make(chan *pb.Event) + // use to subscribe to taskman + // here just do it + sub := m.state.PublicEventFeed.Subscribe(ch) for { select { - case event := <- m.state.PublicEvent: - err := srv.Send(event) - if err != nil { - return err + case event, ok := <- ch: + if ok { + err := srv.Send(event) + if err != nil { + return err + } } - case <-ctx.Done(): - return ctx.Err() + case err := <- sub.Err(): + return err } } } -func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { +func (m *RpcServer) NewAutoEnvironment(request *pb.NewEnvironmentRequest, srv pb.Control_NewAutoEnvironmentServer) error { m.logMethod() - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars()) - r := &pb.NewAutoEnvironmentReply{ + ch := make(chan *pb.Event) + // use to subscribe to taskman + // here just do it + sub := m.state.PublicEventFeed.Subscribe(ch) + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) + for { + select { + case event, ok := <- ch: + if ok { + err := srv.Send(event) + if err != nil { + return err + } + } + case err := <- sub.Err(): + return err + } } - - return r, nil } \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index da06915b3..aaafe5c8a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -78,13 +78,13 @@ type Manager struct { tasksFinished int schedulerState *schedulerState - publicEventCh chan<- *pb.Event + publicEventFeed *EventFeed internalEventCh chan<- event.Event ackKilledTasks *safeAcks } func NewManager(shutdown func(), - publicEventCh chan<- *pb.Event, + publicEventFeed *EventFeed, internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need @@ -113,7 +113,7 @@ func NewManager(shutdown func(), taskman = &Manager{ classes: newClasses(), roster: newRoster(), - publicEventCh: publicEventCh, + publicEventFeed: publicEventFeed, internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) @@ -639,11 +639,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} - select { - case m.publicEventCh <- pb.NewEventTaskStatus(taskId,"KILLED"): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId,"KILLED")) } return @@ -664,11 +660,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - select { - case m.publicEventCh <- pb.NewEventTaskStatus(taskId, taskPtr.status.String()): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId, taskPtr.status.String())) } // Kill all tasks outside an environment (all unlocked tasks) @@ -714,11 +706,7 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err close(ack) m.ackKilledTasks.deleteKey(id) } - select { - case m.publicEventCh <- pb.NewKillTasksEvent(tasksToShortTaskInfos(killed)): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewKillTasksEvent(tasksToShortTaskInfos(killed))) return } @@ -801,21 +789,13 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - select { - case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber()): - default: - log.Debug("state.PublicEvent channel is full") - } + m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber())) }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - select { - case m.publicEventCh <- pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber()): - default: - log.Debug("state.PublicEvent channel is full") - } + m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber())) }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -857,22 +837,14 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - select { - case m.publicEventCh <- pb.NewEventTaskState(tm.taskId, tm.state): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEventTaskState(tm.taskId, tm.state)) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) case taskop.Error: // error reported from environment need to inform stream // FIXME: A better way to publish errors to stream that // are not from the taskman. - select { - case m.publicEventCh <- pb.NewEnvironmentErrorEvent(tm.GetError(), true): - default: - log.Debug("state.PublicEvent channel is full") - } + go m.publicEventFeed.Send(pb.NewEnvironmentErrorEvent(tm.GetError(), true)) } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 623afce44..ca3cc1857 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -690,11 +690,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - select { - case state.taskman.publicEventCh <- cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String()): - default: - log.Debug("state.PublicEvent channel is full") - } + go state.taskman.publicEventFeed.Send(cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String())) newTaskId := taskPtr.GetTaskId() @@ -733,11 +729,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - select { - case state.taskman.publicEventCh <- cpb.NewEventTaskLaunch(newTaskId): - default: - log.Debug("state.PublicEvent channel is full") - } + go state.taskman.publicEventFeed.Send(cpb.NewEventTaskLaunch(newTaskId)) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/subscriber.go b/core/task/subscriber.go new file mode 100644 index 000000000..14b465923 --- /dev/null +++ b/core/task/subscriber.go @@ -0,0 +1,97 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package task + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/core/protos" +) + +type Subscription interface { + Unsubscribe() + Err() <-chan error +} + +type EventFeed struct { + mu sync.RWMutex + streams []chan *pb.Event +} + +func (e *EventFeed) Send(data *pb.Event) { + e.mu.RLock() + defer e.mu.RUnlock() + for _, stream := range e.streams { + stream <- data + } +} + +func (e *EventFeed) Subscribe(stream chan *pb.Event) Subscription { + e.mu.Lock() + defer e.mu.Unlock() + e.streams = append(e.streams, stream) + return &sub{ + feed: e, + channelIndex: len(e.streams)-1, + channel: stream, + err: make(chan error, 1), + } +} + +// removes an channel at index i efficiently as order does not +// matter for listeners we keep track of. +func (e *EventFeed) remove(i int) { + e.mu.Lock() + close(e.streams[i]) + e.streams[i] = e.streams[len(e.streams)-1] + e.streams = e.streams[:len(e.streams)-1] + e.mu.Unlock() +} + +func NewEventFeed() *EventFeed { + return &EventFeed{ + streams: make([]chan *pb.Event, 0), + } +} + +type sub struct { + feed *EventFeed + channelIndex int + channel chan *pb.Event + once sync.Once + err chan error +} + +func (s *sub) Unsubscribe() { + s.once.Do(func() { + s.feed.remove(s.channelIndex) + close(s.err) + }) +} + +func (s *sub) Err() <-chan error { + return s.err +} From 74c410c0b0f07fba38939eeb5c4293395ea28a24 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 09:50:39 +0100 Subject: [PATCH 0654/2352] [coconut] use GetBool to retrieve boolean flags --- coconut/control/control.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 104ea414a..a278927b1 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -72,7 +72,8 @@ func WrapCall(call ControlCall) RunFunc { Debug("initializing gRPC client") s := spinner.New(spinner.CharSets[11], SPINNER_TICK) - if !viper.GetBool("nospinner") && !cmd.Flags().Changed("auto") { + auto, _ := cmd.Flags().GetBool("auto") + if !viper.GetBool("nospinner") && !auto { _ = s.Color("yellow") s.Suffix = " working..." s.Start() @@ -200,7 +201,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } - if cmd.Flags().Changed("auto") { + auto, _ := cmd.Flags().GetBool("auto") + if auto { // new auto environment should be a stream of events responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) if err != nil { From ba0952bfaa1664aa936a14be56aea971b840fcd4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 09:54:00 +0100 Subject: [PATCH 0655/2352] [core] Get run number from args --- core/environment/manager.go | 4 ---- core/environment/transition_reset.go | 1 - core/environment/transition_startactivity.go | 1 - core/environment/transition_stopactivity.go | 1 - core/protos/coreevents.go | 10 +++++++--- core/task/coreevent.go | 10 +++++----- 6 files changed, 12 insertions(+), 15 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 92e60f0ad..e8280e8d0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -367,10 +367,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str defer sub.Unsubscribe() id, err := envs.CreateEnvironment(workflowPath, userVars) - // report error through events during the procces - // this stays here as a reminder that we should remove it if err != nil { - // environment error should report envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) return } @@ -386,7 +383,6 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } err = env.TryTransition(trans) - // this stays here as a reminder that we should remove it if err != nil { envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) return diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index a3669303c..b09883d92 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -54,7 +54,6 @@ func (t ResetTransition) do(env *Environment) (err error) { task.STANDBY.String(), nil, env.Id(), - env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 19c5d52d7..ee684b4c0 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -72,7 +72,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { task.RUNNING.String(), args, env.Id(), - runNumber, ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bf9797817..bebd6d2e5 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -59,7 +59,6 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.CONFIGURED.String(), nil, env.Id(), - env.GetCurrentRunNumber(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go index eb2218c99..83a209dcd 100644 --- a/core/protos/coreevents.go +++ b/core/protos/coreevents.go @@ -25,17 +25,21 @@ package pb import ( + "strconv" "time" "github.com/AliceO2Group/Control/common/utils/uid" ) -func NewEnvironmentStateEvent(envId uid.ID, state string, rn uint32) *Event { +func NewEnvironmentStateEvent(envId uid.ID, state, rn string) *Event { var te Ev_EnvironmentStateChanged var tEvnt Event_EnvironmentStateChanged te.State = state te.Environmentid = envId.String() - te.CurrentRunNumber = rn + currentRunNumber, err := strconv.ParseUint(rn, 10, 32) + if err != nil { + te.CurrentRunNumber = uint32(currentRunNumber) + } tEvnt.EnvironmentStateChanged=&te return WrapEvent(&tEvnt) @@ -121,4 +125,4 @@ func WrapEvent(ce isEvent_Payload) *Event { Timestamp:time.Now().Format(time.RFC3339), Payload: ce, } -} \ No newline at end of file +} diff --git a/core/task/coreevent.go b/core/task/coreevent.go index fd0d55bed..143b856f7 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -56,7 +56,7 @@ type environmentMessage struct { envId uid.ID tasks Tasks descriptors Descriptors - runNumber uint32 + runNumber string errSt string } @@ -81,9 +81,9 @@ func (em *environmentMessage) GetDescriptors() Descriptors { return em.descriptors } -func (em *environmentMessage) GetRunNumber() uint32 { +func (em *environmentMessage) GetRunNumber() string { if em == nil { - return 0 + return "" } return em.runNumber } @@ -140,7 +140,7 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID, rn uint32) (t *TaskmanMessage) { +func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID) (t *TaskmanMessage) { t = newTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ src: src, @@ -151,7 +151,7 @@ func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, carg t.environmentMessage = environmentMessage{ tasks: tasks, envId: envID, - runNumber: rn, + runNumber: cargs["runNumber"], } return t } From 248f807b0ecadb7671a7166a686d392ffc3bc3be Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 16:54:39 +0100 Subject: [PATCH 0656/2352] [coconut] Subscribe using xid --- coconut/control/control.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index a278927b1..ce74273d2 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -50,6 +50,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" "google.golang.org/grpc" + "github.com/rs/xid" ) const( @@ -203,13 +204,20 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C auto, _ := cmd.Flags().GetBool("auto") if auto { - // new auto environment should be a stream of events - responseS, err := rpc.NewAutoEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + // subscribe to core to receive events + id := xid.New().String() + stream, err := rpc.Subscribe(context.TODO(), &pb.SubscribeRequest{Id: id}, grpc.EmptyCallOption{}) + if err != nil { + log.WithPrefix("Subscribe"). + WithError(err). + Fatal("command finished with error") + } + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewAutoEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Id: id}, grpc.EmptyCallOption{}) if err != nil { return err } for { - rcv, err := responseS.Recv() + rcv, err := stream.Recv() if err != nil { if err == io.EOF { break From aba011ddd4c1030e4d098316ea61826e73472f42 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 16:58:59 +0100 Subject: [PATCH 0657/2352] [core] Connections struct to keep track of streams --- core/server.go | 38 +++++++++++++++----------------------- core/serverutil.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/core/server.go b/core/server.go index 7182aaefe..5b9597847 100644 --- a/core/server.go +++ b/core/server.go @@ -53,6 +53,7 @@ func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ state: state, + conns: newConnectionsInstance(), }) // Register reflection service on gRPC server. reflection.Register(s) @@ -79,6 +80,7 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { state *globalState + conns Connections } func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { @@ -658,9 +660,7 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() ch := make(chan *pb.Event) - // use to subscribe to taskman - // here just do it - sub := m.state.PublicEventFeed.Subscribe(ch) + m.conns.add(req.GetId(), ch) for { select { case event, ok := <- ch: @@ -669,31 +669,23 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe if err != nil { return err } + } else { + return nil } case err := <- sub.Err(): - return err + return err } } } -func (m *RpcServer) NewAutoEnvironment(request *pb.NewEnvironmentRequest, srv pb.Control_NewAutoEnvironmentServer) error { +func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch := make(chan *pb.Event) - // use to subscribe to taskman - // here just do it - sub := m.state.PublicEventFeed.Subscribe(ch) - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) - for { - select { - case event, ok := <- ch: - if ok { - err := srv.Send(event) - if err != nil { - return err - } - } - case err := <- sub.Err(): - return err - } + ch, ok := m.conns.GetChannel(request.GetId()) + var sub environment.Subscription + if ok { + sub = environment.SubscribeToStream(ch) } -} \ No newline at end of file + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) + r := &pb.NewAutoEnvironmentReply{} + return r, nil +} diff --git a/core/serverutil.go b/core/serverutil.go index 7de68938a..002e3670f 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,6 +26,7 @@ package core import ( "fmt" + "sync" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/core/protos" @@ -182,3 +183,34 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { } return } + + +type Connections struct { + mu sync.RWMutex + streams map[string]chan *pb.Event +} + +func (c *Connections) add(id string, ch chan *pb.Event) { + c.mu.Lock() + c.streams[id] = ch + c.mu.Unlock() +} + +func (c *Connections) delete(id string) { + c.mu.Lock() + delete(c.streams, id) + c.mu.Unlock() +} + +func (c *Connections) GetChannel(id string) (ch chan *pb.Event, ok bool) { + c.mu.RLock() + defer c.mu.RUnlock() + ch, ok = c.streams[id] + return +} + +func newConnectionsInstance() Connections { + return Connections{ + streams: make(map[string]chan *pb.Event), + } +} \ No newline at end of file From a06f0a690218d7fa292e9f5155d020c8528059b7 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:52:52 +0100 Subject: [PATCH 0658/2352] [coconut] Handle auto environment error --- coconut/control/control.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index ce74273d2..5bcef0ad6 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -226,16 +226,13 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - if evt:= rcv.GetEnvironmentError(); evt != nil{ + if evt:= rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { log.WithPrefix("Event"). WithError(err). Error("environment error") - } - if evt.CloseStream { return nil } - } log.WithPrefix("Event"). Info(rcv) From 51e53bbc86d9a2ef8a68af5498f284733a6cd990 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:53:55 +0100 Subject: [PATCH 0659/2352] [common] Introduce Role, Task, Environment Event --- common/event/environmentevents.go | 52 +++++++++++++++++++++++++++++++ common/event/roleevent.go | 44 ++++++++++++++++++++++++++ common/event/taskevents.go | 44 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 common/event/environmentevents.go create mode 100644 common/event/roleevent.go create mode 100644 common/event/taskevents.go diff --git a/common/event/environmentevents.go b/common/event/environmentevents.go new file mode 100644 index 000000000..9e2f5b1cf --- /dev/null +++ b/common/event/environmentevents.go @@ -0,0 +1,52 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type EnvironmentEvent struct { + eventBase + EnvironmentID string + Run uint32 + State string + Error error +} + +func (r *EnvironmentEvent) GetName() string { + return r.EnvironmentID +} + +func (r *EnvironmentEvent) GetRun() uint32 { + return r.Run +} + +func (r *EnvironmentEvent) GetState() string { + return r.State +} + +func (r *EnvironmentEvent) GetError() string { + if r.Error == nil { + return "" + } + return r.Error.Error() +} \ No newline at end of file diff --git a/common/event/roleevent.go b/common/event/roleevent.go new file mode 100644 index 000000000..6de7d09f9 --- /dev/null +++ b/common/event/roleevent.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type RoleEvent struct { + eventBase + Name string + Status string + State string +} + +func (r *RoleEvent) GetName() string { + return r.Name +} + +func (r *RoleEvent) GetStatus() string { + return r.Status +} + +func (r *RoleEvent) GetState() string { + return r.State +} \ No newline at end of file diff --git a/common/event/taskevents.go b/common/event/taskevents.go new file mode 100644 index 000000000..b3afd10bc --- /dev/null +++ b/common/event/taskevents.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type TaskEvent struct { + eventBase + TaskID string + Status string + State string +} + +func (r *TaskEvent) GetName() string { + return r.TaskID +} + +func (r *TaskEvent) GetStatus() string { + return r.Status +} + +func (r *TaskEvent) GetState() string { + return r.State +} \ No newline at end of file From 7e9e00fcff8bcb3764582317469d512992b00d4e Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 18:57:14 +0100 Subject: [PATCH 0660/2352] [core] Remove obsolete events and update protos --- coconut/protos/o2control.pb.go | 3734 ++++++++---------------- core/globalstate.go | 7 +- core/protos/coreevents.go | 128 - core/protos/o2control.pb.go | 3734 ++++++++---------------- core/protos/o2control.proto | 61 +- core/protos/protoutils.go | 37 + core/server.go | 2 - core/task/coreevent.go | 29 +- core/task/manager.go | 16 - core/task/{taskutil.go => safeacks.go} | 33 - core/task/scheduler.go | 3 - core/task/subscriber.go | 97 - 12 files changed, 2591 insertions(+), 5290 deletions(-) delete mode 100644 core/protos/coreevents.go create mode 100644 core/protos/protoutils.go rename core/task/{taskutil.go => safeacks.go} (71%) delete mode 100644 core/task/subscriber.go diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 9cfa28fee..b2d5f0a6b 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,28 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -type Ev_EnvironmentStateChanged struct { - Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` +type Ev_EnvironmentEvent struct { + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } -func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } +func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentEvent) ProtoMessage() {} +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,114 +192,67 @@ func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) +func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) } -func (m *Ev_EnvironmentStateChanged) XXX_Size() int { +func (m *Ev_EnvironmentEvent) XXX_Size() int { return m.Size() } -func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) +func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { +func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { if m != nil { - return m.Environmentid + return m.EnvironmentId } return "" } -func (m *Ev_EnvironmentStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetState() string { if m != nil { return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { +func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if m != nil { return m.CurrentRunNumber } return 0 } -type Ev_TaskStateChanged struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } -func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStateChanged) ProtoMessage() {} -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) -} -func (m *Ev_TaskStateChanged) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo - -func (m *Ev_TaskStateChanged) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" -} - -func (m *Ev_TaskStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetError() string { if m != nil { - return m.State + return m.Error } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } -func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} +func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } +func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskEvent) ProtoMessage() {} +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -308,99 +262,60 @@ func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) +func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskEvent.Merge(m, src) } -func (m *Ev_TaskStatusChanged) XXX_Size() int { +func (m *Ev_TaskEvent) XXX_Size() int { return m.Size() } -func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) +func (m *Ev_TaskEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo -func (m *Ev_TaskStatusChanged) GetTaskid() string { +func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid } return "" } -func (m *Ev_TaskStatusChanged) GetStatus() string { +func (m *Ev_TaskEvent) GetState() string { if m != nil { - return m.Status + return m.State } return "" } -type Ev_TaskLaunched struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } -func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskLaunched) ProtoMessage() {} -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) -} -func (m *Ev_TaskLaunched) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo - -func (m *Ev_TaskLaunched) GetTaskid() string { +func (m *Ev_TaskEvent) GetStatus() string { if m != nil { - return m.Taskid + return m.Status } return "" } -type Ev_MesosTaskCreated struct { - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` +type Ev_RoleEvent struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } -func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_MesosTaskCreated) ProtoMessage() {} -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} +func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } +func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_RoleEvent) ProtoMessage() {} +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { +func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -410,236 +325,39 @@ func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) +func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_RoleEvent.Merge(m, src) } -func (m *Ev_MesosTaskCreated) XXX_Size() int { +func (m *Ev_RoleEvent) XXX_Size() int { return m.Size() } -func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) +func (m *Ev_RoleEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo - -func (m *Ev_MesosTaskCreated) GetTaskresources() string { - if m != nil { - return m.Taskresources - } - return "" -} +var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo -func (m *Ev_MesosTaskCreated) GetExecutorResources() string { +func (m *Ev_RoleEvent) GetName() string { if m != nil { - return m.ExecutorResources + return m.Name } return "" } -type Ev_EnvironmentCreated struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } -func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentCreated) ProtoMessage() {} -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) -} -func (m *Ev_EnvironmentCreated) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo - -func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil -} - -type Ev_EnvironmentDestroyed struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } -func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) -} -func (m *Ev_EnvironmentDestroyed) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo - -func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil -} - -func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (m *Ev_RoleEvent) GetStatus() string { if m != nil { - return m.Environmentid + return m.Status } return "" } -type Ev_EnvironmentError struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } -func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentError) ProtoMessage() {} -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) -} -func (m *Ev_EnvironmentError) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo - -func (m *Ev_EnvironmentError) GetError() string { +func (m *Ev_RoleEvent) GetState() string { if m != nil { - return m.Error + return m.State } return "" } -func (m *Ev_EnvironmentError) GetCloseStream() bool { - if m != nil { - return m.CloseStream - } - return false -} - -type Ev_TasksKilled struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } -func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } -func (*Ev_TasksKilled) ProtoMessage() {} -func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TasksKilled.Merge(m, src) -} -func (m *Ev_TasksKilled) XXX_Size() int { - return m.Size() -} -func (m *Ev_TasksKilled) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo - -func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks - } - return nil -} - //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -653,7 +371,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} + return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +412,7 @@ func (m *StatusReply) Reset() { *m = StatusReply{} } func (m *StatusReply) String() string { return proto.CompactTextString(m) } func (*StatusReply) ProtoMessage() {} func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} + return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -751,7 +469,7 @@ func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } func (*StatusUpdate) ProtoMessage() {} func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -823,15 +541,9 @@ func (*StatusUpdate) XXX_OneofWrappers() []interface{} { type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are valid to be assigned to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_Taskskilled + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -842,7 +554,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -877,43 +589,19 @@ type isEvent_Payload interface { Size() int } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` -} -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` -} -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` -} -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` -} -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` -} -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` -} -type Event_Taskskilled struct { - Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` } -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (*Event_EnvironmentCreated) isEvent_Payload() {} -func (*Event_TaskStateChanged) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} -func (*Event_MesosTaskcreated) isEvent_Payload() {} -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} -func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_Taskskilled) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -929,65 +617,23 @@ func (m *Event) GetTimestamp() string { return "" } -func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated - } - return nil -} - -func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged - } - return nil -} - -func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (m *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed +func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError +func (m *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := m.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (m *Event) GetTaskskilled() *Ev_TasksKilled { - if x, ok := m.GetPayload().(*Event_Taskskilled); ok { - return x.Taskskilled +func (m *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := m.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -995,19 +641,14 @@ func (m *Event) GetTaskskilled() *Ev_TasksKilled { // XXX_OneofWrappers is for the internal use of the proto package. func (*Event) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_Taskskilled)(nil), + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } } type SubscribeRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1017,7 +658,7 @@ func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeRequest) ProtoMessage() {} func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1046,6 +687,13 @@ func (m *SubscribeRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (m *SubscribeRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -1059,7 +707,7 @@ func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoRequest) ProtoMessage() {} func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1104,7 +752,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1192,7 +840,7 @@ func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoReply) ProtoMessage() {} func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +930,7 @@ func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } func (*TeardownRequest) ProtoMessage() {} func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +976,7 @@ func (m *TeardownReply) Reset() { *m = TeardownReply{} } func (m *TeardownReply) String() string { return proto.CompactTextString(m) } func (*TeardownReply) ProtoMessage() {} func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1370,7 +1018,7 @@ func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsRequest) ProtoMessage() {} func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} + return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1411,7 +1059,7 @@ func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsReply) ProtoMessage() {} func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} + return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1473,7 +1121,7 @@ func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } func (*EnvironmentInfo) ProtoMessage() {} func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} + return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1577,7 +1225,7 @@ func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentRequest) ProtoMessage() {} func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1631,7 +1279,7 @@ func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentReply) ProtoMessage() {} func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,6 +1315,69 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } +func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} +} +func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) +} +func (m *NewAutoEnvironmentRequest) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo + +func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if m != nil { + return m.WorkflowTemplate + } + return "" +} + +func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *NewAutoEnvironmentRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + type NewAutoEnvironmentReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1677,7 +1388,7 @@ func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewAutoEnvironmentReply) ProtoMessage() {} func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1717,7 +1428,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1765,7 +1476,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1820,7 +1531,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1587,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1939,7 +1650,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2001,7 +1712,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2057,7 +1768,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2121,7 +1832,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2189,7 +1900,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +1953,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2295,7 +2006,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2051,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2112,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2459,7 +2170,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2565,7 +2276,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2632,7 +2343,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2383,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2719,7 +2430,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2766,7 +2477,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2814,7 +2525,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,7 +2583,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,7 +2660,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3017,7 +2728,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3113,7 +2824,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +2872,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3219,7 +2930,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3281,7 +2992,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3095,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3434,7 +3145,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3504,7 +3215,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3565,7 +3276,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3322,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3653,7 +3364,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3715,7 +3426,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3481,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3825,7 +3536,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3879,7 +3590,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3926,7 +3637,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3973,7 +3684,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4020,7 +3731,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4067,7 +3778,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4115,7 +3826,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4169,7 +3880,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4215,7 +3926,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{69} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4249,15 +3960,9 @@ func init() { proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") - proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") - proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") - proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") - proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") - proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") - proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") - proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") + proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") + proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") + proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4277,6 +3982,8 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -4333,201 +4040,188 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, - 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, - 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, - 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, - 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, - 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, - 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, - 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, - 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, - 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, - 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, - 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, - 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, - 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, - 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, - 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, - 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, - 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, - 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, - 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, - 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, - 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, - 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, - 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, - 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, - 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, - 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, - 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, - 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, - 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, - 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, - 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, - 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, - 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, - 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, - 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, - 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, - 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, - 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, - 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, - 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, - 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, - 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, - 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, - 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, - 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, - 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, - 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, - 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, - 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, - 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, - 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, - 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, - 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, - 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, - 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, - 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, - 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, - 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, - 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, - 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, - 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, - 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, - 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, - 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, - 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, - 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, - 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, - 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, - 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, - 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, - 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, - 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, - 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, - 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, - 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, - 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, - 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, - 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, - 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, - 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, - 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, - 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, - 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, - 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, - 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, - 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, - 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, - 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, - 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, - 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, - 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, - 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, - 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, - 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, - 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, - 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, - 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, - 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, - 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, - 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, - 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, - 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, - 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, - 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, - 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, - 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, - 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, - 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, - 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, - 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, - 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, - 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, - 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, - 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, - 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, - 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, - 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, - 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, - 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, - 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, - 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, - 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, - 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, - 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, - 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, - 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, - 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, - 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, - 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, - 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, - 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, - 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, - 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, - 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, - 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, - 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, - 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, - 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, - 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, - 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, - 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, - 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, - 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, - 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, - 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, - 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, - 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, - 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, - 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, - 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, - 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, - 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, - 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, - 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, - 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, - 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, - 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, - 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, - 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, - 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, - 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, - 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, - 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, - 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, - 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, - 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, - 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, - 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, - 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, - 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, - 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, - 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, - 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, - 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, - 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, - 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, - 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, - 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, - 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, - 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, - 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, - 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, - 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, - 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, - 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, - 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, - 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, + // 2890 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, + 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, + 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, + 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, + 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, + 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, + 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, + 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, + 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, + 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, + 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, + 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, + 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, + 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, + 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, + 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, + 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, + 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, + 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, + 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, + 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, + 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, + 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, + 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, + 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, + 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, + 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, + 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, + 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, + 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, + 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, + 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, + 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, + 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, + 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, + 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, + 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, + 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, + 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, + 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, + 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, + 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, + 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, + 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, + 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, + 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, + 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, + 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, + 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, + 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, + 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, + 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, + 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, + 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, + 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, + 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, + 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, + 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, + 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, + 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, + 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, + 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, + 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, + 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, + 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, + 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, + 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, + 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, + 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, + 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, + 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, + 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, + 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, + 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, + 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, + 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, + 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, + 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, + 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, + 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, + 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, + 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, + 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, + 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, + 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, + 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, + 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, + 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, + 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, + 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, + 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, + 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, + 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, + 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, + 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, + 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, + 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, + 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, + 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, + 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, + 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, + 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, + 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, + 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, + 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, + 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, + 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, + 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, + 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, + 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, + 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, + 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, + 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, + 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, + 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, + 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, + 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, + 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, + 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, + 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, + 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, + 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, + 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, + 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, + 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, + 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, + 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, + 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, + 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, + 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, + 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, + 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, + 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, + 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, + 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, + 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, + 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, + 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, + 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, + 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, + 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, + 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, + 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, + 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, + 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, + 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, + 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, + 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, + 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, + 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, + 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, + 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, + 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, + 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, + 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, + 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, + 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, + 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, + 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, + 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, + 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, + 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, + 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, + 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, + 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, + 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, + 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, + 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, + 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, + 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, + 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, + 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, + 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, + 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, + 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, + 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, + 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, + 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, + 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4240,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,36 +4328,13 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) if err != nil { return nil, err } - x := &controlNewAutoEnvironmentClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_NewAutoEnvironmentClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlNewAutoEnvironmentClient struct { - grpc.ClientStream -} - -func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil + return out, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4820,7 +4491,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4857,7 +4528,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4894,8 +4565,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { - return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5031,25 +4702,22 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(NewEnvironmentRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) -} - -type Control_NewAutoEnvironmentServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlNewAutoEnvironmentServer struct { - grpc.ServerStream -} - -func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5395,6 +5063,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5470,11 +5142,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, - { - StreamName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - ServerStreams: true, - }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5511,7 +5178,7 @@ func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5521,12 +5188,12 @@ func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5535,6 +5202,13 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x22 + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -5547,17 +5221,17 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i-- dAtA[i] = 0x12 } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if len(m.EnvironmentId) > 0 { + i -= len(m.EnvironmentId) + copy(dAtA[i:], m.EnvironmentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5567,12 +5241,12 @@ func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5581,6 +5255,13 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x1a + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -5598,7 +5279,7 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5608,12 +5289,12 @@ func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5622,6 +5303,13 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) @@ -5629,17 +5317,17 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5649,12 +5337,12 @@ func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5663,17 +5351,10 @@ func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5683,12 +5364,12 @@ func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5697,24 +5378,31 @@ func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ExecutorResources) > 0 { - i -= len(m.ExecutorResources) - copy(dAtA[i:], m.ExecutorResources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) - i-- - dAtA[i] = 0x12 + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if len(m.Taskresources) > 0 { - i -= len(m.Taskresources) - copy(dAtA[i:], m.Taskresources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) - i-- + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5724,12 +5412,12 @@ func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5738,9 +5426,33 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { + if m.Event != nil { { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MesosHeartbeat != nil { + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5748,12 +5460,11 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5763,12 +5474,12 @@ func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5777,16 +5488,56 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentEvent != nil { + { + size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } - if m.CleanupTasksReply != nil { + return len(dAtA) - i, nil +} +func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskEvent != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5794,12 +5545,32 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } return len(dAtA) - i, nil } +func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} -func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { +func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.RoleEvent != nil { + { + size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5809,12 +5580,12 @@ func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5823,27 +5594,17 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CloseStream { - i-- - if m.CloseStream { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5853,12 +5614,12 @@ func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5867,24 +5628,10 @@ func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5894,12 +5641,12 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5908,10 +5655,46 @@ func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5921,12 +5704,12 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5935,31 +5718,58 @@ func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a + } + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5969,12 +5779,12 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5983,45 +5793,17 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6031,12 +5813,12 @@ func (m *Event) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6045,215 +5827,10 @@ func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentStateChanged != nil { - { - size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentCreated != nil { - { - size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStateChanged != nil { - { - size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStatusChanged != nil { - { - size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Tasklaunched != nil { - { - size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} -func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosTaskcreated != nil { - { - size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentDestroyed != nil { - { - size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentError != nil { - { - size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } return len(dAtA) - i, nil } -func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} -func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Taskskilled != nil { - { - size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6263,12 +5840,12 @@ func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6280,7 +5857,7 @@ func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6290,12 +5867,12 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6304,10 +5881,31 @@ func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Version) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6317,286 +5915,12 @@ func (m *Version) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Version) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,7 +6128,7 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6814,12 +6138,12 @@ func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6828,7 +6152,67 @@ func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { @@ -8964,13 +8348,13 @@ func (m *Event_MesosHeartbeat) Size() (n int) { return n } -func (m *Ev_EnvironmentStateChanged) Size() (n int) { +func (m *Ev_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Environmentid) + l = len(m.EnvironmentId) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8981,23 +8365,7 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) + l = len(m.Error) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9007,7 +8375,7 @@ func (m *Ev_TaskStateChanged) Size() (n int) { return n } -func (m *Ev_TaskStatusChanged) Size() (n int) { +func (m *Ev_TaskEvent) Size() (n int) { if m == nil { return 0 } @@ -9017,23 +8385,11 @@ func (m *Ev_TaskStatusChanged) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Status) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskLaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9043,93 +8399,24 @@ func (m *Ev_TaskLaunched) Size() (n int) { return n } -func (m *Ev_MesosTaskCreated) Size() (n int) { +func (m *Ev_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Taskresources) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorResources) + l = len(m.Name) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentDestroyed) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Environmentid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.CloseStream { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TasksKilled) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9219,120 +8506,52 @@ func (m *Event) Size() (n int) { return n } -func (m *Event_EnvironmentStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentStateChanged != nil { - l = m.EnvironmentStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentCreated != nil { - l = m.EnvironmentCreated.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStateChanged != nil { - l = m.TaskStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStatusChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStatusChanged != nil { - l = m.TaskStatusChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_Tasklaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Tasklaunched != nil { - l = m.Tasklaunched.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_MesosTaskcreated) Size() (n int) { +func (m *Event_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.MesosTaskcreated != nil { - l = m.MesosTaskcreated.Size() + if m.EnvironmentEvent != nil { + l = m.EnvironmentEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentDestroyed) Size() (n int) { +func (m *Event_TaskEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentDestroyed != nil { - l = m.EnvironmentDestroyed.Size() + if m.TaskEvent != nil { + l = m.TaskEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentError) Size() (n int) { +func (m *Event_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentError != nil { - l = m.EnvironmentError.Size() + if m.RoleEvent != nil { + l = m.RoleEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_Taskskilled) Size() (n int) { +func (m *SubscribeRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Taskskilled != nil { - l = m.Taskskilled.Size() + l = len(m.Id) + if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9584,6 +8803,34 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *NewAutoEnvironmentReply) Size() (n int) { if m == nil { return 0 @@ -10555,452 +9802,25 @@ func (m *SetRepoDefaultRevisionReply) Size() (n int) { return n } -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environmentid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStatusChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *Empty) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 } -func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11023,44 +9843,12 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_TaskLaunched: wiretype end group for non-group") + return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11086,7 +9874,7 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { +func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11109,15 +9897,15 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_EnvironmentEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11145,11 +9933,11 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Taskresources = string(dAtA[iNdEx:postIndex]) + m.EnvironmentId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11177,67 +9965,32 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11247,27 +10000,23 @@ func (m *Ev_EnvironmentCreated) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11294,7 +10043,7 @@ func (m *Ev_EnvironmentCreated) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { +func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11317,17 +10066,17 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TaskEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TaskEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11337,31 +10086,59 @@ func (m *Ev_EnvironmentDestroyed) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11389,7 +10166,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environmentid = string(dAtA[iNdEx:postIndex]) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11416,7 +10193,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { +func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11439,15 +10216,15 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentError: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_RoleEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_RoleEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11475,13 +10252,13 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11491,71 +10268,29 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.CloseStream = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TasksKilled) 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 ErrIntOverflowO2Control - } - 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: Ev_TasksKilled: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11565,25 +10300,23 @@ func (m *Ev_TasksKilled) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11955,7 +10688,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11982,15 +10715,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentStateChanged{} + v := &Ev_EnvironmentEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentStateChanged{v} + m.Payload = &Event_EnvironmentEvent{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12017,225 +10750,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentCreated{} + v := &Ev_TaskEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentCreated{v} + m.Payload = &Event_TaskEvent{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStateChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStateChanged{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStatusChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStatusChanged{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskLaunched{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_Tasklaunched{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_MesosTaskCreated{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_MesosTaskcreated{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentDestroyed{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentDestroyed{v} - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentError{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentError{v} - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12262,11 +10785,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_TasksKilled{} + v := &Ev_RoleEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_Taskskilled{v} + m.Payload = &Event_RoleEvent{v} iNdEx = postIndex default: iNdEx = preIndex @@ -12312,16 +10835,48 @@ func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubscribeRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -14084,6 +12639,251 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NewAutoEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/globalstate.go b/core/globalstate.go index c539ccafe..871e62a81 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -54,16 +54,13 @@ func newGlobalState(shutdown func()) (*globalState, error) { log.WithField("data", string(cfgBytes)).Trace("configuration dump") } - eventFeed := task.NewEventFeed() - state := &globalState{ - PublicEventFeed: eventFeed, shutdown: shutdown, environments: nil, } internalEventCh := make(chan event.Event) - taskman, err := task.NewManager(shutdown, eventFeed, internalEventCh) + taskman, err := task.NewManager(shutdown, internalEventCh) if err != nil { return nil, err } @@ -84,6 +81,4 @@ type globalState struct { environments *environment.Manager taskman *task.Manager - PublicEventFeed *task.EventFeed - } diff --git a/core/protos/coreevents.go b/core/protos/coreevents.go deleted file mode 100644 index 83a209dcd..000000000 --- a/core/protos/coreevents.go +++ /dev/null @@ -1,128 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package pb - -import ( - "strconv" - "time" - - "github.com/AliceO2Group/Control/common/utils/uid" -) - -func NewEnvironmentStateEvent(envId uid.ID, state, rn string) *Event { - var te Ev_EnvironmentStateChanged - var tEvnt Event_EnvironmentStateChanged - te.State = state - te.Environmentid = envId.String() - currentRunNumber, err := strconv.ParseUint(rn, 10, 32) - if err != nil { - te.CurrentRunNumber = uint32(currentRunNumber) - } - - tEvnt.EnvironmentStateChanged=&te - return WrapEvent(&tEvnt) -} - -func NewEnvironmentCreatedEvent(ei *EnvironmentInfo) *Event { - var ec Event_EnvironmentCreated - ec.EnvironmentCreated = &Ev_EnvironmentCreated{ - Environment: ei, - } - return WrapEvent(&ec) -} - -func NewEnvironmentDestroyedEvent(ctrl *CleanupTasksReply, envid string) *Event { - var de Event_EnvironmentDestroyed - de.EnvironmentDestroyed = &Ev_EnvironmentDestroyed{ - CleanupTasksReply: ctrl, - Environmentid: envid, - } - return WrapEvent(&de) -} - -func NewEnvironmentErrorEvent(errSt string, close bool) *Event { - var ee Event_EnvironmentError - ee.EnvironmentError = &Ev_EnvironmentError{ - Error: errSt, - CloseStream: close, - } - return WrapEvent(&ee) -} - -func NewEventTaskState(taskid,state string) *Event { - var sc Ev_TaskStateChanged - var stCh Event_TaskStateChanged - sc.Taskid = taskid - sc.State = state - stCh.TaskStateChanged = &sc - return WrapEvent(&stCh) -} - -func NewEventTaskStatus(taskid,status string) *Event { - var etSt Event_TaskStatusChanged - - etSt.TaskStatusChanged = &Ev_TaskStatusChanged{ - Taskid: taskid, - Status: status, - } - - return WrapEvent(&etSt) -} - -func NewEventTaskLaunch(taskid string) *Event { - var ltask Ev_TaskLaunched - var eltask Event_Tasklaunched - - ltask.Taskid = taskid - eltask.Tasklaunched = <ask - - return WrapEvent(&eltask) -} - -func NewEventMesosTaskCreated(resourcesRequest,executorResources string) *Event { - var mtask Ev_MesosTaskCreated - var emtask Event_MesosTaskcreated - - mtask.ExecutorResources = executorResources - mtask.Taskresources = resourcesRequest - emtask.MesosTaskcreated = &mtask - - return WrapEvent(&emtask) -} - -func NewKillTasksEvent(killed []*ShortTaskInfo) *Event { - var ke Event_Taskskilled - ke.Taskskilled = &Ev_TasksKilled{ - KilledTasks: killed, - } - return WrapEvent(&ke) -} - -func WrapEvent(ce isEvent_Payload) *Event { - return &Event{ - Timestamp:time.Now().Format(time.RFC3339), - Payload: ce, - } -} diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 9cfa28fee..b2d5f0a6b 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -54,7 +54,7 @@ func (x StatusUpdate_Level) String() string { } func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -91,7 +91,7 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -119,7 +119,7 @@ func (x EnvironmentOperation_Optype) String() string { } func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31, 0} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} } type Event_MesosHeartbeat struct { @@ -161,27 +161,28 @@ func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo -type Ev_EnvironmentStateChanged struct { - Environmentid string `protobuf:"bytes,1,opt,name=environmentid,proto3" json:"environmentid,omitempty"` +type Ev_EnvironmentEvent struct { + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_EnvironmentStateChanged) Reset() { *m = Ev_EnvironmentStateChanged{} } -func (m *Ev_EnvironmentStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } +func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_EnvironmentEvent) ProtoMessage() {} +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return fileDescriptor_2aa6aa9a1f02efa9, []int{1} } -func (m *Ev_EnvironmentStateChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_EnvironmentStateChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -191,114 +192,67 @@ func (m *Ev_EnvironmentStateChanged) XXX_Marshal(b []byte, deterministic bool) ( return b[:n], nil } } -func (m *Ev_EnvironmentStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentStateChanged.Merge(m, src) +func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) } -func (m *Ev_EnvironmentStateChanged) XXX_Size() int { +func (m *Ev_EnvironmentEvent) XXX_Size() int { return m.Size() } -func (m *Ev_EnvironmentStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentStateChanged.DiscardUnknown(m) +func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_EnvironmentStateChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo -func (m *Ev_EnvironmentStateChanged) GetEnvironmentid() string { +func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { if m != nil { - return m.Environmentid + return m.EnvironmentId } return "" } -func (m *Ev_EnvironmentStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetState() string { if m != nil { return m.State } return "" } -func (m *Ev_EnvironmentStateChanged) GetCurrentRunNumber() uint32 { +func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if m != nil { return m.CurrentRunNumber } return 0 } -type Ev_TaskStateChanged struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskStateChanged) Reset() { *m = Ev_TaskStateChanged{} } -func (m *Ev_TaskStateChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStateChanged) ProtoMessage() {} -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskStateChanged) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskStateChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskStateChanged.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskStateChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStateChanged.Merge(m, src) -} -func (m *Ev_TaskStateChanged) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskStateChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStateChanged.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskStateChanged proto.InternalMessageInfo - -func (m *Ev_TaskStateChanged) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" -} - -func (m *Ev_TaskStateChanged) GetState() string { +func (m *Ev_EnvironmentEvent) GetError() string { if m != nil { - return m.State + return m.Error } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_TaskStatusChanged) Reset() { *m = Ev_TaskStatusChanged{} } -func (m *Ev_TaskStatusChanged) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} +func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } +func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_TaskEvent) ProtoMessage() {} +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{2} } -func (m *Ev_TaskStatusChanged) XXX_Unmarshal(b []byte) error { +func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_TaskStatusChanged.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -308,99 +262,60 @@ func (m *Ev_TaskStatusChanged) XXX_Marshal(b []byte, deterministic bool) ([]byte return b[:n], nil } } -func (m *Ev_TaskStatusChanged) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskStatusChanged.Merge(m, src) +func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_TaskEvent.Merge(m, src) } -func (m *Ev_TaskStatusChanged) XXX_Size() int { +func (m *Ev_TaskEvent) XXX_Size() int { return m.Size() } -func (m *Ev_TaskStatusChanged) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskStatusChanged.DiscardUnknown(m) +func (m *Ev_TaskEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_TaskStatusChanged proto.InternalMessageInfo +var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo -func (m *Ev_TaskStatusChanged) GetTaskid() string { +func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid } return "" } -func (m *Ev_TaskStatusChanged) GetStatus() string { +func (m *Ev_TaskEvent) GetState() string { if m != nil { - return m.Status + return m.State } return "" } -type Ev_TaskLaunched struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskLaunched) Reset() { *m = Ev_TaskLaunched{} } -func (m *Ev_TaskLaunched) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskLaunched) ProtoMessage() {} -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *Ev_TaskLaunched) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskLaunched) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskLaunched.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskLaunched) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskLaunched.Merge(m, src) -} -func (m *Ev_TaskLaunched) XXX_Size() int { - return m.Size() -} -func (m *Ev_TaskLaunched) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskLaunched.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TaskLaunched proto.InternalMessageInfo - -func (m *Ev_TaskLaunched) GetTaskid() string { +func (m *Ev_TaskEvent) GetStatus() string { if m != nil { - return m.Taskid + return m.Status } return "" } -type Ev_MesosTaskCreated struct { - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` +type Ev_RoleEvent struct { + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` } -func (m *Ev_MesosTaskCreated) Reset() { *m = Ev_MesosTaskCreated{} } -func (m *Ev_MesosTaskCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_MesosTaskCreated) ProtoMessage() {} -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} +func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } +func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } +func (*Ev_RoleEvent) ProtoMessage() {} +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{3} } -func (m *Ev_MesosTaskCreated) XXX_Unmarshal(b []byte) error { +func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) } -func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { +func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { if deterministic { - return xxx_messageInfo_Ev_MesosTaskCreated.Marshal(b, m, deterministic) + return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) } else { b = b[:cap(b)] n, err := m.MarshalToSizedBuffer(b) @@ -410,236 +325,39 @@ func (m *Ev_MesosTaskCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, return b[:n], nil } } -func (m *Ev_MesosTaskCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_MesosTaskCreated.Merge(m, src) +func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { + xxx_messageInfo_Ev_RoleEvent.Merge(m, src) } -func (m *Ev_MesosTaskCreated) XXX_Size() int { +func (m *Ev_RoleEvent) XXX_Size() int { return m.Size() } -func (m *Ev_MesosTaskCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_MesosTaskCreated.DiscardUnknown(m) +func (m *Ev_RoleEvent) XXX_DiscardUnknown() { + xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) } -var xxx_messageInfo_Ev_MesosTaskCreated proto.InternalMessageInfo - -func (m *Ev_MesosTaskCreated) GetTaskresources() string { - if m != nil { - return m.Taskresources - } - return "" -} +var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo -func (m *Ev_MesosTaskCreated) GetExecutorResources() string { +func (m *Ev_RoleEvent) GetName() string { if m != nil { - return m.ExecutorResources + return m.Name } return "" } -type Ev_EnvironmentCreated struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentCreated) Reset() { *m = Ev_EnvironmentCreated{} } -func (m *Ev_EnvironmentCreated) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentCreated) ProtoMessage() {} -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *Ev_EnvironmentCreated) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentCreated) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentCreated.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentCreated) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentCreated.Merge(m, src) -} -func (m *Ev_EnvironmentCreated) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentCreated) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentCreated.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentCreated proto.InternalMessageInfo - -func (m *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil -} - -type Ev_EnvironmentDestroyed struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentDestroyed) Reset() { *m = Ev_EnvironmentDestroyed{} } -func (m *Ev_EnvironmentDestroyed) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Ev_EnvironmentDestroyed) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentDestroyed) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentDestroyed.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentDestroyed) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentDestroyed.Merge(m, src) -} -func (m *Ev_EnvironmentDestroyed) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentDestroyed) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentDestroyed.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentDestroyed proto.InternalMessageInfo - -func (m *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil -} - -func (m *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (m *Ev_RoleEvent) GetStatus() string { if m != nil { - return m.Environmentid + return m.Status } return "" } -type Ev_EnvironmentError struct { - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` - CloseStream bool `protobuf:"varint,2,opt,name=closeStream,proto3" json:"closeStream,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentError) Reset() { *m = Ev_EnvironmentError{} } -func (m *Ev_EnvironmentError) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentError) ProtoMessage() {} -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *Ev_EnvironmentError) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentError) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentError.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_EnvironmentError) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentError.Merge(m, src) -} -func (m *Ev_EnvironmentError) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentError) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentError.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_EnvironmentError proto.InternalMessageInfo - -func (m *Ev_EnvironmentError) GetError() string { +func (m *Ev_RoleEvent) GetState() string { if m != nil { - return m.Error + return m.State } return "" } -func (m *Ev_EnvironmentError) GetCloseStream() bool { - if m != nil { - return m.CloseStream - } - return false -} - -type Ev_TasksKilled struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TasksKilled) Reset() { *m = Ev_TasksKilled{} } -func (m *Ev_TasksKilled) String() string { return proto.CompactTextString(m) } -func (*Ev_TasksKilled) ProtoMessage() {} -func (*Ev_TasksKilled) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *Ev_TasksKilled) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TasksKilled) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TasksKilled.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TasksKilled) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TasksKilled.Merge(m, src) -} -func (m *Ev_TasksKilled) XXX_Size() int { - return m.Size() -} -func (m *Ev_TasksKilled) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TasksKilled.DiscardUnknown(m) -} - -var xxx_messageInfo_Ev_TasksKilled proto.InternalMessageInfo - -func (m *Ev_TasksKilled) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks - } - return nil -} - //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -653,7 +371,7 @@ func (m *StatusRequest) Reset() { *m = StatusRequest{} } func (m *StatusRequest) String() string { return proto.CompactTextString(m) } func (*StatusRequest) ProtoMessage() {} func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} + return fileDescriptor_2aa6aa9a1f02efa9, []int{4} } func (m *StatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -694,7 +412,7 @@ func (m *StatusReply) Reset() { *m = StatusReply{} } func (m *StatusReply) String() string { return proto.CompactTextString(m) } func (*StatusReply) ProtoMessage() {} func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} + return fileDescriptor_2aa6aa9a1f02efa9, []int{5} } func (m *StatusReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -751,7 +469,7 @@ func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } func (*StatusUpdate) ProtoMessage() {} func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} + return fileDescriptor_2aa6aa9a1f02efa9, []int{6} } func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -823,15 +541,9 @@ func (*StatusUpdate) XXX_OneofWrappers() []interface{} { type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are valid to be assigned to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_Taskskilled + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -842,7 +554,7 @@ func (m *Event) Reset() { *m = Event{} } func (m *Event) String() string { return proto.CompactTextString(m) } func (*Event) ProtoMessage() {} func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} + return fileDescriptor_2aa6aa9a1f02efa9, []int{7} } func (m *Event) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -877,43 +589,19 @@ type isEvent_Payload interface { Size() int } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof" json:"environmentStateChanged,omitempty"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof" json:"environmentCreated,omitempty"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof" json:"taskStateChanged,omitempty"` -} -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof" json:"taskStatusChanged,omitempty"` -} -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof" json:"tasklaunched,omitempty"` -} -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof" json:"mesosTaskcreated,omitempty"` -} -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof" json:"environmentDestroyed,omitempty"` -} -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof" json:"environmentError,omitempty"` -} -type Event_Taskskilled struct { - Taskskilled *Ev_TasksKilled `protobuf:"bytes,10,opt,name=taskskilled,proto3,oneof" json:"taskskilled,omitempty"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` } -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (*Event_EnvironmentCreated) isEvent_Payload() {} -func (*Event_TaskStateChanged) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} -func (*Event_MesosTaskcreated) isEvent_Payload() {} -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} -func (*Event_EnvironmentError) isEvent_Payload() {} -func (*Event_Taskskilled) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -929,65 +617,23 @@ func (m *Event) GetTimestamp() string { return "" } -func (m *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := m.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (m *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := m.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated - } - return nil -} - -func (m *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := m.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged - } - return nil -} - -func (m *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := m.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (m *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := m.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (m *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := m.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (m *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := m.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed +func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (m *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := m.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError +func (m *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := m.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (m *Event) GetTaskskilled() *Ev_TasksKilled { - if x, ok := m.GetPayload().(*Event_Taskskilled); ok { - return x.Taskskilled +func (m *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := m.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -995,19 +641,14 @@ func (m *Event) GetTaskskilled() *Ev_TasksKilled { // XXX_OneofWrappers is for the internal use of the proto package. func (*Event) XXX_OneofWrappers() []interface{} { return []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_Taskskilled)(nil), + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } } type SubscribeRequest struct { + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1017,7 +658,7 @@ func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } func (*SubscribeRequest) ProtoMessage() {} func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} + return fileDescriptor_2aa6aa9a1f02efa9, []int{8} } func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1046,6 +687,13 @@ func (m *SubscribeRequest) XXX_DiscardUnknown() { var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (m *SubscribeRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + //////////////////////////////////////// // Framework //////////////////////////////////////// @@ -1059,7 +707,7 @@ func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoRequest) ProtoMessage() {} func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} + return fileDescriptor_2aa6aa9a1f02efa9, []int{9} } func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1104,7 +752,7 @@ func (m *Version) Reset() { *m = Version{} } func (m *Version) String() string { return proto.CompactTextString(m) } func (*Version) ProtoMessage() {} func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} + return fileDescriptor_2aa6aa9a1f02efa9, []int{10} } func (m *Version) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1192,7 +840,7 @@ func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } func (*GetFrameworkInfoReply) ProtoMessage() {} func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} + return fileDescriptor_2aa6aa9a1f02efa9, []int{11} } func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1282,7 +930,7 @@ func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } func (*TeardownRequest) ProtoMessage() {} func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} + return fileDescriptor_2aa6aa9a1f02efa9, []int{12} } func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1328,7 +976,7 @@ func (m *TeardownReply) Reset() { *m = TeardownReply{} } func (m *TeardownReply) String() string { return proto.CompactTextString(m) } func (*TeardownReply) ProtoMessage() {} func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} + return fileDescriptor_2aa6aa9a1f02efa9, []int{13} } func (m *TeardownReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1370,7 +1018,7 @@ func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsRequest) ProtoMessage() {} func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} + return fileDescriptor_2aa6aa9a1f02efa9, []int{14} } func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1411,7 +1059,7 @@ func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentsReply) ProtoMessage() {} func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} + return fileDescriptor_2aa6aa9a1f02efa9, []int{15} } func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1473,7 +1121,7 @@ func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } func (*EnvironmentInfo) ProtoMessage() {} func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} + return fileDescriptor_2aa6aa9a1f02efa9, []int{16} } func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1577,7 +1225,7 @@ func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentRequest) ProtoMessage() {} func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} + return fileDescriptor_2aa6aa9a1f02efa9, []int{17} } func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1631,7 +1279,7 @@ func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewEnvironmentReply) ProtoMessage() {} func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} + return fileDescriptor_2aa6aa9a1f02efa9, []int{18} } func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1667,6 +1315,69 @@ func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +type NewAutoEnvironmentRequest struct { + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } +func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } +func (*NewAutoEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_2aa6aa9a1f02efa9, []int{19} +} +func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) +} +func (m *NewAutoEnvironmentRequest) XXX_Size() int { + return m.Size() +} +func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { + xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo + +func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if m != nil { + return m.WorkflowTemplate + } + return "" +} + +func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { + if m != nil { + return m.Vars + } + return nil +} + +func (m *NewAutoEnvironmentRequest) GetId() string { + if m != nil { + return m.Id + } + return "" +} + type NewAutoEnvironmentReply struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1677,7 +1388,7 @@ func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*NewAutoEnvironmentReply) ProtoMessage() {} func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} + return fileDescriptor_2aa6aa9a1f02efa9, []int{20} } func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1717,7 +1428,7 @@ func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentRequest) ProtoMessage() {} func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} + return fileDescriptor_2aa6aa9a1f02efa9, []int{21} } func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1765,7 +1476,7 @@ func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentReply) ProtoMessage() {} func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} + return fileDescriptor_2aa6aa9a1f02efa9, []int{22} } func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1820,7 +1531,7 @@ func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentReq func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentRequest) ProtoMessage() {} func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} + return fileDescriptor_2aa6aa9a1f02efa9, []int{23} } func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1876,7 +1587,7 @@ func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ControlEnvironmentReply) ProtoMessage() {} func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} + return fileDescriptor_2aa6aa9a1f02efa9, []int{24} } func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -1939,7 +1650,7 @@ func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentReque func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentRequest) ProtoMessage() {} func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} + return fileDescriptor_2aa6aa9a1f02efa9, []int{25} } func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2001,7 +1712,7 @@ func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } func (*EnvironmentOperation) ProtoMessage() {} func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} + return fileDescriptor_2aa6aa9a1f02efa9, []int{26} } func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2057,7 +1768,7 @@ func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*ModifyEnvironmentReply) ProtoMessage() {} func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} + return fileDescriptor_2aa6aa9a1f02efa9, []int{27} } func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2121,7 +1832,7 @@ func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentReq func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentRequest) ProtoMessage() {} func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} + return fileDescriptor_2aa6aa9a1f02efa9, []int{28} } func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2189,7 +1900,7 @@ func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } func (*DestroyEnvironmentReply) ProtoMessage() {} func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} + return fileDescriptor_2aa6aa9a1f02efa9, []int{29} } func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2242,7 +1953,7 @@ func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentP func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} + return fileDescriptor_2aa6aa9a1f02efa9, []int{30} } func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2295,7 +2006,7 @@ func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPro func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} + return fileDescriptor_2aa6aa9a1f02efa9, []int{31} } func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2340,7 +2051,7 @@ func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentP func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} + return fileDescriptor_2aa6aa9a1f02efa9, []int{32} } func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2401,7 +2112,7 @@ func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPro func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} + return fileDescriptor_2aa6aa9a1f02efa9, []int{33} } func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2459,7 +2170,7 @@ func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } func (*ShortTaskInfo) ProtoMessage() {} func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} + return fileDescriptor_2aa6aa9a1f02efa9, []int{34} } func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2565,7 +2276,7 @@ func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } func (*TaskDeploymentInfo) ProtoMessage() {} func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} + return fileDescriptor_2aa6aa9a1f02efa9, []int{35} } func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2632,7 +2343,7 @@ func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } func (*GetTasksRequest) ProtoMessage() {} func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} + return fileDescriptor_2aa6aa9a1f02efa9, []int{36} } func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2672,7 +2383,7 @@ func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } func (*GetTasksReply) ProtoMessage() {} func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} + return fileDescriptor_2aa6aa9a1f02efa9, []int{37} } func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2719,7 +2430,7 @@ func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } func (*GetTaskRequest) ProtoMessage() {} func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} + return fileDescriptor_2aa6aa9a1f02efa9, []int{38} } func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2766,7 +2477,7 @@ func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } func (*GetTaskReply) ProtoMessage() {} func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} + return fileDescriptor_2aa6aa9a1f02efa9, []int{39} } func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2814,7 +2525,7 @@ func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } func (*TaskClassInfo) ProtoMessage() {} func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} + return fileDescriptor_2aa6aa9a1f02efa9, []int{40} } func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2872,7 +2583,7 @@ func (m *CommandInfo) Reset() { *m = CommandInfo{} } func (m *CommandInfo) String() string { return proto.CompactTextString(m) } func (*CommandInfo) ProtoMessage() {} func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} + return fileDescriptor_2aa6aa9a1f02efa9, []int{41} } func (m *CommandInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -2949,7 +2660,7 @@ func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } func (*ChannelInfo) ProtoMessage() {} func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} + return fileDescriptor_2aa6aa9a1f02efa9, []int{42} } func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3017,7 +2728,7 @@ func (m *TaskInfo) Reset() { *m = TaskInfo{} } func (m *TaskInfo) String() string { return proto.CompactTextString(m) } func (*TaskInfo) ProtoMessage() {} func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} + return fileDescriptor_2aa6aa9a1f02efa9, []int{43} } func (m *TaskInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3113,7 +2824,7 @@ func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } func (*CleanupTasksRequest) ProtoMessage() {} func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} + return fileDescriptor_2aa6aa9a1f02efa9, []int{44} } func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3161,7 +2872,7 @@ func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } func (*CleanupTasksReply) ProtoMessage() {} func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} + return fileDescriptor_2aa6aa9a1f02efa9, []int{45} } func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3219,7 +2930,7 @@ func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } func (*GetRolesRequest) ProtoMessage() {} func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} + return fileDescriptor_2aa6aa9a1f02efa9, []int{46} } func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3281,7 +2992,7 @@ func (m *RoleInfo) Reset() { *m = RoleInfo{} } func (m *RoleInfo) String() string { return proto.CompactTextString(m) } func (*RoleInfo) ProtoMessage() {} func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} + return fileDescriptor_2aa6aa9a1f02efa9, []int{47} } func (m *RoleInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3384,7 +3095,7 @@ func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } func (*GetRolesReply) ProtoMessage() {} func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} + return fileDescriptor_2aa6aa9a1f02efa9, []int{48} } func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3434,7 +3145,7 @@ func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplate func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} + return fileDescriptor_2aa6aa9a1f02efa9, []int{49} } func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3504,7 +3215,7 @@ func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } func (*WorkflowTemplateInfo) ProtoMessage() {} func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} + return fileDescriptor_2aa6aa9a1f02efa9, []int{50} } func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3565,7 +3276,7 @@ func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesR func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} + return fileDescriptor_2aa6aa9a1f02efa9, []int{51} } func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3611,7 +3322,7 @@ func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } func (*ListReposRequest) ProtoMessage() {} func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} + return fileDescriptor_2aa6aa9a1f02efa9, []int{52} } func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3653,7 +3364,7 @@ func (m *RepoInfo) Reset() { *m = RepoInfo{} } func (m *RepoInfo) String() string { return proto.CompactTextString(m) } func (*RepoInfo) ProtoMessage() {} func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} + return fileDescriptor_2aa6aa9a1f02efa9, []int{53} } func (m *RepoInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3715,7 +3426,7 @@ func (m *ListReposReply) Reset() { *m = ListReposReply{} } func (m *ListReposReply) String() string { return proto.CompactTextString(m) } func (*ListReposReply) ProtoMessage() {} func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} + return fileDescriptor_2aa6aa9a1f02efa9, []int{54} } func (m *ListReposReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3770,7 +3481,7 @@ func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } func (*AddRepoRequest) ProtoMessage() {} func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} + return fileDescriptor_2aa6aa9a1f02efa9, []int{55} } func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3825,7 +3536,7 @@ func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } func (*AddRepoReply) ProtoMessage() {} func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} + return fileDescriptor_2aa6aa9a1f02efa9, []int{56} } func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3879,7 +3590,7 @@ func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } func (*RemoveRepoRequest) ProtoMessage() {} func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} + return fileDescriptor_2aa6aa9a1f02efa9, []int{57} } func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3926,7 +3637,7 @@ func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } func (*RemoveRepoReply) ProtoMessage() {} func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} + return fileDescriptor_2aa6aa9a1f02efa9, []int{58} } func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -3973,7 +3684,7 @@ func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } func (*RefreshReposRequest) ProtoMessage() {} func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} + return fileDescriptor_2aa6aa9a1f02efa9, []int{59} } func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4020,7 +3731,7 @@ func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } func (*SetDefaultRepoRequest) ProtoMessage() {} func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{65} + return fileDescriptor_2aa6aa9a1f02efa9, []int{60} } func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4067,7 +3778,7 @@ func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaul func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{66} + return fileDescriptor_2aa6aa9a1f02efa9, []int{61} } func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4115,7 +3826,7 @@ func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRev func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{67} + return fileDescriptor_2aa6aa9a1f02efa9, []int{62} } func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4169,7 +3880,7 @@ func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevis func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{68} + return fileDescriptor_2aa6aa9a1f02efa9, []int{63} } func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4215,7 +3926,7 @@ func (m *Empty) Reset() { *m = Empty{} } func (m *Empty) String() string { return proto.CompactTextString(m) } func (*Empty) ProtoMessage() {} func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{69} + return fileDescriptor_2aa6aa9a1f02efa9, []int{64} } func (m *Empty) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -4249,15 +3960,9 @@ func init() { proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentStateChanged)(nil), "o2control.Ev_EnvironmentStateChanged") - proto.RegisterType((*Ev_TaskStateChanged)(nil), "o2control.Ev_TaskStateChanged") - proto.RegisterType((*Ev_TaskStatusChanged)(nil), "o2control.Ev_TaskStatusChanged") - proto.RegisterType((*Ev_TaskLaunched)(nil), "o2control.Ev_TaskLaunched") - proto.RegisterType((*Ev_MesosTaskCreated)(nil), "o2control.Ev_MesosTaskCreated") - proto.RegisterType((*Ev_EnvironmentCreated)(nil), "o2control.Ev_EnvironmentCreated") - proto.RegisterType((*Ev_EnvironmentDestroyed)(nil), "o2control.Ev_EnvironmentDestroyed") - proto.RegisterType((*Ev_EnvironmentError)(nil), "o2control.Ev_EnvironmentError") - proto.RegisterType((*Ev_TasksKilled)(nil), "o2control.Ev_TasksKilled") + proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") + proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") + proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") @@ -4277,6 +3982,8 @@ func init() { proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") + proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") + proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") @@ -4333,201 +4040,188 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 3094 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xdb, 0x72, 0x1b, 0xc7, - 0xb1, 0x58, 0x10, 0x20, 0x81, 0x06, 0x09, 0x82, 0x43, 0x8a, 0x04, 0x61, 0x89, 0xa2, 0xe7, 0xe8, - 0xc8, 0xb4, 0xec, 0x43, 0xdb, 0xb4, 0xeb, 0x58, 0x47, 0xb6, 0x6c, 0xf3, 0x02, 0x91, 0xb4, 0x45, - 0x52, 0x67, 0x40, 0x49, 0x8e, 0xaa, 0x52, 0xca, 0x12, 0x18, 0x92, 0x30, 0x17, 0xbb, 0xf0, 0xee, - 0x02, 0x14, 0x1f, 0xf2, 0x96, 0xb7, 0x54, 0x2a, 0xe5, 0xca, 0x4b, 0x9e, 0x52, 0x95, 0x4a, 0xe5, - 0x1f, 0xf2, 0x90, 0x0f, 0x48, 0x52, 0x49, 0x25, 0x9f, 0x90, 0x72, 0x7e, 0x20, 0x3f, 0x90, 0xaa, - 0xd4, 0xdc, 0x76, 0x67, 0x6f, 0x20, 0x15, 0xc5, 0x2f, 0x79, 0x43, 0xf7, 0x74, 0xf7, 0xcc, 0x74, - 0xf7, 0xf4, 0x6d, 0x01, 0xf3, 0x7d, 0xd7, 0xf1, 0x1d, 0xef, 0x1d, 0x67, 0xad, 0xed, 0xd8, 0xbe, - 0xeb, 0x58, 0xab, 0x1c, 0x81, 0xca, 0x01, 0x02, 0xcf, 0xc3, 0x5c, 0x73, 0x48, 0x6d, 0xff, 0xf9, - 0x1e, 0xf5, 0x1c, 0x6f, 0x87, 0x9a, 0xae, 0x7f, 0x44, 0x4d, 0x1f, 0xff, 0xc8, 0x80, 0x46, 0x73, - 0xf8, 0xbc, 0x69, 0x0f, 0xbb, 0xae, 0x63, 0xf7, 0xa8, 0xed, 0xb7, 0x7c, 0xd3, 0xa7, 0x9b, 0xa7, - 0xa6, 0x7d, 0x42, 0x3b, 0xe8, 0x16, 0x4c, 0xd1, 0x70, 0xa9, 0xdb, 0xa9, 0x1b, 0xcb, 0xc6, 0x4a, - 0x99, 0x44, 0x91, 0x68, 0x0e, 0x8a, 0x1e, 0xe3, 0xaa, 0xe7, 0xf9, 0xaa, 0x00, 0xd0, 0x1d, 0xa8, - 0xb5, 0x07, 0xae, 0x4b, 0x6d, 0x9f, 0x0c, 0xec, 0xfd, 0x41, 0xef, 0x88, 0xba, 0xf5, 0xb1, 0x65, - 0x63, 0x65, 0x8a, 0x24, 0xf0, 0x78, 0x13, 0x66, 0x9b, 0xc3, 0xe7, 0x87, 0xa6, 0x77, 0x16, 0xd9, - 0x7e, 0x1e, 0xc6, 0x7d, 0xd3, 0x3b, 0x0b, 0xf6, 0x95, 0x50, 0xfa, 0x86, 0xf8, 0x01, 0xbb, 0x63, - 0x20, 0x64, 0xe0, 0x5d, 0x26, 0x65, 0x1e, 0xc6, 0x3d, 0x4e, 0x28, 0xc5, 0x48, 0x08, 0xbf, 0x09, - 0xd3, 0x52, 0xce, 0x43, 0x73, 0x60, 0xb7, 0x4f, 0xb3, 0x45, 0xe0, 0x2e, 0x3f, 0x37, 0xd7, 0x29, - 0xa3, 0xdf, 0x74, 0xa9, 0xe9, 0x0b, 0xb5, 0x31, 0x02, 0x97, 0x7a, 0xce, 0xc0, 0x6d, 0x53, 0x4f, - 0xa9, 0x2d, 0x82, 0x44, 0x6f, 0xc3, 0x0c, 0x7d, 0x41, 0xdb, 0x03, 0xdf, 0x71, 0x49, 0x40, 0x29, - 0x8e, 0x92, 0x5c, 0xc0, 0x8f, 0xe1, 0x5a, 0xd4, 0x50, 0x6a, 0xb3, 0x8f, 0xa1, 0xa2, 0x99, 0x83, - 0x6f, 0x55, 0x59, 0x6b, 0xac, 0x86, 0xce, 0xa0, 0xf1, 0xec, 0xda, 0xc7, 0x0e, 0xd1, 0xc9, 0xf1, - 0x8f, 0x0d, 0x58, 0x88, 0xca, 0xdd, 0xa2, 0x9e, 0xef, 0x3a, 0x17, 0xb4, 0x83, 0x3e, 0x87, 0x99, - 0xb6, 0x45, 0x4d, 0x7b, 0xd0, 0x67, 0x97, 0xf3, 0x08, 0xed, 0x5b, 0x17, 0x52, 0xfe, 0x75, 0x4d, - 0xfe, 0x66, 0x9c, 0x86, 0x24, 0xd9, 0x92, 0x9e, 0x94, 0x4f, 0xf1, 0x24, 0xbc, 0xc7, 0xf5, 0xa9, - 0x1d, 0xa6, 0xe9, 0xba, 0x8e, 0xcb, 0xec, 0x4d, 0xd9, 0x0f, 0xa9, 0x47, 0x01, 0xa0, 0x65, 0xa8, - 0xb4, 0x2d, 0xc7, 0xa3, 0x2d, 0xdf, 0xa5, 0x66, 0x8f, 0x0b, 0x2c, 0x11, 0x1d, 0x85, 0x1f, 0x42, - 0x55, 0x5a, 0xd2, 0xfb, 0xa2, 0x6b, 0x59, 0xb4, 0x83, 0xee, 0x41, 0xe5, 0x8c, 0xff, 0xe2, 0xc8, - 0xba, 0xb1, 0x3c, 0xb6, 0x52, 0x59, 0xab, 0x6b, 0x97, 0x69, 0x9d, 0x3a, 0xae, 0xcf, 0x16, 0x85, - 0xaa, 0x34, 0x62, 0x3c, 0x0d, 0x53, 0xc2, 0xb1, 0x08, 0xfd, 0x7a, 0x40, 0x3d, 0x1f, 0x1f, 0x41, - 0x45, 0x21, 0xd8, 0x15, 0x03, 0xaf, 0x34, 0xf4, 0x67, 0x70, 0x1f, 0xa6, 0x84, 0x5f, 0x3d, 0xee, - 0x77, 0x4c, 0x9f, 0x5b, 0x98, 0xed, 0xb9, 0xa0, 0xef, 0xa9, 0xad, 0x93, 0x28, 0x35, 0xfe, 0x93, - 0x01, 0x93, 0xfa, 0x3a, 0x7a, 0x1f, 0x8a, 0x16, 0x1d, 0x52, 0x8b, 0xef, 0x52, 0x5d, 0xbb, 0x91, - 0x21, 0x67, 0xf5, 0x21, 0x23, 0x22, 0x82, 0x16, 0xed, 0x42, 0xb5, 0x17, 0x79, 0xf8, 0x5c, 0x5b, - 0x95, 0xb5, 0x9b, 0xba, 0x9b, 0xa4, 0xc4, 0x87, 0x9d, 0x1c, 0x89, 0x31, 0xe2, 0x0f, 0xa0, 0xc8, - 0x45, 0xa3, 0x32, 0x14, 0xb7, 0x9a, 0x1b, 0x8f, 0xb7, 0x6b, 0x39, 0x54, 0x82, 0xc2, 0xee, 0xfe, - 0x83, 0x83, 0x9a, 0x81, 0x2a, 0x30, 0xf1, 0x74, 0x9d, 0xec, 0xef, 0xee, 0x6f, 0xd7, 0xf2, 0x8c, - 0xa2, 0x49, 0xc8, 0x01, 0xa9, 0x8d, 0x6d, 0x4c, 0x40, 0x91, 0xcb, 0xc7, 0xff, 0x28, 0xca, 0x5f, - 0xe8, 0x3a, 0x94, 0xfd, 0x6e, 0x8f, 0x7a, 0xbe, 0xd9, 0xeb, 0x4b, 0x95, 0x85, 0x08, 0x64, 0xc2, - 0x02, 0x4d, 0x0f, 0x4a, 0xf2, 0xe8, 0xff, 0x1d, 0x39, 0x7a, 0x56, 0x04, 0xdb, 0xc9, 0x91, 0x2c, - 0x39, 0x88, 0x00, 0xa2, 0x89, 0xe7, 0xc4, 0x43, 0x54, 0x65, 0x6d, 0x39, 0x53, 0xba, 0xa4, 0xdb, - 0xc9, 0x91, 0x14, 0x6e, 0xf4, 0x10, 0x6a, 0x7e, 0x2c, 0x8a, 0xd5, 0x0b, 0x5c, 0xe2, 0x52, 0x54, - 0x62, 0x3c, 0xd6, 0xed, 0xe4, 0x48, 0x82, 0x13, 0x1d, 0xc0, 0x8c, 0x1f, 0x0f, 0x67, 0xf5, 0x62, - 0x8a, 0xe5, 0x92, 0x51, 0x6f, 0x27, 0x47, 0x92, 0xbc, 0xe8, 0x33, 0x98, 0x64, 0x48, 0x4b, 0xc6, - 0xb5, 0xfa, 0x78, 0x32, 0x58, 0x44, 0x23, 0xdf, 0x4e, 0x8e, 0x44, 0x38, 0xd8, 0x05, 0x7b, 0x2a, - 0xdc, 0xb5, 0xa5, 0xca, 0x26, 0xd2, 0x2e, 0x18, 0x0f, 0x8a, 0xec, 0x82, 0x71, 0x4e, 0xf4, 0x25, - 0xcc, 0xd1, 0x94, 0xc8, 0x53, 0x2f, 0x71, 0x89, 0x38, 0xd3, 0x08, 0x01, 0xe5, 0x4e, 0x8e, 0xa4, - 0x4a, 0x60, 0xe7, 0xa4, 0xb1, 0x30, 0x52, 0x2f, 0xa7, 0x9d, 0x33, 0x1e, 0x6c, 0xd8, 0x39, 0xe3, - 0x9c, 0xe8, 0x3e, 0x54, 0x98, 0x16, 0x3c, 0x11, 0x0e, 0xea, 0xc0, 0x05, 0x2d, 0x26, 0xd5, 0x26, - 0xc3, 0xcc, 0x4e, 0x8e, 0xe8, 0xf4, 0x1b, 0x65, 0x98, 0x78, 0x64, 0x5e, 0x58, 0x8e, 0xd9, 0xc1, - 0x08, 0x6a, 0xad, 0xc1, 0x91, 0xd7, 0x76, 0xbb, 0x47, 0x54, 0xc5, 0x91, 0x45, 0x58, 0xd8, 0xa6, - 0xfe, 0x03, 0xd7, 0xec, 0xd1, 0x73, 0xc7, 0x15, 0x91, 0x47, 0x2e, 0xfd, 0xca, 0x80, 0x89, 0x27, - 0xd4, 0xf5, 0xba, 0x8e, 0xcd, 0xe2, 0x4b, 0xcf, 0xfc, 0x4a, 0x46, 0xc1, 0x22, 0x11, 0x00, 0xc7, - 0x76, 0x6d, 0xc7, 0xe5, 0xcf, 0x82, 0x61, 0x19, 0xc0, 0xb0, 0x7d, 0xd3, 0x6f, 0x9f, 0x72, 0x77, - 0x2e, 0x12, 0x01, 0x30, 0xec, 0xd1, 0xa0, 0x6b, 0x09, 0x97, 0x2c, 0x13, 0x01, 0xb0, 0x38, 0xda, - 0x77, 0x9d, 0xce, 0xa0, 0xed, 0xef, 0x9b, 0x3d, 0xca, 0xfd, 0xab, 0x4c, 0x74, 0x14, 0x5a, 0x02, - 0x18, 0x8a, 0x43, 0xb4, 0x7c, 0x97, 0x3b, 0x4d, 0x99, 0x68, 0x18, 0xfc, 0xd3, 0x3c, 0x5c, 0x4b, - 0xde, 0x80, 0xc5, 0xc4, 0x65, 0xa8, 0x1c, 0x07, 0x58, 0x95, 0x3d, 0x75, 0x14, 0xcf, 0x82, 0xa1, - 0xba, 0xbd, 0x4d, 0x67, 0x60, 0xfb, 0xf2, 0x2e, 0xc9, 0x05, 0x76, 0x12, 0xae, 0x58, 0x41, 0x26, - 0x2e, 0xa7, 0x61, 0xc2, 0x18, 0x5c, 0xd0, 0x63, 0xf0, 0x12, 0xc0, 0xa9, 0xe3, 0x29, 0xe1, 0x45, - 0xc1, 0x15, 0x62, 0x10, 0x86, 0xc9, 0xae, 0xed, 0xf9, 0xa6, 0xdd, 0xa6, 0x5c, 0x05, 0xe2, 0x86, - 0x11, 0x1c, 0x7a, 0x1b, 0x26, 0xe4, 0x8d, 0xa5, 0xbf, 0x23, 0xcd, 0xfc, 0xd2, 0x44, 0x44, 0x91, - 0xb0, 0x1a, 0xe2, 0x90, 0x9a, 0x6e, 0xc7, 0x39, 0xb7, 0xa5, 0x29, 0x59, 0x0d, 0xe1, 0x52, 0xd3, - 0x73, 0x6c, 0x55, 0x43, 0x08, 0x88, 0xa5, 0x95, 0x90, 0xb4, 0x6f, 0x5d, 0xe0, 0x3a, 0xcc, 0x6f, - 0x53, 0x5f, 0xf3, 0xcb, 0x20, 0xe1, 0xbc, 0x80, 0xb9, 0xc4, 0xca, 0xd5, 0xb4, 0xfc, 0x09, 0x4c, - 0xea, 0xca, 0x94, 0x49, 0x68, 0x54, 0x95, 0x10, 0xa1, 0xc7, 0x7f, 0x28, 0xc0, 0x74, 0x8c, 0x02, - 0x55, 0x21, 0x1f, 0x14, 0x44, 0xf9, 0x2e, 0xf7, 0x23, 0xf9, 0xae, 0x9f, 0x9e, 0x52, 0x5b, 0x26, - 0x78, 0x1d, 0x15, 0x5a, 0x67, 0x4c, 0xb7, 0xce, 0x2a, 0x14, 0xb9, 0x05, 0xeb, 0x85, 0x4b, 0xb2, - 0xb1, 0x20, 0x43, 0x0d, 0x28, 0xb9, 0x8e, 0xe3, 0x13, 0xc7, 0x52, 0xce, 0x1a, 0xc0, 0xa9, 0x45, - 0xe7, 0x78, 0x7a, 0xd1, 0x89, 0xb6, 0xa0, 0xd4, 0xa1, 0xc7, 0xe6, 0xc0, 0xf2, 0xbd, 0xfa, 0x04, - 0xdf, 0x7a, 0x25, 0x5b, 0x1f, 0xab, 0x5b, 0x92, 0xb4, 0x69, 0xfb, 0xee, 0x05, 0x09, 0x38, 0xd1, - 0x5d, 0x28, 0x0c, 0x4d, 0xd7, 0xab, 0x97, 0xb8, 0x84, 0x5b, 0x23, 0x24, 0x3c, 0x31, 0x5d, 0xc9, - 0xcd, 0x39, 0xd8, 0xfe, 0x03, 0x8f, 0xba, 0x0c, 0x5d, 0x2f, 0x5f, 0xba, 0xff, 0x63, 0x49, 0x2a, - 0xf7, 0x57, 0x9c, 0x8d, 0x8f, 0x60, 0x2a, 0x72, 0x34, 0x54, 0x83, 0xb1, 0x33, 0x7a, 0x21, 0xed, - 0xc2, 0x7e, 0x32, 0xb5, 0x0f, 0x4d, 0x6b, 0x10, 0x94, 0xcb, 0x1c, 0xb8, 0x97, 0xbf, 0x6b, 0x34, - 0x3e, 0x84, 0x72, 0x20, 0xf3, 0xa5, 0x18, 0x3f, 0x82, 0xa9, 0xc8, 0x81, 0x5e, 0x86, 0x19, 0xff, - 0xd6, 0x80, 0x6b, 0xfb, 0xf4, 0x5c, 0xbb, 0xa1, 0x7a, 0x23, 0x77, 0xa0, 0xc6, 0x1c, 0xf6, 0xd8, - 0x72, 0xce, 0x0f, 0x69, 0xaf, 0x6f, 0x85, 0xd5, 0x54, 0x02, 0x8f, 0x3e, 0x91, 0x8a, 0x17, 0xae, - 0x7c, 0x47, 0x53, 0x5d, 0xaa, 0xec, 0xb8, 0xfa, 0xff, 0xe5, 0xbb, 0xe3, 0x16, 0xcc, 0xc6, 0x77, - 0x60, 0x8f, 0xf0, 0xd5, 0xea, 0xf0, 0x45, 0x58, 0xd8, 0xa7, 0xe7, 0xeb, 0x03, 0xdf, 0x89, 0x0b, - 0xc6, 0x6f, 0xf0, 0xe0, 0x9a, 0xa2, 0xad, 0xd8, 0x03, 0x64, 0xcd, 0xdc, 0x6c, 0x9c, 0xf2, 0x95, - 0x4f, 0x86, 0xde, 0x81, 0x92, 0xd2, 0xbd, 0x2c, 0xbd, 0x66, 0x35, 0x56, 0xf6, 0xea, 0x38, 0x4f, - 0x40, 0x84, 0xff, 0x6c, 0xc0, 0xe2, 0xa6, 0x58, 0xbe, 0xfc, 0xd0, 0xe8, 0x53, 0x28, 0xf8, 0x17, - 0x7d, 0xa1, 0xe6, 0xea, 0xda, 0x5b, 0x7a, 0x5f, 0x91, 0x25, 0x63, 0xf5, 0xa0, 0xcf, 0x58, 0x08, - 0x67, 0xc4, 0x26, 0x8c, 0x0b, 0x98, 0x95, 0xa1, 0xfb, 0x07, 0x07, 0x8f, 0x6a, 0x39, 0x84, 0xa0, - 0xda, 0x3a, 0x5c, 0x27, 0x87, 0xcf, 0xd7, 0x37, 0x0f, 0x77, 0x9f, 0xec, 0x1e, 0x7e, 0xaf, 0x66, - 0xa0, 0x19, 0x98, 0x6a, 0x1d, 0x1e, 0x3c, 0x0a, 0x51, 0x79, 0x34, 0x05, 0xe5, 0xcd, 0x83, 0xfd, - 0x07, 0xbb, 0xdb, 0x8f, 0x49, 0xb3, 0x36, 0xc6, 0xea, 0x55, 0xd2, 0x6c, 0x35, 0x0f, 0x6b, 0x05, - 0x34, 0x09, 0xa5, 0xed, 0x83, 0xe7, 0xa2, 0x7a, 0x2d, 0xe2, 0x33, 0x58, 0x48, 0x3b, 0x0c, 0xd3, - 0x6d, 0xfc, 0x3a, 0xaf, 0xde, 0x0b, 0xff, 0xcc, 0x80, 0xfa, 0x9e, 0xd3, 0xe9, 0x1e, 0x5f, 0x5c, - 0x49, 0x7b, 0xe0, 0xf4, 0xa9, 0x6b, 0xfa, 0x5d, 0xc7, 0x56, 0x4f, 0xe1, 0x66, 0xba, 0x65, 0x0f, - 0x14, 0x1d, 0xd1, 0x58, 0xd0, 0x6d, 0xa8, 0xba, 0xb4, 0xed, 0xd8, 0xc7, 0xdd, 0x93, 0x81, 0x4b, - 0xd7, 0x2d, 0x8b, 0x9f, 0xab, 0x44, 0x62, 0x58, 0xfc, 0x4b, 0x03, 0xe6, 0xd2, 0x84, 0xa1, 0x7b, - 0xd2, 0x7e, 0xa2, 0x1d, 0xb9, 0x7d, 0xc9, 0xde, 0x11, 0xd3, 0x89, 0x48, 0x6e, 0x89, 0x9c, 0x9b, - 0x57, 0x91, 0x5c, 0xc0, 0xf8, 0xbd, 0x14, 0xb3, 0x4e, 0x43, 0x85, 0x34, 0xf7, 0x0e, 0x9e, 0x34, - 0x9f, 0x93, 0x83, 0x87, 0xcc, 0x62, 0x93, 0x50, 0x5a, 0xdf, 0xda, 0x12, 0x50, 0x81, 0xf5, 0xb2, - 0xf3, 0x29, 0x9a, 0x63, 0x66, 0xfa, 0x02, 0x6a, 0xc7, 0x66, 0xd7, 0xa2, 0x9d, 0x83, 0x50, 0x5b, - 0xc6, 0xd5, 0xb4, 0x95, 0x60, 0x94, 0x46, 0xc8, 0x27, 0x6d, 0xae, 0xa7, 0x35, 0xfc, 0x8d, 0x01, - 0x8b, 0xb2, 0x1e, 0xbd, 0x82, 0x21, 0xaf, 0x43, 0xf9, 0x8c, 0x52, 0xd1, 0x31, 0xcb, 0x56, 0x36, - 0x44, 0xa0, 0x77, 0x61, 0xd6, 0xb4, 0x2c, 0xe7, 0x7c, 0xd7, 0x26, 0x03, 0xdb, 0xee, 0xda, 0x27, - 0xad, 0x60, 0xbf, 0x12, 0x49, 0x5b, 0x62, 0x67, 0x3a, 0x76, 0xdc, 0xb6, 0x28, 0x84, 0x4a, 0x44, - 0x00, 0x98, 0xc2, 0x42, 0xda, 0x91, 0x98, 0x86, 0xfe, 0x8d, 0xcd, 0x3e, 0xfe, 0xa3, 0x01, 0x37, - 0x5b, 0x91, 0x40, 0xf4, 0xc8, 0x65, 0x3e, 0xe7, 0x77, 0xa9, 0x97, 0xa5, 0x80, 0x67, 0x00, 0xfd, - 0x80, 0x48, 0x7a, 0xf2, 0x3d, 0xbd, 0x14, 0x18, 0x2d, 0x6f, 0x35, 0xc4, 0x88, 0x20, 0xaf, 0x49, - 0x6b, 0xdc, 0x87, 0xe9, 0xd8, 0xf2, 0x4b, 0x05, 0xfc, 0x9b, 0x70, 0x23, 0x7b, 0x77, 0x76, 0x5f, - 0x0f, 0x6e, 0x6e, 0xbf, 0xe4, 0x75, 0xeb, 0x30, 0xf1, 0xf5, 0x80, 0xba, 0xea, 0xae, 0x65, 0xa2, - 0x40, 0xf6, 0x22, 0xe9, 0x8b, 0xb6, 0x35, 0xe8, 0xd0, 0x6d, 0xcb, 0x39, 0x32, 0x2d, 0x4f, 0xbd, - 0xc8, 0x28, 0x16, 0xff, 0xc6, 0x80, 0x1b, 0xdb, 0xa3, 0x8e, 0x85, 0xbe, 0x8c, 0xa8, 0x54, 0xb8, - 0xfb, 0x5d, 0x4d, 0xa5, 0x23, 0xb9, 0xbf, 0x4b, 0x85, 0xfe, 0x22, 0x0f, 0x53, 0x91, 0xd2, 0x0e, - 0x21, 0x28, 0xd8, 0x2c, 0x0a, 0x08, 0x76, 0xfe, 0x9b, 0x15, 0xcc, 0x96, 0xd3, 0x3e, 0x93, 0x1d, - 0x7f, 0x89, 0x48, 0x48, 0x0d, 0xe3, 0x76, 0x3b, 0xf2, 0xbd, 0x49, 0x48, 0x9b, 0xe7, 0x15, 0xf4, - 0x79, 0x5e, 0xf8, 0x3c, 0x8b, 0x7a, 0x48, 0xbe, 0x0e, 0xe5, 0xb6, 0x65, 0x7a, 0x9e, 0x56, 0xf0, - 0x87, 0x08, 0xd4, 0x84, 0x6a, 0x87, 0xf6, 0x2d, 0xe7, 0x42, 0xe5, 0x44, 0x59, 0xf4, 0xeb, 0xe3, - 0x16, 0x76, 0xf8, 0xad, 0x08, 0x11, 0x89, 0x31, 0x31, 0xa5, 0xf4, 0xbb, 0xa2, 0x9d, 0x2d, 0x13, - 0xf6, 0x13, 0xdd, 0x82, 0x29, 0xcf, 0xb4, 0x3b, 0x47, 0xce, 0x8b, 0x96, 0xdf, 0x71, 0x06, 0x3e, - 0x6f, 0x4a, 0xcb, 0x24, 0x8a, 0x64, 0x99, 0x1c, 0x25, 0xc5, 0xb3, 0x78, 0xc9, 0xba, 0x16, 0x4d, - 0x53, 0x01, 0xcc, 0x1c, 0xca, 0x3c, 0x61, 0x84, 0x2a, 0x32, 0x29, 0x90, 0xad, 0x38, 0xc7, 0xc7, - 0xd4, 0x0d, 0x14, 0xa6, 0x40, 0xd6, 0x17, 0xa9, 0x41, 0xe3, 0xae, 0x6a, 0x0a, 0x35, 0x0c, 0x9e, - 0x81, 0xe9, 0x6d, 0xea, 0xcb, 0x87, 0x2d, 0x5a, 0x90, 0x4f, 0x61, 0x2a, 0x44, 0x31, 0x27, 0x0b, - 0xaa, 0x77, 0xe3, 0x4a, 0xd5, 0x3b, 0x5e, 0x81, 0xaa, 0x14, 0xa0, 0x35, 0x46, 0xd2, 0x9e, 0x86, - 0x6e, 0x4f, 0xfc, 0x21, 0x4c, 0x06, 0x94, 0x6c, 0xa7, 0x37, 0xa0, 0xc0, 0x56, 0x64, 0x50, 0x9a, - 0x8d, 0x59, 0x82, 0xef, 0xc1, 0x09, 0x70, 0x13, 0xa6, 0xf8, 0xe0, 0x81, 0x59, 0x33, 0xd3, 0xbb, - 0x58, 0xb7, 0x22, 0xd8, 0xf7, 0x9c, 0x0e, 0x0d, 0xba, 0x95, 0x10, 0x85, 0x7f, 0x08, 0x95, 0x4d, - 0xa7, 0xd7, 0x33, 0xed, 0x8e, 0xb2, 0x25, 0xb5, 0x87, 0xfc, 0x9a, 0x65, 0xc2, 0x7e, 0x72, 0xc7, - 0x3a, 0xa5, 0x96, 0x25, 0xfd, 0x53, 0x00, 0xa1, 0xdb, 0x8f, 0x69, 0x6e, 0xcf, 0xdc, 0xcd, 0x74, - 0x4f, 0x06, 0xa2, 0xfb, 0x2a, 0x70, 0x19, 0x21, 0x82, 0x1d, 0x90, 0x15, 0xf4, 0xd2, 0x43, 0xf9, - 0x6f, 0xbc, 0x07, 0x95, 0xcd, 0x53, 0xd3, 0xb6, 0xa9, 0x95, 0x79, 0x07, 0xa4, 0xd5, 0x4e, 0x65, - 0x99, 0x53, 0xb9, 0x36, 0xdd, 0x13, 0xea, 0x87, 0xaf, 0x83, 0x41, 0xf8, 0xef, 0x63, 0x50, 0x0a, - 0x9e, 0xdb, 0xff, 0x42, 0xd9, 0x63, 0xc6, 0xe1, 0x9e, 0x2d, 0xf4, 0x99, 0x6d, 0xb8, 0x90, 0x94, - 0xf1, 0xb5, 0x95, 0x56, 0x65, 0x31, 0x58, 0x8f, 0xd9, 0x21, 0xd0, 0x3a, 0x09, 0x49, 0xd1, 0x67, - 0x30, 0xdd, 0xb5, 0x8f, 0x9c, 0x81, 0xdd, 0x91, 0x57, 0x62, 0x41, 0x8d, 0xb9, 0xcb, 0xbc, 0x9e, - 0x5a, 0xc2, 0xdb, 0x92, 0x38, 0x39, 0xda, 0x80, 0x9a, 0x33, 0xf0, 0xa3, 0x22, 0x0a, 0x23, 0x45, - 0x24, 0xe8, 0xd1, 0x5d, 0x66, 0xf2, 0xc0, 0xa0, 0x72, 0x90, 0x16, 0x61, 0x0f, 0x57, 0x89, 0x4e, - 0xca, 0x1e, 0x1e, 0xf3, 0xac, 0x47, 0xa6, 0x7f, 0x2a, 0x63, 0x45, 0x00, 0xf3, 0xe1, 0xb4, 0x3d, - 0xdc, 0x15, 0x63, 0xb0, 0x32, 0x11, 0x00, 0xda, 0x8c, 0xc4, 0x5e, 0xd1, 0xde, 0xfd, 0x57, 0x8a, - 0xcb, 0x7e, 0x97, 0x61, 0xf6, 0x1d, 0x98, 0x8d, 0xa6, 0x6b, 0xf1, 0xde, 0xea, 0x30, 0x21, 0x5e, - 0x98, 0x27, 0x9d, 0x59, 0x81, 0xf8, 0x27, 0x06, 0xcc, 0x24, 0x12, 0xfc, 0xab, 0xcc, 0xcc, 0xd1, - 0xc7, 0x30, 0xe9, 0x8a, 0xb2, 0x44, 0x55, 0x36, 0xa3, 0x99, 0x23, 0xd4, 0x78, 0x93, 0xc7, 0x1f, - 0xd6, 0x62, 0x04, 0x87, 0x0f, 0xb4, 0x6d, 0xe8, 0xda, 0x6e, 0x40, 0xa9, 0x6f, 0xfa, 0xa7, 0xad, - 0x3e, 0x6d, 0xab, 0x42, 0x52, 0xc1, 0xf8, 0x9b, 0x02, 0x94, 0x54, 0x97, 0x92, 0x95, 0x67, 0xd2, - 0xbe, 0x03, 0x65, 0x4c, 0x2b, 0x1a, 0x50, 0x3a, 0x1e, 0x58, 0x16, 0x77, 0x05, 0x11, 0x31, 0x03, - 0x58, 0xd7, 0x6c, 0x31, 0xa2, 0x59, 0xf4, 0x26, 0x14, 0x59, 0x65, 0xeb, 0xd5, 0xc7, 0xb9, 0x02, - 0x52, 0x3b, 0x28, 0x41, 0x81, 0xee, 0x27, 0xc6, 0x12, 0xaf, 0xa7, 0x50, 0x67, 0xce, 0x23, 0xde, - 0x8b, 0xcc, 0x23, 0x6e, 0xa4, 0xb1, 0xc6, 0x07, 0x11, 0xf7, 0x13, 0x83, 0x88, 0xd4, 0x1d, 0xff, - 0x83, 0x26, 0x10, 0xf7, 0x78, 0x16, 0x93, 0x8e, 0xc5, 0x7c, 0x3c, 0xb0, 0x8f, 0x71, 0x99, 0x7d, - 0xf0, 0xaf, 0x0d, 0x78, 0x6d, 0x9b, 0xfa, 0x4f, 0x63, 0xf3, 0x88, 0xc0, 0x43, 0x97, 0xa1, 0xe2, - 0xd2, 0xbe, 0xf3, 0xc8, 0xf4, 0x7d, 0xea, 0xaa, 0x61, 0x9f, 0x8e, 0x42, 0x2b, 0x30, 0xed, 0xd2, - 0x61, 0xd7, 0xeb, 0x3a, 0xb6, 0xa2, 0x12, 0x27, 0x8c, 0xa3, 0x99, 0x2c, 0xd3, 0xb2, 0x36, 0x5c, - 0xd3, 0x6e, 0x9f, 0x52, 0x55, 0x08, 0xea, 0x28, 0x9e, 0xf6, 0x2d, 0xeb, 0xd0, 0x3c, 0xf1, 0x64, - 0xa5, 0xaf, 0x40, 0x7c, 0x04, 0x73, 0xf1, 0x33, 0xaa, 0x27, 0xc0, 0x0e, 0xa3, 0x9e, 0x00, 0xfb, - 0xcd, 0xe3, 0x9b, 0x9a, 0xb7, 0xc8, 0xf7, 0xa3, 0x60, 0xde, 0xa4, 0xc9, 0x63, 0xc9, 0x97, 0x10, - 0xc0, 0xf8, 0x2b, 0x58, 0x4c, 0x57, 0x05, 0xd3, 0xe9, 0x1e, 0xcc, 0xc4, 0x87, 0x36, 0x69, 0x4d, - 0x57, 0xda, 0x21, 0x49, 0x92, 0x13, 0x23, 0xa8, 0x3d, 0xec, 0x7a, 0xac, 0x5b, 0x71, 0xb4, 0x2f, - 0x70, 0x25, 0x06, 0x67, 0x3e, 0xed, 0x3a, 0x4c, 0xc8, 0x87, 0x21, 0x73, 0xb4, 0x02, 0x99, 0x0d, - 0xe4, 0x4f, 0x12, 0xbd, 0x5c, 0x1c, 0x8d, 0xbf, 0x86, 0xaa, 0xb6, 0xaf, 0x72, 0x16, 0x06, 0xa5, - 0x39, 0x8b, 0x3c, 0x0d, 0x11, 0x14, 0xe8, 0x03, 0xb8, 0x76, 0xc2, 0xeb, 0xf5, 0xad, 0xd8, 0x66, - 0x42, 0xcb, 0xe9, 0x8b, 0x78, 0x1f, 0xaa, 0xeb, 0x9d, 0x0e, 0x93, 0xa5, 0x9c, 0x2a, 0xed, 0x72, - 0x29, 0x57, 0xc8, 0xa7, 0x5f, 0x81, 0xc0, 0x64, 0x20, 0x4f, 0xd4, 0x6c, 0xc8, 0xa6, 0xe7, 0xf1, - 0x23, 0x09, 0xd9, 0x29, 0x2b, 0x6c, 0xf7, 0xae, 0xca, 0xf8, 0x65, 0xc2, 0x7f, 0xe3, 0x37, 0x61, - 0x86, 0xd0, 0x9e, 0x33, 0xa4, 0xfa, 0x31, 0xe7, 0xa0, 0xd8, 0xb5, 0x3b, 0xf4, 0x85, 0xfa, 0x44, - 0xc1, 0x01, 0xfc, 0x7f, 0x30, 0xad, 0x93, 0xb2, 0x13, 0xdc, 0x86, 0xaa, 0xbe, 0x4f, 0xe0, 0x8e, - 0x31, 0x2c, 0x7e, 0x0b, 0x66, 0x09, 0x3d, 0x76, 0xa9, 0x77, 0xaa, 0xdb, 0x3d, 0x63, 0x9f, 0xff, - 0x81, 0x6b, 0x2d, 0xea, 0x6b, 0xec, 0xa3, 0xc9, 0xef, 0xf3, 0x26, 0x75, 0x3b, 0xcd, 0x02, 0x8a, - 0x51, 0xf7, 0x7d, 0x23, 0xe6, 0xfb, 0xff, 0xcf, 0xbb, 0x42, 0xb6, 0x4d, 0x06, 0x73, 0xea, 0xae, - 0x11, 0x91, 0xf9, 0x98, 0xc8, 0xf7, 0xe0, 0xb5, 0x2c, 0x91, 0x4c, 0x69, 0xca, 0x0c, 0x86, 0x66, - 0x86, 0x09, 0x28, 0x36, 0x7b, 0x7d, 0xff, 0x62, 0xed, 0xf7, 0x55, 0x98, 0x90, 0x43, 0x2a, 0xb4, - 0x09, 0x95, 0x43, 0xd7, 0x6c, 0xcb, 0x8f, 0x7f, 0xa8, 0x9e, 0xf8, 0x46, 0x2c, 0x8f, 0xd8, 0x98, - 0x4f, 0x59, 0x61, 0x0d, 0x6d, 0xee, 0x5d, 0x03, 0x3d, 0x83, 0x5a, 0xfc, 0x9b, 0x0e, 0xc2, 0xd1, - 0xee, 0x31, 0xed, 0x93, 0x55, 0x63, 0x79, 0x24, 0x0d, 0x97, 0x8e, 0x36, 0xa0, 0xa4, 0xbe, 0x79, - 0x20, 0x7d, 0x10, 0x19, 0xfb, 0x66, 0xd2, 0xa8, 0xa7, 0xae, 0x09, 0x19, 0x4f, 0x79, 0x71, 0xa0, - 0x7f, 0x0c, 0x41, 0xaf, 0x67, 0x36, 0xb7, 0xc1, 0x8d, 0x6f, 0x8e, 0x22, 0x11, 0x82, 0x3f, 0x07, - 0x94, 0x1c, 0xc5, 0xa2, 0xe5, 0xcb, 0x06, 0xcc, 0x8d, 0x5a, 0xfc, 0x63, 0xfa, 0xbb, 0x06, 0x3a, - 0x84, 0x6a, 0x94, 0xf8, 0x0a, 0x72, 0x96, 0x46, 0x50, 0x88, 0x13, 0x1e, 0xf2, 0x1e, 0x2a, 0x4b, - 0x6a, 0xea, 0xb0, 0x38, 0x22, 0x35, 0x65, 0x48, 0x8c, 0x73, 0xe8, 0x07, 0x80, 0x92, 0x53, 0x4e, - 0x74, 0xeb, 0x2a, 0x13, 0xd9, 0x06, 0xbe, 0x84, 0x4a, 0xec, 0xf0, 0x7d, 0x98, 0x49, 0xcc, 0xe7, - 0x90, 0x5e, 0x15, 0x67, 0xcd, 0x3d, 0x1b, 0xaf, 0x8f, 0x26, 0x0a, 0x2e, 0x90, 0x9c, 0x6e, 0x45, - 0x2e, 0x90, 0x39, 0x8f, 0x8b, 0x5c, 0x20, 0x63, 0x44, 0x26, 0xfc, 0x56, 0x75, 0xbf, 0x11, 0xbf, - 0x8d, 0x75, 0xc9, 0x11, 0xbf, 0x8d, 0xb4, 0xcb, 0x38, 0x87, 0x3e, 0x85, 0x09, 0x89, 0x42, 0x8b, - 0x49, 0x32, 0x25, 0x61, 0x21, 0x6d, 0x49, 0x08, 0xd8, 0x87, 0x49, 0xbd, 0x48, 0x47, 0x4b, 0x99, - 0xe3, 0x39, 0x21, 0x6a, 0xe4, 0xf8, 0x2e, 0xb8, 0x14, 0x2f, 0x86, 0xe2, 0x97, 0xd2, 0x4b, 0xef, - 0xf8, 0xa5, 0xc2, 0xea, 0x09, 0xe7, 0xd0, 0x31, 0xff, 0x32, 0x99, 0x28, 0x04, 0xd0, 0xed, 0x28, - 0x4f, 0x56, 0xd1, 0xd4, 0xb8, 0x75, 0x29, 0x9d, 0xd8, 0xa7, 0x09, 0xe5, 0x20, 0x19, 0xa3, 0xd7, - 0x34, 0xa6, 0x78, 0x69, 0xd0, 0x58, 0x4c, 0x5f, 0x0c, 0x6c, 0x20, 0x13, 0x62, 0xc4, 0x06, 0xd1, - 0xa4, 0x1b, 0xb1, 0x81, 0x9e, 0x3f, 0x71, 0x0e, 0xed, 0x00, 0x84, 0x29, 0x0d, 0x5d, 0x8f, 0x54, - 0x00, 0xb1, 0xa4, 0xd8, 0x68, 0x64, 0xac, 0x2a, 0xed, 0x4f, 0xea, 0x19, 0x2e, 0x62, 0xcd, 0x94, - 0xd4, 0x17, 0x8d, 0x32, 0x2c, 0xf2, 0xe3, 0x1c, 0x7a, 0x00, 0xd5, 0x68, 0xe2, 0x8b, 0xc4, 0x83, - 0xd4, 0x9c, 0x98, 0x2a, 0xe7, 0x19, 0xd4, 0xb3, 0x32, 0x22, 0xba, 0x13, 0x95, 0x38, 0x2a, 0x6d, - 0xa6, 0xca, 0xb6, 0x60, 0x3e, 0x3d, 0xb7, 0xa1, 0x95, 0xa8, 0xe4, 0xec, 0x8c, 0xda, 0xb8, 0x7d, - 0x05, 0x4a, 0xa1, 0xd5, 0x8f, 0xa1, 0x1c, 0xfc, 0xcd, 0x22, 0xe2, 0x27, 0xf1, 0x3f, 0x5f, 0xa4, - 0x45, 0xed, 0x8d, 0xbb, 0xbf, 0xfb, 0x76, 0xc9, 0xf8, 0xcb, 0xb7, 0x4b, 0xc6, 0x5f, 0xbf, 0x5d, - 0x32, 0x7e, 0xfe, 0xb7, 0xa5, 0x1c, 0xe0, 0xf6, 0xe9, 0x6a, 0x9b, 0xba, 0xf6, 0xaa, 0x69, 0x75, - 0xdb, 0x74, 0xd5, 0x59, 0x5b, 0x55, 0x3c, 0x6e, 0xbf, 0xed, 0x51, 0x77, 0x48, 0xdd, 0x67, 0xf9, - 0xfe, 0xd1, 0xd1, 0x38, 0xff, 0xe7, 0xe5, 0xfb, 0xff, 0x0c, 0x00, 0x00, 0xff, 0xff, 0x08, 0x61, - 0x61, 0x33, 0x93, 0x29, 0x00, 0x00, + // 2890 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, + 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, + 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, + 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, + 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, + 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, + 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, + 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, + 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, + 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, + 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, + 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, + 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, + 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, + 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, + 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, + 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, + 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, + 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, + 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, + 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, + 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, + 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, + 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, + 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, + 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, + 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, + 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, + 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, + 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, + 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, + 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, + 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, + 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, + 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, + 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, + 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, + 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, + 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, + 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, + 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, + 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, + 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, + 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, + 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, + 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, + 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, + 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, + 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, + 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, + 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, + 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, + 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, + 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, + 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, + 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, + 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, + 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, + 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, + 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, + 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, + 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, + 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, + 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, + 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, + 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, + 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, + 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, + 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, + 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, + 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, + 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, + 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, + 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, + 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, + 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, + 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, + 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, + 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, + 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, + 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, + 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, + 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, + 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, + 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, + 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, + 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, + 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, + 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, + 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, + 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, + 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, + 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, + 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, + 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, + 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, + 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, + 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, + 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, + 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, + 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, + 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, + 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, + 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, + 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, + 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, + 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, + 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, + 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, + 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, + 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, + 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, + 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, + 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, + 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, + 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, + 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, + 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, + 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, + 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, + 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, + 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, + 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, + 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, + 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, + 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, + 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, + 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, + 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, + 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, + 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, + 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, + 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, + 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, + 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, + 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, + 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, + 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, + 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, + 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, + 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, + 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, + 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, + 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, + 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, + 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, + 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, + 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, + 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, + 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, + 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, + 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, + 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, + 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, + 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, + 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, + 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, + 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, + 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, + 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, + 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, + 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, + 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, + 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, + 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, + 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, + 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, + 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, + 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, + 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, + 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, + 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, + 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, + 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, + 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, + 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, + 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, + 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, + 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, + 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, + 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -4546,7 +4240,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -4634,36 +4328,13 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (Control_NewAutoEnvironmentClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/NewAutoEnvironment", opts...) +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) if err != nil { return nil, err } - x := &controlNewAutoEnvironmentClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_NewAutoEnvironmentClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlNewAutoEnvironmentClient struct { - grpc.ClientStream -} - -func (x *controlNewAutoEnvironmentClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil + return out, nil } func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { @@ -4820,7 +4491,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[2], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -4857,7 +4528,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(*NewEnvironmentRequest, Control_NewAutoEnvironmentServer) error + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -4894,8 +4565,8 @@ func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRe func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (*UnimplementedControlServer) NewAutoEnvironment(req *NewEnvironmentRequest, srv Control_NewAutoEnvironmentServer) error { - return status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") } func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") @@ -5031,25 +4702,22 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_NewAutoEnvironment_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(NewEnvironmentRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err } - return srv.(ControlServer).NewAutoEnvironment(m, &controlNewAutoEnvironmentServer{stream}) -} - -type Control_NewAutoEnvironmentServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlNewAutoEnvironmentServer struct { - grpc.ServerStream -} - -func (x *controlNewAutoEnvironmentServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) } func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -5395,6 +5063,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, @@ -5470,11 +5142,6 @@ var _Control_serviceDesc = grpc.ServiceDesc{ Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, - { - StreamName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - ServerStreams: true, - }, { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, @@ -5511,7 +5178,7 @@ func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5521,12 +5188,12 @@ func (m *Ev_EnvironmentStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5535,6 +5202,13 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Error) > 0 { + i -= len(m.Error) + copy(dAtA[i:], m.Error) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + i-- + dAtA[i] = 0x22 + } if m.CurrentRunNumber != 0 { i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) i-- @@ -5547,17 +5221,17 @@ func (m *Ev_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, err i-- dAtA[i] = 0x12 } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if len(m.EnvironmentId) > 0 { + i -= len(m.EnvironmentId) + copy(dAtA[i:], m.EnvironmentId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5567,12 +5241,12 @@ func (m *Ev_TaskStateChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5581,6 +5255,13 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Status) > 0 { + i -= len(m.Status) + copy(dAtA[i:], m.Status) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) + i-- + dAtA[i] = 0x1a + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -5598,7 +5279,7 @@ func (m *Ev_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { +func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5608,12 +5289,12 @@ func (m *Ev_TaskStatusChanged) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5622,6 +5303,13 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- + dAtA[i] = 0x1a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) @@ -5629,17 +5317,17 @@ func (m *Ev_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x12 } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { +func (m *StatusRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5649,12 +5337,12 @@ func (m *Ev_TaskLaunched) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TaskLaunched) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5663,17 +5351,10 @@ func (m *Ev_TaskLaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0xa - } return len(dAtA) - i, nil } -func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5683,12 +5364,12 @@ func (m *Ev_MesosTaskCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_MesosTaskCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5697,24 +5378,31 @@ func (m *Ev_MesosTaskCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.ExecutorResources) > 0 { - i -= len(m.ExecutorResources) - copy(dAtA[i:], m.ExecutorResources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorResources))) - i-- - dAtA[i] = 0x12 + if len(m.StatusUpdates) > 0 { + for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } } - if len(m.Taskresources) > 0 { - i -= len(m.Taskresources) - copy(dAtA[i:], m.Taskresources) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskresources))) - i-- + if len(m.State) > 0 { + i -= len(m.State) + copy(dAtA[i:], m.State) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { +func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5724,12 +5412,12 @@ func (m *Ev_EnvironmentCreated) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5738,9 +5426,33 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Environment != nil { + if m.Event != nil { { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) + size := m.Event.Size() + i -= size + if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if m.Level != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.MesosHeartbeat != nil { + { + size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5748,12 +5460,11 @@ func (m *Ev_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 } return len(dAtA) - i, nil } - -func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { +func (m *Event) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5763,12 +5474,12 @@ func (m *Ev_EnvironmentDestroyed) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { +func (m *Event) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5777,16 +5488,56 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.Environmentid) > 0 { - i -= len(m.Environmentid) - copy(dAtA[i:], m.Environmentid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Environmentid))) + if m.Payload != nil { + { + size := m.Payload.Size() + i -= size + if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + if len(m.Timestamp) > 0 { + i -= len(m.Timestamp) + copy(dAtA[i:], m.Timestamp) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.EnvironmentEvent != nil { + { + size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } i-- dAtA[i] = 0x12 } - if m.CleanupTasksReply != nil { + return len(dAtA) - i, nil +} +func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.TaskEvent != nil { { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -5794,12 +5545,32 @@ func (m *Ev_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) i = encodeVarintO2Control(dAtA, i, uint64(size)) } i-- - dAtA[i] = 0xa + dAtA[i] = 0x1a } return len(dAtA) - i, nil } +func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} -func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { +func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.RoleEvent != nil { + { + size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} +func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5809,12 +5580,12 @@ func (m *Ev_EnvironmentError) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5823,27 +5594,17 @@ func (m *Ev_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.CloseStream { - i-- - if m.CloseStream { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5853,12 +5614,12 @@ func (m *Ev_TasksKilled) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Ev_TasksKilled) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5867,24 +5628,10 @@ func (m *Ev_TasksKilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } return len(dAtA) - i, nil } -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { +func (m *Version) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5894,12 +5641,12 @@ func (m *StatusRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *Version) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5908,10 +5655,46 @@ func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.VersionStr) > 0 { + i -= len(m.VersionStr) + copy(dAtA[i:], m.VersionStr) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) + i-- + dAtA[i] = 0x32 + } + if len(m.ProductName) > 0 { + i -= len(m.ProductName) + copy(dAtA[i:], m.ProductName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) + i-- + dAtA[i] = 0x2a + } + if len(m.Build) > 0 { + i -= len(m.Build) + copy(dAtA[i:], m.Build) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) + i-- + dAtA[i] = 0x22 + } + if m.Patch != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) + i-- + dAtA[i] = 0x18 + } + if m.Minor != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) + i-- + dAtA[i] = 0x10 + } + if m.Major != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) + i-- + dAtA[i] = 0x8 + } return len(dAtA) - i, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { +func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5921,12 +5704,12 @@ func (m *StatusReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5935,31 +5718,58 @@ func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) + if m.Version != nil { + { + size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } - i-- - dAtA[i] = 0x12 + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0x3a + } + if len(m.InstanceName) > 0 { + i -= len(m.InstanceName) + copy(dAtA[i:], m.InstanceName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) + i-- + dAtA[i] = 0x32 + } + if m.HostsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) + i-- + dAtA[i] = 0x28 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- + dAtA[i] = 0x22 + } + if m.TasksCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) + i-- + dAtA[i] = 0x18 + } + if m.EnvironmentsCount != 0 { + i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) + i-- + dAtA[i] = 0x10 + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { +func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -5969,12 +5779,12 @@ func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -5983,45 +5793,17 @@ func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) + if len(m.Reason) > 0 { + i -= len(m.Reason) + copy(dAtA[i:], m.Reason) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) i-- - dAtA[i] = 0x8 + dAtA[i] = 0xa } return len(dAtA) - i, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { +func (m *TeardownReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6031,12 +5813,12 @@ func (m *Event) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6045,215 +5827,10 @@ func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentStateChanged != nil { - { - size, err := m.EnvironmentStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentCreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentCreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentCreated != nil { - { - size, err := m.EnvironmentCreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStateChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStateChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStateChanged != nil { - { - size, err := m.TaskStateChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskStatusChanged) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_TaskStatusChanged) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskStatusChanged != nil { - { - size, err := m.TaskStatusChanged.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - return len(dAtA) - i, nil -} -func (m *Event_Tasklaunched) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_Tasklaunched) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Tasklaunched != nil { - { - size, err := m.Tasklaunched.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - return len(dAtA) - i, nil -} -func (m *Event_MesosTaskcreated) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosTaskcreated) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosTaskcreated != nil { - { - size, err := m.MesosTaskcreated.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentDestroyed) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentDestroyed) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentDestroyed != nil { - { - size, err := m.EnvironmentDestroyed.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x42 - } - return len(dAtA) - i, nil -} -func (m *Event_EnvironmentError) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentError) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentError != nil { - { - size, err := m.EnvironmentError.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x4a - } return len(dAtA) - i, nil } -func (m *Event_Taskskilled) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} -func (m *Event_Taskskilled) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.Taskskilled != nil { - { - size, err := m.Taskskilled.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x52 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6263,12 +5840,12 @@ func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6280,7 +5857,7 @@ func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { +func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6290,12 +5867,12 @@ func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6304,10 +5881,31 @@ func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Environments) > 0 { + for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintO2Control(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + } + if len(m.FrameworkId) > 0 { + i -= len(m.FrameworkId) + copy(dAtA[i:], m.FrameworkId) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) + i-- + dAtA[i] = 0xa + } return len(dAtA) - i, nil } -func (m *Version) Marshal() (dAtA []byte, err error) { +func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6317,286 +5915,12 @@ func (m *Version) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *Version) MarshalTo(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6804,7 +6128,7 @@ func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { +func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -6814,12 +6138,12 @@ func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -6828,7 +6152,67 @@ func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - return len(dAtA) - i, nil + if len(m.Id) > 0 { + i -= len(m.Id) + copy(dAtA[i:], m.Id) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) + i-- + dAtA[i] = 0x1a + } + if len(m.Vars) > 0 { + for k := range m.Vars { + v := m.Vars[k] + baseI := i + i -= len(v) + copy(dAtA[i:], v) + i = encodeVarintO2Control(dAtA, i, uint64(len(v))) + i-- + dAtA[i] = 0x12 + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintO2Control(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x12 + } + } + if len(m.WorkflowTemplate) > 0 { + i -= len(m.WorkflowTemplate) + copy(dAtA[i:], m.WorkflowTemplate) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + return len(dAtA) - i, nil } func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { @@ -8964,13 +8348,13 @@ func (m *Event_MesosHeartbeat) Size() (n int) { return n } -func (m *Ev_EnvironmentStateChanged) Size() (n int) { +func (m *Ev_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Environmentid) + l = len(m.EnvironmentId) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -8981,23 +8365,7 @@ func (m *Ev_EnvironmentStateChanged) Size() (n int) { if m.CurrentRunNumber != 0 { n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) + l = len(m.Error) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9007,7 +8375,7 @@ func (m *Ev_TaskStateChanged) Size() (n int) { return n } -func (m *Ev_TaskStatusChanged) Size() (n int) { +func (m *Ev_TaskEvent) Size() (n int) { if m == nil { return 0 } @@ -9017,23 +8385,11 @@ func (m *Ev_TaskStatusChanged) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - l = len(m.Status) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskLaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Taskid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } @@ -9043,93 +8399,24 @@ func (m *Ev_TaskLaunched) Size() (n int) { return n } -func (m *Ev_MesosTaskCreated) Size() (n int) { +func (m *Ev_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - l = len(m.Taskresources) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorResources) + l = len(m.Name) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentDestroyed) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Environmentid) + l = len(m.Status) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentError) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Error) + l = len(m.State) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - if m.CloseStream { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TasksKilled) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9219,120 +8506,52 @@ func (m *Event) Size() (n int) { return n } -func (m *Event_EnvironmentStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentStateChanged != nil { - l = m.EnvironmentStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_EnvironmentCreated) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentCreated != nil { - l = m.EnvironmentCreated.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStateChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStateChanged != nil { - l = m.TaskStateChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskStatusChanged) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskStatusChanged != nil { - l = m.TaskStatusChanged.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_Tasklaunched) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Tasklaunched != nil { - l = m.Tasklaunched.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_MesosTaskcreated) Size() (n int) { +func (m *Event_EnvironmentEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.MesosTaskcreated != nil { - l = m.MesosTaskcreated.Size() + if m.EnvironmentEvent != nil { + l = m.EnvironmentEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentDestroyed) Size() (n int) { +func (m *Event_TaskEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentDestroyed != nil { - l = m.EnvironmentDestroyed.Size() + if m.TaskEvent != nil { + l = m.TaskEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_EnvironmentError) Size() (n int) { +func (m *Event_RoleEvent) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.EnvironmentError != nil { - l = m.EnvironmentError.Size() + if m.RoleEvent != nil { + l = m.RoleEvent.Size() n += 1 + l + sovO2Control(uint64(l)) } return n } -func (m *Event_Taskskilled) Size() (n int) { +func (m *SubscribeRequest) Size() (n int) { if m == nil { return 0 } var l int _ = l - if m.Taskskilled != nil { - l = m.Taskskilled.Size() + l = len(m.Id) + if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -9584,6 +8803,34 @@ func (m *NewEnvironmentReply) Size() (n int) { return n } +func (m *NewAutoEnvironmentRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.WorkflowTemplate) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if len(m.Vars) > 0 { + for k, v := range m.Vars { + _ = k + _ = v + mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) + n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) + } + } + l = len(m.Id) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *NewAutoEnvironmentReply) Size() (n int) { if m == nil { return 0 @@ -10555,452 +9802,25 @@ func (m *SetRepoDefaultRevisionReply) Size() (n int) { return n } -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environmentid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStateChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStateChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStateChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskStatusChanged) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskStatusChanged: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskStatusChanged: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF +func (m *Empty) Size() (n int) { + if m == nil { + return 0 } - return nil + var l int + _ = l + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func sovO2Control(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 } -func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { +func sozO2Control(x uint64) (n int) { + return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Event_MesosHeartbeat) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11023,44 +9843,12 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_TaskLaunched: wiretype end group for non-group") + return fmt.Errorf("proto: Event_MesosHeartbeat: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskLaunched: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -11086,7 +9874,7 @@ func (m *Ev_TaskLaunched) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { +func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11109,15 +9897,15 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_EnvironmentEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_MesosTaskCreated: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskresources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11145,11 +9933,11 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Taskresources = string(dAtA[iNdEx:postIndex]) + m.EnvironmentId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorResources", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11177,67 +9965,32 @@ func (m *Ev_MesosTaskCreated) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.ExecutorResources = string(dAtA[iNdEx:postIndex]) + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentCreated) 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 ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break + m.CurrentRunNumber = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CurrentRunNumber |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentCreated: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11247,27 +10000,23 @@ func (m *Ev_EnvironmentCreated) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11294,7 +10043,7 @@ func (m *Ev_EnvironmentCreated) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { +func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11317,17 +10066,17 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_TaskEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentDestroyed: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_TaskEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Taskid", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11337,31 +10086,59 @@ func (m *Ev_EnvironmentDestroyed) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} + m.Taskid = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environmentid", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11389,7 +10166,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Environmentid = string(dAtA[iNdEx:postIndex]) + m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11416,7 +10193,7 @@ func (m *Ev_EnvironmentDestroyed) Unmarshal(dAtA []byte) error { } return nil } -func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { +func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -11439,15 +10216,15 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: Ev_EnvironmentError: wiretype end group for non-group") + return fmt.Errorf("proto: Ev_RoleEvent: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentError: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: Ev_RoleEvent: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Name", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -11475,13 +10252,13 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Error = string(dAtA[iNdEx:postIndex]) + m.Name = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CloseStream", wireType) + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var v int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11491,71 +10268,29 @@ func (m *Ev_EnvironmentError) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - v |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - m.CloseStream = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TasksKilled) 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 ErrIntOverflowO2Control - } - 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: Ev_TasksKilled: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TasksKilled: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Status = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowO2Control @@ -11565,25 +10300,23 @@ func (m *Ev_TasksKilled) 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 ErrInvalidLengthO2Control } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthO2Control } if postIndex > l { return io.ErrUnexpectedEOF } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -11955,7 +10688,7 @@ func (m *Event) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentStateChanged", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -11982,15 +10715,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentStateChanged{} + v := &Ev_EnvironmentEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentStateChanged{v} + m.Payload = &Event_EnvironmentEvent{v} iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentCreated", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12017,225 +10750,15 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_EnvironmentCreated{} + v := &Ev_TaskEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_EnvironmentCreated{v} + m.Payload = &Event_TaskEvent{v} iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStateChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStateChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStateChanged{v} - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskStatusChanged", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskStatusChanged{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskStatusChanged{v} - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasklaunched", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskLaunched{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_Tasklaunched{v} - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosTaskcreated", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_MesosTaskCreated{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_MesosTaskcreated{v} - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentDestroyed", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentDestroyed{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentDestroyed{v} - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentError", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentError{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentError{v} - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Taskskilled", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -12262,11 +10785,11 @@ func (m *Event) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &Ev_TasksKilled{} + v := &Ev_RoleEvent{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Payload = &Event_Taskskilled{v} + m.Payload = &Event_RoleEvent{v} iNdEx = postIndex default: iNdEx = preIndex @@ -12312,16 +10835,48 @@ func (m *SubscribeRequest) Unmarshal(dAtA []byte) error { if b < 0x80 { break } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: SubscribeRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SubscribeRequest: 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) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -14084,6 +12639,251 @@ func (m *NewEnvironmentReply) Unmarshal(dAtA []byte) error { } return nil } +func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control + } + 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: NewAutoEnvironmentRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthO2Control + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Vars == nil { + m.Vars = 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 ErrIntOverflowO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthO2Control + } + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postStringIndexmapvalue := iNdEx + intStringLenmapvalue + if postStringIndexmapvalue < 0 { + return ErrInvalidLengthO2Control + } + if postStringIndexmapvalue > l { + return io.ErrUnexpectedEOF + } + mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) + iNdEx = postStringIndexmapvalue + } else { + iNdEx = entryPreIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.Vars[mapkey] = mapvalue + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Id = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipO2Control(dAtA[iNdEx:]) + if err != nil { + return err + } + if skippy < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) < 0 { + return ErrInvalidLengthO2Control + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *NewAutoEnvironmentReply) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 29edd372e..9c538be96 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -33,47 +33,23 @@ option go_package = "pb"; message Event_MesosHeartbeat { } -message Ev_EnvironmentStateChanged { - string environmentid = 1; +message Ev_EnvironmentEvent { + string environmentId = 1; string state = 2; uint32 currentRunNumber = 3; + string error = 4; } -message Ev_TaskStateChanged { +message Ev_TaskEvent { string taskid = 1; string state = 2; + string status = 3; } -message Ev_TaskStatusChanged { - string taskid = 1; +message Ev_RoleEvent { + string name = 1; string status = 2; -} - -message Ev_TaskLaunched { - string taskid = 1; -} - -message Ev_MesosTaskCreated { - string taskresources = 1; - string executorResources = 2; -} - -message Ev_EnvironmentCreated { - EnvironmentInfo environment = 1; -} - -message Ev_EnvironmentDestroyed { - CleanupTasksReply cleanupTasksReply = 1; - string environmentid = 2; -} - -message Ev_EnvironmentError { - string error = 1; - bool closeStream = 2; -} - -message Ev_TasksKilled { - repeated ShortTaskInfo killedTasks = 1; + string state = 3; } ////////////////////////////////////////////////////// @@ -85,7 +61,7 @@ service Control { rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} - rpc NewAutoEnvironment(NewEnvironmentRequest) returns (stream Event); + rpc NewAutoEnvironment (NewAutoEnvironmentRequest) returns (NewAutoEnvironmentReply) {} rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} @@ -138,20 +114,14 @@ message StatusUpdate { message Event { string timestamp = 1; oneof Payload { - Ev_EnvironmentStateChanged environmentStateChanged = 2; - Ev_EnvironmentCreated environmentCreated = 3; - Ev_TaskStateChanged taskStateChanged = 4; - Ev_TaskStatusChanged taskStatusChanged = 5; - Ev_TaskLaunched tasklaunched = 6; - Ev_MesosTaskCreated mesosTaskcreated = 7; - Ev_EnvironmentDestroyed environmentDestroyed = 8; - Ev_EnvironmentError environmentError = 9; - Ev_TasksKilled taskskilled = 10; + Ev_EnvironmentEvent environmentEvent = 2; + Ev_TaskEvent taskEvent = 3; + Ev_RoleEvent roleEvent = 4; } } message SubscribeRequest{ - + string id = 1; } //////////////////////////////////////// // Framework @@ -208,6 +178,11 @@ message NewEnvironmentRequest { message NewEnvironmentReply { EnvironmentInfo environment = 1; } +message NewAutoEnvironmentRequest { + string workflowTemplate = 1; + map vars = 2; + string id = 3; +} message NewAutoEnvironmentReply { } diff --git a/core/protos/protoutils.go b/core/protos/protoutils.go new file mode 100644 index 000000000..0a6541e51 --- /dev/null +++ b/core/protos/protoutils.go @@ -0,0 +1,37 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package pb + +import ( + "time" +) + +func WrapEvent(ce isEvent_Payload) *Event { + return &Event{ + Timestamp:time.Now().Format(time.RFC3339), + Payload: ce, + } +} diff --git a/core/server.go b/core/server.go index 5b9597847..08591928a 100644 --- a/core/server.go +++ b/core/server.go @@ -672,8 +672,6 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe } else { return nil } - case err := <- sub.Err(): - return err } } } diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 143b856f7..71934468a 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -177,31 +177,4 @@ func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { state: state, } return t -} - -func NewEnvironmentErrorMessage(err string) (t *TaskmanMessage) { - t = newTaskmanMessage(taskop.Error) - t.environmentMessage = environmentMessage{ - errSt: err, - } - return t -} - -// type killTasksMessage struct { -// taskIds []string -// } - -// func(km *killTasksMessage) GetTaskIds() []string { -// if km == nil { -// return nil -// } -// return km.taskIds -// } - -// func NewkillTasksMessage(taskids []string) (t *TaskmanMessage) { -// t = NewTaskmanMessage(event.KillTasks) -// t.killTasksMessage = killTasksMessage{ -// taskIds: taskids, -// } -// return t -// } +} \ No newline at end of file diff --git a/core/task/manager.go b/core/task/manager.go index aaafe5c8a..01cbaa1a8 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -34,7 +34,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" - pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/common/utils/uid" @@ -78,13 +77,11 @@ type Manager struct { tasksFinished int schedulerState *schedulerState - publicEventFeed *EventFeed internalEventCh chan<- event.Event ackKilledTasks *safeAcks } func NewManager(shutdown func(), - publicEventFeed *EventFeed, internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need @@ -113,7 +110,6 @@ func NewManager(shutdown func(), taskman = &Manager{ classes: newClasses(), roster: newRoster(), - publicEventFeed: publicEventFeed, internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) @@ -639,7 +635,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} - go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId,"KILLED")) } return @@ -660,7 +655,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - go m.publicEventFeed.Send(pb.NewEventTaskStatus(taskId, taskPtr.status.String())) } // Kill all tasks outside an environment (all unlocked tasks) @@ -677,7 +671,6 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - toKill := m.roster.filtered(func(t *Task) bool { if t.IsLocked() { return false @@ -706,7 +699,6 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err close(ack) m.ackKilledTasks.deleteKey(id) } - go m.publicEventFeed.Send(pb.NewKillTasksEvent(tasksToShortTaskInfos(killed))) return } @@ -789,13 +781,11 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go func(){ err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), CONFIGURED.String(), tm.GetRunNumber())) }() case taskop.TransitionTasks: go func(){ err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) - m.publicEventFeed.Send(pb.NewEnvironmentStateEvent(tm.GetEnvironmentId(), tm.GetDestination(), tm.GetRunNumber())) }() case taskop.TaskStatusMessage: mesosStatus := tm.status @@ -837,14 +827,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) - go m.publicEventFeed.Send(pb.NewEventTaskState(tm.taskId, tm.state)) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) - case taskop.Error: - // error reported from environment need to inform stream - // FIXME: A better way to publish errors to stream that - // are not from the taskman. - go m.publicEventFeed.Send(pb.NewEnvironmentErrorEvent(tm.GetError(), true)) } diff --git a/core/task/taskutil.go b/core/task/safeacks.go similarity index 71% rename from core/task/taskutil.go rename to core/task/safeacks.go index 6782fc134..e458ee7fe 100644 --- a/core/task/taskutil.go +++ b/core/task/safeacks.go @@ -26,41 +26,8 @@ package task import ( "sync" - "github.com/AliceO2Group/Control/core/protos" ) -func taskToShortTaskInfo(t *Task) (sti *pb.ShortTaskInfo) { - if t == nil { - return - } - sti = &pb.ShortTaskInfo{ - Name: t.GetName(), - Locked: t.IsLocked(), - TaskId: t.GetTaskId(), - ClassName: t.GetClassName(), - DeploymentInfo: &pb.TaskDeploymentInfo{ - Hostname: t.GetHostname(), - AgentId: t.GetAgentId(), - OfferId: t.GetOfferId(), - ExecutorId: t.GetExecutorId(), - }, - Pid: t.GetTaskPID(), - } - return -} - -func tasksToShortTaskInfos(tasks []*Task) (stis []*pb.ShortTaskInfo) { - if tasks == nil { - return - } - stis = make([]*pb.ShortTaskInfo, len(tasks)) - for i, t := range tasks { - shortTaskInfo := taskToShortTaskInfo(t) - stis[i] = shortTaskInfo - } - return -} - type safeAcks struct { mu sync.RWMutex acks map[string]chan struct{} diff --git a/core/task/scheduler.go b/core/task/scheduler.go index ca3cc1857..6d1bbbf37 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -45,7 +45,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" - cpb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/executor/protos" "github.com/gogo/protobuf/proto" @@ -690,7 +689,6 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("executorResources", executorResources). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) - go state.taskman.publicEventFeed.Send(cpb.NewEventMesosTaskCreated(resourcesRequest.String(), executorResources.String())) newTaskId := taskPtr.GetTaskId() @@ -729,7 +727,6 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - go state.taskman.publicEventFeed.Send(cpb.NewEventTaskLaunch(newTaskId)) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/subscriber.go b/core/task/subscriber.go deleted file mode 100644 index 14b465923..000000000 --- a/core/task/subscriber.go +++ /dev/null @@ -1,97 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - - -package task - -import ( - "sync" - - pb "github.com/AliceO2Group/Control/core/protos" -) - -type Subscription interface { - Unsubscribe() - Err() <-chan error -} - -type EventFeed struct { - mu sync.RWMutex - streams []chan *pb.Event -} - -func (e *EventFeed) Send(data *pb.Event) { - e.mu.RLock() - defer e.mu.RUnlock() - for _, stream := range e.streams { - stream <- data - } -} - -func (e *EventFeed) Subscribe(stream chan *pb.Event) Subscription { - e.mu.Lock() - defer e.mu.Unlock() - e.streams = append(e.streams, stream) - return &sub{ - feed: e, - channelIndex: len(e.streams)-1, - channel: stream, - err: make(chan error, 1), - } -} - -// removes an channel at index i efficiently as order does not -// matter for listeners we keep track of. -func (e *EventFeed) remove(i int) { - e.mu.Lock() - close(e.streams[i]) - e.streams[i] = e.streams[len(e.streams)-1] - e.streams = e.streams[:len(e.streams)-1] - e.mu.Unlock() -} - -func NewEventFeed() *EventFeed { - return &EventFeed{ - streams: make([]chan *pb.Event, 0), - } -} - -type sub struct { - feed *EventFeed - channelIndex int - channel chan *pb.Event - once sync.Once - err chan error -} - -func (s *sub) Unsubscribe() { - s.once.Do(func() { - s.feed.remove(s.channelIndex) - close(s.err) - }) -} - -func (s *sub) Err() <-chan error { - return s.err -} From 00d556188afcb4ae9d00189df39322c7c300518b Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 1 Dec 2020 19:04:24 +0100 Subject: [PATCH 0661/2352] [core] stream events per environment --- core/environment/environment.go | 29 ++++- core/environment/eventStream.go | 122 +++++++++++++++++++ core/environment/manager.go | 84 ++++++++++--- core/environment/transition_configure.go | 2 + core/environment/transition_reset.go | 2 + core/environment/transition_startactivity.go | 6 + core/environment/transition_stopactivity.go | 2 + core/task/manager.go | 2 + core/task/scheduler.go | 1 + core/task/task.go | 15 +++ core/workflow/aggregatorrole.go | 3 + core/workflow/parentadapter.go | 12 +- core/workflow/role.go | 2 + core/workflow/rolebase.go | 8 ++ core/workflow/taskrole.go | 3 + 15 files changed, 274 insertions(+), 19 deletions(-) create mode 100644 core/environment/eventStream.go diff --git a/core/environment/environment.go b/core/environment/environment.go index cae462a2c..10e3b4074 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -67,6 +67,7 @@ type Environment struct { UserVars gera.StringMap // From user input stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} + eventStream Subscription } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -99,6 +100,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, + func(ev event.Event) { + if env.eventStream != nil{ + env.eventStream.Send(ev) + }}, ) env.Sm = fsm.NewFSM( "STANDBY", @@ -422,4 +427,26 @@ func (env *Environment) unsubscribeFromWfState() { default: close(env.unsubscribe) } -} \ No newline at end of file +} + +func (env *Environment) addSubscription(sub Subscription) { + env.Mu.Lock() + env.eventStream = sub + env.Mu.Unlock() +} + +func (env *Environment) sendEnvironmentEvent(ev event.Event) { + env.Mu.Lock() + if env.eventStream != nil { + env.eventStream.Send(ev) + } + env.Mu.Unlock() +} + +func (env *Environment) closeStream() { + env.Mu.Lock() + if env.eventStream != nil { + env.eventStream.Unsubscribe() + } + env.Mu.Unlock() +} diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go new file mode 100644 index 000000000..40ee93d65 --- /dev/null +++ b/core/environment/eventStream.go @@ -0,0 +1,122 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package environment + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/common/event" +) + +type Subscription interface { + Unsubscribe() + GetFeed() chan *pb.Event + Send(event.Event) + Err() <-chan error +} + +type eventStream struct { + stream chan *pb.Event +} + +func SubscribeToStream(ch chan *pb.Event) Subscription { + return &eventSub{ + feed: &eventStream{ + stream: ch, + }, + err: make(chan error), + } +} + +func (e *eventStream) send(data *pb.Event) { + if e.stream != nil { + e.stream <- data + } +} + +func (e *eventStream) closeStream() { + close(e.stream) +} + +type eventSub struct { + feed *eventStream + once sync.Once + err chan error +} + +func (s *eventSub) Unsubscribe() { + s.once.Do(func() { + s.feed.closeStream() + close(s.err) + }) +} + +func (s *eventSub) GetFeed() chan *pb.Event { + return s.feed.stream +} + +func (s *eventSub) Send(ev event.Event) { + var data *pb.Event + + switch typedEvent := ev.(type) { + case *event.RoleEvent: + re := pb.Event_RoleEvent{ + RoleEvent: &pb.Ev_RoleEvent{ + Name: typedEvent.GetName(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + }, + } + data = pb.WrapEvent(&re) + case *event.TaskEvent: + re := pb.Event_TaskEvent{ + TaskEvent: &pb.Ev_TaskEvent{ + Taskid: typedEvent.GetName(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + }, + } + data = pb.WrapEvent(&re) + case *event.EnvironmentEvent: + re := pb.Event_EnvironmentEvent{ + EnvironmentEvent: &pb.Ev_EnvironmentEvent{ + EnvironmentId: typedEvent.GetName(), + State: typedEvent.GetState(), + CurrentRunNumber: typedEvent.GetRun(), + Error: typedEvent.GetError(), + }, + } + data = pb.WrapEvent(&re) + default: + // noop + } + s.feed.send(data) +} + +func (s *eventSub) Err() <-chan error { + return s.err +} \ No newline at end of file diff --git a/core/environment/manager.go b/core/environment/manager.go index e8280e8d0..707cfca9f 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -236,6 +236,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error delete(envs.m, environmentId) env.unsubscribeFromWfState() + env.closeStream() return err } @@ -363,28 +364,81 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } -func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub task.Subscription) { - defer sub.Unsubscribe() - id, err := envs.CreateEnvironment(workflowPath, userVars) - +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { + // defer sub.Unsubscribe() + // id, err := envs.CreateEnvironment(workflowPath, userVars) + envs.mu.Lock() + + envUserVars := make(map[string]string) + workflowUserVars := make(map[string]string) + for k, v := range userVars { + if strings.ContainsRune(k, task.TARGET_SEPARATOR_RUNE) { + workflowUserVars[k] = v + } else { + envUserVars[k] = v + } + } + + env, err := newEnvironment(envUserVars) + if err != nil { + return + } + env.addSubscription(sub) + env.hookHandlerF = func(hooks task.Tasks) error { + return envs.taskman.TriggerHooks(hooks) + } + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) + if err != nil { + err = fmt.Errorf("cannot load workflow template: %w", err) + return + } + + envs.m[env.id] = env + envs.pendingStateChangeCh[env.id] = env.stateChangedCh + env.subscribeToWfState(envs.taskman) + + err = env.TryTransition(NewConfigureTransition( + envs.taskman, + nil, //roles, + nil, + true )) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + envState := env.CurrentState() + envTasks := env.Workflow().GetTasks() + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) + envs.taskman.MessageChannel <- taskmanMessage + + delete(envs.m, env.id) + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + }). + Warn("environment deployment failed, tasks were cleaned up") + return } - env, err := envs.Environment(id) + envs.mu.Unlock() + + if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + return + } // now we have the environment we should transition to start trans := NewStartActivityTransition(envs.taskman) if trans == nil { - // environment error should report - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } err = env.TryTransition(trans) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } @@ -395,30 +449,26 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // RUN finished so we can reset and delete the environment err := env.TryTransition(NewResetTransition(envs.taskman)) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } - err = envs.TeardownEnvironment(id, false) + err = envs.TeardownEnvironment(env.id, false) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } tasksForEnv := env.Workflow().GetTasks().GetTaskIds() _, _, err = envs.taskman.KillTasks(tasksForEnv) if err != nil { - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage(err.Error()) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("") return case "ERROR": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment ERROR state") return case "MIXED": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment MIXED state") return case "": - envs.taskman.MessageChannel <- task.NewEnvironmentErrorMessage("Environment not found") return } } diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 318ca1961..770da5f33 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -28,6 +28,7 @@ import ( "errors" "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/pborman/uuid" @@ -190,5 +191,6 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index b09883d92..8aed45c4f 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" ) @@ -63,5 +64,6 @@ func (t ResetTransition) do(env *Environment) (err error) { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "RESET"}) return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index ee684b4c0..37dc77c12 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -28,6 +28,7 @@ import ( "errors" "strconv" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" @@ -83,6 +84,11 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } log.WithField(infologger.Run, env.currentRunNumber).Info("run started") + env.sendEnvironmentEvent(&event.EnvironmentEvent{ + EnvironmentID: env.Id().String(), + State: "RUNNING", + Run: env.currentRunNumber, + }) return } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bebd6d2e5..9aa22c4d9 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" ) @@ -67,6 +68,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { return tasksStateErrors } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return } diff --git a/core/task/manager.go b/core/task/manager.go index 01cbaa1a8..fb4bbc287 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,6 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false + taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, State: state}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -655,6 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } + taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, Status: taskPtr.status.String()}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 6d1bbbf37..c8aa64cb8 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,6 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") + taskPtr.SendEvent(&event.TaskEvent{TaskID: newTaskId, State:"LAUNCHED"}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/task/task.go b/core/task/task.go index 7ca799a2d..406cf73f5 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -43,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" @@ -68,6 +69,7 @@ type parentRole interface { GetUserVars() gera.StringMap ConsolidatedVarStack() (varStack map[string]string, err error) CollectInboundChannels() []channel.Inbound + SendEvent(event.Event) } @@ -387,6 +389,19 @@ func (t *Task) GetEnvironmentId() uid.ID { return t.parent.GetEnvironmentId() } +func (t *Task) SendEvent(ev event.Event) { + if t == nil { + return + } + t.mu.RLock() + defer t.mu.RUnlock() + + if t.parent == nil { + return + } + t.parent.SendEvent(ev) +} + func (t *Task) GetLocalBindMap() channel.BindMap { t.mu.RLock() defer t.mu.RUnlock() diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 54cb05d23..3500fc878 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,6 +29,7 @@ import ( "strings" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -189,6 +190,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") + r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) } @@ -200,6 +202,7 @@ func (r *aggregatorRole) updateState(s task.State) { } log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") r.state.merge(s, r) + r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String()}) if r.parent != nil { r.parent.updateState(r.state.get()) } diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 17d2eedd8..e42f8cc81 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -28,6 +28,7 @@ import ( "sync" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" @@ -37,6 +38,8 @@ type GetEnvIdFunc func() uid.ID type GetStringMapFunc func() gera.StringMap +type SendEvents func(event.Event) + type ParentAdapter struct { mu sync.Mutex getEnvIdFunc GetEnvIdFunc @@ -44,6 +47,7 @@ type ParentAdapter struct { getDefaultsFunc GetStringMapFunc getVarsFunc GetStringMapFunc getUserVarsFunc GetStringMapFunc + SendEvents SendEvents stateSubscriptions map[string]chan task.State statusSubscriptions map[string]chan task.Status @@ -52,12 +56,14 @@ type ParentAdapter struct { func NewParentAdapter(getEnvId GetEnvIdFunc, getDefaults GetStringMapFunc, getVars GetStringMapFunc, - getUserVars GetStringMapFunc) *ParentAdapter { + getUserVars GetStringMapFunc, + SendEvents SendEvents) *ParentAdapter { return &ParentAdapter{ getEnvIdFunc: getEnvId, getDefaultsFunc: getDefaults, getVarsFunc: getVars, getUserVarsFunc: getUserVars, + SendEvents: SendEvents, stateSubscriptions: make(map[string]chan task.State), statusSubscriptions: make(map[string]chan task.Status, 0), } @@ -140,4 +146,8 @@ func (p *ParentAdapter) GetUserVars() gera.StringMap { func (*ParentAdapter) CollectInboundChannels() []channel.Inbound { return make([]channel.Inbound, 0) +} + +func (p *ParentAdapter) SendEvent(ev event.Event) { + p.SendEvents(ev) } \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index f14612a1a..e55213d58 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -30,6 +30,7 @@ package workflow import ( "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -70,6 +71,7 @@ type Updatable interface { GetPath() string CollectOutboundChannels() []channel.Outbound CollectInboundChannels() []channel.Inbound + SendEvent(event.Event) } type VarNode interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 786c9dd1b..5020b2897 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -29,6 +29,7 @@ import ( "strings" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" @@ -294,6 +295,13 @@ func (r* roleBase) GetEnvironmentId() uid.ID { return r.parent.GetEnvironmentId() } +func (r* roleBase) SendEvent(ev event.Event) { + if r.parent == nil { + return + } + r.parent.SendEvent(ev) +} + func (r *roleBase) GetPath() string { if r == nil { return "" diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 1b7683cec..94c75595b 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -30,6 +30,7 @@ import ( texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow/template" @@ -180,6 +181,7 @@ func (t *taskRole) updateStatus(s task.Status) { log.WithField("status", s.String()).Error("cannot update status with nil parent") } t.status.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String()}) t.parent.updateStatus(s) } @@ -189,6 +191,7 @@ func (t *taskRole) updateState(s task.State) { } log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") t.state.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String()}) t.parent.updateState(s) } From 956416476423fb3b4ed409a9061acb43f48ce71a Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 2 Dec 2020 12:16:00 +0100 Subject: [PATCH 0662/2352] [coconut] Report environment error --- coconut/control/control.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 5bcef0ad6..0fcc23f4e 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -226,11 +226,11 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - if evt:= rcv.GetEnvironmentEvent(); evt != nil{ + if evt := rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { log.WithPrefix("Event"). - WithError(err). - Error("environment error") + WithError(fmt.Errorf(evt.Error)). + Error(evt.EnvironmentId) return nil } } From cc22af0b9acd1585b19bcd807911f8e038bab7d7 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 2 Dec 2020 12:29:05 +0100 Subject: [PATCH 0663/2352] [core] Wait for release tasks when cleanup a failing new Environment --- core/environment/environment.go | 1 + core/environment/manager.go | 40 ++++++++++++++++++++++++++++----- core/server.go | 11 +++++---- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 10e3b4074..7c9e90f6c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -447,6 +447,7 @@ func (env *Environment) closeStream() { env.Mu.Lock() if env.eventStream != nil { env.eventStream.Unsubscribe() + env.eventStream = nil } env.Mu.Unlock() } diff --git a/core/environment/manager.go b/core/environment/manager.go index 707cfca9f..d996e9ba0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -182,7 +182,8 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }). Warn("environment deployment failed, tasks were cleaned up") - // close state channels + // close state channels and stream + env.closeStream() close(envs.pendingStateChangeCh[env.Id()]) delete(envs.pendingStateChangeCh, env.Id()) @@ -365,9 +366,6 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { - // defer sub.Unsubscribe() - // id, err := envs.CreateEnvironment(workflowPath, userVars) - envs.mu.Lock() envUserVars := make(map[string]string) workflowUserVars := make(map[string]string) @@ -381,20 +379,25 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str env, err := newEnvironment(envUserVars) if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } env.addSubscription(sub) + defer env.closeStream() env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) } env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } + envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh + envs.mu.Unlock() env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( @@ -406,9 +409,29 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envState := env.CurrentState() envTasks := env.Workflow().GetTasks() taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) + pendingCh := make(chan *event.TasksReleasedEvent) + envs.mu.Lock() + envs.pendingTeardownsCh[env.Id()] = pendingCh + envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage + incomingEv := <- pendingCh + + // If some tasks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": env.Id().String(), + }). + WithError(err). + Warn("task failed to release") + } + } + + envs.mu.Lock() delete(envs.m, env.id) + envs.mu.Unlock() killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { log.WithError(rlsErr).Warn("task teardown error") @@ -418,11 +441,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "lastEnvState": envState, }). Warn("environment deployment failed, tasks were cleaned up") - + + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + // close state channel + envs.mu.Lock() + close(envs.pendingStateChangeCh[env.Id()]) + delete(envs.pendingStateChangeCh, env.Id()) + envs.mu.Unlock() return } - envs.mu.Unlock() if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) diff --git a/core/server.go b/core/server.go index 08591928a..5d4cc26aa 100644 --- a/core/server.go +++ b/core/server.go @@ -664,14 +664,13 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe for { select { case event, ok := <- ch: - if ok { - err := srv.Send(event) - if err != nil { - return err - } - } else { + if !ok { return nil } + err := srv.Send(event) + if err != nil { + return err + } } } } From 8e2efdf97c45d7e019e9270c8f69753ef4b0322e Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 4 Dec 2020 17:55:40 +0100 Subject: [PATCH 0664/2352] [common] Add more info to the events structs --- common/event/roleevent.go | 5 +++++ common/event/taskevents.go | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/common/event/roleevent.go b/common/event/roleevent.go index 6de7d09f9..cdd907b40 100644 --- a/common/event/roleevent.go +++ b/common/event/roleevent.go @@ -29,6 +29,7 @@ type RoleEvent struct { Name string Status string State string + RolePath string } func (r *RoleEvent) GetName() string { @@ -41,4 +42,8 @@ func (r *RoleEvent) GetStatus() string { func (r *RoleEvent) GetState() string { return r.State +} + +func (r *RoleEvent) GetRolePath() string { + return r.RolePath } \ No newline at end of file diff --git a/common/event/taskevents.go b/common/event/taskevents.go index b3afd10bc..94c533dc7 100644 --- a/common/event/taskevents.go +++ b/common/event/taskevents.go @@ -26,12 +26,19 @@ package event type TaskEvent struct { eventBase - TaskID string + Name string + TaskID string Status string State string + Hostname string + ClassName string } func (r *TaskEvent) GetName() string { + return r.Name +} + +func (r *TaskEvent) GetTaskID() string { return r.TaskID } @@ -41,4 +48,12 @@ func (r *TaskEvent) GetStatus() string { func (r *TaskEvent) GetState() string { return r.State +} + +func (r *TaskEvent) GetHostname() string { + return r.Hostname +} + +func (r *TaskEvent) GetClassName() string { + return r.ClassName } \ No newline at end of file From df647d2625085254a73e9c89e9e4972db7aa4fd2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 4 Dec 2020 18:01:02 +0100 Subject: [PATCH 0665/2352] [core] Stream events with more info --- coconut/protos/o2control.pb.go | 583 +++++++++++++++++++++----------- core/environment/eventStream.go | 6 +- core/protos/o2control.pb.go | 583 +++++++++++++++++++++----------- core/protos/o2control.proto | 10 +- core/task/manager.go | 4 +- core/task/scheduler.go | 2 +- core/workflow/aggregatorrole.go | 4 +- core/workflow/taskrole.go | 4 +- 8 files changed, 807 insertions(+), 389 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index b2d5f0a6b..fc1db7fb1 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -233,9 +233,12 @@ func (m *Ev_EnvironmentEvent) GetError() string { } type Ev_TaskEvent struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -274,6 +277,13 @@ func (m *Ev_TaskEvent) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (m *Ev_TaskEvent) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid @@ -295,10 +305,25 @@ func (m *Ev_TaskEvent) GetStatus() string { return "" } +func (m *Ev_TaskEvent) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Ev_TaskEvent) GetClassName() string { + if m != nil { + return m.ClassName + } + return "" +} + type Ev_RoleEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -358,6 +383,13 @@ func (m *Ev_RoleEvent) GetState() string { return "" } +func (m *Ev_RoleEvent) GetRolePath() string { + if m != nil { + return m.RolePath + } + return "" +} + //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -4040,188 +4072,189 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2890 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, - 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, - 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, - 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, - 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, - 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, - 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, - 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, - 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, - 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, - 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, - 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, - 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, - 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, - 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, - 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, - 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, - 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, - 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, - 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, - 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, - 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, - 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, - 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, - 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, - 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, - 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, - 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, - 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, - 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, - 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, - 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, - 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, - 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, - 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, - 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, - 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, - 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, - 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, - 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, - 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, - 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, - 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, - 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, - 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, - 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, - 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, - 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, - 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, - 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, - 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, - 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, - 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, - 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, - 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, - 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, - 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, - 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, - 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, - 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, - 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, - 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, - 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, - 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, - 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, - 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, - 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, - 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, - 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, - 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, - 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, - 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, - 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, - 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, - 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, - 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, - 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, - 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, - 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, - 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, - 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, - 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, - 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, - 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, - 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, - 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, - 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, - 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, - 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, - 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, - 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, - 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, - 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, - 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, - 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, - 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, - 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, - 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, - 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, - 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, - 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, - 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, - 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, - 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, - 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, - 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, - 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, - 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, - 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, - 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, - 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, - 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, - 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, - 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, - 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, - 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, - 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, - 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, - 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, - 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, - 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, - 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, - 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, - 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, - 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, - 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, - 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, - 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, - 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, - 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, - 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, - 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, - 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, - 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, - 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, - 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, - 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, - 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, - 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, - 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, - 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, - 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, - 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, - 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, - 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, - 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, - 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, - 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, - 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, - 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, - 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, - 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, - 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, - 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, - 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, - 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, - 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, - 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, - 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, - 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, - 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, - 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, - 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, - 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, - 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, - 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, - 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, - 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, - 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, - 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, - 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, - 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, - 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, - 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, - 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, - 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, - 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, - 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, - 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, + // 2906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, + 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, + 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, + 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, + 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, + 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, + 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, + 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, + 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, + 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, + 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, + 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, + 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, + 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, + 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, + 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, + 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, + 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, + 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, + 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, + 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, + 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, + 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, + 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, + 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, + 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, + 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, + 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, + 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, + 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, + 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, + 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, + 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, + 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, + 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, + 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, + 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, + 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, + 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, + 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, + 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, + 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, + 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, + 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, + 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, + 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, + 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, + 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, + 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, + 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, + 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, + 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, + 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, + 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, + 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, + 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, + 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, + 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, + 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, + 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, + 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, + 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, + 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, + 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, + 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, + 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, + 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, + 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, + 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, + 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, + 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, + 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, + 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, + 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, + 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, + 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, + 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, + 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, + 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, + 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, + 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, + 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, + 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, + 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, + 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, + 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, + 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, + 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, + 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, + 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, + 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, + 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, + 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, + 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, + 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, + 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, + 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, + 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, + 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, + 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, + 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, + 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, + 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, + 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, + 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, + 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, + 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, + 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, + 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, + 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, + 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, + 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, + 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, + 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, + 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, + 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, + 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, + 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, + 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, + 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, + 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, + 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, + 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, + 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, + 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, + 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, + 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, + 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, + 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, + 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, + 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, + 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, + 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, + 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, + 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, + 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, + 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, + 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, + 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, + 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, + 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, + 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, + 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, + 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, + 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, + 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, + 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, + 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, + 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, + 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, + 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, + 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, + 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, + 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, + 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, + 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, + 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, + 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, + 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, + 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, + 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, + 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, + 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, + 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, + 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, + 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, + 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, + 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, + 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, + 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, + 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, + 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, + 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, + 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, + 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, + 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, + 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, + 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, + 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, + 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, + 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5255,25 +5288,46 @@ func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0x2a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.Taskid) > 0 { i -= len(m.Taskid) copy(dAtA[i:], m.Taskid) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -5303,6 +5357,13 @@ func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.RolePath) > 0 { + i -= len(m.RolePath) + copy(dAtA[i:], m.RolePath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) + i-- + dAtA[i] = 0x22 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -8381,6 +8442,10 @@ func (m *Ev_TaskEvent) Size() (n int) { } var l int _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -8393,6 +8458,14 @@ func (m *Ev_TaskEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8417,6 +8490,10 @@ func (m *Ev_RoleEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.RolePath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10073,6 +10150,38 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Taskid", wireType) } @@ -10104,7 +10213,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Taskid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -10136,7 +10245,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } @@ -10168,6 +10277,70 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10318,6 +10491,38 @@ func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RolePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index 40ee93d65..fed9f63a2 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -89,15 +89,19 @@ func (s *eventSub) Send(ev event.Event) { Name: typedEvent.GetName(), State: typedEvent.GetState(), Status: typedEvent.GetStatus(), + RolePath: typedEvent.GetRolePath(), }, } data = pb.WrapEvent(&re) case *event.TaskEvent: re := pb.Event_TaskEvent{ TaskEvent: &pb.Ev_TaskEvent{ - Taskid: typedEvent.GetName(), + Name: typedEvent.GetName(), + Taskid: typedEvent.GetTaskID(), State: typedEvent.GetState(), Status: typedEvent.GetStatus(), + Hostname: typedEvent.GetHostname(), + ClassName: typedEvent.GetClassName(), }, } data = pb.WrapEvent(&re) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index b2d5f0a6b..fc1db7fb1 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -233,9 +233,12 @@ func (m *Ev_EnvironmentEvent) GetError() string { } type Ev_TaskEvent struct { - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -274,6 +277,13 @@ func (m *Ev_TaskEvent) XXX_DiscardUnknown() { var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (m *Ev_TaskEvent) GetName() string { + if m != nil { + return m.Name + } + return "" +} + func (m *Ev_TaskEvent) GetTaskid() string { if m != nil { return m.Taskid @@ -295,10 +305,25 @@ func (m *Ev_TaskEvent) GetStatus() string { return "" } +func (m *Ev_TaskEvent) GetHostname() string { + if m != nil { + return m.Hostname + } + return "" +} + +func (m *Ev_TaskEvent) GetClassName() string { + if m != nil { + return m.ClassName + } + return "" +} + type Ev_RoleEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -358,6 +383,13 @@ func (m *Ev_RoleEvent) GetState() string { return "" } +func (m *Ev_RoleEvent) GetRolePath() string { + if m != nil { + return m.RolePath + } + return "" +} + //////////////////////////////////////// // Global status //////////////////////////////////////// @@ -4040,188 +4072,189 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2890 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0x4d, 0x73, 0x1b, 0xc7, - 0xb1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0xa9, - 0x64, 0x5a, 0xf6, 0xa3, 0x6d, 0xda, 0xf5, 0xac, 0x27, 0x5b, 0xf6, 0xe3, 0x07, 0x44, 0xf1, 0x45, - 0x22, 0x99, 0x05, 0x24, 0x25, 0xaa, 0x4a, 0x29, 0x4b, 0xec, 0x80, 0x5c, 0x73, 0xb1, 0x0b, 0xef, - 0x2e, 0x40, 0xf1, 0x90, 0x5b, 0x6e, 0xa9, 0x54, 0xca, 0x95, 0x4b, 0x4e, 0xa9, 0x4a, 0xa5, 0xf2, - 0x1f, 0x72, 0xc8, 0x0f, 0x48, 0xa5, 0x92, 0x4a, 0x0e, 0xb9, 0x27, 0xe5, 0xfc, 0x01, 0xff, 0x84, - 0xd4, 0x7c, 0xed, 0xce, 0x7e, 0x81, 0x94, 0x55, 0xbe, 0xe4, 0x86, 0xee, 0xe9, 0xee, 0xe9, 0xaf, - 0x99, 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xf7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, - 0x9e, 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x57, 0xda, 0x63, 0xe2, 0x04, 0x2f, - 0x1e, 0x13, 0xdf, 0xf5, 0x1f, 0x12, 0xc3, 0x0b, 0x8e, 0x88, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, - 0x1e, 0xbf, 0x68, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc1, 0x1c, - 0x89, 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0xae, 0x40, 0xc9, 0x0f, - 0x8c, 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x0e, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, - 0x8f, 0x9c, 0xfd, 0xd1, 0xe0, 0x88, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, - 0x04, 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0x5d, 0x98, 0x6d, 0x8f, 0x5f, 0x74, - 0x0d, 0xff, 0x94, 0x6b, 0xb3, 0x04, 0x33, 0x81, 0xe1, 0x9f, 0x5a, 0x52, 0x0d, 0x01, 0xe5, 0xec, - 0xbf, 0x04, 0x33, 0xf4, 0xc7, 0xc8, 0x67, 0xbb, 0x56, 0x75, 0x01, 0xe1, 0x43, 0x26, 0x55, 0x77, - 0x6d, 0xc2, 0xa5, 0x22, 0x28, 0x3a, 0xc6, 0x80, 0x08, 0x99, 0xec, 0xb7, 0xc2, 0x5b, 0x50, 0x79, - 0xa3, 0x9d, 0xa6, 0x95, 0x9d, 0xf0, 0x3c, 0xcc, 0x75, 0xd8, 0xba, 0x4e, 0xbe, 0x1c, 0x11, 0x3f, - 0xc0, 0x47, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x1e, 0x71, 0x69, 0xaa, 0x7e, 0xf7, 0x61, 0x8e, 0x4b, - 0x7d, 0x32, 0x34, 0x8d, 0x80, 0xd0, 0xad, 0xa6, 0xd7, 0x6a, 0x1b, 0xd7, 0xd6, 0xa3, 0xf8, 0x75, - 0x94, 0x75, 0x3d, 0x4e, 0x8d, 0xff, 0xa2, 0xc1, 0xac, 0xba, 0x8e, 0x3e, 0x84, 0x92, 0x4d, 0xc6, - 0xc4, 0x66, 0xbb, 0xd4, 0x37, 0x6e, 0xe4, 0xc8, 0x59, 0x7f, 0x44, 0x89, 0x74, 0x4e, 0x8b, 0xf6, - 0xa0, 0x3e, 0x88, 0xa5, 0x02, 0x33, 0xb8, 0xb6, 0x71, 0x53, 0xe1, 0xce, 0xca, 0x98, 0x87, 0x53, - 0x7a, 0x82, 0x11, 0x7f, 0x04, 0x25, 0x26, 0x1a, 0x55, 0xa1, 0xb4, 0xd3, 0xde, 0x7a, 0xb2, 0xdb, - 0x98, 0x42, 0x15, 0x28, 0xee, 0xed, 0x3f, 0x38, 0x68, 0x68, 0xa8, 0x06, 0xe5, 0x67, 0x9b, 0xfa, - 0xfe, 0xde, 0xfe, 0x6e, 0xa3, 0x40, 0x29, 0xda, 0xba, 0x7e, 0xa0, 0x37, 0xa6, 0xb7, 0xca, 0x50, - 0x62, 0xf2, 0xf1, 0x37, 0x9a, 0xf8, 0x85, 0xae, 0x43, 0x35, 0xb0, 0x06, 0xc4, 0x0f, 0x8c, 0xc1, - 0x50, 0xb8, 0x2c, 0x42, 0xa0, 0x47, 0xd0, 0x20, 0x89, 0x34, 0x15, 0x3a, 0xaf, 0xc4, 0x74, 0x4e, - 0x25, 0xf3, 0xc3, 0x29, 0x3d, 0xc5, 0x89, 0x3e, 0x86, 0x6a, 0x20, 0xf3, 0x8b, 0x05, 0x35, 0x1e, - 0x00, 0x35, 0xfd, 0x1e, 0x4e, 0xe9, 0x11, 0x2d, 0x65, 0xf4, 0x64, 0x0a, 0xb1, 0xac, 0x4d, 0x31, - 0x86, 0x19, 0x46, 0x19, 0x43, 0xda, 0xad, 0x2a, 0x94, 0x0f, 0x8d, 0x73, 0xdb, 0x35, 0x4c, 0x8c, - 0xa1, 0xd1, 0x19, 0x1d, 0xf9, 0x3d, 0xcf, 0x3a, 0x22, 0x22, 0x75, 0x50, 0x1d, 0x0a, 0x61, 0x7e, - 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0xb5, 0x5d, 0x12, 0x3c, 0xf0, 0x8c, 0x01, 0x39, 0x73, 0xbd, 0xd3, - 0x3d, 0xa7, 0xef, 0xca, 0x2c, 0xfb, 0xad, 0x06, 0xe5, 0xa7, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x29, - 0x36, 0x30, 0xbe, 0x70, 0x3d, 0xc6, 0x59, 0xd2, 0x39, 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x41, - 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x84, 0xd9, 0x5b, 0xd2, 0x39, 0x40, 0xb1, 0x47, - 0x23, 0xcb, 0x36, 0xe5, 0x11, 0x64, 0x00, 0x5a, 0x85, 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, - 0xa7, 0x67, 0xa4, 0xc4, 0xd6, 0x54, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0xd7, 0x9c, - 0x61, 0x04, 0x0a, 0x06, 0xff, 0xa2, 0x00, 0x57, 0xd3, 0x16, 0xd0, 0x63, 0xb1, 0x0a, 0xb5, 0x7e, - 0x88, 0x95, 0x36, 0xab, 0x28, 0xf4, 0x2e, 0x2c, 0x28, 0x11, 0xf3, 0xb7, 0xdd, 0x91, 0x08, 0x76, - 0x49, 0x4f, 0x2f, 0x50, 0x4d, 0x68, 0x7c, 0x04, 0x19, 0x37, 0x4e, 0xc1, 0x44, 0xc7, 0xb0, 0xa8, - 0x1e, 0xc3, 0x15, 0x80, 0x13, 0xd7, 0x97, 0xc2, 0x4b, 0x9c, 0x2b, 0xc2, 0x20, 0x0c, 0xb3, 0x96, - 0xe3, 0x07, 0x86, 0xd3, 0x23, 0xcc, 0x05, 0xdc, 0xc2, 0x18, 0x0e, 0xbd, 0x0b, 0x65, 0x61, 0x71, - 0xb3, 0xcc, 0x52, 0x01, 0x29, 0xa9, 0x20, 0x42, 0xa4, 0x4b, 0x12, 0xfc, 0x36, 0xcc, 0x77, 0x89, - 0xe1, 0x99, 0xee, 0x99, 0x23, 0xa3, 0xbe, 0x04, 0x33, 0x1e, 0x31, 0x7c, 0xd7, 0x91, 0x37, 0x1b, - 0x87, 0xe8, 0xcd, 0x12, 0x91, 0x0e, 0xed, 0x73, 0xdc, 0x84, 0xa5, 0x5d, 0x12, 0x28, 0xa9, 0x1d, - 0xde, 0x39, 0x2f, 0xe1, 0x4a, 0x6a, 0xe5, 0x72, 0x5e, 0xfe, 0x0c, 0x66, 0x55, 0x67, 0x8a, 0x7b, - 0xa8, 0xa5, 0x66, 0xb3, 0x72, 0xdd, 0xd3, 0xf0, 0xc5, 0xe8, 0xf1, 0x9f, 0x8a, 0x30, 0x9f, 0xa0, - 0x48, 0xa6, 0x31, 0xd5, 0xa2, 0xe7, 0x11, 0x23, 0x20, 0xe6, 0xb3, 0x13, 0xe2, 0x88, 0x5b, 0x55, - 0x45, 0x65, 0x5f, 0xad, 0x68, 0x1d, 0x4a, 0x2c, 0x82, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, - 0x27, 0xae, 0x17, 0xd0, 0xd3, 0xc9, 0x54, 0xe2, 0x64, 0xa8, 0x05, 0x15, 0xcf, 0x75, 0x03, 0x7a, - 0xf6, 0x44, 0xb2, 0x86, 0x70, 0x66, 0x41, 0x9a, 0xc9, 0x29, 0x48, 0x3b, 0x50, 0x31, 0x49, 0xdf, - 0x18, 0xd9, 0x81, 0xdf, 0x2c, 0xb3, 0xad, 0xd7, 0xf2, 0xfd, 0xb1, 0xbe, 0x23, 0x48, 0xdb, 0x4e, - 0xe0, 0x9d, 0xeb, 0x21, 0x27, 0xba, 0x0b, 0xc5, 0xb1, 0xe1, 0xf9, 0xcd, 0x0a, 0x93, 0x70, 0x6b, - 0x82, 0x84, 0xa7, 0x86, 0x27, 0xb8, 0x19, 0x07, 0xdd, 0x7f, 0xe4, 0x13, 0x8f, 0xa2, 0x9b, 0xd5, - 0x0b, 0xf7, 0x7f, 0x22, 0x48, 0xc5, 0xfe, 0x92, 0xb3, 0xf5, 0x09, 0xcc, 0xc5, 0x54, 0x43, 0x0d, - 0x98, 0x3e, 0x25, 0xe7, 0x22, 0x2e, 0xf4, 0x27, 0x75, 0xfb, 0xd8, 0xb0, 0x47, 0x61, 0xed, 0x64, - 0xc0, 0xbd, 0xc2, 0x5d, 0xad, 0xf5, 0x31, 0x54, 0x43, 0x99, 0xaf, 0xc4, 0xf8, 0x09, 0xcc, 0xc5, - 0x14, 0x7a, 0x15, 0x66, 0xfc, 0x07, 0x0d, 0xae, 0xee, 0x93, 0x33, 0xc5, 0x42, 0x79, 0x46, 0xee, - 0x40, 0x83, 0x26, 0x6c, 0xdf, 0x76, 0xcf, 0xba, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, - 0xcf, 0x84, 0xe3, 0x79, 0x2a, 0xdf, 0x51, 0x5c, 0x97, 0x29, 0x3b, 0xe9, 0xfe, 0x6f, 0x6d, 0x3b, - 0xee, 0xc0, 0x62, 0x72, 0x07, 0x7a, 0x08, 0x3f, 0x85, 0x9a, 0x72, 0x64, 0x98, 0xa8, 0xc9, 0x27, - 0x4c, 0x25, 0xc7, 0x7f, 0xd7, 0x60, 0x79, 0x9f, 0x9c, 0x6d, 0x8e, 0x02, 0xf7, 0x35, 0xfd, 0xb2, - 0x15, 0xf3, 0xcb, 0x7a, 0xdc, 0x2f, 0xd9, 0xf2, 0x53, 0xa9, 0xc9, 0x8f, 0xf6, 0xb4, 0x3c, 0xda, - 0xdf, 0xde, 0x57, 0xcb, 0x70, 0x2d, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc5, 0x6a, 0x46, 0x86, 0xb1, - 0xc9, 0xf2, 0xf8, 0x53, 0x0d, 0x16, 0x93, 0x94, 0xaf, 0xed, 0x70, 0xf4, 0x1e, 0x54, 0xa4, 0xeb, - 0xc4, 0xdb, 0x62, 0x51, 0x61, 0xa5, 0x97, 0x09, 0xe3, 0x09, 0x89, 0xf0, 0x5f, 0x35, 0x58, 0xde, - 0xe6, 0xcb, 0x17, 0x2b, 0x8d, 0x3e, 0x87, 0x62, 0x70, 0x3e, 0xe4, 0x1e, 0xa9, 0x6f, 0xbc, 0xa3, - 0x88, 0xce, 0x95, 0xb1, 0x7e, 0x30, 0xa4, 0x2c, 0x3a, 0x63, 0xc4, 0x06, 0xcc, 0x70, 0x98, 0x3e, - 0xb0, 0xf6, 0x0f, 0x0e, 0x0e, 0x1b, 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0x2f, 0x36, - 0xb7, 0xbb, 0x7b, 0x4f, 0xf7, 0xba, 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0xc3, - 0x08, 0x55, 0x40, 0x73, 0x50, 0xdd, 0x3e, 0xd8, 0x7f, 0xb0, 0xb7, 0xfb, 0x44, 0x6f, 0x37, 0xa6, - 0xe9, 0x4b, 0x4c, 0x6f, 0x77, 0xda, 0xdd, 0x46, 0x11, 0xcd, 0x42, 0x65, 0xf7, 0xe0, 0x05, 0x7f, - 0x97, 0x95, 0xf0, 0x29, 0x5c, 0xcb, 0x52, 0x86, 0xfa, 0x36, 0x69, 0xce, 0x6b, 0x3f, 0xff, 0x69, - 0xfb, 0xd1, 0x7c, 0xec, 0x9a, 0x56, 0xff, 0xfc, 0x52, 0xde, 0x03, 0x77, 0x48, 0x3c, 0x23, 0xb0, - 0x5c, 0x47, 0x66, 0xf2, 0xcd, 0xec, 0xc8, 0x1e, 0x48, 0x3a, 0x5d, 0x61, 0x41, 0xb7, 0xa1, 0xee, - 0x91, 0x9e, 0xeb, 0xf4, 0xad, 0xe3, 0x91, 0x47, 0x36, 0x6d, 0x9b, 0xe9, 0x55, 0xd1, 0x13, 0x58, - 0xfc, 0x1b, 0x0d, 0xae, 0x64, 0x09, 0x43, 0xf7, 0x44, 0xfc, 0xf8, 0x43, 0xfb, 0xf6, 0x05, 0x7b, - 0xc7, 0x42, 0xc7, 0x0b, 0x94, 0xcd, 0x9f, 0x12, 0x05, 0x59, 0xa0, 0x38, 0x8c, 0x3f, 0xc8, 0x08, - 0xeb, 0x3c, 0xd4, 0xf4, 0xf6, 0xe3, 0x83, 0xa7, 0xed, 0x17, 0xfa, 0xc1, 0x23, 0x1a, 0xb1, 0x59, - 0xa8, 0x6c, 0xee, 0xec, 0x70, 0xa8, 0x88, 0x7f, 0xa6, 0xc1, 0x52, 0x86, 0xe7, 0x68, 0x98, 0xbe, - 0x07, 0x8d, 0xbe, 0x61, 0xd9, 0xc4, 0x3c, 0x88, 0xbc, 0xa5, 0x5d, 0xce, 0x5b, 0x29, 0x46, 0x11, - 0x84, 0x42, 0x3a, 0xe6, 0xb1, 0x46, 0xe8, 0x2b, 0x0d, 0x96, 0x77, 0x88, 0x1f, 0x78, 0xee, 0x65, - 0x02, 0x79, 0x1d, 0xaa, 0xa7, 0x84, 0x0c, 0xbb, 0xac, 0xbe, 0x17, 0x58, 0x08, 0x22, 0x04, 0x7a, - 0x1f, 0x16, 0x0d, 0xdb, 0x76, 0xcf, 0xf6, 0x1c, 0x7d, 0xe4, 0x38, 0x96, 0x73, 0xdc, 0x09, 0xf7, - 0xab, 0xe8, 0x59, 0x4b, 0x54, 0xa7, 0xbe, 0xeb, 0xf5, 0xf8, 0xfb, 0xae, 0xa2, 0x73, 0x00, 0x13, - 0xb8, 0x96, 0xa5, 0x12, 0xf5, 0xd0, 0xff, 0xc3, 0x42, 0xcf, 0x26, 0x86, 0x33, 0xe2, 0x5b, 0x32, - 0xa4, 0xb8, 0x2a, 0xae, 0xab, 0x87, 0x32, 0x49, 0xa3, 0xa7, 0xd9, 0xf0, 0x9f, 0x35, 0xb8, 0xd9, - 0x89, 0x5d, 0x44, 0x87, 0x1e, 0xcd, 0xb9, 0xc0, 0x22, 0x7e, 0x9e, 0x03, 0x9e, 0x03, 0x0c, 0x43, - 0x22, 0x91, 0xc9, 0xf7, 0xd4, 0x17, 0xce, 0x64, 0x79, 0xeb, 0x11, 0x86, 0xdf, 0xcf, 0x8a, 0xb4, - 0xd6, 0x7d, 0x98, 0x4f, 0x2c, 0xbf, 0xd2, 0xdd, 0x7c, 0x13, 0x6e, 0xe4, 0xef, 0x4e, 0xed, 0xf5, - 0xe1, 0xe6, 0xee, 0x2b, 0x9a, 0xdb, 0x84, 0xf2, 0x97, 0x23, 0xe2, 0x49, 0x5b, 0xab, 0xba, 0x04, - 0xe9, 0x89, 0x24, 0x2f, 0x7b, 0xf6, 0xc8, 0x24, 0xbb, 0xb6, 0x7b, 0x64, 0xd8, 0xbe, 0x3c, 0x91, - 0x71, 0x2c, 0xfe, 0xbd, 0x06, 0x37, 0x76, 0x27, 0xa9, 0x85, 0x7e, 0x10, 0x73, 0x29, 0x4f, 0xf7, - 0xbb, 0x8a, 0x4b, 0x27, 0x72, 0x7f, 0x97, 0x0e, 0xfd, 0x75, 0x01, 0xe6, 0x62, 0x2f, 0xd6, 0xbc, - 0xb9, 0x83, 0xed, 0xf6, 0x4e, 0x89, 0x29, 0xce, 0x83, 0x80, 0xe4, 0xe4, 0x63, 0x4f, 0xd6, 0x5d, - 0x01, 0x29, 0x73, 0x8a, 0x62, 0xf6, 0x9c, 0xa2, 0xa4, 0x5e, 0xc9, 0xd7, 0xa1, 0xda, 0xb3, 0x0d, - 0xdf, 0x57, 0xfa, 0x98, 0x08, 0x81, 0xda, 0x50, 0x37, 0xc9, 0xd0, 0x76, 0xcf, 0x65, 0x4d, 0x14, - 0xbd, 0x8c, 0x3a, 0x48, 0xa0, 0xca, 0xef, 0xc4, 0x88, 0xf4, 0x04, 0x13, 0x75, 0xca, 0xd0, 0x32, - 0x9b, 0x15, 0xee, 0x94, 0xa1, 0x65, 0xa2, 0x5b, 0x30, 0xe7, 0x1b, 0x8e, 0x79, 0xe4, 0xbe, 0xec, - 0x04, 0xa6, 0x3b, 0x0a, 0x9a, 0x55, 0x3e, 0x44, 0x8a, 0x21, 0x69, 0x25, 0x47, 0x69, 0xf1, 0xf4, - 0xbe, 0xa4, 0xcd, 0x98, 0xe2, 0xa9, 0x10, 0xa6, 0x09, 0x65, 0x1c, 0xf3, 0xb9, 0x14, 0xf7, 0xb7, - 0x04, 0xe9, 0x8a, 0xdb, 0xef, 0x13, 0x2f, 0x74, 0x98, 0x04, 0x69, 0xbb, 0x47, 0x5e, 0x92, 0xde, - 0x28, 0x70, 0xe9, 0x22, 0xf7, 0x9a, 0x82, 0xc1, 0x0b, 0x30, 0xbf, 0x4b, 0x02, 0x71, 0xb0, 0x79, - 0x67, 0xf5, 0x39, 0xcc, 0x45, 0x28, 0x9a, 0x64, 0x61, 0x53, 0xa2, 0x5d, 0xaa, 0x29, 0xc1, 0x6b, - 0x50, 0x17, 0x02, 0x94, 0x7e, 0x4f, 0xc4, 0x53, 0x53, 0xe3, 0x89, 0x3f, 0x86, 0xd9, 0x90, 0x92, - 0xee, 0xf4, 0x16, 0x14, 0xe9, 0x8a, 0xb8, 0x94, 0x16, 0x13, 0x91, 0x60, 0x7b, 0x30, 0x02, 0xdc, - 0x86, 0x39, 0x8a, 0xd9, 0xa6, 0xd1, 0xcc, 0xcd, 0x2e, 0xda, 0x84, 0x71, 0xf6, 0xc7, 0xae, 0x49, - 0xc2, 0x26, 0x2c, 0x42, 0xe1, 0x9f, 0x40, 0x6d, 0xdb, 0x1d, 0x0c, 0x0c, 0xc7, 0x94, 0xb1, 0x24, - 0xce, 0x98, 0x99, 0x59, 0xd5, 0xe9, 0x4f, 0x96, 0x58, 0x27, 0xc4, 0xb6, 0x45, 0x7e, 0x72, 0x20, - 0x4a, 0xfb, 0x69, 0x25, 0xed, 0x69, 0xba, 0x19, 0xde, 0xf1, 0x88, 0x37, 0x95, 0x45, 0x26, 0x23, - 0x42, 0x50, 0x05, 0x69, 0x9f, 0x22, 0x32, 0x94, 0xfd, 0xc6, 0x8f, 0xa1, 0xb6, 0x7d, 0x62, 0x38, - 0x0e, 0xb1, 0x73, 0x6d, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xf3, 0xa6, 0x77, 0x4c, 0x82, - 0xe8, 0x74, 0x50, 0x08, 0x7f, 0x33, 0x0d, 0x95, 0xf0, 0xb8, 0xfd, 0x0f, 0x54, 0x7d, 0x1a, 0x1c, - 0x96, 0xd9, 0xdc, 0x9f, 0xf9, 0x81, 0x8b, 0x48, 0x29, 0x5f, 0x4f, 0x7a, 0x55, 0x3c, 0x06, 0x9b, - 0x89, 0x38, 0x84, 0x5e, 0xd7, 0x23, 0x52, 0xf4, 0x7f, 0x30, 0x6f, 0x39, 0x47, 0xee, 0xc8, 0x31, - 0x85, 0x49, 0xf4, 0x52, 0xa3, 0xe9, 0xb2, 0xa4, 0x96, 0x96, 0xc8, 0x5a, 0x3d, 0x49, 0x8e, 0xb6, - 0xa0, 0xe1, 0x8e, 0x82, 0xb8, 0x88, 0xe2, 0x44, 0x11, 0x29, 0x7a, 0x74, 0x97, 0x86, 0x3c, 0x0c, - 0x28, 0x73, 0x76, 0x82, 0x3d, 0x5a, 0xd5, 0x55, 0x52, 0x7a, 0xf0, 0x68, 0x66, 0x1d, 0x1a, 0xc1, - 0x89, 0xb8, 0x2b, 0x42, 0x98, 0x8d, 0x6b, 0x9d, 0xf1, 0x9e, 0xc9, 0x6e, 0x88, 0xaa, 0xce, 0x01, - 0xb4, 0x1d, 0xbb, 0x7b, 0x79, 0xd7, 0xfa, 0x5f, 0x19, 0x29, 0xfb, 0x5d, 0x5e, 0xb3, 0xef, 0xc1, - 0x62, 0xbc, 0x5c, 0xf3, 0xf3, 0xd6, 0x84, 0x32, 0x3f, 0x61, 0xbe, 0x48, 0x66, 0x09, 0xe2, 0x9f, - 0x6b, 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x1e, 0xd4, 0x4e, 0x2d, 0xdb, 0x26, 0x66, 0xf7, 0x52, 0xe7, - 0x5c, 0x25, 0x46, 0x9f, 0xc2, 0xac, 0xc7, 0x9f, 0x25, 0xf2, 0x65, 0x33, 0x99, 0x39, 0x46, 0x8d, - 0xb7, 0xd9, 0xfd, 0x43, 0x5b, 0x8c, 0x50, 0xf9, 0xd0, 0xdb, 0x9a, 0xea, 0xed, 0x16, 0x54, 0x86, - 0x46, 0x70, 0xd2, 0x19, 0x92, 0x9e, 0x7c, 0x48, 0x4a, 0x18, 0x7f, 0x55, 0x84, 0x8a, 0xec, 0x52, - 0x5e, 0x7f, 0xbe, 0x4d, 0xb7, 0xea, 0x8f, 0x6c, 0x9b, 0xa5, 0x02, 0xbf, 0x31, 0x43, 0x58, 0xf5, - 0x6c, 0x29, 0xe6, 0x59, 0xf4, 0x36, 0x94, 0xe8, 0xcb, 0xd6, 0x6f, 0xce, 0x30, 0x07, 0x64, 0x76, - 0x50, 0x9c, 0x02, 0xdd, 0x4f, 0x4d, 0x5b, 0xde, 0xcc, 0xa0, 0xce, 0x1d, 0xb3, 0x7c, 0x10, 0x1b, - 0xb3, 0xdc, 0xc8, 0x62, 0x4d, 0x36, 0xb1, 0xf7, 0x53, 0xf3, 0x95, 0xcc, 0x1d, 0xff, 0x83, 0x06, - 0x2b, 0xf7, 0x58, 0x15, 0x13, 0x89, 0x45, 0x73, 0x3c, 0x8c, 0x8f, 0x76, 0x51, 0x7c, 0xf0, 0xef, - 0x34, 0x78, 0x63, 0x97, 0x04, 0xcf, 0x12, 0xe3, 0x84, 0x30, 0x43, 0x57, 0xa1, 0xe6, 0x91, 0xa1, - 0x7b, 0x68, 0x04, 0x01, 0xf1, 0xe4, 0x0c, 0x53, 0x45, 0xa1, 0x35, 0x98, 0xf7, 0xc8, 0xd8, 0xf2, - 0x2d, 0xd7, 0x91, 0x54, 0x5c, 0xc3, 0x24, 0x9a, 0xca, 0x32, 0x6c, 0x7b, 0xcb, 0x33, 0x9c, 0xde, - 0x09, 0x91, 0x0f, 0x41, 0x15, 0xc5, 0xca, 0xbe, 0x6d, 0x77, 0x8d, 0x63, 0x5f, 0xbc, 0xf4, 0x25, - 0x88, 0x8f, 0xe0, 0x4a, 0x52, 0x47, 0x79, 0x04, 0xa8, 0x32, 0xf2, 0x08, 0xd0, 0xdf, 0xec, 0x7e, - 0x93, 0xe3, 0x12, 0x71, 0x7e, 0x24, 0xcc, 0x9a, 0x34, 0xa1, 0x96, 0x38, 0x09, 0x21, 0x8c, 0xbf, - 0x80, 0xe5, 0x6c, 0x57, 0x50, 0x9f, 0x3e, 0x86, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, - 0x52, 0x4f, 0x73, 0x62, 0x04, 0x8d, 0x47, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, - 0x70, 0xee, 0xd1, 0x6e, 0x42, 0x59, 0x1c, 0x0c, 0x51, 0xa3, 0x25, 0x48, 0x63, 0x20, 0x7e, 0xea, - 0x71, 0xe3, 0x92, 0x68, 0xfc, 0x25, 0xd4, 0x95, 0x7d, 0x65, 0xb2, 0x50, 0x28, 0x2b, 0x59, 0x84, - 0x36, 0x3a, 0xa7, 0x40, 0x1f, 0xc1, 0xd5, 0x63, 0xf6, 0x5e, 0xdf, 0x49, 0x6c, 0xc6, 0xbd, 0x9c, - 0xbd, 0x88, 0xf7, 0xa1, 0xbe, 0x69, 0x9a, 0x54, 0x96, 0x4c, 0xaa, 0x2c, 0xe3, 0x32, 0x4c, 0x28, - 0x64, 0x9b, 0xa0, 0xc3, 0x6c, 0x28, 0x8f, 0xbf, 0xd9, 0x90, 0x43, 0xce, 0x92, 0x2a, 0x71, 0xd9, - 0x19, 0x2b, 0x74, 0x77, 0x4b, 0x56, 0xfc, 0xaa, 0xce, 0x7e, 0xe3, 0xb7, 0x61, 0x41, 0x27, 0x03, - 0x77, 0x4c, 0x54, 0x35, 0xaf, 0x40, 0xc9, 0x72, 0x4c, 0xf2, 0x52, 0x7e, 0x79, 0x61, 0x00, 0xfe, - 0x5f, 0x98, 0x57, 0x49, 0xa9, 0x06, 0xb7, 0xa1, 0xae, 0xee, 0x13, 0xa6, 0x63, 0x02, 0x8b, 0xdf, - 0x81, 0x45, 0x9d, 0xf4, 0x3d, 0xe2, 0x9f, 0xa8, 0x71, 0xcf, 0xd9, 0xe7, 0xbf, 0xe1, 0x6a, 0x87, - 0x04, 0x0a, 0xfb, 0x64, 0xf2, 0xfb, 0xac, 0x49, 0xdd, 0xcd, 0x8a, 0x80, 0x64, 0x54, 0x73, 0x5f, - 0x4b, 0xe4, 0xfe, 0xf7, 0x59, 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, - 0x10, 0xf9, 0x01, 0xbc, 0x91, 0x27, 0x92, 0x3a, 0x4d, 0x86, 0x41, 0x53, 0xc2, 0x50, 0x86, 0x52, - 0x7b, 0x30, 0x0c, 0xce, 0x37, 0xfe, 0x51, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, - 0xa3, 0x77, 0xca, 0x3f, 0x75, 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, - 0x1b, 0xda, 0xa9, 0xf7, 0x35, 0xf4, 0x1c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, - 0x2f, 0x71, 0xad, 0xd5, 0x89, 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, - 0x64, 0xe2, 0x53, 0x50, 0xab, 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x63, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, - 0x7a, 0x33, 0xb7, 0xb9, 0x0d, 0x2d, 0xbe, 0x39, 0x89, 0x84, 0x0b, 0xfe, 0x31, 0xa0, 0xf4, 0x28, - 0x16, 0xdd, 0xba, 0xcc, 0x7c, 0xb8, 0x85, 0x2f, 0xa0, 0xe2, 0x3b, 0x74, 0xa1, 0x1e, 0x1f, 0x8c, - 0xa3, 0xd5, 0x8b, 0xa6, 0xf2, 0xad, 0x95, 0x09, 0x14, 0xa1, 0xd4, 0xb8, 0x45, 0x68, 0x35, 0xd7, - 0xd8, 0x2c, 0xa9, 0x19, 0xa3, 0x63, 0xee, 0x8d, 0xf4, 0xec, 0x33, 0xe6, 0x8d, 0xdc, 0x39, 0x6d, - 0xcc, 0x1b, 0x39, 0x03, 0x54, 0x3c, 0x85, 0x7e, 0x04, 0x0b, 0xa9, 0xa9, 0x1d, 0x52, 0xdf, 0xca, - 0x79, 0xd3, 0xd0, 0xd6, 0x9b, 0x93, 0x89, 0x42, 0x03, 0xd2, 0x33, 0xaf, 0x98, 0x01, 0xb9, 0x53, - 0xba, 0x98, 0x01, 0x39, 0x83, 0x33, 0x9e, 0xcd, 0xb2, 0x27, 0x8e, 0x65, 0x73, 0xa2, 0x77, 0x8e, - 0x65, 0x73, 0xac, 0x89, 0xc6, 0x53, 0xe8, 0x73, 0x28, 0x0b, 0x14, 0x5a, 0x4e, 0x93, 0x49, 0x09, - 0xd7, 0xb2, 0x96, 0xb8, 0x80, 0x7d, 0x98, 0x55, 0x9f, 0xee, 0x68, 0x25, 0x77, 0x68, 0xc7, 0x45, - 0x4d, 0x1c, 0xea, 0x85, 0x46, 0xb1, 0x27, 0x52, 0xd2, 0x28, 0xf5, 0x41, 0x9e, 0x34, 0x2a, 0x7a, - 0x53, 0xe1, 0x29, 0xd4, 0x67, 0x9f, 0x61, 0x53, 0xcf, 0x03, 0x74, 0x3b, 0xce, 0x93, 0xf7, 0x94, - 0x6a, 0xdd, 0xba, 0x90, 0x8e, 0xef, 0xd3, 0x86, 0x6a, 0x58, 0xa2, 0xd1, 0x1b, 0x0a, 0x53, 0xf2, - 0xc1, 0xd0, 0x5a, 0xce, 0x5e, 0x0c, 0x63, 0x20, 0xca, 0x64, 0x2c, 0x06, 0xf1, 0x52, 0x1c, 0x8b, - 0x81, 0x5a, 0x55, 0xf1, 0x14, 0x7a, 0x08, 0x10, 0x15, 0x3a, 0x74, 0x3d, 0xf6, 0x2e, 0x48, 0x94, - 0xca, 0x56, 0x2b, 0x67, 0x55, 0x7a, 0x7f, 0x56, 0xad, 0x7b, 0xb1, 0x68, 0x66, 0x14, 0xc4, 0x56, - 0x43, 0x9d, 0x62, 0xd3, 0x7a, 0x80, 0xa7, 0xd0, 0x03, 0xa8, 0xc7, 0xcb, 0x61, 0xec, 0x3e, 0xc8, - 0xac, 0x94, 0x99, 0x72, 0x9e, 0x43, 0x33, 0xaf, 0x4e, 0xa2, 0x3b, 0x71, 0x89, 0x93, 0x8a, 0x69, - 0xa6, 0x6c, 0x1b, 0x96, 0xb2, 0x2b, 0x1e, 0x5a, 0x8b, 0x4b, 0xce, 0xaf, 0xb3, 0xad, 0xdb, 0x97, - 0xa0, 0xe4, 0x5e, 0xfd, 0x14, 0xaa, 0xe1, 0x7f, 0x4c, 0x62, 0x79, 0x92, 0xfc, 0xe7, 0x49, 0x5c, - 0xd7, 0x31, 0x71, 0x82, 0xf7, 0xb5, 0xad, 0xbb, 0x7f, 0xfc, 0x7a, 0x45, 0xfb, 0xdb, 0xd7, 0x2b, - 0xda, 0x3f, 0xbf, 0x5e, 0xd1, 0x7e, 0xf5, 0xaf, 0x95, 0x29, 0xc0, 0xbd, 0x93, 0xf5, 0x1e, 0xf1, - 0x9c, 0x75, 0xc3, 0xb6, 0x7a, 0x64, 0xdd, 0xdd, 0x58, 0x97, 0x3c, 0xde, 0xb0, 0xe7, 0x13, 0x6f, - 0x4c, 0xbc, 0xe7, 0x85, 0xe1, 0xd1, 0xd1, 0x0c, 0xfb, 0xef, 0xd9, 0x87, 0xff, 0x0e, 0x00, 0x00, - 0xff, 0xff, 0x71, 0x3c, 0xfb, 0x08, 0x95, 0x26, 0x00, 0x00, + // 2906 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, + 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, + 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, + 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, + 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, + 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, + 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, + 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, + 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, + 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, + 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, + 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, + 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, + 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, + 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, + 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, + 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, + 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, + 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, + 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, + 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, + 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, + 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, + 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, + 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, + 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, + 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, + 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, + 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, + 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, + 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, + 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, + 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, + 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, + 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, + 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, + 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, + 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, + 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, + 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, + 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, + 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, + 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, + 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, + 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, + 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, + 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, + 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, + 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, + 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, + 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, + 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, + 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, + 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, + 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, + 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, + 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, + 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, + 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, + 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, + 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, + 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, + 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, + 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, + 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, + 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, + 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, + 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, + 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, + 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, + 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, + 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, + 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, + 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, + 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, + 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, + 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, + 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, + 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, + 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, + 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, + 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, + 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, + 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, + 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, + 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, + 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, + 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, + 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, + 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, + 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, + 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, + 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, + 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, + 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, + 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, + 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, + 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, + 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, + 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, + 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, + 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, + 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, + 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, + 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, + 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, + 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, + 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, + 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, + 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, + 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, + 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, + 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, + 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, + 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, + 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, + 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, + 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, + 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, + 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, + 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, + 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, + 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, + 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, + 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, + 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, + 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, + 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, + 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, + 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, + 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, + 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, + 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, + 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, + 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, + 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, + 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, + 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, + 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, + 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, + 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, + 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, + 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, + 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, + 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, + 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, + 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, + 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, + 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, + 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, + 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, + 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, + 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, + 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, + 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, + 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, + 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, + 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, + 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, + 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, + 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, + 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, + 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, + 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, + 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, + 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, + 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, + 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, + 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, + 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, + 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, + 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, + 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, + 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, + 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, + 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, + 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, + 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, + 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, + 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, + 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5255,25 +5288,46 @@ func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ClassName) > 0 { + i -= len(m.ClassName) + copy(dAtA[i:], m.ClassName) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) + i-- + dAtA[i] = 0x32 + } + if len(m.Hostname) > 0 { + i -= len(m.Hostname) + copy(dAtA[i:], m.Hostname) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) + i-- + dAtA[i] = 0x2a + } if len(m.Status) > 0 { i -= len(m.Status) copy(dAtA[i:], m.Status) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) i-- - dAtA[i] = 0x1a + dAtA[i] = 0x22 } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) i-- - dAtA[i] = 0x12 + dAtA[i] = 0x1a } if len(m.Taskid) > 0 { i -= len(m.Taskid) copy(dAtA[i:], m.Taskid) i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) i-- + dAtA[i] = 0x12 + } + if len(m.Name) > 0 { + i -= len(m.Name) + copy(dAtA[i:], m.Name) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) + i-- dAtA[i] = 0xa } return len(dAtA) - i, nil @@ -5303,6 +5357,13 @@ func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.RolePath) > 0 { + i -= len(m.RolePath) + copy(dAtA[i:], m.RolePath) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) + i-- + dAtA[i] = 0x22 + } if len(m.State) > 0 { i -= len(m.State) copy(dAtA[i:], m.State) @@ -8381,6 +8442,10 @@ func (m *Ev_TaskEvent) Size() (n int) { } var l int _ = l + l = len(m.Name) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } l = len(m.Taskid) if l > 0 { n += 1 + l + sovO2Control(uint64(l)) @@ -8393,6 +8458,14 @@ func (m *Ev_TaskEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Hostname) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } + l = len(m.ClassName) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -8417,6 +8490,10 @@ func (m *Ev_RoleEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.RolePath) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10073,6 +10150,38 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + 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 Taskid", wireType) } @@ -10104,7 +10213,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Taskid = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) } @@ -10136,7 +10245,7 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } @@ -10168,6 +10277,70 @@ func (m *Ev_TaskEvent) Unmarshal(dAtA []byte) error { } m.Status = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Hostname = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ClassName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) @@ -10318,6 +10491,38 @@ func (m *Ev_RoleEvent) Unmarshal(dAtA []byte) error { } m.State = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RolePath = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9c538be96..29ee73eb6 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -41,15 +41,19 @@ message Ev_EnvironmentEvent { } message Ev_TaskEvent { - string taskid = 1; - string state = 2; - string status = 3; + string name = 1; + string taskid = 2; + string state = 3; + string status = 4; + string hostname = 5; + string className = 6; } message Ev_RoleEvent { string name = 1; string status = 2; string state = 3; + string rolePath = 4; } ////////////////////////////////////////////////////// diff --git a/core/task/manager.go b/core/task/manager.go index fb4bbc287..6744cd4d1 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,7 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, State: state}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.className}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -656,7 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{TaskID: taskId, Status: taskPtr.status.String()}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.className}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index c8aa64cb8..858bf0c6d 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,7 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{TaskID: newTaskId, State:"LAUNCHED"}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.className}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 3500fc878..6ce5c14cc 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -190,7 +190,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") - r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String()}) + r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) } @@ -202,7 +202,7 @@ func (r *aggregatorRole) updateState(s task.State) { } log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") r.state.merge(s, r) - r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String()}) + r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 94c75595b..10cb28fc8 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -181,7 +181,7 @@ func (t *taskRole) updateStatus(s task.Status) { log.WithField("status", s.String()).Error("cannot update status with nil parent") } t.status.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String()}) + t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) t.parent.updateStatus(s) } @@ -191,7 +191,7 @@ func (t *taskRole) updateState(s task.State) { } log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") t.state.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String()}) + t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) } From 1bd179cc2a46b36f8b9f775e7a5a03d7e322e0a5 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:10:46 +0100 Subject: [PATCH 0666/2352] [common] Add message field to Environment Events --- common/event/environmentevents.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/common/event/environmentevents.go b/common/event/environmentevents.go index 9e2f5b1cf..eee78b554 100644 --- a/common/event/environmentevents.go +++ b/common/event/environmentevents.go @@ -30,23 +30,28 @@ type EnvironmentEvent struct { Run uint32 State string Error error + Message string } -func (r *EnvironmentEvent) GetName() string { - return r.EnvironmentID +func (e *EnvironmentEvent) GetName() string { + return e.EnvironmentID } -func (r *EnvironmentEvent) GetRun() uint32 { - return r.Run +func (e *EnvironmentEvent) GetRun() uint32 { + return e.Run } -func (r *EnvironmentEvent) GetState() string { - return r.State +func (e *EnvironmentEvent) GetState() string { + return e.State } -func (r *EnvironmentEvent) GetError() string { - if r.Error == nil { +func (e *EnvironmentEvent) GetError() string { + if e.Error == nil { return "" } - return r.Error.Error() + return e.Error.Error() +} + +func(e *EnvironmentEvent) GetMessage() string { + return e.Message } \ No newline at end of file From 106550589fd22003ec013127a69e408d083c7223 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:13:10 +0100 Subject: [PATCH 0667/2352] [coconut] Print events and respect verbosity --- coconut/control/control.go | 39 ++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 0fcc23f4e..00ee708d5 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -36,6 +36,7 @@ import ( "sort" "strconv" "strings" + "text/template" "time" "github.com/xlab/treeprint" @@ -87,7 +88,9 @@ func WrapCall(call ControlCall) RunFunc { // redirect stdout to null, the only way to output is stdout := os.Stdout - os.Stdout,_ = os.Open(os.DevNull) + if !auto { + os.Stdout,_ = os.Open(os.DevNull) + } err := call(cxt, rpc, cmd, args, &out) os.Stdout = stdout @@ -228,14 +231,38 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } if evt := rcv.GetEnvironmentEvent(); evt != nil{ if evt.Error != "" { - log.WithPrefix("Event"). - WithError(fmt.Errorf(evt.Error)). - Error(evt.EnvironmentId) + if viper.GetBool("verbose") { + log.WithPrefix("Event"). + WithError(fmt.Errorf(evt.Error)). + Error(evt.EnvironmentId) + return nil + } + fmt.Printf("\nEnvironment with id %s failed with error: %s\n", evt.EnvironmentId, evt.Error) return nil } + tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}}{{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") + if err != nil { + return err + } + err = tmpl.Execute(os.Stdout, evt) + if err != nil { + return err + } + } + if viper.GetBool("verbose") { + log.WithPrefix("Event"). + Info(rcv) + } + if evt := rcv.GetTaskEvent(); evt != nil { + tmpl, err := template.New("taskEvents").Parse("Task {{.Taskid}} of class {{.ClassName}} changed{{if .State}} state to {{.State}}{{end}}{{if .Status}} status to {{.Status}}{{end}} on machine {{.Hostname}}\n") + if err != nil { + return err + } + err = tmpl.Execute(os.Stdout, evt) + if err != nil { + return err + } } - log.WithPrefix("Event"). - Info(rcv) } return nil } From ce0f9acdae857c02d37cb52610382b4c25ebb3e8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:17:38 +0100 Subject: [PATCH 0668/2352] [core] Log error when client disconnects --- core/server.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 5d4cc26aa..f41cb5902 100644 --- a/core/server.go +++ b/core/server.go @@ -669,7 +669,9 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe } err := srv.Send(event) if err != nil { - return err + log.WithError(err). + WithField("subscribe", req.GetId()). + Error(err.Error()) } } } From 93ff288d68a5507e8cfe3135637ad5386d7bc47a Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 7 Dec 2020 12:18:08 +0100 Subject: [PATCH 0669/2352] [core] Send Environment teardown message --- coconut/protos/o2control.pb.go | 418 ++++++++++++++++++-------------- core/environment/eventStream.go | 5 +- core/environment/manager.go | 1 + core/protos/o2control.pb.go | 418 ++++++++++++++++++-------------- core/protos/o2control.proto | 1 + core/task/manager.go | 4 +- core/task/scheduler.go | 2 +- 7 files changed, 478 insertions(+), 371 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index fc1db7fb1..3194363ff 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -166,6 +166,7 @@ type Ev_EnvironmentEvent struct { State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -232,6 +233,13 @@ func (m *Ev_EnvironmentEvent) GetError() string { return "" } +func (m *Ev_EnvironmentEvent) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + type Ev_TaskEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` @@ -4072,189 +4080,190 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2906 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, - 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, - 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, - 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, - 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, - 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, - 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, - 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, - 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, - 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, - 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, - 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, - 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, - 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, - 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, - 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, - 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, - 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, - 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, - 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, - 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, - 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, - 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, - 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, - 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, - 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, - 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, - 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, - 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, - 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, - 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, - 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, - 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, - 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, - 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, - 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, - 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, - 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, - 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, - 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, - 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, - 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, - 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, - 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, - 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, - 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, - 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, - 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, - 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, - 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, - 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, - 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, - 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, - 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, - 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, - 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, - 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, - 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, - 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, - 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, - 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, - 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, - 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, - 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, - 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, - 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, - 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, - 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, - 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, - 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, - 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, - 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, - 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, - 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, - 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, - 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, - 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, - 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, - 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, - 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, - 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, - 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, - 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, - 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, - 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, - 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, - 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, - 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, - 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, - 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, - 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, - 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, - 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, - 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, - 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, - 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, - 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, - 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, - 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, - 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, - 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, - 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, - 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, - 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, - 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, - 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, - 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, - 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, - 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, - 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, - 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, - 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, - 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, - 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, - 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, - 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, - 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, - 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, - 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, - 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, - 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, - 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, - 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, - 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, - 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, - 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, - 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, - 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, - 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, - 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, - 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, - 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, - 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, - 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, - 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, - 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, - 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, - 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, - 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, - 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, - 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, - 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, - 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, - 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, - 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, - 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, - 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, - 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, - 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, - 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, - 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, - 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, - 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, - 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, - 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, - 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, - 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, - 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, - 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, - 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, - 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, - 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, - 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, - 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, - 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, - 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, - 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, - 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, - 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, - 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, - 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, - 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, - 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, - 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, - 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, - 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, - 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, - 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, - 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, - 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, - 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, + // 2918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, + 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, + 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, + 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, + 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, + 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, + 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, + 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, + 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, + 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, + 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, + 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, + 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, + 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, + 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, + 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, + 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, + 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, + 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, + 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, + 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, + 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, + 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, + 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, + 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, + 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, + 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, + 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, + 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, + 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, + 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, + 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, + 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, + 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, + 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, + 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, + 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, + 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, + 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, + 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, + 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, + 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, + 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, + 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, + 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, + 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, + 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, + 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, + 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, + 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, + 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, + 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, + 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, + 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, + 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, + 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, + 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, + 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, + 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, + 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, + 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, + 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, + 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, + 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, + 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, + 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, + 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, + 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, + 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, + 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, + 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, + 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, + 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, + 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, + 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, + 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, + 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, + 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, + 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, + 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, + 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, + 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, + 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, + 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, + 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, + 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, + 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, + 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, + 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, + 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, + 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, + 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, + 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, + 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, + 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, + 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, + 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, + 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, + 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, + 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, + 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, + 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, + 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, + 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, + 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, + 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, + 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, + 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, + 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, + 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, + 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, + 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, + 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, + 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, + 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, + 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, + 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, + 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, + 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, + 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, + 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, + 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, + 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, + 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, + 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, + 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, + 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, + 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, + 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, + 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, + 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, + 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, + 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, + 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, + 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, + 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, + 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, + 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, + 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, + 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, + 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, + 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, + 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, + 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, + 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, + 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, + 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, + 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, + 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, + 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, + 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, + 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, + 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, + 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, + 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, + 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, + 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, + 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, + 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, + 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, + 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, + 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, + 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, + 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, + 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, + 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, + 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, + 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, + 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, + 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, + 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, + 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, + 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, + 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, + 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, + 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, + 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, + 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, + 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, + 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, + 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, + 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, + 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5235,6 +5244,13 @@ func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x2a + } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -8430,6 +8446,10 @@ func (m *Ev_EnvironmentEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Message) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10095,6 +10115,38 @@ func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index fed9f63a2..ddef68eec 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -54,7 +54,7 @@ func SubscribeToStream(ch chan *pb.Event) Subscription { func (e *eventStream) send(data *pb.Event) { if e.stream != nil { - e.stream <- data + e.stream <- data } } @@ -70,7 +70,7 @@ type eventSub struct { func (s *eventSub) Unsubscribe() { s.once.Do(func() { - s.feed.closeStream() + s.feed.closeStream() close(s.err) }) } @@ -112,6 +112,7 @@ func (s *eventSub) Send(ev event.Event) { State: typedEvent.GetState(), CurrentRunNumber: typedEvent.GetRun(), Error: typedEvent.GetError(), + Message: typedEvent.GetMessage(), }, } data = pb.WrapEvent(&re) diff --git a/core/environment/manager.go b/core/environment/manager.go index d996e9ba0..b59726028 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -234,6 +234,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) return err } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete"}) delete(envs.m, environmentId) env.unsubscribeFromWfState() diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index fc1db7fb1..3194363ff 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -166,6 +166,7 @@ type Ev_EnvironmentEvent struct { State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -232,6 +233,13 @@ func (m *Ev_EnvironmentEvent) GetError() string { return "" } +func (m *Ev_EnvironmentEvent) GetMessage() string { + if m != nil { + return m.Message + } + return "" +} + type Ev_TaskEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` @@ -4072,189 +4080,190 @@ func init() { func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2906 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3a, 0xcd, 0x72, 0x1b, 0xc7, - 0xd1, 0x5c, 0x10, 0x20, 0x80, 0x06, 0x09, 0x82, 0x43, 0x89, 0x02, 0x61, 0x89, 0xa2, 0xe7, 0x53, - 0xc9, 0xb4, 0xec, 0x8f, 0xb6, 0x69, 0x57, 0xac, 0xc8, 0x96, 0x1d, 0xfe, 0x40, 0x14, 0x13, 0x89, - 0x54, 0x16, 0x90, 0x94, 0xa8, 0x2a, 0xa5, 0x2c, 0xb1, 0x03, 0x72, 0xcd, 0xc5, 0x2e, 0xbc, 0xbb, - 0x00, 0xc5, 0x43, 0x6e, 0xb9, 0xa5, 0x52, 0x29, 0x57, 0x2e, 0x39, 0xa5, 0x2a, 0x49, 0xe5, 0x1d, - 0x72, 0xc8, 0x03, 0xa4, 0x52, 0x49, 0x25, 0x87, 0xdc, 0x93, 0x72, 0x5e, 0xc0, 0x8f, 0x90, 0x9a, - 0xbf, 0xdd, 0xd9, 0x3f, 0x90, 0xb2, 0xe2, 0x4b, 0x6e, 0xe8, 0x9e, 0xee, 0x9e, 0x9e, 0xfe, 0x99, - 0x9e, 0xee, 0x05, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0x77, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, - 0x6b, 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, - 0x12, 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x5f, 0x6a, 0xb0, 0xd8, 0x1e, - 0x3f, 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, - 0x70, 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, - 0x80, 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, - 0x9c, 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, - 0xe2, 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0xc0, 0xbf, 0xd5, 0x60, 0xb6, 0x3d, 0x7e, 0xde, - 0x35, 0xfc, 0x13, 0xae, 0x0e, 0x82, 0xa2, 0x63, 0x0c, 0x88, 0xd0, 0x82, 0xfd, 0x46, 0x4b, 0x30, - 0x13, 0x18, 0xfe, 0x89, 0x65, 0x8a, 0xdd, 0x05, 0x14, 0x29, 0x35, 0xad, 0x2a, 0xb5, 0x04, 0x33, - 0xf4, 0xc7, 0xc8, 0x17, 0x3b, 0x09, 0x08, 0xb5, 0xa0, 0x72, 0xec, 0xfa, 0x01, 0x93, 0x5e, 0x62, - 0x2b, 0x21, 0x8c, 0xae, 0x42, 0xb5, 0x67, 0x1b, 0xbe, 0xbf, 0x4f, 0x17, 0x67, 0xd8, 0x62, 0x84, - 0xc0, 0x36, 0xd3, 0x51, 0x77, 0x6d, 0x32, 0x51, 0x47, 0xb1, 0x6b, 0x21, 0xb6, 0x6b, 0xb6, 0x8e, - 0x2d, 0xa8, 0x78, 0xae, 0x4d, 0x1e, 0x19, 0xc1, 0xb1, 0xd0, 0x32, 0x84, 0xf1, 0x3c, 0xcc, 0x75, - 0x18, 0xaf, 0x4e, 0x3e, 0x1f, 0x11, 0x3f, 0xc0, 0x87, 0x50, 0x93, 0x88, 0xa1, 0x7d, 0x16, 0x49, - 0xd4, 0x54, 0x89, 0x77, 0x61, 0x8e, 0xef, 0xf8, 0x78, 0x68, 0x1a, 0x01, 0xa1, 0x6a, 0x4c, 0xaf, - 0xd5, 0x36, 0xae, 0xac, 0x47, 0xa1, 0xd2, 0x51, 0xd6, 0xf5, 0x38, 0x35, 0xfe, 0xab, 0x06, 0xb3, - 0xea, 0x3a, 0x7a, 0x1f, 0x4a, 0x36, 0x19, 0x13, 0x9b, 0xed, 0x52, 0xdf, 0xb8, 0x96, 0x23, 0x67, - 0xfd, 0x01, 0x25, 0xd2, 0x39, 0x2d, 0xda, 0x83, 0xfa, 0x20, 0x16, 0x75, 0xcc, 0x18, 0xb5, 0x8d, - 0xeb, 0x0a, 0x77, 0x56, 0x70, 0xde, 0x9f, 0xd2, 0x13, 0x8c, 0xf8, 0x03, 0x28, 0x31, 0xd1, 0xa8, - 0x0a, 0xa5, 0x9d, 0xf6, 0xd6, 0xe3, 0xdd, 0xc6, 0x14, 0xaa, 0x40, 0x71, 0x6f, 0xff, 0xde, 0x41, - 0x43, 0x43, 0x35, 0x28, 0x3f, 0xdd, 0xd4, 0xf7, 0xf7, 0xf6, 0x77, 0x1b, 0x05, 0x4a, 0xd1, 0xd6, - 0xf5, 0x03, 0xbd, 0x31, 0xbd, 0x55, 0x86, 0x12, 0x93, 0x8f, 0xbf, 0xd2, 0xc4, 0x2f, 0xea, 0xda, - 0xc0, 0x1a, 0x10, 0x3f, 0x30, 0x06, 0x43, 0x61, 0xb2, 0x08, 0x81, 0x1e, 0x40, 0x83, 0x24, 0x32, - 0x42, 0xe8, 0xbc, 0x12, 0xd3, 0x39, 0x95, 0x37, 0xf7, 0xa7, 0xf4, 0x14, 0x27, 0xfa, 0x10, 0xaa, - 0x81, 0x8c, 0x64, 0xe6, 0xf0, 0xb8, 0x03, 0xd4, 0x40, 0xbf, 0x3f, 0xa5, 0x47, 0xb4, 0x94, 0xd1, - 0x93, 0xe1, 0xc5, 0x02, 0x22, 0xc5, 0x18, 0x46, 0x1f, 0x65, 0x0c, 0x69, 0xb7, 0xaa, 0x50, 0x7e, - 0x64, 0x9c, 0xd9, 0xae, 0x61, 0x62, 0x0c, 0x8d, 0xce, 0xe8, 0xd0, 0xef, 0x79, 0xd6, 0x21, 0x11, - 0xa1, 0x83, 0xea, 0x50, 0xb0, 0x64, 0x46, 0x17, 0x2c, 0x13, 0x2f, 0xc3, 0x95, 0x5d, 0x12, 0xdc, - 0xf3, 0x8c, 0x01, 0x39, 0x75, 0xbd, 0x93, 0x3d, 0xa7, 0xef, 0xca, 0x28, 0xfb, 0x9d, 0x06, 0xe5, - 0x27, 0xc4, 0xf3, 0x2d, 0xd7, 0xa1, 0x21, 0x36, 0x30, 0x3e, 0x73, 0x3d, 0xc6, 0x59, 0xd2, 0x39, - 0xc0, 0xb0, 0x96, 0xe3, 0x7a, 0xcc, 0x40, 0x14, 0x4b, 0x01, 0x8a, 0x1d, 0x1a, 0x41, 0xef, 0x98, - 0x9d, 0xb7, 0xa4, 0x73, 0x80, 0x62, 0x0f, 0x47, 0x96, 0x6d, 0xca, 0x6c, 0x67, 0x00, 0x5a, 0x85, - 0xda, 0xd0, 0x73, 0xcd, 0x51, 0x2f, 0xd8, 0x8f, 0xb2, 0x50, 0x45, 0xa1, 0x15, 0x80, 0x31, 0x57, - 0xa2, 0x13, 0x78, 0x22, 0x13, 0x15, 0x0c, 0xfe, 0x45, 0x01, 0x2e, 0xa7, 0x4f, 0x40, 0xd3, 0x62, - 0x15, 0x6a, 0xfd, 0x10, 0x2b, 0xcf, 0xac, 0xa2, 0xd0, 0xdb, 0xb0, 0xa0, 0x78, 0xcc, 0xdf, 0x76, - 0x47, 0xc2, 0xd9, 0x25, 0x3d, 0xbd, 0x40, 0x35, 0xa1, 0xfe, 0x11, 0x64, 0xfc, 0x70, 0x0a, 0x26, - 0x4a, 0xc3, 0xa2, 0x9a, 0x86, 0x2b, 0x00, 0xf4, 0x52, 0x11, 0x5c, 0x25, 0xce, 0x15, 0x61, 0x10, - 0x86, 0x59, 0xcb, 0xf1, 0x03, 0xc3, 0xe9, 0x11, 0xe5, 0xae, 0x89, 0xe1, 0xd0, 0xdb, 0x50, 0x16, - 0x27, 0x6e, 0x96, 0x59, 0x28, 0x20, 0x25, 0x14, 0x84, 0x8b, 0x74, 0x49, 0x82, 0xdf, 0x84, 0xf9, - 0x2e, 0x31, 0x3c, 0xd3, 0x3d, 0x75, 0xa4, 0xd7, 0x97, 0x60, 0xc6, 0x23, 0x86, 0xef, 0x3a, 0xc2, - 0x0a, 0x02, 0xa2, 0x37, 0x4b, 0x44, 0x3a, 0xb4, 0xcf, 0x70, 0x13, 0x96, 0x76, 0x49, 0xa0, 0x84, - 0x76, 0x78, 0xe7, 0xbc, 0x80, 0x4b, 0xa9, 0x95, 0x8b, 0x59, 0xf9, 0x13, 0x98, 0x55, 0x8d, 0x29, - 0xee, 0xa1, 0x96, 0x1a, 0xcd, 0x4a, 0x65, 0xa1, 0xee, 0x8b, 0xd1, 0xe3, 0x3f, 0x17, 0x61, 0x3e, - 0x41, 0x91, 0x0c, 0x63, 0xaa, 0x45, 0xcf, 0x23, 0x46, 0x40, 0xcc, 0xa7, 0xc7, 0xc4, 0x11, 0x37, - 0xae, 0x8a, 0xca, 0xb9, 0x76, 0xd7, 0xa1, 0xc4, 0x3c, 0xd8, 0x2c, 0x32, 0xa5, 0x9a, 0xea, 0xa5, - 0x76, 0xec, 0x7a, 0x01, 0xcd, 0x4e, 0xa6, 0x12, 0x27, 0xe3, 0xd7, 0xb4, 0x1b, 0xd0, 0xdc, 0x93, - 0x25, 0x43, 0xc2, 0x99, 0xb5, 0x6f, 0x26, 0xa7, 0xf6, 0xed, 0x40, 0xc5, 0x24, 0x7d, 0x63, 0x64, - 0x07, 0x7e, 0xb3, 0xcc, 0xb6, 0x5e, 0xcb, 0xb7, 0xc7, 0xfa, 0x8e, 0x20, 0x6d, 0x3b, 0x81, 0x77, - 0xa6, 0x87, 0x9c, 0xe8, 0x36, 0x14, 0xc7, 0x86, 0xe7, 0x37, 0x2b, 0x4c, 0xc2, 0x8d, 0x09, 0x12, - 0x9e, 0x18, 0x9e, 0xe0, 0x66, 0x1c, 0x74, 0xff, 0x91, 0x4f, 0x3c, 0x8a, 0x6e, 0x56, 0xcf, 0xdd, - 0xff, 0xb1, 0x20, 0x15, 0xfb, 0x4b, 0xce, 0xd6, 0x47, 0x30, 0x17, 0x53, 0x0d, 0x35, 0x60, 0xfa, - 0x84, 0x9c, 0x09, 0xbf, 0xd0, 0x9f, 0xd4, 0xec, 0x63, 0xc3, 0x1e, 0x85, 0xcf, 0x04, 0x06, 0xdc, - 0x29, 0xdc, 0xd6, 0x5a, 0x1f, 0x42, 0x35, 0x94, 0xf9, 0x52, 0x8c, 0x1f, 0xc1, 0x5c, 0x4c, 0xa1, - 0x97, 0x61, 0xc6, 0x7f, 0xd4, 0xe0, 0xf2, 0x3e, 0x39, 0x55, 0x4e, 0x28, 0x73, 0xe4, 0x16, 0x34, - 0x68, 0xc0, 0xf6, 0x6d, 0xf7, 0xb4, 0x4b, 0x06, 0x43, 0x3b, 0x2a, 0xa8, 0x29, 0x3c, 0xfa, 0x44, - 0x18, 0x9e, 0x87, 0xf2, 0x2d, 0xc5, 0x74, 0x99, 0xb2, 0x93, 0xe6, 0xff, 0xda, 0x67, 0xc7, 0x1d, - 0x58, 0x4c, 0xee, 0x40, 0x93, 0xf0, 0x63, 0xa8, 0x29, 0x29, 0xc3, 0x44, 0x4d, 0xce, 0x30, 0x95, - 0x1c, 0xff, 0x43, 0x83, 0xe5, 0x7d, 0x72, 0xba, 0x39, 0x0a, 0xdc, 0x57, 0xb4, 0xcb, 0x56, 0xcc, - 0x2e, 0xeb, 0x71, 0xbb, 0x64, 0xcb, 0x4f, 0x85, 0x26, 0x4f, 0xed, 0x69, 0x99, 0xda, 0x5f, 0xdf, - 0x56, 0xcb, 0x70, 0x25, 0x6b, 0x57, 0x7a, 0xcd, 0xbd, 0xc1, 0x6a, 0x46, 0xc6, 0x61, 0x93, 0xe5, - 0xf1, 0xa7, 0x1a, 0x2c, 0x26, 0x29, 0x5f, 0xd9, 0xe0, 0xe8, 0x1d, 0xa8, 0x48, 0xd3, 0x89, 0xb7, - 0xc5, 0xa2, 0xc2, 0x4a, 0x2f, 0x13, 0xc6, 0x13, 0x12, 0xe1, 0xbf, 0x69, 0xb0, 0xbc, 0xcd, 0x97, - 0xcf, 0x57, 0x1a, 0x7d, 0x0a, 0xc5, 0xe0, 0x6c, 0xc8, 0x2d, 0x52, 0xdf, 0x78, 0x4b, 0x11, 0x9d, - 0x2b, 0x63, 0xfd, 0x60, 0x48, 0x59, 0x74, 0xc6, 0x88, 0x0d, 0x98, 0xe1, 0x30, 0x7d, 0x60, 0xed, - 0x1f, 0x1c, 0x3c, 0x6a, 0x4c, 0x21, 0x04, 0xf5, 0x4e, 0x77, 0x53, 0xef, 0x3e, 0xdf, 0xdc, 0xee, - 0xee, 0x3d, 0xd9, 0xeb, 0xfe, 0xb0, 0xa1, 0xa1, 0x05, 0x98, 0xeb, 0x74, 0x0f, 0x1e, 0x45, 0xa8, - 0x02, 0x9a, 0x83, 0xea, 0xf6, 0xc1, 0xfe, 0xbd, 0xbd, 0xdd, 0xc7, 0x7a, 0xbb, 0x31, 0x4d, 0x5f, - 0x62, 0x7a, 0xbb, 0xd3, 0xee, 0x36, 0x8a, 0x68, 0x16, 0x2a, 0xbb, 0x07, 0xcf, 0xf9, 0xbb, 0xac, - 0x84, 0x4f, 0xe0, 0x4a, 0x96, 0x32, 0xd4, 0xb6, 0xc9, 0xe3, 0xbc, 0x72, 0xa7, 0x41, 0x3b, 0x9d, - 0xe6, 0x43, 0xd7, 0xb4, 0xfa, 0x67, 0x17, 0xb2, 0x1e, 0xb8, 0x43, 0xe2, 0x19, 0x81, 0xe5, 0x3a, - 0x32, 0x92, 0xaf, 0x67, 0x7b, 0xf6, 0x40, 0xd2, 0xe9, 0x0a, 0x0b, 0xba, 0x09, 0x75, 0x8f, 0xf4, - 0x5c, 0xa7, 0x6f, 0x1d, 0x8d, 0x3c, 0xb2, 0x69, 0xdb, 0x4c, 0xaf, 0x8a, 0x9e, 0xc0, 0xe2, 0xdf, - 0x68, 0x70, 0x29, 0x4b, 0x18, 0xba, 0x23, 0xfc, 0xc7, 0x1f, 0xda, 0x37, 0xcf, 0xd9, 0x3b, 0xe6, - 0x3a, 0xd9, 0x47, 0xb0, 0xa7, 0x44, 0x21, 0xea, 0x23, 0x58, 0xd7, 0xf2, 0x5e, 0x86, 0x5b, 0xe7, - 0xa1, 0xa6, 0xb7, 0x1f, 0x1e, 0x3c, 0x69, 0x3f, 0xd7, 0x0f, 0x1e, 0x50, 0x8f, 0xcd, 0x42, 0x65, - 0x73, 0x67, 0x87, 0x43, 0x45, 0xfc, 0x33, 0x0d, 0x96, 0x32, 0x2c, 0x47, 0xdd, 0xf4, 0x3d, 0x68, - 0xf4, 0x0d, 0xcb, 0x26, 0xe6, 0x41, 0x64, 0x2d, 0xed, 0x62, 0xd6, 0x4a, 0x31, 0x0a, 0x27, 0x14, - 0xd2, 0x3e, 0x57, 0xab, 0x35, 0xfe, 0x42, 0x83, 0xe5, 0x1d, 0xe2, 0x07, 0x9e, 0x7b, 0x11, 0x47, - 0x5e, 0x85, 0xea, 0x09, 0x21, 0xc3, 0x2e, 0xab, 0xef, 0x05, 0xe6, 0x82, 0x08, 0x81, 0xde, 0x85, - 0x45, 0xc3, 0xb6, 0xdd, 0xd3, 0x3d, 0x47, 0x1f, 0x39, 0x8e, 0xe5, 0x1c, 0x75, 0xc2, 0xfd, 0x2a, - 0x7a, 0xd6, 0x12, 0xd5, 0xa9, 0xef, 0x7a, 0x3d, 0xfe, 0xbe, 0xab, 0xe8, 0x1c, 0xc0, 0x04, 0xae, - 0x64, 0xa9, 0x44, 0x2d, 0xf4, 0x5d, 0x58, 0xe8, 0xd9, 0xc4, 0x70, 0x46, 0x7c, 0x4b, 0x86, 0x14, - 0x57, 0xc5, 0x55, 0x35, 0x29, 0x93, 0x34, 0x7a, 0x9a, 0x0d, 0xff, 0x45, 0x83, 0xeb, 0x9d, 0xd8, - 0x45, 0xf4, 0xc8, 0xa3, 0x31, 0x17, 0x58, 0xc4, 0xcf, 0x33, 0xc0, 0x33, 0x80, 0x61, 0x48, 0x24, - 0x22, 0xf9, 0x8e, 0xfa, 0xc2, 0x99, 0x2c, 0x6f, 0x3d, 0xc2, 0xf0, 0xfb, 0x59, 0x91, 0xd6, 0xba, - 0x0b, 0xf3, 0x89, 0xe5, 0x97, 0xba, 0x9b, 0xaf, 0xc3, 0xb5, 0xfc, 0xdd, 0xe9, 0x79, 0x7d, 0xb8, - 0xbe, 0xfb, 0x92, 0xc7, 0x6d, 0x42, 0xf9, 0xf3, 0x11, 0xf1, 0xe4, 0x59, 0xab, 0xba, 0x04, 0x69, - 0x46, 0x92, 0x17, 0x3d, 0x7b, 0x64, 0x92, 0x5d, 0xdb, 0x3d, 0x34, 0x6c, 0x5f, 0x66, 0x64, 0x1c, - 0x8b, 0xff, 0xa0, 0xc1, 0xb5, 0xdd, 0x49, 0x6a, 0xa1, 0x1f, 0xc4, 0x4c, 0xca, 0xc3, 0xfd, 0xb6, - 0x62, 0xd2, 0x89, 0xdc, 0xdf, 0xa4, 0x41, 0x7f, 0x5d, 0x80, 0xb9, 0xd8, 0x8b, 0x35, 0x6f, 0x26, - 0x61, 0xbb, 0xbd, 0x13, 0x62, 0x8a, 0x7c, 0x10, 0x90, 0x9c, 0xa7, 0xec, 0xc9, 0xba, 0x2b, 0xa0, - 0xdc, 0xc9, 0x49, 0x98, 0x9e, 0x25, 0xf5, 0x4a, 0x9e, 0x38, 0x33, 0x41, 0x6d, 0xa8, 0x9b, 0x64, - 0x68, 0xbb, 0x67, 0xb2, 0x26, 0x8a, 0x5e, 0x46, 0x1d, 0x24, 0x50, 0xe5, 0x77, 0x62, 0x44, 0x7a, - 0x82, 0x89, 0x1a, 0x65, 0x68, 0x99, 0xcd, 0x0a, 0x37, 0xca, 0xd0, 0x32, 0xd1, 0x0d, 0x98, 0xf3, - 0x0d, 0xc7, 0x3c, 0x74, 0x5f, 0x74, 0x02, 0xd3, 0x1d, 0x05, 0xcd, 0x2a, 0x9f, 0x57, 0xc5, 0x90, - 0xb4, 0x92, 0xa3, 0xb4, 0xf8, 0xd8, 0x0c, 0x48, 0x4b, 0xcc, 0x80, 0x9a, 0x50, 0x36, 0x8e, 0xf8, - 0x08, 0x8c, 0xdb, 0x5b, 0x82, 0x74, 0xc5, 0xed, 0xf7, 0x89, 0x17, 0x1a, 0x4c, 0x82, 0xb4, 0xdd, - 0x23, 0x2f, 0x48, 0x6f, 0x14, 0xb8, 0x74, 0x91, 0x5b, 0x4d, 0xc1, 0xe0, 0x05, 0x98, 0xdf, 0x25, - 0x81, 0x48, 0x6c, 0xde, 0x59, 0x7d, 0x0a, 0x73, 0x11, 0x8a, 0x06, 0x59, 0xd8, 0x94, 0x68, 0x17, - 0x6a, 0x4a, 0xf0, 0x1a, 0xd4, 0x85, 0x00, 0xa5, 0xdf, 0x13, 0xfe, 0xd4, 0x54, 0x7f, 0xe2, 0x0f, - 0x61, 0x36, 0xa4, 0xa4, 0x3b, 0xbd, 0x01, 0x45, 0xba, 0x22, 0x2e, 0xa5, 0xc5, 0x84, 0x27, 0xd8, - 0x1e, 0x8c, 0x00, 0xb7, 0x61, 0x8e, 0x62, 0xb6, 0xa9, 0x37, 0x73, 0xa3, 0x8b, 0x36, 0x61, 0x9c, - 0xfd, 0xa1, 0x6b, 0x92, 0xb0, 0x09, 0x8b, 0x50, 0xf8, 0x27, 0x50, 0xdb, 0x76, 0x07, 0x03, 0xc3, - 0x31, 0xa5, 0x2f, 0x89, 0x33, 0x66, 0xc7, 0xac, 0xea, 0xf4, 0x27, 0x0b, 0xac, 0x63, 0x62, 0xdb, - 0x22, 0x3e, 0x39, 0x10, 0x85, 0xfd, 0xb4, 0x12, 0xf6, 0x34, 0xdc, 0x0c, 0xef, 0x68, 0xc4, 0x9b, - 0xca, 0x22, 0x93, 0x11, 0x21, 0xa8, 0x82, 0xb4, 0x4f, 0x11, 0x11, 0xca, 0x7e, 0xe3, 0x87, 0x50, - 0xdb, 0x3e, 0x36, 0x1c, 0x87, 0xd8, 0xb9, 0x67, 0x40, 0xca, 0xdb, 0xa9, 0x2a, 0x6a, 0x2a, 0xb3, - 0xa6, 0x77, 0x44, 0x82, 0x28, 0x3b, 0x28, 0x84, 0xbf, 0x9a, 0x86, 0x4a, 0x98, 0x6e, 0xdf, 0x82, - 0xaa, 0x4f, 0x9d, 0xc3, 0x22, 0x9b, 0xdb, 0x33, 0xdf, 0x71, 0x11, 0x29, 0xe5, 0xeb, 0x49, 0xab, - 0x8a, 0xc7, 0x60, 0x33, 0xe1, 0x87, 0xd0, 0xea, 0x7a, 0x44, 0x8a, 0xbe, 0x03, 0xf3, 0x96, 0x73, - 0xe8, 0x8e, 0x1c, 0x53, 0x1c, 0x89, 0x5e, 0x6a, 0x34, 0x5c, 0x96, 0xd4, 0xd2, 0x12, 0x9d, 0x56, - 0x4f, 0x92, 0xa3, 0x2d, 0x68, 0xb8, 0xa3, 0x20, 0x2e, 0xa2, 0x38, 0x51, 0x44, 0x8a, 0x1e, 0xdd, - 0xa6, 0x2e, 0x0f, 0x1d, 0xca, 0x8c, 0x9d, 0x60, 0x8f, 0x56, 0x75, 0x95, 0x94, 0x26, 0x1e, 0x8d, - 0x2c, 0x36, 0xf0, 0xe4, 0x77, 0x45, 0x08, 0xb3, 0xc9, 0xb0, 0x33, 0xde, 0x33, 0xd9, 0x0d, 0x51, - 0xd5, 0x39, 0x80, 0xb6, 0x63, 0x77, 0x2f, 0xef, 0x5a, 0xff, 0x2f, 0x23, 0x64, 0xbf, 0xc9, 0x6b, - 0xf6, 0x1d, 0x58, 0x8c, 0x97, 0x6b, 0x9e, 0x6f, 0x4d, 0x28, 0xf3, 0x0c, 0xf3, 0x45, 0x30, 0x4b, - 0x10, 0xff, 0x5c, 0x83, 0x85, 0x54, 0x81, 0x47, 0x77, 0xa0, 0x76, 0x62, 0xd9, 0x36, 0x31, 0xbb, - 0x17, 0xca, 0x73, 0x95, 0x18, 0x7d, 0x0c, 0xb3, 0x1e, 0x7f, 0x96, 0xc8, 0x97, 0xcd, 0x64, 0xe6, - 0x18, 0x35, 0xde, 0x66, 0xf7, 0x0f, 0x6d, 0x31, 0x42, 0xe5, 0x43, 0x6b, 0x6b, 0xaa, 0xb5, 0x5b, - 0x50, 0x19, 0x1a, 0xc1, 0x71, 0x67, 0x48, 0x7a, 0xf2, 0x21, 0x29, 0x61, 0xfc, 0x45, 0x11, 0x2a, - 0xb2, 0x4b, 0xf9, 0xef, 0xcc, 0xbe, 0xfb, 0x23, 0xdb, 0x56, 0x67, 0xdf, 0x12, 0x56, 0x2d, 0x5b, - 0x8a, 0x59, 0x16, 0xbd, 0x09, 0x25, 0xfa, 0xb2, 0xf5, 0x9b, 0x33, 0xcc, 0x00, 0x99, 0x1d, 0x14, - 0xa7, 0x40, 0x77, 0x53, 0xd3, 0x96, 0xd7, 0x33, 0xa8, 0x73, 0xc7, 0x2c, 0xef, 0xc5, 0xc6, 0x2c, - 0xd7, 0xb2, 0x58, 0x93, 0x4d, 0xec, 0xdd, 0xd4, 0x7c, 0x25, 0x73, 0xc7, 0xff, 0xa1, 0xc1, 0xca, - 0x1d, 0x56, 0xc5, 0x44, 0x60, 0xd1, 0x18, 0x0f, 0xfd, 0xa3, 0x9d, 0xe7, 0x1f, 0xfc, 0x7b, 0x0d, - 0x5e, 0xdb, 0x25, 0xc1, 0xd3, 0xc4, 0x38, 0x21, 0x8c, 0xd0, 0x55, 0xa8, 0x79, 0x64, 0xe8, 0x3e, - 0x32, 0x82, 0x80, 0x78, 0x72, 0x86, 0xa9, 0xa2, 0xd0, 0x1a, 0xcc, 0x7b, 0x64, 0x6c, 0xf9, 0x96, - 0xeb, 0x48, 0x2a, 0xae, 0x61, 0x12, 0x4d, 0x65, 0x19, 0xb6, 0xbd, 0xe5, 0x19, 0x4e, 0xef, 0x98, - 0xc8, 0x87, 0xa0, 0x8a, 0x62, 0x65, 0xdf, 0xb6, 0xbb, 0xc6, 0x91, 0x2f, 0x5e, 0xfa, 0x12, 0xc4, - 0x87, 0x70, 0x29, 0xa9, 0xa3, 0x4c, 0x01, 0xaa, 0x8c, 0x4c, 0x01, 0xfa, 0x9b, 0xdd, 0x6f, 0x72, - 0x5c, 0x22, 0xf2, 0x47, 0xc2, 0xac, 0x49, 0x13, 0x6a, 0x89, 0x4c, 0x08, 0x61, 0xfc, 0x19, 0x2c, - 0x67, 0x9b, 0x82, 0xda, 0xf4, 0x21, 0x2c, 0x24, 0x67, 0x2e, 0x59, 0x4d, 0x57, 0x96, 0x92, 0x7a, - 0x9a, 0x13, 0x23, 0x68, 0x3c, 0xb0, 0x7c, 0xda, 0xad, 0xb8, 0xca, 0xb7, 0xa5, 0x0a, 0x85, 0x73, - 0x53, 0xbb, 0x09, 0x65, 0x91, 0x18, 0xa2, 0x46, 0x4b, 0x90, 0xfa, 0x40, 0xfc, 0xd4, 0xe3, 0x87, - 0x4b, 0xa2, 0xf1, 0xe7, 0x50, 0x57, 0xf6, 0x95, 0xc1, 0x42, 0xa1, 0xac, 0x60, 0x11, 0xda, 0xe8, - 0x9c, 0x02, 0x7d, 0x00, 0x97, 0x8f, 0xd8, 0x7b, 0x7d, 0x27, 0xb1, 0x19, 0xb7, 0x72, 0xf6, 0x22, - 0xde, 0x87, 0xfa, 0xa6, 0x69, 0x52, 0x59, 0x32, 0xa8, 0xb2, 0x0e, 0x97, 0x71, 0x84, 0x42, 0xf6, - 0x11, 0x74, 0x98, 0x0d, 0xe5, 0xf1, 0x37, 0x1b, 0x72, 0xc8, 0x69, 0x52, 0x25, 0x2e, 0x3b, 0x63, - 0x85, 0xee, 0x6e, 0xc9, 0x8a, 0x5f, 0xd5, 0xd9, 0x6f, 0xfc, 0x26, 0x2c, 0xe8, 0x64, 0xe0, 0x8e, - 0x89, 0xaa, 0xe6, 0x25, 0x28, 0x59, 0x8e, 0x49, 0x5e, 0xc8, 0x2f, 0x2f, 0x0c, 0xc0, 0xdf, 0x86, - 0x79, 0x95, 0x94, 0x6a, 0x70, 0x13, 0xea, 0xea, 0x3e, 0x61, 0x38, 0x26, 0xb0, 0xf8, 0x2d, 0x58, - 0xd4, 0x49, 0xdf, 0x23, 0xfe, 0xb1, 0xea, 0xf7, 0x9c, 0x7d, 0xfe, 0x1f, 0x2e, 0x77, 0x48, 0xa0, - 0xb0, 0x4f, 0x26, 0xbf, 0xcb, 0x9a, 0xd4, 0xdd, 0x2c, 0x0f, 0x48, 0x46, 0x35, 0xf6, 0xb5, 0x44, - 0xec, 0x7f, 0x9f, 0x75, 0x85, 0x74, 0x9b, 0x1c, 0xe6, 0xcc, 0x5d, 0x63, 0x22, 0x0b, 0x09, 0x91, - 0xef, 0xc1, 0x6b, 0x79, 0x22, 0xa9, 0xd1, 0xa4, 0x1b, 0x34, 0xc5, 0x0d, 0x65, 0x28, 0xb5, 0x07, - 0xc3, 0xe0, 0x6c, 0xe3, 0x9f, 0x75, 0x28, 0x8b, 0x21, 0x15, 0xda, 0x86, 0x5a, 0xd7, 0x33, 0x7a, - 0x27, 0xfc, 0x53, 0x27, 0x6a, 0xa6, 0xbe, 0x7e, 0x0a, 0x15, 0x5b, 0x4b, 0x19, 0x2b, 0xb4, 0xa1, - 0x9d, 0x7a, 0x57, 0x43, 0xcf, 0xa0, 0x91, 0xfc, 0x54, 0x85, 0x70, 0xbc, 0x7b, 0xcc, 0xfa, 0x12, - 0xd7, 0x5a, 0x9d, 0x48, 0xc3, 0xa4, 0xa3, 0x2d, 0xa8, 0xc8, 0x4f, 0x39, 0x48, 0x1d, 0x44, 0x26, - 0x3e, 0x05, 0xb5, 0x9a, 0x99, 0x6b, 0x5c, 0xc6, 0x53, 0xf6, 0x38, 0x50, 0xbf, 0xf1, 0xa0, 0xd7, - 0x73, 0x9b, 0xdb, 0xf0, 0xc4, 0xd7, 0x27, 0x91, 0x70, 0xc1, 0x3f, 0x06, 0x94, 0x1e, 0xc5, 0xa2, - 0x1b, 0x17, 0x99, 0x0f, 0xb7, 0xf0, 0x39, 0x54, 0x7c, 0x87, 0x2e, 0xd4, 0xe3, 0x83, 0x71, 0xb4, - 0x7a, 0xde, 0x54, 0xbe, 0xb5, 0x32, 0x81, 0x22, 0x94, 0x1a, 0x3f, 0x11, 0x5a, 0xcd, 0x3d, 0x6c, - 0x96, 0xd4, 0x8c, 0xd1, 0x31, 0xb7, 0x46, 0x7a, 0xf6, 0x19, 0xb3, 0x46, 0xee, 0x9c, 0x36, 0x66, - 0x8d, 0x9c, 0x01, 0x2a, 0x9e, 0x42, 0x3f, 0x82, 0x85, 0xd4, 0xd4, 0x0e, 0xa9, 0x6f, 0xe5, 0xbc, - 0x69, 0x68, 0xeb, 0xf5, 0xc9, 0x44, 0xe1, 0x01, 0xd2, 0x33, 0xaf, 0xd8, 0x01, 0x72, 0xa7, 0x74, - 0xb1, 0x03, 0xe4, 0x0c, 0xce, 0x78, 0x34, 0xcb, 0x9e, 0x38, 0x16, 0xcd, 0x89, 0xde, 0x39, 0x16, - 0xcd, 0xb1, 0x26, 0x1a, 0x4f, 0xa1, 0x4f, 0xa1, 0x2c, 0x50, 0x68, 0x39, 0x4d, 0x26, 0x25, 0x5c, - 0xc9, 0x5a, 0xe2, 0x02, 0xf6, 0x61, 0x56, 0x7d, 0xba, 0xa3, 0x95, 0xdc, 0xa1, 0x1d, 0x17, 0x35, - 0x71, 0xa8, 0x17, 0x1e, 0x8a, 0x3d, 0x91, 0x92, 0x87, 0x52, 0x1f, 0xe4, 0xc9, 0x43, 0x45, 0x6f, - 0x2a, 0x3c, 0x85, 0xfa, 0xec, 0x33, 0x6c, 0xea, 0x79, 0x80, 0x6e, 0xc6, 0x79, 0xf2, 0x9e, 0x52, - 0xad, 0x1b, 0xe7, 0xd2, 0xf1, 0x7d, 0xda, 0x50, 0x0d, 0x4b, 0x34, 0x7a, 0x4d, 0x61, 0x4a, 0x3e, - 0x18, 0x5a, 0xcb, 0xd9, 0x8b, 0xa1, 0x0f, 0x44, 0x99, 0x8c, 0xf9, 0x20, 0x5e, 0x8a, 0x63, 0x3e, - 0x50, 0xab, 0x2a, 0x9e, 0x42, 0xf7, 0x01, 0xa2, 0x42, 0x87, 0xae, 0xc6, 0xde, 0x05, 0x89, 0x52, - 0xd9, 0x6a, 0xe5, 0xac, 0x4a, 0xeb, 0xcf, 0xaa, 0x75, 0x2f, 0xe6, 0xcd, 0x8c, 0x82, 0xd8, 0x6a, - 0xa8, 0x53, 0x6c, 0x5a, 0x0f, 0xf0, 0x14, 0xba, 0x07, 0xf5, 0x78, 0x39, 0x8c, 0xdd, 0x07, 0x99, - 0x95, 0x32, 0x53, 0xce, 0x33, 0x68, 0xe6, 0xd5, 0x49, 0x74, 0x2b, 0x2e, 0x71, 0x52, 0x31, 0xcd, - 0x94, 0x6d, 0xc3, 0x52, 0x76, 0xc5, 0x43, 0x6b, 0x71, 0xc9, 0xf9, 0x75, 0xb6, 0x75, 0xf3, 0x02, - 0x94, 0xdc, 0xaa, 0x1f, 0x43, 0x35, 0xfc, 0x8f, 0x49, 0x2c, 0x4e, 0x92, 0xff, 0x3c, 0x89, 0xeb, - 0x3a, 0x26, 0x4e, 0xf0, 0xae, 0xb6, 0x75, 0xfb, 0x4f, 0x5f, 0xae, 0x68, 0x7f, 0xff, 0x72, 0x45, - 0xfb, 0xd7, 0x97, 0x2b, 0xda, 0xaf, 0xfe, 0xbd, 0x32, 0x05, 0xb8, 0x77, 0xbc, 0xde, 0x23, 0x9e, - 0xb3, 0x6e, 0xd8, 0x56, 0x8f, 0xac, 0xbb, 0x1b, 0xeb, 0x92, 0xc7, 0x1b, 0xf6, 0x7c, 0xe2, 0x8d, - 0x89, 0xf7, 0xac, 0x30, 0x3c, 0x3c, 0x9c, 0x61, 0x7f, 0x73, 0x7b, 0xff, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0xf1, 0xb7, 0x68, 0xe7, 0x00, 0x27, 0x00, 0x00, + // 2918 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, + 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, + 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, + 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, + 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, + 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, + 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, + 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, + 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, + 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, + 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, + 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, + 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, + 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, + 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, + 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, + 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, + 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, + 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, + 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, + 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, + 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, + 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, + 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, + 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, + 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, + 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, + 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, + 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, + 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, + 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, + 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, + 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, + 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, + 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, + 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, + 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, + 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, + 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, + 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, + 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, + 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, + 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, + 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, + 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, + 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, + 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, + 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, + 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, + 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, + 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, + 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, + 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, + 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, + 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, + 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, + 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, + 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, + 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, + 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, + 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, + 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, + 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, + 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, + 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, + 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, + 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, + 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, + 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, + 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, + 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, + 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, + 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, + 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, + 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, + 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, + 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, + 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, + 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, + 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, + 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, + 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, + 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, + 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, + 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, + 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, + 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, + 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, + 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, + 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, + 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, + 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, + 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, + 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, + 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, + 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, + 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, + 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, + 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, + 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, + 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, + 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, + 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, + 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, + 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, + 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, + 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, + 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, + 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, + 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, + 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, + 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, + 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, + 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, + 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, + 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, + 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, + 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, + 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, + 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, + 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, + 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, + 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, + 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, + 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, + 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, + 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, + 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, + 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, + 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, + 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, + 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, + 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, + 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, + 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, + 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, + 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, + 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, + 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, + 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, + 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, + 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, + 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, + 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, + 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, + 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, + 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, + 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, + 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, + 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, + 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, + 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, + 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, + 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, + 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, + 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, + 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, + 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, + 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, + 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, + 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, + 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, + 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, + 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, + 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, + 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, + 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, + 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, + 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, + 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, + 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, + 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, + 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, + 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, + 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, + 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, + 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, + 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, + 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, + 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, + 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, + 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, + 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -5235,6 +5244,13 @@ func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Message) > 0 { + i -= len(m.Message) + copy(dAtA[i:], m.Message) + i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) + i-- + dAtA[i] = 0x2a + } if len(m.Error) > 0 { i -= len(m.Error) copy(dAtA[i:], m.Error) @@ -8430,6 +8446,10 @@ func (m *Ev_EnvironmentEvent) Size() (n int) { if l > 0 { n += 1 + l + sovO2Control(uint64(l)) } + l = len(m.Message) + if l > 0 { + n += 1 + l + sovO2Control(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -10095,6 +10115,38 @@ func (m *Ev_EnvironmentEvent) Unmarshal(dAtA []byte) error { } m.Error = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 5: + 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 ErrIntOverflowO2Control + } + 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 ErrInvalidLengthO2Control + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthO2Control + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Message = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipO2Control(dAtA[iNdEx:]) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 29ee73eb6..9ae3960d6 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -38,6 +38,7 @@ message Ev_EnvironmentEvent { string state = 2; uint32 currentRunNumber = 3; string error = 4; + string message = 5; } message Ev_TaskEvent { diff --git a/core/task/manager.go b/core/task/manager.go index 6744cd4d1..e2868ffc4 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -620,7 +620,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -656,7 +656,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) } // Kill all tasks outside an environment (all unlocked tasks) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 858bf0c6d..d01fbba4b 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -727,7 +727,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "shenv": mesosTaskInfo.Command.GetEnvironment().String(), "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.name, TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.className}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) From 7be2e70b8f01e8096aea43450f7ed2be4e4dc306 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 8 Dec 2020 16:30:47 +0100 Subject: [PATCH 0670/2352] [core] Describe structs and remove obsolete comments --- core/server.go | 19 +++++-------------- core/serverutil.go | 35 +++++++++++++++++++---------------- core/task/safeacks.go | 6 ++++++ 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core/server.go b/core/server.go index f41cb5902..d35bf82a8 100644 --- a/core/server.go +++ b/core/server.go @@ -53,7 +53,7 @@ func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ state: state, - conns: newConnectionsInstance(), + streams: newSafeStreamsMap(), }) // Register reflection service on gRPC server. reflection.Register(s) @@ -80,7 +80,7 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { state *globalState - conns Connections + streams SafeStreamsMap } func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { @@ -208,11 +208,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme r := &pb.NewEnvironmentReply{ Environment: ei, } - // select { - // case m.state.PublicEvent <- pb.NewEnvironmentCreatedEvent(ei): - // default: - // log.Debug("state.PublicEvent channel is full") - // } return r, nil } @@ -379,11 +374,6 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir Error("task cleanup error") return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() } - // select { - // case m.state.PublicEvent <- pb.NewEnvironmentDestroyedEvent(ctr, env.Id().String()): - // default: - // log.Debug("state.PublicEvent channel is full") - // } return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } @@ -660,11 +650,12 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() ch := make(chan *pb.Event) - m.conns.add(req.GetId(), ch) + m.streams.add(req.GetId(), ch) for { select { case event, ok := <- ch: if !ok { + m.streams.delete(req.GetId()) return nil } err := srv.Send(event) @@ -679,7 +670,7 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch, ok := m.conns.GetChannel(request.GetId()) + ch, ok := m.streams.GetChannel(request.GetId()) var sub environment.Subscription if ok { sub = environment.SubscribeToStream(ch) diff --git a/core/serverutil.go b/core/serverutil.go index 002e3670f..24030b85a 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -184,33 +184,36 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { return } - -type Connections struct { +// SafeStreamsMap is a safe map where the key is usually a +// subscriptionID received from the grpc call and as a value +// a channel where get events from the environment +// and we stream them to the grpc client. +type SafeStreamsMap struct { mu sync.RWMutex streams map[string]chan *pb.Event } -func (c *Connections) add(id string, ch chan *pb.Event) { - c.mu.Lock() - c.streams[id] = ch - c.mu.Unlock() +func (s *SafeStreamsMap) add(id string, ch chan *pb.Event) { + s.mu.Lock() + s.streams[id] = ch + s.mu.Unlock() } -func (c *Connections) delete(id string) { - c.mu.Lock() - delete(c.streams, id) - c.mu.Unlock() +func (s *SafeStreamsMap) delete(id string) { + s.mu.Lock() + delete(s.streams, id) + s.mu.Unlock() } -func (c *Connections) GetChannel(id string) (ch chan *pb.Event, ok bool) { - c.mu.RLock() - defer c.mu.RUnlock() - ch, ok = c.streams[id] +func (s *SafeStreamsMap) GetChannel(id string) (ch chan *pb.Event, ok bool) { + s.mu.RLock() + defer s.mu.RUnlock() + ch, ok = s.streams[id] return } -func newConnectionsInstance() Connections { - return Connections{ +func newSafeStreamsMap() SafeStreamsMap { + return SafeStreamsMap{ streams: make(map[string]chan *pb.Event), } } \ No newline at end of file diff --git a/core/task/safeacks.go b/core/task/safeacks.go index e458ee7fe..b6ca867c6 100644 --- a/core/task/safeacks.go +++ b/core/task/safeacks.go @@ -28,6 +28,12 @@ import ( "sync" ) +// safeAcks is a thread safe map where key is a string usually a taskID +// and the value is a channel of empty struct. It is being used +// when we want to acknowledge that an action happened to the task +// such as task KILLED. At the moment we utilize +// safeAcks to acknowledge that all the requested tasks +// where killed by mesos (task/manager.go). type safeAcks struct { mu sync.RWMutex acks map[string]chan struct{} From 6c01449b5bb143c16ee72db1bbb38aacd8313ad0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 11 Dec 2020 10:12:59 +0100 Subject: [PATCH 0671/2352] [core] create channel and add stream in NewAutoEnvironment --- core/server.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/server.go b/core/server.go index d35bf82a8..a8eb1926e 100644 --- a/core/server.go +++ b/core/server.go @@ -649,9 +649,11 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { m.logMethod() - ch := make(chan *pb.Event) - m.streams.add(req.GetId(), ch) for { + ch, ok := m.streams.GetChannel(req.GetId()) + if !ok { + continue + } select { case event, ok := <- ch: if !ok { @@ -670,11 +672,9 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { m.logMethod() - ch, ok := m.streams.GetChannel(request.GetId()) - var sub environment.Subscription - if ok { - sub = environment.SubscribeToStream(ch) - } + ch := make(chan *pb.Event) + m.streams.add(request.GetId(), ch) + sub := environment.SubscribeToStream(ch) go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) r := &pb.NewAutoEnvironmentReply{} return r, nil From 87c094b5dc6cff5a50c950a518f422107205631f Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 27 Jan 2021 15:31:09 +0100 Subject: [PATCH 0672/2352] [core] Environment unsubscribe once --- core/environment/environment.go | 13 ++++++++----- core/environment/manager.go | 12 +++--------- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 7c9e90f6c..df1f2deb3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -52,6 +52,7 @@ var log = logger.New(logrus.StandardLogger(),"env") type Environment struct { Mu sync.RWMutex + once sync.Once Sm *fsm.FSM name string id uid.ID @@ -422,11 +423,13 @@ func (env *Environment) unsubscribeFromWfState() { // Use select to unblock in case the above goroutine // exits due to an ERROR state. If that's the case // we close the channel. - select { - case env.unsubscribe <- struct{}{}: - default: - close(env.unsubscribe) - } + env.once.Do(func() { + select { + case env.unsubscribe <- struct{}{}: + default: + close(env.unsubscribe) + } + }) } func (env *Environment) addSubscription(sub Subscription) { diff --git a/core/environment/manager.go b/core/environment/manager.go index b59726028..c4e48bba3 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -182,8 +182,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }). Warn("environment deployment failed, tasks were cleaned up") - // close state channels and stream - env.closeStream() + // close state channels close(envs.pendingStateChangeCh[env.Id()]) delete(envs.pendingStateChangeCh, env.Id()) @@ -238,7 +237,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error delete(envs.m, environmentId) env.unsubscribeFromWfState() - env.closeStream() return err } @@ -399,7 +397,6 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh envs.mu.Unlock() - env.subscribeToWfState(envs.taskman) err = env.TryTransition(NewConfigureTransition( envs.taskman, @@ -452,11 +449,8 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - - if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - return - } + env.subscribeToWfState(envs.taskman) + defer env.unsubscribeFromWfState() // now we have the environment we should transition to start trans := NewStartActivityTransition(envs.taskman) From cfb9d6def847a8325d89c41a6cf606225a4bd7d7 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 27 Jan 2021 15:50:56 +0100 Subject: [PATCH 0673/2352] [core] Environment fix push to closed channel crash --- core/environment/eventStream.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index ddef68eec..1f45677e5 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -60,6 +60,7 @@ func (e *eventStream) send(data *pb.Event) { func (e *eventStream) closeStream() { close(e.stream) + e.stream = nil } type eventSub struct { From 3f7d14e2215696223fc5b37c2ac99e0fe7a43ee5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Jan 2021 09:33:53 +0100 Subject: [PATCH 0674/2352] [core][executor] Add support for DESTROY hooks --- core/environment/manager.go | 58 +++++++++++++++++++++++++- executor/executable/basictaskcommon.go | 4 ++ 2 files changed, 60 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index c4e48bba3..235d167e6 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -206,7 +206,24 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,environmentId, env.Workflow().GetTasks(), nil) + // we gather all DESTROY/after_DESTROY hooks, as these require special treatment + tasksToRelease := env.Workflow().GetTasks() + cleanupHooks := env.Workflow().GetHooksForTrigger("DESTROY") + cleanupHooks = append(cleanupHooks, env.Workflow().GetHooksForTrigger("after_DESTROY")...) + + // for each found cleanup hook, + // for each of all tasks last-to-first + // if the pointed task is one of the known cleanup hooks, remove it + for _, hook := range cleanupHooks { + for i := len(tasksToRelease)-1; i >= 0; i-- { + if hook == tasksToRelease[i] { + tasksToRelease = append(tasksToRelease[:i], tasksToRelease[i+1:]...) + } + } + } + + // we kill all tasks that aren't cleanup hooks + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, tasksToRelease, nil) // close state channel close(envs.pendingStateChangeCh[environmentId]) delete(envs.pendingStateChangeCh, environmentId) @@ -217,8 +234,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.taskman.MessageChannel <- taskmanMessage incomingEv := <- pendingCh - envs.mu.Lock() + envs.mu.Lock() // If some tasks failed to release if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { @@ -235,6 +252,43 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete"}) + envs.mu.Unlock() + // we trigger all cleanup hooks + err = envs.taskman.TriggerHooks(cleanupHooks) + if err != nil { + log.WithError(err).Warn("environment post-destroy hooks failed") + } + + envs.mu.Lock() + + // and then we kill them too + taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupHooks, nil) + + // we remake the pending teardown channel too, because each completed TasksReleasedEvent + // automatically closes it + pendingCh = make(chan *event.TasksReleasedEvent) + envs.pendingTeardownsCh[environmentId] = pendingCh + envs.mu.Unlock() + envs.taskman.MessageChannel <- taskmanMessage + + incomingEv = <- pendingCh + + envs.mu.Lock() + // If some cleanup hooks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": environmentId, + }). + WithError(err). + Warn("task failed to release") + } + err = fmt.Errorf("%d tasks failed to release for environment %s", + len(taskReleaseErrors), environmentId) + return err + } + delete(envs.m, environmentId) env.unsubscribeFromWfState() return err diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 88cb73f8b..eda7f559d 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -32,6 +32,7 @@ import ( "os/exec" "syscall" + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" @@ -161,6 +162,9 @@ func (t *basicTaskBase) ensureBasicTaskKilled() (err error) { if t.taskCmd == nil { return nil } + if t.tci.ControlMode == controlmode.HOOK { + return nil + } if t.taskCmd.ProcessState.Exited() { return nil } From ce11efc39fbe95523245ab656b5678a7aedfa265 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Jan 2021 17:13:21 +0100 Subject: [PATCH 0675/2352] [executor] Ensure DESTROY hooks can be triggered even after task KILL --- core/environment/manager.go | 4 ++-- executor/executable/basictaskcommon.go | 8 +++---- executor/executable/controllabletask.go | 14 ++++++------- executor/executable/hooktask.go | 2 +- executor/executable/task.go | 28 ++++++++++++------------- executor/handlers.go | 19 ++++++++++++++++- 6 files changed, 46 insertions(+), 29 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 235d167e6..7574f2b13 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -381,7 +381,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") } } else { - log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") } // If the task hasn't already been killed @@ -397,7 +397,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { taskId := evt.GetOrigin().TaskId t := envs.taskman.GetTask(taskId.Value) if t == nil { - log.WithPrefix("scheduler").Error("cannot find task for DeviceEvent END_OF_STREAM") + log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") return } env, err := envs.environment(t.GetEnvironmentId()) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index eda7f559d..4504b71b4 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -50,7 +50,7 @@ type basicTaskBase struct { } func (t *basicTaskBase) startBasicTask() (err error) { - t.taskCmd, err = prepareTaskCmd(t.tci) + t.taskCmd, err = prepareTaskCmd(t.Tci) if err != nil { msg := "cannot build task command" log.WithFields(logrus.Fields{ @@ -86,7 +86,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err, - "command": *t.tci.Value, + "command": *t.Tci.Value, }). Error("failed to run basic task") @@ -162,7 +162,7 @@ func (t *basicTaskBase) ensureBasicTaskKilled() (err error) { if t.taskCmd == nil { return nil } - if t.tci.ControlMode == controlmode.HOOK { + if t.Tci.ControlMode == controlmode.HOOK { return nil } if t.taskCmd.ProcessState.Exited() { @@ -191,7 +191,7 @@ func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) e return errors.New("bad internal state for basic task command") } - t.transitioner = transitioner.NewTransitioner(t.tci.ControlMode, transitionFunc) + t.transitioner = transitioner.NewTransitioner(t.Tci.ControlMode, transitionFunc) log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). Debug("basic task staged") diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 819385600..b15aa624c 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -66,7 +66,7 @@ type CommitResponse struct { func (t *ControllableTask) Launch() error { t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed - taskCmd, err := prepareTaskCmd(t.tci) + taskCmd, err := prepareTaskCmd(t.Tci) if err != nil { msg := "cannot build task command" log.WithFields(logrus.Fields{ @@ -97,8 +97,8 @@ func (t *ControllableTask) Launch() error { err = taskCmd.Start() var tciCommandStr string - if t.tci.Value != nil { - tciCommandStr = *t.tci.Value + if t.Tci.Value != nil { + tciCommandStr = *t.Tci.Value } if err != nil { log.WithFields(logrus.Fields{ @@ -124,8 +124,8 @@ func (t *ControllableTask) Launch() error { }() log.WithFields(logrus.Fields{ - "controlPort": t.tci.ControlPort, - "controlMode": t.tci.ControlMode.String(), + "controlPort": t.Tci.ControlPort, + "controlMode": t.Tci.ControlMode.String(), "task": t.ti.Name, "id": t.ti.TaskID.Value, "path": taskCmd.Path, @@ -143,8 +143,8 @@ func (t *ControllableTask) Launch() error { } t.rpc = executorcmd.NewClient( - t.tci.ControlPort, - t.tci.ControlMode, + t.Tci.ControlPort, + t.Tci.ControlMode, controlTransport, log.WithPrefix("executorcmd"). WithFields(logrus.Fields{ diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go index 26b172929..39eb94b8f 100644 --- a/executor/executable/hooktask.go +++ b/executor/executable/hooktask.go @@ -48,4 +48,4 @@ func (t *HookTask) Launch() error { func (t *HookTask) Trigger() error { return t.startBasicTask() -} \ No newline at end of file +} diff --git a/executor/executable/task.go b/executor/executable/task.go index e07f3d513..a367e4c39 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -65,8 +65,8 @@ type Task interface { } type taskBase struct { - ti *mesos.TaskInfo - tci *common.TaskCommandInfo + ti *mesos.TaskInfo + Tci *common.TaskCommandInfo sendStatus SendStatusFunc sendDeviceEvent SendDeviceEventFunc @@ -105,11 +105,11 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE newTask = &BasicTask{ basicTaskBase: basicTaskBase{ taskBase: taskBase{ - ti: &taskInfo, - tci: &commandInfo, - sendStatus: sendStatusFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + sendMessage: sendMessageFunc, }, }, } @@ -117,11 +117,11 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE newTask = &HookTask{ basicTaskBase: basicTaskBase{ taskBase: taskBase{ - ti: &taskInfo, - tci: &commandInfo, - sendStatus: sendStatusFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + sendMessage: sendMessageFunc, }, }, } @@ -130,11 +130,11 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE case controlmode.FAIRMQ: newTask = &ControllableTask{ taskBase: taskBase{ - ti: &taskInfo, - tci: &commandInfo, - sendStatus: sendStatusFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + sendMessage: sendMessageFunc, }, rpc: nil, } diff --git a/executor/handlers.go b/executor/handlers.go index ab4c2cf50..bebb79135 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "fmt" + "time" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils" @@ -290,11 +291,27 @@ func handleKillEvent(state *internalState, e *executor.Event_Kill) error { if !ok { return errors.New("invalid task ID") } - delete(state.activeTasks, e.GetTaskID()) go func() { _ = activeTask.Kill() activeTask = nil + if ht, ok := activeTask.(*executable.HookTask); ok { + // if it's a hook, it might be a DESTROY hook and therefore run after Kill + // so we give it timeout seconds to stop, and in any case no more than 10s + timeout := 10*time.Second + if ht.Tci.Timeout != 0 && ht.Tci.Timeout < timeout { + timeout = ht.Tci.Timeout + } + + // this timeout is necessary so any incoming trigger commands can still use + // state.activeTasks after the task is killed i.e. formally not active any more + select{ + case <- time.After(timeout): + delete(state.activeTasks, e.GetTaskID()) + } + } else { + delete(state.activeTasks, e.GetTaskID()) + } }() return nil From 2932dcc06922001276642839c135011a9310747c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Feb 2021 11:21:31 +0100 Subject: [PATCH 0676/2352] [build] Bump to v0.19.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3e968f54f..7d67a215f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 19 -VERSION_PATCH := 2 +VERSION_PATCH := 80 From 7cf02463d983d6062b1ccecea7b333f1e084465e Mon Sep 17 00:00:00 2001 From: George R Date: Fri, 5 Feb 2021 10:17:58 +0200 Subject: [PATCH 0677/2352] Add a state "done" for completed auto env --- core/environment/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 7574f2b13..4f0349705 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -250,7 +250,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) return err } - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete"}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) envs.mu.Unlock() // we trigger all cleanup hooks @@ -549,4 +549,4 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } } -} \ No newline at end of file +} From 7be604dc5f4b2da70bdd700a0d538b38ca1505c2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 24 Nov 2020 15:21:33 +0100 Subject: [PATCH 0678/2352] [occ] Dump incoming configuration payloads to file --- .../dummy-process/ControlledStateMachine.cxx | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx b/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx index 5a978b102..4b5e92914 100644 --- a/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx +++ b/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx @@ -47,6 +47,18 @@ int ControlledStateMachine::executeConfigure(const boost::property_tree::ptree& boost::property_tree::json_parser::write_json(ss, properties); printf("%s\n", ss.str().c_str()); + // build timestamp for output filename + std::time_t t = std::time(nullptr); + std::tm tm = *std::localtime(&t); + std::ostringstream oss; + oss << std::put_time(&tm, "%Y%m%d-%H%M"); + std::string timestamp(oss.str()); + + // dump configuration payload to file + std::ofstream out("/tmp/aliecs-dummyprocess-config-" + timestamp + ".json"); + out << ss.str(); + out.close(); + return RuntimeControlledObject::executeConfigure(properties); } From bb6cb2b3b3897479acb5d480c7b54432d7f15904 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 26 Nov 2020 11:37:14 +0100 Subject: [PATCH 0679/2352] [core] Add GetConfigLiquid/GetConfigPongo to evaluate these engines --- core/workflow/template/fields.go | 6 ++- core/workflow/template/stack.go | 83 +++++++++++++++++++++++++++----- go.mod | 5 +- go.sum | 10 ++++ 4 files changed, 90 insertions(+), 14 deletions(-) diff --git a/core/workflow/template/fields.go b/core/workflow/template/fields.go index 54c99152d..059edf5fb 100644 --- a/core/workflow/template/fields.go +++ b/core/workflow/template/fields.go @@ -190,7 +190,11 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS for k, v := range strOpStack { environment[k] = v } - environment["GetConfig"] = MakeGetConfigFunc(varStack) + + configAccessFuncs := MakeConfigAccessFuncs(varStack) + for k, v := range configAccessFuncs { + environment[k] = v + } for _, field := range fields { buf := new(bytes.Buffer) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index eac76e28f..6e6352cfc 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -35,28 +35,87 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/the" + "github.com/flosch/pongo2/v4" + "github.com/osteele/liquid" "github.com/sirupsen/logrus" ) type GetConfigFunc func(string) string +type ConfigAccessFuncs map[string]GetConfigFunc type ToPtreeFunc func(string, string) string -func MakeGetConfigFunc(varStack map[string]string) GetConfigFunc { - return func(path string) string { - payload, err := the.ConfSvc().GetComponentConfiguration(path) - if err != nil { - log.WithError(err). - WithField("path", path). - Warn("failed to get component configuration") - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } +func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { + return ConfigAccessFuncs{ + "GetConfig": func(path string) string { + payload, err := the.ConfSvc().GetComponentConfiguration(path) + if err != nil { + log.WithError(err). + WithField("path", path). + Warn("failed to get component configuration") + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } - fields := Fields{WrapPointer(&payload)} - err = fields.Execute(path, varStack, nil, make(map[string]texttemplate.Template)) - return payload + fields := Fields{WrapPointer(&payload)} + err = fields.Execute(path, varStack, nil, make(map[string]texttemplate.Template)) + log.Warn(payload) + return payload + }, + "GetConfigLiquid": func(path string) string { + payload, err := the.ConfSvc().GetComponentConfiguration(path) + if err != nil { + log.WithError(err). + WithField("path", path). + Warn("failed to get component configuration") + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + engine := liquid.NewEngine() + bindings := make(map[string]interface{}) + for k, v := range varStack { + bindings[k] = v + } + payload, liquidErr := engine.ParseAndRenderString(payload, bindings) + if liquidErr != nil { + log.WithError(liquidErr).Warn("template processing error") + } + + log.Warn(payload) + return payload + }, + "GetConfigPongo": func(path string) string { + payload, err := the.ConfSvc().GetComponentConfiguration(path) + if err != nil { + log.WithError(err). + WithField("path", path). + Warn("failed to get component configuration") + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + tpl, err := pongo2.FromString(payload) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + bindings := make(map[string]interface{}) + for k, v := range varStack { + bindings[k] = v + } + + // TODO add a custom pongo2.TemplateLoader for Consul here + // It should call confsvc.GetComponentConfiguration but without + // going through the template engine + payload, err = tpl.Execute(bindings) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + log.Warn(payload) + return payload + }, } } + func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload diff --git a/go.mod b/go.mod index 421f0d20a..cdc7b6192 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/denisbrodbeck/machineid v1.0.1 github.com/fatih/color v1.9.0 + github.com/flosch/pongo2/v4 v4.0.0 github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gdamore/tcell v1.3.0 github.com/gliderlabs/ssh v0.3.0 // indirect @@ -71,6 +72,8 @@ require ( github.com/onsi/ginkgo v1.12.2 github.com/onsi/gomega v1.10.1 github.com/osamingo/indigo v1.0.1 + github.com/osteele/liquid v1.2.4 + github.com/osteele/tuesday v1.0.3 // indirect github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect github.com/pkg/errors v0.9.1 // indirect @@ -104,8 +107,8 @@ require ( golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect google.golang.org/grpc v1.31.0 google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/ini.v1 v1.55.0 // indirect + gopkg.in/osteele/liquid.v1 v1.2.4 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 sigs.k8s.io/yaml v1.2.0 // indirect diff --git a/go.sum b/go.sum index 6532488cd..2e5d401b9 100644 --- a/go.sum +++ b/go.sum @@ -166,6 +166,9 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE= +github.com/flosch/pongo2/v4 v4.0.0 h1:6eZe8NSNxtTTGwXgJqqXiiLEDAj7CvkwiYrZFQRW6cQ= +github.com/flosch/pongo2/v4 v4.0.0/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= @@ -501,6 +504,10 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/osamingo/indigo v1.0.1 h1:zYzUDKDD4ihcz+8nz1HkZeKxn2Fff40UD/FuV0rXXQQ= github.com/osamingo/indigo v1.0.1/go.mod h1:P3iMtCzPHsVZfeO/XLHVgrm/fe454OsfnDoUYn/GTjw= +github.com/osteele/liquid v1.2.4 h1:ydm/FoHn/cStyN7Fpar4L/ClyRKc9rZ+Qzb+S3OMOT4= +github.com/osteele/liquid v1.2.4/go.mod h1:jhgMyQFVoV0grH2MKvpMbgxFSBezOoXUbgiwnYrKJ2c= +github.com/osteele/tuesday v1.0.3 h1:SrCmo6sWwSgnvs1bivmXLvD7Ko9+aJvvkmDjB5G4FTU= +github.com/osteele/tuesday v1.0.3/go.mod h1:pREKpE+L03UFuR+hiznj3q7j3qB1rUZ4XfKejwWFF2M= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -1020,6 +1027,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -1028,6 +1036,8 @@ gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/osteele/liquid.v1 v1.2.4 h1:OioNeCaVyWL1jRXzRqQ2vr4ISBbTgtnYsJeVlToLhBw= +gopkg.in/osteele/liquid.v1 v1.2.4/go.mod h1:9Bx5f04tf9SVwv3Tcx93dx3WH0EKWmE0Gjd6Dyoc5cs= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= From 80622aa911f219fb358be991398fc44d4745eeb6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 27 Nov 2020 11:00:35 +0100 Subject: [PATCH 0680/2352] [core] Print out varStack for debug purposes --- core/workflow/template/stack.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 6e6352cfc..37c60d59b 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -57,6 +57,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { fields := Fields{WrapPointer(&payload)} err = fields.Execute(path, varStack, nil, make(map[string]texttemplate.Template)) + log.Warn(varStack) log.Warn(payload) return payload }, @@ -79,6 +80,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { log.WithError(liquidErr).Warn("template processing error") } + log.Warn(varStack) log.Warn(payload) return payload }, @@ -109,6 +111,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } + log.Warn(varStack) log.Warn(payload) return payload }, From a58957a841ee1058b3ebff3abd956edb8f087e03 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 27 Nov 2020 16:41:26 +0100 Subject: [PATCH 0681/2352] [core] Fix StringWrapMap unmarshal occasionally breaking the var system --- common/gera/stringmap.go | 5 +++++ core/workflow/rolebase.go | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 31763cf38..5b3aa5055 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -100,6 +100,11 @@ func (w *StringWrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { theMap: m, parent: nil, } + } else { + *w = StringWrapMap{ + theMap: make(map[string]string), + parent: nil, + } } return err } diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 5020b2897..2de0d6185 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -175,7 +175,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) type _roleBase roleBase role := _roleBase{ Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), UserVars: gera.MakeStringMap(), Locals: make(map[string]string), status: SafeStatus{status:task.INACTIVE}, From e2818112c46b7ac8c33e5ae17c3d68fdcdccf19f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 27 Nov 2020 18:24:26 +0100 Subject: [PATCH 0682/2352] [core] Add utils.TimeTrack to be used with defer to measure exec time --- common/utils/utils.go | 7 +++++++ core/workflow/template/stack.go | 4 ++++ 2 files changed, 11 insertions(+) diff --git a/common/utils/utils.go b/common/utils/utils.go index db184e759..a0ec50c41 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -33,9 +33,16 @@ import ( "strings" "time" + "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" ) + +func TimeTrack(start time.Time, name string, logger *logrus.Entry) { + elapsed := time.Since(start) + logger.Debugf("%s took %s", name, elapsed) +} + func NewUnixTimestamp() string { // User for IL direct hook and scheduler.go return fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 37c60d59b..adceb80d6 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -31,6 +31,7 @@ import ( "strconv" "strings" texttemplate "text/template" + "time" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" @@ -47,6 +48,7 @@ type ToPtreeFunc func(string, string) string func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ "GetConfig": func(path string) string { + defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) payload, err := the.ConfSvc().GetComponentConfiguration(path) if err != nil { log.WithError(err). @@ -62,6 +64,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { return payload }, "GetConfigLiquid": func(path string) string { + defer utils.TimeTrack(time.Now(),"GetConfigLiquid", log.WithPrefix("template")) payload, err := the.ConfSvc().GetComponentConfiguration(path) if err != nil { log.WithError(err). @@ -85,6 +88,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { return payload }, "GetConfigPongo": func(path string) string { + defer utils.TimeTrack(time.Now(),"GetConfigPongo", log.WithPrefix("template")) payload, err := the.ConfSvc().GetComponentConfiguration(path) if err != nil { log.WithError(err). From 3afad5d578c66a18c6005212cde220a636b48cfd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 Nov 2020 03:05:08 +0100 Subject: [PATCH 0683/2352] [core] Add support for config template inclusion --- core/workflow/template/loader.go | 69 ++++++++++++++++++++++++++++++++ core/workflow/template/stack.go | 30 +++++++++----- 2 files changed, 89 insertions(+), 10 deletions(-) create mode 100644 core/workflow/template/loader.go diff --git a/core/workflow/template/loader.go b/core/workflow/template/loader.go new file mode 100644 index 000000000..5cc728996 --- /dev/null +++ b/core/workflow/template/loader.go @@ -0,0 +1,69 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package template + +import ( + "fmt" + "io" + "strings" + + "github.com/AliceO2Group/Control/core/the" +) + +// Implements pongo2.TemplateLoader to fetch included templates from Consul paths +type ConsulTemplateLoader struct { + basePath string +} + +func NewConsulTemplateLoader(basePath string) *ConsulTemplateLoader { + return &ConsulTemplateLoader{ + basePath: basePath, + } +} + +func (c *ConsulTemplateLoader) Abs(base, name string) string { + if strings.HasPrefix(name, "/") { + return name + } + if strings.HasPrefix(name, c.basePath) { + return name + } + + if c.basePath == "" { + return name + } + return c.basePath + "/" + name +} + +func (c *ConsulTemplateLoader) Get(path string) (io.Reader, error) { + payload, err := the.ConfSvc().GetComponentConfiguration(path) + if err != nil { + log.WithError(err). + WithField("path", path). + Warn("failed to include component configuration in template") + return strings.NewReader(fmt.Sprintf("{\"error\":\"%s\"}", err.Error())), err + } + return strings.NewReader(payload), nil +} diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index adceb80d6..96903ad23 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -89,15 +89,27 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { }, "GetConfigPongo": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfigPongo", log.WithPrefix("template")) - payload, err := the.ConfSvc().GetComponentConfiguration(path) - if err != nil { - log.WithError(err). - WithField("path", path). - Warn("failed to get component configuration") - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + + // We need to decompose the requested GetConfig path into prefix and suffix, + // with the last / as separator (any timestamp if present stays part of the + // suffix). + // This is done to allow internal references between template snippets + // within the same Consul directory. + indexOfLastSeparator := strings.LastIndex(path, "/") + var basePath string + shortPath := path + if indexOfLastSeparator != -1 { + basePath = path[:indexOfLastSeparator] + shortPath = path[indexOfLastSeparator+1:] } - tpl, err := pongo2.FromString(payload) + // We declare a TemplateSet, with a custom TemplateLoader. + // Our ConsulTemplateLoader takes control of the FromFile code path + // in pongo2, effectively adding support for Consul as file-like + // backend. + tplSet := pongo2.NewSet("", NewConsulTemplateLoader(basePath)) + tpl, err := tplSet.FromFile(shortPath) + if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } @@ -107,9 +119,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { bindings[k] = v } - // TODO add a custom pongo2.TemplateLoader for Consul here - // It should call confsvc.GetComponentConfiguration but without - // going through the template engine + var payload string payload, err = tpl.Execute(bindings) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) From d1d9001d3adeebb4e4393ec02d219c9fa863bc7c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 Nov 2020 15:34:27 +0100 Subject: [PATCH 0684/2352] [core] Add support for RUNTYPE and rolename in config paths --- configuration/componentcfg/componentcfg.go | 111 +++++++++++++++++---- core/confsys/service.go | 45 +++------ 2 files changed, 106 insertions(+), 50 deletions(-) diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index 6058c9dca..9606ddcdd 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -37,14 +37,95 @@ const ( ConfigComponentsPath = "o2/components/" ) +const( + SEPARATOR = "/" + SEPARATOR_RUNE = '/' +) + var ( - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + // component /RUNTYPE /rolename /entry @timestamp + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) ) +type Path struct { + Component string + Flavor string + Rolename string + EntryKey string + Timestamp string +} + +func NewPath(path string) (p *Path, err error) { + p = &Path{ + Component: "", + Flavor: "", + Rolename: "", + EntryKey: "", + Timestamp: "", + } + if IsInputCompEntryTsValid(path) { + if strings.Contains(path, "@") { + // coconut conf show component/FLAVOR/rolename/entry@timestamp + arg := strings.Replace(path, "@", SEPARATOR, 1) + params := strings.Split(arg, SEPARATOR) + p.Component = params[0] + p.Flavor = params[1] + p.Rolename = params[2] + p.EntryKey = params[3] + p.Timestamp = params[4] + } else if strings.Contains(path, SEPARATOR) { + // coconut conf show component/FLAVOR/rolename/entry + params := strings.Split(path, SEPARATOR) + p.Component = params[0] + p.Flavor = params[1] + p.Rolename = params[2] + p.EntryKey = params[3] + // and if we received a raw path (with / instead of @ before timestamp): + if len(params) > 4 && len(params[4]) > 0 { + p.Timestamp = params[4] + } + } + } else { + err = errors.New("bad component configuration key format") + return + } + + return p, nil +} + +func (p *Path) Path() string { + path := p.WithoutTimestamp() + if len(p.Timestamp) > 0 { + return path + "@" + p.Timestamp + } + return path +} + +func (p *Path) Raw() string { + path := p.WithoutTimestamp() + if len(p.Timestamp) > 0 { + return path + SEPARATOR + p.Timestamp + } + return path +} + +func (p *Path) WithoutTimestamp() string { + return p.Component + SEPARATOR + p.Flavor + SEPARATOR + p.Rolename + SEPARATOR + p.EntryKey +} + +func (p *Path) AbsoluteRaw() string { + return ConfigComponentsPath + p.Raw() +} + +func (p *Path) AbsoluteWithoutTimestamp() string { + return ConfigComponentsPath + p.WithoutTimestamp() +} + func IsInputCompEntryTsValid(input string) bool { return inputFullRegex.MatchString(input) } +// Checks whether the input string is a valid Consul path element on its own func IsInputSingleValidWord(input string) bool { return !strings.Contains(input, "/") && !strings.Contains(input, "@") } @@ -61,8 +142,8 @@ func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ // Method to return the latest timestamp for a specified component & entry // If no keys were passed an error and code exit 3 will be returned -func GetLatestTimestamp(keys []string, component string, entry string)(timestamp string, err error) { - keyPrefix := ConfigComponentsPath + component + "/" + entry +func GetLatestTimestamp(keys []string, p *Path)(timestamp string, err error) { + keyPrefix := p.AbsoluteWithoutTimestamp() if len(keys) == 0 { err = errors.New("no keys found") return "", err @@ -83,21 +164,7 @@ func GetLatestTimestamp(keys []string, component string, entry string)(timestamp return strconv.FormatUint(maxTimeStamp, 10), nil } -// Method to split component, entry and timestamp when being passed a key from consul -// e.g. of key o2/components/quality-control/cru-demo/12345678 -func GetComponentEntryTimestampFromConsul(key string)(string, string, string) { - key = strings.TrimPrefix(key, ConfigComponentsPath) - key = strings.TrimPrefix(key, "/'") - key = strings.TrimSuffix(key, "/") - elements := strings.Split(key, "/") - if len(elements) == 3 { - return elements[0], elements[1], elements[2] - } else { - return elements[0], elements[1], "unversioned" - } -} - - +// keys must be a slice containing all the full keys in /o2/components func GetComponentsMapFromKeysList(keys []string) map[string]bool { var componentsMap = make(map[string]bool) for _,value := range keys { @@ -108,13 +175,15 @@ func GetComponentsMapFromKeysList(keys []string) map[string]bool { return componentsMap } -func GetEntriesMapOfComponentFromKeysList(component string, keys []string) map[string]bool { +func GetEntriesMapOfComponentFromKeysList(component string, runtype string, rolename string, keys []string) map[string]bool { var entriesMap = make(map[string]bool) for _,value := range keys { value := strings.TrimPrefix(value, ConfigComponentsPath) parts := strings.Split(value, "/" ) - if parts[0] == component { - entriesMap[parts[1]] = true + if parts[0] == component && + parts[1] == runtype && + parts[2] == rolename { + entriesMap[parts[3]] = true } } return entriesMap diff --git a/core/confsys/service.go b/core/confsys/service.go index 38e06c5df..d2698cdba 100644 --- a/core/confsys/service.go +++ b/core/confsys/service.go @@ -26,7 +26,6 @@ package confsys import ( "encoding/json" - "errors" "io/ioutil" "net/url" "os" @@ -91,7 +90,7 @@ type Service struct { */ func formatKey(key string) (consulKey string) { // Trim leading slashes - consulKey = strings.TrimLeft(key, "/") + consulKey = strings.TrimLeft(key, componentcfg.SEPARATOR) return } @@ -305,47 +304,35 @@ func (s *Service) GetReposPath() string { } func (s *Service) GetComponentConfiguration(path string) (payload string, err error) { - var key, component, entry, timestamp string - if componentcfg.IsInputCompEntryTsValid(path) { - if strings.Contains(path, "@") { - // coconut conf show component/entry@timestamp - arg := strings.Replace(path, "@", "/", 1) - params := strings.Split(arg, "/") - component = params[0] - entry = params[1] - timestamp = params[2] - } else if strings.Contains(path, "/") { - // coconut conf show component/entry - params := strings.Split(path, "/") - component = params[0] - entry = params[1] - } - } else { - err = errors.New("bad component configuration key format") + var p *componentcfg.Path + p, err = componentcfg.NewPath(path) + if err != nil { return } - if len(timestamp) == 0 { - keyPrefix := componentcfg.ConfigComponentsPath + component + "/" + entry + var timestamp string + + if len(p.Timestamp) == 0 { + keyPrefix := p.AbsoluteWithoutTimestamp() var keys []string keys, err = s.src.GetKeysByPrefix(keyPrefix) if err != nil { return } - timestamp, err = componentcfg.GetLatestTimestamp(keys, component, entry) + timestamp, err = componentcfg.GetLatestTimestamp(keys, p) if err != nil { return } } - key = componentcfg.ConfigComponentsPath + component + "/" + entry + "/" + timestamp - if exists, _ := s.src.Exists(key); exists && len(timestamp) > 0 { - payload, err = s.src.Get(key) - log.WithFields(logrus.Fields{"key": key, "value": payload}).Trace("getting key") + absKey := p.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp + if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { + payload, err = s.src.Get(absKey) + log.WithFields(logrus.Fields{"key": absKey, "value": payload}).Trace("getting key") } else { // falling back to timestampless configuration - key = componentcfg.ConfigComponentsPath + component + "/" + entry - payload, err = s.src.Get(key) - log.WithFields(logrus.Fields{"key": key, "value": payload}).Trace("getting key") + absKey = p.AbsoluteWithoutTimestamp() + payload, err = s.src.Get(absKey) + log.WithFields(logrus.Fields{"key": absKey, "value": payload}).Trace("getting key") } return } From 3bd6bb69577ea5f885e10953dfb8fcd02de8c936 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 Nov 2020 15:35:00 +0100 Subject: [PATCH 0685/2352] [coconut] Initial support for RUNTYPE/rolename in config paths --- coconut/configuration/configuration.go | 225 ++++++++++++--------- coconut/configuration/configurationutil.go | 37 ++-- core/workflow/template/stack.go | 39 +--- 3 files changed, 152 insertions(+), 149 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 75ec59b47..8aec58000 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2018-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -55,13 +55,13 @@ type RunFunc func(*cobra.Command, []string) type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) const ( - nonZero = iota - invalidArgs = iota // Provided args by the user are invalid - invalidArgsErrMsg = "component and entry names cannot contain `/ or `@`" - connectionError = iota // Source connection error - emptyData = iota // Source retrieved empty data - emptyDataErrMsg = "no data was found" - logicError = iota // Logic/Output error + EC_ZERO = iota + EC_INVALID_ARGS = iota // Provided args by the user are invalid + EC_INVALID_ARGS_MSG = "component and entry names cannot contain `/` or `@`" + EC_CONNECTION_ERROR = iota // Source connection error + EC_EMPTY_DATA = iota // Source retrieved empty data + EC_EMPTY_DATA_MSG = "no data was found" + EC_LOGIC_ERROR = iota // Logic/Output error ) func WrapCall(call ConfigurationCall) RunFunc { @@ -85,7 +85,7 @@ func WrapCall(call ConfigurationCall) RunFunc { log.WithPrefix(cmd.Use). WithFields(fields). Fatal("cannot query endpoint") - os.Exit(connectionError) + os.Exit(EC_CONNECTION_ERROR) } var out strings.Builder @@ -110,18 +110,18 @@ func WrapCall(call ConfigurationCall) RunFunc { func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) - return err, invalidArgs + return err, EC_INVALID_ARGS } key := args[0] data, err := cfg.GetRecursive(key) if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } format, err := cmd.Flags().GetString("format") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } var output []byte @@ -135,38 +135,38 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) - return err, logicError + return err, EC_LOGIC_ERROR } _, _ = fmt.Fprintln(o, string(output)) - return nil, nonZero + return nil, EC_ZERO } func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { keyPrefix := componentcfg.ConfigComponentsPath useTimestamp := false if len(args) > 1 { - return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , invalidArgs + return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , EC_INVALID_ARGS } else { useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } if len(args) == 1 { if !componentcfg.IsInputSingleValidWord(args[0]) { - return errors.New(invalidArgsErrMsg), invalidArgs + return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } else { keyPrefix += args[0] + "/" } } else if len(args) == 0 && useTimestamp { - return errors.New("to use flag `-t / --timestamp` please provide component name"), invalidArgs + return errors.New("to use flag `-t / --timestamp` please provide component name"), EC_INVALID_ARGS } } keys, err := cfg.GetKeysByPrefix(keyPrefix) if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } components, err, code := getListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) @@ -176,22 +176,23 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o output, err := formatListOutput(cmd, components) if err != nil { - return err, logicError + return err, EC_LOGIC_ERROR } _, _ = fmt.Fprintln(o, string(output)) - return nil, nonZero + return nil, EC_ZERO } func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - var key, component, entry, timestamp string + var timestamp string + var p = &componentcfg.Path{} if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), invalidArgs + return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), EC_INVALID_ARGS } timestamp, err = cmd.Flags().GetString("timestamp") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } switch len(args) { @@ -200,120 +201,135 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if strings.Contains(args[0], "@") { if timestamp != "" { err = errors.New("flag `-t / --timestamp` must not be provided when using format /@") - return err, invalidArgs + return err, EC_INVALID_ARGS } // coconut conf show component/entry@timestamp - arg := strings.Replace(args[0], "@", "/", 1) - params := strings.Split(arg, "/") - component = params[0] - entry = params[1] - timestamp = params[2] + p, err = componentcfg.NewPath(args[0]) + if err != nil { + return err, EC_INVALID_ARGS + } + timestamp = p.Timestamp } else if strings.Contains(args[0], "/") { // coconut conf show component/entry - params := strings.Split(args[0], "/") - component = params[0] - entry = params[1] + p, err = componentcfg.NewPath(args[0]) + if err != nil { + return err, EC_INVALID_ARGS + } + if timestamp == "" { + timestamp = p.Timestamp + } } } else { // coconut conf show component || coconut conf show component@timestamp - return errors.New("please provide entry name"), invalidArgs + return errors.New("please provide entry name"), EC_INVALID_ARGS } case 2: if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { - return errors.New(invalidArgsErrMsg), invalidArgs + return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } else { - component = args[0] - entry = args[1] + p.Component = args[0] + p.EntryKey = args[1] + p.Flavor = "ANY" + p.Rolename = "any" } } var cfgPayload string if timestamp == "" { - keyPrefix := componentcfg.ConfigComponentsPath + component + "/" + entry + keyPrefix := p.AbsoluteWithoutTimestamp() keys, err := cfg.GetKeysByPrefix(keyPrefix) if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } - timestamp, err = componentcfg.GetLatestTimestamp(keys, component , entry) + timestamp, err = componentcfg.GetLatestTimestamp(keys, p) if err != nil { - return err, emptyData + return err, EC_EMPTY_DATA } } - key = componentcfg.ConfigComponentsPath + component + "/" + entry + + fullKeyToQuery := p.AbsoluteWithoutTimestamp() if timestamp != "0" { //versioned entry - key += "/" + timestamp + fullKeyToQuery += componentcfg.SEPARATOR + timestamp } - cfgPayload, err = cfg.Get(key) + cfgPayload, err = cfg.Get(fullKeyToQuery) if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } if cfgPayload == "" { - return errors.New(emptyDataErrMsg), emptyData + return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA } _, _ = fmt.Fprintln(o, cfgPayload) - return nil, nonZero + return nil, EC_ZERO } func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o io.Writer)(err error, code int) { - var key, component, entry string + p := &componentcfg.Path{} if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), invalidArgs + return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), EC_INVALID_ARGS } switch len(args) { case 1: if componentcfg.IsInputSingleValidWord(args[0]) { - component = args[0] - entry = "" + p.Component = args[0] } else if componentcfg.IsInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ - splitCom := strings.Split(args[0], "/") - component = splitCom[0] - entry = splitCom[1] + p, err = componentcfg.NewPath(args[0]) + if err != nil { + return err, EC_INVALID_ARGS + } } else { - return errors.New(invalidArgsErrMsg), invalidArgs + return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } case 2: if componentcfg.IsInputSingleValidWord(args[0]) && componentcfg.IsInputSingleValidWord(args[1]) { - component = args[0] - entry = args[1] + p.Component = args[0] + p.EntryKey = args[1] + p.Flavor = "ANY" + p.Rolename = "any" } else { - return errors.New(invalidArgsErrMsg), invalidArgs + return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } } - key = componentcfg.ConfigComponentsPath + component + "/" + entry + fullKeyToQuery := p.AbsoluteWithoutTimestamp() var keys sort.StringSlice - keys , err = cfg.GetKeysByPrefix(key) + keys , err = cfg.GetKeysByPrefix(fullKeyToQuery) if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } if len(keys) == 0 { - return errors.New(emptyDataErrMsg), emptyData + return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA } else { - if entry != "" { + if p.EntryKey != "" { sort.Sort(sort.Reverse(keys)) drawTableHistoryConfigs([]string{}, keys, 0, o) } else { maxLen := getMaxLenOfKey(keys) var currentKeys sort.StringSlice - _, entry, _ := componentcfg.GetComponentEntryTimestampFromConsul(keys[0]) + + entry := p.EntryKey for _, value := range keys { - _, currentEntry, _ := componentcfg.GetComponentEntryTimestampFromConsul(value) - if currentEntry == entry { + var thisPath *componentcfg.Path + thisPath, err = componentcfg.NewPath(value) + if err != nil { + continue + } + + if thisPath.EntryKey == entry { currentKeys = append(currentKeys, value) } else { _, _ = fmt.Fprintln(o, "- "+entry) sort.Sort(sort.Reverse(currentKeys)) //sort in reverse of timestamps - drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) + drawTableHistoryConfigs([]string{}, currentKeys, maxLen, o) currentKeys = []string{value} - entry = currentEntry + entry = thisPath.EntryKey } } _, _ = fmt.Fprintln(o, "- "+entry) - drawTableHistoryConfigs([]string{}, currentKeys,maxLen, o) + drawTableHistoryConfigs([]string{}, currentKeys, maxLen, o) } } return nil, 0 @@ -322,37 +338,41 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { useNewComponent, err := cmd.Flags().GetBool("new-component") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } useExtension, err := cmd.Flags().GetString("format") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } useNoVersion, err := cmd.Flags().GetBool("no-versioning") if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } // Parse and Format input arguments - var component, entry, filePath string + var filePath string + var p = &componentcfg.Path{} + if len(args) < 2 || len(args) > 3 { - return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), invalidArgs + return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), EC_INVALID_ARGS } else { switch len(args) { case 2: - component, entry, err = getComponentEntryFromUserInput(args[0]) + p, err = componentcfg.NewPath(args[0]) filePath = args[1] case 3: if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { - err = errors.New(invalidArgsErrMsg) + err = errors.New(EC_INVALID_ARGS_MSG) } else { - component = args[0] - entry = args[1] + p.Component = args[0] + p.EntryKey = args[1] + p.Rolename = "any" + p.Flavor = "ANY" filePath = args[2] } } if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } } @@ -364,68 +384,71 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, if !isFileExtensionValid(extension) && useExtension == "" { return errors.New("supported file extensions: JSON, YAML, INI or TOML." + - " To force a specific configuration format, see flag --format/-f" ), invalidArgs + " To force a specific configuration format, see flag --format/-f" ), EC_INVALID_ARGS } else if useExtension != "" { extension = strings.ToUpper(useExtension) } keys, err := cfg.GetKeysByPrefix("") if err != nil { - return err, connectionError + return err, EC_CONNECTION_ERROR } components := componentcfg.GetComponentsMapFromKeysList(keys) - componentExist := components[component] - if !componentExist && !useNewComponent { + componentExist := components[p.Component] + if !componentExist && !useNewComponent { componentMsg := "" for key := range components { componentMsg += "\n- " + key } - return errors.New("component " + component + " does not exist. " + + return errors.New("component " + p.Component + " does not exist. " + "Available components in configuration database:" + componentMsg + "\nTo create a new component, see flag --new-component/-n" ), - invalidArgs + EC_INVALID_ARGS } if componentExist && useNewComponent { - return errors.New("invalid use of flag --new-component/-n: component " + red(component) + " already exists"), invalidArgs + return errors.New("invalid use of flag --new-component/-n: component " + red(p.Component) + " already exists"), EC_INVALID_ARGS } entryExists := false if !useNewComponent { - entriesMap := componentcfg.GetEntriesMapOfComponentFromKeysList(component, keys) - entryExists = entriesMap[entry] + entriesMap := componentcfg.GetEntriesMapOfComponentFromKeysList(p.Component, p.Flavor, p.Rolename, keys) + entryExists = entriesMap[p.EntryKey] } fileContent, err := getFileContent(filePath) if err != nil { - return err, logicError + return err, EC_LOGIC_ERROR } // Temporary workaround to allow no-versioning - latestTimestamp, err := componentcfg.GetLatestTimestamp(keys, component, entry) + latestTimestamp, err := componentcfg.GetLatestTimestamp(keys, p) if err != nil { - return err, invalidArgs + return err, EC_INVALID_ARGS } if entryExists { if (latestTimestamp != "0" && latestTimestamp != "") && useNoVersion { // If a timestamp already exists in the entry specified by the user, than it cannot be used - return errors.New("Specified entry: '" + entry + "' already contains versioned items. Please " + - "specify a different entry name"), invalidArgs + return errors.New("Specified entry: '" + p.EntryKey + "' already contains versioned items. Please " + + "specify a different entry name"), EC_INVALID_ARGS } if (latestTimestamp == "0" || latestTimestamp == "") && !useNoVersion { // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown - return errors.New("Specified entry: '" + entry + "' already contains un-versioned items. Please " + - "specify a different entry name"), invalidArgs + return errors.New("Specified entry: '" + p.EntryKey + "' already contains un-versioned items. Please " + + "specify a different entry name"), EC_INVALID_ARGS } } timestamp := time.Now().Unix() - fullKey := componentcfg.ConfigComponentsPath + component + "/" + entry - toPrintKey := red(component) + "/" + blue(entry) + fullKey := p.AbsoluteWithoutTimestamp() + toPrintKey := red(p.Component) + componentcfg.SEPARATOR + + blue(p.Flavor) + componentcfg.SEPARATOR + + red(p.Rolename) + componentcfg.SEPARATOR + + blue(p.EntryKey) if !useNoVersion { - fullKey += "/" + strconv.FormatInt(timestamp, 10) + fullKey += componentcfg.SEPARATOR + strconv.FormatInt(timestamp, 10) toPrintKey += "@" + strconv.FormatInt(timestamp, 10) } @@ -436,12 +459,12 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, userMsg := "" if !componentExist { - userMsg = "New component created: " + red(component) + "\n" + userMsg = "New component created: " + red(p.Component) + "\n" } if !entryExists { - userMsg += "New entry created: " + blue(entry) + "\n" + userMsg += "New entry created: " + blue(p.EntryKey) + "\n" } else { - userMsg += "Entry updated: " + blue(entry) + "\n" + userMsg += "Entry updated: " + blue(p.EntryKey) + "\n" } userMsg += "Configuration imported: " + toPrintKey diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index e58f70d57..c017f320b 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -3,6 +3,7 @@ * * Copyright 2020 CERN and copyright holders of ALICE O². * Author: George Raduta + * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -43,7 +44,8 @@ import ( var( blue = color.New(color.FgHiBlue).SprintFunc() red = color.New(color.FgHiRed).SprintFunc() - inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-]+)(\/[a-z-A-Z0-9-]+)$`) + // component /RUNTYPE /rolename /entry + inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) ) @@ -51,20 +53,11 @@ func isInputCompEntryValid(input string) bool { return inputComponentEntryRegex.MatchString(input) } -func getComponentEntryFromUserInput(input string) (string, string, error) { - if isInputCompEntryValid(input) { - splitCom := strings.Split(input, "/") - return splitCom[0], splitCom[1], nil - } else { - return "", "", errors.New(invalidArgsErrMsg) - } -} - // Method to return a list of components, entries or entries with latest timestamp // If no keys were passed an error and code exit 3 will be returned func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { if len(keys) == 0 { - return []string{}, errors.New("no keys found"), emptyData + return []string{}, errors.New("no keys found"), EC_EMPTY_DATA } var components []string @@ -76,7 +69,7 @@ func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use componentTimestamp := componentParts[len(componentParts) - 1] if len(componentParts) == 1 { - componentTimestamp = "unversioned" + componentTimestamp = "" } if useTimestamp { componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) @@ -97,7 +90,7 @@ func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, use components = append(components, key) } } - return components, nil, nonZero + return components, nil, EC_ZERO } func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { @@ -109,15 +102,21 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W table.SetColMinWidth(0, max) for _, value := range history { - component, entry, timestamp := componentcfg.GetComponentEntryTimestampFromConsul(value) - prettyTimestamp, err := componentcfg.GetTimestampInFormat(timestamp, time.RFC822) + p, err := componentcfg.NewPath(value) + if err != nil { + continue + } + prettyTimestamp, err := componentcfg.GetTimestampInFormat(p.Timestamp, time.RFC822) if err != nil { - prettyTimestamp = timestamp + prettyTimestamp = p.Timestamp } - if prettyTimestamp == "unversioned" { - prettyTimestamp = red(prettyTimestamp) + if prettyTimestamp == "" { + prettyTimestamp = red("unversioned") } - configName := red(component) + "/" + blue(entry) + "@" + timestamp + configName := red(p.Component) + componentcfg.SEPARATOR + + blue(p.Flavor) + componentcfg.SEPARATOR + + red(p.Rolename) + componentcfg.SEPARATOR + + blue(p.EntryKey) + "@" + p.Timestamp table.Append([]string{configName, prettyTimestamp}) } table.Render() diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 96903ad23..381398a68 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -37,7 +37,6 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/the" "github.com/flosch/pongo2/v4" - "github.com/osteele/liquid" "github.com/sirupsen/logrus" ) @@ -47,8 +46,8 @@ type ToPtreeFunc func(string, string) string func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ - "GetConfig": func(path string) string { - defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) + "GetConfigLegacy": func(path string) string { + defer utils.TimeTrack(time.Now(),"GetConfigLegacy", log.WithPrefix("template")) payload, err := the.ConfSvc().GetComponentConfiguration(path) if err != nil { log.WithError(err). @@ -63,32 +62,8 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { log.Warn(payload) return payload }, - "GetConfigLiquid": func(path string) string { - defer utils.TimeTrack(time.Now(),"GetConfigLiquid", log.WithPrefix("template")) - payload, err := the.ConfSvc().GetComponentConfiguration(path) - if err != nil { - log.WithError(err). - WithField("path", path). - Warn("failed to get component configuration") - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - engine := liquid.NewEngine() - bindings := make(map[string]interface{}) - for k, v := range varStack { - bindings[k] = v - } - payload, liquidErr := engine.ParseAndRenderString(payload, bindings) - if liquidErr != nil { - log.WithError(liquidErr).Warn("template processing error") - } - - log.Warn(varStack) - log.Warn(payload) - return payload - }, - "GetConfigPongo": func(path string) string { - defer utils.TimeTrack(time.Now(),"GetConfigPongo", log.WithPrefix("template")) + "GetConfig": func(path string) string { + defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) // We need to decompose the requested GetConfig path into prefix and suffix, // with the last / as separator (any timestamp if present stays part of the @@ -119,6 +94,12 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { bindings[k] = v } + // Add custom functions to bindings: + funcMap := MakeStrOperationFuncMap() + for k, v := range funcMap { + bindings[k] = v + } + var payload string payload, err = tpl.Execute(bindings) if err != nil { From f2645f8841b98dd99960181f89d12c7df73e5fd0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Dec 2020 14:15:13 +0100 Subject: [PATCH 0686/2352] [occ] Print out OCC version from dummyprocess --- occ/CMakeLists.txt | 2 +- occ/occlib/examples/dummy-process/ControlledStateMachine.cxx | 2 ++ occ/occlib/examples/dummy-process/main.cxx | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 979516113..a802e3317 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -161,7 +161,7 @@ if (${FairMQ_FOUND}) list(APPEND BOOST_COMPONENTS ${FairMQ_Boost_COMPONENTS}) endif() -find_package(Boost 1.68 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) +find_package(Boost 1.74 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) # Protobuf set(protobuf_MODULE_COMPATIBLE TRUE) diff --git a/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx b/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx index 4b5e92914..22c82f6a1 100644 --- a/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx +++ b/occ/occlib/examples/dummy-process/ControlledStateMachine.cxx @@ -45,6 +45,8 @@ int ControlledStateMachine::executeConfigure(const boost::property_tree::ptree& printf("received runtime configuration:\n"); std::stringstream ss; boost::property_tree::json_parser::write_json(ss, properties); + // NOTE: boost::ptree::write_json always escapes forward slashes, resulting in \/\/ being written to file. + // This is unusual but JSON spec compliant. printf("%s\n", ss.str().c_str()); // build timestamp for output filename diff --git a/occ/occlib/examples/dummy-process/main.cxx b/occ/occlib/examples/dummy-process/main.cxx index 4230fc797..c2ac825e4 100644 --- a/occ/occlib/examples/dummy-process/main.cxx +++ b/occ/occlib/examples/dummy-process/main.cxx @@ -28,6 +28,7 @@ #include #include +#include "OccVersion.h" namespace po = boost::program_options; using o2::configuration::ConfigurationFactory; @@ -66,6 +67,8 @@ int main(int argc, char* argv[]) { // However, the gRPC server only accepts requests after the the machine state // has already become t_State::standby. + printf("AliECS OCC test task v%s\n", OCC_VERSION); + // Block until t_State::done is reached: occ.wait(); From b425d0b964586e144272d692451aba506099fa68 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Dec 2020 10:34:08 +0100 Subject: [PATCH 0687/2352] [core] Add NewID function to workflow template environment --- core/workflow/template/stack.go | 3 +++ go.mod | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/workflow/template/stack.go b/core/workflow/template/stack.go index 381398a68..2e14a6f72 100644 --- a/core/workflow/template/stack.go +++ b/core/workflow/template/stack.go @@ -183,5 +183,8 @@ func MakeStrOperationFuncMap() map[string]interface{} { out = string(bytes) return }, + "NewID": func(in interface{}) (out string) { + return uid.New().String() + }, } } \ No newline at end of file diff --git a/go.mod b/go.mod index cdc7b6192..7b2c940ed 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/onsi/ginkgo v1.12.2 github.com/onsi/gomega v1.10.1 github.com/osamingo/indigo v1.0.1 - github.com/osteele/liquid v1.2.4 + github.com/osteele/liquid v1.2.4 // indirect github.com/osteele/tuesday v1.0.3 // indirect github.com/pborman/uuid v1.2.0 github.com/pelletier/go-toml v1.6.0 // indirect From e9247694260320dd65ddcbd73302907d3f8cc068 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Dec 2020 14:03:37 +0100 Subject: [PATCH 0688/2352] [coconut] Improve coconut conf output --- coconut/configuration/configuration.go | 2 +- coconut/configuration/configurationutil.go | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 8aec58000..c708972f6 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -268,7 +268,7 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o p := &componentcfg.Path{} if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), EC_INVALID_ARGS + return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS } switch len(args) { case 1: diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index c017f320b..e01d825dc 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -30,6 +30,7 @@ import ( "github.com/fatih/color" "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" + "bytes" "errors" "regexp" "time" @@ -137,6 +138,7 @@ func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, if err != nil { return } + parsedOutput = bytes.TrimSuffix(parsedOutput, []byte("\n")) return parsedOutput, nil } From e479dd871255df6c6fd02c51db77224e9a7cdc2c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Dec 2020 15:40:30 +0100 Subject: [PATCH 0689/2352] [coconut] Fix coconut conf import behavior --- coconut/configuration/configuration.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index c708972f6..3d42b3479 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -143,12 +143,14 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return nil, EC_ZERO } +// coconut conf list func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { keyPrefix := componentcfg.ConfigComponentsPath useTimestamp := false if len(args) > 1 { return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , EC_INVALID_ARGS } else { + // case with 0 or 1 args (+ optionally timestamp) useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { return err, EC_INVALID_ARGS @@ -353,14 +355,17 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, var filePath string var p = &componentcfg.Path{} - if len(args) < 2 || len(args) > 3 { + if len(args) < 2 || len(args) > 3 { return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), EC_INVALID_ARGS } else { switch len(args) { - case 2: + case 2: // coconut conf import component/RUNTYPE/role/entry filepath p, err = componentcfg.NewPath(args[0]) + if err != nil { + return err, EC_INVALID_ARGS + } filePath = args[1] - case 3: + case 3: // coconut conf import component entry filepath # ANY/any assumed if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { err = errors.New(EC_INVALID_ARGS_MSG) } else { @@ -395,6 +400,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, } components := componentcfg.GetComponentsMapFromKeysList(keys) + componentExist := components[p.Component] if !componentExist && !useNewComponent { componentMsg := "" From cb14cf7c7787d17eda36f8fa7dcf4653b2ac56f1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Dec 2020 17:28:28 +0100 Subject: [PATCH 0690/2352] [configuration] Improve Get, GetKeysByPrefix; add IsDir * Get now returns an error on nil response for Consul path * GetKeysByPrefix now ensures to only return the keys inside that folder * IsDir is a new method that returns true if a path is a folder --- configuration/consulsource.go | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/configuration/consulsource.go b/configuration/consulsource.go index b995d535c..e6812a2be 100644 --- a/configuration/consulsource.go +++ b/configuration/consulsource.go @@ -27,6 +27,7 @@ package configuration import ( "github.com/hashicorp/consul/api" "errors" + "fmt" "strconv" "strings" "gopkg.in/yaml.v3" @@ -82,20 +83,28 @@ func (cc *ConsulSource) GetNextUInt32(key string) (value uint32, err error) { } func (cc *ConsulSource) Get(key string) (value string, err error) { - kvp, _, err := cc.kv.Get(formatKey(key), nil) + var kvp *api.KVPair + kvp, _, err = cc.kv.Get(formatKey(key), nil) if err != nil { return } if kvp != nil { value = string(kvp.Value[:]) } else { - value = "" + return "", fmt.Errorf("nil response for key %s", key) } return } func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { - keyPrefix = formatKey(keyPrefix) + // An empty keyPrefix is ok by definition. + // If it's non-empty, we must ensure its sanity. + if len(keyPrefix) > 0 { + keyPrefix = formatKey(keyPrefix) + // We must ensure that the path ends with a separator, otherwise we also + // get keys in keyPrefix/.. that start with the name of the key. + keyPrefix = strings.TrimSuffix(keyPrefix, "/") + "/" + } keys, _, err = cc.kv.Keys(keyPrefix, "", nil) return } @@ -147,6 +156,18 @@ func (cc *ConsulSource) Exists(key string) (exists bool, err error) { return } +func (cc *ConsulSource) IsDir(key string) (isDir bool) { + kvp, _, err := cc.kv.Get(formatKey(key), nil) + if err != nil { + return false + } + isDir = kvp == nil + if kvp != nil { + isDir = strings.HasSuffix(kvp.Key, "/") + } + return +} + func formatKey(key string) (consulKey string) { // Trim leading slashes consulKey = strings.TrimLeft(key, "/") From fdcc6b98aee0de8597c0e57e7c63d3cafba69e93 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 17:37:42 +0100 Subject: [PATCH 0691/2352] [coconut] Update coconut conf show for new Consul structure --- coconut/configuration/configuration.go | 50 ++++++++++++++++---------- 1 file changed, 31 insertions(+), 19 deletions(-) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 3d42b3479..861c91e49 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -189,7 +189,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o var p = &componentcfg.Path{} if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts between 0 and 3 arg(s), but received %d", len(args))), EC_INVALID_ARGS + return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS } timestamp, err = cmd.Flags().GetString("timestamp") @@ -197,22 +197,22 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, EC_INVALID_ARGS } - switch len(args) { - case 1: + switch len(args) { + case 1: // coconut conf show component/RUNTYPE/role/entry[@timestamp] if componentcfg.IsInputCompEntryTsValid(args[0] ) { if strings.Contains(args[0], "@") { + // coconut conf show c/R/r/e@timestamp if timestamp != "" { - err = errors.New("flag `-t / --timestamp` must not be provided when using format /@") + err = errors.New("flag `-t / --timestamp` must not be provided when using format ///@") return err, EC_INVALID_ARGS } - // coconut conf show component/entry@timestamp p, err = componentcfg.NewPath(args[0]) if err != nil { return err, EC_INVALID_ARGS } timestamp = p.Timestamp } else if strings.Contains(args[0], "/") { - // coconut conf show component/entry + // coconut conf show c/R/r/e # no timestamp p, err = componentcfg.NewPath(args[0]) if err != nil { return err, EC_INVALID_ARGS @@ -225,7 +225,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o // coconut conf show component || coconut conf show component@timestamp return errors.New("please provide entry name"), EC_INVALID_ARGS } - case 2: + case 2: // coconut conf show component entry if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } else { @@ -237,23 +237,35 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } var cfgPayload string + fullKeyToQuery := p.AbsoluteWithoutTimestamp() + if timestamp == "" { + // No timestamp was passed, either via -t or @ + // We need to ascertain whether the required entry is versioned + // or unversioned. keyPrefix := p.AbsoluteWithoutTimestamp() - keys, err := cfg.GetKeysByPrefix(keyPrefix) - if err != nil { - return err, EC_CONNECTION_ERROR - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, p) - if err != nil { - return err, EC_EMPTY_DATA + if cfg.IsDir(keyPrefix) { + // The requested path is a Consul folder, so we should + // look inside to find the latest timestamp. + keys, err := cfg.GetKeysByPrefix(keyPrefix) + if err != nil { + return err, EC_CONNECTION_ERROR + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, p) + if err != nil { + return err, EC_EMPTY_DATA + } + fullKeyToQuery += componentcfg.SEPARATOR + timestamp } - } - - fullKeyToQuery := p.AbsoluteWithoutTimestamp() - if timestamp != "0" { - //versioned entry + // Otherwise, the requested path is not a Consul folder, so it must + // be a plain unversioned entry. + // Therefore the fullKeyToQuery is ok and there's nothing to do. + } else { + // A timestamp was passed, either via -t or @ + // We can safely append it to the full query path. fullKeyToQuery += componentcfg.SEPARATOR + timestamp } + cfgPayload, err = cfg.Get(fullKeyToQuery) if err != nil { return err, EC_CONNECTION_ERROR From 310c696617507ef8108e8a39993ea42f4b0dbb7f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 18:48:24 +0100 Subject: [PATCH 0692/2352] [core][configuration] Move high level conf mgmt to configuration package --- {core => configuration}/confsys/service.go | 0 {core => configuration}/repos/repo.go | 13 +++++++------ {core => configuration}/repos/repomanager.go | 19 ++++++++++--------- .../template/fields.go | 10 +++++----- .../template/fieldwrappers.go | 0 .../template/loader.go | 2 +- .../template/stack.go | 2 +- {core => configuration}/the/singleton.go | 4 ++-- core/environment/environment.go | 2 +- core/environment/transition_startactivity.go | 2 +- core/globalstate.go | 2 +- core/server.go | 2 +- core/task/manager.go | 10 +++++----- core/task/task.go | 2 +- core/workflow/aggregatorrole.go | 4 ++-- core/workflow/iteratorrange.go | 2 +- core/workflow/iteratorrole.go | 2 +- core/workflow/load.go | 4 ++-- core/workflow/role.go | 2 +- core/workflow/rolebase.go | 2 +- core/workflow/taskrole.go | 4 ++-- 21 files changed, 46 insertions(+), 44 deletions(-) rename {core => configuration}/confsys/service.go (100%) rename {core => configuration}/repos/repo.go (97%) rename {core => configuration}/repos/repomanager.go (99%) rename {core/workflow => configuration}/template/fields.go (93%) rename {core/workflow => configuration}/template/fieldwrappers.go (100%) rename {core/workflow => configuration}/template/loader.go (97%) rename {core/workflow => configuration}/template/stack.go (99%) rename {core => configuration}/the/singleton.go (91%) diff --git a/core/confsys/service.go b/configuration/confsys/service.go similarity index 100% rename from core/confsys/service.go rename to configuration/confsys/service.go diff --git a/core/repos/repo.go b/configuration/repos/repo.go similarity index 97% rename from core/repos/repo.go rename to configuration/repos/repo.go index 8f9138523..cbb5d2bf3 100644 --- a/core/repos/repo.go +++ b/configuration/repos/repo.go @@ -26,13 +26,14 @@ package repos import ( "errors" - "github.com/gobwas/glob" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" "io/ioutil" "strings" - "github.com/AliceO2Group/Control/core/confsys" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/gobwas/glob" + + "github.com/AliceO2Group/Control/configuration/confsys" ) type Repo struct { @@ -224,7 +225,7 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string) (Templates return templates, nil } -func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { +func (r*Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { var revisions []string // get a handle of the repo for go-git @@ -282,7 +283,7 @@ func (r* Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]str return revisions, nil } -func (r* Repo) updateDefaultRevision(revision string) (string, error) { +func (r*Repo) updateDefaultRevision(revision string) (string, error) { var refs []string refs = append(refs, refRemotePrefix, refTagPrefix) revisionsMatched, err := r.getRevisions(revision, refs) diff --git a/core/repos/repomanager.go b/configuration/repos/repomanager.go similarity index 99% rename from core/repos/repomanager.go rename to configuration/repos/repomanager.go index f22c2fed1..d2e8559f5 100644 --- a/core/repos/repomanager.go +++ b/configuration/repos/repomanager.go @@ -26,20 +26,21 @@ package repos import ( "errors" - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/core/confsys" - "github.com/gobwas/glob" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" "os" "path/filepath" "sort" "strconv" "strings" "sync" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/configuration/confsys" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/gobwas/glob" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) const ( @@ -72,7 +73,7 @@ type RepoManager struct { } func initializeRepos(service *confsys.Service) *RepoManager { - rm := RepoManager{repoList: map[string]*Repo {}} + rm := RepoManager{repoList: map[string]*Repo{}} rm.cService = service var err error diff --git a/core/workflow/template/fields.go b/configuration/template/fields.go similarity index 93% rename from core/workflow/template/fields.go rename to configuration/template/fields.go index 059edf5fb..1036a1c47 100644 --- a/core/workflow/template/fields.go +++ b/configuration/template/fields.go @@ -88,11 +88,11 @@ type Fields []Field type Stage int const ( // RESOLUTION STAGE ↓ VALUES AVAILABLE ↓ - STAGE0 Stage = iota // parent stack only + locals - STAGE1 // parent stack + defaults + locals - STAGE2 // parent stack + defaults + vars + locals - STAGE3 // parent stack + defaults + vars + uservars + locals - STAGE4 // parent stack + defaults + vars + uservars + locals + full self-object = full stack + STAGE0 Stage = iota // parent stack only + locals + STAGE1 // parent stack + defaults + locals + STAGE2 // parent stack + defaults + vars + locals + STAGE3 // parent stack + defaults + vars + uservars + locals + STAGE4 // parent stack + defaults + vars + uservars + locals + full self-object = full stack _STAGE_MAX ) diff --git a/core/workflow/template/fieldwrappers.go b/configuration/template/fieldwrappers.go similarity index 100% rename from core/workflow/template/fieldwrappers.go rename to configuration/template/fieldwrappers.go diff --git a/core/workflow/template/loader.go b/configuration/template/loader.go similarity index 97% rename from core/workflow/template/loader.go rename to configuration/template/loader.go index 5cc728996..811ddabe1 100644 --- a/core/workflow/template/loader.go +++ b/configuration/template/loader.go @@ -29,7 +29,7 @@ import ( "io" "strings" - "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/configuration/the" ) // Implements pongo2.TemplateLoader to fetch included templates from Consul paths diff --git a/core/workflow/template/stack.go b/configuration/template/stack.go similarity index 99% rename from core/workflow/template/stack.go rename to configuration/template/stack.go index 2e14a6f72..88cdfd5f1 100644 --- a/core/workflow/template/stack.go +++ b/configuration/template/stack.go @@ -35,7 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/configuration/the" "github.com/flosch/pongo2/v4" "github.com/sirupsen/logrus" ) diff --git a/core/the/singleton.go b/configuration/the/singleton.go similarity index 91% rename from core/the/singleton.go rename to configuration/the/singleton.go index 3b833e5fa..f3460b5e0 100644 --- a/core/the/singleton.go +++ b/configuration/the/singleton.go @@ -25,8 +25,8 @@ package the import ( - "github.com/AliceO2Group/Control/core/confsys" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/confsys" + "github.com/AliceO2Group/Control/configuration/repos" ) func ConfSvc() *confsys.Service { diff --git a/core/environment/environment.go b/core/environment/environment.go index df1f2deb3..30f3f5d2e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -38,8 +38,8 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 37dc77c12..e3dfd00ea 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -30,9 +30,9 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" ) func NewStartActivityTransition(taskman *task.Manager) Transition { diff --git a/core/globalstate.go b/core/globalstate.go index 871e62a81..057af6199 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -32,10 +32,10 @@ import ( "sync" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" ) diff --git a/core/server.go b/core/server.go index a8eb1926e..8720ce29d 100644 --- a/core/server.go +++ b/core/server.go @@ -35,9 +35,9 @@ import ( "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/product" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/the" "golang.org/x/net/context" "google.golang.org/grpc" diff --git a/core/task/manager.go b/core/task/manager.go index e2868ffc4..b017b181f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -27,18 +27,18 @@ package task import ( "context" "errors" + "fmt" "io/ioutil" "path/filepath" - "fmt" "strings" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task/taskop" - "github.com/AliceO2Group/Control/core/the" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/configuration/the" + "github.com/AliceO2Group/Control/core/task/taskop" "github.com/mesos/mesos-go/api/v1/lib/extras/store" "gopkg.in/yaml.v3" diff --git a/core/task/task.go b/core/task/task.go index 406cf73f5..3f18e0216 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -45,9 +45,9 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/workflow/template" "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" "github.com/spf13/viper" diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 6ce5c14cc..17f71be22 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -30,9 +30,9 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/workflow/template" "github.com/gobwas/glob" "github.com/sirupsen/logrus" ) diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index f09ad94cc..8171b37cf 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -29,7 +29,7 @@ import ( "strconv" texttemplate "text/template" - "github.com/AliceO2Group/Control/core/workflow/template" + "github.com/AliceO2Group/Control/configuration/template" ) type iteratorRange interface { diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 6e9934b71..0f411f39f 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -28,7 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" diff --git a/core/workflow/load.go b/core/workflow/load.go index acab68f96..9dea88adf 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -31,9 +31,9 @@ import ( "time" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" "github.com/k0kubun/pp" "github.com/spf13/viper" "gopkg.in/yaml.v3" diff --git a/core/workflow/role.go b/core/workflow/role.go index e55213d58..71adc3860 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -32,7 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 2de0d6185..2aa90fbed 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -32,8 +32,8 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/workflow/template" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 10cb28fc8..6eed2c4a4 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -31,9 +31,9 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/workflow/template" "github.com/gobwas/glob" ) From 55736eaec6174d747fcaa9f2f508ef8fb2ff3d69 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 20:02:42 +0100 Subject: [PATCH 0693/2352] [configuration] Move component cfg template processing into confSvc --- configuration/confsys/service.go | 44 ++++++++++++++++++ configuration/template/fields.go | 13 ++++-- configuration/template/fieldwrappers.go | 62 +++++++++---------------- configuration/template/loader.go | 8 ++-- configuration/template/stack.go | 46 ++---------------- core/task/task.go | 5 +- core/workflow/aggregatorrole.go | 19 ++++---- core/workflow/iteratorrange.go | 5 +- core/workflow/roleutils.go | 46 ++++++++++++++++++ core/workflow/taskrole.go | 19 ++++---- 10 files changed, 151 insertions(+), 116 deletions(-) create mode 100644 core/workflow/roleutils.go diff --git a/configuration/confsys/service.go b/configuration/confsys/service.go index d2698cdba..182307606 100644 --- a/configuration/confsys/service.go +++ b/configuration/confsys/service.go @@ -26,6 +26,7 @@ package confsys import ( "encoding/json" + "fmt" "io/ioutil" "net/url" "os" @@ -37,6 +38,8 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/flosch/pongo2/v4" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -337,6 +340,47 @@ func (s *Service) GetComponentConfiguration(path string) (payload string, err er return } +func (s *Service) GetAndProcessComponentConfiguration(path string, varStack map[string]string) (payload string, err error) { + // We need to decompose the requested GetConfig path into prefix and suffix, + // with the last / as separator (any timestamp if present stays part of the + // suffix). + // This is done to allow internal references between template snippets + // within the same Consul directory. + indexOfLastSeparator := strings.LastIndex(path, "/") + var basePath string + shortPath := path + if indexOfLastSeparator != -1 { + basePath = path[:indexOfLastSeparator] + shortPath = path[indexOfLastSeparator+1:] + } + + // We declare a TemplateSet, with a custom TemplateLoader. + // Our ConsulTemplateLoader takes control of the FromFile code path + // in pongo2, effectively adding support for Consul as file-like + // backend. + tplSet := pongo2.NewSet("", template.NewConsulTemplateLoader(s, basePath)) + var tpl *pongo2.Template + tpl, err = tplSet.FromFile(shortPath) + + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()), err + } + + bindings := make(map[string]interface{}) + for k, v := range varStack { + bindings[k] = v + } + + // Add custom functions to bindings: + funcMap := template.MakeStrOperationFuncMap() + for k, v := range funcMap { + bindings[k] = v + } + + payload, err = tpl.Execute(bindings) + return +} + func (s *Service) GetConsulPath() string { return viper.GetString("consulBasePath") } \ No newline at end of file diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 1036a1c47..e1c467180 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -47,7 +47,12 @@ var log = logger.New(logrus.StandardLogger(),"template") type Sequence map[Stage]Fields type BuildObjectStackFunc func(stage Stage) map[string]interface{} -func (sf Sequence) Execute(parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { +type ComponentConfigurationService interface { + GetComponentConfiguration(path string) (payload string, err error) + GetAndProcessComponentConfiguration(path string, varStack map[string]string) (payload string, err error) +} + +func (sf Sequence) Execute(confSvc ComponentConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { for i := 0; i < int(_STAGE_MAX); i++ { currentStage := Stage(i) @@ -73,7 +78,7 @@ func (sf Sequence) Execute(parentPath string, varStack VarStack, buildObjectStac }(), }).Trace("about to process fields for stage") } - err = fields.Execute(parentPath, stagedStack, objectStack, stringTemplateCache) + err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache) if err != nil { log.WithError(err).Errorf("template processing error") return @@ -178,7 +183,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri return } -func (fields Fields) Execute(parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { +func (fields Fields) Execute(confSvc ComponentConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) strOpStack := MakeStrOperationFuncMap() for k, v := range varStack { @@ -191,7 +196,7 @@ func (fields Fields) Execute(parentPath string, varStack map[string]string, objS environment[k] = v } - configAccessFuncs := MakeConfigAccessFuncs(varStack) + configAccessFuncs := MakeConfigAccessFuncs(confSvc, varStack) for k, v := range configAccessFuncs { environment[k] = v } diff --git a/configuration/template/fieldwrappers.go b/configuration/template/fieldwrappers.go index c4e5681aa..d213b1973 100644 --- a/configuration/template/fieldwrappers.go +++ b/configuration/template/fieldwrappers.go @@ -24,60 +24,58 @@ package template -import "github.com/AliceO2Group/Control/core/task/constraint" - type Field interface { Get() string Set(value string) } -type pointerWrapper struct { +type PointerWrapper struct { field *string } func WrapPointer(field *string) Field { - return &pointerWrapper{field: field} + return &PointerWrapper{field: field} } -func (t *pointerWrapper) Get() string { +func (t *PointerWrapper) Get() string { return *t.field } -func (t *pointerWrapper) Set(value string) { +func (t *PointerWrapper) Set(value string) { *t.field = value } type GetterFunc func() string type SetterFunc func(value string) -type genericWrapper struct { - getter GetterFunc - setter SetterFunc +type GenericWrapper struct { + Getter GetterFunc + Setter SetterFunc } -func (t *genericWrapper) Get() string { - return t.getter() +func (t *GenericWrapper) Get() string { + return t.Getter() } -func (t *genericWrapper) Set(value string) { - t.setter(value) +func (t *GenericWrapper) Set(value string) { + t.Setter(value) } func WrapGeneric(getterF GetterFunc, setterF SetterFunc) Field { - return &genericWrapper{ - getter: getterF, - setter: setterF, + return &GenericWrapper{ + Getter: getterF, + Setter: setterF, } } func WrapMapItems(items map[string]string) Fields { fields := make(Fields, 0) for k, _ := range items { - key := k // we need a local copy for the getter/setter closures - fields = append(fields, &genericWrapper{ - getter: func() string { + key := k // we need a local copy for the Getter/Setter closures + fields = append(fields, &GenericWrapper{ + Getter: func() string { return items[key] }, - setter: func(value string) { + Setter: func(value string) { items[key] = value }, }) @@ -88,31 +86,15 @@ func WrapMapItems(items map[string]string) Fields { func WrapSliceItems(items []string) Fields { fields := make(Fields, 0) for i, _ := range items { - index := i // we need a local copy for the getter/setter closures - fields = append(fields, &genericWrapper{ - getter: func() string { + index := i // we need a local copy for the Getter/Setter closures + fields = append(fields, &GenericWrapper{ + Getter: func() string { return items[index] }, - setter: func(value string) { + Setter: func(value string) { items[index] = value }, }) } return fields } - -func WrapConstraints(items constraint.Constraints) Fields { - fields := make(Fields, 0) - for i, _ := range items { - index := i // we need a local copy for the getter/setter closures - fields = append(fields, &genericWrapper{ - getter: func() string { - return items[index].Value - }, - setter: func(value string) { - items[index].Value = value - }, - }) - } - return fields -} diff --git a/configuration/template/loader.go b/configuration/template/loader.go index 811ddabe1..3b40ed374 100644 --- a/configuration/template/loader.go +++ b/configuration/template/loader.go @@ -28,18 +28,18 @@ import ( "fmt" "io" "strings" - - "github.com/AliceO2Group/Control/configuration/the" ) // Implements pongo2.TemplateLoader to fetch included templates from Consul paths type ConsulTemplateLoader struct { basePath string + confSvc ComponentConfigurationService } -func NewConsulTemplateLoader(basePath string) *ConsulTemplateLoader { +func NewConsulTemplateLoader(confSvc ComponentConfigurationService, basePath string) *ConsulTemplateLoader { return &ConsulTemplateLoader{ basePath: basePath, + confSvc: confSvc, } } @@ -58,7 +58,7 @@ func (c *ConsulTemplateLoader) Abs(base, name string) string { } func (c *ConsulTemplateLoader) Get(path string) (io.Reader, error) { - payload, err := the.ConfSvc().GetComponentConfiguration(path) + payload, err := c.confSvc.GetComponentConfiguration(path) if err != nil { log.WithError(err). WithField("path", path). diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 88cdfd5f1..618ac1c14 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -35,8 +35,6 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/configuration/the" - "github.com/flosch/pongo2/v4" "github.com/sirupsen/logrus" ) @@ -44,11 +42,11 @@ type GetConfigFunc func(string) string type ConfigAccessFuncs map[string]GetConfigFunc type ToPtreeFunc func(string, string) string -func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { +func MakeConfigAccessFuncs(confSvc ComponentConfigurationService, varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ "GetConfigLegacy": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfigLegacy", log.WithPrefix("template")) - payload, err := the.ConfSvc().GetComponentConfiguration(path) + payload, err := confSvc.GetComponentConfiguration(path) if err != nil { log.WithError(err). WithField("path", path). @@ -57,7 +55,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { } fields := Fields{WrapPointer(&payload)} - err = fields.Execute(path, varStack, nil, make(map[string]texttemplate.Template)) + err = fields.Execute(confSvc, path, varStack, nil, make(map[string]texttemplate.Template)) log.Warn(varStack) log.Warn(payload) return payload @@ -65,43 +63,7 @@ func MakeConfigAccessFuncs(varStack map[string]string) ConfigAccessFuncs { "GetConfig": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) - // We need to decompose the requested GetConfig path into prefix and suffix, - // with the last / as separator (any timestamp if present stays part of the - // suffix). - // This is done to allow internal references between template snippets - // within the same Consul directory. - indexOfLastSeparator := strings.LastIndex(path, "/") - var basePath string - shortPath := path - if indexOfLastSeparator != -1 { - basePath = path[:indexOfLastSeparator] - shortPath = path[indexOfLastSeparator+1:] - } - - // We declare a TemplateSet, with a custom TemplateLoader. - // Our ConsulTemplateLoader takes control of the FromFile code path - // in pongo2, effectively adding support for Consul as file-like - // backend. - tplSet := pongo2.NewSet("", NewConsulTemplateLoader(basePath)) - tpl, err := tplSet.FromFile(shortPath) - - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - bindings := make(map[string]interface{}) - for k, v := range varStack { - bindings[k] = v - } - - // Add custom functions to bindings: - funcMap := MakeStrOperationFuncMap() - for k, v := range funcMap { - bindings[k] = v - } - - var payload string - payload, err = tpl.Execute(bindings) + payload, err := confSvc.GetAndProcessComponentConfiguration(path, varStack) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } diff --git a/core/task/task.go b/core/task/task.go index 3f18e0216..ac7b7f0f0 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -46,6 +46,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/mesos/mesos-go/api/v1/lib" @@ -284,7 +285,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { template.WrapSliceItems(cmd.Arguments)... )... ) - err = fields.Execute(t.name, varStack, nil, make(map[string]texttemplate.Template)) + err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template)) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err).Error("cannot resolve templates for task command info") @@ -456,7 +457,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand fields := template.WrapMapItems(propMap) - err = fields.Execute(t.name, varStack, objStack, make(map[string]texttemplate.Template)) + err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template)) if err != nil { log.WithError(err).Error("cannot resolve templates for property map") return diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 17f71be22..8d798502d 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" "github.com/gobwas/glob" "github.com/sirupsen/logrus" @@ -111,22 +112,18 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) template.WrapPointer(&r.Name), }, template.STAGE4: append(append( - template.WrapConstraints(r.Constraints), + WrapConstraints(r.Constraints), r.wrapConnectFields()...), template.WrapPointer(&r.Enabled)), } // TODO: push cached templates here - err = templSequence.Execute(r.GetPath(), - template.VarStack{ - Locals: r.Locals, - Defaults: r.Defaults, - Vars: r.Vars, - UserVars: r.UserVars, - }, - r.makeBuildObjectStackFunc(), - make(map[string]texttemplate.Template), - ) + err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) if err != nil { return } diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index 8171b37cf..b81e862f0 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -30,6 +30,7 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/configuration/the" ) type iteratorRange interface { @@ -57,7 +58,7 @@ func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, fields := template.Fields{ template.WrapPointer(&f.Range), } - err = fields.Execute("", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) if err != nil { return } @@ -94,7 +95,7 @@ func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, e template.WrapPointer(&f.Begin), template.WrapPointer(&f.End), } - err = fields.Execute("", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) if err != nil { return } diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go new file mode 100644 index 000000000..5b3f058d5 --- /dev/null +++ b/core/workflow/roleutils.go @@ -0,0 +1,46 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/task/constraint" +) + +func WrapConstraints(items constraint.Constraints) template.Fields { + fields := make(template.Fields, 0) + for i, _ := range items { + index := i // we need a local copy for the getter/setter closures + fields = append(fields, &template.GenericWrapper{ + Getter: func() string { + return items[index].Value + }, + Setter: func(value string) { + items[index].Value = value + }, + }) + } + return fields +} diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 6eed2c4a4..94fb5c5e9 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" "github.com/gobwas/glob" ) @@ -132,22 +133,18 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.Trigger), }, template.STAGE4: append(append( - template.WrapConstraints(t.Constraints), + WrapConstraints(t.Constraints), t.wrapConnectFields()...), template.WrapPointer(&t.Enabled)), } // FIXME: push cached templates here - err = templSequence.Execute(t.GetPath(), - template.VarStack{ - Locals: t.Locals, - Defaults: t.Defaults, - Vars: t.Vars, - UserVars: t.UserVars, - }, - t.makeBuildObjectStackFunc(), - make(map[string]texttemplate.Template), - ) + err = templSequence.Execute(the.ConfSvc(), t.GetPath(), template.VarStack{ + Locals: t.Locals, + Defaults: t.Defaults, + Vars: t.Vars, + UserVars: t.UserVars, + }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) if err != nil { return } From d002c16dfa0b017c19a923651729de98f872d6bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 20:30:41 +0100 Subject: [PATCH 0694/2352] [configuration] Add IsDir to configuration.YamlSource --- configuration/source.go | 1 + configuration/yamlsource.go | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/configuration/source.go b/configuration/source.go index 24f37d6a0..17cb3ea2f 100644 --- a/configuration/source.go +++ b/configuration/source.go @@ -38,6 +38,7 @@ type ROSource interface { GetRecursive(string) (Item, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) + IsDir(string) bool } type Source interface { diff --git a/configuration/yamlsource.go b/configuration/yamlsource.go index f15806921..ce5918755 100644 --- a/configuration/yamlsource.go +++ b/configuration/yamlsource.go @@ -169,6 +169,15 @@ func (yc *YamlSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error } +func (yc *YamlSource) IsDir(key string) (isDir bool) { + recursive, err := yc.GetRecursive(key) + if err != nil { + return false + } + return recursive.Type() == IT_Map +} + + func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { From ff9265c5d403e450068ae6c59e19121975517b55 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 20:31:27 +0100 Subject: [PATCH 0695/2352] [configuration] Fix GetConfig logic for unversioned configuration --- configuration/confsys/service.go | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/configuration/confsys/service.go b/configuration/confsys/service.go index 182307606..a37f9d95d 100644 --- a/configuration/confsys/service.go +++ b/configuration/confsys/service.go @@ -53,8 +53,15 @@ var ( func Instance() *Service { once.Do(func() { - var err error - configUri := viper.GetString("globalConfigurationUri") + var( + err error + configUri string + ) + if viper.IsSet("config_endpoint") { //coconut + configUri = viper.GetString("config_endpoint") + } else { + configUri = viper.GetString("globalConfigurationUri") + } instance, err = newService(configUri) if err != nil { log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") @@ -317,25 +324,25 @@ func (s *Service) GetComponentConfiguration(path string) (payload string, err er if len(p.Timestamp) == 0 { keyPrefix := p.AbsoluteWithoutTimestamp() - var keys []string - keys, err = s.src.GetKeysByPrefix(keyPrefix) - if err != nil { - return - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, p) - if err != nil { - return + if s.src.IsDir(keyPrefix) { + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, p) + if err != nil { + return + } } } absKey := p.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { payload, err = s.src.Get(absKey) - log.WithFields(logrus.Fields{"key": absKey, "value": payload}).Trace("getting key") } else { // falling back to timestampless configuration absKey = p.AbsoluteWithoutTimestamp() payload, err = s.src.Get(absKey) - log.WithFields(logrus.Fields{"key": absKey, "value": payload}).Trace("getting key") } return } From ac845e85d14aee7c94b383b74fa44e718b270f86 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 20:32:32 +0100 Subject: [PATCH 0696/2352] [common] Suppress bothersome log output --- common/utils/uid/uid.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go index e865fcaa4..70936fe18 100644 --- a/common/utils/uid/uid.go +++ b/common/utils/uid/uid.go @@ -71,7 +71,7 @@ func init() { } else { id = "" } - log.Infof("machine UUID: %s generator machine ID: %d", id, machineId) + //log.Infof("machine UUID: %s generator machine ID: %d", id, machineId) uidGen = indigo.New( nil, @@ -103,7 +103,7 @@ func NilID() ID { func New() ID { id, err := uidGen.NextID() if err != nil { - log.Warnf("indigo.NextID() failed with %s, reverting to XID", err) + //log.Warnf("indigo.NextID() failed with %s, reverting to XID", err) return ID(xid.New().String()) } return ID(id) From 173f098bd18e0e1ef0b2034eec55e8802def4131 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Dec 2020 20:33:40 +0100 Subject: [PATCH 0697/2352] [coconut] New --simulate flag to coconut conf show --- coconut/cmd/configuration_show.go | 3 ++ coconut/configuration/configuration.go | 55 +++++++++++++++++++++++--- 2 files changed, 52 insertions(+), 6 deletions(-) diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 1913bb1c5..a25c754f7 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -48,4 +48,7 @@ It can also return a specific revision, requested with the --timestamp/-t flag`, func init() { configurationCmd.AddCommand(configurationShowCmd) configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") + configurationShowCmd.Flags().BoolP("simulate", "s", false, "simulate runtime template processing on the configuration payload") + // The following only applies if simulate is set: + configurationShowCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 861c91e49..bd83fb06e 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -38,8 +38,10 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/configuration/the" "github.com/briandowns/spinner" "github.com/naoina/toml" "github.com/sirupsen/logrus" @@ -170,11 +172,13 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if err != nil { return err, EC_CONNECTION_ERROR } + fmt.Fprintf(o, "keys:\n%s", strings.Join(keys, "\n")) components, err, code := getListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) if err != nil { return err, code } + fmt.Fprintf(o, "\ncomponents:\n%s", strings.Join(components, "\n")) output, err := formatListOutput(cmd, components) if err != nil { @@ -236,7 +240,6 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } } - var cfgPayload string fullKeyToQuery := p.AbsoluteWithoutTimestamp() if timestamp == "" { @@ -265,16 +268,56 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o // We can safely append it to the full query path. fullKeyToQuery += componentcfg.SEPARATOR + timestamp } + p.Timestamp = timestamp - cfgPayload, err = cfg.Get(fullKeyToQuery) + // At this point we know what to query, either fullKeyToQuery + // for a raw configuration.ConsulSource query, or a + // componentcfg.Path that can be fed to the.ConfSvc(). + var( + cfgPayload string + simulate bool + ) + simulate, err = cmd.Flags().GetBool("simulate") if err != nil { - return err, EC_CONNECTION_ERROR - } - if cfgPayload == "" { - return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA + return err, EC_INVALID_ARGS } + if simulate { + var extraVars string + extraVars, err = cmd.Flags().GetString("extra-vars") + if err != nil { + return err, EC_INVALID_ARGS + } + + extraVars = strings.TrimSpace(extraVars) + if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { + err = errors.New("empty list of extra-vars supplied") + return err, EC_INVALID_ARGS + } + + var extraVarsMap map[string]string + extraVarsMap, err = utils.ParseExtraVars(extraVars) + if err != nil { + return err, EC_INVALID_ARGS + } + + fmt.Fprintf(o,"%s", p.Path()) + cfgPayload, err = the.ConfSvc().GetAndProcessComponentConfiguration(p.Path(), extraVarsMap) + if err != nil { + return err, EC_CONNECTION_ERROR + } + } else { + // No template processing simulation requested, getting raw payload + cfgPayload, err = cfg.Get(fullKeyToQuery) + if err != nil { + return err, EC_CONNECTION_ERROR + } + if cfgPayload == "" { + return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA + } + } _, _ = fmt.Fprintln(o, cfgPayload) + return nil, EC_ZERO } From 40c4ebc6fcd431f883c7d7b7710bcfc7a9fdeef9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Dec 2020 03:12:05 +0100 Subject: [PATCH 0698/2352] [core] Migrate from gogo/protobuf to protobuf generator v2 --- Makefile | 25 +- coconut/cmd/environment.go | 2 +- coconut/cmd/repo.go | 2 +- coconut/protos/o2control.pb.go | 23268 +++++++---------------------- core/protos/o2control.pb.go | 23268 +++++++---------------------- core/protos/o2control.proto | 2 +- core/server.go | 2 +- core/task/scheduler.go | 2 +- core/task/schedutil/mesosutil.go | 2 +- docs/makefile_reference.md | 6 +- executor/executor.go | 2 +- executor/executorcmd/client.go | 2 - executor/protos/occ.pb.go | 2879 +--- go.mod | 15 +- go.sum | 30 +- occ/protos/occ.proto | 2 +- odcshim/occserver/handlers.go | 2 - odcshim/odcprotos/odc.pb.go | 5412 ++----- odcshim/odcprotos/odc.proto | 1 + odcshim/odcshim.go | 4 +- odcshim/protos/occ.pb.go | 2879 +--- 21 files changed, 13673 insertions(+), 44134 deletions(-) diff --git a/Makefile b/Makefile index 41018e77f..778c56230 100644 --- a/Makefile +++ b/Makefile @@ -61,14 +61,10 @@ PROD :=-X=$(REPOPATH)/common/product EXTLDFLAGS :="-static" LDFLAGS=-ldflags "-extldflags $(EXTLDFLAGS) $(PROD).VERSION_MAJOR=$(VERSION_MAJOR) $(PROD).VERSION_MINOR=$(VERSION_MINOR) $(PROD).VERSION_PATCH=$(VERSION_PATCH) $(PROD).BUILD=$(BUILD)" -tags osusergo,netgo -# We expect to find the gogo protobuf executables in $GOPATH/bin +# We expect to find the protoc-gen-go executable in $GOPATH/bin GOPATH := $(shell go env GOPATH) -GOGOPATH=$(GOPATH)/bin/protoc-gen-gofast -HAS_GOGOPROTO := $(shell command -v $(GOGOPATH) 2> /dev/null) - -GO_GET_U1 := $(addprefix github.com/gogo/protobuf/, proto protoc-gen-gofast protoc-gen-gogofast protoc-gen-gogofaster protoc-gen-gogoslick gogoproto) -GO_GET_U2 := $(addprefix github.com/golang/protobuf/, proto protoc-gen-go) -GO_GET_U2 += google.golang.org/grpc +GOPROTOCPATH=$(GOPATH)/bin/protoc-gen-go +HAS_PROTOC := $(shell command -v $(GOPROTOCPATH) 2> /dev/null) .PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs @@ -97,7 +93,7 @@ $(INSTALL_WHAT): @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) generate: -ifndef HAS_GOGOPROTO +ifndef HAS_PROTOC $(MAKE) tools/protoc endif @for gendir in $(GENERATE_DIRS); do \ @@ -132,6 +128,15 @@ vendor: @echo -e "\033[1;33mcurl odc.proto\033[0m" @mkdir -p odcshim/odcprotos @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto + +# WORKAROUND: In order to avoid the following issues: +# https://github.com/golang/protobuf/issues/992 +# https://github.com/golang/protobuf/issues/1158 +# we insert a go_package specification into the ODC protofile right +# after we download it. + @echo -e "\033[1;33mpatch odc.proto\033[0m" + @sed -i '/^package/a option go_package = "odcprotos;odc";' odcshim/odcprotos/odc.proto + # vendor: tools/dep # @echo -e "\033[1;33mdep ensure\033[0m" # @./tools/dep ensure @@ -147,8 +152,8 @@ tools: tools/protoc tools/protoc: @echo "installing Go protoc" - go get -u $(GO_GET_U1) - go get -u $(GO_GET_U2) + go get -u google.golang.org/grpc + go install google.golang.org/protobuf/cmd/protoc-gen-go docs: doc diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index ef523abd4..86ca5b60c 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --gofast_out=plugins=grpc:.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=plugins=grpc:.. protos/o2control.proto package cmd diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index be7f555be..a93e0190b 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --gofast_out=plugins=grpc:.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=plugins=grpc:.. protos/o2control.proto package cmd diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 3194363ff..9b49a124d 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1,30 +1,56 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 // source: protos/o2control.proto package pb import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StatusUpdate_Level int32 @@ -35,26 +61,47 @@ const ( StatusUpdate_ERROR StatusUpdate_Level = 3 ) -var StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", -} +// Enum value maps for StatusUpdate_Level. +var ( + StatusUpdate_Level_name = map[int32]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + } + StatusUpdate_Level_value = map[string]int32{ + "DEBUG": 0, + "INFO": 1, + "WARNING": 2, + "ERROR": 3, + } +) -var StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, +func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { + p := new(StatusUpdate_Level) + *p = x + return p } func (x StatusUpdate_Level) String() string { - return proto.EnumName(StatusUpdate_Level_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[0].Descriptor() } +func (StatusUpdate_Level) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[0] +} + +func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{12, 0} } type ControlEnvironmentRequest_Optype int32 @@ -68,30 +115,51 @@ const ( ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 ) -var ControlEnvironmentRequest_Optype_name = map[int32]string{ - 0: "NOOP", - 1: "START_ACTIVITY", - 2: "STOP_ACTIVITY", - 3: "CONFIGURE", - 4: "RESET", - 5: "GO_ERROR", -} +// Enum value maps for ControlEnvironmentRequest_Optype. +var ( + ControlEnvironmentRequest_Optype_name = map[int32]string{ + 0: "NOOP", + 1: "START_ACTIVITY", + 2: "STOP_ACTIVITY", + 3: "CONFIGURE", + 4: "RESET", + 5: "GO_ERROR", + } + ControlEnvironmentRequest_Optype_value = map[string]int32{ + "NOOP": 0, + "START_ACTIVITY": 1, + "STOP_ACTIVITY": 2, + "CONFIGURE": 3, + "RESET": 4, + "GO_ERROR": 5, + } +) -var ControlEnvironmentRequest_Optype_value = map[string]int32{ - "NOOP": 0, - "START_ACTIVITY": 1, - "STOP_ACTIVITY": 2, - "CONFIGURE": 3, - "RESET": 4, - "GO_ERROR": 5, +func (x ControlEnvironmentRequest_Optype) Enum() *ControlEnvironmentRequest_Optype { + p := new(ControlEnvironmentRequest_Optype) + *p = x + return p } func (x ControlEnvironmentRequest_Optype) String() string { - return proto.EnumName(ControlEnvironmentRequest_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } +func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() +} + +func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] +} + +func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{27, 0} } type EnvironmentOperation_Optype int32 @@ -102,19201 +170,6685 @@ const ( EnvironmentOperation_ADD_ROLE EnvironmentOperation_Optype = 4 ) -var EnvironmentOperation_Optype_name = map[int32]string{ - 0: "NOOP", - 3: "REMOVE_ROLE", - 4: "ADD_ROLE", -} +// Enum value maps for EnvironmentOperation_Optype. +var ( + EnvironmentOperation_Optype_name = map[int32]string{ + 0: "NOOP", + 3: "REMOVE_ROLE", + 4: "ADD_ROLE", + } + EnvironmentOperation_Optype_value = map[string]int32{ + "NOOP": 0, + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, + } +) -var EnvironmentOperation_Optype_value = map[string]int32{ - "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } func (x EnvironmentOperation_Optype) String() string { - return proto.EnumName(EnvironmentOperation_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() +} + +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] +} + +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{30, 0} } type Event_MesosHeartbeat struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *Event_MesosHeartbeat) Reset() { *m = Event_MesosHeartbeat{} } -func (m *Event_MesosHeartbeat) String() string { return proto.CompactTextString(m) } -func (*Event_MesosHeartbeat) ProtoMessage() {} -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{0} -} -func (m *Event_MesosHeartbeat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event_MesosHeartbeat) Reset() { + *x = Event_MesosHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event_MesosHeartbeat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event_MesosHeartbeat.Merge(m, src) -} -func (m *Event_MesosHeartbeat) XXX_Size() int { - return m.Size() -} -func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { - xxx_messageInfo_Event_MesosHeartbeat.DiscardUnknown(m) + +func (x *Event_MesosHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo +func (*Event_MesosHeartbeat) ProtoMessage() {} -type Ev_EnvironmentEvent struct { - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } -func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{1} +// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. +func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) + +type Ev_EnvironmentStateChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` } -func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (x *Ev_EnvironmentStateChanged) Reset() { + *x = Ev_EnvironmentStateChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) -} -func (m *Ev_EnvironmentEvent) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) + +func (x *Ev_EnvironmentStateChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo +func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { - if m != nil { - return m.EnvironmentId +func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_EnvironmentEvent) GetState() string { - if m != nil { - return m.State - } - return "" +// Deprecated: Use Ev_EnvironmentStateChanged.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{1} } -func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Ev_EnvironmentStateChanged) GetEvent() string { + if x != nil { + return x.Event } - return 0 + return "" } -func (m *Ev_EnvironmentEvent) GetError() string { - if m != nil { - return m.Error +func (x *Ev_EnvironmentStateChanged) GetSource() string { + if x != nil { + return x.Source } return "" } -func (m *Ev_EnvironmentEvent) GetMessage() string { - if m != nil { - return m.Message +func (x *Ev_EnvironmentStateChanged) GetDestination() string { + if x != nil { + return x.Destination } return "" } -type Ev_TaskEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } -func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskEvent) ProtoMessage() {} -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskEvent.Merge(m, src) +type Ev_TaskStateChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } -func (m *Ev_TaskEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_TaskStateChanged) Reset() { + *x = Ev_TaskStateChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_TaskEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) + +func (x *Ev_TaskStateChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (*Ev_TaskStateChanged) ProtoMessage() {} -func (m *Ev_TaskEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskStateChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_TaskEvent) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" +// Deprecated: Use Ev_TaskStateChanged.ProtoReflect.Descriptor instead. +func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } -func (m *Ev_TaskEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskStateChanged) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_TaskEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_TaskStateChanged) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_TaskEvent) GetHostname() string { - if m != nil { - return m.Hostname - } - return "" -} +type Ev_TaskStatusChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Ev_TaskEvent) GetClassName() string { - if m != nil { - return m.ClassName - } - return "" + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } -type Ev_RoleEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } -func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_RoleEvent) ProtoMessage() {} -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} -} -func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_TaskStatusChanged) Reset() { + *x = Ev_TaskStatusChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_RoleEvent.Merge(m, src) -} -func (m *Ev_RoleEvent) XXX_Size() int { - return m.Size() -} -func (m *Ev_RoleEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) + +func (x *Ev_TaskStatusChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo +func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (m *Ev_RoleEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_RoleEvent) GetStatus() string { - if m != nil { - return m.Status - } - return "" +// Deprecated: Use Ev_TaskStatusChanged.ProtoReflect.Descriptor instead. +func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } -func (m *Ev_RoleEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskStatusChanged) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_RoleEvent) GetRolePath() string { - if m != nil { - return m.RolePath +func (x *Ev_TaskStatusChanged) GetStatus() string { + if x != nil { + return x.Status } return "" } -//////////////////////////////////////// -// Global status -//////////////////////////////////////// -type StatusRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_TaskLaunched struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_TaskLaunched) Reset() { + *x = Ev_TaskLaunched{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) -} -func (m *StatusRequest) XXX_Size() int { - return m.Size() -} -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo -type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Ev_TaskLaunched) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} -} -func (m *StatusReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*Ev_TaskLaunched) ProtoMessage() {} + +func (x *Ev_TaskLaunched) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) -} -func (m *StatusReply) XXX_Size() int { - return m.Size() -} -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +// Deprecated: Use Ev_TaskLaunched.ProtoReflect.Descriptor instead. +func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{4} +} -func (m *StatusReply) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskLaunched) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { - if m != nil { - return m.StatusUpdates - } - return nil -} +type Ev_MesosTaskCreated struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type StatusUpdate struct { - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` + ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_MesosTaskCreated) Reset() { + *x = Ev_MesosTaskCreated{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) -} -func (m *StatusUpdate) XXX_Size() int { - return m.Size() -} -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) + +func (x *Ev_MesosTaskCreated) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo +func (*Ev_MesosTaskCreated) ProtoMessage() {} -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int +func (x *Ev_MesosTaskCreated) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +// Deprecated: Use Ev_MesosTaskCreated.ProtoReflect.Descriptor instead. +func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} - -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { - if m != nil { - return m.Event +func (x *Ev_MesosTaskCreated) GetTaskresources() string { + if x != nil { + return x.Taskresources } - return nil + return "" } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { - if m != nil { - return m.Level +func (x *Ev_MesosTaskCreated) GetExecutorResources() string { + if x != nil { + return x.ExecutorResources } - return StatusUpdate_DEBUG + return "" } -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil +type Ev_EnvironmentCreated struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), +func (x *Ev_EnvironmentCreated) Reset() { + *x = Ev_EnvironmentCreated{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -type Event struct { - Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are valid to be assigned to Payload: - // *Event_EnvironmentEvent - // *Event_TaskEvent - // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Event) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Ev_EnvironmentCreated) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_EnvironmentCreated) ProtoMessage() {} + +func (x *Ev_EnvironmentCreated) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) -} -func (m *Event) XXX_Size() int { - return m.Size() + +// Deprecated: Use Ev_EnvironmentCreated.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) + +func (x *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment + } + return nil } -var xxx_messageInfo_Event proto.InternalMessageInfo +type Ev_EnvironmentDestroyed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type isEvent_Payload interface { - isEvent_Payload() - MarshalTo([]byte) (int, error) - Size() int + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` -} -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` +func (x *Ev_EnvironmentDestroyed) Reset() { + *x = Ev_EnvironmentDestroyed{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` + +func (x *Ev_EnvironmentDestroyed) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_RoleEvent) isEvent_Payload() {} +func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (m *Event) GetPayload() isEvent_Payload { - if m != nil { - return m.Payload +func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *Event) GetTimestamp() string { - if m != nil { - return m.Timestamp - } - return "" +// Deprecated: Use Ev_EnvironmentDestroyed.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } -func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { - return x.EnvironmentEvent +func (x *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } -func (m *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := m.GetPayload().(*Event_TaskEvent); ok { - return x.TaskEvent +func (x *Ev_EnvironmentDestroyed) GetEnvironmentid() string { + if x != nil { + return x.Environmentid } - return nil + return "" } -func (m *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := m.GetPayload().(*Event_RoleEvent); ok { - return x.RoleEvent - } - return nil +type Ev_EnvironmentError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Event) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), +func (x *Ev_EnvironmentError) Reset() { + *x = Ev_EnvironmentError{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -type SubscribeRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Ev_EnvironmentError) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } -func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } -func (*SubscribeRequest) ProtoMessage() {} -func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*Ev_EnvironmentError) ProtoMessage() {} + +func (x *Ev_EnvironmentError) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_EnvironmentError.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{8} } -func (m *SubscribeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SubscribeRequest.Merge(m, src) + +type Ev_KillTasksMesos struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *SubscribeRequest) XXX_Size() int { - return m.Size() + +func (x *Ev_KillTasksMesos) Reset() { + *x = Ev_KillTasksMesos{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SubscribeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) + +func (x *Ev_KillTasksMesos) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (*Ev_KillTasksMesos) ProtoMessage() {} -func (m *SubscribeRequest) GetId() string { - if m != nil { - return m.Id +func (x *Ev_KillTasksMesos) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_KillTasksMesos.ProtoReflect.Descriptor instead. +func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } //////////////////////////////////////// -// Framework +// Global status //////////////////////////////////////// -type GetFrameworkInfoRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) -} -func (m *GetFrameworkInfoRequest) XXX_Size() int { - return m.Size() -} -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +func (*StatusRequest) ProtoMessage() {} -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} -} -func (m *Version) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) -} -func (m *Version) XXX_Size() int { - return m.Size() -} -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } -var xxx_messageInfo_Version proto.InternalMessageInfo +type StatusReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Version) GetMajor() int32 { - if m != nil { - return m.Major - } - return 0 + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` } -func (m *Version) GetMinor() int32 { - if m != nil { - return m.Minor +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch - } - return 0 +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName - } - return "" +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } -func (m *Version) GetVersionStr() string { - if m != nil { - return m.VersionStr +func (x *StatusReply) GetState() string { + if x != nil { + return x.State } return "" } -type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} -} -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { + if x != nil { + return x.StatusUpdates } + return nil } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) + +type StatusUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` + // Types that are assignable to Event: + // *StatusUpdate_MesosHeartbeat + Event isStatusUpdate_Event `protobuf_oneof:"Event"` } -func (m *GetFrameworkInfoReply) XXX_Size() int { - return m.Size() + +func (x *StatusUpdate) Reset() { + *x = StatusUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) + +func (x *StatusUpdate) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +func (*StatusUpdate) ProtoMessage() {} -func (m *GetFrameworkInfoReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *StatusUpdate) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { - if m != nil { - return m.EnvironmentsCount - } - return 0 +// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount +func (x *StatusUpdate) GetLevel() StatusUpdate_Level { + if x != nil { + return x.Level } - return 0 + return StatusUpdate_DEBUG } -func (m *GetFrameworkInfoReply) GetState() string { +func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { - return m.State + return m.Event } - return "" + return nil } -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName - } - return "" -} - -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version +func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { + return x.MesosHeartbeat } return nil } -// Not implemented yet -type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type isStatusUpdate_Event interface { + isStatusUpdate_Event() } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} -} -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) -} -func (m *TeardownRequest) XXX_Size() int { - return m.Size() -} -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason - } - return "" -} +type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type TeardownReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Types that are assignable to Payload: + // *Event_EnvironmentStateChanged + // *Event_EnvironmentCreated + // *Event_TaskStateChanged + // *Event_TaskStatusChanged + // *Event_Tasklaunched + // *Event_MesosTaskcreated + // *Event_EnvironmentDestroyed + // *Event_EnvironmentError + // *Event_KilltasksMesos + Payload isEvent_Payload `protobuf_oneof:"Payload"` } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} -} -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) -} -func (m *TeardownReply) XXX_Size() int { - return m.Size() -} -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) -} - -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo - -//////////////////////////////////////// -// Environment -//////////////////////////////////////// -type GetEnvironmentsRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} -} -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) -} -func (m *GetEnvironmentsRequest) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo - -type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*Event) ProtoMessage() {} -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} -} -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) -} -func (m *GetEnvironmentsReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{13} +} -func (m *GetEnvironmentsReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { +func (m *Event) GetPayload() isEvent_Payload { if m != nil { - return m.Environments + return m.Payload } return nil } -type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} -} -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) -} -func (m *EnvironmentInfo) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo - -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id +func (x *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { + if x, ok := x.GetPayload().(*Event_EnvironmentStateChanged); ok { + return x.EnvironmentStateChanged } - return "" + return nil } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen +func (x *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { + if x, ok := x.GetPayload().(*Event_EnvironmentCreated); ok { + return x.EnvironmentCreated } - return "" + return nil } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State +func (x *Event) GetTaskStateChanged() *Ev_TaskStateChanged { + if x, ok := x.GetPayload().(*Event_TaskStateChanged); ok { + return x.TaskStateChanged } - return "" + return nil } -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { + if x, ok := x.GetPayload().(*Event_TaskStatusChanged); ok { + return x.TaskStatusChanged } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole +func (x *Event) GetTasklaunched() *Ev_TaskLaunched { + if x, ok := x.GetPayload().(*Event_Tasklaunched); ok { + return x.Tasklaunched } - return "" + return nil } -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { + if x, ok := x.GetPayload().(*Event_MesosTaskcreated); ok { + return x.MesosTaskcreated } - return 0 + return nil } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { + if x, ok := x.GetPayload().(*Event_EnvironmentDestroyed); ok { + return x.EnvironmentDestroyed } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *Event) GetEnvironmentError() *Ev_EnvironmentError { + if x, ok := x.GetPayload().(*Event_EnvironmentError); ok { + return x.EnvironmentError } return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *Event) GetKilltasksMesos() *Ev_KillTasksMesos { + if x, ok := x.GetPayload().(*Event_KilltasksMesos); ok { + return x.KilltasksMesos } return nil } -type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type isEvent_Payload interface { + isEvent_Payload() } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) -} -func (m *NewEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) +type Event_EnvironmentStateChanged struct { + EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof"` } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +type Event_EnvironmentCreated struct { + EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof"` +} -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate - } - return "" +type Event_TaskStateChanged struct { + TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof"` } -func (m *NewEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil +type Event_TaskStatusChanged struct { + TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof"` } -type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Event_Tasklaunched struct { + Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof"` } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} -} -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +type Event_MesosTaskcreated struct { + MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) + +type Event_EnvironmentDestroyed struct { + EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +type Event_EnvironmentError struct { + EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +type Event_KilltasksMesos struct { + KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof"` } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil +func (*Event_EnvironmentCreated) isEvent_Payload() {} + +func (*Event_TaskStateChanged) isEvent_Payload() {} + +func (*Event_TaskStatusChanged) isEvent_Payload() {} + +func (*Event_Tasklaunched) isEvent_Payload() {} + +func (*Event_MesosTaskcreated) isEvent_Payload() {} + +func (*Event_EnvironmentDestroyed) isEvent_Payload() {} + +func (*Event_EnvironmentError) isEvent_Payload() {} + +func (*Event_KilltasksMesos) isEvent_Payload() {} + +type SubscribeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type NewAutoEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } -func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) -} -func (m *NewAutoEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo +func (*SubscribeRequest) ProtoMessage() {} -func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } -func (m *NewAutoEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" +//////////////////////////////////////// +// Framework +//////////////////////////////////////// +type GetFrameworkInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type NewAutoEnvironmentReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoRequest) Reset() { + *x = GetFrameworkInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } -func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} -} -func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (x *GetFrameworkInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err + +func (*GetFrameworkInfoRequest) ProtoMessage() {} + +func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) -} -func (m *NewAutoEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) + +// Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } -var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} -} -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) -} -func (m *GetEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo +func (*Version) ProtoMessage() {} -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} -} -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major } -} -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) -} -func (m *GetEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) + return 0 } -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo - -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor } - return nil + return 0 } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch } - return nil + return 0 } -type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Version) GetBuild() string { + if x != nil { + return x.Build + } + return "" } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} -} -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) GetProductName() string { + if x != nil { + return x.ProductName } -} -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) -} -func (m *ControlEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) + return "" } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo - -func (m *ControlEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *Version) GetVersionStr() string { + if x != nil { + return x.VersionStr } return "" } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { - if m != nil { - return m.Type +type GetFrameworkInfoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *GetFrameworkInfoReply) Reset() { + *x = GetFrameworkInfoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return ControlEnvironmentRequest_NOOP } -type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetFrameworkInfoReply) ProtoMessage() {} + +func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} -func (m *ControlEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *GetFrameworkInfoReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *ControlEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { + if x != nil { + return x.EnvironmentsCount } - return "" + return 0 } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *GetFrameworkInfoReply) GetTasksCount() int32 { + if x != nil { + return x.TasksCount } return 0 } -type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoReply) GetState() string { + if x != nil { + return x.State + } + return "" } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} -} -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetFrameworkInfoReply) GetHostsCount() int32 { + if x != nil { + return x.HostsCount } -} -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) -} -func (m *ModifyEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) + return 0 } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo - -func (m *ModifyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetFrameworkInfoReply) GetInstanceName() string { + if x != nil { + return x.InstanceName } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { - if m != nil { - return m.Operations +func (x *GetFrameworkInfoReply) GetVersion() *Version { + if x != nil { + return x.Version } return nil } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { - if m != nil { - return m.ReconfigureAll - } - return false -} +// Not implemented yet +type TeardownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownRequest) Reset() { + *x = TeardownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) + +func (x *TeardownRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo +func (*TeardownRequest) ProtoMessage() {} -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { - if m != nil { - return m.Type +func (x *TeardownRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return EnvironmentOperation_NOOP + return mi.MessageOf(x) } -func (m *EnvironmentOperation) GetRoleName() string { - if m != nil { - return m.RoleName +// Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} +} + +func (x *TeardownRequest) GetReason() string { + if x != nil { + return x.Reason } return "" } -type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TeardownReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} -} -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownReply) Reset() { + *x = TeardownReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) -} -func (m *ModifyEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) + +func (x *TeardownReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo +func (*TeardownReply) ProtoMessage() {} -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations +func (x *TeardownReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id - } - return "" +// Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. +func (*TeardownReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } -func (m *ModifyEnvironmentReply) GetState() string { - if m != nil { - return m.State +//////////////////////////////////////// +// Environment +//////////////////////////////////////// +type GetEnvironmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetEnvironmentsRequest) Reset() { + *x = GetEnvironmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} -} -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +func (x *GetEnvironmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) -} -func (m *DestroyEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" -} +func (*GetEnvironmentsRequest) ProtoMessage() {} -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks +func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState - } - return false +// Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force - } - return false -} +type GetEnvironmentsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} -} -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsReply) Reset() { + *x = GetEnvironmentsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) -} -func (m *DestroyEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) -} -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo - -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil +func (x *GetEnvironmentsReply) String() string { + return protoimpl.X.MessageStringOf(x) } -//////////////////////////////////////// -// Environment, GET/SET properties -//////////////////////////////////////// -type SetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If properties == nil, the core sets nothing - // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*GetEnvironmentsReply) ProtoMessage() {} -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} -} -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{21} +} -func (m *SetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentsReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if x != nil { + return x.Environments } return nil } -type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type EnvironmentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) Reset() { + *x = EnvironmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) -} -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo - -type GetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If len(queries) == 0, we return an - // empty map. - // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *EnvironmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} -} -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*EnvironmentInfo) ProtoMessage() {} + +func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (x *EnvironmentInfo) GetId() string { + if x != nil { + return x.Id + } + return "" } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +func (x *EnvironmentInfo) GetCreatedWhen() string { + if x != nil { + return x.CreatedWhen + } + return "" +} -func (m *GetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *EnvironmentInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { - if m != nil { - return m.Queries +func (x *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals +func (x *EnvironmentInfo) GetRootRole() string { + if x != nil { + return x.RootRole } - return false + return "" } -type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber + } + return 0 } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} -} -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } + return nil } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -//////////////////////////////////////// -// Tasks -//////////////////////////////////////// -type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` - SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} -} -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } -} -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) -} -func (m *ShortTaskInfo) XXX_Size() int { - return m.Size() -} -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) + return nil } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +type NewEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ShortTaskInfo) GetName() string { - if m != nil { - return m.Name - } - return "" + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId - } - return "" +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State - } - return "" +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } -func (m *ShortTaskInfo) GetClassName() string { - if m != nil { - return m.ClassName +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { - if m != nil { - return m.DeploymentInfo +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *ShortTaskInfo) GetPid() string { - if m != nil { - return m.Pid - } - return "" -} +type NewEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ShortTaskInfo) GetSandboxStdout() string { - if m != nil { - return m.SandboxStdout - } - return "" + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} -} -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) -} -func (m *TaskDeploymentInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo +func (*NewEnvironmentReply) ProtoMessage() {} -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId - } - return "" +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } -func (m *TaskDeploymentInfo) GetOfferId() string { - if m != nil { - return m.OfferId +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } - return "" + return nil } -func (m *TaskDeploymentInfo) GetExecutorId() string { - if m != nil { - return m.ExecutorId +type GetEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetEnvironmentRequest) Reset() { + *x = GetEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type GetTasksRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} -} -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetEnvironmentRequest) ProtoMessage() {} + +func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) -} -func (m *GetTasksRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) + +func (x *GetEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +type GetEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} -} -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) Reset() { + *x = GetEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) -} -func (m *GetTasksReply) XXX_Size() int { - return m.Size() -} -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) + +func (x *GetEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +func (*GetEnvironmentReply) ProtoMessage() {} -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} -} -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } + return nil } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) -} -func (m *GetTaskRequest) XXX_Size() int { - return m.Size() -} -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) + +func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { + if x != nil { + return x.Workflow + } + return nil } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +type ControlEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GetTaskRequest) GetTaskId() string { - if m != nil { - return m.TaskId + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` +} + +func (x *ControlEnvironmentRequest) Reset() { + *x = ControlEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ControlEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} -} -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*ControlEnvironmentRequest) ProtoMessage() {} + +func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) + +// Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } -func (m *GetTaskReply) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) + +func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { + if x != nil { + return x.Type + } + return ControlEnvironmentRequest_NOOP } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +type ControlEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GetTaskReply) GetTask() *TaskInfo { - if m != nil { - return m.Task + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` +} + +func (x *ControlEnvironmentReply) Reset() { + *x = ControlEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ControlEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} -} -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*ControlEnvironmentReply) ProtoMessage() {} + +func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) -} -func (m *TaskClassInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{28} +} -func (m *TaskClassInfo) GetName() string { - if m != nil { - return m.Name +func (x *ControlEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *TaskClassInfo) GetControlMode() string { - if m != nil { - return m.ControlMode +func (x *ControlEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} -} -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } + return 0 } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) + +type ModifyEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` } -func (m *CommandInfo) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentRequest) Reset() { + *x = ModifyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) + +func (x *ModifyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (m *CommandInfo) GetEnv() []string { - if m != nil { - return m.Env +func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell - } - return false +// Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } -func (m *CommandInfo) GetValue() string { - if m != nil { - return m.Value +func (x *ModifyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *CommandInfo) GetArguments() []string { - if m != nil { - return m.Arguments +func (x *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if x != nil { + return x.Operations } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +func (x *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if x != nil { + return x.ReconfigureAll } - return "" + return false } -type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type EnvironmentOperation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} -} -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentOperation) Reset() { + *x = EnvironmentOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) -} -func (m *ChannelInfo) XXX_Size() int { - return m.Size() + +func (x *EnvironmentOperation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) + +func (*EnvironmentOperation) ProtoMessage() {} + +func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +// Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} -func (m *ChannelInfo) GetName() string { - if m != nil { - return m.Name +func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { + if x != nil { + return x.Type } - return "" + return EnvironmentOperation_NOOP } -func (m *ChannelInfo) GetType() string { - if m != nil { - return m.Type +func (x *EnvironmentOperation) GetRoleName() string { + if x != nil { + return x.RoleName } return "" } -func (m *ChannelInfo) GetTarget() string { - if m != nil { - return m.Target +type ModifyEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` +} + +func (x *ModifyEnvironmentReply) Reset() { + *x = ModifyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} -} -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +func (x *ModifyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) -} -func (m *TaskInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { - if m != nil { - return m.ShortInfo - } - return nil -} +func (*ModifyEnvironmentReply) ProtoMessage() {} -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { - if m != nil { - return m.InboundChannels - } - return nil +// Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { - if m != nil { - return m.OutboundChannels +func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { + if x != nil { + return x.FailedOperations } return nil } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { - if m != nil { - return m.CommandInfo +func (x *ModifyEnvironmentReply) GetId() string { + if x != nil { + return x.Id } - return nil + return "" } -func (m *TaskInfo) GetTaskPath() string { - if m != nil { - return m.TaskPath +func (x *ModifyEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *TaskInfo) GetEnvId() string { - if m != nil { - return m.EnvId - } - return "" +type DestroyEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` } -func (m *TaskInfo) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *DestroyEnvironmentRequest) Reset() { + *x = DestroyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *DestroyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} -} -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*DestroyEnvironmentRequest) ProtoMessage() {} + +func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) -} -func (m *CleanupTasksRequest) XXX_Size() int { - return m.Size() -} -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) + +// Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +func (x *DestroyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} -func (m *CleanupTasksRequest) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *DestroyEnvironmentRequest) GetKeepTasks() bool { + if x != nil { + return x.KeepTasks } - return nil + return false } -type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if x != nil { + return x.AllowInRunningState + } + return false } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DestroyEnvironmentRequest) GetForce() bool { + if x != nil { + return x.Force } + return false } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) + +type DestroyEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` } -func (m *CleanupTasksReply) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentReply) Reset() { + *x = DestroyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) + +func (x *DestroyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +func (*DestroyEnvironmentReply) ProtoMessage() {} -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { - if m != nil { - return m.RunningTasks +// Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{33} +} + +func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } //////////////////////////////////////// -// Roles +// Environment, GET/SET properties //////////////////////////////////////// -type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type SetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} -} -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) Reset() { + *x = SetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) -} -func (m *GetRolesRequest) XXX_Size() int { - return m.Size() -} -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetRolesRequest) GetPathSpec() string { - if m != nil { - return m.PathSpec +// Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{34} +} + +func (x *SetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} -} -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) + +type SetEnvironmentPropertiesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *RoleInfo) XXX_Size() int { - return m.Size() + +func (x *SetEnvironmentPropertiesReply) Reset() { + *x = SetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name +func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" +// Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State - } - return "" +type GetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` } -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath +func (x *GetEnvironmentPropertiesRequest) Reset() { + *x = GetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds - } - return nil +func (x *GetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +// Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{36} +} + +func (x *GetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } - return nil + return "" } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *GetEnvironmentPropertiesRequest) GetQueries() []string { + if x != nil { + return x.Queries } return nil } -func (m *RoleInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if x != nil { + return x.ExcludeGlobals } - return nil + return false } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetEnvironmentPropertiesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} -} -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesReply) Reset() { + *x = GetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) -} -func (m *GetRolesReply) XXX_Size() int { - return m.Size() -} -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) + +func (x *GetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (m *GetRolesReply) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +// Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{37} +} + +func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) + +//////////////////////////////////////// +// Tasks +//////////////////////////////////////// +type ShortTaskInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { - return m.Size() + +func (x *ShortTaskInfo) Reset() { + *x = ShortTaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) + +func (x *ShortTaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +func (*ShortTaskInfo) ProtoMessage() {} -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { - if m != nil { - return m.RepoPattern +func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { - if m != nil { - return m.RevisionPattern - } - return "" +// Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { - if m != nil { - return m.AllBranches +func (x *ShortTaskInfo) GetName() string { + if x != nil { + return x.Name } - return false + return "" } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { - if m != nil { - return m.AllTags +func (x *ShortTaskInfo) GetLocked() bool { + if x != nil { + return x.Locked } return false } -type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ShortTaskInfo) GetTaskId() string { + if x != nil { + return x.TaskId } -} -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) -} -func (m *WorkflowTemplateInfo) XXX_Size() int { - return m.Size() -} -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) + return "" } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo - -func (m *WorkflowTemplateInfo) GetRepo() string { - if m != nil { - return m.Repo +func (x *ShortTaskInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { - if m != nil { - return m.Template +func (x *ShortTaskInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { - if m != nil { - return m.Revision +func (x *ShortTaskInfo) GetClassName() string { + if x != nil { + return x.ClassName } return "" } -type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if x != nil { + return x.DeploymentInfo + } + return nil } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} -} -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ShortTaskInfo) GetPid() string { + if x != nil { + return x.Pid } + return "" } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) -} -func (m *GetWorkflowTemplatesReply) XXX_Size() int { - return m.Size() -} -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) -} -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +type TaskDeploymentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` +} -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { - if m != nil { - return m.WorkflowTemplates +func (x *TaskDeploymentInfo) Reset() { + *x = TaskDeploymentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskDeploymentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskDeploymentInfo) ProtoMessage() {} + +func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) -} -func (m *ListReposRequest) XXX_Size() int { - return m.Size() -} -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo - -type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} -} -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskDeploymentInfo) GetHostname() string { + if x != nil { + return x.Hostname } + return "" } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) -} -func (m *RepoInfo) XXX_Size() int { - return m.Size() -} -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name +func (x *TaskDeploymentInfo) GetAgentId() string { + if x != nil { + return x.AgentId } return "" } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default +func (x *TaskDeploymentInfo) GetOfferId() string { + if x != nil { + return x.OfferId } - return false + return "" } -func (m *RepoInfo) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *TaskDeploymentInfo) GetExecutorId() string { + if x != nil { + return x.ExecutorId } return "" } -type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetTasksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} -} -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksRequest) Reset() { + *x = GetTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) + +func (x *GetTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposReply) XXX_Size() int { - return m.Size() + +func (*GetTasksRequest) ProtoMessage() {} + +func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) + +// Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +type GetTasksReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ListReposReply) GetRepos() []*RepoInfo { - if m != nil { - return m.Repos - } - return nil + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` } -func (m *ListReposReply) GetGlobalDefaultRevision() string { - if m != nil { - return m.GlobalDefaultRevision +func (x *GetTasksReply) Reset() { + *x = GetTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} -} -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTasksReply) ProtoMessage() {} + +func (x *GetTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) -} -func (m *AddRepoRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) + +func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks + } + return nil } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo +type GetTaskRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *AddRepoRequest) GetName() string { - if m != nil { - return m.Name - } - return "" + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` } -func (m *AddRepoRequest) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *GetTaskRequest) Reset() { + *x = GetTaskRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTaskRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTaskRequest) ProtoMessage() {} + +func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +// Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{42} +} -func (m *AddRepoReply) GetNewDefaultRevision() string { - if m != nil { - return m.NewDefaultRevision +func (x *GetTaskRequest) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } -func (m *AddRepoReply) GetInfo() string { - if m != nil { - return m.Info +type GetTaskReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` +} + +func (x *GetTaskReply) Reset() { + *x = GetTaskReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTaskReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTaskReply) ProtoMessage() {} + +func (x *GetTaskReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) -} -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (x *GetTaskReply) GetTask() *TaskInfo { + if x != nil { + return x.Task + } + return nil } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +type TaskClassInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` +} -func (m *RemoveRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *TaskClassInfo) Reset() { + *x = TaskClassInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskClassInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} -} -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskClassInfo) ProtoMessage() {} + +func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) + +// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } -func (m *RemoveRepoReply) XXX_Size() int { - return m.Size() + +func (x *TaskClassInfo) GetName() string { + if x != nil { + return x.Name + } + return "" } -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) + +func (x *TaskClassInfo) GetControlMode() string { + if x != nil { + return x.ControlMode + } + return "" } -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo +type CommandInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` +} -func (m *RemoveRepoReply) GetNewDefaultRepo() string { - if m != nil { - return m.NewDefaultRepo +func (x *CommandInfo) Reset() { + *x = CommandInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *CommandInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} -} -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*CommandInfo) ProtoMessage() {} + +func (x *CommandInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) -} -func (m *RefreshReposRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. +func (*CommandInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) + +func (x *CommandInfo) GetEnv() []string { + if x != nil { + return x.Env + } + return nil } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo +func (x *CommandInfo) GetShell() bool { + if x != nil { + return x.Shell + } + return false +} -func (m *RefreshReposRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *CommandInfo) GetValue() string { + if x != nil { + return x.Value } - return 0 + return "" } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *CommandInfo) GetArguments() []string { + if x != nil { + return x.Arguments + } + return nil } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} -} -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CommandInfo) GetUser() string { + if x != nil { + return x.User } + return "" } -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) + +type ChannelInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` } -func (m *SetDefaultRepoRequest) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) Reset() { + *x = ChannelInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) + +func (x *ChannelInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +func (*ChannelInfo) ProtoMessage() {} -func (m *SetDefaultRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *ChannelInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ChannelInfo) GetName() string { + if x != nil { + return x.Name } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) GetType() string { + if x != nil { + return x.Type + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) + +func (x *ChannelInfo) GetTarget() string { + if x != nil { + return x.Target + } + return "" } -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo +type TaskInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *TaskInfo) Reset() { + *x = TaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} -} -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskInfo) ProtoMessage() {} + +func (x *TaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. +func (*TaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) + +func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { + if x != nil { + return x.ShortInfo + } + return nil } -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { - return m.Size() + +func (x *TaskInfo) GetClassInfo() *TaskClassInfo { + if x != nil { + return x.ClassInfo + } + return nil } -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) + +func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { + if x != nil { + return x.InboundChannels + } + return nil } -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo +func (x *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if x != nil { + return x.OutboundChannels + } + return nil +} -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *TaskInfo) GetCommandInfo() *CommandInfo { + if x != nil { + return x.CommandInfo } - return 0 + return nil } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *TaskInfo) GetTaskPath() string { + if x != nil { + return x.TaskPath } return "" } -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskInfo) GetEnvId() string { + if x != nil { + return x.EnvId + } + return "" } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} -} -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskInfo) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) + +type CleanupTasksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` } -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksRequest) Reset() { + *x = CleanupTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) + +func (x *CleanupTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +func (*CleanupTasksRequest) ProtoMessage() {} -func (m *SetRepoDefaultRevisionReply) GetInfo() string { - if m != nil { - return m.Info +func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} -} -func (m *Empty) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) -} -func (m *Empty) XXX_Size() int { - return m.Size() -} -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) -} - -var xxx_messageInfo_Empty proto.InternalMessageInfo - -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") - proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") - proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*Event)(nil), "o2control.Event") - proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") -} - -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2918 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, - 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, - 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, - 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, - 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, - 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, - 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, - 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, - 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, - 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, - 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, - 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, - 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, - 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, - 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, - 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, - 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, - 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, - 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, - 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, - 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, - 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, - 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, - 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, - 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, - 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, - 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, - 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, - 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, - 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, - 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, - 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, - 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, - 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, - 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, - 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, - 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, - 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, - 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, - 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, - 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, - 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, - 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, - 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, - 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, - 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, - 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, - 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, - 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, - 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, - 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, - 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, - 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, - 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, - 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, - 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, - 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, - 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, - 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, - 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, - 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, - 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, - 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, - 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, - 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, - 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, - 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, - 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, - 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, - 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, - 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, - 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, - 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, - 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, - 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, - 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, - 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, - 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, - 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, - 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, - 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, - 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, - 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, - 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, - 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, - 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, - 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, - 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, - 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, - 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, - 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, - 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, - 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, - 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, - 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, - 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, - 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, - 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, - 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, - 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, - 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, - 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, - 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, - 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, - 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, - 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, - 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, - 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, - 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, - 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, - 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, - 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, - 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, - 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, - 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, - 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, - 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, - 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, - 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, - 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, - 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, - 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, - 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, - 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, - 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, - 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, - 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, - 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, - 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, - 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, - 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, - 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, - 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, - 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, - 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, - 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, - 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, - 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, - 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, - 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, - 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, - 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, - 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, - 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, - 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, - 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, - 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, - 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, - 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, - 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, - 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, - 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, - 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, - 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, - 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, - 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, - 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, - 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, - 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, - 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, - 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, - 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, - 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, - 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, - 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, - 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, - 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, - 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, - 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, - 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, - 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, - 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, - 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, - 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, - 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, - 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, - 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, - 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, - 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, - 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, - 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, - 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, - 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, +func (x *CleanupTasksRequest) GetTaskIds() []string { + if x != nil { + return x.TaskIds + } + return nil } -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +type CleanupTasksReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` } -type controlClient struct { - cc *grpc.ClientConn +func (x *CleanupTasksReply) Reset() { + *x = CleanupTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} +func (x *CleanupTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (*CleanupTasksReply) ProtoMessage() {} + +func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return x, nil + return mi.MessageOf(x) } -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +// Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } -type controlTrackStatusClient struct { - grpc.ClientStream +func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { + if x != nil { + return x.KilledTasks + } + return nil } -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { + if x != nil { + return x.RunningTasks } - return m, nil + return nil } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +//////////////////////////////////////// +// Roles +//////////////////////////////////////// +type GetRolesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) Reset() { + *x = GetRolesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *GetRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (*GetRolesRequest) ProtoMessage() {} + +func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) GetEnvId() string { + if x != nil { + return x.EnvId } - return out, nil + return "" } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) GetPathSpec() string { + if x != nil { + return x.PathSpec } - return out, nil + return "" } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RoleInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) Reset() { + *x = RoleInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *RoleInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err +func (*RoleInfo) ProtoMessage() {} + +func (x *RoleInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. +func (*RoleInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetName() string { + if x != nil { + return x.Name } - return out, nil + return "" } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetStatus() string { + if x != nil { + return x.Status } - return out, nil + return "" } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetState() string { + if x != nil { + return x.State } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetFullPath() string { + if x != nil { + return x.FullPath } - return out, nil + return "" } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetTaskIds() []string { + if x != nil { + return x.TaskIds } - return out, nil + return nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } - return out, nil + return nil } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } - return out, nil + return nil } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } - return out, nil + return nil } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } - return out, nil + return nil } -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +type GetRolesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` +} + +func (x *GetRolesReply) Reset() { + *x = GetRolesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return x, nil } -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream +func (x *GetRolesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -type controlSubscribeClient struct { - grpc.ClientStream +func (*GetRolesReply) ProtoMessage() {} + +func (x *GetRolesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +// Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{52} +} + +func (x *GetRolesReply) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } - return m, nil + return nil } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error +type GetWorkflowTemplatesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { +func (x *GetWorkflowTemplatesRequest) Reset() { + *x = GetWorkflowTemplatesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +func (x *GetWorkflowTemplatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") + +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} + +func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") + +// Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") + +func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if x != nil { + return x.RepoPattern + } + return "" } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if x != nil { + return x.RevisionPattern + } + return "" } -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if x != nil { + return x.AllBranches + } + return false } -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { + if x != nil { + return x.AllTags + } + return false } -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") + +type WorkflowTemplateInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") + +func (x *WorkflowTemplateInfo) Reset() { + *x = WorkflowTemplateInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") + +func (x *WorkflowTemplateInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") + +func (*WorkflowTemplateInfo) ProtoMessage() {} + +func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") + +// Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") + +func (x *WorkflowTemplateInfo) GetRepo() string { + if x != nil { + return x.Repo + } + return "" } -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") + +func (x *WorkflowTemplateInfo) GetTemplate() string { + if x != nil { + return x.Template + } + return "" } -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") + +func (x *WorkflowTemplateInfo) GetRevision() string { + if x != nil { + return x.Revision + } + return "" } -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") + +type GetWorkflowTemplatesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") + +func (x *GetWorkflowTemplatesReply) Reset() { + *x = GetWorkflowTemplatesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") + +func (x *GetWorkflowTemplatesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") + +func (*GetWorkflowTemplatesReply) ProtoMessage() {} + +func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") + +// Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") + +func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { + if x != nil { + return x.WorkflowTemplates + } + return nil } -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") + +type ListReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") + +func (x *ListReposRequest) Reset() { + *x = ListReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) +func (x *ListReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func (*ListReposRequest) ProtoMessage() {} + +func (x *ListReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) + return mi.MessageOf(x) } -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream +// Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } -type controlTrackStatusServer struct { - grpc.ServerStream +type RepoInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) +func (x *RepoInfo) Reset() { + *x = RepoInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RepoInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RepoInfo) ProtoMessage() {} + +func (x *RepoInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", +// Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. +func (*RepoInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{57} +} + +func (x *RepoInfo) GetName() string { + if x != nil { + return x.Name } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + return "" +} + +func (x *RepoInfo) GetDefault() bool { + if x != nil { + return x.Default } - return interceptor(ctx, in, info, handler) + return false } -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RepoInfo) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) + return "" +} + +type ListReposReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` +} + +func (x *ListReposReply) Reset() { + *x = ListReposReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", +} + +func (x *ListReposReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReposReply) ProtoMessage() {} + +func (x *ListReposReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. +func (*ListReposReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{58} +} + +func (x *ListReposReply) GetRepos() []*RepoInfo { + if x != nil { + return x.Repos } - return interceptor(ctx, in, info, handler) + return nil } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewAutoEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *ListReposReply) GetGlobalDefaultRevision() string { + if x != nil { + return x.GlobalDefaultRevision } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) + return "" +} + +type AddRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +} + +func (x *AddRepoRequest) Reset() { + *x = AddRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", +} + +func (x *AddRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddRepoRequest) ProtoMessage() {} + +func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{59} +} + +func (x *AddRepoRequest) GetName() string { + if x != nil { + return x.Name } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *AddRepoRequest) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) + return "" +} + +type AddRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` +} + +func (x *AddRepoReply) Reset() { + *x = AddRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", +} + +func (x *AddRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddRepoReply) ProtoMessage() {} + +func (x *AddRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{60} +} + +func (x *AddRepoReply) GetNewDefaultRevision() string { + if x != nil { + return x.NewDefaultRevision } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *AddRepoReply) GetInfo() string { + if x != nil { + return x.Info } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) + return "" +} + +type RemoveRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *RemoveRepoRequest) Reset() { + *x = RemoveRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", +} + +func (x *RemoveRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRepoRequest) ProtoMessage() {} + +func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{61} +} + +func (x *RemoveRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return interceptor(ctx, in, info, handler) + return 0 } -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +type RemoveRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` +} + +func (x *RemoveRepoReply) Reset() { + *x = RemoveRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) +} + +func (x *RemoveRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRepoReply) ProtoMessage() {} + +func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{62} +} + +func (x *RemoveRepoReply) GetNewDefaultRepo() string { + if x != nil { + return x.NewDefaultRepo } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + return "" +} + +type RefreshReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *RefreshReposRequest) Reset() { + *x = RefreshReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return interceptor(ctx, in, info, handler) } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RefreshReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RefreshReposRequest) ProtoMessage() {} + +func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) + return mi.MessageOf(x) +} + +// Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{63} +} + +func (x *RefreshReposRequest) GetIndex() int32 { + if x != nil { + return x.Index } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", + return 0 +} + +type SetDefaultRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *SetDefaultRepoRequest) Reset() { + *x = SetDefaultRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) +} + +func (x *SetDefaultRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetDefaultRepoRequest) ProtoMessage() {} + +func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{64} +} + +func (x *SetDefaultRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) + return 0 +} + +type SetGlobalDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *SetGlobalDefaultRevisionRequest) Reset() { + *x = SetGlobalDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", +} + +func (x *SetGlobalDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{65} +} + +func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", +type SetRepoDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *SetRepoDefaultRevisionRequest) Reset() { + *x = SetRepoDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) +} + +func (x *SetRepoDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{66} +} + +func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if x != nil { + return x.Index } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) + return 0 +} + +func (x *SetRepoDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", + return "" +} + +type SetRepoDefaultRevisionReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` +} + +func (x *SetRepoDefaultRevisionReply) Reset() { + *x = SetRepoDefaultRevisionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) +} + +func (x *SetRepoDefaultRevisionReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{67} +} + +func (x *SetRepoDefaultRevisionReply) GetInfo() string { + if x != nil { + return x.Info } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) + return "" +} + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{68} +} + +var File_protos_o2control_proto protoreflect.FileDescriptor + +var file_protos_o2control_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x6c, 0x0a, 0x1a, 0x45, + 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x13, 0x45, 0x76, 0x5f, + 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x46, + 0x0a, 0x14, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, + 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, + 0x64, 0x22, 0x69, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2c, + 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x15, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, + 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, + 0x64, 0x22, 0x15, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x76, 0x5f, 0x4b, + 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x22, 0x0f, 0x0a, + 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, + 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x6f, + 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, + 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0x86, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x52, 0x0a, + 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x74, + 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, + 0x4f, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, + 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, + 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, + 0x73, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, + 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x58, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, + 0x4b, 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x00, + 0x52, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, + 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xca, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, + 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, + 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, + 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, + 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, + 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0x91, 0x04, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x32, 0xfd, 0x0d, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_o2control_proto_rawDescOnce sync.Once + file_protos_o2control_proto_rawDescData = file_protos_o2control_proto_rawDesc +) + +func file_protos_o2control_proto_rawDescGZIP() []byte { + file_protos_o2control_proto_rawDescOnce.Do(func() { + file_protos_o2control_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_o2control_proto_rawDescData) + }) + return file_protos_o2control_proto_rawDescData +} + +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_protos_o2control_proto_goTypes = []interface{}{ + (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level + (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype + (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentStateChanged)(nil), // 4: o2control.Ev_EnvironmentStateChanged + (*Ev_TaskStateChanged)(nil), // 5: o2control.Ev_TaskStateChanged + (*Ev_TaskStatusChanged)(nil), // 6: o2control.Ev_TaskStatusChanged + (*Ev_TaskLaunched)(nil), // 7: o2control.Ev_TaskLaunched + (*Ev_MesosTaskCreated)(nil), // 8: o2control.Ev_MesosTaskCreated + (*Ev_EnvironmentCreated)(nil), // 9: o2control.Ev_EnvironmentCreated + (*Ev_EnvironmentDestroyed)(nil), // 10: o2control.Ev_EnvironmentDestroyed + (*Ev_EnvironmentError)(nil), // 11: o2control.Ev_EnvironmentError + (*Ev_KillTasksMesos)(nil), // 12: o2control.Ev_KillTasksMesos + (*StatusRequest)(nil), // 13: o2control.StatusRequest + (*StatusReply)(nil), // 14: o2control.StatusReply + (*StatusUpdate)(nil), // 15: o2control.StatusUpdate + (*Event)(nil), // 16: o2control.Event + (*SubscribeRequest)(nil), // 17: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 18: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 19: o2control.Version + (*GetFrameworkInfoReply)(nil), // 20: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 21: o2control.TeardownRequest + (*TeardownReply)(nil), // 22: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 23: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 24: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 25: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 26: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 27: o2control.NewEnvironmentReply + (*GetEnvironmentRequest)(nil), // 28: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 29: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 30: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 31: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 32: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 33: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 34: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 35: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 36: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 44: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 46: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo + (*CommandInfo)(nil), // 48: o2control.CommandInfo + (*ChannelInfo)(nil), // 49: o2control.ChannelInfo + (*TaskInfo)(nil), // 50: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest + (*RoleInfo)(nil), // 54: o2control.RoleInfo + (*GetRolesReply)(nil), // 55: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 59: o2control.ListReposRequest + (*RepoInfo)(nil), // 60: o2control.RepoInfo + (*ListReposReply)(nil), // 61: o2control.ListReposReply + (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 63: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 71: o2control.Empty + nil, // 72: o2control.EnvironmentInfo.DefaultsEntry + nil, // 73: o2control.EnvironmentInfo.VarsEntry + nil, // 74: o2control.EnvironmentInfo.UserVarsEntry + nil, // 75: o2control.NewEnvironmentRequest.VarsEntry + nil, // 76: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 77: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 78: o2control.TaskInfo.PropertiesEntry + nil, // 79: o2control.RoleInfo.DefaultsEntry + nil, // 80: o2control.RoleInfo.VarsEntry + nil, // 81: o2control.RoleInfo.UserVarsEntry +} +var file_protos_o2control_proto_depIdxs = []int32{ + 25, // 0: o2control.Ev_EnvironmentCreated.environment:type_name -> o2control.EnvironmentInfo + 52, // 1: o2control.Ev_EnvironmentDestroyed.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 15, // 2: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 3: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 4: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 5: o2control.Event.environmentStateChanged:type_name -> o2control.Ev_EnvironmentStateChanged + 9, // 6: o2control.Event.environmentCreated:type_name -> o2control.Ev_EnvironmentCreated + 5, // 7: o2control.Event.taskStateChanged:type_name -> o2control.Ev_TaskStateChanged + 6, // 8: o2control.Event.taskStatusChanged:type_name -> o2control.Ev_TaskStatusChanged + 7, // 9: o2control.Event.tasklaunched:type_name -> o2control.Ev_TaskLaunched + 8, // 10: o2control.Event.mesosTaskcreated:type_name -> o2control.Ev_MesosTaskCreated + 10, // 11: o2control.Event.environmentDestroyed:type_name -> o2control.Ev_EnvironmentDestroyed + 11, // 12: o2control.Event.environmentError:type_name -> o2control.Ev_EnvironmentError + 12, // 13: o2control.Event.killtasksMesos:type_name -> o2control.Ev_KillTasksMesos + 19, // 14: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 25, // 15: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 41, // 16: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 72, // 17: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 73, // 18: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 74, // 19: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 75, // 20: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 25, // 21: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 25, // 22: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 54, // 23: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 24: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 33, // 25: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 26: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 33, // 27: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 52, // 28: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 76, // 29: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 77, // 30: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 31: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 41, // 32: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 50, // 33: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 41, // 34: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 47, // 35: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 49, // 36: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 49, // 37: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 48, // 38: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 78, // 39: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 41, // 40: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 41, // 41: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 54, // 42: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 79, // 43: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 80, // 44: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 81, // 45: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 54, // 46: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 57, // 47: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 48: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 13, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 18, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 21, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 23, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 26, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 28, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 30, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 32, // 56: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 35, // 57: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 43, // 58: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 59: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 60: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 61: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 62: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 63: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 64: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 65: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 66: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 67: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 68: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 69: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 17, // 70: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 14, // 71: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 20, // 72: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 22, // 73: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 24, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 27, // 75: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 29, // 76: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 31, // 77: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 34, // 78: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 36, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 44, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 16, // 92: o2control.Control.Subscribe:output_type -> o2control.Event + 71, // [71:93] is the sub-list for method output_type + 49, // [49:71] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name +} + +func init() { file_protos_o2control_proto_init() } +func file_protos_o2control_proto_init() { + if File_protos_o2control_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event_MesosHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentStateChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskStateChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskStatusChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskLaunched); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_MesosTaskCreated); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentCreated); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentDestroyed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_KillTasksMesos); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentOperation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShortTaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskDeploymentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskClassInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplateInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RepoInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RefreshReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetDefaultRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_o2control_proto_msgTypes[12].OneofWrappers = []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return interceptor(ctx, in, info, handler) + file_protos_o2control_proto_msgTypes[13].OneofWrappers = []interface{}{ + (*Event_EnvironmentStateChanged)(nil), + (*Event_EnvironmentCreated)(nil), + (*Event_TaskStateChanged)(nil), + (*Event_TaskStatusChanged)(nil), + (*Event_Tasklaunched)(nil), + (*Event_MesosTaskcreated)(nil), + (*Event_EnvironmentDestroyed)(nil), + (*Event_EnvironmentError)(nil), + (*Event_KilltasksMesos)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_o2control_proto_rawDesc, + NumEnums: 3, + NumMessages: 79, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_o2control_proto_goTypes, + DependencyIndexes: file_protos_o2control_proto_depIdxs, + EnumInfos: file_protos_o2control_proto_enumTypes, + MessageInfos: file_protos_o2control_proto_msgTypes, + }.Build() + File_protos_o2control_proto = out.File + file_protos_o2control_proto_rawDesc = nil + file_protos_o2control_proto_goTypes = nil + file_protos_o2control_proto_depIdxs = nil } -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc grpc.ClientConnInterface +} + +func NewControlClient(cc grpc.ClientConnInterface) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return x, nil } -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) + return m, nil } -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { + return nil, err } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", + return out, nil } -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil } -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x22 - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvironmentId) > 0 { - i -= len(m.EnvironmentId) - copy(dAtA[i:], m.EnvironmentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RolePath) > 0 { - i -= len(m.RolePath) - copy(dAtA[i:], m.RolePath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { + return nil, err } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return len(dAtA) - i, nil + return x, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream } -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil +type controlSubscribeClient struct { + grpc.ClientStream } -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - return dAtA[:n], nil + return m, nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ControlServer is the server API for Control service. +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { } -func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") } - -func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentEvent != nil { - { - size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") } -func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") } - -func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskEvent != nil { - { - size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } - -func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.RoleEvent != nil { - { - size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") } -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") } - -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") } - -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } - -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") } - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") } - -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") } - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") } - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") } - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") } - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") } - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") } - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") } - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") } - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (*UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func RegisterControlServer(s *grpc.Server, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) } -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) } -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream } -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlTrackStatusServer struct { + grpc.ServerStream } -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) } -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { + return interceptor(ctx, in, info, handler) +} + +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) } - if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) } - return len(dAtA) - i, nil -} - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.SandboxStdout) > 0 { - i -= len(m.SandboxStdout) - copy(dAtA[i:], m.SandboxStdout) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) - i-- - dAtA[i] = 0x4a +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.Pid) > 0 { - i -= len(m.Pid) - copy(dAtA[i:], m.Pid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) - i-- - dAtA[i] = 0x42 + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) } - return dAtA[:n], nil -} - -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", } - return len(dAtA) - i, nil -} - -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) } - return dAtA[:n], nil + return interceptor(ctx, in, info, handler) } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlSubscribeServer struct { + grpc.ServerStream } -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ShortInfo != nil { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", } - -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x1a - } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x12 - } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Empty) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvironmentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RolePath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Timestamp) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Payload != nil { - n += m.Payload.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Event_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentEvent != nil { - l = m.EnvironmentEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskEvent != nil { - l = m.TaskEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.RoleEvent != nil { - l = m.RoleEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Version) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) - } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) - } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) - } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ReconfigureAll { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ExcludeGlobals { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Pid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.SandboxStdout) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.AllBranches { - n += 2 - } - if m.AllTags { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *WorkflowTemplateInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Repo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Template) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RepoInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.GlobalDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RefreshReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetDefaultRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvironmentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_RoleEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_RoleEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_RoleEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RolePath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control - } - 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: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control - } - 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: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusUpdate) 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 ErrIntOverflowO2Control - } - 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: StatusUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -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 ErrIntOverflowO2Control - } - 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 Timestamp", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timestamp = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentEvent{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskEvent{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_RoleEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_RoleEvent{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SubscribeRequest) 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 ErrIntOverflowO2Control - } - 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: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Version) 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 ErrIntOverflowO2Control - } - 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: Version: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProductName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VersionStr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) - } - m.EnvironmentsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) - } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) - } - m.HostsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InstanceName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownRequest) 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 ErrIntOverflowO2Control - } - 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: TeardownRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - 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: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentInfo) 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 ErrIntOverflowO2Control - } - 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: EnvironmentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-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 RootRole", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReconfigureAll = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentOperation) 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 ErrIntOverflowO2Control - } - 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: EnvironmentOperation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RoleName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.KeepTasks = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowInRunningState = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Force = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} - } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExcludeGlobals = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ShortTaskInfo) 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 ErrIntOverflowO2Control - } - 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: ShortTaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ShortTaskInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Locked", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Locked = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeploymentInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DeploymentInfo == nil { - m.DeploymentInfo = &TaskDeploymentInfo{} - } - if err := m.DeploymentInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SandboxStdout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskDeploymentInfo) 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 ErrIntOverflowO2Control - } - 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: TaskDeploymentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskDeploymentInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AgentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OfferId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExecutorId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksRequest) 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 ErrIntOverflowO2Control - } - 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: GetTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksReply) 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 ErrIntOverflowO2Control - } - 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: GetTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskRequest) 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 ErrIntOverflowO2Control - } - 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: GetTaskRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskReply) 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 ErrIntOverflowO2Control - } - 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: GetTaskReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Task", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Task == nil { - m.Task = &TaskInfo{} - } - if err := m.Task.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskClassInfo) 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 ErrIntOverflowO2Control - } - 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: TaskClassInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskClassInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 ControlMode", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ControlMode = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommandInfo) 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 ErrIntOverflowO2Control - } - 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: CommandInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommandInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Shell", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Shell = bool(v != 0) - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ChannelInfo) 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 ErrIntOverflowO2Control - } - 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: ChannelInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChannelInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Target = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskInfo) 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 ErrIntOverflowO2Control - } - 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: TaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShortInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ShortInfo == nil { - m.ShortInfo = &ShortTaskInfo{} - } - if err := m.ShortInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClassInfo == nil { - m.ClassInfo = &TaskClassInfo{} - } - if err := m.ClassInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InboundChannels = append(m.InboundChannels, &ChannelInfo{}) - if err := m.InboundChannels[len(m.InboundChannels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OutboundChannels = append(m.OutboundChannels, &ChannelInfo{}) - if err := m.OutboundChannels[len(m.OutboundChannels)-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 CommandInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CommandInfo == nil { - m.CommandInfo = &CommandInfo{} - } - if err := m.CommandInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksRequest) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksReply) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RunningTasks = append(m.RunningTasks, &ShortTaskInfo{}) - if err := m.RunningTasks[len(m.RunningTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesRequest) 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 ErrIntOverflowO2Control - } - 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: GetRolesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PathSpec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PathSpec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RoleInfo) 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 ErrIntOverflowO2Control - } - 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: RoleInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RoleInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FullPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesReply) 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 ErrIntOverflowO2Control - } - 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: GetRolesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesRequest) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RepoPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RevisionPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllBranches = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllTags = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WorkflowTemplateInfo) 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 ErrIntOverflowO2Control - } - 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: WorkflowTemplateInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WorkflowTemplateInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Template = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesReply) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplates = append(m.WorkflowTemplates, &WorkflowTemplateInfo{}) - if err := m.WorkflowTemplates[len(m.WorkflowTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposRequest) 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 ErrIntOverflowO2Control - } - 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: ListReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RepoInfo) 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 ErrIntOverflowO2Control - } - 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: RepoInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RepoInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Default = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposReply) 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 ErrIntOverflowO2Control - } - 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: ListReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repos", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repos = append(m.Repos, &RepoInfo{}) - if err := m.Repos[len(m.Repos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoRequest) 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 ErrIntOverflowO2Control - } - 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: AddRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoRequest: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoRequest) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoReply) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRepo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefreshReposRequest) 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 ErrIntOverflowO2Control - } - 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: RefreshReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetDefaultRepoRequest) 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 ErrIntOverflowO2Control - } - 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: SetDefaultRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetGlobalDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Empty) 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 ErrIntOverflowO2Control - } - 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: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipO2Control(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthO2Control - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") -) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 3194363ff..9b49a124d 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1,30 +1,56 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 // source: protos/o2control.proto package pb import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StatusUpdate_Level int32 @@ -35,26 +61,47 @@ const ( StatusUpdate_ERROR StatusUpdate_Level = 3 ) -var StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", -} +// Enum value maps for StatusUpdate_Level. +var ( + StatusUpdate_Level_name = map[int32]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + } + StatusUpdate_Level_value = map[string]int32{ + "DEBUG": 0, + "INFO": 1, + "WARNING": 2, + "ERROR": 3, + } +) -var StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, +func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { + p := new(StatusUpdate_Level) + *p = x + return p } func (x StatusUpdate_Level) String() string { - return proto.EnumName(StatusUpdate_Level_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[0].Descriptor() } +func (StatusUpdate_Level) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[0] +} + +func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{12, 0} } type ControlEnvironmentRequest_Optype int32 @@ -68,30 +115,51 @@ const ( ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 ) -var ControlEnvironmentRequest_Optype_name = map[int32]string{ - 0: "NOOP", - 1: "START_ACTIVITY", - 2: "STOP_ACTIVITY", - 3: "CONFIGURE", - 4: "RESET", - 5: "GO_ERROR", -} +// Enum value maps for ControlEnvironmentRequest_Optype. +var ( + ControlEnvironmentRequest_Optype_name = map[int32]string{ + 0: "NOOP", + 1: "START_ACTIVITY", + 2: "STOP_ACTIVITY", + 3: "CONFIGURE", + 4: "RESET", + 5: "GO_ERROR", + } + ControlEnvironmentRequest_Optype_value = map[string]int32{ + "NOOP": 0, + "START_ACTIVITY": 1, + "STOP_ACTIVITY": 2, + "CONFIGURE": 3, + "RESET": 4, + "GO_ERROR": 5, + } +) -var ControlEnvironmentRequest_Optype_value = map[string]int32{ - "NOOP": 0, - "START_ACTIVITY": 1, - "STOP_ACTIVITY": 2, - "CONFIGURE": 3, - "RESET": 4, - "GO_ERROR": 5, +func (x ControlEnvironmentRequest_Optype) Enum() *ControlEnvironmentRequest_Optype { + p := new(ControlEnvironmentRequest_Optype) + *p = x + return p } func (x ControlEnvironmentRequest_Optype) String() string { - return proto.EnumName(ControlEnvironmentRequest_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } +func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() +} + +func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] +} + +func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{27, 0} } type EnvironmentOperation_Optype int32 @@ -102,19201 +170,6685 @@ const ( EnvironmentOperation_ADD_ROLE EnvironmentOperation_Optype = 4 ) -var EnvironmentOperation_Optype_name = map[int32]string{ - 0: "NOOP", - 3: "REMOVE_ROLE", - 4: "ADD_ROLE", -} +// Enum value maps for EnvironmentOperation_Optype. +var ( + EnvironmentOperation_Optype_name = map[int32]string{ + 0: "NOOP", + 3: "REMOVE_ROLE", + 4: "ADD_ROLE", + } + EnvironmentOperation_Optype_value = map[string]int32{ + "NOOP": 0, + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, + } +) -var EnvironmentOperation_Optype_value = map[string]int32{ - "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } func (x EnvironmentOperation_Optype) String() string { - return proto.EnumName(EnvironmentOperation_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() +} + +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] +} + +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{30, 0} } type Event_MesosHeartbeat struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *Event_MesosHeartbeat) Reset() { *m = Event_MesosHeartbeat{} } -func (m *Event_MesosHeartbeat) String() string { return proto.CompactTextString(m) } -func (*Event_MesosHeartbeat) ProtoMessage() {} -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{0} -} -func (m *Event_MesosHeartbeat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event_MesosHeartbeat) Reset() { + *x = Event_MesosHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event_MesosHeartbeat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event_MesosHeartbeat.Merge(m, src) -} -func (m *Event_MesosHeartbeat) XXX_Size() int { - return m.Size() -} -func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { - xxx_messageInfo_Event_MesosHeartbeat.DiscardUnknown(m) + +func (x *Event_MesosHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo +func (*Event_MesosHeartbeat) ProtoMessage() {} -type Ev_EnvironmentEvent struct { - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } -func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{1} +// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. +func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) + +type Ev_EnvironmentStateChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` + Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` + Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` } -func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil + +func (x *Ev_EnvironmentStateChanged) Reset() { + *x = Ev_EnvironmentStateChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) -} -func (m *Ev_EnvironmentEvent) XXX_Size() int { - return m.Size() -} -func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) + +func (x *Ev_EnvironmentStateChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo +func (*Ev_EnvironmentStateChanged) ProtoMessage() {} -func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { - if m != nil { - return m.EnvironmentId +func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_EnvironmentEvent) GetState() string { - if m != nil { - return m.State - } - return "" +// Deprecated: Use Ev_EnvironmentStateChanged.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{1} } -func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Ev_EnvironmentStateChanged) GetEvent() string { + if x != nil { + return x.Event } - return 0 + return "" } -func (m *Ev_EnvironmentEvent) GetError() string { - if m != nil { - return m.Error +func (x *Ev_EnvironmentStateChanged) GetSource() string { + if x != nil { + return x.Source } return "" } -func (m *Ev_EnvironmentEvent) GetMessage() string { - if m != nil { - return m.Message +func (x *Ev_EnvironmentStateChanged) GetDestination() string { + if x != nil { + return x.Destination } return "" } -type Ev_TaskEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } -func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskEvent) ProtoMessage() {} -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskEvent.Merge(m, src) +type Ev_TaskStateChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } -func (m *Ev_TaskEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_TaskStateChanged) Reset() { + *x = Ev_TaskStateChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_TaskEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) + +func (x *Ev_TaskStateChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +func (*Ev_TaskStateChanged) ProtoMessage() {} -func (m *Ev_TaskEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskStateChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_TaskEvent) GetTaskid() string { - if m != nil { - return m.Taskid - } - return "" +// Deprecated: Use Ev_TaskStateChanged.ProtoReflect.Descriptor instead. +func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } -func (m *Ev_TaskEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskStateChanged) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_TaskEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_TaskStateChanged) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_TaskEvent) GetHostname() string { - if m != nil { - return m.Hostname - } - return "" -} +type Ev_TaskStatusChanged struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Ev_TaskEvent) GetClassName() string { - if m != nil { - return m.ClassName - } - return "" + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` } -type Ev_RoleEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } -func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_RoleEvent) ProtoMessage() {} -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} -} -func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_TaskStatusChanged) Reset() { + *x = Ev_TaskStatusChanged{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_RoleEvent.Merge(m, src) -} -func (m *Ev_RoleEvent) XXX_Size() int { - return m.Size() -} -func (m *Ev_RoleEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) + +func (x *Ev_TaskStatusChanged) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo +func (*Ev_TaskStatusChanged) ProtoMessage() {} -func (m *Ev_RoleEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Ev_RoleEvent) GetStatus() string { - if m != nil { - return m.Status - } - return "" +// Deprecated: Use Ev_TaskStatusChanged.ProtoReflect.Descriptor instead. +func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } -func (m *Ev_RoleEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskStatusChanged) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_RoleEvent) GetRolePath() string { - if m != nil { - return m.RolePath +func (x *Ev_TaskStatusChanged) GetStatus() string { + if x != nil { + return x.Status } return "" } -//////////////////////////////////////// -// Global status -//////////////////////////////////////// -type StatusRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Ev_TaskLaunched struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_TaskLaunched) Reset() { + *x = Ev_TaskLaunched{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) -} -func (m *StatusRequest) XXX_Size() int { - return m.Size() -} -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo -type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Ev_TaskLaunched) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} -} -func (m *StatusReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*Ev_TaskLaunched) ProtoMessage() {} + +func (x *Ev_TaskLaunched) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) -} -func (m *StatusReply) XXX_Size() int { - return m.Size() -} -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +// Deprecated: Use Ev_TaskLaunched.ProtoReflect.Descriptor instead. +func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{4} +} -func (m *StatusReply) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskLaunched) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { - if m != nil { - return m.StatusUpdates - } - return nil -} +type Ev_MesosTaskCreated struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type StatusUpdate struct { - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` + ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Ev_MesosTaskCreated) Reset() { + *x = Ev_MesosTaskCreated{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) -} -func (m *StatusUpdate) XXX_Size() int { - return m.Size() -} -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) + +func (x *Ev_MesosTaskCreated) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo +func (*Ev_MesosTaskCreated) ProtoMessage() {} -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int +func (x *Ev_MesosTaskCreated) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +// Deprecated: Use Ev_MesosTaskCreated.ProtoReflect.Descriptor instead. +func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} - -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { - if m != nil { - return m.Event +func (x *Ev_MesosTaskCreated) GetTaskresources() string { + if x != nil { + return x.Taskresources } - return nil + return "" } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { - if m != nil { - return m.Level +func (x *Ev_MesosTaskCreated) GetExecutorResources() string { + if x != nil { + return x.ExecutorResources } - return StatusUpdate_DEBUG + return "" } -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil +type Ev_EnvironmentCreated struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), +func (x *Ev_EnvironmentCreated) Reset() { + *x = Ev_EnvironmentCreated{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -type Event struct { - Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are valid to be assigned to Payload: - // *Event_EnvironmentEvent - // *Event_TaskEvent - // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Event) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Ev_EnvironmentCreated) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_EnvironmentCreated) ProtoMessage() {} + +func (x *Ev_EnvironmentCreated) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) -} -func (m *Event) XXX_Size() int { - return m.Size() + +// Deprecated: Use Ev_EnvironmentCreated.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) + +func (x *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment + } + return nil } -var xxx_messageInfo_Event proto.InternalMessageInfo +type Ev_EnvironmentDestroyed struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type isEvent_Payload interface { - isEvent_Payload() - MarshalTo([]byte) (int, error) - Size() int + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` -} -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` +func (x *Ev_EnvironmentDestroyed) Reset() { + *x = Ev_EnvironmentDestroyed{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` + +func (x *Ev_EnvironmentDestroyed) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_RoleEvent) isEvent_Payload() {} +func (*Ev_EnvironmentDestroyed) ProtoMessage() {} -func (m *Event) GetPayload() isEvent_Payload { - if m != nil { - return m.Payload +func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *Event) GetTimestamp() string { - if m != nil { - return m.Timestamp - } - return "" +// Deprecated: Use Ev_EnvironmentDestroyed.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } -func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { - return x.EnvironmentEvent +func (x *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } -func (m *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := m.GetPayload().(*Event_TaskEvent); ok { - return x.TaskEvent +func (x *Ev_EnvironmentDestroyed) GetEnvironmentid() string { + if x != nil { + return x.Environmentid } - return nil + return "" } -func (m *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := m.GetPayload().(*Event_RoleEvent); ok { - return x.RoleEvent - } - return nil +type Ev_EnvironmentError struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Event) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), +func (x *Ev_EnvironmentError) Reset() { + *x = Ev_EnvironmentError{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -type SubscribeRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Ev_EnvironmentError) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } -func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } -func (*SubscribeRequest) ProtoMessage() {} -func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*Ev_EnvironmentError) ProtoMessage() {} + +func (x *Ev_EnvironmentError) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_EnvironmentError.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{8} } -func (m *SubscribeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SubscribeRequest.Merge(m, src) + +type Ev_KillTasksMesos struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *SubscribeRequest) XXX_Size() int { - return m.Size() + +func (x *Ev_KillTasksMesos) Reset() { + *x = Ev_KillTasksMesos{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SubscribeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) + +func (x *Ev_KillTasksMesos) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +func (*Ev_KillTasksMesos) ProtoMessage() {} -func (m *SubscribeRequest) GetId() string { - if m != nil { - return m.Id +func (x *Ev_KillTasksMesos) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_KillTasksMesos.ProtoReflect.Descriptor instead. +func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } //////////////////////////////////////// -// Framework +// Global status //////////////////////////////////////// -type GetFrameworkInfoRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type StatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) -} -func (m *GetFrameworkInfoRequest) XXX_Size() int { - return m.Size() -} -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +func (*StatusRequest) ProtoMessage() {} -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} -} -func (m *Version) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) -} -func (m *Version) XXX_Size() int { - return m.Size() -} -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } -var xxx_messageInfo_Version proto.InternalMessageInfo +type StatusReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *Version) GetMajor() int32 { - if m != nil { - return m.Major - } - return 0 + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` } -func (m *Version) GetMinor() int32 { - if m != nil { - return m.Minor +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch - } - return 0 +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName - } - return "" +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } -func (m *Version) GetVersionStr() string { - if m != nil { - return m.VersionStr +func (x *StatusReply) GetState() string { + if x != nil { + return x.State } return "" } -type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} -} -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { + if x != nil { + return x.StatusUpdates } + return nil } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) + +type StatusUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` + // Types that are assignable to Event: + // *StatusUpdate_MesosHeartbeat + Event isStatusUpdate_Event `protobuf_oneof:"Event"` } -func (m *GetFrameworkInfoReply) XXX_Size() int { - return m.Size() + +func (x *StatusUpdate) Reset() { + *x = StatusUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) + +func (x *StatusUpdate) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +func (*StatusUpdate) ProtoMessage() {} -func (m *GetFrameworkInfoReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *StatusUpdate) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { - if m != nil { - return m.EnvironmentsCount - } - return 0 +// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount +func (x *StatusUpdate) GetLevel() StatusUpdate_Level { + if x != nil { + return x.Level } - return 0 + return StatusUpdate_DEBUG } -func (m *GetFrameworkInfoReply) GetState() string { +func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { - return m.State + return m.Event } - return "" + return nil } -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount - } - return 0 -} - -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName - } - return "" -} - -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version +func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { + return x.MesosHeartbeat } return nil } -// Not implemented yet -type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type isStatusUpdate_Event interface { + isStatusUpdate_Event() } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} -} -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) -} -func (m *TeardownRequest) XXX_Size() int { - return m.Size() -} -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason - } - return "" -} +type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type TeardownReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Types that are assignable to Payload: + // *Event_EnvironmentStateChanged + // *Event_EnvironmentCreated + // *Event_TaskStateChanged + // *Event_TaskStatusChanged + // *Event_Tasklaunched + // *Event_MesosTaskcreated + // *Event_EnvironmentDestroyed + // *Event_EnvironmentError + // *Event_KilltasksMesos + Payload isEvent_Payload `protobuf_oneof:"Payload"` } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} -} -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) -} -func (m *TeardownReply) XXX_Size() int { - return m.Size() -} -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) -} - -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo - -//////////////////////////////////////// -// Environment -//////////////////////////////////////// -type GetEnvironmentsRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} -} -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) -} -func (m *GetEnvironmentsRequest) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo - -type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*Event) ProtoMessage() {} -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} -} -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) -} -func (m *GetEnvironmentsReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{13} +} -func (m *GetEnvironmentsReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { +func (m *Event) GetPayload() isEvent_Payload { if m != nil { - return m.Environments + return m.Payload } return nil } -type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} -} -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) -} -func (m *EnvironmentInfo) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo - -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id +func (x *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { + if x, ok := x.GetPayload().(*Event_EnvironmentStateChanged); ok { + return x.EnvironmentStateChanged } - return "" + return nil } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen +func (x *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { + if x, ok := x.GetPayload().(*Event_EnvironmentCreated); ok { + return x.EnvironmentCreated } - return "" + return nil } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State +func (x *Event) GetTaskStateChanged() *Ev_TaskStateChanged { + if x, ok := x.GetPayload().(*Event_TaskStateChanged); ok { + return x.TaskStateChanged } - return "" + return nil } -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { + if x, ok := x.GetPayload().(*Event_TaskStatusChanged); ok { + return x.TaskStatusChanged } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole +func (x *Event) GetTasklaunched() *Ev_TaskLaunched { + if x, ok := x.GetPayload().(*Event_Tasklaunched); ok { + return x.Tasklaunched } - return "" + return nil } -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { + if x, ok := x.GetPayload().(*Event_MesosTaskcreated); ok { + return x.MesosTaskcreated } - return 0 + return nil } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { + if x, ok := x.GetPayload().(*Event_EnvironmentDestroyed); ok { + return x.EnvironmentDestroyed } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *Event) GetEnvironmentError() *Ev_EnvironmentError { + if x, ok := x.GetPayload().(*Event_EnvironmentError); ok { + return x.EnvironmentError } return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *Event) GetKilltasksMesos() *Ev_KillTasksMesos { + if x, ok := x.GetPayload().(*Event_KilltasksMesos); ok { + return x.KilltasksMesos } return nil } -type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type isEvent_Payload interface { + isEvent_Payload() } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) -} -func (m *NewEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) +type Event_EnvironmentStateChanged struct { + EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof"` } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +type Event_EnvironmentCreated struct { + EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof"` +} -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate - } - return "" +type Event_TaskStateChanged struct { + TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof"` } -func (m *NewEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil +type Event_TaskStatusChanged struct { + TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof"` } -type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type Event_Tasklaunched struct { + Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof"` } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} -} -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +type Event_MesosTaskcreated struct { + MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) + +type Event_EnvironmentDestroyed struct { + EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +type Event_EnvironmentError struct { + EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof"` } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +type Event_KilltasksMesos struct { + KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof"` } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +func (*Event_EnvironmentStateChanged) isEvent_Payload() {} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment - } - return nil +func (*Event_EnvironmentCreated) isEvent_Payload() {} + +func (*Event_TaskStateChanged) isEvent_Payload() {} + +func (*Event_TaskStatusChanged) isEvent_Payload() {} + +func (*Event_Tasklaunched) isEvent_Payload() {} + +func (*Event_MesosTaskcreated) isEvent_Payload() {} + +func (*Event_EnvironmentDestroyed) isEvent_Payload() {} + +func (*Event_EnvironmentError) isEvent_Payload() {} + +func (*Event_KilltasksMesos) isEvent_Payload() {} + +type SubscribeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type NewAutoEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } -func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) -} -func (m *NewAutoEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo +func (*SubscribeRequest) ProtoMessage() {} -func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars - } - return nil +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } -func (m *NewAutoEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" +//////////////////////////////////////// +// Framework +//////////////////////////////////////// +type GetFrameworkInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type NewAutoEnvironmentReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoRequest) Reset() { + *x = GetFrameworkInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } -func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} -} -func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) +func (x *GetFrameworkInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err + +func (*GetFrameworkInfoRequest) ProtoMessage() {} + +func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) -} -func (m *NewAutoEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) + +// Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } -var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} -} -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) -} -func (m *GetEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo +func (*Version) ProtoMessage() {} -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} -} -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major } -} -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) -} -func (m *GetEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) + return 0 } -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo - -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor } - return nil + return 0 } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch } - return nil + return 0 } -type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *Version) GetBuild() string { + if x != nil { + return x.Build + } + return "" } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} -} -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Version) GetProductName() string { + if x != nil { + return x.ProductName } -} -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) -} -func (m *ControlEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) + return "" } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo - -func (m *ControlEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *Version) GetVersionStr() string { + if x != nil { + return x.VersionStr } return "" } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { - if m != nil { - return m.Type +type GetFrameworkInfoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *GetFrameworkInfoReply) Reset() { + *x = GetFrameworkInfoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return ControlEnvironmentRequest_NOOP } -type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetFrameworkInfoReply) ProtoMessage() {} + +func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} -func (m *ControlEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *GetFrameworkInfoReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *ControlEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { + if x != nil { + return x.EnvironmentsCount } - return "" + return 0 } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *GetFrameworkInfoReply) GetTasksCount() int32 { + if x != nil { + return x.TasksCount } return 0 } -type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetFrameworkInfoReply) GetState() string { + if x != nil { + return x.State + } + return "" } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} -} -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetFrameworkInfoReply) GetHostsCount() int32 { + if x != nil { + return x.HostsCount } -} -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) -} -func (m *ModifyEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) + return 0 } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo - -func (m *ModifyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetFrameworkInfoReply) GetInstanceName() string { + if x != nil { + return x.InstanceName } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { - if m != nil { - return m.Operations +func (x *GetFrameworkInfoReply) GetVersion() *Version { + if x != nil { + return x.Version } return nil } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { - if m != nil { - return m.ReconfigureAll - } - return false -} +// Not implemented yet +type TeardownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownRequest) Reset() { + *x = TeardownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() -} -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) + +func (x *TeardownRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo +func (*TeardownRequest) ProtoMessage() {} -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { - if m != nil { - return m.Type +func (x *TeardownRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return EnvironmentOperation_NOOP + return mi.MessageOf(x) } -func (m *EnvironmentOperation) GetRoleName() string { - if m != nil { - return m.RoleName +// Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} +} + +func (x *TeardownRequest) GetReason() string { + if x != nil { + return x.Reason } return "" } -type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type TeardownReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} -} -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownReply) Reset() { + *x = TeardownReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) -} -func (m *ModifyEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) + +func (x *TeardownReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo +func (*TeardownReply) ProtoMessage() {} -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations +func (x *TeardownReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id - } - return "" +// Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. +func (*TeardownReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } -func (m *ModifyEnvironmentReply) GetState() string { - if m != nil { - return m.State +//////////////////////////////////////// +// Environment +//////////////////////////////////////// +type GetEnvironmentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetEnvironmentsRequest) Reset() { + *x = GetEnvironmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} -} -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +func (x *GetEnvironmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) -} -func (m *DestroyEnvironmentRequest) XXX_Size() int { - return m.Size() -} -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id - } - return "" -} +func (*GetEnvironmentsRequest) ProtoMessage() {} -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks +func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return false + return mi.MessageOf(x) } -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState - } - return false +// Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force - } - return false -} +type GetEnvironmentsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} -} -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsReply) Reset() { + *x = GetEnvironmentsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) -} -func (m *DestroyEnvironmentReply) XXX_Size() int { - return m.Size() -} -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) -} -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo - -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply - } - return nil +func (x *GetEnvironmentsReply) String() string { + return protoimpl.X.MessageStringOf(x) } -//////////////////////////////////////// -// Environment, GET/SET properties -//////////////////////////////////////// -type SetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If properties == nil, the core sets nothing - // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*GetEnvironmentsReply) ProtoMessage() {} -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} -} -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{21} +} -func (m *SetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentsReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if x != nil { + return x.Environments } return nil } -type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type EnvironmentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) Reset() { + *x = EnvironmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) -} -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo - -type GetEnvironmentPropertiesRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - // If len(queries) == 0, we return an - // empty map. - // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *EnvironmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} -} -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*EnvironmentInfo) ProtoMessage() {} + +func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (x *EnvironmentInfo) GetId() string { + if x != nil { + return x.Id + } + return "" } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +func (x *EnvironmentInfo) GetCreatedWhen() string { + if x != nil { + return x.CreatedWhen + } + return "" +} -func (m *GetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *EnvironmentInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { - if m != nil { - return m.Queries +func (x *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals +func (x *EnvironmentInfo) GetRootRole() string { + if x != nil { + return x.RootRole } - return false + return "" } -type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber + } + return 0 } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} -} -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } + return nil } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() -} -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) -} - -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -//////////////////////////////////////// -// Tasks -//////////////////////////////////////// -type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` - SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} -} -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } -} -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) -} -func (m *ShortTaskInfo) XXX_Size() int { - return m.Size() -} -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) + return nil } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +type NewEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ShortTaskInfo) GetName() string { - if m != nil { - return m.Name - } - return "" + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return false } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId - } - return "" +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State - } - return "" +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } -func (m *ShortTaskInfo) GetClassName() string { - if m != nil { - return m.ClassName +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { - if m != nil { - return m.DeploymentInfo +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *ShortTaskInfo) GetPid() string { - if m != nil { - return m.Pid - } - return "" -} +type NewEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ShortTaskInfo) GetSandboxStdout() string { - if m != nil { - return m.SandboxStdout - } - return "" + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} -} -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) -} -func (m *TaskDeploymentInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo +func (*NewEnvironmentReply) ProtoMessage() {} -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId - } - return "" +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } -func (m *TaskDeploymentInfo) GetOfferId() string { - if m != nil { - return m.OfferId +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } - return "" + return nil } -func (m *TaskDeploymentInfo) GetExecutorId() string { - if m != nil { - return m.ExecutorId +type GetEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *GetEnvironmentRequest) Reset() { + *x = GetEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type GetTasksRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} -} -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetEnvironmentRequest) ProtoMessage() {} + +func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) -} -func (m *GetTasksRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) + +func (x *GetEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +type GetEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} -} -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) Reset() { + *x = GetEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) -} -func (m *GetTasksReply) XXX_Size() int { - return m.Size() -} -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) + +func (x *GetEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +func (*GetEnvironmentReply) ProtoMessage() {} -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} -} -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } + return nil } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) -} -func (m *GetTaskRequest) XXX_Size() int { - return m.Size() -} -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) + +func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { + if x != nil { + return x.Workflow + } + return nil } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +type ControlEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GetTaskRequest) GetTaskId() string { - if m != nil { - return m.TaskId + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` +} + +func (x *ControlEnvironmentRequest) Reset() { + *x = ControlEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ControlEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} -} -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*ControlEnvironmentRequest) ProtoMessage() {} + +func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) + +// Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } -func (m *GetTaskReply) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) + +func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { + if x != nil { + return x.Type + } + return ControlEnvironmentRequest_NOOP } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +type ControlEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *GetTaskReply) GetTask() *TaskInfo { - if m != nil { - return m.Task + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` +} + +func (x *ControlEnvironmentReply) Reset() { + *x = ControlEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ControlEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} -} -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*ControlEnvironmentReply) ProtoMessage() {} + +func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) -} -func (m *TaskClassInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{28} +} -func (m *TaskClassInfo) GetName() string { - if m != nil { - return m.Name +func (x *ControlEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *TaskClassInfo) GetControlMode() string { - if m != nil { - return m.ControlMode +func (x *ControlEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} -} -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } + return 0 } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) + +type ModifyEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` } -func (m *CommandInfo) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentRequest) Reset() { + *x = ModifyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) + +func (x *ModifyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (m *CommandInfo) GetEnv() []string { - if m != nil { - return m.Env +func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell - } - return false +// Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } -func (m *CommandInfo) GetValue() string { - if m != nil { - return m.Value +func (x *ModifyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *CommandInfo) GetArguments() []string { - if m != nil { - return m.Arguments +func (x *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if x != nil { + return x.Operations } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +func (x *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if x != nil { + return x.ReconfigureAll } - return "" + return false } -type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type EnvironmentOperation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} -} -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentOperation) Reset() { + *x = EnvironmentOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) -} -func (m *ChannelInfo) XXX_Size() int { - return m.Size() + +func (x *EnvironmentOperation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) + +func (*EnvironmentOperation) ProtoMessage() {} + +func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +// Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} -func (m *ChannelInfo) GetName() string { - if m != nil { - return m.Name +func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { + if x != nil { + return x.Type } - return "" + return EnvironmentOperation_NOOP } -func (m *ChannelInfo) GetType() string { - if m != nil { - return m.Type +func (x *EnvironmentOperation) GetRoleName() string { + if x != nil { + return x.RoleName } return "" } -func (m *ChannelInfo) GetTarget() string { - if m != nil { - return m.Target +type ModifyEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` +} + +func (x *ModifyEnvironmentReply) Reset() { + *x = ModifyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} -} -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +func (x *ModifyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) -} -func (m *TaskInfo) XXX_Size() int { - return m.Size() -} -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { - if m != nil { - return m.ShortInfo - } - return nil -} +func (*ModifyEnvironmentReply) ProtoMessage() {} -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { - if m != nil { - return m.InboundChannels - } - return nil +// Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { - if m != nil { - return m.OutboundChannels +func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { + if x != nil { + return x.FailedOperations } return nil } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { - if m != nil { - return m.CommandInfo +func (x *ModifyEnvironmentReply) GetId() string { + if x != nil { + return x.Id } - return nil + return "" } -func (m *TaskInfo) GetTaskPath() string { - if m != nil { - return m.TaskPath +func (x *ModifyEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *TaskInfo) GetEnvId() string { - if m != nil { - return m.EnvId - } - return "" +type DestroyEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` } -func (m *TaskInfo) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *DestroyEnvironmentRequest) Reset() { + *x = DestroyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *DestroyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} -} -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*DestroyEnvironmentRequest) ProtoMessage() {} + +func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) -} -func (m *CleanupTasksRequest) XXX_Size() int { - return m.Size() -} -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) + +// Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +func (x *DestroyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} -func (m *CleanupTasksRequest) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *DestroyEnvironmentRequest) GetKeepTasks() bool { + if x != nil { + return x.KeepTasks } - return nil + return false } -type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if x != nil { + return x.AllowInRunningState + } + return false } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DestroyEnvironmentRequest) GetForce() bool { + if x != nil { + return x.Force } + return false } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) + +type DestroyEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` } -func (m *CleanupTasksReply) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentReply) Reset() { + *x = DestroyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) + +func (x *DestroyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +func (*DestroyEnvironmentReply) ProtoMessage() {} -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { - if m != nil { - return m.RunningTasks +// Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{33} +} + +func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } //////////////////////////////////////// -// Roles +// Environment, GET/SET properties //////////////////////////////////////// -type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type SetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If properties == nil, the core sets nothing + // and reply ok + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} -} -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) Reset() { + *x = SetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) -} -func (m *GetRolesRequest) XXX_Size() int { - return m.Size() -} -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetRolesRequest) GetPathSpec() string { - if m != nil { - return m.PathSpec +// Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{34} +} + +func (x *SetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} -} -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) + +type SetEnvironmentPropertiesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *RoleInfo) XXX_Size() int { - return m.Size() + +func (x *SetEnvironmentPropertiesReply) Reset() { + *x = SetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name +func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status - } - return "" +// Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State - } - return "" +type GetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // If len(queries) == 0, we return an + // empty map. + // To retrieve all KVs, use query '*' + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` } -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath +func (x *GetEnvironmentPropertiesRequest) Reset() { + *x = GetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds - } - return nil +func (x *GetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +// Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{36} +} + +func (x *GetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } - return nil + return "" } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *GetEnvironmentPropertiesRequest) GetQueries() []string { + if x != nil { + return x.Queries } return nil } -func (m *RoleInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if x != nil { + return x.ExcludeGlobals } - return nil + return false } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetEnvironmentPropertiesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} -} -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesReply) Reset() { + *x = GetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) -} -func (m *GetRolesReply) XXX_Size() int { - return m.Size() -} -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) + +func (x *GetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (m *GetRolesReply) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +// Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{37} +} + +func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) + +//////////////////////////////////////// +// Tasks +//////////////////////////////////////// +type ShortTaskInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { - return m.Size() + +func (x *ShortTaskInfo) Reset() { + *x = ShortTaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) + +func (x *ShortTaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +func (*ShortTaskInfo) ProtoMessage() {} -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { - if m != nil { - return m.RepoPattern +func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { - if m != nil { - return m.RevisionPattern - } - return "" +// Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { - if m != nil { - return m.AllBranches +func (x *ShortTaskInfo) GetName() string { + if x != nil { + return x.Name } - return false + return "" } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { - if m != nil { - return m.AllTags +func (x *ShortTaskInfo) GetLocked() bool { + if x != nil { + return x.Locked } return false } -type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ShortTaskInfo) GetTaskId() string { + if x != nil { + return x.TaskId } -} -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) -} -func (m *WorkflowTemplateInfo) XXX_Size() int { - return m.Size() -} -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) + return "" } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo - -func (m *WorkflowTemplateInfo) GetRepo() string { - if m != nil { - return m.Repo +func (x *ShortTaskInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { - if m != nil { - return m.Template +func (x *ShortTaskInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { - if m != nil { - return m.Revision +func (x *ShortTaskInfo) GetClassName() string { + if x != nil { + return x.ClassName } return "" } -type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if x != nil { + return x.DeploymentInfo + } + return nil } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} -} -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ShortTaskInfo) GetPid() string { + if x != nil { + return x.Pid } + return "" } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) -} -func (m *GetWorkflowTemplatesReply) XXX_Size() int { - return m.Size() -} -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) -} -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +type TaskDeploymentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` +} -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { - if m != nil { - return m.WorkflowTemplates +func (x *TaskDeploymentInfo) Reset() { + *x = TaskDeploymentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskDeploymentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskDeploymentInfo) ProtoMessage() {} + +func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) -} -func (m *ListReposRequest) XXX_Size() int { - return m.Size() -} -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo - -type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} -} -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskDeploymentInfo) GetHostname() string { + if x != nil { + return x.Hostname } + return "" } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) -} -func (m *RepoInfo) XXX_Size() int { - return m.Size() -} -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) -} - -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name +func (x *TaskDeploymentInfo) GetAgentId() string { + if x != nil { + return x.AgentId } return "" } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default +func (x *TaskDeploymentInfo) GetOfferId() string { + if x != nil { + return x.OfferId } - return false + return "" } -func (m *RepoInfo) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *TaskDeploymentInfo) GetExecutorId() string { + if x != nil { + return x.ExecutorId } return "" } -type ListReposReply struct { - Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` - GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type GetTasksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} -} -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksRequest) Reset() { + *x = GetTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) + +func (x *GetTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposReply) XXX_Size() int { - return m.Size() + +func (*GetTasksRequest) ProtoMessage() {} + +func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) + +// Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +type GetTasksReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *ListReposReply) GetRepos() []*RepoInfo { - if m != nil { - return m.Repos - } - return nil + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` } -func (m *ListReposReply) GetGlobalDefaultRevision() string { - if m != nil { - return m.GlobalDefaultRevision +func (x *GetTasksReply) Reset() { + *x = GetTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} -} -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTasksReply) ProtoMessage() {} + +func (x *GetTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) -} -func (m *AddRepoRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) + +func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks + } + return nil } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo +type GetTaskRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *AddRepoRequest) GetName() string { - if m != nil { - return m.Name - } - return "" + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` } -func (m *AddRepoRequest) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *GetTaskRequest) Reset() { + *x = GetTaskRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTaskRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTaskRequest) ProtoMessage() {} + +func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +// Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{42} +} -func (m *AddRepoReply) GetNewDefaultRevision() string { - if m != nil { - return m.NewDefaultRevision +func (x *GetTaskRequest) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } -func (m *AddRepoReply) GetInfo() string { - if m != nil { - return m.Info +type GetTaskReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` +} + +func (x *GetTaskReply) Reset() { + *x = GetTaskReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *GetTaskReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*GetTaskReply) ProtoMessage() {} + +func (x *GetTaskReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) -} -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (x *GetTaskReply) GetTask() *TaskInfo { + if x != nil { + return x.Task + } + return nil } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +type TaskClassInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` +} -func (m *RemoveRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *TaskClassInfo) Reset() { + *x = TaskClassInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskClassInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} -} -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskClassInfo) ProtoMessage() {} + +func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) + +// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } -func (m *RemoveRepoReply) XXX_Size() int { - return m.Size() + +func (x *TaskClassInfo) GetName() string { + if x != nil { + return x.Name + } + return "" } -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) + +func (x *TaskClassInfo) GetControlMode() string { + if x != nil { + return x.ControlMode + } + return "" } -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo +type CommandInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` +} -func (m *RemoveRepoReply) GetNewDefaultRepo() string { - if m != nil { - return m.NewDefaultRepo +func (x *CommandInfo) Reset() { + *x = CommandInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *CommandInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} -} -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*CommandInfo) ProtoMessage() {} + +func (x *CommandInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) } -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) -} -func (m *RefreshReposRequest) XXX_Size() int { - return m.Size() + +// Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. +func (*CommandInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) + +func (x *CommandInfo) GetEnv() []string { + if x != nil { + return x.Env + } + return nil } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo +func (x *CommandInfo) GetShell() bool { + if x != nil { + return x.Shell + } + return false +} -func (m *RefreshReposRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *CommandInfo) GetValue() string { + if x != nil { + return x.Value } - return 0 + return "" } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *CommandInfo) GetArguments() []string { + if x != nil { + return x.Arguments + } + return nil } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} -} -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CommandInfo) GetUser() string { + if x != nil { + return x.User } + return "" } -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) + +type ChannelInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` } -func (m *SetDefaultRepoRequest) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) Reset() { + *x = ChannelInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) + +func (x *ChannelInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +func (*ChannelInfo) ProtoMessage() {} -func (m *SetDefaultRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *ChannelInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ChannelInfo) GetName() string { + if x != nil { + return x.Name } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) GetType() string { + if x != nil { + return x.Type + } + return "" } -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) + +func (x *ChannelInfo) GetTarget() string { + if x != nil { + return x.Target + } + return "" } -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo +type TaskInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *TaskInfo) Reset() { + *x = TaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} -} -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*TaskInfo) ProtoMessage() {} + +func (x *TaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. +func (*TaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) + +func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { + if x != nil { + return x.ShortInfo + } + return nil } -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { - return m.Size() + +func (x *TaskInfo) GetClassInfo() *TaskClassInfo { + if x != nil { + return x.ClassInfo + } + return nil } -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) + +func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { + if x != nil { + return x.InboundChannels + } + return nil } -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo +func (x *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if x != nil { + return x.OutboundChannels + } + return nil +} -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *TaskInfo) GetCommandInfo() *CommandInfo { + if x != nil { + return x.CommandInfo } - return 0 + return nil } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *TaskInfo) GetTaskPath() string { + if x != nil { + return x.TaskPath } return "" } -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *TaskInfo) GetEnvId() string { + if x != nil { + return x.EnvId + } + return "" } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} -} -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskInfo) GetProperties() map[string]string { + if x != nil { + return x.Properties } + return nil } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) + +type CleanupTasksRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` } -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksRequest) Reset() { + *x = CleanupTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) + +func (x *CleanupTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +func (*CleanupTasksRequest) ProtoMessage() {} -func (m *SetRepoDefaultRevisionReply) GetInfo() string { - if m != nil { - return m.Info +func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} -} -func (m *Empty) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) -} -func (m *Empty) XXX_Size() int { - return m.Size() -} -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) -} - -var xxx_messageInfo_Empty proto.InternalMessageInfo - -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") - proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") - proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*Event)(nil), "o2control.Event") - proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") -} - -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2918 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, - 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, - 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, - 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, - 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, - 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, - 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, - 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, - 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, - 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, - 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, - 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, - 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, - 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, - 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, - 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, - 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, - 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, - 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, - 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, - 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, - 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, - 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, - 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, - 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, - 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, - 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, - 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, - 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, - 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, - 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, - 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, - 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, - 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, - 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, - 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, - 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, - 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, - 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, - 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, - 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, - 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, - 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, - 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, - 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, - 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, - 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, - 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, - 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, - 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, - 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, - 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, - 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, - 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, - 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, - 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, - 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, - 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, - 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, - 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, - 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, - 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, - 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, - 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, - 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, - 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, - 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, - 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, - 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, - 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, - 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, - 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, - 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, - 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, - 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, - 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, - 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, - 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, - 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, - 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, - 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, - 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, - 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, - 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, - 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, - 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, - 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, - 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, - 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, - 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, - 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, - 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, - 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, - 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, - 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, - 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, - 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, - 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, - 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, - 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, - 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, - 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, - 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, - 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, - 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, - 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, - 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, - 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, - 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, - 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, - 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, - 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, - 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, - 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, - 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, - 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, - 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, - 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, - 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, - 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, - 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, - 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, - 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, - 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, - 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, - 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, - 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, - 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, - 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, - 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, - 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, - 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, - 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, - 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, - 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, - 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, - 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, - 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, - 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, - 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, - 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, - 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, - 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, - 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, - 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, - 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, - 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, - 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, - 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, - 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, - 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, - 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, - 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, - 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, - 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, - 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, - 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, - 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, - 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, - 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, - 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, - 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, - 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, - 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, - 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, - 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, - 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, - 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, - 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, - 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, - 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, - 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, - 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, - 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, - 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, - 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, - 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, - 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, - 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, - 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, - 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, - 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, - 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, +func (x *CleanupTasksRequest) GetTaskIds() []string { + if x != nil { + return x.TaskIds + } + return nil } -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +type CleanupTasksReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` } -type controlClient struct { - cc *grpc.ClientConn +func (x *CleanupTasksReply) Reset() { + *x = CleanupTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} +func (x *CleanupTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (*CleanupTasksReply) ProtoMessage() {} + +func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return x, nil + return mi.MessageOf(x) } -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +// Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } -type controlTrackStatusClient struct { - grpc.ClientStream +func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { + if x != nil { + return x.KilledTasks + } + return nil } -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { + if x != nil { + return x.RunningTasks } - return m, nil + return nil } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +//////////////////////////////////////// +// Roles +//////////////////////////////////////// +type GetRolesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) Reset() { + *x = GetRolesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *GetRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (*GetRolesRequest) ProtoMessage() {} + +func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) GetEnvId() string { + if x != nil { + return x.EnvId } - return out, nil + return "" } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *GetRolesRequest) GetPathSpec() string { + if x != nil { + return x.PathSpec } - return out, nil + return "" } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type RoleInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) Reset() { + *x = RoleInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *RoleInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err +func (*RoleInfo) ProtoMessage() {} + +func (x *RoleInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. +func (*RoleInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetName() string { + if x != nil { + return x.Name } - return out, nil + return "" } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetStatus() string { + if x != nil { + return x.Status } - return out, nil + return "" } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetState() string { + if x != nil { + return x.State } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetFullPath() string { + if x != nil { + return x.FullPath } - return out, nil + return "" } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetTaskIds() []string { + if x != nil { + return x.TaskIds } - return out, nil + return nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } - return out, nil + return nil } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } - return out, nil + return nil } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } - return out, nil + return nil } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *RoleInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } - return out, nil + return nil } -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +type GetRolesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` +} + +func (x *GetRolesReply) Reset() { + *x = GetRolesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return x, nil } -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream +func (x *GetRolesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -type controlSubscribeClient struct { - grpc.ClientStream +func (*GetRolesReply) ProtoMessage() {} + +func (x *GetRolesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +// Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{52} +} + +func (x *GetRolesReply) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } - return m, nil + return nil } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error +type GetWorkflowTemplatesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { +func (x *GetWorkflowTemplatesRequest) Reset() { + *x = GetWorkflowTemplatesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +func (x *GetWorkflowTemplatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") + +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} + +func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") + +// Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") + +func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if x != nil { + return x.RepoPattern + } + return "" } -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if x != nil { + return x.RevisionPattern + } + return "" } -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if x != nil { + return x.AllBranches + } + return false } -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") + +func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { + if x != nil { + return x.AllTags + } + return false } -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") + +type WorkflowTemplateInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") + +func (x *WorkflowTemplateInfo) Reset() { + *x = WorkflowTemplateInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") + +func (x *WorkflowTemplateInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") + +func (*WorkflowTemplateInfo) ProtoMessage() {} + +func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") + +// Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") + +func (x *WorkflowTemplateInfo) GetRepo() string { + if x != nil { + return x.Repo + } + return "" } -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") + +func (x *WorkflowTemplateInfo) GetTemplate() string { + if x != nil { + return x.Template + } + return "" } -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") + +func (x *WorkflowTemplateInfo) GetRevision() string { + if x != nil { + return x.Revision + } + return "" } -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") + +type GetWorkflowTemplatesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` } -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") + +func (x *GetWorkflowTemplatesReply) Reset() { + *x = GetWorkflowTemplatesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") + +func (x *GetWorkflowTemplatesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") + +func (*GetWorkflowTemplatesReply) ProtoMessage() {} + +func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") + +// Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") + +func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { + if x != nil { + return x.WorkflowTemplates + } + return nil } -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") + +type ListReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") + +func (x *ListReposRequest) Reset() { + *x = ListReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) +func (x *ListReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func (*ListReposRequest) ProtoMessage() {} + +func (x *ListReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) + return mi.MessageOf(x) } -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream +// Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } -type controlTrackStatusServer struct { - grpc.ServerStream +type RepoInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) +func (x *RepoInfo) Reset() { + *x = RepoInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RepoInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RepoInfo) ProtoMessage() {} + +func (x *RepoInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", +// Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. +func (*RepoInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{57} +} + +func (x *RepoInfo) GetName() string { + if x != nil { + return x.Name } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + return "" +} + +func (x *RepoInfo) GetDefault() bool { + if x != nil { + return x.Default } - return interceptor(ctx, in, info, handler) + return false } -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RepoInfo) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) + return "" +} + +type ListReposReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` + GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` +} + +func (x *ListReposReply) Reset() { + *x = ListReposReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", +} + +func (x *ListReposReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListReposReply) ProtoMessage() {} + +func (x *ListReposReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. +func (*ListReposReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{58} +} + +func (x *ListReposReply) GetRepos() []*RepoInfo { + if x != nil { + return x.Repos } - return interceptor(ctx, in, info, handler) + return nil } -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewAutoEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *ListReposReply) GetGlobalDefaultRevision() string { + if x != nil { + return x.GlobalDefaultRevision } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) + return "" +} + +type AddRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` +} + +func (x *AddRepoRequest) Reset() { + *x = AddRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", +} + +func (x *AddRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddRepoRequest) ProtoMessage() {} + +func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{59} +} + +func (x *AddRepoRequest) GetName() string { + if x != nil { + return x.Name } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *AddRepoRequest) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) + return "" +} + +type AddRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` +} + +func (x *AddRepoReply) Reset() { + *x = AddRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", +} + +func (x *AddRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AddRepoReply) ProtoMessage() {} + +func (x *AddRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{60} +} + +func (x *AddRepoReply) GetNewDefaultRevision() string { + if x != nil { + return x.NewDefaultRevision } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *AddRepoReply) GetInfo() string { + if x != nil { + return x.Info } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) + return "" +} + +type RemoveRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *RemoveRepoRequest) Reset() { + *x = RemoveRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", +} + +func (x *RemoveRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRepoRequest) ProtoMessage() {} + +func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{61} +} + +func (x *RemoveRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return interceptor(ctx, in, info, handler) + return 0 } -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +type RemoveRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` +} + +func (x *RemoveRepoReply) Reset() { + *x = RemoveRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) +} + +func (x *RemoveRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RemoveRepoReply) ProtoMessage() {} + +func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", + return mi.MessageOf(x) +} + +// Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{62} +} + +func (x *RemoveRepoReply) GetNewDefaultRepo() string { + if x != nil { + return x.NewDefaultRepo } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + return "" +} + +type RefreshReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *RefreshReposRequest) Reset() { + *x = RefreshReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return interceptor(ctx, in, info, handler) } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +func (x *RefreshReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RefreshReposRequest) ProtoMessage() {} + +func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) + return mi.MessageOf(x) +} + +// Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{63} +} + +func (x *RefreshReposRequest) GetIndex() int32 { + if x != nil { + return x.Index } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", + return 0 +} + +type SetDefaultRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *SetDefaultRepoRequest) Reset() { + *x = SetDefaultRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) +} + +func (x *SetDefaultRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetDefaultRepoRequest) ProtoMessage() {} + +func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{64} +} + +func (x *SetDefaultRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) + return 0 +} + +type SetGlobalDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *SetGlobalDefaultRevisionRequest) Reset() { + *x = SetGlobalDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", +} + +func (x *SetGlobalDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{65} +} + +func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return interceptor(ctx, in, info, handler) + return "" } -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", +type SetRepoDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` +} + +func (x *SetRepoDefaultRevisionRequest) Reset() { + *x = SetRepoDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) +} + +func (x *SetRepoDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{66} +} + +func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if x != nil { + return x.Index } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) + return 0 +} + +func (x *SetRepoDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", + return "" +} + +type SetRepoDefaultRevisionReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` +} + +func (x *SetRepoDefaultRevisionReply) Reset() { + *x = SetRepoDefaultRevisionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) +} + +func (x *SetRepoDefaultRevisionReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[67] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return interceptor(ctx, in, info, handler) + return mi.MessageOf(x) } -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err +// Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{67} +} + +func (x *SetRepoDefaultRevisionReply) GetInfo() string { + if x != nil { + return x.Info } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) + return "" +} + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[68] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{68} +} + +var File_protos_o2control_proto protoreflect.FileDescriptor + +var file_protos_o2control_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x6c, 0x0a, 0x1a, 0x45, + 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x13, 0x45, 0x76, 0x5f, + 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x46, + 0x0a, 0x14, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, + 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, + 0x64, 0x22, 0x69, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2c, + 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x15, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, + 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, + 0x64, 0x22, 0x15, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x76, 0x5f, 0x4b, + 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x22, 0x0f, 0x0a, + 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, + 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x6f, + 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, + 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0x86, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x52, 0x0a, + 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x74, + 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, + 0x4f, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, + 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, + 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, + 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, + 0x73, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, + 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x58, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, + 0x4b, 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x00, + 0x52, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, + 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, + 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x22, 0xca, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, + 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, + 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, + 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, + 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, + 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0x91, 0x04, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x32, 0xfd, 0x0d, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_o2control_proto_rawDescOnce sync.Once + file_protos_o2control_proto_rawDescData = file_protos_o2control_proto_rawDesc +) + +func file_protos_o2control_proto_rawDescGZIP() []byte { + file_protos_o2control_proto_rawDescOnce.Do(func() { + file_protos_o2control_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_o2control_proto_rawDescData) + }) + return file_protos_o2control_proto_rawDescData +} + +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_protos_o2control_proto_goTypes = []interface{}{ + (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level + (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype + (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentStateChanged)(nil), // 4: o2control.Ev_EnvironmentStateChanged + (*Ev_TaskStateChanged)(nil), // 5: o2control.Ev_TaskStateChanged + (*Ev_TaskStatusChanged)(nil), // 6: o2control.Ev_TaskStatusChanged + (*Ev_TaskLaunched)(nil), // 7: o2control.Ev_TaskLaunched + (*Ev_MesosTaskCreated)(nil), // 8: o2control.Ev_MesosTaskCreated + (*Ev_EnvironmentCreated)(nil), // 9: o2control.Ev_EnvironmentCreated + (*Ev_EnvironmentDestroyed)(nil), // 10: o2control.Ev_EnvironmentDestroyed + (*Ev_EnvironmentError)(nil), // 11: o2control.Ev_EnvironmentError + (*Ev_KillTasksMesos)(nil), // 12: o2control.Ev_KillTasksMesos + (*StatusRequest)(nil), // 13: o2control.StatusRequest + (*StatusReply)(nil), // 14: o2control.StatusReply + (*StatusUpdate)(nil), // 15: o2control.StatusUpdate + (*Event)(nil), // 16: o2control.Event + (*SubscribeRequest)(nil), // 17: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 18: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 19: o2control.Version + (*GetFrameworkInfoReply)(nil), // 20: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 21: o2control.TeardownRequest + (*TeardownReply)(nil), // 22: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 23: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 24: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 25: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 26: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 27: o2control.NewEnvironmentReply + (*GetEnvironmentRequest)(nil), // 28: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 29: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 30: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 31: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 32: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 33: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 34: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 35: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 36: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 44: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 46: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo + (*CommandInfo)(nil), // 48: o2control.CommandInfo + (*ChannelInfo)(nil), // 49: o2control.ChannelInfo + (*TaskInfo)(nil), // 50: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest + (*RoleInfo)(nil), // 54: o2control.RoleInfo + (*GetRolesReply)(nil), // 55: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 59: o2control.ListReposRequest + (*RepoInfo)(nil), // 60: o2control.RepoInfo + (*ListReposReply)(nil), // 61: o2control.ListReposReply + (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 63: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 71: o2control.Empty + nil, // 72: o2control.EnvironmentInfo.DefaultsEntry + nil, // 73: o2control.EnvironmentInfo.VarsEntry + nil, // 74: o2control.EnvironmentInfo.UserVarsEntry + nil, // 75: o2control.NewEnvironmentRequest.VarsEntry + nil, // 76: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 77: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 78: o2control.TaskInfo.PropertiesEntry + nil, // 79: o2control.RoleInfo.DefaultsEntry + nil, // 80: o2control.RoleInfo.VarsEntry + nil, // 81: o2control.RoleInfo.UserVarsEntry +} +var file_protos_o2control_proto_depIdxs = []int32{ + 25, // 0: o2control.Ev_EnvironmentCreated.environment:type_name -> o2control.EnvironmentInfo + 52, // 1: o2control.Ev_EnvironmentDestroyed.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 15, // 2: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 3: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 4: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 5: o2control.Event.environmentStateChanged:type_name -> o2control.Ev_EnvironmentStateChanged + 9, // 6: o2control.Event.environmentCreated:type_name -> o2control.Ev_EnvironmentCreated + 5, // 7: o2control.Event.taskStateChanged:type_name -> o2control.Ev_TaskStateChanged + 6, // 8: o2control.Event.taskStatusChanged:type_name -> o2control.Ev_TaskStatusChanged + 7, // 9: o2control.Event.tasklaunched:type_name -> o2control.Ev_TaskLaunched + 8, // 10: o2control.Event.mesosTaskcreated:type_name -> o2control.Ev_MesosTaskCreated + 10, // 11: o2control.Event.environmentDestroyed:type_name -> o2control.Ev_EnvironmentDestroyed + 11, // 12: o2control.Event.environmentError:type_name -> o2control.Ev_EnvironmentError + 12, // 13: o2control.Event.killtasksMesos:type_name -> o2control.Ev_KillTasksMesos + 19, // 14: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 25, // 15: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 41, // 16: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 72, // 17: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 73, // 18: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 74, // 19: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 75, // 20: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 25, // 21: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 25, // 22: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 54, // 23: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 24: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 33, // 25: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 26: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 33, // 27: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 52, // 28: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 76, // 29: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 77, // 30: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 31: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 41, // 32: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 50, // 33: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 41, // 34: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 47, // 35: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 49, // 36: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 49, // 37: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 48, // 38: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 78, // 39: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 41, // 40: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 41, // 41: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 54, // 42: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 79, // 43: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 80, // 44: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 81, // 45: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 54, // 46: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 57, // 47: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 48: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 13, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 18, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 21, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 23, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 26, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 28, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 30, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 32, // 56: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 35, // 57: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 43, // 58: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 59: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 60: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 61: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 62: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 63: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 64: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 65: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 66: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 67: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 68: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 69: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 17, // 70: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 14, // 71: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 20, // 72: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 22, // 73: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 24, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 27, // 75: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 29, // 76: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 31, // 77: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 34, // 78: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 36, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 44, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 16, // 92: o2control.Control.Subscribe:output_type -> o2control.Event + 71, // [71:93] is the sub-list for method output_type + 49, // [49:71] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name +} + +func init() { file_protos_o2control_proto_init() } +func file_protos_o2control_proto_init() { + if File_protos_o2control_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event_MesosHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentStateChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskStateChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskStatusChanged); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskLaunched); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_MesosTaskCreated); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentCreated); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentDestroyed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentError); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_KillTasksMesos); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentOperation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShortTaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskDeploymentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskClassInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplateInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RepoInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RefreshReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetDefaultRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_o2control_proto_msgTypes[12].OneofWrappers = []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return interceptor(ctx, in, info, handler) + file_protos_o2control_proto_msgTypes[13].OneofWrappers = []interface{}{ + (*Event_EnvironmentStateChanged)(nil), + (*Event_EnvironmentCreated)(nil), + (*Event_TaskStateChanged)(nil), + (*Event_TaskStatusChanged)(nil), + (*Event_Tasklaunched)(nil), + (*Event_MesosTaskcreated)(nil), + (*Event_EnvironmentDestroyed)(nil), + (*Event_EnvironmentError)(nil), + (*Event_KilltasksMesos)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_o2control_proto_rawDesc, + NumEnums: 3, + NumMessages: 79, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_o2control_proto_goTypes, + DependencyIndexes: file_protos_o2control_proto_depIdxs, + EnumInfos: file_protos_o2control_proto_enumTypes, + MessageInfos: file_protos_o2control_proto_msgTypes, + }.Build() + File_protos_o2control_proto = out.File + file_protos_o2control_proto_rawDesc = nil + file_protos_o2control_proto_goTypes = nil + file_protos_o2control_proto_depIdxs = nil } -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc grpc.ClientConnInterface +} + +func NewControlClient(cc grpc.ClientConnInterface) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return interceptor(ctx, in, info, handler) + return x, nil } -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) + return m, nil } -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { return nil, err } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) + return out, nil } -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { + return nil, err } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", + return out, nil } -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil } -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x22 - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvironmentId) > 0 { - i -= len(m.EnvironmentId) - copy(dAtA[i:], m.EnvironmentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RolePath) > 0 { - i -= len(m.RolePath) - copy(dAtA[i:], m.RolePath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil +} + +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + return out, nil } -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err } - return len(dAtA) - i, nil + return out, nil } -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) if err != nil { return nil, err } - return dAtA[:n], nil + return out, nil } -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil } -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { + return nil, err } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err } - return len(dAtA) - i, nil + return x, nil } -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream } -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil +type controlSubscribeClient struct { + grpc.ClientStream } -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } - return dAtA[:n], nil + return m, nil } -func (m *Event) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +// ControlServer is the server API for Control service. +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error } -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +// UnimplementedControlServer can be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { } -func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") } - -func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentEvent != nil { - { - size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") } -func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") } - -func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskEvent != nil { - { - size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } -func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } - -func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.RoleEvent != nil { - { - size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") } -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") } - -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") } - -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } - -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") } - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") } - -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") } - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") } - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") } - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") } - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") } - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") } - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func (*UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") } - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil +func (*UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") } - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +func (*UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (*UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +func RegisterControlServer(s *grpc.Server, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) } -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) } -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream } -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlTrackStatusServer struct { + grpc.ServerStream } -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) } -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { + return interceptor(ctx, in, info, handler) +} + +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) } - if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 - } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) } - return len(dAtA) - i, nil -} - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) } -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.SandboxStdout) > 0 { - i -= len(m.SandboxStdout) - copy(dAtA[i:], m.SandboxStdout) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) - i-- - dAtA[i] = 0x4a +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err } - if len(m.Pid) > 0 { - i -= len(m.Pid) - copy(dAtA[i:], m.Pid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) - i-- - dAtA[i] = 0x42 + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) } - return dAtA[:n], nil -} - -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", } - return len(dAtA) - i, nil -} - -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) } - return dAtA[:n], nil + return interceptor(ctx, in, info, handler) } -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { return nil, err } - return dAtA[:n], nil -} - -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) } - return len(dAtA) - i, nil + return interceptor(ctx, in, info, handler) } -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return len(dAtA) - i, nil + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) } -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream } -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) +type controlSubscribeServer struct { + grpc.ServerStream } -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) } -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ShortInfo != nil { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", } - -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x1a - } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x12 - } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Empty) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvironmentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RolePath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Timestamp) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Payload != nil { - n += m.Payload.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Event_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentEvent != nil { - l = m.EnvironmentEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskEvent != nil { - l = m.TaskEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.RoleEvent != nil { - l = m.RoleEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Version) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) - } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) - } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) - } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ReconfigureAll { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ExcludeGlobals { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Pid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.SandboxStdout) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.AllBranches { - n += 2 - } - if m.AllTags { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *WorkflowTemplateInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Repo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Template) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RepoInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.GlobalDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RefreshReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetDefaultRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvironmentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_RoleEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_RoleEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_RoleEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RolePath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control - } - 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: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control - } - 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: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusUpdate) 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 ErrIntOverflowO2Control - } - 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: StatusUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -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 ErrIntOverflowO2Control - } - 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 Timestamp", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timestamp = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentEvent{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskEvent{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_RoleEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_RoleEvent{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SubscribeRequest) 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 ErrIntOverflowO2Control - } - 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: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Version) 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 ErrIntOverflowO2Control - } - 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: Version: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProductName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VersionStr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) - } - m.EnvironmentsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) - } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) - } - m.HostsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InstanceName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownRequest) 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 ErrIntOverflowO2Control - } - 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: TeardownRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - 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: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentInfo) 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 ErrIntOverflowO2Control - } - 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: EnvironmentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-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 RootRole", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReconfigureAll = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentOperation) 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 ErrIntOverflowO2Control - } - 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: EnvironmentOperation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RoleName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.KeepTasks = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowInRunningState = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Force = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} - } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExcludeGlobals = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ShortTaskInfo) 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 ErrIntOverflowO2Control - } - 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: ShortTaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ShortTaskInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Locked", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Locked = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeploymentInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DeploymentInfo == nil { - m.DeploymentInfo = &TaskDeploymentInfo{} - } - if err := m.DeploymentInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SandboxStdout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskDeploymentInfo) 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 ErrIntOverflowO2Control - } - 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: TaskDeploymentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskDeploymentInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AgentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OfferId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExecutorId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksRequest) 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 ErrIntOverflowO2Control - } - 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: GetTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksReply) 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 ErrIntOverflowO2Control - } - 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: GetTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskRequest) 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 ErrIntOverflowO2Control - } - 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: GetTaskRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskReply) 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 ErrIntOverflowO2Control - } - 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: GetTaskReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Task", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Task == nil { - m.Task = &TaskInfo{} - } - if err := m.Task.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskClassInfo) 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 ErrIntOverflowO2Control - } - 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: TaskClassInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskClassInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 ControlMode", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ControlMode = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommandInfo) 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 ErrIntOverflowO2Control - } - 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: CommandInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommandInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Shell", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Shell = bool(v != 0) - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ChannelInfo) 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 ErrIntOverflowO2Control - } - 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: ChannelInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChannelInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Target = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskInfo) 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 ErrIntOverflowO2Control - } - 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: TaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShortInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ShortInfo == nil { - m.ShortInfo = &ShortTaskInfo{} - } - if err := m.ShortInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClassInfo == nil { - m.ClassInfo = &TaskClassInfo{} - } - if err := m.ClassInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InboundChannels = append(m.InboundChannels, &ChannelInfo{}) - if err := m.InboundChannels[len(m.InboundChannels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OutboundChannels = append(m.OutboundChannels, &ChannelInfo{}) - if err := m.OutboundChannels[len(m.OutboundChannels)-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 CommandInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CommandInfo == nil { - m.CommandInfo = &CommandInfo{} - } - if err := m.CommandInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksRequest) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksReply) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RunningTasks = append(m.RunningTasks, &ShortTaskInfo{}) - if err := m.RunningTasks[len(m.RunningTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesRequest) 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 ErrIntOverflowO2Control - } - 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: GetRolesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PathSpec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PathSpec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RoleInfo) 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 ErrIntOverflowO2Control - } - 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: RoleInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RoleInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FullPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesReply) 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 ErrIntOverflowO2Control - } - 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: GetRolesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesRequest) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RepoPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RevisionPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllBranches = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllTags = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WorkflowTemplateInfo) 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 ErrIntOverflowO2Control - } - 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: WorkflowTemplateInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WorkflowTemplateInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Template = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesReply) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplates = append(m.WorkflowTemplates, &WorkflowTemplateInfo{}) - if err := m.WorkflowTemplates[len(m.WorkflowTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposRequest) 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 ErrIntOverflowO2Control - } - 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: ListReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RepoInfo) 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 ErrIntOverflowO2Control - } - 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: RepoInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RepoInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Default = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposReply) 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 ErrIntOverflowO2Control - } - 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: ListReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repos", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repos = append(m.Repos, &RepoInfo{}) - if err := m.Repos[len(m.Repos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoRequest) 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 ErrIntOverflowO2Control - } - 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: AddRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoRequest: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoRequest) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoReply) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRepo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefreshReposRequest) 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 ErrIntOverflowO2Control - } - 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: RefreshReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetDefaultRepoRequest) 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 ErrIntOverflowO2Control - } - 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: SetDefaultRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetGlobalDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Empty) 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 ErrIntOverflowO2Control - } - 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: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipO2Control(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthO2Control - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") -) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9ae3960d6..dc86e89e9 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package o2control; option java_package = "ch.cern.alice.o2.control.rpcserver"; -option go_package = "pb"; +option go_package = "protos;pb"; //////////////// Common event messages /////////////// diff --git a/core/server.go b/core/server.go index 8720ce29d..92df66e4c 100644 --- a/core/server.go +++ b/core/server.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --gofast_out=plugins=grpc:. protos/o2control.proto +//go:generate protoc --go_out=plugins=grpc:. protos/o2control.proto package core import ( diff --git a/core/task/scheduler.go b/core/task/scheduler.go index d01fbba4b..1b6465db3 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -47,7 +47,6 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/executor/protos" - "github.com/gogo/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" xmetrics "github.com/mesos/mesos-go/api/v1/lib/extras/metrics" @@ -60,6 +59,7 @@ import ( "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" "github.com/mesos/mesos-go/api/v1/lib/scheduler/events" "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" ) var ( diff --git a/core/task/schedutil/mesosutil.go b/core/task/schedutil/mesosutil.go index d3560e417..1124f8300 100644 --- a/core/task/schedutil/mesosutil.go +++ b/core/task/schedutil/mesosutil.go @@ -39,12 +39,12 @@ import ( "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/product" - proto "github.com/gogo/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/httpcli" "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpsched" "github.com/mesos/mesos-go/api/v1/lib/resources" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" + proto "google.golang.org/protobuf/proto" ) const AuthModeBasic = "basic" diff --git a/docs/makefile_reference.md b/docs/makefile_reference.md index ea85ff412..657d54366 100644 --- a/docs/makefile_reference.md +++ b/docs/makefile_reference.md @@ -15,9 +15,9 @@ AliECS comes with a `make`-based build system, with all `.PHONY` targets. | `make clean` | cleans the default build output directory (`./bin`) | | `make cleanall` | cleans the default build output directory (`./bin`, same as `make clean`), as well as `./tools` and `./vendor` | | `make vendor` | rebuilds/refreshes the tree of vendored dependencies (`go mod vendor`) and fetches 3rd party Protobuf files | -| `make tools` | ensures all build tools are present (currently only `gogo-proto` executables) | -| `make tools/protoc` | ensures `gogo-proto` executables are present (included in `make tools`) | +| `make tools` | ensures all build tools are present (currently only `protoc-gen-go`) | +| `make tools/protoc` | ensures `protoc-gen-go` is present (included in `make tools`) | | `make doc`
`make docs` | regenerates command reference documentation for command line tools | | `make help` | displays inline documentation | -The variable `WHAT` is obeyed by `make build` (or `make`) and `make install` in order to customize the components to build. For example `make WHAT=coconut install` builds and installs only `coconut`. By default `WHAT` includes all components. \ No newline at end of file +The variable `WHAT` is obeyed by `make build` (or `make`) and `make install` in order to customize the components to build. For example `make WHAT=coconut install` builds and installs only `coconut`. By default `WHAT` includes all components. diff --git a/executor/executor.go b/executor/executor.go index 52bd45df8..2a7547989 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../occ --gofast_out=plugins=grpc:. protos/occ.proto +//go:generate protoc -I ../occ --go_out=plugins=grpc:. protos/occ.proto // Package executor implements the O² Control executor binary. package executor diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 0253950b5..c17ecc045 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -141,8 +141,6 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er }, grpc.EmptyCallOption{}) if err != nil { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. status, ok := status.FromError(err) if ok { r.log.WithFields(logrus.Fields{ diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index a75b761a1..75d94a383 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -1,30 +1,56 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 // source: protos/occ.proto package pb import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StateChangeTrigger int32 @@ -34,24 +60,45 @@ const ( StateChangeTrigger_DEVICE_ERROR StateChangeTrigger = 2 ) -var StateChangeTrigger_name = map[int32]string{ - 0: "EXECUTOR", - 1: "DEVICE_INTENTIONAL", - 2: "DEVICE_ERROR", -} +// Enum value maps for StateChangeTrigger. +var ( + StateChangeTrigger_name = map[int32]string{ + 0: "EXECUTOR", + 1: "DEVICE_INTENTIONAL", + 2: "DEVICE_ERROR", + } + StateChangeTrigger_value = map[string]int32{ + "EXECUTOR": 0, + "DEVICE_INTENTIONAL": 1, + "DEVICE_ERROR": 2, + } +) -var StateChangeTrigger_value = map[string]int32{ - "EXECUTOR": 0, - "DEVICE_INTENTIONAL": 1, - "DEVICE_ERROR": 2, +func (x StateChangeTrigger) Enum() *StateChangeTrigger { + p := new(StateChangeTrigger) + *p = x + return p } func (x StateChangeTrigger) String() string { - return proto.EnumName(StateChangeTrigger_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateChangeTrigger) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[0].Descriptor() +} + +func (StateChangeTrigger) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[0] +} + +func (x StateChangeTrigger) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use StateChangeTrigger.Descriptor instead. func (StateChangeTrigger) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{0} + return file_protos_occ_proto_rawDescGZIP(), []int{0} } type StateType int32 @@ -61,22 +108,43 @@ const ( StateType_STATE_INTERMEDIATE StateType = 1 ) -var StateType_name = map[int32]string{ - 0: "STATE_STABLE", - 1: "STATE_INTERMEDIATE", -} +// Enum value maps for StateType. +var ( + StateType_name = map[int32]string{ + 0: "STATE_STABLE", + 1: "STATE_INTERMEDIATE", + } + StateType_value = map[string]int32{ + "STATE_STABLE": 0, + "STATE_INTERMEDIATE": 1, + } +) -var StateType_value = map[string]int32{ - "STATE_STABLE": 0, - "STATE_INTERMEDIATE": 1, +func (x StateType) Enum() *StateType { + p := new(StateType) + *p = x + return p } func (x StateType) String() string { - return proto.EnumName(StateType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[1].Descriptor() +} + +func (StateType) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[1] +} + +func (x StateType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use StateType.Descriptor instead. func (StateType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{1} + return file_protos_occ_proto_rawDescGZIP(), []int{1} } type DeviceEventType int32 @@ -87,605 +155,843 @@ const ( DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 ) -var DeviceEventType_name = map[int32]string{ - 0: "NULL_DEVICE_EVENT", - 1: "END_OF_STREAM", - 2: "BASIC_TASK_TERMINATED", -} +// Enum value maps for DeviceEventType. +var ( + DeviceEventType_name = map[int32]string{ + 0: "NULL_DEVICE_EVENT", + 1: "END_OF_STREAM", + 2: "BASIC_TASK_TERMINATED", + } + DeviceEventType_value = map[string]int32{ + "NULL_DEVICE_EVENT": 0, + "END_OF_STREAM": 1, + "BASIC_TASK_TERMINATED": 2, + } +) -var DeviceEventType_value = map[string]int32{ - "NULL_DEVICE_EVENT": 0, - "END_OF_STREAM": 1, - "BASIC_TASK_TERMINATED": 2, +func (x DeviceEventType) Enum() *DeviceEventType { + p := new(DeviceEventType) + *p = x + return p } func (x DeviceEventType) String() string { - return proto.EnumName(DeviceEventType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceEventType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[2].Descriptor() +} + +func (DeviceEventType) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[2] +} + +func (x DeviceEventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use DeviceEventType.Descriptor instead. func (DeviceEventType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{2} + return file_protos_occ_proto_rawDescGZIP(), []int{2} } type StateStreamRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *StateStreamRequest) Reset() { *m = StateStreamRequest{} } -func (m *StateStreamRequest) String() string { return proto.CompactTextString(m) } -func (*StateStreamRequest) ProtoMessage() {} -func (*StateStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{0} -} -func (m *StateStreamRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateStreamRequest) Reset() { + *x = StateStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateStreamRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateStreamRequest.Merge(m, src) -} -func (m *StateStreamRequest) XXX_Size() int { - return m.Size() + +func (x *StateStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateStreamRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StateStreamRequest.DiscardUnknown(m) + +func (*StateStreamRequest) ProtoMessage() {} + +func (x *StateStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateStreamRequest proto.InternalMessageInfo +// Deprecated: Use StateStreamRequest.ProtoReflect.Descriptor instead. +func (*StateStreamRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{0} +} type StateStreamReply struct { - Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } -func (m *StateStreamReply) Reset() { *m = StateStreamReply{} } -func (m *StateStreamReply) String() string { return proto.CompactTextString(m) } -func (*StateStreamReply) ProtoMessage() {} -func (*StateStreamReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{1} -} -func (m *StateStreamReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateStreamReply) Reset() { + *x = StateStreamReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateStreamReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateStreamReply.Merge(m, src) -} -func (m *StateStreamReply) XXX_Size() int { - return m.Size() + +func (x *StateStreamReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateStreamReply) XXX_DiscardUnknown() { - xxx_messageInfo_StateStreamReply.DiscardUnknown(m) + +func (*StateStreamReply) ProtoMessage() {} + +func (x *StateStreamReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateStreamReply proto.InternalMessageInfo +// Deprecated: Use StateStreamReply.ProtoReflect.Descriptor instead. +func (*StateStreamReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{1} +} -func (m *StateStreamReply) GetType() StateType { - if m != nil { - return m.Type +func (x *StateStreamReply) GetType() StateType { + if x != nil { + return x.Type } return StateType_STATE_STABLE } -func (m *StateStreamReply) GetState() string { - if m != nil { - return m.State +func (x *StateStreamReply) GetState() string { + if x != nil { + return x.State } return "" } type EventStreamRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *EventStreamRequest) Reset() { *m = EventStreamRequest{} } -func (m *EventStreamRequest) String() string { return proto.CompactTextString(m) } -func (*EventStreamRequest) ProtoMessage() {} -func (*EventStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{2} -} -func (m *EventStreamRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EventStreamRequest) Reset() { + *x = EventStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EventStreamRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventStreamRequest.Merge(m, src) -} -func (m *EventStreamRequest) XXX_Size() int { - return m.Size() + +func (x *EventStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EventStreamRequest) XXX_DiscardUnknown() { - xxx_messageInfo_EventStreamRequest.DiscardUnknown(m) + +func (*EventStreamRequest) ProtoMessage() {} + +func (x *EventStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EventStreamRequest proto.InternalMessageInfo +// Deprecated: Use EventStreamRequest.ProtoReflect.Descriptor instead. +func (*EventStreamRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{2} +} type DeviceEvent struct { - Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` } -func (m *DeviceEvent) Reset() { *m = DeviceEvent{} } -func (m *DeviceEvent) String() string { return proto.CompactTextString(m) } -func (*DeviceEvent) ProtoMessage() {} -func (*DeviceEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{3} -} -func (m *DeviceEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DeviceEvent) Reset() { + *x = DeviceEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DeviceEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeviceEvent.Merge(m, src) -} -func (m *DeviceEvent) XXX_Size() int { - return m.Size() + +func (x *DeviceEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DeviceEvent) XXX_DiscardUnknown() { - xxx_messageInfo_DeviceEvent.DiscardUnknown(m) + +func (*DeviceEvent) ProtoMessage() {} + +func (x *DeviceEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DeviceEvent proto.InternalMessageInfo +// Deprecated: Use DeviceEvent.ProtoReflect.Descriptor instead. +func (*DeviceEvent) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{3} +} -func (m *DeviceEvent) GetType() DeviceEventType { - if m != nil { - return m.Type +func (x *DeviceEvent) GetType() DeviceEventType { + if x != nil { + return x.Type } return DeviceEventType_NULL_DEVICE_EVENT } type EventStreamReply struct { - Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` } -func (m *EventStreamReply) Reset() { *m = EventStreamReply{} } -func (m *EventStreamReply) String() string { return proto.CompactTextString(m) } -func (*EventStreamReply) ProtoMessage() {} -func (*EventStreamReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{4} -} -func (m *EventStreamReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EventStreamReply) Reset() { + *x = EventStreamReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EventStreamReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventStreamReply.Merge(m, src) -} -func (m *EventStreamReply) XXX_Size() int { - return m.Size() + +func (x *EventStreamReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EventStreamReply) XXX_DiscardUnknown() { - xxx_messageInfo_EventStreamReply.DiscardUnknown(m) + +func (*EventStreamReply) ProtoMessage() {} + +func (x *EventStreamReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EventStreamReply proto.InternalMessageInfo +// Deprecated: Use EventStreamReply.ProtoReflect.Descriptor instead. +func (*EventStreamReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{4} +} -func (m *EventStreamReply) GetEvent() *DeviceEvent { - if m != nil { - return m.Event +func (x *EventStreamReply) GetEvent() *DeviceEvent { + if x != nil { + return x.Event } return nil } type GetStateRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetStateRequest) Reset() { *m = GetStateRequest{} } -func (m *GetStateRequest) String() string { return proto.CompactTextString(m) } -func (*GetStateRequest) ProtoMessage() {} -func (*GetStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{5} -} -func (m *GetStateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetStateRequest) Reset() { + *x = GetStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetStateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetStateRequest.Merge(m, src) -} -func (m *GetStateRequest) XXX_Size() int { - return m.Size() + +func (x *GetStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetStateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetStateRequest.DiscardUnknown(m) + +func (*GetStateRequest) ProtoMessage() {} + +func (x *GetStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetStateRequest proto.InternalMessageInfo +// Deprecated: Use GetStateRequest.ProtoReflect.Descriptor instead. +func (*GetStateRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{5} +} type GetStateReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` } -func (m *GetStateReply) Reset() { *m = GetStateReply{} } -func (m *GetStateReply) String() string { return proto.CompactTextString(m) } -func (*GetStateReply) ProtoMessage() {} -func (*GetStateReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{6} -} -func (m *GetStateReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetStateReply) Reset() { + *x = GetStateReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetStateReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetStateReply.Merge(m, src) -} -func (m *GetStateReply) XXX_Size() int { - return m.Size() + +func (x *GetStateReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetStateReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetStateReply.DiscardUnknown(m) + +func (*GetStateReply) ProtoMessage() {} + +func (x *GetStateReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetStateReply proto.InternalMessageInfo +// Deprecated: Use GetStateReply.ProtoReflect.Descriptor instead. +func (*GetStateReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{6} +} -func (m *GetStateReply) GetState() string { - if m != nil { - return m.State +func (x *GetStateReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetStateReply) GetPid() int32 { - if m != nil { - return m.Pid +func (x *GetStateReply) GetPid() int32 { + if x != nil { + return x.Pid } return 0 } type ConfigEntry struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (m *ConfigEntry) Reset() { *m = ConfigEntry{} } -func (m *ConfigEntry) String() string { return proto.CompactTextString(m) } -func (*ConfigEntry) ProtoMessage() {} -func (*ConfigEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{7} -} -func (m *ConfigEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ConfigEntry) Reset() { + *x = ConfigEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ConfigEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConfigEntry.Merge(m, src) -} -func (m *ConfigEntry) XXX_Size() int { - return m.Size() + +func (x *ConfigEntry) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ConfigEntry) XXX_DiscardUnknown() { - xxx_messageInfo_ConfigEntry.DiscardUnknown(m) + +func (*ConfigEntry) ProtoMessage() {} + +func (x *ConfigEntry) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ConfigEntry proto.InternalMessageInfo +// Deprecated: Use ConfigEntry.ProtoReflect.Descriptor instead. +func (*ConfigEntry) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{7} +} -func (m *ConfigEntry) GetKey() string { - if m != nil { - return m.Key +func (x *ConfigEntry) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *ConfigEntry) GetValue() string { - if m != nil { - return m.Value +func (x *ConfigEntry) GetValue() string { + if x != nil { + return x.Value } return "" } type TransitionRequest struct { - SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` - TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` + TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` } -func (m *TransitionRequest) Reset() { *m = TransitionRequest{} } -func (m *TransitionRequest) String() string { return proto.CompactTextString(m) } -func (*TransitionRequest) ProtoMessage() {} -func (*TransitionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{8} -} -func (m *TransitionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TransitionRequest) Reset() { + *x = TransitionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TransitionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransitionRequest.Merge(m, src) -} -func (m *TransitionRequest) XXX_Size() int { - return m.Size() + +func (x *TransitionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TransitionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TransitionRequest.DiscardUnknown(m) + +func (*TransitionRequest) ProtoMessage() {} + +func (x *TransitionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TransitionRequest proto.InternalMessageInfo +// Deprecated: Use TransitionRequest.ProtoReflect.Descriptor instead. +func (*TransitionRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{8} +} -func (m *TransitionRequest) GetSrcState() string { - if m != nil { - return m.SrcState +func (x *TransitionRequest) GetSrcState() string { + if x != nil { + return x.SrcState } return "" } -func (m *TransitionRequest) GetTransitionEvent() string { - if m != nil { - return m.TransitionEvent +func (x *TransitionRequest) GetTransitionEvent() string { + if x != nil { + return x.TransitionEvent } return "" } -func (m *TransitionRequest) GetArguments() []*ConfigEntry { - if m != nil { - return m.Arguments +func (x *TransitionRequest) GetArguments() []*ConfigEntry { + if x != nil { + return x.Arguments } return nil } type TransitionReply struct { - Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TransitionReply) Reset() { *m = TransitionReply{} } -func (m *TransitionReply) String() string { return proto.CompactTextString(m) } -func (*TransitionReply) ProtoMessage() {} -func (*TransitionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{9} -} -func (m *TransitionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` } -func (m *TransitionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransitionReply.Merge(m, src) + +func (x *TransitionReply) Reset() { + *x = TransitionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TransitionReply) XXX_Size() int { - return m.Size() + +func (x *TransitionReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TransitionReply) XXX_DiscardUnknown() { - xxx_messageInfo_TransitionReply.DiscardUnknown(m) + +func (*TransitionReply) ProtoMessage() {} + +func (x *TransitionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TransitionReply proto.InternalMessageInfo +// Deprecated: Use TransitionReply.ProtoReflect.Descriptor instead. +func (*TransitionReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{9} +} -func (m *TransitionReply) GetTrigger() StateChangeTrigger { - if m != nil { - return m.Trigger +func (x *TransitionReply) GetTrigger() StateChangeTrigger { + if x != nil { + return x.Trigger } return StateChangeTrigger_EXECUTOR } -func (m *TransitionReply) GetState() string { - if m != nil { - return m.State +func (x *TransitionReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *TransitionReply) GetTransitionEvent() string { - if m != nil { - return m.TransitionEvent +func (x *TransitionReply) GetTransitionEvent() string { + if x != nil { + return x.TransitionEvent } return "" } -func (m *TransitionReply) GetOk() bool { - if m != nil { - return m.Ok +func (x *TransitionReply) GetOk() bool { + if x != nil { + return x.Ok } return false } -func init() { - proto.RegisterEnum("occ_pb.StateChangeTrigger", StateChangeTrigger_name, StateChangeTrigger_value) - proto.RegisterEnum("occ_pb.StateType", StateType_name, StateType_value) - proto.RegisterEnum("occ_pb.DeviceEventType", DeviceEventType_name, DeviceEventType_value) - proto.RegisterType((*StateStreamRequest)(nil), "occ_pb.StateStreamRequest") - proto.RegisterType((*StateStreamReply)(nil), "occ_pb.StateStreamReply") - proto.RegisterType((*EventStreamRequest)(nil), "occ_pb.EventStreamRequest") - proto.RegisterType((*DeviceEvent)(nil), "occ_pb.DeviceEvent") - proto.RegisterType((*EventStreamReply)(nil), "occ_pb.EventStreamReply") - proto.RegisterType((*GetStateRequest)(nil), "occ_pb.GetStateRequest") - proto.RegisterType((*GetStateReply)(nil), "occ_pb.GetStateReply") - proto.RegisterType((*ConfigEntry)(nil), "occ_pb.ConfigEntry") - proto.RegisterType((*TransitionRequest)(nil), "occ_pb.TransitionRequest") - proto.RegisterType((*TransitionReply)(nil), "occ_pb.TransitionReply") -} - -func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } - -var fileDescriptor_17fd8faceeeb3e6c = []byte{ - // 637 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xd1, 0x6e, 0xda, 0x4a, - 0x10, 0x65, 0x4d, 0x92, 0x4b, 0x86, 0x24, 0x98, 0xbd, 0xc9, 0x0d, 0x41, 0x57, 0x08, 0x59, 0xba, - 0x12, 0x37, 0x95, 0xdc, 0x96, 0x36, 0xaa, 0x54, 0xb5, 0x0f, 0x06, 0xb6, 0x11, 0x2a, 0x31, 0xd2, - 0x7a, 0x13, 0x55, 0x7d, 0xb1, 0x1c, 0x77, 0x4b, 0xac, 0x10, 0xdb, 0x35, 0x9b, 0x48, 0xfc, 0x43, - 0xdf, 0xdb, 0xfe, 0x51, 0x1f, 0xfb, 0x09, 0x55, 0xfa, 0x23, 0xd5, 0x2e, 0x60, 0x6c, 0x42, 0xdf, - 0xbc, 0x33, 0x67, 0xcf, 0x39, 0x33, 0x3b, 0x63, 0xd0, 0xe3, 0x24, 0x12, 0xd1, 0xe4, 0x71, 0xe4, - 0xfb, 0xa6, 0xfa, 0xc4, 0x5b, 0x91, 0xef, 0xbb, 0xf1, 0xa5, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, - 0x8e, 0x48, 0xb8, 0x77, 0x43, 0xf9, 0xa7, 0x5b, 0x3e, 0x11, 0xc6, 0x10, 0xf4, 0x5c, 0x34, 0x1e, - 0x4f, 0xf1, 0x7f, 0xb0, 0x21, 0xa6, 0x31, 0xaf, 0xa1, 0x26, 0x6a, 0xed, 0xb5, 0xab, 0xe6, 0x8c, - 0xc0, 0x54, 0x38, 0x36, 0x8d, 0x39, 0x55, 0x69, 0xbc, 0x0f, 0x9b, 0x13, 0x19, 0xaa, 0x69, 0x4d, - 0xd4, 0xda, 0xa6, 0xb3, 0x83, 0x94, 0x21, 0x77, 0x3c, 0x14, 0x79, 0x99, 0x97, 0x50, 0xee, 0xf1, - 0xbb, 0xc0, 0xe7, 0x2a, 0x87, 0x1f, 0xe5, 0x14, 0x0e, 0x17, 0x0a, 0x19, 0xc8, 0x52, 0xc7, 0x78, - 0x0d, 0x7a, 0x8e, 0x51, 0x5a, 0xfc, 0x1f, 0x36, 0xb9, 0x8c, 0x29, 0x86, 0x72, 0xfb, 0xef, 0x35, - 0x0c, 0x74, 0x86, 0x30, 0xaa, 0x50, 0x39, 0xe5, 0x42, 0x99, 0x5f, 0xb8, 0x79, 0x01, 0xbb, 0xcb, - 0x90, 0xa4, 0x4b, 0x4b, 0x41, 0x99, 0x52, 0xb0, 0x0e, 0xc5, 0x38, 0xf8, 0xa0, 0xca, 0xdb, 0xa4, - 0xf2, 0xd3, 0x38, 0x81, 0x72, 0x37, 0x0a, 0x3f, 0x06, 0x23, 0x12, 0x8a, 0x64, 0x2a, 0x01, 0xd7, - 0x7c, 0x3a, 0xbf, 0x24, 0x3f, 0x25, 0xd1, 0x9d, 0x37, 0xbe, 0x4d, 0x7b, 0xa2, 0x0e, 0xc6, 0x67, - 0x04, 0x55, 0x96, 0x78, 0xe1, 0x24, 0x10, 0x41, 0x14, 0xce, 0x5d, 0xe0, 0x3a, 0x94, 0x26, 0x89, - 0xef, 0x64, 0x74, 0xd3, 0x33, 0x6e, 0x41, 0x45, 0xa4, 0x17, 0x54, 0x39, 0x73, 0xc6, 0xd5, 0x30, - 0x7e, 0x0a, 0xdb, 0x5e, 0x32, 0xba, 0xbd, 0xe1, 0xa1, 0x98, 0xd4, 0x8a, 0xcd, 0x62, 0xb6, 0x1b, - 0x19, 0xaf, 0x74, 0x89, 0x32, 0xbe, 0x20, 0xa8, 0x64, 0xed, 0xc8, 0x0e, 0x3c, 0x87, 0xbf, 0x44, - 0x12, 0x8c, 0x46, 0x3c, 0x99, 0x3f, 0x4a, 0x3d, 0xf7, 0xec, 0xdd, 0x2b, 0x2f, 0x1c, 0x71, 0x36, - 0x43, 0xd0, 0x05, 0x74, 0xfd, 0x08, 0xac, 0x33, 0x5f, 0x5c, 0x6f, 0x7e, 0x0f, 0xb4, 0xe8, 0xba, - 0xb6, 0xd1, 0x44, 0xad, 0x12, 0xd5, 0xa2, 0xeb, 0xe3, 0xc1, 0x7c, 0x46, 0x73, 0x72, 0x78, 0x07, - 0x4a, 0xe4, 0x1d, 0xe9, 0x9e, 0xb3, 0x21, 0xd5, 0x0b, 0xf8, 0x1f, 0xc0, 0x3d, 0x72, 0xd1, 0xef, - 0x12, 0xb7, 0x6f, 0x33, 0x62, 0xb3, 0xfe, 0xd0, 0xb6, 0x06, 0x3a, 0xc2, 0x3a, 0xec, 0xcc, 0xe3, - 0x84, 0xd2, 0x21, 0xd5, 0xb5, 0xe3, 0x13, 0xd8, 0x4e, 0x67, 0x56, 0xa6, 0x1d, 0x66, 0x31, 0xe2, - 0x3a, 0xcc, 0xea, 0x0c, 0xc8, 0x8c, 0x68, 0x16, 0x91, 0x3c, 0xf4, 0x8c, 0xf4, 0xfa, 0x16, 0x23, - 0x3a, 0x3a, 0xbe, 0x80, 0xca, 0xca, 0x20, 0xe2, 0x03, 0xa8, 0xda, 0xe7, 0x83, 0x81, 0xbb, 0x10, - 0xb8, 0x20, 0x36, 0xd3, 0x0b, 0xb8, 0x0a, 0xbb, 0xc4, 0xee, 0xb9, 0xc3, 0x37, 0xae, 0xc3, 0x28, - 0xb1, 0xce, 0x74, 0x84, 0x8f, 0xe0, 0xa0, 0x63, 0x39, 0xfd, 0xae, 0xcb, 0x2c, 0xe7, 0xad, 0x2b, - 0x79, 0xfb, 0xb6, 0xc5, 0x48, 0x4f, 0xd7, 0xda, 0xdf, 0x34, 0x28, 0x0e, 0x7d, 0x1f, 0x9f, 0x42, - 0x39, 0x33, 0xcf, 0x38, 0x6d, 0xf4, 0xc3, 0xb5, 0xa9, 0xd7, 0xd6, 0xe6, 0xe2, 0xf1, 0xd4, 0x28, - 0x3c, 0x41, 0x92, 0x28, 0xb3, 0xbb, 0x38, 0xff, 0x62, 0x7f, 0x20, 0x5a, 0x5d, 0x76, 0x45, 0xf4, - 0x0a, 0x4a, 0x8b, 0x7d, 0xc0, 0xe9, 0x32, 0xae, 0x2c, 0x4d, 0xfd, 0xe0, 0x61, 0x42, 0xdd, 0xc7, - 0x1d, 0x80, 0xe5, 0x34, 0xe1, 0xa3, 0x05, 0xec, 0xc1, 0xc0, 0xd7, 0x0f, 0xd7, 0xa5, 0x14, 0x47, - 0xa7, 0xfd, 0xfd, 0xbe, 0x81, 0x7e, 0xdc, 0x37, 0xd0, 0xcf, 0xfb, 0x06, 0xfa, 0xfa, 0xab, 0x51, - 0x80, 0x7f, 0xfd, 0x2b, 0xd3, 0xe7, 0x49, 0x68, 0x7a, 0xe3, 0xc0, 0xe7, 0x66, 0xd4, 0x36, 0xfd, - 0x28, 0x14, 0x49, 0x34, 0x96, 0x24, 0xef, 0xb5, 0xf8, 0xf2, 0x72, 0x4b, 0xfd, 0xdf, 0x9e, 0xfd, - 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x94, 0x47, 0x22, 0xf3, 0x04, 0x00, 0x00, +var File_protos_occ_proto protoreflect.FileDescriptor + +var file_protos_occ_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x63, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x06, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x4f, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x14, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3d, 0x0a, 0x10, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x35, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x2a, 0x4c, + 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x4f, 0x52, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x54, + 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x2a, 0x56, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x11, 0x0a, + 0x0d, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x54, + 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0x99, 0x02, 0x0a, 0x03, + 0x4f, 0x63, 0x63, 0x12, 0x47, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x0b, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, + 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6f, 0x63, 0x63, + 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x29, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_occ_proto_rawDescOnce sync.Once + file_protos_occ_proto_rawDescData = file_protos_occ_proto_rawDesc +) + +func file_protos_occ_proto_rawDescGZIP() []byte { + file_protos_occ_proto_rawDescOnce.Do(func() { + file_protos_occ_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_occ_proto_rawDescData) + }) + return file_protos_occ_proto_rawDescData +} + +var file_protos_occ_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_occ_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_protos_occ_proto_goTypes = []interface{}{ + (StateChangeTrigger)(0), // 0: occ_pb.StateChangeTrigger + (StateType)(0), // 1: occ_pb.StateType + (DeviceEventType)(0), // 2: occ_pb.DeviceEventType + (*StateStreamRequest)(nil), // 3: occ_pb.StateStreamRequest + (*StateStreamReply)(nil), // 4: occ_pb.StateStreamReply + (*EventStreamRequest)(nil), // 5: occ_pb.EventStreamRequest + (*DeviceEvent)(nil), // 6: occ_pb.DeviceEvent + (*EventStreamReply)(nil), // 7: occ_pb.EventStreamReply + (*GetStateRequest)(nil), // 8: occ_pb.GetStateRequest + (*GetStateReply)(nil), // 9: occ_pb.GetStateReply + (*ConfigEntry)(nil), // 10: occ_pb.ConfigEntry + (*TransitionRequest)(nil), // 11: occ_pb.TransitionRequest + (*TransitionReply)(nil), // 12: occ_pb.TransitionReply +} +var file_protos_occ_proto_depIdxs = []int32{ + 1, // 0: occ_pb.StateStreamReply.type:type_name -> occ_pb.StateType + 2, // 1: occ_pb.DeviceEvent.type:type_name -> occ_pb.DeviceEventType + 6, // 2: occ_pb.EventStreamReply.event:type_name -> occ_pb.DeviceEvent + 10, // 3: occ_pb.TransitionRequest.arguments:type_name -> occ_pb.ConfigEntry + 0, // 4: occ_pb.TransitionReply.trigger:type_name -> occ_pb.StateChangeTrigger + 5, // 5: occ_pb.Occ.EventStream:input_type -> occ_pb.EventStreamRequest + 3, // 6: occ_pb.Occ.StateStream:input_type -> occ_pb.StateStreamRequest + 8, // 7: occ_pb.Occ.GetState:input_type -> occ_pb.GetStateRequest + 11, // 8: occ_pb.Occ.Transition:input_type -> occ_pb.TransitionRequest + 7, // 9: occ_pb.Occ.EventStream:output_type -> occ_pb.EventStreamReply + 4, // 10: occ_pb.Occ.StateStream:output_type -> occ_pb.StateStreamReply + 9, // 11: occ_pb.Occ.GetState:output_type -> occ_pb.GetStateReply + 12, // 12: occ_pb.Occ.Transition:output_type -> occ_pb.TransitionReply + 9, // [9:13] is the sub-list for method output_type + 5, // [5:9] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_protos_occ_proto_init() } +func file_protos_occ_proto_init() { + if File_protos_occ_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_occ_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateStreamReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventStreamReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransitionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransitionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_occ_proto_rawDesc, + NumEnums: 3, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_occ_proto_goTypes, + DependencyIndexes: file_protos_occ_proto_depIdxs, + EnumInfos: file_protos_occ_proto_enumTypes, + MessageInfos: file_protos_occ_proto_msgTypes, + }.Build() + File_protos_occ_proto = out.File + file_protos_occ_proto_rawDesc = nil + file_protos_occ_proto_goTypes = nil + file_protos_occ_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // OccClient is the client API for Occ service. // @@ -700,10 +1006,10 @@ type OccClient interface { } type occClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewOccClient(cc *grpc.ClientConn) OccClient { +func NewOccClient(cc grpc.ClientConnInterface) OccClient { return &occClient{cc} } @@ -803,16 +1109,16 @@ type OccServer interface { type UnimplementedOccServer struct { } -func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { +func (*UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { return status.Errorf(codes.Unimplemented, "method EventStream not implemented") } -func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { +func (*UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { return status.Errorf(codes.Unimplemented, "method StateStream not implemented") } -func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { +func (*UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") } -func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { +func (*UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") } @@ -925,1626 +1231,3 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ }, Metadata: "protos/occ.proto", } - -func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Event != nil { - { - size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetStateReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Pid != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Pid)) - i-- - dAtA[i] = 0x10 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x12 - } - if len(m.SrcState) > 0 { - i -= len(m.SrcState) - copy(dAtA[i:], m.SrcState) - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TransitionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Ok { - i-- - if m.Ok { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x1a - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Trigger != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { - offset -= sovOcc(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *StateStreamRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StateStreamReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovOcc(uint64(m.Type)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EventStreamRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DeviceEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovOcc(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EventStreamReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Event != nil { - l = m.Event.Size() - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetStateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetStateReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.Pid != 0 { - n += 1 + sovOcc(uint64(m.Pid)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ConfigEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TransitionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SrcState) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.TransitionEvent) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, e := range m.Arguments { - l = e.Size() - n += 1 + l + sovOcc(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TransitionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Trigger != 0 { - n += 1 + sovOcc(uint64(m.Trigger)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.TransitionEvent) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.Ok { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovOcc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozOcc(x uint64) (n int) { - return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *StateStreamRequest) 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 ErrIntOverflowOcc - } - 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: StateStreamRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StateStreamReply) 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 ErrIntOverflowOcc - } - 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: StateStreamReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateStreamReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= StateType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventStreamRequest) 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 ErrIntOverflowOcc - } - 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: EventStreamRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DeviceEvent) 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 ErrIntOverflowOcc - } - 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: DeviceEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DeviceEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= DeviceEventType(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventStreamReply) 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 ErrIntOverflowOcc - } - 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: EventStreamReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventStreamReply: 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 msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOcc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Event == nil { - m.Event = &DeviceEvent{} - } - if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetStateRequest) 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 ErrIntOverflowOcc - } - 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: GetStateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetStateReply) 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 ErrIntOverflowOcc - } - 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: GetStateReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetStateReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - m.Pid = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Pid |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ConfigEntry) 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 ErrIntOverflowOcc - } - 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: ConfigEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConfigEntry: 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 ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - 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 Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TransitionRequest) 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 ErrIntOverflowOcc - } - 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: TransitionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransitionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SrcState", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SrcState = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TransitionEvent = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOcc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, &ConfigEntry{}) - if err := m.Arguments[len(m.Arguments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TransitionReply) 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 ErrIntOverflowOcc - } - 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: TransitionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransitionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Trigger", wireType) - } - m.Trigger = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Trigger |= StateChangeTrigger(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TransitionEvent = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ok = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipOcc(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - 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, ErrIntOverflowOcc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthOcc - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOcc - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go.mod b/go.mod index 7b2c940ed..5fe629dc1 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.3 // Issue: https://github.com/etcd-io/etcd/issues/11563 replace ( github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 - google.golang.org/grpc => google.golang.org/grpc v1.30.0 + google.golang.org/grpc => google.golang.org/grpc v1.34.0 ) // Issue: https://github.com/rivo/tview/issues/416 @@ -34,10 +34,8 @@ require ( github.com/go-git/go-git/v5 v5.1.0 github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 - github.com/gogo/protobuf v1.3.1 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.4.2 - github.com/google/uuid v1.1.1 // indirect + github.com/golang/protobuf v1.4.3 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect @@ -102,11 +100,14 @@ require ( go.etcd.io/bbolt v1.3.4 // indirect go.uber.org/zap v1.14.1 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20200707034311-ab3426394381 - golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc + golang.org/x/net v0.0.0-20210119194325-5f4716e94777 + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c + golang.org/x/text v0.3.5 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect - google.golang.org/grpc v1.31.0 + google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 // indirect + google.golang.org/grpc v1.35.0 google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect + google.golang.org/protobuf v1.25.0 gopkg.in/ini.v1 v1.55.0 // indirect gopkg.in/osteele/liquid.v1 v1.2.4 // indirect gopkg.in/yaml.v2 v2.3.0 // indirect diff --git a/go.sum b/go.sum index 2e5d401b9..2f4c975f9 100644 --- a/go.sum +++ b/go.sum @@ -129,6 +129,7 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMn github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= @@ -150,6 +151,7 @@ github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= @@ -162,6 +164,7 @@ github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= @@ -210,9 +213,9 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -243,6 +246,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -272,6 +277,8 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -794,6 +801,10 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= +golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -867,6 +878,12 @@ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/ golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc h1:HVFDs9bKvTxP6bh1Rj9MCSo+UmafQtI8ZWDPVwVk9g4= golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs= +golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -874,6 +891,10 @@ golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1002,10 +1023,16 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 h1:m9+RjTMas6brUP8DBxSAa/WIPFy7FIhKpvk+9Ppce8E= +google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d h1:vV+xpotnpsR73kzOS8o8hxDlc7Er+H5WZqOBwWcGktk= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d/go.mod h1:Lh55/1hxmVHEkOvSIQ2uj0P12QyOCUNyRwnUlSS13hw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1027,6 +1054,7 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogR gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= diff --git a/occ/protos/occ.proto b/occ/protos/occ.proto index c4fa429bc..20d53239b 100644 --- a/occ/protos/occ.proto +++ b/occ/protos/occ.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package occ_pb; option java_package = "ch.cern.alice.o2.control.occ"; -option go_package = "pb"; +option go_package = "protos;pb"; ////////////////////////////////////////////////////// diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go index 789d482c4..3c2baec99 100644 --- a/odcshim/occserver/handlers.go +++ b/odcshim/occserver/handlers.go @@ -464,8 +464,6 @@ func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, argume } func printGrpcError(err error) error { - // We must process the error explicitly here, otherwise we get an error because gRPC's - // Status is different from what gogoproto expects. grpcStatus, ok := status.FromError(err) if ok { log.WithFields(logrus.Fields{ diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 3c4adadae..2b0f53dbd 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -1,208 +1,232 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 // source: odcprotos/odc.proto package odc import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 // Request status type ReplyStatus int32 const ( - ReplyStatus_UNKNOWN ReplyStatus = 0 - ReplyStatus_SUCCESS ReplyStatus = 1 - ReplyStatus_ERROR ReplyStatus = 2 + ReplyStatus_UNKNOWN ReplyStatus = 0 // Status is unknown + ReplyStatus_SUCCESS ReplyStatus = 1 // Request performed successfully + ReplyStatus_ERROR ReplyStatus = 2 // Failed to perform request ) -var ReplyStatus_name = map[int32]string{ - 0: "UNKNOWN", - 1: "SUCCESS", - 2: "ERROR", -} +// Enum value maps for ReplyStatus. +var ( + ReplyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SUCCESS", + 2: "ERROR", + } + ReplyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "SUCCESS": 1, + "ERROR": 2, + } +) -var ReplyStatus_value = map[string]int32{ - "UNKNOWN": 0, - "SUCCESS": 1, - "ERROR": 2, +func (x ReplyStatus) Enum() *ReplyStatus { + p := new(ReplyStatus) + *p = x + return p } func (x ReplyStatus) String() string { - return proto.EnumName(ReplyStatus_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReplyStatus) Descriptor() protoreflect.EnumDescriptor { + return file_odcprotos_odc_proto_enumTypes[0].Descriptor() +} + +func (ReplyStatus) Type() protoreflect.EnumType { + return &file_odcprotos_odc_proto_enumTypes[0] +} + +func (x ReplyStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use ReplyStatus.Descriptor instead. func (ReplyStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{0} + return file_odcprotos_odc_proto_rawDescGZIP(), []int{0} } // General error type Error struct { - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed error message + Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` // Error code. } -func (m *Error) Reset() { *m = Error{} } -func (m *Error) String() string { return proto.CompactTextString(m) } -func (*Error) ProtoMessage() {} -func (*Error) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{0} -} -func (m *Error) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Error) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Error.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Error) Reset() { + *x = Error{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Error) XXX_Merge(src proto.Message) { - xxx_messageInfo_Error.Merge(m, src) -} -func (m *Error) XXX_Size() int { - return m.Size() + +func (x *Error) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Error) XXX_DiscardUnknown() { - xxx_messageInfo_Error.DiscardUnknown(m) + +func (*Error) ProtoMessage() {} + +func (x *Error) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Error proto.InternalMessageInfo +// Deprecated: Use Error.ProtoReflect.Descriptor instead. +func (*Error) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{0} +} -func (m *Error) GetMsg() string { - if m != nil { - return m.Msg +func (x *Error) GetMsg() string { + if x != nil { + return x.Msg } return "" } -func (m *Error) GetCode() int32 { - if m != nil { - return m.Code +func (x *Error) GetCode() int32 { + if x != nil { + return x.Code } return 0 } // General reply to requests type GeneralReply struct { - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` - Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` - Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` - Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` - Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` - State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GeneralReply) Reset() { *m = GeneralReply{} } -func (m *GeneralReply) String() string { return proto.CompactTextString(m) } -func (*GeneralReply) ProtoMessage() {} -func (*GeneralReply) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{1} -} -func (m *GeneralReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GeneralReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GeneralReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed reply message + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` // Request status code (UNKNOWN, SUCCESS, ERROR) + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms + Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID + State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. } -func (m *GeneralReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GeneralReply.Merge(m, src) + +func (x *GeneralReply) Reset() { + *x = GeneralReply{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GeneralReply) XXX_Size() int { - return m.Size() + +func (x *GeneralReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GeneralReply) XXX_DiscardUnknown() { - xxx_messageInfo_GeneralReply.DiscardUnknown(m) + +func (*GeneralReply) ProtoMessage() {} + +func (x *GeneralReply) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GeneralReply proto.InternalMessageInfo +// Deprecated: Use GeneralReply.ProtoReflect.Descriptor instead. +func (*GeneralReply) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{1} +} -func (m *GeneralReply) GetMsg() string { - if m != nil { - return m.Msg +func (x *GeneralReply) GetMsg() string { + if x != nil { + return x.Msg } return "" } -func (m *GeneralReply) GetStatus() ReplyStatus { - if m != nil { - return m.Status +func (x *GeneralReply) GetStatus() ReplyStatus { + if x != nil { + return x.Status } return ReplyStatus_UNKNOWN } -func (m *GeneralReply) GetError() *Error { - if m != nil { - return m.Error +func (x *GeneralReply) GetError() *Error { + if x != nil { + return x.Error } return nil } -func (m *GeneralReply) GetExectime() int32 { - if m != nil { - return m.Exectime +func (x *GeneralReply) GetExectime() int32 { + if x != nil { + return x.Exectime } return 0 } -func (m *GeneralReply) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *GeneralReply) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *GeneralReply) GetSessionid() string { - if m != nil { - return m.Sessionid +func (x *GeneralReply) GetSessionid() string { + if x != nil { + return x.Sessionid } return "" } -func (m *GeneralReply) GetState() string { - if m != nil { - return m.State +func (x *GeneralReply) GetState() string { + if x != nil { + return x.State } return "" } @@ -211,951 +235,1343 @@ func (m *GeneralReply) GetState() string { // Runtime task ID and path are the same as in DDS. // To get task details use DDS Topology API. type Device struct { - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) } -func (m *Device) Reset() { *m = Device{} } -func (m *Device) String() string { return proto.CompactTextString(m) } -func (*Device) ProtoMessage() {} -func (*Device) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{2} -} -func (m *Device) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Device) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Device.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Device) Reset() { + *x = Device{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Device) XXX_Merge(src proto.Message) { - xxx_messageInfo_Device.Merge(m, src) -} -func (m *Device) XXX_Size() int { - return m.Size() + +func (x *Device) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Device) XXX_DiscardUnknown() { - xxx_messageInfo_Device.DiscardUnknown(m) + +func (*Device) ProtoMessage() {} + +func (x *Device) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Device proto.InternalMessageInfo +// Deprecated: Use Device.ProtoReflect.Descriptor instead. +func (*Device) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{2} +} -func (m *Device) GetId() uint64 { - if m != nil { - return m.Id +func (x *Device) GetId() uint64 { + if x != nil { + return x.Id } return 0 } -func (m *Device) GetState() string { - if m != nil { - return m.State +func (x *Device) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Device) GetPath() string { - if m != nil { - return m.Path +func (x *Device) GetPath() string { + if x != nil { + return x.Path } return "" } // Device change/get state request type StateRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. + Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` // If true then a list of affected devices is populated in the reply. } -func (m *StateRequest) Reset() { *m = StateRequest{} } -func (m *StateRequest) String() string { return proto.CompactTextString(m) } -func (*StateRequest) ProtoMessage() {} -func (*StateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{3} -} -func (m *StateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateRequest) Reset() { + *x = StateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateRequest.Merge(m, src) -} -func (m *StateRequest) XXX_Size() int { - return m.Size() + +func (x *StateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StateRequest.DiscardUnknown(m) + +func (*StateRequest) ProtoMessage() {} + +func (x *StateRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateRequest proto.InternalMessageInfo +// Deprecated: Use StateRequest.ProtoReflect.Descriptor instead. +func (*StateRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{3} +} -func (m *StateRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *StateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *StateRequest) GetPath() string { - if m != nil { - return m.Path +func (x *StateRequest) GetPath() string { + if x != nil { + return x.Path } return "" } -func (m *StateRequest) GetDetailed() bool { - if m != nil { - return m.Detailed +func (x *StateRequest) GetDetailed() bool { + if x != nil { + return x.Detailed } return false } // Device change/get state reply type StateReply struct { - Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` - Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` // General reply. See GeneralReply message for details. + Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. } -func (m *StateReply) Reset() { *m = StateReply{} } -func (m *StateReply) String() string { return proto.CompactTextString(m) } -func (*StateReply) ProtoMessage() {} -func (*StateReply) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{4} -} -func (m *StateReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateReply) Reset() { + *x = StateReply{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateReply.Merge(m, src) -} -func (m *StateReply) XXX_Size() int { - return m.Size() + +func (x *StateReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateReply) XXX_DiscardUnknown() { - xxx_messageInfo_StateReply.DiscardUnknown(m) + +func (*StateReply) ProtoMessage() {} + +func (x *StateReply) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateReply proto.InternalMessageInfo +// Deprecated: Use StateReply.ProtoReflect.Descriptor instead. +func (*StateReply) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{4} +} -func (m *StateReply) GetReply() *GeneralReply { - if m != nil { - return m.Reply +func (x *StateReply) GetReply() *GeneralReply { + if x != nil { + return x.Reply } return nil } -func (m *StateReply) GetDevices() []*Device { - if m != nil { - return m.Devices +func (x *StateReply) GetDevices() []*Device { + if x != nil { + return x.Devices } return nil } // Initialize request type InitializeRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. } -func (m *InitializeRequest) Reset() { *m = InitializeRequest{} } -func (m *InitializeRequest) String() string { return proto.CompactTextString(m) } -func (*InitializeRequest) ProtoMessage() {} -func (*InitializeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{5} -} -func (m *InitializeRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *InitializeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_InitializeRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *InitializeRequest) Reset() { + *x = InitializeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *InitializeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_InitializeRequest.Merge(m, src) -} -func (m *InitializeRequest) XXX_Size() int { - return m.Size() + +func (x *InitializeRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *InitializeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_InitializeRequest.DiscardUnknown(m) + +func (*InitializeRequest) ProtoMessage() {} + +func (x *InitializeRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_InitializeRequest proto.InternalMessageInfo +// Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. +func (*InitializeRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{5} +} -func (m *InitializeRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *InitializeRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *InitializeRequest) GetSessionid() string { - if m != nil { - return m.Sessionid +func (x *InitializeRequest) GetSessionid() string { + if x != nil { + return x.Sessionid } return "" } // Submit request type SubmitRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS } -func (m *SubmitRequest) Reset() { *m = SubmitRequest{} } -func (m *SubmitRequest) String() string { return proto.CompactTextString(m) } -func (*SubmitRequest) ProtoMessage() {} -func (*SubmitRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{6} -} -func (m *SubmitRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SubmitRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SubmitRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SubmitRequest) Reset() { + *x = SubmitRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SubmitRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SubmitRequest.Merge(m, src) -} -func (m *SubmitRequest) XXX_Size() int { - return m.Size() + +func (x *SubmitRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SubmitRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SubmitRequest.DiscardUnknown(m) + +func (*SubmitRequest) ProtoMessage() {} + +func (x *SubmitRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SubmitRequest proto.InternalMessageInfo +// Deprecated: Use SubmitRequest.ProtoReflect.Descriptor instead. +func (*SubmitRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{6} +} -func (m *SubmitRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *SubmitRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } // Activate request type ActivateRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file } -func (m *ActivateRequest) Reset() { *m = ActivateRequest{} } -func (m *ActivateRequest) String() string { return proto.CompactTextString(m) } -func (*ActivateRequest) ProtoMessage() {} -func (*ActivateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{7} -} -func (m *ActivateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ActivateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ActivateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ActivateRequest) Reset() { + *x = ActivateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ActivateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ActivateRequest.Merge(m, src) -} -func (m *ActivateRequest) XXX_Size() int { - return m.Size() + +func (x *ActivateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ActivateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ActivateRequest.DiscardUnknown(m) + +func (*ActivateRequest) ProtoMessage() {} + +func (x *ActivateRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ActivateRequest proto.InternalMessageInfo +// Deprecated: Use ActivateRequest.ProtoReflect.Descriptor instead. +func (*ActivateRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{7} +} -func (m *ActivateRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *ActivateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *ActivateRequest) GetTopology() string { - if m != nil { - return m.Topology +func (x *ActivateRequest) GetTopology() string { + if x != nil { + return x.Topology } return "" } // Run request type RunRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file } -func (m *RunRequest) Reset() { *m = RunRequest{} } -func (m *RunRequest) String() string { return proto.CompactTextString(m) } -func (*RunRequest) ProtoMessage() {} -func (*RunRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{8} -} -func (m *RunRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RunRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RunRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *RunRequest) Reset() { + *x = RunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *RunRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RunRequest.Merge(m, src) -} -func (m *RunRequest) XXX_Size() int { - return m.Size() + +func (x *RunRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RunRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RunRequest.DiscardUnknown(m) + +func (*RunRequest) ProtoMessage() {} + +func (x *RunRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RunRequest proto.InternalMessageInfo +// Deprecated: Use RunRequest.ProtoReflect.Descriptor instead. +func (*RunRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{8} +} -func (m *RunRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *RunRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *RunRequest) GetTopology() string { - if m != nil { - return m.Topology +func (x *RunRequest) GetTopology() string { + if x != nil { + return x.Topology } return "" } // Update request type UpdateRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file } -func (m *UpdateRequest) Reset() { *m = UpdateRequest{} } -func (m *UpdateRequest) String() string { return proto.CompactTextString(m) } -func (*UpdateRequest) ProtoMessage() {} -func (*UpdateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{9} -} -func (m *UpdateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *UpdateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_UpdateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *UpdateRequest) Reset() { + *x = UpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *UpdateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_UpdateRequest.Merge(m, src) -} -func (m *UpdateRequest) XXX_Size() int { - return m.Size() + +func (x *UpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *UpdateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_UpdateRequest.DiscardUnknown(m) + +func (*UpdateRequest) ProtoMessage() {} + +func (x *UpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_UpdateRequest proto.InternalMessageInfo +// Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. +func (*UpdateRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{9} +} -func (m *UpdateRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *UpdateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *UpdateRequest) GetTopology() string { - if m != nil { - return m.Topology +func (x *UpdateRequest) GetTopology() string { + if x != nil { + return x.Topology } return "" } // Shutdown request type ShutdownRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS } -func (m *ShutdownRequest) Reset() { *m = ShutdownRequest{} } -func (m *ShutdownRequest) String() string { return proto.CompactTextString(m) } -func (*ShutdownRequest) ProtoMessage() {} -func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{10} -} -func (m *ShutdownRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ShutdownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ShutdownRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ShutdownRequest) Reset() { + *x = ShutdownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ShutdownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShutdownRequest.Merge(m, src) -} -func (m *ShutdownRequest) XXX_Size() int { - return m.Size() + +func (x *ShutdownRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ShutdownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ShutdownRequest.DiscardUnknown(m) + +func (*ShutdownRequest) ProtoMessage() {} + +func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ShutdownRequest proto.InternalMessageInfo +// Deprecated: Use ShutdownRequest.ProtoReflect.Descriptor instead. +func (*ShutdownRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{10} +} -func (m *ShutdownRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *ShutdownRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } // Key-Value property type Property struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Property key + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Property value } -func (m *Property) Reset() { *m = Property{} } -func (m *Property) String() string { return proto.CompactTextString(m) } -func (*Property) ProtoMessage() {} -func (*Property) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{11} -} -func (m *Property) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Property) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Property.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Property) Reset() { + *x = Property{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Property) XXX_Merge(src proto.Message) { - xxx_messageInfo_Property.Merge(m, src) -} -func (m *Property) XXX_Size() int { - return m.Size() + +func (x *Property) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Property) XXX_DiscardUnknown() { - xxx_messageInfo_Property.DiscardUnknown(m) + +func (*Property) ProtoMessage() {} + +func (x *Property) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Property proto.InternalMessageInfo +// Deprecated: Use Property.ProtoReflect.Descriptor instead. +func (*Property) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{11} +} -func (m *Property) GetKey() string { - if m != nil { - return m.Key +func (x *Property) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *Property) GetValue() string { - if m != nil { - return m.Value +func (x *Property) GetValue() string { + if x != nil { + return x.Value } return "" } // Set properties request type SetPropertiesRequest struct { - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. + Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` // List of properties to be set } -func (m *SetPropertiesRequest) Reset() { *m = SetPropertiesRequest{} } -func (m *SetPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetPropertiesRequest) ProtoMessage() {} -func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{12} -} -func (m *SetPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetPropertiesRequest) Reset() { + *x = SetPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetPropertiesRequest.Merge(m, src) -} -func (m *SetPropertiesRequest) XXX_Size() int { - return m.Size() + +func (x *SetPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetPropertiesRequest.DiscardUnknown(m) + +func (*SetPropertiesRequest) ProtoMessage() {} + +func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SetPropertiesRequest proto.InternalMessageInfo +// Deprecated: Use SetPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{12} +} -func (m *SetPropertiesRequest) GetPartitionid() string { - if m != nil { - return m.Partitionid +func (x *SetPropertiesRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid } return "" } -func (m *SetPropertiesRequest) GetPath() string { - if m != nil { - return m.Path +func (x *SetPropertiesRequest) GetPath() string { + if x != nil { + return x.Path } return "" } -func (m *SetPropertiesRequest) GetProperties() []*Property { - if m != nil { - return m.Properties +func (x *SetPropertiesRequest) GetProperties() []*Property { + if x != nil { + return x.Properties } return nil } // Configure request type ConfigureRequest struct { - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. } -func (m *ConfigureRequest) Reset() { *m = ConfigureRequest{} } -func (m *ConfigureRequest) String() string { return proto.CompactTextString(m) } -func (*ConfigureRequest) ProtoMessage() {} -func (*ConfigureRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{13} -} -func (m *ConfigureRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConfigureRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConfigureRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ConfigureRequest) Reset() { + *x = ConfigureRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ConfigureRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConfigureRequest.Merge(m, src) -} -func (m *ConfigureRequest) XXX_Size() int { - return m.Size() + +func (x *ConfigureRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ConfigureRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ConfigureRequest.DiscardUnknown(m) + +func (*ConfigureRequest) ProtoMessage() {} + +func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ConfigureRequest proto.InternalMessageInfo +// Deprecated: Use ConfigureRequest.ProtoReflect.Descriptor instead. +func (*ConfigureRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{13} +} -func (m *ConfigureRequest) GetRequest() *StateRequest { - if m != nil { - return m.Request +func (x *ConfigureRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request } return nil } // Start request type StartRequest struct { - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. } -func (m *StartRequest) Reset() { *m = StartRequest{} } -func (m *StartRequest) String() string { return proto.CompactTextString(m) } -func (*StartRequest) ProtoMessage() {} -func (*StartRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{14} -} -func (m *StartRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StartRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StartRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StartRequest) Reset() { + *x = StartRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StartRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StartRequest.Merge(m, src) -} -func (m *StartRequest) XXX_Size() int { - return m.Size() + +func (x *StartRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StartRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StartRequest.DiscardUnknown(m) + +func (*StartRequest) ProtoMessage() {} + +func (x *StartRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StartRequest proto.InternalMessageInfo +// Deprecated: Use StartRequest.ProtoReflect.Descriptor instead. +func (*StartRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{14} +} -func (m *StartRequest) GetRequest() *StateRequest { - if m != nil { - return m.Request +func (x *StartRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request } return nil } // Stop request type StopRequest struct { - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. } -func (m *StopRequest) Reset() { *m = StopRequest{} } -func (m *StopRequest) String() string { return proto.CompactTextString(m) } -func (*StopRequest) ProtoMessage() {} -func (*StopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{15} -} -func (m *StopRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StopRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StopRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StopRequest) Reset() { + *x = StopRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StopRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StopRequest.Merge(m, src) -} -func (m *StopRequest) XXX_Size() int { - return m.Size() + +func (x *StopRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StopRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StopRequest.DiscardUnknown(m) + +func (*StopRequest) ProtoMessage() {} + +func (x *StopRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StopRequest proto.InternalMessageInfo +// Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. +func (*StopRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{15} +} -func (m *StopRequest) GetRequest() *StateRequest { - if m != nil { - return m.Request +func (x *StopRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request } return nil } // Reset request type ResetRequest struct { - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. } -func (m *ResetRequest) Reset() { *m = ResetRequest{} } -func (m *ResetRequest) String() string { return proto.CompactTextString(m) } -func (*ResetRequest) ProtoMessage() {} -func (*ResetRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{16} -} -func (m *ResetRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ResetRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ResetRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ResetRequest) Reset() { + *x = ResetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ResetRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ResetRequest.Merge(m, src) -} -func (m *ResetRequest) XXX_Size() int { - return m.Size() + +func (x *ResetRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ResetRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ResetRequest.DiscardUnknown(m) + +func (*ResetRequest) ProtoMessage() {} + +func (x *ResetRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ResetRequest proto.InternalMessageInfo +// Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. +func (*ResetRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{16} +} -func (m *ResetRequest) GetRequest() *StateRequest { - if m != nil { - return m.Request +func (x *ResetRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request } return nil } // Terminate request type TerminateRequest struct { - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. } -func (m *TerminateRequest) Reset() { *m = TerminateRequest{} } -func (m *TerminateRequest) String() string { return proto.CompactTextString(m) } -func (*TerminateRequest) ProtoMessage() {} -func (*TerminateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_289c0e4bbb6a131e, []int{17} -} -func (m *TerminateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TerminateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TerminateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TerminateRequest) Reset() { + *x = TerminateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_odcprotos_odc_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TerminateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TerminateRequest.Merge(m, src) -} -func (m *TerminateRequest) XXX_Size() int { - return m.Size() + +func (x *TerminateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TerminateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TerminateRequest.DiscardUnknown(m) + +func (*TerminateRequest) ProtoMessage() {} + +func (x *TerminateRequest) ProtoReflect() protoreflect.Message { + mi := &file_odcprotos_odc_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TerminateRequest proto.InternalMessageInfo +// Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. +func (*TerminateRequest) Descriptor() ([]byte, []int) { + return file_odcprotos_odc_proto_rawDescGZIP(), []int{17} +} -func (m *TerminateRequest) GetRequest() *StateRequest { - if m != nil { - return m.Request +func (x *TerminateRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request } return nil } -func init() { - proto.RegisterEnum("odc.ReplyStatus", ReplyStatus_name, ReplyStatus_value) - proto.RegisterType((*Error)(nil), "odc.Error") - proto.RegisterType((*GeneralReply)(nil), "odc.GeneralReply") - proto.RegisterType((*Device)(nil), "odc.Device") - proto.RegisterType((*StateRequest)(nil), "odc.StateRequest") - proto.RegisterType((*StateReply)(nil), "odc.StateReply") - proto.RegisterType((*InitializeRequest)(nil), "odc.InitializeRequest") - proto.RegisterType((*SubmitRequest)(nil), "odc.SubmitRequest") - proto.RegisterType((*ActivateRequest)(nil), "odc.ActivateRequest") - proto.RegisterType((*RunRequest)(nil), "odc.RunRequest") - proto.RegisterType((*UpdateRequest)(nil), "odc.UpdateRequest") - proto.RegisterType((*ShutdownRequest)(nil), "odc.ShutdownRequest") - proto.RegisterType((*Property)(nil), "odc.Property") - proto.RegisterType((*SetPropertiesRequest)(nil), "odc.SetPropertiesRequest") - proto.RegisterType((*ConfigureRequest)(nil), "odc.ConfigureRequest") - proto.RegisterType((*StartRequest)(nil), "odc.StartRequest") - proto.RegisterType((*StopRequest)(nil), "odc.StopRequest") - proto.RegisterType((*ResetRequest)(nil), "odc.ResetRequest") - proto.RegisterType((*TerminateRequest)(nil), "odc.TerminateRequest") -} - -func init() { proto.RegisterFile("odcprotos/odc.proto", fileDescriptor_289c0e4bbb6a131e) } - -var fileDescriptor_289c0e4bbb6a131e = []byte{ - // 763 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x56, 0xcd, 0x6e, 0xd3, 0x40, - 0x10, 0xae, 0x93, 0x38, 0x3f, 0xe3, 0xa6, 0x71, 0x97, 0x82, 0x42, 0x84, 0xa2, 0x68, 0x25, 0x44, - 0x44, 0xd5, 0x42, 0x53, 0xf5, 0x00, 0x1c, 0x2a, 0x9a, 0x56, 0x15, 0x20, 0x1a, 0xb4, 0xa6, 0xe2, - 0xc2, 0x81, 0x34, 0x5e, 0xda, 0x55, 0x93, 0xac, 0xb1, 0xd7, 0x85, 0xc0, 0x8b, 0xf0, 0x12, 0xbc, - 0x07, 0x47, 0x9e, 0x00, 0xa1, 0xf2, 0x22, 0xc8, 0x63, 0xc7, 0x71, 0x12, 0x57, 0x6a, 0x4b, 0x6f, - 0xbb, 0x9e, 0x6f, 0x66, 0xbe, 0x9d, 0xfd, 0xbe, 0x4d, 0xe0, 0x96, 0xb4, 0x7b, 0x8e, 0x2b, 0x95, - 0xf4, 0x1e, 0x49, 0xbb, 0xb7, 0x8e, 0x4b, 0x92, 0x95, 0x76, 0x8f, 0xae, 0x81, 0xbe, 0xe7, 0xba, - 0xd2, 0x25, 0x26, 0x64, 0x07, 0xde, 0x71, 0x55, 0x6b, 0x68, 0xcd, 0x12, 0x0b, 0x96, 0x84, 0x40, - 0xae, 0x27, 0x6d, 0x5e, 0xcd, 0x34, 0xb4, 0xa6, 0xce, 0x70, 0x4d, 0x7f, 0x6b, 0xb0, 0xb8, 0xcf, - 0x87, 0xdc, 0xed, 0xf6, 0x19, 0x77, 0xfa, 0xa3, 0x94, 0xb4, 0x26, 0xe4, 0x3d, 0xd5, 0x55, 0xbe, - 0x87, 0x89, 0x4b, 0x2d, 0x73, 0x3d, 0x68, 0x89, 0x68, 0x0b, 0xbf, 0xb3, 0x28, 0x4e, 0x1a, 0xa0, - 0xf3, 0xa0, 0x77, 0x35, 0xdb, 0xd0, 0x9a, 0x46, 0x0b, 0x10, 0x88, 0x6c, 0x58, 0x18, 0x20, 0x35, - 0x28, 0xf2, 0x2f, 0xbc, 0xa7, 0xc4, 0x80, 0x57, 0x73, 0x48, 0x23, 0xde, 0x93, 0x06, 0x18, 0x4e, - 0xd7, 0x55, 0x42, 0x09, 0x39, 0x14, 0x76, 0x55, 0x47, 0x06, 0xc9, 0x4f, 0xe4, 0x1e, 0x94, 0x3c, - 0xee, 0x79, 0x61, 0x3c, 0x8f, 0xf1, 0xc9, 0x07, 0xb2, 0x02, 0x7a, 0xc0, 0x83, 0x57, 0x0b, 0x18, - 0x09, 0x37, 0x74, 0x07, 0xf2, 0xbb, 0xfc, 0x4c, 0xf4, 0x38, 0x59, 0x82, 0x8c, 0xb0, 0xf1, 0x60, - 0x39, 0x96, 0x49, 0xe2, 0x33, 0x09, 0x7c, 0x30, 0x24, 0xa7, 0xab, 0x4e, 0xf0, 0x08, 0x25, 0x86, - 0x6b, 0xfa, 0x01, 0x16, 0x83, 0x93, 0x72, 0xc6, 0x3f, 0xf9, 0xdc, 0x53, 0xb3, 0x4c, 0xb5, 0x79, - 0xa6, 0xe3, 0x2a, 0x99, 0x49, 0x95, 0xe0, 0xec, 0x36, 0x57, 0x5d, 0xd1, 0xe7, 0x36, 0x56, 0x2f, - 0xb2, 0x78, 0x4f, 0xdf, 0x03, 0x44, 0x1d, 0x82, 0x3b, 0x78, 0x00, 0xba, 0x1b, 0x2c, 0xb0, 0xb2, - 0xd1, 0x5a, 0xc6, 0x39, 0x26, 0x6f, 0x89, 0x85, 0x71, 0x72, 0x1f, 0x0a, 0x36, 0x1e, 0x2e, 0xb8, - 0x9b, 0x6c, 0xd3, 0x68, 0x19, 0x08, 0x0d, 0x0f, 0xcc, 0xc6, 0x31, 0x6a, 0xc1, 0xf2, 0x8b, 0xa1, - 0x50, 0xa2, 0xdb, 0x17, 0x5f, 0xaf, 0x70, 0x88, 0xa9, 0x71, 0x67, 0x66, 0xc6, 0x4d, 0x37, 0xa0, - 0x6c, 0xf9, 0x47, 0x03, 0xa1, 0x2e, 0x5d, 0x90, 0x76, 0xa0, 0xf2, 0xbc, 0xa7, 0xc4, 0xd9, 0x95, - 0x46, 0x59, 0x83, 0xa2, 0x92, 0x8e, 0xec, 0xcb, 0xe3, 0x51, 0x44, 0x22, 0xde, 0xd3, 0x97, 0x00, - 0xcc, 0x1f, 0xde, 0x4c, 0xad, 0xd7, 0x50, 0x3e, 0x74, 0xec, 0x1b, 0xa3, 0xb6, 0x09, 0x15, 0xeb, - 0xc4, 0x57, 0xb6, 0xfc, 0x7c, 0x79, 0x7e, 0xb4, 0x05, 0xc5, 0x37, 0xae, 0x74, 0xb8, 0xab, 0xd0, - 0x88, 0xa7, 0x7c, 0x34, 0x36, 0xe2, 0x29, 0x1f, 0x05, 0x82, 0x3d, 0xeb, 0xf6, 0xfd, 0x58, 0xb0, - 0xb8, 0xa1, 0xdf, 0x60, 0xc5, 0xe2, 0x2a, 0x4a, 0x13, 0xdc, 0xfb, 0x3f, 0x91, 0xae, 0x01, 0x38, - 0x71, 0xa9, 0x6a, 0x16, 0x45, 0x55, 0x46, 0x51, 0x8d, 0x89, 0xb1, 0x04, 0x80, 0x6e, 0x83, 0xd9, - 0x96, 0xc3, 0x8f, 0xe2, 0xd8, 0x77, 0xe3, 0xb9, 0xad, 0x42, 0xc1, 0x0d, 0x97, 0x53, 0xfa, 0x4d, - 0x3a, 0x88, 0x8d, 0x11, 0xf4, 0x19, 0x5a, 0xcb, 0x55, 0xd7, 0x4a, 0x7e, 0x0a, 0x86, 0xa5, 0xa4, - 0x73, 0xdd, 0xc6, 0x8c, 0x7b, 0xfc, 0x7a, 0x8d, 0xb7, 0xc1, 0x7c, 0xcb, 0xdd, 0x81, 0x18, 0x26, - 0xe4, 0x72, 0x95, 0x02, 0x0f, 0x5b, 0x60, 0x24, 0x1e, 0x50, 0x62, 0x40, 0xe1, 0xf0, 0xe0, 0xd5, - 0x41, 0xe7, 0xdd, 0x81, 0xb9, 0x10, 0x6c, 0xac, 0xc3, 0x76, 0x7b, 0xcf, 0xb2, 0x4c, 0x8d, 0x94, - 0x40, 0xdf, 0x63, 0xac, 0xc3, 0xcc, 0x4c, 0xeb, 0x87, 0x0e, 0xd9, 0xce, 0x6e, 0x9b, 0x3c, 0x01, - 0x98, 0xb8, 0x99, 0xdc, 0xc1, 0x2e, 0x73, 0xf6, 0xae, 0xcd, 0x3f, 0x1a, 0x74, 0x81, 0x6c, 0x40, - 0x3e, 0xf4, 0x2c, 0x21, 0x21, 0xb9, 0xa4, 0x81, 0xd3, 0x53, 0xb6, 0xa0, 0x38, 0xf6, 0x2c, 0x59, - 0x41, 0xc0, 0x8c, 0x85, 0xd3, 0xd3, 0x56, 0x21, 0xcb, 0xfc, 0x21, 0xa9, 0x84, 0xbf, 0x15, 0xb1, - 0x47, 0x2f, 0xa4, 0x15, 0x5a, 0x2f, 0xa2, 0x35, 0xe5, 0xc3, 0x8b, 0x68, 0x95, 0x62, 0xe1, 0x91, - 0xdb, 0x88, 0x98, 0x15, 0x62, 0xad, 0x92, 0xbc, 0x80, 0x30, 0x6d, 0x1b, 0xca, 0x53, 0x66, 0x21, - 0x77, 0x43, 0x4c, 0x8a, 0x81, 0xd2, 0xfb, 0x3e, 0x86, 0xe2, 0x3e, 0x57, 0x58, 0x93, 0xcc, 0x5f, - 0x70, 0x5a, 0xcb, 0x35, 0xd0, 0x51, 0xe1, 0x13, 0x78, 0xac, 0xf6, 0x34, 0xf8, 0x2a, 0xe4, 0x02, - 0x4d, 0x13, 0x33, 0x0a, 0xc5, 0xf2, 0xbe, 0xa0, 0x36, 0x8a, 0x38, 0xaa, 0x9d, 0x14, 0x74, 0x1a, - 0x7c, 0x0b, 0x4a, 0xb1, 0x6c, 0xa3, 0xa1, 0xcd, 0xca, 0x38, 0x3d, 0xad, 0x38, 0x7e, 0xca, 0x22, - 0x09, 0xcc, 0xbc, 0x6c, 0xa9, 0xa3, 0xda, 0x31, 0x7f, 0x9e, 0xd7, 0xb5, 0x5f, 0xe7, 0x75, 0xed, - 0xcf, 0x79, 0x5d, 0xfb, 0xfe, 0xb7, 0xbe, 0x70, 0x94, 0xc7, 0xff, 0x29, 0x9b, 0xff, 0x02, 0x00, - 0x00, 0xff, 0xff, 0xd5, 0xf4, 0x1f, 0xfc, 0xbe, 0x08, 0x00, 0x00, +var File_odcprotos_odc_proto protoreflect.FileDescriptor + +var file_odcprotos_odc_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x64, 0x63, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, 0x06, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x60, + 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x53, + 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x4a, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x22, 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, + 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, + 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, + 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, + 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, + 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_odcprotos_odc_proto_rawDescOnce sync.Once + file_odcprotos_odc_proto_rawDescData = file_odcprotos_odc_proto_rawDesc +) + +func file_odcprotos_odc_proto_rawDescGZIP() []byte { + file_odcprotos_odc_proto_rawDescOnce.Do(func() { + file_odcprotos_odc_proto_rawDescData = protoimpl.X.CompressGZIP(file_odcprotos_odc_proto_rawDescData) + }) + return file_odcprotos_odc_proto_rawDescData +} + +var file_odcprotos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_odcprotos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_odcprotos_odc_proto_goTypes = []interface{}{ + (ReplyStatus)(0), // 0: odc.ReplyStatus + (*Error)(nil), // 1: odc.Error + (*GeneralReply)(nil), // 2: odc.GeneralReply + (*Device)(nil), // 3: odc.Device + (*StateRequest)(nil), // 4: odc.StateRequest + (*StateReply)(nil), // 5: odc.StateReply + (*InitializeRequest)(nil), // 6: odc.InitializeRequest + (*SubmitRequest)(nil), // 7: odc.SubmitRequest + (*ActivateRequest)(nil), // 8: odc.ActivateRequest + (*RunRequest)(nil), // 9: odc.RunRequest + (*UpdateRequest)(nil), // 10: odc.UpdateRequest + (*ShutdownRequest)(nil), // 11: odc.ShutdownRequest + (*Property)(nil), // 12: odc.Property + (*SetPropertiesRequest)(nil), // 13: odc.SetPropertiesRequest + (*ConfigureRequest)(nil), // 14: odc.ConfigureRequest + (*StartRequest)(nil), // 15: odc.StartRequest + (*StopRequest)(nil), // 16: odc.StopRequest + (*ResetRequest)(nil), // 17: odc.ResetRequest + (*TerminateRequest)(nil), // 18: odc.TerminateRequest +} +var file_odcprotos_odc_proto_depIdxs = []int32{ + 0, // 0: odc.GeneralReply.status:type_name -> odc.ReplyStatus + 1, // 1: odc.GeneralReply.error:type_name -> odc.Error + 2, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply + 3, // 3: odc.StateReply.devices:type_name -> odc.Device + 12, // 4: odc.SetPropertiesRequest.properties:type_name -> odc.Property + 4, // 5: odc.ConfigureRequest.request:type_name -> odc.StateRequest + 4, // 6: odc.StartRequest.request:type_name -> odc.StateRequest + 4, // 7: odc.StopRequest.request:type_name -> odc.StateRequest + 4, // 8: odc.ResetRequest.request:type_name -> odc.StateRequest + 4, // 9: odc.TerminateRequest.request:type_name -> odc.StateRequest + 6, // 10: odc.ODC.Initialize:input_type -> odc.InitializeRequest + 7, // 11: odc.ODC.Submit:input_type -> odc.SubmitRequest + 8, // 12: odc.ODC.Activate:input_type -> odc.ActivateRequest + 9, // 13: odc.ODC.Run:input_type -> odc.RunRequest + 10, // 14: odc.ODC.Update:input_type -> odc.UpdateRequest + 14, // 15: odc.ODC.Configure:input_type -> odc.ConfigureRequest + 13, // 16: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest + 4, // 17: odc.ODC.GetState:input_type -> odc.StateRequest + 15, // 18: odc.ODC.Start:input_type -> odc.StartRequest + 16, // 19: odc.ODC.Stop:input_type -> odc.StopRequest + 17, // 20: odc.ODC.Reset:input_type -> odc.ResetRequest + 18, // 21: odc.ODC.Terminate:input_type -> odc.TerminateRequest + 11, // 22: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest + 2, // 23: odc.ODC.Initialize:output_type -> odc.GeneralReply + 2, // 24: odc.ODC.Submit:output_type -> odc.GeneralReply + 2, // 25: odc.ODC.Activate:output_type -> odc.GeneralReply + 2, // 26: odc.ODC.Run:output_type -> odc.GeneralReply + 2, // 27: odc.ODC.Update:output_type -> odc.GeneralReply + 5, // 28: odc.ODC.Configure:output_type -> odc.StateReply + 2, // 29: odc.ODC.SetProperties:output_type -> odc.GeneralReply + 5, // 30: odc.ODC.GetState:output_type -> odc.StateReply + 5, // 31: odc.ODC.Start:output_type -> odc.StateReply + 5, // 32: odc.ODC.Stop:output_type -> odc.StateReply + 5, // 33: odc.ODC.Reset:output_type -> odc.StateReply + 5, // 34: odc.ODC.Terminate:output_type -> odc.StateReply + 2, // 35: odc.ODC.Shutdown:output_type -> odc.GeneralReply + 23, // [23:36] is the sub-list for method output_type + 10, // [10:23] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_odcprotos_odc_proto_init() } +func file_odcprotos_odc_proto_init() { + if File_odcprotos_odc_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_odcprotos_odc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Error); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneralReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Device); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InitializeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubmitRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActivateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShutdownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Property); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigureRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_odcprotos_odc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TerminateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_odcprotos_odc_proto_rawDesc, + NumEnums: 1, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_odcprotos_odc_proto_goTypes, + DependencyIndexes: file_odcprotos_odc_proto_depIdxs, + EnumInfos: file_odcprotos_odc_proto_enumTypes, + MessageInfos: file_odcprotos_odc_proto_msgTypes, + }.Build() + File_odcprotos_odc_proto = out.File + file_odcprotos_odc_proto_rawDesc = nil + file_odcprotos_odc_proto_goTypes = nil + file_odcprotos_odc_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // ODCClient is the client API for ODC service. // @@ -1194,10 +1610,10 @@ type ODCClient interface { } type oDCClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewODCClient(cc *grpc.ClientConn) ODCClient { +func NewODCClient(cc grpc.ClientConnInterface) ODCClient { return &oDCClient{cc} } @@ -1356,43 +1772,43 @@ type ODCServer interface { type UnimplementedODCServer struct { } -func (*UnimplementedODCServer) Initialize(ctx context.Context, req *InitializeRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") } -func (*UnimplementedODCServer) Submit(ctx context.Context, req *SubmitRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Submit(context.Context, *SubmitRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") } -func (*UnimplementedODCServer) Activate(ctx context.Context, req *ActivateRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Activate(context.Context, *ActivateRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") } -func (*UnimplementedODCServer) Run(ctx context.Context, req *RunRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Run(context.Context, *RunRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") } -func (*UnimplementedODCServer) Update(ctx context.Context, req *UpdateRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Update(context.Context, *UpdateRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") } -func (*UnimplementedODCServer) Configure(ctx context.Context, req *ConfigureRequest) (*StateReply, error) { +func (*UnimplementedODCServer) Configure(context.Context, *ConfigureRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") } -func (*UnimplementedODCServer) SetProperties(ctx context.Context, req *SetPropertiesRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") } -func (*UnimplementedODCServer) GetState(ctx context.Context, req *StateRequest) (*StateReply, error) { +func (*UnimplementedODCServer) GetState(context.Context, *StateRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") } -func (*UnimplementedODCServer) Start(ctx context.Context, req *StartRequest) (*StateReply, error) { +func (*UnimplementedODCServer) Start(context.Context, *StartRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") } -func (*UnimplementedODCServer) Stop(ctx context.Context, req *StopRequest) (*StateReply, error) { +func (*UnimplementedODCServer) Stop(context.Context, *StopRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") } -func (*UnimplementedODCServer) Reset(ctx context.Context, req *ResetRequest) (*StateReply, error) { +func (*UnimplementedODCServer) Reset(context.Context, *ResetRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") } -func (*UnimplementedODCServer) Terminate(ctx context.Context, req *TerminateRequest) (*StateReply, error) { +func (*UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*StateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") } -func (*UnimplementedODCServer) Shutdown(ctx context.Context, req *ShutdownRequest) (*GeneralReply, error) { +func (*UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") } @@ -1694,3381 +2110,3 @@ var _ODC_serviceDesc = grpc.ServiceDesc{ Streams: []grpc.StreamDesc{}, Metadata: "odcprotos/odc.proto", } - -func (m *Error) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Error) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Error) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Code != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Code)) - i-- - dAtA[i] = 0x10 - } - if len(m.Msg) > 0 { - i -= len(m.Msg) - copy(dAtA[i:], m.Msg) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Msg))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GeneralReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GeneralReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GeneralReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOdc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x3a - } - if len(m.Sessionid) > 0 { - i -= len(m.Sessionid) - copy(dAtA[i:], m.Sessionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Sessionid))) - i-- - dAtA[i] = 0x32 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0x2a - } - if m.Exectime != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Exectime)) - i-- - dAtA[i] = 0x20 - } - if m.Error != nil { - { - size, err := m.Error.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - if m.Status != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Status)) - i-- - dAtA[i] = 0x10 - } - if len(m.Msg) > 0 { - i -= len(m.Msg) - copy(dAtA[i:], m.Msg) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Msg))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Device) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Device) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Device) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Path) > 0 { - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x1a - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOdc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Id != 0 { - i = encodeVarintOdc(dAtA, i, uint64(m.Id)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *StateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Detailed { - i-- - if m.Detailed { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Path) > 0 { - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StateReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Devices) > 0 { - for iNdEx := len(m.Devices) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Devices[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if m.Reply != nil { - { - size, err := m.Reply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *InitializeRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *InitializeRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *InitializeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Sessionid) > 0 { - i -= len(m.Sessionid) - copy(dAtA[i:], m.Sessionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Sessionid))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SubmitRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SubmitRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SubmitRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ActivateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ActivateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ActivateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Topology) > 0 { - i -= len(m.Topology) - copy(dAtA[i:], m.Topology) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RunRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RunRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RunRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Topology) > 0 { - i -= len(m.Topology) - copy(dAtA[i:], m.Topology) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *UpdateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *UpdateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *UpdateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Topology) > 0 { - i -= len(m.Topology) - copy(dAtA[i:], m.Topology) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Topology))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ShutdownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ShutdownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShutdownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Property) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Property) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Property) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for iNdEx := len(m.Properties) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Properties[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.Path) > 0 { - i -= len(m.Path) - copy(dAtA[i:], m.Path) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Path))) - i-- - dAtA[i] = 0x12 - } - if len(m.Partitionid) > 0 { - i -= len(m.Partitionid) - copy(dAtA[i:], m.Partitionid) - i = encodeVarintOdc(dAtA, i, uint64(len(m.Partitionid))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConfigureRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ConfigureRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConfigureRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StartRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StartRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StartRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StopRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StopRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StopRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ResetRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ResetRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ResetRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TerminateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TerminateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TerminateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Request != nil { - { - size, err := m.Request.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOdc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func encodeVarintOdc(dAtA []byte, offset int, v uint64) int { - offset -= sovOdc(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Error) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Msg) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.Code != 0 { - n += 1 + sovOdc(uint64(m.Code)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GeneralReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Msg) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.Status != 0 { - n += 1 + sovOdc(uint64(m.Status)) - } - if m.Error != nil { - l = m.Error.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.Exectime != 0 { - n += 1 + sovOdc(uint64(m.Exectime)) - } - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Sessionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Device) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Id != 0 { - n += 1 + sovOdc(uint64(m.Id)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Path) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Path) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.Detailed { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StateReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Reply != nil { - l = m.Reply.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if len(m.Devices) > 0 { - for _, e := range m.Devices { - l = e.Size() - n += 1 + l + sovOdc(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *InitializeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Sessionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SubmitRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ActivateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Topology) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RunRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Topology) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *UpdateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Topology) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ShutdownRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Property) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Partitionid) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - l = len(m.Path) - if l > 0 { - n += 1 + l + sovOdc(uint64(l)) - } - if len(m.Properties) > 0 { - for _, e := range m.Properties { - l = e.Size() - n += 1 + l + sovOdc(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ConfigureRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StartRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StopRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ResetRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TerminateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Request != nil { - l = m.Request.Size() - n += 1 + l + sovOdc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovOdc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozOdc(x uint64) (n int) { - return sovOdc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Error) 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 ErrIntOverflowOdc - } - 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: Error: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Error: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Msg = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Code", wireType) - } - m.Code = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Code |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GeneralReply) 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 ErrIntOverflowOdc - } - 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: GeneralReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GeneralReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Msg", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Msg = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - m.Status = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Status |= ReplyStatus(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Error == nil { - m.Error = &Error{} - } - if err := m.Error.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Exectime", wireType) - } - m.Exectime = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Exectime |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sessionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Device) 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 ErrIntOverflowOdc - } - 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: Device: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Device: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - m.Id = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Id |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - 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 ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Path = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StateRequest) 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 ErrIntOverflowOdc - } - 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: StateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = 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 ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Path = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Detailed", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Detailed = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StateReply) 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 ErrIntOverflowOdc - } - 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: StateReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Reply == nil { - m.Reply = &GeneralReply{} - } - if err := m.Reply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Devices", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Devices = append(m.Devices, &Device{}) - if err := m.Devices[len(m.Devices)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *InitializeRequest) 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 ErrIntOverflowOdc - } - 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: InitializeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: InitializeRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Sessionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Sessionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SubmitRequest) 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 ErrIntOverflowOdc - } - 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: SubmitRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubmitRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ActivateRequest) 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 ErrIntOverflowOdc - } - 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: ActivateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ActivateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Topology = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RunRequest) 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 ErrIntOverflowOdc - } - 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: RunRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RunRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Topology = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *UpdateRequest) 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 ErrIntOverflowOdc - } - 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: UpdateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: UpdateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Topology", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Topology = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ShutdownRequest) 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 ErrIntOverflowOdc - } - 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: ShutdownRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ShutdownRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Property) 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 ErrIntOverflowOdc - } - 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: Property: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Property: 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 ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - 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 Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetPropertiesRequest) 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 ErrIntOverflowOdc - } - 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: SetPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetPropertiesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Partitionid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Partitionid = 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 ErrIntOverflowOdc - } - 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 ErrInvalidLengthOdc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - 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 Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Properties = append(m.Properties, &Property{}) - if err := m.Properties[len(m.Properties)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ConfigureRequest) 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 ErrIntOverflowOdc - } - 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: ConfigureRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConfigureRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &StateRequest{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StartRequest) 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 ErrIntOverflowOdc - } - 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: StartRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StartRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &StateRequest{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StopRequest) 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 ErrIntOverflowOdc - } - 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: StopRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StopRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &StateRequest{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ResetRequest) 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 ErrIntOverflowOdc - } - 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: ResetRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ResetRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &StateRequest{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TerminateRequest) 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 ErrIntOverflowOdc - } - 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: TerminateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TerminateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Request", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOdc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOdc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOdc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Request == nil { - m.Request = &StateRequest{} - } - if err := m.Request.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOdc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOdc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipOdc(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOdc - } - 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, ErrIntOverflowOdc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOdc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthOdc - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOdc - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthOdc - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthOdc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOdc = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOdc = fmt.Errorf("proto: unexpected end of group") -) diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto index b5ba78054..0a1740833 100644 --- a/odcshim/odcprotos/odc.proto +++ b/odcshim/odcprotos/odc.proto @@ -1,6 +1,7 @@ syntax = "proto3"; package odc; +option go_package = "odcprotos;odc"; // The ODC service definition. // For details also see https://github.com/FairRootGroup/ODC#command-mapping diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go index a2bcefe2b..00a8d6964 100644 --- a/odcshim/odcshim.go +++ b/odcshim/odcshim.go @@ -36,8 +36,8 @@ import ( "github.com/spf13/viper" ) -//go:generate protoc -I ../occ --gofast_out=plugins=grpc:. protos/occ.proto -//go:generate protoc -I ../odcshim --gofast_out=plugins=grpc:. odcprotos/odc.proto +//go:generate protoc -I ../occ --go_out=plugins=grpc:. protos/occ.proto +//go:generate protoc -I ../odcshim --go_out=plugins=grpc:. odcprotos/odc.proto var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index a75b761a1..75d94a383 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -1,30 +1,56 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 // source: protos/occ.proto package pb import ( context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StateChangeTrigger int32 @@ -34,24 +60,45 @@ const ( StateChangeTrigger_DEVICE_ERROR StateChangeTrigger = 2 ) -var StateChangeTrigger_name = map[int32]string{ - 0: "EXECUTOR", - 1: "DEVICE_INTENTIONAL", - 2: "DEVICE_ERROR", -} +// Enum value maps for StateChangeTrigger. +var ( + StateChangeTrigger_name = map[int32]string{ + 0: "EXECUTOR", + 1: "DEVICE_INTENTIONAL", + 2: "DEVICE_ERROR", + } + StateChangeTrigger_value = map[string]int32{ + "EXECUTOR": 0, + "DEVICE_INTENTIONAL": 1, + "DEVICE_ERROR": 2, + } +) -var StateChangeTrigger_value = map[string]int32{ - "EXECUTOR": 0, - "DEVICE_INTENTIONAL": 1, - "DEVICE_ERROR": 2, +func (x StateChangeTrigger) Enum() *StateChangeTrigger { + p := new(StateChangeTrigger) + *p = x + return p } func (x StateChangeTrigger) String() string { - return proto.EnumName(StateChangeTrigger_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateChangeTrigger) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[0].Descriptor() +} + +func (StateChangeTrigger) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[0] +} + +func (x StateChangeTrigger) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use StateChangeTrigger.Descriptor instead. func (StateChangeTrigger) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{0} + return file_protos_occ_proto_rawDescGZIP(), []int{0} } type StateType int32 @@ -61,22 +108,43 @@ const ( StateType_STATE_INTERMEDIATE StateType = 1 ) -var StateType_name = map[int32]string{ - 0: "STATE_STABLE", - 1: "STATE_INTERMEDIATE", -} +// Enum value maps for StateType. +var ( + StateType_name = map[int32]string{ + 0: "STATE_STABLE", + 1: "STATE_INTERMEDIATE", + } + StateType_value = map[string]int32{ + "STATE_STABLE": 0, + "STATE_INTERMEDIATE": 1, + } +) -var StateType_value = map[string]int32{ - "STATE_STABLE": 0, - "STATE_INTERMEDIATE": 1, +func (x StateType) Enum() *StateType { + p := new(StateType) + *p = x + return p } func (x StateType) String() string { - return proto.EnumName(StateType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StateType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[1].Descriptor() +} + +func (StateType) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[1] +} + +func (x StateType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use StateType.Descriptor instead. func (StateType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{1} + return file_protos_occ_proto_rawDescGZIP(), []int{1} } type DeviceEventType int32 @@ -87,605 +155,843 @@ const ( DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 ) -var DeviceEventType_name = map[int32]string{ - 0: "NULL_DEVICE_EVENT", - 1: "END_OF_STREAM", - 2: "BASIC_TASK_TERMINATED", -} +// Enum value maps for DeviceEventType. +var ( + DeviceEventType_name = map[int32]string{ + 0: "NULL_DEVICE_EVENT", + 1: "END_OF_STREAM", + 2: "BASIC_TASK_TERMINATED", + } + DeviceEventType_value = map[string]int32{ + "NULL_DEVICE_EVENT": 0, + "END_OF_STREAM": 1, + "BASIC_TASK_TERMINATED": 2, + } +) -var DeviceEventType_value = map[string]int32{ - "NULL_DEVICE_EVENT": 0, - "END_OF_STREAM": 1, - "BASIC_TASK_TERMINATED": 2, +func (x DeviceEventType) Enum() *DeviceEventType { + p := new(DeviceEventType) + *p = x + return p } func (x DeviceEventType) String() string { - return proto.EnumName(DeviceEventType_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DeviceEventType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_occ_proto_enumTypes[2].Descriptor() +} + +func (DeviceEventType) Type() protoreflect.EnumType { + return &file_protos_occ_proto_enumTypes[2] +} + +func (x DeviceEventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use DeviceEventType.Descriptor instead. func (DeviceEventType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{2} + return file_protos_occ_proto_rawDescGZIP(), []int{2} } type StateStreamRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *StateStreamRequest) Reset() { *m = StateStreamRequest{} } -func (m *StateStreamRequest) String() string { return proto.CompactTextString(m) } -func (*StateStreamRequest) ProtoMessage() {} -func (*StateStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{0} -} -func (m *StateStreamRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateStreamRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateStreamRequest) Reset() { + *x = StateStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateStreamRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateStreamRequest.Merge(m, src) -} -func (m *StateStreamRequest) XXX_Size() int { - return m.Size() + +func (x *StateStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateStreamRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StateStreamRequest.DiscardUnknown(m) + +func (*StateStreamRequest) ProtoMessage() {} + +func (x *StateStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateStreamRequest proto.InternalMessageInfo +// Deprecated: Use StateStreamRequest.ProtoReflect.Descriptor instead. +func (*StateStreamRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{0} +} type StateStreamReply struct { - Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` } -func (m *StateStreamReply) Reset() { *m = StateStreamReply{} } -func (m *StateStreamReply) String() string { return proto.CompactTextString(m) } -func (*StateStreamReply) ProtoMessage() {} -func (*StateStreamReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{1} -} -func (m *StateStreamReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StateStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StateStreamReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StateStreamReply) Reset() { + *x = StateStreamReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StateStreamReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StateStreamReply.Merge(m, src) -} -func (m *StateStreamReply) XXX_Size() int { - return m.Size() + +func (x *StateStreamReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StateStreamReply) XXX_DiscardUnknown() { - xxx_messageInfo_StateStreamReply.DiscardUnknown(m) + +func (*StateStreamReply) ProtoMessage() {} + +func (x *StateStreamReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StateStreamReply proto.InternalMessageInfo +// Deprecated: Use StateStreamReply.ProtoReflect.Descriptor instead. +func (*StateStreamReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{1} +} -func (m *StateStreamReply) GetType() StateType { - if m != nil { - return m.Type +func (x *StateStreamReply) GetType() StateType { + if x != nil { + return x.Type } return StateType_STATE_STABLE } -func (m *StateStreamReply) GetState() string { - if m != nil { - return m.State +func (x *StateStreamReply) GetState() string { + if x != nil { + return x.State } return "" } type EventStreamRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *EventStreamRequest) Reset() { *m = EventStreamRequest{} } -func (m *EventStreamRequest) String() string { return proto.CompactTextString(m) } -func (*EventStreamRequest) ProtoMessage() {} -func (*EventStreamRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{2} -} -func (m *EventStreamRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventStreamRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventStreamRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EventStreamRequest) Reset() { + *x = EventStreamRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EventStreamRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventStreamRequest.Merge(m, src) -} -func (m *EventStreamRequest) XXX_Size() int { - return m.Size() + +func (x *EventStreamRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EventStreamRequest) XXX_DiscardUnknown() { - xxx_messageInfo_EventStreamRequest.DiscardUnknown(m) + +func (*EventStreamRequest) ProtoMessage() {} + +func (x *EventStreamRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EventStreamRequest proto.InternalMessageInfo +// Deprecated: Use EventStreamRequest.ProtoReflect.Descriptor instead. +func (*EventStreamRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{2} +} type DeviceEvent struct { - Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` } -func (m *DeviceEvent) Reset() { *m = DeviceEvent{} } -func (m *DeviceEvent) String() string { return proto.CompactTextString(m) } -func (*DeviceEvent) ProtoMessage() {} -func (*DeviceEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{3} -} -func (m *DeviceEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DeviceEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DeviceEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DeviceEvent) Reset() { + *x = DeviceEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DeviceEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_DeviceEvent.Merge(m, src) -} -func (m *DeviceEvent) XXX_Size() int { - return m.Size() + +func (x *DeviceEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DeviceEvent) XXX_DiscardUnknown() { - xxx_messageInfo_DeviceEvent.DiscardUnknown(m) + +func (*DeviceEvent) ProtoMessage() {} + +func (x *DeviceEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DeviceEvent proto.InternalMessageInfo +// Deprecated: Use DeviceEvent.ProtoReflect.Descriptor instead. +func (*DeviceEvent) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{3} +} -func (m *DeviceEvent) GetType() DeviceEventType { - if m != nil { - return m.Type +func (x *DeviceEvent) GetType() DeviceEventType { + if x != nil { + return x.Type } return DeviceEventType_NULL_DEVICE_EVENT } type EventStreamReply struct { - Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` } -func (m *EventStreamReply) Reset() { *m = EventStreamReply{} } -func (m *EventStreamReply) String() string { return proto.CompactTextString(m) } -func (*EventStreamReply) ProtoMessage() {} -func (*EventStreamReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{4} -} -func (m *EventStreamReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EventStreamReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EventStreamReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EventStreamReply) Reset() { + *x = EventStreamReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EventStreamReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_EventStreamReply.Merge(m, src) -} -func (m *EventStreamReply) XXX_Size() int { - return m.Size() + +func (x *EventStreamReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EventStreamReply) XXX_DiscardUnknown() { - xxx_messageInfo_EventStreamReply.DiscardUnknown(m) + +func (*EventStreamReply) ProtoMessage() {} + +func (x *EventStreamReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EventStreamReply proto.InternalMessageInfo +// Deprecated: Use EventStreamReply.ProtoReflect.Descriptor instead. +func (*EventStreamReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{4} +} -func (m *EventStreamReply) GetEvent() *DeviceEvent { - if m != nil { - return m.Event +func (x *EventStreamReply) GetEvent() *DeviceEvent { + if x != nil { + return x.Event } return nil } type GetStateRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetStateRequest) Reset() { *m = GetStateRequest{} } -func (m *GetStateRequest) String() string { return proto.CompactTextString(m) } -func (*GetStateRequest) ProtoMessage() {} -func (*GetStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{5} -} -func (m *GetStateRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetStateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetStateRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetStateRequest) Reset() { + *x = GetStateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetStateRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetStateRequest.Merge(m, src) -} -func (m *GetStateRequest) XXX_Size() int { - return m.Size() + +func (x *GetStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetStateRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetStateRequest.DiscardUnknown(m) + +func (*GetStateRequest) ProtoMessage() {} + +func (x *GetStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetStateRequest proto.InternalMessageInfo +// Deprecated: Use GetStateRequest.ProtoReflect.Descriptor instead. +func (*GetStateRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{5} +} type GetStateReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` } -func (m *GetStateReply) Reset() { *m = GetStateReply{} } -func (m *GetStateReply) String() string { return proto.CompactTextString(m) } -func (*GetStateReply) ProtoMessage() {} -func (*GetStateReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{6} -} -func (m *GetStateReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetStateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetStateReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetStateReply) Reset() { + *x = GetStateReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetStateReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetStateReply.Merge(m, src) -} -func (m *GetStateReply) XXX_Size() int { - return m.Size() + +func (x *GetStateReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetStateReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetStateReply.DiscardUnknown(m) + +func (*GetStateReply) ProtoMessage() {} + +func (x *GetStateReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetStateReply proto.InternalMessageInfo +// Deprecated: Use GetStateReply.ProtoReflect.Descriptor instead. +func (*GetStateReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{6} +} -func (m *GetStateReply) GetState() string { - if m != nil { - return m.State +func (x *GetStateReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetStateReply) GetPid() int32 { - if m != nil { - return m.Pid +func (x *GetStateReply) GetPid() int32 { + if x != nil { + return x.Pid } return 0 } type ConfigEntry struct { - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } -func (m *ConfigEntry) Reset() { *m = ConfigEntry{} } -func (m *ConfigEntry) String() string { return proto.CompactTextString(m) } -func (*ConfigEntry) ProtoMessage() {} -func (*ConfigEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{7} -} -func (m *ConfigEntry) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ConfigEntry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ConfigEntry.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ConfigEntry) Reset() { + *x = ConfigEntry{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ConfigEntry) XXX_Merge(src proto.Message) { - xxx_messageInfo_ConfigEntry.Merge(m, src) -} -func (m *ConfigEntry) XXX_Size() int { - return m.Size() + +func (x *ConfigEntry) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ConfigEntry) XXX_DiscardUnknown() { - xxx_messageInfo_ConfigEntry.DiscardUnknown(m) + +func (*ConfigEntry) ProtoMessage() {} + +func (x *ConfigEntry) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ConfigEntry proto.InternalMessageInfo +// Deprecated: Use ConfigEntry.ProtoReflect.Descriptor instead. +func (*ConfigEntry) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{7} +} -func (m *ConfigEntry) GetKey() string { - if m != nil { - return m.Key +func (x *ConfigEntry) GetKey() string { + if x != nil { + return x.Key } return "" } -func (m *ConfigEntry) GetValue() string { - if m != nil { - return m.Value +func (x *ConfigEntry) GetValue() string { + if x != nil { + return x.Value } return "" } type TransitionRequest struct { - SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` - TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` + TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` } -func (m *TransitionRequest) Reset() { *m = TransitionRequest{} } -func (m *TransitionRequest) String() string { return proto.CompactTextString(m) } -func (*TransitionRequest) ProtoMessage() {} -func (*TransitionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{8} -} -func (m *TransitionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TransitionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransitionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TransitionRequest) Reset() { + *x = TransitionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TransitionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransitionRequest.Merge(m, src) -} -func (m *TransitionRequest) XXX_Size() int { - return m.Size() + +func (x *TransitionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TransitionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TransitionRequest.DiscardUnknown(m) + +func (*TransitionRequest) ProtoMessage() {} + +func (x *TransitionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TransitionRequest proto.InternalMessageInfo +// Deprecated: Use TransitionRequest.ProtoReflect.Descriptor instead. +func (*TransitionRequest) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{8} +} -func (m *TransitionRequest) GetSrcState() string { - if m != nil { - return m.SrcState +func (x *TransitionRequest) GetSrcState() string { + if x != nil { + return x.SrcState } return "" } -func (m *TransitionRequest) GetTransitionEvent() string { - if m != nil { - return m.TransitionEvent +func (x *TransitionRequest) GetTransitionEvent() string { + if x != nil { + return x.TransitionEvent } return "" } -func (m *TransitionRequest) GetArguments() []*ConfigEntry { - if m != nil { - return m.Arguments +func (x *TransitionRequest) GetArguments() []*ConfigEntry { + if x != nil { + return x.Arguments } return nil } type TransitionReply struct { - Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TransitionReply) Reset() { *m = TransitionReply{} } -func (m *TransitionReply) String() string { return proto.CompactTextString(m) } -func (*TransitionReply) ProtoMessage() {} -func (*TransitionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_17fd8faceeeb3e6c, []int{9} -} -func (m *TransitionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TransitionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TransitionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` + Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` } -func (m *TransitionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TransitionReply.Merge(m, src) + +func (x *TransitionReply) Reset() { + *x = TransitionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_occ_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TransitionReply) XXX_Size() int { - return m.Size() + +func (x *TransitionReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TransitionReply) XXX_DiscardUnknown() { - xxx_messageInfo_TransitionReply.DiscardUnknown(m) + +func (*TransitionReply) ProtoMessage() {} + +func (x *TransitionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_occ_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TransitionReply proto.InternalMessageInfo +// Deprecated: Use TransitionReply.ProtoReflect.Descriptor instead. +func (*TransitionReply) Descriptor() ([]byte, []int) { + return file_protos_occ_proto_rawDescGZIP(), []int{9} +} -func (m *TransitionReply) GetTrigger() StateChangeTrigger { - if m != nil { - return m.Trigger +func (x *TransitionReply) GetTrigger() StateChangeTrigger { + if x != nil { + return x.Trigger } return StateChangeTrigger_EXECUTOR } -func (m *TransitionReply) GetState() string { - if m != nil { - return m.State +func (x *TransitionReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *TransitionReply) GetTransitionEvent() string { - if m != nil { - return m.TransitionEvent +func (x *TransitionReply) GetTransitionEvent() string { + if x != nil { + return x.TransitionEvent } return "" } -func (m *TransitionReply) GetOk() bool { - if m != nil { - return m.Ok +func (x *TransitionReply) GetOk() bool { + if x != nil { + return x.Ok } return false } -func init() { - proto.RegisterEnum("occ_pb.StateChangeTrigger", StateChangeTrigger_name, StateChangeTrigger_value) - proto.RegisterEnum("occ_pb.StateType", StateType_name, StateType_value) - proto.RegisterEnum("occ_pb.DeviceEventType", DeviceEventType_name, DeviceEventType_value) - proto.RegisterType((*StateStreamRequest)(nil), "occ_pb.StateStreamRequest") - proto.RegisterType((*StateStreamReply)(nil), "occ_pb.StateStreamReply") - proto.RegisterType((*EventStreamRequest)(nil), "occ_pb.EventStreamRequest") - proto.RegisterType((*DeviceEvent)(nil), "occ_pb.DeviceEvent") - proto.RegisterType((*EventStreamReply)(nil), "occ_pb.EventStreamReply") - proto.RegisterType((*GetStateRequest)(nil), "occ_pb.GetStateRequest") - proto.RegisterType((*GetStateReply)(nil), "occ_pb.GetStateReply") - proto.RegisterType((*ConfigEntry)(nil), "occ_pb.ConfigEntry") - proto.RegisterType((*TransitionRequest)(nil), "occ_pb.TransitionRequest") - proto.RegisterType((*TransitionReply)(nil), "occ_pb.TransitionReply") -} - -func init() { proto.RegisterFile("protos/occ.proto", fileDescriptor_17fd8faceeeb3e6c) } - -var fileDescriptor_17fd8faceeeb3e6c = []byte{ - // 637 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x54, 0xd1, 0x6e, 0xda, 0x4a, - 0x10, 0x65, 0x4d, 0x92, 0x4b, 0x86, 0x24, 0x98, 0xbd, 0xc9, 0x0d, 0x41, 0x57, 0x08, 0x59, 0xba, - 0x12, 0x37, 0x95, 0xdc, 0x96, 0x36, 0xaa, 0x54, 0xb5, 0x0f, 0x06, 0xb6, 0x11, 0x2a, 0x31, 0xd2, - 0x7a, 0x13, 0x55, 0x7d, 0xb1, 0x1c, 0x77, 0x4b, 0xac, 0x10, 0xdb, 0x35, 0x9b, 0x48, 0xfc, 0x43, - 0xdf, 0xdb, 0xfe, 0x51, 0x1f, 0xfb, 0x09, 0x55, 0xfa, 0x23, 0xd5, 0x2e, 0x60, 0x6c, 0x42, 0xdf, - 0xbc, 0x33, 0x67, 0xcf, 0x39, 0x33, 0x3b, 0x63, 0xd0, 0xe3, 0x24, 0x12, 0xd1, 0xe4, 0x71, 0xe4, - 0xfb, 0xa6, 0xfa, 0xc4, 0x5b, 0x91, 0xef, 0xbb, 0xf1, 0xa5, 0xb1, 0x0f, 0xd8, 0x11, 0x9e, 0xe0, - 0x8e, 0x48, 0xb8, 0x77, 0x43, 0xf9, 0xa7, 0x5b, 0x3e, 0x11, 0xc6, 0x10, 0xf4, 0x5c, 0x34, 0x1e, - 0x4f, 0xf1, 0x7f, 0xb0, 0x21, 0xa6, 0x31, 0xaf, 0xa1, 0x26, 0x6a, 0xed, 0xb5, 0xab, 0xe6, 0x8c, - 0xc0, 0x54, 0x38, 0x36, 0x8d, 0x39, 0x55, 0x69, 0xbc, 0x0f, 0x9b, 0x13, 0x19, 0xaa, 0x69, 0x4d, - 0xd4, 0xda, 0xa6, 0xb3, 0x83, 0x94, 0x21, 0x77, 0x3c, 0x14, 0x79, 0x99, 0x97, 0x50, 0xee, 0xf1, - 0xbb, 0xc0, 0xe7, 0x2a, 0x87, 0x1f, 0xe5, 0x14, 0x0e, 0x17, 0x0a, 0x19, 0xc8, 0x52, 0xc7, 0x78, - 0x0d, 0x7a, 0x8e, 0x51, 0x5a, 0xfc, 0x1f, 0x36, 0xb9, 0x8c, 0x29, 0x86, 0x72, 0xfb, 0xef, 0x35, - 0x0c, 0x74, 0x86, 0x30, 0xaa, 0x50, 0x39, 0xe5, 0x42, 0x99, 0x5f, 0xb8, 0x79, 0x01, 0xbb, 0xcb, - 0x90, 0xa4, 0x4b, 0x4b, 0x41, 0x99, 0x52, 0xb0, 0x0e, 0xc5, 0x38, 0xf8, 0xa0, 0xca, 0xdb, 0xa4, - 0xf2, 0xd3, 0x38, 0x81, 0x72, 0x37, 0x0a, 0x3f, 0x06, 0x23, 0x12, 0x8a, 0x64, 0x2a, 0x01, 0xd7, - 0x7c, 0x3a, 0xbf, 0x24, 0x3f, 0x25, 0xd1, 0x9d, 0x37, 0xbe, 0x4d, 0x7b, 0xa2, 0x0e, 0xc6, 0x67, - 0x04, 0x55, 0x96, 0x78, 0xe1, 0x24, 0x10, 0x41, 0x14, 0xce, 0x5d, 0xe0, 0x3a, 0x94, 0x26, 0x89, - 0xef, 0x64, 0x74, 0xd3, 0x33, 0x6e, 0x41, 0x45, 0xa4, 0x17, 0x54, 0x39, 0x73, 0xc6, 0xd5, 0x30, - 0x7e, 0x0a, 0xdb, 0x5e, 0x32, 0xba, 0xbd, 0xe1, 0xa1, 0x98, 0xd4, 0x8a, 0xcd, 0x62, 0xb6, 0x1b, - 0x19, 0xaf, 0x74, 0x89, 0x32, 0xbe, 0x20, 0xa8, 0x64, 0xed, 0xc8, 0x0e, 0x3c, 0x87, 0xbf, 0x44, - 0x12, 0x8c, 0x46, 0x3c, 0x99, 0x3f, 0x4a, 0x3d, 0xf7, 0xec, 0xdd, 0x2b, 0x2f, 0x1c, 0x71, 0x36, - 0x43, 0xd0, 0x05, 0x74, 0xfd, 0x08, 0xac, 0x33, 0x5f, 0x5c, 0x6f, 0x7e, 0x0f, 0xb4, 0xe8, 0xba, - 0xb6, 0xd1, 0x44, 0xad, 0x12, 0xd5, 0xa2, 0xeb, 0xe3, 0xc1, 0x7c, 0x46, 0x73, 0x72, 0x78, 0x07, - 0x4a, 0xe4, 0x1d, 0xe9, 0x9e, 0xb3, 0x21, 0xd5, 0x0b, 0xf8, 0x1f, 0xc0, 0x3d, 0x72, 0xd1, 0xef, - 0x12, 0xb7, 0x6f, 0x33, 0x62, 0xb3, 0xfe, 0xd0, 0xb6, 0x06, 0x3a, 0xc2, 0x3a, 0xec, 0xcc, 0xe3, - 0x84, 0xd2, 0x21, 0xd5, 0xb5, 0xe3, 0x13, 0xd8, 0x4e, 0x67, 0x56, 0xa6, 0x1d, 0x66, 0x31, 0xe2, - 0x3a, 0xcc, 0xea, 0x0c, 0xc8, 0x8c, 0x68, 0x16, 0x91, 0x3c, 0xf4, 0x8c, 0xf4, 0xfa, 0x16, 0x23, - 0x3a, 0x3a, 0xbe, 0x80, 0xca, 0xca, 0x20, 0xe2, 0x03, 0xa8, 0xda, 0xe7, 0x83, 0x81, 0xbb, 0x10, - 0xb8, 0x20, 0x36, 0xd3, 0x0b, 0xb8, 0x0a, 0xbb, 0xc4, 0xee, 0xb9, 0xc3, 0x37, 0xae, 0xc3, 0x28, - 0xb1, 0xce, 0x74, 0x84, 0x8f, 0xe0, 0xa0, 0x63, 0x39, 0xfd, 0xae, 0xcb, 0x2c, 0xe7, 0xad, 0x2b, - 0x79, 0xfb, 0xb6, 0xc5, 0x48, 0x4f, 0xd7, 0xda, 0xdf, 0x34, 0x28, 0x0e, 0x7d, 0x1f, 0x9f, 0x42, - 0x39, 0x33, 0xcf, 0x38, 0x6d, 0xf4, 0xc3, 0xb5, 0xa9, 0xd7, 0xd6, 0xe6, 0xe2, 0xf1, 0xd4, 0x28, - 0x3c, 0x41, 0x92, 0x28, 0xb3, 0xbb, 0x38, 0xff, 0x62, 0x7f, 0x20, 0x5a, 0x5d, 0x76, 0x45, 0xf4, - 0x0a, 0x4a, 0x8b, 0x7d, 0xc0, 0xe9, 0x32, 0xae, 0x2c, 0x4d, 0xfd, 0xe0, 0x61, 0x42, 0xdd, 0xc7, - 0x1d, 0x80, 0xe5, 0x34, 0xe1, 0xa3, 0x05, 0xec, 0xc1, 0xc0, 0xd7, 0x0f, 0xd7, 0xa5, 0x14, 0x47, - 0xa7, 0xfd, 0xfd, 0xbe, 0x81, 0x7e, 0xdc, 0x37, 0xd0, 0xcf, 0xfb, 0x06, 0xfa, 0xfa, 0xab, 0x51, - 0x80, 0x7f, 0xfd, 0x2b, 0xd3, 0xe7, 0x49, 0x68, 0x7a, 0xe3, 0xc0, 0xe7, 0x66, 0xd4, 0x36, 0xfd, - 0x28, 0x14, 0x49, 0x34, 0x96, 0x24, 0xef, 0xb5, 0xf8, 0xf2, 0x72, 0x4b, 0xfd, 0xdf, 0x9e, 0xfd, - 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc3, 0x94, 0x47, 0x22, 0xf3, 0x04, 0x00, 0x00, +var File_protos_occ_proto protoreflect.FileDescriptor + +var file_protos_occ_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x63, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x06, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x4f, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x14, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x3d, 0x0a, 0x10, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x35, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, + 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, + 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x2a, 0x4c, + 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x4f, 0x52, + 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x54, + 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, + 0x45, 0x10, 0x01, 0x2a, 0x56, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, + 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x11, 0x0a, + 0x0d, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, + 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x54, + 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0x99, 0x02, 0x0a, 0x03, + 0x4f, 0x63, 0x63, 0x12, 0x47, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x0b, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, + 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6f, 0x63, 0x63, + 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x29, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_occ_proto_rawDescOnce sync.Once + file_protos_occ_proto_rawDescData = file_protos_occ_proto_rawDesc +) + +func file_protos_occ_proto_rawDescGZIP() []byte { + file_protos_occ_proto_rawDescOnce.Do(func() { + file_protos_occ_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_occ_proto_rawDescData) + }) + return file_protos_occ_proto_rawDescData +} + +var file_protos_occ_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_occ_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_protos_occ_proto_goTypes = []interface{}{ + (StateChangeTrigger)(0), // 0: occ_pb.StateChangeTrigger + (StateType)(0), // 1: occ_pb.StateType + (DeviceEventType)(0), // 2: occ_pb.DeviceEventType + (*StateStreamRequest)(nil), // 3: occ_pb.StateStreamRequest + (*StateStreamReply)(nil), // 4: occ_pb.StateStreamReply + (*EventStreamRequest)(nil), // 5: occ_pb.EventStreamRequest + (*DeviceEvent)(nil), // 6: occ_pb.DeviceEvent + (*EventStreamReply)(nil), // 7: occ_pb.EventStreamReply + (*GetStateRequest)(nil), // 8: occ_pb.GetStateRequest + (*GetStateReply)(nil), // 9: occ_pb.GetStateReply + (*ConfigEntry)(nil), // 10: occ_pb.ConfigEntry + (*TransitionRequest)(nil), // 11: occ_pb.TransitionRequest + (*TransitionReply)(nil), // 12: occ_pb.TransitionReply +} +var file_protos_occ_proto_depIdxs = []int32{ + 1, // 0: occ_pb.StateStreamReply.type:type_name -> occ_pb.StateType + 2, // 1: occ_pb.DeviceEvent.type:type_name -> occ_pb.DeviceEventType + 6, // 2: occ_pb.EventStreamReply.event:type_name -> occ_pb.DeviceEvent + 10, // 3: occ_pb.TransitionRequest.arguments:type_name -> occ_pb.ConfigEntry + 0, // 4: occ_pb.TransitionReply.trigger:type_name -> occ_pb.StateChangeTrigger + 5, // 5: occ_pb.Occ.EventStream:input_type -> occ_pb.EventStreamRequest + 3, // 6: occ_pb.Occ.StateStream:input_type -> occ_pb.StateStreamRequest + 8, // 7: occ_pb.Occ.GetState:input_type -> occ_pb.GetStateRequest + 11, // 8: occ_pb.Occ.Transition:input_type -> occ_pb.TransitionRequest + 7, // 9: occ_pb.Occ.EventStream:output_type -> occ_pb.EventStreamReply + 4, // 10: occ_pb.Occ.StateStream:output_type -> occ_pb.StateStreamReply + 9, // 11: occ_pb.Occ.GetState:output_type -> occ_pb.GetStateReply + 12, // 12: occ_pb.Occ.Transition:output_type -> occ_pb.TransitionReply + 9, // [9:13] is the sub-list for method output_type + 5, // [5:9] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_protos_occ_proto_init() } +func file_protos_occ_proto_init() { + if File_protos_occ_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_occ_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateStreamReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventStreamRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeviceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EventStreamReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStateReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigEntry); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransitionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_occ_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransitionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_occ_proto_rawDesc, + NumEnums: 3, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_occ_proto_goTypes, + DependencyIndexes: file_protos_occ_proto_depIdxs, + EnumInfos: file_protos_occ_proto_enumTypes, + MessageInfos: file_protos_occ_proto_msgTypes, + }.Build() + File_protos_occ_proto = out.File + file_protos_occ_proto_rawDesc = nil + file_protos_occ_proto_goTypes = nil + file_protos_occ_proto_depIdxs = nil } // Reference imports to suppress errors if they are not otherwise used. var _ context.Context -var _ grpc.ClientConn +var _ grpc.ClientConnInterface // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 +const _ = grpc.SupportPackageIsVersion6 // OccClient is the client API for Occ service. // @@ -700,10 +1006,10 @@ type OccClient interface { } type occClient struct { - cc *grpc.ClientConn + cc grpc.ClientConnInterface } -func NewOccClient(cc *grpc.ClientConn) OccClient { +func NewOccClient(cc grpc.ClientConnInterface) OccClient { return &occClient{cc} } @@ -803,16 +1109,16 @@ type OccServer interface { type UnimplementedOccServer struct { } -func (*UnimplementedOccServer) EventStream(req *EventStreamRequest, srv Occ_EventStreamServer) error { +func (*UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { return status.Errorf(codes.Unimplemented, "method EventStream not implemented") } -func (*UnimplementedOccServer) StateStream(req *StateStreamRequest, srv Occ_StateStreamServer) error { +func (*UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { return status.Errorf(codes.Unimplemented, "method StateStream not implemented") } -func (*UnimplementedOccServer) GetState(ctx context.Context, req *GetStateRequest) (*GetStateReply, error) { +func (*UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") } -func (*UnimplementedOccServer) Transition(ctx context.Context, req *TransitionRequest) (*TransitionReply, error) { +func (*UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") } @@ -925,1626 +1231,3 @@ var _Occ_serviceDesc = grpc.ServiceDesc{ }, Metadata: "protos/occ.proto", } - -func (m *StateStreamRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *StateStreamReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StateStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StateStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EventStreamRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventStreamRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *DeviceEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DeviceEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DeviceEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Type != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *EventStreamReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EventStreamReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EventStreamReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Event != nil { - { - size, err := m.Event.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetStateRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetStateRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetStateReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetStateReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetStateReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Pid != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Pid)) - i-- - dAtA[i] = 0x10 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ConfigEntry) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ConfigEntry) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ConfigEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x12 - } - if len(m.Key) > 0 { - i -= len(m.Key) - copy(dAtA[i:], m.Key) - i = encodeVarintOcc(dAtA, i, uint64(len(m.Key))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TransitionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TransitionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Arguments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintOcc(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x12 - } - if len(m.SrcState) > 0 { - i -= len(m.SrcState) - copy(dAtA[i:], m.SrcState) - i = encodeVarintOcc(dAtA, i, uint64(len(m.SrcState))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TransitionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TransitionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TransitionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Ok { - i-- - if m.Ok { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if len(m.TransitionEvent) > 0 { - i -= len(m.TransitionEvent) - copy(dAtA[i:], m.TransitionEvent) - i = encodeVarintOcc(dAtA, i, uint64(len(m.TransitionEvent))) - i-- - dAtA[i] = 0x1a - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintOcc(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if m.Trigger != 0 { - i = encodeVarintOcc(dAtA, i, uint64(m.Trigger)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintOcc(dAtA []byte, offset int, v uint64) int { - offset -= sovOcc(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *StateStreamRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StateStreamReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovOcc(uint64(m.Type)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EventStreamRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DeviceEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovOcc(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EventStreamReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Event != nil { - l = m.Event.Size() - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetStateRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetStateReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.Pid != 0 { - n += 1 + sovOcc(uint64(m.Pid)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ConfigEntry) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Key) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TransitionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.SrcState) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.TransitionEvent) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, e := range m.Arguments { - l = e.Size() - n += 1 + l + sovOcc(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TransitionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Trigger != 0 { - n += 1 + sovOcc(uint64(m.Trigger)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - l = len(m.TransitionEvent) - if l > 0 { - n += 1 + l + sovOcc(uint64(l)) - } - if m.Ok { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovOcc(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozOcc(x uint64) (n int) { - return sovOcc(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *StateStreamRequest) 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 ErrIntOverflowOcc - } - 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: StateStreamRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StateStreamReply) 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 ErrIntOverflowOcc - } - 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: StateStreamReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StateStreamReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= StateType(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventStreamRequest) 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 ErrIntOverflowOcc - } - 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: EventStreamRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventStreamRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DeviceEvent) 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 ErrIntOverflowOcc - } - 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: DeviceEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DeviceEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= DeviceEventType(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EventStreamReply) 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 ErrIntOverflowOcc - } - 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: EventStreamReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EventStreamReply: 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 msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOcc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Event == nil { - m.Event = &DeviceEvent{} - } - if err := m.Event.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetStateRequest) 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 ErrIntOverflowOcc - } - 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: GetStateRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetStateRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetStateReply) 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 ErrIntOverflowOcc - } - 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: GetStateReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetStateReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - m.Pid = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Pid |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ConfigEntry) 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 ErrIntOverflowOcc - } - 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: ConfigEntry: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ConfigEntry: 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 ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - 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 Value", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TransitionRequest) 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 ErrIntOverflowOcc - } - 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: TransitionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransitionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SrcState", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SrcState = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TransitionEvent = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthOcc - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, &ConfigEntry{}) - if err := m.Arguments[len(m.Arguments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TransitionReply) 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 ErrIntOverflowOcc - } - 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: TransitionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TransitionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Trigger", wireType) - } - m.Trigger = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Trigger |= StateChangeTrigger(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TransitionEvent", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - 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 ErrInvalidLengthOcc - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthOcc - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TransitionEvent = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Ok", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowOcc - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Ok = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipOcc(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthOcc - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipOcc(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - 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, ErrIntOverflowOcc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowOcc - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthOcc - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupOcc - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthOcc - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthOcc = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowOcc = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupOcc = fmt.Errorf("proto: unexpected end of group") -) From a6915f7f168db780c666756ee2a84ed14910b560 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Dec 2020 15:46:18 +0100 Subject: [PATCH 0699/2352] [coconut] Update inline documentation for coconut conf --- coconut/cmd/configuration_dump.go | 4 +++- coconut/cmd/configuration_history.go | 2 +- coconut/cmd/configuration_import.go | 4 ++-- coconut/cmd/configuration_show.go | 7 ++++--- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/coconut/cmd/configuration_dump.go b/coconut/cmd/configuration_dump.go index df1c13448..c2268ab09 100644 --- a/coconut/cmd/configuration_dump.go +++ b/coconut/cmd/configuration_dump.go @@ -36,7 +36,9 @@ var configurationDumpCmd = &cobra.Command{ Short: "dump configuration subtree", Long: `The configuration dump command requests from O² Configuration a subtree of key-values, and dumps it to standard output in the specified -format.`, +format. This command has full read access to the O² Configuration store +and performs a raw query with no additional processing or access control +semantics.`, Run: configuration.WrapCall(configuration.Dump), Args: cobra.ExactArgs(1), } diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go index defb7de42..5da96e74d 100644 --- a/coconut/cmd/configuration_history.go +++ b/coconut/cmd/configuration_history.go @@ -34,7 +34,7 @@ var configurationHistoryCmd = &cobra.Command{ Aliases: []string{"h"}, Example: `coconut conf history coconut conf history -coconut conf history /`, +coconut conf history ///`, Short: "List all existing entries with timestamps of a specified component in Consul", Long: `The configuration history command returns all entries with all of their associated timestamps or returns all timestamps for a specified component and entry`, diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go index 2c2de3c04..f757f68f7 100644 --- a/coconut/cmd/configuration_import.go +++ b/coconut/cmd/configuration_import.go @@ -33,9 +33,9 @@ var configurationImportCmd = &cobra.Command{ Use: "import ", Aliases: []string{"i", "imp"}, Example: `coconut conf import -coconut conf import / +coconut conf import /// coconut conf import --new-component -coconut conf import / --format=json +coconut conf import /// --format=json coconut conf import .json coconut conf import --no-versioning coconut conf import --no-versioning --new-component diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index a25c754f7..7ee168b79 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -34,9 +34,10 @@ var configurationShowCmd = &cobra.Command{ Aliases: []string{"s"}, Example: `coconut conf show coconut conf show -t -coconut conf show / -coconut conf show / -t -coconut conf show /@`, +coconut conf show /// +coconut conf show /// -t +coconut conf show ///@ +coconut conf show -s -e '{"key1": "value1", "key2": "value2"}'`, Short: "Show configuration for the component and entry specified", Long: `The configuration show command returns the most recent configuration revision for the specified component and entry. From 33e532b5ed697896e5782e3f8429f03ce2542aeb Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 4 Jan 2021 15:04:44 +0100 Subject: [PATCH 0700/2352] Replace sed with perl in makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 778c56230..d1b89c180 100644 --- a/Makefile +++ b/Makefile @@ -135,7 +135,7 @@ vendor: # we insert a go_package specification into the ODC protofile right # after we download it. @echo -e "\033[1;33mpatch odc.proto\033[0m" - @sed -i '/^package/a option go_package = "odcprotos;odc";' odcshim/odcprotos/odc.proto + @perl -pi -e '$$_.="option go_package = \"odcprotos;odc\";\n" if (/^package/)' odcshim/odcprotos/odc.proto # vendor: tools/dep # @echo -e "\033[1;33mdep ensure\033[0m" From dec6b969bcfae33e9a822a7043f54a6ee5005575 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 18 Dec 2020 16:56:20 +0100 Subject: [PATCH 0701/2352] [apricot] A Processor and Repository for Configuration Templates This looks to create apricot as a standalone binary. Its primary interface is protos/apricot.proto, and it serves as a shim daemon (apricot/server.go) for configuration.Service, the non-remote implementation of the apricot.Service interface. Future commits: A remote interface will be apricot/client.go, and this too should implement apricot.Service. Most code should be further refactored so that using the interface makes all calls indistinguishable whether the call is compiled-in, or a gRPC call implemented in apricot.Client. coconut should then be cleaned up and Consul KV access code should be deduplicated. In the end, consul conf should mostly remain as a thin wrapper around apricot.Client. --- Makefile | 4 +- apricot/client.go | 139 +++ apricot/protos/apricot.pb.go | 1094 +++++++++++++++++ apricot/protos/apricot.proto | 85 ++ apricot/server.go | 187 +++ coconut/configuration/configuration.go | 65 +- coconut/configuration/configurationutil.go | 2 +- .../configuration_suite_test.go | 4 +- .../{ => cfgbackend}/configuration_test.yaml | 0 .../{ => cfgbackend}/configurationmap.go | 2 +- .../{ => cfgbackend}/consulsource.go | 5 +- configuration/{ => cfgbackend}/source.go | 4 +- configuration/{ => cfgbackend}/source_test.go | 114 +- configuration/{ => cfgbackend}/yamlsource.go | 4 +- configuration/componentcfg/componentcfg.go | 91 +- configuration/componentcfg/query.go | 125 ++ configuration/instance.go | 56 + configuration/repos/repo.go | 7 +- configuration/repos/repomanager.go | 8 +- configuration/{confsys => }/service.go | 145 +-- configuration/serviceutil.go | 46 + configuration/template/fields.go | 5 +- configuration/template/loader.go | 8 +- configuration/template/stack.go | 18 +- configuration/the/singleton.go | 6 +- core/globalstate.go | 11 +- core/task/manager.go | 2 +- 27 files changed, 1936 insertions(+), 301 deletions(-) create mode 100644 apricot/client.go create mode 100644 apricot/protos/apricot.pb.go create mode 100644 apricot/protos/apricot.proto create mode 100644 apricot/server.go rename configuration/{ => cfgbackend}/configuration_suite_test.go (87%) rename configuration/{ => cfgbackend}/configuration_test.yaml (100%) rename configuration/{ => cfgbackend}/configurationmap.go (99%) rename configuration/{ => cfgbackend}/consulsource.go (99%) rename configuration/{ => cfgbackend}/source.go (98%) rename configuration/{ => cfgbackend}/source_test.go (72%) rename configuration/{ => cfgbackend}/yamlsource.go (99%) create mode 100644 configuration/componentcfg/query.go create mode 100644 configuration/instance.go rename configuration/{confsys => }/service.go (72%) create mode 100644 configuration/serviceutil.go diff --git a/Makefile b/Makefile index d1b89c180..46349d20b 100644 --- a/Makefile +++ b/Makefile @@ -53,8 +53,8 @@ WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./core ./executor ./coconut/cmd ./odcshim ./walnut -SRC_DIRS := ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./core ./executor ./coconut/cmd ./odcshim ./walnut +SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product diff --git a/apricot/client.go b/apricot/client.go new file mode 100644 index 000000000..9b1488768 --- /dev/null +++ b/apricot/client.go @@ -0,0 +1,139 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package apricot + +import ( + "context" + "fmt" + "time" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "google.golang.org/grpc" +) + +const CALL_TIMEOUT = 30*time.Second + +type RemoteService struct { + remote rpcClient +} + +func NewClientService(endpoint string) (svc Service, err error) { + cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) + + rpcClient := newRpcClient(cxt, cancel, endpoint) + if rpcClient == nil { + return nil, fmt.Errorf("cannot dial apricot service at %s", endpoint) + } + return &RemoteService{remote: *rpcClient}, nil +} + +func (c *RemoteService) NewRunNumber() (runNumber uint32, err error) { + var response *apricotpb.RunNumberResponse + response, err = c.remote.NewRunNumber(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return 0, err + } + return response.GetRunNumber(), nil +} + +func (c *RemoteService) GetDefaults() map[string]string { + response, err := c.remote.GetDefaults(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil + } + return response.GetStringMap() +} + +func (c *RemoteService) GetVars() map[string]string { + response, err := c.remote.GetVars(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil + } + return response.GetStringMap() +} + +func (c *RemoteService) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + return c.getComponentConfigurationInternal(query, false, nil) +} + +func (c *RemoteService) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + return c.getComponentConfigurationInternal(query, true, varStack) +} + +func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Query, processTemplate bool, varStack map[string]string) (payload string, err error) { + var response *apricotpb.ComponentResponse + componentQuery := &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.Flavor, + MachineRole: query.Rolename, + Entry: query.EntryKey, + Timestamp: query.Timestamp, + } + request := &apricotpb.ComponentRequest{ + QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, + ProcessTemplate: processTemplate, + VarStack: varStack, + } + response, err = c.remote.GetComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) { + var response *apricotpb.ComponentResponse + request := &apricotpb.RawGetRecursiveRequest{RawPath: path} + response, err = c.remote.RawGetRecursive(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +type rpcClient struct { + apricotpb.ApricotClient + conn *grpc.ClientConn +} + +func newRpcClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *rpcClient { + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + client := &rpcClient{ + ApricotClient: apricotpb.NewApricotClient(conn), + conn: conn, + } + + return client +} + diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go new file mode 100644 index 000000000..6d0aa8bf9 --- /dev/null +++ b/apricot/protos/apricot.pb.go @@ -0,0 +1,1094 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2020 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: protos/apricot.proto + +package apricotpb + +import ( + context "context" + proto "github.com/golang/protobuf/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type RunType int32 + +const ( + RunType_NULL RunType = 0 + RunType_ANY RunType = 1 + RunType_PHYSICS RunType = 2 + RunType_TECHNICAL RunType = 3 +) + +// Enum value maps for RunType. +var ( + RunType_name = map[int32]string{ + 0: "NULL", + 1: "ANY", + 2: "PHYSICS", + 3: "TECHNICAL", + } + RunType_value = map[string]int32{ + "NULL": 0, + "ANY": 1, + "PHYSICS": 2, + "TECHNICAL": 3, + } +) + +func (x RunType) Enum() *RunType { + p := new(RunType) + *p = x + return p +} + +func (x RunType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_apricot_proto_enumTypes[0].Descriptor() +} + +func (RunType) Type() protoreflect.EnumType { + return &file_protos_apricot_proto_enumTypes[0] +} + +func (x RunType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunType.Descriptor instead. +func (RunType) EnumDescriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{0} +} + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{0} +} + +type ComponentQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=apricot.RunType" json:"runType,omitempty"` + MachineRole string `protobuf:"bytes,3,opt,name=machineRole,proto3" json:"machineRole,omitempty"` + Entry string `protobuf:"bytes,4,opt,name=entry,proto3" json:"entry,omitempty"` + Timestamp string `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *ComponentQuery) Reset() { + *x = ComponentQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentQuery) ProtoMessage() {} + +func (x *ComponentQuery) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentQuery.ProtoReflect.Descriptor instead. +func (*ComponentQuery) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{1} +} + +func (x *ComponentQuery) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + +func (x *ComponentQuery) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_NULL +} + +func (x *ComponentQuery) GetMachineRole() string { + if x != nil { + return x.MachineRole + } + return "" +} + +func (x *ComponentQuery) GetEntry() string { + if x != nil { + return x.Entry + } + return "" +} + +func (x *ComponentQuery) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +type ComponentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to QueryPath: + // *ComponentRequest_Path + // *ComponentRequest_Query + QueryPath isComponentRequest_QueryPath `protobuf_oneof:"queryPath"` + ProcessTemplate bool `protobuf:"varint,3,opt,name=processTemplate,proto3" json:"processTemplate,omitempty"` + VarStack map[string]string `protobuf:"bytes,4,rep,name=varStack,proto3" json:"varStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ComponentRequest) Reset() { + *x = ComponentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentRequest) ProtoMessage() {} + +func (x *ComponentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentRequest.ProtoReflect.Descriptor instead. +func (*ComponentRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{2} +} + +func (m *ComponentRequest) GetQueryPath() isComponentRequest_QueryPath { + if m != nil { + return m.QueryPath + } + return nil +} + +func (x *ComponentRequest) GetPath() string { + if x, ok := x.GetQueryPath().(*ComponentRequest_Path); ok { + return x.Path + } + return "" +} + +func (x *ComponentRequest) GetQuery() *ComponentQuery { + if x, ok := x.GetQueryPath().(*ComponentRequest_Query); ok { + return x.Query + } + return nil +} + +func (x *ComponentRequest) GetProcessTemplate() bool { + if x != nil { + return x.ProcessTemplate + } + return false +} + +func (x *ComponentRequest) GetVarStack() map[string]string { + if x != nil { + return x.VarStack + } + return nil +} + +type isComponentRequest_QueryPath interface { + isComponentRequest_QueryPath() +} + +type ComponentRequest_Path struct { + Path string `protobuf:"bytes,1,opt,name=path,proto3,oneof"` +} + +type ComponentRequest_Query struct { + Query *ComponentQuery `protobuf:"bytes,2,opt,name=query,proto3,oneof"` +} + +func (*ComponentRequest_Path) isComponentRequest_QueryPath() {} + +func (*ComponentRequest_Query) isComponentRequest_QueryPath() {} + +type ComponentRuntimeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` + Entry string `protobuf:"bytes,2,opt,name=entry,proto3" json:"entry,omitempty"` +} + +func (x *ComponentRuntimeRequest) Reset() { + *x = ComponentRuntimeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentRuntimeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentRuntimeRequest) ProtoMessage() {} + +func (x *ComponentRuntimeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentRuntimeRequest.ProtoReflect.Descriptor instead. +func (*ComponentRuntimeRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{3} +} + +func (x *ComponentRuntimeRequest) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + +func (x *ComponentRuntimeRequest) GetEntry() string { + if x != nil { + return x.Entry + } + return "" +} + +type ComponentResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Payload string `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *ComponentResponse) Reset() { + *x = ComponentResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentResponse) ProtoMessage() {} + +func (x *ComponentResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentResponse.ProtoReflect.Descriptor instead. +func (*ComponentResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{4} +} + +func (x *ComponentResponse) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + +type RunNumberResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber uint32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` +} + +func (x *RunNumberResponse) Reset() { + *x = RunNumberResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunNumberResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunNumberResponse) ProtoMessage() {} + +func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. +func (*RunNumberResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{5} +} + +func (x *RunNumberResponse) GetRunNumber() uint32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +type StringMap struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StringMap map[string]string `protobuf:"bytes,1,rep,name=stringMap,proto3" json:"stringMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *StringMap) Reset() { + *x = StringMap{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StringMap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StringMap) ProtoMessage() {} + +func (x *StringMap) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StringMap.ProtoReflect.Descriptor instead. +func (*StringMap) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{6} +} + +func (x *StringMap) GetStringMap() map[string]string { + if x != nil { + return x.StringMap + } + return nil +} + +type RawGetRecursiveRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RawPath string `protobuf:"bytes,1,opt,name=rawPath,proto3" json:"rawPath,omitempty"` +} + +func (x *RawGetRecursiveRequest) Reset() { + *x = RawGetRecursiveRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RawGetRecursiveRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RawGetRecursiveRequest) ProtoMessage() {} + +func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. +func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{7} +} + +func (x *RawGetRecursiveRequest) GetRawPath() string { + if x != nil { + return x.RawPath + } + return "" +} + +var File_protos_apricot_proto protoreflect.FileDescriptor + +var file_protos_apricot_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x22, + 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xb0, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x92, 0x02, 0x0a, 0x10, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x43, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x76, 0x61, + 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x56, 0x61, 0x72, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, + 0x22, 0x4d, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, + 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, + 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, + 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, + 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, + 0x74, 0x68, 0x2a, 0x38, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x32, 0xac, 0x03, 0x0a, + 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, + 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_apricot_proto_rawDescOnce sync.Once + file_protos_apricot_proto_rawDescData = file_protos_apricot_proto_rawDesc +) + +func file_protos_apricot_proto_rawDescGZIP() []byte { + file_protos_apricot_proto_rawDescOnce.Do(func() { + file_protos_apricot_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_apricot_proto_rawDescData) + }) + return file_protos_apricot_proto_rawDescData +} + +var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_protos_apricot_proto_goTypes = []interface{}{ + (RunType)(0), // 0: apricot.RunType + (*Empty)(nil), // 1: apricot.Empty + (*ComponentQuery)(nil), // 2: apricot.ComponentQuery + (*ComponentRequest)(nil), // 3: apricot.ComponentRequest + (*ComponentRuntimeRequest)(nil), // 4: apricot.ComponentRuntimeRequest + (*ComponentResponse)(nil), // 5: apricot.ComponentResponse + (*RunNumberResponse)(nil), // 6: apricot.RunNumberResponse + (*StringMap)(nil), // 7: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 8: apricot.RawGetRecursiveRequest + nil, // 9: apricot.ComponentRequest.VarStackEntry + nil, // 10: apricot.StringMap.StringMapEntry +} +var file_protos_apricot_proto_depIdxs = []int32{ + 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType + 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery + 9, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 10, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 1, // 4: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty + 1, // 5: apricot.Apricot.GetDefaults:input_type -> apricot.Empty + 1, // 6: apricot.Apricot.GetVars:input_type -> apricot.Empty + 3, // 7: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 4, // 8: apricot.Apricot.GetComponentRuntime:input_type -> apricot.ComponentRuntimeRequest + 8, // 9: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 6, // 10: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 7, // 11: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 7, // 12: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 5, // 13: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 14: apricot.Apricot.GetComponentRuntime:output_type -> apricot.ComponentResponse + 5, // 15: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 10, // [10:16] is the sub-list for method output_type + 4, // [4:10] is the sub-list for method input_type + 4, // [4:4] is the sub-list for extension type_name + 4, // [4:4] is the sub-list for extension extendee + 0, // [0:4] is the sub-list for field type_name +} + +func init() { file_protos_apricot_proto_init() } +func file_protos_apricot_proto_init() { + if File_protos_apricot_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_apricot_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentRuntimeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunNumberResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StringMap); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RawGetRecursiveRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_apricot_proto_msgTypes[2].OneofWrappers = []interface{}{ + (*ComponentRequest_Path)(nil), + (*ComponentRequest_Query)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_apricot_proto_rawDesc, + NumEnums: 1, + NumMessages: 10, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_apricot_proto_goTypes, + DependencyIndexes: file_protos_apricot_proto_depIdxs, + EnumInfos: file_protos_apricot_proto_enumTypes, + MessageInfos: file_protos_apricot_proto_msgTypes, + }.Build() + File_protos_apricot_proto = out.File + file_protos_apricot_proto_rawDesc = nil + file_protos_apricot_proto_goTypes = nil + file_protos_apricot_proto_depIdxs = nil +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConnInterface + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion6 + +// ApricotClient is the client API for Apricot service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type ApricotClient interface { + NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) + GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) + GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) + GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + GetComponentRuntime(ctx context.Context, in *ComponentRuntimeRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) +} + +type apricotClient struct { + cc grpc.ClientConnInterface +} + +func NewApricotClient(cc grpc.ClientConnInterface) ApricotClient { + return &apricotClient{cc} +} + +func (c *apricotClient) NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) { + out := new(RunNumberResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/NewRunNumber", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { + out := new(StringMap) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDefaults", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { + out := new(StringMap) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetVars", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetComponentRuntime(ctx context.Context, in *ComponentRuntimeRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentRuntime", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ApricotServer is the server API for Apricot service. +type ApricotServer interface { + NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) + GetDefaults(context.Context, *Empty) (*StringMap, error) + GetVars(context.Context, *Empty) (*StringMap, error) + GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) + GetComponentRuntime(context.Context, *ComponentRuntimeRequest) (*ComponentResponse, error) + RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) +} + +// UnimplementedApricotServer can be embedded to have forward compatible implementations. +type UnimplementedApricotServer struct { +} + +func (*UnimplementedApricotServer) NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewRunNumber not implemented") +} +func (*UnimplementedApricotServer) GetDefaults(context.Context, *Empty) (*StringMap, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaults not implemented") +} +func (*UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVars not implemented") +} +func (*UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") +} +func (*UnimplementedApricotServer) GetComponentRuntime(context.Context, *ComponentRuntimeRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetComponentRuntime not implemented") +} +func (*UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") +} + +func RegisterApricotServer(s *grpc.Server, srv ApricotServer) { + s.RegisterService(&_Apricot_serviceDesc, srv) +} + +func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).NewRunNumber(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/NewRunNumber", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).NewRunNumber(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetDefaults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetDefaults(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetDefaults", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetDefaults(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetVars_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetVars(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetVars", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetVars(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetComponentConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetComponentConfiguration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetComponentRuntime_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentRuntimeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetComponentRuntime(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetComponentRuntime", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetComponentRuntime(ctx, req.(*ComponentRuntimeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RawGetRecursiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).RawGetRecursive(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/RawGetRecursive", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Apricot_serviceDesc = grpc.ServiceDesc{ + ServiceName: "apricot.Apricot", + HandlerType: (*ApricotServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "NewRunNumber", + Handler: _Apricot_NewRunNumber_Handler, + }, + { + MethodName: "GetDefaults", + Handler: _Apricot_GetDefaults_Handler, + }, + { + MethodName: "GetVars", + Handler: _Apricot_GetVars_Handler, + }, + { + MethodName: "GetComponentConfiguration", + Handler: _Apricot_GetComponentConfiguration_Handler, + }, + { + MethodName: "GetComponentRuntime", + Handler: _Apricot_GetComponentRuntime_Handler, + }, + { + MethodName: "RawGetRecursive", + Handler: _Apricot_RawGetRecursive_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/apricot.proto", +} diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto new file mode 100644 index 000000000..be07e11c3 --- /dev/null +++ b/apricot/protos/apricot.proto @@ -0,0 +1,85 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +syntax = "proto3"; + +package apricot; +option java_package = "ch.cern.alice.o2.apricot.rpcserver"; +option go_package = "protos;apricotpb"; + +service Apricot { + rpc NewRunNumber(Empty) returns (RunNumberResponse) {} + rpc GetDefaults(Empty) returns (StringMap) {} + rpc GetVars(Empty) returns (StringMap) {} + rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} + rpc GetComponentRuntime(ComponentRuntimeRequest) returns (ComponentResponse) {} + rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} +} + +enum RunType { + NULL = 0; + ANY = 1; + PHYSICS = 2; + TECHNICAL = 3; +} + +message Empty {} + +message ComponentQuery { + string component = 1; + RunType runType = 2; + string machineRole = 3; + string entry = 4; + string timestamp = 5; +} + +message ComponentRequest { + oneof queryPath { + string path = 1; + ComponentQuery query = 2; + } + bool processTemplate = 3; + map varStack = 4; +} + +message ComponentRuntimeRequest { + string component = 1; + string entry = 2; +} + +message ComponentResponse { + string payload = 1; +} + +message RunNumberResponse { + uint32 runNumber = 1; +} + +message StringMap { + map stringMap = 1; +} + +message RawGetRecursiveRequest { + string rawPath = 1; +} \ No newline at end of file diff --git a/apricot/server.go b/apricot/server.go new file mode 100644 index 000000000..f09204687 --- /dev/null +++ b/apricot/server.go @@ -0,0 +1,187 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +// A Processor and ReposItory for COnfiguration Templates +package apricot + +import ( + "context" + "runtime" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/reflection" + "google.golang.org/grpc/status" +) + +//go:generate protoc --go_out=plugins=grpc:. protos/apricot.proto + + +var log = logger.New(logrus.StandardLogger(),"apricot") + +var( + E_OK = status.New(codes.OK, "") + E_CONFIGURATION_BACKEND_UNAVAILABLE = status.Errorf(codes.Internal, "configuration backend unavailable") + E_BAD_INPUT = status.Errorf(codes.InvalidArgument, "bad request received") +) + +type RepoService interface { + +} +type Service interface { + RepoService + NewRunNumber() (runNumber uint32, err error) + GetDefaults() map[string]string + GetVars() map[string]string + GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) + GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + RawGetRecursive(path string) (string, error) +} + +type RpcServer struct { + service Service +} + +func NewServer(service Service) *grpc.Server { + s := grpc.NewServer() + apricotpb.RegisterApricotServer(s, &RpcServer{ + service: service, + }) + // Register reflection service on gRPC server. + reflection.Register(s) + return s +} + +func (m *RpcServer) NewRunNumber(_ context.Context, _ *apricotpb.Empty) (*apricotpb.RunNumberResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + rn, err := m.service.NewRunNumber() + return &apricotpb.RunNumberResponse{RunNumber: rn}, err +} + +func (m *RpcServer) GetDefaults(_ context.Context, _ *apricotpb.Empty) (*apricotpb.StringMap, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + varStack := m.service.GetDefaults() + return &apricotpb.StringMap{StringMap: varStack}, E_OK.Err() +} + +func (m *RpcServer) GetVars(_ context.Context, _ *apricotpb.Empty) (*apricotpb.StringMap, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + varStack := m.service.GetVars() + return &apricotpb.StringMap{StringMap: varStack}, E_OK.Err() +} + +func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *apricotpb.ComponentRequest) (*apricotpb.ComponentResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + var path *componentcfg.Query + if rawPath := request.GetPath(); len(rawPath) > 0 { + var err error + path, err = componentcfg.NewQuery(rawPath) + if err != nil { + return nil, E_BAD_INPUT + } + } else if query := request.GetQuery(); query != nil { + path = &componentcfg.Query{ + Component: query.Component, + Flavor: query.RunType, + Rolename: query.MachineRole, + EntryKey: query.Entry, + Timestamp: query.Timestamp, + } + } else { + return nil, E_BAD_INPUT + } + + var payload string + var err error + if request.ProcessTemplate { + payload, err = m.service.GetAndProcessComponentConfiguration(path, request.GetVarStack()) + } else { + payload, err = m.service.GetComponentConfiguration(path) + } + + if err != nil { + return nil, err + } + return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() +} + +func (m *RpcServer) GetComponentRuntime(ctx context.Context, request *apricotpb.ComponentRuntimeRequest) (*apricotpb.ComponentResponse, error) { + panic("implement me") +} + +func (m *RpcServer) RawGetRecursive(ctx context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + payload, err := m.service.RawGetRecursive(request.RawPath) + if err != nil { + return &apricotpb.ComponentResponse{Payload: ""}, err + } + return &apricotpb.ComponentResponse{Payload: payload}, nil +} + +func (m *RpcServer) logMethod() { + if !viper.GetBool("verbose") { + return + } + pc, _, _, ok := runtime.Caller(1) + if !ok { + return + } + fun := runtime.FuncForPC(pc) + if fun == nil { + return + } + log.WithPrefix("apricot"). + WithField("method", fun.Name()). + Trace("handling RPC request") +} diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index bd83fb06e..8f577101a 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -37,9 +37,10 @@ import ( "strings" "time" + apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/the" "github.com/briandowns/spinner" @@ -54,7 +55,7 @@ var log = logger.New(logrus.StandardLogger(), "coconut") type RunFunc func(*cobra.Command, []string) -type ConfigurationCall func(*configuration.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) +type ConfigurationCall func(*cfgbackend.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) const ( EC_ZERO = iota @@ -78,7 +79,7 @@ func WrapCall(call ConfigurationCall) RunFunc { s.Suffix = " working..." s.Start() - cfg, err := configuration.NewConsulSource(strings.TrimPrefix(endpoint, "consul://")) + cfg, err := cfgbackend.NewConsulSource(strings.TrimPrefix(endpoint, "consul://")) if err != nil { var fields logrus.Fields if logrus.GetLevel() == logrus.DebugLevel { @@ -109,7 +110,7 @@ func WrapCall(call ConfigurationCall) RunFunc { } } -func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { +func Dump(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, EC_INVALID_ARGS @@ -146,7 +147,7 @@ func Dump(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o } // coconut conf list -func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func List(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { keyPrefix := componentcfg.ConfigComponentsPath useTimestamp := false if len(args) > 1 { @@ -188,9 +189,9 @@ func List(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return nil, EC_ZERO } -func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { var timestamp string - var p = &componentcfg.Path{} + var query = &componentcfg.Query{} if len(args) < 1 || len(args) > 2 { return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS @@ -210,19 +211,19 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o err = errors.New("flag `-t / --timestamp` must not be provided when using format ///@") return err, EC_INVALID_ARGS } - p, err = componentcfg.NewPath(args[0]) + query, err = componentcfg.NewQuery(args[0]) if err != nil { return err, EC_INVALID_ARGS } - timestamp = p.Timestamp + timestamp = query.Timestamp } else if strings.Contains(args[0], "/") { // coconut conf show c/R/r/e # no timestamp - p, err = componentcfg.NewPath(args[0]) + query, err = componentcfg.NewQuery(args[0]) if err != nil { return err, EC_INVALID_ARGS } if timestamp == "" { - timestamp = p.Timestamp + timestamp = query.Timestamp } } } else { @@ -233,20 +234,20 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } else { - p.Component = args[0] - p.EntryKey = args[1] - p.Flavor = "ANY" - p.Rolename = "any" + query.Component = args[0] + query.EntryKey = args[1] + query.Flavor = apricotpb.RunType_ANY + query.Rolename = "any" } } - fullKeyToQuery := p.AbsoluteWithoutTimestamp() + fullKeyToQuery := query.AbsoluteWithoutTimestamp() if timestamp == "" { // No timestamp was passed, either via -t or @ // We need to ascertain whether the required entry is versioned // or unversioned. - keyPrefix := p.AbsoluteWithoutTimestamp() + keyPrefix := query.AbsoluteWithoutTimestamp() if cfg.IsDir(keyPrefix) { // The requested path is a Consul folder, so we should // look inside to find the latest timestamp. @@ -254,7 +255,7 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o if err != nil { return err, EC_CONNECTION_ERROR } - timestamp, err = componentcfg.GetLatestTimestamp(keys, p) + timestamp, err = componentcfg.GetLatestTimestamp(keys, query) if err != nil { return err, EC_EMPTY_DATA } @@ -268,11 +269,11 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o // We can safely append it to the full query path. fullKeyToQuery += componentcfg.SEPARATOR + timestamp } - p.Timestamp = timestamp + query.Timestamp = timestamp // At this point we know what to query, either fullKeyToQuery // for a raw configuration.ConsulSource query, or a - // componentcfg.Path that can be fed to the.ConfSvc(). + // componentcfg.Query that can be fed to the.ConfSvc(). var( cfgPayload string simulate bool @@ -301,8 +302,8 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return err, EC_INVALID_ARGS } - fmt.Fprintf(o,"%s", p.Path()) - cfgPayload, err = the.ConfSvc().GetAndProcessComponentConfiguration(p.Path(), extraVarsMap) + fmt.Fprintf(o,"%s", query.Path()) + cfgPayload, err = the.ConfSvc().GetAndProcessComponentConfiguration(query, extraVarsMap) if err != nil { return err, EC_CONNECTION_ERROR } @@ -321,8 +322,8 @@ func Show(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o return nil, EC_ZERO } -func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o io.Writer)(err error, code int) { - p := &componentcfg.Path{} +func History(cfg *cfgbackend.ConsulSource, _ *cobra.Command, args []string, o io.Writer)(err error, code int) { + p := &componentcfg.Query{} if len(args) < 1 || len(args) > 2 { return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS @@ -332,7 +333,7 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o if componentcfg.IsInputSingleValidWord(args[0]) { p.Component = args[0] } else if componentcfg.IsInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ - p, err = componentcfg.NewPath(args[0]) + p, err = componentcfg.NewQuery(args[0]) if err != nil { return err, EC_INVALID_ARGS } @@ -343,7 +344,7 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o if componentcfg.IsInputSingleValidWord(args[0]) && componentcfg.IsInputSingleValidWord(args[1]) { p.Component = args[0] p.EntryKey = args[1] - p.Flavor = "ANY" + p.Flavor = apricotpb.RunType_ANY p.Rolename = "any" } else { return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS @@ -369,8 +370,8 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o entry := p.EntryKey for _, value := range keys { - var thisPath *componentcfg.Path - thisPath, err = componentcfg.NewPath(value) + var thisPath *componentcfg.Query + thisPath, err = componentcfg.NewQuery(value) if err != nil { continue } @@ -392,7 +393,7 @@ func History(cfg *configuration.ConsulSource, _ *cobra.Command, args []string, o return nil, 0 } -func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func Import(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { useNewComponent, err := cmd.Flags().GetBool("new-component") if err != nil { return err, EC_INVALID_ARGS @@ -408,14 +409,14 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, // Parse and Format input arguments var filePath string - var p = &componentcfg.Path{} + var p = &componentcfg.Query{} if len(args) < 2 || len(args) > 3 { return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), EC_INVALID_ARGS } else { switch len(args) { case 2: // coconut conf import component/RUNTYPE/role/entry filepath - p, err = componentcfg.NewPath(args[0]) + p, err = componentcfg.NewQuery(args[0]) if err != nil { return err, EC_INVALID_ARGS } @@ -427,7 +428,7 @@ func Import(cfg *configuration.ConsulSource, cmd *cobra.Command, args []string, p.Component = args[0] p.EntryKey = args[1] p.Rolename = "any" - p.Flavor = "ANY" + p.Flavor = apricotpb.RunType_ANY filePath = args[2] } } diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index e01d825dc..63b3982c8 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -103,7 +103,7 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W table.SetColMinWidth(0, max) for _, value := range history { - p, err := componentcfg.NewPath(value) + p, err := componentcfg.NewQuery(value) if err != nil { continue } diff --git a/configuration/configuration_suite_test.go b/configuration/cfgbackend/configuration_suite_test.go similarity index 87% rename from configuration/configuration_suite_test.go rename to configuration/cfgbackend/configuration_suite_test.go index bc4f5d411..fdbb2984f 100644 --- a/configuration/configuration_suite_test.go +++ b/configuration/cfgbackend/configuration_suite_test.go @@ -1,4 +1,4 @@ -package configuration_test +package cfgbackend_test import ( "io" @@ -29,7 +29,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) defer from.Close() - to, err := os.OpenFile(*tmpDir + "/" + configFile, os.O_RDWR|os.O_CREATE, 0666) + to, err := os.OpenFile(*tmpDir+ "/" +configFile, os.O_RDWR|os.O_CREATE, 0666) Expect(err).NotTo(HaveOccurred()) defer to.Close() diff --git a/configuration/configuration_test.yaml b/configuration/cfgbackend/configuration_test.yaml similarity index 100% rename from configuration/configuration_test.yaml rename to configuration/cfgbackend/configuration_test.yaml diff --git a/configuration/configurationmap.go b/configuration/cfgbackend/configurationmap.go similarity index 99% rename from configuration/configurationmap.go rename to configuration/cfgbackend/configurationmap.go index b2171b8e3..186978e3d 100644 --- a/configuration/configurationmap.go +++ b/configuration/cfgbackend/configurationmap.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package configuration +package cfgbackend import ( "errors" diff --git a/configuration/consulsource.go b/configuration/cfgbackend/consulsource.go similarity index 99% rename from configuration/consulsource.go rename to configuration/cfgbackend/consulsource.go index e6812a2be..4ff2f692e 100644 --- a/configuration/consulsource.go +++ b/configuration/cfgbackend/consulsource.go @@ -22,14 +22,15 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package configuration +package cfgbackend import ( - "github.com/hashicorp/consul/api" "errors" "fmt" "strconv" "strings" + + "github.com/hashicorp/consul/api" "gopkg.in/yaml.v3" ) diff --git a/configuration/source.go b/configuration/cfgbackend/source.go similarity index 98% rename from configuration/source.go rename to configuration/cfgbackend/source.go index 17cb3ea2f..b9bac1eea 100644 --- a/configuration/source.go +++ b/configuration/cfgbackend/source.go @@ -25,11 +25,11 @@ // Package configuration defines the Source interface as the // main access point to O² Configuration backends. // Consul and YAML backends are also provided. -package configuration +package cfgbackend import ( - "strings" "errors" + "strings" ) type ROSource interface { diff --git a/configuration/source_test.go b/configuration/cfgbackend/source_test.go similarity index 72% rename from configuration/source_test.go rename to configuration/cfgbackend/source_test.go index f19d0d62c..e98c24e97 100644 --- a/configuration/source_test.go +++ b/configuration/cfgbackend/source_test.go @@ -1,7 +1,7 @@ -package configuration_test +package cfgbackend_test import ( - . "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/cfgbackend" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" "gopkg.in/yaml.v3" @@ -9,80 +9,80 @@ import ( var _ = Describe("Source", func() { var ( - c Source + c cfgbackend.Source err error ) DoConfigurationTests := func() { var ( - o2_control_tasks_1_map = Map{ - "name": String("fairmq-ex-1-n-1-sampler"), - "control": Map{ - "mode": String("fairmq"), + o2_control_tasks_1_map = cfgbackend.Map{ + "name": cfgbackend.String("fairmq-ex-1-n-1-sampler"), + "control": cfgbackend.Map{ + "mode": cfgbackend.String("fairmq"), }, - "wants": Map{ - "cpu": String("1"), - "memory": String("256"), - "ports": String("1"), + "wants": cfgbackend.Map{ + "cpu": cfgbackend.String("1"), + "memory": cfgbackend.String("256"), + "ports": cfgbackend.String("1"), }, - "bind": Array{ - Map{ - "name": String("data1"), - "type": String("push"), - "sndBufSize": String("1000"), - "rcvBufSize": String("1000"), - "rateLogging": String("0"), + "bind": cfgbackend.Array{ + cfgbackend.Map{ + "name": cfgbackend.String("data1"), + "type": cfgbackend.String("push"), + "sndBufSize": cfgbackend.String("1000"), + "rcvBufSize": cfgbackend.String("1000"), + "rateLogging": cfgbackend.String("0"), }, }, - "properties": Map{ - "severity": String("trace"), - "color": String("false"), + "properties": cfgbackend.Map{ + "severity": cfgbackend.String("trace"), + "color": cfgbackend.String("false"), }, - "command": Map{ - "env": Array{}, - "shell": String("true"), - "arguments": Array{}, - "value": String("fairmq-ex-1-n-1-sampler"), + "command": cfgbackend.Map{ + "env": cfgbackend.Array{}, + "shell": cfgbackend.String("true"), + "arguments": cfgbackend.Array{}, + "value": cfgbackend.String("fairmq-ex-1-n-1-sampler"), }, } - recursivePutMap = Map{ - "firstKey": String("one"), - "secondKey": Array{ - Map{ - "name": String("first"), - "type": String("an array item"), + recursivePutMap = cfgbackend.Map{ + "firstKey": cfgbackend.String("one"), + "secondKey": cfgbackend.Array{ + cfgbackend.Map{ + "name": cfgbackend.String("first"), + "type": cfgbackend.String("an array item"), }, - Map{ - "name": String("second"), - "type": String("an array item"), + cfgbackend.Map{ + "name": cfgbackend.String("second"), + "type": cfgbackend.String("an array item"), }, - Map{ - "name": String("third"), - "type": String("and yet another array item"), + cfgbackend.Map{ + "name": cfgbackend.String("third"), + "type": cfgbackend.String("and yet another array item"), }, }, - "thirdKey": Map{ - "just some": String("stuff"), + "thirdKey": cfgbackend.Map{ + "just some": cfgbackend.String("stuff"), }, } - recursivePutArray = Array{ - Map{ - "name": String("first"), - "type": String("an array item with a property map inside"), - "properties": Map{ - "just some": String("stuff"), + recursivePutArray = cfgbackend.Array{ + cfgbackend.Map{ + "name": cfgbackend.String("first"), + "type": cfgbackend.String("an array item with a property map inside"), + "properties": cfgbackend.Map{ + "just some": cfgbackend.String("stuff"), }, }, - Map{ - "name": String("second"), - "type": String("an array item"), + cfgbackend.Map{ + "name": cfgbackend.String("second"), + "type": cfgbackend.String("an array item"), }, - Map{ - "name": String("third"), - "type": String("and yet another array item"), + cfgbackend.Map{ + "name": cfgbackend.String("third"), + "type": cfgbackend.String("and yet another array item"), }, } - recursivePutString = String("this is a bit underwhelming compared to the other two...") + recursivePutString = cfgbackend.String("this is a bit underwhelming compared to the other two...") ) It("should return no error when creating an instance", func() { @@ -210,11 +210,11 @@ var _ = Describe("Source", func() { Describe("when interacting with an instance", func() { Context("with Consul backend", func() { BeforeEach(func() { - c, err = NewSource("consul://dummy") + c, err = cfgbackend.NewSource("consul://dummy") }) It("should be of type *ConsulSource", func() { - _, ok := c.(*ConsulSource) + _, ok := c.(*cfgbackend.ConsulSource) Expect(ok).To(Equal(true)) }) @@ -223,11 +223,11 @@ var _ = Describe("Source", func() { Context("with YAML file backend", func() { BeforeEach(func() { - c, err = NewSource("file://" + *tmpDir + "/" + configFile) + c, err = cfgbackend.NewSource("file://" + *tmpDir + "/" + configFile) }) It("should be of type *YamlSource", func() { - _, ok := c.(*YamlSource) + _, ok := c.(*cfgbackend.YamlSource) Expect(ok).To(Equal(true)) }) diff --git a/configuration/yamlsource.go b/configuration/cfgbackend/yamlsource.go similarity index 99% rename from configuration/yamlsource.go rename to configuration/cfgbackend/yamlsource.go index ce5918755..25cf93630 100644 --- a/configuration/yamlsource.go +++ b/configuration/cfgbackend/yamlsource.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package configuration +package cfgbackend import ( "errors" @@ -399,7 +399,7 @@ func (yc *YamlSource) PutRecursive(key string, value Item) (err error) { func (yc *YamlSource) PutRecursiveYaml(key string, value []byte) (err error) { var ( - raw interface{} + raw interface{} cooked Item ) err = yaml.Unmarshal(value, &raw) diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index 9606ddcdd..41b2ef043 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -27,10 +27,11 @@ package componentcfg import ( "errors" - "regexp" "strconv" "strings" "time" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" ) const ( @@ -42,84 +43,6 @@ const( SEPARATOR_RUNE = '/' ) -var ( - // component /RUNTYPE /rolename /entry @timestamp - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) -) - -type Path struct { - Component string - Flavor string - Rolename string - EntryKey string - Timestamp string -} - -func NewPath(path string) (p *Path, err error) { - p = &Path{ - Component: "", - Flavor: "", - Rolename: "", - EntryKey: "", - Timestamp: "", - } - if IsInputCompEntryTsValid(path) { - if strings.Contains(path, "@") { - // coconut conf show component/FLAVOR/rolename/entry@timestamp - arg := strings.Replace(path, "@", SEPARATOR, 1) - params := strings.Split(arg, SEPARATOR) - p.Component = params[0] - p.Flavor = params[1] - p.Rolename = params[2] - p.EntryKey = params[3] - p.Timestamp = params[4] - } else if strings.Contains(path, SEPARATOR) { - // coconut conf show component/FLAVOR/rolename/entry - params := strings.Split(path, SEPARATOR) - p.Component = params[0] - p.Flavor = params[1] - p.Rolename = params[2] - p.EntryKey = params[3] - // and if we received a raw path (with / instead of @ before timestamp): - if len(params) > 4 && len(params[4]) > 0 { - p.Timestamp = params[4] - } - } - } else { - err = errors.New("bad component configuration key format") - return - } - - return p, nil -} - -func (p *Path) Path() string { - path := p.WithoutTimestamp() - if len(p.Timestamp) > 0 { - return path + "@" + p.Timestamp - } - return path -} - -func (p *Path) Raw() string { - path := p.WithoutTimestamp() - if len(p.Timestamp) > 0 { - return path + SEPARATOR + p.Timestamp - } - return path -} - -func (p *Path) WithoutTimestamp() string { - return p.Component + SEPARATOR + p.Flavor + SEPARATOR + p.Rolename + SEPARATOR + p.EntryKey -} - -func (p *Path) AbsoluteRaw() string { - return ConfigComponentsPath + p.Raw() -} - -func (p *Path) AbsoluteWithoutTimestamp() string { - return ConfigComponentsPath + p.WithoutTimestamp() -} func IsInputCompEntryTsValid(input string) bool { return inputFullRegex.MatchString(input) @@ -142,7 +65,7 @@ func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ // Method to return the latest timestamp for a specified component & entry // If no keys were passed an error and code exit 3 will be returned -func GetLatestTimestamp(keys []string, p *Path)(timestamp string, err error) { +func GetLatestTimestamp(keys []string, p *Query)(timestamp string, err error) { keyPrefix := p.AbsoluteWithoutTimestamp() if len(keys) == 0 { err = errors.New("no keys found") @@ -175,13 +98,17 @@ func GetComponentsMapFromKeysList(keys []string) map[string]bool { return componentsMap } -func GetEntriesMapOfComponentFromKeysList(component string, runtype string, rolename string, keys []string) map[string]bool { +func GetEntriesMapOfComponentFromKeysList(component string, runtype apricotpb.RunType, rolename string, keys []string) map[string]bool { var entriesMap = make(map[string]bool) + runtypeString, ok := apricotpb.RunType_name[int32(runtype)] + if !ok { + runtypeString = "ANY" // this should never happen + } for _,value := range keys { value := strings.TrimPrefix(value, ConfigComponentsPath) parts := strings.Split(value, "/" ) if parts[0] == component && - parts[1] == runtype && + parts[1] == runtypeString && parts[2] == rolename { entriesMap[parts[3]] = true } diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go new file mode 100644 index 000000000..becc24557 --- /dev/null +++ b/configuration/componentcfg/query.go @@ -0,0 +1,125 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package componentcfg + +import ( + "errors" + "regexp" + "strings" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" +) + +var ( + // component /RUNTYPE /rolename /entry @timestamp + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + E_BAD_KEY = errors.New("bad component configuration key format") +) + +type Query struct { + Component string + Flavor apricotpb.RunType + Rolename string + EntryKey string + Timestamp string +} + +func NewQuery(path string) (p *Query, err error) { + p = &Query{ + Component: "", + Flavor: apricotpb.RunType_NULL, + Rolename: "", + EntryKey: "", + Timestamp: "", + } + if IsInputCompEntryTsValid(path) { + if strings.Contains(path, "@") { + // coconut conf show component/FLAVOR/rolename/entry@timestamp + arg := strings.Replace(path, "@", SEPARATOR, 1) + params := strings.Split(arg, SEPARATOR) + p.Component = params[0] + // Convert FLAVOR to pb-provided enum + typedFlavor, ok := apricotpb.RunType_value[params[1]] + if !ok { + err = E_BAD_KEY + return + } + p.Flavor = apricotpb.RunType(typedFlavor) + p.Rolename = params[2] + p.EntryKey = params[3] + p.Timestamp = params[4] + } else if strings.Contains(path, SEPARATOR) { + // coconut conf show component/FLAVOR/rolename/entry + params := strings.Split(path, SEPARATOR) + p.Component = params[0] + // Convert FLAVOR to pb-provided enum + typedFlavor, ok := apricotpb.RunType_value[params[1]] + if !ok { + err = E_BAD_KEY + return + } + p.Flavor = apricotpb.RunType(typedFlavor) + p.Rolename = params[2] + p.EntryKey = params[3] + // and if we received a raw path (with / instead of @ before timestamp): + if len(params) > 4 && len(params[4]) > 0 { + p.Timestamp = params[4] + } + } + } else { + err = E_BAD_KEY + return + } + + return p, nil +} + +func (p *Query) Path() string { + path := p.WithoutTimestamp() + if len(p.Timestamp) > 0 { + return path + "@" + p.Timestamp + } + return path +} + +func (p *Query) Raw() string { + path := p.WithoutTimestamp() + if len(p.Timestamp) > 0 { + return path + SEPARATOR + p.Timestamp + } + return path +} + +func (p *Query) WithoutTimestamp() string { + return p.Component + SEPARATOR + apricotpb.RunType_name[int32(p.Flavor)] + SEPARATOR + p.Rolename + SEPARATOR + p.EntryKey +} + +func (p *Query) AbsoluteRaw() string { + return ConfigComponentsPath + p.Raw() +} + +func (p *Query) AbsoluteWithoutTimestamp() string { + return ConfigComponentsPath + p.WithoutTimestamp() +} diff --git a/configuration/instance.go b/configuration/instance.go new file mode 100644 index 000000000..e3bb6bdff --- /dev/null +++ b/configuration/instance.go @@ -0,0 +1,56 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package configuration + +import ( + "sync" + + "github.com/spf13/viper" +) + +var ( + once sync.Once + instance *Service +) + +func Instance() *Service { + once.Do(func() { + var( + err error + configUri string + ) + if viper.IsSet("config_endpoint") { //coconut + configUri = viper.GetString("config_endpoint") + } else { + configUri = viper.GetString("globalConfigurationUri") + } + instance, err = newService(configUri) + if err != nil { + log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") + } + }) + return instance +} + diff --git a/configuration/repos/repo.go b/configuration/repos/repo.go index cbb5d2bf3..badee0532 100644 --- a/configuration/repos/repo.go +++ b/configuration/repos/repo.go @@ -29,11 +29,10 @@ import ( "io/ioutil" "strings" + "github.com/AliceO2Group/Control/configuration" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" - - "github.com/AliceO2Group/Control/configuration/confsys" ) type Repo struct { @@ -80,7 +79,7 @@ func (r *Repo) GetIdentifier() string { } func (r *Repo) getCloneDir() string { - cloneDir := confsys.Instance().GetReposPath() + cloneDir := configuration.Instance().GetReposPath() if cloneDir[len(cloneDir)-1:] != "/" { cloneDir += "/" } @@ -91,7 +90,7 @@ func (r *Repo) getCloneDir() string { } func (r *Repo) getCloneParentDirs() []string { - cleanDir := confsys.Instance().GetReposPath() + cleanDir := configuration.Instance().GetReposPath() if cleanDir[len(cleanDir)-1:] != "/" { cleanDir += "/" } diff --git a/configuration/repos/repomanager.go b/configuration/repos/repomanager.go index d2e8559f5..5dbc2d3cf 100644 --- a/configuration/repos/repomanager.go +++ b/configuration/repos/repomanager.go @@ -35,7 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/configuration/confsys" + "github.com/AliceO2Group/Control/configuration" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" @@ -56,7 +56,7 @@ var ( instance *RepoManager ) -func Instance(service *confsys.Service) *RepoManager { +func Instance(service *configuration.Service) *RepoManager { once.Do(func() { instance = initializeRepos(service) }) @@ -69,10 +69,10 @@ type RepoManager struct { defaultRevision string defaultRevisions map[string]string mutex sync.Mutex - cService *confsys.Service + cService *configuration.Service } -func initializeRepos(service *confsys.Service) *RepoManager { +func initializeRepos(service *configuration.Service) *RepoManager { rm := RepoManager{repoList: map[string]*Repo{}} rm.cService = service diff --git a/configuration/confsys/service.go b/configuration/service.go similarity index 72% rename from configuration/confsys/service.go rename to configuration/service.go index a37f9d95d..e652dae9b 100644 --- a/configuration/confsys/service.go +++ b/configuration/service.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019 CERN and copyright holders of ALICE O². + * Copyright 2019-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package confsys +package configuration import ( "encoding/json" @@ -33,10 +33,9 @@ import ( "path/filepath" "strconv" "strings" - "sync" "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" "github.com/flosch/pongo2/v4" @@ -46,34 +45,8 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") -var ( - once sync.Once - instance *Service -) - -func Instance() *Service { - once.Do(func() { - var( - err error - configUri string - ) - if viper.IsSet("config_endpoint") { //coconut - configUri = viper.GetString("config_endpoint") - } else { - configUri = viper.GetString("globalConfigurationUri") - } - instance, err = newService(configUri) - if err != nil { - log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") - } - }) - return instance -} - - - type Service struct { - src configuration.Source + src cfgbackend.Source } /* Expected structure: @@ -105,14 +78,14 @@ func formatKey(key string) (consulKey string) { } func newService(uri string) (svc *Service, err error) { - var src configuration.Source - src, err = configuration.NewSource(uri) + var src cfgbackend.Source + src, err = cfgbackend.NewSource(uri) return &Service{src: src}, err } func (s *Service) NewDefaultRepo(defaultRepo string) error { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.GetConsulPath(),"default_repo"), defaultRepo) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_repo"), defaultRepo) } else { data := []byte(defaultRepo) return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) @@ -120,8 +93,8 @@ func (s *Service) NewDefaultRepo(defaultRepo string) error { } func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.GetConsulPath(),"default_repo")) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_repo")) } else { var defaultRepoData []byte defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) @@ -134,8 +107,8 @@ func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { } func (s *Service) NewDefaultRevision(defaultRevision string) error { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.GetConsulPath(),"default_revision"), defaultRevision) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_revision"), defaultRevision) } else { data := []byte(defaultRevision) return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) @@ -143,8 +116,8 @@ func (s *Service) NewDefaultRevision(defaultRevision string) error { } func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.GetConsulPath(),"default_revision")) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_revision")) } else { var defaultRevisionData []byte defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) @@ -158,8 +131,8 @@ func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { var defaultRevisions map[string]string - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - data, err := cSrc.Get(filepath.Join(s.GetConsulPath(),"default_revisions")) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + data, err := cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_revisions")) if err != nil { return nil, err } @@ -183,8 +156,8 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er return err } - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - err = cSrc.Put(filepath.Join(s.GetConsulPath(),"default_revisions"), string(data)) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + err = cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_revisions"), string(data)) } else { err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) } @@ -192,8 +165,8 @@ func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) er } func (s *Service) NewRunNumber() (runNumber uint32, err error) { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.GetNextUInt32(filepath.Join(s.GetConsulPath(),"run_number")) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.GetNextUInt32(filepath.Join(s.getConsulRuntimePrefix(),"run_number")) } else { // Unsafe check-and-set, only for file backend var rnf string @@ -222,15 +195,11 @@ func (s *Service) NewRunNumber() (runNumber uint32, err error) { } } -func (s *Service) GetROSource() configuration.ROSource { - return s.src -} - // maybe this one shouldn't exist at all, because vars should get inserted // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right // before pushing TaskInfos func (s *Service) GetDefaults() map[string]string { - smap := s.getStringMap(filepath.Join(s.GetConsulPath(),"defaults")) + smap := s.getStringMap(filepath.Join(s.getConsulRuntimePrefix(),"defaults")) // Fill in some global constants we want to make available everywhere globalConfigurationUri := viper.GetString("globalConfigurationUri") @@ -250,26 +219,7 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetVars() map[string]string { - return s.getStringMap(filepath.Join(s.GetConsulPath(),"vars")) -} - -func (s *Service) getStringMap(path string) map[string]string { - tree, err := s.src.GetRecursive(path) - if err != nil { - return nil - } - if tree.Type() == configuration.IT_Map { - responseMap := tree.Map() - theMap := make(map[string]string, len(responseMap)) - for k, v := range responseMap { - if v.Type() != configuration.IT_Value { - continue - } - theMap[k] = v.Value() - } - return theMap - } - return nil + return s.getStringMap(filepath.Join(s.getConsulRuntimePrefix(),"vars")) } // Or maybe even "RefreshConfig" which will refresh all the things that happen to be runtime-refreshable @@ -285,9 +235,9 @@ func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]stri } // Persist Mesos Framework ID by saving to Consul, or to a local file. -func (s *Service) NewMesosFID(fidValue string) error { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.GetConsulPath(),"mesos_fid"), fidValue) +func (s *Service) SetMesosFID(fidValue string) error { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"mesos_fid"), fidValue) } else { data := []byte(fidValue) return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt"), data, 0644) @@ -296,8 +246,8 @@ func (s *Service) NewMesosFID(fidValue string) error { // Retrieve Mesos Framework ID from Consul, or local file. func (s *Service) GetMesosFID() (fidValue string, err error) { - if cSrc, ok := s.src.(*configuration.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.GetConsulPath(),"mesos_fid")) + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"mesos_fid")) } else { var byteFidValue []byte byteFidValue, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt")) @@ -313,41 +263,41 @@ func (s *Service) GetReposPath() string { return filepath.Join(viper.GetString("coreWorkingDir"), "repos") } -func (s *Service) GetComponentConfiguration(path string) (payload string, err error) { - var p *componentcfg.Path - p, err = componentcfg.NewPath(path) - if err != nil { +func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + if query == nil { return } var timestamp string - if len(p.Timestamp) == 0 { - keyPrefix := p.AbsoluteWithoutTimestamp() + if len(query.Timestamp) == 0 { + keyPrefix := query.AbsoluteWithoutTimestamp() if s.src.IsDir(keyPrefix) { var keys []string keys, err = s.src.GetKeysByPrefix(keyPrefix) if err != nil { return } - timestamp, err = componentcfg.GetLatestTimestamp(keys, p) + timestamp, err = componentcfg.GetLatestTimestamp(keys, query) if err != nil { return } } } - absKey := p.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp + absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { payload, err = s.src.Get(absKey) } else { // falling back to timestampless configuration - absKey = p.AbsoluteWithoutTimestamp() + absKey = query.AbsoluteWithoutTimestamp() payload, err = s.src.Get(absKey) } return } -func (s *Service) GetAndProcessComponentConfiguration(path string, varStack map[string]string) (payload string, err error) { +func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + path := query.Path() + // We need to decompose the requested GetConfig path into prefix and suffix, // with the last / as separator (any timestamp if present stays part of the // suffix). @@ -388,6 +338,21 @@ func (s *Service) GetAndProcessComponentConfiguration(path string, varStack map[ return } -func (s *Service) GetConsulPath() string { - return viper.GetString("consulBasePath") -} \ No newline at end of file +func (s *Service) RawGetRecursive(path string) (string, error) { + cfgDump, err := s.src.GetRecursive(path) + if err != nil { + log.WithError(err).Fatal("cannot retrieve configuration") + return "", err + } + cfgBytes, err := json.MarshalIndent(cfgDump, "", "\t") + if err != nil { + log.WithError(err).Fatal("cannot marshal configuration dump") + return "", err + } + return string(cfgBytes[:]), nil +} + +func (s *Service) getConsulRuntimePrefix() string { + // FIXME: this should not be hardcoded + return "o2/aliecs" +} diff --git a/configuration/serviceutil.go b/configuration/serviceutil.go new file mode 100644 index 000000000..1f6b67896 --- /dev/null +++ b/configuration/serviceutil.go @@ -0,0 +1,46 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019-2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package configuration + +import "github.com/AliceO2Group/Control/configuration/cfgbackend" + +func (s *Service) getStringMap(path string) map[string]string { + tree, err := s.src.GetRecursive(path) + if err != nil { + return nil + } + if tree.Type() == cfgbackend.IT_Map { + responseMap := tree.Map() + theMap := make(map[string]string, len(responseMap)) + for k, v := range responseMap { + if v.Type() != cfgbackend.IT_Value { + continue + } + theMap[k] = v.Value() + } + return theMap + } + return nil +} diff --git a/configuration/template/fields.go b/configuration/template/fields.go index e1c467180..b9cec9536 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/antonmedv/expr" "github.com/antonmedv/expr/vm" "github.com/sirupsen/logrus" @@ -48,8 +49,8 @@ type Sequence map[Stage]Fields type BuildObjectStackFunc func(stage Stage) map[string]interface{} type ComponentConfigurationService interface { - GetComponentConfiguration(path string) (payload string, err error) - GetAndProcessComponentConfiguration(path string, varStack map[string]string) (payload string, err error) + GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) + GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) } func (sf Sequence) Execute(confSvc ComponentConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { diff --git a/configuration/template/loader.go b/configuration/template/loader.go index 3b40ed374..f1bc98d53 100644 --- a/configuration/template/loader.go +++ b/configuration/template/loader.go @@ -28,6 +28,8 @@ import ( "fmt" "io" "strings" + + "github.com/AliceO2Group/Control/configuration/componentcfg" ) // Implements pongo2.TemplateLoader to fetch included templates from Consul paths @@ -58,7 +60,11 @@ func (c *ConsulTemplateLoader) Abs(base, name string) string { } func (c *ConsulTemplateLoader) Get(path string) (io.Reader, error) { - payload, err := c.confSvc.GetComponentConfiguration(path) + query, err := componentcfg.NewQuery(path) + if err != nil { + return strings.NewReader(fmt.Sprintf("{\"error\":\"%s\"}", err.Error())), err + } + payload, err := c.confSvc.GetComponentConfiguration(query) if err != nil { log.WithError(err). WithField("path", path). diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 618ac1c14..b69e25ecf 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/sirupsen/logrus" ) @@ -46,24 +47,33 @@ func MakeConfigAccessFuncs(confSvc ComponentConfigurationService, varStack map[s return ConfigAccessFuncs{ "GetConfigLegacy": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfigLegacy", log.WithPrefix("template")) - payload, err := confSvc.GetComponentConfiguration(path) + query, err := componentcfg.NewQuery(path) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + payload, err := confSvc.GetComponentConfiguration(query) if err != nil { log.WithError(err). - WithField("path", path). + WithField("path", query.Path()). Warn("failed to get component configuration") return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } fields := Fields{WrapPointer(&payload)} - err = fields.Execute(confSvc, path, varStack, nil, make(map[string]texttemplate.Template)) + err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template)) log.Warn(varStack) log.Warn(payload) return payload }, "GetConfig": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) + query, err := componentcfg.NewQuery(path) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } - payload, err := confSvc.GetAndProcessComponentConfiguration(path, varStack) + payload, err := confSvc.GetAndProcessComponentConfiguration(query, varStack) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } diff --git a/configuration/the/singleton.go b/configuration/the/singleton.go index f3460b5e0..000a96868 100644 --- a/configuration/the/singleton.go +++ b/configuration/the/singleton.go @@ -25,12 +25,12 @@ package the import ( - "github.com/AliceO2Group/Control/configuration/confsys" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/repos" ) -func ConfSvc() *confsys.Service { - return confsys.Instance() +func ConfSvc() *configuration.Service { + return configuration.Instance() } func RepoManager() *repos.RepoManager { diff --git a/core/globalstate.go b/core/globalstate.go index 057af6199..2f44ea503 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -28,7 +28,6 @@ package core import ( - "encoding/json" "sync" "github.com/AliceO2Group/Control/common/event" @@ -41,17 +40,11 @@ import ( func newGlobalState(shutdown func()) (*globalState, error) { if viper.GetBool("veryVerbose") { - cfgDump, err := the.ConfSvc().GetROSource().GetRecursive(the.ConfSvc().GetConsulPath()) + dump, err := the.ConfSvc().RawGetRecursive(viper.GetString("consulBasePath")) if err != nil { - log.WithError(err).Fatal("cannot retrieve configuration") return nil, err } - cfgBytes, err := json.MarshalIndent(cfgDump,"", "\t") - if err != nil { - log.WithError(err).Fatal("cannot marshal configuration dump") - return nil, err - } - log.WithField("data", string(cfgBytes)).Trace("configuration dump") + log.WithField("data", dump).Trace("configuration dump") } state := &globalState{ diff --git a/core/task/manager.go b/core/task/manager.go index b017b181f..20fa607a0 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -94,7 +94,7 @@ func NewManager(shutdown func(), store.NewInMemorySingleton(), store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { // Store Mesos Framework ID to configuration. - err = the.ConfSvc().NewMesosFID(v) + err = the.ConfSvc().SetMesosFID(v) if err != nil { log.WithField("error", err).Error("cannot write to configuration") } From 20abc08385f28c01b4d2561cf3e85f46810fd06b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Jan 2021 01:29:43 +0100 Subject: [PATCH 0702/2352] [configuration] Move repos package and "the" singleton to core --- coconut/configuration/configuration.go | 6 ++--- core/environment/environment.go | 2 +- core/environment/transition_startactivity.go | 2 +- core/globalstate.go | 2 +- {configuration => core}/repos/repo.go | 0 {configuration => core}/repos/repomanager.go | 0 core/server.go | 2 +- core/task/manager.go | 28 +++++++++++--------- core/task/task.go | 2 +- {configuration => core}/the/singleton.go | 2 +- core/workflow/aggregatorrole.go | 6 +---- core/workflow/iteratorrange.go | 2 +- core/workflow/iteratorrole.go | 2 +- core/workflow/load.go | 4 +-- core/workflow/role.go | 2 +- core/workflow/taskrole.go | 6 +---- 16 files changed, 32 insertions(+), 36 deletions(-) rename {configuration => core}/repos/repo.go (100%) rename {configuration => core}/repos/repomanager.go (100%) rename {configuration => core}/the/singleton.go (95%) diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 8f577101a..10fdbffe4 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -40,9 +40,9 @@ import ( apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" - "github.com/AliceO2Group/Control/configuration/the" "github.com/briandowns/spinner" "github.com/naoina/toml" "github.com/sirupsen/logrus" @@ -273,7 +273,7 @@ func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. // At this point we know what to query, either fullKeyToQuery // for a raw configuration.ConsulSource query, or a - // componentcfg.Query that can be fed to the.ConfSvc(). + // componentcfg.Query that can be fed to configuration.Instance(). var( cfgPayload string simulate bool @@ -303,7 +303,7 @@ func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. } fmt.Fprintf(o,"%s", query.Path()) - cfgPayload, err = the.ConfSvc().GetAndProcessComponentConfiguration(query, extraVarsMap) + cfgPayload, err = configuration.Instance().GetAndProcessComponentConfiguration(query, extraVarsMap) if err != nil { return err, EC_CONNECTION_ERROR } diff --git a/core/environment/environment.go b/core/environment/environment.go index 30f3f5d2e..df1f2deb3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -38,8 +38,8 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/gobwas/glob" "github.com/looplab/fsm" diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index e3dfd00ea..37dc77c12 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -30,9 +30,9 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" - "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" ) func NewStartActivityTransition(taskman *task.Manager) Transition { diff --git a/core/globalstate.go b/core/globalstate.go index 2f44ea503..61a6c0b61 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -31,10 +31,10 @@ import ( "sync" "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" ) diff --git a/configuration/repos/repo.go b/core/repos/repo.go similarity index 100% rename from configuration/repos/repo.go rename to core/repos/repo.go diff --git a/configuration/repos/repomanager.go b/core/repos/repomanager.go similarity index 100% rename from configuration/repos/repomanager.go rename to core/repos/repomanager.go diff --git a/core/server.go b/core/server.go index 92df66e4c..4e7b07215 100644 --- a/core/server.go +++ b/core/server.go @@ -35,9 +35,9 @@ import ( "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/product" - "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/the" "golang.org/x/net/context" "google.golang.org/grpc" diff --git a/core/task/manager.go b/core/task/manager.go index 20fa607a0..8c9d58a93 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -36,8 +36,8 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/configuration/repos" - "github.com/AliceO2Group/Control/configuration/the" + pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/mesos/mesos-go/api/v1/lib/extras/store" "gopkg.in/yaml.v3" @@ -77,11 +77,13 @@ type Manager struct { tasksFinished int schedulerState *schedulerState + publicEventCh chan<- *pb.Event internalEventCh chan<- event.Event - ackKilledTasks *safeAcks + ackKilledTasks map[string]chan struct{} } func NewManager(shutdown func(), + publicEventCh chan<- *pb.Event, internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need @@ -110,6 +112,7 @@ func NewManager(shutdown func(), taskman = &Manager{ classes: newClasses(), roster: newRoster(), + publicEventCh: publicEventCh, internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) @@ -121,7 +124,7 @@ func NewManager(shutdown func(), taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - taskman.ackKilledTasks = newAcks() + taskman.ackKilledTasks = make(map[string]chan struct{}) schedulerState.setupCli() @@ -494,6 +497,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { if len(strings.TrimSpace(errText)) != 0 { return errors.New(response.Err().Error()) } + // FIXME: improve error handling ↑ return nil @@ -620,7 +624,6 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -634,7 +637,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { log.WithField("taskId", taskId). Warn("attempted status update of task not in roster") - if val, ok := m.ackKilledTasks.getValue(taskId); ok { + if val, ok := m.ackKilledTasks[taskId]; ok { val <- struct{}{} } @@ -656,7 +659,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) } // Kill all tasks outside an environment (all unlocked tasks) @@ -673,6 +675,7 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { + toKill := m.roster.filtered(func(t *Task) bool { if t.IsLocked() { return false @@ -691,15 +694,14 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } for _, id := range toKill.GetTaskIds() { - m.ackKilledTasks.addAckChannel(id) + m.ackKilledTasks[id] = make(chan struct{}) } killed, running, err = m.doKillTasks(toKill) for _, id := range killed.GetTaskIds() { - ack,_ := m.ackKilledTasks.getValue(id) - <- ack - close(ack) - m.ackKilledTasks.deleteKey(id) + <- m.ackKilledTasks[id] + close(m.ackKilledTasks[id]) + delete(m.ackKilledTasks, id) } return } @@ -829,6 +831,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { } case taskop.TaskStateMessage: go m.updateTaskState(tm.taskId, tm.state) + // case event.KillTasks: + // m.killTasks(tm.GetTaskIds()) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) } diff --git a/core/task/task.go b/core/task/task.go index ac7b7f0f0..3eb11d0df 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -46,9 +46,9 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" - "github.com/AliceO2Group/Control/configuration/the" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/the" "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" "github.com/spf13/viper" diff --git a/configuration/the/singleton.go b/core/the/singleton.go similarity index 95% rename from configuration/the/singleton.go rename to core/the/singleton.go index 000a96868..54266f611 100644 --- a/configuration/the/singleton.go +++ b/core/the/singleton.go @@ -26,7 +26,7 @@ package the import ( "github.com/AliceO2Group/Control/configuration" - "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/core/repos" ) func ConfSvc() *configuration.Service { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 8d798502d..4f0033b00 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,10 +29,8 @@ import ( "strings" texttemplate "text/template" - "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/configuration/template" - "github.com/AliceO2Group/Control/configuration/the" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/gobwas/glob" "github.com/sirupsen/logrus" @@ -187,7 +185,6 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Debug("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Debug("status merged") - r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) } @@ -199,7 +196,6 @@ func (r *aggregatorRole) updateState(s task.State) { } log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") r.state.merge(s, r) - r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) } diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index b81e862f0..97208387f 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -30,7 +30,7 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/configuration/template" - "github.com/AliceO2Group/Control/configuration/the" + "github.com/AliceO2Group/Control/core/the" ) type iteratorRange interface { diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 0f411f39f..6e9934b71 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -28,7 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" diff --git a/core/workflow/load.go b/core/workflow/load.go index 9dea88adf..acab68f96 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -31,9 +31,9 @@ import ( "time" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/configuration/repos" - "github.com/AliceO2Group/Control/configuration/the" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/k0kubun/pp" "github.com/spf13/viper" "gopkg.in/yaml.v3" diff --git a/core/workflow/role.go b/core/workflow/role.go index 71adc3860..e55213d58 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -32,7 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/configuration/repos" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 94fb5c5e9..22e7f8205 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -30,10 +30,8 @@ import ( texttemplate "text/template" "time" - "github.com/AliceO2Group/Control/common/event" - "github.com/AliceO2Group/Control/configuration/repos" "github.com/AliceO2Group/Control/configuration/template" - "github.com/AliceO2Group/Control/configuration/the" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/gobwas/glob" ) @@ -178,7 +176,6 @@ func (t *taskRole) updateStatus(s task.Status) { log.WithField("status", s.String()).Error("cannot update status with nil parent") } t.status.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) t.parent.updateStatus(s) } @@ -188,7 +185,6 @@ func (t *taskRole) updateState(s task.State) { } log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") t.state.merge(s, t) - t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) } From a6ce6d2eb34315b93391a2dcdc1d960a207a3208 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Jan 2021 05:22:51 +0100 Subject: [PATCH 0703/2352] [apricot] Initial commit for apricot microservice Executable o2-apricot, identifies as ECS/apricot to InfoLogger the.ConfSvc() now points to apricot.Instance(), which returns an appropriate configuration.Service depending on the URI scheme in any of globalConfigurationUri, config_endpoint, backendUri. consul:// -> a local.Service is started that talks directly to Consul apricot:// -> a remote.RemoteService is started that talks to apricot Thus by default apricot also gains a proxy mode, and AliECS can still operate in direct-to-Consul mode with embedded apricot. This also adds an initial implementation of Get/SetRuntimeEntry, to be used by AliECS components for their own read-write runtime data. o2-apricot correctly handles SIGINT and SIGTERM and reports a graceful termination to InfoLogger. repos.* related stuff was further disentangled from configuration.* via ephemeral repos.RepoService. Get/SetMesosFID discarded, Get/SetRuntimeEntry used instead. --- Makefile | 9 +- apricot/apricot.go | 65 +++ apricot/config.go | 99 ++++ apricot/instance.go | 105 ++++ apricot/local/service.go | 261 ++++++++++ .../local}/serviceutil.go | 2 +- apricot/protos/apricot.pb.go | 478 +++++++++++------- apricot/protos/apricot.proto | 21 +- apricot/{ => remote}/client.go | 47 +- apricot/{ => remote}/server.go | 55 +- apricot/signals.go | 66 +++ .../main.go | 0 .../main.go | 0 .../instance.go => cmd/o2-apricot/main.go | 53 +- coconut/configuration/configuration.go | 4 +- configuration/service.go | 337 +----------- core/config.go | 2 +- core/core.go | 2 +- core/repos/repo.go | 8 +- core/repos/repomanager.go | 30 +- core/repos/reposervice.go | 102 ++++ core/task/manager.go | 7 +- core/the/singleton.go | 5 +- 23 files changed, 1170 insertions(+), 588 deletions(-) create mode 100644 apricot/apricot.go create mode 100644 apricot/config.go create mode 100644 apricot/instance.go create mode 100644 apricot/local/service.go rename {configuration => apricot/local}/serviceutil.go (98%) rename apricot/{ => remote}/client.go (77%) rename apricot/{ => remote}/server.go (81%) create mode 100644 apricot/signals.go rename cmd/{o2control-core => o2-aliecs-core}/main.go (100%) rename cmd/{o2control-executor => o2-aliecs-executor}/main.go (100%) rename configuration/instance.go => cmd/o2-apricot/main.go (55%) create mode 100644 core/repos/reposervice.go diff --git a/Makefile b/Makefile index 46349d20b..5030acc9e 100644 --- a/Makefile +++ b/Makefile @@ -42,13 +42,14 @@ ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto VERBOSE_1 := -v VERBOSE_2 := -v -x -WHAT := o2control-core o2control-executor coconut peanut o2-aliecs-odc-shim walnut -WHAT_o2control-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) -WHAT_o2control-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT := o2-aliecs-core o2-aliecs-executor coconut peanut o2-aliecs-odc-shim walnut o2-apricot +WHAT_o2-aliecs-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_o2-aliecs-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-aliecs-odc-shim_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) +WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) @@ -165,4 +166,4 @@ help: @echo "available make variables:" @echo " V - Build verbosity {0,1,2}." @echo " BUILD_ENV_FLAGS - Environment added to 'go build'." - @echo " WHAT - Command to build. (e.g. WHAT=o2control-core)" + @echo " WHAT - Command to build. (e.g. WHAT=o2-aliecs-core)" diff --git a/apricot/apricot.go b/apricot/apricot.go new file mode 100644 index 000000000..d9c7c5383 --- /dev/null +++ b/apricot/apricot.go @@ -0,0 +1,65 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package apricot + +import ( + "fmt" + "net" + + "github.com/AliceO2Group/Control/apricot/remote" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/product" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +//go:generate protoc --go_out=plugins=grpc:. protos/apricot.proto + +var log = logger.New(logrus.StandardLogger(),"apricot") + +func Run() (err error) { + if viper.GetBool("verbose") { + logrus.SetLevel(logrus.DebugLevel) + } + log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) + + s := remote.NewServer(Instance()) + signals(s) // handle UNIX signals + var lis net.Listener + lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) + if err != nil { + log.WithField("error", err). + WithField("port", viper.GetInt("listenPort")). + Fatal("net.Listener failed to listen") + return + } + + log.WithField("port", viper.GetInt("listenPort")). + Info("service started") + if err = s.Serve(lis); err != nil { + log.WithField("error", err).Fatal("gRPC server failed to serve") + } + return +} diff --git a/apricot/config.go b/apricot/config.go new file mode 100644 index 000000000..60742c3a6 --- /dev/null +++ b/apricot/config.go @@ -0,0 +1,99 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2017-2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package apricot + +import ( + "errors" + "path/filepath" + + "github.com/sirupsen/logrus" + "github.com/spf13/pflag" + "github.com/spf13/viper" + _ "github.com/spf13/viper/remote" + "golang.org/x/sys/unix" +) + +func setDefaults() error { + viper.SetDefault("listenPort", 47101) + viper.SetDefault("backendUri", "consul://127.0.0.1:8500") + viper.SetDefault("runtimeBasePath", "o2/aliecs") + viper.SetDefault("workingDir", "/var/lib/o2/apricot") + viper.SetDefault("verbose", false) + return nil +} + +func setFlags() error { + pflag.Int("listenPort", viper.GetInt("listenPort"), "Port of apricot server") + pflag.String("backendUri", viper.GetString("backendUri"), "URI of the Consul server or YAML configuration file") + pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") + + pflag.Parse() + return viper.BindPFlags(pflag.CommandLine) +} + +func checkWorkingDirRights() error { + err := unix.Access(viper.GetString("workingDir"), unix.W_OK) + if err != nil { + return errors.New("No write access for core working path \"" + viper.GetString("workingDir") + "\": "+ err.Error()) + } + return nil +} + +// Remove trailing '/' +func sanitizeWorkingPath() { + sanitizeWorkingPath := filepath.Clean(viper.GetString("workingDir")) + viper.Set("workingDir", sanitizeWorkingPath) +} + +// Bind environment variables with the prefix APRICOT +// e.g. APRICOT_LISTENPORT +func bindEnvironmentVariables() { + viper.SetEnvPrefix("APRICOT") + viper.AutomaticEnv() +} + + +// NewConfig is the constructor for a new config. +func NewConfig() (err error) { + if err = setDefaults(); err != nil { + return + } + if err = setFlags(); err != nil { + return + } + bindEnvironmentVariables() + sanitizeWorkingPath() + if err = checkWorkingDirRights(); err != nil { + return + } + + if viper.GetBool("verbose") { + logrus.SetLevel(logrus.DebugLevel) + } + // Trigger apricot backend setup + // this must happen after viper is ready + Instance() + return +} diff --git a/apricot/instance.go b/apricot/instance.go new file mode 100644 index 000000000..263c54926 --- /dev/null +++ b/apricot/instance.go @@ -0,0 +1,105 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package apricot + +import ( + "errors" + "fmt" + "net/url" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/AliceO2Group/Control/apricot/local" + "github.com/AliceO2Group/Control/apricot/remote" + "github.com/AliceO2Group/Control/configuration" + "github.com/spf13/viper" +) + +var ( + once sync.Once + instance configuration.Service +) + +func newService(configUri string) (configuration.Service, error) { + parsedUri, err := url.Parse(configUri) + if err != nil { + return nil, err + } + + exe, err := os.Executable() + if err != nil { + return nil, errors.New("cannot find current executable path: " + err.Error()) + } + exeName := filepath.Base(exe) + + switch parsedUri.Scheme { + case "consul": + fallthrough + case "file": + if strings.HasSuffix(exeName, "apricot") { + log.WithField("configUri", configUri). + Debug("new embedded apricot instance") + } else { + log.WithField("configUri", configUri). + Info("new embedded apricot instance") + } + return local.NewService(configUri) + case "apricot": + if strings.HasSuffix(exeName, "apricot") { + log.WithField("configUri", configUri). + Warn("apricot proxy mode") + } else { + log.WithField("configUri", configUri). + Info("new apricot client") + } + return remote.NewService(configUri) + default: + return nil, fmt.Errorf("invalid configuration URI scheme %s", parsedUri.Scheme) + } +} + +func Instance() configuration.Service { + once.Do(func() { + var( + err error + configUri string + ) + if viper.IsSet("config_endpoint") { //coconut + configUri = viper.GetString("config_endpoint") + } else if viper.IsSet("globalConfigurationUri"){ //core + configUri = viper.GetString("globalConfigurationUri") + } else { //apricot + configUri = viper.GetString("backendUri") + } + instance, err = newService(configUri) + if err != nil { + log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") + } + }) + return instance +} + diff --git a/apricot/local/service.go b/apricot/local/service.go new file mode 100644 index 000000000..7daaa0a2a --- /dev/null +++ b/apricot/local/service.go @@ -0,0 +1,261 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019-2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package local + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/url" + "os" + "path/filepath" + "strconv" + "strings" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/configuration/cfgbackend" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/flosch/pongo2/v4" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var log = logger.New(logrus.StandardLogger(), "confsys") + +type Service struct { + src cfgbackend.Source +} + +func NewService(uri string) (svc *Service, err error) { + var src cfgbackend.Source + src, err = cfgbackend.NewSource(uri) + return &Service{ + src: src, + }, err +} + +func (s *Service) NewRunNumber() (runNumber uint32, err error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.GetNextUInt32(filepath.Join(getConsulRuntimePrefix(),"run_number")) + } else { + // Unsafe check-and-set, only for file backend + var rnf string + rnf = filepath.Join(viper.GetString("coreWorkingDir"), "runcounter.txt") + if _, err = os.Stat(rnf); os.IsNotExist(err) { + err = ioutil.WriteFile(rnf, []byte("0"), 0644) + if err != nil { + return + } + } + var raw []byte + raw, err = ioutil.ReadFile(rnf) + if err != nil { + return + } + var rn64 uint64 + rn64, err = strconv.ParseUint(string(raw[:]), 10, 32) + if err != nil { + return + } + runNumber = uint32(rn64) + runNumber++ + raw = []byte(strconv.FormatUint(uint64(runNumber), 10)) + err = ioutil.WriteFile(rnf, raw, 0) + return + } +} + +// maybe this one shouldn't exist at all, because vars should get inserted +// response: but not all of them! some vars will likely only get parsed at deployment time i.e. right +// before pushing TaskInfos +func (s *Service) GetDefaults() map[string]string { + smap := s.getStringMap(filepath.Join(getConsulRuntimePrefix(),"defaults")) + + // Fill in some global constants we want to make available everywhere + globalConfigurationUri := viper.GetString("globalConfigurationUri") + smap["consul_base_uri"] = globalConfigurationUri + consulUrl, err := url.ParseRequestURI(globalConfigurationUri) + if err == nil { + smap["consul_hostname"] = consulUrl.Hostname() + smap["consul_port"] = consulUrl.Port() + smap["consul_endpoint"] = consulUrl.Host + } else { + log.WithField("globalConfigurationUri", globalConfigurationUri). + Warn("cannot parse global configuration endpoint") + } + smap["framework_id"], _ = s.GetRuntimeEntry("aliecs", "mesos_fid") + smap["core_hostname"], _ = os.Hostname() + return smap +} + +func (s *Service) GetVars() map[string]string { + return s.getStringMap(filepath.Join(getConsulRuntimePrefix(),"vars")) +} + +// Returns a YAML file OR even a structure made of Roles or Nodes with: +// import() functions already computed and resolved +// vars inserted +func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]string /*vars from cli/gui*/) string { + panic("not implemented yet") +} + +// TODO: remove these, replaced by 2 calls to Get/SetRuntimeEntry in task/manager.go +// +//// Persist Mesos Framework ID by saving to Consul, or to a local file. +//func (s *Service) SetMesosFID(fidValue string) error { +// if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { +// return cSrc.Put(filepath.Join(getConsulRuntimePrefix(),"mesos_fid"), fidValue) +// } else { +// data := []byte(fidValue) +// return ioutil.WriteFile(filepath.Join(viper.GetString("workingDir"), "mesos_fid.txt"), data, 0644) +// } +//} +// +//// Retrieve Mesos Framework ID from Consul, or local file. +//func (s *Service) GetMesosFID() (fidValue string, err error) { +// if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { +// return cSrc.Get(filepath.Join(getConsulRuntimePrefix(),"mesos_fid")) +// } else { +// var byteFidValue []byte +// byteFidValue, err = ioutil.ReadFile(filepath.Join(viper.GetString("workingDir"), "mesos_fid.txt")) +// if err != nil { +// return +// } +// fidValue = strings.TrimSuffix(string(byteFidValue), "/n") +// return +// } +//} + +func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + if query == nil { + return + } + + var timestamp string + + if len(query.Timestamp) == 0 { + keyPrefix := query.AbsoluteWithoutTimestamp() + if s.src.IsDir(keyPrefix) { + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, query) + if err != nil { + return + } + } + } + absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp + if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { + payload, err = s.src.Get(absKey) + } else { + // falling back to timestampless configuration + absKey = query.AbsoluteWithoutTimestamp() + payload, err = s.src.Get(absKey) + } + return +} + +func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + path := query.Path() + + // We need to decompose the requested GetConfig path into prefix and suffix, + // with the last / as separator (any timestamp if present stays part of the + // suffix). + // This is done to allow internal references between template snippets + // within the same Consul directory. + indexOfLastSeparator := strings.LastIndex(path, "/") + var basePath string + shortPath := path + if indexOfLastSeparator != -1 { + basePath = path[:indexOfLastSeparator] + shortPath = path[indexOfLastSeparator+1:] + } + + // We declare a TemplateSet, with a custom TemplateLoader. + // Our ConsulTemplateLoader takes control of the FromFile code path + // in pongo2, effectively adding support for Consul as file-like + // backend. + tplSet := pongo2.NewSet("", template.NewConsulTemplateLoader(s, basePath)) + var tpl *pongo2.Template + tpl, err = tplSet.FromFile(shortPath) + + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()), err + } + + bindings := make(map[string]interface{}) + for k, v := range varStack { + bindings[k] = v + } + + // Add custom functions to bindings: + funcMap := template.MakeStrOperationFuncMap() + for k, v := range funcMap { + bindings[k] = v + } + + payload, err = tpl.Execute(bindings) + return +} + +func (s *Service) RawGetRecursive(path string) (string, error) { + cfgDump, err := s.src.GetRecursive(path) + if err != nil { + log.WithError(err).Fatal("cannot retrieve configuration") + return "", err + } + cfgBytes, err := json.MarshalIndent(cfgDump, "", "\t") + if err != nil { + log.WithError(err).Fatal("cannot marshal configuration dump") + return "", err + } + return string(cfgBytes[:]), nil +} + +func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Get(filepath.Join(getConsulRuntimePrefix(), component, key)) + } else { + return "", errors.New("runtime KV not supported with file backend") + } +} + +func (s *Service) SetRuntimeEntry(component string, key string, value string) error { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.Put(filepath.Join(getConsulRuntimePrefix(), component, key), value) + } else { + return errors.New("runtime KV not supported with file backend") + } +} + +func getConsulRuntimePrefix() string { + // FIXME: this should not be hardcoded + return "o2/aliecs" +} diff --git a/configuration/serviceutil.go b/apricot/local/serviceutil.go similarity index 98% rename from configuration/serviceutil.go rename to apricot/local/serviceutil.go index 1f6b67896..2b50f0540 100644 --- a/configuration/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package configuration +package local import "github.com/AliceO2Group/Control/configuration/cfgbackend" diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 6d0aa8bf9..c5539ce75 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -317,17 +317,16 @@ func (*ComponentRequest_Path) isComponentRequest_QueryPath() {} func (*ComponentRequest_Query) isComponentRequest_QueryPath() {} -type ComponentRuntimeRequest struct { +type ComponentResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` - Entry string `protobuf:"bytes,2,opt,name=entry,proto3" json:"entry,omitempty"` + Payload string `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` } -func (x *ComponentRuntimeRequest) Reset() { - *x = ComponentRuntimeRequest{} +func (x *ComponentResponse) Reset() { + *x = ComponentResponse{} if protoimpl.UnsafeEnabled { mi := &file_protos_apricot_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -335,13 +334,13 @@ func (x *ComponentRuntimeRequest) Reset() { } } -func (x *ComponentRuntimeRequest) String() string { +func (x *ComponentResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ComponentRuntimeRequest) ProtoMessage() {} +func (*ComponentResponse) ProtoMessage() {} -func (x *ComponentRuntimeRequest) ProtoReflect() protoreflect.Message { +func (x *ComponentResponse) ProtoReflect() protoreflect.Message { mi := &file_protos_apricot_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -353,35 +352,28 @@ func (x *ComponentRuntimeRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ComponentRuntimeRequest.ProtoReflect.Descriptor instead. -func (*ComponentRuntimeRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use ComponentResponse.ProtoReflect.Descriptor instead. +func (*ComponentResponse) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{3} } -func (x *ComponentRuntimeRequest) GetComponent() string { - if x != nil { - return x.Component - } - return "" -} - -func (x *ComponentRuntimeRequest) GetEntry() string { +func (x *ComponentResponse) GetPayload() string { if x != nil { - return x.Entry + return x.Payload } return "" } -type ComponentResponse struct { +type RunNumberResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Payload string `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + RunNumber uint32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` } -func (x *ComponentResponse) Reset() { - *x = ComponentResponse{} +func (x *RunNumberResponse) Reset() { + *x = RunNumberResponse{} if protoimpl.UnsafeEnabled { mi := &file_protos_apricot_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -389,13 +381,13 @@ func (x *ComponentResponse) Reset() { } } -func (x *ComponentResponse) String() string { +func (x *RunNumberResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ComponentResponse) ProtoMessage() {} +func (*RunNumberResponse) ProtoMessage() {} -func (x *ComponentResponse) ProtoReflect() protoreflect.Message { +func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { mi := &file_protos_apricot_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -407,28 +399,28 @@ func (x *ComponentResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ComponentResponse.ProtoReflect.Descriptor instead. -func (*ComponentResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. +func (*RunNumberResponse) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{4} } -func (x *ComponentResponse) GetPayload() string { +func (x *RunNumberResponse) GetRunNumber() uint32 { if x != nil { - return x.Payload + return x.RunNumber } - return "" + return 0 } -type RunNumberResponse struct { +type StringMap struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RunNumber uint32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + StringMap map[string]string `protobuf:"bytes,1,rep,name=stringMap,proto3" json:"stringMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (x *RunNumberResponse) Reset() { - *x = RunNumberResponse{} +func (x *StringMap) Reset() { + *x = StringMap{} if protoimpl.UnsafeEnabled { mi := &file_protos_apricot_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -436,13 +428,13 @@ func (x *RunNumberResponse) Reset() { } } -func (x *RunNumberResponse) String() string { +func (x *StringMap) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RunNumberResponse) ProtoMessage() {} +func (*StringMap) ProtoMessage() {} -func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { +func (x *StringMap) ProtoReflect() protoreflect.Message { mi := &file_protos_apricot_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -454,28 +446,28 @@ func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. -func (*RunNumberResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use StringMap.ProtoReflect.Descriptor instead. +func (*StringMap) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{5} } -func (x *RunNumberResponse) GetRunNumber() uint32 { +func (x *StringMap) GetStringMap() map[string]string { if x != nil { - return x.RunNumber + return x.StringMap } - return 0 + return nil } -type StringMap struct { +type RawGetRecursiveRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StringMap map[string]string `protobuf:"bytes,1,rep,name=stringMap,proto3" json:"stringMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + RawPath string `protobuf:"bytes,1,opt,name=rawPath,proto3" json:"rawPath,omitempty"` } -func (x *StringMap) Reset() { - *x = StringMap{} +func (x *RawGetRecursiveRequest) Reset() { + *x = RawGetRecursiveRequest{} if protoimpl.UnsafeEnabled { mi := &file_protos_apricot_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -483,13 +475,13 @@ func (x *StringMap) Reset() { } } -func (x *StringMap) String() string { +func (x *RawGetRecursiveRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StringMap) ProtoMessage() {} +func (*RawGetRecursiveRequest) ProtoMessage() {} -func (x *StringMap) ProtoReflect() protoreflect.Message { +func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { mi := &file_protos_apricot_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -501,28 +493,29 @@ func (x *StringMap) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StringMap.ProtoReflect.Descriptor instead. -func (*StringMap) Descriptor() ([]byte, []int) { +// Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. +func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{6} } -func (x *StringMap) GetStringMap() map[string]string { +func (x *RawGetRecursiveRequest) GetRawPath() string { if x != nil { - return x.StringMap + return x.RawPath } - return nil + return "" } -type RawGetRecursiveRequest struct { +type GetRuntimeEntryRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RawPath string `protobuf:"bytes,1,opt,name=rawPath,proto3" json:"rawPath,omitempty"` + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` } -func (x *RawGetRecursiveRequest) Reset() { - *x = RawGetRecursiveRequest{} +func (x *GetRuntimeEntryRequest) Reset() { + *x = GetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { mi := &file_protos_apricot_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -530,13 +523,13 @@ func (x *RawGetRecursiveRequest) Reset() { } } -func (x *RawGetRecursiveRequest) String() string { +func (x *GetRuntimeEntryRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*RawGetRecursiveRequest) ProtoMessage() {} +func (*GetRuntimeEntryRequest) ProtoMessage() {} -func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { +func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { mi := &file_protos_apricot_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -548,14 +541,84 @@ func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. -func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetRuntimeEntryRequest.ProtoReflect.Descriptor instead. +func (*GetRuntimeEntryRequest) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{7} } -func (x *RawGetRecursiveRequest) GetRawPath() string { +func (x *GetRuntimeEntryRequest) GetComponent() string { if x != nil { - return x.RawPath + return x.Component + } + return "" +} + +func (x *GetRuntimeEntryRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +type SetRuntimeEntryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` + Key string `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` +} + +func (x *SetRuntimeEntryRequest) Reset() { + *x = SetRuntimeEntryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetRuntimeEntryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetRuntimeEntryRequest) ProtoMessage() {} + +func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetRuntimeEntryRequest.ProtoReflect.Descriptor instead. +func (*SetRuntimeEntryRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{8} +} + +func (x *SetRuntimeEntryRequest) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + +func (x *SetRuntimeEntryRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *SetRuntimeEntryRequest) GetValue() string { + if x != nil { + return x.Value } return "" } @@ -594,64 +657,74 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x4d, 0x0a, 0x17, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, - 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, - 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, - 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, - 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, - 0x74, 0x68, 0x2a, 0x38, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x32, 0xac, 0x03, 0x0a, - 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x55, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, + 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, + 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x38, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, + 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x32, 0xed, 0x03, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, + 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -667,39 +740,42 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_protos_apricot_proto_goTypes = []interface{}{ - (RunType)(0), // 0: apricot.RunType - (*Empty)(nil), // 1: apricot.Empty - (*ComponentQuery)(nil), // 2: apricot.ComponentQuery - (*ComponentRequest)(nil), // 3: apricot.ComponentRequest - (*ComponentRuntimeRequest)(nil), // 4: apricot.ComponentRuntimeRequest - (*ComponentResponse)(nil), // 5: apricot.ComponentResponse - (*RunNumberResponse)(nil), // 6: apricot.RunNumberResponse - (*StringMap)(nil), // 7: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 8: apricot.RawGetRecursiveRequest - nil, // 9: apricot.ComponentRequest.VarStackEntry - nil, // 10: apricot.StringMap.StringMapEntry + (RunType)(0), // 0: apricot.RunType + (*Empty)(nil), // 1: apricot.Empty + (*ComponentQuery)(nil), // 2: apricot.ComponentQuery + (*ComponentRequest)(nil), // 3: apricot.ComponentRequest + (*ComponentResponse)(nil), // 4: apricot.ComponentResponse + (*RunNumberResponse)(nil), // 5: apricot.RunNumberResponse + (*StringMap)(nil), // 6: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 7: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 8: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 9: apricot.SetRuntimeEntryRequest + nil, // 10: apricot.ComponentRequest.VarStackEntry + nil, // 11: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 9, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 10, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 10, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 11, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 1, // 4: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 5: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 6: apricot.Apricot.GetVars:input_type -> apricot.Empty 3, // 7: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 4, // 8: apricot.Apricot.GetComponentRuntime:input_type -> apricot.ComponentRuntimeRequest - 8, // 9: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 6, // 10: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 7, // 11: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 7, // 12: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 5, // 13: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 14: apricot.Apricot.GetComponentRuntime:output_type -> apricot.ComponentResponse - 5, // 15: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 10, // [10:16] is the sub-list for method output_type - 4, // [4:10] is the sub-list for method input_type + 7, // 8: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 8, // 9: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 9, // 10: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 5, // 11: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 6, // 12: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 6, // 13: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 14: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 4, // 15: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 4, // 16: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 17: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 11, // [11:18] is the sub-list for method output_type + 4, // [4:11] is the sub-list for method input_type 4, // [4:4] is the sub-list for extension type_name 4, // [4:4] is the sub-list for extension extendee 0, // [0:4] is the sub-list for field type_name @@ -748,7 +824,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentRuntimeRequest); i { + switch v := v.(*ComponentResponse); i { case 0: return &v.state case 1: @@ -760,7 +836,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentResponse); i { + switch v := v.(*RunNumberResponse); i { case 0: return &v.state case 1: @@ -772,7 +848,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunNumberResponse); i { + switch v := v.(*StringMap); i { case 0: return &v.state case 1: @@ -784,7 +860,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringMap); i { + switch v := v.(*RawGetRecursiveRequest); i { case 0: return &v.state case 1: @@ -796,7 +872,19 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawGetRecursiveRequest); i { + switch v := v.(*GetRuntimeEntryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -818,7 +906,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 10, + NumMessages: 11, NumExtensions: 0, NumServices: 1, }, @@ -849,8 +937,9 @@ type ApricotClient interface { GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) - GetComponentRuntime(ctx context.Context, in *ComponentRuntimeRequest, opts ...grpc.CallOption) (*ComponentResponse, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) } type apricotClient struct { @@ -897,18 +986,27 @@ func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *Compo return out, nil } -func (c *apricotClient) GetComponentRuntime(ctx context.Context, in *ComponentRuntimeRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { +func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentRuntime", in, out, opts...) + err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { +func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/apricot.Apricot/SetRuntimeEntry", in, out, opts...) if err != nil { return nil, err } @@ -921,8 +1019,9 @@ type ApricotServer interface { GetDefaults(context.Context, *Empty) (*StringMap, error) GetVars(context.Context, *Empty) (*StringMap, error) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) - GetComponentRuntime(context.Context, *ComponentRuntimeRequest) (*ComponentResponse, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) + GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) + SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) } // UnimplementedApricotServer can be embedded to have forward compatible implementations. @@ -941,12 +1040,15 @@ func (*UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, func (*UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") } -func (*UnimplementedApricotServer) GetComponentRuntime(context.Context, *ComponentRuntimeRequest) (*ComponentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetComponentRuntime not implemented") -} func (*UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") } +func (*UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") +} +func (*UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") +} func RegisterApricotServer(s *grpc.Server, srv ApricotServer) { s.RegisterService(&_Apricot_serviceDesc, srv) @@ -1024,38 +1126,56 @@ func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } -func _Apricot_GetComponentRuntime_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ComponentRuntimeRequest) +func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RawGetRecursiveRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ApricotServer).GetComponentRuntime(ctx, in) + return srv.(ApricotServer).RawGetRecursive(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetComponentRuntime", + FullMethod: "/apricot.Apricot/RawGetRecursive", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetComponentRuntime(ctx, req.(*ComponentRuntimeRequest)) + return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) } return interceptor(ctx, in, info, handler) } -func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RawGetRecursiveRequest) +func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRuntimeEntryRequest) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(ApricotServer).RawGetRecursive(ctx, in) + return srv.(ApricotServer).GetRuntimeEntry(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/RawGetRecursive", + FullMethod: "/apricot.Apricot/GetRuntimeEntry", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) + return srv.(ApricotServer).GetRuntimeEntry(ctx, req.(*GetRuntimeEntryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRuntimeEntryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).SetRuntimeEntry(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/SetRuntimeEntry", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).SetRuntimeEntry(ctx, req.(*SetRuntimeEntryRequest)) } return interceptor(ctx, in, info, handler) } @@ -1080,14 +1200,18 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "GetComponentConfiguration", Handler: _Apricot_GetComponentConfiguration_Handler, }, - { - MethodName: "GetComponentRuntime", - Handler: _Apricot_GetComponentRuntime_Handler, - }, { MethodName: "RawGetRecursive", Handler: _Apricot_RawGetRecursive_Handler, }, + { + MethodName: "GetRuntimeEntry", + Handler: _Apricot_GetRuntimeEntry_Handler, + }, + { + MethodName: "SetRuntimeEntry", + Handler: _Apricot_SetRuntimeEntry_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/apricot.proto", diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index be07e11c3..c9636afe6 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -33,8 +33,9 @@ service Apricot { rpc GetDefaults(Empty) returns (StringMap) {} rpc GetVars(Empty) returns (StringMap) {} rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} - rpc GetComponentRuntime(ComponentRuntimeRequest) returns (ComponentResponse) {} rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} + rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} + rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} } enum RunType { @@ -63,11 +64,6 @@ message ComponentRequest { map varStack = 4; } -message ComponentRuntimeRequest { - string component = 1; - string entry = 2; -} - message ComponentResponse { string payload = 1; } @@ -82,4 +78,15 @@ message StringMap { message RawGetRecursiveRequest { string rawPath = 1; -} \ No newline at end of file +} + +message GetRuntimeEntryRequest { + string component = 1; + string key = 2; +} + +message SetRuntimeEntryRequest { + string component = 1; + string key = 2; + string value = 3; +} diff --git a/apricot/client.go b/apricot/remote/client.go similarity index 77% rename from apricot/client.go rename to apricot/remote/client.go index 9b1488768..c57bf226b 100644 --- a/apricot/client.go +++ b/apricot/remote/client.go @@ -22,14 +22,17 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package apricot +package remote import ( "context" + "errors" "fmt" + "net/url" "time" apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" "google.golang.org/grpc" ) @@ -40,14 +43,26 @@ type RemoteService struct { remote rpcClient } -func NewClientService(endpoint string) (svc Service, err error) { +func NewService(configUri string) (svc configuration.Service, err error) { + var parsedUri *url.URL + parsedUri, err = url.Parse(configUri) + if err != nil { + return nil, err + } + if parsedUri.Scheme != "apricot" { + return nil, errors.New("remote configuration URI scheme must be apricot://") + } + endpoint := parsedUri.Host + cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) rpcClient := newRpcClient(cxt, cancel, endpoint) if rpcClient == nil { return nil, fmt.Errorf("cannot dial apricot service at %s", endpoint) } - return &RemoteService{remote: *rpcClient}, nil + return &RemoteService{ + remote: *rpcClient, + }, nil } func (c *RemoteService) NewRunNumber() (runNumber uint32, err error) { @@ -114,6 +129,32 @@ func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) return response.GetPayload(), nil } +func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { + var response *apricotpb.ComponentResponse + request := &apricotpb.GetRuntimeEntryRequest{ + Component: component, + Key: key, + } + response, err = c.remote.GetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +func (c *RemoteService) SetRuntimeEntry(component string, key string, value string) (err error) { + request := &apricotpb.SetRuntimeEntryRequest{ + Component: component, + Key: key, + Value: value, + } + _, err = c.remote.SetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return err + } + return nil +} + type rpcClient struct { apricotpb.ApricotClient conn *grpc.ClientConn diff --git a/apricot/server.go b/apricot/remote/server.go similarity index 81% rename from apricot/server.go rename to apricot/remote/server.go index f09204687..2a6ea9736 100644 --- a/apricot/server.go +++ b/apricot/remote/server.go @@ -23,7 +23,7 @@ */ // A Processor and ReposItory for COnfiguration Templates -package apricot +package remote import ( "context" @@ -31,6 +31,7 @@ import ( apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -40,9 +41,6 @@ import ( "google.golang.org/grpc/status" ) -//go:generate protoc --go_out=plugins=grpc:. protos/apricot.proto - - var log = logger.New(logrus.StandardLogger(),"apricot") var( @@ -51,24 +49,11 @@ var( E_BAD_INPUT = status.Errorf(codes.InvalidArgument, "bad request received") ) -type RepoService interface { - -} -type Service interface { - RepoService - NewRunNumber() (runNumber uint32, err error) - GetDefaults() map[string]string - GetVars() map[string]string - GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) - GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) - RawGetRecursive(path string) (string, error) -} - type RpcServer struct { - service Service + service configuration.Service } -func NewServer(service Service) *grpc.Server { +func NewServer(service configuration.Service) *grpc.Server { s := grpc.NewServer() apricotpb.RegisterApricotServer(s, &RpcServer{ service: service, @@ -148,8 +133,36 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() } -func (m *RpcServer) GetComponentRuntime(ctx context.Context, request *apricotpb.ComponentRuntimeRequest) (*apricotpb.ComponentResponse, error) { - panic("implement me") +func (m *RpcServer) GetRuntimeEntry(ctx context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + payload, err := m.service.GetRuntimeEntry(request.Component, request.Key) + if err != nil { + return nil, err + } + return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() +} + +func (m *RpcServer) SetRuntimeEntry(ctx context.Context, request *apricotpb.SetRuntimeEntryRequest) (*apricotpb.Empty, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + err := m.service.SetRuntimeEntry(request.Component, request.Key, request.Value) + if err != nil { + return nil, err + } + return &apricotpb.Empty{}, E_OK.Err() } func (m *RpcServer) RawGetRecursive(ctx context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { diff --git a/apricot/signals.go b/apricot/signals.go new file mode 100644 index 000000000..1f8a0f4e1 --- /dev/null +++ b/apricot/signals.go @@ -0,0 +1,66 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package apricot + +import ( + "os" + "os/signal" + "syscall" + "time" + + "google.golang.org/grpc" +) + +func signals(srv *grpc.Server) { + + // Create channel to receive unix signals + signal_chan := make(chan os.Signal, 1) + + //Register channel to receive SIGINT and SIGTERM signals + signal.Notify(signal_chan, + syscall.SIGINT, + syscall.SIGTERM) + + // Goroutine executes a blocking receive for signals + go func() { + s := <-signal_chan + log.WithField("signal", s.String()). + Debug("received signal") + + srv.Stop() + + // Mesos calls are async.Sleep for 2s to mark tasks as completed. + time.Sleep(2 * time.Second) + log.WithField("signal", s.String()). + Info("service stopped") + + switch s { + case syscall.SIGINT: + os.Exit(130) // 128+2 + case syscall.SIGTERM: + os.Exit(143) // 128+15 + } + }() +} diff --git a/cmd/o2control-core/main.go b/cmd/o2-aliecs-core/main.go similarity index 100% rename from cmd/o2control-core/main.go rename to cmd/o2-aliecs-core/main.go diff --git a/cmd/o2control-executor/main.go b/cmd/o2-aliecs-executor/main.go similarity index 100% rename from cmd/o2control-executor/main.go rename to cmd/o2-aliecs-executor/main.go diff --git a/configuration/instance.go b/cmd/o2-apricot/main.go similarity index 55% rename from configuration/instance.go rename to cmd/o2-apricot/main.go index e3bb6bdff..38d8e5267 100644 --- a/configuration/instance.go +++ b/cmd/o2-apricot/main.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2017-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -22,35 +22,40 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package configuration +package main import ( - "sync" + "os" - "github.com/spf13/viper" + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/logger/infologger" + log "github.com/sirupsen/logrus" + "github.com/teo/logrus-prefixed-formatter" ) -var ( - once sync.Once - instance *Service -) +func init() { + log.SetFormatter(&prefixed.TextFormatter{ + FullTimestamp: true, + SpacePadding: 20, + PrefixPadding: 12, -func Instance() *Service { - once.Do(func() { - var( - err error - configUri string - ) - if viper.IsSet("config_endpoint") { //coconut - configUri = viper.GetString("config_endpoint") - } else { - configUri = viper.GetString("globalConfigurationUri") - } - instance, err = newService(configUri) - if err != nil { - log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") - } + // Needed for colored stdout/stderr in GoLand, IntelliJ, etc. + ForceColors: true, + ForceFormatting: true, }) - return instance + log.SetOutput(os.Stdout) + ilHook, err := infologger.NewDirectHook("ECS", "apricot") + if err == nil { + log.AddHook(ilHook) + } } +func main() { + if err := apricot.NewConfig(); err != nil { + log.Fatal(err) + } + + if err := apricot.Run(); err != nil { + log.Fatal(err) + } +} diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 10fdbffe4..34d4ec375 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -37,10 +37,10 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/apricot" apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/briandowns/spinner" @@ -303,7 +303,7 @@ func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. } fmt.Fprintf(o,"%s", query.Path()) - cfgPayload, err = configuration.Instance().GetAndProcessComponentConfiguration(query, extraVarsMap) + cfgPayload, err = apricot.Instance().GetAndProcessComponentConfiguration(query, extraVarsMap) if err != nil { return err, EC_CONNECTION_ERROR } diff --git a/configuration/service.go b/configuration/service.go index e652dae9b..d874b6a65 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019-2020 CERN and copyright holders of ALICE O². + * Copyright 2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -25,334 +25,21 @@ package configuration import ( - "encoding/json" - "fmt" - "io/ioutil" - "net/url" - "os" - "path/filepath" - "strconv" - "strings" - - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" - "github.com/AliceO2Group/Control/configuration/template" - "github.com/flosch/pongo2/v4" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(), "confsys") - -type Service struct { - src cfgbackend.Source -} - -/* Expected structure: -/o2/aliecs/ -{ - run_number: 47102, - - settings: { - log_level: "DEBUG" - }, - global_vars: { - n_flps: 42 - }, - repositories: { - base: { - url: "https://gitlab.cern.ch/foo/bar", - user: "gituser", - pass: "gitpass" - }, - extra: {...} - } -} - -*/ -func formatKey(key string) (consulKey string) { - // Trim leading slashes - consulKey = strings.TrimLeft(key, componentcfg.SEPARATOR) - return -} - -func newService(uri string) (svc *Service, err error) { - var src cfgbackend.Source - src, err = cfgbackend.NewSource(uri) - return &Service{src: src}, err -} - -func (s *Service) NewDefaultRepo(defaultRepo string) error { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_repo"), defaultRepo) - } else { - data := []byte(defaultRepo) - return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) - } -} - -func (s *Service) GetDefaultRepo() (defaultRepo string, err error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_repo")) - } else { - var defaultRepoData []byte - defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) - if err != nil { - return - } - defaultRepo = strings.TrimSuffix(string(defaultRepoData), "\n") - return - } -} - -func (s *Service) NewDefaultRevision(defaultRevision string) error { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_revision"), defaultRevision) - } else { - data := []byte(defaultRevision) - return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) - } -} - -func (s *Service) GetDefaultRevision() (defaultRevision string, err error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_revision")) - } else { - var defaultRevisionData []byte - defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) - if err != nil { - return - } - defaultRevision = strings.TrimSuffix(string(defaultRevisionData), "\n") - return - } -} - -func (s *Service) GetRepoDefaultRevisions() (map[string]string, error) { - var defaultRevisions map[string]string - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - data, err := cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"default_revisions")) - if err != nil { - return nil, err - } - err = json.Unmarshal([]byte(data), &defaultRevisions) - if err != nil { - return nil, err - } - } else { - defaultRevisionData, err := ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revisions.json")) - if err != nil { - return nil, err - } - err = json.Unmarshal(defaultRevisionData, &defaultRevisions) - } - return defaultRevisions, nil -} - -func (s *Service) SetRepoDefaultRevisions(defaultRevisions map[string]string) error { - data, err := json.MarshalIndent(defaultRevisions, "", " ") - if err != nil { - return err - } - - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - err = cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"default_revisions"), string(data)) - } else { - err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) - } - return err -} - -func (s *Service) NewRunNumber() (runNumber uint32, err error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.GetNextUInt32(filepath.Join(s.getConsulRuntimePrefix(),"run_number")) - } else { - // Unsafe check-and-set, only for file backend - var rnf string - rnf = filepath.Join(viper.GetString("coreWorkingDir"), "runcounter.txt") - if _, err = os.Stat(rnf); os.IsNotExist(err) { - err = ioutil.WriteFile(rnf, []byte("0"), 0644) - if err != nil { - return - } - } - var raw []byte - raw, err = ioutil.ReadFile(rnf) - if err != nil { - return - } - var rn64 uint64 - rn64, err = strconv.ParseUint(string(raw[:]), 10, 32) - if err != nil { - return - } - runNumber = uint32(rn64) - runNumber++ - raw = []byte(strconv.FormatUint(uint64(runNumber), 10)) - err = ioutil.WriteFile(rnf, raw, 0) - return - } -} - -// maybe this one shouldn't exist at all, because vars should get inserted -// response: but not all of them! some vars will likely only get parsed at deployment time i.e. right -// before pushing TaskInfos -func (s *Service) GetDefaults() map[string]string { - smap := s.getStringMap(filepath.Join(s.getConsulRuntimePrefix(),"defaults")) - - // Fill in some global constants we want to make available everywhere - globalConfigurationUri := viper.GetString("globalConfigurationUri") - smap["consul_base_uri"] = globalConfigurationUri - consulUrl, err := url.ParseRequestURI(globalConfigurationUri) - if err == nil { - smap["consul_hostname"] = consulUrl.Hostname() - smap["consul_port"] = consulUrl.Port() - smap["consul_endpoint"] = consulUrl.Host - } else { - log.WithField("globalConfigurationUri", globalConfigurationUri). - Warn("cannot parse global configuration endpoint") - } - smap["framework_id"], _ = s.GetMesosFID() - smap["core_hostname"], _ = os.Hostname() - return smap -} - -func (s *Service) GetVars() map[string]string { - return s.getStringMap(filepath.Join(s.getConsulRuntimePrefix(),"vars")) -} - -// Or maybe even "RefreshConfig" which will refresh all the things that happen to be runtime-refreshable -func (s *Service) RefreshRepositories() { - panic("not implemented yet") -} - -// Returns a YAML file OR even a structure made of Roles or Nodes with: -// import() functions already computed and resolved -// vars inserted -func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]string /*vars from cli/gui*/) string { - panic("not implemented yet") -} - -// Persist Mesos Framework ID by saving to Consul, or to a local file. -func (s *Service) SetMesosFID(fidValue string) error { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Put(filepath.Join(s.getConsulRuntimePrefix(),"mesos_fid"), fidValue) - } else { - data := []byte(fidValue) - return ioutil.WriteFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt"), data, 0644) - } -} - -// Retrieve Mesos Framework ID from Consul, or local file. -func (s *Service) GetMesosFID() (fidValue string, err error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.Get(filepath.Join(s.getConsulRuntimePrefix(),"mesos_fid")) - } else { - var byteFidValue []byte - byteFidValue, err = ioutil.ReadFile(filepath.Join(viper.GetString("coreWorkingDir"), "mesos_fid.txt")) - if err != nil { - return - } - fidValue = strings.TrimSuffix(string(byteFidValue), "/n") - return - } -} - -func (s *Service) GetReposPath() string { - return filepath.Join(viper.GetString("coreWorkingDir"), "repos") +type RuntimeService interface { + GetRuntimeEntry(component string, key string) (string, error) + SetRuntimeEntry(component string, key string, value string) error } -func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { - if query == nil { - return - } - - var timestamp string - - if len(query.Timestamp) == 0 { - keyPrefix := query.AbsoluteWithoutTimestamp() - if s.src.IsDir(keyPrefix) { - var keys []string - keys, err = s.src.GetKeysByPrefix(keyPrefix) - if err != nil { - return - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - return - } - } - } - absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp - if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { - payload, err = s.src.Get(absKey) - } else { - // falling back to timestampless configuration - absKey = query.AbsoluteWithoutTimestamp() - payload, err = s.src.Get(absKey) - } - return -} - -func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { - path := query.Path() - - // We need to decompose the requested GetConfig path into prefix and suffix, - // with the last / as separator (any timestamp if present stays part of the - // suffix). - // This is done to allow internal references between template snippets - // within the same Consul directory. - indexOfLastSeparator := strings.LastIndex(path, "/") - var basePath string - shortPath := path - if indexOfLastSeparator != -1 { - basePath = path[:indexOfLastSeparator] - shortPath = path[indexOfLastSeparator+1:] - } - - // We declare a TemplateSet, with a custom TemplateLoader. - // Our ConsulTemplateLoader takes control of the FromFile code path - // in pongo2, effectively adding support for Consul as file-like - // backend. - tplSet := pongo2.NewSet("", template.NewConsulTemplateLoader(s, basePath)) - var tpl *pongo2.Template - tpl, err = tplSet.FromFile(shortPath) - - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()), err - } - - bindings := make(map[string]interface{}) - for k, v := range varStack { - bindings[k] = v - } - - // Add custom functions to bindings: - funcMap := template.MakeStrOperationFuncMap() - for k, v := range funcMap { - bindings[k] = v - } - - payload, err = tpl.Execute(bindings) - return -} - -func (s *Service) RawGetRecursive(path string) (string, error) { - cfgDump, err := s.src.GetRecursive(path) - if err != nil { - log.WithError(err).Fatal("cannot retrieve configuration") - return "", err - } - cfgBytes, err := json.MarshalIndent(cfgDump, "", "\t") - if err != nil { - log.WithError(err).Fatal("cannot marshal configuration dump") - return "", err - } - return string(cfgBytes[:]), nil -} +type Service interface { + RuntimeService + NewRunNumber() (runNumber uint32, err error) + GetDefaults() map[string]string + GetVars() map[string]string + GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) + GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) -func (s *Service) getConsulRuntimePrefix() string { - // FIXME: this should not be hardcoded - return "o2/aliecs" + RawGetRecursive(path string) (string, error) } diff --git a/core/config.go b/core/config.go index 8153abe9c..2ee98382f 100644 --- a/core/config.go +++ b/core/config.go @@ -44,7 +44,7 @@ import ( func setDefaults() error { exe, err := os.Executable() if err != nil { - return errors.New("Cannot find scheduler executable path: " + err.Error()) + return errors.New("cannot find scheduler executable path: " + err.Error()) } exeDir := filepath.Dir(exe) diff --git a/core/core.go b/core/core.go index 2711305af..105b4bc02 100644 --- a/core/core.go +++ b/core/core.go @@ -50,7 +50,7 @@ func Run() error { if viper.GetBool("veryVerbose") { log.WithField("configuration", viper.AllSettings()).Debug("core starting up") } - log.Infof("%s (%s v%s build %s) starting up", product.PRETTY_FULLNAME, product.PRETTY_SHORTNAME, product.VERSION, product.BUILD) + log.Infof("%s core (%s v%s build %s) starting up", product.PRETTY_FULLNAME, product.PRETTY_SHORTNAME, product.VERSION, product.BUILD) // We create a context and use its cancel func as a shutdown func to release // all resources. The shutdown func is stored in the scheduler.internalState. diff --git a/core/repos/repo.go b/core/repos/repo.go index badee0532..ef6ca750d 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -29,7 +29,7 @@ import ( "io/ioutil" "strings" - "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/apricot" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" @@ -79,7 +79,8 @@ func (r *Repo) GetIdentifier() string { } func (r *Repo) getCloneDir() string { - cloneDir := configuration.Instance().GetReposPath() + rs := &RepoService{Svc: apricot.Instance()} + cloneDir := rs.GetReposPath() if cloneDir[len(cloneDir)-1:] != "/" { cloneDir += "/" } @@ -90,7 +91,8 @@ func (r *Repo) getCloneDir() string { } func (r *Repo) getCloneParentDirs() []string { - cleanDir := configuration.Instance().GetReposPath() + rs := &RepoService{Svc: apricot.Instance()} + cleanDir := rs.GetReposPath() if cleanDir[len(cleanDir)-1:] != "/" { cleanDir += "/" } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 5dbc2d3cf..4812fce20 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -56,7 +56,7 @@ var ( instance *RepoManager ) -func Instance(service *configuration.Service) *RepoManager { +func Instance(service configuration.Service) *RepoManager { once.Do(func() { instance = initializeRepos(service) }) @@ -69,16 +69,18 @@ type RepoManager struct { defaultRevision string defaultRevisions map[string]string mutex sync.Mutex - cService *configuration.Service + cService configuration.Service + rService *RepoService } -func initializeRepos(service *configuration.Service) *RepoManager { +func initializeRepos(service configuration.Service) *RepoManager { rm := RepoManager{repoList: map[string]*Repo{}} rm.cService = service + rm.rService = &RepoService{Svc: service} var err error // Get global default revision - rm.defaultRevision, err = rm.cService.GetDefaultRevision() + rm.defaultRevision, err = rm.rService.GetDefaultRevision() if err != nil || rm.defaultRevision == "" { log.Debug("Failed to parse default_revision from backend") rm.defaultRevision = viper.GetString("globalDefaultRevision") @@ -87,7 +89,7 @@ func initializeRepos(service *configuration.Service) *RepoManager { } // Get default revisions - revsMap, err := rm.cService.GetRepoDefaultRevisions() + revsMap, err := rm.rService.GetRepoDefaultRevisions() if err != nil { log.Debug("Failed to parse default_revisions from backend") rm.defaultRevisions = make(map[string]string) @@ -96,7 +98,7 @@ func initializeRepos(service *configuration.Service) *RepoManager { } // Get default repo - defaultRepo, err := rm.cService.GetDefaultRepo() + defaultRepo, err := rm.rService.GetDefaultRepo() if err != nil || defaultRepo == "" { log.Warning("Failed to parse default_repo from backend") defaultRepo = viper.GetString("defaultRepo") @@ -129,7 +131,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ var usernames []string var someRepos []string - hostingSites, err = filepath.Glob(filepath.Join(manager.cService.GetReposPath(), "*")) + hostingSites, err = filepath.Glob(filepath.Join(manager.rService.GetReposPath(), "*")) if err != nil { return } @@ -146,7 +148,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ } for _, repo := range someRepos { //sanitize path - repoDir := manager.cService.GetReposPath() + repoDir := manager.rService.GetReposPath() utils.EnsureTrailingSlash(&repoDir) repo = strings.TrimPrefix(repo, repoDir) utils.EnsureTrailingSlash(&repo) @@ -267,7 +269,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st // Update default revisions manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision - err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + err = manager.rService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { return "", false, err } @@ -352,7 +354,7 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (string, error) { manager.setDefaultRepo(newDefaultRepo) newDefaultRepoString = newDefaultRepo.GetIdentifier() } else if len(manager.repoList) == 0 { - err := manager.cService.NewDefaultRepo(viper.GetString("defaultRepo")) + err := manager.rService.NewDefaultRepo(viper.GetString("defaultRepo")) if err != nil { log.Warning("Failed to update default_repo backend") } @@ -360,7 +362,7 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (string, error) { // Update default revisions delete(manager.defaultRevisions, repo.GetIdentifier()) - err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + err = manager.rService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { return "", err } @@ -463,7 +465,7 @@ func (manager *RepoManager) setDefaultRepo(repo *Repo) { } // Update default_repo backend - err := manager.cService.NewDefaultRepo(repo.GetIdentifier()) + err := manager.rService.NewDefaultRepo(repo.GetIdentifier()) if err != nil { log.Warning("Failed to update default_repo backend: ", err) } @@ -507,7 +509,7 @@ func (manager *RepoManager) UpdateDefaultRepo(repoPath string) error { //unused func (manager *RepoManager) SetGlobalDefaultRevision(revision string) error { // Update default_revision backend - err := manager.cService.NewDefaultRevision(revision) + err := manager.rService.NewDefaultRevision(revision) if err != nil { log.Warning("Failed to update default_revision backend: ", err) return err @@ -532,7 +534,7 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str // Update default revisions manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision - err = manager.cService.SetRepoDefaultRevisions(manager.defaultRevisions) + err = manager.rService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { return "", err } diff --git a/core/repos/reposervice.go b/core/repos/reposervice.go new file mode 100644 index 000000000..12e5701b7 --- /dev/null +++ b/core/repos/reposervice.go @@ -0,0 +1,102 @@ +package repos + +import ( + "encoding/json" + "io/ioutil" + "path/filepath" + "strings" + + "github.com/AliceO2Group/Control/configuration" + "github.com/spf13/viper" +) + +// TODO: remove support for FILE backend in this one +type RepoService struct { + Svc configuration.RuntimeService +} + +func (s *RepoService) GetReposPath() string { + return filepath.Join(viper.GetString("coreWorkingDir"), "repos") +} + +func (s *RepoService) NewDefaultRepo(defaultRepo string) error { + if s.Svc != nil { + return s.Svc.SetRuntimeEntry("aliecs","default_repo", defaultRepo) + } else { + data := []byte(defaultRepo) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) + } +} + +func (s *RepoService) GetDefaultRepo() (defaultRepo string, err error) { + if s.Svc != nil { + return s.Svc.GetRuntimeEntry("aliecs", "default_repo") + } else { + var defaultRepoData []byte + defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) + if err != nil { + return + } + defaultRepo = strings.TrimSuffix(string(defaultRepoData), "\n") + return + } +} + +func (s *RepoService) NewDefaultRevision(defaultRevision string) error { + if s.Svc != nil { + return s.Svc.SetRuntimeEntry("aliecs","default_revision", defaultRevision) + } else { + data := []byte(defaultRevision) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) + } +} + +func (s *RepoService) GetDefaultRevision() (defaultRevision string, err error) { + if s.Svc != nil { + return s.Svc.GetRuntimeEntry("aliecs","default_revision") + } else { + var defaultRevisionData []byte + defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) + if err != nil { + return + } + defaultRevision = strings.TrimSuffix(string(defaultRevisionData), "\n") + return + } +} + +func (s *RepoService) GetRepoDefaultRevisions() (map[string]string, error) { + var defaultRevisions map[string]string + if s.Svc != nil { + data, err := s.Svc.GetRuntimeEntry("aliecs","default_revisions") + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(data), &defaultRevisions) + if err != nil { + return nil, err + } + } else { + defaultRevisionData, err := ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revisions.json")) + if err != nil { + return nil, err + } + err = json.Unmarshal(defaultRevisionData, &defaultRevisions) + } + return defaultRevisions, nil +} + +func (s *RepoService) SetRepoDefaultRevisions(defaultRevisions map[string]string) error { + data, err := json.MarshalIndent(defaultRevisions, "", " ") + if err != nil { + return err + } + + if s.Svc != nil { + err = s.Svc.SetRuntimeEntry("aliecs","default_revisions", string(data)) + } else { + err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) + } + return err +} + diff --git a/core/task/manager.go b/core/task/manager.go index 8c9d58a93..470ab4680 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -96,7 +96,7 @@ func NewManager(shutdown func(), store.NewInMemorySingleton(), store.DoSet().AndThen(func(_ store.Setter, v string, _ error) error { // Store Mesos Framework ID to configuration. - err = the.ConfSvc().SetMesosFID(v) + err = the.ConfSvc().SetRuntimeEntry("aliecs", "mesos_fid", v) if err != nil { log.WithField("error", err).Error("cannot write to configuration") } @@ -105,7 +105,7 @@ func NewManager(shutdown func(), })) // Set Framework ID from the configuration - if fidValue, err := the.ConfSvc().GetMesosFID(); err == nil { + if fidValue, err := the.ConfSvc().GetRuntimeEntry("aliecs", "mesos_fid"); err == nil { store.SetOrPanic(fidStore)(fidValue) } @@ -185,7 +185,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } - taskTemplatePath := filepath.Join(the.ConfSvc().GetReposPath(), taskClassFile) + rs := &repos.RepoService{Svc: the.ConfSvc()} + taskTemplatePath := filepath.Join(rs.GetReposPath(), taskClassFile) yamlData, err = ioutil.ReadFile(taskTemplatePath) if err != nil { return nil, err diff --git a/core/the/singleton.go b/core/the/singleton.go index 54266f611..cdbad3fad 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -25,12 +25,13 @@ package the import ( + "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/core/repos" ) -func ConfSvc() *configuration.Service { - return configuration.Instance() +func ConfSvc() configuration.Service { + return apricot.Instance() } func RepoManager() *repos.RepoManager { From 09d9e40e69da42ad5881753203ffc7ac10ad2c9a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Jan 2021 17:19:29 +0100 Subject: [PATCH 0704/2352] [apricot] Better component detection via viper in apricot.Instance() --- apricot/config.go | 3 +++ apricot/instance.go | 20 ++++++++------------ coconut/cmd/root.go | 1 + core/config.go | 1 + 4 files changed, 13 insertions(+), 12 deletions(-) diff --git a/apricot/config.go b/apricot/config.go index 60742c3a6..0b60314bf 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -36,6 +36,8 @@ import ( ) func setDefaults() error { + viper.Set("component", "apricot") + viper.SetDefault("listenPort", 47101) viper.SetDefault("backendUri", "consul://127.0.0.1:8500") viper.SetDefault("runtimeBasePath", "o2/aliecs") @@ -92,6 +94,7 @@ func NewConfig() (err error) { if viper.GetBool("verbose") { logrus.SetLevel(logrus.DebugLevel) } + // Trigger apricot backend setup // this must happen after viper is ready Instance() diff --git a/apricot/instance.go b/apricot/instance.go index 263c54926..8520f3ba0 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -25,12 +25,8 @@ package apricot import ( - "errors" "fmt" "net/url" - "os" - "path/filepath" - "strings" "sync" "github.com/AliceO2Group/Control/apricot/local" @@ -50,17 +46,14 @@ func newService(configUri string) (configuration.Service, error) { return nil, err } - exe, err := os.Executable() - if err != nil { - return nil, errors.New("cannot find current executable path: " + err.Error()) - } - exeName := filepath.Base(exe) - switch parsedUri.Scheme { case "consul": fallthrough case "file": - if strings.HasSuffix(exeName, "apricot") { + if viper.GetString("component") == "apricot" { + log.WithField("configUri", configUri). + Debug("new embedded apricot instance") + } else if viper.GetString("component") == "coconut" { log.WithField("configUri", configUri). Debug("new embedded apricot instance") } else { @@ -69,9 +62,12 @@ func newService(configUri string) (configuration.Service, error) { } return local.NewService(configUri) case "apricot": - if strings.HasSuffix(exeName, "apricot") { + if viper.GetString("component") == "apricot" { log.WithField("configUri", configUri). Warn("apricot proxy mode") + } else if viper.GetString("component") == "coconut" { + log.WithField("configUri", configUri). + Debug("new apricot client") } else { log.WithField("configUri", configUri). Info("new apricot client") diff --git a/coconut/cmd/root.go b/coconut/cmd/root.go index 76ad02042..2e853c4a1 100644 --- a/coconut/cmd/root.go +++ b/coconut/cmd/root.go @@ -74,6 +74,7 @@ func init() { cobra.OnInitialize(initConfig) viper.Set("version", product.VERSION) + viper.Set("component", "coconut") // Here you will define your flags and configuration settings. // Cobra supports persistent flags, which, if defined here, diff --git a/core/config.go b/core/config.go index 2ee98382f..671748342 100644 --- a/core/config.go +++ b/core/config.go @@ -48,6 +48,7 @@ func setDefaults() error { } exeDir := filepath.Dir(exe) + viper.Set("component", "core") viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD viper.SetDefault("consulBasePath", "o2/aliecs") From 72d1d2c98014426573111474c4fc7176f87baad2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 11 Jan 2021 16:26:38 +0100 Subject: [PATCH 0705/2352] [misc] Overhaul of Protobuf/gRPC tool handling in AliECS * All tools now installed under $SRC_DIR/tools * Tools (mostly protoc plugins) are now handled via go mod in tools.go * Protofile markdown docs now generated as docs/apidocs_$PROTONAME.md * The new google.golang.org gRPC generator is now used, instead of v1 * Added new runtypes to RunType enum * Regenerated coconut documentation (happens together with apidocs) * Regenerated all Protobuf/gRPC-generated code --- Makefile | 14 +- apricot/apricot.go | 2 +- apricot/protos/apricot.pb.go | 402 +---- apricot/protos/apricot.proto | 4 + apricot/protos/apricot_grpc.pb.go | 311 ++++ coconut/cmd/environment.go | 2 +- coconut/cmd/repo.go | 2 +- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 2 +- coconut/doc/coconut_configuration_dump.md | 6 +- coconut/doc/coconut_configuration_history.md | 4 +- coconut/doc/coconut_configuration_import.md | 6 +- coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 15 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 2 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- .../coconut_repository_default-revision.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 2 +- coconut/protos/o2control.pb.go | 895 ---------- coconut/protos/o2control_grpc.pb.go | 908 +++++++++++ common/tools/tools.go | 36 + core/protos/o2control.pb.go | 895 ---------- core/protos/o2control_grpc.pb.go | 906 +++++++++++ core/server.go | 2 +- docs/apidocs_aliecs.md | 1445 +++++++++++++++++ docs/apidocs_apricot.md | 268 +++ docs/apidocs_occ.md | 257 +++ executor/executor.go | 2 +- executor/protos/occ.pb.go | 251 --- executor/protos/occ_grpc.pb.go | 264 +++ go.mod | 12 +- go.sum | 29 + odcshim/odcprotos/odc.pb.go | 550 ------- odcshim/odcprotos/odc_grpc.pb.go | 563 +++++++ odcshim/odcshim.go | 4 +- odcshim/protos/occ.pb.go | 251 --- odcshim/protos/occ_grpc.pb.go | 262 +++ 55 files changed, 5378 insertions(+), 3240 deletions(-) create mode 100644 apricot/protos/apricot_grpc.pb.go create mode 100644 coconut/protos/o2control_grpc.pb.go create mode 100644 common/tools/tools.go create mode 100644 core/protos/o2control_grpc.pb.go create mode 100644 docs/apidocs_aliecs.md create mode 100644 docs/apidocs_apricot.md create mode 100644 docs/apidocs_occ.md create mode 100644 executor/protos/occ_grpc.pb.go create mode 100644 odcshim/odcprotos/odc_grpc.pb.go create mode 100644 odcshim/protos/occ_grpc.pb.go diff --git a/Makefile b/Makefile index 5030acc9e..d0c17b536 100644 --- a/Makefile +++ b/Makefile @@ -99,7 +99,7 @@ ifndef HAS_PROTOC endif @for gendir in $(GENERATE_DIRS); do \ echo -e "\033[1;33mgo generate\033[0m $$gendir"; \ - PATH="$(GOPATH)/bin:$$PATH" go generate $(VERBOSE_$(V)) $$gendir; \ + PATH="$(ROOT_DIR)/tools:$$PATH" go generate $(VERBOSE_$(V)) $$gendir; \ done test: @@ -152,15 +152,19 @@ vendor: tools: tools/protoc tools/protoc: - @echo "installing Go protoc" - go get -u google.golang.org/grpc - go install google.golang.org/protobuf/cmd/protoc-gen-go + @echo "installing Protobuf tools" + + @export GOBIN="$(ROOT_DIR)/tools" && cat common/tools/tools.go | grep _ | awk -F'"' '{print $$2}' | xargs -tI % go install -mod=readonly % docs: doc doc: @echo -e "generating coconut documentation \033[1;33m==>\033[0m \033[1;34m./coconut/doc\033[0m" - @cd coconut/doc && go run . + @cd coconut/doc && go run . && cd ../.. + @echo -e "generating gRPC API documentation \033[1;33m==>\033[0m \033[1;34m./docs\033[0m" + @cd apricot/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_apricot.md "apricot.proto" + @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_aliecs.md "o2control.proto" + @cd occ/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_occ.md "occ.proto" help: @echo "available make variables:" diff --git a/apricot/apricot.go b/apricot/apricot.go index d9c7c5383..68c849e87 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -35,7 +35,7 @@ import ( "github.com/spf13/viper" ) -//go:generate protoc --go_out=plugins=grpc:. protos/apricot.proto +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/apricot.proto var log = logger.New(logrus.StandardLogger(),"apricot") diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index c5539ce75..f45e76128 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -30,11 +30,7 @@ package apricotpb import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -55,10 +51,14 @@ const _ = proto.ProtoPackageIsVersion4 type RunType int32 const ( - RunType_NULL RunType = 0 - RunType_ANY RunType = 1 - RunType_PHYSICS RunType = 2 - RunType_TECHNICAL RunType = 3 + RunType_NULL RunType = 0 + RunType_ANY RunType = 1 + RunType_PHYSICS RunType = 2 + RunType_TECHNICAL RunType = 3 + RunType_COSMIC RunType = 4 + RunType_PEDESTAL RunType = 5 + RunType_THRESHOLD_SCAN RunType = 6 + RunType_CALIBRATION RunType = 7 ) // Enum value maps for RunType. @@ -68,12 +68,20 @@ var ( 1: "ANY", 2: "PHYSICS", 3: "TECHNICAL", + 4: "COSMIC", + 5: "PEDESTAL", + 6: "THRESHOLD_SCAN", + 7: "CALIBRATION", } RunType_value = map[string]int32{ - "NULL": 0, - "ANY": 1, - "PHYSICS": 2, - "TECHNICAL": 3, + "NULL": 0, + "ANY": 1, + "PHYSICS": 2, + "TECHNICAL": 3, + "COSMIC": 4, + "PEDESTAL": 5, + "THRESHOLD_SCAN": 6, + "CALIBRATION": 7, } ) @@ -685,46 +693,50 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x38, 0x0a, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, - 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x32, 0xed, 0x03, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, + 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, + 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xed, 0x03, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, - 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, - 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, + 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, + 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -920,299 +932,3 @@ func file_protos_apricot_proto_init() { file_protos_apricot_proto_goTypes = nil file_protos_apricot_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ApricotClient is the client API for Apricot service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ApricotClient interface { - NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) - GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) - GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) - GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) - RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) - GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) - SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) -} - -type apricotClient struct { - cc grpc.ClientConnInterface -} - -func NewApricotClient(cc grpc.ClientConnInterface) ApricotClient { - return &apricotClient{cc} -} - -func (c *apricotClient) NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) { - out := new(RunNumberResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/NewRunNumber", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { - out := new(StringMap) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDefaults", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { - out := new(StringMap) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetVars", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { - out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { - out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { - out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/apricot.Apricot/SetRuntimeEntry", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ApricotServer is the server API for Apricot service. -type ApricotServer interface { - NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) - GetDefaults(context.Context, *Empty) (*StringMap, error) - GetVars(context.Context, *Empty) (*StringMap, error) - GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) - RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) - GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) - SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) -} - -// UnimplementedApricotServer can be embedded to have forward compatible implementations. -type UnimplementedApricotServer struct { -} - -func (*UnimplementedApricotServer) NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewRunNumber not implemented") -} -func (*UnimplementedApricotServer) GetDefaults(context.Context, *Empty) (*StringMap, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetDefaults not implemented") -} -func (*UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetVars not implemented") -} -func (*UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") -} -func (*UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") -} -func (*UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") -} -func (*UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") -} - -func RegisterApricotServer(s *grpc.Server, srv ApricotServer) { - s.RegisterService(&_Apricot_serviceDesc, srv) -} - -func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).NewRunNumber(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/NewRunNumber", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).NewRunNumber(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_GetDefaults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetDefaults(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetDefaults", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetDefaults(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_GetVars_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetVars(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetVars", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetVars(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ComponentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetComponentConfiguration(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetComponentConfiguration", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RawGetRecursiveRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).RawGetRecursive(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/RawGetRecursive", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRuntimeEntryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetRuntimeEntry(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetRuntimeEntry", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetRuntimeEntry(ctx, req.(*GetRuntimeEntryRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRuntimeEntryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).SetRuntimeEntry(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/SetRuntimeEntry", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).SetRuntimeEntry(ctx, req.(*SetRuntimeEntryRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Apricot_serviceDesc = grpc.ServiceDesc{ - ServiceName: "apricot.Apricot", - HandlerType: (*ApricotServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "NewRunNumber", - Handler: _Apricot_NewRunNumber_Handler, - }, - { - MethodName: "GetDefaults", - Handler: _Apricot_GetDefaults_Handler, - }, - { - MethodName: "GetVars", - Handler: _Apricot_GetVars_Handler, - }, - { - MethodName: "GetComponentConfiguration", - Handler: _Apricot_GetComponentConfiguration_Handler, - }, - { - MethodName: "RawGetRecursive", - Handler: _Apricot_RawGetRecursive_Handler, - }, - { - MethodName: "GetRuntimeEntry", - Handler: _Apricot_GetRuntimeEntry_Handler, - }, - { - MethodName: "SetRuntimeEntry", - Handler: _Apricot_SetRuntimeEntry_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "protos/apricot.proto", -} diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index c9636afe6..340bd9ac5 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -43,6 +43,10 @@ enum RunType { ANY = 1; PHYSICS = 2; TECHNICAL = 3; + COSMIC = 4; + PEDESTAL = 5; + THRESHOLD_SCAN = 6; + CALIBRATION = 7; } message Empty {} diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go new file mode 100644 index 000000000..96f0a0b4d --- /dev/null +++ b/apricot/protos/apricot_grpc.pb.go @@ -0,0 +1,311 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package apricotpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ApricotClient is the client API for Apricot service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ApricotClient interface { + NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) + GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) + GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) + GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) +} + +type apricotClient struct { + cc grpc.ClientConnInterface +} + +func NewApricotClient(cc grpc.ClientConnInterface) ApricotClient { + return &apricotClient{cc} +} + +func (c *apricotClient) NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) { + out := new(RunNumberResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/NewRunNumber", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { + out := new(StringMap) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDefaults", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { + out := new(StringMap) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetVars", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/apricot.Apricot/SetRuntimeEntry", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ApricotServer is the server API for Apricot service. +// All implementations should embed UnimplementedApricotServer +// for forward compatibility +type ApricotServer interface { + NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) + GetDefaults(context.Context, *Empty) (*StringMap, error) + GetVars(context.Context, *Empty) (*StringMap, error) + GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) + RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) + GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) + SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) +} + +// UnimplementedApricotServer should be embedded to have forward compatible implementations. +type UnimplementedApricotServer struct { +} + +func (UnimplementedApricotServer) NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewRunNumber not implemented") +} +func (UnimplementedApricotServer) GetDefaults(context.Context, *Empty) (*StringMap, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDefaults not implemented") +} +func (UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVars not implemented") +} +func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") +} +func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") +} +func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") +} +func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") +} + +// UnsafeApricotServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ApricotServer will +// result in compilation errors. +type UnsafeApricotServer interface { + mustEmbedUnimplementedApricotServer() +} + +func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { + s.RegisterService(&_Apricot_serviceDesc, srv) +} + +func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).NewRunNumber(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/NewRunNumber", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).NewRunNumber(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetDefaults_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetDefaults(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetDefaults", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetDefaults(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetVars_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetVars(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetVars", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetVars(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetComponentConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetComponentConfiguration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RawGetRecursiveRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).RawGetRecursive(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/RawGetRecursive", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRuntimeEntryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetRuntimeEntry(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetRuntimeEntry", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetRuntimeEntry(ctx, req.(*GetRuntimeEntryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRuntimeEntryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).SetRuntimeEntry(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/SetRuntimeEntry", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).SetRuntimeEntry(ctx, req.(*SetRuntimeEntryRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Apricot_serviceDesc = grpc.ServiceDesc{ + ServiceName: "apricot.Apricot", + HandlerType: (*ApricotServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "NewRunNumber", + Handler: _Apricot_NewRunNumber_Handler, + }, + { + MethodName: "GetDefaults", + Handler: _Apricot_GetDefaults_Handler, + }, + { + MethodName: "GetVars", + Handler: _Apricot_GetVars_Handler, + }, + { + MethodName: "GetComponentConfiguration", + Handler: _Apricot_GetComponentConfiguration_Handler, + }, + { + MethodName: "RawGetRecursive", + Handler: _Apricot_RawGetRecursive_Handler, + }, + { + MethodName: "GetRuntimeEntry", + Handler: _Apricot_GetRuntimeEntry_Handler, + }, + { + MethodName: "SetRuntimeEntry", + Handler: _Apricot_SetRuntimeEntry_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/apricot.proto", +} diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index 86ca5b60c..7b7d3ae76 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=plugins=grpc:.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. protos/o2control.proto package cmd diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index a93e0190b..3b4a16a14 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=plugins=grpc:.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. protos/o2control.proto package cmd diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 55e1b5648..decca544c 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -31,4 +31,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index aa79849c4..3ecec2562 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -30,4 +30,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 0ada20176..b01db8b21 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -32,4 +32,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 317c233bf..2985e642c 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -6,7 +6,9 @@ dump configuration subtree The configuration dump command requests from O² Configuration a subtree of key-values, and dumps it to standard output in the specified -format. +format. This command has full read access to the O² Configuration store +and performs a raw query with no additional processing or access control +semantics. ``` coconut configuration dump [key] [flags] @@ -33,4 +35,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index aca80ca51..41a3b03a3 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -16,7 +16,7 @@ coconut configuration history [flags] ``` coconut conf history coconut conf history -coconut conf history / +coconut conf history /// ``` ### Options @@ -40,4 +40,4 @@ coconut conf history / * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index a2f55f755..720c77e3f 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -17,9 +17,9 @@ coconut configuration import [flags] ``` coconut conf import -coconut conf import / +coconut conf import /// coconut conf import --new-component -coconut conf import / --format=json +coconut conf import /// --format=json coconut conf import .json coconut conf import --no-versioning coconut conf import --no-versioning --new-component @@ -49,4 +49,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index c2f286b45..3b7051a77 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -41,4 +41,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 5e77b640c..92cedb35d 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -17,16 +17,19 @@ coconut configuration show [flags] ``` coconut conf show coconut conf show -t -coconut conf show / -coconut conf show / -t -coconut conf show /@ +coconut conf show /// +coconut conf show /// -t +coconut conf show ///@ +coconut conf show -s -e '{"key1": "value1", "key2": "value2"}' ``` ### Options ``` - -h, --help help for show - -t, --timestamp string request configuration for this timestamp + -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` + -h, --help help for show + -s, --simulate simulate runtime template processing on the configuration payload + -t, --timestamp string request configuration for this timestamp ``` ### Options inherited from parent commands @@ -43,4 +46,4 @@ coconut conf show /@ * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 0ef48f27c..a455e8bf3 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -52,4 +52,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 82c6fa8b4..a57605142 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -40,4 +40,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 3f7b90d25..11ef9845b 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -46,4 +46,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index e21a7b316..e615346f2 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -37,4 +37,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 188bfb8cf..9228163e1 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -31,4 +31,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 1717be906..e67ba0c9a 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -33,4 +33,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index cc922c500..55e6431d1 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -31,4 +31,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 35ac1799e..9d1360d9d 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -57,4 +57,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 9f5adaed9..80b6b1471 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -37,4 +37,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index cf33cacb4..e09277b6f 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -37,4 +37,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index cfa6887c0..bd8d9848a 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 2b4002024..b8f81a69b 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index f75cf9561..a016900a6 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 2e2c8b959..12c82dbaf 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 13eef1e8b..6ee337eca 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -28,4 +28,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 9171eb098..c138a716e 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -30,4 +30,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 2729096b4..1d56d6495 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -29,4 +29,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 3825dbdc3..28a49f26d 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -32,4 +32,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 04d652470..ccc66d4c4 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -31,4 +31,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index aabaf7e48..171f27d45 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -28,4 +28,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index af3d3dbf6..2f3938ac1 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -53,4 +53,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 16-Nov-2020 +###### Auto generated by spf13/cobra on 11-Jan-2021 diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 9b49a124d..a225fc93c 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -30,11 +30,7 @@ package pb import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -5961,894 +5957,3 @@ func file_protos_o2control_proto_init() { file_protos_o2control_proto_goTypes = nil file_protos_o2control_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) -} - -type controlClient struct { - cc grpc.ClientConnInterface -} - -func NewControlClient(cc grpc.ClientConnInterface) ControlClient { - return &controlClient{cc} -} - -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type controlTrackStatusClient struct { - grpc.ClientStream -} - -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlSubscribeClient struct { - grpc.ClientStream -} - -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error -} - -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} -func (*UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") -} -func (*UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") -} -func (*UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) -} - -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", -} diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go new file mode 100644 index 000000000..23ae76ff9 --- /dev/null +++ b/coconut/protos/o2control_grpc.pb.go @@ -0,0 +1,908 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc grpc.ClientConnInterface +} + +func NewControlClient(cc grpc.ClientConnInterface) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { + return nil, err + } + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { + return nil, err + } + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlSubscribeClient struct { + grpc.ClientStream +} + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ControlServer is the server API for Control service. +// All implementations must embed UnimplementedControlServer +// for forward compatibility +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error + mustEmbedUnimplementedControlServer() +} + +// UnimplementedControlServer must be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") +} +func (UnimplementedControlServer) mustEmbedUnimplementedControlServer() {} + +// UnsafeControlServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ControlServer will +// result in compilation errors. +type UnsafeControlServer interface { + mustEmbedUnimplementedControlServer() +} + +func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) +} + +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) +} + +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream +} + +type controlTrackStatusServer struct { + grpc.ServerStream +} + +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) +} + +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlSubscribeServer struct { + grpc.ServerStream +} + +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, + { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, + { + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", +} diff --git a/common/tools/tools.go b/common/tools/tools.go new file mode 100644 index 000000000..9c74802ba --- /dev/null +++ b/common/tools/tools.go @@ -0,0 +1,36 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +// +build tools + + +package tools + +import ( + // protocol buffer compiler plugins + _ "google.golang.org/protobuf/cmd/protoc-gen-go" + _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" + _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" +) \ No newline at end of file diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 9b49a124d..a225fc93c 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -30,11 +30,7 @@ package pb import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -5961,894 +5957,3 @@ func file_protos_o2control_proto_init() { file_protos_o2control_proto_goTypes = nil file_protos_o2control_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) -} - -type controlClient struct { - cc grpc.ClientConnInterface -} - -func NewControlClient(cc grpc.ClientConnInterface) ControlClient { - return &controlClient{cc} -} - -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type controlTrackStatusClient struct { - grpc.ClientStream -} - -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream -} - -type controlSubscribeClient struct { - grpc.ClientStream -} - -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error -} - -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} - -func (*UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} -func (*UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") -} -func (*UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") -} -func (*UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) -} - -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, - }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", -} diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go new file mode 100644 index 000000000..94d2d97c1 --- /dev/null +++ b/core/protos/o2control_grpc.pb.go @@ -0,0 +1,906 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ControlClient is the client API for Control service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ControlClient interface { + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) + GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) + ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) + DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) + GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) + CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) + GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) + GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) + ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) + AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) + RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) + RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) + SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) + SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) + SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) + Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +} + +type controlClient struct { + cc grpc.ClientConnInterface +} + +func NewControlClient(cc grpc.ClientConnInterface) ControlClient { + return &controlClient{cc} +} + +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + if err != nil { + return nil, err + } + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { + out := new(GetFrameworkInfoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { + out := new(GetEnvironmentsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { + out := new(GetEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { + out := new(ControlEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { + out := new(DestroyEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { + out := new(GetTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { + out := new(GetTaskReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { + out := new(CleanupTasksReply) + err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { + out := new(GetRolesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { + out := new(GetWorkflowTemplatesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { + out := new(ListReposReply) + err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { + out := new(AddRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { + out := new(RemoveRepoReply) + err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { + out := new(SetRepoDefaultRevisionReply) + err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + if err != nil { + return nil, err + } + x := &controlSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type controlSubscribeClient struct { + grpc.ClientStream +} + +func (x *controlSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +// ControlServer is the server API for Control service. +// All implementations should embed UnimplementedControlServer +// for forward compatibility +type ControlServer interface { + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) + GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) + ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) + DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) + GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) + CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) + GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) + GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) + ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) + AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) + RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) + RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) + SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) + SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) + SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) + Subscribe(*SubscribeRequest, Control_SubscribeServer) error +} + +// UnimplementedControlServer should be embedded to have forward compatible implementations. +type UnimplementedControlServer struct { +} + +func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") +} +func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") +} +func (UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") +} +func (UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") +} +func (UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") +} +func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} +func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") +} +func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") +} +func (UnimplementedControlServer) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") +} +func (UnimplementedControlServer) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") +} +func (UnimplementedControlServer) GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") +} +func (UnimplementedControlServer) GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") +} +func (UnimplementedControlServer) ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") +} +func (UnimplementedControlServer) AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") +} +func (UnimplementedControlServer) RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") +} +func (UnimplementedControlServer) RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") +} +func (UnimplementedControlServer) SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") +} +func (UnimplementedControlServer) SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") +} +func (UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") +} +func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") +} + +// UnsafeControlServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ControlServer will +// result in compilation errors. +type UnsafeControlServer interface { + mustEmbedUnimplementedControlServer() +} + +func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { + s.RegisterService(&_Control_serviceDesc, srv) +} + +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) +} + +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream +} + +type controlTrackStatusServer struct { + grpc.ServerStream +} + +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFrameworkInfoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetFrameworkInfo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetFrameworkInfo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/Teardown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetEnvironments(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironments", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ControlEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ControlEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ControlEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ModifyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DestroyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).DestroyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/DestroyEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetTaskRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetTask(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetTask", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CleanupTasksRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).CleanupTasks(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/CleanupTasks", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRolesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetRoles(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetRoles", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetWorkflowTemplatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetWorkflowTemplates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetWorkflowTemplates", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ListRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/ListRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AddRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).AddRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/AddRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RemoveRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RemoveRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RemoveRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RefreshReposRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).RefreshRepos(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/RefreshRepos", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetDefaultRepoRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetDefaultRepo(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetDefaultRepo", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetGlobalDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetRepoDefaultRevisionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/SetRepoDefaultRevision", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscribeRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) +} + +type Control_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream +} + +type controlSubscribeServer struct { + grpc.ServerStream +} + +func (x *controlSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +var _Control_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2control.Control", + HandlerType: (*ControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetFrameworkInfo", + Handler: _Control_GetFrameworkInfo_Handler, + }, + { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, + { + MethodName: "GetEnvironments", + Handler: _Control_GetEnvironments_Handler, + }, + { + MethodName: "NewEnvironment", + Handler: _Control_NewEnvironment_Handler, + }, + { + MethodName: "GetEnvironment", + Handler: _Control_GetEnvironment_Handler, + }, + { + MethodName: "ControlEnvironment", + Handler: _Control_ControlEnvironment_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + { + MethodName: "DestroyEnvironment", + Handler: _Control_DestroyEnvironment_Handler, + }, + { + MethodName: "GetTasks", + Handler: _Control_GetTasks_Handler, + }, + { + MethodName: "GetTask", + Handler: _Control_GetTask_Handler, + }, + { + MethodName: "CleanupTasks", + Handler: _Control_CleanupTasks_Handler, + }, + { + MethodName: "GetRoles", + Handler: _Control_GetRoles_Handler, + }, + { + MethodName: "GetWorkflowTemplates", + Handler: _Control_GetWorkflowTemplates_Handler, + }, + { + MethodName: "ListRepos", + Handler: _Control_ListRepos_Handler, + }, + { + MethodName: "AddRepo", + Handler: _Control_AddRepo_Handler, + }, + { + MethodName: "RemoveRepo", + Handler: _Control_RemoveRepo_Handler, + }, + { + MethodName: "RefreshRepos", + Handler: _Control_RefreshRepos_Handler, + }, + { + MethodName: "SetDefaultRepo", + Handler: _Control_SetDefaultRepo_Handler, + }, + { + MethodName: "SetGlobalDefaultRevision", + Handler: _Control_SetGlobalDefaultRevision_Handler, + }, + { + MethodName: "SetRepoDefaultRevision", + Handler: _Control_SetRepoDefaultRevision_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, + ServerStreams: true, + }, + { + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/o2control.proto", +} diff --git a/core/server.go b/core/server.go index 4e7b07215..e35e9d2a4 100644 --- a/core/server.go +++ b/core/server.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=plugins=grpc:. protos/o2control.proto +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto package core import ( diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md new file mode 100644 index 000000000..3280a73b6 --- /dev/null +++ b/docs/apidocs_aliecs.md @@ -0,0 +1,1445 @@ +# Protocol Documentation +
+ +## Table of Contents + +- [o2control.proto](#o2control.proto) + - [AddRepoReply](#o2control.AddRepoReply) + - [AddRepoRequest](#o2control.AddRepoRequest) + - [ChannelInfo](#o2control.ChannelInfo) + - [CleanupTasksReply](#o2control.CleanupTasksReply) + - [CleanupTasksRequest](#o2control.CleanupTasksRequest) + - [CommandInfo](#o2control.CommandInfo) + - [ControlEnvironmentReply](#o2control.ControlEnvironmentReply) + - [ControlEnvironmentRequest](#o2control.ControlEnvironmentRequest) + - [DestroyEnvironmentReply](#o2control.DestroyEnvironmentReply) + - [DestroyEnvironmentRequest](#o2control.DestroyEnvironmentRequest) + - [Empty](#o2control.Empty) + - [EnvironmentInfo](#o2control.EnvironmentInfo) + - [EnvironmentInfo.DefaultsEntry](#o2control.EnvironmentInfo.DefaultsEntry) + - [EnvironmentInfo.UserVarsEntry](#o2control.EnvironmentInfo.UserVarsEntry) + - [EnvironmentInfo.VarsEntry](#o2control.EnvironmentInfo.VarsEntry) + - [EnvironmentOperation](#o2control.EnvironmentOperation) + - [Ev_EnvironmentCreated](#o2control.Ev_EnvironmentCreated) + - [Ev_EnvironmentDestroyed](#o2control.Ev_EnvironmentDestroyed) + - [Ev_EnvironmentError](#o2control.Ev_EnvironmentError) + - [Ev_EnvironmentStateChanged](#o2control.Ev_EnvironmentStateChanged) + - [Ev_KillTasksMesos](#o2control.Ev_KillTasksMesos) + - [Ev_MesosTaskCreated](#o2control.Ev_MesosTaskCreated) + - [Ev_TaskLaunched](#o2control.Ev_TaskLaunched) + - [Ev_TaskStateChanged](#o2control.Ev_TaskStateChanged) + - [Ev_TaskStatusChanged](#o2control.Ev_TaskStatusChanged) + - [Event](#o2control.Event) + - [Event_MesosHeartbeat](#o2control.Event_MesosHeartbeat) + - [GetEnvironmentPropertiesReply](#o2control.GetEnvironmentPropertiesReply) + - [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control.GetEnvironmentPropertiesReply.PropertiesEntry) + - [GetEnvironmentPropertiesRequest](#o2control.GetEnvironmentPropertiesRequest) + - [GetEnvironmentReply](#o2control.GetEnvironmentReply) + - [GetEnvironmentRequest](#o2control.GetEnvironmentRequest) + - [GetEnvironmentsReply](#o2control.GetEnvironmentsReply) + - [GetEnvironmentsRequest](#o2control.GetEnvironmentsRequest) + - [GetFrameworkInfoReply](#o2control.GetFrameworkInfoReply) + - [GetFrameworkInfoRequest](#o2control.GetFrameworkInfoRequest) + - [GetRolesReply](#o2control.GetRolesReply) + - [GetRolesRequest](#o2control.GetRolesRequest) + - [GetTaskReply](#o2control.GetTaskReply) + - [GetTaskRequest](#o2control.GetTaskRequest) + - [GetTasksReply](#o2control.GetTasksReply) + - [GetTasksRequest](#o2control.GetTasksRequest) + - [GetWorkflowTemplatesReply](#o2control.GetWorkflowTemplatesReply) + - [GetWorkflowTemplatesRequest](#o2control.GetWorkflowTemplatesRequest) + - [ListReposReply](#o2control.ListReposReply) + - [ListReposRequest](#o2control.ListReposRequest) + - [ModifyEnvironmentReply](#o2control.ModifyEnvironmentReply) + - [ModifyEnvironmentRequest](#o2control.ModifyEnvironmentRequest) + - [NewEnvironmentReply](#o2control.NewEnvironmentReply) + - [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) + - [NewEnvironmentRequest.VarsEntry](#o2control.NewEnvironmentRequest.VarsEntry) + - [RefreshReposRequest](#o2control.RefreshReposRequest) + - [RemoveRepoReply](#o2control.RemoveRepoReply) + - [RemoveRepoRequest](#o2control.RemoveRepoRequest) + - [RepoInfo](#o2control.RepoInfo) + - [RoleInfo](#o2control.RoleInfo) + - [RoleInfo.DefaultsEntry](#o2control.RoleInfo.DefaultsEntry) + - [RoleInfo.UserVarsEntry](#o2control.RoleInfo.UserVarsEntry) + - [RoleInfo.VarsEntry](#o2control.RoleInfo.VarsEntry) + - [SetDefaultRepoRequest](#o2control.SetDefaultRepoRequest) + - [SetEnvironmentPropertiesReply](#o2control.SetEnvironmentPropertiesReply) + - [SetEnvironmentPropertiesRequest](#o2control.SetEnvironmentPropertiesRequest) + - [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control.SetEnvironmentPropertiesRequest.PropertiesEntry) + - [SetGlobalDefaultRevisionRequest](#o2control.SetGlobalDefaultRevisionRequest) + - [SetRepoDefaultRevisionReply](#o2control.SetRepoDefaultRevisionReply) + - [SetRepoDefaultRevisionRequest](#o2control.SetRepoDefaultRevisionRequest) + - [ShortTaskInfo](#o2control.ShortTaskInfo) + - [StatusReply](#o2control.StatusReply) + - [StatusRequest](#o2control.StatusRequest) + - [StatusUpdate](#o2control.StatusUpdate) + - [SubscribeRequest](#o2control.SubscribeRequest) + - [TaskClassInfo](#o2control.TaskClassInfo) + - [TaskDeploymentInfo](#o2control.TaskDeploymentInfo) + - [TaskInfo](#o2control.TaskInfo) + - [TaskInfo.PropertiesEntry](#o2control.TaskInfo.PropertiesEntry) + - [TeardownReply](#o2control.TeardownReply) + - [TeardownRequest](#o2control.TeardownRequest) + - [Version](#o2control.Version) + - [WorkflowTemplateInfo](#o2control.WorkflowTemplateInfo) + + - [ControlEnvironmentRequest.Optype](#o2control.ControlEnvironmentRequest.Optype) + - [EnvironmentOperation.Optype](#o2control.EnvironmentOperation.Optype) + - [StatusUpdate.Level](#o2control.StatusUpdate.Level) + + - [Control](#o2control.Control) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## o2control.proto + + + + + +### AddRepoReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| newDefaultRevision | [string](#string) | | | +| info | [string](#string) | | | + + + + + + + + +### AddRepoRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| defaultRevision | [string](#string) | | | + + + + + + + + +### ChannelInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| type | [string](#string) | | | +| target | [string](#string) | | | + + + + + + + + +### CleanupTasksReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| killedTasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | +| runningTasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | + + + + + + + + +### CleanupTasksRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskIds | [string](#string) | repeated | | + + + + + + + + +### CommandInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| env | [string](#string) | repeated | | +| shell | [bool](#bool) | | | +| value | [string](#string) | | | +| arguments | [string](#string) | repeated | | +| user | [string](#string) | | | + + + + + + + + +### ControlEnvironmentReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| state | [string](#string) | | | +| currentRunNumber | [uint32](#uint32) | | | + + + + + + + + +### ControlEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| type | [ControlEnvironmentRequest.Optype](#o2control.ControlEnvironmentRequest.Optype) | | | + + + + + + + + +### DestroyEnvironmentReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| cleanupTasksReply | [CleanupTasksReply](#o2control.CleanupTasksReply) | | | + + + + + + + + +### DestroyEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| keepTasks | [bool](#bool) | | | +| allowInRunningState | [bool](#bool) | | | +| force | [bool](#bool) | | | + + + + + + + + +### Empty + + + + + + + + + +### EnvironmentInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| createdWhen | [string](#string) | | | +| state | [string](#string) | | | +| tasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | +| rootRole | [string](#string) | | | +| currentRunNumber | [uint32](#uint32) | | | +| defaults | [EnvironmentInfo.DefaultsEntry](#o2control.EnvironmentInfo.DefaultsEntry) | repeated | | +| vars | [EnvironmentInfo.VarsEntry](#o2control.EnvironmentInfo.VarsEntry) | repeated | | +| userVars | [EnvironmentInfo.UserVarsEntry](#o2control.EnvironmentInfo.UserVarsEntry) | repeated | | + + + + + + + + +### EnvironmentInfo.DefaultsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### EnvironmentInfo.UserVarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### EnvironmentInfo.VarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### EnvironmentOperation + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [EnvironmentOperation.Optype](#o2control.EnvironmentOperation.Optype) | | | +| roleName | [string](#string) | | | + + + + + + + + +### Ev_EnvironmentCreated + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | + + + + + + + + +### Ev_EnvironmentDestroyed + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| cleanupTasksReply | [CleanupTasksReply](#o2control.CleanupTasksReply) | | | +| environmentid | [string](#string) | | | + + + + + + + + +### Ev_EnvironmentError + + + + + + + + + +### Ev_EnvironmentStateChanged + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| event | [string](#string) | | | +| source | [string](#string) | | | +| destination | [string](#string) | | | + + + + + + + + +### Ev_KillTasksMesos + + + + + + + + + +### Ev_MesosTaskCreated + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskresources | [string](#string) | | | +| executorResources | [string](#string) | | | + + + + + + + + +### Ev_TaskLaunched + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskid | [string](#string) | | | + + + + + + + + +### Ev_TaskStateChanged + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskid | [string](#string) | | | +| state | [string](#string) | | | + + + + + + + + +### Ev_TaskStatusChanged + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskid | [string](#string) | | | +| status | [string](#string) | | | + + + + + + + + +### Event + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| timestamp | [string](#string) | | | +| environmentStateChanged | [Ev_EnvironmentStateChanged](#o2control.Ev_EnvironmentStateChanged) | | | +| environmentCreated | [Ev_EnvironmentCreated](#o2control.Ev_EnvironmentCreated) | | | +| taskStateChanged | [Ev_TaskStateChanged](#o2control.Ev_TaskStateChanged) | | | +| taskStatusChanged | [Ev_TaskStatusChanged](#o2control.Ev_TaskStatusChanged) | | | +| tasklaunched | [Ev_TaskLaunched](#o2control.Ev_TaskLaunched) | | | +| mesosTaskcreated | [Ev_MesosTaskCreated](#o2control.Ev_MesosTaskCreated) | | | +| environmentDestroyed | [Ev_EnvironmentDestroyed](#o2control.Ev_EnvironmentDestroyed) | | | +| environmentError | [Ev_EnvironmentError](#o2control.Ev_EnvironmentError) | | | +| killtasksMesos | [Ev_KillTasksMesos](#o2control.Ev_KillTasksMesos) | | | + + + + + + + + +### Event_MesosHeartbeat + + + + + + + + + +### GetEnvironmentPropertiesReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| properties | [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control.GetEnvironmentPropertiesReply.PropertiesEntry) | repeated | | + + + + + + + + +### GetEnvironmentPropertiesReply.PropertiesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### GetEnvironmentPropertiesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| queries | [string](#string) | repeated | If len(queries) == 0, we return an empty map. To retrieve all KVs, use query '*' | +| excludeGlobals | [bool](#bool) | | | + + + + + + + + +### GetEnvironmentReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | +| workflow | [RoleInfo](#o2control.RoleInfo) | | | + + + + + + + + +### GetEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | + + + + + + + + +### GetEnvironmentsReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| frameworkId | [string](#string) | | | +| environments | [EnvironmentInfo](#o2control.EnvironmentInfo) | repeated | | + + + + + + + + +### GetEnvironmentsRequest +Environment +////////////////////////////////////// + + + + + + + + +### GetFrameworkInfoReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| frameworkId | [string](#string) | | | +| environmentsCount | [int32](#int32) | | | +| tasksCount | [int32](#int32) | | | +| state | [string](#string) | | | +| hostsCount | [int32](#int32) | | | +| instanceName | [string](#string) | | | +| version | [Version](#o2control.Version) | | | + + + + + + + + +### GetFrameworkInfoRequest +Framework +////////////////////////////////////// + + + + + + + + +### GetRolesReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| roles | [RoleInfo](#o2control.RoleInfo) | repeated | | + + + + + + + + +### GetRolesRequest +Roles +////////////////////////////////////// + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| envId | [string](#string) | | | +| pathSpec | [string](#string) | | | + + + + + + + + +### GetTaskReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| task | [TaskInfo](#o2control.TaskInfo) | | | + + + + + + + + +### GetTaskRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| taskId | [string](#string) | | | + + + + + + + + +### GetTasksReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| tasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | + + + + + + + + +### GetTasksRequest + + + + + + + + + +### GetWorkflowTemplatesReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| workflowTemplates | [WorkflowTemplateInfo](#o2control.WorkflowTemplateInfo) | repeated | | + + + + + + + + +### GetWorkflowTemplatesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| repoPattern | [string](#string) | | | +| revisionPattern | [string](#string) | | | +| allBranches | [bool](#bool) | | | +| allTags | [bool](#bool) | | | + + + + + + + + +### ListReposReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| repos | [RepoInfo](#o2control.RepoInfo) | repeated | | +| globalDefaultRevision | [string](#string) | | | + + + + + + + + +### ListReposRequest + + + + + + + + + +### ModifyEnvironmentReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| failedOperations | [EnvironmentOperation](#o2control.EnvironmentOperation) | repeated | | +| id | [string](#string) | | | +| state | [string](#string) | | | + + + + + + + + +### ModifyEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| operations | [EnvironmentOperation](#o2control.EnvironmentOperation) | repeated | | +| reconfigureAll | [bool](#bool) | | | + + + + + + + + +### NewEnvironmentReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | + + + + + + + + +### NewEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| workflowTemplate | [string](#string) | | | +| vars | [NewEnvironmentRequest.VarsEntry](#o2control.NewEnvironmentRequest.VarsEntry) | repeated | | + + + + + + + + +### NewEnvironmentRequest.VarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### RefreshReposRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| index | [int32](#int32) | | | + + + + + + + + +### RemoveRepoReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| newDefaultRepo | [string](#string) | | | + + + + + + + + +### RemoveRepoRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| index | [int32](#int32) | | | + + + + + + + + +### RepoInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| default | [bool](#bool) | | | +| defaultRevision | [string](#string) | | | + + + + + + + + +### RoleInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| status | [string](#string) | | | +| state | [string](#string) | | | +| fullPath | [string](#string) | | | +| taskIds | [string](#string) | repeated | | +| roles | [RoleInfo](#o2control.RoleInfo) | repeated | | +| defaults | [RoleInfo.DefaultsEntry](#o2control.RoleInfo.DefaultsEntry) | repeated | | +| vars | [RoleInfo.VarsEntry](#o2control.RoleInfo.VarsEntry) | repeated | | +| userVars | [RoleInfo.UserVarsEntry](#o2control.RoleInfo.UserVarsEntry) | repeated | | + + + + + + + + +### RoleInfo.DefaultsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### RoleInfo.UserVarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### RoleInfo.VarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### SetDefaultRepoRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| index | [int32](#int32) | | | + + + + + + + + +### SetEnvironmentPropertiesReply + + + + + + + + + +### SetEnvironmentPropertiesRequest +Environment, GET/SET properties +////////////////////////////////////// + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | +| properties | [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control.SetEnvironmentPropertiesRequest.PropertiesEntry) | repeated | If properties == nil, the core sets nothing and reply ok | + + + + + + + + +### SetEnvironmentPropertiesRequest.PropertiesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### SetGlobalDefaultRevisionRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| revision | [string](#string) | | | + + + + + + + + +### SetRepoDefaultRevisionReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| info | [string](#string) | | | + + + + + + + + +### SetRepoDefaultRevisionRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| index | [int32](#int32) | | | +| revision | [string](#string) | | | + + + + + + + + +### ShortTaskInfo +Tasks +////////////////////////////////////// + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| locked | [bool](#bool) | | | +| taskId | [string](#string) | | | +| status | [string](#string) | | | +| state | [string](#string) | | | +| className | [string](#string) | | | +| deploymentInfo | [TaskDeploymentInfo](#o2control.TaskDeploymentInfo) | | | +| pid | [string](#string) | | | + + + + + + + + +### StatusReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| state | [string](#string) | | | +| statusUpdates | [StatusUpdate](#o2control.StatusUpdate) | repeated | | + + + + + + + + +### StatusRequest +Global status +////////////////////////////////////// + + + + + + + + +### StatusUpdate + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| level | [StatusUpdate.Level](#o2control.StatusUpdate.Level) | | | +| mesosHeartbeat | [Event_MesosHeartbeat](#o2control.Event_MesosHeartbeat) | | TODO add other events here and in events.proto | + + + + + + + + +### SubscribeRequest + + + + + + + + + +### TaskClassInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| controlMode | [string](#string) | | | + + + + + + + + +### TaskDeploymentInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hostname | [string](#string) | | | +| agentId | [string](#string) | | | +| offerId | [string](#string) | | | +| executorId | [string](#string) | | | + + + + + + + + +### TaskInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| shortInfo | [ShortTaskInfo](#o2control.ShortTaskInfo) | | | +| classInfo | [TaskClassInfo](#o2control.TaskClassInfo) | | | +| inboundChannels | [ChannelInfo](#o2control.ChannelInfo) | repeated | | +| outboundChannels | [ChannelInfo](#o2control.ChannelInfo) | repeated | | +| commandInfo | [CommandInfo](#o2control.CommandInfo) | | | +| taskPath | [string](#string) | | | +| envId | [string](#string) | | | +| properties | [TaskInfo.PropertiesEntry](#o2control.TaskInfo.PropertiesEntry) | repeated | | + + + + + + + + +### TaskInfo.PropertiesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### TeardownReply + + + + + + + + + +### TeardownRequest +Not implemented yet + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| reason | [string](#string) | | | + + + + + + + + +### Version + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| major | [int32](#int32) | | | +| minor | [int32](#int32) | | | +| patch | [int32](#int32) | | | +| build | [string](#string) | | | +| productName | [string](#string) | | | +| versionStr | [string](#string) | | | + + + + + + + + +### WorkflowTemplateInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| repo | [string](#string) | | | +| template | [string](#string) | | | +| revision | [string](#string) | | | + + + + + + + + + + +### ControlEnvironmentRequest.Optype + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NOOP | 0 | | +| START_ACTIVITY | 1 | | +| STOP_ACTIVITY | 2 | | +| CONFIGURE | 3 | | +| RESET | 4 | | +| GO_ERROR | 5 | | + + + + + +### EnvironmentOperation.Optype + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NOOP | 0 | | +| REMOVE_ROLE | 3 | | +| ADD_ROLE | 4 | | + + + + + +### StatusUpdate.Level + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| DEBUG | 0 | | +| INFO | 1 | | +| WARNING | 2 | | +| ERROR | 3 | | + + + + + + + + + +### Control + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| TrackStatus | [StatusRequest](#o2control.StatusRequest) | [StatusReply](#o2control.StatusReply) stream | | +| GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control.GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control.GetFrameworkInfoReply) | | +| Teardown | [TeardownRequest](#o2control.TeardownRequest) | [TeardownReply](#o2control.TeardownReply) | | +| GetEnvironments | [GetEnvironmentsRequest](#o2control.GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control.GetEnvironmentsReply) | | +| NewEnvironment | [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) | [NewEnvironmentReply](#o2control.NewEnvironmentReply) | | +| GetEnvironment | [GetEnvironmentRequest](#o2control.GetEnvironmentRequest) | [GetEnvironmentReply](#o2control.GetEnvironmentReply) | | +| ControlEnvironment | [ControlEnvironmentRequest](#o2control.ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control.ControlEnvironmentReply) | | +| ModifyEnvironment | [ModifyEnvironmentRequest](#o2control.ModifyEnvironmentRequest) | [ModifyEnvironmentReply](#o2control.ModifyEnvironmentReply) | | +| DestroyEnvironment | [DestroyEnvironmentRequest](#o2control.DestroyEnvironmentRequest) | [DestroyEnvironmentReply](#o2control.DestroyEnvironmentReply) | | +| GetTasks | [GetTasksRequest](#o2control.GetTasksRequest) | [GetTasksReply](#o2control.GetTasksReply) | | +| GetTask | [GetTaskRequest](#o2control.GetTaskRequest) | [GetTaskReply](#o2control.GetTaskReply) | | +| CleanupTasks | [CleanupTasksRequest](#o2control.CleanupTasksRequest) | [CleanupTasksReply](#o2control.CleanupTasksReply) | | +| GetRoles | [GetRolesRequest](#o2control.GetRolesRequest) | [GetRolesReply](#o2control.GetRolesReply) | | +| GetWorkflowTemplates | [GetWorkflowTemplatesRequest](#o2control.GetWorkflowTemplatesRequest) | [GetWorkflowTemplatesReply](#o2control.GetWorkflowTemplatesReply) | | +| ListRepos | [ListReposRequest](#o2control.ListReposRequest) | [ListReposReply](#o2control.ListReposReply) | | +| AddRepo | [AddRepoRequest](#o2control.AddRepoRequest) | [AddRepoReply](#o2control.AddRepoReply) | | +| RemoveRepo | [RemoveRepoRequest](#o2control.RemoveRepoRequest) | [RemoveRepoReply](#o2control.RemoveRepoReply) | | +| RefreshRepos | [RefreshReposRequest](#o2control.RefreshReposRequest) | [Empty](#o2control.Empty) | | +| SetDefaultRepo | [SetDefaultRepoRequest](#o2control.SetDefaultRepoRequest) | [Empty](#o2control.Empty) | | +| SetGlobalDefaultRevision | [SetGlobalDefaultRevisionRequest](#o2control.SetGlobalDefaultRevisionRequest) | [Empty](#o2control.Empty) | | +| SetRepoDefaultRevision | [SetRepoDefaultRevisionRequest](#o2control.SetRepoDefaultRevisionRequest) | [SetRepoDefaultRevisionReply](#o2control.SetRepoDefaultRevisionReply) | | +| Subscribe | [SubscribeRequest](#o2control.SubscribeRequest) | [Event](#o2control.Event) stream | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | 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 | int32 | int | integer | Bignum or Fixnum (as required) | +| 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 | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md new file mode 100644 index 000000000..53614e3a3 --- /dev/null +++ b/docs/apidocs_apricot.md @@ -0,0 +1,268 @@ +# Protocol Documentation + + +## Table of Contents + +- [apricot.proto](#apricot.proto) + - [ComponentQuery](#apricot.ComponentQuery) + - [ComponentRequest](#apricot.ComponentRequest) + - [ComponentRequest.VarStackEntry](#apricot.ComponentRequest.VarStackEntry) + - [ComponentResponse](#apricot.ComponentResponse) + - [Empty](#apricot.Empty) + - [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) + - [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) + - [RunNumberResponse](#apricot.RunNumberResponse) + - [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) + - [StringMap](#apricot.StringMap) + - [StringMap.StringMapEntry](#apricot.StringMap.StringMapEntry) + + - [RunType](#apricot.RunType) + + - [Apricot](#apricot.Apricot) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## apricot.proto + + + + + +### ComponentQuery + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | +| runType | [RunType](#apricot.RunType) | | | +| machineRole | [string](#string) | | | +| entry | [string](#string) | | | +| timestamp | [string](#string) | | | + + + + + + + + +### ComponentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | [string](#string) | | | +| query | [ComponentQuery](#apricot.ComponentQuery) | | | +| processTemplate | [bool](#bool) | | | +| varStack | [ComponentRequest.VarStackEntry](#apricot.ComponentRequest.VarStackEntry) | repeated | | + + + + + + + + +### ComponentRequest.VarStackEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### ComponentResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| payload | [string](#string) | | | + + + + + + + + +### Empty + + + + + + + + + +### GetRuntimeEntryRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | +| key | [string](#string) | | | + + + + + + + + +### RawGetRecursiveRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| rawPath | [string](#string) | | | + + + + + + + + +### RunNumberResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| runNumber | [uint32](#uint32) | | | + + + + + + + + +### SetRuntimeEntryRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### StringMap + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| stringMap | [StringMap.StringMapEntry](#apricot.StringMap.StringMapEntry) | repeated | | + + + + + + + + +### StringMap.StringMapEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + + + +### RunType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| ANY | 1 | | +| PHYSICS | 2 | | +| TECHNICAL | 3 | | +| COSMIC | 4 | | +| PEDESTAL | 5 | | +| THRESHOLD_SCAN | 6 | | +| CALIBRATION | 7 | | + + + + + + + + + +### Apricot + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| NewRunNumber | [Empty](#apricot.Empty) | [RunNumberResponse](#apricot.RunNumberResponse) | | +| GetDefaults | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | +| GetVars | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | +| GetComponentConfiguration | [ComponentRequest](#apricot.ComponentRequest) | [ComponentResponse](#apricot.ComponentResponse) | | +| RawGetRecursive | [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) | [ComponentResponse](#apricot.ComponentResponse) | | +| GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) | [ComponentResponse](#apricot.ComponentResponse) | | +| SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) | [Empty](#apricot.Empty) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | 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 | int32 | int | integer | Bignum or Fixnum (as required) | +| 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 | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/docs/apidocs_occ.md b/docs/apidocs_occ.md new file mode 100644 index 000000000..7c9ad0c51 --- /dev/null +++ b/docs/apidocs_occ.md @@ -0,0 +1,257 @@ +# Protocol Documentation + + +## Table of Contents + +- [occ.proto](#occ.proto) + - [ConfigEntry](#occ_pb.ConfigEntry) + - [DeviceEvent](#occ_pb.DeviceEvent) + - [EventStreamReply](#occ_pb.EventStreamReply) + - [EventStreamRequest](#occ_pb.EventStreamRequest) + - [GetStateReply](#occ_pb.GetStateReply) + - [GetStateRequest](#occ_pb.GetStateRequest) + - [StateStreamReply](#occ_pb.StateStreamReply) + - [StateStreamRequest](#occ_pb.StateStreamRequest) + - [TransitionReply](#occ_pb.TransitionReply) + - [TransitionRequest](#occ_pb.TransitionRequest) + + - [DeviceEventType](#occ_pb.DeviceEventType) + - [StateChangeTrigger](#occ_pb.StateChangeTrigger) + - [StateType](#occ_pb.StateType) + + - [Occ](#occ_pb.Occ) + +- [Scalar Value Types](#scalar-value-types) + + + + +

Top

+ +## occ.proto + + + + + +### ConfigEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### DeviceEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [DeviceEventType](#occ_pb.DeviceEventType) | | | + + + + + + + + +### EventStreamReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| event | [DeviceEvent](#occ_pb.DeviceEvent) | | | + + + + + + + + +### EventStreamRequest + + + + + + + + + +### GetStateReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| state | [string](#string) | | | +| pid | [int32](#int32) | | | + + + + + + + + +### GetStateRequest + + + + + + + + + +### StateStreamReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| type | [StateType](#occ_pb.StateType) | | | +| state | [string](#string) | | | + + + + + + + + +### StateStreamRequest + + + + + + + + + +### TransitionReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| trigger | [StateChangeTrigger](#occ_pb.StateChangeTrigger) | | | +| state | [string](#string) | | | +| transitionEvent | [string](#string) | | | +| ok | [bool](#bool) | | | + + + + + + + + +### TransitionRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| srcState | [string](#string) | | | +| transitionEvent | [string](#string) | | | +| arguments | [ConfigEntry](#occ_pb.ConfigEntry) | repeated | | + + + + + + + + + + +### DeviceEventType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL_DEVICE_EVENT | 0 | | +| END_OF_STREAM | 1 | | +| BASIC_TASK_TERMINATED | 2 | | + + + + + +### StateChangeTrigger + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| EXECUTOR | 0 | | +| DEVICE_INTENTIONAL | 1 | | +| DEVICE_ERROR | 2 | | + + + + + +### StateType + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| STATE_STABLE | 0 | | +| STATE_INTERMEDIATE | 1 | | + + + + + + + + + +### Occ + + +| Method Name | Request Type | Response Type | Description | +| ----------- | ------------ | ------------- | ------------| +| EventStream | [EventStreamRequest](#occ_pb.EventStreamRequest) | [EventStreamReply](#occ_pb.EventStreamReply) stream | We have to have a notification stream because the FairMQDevice might transition on its own for whatever reason. | +| StateStream | [StateStreamRequest](#occ_pb.StateStreamRequest) | [StateStreamReply](#occ_pb.StateStreamReply) stream | | +| GetState | [GetStateRequest](#occ_pb.GetStateRequest) | [GetStateReply](#occ_pb.GetStateReply) | | +| Transition | [TransitionRequest](#occ_pb.TransitionRequest) | [TransitionReply](#occ_pb.TransitionReply) | | + + + + + +## Scalar Value Types + +| .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | +| ----------- | ----- | --- | ---- | ------ | -- | -- | --- | ---- | +| double | | double | double | float | float64 | double | float | Float | +| float | | float | float | float | float32 | 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 | int32 | int | integer | Bignum or Fixnum (as required) | +| 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 | int64 | long | integer/string | Bignum | +| uint32 | Uses variable-length encoding. | uint32 | int | int/long | uint32 | uint | integer | Bignum or Fixnum (as required) | +| uint64 | Uses variable-length encoding. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum or Fixnum (as required) | +| sint32 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sint64 | Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| fixed32 | Always four bytes. More efficient than uint32 if values are often greater than 2^28. | uint32 | int | int | uint32 | uint | integer | Bignum or Fixnum (as required) | +| fixed64 | Always eight bytes. More efficient than uint64 if values are often greater than 2^56. | uint64 | long | int/long | uint64 | ulong | integer/string | Bignum | +| sfixed32 | Always four bytes. | int32 | int | int | int32 | int | integer | Bignum or Fixnum (as required) | +| sfixed64 | Always eight bytes. | int64 | long | int/long | int64 | long | integer/string | Bignum | +| bool | | bool | boolean | boolean | bool | bool | boolean | TrueClass/FalseClass | +| string | A string must always contain UTF-8 encoded or 7-bit ASCII text. | string | String | str/unicode | string | string | string | String (UTF-8) | +| bytes | May contain any arbitrary sequence of bytes. | string | ByteString | str | []byte | ByteString | string | String (ASCII-8BIT) | + diff --git a/executor/executor.go b/executor/executor.go index 2a7547989..8e680b5ef 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../occ --go_out=plugins=grpc:. protos/occ.proto +//go:generate protoc -I ../occ --go_out=. --go-grpc_out=. protos/occ.proto // Package executor implements the O² Control executor binary. package executor diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 75d94a383..fe7ada7fc 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -30,11 +30,7 @@ package pb import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -984,250 +980,3 @@ func file_protos_occ_proto_init() { file_protos_occ_proto_goTypes = nil file_protos_occ_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// OccClient is the client API for Occ service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type OccClient interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) - StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) - GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) - Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) -} - -type occClient struct { - cc grpc.ClientConnInterface -} - -func NewOccClient(cc grpc.ClientConnInterface) OccClient { - return &occClient{cc} -} - -func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) - if err != nil { - return nil, err - } - x := &occEventStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_EventStreamClient interface { - Recv() (*EventStreamReply, error) - grpc.ClientStream -} - -type occEventStreamClient struct { - grpc.ClientStream -} - -func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { - m := new(EventStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) - if err != nil { - return nil, err - } - x := &occStateStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_StateStreamClient interface { - Recv() (*StateStreamReply, error) - grpc.ClientStream -} - -type occStateStreamClient struct { - grpc.ClientStream -} - -func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { - m := new(StateStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { - out := new(GetStateReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { - out := new(TransitionReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// OccServer is the server API for Occ service. -type OccServer interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(*EventStreamRequest, Occ_EventStreamServer) error - StateStream(*StateStreamRequest, Occ_StateStreamServer) error - GetState(context.Context, *GetStateRequest) (*GetStateReply, error) - Transition(context.Context, *TransitionRequest) (*TransitionReply, error) -} - -// UnimplementedOccServer can be embedded to have forward compatible implementations. -type UnimplementedOccServer struct { -} - -func (*UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") -} -func (*UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (*UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (*UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") -} - -func RegisterOccServer(s *grpc.Server, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) -} - -func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(EventStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) -} - -type Occ_EventStreamServer interface { - Send(*EventStreamReply) error - grpc.ServerStream -} - -type occEventStreamServer struct { - grpc.ServerStream -} - -func (x *occEventStreamServer) Send(m *EventStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StateStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) -} - -type Occ_StateStreamServer interface { - Send(*StateStreamReply) error - grpc.ServerStream -} - -type occStateStreamServer struct { - grpc.ServerStream -} - -func (x *occStateStreamServer) Send(m *StateStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetStateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).GetState(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/GetState", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TransitionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).Transition(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/Transition", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Occ_serviceDesc = grpc.ServiceDesc{ - ServiceName: "occ_pb.Occ", - HandlerType: (*OccServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetState", - Handler: _Occ_GetState_Handler, - }, - { - MethodName: "Transition", - Handler: _Occ_Transition_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "EventStream", - Handler: _Occ_EventStream_Handler, - ServerStreams: true, - }, - { - StreamName: "StateStream", - Handler: _Occ_StateStream_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/occ.proto", -} diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go new file mode 100644 index 000000000..66a3c8901 --- /dev/null +++ b/executor/protos/occ_grpc.pb.go @@ -0,0 +1,264 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// OccClient is the client API for Occ service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type OccClient interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) + StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) + GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) + Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) +} + +type occClient struct { + cc grpc.ClientConnInterface +} + +func NewOccClient(cc grpc.ClientConnInterface) OccClient { + return &occClient{cc} +} + +func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + if err != nil { + return nil, err + } + x := &occEventStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_EventStreamClient interface { + Recv() (*EventStreamReply, error) + grpc.ClientStream +} + +type occEventStreamClient struct { + grpc.ClientStream +} + +func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { + m := new(EventStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + if err != nil { + return nil, err + } + x := &occStateStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_StateStreamClient interface { + Recv() (*StateStreamReply, error) + grpc.ClientStream +} + +type occStateStreamClient struct { + grpc.ClientStream +} + +func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { + m := new(StateStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { + out := new(GetStateReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { + out := new(TransitionReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OccServer is the server API for Occ service. +// All implementations must embed UnimplementedOccServer +// for forward compatibility +type OccServer interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(*EventStreamRequest, Occ_EventStreamServer) error + StateStream(*StateStreamRequest, Occ_StateStreamServer) error + GetState(context.Context, *GetStateRequest) (*GetStateReply, error) + Transition(context.Context, *TransitionRequest) (*TransitionReply, error) + mustEmbedUnimplementedOccServer() +} + +// UnimplementedOccServer must be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} +func (UnimplementedOccServer) mustEmbedUnimplementedOccServer() {} + +// UnsafeOccServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OccServer will +// result in compilation errors. +type UnsafeOccServer interface { + mustEmbedUnimplementedOccServer() +} + +func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { + s.RegisterService(&_Occ_serviceDesc, srv) +} + +func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(EventStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) +} + +type Occ_EventStreamServer interface { + Send(*EventStreamReply) error + grpc.ServerStream +} + +type occEventStreamServer struct { + grpc.ServerStream +} + +func (x *occEventStreamServer) Send(m *EventStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StateStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) +} + +type Occ_StateStreamServer interface { + Send(*StateStreamReply) error + grpc.ServerStream +} + +type occStateStreamServer struct { + grpc.ServerStream +} + +func (x *occStateStreamServer) Send(m *StateStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TransitionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).Transition(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/Transition", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Occ_serviceDesc = grpc.ServiceDesc{ + ServiceName: "occ_pb.Occ", + HandlerType: (*OccServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetState", + Handler: _Occ_GetState_Handler, + }, + { + MethodName: "Transition", + Handler: _Occ_Transition_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "EventStream", + Handler: _Occ_EventStream_Handler, + ServerStreams: true, + }, + { + StreamName: "StateStream", + Handler: _Occ_StateStream_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/occ.proto", +} diff --git a/go.mod b/go.mod index 5fe629dc1..0eaf9d940 100644 --- a/go.mod +++ b/go.mod @@ -78,6 +78,7 @@ require ( github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/client_golang v1.5.1 github.com/prometheus/procfs v0.0.11 // indirect + github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c github.com/rs/xid v1.2.1 github.com/sanity-io/litter v1.2.0 // indirect @@ -100,12 +101,13 @@ require ( go.etcd.io/bbolt v1.3.4 // indirect go.uber.org/zap v1.14.1 // indirect golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20210119194325-5f4716e94777 - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c - golang.org/x/text v0.3.5 // indirect + golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 + golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e + golang.org/x/text v0.3.4 // indirect golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect - google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 // indirect - google.golang.org/grpc v1.35.0 + google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d // indirect + google.golang.org/grpc v1.34.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect google.golang.org/protobuf v1.25.0 gopkg.in/ini.v1 v1.55.0 // indirect diff --git a/go.sum b/go.sum index 2f4c975f9..9f55fed96 100644 --- a/go.sum +++ b/go.sum @@ -53,6 +53,10 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= +github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= +github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -97,6 +101,8 @@ github.com/antonmedv/expr v1.8.6/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmH github.com/antonmedv/expr v1.8.7/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/antonmedv/expr v1.8.8 h1:uVwIkIBNO2yn4vY2u2DQUqXTmv9jEEMCEcHa19G5weY= github.com/antonmedv/expr v1.8.8/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= +github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= @@ -165,7 +171,11 @@ github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= +github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= @@ -230,6 +240,7 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -274,6 +285,7 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -365,7 +377,10 @@ github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDG github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= +github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= @@ -486,6 +501,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= +github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= @@ -566,6 +583,12 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/pseudomuto/protoc-gen-doc v1.3.2 h1:61vWZuxYa8D7Rn4h+2dgoTNqnluBmJya2MgbqO32z6g= +github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= +github.com/pseudomuto/protoc-gen-doc v1.4.1 h1:aNTZq0dy0Pq2ag2v7bhNKFNgBBA8wMCoJSChhd7RciE= +github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= +github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= +github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c h1:Q1oRqcTvxE0hjV0Gw4bEcYYLM0ztcuARGVSWEF2tKaI= github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= @@ -642,6 +665,7 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -711,6 +735,7 @@ go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -816,6 +841,7 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -991,6 +1017,7 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1033,6 +1060,8 @@ google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 h1:M8spwkmx0pHrPq+uMdl22w5CvJ/Y+oAJTIs9oGoCpOE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d h1:vV+xpotnpsR73kzOS8o8hxDlc7Er+H5WZqOBwWcGktk= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d/go.mod h1:Lh55/1hxmVHEkOvSIQ2uj0P12QyOCUNyRwnUlSS13hw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 2b0f53dbd..24b7d5eb4 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -7,11 +7,7 @@ package odc import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -1564,549 +1560,3 @@ func file_odcprotos_odc_proto_init() { file_odcprotos_odc_proto_goTypes = nil file_odcprotos_odc_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// ODCClient is the client API for ODC service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ODCClient interface { - // Creates a new DDS session or attaches to an existing DDS session. - Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. - // Can be called multiple times in order to submit more DDS agents (allocate more resources). - Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Activates a given topology. - Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Run request combines Initialize, Submit and Activate into a single request. - // Run request always creates a new DDS session. - Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Updates a topology (up or down scale number of tasks or any other topology change). - // It consists of 3 commands: Reset, Activate and Configure. - // Can be called multiple times. - Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Transitions devices into Ready state. - Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) - // Changes devices configuration. - SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Get current aggregated state of devices. - GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transition devices into Running state. - Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transitions devices into Ready state. - Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transitions devices into Idle state. - Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) - // Shuts devices down via End transition. - Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) - // Shutdown DDS session. - Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) -} - -type oDCClient struct { - cc grpc.ClientConnInterface -} - -func NewODCClient(cc grpc.ClientConnInterface) ODCClient { - return &oDCClient{cc} -} - -func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ODCServer is the server API for ODC service. -type ODCServer interface { - // Creates a new DDS session or attaches to an existing DDS session. - Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) - // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. - // Can be called multiple times in order to submit more DDS agents (allocate more resources). - Submit(context.Context, *SubmitRequest) (*GeneralReply, error) - // Activates a given topology. - Activate(context.Context, *ActivateRequest) (*GeneralReply, error) - // Run request combines Initialize, Submit and Activate into a single request. - // Run request always creates a new DDS session. - Run(context.Context, *RunRequest) (*GeneralReply, error) - // Updates a topology (up or down scale number of tasks or any other topology change). - // It consists of 3 commands: Reset, Activate and Configure. - // Can be called multiple times. - Update(context.Context, *UpdateRequest) (*GeneralReply, error) - // Transitions devices into Ready state. - Configure(context.Context, *ConfigureRequest) (*StateReply, error) - // Changes devices configuration. - SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) - // Get current aggregated state of devices. - GetState(context.Context, *StateRequest) (*StateReply, error) - // Transition devices into Running state. - Start(context.Context, *StartRequest) (*StateReply, error) - // Transitions devices into Ready state. - Stop(context.Context, *StopRequest) (*StateReply, error) - // Transitions devices into Idle state. - Reset(context.Context, *ResetRequest) (*StateReply, error) - // Shuts devices down via End transition. - Terminate(context.Context, *TerminateRequest) (*StateReply, error) - // Shutdown DDS session. - Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) -} - -// UnimplementedODCServer can be embedded to have forward compatible implementations. -type UnimplementedODCServer struct { -} - -func (*UnimplementedODCServer) Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") -} -func (*UnimplementedODCServer) Submit(context.Context, *SubmitRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") -} -func (*UnimplementedODCServer) Activate(context.Context, *ActivateRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") -} -func (*UnimplementedODCServer) Run(context.Context, *RunRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") -} -func (*UnimplementedODCServer) Update(context.Context, *UpdateRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") -} -func (*UnimplementedODCServer) Configure(context.Context, *ConfigureRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") -} -func (*UnimplementedODCServer) SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") -} -func (*UnimplementedODCServer) GetState(context.Context, *StateRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (*UnimplementedODCServer) Start(context.Context, *StartRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") -} -func (*UnimplementedODCServer) Stop(context.Context, *StopRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") -} -func (*UnimplementedODCServer) Reset(context.Context, *ResetRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") -} -func (*UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") -} -func (*UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") -} - -func RegisterODCServer(s *grpc.Server, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) -} - -func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitializeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Initialize(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Initialize", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Submit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Submit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ActivateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Activate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Activate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RunRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Run(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Run", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Run(ctx, req.(*RunRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Update(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Update", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ConfigureRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Configure(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Configure", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).SetProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/SetProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).GetState(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/GetState", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Start(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Start", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Start(ctx, req.(*StartRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StopRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Stop(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Stop", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ResetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Reset(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Reset", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TerminateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Terminate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Terminate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ShutdownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Shutdown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Shutdown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ODC_serviceDesc = grpc.ServiceDesc{ - ServiceName: "odc.ODC", - HandlerType: (*ODCServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Initialize", - Handler: _ODC_Initialize_Handler, - }, - { - MethodName: "Submit", - Handler: _ODC_Submit_Handler, - }, - { - MethodName: "Activate", - Handler: _ODC_Activate_Handler, - }, - { - MethodName: "Run", - Handler: _ODC_Run_Handler, - }, - { - MethodName: "Update", - Handler: _ODC_Update_Handler, - }, - { - MethodName: "Configure", - Handler: _ODC_Configure_Handler, - }, - { - MethodName: "SetProperties", - Handler: _ODC_SetProperties_Handler, - }, - { - MethodName: "GetState", - Handler: _ODC_GetState_Handler, - }, - { - MethodName: "Start", - Handler: _ODC_Start_Handler, - }, - { - MethodName: "Stop", - Handler: _ODC_Stop_Handler, - }, - { - MethodName: "Reset", - Handler: _ODC_Reset_Handler, - }, - { - MethodName: "Terminate", - Handler: _ODC_Terminate_Handler, - }, - { - MethodName: "Shutdown", - Handler: _ODC_Shutdown_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "odcprotos/odc.proto", -} diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go new file mode 100644 index 000000000..b5f1e0452 --- /dev/null +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -0,0 +1,563 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package odc + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ODCClient is the client API for ODC service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ODCClient interface { + // Creates a new DDS session or attaches to an existing DDS session. + Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). + Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Activates a given topology. + Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. + Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Transitions devices into Ready state. + Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) + // Changes devices configuration. + SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transition devices into Running state. + Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Ready state. + Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Idle state. + Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shutdown DDS session. + Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) +} + +type oDCClient struct { + cc grpc.ClientConnInterface +} + +func NewODCClient(cc grpc.ClientConnInterface) ODCClient { + return &oDCClient{cc} +} + +func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ODCServer is the server API for ODC service. +// All implementations must embed UnimplementedODCServer +// for forward compatibility +type ODCServer interface { + // Creates a new DDS session or attaches to an existing DDS session. + Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). + Submit(context.Context, *SubmitRequest) (*GeneralReply, error) + // Activates a given topology. + Activate(context.Context, *ActivateRequest) (*GeneralReply, error) + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(context.Context, *RunRequest) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. + Update(context.Context, *UpdateRequest) (*GeneralReply, error) + // Transitions devices into Ready state. + Configure(context.Context, *ConfigureRequest) (*StateReply, error) + // Changes devices configuration. + SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(context.Context, *StateRequest) (*StateReply, error) + // Transition devices into Running state. + Start(context.Context, *StartRequest) (*StateReply, error) + // Transitions devices into Ready state. + Stop(context.Context, *StopRequest) (*StateReply, error) + // Transitions devices into Idle state. + Reset(context.Context, *ResetRequest) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(context.Context, *TerminateRequest) (*StateReply, error) + // Shutdown DDS session. + Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) + mustEmbedUnimplementedODCServer() +} + +// UnimplementedODCServer must be embedded to have forward compatible implementations. +type UnimplementedODCServer struct { +} + +func (UnimplementedODCServer) Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") +} +func (UnimplementedODCServer) Submit(context.Context, *SubmitRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") +} +func (UnimplementedODCServer) Activate(context.Context, *ActivateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") +} +func (UnimplementedODCServer) Run(context.Context, *RunRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") +} +func (UnimplementedODCServer) Update(context.Context, *UpdateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedODCServer) Configure(context.Context, *ConfigureRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") +} +func (UnimplementedODCServer) SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") +} +func (UnimplementedODCServer) GetState(context.Context, *StateRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (UnimplementedODCServer) Start(context.Context, *StartRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") +} +func (UnimplementedODCServer) Stop(context.Context, *StopRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") +} +func (UnimplementedODCServer) Reset(context.Context, *ResetRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") +} +func (UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") +} +func (UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") +} +func (UnimplementedODCServer) mustEmbedUnimplementedODCServer() {} + +// UnsafeODCServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ODCServer will +// result in compilation errors. +type UnsafeODCServer interface { + mustEmbedUnimplementedODCServer() +} + +func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { + s.RegisterService(&_ODC_serviceDesc, srv) +} + +func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitializeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Initialize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Initialize", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubmitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Submit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Submit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ActivateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Activate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Activate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Run(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Run", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Run(ctx, req.(*RunRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfigureRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Configure(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Configure", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetPropertiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).SetProperties(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/SetProperties", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Start(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Start", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Start(ctx, req.(*StartRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Stop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Stop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Reset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Reset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TerminateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Terminate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Terminate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ShutdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Shutdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Shutdown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _ODC_serviceDesc = grpc.ServiceDesc{ + ServiceName: "odc.ODC", + HandlerType: (*ODCServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Initialize", + Handler: _ODC_Initialize_Handler, + }, + { + MethodName: "Submit", + Handler: _ODC_Submit_Handler, + }, + { + MethodName: "Activate", + Handler: _ODC_Activate_Handler, + }, + { + MethodName: "Run", + Handler: _ODC_Run_Handler, + }, + { + MethodName: "Update", + Handler: _ODC_Update_Handler, + }, + { + MethodName: "Configure", + Handler: _ODC_Configure_Handler, + }, + { + MethodName: "SetProperties", + Handler: _ODC_SetProperties_Handler, + }, + { + MethodName: "GetState", + Handler: _ODC_GetState_Handler, + }, + { + MethodName: "Start", + Handler: _ODC_Start_Handler, + }, + { + MethodName: "Stop", + Handler: _ODC_Stop_Handler, + }, + { + MethodName: "Reset", + Handler: _ODC_Reset_Handler, + }, + { + MethodName: "Terminate", + Handler: _ODC_Terminate_Handler, + }, + { + MethodName: "Shutdown", + Handler: _ODC_Shutdown_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "odcprotos/odc.proto", +} diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go index 00a8d6964..aa8e7e2e1 100644 --- a/odcshim/odcshim.go +++ b/odcshim/odcshim.go @@ -36,8 +36,8 @@ import ( "github.com/spf13/viper" ) -//go:generate protoc -I ../occ --go_out=plugins=grpc:. protos/occ.proto -//go:generate protoc -I ../odcshim --go_out=plugins=grpc:. odcprotos/odc.proto +//go:generate protoc -I ../occ --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/occ.proto +//go:generate protoc -I ../odcshim --go_out=. --go-grpc_out=. odcprotos/odc.proto var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index 75d94a383..fe7ada7fc 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -30,11 +30,7 @@ package pb import ( - context "context" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -984,250 +980,3 @@ func file_protos_occ_proto_init() { file_protos_occ_proto_goTypes = nil file_protos_occ_proto_depIdxs = nil } - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConnInterface - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion6 - -// OccClient is the client API for Occ service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type OccClient interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) - StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) - GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) - Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) -} - -type occClient struct { - cc grpc.ClientConnInterface -} - -func NewOccClient(cc grpc.ClientConnInterface) OccClient { - return &occClient{cc} -} - -func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) - if err != nil { - return nil, err - } - x := &occEventStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_EventStreamClient interface { - Recv() (*EventStreamReply, error) - grpc.ClientStream -} - -type occEventStreamClient struct { - grpc.ClientStream -} - -func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { - m := new(EventStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) - if err != nil { - return nil, err - } - x := &occStateStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_StateStreamClient interface { - Recv() (*StateStreamReply, error) - grpc.ClientStream -} - -type occStateStreamClient struct { - grpc.ClientStream -} - -func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { - m := new(StateStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { - out := new(GetStateReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { - out := new(TransitionReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// OccServer is the server API for Occ service. -type OccServer interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(*EventStreamRequest, Occ_EventStreamServer) error - StateStream(*StateStreamRequest, Occ_StateStreamServer) error - GetState(context.Context, *GetStateRequest) (*GetStateReply, error) - Transition(context.Context, *TransitionRequest) (*TransitionReply, error) -} - -// UnimplementedOccServer can be embedded to have forward compatible implementations. -type UnimplementedOccServer struct { -} - -func (*UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") -} -func (*UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (*UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (*UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") -} - -func RegisterOccServer(s *grpc.Server, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) -} - -func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(EventStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) -} - -type Occ_EventStreamServer interface { - Send(*EventStreamReply) error - grpc.ServerStream -} - -type occEventStreamServer struct { - grpc.ServerStream -} - -func (x *occEventStreamServer) Send(m *EventStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StateStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) -} - -type Occ_StateStreamServer interface { - Send(*StateStreamReply) error - grpc.ServerStream -} - -type occStateStreamServer struct { - grpc.ServerStream -} - -func (x *occStateStreamServer) Send(m *StateStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetStateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).GetState(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/GetState", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TransitionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).Transition(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/Transition", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Occ_serviceDesc = grpc.ServiceDesc{ - ServiceName: "occ_pb.Occ", - HandlerType: (*OccServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetState", - Handler: _Occ_GetState_Handler, - }, - { - MethodName: "Transition", - Handler: _Occ_Transition_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "EventStream", - Handler: _Occ_EventStream_Handler, - ServerStreams: true, - }, - { - StreamName: "StateStream", - Handler: _Occ_StateStream_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/occ.proto", -} diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go new file mode 100644 index 000000000..09d8d584b --- /dev/null +++ b/odcshim/protos/occ_grpc.pb.go @@ -0,0 +1,262 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package pb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// OccClient is the client API for Occ service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type OccClient interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) + StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) + GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) + Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) +} + +type occClient struct { + cc grpc.ClientConnInterface +} + +func NewOccClient(cc grpc.ClientConnInterface) OccClient { + return &occClient{cc} +} + +func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + if err != nil { + return nil, err + } + x := &occEventStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_EventStreamClient interface { + Recv() (*EventStreamReply, error) + grpc.ClientStream +} + +type occEventStreamClient struct { + grpc.ClientStream +} + +func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { + m := new(EventStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + if err != nil { + return nil, err + } + x := &occStateStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Occ_StateStreamClient interface { + Recv() (*StateStreamReply, error) + grpc.ClientStream +} + +type occStateStreamClient struct { + grpc.ClientStream +} + +func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { + m := new(StateStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { + out := new(GetStateReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { + out := new(TransitionReply) + err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// OccServer is the server API for Occ service. +// All implementations should embed UnimplementedOccServer +// for forward compatibility +type OccServer interface { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + EventStream(*EventStreamRequest, Occ_EventStreamServer) error + StateStream(*StateStreamRequest, Occ_StateStreamServer) error + GetState(context.Context, *GetStateRequest) (*GetStateReply, error) + Transition(context.Context, *TransitionRequest) (*TransitionReply, error) +} + +// UnimplementedOccServer should be embedded to have forward compatible implementations. +type UnimplementedOccServer struct { +} + +func (UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { + return status.Errorf(codes.Unimplemented, "method EventStream not implemented") +} +func (UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { + return status.Errorf(codes.Unimplemented, "method StateStream not implemented") +} +func (UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") +} + +// UnsafeOccServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to OccServer will +// result in compilation errors. +type UnsafeOccServer interface { + mustEmbedUnimplementedOccServer() +} + +func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { + s.RegisterService(&_Occ_serviceDesc, srv) +} + +func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(EventStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) +} + +type Occ_EventStreamServer interface { + Send(*EventStreamReply) error + grpc.ServerStream +} + +type occEventStreamServer struct { + grpc.ServerStream +} + +func (x *occEventStreamServer) Send(m *EventStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StateStreamRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) +} + +type Occ_StateStreamServer interface { + Send(*StateStreamReply) error + grpc.ServerStream +} + +type occStateStreamServer struct { + grpc.ServerStream +} + +func (x *occStateStreamServer) Send(m *StateStreamReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetStateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TransitionRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(OccServer).Transition(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/occ_pb.Occ/Transition", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Occ_serviceDesc = grpc.ServiceDesc{ + ServiceName: "occ_pb.Occ", + HandlerType: (*OccServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetState", + Handler: _Occ_GetState_Handler, + }, + { + MethodName: "Transition", + Handler: _Occ_Transition_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "EventStream", + Handler: _Occ_EventStream_Handler, + ServerStreams: true, + }, + { + StreamName: "StateStream", + Handler: _Occ_StateStream_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/occ.proto", +} From 97d7bbd34f30ea035ecdd7f657e57a0d55639814 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Jan 2021 18:57:54 +0100 Subject: [PATCH 0706/2352] [apricot] README.md --- apricot/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 apricot/README.md diff --git a/apricot/README.md b/apricot/README.md new file mode 100644 index 000000000..077206ebe --- /dev/null +++ b/apricot/README.md @@ -0,0 +1,14 @@ +# `APRICOT` + +**A** **p**rocessor and **r**epos**i**tory for **co**nfiguration **t**emplates + +The `o2-apricot` binary implements a centralized configuration (micro)service for ALICE O². + +``` +Usage of bin/o2-apricot: + --backendUri string URI of the Consul server or YAML configuration file (default "consul://127.0.0.1:8500") + --listenPort int Port of apricot server (default 47101) + --verbose Verbose logging +``` + +Protofile: [apricot.proto](apricot/protos/apricot.proto) From fb49238e5e96b56b9031fc133f526e0d779b3470 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Jan 2021 17:20:39 +0100 Subject: [PATCH 0707/2352] [apricot] Rebase coconut component commands on apricot --- Makefile | 2 +- apricot/instance.go | 2 +- apricot/local/service.go | 264 ++++++++- apricot/protos/apricot.pb.go | 638 ++++++++++++++++++--- apricot/protos/apricot.proto | 42 +- apricot/protos/apricot_grpc.pb.go | 216 +++++-- apricot/remote/client.go | 126 +--- apricot/remote/server.go | 134 ++++- apricot/remote/service.go | 231 ++++++++ coconut/cmd/configuration_history.go | 11 +- coconut/cmd/configuration_import.go | 4 +- coconut/cmd/configuration_show.go | 3 + coconut/configuration/configuration.go | 402 ++++--------- coconut/configuration/configurationutil.go | 123 ++-- configuration/componentcfg/componentcfg.go | 6 +- configuration/componentcfg/query.go | 72 ++- configuration/service.go | 6 + core/config.go | 1 + core/core.go | 2 +- core/the/singleton.go | 2 +- 20 files changed, 1660 insertions(+), 627 deletions(-) create mode 100644 apricot/remote/service.go diff --git a/Makefile b/Makefile index d0c17b536..a3d7cdbd0 100644 --- a/Makefile +++ b/Makefile @@ -64,7 +64,7 @@ LDFLAGS=-ldflags "-extldflags $(EXTLDFLAGS) $(PROD).VERSION_MAJOR=$(VERSION_MAJO # We expect to find the protoc-gen-go executable in $GOPATH/bin GOPATH := $(shell go env GOPATH) -GOPROTOCPATH=$(GOPATH)/bin/protoc-gen-go +GOPROTOCPATH=$(ROOT_DIR)/tools/protoc-gen-go HAS_PROTOC := $(shell command -v $(GOPROTOCPATH) 2> /dev/null) .PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs diff --git a/apricot/instance.go b/apricot/instance.go index 8520f3ba0..0e63f319c 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify diff --git a/apricot/local/service.go b/apricot/local/service.go index 7daaa0a2a..2830da15a 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019-2020 CERN and copyright holders of ALICE O². + * Copyright 2019-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -32,8 +32,10 @@ import ( "net/url" "os" "path/filepath" + "sort" "strconv" "strings" + "time" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration/cfgbackend" @@ -96,15 +98,23 @@ func (s *Service) GetDefaults() map[string]string { smap := s.getStringMap(filepath.Join(getConsulRuntimePrefix(),"defaults")) // Fill in some global constants we want to make available everywhere - globalConfigurationUri := viper.GetString("globalConfigurationUri") - smap["consul_base_uri"] = globalConfigurationUri - consulUrl, err := url.ParseRequestURI(globalConfigurationUri) + var configUri string + if viper.IsSet("config_endpoint") { //coconut + configUri = viper.GetString("config_endpoint") + } else if viper.IsSet("globalConfigurationUri"){ //core + configUri = viper.GetString("globalConfigurationUri") + } else { //apricot + configUri = viper.GetString("backendUri") + } + + smap["consul_base_uri"] = configUri + consulUrl, err := url.ParseRequestURI(configUri) if err == nil { smap["consul_hostname"] = consulUrl.Hostname() smap["consul_port"] = consulUrl.Port() smap["consul_endpoint"] = consulUrl.Host } else { - log.WithField("globalConfigurationUri", globalConfigurationUri). + log.WithField("globalConfigurationUri", configUri). Warn("cannot parse global configuration endpoint") } smap["framework_id"], _ = s.GetRuntimeEntry("aliecs", "mesos_fid") @@ -170,6 +180,8 @@ func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload return } } + } else { + timestamp = query.Timestamp } absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { @@ -255,6 +267,248 @@ func (s *Service) SetRuntimeEntry(component string, key string, value string) er } } +func (s *Service) ListComponents() (components []string, err error) { + keyPrefix := componentcfg.ConfigComponentsPath + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + componentSet := make(map[string]struct{}) + for _, key := range keys { + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, componentcfg.SEPARATOR) + // Criterion for being a component: + // length of parts == 2 because of trailing slash in Consul output for folders + // part[1] must be len=0, otherwise it's an actual entry within the component and not a trailing slash + if len(componentParts) != 2 || len(componentParts[1]) != 0 { + continue + } + component := componentParts[0] + componentSet[component] = struct{}{} + } + components = make([]string, len(componentSet)) + i := 0 + for component, _ := range componentSet { + components[i] = component + i++ + } + return +} + +func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp bool)([]string, error) { + if len(keys) == 0 { + return []string{}, errors.New("no keys found") + } + + var components sort.StringSlice + + // map of key to timestamp + componentsSet := make(map[string]string) + + for _, key := range keys { + // The input is assumed to be absolute paths, so we must trim the prefix. + // The prefix includes the component name, e.g. o2/components/readout + componentsFullName := strings.TrimPrefix(key, keyPrefix) + componentParts := strings.Split(componentsFullName, "/") + + var componentTimestamp string + + // The component name is already stripped as part of the keyPrefix. + // len(ANY/any/entry[/timestamp]) is 4, therefore ↓ + if len(componentParts) == 3 { + // 1st acceptable case: single untimestamped entry + if len(componentParts[len(componentParts) - 1]) == 0 { // means this is a folder key with trailing slash "ANY/any/" + continue + } + + componentTimestamp = "" // we're sure this path cannot contain a timestamp + componentsSet[componentsFullName] = "" + } else if len(componentParts) == 4 { + // A 5-len componentParts could be a timestamped entry, or a folder + // in the latter case, the final component is an empty string, because + // the full path has a trailing slash. + // For this reason, we have 2 cases: showTimestamp=true or false + // If false, we only need to pick 5-len folders (in addition to 4-len + // entries). + // If true, we must pick all true 5-len entries in order to compare them + // & pick the newest (in addition to, as usual, 4-len ones). + componentTimestamp = componentParts[len(componentParts) - 1] + componentsFullName = strings.TrimSuffix(componentsFullName, componentcfg.SEPARATOR + componentTimestamp) + if !showTimestamp { + componentsSet[componentsFullName] = "" + } else { + // if we *do* need to compare timestamps to find the latest + if len(componentTimestamp) == 0 { // means this is a folder key with trailing slash "component/ANY/any/entry/" + continue + } + if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0 { + componentsSet[componentsFullName] = componentTimestamp + } + } + } else { + continue + } + } + + for entryKey, entryTimestamp := range componentsSet { + if showTimestamp { + if len(entryTimestamp) == 0 { + components = append(components, entryKey) + } else { + components = append(components, entryKey+"@"+entryTimestamp) + } + } else { + components = append(components, entryKey) + } + } + + sort.Sort(components) + return components, nil +} + +func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { + keyPrefix := componentcfg.ConfigComponentsPath + if query == nil { + err = errors.New("bad query for ListComponentEntries") + return + } + + keyPrefix += query.Component + "/" + + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + + entries, err = formatComponentEntriesList(keys, keyPrefix, showLatestTimestamp) + if err != nil { + return + } + + return +} + +func (s *Service) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { + if query == nil { + return + } + + fullKeyToQuery := query.AbsoluteWithoutTimestamp() + var keys sort.StringSlice + keys, err = s.src.GetKeysByPrefix(fullKeyToQuery) + if err != nil { + return + } + if len(keys) == 0 { + err = errors.New("empty data returned from configuration backend") + return + } + + if len(query.EntryKey) == 0 { + err = errors.New("history requested for empty entry name") + return + } + + // We trim the prefix + component + keyPrefix := componentcfg.ConfigComponentsPath + query.Component + componentcfg.SEPARATOR + for i := 0; i < len(keys); i++ { + trimmed := strings.TrimPrefix(keys[i], keyPrefix) + componentParts := strings.Split(trimmed, componentcfg.SEPARATOR) + if len(componentParts) != 4 { + // bad key! + continue + } + keys[i] = componentParts[0] + componentcfg.SEPARATOR + + componentParts[1] + componentcfg.SEPARATOR + + componentParts[2] + "@" + + componentParts[3] + } + + sort.Sort(sort.Reverse(keys)) + entries = keys + + return +} + +func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { + if query == nil { + return + } + + var keys []string + keys, err = s.src.GetKeysByPrefix("") + if err != nil { + return + } + + components := componentcfg.GetComponentsMapFromKeysList(keys) + + componentExist := components[query.Component] + if !componentExist && !newComponent { + componentMsg := "" + for key := range components { + componentMsg += "\n- " + key + } + err = errors.New("component " + query.Component + " does not exist. " + + "Available components in configuration database:" + componentMsg + + "\nTo create a new component, use the new component parameter" ) + return + } + if componentExist && newComponent { + err = errors.New("invalid use of new component parameter: component " + query.Component + " already exists") + return + } + + entryExists := false + if !newComponent { + entriesMap := componentcfg.GetEntriesMapOfComponentFromKeysList(query.Component, query.RunType, query.RoleName, keys) + entryExists = entriesMap[query.EntryKey] + } + + // Temporary workaround to allow no-versioning + var latestTimestamp string + latestTimestamp, err = componentcfg.GetLatestTimestamp(keys, query) + if err != nil { + return + } + + if entryExists { + if (latestTimestamp != "0" && latestTimestamp != "") && !useVersioning { + // If a timestamp already exists in the entry specified by the user, than it cannot be used + err = errors.New("Specified entry: '" + query.EntryKey + "' already contains versioned items. Please " + + "specify a different entry name") + return + } + if (latestTimestamp == "0" || latestTimestamp == "") && useVersioning { + // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown + err = errors.New("Specified entry: '" + query.EntryKey + "' already contains un-versioned items. Please " + + "specify a different entry name") + return + } + } + + timestamp := time.Now().Unix() + fullKey := query.AbsoluteWithoutTimestamp() + + if useVersioning { + fullKey += componentcfg.SEPARATOR + strconv.FormatInt(timestamp, 10) + } + + err = s.src.Put(fullKey, payload) + if err != nil { + return + } + + existingComponentUpdated = componentExist + existingEntryUpdated = entryExists + newTimestamp = timestamp + return +} + + + func getConsulRuntimePrefix() string { // FIXME: this should not be hardcoded return "o2/aliecs" diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index f45e76128..447792785 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -631,6 +631,338 @@ func (x *SetRuntimeEntryRequest) GetValue() string { return "" } +type ComponentEntriesQuery struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=apricot.RunType" json:"runType,omitempty"` + MachineRole string `protobuf:"bytes,3,opt,name=machineRole,proto3" json:"machineRole,omitempty"` +} + +func (x *ComponentEntriesQuery) Reset() { + *x = ComponentEntriesQuery{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentEntriesQuery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentEntriesQuery) ProtoMessage() {} + +func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. +func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{9} +} + +func (x *ComponentEntriesQuery) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + +func (x *ComponentEntriesQuery) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_NULL +} + +func (x *ComponentEntriesQuery) GetMachineRole() string { + if x != nil { + return x.MachineRole + } + return "" +} + +type ListComponentEntriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to QueryPath: + // *ListComponentEntriesRequest_Path + // *ListComponentEntriesRequest_Query + QueryPath isListComponentEntriesRequest_QueryPath `protobuf_oneof:"queryPath"` + IncludeTimestamps bool `protobuf:"varint,3,opt,name=includeTimestamps,proto3" json:"includeTimestamps,omitempty"` +} + +func (x *ListComponentEntriesRequest) Reset() { + *x = ListComponentEntriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListComponentEntriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListComponentEntriesRequest) ProtoMessage() {} + +func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. +func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{10} +} + +func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { + if m != nil { + return m.QueryPath + } + return nil +} + +func (x *ListComponentEntriesRequest) GetPath() string { + if x, ok := x.GetQueryPath().(*ListComponentEntriesRequest_Path); ok { + return x.Path + } + return "" +} + +func (x *ListComponentEntriesRequest) GetQuery() *ComponentEntriesQuery { + if x, ok := x.GetQueryPath().(*ListComponentEntriesRequest_Query); ok { + return x.Query + } + return nil +} + +func (x *ListComponentEntriesRequest) GetIncludeTimestamps() bool { + if x != nil { + return x.IncludeTimestamps + } + return false +} + +type isListComponentEntriesRequest_QueryPath interface { + isListComponentEntriesRequest_QueryPath() +} + +type ListComponentEntriesRequest_Path struct { + Path string `protobuf:"bytes,1,opt,name=path,proto3,oneof"` +} + +type ListComponentEntriesRequest_Query struct { + Query *ComponentEntriesQuery `protobuf:"bytes,2,opt,name=query,proto3,oneof"` +} + +func (*ListComponentEntriesRequest_Path) isListComponentEntriesRequest_QueryPath() {} + +func (*ListComponentEntriesRequest_Query) isListComponentEntriesRequest_QueryPath() {} + +type ComponentEntriesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Payload []string `protobuf:"bytes,1,rep,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *ComponentEntriesResponse) Reset() { + *x = ComponentEntriesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentEntriesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentEntriesResponse) ProtoMessage() {} + +func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. +func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{11} +} + +func (x *ComponentEntriesResponse) GetPayload() []string { + if x != nil { + return x.Payload + } + return nil +} + +type ImportComponentConfigurationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Query *ComponentQuery `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + NewComponent bool `protobuf:"varint,3,opt,name=newComponent,proto3" json:"newComponent,omitempty"` + UseVersioning bool `protobuf:"varint,4,opt,name=useVersioning,proto3" json:"useVersioning,omitempty"` +} + +func (x *ImportComponentConfigurationRequest) Reset() { + *x = ImportComponentConfigurationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImportComponentConfigurationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportComponentConfigurationRequest) ProtoMessage() {} + +func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. +func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{12} +} + +func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { + if x != nil { + return x.Query + } + return nil +} + +func (x *ImportComponentConfigurationRequest) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + +func (x *ImportComponentConfigurationRequest) GetNewComponent() bool { + if x != nil { + return x.NewComponent + } + return false +} + +func (x *ImportComponentConfigurationRequest) GetUseVersioning() bool { + if x != nil { + return x.UseVersioning + } + return false +} + +type ImportComponentConfigurationResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ExistingComponentUpdated bool `protobuf:"varint,1,opt,name=existingComponentUpdated,proto3" json:"existingComponentUpdated,omitempty"` + ExistingEntryUpdated bool `protobuf:"varint,2,opt,name=existingEntryUpdated,proto3" json:"existingEntryUpdated,omitempty"` + NewTimestamp int64 `protobuf:"varint,3,opt,name=newTimestamp,proto3" json:"newTimestamp,omitempty"` +} + +func (x *ImportComponentConfigurationResponse) Reset() { + *x = ImportComponentConfigurationResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImportComponentConfigurationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImportComponentConfigurationResponse) ProtoMessage() {} + +func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. +func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{13} +} + +func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { + if x != nil { + return x.ExistingComponentUpdated + } + return false +} + +func (x *ImportComponentConfigurationResponse) GetExistingEntryUpdated() bool { + if x != nil { + return x.ExistingEntryUpdated + } + return false +} + +func (x *ImportComponentConfigurationResponse) GetNewTimestamp() int64 { + if x != nil { + return x.NewTimestamp + } + return 0 +} + var File_protos_apricot_proto protoreflect.FileDescriptor var file_protos_apricot_proto_rawDesc = []byte{ @@ -693,50 +1025,120 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x77, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, - 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, - 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, - 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xed, 0x03, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x01, + 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, + 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, - 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, - 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, + 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, + 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, + 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, + 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, + 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, + 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x10, 0x07, 0x32, 0xf1, 0x06, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, + 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -752,45 +1154,61 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_protos_apricot_proto_goTypes = []interface{}{ - (RunType)(0), // 0: apricot.RunType - (*Empty)(nil), // 1: apricot.Empty - (*ComponentQuery)(nil), // 2: apricot.ComponentQuery - (*ComponentRequest)(nil), // 3: apricot.ComponentRequest - (*ComponentResponse)(nil), // 4: apricot.ComponentResponse - (*RunNumberResponse)(nil), // 5: apricot.RunNumberResponse - (*StringMap)(nil), // 6: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 7: apricot.RawGetRecursiveRequest - (*GetRuntimeEntryRequest)(nil), // 8: apricot.GetRuntimeEntryRequest - (*SetRuntimeEntryRequest)(nil), // 9: apricot.SetRuntimeEntryRequest - nil, // 10: apricot.ComponentRequest.VarStackEntry - nil, // 11: apricot.StringMap.StringMapEntry + (RunType)(0), // 0: apricot.RunType + (*Empty)(nil), // 1: apricot.Empty + (*ComponentQuery)(nil), // 2: apricot.ComponentQuery + (*ComponentRequest)(nil), // 3: apricot.ComponentRequest + (*ComponentResponse)(nil), // 4: apricot.ComponentResponse + (*RunNumberResponse)(nil), // 5: apricot.RunNumberResponse + (*StringMap)(nil), // 6: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 7: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 8: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 9: apricot.SetRuntimeEntryRequest + (*ComponentEntriesQuery)(nil), // 10: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 11: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 12: apricot.ComponentEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 13: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 14: apricot.ImportComponentConfigurationResponse + nil, // 15: apricot.ComponentRequest.VarStackEntry + nil, // 16: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 10, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 11, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry - 1, // 4: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty - 1, // 5: apricot.Apricot.GetDefaults:input_type -> apricot.Empty - 1, // 6: apricot.Apricot.GetVars:input_type -> apricot.Empty - 3, // 7: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 7, // 8: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 8, // 9: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 9, // 10: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 5, // 11: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 6, // 12: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 6, // 13: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 14: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 4, // 15: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 4, // 16: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 17: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 11, // [11:18] is the sub-list for method output_type - 4, // [4:11] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 15, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 16, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType + 10, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery + 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty + 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty + 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty + 7, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 8, // 11: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 9, // 12: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 1, // 13: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 11, // 14: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 15: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 16: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 13, // 17: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 5, // 18: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 6, // 19: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 6, // 20: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 21: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 4, // 22: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 23: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 12, // 24: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 12, // 25: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 12, // 26: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 27: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 14, // 28: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 18, // [18:29] is the sub-list for method output_type + 7, // [7:18] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_protos_apricot_proto_init() } @@ -907,18 +1325,82 @@ func file_protos_apricot_proto_init() { return nil } } + file_protos_apricot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentEntriesQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListComponentEntriesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentEntriesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImportComponentConfigurationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImportComponentConfigurationResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_apricot_proto_msgTypes[2].OneofWrappers = []interface{}{ (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } + file_protos_apricot_proto_msgTypes[10].OneofWrappers = []interface{}{ + (*ListComponentEntriesRequest_Path)(nil), + (*ListComponentEntriesRequest_Query)(nil), + } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 11, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 340bd9ac5..8c7273b29 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -32,10 +32,17 @@ service Apricot { rpc NewRunNumber(Empty) returns (RunNumberResponse) {} rpc GetDefaults(Empty) returns (StringMap) {} rpc GetVars(Empty) returns (StringMap) {} - rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} + + rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} + rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} + rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} + + rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} + + rpc ImportComponentConfiguration(ImportComponentConfigurationRequest) returns (ImportComponentConfigurationResponse) {} } enum RunType { @@ -94,3 +101,34 @@ message SetRuntimeEntryRequest { string key = 2; string value = 3; } + +message ComponentEntriesQuery { + string component = 1; + RunType runType = 2; + string machineRole = 3; +} + +message ListComponentEntriesRequest { + oneof queryPath { + string path = 1; + ComponentEntriesQuery query = 2; + } + bool includeTimestamps = 3; +} + +message ComponentEntriesResponse { + repeated string payload = 1; +} + +message ImportComponentConfigurationRequest { + ComponentQuery query = 1; + string payload = 2; + bool newComponent = 3; + bool useVersioning = 4; +} + +message ImportComponentConfigurationResponse { + bool existingComponentUpdated = 1; + bool existingEntryUpdated = 2; + int64 newTimestamp = 3; +} \ No newline at end of file diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 96f0a0b4d..982ef896b 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -20,10 +20,14 @@ type ApricotClient interface { NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) - GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) + ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) + ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) + ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) + GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) } type apricotClient struct { @@ -61,15 +65,6 @@ func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.Cal return out, nil } -func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { - out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) @@ -97,6 +92,51 @@ func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntry return out, nil } +func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { + out := new(ComponentEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { + out := new(ComponentEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponentEntries", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { + out := new(ComponentEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponentEntryHistory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { + out := new(ComponentResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) { + out := new(ImportComponentConfigurationResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ImportComponentConfiguration", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApricotServer is the server API for Apricot service. // All implementations should embed UnimplementedApricotServer // for forward compatibility @@ -104,10 +144,14 @@ type ApricotServer interface { NewRunNumber(context.Context, *Empty) (*RunNumberResponse, error) GetDefaults(context.Context, *Empty) (*StringMap, error) GetVars(context.Context, *Empty) (*StringMap, error) - GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) + ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) + ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) + ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) + GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) + ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) } // UnimplementedApricotServer should be embedded to have forward compatible implementations. @@ -123,9 +167,6 @@ func (UnimplementedApricotServer) GetDefaults(context.Context, *Empty) (*StringM func (UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVars not implemented") } -func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") -} func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") } @@ -135,6 +176,21 @@ func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEn func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") } +func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListComponents not implemented") +} +func (UnimplementedApricotServer) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListComponentEntries not implemented") +} +func (UnimplementedApricotServer) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListComponentEntryHistory not implemented") +} +func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") +} +func (UnimplementedApricotServer) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ImportComponentConfiguration not implemented") +} // UnsafeApricotServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ApricotServer will @@ -201,24 +257,6 @@ func _Apricot_GetVars_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } -func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ComponentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetComponentConfiguration(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetComponentConfiguration", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RawGetRecursiveRequest) if err := dec(in); err != nil { @@ -273,6 +311,96 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ListComponents(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ListComponents", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ListComponents(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_ListComponentEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListComponentEntriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ListComponentEntries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ListComponentEntries", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ListComponentEntries(ctx, req.(*ListComponentEntriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_ListComponentEntryHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentQuery) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ListComponentEntryHistory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ListComponentEntryHistory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ListComponentEntryHistory(ctx, req.(*ComponentQuery)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetComponentConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetComponentConfiguration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ImportComponentConfigurationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ImportComponentConfiguration(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ImportComponentConfiguration", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ImportComponentConfiguration(ctx, req.(*ImportComponentConfigurationRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Apricot_serviceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), @@ -289,10 +417,6 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "GetVars", Handler: _Apricot_GetVars_Handler, }, - { - MethodName: "GetComponentConfiguration", - Handler: _Apricot_GetComponentConfiguration_Handler, - }, { MethodName: "RawGetRecursive", Handler: _Apricot_RawGetRecursive_Handler, @@ -305,6 +429,26 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "SetRuntimeEntry", Handler: _Apricot_SetRuntimeEntry_Handler, }, + { + MethodName: "ListComponents", + Handler: _Apricot_ListComponents_Handler, + }, + { + MethodName: "ListComponentEntries", + Handler: _Apricot_ListComponentEntries_Handler, + }, + { + MethodName: "ListComponentEntryHistory", + Handler: _Apricot_ListComponentEntryHistory_Handler, + }, + { + MethodName: "GetComponentConfiguration", + Handler: _Apricot_GetComponentConfiguration_Handler, + }, + { + MethodName: "ImportComponentConfiguration", + Handler: _Apricot_ImportComponentConfiguration_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/apricot.proto", diff --git a/apricot/remote/client.go b/apricot/remote/client.go index c57bf226b..1bc56cf85 100644 --- a/apricot/remote/client.go +++ b/apricot/remote/client.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -26,135 +26,11 @@ package remote import ( "context" - "errors" - "fmt" - "net/url" - "time" apricotpb "github.com/AliceO2Group/Control/apricot/protos" - "github.com/AliceO2Group/Control/configuration" - "github.com/AliceO2Group/Control/configuration/componentcfg" "google.golang.org/grpc" ) -const CALL_TIMEOUT = 30*time.Second - -type RemoteService struct { - remote rpcClient -} - -func NewService(configUri string) (svc configuration.Service, err error) { - var parsedUri *url.URL - parsedUri, err = url.Parse(configUri) - if err != nil { - return nil, err - } - if parsedUri.Scheme != "apricot" { - return nil, errors.New("remote configuration URI scheme must be apricot://") - } - endpoint := parsedUri.Host - - cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) - - rpcClient := newRpcClient(cxt, cancel, endpoint) - if rpcClient == nil { - return nil, fmt.Errorf("cannot dial apricot service at %s", endpoint) - } - return &RemoteService{ - remote: *rpcClient, - }, nil -} - -func (c *RemoteService) NewRunNumber() (runNumber uint32, err error) { - var response *apricotpb.RunNumberResponse - response, err = c.remote.NewRunNumber(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) - if err != nil { - return 0, err - } - return response.GetRunNumber(), nil -} - -func (c *RemoteService) GetDefaults() map[string]string { - response, err := c.remote.GetDefaults(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) - if err != nil { - return nil - } - return response.GetStringMap() -} - -func (c *RemoteService) GetVars() map[string]string { - response, err := c.remote.GetVars(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) - if err != nil { - return nil - } - return response.GetStringMap() -} - -func (c *RemoteService) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { - return c.getComponentConfigurationInternal(query, false, nil) -} - -func (c *RemoteService) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { - return c.getComponentConfigurationInternal(query, true, varStack) -} - -func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Query, processTemplate bool, varStack map[string]string) (payload string, err error) { - var response *apricotpb.ComponentResponse - componentQuery := &apricotpb.ComponentQuery{ - Component: query.Component, - RunType: query.Flavor, - MachineRole: query.Rolename, - Entry: query.EntryKey, - Timestamp: query.Timestamp, - } - request := &apricotpb.ComponentRequest{ - QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, - ProcessTemplate: processTemplate, - VarStack: varStack, - } - response, err = c.remote.GetComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return "", err - } - return response.GetPayload(), nil -} - -func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) { - var response *apricotpb.ComponentResponse - request := &apricotpb.RawGetRecursiveRequest{RawPath: path} - response, err = c.remote.RawGetRecursive(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return "", err - } - return response.GetPayload(), nil -} - -func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { - var response *apricotpb.ComponentResponse - request := &apricotpb.GetRuntimeEntryRequest{ - Component: component, - Key: key, - } - response, err = c.remote.GetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return "", err - } - return response.GetPayload(), nil -} - -func (c *RemoteService) SetRuntimeEntry(component string, key string, value string) (err error) { - request := &apricotpb.SetRuntimeEntryRequest{ - Component: component, - Key: key, - Value: value, - } - _, err = c.remote.SetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return err - } - return nil -} - type rpcClient struct { apricotpb.ApricotClient conn *grpc.ClientConn diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 2a6ea9736..63f634fd1 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -100,20 +100,20 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico return nil, E_BAD_INPUT } - var path *componentcfg.Query + var query *componentcfg.Query if rawPath := request.GetPath(); len(rawPath) > 0 { var err error - path, err = componentcfg.NewQuery(rawPath) + query, err = componentcfg.NewQuery(rawPath) if err != nil { return nil, E_BAD_INPUT } - } else if query := request.GetQuery(); query != nil { - path = &componentcfg.Query{ - Component: query.Component, - Flavor: query.RunType, - Rolename: query.MachineRole, - EntryKey: query.Entry, - Timestamp: query.Timestamp, + } else if reqQuery := request.GetQuery(); reqQuery != nil { + query = &componentcfg.Query{ + Component: reqQuery.Component, + RunType: reqQuery.RunType, + RoleName: reqQuery.MachineRole, + EntryKey: reqQuery.Entry, + Timestamp: reqQuery.Timestamp, } } else { return nil, E_BAD_INPUT @@ -122,9 +122,9 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico var payload string var err error if request.ProcessTemplate { - payload, err = m.service.GetAndProcessComponentConfiguration(path, request.GetVarStack()) + payload, err = m.service.GetAndProcessComponentConfiguration(query, request.GetVarStack()) } else { - payload, err = m.service.GetComponentConfiguration(path) + payload, err = m.service.GetComponentConfiguration(query) } if err != nil { @@ -133,7 +133,7 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() } -func (m *RpcServer) GetRuntimeEntry(ctx context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { +func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } @@ -149,7 +149,7 @@ func (m *RpcServer) GetRuntimeEntry(ctx context.Context, request *apricotpb.GetR return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() } -func (m *RpcServer) SetRuntimeEntry(ctx context.Context, request *apricotpb.SetRuntimeEntryRequest) (*apricotpb.Empty, error) { +func (m *RpcServer) SetRuntimeEntry(_ context.Context, request *apricotpb.SetRuntimeEntryRequest) (*apricotpb.Empty, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } @@ -165,7 +165,7 @@ func (m *RpcServer) SetRuntimeEntry(ctx context.Context, request *apricotpb.SetR return &apricotpb.Empty{}, E_OK.Err() } -func (m *RpcServer) RawGetRecursive(ctx context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { +func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } @@ -182,6 +182,110 @@ func (m *RpcServer) RawGetRecursive(ctx context.Context, request *apricotpb.RawG return &apricotpb.ComponentResponse{Payload: payload}, nil } +func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + entries, err := m.service.ListComponents() + if err != nil { + return nil, err + } + response := &apricotpb.ComponentEntriesResponse{Payload: entries} + return response, nil +} + +func (m *RpcServer) ListComponentEntries(_ context.Context, request *apricotpb.ListComponentEntriesRequest) (*apricotpb.ComponentEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + var query *componentcfg.EntriesQuery + if rawPath := request.GetPath(); len(rawPath) > 0 { + var err error + query, err = componentcfg.NewEntriesQuery(rawPath) + if err != nil { + return nil, E_BAD_INPUT + } + } else if reqQuery := request.GetQuery(); reqQuery != nil { + query = &componentcfg.EntriesQuery{ + Component: reqQuery.Component, + RunType: reqQuery.RunType, + RoleName: reqQuery.MachineRole, + } + } else { + return nil, E_BAD_INPUT + } + + entries, err := m.service.ListComponentEntries(query, request.IncludeTimestamps) + if err != nil { + return nil, err + } + response := &apricotpb.ComponentEntriesResponse{Payload: entries} + return response, nil +} + +func (m *RpcServer) ListComponentEntryHistory(_ context.Context, query *apricotpb.ComponentQuery) (*apricotpb.ComponentEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if query == nil { + return nil, E_BAD_INPUT + } + + cQuery := &componentcfg.Query{ + Component: query.Component, + RunType: query.RunType, + RoleName: query.MachineRole, + EntryKey: query.Entry, + Timestamp: "", + } + + entries, err := m.service.ListComponentEntryHistory(cQuery) + if err != nil { + return nil, err + } + response := &apricotpb.ComponentEntriesResponse{Payload: entries} + return response, nil +} + +func (m *RpcServer) ImportComponentConfiguration(_ context.Context, request *apricotpb.ImportComponentConfigurationRequest) (*apricotpb.ImportComponentConfigurationResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + pushQuery := &componentcfg.Query{ + Component: request.Query.Component, + RunType: request.Query.RunType, + RoleName: request.Query.MachineRole, + EntryKey: request.Query.Entry, + Timestamp: request.Query.Timestamp, + } + + existingComponentUpdated, existingEntryUpdated, newTimestamp, err := m.service.ImportComponentConfiguration(pushQuery, request.Payload, request.NewComponent, request.UseVersioning) + if err != nil { + return nil, err + } + response := &apricotpb.ImportComponentConfigurationResponse{ + ExistingComponentUpdated: existingComponentUpdated, + ExistingEntryUpdated: existingEntryUpdated, + NewTimestamp: newTimestamp, + } + return response, nil +} + func (m *RpcServer) logMethod() { if !viper.GetBool("verbose") { return diff --git a/apricot/remote/service.go b/apricot/remote/service.go new file mode 100644 index 000000000..19607b288 --- /dev/null +++ b/apricot/remote/service.go @@ -0,0 +1,231 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package remote + +import ( + "context" + "errors" + "fmt" + "net/url" + "time" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "google.golang.org/grpc" +) + +const CALL_TIMEOUT = 30*time.Second + +type RemoteService struct { + cli rpcClient +} + +func NewService(configUri string) (svc configuration.Service, err error) { + var parsedUri *url.URL + parsedUri, err = url.Parse(configUri) + if err != nil { + return nil, err + } + if parsedUri.Scheme != "apricot" { + return nil, errors.New("remote configuration URI scheme must be apricot://") + } + endpoint := parsedUri.Host + + cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) + + rpcClient := newRpcClient(cxt, cancel, endpoint) + if rpcClient == nil { + return nil, fmt.Errorf("cannot dial apricot service at %s", endpoint) + } + return &RemoteService{ + cli: *rpcClient, + }, nil +} + +func (c *RemoteService) NewRunNumber() (runNumber uint32, err error) { + var response *apricotpb.RunNumberResponse + response, err = c.cli.NewRunNumber(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return 0, err + } + return response.GetRunNumber(), nil +} + +func (c *RemoteService) GetDefaults() map[string]string { + response, err := c.cli.GetDefaults(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil + } + return response.GetStringMap() +} + +func (c *RemoteService) GetVars() map[string]string { + response, err := c.cli.GetVars(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil + } + return response.GetStringMap() +} + +func (c *RemoteService) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + return c.getComponentConfigurationInternal(query, false, nil) +} + +func (c *RemoteService) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + return c.getComponentConfigurationInternal(query, true, varStack) +} + +func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Query, processTemplate bool, varStack map[string]string) (payload string, err error) { + var response *apricotpb.ComponentResponse + componentQuery := &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + Entry: query.EntryKey, + Timestamp: query.Timestamp, + } + request := &apricotpb.ComponentRequest{ + QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, + ProcessTemplate: processTemplate, + VarStack: varStack, + } + response, err = c.cli.GetComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) { + var response *apricotpb.ComponentResponse + request := &apricotpb.RawGetRecursiveRequest{RawPath: path} + response, err = c.cli.RawGetRecursive(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { + var response *apricotpb.ComponentResponse + request := &apricotpb.GetRuntimeEntryRequest{ + Component: component, + Key: key, + } + response, err = c.cli.GetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil +} + +func (c *RemoteService) SetRuntimeEntry(component string, key string, value string) (err error) { + request := &apricotpb.SetRuntimeEntryRequest{ + Component: component, + Key: key, + Value: value, + } + _, err = c.cli.SetRuntimeEntry(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return err + } + return nil +} + +func (c *RemoteService) ListComponents() (components []string, err error) { + var response *apricotpb.ComponentEntriesResponse + response, err = c.cli.ListComponents(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return + } + components = response.GetPayload() + return +} + +func (c *RemoteService) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { + var response *apricotpb.ComponentEntriesResponse + entriesQuery := &apricotpb.ComponentEntriesQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + } + request := &apricotpb.ListComponentEntriesRequest{ + QueryPath: &apricotpb.ListComponentEntriesRequest_Query{Query: entriesQuery}, + IncludeTimestamps: showLatestTimestamp, + } + + response, err = c.cli.ListComponentEntries(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return + } + entries = response.GetPayload() + return +} + +func (c *RemoteService) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { + var response *apricotpb.ComponentEntriesResponse + request := &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + Entry: query.EntryKey, + Timestamp: "", + } + + response, err = c.cli.ListComponentEntryHistory(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return + } + entries = response.GetPayload() + return +} + +func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { + var response *apricotpb.ImportComponentConfigurationResponse + request := &apricotpb.ImportComponentConfigurationRequest{ + Query: &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + Entry: query.EntryKey, + Timestamp: query.Timestamp, + }, + Payload: payload, + NewComponent: newComponent, + UseVersioning: useVersioning, + } + + + response, err = c.cli.ImportComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return + } + + existingComponentUpdated = response.ExistingComponentUpdated + existingEntryUpdated = response.ExistingEntryUpdated + newTimestamp = response.NewTimestamp + return +} diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go index 5da96e74d..325383f22 100644 --- a/coconut/cmd/configuration_history.go +++ b/coconut/cmd/configuration_history.go @@ -32,17 +32,18 @@ import ( var configurationHistoryCmd = &cobra.Command{ Use: "history ", Aliases: []string{"h"}, - Example: `coconut conf history -coconut conf history + Example: `coconut conf history coconut conf history ///`, Short: "List all existing entries with timestamps of a specified component in Consul", - Long: `The configuration history command returns all entries with -all of their associated timestamps or returns all timestamps for a specified component and entry`, + Long: `The configuration history command returns all timestamps for a specified component +and entry`, Run: configuration.WrapCall(configuration.History), - Args: cobra.RangeArgs(0, 3), + Args: cobra.RangeArgs(1, 2), } func init() { configurationCmd.AddCommand(configurationHistoryCmd) configurationHistoryCmd.Flags().StringP("output", "o", "yaml", "output format for the returned entries (yaml/json)") + configurationHistoryCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") + configurationHistoryCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") } diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go index f757f68f7..6a42d3fb4 100644 --- a/coconut/cmd/configuration_import.go +++ b/coconut/cmd/configuration_import.go @@ -46,7 +46,7 @@ the configuration file to Consul under the // path. Supported configuration file types are JSON, YAML, TOML and INI, and their file extensions are recognized automatically.`, Run: configuration.WrapCall(configuration.Import), - Args: cobra.RangeArgs(1, 4), + Args: cobra.RangeArgs(2, 3), } func init() { @@ -54,4 +54,6 @@ func init() { configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") configurationImportCmd.Flags().Bool("no-versioning", false, "create an unversioned configuration entry (no timestamps are stored)") + configurationImportCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") + configurationImportCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") } diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 7ee168b79..465811868 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -37,6 +37,7 @@ coconut conf show -t coconut conf show /// coconut conf show /// -t coconut conf show ///@ +coconut conf show -r -l -t ' coconut conf show -s -e '{"key1": "value1", "key2": "value2"}'`, Short: "Show configuration for the component and entry specified", Long: `The configuration show command returns the most recent @@ -49,6 +50,8 @@ It can also return a specific revision, requested with the --timestamp/-t flag`, func init() { configurationCmd.AddCommand(configurationShowCmd) configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") + configurationShowCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") + configurationShowCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") configurationShowCmd.Flags().BoolP("simulate", "s", false, "simulate runtime template processing on the configuration payload") // The following only applies if simulate is set: configurationShowCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 34d4ec375..637fc5796 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018-2020 CERN and copyright holders of ALICE O². + * Copyright 2018-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -32,7 +32,6 @@ import ( "fmt" "io" "os" - "sort" "strconv" "strings" "time" @@ -41,7 +40,7 @@ import ( apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/configuration/cfgbackend" + "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/briandowns/spinner" "github.com/naoina/toml" @@ -55,7 +54,7 @@ var log = logger.New(logrus.StandardLogger(), "coconut") type RunFunc func(*cobra.Command, []string) -type ConfigurationCall func(*cfgbackend.ConsulSource, *cobra.Command, []string, io.Writer) (error, int) +type CallFunc func(configuration.Service, *cobra.Command, []string, io.Writer) (error, int) const ( EC_ZERO = iota @@ -67,7 +66,7 @@ const ( EC_LOGIC_ERROR = iota // Logic/Output error ) -func WrapCall(call ConfigurationCall) RunFunc { +func WrapCall(call CallFunc) RunFunc { return func(cmd *cobra.Command, args []string) { endpoint := viper.GetString("config_endpoint") log.WithPrefix(cmd.Use). @@ -79,24 +78,14 @@ func WrapCall(call ConfigurationCall) RunFunc { s.Suffix = " working..." s.Start() - cfg, err := cfgbackend.NewConsulSource(strings.TrimPrefix(endpoint, "consul://")) - if err != nil { - var fields logrus.Fields - if logrus.GetLevel() == logrus.DebugLevel { - fields = logrus.Fields{"error": err} - } - log.WithPrefix(cmd.Use). - WithFields(fields). - Fatal("cannot query endpoint") - os.Exit(EC_CONNECTION_ERROR) - } + apricotServiceInstance := apricot.Instance() var out strings.Builder // redirect stdout to null, the only way to output is stdout := os.Stdout os.Stdout,_ = os.Open(os.DevNull) - err, code := call(cfg, cmd, args, &out) + err, code := call(apricotServiceInstance, cmd, args, &out) os.Stdout = stdout s.Stop() fmt.Print(out.String()) @@ -110,18 +99,24 @@ func WrapCall(call ConfigurationCall) RunFunc { } } -func Dump(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { +func Dump(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, EC_INVALID_ARGS } key := args[0] - data, err := cfg.GetRecursive(key) + dataJson, err := svc.RawGetRecursive(key) if err != nil { return err, EC_CONNECTION_ERROR } + var raw map[string]interface{} + err = json.Unmarshal([]byte(dataJson), &raw) + if err != nil { + return err, EC_LOGIC_ERROR + } + format, err := cmd.Flags().GetString("format") if err != nil { return err, EC_INVALID_ARGS @@ -130,11 +125,11 @@ func Dump(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. var output []byte switch strings.ToLower(format) { case "json": - output, err = json.MarshalIndent(data, "", " ") + output, err = json.MarshalIndent(raw, "", " ") case "yaml": - output, err = yaml.Marshal(data) + output, err = yaml.Marshal(raw) case "toml": - output, err = toml.Marshal(data) + output, err = toml.Marshal(raw) } if err != nil { log.WithField("error", err.Error()).Fatalf("cannot serialize subtree to %s", strings.ToLower(format)) @@ -147,39 +142,41 @@ func Dump(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. } // coconut conf list -func List(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - keyPrefix := componentcfg.ConfigComponentsPath +func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { useTimestamp := false if len(args) > 1 { return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , EC_INVALID_ARGS - } else { - // case with 0 or 1 args (+ optionally timestamp) - useTimestamp, err = cmd.Flags().GetBool("timestamp") - if err != nil { - return err, EC_INVALID_ARGS - } - if len(args) == 1 { - if !componentcfg.IsInputSingleValidWord(args[0]) { - return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS - } else { - keyPrefix += args[0] + "/" - } - } else if len(args) == 0 && useTimestamp { - return errors.New("to use flag `-t / --timestamp` please provide component name"), EC_INVALID_ARGS - } } - keys, err := cfg.GetKeysByPrefix(keyPrefix) + // we have 0 or 1 args (+ optionally timestamp) + useTimestamp, err = cmd.Flags().GetBool("timestamp") if err != nil { - return err, EC_CONNECTION_ERROR + return err, EC_INVALID_ARGS } - fmt.Fprintf(o, "keys:\n%s", strings.Join(keys, "\n")) - components, err, code := getListOfComponentsAndOrWithTimestamps(keys, keyPrefix, useTimestamp) - if err != nil { - return err, code + if len(args) == 0 { // 0 args: conf list + if useTimestamp { + return errors.New("to use flag `-t / --timestamp` please provide component name"), EC_INVALID_ARGS + } + components, _ := svc.ListComponents() + output, err := formatListOutput(cmd, components) + if err != nil { + return err, EC_LOGIC_ERROR + } + _, _ = fmt.Fprintln(o, string(output)) + return nil, EC_ZERO + } + + // 1 arg: conf list + if !componentcfg.IsInputSingleValidWord(args[0]) { + return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } - fmt.Fprintf(o, "\ncomponents:\n%s", strings.Join(components, "\n")) + + components, _ := svc.ListComponentEntries(&componentcfg.EntriesQuery{ + Component: args[0], + RunType: apricotpb.RunType_NULL, + RoleName: "", + }, useTimestamp) output, err := formatListOutput(cmd, components) if err != nil { @@ -189,90 +186,23 @@ func List(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. return nil, EC_ZERO } -func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - var timestamp string - var query = &componentcfg.Query{} - - if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS - } - - timestamp, err = cmd.Flags().GetString("timestamp") +// coconut conf show +func Show(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + // Allowed inputs: + // # len(args) == 1: + // coconut conf show component/RUNTYPE/role/entry[@timestamp] + // # len(args) == 2: + // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] + // # ↑ if runtype/role is empty, we default to ANY/any + // # if it's e.g. SOME_RUNTYPE/some_role we just build the path for now; + // # TODO: advanced query expressions come later + + var query *componentcfg.Query + query, err = queryFromFlags(cmd, args, true /* allow timestamp in query */) if err != nil { return err, EC_INVALID_ARGS } - - switch len(args) { - case 1: // coconut conf show component/RUNTYPE/role/entry[@timestamp] - if componentcfg.IsInputCompEntryTsValid(args[0] ) { - if strings.Contains(args[0], "@") { - // coconut conf show c/R/r/e@timestamp - if timestamp != "" { - err = errors.New("flag `-t / --timestamp` must not be provided when using format ///@") - return err, EC_INVALID_ARGS - } - query, err = componentcfg.NewQuery(args[0]) - if err != nil { - return err, EC_INVALID_ARGS - } - timestamp = query.Timestamp - } else if strings.Contains(args[0], "/") { - // coconut conf show c/R/r/e # no timestamp - query, err = componentcfg.NewQuery(args[0]) - if err != nil { - return err, EC_INVALID_ARGS - } - if timestamp == "" { - timestamp = query.Timestamp - } - } - } else { - // coconut conf show component || coconut conf show component@timestamp - return errors.New("please provide entry name"), EC_INVALID_ARGS - } - case 2: // coconut conf show component entry - if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { - return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS - } else { - query.Component = args[0] - query.EntryKey = args[1] - query.Flavor = apricotpb.RunType_ANY - query.Rolename = "any" - } - } - - fullKeyToQuery := query.AbsoluteWithoutTimestamp() - - if timestamp == "" { - // No timestamp was passed, either via -t or @ - // We need to ascertain whether the required entry is versioned - // or unversioned. - keyPrefix := query.AbsoluteWithoutTimestamp() - if cfg.IsDir(keyPrefix) { - // The requested path is a Consul folder, so we should - // look inside to find the latest timestamp. - keys, err := cfg.GetKeysByPrefix(keyPrefix) - if err != nil { - return err, EC_CONNECTION_ERROR - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - return err, EC_EMPTY_DATA - } - fullKeyToQuery += componentcfg.SEPARATOR + timestamp - } - // Otherwise, the requested path is not a Consul folder, so it must - // be a plain unversioned entry. - // Therefore the fullKeyToQuery is ok and there's nothing to do. - } else { - // A timestamp was passed, either via -t or @ - // We can safely append it to the full query path. - fullKeyToQuery += componentcfg.SEPARATOR + timestamp - } - query.Timestamp = timestamp - - // At this point we know what to query, either fullKeyToQuery - // for a raw configuration.ConsulSource query, or a + // At this point we know what to query, thanks to a // componentcfg.Query that can be fed to configuration.Instance(). var( cfgPayload string @@ -302,140 +232,68 @@ func Show(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io. return err, EC_INVALID_ARGS } - fmt.Fprintf(o,"%s", query.Path()) - cfgPayload, err = apricot.Instance().GetAndProcessComponentConfiguration(query, extraVarsMap) - if err != nil { - return err, EC_CONNECTION_ERROR - } + cfgPayload, err = svc.GetAndProcessComponentConfiguration(query, extraVarsMap) } else { // No template processing simulation requested, getting raw payload - cfgPayload, err = cfg.Get(fullKeyToQuery) - if err != nil { - return err, EC_CONNECTION_ERROR - } - if cfgPayload == "" { - return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA - } + cfgPayload, err = svc.GetComponentConfiguration(query) } + if err != nil { + return err, EC_CONNECTION_ERROR + } + if cfgPayload == "" { + return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA + } + _, _ = fmt.Fprintln(o, cfgPayload) return nil, EC_ZERO } -func History(cfg *cfgbackend.ConsulSource, _ *cobra.Command, args []string, o io.Writer)(err error, code int) { - p := &componentcfg.Query{} - - if len(args) < 1 || len(args) > 2 { - return errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))), EC_INVALID_ARGS - } - switch len(args) { - case 1: - if componentcfg.IsInputSingleValidWord(args[0]) { - p.Component = args[0] - } else if componentcfg.IsInputCompEntryTsValid(args[0]) && !strings.Contains(args[0], "@"){ - p, err = componentcfg.NewQuery(args[0]) - if err != nil { - return err, EC_INVALID_ARGS - } - } else { - return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS - } - case 2: - if componentcfg.IsInputSingleValidWord(args[0]) && componentcfg.IsInputSingleValidWord(args[1]) { - p.Component = args[0] - p.EntryKey = args[1] - p.Flavor = apricotpb.RunType_ANY - p.Rolename = "any" - } else { - return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS - } +func History(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { + var query *componentcfg.Query + query, err = queryFromFlags(cmd, args, false) + if err != nil { + return err, EC_INVALID_ARGS } - fullKeyToQuery := p.AbsoluteWithoutTimestamp() - var keys sort.StringSlice - keys , err = cfg.GetKeysByPrefix(fullKeyToQuery) + var entries []string + entries, err = svc.ListComponentEntryHistory(query) if err != nil { return err, EC_CONNECTION_ERROR } - if len(keys) == 0 { - return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA - } else { - if p.EntryKey != "" { - sort.Sort(sort.Reverse(keys)) - drawTableHistoryConfigs([]string{}, keys, 0, o) - } else { - maxLen := getMaxLenOfKey(keys) - var currentKeys sort.StringSlice - - entry := p.EntryKey - - for _, value := range keys { - var thisPath *componentcfg.Query - thisPath, err = componentcfg.NewQuery(value) - if err != nil { - continue - } - - if thisPath.EntryKey == entry { - currentKeys = append(currentKeys, value) - } else { - _, _ = fmt.Fprintln(o, "- "+entry) - sort.Sort(sort.Reverse(currentKeys)) //sort in reverse of timestamps - drawTableHistoryConfigs([]string{}, currentKeys, maxLen, o) - currentKeys = []string{value} - entry = thisPath.EntryKey - } - } - _, _ = fmt.Fprintln(o, "- "+entry) - drawTableHistoryConfigs([]string{}, currentKeys, maxLen, o) - } + + var output []byte + output, err = formatListOutput(cmd, entries) + if err != nil { + return err, EC_LOGIC_ERROR } + _, _ = fmt.Fprintln(o, string(output)) + return nil, 0 } -func Import(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { useNewComponent, err := cmd.Flags().GetBool("new-component") if err != nil { return err, EC_INVALID_ARGS } - useExtension, err := cmd.Flags().GetString("format") + useNoVersion, err := cmd.Flags().GetBool("no-versioning") if err != nil { return err, EC_INVALID_ARGS } - useNoVersion, err := cmd.Flags().GetBool("no-versioning") + useExtension, err := cmd.Flags().GetString("format") if err != nil { return err, EC_INVALID_ARGS } - // Parse and Format input arguments - var filePath string - var p = &componentcfg.Query{} - - if len(args) < 2 || len(args) > 3 { - return errors.New(fmt.Sprintf("accepts 2 or 3 args but received %d", len(args))), EC_INVALID_ARGS - } else { - switch len(args) { - case 2: // coconut conf import component/RUNTYPE/role/entry filepath - p, err = componentcfg.NewQuery(args[0]) - if err != nil { - return err, EC_INVALID_ARGS - } - filePath = args[1] - case 3: // coconut conf import component entry filepath # ANY/any assumed - if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { - err = errors.New(EC_INVALID_ARGS_MSG) - } else { - p.Component = args[0] - p.EntryKey = args[1] - p.Rolename = "any" - p.Flavor = apricotpb.RunType_ANY - filePath = args[2] - } - } - if err != nil { - return err, EC_INVALID_ARGS - } + var pushQuery *componentcfg.Query + // The last argument is always assumed to be the input file, so we must exclude it + queryArgs := args[:len(args)-1] // we can do this because it's known that len(args)>0 + pushQuery, err = queryFromFlags(cmd, queryArgs, false /* no timestamps in a push query*/) + if err != nil { + return err, EC_INVALID_ARGS } + filePath := args[len(args)-1] fileParts := strings.Split(filePath, ".") extension := "" @@ -450,83 +308,35 @@ func Import(cfg *cfgbackend.ConsulSource, cmd *cobra.Command, args []string, o i extension = strings.ToUpper(useExtension) } - keys, err := cfg.GetKeysByPrefix("") - if err != nil { - return err, EC_CONNECTION_ERROR - } - - components := componentcfg.GetComponentsMapFromKeysList(keys) - - componentExist := components[p.Component] - if !componentExist && !useNewComponent { - componentMsg := "" - for key := range components { - componentMsg += "\n- " + key - } - return errors.New("component " + p.Component + " does not exist. " + - "Available components in configuration database:" + componentMsg + - "\nTo create a new component, see flag --new-component/-n" ), - EC_INVALID_ARGS - } - if componentExist && useNewComponent { - return errors.New("invalid use of flag --new-component/-n: component " + red(p.Component) + " already exists"), EC_INVALID_ARGS - } - - entryExists := false - if !useNewComponent { - entriesMap := componentcfg.GetEntriesMapOfComponentFromKeysList(p.Component, p.Flavor, p.Rolename, keys) - entryExists = entriesMap[p.EntryKey] - } - - fileContent, err := getFileContent(filePath) + var payload []byte + payload, err = getFileContent(filePath) if err != nil { return err, EC_LOGIC_ERROR } - // Temporary workaround to allow no-versioning - latestTimestamp, err := componentcfg.GetLatestTimestamp(keys, p) + var existingComponentUpdated, existingEntryUpdated bool + var newTimestamp int64 + existingComponentUpdated, existingEntryUpdated, newTimestamp, err = svc.ImportComponentConfiguration(pushQuery, string(payload), useNewComponent, !useNoVersion) if err != nil { - return err, EC_INVALID_ARGS - } - - if entryExists { - if (latestTimestamp != "0" && latestTimestamp != "") && useNoVersion { - // If a timestamp already exists in the entry specified by the user, than it cannot be used - return errors.New("Specified entry: '" + p.EntryKey + "' already contains versioned items. Please " + - "specify a different entry name"), EC_INVALID_ARGS - } - if (latestTimestamp == "0" || latestTimestamp == "") && !useNoVersion { - // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown - return errors.New("Specified entry: '" + p.EntryKey + "' already contains un-versioned items. Please " + - "specify a different entry name"), EC_INVALID_ARGS - } + return err, EC_LOGIC_ERROR } - timestamp := time.Now().Unix() - fullKey := p.AbsoluteWithoutTimestamp() - toPrintKey := red(p.Component) + componentcfg.SEPARATOR + - blue(p.Flavor) + componentcfg.SEPARATOR + - red(p.Rolename) + componentcfg.SEPARATOR + - blue(p.EntryKey) - + toPrintKey := red(pushQuery.Component) + componentcfg.SEPARATOR + + blue(pushQuery.RunType) + componentcfg.SEPARATOR + + red(pushQuery.RoleName) + componentcfg.SEPARATOR + + blue(pushQuery.EntryKey) if !useNoVersion { - fullKey += componentcfg.SEPARATOR + strconv.FormatInt(timestamp, 10) - toPrintKey += "@" + strconv.FormatInt(timestamp, 10) - } - - err = cfg.Put(fullKey, string(fileContent)) - if err != nil { - return + toPrintKey += "@" + strconv.FormatInt(newTimestamp, 10) } userMsg := "" - if !componentExist { - userMsg = "New component created: " + red(p.Component) + "\n" + if !existingComponentUpdated { + userMsg = "New component created: " + red(pushQuery.Component) + "\n" } - if !entryExists { - userMsg += "New entry created: " + blue(p.EntryKey) + "\n" + if !existingEntryUpdated { + userMsg += "New entry created: " + blue(pushQuery.EntryKey) + "\n" } else { - userMsg += "Entry updated: " + blue(p.EntryKey) + "\n" + userMsg += "Entry updated: " + blue(pushQuery.EntryKey) + "\n" } userMsg += "Configuration imported: " + toPrintKey diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index 63b3982c8..f243c74f5 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -26,19 +26,22 @@ package configuration import ( - "github.com/AliceO2Group/Control/configuration/componentcfg" - "github.com/fatih/color" - "github.com/olekukonko/tablewriter" - "github.com/spf13/cobra" "bytes" + "encoding/json" "errors" - "regexp" - "time" + "fmt" "io" "io/ioutil" "os" + "regexp" "strings" - "encoding/json" + "time" + + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/fatih/color" + "github.com/olekukonko/tablewriter" + "github.com/spf13/cobra" "gopkg.in/yaml.v3" ) @@ -49,51 +52,91 @@ var( inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) ) +// Utility function to create a componentcfg.Query from combos of args and flags +func queryFromFlags(cmd *cobra.Command, args []string, allowTimestampInQuery bool) (query *componentcfg.Query, err error) { + var timestamp string -func isInputCompEntryValid(input string) bool { - return inputComponentEntryRegex.MatchString(input) -} - -// Method to return a list of components, entries or entries with latest timestamp -// If no keys were passed an error and code exit 3 will be returned -func getListOfComponentsAndOrWithTimestamps(keys []string, keyPrefix string, useTimestamp bool)([]string, error, int) { - if len(keys) == 0 { - return []string{}, errors.New("no keys found"), EC_EMPTY_DATA + if len(args) < 1 || len(args) > 2 { + err = errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))) + return } - var components []string - componentsSet := make(map[string]string) - - for _, key := range keys { - componentsFullName := strings.TrimPrefix(key, keyPrefix) - componentParts := strings.Split(componentsFullName, "/") - componentTimestamp := componentParts[len(componentParts) - 1] + if allowTimestampInQuery { + timestamp, err = cmd.Flags().GetString("timestamp") + if err != nil { + return + } + } - if len(componentParts) == 1 { - componentTimestamp = "" + switch len(args) { + case 1: // coconut conf show component/RUNTYPE/role/entry[@timestamp] + if componentcfg.IsStringValidQueryPathWithOptionalTimestamp(args[0]) { + if strings.Contains(args[0], "@") { + // coconut conf show c/R/r/e@timestamp + if timestamp != "" { + err = errors.New("flag `-t / --timestamp` must not be provided when using format ///@") + return + } + query, err = componentcfg.NewQuery(args[0]) + if err != nil { + return + } + } else if strings.Contains(args[0], "/") { + // coconut conf show c/R/r/e [-t timestamp] # no timestamp, optionally as flag + query, err = componentcfg.NewQuery(args[0]) + if err != nil { + return + } + if timestamp != "" { + query.Timestamp = timestamp + } + } + } else { + err = errors.New("please provide entry name") + return } - if useTimestamp { - componentsFullName = strings.TrimSuffix(componentsFullName, "/" +componentTimestamp) + case 2: // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] + var runTypeS, machineRole string + var runType apricotpb.RunType + runTypeS, err = cmd.Flags().GetString("runtype") + if err != nil { + return + } + if len(runTypeS) == 0 { + runType = apricotpb.RunType_ANY // default value for empty runType input } else { - componentsFullName = componentParts[0] + runTypeI, ok := apricotpb.RunType_value[runTypeS] + if !ok { + err = fmt.Errorf("bad value for run type: %s", runTypeS) + return + } + runType = apricotpb.RunType(runTypeI) } - - if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0{ - componentsSet[componentsFullName] = componentTimestamp + machineRole, err = cmd.Flags().GetString("role") + if err != nil { + return + } + if len(machineRole) == 0 { + machineRole = "any" // default value for empty machine role input } - } - for key,value := range componentsSet { - if useTimestamp { - components = append(components, key+"@"+value) - components = append(components, key+"@"+value) + if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { + err = errors.New(EC_INVALID_ARGS_MSG) + return } else { - components = append(components, key) + query = &componentcfg.Query{ + Component: args[0], + RunType: runType, + RoleName: machineRole, + EntryKey: args[1], + Timestamp: timestamp, // could have been passed as -t or left empty, either is ok + } } } - return components, nil, EC_ZERO + return } + func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { table := tablewriter.NewWriter(o) if len(headers) > 0 { @@ -115,8 +158,8 @@ func drawTableHistoryConfigs(headers []string, history []string, max int, o io.W prettyTimestamp = red("unversioned") } configName := red(p.Component) + componentcfg.SEPARATOR + - blue(p.Flavor) + componentcfg.SEPARATOR + - red(p.Rolename) + componentcfg.SEPARATOR + + blue(p.RunType) + componentcfg.SEPARATOR + + red(p.RoleName) + componentcfg.SEPARATOR + blue(p.EntryKey) + "@" + p.Timestamp table.Append([]string{configName, prettyTimestamp}) } diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index 41b2ef043..f1d69a2d4 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * Author: George Raduta * @@ -44,10 +44,6 @@ const( ) -func IsInputCompEntryTsValid(input string) bool { - return inputFullRegex.MatchString(input) -} - // Checks whether the input string is a valid Consul path element on its own func IsInputSingleValidWord(input string) bool { return !strings.Contains(input, "/") && !strings.Contains(input, "@") diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index becc24557..57485ef68 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -33,28 +33,70 @@ import ( ) var ( - // component /RUNTYPE /rolename /entry @timestamp - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + // component /RUNTYPE /rolename /entry @timestamp + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + // component /RUNTYPE /rolename + inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) E_BAD_KEY = errors.New("bad component configuration key format") ) + +func IsStringValidQueryPathWithOptionalTimestamp(input string) bool { + return inputFullRegex.MatchString(input) +} +func IsStringValidEntriesQueryPath(input string) bool { + return inputEntriesRegex.MatchString(input) +} + +type EntriesQuery struct { + Component string + RunType apricotpb.RunType + RoleName string +} + +func NewEntriesQuery(path string) (p *EntriesQuery, err error) { + p = &EntriesQuery{ + Component: "", + RunType: apricotpb.RunType_NULL, + RoleName: "", + } + if IsStringValidEntriesQueryPath(path) { + // coconut conf list component/FLAVOR/rolename + params := strings.Split(path, SEPARATOR) + p.Component = params[0] + // Convert FLAVOR to pb-provided enum + typedRunType, ok := apricotpb.RunType_value[params[1]] + if !ok { + err = E_BAD_KEY + return + } + p.RunType = apricotpb.RunType(typedRunType) + p.RoleName = params[2] + } else { + err = E_BAD_KEY + return + } + + return p, nil +} + type Query struct { Component string - Flavor apricotpb.RunType - Rolename string - EntryKey string + RunType apricotpb.RunType + RoleName string + EntryKey string Timestamp string } func NewQuery(path string) (p *Query, err error) { p = &Query{ Component: "", - Flavor: apricotpb.RunType_NULL, - Rolename: "", + RunType: apricotpb.RunType_NULL, + RoleName: "", EntryKey: "", - Timestamp: "", + Timestamp: "", } - if IsInputCompEntryTsValid(path) { + if IsStringValidQueryPathWithOptionalTimestamp(path) { if strings.Contains(path, "@") { // coconut conf show component/FLAVOR/rolename/entry@timestamp arg := strings.Replace(path, "@", SEPARATOR, 1) @@ -66,8 +108,8 @@ func NewQuery(path string) (p *Query, err error) { err = E_BAD_KEY return } - p.Flavor = apricotpb.RunType(typedFlavor) - p.Rolename = params[2] + p.RunType = apricotpb.RunType(typedFlavor) + p.RoleName = params[2] p.EntryKey = params[3] p.Timestamp = params[4] } else if strings.Contains(path, SEPARATOR) { @@ -80,8 +122,8 @@ func NewQuery(path string) (p *Query, err error) { err = E_BAD_KEY return } - p.Flavor = apricotpb.RunType(typedFlavor) - p.Rolename = params[2] + p.RunType = apricotpb.RunType(typedFlavor) + p.RoleName = params[2] p.EntryKey = params[3] // and if we received a raw path (with / instead of @ before timestamp): if len(params) > 4 && len(params[4]) > 0 { @@ -113,7 +155,7 @@ func (p *Query) Raw() string { } func (p *Query) WithoutTimestamp() string { - return p.Component + SEPARATOR + apricotpb.RunType_name[int32(p.Flavor)] + SEPARATOR + p.Rolename + SEPARATOR + p.EntryKey + return p.Component + SEPARATOR + apricotpb.RunType_name[int32(p.RunType)] + SEPARATOR + p.RoleName + SEPARATOR + p.EntryKey } func (p *Query) AbsoluteRaw() string { diff --git a/configuration/service.go b/configuration/service.go index d874b6a65..f6697217c 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -41,5 +41,11 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + ListComponents() (components []string, err error) + ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) + ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) + + ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) + RawGetRecursive(path string) (string, error) } diff --git a/core/config.go b/core/config.go index 671748342..c965e3a5d 100644 --- a/core/config.go +++ b/core/config.go @@ -98,6 +98,7 @@ func setDefaults() error { func setFlags() error { pflag.Int("controlPort", viper.GetInt("controlPort"), "Port of control server") pflag.String("coreConfigurationUri", viper.GetString("coreConfigurationUri"), "URI of the Consul server or YAML configuration file, used for core configuration.") + pflag.String("coreWorkingDir", viper.GetString("coreWorkingDir"), "Path to a writable directory for runtime AliECS data") pflag.String("executor", viper.GetString("executor"), "Full path to executor binary on Mesos agents") pflag.Float64("executorCPU", viper.GetFloat64("executorCPU"), "CPU resources to consume per-executor") pflag.Float64("executorMemory", viper.GetFloat64("executorMemory"), "Memory resources (MB) to consume per-executor") diff --git a/core/core.go b/core/core.go index 105b4bc02..a7a39a728 100644 --- a/core/core.go +++ b/core/core.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2017-2018 CERN and copyright holders of ALICE O². + * Copyright 2017-2020 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify diff --git a/core/the/singleton.go b/core/the/singleton.go index cdbad3fad..651eda35e 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019 CERN and copyright holders of ALICE O². + * Copyright 2019-2021 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify From 96ef78305c6c00c6527ddd7e51d790a1db02909c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Jan 2021 02:51:38 +0100 Subject: [PATCH 0708/2352] [core][apricot] Rearrange how the core is initialized from configuration The only mandatory param for the core is now configServiceUri, which should generally be an apricot:// URL (or optionally consul:// for embedded Apricot instance). The general Consul runtime prefix is now /o2/runtime, replacing th old and inappropriate /o2/aliecs. coreConfigurationUri: param deprecated globalConfigurationUri: param replaced by configServiceUri coreConfigEntry: new param, defaults to "settings" The core now takes in the configServiceUri and automatically tries to initialize its viper flags from regular component configuration, with path aliecs/ANY/any/settings. This makes coreConfigurationUri obsolete. --- apricot/instance.go | 6 ++-- apricot/local/service.go | 4 +-- core/config.go | 75 ++++++++++++++++++++++++++-------------- 3 files changed, 55 insertions(+), 30 deletions(-) diff --git a/apricot/instance.go b/apricot/instance.go index 0e63f319c..fc64f2f94 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -86,14 +86,14 @@ func Instance() configuration.Service { ) if viper.IsSet("config_endpoint") { //coconut configUri = viper.GetString("config_endpoint") - } else if viper.IsSet("globalConfigurationUri"){ //core - configUri = viper.GetString("globalConfigurationUri") + } else if viper.IsSet("configServiceUri"){ //core + configUri = viper.GetString("configServiceUri") } else { //apricot configUri = viper.GetString("backendUri") } instance, err = newService(configUri) if err != nil { - log.WithField("globalConfigurationUri", configUri).Fatal("bad configuration URI") + log.WithField("configServiceUri", configUri).Fatal("bad configuration URI") } }) return instance diff --git a/apricot/local/service.go b/apricot/local/service.go index 2830da15a..ebd41865f 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -62,7 +62,7 @@ func NewService(uri string) (svc *Service, err error) { func (s *Service) NewRunNumber() (runNumber uint32, err error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.GetNextUInt32(filepath.Join(getConsulRuntimePrefix(),"run_number")) + return cSrc.GetNextUInt32(filepath.Join(getConsulRuntimePrefix(), "run_number")) } else { // Unsafe check-and-set, only for file backend var rnf string @@ -511,5 +511,5 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa func getConsulRuntimePrefix() string { // FIXME: this should not be hardcoded - return "o2/aliecs" + return "o2/runtime" } diff --git a/core/config.go b/core/config.go index c965e3a5d..11092ef67 100644 --- a/core/config.go +++ b/core/config.go @@ -25,6 +25,7 @@ package core import ( + "bytes" "errors" "fmt" "net/url" @@ -32,8 +33,11 @@ import ( "path/filepath" "strings" + "github.com/AliceO2Group/Control/apricot" + apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/product" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/spf13/pflag" "github.com/spf13/viper" @@ -50,7 +54,7 @@ func setDefaults() error { viper.Set("component", "core") viper.SetDefault("controlPort", 47102) - viper.SetDefault("coreConfigurationUri", "consul://127.0.0.1:8500") //TODO: TBD + viper.SetDefault("coreConfigurationUri", "") viper.SetDefault("consulBasePath", "o2/aliecs") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") @@ -89,7 +93,8 @@ func setDefaults() error { viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) - viper.SetDefault("globalConfigurationUri", "") //TODO: TBD + viper.SetDefault("configServiceUri", "apricot://localhost:47101") + viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") return nil @@ -97,16 +102,16 @@ func setDefaults() error { func setFlags() error { pflag.Int("controlPort", viper.GetInt("controlPort"), "Port of control server") - pflag.String("coreConfigurationUri", viper.GetString("coreConfigurationUri"), "URI of the Consul server or YAML configuration file, used for core configuration.") + pflag.String("coreConfigurationUri", viper.GetString("coreConfigurationUri"), "Consul URI or filesystem path to JSON/YAML configuration payload to initialize core settings [EXPERT SETTING]") pflag.String("coreWorkingDir", viper.GetString("coreWorkingDir"), "Path to a writable directory for runtime AliECS data") pflag.String("executor", viper.GetString("executor"), "Full path to executor binary on Mesos agents") pflag.Float64("executorCPU", viper.GetFloat64("executorCPU"), "CPU resources to consume per-executor") pflag.Float64("executorMemory", viper.GetFloat64("executorMemory"), "Memory resources (MB) to consume per-executor") - pflag.String("instanceName", viper.GetString("instanceName"), "User-visible name for this AliECS instance.") + pflag.String("instanceName", viper.GetString("instanceName"), "User-visible name for this AliECS instance") pflag.Duration("mesosApiTimeout", viper.GetDuration("mesosApiTimeout"), "Mesos scheduler API connection timeout") pflag.String("mesosAuthMode", viper.GetString("mesosAuthMode"), "Method to use for Mesos authentication; specify '"+schedutil.AuthModeBasic+"' for simple HTTP authentication") pflag.Bool("mesosCheckpoint", viper.GetBool("mesosCheckpoint"), "Enable/disable agent checkpointing for framework tasks (recover from agent failure)") - pflag.Bool("mesosCompression", viper.GetBool("mesosCompression"), "When true attempt to use compression for HTTP streams.") + pflag.Bool("mesosCompression", viper.GetBool("mesosCompression"), "When true attempt to use compression for HTTP streams") pflag.String("mesosExecutorImage", viper.GetString("mesosExecutorImage"), "Name of the docker image to run the executor") pflag.Duration("mesosFailoverTimeout", viper.GetDuration("mesosFailoverTimeout"), "Framework failover timeout (recover from scheduler failure)") pflag.String("mesosFrameworkHostname", viper.GetString("mesosFrameworkHostname"), "Framework hostname that is advertised to the master") @@ -130,9 +135,10 @@ func setFlags() error { pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") - pflag.String("globalConfigurationUri", viper.GetString("globalConfigurationUri"), "URI of the Consul server or YAML configuration file, used for global configuration.") - pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks.") - pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes.") + pflag.String("configServiceUri", viper.GetString("configServiceUri"), "URI of the Apricot instance (`apricot://host:port`), Consul server (`consul://`) or YAML configuration file, entry point for all configuration") + pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") + pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") + pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) @@ -154,28 +160,47 @@ func checkFmqPluginName() error { func parseCoreConfig() error { coreCfgUri := viper.GetString("coreConfigurationUri") - uri, err := url.Parse(coreCfgUri) - if err != nil { - return err - } - - if uri.Scheme == "file" { - viper.SetConfigFile(uri.Host + uri.Path) - if err := viper.ReadInConfig(); err != nil { - return errors.New(coreCfgUri + ": " + err.Error()); - } - } else if uri.Scheme == "consul"{ - if err := viper.AddRemoteProvider("consul", uri.Host, uri.Path); err != nil { + if len(coreCfgUri) != 0 { + log.WithField("coreConfigurationUri", coreCfgUri). + Warn("core configuration override (this should normally not happen)") + uri, err := url.Parse(coreCfgUri) + if err != nil { return err } - viper.SetConfigType("yaml") - if err := viper.ReadRemoteConfig(); err != nil { - return errors.New(coreCfgUri + ": " + err.Error()) + if uri.Scheme == "file" { + viper.SetConfigFile(uri.Host + uri.Path) + if err := viper.ReadInConfig(); err != nil { + return errors.New(coreCfgUri + ": " + err.Error()); + } + } else if uri.Scheme == "consul"{ + if err := viper.AddRemoteProvider("consul", uri.Host, uri.Path); err != nil { + return err + } + viper.SetConfigType("yaml") + if err := viper.ReadRemoteConfig(); err != nil { + return errors.New(coreCfgUri + ": " + err.Error()) + } + } else { + return errors.New(coreCfgUri + ": Core configuration URI could not be parsed (Expecting consul://* or file://*)") } - } else { - return errors.New(coreCfgUri + ": Core configuration URI could not be parsed (Expecting consul://* or file://*)") } + // aliecs configuration is assumed to live in aliecs/ANY/any/settings + payload, err := apricot.Instance().GetComponentConfiguration(&componentcfg.Query{ + Component: "aliecs", + RunType: apricotpb.RunType_ANY, + RoleName: "any", + EntryKey: viper.GetString("coreConfigEntry"), // defaults to "settings" + Timestamp: "", + }) + if err != nil { + return errors.New(viper.GetString("configServiceUri") + ": could not acquire core configuration (possibly bad configServiceUri, expecting apricot://*, consul://* or file://*)") + } + + viper.SetConfigType("yaml") + if err := viper.ReadConfig(bytes.NewBuffer([]byte(payload))); err != nil { + return errors.New(coreCfgUri + ": " + err.Error()) + } return nil } From 288ea038ef89216fe4e87bf5b59ee6b171286916 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 Feb 2021 10:28:39 +0100 Subject: [PATCH 0709/2352] [apricot] Rebase and regenerate proto --- apricot/protos/apricot.pb.go | 2 +- coconut/protos/o2control.pb.go | 2822 ++++++++++++--------------- coconut/protos/o2control_grpc.pb.go | 36 + core/globalstate.go | 4 +- core/protos/o2control.pb.go | 2822 ++++++++++++--------------- core/protos/o2control_grpc.pb.go | 36 + core/task/manager.go | 1 + core/workflow/aggregatorrole.go | 1 + core/workflow/taskrole.go | 1 + 9 files changed, 2635 insertions(+), 3090 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 447792785..7474e11f0 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1,7 +1,7 @@ // // === This file is part of ALICE O² === // -// Copyright 2020 CERN and copyright holders of ALICE O². +// Copyright 2020-2021 CERN and copyright holders of ALICE O². // Author: Teo Mrnjavac // // This program is free software: you can redistribute it and/or modify diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index a225fc93c..f91535149 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -97,7 +97,7 @@ func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { // Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -155,7 +155,7 @@ func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -204,7 +204,7 @@ func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } type Event_MesosHeartbeat struct { @@ -245,18 +245,20 @@ func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -type Ev_EnvironmentStateChanged struct { +type Ev_EnvironmentEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` } -func (x *Ev_EnvironmentStateChanged) Reset() { - *x = Ev_EnvironmentStateChanged{} +func (x *Ev_EnvironmentEvent) Reset() { + *x = Ev_EnvironmentEvent{} if protoimpl.UnsafeEnabled { mi := &file_protos_o2control_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -264,13 +266,13 @@ func (x *Ev_EnvironmentStateChanged) Reset() { } } -func (x *Ev_EnvironmentStateChanged) String() string { +func (x *Ev_EnvironmentEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} +func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { +func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { mi := &file_protos_o2control_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -282,113 +284,76 @@ func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_EnvironmentStateChanged.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{1} } -func (x *Ev_EnvironmentStateChanged) GetEvent() string { +func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { if x != nil { - return x.Event + return x.EnvironmentId } return "" } -func (x *Ev_EnvironmentStateChanged) GetSource() string { +func (x *Ev_EnvironmentEvent) GetState() string { if x != nil { - return x.Source + return x.State } return "" } -func (x *Ev_EnvironmentStateChanged) GetDestination() string { +func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if x != nil { - return x.Destination - } - return "" -} - -type Ev_TaskStateChanged struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` -} - -func (x *Ev_TaskStateChanged) Reset() { - *x = Ev_TaskStateChanged{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskStateChanged) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskStateChanged) ProtoMessage() {} - -func (x *Ev_TaskStateChanged) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.CurrentRunNumber } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskStateChanged.ProtoReflect.Descriptor instead. -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{2} + return 0 } -func (x *Ev_TaskStateChanged) GetTaskid() string { +func (x *Ev_EnvironmentEvent) GetError() string { if x != nil { - return x.Taskid + return x.Error } return "" } -func (x *Ev_TaskStateChanged) GetState() string { +func (x *Ev_EnvironmentEvent) GetMessage() string { if x != nil { - return x.State + return x.Message } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` } -func (x *Ev_TaskStatusChanged) Reset() { - *x = Ev_TaskStatusChanged{} +func (x *Ev_TaskEvent) Reset() { + *x = Ev_TaskEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[3] + mi := &file_protos_o2control_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Ev_TaskStatusChanged) String() string { +func (x *Ev_TaskEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} +func (*Ev_TaskEvent) ProtoMessage() {} -func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[3] +func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -399,200 +364,81 @@ func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_TaskStatusChanged.ProtoReflect.Descriptor instead. -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{3} +// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } -func (x *Ev_TaskStatusChanged) GetTaskid() string { +func (x *Ev_TaskEvent) GetName() string { if x != nil { - return x.Taskid + return x.Name } return "" } -func (x *Ev_TaskStatusChanged) GetStatus() string { +func (x *Ev_TaskEvent) GetTaskid() string { if x != nil { - return x.Status + return x.Taskid } return "" } -type Ev_TaskLaunched struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` -} - -func (x *Ev_TaskLaunched) Reset() { - *x = Ev_TaskLaunched{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskLaunched) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskLaunched) ProtoMessage() {} - -func (x *Ev_TaskLaunched) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskLaunched.ProtoReflect.Descriptor instead. -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{4} -} - -func (x *Ev_TaskLaunched) GetTaskid() string { +func (x *Ev_TaskEvent) GetState() string { if x != nil { - return x.Taskid + return x.State } return "" } -type Ev_MesosTaskCreated struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` -} - -func (x *Ev_MesosTaskCreated) Reset() { - *x = Ev_MesosTaskCreated{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_MesosTaskCreated) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_MesosTaskCreated) ProtoMessage() {} - -func (x *Ev_MesosTaskCreated) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_MesosTaskCreated.ProtoReflect.Descriptor instead. -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{5} -} - -func (x *Ev_MesosTaskCreated) GetTaskresources() string { +func (x *Ev_TaskEvent) GetStatus() string { if x != nil { - return x.Taskresources + return x.Status } return "" } -func (x *Ev_MesosTaskCreated) GetExecutorResources() string { +func (x *Ev_TaskEvent) GetHostname() string { if x != nil { - return x.ExecutorResources + return x.Hostname } return "" } -type Ev_EnvironmentCreated struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` -} - -func (x *Ev_EnvironmentCreated) Reset() { - *x = Ev_EnvironmentCreated{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentCreated) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentCreated) ProtoMessage() {} - -func (x *Ev_EnvironmentCreated) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentCreated.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6} -} - -func (x *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { +func (x *Ev_TaskEvent) GetClassName() string { if x != nil { - return x.Environment + return x.ClassName } - return nil + return "" } -type Ev_EnvironmentDestroyed struct { +type Ev_RoleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` } -func (x *Ev_EnvironmentDestroyed) Reset() { - *x = Ev_EnvironmentDestroyed{} +func (x *Ev_RoleEvent) Reset() { + *x = Ev_RoleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[7] + mi := &file_protos_o2control_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Ev_EnvironmentDestroyed) String() string { +func (x *Ev_RoleEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} +func (*Ev_RoleEvent) ProtoMessage() {} -func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[7] +func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,99 +449,37 @@ func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_EnvironmentDestroyed.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{7} +// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } -func (x *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { +func (x *Ev_RoleEvent) GetName() string { if x != nil { - return x.CleanupTasksReply + return x.Name } - return nil + return "" } -func (x *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (x *Ev_RoleEvent) GetStatus() string { if x != nil { - return x.Environmentid + return x.Status } return "" } -type Ev_EnvironmentError struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Ev_EnvironmentError) Reset() { - *x = Ev_EnvironmentError{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentError) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentError) ProtoMessage() {} - -func (x *Ev_EnvironmentError) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentError.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{8} -} - -type Ev_KillTasksMesos struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Ev_KillTasksMesos) Reset() { - *x = Ev_KillTasksMesos{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Ev_RoleEvent) GetState() string { + if x != nil { + return x.State } + return "" } -func (x *Ev_KillTasksMesos) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_KillTasksMesos) ProtoMessage() {} - -func (x *Ev_KillTasksMesos) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Ev_RoleEvent) GetRolePath() string { + if x != nil { + return x.RolePath } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_KillTasksMesos.ProtoReflect.Descriptor instead. -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{9} + return "" } //////////////////////////////////////// @@ -710,7 +494,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -723,7 +507,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -736,7 +520,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{10} + return file_protos_o2control_proto_rawDescGZIP(), []int{4} } type StatusReply struct { @@ -751,7 +535,7 @@ type StatusReply struct { func (x *StatusReply) Reset() { *x = StatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +548,7 @@ func (x *StatusReply) String() string { func (*StatusReply) ProtoMessage() {} func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -777,7 +561,7 @@ func (x *StatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{11} + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } func (x *StatusReply) GetState() string { @@ -808,7 +592,7 @@ type StatusUpdate struct { func (x *StatusUpdate) Reset() { *x = StatusUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -821,7 +605,7 @@ func (x *StatusUpdate) String() string { func (*StatusUpdate) ProtoMessage() {} func (x *StatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -834,7 +618,7 @@ func (x *StatusUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. func (*StatusUpdate) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12} + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } func (x *StatusUpdate) GetLevel() StatusUpdate_Level { @@ -875,22 +659,16 @@ type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are assignable to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -903,7 +681,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -916,7 +694,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{13} + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } func (x *Event) GetTimestamp() string { @@ -933,65 +711,23 @@ func (m *Event) GetPayload() isEvent_Payload { return nil } -func (x *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := x.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (x *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := x.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated +func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (x *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := x.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged +func (x *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := x.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (x *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := x.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (x *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := x.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (x *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := x.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (x *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := x.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed - } - return nil -} - -func (x *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := x.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError - } - return nil -} - -func (x *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := x.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (x *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := x.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -1000,70 +736,36 @@ type isEvent_Payload interface { isEvent_Payload() } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` } -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof"` -} - -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof"` -} - -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof"` -} - -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof"` -} - -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof"` -} - -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof"` -} - -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} - -func (*Event_EnvironmentCreated) isEvent_Payload() {} - -func (*Event_TaskStateChanged) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} - -func (*Event_MesosTaskcreated) isEvent_Payload() {} - -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} - -func (*Event_EnvironmentError) isEvent_Payload() {} - -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} type SubscribeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1076,7 +778,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1089,7 +791,14 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{14} + return file_protos_o2control_proto_rawDescGZIP(), []int{8} +} + +func (x *SubscribeRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } //////////////////////////////////////// @@ -1104,7 +813,7 @@ type GetFrameworkInfoRequest struct { func (x *GetFrameworkInfoRequest) Reset() { *x = GetFrameworkInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1117,7 +826,7 @@ func (x *GetFrameworkInfoRequest) String() string { func (*GetFrameworkInfoRequest) ProtoMessage() {} func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1130,7 +839,7 @@ func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{15} + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } type Version struct { @@ -1149,7 +858,7 @@ type Version struct { func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1162,7 +871,7 @@ func (x *Version) String() string { func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1175,7 +884,7 @@ func (x *Version) ProtoReflect() protoreflect.Message { // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{16} + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } func (x *Version) GetMajor() int32 { @@ -1237,7 +946,7 @@ type GetFrameworkInfoReply struct { func (x *GetFrameworkInfoReply) Reset() { *x = GetFrameworkInfoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1250,7 +959,7 @@ func (x *GetFrameworkInfoReply) String() string { func (*GetFrameworkInfoReply) ProtoMessage() {} func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1263,7 +972,7 @@ func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{17} + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } func (x *GetFrameworkInfoReply) GetFrameworkId() string { @@ -1327,7 +1036,7 @@ type TeardownRequest struct { func (x *TeardownRequest) Reset() { *x = TeardownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1340,7 +1049,7 @@ func (x *TeardownRequest) String() string { func (*TeardownRequest) ProtoMessage() {} func (x *TeardownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1353,7 +1062,7 @@ func (x *TeardownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. func (*TeardownRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{18} + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } func (x *TeardownRequest) GetReason() string { @@ -1372,7 +1081,7 @@ type TeardownReply struct { func (x *TeardownReply) Reset() { *x = TeardownReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1385,7 +1094,7 @@ func (x *TeardownReply) String() string { func (*TeardownReply) ProtoMessage() {} func (x *TeardownReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1398,7 +1107,7 @@ func (x *TeardownReply) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. func (*TeardownReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{19} + return file_protos_o2control_proto_rawDescGZIP(), []int{13} } //////////////////////////////////////// @@ -1413,7 +1122,7 @@ type GetEnvironmentsRequest struct { func (x *GetEnvironmentsRequest) Reset() { *x = GetEnvironmentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1135,7 @@ func (x *GetEnvironmentsRequest) String() string { func (*GetEnvironmentsRequest) ProtoMessage() {} func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1148,7 @@ func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{20} + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } type GetEnvironmentsReply struct { @@ -1454,7 +1163,7 @@ type GetEnvironmentsReply struct { func (x *GetEnvironmentsReply) Reset() { *x = GetEnvironmentsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1467,7 +1176,7 @@ func (x *GetEnvironmentsReply) String() string { func (*GetEnvironmentsReply) ProtoMessage() {} func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1480,7 +1189,7 @@ func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{21} + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } func (x *GetEnvironmentsReply) GetFrameworkId() string { @@ -1516,7 +1225,7 @@ type EnvironmentInfo struct { func (x *EnvironmentInfo) Reset() { *x = EnvironmentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1529,7 +1238,7 @@ func (x *EnvironmentInfo) String() string { func (*EnvironmentInfo) ProtoMessage() {} func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1542,7 +1251,7 @@ func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{22} + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } func (x *EnvironmentInfo) GetId() string { @@ -1594,46 +1303,149 @@ func (x *EnvironmentInfo) GetDefaults() map[string]string { return nil } -func (x *EnvironmentInfo) GetVars() map[string]string { - if x != nil { - return x.Vars - } - return nil +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars + } + return nil +} + +type NewEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} + +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate + } + return "" +} + +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + +type NewEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` +} + +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEnvironmentReply) ProtoMessage() {} + +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} } -func (x *EnvironmentInfo) GetUserVars() map[string]string { +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { if x != nil { - return x.UserVars + return x.Environment } return nil } -type NewEnvironmentRequest struct { +type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (x *NewEnvironmentRequest) Reset() { - *x = NewEnvironmentRequest{} +func (x *NewAutoEnvironmentRequest) Reset() { + *x = NewAutoEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NewEnvironmentRequest) String() string { +func (x *NewAutoEnvironmentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[23] +func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1644,50 +1456,55 @@ func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23} +// Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } -func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { +func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { if x != nil { return x.WorkflowTemplate } return "" } -func (x *NewEnvironmentRequest) GetVars() map[string]string { +func (x *NewAutoEnvironmentRequest) GetVars() map[string]string { if x != nil { return x.Vars } return nil } -type NewEnvironmentReply struct { +func (x *NewAutoEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -func (x *NewEnvironmentReply) Reset() { - *x = NewEnvironmentReply{} +func (x *NewAutoEnvironmentReply) Reset() { + *x = NewAutoEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NewEnvironmentReply) String() string { +func (x *NewAutoEnvironmentReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[24] +func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1698,16 +1515,9 @@ func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{24} -} - -func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if x != nil { - return x.Environment - } - return nil +// Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } type GetEnvironmentRequest struct { @@ -1721,7 +1531,7 @@ type GetEnvironmentRequest struct { func (x *GetEnvironmentRequest) Reset() { *x = GetEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1734,7 +1544,7 @@ func (x *GetEnvironmentRequest) String() string { func (*GetEnvironmentRequest) ProtoMessage() {} func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1747,7 +1557,7 @@ func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{25} + return file_protos_o2control_proto_rawDescGZIP(), []int{21} } func (x *GetEnvironmentRequest) GetId() string { @@ -1769,7 +1579,7 @@ type GetEnvironmentReply struct { func (x *GetEnvironmentReply) Reset() { *x = GetEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1782,7 +1592,7 @@ func (x *GetEnvironmentReply) String() string { func (*GetEnvironmentReply) ProtoMessage() {} func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1795,7 +1605,7 @@ func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26} + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1824,7 +1634,7 @@ type ControlEnvironmentRequest struct { func (x *ControlEnvironmentRequest) Reset() { *x = ControlEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1837,7 +1647,7 @@ func (x *ControlEnvironmentRequest) String() string { func (*ControlEnvironmentRequest) ProtoMessage() {} func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1850,7 +1660,7 @@ func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27} + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } func (x *ControlEnvironmentRequest) GetId() string { @@ -1880,7 +1690,7 @@ type ControlEnvironmentReply struct { func (x *ControlEnvironmentReply) Reset() { *x = ControlEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1893,7 +1703,7 @@ func (x *ControlEnvironmentReply) String() string { func (*ControlEnvironmentReply) ProtoMessage() {} func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1906,7 +1716,7 @@ func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{28} + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } func (x *ControlEnvironmentReply) GetId() string { @@ -1943,7 +1753,7 @@ type ModifyEnvironmentRequest struct { func (x *ModifyEnvironmentRequest) Reset() { *x = ModifyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1956,7 +1766,7 @@ func (x *ModifyEnvironmentRequest) String() string { func (*ModifyEnvironmentRequest) ProtoMessage() {} func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1969,7 +1779,7 @@ func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{29} + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } func (x *ModifyEnvironmentRequest) GetId() string { @@ -2005,7 +1815,7 @@ type EnvironmentOperation struct { func (x *EnvironmentOperation) Reset() { *x = EnvironmentOperation{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2018,7 +1828,7 @@ func (x *EnvironmentOperation) String() string { func (*EnvironmentOperation) ProtoMessage() {} func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2031,7 +1841,7 @@ func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { @@ -2061,7 +1871,7 @@ type ModifyEnvironmentReply struct { func (x *ModifyEnvironmentReply) Reset() { *x = ModifyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2074,7 +1884,7 @@ func (x *ModifyEnvironmentReply) String() string { func (*ModifyEnvironmentReply) ProtoMessage() {} func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2087,7 +1897,7 @@ func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { @@ -2125,7 +1935,7 @@ type DestroyEnvironmentRequest struct { func (x *DestroyEnvironmentRequest) Reset() { *x = DestroyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2138,7 +1948,7 @@ func (x *DestroyEnvironmentRequest) String() string { func (*DestroyEnvironmentRequest) ProtoMessage() {} func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2151,7 +1961,7 @@ func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{28} } func (x *DestroyEnvironmentRequest) GetId() string { @@ -2193,7 +2003,7 @@ type DestroyEnvironmentReply struct { func (x *DestroyEnvironmentReply) Reset() { *x = DestroyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2206,7 +2016,7 @@ func (x *DestroyEnvironmentReply) String() string { func (*DestroyEnvironmentReply) ProtoMessage() {} func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2219,7 +2029,7 @@ func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { @@ -2246,7 +2056,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2259,7 +2069,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2272,7 +2082,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{30} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2298,7 +2108,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2311,7 +2121,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2324,7 +2134,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } type GetEnvironmentPropertiesRequest struct { @@ -2343,7 +2153,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2356,7 +2166,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2369,7 +2179,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2404,7 +2214,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2417,7 +2227,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2430,7 +2240,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2456,12 +2266,13 @@ type ShortTaskInfo struct { ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` } func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2474,7 +2285,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2487,7 +2298,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *ShortTaskInfo) GetName() string { @@ -2546,6 +2357,13 @@ func (x *ShortTaskInfo) GetPid() string { return "" } +func (x *ShortTaskInfo) GetSandboxStdout() string { + if x != nil { + return x.SandboxStdout + } + return "" +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2560,7 +2378,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2573,7 +2391,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2586,7 +2404,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2626,7 +2444,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2639,7 +2457,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2652,7 +2470,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } type GetTasksReply struct { @@ -2666,7 +2484,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2679,7 +2497,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2692,7 +2510,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2713,7 +2531,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2726,7 +2544,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2739,7 +2557,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *GetTaskRequest) GetTaskId() string { @@ -2760,7 +2578,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2773,7 +2591,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2786,7 +2604,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2808,7 +2626,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2821,7 +2639,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2834,7 +2652,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *TaskClassInfo) GetName() string { @@ -2866,7 +2684,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2879,7 +2697,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2892,7 +2710,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *CommandInfo) GetEnv() []string { @@ -2943,7 +2761,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2956,7 +2774,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2969,7 +2787,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *ChannelInfo) GetName() string { @@ -3011,7 +2829,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3024,7 +2842,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3037,7 +2855,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3107,7 +2925,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3120,7 +2938,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3133,7 +2951,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3155,7 +2973,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3168,7 +2986,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3181,7 +2999,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3213,7 +3031,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3226,7 +3044,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3239,7 +3057,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *GetRolesRequest) GetEnvId() string { @@ -3275,7 +3093,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3288,7 +3106,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3301,7 +3119,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *RoleInfo) GetName() string { @@ -3378,7 +3196,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3391,7 +3209,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3404,7 +3222,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3428,7 +3246,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3441,7 +3259,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3454,7 +3272,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3498,7 +3316,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3511,7 +3329,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3524,7 +3342,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3559,7 +3377,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3572,7 +3390,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3585,7 +3403,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3604,7 +3422,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3617,7 +3435,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3630,7 +3448,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } type RepoInfo struct { @@ -3646,7 +3464,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3659,7 +3477,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3672,7 +3490,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RepoInfo) GetName() string { @@ -3708,7 +3526,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3721,7 +3539,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3734,7 +3552,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3763,7 +3581,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3776,7 +3594,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3789,7 +3607,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *AddRepoRequest) GetName() string { @@ -3818,7 +3636,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3831,7 +3649,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3844,7 +3662,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3872,7 +3690,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3885,7 +3703,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3898,7 +3716,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3919,7 +3737,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3932,7 +3750,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3945,7 +3763,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3966,7 +3784,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +3797,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +3810,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4013,7 +3831,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4026,7 +3844,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4039,7 +3857,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4060,7 +3878,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4073,7 +3891,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4086,7 +3904,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4108,7 +3926,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4121,7 +3939,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4134,7 +3952,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4162,7 +3980,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4175,7 +3993,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4188,7 +4006,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4207,7 +4025,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4220,7 +4038,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4233,7 +4051,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } var File_protos_o2control_proto protoreflect.FileDescriptor @@ -4242,651 +4060,629 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x6c, 0x0a, 0x1a, 0x45, - 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x13, 0x45, 0x76, 0x5f, - 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x46, - 0x0a, 0x14, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, - 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, - 0x64, 0x22, 0x69, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2c, - 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x15, - 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, - 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, - 0x64, 0x22, 0x15, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x76, 0x5f, 0x4b, - 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x22, 0x0f, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, - 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x6f, - 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, - 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x09, - 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x22, 0x86, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x52, 0x0a, - 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, - 0x4f, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, - 0x73, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, - 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x58, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, - 0x4b, 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x00, - 0x52, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, - 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, - 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, - 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xca, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, + 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, + 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xca, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, - 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, + 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, + 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, + 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, - 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, - 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, + 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, + 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, - 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, - 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, + 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, + 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, + 0x91, 0x04, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0x91, 0x04, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, + 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x32, 0xfd, 0x0d, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -4902,190 +4698,182 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentStateChanged)(nil), // 4: o2control.Ev_EnvironmentStateChanged - (*Ev_TaskStateChanged)(nil), // 5: o2control.Ev_TaskStateChanged - (*Ev_TaskStatusChanged)(nil), // 6: o2control.Ev_TaskStatusChanged - (*Ev_TaskLaunched)(nil), // 7: o2control.Ev_TaskLaunched - (*Ev_MesosTaskCreated)(nil), // 8: o2control.Ev_MesosTaskCreated - (*Ev_EnvironmentCreated)(nil), // 9: o2control.Ev_EnvironmentCreated - (*Ev_EnvironmentDestroyed)(nil), // 10: o2control.Ev_EnvironmentDestroyed - (*Ev_EnvironmentError)(nil), // 11: o2control.Ev_EnvironmentError - (*Ev_KillTasksMesos)(nil), // 12: o2control.Ev_KillTasksMesos - (*StatusRequest)(nil), // 13: o2control.StatusRequest - (*StatusReply)(nil), // 14: o2control.StatusReply - (*StatusUpdate)(nil), // 15: o2control.StatusUpdate - (*Event)(nil), // 16: o2control.Event - (*SubscribeRequest)(nil), // 17: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 18: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 19: o2control.Version - (*GetFrameworkInfoReply)(nil), // 20: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 21: o2control.TeardownRequest - (*TeardownReply)(nil), // 22: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 23: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 24: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 25: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 26: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 27: o2control.NewEnvironmentReply - (*GetEnvironmentRequest)(nil), // 28: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 29: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 30: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 31: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 32: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 33: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 34: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 35: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 36: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 44: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 46: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo - (*CommandInfo)(nil), // 48: o2control.CommandInfo - (*ChannelInfo)(nil), // 49: o2control.ChannelInfo - (*TaskInfo)(nil), // 50: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest - (*RoleInfo)(nil), // 54: o2control.RoleInfo - (*GetRolesReply)(nil), // 55: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest - (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 59: o2control.ListReposRequest - (*RepoInfo)(nil), // 60: o2control.RepoInfo - (*ListReposReply)(nil), // 61: o2control.ListReposReply - (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 63: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 71: o2control.Empty - nil, // 72: o2control.EnvironmentInfo.DefaultsEntry - nil, // 73: o2control.EnvironmentInfo.VarsEntry - nil, // 74: o2control.EnvironmentInfo.UserVarsEntry - nil, // 75: o2control.NewEnvironmentRequest.VarsEntry - nil, // 76: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 77: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 78: o2control.TaskInfo.PropertiesEntry - nil, // 79: o2control.RoleInfo.DefaultsEntry - nil, // 80: o2control.RoleInfo.VarsEntry - nil, // 81: o2control.RoleInfo.UserVarsEntry + (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 7: o2control.StatusRequest + (*StatusReply)(nil), // 8: o2control.StatusReply + (*StatusUpdate)(nil), // 9: o2control.StatusUpdate + (*Event)(nil), // 10: o2control.Event + (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 13: o2control.Version + (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 15: o2control.TeardownRequest + (*TeardownReply)(nil), // 16: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 40: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 42: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo + (*CommandInfo)(nil), // 44: o2control.CommandInfo + (*ChannelInfo)(nil), // 45: o2control.ChannelInfo + (*TaskInfo)(nil), // 46: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest + (*RoleInfo)(nil), // 50: o2control.RoleInfo + (*GetRolesReply)(nil), // 51: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 55: o2control.ListReposRequest + (*RepoInfo)(nil), // 56: o2control.RepoInfo + (*ListReposReply)(nil), // 57: o2control.ListReposReply + (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 59: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 67: o2control.Empty + nil, // 68: o2control.EnvironmentInfo.DefaultsEntry + nil, // 69: o2control.EnvironmentInfo.VarsEntry + nil, // 70: o2control.EnvironmentInfo.UserVarsEntry + nil, // 71: o2control.NewEnvironmentRequest.VarsEntry + nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 75: o2control.TaskInfo.PropertiesEntry + nil, // 76: o2control.RoleInfo.DefaultsEntry + nil, // 77: o2control.RoleInfo.VarsEntry + nil, // 78: o2control.RoleInfo.UserVarsEntry } var file_protos_o2control_proto_depIdxs = []int32{ - 25, // 0: o2control.Ev_EnvironmentCreated.environment:type_name -> o2control.EnvironmentInfo - 52, // 1: o2control.Ev_EnvironmentDestroyed.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 15, // 2: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate - 0, // 3: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 3, // 4: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 4, // 5: o2control.Event.environmentStateChanged:type_name -> o2control.Ev_EnvironmentStateChanged - 9, // 6: o2control.Event.environmentCreated:type_name -> o2control.Ev_EnvironmentCreated - 5, // 7: o2control.Event.taskStateChanged:type_name -> o2control.Ev_TaskStateChanged - 6, // 8: o2control.Event.taskStatusChanged:type_name -> o2control.Ev_TaskStatusChanged - 7, // 9: o2control.Event.tasklaunched:type_name -> o2control.Ev_TaskLaunched - 8, // 10: o2control.Event.mesosTaskcreated:type_name -> o2control.Ev_MesosTaskCreated - 10, // 11: o2control.Event.environmentDestroyed:type_name -> o2control.Ev_EnvironmentDestroyed - 11, // 12: o2control.Event.environmentError:type_name -> o2control.Ev_EnvironmentError - 12, // 13: o2control.Event.killtasksMesos:type_name -> o2control.Ev_KillTasksMesos - 19, // 14: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 25, // 15: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 41, // 16: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 72, // 17: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 73, // 18: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 74, // 19: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 75, // 20: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 25, // 21: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 25, // 22: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 54, // 23: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 24: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 33, // 25: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 26: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 33, // 27: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 52, // 28: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 76, // 29: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 77, // 30: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 42, // 31: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 41, // 32: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 50, // 33: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 41, // 34: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 47, // 35: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 49, // 36: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 49, // 37: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 48, // 38: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 78, // 39: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 41, // 40: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 41, // 41: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 54, // 42: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 79, // 43: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 80, // 44: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 81, // 45: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 54, // 46: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 57, // 47: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 48: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 13, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 18, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 21, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 23, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 26, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 28, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 30, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 32, // 56: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 35, // 57: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 43, // 58: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 59: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 60: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 61: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 62: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 63: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 64: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 65: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 66: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 67: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 68: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 69: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 17, // 70: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 14, // 71: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 20, // 72: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 22, // 73: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 24, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 27, // 75: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 29, // 76: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 31, // 77: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 34, // 78: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 36, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 44, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 16, // 92: o2control.Control.Subscribe:output_type -> o2control.Event - 71, // [71:93] is the sub-list for method output_type - 49, // [49:71] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 50, // 39: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 40: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 41: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 42: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 44: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 50: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 51: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 52: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 53: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 54: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 55: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 56: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 57: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 58: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 59: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 60: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 61: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 62: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 63: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 64: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 65: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 66: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 67: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 68: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 69: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 70: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 71: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 72: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 73: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 74: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 75: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 76: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 77: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 78: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 79: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 80: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 81: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 82: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 83: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 84: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 86: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 87: o2control.Control.Subscribe:output_type -> o2control.Event + 65, // [65:88] is the sub-list for method output_type + 42, // [42:65] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5107,7 +4895,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentStateChanged); i { + switch v := v.(*Ev_EnvironmentEvent); i { case 0: return &v.state case 1: @@ -5119,7 +4907,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskStateChanged); i { + switch v := v.(*Ev_TaskEvent); i { case 0: return &v.state case 1: @@ -5131,7 +4919,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskStatusChanged); i { + switch v := v.(*Ev_RoleEvent); i { case 0: return &v.state case 1: @@ -5143,7 +4931,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskLaunched); i { + switch v := v.(*StatusRequest); i { case 0: return &v.state case 1: @@ -5155,7 +4943,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_MesosTaskCreated); i { + switch v := v.(*StatusReply); i { case 0: return &v.state case 1: @@ -5167,7 +4955,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentCreated); i { + switch v := v.(*StatusUpdate); i { case 0: return &v.state case 1: @@ -5179,7 +4967,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentDestroyed); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -5191,7 +4979,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentError); i { + switch v := v.(*SubscribeRequest); i { case 0: return &v.state case 1: @@ -5203,7 +4991,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_KillTasksMesos); i { + switch v := v.(*GetFrameworkInfoRequest); i { case 0: return &v.state case 1: @@ -5215,7 +5003,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { + switch v := v.(*Version); i { case 0: return &v.state case 1: @@ -5227,7 +5015,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusReply); i { + switch v := v.(*GetFrameworkInfoReply); i { case 0: return &v.state case 1: @@ -5239,7 +5027,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { + switch v := v.(*TeardownRequest); i { case 0: return &v.state case 1: @@ -5251,7 +5039,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*TeardownReply); i { case 0: return &v.state case 1: @@ -5263,7 +5051,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeRequest); i { + switch v := v.(*GetEnvironmentsRequest); i { case 0: return &v.state case 1: @@ -5275,7 +5063,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFrameworkInfoRequest); i { + switch v := v.(*GetEnvironmentsReply); i { case 0: return &v.state case 1: @@ -5287,7 +5075,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Version); i { + switch v := v.(*EnvironmentInfo); i { case 0: return &v.state case 1: @@ -5299,7 +5087,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFrameworkInfoReply); i { + switch v := v.(*NewEnvironmentRequest); i { case 0: return &v.state case 1: @@ -5311,7 +5099,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeardownRequest); i { + switch v := v.(*NewEnvironmentReply); i { case 0: return &v.state case 1: @@ -5323,7 +5111,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeardownReply); i { + switch v := v.(*NewAutoEnvironmentRequest); i { case 0: return &v.state case 1: @@ -5335,7 +5123,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentsRequest); i { + switch v := v.(*NewAutoEnvironmentReply); i { case 0: return &v.state case 1: @@ -5347,54 +5135,6 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvironmentInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewEnvironmentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewEnvironmentReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentRequest); i { case 0: return &v.state @@ -5406,7 +5146,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentReply); i { case 0: return &v.state @@ -5418,7 +5158,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentRequest); i { case 0: return &v.state @@ -5430,7 +5170,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentReply); i { case 0: return &v.state @@ -5442,7 +5182,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentRequest); i { case 0: return &v.state @@ -5454,7 +5194,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentOperation); i { case 0: return &v.state @@ -5466,7 +5206,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentReply); i { case 0: return &v.state @@ -5478,7 +5218,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentRequest); i { case 0: return &v.state @@ -5490,7 +5230,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentReply); i { case 0: return &v.state @@ -5502,7 +5242,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -5514,7 +5254,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -5526,7 +5266,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -5538,7 +5278,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -5550,7 +5290,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortTaskInfo); i { case 0: return &v.state @@ -5562,7 +5302,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state @@ -5574,7 +5314,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksRequest); i { case 0: return &v.state @@ -5586,7 +5326,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksReply); i { case 0: return &v.state @@ -5598,7 +5338,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskRequest); i { case 0: return &v.state @@ -5610,7 +5350,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskReply); i { case 0: return &v.state @@ -5622,7 +5362,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskClassInfo); i { case 0: return &v.state @@ -5634,7 +5374,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -5646,7 +5386,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -5658,7 +5398,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -5670,7 +5410,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -5682,7 +5422,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -5694,7 +5434,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -5706,7 +5446,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -5718,7 +5458,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -5730,7 +5470,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -5742,7 +5482,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -5754,7 +5494,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -5766,7 +5506,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -5778,7 +5518,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -5790,7 +5530,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -5802,7 +5542,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -5814,7 +5554,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -5826,7 +5566,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -5838,7 +5578,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -5850,7 +5590,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -5862,7 +5602,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -5874,7 +5614,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -5886,7 +5626,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -5898,7 +5638,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -5910,7 +5650,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -5923,19 +5663,13 @@ func file_protos_o2control_proto_init() { } } } - file_protos_o2control_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } - file_protos_o2control_proto_msgTypes[13].OneofWrappers = []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -5943,7 +5677,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 79, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 23ae76ff9..a87d3d87d 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -21,6 +21,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -108,6 +109,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -301,6 +311,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -338,6 +349,9 @@ func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (* func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (UnimplementedControlServer) NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -480,6 +494,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -823,6 +855,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, diff --git a/core/globalstate.go b/core/globalstate.go index 61a6c0b61..10585ab0e 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/environment" + pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -52,8 +53,9 @@ func newGlobalState(shutdown func()) (*globalState, error) { environments: nil, } + publicEventCh := make(chan *pb.Event) internalEventCh := make(chan event.Event) - taskman, err := task.NewManager(shutdown, internalEventCh) + taskman, err := task.NewManager(shutdown, publicEventCh, internalEventCh) if err != nil { return nil, err } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index a225fc93c..f91535149 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -97,7 +97,7 @@ func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { // Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -155,7 +155,7 @@ func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -204,7 +204,7 @@ func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } type Event_MesosHeartbeat struct { @@ -245,18 +245,20 @@ func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -type Ev_EnvironmentStateChanged struct { +type Ev_EnvironmentEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Event string `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` - Source string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` - Destination string `protobuf:"bytes,3,opt,name=destination,proto3" json:"destination,omitempty"` + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` } -func (x *Ev_EnvironmentStateChanged) Reset() { - *x = Ev_EnvironmentStateChanged{} +func (x *Ev_EnvironmentEvent) Reset() { + *x = Ev_EnvironmentEvent{} if protoimpl.UnsafeEnabled { mi := &file_protos_o2control_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -264,13 +266,13 @@ func (x *Ev_EnvironmentStateChanged) Reset() { } } -func (x *Ev_EnvironmentStateChanged) String() string { +func (x *Ev_EnvironmentEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_EnvironmentStateChanged) ProtoMessage() {} +func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { +func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { mi := &file_protos_o2control_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -282,113 +284,76 @@ func (x *Ev_EnvironmentStateChanged) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_EnvironmentStateChanged.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentStateChanged) Descriptor() ([]byte, []int) { +// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{1} } -func (x *Ev_EnvironmentStateChanged) GetEvent() string { +func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { if x != nil { - return x.Event + return x.EnvironmentId } return "" } -func (x *Ev_EnvironmentStateChanged) GetSource() string { +func (x *Ev_EnvironmentEvent) GetState() string { if x != nil { - return x.Source + return x.State } return "" } -func (x *Ev_EnvironmentStateChanged) GetDestination() string { +func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { if x != nil { - return x.Destination - } - return "" -} - -type Ev_TaskStateChanged struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` -} - -func (x *Ev_TaskStateChanged) Reset() { - *x = Ev_TaskStateChanged{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskStateChanged) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskStateChanged) ProtoMessage() {} - -func (x *Ev_TaskStateChanged) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms + return x.CurrentRunNumber } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskStateChanged.ProtoReflect.Descriptor instead. -func (*Ev_TaskStateChanged) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{2} + return 0 } -func (x *Ev_TaskStateChanged) GetTaskid() string { +func (x *Ev_EnvironmentEvent) GetError() string { if x != nil { - return x.Taskid + return x.Error } return "" } -func (x *Ev_TaskStateChanged) GetState() string { +func (x *Ev_EnvironmentEvent) GetMessage() string { if x != nil { - return x.State + return x.Message } return "" } -type Ev_TaskStatusChanged struct { +type Ev_TaskEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` } -func (x *Ev_TaskStatusChanged) Reset() { - *x = Ev_TaskStatusChanged{} +func (x *Ev_TaskEvent) Reset() { + *x = Ev_TaskEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[3] + mi := &file_protos_o2control_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Ev_TaskStatusChanged) String() string { +func (x *Ev_TaskEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_TaskStatusChanged) ProtoMessage() {} +func (*Ev_TaskEvent) ProtoMessage() {} -func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[3] +func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -399,200 +364,81 @@ func (x *Ev_TaskStatusChanged) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_TaskStatusChanged.ProtoReflect.Descriptor instead. -func (*Ev_TaskStatusChanged) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{3} +// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } -func (x *Ev_TaskStatusChanged) GetTaskid() string { +func (x *Ev_TaskEvent) GetName() string { if x != nil { - return x.Taskid + return x.Name } return "" } -func (x *Ev_TaskStatusChanged) GetStatus() string { +func (x *Ev_TaskEvent) GetTaskid() string { if x != nil { - return x.Status + return x.Taskid } return "" } -type Ev_TaskLaunched struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskid string `protobuf:"bytes,1,opt,name=taskid,proto3" json:"taskid,omitempty"` -} - -func (x *Ev_TaskLaunched) Reset() { - *x = Ev_TaskLaunched{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskLaunched) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskLaunched) ProtoMessage() {} - -func (x *Ev_TaskLaunched) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskLaunched.ProtoReflect.Descriptor instead. -func (*Ev_TaskLaunched) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{4} -} - -func (x *Ev_TaskLaunched) GetTaskid() string { +func (x *Ev_TaskEvent) GetState() string { if x != nil { - return x.Taskid + return x.State } return "" } -type Ev_MesosTaskCreated struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Taskresources string `protobuf:"bytes,1,opt,name=taskresources,proto3" json:"taskresources,omitempty"` - ExecutorResources string `protobuf:"bytes,2,opt,name=executorResources,proto3" json:"executorResources,omitempty"` -} - -func (x *Ev_MesosTaskCreated) Reset() { - *x = Ev_MesosTaskCreated{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_MesosTaskCreated) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_MesosTaskCreated) ProtoMessage() {} - -func (x *Ev_MesosTaskCreated) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_MesosTaskCreated.ProtoReflect.Descriptor instead. -func (*Ev_MesosTaskCreated) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{5} -} - -func (x *Ev_MesosTaskCreated) GetTaskresources() string { +func (x *Ev_TaskEvent) GetStatus() string { if x != nil { - return x.Taskresources + return x.Status } return "" } -func (x *Ev_MesosTaskCreated) GetExecutorResources() string { +func (x *Ev_TaskEvent) GetHostname() string { if x != nil { - return x.ExecutorResources + return x.Hostname } return "" } -type Ev_EnvironmentCreated struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` -} - -func (x *Ev_EnvironmentCreated) Reset() { - *x = Ev_EnvironmentCreated{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentCreated) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentCreated) ProtoMessage() {} - -func (x *Ev_EnvironmentCreated) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentCreated.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentCreated) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6} -} - -func (x *Ev_EnvironmentCreated) GetEnvironment() *EnvironmentInfo { +func (x *Ev_TaskEvent) GetClassName() string { if x != nil { - return x.Environment + return x.ClassName } - return nil + return "" } -type Ev_EnvironmentDestroyed struct { +type Ev_RoleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Environmentid string `protobuf:"bytes,2,opt,name=environmentid,proto3" json:"environmentid,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` } -func (x *Ev_EnvironmentDestroyed) Reset() { - *x = Ev_EnvironmentDestroyed{} +func (x *Ev_RoleEvent) Reset() { + *x = Ev_RoleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[7] + mi := &file_protos_o2control_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Ev_EnvironmentDestroyed) String() string { +func (x *Ev_RoleEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_EnvironmentDestroyed) ProtoMessage() {} +func (*Ev_RoleEvent) ProtoMessage() {} -func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[7] +func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -603,99 +449,37 @@ func (x *Ev_EnvironmentDestroyed) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_EnvironmentDestroyed.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentDestroyed) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{7} +// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } -func (x *Ev_EnvironmentDestroyed) GetCleanupTasksReply() *CleanupTasksReply { +func (x *Ev_RoleEvent) GetName() string { if x != nil { - return x.CleanupTasksReply + return x.Name } - return nil + return "" } -func (x *Ev_EnvironmentDestroyed) GetEnvironmentid() string { +func (x *Ev_RoleEvent) GetStatus() string { if x != nil { - return x.Environmentid + return x.Status } return "" } -type Ev_EnvironmentError struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Ev_EnvironmentError) Reset() { - *x = Ev_EnvironmentError{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentError) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentError) ProtoMessage() {} - -func (x *Ev_EnvironmentError) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentError.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentError) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{8} -} - -type Ev_KillTasksMesos struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Ev_KillTasksMesos) Reset() { - *x = Ev_KillTasksMesos{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *Ev_RoleEvent) GetState() string { + if x != nil { + return x.State } + return "" } -func (x *Ev_KillTasksMesos) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_KillTasksMesos) ProtoMessage() {} - -func (x *Ev_KillTasksMesos) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms +func (x *Ev_RoleEvent) GetRolePath() string { + if x != nil { + return x.RolePath } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_KillTasksMesos.ProtoReflect.Descriptor instead. -func (*Ev_KillTasksMesos) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{9} + return "" } //////////////////////////////////////// @@ -710,7 +494,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -723,7 +507,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -736,7 +520,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{10} + return file_protos_o2control_proto_rawDescGZIP(), []int{4} } type StatusReply struct { @@ -751,7 +535,7 @@ type StatusReply struct { func (x *StatusReply) Reset() { *x = StatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -764,7 +548,7 @@ func (x *StatusReply) String() string { func (*StatusReply) ProtoMessage() {} func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -777,7 +561,7 @@ func (x *StatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{11} + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } func (x *StatusReply) GetState() string { @@ -808,7 +592,7 @@ type StatusUpdate struct { func (x *StatusUpdate) Reset() { *x = StatusUpdate{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -821,7 +605,7 @@ func (x *StatusUpdate) String() string { func (*StatusUpdate) ProtoMessage() {} func (x *StatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -834,7 +618,7 @@ func (x *StatusUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. func (*StatusUpdate) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12} + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } func (x *StatusUpdate) GetLevel() StatusUpdate_Level { @@ -875,22 +659,16 @@ type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are assignable to Payload: - // *Event_EnvironmentStateChanged - // *Event_EnvironmentCreated - // *Event_TaskStateChanged - // *Event_TaskStatusChanged - // *Event_Tasklaunched - // *Event_MesosTaskcreated - // *Event_EnvironmentDestroyed - // *Event_EnvironmentError - // *Event_KilltasksMesos + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -903,7 +681,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -916,7 +694,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{13} + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } func (x *Event) GetTimestamp() string { @@ -933,65 +711,23 @@ func (m *Event) GetPayload() isEvent_Payload { return nil } -func (x *Event) GetEnvironmentStateChanged() *Ev_EnvironmentStateChanged { - if x, ok := x.GetPayload().(*Event_EnvironmentStateChanged); ok { - return x.EnvironmentStateChanged - } - return nil -} - -func (x *Event) GetEnvironmentCreated() *Ev_EnvironmentCreated { - if x, ok := x.GetPayload().(*Event_EnvironmentCreated); ok { - return x.EnvironmentCreated +func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent } return nil } -func (x *Event) GetTaskStateChanged() *Ev_TaskStateChanged { - if x, ok := x.GetPayload().(*Event_TaskStateChanged); ok { - return x.TaskStateChanged +func (x *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := x.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent } return nil } -func (x *Event) GetTaskStatusChanged() *Ev_TaskStatusChanged { - if x, ok := x.GetPayload().(*Event_TaskStatusChanged); ok { - return x.TaskStatusChanged - } - return nil -} - -func (x *Event) GetTasklaunched() *Ev_TaskLaunched { - if x, ok := x.GetPayload().(*Event_Tasklaunched); ok { - return x.Tasklaunched - } - return nil -} - -func (x *Event) GetMesosTaskcreated() *Ev_MesosTaskCreated { - if x, ok := x.GetPayload().(*Event_MesosTaskcreated); ok { - return x.MesosTaskcreated - } - return nil -} - -func (x *Event) GetEnvironmentDestroyed() *Ev_EnvironmentDestroyed { - if x, ok := x.GetPayload().(*Event_EnvironmentDestroyed); ok { - return x.EnvironmentDestroyed - } - return nil -} - -func (x *Event) GetEnvironmentError() *Ev_EnvironmentError { - if x, ok := x.GetPayload().(*Event_EnvironmentError); ok { - return x.EnvironmentError - } - return nil -} - -func (x *Event) GetKilltasksMesos() *Ev_KillTasksMesos { - if x, ok := x.GetPayload().(*Event_KilltasksMesos); ok { - return x.KilltasksMesos +func (x *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := x.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent } return nil } @@ -1000,70 +736,36 @@ type isEvent_Payload interface { isEvent_Payload() } -type Event_EnvironmentStateChanged struct { - EnvironmentStateChanged *Ev_EnvironmentStateChanged `protobuf:"bytes,2,opt,name=environmentStateChanged,proto3,oneof"` +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` } -type Event_EnvironmentCreated struct { - EnvironmentCreated *Ev_EnvironmentCreated `protobuf:"bytes,3,opt,name=environmentCreated,proto3,oneof"` +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` } -type Event_TaskStateChanged struct { - TaskStateChanged *Ev_TaskStateChanged `protobuf:"bytes,4,opt,name=taskStateChanged,proto3,oneof"` +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` } -type Event_TaskStatusChanged struct { - TaskStatusChanged *Ev_TaskStatusChanged `protobuf:"bytes,5,opt,name=taskStatusChanged,proto3,oneof"` -} - -type Event_Tasklaunched struct { - Tasklaunched *Ev_TaskLaunched `protobuf:"bytes,6,opt,name=tasklaunched,proto3,oneof"` -} - -type Event_MesosTaskcreated struct { - MesosTaskcreated *Ev_MesosTaskCreated `protobuf:"bytes,7,opt,name=mesosTaskcreated,proto3,oneof"` -} - -type Event_EnvironmentDestroyed struct { - EnvironmentDestroyed *Ev_EnvironmentDestroyed `protobuf:"bytes,8,opt,name=environmentDestroyed,proto3,oneof"` -} - -type Event_EnvironmentError struct { - EnvironmentError *Ev_EnvironmentError `protobuf:"bytes,9,opt,name=environmentError,proto3,oneof"` -} - -type Event_KilltasksMesos struct { - KilltasksMesos *Ev_KillTasksMesos `protobuf:"bytes,10,opt,name=killtasksMesos,proto3,oneof"` -} - -func (*Event_EnvironmentStateChanged) isEvent_Payload() {} - -func (*Event_EnvironmentCreated) isEvent_Payload() {} - -func (*Event_TaskStateChanged) isEvent_Payload() {} +func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskStatusChanged) isEvent_Payload() {} +func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_Tasklaunched) isEvent_Payload() {} - -func (*Event_MesosTaskcreated) isEvent_Payload() {} - -func (*Event_EnvironmentDestroyed) isEvent_Payload() {} - -func (*Event_EnvironmentError) isEvent_Payload() {} - -func (*Event_KilltasksMesos) isEvent_Payload() {} +func (*Event_RoleEvent) isEvent_Payload() {} type SubscribeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1076,7 +778,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1089,7 +791,14 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{14} + return file_protos_o2control_proto_rawDescGZIP(), []int{8} +} + +func (x *SubscribeRequest) GetId() string { + if x != nil { + return x.Id + } + return "" } //////////////////////////////////////// @@ -1104,7 +813,7 @@ type GetFrameworkInfoRequest struct { func (x *GetFrameworkInfoRequest) Reset() { *x = GetFrameworkInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1117,7 +826,7 @@ func (x *GetFrameworkInfoRequest) String() string { func (*GetFrameworkInfoRequest) ProtoMessage() {} func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1130,7 +839,7 @@ func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{15} + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } type Version struct { @@ -1149,7 +858,7 @@ type Version struct { func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1162,7 +871,7 @@ func (x *Version) String() string { func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1175,7 +884,7 @@ func (x *Version) ProtoReflect() protoreflect.Message { // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{16} + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } func (x *Version) GetMajor() int32 { @@ -1237,7 +946,7 @@ type GetFrameworkInfoReply struct { func (x *GetFrameworkInfoReply) Reset() { *x = GetFrameworkInfoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1250,7 +959,7 @@ func (x *GetFrameworkInfoReply) String() string { func (*GetFrameworkInfoReply) ProtoMessage() {} func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1263,7 +972,7 @@ func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{17} + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } func (x *GetFrameworkInfoReply) GetFrameworkId() string { @@ -1327,7 +1036,7 @@ type TeardownRequest struct { func (x *TeardownRequest) Reset() { *x = TeardownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1340,7 +1049,7 @@ func (x *TeardownRequest) String() string { func (*TeardownRequest) ProtoMessage() {} func (x *TeardownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1353,7 +1062,7 @@ func (x *TeardownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. func (*TeardownRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{18} + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } func (x *TeardownRequest) GetReason() string { @@ -1372,7 +1081,7 @@ type TeardownReply struct { func (x *TeardownReply) Reset() { *x = TeardownReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1385,7 +1094,7 @@ func (x *TeardownReply) String() string { func (*TeardownReply) ProtoMessage() {} func (x *TeardownReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1398,7 +1107,7 @@ func (x *TeardownReply) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. func (*TeardownReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{19} + return file_protos_o2control_proto_rawDescGZIP(), []int{13} } //////////////////////////////////////// @@ -1413,7 +1122,7 @@ type GetEnvironmentsRequest struct { func (x *GetEnvironmentsRequest) Reset() { *x = GetEnvironmentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1135,7 @@ func (x *GetEnvironmentsRequest) String() string { func (*GetEnvironmentsRequest) ProtoMessage() {} func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1148,7 @@ func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{20} + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } type GetEnvironmentsReply struct { @@ -1454,7 +1163,7 @@ type GetEnvironmentsReply struct { func (x *GetEnvironmentsReply) Reset() { *x = GetEnvironmentsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1467,7 +1176,7 @@ func (x *GetEnvironmentsReply) String() string { func (*GetEnvironmentsReply) ProtoMessage() {} func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1480,7 +1189,7 @@ func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{21} + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } func (x *GetEnvironmentsReply) GetFrameworkId() string { @@ -1516,7 +1225,7 @@ type EnvironmentInfo struct { func (x *EnvironmentInfo) Reset() { *x = EnvironmentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1529,7 +1238,7 @@ func (x *EnvironmentInfo) String() string { func (*EnvironmentInfo) ProtoMessage() {} func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1542,7 +1251,7 @@ func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{22} + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } func (x *EnvironmentInfo) GetId() string { @@ -1594,46 +1303,149 @@ func (x *EnvironmentInfo) GetDefaults() map[string]string { return nil } -func (x *EnvironmentInfo) GetVars() map[string]string { - if x != nil { - return x.Vars - } - return nil +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars + } + return nil +} + +type NewEnvironmentRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} + +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate + } + return "" +} + +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + +type NewEnvironmentReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` +} + +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewEnvironmentReply) ProtoMessage() {} + +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} } -func (x *EnvironmentInfo) GetUserVars() map[string]string { +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { if x != nil { - return x.UserVars + return x.Environment } return nil } -type NewEnvironmentRequest struct { +type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (x *NewEnvironmentRequest) Reset() { - *x = NewEnvironmentRequest{} +func (x *NewAutoEnvironmentRequest) Reset() { + *x = NewAutoEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NewEnvironmentRequest) String() string { +func (x *NewAutoEnvironmentRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewEnvironmentRequest) ProtoMessage() {} +func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[23] +func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1644,50 +1456,55 @@ func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23} +// Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } -func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { +func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { if x != nil { return x.WorkflowTemplate } return "" } -func (x *NewEnvironmentRequest) GetVars() map[string]string { +func (x *NewAutoEnvironmentRequest) GetVars() map[string]string { if x != nil { return x.Vars } return nil } -type NewEnvironmentReply struct { +func (x *NewAutoEnvironmentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -func (x *NewEnvironmentReply) Reset() { - *x = NewEnvironmentReply{} +func (x *NewAutoEnvironmentReply) Reset() { + *x = NewAutoEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *NewEnvironmentReply) String() string { +func (x *NewAutoEnvironmentReply) String() string { return protoimpl.X.MessageStringOf(x) } -func (*NewEnvironmentReply) ProtoMessage() {} +func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[24] +func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1698,16 +1515,9 @@ func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{24} -} - -func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if x != nil { - return x.Environment - } - return nil +// Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } type GetEnvironmentRequest struct { @@ -1721,7 +1531,7 @@ type GetEnvironmentRequest struct { func (x *GetEnvironmentRequest) Reset() { *x = GetEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1734,7 +1544,7 @@ func (x *GetEnvironmentRequest) String() string { func (*GetEnvironmentRequest) ProtoMessage() {} func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1747,7 +1557,7 @@ func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{25} + return file_protos_o2control_proto_rawDescGZIP(), []int{21} } func (x *GetEnvironmentRequest) GetId() string { @@ -1769,7 +1579,7 @@ type GetEnvironmentReply struct { func (x *GetEnvironmentReply) Reset() { *x = GetEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1782,7 +1592,7 @@ func (x *GetEnvironmentReply) String() string { func (*GetEnvironmentReply) ProtoMessage() {} func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1795,7 +1605,7 @@ func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26} + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1824,7 +1634,7 @@ type ControlEnvironmentRequest struct { func (x *ControlEnvironmentRequest) Reset() { *x = ControlEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1837,7 +1647,7 @@ func (x *ControlEnvironmentRequest) String() string { func (*ControlEnvironmentRequest) ProtoMessage() {} func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1850,7 +1660,7 @@ func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27} + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } func (x *ControlEnvironmentRequest) GetId() string { @@ -1880,7 +1690,7 @@ type ControlEnvironmentReply struct { func (x *ControlEnvironmentReply) Reset() { *x = ControlEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1893,7 +1703,7 @@ func (x *ControlEnvironmentReply) String() string { func (*ControlEnvironmentReply) ProtoMessage() {} func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1906,7 +1716,7 @@ func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{28} + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } func (x *ControlEnvironmentReply) GetId() string { @@ -1943,7 +1753,7 @@ type ModifyEnvironmentRequest struct { func (x *ModifyEnvironmentRequest) Reset() { *x = ModifyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1956,7 +1766,7 @@ func (x *ModifyEnvironmentRequest) String() string { func (*ModifyEnvironmentRequest) ProtoMessage() {} func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1969,7 +1779,7 @@ func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{29} + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } func (x *ModifyEnvironmentRequest) GetId() string { @@ -2005,7 +1815,7 @@ type EnvironmentOperation struct { func (x *EnvironmentOperation) Reset() { *x = EnvironmentOperation{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2018,7 +1828,7 @@ func (x *EnvironmentOperation) String() string { func (*EnvironmentOperation) ProtoMessage() {} func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2031,7 +1841,7 @@ func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { @@ -2061,7 +1871,7 @@ type ModifyEnvironmentReply struct { func (x *ModifyEnvironmentReply) Reset() { *x = ModifyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2074,7 +1884,7 @@ func (x *ModifyEnvironmentReply) String() string { func (*ModifyEnvironmentReply) ProtoMessage() {} func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2087,7 +1897,7 @@ func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { @@ -2125,7 +1935,7 @@ type DestroyEnvironmentRequest struct { func (x *DestroyEnvironmentRequest) Reset() { *x = DestroyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2138,7 +1948,7 @@ func (x *DestroyEnvironmentRequest) String() string { func (*DestroyEnvironmentRequest) ProtoMessage() {} func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2151,7 +1961,7 @@ func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{28} } func (x *DestroyEnvironmentRequest) GetId() string { @@ -2193,7 +2003,7 @@ type DestroyEnvironmentReply struct { func (x *DestroyEnvironmentReply) Reset() { *x = DestroyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2206,7 +2016,7 @@ func (x *DestroyEnvironmentReply) String() string { func (*DestroyEnvironmentReply) ProtoMessage() {} func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2219,7 +2029,7 @@ func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { @@ -2246,7 +2056,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2259,7 +2069,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2272,7 +2082,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{30} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2298,7 +2108,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2311,7 +2121,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2324,7 +2134,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } type GetEnvironmentPropertiesRequest struct { @@ -2343,7 +2153,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2356,7 +2166,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2369,7 +2179,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2404,7 +2214,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2417,7 +2227,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2430,7 +2240,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2456,12 +2266,13 @@ type ShortTaskInfo struct { ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` } func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2474,7 +2285,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2487,7 +2298,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *ShortTaskInfo) GetName() string { @@ -2546,6 +2357,13 @@ func (x *ShortTaskInfo) GetPid() string { return "" } +func (x *ShortTaskInfo) GetSandboxStdout() string { + if x != nil { + return x.SandboxStdout + } + return "" +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2560,7 +2378,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2573,7 +2391,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2586,7 +2404,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2626,7 +2444,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2639,7 +2457,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2652,7 +2470,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } type GetTasksReply struct { @@ -2666,7 +2484,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2679,7 +2497,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2692,7 +2510,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2713,7 +2531,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2726,7 +2544,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2739,7 +2557,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *GetTaskRequest) GetTaskId() string { @@ -2760,7 +2578,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2773,7 +2591,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2786,7 +2604,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2808,7 +2626,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2821,7 +2639,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2834,7 +2652,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *TaskClassInfo) GetName() string { @@ -2866,7 +2684,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2879,7 +2697,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2892,7 +2710,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *CommandInfo) GetEnv() []string { @@ -2943,7 +2761,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2956,7 +2774,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2969,7 +2787,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *ChannelInfo) GetName() string { @@ -3011,7 +2829,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3024,7 +2842,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3037,7 +2855,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3107,7 +2925,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3120,7 +2938,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3133,7 +2951,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3155,7 +2973,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3168,7 +2986,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3181,7 +2999,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3213,7 +3031,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3226,7 +3044,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3239,7 +3057,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *GetRolesRequest) GetEnvId() string { @@ -3275,7 +3093,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3288,7 +3106,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3301,7 +3119,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *RoleInfo) GetName() string { @@ -3378,7 +3196,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3391,7 +3209,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3404,7 +3222,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3428,7 +3246,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3441,7 +3259,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3454,7 +3272,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3498,7 +3316,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3511,7 +3329,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3524,7 +3342,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3559,7 +3377,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3572,7 +3390,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3585,7 +3403,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3604,7 +3422,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3617,7 +3435,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3630,7 +3448,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } type RepoInfo struct { @@ -3646,7 +3464,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3659,7 +3477,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3672,7 +3490,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RepoInfo) GetName() string { @@ -3708,7 +3526,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3721,7 +3539,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3734,7 +3552,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3763,7 +3581,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3776,7 +3594,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3789,7 +3607,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *AddRepoRequest) GetName() string { @@ -3818,7 +3636,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3831,7 +3649,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3844,7 +3662,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3872,7 +3690,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3885,7 +3703,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3898,7 +3716,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3919,7 +3737,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3932,7 +3750,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3945,7 +3763,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3966,7 +3784,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3979,7 +3797,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3992,7 +3810,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4013,7 +3831,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4026,7 +3844,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4039,7 +3857,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4060,7 +3878,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4073,7 +3891,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4086,7 +3904,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4108,7 +3926,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4121,7 +3939,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4134,7 +3952,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4162,7 +3980,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4175,7 +3993,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4188,7 +4006,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4207,7 +4025,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4220,7 +4038,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4233,7 +4051,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } var File_protos_o2control_proto protoreflect.FileDescriptor @@ -4242,651 +4060,629 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x6c, 0x0a, 0x1a, 0x45, - 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x13, 0x45, 0x76, 0x5f, - 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x46, - 0x0a, 0x14, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, - 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, - 0x64, 0x22, 0x69, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x61, 0x73, 0x6b, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x74, 0x61, 0x73, 0x6b, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x2c, - 0x0a, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x15, - 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x17, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, - 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x69, - 0x64, 0x22, 0x15, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x13, 0x0a, 0x11, 0x45, 0x76, 0x5f, 0x4b, - 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x22, 0x0f, 0x0a, - 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, - 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, 0x6f, - 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, - 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x09, - 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x22, 0x86, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x61, 0x0a, 0x17, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x52, 0x0a, - 0x12, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x12, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, - 0x4f, 0x0a, 0x11, 0x74, 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x11, 0x74, - 0x61, 0x73, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x12, 0x40, 0x0a, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x61, 0x73, 0x6b, 0x6c, 0x61, 0x75, 0x6e, 0x63, 0x68, - 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x73, 0x6f, - 0x73, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x10, - 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x58, 0x0a, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x65, 0x64, 0x48, 0x00, 0x52, 0x14, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x10, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, - 0x4b, 0x69, 0x6c, 0x6c, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x00, - 0x52, 0x0e, 0x6b, 0x69, 0x6c, 0x6c, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x4d, 0x65, 0x73, 0x6f, 0x73, - 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, - 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x22, 0x8f, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, - 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0xca, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, + 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, + 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xca, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, - 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, + 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, + 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, + 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, - 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, - 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, + 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, + 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, - 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, - 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x01, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, + 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, + 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, + 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, + 0x91, 0x04, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0x91, 0x04, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, + 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x32, 0xfd, 0x0d, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -4902,190 +4698,182 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 79) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentStateChanged)(nil), // 4: o2control.Ev_EnvironmentStateChanged - (*Ev_TaskStateChanged)(nil), // 5: o2control.Ev_TaskStateChanged - (*Ev_TaskStatusChanged)(nil), // 6: o2control.Ev_TaskStatusChanged - (*Ev_TaskLaunched)(nil), // 7: o2control.Ev_TaskLaunched - (*Ev_MesosTaskCreated)(nil), // 8: o2control.Ev_MesosTaskCreated - (*Ev_EnvironmentCreated)(nil), // 9: o2control.Ev_EnvironmentCreated - (*Ev_EnvironmentDestroyed)(nil), // 10: o2control.Ev_EnvironmentDestroyed - (*Ev_EnvironmentError)(nil), // 11: o2control.Ev_EnvironmentError - (*Ev_KillTasksMesos)(nil), // 12: o2control.Ev_KillTasksMesos - (*StatusRequest)(nil), // 13: o2control.StatusRequest - (*StatusReply)(nil), // 14: o2control.StatusReply - (*StatusUpdate)(nil), // 15: o2control.StatusUpdate - (*Event)(nil), // 16: o2control.Event - (*SubscribeRequest)(nil), // 17: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 18: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 19: o2control.Version - (*GetFrameworkInfoReply)(nil), // 20: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 21: o2control.TeardownRequest - (*TeardownReply)(nil), // 22: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 23: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 24: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 25: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 26: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 27: o2control.NewEnvironmentReply - (*GetEnvironmentRequest)(nil), // 28: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 29: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 30: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 31: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 32: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 33: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 34: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 35: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 36: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 44: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 46: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo - (*CommandInfo)(nil), // 48: o2control.CommandInfo - (*ChannelInfo)(nil), // 49: o2control.ChannelInfo - (*TaskInfo)(nil), // 50: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest - (*RoleInfo)(nil), // 54: o2control.RoleInfo - (*GetRolesReply)(nil), // 55: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest - (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 59: o2control.ListReposRequest - (*RepoInfo)(nil), // 60: o2control.RepoInfo - (*ListReposReply)(nil), // 61: o2control.ListReposReply - (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 63: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 71: o2control.Empty - nil, // 72: o2control.EnvironmentInfo.DefaultsEntry - nil, // 73: o2control.EnvironmentInfo.VarsEntry - nil, // 74: o2control.EnvironmentInfo.UserVarsEntry - nil, // 75: o2control.NewEnvironmentRequest.VarsEntry - nil, // 76: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 77: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 78: o2control.TaskInfo.PropertiesEntry - nil, // 79: o2control.RoleInfo.DefaultsEntry - nil, // 80: o2control.RoleInfo.VarsEntry - nil, // 81: o2control.RoleInfo.UserVarsEntry + (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 7: o2control.StatusRequest + (*StatusReply)(nil), // 8: o2control.StatusReply + (*StatusUpdate)(nil), // 9: o2control.StatusUpdate + (*Event)(nil), // 10: o2control.Event + (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 13: o2control.Version + (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 15: o2control.TeardownRequest + (*TeardownReply)(nil), // 16: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 40: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 42: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo + (*CommandInfo)(nil), // 44: o2control.CommandInfo + (*ChannelInfo)(nil), // 45: o2control.ChannelInfo + (*TaskInfo)(nil), // 46: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest + (*RoleInfo)(nil), // 50: o2control.RoleInfo + (*GetRolesReply)(nil), // 51: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 55: o2control.ListReposRequest + (*RepoInfo)(nil), // 56: o2control.RepoInfo + (*ListReposReply)(nil), // 57: o2control.ListReposReply + (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 59: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 67: o2control.Empty + nil, // 68: o2control.EnvironmentInfo.DefaultsEntry + nil, // 69: o2control.EnvironmentInfo.VarsEntry + nil, // 70: o2control.EnvironmentInfo.UserVarsEntry + nil, // 71: o2control.NewEnvironmentRequest.VarsEntry + nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 75: o2control.TaskInfo.PropertiesEntry + nil, // 76: o2control.RoleInfo.DefaultsEntry + nil, // 77: o2control.RoleInfo.VarsEntry + nil, // 78: o2control.RoleInfo.UserVarsEntry } var file_protos_o2control_proto_depIdxs = []int32{ - 25, // 0: o2control.Ev_EnvironmentCreated.environment:type_name -> o2control.EnvironmentInfo - 52, // 1: o2control.Ev_EnvironmentDestroyed.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 15, // 2: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate - 0, // 3: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 3, // 4: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 4, // 5: o2control.Event.environmentStateChanged:type_name -> o2control.Ev_EnvironmentStateChanged - 9, // 6: o2control.Event.environmentCreated:type_name -> o2control.Ev_EnvironmentCreated - 5, // 7: o2control.Event.taskStateChanged:type_name -> o2control.Ev_TaskStateChanged - 6, // 8: o2control.Event.taskStatusChanged:type_name -> o2control.Ev_TaskStatusChanged - 7, // 9: o2control.Event.tasklaunched:type_name -> o2control.Ev_TaskLaunched - 8, // 10: o2control.Event.mesosTaskcreated:type_name -> o2control.Ev_MesosTaskCreated - 10, // 11: o2control.Event.environmentDestroyed:type_name -> o2control.Ev_EnvironmentDestroyed - 11, // 12: o2control.Event.environmentError:type_name -> o2control.Ev_EnvironmentError - 12, // 13: o2control.Event.killtasksMesos:type_name -> o2control.Ev_KillTasksMesos - 19, // 14: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 25, // 15: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 41, // 16: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 72, // 17: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 73, // 18: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 74, // 19: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 75, // 20: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 25, // 21: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 25, // 22: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 54, // 23: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 24: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 33, // 25: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 26: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 33, // 27: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 52, // 28: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 76, // 29: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 77, // 30: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 42, // 31: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 41, // 32: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 50, // 33: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 41, // 34: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 47, // 35: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 49, // 36: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 49, // 37: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 48, // 38: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 78, // 39: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 41, // 40: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 41, // 41: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 54, // 42: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 79, // 43: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 80, // 44: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 81, // 45: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 54, // 46: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 57, // 47: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 48: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 13, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 18, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 21, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 23, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 26, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 28, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 30, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 32, // 56: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 35, // 57: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 43, // 58: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 59: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 60: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 61: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 62: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 63: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 64: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 65: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 66: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 67: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 68: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 69: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 17, // 70: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 14, // 71: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 20, // 72: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 22, // 73: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 24, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 27, // 75: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 29, // 76: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 31, // 77: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 34, // 78: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 36, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 44, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 16, // 92: o2control.Control.Subscribe:output_type -> o2control.Event - 71, // [71:93] is the sub-list for method output_type - 49, // [49:71] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 50, // 39: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 40: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 41: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 42: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 44: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 50: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 51: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 52: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 53: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 54: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 55: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 56: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 57: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 58: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 59: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 60: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 61: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 62: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 63: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 64: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 65: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 66: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 67: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 68: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 69: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 70: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 71: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 72: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 73: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 74: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 75: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 76: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 77: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 78: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 79: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 80: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 81: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 82: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 83: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 84: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 86: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 87: o2control.Control.Subscribe:output_type -> o2control.Event + 65, // [65:88] is the sub-list for method output_type + 42, // [42:65] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5107,7 +4895,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentStateChanged); i { + switch v := v.(*Ev_EnvironmentEvent); i { case 0: return &v.state case 1: @@ -5119,7 +4907,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskStateChanged); i { + switch v := v.(*Ev_TaskEvent); i { case 0: return &v.state case 1: @@ -5131,7 +4919,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskStatusChanged); i { + switch v := v.(*Ev_RoleEvent); i { case 0: return &v.state case 1: @@ -5143,7 +4931,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskLaunched); i { + switch v := v.(*StatusRequest); i { case 0: return &v.state case 1: @@ -5155,7 +4943,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_MesosTaskCreated); i { + switch v := v.(*StatusReply); i { case 0: return &v.state case 1: @@ -5167,7 +4955,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentCreated); i { + switch v := v.(*StatusUpdate); i { case 0: return &v.state case 1: @@ -5179,7 +4967,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentDestroyed); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -5191,7 +4979,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentError); i { + switch v := v.(*SubscribeRequest); i { case 0: return &v.state case 1: @@ -5203,7 +4991,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_KillTasksMesos); i { + switch v := v.(*GetFrameworkInfoRequest); i { case 0: return &v.state case 1: @@ -5215,7 +5003,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { + switch v := v.(*Version); i { case 0: return &v.state case 1: @@ -5227,7 +5015,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusReply); i { + switch v := v.(*GetFrameworkInfoReply); i { case 0: return &v.state case 1: @@ -5239,7 +5027,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { + switch v := v.(*TeardownRequest); i { case 0: return &v.state case 1: @@ -5251,7 +5039,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*TeardownReply); i { case 0: return &v.state case 1: @@ -5263,7 +5051,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeRequest); i { + switch v := v.(*GetEnvironmentsRequest); i { case 0: return &v.state case 1: @@ -5275,7 +5063,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFrameworkInfoRequest); i { + switch v := v.(*GetEnvironmentsReply); i { case 0: return &v.state case 1: @@ -5287,7 +5075,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Version); i { + switch v := v.(*EnvironmentInfo); i { case 0: return &v.state case 1: @@ -5299,7 +5087,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetFrameworkInfoReply); i { + switch v := v.(*NewEnvironmentRequest); i { case 0: return &v.state case 1: @@ -5311,7 +5099,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeardownRequest); i { + switch v := v.(*NewEnvironmentReply); i { case 0: return &v.state case 1: @@ -5323,7 +5111,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TeardownReply); i { + switch v := v.(*NewAutoEnvironmentRequest); i { case 0: return &v.state case 1: @@ -5335,7 +5123,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentsRequest); i { + switch v := v.(*NewAutoEnvironmentReply); i { case 0: return &v.state case 1: @@ -5347,54 +5135,6 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentsReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvironmentInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewEnvironmentRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewEnvironmentReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentRequest); i { case 0: return &v.state @@ -5406,7 +5146,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentReply); i { case 0: return &v.state @@ -5418,7 +5158,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentRequest); i { case 0: return &v.state @@ -5430,7 +5170,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentReply); i { case 0: return &v.state @@ -5442,7 +5182,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentRequest); i { case 0: return &v.state @@ -5454,7 +5194,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentOperation); i { case 0: return &v.state @@ -5466,7 +5206,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentReply); i { case 0: return &v.state @@ -5478,7 +5218,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentRequest); i { case 0: return &v.state @@ -5490,7 +5230,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentReply); i { case 0: return &v.state @@ -5502,7 +5242,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -5514,7 +5254,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -5526,7 +5266,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -5538,7 +5278,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -5550,7 +5290,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortTaskInfo); i { case 0: return &v.state @@ -5562,7 +5302,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state @@ -5574,7 +5314,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksRequest); i { case 0: return &v.state @@ -5586,7 +5326,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksReply); i { case 0: return &v.state @@ -5598,7 +5338,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskRequest); i { case 0: return &v.state @@ -5610,7 +5350,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskReply); i { case 0: return &v.state @@ -5622,7 +5362,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskClassInfo); i { case 0: return &v.state @@ -5634,7 +5374,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -5646,7 +5386,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -5658,7 +5398,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -5670,7 +5410,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -5682,7 +5422,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -5694,7 +5434,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -5706,7 +5446,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -5718,7 +5458,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -5730,7 +5470,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -5742,7 +5482,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -5754,7 +5494,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -5766,7 +5506,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -5778,7 +5518,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -5790,7 +5530,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -5802,7 +5542,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -5814,7 +5554,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -5826,7 +5566,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -5838,7 +5578,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -5850,7 +5590,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -5862,7 +5602,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -5874,7 +5614,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -5886,7 +5626,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -5898,7 +5638,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -5910,7 +5650,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -5923,19 +5663,13 @@ func file_protos_o2control_proto_init() { } } } - file_protos_o2control_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), } - file_protos_o2control_proto_msgTypes[13].OneofWrappers = []interface{}{ - (*Event_EnvironmentStateChanged)(nil), - (*Event_EnvironmentCreated)(nil), - (*Event_TaskStateChanged)(nil), - (*Event_TaskStatusChanged)(nil), - (*Event_Tasklaunched)(nil), - (*Event_MesosTaskcreated)(nil), - (*Event_EnvironmentDestroyed)(nil), - (*Event_EnvironmentError)(nil), - (*Event_KilltasksMesos)(nil), + file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -5943,7 +5677,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 79, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 94d2d97c1..81fdcbe63 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -21,6 +21,7 @@ type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) @@ -108,6 +109,15 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments return out, nil } +func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { + out := new(NewAutoEnvironmentReply) + err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) @@ -301,6 +311,7 @@ type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) @@ -337,6 +348,9 @@ func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (* func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } +func (UnimplementedControlServer) NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") +} func (UnimplementedControlServer) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") } @@ -478,6 +492,24 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewAutoEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewAutoEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/NewAutoEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(NewEnvironmentRequest) if err := dec(in); err != nil { @@ -821,6 +853,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, }, + { + MethodName: "NewAutoEnvironment", + Handler: _Control_NewAutoEnvironment_Handler, + }, { MethodName: "NewEnvironment", Handler: _Control_NewEnvironment_Handler, diff --git a/core/task/manager.go b/core/task/manager.go index 470ab4680..bcc62ea03 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -39,6 +39,7 @@ import ( pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/the" "github.com/mesos/mesos-go/api/v1/lib/extras/store" "gopkg.in/yaml.v3" diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 4f0033b00..85efaa055 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/gobwas/glob" "github.com/sirupsen/logrus" ) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 22e7f8205..ef476598d 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/gobwas/glob" ) From 4c34109b9c4fc10efae9dbcbf5d81c2857fdf8e8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Feb 2021 14:38:42 +0100 Subject: [PATCH 0710/2352] [build] Bump to v0.19.90 (beta for v0.20.0 including apricot) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7d67a215f..b74eca3d6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 19 -VERSION_PATCH := 80 +VERSION_PATCH := 90 From f5a3ae4944c652697e0c184e295e1277018b7a2c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Feb 2021 14:40:32 +0100 Subject: [PATCH 0711/2352] [misc] Update documentation --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 2 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_history.md | 13 +- coconut/doc/coconut_configuration_import.md | 12 +- coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 5 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 3 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- .../coconut_repository_default-revision.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 2 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 2 +- docs/apidocs_aliecs.md | 187 ++++++++---------- docs/apidocs_apricot.md | 95 ++++++++- 31 files changed, 216 insertions(+), 149 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index decca544c..21b98c156 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -31,4 +31,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 3ecec2562..f1be99336 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -30,4 +30,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index b01db8b21..8a949876b 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -32,4 +32,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 2985e642c..0df3e749a 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -35,4 +35,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index 41a3b03a3..feedd2179 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -4,8 +4,8 @@ List all existing entries with timestamps of a specified component in Consul ### Synopsis -The configuration history command returns all entries with -all of their associated timestamps or returns all timestamps for a specified component and entry +The configuration history command returns all timestamps for a specified component +and entry ``` coconut configuration history [flags] @@ -14,7 +14,6 @@ coconut configuration history [flags] ### Examples ``` -coconut conf history coconut conf history coconut conf history /// ``` @@ -22,8 +21,10 @@ coconut conf history /// ### Options ``` - -h, --help help for history - -o, --output string output format for the returned entries (yaml/json) (default "yaml") + -h, --help help for history + -o, --output string output format for the returned entries (yaml/json) (default "yaml") + -l, --role string request configuration for this O² machine role + -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) ``` ### Options inherited from parent commands @@ -40,4 +41,4 @@ coconut conf history /// * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index 720c77e3f..84c3ce226 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -29,10 +29,12 @@ coconut conf import --no-versioning --new-compon ### Options ``` - -f, --format string force a specific configuration file type, overriding any file extension - -h, --help help for import - -n, --new-component create a new configuration component while importing entry - --no-versioning create an unversioned configuration entry (no timestamps are stored) + -f, --format string force a specific configuration file type, overriding any file extension + -h, --help help for import + -n, --new-component create a new configuration component while importing entry + --no-versioning create an unversioned configuration entry (no timestamps are stored) + -l, --role string request configuration for this O² machine role + -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) ``` ### Options inherited from parent commands @@ -49,4 +51,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 3b7051a77..9582e803a 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -41,4 +41,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 92cedb35d..6b70afeb0 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -20,6 +20,7 @@ coconut conf show -t coconut conf show /// coconut conf show /// -t coconut conf show ///@ +coconut conf show -r -l -t ' coconut conf show -s -e '{"key1": "value1", "key2": "value2"}' ``` @@ -28,6 +29,8 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" ``` -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` -h, --help help for show + -l, --role string request configuration for this O² machine role + -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) -s, --simulate simulate runtime template processing on the configuration payload -t, --timestamp string request configuration for this timestamp ``` @@ -46,4 +49,4 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index a455e8bf3..b4b5f6c85 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -52,4 +52,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index a57605142..acf9a0d10 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -40,4 +40,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 11ef9845b..eef6ea1ea 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -27,6 +27,7 @@ coconut environment create [flags] ### Options ``` + -a, --auto create an autorun environment -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` -h, --help help for create -w, --workflow-template string workflow to be loaded in the new environment @@ -46,4 +47,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index e615346f2..3bb96bc4b 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -37,4 +37,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 9228163e1..3bd7036d6 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -31,4 +31,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index e67ba0c9a..9aad58220 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -33,4 +33,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index 55e6431d1..d7a0ed5dd 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -31,4 +31,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 9d1360d9d..03fa33d1d 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -57,4 +57,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 80b6b1471..a6a3dbcc1 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -37,4 +37,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index e09277b6f..19e8dc0b7 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -37,4 +37,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index bd8d9848a..5debdf61a 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index b8f81a69b..9bbca1480 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index a016900a6..e924a14a4 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 12c82dbaf..6b5dbe746 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 6ee337eca..d56c3ef9b 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -28,4 +28,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index c138a716e..a74261603 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -30,4 +30,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 1d56d6495..4256d3c8d 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -29,4 +29,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 28a49f26d..ab495a933 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -32,4 +32,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index ccc66d4c4..e3da46d06 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -31,4 +31,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 171f27d45..58d00e794 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -28,4 +28,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 2f3938ac1..e255755e7 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -53,4 +53,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 11-Jan-2021 +###### Auto generated by spf13/cobra on 8-Feb-2021 diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 3280a73b6..694347cf5 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -20,15 +20,9 @@ - [EnvironmentInfo.UserVarsEntry](#o2control.EnvironmentInfo.UserVarsEntry) - [EnvironmentInfo.VarsEntry](#o2control.EnvironmentInfo.VarsEntry) - [EnvironmentOperation](#o2control.EnvironmentOperation) - - [Ev_EnvironmentCreated](#o2control.Ev_EnvironmentCreated) - - [Ev_EnvironmentDestroyed](#o2control.Ev_EnvironmentDestroyed) - - [Ev_EnvironmentError](#o2control.Ev_EnvironmentError) - - [Ev_EnvironmentStateChanged](#o2control.Ev_EnvironmentStateChanged) - - [Ev_KillTasksMesos](#o2control.Ev_KillTasksMesos) - - [Ev_MesosTaskCreated](#o2control.Ev_MesosTaskCreated) - - [Ev_TaskLaunched](#o2control.Ev_TaskLaunched) - - [Ev_TaskStateChanged](#o2control.Ev_TaskStateChanged) - - [Ev_TaskStatusChanged](#o2control.Ev_TaskStatusChanged) + - [Ev_EnvironmentEvent](#o2control.Ev_EnvironmentEvent) + - [Ev_RoleEvent](#o2control.Ev_RoleEvent) + - [Ev_TaskEvent](#o2control.Ev_TaskEvent) - [Event](#o2control.Event) - [Event_MesosHeartbeat](#o2control.Event_MesosHeartbeat) - [GetEnvironmentPropertiesReply](#o2control.GetEnvironmentPropertiesReply) @@ -52,6 +46,9 @@ - [ListReposRequest](#o2control.ListReposRequest) - [ModifyEnvironmentReply](#o2control.ModifyEnvironmentReply) - [ModifyEnvironmentRequest](#o2control.ModifyEnvironmentRequest) + - [NewAutoEnvironmentReply](#o2control.NewAutoEnvironmentReply) + - [NewAutoEnvironmentRequest](#o2control.NewAutoEnvironmentRequest) + - [NewAutoEnvironmentRequest.VarsEntry](#o2control.NewAutoEnvironmentRequest.VarsEntry) - [NewEnvironmentReply](#o2control.NewEnvironmentReply) - [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) - [NewEnvironmentRequest.VarsEntry](#o2control.NewEnvironmentRequest.VarsEntry) @@ -363,131 +360,57 @@ - + -### Ev_EnvironmentCreated +### Ev_EnvironmentEvent | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | - - - - - - - - -### Ev_EnvironmentDestroyed - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| cleanupTasksReply | [CleanupTasksReply](#o2control.CleanupTasksReply) | | | -| environmentid | [string](#string) | | | - - - - - - - - -### Ev_EnvironmentError - - - - - - - - - -### Ev_EnvironmentStateChanged - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| event | [string](#string) | | | -| source | [string](#string) | | | -| destination | [string](#string) | | | - - - - - - - - -### Ev_KillTasksMesos - - - - - - - - - -### Ev_MesosTaskCreated - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| taskresources | [string](#string) | | | -| executorResources | [string](#string) | | | - - - - - - - - -### Ev_TaskLaunched - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| taskid | [string](#string) | | | +| environmentId | [string](#string) | | | +| state | [string](#string) | | | +| currentRunNumber | [uint32](#uint32) | | | +| error | [string](#string) | | | +| message | [string](#string) | | | - + -### Ev_TaskStateChanged +### Ev_RoleEvent | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| taskid | [string](#string) | | | +| name | [string](#string) | | | +| status | [string](#string) | | | | state | [string](#string) | | | +| rolePath | [string](#string) | | | - + -### Ev_TaskStatusChanged +### Ev_TaskEvent | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | | taskid | [string](#string) | | | +| state | [string](#string) | | | | status | [string](#string) | | | +| hostname | [string](#string) | | | +| className | [string](#string) | | | @@ -503,15 +426,9 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | timestamp | [string](#string) | | | -| environmentStateChanged | [Ev_EnvironmentStateChanged](#o2control.Ev_EnvironmentStateChanged) | | | -| environmentCreated | [Ev_EnvironmentCreated](#o2control.Ev_EnvironmentCreated) | | | -| taskStateChanged | [Ev_TaskStateChanged](#o2control.Ev_TaskStateChanged) | | | -| taskStatusChanged | [Ev_TaskStatusChanged](#o2control.Ev_TaskStatusChanged) | | | -| tasklaunched | [Ev_TaskLaunched](#o2control.Ev_TaskLaunched) | | | -| mesosTaskcreated | [Ev_MesosTaskCreated](#o2control.Ev_MesosTaskCreated) | | | -| environmentDestroyed | [Ev_EnvironmentDestroyed](#o2control.Ev_EnvironmentDestroyed) | | | -| environmentError | [Ev_EnvironmentError](#o2control.Ev_EnvironmentError) | | | -| killtasksMesos | [Ev_KillTasksMesos](#o2control.Ev_KillTasksMesos) | | | +| environmentEvent | [Ev_EnvironmentEvent](#o2control.Ev_EnvironmentEvent) | | | +| taskEvent | [Ev_TaskEvent](#o2control.Ev_TaskEvent) | | | +| roleEvent | [Ev_RoleEvent](#o2control.Ev_RoleEvent) | | | @@ -846,6 +763,49 @@ Roles + + +### NewAutoEnvironmentReply + + + + + + + + + +### NewAutoEnvironmentRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| workflowTemplate | [string](#string) | | | +| vars | [NewAutoEnvironmentRequest.VarsEntry](#o2control.NewAutoEnvironmentRequest.VarsEntry) | repeated | | +| id | [string](#string) | | | + + + + + + + + +### NewAutoEnvironmentRequest.VarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + ### NewEnvironmentReply @@ -1147,6 +1107,7 @@ Tasks | className | [string](#string) | | | | deploymentInfo | [TaskDeploymentInfo](#o2control.TaskDeploymentInfo) | | | | pid | [string](#string) | | | +| sandboxStdout | [string](#string) | | | @@ -1202,6 +1163,11 @@ Global status +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| id | [string](#string) | | | + + @@ -1400,6 +1366,7 @@ Not implemented yet | GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control.GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control.GetFrameworkInfoReply) | | | Teardown | [TeardownRequest](#o2control.TeardownRequest) | [TeardownReply](#o2control.TeardownReply) | | | GetEnvironments | [GetEnvironmentsRequest](#o2control.GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control.GetEnvironmentsReply) | | +| NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control.NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control.NewAutoEnvironmentReply) | | | NewEnvironment | [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) | [NewEnvironmentReply](#o2control.NewEnvironmentReply) | | | GetEnvironment | [GetEnvironmentRequest](#o2control.GetEnvironmentRequest) | [GetEnvironmentReply](#o2control.GetEnvironmentReply) | | | ControlEnvironment | [ControlEnvironmentRequest](#o2control.ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control.ControlEnvironmentReply) | | diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index 53614e3a3..e493d9f04 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -4,12 +4,17 @@ ## Table of Contents - [apricot.proto](#apricot.proto) + - [ComponentEntriesQuery](#apricot.ComponentEntriesQuery) + - [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) - [ComponentQuery](#apricot.ComponentQuery) - [ComponentRequest](#apricot.ComponentRequest) - [ComponentRequest.VarStackEntry](#apricot.ComponentRequest.VarStackEntry) - [ComponentResponse](#apricot.ComponentResponse) - [Empty](#apricot.Empty) - [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) + - [ImportComponentConfigurationRequest](#apricot.ImportComponentConfigurationRequest) + - [ImportComponentConfigurationResponse](#apricot.ImportComponentConfigurationResponse) + - [ListComponentEntriesRequest](#apricot.ListComponentEntriesRequest) - [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) - [RunNumberResponse](#apricot.RunNumberResponse) - [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) @@ -31,6 +36,38 @@ + + +### ComponentEntriesQuery + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | +| runType | [RunType](#apricot.RunType) | | | +| machineRole | [string](#string) | | | + + + + + + + + +### ComponentEntriesResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| payload | [string](#string) | repeated | | + + + + + + ### ComponentQuery @@ -125,6 +162,58 @@ + + +### ImportComponentConfigurationRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| query | [ComponentQuery](#apricot.ComponentQuery) | | | +| payload | [string](#string) | | | +| newComponent | [bool](#bool) | | | +| useVersioning | [bool](#bool) | | | + + + + + + + + +### ImportComponentConfigurationResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| existingComponentUpdated | [bool](#bool) | | | +| existingEntryUpdated | [bool](#bool) | | | +| newTimestamp | [int64](#int64) | | | + + + + + + + + +### ListComponentEntriesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| path | [string](#string) | | | +| query | [ComponentEntriesQuery](#apricot.ComponentEntriesQuery) | | | +| includeTimestamps | [bool](#bool) | | | + + + + + + ### RawGetRecursiveRequest @@ -237,10 +326,14 @@ | NewRunNumber | [Empty](#apricot.Empty) | [RunNumberResponse](#apricot.RunNumberResponse) | | | GetDefaults | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | | GetVars | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | -| GetComponentConfiguration | [ComponentRequest](#apricot.ComponentRequest) | [ComponentResponse](#apricot.ComponentResponse) | | | RawGetRecursive | [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) | [ComponentResponse](#apricot.ComponentResponse) | | | GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) | [ComponentResponse](#apricot.ComponentResponse) | | | SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) | [Empty](#apricot.Empty) | | +| ListComponents | [Empty](#apricot.Empty) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | +| ListComponentEntries | [ListComponentEntriesRequest](#apricot.ListComponentEntriesRequest) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | +| ListComponentEntryHistory | [ComponentQuery](#apricot.ComponentQuery) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | +| GetComponentConfiguration | [ComponentRequest](#apricot.ComponentRequest) | [ComponentResponse](#apricot.ComponentResponse) | | +| ImportComponentConfiguration | [ImportComponentConfigurationRequest](#apricot.ImportComponentConfigurationRequest) | [ImportComponentConfigurationResponse](#apricot.ImportComponentConfigurationResponse) | | From 0d4d7d732098d010ea710b825a1e824fbd234adc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Feb 2021 14:19:44 +0100 Subject: [PATCH 0712/2352] [core] Add new INVARIANT machine state for callRoles --- core/task/state.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/task/state.go b/core/task/state.go index 2a09979cf..c12455517 100644 --- a/core/task/state.go +++ b/core/task/state.go @@ -33,6 +33,7 @@ const ( ERROR DONE MIXED + INVARIANT ) var _names = []string{ @@ -43,6 +44,7 @@ var _names = []string{ "ERROR", "DONE", "MIXED", + "INVARIANT", } func (s State) String() string { @@ -69,5 +71,13 @@ func (s State) X(other State) State { if s == ERROR { return ERROR } + if s != other { + if s == INVARIANT { + return other + } + if other == INVARIANT { + return s + } + } return MIXED } From 435166c651db3455c45afd4deaa6ece7adc8fc5b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Feb 2021 14:20:25 +0100 Subject: [PATCH 0713/2352] [core] Support for integration plugins --- core/integration/plugin.go | 102 +++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 core/integration/plugin.go diff --git a/core/integration/plugin.go b/core/integration/plugin.go new file mode 100644 index 000000000..6d5890d70 --- /dev/null +++ b/core/integration/plugin.go @@ -0,0 +1,102 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package integration + +import ( + "sync" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/core/integration/dcs" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var log = logger.New(logrus.StandardLogger(), "integration") + +var( + once sync.Once + instance Plugins +) + +type Plugins []Plugin + +type Plugin interface { + GetName() string + Init(instanceId string) error + ObjectStack(varStack map[string]string) map[string]interface{} + Destroy() error +} + +func (p Plugins) InitAll(fid string) { + for _, plugin := range p { + initErr := plugin.Init(fid) + if initErr != nil { + log.WithError(initErr). + WithField("plugin", plugin.GetName()). + Error("workflow plugin failed to initialize") + } + } +} + +func (p Plugins) DestroyAll() { + for _, plugin := range p { + err := plugin.Destroy() + if err != nil { + log.WithError(err). + WithField("plugin", plugin.GetName()). + Error("workflow plugin failed to destroy") + } + } +} + +func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + for _, plugin := range p { + s := plugin.ObjectStack(varStack) + stack[plugin.GetName()] = s + } + return +} + +func PluginsInstance() Plugins { + once.Do(func() { + var endpoint string + if viper.IsSet("dcsServiceEndpoint") { //coconut + endpoint = viper.GetString("dcsServiceEndpoint") + instance = []Plugin{} + + pluginList := viper.GetStringSlice("integrationPlugins") + if utils.StringSliceContains(pluginList, "dcs") { + instance = append(instance, dcs.NewPlugin(endpoint)) + } + } else { + log.WithField("dcsServiceEndpoint", endpoint).Error("bad DCS service endpoint") + instance = Plugins{} + } + }) + return instance +} + From 8a5c87d06a838ee4b9a8d5c3400b6adc6baf766a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 8 Feb 2021 14:23:06 +0100 Subject: [PATCH 0714/2352] [core] Support for callRoles as triggers for integration plugins --- Makefile | 2 +- core/config.go | 7 +- core/core.go | 7 + core/environment/environment.go | 10 +- core/environment/manager.go | 6 +- core/integration/dcs/client.go | 75 ++ core/integration/dcs/plugin.go | 251 +++++ core/integration/dcs/protos/dcs.pb.go | 1085 +++++++++++++++++++ core/{ => integration/dcs}/protos/dcs.proto | 153 +-- core/integration/dcs/protos/dcs_grpc.pb.go | 231 ++++ core/server.go | 1 + core/workflow/aggregator.go | 21 +- core/workflow/callable/call.go | 143 +++ core/workflow/callrole.go | 263 +++++ core/workflow/iteratorrole.go | 10 + core/workflow/parentadapter.go | 9 + core/workflow/role.go | 10 +- core/workflow/rolebase.go | 10 + core/workflow/safestate.go | 7 +- core/workflow/safestatus.go | 7 +- core/workflow/taskrole.go | 16 +- 21 files changed, 2237 insertions(+), 87 deletions(-) create mode 100644 core/integration/dcs/client.go create mode 100644 core/integration/dcs/plugin.go create mode 100644 core/integration/dcs/protos/dcs.pb.go rename core/{ => integration/dcs}/protos/dcs.proto (58%) create mode 100644 core/integration/dcs/protos/dcs_grpc.pb.go create mode 100644 core/workflow/callable/call.go create mode 100644 core/workflow/callrole.go diff --git a/Makefile b/Makefile index a3d7cdbd0..995b7ef66 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./core ./executor ./coconut/cmd ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./executor ./core/integration/dcs ./odcshim ./walnut SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target diff --git a/core/config.go b/core/config.go index 11092ef67..10405a6f3 100644 --- a/core/config.go +++ b/core/config.go @@ -94,6 +94,8 @@ func setDefaults() error { viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) viper.SetDefault("configServiceUri", "apricot://localhost:47101") + viper.SetDefault("dcsServiceEndpoint", "localhost:50051") + viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") @@ -136,6 +138,8 @@ func setFlags() error { pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("configServiceUri", viper.GetString("configServiceUri"), "URI of the Apricot instance (`apricot://host:port`), Consul server (`consul://`) or YAML configuration file, entry point for all configuration") + pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") + pflag.String("integrationPlugins", viper.GetString("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") @@ -235,7 +239,6 @@ func bindEnvironmentVariables() { viper.AutomaticEnv() } - // NewConfig is the constructor for a new config. func NewConfig() (err error) { if err = setDefaults(); err != nil { @@ -258,7 +261,5 @@ func NewConfig() (err error) { if err = checkWorkingDirRights(); err != nil { return } - - return } diff --git a/core/core.go b/core/core.go index a7a39a728..2465c4ab0 100644 --- a/core/core.go +++ b/core/core.go @@ -31,6 +31,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/product" + "github.com/AliceO2Group/Control/core/integration" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -73,6 +74,9 @@ func Run() error { state.taskman.Start(ctx) + // Plugins need to start after taskman is running, because taskman provides the FID + integration.PluginsInstance().InitAll(state.taskman.GetFrameworkID()) + lis, err := net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("controlPort"))) if err != nil { log.WithField("error", err). @@ -83,6 +87,9 @@ func Run() error { log.WithField("error", err).Fatal("GRPC server failed to serve") } + // Ensure all workflow plugins are destroyed before core teardown + integration.PluginsInstance().DestroyAll() + return err } diff --git a/core/environment/environment.go b/core/environment/environment.go index df1f2deb3..e2dd97f7e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -98,6 +98,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { // Make the KVs accessible to the workflow via ParentAdapter env.wfAdapter = workflow.NewParentAdapter( func() uid.ID { return env.Id() }, + func() uint32 { return env.GetCurrentRunNumber() }, func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, @@ -159,7 +160,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err error) { - hooksToTrigger := workflow.GetHooksForTrigger(trigger) + allHooks := workflow.GetHooksForTrigger(trigger) + allHooks.FilterCalls().CallAll() + + hooksToTrigger := allHooks.FilterTasks() if len(hooksToTrigger) == 0 { return nil } @@ -427,7 +431,9 @@ func (env *Environment) unsubscribeFromWfState() { select { case env.unsubscribe <- struct{}{}: default: - close(env.unsubscribe) + if env.unsubscribe != nil { + close(env.unsubscribe) + } } }) } diff --git a/core/environment/manager.go b/core/environment/manager.go index 4f0349705..c666a8b86 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -254,7 +254,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.mu.Unlock() // we trigger all cleanup hooks - err = envs.taskman.TriggerHooks(cleanupHooks) + cleanupHooks.FilterCalls().CallAll() + cleanupTaskHooks := cleanupHooks.FilterTasks() + err = envs.taskman.TriggerHooks(cleanupTaskHooks) if err != nil { log.WithError(err).Warn("environment post-destroy hooks failed") } @@ -262,7 +264,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.mu.Lock() // and then we kill them too - taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupHooks, nil) + taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupTaskHooks, nil) // we remake the pending teardown channel too, because each completed TasksReleasedEvent // automatically closes it diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go new file mode 100644 index 000000000..92f4a6161 --- /dev/null +++ b/core/integration/dcs/client.go @@ -0,0 +1,75 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package dcs + +import ( + "context" + + "github.com/AliceO2Group/Control/common/logger" + dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +var log = logger.New(logrus.StandardLogger(),"dcsclient") + + +type RpcClient struct { + dcspb.ConfiguratorClient + conn *grpc.ClientConn +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing DCS client") + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + client := &RpcClient { + ConfiguratorClient: dcspb.NewConfiguratorClient(conn), + conn: conn, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + return m.conn.Close() +} \ No newline at end of file diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go new file mode 100644 index 000000000..ecc7a7f66 --- /dev/null +++ b/core/integration/dcs/plugin.go @@ -0,0 +1,251 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/dcs.proto + +package dcs + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/url" + "strconv" + "time" + + dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +const DCS_CALL_TIMEOUT = 10 * time.Second + +type Plugin struct { + dcsHost string + dcsPort int + + dcsClient *RpcClient +} + +func NewPlugin(endpoint string) *Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + dcsHost: u.Hostname(), + dcsPort: portNumber, + dcsClient: nil, + } +} + +func (p *Plugin) GetName() string { + return "dcs" +} + +func (p *Plugin) Init(instanceId string) error { + if p.dcsClient == nil { + callTimeout := DCS_CALL_TIMEOUT + cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + p.dcsClient = NewClient(cxt, cancel, viper.GetString("dcsServiceEndpoint")) + if p.dcsClient == nil { + return fmt.Errorf("failed to connect to DCS service on %s", viper.GetString("dcsServiceEndpoint")) + } + + in := &dcspb.SubscriptionRequest{InstanceId: instanceId} + evStream, err := p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) + if err != nil { + return fmt.Errorf("failed to subscribe to DCS client on %s", viper.GetString("dcsServiceEndpoint")) + } + go func() { + for { + ev, err := evStream.Recv() + if err == io.EOF { + break + } + if err != nil { + log.WithError(err).Error("bad event from DCS service") + } + log.WithField("event", ev.String()).Debug("received DCS event") + } + }() + } + if p.dcsClient == nil { + return fmt.Errorf("failed to start DCS client on %s", viper.GetString("dcsServiceEndpoint")) + } + return nil +} + +func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing DCS SOR") + + parameters, ok := varStack["dcs_sor_parameters"] + if !ok { + log.Debug("no DCS SOR parameters set") + parameters = "{}" + } + + argMap := make(map[string]string) + bytes := []byte(parameters) + err := json.Unmarshal(bytes, &argMap) + if err != nil { + log.WithError(err).Error("error processing DCS SOR parameters") + return + } + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for DCS SOR") + } + + rt := dcspb.RunType_RT_TECHNICAL + runTypeS, ok := varStack["run_type"] + if ok { + // a detector is defined in the var stack + intRt, ok := dcspb.RunType_value[runTypeS] + if ok { + // the runType was correctly matched to the DCS enum + rt = dcspb.RunType(intRt) + } + } + + det := dcspb.Detector_NULL_DETECTOR + detector, ok := varStack["detector"] + if ok { + // a detector is defined in the var stack + intDet, ok := dcspb.Detector_value[detector] + if ok { + // detector string correctly matched to DCS enum + det = dcspb.Detector(intDet) + } + } + + in := dcspb.SorRequest{ + Detector: det, + RunType: rt, + RunNumber: int32(runNumber64), + Parameters: argMap, + } + if p.dcsClient == nil { + log.WithError(fmt.Errorf("DCS plugin not initialized")). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS SOR") + return + } + if p.dcsClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("DCS client connection not available")). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS SOR") + return + } + _, err = p.dcsClient.StartOfRun(context.Background(), &in, grpc.EmptyCallOption{}) + // FIXME: don't ignore response + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS SOR") + } + return + } + stack["EndOfRun"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing DCS EOR") + + parameters, ok := varStack["dcs_eor_parameters"] + if !ok { + log.Debug("no DCS EOR parameters set") + parameters = "{}" + } + + argMap := make(map[string]string) + bytes := []byte(parameters) + err := json.Unmarshal(bytes, &argMap) + if err != nil { + log.WithError(err).Error("error processing DCS EOR parameters") + return + } + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for DCS EOR") + } + + det := dcspb.Detector_NULL_DETECTOR + detector, ok := varStack["detector"] + if ok { + // a detector is defined in the var stack + intDet, ok := dcspb.Detector_value[detector] + if ok { + // detector string correctly matched to DCS enum + det = dcspb.Detector(intDet) + } + } + + in := dcspb.EorRequest{ + Detector: det, + RunNumber: int32(runNumber64), + Parameters: argMap, + } + if p.dcsClient == nil { + log.WithError(fmt.Errorf("DCS plugin not initialized")). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS EOR") + return + } + if p.dcsClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("DCS client connection not available")). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS EOR") + return + } + _, err = p.dcsClient.EndOfRun(context.Background(), &in, grpc.EmptyCallOption{}) + // FIXME: don't ignore response + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DCS EOR") + } + return + } + + return +} + +func (p *Plugin) Destroy() error { + return p.dcsClient.Close() +} + diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go new file mode 100644 index 000000000..e474fe1e4 --- /dev/null +++ b/core/integration/dcs/protos/dcs.pb.go @@ -0,0 +1,1085 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2020 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Modified OmbrettaPinazza@DCS 13/11/2020 + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: protos/dcs.proto + +package dcspb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type EventType int32 + +const ( + EventType_NULL_EVENT EventType = 0 + EventType_HEARTBEAT EventType = 1 + EventType_STATE_CHANGE_EVENT EventType = 2 + EventType_ERROR_EVENT EventType = 3 + EventType_ACK_EVENT EventType = 4 + EventType_SOR_EVENT EventType = 20 + EventType_EOR_EVENT EventType = 30 +) + +// Enum value maps for EventType. +var ( + EventType_name = map[int32]string{ + 0: "NULL_EVENT", + 1: "HEARTBEAT", + 2: "STATE_CHANGE_EVENT", + 3: "ERROR_EVENT", + 4: "ACK_EVENT", + 20: "SOR_EVENT", + 30: "EOR_EVENT", + } + EventType_value = map[string]int32{ + "NULL_EVENT": 0, + "HEARTBEAT": 1, + "STATE_CHANGE_EVENT": 2, + "ERROR_EVENT": 3, + "ACK_EVENT": 4, + "SOR_EVENT": 20, + "EOR_EVENT": 30, + } +) + +func (x EventType) Enum() *EventType { + p := new(EventType) + *p = x + return p +} + +func (x EventType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EventType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[0].Descriptor() +} + +func (EventType) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[0] +} + +func (x EventType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use EventType.Descriptor instead. +func (EventType) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{0} +} + +type Detector int32 + +const ( + Detector_NULL_DETECTOR Detector = 0 + Detector_CPV Detector = 1 + Detector_EMC Detector = 2 + Detector_FDD Detector = 3 + Detector_FT0 Detector = 4 + Detector_FV0 Detector = 5 + Detector_ITS Detector = 6 + Detector_HMP Detector = 7 + Detector_MCH Detector = 8 + Detector_MFT Detector = 9 + Detector_MID Detector = 10 + Detector_PHS Detector = 11 + Detector_TOF Detector = 12 + Detector_TPC Detector = 13 + Detector_TRD Detector = 14 + Detector_ZDC Detector = 15 + Detector_DCS Detector = 16 +) + +// Enum value maps for Detector. +var ( + Detector_name = map[int32]string{ + 0: "NULL_DETECTOR", + 1: "CPV", + 2: "EMC", + 3: "FDD", + 4: "FT0", + 5: "FV0", + 6: "ITS", + 7: "HMP", + 8: "MCH", + 9: "MFT", + 10: "MID", + 11: "PHS", + 12: "TOF", + 13: "TPC", + 14: "TRD", + 15: "ZDC", + 16: "DCS", + } + Detector_value = map[string]int32{ + "NULL_DETECTOR": 0, + "CPV": 1, + "EMC": 2, + "FDD": 3, + "FT0": 4, + "FV0": 5, + "ITS": 6, + "HMP": 7, + "MCH": 8, + "MFT": 9, + "MID": 10, + "PHS": 11, + "TOF": 12, + "TPC": 13, + "TRD": 14, + "ZDC": 15, + "DCS": 16, + } +) + +func (x Detector) Enum() *Detector { + p := new(Detector) + *p = x + return p +} + +func (x Detector) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Detector) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[1].Descriptor() +} + +func (Detector) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[1] +} + +func (x Detector) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Detector.Descriptor instead. +func (Detector) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{1} +} + +type DetectorState int32 + +const ( + DetectorState_NULL_STATE DetectorState = 0 + DetectorState_READY DetectorState = 1 + DetectorState_RUN_OK DetectorState = 2 + DetectorState_RUN_FAILURE DetectorState = 3 + DetectorState_SOR_PROGRESSING DetectorState = 4 + DetectorState_EOR_PROGRESSING DetectorState = 5 + DetectorState_SOR_FAILURE DetectorState = 6 + DetectorState_EOR_FAILURE DetectorState = 7 + DetectorState_ERROR DetectorState = 8 +) + +// Enum value maps for DetectorState. +var ( + DetectorState_name = map[int32]string{ + 0: "NULL_STATE", + 1: "READY", + 2: "RUN_OK", + 3: "RUN_FAILURE", + 4: "SOR_PROGRESSING", + 5: "EOR_PROGRESSING", + 6: "SOR_FAILURE", + 7: "EOR_FAILURE", + 8: "ERROR", + } + DetectorState_value = map[string]int32{ + "NULL_STATE": 0, + "READY": 1, + "RUN_OK": 2, + "RUN_FAILURE": 3, + "SOR_PROGRESSING": 4, + "EOR_PROGRESSING": 5, + "SOR_FAILURE": 6, + "EOR_FAILURE": 7, + "ERROR": 8, + } +) + +func (x DetectorState) Enum() *DetectorState { + p := new(DetectorState) + *p = x + return p +} + +func (x DetectorState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (DetectorState) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[2].Descriptor() +} + +func (DetectorState) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[2] +} + +func (x DetectorState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use DetectorState.Descriptor instead. +func (DetectorState) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{2} +} + +type RunType int32 + +const ( + RunType_RT_NULL RunType = 0 + RunType_RT_PHYSICS RunType = 1 + RunType_RT_TECHNICAL RunType = 2 +) + +// Enum value maps for RunType. +var ( + RunType_name = map[int32]string{ + 0: "RT_NULL", + 1: "RT_PHYSICS", + 2: "RT_TECHNICAL", + } + RunType_value = map[string]int32{ + "RT_NULL": 0, + "RT_PHYSICS": 1, + "RT_TECHNICAL": 2, + } +) + +func (x RunType) Enum() *RunType { + p := new(RunType) + *p = x + return p +} + +func (x RunType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[3].Descriptor() +} + +func (RunType) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[3] +} + +func (x RunType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunType.Descriptor instead. +func (RunType) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{3} +} + +type TriggerMode int32 + +const ( + TriggerMode_TM_CONTINUOUS TriggerMode = 0 + TriggerMode_TM_TRIGGERED TriggerMode = 1 +) + +// Enum value maps for TriggerMode. +var ( + TriggerMode_name = map[int32]string{ + 0: "TM_CONTINUOUS", + 1: "TM_TRIGGERED", + } + TriggerMode_value = map[string]int32{ + "TM_CONTINUOUS": 0, + "TM_TRIGGERED": 1, + } +) + +func (x TriggerMode) Enum() *TriggerMode { + p := new(TriggerMode) + *p = x + return p +} + +func (x TriggerMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (TriggerMode) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[4].Descriptor() +} + +func (TriggerMode) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[4] +} + +func (x TriggerMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use TriggerMode.Descriptor instead. +func (TriggerMode) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{4} +} + +type SubscriptionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InstanceId string `protobuf:"bytes,1,opt,name=instanceId,proto3" json:"instanceId,omitempty"` +} + +func (x *SubscriptionRequest) Reset() { + *x = SubscriptionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubscriptionRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubscriptionRequest) ProtoMessage() {} + +func (x *SubscriptionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubscriptionRequest.ProtoReflect.Descriptor instead. +func (*SubscriptionRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{0} +} + +func (x *SubscriptionRequest) GetInstanceId() string { + if x != nil { + return x.InstanceId + } + return "" +} + +type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` + Detector Detector `protobuf:"varint,2,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` + Parameters string `protobuf:"bytes,3,opt,name=parameters,proto3" json:"parameters,omitempty"` + Timestamp string `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` +} + +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Event) ProtoMessage() {} + +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{1} +} + +func (x *Event) GetEventtype() EventType { + if x != nil { + return x.Eventtype + } + return EventType_NULL_EVENT +} + +func (x *Event) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *Event) GetParameters() string { + if x != nil { + return x.Parameters + } + return "" +} + +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +type SorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters + Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // this can be a map or something strongly typed as we figure it out +} + +func (x *SorRequest) Reset() { + *x = SorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SorRequest) ProtoMessage() {} + +func (x *SorRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SorRequest.ProtoReflect.Descriptor instead. +func (*SorRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{2} +} + +func (x *SorRequest) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *SorRequest) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_RT_NULL +} + +func (x *SorRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *SorRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +type EorRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command + RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // does EOR need other params? +} + +func (x *EorRequest) Reset() { + *x = EorRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EorRequest) ProtoMessage() {} + +func (x *EorRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EorRequest.ProtoReflect.Descriptor instead. +func (*EorRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{3} +} + +func (x *EorRequest) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *EorRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *EorRequest) GetParameters() map[string]string { + if x != nil { + return x.Parameters + } + return nil +} + +type StatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` +} + +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{4} +} + +func (x *StatusRequest) GetDetector() []Detector { + if x != nil { + return x.Detector + } + return nil +} + +type DetectorInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` + State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` + Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` //repeated RunType allowedRunTypes = 3; //?what is this +} + +func (x *DetectorInfo) Reset() { + *x = DetectorInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorInfo) ProtoMessage() {} + +func (x *DetectorInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorInfo.ProtoReflect.Descriptor instead. +func (*DetectorInfo) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{5} +} + +func (x *DetectorInfo) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *DetectorInfo) GetState() DetectorState { + if x != nil { + return x.State + } + return DetectorState_NULL_STATE +} + +func (x *DetectorInfo) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +type StatusReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + //repeated DetectorInfo detectorMatrix = 1; + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` + State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` + Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` //repeated RunType allowedRunTypes = 3; //? +} + +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{6} +} + +func (x *StatusReply) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *StatusReply) GetState() DetectorState { + if x != nil { + return x.State + } + return DetectorState_NULL_STATE +} + +func (x *StatusReply) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +var File_protos_dcs_proto protoreflect.FileDescriptor + +var file_protos_dcs_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x03, 0x64, 0x63, 0x73, 0x22, 0x35, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x9e, + 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0xfd, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd5, 0x01, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, + 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x80, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x80, 0x01, 0x0a, 0x09, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, + 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, + 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, + 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, + 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x2a, 0xad, 0x01, + 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, + 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, + 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, + 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, + 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, + 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, + 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, + 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, + 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x10, 0x2a, 0x9e, 0x01, + 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, + 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, + 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, + 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, + 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, + 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, + 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x08, 0x2a, 0x38, + 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x54, 0x5f, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x54, 0x5f, 0x50, 0x48, 0x59, + 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x54, 0x5f, 0x54, 0x45, 0x43, + 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x4d, 0x5f, 0x43, 0x4f, + 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x4d, + 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x32, 0xde, 0x01, 0x0a, + 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, + 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x31, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, + 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, + 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, + 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, + 0x63, 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_dcs_proto_rawDescOnce sync.Once + file_protos_dcs_proto_rawDescData = file_protos_dcs_proto_rawDesc +) + +func file_protos_dcs_proto_rawDescGZIP() []byte { + file_protos_dcs_proto_rawDescOnce.Do(func() { + file_protos_dcs_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_dcs_proto_rawDescData) + }) + return file_protos_dcs_proto_rawDescData +} + +var file_protos_dcs_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_protos_dcs_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_protos_dcs_proto_goTypes = []interface{}{ + (EventType)(0), // 0: dcs.EventType + (Detector)(0), // 1: dcs.Detector + (DetectorState)(0), // 2: dcs.DetectorState + (RunType)(0), // 3: dcs.RunType + (TriggerMode)(0), // 4: dcs.TriggerMode + (*SubscriptionRequest)(nil), // 5: dcs.SubscriptionRequest + (*Event)(nil), // 6: dcs.Event + (*SorRequest)(nil), // 7: dcs.SorRequest + (*EorRequest)(nil), // 8: dcs.EorRequest + (*StatusRequest)(nil), // 9: dcs.StatusRequest + (*DetectorInfo)(nil), // 10: dcs.DetectorInfo + (*StatusReply)(nil), // 11: dcs.StatusReply + nil, // 12: dcs.SorRequest.ParametersEntry + nil, // 13: dcs.EorRequest.ParametersEntry +} +var file_protos_dcs_proto_depIdxs = []int32{ + 0, // 0: dcs.Event.eventtype:type_name -> dcs.EventType + 1, // 1: dcs.Event.detector:type_name -> dcs.Detector + 1, // 2: dcs.SorRequest.detector:type_name -> dcs.Detector + 3, // 3: dcs.SorRequest.runType:type_name -> dcs.RunType + 12, // 4: dcs.SorRequest.parameters:type_name -> dcs.SorRequest.ParametersEntry + 1, // 5: dcs.EorRequest.detector:type_name -> dcs.Detector + 13, // 6: dcs.EorRequest.parameters:type_name -> dcs.EorRequest.ParametersEntry + 1, // 7: dcs.StatusRequest.detector:type_name -> dcs.Detector + 1, // 8: dcs.DetectorInfo.detector:type_name -> dcs.Detector + 2, // 9: dcs.DetectorInfo.state:type_name -> dcs.DetectorState + 1, // 10: dcs.StatusReply.detector:type_name -> dcs.Detector + 2, // 11: dcs.StatusReply.state:type_name -> dcs.DetectorState + 5, // 12: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest + 7, // 13: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest + 8, // 14: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest + 9, // 15: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest + 6, // 16: dcs.Configurator.Subscribe:output_type -> dcs.Event + 11, // 17: dcs.Configurator.StartOfRun:output_type -> dcs.StatusReply + 11, // 18: dcs.Configurator.EndOfRun:output_type -> dcs.StatusReply + 11, // 19: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply + 16, // [16:20] is the sub-list for method output_type + 12, // [12:16] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name +} + +func init() { file_protos_dcs_proto_init() } +func file_protos_dcs_proto_init() { + if File_protos_dcs_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_dcs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscriptionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EorRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectorInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_dcs_proto_rawDesc, + NumEnums: 5, + NumMessages: 9, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_dcs_proto_goTypes, + DependencyIndexes: file_protos_dcs_proto_depIdxs, + EnumInfos: file_protos_dcs_proto_enumTypes, + MessageInfos: file_protos_dcs_proto_msgTypes, + }.Build() + File_protos_dcs_proto = out.File + file_protos_dcs_proto_rawDesc = nil + file_protos_dcs_proto_goTypes = nil + file_protos_dcs_proto_depIdxs = nil +} diff --git a/core/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto similarity index 58% rename from core/protos/dcs.proto rename to core/integration/dcs/protos/dcs.proto index 5c46548f5..cb652937a 100644 --- a/core/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -21,64 +21,20 @@ * immunities granted to it by virtue of its status as an * Intergovernmental Organization or submit itself to any jurisdiction. */ - +/* Modified OmbrettaPinazza@DCS 13/11/2020 */ syntax = "proto3"; package dcs; option java_package = "ch.cern.alice.dcs"; -option go_package = "dcspb"; +option go_package = "protos;dcspb"; ////////////////////////////////////////////////////// service Configurator { - rpc Subscribe (SubscriptionRequest) returns (stream Event) {} - rpc StartOfRun (SorRequest) returns (stream Event) {} - rpc EndOfRun (EorRequest) returns (stream Event) {} - rpc GetStatus (StatusRequest) returns (StatusReply) {} -} - -////////////////////////////////////////////////////// -// Enum definitions -////////////////////////////////////////////////////// - -enum EventType { - NULL_EVENT = 0; - DETECTOR_STATE_CHANGE_EVENT = 1; - DETECTOR_ERROR_EVENT = 2; - SOR_EVENT = 20; - EOR_EVENT = 30; -} - -enum Detector { - NULL_DETECTOR = 0; - ACO = 1; - EMC = 2; - FIT = 3; - ITS = 4; - MCH = 5; - MFT = 6; - PHOS = 7; - TOF = 8; - TPC = 9; - TRD = 10; - ZDC = 11; - // list to be fixed/completed -} - -enum DetectorState { - NULL_STATE = 0; - READY = 1; - MOVING = 2; - SAFE = 3; - MIXED = 4; - ERROR = 5; - // list to be fixed/completed -} - -enum RunType { - RT_NULL = 0; - RT_PHYSICS = 1; - RT_TECHNICAL = 2; + rpc Subscribe (SubscriptionRequest) returns (stream Event) {} + rpc StartOfRun (SorRequest) returns (StatusReply) {} + rpc EndOfRun (EorRequest) returns (StatusReply) {} + rpc GetStatus (StatusRequest) returns (StatusReply) {} } ////////////////////////////////////////////////////// @@ -92,11 +48,15 @@ message SubscriptionRequest { } message Event { - EventType type = 1; - Detector detector = 2; - string name = 3; - string description = 4; - DetectorState state = 5; + EventType eventtype = 1; + Detector detector = 2; + string parameters = 3; + string timestamp = 4; + //EventType type = 1; + //Detector detector = 2; + //string name = 3; + //string description = 4; + //DetectorState state = 5; // Note that all fields are optional in Proto3, so some of the above might arrive empty // from the client. @@ -114,31 +74,102 @@ message Event { } // SOR/EOR calls +//-- I've added runNumber, as it should be a requested field message SorRequest { Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command RunType runType = 2; - map parameters = 3; // this can be a map or something strongly typed as we figure it out + int32 runNumber = 3; // should be uint32 + //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters + map parameters = 4; // this can be a map or something strongly typed as we figure it out } message EorRequest { Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command - map parameters = 2; // does EOR need params? + int32 runNumber = 2; + map parameters = 3; // does EOR need other params? } // GetStatus call message StatusRequest { - Detector detector = 1; + repeated Detector detector = 1; // In proto3 all fields are optional, with Protobuf assuming a zero value for empty fields. // Thus if the client sends this request with empty detector or detector = NULL_DETECTOR, // the server should return the status of all detectors. + //--we should add repeated, but the Reply would become a stream } message DetectorInfo { Detector detector = 1; DetectorState state = 2; - repeated RunType allowedRunTypes = 3; + string timestamp = 3; + //repeated RunType allowedRunTypes = 3; //?what is this } message StatusReply { - repeated DetectorInfo detectorMatrix = 1; -} \ No newline at end of file + //repeated DetectorInfo detectorMatrix = 1; + Detector detector = 1; + DetectorState state = 2; + string timestamp = 3; + //repeated RunType allowedRunTypes = 3; //? +} +//message StatusReply { +// repeated DetectorInfo detectorMatrix = 1; +// //repeated RunType allowedRunTypes = 3; //?what is this/ +//} + + +////////////////////////////////////////////////////// +// Enum definitions +////////////////////////////////////////////////////// + +enum EventType { + NULL_EVENT = 0; + HEARTBEAT = 1; + STATE_CHANGE_EVENT = 2; + ERROR_EVENT = 3; + ACK_EVENT = 4; + SOR_EVENT = 20; + EOR_EVENT = 30; +} + +enum Detector { + NULL_DETECTOR = 0; + CPV = 1; + EMC = 2; + FDD = 3; + FT0 = 4; + FV0 = 5; + ITS = 6; + HMP = 7; + MCH = 8; + MFT = 9; + MID = 10; + PHS = 11; + TOF = 12; + TPC = 13; + TRD = 14; + ZDC = 15; + DCS = 16; +} + +enum DetectorState { + NULL_STATE = 0; + READY = 1; + RUN_OK = 2; + RUN_FAILURE = 3; + SOR_PROGRESSING = 4; + EOR_PROGRESSING = 5; + SOR_FAILURE = 6; + EOR_FAILURE = 7; + ERROR = 8; +} + +enum RunType { + RT_NULL = 0; + RT_PHYSICS = 1; + RT_TECHNICAL = 2; +} +enum TriggerMode { + TM_CONTINUOUS = 0; + TM_TRIGGERED = 1; +} diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go new file mode 100644 index 000000000..ef6b29779 --- /dev/null +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -0,0 +1,231 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package dcspb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ConfiguratorClient is the client API for Configurator service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ConfiguratorClient interface { + Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) + StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (*StatusReply, error) + EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (*StatusReply, error) + GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) +} + +type configuratorClient struct { + cc grpc.ClientConnInterface +} + +func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { + return &configuratorClient{cc} +} + +func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + if err != nil { + return nil, err + } + x := &configuratorSubscribeClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Configurator_SubscribeClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type configuratorSubscribeClient struct { + grpc.ClientStream +} + +func (x *configuratorSubscribeClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (*StatusReply, error) { + out := new(StatusReply) + err := c.cc.Invoke(ctx, "/dcs.Configurator/StartOfRun", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (*StatusReply, error) { + out := new(StatusReply) + err := c.cc.Invoke(ctx, "/dcs.Configurator/EndOfRun", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { + out := new(StatusReply) + err := c.cc.Invoke(ctx, "/dcs.Configurator/GetStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ConfiguratorServer is the server API for Configurator service. +// All implementations should embed UnimplementedConfiguratorServer +// for forward compatibility +type ConfiguratorServer interface { + Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error + StartOfRun(context.Context, *SorRequest) (*StatusReply, error) + EndOfRun(context.Context, *EorRequest) (*StatusReply, error) + GetStatus(context.Context, *StatusRequest) (*StatusReply, error) +} + +// UnimplementedConfiguratorServer should be embedded to have forward compatible implementations. +type UnimplementedConfiguratorServer struct { +} + +func (UnimplementedConfiguratorServer) Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error { + return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") +} +func (UnimplementedConfiguratorServer) StartOfRun(context.Context, *SorRequest) (*StatusReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method StartOfRun not implemented") +} +func (UnimplementedConfiguratorServer) EndOfRun(context.Context, *EorRequest) (*StatusReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method EndOfRun not implemented") +} +func (UnimplementedConfiguratorServer) GetStatus(context.Context, *StatusRequest) (*StatusReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented") +} + +// UnsafeConfiguratorServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ConfiguratorServer will +// result in compilation errors. +type UnsafeConfiguratorServer interface { + mustEmbedUnimplementedConfiguratorServer() +} + +func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { + s.RegisterService(&_Configurator_serviceDesc, srv) +} + +func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SubscriptionRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ConfiguratorServer).Subscribe(m, &configuratorSubscribeServer{stream}) +} + +type Configurator_SubscribeServer interface { + Send(*Event) error + grpc.ServerStream +} + +type configuratorSubscribeServer struct { + grpc.ServerStream +} + +func (x *configuratorSubscribeServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +func _Configurator_StartOfRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfiguratorServer).StartOfRun(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dcs.Configurator/StartOfRun", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfiguratorServer).StartOfRun(ctx, req.(*SorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Configurator_EndOfRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EorRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfiguratorServer).EndOfRun(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dcs.Configurator/EndOfRun", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfiguratorServer).EndOfRun(ctx, req.(*EorRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ConfiguratorServer).GetStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dcs.Configurator/GetStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfiguratorServer).GetStatus(ctx, req.(*StatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _Configurator_serviceDesc = grpc.ServiceDesc{ + ServiceName: "dcs.Configurator", + HandlerType: (*ConfiguratorServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "StartOfRun", + Handler: _Configurator_StartOfRun_Handler, + }, + { + MethodName: "EndOfRun", + Handler: _Configurator_EndOfRun_Handler, + }, + { + MethodName: "GetStatus", + Handler: _Configurator_GetStatus_Handler, + }, + }, + Streams: []grpc.StreamDesc{ + { + StreamName: "Subscribe", + Handler: _Configurator_Subscribe_Handler, + ServerStreams: true, + }, + }, + Metadata: "protos/dcs.proto", +} diff --git a/core/server.go b/core/server.go index e35e9d2a4..e6ddbf3d2 100644 --- a/core/server.go +++ b/core/server.go @@ -23,6 +23,7 @@ */ //go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto + package core import ( diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 3c6c820af..81bd5612e 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -29,6 +29,7 @@ import ( "strconv" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow/callable" ) type aggregator struct { @@ -50,11 +51,13 @@ type _unionTypeProbe struct { For *struct{} Task *struct{} Roles []interface{} + Call *struct{} } type _roleUnion struct{ *iteratorRole *aggregatorRole *taskRole + *callRole } func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { @@ -67,10 +70,12 @@ func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (union switch { case _probe.For != nil: unionErr = unmarshal(&union.iteratorRole) - case _probe.Roles != nil && _probe.Task == nil: + case _probe.Roles != nil && _probe.Task == nil && _probe.Call == nil: unionErr = unmarshal(&union.aggregatorRole) - case _probe.Task != nil && _probe.Roles == nil: + case _probe.Task != nil && _probe.Roles == nil && _probe.Call == nil: unionErr = unmarshal(&union.taskRole) + case _probe.Call != nil && _probe.Task == nil && _probe.Roles == nil: + unionErr = unmarshal(&union.callRole) default: unionErr = errors.New("cannot unmarshal invalid role to union") } @@ -99,6 +104,8 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error roles[i] = v.aggregatorRole case v.taskRole != nil: roles[i] = v.taskRole + case v.callRole != nil: + roles[i] = v.callRole default: err = errors.New("invalid child role at index " + strconv.Itoa(i)) return @@ -108,10 +115,10 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error return } -func (a *aggregator) MarshalYAML() (interface{}, error) { +func (r *aggregator) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) - aux["roles"] = a.Roles + aux["roles"] = r.Roles return aux, nil } @@ -140,14 +147,14 @@ func (r *aggregator) GetTasks() (tasks task.Tasks) { return } -func (r *aggregator) GetHooksForTrigger(trigger string) (tasks task.Tasks) { +func (r *aggregator) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { if r == nil { return nil } - tasks = make(task.Tasks, 0) + hooks = make(callable.Hooks, 0) for _, role := range r.GetRoles() { - tasks = append(tasks, role.GetHooksForTrigger(trigger)...) + hooks = append(hooks, role.GetHooksForTrigger(trigger)...) } return } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go new file mode 100644 index 000000000..0b1613b30 --- /dev/null +++ b/core/workflow/callable/call.go @@ -0,0 +1,143 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package callable + +import ( + "strconv" + texttemplate "text/template" + + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/task" +) + +type Calls []*Call +type Hooks []Hook + +type Hook interface { + GetParentRole() interface{} + GetParentRolePath() string + GetName() string + GetTraits() task.Traits +} + +type Call struct { + Func string + Return string + VarStack map[string]string + Traits task.Traits + parentRole ParentRole +} + +func (s Hooks) FilterCalls() (calls Calls) { + calls = make(Calls, 0) + for _, v := range s { + if c, ok := v.(*Call); ok { + calls = append(calls, c) + } + } + return +} + +func (s Hooks) FilterTasks() (tasks task.Tasks) { + tasks = make(task.Tasks, 0) + for _, v := range s { + if t, ok := v.(*task.Task); ok { + tasks = append(tasks, t) + } + } + return +} + +func (s Calls) CallAll() map[*Call]error { + errors := make(map[*Call]error) + for _, v := range s { + err := v.Call() + if err != nil { + errors[v] = err + } + } + return errors +} + + +func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { + return &Call{ + Func: funcCall, + Return: returnVar, + VarStack: varStack, + Traits: parent.GetTaskTraits(), + parentRole: parent, + } +} + +func (c *Call) Call() error { + output := "{{" + c.Func + "}}" + returnVar := c.Return + fields := template.Fields{ + template.WrapPointer(&output), + template.WrapPointer(&returnVar), + } + c.VarStack["run_number"] = strconv.FormatUint(uint64(c.parentRole.GetCurrentRunNumber()), 10 ) + objStack := integration.PluginsInstance().ObjectStack(c.VarStack) + + err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) + if err != nil { + return err + } + if len(returnVar) > 0 { + c.parentRole.SetRuntimeVar(returnVar, output) + } + return nil +} + +func (c *Call) GetParentRole() interface{} { + return c.parentRole +} + +func (c *Call) GetParentRolePath() string { + return c.parentRole.GetPath() +} + +func (c *Call) GetName() string { + return c.parentRole.GetPath() +} + +func (c *Call) GetTraits() task.Traits { + return c.Traits +} + +type ParentRole interface { + GetPath() string + GetTaskTraits() task.Traits + GetEnvironmentId() uid.ID + ConsolidatedVarStack() (varStack map[string]string, err error) + SendEvent(event.Event) + SetRuntimeVar(key string, value string) + GetCurrentRunNumber() uint32 +} \ No newline at end of file diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go new file mode 100644 index 000000000..574481fec --- /dev/null +++ b/core/workflow/callrole.go @@ -0,0 +1,263 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "errors" + "strings" + texttemplate "text/template" + "time" + + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/gobwas/glob" +) + +type callRole struct { + roleBase + task.Traits + FuncCall string `yaml:"-,omitempty"` + ReturnVar string `yaml:"-,omitempty"` +} + +func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + aux := struct{ + Call struct{ + Func string + Return string + Trigger *string + Timeout *string + Critical *bool + } + }{} + + type _callRole callRole + role := _callRole{} + + err = unmarshal(&role) + if err != nil { + return + } + + err = unmarshal(&aux) + if err != nil { + return + } + + role.FuncCall = aux.Call.Func + role.ReturnVar = aux.Call.Return + + // Set up basicTaskTraits defaults + if aux.Call.Trigger != nil && len(*aux.Call.Trigger) > 0 { // hook + role.Trigger = *aux.Call.Trigger + if aux.Call.Timeout != nil && len(*aux.Call.Timeout) > 0 { + role.Timeout = *aux.Call.Timeout + } else { + role.Timeout = (30 * time.Second).String() + } + } else { // basic task + if aux.Call.Timeout != nil && len(*aux.Call.Timeout) > 0 { + role.Timeout = *aux.Call.Timeout + } else { + role.Timeout = "0s" + } + } + + if aux.Call.Critical != nil { // default for critical is always true + role.Critical = *aux.Call.Critical + } else { + role.Critical = true + } + t.status.status = task.ACTIVE + + *t = callRole(role) + return +} + +func (t *callRole) MarshalYAML() (interface{}, error) { + callRole := make(map[string]interface{}) + if t.Traits.Trigger != "" { callRole["trigger"] = t.Traits.Trigger } + if t.Traits.Timeout != "" { callRole["timeout"] = t.Traits.Timeout } + callRole["critical"] = t.Traits.Critical + callRole["func"] = t.FuncCall + callRole["return"] = t.ReturnVar + + auxRoleBase, err := t.roleBase.MarshalYAML() + aux := auxRoleBase.(map[string]interface{}) + aux["call"] = callRole + + return aux, err +} + +func (t *callRole) GlobFilter(g glob.Glob) (rs []Role) { + if g.Match(t.GetPath()) { + rs = []Role{t} + } + return +} + +func (t *callRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { + if t == nil { + return errors.New("role tree error when processing templates") + } + + templSequence := template.Sequence{ + template.STAGE0: template.WrapMapItems(t.Defaults.Raw()), + template.STAGE1: template.WrapMapItems(t.Vars.Raw()), + template.STAGE2: template.WrapMapItems(t.UserVars.Raw()), + template.STAGE3: template.Fields{ + template.WrapPointer(&t.Name), + template.WrapPointer(&t.FuncCall), + template.WrapPointer(&t.ReturnVar), + template.WrapPointer(&t.Timeout), + template.WrapPointer(&t.Trigger), + }, + template.STAGE4: append(append( + WrapConstraints(t.Constraints), + t.wrapConnectFields()...), + template.WrapPointer(&t.Enabled)), + } + + // FIXME: push cached templates here + err = templSequence.Execute(apricot.Instance(), + t.GetPath(), + template.VarStack{ + Locals: t.Locals, + Defaults: t.Defaults, + Vars: t.Vars, + UserVars: t.UserVars, + }, + t.makeBuildObjectStackFunc(), + make(map[string]texttemplate.Template), + ) + if err != nil { + return + } + + // After template processing we write the Locals to Vars in order to make them available to children + for k, v := range t.Locals { + t.Vars.Set(k, v) + } + + t.Enabled = strings.TrimSpace(t.Enabled) + + return +} + +func (t* callRole) UpdateStatus(s task.Status) { + t.updateStatus(s) +} + +func (t* callRole) UpdateState(s task.State) { + t.updateState(s) +} + +func (t *callRole) updateStatus(s task.Status) { + if t.parent == nil { + log.WithField("status", s.String()).Error("cannot update status with nil parent") + } + t.status.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) + t.parent.updateStatus(s) +} + +func (t *callRole) updateState(s task.State) { + if t.parent == nil { + log.WithField("state", s.String()).Error("cannot update state with nil parent") + } + log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") + t.state.merge(s, t) + t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) + t.parent.updateState(s) +} + +func (t *callRole) copy() copyable { + rCopy := callRole{ + roleBase: *t.roleBase.copy().(*roleBase), + FuncCall: t.FuncCall, + ReturnVar: t.ReturnVar, + Traits: t.Traits, + } + rCopy.status = SafeStatus{status:rCopy.GetStatus()} + rCopy.state = SafeState{state:rCopy.GetState()} + return &rCopy +} + +func (t *callRole) GenerateTaskDescriptors() (ds task.Descriptors) { + return nil +} + +func (t *callRole) GetTasks() task.Tasks { + return []*task.Task{} +} + +func (t *callRole) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { + cvs, err := t.ConsolidatedVarStack() + defer t.updateState(task.INVARIANT) + + if err != nil { + return []callable.Hook{} + } + + // If a trigger is defined for this role && + // If the input trigger is empty OR a positive match... + if len(t.Trigger) > 0 && (len(trigger) == 0 || t.Trigger == trigger) { + return []callable.Hook{ + callable.NewCall(t.FuncCall, t.ReturnVar, cvs, t), + } + } + return callable.Hooks{} +} + +func (t* callRole) GetTaskTraits() task.Traits { + if t == nil { + return task.Traits{ + Trigger: "", + Timeout: "0s", + Critical: false, + } + } + return t.Traits +} + + +func (t* callRole) GetTaskClasses() []string { + return nil +} + +func (*callRole) GetRoles() []Role { + return nil +} + +func (t *callRole) setParent(role Updatable) { + t.parent = role + t.Defaults.Wrap(role.GetDefaults()) + t.Vars.Wrap(role.GetVars()) + t.UserVars.Wrap(role.GetUserVars()) +} diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 6e9934b71..62972dbb7 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -313,3 +313,13 @@ func (i *iteratorRole) SetRuntimeVars(kv map[string]string) { } i.template.SetRuntimeVars(kv) } + +func (i *iteratorRole) GetCurrentRunNumber() uint32 { + if i == nil { + return 0 + } + if i.GetParent() == nil { + return 0 + } + return i.GetParent().GetCurrentRunNumber() +} diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index e42f8cc81..92bcbad79 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -36,6 +36,8 @@ import ( type GetEnvIdFunc func() uid.ID +type GetCurrentRunNumberFunc func() uint32 + type GetStringMapFunc func() gera.StringMap type SendEvents func(event.Event) @@ -43,6 +45,7 @@ type SendEvents func(event.Event) type ParentAdapter struct { mu sync.Mutex getEnvIdFunc GetEnvIdFunc + getCurrentRunNumberFunc GetCurrentRunNumberFunc getDefaultsFunc GetStringMapFunc getVarsFunc GetStringMapFunc @@ -54,12 +57,14 @@ type ParentAdapter struct { } func NewParentAdapter(getEnvId GetEnvIdFunc, + getCurrentRunNumber GetCurrentRunNumberFunc, getDefaults GetStringMapFunc, getVars GetStringMapFunc, getUserVars GetStringMapFunc, SendEvents SendEvents) *ParentAdapter { return &ParentAdapter{ getEnvIdFunc: getEnvId, + getCurrentRunNumberFunc: getCurrentRunNumber, getDefaultsFunc: getDefaults, getVarsFunc: getVars, getUserVarsFunc: getUserVars, @@ -150,4 +155,8 @@ func (*ParentAdapter) CollectInboundChannels() []channel.Inbound { func (p *ParentAdapter) SendEvent(ev event.Event) { p.SendEvents(ev) +} + +func (p *ParentAdapter) GetCurrentRunNumber() uint32 { + return p.getCurrentRunNumberFunc() } \ No newline at end of file diff --git a/core/workflow/role.go b/core/workflow/role.go index e55213d58..957025f21 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/gobwas/glob" ) @@ -58,8 +59,14 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) - GetHooksForTrigger(trigger string) task.Tasks + GetHooksForTrigger(trigger string) callable.Hooks IsEnabled() bool + GetCurrentRunNumber() uint32 +} + +type PublicUpdatable interface { + UpdateStatus(s task.Status) + UpdateState(s task.State) } type Updatable interface { @@ -72,6 +79,7 @@ type Updatable interface { CollectOutboundChannels() []channel.Outbound CollectInboundChannels() []channel.Inbound SendEvent(event.Event) + GetCurrentRunNumber() uint32 } type VarNode interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 2aa90fbed..f29fc0985 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -383,3 +383,13 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { } return } + +func (r *roleBase) GetCurrentRunNumber() uint32 { + if r == nil { + return 0 + } + if r.parent == nil { + return 0 + } + return r.parent.GetCurrentRunNumber() +} \ No newline at end of file diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 6aee8f021..4aa62aa16 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -36,7 +36,7 @@ type SafeState struct { func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { - state = task.MIXED + state = task.INVARIANT return } state = roles[0].GetState() @@ -60,7 +60,10 @@ func (t *SafeState) merge(s task.State, r Role) { if t.state == s { return } - if _, ok := r.(*taskRole); ok { //it's a task role + + _, isTaskRole := r.(*taskRole) + _, isCallRole := r.(*callRole) + if isTaskRole || isCallRole { // no aggregation, we just update t.state = s return } diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 59aa4ec24..7f5bea84d 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -55,7 +55,7 @@ func aggregateStatus(roles []Role) (status task.Status) { "statuses": strings.Join(stati, ", "), "aggregated": status.String(), }). - Debug("aggregating statuses") + Debug("aggregating statuses") return } @@ -77,7 +77,10 @@ func (t *SafeStatus) merge(s task.Status, r Role) { if t.status == s { return } - if _, ok := r.(*taskRole); ok { //it's a task role + + _, isTaskRole := r.(*taskRole) + _, isCallRole := r.(*callRole) + if isTaskRole || isCallRole { // no aggregation, we just update t.status = s return } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index ef476598d..0f7f78860 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/gobwas/glob" ) @@ -100,7 +101,7 @@ func (t *taskRole) MarshalYAML() (interface{}, error) { if t.Traits.Trigger != "" { taskRole["trigger"] = t.Traits.Trigger } if t.Traits.Timeout != "" { taskRole["timeout"] = t.Traits.Timeout } taskRole["critical"] = t.Traits.Critical - taskRole["load"] = t.roleBase.Name + taskRole["load"] = t.LoadTaskClass auxRoleBase, err := t.roleBase.MarshalYAML() aux := auxRoleBase.(map[string]interface{}) @@ -233,14 +234,17 @@ func (t *taskRole) GetTasks() task.Tasks { return []*task.Task{t.GetTask()} } -func (t *taskRole) GetHooksForTrigger(trigger string) (tasks task.Tasks) { +func (t *taskRole) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { if ttask := t.GetTask(); ttask == nil { - return []*task.Task{} + return []callable.Hook{} } - if len(t.Trigger) > 0 && t.Trigger == trigger { - return []*task.Task{t.GetTask()} + + // If a trigger is defined for this role && + // If the input trigger is empty OR a positive match... + if len(t.Trigger) > 0 && (len(trigger) == 0 || t.Trigger == trigger) { + return []callable.Hook{t.GetTask()} } - return []*task.Task{} + return []callable.Hook{} } func (t *taskRole) GetTask() *task.Task { From 221f0086e801a012f164af157a235b7a9ec10003 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Feb 2021 12:55:17 +0100 Subject: [PATCH 0715/2352] [core] Ensure environments with calls still update status correctly --- core/environment/manager.go | 27 ++++++++++++++++++------ core/environment/transition_configure.go | 15 +++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index c666a8b86..55930e879 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -208,13 +208,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error // we gather all DESTROY/after_DESTROY hooks, as these require special treatment tasksToRelease := env.Workflow().GetTasks() - cleanupHooks := env.Workflow().GetHooksForTrigger("DESTROY") - cleanupHooks = append(cleanupHooks, env.Workflow().GetHooksForTrigger("after_DESTROY")...) + destroyHooks := env.Workflow().GetHooksForTrigger("DESTROY") + destroyHooks = append(destroyHooks, env.Workflow().GetHooksForTrigger("after_DESTROY")...) - // for each found cleanup hook, + // for each found DESTROY hook, // for each of all tasks last-to-first // if the pointed task is one of the known cleanup hooks, remove it - for _, hook := range cleanupHooks { + for _, hook := range destroyHooks { for i := len(tasksToRelease)-1; i >= 0; i-- { if hook == tasksToRelease[i] { tasksToRelease = append(tasksToRelease[:i], tasksToRelease[i+1:]...) @@ -228,6 +228,21 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error close(envs.pendingStateChangeCh[environmentId]) delete(envs.pendingStateChangeCh, environmentId) + + // We set all callRoles to INACTIVE right now, because there's no task activation for them. + // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. + allHooks := env.Workflow().GetHooksForTrigger("") // no trigger = all hooks + callHooks := allHooks.FilterCalls() // get the calls + if len(callHooks) > 0 { + for _, h := range callHooks { + pr, ok := h.GetParentRole().(workflow.PublicUpdatable) + if !ok { + continue + } + go pr.UpdateStatus(task.INACTIVE) + } + } + pendingCh := make(chan *event.TasksReleasedEvent) envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() @@ -254,8 +269,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.mu.Unlock() // we trigger all cleanup hooks - cleanupHooks.FilterCalls().CallAll() - cleanupTaskHooks := cleanupHooks.FilterTasks() + destroyHooks.FilterCalls().CallAll() + cleanupTaskHooks := destroyHooks.FilterTasks() err = envs.taskman.TriggerHooks(cleanupTaskHooks) if err != nil { log.WithError(err).Warn("environment post-destroy hooks failed") diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 770da5f33..f3dddc758 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -31,6 +31,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/workflow" "github.com/pborman/uuid" "github.com/sirupsen/logrus" ) @@ -151,6 +152,20 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return } + // We set all callRoles to ACTIVE right now, because there's no task activation for them. + // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. + allHooks := wf.GetHooksForTrigger("") // no trigger = all hooks + callHooks := allHooks.FilterCalls() // get the calls + if len(callHooks) > 0 { + for _, h := range callHooks { + pr, ok := h.GetParentRole().(workflow.PublicUpdatable) + if !ok { + continue + } + go pr.UpdateStatus(task.ACTIVE) + } + } + deploymentTimeout := 90 * time.Second wfStatus := wf.GetStatus() if wfStatus != task.ACTIVE { From 33c1dcf1fcd7761e50385e50b56fff07d93b1d30 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Feb 2021 12:55:44 +0100 Subject: [PATCH 0716/2352] [core] Fix NewID template function signature --- configuration/template/stack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index b69e25ecf..a9726b857 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -155,7 +155,7 @@ func MakeStrOperationFuncMap() map[string]interface{} { out = string(bytes) return }, - "NewID": func(in interface{}) (out string) { + "NewID": func() (out string) { return uid.New().String() }, } From 5d60987958e3776de77f2e08a92156e005aff6f0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Feb 2021 14:58:00 +0100 Subject: [PATCH 0717/2352] [build] Bump to v0.20.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index b74eca3d6..9dcf066bd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 19 -VERSION_PATCH := 90 +VERSION_MINOR := 20 +VERSION_PATCH := 0 From beedccdd2f0a2d8d97d2f7f7d388e46cdab7bf3d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Feb 2021 12:29:21 +0100 Subject: [PATCH 0718/2352] [apricot] Fix defaults/vars path --- apricot/local/service.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index ebd41865f..21cce149d 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -95,7 +95,7 @@ func (s *Service) NewRunNumber() (runNumber uint32, err error) { // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right // before pushing TaskInfos func (s *Service) GetDefaults() map[string]string { - smap := s.getStringMap(filepath.Join(getConsulRuntimePrefix(),"defaults")) + smap := s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "defaults")) // Fill in some global constants we want to make available everywhere var configUri string @@ -123,7 +123,7 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetVars() map[string]string { - return s.getStringMap(filepath.Join(getConsulRuntimePrefix(),"vars")) + return s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "vars")) } // Returns a YAML file OR even a structure made of Roles or Nodes with: @@ -507,9 +507,11 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa return } - - func getConsulRuntimePrefix() string { // FIXME: this should not be hardcoded return "o2/runtime" } + +func getAliECSRuntimePrefix() string { + return getConsulRuntimePrefix() + "/aliecs" +} \ No newline at end of file From 705dcb21179bf83f8d167beac027a275058219f8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Feb 2021 12:30:39 +0100 Subject: [PATCH 0719/2352] [build] Bump to v0.20.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9dcf066bd..5125e33a3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 20cad8eb2a8482acb59cc6bfa861911d0fb8a104 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Feb 2021 16:52:00 +0100 Subject: [PATCH 0720/2352] [apricot] Better init output --- apricot/instance.go | 4 ++-- apricot/remote/service.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apricot/instance.go b/apricot/instance.go index fc64f2f94..c8948572b 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -54,7 +54,7 @@ func newService(configUri string) (configuration.Service, error) { log.WithField("configUri", configUri). Debug("new embedded apricot instance") } else if viper.GetString("component") == "coconut" { - log.WithField("configUri", configUri). + log.WithField("config_endpoint", configUri). Debug("new embedded apricot instance") } else { log.WithField("configUri", configUri). @@ -66,7 +66,7 @@ func newService(configUri string) (configuration.Service, error) { log.WithField("configUri", configUri). Warn("apricot proxy mode") } else if viper.GetString("component") == "coconut" { - log.WithField("configUri", configUri). + log.WithField("config_endpoint", configUri). Debug("new apricot client") } else { log.WithField("configUri", configUri). diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 19607b288..5ddf14d58 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -37,7 +37,7 @@ import ( "google.golang.org/grpc" ) -const CALL_TIMEOUT = 30*time.Second +const CALL_TIMEOUT = 10*time.Second type RemoteService struct { cli rpcClient From 1b695a2d7ea28d3424abbd6cc8b14339dc52bc25 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Feb 2021 14:46:25 +0100 Subject: [PATCH 0721/2352] [core] DD scheduler integration plugin --- Makefile | 8 +- cmd/o2-aliecs-core/main.go | 13 + core/config.go | 2 +- core/integration/dcs/plugin.go | 11 +- core/integration/dcs/protos/dcs.pb.go | 2 +- core/integration/ddsched/client.go | 75 +++ core/integration/ddsched/plugin.go | 234 ++++++++ core/integration/ddsched/protos/ddsched.pb.go | 534 ++++++++++++++++++ core/integration/ddsched/protos/ddsched.proto | 86 +++ .../ddsched/protos/ddsched_grpc.pb.go | 169 ++++++ core/integration/plugin.go | 54 +- core/workflow/callable/call.go | 2 +- core/workflow/iteratorrole.go | 4 + core/workflow/role.go | 1 + core/workflow/roleutils.go | 45 ++ 15 files changed, 1219 insertions(+), 21 deletions(-) create mode 100644 core/integration/ddsched/client.go create mode 100644 core/integration/ddsched/plugin.go create mode 100644 core/integration/ddsched/protos/ddsched.pb.go create mode 100644 core/integration/ddsched/protos/ddsched.proto create mode 100644 core/integration/ddsched/protos/ddsched_grpc.pb.go diff --git a/Makefile b/Makefile index 995b7ef66..bd11e2ef2 100644 --- a/Makefile +++ b/Makefile @@ -38,6 +38,7 @@ BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) endif REPOPATH = github.com/AliceO2Group/Control ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto/odc.proto" +DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master/src/DataDistControl/DataDistControl.proto" VERBOSE_1 := -v VERBOSE_2 := -v -x @@ -54,7 +55,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./executor ./core/integration/dcs ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./core/integration/dcs ./core/integration/ddsched ./executor ./odcshim ./walnut SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target @@ -126,10 +127,15 @@ vendor: @echo -e "\033[1;33mgo mod vendor\033[0m" @go mod vendor +# FIXME: these two protofiles should be committed in order to be available offline @echo -e "\033[1;33mcurl odc.proto\033[0m" @mkdir -p odcshim/odcprotos @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto + @echo -e "\033[1;33mcurl ddsched.proto\033[0m" + @mkdir -p core/integration/ddsched/protos + @curl -s -L $(DD_PROTO) -o core/integration/ddsched/protos/ddsched.proto + # WORKAROUND: In order to avoid the following issues: # https://github.com/golang/protobuf/issues/992 # https://github.com/golang/protobuf/issues/1158 diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index ecc6981f8..4fcb9708d 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -29,11 +29,24 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/dcs" + "github.com/AliceO2Group/Control/core/integration/ddsched" log "github.com/sirupsen/logrus" "github.com/teo/logrus-prefixed-formatter" ) func init() { + // TODO: enable/disable switches for plugins + integration.RegisterPlugin( + "dcs", + "dcsServiceEndpoint", + dcs.NewPlugin) + integration.RegisterPlugin( + "ddsched", + "ddSchedulerEndpoint", + ddsched.NewPlugin) + log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, SpacePadding: 20, diff --git a/core/config.go b/core/config.go index 10405a6f3..502945d99 100644 --- a/core/config.go +++ b/core/config.go @@ -139,7 +139,7 @@ func setFlags() error { pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("configServiceUri", viper.GetString("configServiceUri"), "URI of the Apricot instance (`apricot://host:port`), Consul server (`consul://`) or YAML configuration file, entry point for all configuration") pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") - pflag.String("integrationPlugins", viper.GetString("integrationPlugins"), "List of integration plugins to load (default: empty)") + pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index ecc7a7f66..9d16de7e2 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -35,7 +35,9 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" @@ -50,7 +52,7 @@ type Plugin struct { dcsClient *RpcClient } -func NewPlugin(endpoint string) *Plugin { +func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { log.WithField("endpoint", endpoint). @@ -105,7 +107,12 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack stack = make(map[string]interface{}) stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing DCS SOR") diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index e474fe1e4..9e833eae2 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -489,7 +489,7 @@ type SorRequest struct { Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` // should be uint32 //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // this can be a map or something strongly typed as we figure it out } diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go new file mode 100644 index 000000000..39f910baf --- /dev/null +++ b/core/integration/ddsched/client.go @@ -0,0 +1,75 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package ddsched + +import ( + "context" + + "github.com/AliceO2Group/Control/common/logger" + ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +var log = logger.New(logrus.StandardLogger(),"ddschedclient") + + +type RpcClient struct { + ddpb.DataDistributionControlClient + conn *grpc.ClientConn +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing DD scheduler client") + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + client := &RpcClient { + DataDistributionControlClient: ddpb.NewDataDistributionControlClient(conn), + conn: conn, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + return m.conn.Close() +} \ No newline at end of file diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go new file mode 100644 index 000000000..050588fcc --- /dev/null +++ b/core/integration/ddsched/plugin.go @@ -0,0 +1,234 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ddsched.proto + +package ddsched + +import ( + "context" + "fmt" + "net/url" + "strconv" + "time" + + "github.com/AliceO2Group/Control/core/integration" + ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" + "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +const DCS_CALL_TIMEOUT = 10 * time.Second + + +type Plugin struct { + ddSchedulerHost string + ddSchedulerPort int + + stfbHostIdMap map[string]string //map[task_id]ib_hostname + stfsHostIdMap map[string]string + + ddSchedClient *RpcClient +} + +func NewPlugin(endpoint string) integration.Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + ddSchedulerHost: u.Hostname(), + ddSchedulerPort: portNumber, + stfbHostIdMap: nil, + stfsHostIdMap: nil, + ddSchedClient: nil, + } +} + +func (p *Plugin) GetName() string { + return "ddsched" +} + +func (p *Plugin) Init(_ string) error { + if p.ddSchedClient == nil { + callTimeout := DCS_CALL_TIMEOUT + cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + p.ddSchedClient = NewClient(cxt, cancel, viper.GetString("ddSchedulerEndpoint")) + if p.ddSchedClient == nil { + return fmt.Errorf("failed to connect to DD scheduler service on %s", viper.GetString("ddSchedulerEndpoint")) + } + } + return nil +} + +func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + stack = make(map[string]interface{}) + stack["PartitionInitialize"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing DD scheduler PartitionInitialize") + + parentRoleI := call.GetParentRole() + parentRole, ok := parentRoleI.(workflow.Role) + root := workflow.GetRoot(parentRole) + + p.stfbHostIdMap = make(map[string]string) + p.stfsHostIdMap = make(map[string]string) + + workflow.LeafWalk(root, func(role workflow.Role) { + roleVS, err := role.ConsolidatedVarStack() + if err != nil { + log.WithError(err).Error("error processing DD host_id_map") + return + } + var( + ddDiscoveryIbHostname, ddDiscoveryStfbId, ddDiscoveryStfsId string + ddDiscoveryIbHostnameOk, ddDiscoveryStfbIdOk, ddDiscoveryStfsIdOk bool + ) + ddDiscoveryIbHostname, ddDiscoveryIbHostnameOk = roleVS["dd_discovery_ib_hostname"] + ddDiscoveryStfbId, ddDiscoveryStfbIdOk = roleVS["dd_discovery_stfb_id"] + ddDiscoveryStfsId, ddDiscoveryStfsIdOk = roleVS["dd_discovery_stfs_id"] + if ddDiscoveryIbHostnameOk { + if ddDiscoveryStfsIdOk { + p.stfsHostIdMap[ddDiscoveryStfsId] = ddDiscoveryIbHostname + } else if ddDiscoveryStfbIdOk { + p.stfbHostIdMap[ddDiscoveryStfbId] = ddDiscoveryIbHostname + } else { + return + } + } else { + return + } + }) + + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID for DD scheduler PartitionInitialize") + return + } + + in := ddpb.PartitionInitRequest{ + PartitionInfo: &ddpb.PartitionInfo{ + EnvironmentId: envId, + PartitionId: envId, + }, + StfbHostIdMap: p.stfbHostIdMap, + StfsHostIdMap: p.stfsHostIdMap, + } + if p.ddSchedClient == nil { + log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionInitialize") + return + } + if p.ddSchedClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("DD scheduler client connection not available")). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionInitialize") + return + } + + var ( + response *ddpb.PartitionResponse + err error + ) + response, err = p.ddSchedClient.PartitionInitialize(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionInitialize") + return + } + if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING { + log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String())). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionInitialize") + } + return + } + stack["PartitionTerminate"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing DD scheduler PartitionTerminate") + + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID for DD scheduler PartitionTerminate") + return + } + + in := ddpb.PartitionTermRequest{ + PartitionInfo: &ddpb.PartitionInfo{ + EnvironmentId: envId, + PartitionId: envId, + }, + } + if p.ddSchedClient == nil { + log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + return + } + if p.ddSchedClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("DD scheduler client connection not available")). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + return + } + + var ( + response *ddpb.PartitionResponse + err error + ) + response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + } + if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING { + log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + } + return + } + + return +} + +func (p *Plugin) Destroy() error { + return p.ddSchedClient.Close() +} + diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go new file mode 100644 index 000000000..b6b7237f7 --- /dev/null +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -0,0 +1,534 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: protos/ddsched.proto + +// Changelog: +// 2021-02-08: - Initial version +// - Support for a single partition/environment: PartitionID = EnvironmentID + +package ddpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type PartitionState int32 + +const ( + PartitionState___IGNORE PartitionState = 0 + PartitionState_PARTITION_UNKNOWN PartitionState = 1 // Partition not known to DataDistControl. Initialize by calling PartitionInitialize() + PartitionState_PARTITION_ERROR PartitionState = 2 + PartitionState_PARTITION_REQUEST_INVALID PartitionState = 3 // Provided configuration does not meet requirements or the request is not accepted at the current state. + PartitionState_PARTITION_CONFIGURING PartitionState = 4 // Configuration accepted, waiting on FLP and EPN DD components to respond and connect. + PartitionState_PARTITION_CONFIGURED PartitionState = 5 // All components configured, ready for dataflow commands + PartitionState_PARTITION_TERMINATING PartitionState = 6 // Partition is terminating. EPN-FLP connections are cleanly terminated. +) + +// Enum value maps for PartitionState. +var ( + PartitionState_name = map[int32]string{ + 0: "__IGNORE", + 1: "PARTITION_UNKNOWN", + 2: "PARTITION_ERROR", + 3: "PARTITION_REQUEST_INVALID", + 4: "PARTITION_CONFIGURING", + 5: "PARTITION_CONFIGURED", + 6: "PARTITION_TERMINATING", + } + PartitionState_value = map[string]int32{ + "__IGNORE": 0, + "PARTITION_UNKNOWN": 1, + "PARTITION_ERROR": 2, + "PARTITION_REQUEST_INVALID": 3, + "PARTITION_CONFIGURING": 4, + "PARTITION_CONFIGURED": 5, + "PARTITION_TERMINATING": 6, + } +) + +func (x PartitionState) Enum() *PartitionState { + p := new(PartitionState) + *p = x + return p +} + +func (x PartitionState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (PartitionState) Descriptor() protoreflect.EnumDescriptor { + return file_protos_ddsched_proto_enumTypes[0].Descriptor() +} + +func (PartitionState) Type() protoreflect.EnumType { + return &file_protos_ddsched_proto_enumTypes[0] +} + +func (x PartitionState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use PartitionState.Descriptor instead. +func (PartitionState) EnumDescriptor() ([]byte, []int) { + return file_protos_ddsched_proto_rawDescGZIP(), []int{0} +} + +type PartitionInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environment_id,json=environmentId,proto3" json:"environment_id,omitempty"` + // AliECS environment ID (required) + PartitionId string `protobuf:"bytes,2,opt,name=partition_id,json=partitionId,proto3" json:"partition_id,omitempty"` // Partition ID. (required) +} + +func (x *PartitionInfo) Reset() { + *x = PartitionInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ddsched_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartitionInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartitionInfo) ProtoMessage() {} + +func (x *PartitionInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_ddsched_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartitionInfo.ProtoReflect.Descriptor instead. +func (*PartitionInfo) Descriptor() ([]byte, []int) { + return file_protos_ddsched_proto_rawDescGZIP(), []int{0} +} + +func (x *PartitionInfo) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *PartitionInfo) GetPartitionId() string { + if x != nil { + return x.PartitionId + } + return "" +} + +type PartitionResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PartitionState PartitionState `protobuf:"varint,1,opt,name=partition_state,json=partitionState,proto3,enum=o2.DataDistribution.Control.PartitionState" json:"partition_state,omitempty"` // Current or new state of the partition following reception of the request. + InfoMessage string `protobuf:"bytes,2,opt,name=info_message,json=infoMessage,proto3" json:"info_message,omitempty"` // Optional information message. +} + +func (x *PartitionResponse) Reset() { + *x = PartitionResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ddsched_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartitionResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartitionResponse) ProtoMessage() {} + +func (x *PartitionResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_ddsched_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartitionResponse.ProtoReflect.Descriptor instead. +func (*PartitionResponse) Descriptor() ([]byte, []int) { + return file_protos_ddsched_proto_rawDescGZIP(), []int{1} +} + +func (x *PartitionResponse) GetPartitionState() PartitionState { + if x != nil { + return x.PartitionState + } + return PartitionState___IGNORE +} + +func (x *PartitionResponse) GetInfoMessage() string { + if x != nil { + return x.InfoMessage + } + return "" +} + +// Request for a new partition. +// AliECS provides the information about processes of DD in order for partition to be configured by TfScheduler. +// Partition request must include all processes. Adding additional processes to existing partition is not supported. +type PartitionInitRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PartitionInfo *PartitionInfo `protobuf:"bytes,1,opt,name=partition_info,json=partitionInfo,proto3" json:"partition_info,omitempty"` + StfbHostIdMap map[string]string `protobuf:"bytes,2,rep,name=stfb_host_id_map,json=stfbHostIdMap,proto3" json:"stfb_host_id_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Mapping between StfBuilder::discovery-id parameter and its FLP host name (must resolve to IB IP), for all + // StfBuilder processes in the partition. + StfsHostIdMap map[string]string `protobuf:"bytes,3,rep,name=stfs_host_id_map,json=stfsHostIdMap,proto3" json:"stfs_host_id_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *PartitionInitRequest) Reset() { + *x = PartitionInitRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ddsched_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartitionInitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartitionInitRequest) ProtoMessage() {} + +func (x *PartitionInitRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ddsched_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartitionInitRequest.ProtoReflect.Descriptor instead. +func (*PartitionInitRequest) Descriptor() ([]byte, []int) { + return file_protos_ddsched_proto_rawDescGZIP(), []int{2} +} + +func (x *PartitionInitRequest) GetPartitionInfo() *PartitionInfo { + if x != nil { + return x.PartitionInfo + } + return nil +} + +func (x *PartitionInitRequest) GetStfbHostIdMap() map[string]string { + if x != nil { + return x.StfbHostIdMap + } + return nil +} + +func (x *PartitionInitRequest) GetStfsHostIdMap() map[string]string { + if x != nil { + return x.StfsHostIdMap + } + return nil +} + +// Request for partition to be terminated. +// This operation will terminate all connections between EPN and FLP, and remove the partition from DD control-plane. +// Lifetime of individual DD components is managed by the respective FairMQ controller. +type PartitionTermRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PartitionInfo *PartitionInfo `protobuf:"bytes,1,opt,name=partition_info,json=partitionInfo,proto3" json:"partition_info,omitempty"` +} + +func (x *PartitionTermRequest) Reset() { + *x = PartitionTermRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ddsched_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartitionTermRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartitionTermRequest) ProtoMessage() {} + +func (x *PartitionTermRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ddsched_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartitionTermRequest.ProtoReflect.Descriptor instead. +func (*PartitionTermRequest) Descriptor() ([]byte, []int) { + return file_protos_ddsched_proto_rawDescGZIP(), []int{3} +} + +func (x *PartitionTermRequest) GetPartitionInfo() *PartitionInfo { + if x != nil { + return x.PartitionInfo + } + return nil +} + +var File_protos_ddsched_proto protoreflect.FileDescriptor + +var file_protos_ddsched_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x64, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1b, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x22, 0x59, 0x0a, 0x0d, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x8c, + 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, + 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, + 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcb, 0x03, + 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x6d, 0x0a, 0x10, 0x73, 0x74, 0x66, + 0x62, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x66, 0x62, 0x48, 0x6f, 0x73, 0x74, 0x49, + 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x74, 0x66, 0x62, 0x48, + 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x12, 0x6d, 0x0a, 0x10, 0x73, 0x74, 0x66, 0x73, + 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x44, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x66, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x74, 0x66, 0x73, 0x48, 0x6f, + 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x74, 0x66, 0x62, 0x48, + 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x74, 0x66, + 0x73, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x14, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0xb9, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x5f, 0x5f, 0x49, + 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x41, 0x52, 0x54, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x13, + 0x0a, 0x0f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x18, 0x0a, + 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, + 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x32, 0x81, 0x03, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x7a, + 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x12, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, + 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_ddsched_proto_rawDescOnce sync.Once + file_protos_ddsched_proto_rawDescData = file_protos_ddsched_proto_rawDesc +) + +func file_protos_ddsched_proto_rawDescGZIP() []byte { + file_protos_ddsched_proto_rawDescOnce.Do(func() { + file_protos_ddsched_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_ddsched_proto_rawDescData) + }) + return file_protos_ddsched_proto_rawDescData +} + +var file_protos_ddsched_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_ddsched_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_ddsched_proto_goTypes = []interface{}{ + (PartitionState)(0), // 0: o2.DataDistribution.Control.PartitionState + (*PartitionInfo)(nil), // 1: o2.DataDistribution.Control.PartitionInfo + (*PartitionResponse)(nil), // 2: o2.DataDistribution.Control.PartitionResponse + (*PartitionInitRequest)(nil), // 3: o2.DataDistribution.Control.PartitionInitRequest + (*PartitionTermRequest)(nil), // 4: o2.DataDistribution.Control.PartitionTermRequest + nil, // 5: o2.DataDistribution.Control.PartitionInitRequest.StfbHostIdMapEntry + nil, // 6: o2.DataDistribution.Control.PartitionInitRequest.StfsHostIdMapEntry +} +var file_protos_ddsched_proto_depIdxs = []int32{ + 0, // 0: o2.DataDistribution.Control.PartitionResponse.partition_state:type_name -> o2.DataDistribution.Control.PartitionState + 1, // 1: o2.DataDistribution.Control.PartitionInitRequest.partition_info:type_name -> o2.DataDistribution.Control.PartitionInfo + 5, // 2: o2.DataDistribution.Control.PartitionInitRequest.stfb_host_id_map:type_name -> o2.DataDistribution.Control.PartitionInitRequest.StfbHostIdMapEntry + 6, // 3: o2.DataDistribution.Control.PartitionInitRequest.stfs_host_id_map:type_name -> o2.DataDistribution.Control.PartitionInitRequest.StfsHostIdMapEntry + 1, // 4: o2.DataDistribution.Control.PartitionTermRequest.partition_info:type_name -> o2.DataDistribution.Control.PartitionInfo + 3, // 5: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:input_type -> o2.DataDistribution.Control.PartitionInitRequest + 4, // 6: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:input_type -> o2.DataDistribution.Control.PartitionTermRequest + 1, // 7: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:input_type -> o2.DataDistribution.Control.PartitionInfo + 2, // 8: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:output_type -> o2.DataDistribution.Control.PartitionResponse + 2, // 9: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:output_type -> o2.DataDistribution.Control.PartitionResponse + 2, // 10: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:output_type -> o2.DataDistribution.Control.PartitionResponse + 8, // [8:11] is the sub-list for method output_type + 5, // [5:8] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_protos_ddsched_proto_init() } +func file_protos_ddsched_proto_init() { + if File_protos_ddsched_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_ddsched_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ddsched_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ddsched_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionInitRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ddsched_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PartitionTermRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_ddsched_proto_rawDesc, + NumEnums: 1, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_ddsched_proto_goTypes, + DependencyIndexes: file_protos_ddsched_proto_depIdxs, + EnumInfos: file_protos_ddsched_proto_enumTypes, + MessageInfos: file_protos_ddsched_proto_msgTypes, + }.Build() + File_protos_ddsched_proto = out.File + file_protos_ddsched_proto_rawDesc = nil + file_protos_ddsched_proto_goTypes = nil + file_protos_ddsched_proto_depIdxs = nil +} diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto new file mode 100644 index 000000000..bc0e0b1d9 --- /dev/null +++ b/core/integration/ddsched/protos/ddsched.proto @@ -0,0 +1,86 @@ +syntax = "proto3"; +option go_package = "protos;ddpb"; + +// Changelog: +// 2021-02-08: - Initial version +// - Support for a single partition/environment: PartitionID = EnvironmentID + + +package o2.DataDistribution.Control; + +service DataDistributionControl { + + // Partition management requests + rpc PartitionInitialize(PartitionInitRequest) returns (PartitionResponse) { } + rpc PartitionTerminate(PartitionTermRequest) returns (PartitionResponse) { } + rpc PartitionStatus(PartitionInfo) returns (PartitionResponse) { } + +} + +message PartitionInfo { + string environment_id = 1; + // AliECS environment ID (required) + string partition_id = 2; + // Partition ID. (required) +} + +enum PartitionState { + __IGNORE = 0; + PARTITION_UNKNOWN = 1; + // Partition not known to DataDistControl. Initialize by calling PartitionInitialize() + + PARTITION_ERROR = 2; + // Error state, requires manual Terminate/Initialize. + // DD control could not configure the partition according to required specifications + + PARTITION_REQUEST_INVALID = 3; + // Provided configuration does not meet requirements or the request is not accepted at the current state. + + PARTITION_CONFIGURING = 4; + // Configuration accepted, waiting on FLP and EPN DD components to respond and connect. + + PARTITION_CONFIGURED = 5; + // All components configured, ready for dataflow commands + + PARTITION_TERMINATING = 6; + // Partition is terminating. EPN-FLP connections are cleanly terminated. +} + + +message PartitionResponse { + PartitionState partition_state = 1; + // Current or new state of the partition following reception of the request. + + string info_message = 2; + // Optional information message. +} + + +// Request for a new partition. +// AliECS provides the information about processes of DD in order for partition to be configured by TfScheduler. +// Partition request must include all processes. Adding additional processes to existing partition is not supported. +message PartitionInitRequest { + PartitionInfo partition_info = 1; + + map stfb_host_id_map = 2; + // Mapping between StfBuilder::discovery-id parameter and its FLP host name (must resolve to IB IP), for all + // StfBuilder processes in the partition. + map stfs_host_id_map = 3; + // Mapping between StfSender::discovery-id parameter and its FLP host name (must resolve to IB IP), for all + // StfSender processes in the partition. + + // NOTE: 1. Sizes of stfb_host_id_map and stfs_host_id_map must be the same. StfBuilders and StfSenders come in pairs. + // 2. Multiple discovery-id can map to the same FLP node. + // 3. DNS names (strings) in both maps must satisfy the property: + // stfb_host_id_map.values == stfb_host_id_map.values + // 4. discovery-ids are used for debugging purposes. It would be helpful if the values assigned by AliECS + // provided human-readable information. E.g. an id for the first StfSender on flp009 could be: + // "stfs-flp009#0-". +} + +// Request for partition to be terminated. +// This operation will terminate all connections between EPN and FLP, and remove the partition from DD control-plane. +// Lifetime of individual DD components is managed by the respective FairMQ controller. +message PartitionTermRequest { + PartitionInfo partition_info = 1; +} diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go new file mode 100644 index 000000000..bcf8b89a7 --- /dev/null +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -0,0 +1,169 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package ddpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// DataDistributionControlClient is the client API for DataDistributionControl service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type DataDistributionControlClient interface { + // Partition management requests + PartitionInitialize(ctx context.Context, in *PartitionInitRequest, opts ...grpc.CallOption) (*PartitionResponse, error) + PartitionTerminate(ctx context.Context, in *PartitionTermRequest, opts ...grpc.CallOption) (*PartitionResponse, error) + PartitionStatus(ctx context.Context, in *PartitionInfo, opts ...grpc.CallOption) (*PartitionResponse, error) +} + +type dataDistributionControlClient struct { + cc grpc.ClientConnInterface +} + +func NewDataDistributionControlClient(cc grpc.ClientConnInterface) DataDistributionControlClient { + return &dataDistributionControlClient{cc} +} + +func (c *dataDistributionControlClient) PartitionInitialize(ctx context.Context, in *PartitionInitRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { + out := new(PartitionResponse) + err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionInitialize", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataDistributionControlClient) PartitionTerminate(ctx context.Context, in *PartitionTermRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { + out := new(PartitionResponse) + err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionTerminate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *dataDistributionControlClient) PartitionStatus(ctx context.Context, in *PartitionInfo, opts ...grpc.CallOption) (*PartitionResponse, error) { + out := new(PartitionResponse) + err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// DataDistributionControlServer is the server API for DataDistributionControl service. +// All implementations should embed UnimplementedDataDistributionControlServer +// for forward compatibility +type DataDistributionControlServer interface { + // Partition management requests + PartitionInitialize(context.Context, *PartitionInitRequest) (*PartitionResponse, error) + PartitionTerminate(context.Context, *PartitionTermRequest) (*PartitionResponse, error) + PartitionStatus(context.Context, *PartitionInfo) (*PartitionResponse, error) +} + +// UnimplementedDataDistributionControlServer should be embedded to have forward compatible implementations. +type UnimplementedDataDistributionControlServer struct { +} + +func (UnimplementedDataDistributionControlServer) PartitionInitialize(context.Context, *PartitionInitRequest) (*PartitionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartitionInitialize not implemented") +} +func (UnimplementedDataDistributionControlServer) PartitionTerminate(context.Context, *PartitionTermRequest) (*PartitionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartitionTerminate not implemented") +} +func (UnimplementedDataDistributionControlServer) PartitionStatus(context.Context, *PartitionInfo) (*PartitionResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PartitionStatus not implemented") +} + +// UnsafeDataDistributionControlServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to DataDistributionControlServer will +// result in compilation errors. +type UnsafeDataDistributionControlServer interface { + mustEmbedUnimplementedDataDistributionControlServer() +} + +func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { + s.RegisterService(&_DataDistributionControl_serviceDesc, srv) +} + +func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartitionInitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataDistributionControlServer).PartitionInitialize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionInitialize", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataDistributionControlServer).PartitionInitialize(ctx, req.(*PartitionInitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataDistributionControl_PartitionTerminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartitionTermRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataDistributionControlServer).PartitionTerminate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionTerminate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataDistributionControlServer).PartitionTerminate(ctx, req.(*PartitionTermRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PartitionInfo) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(DataDistributionControlServer).PartitionStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(DataDistributionControlServer).PartitionStatus(ctx, req.(*PartitionInfo)) + } + return interceptor(ctx, in, info, handler) +} + +var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ + ServiceName: "o2.DataDistribution.Control.DataDistributionControl", + HandlerType: (*DataDistributionControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "PartitionInitialize", + Handler: _DataDistributionControl_PartitionInitialize_Handler, + }, + { + MethodName: "PartitionTerminate", + Handler: _DataDistributionControl_PartitionTerminate_Handler, + }, + { + MethodName: "PartitionStatus", + Handler: _DataDistributionControl_PartitionStatus_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/ddsched.proto", +} diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 6d5890d70..91c574c7b 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -28,8 +28,6 @@ import ( "sync" "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -38,6 +36,7 @@ var log = logger.New(logrus.StandardLogger(), "integration") var( once sync.Once + pluginLoaders map[string]func() Plugin instance Plugins ) @@ -46,10 +45,25 @@ type Plugins []Plugin type Plugin interface { GetName() string Init(instanceId string) error - ObjectStack(varStack map[string]string) map[string]interface{} + ObjectStack(data interface{}) map[string]interface{} Destroy() error } +type NewFunc func(endpoint string) Plugin + +func RegisterPlugin(pluginName string, endpointArgumentName string, newFunc NewFunc) { + once.Do(func() { + pluginLoaders = make(map[string]func() Plugin) + }) + pluginLoaders[pluginName] = func() Plugin { + if viper.IsSet(endpointArgumentName) { + endpoint := viper.GetString(endpointArgumentName) + return newFunc(endpoint) + } + return nil + } +} + func (p Plugins) InitAll(fid string) { for _, plugin := range p { initErr := plugin.Init(fid) @@ -72,10 +86,10 @@ func (p Plugins) DestroyAll() { } } -func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { +func (p Plugins) ObjectStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) for _, plugin := range p { - s := plugin.ObjectStack(varStack) + s := plugin.ObjectStack(data) stack[plugin.GetName()] = s } return @@ -83,18 +97,28 @@ func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]inter func PluginsInstance() Plugins { once.Do(func() { - var endpoint string - if viper.IsSet("dcsServiceEndpoint") { //coconut - endpoint = viper.GetString("dcsServiceEndpoint") - instance = []Plugin{} + instance = Plugins{} + pluginList := viper.GetStringSlice("integrationPlugins") - pluginList := viper.GetStringSlice("integrationPlugins") - if utils.StringSliceContains(pluginList, "dcs") { - instance = append(instance, dcs.NewPlugin(endpoint)) + for _, pluginName := range pluginList { + if pluginLoaders == nil { + log.WithField("plugin", pluginName). + Error("requested plugin unavailable") + continue + } + pluginLoader, ok := pluginLoaders[pluginName] + if !ok { + log.WithField("plugin", pluginName). + Error("requested plugin unavailable") + continue + } + newPlugin := pluginLoader() + if newPlugin == nil { + log.WithField("plugin", pluginName). + Error("plugin loader failed") + continue } - } else { - log.WithField("dcsServiceEndpoint", endpoint).Error("bad DCS service endpoint") - instance = Plugins{} + instance = append(instance, newPlugin) } }) return instance diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 0b1613b30..f8bd50f38 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -104,7 +104,7 @@ func (c *Call) Call() error { template.WrapPointer(&returnVar), } c.VarStack["run_number"] = strconv.FormatUint(uint64(c.parentRole.GetCurrentRunNumber()), 10 ) - objStack := integration.PluginsInstance().ObjectStack(c.VarStack) + objStack := integration.PluginsInstance().ObjectStack(c) err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) if err != nil { diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 62972dbb7..178e23b8e 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -219,6 +219,10 @@ func (i *iteratorRole) copy() copyable { return &iCopy } +func (i *iteratorRole) ConsolidatedVarStack() (varStack map[string]string, err error) { + return nil, errors.New("iterator has no stack") +} + func (i *iteratorRole) GetParent() Updatable { if i == nil || i.template == nil { return nil diff --git a/core/workflow/role.go b/core/workflow/role.go index 957025f21..4bfa93e3b 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -62,6 +62,7 @@ type Role interface { GetHooksForTrigger(trigger string) callable.Hooks IsEnabled() bool GetCurrentRunNumber() uint32 + ConsolidatedVarStack() (varStack map[string]string, err error) } type PublicUpdatable interface { diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 5b3f058d5..dd64b51b2 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -44,3 +44,48 @@ func WrapConstraints(items constraint.Constraints) template.Fields { } return fields } + +func GetRoot(role Role) (root Role) { + if role == nil { + return nil + } + current := role + for ;; { + if parent := current.GetParentRole(); parent != nil { + // if there's a parent, we go up + current = parent + continue + } + + // it has no parent, so... + return current + } +} + +func Walk(root Role, do func(role Role)) { + switch typed := root.(type) { + case *aggregatorRole: + do(typed) + for _, child := range typed.Roles { + Walk(child, do) + } + case *taskRole: + do(typed) + case *callRole: + do(typed) + } +} + +func LeafWalk(root Role, do func(role Role)) { + switch typed := root.(type) { + case *aggregatorRole: + for _, child := range typed.Roles { + Walk(child, do) + } + case *taskRole: + do(typed) + case *callRole: + do(typed) + } + +} From 97a72c294a248b435c02fc17e6ed507c8a4bb940 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Feb 2021 12:28:08 +0100 Subject: [PATCH 0722/2352] [core][coconut] Display consolidated variable stack in role query --- coconut/control/control.go | 8 +- coconut/protos/o2control.pb.go | 166 ++++++++++++++++++--------------- core/protos/o2control.pb.go | 166 ++++++++++++++++++--------------- core/protos/o2control.proto | 1 + core/serverutil.go | 20 ++-- 5 files changed, 204 insertions(+), 157 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 00ee708d5..c9043c68f 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -626,6 +626,7 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, defaultsStr = stringMapToString(root.Defaults, "\t") varsStr = stringMapToString(root.Vars, "\t") userVarsStr = stringMapToString(root.UserVars, "\t") + consolidatedStr = stringMapToString(root.ConsolidatedStack, "\t") ) _, _ = fmt.Fprintf(o, "(%s)\n", yellow(i)) @@ -633,14 +634,17 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, _, _ = fmt.Fprintf(o, "status: %s\n", root.GetStatus()) _, _ = fmt.Fprintf(o, "state: %s\n", root.GetState()) if len(defaultsStr) != 0 { - _, _ = fmt.Fprintf(o, "defaults:\n%s\n", defaultsStr) + _, _ = fmt.Fprintf(o, "role defaults:\n%s\n", defaultsStr) } if len(varsStr) != 0 { - _, _ = fmt.Fprintf(o, "variables:\n%s\n", varsStr) + _, _ = fmt.Fprintf(o, "role variables:\n%s\n", varsStr) } if len(userVarsStr) != 0 { _, _ = fmt.Fprintf(o, "user-provided variables:\n%s\n", userVarsStr) } + if len(consolidatedStr) != 0 { + _, _ = fmt.Fprintf(o, "consolidated stack:\n%s\n", consolidatedStr) + } _, _ = fmt.Fprintf(o, "subtree:\n") drawWorkflow(root, o) } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index f91535149..aa59fba99 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -3079,15 +3079,16 @@ type RoleInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *RoleInfo) Reset() { @@ -3185,6 +3186,13 @@ func (x *RoleInfo) GetUserVars() map[string]string { return nil } +func (x *RoleInfo) GetConsolidatedStack() map[string]string { + if x != nil { + return x.ConsolidatedStack + } + return nil +} + type GetRolesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4450,7 +4458,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, - 0x91, 0x04, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, @@ -4472,15 +4480,25 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, + 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, @@ -4698,7 +4716,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -4779,6 +4797,7 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 76: o2control.RoleInfo.DefaultsEntry nil, // 77: o2control.RoleInfo.VarsEntry nil, // 78: o2control.RoleInfo.UserVarsEntry + nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry } var file_protos_o2control_proto_depIdxs = []int32{ 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -4820,60 +4839,61 @@ var file_protos_o2control_proto_depIdxs = []int32{ 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 50, // 39: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 53, // 40: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 56, // 41: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 7, // 42: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 44: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 50: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 51: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 52: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 53: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 54: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 55: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 56: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 57: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 58: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 59: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 60: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 61: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 62: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 63: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 64: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 8, // 65: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 66: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 67: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 68: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 69: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 70: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 71: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 72: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 73: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 74: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 75: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 76: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 77: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 78: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 79: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 80: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 81: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 82: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 83: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 84: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 85: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 86: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 87: o2control.Control.Subscribe:output_type -> o2control.Event - 65, // [65:88] is the sub-list for method output_type - 42, // [42:65] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event + 66, // [66:89] is the sub-list for method output_type + 43, // [43:66] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5677,7 +5697,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 76, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index f91535149..aa59fba99 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -3079,15 +3079,16 @@ type RoleInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *RoleInfo) Reset() { @@ -3185,6 +3186,13 @@ func (x *RoleInfo) GetUserVars() map[string]string { return nil } +func (x *RoleInfo) GetConsolidatedStack() map[string]string { + if x != nil { + return x.ConsolidatedStack + } + return nil +} + type GetRolesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4450,7 +4458,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, - 0x91, 0x04, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, @@ -4472,15 +4480,25 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, + 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, @@ -4698,7 +4716,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -4779,6 +4797,7 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 76: o2control.RoleInfo.DefaultsEntry nil, // 77: o2control.RoleInfo.VarsEntry nil, // 78: o2control.RoleInfo.UserVarsEntry + nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry } var file_protos_o2control_proto_depIdxs = []int32{ 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -4820,60 +4839,61 @@ var file_protos_o2control_proto_depIdxs = []int32{ 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 50, // 39: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 53, // 40: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 56, // 41: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 7, // 42: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 44: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 50: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 51: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 52: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 53: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 54: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 55: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 56: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 57: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 58: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 59: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 60: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 61: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 62: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 63: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 64: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 8, // 65: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 66: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 67: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 68: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 69: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 70: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 71: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 72: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 73: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 74: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 75: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 76: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 77: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 78: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 79: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 80: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 81: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 82: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 83: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 84: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 85: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 86: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 87: o2control.Control.Subscribe:output_type -> o2control.Event - 65, // [65:88] is the sub-list for method output_type - 42, // [42:65] is the sub-list for method input_type - 42, // [42:42] is the sub-list for extension type_name - 42, // [42:42] is the sub-list for extension extendee - 0, // [0:42] is the sub-list for field type_name + 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event + 66, // [66:89] is the sub-list for method output_type + 43, // [43:66] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5677,7 +5697,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 76, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index dc86e89e9..2a568c936 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -357,6 +357,7 @@ message RoleInfo { map defaults = 7; map vars = 8; map userVars = 9; + map consolidatedStack = 10; } message GetRolesReply { diff --git a/core/serverutil.go b/core/serverutil.go index 24030b85a..f3ec45a41 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -170,16 +170,18 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { for i, cr := range childRoles { childRoleInfos[i] = workflowToRoleTree(cr) } + consolidatedVarStack, _ := root.ConsolidatedVarStack() ri = &pb.RoleInfo{ - Name: root.GetName(), - Status: root.GetStatus().String(), - State: root.GetState().String(), - FullPath: root.GetPath(), - TaskIds: tasksToTaskIds(root.GetTasks()), - Roles: childRoleInfos, - Defaults: root.GetDefaults().Raw(), - Vars: root.GetVars().Raw(), - UserVars: root.GetUserVars().Raw(), + Name: root.GetName(), + Status: root.GetStatus().String(), + State: root.GetState().String(), + FullPath: root.GetPath(), + TaskIds: tasksToTaskIds(root.GetTasks()), + Roles: childRoleInfos, + Defaults: root.GetDefaults().Raw(), + Vars: root.GetVars().Raw(), + UserVars: root.GetUserVars().Raw(), + ConsolidatedStack: consolidatedVarStack, } return } From 76ea5f76e84351268eff0dfd855bebe85110dc28 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Feb 2021 15:24:31 +0100 Subject: [PATCH 0723/2352] [core] Fix integration plugin loading --- core/config.go | 6 ++++-- core/integration/ddsched/plugin.go | 4 ++-- core/integration/plugin.go | 10 ++++++---- core/workflow/callable/call.go | 1 + core/workflow/roleutils.go | 11 ++++++++++- 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/core/config.go b/core/config.go index 502945d99..eaf84300d 100644 --- a/core/config.go +++ b/core/config.go @@ -93,8 +93,9 @@ func setDefaults() error { viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) - viper.SetDefault("configServiceUri", "apricot://localhost:47101") - viper.SetDefault("dcsServiceEndpoint", "localhost:50051") + viper.SetDefault("configServiceUri", "apricot://127.0.0.1:47101") + viper.SetDefault("dcsServiceEndpoint", "127.0.0.1:50051") + viper.SetDefault("ddSchedulerEndpoint", "127.0.0.1:50052") viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") @@ -139,6 +140,7 @@ func setFlags() error { pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("configServiceUri", viper.GetString("configServiceUri"), "URI of the Apricot instance (`apricot://host:port`), Consul server (`consul://`) or YAML configuration file, entry point for all configuration") pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") + pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 050588fcc..a9eb16f3e 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -42,7 +42,7 @@ import ( "google.golang.org/grpc/connectivity" ) -const DCS_CALL_TIMEOUT = 10 * time.Second +const DDSCHED_CALL_TIMEOUT = 10 * time.Second type Plugin struct { @@ -81,7 +81,7 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(_ string) error { if p.ddSchedClient == nil { - callTimeout := DCS_CALL_TIMEOUT + callTimeout := DDSCHED_CALL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) p.ddSchedClient = NewClient(cxt, cancel, viper.GetString("ddSchedulerEndpoint")) if p.ddSchedClient == nil { diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 91c574c7b..7f1c0d673 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -34,10 +34,12 @@ import ( var log = logger.New(logrus.StandardLogger(), "integration") -var( - once sync.Once +var ( + once sync.Once + instance Plugins + + loaderOnce sync.Once pluginLoaders map[string]func() Plugin - instance Plugins ) type Plugins []Plugin @@ -52,7 +54,7 @@ type Plugin interface { type NewFunc func(endpoint string) Plugin func RegisterPlugin(pluginName string, endpointArgumentName string, newFunc NewFunc) { - once.Do(func() { + loaderOnce.Do(func() { pluginLoaders = make(map[string]func() Plugin) }) pluginLoaders[pluginName] = func() Plugin { diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index f8bd50f38..adc8989e7 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -104,6 +104,7 @@ func (c *Call) Call() error { template.WrapPointer(&returnVar), } c.VarStack["run_number"] = strconv.FormatUint(uint64(c.parentRole.GetCurrentRunNumber()), 10 ) + c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() objStack := integration.PluginsInstance().ObjectStack(c) err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index dd64b51b2..1d7c1c529 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -69,6 +69,11 @@ func Walk(root Role, do func(role Role)) { for _, child := range typed.Roles { Walk(child, do) } + case *iteratorRole: + do(typed) + for _, child := range typed.Roles { + LeafWalk(child, do) + } case *taskRole: do(typed) case *callRole: @@ -80,7 +85,11 @@ func LeafWalk(root Role, do func(role Role)) { switch typed := root.(type) { case *aggregatorRole: for _, child := range typed.Roles { - Walk(child, do) + LeafWalk(child, do) + } + case *iteratorRole: + for _, child := range typed.Roles { + LeafWalk(child, do) } case *taskRole: do(typed) From 5aae1b9a84dc51b2dc54064a78173b78fca25074 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Feb 2021 16:22:21 +0100 Subject: [PATCH 0724/2352] [build] Bump to v0.20.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5125e33a3..c3eb63587 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 1f76f632aa9123b2831ca25b150a1cd17344e914 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Feb 2021 12:05:30 +0100 Subject: [PATCH 0725/2352] [build] Update dependencies --- go.mod | 160 +++++++++++----- go.sum | 444 +++++++++++++++++++++++++++++++++++++++++++ occ/peanut/peanut.go | 2 +- 3 files changed, 557 insertions(+), 49 deletions(-) diff --git a/go.mod b/go.mod index 0eaf9d940..9e4fcc80f 100644 --- a/go.mod +++ b/go.mod @@ -17,102 +17,166 @@ replace ( // tview should be version 0ba8301b415c otherwise peanut will deadlock require ( - github.com/AlecAivazis/survey/v2 v2.1.1 - github.com/antonmedv/expr v1.4.5 - github.com/armon/go-metrics v0.3.3 // indirect - github.com/briandowns/spinner v1.11.1 + cloud.google.com/go v0.76.0 // indirect + cloud.google.com/go/firestore v1.4.0 // indirect + github.com/AlecAivazis/survey/v2 v2.2.7 + github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect + github.com/Masterminds/goutils v1.1.1 // indirect + github.com/Masterminds/semver v1.5.0 // indirect + github.com/Masterminds/sprig v2.22.0+incompatible // indirect + github.com/Microsoft/go-winio v0.4.16 // indirect + github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 // indirect + github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca // indirect + github.com/antonmedv/expr v1.8.9 + github.com/aokoli/goutils v1.1.1 // indirect + github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect + github.com/armon/go-metrics v0.3.6 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bketelsen/crypt v0.0.3 // indirect + github.com/briandowns/spinner v1.12.0 + github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect + github.com/cespare/xxhash/v2 v2.1.1 // indirect + github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect github.com/coreos/bbolt v1.3.4 // indirect - github.com/coreos/etcd v3.3.19+incompatible // indirect + github.com/coreos/etcd v3.3.25+incompatible // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect + github.com/deckarep/golang-set v1.7.1 // indirect github.com/denisbrodbeck/machineid v1.0.1 - github.com/fatih/color v1.9.0 - github.com/flosch/pongo2/v4 v4.0.0 + github.com/dustin/go-humanize v1.0.0 // indirect + github.com/emirpasic/gods v1.12.0 // indirect + github.com/envoyproxy/go-control-plane v0.9.8 // indirect + github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect + github.com/fatih/color v1.10.0 + github.com/flosch/pongo2/v4 v4.0.2 github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/gdamore/tcell v1.3.0 + github.com/gdamore/tcell v1.4.0 // indirect + github.com/gdamore/tcell/v2 v2.1.0 github.com/gliderlabs/ssh v0.3.0 // indirect - github.com/go-git/go-git/v5 v5.1.0 + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-git/v5 v5.2.0 + github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 // indirect github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 + github.com/gogo/protobuf v1.2.1 // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect + github.com/golang/mock v1.4.4 // indirect github.com/golang/protobuf v1.4.3 + github.com/google/go-cmp v0.5.4 // indirect + github.com/google/martian/v3 v3.1.0 // indirect + github.com/google/pprof v0.0.0-20210122040257-d980be63207e // indirect + github.com/google/uuid v1.2.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect - github.com/hashicorp/consul/api v1.4.0 - github.com/hashicorp/go-hclog v0.14.0 // indirect - github.com/hashicorp/go-immutable-radix v1.2.0 // indirect + github.com/hashicorp/consul/api v1.8.1 + github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-hclog v0.15.0 // indirect + github.com/hashicorp/go-immutable-radix v1.3.0 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect - github.com/hashicorp/serf v0.9.2 // indirect - github.com/imdario/mergo v0.3.9 - github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a + github.com/huandu/xstrings v1.3.2 // indirect + github.com/imdario/mergo v0.3.11 + github.com/jinzhu/copier v0.2.4 + github.com/json-iterator/go v1.1.10 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible + github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1 - github.com/lucasb-eyer/go-colorful v1.0.3 // indirect - github.com/mattn/go-colorable v0.1.6 // indirect - github.com/mattn/go-runewidth v0.0.9 // indirect + github.com/looplab/fsm v0.2.0 + github.com/lucasb-eyer/go-colorful v1.2.0 // indirect + github.com/magiconair/properties v1.8.4 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mesos/mesos-go v0.0.11 - github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/miekg/dns v1.1.29 // indirect + github.com/mitchellh/copystructure v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/mapstructure v1.3.1 // indirect + github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.1 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/olekukonko/tablewriter v0.0.4 - github.com/onsi/ginkgo v1.12.2 - github.com/onsi/gomega v1.10.1 - github.com/osamingo/indigo v1.0.1 + github.com/nxadm/tail v1.4.8 // indirect + github.com/olekukonko/tablewriter v0.0.5 + github.com/onsi/ginkgo v1.15.0 + github.com/onsi/gomega v1.10.5 + github.com/osamingo/indigo v1.1.0 github.com/osteele/liquid v1.2.4 // indirect github.com/osteele/tuesday v1.0.3 // indirect - github.com/pborman/uuid v1.2.0 - github.com/pelletier/go-toml v1.6.0 // indirect + github.com/pborman/uuid v1.2.1 + github.com/pelletier/go-toml v1.8.1 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pkg/sftp v1.12.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_golang v1.5.1 - github.com/prometheus/procfs v0.0.11 // indirect + github.com/pressly/chi v0.0.0-00010101000000-000000000000 // indirect + github.com/prometheus/client_golang v1.9.0 + github.com/prometheus/client_model v0.2.0 // indirect github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c + github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 github.com/rs/xid v1.2.1 + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sanity-io/litter v1.2.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect - github.com/sirupsen/logrus v1.6.0 + github.com/sirupsen/logrus v1.7.0 github.com/smartystreets/assertions v1.0.1 // indirect - github.com/spf13/afero v1.2.2 // indirect + github.com/spf13/afero v1.5.1 // indirect github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v1.0.0 + github.com/spf13/cobra v1.1.3 github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.6.2 - github.com/stretchr/testify v1.5.1 // indirect + github.com/spf13/viper v1.7.1 + github.com/stretchr/testify v1.7.0 // indirect github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect - github.com/valyala/fasttemplate v1.1.0 + github.com/ugorji/go v1.1.4 // indirect + github.com/valyala/fasttemplate v1.2.1 github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect + github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.0.0 + github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 // indirect + github.com/yuin/goldmark v1.3.2 // indirect go.etcd.io/bbolt v1.3.4 // indirect + go.opencensus.io v0.22.6 // indirect go.uber.org/zap v1.14.1 // indirect - golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect - golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 - golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e - golang.org/x/text v0.3.4 // indirect - golang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect - google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d // indirect - google.golang.org/grpc v1.34.0 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 - google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d // indirect + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect + golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect + golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect + golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect + golang.org/x/mod v0.4.1 // indirect + golang.org/x/net v0.0.0-20210119194325-5f4716e94777 + golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd // indirect + golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect + golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c + golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect + golang.org/x/text v0.3.5 // indirect + golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect + golang.org/x/tools v0.1.0 // indirect + google.golang.org/api v0.39.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea // indirect + google.golang.org/grpc v1.35.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 + google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162 // indirect google.golang.org/protobuf v1.25.0 - gopkg.in/ini.v1 v1.55.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/osteele/liquid.v1 v1.2.4 // indirect - gopkg.in/yaml.v2 v2.3.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b sigs.k8s.io/yaml v1.2.0 // indirect ) + +replace github.com/codahale/hdrhistogram => github.com/HdrHistogram/hdrhistogram-go v1.0.1 + +replace github.com/pressly/chi => github.com/go-chi/chi v1.5.2 diff --git a/go.sum b/go.sum index 9f55fed96..1a155f0ee 100644 --- a/go.sum +++ b/go.sum @@ -13,8 +13,26 @@ cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5 cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw= +cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.63.0 h1:A+DfAZQ/eWca7gvu42CS6FNSDX4R8cghF+XfWLn4R6g= cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= +cloud.google.com/go v0.64.0/go.mod h1:xfORb36jGvE+6EexW71nMEtL025s3x6xvuYUKM4JLv4= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= +cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858= +cloud.google.com/go v0.68.0/go.mod h1:91NO4SCDjUfe1zeC0f4/dpckkUNpuNEyqm4X2KLrzNQ= +cloud.google.com/go v0.69.0/go.mod h1:nBQK+D2Y4slKAj03c6wkILB3imWdzebeEZgWHEmGREE= +cloud.google.com/go v0.69.1/go.mod h1:nBQK+D2Y4slKAj03c6wkILB3imWdzebeEZgWHEmGREE= +cloud.google.com/go v0.70.0/go.mod h1:/UTKYRQTWjVnSe7nGvoSzxEFUELzSI/yAYd0JQT6cRo= +cloud.google.com/go v0.71.0/go.mod h1:qZfY4Y7AEIQwG/fQYD3xrxLNkQZ0Xzf3HGeqCkA6LVM= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.73.0/go.mod h1:BkDh9dFvGjCitVw03TNjKbBxXNKULXXIq6orU6HrJ4Q= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go v0.76.0 h1:Ckw+E/QYZgd/5bpI4wz4h6f+jmpvh9S9uSrKNnbicJI= +cloud.google.com/go v0.76.0/go.mod h1:r9EvIAvLrunusnetGdQ50M/gKui1x3zdGW/VELGkdpw= cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= @@ -31,6 +49,10 @@ cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70 cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.2.0 h1:zrl+2VJAYC/C6WzEPnkqZIBeHyHFs/UmtzJdXU4Bvmo= cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= +cloud.google.com/go/firestore v1.3.0 h1:QaBSisuvNi9/o+3nCHqUEfduHCPfhEw2jcUofi0n8oY= +cloud.google.com/go/firestore v1.3.0/go.mod h1:Qt0gS9Qz9tROrmgFavo36+hdST1FXvmtnGnO0Dr03pU= +cloud.google.com/go/firestore v1.4.0 h1:A8eudYNUtdspdyoR6OaPoZxSFxE4qu7ctKcxvhGsUOE= +cloud.google.com/go/firestore v1.4.0/go.mod h1:NjjGEnxCS3CAKYp+vmALu20QzcqasGodQp48WxJGAYc= cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= @@ -44,28 +66,57 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037 h1:+PdD6GLKejR9DizMAKT5DpSAkKswvZrurk1/eEt9+pw= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AlecAivazis/survey v1.8.8 h1:Y4yypp763E8cbqb5RBqZhGgkCFLRFnbRBHrxnpMMsgQ= github.com/AlecAivazis/survey/v2 v2.1.1 h1:LEMbHE0pLj75faaVEKClEX1TM4AJmmnOh9eimREzLWI= github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= +github.com/AlecAivazis/survey/v2 v2.2.7 h1:5NbxkF4RSKmpywYdcRgUmos1o+roJY8duCLZXbVjoig= +github.com/AlecAivazis/survey/v2 v2.2.7/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk= +github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= +github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= +github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= +github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= +github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= +github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= +github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 h1:AUNCr9CiJuwrRYS3XieqF+Z9B9gNxo/eANAJCF2eiN4= +github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= @@ -101,18 +152,29 @@ github.com/antonmedv/expr v1.8.6/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmH github.com/antonmedv/expr v1.8.7/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/antonmedv/expr v1.8.8 h1:uVwIkIBNO2yn4vY2u2DQUqXTmv9jEEMCEcHa19G5weY= github.com/antonmedv/expr v1.8.8/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/antonmedv/expr v1.8.9 h1:O9stiHmHHww9b4ozhPx7T6BK7fXfOCHJ8ybxf0833zw= +github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/aokoli/goutils v1.1.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= +github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.6 h1:x/tmtOF9cDBoXH7XoAGOz2qqm1DknFD1590XmD/DUJ8= +github.com/armon/go-metrics v0.3.6/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= +github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= +github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= +github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -120,11 +182,20 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= +github.com/bketelsen/crypt v0.0.3 h1:6bNynYE39IsvJHCLr6ziogOcIAec7LO6cuW/lwWGEWw= +github.com/bketelsen/crypt v0.0.3/go.mod h1:XG4b7lkBbt44/SZ4QOtOjhd5SXJzF+pTJE+nWFY+Yqs= github.com/briandowns/spinner v1.9.0 h1:+OMAisemaHar1hjuJ3Z2hIvNhQl9Y7GLPWUwwz2Pxo8= github.com/briandowns/spinner v1.9.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/briandowns/spinner v1.12.0 h1:72O0PzqGJb6G3KgrcIOtL/JAGGZ5ptOMCn9cUHmqsmw= +github.com/briandowns/spinner v1.12.0/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= +github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= +github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= @@ -134,21 +205,32 @@ github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5P github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= +github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354 h1:9kRtNpqLHbZVO/NNxhHp2ymxFxsHOe3x2efJGn//Tas= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 h1:r3DTlrs4TDsAOv3sTv8XlcUUj5J/t2l4/rCdwPuc13s= +github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= github.com/coreos/etcd v3.3.19+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.22+incompatible h1:AnRMUyVdVvh1k7lHe61YEd227+CLoNogQuAypztGSK4= github.com/coreos/etcd v3.3.22+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.24+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/etcd v3.3.25+incompatible h1:0GQEw6h3YnuOVdtwygkIfJ+Omx0tZ8/QkVyXI4LkbeY= +github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= +github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= @@ -164,26 +246,42 @@ github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbj github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7 h1:EARl0OvqMoxq/UMgMSCLnXzkaXbxzskluEBlMQCJPms= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.8 h1:bbmjRkjmP0ZggMoahdNMmJFFnK7v5H+/j5niP5QH6bg= +github.com/envoyproxy/go-control-plane v0.9.8/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.4.1 h1:7dLaJvASGRD7X49jSCSXXHwKPm0ZN9r9kJD+p+vS7dM= +github.com/envoyproxy/protoc-gen-validate v0.4.1/go.mod h1:E+IEazqdaWv3FrnGtZIu3b9fPFMK8AzeTTrk9SfVwWs= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE= github.com/flosch/pongo2/v4 v4.0.0 h1:6eZe8NSNxtTTGwXgJqqXiiLEDAj7CvkwiYrZFQRW6cQ= github.com/flosch/pongo2/v4 v4.0.0/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= +github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= +github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= @@ -193,12 +291,20 @@ github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= +github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU= +github.com/gdamore/tcell v1.4.0/go.mod h1:vxEiSDZdW3L+Uhjii9c3375IlDmR05bzxY404ZVSMo0= +github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591 h1:0WWUDZ1oxq7NxVyGo8M3KI5jbkiwNAdZFFzAdC68up4= +github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= +github.com/gdamore/tcell/v2 v2.1.0 h1:UnSmozHgBkQi2PGsFr+rpdXuAPRRucMegpQp3Z3kDro= +github.com/gdamore/tcell/v2 v2.1.0/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-chi/chi v1.5.2 h1:YcLIBANL4OTaAOcTdp//sskGa0yGACQMCtbnr7YEn0Q= +github.com/go-chi/chi v1.5.2/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= @@ -207,15 +313,25 @@ github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= +github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI= +github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 h1:BcbKYUZo/TKPsiSh7LymK3p+TNAJJW3OfGO/21sBbiA= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= @@ -223,11 +339,13 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -259,6 +377,7 @@ github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -273,10 +392,15 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -284,6 +408,13 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201009210932-67992a1a5a35/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201117184057-ae444373da19/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -291,6 +422,8 @@ github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= +github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -298,39 +431,57 @@ github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGa github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= +github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= +github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0 h1:jfESivXnO5uLdH650JU/6AnjRoHrLhULq0FnC3Kp9EY= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= +github.com/hashicorp/consul/api v1.8.1 h1:BOEQaMWoGMhmQ29fC26bi0qb7/rId9JzZP2V0Xmx7m8= +github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.4.0 h1:zBtCfKJZcJDBvSCkQJch4ulp59m1rATFLKwNo/LYY30= github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/hashicorp/consul/sdk v0.7.0 h1:H6R9d008jDcHPQPAqPNuydAshJ4v5/8URdFnUvK/+sc= +github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.12.1 h1:99niEVkDqsEv3/jINwoOUgGE9L41LHXM4k3jTkV+DdA= github.com/hashicorp/go-hclog v0.12.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.14.0 h1:1X+ga+2ki9aUJJaliI2isvjNLI8rNCGHFkZ1FaVpvCA= github.com/hashicorp/go-hclog v0.14.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v0.15.0 h1:qMuK0wxsoW4D0ddCCYwPSTm4KQv1X1ke3WmPWZ0Mvsk= +github.com/hashicorp/go-hclog v0.15.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE= +github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -354,6 +505,7 @@ github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1 github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -373,30 +525,48 @@ github.com/hashicorp/serf v0.9.0 h1:+Zd/16AJ9lxk9RzfTDyv/TLhZ8UerqYS0/+JGCIDaa0= github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= +github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM= +github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= +github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= +github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= +github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= +github.com/jinzhu/copier v0.2.4 h1:dT3tI+8GzU8DjJFCj9mLYtjfRtUmK7edauduQdcZCpI= +github.com/jinzhu/copier v0.2.4/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= +github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= @@ -404,6 +574,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= @@ -412,6 +583,8 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= @@ -420,10 +593,14 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3 github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -434,34 +611,49 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= +github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1 h1:o8x6Bd9wEjQk/8+bNzmmLb+OUvrc4syw0JUVfa10v8k= github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1/go.mod h1:p+IElwgCnAByqr2DWMuNbPjgMwqcHvTRZZn3dvKEke0= +github.com/looplab/fsm v0.2.0 h1:M8hf5EF4AYLcT1FNKVUX8nu7D0xfp291iGeuigSxfrw= +github.com/looplab/fsm v0.2.0/go.mod h1:p+IElwgCnAByqr2DWMuNbPjgMwqcHvTRZZn3dvKEke0= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= +github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= +github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= +github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= @@ -470,6 +662,8 @@ github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8 github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= +github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -477,6 +671,8 @@ github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= +github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= +github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= @@ -494,6 +690,10 @@ github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.1 h1:cCBH2gTD2K0OtLlv/Y5H01VQCqmlDxz30kS5Y5bqfLA= github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= +github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -501,53 +701,99 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= +github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= +github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= +github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= +github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= +github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= +github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= +github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.12.2 h1:Ke9m3h2Hu0wsZ45yewCqhYr3Z+emcNTuLY2nMWCkrSI= github.com/onsi/ginkgo v1.12.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= +github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= +github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= +github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= +github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= +github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= +github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= github.com/osamingo/indigo v1.0.1 h1:zYzUDKDD4ihcz+8nz1HkZeKxn2Fff40UD/FuV0rXXQQ= github.com/osamingo/indigo v1.0.1/go.mod h1:P3iMtCzPHsVZfeO/XLHVgrm/fe454OsfnDoUYn/GTjw= +github.com/osamingo/indigo v1.1.0 h1:wRq0ZpnuJ4hXLeMIh4KcH+4IbUnGCUvcfipYIQPP6pg= +github.com/osamingo/indigo v1.1.0/go.mod h1:KnJW/XBDP4wLWMKxEowEyBh0LALfNVSBGOqRqEAm9NM= github.com/osteele/liquid v1.2.4 h1:ydm/FoHn/cStyN7Fpar4L/ClyRKc9rZ+Qzb+S3OMOT4= github.com/osteele/liquid v1.2.4/go.mod h1:jhgMyQFVoV0grH2MKvpMbgxFSBezOoXUbgiwnYrKJ2c= github.com/osteele/tuesday v1.0.3 h1:SrCmo6sWwSgnvs1bivmXLvD7Ko9+aJvvkmDjB5G4FTU= github.com/osteele/tuesday v1.0.3/go.mod h1:pREKpE+L03UFuR+hiznj3q7j3qB1rUZ4XfKejwWFF2M= +github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= +github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= +github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= +github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= +github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= +github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= +github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.12.0 h1:/f3b24xrDhkhddlaobPe2JgBqfdt+gC/NYl0QY9IOuI= +github.com/pkg/sftp v1.12.0/go.mod h1:fUqqXB5vEgVCZ131L+9say31RAri6aF6KDViawhxKK8= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -556,32 +802,47 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= +github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= +github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= +github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= +github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= +github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/pseudomuto/protoc-gen-doc v1.3.2 h1:61vWZuxYa8D7Rn4h+2dgoTNqnluBmJya2MgbqO32z6g= github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= @@ -589,6 +850,7 @@ github.com/pseudomuto/protoc-gen-doc v1.4.1 h1:aNTZq0dy0Pq2ag2v7bhNKFNgBBA8wMCoJ github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= +github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c h1:Q1oRqcTvxE0hjV0Gw4bEcYYLM0ztcuARGVSWEF2tKaI= github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= @@ -596,9 +858,13 @@ github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzu github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f h1:ITrvUKe4041A8IlJkWx+lm2pSj5QzZwpeYNfCnO5u3U= github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= +github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 h1:WCfp+Jq9Mx156zIf9X6Frd6F19rf7wIRlm54UPxUfcU= +github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0/go.mod h1:1QW7hX7RQzOqyGgx8O64bRPQBrFtPflioPPX5gFPV3A= github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -606,8 +872,11 @@ github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= @@ -619,12 +888,15 @@ github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNX github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= @@ -635,22 +907,34 @@ github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIK github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= +github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4 h1:KPf4aWX4JGEdMICunm9A0YTFbD6OL23G14BR7cL/0wg= +github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.3.4 h1:8q6vk3hthlpb2SouZcnBVKboxWQWMDNF38bwholZrJc= +github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= +github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= +github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= @@ -659,8 +943,13 @@ github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= +github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= +github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= +github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -673,10 +962,15 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= @@ -686,16 +980,24 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1 github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= +github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= +github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= @@ -708,13 +1010,20 @@ github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwY github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32 h1:5tjfNdR2ki3yYQ842+eX2sQHeiwpKJ0RnHO4IYOc4V8= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.3.2 h1:YjHC5TgyMmHpicTgEqDN0Q96Xo8K6tLXPnmNOHXCgs0= +github.com/yuin/goldmark v1.3.2/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= @@ -722,15 +1031,23 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= +go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= @@ -744,6 +1061,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -753,9 +1071,13 @@ golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= +golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= @@ -763,9 +1085,15 @@ golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb h1:sZS6jzvbihmmQSPcU1iZSROTVMAjCXPEnd/ZCSyKsjA= +golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6 h1:nfeHNc1nAqecKCy2FCy4HY+soOOe5sDLJ/gZLbx6GYI= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -777,16 +1105,27 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= +golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f h1:aEcjdTsycgPqO/caTgnxfR9xwWOltP/21vtJyFztEy0= +golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -794,6 +1133,7 @@ golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -805,6 +1145,7 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -826,8 +1167,19 @@ golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201026091529-146b70c837a4/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -837,6 +1189,12 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd h1:2arJsLyTCJGek+eeptQ3z49Rqndm0f+zvvpwNIXWNIA= +golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -849,12 +1207,16 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03i golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -868,7 +1230,9 @@ golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -878,6 +1242,7 @@ golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -900,16 +1265,29 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc h1:HVFDs9bKvTxP6bh1Rj9MCSo+UmafQtI8ZWDPVwVk9g4= golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= +golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -921,6 +1299,7 @@ golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -928,6 +1307,8 @@ golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqG golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= +golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -960,6 +1341,8 @@ golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -978,19 +1361,34 @@ golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWc golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d h1:SR+e35rACZFBohNb4Om1ibX6N3iO0FtdbwqGSuD9dBU= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200727233628-55644ead90ce/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200806022845-90696ccdc692 h1:fsn47thVa7Ar/TMyXYlZgOoT7M4+kRpb+KpSAqRQx1w= golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1007,8 +1405,21 @@ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= +google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.33.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.34.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= +google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/api v0.39.0 h1:zHCTXf0NeDdKTgcSQpT+ZflWAqHsEp1GmdpxW09f3YM= +google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= @@ -1016,12 +1427,15 @@ google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1046,14 +1460,24 @@ google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201203001206-6486ece9c497/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 h1:m9+RjTMas6brUP8DBxSAa/WIPFy7FIhKpvk+9Ppce8E= google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea h1:N98SvVh7Hdle2lgUVFuIkf0B3u29CUakMUQa7Hwz8Wc= +google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= @@ -1062,8 +1486,12 @@ google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 h1:M8spwkmx0pHrPq+uMdl22w5CvJ/Y+oAJTIs9oGoCpOE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d h1:vV+xpotnpsR73kzOS8o8hxDlc7Er+H5WZqOBwWcGktk= google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d/go.mod h1:Lh55/1hxmVHEkOvSIQ2uj0P12QyOCUNyRwnUlSS13hw= +google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162 h1:mRuiC6mcne6n331BpxtLkEKil9jN1EziWqMOBjedtSk= +google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -1076,6 +1504,7 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1085,16 +1514,24 @@ gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8X gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/osteele/liquid.v1 v1.2.4 h1:OioNeCaVyWL1jRXzRqQ2vr4ISBbTgtnYsJeVlToLhBw= gopkg.in/osteele/liquid.v1 v1.2.4/go.mod h1:9Bx5f04tf9SVwv3Tcx93dx3WH0EKWmE0Gjd6Dyoc5cs= +gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= @@ -1116,8 +1553,13 @@ gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 h1:OfFoIUYv/me30yv7XlMy4F9RJw8DEm8WQ6QG1Ph4bH0= gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= +gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1131,5 +1573,7 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index 98cf76917..dbbf91ef9 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -37,7 +37,7 @@ import ( "github.com/AliceO2Group/Control/executor/executorcmd" "github.com/AliceO2Group/Control/executor/protos" "github.com/AliceO2Group/Control/occ/peanut/flatten" - "github.com/gdamore/tcell" + "github.com/gdamore/tcell/v2" "github.com/rivo/tview" log "github.com/sirupsen/logrus" "google.golang.org/grpc" From 17d8490f5022884652b86f9a15050a53eb273b1e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Feb 2021 12:05:59 +0100 Subject: [PATCH 0726/2352] [build] Bump to v0.20.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c3eb63587..6ee276254 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From 740abf0b4920c16b0a06b7b687bc916470faeb86 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Feb 2021 17:08:33 +0100 Subject: [PATCH 0727/2352] [core] Prevent crash on empty defaults/vars maps --- common/gera/stringmap.go | 3 +++ core/workflow/rolebase.go | 29 +++++++++++++++++++---------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 5b3aa5055..dc45a1f8e 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -248,6 +248,9 @@ func (w *StringWrapMap) Raw() map[string]string { } func (w *StringWrapMap) Copy() StringMap { + if w == nil { + return nil + } newMap := &StringWrapMap{ theMap: make(map[string]string, len(w.theMap)), parent: w.parent, diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index f29fc0985..64cbae7d0 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -174,9 +174,9 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) // recurse back to this function forever type _roleBase roleBase role := _roleBase{ - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), + Defaults: nil, + Vars: nil, + UserVars: nil, Locals: make(map[string]string), status: SafeStatus{status:task.INACTIVE}, state: SafeState{state:task.STANDBY}, @@ -184,6 +184,15 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } err = unmarshal(&role) if err == nil { + if role.Defaults == nil { + role.Defaults = gera.MakeStringMap() + } + if role.Vars == nil { + role.Vars = gera.MakeStringMap() + } + if role.UserVars == nil { + role.UserVars = gera.MakeStringMap() + } *r = roleBase(role) } return @@ -221,13 +230,13 @@ func (r *roleBase) wrapConnectFields() template.Fields { func (r *roleBase) copy() copyable { rCopy := roleBase{ - Name: r.Name, - parent: r.parent, - Defaults: r.Defaults.Copy().(*gera.StringWrapMap), - Vars: r.Vars.Copy().(*gera.StringWrapMap), - UserVars: r.UserVars.Copy().(*gera.StringWrapMap), - Locals: make(map[string]string), - Connect: make([]channel.Outbound, len(r.Connect)), + Name: r.Name, + parent: r.parent, + Defaults: r.Defaults.Copy().(*gera.StringWrapMap), + Vars: r.Vars.Copy().(*gera.StringWrapMap), + UserVars: r.UserVars.Copy().(*gera.StringWrapMap), + Locals: make(map[string]string), + Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), status: r.status, state: r.state, From cc8b335c1b407546a8b72a02cd0f83ac23f4f99e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Feb 2021 09:36:04 +0100 Subject: [PATCH 0728/2352] [core] Bump DD scheduler Protobuf interface --- core/integration/ddsched/protos/ddsched.pb.go | 73 ++++++++++--------- core/integration/ddsched/protos/ddsched.proto | 8 +- 2 files changed, 45 insertions(+), 36 deletions(-) diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index b6b7237f7..8aad9cd3c 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -32,34 +32,37 @@ const _ = proto.ProtoPackageIsVersion4 type PartitionState int32 const ( - PartitionState___IGNORE PartitionState = 0 + PartitionState_IGNORE__ PartitionState = 0 PartitionState_PARTITION_UNKNOWN PartitionState = 1 // Partition not known to DataDistControl. Initialize by calling PartitionInitialize() PartitionState_PARTITION_ERROR PartitionState = 2 PartitionState_PARTITION_REQUEST_INVALID PartitionState = 3 // Provided configuration does not meet requirements or the request is not accepted at the current state. PartitionState_PARTITION_CONFIGURING PartitionState = 4 // Configuration accepted, waiting on FLP and EPN DD components to respond and connect. PartitionState_PARTITION_CONFIGURED PartitionState = 5 // All components configured, ready for dataflow commands - PartitionState_PARTITION_TERMINATING PartitionState = 6 // Partition is terminating. EPN-FLP connections are cleanly terminated. + PartitionState_PARTITION_TERMINATING PartitionState = 6 // Partition is terminating. EPN-FLP connections will be cleanly closed. + PartitionState_PARTITION_TERMINATED PartitionState = 7 // Partition is terminated. TfScheduler does not accept further requests ) // Enum value maps for PartitionState. var ( PartitionState_name = map[int32]string{ - 0: "__IGNORE", + 0: "IGNORE__", 1: "PARTITION_UNKNOWN", 2: "PARTITION_ERROR", 3: "PARTITION_REQUEST_INVALID", 4: "PARTITION_CONFIGURING", 5: "PARTITION_CONFIGURED", 6: "PARTITION_TERMINATING", + 7: "PARTITION_TERMINATED", } PartitionState_value = map[string]int32{ - "__IGNORE": 0, + "IGNORE__": 0, "PARTITION_UNKNOWN": 1, "PARTITION_ERROR": 2, "PARTITION_REQUEST_INVALID": 3, "PARTITION_CONFIGURING": 4, "PARTITION_CONFIGURED": 5, "PARTITION_TERMINATING": 6, + "PARTITION_TERMINATED": 7, } ) @@ -191,7 +194,7 @@ func (x *PartitionResponse) GetPartitionState() PartitionState { if x != nil { return x.PartitionState } - return PartitionState___IGNORE + return PartitionState_IGNORE__ } func (x *PartitionResponse) GetInfoMessage() string { @@ -375,9 +378,9 @@ var file_protos_ddsched_proto_rawDesc = []byte{ 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0xb9, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x5f, 0x5f, 0x49, - 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x41, 0x52, 0x54, 0x49, + 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0xd3, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x47, 0x4e, + 0x4f, 0x52, 0x45, 0x5f, 0x5f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, @@ -387,32 +390,34 @@ var file_protos_ddsched_proto_rawDesc = []byte{ 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x32, 0x81, 0x03, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x7a, - 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, - 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x12, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x07, 0x32, 0x81, 0x03, 0x0a, + 0x17, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x7a, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, + 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, + 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, + 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x6f, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, + 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto index bc0e0b1d9..f5d82dc04 100644 --- a/core/integration/ddsched/protos/ddsched.proto +++ b/core/integration/ddsched/protos/ddsched.proto @@ -25,7 +25,8 @@ message PartitionInfo { } enum PartitionState { - __IGNORE = 0; + IGNORE__ = 0; + PARTITION_UNKNOWN = 1; // Partition not known to DataDistControl. Initialize by calling PartitionInitialize() @@ -43,7 +44,10 @@ enum PartitionState { // All components configured, ready for dataflow commands PARTITION_TERMINATING = 6; - // Partition is terminating. EPN-FLP connections are cleanly terminated. + // Partition is terminating. EPN-FLP connections will be cleanly closed. + + PARTITION_TERMINATED = 7; + // Partition is terminated. TfScheduler does not accept further requests } From ea713d85e17524de3b7e0377086de52686da2d73 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Feb 2021 10:10:14 +0100 Subject: [PATCH 0729/2352] [build] Bump to v0.20.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6ee276254..c86e16063 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 3 +VERSION_PATCH := 4 From b0f15482b605c0dd28c46069486b2f6e464639a9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Feb 2021 12:45:09 +0100 Subject: [PATCH 0730/2352] [executor] Ensure DESTROY hooks can always terminate safely --- executor/executable/basictaskcommon.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 4504b71b4..4a35bac9b 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -104,7 +104,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { }() go func() { - err = t.taskCmd.Wait() + taskCmd := t.taskCmd + err = taskCmd.Wait() // ^ when this unblocks, the task is done pendingState := mesos.TASK_FINISHED @@ -118,9 +119,13 @@ func (t *basicTaskBase) startBasicTask() (err error) { pendingState = mesos.TASK_FAILED } - // Can be -1 if the process was killed - exitCode := t.taskCmd.ProcessState.ExitCode() - processTerminatedOnItsOwn := true + exitCode := -1 + processTerminatedOnItsOwn := false + if taskCmd != nil && taskCmd.ProcessState != nil { + // Can be -1 if the process was killed + exitCode = taskCmd.ProcessState.ExitCode() + processTerminatedOnItsOwn = true + } select { case pending := <- t.pendingFinalTaskStateCh: From 86821c270dde531676e4b1ed43f3bff5065ec2b6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Feb 2021 12:45:50 +0100 Subject: [PATCH 0731/2352] [build] Bump to v0.20.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c86e16063..905c7d6c8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 4 +VERSION_PATCH := 5 From 1d1b6ccb169f763784454d32791c8e34d0659d44 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 15 Feb 2021 20:45:47 +0100 Subject: [PATCH 0732/2352] [core] Fix kill tasks deadline --- core/task/manager.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index bcc62ea03..929a5c60b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -727,22 +727,26 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err }) })) + // Remove from the roster the tasks we are going to kill + // if we couldn't kill a task add it back to the roster + m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { + return !tasks.Contains(func(t *Task) bool { + return task.status == ACTIVE + }) + })) + for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { e := m.doKillTask(task) if e != nil { log.WithError(e).WithField("taskId", task.taskId).Error("could not kill task") err = errors.New("could not kill some tasks") + // task should be added back to the roster + m.roster.append(task) } else { killed = append(killed, task) } } - // Remove from the roster the tasks we've just killed - m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { - return !killed.Contains(func(t *Task) bool { - return t.taskId == task.taskId - }) - })) running = m.roster.getTasks() return From 030958a4393636cbf924619aa95b1086f87b58bd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 16 Feb 2021 09:10:05 +0100 Subject: [PATCH 0733/2352] [build] Bump to v0.20.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 905c7d6c8..c4271bfe6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 5 +VERSION_PATCH := 6 From c320e03164ec26ffb1783088cb0058f702619770 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Feb 2021 12:10:37 +0100 Subject: [PATCH 0734/2352] [coconut] Set maximum incoming gRPC payload size to 10MB --- coconut/client.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coconut/client.go b/coconut/client.go index a61d446f0..62ffc5f44 100644 --- a/coconut/client.go +++ b/coconut/client.go @@ -35,12 +35,17 @@ import ( var log = logger.New(logrus.StandardLogger(), "coconut") +const GrpcMaxCallRecvSize = 10*1024*1024 type internalState struct { - } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure()) + conn, err := grpc.DialContext( + cxt, + endpoint, + grpc.WithInsecure(), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(GrpcMaxCallRecvSize)), + ) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). From f0503ed9e1608a8d22fa11cb0ef52149eac9c47d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Feb 2021 12:37:43 +0100 Subject: [PATCH 0735/2352] [core] Log when DD scheduler connected --- core/integration/ddsched/client.go | 1 + core/integration/ddsched/plugin.go | 1 + 2 files changed, 2 insertions(+) diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 39f910baf..4b039d221 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -54,6 +54,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } + log.Debug("DD scheduler client connected") client := &RpcClient { DataDistributionControlClient: ddpb.NewDataDistributionControlClient(conn), diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index a9eb16f3e..9a034a96e 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -87,6 +87,7 @@ func (p *Plugin) Init(_ string) error { if p.ddSchedClient == nil { return fmt.Errorf("failed to connect to DD scheduler service on %s", viper.GetString("ddSchedulerEndpoint")) } + log.Debug("DD scheduler plugin ready") } return nil } From 97b7e92727691dee85fb60a456043eba9022cde9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Feb 2021 14:24:48 +0100 Subject: [PATCH 0736/2352] [executor] Never use any proxy when connecting to Mesos master --- executor/executor.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/executor/executor.go b/executor/executor.go index 8e680b5ef..d4c6b5c4b 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -34,6 +34,7 @@ import ( "context" "errors" "io" + "net/http" "net/url" "sync" "syscall" @@ -93,7 +94,14 @@ func Run(cfg config.Config) { http = httpcli.New( httpcli.Endpoint(apiURL.String()), httpcli.Codec(codecs.ByMediaType[codecs.MediaTypeProtobuf]), - httpcli.Do(httpcli.With(httpcli.Timeout(httpTimeout))), + httpcli.Do(httpcli.With( + httpcli.Timeout(httpTimeout), + httpcli.Transport(func(transport *http.Transport) { + transport.Proxy = func(request *http.Request) (*url.URL, error) { + return nil, nil + } + }), + )), ) // Fill in the Framework and Executor IDs as call parameters From 4060f0e818673d2b670e824c541d871123fd0db6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Feb 2021 14:26:02 +0100 Subject: [PATCH 0737/2352] [core] Disable system proxy by default for Mesos, DCS, DDscheduler --- core/config.go | 6 ++++++ core/integration/dcs/client.go | 14 +++++++++++++- core/integration/ddsched/client.go | 14 +++++++++++++- core/task/schedutil/mesosutil.go | 16 ++++++++++++---- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/core/config.go b/core/config.go index eaf84300d..f9b360551 100644 --- a/core/config.go +++ b/core/config.go @@ -67,6 +67,7 @@ func setDefaults() error { viper.SetDefault("mesosAuthMode", env("AUTH_MODE", "")) viper.SetDefault("mesosCheckpoint", true) viper.SetDefault("mesosCompression", false) + viper.SetDefault("mesosUseSystemProxy", false) viper.SetDefault("mesosCredentials.username", env("AUTH_USER", "")) viper.SetDefault("mesosCredentials.passwordFile", env("AUTH_PASSWORD_FILE", "")) viper.SetDefault("mesosExecutorImage", env("EXEC_IMAGE", "")) @@ -95,7 +96,9 @@ func setDefaults() error { viper.SetDefault("dumpWorkflows", false) viper.SetDefault("configServiceUri", "apricot://127.0.0.1:47101") viper.SetDefault("dcsServiceEndpoint", "127.0.0.1:50051") + viper.SetDefault("dcsServiceUseSystemProxy", false) viper.SetDefault("ddSchedulerEndpoint", "127.0.0.1:50052") + viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") @@ -115,6 +118,7 @@ func setFlags() error { pflag.String("mesosAuthMode", viper.GetString("mesosAuthMode"), "Method to use for Mesos authentication; specify '"+schedutil.AuthModeBasic+"' for simple HTTP authentication") pflag.Bool("mesosCheckpoint", viper.GetBool("mesosCheckpoint"), "Enable/disable agent checkpointing for framework tasks (recover from agent failure)") pflag.Bool("mesosCompression", viper.GetBool("mesosCompression"), "When true attempt to use compression for HTTP streams") + pflag.Bool("mesosUseSystemProxy", viper.GetBool("mesosUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("mesosExecutorImage", viper.GetString("mesosExecutorImage"), "Name of the docker image to run the executor") pflag.Duration("mesosFailoverTimeout", viper.GetDuration("mesosFailoverTimeout"), "Framework failover timeout (recover from scheduler failure)") pflag.String("mesosFrameworkHostname", viper.GetString("mesosFrameworkHostname"), "Framework hostname that is advertised to the master") @@ -140,7 +144,9 @@ func setFlags() error { pflag.Bool("dumpWorkflows", viper.GetBool("dumpWorkflows"), "Dump unprocessed and processed workflow files (`$PWD/wf-{,un}processed-.json`)") pflag.String("configServiceUri", viper.GetString("configServiceUri"), "URI of the Apricot instance (`apricot://host:port`), Consul server (`consul://`) or YAML configuration file, entry point for all configuration") pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") + pflag.Bool("dcsServiceUseSystemProxy", viper.GetBool("dcsServiceUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") + pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 92f4a6161..727bb89c0 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/sirupsen/logrus" + "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) @@ -46,7 +47,18 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) log.WithFields(logrus.Fields{ "endpoint": endpoint, }).Debug("dialing DCS client") - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + + dialOptions := []grpc.DialOption { + grpc.WithInsecure(), + grpc.WithBlock(), + } + if !viper.GetBool("dcsServiceUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 4b039d221..ae9ae7780 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/sirupsen/logrus" + "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) @@ -46,7 +47,18 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) log.WithFields(logrus.Fields{ "endpoint": endpoint, }).Debug("dialing DD scheduler client") - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + + dialOptions := []grpc.DialOption { + grpc.WithInsecure(), + grpc.WithBlock(), + } + if !viper.GetBool("ddSchedulerUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). diff --git a/core/task/schedutil/mesosutil.go b/core/task/schedutil/mesosutil.go index 1124f8300..56913067e 100644 --- a/core/task/schedutil/mesosutil.go +++ b/core/task/schedutil/mesosutil.go @@ -30,20 +30,21 @@ package schedutil import ( "errors" "fmt" + "net/http" + "net/url" "path/filepath" "time" "github.com/AliceO2Group/Control/common/logger" - "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" - "github.com/AliceO2Group/Control/common/product" "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" "github.com/mesos/mesos-go/api/v1/lib/httpcli" "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpsched" "github.com/mesos/mesos-go/api/v1/lib/resources" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" proto "google.golang.org/protobuf/proto" ) @@ -133,6 +134,13 @@ func BuildHTTPSched(creds credentials) calls.Caller { httpcli.Do(httpcli.With( authConfigOpt, httpcli.Timeout(viper.GetDuration("mesosApiTimeout")), + httpcli.Transport(func(transport *http.Transport) { + if !viper.GetBool("mesosUseSystemProxy") { + transport.Proxy = func(request *http.Request) (*url.URL, error) { + return nil, nil + } + } + }), )), ) if viper.GetBool("mesosCompression") { From 55569c69848b4df468db894adcd2db509ff30650 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Feb 2021 14:41:30 +0100 Subject: [PATCH 0738/2352] [build] Bump to v0.20.7 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c4271bfe6..30584a87c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 6 +VERSION_PATCH := 7 From 14b92a6b27c4b49559bc34fd66080c607b40101e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 19 Feb 2021 15:04:12 +0100 Subject: [PATCH 0739/2352] [common] Add ALICE Run 3 System ID mapping --- common/systemid/detector.go | 62 +++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 common/systemid/detector.go diff --git a/common/systemid/detector.go b/common/systemid/detector.go new file mode 100644 index 000000000..4fc8a80bb --- /dev/null +++ b/common/systemid/detector.go @@ -0,0 +1,62 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +package systemid + +// Source: https://alice-notes.web.cern.ch/system/files/notes/public/1052/2020-07-15-2020-07-07-O2_Report_Identification_of_sources_for_ALICE_data.pdf +// System ID mapping on page 3 + + +// FIXME: use stringer/enumer on this one +const ( + + // 1 + // 2 + TPC = 3 + TRD = 4 + TOF = 5 + HMP = 6 + PHS = 7 + CPV = 8 + // 9 + MCH = 10 + // 11-14 + ZDC = 15 + // 16 + TRG = 17 + EMC = 18 + TST = 19 + // 20-31 + ITS = 32 + FDD = 33 + FT0 = 34 + FV0 = 35 + MFT = 36 + MID = 37 + DCS = 38 + FOC = 39 + + NIL = 255 +) From 8c4d5c9f0a6ad450a403a10ae7a524ff5a14428c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 19 Feb 2021 15:18:03 +0100 Subject: [PATCH 0740/2352] [common] Add some non-standard system IDs for convenience --- common/systemid/{detector.go => systemid.go} | 8 ++++++++ 1 file changed, 8 insertions(+) rename common/systemid/{detector.go => systemid.go} (92%) diff --git a/common/systemid/detector.go b/common/systemid/systemid.go similarity index 92% rename from common/systemid/detector.go rename to common/systemid/systemid.go index 4fc8a80bb..dcf9d8c4d 100644 --- a/common/systemid/detector.go +++ b/common/systemid/systemid.go @@ -58,5 +58,13 @@ const ( DCS = 38 FOC = 39 + FIT = 254 // non-standard mapping: FT0 + FV0 = FIT NIL = 255 ) + +// Additional non-standard system IDs +const ( + FLP = -1 + EPN = -2 + PDP = -3 +) \ No newline at end of file From d40f5b7aa9f3711efc9c2a931cfda6ab2668e86c Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 19 Feb 2021 13:34:01 +0100 Subject: [PATCH 0741/2352] [core] Transition configure should return immediately after failing the workflow deployment --- core/environment/transition_configure.go | 27 +++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index f3dddc758..a4739f0ec 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "fmt" "time" "github.com/AliceO2Group/Control/common/event" @@ -137,11 +138,16 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return*/ - notify := make(chan task.Status) + notifyStatus := make(chan task.Status) subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStatusChange(subscriptionId, notify) + env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) defer env.wfAdapter.UnsubscribeFromStatusChange(subscriptionId) + // listen to workflow State changes + notifyState := make(chan task.State) + env.wfAdapter.SubscribeToStateChange(subscriptionId, notifyState) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + taskDescriptors := wf.GenerateTaskDescriptors() if len(taskDescriptors) != 0 { // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) @@ -173,7 +179,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { for { log.Debug("waiting for workflow to become active") select { - case wfStatus = <-notify: + case wfStatus = <-notifyStatus: log.WithField("status", wfStatus.String()). Debug("workflow status change") if wfStatus == task.ACTIVE { @@ -181,14 +187,25 @@ func (t ConfigureTransition) do(env *Environment) (err error) { } continue case <-time.After(deploymentTimeout): - err = errors.New("workflow deployment timed out") + err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s",deploymentTimeout.String())) break WORKFLOW_ACTIVE_LOOP + // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, + // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster + // in the CreateEnvironment (environment/manager.go) and the lock in the `envman` is reserved for a sorter period, which allows operations like + // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. + case wfState := <-notifyState: + if wfState == task.ERROR { + log.WithField("state", wfState.String()). + Debug("workflow state change") + err = errors.New("workflow deployment failed") + break WORKFLOW_ACTIVE_LOOP + } } } } if err != nil { - log.WithFields(logrus.Fields{"error": err.Error(), "timeout": deploymentTimeout.String()}). + log.WithFields(logrus.Fields{"error": err.Error()}). Error("workflow deployment error") return } From 8b9c8cb57e3b09cc68a4183d71bee4afec915825 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Feb 2021 11:06:41 +0100 Subject: [PATCH 0742/2352] [core] Log which role failed during deployment --- core/environment/transition_configure.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index a4739f0ec..2301836f3 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -195,6 +195,12 @@ func (t ConfigureTransition) do(env *Environment) (err error) { // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. case wfState := <-notifyState: if wfState == task.ERROR { + workflow.LeafWalk(wf, func(role workflow.Role) { + if st := role.GetState(); st == task.ERROR { + log.WithField("state", st). + Error(fmt.Sprintf("%s role failed", role.GetName())) + } + }) log.WithField("state", wfState.String()). Debug("workflow state change") err = errors.New("workflow deployment failed") From f8977f0b13c0858108d979922f7723ee133af6c7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Feb 2021 15:21:45 +0100 Subject: [PATCH 0743/2352] [core] Improve output on deployment failure --- core/environment/transition_configure.go | 6 ++++-- core/workflow/iteratorrole.go | 11 +++++++++++ core/workflow/role.go | 1 + 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 2301836f3..149b430f6 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -198,12 +198,14 @@ func (t ConfigureTransition) do(env *Environment) (err error) { workflow.LeafWalk(wf, func(role workflow.Role) { if st := role.GetState(); st == task.ERROR { log.WithField("state", st). - Error(fmt.Sprintf("%s role failed", role.GetName())) + WithField("role", role.GetPath()). + WithField("environment", role.GetEnvironmentId().String()). + Error("environment reached invalid state") } }) log.WithField("state", wfState.String()). Debug("workflow state change") - err = errors.New("workflow deployment failed") + err = errors.New("workflow deployment failed, aborting and cleaning up") break WORKFLOW_ACTIVE_LOOP } } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 178e23b8e..7775087f0 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -28,6 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -327,3 +328,13 @@ func (i *iteratorRole) GetCurrentRunNumber() uint32 { } return i.GetParent().GetCurrentRunNumber() } + +func (i *iteratorRole) GetEnvironmentId() uid.ID { + if i == nil { + return uid.NilID() + } + if i.GetParent() == nil { + return uid.NilID() + } + return i.GetParent().GetEnvironmentId() +} diff --git a/core/workflow/role.go b/core/workflow/role.go index 4bfa93e3b..2eda8a118 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -63,6 +63,7 @@ type Role interface { IsEnabled() bool GetCurrentRunNumber() uint32 ConsolidatedVarStack() (varStack map[string]string, err error) + GetEnvironmentId() uid.ID } type PublicUpdatable interface { From 206f8b16634db51396090316992664a4f30fd29a Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Feb 2021 19:23:36 +0100 Subject: [PATCH 0744/2352] [core] Expose number of FLPs per environment --- core/environment/environment.go | 18 ++++++++++++++++++ core/server.go | 1 + 2 files changed, 19 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index e2dd97f7e..c870b698c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -460,3 +460,21 @@ func (env *Environment) closeStream() { } env.Mu.Unlock() } + +func (env *Environment) GetFLPs() []string { + if env == nil { + return nil + } + env.Mu.RLock() + defer env.Mu.RUnlock() + varStack, _ := gera.FlattenStack( + env.GlobalDefaults, + env.GlobalVars, + env.UserVars, + ) + stringFLPs := varStack["hosts"] + stringFLPs = strings.TrimPrefix(stringFLPs, "[") + stringFLPs = strings.TrimSuffix(stringFLPs, "]") + stringFLPs = strings.Replace(stringFLPs,`"`,"",-1) + return strings.Split(stringFLPs,",") +} \ No newline at end of file diff --git a/core/server.go b/core/server.go index e6ddbf3d2..f0cdc58ca 100644 --- a/core/server.go +++ b/core/server.go @@ -241,6 +241,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), UserVars: env.UserVars.Raw(), + NumberOfFlps: int32(len(env.GetFLPs())), }, Workflow: workflowToRoleTree(env.Workflow()), } From 6f546c06dea8cbd2d073ff29b8dd28d94e767bc6 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Feb 2021 19:25:01 +0100 Subject: [PATCH 0745/2352] [coconut] Print number of FLPs for environment --- coconut/control/control.go | 1 + coconut/control/controlutil.go | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index c9043c68f..326643f47 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -354,6 +354,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) + _, _ = fmt.Fprintf(o, "number of FLPs: %s\n", formatNumber(env.GetNumberOfFlps())) if len(defaultsStr) != 0 { _, _ = fmt.Fprintf(o, "global defaults:\n%s\n", defaultsStr) } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index 4ecb76b2b..11a5ce7c4 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -152,3 +152,13 @@ func formatTimestamp(rfc3339timestamp string) string { } return formatted } + +func formatNumber(numberOfMachines int32) string { + nMString := strconv.FormatInt(int64(numberOfMachines), 10) + if numberOfMachines == 0 { + nMString = grey("none") + } else { + nMString = green(nMString) + } + return nMString +} From 3a278ebd17b9df81c3ac7f85b0460094d3efe749 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Feb 2021 19:27:36 +0100 Subject: [PATCH 0746/2352] Expose number of FLPs on GRPC --- core/protos/o2control.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 2a568c936..2b6037bce 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -174,6 +174,7 @@ message EnvironmentInfo { map defaults = 7; map vars = 8; map userVars = 9; + int32 numberOfFlps = 10; } message NewEnvironmentRequest { From 6d679cdcec96ebb5fc112ffd2f9c0a8474d52d06 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 23 Feb 2021 19:28:20 +0100 Subject: [PATCH 0747/2352] Generate proto code --- apricot/protos/apricot.pb.go | 2 +- apricot/protos/apricot_grpc.pb.go | 8 +- coconut/protos/o2control.pb.go | 978 +++++++++--------- coconut/protos/o2control_grpc.pb.go | 12 +- core/integration/dcs/protos/dcs.pb.go | 2 +- core/integration/dcs/protos/dcs_grpc.pb.go | 10 +- core/integration/ddsched/protos/ddsched.pb.go | 2 +- .../ddsched/protos/ddsched_grpc.pb.go | 8 +- core/protos/o2control.pb.go | 978 +++++++++--------- core/protos/o2control_grpc.pb.go | 12 +- executor/protos/occ.pb.go | 2 +- executor/protos/occ_grpc.pb.go | 12 +- odcshim/odcprotos/odc.pb.go | 2 +- odcshim/odcprotos/odc_grpc.pb.go | 8 +- odcshim/protos/occ.pb.go | 2 +- odcshim/protos/occ_grpc.pb.go | 12 +- 16 files changed, 1051 insertions(+), 999 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 7474e11f0..5b64572b2 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 982ef896b..cd4641ba8 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -200,7 +201,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&_Apricot_serviceDesc, srv) + s.RegisterService(&Apricot_ServiceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -401,7 +402,10 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -var _Apricot_serviceDesc = grpc.ServiceDesc{ +// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Apricot_ServiceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index aa59fba99..3991a551c 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -1220,6 +1220,7 @@ type EnvironmentInfo struct { Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1317,6 +1318,13 @@ func (x *EnvironmentInfo) GetUserVars() map[string]string { return nil } +func (x *EnvironmentInfo) GetNumberOfFlps() int32 { + if x != nil { + return x.NumberOfFlps + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4176,7 +4184,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xca, 0x04, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, @@ -4202,505 +4210,507 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, - 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, - 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, - 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, + 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, + 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, - 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, - 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, - 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, - 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, - 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index a87d3d87d..5af8aad73 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -416,7 +417,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -839,7 +840,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 9e833eae2..b2cf9709e 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index ef6b29779..0f22986e2 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -32,7 +33,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -125,7 +126,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&_Configurator_serviceDesc, srv) + s.RegisterService(&Configurator_ServiceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -203,7 +204,10 @@ func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -var _Configurator_serviceDesc = grpc.ServiceDesc{ +// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Configurator_ServiceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 8aad9cd3c..4fc17dd59 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index bcf8b89a7..0e2419bfb 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -90,7 +91,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&_DataDistributionControl_serviceDesc, srv) + s.RegisterService(&DataDistributionControl_ServiceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -147,7 +148,10 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ +// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index aa59fba99..3991a551c 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -1220,6 +1220,7 @@ type EnvironmentInfo struct { Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1317,6 +1318,13 @@ func (x *EnvironmentInfo) GetUserVars() map[string]string { return nil } +func (x *EnvironmentInfo) GetNumberOfFlps() int32 { + if x != nil { + return x.NumberOfFlps + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4176,7 +4184,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xca, 0x04, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, @@ -4202,505 +4210,507 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, - 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, - 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, - 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, + 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, + 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, - 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, - 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, - 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, - 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, - 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 81fdcbe63..903ec7d16 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -414,7 +415,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -837,7 +838,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index fe7ada7fc..6bced591c 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/occ.proto package pb diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 66a3c8901..eafb7734d 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -154,7 +155,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -235,7 +236,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 24b7d5eb4..3c33ebdae 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: odcprotos/odc.proto package odc diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index b5f1e0452..7a2602472 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -264,7 +265,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -501,7 +502,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index fe7ada7fc..6bced591c 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.14.0 // source: protos/occ.proto package pb diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index 09d8d584b..cd6c2d3a2 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -152,7 +153,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -233,7 +234,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From 7df6ab42273090a09ba0790b5dd09b54f6332a4c Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 26 Feb 2021 17:41:39 +0100 Subject: [PATCH 0748/2352] [core] Cleanup leftover code --- core/globalstate.go | 1 - core/task/manager.go | 1 - 2 files changed, 2 deletions(-) diff --git a/core/globalstate.go b/core/globalstate.go index 49499870d..61a6c0b61 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -52,7 +52,6 @@ func newGlobalState(shutdown func()) (*globalState, error) { environments: nil, } - publicEventCh := make(chan *pb.Event) internalEventCh := make(chan event.Event) taskman, err := task.NewManager(shutdown, internalEventCh) if err != nil { diff --git a/core/task/manager.go b/core/task/manager.go index be7f396e0..ba1ff376a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -36,7 +36,6 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" From f689bae017cb5aa89f53970d3f7f3b0a25e59aee Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 26 Feb 2021 17:42:23 +0100 Subject: [PATCH 0749/2352] Generate proto files and go.sum --- coconut/protos/o2control.pb.go | 22353 ++++++------------------------- core/protos/o2control.pb.go | 22353 ++++++------------------------- go.sum | 1 + 3 files changed, 8775 insertions(+), 35932 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 3194363ff..3991a551c 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1,30 +1,52 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.14.0 // source: protos/o2control.proto package pb import ( - context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StatusUpdate_Level int32 @@ -35,26 +57,47 @@ const ( StatusUpdate_ERROR StatusUpdate_Level = 3 ) -var StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", -} +// Enum value maps for StatusUpdate_Level. +var ( + StatusUpdate_Level_name = map[int32]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + } + StatusUpdate_Level_value = map[string]int32{ + "DEBUG": 0, + "INFO": 1, + "WARNING": 2, + "ERROR": 3, + } +) -var StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, +func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { + p := new(StatusUpdate_Level) + *p = x + return p } func (x StatusUpdate_Level) String() string { - return proto.EnumName(StatusUpdate_Level_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[0].Descriptor() +} + +func (StatusUpdate_Level) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[0] } +func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -68,30 +111,51 @@ const ( ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 ) -var ControlEnvironmentRequest_Optype_name = map[int32]string{ - 0: "NOOP", - 1: "START_ACTIVITY", - 2: "STOP_ACTIVITY", - 3: "CONFIGURE", - 4: "RESET", - 5: "GO_ERROR", -} +// Enum value maps for ControlEnvironmentRequest_Optype. +var ( + ControlEnvironmentRequest_Optype_name = map[int32]string{ + 0: "NOOP", + 1: "START_ACTIVITY", + 2: "STOP_ACTIVITY", + 3: "CONFIGURE", + 4: "RESET", + 5: "GO_ERROR", + } + ControlEnvironmentRequest_Optype_value = map[string]int32{ + "NOOP": 0, + "START_ACTIVITY": 1, + "STOP_ACTIVITY": 2, + "CONFIGURE": 3, + "RESET": 4, + "GO_ERROR": 5, + } +) -var ControlEnvironmentRequest_Optype_value = map[string]int32{ - "NOOP": 0, - "START_ACTIVITY": 1, - "STOP_ACTIVITY": 2, - "CONFIGURE": 3, - "RESET": 4, - "GO_ERROR": 5, +func (x ControlEnvironmentRequest_Optype) Enum() *ControlEnvironmentRequest_Optype { + p := new(ControlEnvironmentRequest_Optype) + *p = x + return p } func (x ControlEnvironmentRequest_Optype) String() string { - return proto.EnumName(ControlEnvironmentRequest_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() } +func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] +} + +func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -102,298 +166,318 @@ const ( EnvironmentOperation_ADD_ROLE EnvironmentOperation_Optype = 4 ) -var EnvironmentOperation_Optype_name = map[int32]string{ - 0: "NOOP", - 3: "REMOVE_ROLE", - 4: "ADD_ROLE", -} +// Enum value maps for EnvironmentOperation_Optype. +var ( + EnvironmentOperation_Optype_name = map[int32]string{ + 0: "NOOP", + 3: "REMOVE_ROLE", + 4: "ADD_ROLE", + } + EnvironmentOperation_Optype_value = map[string]int32{ + "NOOP": 0, + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, + } +) -var EnvironmentOperation_Optype_value = map[string]int32{ - "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } func (x EnvironmentOperation_Optype) String() string { - return proto.EnumName(EnvironmentOperation_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() +} + +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] +} + +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } type Event_MesosHeartbeat struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *Event_MesosHeartbeat) Reset() { *m = Event_MesosHeartbeat{} } -func (m *Event_MesosHeartbeat) String() string { return proto.CompactTextString(m) } -func (*Event_MesosHeartbeat) ProtoMessage() {} -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{0} -} -func (m *Event_MesosHeartbeat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event_MesosHeartbeat) Reset() { + *x = Event_MesosHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event_MesosHeartbeat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event_MesosHeartbeat.Merge(m, src) -} -func (m *Event_MesosHeartbeat) XXX_Size() int { - return m.Size() -} -func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { - xxx_messageInfo_Event_MesosHeartbeat.DiscardUnknown(m) + +func (x *Event_MesosHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo +func (*Event_MesosHeartbeat) ProtoMessage() {} -type Ev_EnvironmentEvent struct { - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } -func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{1} -} -func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. +func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) + +type Ev_EnvironmentEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` } -func (m *Ev_EnvironmentEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_EnvironmentEvent) Reset() { + *x = Ev_EnvironmentEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) + +func (x *Ev_EnvironmentEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo +func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { - if m != nil { - return m.EnvironmentId +func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{1} +} + +func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId } return "" } -func (m *Ev_EnvironmentEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_EnvironmentEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } -func (m *Ev_EnvironmentEvent) GetError() string { - if m != nil { - return m.Error +func (x *Ev_EnvironmentEvent) GetError() string { + if x != nil { + return x.Error } return "" } -func (m *Ev_EnvironmentEvent) GetMessage() string { - if m != nil { - return m.Message +func (x *Ev_EnvironmentEvent) GetMessage() string { + if x != nil { + return x.Message } return "" } type Ev_TaskEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } -func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskEvent) ProtoMessage() {} -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` } -func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskEvent.Merge(m, src) + +func (x *Ev_TaskEvent) Reset() { + *x = Ev_TaskEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_TaskEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_TaskEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Ev_TaskEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) + +func (*Ev_TaskEvent) ProtoMessage() {} + +func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} +} -func (m *Ev_TaskEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskEvent) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *Ev_TaskEvent) GetTaskid() string { - if m != nil { - return m.Taskid +func (x *Ev_TaskEvent) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_TaskEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_TaskEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_TaskEvent) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *Ev_TaskEvent) GetHostname() string { - if m != nil { - return m.Hostname +func (x *Ev_TaskEvent) GetHostname() string { + if x != nil { + return x.Hostname } return "" } -func (m *Ev_TaskEvent) GetClassName() string { - if m != nil { - return m.ClassName +func (x *Ev_TaskEvent) GetClassName() string { + if x != nil { + return x.ClassName } return "" } type Ev_RoleEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } -func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_RoleEvent) ProtoMessage() {} -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} -} -func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` } -func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_RoleEvent.Merge(m, src) + +func (x *Ev_RoleEvent) Reset() { + *x = Ev_RoleEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_RoleEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_RoleEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Ev_RoleEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) + +func (*Ev_RoleEvent) ProtoMessage() {} + +func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo +// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} +} -func (m *Ev_RoleEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_RoleEvent) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *Ev_RoleEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_RoleEvent) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *Ev_RoleEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_RoleEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_RoleEvent) GetRolePath() string { - if m != nil { - return m.RolePath +func (x *Ev_RoleEvent) GetRolePath() string { + if x != nil { + return x.RolePath } return "" } @@ -402,153 +486,147 @@ func (m *Ev_RoleEvent) GetRolePath() string { // Global status //////////////////////////////////////// type StatusRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) -} -func (m *StatusRequest) XXX_Size() int { - return m.Size() + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{4} +} type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} -} -func (m *StatusReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) -} -func (m *StatusReply) XXX_Size() int { - return m.Size() + +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) + +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{5} +} -func (m *StatusReply) GetState() string { - if m != nil { - return m.State +func (x *StatusReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { - if m != nil { - return m.StatusUpdates +func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { + if x != nil { + return x.StatusUpdates } return nil } type StatusUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: + // Types that are assignable to Event: // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Event isStatusUpdate_Event `protobuf_oneof:"Event"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusUpdate) Reset() { + *x = StatusUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) -} -func (m *StatusUpdate) XXX_Size() int { - return m.Size() -} -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) + +func (x *StatusUpdate) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo +func (*StatusUpdate) ProtoMessage() {} -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int +func (x *StatusUpdate) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +func (x *StatusUpdate) GetLevel() StatusUpdate_Level { + if x != nil { + return x.Level + } + return StatusUpdate_DEBUG +} func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { @@ -557,91 +635,74 @@ func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { return nil } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { - if m != nil { - return m.Level - } - return StatusUpdate_DEBUG -} - -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { +func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { return x.MesosHeartbeat } return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), - } +type isStatusUpdate_Event interface { + isStatusUpdate_Event() +} + +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto } +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} + type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are valid to be assigned to Payload: + // Types that are assignable to Payload: // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Payload isEvent_Payload `protobuf_oneof:"Payload"` } -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Event) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) -} -func (m *Event) XXX_Size() int { - return m.Size() -} -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) + +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event proto.InternalMessageInfo +func (*Event) ProtoMessage() {} -type isEvent_Payload interface { - isEvent_Payload() - MarshalTo([]byte) (int, error) - Size() int +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` -} -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` -} -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } -func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_RoleEvent) isEvent_Payload() {} +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -650,86 +711,92 @@ func (m *Event) GetPayload() isEvent_Payload { return nil } -func (m *Event) GetTimestamp() string { - if m != nil { - return m.Timestamp - } - return "" -} - -func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { +func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { return x.EnvironmentEvent } return nil } -func (m *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := m.GetPayload().(*Event_TaskEvent); ok { +func (x *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := x.GetPayload().(*Event_TaskEvent); ok { return x.TaskEvent } return nil } -func (m *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := m.GetPayload().(*Event_RoleEvent); ok { +func (x *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := x.GetPayload().(*Event_RoleEvent); ok { return x.RoleEvent } return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Event) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), - } +type isEvent_Payload interface { + isEvent_Payload() +} + +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` +} + +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` +} + +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` } +func (*Event_EnvironmentEvent) isEvent_Payload() {} + +func (*Event_TaskEvent) isEvent_Payload() {} + +func (*Event_RoleEvent) isEvent_Payload() {} + type SubscribeRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } -func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } -func (*SubscribeRequest) ProtoMessage() {} -func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SubscribeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SubscribeRequest.Merge(m, src) -} -func (m *SubscribeRequest) XXX_Size() int { - return m.Size() + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SubscribeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) + +func (*SubscribeRequest) ProtoMessage() {} + +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{8} +} -func (m *SubscribeRequest) GetId() string { - if m != nil { - return m.Id +func (x *SubscribeRequest) GetId() string { + if x != nil { + return x.Id } return "" } @@ -738,1240 +805,1244 @@ func (m *SubscribeRequest) GetId() string { // Framework //////////////////////////////////////// type GetFrameworkInfoRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetFrameworkInfoRequest) Reset() { + *x = GetFrameworkInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) -} -func (m *GetFrameworkInfoRequest) XXX_Size() int { - return m.Size() -} -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) + +func (x *GetFrameworkInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +func (*GetFrameworkInfoRequest) ProtoMessage() {} -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} -} -func (m *Version) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{9} +} + +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Version) XXX_Size() int { - return m.Size() + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Version proto.InternalMessageInfo +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{10} +} -func (m *Version) GetMajor() int32 { - if m != nil { - return m.Major +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major } return 0 } -func (m *Version) GetMinor() int32 { - if m != nil { - return m.Minor +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor } return 0 } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch } return 0 } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build +func (x *Version) GetBuild() string { + if x != nil { + return x.Build } return "" } -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName +func (x *Version) GetProductName() string { + if x != nil { + return x.ProductName } return "" } -func (m *Version) GetVersionStr() string { - if m != nil { - return m.VersionStr +func (x *Version) GetVersionStr() string { + if x != nil { + return x.VersionStr } return "" } type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} -} -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) + +func (x *GetFrameworkInfoReply) Reset() { + *x = GetFrameworkInfoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetFrameworkInfoReply) XXX_Size() int { - return m.Size() + +func (x *GetFrameworkInfoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) + +func (*GetFrameworkInfoReply) ProtoMessage() {} + +func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +// Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{11} +} -func (m *GetFrameworkInfoReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *GetFrameworkInfoReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { - if m != nil { - return m.EnvironmentsCount +func (x *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { + if x != nil { + return x.EnvironmentsCount } return 0 } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount +func (x *GetFrameworkInfoReply) GetTasksCount() int32 { + if x != nil { + return x.TasksCount } return 0 } -func (m *GetFrameworkInfoReply) GetState() string { - if m != nil { - return m.State +func (x *GetFrameworkInfoReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount +func (x *GetFrameworkInfoReply) GetHostsCount() int32 { + if x != nil { + return x.HostsCount } return 0 } -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName +func (x *GetFrameworkInfoReply) GetInstanceName() string { + if x != nil { + return x.InstanceName } return "" } -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version +func (x *GetFrameworkInfoReply) GetVersion() *Version { + if x != nil { + return x.Version } return nil } // Not implemented yet type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} -} -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownRequest) Reset() { + *x = TeardownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) -} -func (m *TeardownRequest) XXX_Size() int { - return m.Size() + +func (x *TeardownRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) + +func (*TeardownRequest) ProtoMessage() {} + +func (x *TeardownRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo +// Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{12} +} -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason +func (x *TeardownRequest) GetReason() string { + if x != nil { + return x.Reason } return "" } type TeardownReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} -} -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownReply) Reset() { + *x = TeardownReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) -} -func (m *TeardownReply) XXX_Size() int { - return m.Size() + +func (x *TeardownReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) + +func (*TeardownReply) ProtoMessage() {} + +func (x *TeardownReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo +// Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. +func (*TeardownReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{13} +} //////////////////////////////////////// // Environment //////////////////////////////////////// type GetEnvironmentsRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} -} -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsRequest) Reset() { + *x = GetEnvironmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) -} -func (m *GetEnvironmentsRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) + +func (*GetEnvironmentsRequest) ProtoMessage() {} + +func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{14} +} type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` } -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} -} -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsReply) Reset() { + *x = GetEnvironmentsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) -} -func (m *GetEnvironmentsReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentsReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) + +func (*GetEnvironmentsReply) ProtoMessage() {} + +func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{15} +} -func (m *GetEnvironmentsReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *GetEnvironmentsReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { - if m != nil { - return m.Environments +func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if x != nil { + return x.Environments } return nil } type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} -} -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` } -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) + +func (x *EnvironmentInfo) Reset() { + *x = EnvironmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *EnvironmentInfo) XXX_Size() int { - return m.Size() + +func (x *EnvironmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) + +func (*EnvironmentInfo) ProtoMessage() {} + +func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo +// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{16} +} -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id +func (x *EnvironmentInfo) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen +func (x *EnvironmentInfo) GetCreatedWhen() string { + if x != nil { + return x.CreatedWhen } return "" } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State +func (x *EnvironmentInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole +func (x *EnvironmentInfo) GetRootRole() string { + if x != nil { + return x.RootRole } return "" } -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *EnvironmentInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } return nil } +func (x *EnvironmentInfo) GetNumberOfFlps() int32 { + if x != nil { + return x.NumberOfFlps + } + return 0 +} + type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) -} -func (m *NewEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) + +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *NewEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} -} -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) -} -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +func (*NewEnvironmentReply) ProtoMessage() {} + +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} +} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } return nil } type NewAutoEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } -func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewAutoEnvironmentRequest) Reset() { + *x = NewAutoEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) -} -func (m *NewAutoEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *NewAutoEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) + +func (*NewAutoEnvironmentRequest) ProtoMessage() {} + +func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} +} -func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *NewAutoEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *NewAutoEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *NewAutoEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } type NewAutoEnvironmentReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } -func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} -} -func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewAutoEnvironmentReply) Reset() { + *x = NewAutoEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) -} -func (m *NewAutoEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *NewAutoEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) + +func (*NewAutoEnvironmentReply) ProtoMessage() {} + +func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} +} type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} -} -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentRequest) Reset() { + *x = GetEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) -} -func (m *GetEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) + +func (*GetEnvironmentRequest) ProtoMessage() {} + +func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{21} +} -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} -} -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) Reset() { + *x = GetEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) -} -func (m *GetEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) + +func (*GetEnvironmentReply) ProtoMessage() {} + +func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{22} +} -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } return nil } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow +func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { + if x != nil { + return x.Workflow } return nil } type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} -} -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentRequest) Reset() { + *x = ControlEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) -} -func (m *ControlEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) + +func (*ControlEnvironmentRequest) ProtoMessage() {} + +func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{23} +} -func (m *ControlEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *ControlEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { - if m != nil { - return m.Type +func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { + if x != nil { + return x.Type } return ControlEnvironmentRequest_NOOP } type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentReply) Reset() { + *x = ControlEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) + +func (*ControlEnvironmentReply) ProtoMessage() {} + +func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{24} +} -func (m *ControlEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *ControlEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ControlEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *ControlEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} -} -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ModifyEnvironmentRequest) Reset() { + *x = ModifyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) -} -func (m *ModifyEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) + +func (*ModifyEnvironmentRequest) ProtoMessage() {} + +func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{25} +} -func (m *ModifyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *ModifyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { - if m != nil { - return m.Operations +func (x *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if x != nil { + return x.Operations } return nil } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { - if m != nil { - return m.ReconfigureAll +func (x *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if x != nil { + return x.ReconfigureAll } return false } type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentOperation) Reset() { + *x = EnvironmentOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() + +func (x *EnvironmentOperation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) + +func (*EnvironmentOperation) ProtoMessage() {} + +func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo +// Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{26} +} -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { - if m != nil { - return m.Type +func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { + if x != nil { + return x.Type } return EnvironmentOperation_NOOP } -func (m *EnvironmentOperation) GetRoleName() string { - if m != nil { - return m.RoleName +func (x *EnvironmentOperation) GetRoleName() string { + if x != nil { + return x.RoleName } return "" } type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} -} -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ModifyEnvironmentReply) Reset() { + *x = ModifyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) -} -func (m *ModifyEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) + +func (*ModifyEnvironmentReply) ProtoMessage() {} + +func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{27} +} -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations +func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { + if x != nil { + return x.FailedOperations } return nil } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *ModifyEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ModifyEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *ModifyEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} -} -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) + +func (x *DestroyEnvironmentRequest) Reset() { + *x = DestroyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *DestroyEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) + +func (*DestroyEnvironmentRequest) ProtoMessage() {} + +func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{28} +} -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *DestroyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks +func (x *DestroyEnvironmentRequest) GetKeepTasks() bool { + if x != nil { + return x.KeepTasks } return false } -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState +func (x *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if x != nil { + return x.AllowInRunningState } return false } -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force +func (x *DestroyEnvironmentRequest) GetForce() bool { + if x != nil { + return x.Force } return false } type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} -} -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DestroyEnvironmentReply) Reset() { + *x = DestroyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) -} -func (m *DestroyEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) + +func (*DestroyEnvironmentReply) ProtoMessage() {} + +func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{29} +} -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply +func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } @@ -1980,210 +2051,209 @@ func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { // Environment, GET/SET properties //////////////////////////////////////// type SetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // If properties == nil, the core sets nothing // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} -} -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) Reset() { + *x = SetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (m *SetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} + +func (x *SetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesReply) Reset() { + *x = SetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (x *SetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} + +func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo +// Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} +} type GetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // If len(queries) == 0, we return an // empty map. // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} -} -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesRequest) Reset() { + *x = GetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{32} +} -func (m *GetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { - if m != nil { - return m.Queries +func (x *GetEnvironmentPropertiesRequest) GetQueries() []string { + if x != nil { + return x.Queries } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals +func (x *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if x != nil { + return x.ExcludeGlobals } return false } type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} -} -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesReply) Reset() { + *x = GetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{33} +} -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } @@ -2192,765 +2262,764 @@ func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { // Tasks //////////////////////////////////////// type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` - SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} -} -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` } -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) + +func (x *ShortTaskInfo) Reset() { + *x = ShortTaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ShortTaskInfo) XXX_Size() int { - return m.Size() + +func (x *ShortTaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) + +func (*ShortTaskInfo) ProtoMessage() {} + +func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +// Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{34} +} -func (m *ShortTaskInfo) GetName() string { - if m != nil { - return m.Name +func (x *ShortTaskInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked +func (x *ShortTaskInfo) GetLocked() bool { + if x != nil { + return x.Locked } return false } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId +func (x *ShortTaskInfo) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status +func (x *ShortTaskInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State +func (x *ShortTaskInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *ShortTaskInfo) GetClassName() string { - if m != nil { - return m.ClassName +func (x *ShortTaskInfo) GetClassName() string { + if x != nil { + return x.ClassName } return "" } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { - if m != nil { - return m.DeploymentInfo +func (x *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if x != nil { + return x.DeploymentInfo } return nil } -func (m *ShortTaskInfo) GetPid() string { - if m != nil { - return m.Pid +func (x *ShortTaskInfo) GetPid() string { + if x != nil { + return x.Pid } return "" } -func (m *ShortTaskInfo) GetSandboxStdout() string { - if m != nil { - return m.SandboxStdout +func (x *ShortTaskInfo) GetSandboxStdout() string { + if x != nil { + return x.SandboxStdout } return "" } type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} -} -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) + +func (x *TaskDeploymentInfo) Reset() { + *x = TaskDeploymentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TaskDeploymentInfo) XXX_Size() int { - return m.Size() + +func (x *TaskDeploymentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) + +func (*TaskDeploymentInfo) ProtoMessage() {} + +func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo +// Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{35} +} -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname +func (x *TaskDeploymentInfo) GetHostname() string { + if x != nil { + return x.Hostname } return "" } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId +func (x *TaskDeploymentInfo) GetAgentId() string { + if x != nil { + return x.AgentId } return "" } -func (m *TaskDeploymentInfo) GetOfferId() string { - if m != nil { - return m.OfferId +func (x *TaskDeploymentInfo) GetOfferId() string { + if x != nil { + return x.OfferId } return "" } -func (m *TaskDeploymentInfo) GetExecutorId() string { - if m != nil { - return m.ExecutorId +func (x *TaskDeploymentInfo) GetExecutorId() string { + if x != nil { + return x.ExecutorId } return "" } type GetTasksRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} -} -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksRequest) Reset() { + *x = GetTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) -} -func (m *GetTasksRequest) XXX_Size() int { - return m.Size() + +func (x *GetTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) + +func (*GetTasksRequest) ProtoMessage() {} + +func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +// Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{36} +} type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} -} -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksReply) Reset() { + *x = GetTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) -} -func (m *GetTasksReply) XXX_Size() int { - return m.Size() + +func (x *GetTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) + +func (*GetTasksReply) ProtoMessage() {} + +func (x *GetTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +// Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{37} +} -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} -} -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTaskRequest) Reset() { + *x = GetTaskRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) -} -func (m *GetTaskRequest) XXX_Size() int { - return m.Size() + +func (x *GetTaskRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) + +func (*GetTaskRequest) ProtoMessage() {} + +func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +// Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{38} +} -func (m *GetTaskRequest) GetTaskId() string { - if m != nil { - return m.TaskId +func (x *GetTaskRequest) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} -} -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTaskReply) Reset() { + *x = GetTaskReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) -} -func (m *GetTaskReply) XXX_Size() int { - return m.Size() + +func (x *GetTaskReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) + +func (*GetTaskReply) ProtoMessage() {} + +func (x *GetTaskReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +// Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{39} +} -func (m *GetTaskReply) GetTask() *TaskInfo { - if m != nil { - return m.Task +func (x *GetTaskReply) GetTask() *TaskInfo { + if x != nil { + return x.Task } return nil } type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} -} -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskClassInfo) Reset() { + *x = TaskClassInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) -} -func (m *TaskClassInfo) XXX_Size() int { - return m.Size() + +func (x *TaskClassInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) + +func (*TaskClassInfo) ProtoMessage() {} + +func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{40} +} -func (m *TaskClassInfo) GetName() string { - if m != nil { - return m.Name +func (x *TaskClassInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *TaskClassInfo) GetControlMode() string { - if m != nil { - return m.ControlMode +func (x *TaskClassInfo) GetControlMode() string { + if x != nil { + return x.ControlMode } return "" } type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} -} -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) + +func (x *CommandInfo) Reset() { + *x = CommandInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CommandInfo) XXX_Size() int { - return m.Size() + +func (x *CommandInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) + +func (*CommandInfo) ProtoMessage() {} + +func (x *CommandInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +// Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. +func (*CommandInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{41} +} -func (m *CommandInfo) GetEnv() []string { - if m != nil { - return m.Env +func (x *CommandInfo) GetEnv() []string { + if x != nil { + return x.Env } return nil } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell +func (x *CommandInfo) GetShell() bool { + if x != nil { + return x.Shell } return false } -func (m *CommandInfo) GetValue() string { - if m != nil { - return m.Value +func (x *CommandInfo) GetValue() string { + if x != nil { + return x.Value } return "" } -func (m *CommandInfo) GetArguments() []string { - if m != nil { - return m.Arguments +func (x *CommandInfo) GetArguments() []string { + if x != nil { + return x.Arguments } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +func (x *CommandInfo) GetUser() string { + if x != nil { + return x.User } return "" } type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} -} -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ChannelInfo) Reset() { + *x = ChannelInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) -} -func (m *ChannelInfo) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) + +func (*ChannelInfo) ProtoMessage() {} + +func (x *ChannelInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +// Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{42} +} -func (m *ChannelInfo) GetName() string { - if m != nil { - return m.Name +func (x *ChannelInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *ChannelInfo) GetType() string { - if m != nil { - return m.Type +func (x *ChannelInfo) GetType() string { + if x != nil { + return x.Type } return "" } -func (m *ChannelInfo) GetTarget() string { - if m != nil { - return m.Target +func (x *ChannelInfo) GetTarget() string { + if x != nil { + return x.Target } return "" } type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} -} -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) + +func (x *TaskInfo) Reset() { + *x = TaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TaskInfo) XXX_Size() int { - return m.Size() + +func (x *TaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) + +func (*TaskInfo) ProtoMessage() {} + +func (x *TaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo +// Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. +func (*TaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{43} +} -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { - if m != nil { - return m.ShortInfo +func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { + if x != nil { + return x.ShortInfo } return nil } -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +func (x *TaskInfo) GetClassInfo() *TaskClassInfo { + if x != nil { + return x.ClassInfo } return nil } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { - if m != nil { - return m.InboundChannels +func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { + if x != nil { + return x.InboundChannels } return nil } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { - if m != nil { - return m.OutboundChannels +func (x *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if x != nil { + return x.OutboundChannels } return nil } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { - if m != nil { - return m.CommandInfo +func (x *TaskInfo) GetCommandInfo() *CommandInfo { + if x != nil { + return x.CommandInfo } return nil } -func (m *TaskInfo) GetTaskPath() string { - if m != nil { - return m.TaskPath +func (x *TaskInfo) GetTaskPath() string { + if x != nil { + return x.TaskPath } return "" } -func (m *TaskInfo) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *TaskInfo) GetEnvId() string { + if x != nil { + return x.EnvId } return "" } -func (m *TaskInfo) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *TaskInfo) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} -} -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CleanupTasksRequest) Reset() { + *x = CleanupTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) -} -func (m *CleanupTasksRequest) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) + +func (*CleanupTasksRequest) ProtoMessage() {} + +func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +// Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44} +} -func (m *CleanupTasksRequest) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *CleanupTasksRequest) GetTaskIds() []string { + if x != nil { + return x.TaskIds } return nil } type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CleanupTasksReply) Reset() { + *x = CleanupTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) -} -func (m *CleanupTasksReply) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) + +func (*CleanupTasksReply) ProtoMessage() {} + +func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +// Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{45} +} -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { + if x != nil { + return x.KilledTasks } return nil } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { - if m != nil { - return m.RunningTasks +func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { + if x != nil { + return x.RunningTasks } return nil } @@ -2959,16344 +3028,2696 @@ func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { // Roles //////////////////////////////////////// type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} -} -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetRolesRequest) Reset() { + *x = GetRolesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) -} -func (m *GetRolesRequest) XXX_Size() int { - return m.Size() + +func (x *GetRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) + +func (*GetRolesRequest) ProtoMessage() {} + +func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo +// Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{46} +} -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *GetRolesRequest) GetEnvId() string { + if x != nil { + return x.EnvId } return "" } -func (m *GetRolesRequest) GetPathSpec() string { - if m != nil { - return m.PathSpec +func (x *GetRolesRequest) GetPathSpec() string { + if x != nil { + return x.PathSpec } return "" } type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} -} -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) + +func (x *RoleInfo) Reset() { + *x = RoleInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RoleInfo) XXX_Size() int { - return m.Size() + +func (x *RoleInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) + +func (*RoleInfo) ProtoMessage() {} + +func (x *RoleInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo +// Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. +func (*RoleInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{47} +} -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name +func (x *RoleInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status +func (x *RoleInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State +func (x *RoleInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath +func (x *RoleInfo) GetFullPath() string { + if x != nil { + return x.FullPath } return "" } -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *RoleInfo) GetTaskIds() []string { + if x != nil { + return x.TaskIds } return nil } -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *RoleInfo) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } return nil } -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *RoleInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } return nil } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *RoleInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *RoleInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *RoleInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } return nil } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RoleInfo) GetConsolidatedStack() map[string]string { + if x != nil { + return x.ConsolidatedStack + } + return nil } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} -} -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +type GetRolesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) + +func (x *GetRolesReply) Reset() { + *x = GetRolesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetRolesReply) XXX_Size() int { - return m.Size() + +func (x *GetRolesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) + +func (*GetRolesReply) ProtoMessage() {} + +func (x *GetRolesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +// Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{48} +} -func (m *GetRolesReply) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *GetRolesReply) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } return nil } type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) + +func (x *GetWorkflowTemplatesRequest) Reset() { + *x = GetWorkflowTemplatesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { - return m.Size() + +func (x *GetWorkflowTemplatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) + +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} + +func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +// Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{49} +} -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { - if m != nil { - return m.RepoPattern +func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if x != nil { + return x.RepoPattern } return "" } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { - if m != nil { - return m.RevisionPattern +func (x *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if x != nil { + return x.RevisionPattern } return "" } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { - if m != nil { - return m.AllBranches +func (x *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if x != nil { + return x.AllBranches } return false } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { - if m != nil { - return m.AllTags +func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { + if x != nil { + return x.AllTags } return false } type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *WorkflowTemplateInfo) Reset() { + *x = WorkflowTemplateInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) -} -func (m *WorkflowTemplateInfo) XXX_Size() int { - return m.Size() + +func (x *WorkflowTemplateInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) + +func (*WorkflowTemplateInfo) ProtoMessage() {} + +func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo +// Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} +} -func (m *WorkflowTemplateInfo) GetRepo() string { - if m != nil { - return m.Repo +func (x *WorkflowTemplateInfo) GetRepo() string { + if x != nil { + return x.Repo } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { - if m != nil { - return m.Template +func (x *WorkflowTemplateInfo) GetTemplate() string { + if x != nil { + return x.Template } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { - if m != nil { - return m.Revision +func (x *WorkflowTemplateInfo) GetRevision() string { + if x != nil { + return x.Revision } return "" } type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} -} -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetWorkflowTemplatesReply) Reset() { + *x = GetWorkflowTemplatesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) -} -func (m *GetWorkflowTemplatesReply) XXX_Size() int { - return m.Size() + +func (x *GetWorkflowTemplatesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) + +func (*GetWorkflowTemplatesReply) ProtoMessage() {} + +func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +// Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{51} +} -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { - if m != nil { - return m.WorkflowTemplates +func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { + if x != nil { + return x.WorkflowTemplates } return nil } type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ListReposRequest) Reset() { + *x = ListReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) -} -func (m *ListReposRequest) XXX_Size() int { - return m.Size() + +func (x *ListReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + +func (*ListReposRequest) ProtoMessage() {} + +func (x *ListReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo +// Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{52} +} type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} -} -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *RepoInfo) Reset() { + *x = RepoInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) -} -func (m *RepoInfo) XXX_Size() int { - return m.Size() + +func (x *RepoInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) + +func (*RepoInfo) ProtoMessage() {} + +func (x *RepoInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo +// Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. +func (*RepoInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{53} +} -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name +func (x *RepoInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default +func (x *RepoInfo) GetDefault() bool { + if x != nil { + return x.Default } return false } -func (m *RepoInfo) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *RepoInfo) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } return "" } type ListReposReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} -} -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ListReposReply) Reset() { + *x = ListReposReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) -} -func (m *ListReposReply) XXX_Size() int { - return m.Size() + +func (x *ListReposReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) + +func (*ListReposReply) ProtoMessage() {} + +func (x *ListReposReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +// Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. +func (*ListReposReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{54} +} -func (m *ListReposReply) GetRepos() []*RepoInfo { - if m != nil { - return m.Repos +func (x *ListReposReply) GetRepos() []*RepoInfo { + if x != nil { + return x.Repos } return nil } -func (m *ListReposReply) GetGlobalDefaultRevision() string { - if m != nil { - return m.GlobalDefaultRevision +func (x *ListReposReply) GetGlobalDefaultRevision() string { + if x != nil { + return x.GlobalDefaultRevision } return "" } type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} -} -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) -} -func (m *AddRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo - -func (m *AddRepoRequest) GetName() string { - if m != nil { - return m.Name +func (x *AddRepoRequest) Reset() { + *x = AddRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (m *AddRepoRequest) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision - } - return "" +func (x *AddRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*AddRepoRequest) ProtoMessage() {} -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +// Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{55} +} -func (m *AddRepoReply) GetNewDefaultRevision() string { - if m != nil { - return m.NewDefaultRevision +func (x *AddRepoRequest) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *AddRepoReply) GetInfo() string { - if m != nil { - return m.Info +func (x *AddRepoRequest) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type AddRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *AddRepoReply) Reset() { + *x = AddRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) -} -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (x *AddRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +func (*AddRepoReply) ProtoMessage() {} -func (m *RemoveRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *AddRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} -} -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *AddRepoReply) GetNewDefaultRevision() string { + if x != nil { + return x.NewDefaultRevision } + return "" } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) -} -func (m *RemoveRepoReply) XXX_Size() int { - return m.Size() -} -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetNewDefaultRepo() string { - if m != nil { - return m.NewDefaultRepo +func (x *AddRepoReply) GetInfo() string { + if x != nil { + return x.Info } return "" } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +type RemoveRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} -} -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) -} -func (m *RefreshReposRequest) XXX_Size() int { - return m.Size() -} -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo - -func (m *RefreshReposRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *RemoveRepoRequest) Reset() { + *x = RemoveRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RemoveRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} -} -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*RemoveRepoRequest) ProtoMessage() {} + +func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) -} -func (m *SetDefaultRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +// Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{57} +} -func (m *SetDefaultRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *RemoveRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } return 0 } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +type RemoveRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { - return m.Size() -} -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *RemoveRepoReply) Reset() { + *x = RemoveRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RemoveRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} -} -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*RemoveRepoReply) ProtoMessage() {} + +func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { - return m.Size() -} -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo - -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index - } - return 0 +// Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *RemoveRepoReply) GetNewDefaultRepo() string { + if x != nil { + return x.NewDefaultRepo } return "" } -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type RefreshReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} -} -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *RefreshReposRequest) Reset() { + *x = RefreshReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) -} -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { - return m.Size() -} -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) + +func (x *RefreshReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +func (*RefreshReposRequest) ProtoMessage() {} -func (m *SetRepoDefaultRevisionReply) GetInfo() string { - if m != nil { - return m.Info +func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} -} -func (m *Empty) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) -} -func (m *Empty) XXX_Size() int { - return m.Size() -} -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) -} - -var xxx_messageInfo_Empty proto.InternalMessageInfo - -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") - proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") - proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*Event)(nil), "o2control.Event") - proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") -} - -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2918 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, - 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, - 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, - 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, - 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, - 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, - 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, - 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, - 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, - 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, - 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, - 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, - 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, - 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, - 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, - 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, - 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, - 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, - 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, - 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, - 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, - 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, - 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, - 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, - 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, - 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, - 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, - 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, - 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, - 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, - 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, - 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, - 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, - 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, - 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, - 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, - 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, - 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, - 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, - 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, - 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, - 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, - 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, - 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, - 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, - 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, - 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, - 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, - 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, - 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, - 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, - 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, - 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, - 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, - 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, - 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, - 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, - 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, - 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, - 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, - 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, - 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, - 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, - 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, - 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, - 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, - 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, - 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, - 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, - 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, - 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, - 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, - 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, - 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, - 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, - 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, - 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, - 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, - 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, - 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, - 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, - 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, - 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, - 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, - 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, - 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, - 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, - 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, - 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, - 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, - 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, - 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, - 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, - 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, - 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, - 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, - 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, - 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, - 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, - 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, - 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, - 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, - 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, - 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, - 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, - 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, - 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, - 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, - 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, - 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, - 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, - 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, - 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, - 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, - 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, - 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, - 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, - 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, - 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, - 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, - 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, - 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, - 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, - 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, - 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, - 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, - 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, - 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, - 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, - 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, - 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, - 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, - 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, - 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, - 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, - 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, - 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, - 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, - 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, - 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, - 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, - 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, - 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, - 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, - 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, - 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, - 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, - 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, - 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, - 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, - 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, - 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, - 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, - 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, - 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, - 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, - 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, - 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, - 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, - 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, - 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, - 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, - 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, - 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, - 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, - 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, - 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, - 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, - 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, - 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, - 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, - 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, - 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, - 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, - 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, - 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, - 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, - 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, - 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, - 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, - 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, - 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, - 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +func (x *RefreshReposRequest) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 } -type controlClient struct { - cc *grpc.ClientConn -} +type SetDefaultRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (x *SetDefaultRepoRequest) Reset() { + *x = SetDefaultRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return x, nil } -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +func (x *SetDefaultRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -type controlTrackStatusClient struct { - grpc.ClientStream -} +func (*SetDefaultRepoRequest) ProtoMessage() {} -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return m, nil + return mi.MessageOf(x) } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err +func (x *SetDefaultRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return out, nil + return 0 } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetGlobalDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *SetGlobalDefaultRevisionRequest) Reset() { + *x = SetGlobalDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetGlobalDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return out, nil + return "" } -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetRepoDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` } -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) Reset() { + *x = SetRepoDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetRepoDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return out, nil + return 0 } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetRepoDefaultRevisionReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionReply) Reset() { + *x = SetRepoDefaultRevisionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetRepoDefaultRevisionReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionReply) GetInfo() string { + if x != nil { + return x.Info } - return out, nil + return "" } -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type controlSubscribeClient struct { - grpc.ClientStream +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return m, nil + return mi.MessageOf(x) } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{64} +} + +var File_protos_o2control_proto protoreflect.FileDescriptor + +var file_protos_o2control_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, + 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, + 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, + 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, + 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} +var ( + file_protos_o2control_proto_rawDescOnce sync.Once + file_protos_o2control_proto_rawDescData = file_protos_o2control_proto_rawDesc +) -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") -} -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") -} -func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) -} - -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewAutoEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) +func file_protos_o2control_proto_rawDescGZIP() []byte { + file_protos_o2control_proto_rawDescOnce.Do(func() { + file_protos_o2control_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_o2control_proto_rawDescData) + }) + return file_protos_o2control_proto_rawDescData +} + +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_goTypes = []interface{}{ + (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level + (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype + (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 7: o2control.StatusRequest + (*StatusReply)(nil), // 8: o2control.StatusReply + (*StatusUpdate)(nil), // 9: o2control.StatusUpdate + (*Event)(nil), // 10: o2control.Event + (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 13: o2control.Version + (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 15: o2control.TeardownRequest + (*TeardownReply)(nil), // 16: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 40: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 42: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo + (*CommandInfo)(nil), // 44: o2control.CommandInfo + (*ChannelInfo)(nil), // 45: o2control.ChannelInfo + (*TaskInfo)(nil), // 46: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest + (*RoleInfo)(nil), // 50: o2control.RoleInfo + (*GetRolesReply)(nil), // 51: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 55: o2control.ListReposRequest + (*RepoInfo)(nil), // 56: o2control.RepoInfo + (*ListReposReply)(nil), // 57: o2control.ListReposReply + (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 59: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 67: o2control.Empty + nil, // 68: o2control.EnvironmentInfo.DefaultsEntry + nil, // 69: o2control.EnvironmentInfo.VarsEntry + nil, // 70: o2control.EnvironmentInfo.UserVarsEntry + nil, // 71: o2control.NewEnvironmentRequest.VarsEntry + nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 75: o2control.TaskInfo.PropertiesEntry + nil, // 76: o2control.RoleInfo.DefaultsEntry + nil, // 77: o2control.RoleInfo.VarsEntry + nil, // 78: o2control.RoleInfo.UserVarsEntry + nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry +} +var file_protos_o2control_proto_depIdxs = []int32{ + 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event + 66, // [66:89] is the sub-list for method output_type + 43, // [43:66] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name +} + +func init() { file_protos_o2control_proto_init() } +func file_protos_o2control_proto_init() { + if File_protos_o2control_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event_MesosHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RoleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewAutoEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewAutoEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentOperation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShortTaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskDeploymentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskClassInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplateInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RepoInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RefreshReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetDefaultRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return interceptor(ctx, in, info, handler) -} - -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err + file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_o2control_proto_rawDesc, + NumEnums: 3, + NumMessages: 77, + NumExtensions: 0, + NumServices: 1, }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", -} - -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x22 - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvironmentId) > 0 { - i -= len(m.EnvironmentId) - copy(dAtA[i:], m.EnvironmentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RolePath) > 0 { - i -= len(m.RolePath) - copy(dAtA[i:], m.RolePath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentEvent != nil { - { - size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + GoTypes: file_protos_o2control_proto_goTypes, + DependencyIndexes: file_protos_o2control_proto_depIdxs, + EnumInfos: file_protos_o2control_proto_enumTypes, + MessageInfos: file_protos_o2control_proto_msgTypes, + }.Build() + File_protos_o2control_proto = out.File + file_protos_o2control_proto_rawDesc = nil + file_protos_o2control_proto_goTypes = nil + file_protos_o2control_proto_depIdxs = nil } - -func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskEvent != nil { - { - size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.RoleEvent != nil { - { - size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x10 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.SandboxStdout) > 0 { - i -= len(m.SandboxStdout) - copy(dAtA[i:], m.SandboxStdout) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) - i-- - dAtA[i] = 0x4a - } - if len(m.Pid) > 0 { - i -= len(m.Pid) - copy(dAtA[i:], m.Pid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) - i-- - dAtA[i] = 0x42 - } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x1a - } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x12 - } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Empty) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvironmentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RolePath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Timestamp) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Payload != nil { - n += m.Payload.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Event_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentEvent != nil { - l = m.EnvironmentEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskEvent != nil { - l = m.TaskEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.RoleEvent != nil { - l = m.RoleEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Version) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) - } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) - } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) - } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ReconfigureAll { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ExcludeGlobals { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Pid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.SandboxStdout) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.AllBranches { - n += 2 - } - if m.AllTags { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *WorkflowTemplateInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Repo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Template) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RepoInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.GlobalDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RefreshReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetDefaultRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvironmentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_RoleEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_RoleEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_RoleEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RolePath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control - } - 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: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control - } - 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: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusUpdate) 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 ErrIntOverflowO2Control - } - 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: StatusUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -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 ErrIntOverflowO2Control - } - 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 Timestamp", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timestamp = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentEvent{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskEvent{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_RoleEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_RoleEvent{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SubscribeRequest) 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 ErrIntOverflowO2Control - } - 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: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Version) 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 ErrIntOverflowO2Control - } - 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: Version: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProductName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VersionStr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) - } - m.EnvironmentsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) - } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) - } - m.HostsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InstanceName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownRequest) 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 ErrIntOverflowO2Control - } - 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: TeardownRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - 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: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentInfo) 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 ErrIntOverflowO2Control - } - 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: EnvironmentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-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 RootRole", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReconfigureAll = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentOperation) 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 ErrIntOverflowO2Control - } - 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: EnvironmentOperation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RoleName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.KeepTasks = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowInRunningState = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Force = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} - } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExcludeGlobals = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ShortTaskInfo) 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 ErrIntOverflowO2Control - } - 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: ShortTaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ShortTaskInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Locked", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Locked = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeploymentInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DeploymentInfo == nil { - m.DeploymentInfo = &TaskDeploymentInfo{} - } - if err := m.DeploymentInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SandboxStdout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskDeploymentInfo) 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 ErrIntOverflowO2Control - } - 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: TaskDeploymentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskDeploymentInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AgentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OfferId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExecutorId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksRequest) 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 ErrIntOverflowO2Control - } - 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: GetTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksReply) 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 ErrIntOverflowO2Control - } - 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: GetTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskRequest) 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 ErrIntOverflowO2Control - } - 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: GetTaskRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskReply) 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 ErrIntOverflowO2Control - } - 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: GetTaskReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Task", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Task == nil { - m.Task = &TaskInfo{} - } - if err := m.Task.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskClassInfo) 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 ErrIntOverflowO2Control - } - 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: TaskClassInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskClassInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 ControlMode", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ControlMode = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommandInfo) 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 ErrIntOverflowO2Control - } - 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: CommandInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommandInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Shell", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Shell = bool(v != 0) - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ChannelInfo) 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 ErrIntOverflowO2Control - } - 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: ChannelInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChannelInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Target = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskInfo) 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 ErrIntOverflowO2Control - } - 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: TaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShortInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ShortInfo == nil { - m.ShortInfo = &ShortTaskInfo{} - } - if err := m.ShortInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClassInfo == nil { - m.ClassInfo = &TaskClassInfo{} - } - if err := m.ClassInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InboundChannels = append(m.InboundChannels, &ChannelInfo{}) - if err := m.InboundChannels[len(m.InboundChannels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OutboundChannels = append(m.OutboundChannels, &ChannelInfo{}) - if err := m.OutboundChannels[len(m.OutboundChannels)-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 CommandInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CommandInfo == nil { - m.CommandInfo = &CommandInfo{} - } - if err := m.CommandInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksRequest) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksReply) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RunningTasks = append(m.RunningTasks, &ShortTaskInfo{}) - if err := m.RunningTasks[len(m.RunningTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesRequest) 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 ErrIntOverflowO2Control - } - 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: GetRolesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PathSpec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PathSpec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RoleInfo) 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 ErrIntOverflowO2Control - } - 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: RoleInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RoleInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FullPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesReply) 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 ErrIntOverflowO2Control - } - 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: GetRolesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesRequest) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RepoPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RevisionPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllBranches = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllTags = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WorkflowTemplateInfo) 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 ErrIntOverflowO2Control - } - 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: WorkflowTemplateInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WorkflowTemplateInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Template = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesReply) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplates = append(m.WorkflowTemplates, &WorkflowTemplateInfo{}) - if err := m.WorkflowTemplates[len(m.WorkflowTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposRequest) 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 ErrIntOverflowO2Control - } - 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: ListReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RepoInfo) 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 ErrIntOverflowO2Control - } - 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: RepoInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RepoInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Default = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposReply) 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 ErrIntOverflowO2Control - } - 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: ListReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repos", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repos = append(m.Repos, &RepoInfo{}) - if err := m.Repos[len(m.Repos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoRequest) 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 ErrIntOverflowO2Control - } - 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: AddRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoRequest: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoRequest) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoReply) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRepo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefreshReposRequest) 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 ErrIntOverflowO2Control - } - 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: RefreshReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetDefaultRepoRequest) 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 ErrIntOverflowO2Control - } - 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: SetDefaultRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetGlobalDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Empty) 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 ErrIntOverflowO2Control - } - 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: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipO2Control(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthO2Control - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") -) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 3194363ff..3991a551c 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1,30 +1,52 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.14.0 // source: protos/o2control.proto package pb import ( - context "context" - fmt "fmt" proto "github.com/golang/protobuf/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) -// 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.ProtoPackageIsVersion3 // please upgrade the proto package +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 type StatusUpdate_Level int32 @@ -35,26 +57,47 @@ const ( StatusUpdate_ERROR StatusUpdate_Level = 3 ) -var StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", -} +// Enum value maps for StatusUpdate_Level. +var ( + StatusUpdate_Level_name = map[int32]string{ + 0: "DEBUG", + 1: "INFO", + 2: "WARNING", + 3: "ERROR", + } + StatusUpdate_Level_value = map[string]int32{ + "DEBUG": 0, + "INFO": 1, + "WARNING": 2, + "ERROR": 3, + } +) -var StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, +func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { + p := new(StatusUpdate_Level) + *p = x + return p } func (x StatusUpdate_Level) String() string { - return proto.EnumName(StatusUpdate_Level_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[0].Descriptor() +} + +func (StatusUpdate_Level) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[0] } +func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use StatusUpdate_Level.Descriptor instead. func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} } type ControlEnvironmentRequest_Optype int32 @@ -68,30 +111,51 @@ const ( ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 ) -var ControlEnvironmentRequest_Optype_name = map[int32]string{ - 0: "NOOP", - 1: "START_ACTIVITY", - 2: "STOP_ACTIVITY", - 3: "CONFIGURE", - 4: "RESET", - 5: "GO_ERROR", -} +// Enum value maps for ControlEnvironmentRequest_Optype. +var ( + ControlEnvironmentRequest_Optype_name = map[int32]string{ + 0: "NOOP", + 1: "START_ACTIVITY", + 2: "STOP_ACTIVITY", + 3: "CONFIGURE", + 4: "RESET", + 5: "GO_ERROR", + } + ControlEnvironmentRequest_Optype_value = map[string]int32{ + "NOOP": 0, + "START_ACTIVITY": 1, + "STOP_ACTIVITY": 2, + "CONFIGURE": 3, + "RESET": 4, + "GO_ERROR": 5, + } +) -var ControlEnvironmentRequest_Optype_value = map[string]int32{ - "NOOP": 0, - "START_ACTIVITY": 1, - "STOP_ACTIVITY": 2, - "CONFIGURE": 3, - "RESET": 4, - "GO_ERROR": 5, +func (x ControlEnvironmentRequest_Optype) Enum() *ControlEnvironmentRequest_Optype { + p := new(ControlEnvironmentRequest_Optype) + *p = x + return p } func (x ControlEnvironmentRequest_Optype) String() string { - return proto.EnumName(ControlEnvironmentRequest_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() } +func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] +} + +func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} } type EnvironmentOperation_Optype int32 @@ -102,298 +166,318 @@ const ( EnvironmentOperation_ADD_ROLE EnvironmentOperation_Optype = 4 ) -var EnvironmentOperation_Optype_name = map[int32]string{ - 0: "NOOP", - 3: "REMOVE_ROLE", - 4: "ADD_ROLE", -} +// Enum value maps for EnvironmentOperation_Optype. +var ( + EnvironmentOperation_Optype_name = map[int32]string{ + 0: "NOOP", + 3: "REMOVE_ROLE", + 4: "ADD_ROLE", + } + EnvironmentOperation_Optype_value = map[string]int32{ + "NOOP": 0, + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, + } +) -var EnvironmentOperation_Optype_value = map[string]int32{ - "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } func (x EnvironmentOperation_Optype) String() string { - return proto.EnumName(EnvironmentOperation_Optype_name, int32(x)) + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() +} + +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] +} + +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } type Event_MesosHeartbeat struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *Event_MesosHeartbeat) Reset() { *m = Event_MesosHeartbeat{} } -func (m *Event_MesosHeartbeat) String() string { return proto.CompactTextString(m) } -func (*Event_MesosHeartbeat) ProtoMessage() {} -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{0} -} -func (m *Event_MesosHeartbeat) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event_MesosHeartbeat) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event_MesosHeartbeat.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event_MesosHeartbeat) Reset() { + *x = Event_MesosHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event_MesosHeartbeat) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event_MesosHeartbeat.Merge(m, src) -} -func (m *Event_MesosHeartbeat) XXX_Size() int { - return m.Size() -} -func (m *Event_MesosHeartbeat) XXX_DiscardUnknown() { - xxx_messageInfo_Event_MesosHeartbeat.DiscardUnknown(m) + +func (x *Event_MesosHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event_MesosHeartbeat proto.InternalMessageInfo +func (*Event_MesosHeartbeat) ProtoMessage() {} -type Ev_EnvironmentEvent struct { - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_EnvironmentEvent) Reset() { *m = Ev_EnvironmentEvent{} } -func (m *Ev_EnvironmentEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{1} -} -func (m *Ev_EnvironmentEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_EnvironmentEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_EnvironmentEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. +func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } -func (m *Ev_EnvironmentEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_EnvironmentEvent.Merge(m, src) + +type Ev_EnvironmentEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` } -func (m *Ev_EnvironmentEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_EnvironmentEvent) Reset() { + *x = Ev_EnvironmentEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_EnvironmentEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_EnvironmentEvent.DiscardUnknown(m) + +func (x *Ev_EnvironmentEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Ev_EnvironmentEvent proto.InternalMessageInfo +func (*Ev_EnvironmentEvent) ProtoMessage() {} -func (m *Ev_EnvironmentEvent) GetEnvironmentId() string { - if m != nil { - return m.EnvironmentId +func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{1} +} + +func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId } return "" } -func (m *Ev_EnvironmentEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_EnvironmentEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } -func (m *Ev_EnvironmentEvent) GetError() string { - if m != nil { - return m.Error +func (x *Ev_EnvironmentEvent) GetError() string { + if x != nil { + return x.Error } return "" } -func (m *Ev_EnvironmentEvent) GetMessage() string { - if m != nil { - return m.Message +func (x *Ev_EnvironmentEvent) GetMessage() string { + if x != nil { + return x.Message } return "" } type Ev_TaskEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_TaskEvent) Reset() { *m = Ev_TaskEvent{} } -func (m *Ev_TaskEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_TaskEvent) ProtoMessage() {} -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{2} -} -func (m *Ev_TaskEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_TaskEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_TaskEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` } -func (m *Ev_TaskEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_TaskEvent.Merge(m, src) + +func (x *Ev_TaskEvent) Reset() { + *x = Ev_TaskEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_TaskEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_TaskEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Ev_TaskEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_TaskEvent.DiscardUnknown(m) + +func (*Ev_TaskEvent) ProtoMessage() {} + +func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Ev_TaskEvent proto.InternalMessageInfo +// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{2} +} -func (m *Ev_TaskEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_TaskEvent) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *Ev_TaskEvent) GetTaskid() string { - if m != nil { - return m.Taskid +func (x *Ev_TaskEvent) GetTaskid() string { + if x != nil { + return x.Taskid } return "" } -func (m *Ev_TaskEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_TaskEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_TaskEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_TaskEvent) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *Ev_TaskEvent) GetHostname() string { - if m != nil { - return m.Hostname +func (x *Ev_TaskEvent) GetHostname() string { + if x != nil { + return x.Hostname } return "" } -func (m *Ev_TaskEvent) GetClassName() string { - if m != nil { - return m.ClassName +func (x *Ev_TaskEvent) GetClassName() string { + if x != nil { + return x.ClassName } return "" } type Ev_RoleEvent struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Ev_RoleEvent) Reset() { *m = Ev_RoleEvent{} } -func (m *Ev_RoleEvent) String() string { return proto.CompactTextString(m) } -func (*Ev_RoleEvent) ProtoMessage() {} -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{3} -} -func (m *Ev_RoleEvent) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Ev_RoleEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Ev_RoleEvent.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` } -func (m *Ev_RoleEvent) XXX_Merge(src proto.Message) { - xxx_messageInfo_Ev_RoleEvent.Merge(m, src) + +func (x *Ev_RoleEvent) Reset() { + *x = Ev_RoleEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Ev_RoleEvent) XXX_Size() int { - return m.Size() + +func (x *Ev_RoleEvent) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Ev_RoleEvent) XXX_DiscardUnknown() { - xxx_messageInfo_Ev_RoleEvent.DiscardUnknown(m) + +func (*Ev_RoleEvent) ProtoMessage() {} + +func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Ev_RoleEvent proto.InternalMessageInfo +// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{3} +} -func (m *Ev_RoleEvent) GetName() string { - if m != nil { - return m.Name +func (x *Ev_RoleEvent) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *Ev_RoleEvent) GetStatus() string { - if m != nil { - return m.Status +func (x *Ev_RoleEvent) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *Ev_RoleEvent) GetState() string { - if m != nil { - return m.State +func (x *Ev_RoleEvent) GetState() string { + if x != nil { + return x.State } return "" } -func (m *Ev_RoleEvent) GetRolePath() string { - if m != nil { - return m.RolePath +func (x *Ev_RoleEvent) GetRolePath() string { + if x != nil { + return x.RolePath } return "" } @@ -402,153 +486,147 @@ func (m *Ev_RoleEvent) GetRolePath() string { // Global status //////////////////////////////////////// type StatusRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *StatusRequest) Reset() { *m = StatusRequest{} } -func (m *StatusRequest) String() string { return proto.CompactTextString(m) } -func (*StatusRequest) ProtoMessage() {} -func (*StatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{4} -} -func (m *StatusRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusRequest.Merge(m, src) -} -func (m *StatusRequest) XXX_Size() int { - return m.Size() + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusRequest) XXX_DiscardUnknown() { - xxx_messageInfo_StatusRequest.DiscardUnknown(m) + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StatusRequest proto.InternalMessageInfo +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{4} +} type StatusReply struct { - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` + StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` } -func (m *StatusReply) Reset() { *m = StatusReply{} } -func (m *StatusReply) String() string { return proto.CompactTextString(m) } -func (*StatusReply) ProtoMessage() {} -func (*StatusReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{5} -} -func (m *StatusReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusReply.Merge(m, src) -} -func (m *StatusReply) XXX_Size() int { - return m.Size() + +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *StatusReply) XXX_DiscardUnknown() { - xxx_messageInfo_StatusReply.DiscardUnknown(m) + +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_StatusReply proto.InternalMessageInfo +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{5} +} -func (m *StatusReply) GetState() string { - if m != nil { - return m.State +func (x *StatusReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *StatusReply) GetStatusUpdates() []*StatusUpdate { - if m != nil { - return m.StatusUpdates +func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { + if x != nil { + return x.StatusUpdates } return nil } type StatusUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are valid to be assigned to Event: + // Types that are assignable to Event: // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Event isStatusUpdate_Event `protobuf_oneof:"Event"` } -func (m *StatusUpdate) Reset() { *m = StatusUpdate{} } -func (m *StatusUpdate) String() string { return proto.CompactTextString(m) } -func (*StatusUpdate) ProtoMessage() {} -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{6} -} -func (m *StatusUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *StatusUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_StatusUpdate.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *StatusUpdate) Reset() { + *x = StatusUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *StatusUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_StatusUpdate.Merge(m, src) -} -func (m *StatusUpdate) XXX_Size() int { - return m.Size() -} -func (m *StatusUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_StatusUpdate.DiscardUnknown(m) + +func (x *StatusUpdate) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_StatusUpdate proto.InternalMessageInfo +func (*StatusUpdate) ProtoMessage() {} -type isStatusUpdate_Event interface { - isStatusUpdate_Event() - MarshalTo([]byte) (int, error) - Size() int +func (x *StatusUpdate) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof" json:"mesosHeartbeat,omitempty"` +// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. +func (*StatusUpdate) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +func (x *StatusUpdate) GetLevel() StatusUpdate_Level { + if x != nil { + return x.Level + } + return StatusUpdate_DEBUG +} func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { if m != nil { @@ -557,91 +635,74 @@ func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { return nil } -func (m *StatusUpdate) GetLevel() StatusUpdate_Level { - if m != nil { - return m.Level - } - return StatusUpdate_DEBUG -} - -func (m *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := m.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { +func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { + if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { return x.MesosHeartbeat } return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*StatusUpdate) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), - } +type isStatusUpdate_Event interface { + isStatusUpdate_Event() +} + +type StatusUpdate_MesosHeartbeat struct { + MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto } +func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} + type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are valid to be assigned to Payload: + // Types that are assignable to Payload: // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Payload isEvent_Payload `protobuf_oneof:"Payload"` } -func (m *Event) Reset() { *m = Event{} } -func (m *Event) String() string { return proto.CompactTextString(m) } -func (*Event) ProtoMessage() {} -func (*Event) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{7} -} -func (m *Event) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Event) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Event.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *Event) XXX_Merge(src proto.Message) { - xxx_messageInfo_Event.Merge(m, src) -} -func (m *Event) XXX_Size() int { - return m.Size() -} -func (m *Event) XXX_DiscardUnknown() { - xxx_messageInfo_Event.DiscardUnknown(m) + +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_Event proto.InternalMessageInfo +func (*Event) ProtoMessage() {} -type isEvent_Payload interface { - isEvent_Payload() - MarshalTo([]byte) (int, error) - Size() int +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof" json:"environmentEvent,omitempty"` -} -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof" json:"taskEvent,omitempty"` -} -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof" json:"roleEvent,omitempty"` +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } -func (*Event_EnvironmentEvent) isEvent_Payload() {} -func (*Event_TaskEvent) isEvent_Payload() {} -func (*Event_RoleEvent) isEvent_Payload() {} +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} func (m *Event) GetPayload() isEvent_Payload { if m != nil { @@ -650,86 +711,92 @@ func (m *Event) GetPayload() isEvent_Payload { return nil } -func (m *Event) GetTimestamp() string { - if m != nil { - return m.Timestamp - } - return "" -} - -func (m *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := m.GetPayload().(*Event_EnvironmentEvent); ok { +func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { return x.EnvironmentEvent } return nil } -func (m *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := m.GetPayload().(*Event_TaskEvent); ok { +func (x *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := x.GetPayload().(*Event_TaskEvent); ok { return x.TaskEvent } return nil } -func (m *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := m.GetPayload().(*Event_RoleEvent); ok { +func (x *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := x.GetPayload().(*Event_RoleEvent); ok { return x.RoleEvent } return nil } -// XXX_OneofWrappers is for the internal use of the proto package. -func (*Event) XXX_OneofWrappers() []interface{} { - return []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), - } +type isEvent_Payload interface { + isEvent_Payload() +} + +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` +} + +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` +} + +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` } +func (*Event_EnvironmentEvent) isEvent_Payload() {} + +func (*Event_TaskEvent) isEvent_Payload() {} + +func (*Event_RoleEvent) isEvent_Payload() {} + type SubscribeRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } -func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } -func (*SubscribeRequest) ProtoMessage() {} -func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{8} -} -func (m *SubscribeRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SubscribeRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SubscribeRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SubscribeRequest) Reset() { + *x = SubscribeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SubscribeRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SubscribeRequest.Merge(m, src) -} -func (m *SubscribeRequest) XXX_Size() int { - return m.Size() + +func (x *SubscribeRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SubscribeRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SubscribeRequest.DiscardUnknown(m) + +func (*SubscribeRequest) ProtoMessage() {} + +func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SubscribeRequest proto.InternalMessageInfo +// Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. +func (*SubscribeRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{8} +} -func (m *SubscribeRequest) GetId() string { - if m != nil { - return m.Id +func (x *SubscribeRequest) GetId() string { + if x != nil { + return x.Id } return "" } @@ -738,1240 +805,1244 @@ func (m *SubscribeRequest) GetId() string { // Framework //////////////////////////////////////// type GetFrameworkInfoRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetFrameworkInfoRequest) Reset() { *m = GetFrameworkInfoRequest{} } -func (m *GetFrameworkInfoRequest) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoRequest) ProtoMessage() {} -func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{9} -} -func (m *GetFrameworkInfoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetFrameworkInfoRequest) Reset() { + *x = GetFrameworkInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetFrameworkInfoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoRequest.Merge(m, src) -} -func (m *GetFrameworkInfoRequest) XXX_Size() int { - return m.Size() -} -func (m *GetFrameworkInfoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoRequest.DiscardUnknown(m) + +func (x *GetFrameworkInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_GetFrameworkInfoRequest proto.InternalMessageInfo +func (*GetFrameworkInfoRequest) ProtoMessage() {} -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` - Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` - ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` - VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{10} -} -func (m *Version) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Version.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } + return mi.MessageOf(x) +} + +// Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{9} +} + +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major int32 `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=patch,proto3" json:"patch,omitempty"` + Build string `protobuf:"bytes,4,opt,name=build,proto3" json:"build,omitempty"` + ProductName string `protobuf:"bytes,5,opt,name=productName,proto3" json:"productName,omitempty"` + VersionStr string `protobuf:"bytes,6,opt,name=versionStr,proto3" json:"versionStr,omitempty"` } -func (m *Version) XXX_Merge(src proto.Message) { - xxx_messageInfo_Version.Merge(m, src) + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *Version) XXX_Size() int { - return m.Size() + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *Version) XXX_DiscardUnknown() { - xxx_messageInfo_Version.DiscardUnknown(m) + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_Version proto.InternalMessageInfo +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{10} +} -func (m *Version) GetMajor() int32 { - if m != nil { - return m.Major +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major } return 0 } -func (m *Version) GetMinor() int32 { - if m != nil { - return m.Minor +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor } return 0 } -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch } return 0 } -func (m *Version) GetBuild() string { - if m != nil { - return m.Build +func (x *Version) GetBuild() string { + if x != nil { + return x.Build } return "" } -func (m *Version) GetProductName() string { - if m != nil { - return m.ProductName +func (x *Version) GetProductName() string { + if x != nil { + return x.ProductName } return "" } -func (m *Version) GetVersionStr() string { - if m != nil { - return m.VersionStr +func (x *Version) GetVersionStr() string { + if x != nil { + return x.VersionStr } return "" } type GetFrameworkInfoReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetFrameworkInfoReply) Reset() { *m = GetFrameworkInfoReply{} } -func (m *GetFrameworkInfoReply) String() string { return proto.CompactTextString(m) } -func (*GetFrameworkInfoReply) ProtoMessage() {} -func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{11} -} -func (m *GetFrameworkInfoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetFrameworkInfoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetFrameworkInfoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` } -func (m *GetFrameworkInfoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetFrameworkInfoReply.Merge(m, src) + +func (x *GetFrameworkInfoReply) Reset() { + *x = GetFrameworkInfoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetFrameworkInfoReply) XXX_Size() int { - return m.Size() + +func (x *GetFrameworkInfoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetFrameworkInfoReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetFrameworkInfoReply.DiscardUnknown(m) + +func (*GetFrameworkInfoReply) ProtoMessage() {} + +func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetFrameworkInfoReply proto.InternalMessageInfo +// Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. +func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{11} +} -func (m *GetFrameworkInfoReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *GetFrameworkInfoReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { - if m != nil { - return m.EnvironmentsCount +func (x *GetFrameworkInfoReply) GetEnvironmentsCount() int32 { + if x != nil { + return x.EnvironmentsCount } return 0 } -func (m *GetFrameworkInfoReply) GetTasksCount() int32 { - if m != nil { - return m.TasksCount +func (x *GetFrameworkInfoReply) GetTasksCount() int32 { + if x != nil { + return x.TasksCount } return 0 } -func (m *GetFrameworkInfoReply) GetState() string { - if m != nil { - return m.State +func (x *GetFrameworkInfoReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *GetFrameworkInfoReply) GetHostsCount() int32 { - if m != nil { - return m.HostsCount +func (x *GetFrameworkInfoReply) GetHostsCount() int32 { + if x != nil { + return x.HostsCount } return 0 } -func (m *GetFrameworkInfoReply) GetInstanceName() string { - if m != nil { - return m.InstanceName +func (x *GetFrameworkInfoReply) GetInstanceName() string { + if x != nil { + return x.InstanceName } return "" } -func (m *GetFrameworkInfoReply) GetVersion() *Version { - if m != nil { - return m.Version +func (x *GetFrameworkInfoReply) GetVersion() *Version { + if x != nil { + return x.Version } return nil } // Not implemented yet type TeardownRequest struct { - Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reason string `protobuf:"bytes,1,opt,name=reason,proto3" json:"reason,omitempty"` } -func (m *TeardownRequest) Reset() { *m = TeardownRequest{} } -func (m *TeardownRequest) String() string { return proto.CompactTextString(m) } -func (*TeardownRequest) ProtoMessage() {} -func (*TeardownRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{12} -} -func (m *TeardownRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownRequest) Reset() { + *x = TeardownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownRequest.Merge(m, src) -} -func (m *TeardownRequest) XXX_Size() int { - return m.Size() + +func (x *TeardownRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TeardownRequest) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownRequest.DiscardUnknown(m) + +func (*TeardownRequest) ProtoMessage() {} + +func (x *TeardownRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TeardownRequest proto.InternalMessageInfo +// Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. +func (*TeardownRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{12} +} -func (m *TeardownRequest) GetReason() string { - if m != nil { - return m.Reason +func (x *TeardownRequest) GetReason() string { + if x != nil { + return x.Reason } return "" } type TeardownReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *TeardownReply) Reset() { *m = TeardownReply{} } -func (m *TeardownReply) String() string { return proto.CompactTextString(m) } -func (*TeardownReply) ProtoMessage() {} -func (*TeardownReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{13} -} -func (m *TeardownReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TeardownReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TeardownReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TeardownReply) Reset() { + *x = TeardownReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TeardownReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_TeardownReply.Merge(m, src) -} -func (m *TeardownReply) XXX_Size() int { - return m.Size() + +func (x *TeardownReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TeardownReply) XXX_DiscardUnknown() { - xxx_messageInfo_TeardownReply.DiscardUnknown(m) + +func (*TeardownReply) ProtoMessage() {} + +func (x *TeardownReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TeardownReply proto.InternalMessageInfo +// Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. +func (*TeardownReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{13} +} //////////////////////////////////////// // Environment //////////////////////////////////////// type GetEnvironmentsRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetEnvironmentsRequest) Reset() { *m = GetEnvironmentsRequest{} } -func (m *GetEnvironmentsRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsRequest) ProtoMessage() {} -func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{14} -} -func (m *GetEnvironmentsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsRequest) Reset() { + *x = GetEnvironmentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsRequest.Merge(m, src) -} -func (m *GetEnvironmentsRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsRequest.DiscardUnknown(m) + +func (*GetEnvironmentsRequest) ProtoMessage() {} + +func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{14} +} type GetEnvironmentsReply struct { - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` } -func (m *GetEnvironmentsReply) Reset() { *m = GetEnvironmentsReply{} } -func (m *GetEnvironmentsReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentsReply) ProtoMessage() {} -func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{15} -} -func (m *GetEnvironmentsReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentsReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentsReply) Reset() { + *x = GetEnvironmentsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentsReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentsReply.Merge(m, src) -} -func (m *GetEnvironmentsReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentsReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentsReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentsReply.DiscardUnknown(m) + +func (*GetEnvironmentsReply) ProtoMessage() {} + +func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentsReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{15} +} -func (m *GetEnvironmentsReply) GetFrameworkId() string { - if m != nil { - return m.FrameworkId +func (x *GetEnvironmentsReply) GetFrameworkId() string { + if x != nil { + return x.FrameworkId } return "" } -func (m *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { - if m != nil { - return m.Environments +func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { + if x != nil { + return x.Environments } return nil } type EnvironmentInfo struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *EnvironmentInfo) Reset() { *m = EnvironmentInfo{} } -func (m *EnvironmentInfo) String() string { return proto.CompactTextString(m) } -func (*EnvironmentInfo) ProtoMessage() {} -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{16} -} -func (m *EnvironmentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` } -func (m *EnvironmentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentInfo.Merge(m, src) + +func (x *EnvironmentInfo) Reset() { + *x = EnvironmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *EnvironmentInfo) XXX_Size() int { - return m.Size() + +func (x *EnvironmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EnvironmentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentInfo.DiscardUnknown(m) + +func (*EnvironmentInfo) ProtoMessage() {} + +func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EnvironmentInfo proto.InternalMessageInfo +// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{16} +} -func (m *EnvironmentInfo) GetId() string { - if m != nil { - return m.Id +func (x *EnvironmentInfo) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *EnvironmentInfo) GetCreatedWhen() string { - if m != nil { - return m.CreatedWhen +func (x *EnvironmentInfo) GetCreatedWhen() string { + if x != nil { + return x.CreatedWhen } return "" } -func (m *EnvironmentInfo) GetState() string { - if m != nil { - return m.State +func (x *EnvironmentInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *EnvironmentInfo) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *EnvironmentInfo) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } -func (m *EnvironmentInfo) GetRootRole() string { - if m != nil { - return m.RootRole +func (x *EnvironmentInfo) GetRootRole() string { + if x != nil { + return x.RootRole } return "" } -func (m *EnvironmentInfo) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *EnvironmentInfo) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } -func (m *EnvironmentInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *EnvironmentInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } return nil } -func (m *EnvironmentInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *EnvironmentInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *EnvironmentInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *EnvironmentInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } return nil } +func (x *EnvironmentInfo) GetNumberOfFlps() int32 { + if x != nil { + return x.NumberOfFlps + } + return 0 +} + type NewEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *NewEnvironmentRequest) Reset() { *m = NewEnvironmentRequest{} } -func (m *NewEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentRequest) ProtoMessage() {} -func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{17} -} -func (m *NewEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentRequest) Reset() { + *x = NewEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentRequest.Merge(m, src) -} -func (m *NewEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *NewEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentRequest.DiscardUnknown(m) + +func (*NewEnvironmentRequest) ProtoMessage() {} + +func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{17} +} -func (m *NewEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *NewEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *NewEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } type NewEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` } -func (m *NewEnvironmentReply) Reset() { *m = NewEnvironmentReply{} } -func (m *NewEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewEnvironmentReply) ProtoMessage() {} -func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{18} -} -func (m *NewEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewEnvironmentReply) Reset() { + *x = NewEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewEnvironmentReply.Merge(m, src) -} -func (m *NewEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *NewEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewEnvironmentReply.DiscardUnknown(m) + +func (*NewEnvironmentReply) ProtoMessage() {} + +func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18} +} -func (m *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } return nil } type NewAutoEnvironmentRequest struct { - WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` - Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` + Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` } -func (m *NewAutoEnvironmentRequest) Reset() { *m = NewAutoEnvironmentRequest{} } -func (m *NewAutoEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentRequest) ProtoMessage() {} -func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{19} -} -func (m *NewAutoEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewAutoEnvironmentRequest) Reset() { + *x = NewAutoEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentRequest.Merge(m, src) -} -func (m *NewAutoEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *NewAutoEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentRequest.DiscardUnknown(m) + +func (*NewAutoEnvironmentRequest) ProtoMessage() {} + +func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewAutoEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{19} +} -func (m *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { - if m != nil { - return m.WorkflowTemplate +func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { + if x != nil { + return x.WorkflowTemplate } return "" } -func (m *NewAutoEnvironmentRequest) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *NewAutoEnvironmentRequest) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *NewAutoEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *NewAutoEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } type NewAutoEnvironmentReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *NewAutoEnvironmentReply) Reset() { *m = NewAutoEnvironmentReply{} } -func (m *NewAutoEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*NewAutoEnvironmentReply) ProtoMessage() {} -func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{20} -} -func (m *NewAutoEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *NewAutoEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_NewAutoEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *NewAutoEnvironmentReply) Reset() { + *x = NewAutoEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *NewAutoEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_NewAutoEnvironmentReply.Merge(m, src) -} -func (m *NewAutoEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *NewAutoEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *NewAutoEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_NewAutoEnvironmentReply.DiscardUnknown(m) + +func (*NewAutoEnvironmentReply) ProtoMessage() {} + +func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_NewAutoEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. +func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{20} +} type GetEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` } -func (m *GetEnvironmentRequest) Reset() { *m = GetEnvironmentRequest{} } -func (m *GetEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentRequest) ProtoMessage() {} -func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{21} -} -func (m *GetEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentRequest) Reset() { + *x = GetEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentRequest.Merge(m, src) -} -func (m *GetEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentRequest.DiscardUnknown(m) + +func (*GetEnvironmentRequest) ProtoMessage() {} + +func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{21} +} -func (m *GetEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } type GetEnvironmentReply struct { - Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` - Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` } -func (m *GetEnvironmentReply) Reset() { *m = GetEnvironmentReply{} } -func (m *GetEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentReply) ProtoMessage() {} -func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{22} -} -func (m *GetEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentReply) Reset() { + *x = GetEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentReply.Merge(m, src) -} -func (m *GetEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentReply.DiscardUnknown(m) + +func (*GetEnvironmentReply) ProtoMessage() {} + +func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{22} +} -func (m *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { - if m != nil { - return m.Environment +func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { + if x != nil { + return x.Environment } return nil } -func (m *GetEnvironmentReply) GetWorkflow() *RoleInfo { - if m != nil { - return m.Workflow +func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { + if x != nil { + return x.Workflow } return nil } type ControlEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` } -func (m *ControlEnvironmentRequest) Reset() { *m = ControlEnvironmentRequest{} } -func (m *ControlEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentRequest) ProtoMessage() {} -func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{23} -} -func (m *ControlEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentRequest) Reset() { + *x = ControlEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ControlEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentRequest.Merge(m, src) -} -func (m *ControlEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentRequest.DiscardUnknown(m) + +func (*ControlEnvironmentRequest) ProtoMessage() {} + +func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{23} +} -func (m *ControlEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *ControlEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { - if m != nil { - return m.Type +func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { + if x != nil { + return x.Type } return ControlEnvironmentRequest_NOOP } type ControlEnvironmentReply struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` } -func (m *ControlEnvironmentReply) Reset() { *m = ControlEnvironmentReply{} } -func (m *ControlEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ControlEnvironmentReply) ProtoMessage() {} -func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{24} -} -func (m *ControlEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ControlEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ControlEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ControlEnvironmentReply) Reset() { + *x = ControlEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ControlEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ControlEnvironmentReply.Merge(m, src) -} -func (m *ControlEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *ControlEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ControlEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ControlEnvironmentReply.DiscardUnknown(m) + +func (*ControlEnvironmentReply) ProtoMessage() {} + +func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ControlEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{24} +} -func (m *ControlEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *ControlEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ControlEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *ControlEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } -func (m *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { - if m != nil { - return m.CurrentRunNumber +func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber } return 0 } type ModifyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` - ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Operations []*EnvironmentOperation `protobuf:"bytes,2,rep,name=operations,proto3" json:"operations,omitempty"` + ReconfigureAll bool `protobuf:"varint,3,opt,name=reconfigureAll,proto3" json:"reconfigureAll,omitempty"` } -func (m *ModifyEnvironmentRequest) Reset() { *m = ModifyEnvironmentRequest{} } -func (m *ModifyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentRequest) ProtoMessage() {} -func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{25} -} -func (m *ModifyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ModifyEnvironmentRequest) Reset() { + *x = ModifyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentRequest.Merge(m, src) -} -func (m *ModifyEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ModifyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentRequest.DiscardUnknown(m) + +func (*ModifyEnvironmentRequest) ProtoMessage() {} + +func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ModifyEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{25} +} -func (m *ModifyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *ModifyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { - if m != nil { - return m.Operations +func (x *ModifyEnvironmentRequest) GetOperations() []*EnvironmentOperation { + if x != nil { + return x.Operations } return nil } -func (m *ModifyEnvironmentRequest) GetReconfigureAll() bool { - if m != nil { - return m.ReconfigureAll +func (x *ModifyEnvironmentRequest) GetReconfigureAll() bool { + if x != nil { + return x.ReconfigureAll } return false } type EnvironmentOperation struct { - Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` - RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Type EnvironmentOperation_Optype `protobuf:"varint,1,opt,name=type,proto3,enum=o2control.EnvironmentOperation_Optype" json:"type,omitempty"` + RoleName string `protobuf:"bytes,2,opt,name=roleName,proto3" json:"roleName,omitempty"` } -func (m *EnvironmentOperation) Reset() { *m = EnvironmentOperation{} } -func (m *EnvironmentOperation) String() string { return proto.CompactTextString(m) } -func (*EnvironmentOperation) ProtoMessage() {} -func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{26} -} -func (m *EnvironmentOperation) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *EnvironmentOperation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_EnvironmentOperation.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *EnvironmentOperation) Reset() { + *x = EnvironmentOperation{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *EnvironmentOperation) XXX_Merge(src proto.Message) { - xxx_messageInfo_EnvironmentOperation.Merge(m, src) -} -func (m *EnvironmentOperation) XXX_Size() int { - return m.Size() + +func (x *EnvironmentOperation) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *EnvironmentOperation) XXX_DiscardUnknown() { - xxx_messageInfo_EnvironmentOperation.DiscardUnknown(m) + +func (*EnvironmentOperation) ProtoMessage() {} + +func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_EnvironmentOperation proto.InternalMessageInfo +// Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. +func (*EnvironmentOperation) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{26} +} -func (m *EnvironmentOperation) GetType() EnvironmentOperation_Optype { - if m != nil { - return m.Type +func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { + if x != nil { + return x.Type } return EnvironmentOperation_NOOP } -func (m *EnvironmentOperation) GetRoleName() string { - if m != nil { - return m.RoleName +func (x *EnvironmentOperation) GetRoleName() string { + if x != nil { + return x.RoleName } return "" } type ModifyEnvironmentReply struct { - FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` - Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FailedOperations []*EnvironmentOperation `protobuf:"bytes,1,rep,name=failedOperations,proto3" json:"failedOperations,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` } -func (m *ModifyEnvironmentReply) Reset() { *m = ModifyEnvironmentReply{} } -func (m *ModifyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*ModifyEnvironmentReply) ProtoMessage() {} -func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{27} -} -func (m *ModifyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ModifyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ModifyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ModifyEnvironmentReply) Reset() { + *x = ModifyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ModifyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ModifyEnvironmentReply.Merge(m, src) -} -func (m *ModifyEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *ModifyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ModifyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_ModifyEnvironmentReply.DiscardUnknown(m) + +func (*ModifyEnvironmentReply) ProtoMessage() {} + +func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ModifyEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{27} +} -func (m *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { - if m != nil { - return m.FailedOperations +func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { + if x != nil { + return x.FailedOperations } return nil } -func (m *ModifyEnvironmentReply) GetId() string { - if m != nil { - return m.Id +func (x *ModifyEnvironmentReply) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *ModifyEnvironmentReply) GetState() string { - if m != nil { - return m.State +func (x *ModifyEnvironmentReply) GetState() string { + if x != nil { + return x.State } return "" } type DestroyEnvironmentRequest struct { - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *DestroyEnvironmentRequest) Reset() { *m = DestroyEnvironmentRequest{} } -func (m *DestroyEnvironmentRequest) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentRequest) ProtoMessage() {} -func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{28} -} -func (m *DestroyEnvironmentRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` } -func (m *DestroyEnvironmentRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentRequest.Merge(m, src) + +func (x *DestroyEnvironmentRequest) Reset() { + *x = DestroyEnvironmentRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *DestroyEnvironmentRequest) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentRequest) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentRequest.DiscardUnknown(m) + +func (*DestroyEnvironmentRequest) ProtoMessage() {} + +func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DestroyEnvironmentRequest proto.InternalMessageInfo +// Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{28} +} -func (m *DestroyEnvironmentRequest) GetId() string { - if m != nil { - return m.Id +func (x *DestroyEnvironmentRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *DestroyEnvironmentRequest) GetKeepTasks() bool { - if m != nil { - return m.KeepTasks +func (x *DestroyEnvironmentRequest) GetKeepTasks() bool { + if x != nil { + return x.KeepTasks } return false } -func (m *DestroyEnvironmentRequest) GetAllowInRunningState() bool { - if m != nil { - return m.AllowInRunningState +func (x *DestroyEnvironmentRequest) GetAllowInRunningState() bool { + if x != nil { + return x.AllowInRunningState } return false } -func (m *DestroyEnvironmentRequest) GetForce() bool { - if m != nil { - return m.Force +func (x *DestroyEnvironmentRequest) GetForce() bool { + if x != nil { + return x.Force } return false } type DestroyEnvironmentReply struct { - CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` } -func (m *DestroyEnvironmentReply) Reset() { *m = DestroyEnvironmentReply{} } -func (m *DestroyEnvironmentReply) String() string { return proto.CompactTextString(m) } -func (*DestroyEnvironmentReply) ProtoMessage() {} -func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{29} -} -func (m *DestroyEnvironmentReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *DestroyEnvironmentReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_DestroyEnvironmentReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *DestroyEnvironmentReply) Reset() { + *x = DestroyEnvironmentReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *DestroyEnvironmentReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_DestroyEnvironmentReply.Merge(m, src) -} -func (m *DestroyEnvironmentReply) XXX_Size() int { - return m.Size() + +func (x *DestroyEnvironmentReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *DestroyEnvironmentReply) XXX_DiscardUnknown() { - xxx_messageInfo_DestroyEnvironmentReply.DiscardUnknown(m) + +func (*DestroyEnvironmentReply) ProtoMessage() {} + +func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[29] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_DestroyEnvironmentReply proto.InternalMessageInfo +// Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. +func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{29} +} -func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { - if m != nil { - return m.CleanupTasksReply +func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { + if x != nil { + return x.CleanupTasksReply } return nil } @@ -1980,210 +2051,209 @@ func (m *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { // Environment, GET/SET properties //////////////////////////////////////// type SetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // If properties == nil, the core sets nothing // and reply ok - Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Properties map[string]string `protobuf:"bytes,2,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *SetEnvironmentPropertiesRequest) Reset() { *m = SetEnvironmentPropertiesRequest{} } -func (m *SetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{30} -} -func (m *SetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesRequest) Reset() { + *x = SetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *SetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() -} -func (m *SetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (x *SetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesRequest proto.InternalMessageInfo +func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} -func (m *SetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} + +func (x *SetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *SetEnvironmentPropertiesRequest) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } type SetEnvironmentPropertiesReply struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *SetEnvironmentPropertiesReply) Reset() { *m = SetEnvironmentPropertiesReply{} } -func (m *SetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*SetEnvironmentPropertiesReply) ProtoMessage() {} -func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{31} -} -func (m *SetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *SetEnvironmentPropertiesReply) Reset() { + *x = SetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *SetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (x *SetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (*SetEnvironmentPropertiesReply) ProtoMessage() {} + +func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_SetEnvironmentPropertiesReply proto.InternalMessageInfo +// Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} +} type GetEnvironmentPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` // If len(queries) == 0, we return an // empty map. // To retrieve all KVs, use query '*' - Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` - ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Queries []string `protobuf:"bytes,2,rep,name=queries,proto3" json:"queries,omitempty"` + ExcludeGlobals bool `protobuf:"varint,3,opt,name=excludeGlobals,proto3" json:"excludeGlobals,omitempty"` } -func (m *GetEnvironmentPropertiesRequest) Reset() { *m = GetEnvironmentPropertiesRequest{} } -func (m *GetEnvironmentPropertiesRequest) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} -func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{32} -} -func (m *GetEnvironmentPropertiesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesRequest) Reset() { + *x = GetEnvironmentPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentPropertiesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesRequest.Merge(m, src) -} -func (m *GetEnvironmentPropertiesRequest) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesRequest.DiscardUnknown(m) + +func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentPropertiesRequest proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{32} +} -func (m *GetEnvironmentPropertiesRequest) GetId() string { - if m != nil { - return m.Id +func (x *GetEnvironmentPropertiesRequest) GetId() string { + if x != nil { + return x.Id } return "" } -func (m *GetEnvironmentPropertiesRequest) GetQueries() []string { - if m != nil { - return m.Queries +func (x *GetEnvironmentPropertiesRequest) GetQueries() []string { + if x != nil { + return x.Queries } return nil } -func (m *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { - if m != nil { - return m.ExcludeGlobals +func (x *GetEnvironmentPropertiesRequest) GetExcludeGlobals() bool { + if x != nil { + return x.ExcludeGlobals } return false } type GetEnvironmentPropertiesReply struct { - Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Properties map[string]string `protobuf:"bytes,1,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *GetEnvironmentPropertiesReply) Reset() { *m = GetEnvironmentPropertiesReply{} } -func (m *GetEnvironmentPropertiesReply) String() string { return proto.CompactTextString(m) } -func (*GetEnvironmentPropertiesReply) ProtoMessage() {} -func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{33} -} -func (m *GetEnvironmentPropertiesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetEnvironmentPropertiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetEnvironmentPropertiesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetEnvironmentPropertiesReply) Reset() { + *x = GetEnvironmentPropertiesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetEnvironmentPropertiesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetEnvironmentPropertiesReply.Merge(m, src) -} -func (m *GetEnvironmentPropertiesReply) XXX_Size() int { - return m.Size() + +func (x *GetEnvironmentPropertiesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetEnvironmentPropertiesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetEnvironmentPropertiesReply.DiscardUnknown(m) + +func (*GetEnvironmentPropertiesReply) ProtoMessage() {} + +func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetEnvironmentPropertiesReply proto.InternalMessageInfo +// Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. +func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{33} +} -func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } @@ -2192,765 +2262,764 @@ func (m *GetEnvironmentPropertiesReply) GetProperties() map[string]string { // Tasks //////////////////////////////////////// type ShortTaskInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` - TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` - Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` - SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ShortTaskInfo) Reset() { *m = ShortTaskInfo{} } -func (m *ShortTaskInfo) String() string { return proto.CompactTextString(m) } -func (*ShortTaskInfo) ProtoMessage() {} -func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{34} -} -func (m *ShortTaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ShortTaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ShortTaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Locked bool `protobuf:"varint,2,opt,name=locked,proto3" json:"locked,omitempty"` + TaskId string `protobuf:"bytes,3,opt,name=taskId,proto3" json:"taskId,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` + Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` + SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` } -func (m *ShortTaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ShortTaskInfo.Merge(m, src) + +func (x *ShortTaskInfo) Reset() { + *x = ShortTaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *ShortTaskInfo) XXX_Size() int { - return m.Size() + +func (x *ShortTaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ShortTaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ShortTaskInfo.DiscardUnknown(m) + +func (*ShortTaskInfo) ProtoMessage() {} + +func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[34] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ShortTaskInfo proto.InternalMessageInfo +// Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. +func (*ShortTaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{34} +} -func (m *ShortTaskInfo) GetName() string { - if m != nil { - return m.Name +func (x *ShortTaskInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *ShortTaskInfo) GetLocked() bool { - if m != nil { - return m.Locked +func (x *ShortTaskInfo) GetLocked() bool { + if x != nil { + return x.Locked } return false } -func (m *ShortTaskInfo) GetTaskId() string { - if m != nil { - return m.TaskId +func (x *ShortTaskInfo) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } -func (m *ShortTaskInfo) GetStatus() string { - if m != nil { - return m.Status +func (x *ShortTaskInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *ShortTaskInfo) GetState() string { - if m != nil { - return m.State +func (x *ShortTaskInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *ShortTaskInfo) GetClassName() string { - if m != nil { - return m.ClassName +func (x *ShortTaskInfo) GetClassName() string { + if x != nil { + return x.ClassName } return "" } -func (m *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { - if m != nil { - return m.DeploymentInfo +func (x *ShortTaskInfo) GetDeploymentInfo() *TaskDeploymentInfo { + if x != nil { + return x.DeploymentInfo } return nil } -func (m *ShortTaskInfo) GetPid() string { - if m != nil { - return m.Pid +func (x *ShortTaskInfo) GetPid() string { + if x != nil { + return x.Pid } return "" } -func (m *ShortTaskInfo) GetSandboxStdout() string { - if m != nil { - return m.SandboxStdout +func (x *ShortTaskInfo) GetSandboxStdout() string { + if x != nil { + return x.SandboxStdout } return "" } type TaskDeploymentInfo struct { - Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` - AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` - OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` - ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskDeploymentInfo) Reset() { *m = TaskDeploymentInfo{} } -func (m *TaskDeploymentInfo) String() string { return proto.CompactTextString(m) } -func (*TaskDeploymentInfo) ProtoMessage() {} -func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{35} -} -func (m *TaskDeploymentInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskDeploymentInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskDeploymentInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + AgentId string `protobuf:"bytes,2,opt,name=agentId,proto3" json:"agentId,omitempty"` + OfferId string `protobuf:"bytes,3,opt,name=offerId,proto3" json:"offerId,omitempty"` + ExecutorId string `protobuf:"bytes,4,opt,name=executorId,proto3" json:"executorId,omitempty"` } -func (m *TaskDeploymentInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskDeploymentInfo.Merge(m, src) + +func (x *TaskDeploymentInfo) Reset() { + *x = TaskDeploymentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TaskDeploymentInfo) XXX_Size() int { - return m.Size() + +func (x *TaskDeploymentInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskDeploymentInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskDeploymentInfo.DiscardUnknown(m) + +func (*TaskDeploymentInfo) ProtoMessage() {} + +func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[35] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskDeploymentInfo proto.InternalMessageInfo +// Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. +func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{35} +} -func (m *TaskDeploymentInfo) GetHostname() string { - if m != nil { - return m.Hostname +func (x *TaskDeploymentInfo) GetHostname() string { + if x != nil { + return x.Hostname } return "" } -func (m *TaskDeploymentInfo) GetAgentId() string { - if m != nil { - return m.AgentId +func (x *TaskDeploymentInfo) GetAgentId() string { + if x != nil { + return x.AgentId } return "" } -func (m *TaskDeploymentInfo) GetOfferId() string { - if m != nil { - return m.OfferId +func (x *TaskDeploymentInfo) GetOfferId() string { + if x != nil { + return x.OfferId } return "" } -func (m *TaskDeploymentInfo) GetExecutorId() string { - if m != nil { - return m.ExecutorId +func (x *TaskDeploymentInfo) GetExecutorId() string { + if x != nil { + return x.ExecutorId } return "" } type GetTasksRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *GetTasksRequest) Reset() { *m = GetTasksRequest{} } -func (m *GetTasksRequest) String() string { return proto.CompactTextString(m) } -func (*GetTasksRequest) ProtoMessage() {} -func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{36} -} -func (m *GetTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksRequest) Reset() { + *x = GetTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksRequest.Merge(m, src) -} -func (m *GetTasksRequest) XXX_Size() int { - return m.Size() + +func (x *GetTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksRequest.DiscardUnknown(m) + +func (*GetTasksRequest) ProtoMessage() {} + +func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[36] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTasksRequest proto.InternalMessageInfo +// Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. +func (*GetTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{36} +} type GetTasksReply struct { - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` } -func (m *GetTasksReply) Reset() { *m = GetTasksReply{} } -func (m *GetTasksReply) String() string { return proto.CompactTextString(m) } -func (*GetTasksReply) ProtoMessage() {} -func (*GetTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{37} -} -func (m *GetTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTasksReply) Reset() { + *x = GetTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTasksReply.Merge(m, src) -} -func (m *GetTasksReply) XXX_Size() int { - return m.Size() + +func (x *GetTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTasksReply.DiscardUnknown(m) + +func (*GetTasksReply) ProtoMessage() {} + +func (x *GetTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTasksReply proto.InternalMessageInfo +// Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. +func (*GetTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{37} +} -func (m *GetTasksReply) GetTasks() []*ShortTaskInfo { - if m != nil { - return m.Tasks +func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { + if x != nil { + return x.Tasks } return nil } type GetTaskRequest struct { - TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskId string `protobuf:"bytes,1,opt,name=taskId,proto3" json:"taskId,omitempty"` } -func (m *GetTaskRequest) Reset() { *m = GetTaskRequest{} } -func (m *GetTaskRequest) String() string { return proto.CompactTextString(m) } -func (*GetTaskRequest) ProtoMessage() {} -func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{38} -} -func (m *GetTaskRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTaskRequest) Reset() { + *x = GetTaskRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTaskRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskRequest.Merge(m, src) -} -func (m *GetTaskRequest) XXX_Size() int { - return m.Size() + +func (x *GetTaskRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskRequest.DiscardUnknown(m) + +func (*GetTaskRequest) ProtoMessage() {} + +func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTaskRequest proto.InternalMessageInfo +// Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. +func (*GetTaskRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{38} +} -func (m *GetTaskRequest) GetTaskId() string { - if m != nil { - return m.TaskId +func (x *GetTaskRequest) GetTaskId() string { + if x != nil { + return x.TaskId } return "" } type GetTaskReply struct { - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` } -func (m *GetTaskReply) Reset() { *m = GetTaskReply{} } -func (m *GetTaskReply) String() string { return proto.CompactTextString(m) } -func (*GetTaskReply) ProtoMessage() {} -func (*GetTaskReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{39} -} -func (m *GetTaskReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetTaskReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetTaskReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetTaskReply) Reset() { + *x = GetTaskReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetTaskReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetTaskReply.Merge(m, src) -} -func (m *GetTaskReply) XXX_Size() int { - return m.Size() + +func (x *GetTaskReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetTaskReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetTaskReply.DiscardUnknown(m) + +func (*GetTaskReply) ProtoMessage() {} + +func (x *GetTaskReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[39] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetTaskReply proto.InternalMessageInfo +// Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. +func (*GetTaskReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{39} +} -func (m *GetTaskReply) GetTask() *TaskInfo { - if m != nil { - return m.Task +func (x *GetTaskReply) GetTask() *TaskInfo { + if x != nil { + return x.Task } return nil } type TaskClassInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` } -func (m *TaskClassInfo) Reset() { *m = TaskClassInfo{} } -func (m *TaskClassInfo) String() string { return proto.CompactTextString(m) } -func (*TaskClassInfo) ProtoMessage() {} -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{40} -} -func (m *TaskClassInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskClassInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskClassInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *TaskClassInfo) Reset() { + *x = TaskClassInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *TaskClassInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskClassInfo.Merge(m, src) -} -func (m *TaskClassInfo) XXX_Size() int { - return m.Size() + +func (x *TaskClassInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskClassInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskClassInfo.DiscardUnknown(m) + +func (*TaskClassInfo) ProtoMessage() {} + +func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[40] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskClassInfo proto.InternalMessageInfo +// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. +func (*TaskClassInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{40} +} -func (m *TaskClassInfo) GetName() string { - if m != nil { - return m.Name +func (x *TaskClassInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *TaskClassInfo) GetControlMode() string { - if m != nil { - return m.ControlMode +func (x *TaskClassInfo) GetControlMode() string { + if x != nil { + return x.ControlMode } return "" } type CommandInfo struct { - Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` - Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` - Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` - Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` - User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *CommandInfo) Reset() { *m = CommandInfo{} } -func (m *CommandInfo) String() string { return proto.CompactTextString(m) } -func (*CommandInfo) ProtoMessage() {} -func (*CommandInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{41} -} -func (m *CommandInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CommandInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CommandInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Env []string `protobuf:"bytes,1,rep,name=env,proto3" json:"env,omitempty"` + Shell bool `protobuf:"varint,2,opt,name=shell,proto3" json:"shell,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Arguments []string `protobuf:"bytes,4,rep,name=arguments,proto3" json:"arguments,omitempty"` + User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` } -func (m *CommandInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_CommandInfo.Merge(m, src) + +func (x *CommandInfo) Reset() { + *x = CommandInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *CommandInfo) XXX_Size() int { - return m.Size() + +func (x *CommandInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CommandInfo) XXX_DiscardUnknown() { - xxx_messageInfo_CommandInfo.DiscardUnknown(m) + +func (*CommandInfo) ProtoMessage() {} + +func (x *CommandInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[41] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CommandInfo proto.InternalMessageInfo +// Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. +func (*CommandInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{41} +} -func (m *CommandInfo) GetEnv() []string { - if m != nil { - return m.Env +func (x *CommandInfo) GetEnv() []string { + if x != nil { + return x.Env } return nil } -func (m *CommandInfo) GetShell() bool { - if m != nil { - return m.Shell +func (x *CommandInfo) GetShell() bool { + if x != nil { + return x.Shell } return false } -func (m *CommandInfo) GetValue() string { - if m != nil { - return m.Value +func (x *CommandInfo) GetValue() string { + if x != nil { + return x.Value } return "" } -func (m *CommandInfo) GetArguments() []string { - if m != nil { - return m.Arguments +func (x *CommandInfo) GetArguments() []string { + if x != nil { + return x.Arguments } return nil } -func (m *CommandInfo) GetUser() string { - if m != nil { - return m.User +func (x *CommandInfo) GetUser() string { + if x != nil { + return x.User } return "" } type ChannelInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` + Target string `protobuf:"bytes,3,opt,name=target,proto3" json:"target,omitempty"` } -func (m *ChannelInfo) Reset() { *m = ChannelInfo{} } -func (m *ChannelInfo) String() string { return proto.CompactTextString(m) } -func (*ChannelInfo) ProtoMessage() {} -func (*ChannelInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{42} -} -func (m *ChannelInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ChannelInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ChannelInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ChannelInfo) Reset() { + *x = ChannelInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ChannelInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelInfo.Merge(m, src) -} -func (m *ChannelInfo) XXX_Size() int { - return m.Size() + +func (x *ChannelInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ChannelInfo) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelInfo.DiscardUnknown(m) + +func (*ChannelInfo) ProtoMessage() {} + +func (x *ChannelInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ChannelInfo proto.InternalMessageInfo +// Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. +func (*ChannelInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{42} +} -func (m *ChannelInfo) GetName() string { - if m != nil { - return m.Name +func (x *ChannelInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *ChannelInfo) GetType() string { - if m != nil { - return m.Type +func (x *ChannelInfo) GetType() string { + if x != nil { + return x.Type } return "" } -func (m *ChannelInfo) GetTarget() string { - if m != nil { - return m.Target +func (x *ChannelInfo) GetTarget() string { + if x != nil { + return x.Target } return "" } type TaskInfo struct { - ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` - InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` - OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` - CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` - TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` - EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` - Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *TaskInfo) Reset() { *m = TaskInfo{} } -func (m *TaskInfo) String() string { return proto.CompactTextString(m) } -func (*TaskInfo) ProtoMessage() {} -func (*TaskInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{43} -} -func (m *TaskInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *TaskInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_TaskInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` + ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` + InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` + OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` + CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` + TaskPath string `protobuf:"bytes,6,opt,name=taskPath,proto3" json:"taskPath,omitempty"` + EnvId string `protobuf:"bytes,7,opt,name=envId,proto3" json:"envId,omitempty"` + Properties map[string]string `protobuf:"bytes,9,rep,name=properties,proto3" json:"properties,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *TaskInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_TaskInfo.Merge(m, src) + +func (x *TaskInfo) Reset() { + *x = TaskInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *TaskInfo) XXX_Size() int { - return m.Size() + +func (x *TaskInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *TaskInfo) XXX_DiscardUnknown() { - xxx_messageInfo_TaskInfo.DiscardUnknown(m) + +func (*TaskInfo) ProtoMessage() {} + +func (x *TaskInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_TaskInfo proto.InternalMessageInfo +// Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. +func (*TaskInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{43} +} -func (m *TaskInfo) GetShortInfo() *ShortTaskInfo { - if m != nil { - return m.ShortInfo +func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { + if x != nil { + return x.ShortInfo } return nil } -func (m *TaskInfo) GetClassInfo() *TaskClassInfo { - if m != nil { - return m.ClassInfo +func (x *TaskInfo) GetClassInfo() *TaskClassInfo { + if x != nil { + return x.ClassInfo } return nil } -func (m *TaskInfo) GetInboundChannels() []*ChannelInfo { - if m != nil { - return m.InboundChannels +func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { + if x != nil { + return x.InboundChannels } return nil } -func (m *TaskInfo) GetOutboundChannels() []*ChannelInfo { - if m != nil { - return m.OutboundChannels +func (x *TaskInfo) GetOutboundChannels() []*ChannelInfo { + if x != nil { + return x.OutboundChannels } return nil } -func (m *TaskInfo) GetCommandInfo() *CommandInfo { - if m != nil { - return m.CommandInfo +func (x *TaskInfo) GetCommandInfo() *CommandInfo { + if x != nil { + return x.CommandInfo } return nil } -func (m *TaskInfo) GetTaskPath() string { - if m != nil { - return m.TaskPath +func (x *TaskInfo) GetTaskPath() string { + if x != nil { + return x.TaskPath } return "" } -func (m *TaskInfo) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *TaskInfo) GetEnvId() string { + if x != nil { + return x.EnvId } return "" } -func (m *TaskInfo) GetProperties() map[string]string { - if m != nil { - return m.Properties +func (x *TaskInfo) GetProperties() map[string]string { + if x != nil { + return x.Properties } return nil } type CleanupTasksRequest struct { - TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TaskIds []string `protobuf:"bytes,1,rep,name=taskIds,proto3" json:"taskIds,omitempty"` } -func (m *CleanupTasksRequest) Reset() { *m = CleanupTasksRequest{} } -func (m *CleanupTasksRequest) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksRequest) ProtoMessage() {} -func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{44} -} -func (m *CleanupTasksRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CleanupTasksRequest) Reset() { + *x = CleanupTasksRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *CleanupTasksRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksRequest.Merge(m, src) -} -func (m *CleanupTasksRequest) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksRequest) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksRequest.DiscardUnknown(m) + +func (*CleanupTasksRequest) ProtoMessage() {} + +func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CleanupTasksRequest proto.InternalMessageInfo +// Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. +func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44} +} -func (m *CleanupTasksRequest) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *CleanupTasksRequest) GetTaskIds() []string { + if x != nil { + return x.TaskIds } return nil } type CleanupTasksReply struct { - KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` - RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` + RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` } -func (m *CleanupTasksReply) Reset() { *m = CleanupTasksReply{} } -func (m *CleanupTasksReply) String() string { return proto.CompactTextString(m) } -func (*CleanupTasksReply) ProtoMessage() {} -func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{45} -} -func (m *CleanupTasksReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *CleanupTasksReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_CleanupTasksReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *CleanupTasksReply) Reset() { + *x = CleanupTasksReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *CleanupTasksReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_CleanupTasksReply.Merge(m, src) -} -func (m *CleanupTasksReply) XXX_Size() int { - return m.Size() + +func (x *CleanupTasksReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *CleanupTasksReply) XXX_DiscardUnknown() { - xxx_messageInfo_CleanupTasksReply.DiscardUnknown(m) + +func (*CleanupTasksReply) ProtoMessage() {} + +func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_CleanupTasksReply proto.InternalMessageInfo +// Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. +func (*CleanupTasksReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{45} +} -func (m *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { - if m != nil { - return m.KilledTasks +func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { + if x != nil { + return x.KilledTasks } return nil } -func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { - if m != nil { - return m.RunningTasks +func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { + if x != nil { + return x.RunningTasks } return nil } @@ -2959,16344 +3028,2696 @@ func (m *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { // Roles //////////////////////////////////////// type GetRolesRequest struct { - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + PathSpec string `protobuf:"bytes,2,opt,name=pathSpec,proto3" json:"pathSpec,omitempty"` } -func (m *GetRolesRequest) Reset() { *m = GetRolesRequest{} } -func (m *GetRolesRequest) String() string { return proto.CompactTextString(m) } -func (*GetRolesRequest) ProtoMessage() {} -func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{46} -} -func (m *GetRolesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetRolesRequest) Reset() { + *x = GetRolesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetRolesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesRequest.Merge(m, src) -} -func (m *GetRolesRequest) XXX_Size() int { - return m.Size() + +func (x *GetRolesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetRolesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesRequest.DiscardUnknown(m) + +func (*GetRolesRequest) ProtoMessage() {} + +func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetRolesRequest proto.InternalMessageInfo +// Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. +func (*GetRolesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{46} +} -func (m *GetRolesRequest) GetEnvId() string { - if m != nil { - return m.EnvId +func (x *GetRolesRequest) GetEnvId() string { + if x != nil { + return x.EnvId } return "" } -func (m *GetRolesRequest) GetPathSpec() string { - if m != nil { - return m.PathSpec +func (x *GetRolesRequest) GetPathSpec() string { + if x != nil { + return x.PathSpec } return "" } type RoleInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` - TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` - Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *RoleInfo) Reset() { *m = RoleInfo{} } -func (m *RoleInfo) String() string { return proto.CompactTextString(m) } -func (*RoleInfo) ProtoMessage() {} -func (*RoleInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{47} -} -func (m *RoleInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RoleInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RoleInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + FullPath string `protobuf:"bytes,4,opt,name=fullPath,proto3" json:"fullPath,omitempty"` + TaskIds []string `protobuf:"bytes,5,rep,name=taskIds,proto3" json:"taskIds,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,6,rep,name=roles,proto3" json:"roles,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } -func (m *RoleInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RoleInfo.Merge(m, src) + +func (x *RoleInfo) Reset() { + *x = RoleInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *RoleInfo) XXX_Size() int { - return m.Size() + +func (x *RoleInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RoleInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RoleInfo.DiscardUnknown(m) + +func (*RoleInfo) ProtoMessage() {} + +func (x *RoleInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RoleInfo proto.InternalMessageInfo +// Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. +func (*RoleInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{47} +} -func (m *RoleInfo) GetName() string { - if m != nil { - return m.Name +func (x *RoleInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *RoleInfo) GetStatus() string { - if m != nil { - return m.Status +func (x *RoleInfo) GetStatus() string { + if x != nil { + return x.Status } return "" } -func (m *RoleInfo) GetState() string { - if m != nil { - return m.State +func (x *RoleInfo) GetState() string { + if x != nil { + return x.State } return "" } -func (m *RoleInfo) GetFullPath() string { - if m != nil { - return m.FullPath +func (x *RoleInfo) GetFullPath() string { + if x != nil { + return x.FullPath } return "" } -func (m *RoleInfo) GetTaskIds() []string { - if m != nil { - return m.TaskIds +func (x *RoleInfo) GetTaskIds() []string { + if x != nil { + return x.TaskIds } return nil } -func (m *RoleInfo) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *RoleInfo) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } return nil } -func (m *RoleInfo) GetDefaults() map[string]string { - if m != nil { - return m.Defaults +func (x *RoleInfo) GetDefaults() map[string]string { + if x != nil { + return x.Defaults } return nil } -func (m *RoleInfo) GetVars() map[string]string { - if m != nil { - return m.Vars +func (x *RoleInfo) GetVars() map[string]string { + if x != nil { + return x.Vars } return nil } -func (m *RoleInfo) GetUserVars() map[string]string { - if m != nil { - return m.UserVars +func (x *RoleInfo) GetUserVars() map[string]string { + if x != nil { + return x.UserVars } return nil } -type GetRolesReply struct { - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RoleInfo) GetConsolidatedStack() map[string]string { + if x != nil { + return x.ConsolidatedStack + } + return nil } -func (m *GetRolesReply) Reset() { *m = GetRolesReply{} } -func (m *GetRolesReply) String() string { return proto.CompactTextString(m) } -func (*GetRolesReply) ProtoMessage() {} -func (*GetRolesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{48} -} -func (m *GetRolesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetRolesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetRolesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } +type GetRolesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` } -func (m *GetRolesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetRolesReply.Merge(m, src) + +func (x *GetRolesReply) Reset() { + *x = GetRolesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetRolesReply) XXX_Size() int { - return m.Size() + +func (x *GetRolesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetRolesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetRolesReply.DiscardUnknown(m) + +func (*GetRolesReply) ProtoMessage() {} + +func (x *GetRolesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetRolesReply proto.InternalMessageInfo +// Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. +func (*GetRolesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{48} +} -func (m *GetRolesReply) GetRoles() []*RoleInfo { - if m != nil { - return m.Roles +func (x *GetRolesReply) GetRoles() []*RoleInfo { + if x != nil { + return x.Roles } return nil } type GetWorkflowTemplatesRequest struct { - RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` - RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` - AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` - AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *GetWorkflowTemplatesRequest) Reset() { *m = GetWorkflowTemplatesRequest{} } -func (m *GetWorkflowTemplatesRequest) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesRequest) ProtoMessage() {} -func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{49} -} -func (m *GetWorkflowTemplatesRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RepoPattern string `protobuf:"bytes,1,opt,name=repoPattern,proto3" json:"repoPattern,omitempty"` + RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` + AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` + AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` } -func (m *GetWorkflowTemplatesRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesRequest.Merge(m, src) + +func (x *GetWorkflowTemplatesRequest) Reset() { + *x = GetWorkflowTemplatesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -func (m *GetWorkflowTemplatesRequest) XXX_Size() int { - return m.Size() + +func (x *GetWorkflowTemplatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetWorkflowTemplatesRequest) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesRequest.DiscardUnknown(m) + +func (*GetWorkflowTemplatesRequest) ProtoMessage() {} + +func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesRequest proto.InternalMessageInfo +// Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{49} +} -func (m *GetWorkflowTemplatesRequest) GetRepoPattern() string { - if m != nil { - return m.RepoPattern +func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { + if x != nil { + return x.RepoPattern } return "" } -func (m *GetWorkflowTemplatesRequest) GetRevisionPattern() string { - if m != nil { - return m.RevisionPattern +func (x *GetWorkflowTemplatesRequest) GetRevisionPattern() string { + if x != nil { + return x.RevisionPattern } return "" } -func (m *GetWorkflowTemplatesRequest) GetAllBranches() bool { - if m != nil { - return m.AllBranches +func (x *GetWorkflowTemplatesRequest) GetAllBranches() bool { + if x != nil { + return x.AllBranches } return false } -func (m *GetWorkflowTemplatesRequest) GetAllTags() bool { - if m != nil { - return m.AllTags +func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { + if x != nil { + return x.AllTags } return false } type WorkflowTemplateInfo struct { - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` } -func (m *WorkflowTemplateInfo) Reset() { *m = WorkflowTemplateInfo{} } -func (m *WorkflowTemplateInfo) String() string { return proto.CompactTextString(m) } -func (*WorkflowTemplateInfo) ProtoMessage() {} -func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{50} -} -func (m *WorkflowTemplateInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *WorkflowTemplateInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_WorkflowTemplateInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *WorkflowTemplateInfo) Reset() { + *x = WorkflowTemplateInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *WorkflowTemplateInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_WorkflowTemplateInfo.Merge(m, src) -} -func (m *WorkflowTemplateInfo) XXX_Size() int { - return m.Size() + +func (x *WorkflowTemplateInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *WorkflowTemplateInfo) XXX_DiscardUnknown() { - xxx_messageInfo_WorkflowTemplateInfo.DiscardUnknown(m) + +func (*WorkflowTemplateInfo) ProtoMessage() {} + +func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_WorkflowTemplateInfo proto.InternalMessageInfo +// Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} +} -func (m *WorkflowTemplateInfo) GetRepo() string { - if m != nil { - return m.Repo +func (x *WorkflowTemplateInfo) GetRepo() string { + if x != nil { + return x.Repo } return "" } -func (m *WorkflowTemplateInfo) GetTemplate() string { - if m != nil { - return m.Template +func (x *WorkflowTemplateInfo) GetTemplate() string { + if x != nil { + return x.Template } return "" } -func (m *WorkflowTemplateInfo) GetRevision() string { - if m != nil { - return m.Revision +func (x *WorkflowTemplateInfo) GetRevision() string { + if x != nil { + return x.Revision } return "" } type GetWorkflowTemplatesReply struct { - WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` } -func (m *GetWorkflowTemplatesReply) Reset() { *m = GetWorkflowTemplatesReply{} } -func (m *GetWorkflowTemplatesReply) String() string { return proto.CompactTextString(m) } -func (*GetWorkflowTemplatesReply) ProtoMessage() {} -func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{51} -} -func (m *GetWorkflowTemplatesReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GetWorkflowTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GetWorkflowTemplatesReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *GetWorkflowTemplatesReply) Reset() { + *x = GetWorkflowTemplatesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *GetWorkflowTemplatesReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_GetWorkflowTemplatesReply.Merge(m, src) -} -func (m *GetWorkflowTemplatesReply) XXX_Size() int { - return m.Size() + +func (x *GetWorkflowTemplatesReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *GetWorkflowTemplatesReply) XXX_DiscardUnknown() { - xxx_messageInfo_GetWorkflowTemplatesReply.DiscardUnknown(m) + +func (*GetWorkflowTemplatesReply) ProtoMessage() {} + +func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_GetWorkflowTemplatesReply proto.InternalMessageInfo +// Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. +func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{51} +} -func (m *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { - if m != nil { - return m.WorkflowTemplates +func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { + if x != nil { + return x.WorkflowTemplates } return nil } type ListReposRequest struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -func (m *ListReposRequest) Reset() { *m = ListReposRequest{} } -func (m *ListReposRequest) String() string { return proto.CompactTextString(m) } -func (*ListReposRequest) ProtoMessage() {} -func (*ListReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{52} -} -func (m *ListReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ListReposRequest) Reset() { + *x = ListReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposRequest.Merge(m, src) -} -func (m *ListReposRequest) XXX_Size() int { - return m.Size() + +func (x *ListReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposRequest.DiscardUnknown(m) + +func (*ListReposRequest) ProtoMessage() {} + +func (x *ListReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposRequest proto.InternalMessageInfo +// Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. +func (*ListReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{52} +} type RepoInfo struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -func (m *RepoInfo) Reset() { *m = RepoInfo{} } -func (m *RepoInfo) String() string { return proto.CompactTextString(m) } -func (*RepoInfo) ProtoMessage() {} -func (*RepoInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{53} -} -func (m *RepoInfo) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RepoInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RepoInfo.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *RepoInfo) Reset() { + *x = RepoInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *RepoInfo) XXX_Merge(src proto.Message) { - xxx_messageInfo_RepoInfo.Merge(m, src) -} -func (m *RepoInfo) XXX_Size() int { - return m.Size() + +func (x *RepoInfo) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *RepoInfo) XXX_DiscardUnknown() { - xxx_messageInfo_RepoInfo.DiscardUnknown(m) + +func (*RepoInfo) ProtoMessage() {} + +func (x *RepoInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_RepoInfo proto.InternalMessageInfo +// Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. +func (*RepoInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{53} +} -func (m *RepoInfo) GetName() string { - if m != nil { - return m.Name +func (x *RepoInfo) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *RepoInfo) GetDefault() bool { - if m != nil { - return m.Default +func (x *RepoInfo) GetDefault() bool { + if x != nil { + return x.Default } return false } -func (m *RepoInfo) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision +func (x *RepoInfo) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } return "" } type ListReposReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` } -func (m *ListReposReply) Reset() { *m = ListReposReply{} } -func (m *ListReposReply) String() string { return proto.CompactTextString(m) } -func (*ListReposReply) ProtoMessage() {} -func (*ListReposReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{54} -} -func (m *ListReposReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *ListReposReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_ListReposReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *ListReposReply) Reset() { + *x = ListReposReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *ListReposReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_ListReposReply.Merge(m, src) -} -func (m *ListReposReply) XXX_Size() int { - return m.Size() + +func (x *ListReposReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *ListReposReply) XXX_DiscardUnknown() { - xxx_messageInfo_ListReposReply.DiscardUnknown(m) + +func (*ListReposReply) ProtoMessage() {} + +func (x *ListReposReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } -var xxx_messageInfo_ListReposReply proto.InternalMessageInfo +// Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. +func (*ListReposReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{54} +} -func (m *ListReposReply) GetRepos() []*RepoInfo { - if m != nil { - return m.Repos +func (x *ListReposReply) GetRepos() []*RepoInfo { + if x != nil { + return x.Repos } return nil } -func (m *ListReposReply) GetGlobalDefaultRevision() string { - if m != nil { - return m.GlobalDefaultRevision +func (x *ListReposReply) GetGlobalDefaultRevision() string { + if x != nil { + return x.GlobalDefaultRevision } return "" } type AddRepoRequest struct { - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *AddRepoRequest) Reset() { *m = AddRepoRequest{} } -func (m *AddRepoRequest) String() string { return proto.CompactTextString(m) } -func (*AddRepoRequest) ProtoMessage() {} -func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{55} -} -func (m *AddRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *AddRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoRequest.Merge(m, src) -} -func (m *AddRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *AddRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoRequest.DiscardUnknown(m) + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DefaultRevision string `protobuf:"bytes,2,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` } -var xxx_messageInfo_AddRepoRequest proto.InternalMessageInfo - -func (m *AddRepoRequest) GetName() string { - if m != nil { - return m.Name +func (x *AddRepoRequest) Reset() { + *x = AddRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -func (m *AddRepoRequest) GetDefaultRevision() string { - if m != nil { - return m.DefaultRevision - } - return "" +func (x *AddRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -type AddRepoReply struct { - NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` - Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +func (*AddRepoRequest) ProtoMessage() {} -func (m *AddRepoReply) Reset() { *m = AddRepoReply{} } -func (m *AddRepoReply) String() string { return proto.CompactTextString(m) } -func (*AddRepoReply) ProtoMessage() {} -func (*AddRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{56} -} -func (m *AddRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AddRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AddRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *AddRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_AddRepoReply.Merge(m, src) -} -func (m *AddRepoReply) XXX_Size() int { - return m.Size() -} -func (m *AddRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_AddRepoReply.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_AddRepoReply proto.InternalMessageInfo +// Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. +func (*AddRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{55} +} -func (m *AddRepoReply) GetNewDefaultRevision() string { - if m != nil { - return m.NewDefaultRevision +func (x *AddRepoRequest) GetName() string { + if x != nil { + return x.Name } return "" } -func (m *AddRepoReply) GetInfo() string { - if m != nil { - return m.Info +func (x *AddRepoRequest) GetDefaultRevision() string { + if x != nil { + return x.DefaultRevision } return "" } -type RemoveRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type AddRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` + Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` } -func (m *RemoveRepoRequest) Reset() { *m = RemoveRepoRequest{} } -func (m *RemoveRepoRequest) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoRequest) ProtoMessage() {} -func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{57} -} -func (m *RemoveRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *AddRepoReply) Reset() { + *x = AddRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *RemoveRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoRequest.Merge(m, src) -} -func (m *RemoveRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *RemoveRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoRequest.DiscardUnknown(m) + +func (x *AddRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_RemoveRepoRequest proto.InternalMessageInfo +func (*AddRepoReply) ProtoMessage() {} -func (m *RemoveRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *AddRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return 0 + return mi.MessageOf(x) } -type RemoveRepoReply struct { - NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. +func (*AddRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } -func (m *RemoveRepoReply) Reset() { *m = RemoveRepoReply{} } -func (m *RemoveRepoReply) String() string { return proto.CompactTextString(m) } -func (*RemoveRepoReply) ProtoMessage() {} -func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{58} -} -func (m *RemoveRepoReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RemoveRepoReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RemoveRepoReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *AddRepoReply) GetNewDefaultRevision() string { + if x != nil { + return x.NewDefaultRevision } + return "" } -func (m *RemoveRepoReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_RemoveRepoReply.Merge(m, src) -} -func (m *RemoveRepoReply) XXX_Size() int { - return m.Size() -} -func (m *RemoveRepoReply) XXX_DiscardUnknown() { - xxx_messageInfo_RemoveRepoReply.DiscardUnknown(m) -} - -var xxx_messageInfo_RemoveRepoReply proto.InternalMessageInfo -func (m *RemoveRepoReply) GetNewDefaultRepo() string { - if m != nil { - return m.NewDefaultRepo +func (x *AddRepoReply) GetInfo() string { + if x != nil { + return x.Info } return "" } -type RefreshReposRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +type RemoveRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *RefreshReposRequest) Reset() { *m = RefreshReposRequest{} } -func (m *RefreshReposRequest) String() string { return proto.CompactTextString(m) } -func (*RefreshReposRequest) ProtoMessage() {} -func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{59} -} -func (m *RefreshReposRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *RefreshReposRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_RefreshReposRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *RefreshReposRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_RefreshReposRequest.Merge(m, src) -} -func (m *RefreshReposRequest) XXX_Size() int { - return m.Size() -} -func (m *RefreshReposRequest) XXX_DiscardUnknown() { - xxx_messageInfo_RefreshReposRequest.DiscardUnknown(m) + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -var xxx_messageInfo_RefreshReposRequest proto.InternalMessageInfo - -func (m *RefreshReposRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *RemoveRepoRequest) Reset() { + *x = RemoveRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return 0 } -type SetDefaultRepoRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RemoveRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetDefaultRepoRequest) Reset() { *m = SetDefaultRepoRequest{} } -func (m *SetDefaultRepoRequest) String() string { return proto.CompactTextString(m) } -func (*SetDefaultRepoRequest) ProtoMessage() {} -func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{60} -} -func (m *SetDefaultRepoRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetDefaultRepoRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetDefaultRepoRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*RemoveRepoRequest) ProtoMessage() {} + +func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetDefaultRepoRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetDefaultRepoRequest.Merge(m, src) -} -func (m *SetDefaultRepoRequest) XXX_Size() int { - return m.Size() -} -func (m *SetDefaultRepoRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetDefaultRepoRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetDefaultRepoRequest proto.InternalMessageInfo +// Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. +func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{57} +} -func (m *SetDefaultRepoRequest) GetIndex() int32 { - if m != nil { - return m.Index +func (x *RemoveRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } return 0 } -type SetGlobalDefaultRevisionRequest struct { - Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} +type RemoveRepoReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func (m *SetGlobalDefaultRevisionRequest) Reset() { *m = SetGlobalDefaultRevisionRequest{} } -func (m *SetGlobalDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} -func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{61} -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetGlobalDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } + NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` } -func (m *SetGlobalDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.Merge(m, src) -} -func (m *SetGlobalDefaultRevisionRequest) XXX_Size() int { - return m.Size() -} -func (m *SetGlobalDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetGlobalDefaultRevisionRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_SetGlobalDefaultRevisionRequest proto.InternalMessageInfo -func (m *SetGlobalDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *RemoveRepoReply) Reset() { + *x = RemoveRepoReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return "" } -type SetRepoDefaultRevisionRequest struct { - Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` - Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +func (x *RemoveRepoReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (m *SetRepoDefaultRevisionRequest) Reset() { *m = SetRepoDefaultRevisionRequest{} } -func (m *SetRepoDefaultRevisionRequest) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} -func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{62} -} -func (m *SetRepoDefaultRevisionRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err +func (*RemoveRepoReply) ProtoMessage() {} + +func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) } - return b[:n], nil + return ms } -} -func (m *SetRepoDefaultRevisionRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionRequest.Merge(m, src) -} -func (m *SetRepoDefaultRevisionRequest) XXX_Size() int { - return m.Size() -} -func (m *SetRepoDefaultRevisionRequest) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionRequest.DiscardUnknown(m) + return mi.MessageOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionRequest proto.InternalMessageInfo - -func (m *SetRepoDefaultRevisionRequest) GetIndex() int32 { - if m != nil { - return m.Index - } - return 0 +// Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. +func (*RemoveRepoReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } -func (m *SetRepoDefaultRevisionRequest) GetRevision() string { - if m != nil { - return m.Revision +func (x *RemoveRepoReply) GetNewDefaultRepo() string { + if x != nil { + return x.NewDefaultRepo } return "" } -type SetRepoDefaultRevisionReply struct { - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +type RefreshReposRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -func (m *SetRepoDefaultRevisionReply) Reset() { *m = SetRepoDefaultRevisionReply{} } -func (m *SetRepoDefaultRevisionReply) String() string { return proto.CompactTextString(m) } -func (*SetRepoDefaultRevisionReply) ProtoMessage() {} -func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{63} -} -func (m *SetRepoDefaultRevisionReply) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *SetRepoDefaultRevisionReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_SetRepoDefaultRevisionReply.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil +func (x *RefreshReposRequest) Reset() { + *x = RefreshReposRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } } -func (m *SetRepoDefaultRevisionReply) XXX_Merge(src proto.Message) { - xxx_messageInfo_SetRepoDefaultRevisionReply.Merge(m, src) -} -func (m *SetRepoDefaultRevisionReply) XXX_Size() int { - return m.Size() -} -func (m *SetRepoDefaultRevisionReply) XXX_DiscardUnknown() { - xxx_messageInfo_SetRepoDefaultRevisionReply.DiscardUnknown(m) + +func (x *RefreshReposRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -var xxx_messageInfo_SetRepoDefaultRevisionReply proto.InternalMessageInfo +func (*RefreshReposRequest) ProtoMessage() {} -func (m *SetRepoDefaultRevisionReply) GetInfo() string { - if m != nil { - return m.Info +func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return "" + return mi.MessageOf(x) } -type Empty struct { - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` +// Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. +func (*RefreshReposRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } -func (m *Empty) Reset() { *m = Empty{} } -func (m *Empty) String() string { return proto.CompactTextString(m) } -func (*Empty) ProtoMessage() {} -func (*Empty) Descriptor() ([]byte, []int) { - return fileDescriptor_2aa6aa9a1f02efa9, []int{64} -} -func (m *Empty) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Empty) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Empty.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Empty) XXX_Merge(src proto.Message) { - xxx_messageInfo_Empty.Merge(m, src) -} -func (m *Empty) XXX_Size() int { - return m.Size() -} -func (m *Empty) XXX_DiscardUnknown() { - xxx_messageInfo_Empty.DiscardUnknown(m) -} - -var xxx_messageInfo_Empty proto.InternalMessageInfo - -func init() { - proto.RegisterEnum("o2control.StatusUpdate_Level", StatusUpdate_Level_name, StatusUpdate_Level_value) - proto.RegisterEnum("o2control.ControlEnvironmentRequest_Optype", ControlEnvironmentRequest_Optype_name, ControlEnvironmentRequest_Optype_value) - proto.RegisterEnum("o2control.EnvironmentOperation_Optype", EnvironmentOperation_Optype_name, EnvironmentOperation_Optype_value) - proto.RegisterType((*Event_MesosHeartbeat)(nil), "o2control.Event_MesosHeartbeat") - proto.RegisterType((*Ev_EnvironmentEvent)(nil), "o2control.Ev_EnvironmentEvent") - proto.RegisterType((*Ev_TaskEvent)(nil), "o2control.Ev_TaskEvent") - proto.RegisterType((*Ev_RoleEvent)(nil), "o2control.Ev_RoleEvent") - proto.RegisterType((*StatusRequest)(nil), "o2control.StatusRequest") - proto.RegisterType((*StatusReply)(nil), "o2control.StatusReply") - proto.RegisterType((*StatusUpdate)(nil), "o2control.StatusUpdate") - proto.RegisterType((*Event)(nil), "o2control.Event") - proto.RegisterType((*SubscribeRequest)(nil), "o2control.SubscribeRequest") - proto.RegisterType((*GetFrameworkInfoRequest)(nil), "o2control.GetFrameworkInfoRequest") - proto.RegisterType((*Version)(nil), "o2control.Version") - proto.RegisterType((*GetFrameworkInfoReply)(nil), "o2control.GetFrameworkInfoReply") - proto.RegisterType((*TeardownRequest)(nil), "o2control.TeardownRequest") - proto.RegisterType((*TeardownReply)(nil), "o2control.TeardownReply") - proto.RegisterType((*GetEnvironmentsRequest)(nil), "o2control.GetEnvironmentsRequest") - proto.RegisterType((*GetEnvironmentsReply)(nil), "o2control.GetEnvironmentsReply") - proto.RegisterType((*EnvironmentInfo)(nil), "o2control.EnvironmentInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.EnvironmentInfo.VarsEntry") - proto.RegisterType((*NewEnvironmentRequest)(nil), "o2control.NewEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewEnvironmentReply)(nil), "o2control.NewEnvironmentReply") - proto.RegisterType((*NewAutoEnvironmentRequest)(nil), "o2control.NewAutoEnvironmentRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.NewAutoEnvironmentRequest.VarsEntry") - proto.RegisterType((*NewAutoEnvironmentReply)(nil), "o2control.NewAutoEnvironmentReply") - proto.RegisterType((*GetEnvironmentRequest)(nil), "o2control.GetEnvironmentRequest") - proto.RegisterType((*GetEnvironmentReply)(nil), "o2control.GetEnvironmentReply") - proto.RegisterType((*ControlEnvironmentRequest)(nil), "o2control.ControlEnvironmentRequest") - proto.RegisterType((*ControlEnvironmentReply)(nil), "o2control.ControlEnvironmentReply") - proto.RegisterType((*ModifyEnvironmentRequest)(nil), "o2control.ModifyEnvironmentRequest") - proto.RegisterType((*EnvironmentOperation)(nil), "o2control.EnvironmentOperation") - proto.RegisterType((*ModifyEnvironmentReply)(nil), "o2control.ModifyEnvironmentReply") - proto.RegisterType((*DestroyEnvironmentRequest)(nil), "o2control.DestroyEnvironmentRequest") - proto.RegisterType((*DestroyEnvironmentReply)(nil), "o2control.DestroyEnvironmentReply") - proto.RegisterType((*SetEnvironmentPropertiesRequest)(nil), "o2control.SetEnvironmentPropertiesRequest") - proto.RegisterMapType((map[string]string)(nil), "o2control.SetEnvironmentPropertiesRequest.PropertiesEntry") - proto.RegisterType((*SetEnvironmentPropertiesReply)(nil), "o2control.SetEnvironmentPropertiesReply") - proto.RegisterType((*GetEnvironmentPropertiesRequest)(nil), "o2control.GetEnvironmentPropertiesRequest") - proto.RegisterType((*GetEnvironmentPropertiesReply)(nil), "o2control.GetEnvironmentPropertiesReply") - proto.RegisterMapType((map[string]string)(nil), "o2control.GetEnvironmentPropertiesReply.PropertiesEntry") - proto.RegisterType((*ShortTaskInfo)(nil), "o2control.ShortTaskInfo") - proto.RegisterType((*TaskDeploymentInfo)(nil), "o2control.TaskDeploymentInfo") - proto.RegisterType((*GetTasksRequest)(nil), "o2control.GetTasksRequest") - proto.RegisterType((*GetTasksReply)(nil), "o2control.GetTasksReply") - proto.RegisterType((*GetTaskRequest)(nil), "o2control.GetTaskRequest") - proto.RegisterType((*GetTaskReply)(nil), "o2control.GetTaskReply") - proto.RegisterType((*TaskClassInfo)(nil), "o2control.TaskClassInfo") - proto.RegisterType((*CommandInfo)(nil), "o2control.CommandInfo") - proto.RegisterType((*ChannelInfo)(nil), "o2control.ChannelInfo") - proto.RegisterType((*TaskInfo)(nil), "o2control.TaskInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.TaskInfo.PropertiesEntry") - proto.RegisterType((*CleanupTasksRequest)(nil), "o2control.CleanupTasksRequest") - proto.RegisterType((*CleanupTasksReply)(nil), "o2control.CleanupTasksReply") - proto.RegisterType((*GetRolesRequest)(nil), "o2control.GetRolesRequest") - proto.RegisterType((*RoleInfo)(nil), "o2control.RoleInfo") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.DefaultsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.UserVarsEntry") - proto.RegisterMapType((map[string]string)(nil), "o2control.RoleInfo.VarsEntry") - proto.RegisterType((*GetRolesReply)(nil), "o2control.GetRolesReply") - proto.RegisterType((*GetWorkflowTemplatesRequest)(nil), "o2control.GetWorkflowTemplatesRequest") - proto.RegisterType((*WorkflowTemplateInfo)(nil), "o2control.WorkflowTemplateInfo") - proto.RegisterType((*GetWorkflowTemplatesReply)(nil), "o2control.GetWorkflowTemplatesReply") - proto.RegisterType((*ListReposRequest)(nil), "o2control.ListReposRequest") - proto.RegisterType((*RepoInfo)(nil), "o2control.RepoInfo") - proto.RegisterType((*ListReposReply)(nil), "o2control.ListReposReply") - proto.RegisterType((*AddRepoRequest)(nil), "o2control.AddRepoRequest") - proto.RegisterType((*AddRepoReply)(nil), "o2control.AddRepoReply") - proto.RegisterType((*RemoveRepoRequest)(nil), "o2control.RemoveRepoRequest") - proto.RegisterType((*RemoveRepoReply)(nil), "o2control.RemoveRepoReply") - proto.RegisterType((*RefreshReposRequest)(nil), "o2control.RefreshReposRequest") - proto.RegisterType((*SetDefaultRepoRequest)(nil), "o2control.SetDefaultRepoRequest") - proto.RegisterType((*SetGlobalDefaultRevisionRequest)(nil), "o2control.SetGlobalDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionRequest)(nil), "o2control.SetRepoDefaultRevisionRequest") - proto.RegisterType((*SetRepoDefaultRevisionReply)(nil), "o2control.SetRepoDefaultRevisionReply") - proto.RegisterType((*Empty)(nil), "o2control.Empty") -} - -func init() { proto.RegisterFile("protos/o2control.proto", fileDescriptor_2aa6aa9a1f02efa9) } - -var fileDescriptor_2aa6aa9a1f02efa9 = []byte{ - // 2918 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x1a, 0x5d, 0x73, 0x1b, 0x57, - 0xd5, 0x2b, 0x4b, 0x96, 0x74, 0x64, 0xcb, 0xf2, 0x75, 0xe2, 0xc8, 0x6a, 0xe2, 0xb8, 0x97, 0x4c, - 0xea, 0xa6, 0xc5, 0x6d, 0xdd, 0x0e, 0x0d, 0x69, 0xd3, 0xe2, 0x0f, 0xc5, 0x31, 0x24, 0x76, 0x58, - 0x29, 0x09, 0x64, 0x86, 0x09, 0x6b, 0xed, 0x95, 0xbd, 0xf5, 0x6a, 0x57, 0xdd, 0x5d, 0xc9, 0xf1, - 0x03, 0x6f, 0xbc, 0x31, 0x0c, 0xd3, 0xe1, 0x85, 0x27, 0x66, 0x80, 0xe1, 0x91, 0x77, 0x1e, 0xf8, - 0x01, 0x0c, 0x03, 0x03, 0x0f, 0xbc, 0xc3, 0x94, 0x3f, 0xd0, 0x9f, 0xc0, 0xdc, 0xaf, 0xdd, 0xbb, - 0x5f, 0xb2, 0xd3, 0xd2, 0x17, 0xde, 0x74, 0xce, 0x3d, 0xe7, 0xdc, 0x73, 0xcf, 0xc7, 0x3d, 0xf7, - 0x9c, 0x15, 0x2c, 0x0d, 0x3d, 0x37, 0x70, 0xfd, 0xb7, 0xdc, 0x8d, 0x9e, 0xeb, 0x04, 0x9e, 0x6b, - 0xaf, 0x33, 0x04, 0xaa, 0x86, 0x08, 0xbc, 0x04, 0x97, 0xda, 0x63, 0xe2, 0x04, 0xcf, 0x1f, 0x12, - 0xdf, 0xf5, 0xef, 0x13, 0xc3, 0x0b, 0x0e, 0x89, 0x11, 0xe0, 0x3f, 0x68, 0xb0, 0xd8, 0x1e, 0x3f, - 0x6f, 0x3b, 0x63, 0xcb, 0x73, 0x9d, 0x01, 0x71, 0x02, 0x46, 0x86, 0x6e, 0xc0, 0x1c, 0x89, 0x70, - 0x7b, 0x66, 0x53, 0x5b, 0xd5, 0xd6, 0xaa, 0x7a, 0x1c, 0x89, 0x2e, 0x41, 0xc9, 0x0f, 0x8c, 0x80, - 0x34, 0x0b, 0x6c, 0x95, 0x03, 0xe8, 0x16, 0x34, 0x7a, 0x23, 0xcf, 0x23, 0x4e, 0xa0, 0x8f, 0x9c, - 0xfd, 0xd1, 0xe0, 0x90, 0x78, 0xcd, 0xe9, 0x55, 0x6d, 0x6d, 0x4e, 0x4f, 0xe1, 0xa9, 0x04, 0xe2, - 0x79, 0xae, 0xd7, 0x2c, 0x72, 0x09, 0x0c, 0x40, 0x4d, 0x28, 0x0f, 0x88, 0xef, 0x1b, 0x47, 0xa4, - 0x59, 0x62, 0x78, 0x09, 0xe2, 0xdf, 0x6a, 0x30, 0xdb, 0x1e, 0x3f, 0xef, 0x1a, 0xfe, 0x09, 0x57, - 0x14, 0x41, 0xd1, 0x31, 0x06, 0x44, 0xe8, 0xc7, 0x7e, 0xa3, 0x25, 0x98, 0x09, 0x0c, 0xff, 0xc4, - 0x32, 0x85, 0x5e, 0x02, 0x8a, 0xd4, 0x9d, 0x56, 0xd5, 0x5d, 0x82, 0x19, 0xfa, 0x63, 0xe4, 0x0b, - 0x1d, 0x04, 0x84, 0x5a, 0x50, 0x39, 0x76, 0xfd, 0x80, 0x49, 0xe7, 0x5a, 0x84, 0x30, 0xba, 0x0a, - 0xd5, 0x9e, 0x6d, 0xf8, 0xfe, 0x3e, 0x5d, 0x9c, 0x61, 0x8b, 0x11, 0x02, 0xdb, 0x4c, 0x47, 0xdd, - 0xb5, 0xc9, 0x44, 0x1d, 0xc5, 0xae, 0x85, 0xd8, 0xae, 0xd9, 0x3a, 0xb6, 0xa0, 0xe2, 0xb9, 0x36, - 0x79, 0x64, 0x04, 0xc7, 0x42, 0xcb, 0x10, 0xc6, 0xf3, 0x30, 0xd7, 0x61, 0xbc, 0x3a, 0xf9, 0x74, - 0x44, 0xfc, 0x00, 0x1f, 0x42, 0x4d, 0x22, 0x86, 0xf6, 0x59, 0x24, 0x51, 0x53, 0x25, 0xde, 0x85, - 0x39, 0xbe, 0xe3, 0xe3, 0xa1, 0x69, 0x04, 0x84, 0xaa, 0x31, 0xbd, 0x56, 0xdb, 0xb8, 0xb2, 0x1e, - 0x05, 0x51, 0x47, 0x59, 0xd7, 0xe3, 0xd4, 0xf8, 0x6f, 0x1a, 0xcc, 0xaa, 0xeb, 0xe8, 0x5d, 0x28, - 0xd9, 0x64, 0x4c, 0x6c, 0xb6, 0x4b, 0x7d, 0xe3, 0x5a, 0x8e, 0x9c, 0xf5, 0x07, 0x94, 0x48, 0xe7, - 0xb4, 0x68, 0x0f, 0xea, 0x83, 0x58, 0x3c, 0x32, 0x63, 0xd4, 0x36, 0xae, 0x2b, 0xdc, 0x59, 0x61, - 0x7b, 0x7f, 0x4a, 0x4f, 0x30, 0xe2, 0xf7, 0xa0, 0xc4, 0x44, 0xa3, 0x2a, 0x94, 0x76, 0xda, 0x5b, - 0x8f, 0x77, 0x1b, 0x53, 0xa8, 0x02, 0xc5, 0xbd, 0xfd, 0x7b, 0x07, 0x0d, 0x0d, 0xd5, 0xa0, 0xfc, - 0x74, 0x53, 0xdf, 0xdf, 0xdb, 0xdf, 0x6d, 0x14, 0x28, 0x45, 0x5b, 0xd7, 0x0f, 0xf4, 0xc6, 0xf4, - 0x56, 0x19, 0x4a, 0x4c, 0x3e, 0xfe, 0x42, 0x13, 0xbf, 0xa8, 0x6b, 0x03, 0x6b, 0x40, 0xfc, 0xc0, - 0x18, 0x0c, 0x85, 0xc9, 0x22, 0x04, 0x7a, 0x00, 0x0d, 0x92, 0xc8, 0x15, 0xa1, 0xf3, 0x4a, 0x4c, - 0xe7, 0x54, 0x46, 0xdd, 0x9f, 0xd2, 0x53, 0x9c, 0xe8, 0x7d, 0xa8, 0x06, 0x32, 0x92, 0x99, 0xc3, - 0xe3, 0x0e, 0x50, 0x03, 0xfd, 0xfe, 0x94, 0x1e, 0xd1, 0x52, 0x46, 0x4f, 0x86, 0x17, 0x0b, 0x88, - 0x14, 0x63, 0x18, 0x7d, 0x94, 0x31, 0xa4, 0xdd, 0xaa, 0x42, 0xf9, 0x91, 0x71, 0x66, 0xbb, 0x86, - 0x89, 0x31, 0x34, 0x3a, 0xa3, 0x43, 0xbf, 0xe7, 0x59, 0x87, 0x44, 0x84, 0x0e, 0xaa, 0x43, 0xc1, - 0x92, 0xb9, 0x5e, 0xb0, 0x4c, 0xbc, 0x0c, 0x57, 0x76, 0x49, 0x70, 0xcf, 0x33, 0x06, 0xe4, 0xd4, - 0xf5, 0x4e, 0xf6, 0x9c, 0xbe, 0x2b, 0xa3, 0xec, 0x77, 0x1a, 0x94, 0x9f, 0x10, 0xcf, 0xb7, 0x5c, - 0x87, 0x86, 0xd8, 0xc0, 0xf8, 0xc4, 0xf5, 0x18, 0x67, 0x49, 0xe7, 0x00, 0xc3, 0x5a, 0x8e, 0xeb, - 0x31, 0x03, 0x51, 0x2c, 0x05, 0x28, 0x76, 0x68, 0x04, 0xbd, 0x63, 0x76, 0xde, 0x92, 0xce, 0x01, - 0x8a, 0x3d, 0x1c, 0x59, 0xb6, 0x29, 0xef, 0x01, 0x06, 0xa0, 0x55, 0xa8, 0x0d, 0x3d, 0xd7, 0x1c, - 0xf5, 0x82, 0xfd, 0x28, 0x0b, 0x55, 0x14, 0x5a, 0x01, 0x18, 0x73, 0x25, 0x3a, 0x81, 0x27, 0x32, - 0x51, 0xc1, 0xe0, 0x5f, 0x14, 0xe0, 0x72, 0xfa, 0x04, 0x34, 0x2d, 0x56, 0xa1, 0xd6, 0x0f, 0xb1, - 0xf2, 0xcc, 0x2a, 0x0a, 0xbd, 0x09, 0x0b, 0x8a, 0xc7, 0xfc, 0x6d, 0x77, 0x24, 0x9c, 0x5d, 0xd2, - 0xd3, 0x0b, 0x54, 0x13, 0xea, 0x1f, 0x41, 0xc6, 0x0f, 0xa7, 0x60, 0xa2, 0x34, 0x2c, 0xaa, 0x69, - 0xb8, 0x02, 0x40, 0x2f, 0x15, 0xc1, 0x55, 0xe2, 0x5c, 0x11, 0x06, 0x61, 0x98, 0xb5, 0x1c, 0x3f, - 0x30, 0x9c, 0x1e, 0x51, 0xee, 0x9a, 0x18, 0x0e, 0xbd, 0x09, 0x65, 0x71, 0xe2, 0x66, 0x99, 0x85, - 0x02, 0x52, 0x42, 0x41, 0xb8, 0x48, 0x97, 0x24, 0xf8, 0x75, 0x98, 0xef, 0x12, 0xc3, 0x33, 0xdd, - 0x53, 0x47, 0x7a, 0x7d, 0x09, 0x66, 0x3c, 0x62, 0xf8, 0xae, 0x23, 0xac, 0x20, 0x20, 0x7a, 0xb3, - 0x44, 0xa4, 0x43, 0xfb, 0x0c, 0x37, 0x61, 0x69, 0x97, 0x04, 0x4a, 0x68, 0x87, 0x77, 0xce, 0x0b, - 0xb8, 0x94, 0x5a, 0xb9, 0x98, 0x95, 0x3f, 0x82, 0x59, 0xd5, 0x98, 0xe2, 0x1e, 0x6a, 0xa9, 0xd1, - 0xac, 0xd4, 0x1c, 0xea, 0xbe, 0x18, 0x3d, 0xfe, 0x4b, 0x11, 0xe6, 0x13, 0x14, 0xc9, 0x30, 0xa6, - 0x5a, 0xf4, 0x3c, 0x62, 0x04, 0xc4, 0x7c, 0x7a, 0x4c, 0x1c, 0x71, 0xe3, 0xaa, 0xa8, 0x9c, 0x6b, - 0x77, 0x1d, 0x4a, 0xcc, 0x83, 0xcd, 0x22, 0x53, 0xaa, 0xa9, 0x5e, 0x6a, 0xc7, 0xae, 0x17, 0xd0, - 0xec, 0x64, 0x2a, 0x71, 0x32, 0x7e, 0x4d, 0xbb, 0x01, 0xcd, 0x3d, 0x59, 0x32, 0x24, 0x9c, 0x59, - 0x15, 0x67, 0x72, 0xaa, 0xe2, 0x0e, 0x54, 0x4c, 0xd2, 0x37, 0x46, 0x76, 0xe0, 0x37, 0xcb, 0x6c, - 0xeb, 0xb5, 0x7c, 0x7b, 0xac, 0xef, 0x08, 0xd2, 0xb6, 0x13, 0x78, 0x67, 0x7a, 0xc8, 0x89, 0x6e, - 0x43, 0x71, 0x6c, 0x78, 0x7e, 0xb3, 0xc2, 0x24, 0xdc, 0x98, 0x20, 0xe1, 0x89, 0xe1, 0x09, 0x6e, - 0xc6, 0x41, 0xf7, 0x1f, 0xf9, 0xc4, 0xa3, 0xe8, 0x66, 0xf5, 0xdc, 0xfd, 0x1f, 0x0b, 0x52, 0xb1, - 0xbf, 0xe4, 0x6c, 0x7d, 0x00, 0x73, 0x31, 0xd5, 0x50, 0x03, 0xa6, 0x4f, 0xc8, 0x99, 0xf0, 0x0b, - 0xfd, 0x49, 0xcd, 0x3e, 0x36, 0xec, 0x51, 0xf8, 0x80, 0x60, 0xc0, 0x9d, 0xc2, 0x6d, 0xad, 0xf5, - 0x3e, 0x54, 0x43, 0x99, 0x2f, 0xc5, 0xf8, 0x01, 0xcc, 0xc5, 0x14, 0x7a, 0x19, 0x66, 0xfc, 0x27, - 0x0d, 0x2e, 0xef, 0x93, 0x53, 0xe5, 0x84, 0x32, 0x47, 0x6e, 0x41, 0x83, 0x06, 0x6c, 0xdf, 0x76, - 0x4f, 0xbb, 0x64, 0x30, 0xb4, 0xa3, 0x82, 0x9a, 0xc2, 0xa3, 0x8f, 0x84, 0xe1, 0x79, 0x28, 0xdf, - 0x52, 0x4c, 0x97, 0x29, 0x3b, 0x69, 0xfe, 0x2f, 0x7d, 0x76, 0xdc, 0x81, 0xc5, 0xe4, 0x0e, 0x34, - 0x09, 0x3f, 0x84, 0x9a, 0x92, 0x32, 0x4c, 0xd4, 0xe4, 0x0c, 0x53, 0xc9, 0xf1, 0x3f, 0x35, 0x58, - 0xde, 0x27, 0xa7, 0x9b, 0xa3, 0xc0, 0xfd, 0x8a, 0x76, 0xd9, 0x8a, 0xd9, 0x65, 0x3d, 0x6e, 0x97, - 0x6c, 0xf9, 0xa9, 0xd0, 0xe4, 0xa9, 0x3d, 0x2d, 0x53, 0xfb, 0xcb, 0xdb, 0x6a, 0x19, 0xae, 0x64, - 0xed, 0x4a, 0xaf, 0xb9, 0xd7, 0x58, 0xcd, 0xc8, 0x38, 0x6c, 0xb2, 0x3c, 0xfe, 0x54, 0x83, 0xc5, - 0x24, 0xe5, 0x57, 0x36, 0x38, 0x7a, 0x0b, 0x2a, 0xd2, 0x74, 0xe2, 0x6d, 0xb1, 0xa8, 0xb0, 0xd2, - 0xcb, 0x84, 0xf1, 0x84, 0x44, 0xf8, 0xef, 0x1a, 0x2c, 0x6f, 0xf3, 0xe5, 0xf3, 0x95, 0x46, 0x1f, - 0x43, 0x31, 0x38, 0x1b, 0x72, 0x8b, 0xd4, 0x37, 0xde, 0x50, 0x44, 0xe7, 0xca, 0x58, 0x3f, 0x18, - 0x52, 0x16, 0x9d, 0x31, 0x62, 0x03, 0x66, 0x38, 0x4c, 0x1f, 0x58, 0xfb, 0x07, 0x07, 0x8f, 0x1a, - 0x53, 0x08, 0x41, 0xbd, 0xd3, 0xdd, 0xd4, 0xbb, 0xcf, 0x37, 0xb7, 0xbb, 0x7b, 0x4f, 0xf6, 0xba, - 0x3f, 0x6c, 0x68, 0x68, 0x01, 0xe6, 0x3a, 0xdd, 0x83, 0x47, 0x11, 0xaa, 0x80, 0xe6, 0xa0, 0xba, - 0x7d, 0xb0, 0x7f, 0x6f, 0x6f, 0xf7, 0xb1, 0xde, 0x6e, 0x4c, 0xd3, 0x97, 0x98, 0xde, 0xee, 0xb4, - 0xbb, 0x8d, 0x22, 0x9a, 0x85, 0xca, 0xee, 0xc1, 0x73, 0xfe, 0x2e, 0x2b, 0xe1, 0x13, 0xb8, 0x92, - 0xa5, 0x0c, 0xb5, 0x6d, 0xf2, 0x38, 0x5f, 0xb9, 0x07, 0xc1, 0xbf, 0xd4, 0xa0, 0xf9, 0xd0, 0x35, - 0xad, 0xfe, 0xd9, 0x85, 0xac, 0x07, 0xee, 0x90, 0x78, 0x46, 0x60, 0xb9, 0x8e, 0x8c, 0xe4, 0xeb, - 0xd9, 0x9e, 0x3d, 0x90, 0x74, 0xba, 0xc2, 0x82, 0x6e, 0x42, 0xdd, 0x23, 0x3d, 0xd7, 0xe9, 0x5b, - 0x47, 0x23, 0x8f, 0x6c, 0xda, 0x36, 0xd3, 0xab, 0xa2, 0x27, 0xb0, 0xf8, 0x37, 0x1a, 0x5c, 0xca, - 0x12, 0x86, 0xee, 0x08, 0xff, 0xf1, 0x87, 0xf6, 0xcd, 0x73, 0xf6, 0x8e, 0xb9, 0x4e, 0xf6, 0x11, - 0xec, 0x29, 0x51, 0x88, 0xfa, 0x08, 0xd6, 0xb5, 0xbc, 0x93, 0xe1, 0xd6, 0x79, 0xa8, 0xe9, 0xed, - 0x87, 0x07, 0x4f, 0xda, 0xcf, 0xf5, 0x83, 0x07, 0xd4, 0x63, 0xb3, 0x50, 0xd9, 0xdc, 0xd9, 0xe1, - 0x50, 0x11, 0xff, 0x4c, 0x83, 0xa5, 0x0c, 0xcb, 0x51, 0x37, 0x7d, 0x0f, 0x1a, 0x7d, 0xc3, 0xb2, - 0x89, 0x79, 0x10, 0x59, 0x4b, 0xbb, 0x98, 0xb5, 0x52, 0x8c, 0xc2, 0x09, 0x85, 0xb4, 0xcf, 0xd5, - 0x6a, 0x8d, 0x3f, 0xd3, 0x60, 0x79, 0x87, 0xf8, 0x81, 0xe7, 0x5e, 0xc4, 0x91, 0x57, 0xa1, 0x7a, - 0x42, 0xc8, 0xb0, 0xcb, 0xea, 0x7b, 0x81, 0xb9, 0x20, 0x42, 0xa0, 0xb7, 0x61, 0xd1, 0xb0, 0x6d, - 0xf7, 0x74, 0xcf, 0xd1, 0x47, 0x8e, 0x63, 0x39, 0x47, 0x9d, 0x70, 0xbf, 0x8a, 0x9e, 0xb5, 0x44, - 0x75, 0xea, 0xbb, 0x5e, 0x8f, 0xbf, 0xef, 0x2a, 0x3a, 0x07, 0x30, 0x81, 0x2b, 0x59, 0x2a, 0x51, - 0x0b, 0x7d, 0x17, 0x16, 0x7a, 0x36, 0x31, 0x9c, 0x11, 0xdf, 0x92, 0x21, 0xc5, 0x55, 0x71, 0x55, - 0x4d, 0xca, 0x24, 0x8d, 0x9e, 0x66, 0xc3, 0x7f, 0xd5, 0xe0, 0x7a, 0x27, 0x76, 0x11, 0x3d, 0xf2, - 0x68, 0xcc, 0x05, 0x16, 0xf1, 0xf3, 0x0c, 0xf0, 0x0c, 0x60, 0x18, 0x12, 0x89, 0x48, 0xbe, 0xa3, - 0xbe, 0x70, 0x26, 0xcb, 0x5b, 0x8f, 0x30, 0xfc, 0x7e, 0x56, 0xa4, 0xb5, 0xee, 0xc2, 0x7c, 0x62, - 0xf9, 0xa5, 0xee, 0xe6, 0xeb, 0x70, 0x2d, 0x7f, 0x77, 0x7a, 0x5e, 0x1f, 0xae, 0xef, 0xbe, 0xe4, - 0x71, 0x9b, 0x50, 0xfe, 0x74, 0x44, 0x3c, 0x79, 0xd6, 0xaa, 0x2e, 0x41, 0x9a, 0x91, 0xe4, 0x45, - 0xcf, 0x1e, 0x99, 0x64, 0xd7, 0x76, 0x0f, 0x0d, 0xdb, 0x97, 0x19, 0x19, 0xc7, 0xe2, 0x3f, 0x6a, - 0x70, 0x6d, 0x77, 0x92, 0x5a, 0xe8, 0x07, 0x31, 0x93, 0xf2, 0x70, 0xbf, 0xad, 0x98, 0x74, 0x22, - 0xf7, 0xd7, 0x69, 0xd0, 0x5f, 0x17, 0x60, 0x2e, 0xf6, 0x62, 0xcd, 0x9b, 0x49, 0xd8, 0x6e, 0xef, - 0x84, 0x98, 0x22, 0x1f, 0x04, 0x24, 0xe7, 0x29, 0x7b, 0xb2, 0xee, 0x0a, 0x28, 0x77, 0x72, 0x12, - 0xa6, 0x67, 0x49, 0xbd, 0x92, 0x27, 0xce, 0x4c, 0x50, 0x1b, 0xea, 0x26, 0x19, 0xda, 0xee, 0x99, - 0xac, 0x89, 0xa2, 0x97, 0x51, 0x07, 0x09, 0x54, 0xf9, 0x9d, 0x18, 0x91, 0x9e, 0x60, 0xa2, 0x46, - 0x19, 0x5a, 0x66, 0xb3, 0xc2, 0x8d, 0x32, 0xb4, 0x4c, 0x74, 0x03, 0xe6, 0x7c, 0xc3, 0x31, 0x0f, - 0xdd, 0x17, 0x9d, 0xc0, 0x74, 0x47, 0x41, 0xb3, 0xca, 0x27, 0x59, 0x31, 0x24, 0xad, 0xe4, 0x28, - 0x2d, 0x3e, 0x36, 0x03, 0xd2, 0x12, 0x33, 0xa0, 0x26, 0x94, 0x8d, 0x23, 0x3e, 0x1c, 0xe3, 0xf6, - 0x96, 0x20, 0x5d, 0x71, 0xfb, 0x7d, 0xe2, 0x85, 0x06, 0x93, 0x20, 0x6d, 0xf7, 0xc8, 0x0b, 0xd2, - 0x1b, 0x05, 0x2e, 0x5d, 0xe4, 0x56, 0x53, 0x30, 0x78, 0x01, 0xe6, 0x77, 0x49, 0x20, 0x12, 0x9b, - 0x77, 0x56, 0x1f, 0xc3, 0x5c, 0x84, 0xa2, 0x41, 0x16, 0x36, 0x25, 0xda, 0x85, 0x9a, 0x12, 0xbc, - 0x06, 0x75, 0x21, 0x40, 0xe9, 0xf7, 0x84, 0x3f, 0x35, 0xd5, 0x9f, 0xf8, 0x7d, 0x98, 0x0d, 0x29, - 0xe9, 0x4e, 0xaf, 0x41, 0x91, 0xae, 0x88, 0x4b, 0x69, 0x31, 0xe1, 0x09, 0xb6, 0x07, 0x23, 0xc0, - 0x6d, 0x98, 0xa3, 0x98, 0x6d, 0xea, 0xcd, 0xdc, 0xe8, 0xa2, 0x4d, 0x18, 0x67, 0x7f, 0xe8, 0x9a, - 0x24, 0x6c, 0xc2, 0x22, 0x14, 0xfe, 0x09, 0xd4, 0xb6, 0xdd, 0xc1, 0xc0, 0x70, 0x4c, 0xe9, 0x4b, - 0xe2, 0x8c, 0xd9, 0x31, 0xab, 0x3a, 0xfd, 0xc9, 0x02, 0xeb, 0x98, 0xd8, 0xb6, 0x88, 0x4f, 0x0e, - 0x44, 0x61, 0x3f, 0xad, 0x84, 0x3d, 0x0d, 0x37, 0xc3, 0x3b, 0x1a, 0xf1, 0xa6, 0xb2, 0xc8, 0x64, - 0x44, 0x08, 0xaa, 0x20, 0xed, 0x53, 0x44, 0x84, 0xb2, 0xdf, 0xf8, 0x21, 0xd4, 0xb6, 0x8f, 0x0d, - 0xc7, 0x21, 0x76, 0xee, 0x19, 0x90, 0xf2, 0x76, 0xaa, 0x8a, 0x9a, 0xca, 0xac, 0xe9, 0x1d, 0x91, - 0x20, 0xca, 0x0e, 0x0a, 0xe1, 0x2f, 0xa6, 0xa1, 0x12, 0xa6, 0xdb, 0xb7, 0xa0, 0xea, 0x53, 0xe7, - 0xb0, 0xc8, 0xe6, 0xf6, 0xcc, 0x77, 0x5c, 0x44, 0x4a, 0xf9, 0x7a, 0xd2, 0xaa, 0xe2, 0x31, 0xd8, - 0x4c, 0xf8, 0x21, 0xb4, 0xba, 0x1e, 0x91, 0xa2, 0xef, 0xc0, 0xbc, 0xe5, 0x1c, 0xba, 0x23, 0xc7, - 0x14, 0x47, 0xa2, 0x97, 0x1a, 0x0d, 0x97, 0x25, 0xb5, 0xb4, 0x44, 0xa7, 0xd5, 0x93, 0xe4, 0x68, - 0x0b, 0x1a, 0xee, 0x28, 0x88, 0x8b, 0x28, 0x4e, 0x14, 0x91, 0xa2, 0x47, 0xb7, 0xa9, 0xcb, 0x43, - 0x87, 0x32, 0x63, 0x27, 0xd8, 0xa3, 0x55, 0x5d, 0x25, 0xa5, 0x89, 0x47, 0x23, 0x8b, 0x0d, 0x3c, - 0xf9, 0x5d, 0x11, 0xc2, 0x6c, 0x66, 0xec, 0x8c, 0xf7, 0x4c, 0x76, 0x43, 0x54, 0x75, 0x0e, 0xa0, - 0xed, 0xd8, 0xdd, 0xcb, 0xbb, 0xd6, 0x6f, 0x64, 0x84, 0xec, 0xd7, 0x79, 0xcd, 0xbe, 0x05, 0x8b, - 0xf1, 0x72, 0xcd, 0xf3, 0xad, 0x09, 0x65, 0x9e, 0x61, 0xbe, 0x08, 0x66, 0x09, 0xe2, 0x9f, 0x6b, - 0xb0, 0x90, 0x2a, 0xf0, 0xe8, 0x0e, 0xd4, 0x4e, 0x2c, 0xdb, 0x26, 0x66, 0xf7, 0x42, 0x79, 0xae, - 0x12, 0xa3, 0x0f, 0x61, 0xd6, 0xe3, 0xcf, 0x12, 0xf9, 0xb2, 0x99, 0xcc, 0x1c, 0xa3, 0xc6, 0xdb, - 0xec, 0xfe, 0xa1, 0x2d, 0x46, 0xa8, 0x7c, 0x68, 0x6d, 0x4d, 0xb5, 0x76, 0x0b, 0x2a, 0x43, 0x23, - 0x38, 0xee, 0x0c, 0x49, 0x4f, 0x3e, 0x24, 0x25, 0x8c, 0x3f, 0x2b, 0x42, 0x45, 0x76, 0x29, 0xff, - 0x9b, 0xd9, 0x77, 0x7f, 0x64, 0xdb, 0xea, 0xec, 0x5b, 0xc2, 0xaa, 0x65, 0x4b, 0x31, 0xcb, 0xa2, - 0xd7, 0xa1, 0x44, 0x5f, 0xb6, 0x7e, 0x73, 0x86, 0x19, 0x20, 0xb3, 0x83, 0xe2, 0x14, 0xe8, 0x6e, - 0x6a, 0xda, 0xf2, 0x6a, 0x06, 0x75, 0xee, 0x98, 0xe5, 0x9d, 0xd8, 0x98, 0xe5, 0x5a, 0x16, 0x6b, - 0xb2, 0x89, 0xbd, 0x9b, 0x9a, 0xaf, 0x64, 0xee, 0xf8, 0x7f, 0x34, 0x58, 0xb9, 0xc3, 0xaa, 0x98, - 0x08, 0x2c, 0x1a, 0xe3, 0xa1, 0x7f, 0xb4, 0xf3, 0xfc, 0x83, 0x7f, 0xaf, 0xc1, 0x2b, 0xbb, 0x24, - 0x78, 0x9a, 0x18, 0x27, 0x84, 0x11, 0xba, 0x0a, 0x35, 0x8f, 0x0c, 0xdd, 0x47, 0x46, 0x10, 0x10, - 0x4f, 0xce, 0x30, 0x55, 0x14, 0x5a, 0x83, 0x79, 0x8f, 0x8c, 0x2d, 0xdf, 0x72, 0x1d, 0x49, 0xc5, - 0x35, 0x4c, 0xa2, 0xa9, 0x2c, 0xc3, 0xb6, 0xb7, 0x3c, 0xc3, 0xe9, 0x1d, 0x13, 0xf9, 0x10, 0x54, - 0x51, 0xac, 0xec, 0xdb, 0x76, 0xd7, 0x38, 0xf2, 0xc5, 0x4b, 0x5f, 0x82, 0xf8, 0x10, 0x2e, 0x25, - 0x75, 0x94, 0x29, 0x40, 0x95, 0x91, 0x29, 0x40, 0x7f, 0xb3, 0xfb, 0x4d, 0x8e, 0x4b, 0x44, 0xfe, - 0x48, 0x98, 0x35, 0x69, 0x42, 0x2d, 0x91, 0x09, 0x21, 0x8c, 0x3f, 0x81, 0xe5, 0x6c, 0x53, 0x50, - 0x9b, 0x3e, 0x84, 0x85, 0xe4, 0xcc, 0x25, 0xab, 0xe9, 0xca, 0x52, 0x52, 0x4f, 0x73, 0x62, 0x04, - 0x8d, 0x07, 0x96, 0x4f, 0xbb, 0x15, 0x57, 0xf9, 0xb6, 0x54, 0xa1, 0x70, 0x6e, 0x6a, 0x37, 0xa1, - 0x2c, 0x12, 0x43, 0xd4, 0x68, 0x09, 0x52, 0x1f, 0x88, 0x9f, 0x7a, 0xfc, 0x70, 0x49, 0x34, 0xfe, - 0x14, 0xea, 0xca, 0xbe, 0x32, 0x58, 0x28, 0x94, 0x15, 0x2c, 0x42, 0x1b, 0x9d, 0x53, 0xa0, 0xf7, - 0xe0, 0xf2, 0x11, 0x7b, 0xaf, 0xef, 0x24, 0x36, 0xe3, 0x56, 0xce, 0x5e, 0xc4, 0xfb, 0x50, 0xdf, - 0x34, 0x4d, 0x2a, 0x4b, 0x06, 0x55, 0xd6, 0xe1, 0x32, 0x8e, 0x50, 0xc8, 0x3e, 0x82, 0x0e, 0xb3, - 0xa1, 0x3c, 0xfe, 0x66, 0x43, 0x0e, 0x39, 0x4d, 0xaa, 0xc4, 0x65, 0x67, 0xac, 0xd0, 0xdd, 0x2d, - 0x59, 0xf1, 0xab, 0x3a, 0xfb, 0x8d, 0x5f, 0x87, 0x05, 0x9d, 0x0c, 0xdc, 0x31, 0x51, 0xd5, 0xbc, - 0x04, 0x25, 0xcb, 0x31, 0xc9, 0x0b, 0xf9, 0xe5, 0x85, 0x01, 0xf8, 0xdb, 0x30, 0xaf, 0x92, 0x52, - 0x0d, 0x6e, 0x42, 0x5d, 0xdd, 0x27, 0x0c, 0xc7, 0x04, 0x16, 0xbf, 0x01, 0x8b, 0x3a, 0xe9, 0x7b, - 0xc4, 0x3f, 0x56, 0xfd, 0x9e, 0xb3, 0xcf, 0x37, 0xe1, 0x72, 0x87, 0x04, 0x0a, 0xfb, 0x64, 0xf2, - 0xbb, 0xac, 0x49, 0xdd, 0xcd, 0xf2, 0x80, 0x64, 0x54, 0x63, 0x5f, 0x4b, 0xc4, 0xfe, 0xf7, 0x59, - 0x57, 0x48, 0xb7, 0xc9, 0x61, 0xce, 0xdc, 0x35, 0x26, 0xb2, 0x90, 0x10, 0xf9, 0x0e, 0xbc, 0x92, - 0x27, 0x92, 0x1a, 0x4d, 0xba, 0x41, 0x53, 0xdc, 0x50, 0x86, 0x52, 0x7b, 0x30, 0x0c, 0xce, 0x36, - 0xfe, 0x55, 0x87, 0xb2, 0x18, 0x52, 0xa1, 0x6d, 0xa8, 0x75, 0x3d, 0xa3, 0x77, 0xc2, 0x3f, 0x75, - 0xa2, 0x66, 0xea, 0xeb, 0xa7, 0x50, 0xb1, 0xb5, 0x94, 0xb1, 0x42, 0x1b, 0xda, 0xa9, 0xb7, 0x35, - 0xf4, 0x0c, 0x1a, 0xc9, 0x4f, 0x55, 0x08, 0xc7, 0xbb, 0xc7, 0xac, 0x2f, 0x71, 0xad, 0xd5, 0x89, - 0x34, 0x4c, 0x3a, 0xda, 0x82, 0x8a, 0xfc, 0x94, 0x83, 0xd4, 0x41, 0x64, 0xe2, 0x53, 0x50, 0xab, - 0x99, 0xb9, 0xc6, 0x65, 0x3c, 0x65, 0x8f, 0x03, 0xf5, 0x1b, 0x0f, 0x7a, 0x35, 0xb7, 0xb9, 0x0d, - 0x4f, 0x7c, 0x7d, 0x12, 0x09, 0x17, 0xfc, 0x63, 0x40, 0xe9, 0x51, 0x2c, 0xba, 0x71, 0x91, 0xf9, - 0x70, 0x0b, 0x9f, 0x43, 0xc5, 0x77, 0xe8, 0x42, 0x3d, 0x3e, 0x18, 0x47, 0xab, 0xe7, 0x4d, 0xe5, - 0x5b, 0x2b, 0x13, 0x28, 0x42, 0xa9, 0xf1, 0x13, 0xa1, 0xd5, 0xdc, 0xc3, 0x66, 0x49, 0xcd, 0x18, - 0x1d, 0x73, 0x6b, 0xa4, 0x67, 0x9f, 0x31, 0x6b, 0xe4, 0xce, 0x69, 0x63, 0xd6, 0xc8, 0x19, 0xa0, - 0xe2, 0x29, 0xf4, 0x23, 0x58, 0x48, 0x4d, 0xed, 0x90, 0xfa, 0x56, 0xce, 0x9b, 0x86, 0xb6, 0x5e, - 0x9d, 0x4c, 0x14, 0x1e, 0x20, 0x3d, 0xf3, 0x8a, 0x1d, 0x20, 0x77, 0x4a, 0x17, 0x3b, 0x40, 0xce, - 0xe0, 0x8c, 0x47, 0xb3, 0xec, 0x89, 0x63, 0xd1, 0x9c, 0xe8, 0x9d, 0x63, 0xd1, 0x1c, 0x6b, 0xa2, - 0xf1, 0x14, 0xfa, 0x18, 0xca, 0x02, 0x85, 0x96, 0xd3, 0x64, 0x52, 0xc2, 0x95, 0xac, 0x25, 0x2e, - 0x60, 0x1f, 0x66, 0xd5, 0xa7, 0x3b, 0x5a, 0xc9, 0x1d, 0xda, 0x71, 0x51, 0x13, 0x87, 0x7a, 0xe1, - 0xa1, 0xd8, 0x13, 0x29, 0x79, 0x28, 0xf5, 0x41, 0x9e, 0x3c, 0x54, 0xf4, 0xa6, 0xc2, 0x53, 0xa8, - 0xcf, 0x3e, 0xc3, 0xa6, 0x9e, 0x07, 0xe8, 0x66, 0x9c, 0x27, 0xef, 0x29, 0xd5, 0xba, 0x71, 0x2e, - 0x1d, 0xdf, 0xa7, 0x0d, 0xd5, 0xb0, 0x44, 0xa3, 0x57, 0x14, 0xa6, 0xe4, 0x83, 0xa1, 0xb5, 0x9c, - 0xbd, 0x18, 0xfa, 0x40, 0x94, 0xc9, 0x98, 0x0f, 0xe2, 0xa5, 0x38, 0xe6, 0x03, 0xb5, 0xaa, 0xe2, - 0x29, 0x74, 0x1f, 0x20, 0x2a, 0x74, 0xe8, 0x6a, 0xec, 0x5d, 0x90, 0x28, 0x95, 0xad, 0x56, 0xce, - 0xaa, 0xb4, 0xfe, 0xac, 0x5a, 0xf7, 0x62, 0xde, 0xcc, 0x28, 0x88, 0xad, 0x86, 0x3a, 0xc5, 0xa6, - 0xf5, 0x00, 0x4f, 0xa1, 0x7b, 0x50, 0x8f, 0x97, 0xc3, 0xd8, 0x7d, 0x90, 0x59, 0x29, 0x33, 0xe5, - 0x3c, 0x83, 0x66, 0x5e, 0x9d, 0x44, 0xb7, 0xe2, 0x12, 0x27, 0x15, 0xd3, 0x4c, 0xd9, 0x36, 0x2c, - 0x65, 0x57, 0x3c, 0xb4, 0x16, 0x97, 0x9c, 0x5f, 0x67, 0x5b, 0x37, 0x2f, 0x40, 0xc9, 0xad, 0xfa, - 0x21, 0x54, 0xc3, 0xff, 0x98, 0xc4, 0xe2, 0x24, 0xf9, 0xcf, 0x93, 0xb8, 0xae, 0x63, 0xe2, 0x04, - 0x6f, 0x6b, 0x5b, 0xb7, 0xff, 0xfc, 0xf9, 0x8a, 0xf6, 0x8f, 0xcf, 0x57, 0xb4, 0x7f, 0x7f, 0xbe, - 0xa2, 0xfd, 0xea, 0x3f, 0x2b, 0x53, 0x80, 0x7b, 0xc7, 0xeb, 0x3d, 0xe2, 0x39, 0xeb, 0x86, 0x6d, - 0xf5, 0xc8, 0xba, 0xbb, 0xb1, 0x2e, 0x79, 0xbc, 0x61, 0xcf, 0x27, 0xde, 0x98, 0x78, 0xcf, 0x0a, - 0xc3, 0xc3, 0xc3, 0x19, 0xf6, 0x07, 0xb8, 0x77, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x88, 0xc8, - 0x1a, 0x41, 0x1a, 0x27, 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// ControlClient is the client API for Control service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) - GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) - GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) - NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) - NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) - GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) - ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) - DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) - GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) - GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) - CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) - GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) - GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) - ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) - AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) - RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) - RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) - SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) - SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) - SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) +func (x *RefreshReposRequest) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 } -type controlClient struct { - cc *grpc.ClientConn -} +type SetDefaultRepoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields -func NewControlClient(cc *grpc.ClientConn) ControlClient { - return &controlClient{cc} + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err +func (x *SetDefaultRepoRequest) Reset() { + *x = SetDefaultRepoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return x, nil } -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream +func (x *SetDefaultRepoRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -type controlTrackStatusClient struct { - grpc.ClientStream -} +func (*SetDefaultRepoRequest) ProtoMessage() {} -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[60] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return m, nil + return mi.MessageOf(x) } -func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { - out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. +func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) - if err != nil { - return nil, err +func (x *SetDefaultRepoRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return out, nil + return 0 } -func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { - out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetGlobalDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Revision string `protobuf:"bytes,1,opt,name=revision,proto3" json:"revision,omitempty"` } -func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { - out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *SetGlobalDefaultRevisionRequest) Reset() { + *x = SetGlobalDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { - out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetGlobalDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { - out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[61] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { - out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) - if err != nil { - return nil, err +func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return out, nil + return "" } -func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { - out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetRepoDefaultRevisionRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"` + Revision string `protobuf:"bytes,2,opt,name=revision,proto3" json:"revision,omitempty"` } -func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { - out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) Reset() { + *x = SetRepoDefaultRevisionRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { - out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetRepoDefaultRevisionRequest) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { - out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) - if err != nil { - return nil, err +func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[62] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { - out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } -func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { - out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { + if x != nil { + return x.Index } - return out, nil + return 0 } -func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { - out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionRequest) GetRevision() string { + if x != nil { + return x.Revision } - return out, nil + return "" } -func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { - out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +type SetRepoDefaultRevisionReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` } -func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { - out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionReply) Reset() { + *x = SetRepoDefaultRevisionReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return out, nil } -func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +func (x *SetRepoDefaultRevisionReply) String() string { + return protoimpl.X.MessageStringOf(x) } -func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) - if err != nil { - return nil, err +func (*SetRepoDefaultRevisionReply) ProtoMessage() {} + +func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[63] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return out, nil + return mi.MessageOf(x) } -func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil +// Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. +func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } -func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { - out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) - if err != nil { - return nil, err +func (x *SetRepoDefaultRevisionReply) GetInfo() string { + if x != nil { + return x.Info } - return out, nil + return "" } -func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) - if err != nil { - return nil, err - } - x := &controlSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields } -type Control_SubscribeClient interface { - Recv() (*Event, error) - grpc.ClientStream +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } -type controlSubscribeClient struct { - grpc.ClientStream +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[64] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return m, nil + return mi.MessageOf(x) } -// ControlServer is the server API for Control service. -type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error - GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) - GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) - NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) - NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) - GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) - ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) - DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) - GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) - GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) - CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) - GetRoles(context.Context, *GetRolesRequest) (*GetRolesReply, error) - GetWorkflowTemplates(context.Context, *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) - ListRepos(context.Context, *ListReposRequest) (*ListReposReply, error) - AddRepo(context.Context, *AddRepoRequest) (*AddRepoReply, error) - RemoveRepo(context.Context, *RemoveRepoRequest) (*RemoveRepoReply, error) - RefreshRepos(context.Context, *RefreshReposRequest) (*Empty, error) - SetDefaultRepo(context.Context, *SetDefaultRepoRequest) (*Empty, error) - SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) - SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) - Subscribe(*SubscribeRequest, Control_SubscribeServer) error +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{64} +} + +var File_protos_o2control_proto protoreflect.FileDescriptor + +var file_protos_o2control_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, + 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, + 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, + 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, + 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, + 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, + 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, + 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, + 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, + 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, + 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } -// UnimplementedControlServer can be embedded to have forward compatible implementations. -type UnimplementedControlServer struct { -} +var ( + file_protos_o2control_proto_rawDescOnce sync.Once + file_protos_o2control_proto_rawDescData = file_protos_o2control_proto_rawDesc +) -func (*UnimplementedControlServer) TrackStatus(req *StatusRequest, srv Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} -func (*UnimplementedControlServer) GetFrameworkInfo(ctx context.Context, req *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") -} -func (*UnimplementedControlServer) Teardown(ctx context.Context, req *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} -func (*UnimplementedControlServer) GetEnvironments(ctx context.Context, req *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") -} -func (*UnimplementedControlServer) NewAutoEnvironment(ctx context.Context, req *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewAutoEnvironment not implemented") -} -func (*UnimplementedControlServer) NewEnvironment(ctx context.Context, req *NewEnvironmentRequest) (*NewEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method NewEnvironment not implemented") -} -func (*UnimplementedControlServer) GetEnvironment(ctx context.Context, req *GetEnvironmentRequest) (*GetEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEnvironment not implemented") -} -func (*UnimplementedControlServer) ControlEnvironment(ctx context.Context, req *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") -} -func (*UnimplementedControlServer) ModifyEnvironment(ctx context.Context, req *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} -func (*UnimplementedControlServer) DestroyEnvironment(ctx context.Context, req *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") -} -func (*UnimplementedControlServer) GetTasks(ctx context.Context, req *GetTasksRequest) (*GetTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") -} -func (*UnimplementedControlServer) GetTask(ctx context.Context, req *GetTaskRequest) (*GetTaskReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetTask not implemented") -} -func (*UnimplementedControlServer) CleanupTasks(ctx context.Context, req *CleanupTasksRequest) (*CleanupTasksReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method CleanupTasks not implemented") -} -func (*UnimplementedControlServer) GetRoles(ctx context.Context, req *GetRolesRequest) (*GetRolesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRoles not implemented") -} -func (*UnimplementedControlServer) GetWorkflowTemplates(ctx context.Context, req *GetWorkflowTemplatesRequest) (*GetWorkflowTemplatesReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkflowTemplates not implemented") -} -func (*UnimplementedControlServer) ListRepos(ctx context.Context, req *ListReposRequest) (*ListReposReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRepos not implemented") -} -func (*UnimplementedControlServer) AddRepo(ctx context.Context, req *AddRepoRequest) (*AddRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddRepo not implemented") -} -func (*UnimplementedControlServer) RemoveRepo(ctx context.Context, req *RemoveRepoRequest) (*RemoveRepoReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveRepo not implemented") -} -func (*UnimplementedControlServer) RefreshRepos(ctx context.Context, req *RefreshReposRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method RefreshRepos not implemented") -} -func (*UnimplementedControlServer) SetDefaultRepo(ctx context.Context, req *SetDefaultRepoRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetDefaultRepo not implemented") -} -func (*UnimplementedControlServer) SetGlobalDefaultRevision(ctx context.Context, req *SetGlobalDefaultRevisionRequest) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetGlobalDefaultRevision not implemented") -} -func (*UnimplementedControlServer) SetRepoDefaultRevision(ctx context.Context, req *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetRepoDefaultRevision not implemented") -} -func (*UnimplementedControlServer) Subscribe(req *SubscribeRequest, srv Control_SubscribeServer) error { - return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") -} - -func RegisterControlServer(s *grpc.Server, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) -} - -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetFrameworkInfoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetFrameworkInfo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/Teardown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironments(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewAutoEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewAutoEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(NewEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).NewEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ControlEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ControlEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DestroyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).DestroyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetTaskRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetTask(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetTask", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CleanupTasksRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).CleanupTasks(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetRolesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetRoles(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetRoles", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetWorkflowTemplatesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).GetWorkflowTemplates(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ListReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ListRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/ListRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(AddRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).AddRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/AddRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RemoveRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RemoveRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RefreshReposRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).RefreshRepos(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetDefaultRepoRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetDefaultRepo(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetGlobalDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetRepoDefaultRevisionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) +func file_protos_o2control_proto_rawDescGZIP() []byte { + file_protos_o2control_proto_rawDescOnce.Do(func() { + file_protos_o2control_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_o2control_proto_rawDescData) + }) + return file_protos_o2control_proto_rawDescData +} + +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_goTypes = []interface{}{ + (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level + (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype + (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 7: o2control.StatusRequest + (*StatusReply)(nil), // 8: o2control.StatusReply + (*StatusUpdate)(nil), // 9: o2control.StatusUpdate + (*Event)(nil), // 10: o2control.Event + (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 13: o2control.Version + (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 15: o2control.TeardownRequest + (*TeardownReply)(nil), // 16: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 40: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 42: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo + (*CommandInfo)(nil), // 44: o2control.CommandInfo + (*ChannelInfo)(nil), // 45: o2control.ChannelInfo + (*TaskInfo)(nil), // 46: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest + (*RoleInfo)(nil), // 50: o2control.RoleInfo + (*GetRolesReply)(nil), // 51: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest + (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 55: o2control.ListReposRequest + (*RepoInfo)(nil), // 56: o2control.RepoInfo + (*ListReposReply)(nil), // 57: o2control.ListReposReply + (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 59: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 67: o2control.Empty + nil, // 68: o2control.EnvironmentInfo.DefaultsEntry + nil, // 69: o2control.EnvironmentInfo.VarsEntry + nil, // 70: o2control.EnvironmentInfo.UserVarsEntry + nil, // 71: o2control.NewEnvironmentRequest.VarsEntry + nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 75: o2control.TaskInfo.PropertiesEntry + nil, // 76: o2control.RoleInfo.DefaultsEntry + nil, // 77: o2control.RoleInfo.VarsEntry + nil, // 78: o2control.RoleInfo.UserVarsEntry + nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry +} +var file_protos_o2control_proto_depIdxs = []int32{ + 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level + 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event + 66, // [66:89] is the sub-list for method output_type + 43, // [43:66] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name +} + +func init() { file_protos_o2control_proto_init() } +func file_protos_o2control_proto_init() { + if File_protos_o2control_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event_MesosHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RoleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubscribeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetFrameworkInfoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TeardownReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentsReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewAutoEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewAutoEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ControlEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentOperation); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ModifyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DestroyEnvironmentReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetEnvironmentPropertiesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShortTaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskDeploymentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetTaskReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskClassInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CommandInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ChannelInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TaskInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CleanupTasksReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoleInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetRolesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplateInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetWorkflowTemplatesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RepoInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListReposReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AddRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RemoveRepoReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RefreshReposRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetDefaultRepoRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetRepoDefaultRevisionReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ + (*StatusUpdate_MesosHeartbeat)(nil), } - return interceptor(ctx, in, info, handler) -} - -func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err + file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), } - return srv.(ControlServer).Subscribe(m, &controlSubscribeServer{stream}) -} - -type Control_SubscribeServer interface { - Send(*Event) error - grpc.ServerStream -} - -type controlSubscribeServer struct { - grpc.ServerStream -} - -func (x *controlSubscribeServer) Send(m *Event) error { - return x.ServerStream.SendMsg(m) -} - -var _Control_serviceDesc = grpc.ServiceDesc{ - ServiceName: "o2control.Control", - HandlerType: (*ControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetFrameworkInfo", - Handler: _Control_GetFrameworkInfo_Handler, - }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, - { - MethodName: "GetEnvironments", - Handler: _Control_GetEnvironments_Handler, - }, - { - MethodName: "NewAutoEnvironment", - Handler: _Control_NewAutoEnvironment_Handler, - }, - { - MethodName: "NewEnvironment", - Handler: _Control_NewEnvironment_Handler, - }, - { - MethodName: "GetEnvironment", - Handler: _Control_GetEnvironment_Handler, - }, - { - MethodName: "ControlEnvironment", - Handler: _Control_ControlEnvironment_Handler, - }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, - { - MethodName: "DestroyEnvironment", - Handler: _Control_DestroyEnvironment_Handler, + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_o2control_proto_rawDesc, + NumEnums: 3, + NumMessages: 77, + NumExtensions: 0, + NumServices: 1, }, - { - MethodName: "GetTasks", - Handler: _Control_GetTasks_Handler, - }, - { - MethodName: "GetTask", - Handler: _Control_GetTask_Handler, - }, - { - MethodName: "CleanupTasks", - Handler: _Control_CleanupTasks_Handler, - }, - { - MethodName: "GetRoles", - Handler: _Control_GetRoles_Handler, - }, - { - MethodName: "GetWorkflowTemplates", - Handler: _Control_GetWorkflowTemplates_Handler, - }, - { - MethodName: "ListRepos", - Handler: _Control_ListRepos_Handler, - }, - { - MethodName: "AddRepo", - Handler: _Control_AddRepo_Handler, - }, - { - MethodName: "RemoveRepo", - Handler: _Control_RemoveRepo_Handler, - }, - { - MethodName: "RefreshRepos", - Handler: _Control_RefreshRepos_Handler, - }, - { - MethodName: "SetDefaultRepo", - Handler: _Control_SetDefaultRepo_Handler, - }, - { - MethodName: "SetGlobalDefaultRevision", - Handler: _Control_SetGlobalDefaultRevision_Handler, - }, - { - MethodName: "SetRepoDefaultRevision", - Handler: _Control_SetRepoDefaultRevision_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, - { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/o2control.proto", -} - -func (m *Event_MesosHeartbeat) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *Ev_EnvironmentEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Message) > 0 { - i -= len(m.Message) - copy(dAtA[i:], m.Message) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Message))) - i-- - dAtA[i] = 0x2a - } - if len(m.Error) > 0 { - i -= len(m.Error) - copy(dAtA[i:], m.Error) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Error))) - i-- - dAtA[i] = 0x22 - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvironmentId) > 0 { - i -= len(m.EnvironmentId) - copy(dAtA[i:], m.EnvironmentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvironmentId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_TaskEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Taskid) > 0 { - i -= len(m.Taskid) - copy(dAtA[i:], m.Taskid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Taskid))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Ev_RoleEvent) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Ev_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Ev_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RolePath) > 0 { - i -= len(m.RolePath) - copy(dAtA[i:], m.RolePath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RolePath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *StatusReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.StatusUpdates) > 0 { - for iNdEx := len(m.StatusUpdates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.StatusUpdates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *StatusUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Event != nil { - { - size := m.Event.Size() - i -= size - if _, err := m.Event.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if m.Level != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Level)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StatusUpdate_MesosHeartbeat) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.MesosHeartbeat != nil { - { - size, err := m.MesosHeartbeat.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Event) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Payload != nil { - { - size := m.Payload.Size() - i -= size - if _, err := m.Payload.MarshalTo(dAtA[i:]); err != nil { - return 0, err - } - } - } - if len(m.Timestamp) > 0 { - i -= len(m.Timestamp) - copy(dAtA[i:], m.Timestamp) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Timestamp))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Event_EnvironmentEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_EnvironmentEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.EnvironmentEvent != nil { - { - size, err := m.EnvironmentEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - return len(dAtA) - i, nil -} -func (m *Event_TaskEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) + GoTypes: file_protos_o2control_proto_goTypes, + DependencyIndexes: file_protos_o2control_proto_depIdxs, + EnumInfos: file_protos_o2control_proto_enumTypes, + MessageInfos: file_protos_o2control_proto_msgTypes, + }.Build() + File_protos_o2control_proto = out.File + file_protos_o2control_proto_rawDesc = nil + file_protos_o2control_proto_goTypes = nil + file_protos_o2control_proto_depIdxs = nil } - -func (m *Event_TaskEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.TaskEvent != nil { - { - size, err := m.TaskEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - return len(dAtA) - i, nil -} -func (m *Event_RoleEvent) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Event_RoleEvent) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.RoleEvent != nil { - { - size, err := m.RoleEvent.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - return len(dAtA) - i, nil -} -func (m *SubscribeRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SubscribeRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SubscribeRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *Version) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Version) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Version) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.VersionStr) > 0 { - i -= len(m.VersionStr) - copy(dAtA[i:], m.VersionStr) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.VersionStr))) - i-- - dAtA[i] = 0x32 - } - if len(m.ProductName) > 0 { - i -= len(m.ProductName) - copy(dAtA[i:], m.ProductName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ProductName))) - i-- - dAtA[i] = 0x2a - } - if len(m.Build) > 0 { - i -= len(m.Build) - copy(dAtA[i:], m.Build) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Build))) - i-- - dAtA[i] = 0x22 - } - if m.Patch != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Patch)) - i-- - dAtA[i] = 0x18 - } - if m.Minor != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Minor)) - i-- - dAtA[i] = 0x10 - } - if m.Major != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Major)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *GetFrameworkInfoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetFrameworkInfoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetFrameworkInfoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Version != nil { - { - size, err := m.Version.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.InstanceName) > 0 { - i -= len(m.InstanceName) - copy(dAtA[i:], m.InstanceName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.InstanceName))) - i-- - dAtA[i] = 0x32 - } - if m.HostsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.HostsCount)) - i-- - dAtA[i] = 0x28 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x22 - } - if m.TasksCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.TasksCount)) - i-- - dAtA[i] = 0x18 - } - if m.EnvironmentsCount != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.EnvironmentsCount)) - i-- - dAtA[i] = 0x10 - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Reason) > 0 { - i -= len(m.Reason) - copy(dAtA[i:], m.Reason) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Reason))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TeardownReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TeardownReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TeardownReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentsReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentsReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentsReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Environments) > 0 { - for iNdEx := len(m.Environments) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Environments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.FrameworkId) > 0 { - i -= len(m.FrameworkId) - copy(dAtA[i:], m.FrameworkId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FrameworkId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x30 - } - if len(m.RootRole) > 0 { - i -= len(m.RootRole) - copy(dAtA[i:], m.RootRole) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RootRole))) - i-- - dAtA[i] = 0x2a - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.CreatedWhen) > 0 { - i -= len(m.CreatedWhen) - copy(dAtA[i:], m.CreatedWhen) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.CreatedWhen))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewAutoEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x1a - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.WorkflowTemplate) > 0 { - i -= len(m.WorkflowTemplate) - copy(dAtA[i:], m.WorkflowTemplate) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.WorkflowTemplate))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *NewAutoEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *NewAutoEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *NewAutoEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Workflow != nil { - { - size, err := m.Workflow.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.Environment != nil { - { - size, err := m.Environment.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ControlEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x10 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ControlEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ControlEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ControlEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CurrentRunNumber != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.CurrentRunNumber)) - i-- - dAtA[i] = 0x18 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x12 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ModifyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ReconfigureAll { - i-- - if m.ReconfigureAll { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Operations) > 0 { - for iNdEx := len(m.Operations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Operations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *EnvironmentOperation) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *EnvironmentOperation) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *EnvironmentOperation) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RoleName) > 0 { - i -= len(m.RoleName) - copy(dAtA[i:], m.RoleName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RoleName))) - i-- - dAtA[i] = 0x12 - } - if m.Type != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Type)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *ModifyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ModifyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ModifyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0x12 - } - if len(m.FailedOperations) > 0 { - for iNdEx := len(m.FailedOperations) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.FailedOperations[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *DestroyEnvironmentRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Force { - i-- - if m.Force { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllowInRunningState { - i-- - if m.AllowInRunningState { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if m.KeepTasks { - i-- - if m.KeepTasks { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *DestroyEnvironmentReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *DestroyEnvironmentReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *DestroyEnvironmentReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.CleanupTasksReply != nil { - { - size, err := m.CleanupTasksReply.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentPropertiesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.ExcludeGlobals { - i-- - if m.ExcludeGlobals { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.Queries) > 0 { - for iNdEx := len(m.Queries) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Queries[iNdEx]) - copy(dAtA[i:], m.Queries[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Queries[iNdEx]))) - i-- - dAtA[i] = 0x12 - } - } - if len(m.Id) > 0 { - i -= len(m.Id) - copy(dAtA[i:], m.Id) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Id))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetEnvironmentPropertiesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetEnvironmentPropertiesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetEnvironmentPropertiesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ShortTaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ShortTaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ShortTaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.SandboxStdout) > 0 { - i -= len(m.SandboxStdout) - copy(dAtA[i:], m.SandboxStdout) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.SandboxStdout))) - i-- - dAtA[i] = 0x4a - } - if len(m.Pid) > 0 { - i -= len(m.Pid) - copy(dAtA[i:], m.Pid) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Pid))) - i-- - dAtA[i] = 0x42 - } - if m.DeploymentInfo != nil { - { - size, err := m.DeploymentInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x3a - } - if len(m.ClassName) > 0 { - i -= len(m.ClassName) - copy(dAtA[i:], m.ClassName) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ClassName))) - i-- - dAtA[i] = 0x32 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x2a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x22 - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0x1a - } - if m.Locked { - i-- - if m.Locked { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskDeploymentInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskDeploymentInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskDeploymentInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ExecutorId) > 0 { - i -= len(m.ExecutorId) - copy(dAtA[i:], m.ExecutorId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ExecutorId))) - i-- - dAtA[i] = 0x22 - } - if len(m.OfferId) > 0 { - i -= len(m.OfferId) - copy(dAtA[i:], m.OfferId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.OfferId))) - i-- - dAtA[i] = 0x1a - } - if len(m.AgentId) > 0 { - i -= len(m.AgentId) - copy(dAtA[i:], m.AgentId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.AgentId))) - i-- - dAtA[i] = 0x12 - } - if len(m.Hostname) > 0 { - i -= len(m.Hostname) - copy(dAtA[i:], m.Hostname) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Hostname))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *GetTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Tasks) > 0 { - for iNdEx := len(m.Tasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Tasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetTaskRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskId) > 0 { - i -= len(m.TaskId) - copy(dAtA[i:], m.TaskId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetTaskReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetTaskReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetTaskReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Task != nil { - { - size, err := m.Task.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskClassInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskClassInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskClassInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.ControlMode) > 0 { - i -= len(m.ControlMode) - copy(dAtA[i:], m.ControlMode) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.ControlMode))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CommandInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CommandInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CommandInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.User) > 0 { - i -= len(m.User) - copy(dAtA[i:], m.User) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.User))) - i-- - dAtA[i] = 0x2a - } - if len(m.Arguments) > 0 { - for iNdEx := len(m.Arguments) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Arguments[iNdEx]) - copy(dAtA[i:], m.Arguments[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Arguments[iNdEx]))) - i-- - dAtA[i] = 0x22 - } - } - if len(m.Value) > 0 { - i -= len(m.Value) - copy(dAtA[i:], m.Value) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Value))) - i-- - dAtA[i] = 0x1a - } - if m.Shell { - i-- - if m.Shell { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Env) > 0 { - for iNdEx := len(m.Env) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.Env[iNdEx]) - copy(dAtA[i:], m.Env[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Env[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ChannelInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ChannelInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ChannelInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Target) > 0 { - i -= len(m.Target) - copy(dAtA[i:], m.Target) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Target))) - i-- - dAtA[i] = 0x1a - } - if len(m.Type) > 0 { - i -= len(m.Type) - copy(dAtA[i:], m.Type) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Type))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *TaskInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *TaskInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *TaskInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Properties) > 0 { - for k := range m.Properties { - v := m.Properties[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0x3a - } - if len(m.TaskPath) > 0 { - i -= len(m.TaskPath) - copy(dAtA[i:], m.TaskPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskPath))) - i-- - dAtA[i] = 0x32 - } - if m.CommandInfo != nil { - { - size, err := m.CommandInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - } - if len(m.OutboundChannels) > 0 { - for iNdEx := len(m.OutboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.OutboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - } - } - if len(m.InboundChannels) > 0 { - for iNdEx := len(m.InboundChannels) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.InboundChannels[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - } - } - if m.ClassInfo != nil { - { - size, err := m.ClassInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - if m.ShortInfo != nil { - { - size, err := m.ShortInfo.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *CleanupTasksReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *CleanupTasksReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CleanupTasksReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.RunningTasks) > 0 { - for iNdEx := len(m.RunningTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.RunningTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - } - } - if len(m.KilledTasks) > 0 { - for iNdEx := len(m.KilledTasks) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.KilledTasks[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetRolesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.PathSpec) > 0 { - i -= len(m.PathSpec) - copy(dAtA[i:], m.PathSpec) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.PathSpec))) - i-- - dAtA[i] = 0x12 - } - if len(m.EnvId) > 0 { - i -= len(m.EnvId) - copy(dAtA[i:], m.EnvId) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.EnvId))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RoleInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RoleInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RoleInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.UserVars) > 0 { - for k := range m.UserVars { - v := m.UserVars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x4a - } - } - if len(m.Vars) > 0 { - for k := range m.Vars { - v := m.Vars[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x42 - } - } - if len(m.Defaults) > 0 { - for k := range m.Defaults { - v := m.Defaults[k] - baseI := i - i -= len(v) - copy(dAtA[i:], v) - i = encodeVarintO2Control(dAtA, i, uint64(len(v))) - i-- - dAtA[i] = 0x12 - i -= len(k) - copy(dAtA[i:], k) - i = encodeVarintO2Control(dAtA, i, uint64(len(k))) - i-- - dAtA[i] = 0xa - i = encodeVarintO2Control(dAtA, i, uint64(baseI-i)) - i-- - dAtA[i] = 0x3a - } - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x32 - } - } - if len(m.TaskIds) > 0 { - for iNdEx := len(m.TaskIds) - 1; iNdEx >= 0; iNdEx-- { - i -= len(m.TaskIds[iNdEx]) - copy(dAtA[i:], m.TaskIds[iNdEx]) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.TaskIds[iNdEx]))) - i-- - dAtA[i] = 0x2a - } - } - if len(m.FullPath) > 0 { - i -= len(m.FullPath) - copy(dAtA[i:], m.FullPath) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.FullPath))) - i-- - dAtA[i] = 0x22 - } - if len(m.State) > 0 { - i -= len(m.State) - copy(dAtA[i:], m.State) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.State))) - i-- - dAtA[i] = 0x1a - } - if len(m.Status) > 0 { - i -= len(m.Status) - copy(dAtA[i:], m.Status) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Status))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetRolesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetRolesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetRolesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Roles) > 0 { - for iNdEx := len(m.Roles) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Roles[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.AllTags { - i-- - if m.AllTags { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x20 - } - if m.AllBranches { - i-- - if m.AllBranches { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x18 - } - if len(m.RevisionPattern) > 0 { - i -= len(m.RevisionPattern) - copy(dAtA[i:], m.RevisionPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RevisionPattern))) - i-- - dAtA[i] = 0x12 - } - if len(m.RepoPattern) > 0 { - i -= len(m.RepoPattern) - copy(dAtA[i:], m.RepoPattern) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.RepoPattern))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *WorkflowTemplateInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *WorkflowTemplateInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *WorkflowTemplateInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x1a - } - if len(m.Template) > 0 { - i -= len(m.Template) - copy(dAtA[i:], m.Template) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Template))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repo) > 0 { - i -= len(m.Repo) - copy(dAtA[i:], m.Repo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Repo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *GetWorkflowTemplatesReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GetWorkflowTemplatesReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GetWorkflowTemplatesReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.WorkflowTemplates) > 0 { - for iNdEx := len(m.WorkflowTemplates) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.WorkflowTemplates[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *ListReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func (m *RepoInfo) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RepoInfo) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RepoInfo) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x1a - } - if m.Default { - i-- - if m.Default { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x10 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *ListReposReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *ListReposReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *ListReposReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.GlobalDefaultRevision) > 0 { - i -= len(m.GlobalDefaultRevision) - copy(dAtA[i:], m.GlobalDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.GlobalDefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Repos) > 0 { - for iNdEx := len(m.Repos) - 1; iNdEx >= 0; iNdEx-- { - { - size, err := m.Repos[iNdEx].MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintO2Control(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - } - } - return len(dAtA) - i, nil -} - -func (m *AddRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.DefaultRevision) > 0 { - i -= len(m.DefaultRevision) - copy(dAtA[i:], m.DefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.DefaultRevision))) - i-- - dAtA[i] = 0x12 - } - if len(m.Name) > 0 { - i -= len(m.Name) - copy(dAtA[i:], m.Name) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Name))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *AddRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *AddRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *AddRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0x12 - } - if len(m.NewDefaultRevision) > 0 { - i -= len(m.NewDefaultRevision) - copy(dAtA[i:], m.NewDefaultRevision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRevision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *RemoveRepoReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RemoveRepoReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RemoveRepoReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.NewDefaultRepo) > 0 { - i -= len(m.NewDefaultRepo) - copy(dAtA[i:], m.NewDefaultRepo) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.NewDefaultRepo))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *RefreshReposRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *RefreshReposRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *RefreshReposRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetDefaultRepoRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetDefaultRepoRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetDefaultRepoRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetGlobalDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetGlobalDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Revision) > 0 { - i -= len(m.Revision) - copy(dAtA[i:], m.Revision) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Revision))) - i-- - dAtA[i] = 0x12 - } - if m.Index != 0 { - i = encodeVarintO2Control(dAtA, i, uint64(m.Index)) - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func (m *SetRepoDefaultRevisionReply) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *SetRepoDefaultRevisionReply) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *SetRepoDefaultRevisionReply) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - if len(m.Info) > 0 { - i -= len(m.Info) - copy(dAtA[i:], m.Info) - i = encodeVarintO2Control(dAtA, i, uint64(len(m.Info))) - i-- - dAtA[i] = 0xa - } - return len(dAtA) - i, nil -} - -func (m *Empty) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Empty) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Empty) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - if m.XXX_unrecognized != nil { - i -= len(m.XXX_unrecognized) - copy(dAtA[i:], m.XXX_unrecognized) - } - return len(dAtA) - i, nil -} - -func encodeVarintO2Control(dAtA []byte, offset int, v uint64) int { - offset -= sovO2Control(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *Event_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvironmentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - l = len(m.Error) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Message) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Taskid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Ev_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RolePath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.StatusUpdates) > 0 { - for _, e := range m.StatusUpdates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Level != 0 { - n += 1 + sovO2Control(uint64(m.Level)) - } - if m.Event != nil { - n += m.Event.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *StatusUpdate_MesosHeartbeat) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.MesosHeartbeat != nil { - l = m.MesosHeartbeat.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Timestamp) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Payload != nil { - n += m.Payload.Size() - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Event_EnvironmentEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnvironmentEvent != nil { - l = m.EnvironmentEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_TaskEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.TaskEvent != nil { - l = m.TaskEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *Event_RoleEvent) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.RoleEvent != nil { - l = m.RoleEvent.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - return n -} -func (m *SubscribeRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Version) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Major != 0 { - n += 1 + sovO2Control(uint64(m.Major)) - } - if m.Minor != 0 { - n += 1 + sovO2Control(uint64(m.Minor)) - } - if m.Patch != 0 { - n += 1 + sovO2Control(uint64(m.Patch)) - } - l = len(m.Build) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ProductName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.VersionStr) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetFrameworkInfoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.EnvironmentsCount != 0 { - n += 1 + sovO2Control(uint64(m.EnvironmentsCount)) - } - if m.TasksCount != 0 { - n += 1 + sovO2Control(uint64(m.TasksCount)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.HostsCount != 0 { - n += 1 + sovO2Control(uint64(m.HostsCount)) - } - l = len(m.InstanceName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Version != nil { - l = m.Version.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Reason) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TeardownReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentsReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.FrameworkId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Environments) > 0 { - for _, e := range m.Environments { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.CreatedWhen) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.RootRole) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.WorkflowTemplate) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *NewAutoEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Environment != nil { - l = m.Environment.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Workflow != nil { - l = m.Workflow.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ControlEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.CurrentRunNumber != 0 { - n += 1 + sovO2Control(uint64(m.CurrentRunNumber)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Operations) > 0 { - for _, e := range m.Operations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ReconfigureAll { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *EnvironmentOperation) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Type != 0 { - n += 1 + sovO2Control(uint64(m.Type)) - } - l = len(m.RoleName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ModifyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.FailedOperations) > 0 { - for _, e := range m.FailedOperations { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.KeepTasks { - n += 2 - } - if m.AllowInRunningState { - n += 2 - } - if m.Force { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *DestroyEnvironmentReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.CleanupTasksReply != nil { - l = m.CleanupTasksReply.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Id) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Queries) > 0 { - for _, s := range m.Queries { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.ExcludeGlobals { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetEnvironmentPropertiesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ShortTaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Locked { - n += 2 - } - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ClassName) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.DeploymentInfo != nil { - l = m.DeploymentInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Pid) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.SandboxStdout) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskDeploymentInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Hostname) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.AgentId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.OfferId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ExecutorId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Tasks) > 0 { - for _, e := range m.Tasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.TaskId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetTaskReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Task != nil { - l = m.Task.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskClassInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.ControlMode) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CommandInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Env) > 0 { - for _, s := range m.Env { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.Shell { - n += 2 - } - l = len(m.Value) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Arguments) > 0 { - for _, s := range m.Arguments { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.User) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ChannelInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Type) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Target) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *TaskInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.ShortInfo != nil { - l = m.ShortInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if m.ClassInfo != nil { - l = m.ClassInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.InboundChannels) > 0 { - for _, e := range m.InboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.OutboundChannels) > 0 { - for _, e := range m.OutboundChannels { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.CommandInfo != nil { - l = m.CommandInfo.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.TaskPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.Properties) > 0 { - for k, v := range m.Properties { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *CleanupTasksReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.KilledTasks) > 0 { - for _, e := range m.KilledTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.RunningTasks) > 0 { - for _, e := range m.RunningTasks { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.EnvId) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.PathSpec) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RoleInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Status) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.State) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.FullPath) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if len(m.TaskIds) > 0 { - for _, s := range m.TaskIds { - l = len(s) - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if len(m.Defaults) > 0 { - for k, v := range m.Defaults { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.Vars) > 0 { - for k, v := range m.Vars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if len(m.UserVars) > 0 { - for k, v := range m.UserVars { - _ = k - _ = v - mapEntrySize := 1 + len(k) + sovO2Control(uint64(len(k))) + 1 + len(v) + sovO2Control(uint64(len(v))) - n += mapEntrySize + 1 + sovO2Control(uint64(mapEntrySize)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetRolesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Roles) > 0 { - for _, e := range m.Roles { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.RepoPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.RevisionPattern) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.AllBranches { - n += 2 - } - if m.AllTags { - n += 2 - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *WorkflowTemplateInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Repo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Template) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *GetWorkflowTemplatesReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.WorkflowTemplates) > 0 { - for _, e := range m.WorkflowTemplates { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RepoInfo) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.Default { - n += 2 - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *ListReposReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if len(m.Repos) > 0 { - for _, e := range m.Repos { - l = e.Size() - n += 1 + l + sovO2Control(uint64(l)) - } - } - l = len(m.GlobalDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Name) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.DefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AddRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRevision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RemoveRepoReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.NewDefaultRepo) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *RefreshReposRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetDefaultRepoRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetGlobalDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.Index != 0 { - n += 1 + sovO2Control(uint64(m.Index)) - } - l = len(m.Revision) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *SetRepoDefaultRevisionReply) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = len(m.Info) - if l > 0 { - n += 1 + l + sovO2Control(uint64(l)) - } - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *Empty) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func sovO2Control(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozO2Control(x uint64) (n int) { - return sovO2Control(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *Event_MesosHeartbeat) 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 ErrIntOverflowO2Control - } - 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_MesosHeartbeat: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Event_MesosHeartbeat: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_EnvironmentEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_EnvironmentEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_EnvironmentEvent: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvironmentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Error", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Error = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Message = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_TaskEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_TaskEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_TaskEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Taskid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Taskid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Ev_RoleEvent) 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 ErrIntOverflowO2Control - } - 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: Ev_RoleEvent: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Ev_RoleEvent: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RolePath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RolePath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusRequest) 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 ErrIntOverflowO2Control - } - 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: StatusRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusReply) 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 ErrIntOverflowO2Control - } - 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: StatusReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StatusUpdates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.StatusUpdates = append(m.StatusUpdates, &StatusUpdate{}) - if err := m.StatusUpdates[len(m.StatusUpdates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *StatusUpdate) 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 ErrIntOverflowO2Control - } - 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: StatusUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: StatusUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Level", wireType) - } - m.Level = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Level |= StatusUpdate_Level(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field MesosHeartbeat", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Event_MesosHeartbeat{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &StatusUpdate_MesosHeartbeat{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -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 ErrIntOverflowO2Control - } - 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 Timestamp", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Timestamp = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_EnvironmentEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_EnvironmentEvent{v} - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_TaskEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_TaskEvent{v} - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleEvent", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &Ev_RoleEvent{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Payload = &Event_RoleEvent{v} - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SubscribeRequest) 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 ErrIntOverflowO2Control - } - 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: SubscribeRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SubscribeRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoRequest) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Version) 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 ErrIntOverflowO2Control - } - 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: Version: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Version: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Major", wireType) - } - m.Major = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Major |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Minor", wireType) - } - m.Minor = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Minor |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Patch", wireType) - } - m.Patch = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Patch |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Build", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Build = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ProductName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ProductName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field VersionStr", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.VersionStr = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetFrameworkInfoReply) 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 ErrIntOverflowO2Control - } - 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: GetFrameworkInfoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetFrameworkInfoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvironmentsCount", wireType) - } - m.EnvironmentsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.EnvironmentsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field TasksCount", wireType) - } - m.TasksCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.TasksCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field HostsCount", wireType) - } - m.HostsCount = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.HostsCount |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InstanceName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InstanceName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Version", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Version == nil { - m.Version = &Version{} - } - if err := m.Version.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownRequest) 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 ErrIntOverflowO2Control - } - 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: TeardownRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Reason", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Reason = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TeardownReply) 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 ErrIntOverflowO2Control - } - 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: TeardownReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TeardownReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentsReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentsReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentsReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FrameworkId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FrameworkId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environments", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Environments = append(m.Environments, &EnvironmentInfo{}) - if err := m.Environments[len(m.Environments)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentInfo) 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 ErrIntOverflowO2Control - } - 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: EnvironmentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentInfo: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CreatedWhen", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CreatedWhen = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-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 RootRole", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RootRole = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplate", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplate = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *NewAutoEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: NewAutoEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: NewAutoEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Environment", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Environment == nil { - m.Environment = &EnvironmentInfo{} - } - if err := m.Environment.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Workflow", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Workflow == nil { - m.Workflow = &RoleInfo{} - } - if err := m.Workflow.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= ControlEnvironmentRequest_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ControlEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ControlEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ControlEnvironmentReply: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentRunNumber", wireType) - } - m.CurrentRunNumber = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.CurrentRunNumber |= uint32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Operations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Operations = append(m.Operations, &EnvironmentOperation{}) - if err := m.Operations[len(m.Operations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ReconfigureAll", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ReconfigureAll = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *EnvironmentOperation) 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 ErrIntOverflowO2Control - } - 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: EnvironmentOperation: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: EnvironmentOperation: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Type", wireType) - } - m.Type = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Type |= EnvironmentOperation_Optype(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RoleName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RoleName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ModifyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: ModifyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ModifyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FailedOperations", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FailedOperations = append(m.FailedOperations, &EnvironmentOperation{}) - if err := m.FailedOperations[len(m.FailedOperations)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Id", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentRequest) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field KeepTasks", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.KeepTasks = bool(v != 0) - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllowInRunningState", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllowInRunningState = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Force", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Force = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *DestroyEnvironmentReply) 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 ErrIntOverflowO2Control - } - 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: DestroyEnvironmentReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: DestroyEnvironmentReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CleanupTasksReply", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CleanupTasksReply == nil { - m.CleanupTasksReply = &CleanupTasksReply{} - } - if err := m.CleanupTasksReply.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: SetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesRequest) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesRequest: 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) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Id = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Queries", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Queries = append(m.Queries, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field ExcludeGlobals", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.ExcludeGlobals = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetEnvironmentPropertiesReply) 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 ErrIntOverflowO2Control - } - 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: GetEnvironmentPropertiesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetEnvironmentPropertiesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ShortTaskInfo) 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 ErrIntOverflowO2Control - } - 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: ShortTaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ShortTaskInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Locked", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Locked = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassName", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ClassName = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DeploymentInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.DeploymentInfo == nil { - m.DeploymentInfo = &TaskDeploymentInfo{} - } - if err := m.DeploymentInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Pid", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Pid = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SandboxStdout", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SandboxStdout = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskDeploymentInfo) 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 ErrIntOverflowO2Control - } - 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: TaskDeploymentInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskDeploymentInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hostname", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hostname = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AgentId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.AgentId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OfferId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OfferId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ExecutorId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ExecutorId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksRequest) 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 ErrIntOverflowO2Control - } - 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: GetTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTasksReply) 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 ErrIntOverflowO2Control - } - 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: GetTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Tasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Tasks = append(m.Tasks, &ShortTaskInfo{}) - if err := m.Tasks[len(m.Tasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskRequest) 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 ErrIntOverflowO2Control - } - 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: GetTaskRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetTaskReply) 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 ErrIntOverflowO2Control - } - 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: GetTaskReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetTaskReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Task", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Task == nil { - m.Task = &TaskInfo{} - } - if err := m.Task.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskClassInfo) 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 ErrIntOverflowO2Control - } - 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: TaskClassInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskClassInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 ControlMode", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.ControlMode = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CommandInfo) 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 ErrIntOverflowO2Control - } - 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: CommandInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CommandInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Env", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Env = append(m.Env, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Shell", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Shell = bool(v != 0) - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Value = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Arguments", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Arguments = append(m.Arguments, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 5: - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.User = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ChannelInfo) 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 ErrIntOverflowO2Control - } - 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: ChannelInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ChannelInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Type", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Type = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Target", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Target = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *TaskInfo) 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 ErrIntOverflowO2Control - } - 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: TaskInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: TaskInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ShortInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ShortInfo == nil { - m.ShortInfo = &ShortTaskInfo{} - } - if err := m.ShortInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ClassInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.ClassInfo == nil { - m.ClassInfo = &TaskClassInfo{} - } - if err := m.ClassInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field InboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.InboundChannels = append(m.InboundChannels, &ChannelInfo{}) - if err := m.InboundChannels[len(m.InboundChannels)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field OutboundChannels", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.OutboundChannels = append(m.OutboundChannels, &ChannelInfo{}) - if err := m.OutboundChannels[len(m.OutboundChannels)-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 CommandInfo", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.CommandInfo == nil { - m.CommandInfo = &CommandInfo{} - } - if err := m.CommandInfo.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Properties", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Properties == nil { - m.Properties = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Properties[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksRequest) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *CleanupTasksReply) 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 ErrIntOverflowO2Control - } - 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: CleanupTasksReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: CleanupTasksReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field KilledTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.KilledTasks = append(m.KilledTasks, &ShortTaskInfo{}) - if err := m.KilledTasks[len(m.KilledTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RunningTasks", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RunningTasks = append(m.RunningTasks, &ShortTaskInfo{}) - if err := m.RunningTasks[len(m.RunningTasks)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesRequest) 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 ErrIntOverflowO2Control - } - 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: GetRolesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field EnvId", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.EnvId = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PathSpec", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.PathSpec = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RoleInfo) 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 ErrIntOverflowO2Control - } - 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: RoleInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RoleInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 Status", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Status = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field State", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.State = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field FullPath", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.FullPath = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field TaskIds", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.TaskIds = append(m.TaskIds, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Defaults", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Defaults == nil { - m.Defaults = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Defaults[mapkey] = mapvalue - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Vars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Vars == nil { - m.Vars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.Vars[mapkey] = mapvalue - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserVars", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.UserVars == nil { - m.UserVars = 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 ErrIntOverflowO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapkey := iNdEx + intStringLenmapkey - if postStringIndexmapkey < 0 { - return ErrInvalidLengthO2Control - } - 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postStringIndexmapvalue := iNdEx + intStringLenmapvalue - if postStringIndexmapvalue < 0 { - return ErrInvalidLengthO2Control - } - if postStringIndexmapvalue > l { - return io.ErrUnexpectedEOF - } - mapvalue = string(dAtA[iNdEx:postStringIndexmapvalue]) - iNdEx = postStringIndexmapvalue - } else { - iNdEx = entryPreIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > postIndex { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - m.UserVars[mapkey] = mapvalue - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetRolesReply) 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 ErrIntOverflowO2Control - } - 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: GetRolesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetRolesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Roles", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Roles = append(m.Roles, &RoleInfo{}) - if err := m.Roles[len(m.Roles)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesRequest) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RepoPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RepoPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field RevisionPattern", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.RevisionPattern = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllBranches", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllBranches = bool(v != 0) - case 4: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AllTags", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.AllTags = bool(v != 0) - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *WorkflowTemplateInfo) 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 ErrIntOverflowO2Control - } - 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: WorkflowTemplateInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: WorkflowTemplateInfo: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Template", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Template = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *GetWorkflowTemplatesReply) 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 ErrIntOverflowO2Control - } - 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: GetWorkflowTemplatesReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GetWorkflowTemplatesReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field WorkflowTemplates", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.WorkflowTemplates = append(m.WorkflowTemplates, &WorkflowTemplateInfo{}) - if err := m.WorkflowTemplates[len(m.WorkflowTemplates)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposRequest) 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 ErrIntOverflowO2Control - } - 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: ListReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RepoInfo) 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 ErrIntOverflowO2Control - } - 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: RepoInfo: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RepoInfo: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Name = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Default", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.Default = bool(v != 0) - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *ListReposReply) 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 ErrIntOverflowO2Control - } - 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: ListReposReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: ListReposReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Repos", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthO2Control - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Repos = append(m.Repos, &RepoInfo{}) - if err := m.Repos[len(m.Repos)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field GlobalDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.GlobalDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoRequest) 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 ErrIntOverflowO2Control - } - 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: AddRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoRequest: 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 ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - 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 DefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.DefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *AddRepoReply) 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 ErrIntOverflowO2Control - } - 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: AddRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AddRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRevision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRevision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoRequest) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RemoveRepoReply) 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 ErrIntOverflowO2Control - } - 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: RemoveRepoReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RemoveRepoReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field NewDefaultRepo", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.NewDefaultRepo = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *RefreshReposRequest) 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 ErrIntOverflowO2Control - } - 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: RefreshReposRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: RefreshReposRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetDefaultRepoRequest) 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 ErrIntOverflowO2Control - } - 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: SetDefaultRepoRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetDefaultRepoRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetGlobalDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetGlobalDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetGlobalDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionRequest) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field Index", wireType) - } - m.Index = 0 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - m.Index |= int32(b&0x7F) << shift - if b < 0x80 { - break - } - } - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Revision", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Revision = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *SetRepoDefaultRevisionReply) 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 ErrIntOverflowO2Control - } - 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: SetRepoDefaultRevisionReply: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: SetRepoDefaultRevisionReply: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Info", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowO2Control - } - 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 ErrInvalidLengthO2Control - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthO2Control - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Info = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Empty) 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 ErrIntOverflowO2Control - } - 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: Empty: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Empty: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipO2Control(dAtA[iNdEx:]) - if err != nil { - return err - } - if skippy < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) < 0 { - return ErrInvalidLengthO2Control - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipO2Control(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - 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, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowO2Control - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthO2Control - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupO2Control - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthO2Control - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthO2Control = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowO2Control = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupO2Control = fmt.Errorf("proto: unexpected end of group") -) diff --git a/go.sum b/go.sum index 1a155f0ee..eb403c734 100644 --- a/go.sum +++ b/go.sum @@ -313,6 +313,7 @@ github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= From 087c070274b18f9a1e1a53b45f58d4f1941fa4ab Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 26 Feb 2021 18:02:21 +0100 Subject: [PATCH 0750/2352] [core] Send event at the end of the stream with mesos status --- core/environment/manager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 55930e879..97f64f538 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -376,6 +376,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { t := envs.taskman.GetTask(taskId.Value) isHook := false if t != nil { + t.SendEvent(&event.TaskEvent{Name: t.GetName(), TaskID: taskId.String(), Status: btt.FinalMesosState.String(), Hostname: t.GetHostname() , ClassName: t.GetClassName()}) if parentRole, ok := t.GetParentRole().(workflow.Role); ok { parentRole.SetRuntimeVars(map[string]string{ "taskResult.exitCode": strconv.Itoa(btt.ExitCode), From 7eb6c81b4bb6972c5f947890a64bf9329d7c34d0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Feb 2021 14:47:49 +0100 Subject: [PATCH 0751/2352] [core] Ensure every Teardown API call is forced if necessary --- core/server.go | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/core/server.go b/core/server.go index f0cdc58ca..86a17b6ac 100644 --- a/core/server.go +++ b/core/server.go @@ -311,28 +311,14 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. if req.Force { - err = m.state.environments.TeardownEnvironment(env.Id(), req.Force) - if err != nil { - return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() - } - - tasksForEnv := env.Workflow().GetTasks().GetTaskIds() - killed, running, err := m.doCleanupTasks(tasksForEnv) - ctr := &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running} - if err != nil { - log.WithError(err). - WithField("partition", env.Id().String()). - Error("task cleanup error") - return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, status.New(codes.Internal, err.Error()).Err() - } - - return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil + return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) } if req.AllowInRunningState && env.CurrentState() == "RUNNING" { err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) if err != nil { - return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() + log.Warn("could not perform STOP transition for environment teardown, forcing") + return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) } } @@ -347,26 +333,38 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } if !canDestroy { - return nil, status.Newf(codes.FailedPrecondition, "cannot destroy environment in state %s", env.CurrentState()).Err() + log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) + return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) } - // This might transition to STANDBY if needed, of do nothing if we're already there + // This might transition to STANDBY if needed, or do nothing if we're already there if env.CurrentState() == "CONFIGURED" { err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_RESET)) if err != nil { - return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() + log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) + return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) } } - err = m.state.environments.TeardownEnvironment(env.Id(), req.Force) + return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) +} + +func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force bool, keepTasks bool) (*pb.DestroyEnvironmentReply, error) { + err := m.state.environments.TeardownEnvironment(env.Id(), force) if err != nil { + if !force { + // if the teardown failed, but we haven't tried a Force teardown yet, we retry + // a second time but with force + return m.doTeardownAndCleanup(env, true, keepTasks) + } return &pb.DestroyEnvironmentReply{}, status.New(codes.Internal, err.Error()).Err() } - if req.KeepTasks { // Tasks should stay running, so we're done + if keepTasks { // Tasks should stay running, so we're done return &pb.DestroyEnvironmentReply{}, nil } + // cleanup tasks tasksForEnv := env.Workflow().GetTasks().GetTaskIds() killed, running, err := m.doCleanupTasks(tasksForEnv) ctr := &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running} From 59183fc8147a707ce91dbade2ed1ed6f6330638f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Feb 2021 16:09:25 +0100 Subject: [PATCH 0752/2352] [core] Refactor environment.Manager.CreateEnvironment --- core/environment/manager.go | 113 +++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 53 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 97f64f538..04b739eac 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -131,64 +131,70 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman, nil, //roles, nil, - true )) - if err != nil { - envState := env.CurrentState() - envTasks := env.Workflow().GetTasks() - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) - pendingCh := make(chan *event.TasksReleasedEvent) - envs.pendingTeardownsCh[env.Id()] = pendingCh - envs.taskman.MessageChannel <- taskmanMessage + true), + ) + if err == nil { + // CONFIGURE transition successful! + env.subscribeToWfState(envs.taskman) + return env.id, err + } - incomingEv := <- pendingCh + // Everything starting from here until the end of the function is the code path for + // a deployment/configuration failure - // If some tasks failed to release - if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { - for taskId, err := range taskReleaseErrors { - log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": env.Id().String(), - }). - WithError(err). - Warn("task failed to release") - } - } - // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), envTasks) - // if rlsErr != nil { - // log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") - // } + envState := env.CurrentState() + tasksToRelease := env.Workflow().GetTasks() - delete(envs.m, env.id) + taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, env.id, tasksToRelease, nil) + pendingCh := make(chan *event.TasksReleasedEvent) + envs.pendingTeardownsCh[env.Id()] = pendingCh + envs.taskman.MessageChannel <- taskmanMessage - // As this is a failed env deployment, we must clean up any running & released tasks. - // This is an important step as env deploy failures are often caused by bad task - // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, - // so there's no point in keeping it for future recovery & reconfiguration. - - // draft mostly on Cleanup() and KillTasks() we need the killedTasks - // either to print them or return them to server. We need to setup a way - // to communicate back such info from taskman (channel ?) - // var killedTasks task.Tasks - // taskmanMessage = task.NewkillTasksMessage(envTasks.GetTaskIds()) - // envs.taskman.MessageChannel <- taskmanMessage + incomingEv := <- pendingCh - killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) - if rlsErr != nil { - log.WithError(rlsErr).Warn("task teardown error") + // If some tasks failed to release + if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { + for taskId, err := range taskReleaseErrors { + log.WithFields(logrus.Fields{ + "taskId": taskId, + "environmentId": env.Id().String(), + }). + WithError(err). + Warn("task failed to release") } - log.WithFields(logrus.Fields{ - "killedCount": len(killedTasks), - "lastEnvState": envState, - }). - Warn("environment deployment failed, tasks were cleaned up") - - // close state channels - close(envs.pendingStateChangeCh[env.Id()]) - delete(envs.pendingStateChangeCh, env.Id()) - - return env.id, err } - env.subscribeToWfState(envs.taskman) + // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), tasksToRelease) + // if rlsErr != nil { + // log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") + // } + + delete(envs.m, env.id) + + // As this is a failed env deployment, we must clean up any running & released tasks. + // This is an important step as env deploy failures are often caused by bad task + // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, + // so there's no point in keeping it for future recovery & reconfiguration. + + // draft mostly on Cleanup() and KillTasks() we need the killedTasks + // either to print them or return them to server. We need to setup a way + // to communicate back such info from taskman (channel ?) + // var killedTasks task.Tasks + // taskmanMessage = task.NewkillTasksMessage(tasksToRelease.GetTaskIds()) + // envs.taskman.MessageChannel <- taskmanMessage + + killedTasks, _, rlsErr := envs.taskman.KillTasks(tasksToRelease.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + }). + Warn("environment deployment failed, tasks were cleaned up") + + // close state channels + close(envs.pendingStateChangeCh[env.Id()]) + delete(envs.pendingStateChangeCh, env.Id()) return env.id, err } @@ -206,13 +212,14 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } - // we gather all DESTROY/after_DESTROY hooks, as these require special treatment tasksToRelease := env.Workflow().GetTasks() + + // we gather all DESTROY/after_DESTROY hooks, as these require special treatment destroyHooks := env.Workflow().GetHooksForTrigger("DESTROY") destroyHooks = append(destroyHooks, env.Workflow().GetHooksForTrigger("after_DESTROY")...) // for each found DESTROY hook, - // for each of all tasks last-to-first + // for each of *all* tasks last-to-first // if the pointed task is one of the known cleanup hooks, remove it for _, hook := range destroyHooks { for i := len(tasksToRelease)-1; i >= 0; i-- { From 6958ca1109a10aa73be7d327db39e43dfdc54ec1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Feb 2021 16:21:39 +0100 Subject: [PATCH 0753/2352] [core] Use TeardownEnvironment to cleanup after a failed deployment --- core/environment/manager.go | 67 +++++++------------------------------ 1 file changed, 13 insertions(+), 54 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 04b739eac..6c2ca87a4 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -92,7 +92,6 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uid.ID, error) { envs.mu.Lock() - defer envs.mu.Unlock() // userVar identifiers come in 2 forms: // environment user var: "someKey" @@ -113,6 +112,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env, err := newEnvironment(envUserVars) if err != nil { + envs.mu.Unlock() return uid.NilID(), err } env.hookHandlerF = func(hooks task.Tasks) error { @@ -121,6 +121,8 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) + + envs.mu.Unlock() return env.id, err } @@ -133,68 +135,25 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] nil, true), ) + envs.mu.Unlock() + if err == nil { // CONFIGURE transition successful! env.subscribeToWfState(envs.taskman) + return env.id, err } - // Everything starting from here until the end of the function is the code path for - // a deployment/configuration failure + // Deployment/configuration failure code path starts here envState := env.CurrentState() - tasksToRelease := env.Workflow().GetTasks() - - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, env.id, tasksToRelease, nil) - pendingCh := make(chan *event.TasksReleasedEvent) - envs.pendingTeardownsCh[env.Id()] = pendingCh - envs.taskman.MessageChannel <- taskmanMessage - - incomingEv := <- pendingCh + log.WithField("state", envState). + WithField("environment", env.Id().String()). + WithError(err). + Warn("environment deployment and configuration failed, cleanup in progress") - // If some tasks failed to release - if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { - for taskId, err := range taskReleaseErrors { - log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": env.Id().String(), - }). - WithError(err). - Warn("task failed to release") - } - } - // rlsErr := envs.taskman.ReleaseTasks(env.id.Array(), tasksToRelease) - // if rlsErr != nil { - // log.WithError(rlsErr).Warning("environment configure failed, some tasks could not be released") - // } - - delete(envs.m, env.id) - - // As this is a failed env deployment, we must clean up any running & released tasks. - // This is an important step as env deploy failures are often caused by bad task - // configuration. In this case, the task is likely to go STANDBY×CONFIGURE→ERROR, - // so there's no point in keeping it for future recovery & reconfiguration. - - // draft mostly on Cleanup() and KillTasks() we need the killedTasks - // either to print them or return them to server. We need to setup a way - // to communicate back such info from taskman (channel ?) - // var killedTasks task.Tasks - // taskmanMessage = task.NewkillTasksMessage(tasksToRelease.GetTaskIds()) - // envs.taskman.MessageChannel <- taskmanMessage - - killedTasks, _, rlsErr := envs.taskman.KillTasks(tasksToRelease.GetTaskIds()) - if rlsErr != nil { - log.WithError(rlsErr).Warn("task teardown error") - } - log.WithFields(logrus.Fields{ - "killedCount": len(killedTasks), - "lastEnvState": envState, - }). - Warn("environment deployment failed, tasks were cleaned up") - - // close state channels - close(envs.pendingStateChangeCh[env.Id()]) - delete(envs.pendingStateChangeCh, env.Id()) + // TeardownEnvironment manages the envs.mu internally + err = envs.TeardownEnvironment(env.Id(), true/*force*/) return env.id, err } From 64c571ae4bea59ce681db61daba7303e5473f5e1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Feb 2021 17:41:00 +0100 Subject: [PATCH 0754/2352] [core] New ddsched.EnsureTermination call, to be used as DESTROY hook --- core/integration/ddsched/plugin.go | 105 ++++++++++++++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 9a034a96e..db7a82eb5 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -28,6 +28,7 @@ package ddsched import ( "context" + "errors" "fmt" "net/url" "strconv" @@ -151,12 +152,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return } if p.ddSchedClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DD scheduler client connection not available")). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return @@ -169,12 +172,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionInitialize(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return } if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING { log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String())). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") } @@ -197,12 +202,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") return } if p.ddSchedClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DD scheduler client connection not available")). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") return @@ -215,17 +222,113 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING { log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } return } + stack["EnsureTermination"] = func() (out string) { + log.Debug("performing DD scheduler session cleanup") + + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID for DD scheduler session cleanup") + return + } + + if p.ddSchedClient == nil { + log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler session cleanup") + return + } + if p.ddSchedClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("DD scheduler client connection not available")). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler session cleanup") + return + } + + var ( + response *ddpb.PartitionResponse + err error + ) + + infoReq := ddpb.PartitionInfo{ + EnvironmentId: envId, + PartitionId: envId, + } + response, err = p.ddSchedClient.PartitionStatus(context.Background(), &infoReq, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler session cleanup") + return + } + + if response == nil { + log.WithError(errors.New("nil response")). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler session cleanup") + return + } + + // If the partition is anything other than UNKNOWN, TERMINATING or TERMINATED, + // we need to trigger a PartitionTerminate. + // This usually happens when the PartitionTerminate hook call was skipped due + // to a failed deployment or other environment error. + if response.PartitionState == ddpb.PartitionState_PARTITION_UNKNOWN || + response.PartitionState == ddpb.PartitionState_PARTITION_TERMINATING || + response.PartitionState == ddpb.PartitionState_PARTITION_TERMINATED { + // DDsched is in an acceptable state, so we return + log.WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("environment_id", envId). + WithField("partition_state", response.PartitionState). + Trace("DD scheduler session cleanup not needed") + return + } + + // No guarantee that the DDsched partition is in an obedient state or able + // to perform control commands, but if it's CONFIGURED we should be able + // call PartitionTerminate + in := ddpb.PartitionTermRequest{ + PartitionInfo: &ddpb.PartitionInfo{ + EnvironmentId: envId, + PartitionId: envId, + }, + } + + log.WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("environment_id", envId). + WithField("partition_state", response.PartitionState). + Warn("DD scheduler partition still active, performing PartitionTerminate") + response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + } + if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING { + log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + } + return + } return } From 6c6bbed6e5ac09e270abdef33d510745249b5198 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 01:48:08 +0100 Subject: [PATCH 0755/2352] [executor] Reduce gRPC dial timeout to 30s thanks to modules v4 --- executor/executorcmd/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index c17ecc045..0514f8032 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -50,8 +50,7 @@ const ( ProtobufTransport = ControlTransport(0) JsonTransport = ControlTransport(1) ) -const GRPC_DIAL_TIMEOUT = 75 * time.Second -// Very long timeout to work around very slow aliswmod issue +const GRPC_DIAL_TIMEOUT = 30 * time.Second func NewClient( controlPort uint64, From 942d9b16cf5de0634b2bbb3eb0b7d9bf88154164 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 01:50:19 +0100 Subject: [PATCH 0756/2352] [executor] Correct timeout for Kill sequence GetState --- executor/executable/controllabletask.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index b15aa624c..a0bf3cb3f 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -380,7 +380,9 @@ func (t *ControllableTask) Kill() error { pid = 0 reachedState = "UNKNOWN" // FIXME: should be LAUNCHING or similar ) - response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + cxt, cancel := context.WithTimeout(context.Background(), KILL_TRANSITION_TIMEOUT) + defer cancel() + response, err := t.rpc.GetState(cxt, &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err == nil { // we successfully got the state from the task log.WithField("nativeState", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried for upcoming soft kill") @@ -478,7 +480,10 @@ func (t *ControllableTask) Kill() error { // t.knownPid must be valid because GetState was sure to have been successful in the past pid = t.knownPid } - } else { // If a true PID was never acquired during the lifetime of this task + } else { + // If GetState didn't succeed during this Kill code path, but might still have + // at some earlier point during the lifetime of this task. + // Either way, we might or might not have the true PID. log.WithError(err). WithField("taskId", t.ti.GetTaskID()). Warn("cannot query task status for graceful process termination") From 452fbc3be1a5f622cfa3671df4c6817ea2e14ff3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 01:50:45 +0100 Subject: [PATCH 0757/2352] [executor] Fix PID running check for negative PID (PGID) --- executor/executable/pid_util.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/executor/executable/pid_util.go b/executor/executable/pid_util.go index d78d06b1c..bf0605881 100644 --- a/executor/executable/pid_util.go +++ b/executor/executable/pid_util.go @@ -31,8 +31,12 @@ import ( // pidExists will check if a pid process is running func pidExists(pid int) (bool) { - if pid <= 0 { + if pid == 0 { return false + } else if pid < 0 { + // A negative PID should still be acceptable, means it's a PGID + // so we make it positive to make it work with os.FindProcess + pid *= -1 } proc, err := os.FindProcess(pid) if err != nil { From 8801c5058f1ee7524a094cdd0fe293f67158498a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 17:14:56 +0100 Subject: [PATCH 0758/2352] Fix workflow template schema --- walnut/schemata/Workflow.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json index 03ab2eb18..f58beeb9a 100644 --- a/walnut/schemata/Workflow.json +++ b/walnut/schemata/Workflow.json @@ -240,7 +240,7 @@ "description": "Variable definitions: defaults, overridden by anything" }, "vars": { - "type": "string", + "type": "object", "title": "User variable definitions", "description": "Variable definitions: vars, override defaults, overridden by user vars." } From b402da4f59dd28c906083048be4d6bdb35c4f107 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 03:52:47 +0100 Subject: [PATCH 0759/2352] [misc] Regenerate protofiles --- apricot/protos/apricot.pb.go | 2 +- apricot/protos/apricot_grpc.pb.go | 8 ++------ coconut/protos/o2control.pb.go | 2 +- coconut/protos/o2control_grpc.pb.go | 12 ++++-------- core/integration/dcs/protos/dcs.pb.go | 2 +- core/integration/dcs/protos/dcs_grpc.pb.go | 10 +++------- core/integration/ddsched/protos/ddsched.pb.go | 2 +- core/integration/ddsched/protos/ddsched_grpc.pb.go | 8 ++------ core/protos/o2control.pb.go | 2 +- core/protos/o2control_grpc.pb.go | 12 ++++-------- executor/protos/occ.pb.go | 2 +- executor/protos/occ_grpc.pb.go | 12 ++++-------- odcshim/odcprotos/odc.pb.go | 2 +- odcshim/odcprotos/odc_grpc.pb.go | 8 ++------ odcshim/protos/occ.pb.go | 2 +- odcshim/protos/occ_grpc.pb.go | 12 ++++-------- 16 files changed, 33 insertions(+), 65 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 5b64572b2..7474e11f0 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index cd4641ba8..982ef896b 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -201,7 +200,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&Apricot_ServiceDesc, srv) + s.RegisterService(&_Apricot_serviceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -402,10 +401,7 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Apricot_ServiceDesc = grpc.ServiceDesc{ +var _Apricot_serviceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 3991a551c..518dd36c4 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/o2control.proto package pb diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 5af8aad73..a87d3d87d 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +51,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +272,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -417,7 +416,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -840,10 +839,7 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index b2cf9709e..9e833eae2 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 0f22986e2..ef6b29779 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -33,7 +32,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -126,7 +125,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&Configurator_ServiceDesc, srv) + s.RegisterService(&_Configurator_serviceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -204,10 +203,7 @@ func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Configurator_ServiceDesc = grpc.ServiceDesc{ +var _Configurator_serviceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 4fc17dd59..8aad9cd3c 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 0e2419bfb..bcf8b89a7 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -91,7 +90,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&DataDistributionControl_ServiceDesc, srv) + s.RegisterService(&_DataDistributionControl_serviceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -148,10 +147,7 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ +var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 3991a551c..518dd36c4 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/o2control.proto package pb diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 903ec7d16..81fdcbe63 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +51,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +272,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -415,7 +414,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -838,10 +837,7 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 6bced591c..fe7ada7fc 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/occ.proto package pb diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index eafb7734d..66a3c8901 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -155,7 +154,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -236,10 +235,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 3c33ebdae..24b7d5eb4 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: odcprotos/odc.proto package odc diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index 7a2602472..b5f1e0452 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -265,7 +264,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&ODC_ServiceDesc, srv) + s.RegisterService(&_ODC_serviceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -502,10 +501,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ODC_ServiceDesc = grpc.ServiceDesc{ +var _ODC_serviceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index 6bced591c..fe7ada7fc 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.12.4 // source: protos/occ.proto package pb diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index cd6c2d3a2..09d8d584b 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -153,7 +152,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -234,10 +233,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From daaece1bd54437c493aa517acc8b297dccb11fdc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 03:55:30 +0100 Subject: [PATCH 0760/2352] [core] Minor debug output fix --- core/integration/dcs/client.go | 2 +- core/integration/ddsched/client.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 727bb89c0..0f3d30e4e 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -46,7 +46,7 @@ type RpcClient struct { func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { log.WithFields(logrus.Fields{ "endpoint": endpoint, - }).Debug("dialing DCS client") + }).Debug("dialing DCS endpoint") dialOptions := []grpc.DialOption { grpc.WithInsecure(), diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index ae9ae7780..bcf438e2e 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -46,7 +46,7 @@ type RpcClient struct { func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { log.WithFields(logrus.Fields{ "endpoint": endpoint, - }).Debug("dialing DD scheduler client") + }).Debug("dialing DD scheduler endpoint") dialOptions := []grpc.DialOption { grpc.WithInsecure(), From 598ffa15b8b1f440cd55c67d705b762b038c0ad0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 03:55:57 +0100 Subject: [PATCH 0761/2352] [core] New ODC integration plugin --- Makefile | 5 +- core/config.go | 4 + core/integration/odc/client.go | 88 ++ core/integration/odc/handlers.go | 479 ++++++ core/integration/odc/odcutils/state.go | 60 + core/integration/odc/plugin.go | 159 ++ core/integration/odc/protos/odc.pb.go | 1562 ++++++++++++++++++++ core/integration/odc/protos/odc.proto | 167 +++ core/integration/odc/protos/odc_grpc.pb.go | 561 +++++++ 9 files changed, 3084 insertions(+), 1 deletion(-) create mode 100644 core/integration/odc/client.go create mode 100644 core/integration/odc/handlers.go create mode 100644 core/integration/odc/odcutils/state.go create mode 100644 core/integration/odc/plugin.go create mode 100644 core/integration/odc/protos/odc.pb.go create mode 100644 core/integration/odc/protos/odc.proto create mode 100644 core/integration/odc/protos/odc_grpc.pb.go diff --git a/Makefile b/Makefile index bd11e2ef2..ebce26425 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./core/integration/dcs ./core/integration/ddsched ./executor ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target @@ -129,6 +129,8 @@ vendor: # FIXME: these two protofiles should be committed in order to be available offline @echo -e "\033[1;33mcurl odc.proto\033[0m" + @mkdir -p core/integration/odc/protos + @curl -s -L $(ODC_PROTO) -o core/integration/odc/protos/odc.proto @mkdir -p odcshim/odcprotos @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto @@ -142,6 +144,7 @@ vendor: # we insert a go_package specification into the ODC protofile right # after we download it. @echo -e "\033[1;33mpatch odc.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"protos;odc\";\n" if (/^package/)' core/integration/odc/protos/odc.proto @perl -pi -e '$$_.="option go_package = \"odcprotos;odc\";\n" if (/^package/)' odcshim/odcprotos/odc.proto # vendor: tools/dep diff --git a/core/config.go b/core/config.go index f9b360551..15b534b4b 100644 --- a/core/config.go +++ b/core/config.go @@ -99,6 +99,8 @@ func setDefaults() error { viper.SetDefault("dcsServiceUseSystemProxy", false) viper.SetDefault("ddSchedulerEndpoint", "127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) + viper.SetDefault("odcEndpoint", "127.0.0.1:50053") + viper.SetDefault("odcUseSystemProxy", false) viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") @@ -147,6 +149,8 @@ func setFlags() error { pflag.Bool("dcsServiceUseSystemProxy", viper.GetBool("dcsServiceUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") + pflag.String("odcEndpoint", viper.GetString("odcEndpoint"), "Endpoint of the ODC gRPC service (`host:port`)") + pflag.Bool("odcUseSystemProxy", viper.GetBool("odcUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go new file mode 100644 index 000000000..89aee154c --- /dev/null +++ b/core/integration/odc/client.go @@ -0,0 +1,88 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package odc + +import ( + "context" + + "github.com/AliceO2Group/Control/common/logger" + odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +var log = logger.New(logrus.StandardLogger(),"odcclient") + + +type RpcClient struct { + odcpb.ODCClient + conn *grpc.ClientConn +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing ODC endpoint") + + dialOptions := []grpc.DialOption { + grpc.WithInsecure(), + grpc.WithBlock(), + } + if !viper.GetBool("odcUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + log.Debug("ODC client connected") + + client := &RpcClient { + ODCClient: odcpb.NewODCClient(conn), + conn: conn, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + return m.conn.Close() +} \ No newline at end of file diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go new file mode 100644 index 000000000..dfcf6ac34 --- /dev/null +++ b/core/integration/odc/handlers.go @@ -0,0 +1,479 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package odc + +import ( + "context" + "errors" + "fmt" + + "github.com/AliceO2Group/Control/core/integration/odc/odcutils" + odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" + "github.com/k0kubun/pp" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (string, error) { + req := &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + } + + var ( + err error = nil + newState = "UNKNOWN" + rep *odcpb.StateReply + ) + + if envId == "" { + return newState, errors.New("cannot proceed with empty environment id") + } + + rep, err = odcClient.GetState(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return newState, printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return newState, errors.New("nil response error") + } + + newState = rep.Reply.State + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return newState, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return newState, fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + "odcState": rep.Reply.State, + }). + Debug("call to ODC complete") + return odcutils.StateForOdcState(newState), err +} + +func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + req := &odcpb.StartRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odcpb.StateReply + + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + req := &odcpb.StopRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odcpb.StateReply + + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + err := doReset(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + + err = doTerminate(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + + err = doShutdown(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + return nil +} + +func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + // RESET + req := &odcpb.ResetRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odcpb.StateReply + + rep, err = odcClient.Reset(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + // TERMINATE + req := &odcpb.TerminateRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var err error = nil + var rep *odcpb.StateReply + + rep, err = odcClient.Terminate(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error{ + // SHUTDOWN + shutdownRequest := &odcpb.ShutdownRequest{ + Partitionid: envId, + } + + var err error = nil + var shutdownResponse *odcpb.GeneralReply + shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if shutdownResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := shutdownResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := shutdownResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": shutdownResponse.Msg, + "odcStatus": shutdownResponse.Status.String(), + "odcExectime": shutdownResponse.Exectime, + "odcRunid": shutdownResponse.Partitionid, + "odcSessionid": shutdownResponse.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func handleExit(ctx context.Context, odcClient *RpcClient, arguments map[string]string ) error { + return nil +} + +func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + log.Trace("BEGIN handleRun") + defer log.Trace("END handleRun") + // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE + topology, exists := arguments["topology"] + + if !exists || len(topology) == 0 { + return errors.New("empty topology received") + } + + runRequest := &odcpb.RunRequest{ + Partitionid: envId, + Topology: topology, + } + + var err error = nil + var runResponse *odcpb.GeneralReply + + runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if runResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := runResponse.GetError(); odcErr != nil { + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := runResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) + } + log.WithFields(logrus.Fields{ + "odcMsg": runResponse.Msg, + "odcStatus": runResponse.Status.String(), + "odcExectime": runResponse.Exectime, + "odcRunid": runResponse.Partitionid, + "odcSessionid": runResponse.Sessionid, + }). + Debug("call to ODC complete") + return err +} + + +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, topology string, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + var err error = nil + + // SetProperties before CONFIGURE + setPropertiesRequest := &odcpb.SetPropertiesRequest{ + Partitionid: envId, + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + } + + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Configure + i := 0 + for k, v := range arguments { + setPropertiesRequest.Properties[i] = &odcpb.Property{ + Key: k, + Value: v, + } + i++ + } + + err = handleRun(ctx, odcClient, map[string]string{ + "topology": topology, + }, envId) + if err != nil { + return printGrpcError(err) + } + + + var setPropertiesResponse *odcpb.GeneralReply + setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if setPropertiesResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "odcRunid": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). + Debug("call to ODC complete") + + + // CONFIGURE + configureRequest := &odcpb.ConfigureRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var configureResponse *odcpb.StateReply + configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if configureResponse == nil || configureResponse.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := configureResponse.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := configureResponse.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "odcRunid": configureResponse.Reply.Partitionid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). + Debug("call to ODC complete") + return err +} + +func printGrpcError(err error) error { + grpcStatus, ok := status.FromError(err) + if ok { + log.WithFields(logrus.Fields{ + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + "ppStatus": pp.Sprint(grpcStatus), + "ppErr": pp.Sprint(err), + }). + Error("transition call error") + err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) + } else { + err = errors.New("invalid gRPC status") + log.WithField("error", "invalid gRPC status").Error("transition call error") + } + return err +} \ No newline at end of file diff --git a/core/integration/odc/odcutils/state.go b/core/integration/odc/odcutils/state.go new file mode 100644 index 000000000..a47c8e9c0 --- /dev/null +++ b/core/integration/odc/odcutils/state.go @@ -0,0 +1,60 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package odcutils + +import "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" + +var( + stateMap = map[string]string{ + "STANDBY": fairmq.IDLE, + "CONFIGURED": fairmq.READY, + "RUNNING": fairmq.RUNNING, + "ERROR": fairmq.ERROR, + "DONE": fairmq.EXITING, + } + invStateMap = func() (inv map[string]string) { // invert stateMap + inv = make(map[string]string, len(stateMap)) + for k, v := range stateMap { + inv[v] = k + } + return + }() +) + +func OdcStateForState(stateName string) string { + fmqState, ok := stateMap[stateName] + if !ok { + return "" + } + return fmqState +} + +func StateForOdcState(fmqStateName string) string { + state, ok := invStateMap[fmqStateName] + if !ok { + return "" + } + return state +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go new file mode 100644 index 000000000..0913db75f --- /dev/null +++ b/core/integration/odc/plugin.go @@ -0,0 +1,159 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/odc.proto + +package odc + +import ( + "context" + "fmt" + "net/url" + "strconv" + "strings" + "time" + + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/spf13/viper" +) + +const ODC_CALL_TIMEOUT = 10 * time.Second + + +type Plugin struct { + odcHost string + odcPort int + + odcClient *RpcClient +} + +func NewPlugin(endpoint string) integration.Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + odcHost: u.Hostname(), + odcPort: portNumber, + odcClient: nil, + } +} + +func (p *Plugin) GetName() string { + return "odc" +} + +func (p *Plugin) Init(_ string) error { + if p.odcClient == nil { + callTimeout := ODC_CALL_TIMEOUT + cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + p.odcClient = NewClient(cxt, cancel, viper.GetString("odcEndpoint")) + if p.odcClient == nil { + return fmt.Errorf("failed to connect to ODC service on %s", viper.GetString("ddSchedulerEndpoint")) + } + log.Debug("ODC plugin ready") + } + return nil +} + +func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + + stack = make(map[string]interface{}) + stack["Start"] = func() (out string) { // must formally return string even when we return nothing + rn, ok := varStack["run_number"] + if !ok { + log.Warn("cannot acquire run number for ODC") + } + + arguments := make(map[string]string) + arguments["run_number"] = rn + + err := handleStart(context.Background(), p.odcClient, arguments, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } + stack["Stop"] = func() (out string) { + err := handleStop(context.Background(), p.odcClient, nil, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } + stack["Reset"] = func() (out string) { + err := handleReset(context.Background(), p.odcClient, nil, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } + stack["Configure"] = func() (out string) { + topology, ok := varStack["odc_topology"] + if !ok { + log.Error("cannot acquire ODC topology") + return + } + + arguments := make(map[string]string) + arguments["environment_id"] = envId + + // FIXME: this only copies over vars prefixed with "odc_" + // Figure out a better way! + for k, v := range varStack { + if strings.HasPrefix(k, "odc_") { + arguments[strings.TrimPrefix(k, "odc_")] = v + } + } + + err := handleConfigure(context.Background(), p.odcClient, arguments, topology, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } + + return +} + +func (p *Plugin) Destroy() error { + return p.odcClient.Close() +} diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go new file mode 100644 index 000000000..556486294 --- /dev/null +++ b/core/integration/odc/protos/odc.pb.go @@ -0,0 +1,1562 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.12.4 +// source: protos/odc.proto + +package odc + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// Request status +type ReplyStatus int32 + +const ( + ReplyStatus_UNKNOWN ReplyStatus = 0 // Status is unknown + ReplyStatus_SUCCESS ReplyStatus = 1 // Request performed successfully + ReplyStatus_ERROR ReplyStatus = 2 // Failed to perform request +) + +// Enum value maps for ReplyStatus. +var ( + ReplyStatus_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SUCCESS", + 2: "ERROR", + } + ReplyStatus_value = map[string]int32{ + "UNKNOWN": 0, + "SUCCESS": 1, + "ERROR": 2, + } +) + +func (x ReplyStatus) Enum() *ReplyStatus { + p := new(ReplyStatus) + *p = x + return p +} + +func (x ReplyStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ReplyStatus) Descriptor() protoreflect.EnumDescriptor { + return file_protos_odc_proto_enumTypes[0].Descriptor() +} + +func (ReplyStatus) Type() protoreflect.EnumType { + return &file_protos_odc_proto_enumTypes[0] +} + +func (x ReplyStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ReplyStatus.Descriptor instead. +func (ReplyStatus) EnumDescriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{0} +} + +// General error +type Error struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed error message + Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` // Error code. +} + +func (x *Error) Reset() { + *x = Error{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Error) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Error) ProtoMessage() {} + +func (x *Error) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Error.ProtoReflect.Descriptor instead. +func (*Error) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{0} +} + +func (x *Error) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *Error) GetCode() int32 { + if x != nil { + return x.Code + } + return 0 +} + +// General reply to requests +type GeneralReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed reply message + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` // Request status code (UNKNOWN, SUCCESS, ERROR) + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms + Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID + State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. +} + +func (x *GeneralReply) Reset() { + *x = GeneralReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GeneralReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GeneralReply) ProtoMessage() {} + +func (x *GeneralReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GeneralReply.ProtoReflect.Descriptor instead. +func (*GeneralReply) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{1} +} + +func (x *GeneralReply) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *GeneralReply) GetStatus() ReplyStatus { + if x != nil { + return x.Status + } + return ReplyStatus_UNKNOWN +} + +func (x *GeneralReply) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +func (x *GeneralReply) GetExectime() int32 { + if x != nil { + return x.Exectime + } + return 0 +} + +func (x *GeneralReply) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *GeneralReply) GetSessionid() string { + if x != nil { + return x.Sessionid + } + return "" +} + +func (x *GeneralReply) GetState() string { + if x != nil { + return x.State + } + return "" +} + +// Device information +// Runtime task ID and path are the same as in DDS. +// To get task details use DDS Topology API. +type Device struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) +} + +func (x *Device) Reset() { + *x = Device{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Device) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Device) ProtoMessage() {} + +func (x *Device) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Device.ProtoReflect.Descriptor instead. +func (*Device) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{2} +} + +func (x *Device) GetId() uint64 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Device) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Device) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +// Device change/get state request +type StateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. + Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` // If true then a list of affected devices is populated in the reply. +} + +func (x *StateRequest) Reset() { + *x = StateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StateRequest) ProtoMessage() {} + +func (x *StateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StateRequest.ProtoReflect.Descriptor instead. +func (*StateRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{3} +} + +func (x *StateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *StateRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *StateRequest) GetDetailed() bool { + if x != nil { + return x.Detailed + } + return false +} + +// Device change/get state reply +type StateReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` // General reply. See GeneralReply message for details. + Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. +} + +func (x *StateReply) Reset() { + *x = StateReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StateReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StateReply) ProtoMessage() {} + +func (x *StateReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StateReply.ProtoReflect.Descriptor instead. +func (*StateReply) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{4} +} + +func (x *StateReply) GetReply() *GeneralReply { + if x != nil { + return x.Reply + } + return nil +} + +func (x *StateReply) GetDevices() []*Device { + if x != nil { + return x.Devices + } + return nil +} + +// Initialize request +type InitializeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. +} + +func (x *InitializeRequest) Reset() { + *x = InitializeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InitializeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InitializeRequest) ProtoMessage() {} + +func (x *InitializeRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. +func (*InitializeRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{5} +} + +func (x *InitializeRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *InitializeRequest) GetSessionid() string { + if x != nil { + return x.Sessionid + } + return "" +} + +// Submit request +type SubmitRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS +} + +func (x *SubmitRequest) Reset() { + *x = SubmitRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SubmitRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitRequest) ProtoMessage() {} + +func (x *SubmitRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SubmitRequest.ProtoReflect.Descriptor instead. +func (*SubmitRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{6} +} + +func (x *SubmitRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +// Activate request +type ActivateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file +} + +func (x *ActivateRequest) Reset() { + *x = ActivateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActivateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActivateRequest) ProtoMessage() {} + +func (x *ActivateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActivateRequest.ProtoReflect.Descriptor instead. +func (*ActivateRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{7} +} + +func (x *ActivateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *ActivateRequest) GetTopology() string { + if x != nil { + return x.Topology + } + return "" +} + +// Run request +type RunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file +} + +func (x *RunRequest) Reset() { + *x = RunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunRequest) ProtoMessage() {} + +func (x *RunRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunRequest.ProtoReflect.Descriptor instead. +func (*RunRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{8} +} + +func (x *RunRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *RunRequest) GetTopology() string { + if x != nil { + return x.Topology + } + return "" +} + +// Update request +type UpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file +} + +func (x *UpdateRequest) Reset() { + *x = UpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRequest) ProtoMessage() {} + +func (x *UpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. +func (*UpdateRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{9} +} + +func (x *UpdateRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *UpdateRequest) GetTopology() string { + if x != nil { + return x.Topology + } + return "" +} + +// Shutdown request +type ShutdownRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS +} + +func (x *ShutdownRequest) Reset() { + *x = ShutdownRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ShutdownRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ShutdownRequest) ProtoMessage() {} + +func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ShutdownRequest.ProtoReflect.Descriptor instead. +func (*ShutdownRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{10} +} + +func (x *ShutdownRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +// Key-Value property +type Property struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Property key + Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Property value +} + +func (x *Property) Reset() { + *x = Property{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Property) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Property) ProtoMessage() {} + +func (x *Property) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Property.ProtoReflect.Descriptor instead. +func (*Property) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{11} +} + +func (x *Property) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Property) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +// Set properties request +type SetPropertiesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. + Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` // List of properties to be set +} + +func (x *SetPropertiesRequest) Reset() { + *x = SetPropertiesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetPropertiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetPropertiesRequest) ProtoMessage() {} + +func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetPropertiesRequest.ProtoReflect.Descriptor instead. +func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{12} +} + +func (x *SetPropertiesRequest) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *SetPropertiesRequest) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *SetPropertiesRequest) GetProperties() []*Property { + if x != nil { + return x.Properties + } + return nil +} + +// Configure request +type ConfigureRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. +} + +func (x *ConfigureRequest) Reset() { + *x = ConfigureRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConfigureRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfigureRequest) ProtoMessage() {} + +func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfigureRequest.ProtoReflect.Descriptor instead. +func (*ConfigureRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{13} +} + +func (x *ConfigureRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request + } + return nil +} + +// Start request +type StartRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. +} + +func (x *StartRequest) Reset() { + *x = StartRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StartRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StartRequest) ProtoMessage() {} + +func (x *StartRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StartRequest.ProtoReflect.Descriptor instead. +func (*StartRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{14} +} + +func (x *StartRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request + } + return nil +} + +// Stop request +type StopRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. +} + +func (x *StopRequest) Reset() { + *x = StopRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopRequest) ProtoMessage() {} + +func (x *StopRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. +func (*StopRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{15} +} + +func (x *StopRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request + } + return nil +} + +// Reset request +type ResetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. +} + +func (x *ResetRequest) Reset() { + *x = ResetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ResetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ResetRequest) ProtoMessage() {} + +func (x *ResetRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. +func (*ResetRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{16} +} + +func (x *ResetRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request + } + return nil +} + +// Terminate request +type TerminateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. +} + +func (x *TerminateRequest) Reset() { + *x = TerminateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TerminateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TerminateRequest) ProtoMessage() {} + +func (x *TerminateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. +func (*TerminateRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{17} +} + +func (x *TerminateRequest) GetRequest() *StateRequest { + if x != nil { + return x.Request + } + return nil +} + +var File_protos_odc_proto protoreflect.FileDescriptor + +var file_protos_odc_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x64, 0x63, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, + 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x60, 0x0a, 0x0c, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, + 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x11, 0x49, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x22, 0x31, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x4a, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, + 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, + 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, + 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, + 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, + 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, + 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_odc_proto_rawDescOnce sync.Once + file_protos_odc_proto_rawDescData = file_protos_odc_proto_rawDesc +) + +func file_protos_odc_proto_rawDescGZIP() []byte { + file_protos_odc_proto_rawDescOnce.Do(func() { + file_protos_odc_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_odc_proto_rawDescData) + }) + return file_protos_odc_proto_rawDescData +} + +var file_protos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_protos_odc_proto_goTypes = []interface{}{ + (ReplyStatus)(0), // 0: odc.ReplyStatus + (*Error)(nil), // 1: odc.Error + (*GeneralReply)(nil), // 2: odc.GeneralReply + (*Device)(nil), // 3: odc.Device + (*StateRequest)(nil), // 4: odc.StateRequest + (*StateReply)(nil), // 5: odc.StateReply + (*InitializeRequest)(nil), // 6: odc.InitializeRequest + (*SubmitRequest)(nil), // 7: odc.SubmitRequest + (*ActivateRequest)(nil), // 8: odc.ActivateRequest + (*RunRequest)(nil), // 9: odc.RunRequest + (*UpdateRequest)(nil), // 10: odc.UpdateRequest + (*ShutdownRequest)(nil), // 11: odc.ShutdownRequest + (*Property)(nil), // 12: odc.Property + (*SetPropertiesRequest)(nil), // 13: odc.SetPropertiesRequest + (*ConfigureRequest)(nil), // 14: odc.ConfigureRequest + (*StartRequest)(nil), // 15: odc.StartRequest + (*StopRequest)(nil), // 16: odc.StopRequest + (*ResetRequest)(nil), // 17: odc.ResetRequest + (*TerminateRequest)(nil), // 18: odc.TerminateRequest +} +var file_protos_odc_proto_depIdxs = []int32{ + 0, // 0: odc.GeneralReply.status:type_name -> odc.ReplyStatus + 1, // 1: odc.GeneralReply.error:type_name -> odc.Error + 2, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply + 3, // 3: odc.StateReply.devices:type_name -> odc.Device + 12, // 4: odc.SetPropertiesRequest.properties:type_name -> odc.Property + 4, // 5: odc.ConfigureRequest.request:type_name -> odc.StateRequest + 4, // 6: odc.StartRequest.request:type_name -> odc.StateRequest + 4, // 7: odc.StopRequest.request:type_name -> odc.StateRequest + 4, // 8: odc.ResetRequest.request:type_name -> odc.StateRequest + 4, // 9: odc.TerminateRequest.request:type_name -> odc.StateRequest + 6, // 10: odc.ODC.Initialize:input_type -> odc.InitializeRequest + 7, // 11: odc.ODC.Submit:input_type -> odc.SubmitRequest + 8, // 12: odc.ODC.Activate:input_type -> odc.ActivateRequest + 9, // 13: odc.ODC.Run:input_type -> odc.RunRequest + 10, // 14: odc.ODC.Update:input_type -> odc.UpdateRequest + 14, // 15: odc.ODC.Configure:input_type -> odc.ConfigureRequest + 13, // 16: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest + 4, // 17: odc.ODC.GetState:input_type -> odc.StateRequest + 15, // 18: odc.ODC.Start:input_type -> odc.StartRequest + 16, // 19: odc.ODC.Stop:input_type -> odc.StopRequest + 17, // 20: odc.ODC.Reset:input_type -> odc.ResetRequest + 18, // 21: odc.ODC.Terminate:input_type -> odc.TerminateRequest + 11, // 22: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest + 2, // 23: odc.ODC.Initialize:output_type -> odc.GeneralReply + 2, // 24: odc.ODC.Submit:output_type -> odc.GeneralReply + 2, // 25: odc.ODC.Activate:output_type -> odc.GeneralReply + 2, // 26: odc.ODC.Run:output_type -> odc.GeneralReply + 2, // 27: odc.ODC.Update:output_type -> odc.GeneralReply + 5, // 28: odc.ODC.Configure:output_type -> odc.StateReply + 2, // 29: odc.ODC.SetProperties:output_type -> odc.GeneralReply + 5, // 30: odc.ODC.GetState:output_type -> odc.StateReply + 5, // 31: odc.ODC.Start:output_type -> odc.StateReply + 5, // 32: odc.ODC.Stop:output_type -> odc.StateReply + 5, // 33: odc.ODC.Reset:output_type -> odc.StateReply + 5, // 34: odc.ODC.Terminate:output_type -> odc.StateReply + 2, // 35: odc.ODC.Shutdown:output_type -> odc.GeneralReply + 23, // [23:36] is the sub-list for method output_type + 10, // [10:23] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name +} + +func init() { file_protos_odc_proto_init() } +func file_protos_odc_proto_init() { + if File_protos_odc_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_odc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Error); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GeneralReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Device); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StateReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*InitializeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SubmitRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActivateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ShutdownRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Property); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetPropertiesRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConfigureRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StartRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TerminateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_odc_proto_rawDesc, + NumEnums: 1, + NumMessages: 18, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_odc_proto_goTypes, + DependencyIndexes: file_protos_odc_proto_depIdxs, + EnumInfos: file_protos_odc_proto_enumTypes, + MessageInfos: file_protos_odc_proto_msgTypes, + }.Build() + File_protos_odc_proto = out.File + file_protos_odc_proto_rawDesc = nil + file_protos_odc_proto_goTypes = nil + file_protos_odc_proto_depIdxs = nil +} diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto new file mode 100644 index 000000000..a4117fd11 --- /dev/null +++ b/core/integration/odc/protos/odc.proto @@ -0,0 +1,167 @@ +syntax = "proto3"; + +package odc; +option go_package = "protos;odc"; + +// The ODC service definition. +// For details also see https://github.com/FairRootGroup/ODC#command-mapping +service ODC { + // Creates a new DDS session or attaches to an existing DDS session. + rpc Initialize (InitializeRequest) returns (GeneralReply) {} + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). + rpc Submit (SubmitRequest) returns (GeneralReply) {} + // Activates a given topology. + rpc Activate (ActivateRequest) returns (GeneralReply) {} + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + rpc Run (RunRequest) returns (GeneralReply) {} + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. + rpc Update (UpdateRequest) returns (GeneralReply) {} + // Transitions devices into Ready state. + rpc Configure (ConfigureRequest) returns (StateReply) {} + // Changes devices configuration. + rpc SetProperties (SetPropertiesRequest) returns (GeneralReply) {} + // Get current aggregated state of devices. + rpc GetState (StateRequest) returns (StateReply) {} + // Transition devices into Running state. + rpc Start (StartRequest) returns (StateReply) {} + // Transitions devices into Ready state. + rpc Stop (StopRequest) returns (StateReply) {} + // Transitions devices into Idle state. + rpc Reset (ResetRequest) returns (StateReply) {} + // Shuts devices down via End transition. + rpc Terminate (TerminateRequest) returns (StateReply) {} + // Shutdown DDS session. + rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} +} + +// Request status +enum ReplyStatus { + UNKNOWN = 0; // Status is unknown + SUCCESS = 1; // Request performed successfully + ERROR = 2; // Failed to perform request +} + +// General error +message Error { + string msg = 1; // Detailed error message + int32 code = 2; // Error code. + // TODO: Make error codes specific for each concrete request and/or error type. + // TODO: Add link to a documented error codes. +} + +// General reply to requests +message GeneralReply { + string msg = 1; // Detailed reply message + ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) + Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty + int32 exectime = 4; // Request execution time in ms + string partitionid = 5; // Partition ID from ECS + string sessionid = 6; // DDS session ID + string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. +} + +// Device information +// Runtime task ID and path are the same as in DDS. +// To get task details use DDS Topology API. +message Device { + uint64 id = 1; // Runtime task ID (same as in DDS) + string state = 2; // FairMQ device state as string + string path = 3; // Runtime task path (same as in DDS) +} + +// Device change/get state request +message StateRequest { + string partitionid = 1; // Partition ID from ECS + string path = 2; // Task path in the DDS topology. Can be a regular expression. + bool detailed = 3; // If true then a list of affected devices is populated in the reply. +} + +// Device change/get state reply +message StateReply { + GeneralReply reply = 1; // General reply. See GeneralReply message for details. + repeated Device devices = 2; // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. +} + +// +// Requests +// + +// Initialize request +message InitializeRequest { + string partitionid = 1; // Partition ID from ECS + string sessionid = 2; // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. +} + +// Submit request +message SubmitRequest { + string partitionid = 1; // Partition ID from ECS +} + +// Activate request +message ActivateRequest { + string partitionid = 1; // Partition ID from ECS + string topology = 2; // Filepath to a DDS topology file +} + +// Run request +message RunRequest { + string partitionid = 1; // Partition ID from ECS + string topology = 2; // Filepath to a DDS topology file +} + +// Update request +message UpdateRequest { + string partitionid = 1; // Partition ID from ECS + string topology = 2; // Filepath to a DDS topology file +} + +// Shutdown request +message ShutdownRequest { + string partitionid = 1; // Partition ID from ECS +} + +// Key-Value property +message Property { + string key = 1; // Property key + string value = 2; // Property value +} + +// Set properties request +message SetPropertiesRequest { + string partitionid = 1; // Partition ID from ECS + string path = 2; // Task path in the DDS topology. Can be a regular expression. + repeated Property properties = 3; // List of properties to be set +} + +// +// FairMQ device state change requests +// + +// Configure request +message ConfigureRequest { + StateRequest request = 1; // State change request. See StateRequest for details. +} + +// Start request +message StartRequest { + StateRequest request = 1; // State change request. See StateRequest for details. +} + +// Stop request +message StopRequest { + StateRequest request = 1; // State change request. See StateRequest for details. +} + +// Reset request +message ResetRequest { + StateRequest request = 1; // State change request. See StateRequest for details. +} + +// Terminate request +message TerminateRequest { + StateRequest request = 1; // State change request. See StateRequest for details. +} diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go new file mode 100644 index 000000000..045ec3bc8 --- /dev/null +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -0,0 +1,561 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package odc + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion7 + +// ODCClient is the client API for ODC service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type ODCClient interface { + // Creates a new DDS session or attaches to an existing DDS session. + Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). + Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Activates a given topology. + Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. + Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Transitions devices into Ready state. + Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) + // Changes devices configuration. + SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transition devices into Running state. + Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Ready state. + Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) + // Transitions devices into Idle state. + Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) + // Shutdown DDS session. + Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) +} + +type oDCClient struct { + cc grpc.ClientConnInterface +} + +func NewODCClient(cc grpc.ClientConnInterface) ODCClient { + return &oDCClient{cc} +} + +func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { + out := new(StateReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { + out := new(GeneralReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// ODCServer is the server API for ODC service. +// All implementations should embed UnimplementedODCServer +// for forward compatibility +type ODCServer interface { + // Creates a new DDS session or attaches to an existing DDS session. + Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) + // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. + // Can be called multiple times in order to submit more DDS agents (allocate more resources). + Submit(context.Context, *SubmitRequest) (*GeneralReply, error) + // Activates a given topology. + Activate(context.Context, *ActivateRequest) (*GeneralReply, error) + // Run request combines Initialize, Submit and Activate into a single request. + // Run request always creates a new DDS session. + Run(context.Context, *RunRequest) (*GeneralReply, error) + // Updates a topology (up or down scale number of tasks or any other topology change). + // It consists of 3 commands: Reset, Activate and Configure. + // Can be called multiple times. + Update(context.Context, *UpdateRequest) (*GeneralReply, error) + // Transitions devices into Ready state. + Configure(context.Context, *ConfigureRequest) (*StateReply, error) + // Changes devices configuration. + SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) + // Get current aggregated state of devices. + GetState(context.Context, *StateRequest) (*StateReply, error) + // Transition devices into Running state. + Start(context.Context, *StartRequest) (*StateReply, error) + // Transitions devices into Ready state. + Stop(context.Context, *StopRequest) (*StateReply, error) + // Transitions devices into Idle state. + Reset(context.Context, *ResetRequest) (*StateReply, error) + // Shuts devices down via End transition. + Terminate(context.Context, *TerminateRequest) (*StateReply, error) + // Shutdown DDS session. + Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) +} + +// UnimplementedODCServer should be embedded to have forward compatible implementations. +type UnimplementedODCServer struct { +} + +func (UnimplementedODCServer) Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") +} +func (UnimplementedODCServer) Submit(context.Context, *SubmitRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") +} +func (UnimplementedODCServer) Activate(context.Context, *ActivateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") +} +func (UnimplementedODCServer) Run(context.Context, *RunRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") +} +func (UnimplementedODCServer) Update(context.Context, *UpdateRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} +func (UnimplementedODCServer) Configure(context.Context, *ConfigureRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") +} +func (UnimplementedODCServer) SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") +} +func (UnimplementedODCServer) GetState(context.Context, *StateRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") +} +func (UnimplementedODCServer) Start(context.Context, *StartRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") +} +func (UnimplementedODCServer) Stop(context.Context, *StopRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") +} +func (UnimplementedODCServer) Reset(context.Context, *ResetRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") +} +func (UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*StateReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") +} +func (UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") +} + +// UnsafeODCServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to ODCServer will +// result in compilation errors. +type UnsafeODCServer interface { + mustEmbedUnimplementedODCServer() +} + +func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { + s.RegisterService(&_ODC_serviceDesc, srv) +} + +func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(InitializeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Initialize(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Initialize", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SubmitRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Submit(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Submit", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ActivateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Activate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Activate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Run(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Run", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Run(ctx, req.(*RunRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfigureRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Configure(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Configure", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetPropertiesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).SetProperties(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/SetProperties", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).GetState(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/GetState", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StartRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Start(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Start", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Start(ctx, req.(*StartRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Stop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Stop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ResetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Reset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Reset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TerminateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Terminate(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Terminate", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ShutdownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Shutdown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Shutdown", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _ODC_serviceDesc = grpc.ServiceDesc{ + ServiceName: "odc.ODC", + HandlerType: (*ODCServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Initialize", + Handler: _ODC_Initialize_Handler, + }, + { + MethodName: "Submit", + Handler: _ODC_Submit_Handler, + }, + { + MethodName: "Activate", + Handler: _ODC_Activate_Handler, + }, + { + MethodName: "Run", + Handler: _ODC_Run_Handler, + }, + { + MethodName: "Update", + Handler: _ODC_Update_Handler, + }, + { + MethodName: "Configure", + Handler: _ODC_Configure_Handler, + }, + { + MethodName: "SetProperties", + Handler: _ODC_SetProperties_Handler, + }, + { + MethodName: "GetState", + Handler: _ODC_GetState_Handler, + }, + { + MethodName: "Start", + Handler: _ODC_Start_Handler, + }, + { + MethodName: "Stop", + Handler: _ODC_Stop_Handler, + }, + { + MethodName: "Reset", + Handler: _ODC_Reset_Handler, + }, + { + MethodName: "Terminate", + Handler: _ODC_Terminate_Handler, + }, + { + MethodName: "Shutdown", + Handler: _ODC_Shutdown_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/odc.proto", +} From 637ff4168d4b7c9571d63c25815dd12cff19a031 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 12:23:24 +0100 Subject: [PATCH 0762/2352] [core] Sort functions in ODC integration plugin --- core/integration/odc/plugin.go | 48 +++++++++++++++++----------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 0913db75f..cf67e5683 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -97,6 +97,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) + stack["Configure"] = func() (out string) { + topology, ok := varStack["odc_topology"] + if !ok { + log.Error("cannot acquire ODC topology") + return + } + + arguments := make(map[string]string) + arguments["environment_id"] = envId + + // FIXME: this only copies over vars prefixed with "odc_" + // Figure out a better way! + for k, v := range varStack { + if strings.HasPrefix(k, "odc_") { + arguments[strings.TrimPrefix(k, "odc_")] = v + } + } + + err := handleConfigure(context.Background(), p.odcClient, arguments, topology, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } stack["Start"] = func() (out string) { // must formally return string even when we return nothing rn, ok := varStack["run_number"] if !ok { @@ -126,30 +150,6 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } - stack["Configure"] = func() (out string) { - topology, ok := varStack["odc_topology"] - if !ok { - log.Error("cannot acquire ODC topology") - return - } - - arguments := make(map[string]string) - arguments["environment_id"] = envId - - // FIXME: this only copies over vars prefixed with "odc_" - // Figure out a better way! - for k, v := range varStack { - if strings.HasPrefix(k, "odc_") { - arguments[strings.TrimPrefix(k, "odc_")] = v - } - } - - err := handleConfigure(context.Background(), p.odcClient, arguments, topology, envId) - if err != nil { - log.WithError(err).Warn("ODC error") - } - return - } return } From a6c06cee77d37794953222ecad81480822ebd7e8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 13:42:41 +0100 Subject: [PATCH 0763/2352] [core] Add EnsureCleanup to ODC functions --- core/integration/odc/handlers.go | 48 +++++++++++++++++++++++++------- core/integration/odc/plugin.go | 7 +++++ 2 files changed, 45 insertions(+), 10 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index dfcf6ac34..9a98a7ce9 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -192,6 +192,33 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return nil } +func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + // This function tries to perform the regular teardown sequence. + // Since Shutdown is supposed to work in any state, we don't bail on error. + err := doReset(ctx, odcClient, arguments, envId) + if err != nil { + log.WithError(printGrpcError(err)). + Warn("ODC Reset call failed") + } + + err = doTerminate(ctx, odcClient, arguments, envId) + if err != nil { + log.WithError(printGrpcError(err)). + Warn("ODC Terminate call failed") + } + + err = doShutdown(ctx, odcClient, arguments, envId) + if err != nil { + log.WithError(printGrpcError(err)). + Warn("ODC Shutdown call failed") + } + return nil // We clobber the error because nothing can be done for a failed cleanup +} + func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { // RESET req := &odcpb.ResetRequest{ @@ -462,18 +489,19 @@ func printGrpcError(err error) error { grpcStatus, ok := status.FromError(err) if ok { log.WithFields(logrus.Fields{ - "code": grpcStatus.Code().String(), - "message": grpcStatus.Message(), - "details": grpcStatus.Details(), - "error": grpcStatus.Err().Error(), - "ppStatus": pp.Sprint(grpcStatus), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + "ppStatus": pp.Sprint(grpcStatus), + "ppErr": pp.Sprint(err), + }). + Trace("ODC call error") + err = fmt.Errorf("ODC returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) } else { err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") + log.WithField("error", "invalid gRPC status"). + Trace("ODC call error") } return err } \ No newline at end of file diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index cf67e5683..0b2f95525 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -150,6 +150,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } + stack["EnsureCleanup"] = func() (out string) { + err := handleCleanup(context.Background(), p.odcClient, nil, envId) + if err != nil { + log.WithError(err).Warn("ODC error") + } + return + } return } From fa5b171167bc89ae519f82d52724e3f0176dc61a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 14:23:53 +0100 Subject: [PATCH 0764/2352] Register ODC plugin --- cmd/o2-aliecs-core/main.go | 5 +++++ core/config.go | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index 4fcb9708d..cdf8435a8 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" + "github.com/AliceO2Group/Control/core/integration/odc" log "github.com/sirupsen/logrus" "github.com/teo/logrus-prefixed-formatter" ) @@ -46,6 +47,10 @@ func init() { "ddsched", "ddSchedulerEndpoint", ddsched.NewPlugin) + integration.RegisterPlugin( + "odc", + "odcEndpoint", + odc.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, diff --git a/core/config.go b/core/config.go index 15b534b4b..227caa191 100644 --- a/core/config.go +++ b/core/config.go @@ -95,11 +95,11 @@ func setDefaults() error { viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) viper.SetDefault("configServiceUri", "apricot://127.0.0.1:47101") - viper.SetDefault("dcsServiceEndpoint", "127.0.0.1:50051") + viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) - viper.SetDefault("ddSchedulerEndpoint", "127.0.0.1:50052") + viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) - viper.SetDefault("odcEndpoint", "127.0.0.1:50053") + viper.SetDefault("odcEndpoint", "//127.0.0.1:50053") viper.SetDefault("odcUseSystemProxy", false) viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") From 84940b1bc4d6790e818ce6eedb96334b61152dcc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 14:24:10 +0100 Subject: [PATCH 0765/2352] [core] Concurrently initialize all plugins --- core/integration/plugin.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 7f1c0d673..a3a276a13 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -67,14 +67,20 @@ func RegisterPlugin(pluginName string, endpointArgumentName string, newFunc NewF } func (p Plugins) InitAll(fid string) { + wg := &sync.WaitGroup{} + wg.Add(len(p)) for _, plugin := range p { - initErr := plugin.Init(fid) - if initErr != nil { - log.WithError(initErr). - WithField("plugin", plugin.GetName()). - Error("workflow plugin failed to initialize") - } + go func(plugin Plugin) { + defer wg.Done() + initErr := plugin.Init(fid) + if initErr != nil { + log.WithError(initErr). + WithField("plugin", plugin.GetName()). + Error("workflow plugin failed to initialize") + } + }(plugin) } + wg.Wait() } func (p Plugins) DestroyAll() { From ff67459495aef1c4e2371bc81444f0107976c42d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Mar 2021 15:24:42 +0100 Subject: [PATCH 0766/2352] [core] Reduce integration plugin dial timeouts --- core/integration/dcs/plugin.go | 4 ++-- core/integration/ddsched/plugin.go | 4 ++-- core/integration/odc/plugin.go | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 9d16de7e2..30dcd7ee3 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -43,7 +43,7 @@ import ( "google.golang.org/grpc/connectivity" ) -const DCS_CALL_TIMEOUT = 10 * time.Second +const DCS_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { dcsHost string @@ -76,7 +76,7 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { - callTimeout := DCS_CALL_TIMEOUT + callTimeout := DCS_DIAL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) p.dcsClient = NewClient(cxt, cancel, viper.GetString("dcsServiceEndpoint")) if p.dcsClient == nil { diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index db7a82eb5..03b9f13f8 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -43,7 +43,7 @@ import ( "google.golang.org/grpc/connectivity" ) -const DDSCHED_CALL_TIMEOUT = 10 * time.Second +const DDSCHED_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { @@ -82,7 +82,7 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(_ string) error { if p.ddSchedClient == nil { - callTimeout := DDSCHED_CALL_TIMEOUT + callTimeout := DDSCHED_DIAL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) p.ddSchedClient = NewClient(cxt, cancel, viper.GetString("ddSchedulerEndpoint")) if p.ddSchedClient == nil { diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 0b2f95525..315bc83dd 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -39,7 +39,7 @@ import ( "github.com/spf13/viper" ) -const ODC_CALL_TIMEOUT = 10 * time.Second +const ODC_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { @@ -73,7 +73,7 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(_ string) error { if p.odcClient == nil { - callTimeout := ODC_CALL_TIMEOUT + callTimeout := ODC_DIAL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) p.odcClient = NewClient(cxt, cancel, viper.GetString("odcEndpoint")) if p.odcClient == nil { From 4df1afb5ec5e9bccd3e40202007c72433bc08bf5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 Mar 2021 14:43:57 +0100 Subject: [PATCH 0767/2352] [build] Bump to v0.20.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 30584a87c..f18011610 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 7 +VERSION_PATCH := 80 From 23371d017568fd6f0a2080549cc1dddca182b0ea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Mar 2021 09:33:59 +0100 Subject: [PATCH 0768/2352] [core] Await expressions, optional with trigger --- core/environment/environment.go | 44 +++++++++++++++++++++++++++------ core/task/task.go | 1 + core/workflow/callable/call.go | 31 +++++++++++++++++++++++ core/workflow/callrole.go | 10 ++++++++ core/workflow/taskrole.go | 10 ++++++++ 5 files changed, 89 insertions(+), 7 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index e3599b015..9e0d4dc7b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -41,6 +41,7 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/gobwas/glob" "github.com/looplab/fsm" "github.com/pborman/uuid" @@ -69,6 +70,8 @@ type Environment struct { stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} eventStream Subscription + + callsPendingAwait map[string /*await expression*/]callable.Calls } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -93,6 +96,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { GlobalVars: gera.MakeStringMapWithMap(the.ConfSvc().GetVars()), UserVars: gera.MakeStringMapWithMap(userVars), stateChangedCh: make(chan *event.TasksStateChangedEvent), + + callsPendingAwait: make(map[string]callable.Calls), } // Make the KVs accessible to the workflow via ParentAdapter @@ -160,10 +165,35 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err error) { + // First we start any tasks allHooks := workflow.GetHooksForTrigger(trigger) - allHooks.FilterCalls().CallAll() + callsToStart := allHooks.FilterCalls() + if len(callsToStart) != 0 { + // Before we run anything asynchronously we must associate each call we're about + // to start with its corresponding await expression + for _, call := range callsToStart { + awaitExpr := call.GetTraits().Await + if _, ok := env.callsPendingAwait[awaitExpr]; !ok || len(env.callsPendingAwait[awaitExpr]) == 0 { + env.callsPendingAwait[awaitExpr] = make(callable.Calls, 0) + } + env.callsPendingAwait[awaitExpr] = append(env.callsPendingAwait[awaitExpr], call) + } + callsToStart.StartAll() + } + // Then we take care of any pending hooks, including from the current trigger + // TODO: this should be further refined by adding priority/weight + pendingCalls, ok := env.callsPendingAwait[trigger] + if ok && len(pendingCalls) != 0 { // there are hooks to take care of + pendingCalls.AwaitAll() + } + + // Tasks are handled separately for now, and they cannot have trigger!=await hooksToTrigger := allHooks.FilterTasks() + return env.runTasksAsHooks(hooksToTrigger) +} + +func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { if len(hooksToTrigger) == 0 { return nil } @@ -190,7 +220,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err for { select { - case e := <- env.incomingEvents: + case e := <-env.incomingEvents: switch evt := e.(type) { case *event.BasicTaskTerminated: tid := evt.GetOrigin().TaskId @@ -205,10 +235,10 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err failedHooksById[thisHook.GetTaskId()] = thisHook log.WithField("task", thisHook.GetName()). WithFields(logrus.Fields{ - "exitCode": evt.ExitCode, - "stdout": evt.Stdout, - "stderr": evt.Stderr, - "partition": env.Id().String(), + "exitCode": evt.ExitCode, + "stdout": evt.Stdout, + "stderr": evt.Stderr, + "partition": env.Id().String(), "finalMesosState": evt.FinalMesosState.String(), }). Warn("hook failed") @@ -221,7 +251,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err default: continue } - case thisHook := <- timeoutCh: + case thisHook := <-timeoutCh: log.WithField("partition", env.Id().String()). WithField("task", thisHook.GetName()).Warn("hook response timed out") delete(hookTimers, thisHook) diff --git a/core/task/task.go b/core/task/task.go index 3eb11d0df..5a6d0bd73 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -76,6 +76,7 @@ type parentRole interface { type Traits struct { Trigger string + Await string Timeout string Critical bool } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index adc8989e7..cf9f0eb98 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -52,6 +52,8 @@ type Call struct { VarStack map[string]string Traits task.Traits parentRole ParentRole + + await chan error } func (s Hooks) FilterCalls() (calls Calls) { @@ -85,6 +87,23 @@ func (s Calls) CallAll() map[*Call]error { return errors } +func (s Calls) StartAll() { + for _, v := range s { + v.Start() + } +} + +func (s Calls) AwaitAll() map[*Call]error { + errors := make(map[*Call]error) + for _, v := range s { + err := v.Await() + if err != nil { + errors[v] = err + } + } + return errors +} + func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { return &Call{ @@ -117,6 +136,18 @@ func (c *Call) Call() error { return nil } +func (c *Call) Start() { + c.await = make(chan error) + go func() { + c.await <- c.Call() + }() +} + +func (c *Call) Await() error { + defer close(c.await) + return <-c.await +} + func (c *Call) GetParentRole() interface{} { return c.parentRole } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 574481fec..b57f4610b 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -52,6 +52,7 @@ func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) Func string Return string Trigger *string + Await *string Timeout *string Critical *bool } @@ -81,6 +82,12 @@ func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } else { role.Timeout = (30 * time.Second).String() } + if aux.Call.Await != nil && len(*aux.Call.Await) > 0 { + role.Await = *aux.Call.Await + } else { + // if no await is specified, await := trigger + role.Await = *aux.Call.Trigger + } } else { // basic task if aux.Call.Timeout != nil && len(*aux.Call.Timeout) > 0 { role.Timeout = *aux.Call.Timeout @@ -103,6 +110,7 @@ func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *callRole) MarshalYAML() (interface{}, error) { callRole := make(map[string]interface{}) if t.Traits.Trigger != "" { callRole["trigger"] = t.Traits.Trigger } + if t.Traits.Await != "" { callRole["await"] = t.Traits.Await } if t.Traits.Timeout != "" { callRole["timeout"] = t.Traits.Timeout } callRole["critical"] = t.Traits.Critical callRole["func"] = t.FuncCall @@ -137,6 +145,7 @@ func (t *callRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.ReturnVar), template.WrapPointer(&t.Timeout), template.WrapPointer(&t.Trigger), + template.WrapPointer(&t.Await), }, template.STAGE4: append(append( WrapConstraints(t.Constraints), @@ -239,6 +248,7 @@ func (t* callRole) GetTaskTraits() task.Traits { if t == nil { return task.Traits{ Trigger: "", + Await: "", Timeout: "0s", Critical: false, } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 3f13d7716..7241d470d 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -51,6 +51,7 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) Task struct{ Load string Trigger *string + Await *string Timeout *string Critical *bool } @@ -79,6 +80,12 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } else { role.Timeout = (30 * time.Second).String() } + if aux.Task.Await != nil && len(*aux.Task.Await) > 0 { + role.Await = *aux.Task.Await + } else { + // if no await is specified, await := trigger + role.Await = *aux.Task.Trigger + } } else { // basic task if aux.Task.Timeout != nil && len(*aux.Task.Timeout) > 0 { role.Timeout = *aux.Task.Timeout @@ -100,6 +107,7 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *taskRole) MarshalYAML() (interface{}, error) { taskRole := make(map[string]interface{}) if t.Traits.Trigger != "" { taskRole["trigger"] = t.Traits.Trigger } + if t.Traits.Await != "" { taskRole["await"] = t.Traits.Await } if t.Traits.Timeout != "" { taskRole["timeout"] = t.Traits.Timeout } taskRole["critical"] = t.Traits.Critical taskRole["load"] = t.LoadTaskClass @@ -132,6 +140,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { template.WrapPointer(&t.LoadTaskClass), template.WrapPointer(&t.Timeout), template.WrapPointer(&t.Trigger), + template.WrapPointer(&t.Await), }, template.STAGE4: append(append( WrapConstraints(t.Constraints), @@ -268,6 +277,7 @@ func (t* taskRole) GetTaskTraits() task.Traits { if t == nil { return task.Traits{ Trigger: "", + Await: "", Timeout: "0s", Critical: false, } From 3504f238794ee3912281d925e3d2157ff18f2a0c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Mar 2021 17:24:18 +0100 Subject: [PATCH 0769/2352] [build] Bump to v0.20.81 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f18011610..1a2ea9ce1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 20 -VERSION_PATCH := 80 +VERSION_PATCH := 81 From ccfb5b380e61d115b97ccd8f882c3b01e140e80a Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 12:59:33 +0100 Subject: [PATCH 0770/2352] [executor] Kill leftover tasks when rpc failed to start --- executor/executable/controllabletask.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index a0bf3cb3f..a7517c798 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -110,6 +110,7 @@ func (t *ControllableTask) Launch() error { Error("failed to run task") t.sendStatus(mesos.TASK_FAILED, err.Error()) + t.doKill(-taskCmd.Process.Pid) return } log.WithField("id", t.ti.TaskID.Value). @@ -165,6 +166,7 @@ func (t *ControllableTask) Launch() error { Error("could not start gRPC client") t.sendStatus(mesos.TASK_FAILED, err.Error()) + t.doKill(-taskCmd.Process.Pid) return } t.rpc.TaskCmd = taskCmd @@ -517,6 +519,11 @@ func (t *ControllableTask) Kill() error { t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } + return t.doKill(pid) +} + +func (t *ControllableTask) doKill(pid int) error { + killErrCh := make(chan error) go func() { err := syscall.Kill(pid, syscall.SIGTERM) From c4904d71de5913afd82e9e51e17cb1606a09b752 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 13:24:21 +0100 Subject: [PATCH 0771/2352] [core] Environment should kill tasks after failed deployment --- core/environment/manager.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 6c2ca87a4..09d3427fd 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -152,9 +152,20 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithError(err). Warn("environment deployment and configuration failed, cleanup in progress") + envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally err = envs.TeardownEnvironment(env.Id(), true/*force*/) + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + }). + Warn("environment deployment failed, tasks were cleaned up") + return env.id, err } From 861935ccf9f53300ac08b4b9fb535d581bfae1fe Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 13:24:56 +0100 Subject: [PATCH 0772/2352] [core] Fix panic close nil channel on teardown --- core/environment/manager.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 09d3427fd..f0cba9c12 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -202,8 +202,11 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error // we kill all tasks that aren't cleanup hooks taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, tasksToRelease, nil) // close state channel - close(envs.pendingStateChangeCh[environmentId]) + if ch := envs.pendingStateChangeCh[environmentId]; ch != nil { + close(envs.pendingStateChangeCh[environmentId]) + } delete(envs.pendingStateChangeCh, environmentId) + // We set all callRoles to INACTIVE right now, because there's no task activation for them. From f08f4e5d747c89e78dc758de064f90c138dc2a57 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 16:14:26 +0100 Subject: [PATCH 0773/2352] [core] Adjust CreateAutoEnvironment to the new Teardown --- core/environment/manager.go | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index f0cba9c12..a383e6788 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -457,31 +457,15 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str true )) if err != nil { envState := env.CurrentState() + log.WithField("state", envState). + WithField("environment", env.Id().String()). + WithError(err). + Warn("environment deployment and configuration failed, cleanup in progress") + envTasks := env.Workflow().GetTasks() - taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks,env.id, envTasks, nil) - pendingCh := make(chan *event.TasksReleasedEvent) - envs.mu.Lock() - envs.pendingTeardownsCh[env.Id()] = pendingCh - envs.mu.Unlock() - envs.taskman.MessageChannel <- taskmanMessage - - incomingEv := <- pendingCh - - // If some tasks failed to release - if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { - for taskId, err := range taskReleaseErrors { - log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": env.Id().String(), - }). - WithError(err). - Warn("task failed to release") - } - } + // TeardownEnvironment manages the envs.mu internally + err = envs.TeardownEnvironment(env.Id(), true/*force*/) - envs.mu.Lock() - delete(envs.m, env.id) - envs.mu.Unlock() killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { log.WithError(rlsErr).Warn("task teardown error") @@ -491,13 +475,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "lastEnvState": envState, }). Warn("environment deployment failed, tasks were cleaned up") - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - // close state channel - envs.mu.Lock() - close(envs.pendingStateChangeCh[env.Id()]) - delete(envs.pendingStateChangeCh, env.Id()) - envs.mu.Unlock() return } From 02eadde51e6c88e04710e089cd9eb4d7a61b33f2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 16:15:03 +0100 Subject: [PATCH 0774/2352] [coconut] Fix print statement --- coconut/control/control.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 326643f47..cbf27c11f 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -240,7 +240,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C fmt.Printf("\nEnvironment with id %s failed with error: %s\n", evt.EnvironmentId, evt.Error) return nil } - tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}}{{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") + tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}} {{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") if err != nil { return err } From 0f31ec5a566e65a0bc71b74439b345d51bb3dd7a Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 9 Mar 2021 16:15:58 +0100 Subject: [PATCH 0775/2352] [core] Send event with the correct TaskID --- core/environment/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index a383e6788..86fae99aa 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -356,7 +356,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { t := envs.taskman.GetTask(taskId.Value) isHook := false if t != nil { - t.SendEvent(&event.TaskEvent{Name: t.GetName(), TaskID: taskId.String(), Status: btt.FinalMesosState.String(), Hostname: t.GetHostname() , ClassName: t.GetClassName()}) + t.SendEvent(&event.TaskEvent{Name: t.GetName(), TaskID: taskId.Value, Status: btt.FinalMesosState.String(), Hostname: t.GetHostname() , ClassName: t.GetClassName()}) if parentRole, ok := t.GetParentRole().(workflow.Role); ok { parentRole.SetRuntimeVars(map[string]string{ "taskResult.exitCode": strconv.Itoa(btt.ExitCode), From 9ffe049df7cb601101b23ed785c68c018e0050cc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Mar 2021 17:25:56 +0100 Subject: [PATCH 0776/2352] [misc] Update default configuration parameters --- apricot/config.go | 2 +- core/config.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apricot/config.go b/apricot/config.go index 0b60314bf..267d4f9f4 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -40,7 +40,7 @@ func setDefaults() error { viper.SetDefault("listenPort", 47101) viper.SetDefault("backendUri", "consul://127.0.0.1:8500") - viper.SetDefault("runtimeBasePath", "o2/aliecs") + viper.SetDefault("runtimeBasePath", "o2/runtime") viper.SetDefault("workingDir", "/var/lib/o2/apricot") viper.SetDefault("verbose", false) return nil diff --git a/core/config.go b/core/config.go index 227caa191..a7ffeb4fc 100644 --- a/core/config.go +++ b/core/config.go @@ -55,10 +55,10 @@ func setDefaults() error { viper.Set("component", "core") viper.SetDefault("controlPort", 47102) viper.SetDefault("coreConfigurationUri", "") - viper.SetDefault("consulBasePath", "o2/aliecs") + viper.SetDefault("consulBasePath", "o2/components/aliecs/ANY/any") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") - viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2control-executor"))) + viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2-aliecs-executor"))) viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) viper.SetDefault("executorMemory", envFloat("EXEC_MEMORY", "64")) viper.SetDefault("globalDefaultRevision", "master") @@ -186,7 +186,7 @@ func parseCoreConfig() error { if uri.Scheme == "file" { viper.SetConfigFile(uri.Host + uri.Path) if err := viper.ReadInConfig(); err != nil { - return errors.New(coreCfgUri + ": " + err.Error()); + return errors.New(coreCfgUri + ": " + err.Error()) } } else if uri.Scheme == "consul"{ if err := viper.AddRemoteProvider("consul", uri.Host, uri.Path); err != nil { From 9986007a12f9064937222242773e7a8d6b51fdd1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Mar 2021 17:26:51 +0100 Subject: [PATCH 0777/2352] [build] Bump to v0.21.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 1a2ea9ce1..6f690f830 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 20 -VERSION_PATCH := 81 +VERSION_MINOR := 21 +VERSION_PATCH := 0 From b3a0297d989d3b4df86c4513512b6d2c1602b6c5 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 10 Mar 2021 17:29:56 +0100 Subject: [PATCH 0778/2352] [core] Fix empty roster issue --- core/task/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index ba1ff376a..aa09b989a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -728,7 +728,7 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err // if we couldn't kill a task add it back to the roster m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !tasks.Contains(func(t *Task) bool { - return task.status == ACTIVE + return t.taskId == task.taskId }) })) From aeea3485e5a09bb6c4f463018834f52da0d2e82d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 11:25:43 +0100 Subject: [PATCH 0779/2352] [executor] Configurable task stdout logging --- common/cmdinfo.go | 39 +++++++++++++++++++---- common/logger/infologger/directhook.go | 8 +++++ common/taskcmdinfo.go | 2 +- executor/executable/basictaskcommon.go | 41 ++++++++++++++++++++----- executor/executable/controllabletask.go | 35 ++++++++++++++++----- 5 files changed, 104 insertions(+), 21 deletions(-) diff --git a/common/cmdinfo.go b/common/cmdinfo.go index 3768b9bdf..581de2bcc 100644 --- a/common/cmdinfo.go +++ b/common/cmdinfo.go @@ -28,12 +28,21 @@ import ( "strings" ) + +type LogTaskOutput int +const ( + LogTaskOutput_NONE LogTaskOutput = iota + LogTaskOutput_STDOUT + LogTaskOutput_ALL +) + type CommandInfo struct { - Env []string `json:"env,omitempty" yaml:"env,omitempty"` - Shell *bool `json:"shell,omitempty" yaml:"shell,omitempty"` - Value *string `json:"value,omitempty" yaml:"value,omitempty"` - User *string `json:"user,omitempty" yaml:"user,omitempty"` - Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` + Env []string `json:"env,omitempty" yaml:"env,omitempty"` + Shell *bool `json:"shell,omitempty" yaml:"shell,omitempty"` + Value *string `json:"value,omitempty" yaml:"value,omitempty"` + User *string `json:"user,omitempty" yaml:"user,omitempty"` + Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` + Log LogTaskOutput `json:"log,omitempty" yaml:"log,omitempty"` } func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -43,6 +52,7 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro Value *string `json:"value,omitempty" yaml:"value,omitempty"` User *string `json:"user,omitempty" yaml:"user,omitempty"` Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` + Log *string `json:"log,omitempty" yaml:"log,omitempty"` } aux := _commandInfo{} err = unmarshal(&aux) @@ -58,6 +68,18 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro m.Value = aux.Value m.Arguments = aux.Arguments m.User = aux.User + if aux.Log != nil { + switch strings.TrimSpace(strings.ToLower(*aux.Log)) { + case "none": + m.Log = LogTaskOutput_NONE + case "stdout": + m.Log = LogTaskOutput_STDOUT + case "all": + m.Log = LogTaskOutput_ALL + default: + m.Log = LogTaskOutput_NONE + } + } return } @@ -70,6 +92,7 @@ func (m *CommandInfo) Copy() *CommandInfo { Value: new(string), User: new(string), Arguments: append([]string{}, m.Arguments...), + Log: m.Log, } if m.Shell != nil { *cmd.Shell = *m.Shell @@ -113,7 +136,10 @@ func (m *CommandInfo) Equals(other *CommandInfo) (response bool) { return false } if !((m.Shell == nil && other.Shell == nil) || - *m.Shell == *other.Shell) { + *m.Shell == *other.Shell) { + return false + } + if m.Log != other.Log { return false } return @@ -137,6 +163,7 @@ func (m *CommandInfo) UpdateFrom(n *CommandInfo) { if n.User != nil { *m.User = *n.User } + m.Log = n.Log } const defaultCommandInfoShell = false diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index e3b720caf..31dcf8b14 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -202,6 +202,14 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { continue } + if k == "nohooks" { + if vBool, ok := v.(bool); ok { + if vBool { + return nil + } + } + } + var vStr string switch v.(type) { case string: diff --git a/common/taskcmdinfo.go b/common/taskcmdinfo.go index 93698b3dc..e31b3fb23 100644 --- a/common/taskcmdinfo.go +++ b/common/taskcmdinfo.go @@ -36,5 +36,5 @@ type TaskCommandInfo struct { ControlMode controlmode.ControlMode `json:"controlMode"` // Only applies to hooks and basic tasks - Timeout time.Duration `json:"timeout,omitempty"` + Timeout time.Duration `json:"timeout,omitempty"` } diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 4a35bac9b..3b28f37ee 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -32,6 +32,7 @@ import ( "os/exec" "syscall" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" @@ -68,13 +69,39 @@ func (t *basicTaskBase) startBasicTask() (err error) { // Set up pipes for controlled process var errStdout, errStderr error var stdoutBuf, stderrBuf bytes.Buffer - - stdoutLog := log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel) - stderrLog := log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel) - - // Each of these multiwriters will push incoming lines to a buffer as well as the logger - stdout := io.MultiWriter(stdoutLog, &stdoutBuf) - stderr := io.MultiWriter(stderrLog, &stderrBuf) + var stdout, stderr io.Writer + + switch t.Tci.Log { + case common.LogTaskOutput_STDOUT: + stdoutLog := log.WithPrefix("task-stdout"). + WithField("task", t.ti.Name). + WithField("nohooks", true). + WriterLevel(logrus.TraceLevel) + stderrLog := log.WithPrefix("task-stderr"). + WithField("task", t.ti.Name). + WithField("nohooks", true). + WriterLevel(logrus.TraceLevel) + + // Each of these multiwriters will push incoming lines to a buffer as well as the logger + stdout = io.MultiWriter(stdoutLog, &stdoutBuf) + stderr = io.MultiWriter(stderrLog, &stderrBuf) + + case common.LogTaskOutput_ALL: + stdoutLog := log.WithPrefix("task-stdout"). + WithField("task", t.ti.Name). + WriterLevel(logrus.TraceLevel) + stderrLog := log.WithPrefix("task-stderr"). + WithField("task", t.ti.Name). + WriterLevel(logrus.TraceLevel) + + stdout = io.MultiWriter(stdoutLog, &stdoutBuf) + stderr = io.MultiWriter(stderrLog, &stderrBuf) + + default: + // Nothing goes to the log, we go straight to the buffer + stdout = &stdoutBuf + stderr = &stderrBuf + } stdoutIn, _ := t.taskCmd.StdoutPipe() stderrIn, _ := t.taskCmd.StderrPipe() diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index a7517c798..b419dc4bd 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -34,6 +34,7 @@ import ( "syscall" "time" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" @@ -110,19 +111,39 @@ func (t *ControllableTask) Launch() error { Error("failed to run task") t.sendStatus(mesos.TASK_FAILED, err.Error()) - t.doKill(-taskCmd.Process.Pid) + _ = t.doKill(-taskCmd.Process.Pid) return } log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). Debug("task launched") - go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel), stdoutIn) - }() - go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr").WithField("task", t.ti.Name).WriterLevel(logrus.TraceLevel), stderrIn) - }() + switch t.Tci.Log { + case common.LogTaskOutput_STDOUT: + go func() { + _, errStdout = io.Copy(log.WithPrefix("task-stdout"). + WithField("task", t.ti.Name). + WithField("nohooks", true). + WriterLevel(logrus.DebugLevel), stdoutIn) + }() + go func() { + _, errStderr = io.Copy(log.WithPrefix("task-stderr"). + WithField("task", t.ti.Name). + WithField("nohooks", true). + WriterLevel(logrus.WarnLevel), stderrIn) + }() + case common.LogTaskOutput_ALL: + go func() { + _, errStdout = io.Copy(log.WithPrefix("task-stdout"). + WithField("task", t.ti.Name). + WriterLevel(logrus.DebugLevel), stdoutIn) + }() + go func() { + _, errStderr = io.Copy(log.WithPrefix("task-stderr"). + WithField("task", t.ti.Name). + WriterLevel(logrus.WarnLevel), stderrIn) + }() + } log.WithFields(logrus.Fields{ "controlPort": t.Tci.ControlPort, From 6de4095096e7547da91fddc2cb5b5c8910e876f1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 11:46:29 +0100 Subject: [PATCH 0780/2352] [executor] Support parametrization of task log pipe --- common/cmdinfo.go | 27 +++++++------------------ core/task/task.go | 14 +++++++++++++ executor/executable/basictaskcommon.go | 11 ++++++---- executor/executable/controllabletask.go | 11 ++++++---- 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/common/cmdinfo.go b/common/cmdinfo.go index 581de2bcc..dcbf6ddba 100644 --- a/common/cmdinfo.go +++ b/common/cmdinfo.go @@ -30,11 +30,6 @@ import ( type LogTaskOutput int -const ( - LogTaskOutput_NONE LogTaskOutput = iota - LogTaskOutput_STDOUT - LogTaskOutput_ALL -) type CommandInfo struct { Env []string `json:"env,omitempty" yaml:"env,omitempty"` @@ -42,7 +37,7 @@ type CommandInfo struct { Value *string `json:"value,omitempty" yaml:"value,omitempty"` User *string `json:"user,omitempty" yaml:"user,omitempty"` Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` - Log LogTaskOutput `json:"log,omitempty" yaml:"log,omitempty"` + Log *string `json:"log,omitempty" yaml:"log,omitempty"` } func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -68,18 +63,7 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro m.Value = aux.Value m.Arguments = aux.Arguments m.User = aux.User - if aux.Log != nil { - switch strings.TrimSpace(strings.ToLower(*aux.Log)) { - case "none": - m.Log = LogTaskOutput_NONE - case "stdout": - m.Log = LogTaskOutput_STDOUT - case "all": - m.Log = LogTaskOutput_ALL - default: - m.Log = LogTaskOutput_NONE - } - } + m.Log = aux.Log return } @@ -139,7 +123,8 @@ func (m *CommandInfo) Equals(other *CommandInfo) (response bool) { *m.Shell == *other.Shell) { return false } - if m.Log != other.Log { + if !((m.Log == nil && other.Log == nil) || + *m.Log == *other.Log) { return false } return @@ -163,7 +148,9 @@ func (m *CommandInfo) UpdateFrom(n *CommandInfo) { if n.User != nil { *m.User = *n.User } - m.Log = n.Log + if n.Log != nil { + *m.Log = *n.Log + } } const defaultCommandInfoShell = false diff --git a/core/task/task.go b/core/task/task.go index 5a6d0bd73..01d70259c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -280,6 +280,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { template.Fields{ template.WrapPointer(cmd.Value), template.WrapPointer(cmd.User), + template.WrapPointer(cmd.Log), }, append( template.WrapSliceItems(cmd.Env), @@ -314,6 +315,19 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.Timeout, err = time.ParseDuration(traits.Timeout) } + if cmd.Log != nil { + *cmd.Log = strings.TrimSpace(strings.ToLower(*cmd.Log)) + if !utils.StringSliceContains([]string{"stdout", "all", "none"}, *cmd.Log) { + err = fmt.Errorf("bad log forwarding expression %s, allowed values: %s", + *cmd.Log, "none, stdout, all") + t.commandInfo = &common.TaskCommandInfo{} + return + } + } else { // log not defined + none := "none" + cmd.Log = &none + } + t.commandInfo = cmd } else { t.commandInfo = &common.TaskCommandInfo{} diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 3b28f37ee..216fa9c68 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -32,7 +32,6 @@ import ( "os/exec" "syscall" - "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" @@ -71,8 +70,12 @@ func (t *basicTaskBase) startBasicTask() (err error) { var stdoutBuf, stderrBuf bytes.Buffer var stdout, stderr io.Writer - switch t.Tci.Log { - case common.LogTaskOutput_STDOUT: + if t.Tci.Log == nil { + none := "none" + t.Tci.Log = &none + } + switch *t.Tci.Log { + case "stdout": stdoutLog := log.WithPrefix("task-stdout"). WithField("task", t.ti.Name). WithField("nohooks", true). @@ -86,7 +89,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { stdout = io.MultiWriter(stdoutLog, &stdoutBuf) stderr = io.MultiWriter(stderrLog, &stderrBuf) - case common.LogTaskOutput_ALL: + case "all": stdoutLog := log.WithPrefix("task-stdout"). WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index b419dc4bd..2766d1de4 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -34,7 +34,6 @@ import ( "syscall" "time" - "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" @@ -118,8 +117,12 @@ func (t *ControllableTask) Launch() error { WithField("task", t.ti.Name). Debug("task launched") - switch t.Tci.Log { - case common.LogTaskOutput_STDOUT: + if t.Tci.Log == nil { + none := "none" + t.Tci.Log = &none + } + switch *t.Tci.Log { + case "stdout": go func() { _, errStdout = io.Copy(log.WithPrefix("task-stdout"). WithField("task", t.ti.Name). @@ -132,7 +135,7 @@ func (t *ControllableTask) Launch() error { WithField("nohooks", true). WriterLevel(logrus.WarnLevel), stderrIn) }() - case common.LogTaskOutput_ALL: + case "all": go func() { _, errStdout = io.Copy(log.WithPrefix("task-stdout"). WithField("task", t.ti.Name). From c6ec42d2cf6d2edf3a5d886116f8867a3f0829f0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 12:02:10 +0100 Subject: [PATCH 0781/2352] [build] Bump to v0.21.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6f690f830..acac064cc 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 21 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From eff660aa3e119155a2629d81aa181d0a4d472855 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 14:52:11 +0100 Subject: [PATCH 0782/2352] [core] Fix nil pointer dereference --- core/task/task.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index 01d70259c..e5b9dcd00 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -280,13 +280,15 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { template.Fields{ template.WrapPointer(cmd.Value), template.WrapPointer(cmd.User), - template.WrapPointer(cmd.Log), }, append( template.WrapSliceItems(cmd.Env), template.WrapSliceItems(cmd.Arguments)... )... ) + if cmd.Log != nil { // we only template it if it's defined + fields = append(fields, template.WrapPointer(cmd.Log)) + } err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template)) if err != nil { t.commandInfo = &common.TaskCommandInfo{} From 67725e3c1825105f1a6d21922b69c5643cf98883 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 14:52:41 +0100 Subject: [PATCH 0783/2352] [build] Bump to v0.21.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index acac064cc..0cdefe04a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 21 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 6fc1bf87c4d6404a6943adc889f5105edfda83a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Mar 2021 17:30:45 +0100 Subject: [PATCH 0784/2352] [core] Update ODC client to latest protofile --- core/integration/odc/handlers.go | 19 ++- core/integration/odc/plugin.go | 16 +- core/integration/odc/protos/odc.pb.go | 217 ++++++++++++++----------- core/integration/odc/protos/odc.proto | 4 + odcshim/odcprotos/odc.pb.go | 219 +++++++++++++++----------- odcshim/odcprotos/odc.proto | 4 + 6 files changed, 296 insertions(+), 183 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 9a98a7ce9..473e302d4 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -345,16 +345,29 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s log.Trace("BEGIN handleRun") defer log.Trace("END handleRun") + // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE - topology, exists := arguments["topology"] + var topology, plugin, resources string + exists := false + topology, exists = arguments["topology"] if !exists || len(topology) == 0 { return errors.New("empty topology received") } + plugin, exists = arguments["plugin"] + if !exists || len(plugin) == 0 { + return errors.New("empty plugin received") + } + resources, exists = arguments["resources"] + if !exists || len(resources) == 0 { + return errors.New("empty resources received") + } runRequest := &odcpb.RunRequest{ Partitionid: envId, Topology: topology, + Plugin: plugin, + Resources: resources, } var err error = nil @@ -388,7 +401,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s } -func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, topology string, envId string) error { +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, topology string, plugin string, resources string, envId string) error { if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -415,6 +428,8 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st err = handleRun(ctx, odcClient, map[string]string{ "topology": topology, + "plugin": plugin, + "resources": resources, }, envId) if err != nil { return printGrpcError(err) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 315bc83dd..bfdb944ea 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -98,11 +98,23 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["Configure"] = func() (out string) { - topology, ok := varStack["odc_topology"] + var topology, plugin, resources string + ok := false + topology, ok = varStack["odc_topology"] if !ok { log.Error("cannot acquire ODC topology") return } + plugin, ok = varStack["odc_plugin"] + if !ok { + log.Error("cannot acquire ODC RMS plugin declaration") + return + } + resources, ok = varStack["odc_resources"] + if !ok { + log.Error("cannot acquire ODC resources declaration") + return + } arguments := make(map[string]string) arguments["environment_id"] = envId @@ -115,7 +127,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } } - err := handleConfigure(context.Background(), p.odcClient, arguments, topology, envId) + err := handleConfigure(context.Background(), p.odcClient, arguments, topology, plugin, resources, envId) if err != nil { log.WithError(err).Warn("ODC error") } diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 556486294..0d081bd92 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -476,6 +476,8 @@ type SubmitRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Plugin string `protobuf:"bytes,2,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } func (x *SubmitRequest) Reset() { @@ -517,6 +519,20 @@ func (x *SubmitRequest) GetPartitionid() string { return "" } +func (x *SubmitRequest) GetPlugin() string { + if x != nil { + return x.Plugin + } + return "" +} + +func (x *SubmitRequest) GetResources() string { + if x != nil { + return x.Resources + } + return "" +} + // Activate request type ActivateRequest struct { state protoimpl.MessageState @@ -581,6 +597,8 @@ type RunRequest struct { Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file + Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } func (x *RunRequest) Reset() { @@ -629,6 +647,20 @@ func (x *RunRequest) GetTopology() string { return "" } +func (x *RunRequest) GetPlugin() string { + if x != nil { + return x.Plugin + } + return "" +} + +func (x *RunRequest) GetResources() string { + if x != nil { + return x.Resources + } + return "" +} + // Update request type UpdateRequest struct { state protoimpl.MessageState @@ -1136,106 +1168,113 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x22, 0x31, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x4a, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x22, 0x67, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, - 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x6e, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x80, 0x01, 0x0a, 0x0a, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4d, 0x0a, + 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x33, 0x0a, 0x0f, + 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, - 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, - 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, + 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x32, 0xad, + 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, - 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, + 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, - 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, - 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, - 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, - 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, + 0x5a, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index a4117fd11..43c3464ad 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -99,6 +99,8 @@ message InitializeRequest { // Submit request message SubmitRequest { string partitionid = 1; // Partition ID from ECS + string plugin = 2; // Name of the resource plugin registered in odc-server + string resources = 3; // Resource description } // Activate request @@ -111,6 +113,8 @@ message ActivateRequest { message RunRequest { string partitionid = 1; // Partition ID from ECS string topology = 2; // Filepath to a DDS topology file + string plugin = 3; // Name of the resource plugin registered in odc-server + string resources = 4; // Resource description } // Update request diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 24b7d5eb4..8c36ee234 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -476,6 +476,8 @@ type SubmitRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Plugin string `protobuf:"bytes,2,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } func (x *SubmitRequest) Reset() { @@ -517,6 +519,20 @@ func (x *SubmitRequest) GetPartitionid() string { return "" } +func (x *SubmitRequest) GetPlugin() string { + if x != nil { + return x.Plugin + } + return "" +} + +func (x *SubmitRequest) GetResources() string { + if x != nil { + return x.Resources + } + return "" +} + // Activate request type ActivateRequest struct { state protoimpl.MessageState @@ -581,6 +597,8 @@ type RunRequest struct { Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file + Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } func (x *RunRequest) Reset() { @@ -629,6 +647,20 @@ func (x *RunRequest) GetTopology() string { return "" } +func (x *RunRequest) GetPlugin() string { + if x != nil { + return x.Plugin + } + return "" +} + +func (x *RunRequest) GetResources() string { + if x != nil { + return x.Resources + } + return "" +} + // Update request type UpdateRequest struct { state protoimpl.MessageState @@ -1136,106 +1168,113 @@ var file_odcprotos_odc_proto_rawDesc = []byte{ 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x22, 0x31, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x6e, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x4a, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x22, 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x80, 0x01, + 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, + 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, - 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, + 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, - 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, - 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, + 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, + 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, - 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, - 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, + 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, + 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, + 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto index 0a1740833..61d63bb71 100644 --- a/odcshim/odcprotos/odc.proto +++ b/odcshim/odcprotos/odc.proto @@ -99,6 +99,8 @@ message InitializeRequest { // Submit request message SubmitRequest { string partitionid = 1; // Partition ID from ECS + string plugin = 2; // Name of the resource plugin registered in odc-server + string resources = 3; // Resource description } // Activate request @@ -111,6 +113,8 @@ message ActivateRequest { message RunRequest { string partitionid = 1; // Partition ID from ECS string topology = 2; // Filepath to a DDS topology file + string plugin = 3; // Name of the resource plugin registered in odc-server + string resources = 4; // Resource description } // Update request From 0cc8501f1f282f30e6b0b23cf5930c392f8d5607 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Mar 2021 14:53:21 +0100 Subject: [PATCH 0785/2352] [core] Limit InfoLogger message size to 1024 Bytes --- common/logger/infologger/directhook.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 31dcf8b14..ca5e12e25 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -40,6 +40,8 @@ import ( "github.com/sirupsen/logrus" ) +const INFOLOGGER_MAX_MESSAGE_SIZE = 1024 + var ( hostname string pid string @@ -251,7 +253,14 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { message.WriteString(v) } - payload["message"] = message.String() + messageStr := message.String() + + // IL won't be happy if we send a message longer than 1024 bytes + if len(messageStr) > INFOLOGGER_MAX_MESSAGE_SIZE { + messageStr = messageStr[:INFOLOGGER_MAX_MESSAGE_SIZE] + } + + payload["message"] = messageStr if h.il != nil { err := h.il.Send(payload) From 81ed506e48806ca58001ba6595bc405c23a8209f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Mar 2021 15:25:22 +0100 Subject: [PATCH 0786/2352] [core] Subworkflow template expression resolution in repos package --- core/repos/repo.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/repos/repo.go b/core/repos/repo.go index ef6ca750d..1aca7e223 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -133,6 +133,21 @@ func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdenti return } +func (r *Repo) ResolveSubworkflowTemplateIdentifier(workflowTemplateExpr string) string { + expr := workflowTemplateExpr + if !strings.Contains(expr, "/") { + expr = r.HostingSite + "/" + r.User + "/" + r.RepoName + "/workflows/" + expr + } + + if !strings.Contains(expr, "@") { + expr += "@" + r.Revision + } else { + expr += "@" + r.Hash + } + + return expr +} + func (r *Repo) checkoutRevision(revision string) error { if revision == "" { revision = r.Revision From 5dd3a78785cc9f52cddae97348ed52041831baac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Mar 2021 15:38:01 +0100 Subject: [PATCH 0787/2352] [core] Subworkflow include implementation (includeRole) This also fixes an unreported issue that would have prevented callRoles from being wrapped in iteratorRoles. --- core/workflow/aggregator.go | 12 +- core/workflow/aggregatorrole.go | 4 +- core/workflow/callrole.go | 2 +- core/workflow/calltemplate.go | 89 +++++++++++++++ core/workflow/includerole.go | 183 +++++++++++++++++++++++++++++++ core/workflow/includetemplate.go | 89 +++++++++++++++ core/workflow/iteratorrole.go | 16 ++- core/workflow/load.go | 43 +++++--- core/workflow/role.go | 2 +- core/workflow/taskrole.go | 2 +- 10 files changed, 412 insertions(+), 30 deletions(-) create mode 100644 core/workflow/calltemplate.go create mode 100644 core/workflow/includerole.go create mode 100644 core/workflow/includetemplate.go diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 81bd5612e..a83151a14 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -52,12 +52,14 @@ type _unionTypeProbe struct { Task *struct{} Roles []interface{} Call *struct{} + Include *string } type _roleUnion struct{ *iteratorRole *aggregatorRole *taskRole *callRole + *includeRole } func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { @@ -70,12 +72,14 @@ func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (union switch { case _probe.For != nil: unionErr = unmarshal(&union.iteratorRole) - case _probe.Roles != nil && _probe.Task == nil && _probe.Call == nil: + case _probe.Roles != nil && _probe.Task == nil && _probe.Call == nil && _probe.Include == nil: unionErr = unmarshal(&union.aggregatorRole) - case _probe.Task != nil && _probe.Roles == nil && _probe.Call == nil: + case _probe.Task != nil && _probe.Roles == nil && _probe.Call == nil && _probe.Include == nil: unionErr = unmarshal(&union.taskRole) - case _probe.Call != nil && _probe.Task == nil && _probe.Roles == nil: + case _probe.Call != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Include == nil: unionErr = unmarshal(&union.callRole) + case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: + unionErr = unmarshal(&union.includeRole) default: unionErr = errors.New("cannot unmarshal invalid role to union") } @@ -106,6 +110,8 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error roles[i] = v.taskRole case v.callRole != nil: roles[i] = v.callRole + case v.includeRole != nil: + roles[i] = v.includeRole default: err = errors.New("invalid child role at index " + strconv.Itoa(i)) return diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 769b52f00..7d429c77a 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -99,7 +99,7 @@ func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { +func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { if r == nil { return errors.New("role tree error when processing templates") } @@ -138,7 +138,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) // Process templates for child roles for _, role := range r.Roles { role.setParent(r) - err = role.ProcessTemplates(workflowRepo) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) if err != nil { return } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index b57f4610b..f529fd66a 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -130,7 +130,7 @@ func (t *callRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *callRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { +func (t *callRole) ProcessTemplates(_ *repos.Repo, _ LoadSubworkflowFunc) (err error) { if t == nil { return errors.New("role tree error when processing templates") } diff --git a/core/workflow/calltemplate.go b/core/workflow/calltemplate.go new file mode 100644 index 000000000..24cb03fc7 --- /dev/null +++ b/core/workflow/calltemplate.go @@ -0,0 +1,89 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "text/template" + "errors" + "github.com/jinzhu/copier" +) + +type callTemplate struct { + callRole + stringTemplates map[string]template.Template `yaml:"-,omitempty"` +} + +func (tt *callTemplate) copy() copyable { + rCopy := callTemplate{ + callRole: *tt.callRole.copy().(*callRole), + } + _ = copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) + return &rCopy +} + +func (tt *callTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _callTemplate callTemplate + aux := _callTemplate{} + err = unmarshal(&aux) + if err != nil { + return + } + aux.stringTemplates = make(map[string]template.Template) + + /* template cache builder + tmpl := template.New(aux.GetPath()) + + // Fields to parse as templates: + for _, str := range []string{ + aux.LoadTaskClass, + aux.Name, + } { + var tempTmpl *template.Template + tempTmpl, err = tmpl.Parse(str) + if err != nil { + return + } + aux.stringTemplates[str] = *tempTmpl + } + */ + + *tt = callTemplate(aux) + return +} + +func (tt *callTemplate) generateRole(localVars map[string]string) (c Role, err error) { + if tt == nil { + return nil, errors.New("cannot generate from nil sender") + } + + // See note for aggregatorTemplate.generateRole + tr := *tt.callRole.copy().(*callRole) + for k, v := range localVars { + tr.Locals[k] = v + } + + c = &tr + return +} \ No newline at end of file diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go new file mode 100644 index 000000000..861523c9d --- /dev/null +++ b/core/workflow/includerole.go @@ -0,0 +1,183 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "errors" + "strings" + texttemplate "text/template" + + "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" +) + +// An includeRole is a delayed aggregatorRole +// It takes an `include` entry, which is then expanded into a full aggregatorRole +// during the ProcessTemplates function. +type includeRole struct { + aggregatorRole + + Include string `yaml:"include,omitempty"` +} + +func (r *includeRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + // NOTE: see NOTE in roleBase.UnmarshalYAML + + innerRoleBase := roleBase{} + err = unmarshal(&innerRoleBase) + if err != nil { + return + } + + type auxInclude struct{ + Include string `yaml:"include,omitempty"` + } + _auxInclude := auxInclude{} + err = unmarshal(&_auxInclude) + if err != nil { + return + } + + role := includeRole{ + aggregatorRole: aggregatorRole{ + roleBase: innerRoleBase, + aggregator: aggregator{}, + }, + Include: _auxInclude.Include, + } + + + *r = role + return +} + +func (r *includeRole) MarshalYAML() (interface{}, error) { + return nil, nil +} + +func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { + if r == nil { + return errors.New("role tree error when processing templates") + } + + templSequence := template.Sequence{ + template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), + template.STAGE1: template.WrapMapItems(r.Vars.Raw()), + template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), + template.STAGE3: template.Fields{ + template.WrapPointer(&r.Name), + template.WrapPointer(&r.Include), + }, + template.STAGE4: append(append( + WrapConstraints(r.Constraints), + r.wrapConnectFields()...), + template.WrapPointer(&r.Enabled)), + } + + // TODO: push cached templates here + err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) + if err != nil { + return + } + + // After template processing we write the Locals to Vars in order to make them available to children + for k, v := range r.Locals { + r.Vars.Set(k, v) + } + + r.Enabled = strings.TrimSpace(r.Enabled) + + // Common part done, include resolution starts here. + // An includeRole is essentially a baseRole + `include:` expression. We first need to resolve + // the expression to obtain a full subworkflow template identifier, i.e. a full repo/wft/branch + // combo. + // Once that's done we can load the subworkflow and obtain the root `aggregatorRole` plus a new + // repos.Repo definition. If a repo or branch is already provided in the subworkflow expression + // then the returned newWfRepo will reflect this, and any additionally nested includes will + // default to the repo of their direct parent. + var subWfRoot *aggregatorRole + var newWfRepo *repos.Repo + include := workflowRepo.ResolveSubworkflowTemplateIdentifier(r.Include) + subWfRoot, newWfRepo, err = loadSubworkflow(include, r) + if err != nil { + return err + } + + // By now the subworkflow is loaded and reparented to this includeRole. This reparenting is + // needed to ensure the correct gera.StringMap hierarchies, but now that we replace the + // composed aggregatorRole with the newly loaded one, we must also fix the reparenting and + // ensure the loaded name doesn't overwrite the original name of the includeRole. + parent := r.parent + name := r.Name + r.aggregatorRole = *subWfRoot // The previously composed aggregatorRole+roleBase are overwritten here + r.parent = parent + r.Name = name + + // Process templates for child roles + for _, role := range r.Roles { + role.setParent(r) + err = role.ProcessTemplates(newWfRepo, loadSubworkflow) + if err != nil { + return + } + } + + // If any child is not Enabled after template resolution, + // we filter it out of existence + enabledRoles := make([]Role, 0) + for _, role := range r.Roles { + if role.IsEnabled() { + enabledRoles = append(enabledRoles, role) + } + } + r.Roles = enabledRoles + + return +} + +func (r* includeRole) UpdateStatus(s task.Status) { + r.updateStatus(s) +} + +func (r* includeRole) UpdateState(s task.State) { + r.updateState(s) +} + +func (r *includeRole) copy() copyable { + rCopy := includeRole{ + aggregatorRole: *r.aggregatorRole.copy().(*aggregatorRole), + Include: r.Include, + } + rCopy.status = SafeStatus{status:rCopy.GetStatus()} + rCopy.state = SafeState{state:rCopy.GetState()} + return &rCopy +} diff --git a/core/workflow/includetemplate.go b/core/workflow/includetemplate.go new file mode 100644 index 000000000..55e644c98 --- /dev/null +++ b/core/workflow/includetemplate.go @@ -0,0 +1,89 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "text/template" + "errors" + "github.com/jinzhu/copier" +) + +type includeTemplate struct { + includeRole + stringTemplates map[string]template.Template `yaml:"-,omitempty"` +} + +func (tt *includeTemplate) copy() copyable { + rCopy := includeTemplate{ + includeRole: *tt.includeRole.copy().(*includeRole), + } + _ = copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) + return &rCopy +} + +func (tt *includeTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _includeTemplate includeTemplate + aux := _includeTemplate{} + err = unmarshal(&aux) + if err != nil { + return + } + aux.stringTemplates = make(map[string]template.Template) + + /* template cache builder + tmpl := template.New(aux.GetPath()) + + // Fields to parse as templates: + for _, str := range []string{ + aux.LoadTaskClass, + aux.Name, + } { + var tempTmpl *template.Template + tempTmpl, err = tmpl.Parse(str) + if err != nil { + return + } + aux.stringTemplates[str] = *tempTmpl + } + */ + + *tt = includeTemplate(aux) + return +} + +func (tt *includeTemplate) generateRole(localVars map[string]string) (c Role, err error) { + if tt == nil { + return nil, errors.New("cannot generate from nil sender") + } + + // See note for aggregatorTemplate.generateRole + tr := *tt.includeRole.copy().(*includeRole) + for k, v := range localVars { + tr.Locals[k] = v + } + + c = &tr + return +} \ No newline at end of file diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 7775087f0..c26d2c876 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -50,9 +50,9 @@ type roleTemplate interface { } func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - auxUnion := _unionTypeProbe{} + _probe := _unionTypeProbe{} role := iteratorRole{} - err = unmarshal(&auxUnion) + err = unmarshal(&_probe) if err != nil { return } @@ -98,10 +98,14 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err var template roleTemplate switch { - case auxUnion.Roles != nil && auxUnion.Task == nil: + case _probe.Roles != nil && _probe.Task == nil && _probe.Call == nil && _probe.Include == nil: template = &aggregatorTemplate{} - case auxUnion.Task != nil && auxUnion.Roles == nil: + case _probe.Task != nil && _probe.Roles == nil && _probe.Call == nil && _probe.Include == nil: template = &taskTemplate{} + case _probe.Call != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Include == nil: + template = &callTemplate{} + case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: + template = &includeTemplate{} default: err = errors.New("invalid template role in iterator") return @@ -144,7 +148,7 @@ func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { +func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { if i == nil { return errors.New("role tree error when processing templates") } @@ -156,7 +160,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { // Process templates for child roles for _, role := range i.Roles { - err = role.ProcessTemplates(workflowRepo) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) if err != nil { return } diff --git a/core/workflow/load.go b/core/workflow/load.go index acab68f96..6049286fb 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -39,32 +39,43 @@ import ( "gopkg.in/yaml.v3" ) +type LoadSubworkflowFunc func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo *repos.Repo, err error) + // FIXME: workflowPath should be of type configuration.Path, not string func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() - var resolvedWorkflowPath string - var workflowRepo *repos.Repo - resolvedWorkflowPath, workflowRepo, err = repoManager.GetWorkflow(workflowPath) //Will fail if repo unknown - if err != nil { - return - } + var loadSubworkflow LoadSubworkflowFunc = + func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo *repos.Repo, err error) { + var resolvedWorkflowPath string - var yamlDoc []byte - yamlDoc, err = ioutil.ReadFile(resolvedWorkflowPath) - if err != nil { + resolvedWorkflowPath, workflowRepo, err = repoManager.GetWorkflow(workflowPathExpr) //Will fail if repo unknown + if err != nil { + return + } + + var yamlDoc []byte + yamlDoc, err = ioutil.ReadFile(resolvedWorkflowPath) + if err != nil { + return + } + + root = new(aggregatorRole) + root.parent = parent + err = yaml.Unmarshal(yamlDoc, root) + if err != nil { + return nil, nil, err + } + if parent != nil { + root.setParent(parent) + } return } - root := new(aggregatorRole) - root.parent = parent - err = yaml.Unmarshal(yamlDoc, root) + root, workflowRepo, err := loadSubworkflow(workflowPath, parent) if err != nil { return nil, err } - if parent != nil { - root.setParent(parent) - } workflow = root @@ -76,7 +87,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user defer f.Close() } - err = workflow.ProcessTemplates(workflowRepo) + err = workflow.ProcessTemplates(workflowRepo, loadSubworkflow) if err != nil { log.WithError(err).Warn("workflow loading failed: template processing error") return diff --git a/core/workflow/role.go b/core/workflow/role.go index 2eda8a118..62e6d21f1 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -55,7 +55,7 @@ type Role interface { GenerateTaskDescriptors() task.Descriptors getConstraints() constraint.Constraints setParent(role Updatable) - ProcessTemplates(workflowRepo *repos.Repo) error + ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) error GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 7241d470d..3aadc89de 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -126,7 +126,7 @@ func (t *taskRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo) (err error) { +func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo, _ LoadSubworkflowFunc) (err error) { if t == nil { return errors.New("role tree error when processing templates") } From 49d585ba5ece447d71a5736c40f3bb47646cfde4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Mar 2021 15:48:26 +0100 Subject: [PATCH 0788/2352] [core] Fix typo in subworkflo template identifier resolution --- core/repos/repo.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 1aca7e223..4fd4ee84d 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -140,8 +140,6 @@ func (r *Repo) ResolveSubworkflowTemplateIdentifier(workflowTemplateExpr string) } if !strings.Contains(expr, "@") { - expr += "@" + r.Revision - } else { expr += "@" + r.Hash } From aab5b8f00a598456365856c51e9c369e5807d3bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Mar 2021 11:37:16 +0100 Subject: [PATCH 0789/2352] [executor] Drop stdout messages if no piping selected --- executor/executable/controllabletask.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 2766d1de4..13839b5ac 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "io" + "io/ioutil" "reflect" "strings" "syscall" @@ -146,6 +147,13 @@ func (t *ControllableTask) Launch() error { WithField("task", t.ti.Name). WriterLevel(logrus.WarnLevel), stderrIn) }() + default: + go func() { + _, errStdout = io.Copy(ioutil.Discard, stdoutIn) + }() + go func() { + _, errStderr = io.Copy(ioutil.Discard, stderrIn) + }() } log.WithFields(logrus.Fields{ From 8c35e14e3ddf8ffe4fee363750136962f33ce05b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Mar 2021 12:41:15 +0100 Subject: [PATCH 0790/2352] [core] Allow templating of FairMQ channel rateLogging --- core/task/channel/channel.go | 7 +--- core/task/channel/inbound.go | 4 +- core/task/channel/outbound.go | 4 +- core/task/task.go | 69 ++++++++++++++++++----------------- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index db2fdac74..5670c2151 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -40,7 +40,7 @@ type Channel struct { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize"` RcvBufSize int `yaml:"rcvBufSize"` - RateLogging int `yaml:"rateLogging"` + RateLogging string `yaml:"rateLogging"`//actually an int but we allow templating Transport TransportType `yaml:"transport"` //default: default } @@ -82,10 +82,7 @@ func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { if err != nil { return } - c.RateLogging, err = strconv.Atoi(aux.RateLogging) - if err != nil { - return - } + c.RateLogging = aux.RateLogging c.Transport = aux.Transport return diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index a17e2465b..c355d9f36 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -67,7 +67,7 @@ func (inbound Inbound) MarshalYAML() (interface{}, error) { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize,omitempty"` RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging int `yaml:"rateLogging,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` Transport TransportType `yaml:"transport"` Addressing AddressFormat `yaml:"addressing"` } @@ -114,7 +114,7 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm chanProps := controlcommands.PropertyMap{ "address": address, "method": "bind", - "rateLogging": strconv.Itoa(inbound.RateLogging), + "rateLogging": inbound.RateLogging, "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded "sndBufSize": strconv.Itoa(inbound.SndBufSize), diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index aa7f214d3..b42732d1f 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -65,7 +65,7 @@ func (outbound Outbound) MarshalYAML() (interface{}, error) { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize,omitempty"` RcvBufSize int `yaml:"rcvBufSize,omitempty"` - RateLogging int `yaml:"rateLogging,omitempty"` + RateLogging string `yaml:"rateLogging,omitempty"` Transport TransportType `yaml:"transport"` Target string `yaml:"target"` } @@ -141,7 +141,7 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( chanProps := controlcommands.PropertyMap { "address": address, "method": "connect", - "rateLogging": strconv.Itoa(outbound.RateLogging), + "rateLogging": outbound.RateLogging, "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded "sndBufSize": strconv.Itoa(outbound.SndBufSize), diff --git a/core/task/task.go b/core/task/task.go index e5b9dcd00..6d1e49310 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -469,6 +469,41 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap[k] = v } + // For FAIRMQ tasks, we append FairMQ channel configuration + if class.Control.Mode == controlmode.FAIRMQ || + class.Control.Mode == controlmode.DIRECT { + for _, inbCh := range channel.MergeInbound(t.GetParent().CollectInboundChannels(), class.Bind) { + endpoint, ok := t.localBindMap[inbCh.Name] + if !ok { + log.WithFields(logrus.Fields{ + "channelName": inbCh.Name, + "taskName": t.name, + }). + Error("endpoint not allocated for inbound channel") + continue + } + + // We get the FairMQ-formatted propertyMap from the inbound channel spec + chanProps := inbCh.ToFMQMap(endpoint) + + // And we copy it into the task's propertyMap + for k, v := range chanProps { + propMap[k] = v + } + } + for _, outboundCh := range channel.MergeOutbound(t.GetParent().CollectOutboundChannels(), class.Connect) { + // We get the FairMQ-formatted propertyMap from the outbound channel spec + chanProps := outboundCh.ToFMQMap(bindMap) + + // And if valid, we copy it into the task's propertyMap + if len(chanProps) > 0 { + for k, v := range chanProps { + propMap[k] = v + } + } + } + } // end append FairMQ configuration + objStack := make(map[string]interface{}) objStack["ToPtree"] = template.MakeToPtreeFunc(varStack, propMap) @@ -503,40 +538,6 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand } } - // For FAIRMQ tasks, we append FairMQ channel configuration - if class.Control.Mode == controlmode.FAIRMQ || - class.Control.Mode == controlmode.DIRECT { - for _, inbCh := range channel.MergeInbound(t.GetParent().CollectInboundChannels(), class.Bind) { - endpoint, ok := t.localBindMap[inbCh.Name] - if !ok { - log.WithFields(logrus.Fields{ - "channelName": inbCh.Name, - "taskName": t.name, - }). - Error("endpoint not allocated for inbound channel") - continue - } - - // We get the FairMQ-formatted propertyMap from the inbound channel spec - chanProps := inbCh.ToFMQMap(endpoint) - - // And we copy it into the task's propertyMap - for k, v := range chanProps { - propMap[k] = v - } - } - for _, outboundCh := range channel.MergeOutbound(t.GetParent().CollectOutboundChannels(), class.Connect) { - // We get the FairMQ-formatted propertyMap from the outbound channel spec - chanProps := outboundCh.ToFMQMap(bindMap) - - // And if valid, we copy it into the task's propertyMap - if len(chanProps) > 0 { - for k, v := range chanProps { - propMap[k] = v - } - } - } - } } return propMap } From 6900eb636c8721bc0d615b648f3afbfe65a9ebaa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Mar 2021 16:25:07 +0100 Subject: [PATCH 0791/2352] [build] Bump to v0.21.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0cdefe04a..76c3d408d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 21 -VERSION_PATCH := 2 +VERSION_PATCH := 80 From 5cb65b09694e1e144bae6f216285324908c904bb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Mar 2021 17:19:07 +0100 Subject: [PATCH 0792/2352] [core] Update DCS client to latest protofile --- core/integration/dcs/client.go | 1 + core/integration/dcs/plugin.go | 67 ++++-- core/integration/dcs/protos/dcs.pb.go | 52 ++--- core/integration/dcs/protos/dcs.proto | 12 +- core/integration/dcs/protos/dcs_grpc.pb.go | 240 ++++++++++++++------- 5 files changed, 239 insertions(+), 133 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 0f3d30e4e..506ac6266 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -66,6 +66,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } + log.Debug("DCS client connected") client := &RpcClient { ConfiguratorClient: dcspb.NewConfiguratorClient(conn), diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 30dcd7ee3..3fb95043b 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -149,19 +149,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } } - det := dcspb.Detector_NULL_DETECTOR - detector, ok := varStack["detector"] - if ok { - // a detector is defined in the var stack - intDet, ok := dcspb.Detector_value[detector] - if ok { - // detector string correctly matched to DCS enum - det = dcspb.Detector(intDet) - } + dcsDetectorsParam, ok := varStack["dcs_detectors"] + if !ok { + log.Debug("empty DCS detectors list provided") + dcsDetectorsParam = "[\"NULL_DETECTOR\"]" + } + + detectors, err := p.parseDetectors(dcsDetectorsParam) + if err != nil { + return } in := dcspb.SorRequest{ - Detector: det, + Detector: detectors, RunType: rt, RunNumber: int32(runNumber64), Parameters: argMap, @@ -187,7 +187,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } - stack["EndOfRun"] = func() (out string) { // must formally return string even when we return nothing + stack["EndOfRun"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] @@ -211,19 +211,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for DCS EOR") } - det := dcspb.Detector_NULL_DETECTOR - detector, ok := varStack["detector"] - if ok { - // a detector is defined in the var stack - intDet, ok := dcspb.Detector_value[detector] - if ok { - // detector string correctly matched to DCS enum - det = dcspb.Detector(intDet) - } + dcsDetectorsParam, ok := varStack["dcs_detectors"] + if !ok { + log.Debug("empty DCS detectors list provided") + dcsDetectorsParam = "[\"NULL_DETECTOR\"]" + } + + detectors, err := p.parseDetectors(dcsDetectorsParam) + if err != nil { + return } in := dcspb.EorRequest{ - Detector: det, + Detector: detectors, RunNumber: int32(runNumber64), Parameters: argMap, } @@ -252,6 +252,31 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } +func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Detector, err error) { + detectorsSlice := make([]string, 0) + bytes := []byte(dcsDetectorsParam) + err = json.Unmarshal(bytes, &detectorsSlice) + if err != nil { + log.WithError(err).Error("error processing DCS detectors list") + return + } + + // Now we process the stringSlice into a slice of detector enum values + detectors = make([]dcspb.Detector, len(detectorsSlice)) + for i, det := range detectorsSlice { + intDet, ok := dcspb.Detector_value[det] + if !ok { + err = fmt.Errorf("invalid DCS detector %s", det) + log.WithError(err).Error("bad DCS detector entry") + return + } + + // detector string correctly matched to DCS enum + detectors[i] = dcspb.Detector(intDet) + } + return +} + func (p *Plugin) Destroy() error { return p.dcsClient.Close() } diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 9e833eae2..0e44eaede 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/dcs.proto package dcspb @@ -487,9 +487,9 @@ type SorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command - RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` // should be uint32 + Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // this can be a map or something strongly typed as we figure it out } @@ -526,11 +526,11 @@ func (*SorRequest) Descriptor() ([]byte, []int) { return file_protos_dcs_proto_rawDescGZIP(), []int{2} } -func (x *SorRequest) GetDetector() Detector { +func (x *SorRequest) GetDetector() []Detector { if x != nil { return x.Detector } - return Detector_NULL_DETECTOR + return nil } func (x *SorRequest) GetRunType() RunType { @@ -559,7 +559,7 @@ type EorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command + Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // does EOR need other params? } @@ -596,11 +596,11 @@ func (*EorRequest) Descriptor() ([]byte, []int) { return file_protos_dcs_proto_rawDescGZIP(), []int{3} } -func (x *EorRequest) GetDetector() Detector { +func (x *EorRequest) GetDetector() []Detector { if x != nil { return x.Detector } - return Detector_NULL_DETECTOR + return nil } func (x *EorRequest) GetRunNumber() int32 { @@ -810,7 +810,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xfd, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, @@ -826,7 +826,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd5, 0x01, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, @@ -894,24 +894,24 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x4d, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x4d, - 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x32, 0xde, 0x01, 0x0a, + 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x32, 0xd8, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x31, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x2d, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, - 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, - 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, - 0x63, 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, + 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x35, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, + 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x21, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x0c, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -962,8 +962,8 @@ var file_protos_dcs_proto_depIdxs = []int32{ 8, // 14: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest 9, // 15: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest 6, // 16: dcs.Configurator.Subscribe:output_type -> dcs.Event - 11, // 17: dcs.Configurator.StartOfRun:output_type -> dcs.StatusReply - 11, // 18: dcs.Configurator.EndOfRun:output_type -> dcs.StatusReply + 6, // 17: dcs.Configurator.StartOfRun:output_type -> dcs.Event + 6, // 18: dcs.Configurator.EndOfRun:output_type -> dcs.Event 11, // 19: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply 16, // [16:20] is the sub-list for method output_type 12, // [12:16] is the sub-list for method input_type diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index cb652937a..1a13fd441 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -32,9 +32,9 @@ option go_package = "protos;dcspb"; service Configurator { rpc Subscribe (SubscriptionRequest) returns (stream Event) {} - rpc StartOfRun (SorRequest) returns (StatusReply) {} - rpc EndOfRun (EorRequest) returns (StatusReply) {} - rpc GetStatus (StatusRequest) returns (StatusReply) {} + rpc StartOfRun (SorRequest) returns (stream Event) {} + rpc EndOfRun (EorRequest) returns (stream Event) {} + rpc GetStatus (StatusRequest) returns (stream StatusReply) {} } ////////////////////////////////////////////////////// @@ -77,15 +77,15 @@ message Event { //-- I've added runNumber, as it should be a requested field message SorRequest { - Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command + repeated Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command RunType runType = 2; - int32 runNumber = 3; // should be uint32 + int32 runNumber = 3; //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters map parameters = 4; // this can be a map or something strongly typed as we figure it out } message EorRequest { - Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command + repeated Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command int32 runNumber = 2; map parameters = 3; // does EOR need other params? } diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index ef6b29779..c173927c6 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -18,9 +18,9 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ConfiguratorClient interface { Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) - StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (*StatusReply, error) - EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (*StatusReply, error) - GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) + StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) + EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) + GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) } type configuratorClient struct { @@ -63,31 +63,100 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { return m, nil } -func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (*StatusReply, error) { - out := new(StatusReply) - err := c.cc.Invoke(ctx, "/dcs.Configurator/StartOfRun", in, out, opts...) +func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } - return out, nil + x := &configuratorStartOfRunClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Configurator_StartOfRunClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type configuratorStartOfRunClient struct { + grpc.ClientStream +} + +func (x *configuratorStartOfRunClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } -func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (*StatusReply, error) { - out := new(StatusReply) - err := c.cc.Invoke(ctx, "/dcs.Configurator/EndOfRun", in, out, opts...) +func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } - return out, nil + x := &configuratorEndOfRunClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil } -func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { - out := new(StatusReply) - err := c.cc.Invoke(ctx, "/dcs.Configurator/GetStatus", in, out, opts...) +type Configurator_EndOfRunClient interface { + Recv() (*Event, error) + grpc.ClientStream +} + +type configuratorEndOfRunClient struct { + grpc.ClientStream +} + +func (x *configuratorEndOfRunClient) Recv() (*Event, error) { + m := new(Event) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } - return out, nil + x := &configuratorGetStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Configurator_GetStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type configuratorGetStatusClient struct { + grpc.ClientStream +} + +func (x *configuratorGetStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil } // ConfiguratorServer is the server API for Configurator service. @@ -95,9 +164,9 @@ func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, o // for forward compatibility type ConfiguratorServer interface { Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error - StartOfRun(context.Context, *SorRequest) (*StatusReply, error) - EndOfRun(context.Context, *EorRequest) (*StatusReply, error) - GetStatus(context.Context, *StatusRequest) (*StatusReply, error) + StartOfRun(*SorRequest, Configurator_StartOfRunServer) error + EndOfRun(*EorRequest, Configurator_EndOfRunServer) error + GetStatus(*StatusRequest, Configurator_GetStatusServer) error } // UnimplementedConfiguratorServer should be embedded to have forward compatible implementations. @@ -107,14 +176,14 @@ type UnimplementedConfiguratorServer struct { func (UnimplementedConfiguratorServer) Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error { return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } -func (UnimplementedConfiguratorServer) StartOfRun(context.Context, *SorRequest) (*StatusReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method StartOfRun not implemented") +func (UnimplementedConfiguratorServer) StartOfRun(*SorRequest, Configurator_StartOfRunServer) error { + return status.Errorf(codes.Unimplemented, "method StartOfRun not implemented") } -func (UnimplementedConfiguratorServer) EndOfRun(context.Context, *EorRequest) (*StatusReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method EndOfRun not implemented") +func (UnimplementedConfiguratorServer) EndOfRun(*EorRequest, Configurator_EndOfRunServer) error { + return status.Errorf(codes.Unimplemented, "method EndOfRun not implemented") } -func (UnimplementedConfiguratorServer) GetStatus(context.Context, *StatusRequest) (*StatusReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented") +func (UnimplementedConfiguratorServer) GetStatus(*StatusRequest, Configurator_GetStatusServer) error { + return status.Errorf(codes.Unimplemented, "method GetStatus not implemented") } // UnsafeConfiguratorServer may be embedded to opt out of forward compatibility for this service. @@ -149,81 +218,92 @@ func (x *configuratorSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -func _Configurator_StartOfRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConfiguratorServer).StartOfRun(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/dcs.Configurator/StartOfRun", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConfiguratorServer).StartOfRun(ctx, req.(*SorRequest)) +func _Configurator_StartOfRun_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(SorRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ConfiguratorServer).StartOfRun(m, &configuratorStartOfRunServer{stream}) } -func _Configurator_EndOfRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(EorRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConfiguratorServer).EndOfRun(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/dcs.Configurator/EndOfRun", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConfiguratorServer).EndOfRun(ctx, req.(*EorRequest)) - } - return interceptor(ctx, in, info, handler) +type Configurator_StartOfRunServer interface { + Send(*Event) error + grpc.ServerStream } -func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StatusRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ConfiguratorServer).GetStatus(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/dcs.Configurator/GetStatus", +type configuratorStartOfRunServer struct { + grpc.ServerStream +} + +func (x *configuratorStartOfRunServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +func _Configurator_EndOfRun_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(EorRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ConfiguratorServer).GetStatus(ctx, req.(*StatusRequest)) + return srv.(ConfiguratorServer).EndOfRun(m, &configuratorEndOfRunServer{stream}) +} + +type Configurator_EndOfRunServer interface { + Send(*Event) error + grpc.ServerStream +} + +type configuratorEndOfRunServer struct { + grpc.ServerStream +} + +func (x *configuratorEndOfRunServer) Send(m *Event) error { + return x.ServerStream.SendMsg(m) +} + +func _Configurator_GetStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err } - return interceptor(ctx, in, info, handler) + return srv.(ConfiguratorServer).GetStatus(m, &configuratorGetStatusServer{stream}) +} + +type Configurator_GetStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream +} + +type configuratorGetStatusServer struct { + grpc.ServerStream +} + +func (x *configuratorGetStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) } var _Configurator_serviceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), - Methods: []grpc.MethodDesc{ + Methods: []grpc.MethodDesc{}, + Streams: []grpc.StreamDesc{ { - MethodName: "StartOfRun", - Handler: _Configurator_StartOfRun_Handler, + StreamName: "Subscribe", + Handler: _Configurator_Subscribe_Handler, + ServerStreams: true, }, { - MethodName: "EndOfRun", - Handler: _Configurator_EndOfRun_Handler, + StreamName: "StartOfRun", + Handler: _Configurator_StartOfRun_Handler, + ServerStreams: true, }, { - MethodName: "GetStatus", - Handler: _Configurator_GetStatus_Handler, + StreamName: "EndOfRun", + Handler: _Configurator_EndOfRun_Handler, + ServerStreams: true, }, - }, - Streams: []grpc.StreamDesc{ { - StreamName: "Subscribe", - Handler: _Configurator_Subscribe_Handler, + StreamName: "GetStatus", + Handler: _Configurator_GetStatus_Handler, ServerStreams: true, }, }, From c895c24399f1d7cd1b1157a8654c49e7f2747a36 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 29 Mar 2021 10:33:26 +0200 Subject: [PATCH 0793/2352] [core] Ensure a disabled include isn't processed --- core/workflow/includerole.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 861523c9d..0703618b9 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -116,6 +116,15 @@ func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow r.Enabled = strings.TrimSpace(r.Enabled) + if !r.IsEnabled() { + // Normally it's the parent that checks whether a child is enabled after that child's + // ProcessTemplates is done, and this is true for the current role as well, but if + // at this point we already know that the current role is disabled (and will + // therefore be excluded by its parent), we don't try to resolve the workflow + // inclusion because there's no reason to do so anyway. + return nil + } + // Common part done, include resolution starts here. // An includeRole is essentially a baseRole + `include:` expression. We first need to resolve // the expression to obtain a full subworkflow template identifier, i.e. a full repo/wft/branch From d3a76fcf2b0208065e1244c7e9d41305577787e5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Mar 2021 12:00:38 +0200 Subject: [PATCH 0794/2352] [coconut] Fix typo --- coconut/control/control.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index cbf27c11f..f4b5c0983 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -862,7 +862,7 @@ func RemoveRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, } newDefaultRepo := response.GetNewDefaultRepo() - fmt.Fprintln(o, "Repository removed succsefully.") + fmt.Fprintln(o, "Repository removed successfully.") if newDefaultRepo != "" { fmt.Fprintln(o, "New default repo is: " + newDefaultRepo) } From dafa3a4a5b23bad017c72b68d6fa3cdbf6bb75d5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Mar 2021 12:00:52 +0200 Subject: [PATCH 0795/2352] [core] Ensure the included role defaults/vars are reprocessed --- core/workflow/includerole.go | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 0703618b9..33943ee8b 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -151,26 +151,8 @@ func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow r.parent = parent r.Name = name - // Process templates for child roles - for _, role := range r.Roles { - role.setParent(r) - err = role.ProcessTemplates(newWfRepo, loadSubworkflow) - if err != nil { - return - } - } - - // If any child is not Enabled after template resolution, - // we filter it out of existence - enabledRoles := make([]Role, 0) - for _, role := range r.Roles { - if role.IsEnabled() { - enabledRoles = append(enabledRoles, role) - } - } - r.Roles = enabledRoles + return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) - return } func (r* includeRole) UpdateStatus(s task.Status) { From ca6e1f9fadc55c5c56260a8c7cfe77dba5ae673a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Mar 2021 20:11:06 +0100 Subject: [PATCH 0796/2352] [apricot][core] GetDetectorForHost in Apricot + template system --- apricot/local/service.go | 20 + apricot/protos/apricot.pb.go | 556 +++++++++++------- apricot/protos/apricot.proto | 9 + apricot/protos/apricot_grpc.pb.go | 36 ++ apricot/remote/server.go | 16 + apricot/remote/service.go | 13 + coconut/protos/o2control.pb.go | 2 +- configuration/service.go | 2 + configuration/template/fields.go | 7 +- configuration/template/loader.go | 4 +- configuration/template/stack.go | 10 +- core/integration/ddsched/protos/ddsched.pb.go | 2 +- core/integration/odc/protos/odc.pb.go | 2 +- core/protos/o2control.pb.go | 2 +- executor/protos/occ.pb.go | 2 +- odcshim/odcprotos/odc.pb.go | 2 +- odcshim/protos/occ.pb.go | 2 +- 17 files changed, 462 insertions(+), 225 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 21cce149d..1d56a1d51 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -251,6 +251,26 @@ func (s *Service) RawGetRecursive(path string) (string, error) { return string(cfgBytes[:]), nil } +func (s *Service) GetDetectorForHost(hostname string) (string, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "detectors")) + if err != nil { + return "", err + } + for _, key := range keys { + splitKey := strings.Split(key, "/") + if len(splitKey) == 3 { + if splitKey[2] == hostname { + return splitKey[0], nil + } + } + } + return "", fmt.Errorf("detector not found for host %s", hostname) + } else { + return "", errors.New("runtime KV not supported with file backend") + } +} + func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { return cSrc.Get(filepath.Join(getConsulRuntimePrefix(), component, key)) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 7474e11f0..a277d1bd6 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/apricot.proto package apricotpb @@ -372,6 +372,100 @@ func (x *ComponentResponse) GetPayload() string { return "" } +type HostRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` +} + +func (x *HostRequest) Reset() { + *x = HostRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostRequest) ProtoMessage() {} + +func (x *HostRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostRequest.ProtoReflect.Descriptor instead. +func (*HostRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{4} +} + +func (x *HostRequest) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +type DetectorResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Payload string `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *DetectorResponse) Reset() { + *x = DetectorResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorResponse) ProtoMessage() {} + +func (x *DetectorResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorResponse.ProtoReflect.Descriptor instead. +func (*DetectorResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{5} +} + +func (x *DetectorResponse) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + type RunNumberResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -383,7 +477,7 @@ type RunNumberResponse struct { func (x *RunNumberResponse) Reset() { *x = RunNumberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[4] + mi := &file_protos_apricot_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -396,7 +490,7 @@ func (x *RunNumberResponse) String() string { func (*RunNumberResponse) ProtoMessage() {} func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[4] + mi := &file_protos_apricot_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -409,7 +503,7 @@ func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. func (*RunNumberResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{4} + return file_protos_apricot_proto_rawDescGZIP(), []int{6} } func (x *RunNumberResponse) GetRunNumber() uint32 { @@ -430,7 +524,7 @@ type StringMap struct { func (x *StringMap) Reset() { *x = StringMap{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -443,7 +537,7 @@ func (x *StringMap) String() string { func (*StringMap) ProtoMessage() {} func (x *StringMap) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -456,7 +550,7 @@ func (x *StringMap) ProtoReflect() protoreflect.Message { // Deprecated: Use StringMap.ProtoReflect.Descriptor instead. func (*StringMap) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{5} + return file_protos_apricot_proto_rawDescGZIP(), []int{7} } func (x *StringMap) GetStringMap() map[string]string { @@ -477,7 +571,7 @@ type RawGetRecursiveRequest struct { func (x *RawGetRecursiveRequest) Reset() { *x = RawGetRecursiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -490,7 +584,7 @@ func (x *RawGetRecursiveRequest) String() string { func (*RawGetRecursiveRequest) ProtoMessage() {} func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -503,7 +597,7 @@ func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{6} + return file_protos_apricot_proto_rawDescGZIP(), []int{8} } func (x *RawGetRecursiveRequest) GetRawPath() string { @@ -525,7 +619,7 @@ type GetRuntimeEntryRequest struct { func (x *GetRuntimeEntryRequest) Reset() { *x = GetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -538,7 +632,7 @@ func (x *GetRuntimeEntryRequest) String() string { func (*GetRuntimeEntryRequest) ProtoMessage() {} func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -551,7 +645,7 @@ func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*GetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{7} + return file_protos_apricot_proto_rawDescGZIP(), []int{9} } func (x *GetRuntimeEntryRequest) GetComponent() string { @@ -581,7 +675,7 @@ type SetRuntimeEntryRequest struct { func (x *SetRuntimeEntryRequest) Reset() { *x = SetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -594,7 +688,7 @@ func (x *SetRuntimeEntryRequest) String() string { func (*SetRuntimeEntryRequest) ProtoMessage() {} func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -607,7 +701,7 @@ func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*SetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{8} + return file_protos_apricot_proto_rawDescGZIP(), []int{10} } func (x *SetRuntimeEntryRequest) GetComponent() string { @@ -644,7 +738,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -657,7 +751,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -670,7 +764,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{9} + return file_protos_apricot_proto_rawDescGZIP(), []int{11} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -709,7 +803,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -722,7 +816,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -735,7 +829,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{10} + return file_protos_apricot_proto_rawDescGZIP(), []int{12} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -793,7 +887,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -806,7 +900,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -819,7 +913,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{11} + return file_protos_apricot_proto_rawDescGZIP(), []int{13} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -843,7 +937,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -856,7 +950,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -869,7 +963,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{12} + return file_protos_apricot_proto_rawDescGZIP(), []int{14} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -913,7 +1007,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -926,7 +1020,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -939,7 +1033,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{13} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1000,145 +1094,155 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x22, 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, - 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, - 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x01, - 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, - 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, - 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, - 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, - 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, - 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, - 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, - 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, - 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x07, 0x32, 0xf1, 0x06, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, - 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, + 0x29, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, + 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x23, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, + 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, + 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, + 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xba, 0x07, 0x0a, + 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, + 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, + 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1154,58 +1258,62 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty (*ComponentQuery)(nil), // 2: apricot.ComponentQuery (*ComponentRequest)(nil), // 3: apricot.ComponentRequest (*ComponentResponse)(nil), // 4: apricot.ComponentResponse - (*RunNumberResponse)(nil), // 5: apricot.RunNumberResponse - (*StringMap)(nil), // 6: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 7: apricot.RawGetRecursiveRequest - (*GetRuntimeEntryRequest)(nil), // 8: apricot.GetRuntimeEntryRequest - (*SetRuntimeEntryRequest)(nil), // 9: apricot.SetRuntimeEntryRequest - (*ComponentEntriesQuery)(nil), // 10: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 11: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 12: apricot.ComponentEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 13: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 14: apricot.ImportComponentConfigurationResponse - nil, // 15: apricot.ComponentRequest.VarStackEntry - nil, // 16: apricot.StringMap.StringMapEntry + (*HostRequest)(nil), // 5: apricot.HostRequest + (*DetectorResponse)(nil), // 6: apricot.DetectorResponse + (*RunNumberResponse)(nil), // 7: apricot.RunNumberResponse + (*StringMap)(nil), // 8: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 9: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 10: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 11: apricot.SetRuntimeEntryRequest + (*ComponentEntriesQuery)(nil), // 12: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 13: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 14: apricot.ComponentEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 15: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 16: apricot.ImportComponentConfigurationResponse + nil, // 17: apricot.ComponentRequest.VarStackEntry + nil, // 18: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 15, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 16, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 17, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 18, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 10, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty - 7, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 8, // 11: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 9, // 12: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 1, // 13: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 11, // 14: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 15: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 16: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 13, // 17: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 5, // 18: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 6, // 19: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 6, // 20: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 21: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 4, // 22: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 23: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 12, // 24: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 12, // 25: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 12, // 26: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 27: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 14, // 28: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 18, // [18:29] is the sub-list for method output_type - 7, // [7:18] is the sub-list for method input_type + 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest + 10, // 12: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 11, // 13: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 1, // 14: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 13, // 15: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 16: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 17: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 15, // 18: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 7, // 19: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 8, // 20: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 8, // 21: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 22: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 6, // 23: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 4, // 24: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 25: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 14, // 26: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 14, // 27: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 14, // 28: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 29: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 16, // 30: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 19, // [19:31] is the sub-list for method output_type + 7, // [7:19] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1266,7 +1374,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunNumberResponse); i { + switch v := v.(*HostRequest); i { case 0: return &v.state case 1: @@ -1278,7 +1386,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringMap); i { + switch v := v.(*DetectorResponse); i { case 0: return &v.state case 1: @@ -1290,7 +1398,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawGetRecursiveRequest); i { + switch v := v.(*RunNumberResponse); i { case 0: return &v.state case 1: @@ -1302,7 +1410,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuntimeEntryRequest); i { + switch v := v.(*StringMap); i { case 0: return &v.state case 1: @@ -1314,7 +1422,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRuntimeEntryRequest); i { + switch v := v.(*RawGetRecursiveRequest); i { case 0: return &v.state case 1: @@ -1326,7 +1434,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*GetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1338,7 +1446,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*SetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1350,7 +1458,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -1362,7 +1470,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -1374,6 +1482,30 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ComponentEntriesResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImportComponentConfigurationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state @@ -1390,7 +1522,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[12].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -1400,7 +1532,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 16, + NumMessages: 18, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 8c7273b29..50e30b85f 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -33,6 +33,7 @@ service Apricot { rpc GetDefaults(Empty) returns (StringMap) {} rpc GetVars(Empty) returns (StringMap) {} rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} + rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} @@ -79,6 +80,14 @@ message ComponentResponse { string payload = 1; } +message HostRequest { + string hostname = 1; +} + +message DetectorResponse { + string payload = 1; +} + message RunNumberResponse { uint32 runNumber = 1; } diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 982ef896b..e67e93530 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -21,6 +21,7 @@ type ApricotClient interface { GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -74,6 +75,15 @@ func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursive return out, nil } +func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) { + out := new(DetectorResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorForHost", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) @@ -145,6 +155,7 @@ type ApricotServer interface { GetDefaults(context.Context, *Empty) (*StringMap, error) GetVars(context.Context, *Empty) (*StringMap, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) + GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) @@ -170,6 +181,9 @@ func (UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") } +func (UnimplementedApricotServer) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDetectorForHost not implemented") +} func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") } @@ -275,6 +289,24 @@ func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetDetectorForHost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetDetectorForHost", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetDetectorForHost(ctx, req.(*HostRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetRuntimeEntryRequest) if err := dec(in); err != nil { @@ -421,6 +453,10 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "RawGetRecursive", Handler: _Apricot_RawGetRecursive_Handler, }, + { + MethodName: "GetDetectorForHost", + Handler: _Apricot_GetDetectorForHost_Handler, + }, { MethodName: "GetRuntimeEntry", Handler: _Apricot_GetRuntimeEntry_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 63f634fd1..64afaee60 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -133,6 +133,22 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() } +func (m *RpcServer) GetDetectorForHost(_ context.Context, request *apricotpb.HostRequest) (*apricotpb.DetectorResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + payload, err := m.service.GetDetectorForHost(request.GetHostname()) + if err != nil { + return nil, err + } + return &apricotpb.DetectorResponse{Payload: payload}, E_OK.Err() +} + func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 5ddf14d58..d469438cd 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -129,6 +129,19 @@ func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) return response.GetPayload(), nil } +func (c *RemoteService) GetDetectorForHost(hostname string) (payload string, err error) { + var response *apricotpb.DetectorResponse + request := &apricotpb.HostRequest{ + Hostname: hostname, + } + response, err = c.cli.GetDetectorForHost(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetPayload(), nil + +} + func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.GetRuntimeEntryRequest{ diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 518dd36c4..b60e26489 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/o2control.proto package pb diff --git a/configuration/service.go b/configuration/service.go index f6697217c..81c08c9c6 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -47,5 +47,7 @@ type Service interface { ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) + GetDetectorForHost(hostname string) (string, error) + RawGetRecursive(path string) (string, error) } diff --git a/configuration/template/fields.go b/configuration/template/fields.go index b9cec9536..5c569b791 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -48,12 +48,13 @@ var log = logger.New(logrus.StandardLogger(),"template") type Sequence map[Stage]Fields type BuildObjectStackFunc func(stage Stage) map[string]interface{} -type ComponentConfigurationService interface { +type ConfigurationService interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + GetDetectorForHost(hostname string) (string, error) } -func (sf Sequence) Execute(confSvc ComponentConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { +func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { for i := 0; i < int(_STAGE_MAX); i++ { currentStage := Stage(i) @@ -184,7 +185,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri return } -func (fields Fields) Execute(confSvc ComponentConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { +func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) strOpStack := MakeStrOperationFuncMap() for k, v := range varStack { diff --git a/configuration/template/loader.go b/configuration/template/loader.go index f1bc98d53..8a82aeca5 100644 --- a/configuration/template/loader.go +++ b/configuration/template/loader.go @@ -35,10 +35,10 @@ import ( // Implements pongo2.TemplateLoader to fetch included templates from Consul paths type ConsulTemplateLoader struct { basePath string - confSvc ComponentConfigurationService + confSvc ConfigurationService } -func NewConsulTemplateLoader(confSvc ComponentConfigurationService, basePath string) *ConsulTemplateLoader { +func NewConsulTemplateLoader(confSvc ConfigurationService, basePath string) *ConsulTemplateLoader { return &ConsulTemplateLoader{ basePath: basePath, confSvc: confSvc, diff --git a/configuration/template/stack.go b/configuration/template/stack.go index a9726b857..2b7d933b2 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -43,7 +43,7 @@ type GetConfigFunc func(string) string type ConfigAccessFuncs map[string]GetConfigFunc type ToPtreeFunc func(string, string) string -func MakeConfigAccessFuncs(confSvc ComponentConfigurationService, varStack map[string]string) ConfigAccessFuncs { +func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ "GetConfigLegacy": func(path string) string { defer utils.TimeTrack(time.Now(),"GetConfigLegacy", log.WithPrefix("template")) @@ -82,6 +82,14 @@ func MakeConfigAccessFuncs(confSvc ComponentConfigurationService, varStack map[s log.Warn(payload) return payload }, + "DetectorForHost": func(hostname string) string { + defer utils.TimeTrack(time.Now(),"DetectorForHost", log.WithPrefix("template")) + payload, err := confSvc.GetDetectorForHost(hostname) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + return payload + }, } } diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 8aad9cd3c..61e09d8f8 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 0d081bd92..fd65c3f39 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/odc.proto package odc diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 518dd36c4..b60e26489 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index fe7ada7fc..3671d95dd 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/occ.proto package pb diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 8c36ee234..40e3f5150 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: odcprotos/odc.proto package odc diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index fe7ada7fc..3671d95dd 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.12.4 +// protoc v3.15.6 // source: protos/occ.proto package pb From 2ef6063fdc31d883b0da1f6442816226818712e5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Mar 2021 14:18:04 +0200 Subject: [PATCH 0797/2352] [apricot] Correct GetDetectorForHost path handling --- apricot/local/service.go | 7 ++++--- core/workflow/includerole.go | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 1d56a1d51..19b67df14 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -258,10 +258,11 @@ func (s *Service) GetDetectorForHost(hostname string) (string, error) { return "", err } for _, key := range keys { + // key example: o2/hardware/detectors/TST/flps/some-hostname/ splitKey := strings.Split(key, "/") - if len(splitKey) == 3 { - if splitKey[2] == hostname { - return splitKey[0], nil + if len(splitKey) == 7 { + if splitKey[5] == hostname { + return splitKey[3], nil } } } diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 33943ee8b..cdaad37a8 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -152,7 +152,6 @@ func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow r.Name = name return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) - } func (r* includeRole) UpdateStatus(s task.Status) { From 952c612b1deb0c3af55fdb962ba7d4f1a8434631 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 14:01:11 +0200 Subject: [PATCH 0798/2352] [apricot] Implement GetCRUCardsForHost --- apricot/local/jsontypes.go | 36 +++ apricot/local/service.go | 23 ++ apricot/protos/apricot.pb.go | 265 +++++++++++------- apricot/protos/apricot.proto | 5 + apricot/protos/apricot_grpc.pb.go | 44 ++- apricot/remote/server.go | 16 ++ apricot/remote/service.go | 12 + coconut/protos/o2control_grpc.pb.go | 12 +- core/integration/dcs/protos/dcs_grpc.pb.go | 16 +- .../ddsched/protos/ddsched_grpc.pb.go | 8 +- core/integration/odc/protos/odc_grpc.pb.go | 8 +- core/protos/o2control_grpc.pb.go | 12 +- executor/protos/occ_grpc.pb.go | 12 +- odcshim/odcprotos/odc_grpc.pb.go | 8 +- odcshim/protos/occ_grpc.pb.go | 12 +- 15 files changed, 361 insertions(+), 128 deletions(-) create mode 100644 apricot/local/jsontypes.go diff --git a/apricot/local/jsontypes.go b/apricot/local/jsontypes.go new file mode 100644 index 000000000..9bbc0786c --- /dev/null +++ b/apricot/local/jsontypes.go @@ -0,0 +1,36 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019-2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package local + + +type Cards struct { + Type string `json:"type"` + PciAddress string `json:"pciAddress"` + Serial string `json:"serial"` + Endpoint string `json:"endpoint"` + Numa string `json:"numa"` + Firware string `json:"firmware"` + UserLogicVersion string `json:"userLogicVersion"` +} \ No newline at end of file diff --git a/apricot/local/service.go b/apricot/local/service.go index 19b67df14..134377edd 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -272,6 +272,29 @@ func (s *Service) GetDetectorForHost(hostname string) (string, error) { } } +func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + var cards map[string]Cards + var serials []string + cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) + if err != nil { + return nil, err + } + json.Unmarshal([]byte(cfgCards), &cards) + unique := make(map[string]bool) + for _, card := range cards { + if _, value := unique[card.Serial]; !value { + unique[card.Serial] = true + serials = append(serials, card.Serial) + } + } + fmt.Println(serials) + return serials, nil + } else { + return nil, errors.New("runtime KV not supported with file backend") + } +} + func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { return cSrc.Get(filepath.Join(getConsulRuntimePrefix(), component, key)) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index a277d1bd6..cea6083a8 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1057,6 +1057,53 @@ func (x *ImportComponentConfigurationResponse) GetNewTimestamp() int64 { return 0 } +type CRUCardsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Cards []string `protobuf:"bytes,1,rep,name=Cards,proto3" json:"Cards,omitempty"` +} + +func (x *CRUCardsResponse) Reset() { + *x = CRUCardsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CRUCardsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CRUCardsResponse) ProtoMessage() {} + +func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. +func (*CRUCardsResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{16} +} + +func (x *CRUCardsResponse) GetCards() []string { + if x != nil { + return x.Cards + } + return nil +} + var File_protos_apricot_proto protoreflect.FileDescriptor var file_protos_apricot_proto_rawDesc = []byte{ @@ -1171,78 +1218,85 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, - 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, - 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, - 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xba, 0x07, 0x0a, - 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, - 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x77, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, + 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, + 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, + 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x83, 0x08, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, + 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, - 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, + 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1258,7 +1312,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 19) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1277,14 +1331,15 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ComponentEntriesResponse)(nil), // 14: apricot.ComponentEntriesResponse (*ImportComponentConfigurationRequest)(nil), // 15: apricot.ImportComponentConfigurationRequest (*ImportComponentConfigurationResponse)(nil), // 16: apricot.ImportComponentConfigurationResponse - nil, // 17: apricot.ComponentRequest.VarStackEntry - nil, // 18: apricot.StringMap.StringMapEntry + (*CRUCardsResponse)(nil), // 17: apricot.CRUCardsResponse + nil, // 18: apricot.ComponentRequest.VarStackEntry + nil, // 19: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 17, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 18, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 18, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 19, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -1293,27 +1348,29 @@ var file_protos_apricot_proto_depIdxs = []int32{ 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest - 10, // 12: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 11, // 13: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 1, // 14: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 13, // 15: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 16: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 17: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 15, // 18: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 7, // 19: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 8, // 20: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 8, // 21: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 22: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 6, // 23: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 4, // 24: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 25: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 14, // 26: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 14, // 27: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 14, // 28: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 29: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 16, // 30: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 19, // [19:31] is the sub-list for method output_type - 7, // [7:19] is the sub-list for method input_type + 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest + 10, // 13: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 11, // 14: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 1, // 15: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 13, // 16: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 17: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 18: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 15, // 19: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 7, // 20: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 8, // 21: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 8, // 22: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 23: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 6, // 24: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 17, // 25: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 4, // 26: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 27: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 14, // 28: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 14, // 29: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 14, // 30: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 31: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 16, // 32: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 20, // [20:33] is the sub-list for method output_type + 7, // [7:20] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1517,6 +1574,18 @@ func file_protos_apricot_proto_init() { return nil } } + file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CRUCardsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_apricot_proto_msgTypes[2].OneofWrappers = []interface{}{ (*ComponentRequest_Path)(nil), @@ -1532,7 +1601,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 18, + NumMessages: 19, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 50e30b85f..ea0ec7093 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -34,6 +34,7 @@ service Apricot { rpc GetVars(Empty) returns (StringMap) {} rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} + rpc GetCRUCardsForHost(HostRequest) returns (CRUCardsResponse) {} rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} @@ -140,4 +141,8 @@ message ImportComponentConfigurationResponse { bool existingComponentUpdated = 1; bool existingEntryUpdated = 2; int64 newTimestamp = 3; +} + +message CRUCardsResponse { + repeated string Cards = 1; } \ No newline at end of file diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index e67e93530..edd2c67e4 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -22,6 +23,7 @@ type ApricotClient interface { GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) + GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -84,6 +86,15 @@ func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, return out, nil } +func (c *apricotClient) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) { + out := new(CRUCardsResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetCRUCardsForHost", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) @@ -156,6 +167,7 @@ type ApricotServer interface { GetVars(context.Context, *Empty) (*StringMap, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) + GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) @@ -184,6 +196,9 @@ func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecurs func (UnimplementedApricotServer) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDetectorForHost not implemented") } +func (UnimplementedApricotServer) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetCRUCardsForHost not implemented") +} func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") } @@ -214,7 +229,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&_Apricot_serviceDesc, srv) + s.RegisterService(&Apricot_ServiceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -307,6 +322,24 @@ func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Apricot_GetCRUCardsForHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HostRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetCRUCardsForHost(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetCRUCardsForHost", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetCRUCardsForHost(ctx, req.(*HostRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetRuntimeEntryRequest) if err := dec(in); err != nil { @@ -433,7 +466,10 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -var _Apricot_serviceDesc = grpc.ServiceDesc{ +// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Apricot_ServiceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ @@ -457,6 +493,10 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "GetDetectorForHost", Handler: _Apricot_GetDetectorForHost_Handler, }, + { + MethodName: "GetCRUCardsForHost", + Handler: _Apricot_GetCRUCardsForHost_Handler, + }, { MethodName: "GetRuntimeEntry", Handler: _Apricot_GetRuntimeEntry_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 64afaee60..9b169dc30 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -149,6 +149,22 @@ func (m *RpcServer) GetDetectorForHost(_ context.Context, request *apricotpb.Hos return &apricotpb.DetectorResponse{Payload: payload}, E_OK.Err() } +func (m *RpcServer) GetCRUCardsForHost(_ context.Context, request *apricotpb.HostRequest) (*apricotpb.CRUCardsResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + cards, err := m.service.GetCRUCardsForHost(request.GetHostname()) + if err != nil { + return nil, err + } + return &apricotpb.CRUCardsResponse{Cards: cards}, E_OK.Err() +} + func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index d469438cd..caa8c8c45 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -142,6 +142,18 @@ func (c *RemoteService) GetDetectorForHost(hostname string) (payload string, err } +func (c *RemoteService) GetCRUCardsForHost(hostname string) (cars []string, err error) { + var response *apricotpb.CRUCardsResponse + request := &apricotpb.HostRequest{ + Hostname: hostname, + } + response, err = c.cli.GetCRUCardsForHost(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetCards(), nil +} + func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.GetRuntimeEntryRequest{ diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index a87d3d87d..5af8aad73 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -416,7 +417,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -839,7 +840,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index c173927c6..d27cf4db1 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -32,7 +33,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -64,7 +65,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -96,7 +97,7 @@ func (x *configuratorStartOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -128,7 +129,7 @@ func (x *configuratorEndOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } @@ -194,7 +195,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&_Configurator_serviceDesc, srv) + s.RegisterService(&Configurator_ServiceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -281,7 +282,10 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { return x.ServerStream.SendMsg(m) } -var _Configurator_serviceDesc = grpc.ServiceDesc{ +// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Configurator_ServiceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{}, diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index bcf8b89a7..0e2419bfb 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -90,7 +91,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&_DataDistributionControl_serviceDesc, srv) + s.RegisterService(&DataDistributionControl_ServiceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -147,7 +148,10 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ +// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 045ec3bc8..1bcc9baa5 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -262,7 +263,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -499,7 +500,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 81fdcbe63..903ec7d16 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -414,7 +415,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -837,7 +838,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 66a3c8901..eafb7734d 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -154,7 +155,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -235,7 +236,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index b5f1e0452..7a2602472 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -264,7 +265,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -501,7 +502,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index 09d8d584b..cd6c2d3a2 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -152,7 +153,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -233,7 +234,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From 1dfaea3f234b82ac417c6fa0e4c1c45731e42e8f Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 15:06:23 +0200 Subject: [PATCH 0799/2352] [apricot] GetCRUCardsForHost return json string --- apricot/local/service.go | 13 ++++++++----- apricot/protos/apricot.pb.go | 8 ++++---- apricot/protos/apricot.proto | 2 +- apricot/remote/service.go | 4 ++-- 4 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 134377edd..469b2c63b 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -272,13 +272,13 @@ func (s *Service) GetDetectorForHost(hostname string) (string, error) { } } -func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { +func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var cards map[string]Cards var serials []string cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) if err != nil { - return nil, err + return "", err } json.Unmarshal([]byte(cfgCards), &cards) unique := make(map[string]bool) @@ -288,10 +288,13 @@ func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { serials = append(serials, card.Serial) } } - fmt.Println(serials) - return serials, nil + bytes, err := json.Marshal(serials) + if err != nil { + return "", err + } + return string(bytes), nil } else { - return nil, errors.New("runtime KV not supported with file backend") + return "", errors.New("runtime KV not supported with file backend") } } diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index cea6083a8..0d29051ed 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1062,7 +1062,7 @@ type CRUCardsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cards []string `protobuf:"bytes,1,rep,name=Cards,proto3" json:"Cards,omitempty"` + Cards string `protobuf:"bytes,1,opt,name=Cards,proto3" json:"Cards,omitempty"` } func (x *CRUCardsResponse) Reset() { @@ -1097,11 +1097,11 @@ func (*CRUCardsResponse) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{16} } -func (x *CRUCardsResponse) GetCards() []string { +func (x *CRUCardsResponse) GetCards() string { if x != nil { return x.Cards } - return nil + return "" } var File_protos_apricot_proto protoreflect.FileDescriptor @@ -1220,7 +1220,7 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x77, 0x0a, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index ea0ec7093..a024f81fc 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -144,5 +144,5 @@ message ImportComponentConfigurationResponse { } message CRUCardsResponse { - repeated string Cards = 1; + string Cards = 1; } \ No newline at end of file diff --git a/apricot/remote/service.go b/apricot/remote/service.go index caa8c8c45..cdaa02393 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -142,14 +142,14 @@ func (c *RemoteService) GetDetectorForHost(hostname string) (payload string, err } -func (c *RemoteService) GetCRUCardsForHost(hostname string) (cars []string, err error) { +func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards string, err error) { var response *apricotpb.CRUCardsResponse request := &apricotpb.HostRequest{ Hostname: hostname, } response, err = c.cli.GetCRUCardsForHost(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { - return nil, err + return "", err } return response.GetCards(), nil } From 44c43a340ab297513c69a6e50ab8c4252c546597 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 15:38:58 +0200 Subject: [PATCH 0800/2352] [configuration] Extend service with GetCRUCardsForHost --- configuration/service.go | 1 + configuration/template/fields.go | 1 + configuration/template/stack.go | 9 ++++++++- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/configuration/service.go b/configuration/service.go index 81c08c9c6..e0238707c 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -48,6 +48,7 @@ type Service interface { ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) GetDetectorForHost(hostname string) (string, error) + GetCRUCardsForHost(hostname string) (string, error) RawGetRecursive(path string) (string, error) } diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 5c569b791..78edcc0df 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -52,6 +52,7 @@ type ConfigurationService interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) GetDetectorForHost(hostname string) (string, error) + GetCRUCardsForHost(hostname string) (string, error) } func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 2b7d933b2..3d854833f 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -90,10 +90,17 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } return payload }, + "CRUCardsForHost": func(hostname string) string { + defer utils.TimeTrack(time.Now(),"CRUCardsForHost", log.WithPrefix("template")) + payload, err := confSvc.GetCRUCardsForHost(hostname) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + return payload + }, } } - func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload From 4505d49adcb864c85cc0340b354fb921a568f037 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 16:16:35 +0200 Subject: [PATCH 0801/2352] [apricot] GetEndpointsForCRUCard --- apricot/local/service.go | 20 ++ apricot/protos/apricot.pb.go | 356 +++++++++++++++++++++--------- apricot/protos/apricot.proto | 12 +- apricot/protos/apricot_grpc.pb.go | 36 +++ apricot/remote/server.go | 16 ++ apricot/remote/service.go | 13 ++ configuration/service.go | 1 + 7 files changed, 347 insertions(+), 107 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 469b2c63b..5c1bb57c1 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -298,6 +298,26 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { } } +func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + var cards map[string]Cards + var endpoints string + cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) + if err != nil { + return "", err + } + json.Unmarshal([]byte(cfgCards), &cards) + for _, card := range cards { + if card.Serial == cardSerial { + endpoints = endpoints + card.Endpoint + " " + } + } + return endpoints, nil + } else { + return "", errors.New("runtime KV not supported with file backend") + } +} + func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { return cSrc.Get(filepath.Join(getConsulRuntimePrefix(), component, key)) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 0d29051ed..1dd6e91de 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1062,7 +1062,7 @@ type CRUCardsResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Cards string `protobuf:"bytes,1,opt,name=Cards,proto3" json:"Cards,omitempty"` + Cards string `protobuf:"bytes,1,opt,name=cards,proto3" json:"cards,omitempty"` } func (x *CRUCardsResponse) Reset() { @@ -1104,6 +1104,108 @@ func (x *CRUCardsResponse) GetCards() string { return "" } +type CardRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + CardSerial string `protobuf:"bytes,2,opt,name=cardSerial,proto3" json:"cardSerial,omitempty"` +} + +func (x *CardRequest) Reset() { + *x = CardRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CardRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CardRequest) ProtoMessage() {} + +func (x *CardRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. +func (*CardRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{17} +} + +func (x *CardRequest) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *CardRequest) GetCardSerial() string { + if x != nil { + return x.CardSerial + } + return "" +} + +type CRUCardEndpointResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Endpoints string `protobuf:"bytes,1,opt,name=endpoints,proto3" json:"endpoints,omitempty"` +} + +func (x *CRUCardEndpointResponse) Reset() { + *x = CRUCardEndpointResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CRUCardEndpointResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CRUCardEndpointResponse) ProtoMessage() {} + +func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. +func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{18} +} + +func (x *CRUCardEndpointResponse) GetEndpoints() string { + if x != nil { + return x.Endpoints + } + return "" +} + var File_protos_apricot_proto protoreflect.FileDescriptor var file_protos_apricot_proto_rawDesc = []byte{ @@ -1219,84 +1321,98 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x43, 0x61, 0x72, 0x64, 0x73, 0x2a, 0x77, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, - 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, - 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, - 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, - 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x83, 0x08, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, - 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, + 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, + 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, + 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, + 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, + 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, + 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xd7, 0x08, 0x0a, 0x07, 0x41, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, + 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, - 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, - 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, + 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1312,7 +1428,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1332,14 +1448,16 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ImportComponentConfigurationRequest)(nil), // 15: apricot.ImportComponentConfigurationRequest (*ImportComponentConfigurationResponse)(nil), // 16: apricot.ImportComponentConfigurationResponse (*CRUCardsResponse)(nil), // 17: apricot.CRUCardsResponse - nil, // 18: apricot.ComponentRequest.VarStackEntry - nil, // 19: apricot.StringMap.StringMapEntry + (*CardRequest)(nil), // 18: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 19: apricot.CRUCardEndpointResponse + nil, // 20: apricot.ComponentRequest.VarStackEntry + nil, // 21: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 18, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 19, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 20, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 21, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -1349,28 +1467,30 @@ var file_protos_apricot_proto_depIdxs = []int32{ 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 10, // 13: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 11, // 14: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 1, // 15: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 13, // 16: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 17: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 18: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 15, // 19: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 7, // 20: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 8, // 21: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 8, // 22: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 23: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 6, // 24: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 17, // 25: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 4, // 26: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 27: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 14, // 28: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 14, // 29: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 14, // 30: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 31: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 16, // 32: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 20, // [20:33] is the sub-list for method output_type - 7, // [7:20] is the sub-list for method input_type + 18, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 10, // 14: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 11, // 15: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 1, // 16: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 13, // 17: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 18: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 19: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 15, // 20: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 7, // 21: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 8, // 22: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 8, // 23: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 24: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 6, // 25: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 17, // 26: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 19, // 27: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 28: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 29: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 14, // 30: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 14, // 31: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 14, // 32: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 33: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 16, // 34: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 21, // [21:35] is the sub-list for method output_type + 7, // [7:21] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1586,6 +1706,30 @@ func file_protos_apricot_proto_init() { return nil } } + file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CRUCardEndpointResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_apricot_proto_msgTypes[2].OneofWrappers = []interface{}{ (*ComponentRequest_Path)(nil), @@ -1601,7 +1745,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 19, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index a024f81fc..f98dbbb4f 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -35,6 +35,7 @@ service Apricot { rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} rpc GetCRUCardsForHost(HostRequest) returns (CRUCardsResponse) {} + rpc GetEndpointsForCRUCard(CardRequest) returns (CRUCardEndpointResponse) {} rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} @@ -144,5 +145,14 @@ message ImportComponentConfigurationResponse { } message CRUCardsResponse { - string Cards = 1; + string cards = 1; +} + +message CardRequest { + string hostname = 1; + string cardSerial = 2; +} + +message CRUCardEndpointResponse { + string endpoints = 1; } \ No newline at end of file diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index edd2c67e4..bafd1bda5 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -24,6 +24,7 @@ type ApricotClient interface { RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) + GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -95,6 +96,15 @@ func (c *apricotClient) GetCRUCardsForHost(ctx context.Context, in *HostRequest, return out, nil } +func (c *apricotClient) GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) { + out := new(CRUCardEndpointResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetEndpointsForCRUCard", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) @@ -168,6 +178,7 @@ type ApricotServer interface { RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) + GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) @@ -199,6 +210,9 @@ func (UnimplementedApricotServer) GetDetectorForHost(context.Context, *HostReque func (UnimplementedApricotServer) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCRUCardsForHost not implemented") } +func (UnimplementedApricotServer) GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEndpointsForCRUCard not implemented") +} func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") } @@ -340,6 +354,24 @@ func _Apricot_GetCRUCardsForHost_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Apricot_GetEndpointsForCRUCard_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CardRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetEndpointsForCRUCard(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetEndpointsForCRUCard", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetEndpointsForCRUCard(ctx, req.(*CardRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetRuntimeEntryRequest) if err := dec(in); err != nil { @@ -497,6 +529,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetCRUCardsForHost", Handler: _Apricot_GetCRUCardsForHost_Handler, }, + { + MethodName: "GetEndpointsForCRUCard", + Handler: _Apricot_GetEndpointsForCRUCard_Handler, + }, { MethodName: "GetRuntimeEntry", Handler: _Apricot_GetRuntimeEntry_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 9b169dc30..1c5ee1f59 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -165,6 +165,22 @@ func (m *RpcServer) GetCRUCardsForHost(_ context.Context, request *apricotpb.Hos return &apricotpb.CRUCardsResponse{Cards: cards}, E_OK.Err() } +func (m *RpcServer) GetEndpointsForCRUCard(_ context.Context, request *apricotpb.CardRequest) (*apricotpb.CRUCardEndpointResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + endpoints, err := m.service.GetEndpointsForCRUCard(request.GetHostname(), request.GetCardSerial()) + if err != nil { + return nil, err + } + return &apricotpb.CRUCardEndpointResponse{Endpoints: endpoints}, E_OK.Err() +} + func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index cdaa02393..3aafba946 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -154,6 +154,19 @@ func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards string, err e return response.GetCards(), nil } +func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (cards string, err error) { + var response *apricotpb.CRUCardEndpointResponse + request := &apricotpb.CardRequest{ + Hostname: hostname, + CardSerial: cardSerial, + } + response, err = c.cli.GetEndpointsForCRUCard(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", err + } + return response.GetEndpoints(), nil +} + func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.GetRuntimeEntryRequest{ diff --git a/configuration/service.go b/configuration/service.go index e0238707c..18c45940c 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -49,6 +49,7 @@ type Service interface { GetDetectorForHost(hostname string) (string, error) GetCRUCardsForHost(hostname string) (string, error) + GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) RawGetRecursive(path string) (string, error) } From 27c4bad10d79b97618112c38b1ac85d1b3bff820 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 16:18:52 +0200 Subject: [PATCH 0802/2352] [configuration] GetEndpointsForCRUCard --- configuration/template/fields.go | 6 ++++++ configuration/template/stack.go | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 78edcc0df..1560d60e9 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -53,6 +53,7 @@ type ConfigurationService interface { GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) GetDetectorForHost(hostname string) (string, error) GetCRUCardsForHost(hostname string) (string, error) + GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) } func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { @@ -204,6 +205,11 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va environment[k] = v } + CRUCardconfigAccessFuncs := MakeConfigAccessFuncsCRUCard(confSvc, varStack) + for k, v := range CRUCardconfigAccessFuncs { + environment[k] = v + } + for _, field := range fields { buf := new(bytes.Buffer) // FIXME: the line below implements the cache diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 3d854833f..c9426bd9f 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -42,6 +42,9 @@ import ( type GetConfigFunc func(string) string type ConfigAccessFuncs map[string]GetConfigFunc type ToPtreeFunc func(string, string) string +type CRUCardConfigAccessFuncs map[string]GetCRUCardConfigFunc +type GetCRUCardConfigFunc func(string, string) string + func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ @@ -101,6 +104,20 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } } +func MakeConfigAccessFuncsCRUCard(confSvc ConfigurationService, varStack map[string]string) CRUCardConfigAccessFuncs { + return CRUCardConfigAccessFuncs{ + "EndpointsForCRUCard": func(hostname, cardSerial string) string { + defer utils.TimeTrack(time.Now(),"EndpointsForCRUCard", log.WithPrefix("template")) + payload, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + return payload + }, + } +} + + func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload From f94d7fc250ae650aebe41531a3d393c9e0c15336 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 31 Mar 2021 16:32:24 +0200 Subject: [PATCH 0803/2352] Fix indentation --- apricot/local/jsontypes.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/apricot/local/jsontypes.go b/apricot/local/jsontypes.go index 9bbc0786c..b5694b118 100644 --- a/apricot/local/jsontypes.go +++ b/apricot/local/jsontypes.go @@ -24,13 +24,12 @@ package local - type Cards struct { - Type string `json:"type"` - PciAddress string `json:"pciAddress"` - Serial string `json:"serial"` - Endpoint string `json:"endpoint"` - Numa string `json:"numa"` - Firware string `json:"firmware"` - UserLogicVersion string `json:"userLogicVersion"` -} \ No newline at end of file + Type string `json:"type"` + PciAddress string `json:"pciAddress"` + Serial string `json:"serial"` + Endpoint string `json:"endpoint"` + Numa string `json:"numa"` + Firware string `json:"firmware"` + UserLogicVersion string `json:"userLogicVersion"` +} From 363df18aba3351353951c1b8966f04dc6b14e491 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 Mar 2021 14:23:59 +0200 Subject: [PATCH 0804/2352] [core] DCS SOR/EOR response processing --- core/integration/dcs/plugin.go | 41 ++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 3fb95043b..32b113f5d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -29,6 +29,7 @@ package dcs import ( "context" "encoding/json" + "errors" "fmt" "io" "net/url" @@ -178,13 +179,29 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DCS SOR") return } - _, err = p.dcsClient.StartOfRun(context.Background(), &in, grpc.EmptyCallOption{}) - // FIXME: don't ignore response + + var stream dcspb.Configurator_StartOfRunClient + stream, err = p.dcsClient.StartOfRun(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Error("failed to perform DCS SOR") } + var dcsEvent *dcspb.Event + for { + dcsEvent, err = stream.Recv() + if err == io.EOF { + break // no more data + } + if err != nil || dcsEvent == nil { + if dcsEvent == nil { + err = errors.New("nil DCS event") + } + log.WithError(err).Warn("bad DCS event received") + break + } + log.WithField("event", dcsEvent).Debug("incoming DCS SOR event") + } return } stack["EndOfRun"] = func() (out string) { // must formally return string even when we return nothing @@ -239,13 +256,29 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DCS EOR") return } - _, err = p.dcsClient.EndOfRun(context.Background(), &in, grpc.EmptyCallOption{}) - // FIXME: don't ignore response + + var stream dcspb.Configurator_EndOfRunClient + stream, err = p.dcsClient.EndOfRun(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Error("failed to perform DCS EOR") } + var dcsEvent *dcspb.Event + for { + dcsEvent, err = stream.Recv() + if err == io.EOF { + break // no more data + } + if err != nil || dcsEvent == nil { + if dcsEvent == nil { + err = errors.New("nil DCS event") + } + log.WithError(err).Warn("bad DCS event received") + break + } + log.WithField("event", dcsEvent).Debug("incoming DCS EOR event") + } return } From 29cf86df732ef52e8dbb06f2698015a3aa20c9a9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 Mar 2021 17:56:56 +0200 Subject: [PATCH 0805/2352] [core] DCS Cleanup template function, performs EOR regardless if needed --- core/integration/dcs/plugin.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 32b113f5d..77b801dfb 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -34,6 +34,7 @@ import ( "io" "net/url" "strconv" + "strings" "time" "github.com/AliceO2Group/Control/core/integration" @@ -200,11 +201,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Warn("bad DCS event received") break } + if dcsEvent.Eventtype == dcspb.EventType_SOR_EVENT { + if strings.Contains(dcsEvent.Parameters, "SOR_FAILURE") { + return + } + } log.WithField("event", dcsEvent).Debug("incoming DCS SOR event") } return } - stack["EndOfRun"] = func() (out string) { // must formally return string even when we return nothing + eorFunc := func() (out string) { // must formally return string even when we return nothing log.Debug("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] @@ -281,6 +287,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } + stack["EndOfRun"] = eorFunc + stack["Cleanup"] = eorFunc return } From a24532fab127f1d1e57e3d883752df4052588ee6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 Mar 2021 17:59:38 +0200 Subject: [PATCH 0806/2352] [build] Regenerate proto --- apricot/protos/apricot_grpc.pb.go | 8 ++------ coconut/protos/o2control_grpc.pb.go | 12 ++++-------- core/integration/dcs/protos/dcs_grpc.pb.go | 16 ++++++---------- .../ddsched/protos/ddsched_grpc.pb.go | 8 ++------ core/integration/odc/protos/odc_grpc.pb.go | 8 ++------ core/protos/o2control_grpc.pb.go | 12 ++++-------- executor/protos/occ_grpc.pb.go | 12 ++++-------- odcshim/odcprotos/odc_grpc.pb.go | 8 ++------ odcshim/protos/occ_grpc.pb.go | 12 ++++-------- 9 files changed, 30 insertions(+), 66 deletions(-) diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index bafd1bda5..1f20596e9 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -243,7 +242,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&Apricot_ServiceDesc, srv) + s.RegisterService(&_Apricot_serviceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -498,10 +497,7 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Apricot_ServiceDesc = grpc.ServiceDesc{ +var _Apricot_serviceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 5af8aad73..a87d3d87d 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +51,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +272,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -417,7 +416,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -840,10 +839,7 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index d27cf4db1..c173927c6 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -33,7 +32,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -65,7 +64,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -97,7 +96,7 @@ func (x *configuratorStartOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -129,7 +128,7 @@ func (x *configuratorEndOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } @@ -195,7 +194,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&Configurator_ServiceDesc, srv) + s.RegisterService(&_Configurator_serviceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -282,10 +281,7 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { return x.ServerStream.SendMsg(m) } -// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Configurator_ServiceDesc = grpc.ServiceDesc{ +var _Configurator_serviceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{}, diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 0e2419bfb..bcf8b89a7 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -91,7 +90,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&DataDistributionControl_ServiceDesc, srv) + s.RegisterService(&_DataDistributionControl_serviceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -148,10 +147,7 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ +var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 1bcc9baa5..045ec3bc8 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -263,7 +262,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&ODC_ServiceDesc, srv) + s.RegisterService(&_ODC_serviceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -500,10 +499,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ODC_ServiceDesc = grpc.ServiceDesc{ +var _ODC_serviceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 903ec7d16..81fdcbe63 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +51,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +272,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -415,7 +414,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -838,10 +837,7 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index eafb7734d..66a3c8901 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -155,7 +154,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -236,10 +235,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index 7a2602472..b5f1e0452 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -265,7 +264,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&ODC_ServiceDesc, srv) + s.RegisterService(&_ODC_serviceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -502,10 +501,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ODC_ServiceDesc = grpc.ServiceDesc{ +var _ODC_serviceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index cd6c2d3a2..09d8d584b 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -153,7 +152,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -234,10 +233,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From 8847cf746569f78020a594d79491cb966c28ce99 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 Mar 2021 18:03:44 +0200 Subject: [PATCH 0807/2352] [build] Bump to v0.22.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 76c3d408d..5fe68851e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 21 -VERSION_PATCH := 80 +VERSION_MINOR := 22 +VERSION_PATCH := 0 From 7120a6e4a218c14265bc08f1fbbd8f6a617e8cc2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 12 Apr 2021 10:26:14 +0200 Subject: [PATCH 0808/2352] [core] Bump DCS client to latest protofile --- apricot/protos/apricot.pb.go | 2 +- coconut/protos/o2control.pb.go | 2 +- core/integration/dcs/plugin.go | 2 +- core/integration/dcs/protos/dcs.pb.go | 194 ++++++++++-------- core/integration/dcs/protos/dcs.proto | 28 ++- core/integration/ddsched/protos/ddsched.pb.go | 2 +- core/integration/odc/protos/odc.pb.go | 2 +- core/protos/o2control.pb.go | 2 +- executor/protos/occ.pb.go | 2 +- odcshim/odcprotos/odc.pb.go | 2 +- odcshim/protos/occ.pb.go | 2 +- 11 files changed, 134 insertions(+), 106 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 1dd6e91de..18463e741 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index b60e26489..4f1f283f1 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/o2control.proto package pb diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 77b801dfb..da29a55eb 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -140,7 +140,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for DCS SOR") } - rt := dcspb.RunType_RT_TECHNICAL + rt := dcspb.RunType_TECHNICAL runTypeS, ok := varStack["run_type"] if ok { // a detector is defined in the var stack diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 0e44eaede..7eea3c871 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/dcs.proto package dcspb @@ -60,6 +60,7 @@ const ( EventType_ACK_EVENT EventType = 4 EventType_SOR_EVENT EventType = 20 EventType_EOR_EVENT EventType = 30 + EventType_TIMEOUT EventType = 40 ) // Enum value maps for EventType. @@ -72,6 +73,7 @@ var ( 4: "ACK_EVENT", 20: "SOR_EVENT", 30: "EOR_EVENT", + 40: "TIMEOUT", } EventType_value = map[string]int32{ "NULL_EVENT": 0, @@ -81,6 +83,7 @@ var ( "ACK_EVENT": 4, "SOR_EVENT": 20, "EOR_EVENT": 30, + "TIMEOUT": 40, } ) @@ -130,7 +133,8 @@ const ( Detector_TPC Detector = 13 Detector_TRD Detector = 14 Detector_ZDC Detector = 15 - Detector_DCS Detector = 16 + Detector_LHC Detector = 16 + Detector_DCS Detector = 17 ) // Enum value maps for Detector. @@ -152,7 +156,8 @@ var ( 13: "TPC", 14: "TRD", 15: "ZDC", - 16: "DCS", + 16: "LHC", + 17: "DCS", } Detector_value = map[string]int32{ "NULL_DETECTOR": 0, @@ -171,7 +176,8 @@ var ( "TPC": 13, "TRD": 14, "ZDC": 15, - "DCS": 16, + "LHC": 16, + "DCS": 17, } ) @@ -209,36 +215,42 @@ const ( DetectorState_READY DetectorState = 1 DetectorState_RUN_OK DetectorState = 2 DetectorState_RUN_FAILURE DetectorState = 3 - DetectorState_SOR_PROGRESSING DetectorState = 4 - DetectorState_EOR_PROGRESSING DetectorState = 5 - DetectorState_SOR_FAILURE DetectorState = 6 - DetectorState_EOR_FAILURE DetectorState = 7 - DetectorState_ERROR DetectorState = 8 + DetectorState_RUN_INHIBIT DetectorState = 4 + DetectorState_SOR_PROGRESSING DetectorState = 5 + DetectorState_EOR_PROGRESSING DetectorState = 6 + DetectorState_SOR_FAILURE DetectorState = 7 + DetectorState_EOR_FAILURE DetectorState = 8 + DetectorState_ERROR DetectorState = 9 + DetectorState_DEAD DetectorState = 10 ) // Enum value maps for DetectorState. var ( DetectorState_name = map[int32]string{ - 0: "NULL_STATE", - 1: "READY", - 2: "RUN_OK", - 3: "RUN_FAILURE", - 4: "SOR_PROGRESSING", - 5: "EOR_PROGRESSING", - 6: "SOR_FAILURE", - 7: "EOR_FAILURE", - 8: "ERROR", + 0: "NULL_STATE", + 1: "READY", + 2: "RUN_OK", + 3: "RUN_FAILURE", + 4: "RUN_INHIBIT", + 5: "SOR_PROGRESSING", + 6: "EOR_PROGRESSING", + 7: "SOR_FAILURE", + 8: "EOR_FAILURE", + 9: "ERROR", + 10: "DEAD", } DetectorState_value = map[string]int32{ "NULL_STATE": 0, "READY": 1, "RUN_OK": 2, "RUN_FAILURE": 3, - "SOR_PROGRESSING": 4, - "EOR_PROGRESSING": 5, - "SOR_FAILURE": 6, - "EOR_FAILURE": 7, - "ERROR": 8, + "RUN_INHIBIT": 4, + "SOR_PROGRESSING": 5, + "EOR_PROGRESSING": 6, + "SOR_FAILURE": 7, + "EOR_FAILURE": 8, + "ERROR": 9, + "DEAD": 10, } ) @@ -272,22 +284,28 @@ func (DetectorState) EnumDescriptor() ([]byte, []int) { type RunType int32 const ( - RunType_RT_NULL RunType = 0 - RunType_RT_PHYSICS RunType = 1 - RunType_RT_TECHNICAL RunType = 2 + RunType_NULL_RUNTYPE RunType = 0 + RunType_PHYSICS RunType = 1 + RunType_TECHNICAL RunType = 2 + RunType_PEDESTALS RunType = 3 + RunType_PULSER RunType = 4 ) // Enum value maps for RunType. var ( RunType_name = map[int32]string{ - 0: "RT_NULL", - 1: "RT_PHYSICS", - 2: "RT_TECHNICAL", + 0: "NULL_RUNTYPE", + 1: "PHYSICS", + 2: "TECHNICAL", + 3: "PEDESTALS", + 4: "PULSER", } RunType_value = map[string]int32{ - "RT_NULL": 0, - "RT_PHYSICS": 1, - "RT_TECHNICAL": 2, + "NULL_RUNTYPE": 0, + "PHYSICS": 1, + "TECHNICAL": 2, + "PEDESTALS": 3, + "PULSER": 4, } ) @@ -321,19 +339,19 @@ func (RunType) EnumDescriptor() ([]byte, []int) { type TriggerMode int32 const ( - TriggerMode_TM_CONTINUOUS TriggerMode = 0 - TriggerMode_TM_TRIGGERED TriggerMode = 1 + TriggerMode_CONTINUOUS TriggerMode = 0 + TriggerMode_TRIGGERED TriggerMode = 1 ) // Enum value maps for TriggerMode. var ( TriggerMode_name = map[int32]string{ - 0: "TM_CONTINUOUS", - 1: "TM_TRIGGERED", + 0: "CONTINUOUS", + 1: "TRIGGERED", } TriggerMode_value = map[string]int32{ - "TM_CONTINUOUS": 0, - "TM_TRIGGERED": 1, + "CONTINUOUS": 0, + "TRIGGERED": 1, } ) @@ -537,7 +555,7 @@ func (x *SorRequest) GetRunType() RunType { if x != nil { return x.RunType } - return RunType_RT_NULL + return RunType_NULL_RUNTYPE } func (x *SorRequest) GetRunNumber() int32 { @@ -858,7 +876,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x80, 0x01, 0x0a, 0x09, 0x45, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x8d, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, @@ -866,52 +884,56 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, - 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x2a, 0xad, 0x01, - 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, - 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, - 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, - 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, - 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, - 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, - 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, - 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, - 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, - 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x10, 0x2a, 0x9e, 0x01, - 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, - 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, - 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, - 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, - 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, - 0x05, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, - 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, - 0x45, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x08, 0x2a, 0x38, - 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x54, 0x5f, - 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x54, 0x5f, 0x50, 0x48, 0x59, - 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x54, 0x5f, 0x54, 0x45, 0x43, - 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x2a, 0x32, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x4d, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x54, 0x4d, - 0x5f, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x32, 0xd8, 0x01, 0x0a, - 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x2d, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, - 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, - 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x35, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, - 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x21, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x0c, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x0b, 0x0a, + 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xb6, 0x01, 0x0a, 0x08, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, + 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, + 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, + 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, + 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, + 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, + 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, + 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, + 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, + 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, + 0x53, 0x10, 0x11, 0x2a, 0xb9, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, + 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, + 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, + 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, + 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, + 0x52, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, + 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, + 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, + 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, + 0x52, 0x10, 0x04, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, + 0x01, 0x32, 0xd8, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2d, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, + 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x35, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x21, 0x0a, 0x11, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, + 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 1a13fd441..d39d04eae 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -130,6 +130,7 @@ enum EventType { ACK_EVENT = 4; SOR_EVENT = 20; EOR_EVENT = 30; + TIMEOUT = 40; } enum Detector { @@ -149,7 +150,8 @@ enum Detector { TPC = 13; TRD = 14; ZDC = 15; - DCS = 16; + LHC = 16; + DCS = 17; } enum DetectorState { @@ -157,19 +159,23 @@ enum DetectorState { READY = 1; RUN_OK = 2; RUN_FAILURE = 3; - SOR_PROGRESSING = 4; - EOR_PROGRESSING = 5; - SOR_FAILURE = 6; - EOR_FAILURE = 7; - ERROR = 8; + RUN_INHIBIT = 4; + SOR_PROGRESSING = 5; + EOR_PROGRESSING = 6; + SOR_FAILURE = 7; + EOR_FAILURE = 8; + ERROR = 9; + DEAD = 10; } enum RunType { - RT_NULL = 0; - RT_PHYSICS = 1; - RT_TECHNICAL = 2; + NULL_RUNTYPE = 0; + PHYSICS = 1; + TECHNICAL = 2; + PEDESTALS = 3; + PULSER = 4; } enum TriggerMode { - TM_CONTINUOUS = 0; - TM_TRIGGERED = 1; + CONTINUOUS = 0; + TRIGGERED = 1; } diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 61e09d8f8..d9713a711 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index fd65c3f39..ce537dd25 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/odc.proto package odc diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index b60e26489..4f1f283f1 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 3671d95dd..a73acb5b6 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/occ.proto package pb diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go index 40e3f5150..f37feadee 100644 --- a/odcshim/odcprotos/odc.pb.go +++ b/odcshim/odcprotos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: odcprotos/odc.proto package odc diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go index 3671d95dd..a73acb5b6 100644 --- a/odcshim/protos/occ.pb.go +++ b/odcshim/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.6 +// protoc v3.15.7 // source: protos/occ.proto package pb From ea6b31bdef9e9e07f99a7545dcc646c04dea85c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 12 Apr 2021 16:04:17 +0200 Subject: [PATCH 0809/2352] [core] Improve DCS client log output --- core/integration/dcs/plugin.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index da29a55eb..a89676366 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -192,10 +192,12 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { for { dcsEvent, err = stream.Recv() if err == io.EOF { + log.Debug("DCS SOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { + log.Warn("nil DCS event received") err = errors.New("nil DCS event") } log.WithError(err).Warn("bad DCS event received") @@ -203,6 +205,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.Eventtype == dcspb.EventType_SOR_EVENT { if strings.Contains(dcsEvent.Parameters, "SOR_FAILURE") { + log.WithField("event", dcsEvent).Warn("DCS SOR failure") return } } @@ -274,15 +277,23 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { for { dcsEvent, err = stream.Recv() if err == io.EOF { + log.Debug("DCS EOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { + log.Warn("nil DCS event received") err = errors.New("nil DCS event") } log.WithError(err).Warn("bad DCS event received") break } + if dcsEvent.Eventtype == dcspb.EventType_EOR_EVENT { + if strings.Contains(dcsEvent.Parameters, "EOR_FAILURE") { + log.WithField("event", dcsEvent).Warn("DCS EOR failure") + return + } + } log.WithField("event", dcsEvent).Debug("incoming DCS EOR event") } return From 5153f6c0b729223cef7367ada6a9e7fff5a9c2fa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 12 Apr 2021 16:06:28 +0200 Subject: [PATCH 0810/2352] [build] Bump to v0.22.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5fe68851e..5b5b156c7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 22 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From c3b0b8f06edd17aa98d77f0315a6db3919af8552 Mon Sep 17 00:00:00 2001 From: Sylvain Chapeland Date: Wed, 14 Apr 2021 10:40:17 +0200 Subject: [PATCH 0811/2352] infologger renaming --- fpctl/src/fpctl.py | 2 +- hacking/example-config.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/fpctl/src/fpctl.py b/fpctl/src/fpctl.py index d678b7a4a..5500ce275 100755 --- a/fpctl/src/fpctl.py +++ b/fpctl/src/fpctl.py @@ -483,7 +483,7 @@ def print_summary(inventory_path): 'flpprotocype-qctask', 'flpprototype-qcchecker', Style.RESET_ALL + Style.DIM + Fore.WHITE + '(none)' + Style.RESET_ALL, - 'infoLoggerServer'] + 'o2-infologger-server'] target_hosts = [] for group in all_target_groups: output = subprocess.check_output(['ansible', diff --git a/hacking/example-config.yaml b/hacking/example-config.yaml index 1f8ee50be..e35cb1736 100644 --- a/hacking/example-config.yaml +++ b/hacking/example-config.yaml @@ -10,10 +10,10 @@ o2: shell: true # value: source /etc/profile.d/modules.sh && \ # MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ -# {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/readout.exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} | {{ infologger_install_path }}/bin/log -x +# {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/readout.exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} | {{ infologger_install_path }}/bin/o2-infologger-log -x value: source /etc/profile.d/modules.sh && MODULEPATH=/opt/alisw/el7/modulefiles module load Readout && - /opt/alisw/el7/Readout/v0.1.0-16/bin/readout.exe file:/etc/flpprototype.d/readout/configDummy.cfg | /opt/o2-InfoLogger/bin/log -x + /opt/alisw/el7/Readout/v0.1.0-16/bin/readout.exe file:/etc/flpprototype.d/readout/configDummy.cfg | /opt/o2-InfoLogger/bin/o2-infologger-log -x arguments: "[]" qctask: wantsCPU: 1 From 47a311ba3c2741bb4fd9375d92948a3eafb7e7d7 Mon Sep 17 00:00:00 2001 From: Sylvain Chapeland Date: Wed, 14 Apr 2021 11:34:58 +0200 Subject: [PATCH 0812/2352] readout.exe renaming --- fpctl/systemd/system/flpprototype-readout.service.j2 | 2 +- hacking/example-config.yaml | 4 ++-- walnut/schemata/task_test.yaml | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fpctl/systemd/system/flpprototype-readout.service.j2 b/fpctl/systemd/system/flpprototype-readout.service.j2 index 78b34001b..ae51ade4a 100644 --- a/fpctl/systemd/system/flpprototype-readout.service.j2 +++ b/fpctl/systemd/system/flpprototype-readout.service.j2 @@ -6,5 +6,5 @@ AssertPathExistsGlob={{ flpprototype_readout_confdir }}/{{ flpprototype_readout_ [Service] ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ - {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/readout.exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }}" + {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/o2-readout-exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }}" Restart=no diff --git a/hacking/example-config.yaml b/hacking/example-config.yaml index 1f8ee50be..5e4336adc 100644 --- a/hacking/example-config.yaml +++ b/hacking/example-config.yaml @@ -10,10 +10,10 @@ o2: shell: true # value: source /etc/profile.d/modules.sh && \ # MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ -# {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/readout.exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} | {{ infologger_install_path }}/bin/log -x +# {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/o2-readout-exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} | {{ infologger_install_path }}/bin/log -x value: source /etc/profile.d/modules.sh && MODULEPATH=/opt/alisw/el7/modulefiles module load Readout && - /opt/alisw/el7/Readout/v0.1.0-16/bin/readout.exe file:/etc/flpprototype.d/readout/configDummy.cfg | /opt/o2-InfoLogger/bin/log -x + /opt/alisw/el7/Readout/v0.1.0-16/bin/o2-readout-exe file:/etc/flpprototype.d/readout/configDummy.cfg | /opt/o2-InfoLogger/bin/log -x arguments: "[]" qctask: wantsCPU: 1 diff --git a/walnut/schemata/task_test.yaml b/walnut/schemata/task_test.yaml index 219989675..7c7b194f4 100644 --- a/walnut/schemata/task_test.yaml +++ b/walnut/schemata/task_test.yaml @@ -20,5 +20,5 @@ command: - "{{ readout_cfg_uri }}" value: >- eval `aliswmod load Readout Control-OCCPlugin` && - readout.exe - \ No newline at end of file + o2-readout-exe + From 3d6366bf457539d2201c09bc7034113fd5a918e4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 13 Apr 2021 14:36:13 +0200 Subject: [PATCH 0813/2352] [core] DCS integration: only run EOR during Cleanup if needed --- core/integration/dcs/plugin.go | 63 +++++++++++++++++++++++++++------- 1 file changed, 50 insertions(+), 13 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index a89676366..c4a3ad7a3 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -52,6 +52,8 @@ type Plugin struct { dcsPort int dcsClient *RpcClient + + pendingEORs map[string /*envId*/]int64 } func NewPlugin(endpoint string) integration.Plugin { @@ -203,17 +205,26 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Warn("bad DCS event received") break } - if dcsEvent.Eventtype == dcspb.EventType_SOR_EVENT { + if dcsEvent.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { if strings.Contains(dcsEvent.Parameters, "SOR_FAILURE") { log.WithField("event", dcsEvent).Warn("DCS SOR failure") return } + if strings.Contains(dcsEvent.Parameters, "RUN_OK") { + log.WithField("event", dcsEvent).Debug("DCS SOR success") + envId, ok := varStack["environment_id"] + if !ok { + break + } + p.pendingEORs[envId] = runNumber64 + break + } } log.WithField("event", dcsEvent).Debug("incoming DCS SOR event") } return } - eorFunc := func() (out string) { // must formally return string even when we return nothing + eorFunc := func(runNumber int64) (out string) { // must formally return string even when we return nothing log.Debug("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] @@ -230,13 +241,6 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } - rn := varStack["run_number"] - var runNumber64 int64 - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithError(err).Error("cannot acquire run number for DCS EOR") - } - dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.Debug("empty DCS detectors list provided") @@ -250,7 +254,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { in := dcspb.EorRequest{ Detector: detectors, - RunNumber: int32(runNumber64), + RunNumber: int32(runNumber), Parameters: argMap, } if p.dcsClient == nil { @@ -288,18 +292,51 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Warn("bad DCS event received") break } - if dcsEvent.Eventtype == dcspb.EventType_EOR_EVENT { + if dcsEvent.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { if strings.Contains(dcsEvent.Parameters, "EOR_FAILURE") { log.WithField("event", dcsEvent).Warn("DCS EOR failure") return } + if strings.Contains(dcsEvent.Parameters, "RUN_OK") { + log.WithField("event", dcsEvent).Debug("DCS EOR success") + envId, ok := varStack["environment_id"] + if !ok { + break + } + delete(p.pendingEORs, envId) + break + } } log.WithField("event", dcsEvent).Debug("incoming DCS EOR event") } return } - stack["EndOfRun"] = eorFunc - stack["Cleanup"] = eorFunc + stack["EndOfRun"] = func() (out string) { + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for DCS EOR") + } + return eorFunc(runNumber64) + } + stack["Cleanup"] = func() (out string) { + envId, ok := varStack["environment_id"] + if !ok { + log.Warn("no environment_id found for DCS cleanup") + return + } + + runNumber, ok := p.pendingEORs[envId] + if !ok { + log.Debug("DCS cleanup: nothing to do") + return + } + + log.WithField("runNumber", runNumber).Debug("pending DCS EOR found, performing cleanup") + return eorFunc(runNumber) + } return } From 3206a65a2f5689c6156d2fc2aa16c4343be26bb2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Apr 2021 12:29:28 +0200 Subject: [PATCH 0814/2352] [core] Poll for DD scheduler partition state CONFIGURED/TERMINATED --- core/integration/ddsched/plugin.go | 65 +++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 03b9f13f8..50a0e88b1 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -177,11 +177,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionInitialize") return } - if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING { + if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING && + response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURED { log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String())). WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") + return + } + + PARTITION_STATE_POLLING: + for { + response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + switch response.PartitionState { + case ddpb.PartitionState_PARTITION_CONFIGURING: + time.Sleep(100 * time.Millisecond) + case ddpb.PartitionState_PARTITION_CONFIGURED: + break PARTITION_STATE_POLLING + default: + log.WithError(fmt.Errorf("PartitionInitialize landed on unexpected state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionInitialize") + break PARTITION_STATE_POLLING + } } return } @@ -226,12 +245,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } - if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING { - log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && + response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { + log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } + + PARTITION_STATE_POLLING: + for { + response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + switch response.PartitionState { + case ddpb.PartitionState_PARTITION_TERMINATING: + time.Sleep(100 * time.Millisecond) + case ddpb.PartitionState_PARTITION_TERMINATED: + break PARTITION_STATE_POLLING + default: + log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + break PARTITION_STATE_POLLING + } + } return } stack["EnsureTermination"] = func() (out string) { @@ -321,12 +358,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } - if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING { - log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && + response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { + log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). WithField("environment_id", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } + + PARTITION_STATE_POLLING: + for { + response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + switch response.PartitionState { + case ddpb.PartitionState_PARTITION_TERMINATING: + time.Sleep(100 * time.Millisecond) + case ddpb.PartitionState_PARTITION_TERMINATED: + break PARTITION_STATE_POLLING + default: + log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + Error("failed to perform DD scheduler PartitionTerminate") + break PARTITION_STATE_POLLING + } + } return } return From 88afe483ba1fb5e9ce5eb521a31272915236a4ec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Apr 2021 16:25:30 +0200 Subject: [PATCH 0815/2352] [core] Fix issue with START-STOP-START causing a core crash --- core/workflow/callable/call.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index cf9f0eb98..2dc6db9cf 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -140,11 +140,11 @@ func (c *Call) Start() { c.await = make(chan error) go func() { c.await <- c.Call() + close(c.await) }() } func (c *Call) Await() error { - defer close(c.await) return <-c.await } From 5dd3b4cd1980e159eeab440f56c39451c64afc5a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Apr 2021 16:45:06 +0200 Subject: [PATCH 0816/2352] [build] Bump to v0.22.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5b5b156c7..ed633b118 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 22 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 30b18730df7bf6018594ddda9fe4b2eefd6ca54b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 16 Apr 2021 16:09:03 +0200 Subject: [PATCH 0817/2352] [common] Support !public tags in StringWrapMap --- common/gera/stringmap.go | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index dc45a1f8e..b707e2385 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -26,6 +26,7 @@ package gera import ( "github.com/imdario/mergo" + "gopkg.in/yaml.v3" ) type StringMap interface { @@ -93,9 +94,26 @@ type StringWrapMap struct { } func (w *StringWrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { - m := make(map[string]string) - err := unmarshal(&m) + nodes := make(map[string]yaml.Node) + err := unmarshal(&nodes) if err == nil { + m := make(map[string]string) + for k, v := range nodes { + if v.Kind == yaml.ScalarNode { + m[k] = v.Value + } else if v.Kind == yaml.MappingNode && v.Tag == "!public" { + type auxType struct { + Value string + } + var aux auxType + err = v.Decode(&aux) + if err != nil { + continue + } + m[k] = aux.Value + } + } + *w = StringWrapMap{ theMap: m, parent: nil, From fc653d93022945092d1825624988c8751e186298 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 16 Apr 2021 16:50:19 +0200 Subject: [PATCH 0818/2352] [misc] Remove developer docs from mkdocs --- mkdocs.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index dcf5bb0cc..98626aa68 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,12 +23,3 @@ nav: - coconut template: './coconut/doc/coconut_template.md' - peanut: './occ/peanut/README.md' - 'FAQ': faq.md - - 'Developer Documentation': - - 'Development Overview': 'development.md' - - 'Building Instructions': 'building.md' - - 'Development Environment': 'running.md' - - 'Makefile Reference': 'makefile_reference.md' - - 'OCC Components': - - Overview: './occ/README.md' - - OCClib example: './occ/occlib/examples/dummy-process/README.md' - - OCC debugging with grpcc: './docs/using_grpcc_occ.md' From 1e69a61f83852c44ce8105b921ab533227e75051 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Apr 2021 15:44:30 +0200 Subject: [PATCH 0819/2352] [occ] Fix OCC build issue with Protobuf v3.15.8 --- occ/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index a802e3317..833148a94 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -103,7 +103,7 @@ project(occ ### set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) @@ -165,7 +165,7 @@ find_package(Boost 1.74 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) # Protobuf set(protobuf_MODULE_COMPATIBLE TRUE) -find_package(protobuf 3.11.4 CONFIG REQUIRED) +find_package(protobuf 3.15.8 CONFIG REQUIRED) message(STATUS "Using protobuf ${protobuf_VERSION}") # OpenSSL on Mac @@ -340,7 +340,7 @@ set_target_properties(${OCCLIBRARY} PROPERTIES SOVERSION ${OCC_VERSION_SHORT} PUBLIC_HEADER "${OCCLIBRARY_PUBLIC_HEADERS}") -target_compile_features(${OCCLIBRARY} PUBLIC cxx_std_17) +target_compile_features(${OCCLIBRARY} PUBLIC cxx_std_14) # Install library include(GNUInstallDirs) From e49231ecd46d940d2142ab1e3d7b1873027115a9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Apr 2021 15:50:44 +0200 Subject: [PATCH 0820/2352] [build] Bump to v0.22.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ed633b118..0aa41d1d7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 22 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From b1e8928343e92df3601c079a3ac5c66295d40590 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 22 Apr 2021 13:23:51 +0200 Subject: [PATCH 0821/2352] [core] Support multivalued attribute split by comma --- core/task/constraint/attributes.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/task/constraint/attributes.go b/core/task/constraint/attributes.go index 267d49351..8db9b7f07 100644 --- a/core/task/constraint/attributes.go +++ b/core/task/constraint/attributes.go @@ -28,6 +28,7 @@ import ( "fmt" "strings" + "github.com/AliceO2Group/Control/common/utils" "github.com/mesos/mesos-go/api/v1/lib" ) @@ -72,6 +73,13 @@ func (attrs Attributes) Satisfy(cts Constraints) (ok bool) { case Equals: var value string if value, ok = attrs.Get(constraint.Attribute); ok { + if strings.Contains(value, ",") { + values := strings.Split(value,",") + if utils.StringSliceContains(values, constraint.Value) { + ok = true + continue + } + } if value == constraint.Value { ok = true continue From 31a8b9d7ffe0e21443fd87ced999ac95a7cc7abb Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 20 Apr 2021 16:25:53 +0300 Subject: [PATCH 0822/2352] [repos] Prefer join over manual concatenation --- core/repos/repo.go | 39 +++++++++++++++++---------------------- core/repos/repomanager.go | 17 +++++------------ go.mod | 33 --------------------------------- 3 files changed, 22 insertions(+), 67 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 4fd4ee84d..2a7c48b70 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -27,6 +27,7 @@ package repos import ( "errors" "io/ioutil" + "path/filepath" "strings" "github.com/AliceO2Group/Control/apricot" @@ -73,19 +74,13 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { } func (r *Repo) GetIdentifier() string { - identifier := r.HostingSite + "/" + r.User + "/" + r.RepoName + "/" - - return identifier + return filepath.Join(r.HostingSite, r.User, r.RepoName) } func (r *Repo) getCloneDir() string { rs := &RepoService{Svc: apricot.Instance()} cloneDir := rs.GetReposPath() - if cloneDir[len(cloneDir)-1:] != "/" { - cloneDir += "/" - } - - cloneDir += r.HostingSite + "/" + r.User + "/" +r.RepoName + cloneDir = filepath.Join(cloneDir, r.HostingSite, r.User, r.RepoName) return cloneDir } @@ -93,16 +88,9 @@ func (r *Repo) getCloneDir() string { func (r *Repo) getCloneParentDirs() []string { rs := &RepoService{Svc: apricot.Instance()} cleanDir := rs.GetReposPath() - if cleanDir[len(cleanDir)-1:] != "/" { - cleanDir += "/" - } - - cleanDirUser := cleanDir + - r.HostingSite + "/" + - r.User - cleanDirHostingSite := cleanDir + - r.HostingSite + cleanDirHostingSite := filepath.Join(cleanDir, r.HostingSite) + cleanDirUser := filepath.Join(cleanDirHostingSite, r.User) ret := make([]string, 2) ret[0] = cleanDirUser @@ -113,17 +101,20 @@ func (r *Repo) getCloneParentDirs() []string { func (r *Repo) getUrl() string { return "https://" + r.HostingSite + "/" + - r.User + "/" + - r.RepoName + ".git" + r.User + "/" + + r.RepoName + ".git" } func (r *Repo) getWorkflowDir() string { - return r.getCloneDir() + "/workflows/" + return filepath.Join(r.getCloneDir(), "workflows") } func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdentifier string) { if !strings.Contains(loadTaskClass, "/") { - taskClassIdentifier = r.HostingSite + "/" + r.User + "/" + r.RepoName + "/tasks/" + loadTaskClass + taskClassIdentifier = filepath.Join(r.HostingSite, + r.User, + r.RepoName, + loadTaskClass) } else { taskClassIdentifier = loadTaskClass } @@ -136,7 +127,11 @@ func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdenti func (r *Repo) ResolveSubworkflowTemplateIdentifier(workflowTemplateExpr string) string { expr := workflowTemplateExpr if !strings.Contains(expr, "/") { - expr = r.HostingSite + "/" + r.User + "/" + r.RepoName + "/workflows/" + expr + expr = filepath.Join(r.HostingSite, + r.User, + r.RepoName, + "workflows", + expr) } if !strings.Contains(expr, "@") { diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 4812fce20..80ec89cb2 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -149,10 +149,10 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ for _, repo := range someRepos { //sanitize path repoDir := manager.rService.GetReposPath() - utils.EnsureTrailingSlash(&repoDir) - repo = strings.TrimPrefix(repo, repoDir) - utils.EnsureTrailingSlash(&repo) - repos = append(repos, repo) + repo, err = filepath.Rel(repoDir, repo) // trim repoDir + if err == nil { + repos = append(repos, repo) + } } } } @@ -216,8 +216,6 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st manager.mutex.Lock() defer manager.mutex.Unlock() - utils.EnsureTrailingSlash(&repoPath) - if defaultRevision == "" { defaultRevision = manager.defaultRevision } @@ -389,8 +387,6 @@ func (manager *RepoManager) RefreshRepo(repoPath string) error { manager.mutex.Lock() defer manager.mutex.Unlock() - utils.EnsureTrailingSlash(&repoPath) - repo := manager.repoList[repoPath] return repo.refresh() @@ -454,7 +450,7 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP if !strings.HasSuffix(workflowFile, ".yaml") { //Add trailing ".yaml" workflowFile += ".yaml" } - resolvedWorkflowPath = workflowRepo.getWorkflowDir() + workflowFile + resolvedWorkflowPath = filepath.Join(workflowRepo.getWorkflowDir(), workflowFile) return } @@ -492,8 +488,6 @@ func (manager *RepoManager) UpdateDefaultRepoByIndex(index int) error { } func (manager *RepoManager) UpdateDefaultRepo(repoPath string) error { //unused - utils.EnsureTrailingSlash(&repoPath) - newDefaultRepo := manager.repoList[repoPath] if newDefaultRepo == nil { return errors.New("Repo not found") @@ -507,7 +501,6 @@ func (manager *RepoManager) UpdateDefaultRepo(repoPath string) error { //unused } func (manager *RepoManager) SetGlobalDefaultRevision(revision string) error { - // Update default_revision backend err := manager.rService.NewDefaultRevision(revision) if err != nil { diff --git a/go.mod b/go.mod index 9e4fcc80f..af1624f19 100644 --- a/go.mod +++ b/go.mod @@ -31,43 +31,29 @@ require ( github.com/aokoli/goutils v1.1.1 // indirect github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect github.com/armon/go-metrics v0.3.6 // indirect - github.com/beorn7/perks v1.0.1 // indirect github.com/bketelsen/crypt v0.0.3 // indirect github.com/briandowns/spinner v1.12.0 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect - github.com/cespare/xxhash/v2 v2.1.1 // indirect github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.25+incompatible // indirect - github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/deckarep/golang-set v1.7.1 // indirect github.com/denisbrodbeck/machineid v1.0.1 github.com/dustin/go-humanize v1.0.0 // indirect - github.com/emirpasic/gods v1.12.0 // indirect github.com/envoyproxy/go-control-plane v0.9.8 // indirect github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect github.com/fatih/color v1.10.0 github.com/flosch/pongo2/v4 v4.0.2 - github.com/fsnotify/fsnotify v1.4.9 // indirect - github.com/gdamore/tcell v1.4.0 // indirect github.com/gdamore/tcell/v2 v2.1.0 github.com/gliderlabs/ssh v0.3.0 // indirect - github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-git/v5 v5.2.0 github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 // indirect github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 - github.com/gogo/protobuf v1.2.1 // indirect - github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/mock v1.4.4 // indirect github.com/golang/protobuf v1.4.3 - github.com/google/go-cmp v0.5.4 // indirect - github.com/google/martian/v3 v3.1.0 // indirect - github.com/google/pprof v0.0.0-20210122040257-d980be63207e // indirect github.com/google/uuid v1.2.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect - github.com/gorilla/websocket v1.4.2 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect github.com/hashicorp/consul/api v1.8.1 @@ -81,28 +67,21 @@ require ( github.com/huandu/xstrings v1.3.2 // indirect github.com/imdario/mergo v0.3.11 github.com/jinzhu/copier v0.2.4 - github.com/json-iterator/go v1.1.10 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.3 // indirect - github.com/kr/text v0.2.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.2.0 github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.4 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mesos/mesos-go v0.0.11 github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/miekg/dns v1.1.29 // indirect github.com/mitchellh/copystructure v1.1.1 // indirect github.com/mitchellh/go-homedir v1.1.0 github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/naoina/toml v0.1.1 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/nxadm/tail v1.4.8 // indirect github.com/olekukonko/tablewriter v0.0.5 github.com/onsi/ginkgo v1.15.0 @@ -112,18 +91,14 @@ require ( github.com/osteele/tuesday v1.0.3 // indirect github.com/pborman/uuid v1.2.1 github.com/pelletier/go-toml v1.8.1 // indirect - github.com/pkg/errors v0.9.1 // indirect github.com/pkg/sftp v1.12.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/pressly/chi v0.0.0-00010101000000-000000000000 // indirect github.com/prometheus/client_golang v1.9.0 - github.com/prometheus/client_model v0.2.0 // indirect github.com/pseudomuto/protoc-gen-doc v1.4.1 github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 github.com/rs/xid v1.2.1 github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sanity-io/litter v1.2.0 // indirect - github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.7.0 github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.5.1 // indirect @@ -150,19 +125,13 @@ require ( golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect - golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect - golang.org/x/mod v0.4.1 // indirect golang.org/x/net v0.0.0-20210119194325-5f4716e94777 golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd // indirect - golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect - golang.org/x/text v0.3.5 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.1.0 // indirect google.golang.org/api v0.39.0 // indirect - google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea // indirect google.golang.org/grpc v1.35.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 @@ -171,8 +140,6 @@ require ( gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/osteele/liquid.v1 v1.2.4 // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b sigs.k8s.io/yaml v1.2.0 // indirect ) From 04b7e47fb0dc577371010c4880e0ab813f6c7edc Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 21 Apr 2021 17:05:32 +0300 Subject: [PATCH 0823/2352] [repos] Filter invalid repo dirs --- core/repos/repomanager.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 80ec89cb2..367fdfaeb 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -136,7 +136,18 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ return } + // A path is valid in this context if it is a dir and isn't hidden (e.g. .git) + isValidPath := func(path string) bool { + fileInfo, err := os.Stat(path) + if err == nil && fileInfo.IsDir() && fileInfo.Name()[0:1] != "." { + return true + } + return false + } + for _, hostingSite := range hostingSites { + // Get rid of invalid paths + if !isValidPath(hostingSite) { continue } usernames, err = filepath.Glob(hostingSite + "/*") if err != nil { return @@ -148,6 +159,8 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ } for _, repo := range someRepos { //sanitize path + // Get rid of invalid paths + if !isValidPath(repo) { continue } repoDir := manager.rService.GetReposPath() repo, err = filepath.Rel(repoDir, repo) // trim repoDir if err == nil { From c92a56156eff2925e963f9eae1f83d1f764507d3 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 21 Apr 2021 16:01:57 +0300 Subject: [PATCH 0824/2352] [repos] Only list public workflows by default --- coconut/protos/o2control.pb.go | 380 ++++++++++++++-------------- coconut/protos/o2control_grpc.pb.go | 12 +- common/utils/utils.go | 16 ++ core/protos/o2control.proto | 1 + core/repos/repo.go | 14 +- core/repos/repomanager.go | 6 +- core/server.go | 2 +- 7 files changed, 235 insertions(+), 196 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 4f1f283f1..f4085056a 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -3257,6 +3257,7 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3319,6 +3320,13 @@ func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { return false } +func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { + if x != nil { + return x.AllWorkflows + } + return false +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4515,7 +4523,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, @@ -4525,192 +4533,194 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, - 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, - 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, + 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, + 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, + 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, - 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index a87d3d87d..5af8aad73 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -416,7 +417,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -839,7 +840,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/common/utils/utils.go b/common/utils/utils.go index a0ec50c41..65db770bb 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -29,6 +29,7 @@ import ( "encoding/json" "fmt" "io" + "io/ioutil" "os" "strings" "time" @@ -141,3 +142,18 @@ func ParseExtraVars(extraVars string) (extraVarsMap map[string]string, err error } return } + +func IsFilePublicWorkflow(filePath string) bool { + yamlFile, err := ioutil.ReadFile(filePath) + if err != nil { return false } + return IsPublicWorkflow(yamlFile) +} + +func IsPublicWorkflow(yamlFile []byte) bool { + var nameNode struct { + Node yaml.Node `yaml:"name"` + } + err := yaml.Unmarshal(yamlFile, &nameNode) + if err != nil { return false } + return nameNode.Node.Tag == "!public" +} \ No newline at end of file diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 2b6037bce..45cd6a8cf 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -370,6 +370,7 @@ message GetWorkflowTemplatesRequest{ string revisionPattern = 2; bool allBranches = 3; bool allTags = 4; + bool allWorkflows = 5; } message WorkflowTemplateInfo { diff --git a/core/repos/repo.go b/core/repos/repo.go index 2a7c48b70..b8dea3d9a 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,6 +26,7 @@ package repos import ( "errors" + "github.com/AliceO2Group/Control/common/utils" "io/ioutil" "path/filepath" "strings" @@ -204,7 +205,7 @@ func (r *Repo) refresh() error { } // Returns a map of revision->[]templates for the repo -func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string) (TemplatesByRevision, error) { +func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflows bool) (TemplatesByRevision, error) { // Get a list of revisions (branches/tags/hash) that are matched by the revisionPattern; gitRefs filter branches and/or tags revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) if err != nil { @@ -226,14 +227,21 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string) (Templates return templates, err } for _, file := range files { - if strings.HasSuffix(file.Name(), ".yaml") { // Only return .yaml files - templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template(strings.TrimSuffix(file.Name(), ".yaml"))) + // Only return .yaml files + if strings.HasSuffix(file.Name(), ".yaml") { + // Check if workflow is public in case not allWorkflows requested + // and skip it if it isn't + if allWorkflows || (!allWorkflows && + utils.IsFilePublicWorkflow(filepath.Join(r.getWorkflowDir(), file.Name()))) { + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template(strings.TrimSuffix(file.Name(), ".yaml"))) + } } } } return templates, nil } + func (r*Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { var revisions []string diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 367fdfaeb..5d1393325 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -598,7 +598,7 @@ type TemplatesByRevision map[RevisionKey]Templates type TemplatesByRepo map[RepoKey]TemplatesByRevision // Returns a map of templates: repo -> revision -> []templates -func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool) (TemplatesByRepo, int, error) { +func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool) (TemplatesByRepo, int, error) { templateList := make(TemplatesByRepo) numTemplates := 0 @@ -644,9 +644,9 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat var templates TemplatesByRevision var err error if revisionPattern == "" { // If the revision pattern is empty, use the default revision - templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs) + templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows) } else { - templates, err = repo.getWorkflows(revisionPattern, gitRefs) + templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows) } if err != nil { diff --git a/core/server.go b/core/server.go index 86a17b6ac..705256e98 100644 --- a/core/server.go +++ b/core/server.go @@ -500,7 +500,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags()) + workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows()) if err != nil { return nil, status.New(codes.InvalidArgument, "cannot query available workflows for " + req.GetRepoPattern() + "@" + req.GetRevisionPattern() + ": " + err.Error()).Err() From 5ce3a458402e28d4b5cbd6b73aa3e3536acbb6c6 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 21 Apr 2021 18:01:02 +0300 Subject: [PATCH 0825/2352] [coconut] Update `templ list` with `--all-workflows` flag --- coconut/cmd/template_list.go | 4 +- coconut/control/control.go | 10 +- core/protos/o2control.pb.go | 380 ++++++++++++++++++----------------- 3 files changed, 206 insertions(+), 188 deletions(-) diff --git a/coconut/cmd/template_list.go b/coconut/cmd/template_list.go index b39e00daa..03c587793 100644 --- a/coconut/cmd/template_list.go +++ b/coconut/cmd/template_list.go @@ -38,10 +38,11 @@ var templateListCmd = &cobra.Command{ These workflow templates can then be loaded to create an environment. ` + "`coconut templ list` " + `can be called with -1) a combination of the ` + "`--repo` " + `, ` + "`--revision` " + `, ` + "`--all-branches` " + `, ` + "`--all-tags`" + `flags, or with +1) a combination of the ` + "`--repo` " + `, ` + "`--revision` " + `, ` + "`--all-branches` " + `, ` + "`--all-tags` " + `, ` + "`--all-workflows` " + `flags, or with 2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing.`, Example: ` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories + * ` + "`coconut templ list --all-workflows`" + ` lists all templates (including non-public ones) from the HEAD of master for all git repositories * ` + "`coconut templ list '*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * ` + "`coconut templ list '*@v*'`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories * ` + "`coconut templ list --repository='*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* @@ -61,4 +62,5 @@ func init() { templateListCmd.Flags().StringP("revision", "i", "", "revisions (branches/tags) to list templates from") templateListCmd.Flags().BoolP("all-branches", "b", false, "list templates from all branches") templateListCmd.Flags().BoolP("all-tags", "t", false, "list templates from all tags") + templateListCmd.Flags().BoolP("all-workflows", "a", false, "list all templates, even non-public ones") } \ No newline at end of file diff --git a/coconut/control/control.go b/coconut/control/control.go index f4b5c0983..8fc3d4fe2 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -47,11 +47,11 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/briandowns/spinner" "github.com/olekukonko/tablewriter" + "github.com/rs/xid" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" "google.golang.org/grpc" - "github.com/rs/xid" ) const( @@ -660,6 +660,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob revisionPattern := "" // Let the API take care of defaults allBranches := false allTags := false + allWorkflows := false if len(args) == 0 { repoPattern, err = cmd.Flags().GetString("repository") @@ -682,6 +683,11 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob return } + allWorkflows, err = cmd.Flags().GetBool("all-workflows") + if err != nil { + return + } + if allBranches || allTags { if revisionPattern != "" { fmt.Fprintln(o, "Ignoring `--all-{branches,tags}` flags, as a valid revision has been specified") @@ -730,7 +736,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob var response *pb.GetWorkflowTemplatesReply response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{RepoPattern: repoPattern, RevisionPattern: revisionPattern, - AllBranches: allBranches, AllTags: allTags}, grpc.EmptyCallOption{}) + AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows}, grpc.EmptyCallOption{}) if err != nil { return err } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 4f1f283f1..f4085056a 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -3257,6 +3257,7 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3319,6 +3320,13 @@ func (x *GetWorkflowTemplatesRequest) GetAllTags() bool { return false } +func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { + if x != nil { + return x.AllWorkflows + } + return false +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4515,7 +4523,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x22, 0xa5, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, @@ -4525,192 +4533,194 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, - 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, - 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, 0x0e, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, + 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, + 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, + 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, + 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, - 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2f, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 25dbf03aed25ad526d619ba76f65c92d7fea5dbb Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 23 Apr 2021 11:02:44 +0300 Subject: [PATCH 0826/2352] [repos] Add missing "tasks" --- core/repos/repo.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/repos/repo.go b/core/repos/repo.go index b8dea3d9a..f6c651999 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -115,6 +115,7 @@ func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdenti taskClassIdentifier = filepath.Join(r.HostingSite, r.User, r.RepoName, + "tasks", loadTaskClass) } else { taskClassIdentifier = loadTaskClass From 8b87b72575fbce83afe73e5174c9176d55ec249e Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 23 Apr 2021 11:03:36 +0300 Subject: [PATCH 0827/2352] [repos] Use path instead of filePath for repo identifier --- core/repos/repo.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index f6c651999..d693e5086 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -28,6 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/utils" "io/ioutil" + "path" "path/filepath" "strings" @@ -75,7 +76,7 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { } func (r *Repo) GetIdentifier() string { - return filepath.Join(r.HostingSite, r.User, r.RepoName) + return path.Join(r.HostingSite, r.User, r.RepoName) } func (r *Repo) getCloneDir() string { From 3a078d807922f4678187766c527e37a2ad2f68f8 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 23 Apr 2021 11:04:34 +0300 Subject: [PATCH 0828/2352] [task] Consistent TaskClassIdentifier string construction --- core/task/class.go | 2 +- core/task/manager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 9764638c5..033ce0dc3 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -140,7 +140,7 @@ type TaskClassIdentifier struct { } func (tcID TaskClassIdentifier) String() string { - return fmt.Sprintf("%stasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) + return fmt.Sprintf("%s/tasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) } func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { diff --git a/core/task/manager.go b/core/task/manager.go index aa09b989a..906bd2195 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -173,7 +173,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" var repo *repos.Repo - repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks/")[0], repoManager.GetDefaultRevision()) + repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision()) if err != nil { return } From 149020624717676c80dd7cc176e51cd31491788c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 23 Apr 2021 17:55:14 +0200 Subject: [PATCH 0829/2352] [core] Generate strings for system.ID enum values with enumer --- Makefile | 2 +- common/{systemid => system}/systemid.go | 55 +++--- common/system/systemid_strings.go | 253 ++++++++++++++++++++++++ common/tools/tools.go | 8 +- go.mod | 6 +- go.sum | 10 + walnut/schemata/schemata.go | 2 +- 7 files changed, 304 insertions(+), 32 deletions(-) rename common/{systemid => system}/systemid.go (72%) create mode 100644 common/system/systemid_strings.go diff --git a/Makefile b/Makefile index ebce26425..b331db870 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target diff --git a/common/systemid/systemid.go b/common/system/systemid.go similarity index 72% rename from common/systemid/systemid.go rename to common/system/systemid.go index dcf9d8c4d..2a66010a9 100644 --- a/common/systemid/systemid.go +++ b/common/system/systemid.go @@ -23,48 +23,49 @@ */ -package systemid +package system // Source: https://alice-notes.web.cern.ch/system/files/notes/public/1052/2020-07-15-2020-07-07-O2_Report_Identification_of_sources_for_ALICE_data.pdf // System ID mapping on page 3 -// FIXME: use stringer/enumer on this one -const ( +//go:generate go run github.com/dmarkham/enumer -type=ID -yaml -json -text -transform=upper -output=systemid_strings.go +type ID int +const ( // 1 // 2 - TPC = 3 - TRD = 4 - TOF = 5 - HMP = 6 - PHS = 7 - CPV = 8 + TPC ID = 3 + TRD ID = 4 + TOF ID = 5 + HMP ID = 6 + PHS ID = 7 + CPV ID = 8 // 9 - MCH = 10 + MCH ID = 10 // 11-14 - ZDC = 15 + ZDC ID = 15 // 16 - TRG = 17 - EMC = 18 - TST = 19 + TRG ID = 17 + EMC ID = 18 + TST ID = 19 // 20-31 - ITS = 32 - FDD = 33 - FT0 = 34 - FV0 = 35 - MFT = 36 - MID = 37 - DCS = 38 - FOC = 39 + ITS ID = 32 + FDD ID = 33 + FT0 ID = 34 + FV0 ID = 35 + MFT ID = 36 + MID ID = 37 + DCS ID = 38 + FOC ID = 39 - FIT = 254 // non-standard mapping: FT0 + FV0 = FIT - NIL = 255 + FIT ID = 254 // non-standard mapping: FT0 + FV0 = FIT + NIL ID = 255 ) // Additional non-standard system IDs const ( - FLP = -1 - EPN = -2 - PDP = -3 + FLP ID = -1 + EPN ID = -2 + PDP ID = -3 ) \ No newline at end of file diff --git a/common/system/systemid_strings.go b/common/system/systemid_strings.go new file mode 100644 index 000000000..5ccecf525 --- /dev/null +++ b/common/system/systemid_strings.go @@ -0,0 +1,253 @@ +// Code generated by "enumer -type=ID -yaml -json -text -transform=upper -output=systemid_strings.go"; DO NOT EDIT. + +package system + +import ( + "encoding/json" + "fmt" + "strings" +) + +const ( + _IDName_0 = "PDPEPNFLP" + _IDLowerName_0 = "pdpepnflp" + _IDName_1 = "TPCTRDTOFHMPPHSCPV" + _IDLowerName_1 = "tpctrdtofhmpphscpv" + _IDName_2 = "MCH" + _IDLowerName_2 = "mch" + _IDName_3 = "ZDC" + _IDLowerName_3 = "zdc" + _IDName_4 = "TRGEMCTST" + _IDLowerName_4 = "trgemctst" + _IDName_5 = "ITSFDDFT0FV0MFTMIDDCSFOC" + _IDLowerName_5 = "itsfddft0fv0mftmiddcsfoc" + _IDName_6 = "FITNIL" + _IDLowerName_6 = "fitnil" +) + +var ( + _IDIndex_0 = [...]uint8{0, 3, 6, 9} + _IDIndex_1 = [...]uint8{0, 3, 6, 9, 12, 15, 18} + _IDIndex_2 = [...]uint8{0, 3} + _IDIndex_3 = [...]uint8{0, 3} + _IDIndex_4 = [...]uint8{0, 3, 6, 9} + _IDIndex_5 = [...]uint8{0, 3, 6, 9, 12, 15, 18, 21, 24} + _IDIndex_6 = [...]uint8{0, 3, 6} +) + +func (i ID) String() string { + switch { + case -3 <= i && i <= -1: + i -= -3 + return _IDName_0[_IDIndex_0[i]:_IDIndex_0[i+1]] + case 3 <= i && i <= 8: + i -= 3 + return _IDName_1[_IDIndex_1[i]:_IDIndex_1[i+1]] + case i == 10: + return _IDName_2 + case i == 15: + return _IDName_3 + case 17 <= i && i <= 19: + i -= 17 + return _IDName_4[_IDIndex_4[i]:_IDIndex_4[i+1]] + case 32 <= i && i <= 39: + i -= 32 + return _IDName_5[_IDIndex_5[i]:_IDIndex_5[i+1]] + case 254 <= i && i <= 255: + i -= 254 + return _IDName_6[_IDIndex_6[i]:_IDIndex_6[i+1]] + default: + return fmt.Sprintf("ID(%d)", i) + } +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _IDNoOp() { + var x [1]struct{} + _ = x[PDP-(-3)] + _ = x[EPN-(-2)] + _ = x[FLP-(-1)] + _ = x[TPC-(3)] + _ = x[TRD-(4)] + _ = x[TOF-(5)] + _ = x[HMP-(6)] + _ = x[PHS-(7)] + _ = x[CPV-(8)] + _ = x[MCH-(10)] + _ = x[ZDC-(15)] + _ = x[TRG-(17)] + _ = x[EMC-(18)] + _ = x[TST-(19)] + _ = x[ITS-(32)] + _ = x[FDD-(33)] + _ = x[FT0-(34)] + _ = x[FV0-(35)] + _ = x[MFT-(36)] + _ = x[MID-(37)] + _ = x[DCS-(38)] + _ = x[FOC-(39)] + _ = x[FIT-(254)] + _ = x[NIL-(255)] +} + +var _IDValues = []ID{PDP, EPN, FLP, TPC, TRD, TOF, HMP, PHS, CPV, MCH, ZDC, TRG, EMC, TST, ITS, FDD, FT0, FV0, MFT, MID, DCS, FOC, FIT, NIL} + +var _IDNameToValueMap = map[string]ID{ + _IDName_0[0:3]: PDP, + _IDLowerName_0[0:3]: PDP, + _IDName_0[3:6]: EPN, + _IDLowerName_0[3:6]: EPN, + _IDName_0[6:9]: FLP, + _IDLowerName_0[6:9]: FLP, + _IDName_1[0:3]: TPC, + _IDLowerName_1[0:3]: TPC, + _IDName_1[3:6]: TRD, + _IDLowerName_1[3:6]: TRD, + _IDName_1[6:9]: TOF, + _IDLowerName_1[6:9]: TOF, + _IDName_1[9:12]: HMP, + _IDLowerName_1[9:12]: HMP, + _IDName_1[12:15]: PHS, + _IDLowerName_1[12:15]: PHS, + _IDName_1[15:18]: CPV, + _IDLowerName_1[15:18]: CPV, + _IDName_2[0:3]: MCH, + _IDLowerName_2[0:3]: MCH, + _IDName_3[0:3]: ZDC, + _IDLowerName_3[0:3]: ZDC, + _IDName_4[0:3]: TRG, + _IDLowerName_4[0:3]: TRG, + _IDName_4[3:6]: EMC, + _IDLowerName_4[3:6]: EMC, + _IDName_4[6:9]: TST, + _IDLowerName_4[6:9]: TST, + _IDName_5[0:3]: ITS, + _IDLowerName_5[0:3]: ITS, + _IDName_5[3:6]: FDD, + _IDLowerName_5[3:6]: FDD, + _IDName_5[6:9]: FT0, + _IDLowerName_5[6:9]: FT0, + _IDName_5[9:12]: FV0, + _IDLowerName_5[9:12]: FV0, + _IDName_5[12:15]: MFT, + _IDLowerName_5[12:15]: MFT, + _IDName_5[15:18]: MID, + _IDLowerName_5[15:18]: MID, + _IDName_5[18:21]: DCS, + _IDLowerName_5[18:21]: DCS, + _IDName_5[21:24]: FOC, + _IDLowerName_5[21:24]: FOC, + _IDName_6[0:3]: FIT, + _IDLowerName_6[0:3]: FIT, + _IDName_6[3:6]: NIL, + _IDLowerName_6[3:6]: NIL, +} + +var _IDNames = []string{ + _IDName_0[0:3], + _IDName_0[3:6], + _IDName_0[6:9], + _IDName_1[0:3], + _IDName_1[3:6], + _IDName_1[6:9], + _IDName_1[9:12], + _IDName_1[12:15], + _IDName_1[15:18], + _IDName_2[0:3], + _IDName_3[0:3], + _IDName_4[0:3], + _IDName_4[3:6], + _IDName_4[6:9], + _IDName_5[0:3], + _IDName_5[3:6], + _IDName_5[6:9], + _IDName_5[9:12], + _IDName_5[12:15], + _IDName_5[15:18], + _IDName_5[18:21], + _IDName_5[21:24], + _IDName_6[0:3], + _IDName_6[3:6], +} + +// IDString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func IDString(s string) (ID, error) { + if val, ok := _IDNameToValueMap[s]; ok { + return val, nil + } + s = strings.ToLower(s) + if val, ok := _IDNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to ID values", s) +} + +// IDValues returns all values of the enum +func IDValues() []ID { + return _IDValues +} + +// IDStrings returns a slice of all String values of the enum +func IDStrings() []string { + strs := make([]string, len(_IDNames)) + copy(strs, _IDNames) + return strs +} + +// IsAID returns "true" if the value is listed in the enum definition. "false" otherwise +func (i ID) IsAID() bool { + for _, v := range _IDValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for ID +func (i ID) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for ID +func (i *ID) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("ID should be a string, got %s", data) + } + + var err error + *i, err = IDString(s) + return err +} + +// MarshalText implements the encoding.TextMarshaler interface for ID +func (i ID) MarshalText() ([]byte, error) { + return []byte(i.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for ID +func (i *ID) UnmarshalText(text []byte) error { + var err error + *i, err = IDString(string(text)) + return err +} + +// MarshalYAML implements a YAML Marshaler for ID +func (i ID) MarshalYAML() (interface{}, error) { + return i.String(), nil +} + +// UnmarshalYAML implements a YAML Unmarshaler for ID +func (i *ID) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + var err error + *i, err = IDString(s) + return err +} diff --git a/common/tools/tools.go b/common/tools/tools.go index 9c74802ba..390f9e117 100644 --- a/common/tools/tools.go +++ b/common/tools/tools.go @@ -29,8 +29,12 @@ package tools import ( + _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" + _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" + // protocol buffer compiler plugins _ "google.golang.org/protobuf/cmd/protoc-gen-go" - _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" - _ "github.com/pseudomuto/protoc-gen-doc/cmd/protoc-gen-doc" + + // enumer + _ "github.com/dmarkham/enumer" ) \ No newline at end of file diff --git a/go.mod b/go.mod index af1624f19..a30b13985 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/deckarep/golang-set v1.7.1 // indirect github.com/denisbrodbeck/machineid v1.0.1 + github.com/dmarkham/enumer v1.5.2 github.com/dustin/go-humanize v1.0.0 // indirect github.com/envoyproxy/go-control-plane v0.9.8 // indirect github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect @@ -89,6 +90,7 @@ require ( github.com/osamingo/indigo v1.1.0 github.com/osteele/liquid v1.2.4 // indirect github.com/osteele/tuesday v1.0.3 // indirect + github.com/pascaldekloe/name v1.0.1 // indirect github.com/pborman/uuid v1.2.1 github.com/pelletier/go-toml v1.8.1 // indirect github.com/pkg/sftp v1.12.0 // indirect @@ -126,9 +128,11 @@ require ( golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect + golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20210119194325-5f4716e94777 golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd // indirect - golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c + golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect + golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect google.golang.org/api v0.39.0 // indirect diff --git a/go.sum b/go.sum index eb403c734..202254214 100644 --- a/go.sum +++ b/go.sum @@ -246,6 +246,8 @@ github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbj github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/dmarkham/enumer v1.5.2 h1:dZxvuDqF8oL1fg9vxp1TjqHJ0JSL9ADU+hHbisgsRB8= +github.com/dmarkham/enumer v1.5.2/go.mod h1:jZ3PNbNJDEkFGx54MlkSjnDQUo7445l7/guoKdh9cY8= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -770,6 +772,9 @@ github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIw github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= +github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0= +github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= @@ -1127,6 +1132,8 @@ golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hM golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= +golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1284,6 +1291,8 @@ golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1350,6 +1359,7 @@ golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index 65d00d22d..31334c440 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -432,7 +432,7 @@ Workflow = ` "description": "Variable definitions: defaults, overridden by anything" }, "vars": { - "type": "string", + "type": "object", "title": "User variable definitions", "description": "Variable definitions: vars, override defaults, overridden by user vars." } From b2624b85b756f3b5e5fb3cb1601ed22bd194eb60 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 11:49:57 +0300 Subject: [PATCH 0830/2352] [repos] Care for missing trailing slash in repolist --- core/repos/repomanager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 5d1393325..f34ad337e 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -431,7 +431,7 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP // Resolve repo var workflowFile string - workflowInfo := strings.Split(workflowPath, "workflows/") + workflowInfo := strings.Split(workflowPath, "/workflows/") if len(workflowInfo) == 1 { // Repo not specified workflowRepo = manager.defaultRepo workflowFile = workflowInfo[0] From 98f8c404b80451f23404d0f1f82a650b6d032d20 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Apr 2021 11:31:44 +0200 Subject: [PATCH 0831/2352] [core] Reconnect all plugins continuously --- core/integration/dcs/client.go | 29 +++++++++++++++++++++++++++-- core/integration/ddsched/client.go | 28 ++++++++++++++++++++++++++-- core/integration/odc/client.go | 26 ++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 6 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 506ac6266..99bf30ff0 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -26,12 +26,14 @@ package dcs import ( "context" + "time" "github.com/AliceO2Group/Control/common/logger" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" ) @@ -41,6 +43,7 @@ var log = logger.New(logrus.StandardLogger(),"dcsclient") type RpcClient struct { dcspb.ConfiguratorClient conn *grpc.ClientConn + cancel context.CancelFunc } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { @@ -50,11 +53,20 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) dialOptions := []grpc.DialOption { grpc.WithInsecure(), - grpc.WithBlock(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 15 * time.Second, + }, + MinConnectTimeout: 15 * time.Second, + }), } if !viper.GetBool("dcsServiceUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) } + conn, err := grpc.DialContext(cxt, endpoint, dialOptions..., @@ -66,11 +78,23 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } - log.Debug("DCS client connected") + + go func() { + connState := connectivity.Idle + for { + ok := conn.WaitForStateChange(cxt, connState) + if !ok { + return + } + connState = conn.GetState() + log.Debugf("DCS client %s", connState.String()) + } + }() client := &RpcClient { ConfiguratorClient: dcspb.NewConfiguratorClient(conn), conn: conn, + cancel: cancel, } return client @@ -84,5 +108,6 @@ func (m *RpcClient) GetConnState() connectivity.State { } func (m *RpcClient) Close() error { + m.cancel() return m.conn.Close() } \ No newline at end of file diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index bcf438e2e..4f26a1586 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -26,12 +26,14 @@ package ddsched import ( "context" + "time" "github.com/AliceO2Group/Control/common/logger" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" ) @@ -41,6 +43,7 @@ var log = logger.New(logrus.StandardLogger(),"ddschedclient") type RpcClient struct { ddpb.DataDistributionControlClient conn *grpc.ClientConn + cancel context.CancelFunc } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { @@ -50,7 +53,15 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) dialOptions := []grpc.DialOption { grpc.WithInsecure(), - grpc.WithBlock(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 15 * time.Second, + }, + MinConnectTimeout: 15 * time.Second, + }), } if !viper.GetBool("ddSchedulerUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) @@ -66,11 +77,23 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } - log.Debug("DD scheduler client connected") + + go func() { + connState := connectivity.Idle + for { + ok := conn.WaitForStateChange(cxt, connState) + if !ok { + return + } + connState = conn.GetState() + log.Debugf("DD scheduler client %s", connState.String()) + } + }() client := &RpcClient { DataDistributionControlClient: ddpb.NewDataDistributionControlClient(conn), conn: conn, + cancel: cancel, } return client @@ -84,5 +107,6 @@ func (m *RpcClient) GetConnState() connectivity.State { } func (m *RpcClient) Close() error { + m.cancel() return m.conn.Close() } \ No newline at end of file diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go index 89aee154c..51854a7f0 100644 --- a/core/integration/odc/client.go +++ b/core/integration/odc/client.go @@ -26,12 +26,14 @@ package odc import ( "context" + "time" "github.com/AliceO2Group/Control/common/logger" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" ) @@ -41,6 +43,7 @@ var log = logger.New(logrus.StandardLogger(),"odcclient") type RpcClient struct { odcpb.ODCClient conn *grpc.ClientConn + cancel context.CancelFunc } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { @@ -50,7 +53,15 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) dialOptions := []grpc.DialOption { grpc.WithInsecure(), - grpc.WithBlock(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 15 * time.Second, + }, + MinConnectTimeout: 15 * time.Second, + }), } if !viper.GetBool("odcUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) @@ -66,7 +77,18 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } - log.Debug("ODC client connected") + + go func() { + connState := connectivity.Idle + for { + ok := conn.WaitForStateChange(cxt, connState) + if !ok { + return + } + connState = conn.GetState() + log.Debugf("ODC client %s", connState.String()) + } + }() client := &RpcClient { ODCClient: odcpb.NewODCClient(conn), From 81014f3849c9cd9a105a715879e23b004c4c6911 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Apr 2021 14:33:39 +0200 Subject: [PATCH 0832/2352] [core] Use keepalive with backoff for gRPC clients --- core/integration/dcs/client.go | 32 +++++++++++++++++++++++------ core/integration/dcs/plugin.go | 6 +++--- core/integration/ddsched/client.go | 32 +++++++++++++++++++++++------ core/integration/ddsched/plugin.go | 5 ++--- core/integration/odc/client.go | 33 ++++++++++++++++++++++++------ core/integration/odc/plugin.go | 5 ++--- 6 files changed, 86 insertions(+), 27 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 99bf30ff0..393f78d05 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -35,6 +35,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" ) var log = logger.New(logrus.StandardLogger(),"dcsclient") @@ -58,9 +59,14 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, - MaxDelay: 15 * time.Second, + MaxDelay: 20 * time.Second, }, - MinConnectTimeout: 15 * time.Second, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, }), } if !viper.GetBool("dcsServiceUseSystemProxy") { @@ -81,13 +87,27 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) go func() { connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + for { - ok := conn.WaitForStateChange(cxt, connState) - if !ok { + select { + case ok := <- stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("DCS client %s", connState.String()) + go notifyFunc(connState) + case <- time.After(2 * time.Minute): + conn.ResetConnectBackoff() + case <- cxt.Done(): return } - connState = conn.GetState() - log.Debugf("DCS client %s", connState.String()) } }() diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c4a3ad7a3..09c4c9cf0 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -45,7 +45,7 @@ import ( "google.golang.org/grpc/connectivity" ) -const DCS_DIAL_TIMEOUT = 2 * time.Second +const DCS_DIAL_TIMEOUT = 2 * time.Hour type Plugin struct { dcsHost string @@ -80,8 +80,7 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { - callTimeout := DCS_DIAL_TIMEOUT - cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + cxt, cancel := context.WithCancel(context.Background()) p.dcsClient = NewClient(cxt, cancel, viper.GetString("dcsServiceEndpoint")) if p.dcsClient == nil { return fmt.Errorf("failed to connect to DCS service on %s", viper.GetString("dcsServiceEndpoint")) @@ -108,6 +107,7 @@ func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { return fmt.Errorf("failed to start DCS client on %s", viper.GetString("dcsServiceEndpoint")) } + log.Debug("DCS plugin initialized") return nil } diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 4f26a1586..165566721 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -35,6 +35,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" ) var log = logger.New(logrus.StandardLogger(),"ddschedclient") @@ -58,9 +59,14 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, - MaxDelay: 15 * time.Second, + MaxDelay: 20 * time.Second, }, - MinConnectTimeout: 15 * time.Second, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, }), } if !viper.GetBool("ddSchedulerUseSystemProxy") { @@ -80,13 +86,27 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) go func() { connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + for { - ok := conn.WaitForStateChange(cxt, connState) - if !ok { + select { + case ok := <- stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("DD scheduler client %s", connState.String()) + go notifyFunc(connState) + case <- time.After(2 * time.Minute): + conn.ResetConnectBackoff() + case <- cxt.Done(): return } - connState = conn.GetState() - log.Debugf("DD scheduler client %s", connState.String()) } }() diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 50a0e88b1..89eeb5a84 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -82,13 +82,12 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(_ string) error { if p.ddSchedClient == nil { - callTimeout := DDSCHED_DIAL_TIMEOUT - cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + cxt, cancel := context.WithCancel(context.Background()) p.ddSchedClient = NewClient(cxt, cancel, viper.GetString("ddSchedulerEndpoint")) if p.ddSchedClient == nil { return fmt.Errorf("failed to connect to DD scheduler service on %s", viper.GetString("ddSchedulerEndpoint")) } - log.Debug("DD scheduler plugin ready") + log.Debug("DD scheduler plugin initialized") } return nil } diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go index 51854a7f0..82a5b973a 100644 --- a/core/integration/odc/client.go +++ b/core/integration/odc/client.go @@ -35,6 +35,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" ) var log = logger.New(logrus.StandardLogger(),"odcclient") @@ -58,9 +59,14 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, - MaxDelay: 15 * time.Second, + MaxDelay: 20 * time.Second, }, - MinConnectTimeout: 15 * time.Second, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, }), } if !viper.GetBool("odcUseSystemProxy") { @@ -80,13 +86,27 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) go func() { connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + for { - ok := conn.WaitForStateChange(cxt, connState) - if !ok { + select { + case ok := <- stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("ODC client %s", connState.String()) + go notifyFunc(connState) + case <- time.After(2 * time.Minute): + conn.ResetConnectBackoff() + case <- cxt.Done(): return } - connState = conn.GetState() - log.Debugf("ODC client %s", connState.String()) } }() @@ -106,5 +126,6 @@ func (m *RpcClient) GetConnState() connectivity.State { } func (m *RpcClient) Close() error { + m.cancel() return m.conn.Close() } \ No newline at end of file diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index bfdb944ea..ad858c93b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -73,13 +73,12 @@ func (p *Plugin) GetName() string { func (p *Plugin) Init(_ string) error { if p.odcClient == nil { - callTimeout := ODC_DIAL_TIMEOUT - cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + cxt, cancel := context.WithCancel(context.Background()) p.odcClient = NewClient(cxt, cancel, viper.GetString("odcEndpoint")) if p.odcClient == nil { return fmt.Errorf("failed to connect to ODC service on %s", viper.GetString("ddSchedulerEndpoint")) } - log.Debug("ODC plugin ready") + log.Debug("ODC plugin initialized") } return nil } From 736d5721572cb0261901fb3e4b543fb04470c682 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Apr 2021 14:34:18 +0200 Subject: [PATCH 0833/2352] [core] Regenerate protofiles --- coconut/protos/o2control.pb.go | 2 +- coconut/protos/o2control_grpc.pb.go | 12 ++++-------- core/protos/o2control.pb.go | 2 +- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index f4085056a..bd6a77f4d 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.15.7 // source: protos/o2control.proto package pb diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 5af8aad73..a87d3d87d 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +51,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +272,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -417,7 +416,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -840,10 +839,7 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index f4085056a..bd6a77f4d 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.15.7 // source: protos/o2control.proto package pb From a72bdd3535ea04edfb525aaea603c3f8c5dc8d34 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Thu, 18 Mar 2021 18:52:15 +0100 Subject: [PATCH 0834/2352] First uncomplete attempt at creating a Web Api for Apricot. --- apricot/local/service.go | 89 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/apricot/local/service.go b/apricot/local/service.go index 5c1bb57c1..e52468386 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -29,6 +29,7 @@ import ( "errors" "fmt" "io/ioutil" + "net/http" "net/url" "os" "path/filepath" @@ -42,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" "github.com/flosch/pongo2/v4" + "github.com/gorilla/mux" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -52,9 +54,96 @@ type Service struct { src cfgbackend.Source } +type machineInfo struct { + name string +} + +type clusterInfo struct { + FLPs []machineInfo +} + +// Just a skeleton of a function for getting FLP names if relevant +/*func queryMachines(cluster *clusterInfo) error { + for rows.Next() { + machine := machineInfo{} + err = rows.Scan(&machineInfo.name) + if err != nil { + return err + } + cluster.FLPs = append(cluster.FLPs, machine) + } + err = rows.Err() + if err != nil { + return err + } + return nil +}*/ + +func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { + queryParam := mux.Vars(r) + format := "" + var err error + format, err = queryParam["format"] + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, format is not readable.") + return + } + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + //TODO: write JSON + /* where to get info? depending on answer, could proceed like: + + cluster := clusterInfo{} + err := queryMachines(&cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, no result in cluster.") + } + answer, err := json.Marshal(cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, result could not be given.") + } + fmt.Fprintf(w, string(answer)) + */ + case "text": + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + //TODO: write plain text + /* something like: ??? + data, _ := ioutil.ReadAll(response.Body) + fmt.Println(string(data)) + */ + default: + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "Error, format should be json or text.") + } +} + +func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not handled. Request should be of type GET.") +} + +func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not found.") +} + func NewService(uri string) (svc *Service, err error) { var src cfgbackend.Source src, err = cfgbackend.NewSource(uri) + router := mux.NewRouter() + webApi := router.PathPrefix("/inventory/flps").Subrouter() + webApi.HandleFunc("/{format}", ApiGetClusterInformation).Methods(http.MethodGet) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) + webApi.HandleFunc("", ApiRequestNotFound) + log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") return &Service{ src: src, }, err From ddcf41bdd4cfba7bb1648bc2e51873211d8b143d Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Mon, 22 Mar 2021 10:18:24 +0100 Subject: [PATCH 0835/2352] Tab indentation is now replaced by spaces. --- apricot/local/service.go | 138 +++++++++++++++++++-------------------- 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index e52468386..9ec95f3bc 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -51,102 +51,102 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") type Service struct { - src cfgbackend.Source + src cfgbackend.Source } type machineInfo struct { - name string + name string } type clusterInfo struct { - FLPs []machineInfo + FLPs []machineInfo } // Just a skeleton of a function for getting FLP names if relevant /*func queryMachines(cluster *clusterInfo) error { - for rows.Next() { - machine := machineInfo{} - err = rows.Scan(&machineInfo.name) - if err != nil { - return err - } - cluster.FLPs = append(cluster.FLPs, machine) - } - err = rows.Err() - if err != nil { - return err - } - return nil + for rows.Next() { + machine := machineInfo{} + err = rows.Scan(&machineInfo.name) + if err != nil { + return err + } + cluster.FLPs = append(cluster.FLPs, machine) + } + err = rows.Err() + if err != nil { + return err + } + return nil }*/ func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { - queryParam := mux.Vars(r) + queryParam := mux.Vars(r) format := "" var err error - format, err = queryParam["format"] - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, format is not readable.") - return - } - switch format { - case "json": - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - //TODO: write JSON - /* where to get info? depending on answer, could proceed like: - - cluster := clusterInfo{} - err := queryMachines(&cluster) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, no result in cluster.") - } - answer, err := json.Marshal(cluster) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, result could not be given.") - } - fmt.Fprintf(w, string(answer)) - */ - case "text": - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - //TODO: write plain text - /* something like: ??? - data, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(data)) - */ - default: - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "Error, format should be json or text.") - } + format, err = queryParam["format"] + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, format is not readable.") + return + } + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + //TODO: write JSON + /* where to get info? depending on answer, could proceed like: + + cluster := clusterInfo{} + err := queryMachines(&cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, no result in cluster.") + } + answer, err := json.Marshal(cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, result could not be given.") + } + fmt.Fprintf(w, string(answer)) + */ + case "text": + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + //TODO: write plain text + /* something like: ??? + data, _ := ioutil.ReadAll(response.Body) + fmt.Println(string(data)) + */ + default: + w.WriteHeader(http.StatusBadRequest) + fmt.Fprintf(w, "Error, format should be json or text.") + } } func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not handled. Request should be of type GET.") + fmt.Fprintf(w, "Request not handled. Request should be of type GET.") } func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not found.") + fmt.Fprintf(w, "Request not found.") } func NewService(uri string) (svc *Service, err error) { - var src cfgbackend.Source - src, err = cfgbackend.NewSource(uri) - router := mux.NewRouter() - webApi := router.PathPrefix("/inventory/flps").Subrouter() + var src cfgbackend.Source + src, err = cfgbackend.NewSource(uri) + router := mux.NewRouter() + webApi := router.PathPrefix("/inventory/flps").Subrouter() webApi.HandleFunc("/{format}", ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) - webApi.HandleFunc("", ApiRequestNotFound) - log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") - return &Service{ - src: src, - }, err + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) + webApi.HandleFunc("", ApiRequestNotFound) + log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") + return &Service{ + src: src, + }, err } func (s *Service) NewRunNumber() (runNumber uint32, err error) { From 694916dbbcdfe1c07a9e4420e951edeb9166ab1e Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Mon, 22 Mar 2021 10:53:14 +0100 Subject: [PATCH 0836/2352] Default format for getting the cluster info is ext. --- apricot/local/service.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 9ec95f3bc..54b22b552 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -85,9 +85,7 @@ func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { var err error format, err = queryParam["format"] if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, format is not readable.") - return + format = "text" } switch format { case "json": @@ -118,8 +116,13 @@ func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { fmt.Println(string(data)) */ default: - w.WriteHeader(http.StatusBadRequest) - fmt.Fprintf(w, "Error, format should be json or text.") + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + //TODO: write plain text + /* something like: ??? + data, _ := ioutil.ReadAll(response.Body) + fmt.Println(string(data)) + */ } } From 369470d689633f3737cc41cab220aaf260c3586f Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 23 Mar 2021 09:25:36 +0100 Subject: [PATCH 0837/2352] Apricot's new Http service is separated from the already existing service. --- apricot/apricot.go | 1 + apricot/local/service.go | 90 --------------------- apricot/local/servicehttp.go | 153 +++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+), 90 deletions(-) create mode 100644 apricot/local/servicehttp.go diff --git a/apricot/apricot.go b/apricot/apricot.go index 68c849e87..7ef8c78cd 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -46,6 +46,7 @@ func Run() (err error) { log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) + local.NewHttpService(Instance()) signals(s) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) diff --git a/apricot/local/service.go b/apricot/local/service.go index 54b22b552..a6e0eb48b 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -54,99 +54,9 @@ type Service struct { src cfgbackend.Source } -type machineInfo struct { - name string -} - -type clusterInfo struct { - FLPs []machineInfo -} - -// Just a skeleton of a function for getting FLP names if relevant -/*func queryMachines(cluster *clusterInfo) error { - for rows.Next() { - machine := machineInfo{} - err = rows.Scan(&machineInfo.name) - if err != nil { - return err - } - cluster.FLPs = append(cluster.FLPs, machine) - } - err = rows.Err() - if err != nil { - return err - } - return nil -}*/ - -func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { - queryParam := mux.Vars(r) - format := "" - var err error - format, err = queryParam["format"] - if err != nil { - format = "text" - } - switch format { - case "json": - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - //TODO: write JSON - /* where to get info? depending on answer, could proceed like: - - cluster := clusterInfo{} - err := queryMachines(&cluster) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, no result in cluster.") - } - answer, err := json.Marshal(cluster) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, result could not be given.") - } - fmt.Fprintf(w, string(answer)) - */ - case "text": - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - //TODO: write plain text - /* something like: ??? - data, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(data)) - */ - default: - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - //TODO: write plain text - /* something like: ??? - data, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(data)) - */ - } -} - -func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not handled. Request should be of type GET.") -} - -func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not found.") -} - func NewService(uri string) (svc *Service, err error) { var src cfgbackend.Source src, err = cfgbackend.NewSource(uri) - router := mux.NewRouter() - webApi := router.PathPrefix("/inventory/flps").Subrouter() - webApi.HandleFunc("/{format}", ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) - webApi.HandleFunc("", ApiRequestNotFound) - log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") return &Service{ src: src, }, err diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go new file mode 100644 index 000000000..b3fb76d4f --- /dev/null +++ b/apricot/local/servicehttp.go @@ -0,0 +1,153 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019-2021 CERN and copyright holders of ALICE O². + * Author: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package local + +import ( + "encoding/json" + "errors" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/configuration/cfgbackend" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/flosch/pongo2/v4" + "github.com/gorilla/mux" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var log = logger.New(logrus.StandardLogger(), "confsys") + +type Service struct { + src cfgbackend.Source +} + +type machineInfo struct { + name string +} + +type clusterInfo struct { + FLPs []machineInfo +} + +// Just a skeleton of a function for getting FLP names if relevant +/*func queryMachines(cluster *clusterInfo) error { + for rows.Next() { + machine := machineInfo{} + err = rows.Scan(&machineInfo.name) + if err != nil { + return err + } + cluster.FLPs = append(cluster.FLPs, machine) + } + err = rows.Err() + if err != nil { + return err + } + return nil +}*/ + +func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { + queryParam := mux.Vars(r) + format := "" + var err error + format, err = queryParam["format"] + if err != nil { + format = "text" + } + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + //TODO: write JSON + /* where to get info? depending on answer, could proceed like: + + cluster := clusterInfo{} + err := queryMachines(&cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, no result in cluster.") + } + answer, err := json.Marshal(cluster) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + fmt.Fprintf(w, "Error, result could not be given.") + } + fmt.Fprintf(w, string(answer)) + */ + case "text": + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + //TODO: write plain text + /* something like: ??? + data, _ := ioutil.ReadAll(response.Body) + fmt.Println(string(data)) + */ + default: + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + //TODO: write plain text + /* something like: ??? + data, _ := ioutil.ReadAll(response.Body) + fmt.Println(string(data)) + */ + } +} + +func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not handled. Request should be of type GET.") +} + +func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not found.") +} + +func NewHttpService(service configuration.Service) (svc *Service, err error) { + var src cfgbackend.Source + src, err = cfgbackend.NewSource(uri) + router := mux.NewRouter() + webApi := router.PathPrefix("/inventory/flps").Subrouter() + webApi.HandleFunc("/{format}", ApiGetClusterInformation).Methods(http.MethodGet) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) + webApi.HandleFunc("", ApiRequestNotFound) + log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") + return &Service{ + src: src, + }, err +} \ No newline at end of file From 74796b7dca561135c917f4df585efd138d8a557c Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 23 Mar 2021 14:53:41 +0100 Subject: [PATCH 0838/2352] service.go doesn't have any unused imports. --- apricot/local/service.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index a6e0eb48b..412344f93 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -29,7 +29,6 @@ import ( "errors" "fmt" "io/ioutil" - "net/http" "net/url" "os" "path/filepath" @@ -43,7 +42,6 @@ import ( "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" "github.com/flosch/pongo2/v4" - "github.com/gorilla/mux" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) From 3cb1dff4276aa0734526e82d6c1404f68425fed5 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 23 Mar 2021 14:56:56 +0100 Subject: [PATCH 0839/2352] The Http Service is linked to Apricot and is set up to be able to handle the inventory. --- apricot/apricot.go | 2 +- apricot/local/servicehttp.go | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 7ef8c78cd..a953a98d3 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -46,7 +46,7 @@ func Run() (err error) { log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) - local.NewHttpService(Instance()) + httpsvc := local.NewHttpService(Instance()) signals(s) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index b3fb76d4f..b2411ebfe 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -50,8 +50,8 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") -type Service struct { - src cfgbackend.Source +type HttpService struct { + svc configuration.Service } type machineInfo struct { @@ -79,7 +79,8 @@ type clusterInfo struct { return nil }*/ -func ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { +func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { + httpsvc.svc queryParam := mux.Vars(r) format := "" var err error @@ -136,18 +137,17 @@ func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Request not found.") } -func NewHttpService(service configuration.Service) (svc *Service, err error) { - var src cfgbackend.Source - src, err = cfgbackend.NewSource(uri) +func NewHttpService(service configuration.Service) (httpsvc *HttpService) { + httpsvc := &HttpService{ + svc: service, + } router := mux.NewRouter() webApi := router.PathPrefix("/inventory/flps").Subrouter() - webApi.HandleFunc("/{format}", ApiGetClusterInformation).Methods(http.MethodGet) + webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) webApi.HandleFunc("", ApiRequestNotFound) - log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Web API.") - return &Service{ - src: src, - }, err + log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Http Service.") + return httpsvc } \ No newline at end of file From 86c089c2abf00a39ec3263e0dbcd6aa51b34d7c2 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Thu, 25 Mar 2021 16:07:33 +0100 Subject: [PATCH 0840/2352] Host inventory is retrieved by http service, and converted to json or plain text. --- apricot/apricot.go | 2 +- apricot/local/service.go | 9 ++++++ apricot/local/servicehttp.go | 57 ++++++++---------------------------- 3 files changed, 23 insertions(+), 45 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index a953a98d3..0702d16c1 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -46,7 +46,7 @@ func Run() (err error) { log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) - httpsvc := local.NewHttpService(Instance()) + httpsvc := local.NewHttpService(instance) signals(s) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) diff --git a/apricot/local/service.go b/apricot/local/service.go index 412344f93..109b85712 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -122,6 +122,15 @@ func (s *Service) GetDefaults() map[string]string { return smap } +func (s *Service) GetHostInventory() []string { + keys, err := s.src.ROSource.GetKeysByPrefix("/o2/hardware") + if err != nil { + log.WithError(err).Fatal("Error, could not retrieve host list.") + return []string{""} + } + return keys +} + func (s *Service) GetVars() map[string]string { return s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "vars")) } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index b2411ebfe..bd2b18e61 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -62,25 +62,7 @@ type clusterInfo struct { FLPs []machineInfo } -// Just a skeleton of a function for getting FLP names if relevant -/*func queryMachines(cluster *clusterInfo) error { - for rows.Next() { - machine := machineInfo{} - err = rows.Scan(&machineInfo.name) - if err != nil { - return err - } - cluster.FLPs = append(cluster.FLPs, machine) - } - err = rows.Err() - if err != nil { - return err - } - return nil -}*/ - func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { - httpsvc.svc queryParam := mux.Vars(r) format := "" var err error @@ -88,42 +70,29 @@ func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *h if err != nil { format = "text" } + keys := local.GetHostInventory() switch format { case "json": w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - //TODO: write JSON - /* where to get info? depending on answer, could proceed like: - - cluster := clusterInfo{} - err := queryMachines(&cluster) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, no result in cluster.") - } - answer, err := json.Marshal(cluster) + hosts, err := json.MarshalIndent(keys, "", "\t") if err != nil { - w.WriteHeader(http.StatusInternalServerError) - fmt.Fprintf(w, "Error, result could not be given.") + log.WithError(err).Fatal("Error, could not marshal hosts.") + return "", err } - fmt.Fprintf(w, string(answer)) - */ + fmt.Println(string(hosts)) case "text": w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) - //TODO: write plain text - /* something like: ??? - data, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(data)) - */ + for _, hostname := range keys { + fmt.Printf("%s\n", hostname) + } default: w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) - //TODO: write plain text - /* something like: ??? - data, _ := ioutil.ReadAll(response.Body) - fmt.Println(string(data)) - */ + for _, hostname := range keys { + fmt.Printf("%s\n", hostname) + } } } @@ -148,6 +117,6 @@ func NewHttpService(service configuration.Service) (httpsvc *HttpService) { webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) webApi.HandleFunc("", ApiRequestNotFound) - log.WithError(http.ListenAndServe(uri, router)).Fatal("Fatal error with Http Service.") - return httpsvc + log.WithError(http.ListenAndServe(":47188", router)).Fatal("Fatal error with Http Service.") + return httpsvc } \ No newline at end of file From 7fe00962286db4a61f364e64871d9952689f94bc Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 26 Mar 2021 17:11:18 +0100 Subject: [PATCH 0841/2352] Http service should 'gracefully' shutdown on exit signals. --- apricot/apricot.go | 3 ++- apricot/local/service.go | 2 +- apricot/local/servicehttp.go | 34 ++++++++++++++++++++++++++-------- apricot/signals.go | 2 ++ 4 files changed, 31 insertions(+), 10 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 0702d16c1..7d35ec5a7 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -28,6 +28,7 @@ import ( "fmt" "net" + "github.com/AliceO2Group/Control/apricot/local" "github.com/AliceO2Group/Control/apricot/remote" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/product" @@ -46,7 +47,7 @@ func Run() (err error) { log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) - httpsvc := local.NewHttpService(instance) + httpsvc, httpsvr := local.NewHttpService(instance) signals(s) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) diff --git a/apricot/local/service.go b/apricot/local/service.go index 109b85712..4be0945ba 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -123,7 +123,7 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetHostInventory() []string { - keys, err := s.src.ROSource.GetKeysByPrefix("/o2/hardware") + keys, err := s.src.ROSource.GetKeysByPrefix("/o2/hardware/flps") if err != nil { log.WithError(err).Fatal("Error, could not retrieve host list.") return []string{""} diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index bd2b18e61..04e2b3600 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -25,6 +25,7 @@ package local import ( + "context" "encoding/json" "errors" "fmt" @@ -36,6 +37,7 @@ import ( "sort" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/logger" @@ -50,6 +52,8 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") +var httpwg sync.WaitGroup + type HttpService struct { svc configuration.Service } @@ -106,17 +110,31 @@ func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Request not found.") } +func ExitHttpService() { + defer httpwg.Done() +} + func NewHttpService(service configuration.Service) (httpsvc *HttpService) { + httpwg.Add(1) + router := mux.NewRouter() httpsvc := &HttpService{ svc: service, } - router := mux.NewRouter() - webApi := router.PathPrefix("/inventory/flps").Subrouter() - webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) - webApi.HandleFunc("", ApiRequestNotFound) - log.WithError(http.ListenAndServe(":47188", router)).Fatal("Fatal error with Http Service.") + httpsvr := &http.Server{ + Handler: router, + Addr: ":47188", + WriteTimeout: 15 * time.Second, + ReadTimeout: 15 * time.Second, + } + go func() { + webApi := router.PathPrefix("/inventory/flps").Subrouter() + webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) + webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) + webApi.HandleFunc("", ApiRequestNotFound) + log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") + }() + httpwg.Wait() return httpsvc } \ No newline at end of file diff --git a/apricot/signals.go b/apricot/signals.go index 1f8a0f4e1..f24654ace 100644 --- a/apricot/signals.go +++ b/apricot/signals.go @@ -31,6 +31,7 @@ import ( "time" "google.golang.org/grpc" + "github.com/AliceO2Group/Control/apricot/local" ) func signals(srv *grpc.Server) { @@ -50,6 +51,7 @@ func signals(srv *grpc.Server) { Debug("received signal") srv.Stop() + local.ExitHttpService() // Mesos calls are async.Sleep for 2s to mark tasks as completed. time.Sleep(2 * time.Second) From 080f2472b099ba954002019174af8b7cea2fbf68 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 6 Apr 2021 11:33:40 +0200 Subject: [PATCH 0842/2352] The HTTP Server is shut down using the Shutdown() function associated to it. --- apricot/apricot.go | 2 +- apricot/local/service.go | 42 +++++------ apricot/local/servicehttp.go | 130 ++++++++++++++--------------------- apricot/signals.go | 8 ++- 4 files changed, 80 insertions(+), 102 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 7d35ec5a7..4705636c4 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -48,7 +48,7 @@ func Run() (err error) { s := remote.NewServer(Instance()) httpsvc, httpsvr := local.NewHttpService(instance) - signals(s) // handle UNIX signals + signals(s, httpsvr) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) if err != nil { diff --git a/apricot/local/service.go b/apricot/local/service.go index 4be0945ba..c7718626c 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -49,15 +49,15 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") type Service struct { - src cfgbackend.Source + src cfgbackend.Source } func NewService(uri string) (svc *Service, err error) { - var src cfgbackend.Source - src, err = cfgbackend.NewSource(uri) - return &Service{ - src: src, - }, err + var src cfgbackend.Source + src, err = cfgbackend.NewSource(uri) + return &Service{ + src: src, + }, err } func (s *Service) NewRunNumber() (runNumber uint32, err error) { @@ -101,7 +101,7 @@ func (s *Service) GetDefaults() map[string]string { var configUri string if viper.IsSet("config_endpoint") { //coconut configUri = viper.GetString("config_endpoint") - } else if viper.IsSet("globalConfigurationUri"){ //core + } else if viper.IsSet("globalConfigurationUri") { //core configUri = viper.GetString("globalConfigurationUri") } else { //apricot configUri = viper.GetString("backendUri") @@ -123,12 +123,12 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetHostInventory() []string { - keys, err := s.src.ROSource.GetKeysByPrefix("/o2/hardware/flps") - if err != nil { - log.WithError(err).Fatal("Error, could not retrieve host list.") - return []string{""} - } - return keys + keys, err := s.src.GetKeysByPrefix("/o2/hardware/flps") + if err != nil { + log.WithError(err).Fatal("Error, could not retrieve host list.") + return []string{""} + } + return keys } func (s *Service) GetVars() map[string]string { @@ -372,9 +372,9 @@ func (s *Service) ListComponents() (components []string, err error) { return } -func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp bool)([]string, error) { +func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp bool) ([]string, error) { if len(keys) == 0 { - return []string{}, errors.New("no keys found") + return []string{}, errors.New("no keys found") } var components sort.StringSlice @@ -394,7 +394,7 @@ func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp b // len(ANY/any/entry[/timestamp]) is 4, therefore ↓ if len(componentParts) == 3 { // 1st acceptable case: single untimestamped entry - if len(componentParts[len(componentParts) - 1]) == 0 { // means this is a folder key with trailing slash "ANY/any/" + if len(componentParts[len(componentParts)-1]) == 0 { // means this is a folder key with trailing slash "ANY/any/" continue } @@ -409,8 +409,8 @@ func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp b // entries). // If true, we must pick all true 5-len entries in order to compare them // & pick the newest (in addition to, as usual, 4-len ones). - componentTimestamp = componentParts[len(componentParts) - 1] - componentsFullName = strings.TrimSuffix(componentsFullName, componentcfg.SEPARATOR + componentTimestamp) + componentTimestamp = componentParts[len(componentParts)-1] + componentsFullName = strings.TrimSuffix(componentsFullName, componentcfg.SEPARATOR+componentTimestamp) if !showTimestamp { componentsSet[componentsFullName] = "" } else { @@ -528,8 +528,8 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa componentMsg += "\n- " + key } err = errors.New("component " + query.Component + " does not exist. " + - "Available components in configuration database:" + componentMsg + - "\nTo create a new component, use the new component parameter" ) + "Available components in configuration database:" + componentMsg + + "\nTo create a new component, use the new component parameter") return } if componentExist && newComponent { @@ -590,4 +590,4 @@ func getConsulRuntimePrefix() string { func getAliECSRuntimePrefix() string { return getConsulRuntimePrefix() + "/aliecs" -} \ No newline at end of file +} diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 04e2b3600..fb4cdcc2e 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -25,104 +25,79 @@ package local import ( - "context" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "net/http" - "net/url" - "os" - "path/filepath" - "sort" - "strconv" - "strings" + "encoding/json" + "fmt" + "net/http" "sync" - "time" + "time" - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/configuration/cfgbackend" - "github.com/AliceO2Group/Control/configuration/componentcfg" - "github.com/AliceO2Group/Control/configuration/template" - "github.com/flosch/pongo2/v4" - "github.com/gorilla/mux" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" + "github.com/AliceO2Group/Control/configuration" + "github.com/gorilla/mux" ) -var log = logger.New(logrus.StandardLogger(), "confsys") - -var httpwg sync.WaitGroup - type HttpService struct { - svc configuration.Service + svc configuration.Service } type machineInfo struct { - name string + name string } type clusterInfo struct { - FLPs []machineInfo + FLPs []machineInfo } func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { - queryParam := mux.Vars(r) - format := "" - var err error - format, err = queryParam["format"] - if err != nil { - format = "text" - } - keys := local.GetHostInventory() - switch format { - case "json": - w.Header().Set("Content-Type", "application/json") - w.WriteHeader(http.StatusOK) - hosts, err := json.MarshalIndent(keys, "", "\t") - if err != nil { - log.WithError(err).Fatal("Error, could not marshal hosts.") - return "", err - } - fmt.Println(string(hosts)) - case "text": - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - for _, hostname := range keys { - fmt.Printf("%s\n", hostname) - } - default: - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - for _, hostname := range keys { - fmt.Printf("%s\n", hostname) - } - } + queryParam := mux.Vars(r) + format := "" + var err bool + format, err = queryParam["format"] + if err != false { + format = "text" + } + keys := (*Service).GetHostInventory() + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + hosts, err := json.MarshalIndent(keys, "", "\t") + if err != nil { + log.WithError(err).Fatal("Error, could not marshal hosts.") + } + fmt.Println(string(hosts)) + case "text": + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + for _, hostname := range keys { + fmt.Printf("%s\n", hostname) + } + default: + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + for _, hostname := range keys { + fmt.Printf("%s\n", hostname) + } + } } func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not handled. Request should be of type GET.") + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not handled. Request should be of type GET.") } func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not found.") + w.WriteHeader(http.StatusNotFound) + fmt.Fprintf(w, "Request not found.") } -func ExitHttpService() { - defer httpwg.Done() -} - -func NewHttpService(service configuration.Service) (httpsvc *HttpService) { - httpwg.Add(1) - router := mux.NewRouter() - httpsvc := &HttpService{ - svc: service, - } +func NewHttpService(service configuration.Service) (svc *HttpService, svr *http.Server) { + router := mux.NewRouter() + httpsvc := &HttpService{ + svc: service, + } httpsvr := &http.Server{ - Handler: router, - Addr: ":47188", + Handler: router, + Addr: ":47188", WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } @@ -135,6 +110,5 @@ func NewHttpService(service configuration.Service) (httpsvc *HttpService) { webApi.HandleFunc("", ApiRequestNotFound) log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") }() - httpwg.Wait() - return httpsvc -} \ No newline at end of file + return httpsvc, httpsvr +} diff --git a/apricot/signals.go b/apricot/signals.go index f24654ace..d43ca32ce 100644 --- a/apricot/signals.go +++ b/apricot/signals.go @@ -25,6 +25,8 @@ package apricot import ( + "context" + "net/http" "os" "os/signal" "syscall" @@ -34,7 +36,7 @@ import ( "github.com/AliceO2Group/Control/apricot/local" ) -func signals(srv *grpc.Server) { +func signals(srv *grpc.Server, httpsvr *http.Server) { // Create channel to receive unix signals signal_chan := make(chan os.Signal, 1) @@ -51,7 +53,9 @@ func signals(srv *grpc.Server) { Debug("received signal") srv.Stop() - local.ExitHttpService() + if err := httpsvr.Shutdown(context.Background()); err != nil { + log.Printf("Error while shutting down http server.") + } // Mesos calls are async.Sleep for 2s to mark tasks as completed. time.Sleep(2 * time.Second) From b131ae3b9d729479e8ffe60c56f07d672dd1b67a Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 9 Apr 2021 16:37:44 +0200 Subject: [PATCH 0843/2352] Temporary fix for having a working make all. No solution found to call for Service inside of ServiceHttp. --- apricot/apricot.go | 2 +- apricot/local/service.go | 13 +++++++++---- apricot/local/servicehttp.go | 8 ++++---- apricot/signals.go | 1 - 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 4705636c4..21ef23190 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -47,7 +47,7 @@ func Run() (err error) { log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) - httpsvc, httpsvr := local.NewHttpService(instance) + httpsvr := local.NewHttpService(instance) signals(s, httpsvr) // handle UNIX signals var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) diff --git a/apricot/local/service.go b/apricot/local/service.go index c7718626c..4f56fa5c6 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -123,12 +123,17 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetHostInventory() []string { - keys, err := s.src.GetKeysByPrefix("/o2/hardware/flps") - if err != nil { - log.WithError(err).Fatal("Error, could not retrieve host list.") + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "flps")) + if err != nil { + log.WithError(err).Fatal("Error, could not retrieve host list.") + return []string{""} + } + return keys + } else { + errors.New("Error, could not retrieve the Consul source.") return []string{""} } - return keys } func (s *Service) GetVars() map[string]string { diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index fb4cdcc2e..b40b6ed01 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -28,7 +28,6 @@ import ( "encoding/json" "fmt" "net/http" - "sync" "time" "github.com/AliceO2Group/Control/configuration" @@ -55,7 +54,8 @@ func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *h if err != false { format = "text" } - keys := (*Service).GetHostInventory() + var keys []string + //keys := local.GetHostInventory() switch format { case "json": w.Header().Set("Content-Type", "application/json") @@ -90,7 +90,7 @@ func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Request not found.") } -func NewHttpService(service configuration.Service) (svc *HttpService, svr *http.Server) { +func NewHttpService(service configuration.Service) (svr *http.Server) { router := mux.NewRouter() httpsvc := &HttpService{ svc: service, @@ -110,5 +110,5 @@ func NewHttpService(service configuration.Service) (svc *HttpService, svr *http. webApi.HandleFunc("", ApiRequestNotFound) log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") }() - return httpsvc, httpsvr + return httpsvr } diff --git a/apricot/signals.go b/apricot/signals.go index d43ca32ce..91c9048c7 100644 --- a/apricot/signals.go +++ b/apricot/signals.go @@ -33,7 +33,6 @@ import ( "time" "google.golang.org/grpc" - "github.com/AliceO2Group/Control/apricot/local" ) func signals(srv *grpc.Server, httpsvr *http.Server) { From b3c73952a4ba79fc089f45633df08f02aefb8f19 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 9 Apr 2021 17:13:12 +0200 Subject: [PATCH 0844/2352] Protofile takes the new GetHostInventory function into account. --- apricot/protos/apricot.proto | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index f98dbbb4f..385ca4610 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -39,6 +39,7 @@ service Apricot { rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} + rpc GetHostInventory(Empty) returns (HostEntriesResponse) {} rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} @@ -131,6 +132,10 @@ message ComponentEntriesResponse { repeated string payload = 1; } +message HostEntriesResponse { + repeated string payload = 1; +} + message ImportComponentConfigurationRequest { ComponentQuery query = 1; string payload = 2; From 812095250fbafb6f68b964e4f836061d593b7862 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 9 Apr 2021 17:13:48 +0200 Subject: [PATCH 0845/2352] Result of make generate after modifying the Protofile. --- apricot/protos/apricot.pb.go | 397 ++++++++++-------- apricot/protos/apricot_grpc.pb.go | 44 +- core/integration/dcs/protos/dcs_grpc.pb.go | 16 +- .../ddsched/protos/ddsched_grpc.pb.go | 8 +- core/integration/odc/protos/odc_grpc.pb.go | 8 +- core/protos/o2control_grpc.pb.go | 12 +- executor/protos/occ_grpc.pb.go | 12 +- go.mod | 1 + go.sum | 1 + odcshim/odcprotos/odc_grpc.pb.go | 8 +- odcshim/protos/occ_grpc.pb.go | 12 +- 11 files changed, 329 insertions(+), 190 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 18463e741..3c09eaee8 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -923,6 +923,53 @@ func (x *ComponentEntriesResponse) GetPayload() []string { return nil } +type HostEntriesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Payload []string `protobuf:"bytes,1,rep,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *HostEntriesResponse) Reset() { + *x = HostEntriesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostEntriesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostEntriesResponse) ProtoMessage() {} + +func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. +func (*HostEntriesResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{14} +} + +func (x *HostEntriesResponse) GetPayload() []string { + if x != nil { + return x.Payload + } + return nil +} + type ImportComponentConfigurationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -937,7 +984,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -950,7 +997,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -963,7 +1010,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1007,7 +1054,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1020,7 +1067,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1033,7 +1080,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{16} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1068,7 +1115,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1081,7 +1128,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1094,7 +1141,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *CRUCardsResponse) GetCards() string { @@ -1116,7 +1163,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1129,7 +1176,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1142,7 +1189,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *CardRequest) GetHostname() string { @@ -1170,7 +1217,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1183,7 +1230,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1196,7 +1243,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1296,123 +1343,130 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, 0x23, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, - 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, - 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, - 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, - 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, - 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, - 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, - 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, - 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xd7, 0x08, 0x0a, 0x07, 0x41, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x0a, 0x13, 0x48, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, + 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, + 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, + 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, + 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, + 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, + 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, + 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x9b, 0x09, 0x0a, 0x07, + 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, - 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, - 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, + 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1428,7 +1482,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 22) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1445,19 +1499,20 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ComponentEntriesQuery)(nil), // 12: apricot.ComponentEntriesQuery (*ListComponentEntriesRequest)(nil), // 13: apricot.ListComponentEntriesRequest (*ComponentEntriesResponse)(nil), // 14: apricot.ComponentEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 15: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 16: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 17: apricot.CRUCardsResponse - (*CardRequest)(nil), // 18: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 19: apricot.CRUCardEndpointResponse - nil, // 20: apricot.ComponentRequest.VarStackEntry - nil, // 21: apricot.StringMap.StringMapEntry + (*HostEntriesResponse)(nil), // 15: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 16: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 17: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 18: apricot.CRUCardsResponse + (*CardRequest)(nil), // 19: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 20: apricot.CRUCardEndpointResponse + nil, // 21: apricot.ComponentRequest.VarStackEntry + nil, // 22: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 20, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 21, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 21, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 22, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -1467,30 +1522,32 @@ var file_protos_apricot_proto_depIdxs = []int32{ 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 18, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 19, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest 10, // 14: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 11, // 15: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 1, // 16: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 13, // 17: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 18: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 19: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 15, // 20: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 7, // 21: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 8, // 22: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 8, // 23: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 24: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 6, // 25: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 17, // 26: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 19, // 27: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 28: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 29: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 14, // 30: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 14, // 31: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 14, // 32: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 33: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 16, // 34: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 21, // [21:35] is the sub-list for method output_type - 7, // [7:21] is the sub-list for method input_type + 1, // 16: apricot.Apricot.GetHostInventory:input_type -> apricot.Empty + 1, // 17: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 13, // 18: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 19: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 20: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 16, // 21: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 7, // 22: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 8, // 23: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 8, // 24: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 25: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 6, // 26: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 18, // 27: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 20, // 28: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 29: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 30: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 15, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 14, // 32: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 14, // 33: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 14, // 34: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 35: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 17, // 36: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 22, // [22:37] is the sub-list for method output_type + 7, // [7:22] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1671,7 +1728,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -1683,7 +1740,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -1695,7 +1752,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -1707,7 +1764,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*CRUCardsResponse); i { case 0: return &v.state case 1: @@ -1719,6 +1776,18 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -1745,7 +1814,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 21, + NumMessages: 22, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 1f20596e9..9b32d9343 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -26,6 +27,7 @@ type ApricotClient interface { GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) + GetHostInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*HostEntriesResponse, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -122,6 +124,15 @@ func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntry return out, nil } +func (c *apricotClient) GetHostInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*HostEntriesResponse, error) { + out := new(HostEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) @@ -180,6 +191,7 @@ type ApricotServer interface { GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) + GetHostInventory(context.Context, *Empty) (*HostEntriesResponse, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) @@ -218,6 +230,9 @@ func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEn func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") } +func (UnimplementedApricotServer) GetHostInventory(context.Context, *Empty) (*HostEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") +} func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListComponents not implemented") } @@ -242,7 +257,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&_Apricot_serviceDesc, srv) + s.RegisterService(&Apricot_ServiceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -407,6 +422,24 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetHostInventory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetHostInventory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetHostInventory(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(Empty) if err := dec(in); err != nil { @@ -497,7 +530,10 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -var _Apricot_serviceDesc = grpc.ServiceDesc{ +// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Apricot_ServiceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ @@ -537,6 +573,10 @@ var _Apricot_serviceDesc = grpc.ServiceDesc{ MethodName: "SetRuntimeEntry", Handler: _Apricot_SetRuntimeEntry_Handler, }, + { + MethodName: "GetHostInventory", + Handler: _Apricot_GetHostInventory_Handler, + }, { MethodName: "ListComponents", Handler: _Apricot_ListComponents_Handler, diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index c173927c6..d27cf4db1 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -32,7 +33,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -64,7 +65,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -96,7 +97,7 @@ func (x *configuratorStartOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -128,7 +129,7 @@ func (x *configuratorEndOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } @@ -194,7 +195,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&_Configurator_serviceDesc, srv) + s.RegisterService(&Configurator_ServiceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -281,7 +282,10 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { return x.ServerStream.SendMsg(m) } -var _Configurator_serviceDesc = grpc.ServiceDesc{ +// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Configurator_ServiceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{}, diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index bcf8b89a7..0e2419bfb 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -90,7 +91,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&_DataDistributionControl_serviceDesc, srv) + s.RegisterService(&DataDistributionControl_ServiceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -147,7 +148,10 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ +// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 045ec3bc8..1bcc9baa5 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -262,7 +263,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -499,7 +500,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 81fdcbe63..903ec7d16 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -51,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -272,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -414,7 +415,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -837,7 +838,10 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 66a3c8901..eafb7734d 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -154,7 +155,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -235,7 +236,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/go.mod b/go.mod index a30b13985..b71f52272 100644 --- a/go.mod +++ b/go.mod @@ -55,6 +55,7 @@ require ( github.com/golang/protobuf v1.4.3 github.com/google/uuid v1.2.0 // indirect github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect + github.com/gorilla/mux v1.7.3 github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect github.com/hashicorp/consul/api v1.8.1 diff --git a/go.sum b/go.sum index 202254214..566a10a52 100644 --- a/go.sum +++ b/go.sum @@ -436,6 +436,7 @@ github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index b5f1e0452..7a2602472 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -264,7 +265,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -501,7 +502,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index 09d8d584b..cd6c2d3a2 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -152,7 +153,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -233,7 +234,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From 27d43142258d0c40798531f9f84d28141b001ca7 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 9 Apr 2021 17:28:36 +0200 Subject: [PATCH 0846/2352] The function GetHostInventory is 'registered' in the configuration service. --- apricot/remote/server.go | 13 +++++++++++++ apricot/remote/service.go | 10 ++++++++++ configuration/service.go | 1 + 3 files changed, 24 insertions(+) diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 1c5ee1f59..2a9f6c280 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -230,6 +230,19 @@ func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGet return &apricotpb.ComponentResponse{Payload: payload}, nil } +func (m *RpcServer) GetHostInventory(_ context.Context, _ *apricotpb.Empty) (*apricotpb.HostEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + entries, err := m.service.GetHostInventory() + if err != nil { + return nil, err + } + response := &apricotpb.HostEntriesResponse{Payload: entries} + return response, nil +} + func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 3aafba946..ccc08f2aa 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,6 +193,16 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } +func (c *RemoteService) GetHostInventory() (hosts []string, err error) { + var response *apricotpb.HostEntriesResponse + response, err = c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return + } + hosts = response.GetPayload() + return +} + func (c *RemoteService) ListComponents() (components []string, err error) { var response *apricotpb.ComponentEntriesResponse response, err = c.cli.ListComponents(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) diff --git a/configuration/service.go b/configuration/service.go index 18c45940c..5b30804ef 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -41,6 +41,7 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + GetHostInventory() []string ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) From 0d3f733509169f149cb2b89022b85e02a978ca25 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 9 Apr 2021 17:37:43 +0200 Subject: [PATCH 0847/2352] The project builds after 'registering' the function GetHostInventory. --- apricot/remote/server.go | 8 ++------ apricot/remote/service.go | 10 ++++------ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 2a9f6c280..bfca97741 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -235,12 +235,8 @@ func (m *RpcServer) GetHostInventory(_ context.Context, _ *apricotpb.Empty) (*ap return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } m.logMethod() - entries, err := m.service.GetHostInventory() - if err != nil { - return nil, err - } - response := &apricotpb.HostEntriesResponse{Payload: entries} - return response, nil + entries := m.service.GetHostInventory() + return &apricotpb.HostEntriesResponse{Payload: entries}, E_OK.Err() } func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { diff --git a/apricot/remote/service.go b/apricot/remote/service.go index ccc08f2aa..3fe228c85 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,14 +193,12 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } -func (c *RemoteService) GetHostInventory() (hosts []string, err error) { - var response *apricotpb.HostEntriesResponse - response, err = c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) +func (c *RemoteService) GetHostInventory() []string { + response, err := c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) if err != nil { - return + return nil } - hosts = response.GetPayload() - return + return response.GetPayload() } func (c *RemoteService) ListComponents() (components []string, err error) { From 167c9768be3a3db66c43dfdc0a210b5bc3ab51a6 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Mon, 19 Apr 2021 09:09:59 +0200 Subject: [PATCH 0848/2352] GetHostInventory returns an error variable as well as the hosts list. --- apricot/local/service.go | 15 ++++++++++----- apricot/remote/server.go | 8 ++++++-- apricot/remote/service.go | 10 ++++++---- configuration/service.go | 2 +- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 4f56fa5c6..374932182 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -122,17 +122,22 @@ func (s *Service) GetDefaults() map[string]string { return smap } -func (s *Service) GetHostInventory() []string { +func (s *Service) GetHostInventory() (hosts []string, err error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "flps")) if err != nil { log.WithError(err).Fatal("Error, could not retrieve host list.") - return []string{""} + return []string{""}, err } - return keys + i := 0 + for _, key := range keys { + hostTrimed := strings.TrimPrefix(key, "o2/hardware/flps") + hosts[i] = hostTrimed + i++ + } + return hosts, err } else { - errors.New("Error, could not retrieve the Consul source.") - return []string{""} + return []string{""}, errors.New("Error, could not retrieve the Consul source.") } } diff --git a/apricot/remote/server.go b/apricot/remote/server.go index bfca97741..2a9f6c280 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -235,8 +235,12 @@ func (m *RpcServer) GetHostInventory(_ context.Context, _ *apricotpb.Empty) (*ap return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } m.logMethod() - entries := m.service.GetHostInventory() - return &apricotpb.HostEntriesResponse{Payload: entries}, E_OK.Err() + entries, err := m.service.GetHostInventory() + if err != nil { + return nil, err + } + response := &apricotpb.HostEntriesResponse{Payload: entries} + return response, nil } func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 3fe228c85..aa2344086 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,12 +193,14 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } -func (c *RemoteService) GetHostInventory() []string { - response, err := c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) +func (c *RemoteService) GetHostInventory() (hosts []string, err error) { + var response *apricotpb.HostEntriesResponse + response, err = c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) if err != nil { - return nil + return } - return response.GetPayload() + hosts = response.GetPayload() + return } func (c *RemoteService) ListComponents() (components []string, err error) { diff --git a/configuration/service.go b/configuration/service.go index 5b30804ef..8590da1d2 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -41,7 +41,7 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) - GetHostInventory() []string + GetHostInventory() (hosts []string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) From 8d93bc6c080e916d1332ff307c1d1198f18e2d0d Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Mon, 19 Apr 2021 09:10:35 +0200 Subject: [PATCH 0849/2352] Temporary setup for tests. --- apricot/local/servicehttp.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index b40b6ed01..5f3c844cc 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -49,13 +49,15 @@ type clusterInfo struct { func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { queryParam := mux.Vars(r) format := "" - var err bool - format, err = queryParam["format"] - if err != false { + var missing bool + format, missing = queryParam["format"] + if missing != false { format = "text" } - var keys []string - //keys := local.GetHostInventory() + keys, err := httpsvc.svc.GetHostInventory() + if err != nil { + log.WithError(err).Fatal("Error, could not retrieve host list.") + } switch format { case "json": w.Header().Set("Content-Type", "application/json") @@ -90,11 +92,18 @@ func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Request not found.") } +func homePage(w http.ResponseWriter, r *http.Request){ + fmt.Fprintf(w, "Welcome to the HomePage!") + fmt.Println("Endpoint Hit: homePage") +} + func NewHttpService(service configuration.Service) (svr *http.Server) { router := mux.NewRouter() + /* httpsvc := &HttpService{ svc: service, } + */ httpsvr := &http.Server{ Handler: router, Addr: ":47188", @@ -102,12 +111,15 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { ReadTimeout: 15 * time.Second, } go func() { + router.HandleFunc("/", homePage).Methods(http.MethodGet) + /* webApi := router.PathPrefix("/inventory/flps").Subrouter() webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) webApi.HandleFunc("", ApiRequestNotFound) + */ log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") }() return httpsvr From 635c83144a334dae55c2c7e91ac4544f63884de9 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 20 Apr 2021 15:47:39 +0200 Subject: [PATCH 0850/2352] GetHostInventory is called when needed, but isn't returning a result. --- apricot/local/service.go | 26 +++++++++++--------------- apricot/local/servicehttp.go | 17 ++++------------- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 374932182..3df3a197b 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -123,22 +123,18 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) GetHostInventory() (hosts []string, err error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "flps")) - if err != nil { - log.WithError(err).Fatal("Error, could not retrieve host list.") - return []string{""}, err - } - i := 0 - for _, key := range keys { - hostTrimed := strings.TrimPrefix(key, "o2/hardware/flps") - hosts[i] = hostTrimed - i++ - } - return hosts, err - } else { - return []string{""}, errors.New("Error, could not retrieve the Consul source.") + keys, err := s.src.GetKeysByPrefix("o2/hardware/flps/") + if err != nil { + log.WithError(err).Fatal("Error, could not retrieve host list.") + return []string{""}, err + } + i := 0 + for _, key := range keys { + hostTrimed := strings.TrimPrefix(key, "o2/hardware/flps/") + hosts[i] = hostTrimed + i++ } + return hosts, err } func (s *Service) GetVars() map[string]string { diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 5f3c844cc..cd58faa43 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -92,18 +92,11 @@ func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Request not found.") } -func homePage(w http.ResponseWriter, r *http.Request){ - fmt.Fprintf(w, "Welcome to the HomePage!") - fmt.Println("Endpoint Hit: homePage") -} - func NewHttpService(service configuration.Service) (svr *http.Server) { router := mux.NewRouter() - /* httpsvc := &HttpService{ svc: service, } - */ httpsvr := &http.Server{ Handler: router, Addr: ":47188", @@ -111,15 +104,13 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { ReadTimeout: 15 * time.Second, } go func() { - router.HandleFunc("/", homePage).Methods(http.MethodGet) - /* webApi := router.PathPrefix("/inventory/flps").Subrouter() + webApi.HandleFunc("/", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPost) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodPut) - webApi.HandleFunc("", ApiUnhandledRequest).Methods(http.MethodDelete) + webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodPost) + webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodPut) + webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodDelete) webApi.HandleFunc("", ApiRequestNotFound) - */ log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") }() return httpsvr From b3fbe4160508bc87d477630e280be83c0d7c3f22 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Thu, 22 Apr 2021 19:10:59 +0200 Subject: [PATCH 0851/2352] The HTTP Server returns the flps in either text or json depending on the format requested. --- apricot/local/service.go | 4 +++- apricot/local/servicehttp.go | 11 +++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 3df3a197b..510a43461 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -129,9 +129,11 @@ func (s *Service) GetHostInventory() (hosts []string, err error) { return []string{""}, err } i := 0 + hosts = make([]string, len(keys)) for _, key := range keys { hostTrimed := strings.TrimPrefix(key, "o2/hardware/flps/") - hosts[i] = hostTrimed + hostname := strings.Split(hostTrimed, "/") + hosts[i] = hostname[0] i++ } return hosts, err diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index cd58faa43..e874d8c10 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -49,9 +49,8 @@ type clusterInfo struct { func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { queryParam := mux.Vars(r) format := "" - var missing bool - format, missing = queryParam["format"] - if missing != false { + format = queryParam["format"] + if format == "" { format = "text" } keys, err := httpsvc.svc.GetHostInventory() @@ -66,18 +65,18 @@ func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *h if err != nil { log.WithError(err).Fatal("Error, could not marshal hosts.") } - fmt.Println(string(hosts)) + fmt.Fprintln(w, string(hosts)) case "text": w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) for _, hostname := range keys { - fmt.Printf("%s\n", hostname) + fmt.Fprintf(w,"%s\n", hostname) } default: w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) for _, hostname := range keys { - fmt.Printf("%s\n", hostname) + fmt.Fprintf(w,"%s\n", hostname) } } } From 9bbaf2136ae5fb7e93116512e9d63a35e6bf5fa1 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 23 Apr 2021 10:56:20 +0200 Subject: [PATCH 0852/2352] The HTTP Service is functional for FLPs and detector FLPs, for JSON and text format. --- apricot/local/service.go | 6 +- apricot/local/servicehttp.go | 39 ++- apricot/protos/apricot.pb.go | 401 +++++++++++++++++------------- apricot/protos/apricot.proto | 8 +- apricot/protos/apricot_grpc.pb.go | 12 +- apricot/remote/server.go | 12 +- apricot/remote/service.go | 10 +- 7 files changed, 276 insertions(+), 212 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 510a43461..4610c34f8 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -122,8 +122,8 @@ func (s *Service) GetDefaults() map[string]string { return smap } -func (s *Service) GetHostInventory() (hosts []string, err error) { - keys, err := s.src.GetKeysByPrefix("o2/hardware/flps/") +func (s *Service) GetHostInventory(keyPrefix string) (hosts []string, err error) { + keys, err := s.src.GetKeysByPrefix(keyPrefix) if err != nil { log.WithError(err).Fatal("Error, could not retrieve host list.") return []string{""}, err @@ -131,7 +131,7 @@ func (s *Service) GetHostInventory() (hosts []string, err error) { i := 0 hosts = make([]string, len(keys)) for _, key := range keys { - hostTrimed := strings.TrimPrefix(key, "o2/hardware/flps/") + hostTrimed := strings.TrimPrefix(key, keyPrefix) hostname := strings.Split(hostTrimed, "/") hosts[i] = hostname[0] i++ diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index e874d8c10..c57495142 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -38,22 +38,24 @@ type HttpService struct { svc configuration.Service } -type machineInfo struct { - name string +func (httpsvc *HttpService) ApiGetFlps(w http.ResponseWriter, r *http.Request) { + keyPrefix := "o2/hardware/flps/" + httpsvc.ApiGetClusterInformation(w, r, keyPrefix) } -type clusterInfo struct { - FLPs []machineInfo +func (httpsvc *HttpService) ApiGetDetectorFlps(w http.ResponseWriter, r *http.Request) { + keyPrefix := "o2/hardware/detectors/TST/flps/" + httpsvc.ApiGetClusterInformation(w, r, keyPrefix) } -func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request) { +func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request, keyPrefix string) { queryParam := mux.Vars(r) format := "" format = queryParam["format"] if format == "" { format = "text" } - keys, err := httpsvc.svc.GetHostInventory() + keys, err := httpsvc.svc.GetHostInventory(keyPrefix) if err != nil { log.WithError(err).Fatal("Error, could not retrieve host list.") } @@ -81,16 +83,6 @@ func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *h } } -func ApiUnhandledRequest(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not handled. Request should be of type GET.") -} - -func ApiRequestNotFound(w http.ResponseWriter, r *http.Request) { - w.WriteHeader(http.StatusNotFound) - fmt.Fprintf(w, "Request not found.") -} - func NewHttpService(service configuration.Service) (svr *http.Server) { router := mux.NewRouter() httpsvc := &HttpService{ @@ -103,13 +95,14 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { ReadTimeout: 15 * time.Second, } go func() { - webApi := router.PathPrefix("/inventory/flps").Subrouter() - webApi.HandleFunc("/", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("/{format}", httpsvc.ApiGetClusterInformation).Methods(http.MethodGet) - webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodPost) - webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodPut) - webApi.HandleFunc("/", ApiUnhandledRequest).Methods(http.MethodDelete) - webApi.HandleFunc("", ApiRequestNotFound) + apiFlps := router.PathPrefix("/inventory/flps").Subrouter() + apiFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiDetectorFlps := router.PathPrefix("/inventory/detectors/TST/flps").Subrouter() + apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") }() return httpsvr diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 3c09eaee8..277eb32e6 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -923,18 +923,65 @@ func (x *ComponentEntriesResponse) GetPayload() []string { return nil } +type HostGetRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` +} + +func (x *HostGetRequest) Reset() { + *x = HostGetRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostGetRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostGetRequest) ProtoMessage() {} + +func (x *HostGetRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. +func (*HostGetRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{14} +} + +func (x *HostGetRequest) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + type HostEntriesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Payload []string `protobuf:"bytes,1,rep,name=payload,proto3" json:"payload,omitempty"` + Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` } func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +994,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,12 +1007,12 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } -func (x *HostEntriesResponse) GetPayload() []string { +func (x *HostEntriesResponse) GetHosts() []string { if x != nil { - return x.Payload + return x.Hosts } return nil } @@ -984,7 +1031,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -997,7 +1044,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1010,7 +1057,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{16} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1054,7 +1101,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1067,7 +1114,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1080,7 +1127,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1115,7 +1162,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1128,7 +1175,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1141,7 +1188,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *CRUCardsResponse) GetCards() string { @@ -1163,7 +1210,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1176,7 +1223,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1189,7 +1236,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *CardRequest) GetHostname() string { @@ -1217,7 +1264,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1230,7 +1277,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1243,7 +1290,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1343,130 +1390,133 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x0a, 0x13, 0x48, - 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xb8, 0x01, 0x0a, - 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, - 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, - 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, - 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, - 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, - 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, - 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, - 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x9b, 0x09, 0x0a, 0x07, - 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, - 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, - 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, - 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x28, 0x0a, 0x0e, 0x48, + 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, + 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, + 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, + 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, + 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, + 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, + 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, + 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, + 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, + 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, + 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, + 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x07, 0x32, 0xa4, 0x09, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, + 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, + 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, + 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, + 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, + 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, + 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1482,7 +1532,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 22) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1499,20 +1549,21 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ComponentEntriesQuery)(nil), // 12: apricot.ComponentEntriesQuery (*ListComponentEntriesRequest)(nil), // 13: apricot.ListComponentEntriesRequest (*ComponentEntriesResponse)(nil), // 14: apricot.ComponentEntriesResponse - (*HostEntriesResponse)(nil), // 15: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 16: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 17: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 18: apricot.CRUCardsResponse - (*CardRequest)(nil), // 19: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 20: apricot.CRUCardEndpointResponse - nil, // 21: apricot.ComponentRequest.VarStackEntry - nil, // 22: apricot.StringMap.StringMapEntry + (*HostGetRequest)(nil), // 15: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 16: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 17: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 18: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 19: apricot.CRUCardsResponse + (*CardRequest)(nil), // 20: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 21: apricot.CRUCardEndpointResponse + nil, // 22: apricot.ComponentRequest.VarStackEntry + nil, // 23: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 21, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 22, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 22, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 23, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -1522,30 +1573,30 @@ var file_protos_apricot_proto_depIdxs = []int32{ 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 19, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 20, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest 10, // 14: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 11, // 15: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 1, // 16: apricot.Apricot.GetHostInventory:input_type -> apricot.Empty + 15, // 16: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest 1, // 17: apricot.Apricot.ListComponents:input_type -> apricot.Empty 13, // 18: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest 2, // 19: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery 3, // 20: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 16, // 21: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 17, // 21: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest 7, // 22: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse 8, // 23: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap 8, // 24: apricot.Apricot.GetVars:output_type -> apricot.StringMap 4, // 25: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse 6, // 26: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 18, // 27: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 20, // 28: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 19, // 27: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 21, // 28: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse 4, // 29: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse 1, // 30: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 15, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 16, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse 14, // 32: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse 14, // 33: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse 14, // 34: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse 4, // 35: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 17, // 36: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 18, // 36: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse 22, // [22:37] is the sub-list for method output_type 7, // [7:22] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name @@ -1728,7 +1779,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -1740,7 +1791,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -1752,7 +1803,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -1764,7 +1815,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -1776,7 +1827,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*CRUCardsResponse); i { case 0: return &v.state case 1: @@ -1788,6 +1839,18 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -1814,7 +1877,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 22, + NumMessages: 23, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 385ca4610..84b29191b 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -39,7 +39,7 @@ service Apricot { rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} - rpc GetHostInventory(Empty) returns (HostEntriesResponse) {} + rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} @@ -132,8 +132,12 @@ message ComponentEntriesResponse { repeated string payload = 1; } +message HostGetRequest { + string prefix = 1; +} + message HostEntriesResponse { - repeated string payload = 1; + repeated string hosts = 1; } message ImportComponentConfigurationRequest { diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 9b32d9343..e9f7706fc 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -27,7 +27,7 @@ type ApricotClient interface { GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) - GetHostInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*HostEntriesResponse, error) + GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -124,7 +124,7 @@ func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntry return out, nil } -func (c *apricotClient) GetHostInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*HostEntriesResponse, error) { +func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) { out := new(HostEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) if err != nil { @@ -191,7 +191,7 @@ type ApricotServer interface { GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) - GetHostInventory(context.Context, *Empty) (*HostEntriesResponse, error) + GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) @@ -230,7 +230,7 @@ func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEn func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") } -func (UnimplementedApricotServer) GetHostInventory(context.Context, *Empty) (*HostEntriesResponse, error) { +func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") } func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { @@ -423,7 +423,7 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec } func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) + in := new(HostGetRequest) if err := dec(in); err != nil { return nil, err } @@ -435,7 +435,7 @@ func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec FullMethod: "/apricot.Apricot/GetHostInventory", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetHostInventory(ctx, req.(*Empty)) + return srv.(ApricotServer).GetHostInventory(ctx, req.(*HostGetRequest)) } return interceptor(ctx, in, info, handler) } diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 2a9f6c280..052bf3645 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -230,17 +230,21 @@ func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGet return &apricotpb.ComponentResponse{Payload: payload}, nil } -func (m *RpcServer) GetHostInventory(_ context.Context, _ *apricotpb.Empty) (*apricotpb.HostEntriesResponse, error) { +func (m *RpcServer) GetHostInventory(_ context.Context, request *apricotpb.HostGetRequest) (*apricotpb.HostEntriesResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } m.logMethod() - entries, err := m.service.GetHostInventory() + + if request == nil { + return nil, E_BAD_INPUT + } + + entries, err := m.service.GetHostInventory(request.Prefix) if err != nil { return nil, err } - response := &apricotpb.HostEntriesResponse{Payload: entries} - return response, nil + return &apricotpb.HostEntriesResponse{Hosts: entries}, nil } func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { diff --git a/apricot/remote/service.go b/apricot/remote/service.go index aa2344086..a501afc3e 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,14 +193,14 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } -func (c *RemoteService) GetHostInventory() (hosts []string, err error) { +func (c *RemoteService) GetHostInventory(keyPrefix string) (hosts []string, err error) { var response *apricotpb.HostEntriesResponse - response, err = c.cli.GetHostInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + request := &apricotpb.HostGetRequest{Prefix: keyPrefix} + response, err = c.cli.GetHostInventory(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { - return + return nil, err } - hosts = response.GetPayload() - return + return response.GetHosts(), nil } func (c *RemoteService) ListComponents() (components []string, err error) { From 6dae74595f288432a324e656a1dbd8b51aea7a4d Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 23 Apr 2021 11:43:19 +0200 Subject: [PATCH 0853/2352] The Http Service is working after rebase. --- configuration/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/service.go b/configuration/service.go index 8590da1d2..42fe8bc69 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -41,7 +41,7 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) - GetHostInventory() (hosts []string, err error) + GetHostInventory(keyPrefix string) (hosts []string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) From 057c32bb78aca72f0afdf640fa966254a20c3fc3 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Mon, 26 Apr 2021 14:24:40 +0200 Subject: [PATCH 0854/2352] The HTTP service can return FLPs associated to a requested detector. --- apricot/apricot.go | 2 +- apricot/config.go | 2 + apricot/local/service.go | 15 +- apricot/local/servicehttp.go | 53 +++---- apricot/protos/apricot.pb.go | 260 +++++++++++++++++------------------ apricot/protos/apricot.proto | 2 +- apricot/remote/server.go | 2 +- apricot/remote/service.go | 4 +- apricot/signals.go | 2 +- configuration/service.go | 2 +- 10 files changed, 177 insertions(+), 167 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 21ef23190..daeeee8db 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -28,7 +28,7 @@ import ( "fmt" "net" - "github.com/AliceO2Group/Control/apricot/local" + "github.com/AliceO2Group/Control/apricot/local" "github.com/AliceO2Group/Control/apricot/remote" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/product" diff --git a/apricot/config.go b/apricot/config.go index 267d4f9f4..8f741cb39 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -39,6 +39,7 @@ func setDefaults() error { viper.Set("component", "apricot") viper.SetDefault("listenPort", 47101) + viper.SetDefault("httpListenPort", 47188) viper.SetDefault("backendUri", "consul://127.0.0.1:8500") viper.SetDefault("runtimeBasePath", "o2/runtime") viper.SetDefault("workingDir", "/var/lib/o2/apricot") @@ -48,6 +49,7 @@ func setDefaults() error { func setFlags() error { pflag.Int("listenPort", viper.GetInt("listenPort"), "Port of apricot server") + pflag.Int("httpListenPort", viper.GetInt("listenPort"), "Port of apricot http server") pflag.String("backendUri", viper.GetString("backendUri"), "URI of the Consul server or YAML configuration file") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") diff --git a/apricot/local/service.go b/apricot/local/service.go index 4610c34f8..2611ed430 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -47,6 +47,7 @@ import ( ) var log = logger.New(logrus.StandardLogger(), "confsys") +const inventoryKeyPrefix = "o2/hardware/" type Service struct { src cfgbackend.Source @@ -122,17 +123,23 @@ func (s *Service) GetDefaults() map[string]string { return smap } -func (s *Service) GetHostInventory(keyPrefix string) (hosts []string, err error) { +func (s *Service) GetHostInventory(detector string) (hosts []string, err error) { + var keyPrefix string + if detector != "" { + keyPrefix = inventoryKeyPrefix + "detectors/" + detector + "/flps/" + } else { + keyPrefix = inventoryKeyPrefix + "flps/" + } keys, err := s.src.GetKeysByPrefix(keyPrefix) if err != nil { log.WithError(err).Fatal("Error, could not retrieve host list.") - return []string{""}, err + return []string{}, err } i := 0 hosts = make([]string, len(keys)) for _, key := range keys { - hostTrimed := strings.TrimPrefix(key, keyPrefix) - hostname := strings.Split(hostTrimed, "/") + hostTrimmed := strings.TrimPrefix(key, keyPrefix) + hostname := strings.Split(hostTrimmed, "/") hosts[i] = hostname[0] i++ } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index c57495142..500252b1c 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -28,10 +28,13 @@ import ( "encoding/json" "fmt" "net/http" + "strconv" "time" + "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/configuration" "github.com/gorilla/mux" + "github.com/spf13/viper" ) type HttpService struct { @@ -39,25 +42,30 @@ type HttpService struct { } func (httpsvc *HttpService) ApiGetFlps(w http.ResponseWriter, r *http.Request) { - keyPrefix := "o2/hardware/flps/" - httpsvc.ApiGetClusterInformation(w, r, keyPrefix) + httpsvc.ApiGetClusterInformation(w, r, "") } func (httpsvc *HttpService) ApiGetDetectorFlps(w http.ResponseWriter, r *http.Request) { - keyPrefix := "o2/hardware/detectors/TST/flps/" - httpsvc.ApiGetClusterInformation(w, r, keyPrefix) + queryParam := mux.Vars(r) + detector := queryParam["detector"] + _, err := system.IDString(detector) + if err != nil { + log.WithError(err).Warn("Error, the detector name provided is not valid.") + } else { + httpsvc.ApiGetClusterInformation(w, r, detector) + } } -func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request, keyPrefix string) { +func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request, detector string) { queryParam := mux.Vars(r) format := "" format = queryParam["format"] if format == "" { format = "text" } - keys, err := httpsvc.svc.GetHostInventory(keyPrefix) + keys, err := httpsvc.svc.GetHostInventory(detector) if err != nil { - log.WithError(err).Fatal("Error, could not retrieve host list.") + log.WithError(err).Warn("Error, could not retrieve host list.") } switch format { case "json": @@ -65,15 +73,10 @@ func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *h w.WriteHeader(http.StatusOK) hosts, err := json.MarshalIndent(keys, "", "\t") if err != nil { - log.WithError(err).Fatal("Error, could not marshal hosts.") + log.WithError(err).Warn("Error, could not marshal hosts.") } fmt.Fprintln(w, string(hosts)) - case "text": - w.Header().Set("Content-Type", "text/plain") - w.WriteHeader(http.StatusOK) - for _, hostname := range keys { - fmt.Fprintf(w,"%s\n", hostname) - } + case "text": fallthrough default: w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) @@ -90,20 +93,18 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { } httpsvr := &http.Server{ Handler: router, - Addr: ":47188", + Addr: ":" + strconv.Itoa(viper.GetInt("httpListenPort")), WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } - go func() { - apiFlps := router.PathPrefix("/inventory/flps").Subrouter() - apiFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiDetectorFlps := router.PathPrefix("/inventory/detectors/TST/flps").Subrouter() - apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") - }() + apiFlps := router.PathPrefix("/inventory/flps").Subrouter() + apiFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() + apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") return httpsvr } diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 277eb32e6..35b324828 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.6.1 // source: protos/apricot.proto package apricotpb @@ -928,7 +928,7 @@ type HostGetRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` + Detector string `protobuf:"bytes,1,opt,name=detector,proto3" json:"detector,omitempty"` } func (x *HostGetRequest) Reset() { @@ -963,9 +963,9 @@ func (*HostGetRequest) Descriptor() ([]byte, []int) { return file_protos_apricot_proto_rawDescGZIP(), []int{14} } -func (x *HostGetRequest) GetPrefix() string { +func (x *HostGetRequest) GetDetector() string { if x != nil { - return x.Prefix + return x.Detector } return "" } @@ -1390,133 +1390,133 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x28, 0x0a, 0x0e, 0x48, - 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, - 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, - 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, - 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, - 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, - 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, - 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, - 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, - 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, - 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, - 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x07, 0x32, 0xa4, 0x09, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, - 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, - 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, - 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, - 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, - 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, - 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x0a, 0x0e, 0x48, + 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, + 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, + 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, + 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, + 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, + 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, + 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, + 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, + 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, + 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xa4, 0x09, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, + 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, + 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, + 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, + 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 84b29191b..dd3ecce9e 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -133,7 +133,7 @@ message ComponentEntriesResponse { } message HostGetRequest { - string prefix = 1; + string detector = 1; } message HostEntriesResponse { diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 052bf3645..7f61f328f 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -240,7 +240,7 @@ func (m *RpcServer) GetHostInventory(_ context.Context, request *apricotpb.HostG return nil, E_BAD_INPUT } - entries, err := m.service.GetHostInventory(request.Prefix) + entries, err := m.service.GetHostInventory(request.Detector) if err != nil { return nil, err } diff --git a/apricot/remote/service.go b/apricot/remote/service.go index a501afc3e..7ff3f1b9f 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,9 +193,9 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } -func (c *RemoteService) GetHostInventory(keyPrefix string) (hosts []string, err error) { +func (c *RemoteService) GetHostInventory(detector string) (hosts []string, err error) { var response *apricotpb.HostEntriesResponse - request := &apricotpb.HostGetRequest{Prefix: keyPrefix} + request := &apricotpb.HostGetRequest{Detector: detector} response, err = c.cli.GetHostInventory(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { return nil, err diff --git a/apricot/signals.go b/apricot/signals.go index 91c9048c7..4c89da385 100644 --- a/apricot/signals.go +++ b/apricot/signals.go @@ -53,7 +53,7 @@ func signals(srv *grpc.Server, httpsvr *http.Server) { srv.Stop() if err := httpsvr.Shutdown(context.Background()); err != nil { - log.Printf("Error while shutting down http server.") + log.Warn("Error while shutting down http server.") } // Mesos calls are async.Sleep for 2s to mark tasks as completed. diff --git a/configuration/service.go b/configuration/service.go index 42fe8bc69..17144bc3d 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -41,7 +41,7 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) - GetHostInventory(keyPrefix string) (hosts []string, err error) + GetHostInventory(detector string) (hosts []string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) From 3a4051672e92a227a8bef938ea3396d1d10da3ec Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 27 Apr 2021 14:58:13 +0200 Subject: [PATCH 0855/2352] The HTTP Service returns keys only once when it is both a key and a key prefix. --- apricot/local/service.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 2611ed430..5000c16fa 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -135,12 +135,18 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) log.WithError(err).Fatal("Error, could not retrieve host list.") return []string{}, err } - i := 0 - hosts = make([]string, len(keys)) + hostSet := make(map[string]bool, len(keys)) for _, key := range keys { hostTrimmed := strings.TrimPrefix(key, keyPrefix) hostname := strings.Split(hostTrimmed, "/") - hosts[i] = hostname[0] + if _, ok := hostSet[hostname[0]]; !ok { + hostSet[hostname[0]] = true + } + } + i := 0 + hosts = make([]string, len(hostSet)) + for host, _ := range hostSet { + hosts[i] = host i++ } return hosts, err From 1d427dbe63677b3bea6d9f97ac2e982f5d9d3835 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Tue, 27 Apr 2021 15:36:16 +0200 Subject: [PATCH 0856/2352] GetHostInventory is better optimised. --- apricot/local/service.go | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 5000c16fa..9de5eff3d 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -135,20 +135,16 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) log.WithError(err).Fatal("Error, could not retrieve host list.") return []string{}, err } - hostSet := make(map[string]bool, len(keys)) + hostSet := make(map[string]bool, 0) + hosts = make([]string, 0) for _, key := range keys { hostTrimmed := strings.TrimPrefix(key, keyPrefix) hostname := strings.Split(hostTrimmed, "/") if _, ok := hostSet[hostname[0]]; !ok { hostSet[hostname[0]] = true + hosts = append(hosts, hostname[0]) } } - i := 0 - hosts = make([]string, len(hostSet)) - for host, _ := range hostSet { - hosts[i] = host - i++ - } return hosts, err } From 26084ca17f72e7abf976b5f7e8098a277ff630c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Apr 2021 16:48:47 +0200 Subject: [PATCH 0857/2352] [core] Ensure all contexts get the environment_id variable --- core/environment/manager.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 86fae99aa..f4883f698 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -31,10 +31,10 @@ import ( "strings" "sync" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" @@ -118,6 +118,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) } + + // Ensure the environment_id is available to all + env.UserVars.Set("environment_id", env.id.String()) + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) From 98d617066783b44c6704542ba78e3c706afd0e44 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 14:11:44 +0200 Subject: [PATCH 0858/2352] [core] Expand plugin system with access functions for API calls --- core/integration/dcs/plugin.go | 36 +++++++++++++++++++++ core/integration/ddsched/plugin.go | 50 ++++++++++++++++++++++++++++++ core/integration/odc/plugin.go | 49 +++++++++++++++++++++++++++++ core/integration/plugin.go | 10 ++++++ 4 files changed, 145 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 09c4c9cf0..527273746 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -37,6 +37,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -78,6 +79,41 @@ func (p *Plugin) GetName() string { return "dcs" } +func (p *Plugin) GetPrettyName() string { + return "DCS" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("dcsServiceEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.dcsClient == nil { + return "UNKNOWN" + } + return p.dcsClient.conn.GetState().String() +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.dcsClient == nil { + return "" + } + + partitionStates := make(map[string]string) + + for _, envId := range environmentIds { + if _, ok := p.pendingEORs[envId.String()]; ok { + partitionStates[envId.String()] = "SOR SUCCESSFUL" + } + } + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { cxt, cancel := context.WithCancel(context.Background()) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 89eeb5a84..656173952 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -28,12 +28,14 @@ package ddsched import ( "context" + "encoding/json" "errors" "fmt" "net/url" "strconv" "time" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/AliceO2Group/Control/core/workflow" @@ -80,6 +82,54 @@ func (p *Plugin) GetName() string { return "ddsched" } +func (p *Plugin) GetPrettyName() string { + return "DD scheduler" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("ddSchedulerEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.ddSchedClient == nil { + return "UNKNOWN" + } + return p.ddSchedClient.conn.GetState().String() +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.ddSchedClient == nil { + return "" + } + + partitionStates := make(map[string]string) + + for _, envId := range environmentIds { + in := ddpb.PartitionInfo{ + PartitionId: envId.String(), + EnvironmentId: envId.String(), + } + state, err := p.ddSchedClient.PartitionStatus(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + continue + } + if state == nil { + continue + } + partitionState, ok := ddpb.PartitionState_name[int32(state.GetPartitionState())] + if !ok { + continue + } + partitionStates[envId.String()] = partitionState + } + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + func (p *Plugin) Init(_ string) error { if p.ddSchedClient == nil { cxt, cancel := context.WithCancel(context.Background()) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index ad858c93b..a4690362b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -28,15 +28,19 @@ package odc import ( "context" + "encoding/json" "fmt" "net/url" "strconv" "strings" "time" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" + odc "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" + "google.golang.org/grpc" ) const ODC_DIAL_TIMEOUT = 2 * time.Second @@ -71,6 +75,51 @@ func (p *Plugin) GetName() string { return "odc" } +func (p *Plugin) GetPrettyName() string { + return "ODC" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("odcEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.odcClient == nil { + return "UNKNOWN" + } + return p.odcClient.conn.GetState().String() +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.odcClient == nil { + return "" + } + + partitionStates := make(map[string]string) + + for _, envId := range environmentIds { + in := odc.StateRequest{ + Partitionid: envId.String(), + Path: "", + Detailed: false, + } + state, err := p.odcClient.GetState(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + continue + } + if state == nil || state.Reply == nil { + continue + } + partitionStates[envId.String()] = state.Reply.State + } + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + func (p *Plugin) Init(_ string) error { if p.odcClient == nil { cxt, cancel := context.WithCancel(context.Background()) diff --git a/core/integration/plugin.go b/core/integration/plugin.go index a3a276a13..defade5e6 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -28,6 +28,7 @@ import ( "sync" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -46,6 +47,11 @@ type Plugins []Plugin type Plugin interface { GetName() string + GetPrettyName() string + GetEndpoint() string + GetConnectionState() string + GetData(environmentIds []uid.ID) string + Init(instanceId string) error ObjectStack(data interface{}) map[string]interface{} Destroy() error @@ -53,6 +59,10 @@ type Plugin interface { type NewFunc func(endpoint string) Plugin +func RegisteredPlugins() map[string] func() Plugin { + return pluginLoaders +} + func RegisterPlugin(pluginName string, endpointArgumentName string, newFunc NewFunc) { loaderOnce.Do(func() { pluginLoaders = make(map[string]func() Plugin) From e34b8ed8980bedf4c89ec23ad04e9dd3fcd82fdf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 14:12:59 +0200 Subject: [PATCH 0859/2352] [core] Integrated Services API call --- apricot/protos/apricot.pb.go | 2 +- apricot/protos/apricot_grpc.pb.go | 8 +- coconut/protos/o2control.pb.go | 1417 ++++++++++------- coconut/protos/o2control_grpc.pb.go | 36 + core/integration/dcs/protos/dcs_grpc.pb.go | 16 +- .../ddsched/protos/ddsched_grpc.pb.go | 8 +- core/integration/odc/protos/odc_grpc.pb.go | 8 +- core/protos/o2control.pb.go | 1417 ++++++++++------- core/protos/o2control.proto | 15 + core/protos/o2control_grpc.pb.go | 48 +- core/server.go | 43 + executor/protos/occ_grpc.pb.go | 12 +- odcshim/odcprotos/odc_grpc.pb.go | 8 +- odcshim/protos/occ_grpc.pb.go | 12 +- 14 files changed, 1771 insertions(+), 1279 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 35b324828..ea2f1957f 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc v3.15.7 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index e9f7706fc..99e6caad4 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -257,7 +256,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&Apricot_ServiceDesc, srv) + s.RegisterService(&_Apricot_serviceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -530,10 +529,7 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Apricot_ServiceDesc = grpc.ServiceDesc{ +var _Apricot_serviceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index bd6a77f4d..d7379b7a5 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -934,13 +934,14 @@ type GetFrameworkInfoReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + ConfigurationEndpoint string `protobuf:"bytes,8,opt,name=configurationEndpoint,proto3" json:"configurationEndpoint,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -1024,6 +1025,13 @@ func (x *GetFrameworkInfoReply) GetVersion() *Version { return nil } +func (x *GetFrameworkInfoReply) GetConfigurationEndpoint() string { + if x != nil { + return x.ConfigurationEndpoint + } + return "" +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -4078,6 +4086,132 @@ func (*Empty) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{64} } +type ListIntegratedServicesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ListIntegratedServicesReply) Reset() { + *x = ListIntegratedServicesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListIntegratedServicesReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIntegratedServicesReply) ProtoMessage() {} + +func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. +func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{65} +} + +func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { + if x != nil { + return x.Services + } + return nil +} + +type IntegratedServiceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` + Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *IntegratedServiceInfo) Reset() { + *x = IntegratedServiceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IntegratedServiceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IntegratedServiceInfo) ProtoMessage() {} + +func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. +func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{66} +} + +func (x *IntegratedServiceInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *IntegratedServiceInfo) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *IntegratedServiceInfo) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *IntegratedServiceInfo) GetConnectionState() string { + if x != nil { + return x.ConnectionState + } + return "" +} + +func (x *IntegratedServiceInfo) GetData() string { + if x != nil { + return x.Data + } + return "" +} + var File_protos_o2control_proto protoreflect.FileDescriptor var file_protos_o2control_proto_rawDesc = []byte{ @@ -4162,7 +4296,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xc5, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, @@ -4179,548 +4313,580 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, - 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, - 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, - 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, + 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, + 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, - 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, - 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, - 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, + 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, + 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, + 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, + 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, - 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, - 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, - 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, - 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, - 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, - 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, - 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, + 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, + 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, + 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, - 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, - 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, - 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, - 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, - 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4736,7 +4902,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 80) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -4806,18 +4972,21 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply (*Empty)(nil), // 67: o2control.Empty - nil, // 68: o2control.EnvironmentInfo.DefaultsEntry - nil, // 69: o2control.EnvironmentInfo.VarsEntry - nil, // 70: o2control.EnvironmentInfo.UserVarsEntry - nil, // 71: o2control.NewEnvironmentRequest.VarsEntry - nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 75: o2control.TaskInfo.PropertiesEntry - nil, // 76: o2control.RoleInfo.DefaultsEntry - nil, // 77: o2control.RoleInfo.VarsEntry - nil, // 78: o2control.RoleInfo.UserVarsEntry - nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry + (*ListIntegratedServicesReply)(nil), // 68: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 69: o2control.IntegratedServiceInfo + nil, // 70: o2control.EnvironmentInfo.DefaultsEntry + nil, // 71: o2control.EnvironmentInfo.VarsEntry + nil, // 72: o2control.EnvironmentInfo.UserVarsEntry + nil, // 73: o2control.NewEnvironmentRequest.VarsEntry + nil, // 74: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 75: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 76: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 77: o2control.TaskInfo.PropertiesEntry + nil, // 78: o2control.RoleInfo.DefaultsEntry + nil, // 79: o2control.RoleInfo.VarsEntry + nil, // 80: o2control.RoleInfo.UserVarsEntry + nil, // 81: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 82: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -4829,12 +4998,12 @@ var file_protos_o2control_proto_depIdxs = []int32{ 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 70, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 71, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 72, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 73, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 74, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype @@ -4842,8 +5011,8 @@ var file_protos_o2control_proto_depIdxs = []int32{ 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 75, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 76, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo @@ -4852,68 +5021,72 @@ var file_protos_o2control_proto_depIdxs = []int32{ 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 77, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 78, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 79, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 80, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 81, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event - 66, // [66:89] is the sub-list for method output_type - 43, // [43:66] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 82, // 43: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 69, // 44: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 7, // 45: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 46: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 47: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 53: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 54: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 55: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 56: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 57: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 58: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 59: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 60: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 61: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 62: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 63: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 64: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 65: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 66: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 67: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 67, // 68: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 69: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 71: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 72: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 73: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 74: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 75: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 76: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 77: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 78: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 91: o2control.Control.Subscribe:output_type -> o2control.Event + 68, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 69, // [69:93] is the sub-list for method output_type + 45, // [45:69] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5702,6 +5875,30 @@ func file_protos_o2control_proto_init() { return nil } } + file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IntegratedServiceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), @@ -5717,7 +5914,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 77, + NumMessages: 80, NumExtensions: 0, NumServices: 1, }, diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index a87d3d87d..ad421239c 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -40,6 +40,7 @@ type ControlClient interface { SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) + GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) } type controlClient struct { @@ -303,6 +304,15 @@ func (x *controlSubscribeClient) Recv() (*Event, error) { return m, nil } +func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) { + out := new(ListIntegratedServicesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetIntegratedServices", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. // All implementations must embed UnimplementedControlServer // for forward compatibility @@ -330,6 +340,7 @@ type ControlServer interface { SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) Subscribe(*SubscribeRequest, Control_SubscribeServer) error + GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) mustEmbedUnimplementedControlServer() } @@ -406,6 +417,9 @@ func (UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRe func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } +func (UnimplementedControlServer) GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIntegratedServices not implemented") +} func (UnimplementedControlServer) mustEmbedUnimplementedControlServer() {} // UnsafeControlServer may be embedded to opt out of forward compatibility for this service. @@ -839,6 +853,24 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } +func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetIntegratedServices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetIntegratedServices", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetIntegratedServices(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), @@ -927,6 +959,10 @@ var _Control_serviceDesc = grpc.ServiceDesc{ MethodName: "SetRepoDefaultRevision", Handler: _Control_SetRepoDefaultRevision_Handler, }, + { + MethodName: "GetIntegratedServices", + Handler: _Control_GetIntegratedServices_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index d27cf4db1..c173927c6 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -33,7 +32,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -65,7 +64,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -97,7 +96,7 @@ func (x *configuratorStartOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -129,7 +128,7 @@ func (x *configuratorEndOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } @@ -195,7 +194,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&Configurator_ServiceDesc, srv) + s.RegisterService(&_Configurator_serviceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -282,10 +281,7 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { return x.ServerStream.SendMsg(m) } -// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Configurator_ServiceDesc = grpc.ServiceDesc{ +var _Configurator_serviceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{}, diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 0e2419bfb..bcf8b89a7 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -91,7 +90,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&DataDistributionControl_ServiceDesc, srv) + s.RegisterService(&_DataDistributionControl_serviceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -148,10 +147,7 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ +var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 1bcc9baa5..045ec3bc8 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -263,7 +262,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&ODC_ServiceDesc, srv) + s.RegisterService(&_ODC_serviceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -500,10 +499,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ODC_ServiceDesc = grpc.ServiceDesc{ +var _ODC_serviceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index bd6a77f4d..d7379b7a5 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -934,13 +934,14 @@ type GetFrameworkInfoReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` - EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` - TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` - InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` - Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + EnvironmentsCount int32 `protobuf:"varint,2,opt,name=environmentsCount,proto3" json:"environmentsCount,omitempty"` + TasksCount int32 `protobuf:"varint,3,opt,name=tasksCount,proto3" json:"tasksCount,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + HostsCount int32 `protobuf:"varint,5,opt,name=hostsCount,proto3" json:"hostsCount,omitempty"` + InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` + Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` + ConfigurationEndpoint string `protobuf:"bytes,8,opt,name=configurationEndpoint,proto3" json:"configurationEndpoint,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -1024,6 +1025,13 @@ func (x *GetFrameworkInfoReply) GetVersion() *Version { return nil } +func (x *GetFrameworkInfoReply) GetConfigurationEndpoint() string { + if x != nil { + return x.ConfigurationEndpoint + } + return "" +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -4078,6 +4086,132 @@ func (*Empty) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{64} } +type ListIntegratedServicesReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ListIntegratedServicesReply) Reset() { + *x = ListIntegratedServicesReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListIntegratedServicesReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIntegratedServicesReply) ProtoMessage() {} + +func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[65] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. +func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{65} +} + +func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { + if x != nil { + return x.Services + } + return nil +} + +type IntegratedServiceInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` + Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *IntegratedServiceInfo) Reset() { + *x = IntegratedServiceInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IntegratedServiceInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IntegratedServiceInfo) ProtoMessage() {} + +func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[66] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. +func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{66} +} + +func (x *IntegratedServiceInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *IntegratedServiceInfo) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *IntegratedServiceInfo) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *IntegratedServiceInfo) GetConnectionState() string { + if x != nil { + return x.ConnectionState + } + return "" +} + +func (x *IntegratedServiceInfo) GetData() string { + if x != nil { + return x.Data + } + return "" +} + var File_protos_o2control_proto protoreflect.FileDescriptor var file_protos_o2control_proto_rawDesc = []byte{ @@ -4162,7 +4296,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0x8f, 0x02, 0x0a, 0x15, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xc5, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, @@ -4179,548 +4313,580 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, - 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, - 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, - 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, + 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, + 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, - 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, - 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, - 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, + 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, + 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, + 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, + 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, - 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, - 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, - 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, - 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, - 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, - 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, - 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, - 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, + 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, + 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, + 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, + 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, - 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, - 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, - 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x32, 0xdf, - 0x0e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, - 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4736,7 +4902,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 80) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -4806,18 +4972,21 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply (*Empty)(nil), // 67: o2control.Empty - nil, // 68: o2control.EnvironmentInfo.DefaultsEntry - nil, // 69: o2control.EnvironmentInfo.VarsEntry - nil, // 70: o2control.EnvironmentInfo.UserVarsEntry - nil, // 71: o2control.NewEnvironmentRequest.VarsEntry - nil, // 72: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 73: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 74: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 75: o2control.TaskInfo.PropertiesEntry - nil, // 76: o2control.RoleInfo.DefaultsEntry - nil, // 77: o2control.RoleInfo.VarsEntry - nil, // 78: o2control.RoleInfo.UserVarsEntry - nil, // 79: o2control.RoleInfo.ConsolidatedStackEntry + (*ListIntegratedServicesReply)(nil), // 68: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 69: o2control.IntegratedServiceInfo + nil, // 70: o2control.EnvironmentInfo.DefaultsEntry + nil, // 71: o2control.EnvironmentInfo.VarsEntry + nil, // 72: o2control.EnvironmentInfo.UserVarsEntry + nil, // 73: o2control.NewEnvironmentRequest.VarsEntry + nil, // 74: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 75: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 76: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 77: o2control.TaskInfo.PropertiesEntry + nil, // 78: o2control.RoleInfo.DefaultsEntry + nil, // 79: o2control.RoleInfo.VarsEntry + nil, // 80: o2control.RoleInfo.UserVarsEntry + nil, // 81: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 82: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -4829,12 +4998,12 @@ var file_protos_o2control_proto_depIdxs = []int32{ 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 68, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 69, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 70, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 71, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 70, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 71, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 72, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 73, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 72, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 74, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype @@ -4842,8 +5011,8 @@ var file_protos_o2control_proto_depIdxs = []int32{ 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 73, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 74, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 75, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 76, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo @@ -4852,68 +5021,72 @@ var file_protos_o2control_proto_depIdxs = []int32{ 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 75, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 77, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 76, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 77, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 78, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 79, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 78, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 79, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 80, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 81, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 7, // 43: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 45: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 46: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 47: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 48: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 49: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 50: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 51: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 52: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 8, // 66: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 67: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 68: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 69: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 70: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 71: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 72: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 73: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 74: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 76: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 77: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 78: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 79: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 80: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 81: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 82: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 83: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 84: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 85: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 86: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 87: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 88: o2control.Control.Subscribe:output_type -> o2control.Event - 66, // [66:89] is the sub-list for method output_type - 43, // [43:66] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 82, // 43: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 69, // 44: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 7, // 45: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 12, // 46: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 15, // 47: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 17, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 22, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 20, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 24, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 26, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 28, // 53: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 31, // 54: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 39, // 55: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 41, // 56: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 47, // 57: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 49, // 58: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 52, // 59: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 55, // 60: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 58, // 61: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 60, // 62: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 62, // 63: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 63, // 64: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 64, // 65: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 65, // 66: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 11, // 67: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 67, // 68: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 69: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 14, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 16, // 71: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 18, // 72: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 23, // 73: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 21, // 74: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 25, // 75: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 27, // 76: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 30, // 77: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 32, // 78: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 40, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 42, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 48, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 51, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 54, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 57, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 59, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 61, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 67, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 67, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 67, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 66, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 10, // 91: o2control.Control.Subscribe:output_type -> o2control.Event + 68, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 69, // [69:93] is the sub-list for method output_type + 45, // [45:69] is the sub-list for method input_type + 45, // [45:45] is the sub-list for extension type_name + 45, // [45:45] is the sub-list for extension extendee + 0, // [0:45] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5702,6 +5875,30 @@ func file_protos_o2control_proto_init() { return nil } } + file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*IntegratedServiceInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ (*StatusUpdate_MesosHeartbeat)(nil), @@ -5717,7 +5914,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 3, - NumMessages: 77, + NumMessages: 80, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 45cd6a8cf..9dbd10b5b 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -92,6 +92,8 @@ service Control { rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (SetRepoDefaultRevisionReply) {} rpc Subscribe(SubscribeRequest) returns (stream Event); + + rpc GetIntegratedServices(Empty) returns (ListIntegratedServicesReply) {} } //////////////////////////////////////// @@ -148,6 +150,7 @@ message GetFrameworkInfoReply { int32 hostsCount = 5; string instanceName = 6; Version version = 7; + string configurationEndpoint = 8; } // Not implemented yet @@ -441,4 +444,16 @@ message SetRepoDefaultRevisionReply { message Empty { +} + +message ListIntegratedServicesReply { + map services = 1; +} + +message IntegratedServiceInfo { + string name = 1; + bool enabled = 2; + string endpoint = 3; + string connectionState = 4; + string data = 5; } \ No newline at end of file diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 903ec7d16..1d2449153 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -41,6 +40,7 @@ type ControlClient interface { SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) + GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) } type controlClient struct { @@ -52,7 +52,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +273,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -304,6 +304,15 @@ func (x *controlSubscribeClient) Recv() (*Event, error) { return m, nil } +func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) { + out := new(ListIntegratedServicesReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetIntegratedServices", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. // All implementations should embed UnimplementedControlServer // for forward compatibility @@ -331,6 +340,7 @@ type ControlServer interface { SetGlobalDefaultRevision(context.Context, *SetGlobalDefaultRevisionRequest) (*Empty, error) SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) Subscribe(*SubscribeRequest, Control_SubscribeServer) error + GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) } // UnimplementedControlServer should be embedded to have forward compatible implementations. @@ -406,6 +416,9 @@ func (UnimplementedControlServer) SetRepoDefaultRevision(context.Context, *SetRe func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_SubscribeServer) error { return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } +func (UnimplementedControlServer) GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetIntegratedServices not implemented") +} // UnsafeControlServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ControlServer will @@ -415,7 +428,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&Control_ServiceDesc, srv) + s.RegisterService(&_Control_serviceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -838,10 +851,25 @@ func (x *controlSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } -// Control_ServiceDesc is the grpc.ServiceDesc for Control service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Control_ServiceDesc = grpc.ServiceDesc{ +func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetIntegratedServices(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetIntegratedServices", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetIntegratedServices(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +var _Control_serviceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ @@ -929,6 +957,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "SetRepoDefaultRevision", Handler: _Control_SetRepoDefaultRevision_Handler, }, + { + MethodName: "GetIntegratedServices", + Handler: _Control_GetIntegratedServices_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/core/server.go b/core/server.go index 705256e98..f22083204 100644 --- a/core/server.go +++ b/core/server.go @@ -32,7 +32,9 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/product" @@ -84,6 +86,46 @@ type RpcServer struct { streams SafeStreamsMap } +func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { + m.logMethod() + + r := &pb.ListIntegratedServicesReply{Services: nil} + + services := make(map[string]*pb.IntegratedServiceInfo) + + for pluginName, _ := range integration.RegisteredPlugins() { + s := &pb.IntegratedServiceInfo{} + var plugin integration.Plugin + for _, p := range integration.PluginsInstance() { + if pluginName == p.GetName() { + plugin = p + break + } + } + + envIds := m.state.environments.Ids() + + // If this plugin was loaded + if plugin != nil { + s = &pb.IntegratedServiceInfo{ + Name: plugin.GetPrettyName(), + Enabled: false, + Endpoint: plugin.GetEndpoint(), + ConnectionState: plugin.GetConnectionState(), + Data: plugin.GetData(envIds), + } + enabledPlugins := viper.GetStringSlice("integrationPlugins") + if utils.StringSliceContains(enabledPlugins, pluginName) { + s.Enabled = true + } + } + services[pluginName] = s + } + + r.Services = services + return r, nil +} + func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { log.WithPrefix("rpcserver"). WithField("method", "TrackStatus"). @@ -114,6 +156,7 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques VersionStr: product.VERSION, ProductName: product.PRETTY_SHORTNAME, }, + ConfigurationEndpoint: viper.GetString("configServiceUri"), } return r, nil } diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index eafb7734d..66a3c8901 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -155,7 +154,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -236,10 +235,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go index 7a2602472..b5f1e0452 100644 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ b/odcshim/odcprotos/odc_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -265,7 +264,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&ODC_ServiceDesc, srv) + s.RegisterService(&_ODC_serviceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -502,10 +501,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var ODC_ServiceDesc = grpc.ServiceDesc{ +var _ODC_serviceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go index cd6c2d3a2..09d8d584b 100644 --- a/odcshim/protos/occ_grpc.pb.go +++ b/odcshim/protos/occ_grpc.pb.go @@ -11,7 +11,6 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -35,7 +34,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -67,7 +66,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -153,7 +152,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&Occ_ServiceDesc, srv) + s.RegisterService(&_Occ_serviceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -234,10 +233,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Occ_ServiceDesc = grpc.ServiceDesc{ +var _Occ_serviceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From f11b7f2bead96b1405bdbf0cf50bcbc46b2dacd1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 14:13:47 +0200 Subject: [PATCH 0860/2352] [coconut] Print Integrated Services information on coconut info --- coconut/control/control.go | 79 +++++++++++++++++++++++++++++++--- coconut/control/controlutil.go | 1 + 2 files changed, 73 insertions(+), 7 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 8fc3d4fe2..8f2c8ebc1 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -130,13 +130,78 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar revisionStr = fmt.Sprintf("revision %s", green(revisionStr)) } - _, _ = fmt.Fprintf(o, "instance name: %s\n", response.GetInstanceName()) - _, _ = fmt.Fprintf(o, "endpoint: %s\n", green(viper.GetString("endpoint"))) - _, _ = fmt.Fprintf(o, "core version: %s %s %s\n", response.GetVersion().GetProductName(), versionStr, revisionStr) - _, _ = fmt.Fprintf(o, "framework id: %s\n", response.GetFrameworkId()) - _, _ = fmt.Fprintf(o, "environments count: %s\n", green(response.GetEnvironmentsCount())) - _, _ = fmt.Fprintf(o, "active tasks count: %s\n", green(response.GetTasksCount())) - _, _ = fmt.Fprintf(o, "global state: %s\n", colorGlobalState(response.GetState())) + _, _ = fmt.Fprintf(o, "instance name: %s\n", response.GetInstanceName()) + _, _ = fmt.Fprintf(o, "core version: %s %s %s\n", response.GetVersion().GetProductName(), versionStr, revisionStr) + _, _ = fmt.Fprintf(o, "core endpoint: %s\n", green(viper.GetString("endpoint"))) + _, _ = fmt.Fprintf(o, "configuration endpoint: %s\n", green(response.GetConfigurationEndpoint())) + _, _ = fmt.Fprintf(o, "framework id: %s\n", response.GetFrameworkId()) + _, _ = fmt.Fprintf(o, "environments count: %s\n", green(response.GetEnvironmentsCount())) + _, _ = fmt.Fprintf(o, "active tasks count: %s\n", green(response.GetTasksCount())) + _, _ = fmt.Fprintf(o, "global state: %s\n", colorGlobalState(response.GetState())) + + // Integrated Services API query + pluginsResponse, err := rpc.GetIntegratedServices(cxt, &pb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return + } + services := pluginsResponse.GetServices() + enabledCount := 0 + + for _, svc := range pluginsResponse.GetServices() { + if svc.GetEnabled() { + enabledCount++ + } + } + intservMessage := "none" + if len(services) > 0 { + intservMessage = fmt.Sprintf("%s enabled (out of %d total)", green(enabledCount), len(services)) + } + + _, _ = fmt.Fprintf(o, "integrated services: %s\n", intservMessage) + + sortedSvcIds := make([]string, len(services)) + i := 0 + for svcId, _ := range services { + sortedSvcIds[i] = svcId + i++ + } + sort.Strings(sortedSvcIds) + + for _, svcId := range sortedSvcIds { + svc := services[svcId] + enabledString := dark("disabled") + if svc.Enabled { + enabledString = green("enabled") + } + + _, _ = fmt.Fprintf(o, " %-22s%s\n", svcId + ":", enabledString) + if !svc.Enabled { + continue + } + + connectionState := svc.GetConnectionState() + svcEndpoint := svc.GetEndpoint() + switch connectionState { + case "TRANSIENT_FAILURE": + connectionState = red(connectionState) + svcEndpoint = red(svcEndpoint) + case "CONNECTING": + connectionState = yellow(connectionState) + svcEndpoint = yellow(svcEndpoint) + case "READY": + connectionState = green(connectionState) + svcEndpoint = green(svcEndpoint) + } + + + _, _ = fmt.Fprintf(o, " %-20s%s\n", "service name:", svc.GetName()) + _, _ = fmt.Fprintf(o, " %-20s%s\n", "endpoint:", svcEndpoint) + _, _ = fmt.Fprintf(o, " %-20s%s\n", "connection state:", connectionState) + _, _ = fmt.Fprintf(o, " %-20s%s\n", "data:", svc.GetData()) + + } + + return nil } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index 11a5ce7c4..57dbcfe17 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -42,6 +42,7 @@ var( yellow = color.New(color.FgHiYellow).SprintFunc() red = color.New(color.FgHiRed).SprintFunc() grey = color.New(color.FgWhite).SprintFunc() + dark = color.New(color.FgHiBlack).SprintFunc() ) func formatRunNumber(rn uint32) string { From 182f3b17b4e22e7540f28c10777a90d9b5d7cb2d Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 17:39:19 +0300 Subject: [PATCH 0861/2352] [repos] Move convenience functions to repoutils.go --- common/utils/utils.go | 16 --------------- core/repos/repo.go | 3 +-- core/repos/repoutils.go | 45 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 core/repos/repoutils.go diff --git a/common/utils/utils.go b/common/utils/utils.go index 65db770bb..a0ec50c41 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -29,7 +29,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "os" "strings" "time" @@ -142,18 +141,3 @@ func ParseExtraVars(extraVars string) (extraVarsMap map[string]string, err error } return } - -func IsFilePublicWorkflow(filePath string) bool { - yamlFile, err := ioutil.ReadFile(filePath) - if err != nil { return false } - return IsPublicWorkflow(yamlFile) -} - -func IsPublicWorkflow(yamlFile []byte) bool { - var nameNode struct { - Node yaml.Node `yaml:"name"` - } - err := yaml.Unmarshal(yamlFile, &nameNode) - if err != nil { return false } - return nameNode.Node.Tag == "!public" -} \ No newline at end of file diff --git a/core/repos/repo.go b/core/repos/repo.go index d693e5086..a3d28c337 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,7 +26,6 @@ package repos import ( "errors" - "github.com/AliceO2Group/Control/common/utils" "io/ioutil" "path" "path/filepath" @@ -234,7 +233,7 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo // Check if workflow is public in case not allWorkflows requested // and skip it if it isn't if allWorkflows || (!allWorkflows && - utils.IsFilePublicWorkflow(filepath.Join(r.getWorkflowDir(), file.Name()))) { + IsFilePublicWorkflow(filepath.Join(r.getWorkflowDir(), file.Name()))) { templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template(strings.TrimSuffix(file.Name(), ".yaml"))) } } diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go new file mode 100644 index 000000000..b1cf67ab0 --- /dev/null +++ b/core/repos/repoutils.go @@ -0,0 +1,45 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "gopkg.in/yaml.v3" + "io/ioutil" +) + +func IsFilePublicWorkflow(filePath string) bool { + yamlFile, err := ioutil.ReadFile(filePath) + if err != nil { return false } + return IsPublicWorkflow(yamlFile) +} + +func IsPublicWorkflow(yamlFile []byte) bool { + var nameNode struct { + Node yaml.Node `yaml:"name"` + } + err := yaml.Unmarshal(yamlFile, &nameNode) + if err != nil { return false } + return nameNode.Node.Tag == "!public" +} \ No newline at end of file From 014b3f6c990f8bb4eb70ef7c4437e5c5e61c6a42 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 17:45:49 +0300 Subject: [PATCH 0862/2352] [repos] Add functions to parse public workflow variable info --- core/repos/repoutils.go | 86 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index b1cf67ab0..c408c7140 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -25,6 +25,7 @@ package repos import ( + "fmt" "gopkg.in/yaml.v3" "io/ioutil" ) @@ -42,4 +43,89 @@ func IsPublicWorkflow(yamlFile []byte) bool { err := yaml.Unmarshal(yamlFile, &nameNode) if err != nil { return false } return nameNode.Node.Tag == "!public" +} + +func ParseWorkflowPublicVariableInfo(fileName string) (map[string]VarSpec, error) { + yamlFile, err := ioutil.ReadFile(fileName) + if err != nil { return nil, err } + + nodes := make(map[string]yaml.Node) + err = yaml.Unmarshal(yamlFile, &nodes) + if err != nil { return nil, err } + + workflowVarInfo := make(map[string]VarSpec) + for k, v := range nodes { + if err = parseYamlPublicVars(&AuxNode{k, &v }, &workflowVarInfo); err != nil { + return nil, err + } + } + + return workflowVarInfo, nil +} + +// VarSpec is the type of struct into which public variable information from workflows may be parsed +type VarSpec struct { + DefaultValue string `yaml:"value"` + VarType string `yaml:"type"` + Label string `yaml:"label"` + Description string `yaml:"description"` + UiWidgetHint string `yaml:"widget"` + Panel string `yaml:"panel" ` + AllowedValues []string `yaml:"values"` + AllowedKeyValues map[string]string `yaml:"keyvalues,omitempty"` +} + +// AuxNode Use an auxiliary node struct that also carries its parent name +type AuxNode struct { + parentName string + node *yaml.Node +} + +func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *map[string]VarSpec) error { + node := auxNode.node + + // Recursion stops if node is nil, or isn't a mapping or a sequence node + if node == nil || + node.Kind != yaml.MappingNode && node.Kind != yaml.SequenceNode { + return nil + } + + if node.Kind == yaml.SequenceNode { // If it's a sequence node, continue searching for a map within it + for _, v := range node.Content { + err := parseYamlPublicVars(&AuxNode{"", v}, workflowVarInfo) + if err != nil { return err} + } + } else if node.Kind == yaml.MappingNode { // If it's a mapping node, iterate through it + // We do this decoding to have a sane key -> node map + // otherwise, we get two yaml nodes for a single element + // with the first one holding the name and the second one holding the tag + m := make(map[string]yaml.Node) + err := node.Decode(&m) + if err != nil { return err } + + parentName := auxNode.parentName + // Search within the node contents for a "!public" mapping node, + // which is also the ancestor of a "defaults" or "vars" parent + for k, v := range m { + var varSpec VarSpec + + if (parentName == "defaults" || parentName == "vars") && v.Kind == yaml.MappingNode && v.Tag == "!public" { + err = v.Decode(&varSpec) + if err != nil { fmt.Println(err); continue } + + // If the key already exists we have come upon a duplicate! + if _, exists := (*workflowVarInfo)[k]; exists { + duplicateError := fmt.Errorf("duplicate public variable \"%s\" parsed, input workflow file invalid", k) + return duplicateError + } + + // Update the map + (*workflowVarInfo)[k] = varSpec + } else { + err = parseYamlPublicVars(&AuxNode{k, &v}, workflowVarInfo) + if err != nil { return err } + } + } + } + return nil } \ No newline at end of file From 8cd7df54f2c828732c5fb922681f1c155e2c11c9 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 17:48:43 +0300 Subject: [PATCH 0863/2352] [repos] Remove AllowedKeyValues from VarSpec --- core/repos/repoutils.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index c408c7140..c8142406f 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -72,7 +72,6 @@ type VarSpec struct { UiWidgetHint string `yaml:"widget"` Panel string `yaml:"panel" ` AllowedValues []string `yaml:"values"` - AllowedKeyValues map[string]string `yaml:"keyvalues,omitempty"` } // AuxNode Use an auxiliary node struct that also carries its parent name From bb23182ed1a360de23fb53932255077b11cdbb57 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 17:49:26 +0300 Subject: [PATCH 0864/2352] [protos] Add VarSpec message extending WorkflowTemplateInfo --- core/protos/o2control.proto | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9dbd10b5b..b4e7c0585 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -380,11 +380,35 @@ message WorkflowTemplateInfo { string repo = 1; string template = 2; string revision = 3; + map varSpecMap = 4; } message GetWorkflowTemplatesReply{ repeated WorkflowTemplateInfo workflowTemplates = 1; } +message VarSpec { + enum UiWidget { + editBox = 0; + slider = 1; + listBox = 2; + dropDownBox = 3; + comboBox = 4; + } + enum Type { + bool = 0; + number = 1; + string = 2; + list = 3; + map = 4; + } + string defaultValue = 1; + Type type = 2; + string label = 3; + string description = 4; + UiWidget uiWidgetHint = 5; + string panel = 6; + repeated string allowedValues = 7; +} //////////////////////////////////////// // Repos From a01a9377f9ce5b09531c92301798f2ceb095e59a Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 26 Apr 2021 18:34:40 +0300 Subject: [PATCH 0865/2352] [server] Include public variable info in GetWorkflowTemplates --- coconut/protos/o2control.pb.go | 1183 ++++++++++++++++++++------------ core/protos/o2control.pb.go | 1183 ++++++++++++++++++++------------ core/protos/o2control.proto | 25 +- core/repos/repo.go | 8 +- core/repos/repomanager.go | 5 +- core/repos/repoutils.go | 15 +- core/server.go | 6 +- core/serverutil.go | 53 +- go.mod | 1 - 9 files changed, 1543 insertions(+), 936 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index d7379b7a5..cd5e4355b 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -207,6 +207,116 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } +type VarSpecMessage_UiWidget int32 + +const ( + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 +) + +// Enum value maps for VarSpecMessage_UiWidget. +var ( + VarSpecMessage_UiWidget_name = map[int32]string{ + 0: "editBox", + 1: "slider", + 2: "listBox", + 3: "dropDownBox", + 4: "comboBox", + } + VarSpecMessage_UiWidget_value = map[string]int32{ + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + } +) + +func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { + p := new(VarSpecMessage_UiWidget) + *p = x + return p +} + +func (x VarSpecMessage_UiWidget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[3].Descriptor() +} + +func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[3] +} + +func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. +func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50, 0} +} + +type VarSpecMessage_Type int32 + +const ( + VarSpecMessage_bool VarSpecMessage_Type = 0 + VarSpecMessage_number VarSpecMessage_Type = 1 + VarSpecMessage_string VarSpecMessage_Type = 2 + VarSpecMessage_list VarSpecMessage_Type = 3 + VarSpecMessage_map VarSpecMessage_Type = 4 +) + +// Enum value maps for VarSpecMessage_Type. +var ( + VarSpecMessage_Type_name = map[int32]string{ + 0: "bool", + 1: "number", + 2: "string", + 3: "list", + 4: "map", + } + VarSpecMessage_Type_value = map[string]int32{ + "bool": 0, + "number": 1, + "string": 2, + "list": 3, + "map": 4, + } +) + +func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { + p := new(VarSpecMessage_Type) + *p = x + return p +} + +func (x VarSpecMessage_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[4].Descriptor() +} + +func (VarSpecMessage_Type) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[4] +} + +func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VarSpecMessage_Type.Descriptor instead. +func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50, 1} +} + type Event_MesosHeartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3265,7 +3375,7 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` //TODO: Add option for varSpec?? } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3335,20 +3445,116 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } +type VarSpecMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DefaultValue string `protobuf:"bytes,1,opt,name=defaultValue,proto3" json:"defaultValue,omitempty"` + Type VarSpecMessage_Type `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.VarSpecMessage_Type" json:"type,omitempty"` + Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` + Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` + AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` +} + +func (x *VarSpecMessage) Reset() { + *x = VarSpecMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VarSpecMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VarSpecMessage) ProtoMessage() {} + +func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. +func (*VarSpecMessage) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} +} + +func (x *VarSpecMessage) GetDefaultValue() string { + if x != nil { + return x.DefaultValue + } + return "" +} + +func (x *VarSpecMessage) GetType() VarSpecMessage_Type { + if x != nil { + return x.Type + } + return VarSpecMessage_bool +} + +func (x *VarSpecMessage) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *VarSpecMessage) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *VarSpecMessage) GetUiWidgetHint() VarSpecMessage_UiWidget { + if x != nil { + return x.UiWidgetHint + } + return VarSpecMessage_editBox +} + +func (x *VarSpecMessage) GetPanel() string { + if x != nil { + return x.Panel + } + return "" +} + +func (x *VarSpecMessage) GetAllowedValues() []string { + if x != nil { + return x.AllowedValues + } + return nil +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3361,7 +3567,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3374,7 +3580,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3398,6 +3604,13 @@ func (x *WorkflowTemplateInfo) GetRevision() string { return "" } +func (x *WorkflowTemplateInfo) GetVarSpecMap() map[string]*VarSpecMessage { + if x != nil { + return x.VarSpecMap + } + return nil +} + type GetWorkflowTemplatesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3409,7 +3622,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3422,7 +3635,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3435,7 +3648,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3454,7 +3667,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3467,7 +3680,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3480,7 +3693,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } type RepoInfo struct { @@ -3496,7 +3709,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3509,7 +3722,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3522,7 +3735,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *RepoInfo) GetName() string { @@ -3558,7 +3771,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3571,7 +3784,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3584,7 +3797,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3613,7 +3826,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3626,7 +3839,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3639,7 +3852,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *AddRepoRequest) GetName() string { @@ -3668,7 +3881,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3681,7 +3894,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3694,7 +3907,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3722,7 +3935,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3735,7 +3948,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3748,7 +3961,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3769,7 +3982,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3782,7 +3995,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3795,7 +4008,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3816,7 +4029,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +4042,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +4055,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -3863,7 +4076,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +4089,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3889,7 +4102,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -3910,7 +4123,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3923,7 +4136,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3936,7 +4149,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -3958,7 +4171,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3971,7 +4184,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3984,7 +4197,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4012,7 +4225,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4025,7 +4238,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4038,7 +4251,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4057,7 +4270,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4070,7 +4283,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4083,7 +4296,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } type ListIntegratedServicesReply struct { @@ -4097,7 +4310,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4110,7 +4323,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4123,7 +4336,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4148,7 +4361,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4161,7 +4374,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4174,7 +4387,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } func (x *IntegratedServiceInfo) GetName() string { @@ -4673,220 +4886,258 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4901,192 +5152,200 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { return file_protos_o2control_proto_rawDescData } -var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 82) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype - (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent - (*StatusRequest)(nil), // 7: o2control.StatusRequest - (*StatusReply)(nil), // 8: o2control.StatusReply - (*StatusUpdate)(nil), // 9: o2control.StatusUpdate - (*Event)(nil), // 10: o2control.Event - (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 13: o2control.Version - (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 15: o2control.TeardownRequest - (*TeardownReply)(nil), // 16: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply - (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest - (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply - (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 40: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 42: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo - (*CommandInfo)(nil), // 44: o2control.CommandInfo - (*ChannelInfo)(nil), // 45: o2control.ChannelInfo - (*TaskInfo)(nil), // 46: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest - (*RoleInfo)(nil), // 50: o2control.RoleInfo - (*GetRolesReply)(nil), // 51: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest - (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 55: o2control.ListReposRequest - (*RepoInfo)(nil), // 56: o2control.RepoInfo - (*ListReposReply)(nil), // 57: o2control.ListReposReply - (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 59: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 67: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 68: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 69: o2control.IntegratedServiceInfo - nil, // 70: o2control.EnvironmentInfo.DefaultsEntry - nil, // 71: o2control.EnvironmentInfo.VarsEntry - nil, // 72: o2control.EnvironmentInfo.UserVarsEntry - nil, // 73: o2control.NewEnvironmentRequest.VarsEntry - nil, // 74: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 75: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 76: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 77: o2control.TaskInfo.PropertiesEntry - nil, // 78: o2control.RoleInfo.DefaultsEntry - nil, // 79: o2control.RoleInfo.VarsEntry - nil, // 80: o2control.RoleInfo.UserVarsEntry - nil, // 81: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 82: o2control.ListIntegratedServicesReply.ServicesEntry + (VarSpecMessage_UiWidget)(0), // 3: o2control.VarSpecMessage.UiWidget + (VarSpecMessage_Type)(0), // 4: o2control.VarSpecMessage.Type + (*Event_MesosHeartbeat)(nil), // 5: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentEvent)(nil), // 6: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 7: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 8: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 9: o2control.StatusRequest + (*StatusReply)(nil), // 10: o2control.StatusReply + (*StatusUpdate)(nil), // 11: o2control.StatusUpdate + (*Event)(nil), // 12: o2control.Event + (*SubscribeRequest)(nil), // 13: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 14: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 15: o2control.Version + (*GetFrameworkInfoReply)(nil), // 16: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 17: o2control.TeardownRequest + (*TeardownReply)(nil), // 18: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 19: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 20: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 21: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 22: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 23: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 24: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 25: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 26: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 27: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 28: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 29: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 30: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 31: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 35: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 36: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 37: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 38: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 39: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 40: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 41: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 42: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 43: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 44: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 45: o2control.TaskClassInfo + (*CommandInfo)(nil), // 46: o2control.CommandInfo + (*ChannelInfo)(nil), // 47: o2control.ChannelInfo + (*TaskInfo)(nil), // 48: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 49: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 50: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 51: o2control.GetRolesRequest + (*RoleInfo)(nil), // 52: o2control.RoleInfo + (*GetRolesReply)(nil), // 53: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 54: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 55: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 56: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 57: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 58: o2control.ListReposRequest + (*RepoInfo)(nil), // 59: o2control.RepoInfo + (*ListReposReply)(nil), // 60: o2control.ListReposReply + (*AddRepoRequest)(nil), // 61: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 62: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 63: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 64: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 65: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 66: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 67: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 68: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 69: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 70: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 71: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 72: o2control.IntegratedServiceInfo + nil, // 73: o2control.EnvironmentInfo.DefaultsEntry + nil, // 74: o2control.EnvironmentInfo.VarsEntry + nil, // 75: o2control.EnvironmentInfo.UserVarsEntry + nil, // 76: o2control.NewEnvironmentRequest.VarsEntry + nil, // 77: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 78: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 79: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 80: o2control.TaskInfo.PropertiesEntry + nil, // 81: o2control.RoleInfo.DefaultsEntry + nil, // 82: o2control.RoleInfo.VarsEntry + nil, // 83: o2control.RoleInfo.UserVarsEntry + nil, // 84: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 85: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 86: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ - 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent - 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent - 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent - 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 70, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 71, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 72, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 73, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 74, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 5, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 6, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 7, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 39, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 73, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 74, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 75, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 76, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 77, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 52, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 75, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 76, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 77, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 78, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 79, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 80, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 81, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 82, // 43: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 69, // 44: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 7, // 45: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 46: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 47: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 53: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 54: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 55: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 56: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 57: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 58: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 59: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 60: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 61: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 62: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 63: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 64: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 65: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 66: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 67: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 67, // 68: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 69: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 71: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 72: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 73: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 74: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 75: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 76: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 77: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 78: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 91: o2control.Control.Subscribe:output_type -> o2control.Event - 68, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 69, // [69:93] is the sub-list for method output_type - 45, // [45:69] is the sub-list for method input_type - 45, // [45:45] is the sub-list for extension type_name - 45, // [45:45] is the sub-list for extension extendee - 0, // [0:45] is the sub-list for field type_name + 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 50, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 78, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 79, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 40, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 39, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 48, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 39, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 45, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 47, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 47, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 46, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 80, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 39, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 39, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 52, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 81, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 82, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 83, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 3, // 42: o2control.VarSpecMessage.uiWidgetHint:type_name -> o2control.VarSpecMessage.UiWidget + 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 86, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 55, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 72, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 19, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 53: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 54: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 55: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 41, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 43, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 49, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 51, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 54, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 58, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 61, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 63, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 65, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 66, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 67, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 68, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 70, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 73: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 74: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 75: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 76: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 77: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 78: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 79: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 80: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 81: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 42, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 44, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 50, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 53, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 57, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 60, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 62, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 64, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 70, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 70, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 70, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 69, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 95: o2control.Control.Subscribe:output_type -> o2control.Event + 71, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 73, // [73:97] is the sub-list for method output_type + 49, // [49:73] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5696,7 +5955,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -5708,7 +5967,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -5720,7 +5979,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -5732,7 +5991,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -5744,7 +6003,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -5756,7 +6015,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -5768,7 +6027,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -5780,7 +6039,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -5792,7 +6051,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -5804,7 +6063,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -5816,7 +6075,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -5828,7 +6087,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -5840,7 +6099,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -5852,7 +6111,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -5864,7 +6123,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -5876,7 +6135,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -5888,6 +6147,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -5913,8 +6184,8 @@ func file_protos_o2control_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, - NumEnums: 3, - NumMessages: 80, + NumEnums: 5, + NumMessages: 82, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index d7379b7a5..cd5e4355b 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -207,6 +207,116 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} } +type VarSpecMessage_UiWidget int32 + +const ( + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 +) + +// Enum value maps for VarSpecMessage_UiWidget. +var ( + VarSpecMessage_UiWidget_name = map[int32]string{ + 0: "editBox", + 1: "slider", + 2: "listBox", + 3: "dropDownBox", + 4: "comboBox", + } + VarSpecMessage_UiWidget_value = map[string]int32{ + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + } +) + +func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { + p := new(VarSpecMessage_UiWidget) + *p = x + return p +} + +func (x VarSpecMessage_UiWidget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[3].Descriptor() +} + +func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[3] +} + +func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. +func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50, 0} +} + +type VarSpecMessage_Type int32 + +const ( + VarSpecMessage_bool VarSpecMessage_Type = 0 + VarSpecMessage_number VarSpecMessage_Type = 1 + VarSpecMessage_string VarSpecMessage_Type = 2 + VarSpecMessage_list VarSpecMessage_Type = 3 + VarSpecMessage_map VarSpecMessage_Type = 4 +) + +// Enum value maps for VarSpecMessage_Type. +var ( + VarSpecMessage_Type_name = map[int32]string{ + 0: "bool", + 1: "number", + 2: "string", + 3: "list", + 4: "map", + } + VarSpecMessage_Type_value = map[string]int32{ + "bool": 0, + "number": 1, + "string": 2, + "list": 3, + "map": 4, + } +) + +func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { + p := new(VarSpecMessage_Type) + *p = x + return p +} + +func (x VarSpecMessage_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[4].Descriptor() +} + +func (VarSpecMessage_Type) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[4] +} + +func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use VarSpecMessage_Type.Descriptor instead. +func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50, 1} +} + type Event_MesosHeartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3265,7 +3375,7 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` //TODO: Add option for varSpec?? } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3335,20 +3445,116 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } +type VarSpecMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DefaultValue string `protobuf:"bytes,1,opt,name=defaultValue,proto3" json:"defaultValue,omitempty"` + Type VarSpecMessage_Type `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.VarSpecMessage_Type" json:"type,omitempty"` + Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` + Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` + AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` +} + +func (x *VarSpecMessage) Reset() { + *x = VarSpecMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VarSpecMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VarSpecMessage) ProtoMessage() {} + +func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. +func (*VarSpecMessage) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{50} +} + +func (x *VarSpecMessage) GetDefaultValue() string { + if x != nil { + return x.DefaultValue + } + return "" +} + +func (x *VarSpecMessage) GetType() VarSpecMessage_Type { + if x != nil { + return x.Type + } + return VarSpecMessage_bool +} + +func (x *VarSpecMessage) GetLabel() string { + if x != nil { + return x.Label + } + return "" +} + +func (x *VarSpecMessage) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *VarSpecMessage) GetUiWidgetHint() VarSpecMessage_UiWidget { + if x != nil { + return x.UiWidgetHint + } + return VarSpecMessage_editBox +} + +func (x *VarSpecMessage) GetPanel() string { + if x != nil { + return x.Panel + } + return "" +} + +func (x *VarSpecMessage) GetAllowedValues() []string { + if x != nil { + return x.AllowedValues + } + return nil +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3361,7 +3567,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3374,7 +3580,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3398,6 +3604,13 @@ func (x *WorkflowTemplateInfo) GetRevision() string { return "" } +func (x *WorkflowTemplateInfo) GetVarSpecMap() map[string]*VarSpecMessage { + if x != nil { + return x.VarSpecMap + } + return nil +} + type GetWorkflowTemplatesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3409,7 +3622,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3422,7 +3635,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3435,7 +3648,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3454,7 +3667,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3467,7 +3680,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3480,7 +3693,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } type RepoInfo struct { @@ -3496,7 +3709,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3509,7 +3722,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3522,7 +3735,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *RepoInfo) GetName() string { @@ -3558,7 +3771,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3571,7 +3784,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3584,7 +3797,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3613,7 +3826,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3626,7 +3839,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3639,7 +3852,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *AddRepoRequest) GetName() string { @@ -3668,7 +3881,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3681,7 +3894,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3694,7 +3907,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3722,7 +3935,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3735,7 +3948,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3748,7 +3961,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3769,7 +3982,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3782,7 +3995,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3795,7 +4008,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3816,7 +4029,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3829,7 +4042,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3842,7 +4055,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -3863,7 +4076,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3876,7 +4089,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3889,7 +4102,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -3910,7 +4123,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3923,7 +4136,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3936,7 +4149,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -3958,7 +4171,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3971,7 +4184,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3984,7 +4197,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4012,7 +4225,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4025,7 +4238,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4038,7 +4251,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4057,7 +4270,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4070,7 +4283,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4083,7 +4296,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } type ListIntegratedServicesReply struct { @@ -4097,7 +4310,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4110,7 +4323,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4123,7 +4336,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4148,7 +4361,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4161,7 +4374,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4174,7 +4387,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } func (x *IntegratedServiceInfo) GetName() string { @@ -4673,220 +4886,258 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x62, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4901,192 +5152,200 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { return file_protos_o2control_proto_rawDescData } -var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 80) +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 82) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype - (*Event_MesosHeartbeat)(nil), // 3: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentEvent)(nil), // 4: o2control.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 5: o2control.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 6: o2control.Ev_RoleEvent - (*StatusRequest)(nil), // 7: o2control.StatusRequest - (*StatusReply)(nil), // 8: o2control.StatusReply - (*StatusUpdate)(nil), // 9: o2control.StatusUpdate - (*Event)(nil), // 10: o2control.Event - (*SubscribeRequest)(nil), // 11: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 12: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 13: o2control.Version - (*GetFrameworkInfoReply)(nil), // 14: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 15: o2control.TeardownRequest - (*TeardownReply)(nil), // 16: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 17: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 18: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 19: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 20: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 21: o2control.NewEnvironmentReply - (*NewAutoEnvironmentRequest)(nil), // 22: o2control.NewAutoEnvironmentRequest - (*NewAutoEnvironmentReply)(nil), // 23: o2control.NewAutoEnvironmentReply - (*GetEnvironmentRequest)(nil), // 24: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 25: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 26: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 27: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 28: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 29: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 30: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 31: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 32: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 33: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 34: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 35: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 36: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 37: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 38: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 39: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 40: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 41: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 42: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 43: o2control.TaskClassInfo - (*CommandInfo)(nil), // 44: o2control.CommandInfo - (*ChannelInfo)(nil), // 45: o2control.ChannelInfo - (*TaskInfo)(nil), // 46: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 47: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 48: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 49: o2control.GetRolesRequest - (*RoleInfo)(nil), // 50: o2control.RoleInfo - (*GetRolesReply)(nil), // 51: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 52: o2control.GetWorkflowTemplatesRequest - (*WorkflowTemplateInfo)(nil), // 53: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 54: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 55: o2control.ListReposRequest - (*RepoInfo)(nil), // 56: o2control.RepoInfo - (*ListReposReply)(nil), // 57: o2control.ListReposReply - (*AddRepoRequest)(nil), // 58: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 59: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 60: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 61: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 62: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 63: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 64: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 65: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 66: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 67: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 68: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 69: o2control.IntegratedServiceInfo - nil, // 70: o2control.EnvironmentInfo.DefaultsEntry - nil, // 71: o2control.EnvironmentInfo.VarsEntry - nil, // 72: o2control.EnvironmentInfo.UserVarsEntry - nil, // 73: o2control.NewEnvironmentRequest.VarsEntry - nil, // 74: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 75: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 76: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 77: o2control.TaskInfo.PropertiesEntry - nil, // 78: o2control.RoleInfo.DefaultsEntry - nil, // 79: o2control.RoleInfo.VarsEntry - nil, // 80: o2control.RoleInfo.UserVarsEntry - nil, // 81: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 82: o2control.ListIntegratedServicesReply.ServicesEntry + (VarSpecMessage_UiWidget)(0), // 3: o2control.VarSpecMessage.UiWidget + (VarSpecMessage_Type)(0), // 4: o2control.VarSpecMessage.Type + (*Event_MesosHeartbeat)(nil), // 5: o2control.Event_MesosHeartbeat + (*Ev_EnvironmentEvent)(nil), // 6: o2control.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 7: o2control.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 8: o2control.Ev_RoleEvent + (*StatusRequest)(nil), // 9: o2control.StatusRequest + (*StatusReply)(nil), // 10: o2control.StatusReply + (*StatusUpdate)(nil), // 11: o2control.StatusUpdate + (*Event)(nil), // 12: o2control.Event + (*SubscribeRequest)(nil), // 13: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 14: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 15: o2control.Version + (*GetFrameworkInfoReply)(nil), // 16: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 17: o2control.TeardownRequest + (*TeardownReply)(nil), // 18: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 19: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 20: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 21: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 22: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 23: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 24: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 25: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 26: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 27: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 28: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 29: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 30: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 31: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply + (*SetEnvironmentPropertiesRequest)(nil), // 35: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 36: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 37: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 38: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 39: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 40: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 41: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 42: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 43: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 44: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 45: o2control.TaskClassInfo + (*CommandInfo)(nil), // 46: o2control.CommandInfo + (*ChannelInfo)(nil), // 47: o2control.ChannelInfo + (*TaskInfo)(nil), // 48: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 49: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 50: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 51: o2control.GetRolesRequest + (*RoleInfo)(nil), // 52: o2control.RoleInfo + (*GetRolesReply)(nil), // 53: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 54: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 55: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 56: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 57: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 58: o2control.ListReposRequest + (*RepoInfo)(nil), // 59: o2control.RepoInfo + (*ListReposReply)(nil), // 60: o2control.ListReposReply + (*AddRepoRequest)(nil), // 61: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 62: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 63: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 64: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 65: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 66: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 67: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 68: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 69: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 70: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 71: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 72: o2control.IntegratedServiceInfo + nil, // 73: o2control.EnvironmentInfo.DefaultsEntry + nil, // 74: o2control.EnvironmentInfo.VarsEntry + nil, // 75: o2control.EnvironmentInfo.UserVarsEntry + nil, // 76: o2control.NewEnvironmentRequest.VarsEntry + nil, // 77: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 78: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 79: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 80: o2control.TaskInfo.PropertiesEntry + nil, // 81: o2control.RoleInfo.DefaultsEntry + nil, // 82: o2control.RoleInfo.VarsEntry + nil, // 83: o2control.RoleInfo.UserVarsEntry + nil, // 84: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 85: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 86: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ - 9, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate + 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 3, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 4, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent - 5, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent - 6, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent - 13, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 19, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 37, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 70, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 71, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 72, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 73, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 19, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 74, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 19, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 50, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 5, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat + 6, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent + 7, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent + 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent + 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 39, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 73, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 74, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 75, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 76, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 77, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 52, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 29, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 29, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 48, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 75, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 76, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 38, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 37, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 46, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 37, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 43, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 45, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 45, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 44, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 77, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 37, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 37, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 50, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 78, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 79, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 80, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 81, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 50, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 53, // 41: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 56, // 42: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 82, // 43: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 69, // 44: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 7, // 45: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 12, // 46: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 15, // 47: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 17, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 22, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 20, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 24, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 26, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 28, // 53: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 31, // 54: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 39, // 55: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 41, // 56: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 47, // 57: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 49, // 58: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 52, // 59: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 55, // 60: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 58, // 61: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 60, // 62: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 62, // 63: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 63, // 64: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 64, // 65: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 65, // 66: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 11, // 67: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 67, // 68: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 69: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 14, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 16, // 71: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 18, // 72: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 23, // 73: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 21, // 74: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 25, // 75: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 27, // 76: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 30, // 77: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 32, // 78: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 40, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 42, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 48, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 51, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 54, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 57, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 59, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 61, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 67, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 67, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 67, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 66, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 10, // 91: o2control.Control.Subscribe:output_type -> o2control.Event - 68, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 69, // [69:93] is the sub-list for method output_type - 45, // [45:69] is the sub-list for method input_type - 45, // [45:45] is the sub-list for extension type_name - 45, // [45:45] is the sub-list for extension extendee - 0, // [0:45] is the sub-list for field type_name + 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 50, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 78, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 79, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 40, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 39, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 48, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 39, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 45, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 47, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 47, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 46, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 80, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 39, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 39, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 52, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 81, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 82, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 83, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 3, // 42: o2control.VarSpecMessage.uiWidgetHint:type_name -> o2control.VarSpecMessage.UiWidget + 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 86, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 55, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 72, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 19, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 53: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 54: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 55: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 41, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 43, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 49, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 51, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 54, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 58, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 61, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 63, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 65, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 66, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 67, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 68, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 70, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 73: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 74: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 75: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 76: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 77: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 78: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 79: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 80: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 81: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 42, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 44, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 50, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 53, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 57, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 60, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 62, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 64, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 70, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 70, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 70, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 69, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 95: o2control.Control.Subscribe:output_type -> o2control.Event + 71, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 73, // [73:97] is the sub-list for method output_type + 49, // [49:73] is the sub-list for method input_type + 49, // [49:49] is the sub-list for extension type_name + 49, // [49:49] is the sub-list for extension extendee + 0, // [0:49] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5696,7 +5955,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -5708,7 +5967,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -5720,7 +5979,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -5732,7 +5991,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -5744,7 +6003,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -5756,7 +6015,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -5768,7 +6027,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -5780,7 +6039,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -5792,7 +6051,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -5804,7 +6063,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -5816,7 +6075,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -5828,7 +6087,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -5840,7 +6099,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -5852,7 +6111,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -5864,7 +6123,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -5876,7 +6135,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -5888,6 +6147,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -5913,8 +6184,8 @@ func file_protos_o2control_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, - NumEnums: 3, - NumMessages: 80, + NumEnums: 5, + NumMessages: 82, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index b4e7c0585..0cbcf5e3c 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -374,19 +374,9 @@ message GetWorkflowTemplatesRequest{ bool allBranches = 3; bool allTags = 4; bool allWorkflows = 5; + //TODO: Add option for varSpec?? } - -message WorkflowTemplateInfo { - string repo = 1; - string template = 2; - string revision = 3; - map varSpecMap = 4; -} - -message GetWorkflowTemplatesReply{ - repeated WorkflowTemplateInfo workflowTemplates = 1; -} -message VarSpec { +message VarSpecMessage { enum UiWidget { editBox = 0; slider = 1; @@ -410,6 +400,17 @@ message VarSpec { repeated string allowedValues = 7; } +message WorkflowTemplateInfo { + string repo = 1; + string template = 2; + string revision = 3; + map varSpecMap = 4; +} + +message GetWorkflowTemplatesReply{ + repeated WorkflowTemplateInfo workflowTemplates = 1; +} + //////////////////////////////////////// // Repos //////////////////////////////////////// diff --git a/core/repos/repo.go b/core/repos/repo.go index a3d28c337..18b83a46d 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -230,11 +230,15 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo for _, file := range files { // Only return .yaml files if strings.HasSuffix(file.Name(), ".yaml") { + workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) // Check if workflow is public in case not allWorkflows requested // and skip it if it isn't if allWorkflows || (!allWorkflows && - IsFilePublicWorkflow(filepath.Join(r.getWorkflowDir(), file.Name()))) { - templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template(strings.TrimSuffix(file.Name(), ".yaml"))) + IsFilePublicWorkflow(workflowPath)) { + templateName := strings.TrimSuffix(file.Name(), ".yaml") + varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + if err != nil { return templates, err } + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template{ templateName, varSpecMap }) } } } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index f34ad337e..83df85cee 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -592,7 +592,10 @@ func (manager *RepoManager) GetOrderedRepolistKeys() []string { type RepoKey string type RevisionKey string -type Template string +type Template struct { + Name string + VarInfo VarSpecMap +} type Templates []Template type TemplatesByRevision map[RevisionKey]Templates type TemplatesByRepo map[RepoKey]TemplatesByRevision diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index c8142406f..66c9571f2 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -38,14 +38,14 @@ func IsFilePublicWorkflow(filePath string) bool { func IsPublicWorkflow(yamlFile []byte) bool { var nameNode struct { - Node yaml.Node `yaml:"name"` + Node yaml.Node `yaml:"Name"` } err := yaml.Unmarshal(yamlFile, &nameNode) if err != nil { return false } return nameNode.Node.Tag == "!public" } -func ParseWorkflowPublicVariableInfo(fileName string) (map[string]VarSpec, error) { +func ParseWorkflowPublicVariableInfo(fileName string) (VarSpecMap, error) { yamlFile, err := ioutil.ReadFile(fileName) if err != nil { return nil, err } @@ -53,7 +53,7 @@ func ParseWorkflowPublicVariableInfo(fileName string) (map[string]VarSpec, error err = yaml.Unmarshal(yamlFile, &nodes) if err != nil { return nil, err } - workflowVarInfo := make(map[string]VarSpec) + workflowVarInfo := make(VarSpecMap) for k, v := range nodes { if err = parseYamlPublicVars(&AuxNode{k, &v }, &workflowVarInfo); err != nil { return nil, err @@ -63,6 +63,9 @@ func ParseWorkflowPublicVariableInfo(fileName string) (map[string]VarSpec, error return workflowVarInfo, nil } +// VarSpecMap holds a map of variable names to their variable information struct +type VarSpecMap map[string]VarSpec + // VarSpec is the type of struct into which public variable information from workflows may be parsed type VarSpec struct { DefaultValue string `yaml:"value"` @@ -74,13 +77,13 @@ type VarSpec struct { AllowedValues []string `yaml:"values"` } -// AuxNode Use an auxiliary node struct that also carries its parent name +// AuxNode Use an auxiliary node struct that also carries its parent Name type AuxNode struct { parentName string node *yaml.Node } -func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *map[string]VarSpec) error { +func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { node := auxNode.node // Recursion stops if node is nil, or isn't a mapping or a sequence node @@ -97,7 +100,7 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *map[string]VarSpec) } else if node.Kind == yaml.MappingNode { // If it's a mapping node, iterate through it // We do this decoding to have a sane key -> node map // otherwise, we get two yaml nodes for a single element - // with the first one holding the name and the second one holding the tag + // with the first one holding the Name and the second one holding the tag m := make(map[string]yaml.Node) err := node.Decode(&m) if err != nil { return err } diff --git a/core/server.go b/core/server.go index f22083204..69f25f080 100644 --- a/core/server.go +++ b/core/server.go @@ -554,7 +554,11 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo for repo, revisions := range workflowMap { for revision, templates := range revisions { for _, template := range templates { - workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{Repo: string(repo), Revision: string(revision), Template: string(template)} + workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{ + Repo: string(repo), + Revision: string(revision), + Template: template.Name, + VarSpecMap: VarSpecMapToPbVarSpecMap(template.VarInfo) } i++ } } diff --git a/core/serverutil.go b/core/serverutil.go index f3ec45a41..b4025f77d 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,6 +26,7 @@ package core import ( "fmt" + "github.com/AliceO2Group/Control/core/repos" "sync" "github.com/AliceO2Group/Control/common" @@ -218,4 +219,54 @@ func newSafeStreamsMap() SafeStreamsMap { return SafeStreamsMap{ streams: make(map[string]chan *pb.Event), } -} \ No newline at end of file +} + +func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*pb.VarSpecMessage { + ret := make(map[string]*pb.VarSpecMessage) + var vsm *pb.VarSpecMessage + for k, v := range(varSpecMap) { + vsm = &pb.VarSpecMessage { + DefaultValue: v.DefaultValue, + Type: convertVarTypeStringToEnum(v.VarType), + Label: v.Label, + Description: v.Description, + UiWidgetHint: convertUiWidgetHintStringToEnum(v.UiWidgetHint), + Panel: v.Panel, + AllowedValues: v.AllowedValues, + } + ret[k] = vsm + } + return ret +} + +func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { + switch hint { + case "editBox": + return 0 + case "slider": + return 1 + case "listBox": + return 2 + case "dropDownBox": + return 3 + case "comboBox": + return 4 + } + return -1 //TODO: What does the GUI expect as a default? +} + +func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { + switch varType { + case "bool": + return 0 + case "number": + return 1 + case "string": + return 2 + case "list": + return 3 + case "map": + return 4 + } + return -1 //TODO: What does the GUI expect as a default? +} diff --git a/go.mod b/go.mod index b71f52272..04706a747 100644 --- a/go.mod +++ b/go.mod @@ -132,7 +132,6 @@ require ( golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20210119194325-5f4716e94777 golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd // indirect - golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect From 494c0756e41279cbc308b04abc6b8f0b37552eaa Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 27 Apr 2021 12:46:16 +0300 Subject: [PATCH 0866/2352] [server] Update default widget and vartype values --- core/protos/o2control.proto | 4 +++- core/serverutil.go | 14 ++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 0cbcf5e3c..91aa2e911 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -374,7 +374,7 @@ message GetWorkflowTemplatesRequest{ bool allBranches = 3; bool allTags = 4; bool allWorkflows = 5; - //TODO: Add option for varSpec?? + //TODO: Add option for varSpec, coconut shouldn't ask for the varinfo } message VarSpecMessage { enum UiWidget { @@ -384,6 +384,7 @@ message VarSpecMessage { dropDownBox = 3; comboBox = 4; } + enum Type { bool = 0; number = 1; @@ -391,6 +392,7 @@ message VarSpecMessage { list = 3; map = 4; } + string defaultValue = 1; Type type = 2; string label = 3; diff --git a/core/serverutil.go b/core/serverutil.go index b4025f77d..f9e6a4502 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -224,7 +224,7 @@ func newSafeStreamsMap() SafeStreamsMap { func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*pb.VarSpecMessage { ret := make(map[string]*pb.VarSpecMessage) var vsm *pb.VarSpecMessage - for k, v := range(varSpecMap) { + for k, v := range varSpecMap { vsm = &pb.VarSpecMessage { DefaultValue: v.DefaultValue, Type: convertVarTypeStringToEnum(v.VarType), @@ -241,8 +241,6 @@ func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*p func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { switch hint { - case "editBox": - return 0 case "slider": return 1 case "listBox": @@ -251,8 +249,9 @@ func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { return 3 case "comboBox": return 4 + default: + return 0 // "editBox } - return -1 //TODO: What does the GUI expect as a default? } func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { @@ -261,12 +260,11 @@ func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { return 0 case "number": return 1 - case "string": - return 2 case "list": return 3 case "map": return 4 + default: + return 2 // "string" } - return -1 //TODO: What does the GUI expect as a default? -} +} \ No newline at end of file From 94762d77e4bb13e99c102c1a17e6fab0a38cabf1 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 27 Apr 2021 13:06:40 +0300 Subject: [PATCH 0867/2352] [server|coconut] Don't return variable information for coconut requests --- coconut/control/control.go | 2 +- coconut/protos/o2control.pb.go | 504 +++++++++++++++++---------------- core/protos/o2control.pb.go | 504 +++++++++++++++++---------------- core/protos/o2control.proto | 2 +- core/repos/repo.go | 9 +- core/repos/repomanager.go | 6 +- core/server.go | 2 +- 7 files changed, 526 insertions(+), 503 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 8f2c8ebc1..e932a4294 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -801,7 +801,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob var response *pb.GetWorkflowTemplatesReply response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{RepoPattern: repoPattern, RevisionPattern: revisionPattern, - AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows}, grpc.EmptyCallOption{}) + AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows, NoVarInfo: true}, grpc.EmptyCallOption{}) if err != nil { return err } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index cd5e4355b..083128460 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -3375,7 +3375,8 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` //TODO: Add option for varSpec?? + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` + NoVarInfo bool `protobuf:"varint,6,opt,name=noVarInfo,proto3" json:"noVarInfo,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3445,6 +3446,13 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } +func (x *GetWorkflowTemplatesRequest) GetNoVarInfo() bool { + if x != nil { + return x.NoVarInfo + } + return false +} + type VarSpecMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4873,7 +4881,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, @@ -4886,258 +4894,260 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, - 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index cd5e4355b..083128460 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -3375,7 +3375,8 @@ type GetWorkflowTemplatesRequest struct { RevisionPattern string `protobuf:"bytes,2,opt,name=revisionPattern,proto3" json:"revisionPattern,omitempty"` AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` - AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` //TODO: Add option for varSpec?? + AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` + NoVarInfo bool `protobuf:"varint,6,opt,name=noVarInfo,proto3" json:"noVarInfo,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3445,6 +3446,13 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } +func (x *GetWorkflowTemplatesRequest) GetNoVarInfo() bool { + if x != nil { + return x.NoVarInfo + } + return false +} + type VarSpecMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4873,7 +4881,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, @@ -4886,258 +4894,260 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, - 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 91aa2e911..68f27c20f 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -374,7 +374,7 @@ message GetWorkflowTemplatesRequest{ bool allBranches = 3; bool allTags = 4; bool allWorkflows = 5; - //TODO: Add option for varSpec, coconut shouldn't ask for the varinfo + bool noVarInfo = 6; } message VarSpecMessage { enum UiWidget { diff --git a/core/repos/repo.go b/core/repos/repo.go index 18b83a46d..23a3b084c 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -206,7 +206,7 @@ func (r *Repo) refresh() error { } // Returns a map of revision->[]templates for the repo -func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflows bool) (TemplatesByRevision, error) { +func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflows bool, noVarInfo bool) (TemplatesByRevision, error) { // Get a list of revisions (branches/tags/hash) that are matched by the revisionPattern; gitRefs filter branches and/or tags revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) if err != nil { @@ -236,8 +236,11 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo if allWorkflows || (!allWorkflows && IsFilePublicWorkflow(workflowPath)) { templateName := strings.TrimSuffix(file.Name(), ".yaml") - varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) - if err != nil { return templates, err } + var varSpecMap VarSpecMap + if !noVarInfo { + varSpecMap, err = ParseWorkflowPublicVariableInfo(workflowPath) + if err != nil { return templates, err } + } templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template{ templateName, varSpecMap }) } } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 83df85cee..e3e16d65c 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -601,7 +601,7 @@ type TemplatesByRevision map[RevisionKey]Templates type TemplatesByRepo map[RepoKey]TemplatesByRevision // Returns a map of templates: repo -> revision -> []templates -func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool) (TemplatesByRepo, int, error) { +func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool, noVarInfo bool) (TemplatesByRepo, int, error) { templateList := make(TemplatesByRepo) numTemplates := 0 @@ -647,9 +647,9 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat var templates TemplatesByRevision var err error if revisionPattern == "" { // If the revision pattern is empty, use the default revision - templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows) + templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows, noVarInfo) } else { - templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows) + templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows, noVarInfo) } if err != nil { diff --git a/core/server.go b/core/server.go index 69f25f080..28e2b7f90 100644 --- a/core/server.go +++ b/core/server.go @@ -543,7 +543,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows()) + workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows(), req.GetNoVarInfo()) if err != nil { return nil, status.New(codes.InvalidArgument, "cannot query available workflows for " + req.GetRepoPattern() + "@" + req.GetRevisionPattern() + ": " + err.Error()).Err() From 00f0196b660d68d1d14803583ec4ffce162caf10 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 27 Apr 2021 13:27:16 +0300 Subject: [PATCH 0868/2352] [repos] Fix case whoops --- core/repos/repoutils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 66c9571f2..3fdb9adc8 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -38,7 +38,7 @@ func IsFilePublicWorkflow(filePath string) bool { func IsPublicWorkflow(yamlFile []byte) bool { var nameNode struct { - Node yaml.Node `yaml:"Name"` + Node yaml.Node `yaml:"name"` } err := yaml.Unmarshal(yamlFile, &nameNode) if err != nil { return false } From 8e32492ece9468502e0af0481ca4e2755443fec8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 16:00:42 +0200 Subject: [PATCH 0869/2352] [core] Document VarSpec entries and make string the default type --- coconut/protos/o2control.pb.go | 30 +++++++++++++++--------------- core/protos/o2control.pb.go | 30 +++++++++++++++--------------- core/protos/o2control.proto | 14 +++++++------- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 083128460..868def6d8 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -210,9 +210,9 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_UiWidget int32 const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 ) @@ -265,9 +265,9 @@ func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_Type int32 const ( - VarSpecMessage_bool VarSpecMessage_Type = 0 + VarSpecMessage_string VarSpecMessage_Type = 0 VarSpecMessage_number VarSpecMessage_Type = 1 - VarSpecMessage_string VarSpecMessage_Type = 2 + VarSpecMessage_bool VarSpecMessage_Type = 2 VarSpecMessage_list VarSpecMessage_Type = 3 VarSpecMessage_map VarSpecMessage_Type = 4 ) @@ -275,16 +275,16 @@ const ( // Enum value maps for VarSpecMessage_Type. var ( VarSpecMessage_Type_name = map[int32]string{ - 0: "bool", + 0: "string", 1: "number", - 2: "string", + 2: "bool", 3: "list", 4: "map", } VarSpecMessage_Type_value = map[string]int32{ - "bool": 0, + "string": 0, "number": 1, - "string": 2, + "bool": 2, "list": 3, "map": 4, } @@ -3463,8 +3463,8 @@ type VarSpecMessage struct { Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` - Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` - AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` + Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input + AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) } func (x *VarSpecMessage) Reset() { @@ -3510,7 +3510,7 @@ func (x *VarSpecMessage) GetType() VarSpecMessage_Type { if x != nil { return x.Type } - return VarSpecMessage_bool + return VarSpecMessage_string } func (x *VarSpecMessage) GetLabel() string { @@ -4920,9 +4920,9 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, + 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 083128460..868def6d8 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -210,9 +210,9 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_UiWidget int32 const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 ) @@ -265,9 +265,9 @@ func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_Type int32 const ( - VarSpecMessage_bool VarSpecMessage_Type = 0 + VarSpecMessage_string VarSpecMessage_Type = 0 VarSpecMessage_number VarSpecMessage_Type = 1 - VarSpecMessage_string VarSpecMessage_Type = 2 + VarSpecMessage_bool VarSpecMessage_Type = 2 VarSpecMessage_list VarSpecMessage_Type = 3 VarSpecMessage_map VarSpecMessage_Type = 4 ) @@ -275,16 +275,16 @@ const ( // Enum value maps for VarSpecMessage_Type. var ( VarSpecMessage_Type_name = map[int32]string{ - 0: "bool", + 0: "string", 1: "number", - 2: "string", + 2: "bool", 3: "list", 4: "map", } VarSpecMessage_Type_value = map[string]int32{ - "bool": 0, + "string": 0, "number": 1, - "string": 2, + "bool": 2, "list": 3, "map": 4, } @@ -3463,8 +3463,8 @@ type VarSpecMessage struct { Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` - Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` - AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` + Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input + AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) } func (x *VarSpecMessage) Reset() { @@ -3510,7 +3510,7 @@ func (x *VarSpecMessage) GetType() VarSpecMessage_Type { if x != nil { return x.Type } - return VarSpecMessage_bool + return VarSpecMessage_string } func (x *VarSpecMessage) GetLabel() string { @@ -4920,9 +4920,9 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, + 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 68f27c20f..99be0c5a2 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -378,17 +378,17 @@ message GetWorkflowTemplatesRequest{ } message VarSpecMessage { enum UiWidget { - editBox = 0; - slider = 1; - listBox = 2; + editBox = 0; // plain string input line, can accept types number and string + slider = 1; // input widget exclusively for numbers, range allowedValues[0]-[1] + listBox = 2; // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed dropDownBox = 3; comboBox = 4; } enum Type { - bool = 0; + string = 0; number = 1; - string = 2; + bool = 2; list = 3; map = 4; } @@ -398,8 +398,8 @@ message VarSpecMessage { string label = 3; string description = 4; UiWidget uiWidgetHint = 5; - string panel = 6; - repeated string allowedValues = 7; + string panel = 6; // hint for the UI on where to put or group the given variable input + repeated string allowedValues = 7; // list of offered values from which to choose (only for some UiWidgets) } message WorkflowTemplateInfo { From 7cc99d732b0bf4dbf81e63989f18822eceaae2be Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 28 Apr 2021 17:10:45 +0300 Subject: [PATCH 0870/2352] [server] Update vartype enum converter --- core/serverutil.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/serverutil.go b/core/serverutil.go index f9e6a4502..5639f3096 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -256,15 +256,15 @@ func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { switch varType { - case "bool": - return 0 case "number": return 1 + case "bool": + return 0 case "list": return 3 case "map": return 4 default: - return 2 // "string" + return 0 // "string" } -} \ No newline at end of file +} From 90ddb7fbc3bb001faa159551246e404fe24cfe0f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 28 Apr 2021 17:11:51 +0300 Subject: [PATCH 0871/2352] [server] Fix bool number in vartype enum --- core/serverutil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/serverutil.go b/core/serverutil.go index 5639f3096..3a5e04510 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -259,7 +259,7 @@ func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { case "number": return 1 case "bool": - return 0 + return 2 case "list": return 3 case "map": From 85d7e47051a676d6b360b0709a718e6fb094d495 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 16:13:43 +0200 Subject: [PATCH 0872/2352] [core] Set default varspec type to string --- core/serverutil.go | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/core/serverutil.go b/core/serverutil.go index 3a5e04510..07a72bf60 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,9 +26,10 @@ package core import ( "fmt" - "github.com/AliceO2Group/Control/core/repos" "sync" + "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/channel" @@ -255,16 +256,9 @@ func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { } func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { - switch varType { - case "number": - return 1 - case "bool": - return 2 - case "list": - return 3 - case "map": - return 4 - default: - return 0 // "string" + msgType, ok := pb.VarSpecMessage_Type_value[varType] + if !ok { + msgType = int32(pb.VarSpecMessage_string) } + return pb.VarSpecMessage_Type(msgType) } From 5d0d3b54f3d31119732b893f88625e347f6bc26e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Apr 2021 17:25:20 +0200 Subject: [PATCH 0873/2352] [common] Introduce runtype.RunType enum, matches DCS Protobuf RunType --- Makefile | 2 +- common/runtype/runtype.go | 41 +++++++++ common/runtype/runtype_strings.go | 145 ++++++++++++++++++++++++++++++ common/system/systemid.go | 4 +- 4 files changed, 188 insertions(+), 4 deletions(-) create mode 100644 common/runtype/runtype.go create mode 100644 common/runtype/runtype_strings.go diff --git a/Makefile b/Makefile index b331db870..0e12a5333 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut # Use linker flags to provide version/build settings to the target diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go new file mode 100644 index 000000000..6c858a3bd --- /dev/null +++ b/common/runtype/runtype.go @@ -0,0 +1,41 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate go run github.com/dmarkham/enumer -type=RunType -yaml -json -text -transform=upper -output=runtype_strings.go + +package runtype + +// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go +type RunType int +const ( + NONE RunType = iota + PHYSICS + TECHNICAL + PEDESTAL + PULSER + + // no correspondence with DCS: + CALIBRATION + COSMIC +) \ No newline at end of file diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go new file mode 100644 index 000000000..e0322012b --- /dev/null +++ b/common/runtype/runtype_strings.go @@ -0,0 +1,145 @@ +// Code generated by "enumer -type=RunType -yaml -json -text -transform=upper -output=runtype_strings.go"; DO NOT EDIT. + +package runtype + +import ( + "encoding/json" + "fmt" + "strings" +) + +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERCALIBRATIONCOSMIC" + +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 45, 51} + +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulsercalibrationcosmic" + +func (i RunType) String() string { + if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { + return fmt.Sprintf("RunType(%d)", i) + } + return _RunTypeName[_RunTypeIndex[i]:_RunTypeIndex[i+1]] +} + +// An "invalid array index" compiler error signifies that the constant values have changed. +// Re-run the stringer command to generate them again. +func _RunTypeNoOp() { + var x [1]struct{} + _ = x[NONE-(0)] + _ = x[PHYSICS-(1)] + _ = x[TECHNICAL-(2)] + _ = x[PEDESTAL-(3)] + _ = x[PULSER-(4)] + _ = x[CALIBRATION-(5)] + _ = x[COSMIC-(6)] +} + +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, CALIBRATION, COSMIC} + +var _RunTypeNameToValueMap = map[string]RunType{ + _RunTypeName[0:4]: NONE, + _RunTypeLowerName[0:4]: NONE, + _RunTypeName[4:11]: PHYSICS, + _RunTypeLowerName[4:11]: PHYSICS, + _RunTypeName[11:20]: TECHNICAL, + _RunTypeLowerName[11:20]: TECHNICAL, + _RunTypeName[20:28]: PEDESTAL, + _RunTypeLowerName[20:28]: PEDESTAL, + _RunTypeName[28:34]: PULSER, + _RunTypeLowerName[28:34]: PULSER, + _RunTypeName[34:45]: CALIBRATION, + _RunTypeLowerName[34:45]: CALIBRATION, + _RunTypeName[45:51]: COSMIC, + _RunTypeLowerName[45:51]: COSMIC, +} + +var _RunTypeNames = []string{ + _RunTypeName[0:4], + _RunTypeName[4:11], + _RunTypeName[11:20], + _RunTypeName[20:28], + _RunTypeName[28:34], + _RunTypeName[34:45], + _RunTypeName[45:51], +} + +// RunTypeString retrieves an enum value from the enum constants string name. +// Throws an error if the param is not part of the enum. +func RunTypeString(s string) (RunType, error) { + if val, ok := _RunTypeNameToValueMap[s]; ok { + return val, nil + } + s = strings.ToLower(s) + if val, ok := _RunTypeNameToValueMap[s]; ok { + return val, nil + } + return 0, fmt.Errorf("%s does not belong to RunType values", s) +} + +// RunTypeValues returns all values of the enum +func RunTypeValues() []RunType { + return _RunTypeValues +} + +// RunTypeStrings returns a slice of all String values of the enum +func RunTypeStrings() []string { + strs := make([]string, len(_RunTypeNames)) + copy(strs, _RunTypeNames) + return strs +} + +// IsARunType returns "true" if the value is listed in the enum definition. "false" otherwise +func (i RunType) IsARunType() bool { + for _, v := range _RunTypeValues { + if i == v { + return true + } + } + return false +} + +// MarshalJSON implements the json.Marshaler interface for RunType +func (i RunType) MarshalJSON() ([]byte, error) { + return json.Marshal(i.String()) +} + +// UnmarshalJSON implements the json.Unmarshaler interface for RunType +func (i *RunType) UnmarshalJSON(data []byte) error { + var s string + if err := json.Unmarshal(data, &s); err != nil { + return fmt.Errorf("RunType should be a string, got %s", data) + } + + var err error + *i, err = RunTypeString(s) + return err +} + +// MarshalText implements the encoding.TextMarshaler interface for RunType +func (i RunType) MarshalText() ([]byte, error) { + return []byte(i.String()), nil +} + +// UnmarshalText implements the encoding.TextUnmarshaler interface for RunType +func (i *RunType) UnmarshalText(text []byte) error { + var err error + *i, err = RunTypeString(string(text)) + return err +} + +// MarshalYAML implements a YAML Marshaler for RunType +func (i RunType) MarshalYAML() (interface{}, error) { + return i.String(), nil +} + +// UnmarshalYAML implements a YAML Unmarshaler for RunType +func (i *RunType) UnmarshalYAML(unmarshal func(interface{}) error) error { + var s string + if err := unmarshal(&s); err != nil { + return err + } + + var err error + *i, err = RunTypeString(s) + return err +} diff --git a/common/system/systemid.go b/common/system/systemid.go index 2a66010a9..ee5cf489d 100644 --- a/common/system/systemid.go +++ b/common/system/systemid.go @@ -22,15 +22,13 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +//go:generate go run github.com/dmarkham/enumer -type=ID -yaml -json -text -transform=upper -output=systemid_strings.go package system // Source: https://alice-notes.web.cern.ch/system/files/notes/public/1052/2020-07-15-2020-07-07-O2_Report_Identification_of_sources_for_ALICE_data.pdf // System ID mapping on page 3 - -//go:generate go run github.com/dmarkham/enumer -type=ID -yaml -json -text -transform=upper -output=systemid_strings.go - type ID int const ( // 1 From 2b6ea1a3c673aa705de5ea7b9d73cf58625a8bd7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Apr 2021 14:10:07 +0200 Subject: [PATCH 0874/2352] [core] Document IntegratedServices API values --- core/protos/o2control.proto | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 99be0c5a2..aaebf8e66 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -474,13 +474,13 @@ message Empty { } message ListIntegratedServicesReply { - map services = 1; + map services = 1; // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead } message IntegratedServiceInfo { - string name = 1; + string name = 1; // user-visible service name, e.g. "DD scheduler" bool enabled = 2; string endpoint = 3; - string connectionState = 4; - string data = 5; + string connectionState = 4; // allowed values: READY, CONNECTING, TRANSIENT_FAILURE, IDLE, SHUTDOWN + string data = 5; // always a JSON payload with a map inside. } \ No newline at end of file From ff44682ff52eb7e62a1f4b95ad61298653efcdf0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 May 2021 11:08:22 +0200 Subject: [PATCH 0875/2352] [core] Report a channel mismatch error on bad channel configuration --- core/task/channel/outbound.go | 14 +++++++++++--- core/task/task.go | 29 ++++++++++++++++++----------- core/task/tasks.go | 7 ++++++- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index b42732d1f..d7652e295 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -25,6 +25,7 @@ package channel import ( + "fmt" "strconv" "strings" @@ -97,8 +98,9 @@ chans.data1.0.type = pull chans.data1.numSockets = 1 */ -func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.PropertyMap) { +func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.PropertyMap, err error) { if outbound == nil { + err = fmt.Errorf("outbound channel object is nil") return } @@ -110,24 +112,30 @@ func (outbound *Outbound) ToFMQMap(bindMap BindMap) (pm controlcommands.Property address = outbound.Target transport = outbound.Transport } else { + matched := false + // we don't need class.Bind data for this one, only task.bindPorts after resolving paths! for chPath, endpoint := range bindMap { + // FIXME: implement more sophisticated channel matching here if outbound.Target == chPath { - // We have a match, so we generate a resolved target address and break address = endpoint.GetAddress() transport = endpoint.GetTransport() + matched = true break } } + if !matched { + err = fmt.Errorf("could not match target for outbound channel %s", outbound.Target) + } } if len(address) == 0 { return } - return outbound.buildFMQMap(address, transport) + return outbound.buildFMQMap(address, transport), err } func (outbound *Outbound) buildFMQMap(address string, transport TransportType) (pm controlcommands.PropertyMap) { diff --git a/core/task/task.go b/core/task/task.go index 6d1e49310..5715210fb 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -40,10 +40,10 @@ import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/controlcommands" @@ -247,6 +247,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // parametrizing these values for all control modes. // THIS BREAKS TASK CLASS REUSE! See OCTRL-227 if class.Control.Mode == controlmode.BASIC || + class.Control.Mode == controlmode.HOOK || class.Control.Mode == controlmode.DIRECT || class.Control.Mode == controlmode.FAIRMQ { var varStack map[string]string @@ -431,11 +432,12 @@ func fillCommonProperties(t *Task, propMap controlcommands.PropertyMap) { propMap["environment_id"] = envId.String() } -func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap) { +func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommands.PropertyMap, err error) { propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task or hook, we template the props if t.GetParent() == nil { + err = fmt.Errorf("cannot build property map for parentless task %s (id %s)", t.name, t.taskId) return } @@ -444,9 +446,10 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // First we get the full varStack from the parent role, and // consolidate it. - varStack, err := t.GetParent().ConsolidatedVarStack() + var varStack map[string]string + varStack, err = t.GetParent().ConsolidatedVarStack() if err != nil { - log.WithError(err).Error("cannot fetch variables stack for property map") + err = fmt.Errorf("cannot fetch variables stack for property map: %w", err) return } @@ -454,7 +457,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // the class Defaults are overridden by anything else. varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) if err != nil { - log.WithError(err).Error("cannot fetch task class defaults for property map") + err = fmt.Errorf("cannot fetch task class defaults for property map: %w", err) return } @@ -476,10 +479,10 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand endpoint, ok := t.localBindMap[inbCh.Name] if !ok { log.WithFields(logrus.Fields{ - "channelName": inbCh.Name, - "taskName": t.name, - }). - Error("endpoint not allocated for inbound channel") + "channelName": inbCh.Name, + "taskName": t.name, + }). + Warn("endpoint not allocated for inbound channel") continue } @@ -493,7 +496,11 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand } for _, outboundCh := range channel.MergeOutbound(t.GetParent().CollectOutboundChannels(), class.Connect) { // We get the FairMQ-formatted propertyMap from the outbound channel spec - chanProps := outboundCh.ToFMQMap(bindMap) + var chanProps controlcommands.PropertyMap + chanProps, err = outboundCh.ToFMQMap(bindMap) + if err != nil { + return nil, err + } // And if valid, we copy it into the task's propertyMap if len(chanProps) > 0 { @@ -539,7 +546,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand } } - return propMap + return propMap, err } func (t *Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { diff --git a/core/task/tasks.go b/core/task/tasks.go index 7900f190e..f7d821853 100644 --- a/core/task/tasks.go +++ b/core/task/tasks.go @@ -109,7 +109,12 @@ func (m Tasks) BuildPropertyMaps(bindMap channel.BindMap) (propMapMap controlcom } receiver := task.GetMesosCommandTarget() - propMapMap[receiver] = task.BuildPropertyMap(bindMap) + var taskPropMap controlcommands.PropertyMap + taskPropMap, err = task.BuildPropertyMap(bindMap) + if err != nil { + return nil, err + } + propMapMap[receiver] = taskPropMap } return } \ No newline at end of file From f0f518c463ac2a545abc96c356f808242648696a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 May 2021 12:12:44 +0200 Subject: [PATCH 0876/2352] [core] Add task information in channel config generator error --- core/task/task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index 5715210fb..e11799e07 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -499,7 +499,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand var chanProps controlcommands.PropertyMap chanProps, err = outboundCh.ToFMQMap(bindMap) if err != nil { - return nil, err + return nil, fmt.Errorf("task %s channel generation failed: %w", t.GetName(), err) } // And if valid, we copy it into the task's propertyMap From fb6789bfa50f36e56eb77a046fa3e5c65ad03685 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Mon, 3 May 2021 12:34:45 +0200 Subject: [PATCH 0877/2352] [core] CreateEnvironment avoid overwrite error on failed deployment --- core/environment/manager.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index f4883f698..e6c364c6c 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -158,7 +158,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally - err = envs.TeardownEnvironment(env.Id(), true/*force*/) + // We do not get the error here cause it overwrites the failed deployment error + // with which results to server.go to report back + // cannot get newly created environment: no environment with id + _ = envs.TeardownEnvironment(env.Id(), true/*force*/) killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { @@ -468,7 +471,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally - err = envs.TeardownEnvironment(env.Id(), true/*force*/) + _ = envs.TeardownEnvironment(env.Id(), true/*force*/) killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { From 3a8c2b627b99eb362bde4f1cc79248eefb3820d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 May 2021 14:26:34 +0200 Subject: [PATCH 0878/2352] [core] Ensure task class defaults are template-processed --- core/task/task.go | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index e11799e07..e0d3631d7 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -261,9 +261,22 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return } - // We wrap the parent varStack around the class Defaults, ensuring - // the class Defaults are overridden by anything else. - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) + // We make a copy of the Defaults map from the taskClass, this is necessary because + // entries may be templated, so they may resolve to different values in each task. + localDefaults := class.Defaults.Copy().Raw() + + // We resolve any template expressions in Defaults + defaultFields := template.WrapMapItems(localDefaults) + + err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template)) + if err != nil { + t.commandInfo = &common.TaskCommandInfo{} + log.WithError(err).Error("cannot resolve templates for task defaults") + } + + // We wrap the parent varStack around the task's already processed Defaults, + // ensuring that any taskclass Defaults are overridden by anything else. + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) if err != nil { log.WithError(err).Error("cannot fetch task class defaults for task command info") return From cbe39468b8565f23755fe8992f7b13ae1f0b0eb7 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Fri, 30 Apr 2021 14:24:11 +0200 Subject: [PATCH 0879/2352] [core] Repo getDefaultRevision on refresh --- core/repos/repo.go | 14 +++++++++++++- core/repos/repomanager.go | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 23a3b084c..09cbc315a 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -197,7 +197,7 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } - err = r.checkoutRevision(r.DefaultRevision) + err = r.checkoutRevision(r.getDefaultRevision()) if err != nil { return err } @@ -325,4 +325,16 @@ func (r*Repo) updateDefaultRevision(revision string) (string, error) { r.DefaultRevision = revision return "", nil +} + +func (r*Repo) getDefaultRevision() (string) { + rs := &RepoService{Svc: apricot.Instance()} + revsMap, err := rs.GetRepoDefaultRevisions() + if err != nil { + return r.DefaultRevision + } + if defaultRevision, ok := revsMap[r.GetIdentifier()]; ok { + r.DefaultRevision = defaultRevision + } + return r.DefaultRevision } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index e3e16d65c..b201fd8bb 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -387,6 +387,7 @@ func (manager *RepoManager) RefreshRepos() error { for _, repo := range manager.repoList { + manager.defaultRevisions[repo.GetIdentifier()] = repo.getDefaultRevision() err := repo.refresh() if err != nil { return errors.New("refresh repo for " + repo.GetIdentifier() + ":" + err.Error()) From 5cffd144d7c74c1e767385f506642e69549d9bf0 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 5 Feb 2021 16:16:39 +0100 Subject: [PATCH 0880/2352] [core] Add Bookkeeping integration --- core/bookkeeping/api.go | 117 ++++++++++++++++++++++++++++++++++++++++ core/the/singleton.go | 5 ++ go.mod | 4 ++ go.sum | 2 + 4 files changed, 128 insertions(+) create mode 100644 core/bookkeeping/api.go diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go new file mode 100644 index 000000000..6837c0333 --- /dev/null +++ b/core/bookkeeping/api.go @@ -0,0 +1,117 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +// This package instantiates the bookkeeping API client. There is one +// issue with the local import in github.com/AliceO2Group/Bookkeeping/go-api-client/src +// which should be fixed, or otherwise we need to mirror the BookkeepingAPI.go here. +// The other possible issue is that currently all the call instead of returning the +// responses and the errors they use fmt.Println(). This can be solved again by mirroring, +// and changing the implementation of the BookkeepingAPI.go to return instead of printing, +// but this is not a valid solution since we have to reflect every change that might occur +// on the file. +package bookkeeping + +import ( + "sync" + + clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" + sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" +) + +const ( + bookkeepingBaseUrl = "http://vm4.jiskefet.io/api" + // APItoken provided doesn't work, we should contact team on how to generate one. + bookkeepingAPIToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NzQ2NjQwLCJ1c2VybmFtZSI6ImF3ZWdyenluIiwiYWNjZXNzIjoxLCJpYXQiOjE2MTA1NDM0ODYsImV4cCI6MTYxMDYyOTg4NiwiaXNzIjoibzItdWkifQ.8pM1K0HIfpnZop7bJk_rD5GvkfeiWaNNs2S7ZM1tqYg" +) + +type BookkeepingWrapper struct {} + +var ( + once sync.Once + // mock instance + instance *BookkeepingWrapper +) +func Instance() *BookkeepingWrapper { + once.Do(func() { + clientAPI.InitializeApi(bookkeepingBaseUrl, bookkeepingAPIToken) + }) + return instance +} + +func initializeBookkeepingAPI() *BookkeepingWrapper { + var bkw BookkeepingWrapper + clientAPI.InitializeApi(bookkeepingBaseUrl, bookkeepingAPIToken) + return &bkw + +} + + +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int, runType string, timeO2Start int64, timeTrgStart int64){ + var runtypeAPI sw.RunType + switch runType { + case string(sw.TECHNICAL_RunType): + runtypeAPI = sw.TECHNICAL_RunType + case string(sw.COSMICS_RunType): + runtypeAPI = sw.COSMICS_RunType + case string(sw.PHYSICS_RunType): + runtypeAPI = sw.PHYSICS_RunType + default: + // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType + runtypeAPI = sw.TECHNICAL_RunType + } + + clientAPI.CreateRun(activityId, int64(nDetectors),int64(nEpns),int64(nFlps),int64(runNumber), runtypeAPI, timeO2Start, timeTrgStart) + +} + +func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End int64, timeTrgEnd int64){ + var runquality sw.RunQuality + switch runResult { + case string(sw.GOOD_RunQuality): + runquality = sw.GOOD_RunQuality + case string(sw.BAD_RunQuality): + runquality = sw.BAD_RunQuality + case string(sw.UNKNOWN_RunQuality): + runquality = sw.UNKNOWN_RunQuality + default: + // log runquality is %s and it is not valid. overwrite with UNKNOWN_RunQuality + runquality = sw.UNKNOWN_RunQuality + } + + clientAPI.UpdateRun(int64(runNumber), runquality, timeO2End, timeTrgEnd) +} + + +func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int64){ + clientAPI.CreateLog(text, title, runNumbers, parentLogId) +} + + +func (bk *BookkeepingWrapper) GetLogs(){ + clientAPI.GetLogs() +} + +func (bk *BookkeepingWrapper) GetRuns(){ + clientAPI.GetRuns() +} \ No newline at end of file diff --git a/core/the/singleton.go b/core/the/singleton.go index 651eda35e..cea09d902 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -27,6 +27,7 @@ package the import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/core/bookkeeping" "github.com/AliceO2Group/Control/core/repos" ) @@ -36,4 +37,8 @@ func ConfSvc() configuration.Service { func RepoManager() *repos.RepoManager { return repos.Instance(ConfSvc()) +} + +func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { + return bookkeeping.Instance() } \ No newline at end of file diff --git a/go.mod b/go.mod index 04706a747..2d84059b4 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,10 @@ require ( github.com/briandowns/spinner v1.12.0 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect + github.com/AliceO2Group/Bookkeeping v0.16.3 + github.com/antonmedv/expr v1.4.5 + github.com/armon/go-metrics v0.3.3 // indirect + github.com/briandowns/spinner v1.11.1 github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.25+incompatible // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect diff --git a/go.sum b/go.sum index 566a10a52..b57936042 100644 --- a/go.sum +++ b/go.sum @@ -75,6 +75,8 @@ github.com/AlecAivazis/survey/v2 v2.1.1 h1:LEMbHE0pLj75faaVEKClEX1TM4AJmmnOh9eim github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= github.com/AlecAivazis/survey/v2 v2.2.7 h1:5NbxkF4RSKmpywYdcRgUmos1o+roJY8duCLZXbVjoig= github.com/AlecAivazis/survey/v2 v2.2.7/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= +github.com/AliceO2Group/Bookkeeping v0.16.3 h1:4Ng3xtgrVarj1YFyEdAUkjXUv44HHjry7LjuMJUaykA= +github.com/AliceO2Group/Bookkeeping v0.16.3/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From bfcb64d04a57b987c9b1147eacc7a0c7c4c7bda2 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 5 Feb 2021 16:19:27 +0100 Subject: [PATCH 0881/2352] [core] Use Bookkeeping API to CreateRun,CreateLog and UpdateRun --- core/environment/environment.go | 18 ++++++++++++++++++ core/environment/transition_startactivity.go | 11 +++++++++++ core/environment/transition_stopactivity.go | 6 ++++++ 3 files changed, 35 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 9e0d4dc7b..7b9c66659 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -508,3 +508,21 @@ func (env *Environment) GetFLPs() []string { stringFLPs = strings.Replace(stringFLPs,`"`,"",-1) return strings.Split(stringFLPs,",") } + +func (env *Environment) GetRunType() string { + if env == nil { + return "" + } + env.Mu.RLock() + defer env.Mu.RUnlock() + varStack, _ := gera.FlattenStack( + env.workflow.GetDefaults(), + env.workflow.GetVars(), + env.workflow.GetUserVars(), + ) + if runtype, ok := varStack["runtype"]; ok { + return runtype + + } + return "" +} diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 37dc77c12..e27c3fdb3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,7 +26,9 @@ package environment import ( "errors" + "fmt" "strconv" + "time" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -66,6 +68,14 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), } + the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, env.GetNumberOfFLPs(), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) + // According to documentation the 1st input should + // a text Log entry that is written by the shifter + // TODO (malexis): we need to implement a way to + // get the text from the shifter + runNumberStr := strconv.FormatUint(uint64(runNumber), 10 ) + the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.CONFIGURED.String(), @@ -79,6 +89,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now().Unix(), time.Now().Unix()) env.currentRunNumber = 0 return tasksStateErrors } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 9aa22c4d9..cb063e048 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -26,9 +26,12 @@ package environment import ( "errors" + "time" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -50,6 +53,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { } log.WithField(infologger.Run, env.currentRunNumber).Info("stopping run") + runNumber := env.currentRunNumber env.currentRunNumber = 0 @@ -66,8 +70,10 @@ func (t StopActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now().Unix(), time.Now().Unix()) return tasksStateErrors } + the.BookkeepingAPI().UpdateRun(int(runNumber), "good", time.Now().Unix(), time.Now().Unix()) env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return From 52c3b8a8ccb9b65fc09ed05aa086a325d26e407f Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 24 Feb 2021 17:21:07 +0100 Subject: [PATCH 0882/2352] [core] Add CreateFLP from Bookkeeping API --- core/bookkeeping/api.go | 7 +++++++ core/environment/transition_startactivity.go | 8 ++++++-- go.mod | 5 +---- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 6837c0333..3b5381db0 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -107,6 +107,13 @@ func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers st clientAPI.CreateLog(text, title, runNumbers, parentLogId) } +func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int64 ){ + clientAPI.CreateFlp(name, hostName, runNumber) +} + +func (bk *BookkeepingWrapper) UpdateFlp(flpId int64, name string, nSubtimeframes int64, nEquipmentBytes int64, nRecordingBytes int64, nFairMQBytes int64){ + clientAPI.UpdateFlp(flpId, name, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) +} func (bk *BookkeepingWrapper) GetLogs(){ clientAPI.GetLogs() diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index e27c3fdb3..466b77a2e 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -67,14 +67,18 @@ func (t StartActivityTransition) do(env *Environment) (err error) { args := controlcommands.PropertyMap{ "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), } + flps := env.GetFLPs() + for _,flp := range flps { + the.BookkeepingAPI().CreateFlp(flp, flp, int64(runNumber)) + } - the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, env.GetNumberOfFLPs(), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) + the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) // According to documentation the 1st input should // a text Log entry that is written by the shifter // TODO (malexis): we need to implement a way to // get the text from the shifter runNumberStr := strconv.FormatUint(uint64(runNumber), 10 ) - the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) + // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), diff --git a/go.mod b/go.mod index 2d84059b4..da568b14c 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 + github.com/AliceO2Group/Bookkeeping v0.16.3 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -35,10 +36,6 @@ require ( github.com/briandowns/spinner v1.12.0 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect - github.com/AliceO2Group/Bookkeeping v0.16.3 - github.com/antonmedv/expr v1.4.5 - github.com/armon/go-metrics v0.3.3 // indirect - github.com/briandowns/spinner v1.11.1 github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.25+incompatible // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect From f76e2da6874ed43e70b56e804f31de4f30d1be99 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 26 Feb 2021 17:12:17 +0100 Subject: [PATCH 0883/2352] [core] Create FLPs after the CreateRun --- core/environment/transition_startactivity.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 466b77a2e..20c4beb79 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -67,17 +67,18 @@ func (t StartActivityTransition) do(env *Environment) (err error) { args := controlcommands.PropertyMap{ "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), } + flps := env.GetFLPs() + the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().UnixNano(), time.Now().Unix()) for _,flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int64(runNumber)) } - the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) // According to documentation the 1st input should // a text Log entry that is written by the shifter // TODO (malexis): we need to implement a way to // get the text from the shifter - runNumberStr := strconv.FormatUint(uint64(runNumber), 10 ) + // runNumberStr := strconv.FormatUint(uint64(runNumber), 10 ) // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) taskmanMessage := task.NewTransitionTaskMessage( From 8a01b06433d62416f6323924ce9f27d4bcd6fd59 Mon Sep 17 00:00:00 2001 From: miltalex Date: Mon, 8 Mar 2021 16:41:59 +0100 Subject: [PATCH 0884/2352] Update bookkeeping version --- core/environment/transition_startactivity.go | 1 - go.mod | 5 +++-- go.sum | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 20c4beb79..be4580c0a 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,7 +26,6 @@ package environment import ( "errors" - "fmt" "strconv" "time" diff --git a/go.mod b/go.mod index da568b14c..134df32ab 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.16.3 + github.com/AliceO2Group/Bookkeeping v0.16.6 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -132,7 +133,7 @@ require ( golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20210119194325-5f4716e94777 - golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd // indirect + golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect diff --git a/go.sum b/go.sum index b57936042..7cad4b915 100644 --- a/go.sum +++ b/go.sum @@ -77,6 +77,12 @@ github.com/AlecAivazis/survey/v2 v2.2.7 h1:5NbxkF4RSKmpywYdcRgUmos1o+roJY8duCLZX github.com/AlecAivazis/survey/v2 v2.2.7/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= github.com/AliceO2Group/Bookkeeping v0.16.3 h1:4Ng3xtgrVarj1YFyEdAUkjXUv44HHjry7LjuMJUaykA= github.com/AliceO2Group/Bookkeeping v0.16.3/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.16.4 h1:Te0bbfYUiPRoL9TiIhbIs/NP/lmUV8E8E6d6mMHYWAk= +github.com/AliceO2Group/Bookkeeping v0.16.4/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.16.6 h1:jl9OqxujN48U82M7lOfUCyIGCteW7nYHMYRCZWPxJaY= +github.com/AliceO2Group/Bookkeeping v0.16.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= @@ -1206,6 +1212,8 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd h1:2arJsLyTCJGek+eeptQ3z49Rqndm0f+zvvpwNIXWNIA= golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 6d5fe4943d8ce35d671c52f1d1ad668724e94589 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Apr 2021 16:00:02 +0200 Subject: [PATCH 0885/2352] Update Bookkeeping version --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 134df32ab..6b54c4c80 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,7 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.16.6 // indirect + github.com/AliceO2Group/Bookkeeping v0.16.8 // indirect github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect diff --git a/go.sum b/go.sum index 7cad4b915..525bf4ca5 100644 --- a/go.sum +++ b/go.sum @@ -81,6 +81,8 @@ github.com/AliceO2Group/Bookkeeping v0.16.4 h1:Te0bbfYUiPRoL9TiIhbIs/NP/lmUV8E8E github.com/AliceO2Group/Bookkeeping v0.16.4/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.16.6 h1:jl9OqxujN48U82M7lOfUCyIGCteW7nYHMYRCZWPxJaY= github.com/AliceO2Group/Bookkeeping v0.16.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.16.8 h1:xNiRFMaCNLGZaDwTJz0i5l2wrkxbGfcb293jb77/8KI= +github.com/AliceO2Group/Bookkeeping v0.16.8/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= From 7df6c7de56f9fee84f10d909462e826677c77c01 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Apr 2021 16:08:11 +0200 Subject: [PATCH 0886/2352] [core] Add config entry for Bookkeeping and fix format --- core/config.go | 11 ++++++----- core/environment/transition_startactivity.go | 14 +++++++------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/core/config.go b/core/config.go index a7ffeb4fc..e54b6f403 100644 --- a/core/config.go +++ b/core/config.go @@ -95,6 +95,7 @@ func setDefaults() error { viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) viper.SetDefault("configServiceUri", "apricot://127.0.0.1:47101") + viper.SetDefault("bookkeepingBaseUri", "http://127.0.0.1:4000") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") @@ -188,7 +189,7 @@ func parseCoreConfig() error { if err := viper.ReadInConfig(); err != nil { return errors.New(coreCfgUri + ": " + err.Error()) } - } else if uri.Scheme == "consul"{ + } else if uri.Scheme == "consul" { if err := viper.AddRemoteProvider("consul", uri.Host, uri.Path); err != nil { return err } @@ -221,11 +222,11 @@ func parseCoreConfig() error { } func checkRepoDirRights() error { - repoDir := filepath.Join(viper.GetString("coreWorkingDir"),"repos") + repoDir := filepath.Join(viper.GetString("coreWorkingDir"), "repos") utils.EnsureTrailingSlash(&repoDir) err := unix.Access(repoDir, unix.W_OK) if err != nil { - return errors.New("No write access for configuration repositories path \"" + repoDir + "\": "+ err.Error()) + return errors.New("No write access for configuration repositories path \"" + repoDir + "\": " + err.Error()) } return nil } @@ -233,7 +234,7 @@ func checkRepoDirRights() error { func checkWorkingDirRights() error { err := unix.Access(viper.GetString("coreWorkingDir"), unix.W_OK) if err != nil { - return errors.New("No write access for core working path \"" + viper.GetString("coreWorkingDir") + "\": "+ err.Error()) + return errors.New("No write access for core working path \"" + viper.GetString("coreWorkingDir") + "\": " + err.Error()) } return nil } @@ -259,7 +260,7 @@ func NewConfig() (err error) { if err = setFlags(); err != nil { return } - if err = parseCoreConfig(); err != nil { + if err = parseCoreConfig(); err != nil { return } bindEnvironmentVariables() diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index be4580c0a..61ed730b5 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -64,16 +64,16 @@ func (t StartActivityTransition) do(env *Environment) (err error) { env.currentRunNumber = runNumber args := controlcommands.PropertyMap{ - "runNumber": strconv.FormatUint(uint64(runNumber), 10 ), + "runNumber": strconv.FormatUint(uint64(runNumber), 10), } flps := env.GetFLPs() - the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().UnixNano(), time.Now().Unix()) - for _,flp := range flps { + the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) + for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int64(runNumber)) } - // According to documentation the 1st input should + // According to documentation the 1st input should // a text Log entry that is written by the shifter // TODO (malexis): we need to implement a way to // get the text from the shifter @@ -92,7 +92,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition - if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now().Unix(), time.Now().Unix()) env.currentRunNumber = 0 return tasksStateErrors @@ -100,8 +100,8 @@ func (t StartActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber).Info("run started") env.sendEnvironmentEvent(&event.EnvironmentEvent{ - EnvironmentID: env.Id().String(), - State: "RUNNING", + EnvironmentID: env.Id().String(), + State: "RUNNING", Run: env.currentRunNumber, }) From fbe15aaa77062eea3c3e4228b139f504a0615c8c Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Apr 2021 16:10:20 +0200 Subject: [PATCH 0887/2352] [core] Retrieve JWT using the request redirect --- core/bookkeeping/api.go | 60 +++++++++++++++++---------------------- core/bookkeeping/utils.go | 57 +++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 34 deletions(-) create mode 100644 core/bookkeeping/utils.go diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 3b5381db0..959769fd4 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -22,52 +22,46 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -// This package instantiates the bookkeeping API client. There is one -// issue with the local import in github.com/AliceO2Group/Bookkeeping/go-api-client/src -// which should be fixed, or otherwise we need to mirror the BookkeepingAPI.go here. -// The other possible issue is that currently all the call instead of returning the -// responses and the errors they use fmt.Println(). This can be solved again by mirroring, -// and changing the implementation of the BookkeepingAPI.go to return instead of printing, -// but this is not a valid solution since we have to reflect every change that might occur -// on the file. package bookkeeping import ( + "net/url" + "path" "sync" clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" + "github.com/AliceO2Group/Control/common/logger" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) -const ( - bookkeepingBaseUrl = "http://vm4.jiskefet.io/api" - // APItoken provided doesn't work, we should contact team on how to generate one. - bookkeepingAPIToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6NzQ2NjQwLCJ1c2VybmFtZSI6ImF3ZWdyenluIiwiYWNjZXNzIjoxLCJpYXQiOjE2MTA1NDM0ODYsImV4cCI6MTYxMDYyOTg4NiwiaXNzIjoibzItdWkifQ.8pM1K0HIfpnZop7bJk_rD5GvkfeiWaNNs2S7ZM1tqYg" -) +var log = logger.New(logrus.StandardLogger(), "Bookkeeping") -type BookkeepingWrapper struct {} +type BookkeepingWrapper struct{} var ( once sync.Once // mock instance instance *BookkeepingWrapper ) + func Instance() *BookkeepingWrapper { once.Do(func() { - clientAPI.InitializeApi(bookkeepingBaseUrl, bookkeepingAPIToken) + apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) + if err == nil { + apiUrl.Path = path.Join( apiUrl.Path + "api") + clientAPI.InitializeApi(apiUrl.String(), getJWTAPIToken()) + } else { + log.WithField("error", err.Error()). + Error("unable to parse the Bookkeeping base URL") + clientAPI.InitializeApi(viper.GetString("bookkeepingBaseUri")+"/api", getJWTAPIToken()) + } }) return instance } -func initializeBookkeepingAPI() *BookkeepingWrapper { - var bkw BookkeepingWrapper - clientAPI.InitializeApi(bookkeepingBaseUrl, bookkeepingAPIToken) - return &bkw - -} - - -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int, runType string, timeO2Start int64, timeTrgStart int64){ +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int, runType string, timeO2Start int64, timeTrgStart int64) { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -81,11 +75,10 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int64(nDetectors),int64(nEpns),int64(nFlps),int64(runNumber), runtypeAPI, timeO2Start, timeTrgStart) - + clientAPI.CreateRun(activityId, int64(nDetectors), int64(nEpns), int64(nFlps), int64(runNumber), runtypeAPI, timeO2Start, timeTrgStart) } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End int64, timeTrgEnd int64){ +func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End int64, timeTrgEnd int64) { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -102,23 +95,22 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2E clientAPI.UpdateRun(int64(runNumber), runquality, timeO2End, timeTrgEnd) } - -func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int64){ +func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int64) { clientAPI.CreateLog(text, title, runNumbers, parentLogId) } -func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int64 ){ +func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int64) { clientAPI.CreateFlp(name, hostName, runNumber) } -func (bk *BookkeepingWrapper) UpdateFlp(flpId int64, name string, nSubtimeframes int64, nEquipmentBytes int64, nRecordingBytes int64, nFairMQBytes int64){ +func (bk *BookkeepingWrapper) UpdateFlp(flpId int64, name string, nSubtimeframes int64, nEquipmentBytes int64, nRecordingBytes int64, nFairMQBytes int64) { clientAPI.UpdateFlp(flpId, name, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) } -func (bk *BookkeepingWrapper) GetLogs(){ +func (bk *BookkeepingWrapper) GetLogs() { clientAPI.GetLogs() } -func (bk *BookkeepingWrapper) GetRuns(){ +func (bk *BookkeepingWrapper) GetRuns() { clientAPI.GetRuns() -} \ No newline at end of file +} diff --git a/core/bookkeeping/utils.go b/core/bookkeeping/utils.go new file mode 100644 index 000000000..7813ed844 --- /dev/null +++ b/core/bookkeeping/utils.go @@ -0,0 +1,57 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeeping + +import ( + "net/http" + + "github.com/spf13/viper" +) + +func getJWTAPIToken() (jwtToken string) { + req, err := http.NewRequest("GET", viper.GetString("bookkeepingBaseUri"), nil) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot create http GET request") + return + } + client := new(http.Client) + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + if token, ok := req.URL.Query()["token"]; ok { + log.WithField("JWT token", token[0]). + Debug("bookkeeping jwt token") + jwtToken = token[0] + } + return nil + } + + _, err = client.Do(req) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot execute http request") + return + } + return +} From 56d9e7b23fcf1ee5027373e3f34bd83a3f7768f4 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 22 Apr 2021 11:56:43 +0200 Subject: [PATCH 0888/2352] [core] Fix bookkeeping calls and version --- core/bookkeeping/api.go | 16 +++++++++------- core/environment/transition_startactivity.go | 6 +++--- core/environment/transition_stopactivity.go | 4 ++-- go.mod | 2 +- go.sum | 2 ++ 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 959769fd4..33d38067f 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -28,6 +28,8 @@ import ( "net/url" "path" "sync" + "time" + clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" @@ -61,7 +63,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int, runType string, timeO2Start int64, timeTrgStart int64) { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time) { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -75,10 +77,10 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int64(nDetectors), int64(nEpns), int64(nFlps), int64(runNumber), runtypeAPI, timeO2Start, timeTrgStart) + clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart) } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End int64, timeTrgEnd int64) { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -92,18 +94,18 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2E runquality = sw.UNKNOWN_RunQuality } - clientAPI.UpdateRun(int64(runNumber), runquality, timeO2End, timeTrgEnd) + clientAPI.UpdateRun(int32(runNumber), runquality, timeO2End, timeTrgEnd) } -func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int64) { +func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { clientAPI.CreateLog(text, title, runNumbers, parentLogId) } -func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int64) { +func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { clientAPI.CreateFlp(name, hostName, runNumber) } -func (bk *BookkeepingWrapper) UpdateFlp(flpId int64, name string, nSubtimeframes int64, nEquipmentBytes int64, nRecordingBytes int64, nFairMQBytes int64) { +func (bk *BookkeepingWrapper) UpdateFlp(flpId int32, name string, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { clientAPI.UpdateFlp(flpId, name, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 61ed730b5..90b6bbc2f 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -68,9 +68,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } flps := env.GetFLPs() - the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int(runNumber), env.GetRunType(), time.Now().Unix(), time.Now().Unix()) + the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int32(runNumber), env.GetRunType(), time.Now(), time.Now()) for _, flp := range flps { - the.BookkeepingAPI().CreateFlp(flp, flp, int64(runNumber)) + the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) } // According to documentation the 1st input should @@ -93,7 +93,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now().Unix(), time.Now().Unix()) + the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now(), time.Now()) env.currentRunNumber = 0 return tasksStateErrors } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index cb063e048..00afd5455 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -70,10 +70,10 @@ func (t StopActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now().Unix(), time.Now().Unix()) + the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now(), time.Now()) return tasksStateErrors } - the.BookkeepingAPI().UpdateRun(int(runNumber), "good", time.Now().Unix(), time.Now().Unix()) + the.BookkeepingAPI().UpdateRun(int(runNumber), "good", time.Now(), time.Now()) env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return diff --git a/go.mod b/go.mod index 6b54c4c80..15ec232c4 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,7 @@ require ( cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 github.com/AliceO2Group/Bookkeeping v0.16.8 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect diff --git a/go.sum b/go.sum index 525bf4ca5..f2ed3fd60 100644 --- a/go.sum +++ b/go.sum @@ -85,6 +85,8 @@ github.com/AliceO2Group/Bookkeeping v0.16.8 h1:xNiRFMaCNLGZaDwTJz0i5l2wrkxbGfcb2 github.com/AliceO2Group/Bookkeeping v0.16.8/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From 5f327a740db84d831786c805219cc33f5a2228d8 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 5 May 2021 12:30:34 +0200 Subject: [PATCH 0889/2352] [core] Update bookkeeping version --- go.mod | 4 ++-- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 15ec232c4..4c010ce39 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.16.8 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba + github.com/AliceO2Group/Bookkeeping v0.16.9 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect diff --git a/go.sum b/go.sum index f2ed3fd60..cab06f786 100644 --- a/go.sum +++ b/go.sum @@ -83,10 +83,14 @@ github.com/AliceO2Group/Bookkeeping v0.16.6 h1:jl9OqxujN48U82M7lOfUCyIGCteW7nYHM github.com/AliceO2Group/Bookkeeping v0.16.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.16.8 h1:xNiRFMaCNLGZaDwTJz0i5l2wrkxbGfcb293jb77/8KI= github.com/AliceO2Group/Bookkeeping v0.16.8/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.16.9 h1:yqMR7e4FDjAeNbSJ08WJJN1ug0k/VyFiEwx6Aiw4Ju0= +github.com/AliceO2Group/Bookkeeping v0.16.9/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e h1:9rLFEKaGcH6nmz2JcM4zcfKuGJq+/nPVr30o33s7/eM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From 0744cd6938bc93d63e0f63a28532fa6f1d5c1e78 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 5 May 2021 12:31:30 +0200 Subject: [PATCH 0890/2352] [core] Fix wrong identifiers --- core/bookkeeping/api.go | 4 ++-- core/environment/environment.go | 2 +- core/environment/transition_startactivity.go | 2 +- core/environment/transition_stopactivity.go | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 33d38067f..57484659a 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -80,7 +80,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart) } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -94,7 +94,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int, runResult string, timeO2E runquality = sw.UNKNOWN_RunQuality } - clientAPI.UpdateRun(int32(runNumber), runquality, timeO2End, timeTrgEnd) + clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) } func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { diff --git a/core/environment/environment.go b/core/environment/environment.go index 7b9c66659..fde1ff1f9 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -520,7 +520,7 @@ func (env *Environment) GetRunType() string { env.workflow.GetVars(), env.workflow.GetUserVars(), ) - if runtype, ok := varStack["runtype"]; ok { + if runtype, ok := varStack["run_type"]; ok { return runtype } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 90b6bbc2f..3a7803657 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -93,7 +93,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now(), time.Now()) + the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) env.currentRunNumber = 0 return tasksStateErrors } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 00afd5455..b0df75768 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -70,10 +70,10 @@ func (t StopActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int(runNumber), "bad", time.Now(), time.Now()) + the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) return tasksStateErrors } - the.BookkeepingAPI().UpdateRun(int(runNumber), "good", time.Now(), time.Now()) + the.BookkeepingAPI().UpdateRun(int32(runNumber), "good", time.Now(), time.Now()) env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return From 1121ba7b9f9678cf21fe76b37e4308b34f9a690e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 May 2021 12:56:10 +0200 Subject: [PATCH 0891/2352] [build] Bump to v0.22.81 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0aa41d1d7..0dc26c70f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 22 -VERSION_PATCH := 3 +VERSION_PATCH := 81 From 4a04f5063c5e8ce3865868d9774801266468a44a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 May 2021 10:55:46 +0200 Subject: [PATCH 0892/2352] [occ] Allow building with Protobuf v3.14.0 --- occ/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 833148a94..a1424b2c2 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -165,7 +165,7 @@ find_package(Boost 1.74 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) # Protobuf set(protobuf_MODULE_COMPATIBLE TRUE) -find_package(protobuf 3.15.8 CONFIG REQUIRED) +find_package(protobuf 3.14.0 CONFIG REQUIRED) message(STATUS "Using protobuf ${protobuf_VERSION}") # OpenSSL on Mac From 71cb0016323ae2ed0b9b1a55236f62d488bc8763 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 May 2021 10:56:26 +0200 Subject: [PATCH 0893/2352] [build] Bump to v0.22.82 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0dc26c70f..406958e74 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 22 -VERSION_PATCH := 81 +VERSION_PATCH := 82 From 55d20f13df7b91f7cf5ae16768769304cb3beffb Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 5 May 2021 12:36:00 +0200 Subject: [PATCH 0894/2352] [core] Report error of failed environment through stream --- core/environment/manager.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index e6c364c6c..113ea6395 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -464,6 +464,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str true )) if err != nil { envState := env.CurrentState() + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) log.WithField("state", envState). WithField("environment", env.Id().String()). WithError(err). @@ -471,7 +472,10 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally - _ = envs.TeardownEnvironment(env.Id(), true/*force*/) + err = envs.TeardownEnvironment(env.Id(), true/*force*/) + if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + } killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { @@ -482,7 +486,6 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "lastEnvState": envState, }). Warn("environment deployment failed, tasks were cleaned up") - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return } From a7bd98dbdbf0d1a0c9efd0e3787cba7262ad548e Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 5 May 2021 15:04:26 +0200 Subject: [PATCH 0895/2352] [coconut] Keep stream open after Environment error --- coconut/control/control.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index e932a4294..840a28124 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -303,15 +303,15 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return nil } fmt.Printf("\nEnvironment with id %s failed with error: %s\n", evt.EnvironmentId, evt.Error) - return nil - } - tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}} {{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") - if err != nil { - return err - } - err = tmpl.Execute(os.Stdout, evt) - if err != nil { - return err + } else { + tmpl, err := template.New("envEvents").Parse("Enviroment {{.EnvironmentId}} {{if .Message}}{{.Message}} {{end}}{{if .State}}changed state to {{.State}}{{end}}{{if .CurrentRunNumber}} with run number {{.CurrentRunNumber}}{{end}}\n") + if err != nil { + return err + } + err = tmpl.Execute(os.Stdout, evt) + if err != nil { + return err + } } } if viper.GetBool("verbose") { From dd7b07eaff2563bc8f85897ed712378ded25e39e Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 5 May 2021 15:05:12 +0200 Subject: [PATCH 0896/2352] [core] Report teardown complete at the end of operation --- core/environment/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 113ea6395..70b3a0abf 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -252,7 +252,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) return err } - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) envs.mu.Unlock() // we trigger all cleanup hooks @@ -293,6 +292,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) delete(envs.m, environmentId) env.unsubscribeFromWfState() return err From a61ca79eede062ce70e537af16ac89c9cafd5960 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Fri, 7 May 2021 12:08:45 +0200 Subject: [PATCH 0897/2352] [apricot] Fix blocking startup --- apricot/local/servicehttp.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 500252b1c..256e181b9 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -105,6 +105,11 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) apiDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - log.WithError(httpsvr.ListenAndServe()).Fatal("Fatal error with Http Service.") + + // async-start of http Service and capture error + go func() { + err := httpsvr.ListenAndServe() + log.WithError(err).Fatal("Fatal error with Http Service.") + }() return httpsvr } From c86248f7d6ec4181810780979c9b4a2b68bacc73 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 May 2021 17:28:00 +0200 Subject: [PATCH 0898/2352] [core] Support for `global` key in bind channel declaration --- core/task/channel/endpoint.go | 22 ++++++++++++++++++++++ core/task/channel/inbound.go | 5 +++++ core/task/manager.go | 23 ++++++++++++++++++++--- core/task/scheduler.go | 4 ++++ 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/core/task/channel/endpoint.go b/core/task/channel/endpoint.go index 4796d6a00..cc90c05ff 100644 --- a/core/task/channel/endpoint.go +++ b/core/task/channel/endpoint.go @@ -26,6 +26,7 @@ package channel import ( "fmt" + "reflect" "strings" "github.com/rs/xid" @@ -44,6 +45,27 @@ type Endpoint interface { ToBoundEndpoint() Endpoint } +func EndpointEquals(e Endpoint, f Endpoint) bool { + if reflect.TypeOf(e) != reflect.TypeOf(f) { + return false + } + switch v := e.(type) { + case TcpEndpoint: + w, ok := f.(TcpEndpoint) + if !ok { + return false + } + return v == w + case IpcEndpoint: + w, ok := f.(IpcEndpoint) + if !ok { + return false + } + return v == w + } + return false +} + func NewTcpEndpoint(host string, port uint64, transport TransportType) Endpoint { return TcpEndpoint{ Host: host, diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index c355d9f36..57e98754e 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -34,11 +34,13 @@ import ( type Inbound struct { Channel + Global string `yaml:"global"` Addressing AddressFormat `yaml:"addressing"` //default: tcp } func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { aux := struct { + Global string `yaml:"global"` Addressing AddressFormat `yaml:"addressing"` //default: tcp }{} err = unmarshal(&aux) @@ -57,6 +59,7 @@ func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err er inbound.Addressing = aux.Addressing inbound.Channel = ch + inbound.Global = aux.Global return } @@ -64,6 +67,7 @@ func (inbound Inbound) MarshalYAML() (interface{}, error) { // Flatten Inbound to have Addressing and Channel elements on the same "level" type _inbound struct { Name string `yaml:"name"` + Global string `yaml:"global"` Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize,omitempty"` RcvBufSize int `yaml:"rcvBufSize,omitempty"` @@ -74,6 +78,7 @@ func (inbound Inbound) MarshalYAML() (interface{}, error) { auxInbound := _inbound{ Name: inbound.Channel.Name, + Global: inbound.Global, Type: inbound.Channel.Type, SndBufSize: inbound.Channel.SndBufSize, RcvBufSize: inbound.Channel.RcvBufSize, diff --git a/core/task/manager.go b/core/task/manager.go index 906bd2195..0b7ac2926 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -459,13 +459,30 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { return err } - // We generate a "bindMap" i.e. a map of the paths of registered inbound channels and their ports + // We fetch each task's local bindMap to generate a global bindMap for the whole Tasks slice, + // i.e. a map of the paths of registered inbound channels and their ports. bindMap := make(channel.BindMap) for _, task := range tasks { taskPath := task.GetParent().GetPath() for inbChName, endpoint := range task.GetLocalBindMap() { - bindMap[taskPath + TARGET_SEPARATOR + inbChName] = - endpoint.ToTargetEndpoint(task.GetHostname()) + var bindMapKey string + if strings.HasPrefix(inbChName, "::") { //global channel alias + bindMapKey = inbChName + + // deduplication + if existingEndpoint, existsAlready := bindMap[bindMapKey]; existsAlready { + if channel.EndpointEquals(existingEndpoint, endpoint) { + // means somewhere something redefines the global channel alias, + // but the endpoint is the same so there's no problem + continue + } else { + return fmt.Errorf("workflow template contains illegal redefinition of global channel alias %s", bindMapKey) + } + } + } else { + bindMapKey = taskPath + TARGET_SEPARATOR + inbChName + } + bindMap[bindMapKey] = endpoint.ToTargetEndpoint(task.GetHostname()) } } log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 1b6465db3..fedd86570 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -555,6 +555,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han remainingResourcesInOffer.Subtract(builder.Resource) bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) } + // global channel alias processing + if len(ch.Global) != 0 { + bindMap["::" + ch.Global] = bindMap[ch.Name] + } } agentForCache := AgentCacheInfo{ From 763f4f002b3e6b08e4807f330b93612a19518984 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 May 2021 14:52:26 +0200 Subject: [PATCH 0899/2352] [core] Support global channel addressing in template system --- core/task/channel/inbound.go | 4 ++-- core/workflow/aggregatorrole.go | 2 +- core/workflow/callrole.go | 2 +- core/workflow/includerole.go | 2 +- core/workflow/rolebase.go | 30 +++++++++++++++++++++++++----- core/workflow/taskrole.go | 4 ++-- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 57e98754e..b7ed10632 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -134,7 +134,7 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm return } -func MergeInbound(hp,lp []Inbound) (channels []Inbound) { +func MergeInbound(hp, lp []Inbound) (channels []Inbound) { channels = make([]Inbound, len(hp)) copy(channels, hp) @@ -142,7 +142,7 @@ func MergeInbound(hp,lp []Inbound) (channels []Inbound) { updated := false for _, pCh := range channels { if v.Name == pCh.Name { - mergo.Merge(&pCh, v) + _ = mergo.Merge(&pCh, v) updated = true break } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 7d429c77a..8a439149f 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -113,7 +113,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkf }, template.STAGE4: append(append( WrapConstraints(r.Constraints), - r.wrapConnectFields()...), + r.wrapBindAndConnectFields()...), template.WrapPointer(&r.Enabled)), } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index f529fd66a..36ab117da 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -149,7 +149,7 @@ func (t *callRole) ProcessTemplates(_ *repos.Repo, _ LoadSubworkflowFunc) (err e }, template.STAGE4: append(append( WrapConstraints(t.Constraints), - t.wrapConnectFields()...), + t.wrapBindAndConnectFields()...), template.WrapPointer(&t.Enabled)), } diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index cdaad37a8..90bbd12c1 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -94,7 +94,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow }, template.STAGE4: append(append( WrapConstraints(r.Constraints), - r.wrapConnectFields()...), + r.wrapBindAndConnectFields()...), template.WrapPointer(&r.Enabled)), } diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 64cbae7d0..7a72292ca 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -28,8 +28,8 @@ import ( "fmt" "strings" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" @@ -212,11 +212,13 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { return aux, nil } -func (r *roleBase) wrapConnectFields() template.Fields { - connectFields := make(template.Fields, len(r.Connect)) +func (r *roleBase) wrapBindAndConnectFields() template.Fields { + fields := make(template.Fields, len(r.Connect)) + // first we populate the connect fields, because we know we'll have 1 fields entry + // for each connect block for i, _ := range r.Connect { index := i // always keep a local copy for the getter/setter closures - connectFields[index] = template.WrapGeneric( + fields[index] = template.WrapGeneric( func() string { return r.Connect[index].Target }, @@ -225,7 +227,25 @@ func (r *roleBase) wrapConnectFields() template.Fields { }, ) } - return connectFields + // then we add any Global channel alias declarations for bind fields, we don't know + // how many in advance because not all bind blocks have Global aliases + for i, _ := range r.Bind { + index := i // always keep a local copy for the getter/setter closures + if len(r.Bind[index].Global) == 0 { + continue + } + + fields = append(fields, template.WrapGeneric( + func() string { + return r.Bind[index].Global + }, + func(value string) { + r.Bind[index].Global = value + }, + )) + } + + return fields } func (r *roleBase) copy() copyable { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 3aadc89de..08dbc34ae 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -30,8 +30,8 @@ import ( texttemplate "text/template" "time" - "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -144,7 +144,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo, _ LoadSubworkflowF }, template.STAGE4: append(append( WrapConstraints(t.Constraints), - t.wrapConnectFields()...), + t.wrapBindAndConnectFields()...), template.WrapPointer(&t.Enabled)), } From ae910c4fb05e30f1c94ab1bb1f63aedf35e3cd4f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 May 2021 14:55:41 +0200 Subject: [PATCH 0900/2352] [build] Bump to v0.23.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 406958e74..1e26cb26d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 22 -VERSION_PATCH := 82 +VERSION_MINOR := 23 +VERSION_PATCH := 0 From 218430dc2aa2ec8294e75359d9a298ca63c661a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 May 2021 14:33:29 +0200 Subject: [PATCH 0901/2352] [common] Improve time tracking facilities --- common/utils/utils.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index a0ec50c41..b1bb2cb50 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -30,17 +30,37 @@ import ( "fmt" "io" "os" + "regexp" + "runtime" "strings" "time" + "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" "gopkg.in/yaml.v3" ) -func TimeTrack(start time.Time, name string, logger *logrus.Entry) { +func TimeTrack(start time.Time, name string, log *logrus.Entry) { + if log == nil { + log = logger.New(logrus.StandardLogger(),"debug").WithPrefix("debug") + } elapsed := time.Since(start) - logger.Debugf("%s took %s", name, elapsed) + log.Debugf("%s took %s", name, elapsed) +} + +func TimeTrackFunction(start time.Time, log *logrus.Entry) { + // Skip this function, and fetch the PC and file for its parent. + pc, _, _, _ := runtime.Caller(1) + + // Retrieve a function object this functions parent. + funcObj := runtime.FuncForPC(pc) + + // Regex to extract just the function name (and not the module path). + runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`) + name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1") + + TimeTrack(start, name, log) } func NewUnixTimestamp() string { From 35f7a9b4fbdf58c2aa738a79dbcb6fa232fc2848 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 May 2021 14:34:29 +0200 Subject: [PATCH 0902/2352] [core] Fix handling and logging of critical/non-critical hooks --- core/environment/environment.go | 91 +++++++++++++++++++++++---------- core/workflow/callable/call.go | 10 ++++ 2 files changed, 74 insertions(+), 27 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index fde1ff1f9..fc8ff6475 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,7 +29,6 @@ package environment import ( "errors" "fmt" - "sort" "strings" "sync" "time" @@ -184,22 +183,60 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // Then we take care of any pending hooks, including from the current trigger // TODO: this should be further refined by adding priority/weight pendingCalls, ok := env.callsPendingAwait[trigger] + callErrors := make(map[*callable.Call]error) if ok && len(pendingCalls) != 0 { // there are hooks to take care of - pendingCalls.AwaitAll() + callErrors = pendingCalls.AwaitAll() } // Tasks are handled separately for now, and they cannot have trigger!=await hooksToTrigger := allHooks.FilterTasks() - return env.runTasksAsHooks(hooksToTrigger) + taskErrors := env.runTasksAsHooks(hooksToTrigger) + + allErrors := make(map[callable.Hook]error) + criticalFailures := make([]error, 0) + + // We merge hook call errors and hook task errors into a single map for + // critical trait processing + for hook, err := range callErrors { + allErrors[hook] = err + } + for hook, err := range taskErrors { + allErrors[hook] = err + } + + for hook, err := range allErrors { + if hook == nil || err == nil { + continue + } + + // If the hook call or task is critical: true + if hook.GetTraits().Critical { + log.Fatalf("critical hook failed: %s", err) + criticalFailures = append(criticalFailures, err) + } + } + + if len(criticalFailures) != 0 { + return fmt.Errorf("one or more critical hooks failed") + } + return nil } -func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { +// runTasksAsHooks returns a map of failed hook tasks and their respective error values. +// The returned map includes both critical and non-critical failures, and it's up to the caller +// to further filter as needed. +func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map[*task.Task]error) { + errorMap = make(map[*task.Task]error) + if len(hooksToTrigger) == 0 { - return nil + return } - err = env.hookHandlerF(hooksToTrigger) + err := env.hookHandlerF(hooksToTrigger) if err != nil { + for _, h := range hooksToTrigger { + errorMap[h] = err + } return } @@ -216,7 +253,6 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { } successfulHooks := make(task.Tasks, 0) - failedHooksById := make(map[string]*task.Task) for { select { @@ -231,8 +267,24 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { hookTimers[thisHook].Stop() delete(hookTimers, thisHook) - if evt.ExitCode != 0 || !evt.VoluntaryTermination { - failedHooksById[thisHook.GetTaskId()] = thisHook + + if evt.ExitCode != 0 { + errorMap[thisHook] = fmt.Errorf("hook task %s finished with non-zero exit code %d (status %s)", + thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) + + log.WithField("task", thisHook.GetName()). + WithFields(logrus.Fields{ + "exitCode": evt.ExitCode, + "stdout": evt.Stdout, + "stderr": evt.Stderr, + "partition": env.Id().String(), + "finalMesosState": evt.FinalMesosState.String(), + }). + Warn("hook failed") + } else if !evt.VoluntaryTermination { + errorMap[thisHook] = fmt.Errorf("hook task %s involuntary termination with exit code %d (status %s)", + thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) + log.WithField("task", thisHook.GetName()). WithFields(logrus.Fields{ "exitCode": evt.ExitCode, @@ -255,7 +307,8 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { log.WithField("partition", env.Id().String()). WithField("task", thisHook.GetName()).Warn("hook response timed out") delete(hookTimers, thisHook) - failedHooksById[thisHook.GetTaskId()] = thisHook + errorMap[thisHook] = fmt.Errorf("hook task %s timed out after %s", + thisHook.GetName(), thisHook.GetTraits().Timeout) } if len(hookTimers) == 0 { @@ -264,23 +317,7 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (err error) { } if len(hooksToTrigger) == len(successfulHooks) { - err = nil - return - } - - // We only report non-nil error if at least one CRITICAL HOOK failed - failedCriticalHookNames := make([]string, 0) - for _, thisHook := range failedHooksById { - if thisHook.GetTraits().Critical { - failedCriticalHookNames = append(failedCriticalHookNames, thisHook.GetParentRolePath()) - } - } - sort.Strings(failedCriticalHookNames) - - if len(failedCriticalHookNames) > 0 { - err = fmt.Errorf("%d critical hooks failed: %s", - len(failedCriticalHookNames), - strings.Join(failedCriticalHookNames, ", ")) + return make(map[*task.Task]error) } return diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 2dc6db9cf..472564113 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -25,17 +25,24 @@ package callable import ( + "fmt" "strconv" texttemplate "text/template" + "time" "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/task" + "github.com/sirupsen/logrus" ) +var log = logger.New(logrus.StandardLogger(), "callable") + type Calls []*Call type Hooks []Hook @@ -139,6 +146,9 @@ func (c *Call) Call() error { func (c *Call) Start() { c.await = make(chan error) go func() { + callId := fmt.Sprintf("hook:%s", c.GetName()) + log.Debugf("%s started", callId) + defer utils.TimeTrack(time.Now(), callId, log.WithPrefix("callable")) c.await <- c.Call() close(c.await) }() From ee00d432354dbd9c0c4ac4679887f8d125970807 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 May 2021 14:35:14 +0200 Subject: [PATCH 0903/2352] [core] Make ODC failures of ERROR severity --- core/integration/odc/plugin.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a4690362b..a8386fb30 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -177,7 +177,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { err := handleConfigure(context.Background(), p.odcClient, arguments, topology, plugin, resources, envId) if err != nil { - log.WithError(err).Warn("ODC error") + log.WithError(err).Error("ODC error") } return } @@ -192,28 +192,28 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { err := handleStart(context.Background(), p.odcClient, arguments, envId) if err != nil { - log.WithError(err).Warn("ODC error") + log.WithError(err).Error("ODC error") } return } stack["Stop"] = func() (out string) { err := handleStop(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Warn("ODC error") + log.WithError(err).Error("ODC error") } return } stack["Reset"] = func() (out string) { err := handleReset(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Warn("ODC error") + log.WithError(err).Error("ODC error") } return } stack["EnsureCleanup"] = func() (out string) { err := handleCleanup(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Warn("ODC error") + log.WithError(err).Error("ODC error") } return } From c305b613072fe156841d11a38de11aebdfa9099d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 May 2021 12:03:26 +0200 Subject: [PATCH 0904/2352] [core] PrefixedOverride, ToUpper/ToLower in template system --- apricot/local/service.go | 2 +- configuration/template/fields.go | 2 +- configuration/template/stack.go | 32 +++++++++++++++++++++++++++++++- 3 files changed, 33 insertions(+), 3 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 9de5eff3d..3d29f65c1 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -254,7 +254,7 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, } // Add custom functions to bindings: - funcMap := template.MakeStrOperationFuncMap() + funcMap := template.MakeStrOperationFuncMap(varStack) for k, v := range funcMap { bindings[k] = v } diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 1560d60e9..85ded66bf 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -189,7 +189,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { environment := make(map[string]interface{}, len(varStack)) - strOpStack := MakeStrOperationFuncMap() + strOpStack := MakeStrOperationFuncMap(varStack) for k, v := range varStack { environment[k] = v } diff --git a/configuration/template/stack.go b/configuration/template/stack.go index c9426bd9f..3199a9648 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -141,7 +141,7 @@ func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPt } } -func MakeStrOperationFuncMap() map[string]interface{} { +func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} { return map[string]interface{}{ "Atoi": func(in string) (out int) { var err error @@ -164,6 +164,14 @@ func MakeStrOperationFuncMap() map[string]interface{} { out = strings.TrimSpace(in) return }, + "ToUpper": func(in string) (out string) { + out = strings.ToUpper(in) + return + }, + "ToLower": func(in string) (out string) { + out = strings.ToLower(in) + return + }, "FromJson": func(in string) (out interface{}) { bytes := []byte(in) err := json.Unmarshal(bytes, &out) @@ -190,5 +198,27 @@ func MakeStrOperationFuncMap() map[string]interface{} { "NewID": func() (out string) { return uid.New().String() }, + "PrefixedOverride": func(varname, prefix string) (out string) { + prefixed, prefixedOk := varStack[prefix + "_" + varname] + fallback, fallbackOk := varStack[varname] + + // Handle explicit null values + if prefixedOk && (prefixed == "none" || len(strings.TrimSpace(prefixed)) == 0) { + prefixedOk = false + } + if fallbackOk && (fallback == "none" || len(strings.TrimSpace(fallback)) == 0) { + fallbackOk = false + } + + if !prefixedOk { + if fallbackOk { + return fallback + } + return "" // Neither value exists + } + + // prefixedOk is true, fallbackOk we don't know & don't care at this point + return prefixed + }, } } \ No newline at end of file From 5c871f4091bdb24aa62a63c331591f84d899b160 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 May 2021 12:41:37 +0200 Subject: [PATCH 0905/2352] [build] Bump to v0.23.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1e26cb26d..a59ee4791 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 23 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From f02b93cfb4db72cd5261edc67b05427ae52cf48f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 25 May 2021 16:10:37 +0200 Subject: [PATCH 0906/2352] [core] Propagate run number to ODC partition --- core/integration/odc/handlers.go | 45 ++++++++++++++++++++++++++++++++ core/integration/odc/plugin.go | 1 + 2 files changed, 46 insertions(+) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 473e302d4..3b3a76583 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -100,6 +100,51 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return errors.New("cannot proceed with empty environment id") } + // SetProperties before START + setPropertiesRequest := &odcpb.SetPropertiesRequest{ + Partitionid: envId, + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + } + + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Start + i := 0 + for k, v := range arguments { + setPropertiesRequest.Properties[i] = &odcpb.Property{ + Key: k, + Value: v, + } + i++ + } + + var setPropertiesResponse *odcpb.GeneralReply + setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if setPropertiesResponse == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "odcRunid": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). + Debug("call to ODC complete") + + // The actual START operation starts here rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) if err != nil { return printGrpcError(err) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a8386fb30..e53d4118b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -189,6 +189,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { arguments := make(map[string]string) arguments["run_number"] = rn + arguments["runNumber"] = rn err := handleStart(context.Background(), p.odcClient, arguments, envId) if err != nil { From 22caf54f9237ae06c3d7d4fa8e5d94aec67b1d4e Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 27 May 2021 12:13:51 +0200 Subject: [PATCH 0907/2352] [core] Add timeout to Partition state polling --- core/integration/ddsched/plugin.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 656173952..2805f5eb9 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -234,9 +234,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionInitialize") return } - + pollingTimeout := 15 * time.Second PARTITION_STATE_POLLING: - for { + for startPolling := time.Now(); ; { response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_CONFIGURING: @@ -250,6 +250,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionInitialize") break PARTITION_STATE_POLLING } + if time.Since(startPolling) > pollingTimeout { + log.WithError(fmt.Errorf("PartitionInitialize timeout exceeded. Latest state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("timeout", pollingTimeout). + Error("failed to perform DD scheduler PartitionInitialize") + break + } } return } @@ -439,4 +447,3 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { func (p *Plugin) Destroy() error { return p.ddSchedClient.Close() } - From 96f04a11ddde36a989424fc449f9648f07bab679 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 27 May 2021 15:32:03 +0200 Subject: [PATCH 0908/2352] [core] Get DD polling timeout from a workflow var --- core/integration/ddsched/plugin.go | 46 +++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 2805f5eb9..3c86e3c77 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -234,7 +234,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionInitialize") return } - pollingTimeout := 15 * time.Second + + pollingSeconds, ok := varStack["dd_polling_timeout"] + if !ok { + pollingSeconds = "30" + } + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout := time.Duration(pollingSecondsInt) * time.Second + PARTITION_STATE_POLLING: for startPolling := time.Now(); ; { response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) @@ -310,8 +317,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionTerminate") } + pollingSeconds, ok := varStack["dd_polling_timeout"] + if !ok { + // Default to 30s when dd_polling_timeout is not set + pollingSeconds = "30" + } + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout := time.Duration(pollingSecondsInt) * time.Second + PARTITION_STATE_POLLING: - for { + for startPolling := time.Now(); ; { response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: @@ -325,6 +340,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionTerminate") break PARTITION_STATE_POLLING } + if time.Since(startPolling) > pollingTimeout { + log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("timeout", pollingTimeout). + Error("failed to perform DD scheduler PartitionTerminate") + break + } } return } @@ -408,7 +431,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("partition_state", response.PartitionState). Warn("DD scheduler partition still active, performing PartitionTerminate") - response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("environment_id", envId). @@ -423,8 +446,15 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionTerminate") } + pollingSeconds, ok := varStack["dd_polling_timeout"] + if !ok { + // Default to 30s when dd_polling_timeout is not set + pollingSeconds = "30" + } + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout := time.Duration(pollingSecondsInt) * time.Second PARTITION_STATE_POLLING: - for { + for startPolling := time.Now(); ; { response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: @@ -438,6 +468,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform DD scheduler PartitionTerminate") break PARTITION_STATE_POLLING } + if time.Since(startPolling) > pollingTimeout { + log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + WithField("environment_id", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("timeout", pollingTimeout). + Error("failed to perform DD scheduler PartitionTerminate") + break + } } return } From e9a292e41ecc6ad87408c834a754738364b20fa7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 May 2021 10:51:00 +0200 Subject: [PATCH 0909/2352] [executor] Ensure sequential access to state.activeTasks --- executor/executor.go | 2 +- executor/handlers.go | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/executor/executor.go b/executor/executor.go index d4c6b5c4b..78744f884 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -379,7 +379,7 @@ func newStatus(state *internalState, id mesos.TaskID) mesos.TaskStatus { // internalState of the executor. type internalState struct { - mu sync.RWMutex + activeTasksMu sync.RWMutex cli calls.Sender cfg config.Config framework mesos.FrameworkInfo diff --git a/executor/handlers.go b/executor/handlers.go index bebb79135..26e36ac93 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -81,8 +81,10 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { if status.State == nil { log.Warn("status with nil state received") } else if *status.State == mesos.TASK_FAILED { // failed task updates are sent separately with less priority + state.activeTasksMu.Lock() state.failedTasks[status.TaskID] = status delete(state.activeTasks, status.TaskID) + state.activeTasksMu.Unlock() } else { switch *status.State { case mesos.TASK_DROPPED: fallthrough @@ -90,7 +92,9 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { case mesos.TASK_GONE: fallthrough case mesos.TASK_KILLED: fallthrough case mesos.TASK_LOST: + state.activeTasksMu.Lock() delete(state.activeTasks, status.TaskID) + state.activeTasksMu.Unlock() } err := update(state, status) if err != nil { // in case of failed update, we just print an error message @@ -131,7 +135,9 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { switch incoming.Name { case "MesosCommand_TriggerHook": // Check whether the task exists and is active + state.activeTasksMu.RLock() activeTask, ok := state.activeTasks[taskId] + state.activeTasksMu.RUnlock() if !ok || activeTask == nil { err = fmt.Errorf("no active task %s", taskId.Value) log.WithFields(logrus.Fields{ @@ -199,7 +205,9 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { case "MesosCommand_Transition": // Check whether the task exists and is active + state.activeTasksMu.RLock() activeTask, ok := state.activeTasks[taskId] + state.activeTasksMu.RUnlock() if !ok || activeTask == nil { err = fmt.Errorf("no active task %s", taskId.Value) log.WithFields(logrus.Fields{ @@ -278,7 +286,9 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { err := myTask.Launch() if err == nil { + state.activeTasksMu.Lock() state.activeTasks[taskInfo.TaskID] = myTask + state.activeTasksMu.Unlock() log.Trace("task launching") } else { log.Error("task launch failed") @@ -287,7 +297,9 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { // Attempts to kill a task. This function is thread-safe with respect to state. func handleKillEvent(state *internalState, e *executor.Event_Kill) error { + state.activeTasksMu.RLock() activeTask, ok := state.activeTasks[e.GetTaskID()] + state.activeTasksMu.RUnlock() if !ok { return errors.New("invalid task ID") } @@ -307,10 +319,14 @@ func handleKillEvent(state *internalState, e *executor.Event_Kill) error { // state.activeTasks after the task is killed i.e. formally not active any more select{ case <- time.After(timeout): + state.activeTasksMu.Lock() delete(state.activeTasks, e.GetTaskID()) + state.activeTasksMu.Unlock() } } else { + state.activeTasksMu.Lock() delete(state.activeTasks, e.GetTaskID()) + state.activeTasksMu.Unlock() } }() From 6b327bfb4b9e607bd1c1f702144c78722d86876f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 12 May 2021 17:41:50 +0300 Subject: [PATCH 0910/2352] [repos] Strongly typed fetch error check --- core/repos/repo.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 09cbc315a..d6df4e43a 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -193,7 +193,7 @@ func (r *Repo) refresh() error { Force: true, }) - if err != nil && err.Error() != "already up-to-date" { + if err != nil && err != git.NoErrAlreadyUpToDate { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } From c7f494cdaa6c30c00b4506076d8503fbb7cd8294 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 12 May 2021 18:19:34 +0300 Subject: [PATCH 0911/2352] [repos] Cache workflow templates on repo refresh --- coconut/control/control.go | 2 +- core/core.go | 4 ++ core/protos/o2control.proto | 2 +- core/repos/repo.go | 79 ++++++++++++++++++++++++++----------- core/repos/repomanager.go | 13 ++++-- core/server.go | 2 +- go.mod | 1 - 7 files changed, 73 insertions(+), 30 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 840a28124..fbca7dfe1 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -801,7 +801,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob var response *pb.GetWorkflowTemplatesReply response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{RepoPattern: repoPattern, RevisionPattern: revisionPattern, - AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows, NoVarInfo: true}, grpc.EmptyCallOption{}) + AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows}, grpc.EmptyCallOption{}) if err != nil { return err } diff --git a/core/core.go b/core/core.go index 2465c4ab0..8781f3cc9 100644 --- a/core/core.go +++ b/core/core.go @@ -27,6 +27,7 @@ package core import ( "context" "fmt" + "github.com/AliceO2Group/Control/core/the" "net" "github.com/AliceO2Group/Control/common/logger" @@ -68,6 +69,9 @@ func Run() error { // Set up channel to receive Unix Signals. signals(state) + // Start the Repo Manager instance + log.Infof("Starting the Control Workflows repo manager") + _ = the.RepoManager() // We now build the Control server s := NewServer(state) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index aaebf8e66..f2724587e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -374,8 +374,8 @@ message GetWorkflowTemplatesRequest{ bool allBranches = 3; bool allTags = 4; bool allWorkflows = 5; - bool noVarInfo = 6; } + message VarSpecMessage { enum UiWidget { editBox = 0; // plain string input line, can accept types number and string diff --git a/core/repos/repo.go b/core/repos/repo.go index d6df4e43a..e3df81c82 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -27,6 +27,7 @@ package repos import ( "errors" "io/ioutil" + "os" "path" "path/filepath" "strings" @@ -197,6 +198,14 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } + // git updates, update template cache + if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { + err = r.populateWorkflows() + if err != nil { + return err + } + } + err = r.checkoutRevision(r.getDefaultRevision()) if err != nil { return err @@ -205,50 +214,74 @@ func (r *Repo) refresh() error { return nil } -// Returns a map of revision->[]templates for the repo -func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflows bool, noVarInfo bool) (TemplatesByRevision, error) { - // Get a list of revisions (branches/tags/hash) that are matched by the revisionPattern; gitRefs filter branches and/or tags - revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) +// cache holding the repo's templates +var templatesCache TemplatesByRevision + +// updates templatesCache +// triggered with a repo refresh() +func (r *Repo) populateWorkflows() error { + // Initialize or clear(!) our cache + templatesCache = make(TemplatesByRevision) + + // Include all types of git references + var gitRefs []string + gitRefs = append(gitRefs, refRemotePrefix, refTagPrefix) + + // Include all revisions + revisionsMatched, err := r.getRevisions("*", gitRefs) if err != nil { - return nil, err + return err } - templates := make(TemplatesByRevision) for _, revision := range revisionsMatched { - // Checkout the revision err := r.checkoutRevision(revision) if err != nil { - return nil, err + return err } // Go through the filesystem to locate available templates - files, err := ioutil.ReadDir(r.getWorkflowDir()) + var files []os.FileInfo + files, err = ioutil.ReadDir(r.getWorkflowDir()) if err != nil { - return templates, err + return err } for _, file := range files { // Only return .yaml files if strings.HasSuffix(file.Name(), ".yaml") { + templateName := strings.TrimSuffix(file.Name(), ".yaml") workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) - // Check if workflow is public in case not allWorkflows requested - // and skip it if it isn't - if allWorkflows || (!allWorkflows && - IsFilePublicWorkflow(workflowPath)) { - templateName := strings.TrimSuffix(file.Name(), ".yaml") - var varSpecMap VarSpecMap - if !noVarInfo { - varSpecMap, err = ParseWorkflowPublicVariableInfo(workflowPath) - if err != nil { return templates, err } - } - templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], Template{ templateName, varSpecMap }) - } + isPublic := IsFilePublicWorkflow(workflowPath) + varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + if err != nil { return err } + templatesCache[RevisionKey(revision)] = append(templatesCache[RevisionKey(revision)], + Template{templateName, isPublic, varSpecMap}) } } } - return templates, nil + return nil } +// Returns a map of revision->[]templates for the repo +func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflows bool) (TemplatesByRevision, error) { + // Get a list of revisions (branches/tags/hash) that are matched by the revisionPattern; gitRefs filter branches and/or tags + revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) + if err != nil { + return nil, err + } + + templates := make(TemplatesByRevision) + for _, revision := range revisionsMatched { + for _, template := range templatesCache[RevisionKey(revision)] { + // Check if workflow is public in case not allWorkflows requested + // and skip it if it isn't + if allWorkflows || (!allWorkflows && template.Public) { + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], template) + } + } + } + return templates, nil +} func (r*Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { var revisions []string diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index b201fd8bb..8b801fa82 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -123,6 +123,12 @@ func initializeRepos(service configuration.Service) *RepoManager { } } + // Update all repos + err = rm.RefreshRepos() + if err != nil { + log.Warning("Could not refresh repos: ", err) + } + return &rm } @@ -595,6 +601,7 @@ type RepoKey string type RevisionKey string type Template struct { Name string + Public bool VarInfo VarSpecMap } type Templates []Template @@ -602,7 +609,7 @@ type TemplatesByRevision map[RevisionKey]Templates type TemplatesByRepo map[RepoKey]TemplatesByRevision // Returns a map of templates: repo -> revision -> []templates -func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool, noVarInfo bool) (TemplatesByRepo, int, error) { +func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool) (TemplatesByRepo, int, error) { templateList := make(TemplatesByRepo) numTemplates := 0 @@ -648,9 +655,9 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat var templates TemplatesByRevision var err error if revisionPattern == "" { // If the revision pattern is empty, use the default revision - templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows, noVarInfo) + templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows) } else { - templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows, noVarInfo) + templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows) } if err != nil { diff --git a/core/server.go b/core/server.go index 28e2b7f90..69f25f080 100644 --- a/core/server.go +++ b/core/server.go @@ -543,7 +543,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows(), req.GetNoVarInfo()) + workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows()) if err != nil { return nil, status.New(codes.InvalidArgument, "cannot query available workflows for " + req.GetRepoPattern() + "@" + req.GetRevisionPattern() + ": " + err.Error()).Err() diff --git a/go.mod b/go.mod index 4c010ce39..cf03617ac 100644 --- a/go.mod +++ b/go.mod @@ -133,7 +133,6 @@ require ( golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20210119194325-5f4716e94777 - golang.org/x/sync v0.0.0-20201207232520-09787c993a3a // indirect golang.org/x/sys v0.0.0-20210423082822-04245dca01da golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect From c4d95ae2a6c451c67370c6bbb61b122253efa3d8 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 15:47:18 +0200 Subject: [PATCH 0912/2352] [repos] isPublic and varInfo parsing with single file handle --- core/repos/repo.go | 3 +-- core/repos/repoutils.go | 27 +++++++-------------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index e3df81c82..87f3ccc1c 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -251,8 +251,7 @@ func (r *Repo) populateWorkflows() error { if strings.HasSuffix(file.Name(), ".yaml") { templateName := strings.TrimSuffix(file.Name(), ".yaml") workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) - isPublic := IsFilePublicWorkflow(workflowPath) - varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + isPublic, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) if err != nil { return err } templatesCache[RevisionKey(revision)] = append(templatesCache[RevisionKey(revision)], Template{templateName, isPublic, varSpecMap}) diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 3fdb9adc8..1d084355d 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -30,37 +30,24 @@ import ( "io/ioutil" ) -func IsFilePublicWorkflow(filePath string) bool { - yamlFile, err := ioutil.ReadFile(filePath) - if err != nil { return false } - return IsPublicWorkflow(yamlFile) -} - -func IsPublicWorkflow(yamlFile []byte) bool { - var nameNode struct { - Node yaml.Node `yaml:"name"` - } - err := yaml.Unmarshal(yamlFile, &nameNode) - if err != nil { return false } - return nameNode.Node.Tag == "!public" -} - -func ParseWorkflowPublicVariableInfo(fileName string) (VarSpecMap, error) { +func ParseWorkflowPublicVariableInfo(fileName string) (bool, VarSpecMap, error) { yamlFile, err := ioutil.ReadFile(fileName) - if err != nil { return nil, err } + if err != nil { return false, nil, err } nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) - if err != nil { return nil, err } + if err != nil { return false, nil, err } + + isPublic := nodes["name"].Tag == "!public" workflowVarInfo := make(VarSpecMap) for k, v := range nodes { if err = parseYamlPublicVars(&AuxNode{k, &v }, &workflowVarInfo); err != nil { - return nil, err + return false, nil, err } } - return workflowVarInfo, nil + return isPublic, workflowVarInfo, nil } // VarSpecMap holds a map of variable names to their variable information struct From c91653e5f471de33eb7d815fd275aa5d66f08e9c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 16:08:10 +0200 Subject: [PATCH 0913/2352] [repos] Make sure ControlWorkflows repos are case insensitive --- core/repos/repomanager.go | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 8b801fa82..2ba1295a5 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -26,21 +26,21 @@ package repos import ( "errors" - "os" - "path/filepath" - "sort" - "strconv" - "strings" - "sync" - "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/configuration" "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/config" "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "os" + "path/filepath" + "sort" + "strconv" + "strings" + "sync" ) const ( @@ -252,13 +252,12 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st if err != nil { return "", false, err } - - _, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ - URL: repo.getUrl(), + var gitRepo *git.Repository + gitRepo, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ + URL: repo.getUrl(), ReferenceName: plumbing.NewBranchReferenceName(repo.Revision), }) - if err != nil { if err == git.ErrRepositoryAlreadyExists { //Make sure the requested revision is checked out checkoutErr := repo.checkoutRevision(repo.Revision) @@ -274,6 +273,21 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st } } + if gitRepo != nil { + // Update git config to be case insensitive + var gitConfig *config.Config + gitConfig, err = gitRepo.Config() + if err != nil { + return "", false, errors.New(err.Error() + " Failed to get git config") + } + + gitConfig.Raw.AddOption("core", "", "ignorecase", "true") + err = gitRepo.SetConfig(gitConfig) + if err != nil { + return "", false, errors.New(err.Error() + " Failed to update git config") + } + } + manager.repoList[repo.GetIdentifier()] = repo // Set default repo From c051767c8ddebb13ca2f42c8c2495ca6ba5e965f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 16:09:47 +0200 Subject: [PATCH 0914/2352] [repos] Fix order of default revision check on repo add --- core/repos/repomanager.go | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 2ba1295a5..4a32b1ca1 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -180,15 +180,6 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ } func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { - _, err := git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ - URL: repo.getUrl(), - ReferenceName: plumbing.NewBranchReferenceName("master"), //Check out master so we have a working copy - }) - - if err != nil && err != git.ErrRepositoryAlreadyExists { - return err - } - // Decide if revision = defaultRevision -> if yes lock them together // We do this because, in the case where the revision was not specified, it would fall back to the default revision // As a result, subsequent changes to the default revision, within the scope of this function, should be followed by revision @@ -200,8 +191,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { // Check that the defaultRevision is valid var prefixes []string prefixes = append(prefixes, refRemotePrefix, refTagPrefix) - var matchedRevs []string - matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) + matchedRevs, err := repo.getRevisions(repo.DefaultRevision, prefixes) if err != nil { return err } else if len(matchedRevs) == 0 { @@ -248,10 +238,6 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st _, exists := manager.repoList[repo.GetIdentifier()] if !exists { //Try to clone it - err = manager.checkDefaultRevision(repo) - if err != nil { - return "", false, err - } var gitRepo *git.Repository gitRepo, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ URL: repo.getUrl(), @@ -288,6 +274,11 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st } } + err = manager.checkDefaultRevision(repo) + if err != nil { + return "", false, err + } + manager.repoList[repo.GetIdentifier()] = repo // Set default repo From c0e0a53639bb8a6c0bf516db6b0a581aa911848c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 16:11:18 +0200 Subject: [PATCH 0915/2352] [repos] Use shell to run git checkout instead of go-git --- core/repos/repo.go | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 87f3ccc1c..d079294ec 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,16 +26,16 @@ package repos import ( "errors" + "github.com/AliceO2Group/Control/apricot" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/gobwas/glob" "io/ioutil" "os" + "os/exec" "path" "path/filepath" "strings" - - "github.com/AliceO2Group/Control/apricot" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/gobwas/glob" ) type Repo struct { @@ -154,29 +154,28 @@ func (r *Repo) checkoutRevision(revision string) error { return err } - w, err := ref.Worktree() - if err != nil { - return err - } - //Try remotely as a priority (branches) so that we don't check out old, dangling branch refs (e.g. master) newHash, err := ref.ResolveRevision(plumbing.Revision("origin/" + revision)) if err != nil { - //Try locally (tags + hashes) + //Try locally (tags + hashes) newHash, err = ref.ResolveRevision(plumbing.Revision(revision)) if err != nil { return errors.New("checkoutRevision: " + err.Error()) } } - err = w.Checkout(&git.CheckoutOptions{ - Hash: *newHash, - Force: true, - }) + coCmd := exec.Command("git", "-C", r.getCloneDir(), "checkout", newHash.String()) + err = coCmd.Run() if err != nil { - return err + //try force in the (unlikely) case that something went bad + coCmd = exec.Command("git", "-C", r.getCloneDir(), "checkout", "-f", newHash.String()) + err = coCmd.Run() + if err != nil { + return err + } } + r.Hash = newHash.String() //Update repo hash r.Revision = revision //Update repo revision return nil From fde0a9b83d2f994e0d9e7c019a28398a4c5b4ab5 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 16:12:08 +0200 Subject: [PATCH 0916/2352] [repos] Populate the template cache on demand --- core/repos/repo.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index d079294ec..bb3beb2f7 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -199,7 +199,7 @@ func (r *Repo) refresh() error { // git updates, update template cache if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { - err = r.populateWorkflows() + err = r.populateWorkflows(r.getDefaultRevision(), true) if err != nil { return err } @@ -218,16 +218,18 @@ var templatesCache TemplatesByRevision // updates templatesCache // triggered with a repo refresh() -func (r *Repo) populateWorkflows() error { +func (r *Repo) populateWorkflows(revisionPattern string, clear bool) error { // Initialize or clear(!) our cache - templatesCache = make(TemplatesByRevision) + if clear { + templatesCache = make(TemplatesByRevision) + } // Include all types of git references var gitRefs []string gitRefs = append(gitRefs, refRemotePrefix, refTagPrefix) // Include all revisions - revisionsMatched, err := r.getRevisions("*", gitRefs) + revisionsMatched, err := r.getRevisions(revisionPattern, gitRefs) if err != nil { return err } @@ -270,6 +272,10 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo templates := make(TemplatesByRevision) for _, revision := range revisionsMatched { + if len(templatesCache[RevisionKey(revision)]) == 0 { + err = r.populateWorkflows(revision, false) + if err != nil { return nil, err } + } for _, template := range templatesCache[RevisionKey(revision)] { // Check if workflow is public in case not allWorkflows requested // and skip it if it isn't From be6f035a9df61522768c44e53156c0a2bcad8688 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 16:37:28 +0200 Subject: [PATCH 0917/2352] [repos] Repo shouldn't be used as a map key --- core/repos/repomanager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 4a32b1ca1..bfe1cf023 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -561,18 +561,18 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str } func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (err error) { - reposRequired := make(map[Repo]bool) + reposRequired := make(map[string]Repo) for _, taskClass := range taskClassesRequired { var newRepo *Repo newRepo, err = NewRepo(taskClass, manager.defaultRevision) if err != nil { return } - reposRequired[*newRepo] = true + reposRequired[newRepo.RepoName] = *newRepo } // Make sure that the relevant repos are present and checked out on the expected revision - for repo := range reposRequired { + for _, repo := range reposRequired { existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultRevision) From 7d36737b41c97b515e4b1c66d72d8cfce8b2cca6 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 31 May 2021 17:26:44 +0200 Subject: [PATCH 0918/2352] [repos] Add option to get revisions for ListRepos --- core/protos/o2control.proto | 5 ++++- core/repos/repo.go | 44 +++++++++++++++++++++++++++++++++---- core/server.go | 8 ++++++- 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index f2724587e..d62c6492a 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -417,12 +417,15 @@ message GetWorkflowTemplatesReply{ // Repos //////////////////////////////////////// -message ListReposRequest {} +message ListReposRequest { + bool getRevisions = 1; +} message RepoInfo { string name = 1; bool default = 2; string defaultRevision = 3; + repeated string revisions = 4; } message ListReposReply { diff --git a/core/repos/repo.go b/core/repos/repo.go index bb3beb2f7..11bc199ee 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -46,6 +46,7 @@ type Repo struct { DefaultRevision string Hash string Default bool + Revisions []string } func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { @@ -70,7 +71,7 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { } newRepo := Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, defaultRevision, "", false} + repoUrlSlice[2], revision, defaultRevision, "", false, nil} return &newRepo, nil } @@ -167,7 +168,7 @@ func (r *Repo) checkoutRevision(revision string) error { coCmd := exec.Command("git", "-C", r.getCloneDir(), "checkout", newHash.String()) err = coCmd.Run() if err != nil { - //try force in the (unlikely) case that something went bad + //try force in the (unlikely) case that something went wrong coCmd = exec.Command("git", "-C", r.getCloneDir(), "checkout", "-f", newHash.String()) err = coCmd.Run() if err != nil { @@ -197,8 +198,13 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } - // git updates, update template cache + // git updates, gather revisions and update template cache if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { + err = r.gatherRevisions() + if err != nil { + return err + } + err = r.populateWorkflows(r.getDefaultRevision(), true) if err != nil { return err @@ -213,6 +219,36 @@ func (r *Repo) refresh() error { return nil } +func (r *Repo) gatherRevisions() error { + + ref, err := git.PlainOpen(r.getCloneDir()) + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + var revs []string + refs, err := ref.References() + if err != nil { return err } + err = refs.ForEach(func(ref *plumbing.Reference) error { + // The HEAD is omitted in a `git show-ref` so we ignore the symbolic + // references, the HEAD + if ref.Type() == plumbing.SymbolicReference { + return nil + } + + nameSlice := strings.Split(ref.Name().String(), "/") + if len(nameSlice) >= 2 && nameSlice[len(nameSlice)-2] == "origin" { + revs = append(revs, nameSlice[len(nameSlice)-1]) + } + + return nil + }) + if err != nil { return err } + + r.Revisions = revs + return nil +} + // cache holding the repo's templates var templatesCache TemplatesByRevision @@ -220,7 +256,7 @@ var templatesCache TemplatesByRevision // triggered with a repo refresh() func (r *Repo) populateWorkflows(revisionPattern string, clear bool) error { // Initialize or clear(!) our cache - if clear { + if clear || len(templatesCache) == 0 { templatesCache = make(TemplatesByRevision) } diff --git a/core/server.go b/core/server.go index 69f25f080..a7b9823e5 100644 --- a/core/server.go +++ b/core/server.go @@ -582,7 +582,13 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p for i, repoName := range keys { repo := repoList[repoName] - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision} + var revisions []string + if req.GetRevisions { + revisions = repo.Revisions + } else { + revisions = nil + } + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision, Revisions: revisions} } return &pb.ListReposReply{Repos: repoInfos, GlobalDefaultRevision: viper.GetString("globalDefaultRevision")}, nil From 93b22484eaafa71ff3aa92ab9562d3f66ee02e02 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 2 Jun 2021 14:46:56 +0200 Subject: [PATCH 0919/2352] [repos] Add protos --- coconut/protos/o2control.pb.go | 547 ++++++++++++++-------------- coconut/protos/o2control_grpc.pb.go | 12 +- core/protos/o2control.pb.go | 547 ++++++++++++++-------------- core/protos/o2control_grpc.pb.go | 12 +- 4 files changed, 574 insertions(+), 544 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 868def6d8..6a835c79a 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -3376,7 +3376,6 @@ type GetWorkflowTemplatesRequest struct { AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` - NoVarInfo bool `protobuf:"varint,6,opt,name=noVarInfo,proto3" json:"noVarInfo,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3446,13 +3445,6 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } -func (x *GetWorkflowTemplatesRequest) GetNoVarInfo() bool { - if x != nil { - return x.NoVarInfo - } - return false -} - type VarSpecMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3670,6 +3662,8 @@ type ListReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + GetRevisions bool `protobuf:"varint,1,opt,name=getRevisions,proto3" json:"getRevisions,omitempty"` } func (x *ListReposRequest) Reset() { @@ -3704,14 +3698,22 @@ func (*ListReposRequest) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{53} } +func (x *ListReposRequest) GetGetRevisions() bool { + if x != nil { + return x.GetRevisions + } + return false +} + type RepoInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + Revisions []string `protobuf:"bytes,4,rep,name=revisions,proto3" json:"revisions,omitempty"` } func (x *RepoInfo) Reset() { @@ -3767,6 +3769,13 @@ func (x *RepoInfo) GetDefaultRevision() string { return "" } +func (x *RepoInfo) GetRevisions() []string { + if x != nil { + return x.Revisions + } + return nil +} + type ListReposReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4312,7 +4321,7 @@ type ListIntegratedServicesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead } func (x *ListIntegratedServicesReply) Reset() { @@ -4359,11 +4368,11 @@ type IntegratedServiceInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // user-visible service name, e.g. "DD scheduler" Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` - Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` + ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` // allowed values: READY, CONNECTING, TRANSIENT_FAILURE, IDLE, SHUTDOWN + Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` // always a JSON payload with a map inside. } func (x *IntegratedServiceInfo) Reset() { @@ -4881,7 +4890,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, @@ -4894,260 +4903,262 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, - 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, + 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, + 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, + 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, + 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, + 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index ad421239c..920240034 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +53,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +274,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -430,7 +431,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -871,7 +872,10 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 868def6d8..6a835c79a 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.14.0 // source: protos/o2control.proto package pb @@ -3376,7 +3376,6 @@ type GetWorkflowTemplatesRequest struct { AllBranches bool `protobuf:"varint,3,opt,name=allBranches,proto3" json:"allBranches,omitempty"` AllTags bool `protobuf:"varint,4,opt,name=allTags,proto3" json:"allTags,omitempty"` AllWorkflows bool `protobuf:"varint,5,opt,name=allWorkflows,proto3" json:"allWorkflows,omitempty"` - NoVarInfo bool `protobuf:"varint,6,opt,name=noVarInfo,proto3" json:"noVarInfo,omitempty"` } func (x *GetWorkflowTemplatesRequest) Reset() { @@ -3446,13 +3445,6 @@ func (x *GetWorkflowTemplatesRequest) GetAllWorkflows() bool { return false } -func (x *GetWorkflowTemplatesRequest) GetNoVarInfo() bool { - if x != nil { - return x.NoVarInfo - } - return false -} - type VarSpecMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3670,6 +3662,8 @@ type ListReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + GetRevisions bool `protobuf:"varint,1,opt,name=getRevisions,proto3" json:"getRevisions,omitempty"` } func (x *ListReposRequest) Reset() { @@ -3704,14 +3698,22 @@ func (*ListReposRequest) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{53} } +func (x *ListReposRequest) GetGetRevisions() bool { + if x != nil { + return x.GetRevisions + } + return false +} + type RepoInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` - DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Default bool `protobuf:"varint,2,opt,name=default,proto3" json:"default,omitempty"` + DefaultRevision string `protobuf:"bytes,3,opt,name=defaultRevision,proto3" json:"defaultRevision,omitempty"` + Revisions []string `protobuf:"bytes,4,rep,name=revisions,proto3" json:"revisions,omitempty"` } func (x *RepoInfo) Reset() { @@ -3767,6 +3769,13 @@ func (x *RepoInfo) GetDefaultRevision() string { return "" } +func (x *RepoInfo) GetRevisions() []string { + if x != nil { + return x.Revisions + } + return nil +} + type ListReposReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4312,7 +4321,7 @@ type ListIntegratedServicesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead } func (x *ListIntegratedServicesReply) Reset() { @@ -4359,11 +4368,11 @@ type IntegratedServiceInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // user-visible service name, e.g. "DD scheduler" Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` - ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` - Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` + ConnectionState string `protobuf:"bytes,4,opt,name=connectionState,proto3" json:"connectionState,omitempty"` // allowed values: READY, CONNECTING, TRANSIENT_FAILURE, IDLE, SHUTDOWN + Data string `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` // always a JSON payload with a map inside. } func (x *IntegratedServiceInfo) Reset() { @@ -4881,7 +4890,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xe7, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, @@ -4894,260 +4903,262 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6e, 0x6f, 0x56, 0x61, 0x72, 0x49, - 0x6e, 0x66, 0x6f, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, - 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x62, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, + 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, + 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, + 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, + 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, + 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 1d2449153..713786068 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ControlClient is the client API for Control service. @@ -52,7 +53,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) if err != nil { return nil, err } @@ -273,7 +274,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Control_serviceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) if err != nil { return nil, err } @@ -428,7 +429,7 @@ type UnsafeControlServer interface { } func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { - s.RegisterService(&_Control_serviceDesc, srv) + s.RegisterService(&Control_ServiceDesc, srv) } func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -869,7 +870,10 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -var _Control_serviceDesc = grpc.ServiceDesc{ +// Control_ServiceDesc is the grpc.ServiceDesc for Control service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Control_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2control.Control", HandlerType: (*ControlServer)(nil), Methods: []grpc.MethodDesc{ From 755dec9ed372f72a52b8402635eb393689d5ccee Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 8 Jun 2021 13:59:13 +0200 Subject: [PATCH 0920/2352] [core] Hook errors should not be fatal --- core/environment/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index fc8ff6475..380d071bc 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -211,7 +211,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // If the hook call or task is critical: true if hook.GetTraits().Critical { - log.Fatalf("critical hook failed: %s", err) + log.Errorf("critical hook failed: %s", err) criticalFailures = append(criticalFailures, err) } } From 0074c3a70aea34ab766b863b6564aa659c8f2b1e Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 8 Jun 2021 15:25:53 +0200 Subject: [PATCH 0921/2352] [core] Init pendingEORS map for DCS plugin --- core/integration/dcs/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 527273746..c2045b6cf 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -72,6 +72,7 @@ func NewPlugin(endpoint string) integration.Plugin { dcsHost: u.Hostname(), dcsPort: portNumber, dcsClient: nil, + pendingEORs: make(map[string]int64), } } @@ -405,4 +406,3 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Det func (p *Plugin) Destroy() error { return p.dcsClient.Close() } - From 3f2a844b70898d4da654b0462b2fe541fa5955fd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Jun 2021 14:05:46 +0200 Subject: [PATCH 0922/2352] [apricot] Use Error instead of Fatal unless ready to os.Exit(1) --- apricot/local/service.go | 6 +++--- apricot/local/servicehttp.go | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 3d29f65c1..20c706443 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -132,7 +132,7 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) } keys, err := s.src.GetKeysByPrefix(keyPrefix) if err != nil { - log.WithError(err).Fatal("Error, could not retrieve host list.") + log.WithError(err).Error("could not retrieve host list") return []string{}, err } hostSet := make(map[string]bool, 0) @@ -266,12 +266,12 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, func (s *Service) RawGetRecursive(path string) (string, error) { cfgDump, err := s.src.GetRecursive(path) if err != nil { - log.WithError(err).Fatal("cannot retrieve configuration") + log.WithError(err).Error("cannot retrieve configuration") return "", err } cfgBytes, err := json.MarshalIndent(cfgDump, "", "\t") if err != nil { - log.WithError(err).Fatal("cannot marshal configuration dump") + log.WithError(err).Error("cannot marshal configuration dump") return "", err } return string(cfgBytes[:]), nil diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 256e181b9..59431c0c6 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -109,7 +109,9 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { // async-start of http Service and capture error go func() { err := httpsvr.ListenAndServe() - log.WithError(err).Fatal("Fatal error with Http Service.") + if err != nil { + log.WithError(err).Error("HTTP service returned error") + } }() return httpsvr } From 5040c3f04121f53f6f4ab2ad5d80be56f278266b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Jun 2021 15:53:19 +0200 Subject: [PATCH 0923/2352] [core] Support for target in bind block, for static inbound ch config --- core/task/channel/channel.go | 21 +++++++++++++++---- core/task/channel/inbound.go | 39 +++++++++++++++++++++++++++++++++-- core/task/channel/outbound.go | 12 +---------- core/task/task.go | 14 ++++--------- 4 files changed, 59 insertions(+), 27 deletions(-) diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index 5670c2151..167906d80 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -25,9 +25,9 @@ package channel import ( + "errors" "strconv" "strings" - "errors" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" @@ -40,8 +40,19 @@ type Channel struct { Type ChannelType `yaml:"type"` SndBufSize int `yaml:"sndBufSize"` RcvBufSize int `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"`//actually an int but we allow templating - Transport TransportType `yaml:"transport"` //default: default + RateLogging string `yaml:"rateLogging"` //actually an int but we allow templating + Transport TransportType `yaml:"transport"` //default: default + Target string `yaml:"target"` //default: empty + // allowed values for `target` field: + // outbound channel (mandatory!): ->outbound.go + // tcp://host:port + // ipc://named-pipe-name + // path.to.role:channel_name + // global_channel_name + // inbound channel (optional!): ->inbound.go + // tcp://host:port + // ipc://named-pipe-name + // -> automatic port assignment (pre-v0.24 behaviour) } func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -51,7 +62,8 @@ func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { SndBufSize string `yaml:"sndBufSize"` RcvBufSize string `yaml:"rcvBufSize"` RateLogging string `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` //default: default + Transport TransportType `yaml:"transport"` + Target string `yaml:"target"` } aux := _channel{} err = unmarshal(&aux) @@ -84,6 +96,7 @@ func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } c.RateLogging = aux.RateLogging c.Transport = aux.Transport + c.Target = strings.TrimSpace(aux.Target) return } diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index b7ed10632..5cd7ee268 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -25,6 +25,7 @@ package channel import ( + "fmt" "strconv" "strings" @@ -36,6 +37,8 @@ type Inbound struct { Channel Global string `yaml:"global"` Addressing AddressFormat `yaml:"addressing"` //default: tcp + // Addressing is ignored if Target not empty, because it means the WFT/TT is + // setting a static TCP or IPC bind address. } func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -104,8 +107,40 @@ chans.data1.0.type = push chans.data1.numSockets = 1 */ -func (inbound *Inbound) ToFMQMap(endpoint Endpoint) (pm controlcommands.PropertyMap) { - return inbound.buildFMQMap(endpoint.ToBoundEndpoint().GetAddress(), endpoint.GetTransport()) +func (inbound *Inbound) ToFMQMap(bindMap BindMap) (pm controlcommands.PropertyMap, err error) { + if inbound == nil { + err = fmt.Errorf("inbound channel object is nil") + return nil, err + } + + var address string + var transport TransportType + // If an explicit target was provided, we use it. + // NO MATCHING WILL HAPPEN! + if strings.HasPrefix(inbound.Target, "tcp://") || + strings.HasPrefix(inbound.Target, "ipc://") { + address = inbound.Target + transport = inbound.Transport + } else if len(inbound.Target) != 0 { + err = fmt.Errorf("inbound channel target %s provided but invalid", inbound.Target) + log.WithError(err). + Error("bad inbound channel specification") + return nil, err + } else { + // We ignore any Target spec and proceed with inbound-outbound matching with + // the provided localBindMap. + endpoint, ok := bindMap[inbound.Name] + if !ok { + err = fmt.Errorf("endpoint for key %s not present in bindMap", inbound.Name) + log.WithError(err). + Warn("cannot match endpoint for channel") + return nil, err + } + address = endpoint.ToBoundEndpoint().GetAddress() + transport = endpoint.GetTransport() + } + + return inbound.buildFMQMap(address, transport), nil } func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm controlcommands.PropertyMap) { diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index d7652e295..df61ff3bf 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -36,25 +36,15 @@ import ( type Outbound struct { Channel - Target string `json:"target" yaml:"target"` } func (outbound *Outbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - target := struct { - Target string `json:"target" yaml:"target"` - }{} - err = unmarshal(&target) - if err != nil { - return - } - ch := Channel{} err = unmarshal(&ch) if err != nil { return } - outbound.Target = target.Target outbound.Channel = ch return } @@ -78,7 +68,7 @@ func (outbound Outbound) MarshalYAML() (interface{}, error) { RcvBufSize: outbound.Channel.RcvBufSize, RateLogging: outbound.Channel.RateLogging, Transport: outbound.Channel.Transport, - Target: outbound.Target, + Target: outbound.Channel.Target, } return auxOutbound, nil diff --git a/core/task/task.go b/core/task/task.go index e0d3631d7..951cac460 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -489,19 +489,13 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT { for _, inbCh := range channel.MergeInbound(t.GetParent().CollectInboundChannels(), class.Bind) { - endpoint, ok := t.localBindMap[inbCh.Name] - if !ok { - log.WithFields(logrus.Fields{ - "channelName": inbCh.Name, - "taskName": t.name, - }). - Warn("endpoint not allocated for inbound channel") + // We get the FairMQ-formatted propertyMap from the inbound channel spec + var chanProps controlcommands.PropertyMap + chanProps, err = inbCh.ToFMQMap(t.localBindMap) + if err != nil { continue } - // We get the FairMQ-formatted propertyMap from the inbound channel spec - chanProps := inbCh.ToFMQMap(endpoint) - // And we copy it into the task's propertyMap for k, v := range chanProps { propMap[k] = v From 2824d39778daceaabffdc605e2b02b615f83a644 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Jun 2021 15:59:55 +0200 Subject: [PATCH 0924/2352] [walnut] Unbreak build --- walnut/converter/converter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index c4e5ce29e..65c36c0b4 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -124,8 +124,8 @@ func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string Name: channelName, Type: channel.ChannelType("pull"), Transport: channel.TransportType("shmem"), + Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), }, - Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), } task.Connect = append(task.Connect, singleConnect) } From 0f605e63d23d3e44714c48223f52e0a4bda7e461 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Jun 2021 16:13:42 +0200 Subject: [PATCH 0925/2352] [build] Bump to v0.23.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a59ee4791..f0e75986a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 23 -VERSION_PATCH := 1 +VERSION_PATCH := 80 From 4e999fc98269ea5dc4296069942e27bae8dea546 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Jun 2021 16:26:10 +0200 Subject: [PATCH 0926/2352] [build] Remove o2-aliecs-odc-shim, the legacy ODC client implementation --- Makefile | 10 +- cmd/o2-aliecs-odc-shim/main.go | 41 - docs/building.md | 3 +- docs/handbook/overview.md | 1 - odcshim/occserver/handlers.go | 484 --------- odcshim/occserver/occserver.go | 250 ----- odcshim/occserver/state.go | 60 -- odcshim/odcclient/odcclient.go | 74 -- odcshim/odcprotos/odc.pb.go | 1601 ------------------------------ odcshim/odcprotos/odc.proto | 171 ---- odcshim/odcprotos/odc_grpc.pb.go | 563 ----------- odcshim/odcshim.go | 96 -- odcshim/protos/occ.pb.go | 982 ------------------ odcshim/protos/occ_grpc.pb.go | 262 ----- 14 files changed, 4 insertions(+), 4594 deletions(-) delete mode 100644 cmd/o2-aliecs-odc-shim/main.go delete mode 100644 odcshim/occserver/handlers.go delete mode 100644 odcshim/occserver/occserver.go delete mode 100644 odcshim/occserver/state.go delete mode 100644 odcshim/odcclient/odcclient.go delete mode 100644 odcshim/odcprotos/odc.pb.go delete mode 100644 odcshim/odcprotos/odc.proto delete mode 100644 odcshim/odcprotos/odc_grpc.pb.go delete mode 100644 odcshim/odcshim.go delete mode 100644 odcshim/protos/occ.pb.go delete mode 100644 odcshim/protos/occ_grpc.pb.go diff --git a/Makefile b/Makefile index 0e12a5333..a308a1c96 100644 --- a/Makefile +++ b/Makefile @@ -43,20 +43,19 @@ DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master VERBOSE_1 := -v VERBOSE_2 := -v -x -WHAT := o2-aliecs-core o2-aliecs-executor coconut peanut o2-aliecs-odc-shim walnut o2-apricot +WHAT := o2-aliecs-core o2-aliecs-executor coconut peanut walnut o2-apricot WHAT_o2-aliecs-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-aliecs-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) -WHAT_o2-aliecs-odc-shim_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./odcshim ./walnut -SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./odcshim ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut +SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product @@ -131,8 +130,6 @@ vendor: @echo -e "\033[1;33mcurl odc.proto\033[0m" @mkdir -p core/integration/odc/protos @curl -s -L $(ODC_PROTO) -o core/integration/odc/protos/odc.proto - @mkdir -p odcshim/odcprotos - @curl -s -L $(ODC_PROTO) -o odcshim/odcprotos/odc.proto @echo -e "\033[1;33mcurl ddsched.proto\033[0m" @mkdir -p core/integration/ddsched/protos @@ -145,7 +142,6 @@ vendor: # after we download it. @echo -e "\033[1;33mpatch odc.proto\033[0m" @perl -pi -e '$$_.="option go_package = \"protos;odc\";\n" if (/^package/)' core/integration/odc/protos/odc.proto - @perl -pi -e '$$_.="option go_package = \"odcprotos;odc\";\n" if (/^package/)' odcshim/odcprotos/odc.proto # vendor: tools/dep # @echo -e "\033[1;33mdep ensure\033[0m" diff --git a/cmd/o2-aliecs-odc-shim/main.go b/cmd/o2-aliecs-odc-shim/main.go deleted file mode 100644 index 1ac581ec4..000000000 --- a/cmd/o2-aliecs-odc-shim/main.go +++ /dev/null @@ -1,41 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package main - -import ( - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/odcshim" - "github.com/sirupsen/logrus" -) - -var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") - -func main() { - logrus.SetLevel(logrus.DebugLevel) - - if err := odcshim.Run(); err != nil { - log.Fatal(err) - } -} diff --git a/docs/building.md b/docs/building.md index a4dbdd88e..b738d33e2 100644 --- a/docs/building.md +++ b/docs/building.md @@ -13,7 +13,6 @@ AliECS consists of: * process control plugin + library (OCC) - C++, runs throughout the cluster linked by user processes * peanut - Go, local debugging tool * walnut - Go, local workflow conversion tool -* o2-aliecs-odc-shim - Go, runs on the cluster as an intermediary between AliECS and the EPN cluster ## Building with aliBuild @@ -30,7 +29,7 @@ For development purposes, due to the significant differences in building and dep $ aliBuild init --defaults o2-dataflow Control-OCCPlugin $ aliBuild build --defaults o2-dataflow Control-OCCPlugin -# Includes core, executor and o2-aliecs-odc-shim in default build, can be used to build coconut, peanut and walnut locally +# Includes core and executor in default build, can be used to build coconut, peanut and walnut locally $ aliBuild init --defaults o2-dataflow Control-Core $ aliBuild build --defaults o2-dataflow Control-Core ``` diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index 4bae6a76f..beff23a28 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -15,7 +15,6 @@ AliECS in a distributed application, using Apache Mesos as toolkit. It integrate | configuration | A Consul data store, running on the head node on port 8500. Used for AliECS configuration as well as application-specific component configuration. | | Mesos master | Main service of the Mesos resource management system, running on the head node on port 5050. | | Mesos agent | Agent service of the Mesos RMS, running on every FLP. | -| O²/EPN cluster control | Instance of Online Device Control (ODC) running on the O²/EPN cluster. Used for workflows that include `o2-aliecs-odc-shim` as controlled task. | | AliECS GUI | Instance of the user-facing web interface for AliECS (`cog`), running on the head node. This is the main entry point for regular users. | | AliECS CLI | The `coconut` command, provided by the package with the same name. This is the reference client for advanced users and developers. | diff --git a/odcshim/occserver/handlers.go b/odcshim/occserver/handlers.go deleted file mode 100644 index 3c2baec99..000000000 --- a/odcshim/occserver/handlers.go +++ /dev/null @@ -1,484 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package occserver - -import ( - "context" - "errors" - "fmt" - - "github.com/AliceO2Group/Control/odcshim/odcclient" - odc "github.com/AliceO2Group/Control/odcshim/odcprotos" - pb "github.com/AliceO2Group/Control/odcshim/protos" - "github.com/k0kubun/pp" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/status" -) - -func handleGetState(ctx context.Context, odcClient *odcclient.RpcClient, envId string) (string, error) { - req := &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - } - - var ( - err error = nil - newState = "UNKNOWN" - rep *odc.StateReply - ) - - if envId == "" { - return newState, errors.New("cannot proceed with empty environment id") - } - - rep, err = odcClient.GetState(ctx, req, grpc.EmptyCallOption{}) - if err != nil { - return newState, printGrpcError(err) - } - - if rep == nil || rep.Reply == nil { - // We got a nil response with nil error, this should never happen - return newState, errors.New("nil response error") - } - - newState = rep.Reply.State - - if odcErr := rep.Reply.GetError(); odcErr != nil { - return newState, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return newState, fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - "odcState": rep.Reply.State, - }). - Debug("call to ODC complete") - return stateForOdcState(newState), err -} - -func handleStart(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - req := &odc.StartRequest{ - Request: &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - - var err error = nil - var rep *odc.StateReply - - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if rep == nil || rep.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func handleStop(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - req := &odc.StopRequest{ - Request: &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - - var err error = nil - var rep *odc.StateReply - - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if rep == nil || rep.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func handleReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - err := doReset(ctx, odcClient, arguments, envId) - if err != nil { - return printGrpcError(err) - } - - err = doTerminate(ctx, odcClient, arguments, envId) - if err != nil { - return printGrpcError(err) - } - - err = doShutdown(ctx, odcClient, arguments, envId) - if err != nil { - return printGrpcError(err) - } - return nil -} - -func doReset(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - // RESET - req := &odc.ResetRequest{ - Request: &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - - var err error = nil - var rep *odc.StateReply - - rep, err = odcClient.Reset(ctx, req, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if rep == nil || rep.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func doTerminate(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - // TERMINATE - req := &odc.TerminateRequest{ - Request: &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - - var err error = nil - var rep *odc.StateReply - - rep, err = odcClient.Terminate(ctx, req, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if rep == nil || rep.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := rep.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func doShutdown(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error{ - // SHUTDOWN - shutdownRequest := &odc.ShutdownRequest{ - Partitionid: envId, - } - - var err error = nil - var shutdownResponse *odc.GeneralReply - shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if shutdownResponse == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := shutdownResponse.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := shutdownResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": shutdownResponse.Msg, - "odcStatus": shutdownResponse.Status.String(), - "odcExectime": shutdownResponse.Exectime, - "odcRunid": shutdownResponse.Partitionid, - "odcSessionid": shutdownResponse.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func handleExit(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry ) error { - return nil -} - -func handleRun(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, envId string) error { - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - log.Trace("BEGIN handleRun") - defer log.Trace("END handleRun") - // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE - var topology string - for _, entry := range arguments { - if entry.Key == "topology" { - topology = entry.Value - } - } - - if len(topology) == 0 { - return errors.New("empty topology received") - } - - runRequest := &odc.RunRequest{ - Partitionid: envId, - Topology: topology, - } - - var err error = nil - var runResponse *odc.GeneralReply - - runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if runResponse == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := runResponse.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := runResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) - } - log.WithFields(logrus.Fields{ - "odcMsg": runResponse.Msg, - "odcStatus": runResponse.Status.String(), - "odcExectime": runResponse.Exectime, - "odcRunid": runResponse.Partitionid, - "odcSessionid": runResponse.Sessionid, - }). - Debug("call to ODC complete") - return err -} - - -func handleConfigure(ctx context.Context, odcClient *odcclient.RpcClient, arguments []*pb.ConfigEntry, topology string, envId string) error { - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - var err error = nil - - // SetProperties before CONFIGURE - setPropertiesRequest := &odc.SetPropertiesRequest{ - Partitionid: envId, - Path: "", - Properties: make([]*odc.Property, len(arguments)), - } - - // Extract relevant parameters from Arguments payload - // and build payload for SetProperty+Configure - for i, entry := range arguments { - setPropertiesRequest.Properties[i] = &odc.Property{ - Key: entry.Key, - Value: entry.Value, - } - } - - err = handleRun(ctx, odcClient, []*pb.ConfigEntry{{ - Key: "topology", - Value: topology, - }}, envId) - if err != nil { - return printGrpcError(err) - } - - - var setPropertiesResponse *odc.GeneralReply - setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if setPropertiesResponse == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := setPropertiesResponse.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := setPropertiesResponse.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": setPropertiesResponse.Msg, - "odcStatus": setPropertiesResponse.Status.String(), - "odcExectime": setPropertiesResponse.Exectime, - "odcRunid": setPropertiesResponse.Partitionid, - "odcSessionid": setPropertiesResponse.Sessionid, - }). - Debug("call to ODC complete") - - - // CONFIGURE - configureRequest := &odc.ConfigureRequest{ - Request: &odc.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - - var configureResponse *odc.StateReply - configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if configureResponse == nil || configureResponse.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := configureResponse.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := configureResponse.Reply.Status; replyStatus != odc.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "odcRunid": configureResponse.Reply.Partitionid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). - Debug("call to ODC complete") - return err -} - -func printGrpcError(err error) error { - grpcStatus, ok := status.FromError(err) - if ok { - log.WithFields(logrus.Fields{ - "code": grpcStatus.Code().String(), - "message": grpcStatus.Message(), - "details": grpcStatus.Details(), - "error": grpcStatus.Err().Error(), - "ppStatus": pp.Sprint(grpcStatus), - "ppErr": pp.Sprint(err), - }). - Error("transition call error") - err = fmt.Errorf("occplugin returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) - } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status").Error("transition call error") - } - return err -} \ No newline at end of file diff --git a/odcshim/occserver/occserver.go b/odcshim/occserver/occserver.go deleted file mode 100644 index 87313ba0b..000000000 --- a/odcshim/occserver/occserver.go +++ /dev/null @@ -1,250 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package occserver - -import ( - "context" - "fmt" - "os" - "runtime" - "strings" - "time" - - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/odcshim/odcclient" - pb "github.com/AliceO2Group/Control/odcshim/protos" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/reflection" - "google.golang.org/grpc/status" -) - -var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") - -const CALL_TIMEOUT = 30*time.Second - -type OccServerImpl struct { - odcHost string - odcPort int - topology string - environmentId string - odcClient *odcclient.RpcClient -} - -func (s *OccServerImpl) disconnectAndTerminate() { - _ = s.odcClient.Close() - s.odcClient = nil - - // We sleep half a second so gRPC can send the EXIT response, and then quit - time.Sleep(500*time.Millisecond) - os.Exit(0) -} - -func (s *OccServerImpl) ensureClientConnected() error { - log.Trace("BEGIN ensureClientConnected") - defer log.Trace("END ensureClientConnected") - // If we're already connected we assume all is well & return nil - if s.odcClient != nil && s.odcClient.GetConnState() == connectivity.Ready { - return nil - } - - // Otherwise we need to connect & deploy the topology. Specifically: - // * create the clientconn - // * instantiate the odcClient and RUN - // * report error or nil - endpoint := fmt.Sprintf("%s:%d", s.odcHost, s.odcPort) - - cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) - - s.odcClient = odcclient.NewClient(cxt, cancel, endpoint) - if s.odcClient == nil { - return fmt.Errorf("cannot dial ODC endpoint: %s", endpoint) - } - - return nil -} - -func NewServer(host string, port int, topology string) *grpc.Server { - grpcServer := grpc.NewServer() - srvImpl := &OccServerImpl{ - odcHost: host, - odcPort: port, - topology: topology, - } - pb.RegisterOccServer(grpcServer, srvImpl) - // Register reflection service on gRPC server. - reflection.Register(grpcServer) - - go func() { - err := srvImpl.ensureClientConnected() - if err != nil { - log.WithError(err).Error("ODC client cannot connect") - return - } - log.Info("ODC client connected") - }() - - return grpcServer -} - -func (s *OccServerImpl) logMethod() { - if !viper.GetBool("verbose") { - return - } - pc, _, _, ok := runtime.Caller(1) - if !ok { - return - } - fun := runtime.FuncForPC(pc) - if fun == nil { - return - } - log.WithField("method", fun.Name()). - Debug("handling RPC request") -} - -// FIXME: this is a dummy implementation -func (s *OccServerImpl) EventStream(req *pb.EventStreamRequest, srv pb.Occ_EventStreamServer) error { - s.logMethod() - ctx := srv.Context() - for { - select { - // FIXME: make a channel s.eventCh and receive events from all over the place - //case event := <- s.eventCh: - //err := srv.Send(event) - //if err != nil { - // return err - //} - case <-ctx.Done(): - return ctx.Err() - } - } -} -func (s *OccServerImpl) StateStream(req *pb.StateStreamRequest, srv pb.Occ_StateStreamServer) error { - s.logMethod() - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (s *OccServerImpl) GetState(ctx context.Context, req *pb.GetStateRequest) (*pb.GetStateReply, error) { - s.logMethod() - if req == nil { - return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") - } - - if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { - return nil, status.Errorf(codes.Internal, "ODC not connected") - } - - // Provisional response STANDBY when we know we're connected but haven't - // reached CONFIGURE yet so we don't have an envId to use for an ODC.GetState call - rep := &pb.GetStateReply{ - State: "STANDBY", - } - - if len(s.environmentId) > 0 { - newState, err := handleGetState(ctx, s.odcClient, s.environmentId) - if err == nil { - rep.State = newState - } - return rep, err - } - return rep, nil -} - -func (s *OccServerImpl) Transition(ctx context.Context, req *pb.TransitionRequest) (*pb.TransitionReply, error) { - s.logMethod() - if req == nil { - return nil, status.Errorf(codes.InvalidArgument, "bad incoming request") - } - - // Provisional response - rep := &pb.TransitionReply{ - Trigger: pb.StateChangeTrigger_EXECUTOR, - State: req.SrcState, - TransitionEvent: req.TransitionEvent, - Ok: false, - } - - if s.odcClient == nil || s.odcClient.GetConnState() != connectivity.Ready { - err := s.ensureClientConnected() - if err != nil { - log.WithError(err). - WithFields(logrus.Fields{ - "host": s.odcHost, - "port": s.odcPort, - }). - Error("cannot connect to ODC endpoint") - return nil, err - } - } - - var err error = nil - switch event := strings.ToUpper(req.TransitionEvent); event { - case "CONFIGURE": - // Extract environment ID from Arguments payload - for _, entry := range req.Arguments { - if entry.Key == "environment_id" { - s.environmentId = entry.Value - } - } - - err = handleConfigure(ctx, s.odcClient, req.Arguments, s.topology, s.environmentId) - if err == nil { - rep.Ok = true - rep.State = "CONFIGURED" - } - case "START": - err = handleStart(ctx, s.odcClient, req.Arguments, s.environmentId) - if err == nil { - rep.Ok = true - rep.State = "RUNNING" - } - case "STOP": - err = handleStop(ctx, s.odcClient, req.Arguments, s.environmentId) - if err == nil { - rep.Ok = true - rep.State = "CONFIGURED" - } - case "RESET": - err = handleReset(ctx, s.odcClient, req.Arguments, s.environmentId) - if err == nil { - s.environmentId = "" - rep.Ok = true - rep.State = "STANDBY" - } - case "EXIT": - err = handleExit(ctx, s.odcClient, req.Arguments) - if err == nil { - rep.Ok = true - rep.State = "DONE" - } - go s.disconnectAndTerminate() - default: - rep.State = "UNDEFINED" - } - return rep, err -} diff --git a/odcshim/occserver/state.go b/odcshim/occserver/state.go deleted file mode 100644 index 8c06a0850..000000000 --- a/odcshim/occserver/state.go +++ /dev/null @@ -1,60 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package occserver - -import "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" - -var( - stateMap = map[string]string{ - "STANDBY": fairmq.IDLE, - "CONFIGURED": fairmq.READY, - "RUNNING": fairmq.RUNNING, - "ERROR": fairmq.ERROR, - "DONE": fairmq.EXITING, - } - invStateMap = func() (inv map[string]string) { // invert stateMap - inv = make(map[string]string, len(stateMap)) - for k, v := range stateMap { - inv[v] = k - } - return - }() -) - -func odcStateForState(stateName string) string { - fmqState, ok := stateMap[stateName] - if !ok { - return "" - } - return fmqState -} - -func stateForOdcState(fmqStateName string) string { - state, ok := invStateMap[fmqStateName] - if !ok { - return "" - } - return state -} diff --git a/odcshim/odcclient/odcclient.go b/odcshim/odcclient/odcclient.go deleted file mode 100644 index 9705c7910..000000000 --- a/odcshim/odcclient/odcclient.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package odcclient - -import ( - "context" - - "github.com/AliceO2Group/Control/common/logger" - odc "github.com/AliceO2Group/Control/odcshim/odcprotos" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" -) - -var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") - -type RpcClient struct { - odc.ODCClient - conn *grpc.ClientConn -} - -func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { - log.WithFields(logrus.Fields{ - "endpoint": endpoint, - }).Debug("dialing odcClient") - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) - if err != nil { - log.WithField("error", err.Error()). - WithField("endpoint", endpoint). - Errorf("cannot dial RPC endpoint") - cancel() - return nil - } - - client := &RpcClient { - ODCClient: odc.NewODCClient(conn), - conn: conn, - } - - return client -} - -func (m *RpcClient) GetConnState() connectivity.State { - if m.conn == nil { - return connectivity.Idle - } - return m.conn.GetState() -} - -func (m *RpcClient) Close() error { - return m.conn.Close() -} \ No newline at end of file diff --git a/odcshim/odcprotos/odc.pb.go b/odcshim/odcprotos/odc.pb.go deleted file mode 100644 index f37feadee..000000000 --- a/odcshim/odcprotos/odc.pb.go +++ /dev/null @@ -1,1601 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.25.0 -// protoc v3.15.7 -// source: odcprotos/odc.proto - -package odc - -import ( - proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -// Request status -type ReplyStatus int32 - -const ( - ReplyStatus_UNKNOWN ReplyStatus = 0 // Status is unknown - ReplyStatus_SUCCESS ReplyStatus = 1 // Request performed successfully - ReplyStatus_ERROR ReplyStatus = 2 // Failed to perform request -) - -// Enum value maps for ReplyStatus. -var ( - ReplyStatus_name = map[int32]string{ - 0: "UNKNOWN", - 1: "SUCCESS", - 2: "ERROR", - } - ReplyStatus_value = map[string]int32{ - "UNKNOWN": 0, - "SUCCESS": 1, - "ERROR": 2, - } -) - -func (x ReplyStatus) Enum() *ReplyStatus { - p := new(ReplyStatus) - *p = x - return p -} - -func (x ReplyStatus) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (ReplyStatus) Descriptor() protoreflect.EnumDescriptor { - return file_odcprotos_odc_proto_enumTypes[0].Descriptor() -} - -func (ReplyStatus) Type() protoreflect.EnumType { - return &file_odcprotos_odc_proto_enumTypes[0] -} - -func (x ReplyStatus) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use ReplyStatus.Descriptor instead. -func (ReplyStatus) EnumDescriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{0} -} - -// General error -type Error struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed error message - Code int32 `protobuf:"varint,2,opt,name=code,proto3" json:"code,omitempty"` // Error code. -} - -func (x *Error) Reset() { - *x = Error{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Error) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Error) ProtoMessage() {} - -func (x *Error) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Error.ProtoReflect.Descriptor instead. -func (*Error) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{0} -} - -func (x *Error) GetMsg() string { - if x != nil { - return x.Msg - } - return "" -} - -func (x *Error) GetCode() int32 { - if x != nil { - return x.Code - } - return 0 -} - -// General reply to requests -type GeneralReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed reply message - Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` // Request status code (UNKNOWN, SUCCESS, ERROR) - Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty - Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms - Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID - State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. -} - -func (x *GeneralReply) Reset() { - *x = GeneralReply{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GeneralReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GeneralReply) ProtoMessage() {} - -func (x *GeneralReply) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GeneralReply.ProtoReflect.Descriptor instead. -func (*GeneralReply) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{1} -} - -func (x *GeneralReply) GetMsg() string { - if x != nil { - return x.Msg - } - return "" -} - -func (x *GeneralReply) GetStatus() ReplyStatus { - if x != nil { - return x.Status - } - return ReplyStatus_UNKNOWN -} - -func (x *GeneralReply) GetError() *Error { - if x != nil { - return x.Error - } - return nil -} - -func (x *GeneralReply) GetExectime() int32 { - if x != nil { - return x.Exectime - } - return 0 -} - -func (x *GeneralReply) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *GeneralReply) GetSessionid() string { - if x != nil { - return x.Sessionid - } - return "" -} - -func (x *GeneralReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -// Device information -// Runtime task ID and path are the same as in DDS. -// To get task details use DDS Topology API. -type Device struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) -} - -func (x *Device) Reset() { - *x = Device{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Device) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Device) ProtoMessage() {} - -func (x *Device) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Device.ProtoReflect.Descriptor instead. -func (*Device) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{2} -} - -func (x *Device) GetId() uint64 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *Device) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Device) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -// Device change/get state request -type StateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. - Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` // If true then a list of affected devices is populated in the reply. -} - -func (x *StateRequest) Reset() { - *x = StateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateRequest) ProtoMessage() {} - -func (x *StateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateRequest.ProtoReflect.Descriptor instead. -func (*StateRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{3} -} - -func (x *StateRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *StateRequest) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *StateRequest) GetDetailed() bool { - if x != nil { - return x.Detailed - } - return false -} - -// Device change/get state reply -type StateReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` // General reply. See GeneralReply message for details. - Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. -} - -func (x *StateReply) Reset() { - *x = StateReply{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateReply) ProtoMessage() {} - -func (x *StateReply) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateReply.ProtoReflect.Descriptor instead. -func (*StateReply) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{4} -} - -func (x *StateReply) GetReply() *GeneralReply { - if x != nil { - return x.Reply - } - return nil -} - -func (x *StateReply) GetDevices() []*Device { - if x != nil { - return x.Devices - } - return nil -} - -// Initialize request -type InitializeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. -} - -func (x *InitializeRequest) Reset() { - *x = InitializeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InitializeRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InitializeRequest) ProtoMessage() {} - -func (x *InitializeRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. -func (*InitializeRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{5} -} - -func (x *InitializeRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *InitializeRequest) GetSessionid() string { - if x != nil { - return x.Sessionid - } - return "" -} - -// Submit request -type SubmitRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Plugin string `protobuf:"bytes,2,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server - Resources string `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description -} - -func (x *SubmitRequest) Reset() { - *x = SubmitRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SubmitRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SubmitRequest) ProtoMessage() {} - -func (x *SubmitRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SubmitRequest.ProtoReflect.Descriptor instead. -func (*SubmitRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{6} -} - -func (x *SubmitRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *SubmitRequest) GetPlugin() string { - if x != nil { - return x.Plugin - } - return "" -} - -func (x *SubmitRequest) GetResources() string { - if x != nil { - return x.Resources - } - return "" -} - -// Activate request -type ActivateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file -} - -func (x *ActivateRequest) Reset() { - *x = ActivateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ActivateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ActivateRequest) ProtoMessage() {} - -func (x *ActivateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ActivateRequest.ProtoReflect.Descriptor instead. -func (*ActivateRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{7} -} - -func (x *ActivateRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *ActivateRequest) GetTopology() string { - if x != nil { - return x.Topology - } - return "" -} - -// Run request -type RunRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file - Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server - Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description -} - -func (x *RunRequest) Reset() { - *x = RunRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RunRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RunRequest) ProtoMessage() {} - -func (x *RunRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RunRequest.ProtoReflect.Descriptor instead. -func (*RunRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{8} -} - -func (x *RunRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *RunRequest) GetTopology() string { - if x != nil { - return x.Topology - } - return "" -} - -func (x *RunRequest) GetPlugin() string { - if x != nil { - return x.Plugin - } - return "" -} - -func (x *RunRequest) GetResources() string { - if x != nil { - return x.Resources - } - return "" -} - -// Update request -type UpdateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file -} - -func (x *UpdateRequest) Reset() { - *x = UpdateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateRequest) ProtoMessage() {} - -func (x *UpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. -func (*UpdateRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{9} -} - -func (x *UpdateRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *UpdateRequest) GetTopology() string { - if x != nil { - return x.Topology - } - return "" -} - -// Shutdown request -type ShutdownRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS -} - -func (x *ShutdownRequest) Reset() { - *x = ShutdownRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ShutdownRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ShutdownRequest) ProtoMessage() {} - -func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ShutdownRequest.ProtoReflect.Descriptor instead. -func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{10} -} - -func (x *ShutdownRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -// Key-Value property -type Property struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // Property key - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` // Property value -} - -func (x *Property) Reset() { - *x = Property{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Property) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Property) ProtoMessage() {} - -func (x *Property) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Property.ProtoReflect.Descriptor instead. -func (*Property) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{11} -} - -func (x *Property) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *Property) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -// Set properties request -type SetPropertiesRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. - Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` // List of properties to be set -} - -func (x *SetPropertiesRequest) Reset() { - *x = SetPropertiesRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SetPropertiesRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SetPropertiesRequest) ProtoMessage() {} - -func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SetPropertiesRequest.ProtoReflect.Descriptor instead. -func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{12} -} - -func (x *SetPropertiesRequest) GetPartitionid() string { - if x != nil { - return x.Partitionid - } - return "" -} - -func (x *SetPropertiesRequest) GetPath() string { - if x != nil { - return x.Path - } - return "" -} - -func (x *SetPropertiesRequest) GetProperties() []*Property { - if x != nil { - return x.Properties - } - return nil -} - -// Configure request -type ConfigureRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. -} - -func (x *ConfigureRequest) Reset() { - *x = ConfigureRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ConfigureRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ConfigureRequest) ProtoMessage() {} - -func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ConfigureRequest.ProtoReflect.Descriptor instead. -func (*ConfigureRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{13} -} - -func (x *ConfigureRequest) GetRequest() *StateRequest { - if x != nil { - return x.Request - } - return nil -} - -// Start request -type StartRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. -} - -func (x *StartRequest) Reset() { - *x = StartRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StartRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StartRequest) ProtoMessage() {} - -func (x *StartRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StartRequest.ProtoReflect.Descriptor instead. -func (*StartRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{14} -} - -func (x *StartRequest) GetRequest() *StateRequest { - if x != nil { - return x.Request - } - return nil -} - -// Stop request -type StopRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. -} - -func (x *StopRequest) Reset() { - *x = StopRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StopRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StopRequest) ProtoMessage() {} - -func (x *StopRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. -func (*StopRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{15} -} - -func (x *StopRequest) GetRequest() *StateRequest { - if x != nil { - return x.Request - } - return nil -} - -// Reset request -type ResetRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. -} - -func (x *ResetRequest) Reset() { - *x = ResetRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ResetRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ResetRequest) ProtoMessage() {} - -func (x *ResetRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. -func (*ResetRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{16} -} - -func (x *ResetRequest) GetRequest() *StateRequest { - if x != nil { - return x.Request - } - return nil -} - -// Terminate request -type TerminateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Request *StateRequest `protobuf:"bytes,1,opt,name=request,proto3" json:"request,omitempty"` // State change request. See StateRequest for details. -} - -func (x *TerminateRequest) Reset() { - *x = TerminateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_odcprotos_odc_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TerminateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TerminateRequest) ProtoMessage() {} - -func (x *TerminateRequest) ProtoReflect() protoreflect.Message { - mi := &file_odcprotos_odc_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. -func (*TerminateRequest) Descriptor() ([]byte, []int) { - return file_odcprotos_odc_proto_rawDescGZIP(), []int{17} -} - -func (x *TerminateRequest) GetRequest() *StateRequest { - if x != nil { - return x.Request - } - return nil -} - -var File_odcprotos_odc_proto protoreflect.FileDescriptor - -var file_odcprotos_odc_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x64, 0x63, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, 0x06, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x60, - 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x53, - 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x22, 0x67, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x80, 0x01, - 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, - 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x22, 0x4d, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, - 0x33, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, - 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, - 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x02, 0x32, 0xad, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, - 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, - 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, - 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, - 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, - 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x6f, 0x64, 0x63, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, - 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_odcprotos_odc_proto_rawDescOnce sync.Once - file_odcprotos_odc_proto_rawDescData = file_odcprotos_odc_proto_rawDesc -) - -func file_odcprotos_odc_proto_rawDescGZIP() []byte { - file_odcprotos_odc_proto_rawDescOnce.Do(func() { - file_odcprotos_odc_proto_rawDescData = protoimpl.X.CompressGZIP(file_odcprotos_odc_proto_rawDescData) - }) - return file_odcprotos_odc_proto_rawDescData -} - -var file_odcprotos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_odcprotos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 18) -var file_odcprotos_odc_proto_goTypes = []interface{}{ - (ReplyStatus)(0), // 0: odc.ReplyStatus - (*Error)(nil), // 1: odc.Error - (*GeneralReply)(nil), // 2: odc.GeneralReply - (*Device)(nil), // 3: odc.Device - (*StateRequest)(nil), // 4: odc.StateRequest - (*StateReply)(nil), // 5: odc.StateReply - (*InitializeRequest)(nil), // 6: odc.InitializeRequest - (*SubmitRequest)(nil), // 7: odc.SubmitRequest - (*ActivateRequest)(nil), // 8: odc.ActivateRequest - (*RunRequest)(nil), // 9: odc.RunRequest - (*UpdateRequest)(nil), // 10: odc.UpdateRequest - (*ShutdownRequest)(nil), // 11: odc.ShutdownRequest - (*Property)(nil), // 12: odc.Property - (*SetPropertiesRequest)(nil), // 13: odc.SetPropertiesRequest - (*ConfigureRequest)(nil), // 14: odc.ConfigureRequest - (*StartRequest)(nil), // 15: odc.StartRequest - (*StopRequest)(nil), // 16: odc.StopRequest - (*ResetRequest)(nil), // 17: odc.ResetRequest - (*TerminateRequest)(nil), // 18: odc.TerminateRequest -} -var file_odcprotos_odc_proto_depIdxs = []int32{ - 0, // 0: odc.GeneralReply.status:type_name -> odc.ReplyStatus - 1, // 1: odc.GeneralReply.error:type_name -> odc.Error - 2, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply - 3, // 3: odc.StateReply.devices:type_name -> odc.Device - 12, // 4: odc.SetPropertiesRequest.properties:type_name -> odc.Property - 4, // 5: odc.ConfigureRequest.request:type_name -> odc.StateRequest - 4, // 6: odc.StartRequest.request:type_name -> odc.StateRequest - 4, // 7: odc.StopRequest.request:type_name -> odc.StateRequest - 4, // 8: odc.ResetRequest.request:type_name -> odc.StateRequest - 4, // 9: odc.TerminateRequest.request:type_name -> odc.StateRequest - 6, // 10: odc.ODC.Initialize:input_type -> odc.InitializeRequest - 7, // 11: odc.ODC.Submit:input_type -> odc.SubmitRequest - 8, // 12: odc.ODC.Activate:input_type -> odc.ActivateRequest - 9, // 13: odc.ODC.Run:input_type -> odc.RunRequest - 10, // 14: odc.ODC.Update:input_type -> odc.UpdateRequest - 14, // 15: odc.ODC.Configure:input_type -> odc.ConfigureRequest - 13, // 16: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest - 4, // 17: odc.ODC.GetState:input_type -> odc.StateRequest - 15, // 18: odc.ODC.Start:input_type -> odc.StartRequest - 16, // 19: odc.ODC.Stop:input_type -> odc.StopRequest - 17, // 20: odc.ODC.Reset:input_type -> odc.ResetRequest - 18, // 21: odc.ODC.Terminate:input_type -> odc.TerminateRequest - 11, // 22: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest - 2, // 23: odc.ODC.Initialize:output_type -> odc.GeneralReply - 2, // 24: odc.ODC.Submit:output_type -> odc.GeneralReply - 2, // 25: odc.ODC.Activate:output_type -> odc.GeneralReply - 2, // 26: odc.ODC.Run:output_type -> odc.GeneralReply - 2, // 27: odc.ODC.Update:output_type -> odc.GeneralReply - 5, // 28: odc.ODC.Configure:output_type -> odc.StateReply - 2, // 29: odc.ODC.SetProperties:output_type -> odc.GeneralReply - 5, // 30: odc.ODC.GetState:output_type -> odc.StateReply - 5, // 31: odc.ODC.Start:output_type -> odc.StateReply - 5, // 32: odc.ODC.Stop:output_type -> odc.StateReply - 5, // 33: odc.ODC.Reset:output_type -> odc.StateReply - 5, // 34: odc.ODC.Terminate:output_type -> odc.StateReply - 2, // 35: odc.ODC.Shutdown:output_type -> odc.GeneralReply - 23, // [23:36] is the sub-list for method output_type - 10, // [10:23] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name -} - -func init() { file_odcprotos_odc_proto_init() } -func file_odcprotos_odc_proto_init() { - if File_odcprotos_odc_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_odcprotos_odc_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Error); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GeneralReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Device); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitializeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShutdownRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Property); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetPropertiesRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_odcprotos_odc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TerminateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_odcprotos_odc_proto_rawDesc, - NumEnums: 1, - NumMessages: 18, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_odcprotos_odc_proto_goTypes, - DependencyIndexes: file_odcprotos_odc_proto_depIdxs, - EnumInfos: file_odcprotos_odc_proto_enumTypes, - MessageInfos: file_odcprotos_odc_proto_msgTypes, - }.Build() - File_odcprotos_odc_proto = out.File - file_odcprotos_odc_proto_rawDesc = nil - file_odcprotos_odc_proto_goTypes = nil - file_odcprotos_odc_proto_depIdxs = nil -} diff --git a/odcshim/odcprotos/odc.proto b/odcshim/odcprotos/odc.proto deleted file mode 100644 index 61d63bb71..000000000 --- a/odcshim/odcprotos/odc.proto +++ /dev/null @@ -1,171 +0,0 @@ -syntax = "proto3"; - -package odc; -option go_package = "odcprotos;odc"; - -// The ODC service definition. -// For details also see https://github.com/FairRootGroup/ODC#command-mapping -service ODC { - // Creates a new DDS session or attaches to an existing DDS session. - rpc Initialize (InitializeRequest) returns (GeneralReply) {} - // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. - // Can be called multiple times in order to submit more DDS agents (allocate more resources). - rpc Submit (SubmitRequest) returns (GeneralReply) {} - // Activates a given topology. - rpc Activate (ActivateRequest) returns (GeneralReply) {} - // Run request combines Initialize, Submit and Activate into a single request. - // Run request always creates a new DDS session. - rpc Run (RunRequest) returns (GeneralReply) {} - // Updates a topology (up or down scale number of tasks or any other topology change). - // It consists of 3 commands: Reset, Activate and Configure. - // Can be called multiple times. - rpc Update (UpdateRequest) returns (GeneralReply) {} - // Transitions devices into Ready state. - rpc Configure (ConfigureRequest) returns (StateReply) {} - // Changes devices configuration. - rpc SetProperties (SetPropertiesRequest) returns (GeneralReply) {} - // Get current aggregated state of devices. - rpc GetState (StateRequest) returns (StateReply) {} - // Transition devices into Running state. - rpc Start (StartRequest) returns (StateReply) {} - // Transitions devices into Ready state. - rpc Stop (StopRequest) returns (StateReply) {} - // Transitions devices into Idle state. - rpc Reset (ResetRequest) returns (StateReply) {} - // Shuts devices down via End transition. - rpc Terminate (TerminateRequest) returns (StateReply) {} - // Shutdown DDS session. - rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} -} - -// Request status -enum ReplyStatus { - UNKNOWN = 0; // Status is unknown - SUCCESS = 1; // Request performed successfully - ERROR = 2; // Failed to perform request -} - -// General error -message Error { - string msg = 1; // Detailed error message - int32 code = 2; // Error code. - // TODO: Make error codes specific for each concrete request and/or error type. - // TODO: Add link to a documented error codes. -} - -// General reply to requests -message GeneralReply { - string msg = 1; // Detailed reply message - ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) - Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty - int32 exectime = 4; // Request execution time in ms - string partitionid = 5; // Partition ID from ECS - string sessionid = 6; // DDS session ID - string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. -} - -// Device information -// Runtime task ID and path are the same as in DDS. -// To get task details use DDS Topology API. -message Device { - uint64 id = 1; // Runtime task ID (same as in DDS) - string state = 2; // FairMQ device state as string - string path = 3; // Runtime task path (same as in DDS) -} - -// Device change/get state request -message StateRequest { - string partitionid = 1; // Partition ID from ECS - string path = 2; // Task path in the DDS topology. Can be a regular expression. - bool detailed = 3; // If true then a list of affected devices is populated in the reply. -} - -// Device change/get state reply -message StateReply { - GeneralReply reply = 1; // General reply. See GeneralReply message for details. - repeated Device devices = 2; // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. -} - -// -// Requests -// - -// Initialize request -message InitializeRequest { - string partitionid = 1; // Partition ID from ECS - string sessionid = 2; // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. -} - -// Submit request -message SubmitRequest { - string partitionid = 1; // Partition ID from ECS - string plugin = 2; // Name of the resource plugin registered in odc-server - string resources = 3; // Resource description -} - -// Activate request -message ActivateRequest { - string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file -} - -// Run request -message RunRequest { - string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file - string plugin = 3; // Name of the resource plugin registered in odc-server - string resources = 4; // Resource description -} - -// Update request -message UpdateRequest { - string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file -} - -// Shutdown request -message ShutdownRequest { - string partitionid = 1; // Partition ID from ECS -} - -// Key-Value property -message Property { - string key = 1; // Property key - string value = 2; // Property value -} - -// Set properties request -message SetPropertiesRequest { - string partitionid = 1; // Partition ID from ECS - string path = 2; // Task path in the DDS topology. Can be a regular expression. - repeated Property properties = 3; // List of properties to be set -} - -// -// FairMQ device state change requests -// - -// Configure request -message ConfigureRequest { - StateRequest request = 1; // State change request. See StateRequest for details. -} - -// Start request -message StartRequest { - StateRequest request = 1; // State change request. See StateRequest for details. -} - -// Stop request -message StopRequest { - StateRequest request = 1; // State change request. See StateRequest for details. -} - -// Reset request -message ResetRequest { - StateRequest request = 1; // State change request. See StateRequest for details. -} - -// Terminate request -message TerminateRequest { - StateRequest request = 1; // State change request. See StateRequest for details. -} diff --git a/odcshim/odcprotos/odc_grpc.pb.go b/odcshim/odcprotos/odc_grpc.pb.go deleted file mode 100644 index b5f1e0452..000000000 --- a/odcshim/odcprotos/odc_grpc.pb.go +++ /dev/null @@ -1,563 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package odc - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion7 - -// ODCClient is the client API for ODC service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type ODCClient interface { - // Creates a new DDS session or attaches to an existing DDS session. - Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. - // Can be called multiple times in order to submit more DDS agents (allocate more resources). - Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Activates a given topology. - Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Run request combines Initialize, Submit and Activate into a single request. - // Run request always creates a new DDS session. - Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Updates a topology (up or down scale number of tasks or any other topology change). - // It consists of 3 commands: Reset, Activate and Configure. - // Can be called multiple times. - Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Transitions devices into Ready state. - Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) - // Changes devices configuration. - SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) - // Get current aggregated state of devices. - GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transition devices into Running state. - Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transitions devices into Ready state. - Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) - // Transitions devices into Idle state. - Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) - // Shuts devices down via End transition. - Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) - // Shutdown DDS session. - Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) -} - -type oDCClient struct { - cc grpc.ClientConnInterface -} - -func NewODCClient(cc grpc.ClientConnInterface) ODCClient { - return &oDCClient{cc} -} - -func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { - out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { - out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// ODCServer is the server API for ODC service. -// All implementations must embed UnimplementedODCServer -// for forward compatibility -type ODCServer interface { - // Creates a new DDS session or attaches to an existing DDS session. - Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) - // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. - // Can be called multiple times in order to submit more DDS agents (allocate more resources). - Submit(context.Context, *SubmitRequest) (*GeneralReply, error) - // Activates a given topology. - Activate(context.Context, *ActivateRequest) (*GeneralReply, error) - // Run request combines Initialize, Submit and Activate into a single request. - // Run request always creates a new DDS session. - Run(context.Context, *RunRequest) (*GeneralReply, error) - // Updates a topology (up or down scale number of tasks or any other topology change). - // It consists of 3 commands: Reset, Activate and Configure. - // Can be called multiple times. - Update(context.Context, *UpdateRequest) (*GeneralReply, error) - // Transitions devices into Ready state. - Configure(context.Context, *ConfigureRequest) (*StateReply, error) - // Changes devices configuration. - SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) - // Get current aggregated state of devices. - GetState(context.Context, *StateRequest) (*StateReply, error) - // Transition devices into Running state. - Start(context.Context, *StartRequest) (*StateReply, error) - // Transitions devices into Ready state. - Stop(context.Context, *StopRequest) (*StateReply, error) - // Transitions devices into Idle state. - Reset(context.Context, *ResetRequest) (*StateReply, error) - // Shuts devices down via End transition. - Terminate(context.Context, *TerminateRequest) (*StateReply, error) - // Shutdown DDS session. - Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) - mustEmbedUnimplementedODCServer() -} - -// UnimplementedODCServer must be embedded to have forward compatible implementations. -type UnimplementedODCServer struct { -} - -func (UnimplementedODCServer) Initialize(context.Context, *InitializeRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Initialize not implemented") -} -func (UnimplementedODCServer) Submit(context.Context, *SubmitRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Submit not implemented") -} -func (UnimplementedODCServer) Activate(context.Context, *ActivateRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Activate not implemented") -} -func (UnimplementedODCServer) Run(context.Context, *RunRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Run not implemented") -} -func (UnimplementedODCServer) Update(context.Context, *UpdateRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") -} -func (UnimplementedODCServer) Configure(context.Context, *ConfigureRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Configure not implemented") -} -func (UnimplementedODCServer) SetProperties(context.Context, *SetPropertiesRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetProperties not implemented") -} -func (UnimplementedODCServer) GetState(context.Context, *StateRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (UnimplementedODCServer) Start(context.Context, *StartRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Start not implemented") -} -func (UnimplementedODCServer) Stop(context.Context, *StopRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Stop not implemented") -} -func (UnimplementedODCServer) Reset(context.Context, *ResetRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") -} -func (UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*StateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Terminate not implemented") -} -func (UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") -} -func (UnimplementedODCServer) mustEmbedUnimplementedODCServer() {} - -// UnsafeODCServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to ODCServer will -// result in compilation errors. -type UnsafeODCServer interface { - mustEmbedUnimplementedODCServer() -} - -func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) -} - -func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(InitializeRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Initialize(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Initialize", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SubmitRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Submit(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Submit", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ActivateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Activate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Activate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(RunRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Run(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Run", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Run(ctx, req.(*RunRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Update(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Update", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ConfigureRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Configure(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Configure", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetPropertiesRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).SetProperties(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/SetProperties", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).GetState(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/GetState", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StartRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Start(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Start", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Start(ctx, req.(*StartRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(StopRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Stop(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Stop", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ResetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Reset(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Reset", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TerminateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Terminate(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Terminate", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ShutdownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ODCServer).Shutdown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/odc.ODC/Shutdown", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _ODC_serviceDesc = grpc.ServiceDesc{ - ServiceName: "odc.ODC", - HandlerType: (*ODCServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Initialize", - Handler: _ODC_Initialize_Handler, - }, - { - MethodName: "Submit", - Handler: _ODC_Submit_Handler, - }, - { - MethodName: "Activate", - Handler: _ODC_Activate_Handler, - }, - { - MethodName: "Run", - Handler: _ODC_Run_Handler, - }, - { - MethodName: "Update", - Handler: _ODC_Update_Handler, - }, - { - MethodName: "Configure", - Handler: _ODC_Configure_Handler, - }, - { - MethodName: "SetProperties", - Handler: _ODC_SetProperties_Handler, - }, - { - MethodName: "GetState", - Handler: _ODC_GetState_Handler, - }, - { - MethodName: "Start", - Handler: _ODC_Start_Handler, - }, - { - MethodName: "Stop", - Handler: _ODC_Stop_Handler, - }, - { - MethodName: "Reset", - Handler: _ODC_Reset_Handler, - }, - { - MethodName: "Terminate", - Handler: _ODC_Terminate_Handler, - }, - { - MethodName: "Shutdown", - Handler: _ODC_Shutdown_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "odcprotos/odc.proto", -} diff --git a/odcshim/odcshim.go b/odcshim/odcshim.go deleted file mode 100644 index aa8e7e2e1..000000000 --- a/odcshim/odcshim.go +++ /dev/null @@ -1,96 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package odcshim - -import ( - "fmt" - "net" - "os" - - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/odcshim/occserver" - "github.com/sirupsen/logrus" - "github.com/spf13/pflag" - "github.com/spf13/viper" -) - -//go:generate protoc -I ../occ --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/occ.proto -//go:generate protoc -I ../odcshim --go_out=. --go-grpc_out=. odcprotos/odc.proto - -var log = logger.New(logrus.StandardLogger(), "o2-aliecs-odc-shim") - - -func setDefaults() error { - viper.SetDefault("odcPort", 50051) - viper.SetDefault("odcHost", "127.0.0.1") - viper.SetDefault("verbose", false) - return nil -} - -func setFlags() error { - pflag.String("control-port", viper.GetString("control-port"), "OCC control port") - pflag.Int("odcPort", viper.GetInt("odcPort"), "Remote ODC server port") - pflag.String("odcHost", viper.GetString("odcHost"), "Remote ODC server hostname") - pflag.BoolP("verbose", "v", viper.GetBool("verbose"), "Verbose logging") - - pflag.Parse() - return viper.BindPFlags(pflag.CommandLine) -} - -func Run() (err error) { - if err = setDefaults(); err != nil { - return - } - if err = setFlags(); err != nil { - return - } - - host := viper.GetString("odcHost") - port := viper.GetInt("odcPort") - occPort := viper.GetString("control-port") - if len(occPort) == 0 { - occPort = os.Getenv("OCC_CONTROL_PORT") - } - topology := os.Getenv("ODC_TOPOLOGY") - - server := occserver.NewServer(host, port, topology) - if server == nil { - return fmt.Errorf("cannot start OCC-ODC bridge to %s:%d", host, port) - } - - var lis net.Listener - lis, err = net.Listen("tcp", fmt.Sprintf(":%s", occPort)) - if err != nil { - log.WithField("error", err). - WithField("port", occPort). - Fatal("net.Listener failed to listen") - return - } - if err = server.Serve(lis); err != nil { - log.WithField("error", err).Fatal("GRPC server failed to serve") - } - - return -} diff --git a/odcshim/protos/occ.pb.go b/odcshim/protos/occ.pb.go deleted file mode 100644 index a73acb5b6..000000000 --- a/odcshim/protos/occ.pb.go +++ /dev/null @@ -1,982 +0,0 @@ -// -// === This file is part of ALICE O² === -// -// Copyright 2018 CERN and copyright holders of ALICE O². -// Author: Teo Mrnjavac -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// In applying this license CERN does not waive the privileges and -// immunities granted to it by virtue of its status as an -// Intergovernmental Organization or submit itself to any jurisdiction. - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.25.0 -// protoc v3.15.7 -// source: protos/occ.proto - -package pb - -import ( - proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -type StateChangeTrigger int32 - -const ( - StateChangeTrigger_EXECUTOR StateChangeTrigger = 0 - StateChangeTrigger_DEVICE_INTENTIONAL StateChangeTrigger = 1 - StateChangeTrigger_DEVICE_ERROR StateChangeTrigger = 2 -) - -// Enum value maps for StateChangeTrigger. -var ( - StateChangeTrigger_name = map[int32]string{ - 0: "EXECUTOR", - 1: "DEVICE_INTENTIONAL", - 2: "DEVICE_ERROR", - } - StateChangeTrigger_value = map[string]int32{ - "EXECUTOR": 0, - "DEVICE_INTENTIONAL": 1, - "DEVICE_ERROR": 2, - } -) - -func (x StateChangeTrigger) Enum() *StateChangeTrigger { - p := new(StateChangeTrigger) - *p = x - return p -} - -func (x StateChangeTrigger) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StateChangeTrigger) Descriptor() protoreflect.EnumDescriptor { - return file_protos_occ_proto_enumTypes[0].Descriptor() -} - -func (StateChangeTrigger) Type() protoreflect.EnumType { - return &file_protos_occ_proto_enumTypes[0] -} - -func (x StateChangeTrigger) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StateChangeTrigger.Descriptor instead. -func (StateChangeTrigger) EnumDescriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{0} -} - -type StateType int32 - -const ( - StateType_STATE_STABLE StateType = 0 - StateType_STATE_INTERMEDIATE StateType = 1 -) - -// Enum value maps for StateType. -var ( - StateType_name = map[int32]string{ - 0: "STATE_STABLE", - 1: "STATE_INTERMEDIATE", - } - StateType_value = map[string]int32{ - "STATE_STABLE": 0, - "STATE_INTERMEDIATE": 1, - } -) - -func (x StateType) Enum() *StateType { - p := new(StateType) - *p = x - return p -} - -func (x StateType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StateType) Descriptor() protoreflect.EnumDescriptor { - return file_protos_occ_proto_enumTypes[1].Descriptor() -} - -func (StateType) Type() protoreflect.EnumType { - return &file_protos_occ_proto_enumTypes[1] -} - -func (x StateType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StateType.Descriptor instead. -func (StateType) EnumDescriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{1} -} - -type DeviceEventType int32 - -const ( - DeviceEventType_NULL_DEVICE_EVENT DeviceEventType = 0 - DeviceEventType_END_OF_STREAM DeviceEventType = 1 - DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 -) - -// Enum value maps for DeviceEventType. -var ( - DeviceEventType_name = map[int32]string{ - 0: "NULL_DEVICE_EVENT", - 1: "END_OF_STREAM", - 2: "BASIC_TASK_TERMINATED", - } - DeviceEventType_value = map[string]int32{ - "NULL_DEVICE_EVENT": 0, - "END_OF_STREAM": 1, - "BASIC_TASK_TERMINATED": 2, - } -) - -func (x DeviceEventType) Enum() *DeviceEventType { - p := new(DeviceEventType) - *p = x - return p -} - -func (x DeviceEventType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (DeviceEventType) Descriptor() protoreflect.EnumDescriptor { - return file_protos_occ_proto_enumTypes[2].Descriptor() -} - -func (DeviceEventType) Type() protoreflect.EnumType { - return &file_protos_occ_proto_enumTypes[2] -} - -func (x DeviceEventType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use DeviceEventType.Descriptor instead. -func (DeviceEventType) EnumDescriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{2} -} - -type StateStreamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StateStreamRequest) Reset() { - *x = StateStreamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateStreamRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateStreamRequest) ProtoMessage() {} - -func (x *StateStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateStreamRequest.ProtoReflect.Descriptor instead. -func (*StateStreamRequest) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{0} -} - -type StateStreamReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type StateType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.StateType" json:"type,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` -} - -func (x *StateStreamReply) Reset() { - *x = StateStreamReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StateStreamReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StateStreamReply) ProtoMessage() {} - -func (x *StateStreamReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StateStreamReply.ProtoReflect.Descriptor instead. -func (*StateStreamReply) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{1} -} - -func (x *StateStreamReply) GetType() StateType { - if x != nil { - return x.Type - } - return StateType_STATE_STABLE -} - -func (x *StateStreamReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -type EventStreamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *EventStreamRequest) Reset() { - *x = EventStreamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EventStreamRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EventStreamRequest) ProtoMessage() {} - -func (x *EventStreamRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EventStreamRequest.ProtoReflect.Descriptor instead. -func (*EventStreamRequest) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{2} -} - -type DeviceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Type DeviceEventType `protobuf:"varint,1,opt,name=type,proto3,enum=occ_pb.DeviceEventType" json:"type,omitempty"` -} - -func (x *DeviceEvent) Reset() { - *x = DeviceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *DeviceEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*DeviceEvent) ProtoMessage() {} - -func (x *DeviceEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use DeviceEvent.ProtoReflect.Descriptor instead. -func (*DeviceEvent) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{3} -} - -func (x *DeviceEvent) GetType() DeviceEventType { - if x != nil { - return x.Type - } - return DeviceEventType_NULL_DEVICE_EVENT -} - -type EventStreamReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Event *DeviceEvent `protobuf:"bytes,1,opt,name=event,proto3" json:"event,omitempty"` -} - -func (x *EventStreamReply) Reset() { - *x = EventStreamReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EventStreamReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EventStreamReply) ProtoMessage() {} - -func (x *EventStreamReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EventStreamReply.ProtoReflect.Descriptor instead. -func (*EventStreamReply) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{4} -} - -func (x *EventStreamReply) GetEvent() *DeviceEvent { - if x != nil { - return x.Event - } - return nil -} - -type GetStateRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *GetStateRequest) Reset() { - *x = GetStateRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetStateRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetStateRequest) ProtoMessage() {} - -func (x *GetStateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetStateRequest.ProtoReflect.Descriptor instead. -func (*GetStateRequest) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{5} -} - -type GetStateReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - Pid int32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"` -} - -func (x *GetStateReply) Reset() { - *x = GetStateReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *GetStateReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*GetStateReply) ProtoMessage() {} - -func (x *GetStateReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use GetStateReply.ProtoReflect.Descriptor instead. -func (*GetStateReply) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{6} -} - -func (x *GetStateReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *GetStateReply) GetPid() int32 { - if x != nil { - return x.Pid - } - return 0 -} - -type ConfigEntry struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` - Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` -} - -func (x *ConfigEntry) Reset() { - *x = ConfigEntry{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *ConfigEntry) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*ConfigEntry) ProtoMessage() {} - -func (x *ConfigEntry) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use ConfigEntry.ProtoReflect.Descriptor instead. -func (*ConfigEntry) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{7} -} - -func (x *ConfigEntry) GetKey() string { - if x != nil { - return x.Key - } - return "" -} - -func (x *ConfigEntry) GetValue() string { - if x != nil { - return x.Value - } - return "" -} - -type TransitionRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SrcState string `protobuf:"bytes,1,opt,name=srcState,proto3" json:"srcState,omitempty"` - TransitionEvent string `protobuf:"bytes,2,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Arguments []*ConfigEntry `protobuf:"bytes,3,rep,name=arguments,proto3" json:"arguments,omitempty"` -} - -func (x *TransitionRequest) Reset() { - *x = TransitionRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransitionRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransitionRequest) ProtoMessage() {} - -func (x *TransitionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransitionRequest.ProtoReflect.Descriptor instead. -func (*TransitionRequest) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{8} -} - -func (x *TransitionRequest) GetSrcState() string { - if x != nil { - return x.SrcState - } - return "" -} - -func (x *TransitionRequest) GetTransitionEvent() string { - if x != nil { - return x.TransitionEvent - } - return "" -} - -func (x *TransitionRequest) GetArguments() []*ConfigEntry { - if x != nil { - return x.Arguments - } - return nil -} - -type TransitionReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Trigger StateChangeTrigger `protobuf:"varint,1,opt,name=trigger,proto3,enum=occ_pb.StateChangeTrigger" json:"trigger,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - TransitionEvent string `protobuf:"bytes,3,opt,name=transitionEvent,proto3" json:"transitionEvent,omitempty"` - Ok bool `protobuf:"varint,4,opt,name=ok,proto3" json:"ok,omitempty"` -} - -func (x *TransitionReply) Reset() { - *x = TransitionReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_occ_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TransitionReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TransitionReply) ProtoMessage() {} - -func (x *TransitionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_occ_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TransitionReply.ProtoReflect.Descriptor instead. -func (*TransitionReply) Descriptor() ([]byte, []int) { - return file_protos_occ_proto_rawDescGZIP(), []int{9} -} - -func (x *TransitionReply) GetTrigger() StateChangeTrigger { - if x != nil { - return x.Trigger - } - return StateChangeTrigger_EXECUTOR -} - -func (x *TransitionReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *TransitionReply) GetTransitionEvent() string { - if x != nil { - return x.TransitionEvent - } - return "" -} - -func (x *TransitionReply) GetOk() bool { - if x != nil { - return x.Ok - } - return false -} - -var File_protos_occ_proto protoreflect.FileDescriptor - -var file_protos_occ_proto_rawDesc = []byte{ - 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x63, 0x63, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x06, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x4f, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x14, 0x0a, 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3d, 0x0a, 0x10, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x37, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x70, 0x69, 0x64, 0x22, 0x35, - 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, - 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, - 0x72, 0x63, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x31, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x97, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x02, 0x6f, 0x6b, 0x2a, 0x4c, - 0x0a, 0x12, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x4f, 0x52, - 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x54, - 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x09, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, - 0x45, 0x10, 0x01, 0x2a, 0x56, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, - 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x11, 0x0a, - 0x0d, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, - 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x54, - 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0x99, 0x02, 0x0a, 0x03, - 0x4f, 0x63, 0x63, 0x12, 0x47, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x0b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, - 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6f, 0x63, 0x63, - 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x29, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_protos_occ_proto_rawDescOnce sync.Once - file_protos_occ_proto_rawDescData = file_protos_occ_proto_rawDesc -) - -func file_protos_occ_proto_rawDescGZIP() []byte { - file_protos_occ_proto_rawDescOnce.Do(func() { - file_protos_occ_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_occ_proto_rawDescData) - }) - return file_protos_occ_proto_rawDescData -} - -var file_protos_occ_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_occ_proto_msgTypes = make([]protoimpl.MessageInfo, 10) -var file_protos_occ_proto_goTypes = []interface{}{ - (StateChangeTrigger)(0), // 0: occ_pb.StateChangeTrigger - (StateType)(0), // 1: occ_pb.StateType - (DeviceEventType)(0), // 2: occ_pb.DeviceEventType - (*StateStreamRequest)(nil), // 3: occ_pb.StateStreamRequest - (*StateStreamReply)(nil), // 4: occ_pb.StateStreamReply - (*EventStreamRequest)(nil), // 5: occ_pb.EventStreamRequest - (*DeviceEvent)(nil), // 6: occ_pb.DeviceEvent - (*EventStreamReply)(nil), // 7: occ_pb.EventStreamReply - (*GetStateRequest)(nil), // 8: occ_pb.GetStateRequest - (*GetStateReply)(nil), // 9: occ_pb.GetStateReply - (*ConfigEntry)(nil), // 10: occ_pb.ConfigEntry - (*TransitionRequest)(nil), // 11: occ_pb.TransitionRequest - (*TransitionReply)(nil), // 12: occ_pb.TransitionReply -} -var file_protos_occ_proto_depIdxs = []int32{ - 1, // 0: occ_pb.StateStreamReply.type:type_name -> occ_pb.StateType - 2, // 1: occ_pb.DeviceEvent.type:type_name -> occ_pb.DeviceEventType - 6, // 2: occ_pb.EventStreamReply.event:type_name -> occ_pb.DeviceEvent - 10, // 3: occ_pb.TransitionRequest.arguments:type_name -> occ_pb.ConfigEntry - 0, // 4: occ_pb.TransitionReply.trigger:type_name -> occ_pb.StateChangeTrigger - 5, // 5: occ_pb.Occ.EventStream:input_type -> occ_pb.EventStreamRequest - 3, // 6: occ_pb.Occ.StateStream:input_type -> occ_pb.StateStreamRequest - 8, // 7: occ_pb.Occ.GetState:input_type -> occ_pb.GetStateRequest - 11, // 8: occ_pb.Occ.Transition:input_type -> occ_pb.TransitionRequest - 7, // 9: occ_pb.Occ.EventStream:output_type -> occ_pb.EventStreamReply - 4, // 10: occ_pb.Occ.StateStream:output_type -> occ_pb.StateStreamReply - 9, // 11: occ_pb.Occ.GetState:output_type -> occ_pb.GetStateReply - 12, // 12: occ_pb.Occ.Transition:output_type -> occ_pb.TransitionReply - 9, // [9:13] is the sub-list for method output_type - 5, // [5:9] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name -} - -func init() { file_protos_occ_proto_init() } -func file_protos_occ_proto_init() { - if File_protos_occ_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_protos_occ_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateStreamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateStreamReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EventStreamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeviceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EventStreamReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStateRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStateReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigEntry); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransitionRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_occ_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TransitionReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_protos_occ_proto_rawDesc, - NumEnums: 3, - NumMessages: 10, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_protos_occ_proto_goTypes, - DependencyIndexes: file_protos_occ_proto_depIdxs, - EnumInfos: file_protos_occ_proto_enumTypes, - MessageInfos: file_protos_occ_proto_msgTypes, - }.Build() - File_protos_occ_proto = out.File - file_protos_occ_proto_rawDesc = nil - file_protos_occ_proto_goTypes = nil - file_protos_occ_proto_depIdxs = nil -} diff --git a/odcshim/protos/occ_grpc.pb.go b/odcshim/protos/occ_grpc.pb.go deleted file mode 100644 index 09d8d584b..000000000 --- a/odcshim/protos/occ_grpc.pb.go +++ /dev/null @@ -1,262 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package pb - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion7 - -// OccClient is the client API for Occ service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type OccClient interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) - StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) - GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) - Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) -} - -type occClient struct { - cc grpc.ClientConnInterface -} - -func NewOccClient(cc grpc.ClientConnInterface) OccClient { - return &occClient{cc} -} - -func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) - if err != nil { - return nil, err - } - x := &occEventStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_EventStreamClient interface { - Recv() (*EventStreamReply, error) - grpc.ClientStream -} - -type occEventStreamClient struct { - grpc.ClientStream -} - -func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { - m := new(EventStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) - if err != nil { - return nil, err - } - x := &occStateStreamClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Occ_StateStreamClient interface { - Recv() (*StateStreamReply, error) - grpc.ClientStream -} - -type occStateStreamClient struct { - grpc.ClientStream -} - -func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { - m := new(StateStreamReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - -func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { - out := new(GetStateReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { - out := new(TransitionReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// OccServer is the server API for Occ service. -// All implementations should embed UnimplementedOccServer -// for forward compatibility -type OccServer interface { - // We have to have a notification stream because the FairMQDevice might transition - // on its own for whatever reason. - EventStream(*EventStreamRequest, Occ_EventStreamServer) error - StateStream(*StateStreamRequest, Occ_StateStreamServer) error - GetState(context.Context, *GetStateRequest) (*GetStateReply, error) - Transition(context.Context, *TransitionRequest) (*TransitionReply, error) -} - -// UnimplementedOccServer should be embedded to have forward compatible implementations. -type UnimplementedOccServer struct { -} - -func (UnimplementedOccServer) EventStream(*EventStreamRequest, Occ_EventStreamServer) error { - return status.Errorf(codes.Unimplemented, "method EventStream not implemented") -} -func (UnimplementedOccServer) StateStream(*StateStreamRequest, Occ_StateStreamServer) error { - return status.Errorf(codes.Unimplemented, "method StateStream not implemented") -} -func (UnimplementedOccServer) GetState(context.Context, *GetStateRequest) (*GetStateReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetState not implemented") -} -func (UnimplementedOccServer) Transition(context.Context, *TransitionRequest) (*TransitionReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Transition not implemented") -} - -// UnsafeOccServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to OccServer will -// result in compilation errors. -type UnsafeOccServer interface { - mustEmbedUnimplementedOccServer() -} - -func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) -} - -func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(EventStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).EventStream(m, &occEventStreamServer{stream}) -} - -type Occ_EventStreamServer interface { - Send(*EventStreamReply) error - grpc.ServerStream -} - -type occEventStreamServer struct { - grpc.ServerStream -} - -func (x *occEventStreamServer) Send(m *EventStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_StateStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StateStreamRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(OccServer).StateStream(m, &occStateStreamServer{stream}) -} - -type Occ_StateStreamServer interface { - Send(*StateStreamReply) error - grpc.ServerStream -} - -type occStateStreamServer struct { - grpc.ServerStream -} - -func (x *occStateStreamServer) Send(m *StateStreamReply) error { - return x.ServerStream.SendMsg(m) -} - -func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetStateRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).GetState(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/GetState", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TransitionRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(OccServer).Transition(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/occ_pb.Occ/Transition", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Occ_serviceDesc = grpc.ServiceDesc{ - ServiceName: "occ_pb.Occ", - HandlerType: (*OccServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetState", - Handler: _Occ_GetState_Handler, - }, - { - MethodName: "Transition", - Handler: _Occ_Transition_Handler, - }, - }, - Streams: []grpc.StreamDesc{ - { - StreamName: "EventStream", - Handler: _Occ_EventStream_Handler, - ServerStreams: true, - }, - { - StreamName: "StateStream", - Handler: _Occ_StateStream_Handler, - ServerStreams: true, - }, - }, - Metadata: "protos/occ.proto", -} From 6d025e1b574fe1ca964a11a15e6d90d378a6e7f3 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Mon, 14 Jun 2021 13:09:34 +0200 Subject: [PATCH 0927/2352] [apricot] Change ports --- apricot/README.md | 2 +- apricot/config.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apricot/README.md b/apricot/README.md index 077206ebe..243b580d1 100644 --- a/apricot/README.md +++ b/apricot/README.md @@ -7,7 +7,7 @@ The `o2-apricot` binary implements a centralized configuration (micro)service fo ``` Usage of bin/o2-apricot: --backendUri string URI of the Consul server or YAML configuration file (default "consul://127.0.0.1:8500") - --listenPort int Port of apricot server (default 47101) + --listenPort int Port of apricot server (default 32101) --verbose Verbose logging ``` diff --git a/apricot/config.go b/apricot/config.go index 8f741cb39..b8364c16f 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -38,8 +38,8 @@ import ( func setDefaults() error { viper.Set("component", "apricot") - viper.SetDefault("listenPort", 47101) - viper.SetDefault("httpListenPort", 47188) + viper.SetDefault("listenPort", 32101) + viper.SetDefault("httpListenPort", 32188) viper.SetDefault("backendUri", "consul://127.0.0.1:8500") viper.SetDefault("runtimeBasePath", "o2/runtime") viper.SetDefault("workingDir", "/var/lib/o2/apricot") From 137c34f2ab3fec24f5e1bcb48657779c87772de4 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Mon, 14 Jun 2021 13:10:58 +0200 Subject: [PATCH 0928/2352] [coconut] Change aliecs ports --- coconut/README.md | 10 +++++----- coconut/cmd/root.go | 4 ++-- coconut/doc/coconut.md | 4 ++-- coconut/doc/coconut_about.md | 4 ++-- coconut/doc/coconut_configuration.md | 4 ++-- coconut/doc/coconut_configuration_dump.md | 4 ++-- coconut/doc/coconut_configuration_history.md | 4 ++-- coconut/doc/coconut_configuration_import.md | 4 ++-- coconut/doc/coconut_configuration_list.md | 4 ++-- coconut/doc/coconut_configuration_show.md | 4 ++-- coconut/doc/coconut_environment.md | 4 ++-- coconut/doc/coconut_environment_control.md | 4 ++-- coconut/doc/coconut_environment_create.md | 4 ++-- coconut/doc/coconut_environment_destroy.md | 4 ++-- coconut/doc/coconut_environment_list.md | 4 ++-- coconut/doc/coconut_environment_show.md | 4 ++-- coconut/doc/coconut_info.md | 4 ++-- coconut/doc/coconut_repository.md | 4 ++-- coconut/doc/coconut_repository_add.md | 4 ++-- coconut/doc/coconut_repository_default-revision.md | 4 ++-- coconut/doc/coconut_repository_default.md | 4 ++-- coconut/doc/coconut_repository_list.md | 4 ++-- coconut/doc/coconut_repository_refresh.md | 4 ++-- coconut/doc/coconut_repository_remove.md | 4 ++-- coconut/doc/coconut_role.md | 4 ++-- coconut/doc/coconut_role_query.md | 4 ++-- coconut/doc/coconut_task.md | 4 ++-- coconut/doc/coconut_task_clean.md | 4 ++-- coconut/doc/coconut_task_list.md | 4 ++-- coconut/doc/coconut_template.md | 4 ++-- coconut/doc/coconut_template_list.md | 8 +++++--- 31 files changed, 68 insertions(+), 66 deletions(-) diff --git a/coconut/README.md b/coconut/README.md index eedbe4e8d..8116105cf 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -5,7 +5,7 @@ The O² **co**ntrol and **con**figuration **ut**ility is a command line program ## Configuration file `coconut` can be used with no config file, and by default it will look for a running AliECS -core at `127.0.0.1:47102`. +core at `127.0.0.1:32102`. On `aliBuild` it is provided by the `coconut` recipe (RPM `alisw-coconut`, `alienv`/`aliswmod enter coconut`). Once built, it is a portable, static executable that can safely be copied to another Linux machine and executed. @@ -20,7 +20,7 @@ To override this, you may create a file `~/.config/coconut/settings.yaml` and fi ```yaml --- -endpoint: "127.0.0.1:47102" # host:port of AliECS core +endpoint: "127.0.0.1:32102" # host:port of AliECS core config_endpoint: "consul://some-host-with-consul:8500" # or: "file:///path/to/o2control-core/config.yaml", AliECS configuration endpoint log: level: info # values: panic fatal error warning info debug @@ -53,7 +53,7 @@ Flags: Global Flags: --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -64,7 +64,7 @@ return some details on the AliECS core: ``` $ coconut info instance name: AliECS instance -endpoint: 127.0.0.1:47102 +endpoint: 127.0.0.1:32102 core version: AliECS 0.16.0 revision 977208f framework id: fde7f033-0aaf-4d02-9f4e-9ee5ee5824e3-0000 environments count: 0 @@ -117,7 +117,7 @@ Flags: Global Flags: --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/cmd/root.go b/coconut/cmd/root.go index 2e853c4a1..55f68a68d 100644 --- a/coconut/cmd/root.go +++ b/coconut/cmd/root.go @@ -80,7 +80,7 @@ func init() { // Cobra supports persistent flags, which, if defined here, // will be global for your application. rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) - rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:47102", product.PRETTY_SHORTNAME + " core endpoint as HOST:PORT") + rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:32102", product.PRETTY_SHORTNAME + " core endpoint as HOST:PORT") rootCmd.PersistentFlags().String("config_endpoint", "consul://127.0.0.1:8500", "configuration endpoint used by AliECS core as PROTO://HOST:PORT") rootCmd.PersistentFlags().BoolP("verbose", "v", false, "show verbose output for debug purposes") rootCmd.PersistentFlags().Bool("nospinner", false, "disable animations in output") @@ -98,7 +98,7 @@ func init() { // initConfig reads in config file and ENV variables if set. func initConfig() { viper.SetDefault("log.level", "info") - viper.SetDefault("endpoint", "127.0.0.1:47102") + viper.SetDefault("endpoint", "127.0.0.1:32102") viper.SetDefault("config_endpoint", "127.0.0.1:8500") viper.SetDefault("verbose", false) viper.SetDefault("nospinner", false) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 21b98c156..458886d81 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -14,7 +14,7 @@ For more information on the available commands, see the individual documentation ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") -h, --help help for coconut --nospinner disable animations in output -v, --verbose show verbose output for debug purposes @@ -31,4 +31,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index f1be99336..b7ebd46c5 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -21,7 +21,7 @@ coconut about [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 8a949876b..35ba31793 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -18,7 +18,7 @@ configuration store. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +32,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 0df3e749a..bacfa9990 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -26,7 +26,7 @@ coconut configuration dump [key] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -35,4 +35,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index feedd2179..eca60db8d 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -32,7 +32,7 @@ coconut conf history /// ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -41,4 +41,4 @@ coconut conf history /// * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index 84c3ce226..7a3a6400a 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -42,7 +42,7 @@ coconut conf import --no-versioning --new-compon ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -51,4 +51,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 9582e803a..63006ea7c 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -32,7 +32,7 @@ coconut conf list -t ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -41,4 +41,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 6b70afeb0..8452ed8ca 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -40,7 +40,7 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -49,4 +49,4 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index b4b5f6c85..78af30e82 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -38,7 +38,7 @@ For more information on the behavior of coconut environments, see the subcommand ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -52,4 +52,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index acf9a0d10..860620b69 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -31,7 +31,7 @@ coconut environment control [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -40,4 +40,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index eef6ea1ea..a8f24b0e9 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -38,7 +38,7 @@ coconut environment create [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -47,4 +47,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 3bb96bc4b..4d7804f0c 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -28,7 +28,7 @@ coconut environment destroy [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -37,4 +37,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 3bd7036d6..8f1d7e64c 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -22,7 +22,7 @@ coconut environment list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 9aad58220..ac42fd55f 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -24,7 +24,7 @@ coconut environment show [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -33,4 +33,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index d7a0ed5dd..6aedcb473 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -22,7 +22,7 @@ coconut info [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 03fa33d1d..06059b186 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -42,7 +42,7 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -57,4 +57,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index a6a3dbcc1..a4964129a 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -28,7 +28,7 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -37,4 +37,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index 19e8dc0b7..d3d28cff5 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -28,7 +28,7 @@ coconut repository default-revision [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -37,4 +37,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 5debdf61a..d6e4208bf 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -21,7 +21,7 @@ coconut repository default [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 9bbca1480..4c884c79b 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -21,7 +21,7 @@ coconut repository list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index e924a14a4..7dffd58f3 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -21,7 +21,7 @@ coconut repository refresh [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 6b5dbe746..84797decb 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -21,7 +21,7 @@ coconut repository remove [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index d56c3ef9b..bd72b8d7b 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -18,7 +18,7 @@ display information on active roles. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -28,4 +28,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index a74261603..80007fd57 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -21,7 +21,7 @@ coconut role query [environment id] [query path] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 4256d3c8d..18ea6230a 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -18,7 +18,7 @@ manage active tasks. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +29,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index ab495a933..78daea9af 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -23,7 +23,7 @@ coconut task clean [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +32,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index e3da46d06..d8ca802ca 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -22,7 +22,7 @@ coconut task list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 58d00e794..083a36245 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -18,7 +18,7 @@ display information on available workflow templates. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -28,4 +28,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index e255755e7..e08016b90 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -8,7 +8,7 @@ The template list command shows a list of available workflow templates. These workflow templates can then be loaded to create an environment. `coconut templ list` can be called with -1) a combination of the `--repo` , `--revision` , `--all-branches` , `--all-tags`flags, or with +1) a combination of the `--repo` , `--revision` , `--all-branches` , `--all-tags` , `--all-workflows` flags, or with 2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing. ``` @@ -19,6 +19,7 @@ coconut template list [flags] ``` * `coconut templ list` lists templates from the HEAD of master for all git repositories + * `coconut templ list --all-workflows` lists all templates (including non-public ones) from the HEAD of master for all git repositories * `coconut templ list '*AliceO2Group*'` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* * `coconut templ list '*@v*'` lists templates coming from revisions matching the `v*`pattern for all git repositories * `coconut templ list --repository='*AliceO2Group*'` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* @@ -34,6 +35,7 @@ coconut template list [flags] ``` -b, --all-branches list templates from all branches -t, --all-tags list templates from all tags + -a, --all-workflows list all templates, even non-public ones -h, --help help for list -r, --repository string repositories to list templates from -i, --revision string revisions (branches/tags) to list templates from @@ -44,7 +46,7 @@ coconut template list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:47102") + --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -53,4 +55,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 8-Feb-2021 +###### Auto generated by spf13/cobra on 14-Jun-2021 From 2343d59722fb48ff6c5d31a49f9562dac609291a Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Mon, 14 Jun 2021 13:14:00 +0200 Subject: [PATCH 0929/2352] [core] Change default ports --- core/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index e54b6f403..2184f41ae 100644 --- a/core/config.go +++ b/core/config.go @@ -53,7 +53,7 @@ func setDefaults() error { exeDir := filepath.Dir(exe) viper.Set("component", "core") - viper.SetDefault("controlPort", 47102) + viper.SetDefault("controlPort", 32102) viper.SetDefault("coreConfigurationUri", "") viper.SetDefault("consulBasePath", "o2/components/aliecs/ANY/any") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") @@ -94,7 +94,7 @@ func setDefaults() error { viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) viper.SetDefault("dumpWorkflows", false) - viper.SetDefault("configServiceUri", "apricot://127.0.0.1:47101") + viper.SetDefault("configServiceUri", "apricot://127.0.0.1:32101") viper.SetDefault("bookkeepingBaseUri", "http://127.0.0.1:4000") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) From 494a50af726f5f23ef8008d44a71d430272881c4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Jun 2021 11:59:33 +0200 Subject: [PATCH 0930/2352] [build] Regenerate protofiles --- apricot/protos/apricot.pb.go | 2 +- apricot/protos/apricot_grpc.pb.go | 8 ++++++-- coconut/protos/o2control.pb.go | 2 +- core/integration/dcs/protos/dcs.pb.go | 2 +- core/integration/dcs/protos/dcs_grpc.pb.go | 16 ++++++++++------ core/integration/ddsched/protos/ddsched.pb.go | 2 +- .../ddsched/protos/ddsched_grpc.pb.go | 8 ++++++-- core/integration/odc/protos/odc.pb.go | 2 +- core/integration/odc/protos/odc_grpc.pb.go | 8 ++++++-- core/protos/o2control.pb.go | 2 +- executor/protos/occ.pb.go | 2 +- executor/protos/occ_grpc.pb.go | 12 ++++++++---- 12 files changed, 43 insertions(+), 23 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index ea2f1957f..763e29b2c 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.15.8 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 99e6caad4..e9f7706fc 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ApricotClient is the client API for Apricot service. @@ -256,7 +257,7 @@ type UnsafeApricotServer interface { } func RegisterApricotServer(s grpc.ServiceRegistrar, srv ApricotServer) { - s.RegisterService(&_Apricot_serviceDesc, srv) + s.RegisterService(&Apricot_ServiceDesc, srv) } func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -529,7 +530,10 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } -var _Apricot_serviceDesc = grpc.ServiceDesc{ +// Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Apricot_ServiceDesc = grpc.ServiceDesc{ ServiceName: "apricot.Apricot", HandlerType: (*ApricotServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6a835c79a..53f22d1a4 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.15.8 // source: protos/o2control.proto package pb diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 7eea3c871..87a73d56c 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.15.8 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index c173927c6..d27cf4db1 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ConfiguratorClient is the client API for Configurator service. @@ -32,7 +33,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) if err != nil { return nil, err } @@ -64,7 +65,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -96,7 +97,7 @@ func (x *configuratorStartOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -128,7 +129,7 @@ func (x *configuratorEndOfRunClient) Recv() (*Event, error) { } func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &_Configurator_serviceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) if err != nil { return nil, err } @@ -194,7 +195,7 @@ type UnsafeConfiguratorServer interface { } func RegisterConfiguratorServer(s grpc.ServiceRegistrar, srv ConfiguratorServer) { - s.RegisterService(&_Configurator_serviceDesc, srv) + s.RegisterService(&Configurator_ServiceDesc, srv) } func _Configurator_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -281,7 +282,10 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { return x.ServerStream.SendMsg(m) } -var _Configurator_serviceDesc = grpc.ServiceDesc{ +// Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Configurator_ServiceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), Methods: []grpc.MethodDesc{}, diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index d9713a711..cf7559f07 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.15.8 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index bcf8b89a7..0e2419bfb 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // DataDistributionControlClient is the client API for DataDistributionControl service. @@ -90,7 +91,7 @@ type UnsafeDataDistributionControlServer interface { } func RegisterDataDistributionControlServer(s grpc.ServiceRegistrar, srv DataDistributionControlServer) { - s.RegisterService(&_DataDistributionControl_serviceDesc, srv) + s.RegisterService(&DataDistributionControl_ServiceDesc, srv) } func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -147,7 +148,10 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte return interceptor(ctx, in, info, handler) } -var _DataDistributionControl_serviceDesc = grpc.ServiceDesc{ +// DataDistributionControl_ServiceDesc is the grpc.ServiceDesc for DataDistributionControl service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var DataDistributionControl_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2.DataDistribution.Control.DataDistributionControl", HandlerType: (*DataDistributionControlServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index ce537dd25..4d84b4a79 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.15.8 // source: protos/odc.proto package odc diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 045ec3bc8..1bcc9baa5 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // ODCClient is the client API for ODC service. @@ -262,7 +263,7 @@ type UnsafeODCServer interface { } func RegisterODCServer(s grpc.ServiceRegistrar, srv ODCServer) { - s.RegisterService(&_ODC_serviceDesc, srv) + s.RegisterService(&ODC_ServiceDesc, srv) } func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { @@ -499,7 +500,10 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } -var _ODC_serviceDesc = grpc.ServiceDesc{ +// ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var ODC_ServiceDesc = grpc.ServiceDesc{ ServiceName: "odc.ODC", HandlerType: (*ODCServer)(nil), Methods: []grpc.MethodDesc{ diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6a835c79a..53f22d1a4 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.14.0 +// protoc v3.15.8 // source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index a73acb5b6..be825a9c9 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.7 +// protoc v3.15.8 // source: protos/occ.proto package pb diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 66a3c8901..eafb7734d 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -11,6 +11,7 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 // OccClient is the client API for Occ service. @@ -34,7 +35,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) if err != nil { return nil, err } @@ -66,7 +67,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &_Occ_serviceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) if err != nil { return nil, err } @@ -154,7 +155,7 @@ type UnsafeOccServer interface { } func RegisterOccServer(s grpc.ServiceRegistrar, srv OccServer) { - s.RegisterService(&_Occ_serviceDesc, srv) + s.RegisterService(&Occ_ServiceDesc, srv) } func _Occ_EventStream_Handler(srv interface{}, stream grpc.ServerStream) error { @@ -235,7 +236,10 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } -var _Occ_serviceDesc = grpc.ServiceDesc{ +// Occ_ServiceDesc is the grpc.ServiceDesc for Occ service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Occ_ServiceDesc = grpc.ServiceDesc{ ServiceName: "occ_pb.Occ", HandlerType: (*OccServer)(nil), Methods: []grpc.MethodDesc{ From 3c7511d04db63cee823d4f75c3f97cfdb0c728d6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Jun 2021 12:00:41 +0200 Subject: [PATCH 0931/2352] [build] Bump to v0.24.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index f0e75986a..8121eb3a6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 23 -VERSION_PATCH := 80 +VERSION_MINOR := 24 +VERSION_PATCH := 0 From 5363d8b9911b0814b81fbef1827334d00fa80264 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 21 Jun 2021 16:06:49 +0300 Subject: [PATCH 0932/2352] [repos] Update repo add with flag and docs --- coconut/cmd/repo_add.go | 28 ++++++++++++++++++++++++---- coconut/control/control.go | 22 ++++++++++------------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index a90b247dd..f631d2a77 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -31,14 +31,34 @@ import ( // repoAddCmd represents the repo add command var repoAddCmd = &cobra.Command{ - Use: "add", + Use: "add ", Aliases: []string{"new", "a"}, - Example: `coconut repo add github.com/AliceO2Group/ControlWorkflows`, Short: "add a new git repository", - Long: "The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration.\nThe `https://` prefix and `.git` suffix should always be omitted.", + Long: `The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration. +The default revision of the repository may be explicitly specified by passing the flag ` + "`--default-revision`" + ` . In any case, +the ensuing list is followed until a valid revision has been identified: + +- explicitly set default revision (optional) +- global default revision +- ` + "`master`" + ` +- ` + "`main`" + ` + +Exhaustion of the aforementioned list results in a repo add failure. + +` + "`coconut repo add`" + ` can be called with +1) a repository identifier +2) a repository identifier coupled with the ` + "`--default-revision`" + ` flag (see examples below) + +The ` + "`https://`" + ` prefix and ` + "`.git`" + ` suffix should always be omitted.`, + Example: + ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows`" + ` + * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev`", Run: control.WrapCall(control.AddRepo), + Args: cobra.ExactArgs(1), } func init() { repoCmd.AddCommand(repoAddCmd) -} + + repoAddCmd.Flags().StringP("default-revision", "d", "", "default revision for repository to add") +} \ No newline at end of file diff --git a/coconut/control/control.go b/coconut/control/control.go index fbca7dfe1..d38cf9783 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -888,21 +888,19 @@ func ListRepos(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, } // AddRepo add a new repository to the available git repositories used for configuration and checks it out. -func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - - name, defaultRevision := "", "" - if len(args) == 1 { - name = args[0] - } else if len(args) == 2 { - name = args[0] - defaultRevision = args[1] - } else if len(args) != 1 { - err = errors.New(fmt.Sprintf("accepts 1 or 2 args, received %d", len(args))) +func AddRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { + + if len(args) != 1 { + return fmt.Errorf("accepts 1 arg, received %d", len(args)) + } + + name := args[0] + defaultRevision, err := cmd.Flags().GetString("default-revision") + if err != nil { return err } - var response *pb.AddRepoReply - response, err = rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: name, DefaultRevision: defaultRevision}, grpc.EmptyCallOption{}) + response, err := rpc.AddRepo(cxt, &pb.AddRepoRequest{Name: name, DefaultRevision: defaultRevision}, grpc.EmptyCallOption{}) if err != nil { fmt.Fprintln(o, "Cannot add repository.") return err From 4e23232e80a484bbd2447c4ed5848731d3c8c104 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 22 Jun 2021 11:26:45 +0300 Subject: [PATCH 0933/2352] [repos] Update repo default with docs --- coconut/cmd/repo_default.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/coconut/cmd/repo_default.go b/coconut/cmd/repo_default.go index 169eaa9f2..71361911b 100644 --- a/coconut/cmd/repo_default.go +++ b/coconut/cmd/repo_default.go @@ -31,10 +31,14 @@ import ( // repoRemoveCmd represents the repository remove command var repoDefaultCmd = &cobra.Command{ - Use: "default", + Use: "default ", Short: "set a git repository as default", - Long: "The repository default command sets a git repository as the default repository for incoming workflow deployment requests.", + Long: `The repository default command sets a git repository as the default repository for incoming workflow deployment requests. +A repository is referenced through its repo id, as reported by ` + "`coconut repo list`.", + Example: +` * ` + "`coconut repo default 2`", Run: control.WrapCall(control.SetDefaultRepo), + Args: cobra.ExactArgs(1), } func init() { From e70a6dd59f9fa162edcef71b547f091ef4dbad4f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 22 Jun 2021 11:31:58 +0300 Subject: [PATCH 0934/2352] [repos] Update repo remove with docs --- coconut/cmd/repo_remove.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coconut/cmd/repo_remove.go b/coconut/cmd/repo_remove.go index a58388e62..ec8cb1bd5 100644 --- a/coconut/cmd/repo_remove.go +++ b/coconut/cmd/repo_remove.go @@ -31,11 +31,16 @@ import ( // repoRemoveCmd represents the repo remove command var repoRemoveCmd = &cobra.Command{ - Use: "remove", + Use: "remove ", Aliases: []string{"r", "delete", "del", "d"}, Short: "remove a git repository", - Long: "The repository remove command removes a git repository from the catalogue of workflow configuration sources.", + Long: `The repository remove command removes a git repository from the catalogue of workflow configuration sources. +A repository is referenced by its repo id, as reported by` + "`coconut repo list`", + Example: +` * ` + "`coconut repo remove 1`" + ` + * ` + "`coconut repo del 2`", Run: control.WrapCall(control.RemoveRepo), + Args: cobra.ExactArgs(1), } func init() { From 48fe4c0eb128e33837e148d794f6585d1d4b7436 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 22 Jun 2021 11:39:31 +0300 Subject: [PATCH 0935/2352] [repos] Update repo refresh with docs --- coconut/cmd/repo_refresh.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/coconut/cmd/repo_refresh.go b/coconut/cmd/repo_refresh.go index 672e86684..071f58e02 100644 --- a/coconut/cmd/repo_refresh.go +++ b/coconut/cmd/repo_refresh.go @@ -31,11 +31,16 @@ import ( // repoListCmd represents the repo list command var repoRefreshCmd = &cobra.Command{ - Use: "refresh", + Use: "refresh [repo id]", Aliases: []string{"update", "u"}, Short: "refresh git repositories", - Long: "The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date.", + Long: `The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date. +It can optionally be supplied with a repo id, to only refresh a specific repo. Repo ids are reported by ` + "`coconut repo list`.", + Example: +` * ` + "`coconut repo refresh`" + ` + * ` + "`coconut repo refresh 1`", Run: control.WrapCall(control.RefreshRepos), + Args: cobra.MaximumNArgs(1), } func init() { From 4639cc92c43d5c119ac75c92bc1473770bc88e06 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 22 Jun 2021 11:53:26 +0300 Subject: [PATCH 0936/2352] [repos] Update repo default-revision with docs --- coconut/cmd/repo_default_revision.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index 31e61c5a4..a9a580a74 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -31,17 +31,17 @@ import ( // repoDefaultRevision sets global and per-repo default revision var repoDefaultRevisionCmd = &cobra.Command{ - Use: "default-revision", + Use: "default-revision ", Short: "set default global and per-repository revision", - Long: `The repository default-revision command sets the global default repository revision. + Long: `The repository default-revision command sets the global default repository revision.' -To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by ` + "`coconut repo list`." + ` - -Examples: -* ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision -* ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 -* ` + "`coconut repo default-revision 2 vs-sftb`" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, +To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by ` + "`coconut repo list`.", + Example: +` * ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision + * ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 + * ` + "`coconut repo default-revision 2 vs-sftb`" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, Run: control.WrapCall(control.SetDefaultRevision), + Args: cobra.RangeArgs(1, 2), } func init() { From 9941447c4be768aa644a3a2ec822516e6e833a6c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 17 Jun 2021 16:07:07 +0200 Subject: [PATCH 0937/2352] [repos] Allow addition of a repo without a global default revision branch --- core/repos/repomanager.go | 45 ++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index bfe1cf023..a18462451 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -26,12 +26,12 @@ package repos import ( "errors" + "fmt" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/configuration" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" - "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -179,8 +179,8 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ return } -func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { - // Decide if revision = defaultRevision -> if yes lock them together +func (manager *RepoManager) checkAndSetDefaultRevision(repo *Repo) error { + // Decide if requested revision = defaultRevision -> if yes lock them together // We do this because, in the case where the revision was not specified, it would fall back to the default revision // As a result, subsequent changes to the default revision, within the scope of this function, should be followed by revision revIsDefault := false @@ -188,7 +188,7 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { revIsDefault = true } - // Check that the defaultRevision is valid + // Check that the defaultRevision is valid, i.e. can be checked out var prefixes []string prefixes = append(prefixes, refRemotePrefix, refTagPrefix) matchedRevs, err := repo.getRevisions(repo.DefaultRevision, prefixes) @@ -204,20 +204,35 @@ func (manager *RepoManager) checkDefaultRevision(repo *Repo) error { return err } else if len(matchedRevs) == 0 { log.Warning("Global default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) + } else { + // if the revision was the default revision, make sure we now follow the updated default revision if revIsDefault { repo.Revision = repo.DefaultRevision } return nil } } - log.Warning("Defaulting to master") - repo.DefaultRevision = "master" - } - if revIsDefault { - repo.Revision = repo.DefaultRevision + // No revisions matched, fall back to master or main + matchedRevs, err = repo.getRevisions("master", prefixes) + if err == nil && len(matchedRevs) != 0 { + log.Warning("Defaulting to master") + repo.DefaultRevision = "master" + return nil + } + + matchedRevs, err = repo.getRevisions("main", prefixes) + if err == nil && len(matchedRevs) != 0 { + log.Warning("Defaulting to main") + repo.DefaultRevision = "main" + return nil + } + + log.Warning("Cannot fall back to any default revision for %s", repo.RepoName) + return fmt.Errorf("cannot fall back to any default revision for %s", repo.RepoName) } + return nil } @@ -241,16 +256,11 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st var gitRepo *git.Repository gitRepo, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ URL: repo.getUrl(), - ReferenceName: plumbing.NewBranchReferenceName(repo.Revision), + NoCheckout: true, }) if err != nil { - if err == git.ErrRepositoryAlreadyExists { //Make sure the requested revision is checked out - checkoutErr := repo.checkoutRevision(repo.Revision) - if checkoutErr != nil { - return "", false, errors.New(err.Error() + " " + checkoutErr.Error()) - } - } else { + if err != git.ErrRepositoryAlreadyExists { cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) if cleanErr != nil { return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) @@ -274,7 +284,8 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st } } - err = manager.checkDefaultRevision(repo) + // Check that the repo's default revision is valid, updates if not + err = manager.checkAndSetDefaultRevision(repo) if err != nil { return "", false, err } From e0b26fe080d87b5e14463c0ffe96e9f4d7afbcd4 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 17 Jun 2021 16:39:46 +0200 Subject: [PATCH 0938/2352] [repos] Always fetch an existing repo on addition --- core/repos/repo.go | 5 ----- core/repos/repomanager.go | 10 ++++++++-- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 11bc199ee..fff3b7fe0 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -211,11 +211,6 @@ func (r *Repo) refresh() error { } } - err = r.checkoutRevision(r.getDefaultRevision()) - if err != nil { - return err - } - return nil } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index a18462451..7f77bc9d7 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -260,7 +260,13 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st }) if err != nil { - if err != git.ErrRepositoryAlreadyExists { + if err == git.ErrRepositoryAlreadyExists { + // This was an existing repo, so let's make sure it's up to date + err = repo.refresh() + if err != nil { + return "", false, err + } + } else { cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) if cleanErr != nil { return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) @@ -284,7 +290,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st } } - // Check that the repo's default revision is valid, updates if not + // Check that the repo's default revision is valid, update if not err = manager.checkAndSetDefaultRevision(repo) if err != nil { return "", false, err From a9f9fb371dd89be39617c952a2c8314caabae807 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 21 Jun 2021 12:23:45 +0300 Subject: [PATCH 0939/2352] [repos] Fix revisions not populated --- core/repos/repo.go | 20 +++++++++++++------- core/repos/repomanager.go | 23 +++++++++++------------ 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index fff3b7fe0..fde26acbc 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -198,13 +198,16 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) } - // git updates, gather revisions and update template cache - if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { - err = r.gatherRevisions() + // gather revisions on update or if empty + if err != git.NoErrAlreadyUpToDate || r.Revisions == nil { + err = r.gatherRevisions(ref) if err != nil { return err } + } + // populate workflows on update or if empty + if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { err = r.populateWorkflows(r.getDefaultRevision(), true) if err != nil { return err @@ -214,11 +217,14 @@ func (r *Repo) refresh() error { return nil } -func (r *Repo) gatherRevisions() error { +func (r *Repo) gatherRevisions(ref *git.Repository) error { - ref, err := git.PlainOpen(r.getCloneDir()) - if err != nil { - return errors.New(err.Error() + ": " + r.GetIdentifier()) + var err error + if ref == nil { + ref, err = git.PlainOpen(r.getCloneDir()) + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } } var revs []string diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 7f77bc9d7..be8af6e0b 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -259,18 +259,17 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st NoCheckout: true, }) - if err != nil { - if err == git.ErrRepositoryAlreadyExists { - // This was an existing repo, so let's make sure it's up to date - err = repo.refresh() - if err != nil { - return "", false, err - } - } else { - cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) - if cleanErr != nil { - return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) - } + if err != nil && err != git.ErrRepositoryAlreadyExists{ + // Something went wrong, clean up + cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) + if cleanErr != nil { + return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) + } + return "", false, err + } else { + // Make sure the repo is up to date and its structs are populated + err = repo.refresh() + if err != nil { return "", false, err } } From e31dfb716cade4c6aef5bfe6f645a8bbe465c518 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Jun 2021 10:20:22 +0200 Subject: [PATCH 0940/2352] [core] Wrap ODC client handlers with TimeTrack --- core/integration/odc/handlers.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 3b3a76583..4ac4074f9 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -28,7 +28,9 @@ import ( "context" "errors" "fmt" + "time" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/integration/odc/odcutils" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/k0kubun/pp" @@ -38,6 +40,7 @@ import ( ) func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (string, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) req := &odcpb.StateRequest{ Partitionid: envId, Path: "", @@ -85,6 +88,7 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st } func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) req := &odcpb.StartRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, @@ -173,6 +177,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string } func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) req := &odcpb.StopRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, @@ -216,6 +221,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] } func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -238,6 +244,7 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string } func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -384,6 +391,7 @@ func handleExit(ctx context.Context, odcClient *RpcClient, arguments map[string] } func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -447,6 +455,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, topology string, plugin string, resources string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") } From 94fc5e301f5cd4bb8121eb8fc8db248c4d5267d9 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 29 Jun 2021 15:44:06 +0200 Subject: [PATCH 0941/2352] [core] Increase Mesos command timeout --- core/controlcommands/mesoscommand.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/controlcommands/mesoscommand.go b/core/controlcommands/mesoscommand.go index 22f2b37fb..bd58411d8 100644 --- a/core/controlcommands/mesoscommand.go +++ b/core/controlcommands/mesoscommand.go @@ -32,7 +32,7 @@ import ( ) const ( - defaultResponseTimeout = 45 * time.Second + defaultResponseTimeout = 90 * time.Second ) type MesosCommand interface { From d0fc109ea5436b772f4a34c48ca416bbb902bfab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Jul 2021 10:19:27 +0200 Subject: [PATCH 0942/2352] [build] Bump to v0.24.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8121eb3a6..e4ca1475c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 24 -VERSION_PATCH := 0 +VERSION_PATCH := 2 From 220c2f6d920272f2eabc83a1f5fabd02a41d4bc8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 30 Jun 2021 18:19:04 +0200 Subject: [PATCH 0943/2352] [core] New o2-aliecs-shmcleaner script + Makefile for it --- Makefile | 14 +++++++++++ cmd/o2-aliecs-shmcleaner | 50 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 cmd/o2-aliecs-shmcleaner diff --git a/Makefile b/Makefile index a308a1c96..569681e7f 100644 --- a/Makefile +++ b/Makefile @@ -87,12 +87,26 @@ $(WHAT): # @echo ${PWD} @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ +# special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script + @if [ $@ == "o2-aliecs-executor" ]; then \ + echo -e "\033[1;33mcopy\033[0m ./cmd/o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m./bin/o2-aliecs-shmcleaner\033[0m"; \ + cp cmd/o2-aliecs-shmcleaner bin/o2-aliecs-shmcleaner; \ + chmod +x bin/o2-aliecs-shmcleaner; \ + fi; \ + $(INSTALL_WHAT): # @echo -e "WHAT_$(@:install_%=%)_BUILD_FLAGS $(WHAT_$(@:install_%=%)_BUILD_FLAGS)" @echo -e "\033[1;33mgo install -mod=vendor\033[0m ./cmd/$(@:install_%=%) \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/$(@:install_%=%)\033[0m" # @echo ${PWD} @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) +# special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script + @if [ $@ == "install_o2-aliecs-executor" ]; then \ + echo -e "\033[1;33minstall\033[0m ./cmd/o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/o2-aliecs-shmcleaner\033[0m"; \ + cp cmd/o2-aliecs-shmcleaner $${GOPATH}/bin/o2-aliecs-shmcleaner; \ + chmod +x $${GOPATH}/bin/o2-aliecs-shmcleaner; \ + fi; \ + generate: ifndef HAS_PROTOC $(MAKE) tools/protoc diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner new file mode 100644 index 000000000..ebaddc0c1 --- /dev/null +++ b/cmd/o2-aliecs-shmcleaner @@ -0,0 +1,50 @@ +#!/bin/bash + +# === This file is part of ALICE O² === +# +# Copyright 2021 CERN and copyright holders of ALICE O². +# Author: Teo Mrnjavac +# +# Partially derived from Torus Makefile +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# In applying this license CERN does not waive the privileges and +# immunities granted to it by virtue of its status as an +# Intergovernmental Organization or submit itself to any jurisdiction. + +O2_INFOLOGGER_PATH=/opt/o2-InfoLogger +export O2_SYSTEM=ECS +export O2_FACILITY=core/shmcleaner +export O2_PARTITION=${O2_PARTITION:-} +export O2_ROLE=${O2_ROLE:-} + +ANY_FILES_CLEANED=false + +for SHM_FILE in /dev/shm/*; do + if [ -f $SHM_FILE ] ; then + SIZE=$(ls -lah $SHM_FILE | awk -F " " {'print $5'}) + if ! fuser -s $SHM_FILE ; then + rm -f $SHM_FILE + echo "freed unused shared memory $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + ANY_FILES_CLEANED=true + else + echo "could not free shared memory in use $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Warning -o Facility=$O2_FACILITY + fi + fi +done + +if [ "$ANY_FILES_CLEANED" = false ] ; then + echo "no shared memory freed" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY +fi From fab549e6cba67f123306d82ae52cf20dbd563287 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 30 Jun 2021 18:20:12 +0200 Subject: [PATCH 0944/2352] [core] New DEPLOY transition in env state machine --- coconut/protos/o2control.pb.go | 998 ++++++++++++----------- core/environment/environment.go | 11 +- core/environment/manager.go | 16 +- core/environment/transition.go | 5 +- core/environment/transition_configure.go | 168 +--- core/environment/transition_deploy.go | 220 +++++ core/protos/o2control.pb.go | 998 ++++++++++++----------- core/protos/o2control.proto | 1 + 8 files changed, 1244 insertions(+), 1173 deletions(-) create mode 100644 core/environment/transition_deploy.go diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 53f22d1a4..446b1dd7b 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -109,6 +109,7 @@ const ( ControlEnvironmentRequest_CONFIGURE ControlEnvironmentRequest_Optype = 3 ControlEnvironmentRequest_RESET ControlEnvironmentRequest_Optype = 4 ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 + ControlEnvironmentRequest_DEPLOY ControlEnvironmentRequest_Optype = 6 ) // Enum value maps for ControlEnvironmentRequest_Optype. @@ -120,6 +121,7 @@ var ( 3: "CONFIGURE", 4: "RESET", 5: "GO_ERROR", + 6: "DEPLOY", } ControlEnvironmentRequest_Optype_value = map[string]int32{ "NOOP": 0, @@ -128,6 +130,7 @@ var ( "CONFIGURE": 3, "RESET": 4, "GO_ERROR": 5, + "DEPLOY": 6, } ) @@ -4642,523 +4645,524 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, - 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, - 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, - 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, + 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, - 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, - 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, - 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, - 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, - 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, - 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, - 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, - 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, - 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, - 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x0c, + 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, + 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, - 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, - 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/environment/environment.go b/core/environment/environment.go index 380d071bc..b84e95269 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -114,13 +114,14 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.Sm = fsm.NewFSM( "STANDBY", fsm.Events{ - {Name: "CONFIGURE", Src: []string{"STANDBY"}, Dst: "CONFIGURED"}, - {Name: "RESET", Src: []string{"CONFIGURED"}, Dst: "STANDBY"}, + {Name: "DEPLOY", Src: []string{"STANDBY"}, Dst: "DEPLOYED"}, + {Name: "CONFIGURE", Src: []string{"DEPLOYED"}, Dst: "CONFIGURED"}, + {Name: "RESET", Src: []string{"CONFIGURED"}, Dst: "DEPLOYED"}, {Name: "START_ACTIVITY", Src: []string{"CONFIGURED"}, Dst: "RUNNING"}, {Name: "STOP_ACTIVITY", Src: []string{"RUNNING"}, Dst: "CONFIGURED"}, - {Name: "EXIT", Src: []string{"CONFIGURED", "STANDBY"}, Dst: "DONE"}, - {Name: "GO_ERROR", Src: []string{"CONFIGURED", "RUNNING"}, Dst: "ERROR"}, - {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "STANDBY"}, + {Name: "EXIT", Src: []string{"CONFIGURED", "DEPLOYED", "STANDBY"}, Dst: "DONE"}, + {Name: "GO_ERROR", Src: []string{"CONFIGURED", "DEPLOYED", "RUNNING"}, Dst: "ERROR"}, + {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "DEPLOYED"}, }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { diff --git a/core/environment/manager.go b/core/environment/manager.go index 70b3a0abf..e2d29f87f 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -133,11 +133,13 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh - err = env.TryTransition(NewConfigureTransition( + err = env.TryTransition(NewDeployTransition( envs.taskman, nil, //roles, - nil, - true), + nil), + ) + err = env.TryTransition(NewConfigureTransition( + envs.taskman), ) envs.mu.Unlock() @@ -457,11 +459,13 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envs.pendingStateChangeCh[env.id] = env.stateChangedCh envs.mu.Unlock() - err = env.TryTransition(NewConfigureTransition( + err = env.TryTransition(NewDeployTransition( envs.taskman, nil, //roles, - nil, - true )) + nil)) + err = env.TryTransition(NewConfigureTransition( + envs.taskman)) + if err != nil { envState := env.CurrentState() env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) diff --git a/core/environment/transition.go b/core/environment/transition.go index a22b44fba..947195c29 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -27,6 +27,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task" ) @@ -39,8 +40,10 @@ type Transition interface { func MakeTransition(taskman *task.Manager, optype pb.ControlEnvironmentRequest_Optype) Transition { switch optype { + case pb.ControlEnvironmentRequest_DEPLOY: + return NewDeployTransition(taskman, nil, nil) case pb.ControlEnvironmentRequest_CONFIGURE: - return NewConfigureTransition(taskman, nil, nil, true) + return NewConfigureTransition(taskman) case pb.ControlEnvironmentRequest_START_ACTIVITY: return NewStartActivityTransition(taskman) case pb.ControlEnvironmentRequest_STOP_ACTIVITY: diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index 149b430f6..e64b985f1 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -26,34 +26,23 @@ package environment import ( "errors" - "fmt" - "time" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" - "github.com/AliceO2Group/Control/core/workflow" - "github.com/pborman/uuid" - "github.com/sirupsen/logrus" ) -func NewConfigureTransition(taskman *task.Manager, addRoles []string, removeRoles []string, reconfigureAll bool) Transition { +func NewConfigureTransition(taskman *task.Manager) Transition { return &ConfigureTransition{ baseTransition: baseTransition{ name: "CONFIGURE", taskman: taskman, }, - addRoles: addRoles, - removeRoles: removeRoles, - reconfigureAll: reconfigureAll, } } type ConfigureTransition struct { baseTransition - addRoles []string - removeRoles []string - reconfigureAll bool } func (t ConfigureTransition) do(env *Environment) (err error) { @@ -63,161 +52,6 @@ func (t ConfigureTransition) do(env *Environment) (err error) { wf := env.Workflow() - - // Role tree operations go here, and afterwards we'll generally get a role tree which - // has - // - some TaskRoles already deployed with Tasks - // - some TaskRoles with no Tasks but with matching Tasks in the roster - // - some TaskRoles with no Tasks and no matching running Tasks in the roster - -/* - // First we free the relevant roles, if any - if len(t.removeRoles) != 0 { - rolesThatStay := env.roles[:0] - rolesToRelease := make([]string, 0) - - for _, role := range env.roles { - for _, removeRole := range t.removeRoles { - if role == removeRole { - rolesToRelease = append(rolesToRelease, role) - break - } - rolesThatStay = append(rolesThatStay, role) - } - } - err = t.roleman.ReleaseRoles(env.Id().Array(), rolesToRelease) - if err != nil { - return - } - env.roles = rolesThatStay - } - // IDEA: instead of passing around m.state or roleman, pass around one or more of - // roleman's channels. This way roleman could potentially be lockless, and we just pipe - // him a list of rolenames to remove/add, or even a function or a struct that does so. - // This struct would implement an interface of the type of his channel, and he could - // use type assertion to check whether he needs to add, remove or do something else. - - // Alright, so now we have freed some roles (if required). - // We proceed by deduplicating and attempting an acquire. - if len(t.addRoles) != 0 { - rolesToAcquire := make([]string, 0) - - for _, addRole := range t.addRoles { - alreadyInEnv := false - for _, role := range env.roles { - if role == addRole { - alreadyInEnv = true - break - } - } - if !alreadyInEnv { - rolesToAcquire = append(rolesToAcquire, addRole) - } - } - err = t.roleman.AcquireRoles(env.Id().Array(), rolesToAcquire) - if err != nil { - return - } - - // We complete a move to CONFIGURED for all roles and we're done. - err = t.roleman.ConfigureRoles(env.Id().Array(), rolesToAcquire) - if err != nil { - return - } - - env.roles = append(env.roles, rolesToAcquire...) - } - - // Finally, we configure. - if t.reconfigureAll { - err = t.roleman.ConfigureRoles(env.Id().Array(), env.roles) - if err != nil { - return - } - } - - return*/ - - notifyStatus := make(chan task.Status) - subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) - defer env.wfAdapter.UnsubscribeFromStatusChange(subscriptionId) - - // listen to workflow State changes - notifyState := make(chan task.State) - env.wfAdapter.SubscribeToStateChange(subscriptionId, notifyState) - defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) - - taskDescriptors := wf.GenerateTaskDescriptors() - if len(taskDescriptors) != 0 { - // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) - taskmanMessage := task.NewEnvironmentMessage(taskop.AcquireTasks, env.Id(), nil, taskDescriptors) - t.taskman.MessageChannel <- taskmanMessage - } - if err != nil { - return - } - - // We set all callRoles to ACTIVE right now, because there's no task activation for them. - // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. - allHooks := wf.GetHooksForTrigger("") // no trigger = all hooks - callHooks := allHooks.FilterCalls() // get the calls - if len(callHooks) > 0 { - for _, h := range callHooks { - pr, ok := h.GetParentRole().(workflow.PublicUpdatable) - if !ok { - continue - } - go pr.UpdateStatus(task.ACTIVE) - } - } - - deploymentTimeout := 90 * time.Second - wfStatus := wf.GetStatus() - if wfStatus != task.ACTIVE { - WORKFLOW_ACTIVE_LOOP: - for { - log.Debug("waiting for workflow to become active") - select { - case wfStatus = <-notifyStatus: - log.WithField("status", wfStatus.String()). - Debug("workflow status change") - if wfStatus == task.ACTIVE { - break WORKFLOW_ACTIVE_LOOP - } - continue - case <-time.After(deploymentTimeout): - err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s",deploymentTimeout.String())) - break WORKFLOW_ACTIVE_LOOP - // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, - // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster - // in the CreateEnvironment (environment/manager.go) and the lock in the `envman` is reserved for a sorter period, which allows operations like - // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. - case wfState := <-notifyState: - if wfState == task.ERROR { - workflow.LeafWalk(wf, func(role workflow.Role) { - if st := role.GetState(); st == task.ERROR { - log.WithField("state", st). - WithField("role", role.GetPath()). - WithField("environment", role.GetEnvironmentId().String()). - Error("environment reached invalid state") - } - }) - log.WithField("state", wfState.String()). - Debug("workflow state change") - err = errors.New("workflow deployment failed, aborting and cleaning up") - break WORKFLOW_ACTIVE_LOOP - } - } - } - } - - if err != nil { - log.WithFields(logrus.Fields{"error": err.Error()}). - Error("workflow deployment error") - return - } - tasks := wf.GetTasks() if len(tasks) != 0 { diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go new file mode 100644 index 000000000..3be94802c --- /dev/null +++ b/core/environment/transition_deploy.go @@ -0,0 +1,220 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package environment + +import ( + "errors" + "fmt" + "time" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/workflow" + "github.com/pborman/uuid" + "github.com/sirupsen/logrus" +) + +func NewDeployTransition(taskman *task.Manager, addRoles []string, removeRoles []string) Transition { + return &DeployTransition{ + baseTransition: baseTransition{ + name: "DEPLOY", + taskman: taskman, + }, + addRoles: addRoles, + removeRoles: removeRoles, + } +} + +type DeployTransition struct { + baseTransition + addRoles []string + removeRoles []string +} + +func (t DeployTransition) do(env *Environment) (err error) { + if env == nil { + return errors.New("cannot transition in NIL environment") + } + + wf := env.Workflow() + + // Role tree operations go here, and afterwards we'll generally get a role tree which + // has + // - some TaskRoles already deployed with Tasks + // - some TaskRoles with no Tasks but with matching Tasks in the roster + // - some TaskRoles with no Tasks and no matching running Tasks in the roster + + /* + // First we free the relevant roles, if any + if len(t.removeRoles) != 0 { + rolesThatStay := env.roles[:0] + rolesToRelease := make([]string, 0) + + for _, role := range env.roles { + for _, removeRole := range t.removeRoles { + if role == removeRole { + rolesToRelease = append(rolesToRelease, role) + break + } + rolesThatStay = append(rolesThatStay, role) + } + } + err = t.roleman.ReleaseRoles(env.Id().Array(), rolesToRelease) + if err != nil { + return + } + env.roles = rolesThatStay + } + // IDEA: instead of passing around m.state or roleman, pass around one or more of + // roleman's channels. This way roleman could potentially be lockless, and we just pipe + // him a list of rolenames to remove/add, or even a function or a struct that does so. + // This struct would implement an interface of the type of his channel, and he could + // use type assertion to check whether he needs to add, remove or do something else. + + // Alright, so now we have freed some roles (if required). + // We proceed by deduplicating and attempting an acquire. + if len(t.addRoles) != 0 { + rolesToAcquire := make([]string, 0) + + for _, addRole := range t.addRoles { + alreadyInEnv := false + for _, role := range env.roles { + if role == addRole { + alreadyInEnv = true + break + } + } + if !alreadyInEnv { + rolesToAcquire = append(rolesToAcquire, addRole) + } + } + err = t.roleman.AcquireRoles(env.Id().Array(), rolesToAcquire) + if err != nil { + return + } + + // We complete a move to CONFIGURED for all roles and we're done. + err = t.roleman.ConfigureRoles(env.Id().Array(), rolesToAcquire) + if err != nil { + return + } + + env.roles = append(env.roles, rolesToAcquire...) + } + + // Finally, we configure. + if t.reconfigureAll { + err = t.roleman.ConfigureRoles(env.Id().Array(), env.roles) + if err != nil { + return + } + } + + return*/ + + notifyStatus := make(chan task.Status) + subscriptionId := uuid.NewUUID().String() + env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) + defer env.wfAdapter.UnsubscribeFromStatusChange(subscriptionId) + + // listen to workflow State changes + notifyState := make(chan task.State) + env.wfAdapter.SubscribeToStateChange(subscriptionId, notifyState) + defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) + + taskDescriptors := wf.GenerateTaskDescriptors() + if len(taskDescriptors) != 0 { + // err = t.taskman.AcquireTasks(env.Id().Array(), taskDescriptors) + taskmanMessage := task.NewEnvironmentMessage(taskop.AcquireTasks, env.Id(), nil, taskDescriptors) + t.taskman.MessageChannel <- taskmanMessage + } + if err != nil { + return + } + + // We set all callRoles to ACTIVE right now, because there's no task activation for them. + // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. + allHooks := wf.GetHooksForTrigger("") // no trigger = all hooks + callHooks := allHooks.FilterCalls() // get the calls + if len(callHooks) > 0 { + for _, h := range callHooks { + pr, ok := h.GetParentRole().(workflow.PublicUpdatable) + if !ok { + continue + } + go pr.UpdateStatus(task.ACTIVE) + } + } + + deploymentTimeout := 90 * time.Second + wfStatus := wf.GetStatus() + if wfStatus != task.ACTIVE { + WORKFLOW_ACTIVE_LOOP: + for { + log.Debug("waiting for workflow to become active") + select { + case wfStatus = <-notifyStatus: + log.WithField("status", wfStatus.String()). + Debug("workflow status change") + if wfStatus == task.ACTIVE { + break WORKFLOW_ACTIVE_LOOP + } + continue + case <-time.After(deploymentTimeout): + err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s",deploymentTimeout.String())) + break WORKFLOW_ACTIVE_LOOP + // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, + // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster + // in the CreateEnvironment (environment/manager.go) and the lock in the `envman` is reserved for a sorter period, which allows operations like + // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. + case wfState := <-notifyState: + if wfState == task.ERROR { + workflow.LeafWalk(wf, func(role workflow.Role) { + if st := role.GetState(); st == task.ERROR { + log.WithField("state", st). + WithField("role", role.GetPath()). + WithField("environment", role.GetEnvironmentId().String()). + Error("environment reached invalid state") + } + }) + log.WithField("state", wfState.String()). + Debug("workflow state change") + err = errors.New("workflow deployment failed, aborting and cleaning up") + break WORKFLOW_ACTIVE_LOOP + } + } + } + } + + if err != nil { + log.WithFields(logrus.Fields{"error": err.Error()}). + Error("workflow deployment error") + return + } + + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "DEPLOYED"}) + return +} diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 53f22d1a4..446b1dd7b 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -109,6 +109,7 @@ const ( ControlEnvironmentRequest_CONFIGURE ControlEnvironmentRequest_Optype = 3 ControlEnvironmentRequest_RESET ControlEnvironmentRequest_Optype = 4 ControlEnvironmentRequest_GO_ERROR ControlEnvironmentRequest_Optype = 5 + ControlEnvironmentRequest_DEPLOY ControlEnvironmentRequest_Optype = 6 ) // Enum value maps for ControlEnvironmentRequest_Optype. @@ -120,6 +121,7 @@ var ( 3: "CONFIGURE", 4: "RESET", 5: "GO_ERROR", + 6: "DEPLOY", } ControlEnvironmentRequest_Optype_value = map[string]int32{ "NOOP": 0, @@ -128,6 +130,7 @@ var ( "CONFIGURE": 3, "RESET": 4, "GO_ERROR": 5, + "DEPLOY": 6, } ) @@ -4642,523 +4645,524 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xcf, 0x01, 0x0a, 0x19, 0x43, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x61, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x22, 0x6b, 0x0a, 0x17, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, - 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, - 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, - 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, + 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, - 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, - 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, - 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, - 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, - 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, - 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, - 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, - 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, - 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, - 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, - 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x0c, + 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, + 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, + 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, + 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, - 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, - 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index d62c6492a..7ffbc2754 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -213,6 +213,7 @@ message ControlEnvironmentRequest { CONFIGURE = 3; RESET = 4; GO_ERROR = 5; + DEPLOY = 6; } Optype type = 2; } From b65e5cb48a968155b4b04a3ed0a09144d9715076 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 2 Jul 2021 16:48:45 +0200 Subject: [PATCH 0945/2352] [build] Bump to v0.24.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e4ca1475c..c5b6e8be5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 24 -VERSION_PATCH := 2 +VERSION_PATCH := 80 From 2ca5dfb7824ed1984b8bd7e74f81c3808572eacc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 7 Jul 2021 16:43:05 +0200 Subject: [PATCH 0946/2352] [core] Increase shmcleaner log message severity to INFO --- cmd/o2-aliecs-shmcleaner | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index ebaddc0c1..25606a00a 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -37,7 +37,7 @@ for SHM_FILE in /dev/shm/*; do SIZE=$(ls -lah $SHM_FILE | awk -F " " {'print $5'}) if ! fuser -s $SHM_FILE ; then rm -f $SHM_FILE - echo "freed unused shared memory $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + echo "freed unused shared memory $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Info -o Facility=$O2_FACILITY ANY_FILES_CLEANED=true else echo "could not free shared memory in use $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Warning -o Facility=$O2_FACILITY @@ -46,5 +46,5 @@ for SHM_FILE in /dev/shm/*; do done if [ "$ANY_FILES_CLEANED" = false ] ; then - echo "no shared memory freed" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + echo "no shared memory freed" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Info -o Facility=$O2_FACILITY fi From 88baf3453838307221fc6f2e9d2a757f802a1f64 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 13 Jul 2021 16:04:08 +0200 Subject: [PATCH 0947/2352] [misc] Remove incorrect wording from header --- cmd/o2-aliecs-shmcleaner | 2 -- 1 file changed, 2 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index 25606a00a..b7a915a43 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -5,8 +5,6 @@ # Copyright 2021 CERN and copyright holders of ALICE O². # Author: Teo Mrnjavac # -# Partially derived from Torus Makefile -# # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or From 38108dfa3d498225fa23936f0951976556a04dda Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Jul 2021 12:13:19 +0200 Subject: [PATCH 0948/2352] [core] Silence obsolete messages about status update to unknown task --- core/task/manager.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 0b7ac2926..6c4c1328a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -649,9 +649,13 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskId := status.GetTaskID().Value taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { - log.WithField("taskId", taskId). - Warn("attempted status update of task not in roster") - + if status != nil && + status.GetState() != mesos.TASK_FINISHED && + status.GetState() != mesos.TASK_FAILED { + log.WithField("taskId", taskId). + WithField("mesosStatus", status.GetState().String()). + Warn("attempted status update of task not in roster") + } if val, ok := m.ackKilledTasks.getValue(taskId); ok { val <- struct{}{} } From 5a4f0c86addf4e66279f2bea38fc227238c393a7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 19 Jul 2021 14:03:00 +0200 Subject: [PATCH 0949/2352] [core] Adjust log levels and improve messages --- apricot/apricot.go | 4 +++- apricot/instance.go | 5 ++++- cmd/o2-aliecs-shmcleaner | 4 ++-- common/logger/infologger/directhook.go | 4 +++- common/logger/infologger/utils.go | 7 +++++++ core/core.go | 8 +++++--- core/environment/environment.go | 13 +++++++++++++ core/environment/manager.go | 24 +++++++++++++++++++++++- core/task/manager.go | 2 ++ core/task/scheduler.go | 15 ++++++++++++--- core/task/schedulerstate.go | 4 +++- 11 files changed, 77 insertions(+), 13 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index daeeee8db..78d0d2936 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -31,6 +31,7 @@ import ( "github.com/AliceO2Group/Control/apricot/local" "github.com/AliceO2Group/Control/apricot/remote" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/product" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -44,7 +45,7 @@ func Run() (err error) { if viper.GetBool("verbose") { logrus.SetLevel(logrus.DebugLevel) } - log.Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) + log.WithField("level", infologger.IL_Support).Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) s := remote.NewServer(Instance()) httpsvr := local.NewHttpService(instance) @@ -59,6 +60,7 @@ func Run() (err error) { } log.WithField("port", viper.GetInt("listenPort")). + WithField("level", infologger.IL_Support). Info("service started") if err = s.Serve(lis); err != nil { log.WithField("error", err).Fatal("gRPC server failed to serve") diff --git a/apricot/instance.go b/apricot/instance.go index c8948572b..a6c33797d 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -31,6 +31,7 @@ import ( "github.com/AliceO2Group/Control/apricot/local" "github.com/AliceO2Group/Control/apricot/remote" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/configuration" "github.com/spf13/viper" ) @@ -58,6 +59,7 @@ func newService(configUri string) (configuration.Service, error) { Debug("new embedded apricot instance") } else { log.WithField("configUri", configUri). + WithField("level", infologger.IL_Support). Info("new embedded apricot instance") } return local.NewService(configUri) @@ -70,6 +72,7 @@ func newService(configUri string) (configuration.Service, error) { Debug("new apricot client") } else { log.WithField("configUri", configUri). + WithField("level", infologger.IL_Support). Info("new apricot client") } return remote.NewService(configUri) @@ -93,7 +96,7 @@ func Instance() configuration.Service { } instance, err = newService(configUri) if err != nil { - log.WithField("configServiceUri", configUri).Fatal("bad configuration URI") + log.WithField("level", infologger.IL_Support).WithField("configServiceUri", configUri).Fatal("bad configuration URI") } }) return instance diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index b7a915a43..c2bc74b54 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -35,7 +35,7 @@ for SHM_FILE in /dev/shm/*; do SIZE=$(ls -lah $SHM_FILE | awk -F " " {'print $5'}) if ! fuser -s $SHM_FILE ; then rm -f $SHM_FILE - echo "freed unused shared memory $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Info -o Facility=$O2_FACILITY + echo "freed unused shared memory $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -o Facility=$O2_FACILITY ANY_FILES_CLEANED=true else echo "could not free shared memory in use $SHM_FILE ($SIZE)" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Warning -o Facility=$O2_FACILITY @@ -44,5 +44,5 @@ for SHM_FILE in /dev/shm/*; do done if [ "$ANY_FILES_CLEANED" = false ] ; then - echo "no shared memory freed" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Info -o Facility=$O2_FACILITY + echo "no shared memory freed" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -o Facility=$O2_FACILITY fi diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index ca5e12e25..b51f04039 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -182,7 +182,9 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { // Filled automatically by InfoLogger, do not set: PID, hostName, userName payload := make(map[string]string) payload["severity"] = logrusLevelToInfoLoggerSeverity(e.Level) - payload["level"] = logrusEntryToInfoLoggerLevel(e) + if _, hasLevel := payload["level"]; !hasLevel { + payload["level"] = logrusEntryToInfoLoggerLevel(e) + } payload["timestamp"] = utils.NewUnixTimestamp() payload["hostname"] = hostname payload["pid"] = pid diff --git a/common/logger/infologger/utils.go b/common/logger/infologger/utils.go index 42c450d96..5257c74de 100644 --- a/common/logger/infologger/utils.go +++ b/common/logger/infologger/utils.go @@ -26,6 +26,13 @@ package infologger import "github.com/sirupsen/logrus" +const ( + IL_Ops = 1 + IL_Support = 6 + IL_Devel = 11 + IL_Trace = 21 +) + // Severity/priority constants: // https://github.com/AliceO2Group/InfoLogger/blob/master/include/InfoLogger/InfoLogger.hxx diff --git a/core/core.go b/core/core.go index 8781f3cc9..4df8d89b5 100644 --- a/core/core.go +++ b/core/core.go @@ -27,9 +27,11 @@ package core import ( "context" "fmt" - "github.com/AliceO2Group/Control/core/the" "net" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/product" "github.com/AliceO2Group/Control/core/integration" @@ -52,7 +54,7 @@ func Run() error { if viper.GetBool("veryVerbose") { log.WithField("configuration", viper.AllSettings()).Debug("core starting up") } - log.Infof("%s core (%s v%s build %s) starting up", product.PRETTY_FULLNAME, product.PRETTY_SHORTNAME, product.VERSION, product.BUILD) + log.WithField("level", infologger.IL_Support).Infof("%s core (%s v%s build %s) starting up", product.PRETTY_FULLNAME, product.PRETTY_SHORTNAME, product.VERSION, product.BUILD) // We create a context and use its cancel func as a shutdown func to release // all resources. The shutdown func is stored in the scheduler.internalState. @@ -70,7 +72,7 @@ func Run() error { signals(state) // Start the Repo Manager instance - log.Infof("Starting the Control Workflows repo manager") + log.WithField("level", infologger.IL_Support).Infof("Starting the Control Workflows repo manager") _ = the.RepoManager() // We now build the Control server diff --git a/core/environment/environment.go b/core/environment/environment.go index b84e95269..662acf45e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -158,6 +158,19 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { if errHooks != nil { e.Cancel(errHooks) } + + if rn := env.GetCurrentRunNumber(); rn != 0 { + log.WithField("partition", envId). + WithField("run", rn). + Infof("%s transition complete", + e.Event, + ) + } else { + log.WithField("partition", envId). + Infof("%s transition complete", + e.Event, + ) + } }, }, ) diff --git a/core/environment/manager.go b/core/environment/manager.go index e2d29f87f..de0646f79 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -111,6 +111,15 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } env, err := newEnvironment(envUserVars) + newEnvId := uid.NilID() + if err == nil && env != nil { + newEnvId = env.Id() + } + log.WithFields(logrus.Fields{ + "workflow": workflowPath, + "partition": newEnvId.String(), + }).Info("creating new environment") + if err != nil { envs.mu.Unlock() return uid.NilID(), err @@ -179,6 +188,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error { + log.WithFields(logrus.Fields{ + "partition": environmentId.String(), + }).Info("tearing down environment") + envs.mu.Lock() defer envs.mu.Unlock() @@ -358,7 +371,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { "stderr": btt.Stderr, "finalMesosState": btt.FinalMesosState.String(), }). - Info("basic task terminated") + Debug("basic task terminated") // Propagate this information to the task/role taskId := evt.GetOrigin().TaskId @@ -438,6 +451,15 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } env, err := newEnvironment(envUserVars) + newEnvId := uid.NilID() + if err == nil && env != nil { + newEnvId = env.Id() + } + log.WithFields(logrus.Fields{ + "workflow": workflowPath, + "partition": newEnvId.String(), + }).Info("creating new automatic environment") + if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) return diff --git a/core/task/manager.go b/core/task/manager.go index 6c4c1328a..d2b011e7c 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" @@ -654,6 +655,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { status.GetState() != mesos.TASK_FAILED { log.WithField("taskId", taskId). WithField("mesosStatus", status.GetState().String()). + WithField("level", infologger.IL_Devel). Warn("attempted status update of task not in roster") } if val, ok := m.ackKilledTasks.getValue(taskId); ok { diff --git a/core/task/scheduler.go b/core/task/scheduler.go index fedd86570..87fac3b03 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -38,6 +38,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/controlmode" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/schedutil" @@ -211,10 +212,16 @@ func failure(_ context.Context, e *scheduler.Event) error { if stat != nil { fields["error"] = strconv.Itoa(int(*stat)) } - log.WithPrefix("scheduler").WithFields(fields).Error("executor failed") + log.WithPrefix("scheduler"). + WithFields(fields). + WithField("level", infologger.IL_Support). + Error("executor failed") } else if aid != nil { // agent failed.. - log.WithPrefix("scheduler").WithField("agent", aid.Value).Error("agent failed") + log.WithPrefix("scheduler"). + WithField("agent", aid.Value). + WithField("level", infologger.IL_Support). + Error("agent failed") } return nil } @@ -754,7 +761,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } else { if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { tasksLaunchedThisCycle += n - log.WithPrefix("scheduler").WithField("tasks", n). + log.WithPrefix("scheduler"). + WithField("tasks", n). + WithField("level", infologger.IL_Support). Info("tasks launched") for _, taskInfo := range taskInfosToLaunchForCurrentOffer { log.WithPrefix("scheduler"). diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 667f4508b..2d7dbf9b8 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -33,6 +33,7 @@ import ( "sync" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/looplab/fsm" @@ -167,7 +168,8 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( }, "enter_CONNECTED": func(e *fsm.Event) { log.Debug("enter_CONNECTED") - log.Info("scheduler connected") + log.WithField("level", infologger.IL_Support). + Info("scheduler connected") }, "after_NEW_ENVIRONMENT": func(e *fsm.Event) { log.Debug("after_NEW_ENVIRONMENT") From b4f06e89a3d190ac2ecd61aff7b9d33b28d42bc3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 19 Jul 2021 14:03:37 +0200 Subject: [PATCH 0950/2352] [executor] Adjust log levels and improve messages --- executor/executable/basictaskcommon.go | 12 +++++++++++- executor/executable/controllabletask.go | 22 ++++++++++++++-------- executor/executable/task.go | 5 ++++- executor/executor.go | 4 +++- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 216fa9c68..98d6279fc 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" @@ -139,13 +140,22 @@ func (t *basicTaskBase) startBasicTask() (err error) { // ^ when this unblocks, the task is done pendingState := mesos.TASK_FINISHED + var tciCommandStr string + if t.Tci.Value != nil { + tciCommandStr = *t.Tci.Value + } + if err != nil { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err.Error(), + "level": infologger.IL_Devel, }). - Error("process terminated with error") + Error("task terminated with error") + log.Errorf("task terminated with error: %s %s", + tciCommandStr, + err.Error()) pendingState = mesos.TASK_FAILED } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 13839b5ac..bdd36c8c9 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -36,6 +36,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -304,17 +305,18 @@ func (t *ControllableTask) Launch() error { } for { if t.rpc == nil { - log.WithError(err).Warning("event stream done") + log.WithError(err).Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { - log.WithError(err).Warning("event stream EOF") + log.WithError(err).Debug("event stream EOF") break } if err != nil { log.WithError(err). WithField("errorType", reflect.TypeOf(err)). + WithField("level", infologger.IL_Devel). Warning("error receiving event from task") if status.Code(err) == codes.Unavailable { break @@ -344,12 +346,16 @@ func (t *ControllableTask) Launch() error { pendingState := mesos.TASK_FINISHED if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "error": err.Error(), - }). - Error("process terminated with error") + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "error": err.Error(), + "level": infologger.IL_Devel, + }). + Error("task terminated with error") + log.Errorf("task terminated with error: %s %s", + tciCommandStr, + err.Error()) pendingState = mesos.TASK_FAILED } diff --git a/executor/executable/task.go b/executor/executable/task.go index a367e4c39..870e7e617 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -87,7 +87,10 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE "task": taskInfo.Name, "controlmode": commandInfo.ControlMode.String(), }). - Info("instantiating task") + Debug("instantiating task") + + rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") + log.Infof("launching task %s", rawCommand) } else { if err != nil { log.WithError(err).WithField("task", taskInfo.Name).Error("could not launch task") diff --git a/executor/executor.go b/executor/executor.go index 78744f884..ea242dc18 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -41,6 +41,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/executor/executable" "github.com/golang/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" @@ -155,7 +156,8 @@ func Run(cfg config.Config) { defer resp.Close() } if err == nil { - log.Info("executor subscribed, ready to receive events") + log.WithField("level", infologger.IL_Support). + Info("executor subscribed, ready to receive events") // We're officially connected, start decoding events err = eventLoop(state, resp, handler) // If we're out of the eventLoop, means a disconnect happened, willingly or not. From 698d413a085c74271dd701ccfc267c80ea59f12c Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 15:52:58 +0200 Subject: [PATCH 0951/2352] [core] Environment set public based on wf --- core/environment/environment.go | 1 + core/environment/manager.go | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 662acf45e..66bc36ee3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -69,6 +69,7 @@ type Environment struct { stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} eventStream Subscription + Public bool // From workflow or user callsPendingAwait map[string /*await expression*/]callable.Calls } diff --git a/core/environment/manager.go b/core/environment/manager.go index de0646f79..481cb51fb 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" @@ -130,6 +131,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Ensure the environment_id is available to all env.UserVars.Set("environment_id", env.id.String()) + env.Public, _, _ = repos.ParseWorkflowPublicVariableInfo(workflowPath) env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { @@ -476,6 +478,8 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } + env.Public, _, _ = repos.ParseWorkflowPublicVariableInfo(workflowPath) + envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh From 737a5cc53d0921c3db05b7c694958675b208387b Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 16:05:34 +0200 Subject: [PATCH 0952/2352] [coconut] Add flags for public environments --- coconut/cmd/environment_create.go | 1 + coconut/cmd/environment_list.go | 1 + coconut/control/control.go | 8 +- coconut/protos/o2control.pb.go | 1227 +++++++++++++++-------------- 4 files changed, 641 insertions(+), 596 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index e029b119d..95417a96b 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -62,6 +62,7 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") + environmentCreateCmd.Flags().BoolP("public", "p", false, "create a public environment") environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } diff --git a/coconut/cmd/environment_list.go b/coconut/cmd/environment_list.go index de9920e10..67250635c 100644 --- a/coconut/cmd/environment_list.go +++ b/coconut/cmd/environment_list.go @@ -41,4 +41,5 @@ This includes environments in any state.`, func init() { environmentCmd.AddCommand(environmentListCmd) + environmentListCmd.Flags().BoolP("show-all", "s", false, "print public and non-public environments") } diff --git a/coconut/control/control.go b/coconut/control/control.go index d38cf9783..5f66f71f8 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -216,7 +216,8 @@ func Teardown(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { var response *pb.GetEnvironmentsReply - response, err = rpc.GetEnvironments(cxt, &pb.GetEnvironmentsRequest{}, grpc.EmptyCallOption{}) + showAll, _ := cmd.Flags().GetBool("show-all") + response, err = rpc.GetEnvironments(cxt, &pb.GetEnvironmentsRequest{ShowAll: showAll}, grpc.EmptyCallOption{}) if err != nil { return } @@ -270,6 +271,8 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } + public, _ := cmd.Flags().GetBool("public") + auto, _ := cmd.Flags().GetBool("auto") if auto { // subscribe to core to receive events @@ -336,7 +339,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C // TODO: add support for acquiring bot config here OCTRL-177 var response *pb.NewEnvironmentReply - response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap}, grpc.EmptyCallOption{}) + response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) if err != nil { return } @@ -347,6 +350,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C _, _ = fmt.Fprintf(o, "environment id: %s\n", grey(env.GetId())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "root role: %s\n", env.GetRootRole()) + _, _ = fmt.Fprintf(o, "public: %v\n", response.Public) var ( defaultsStr = stringMapToString(env.Defaults, "\t") diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 446b1dd7b..eeb2294e9 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/o2control.proto package pb @@ -1238,6 +1238,8 @@ type GetEnvironmentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` } func (x *GetEnvironmentsRequest) Reset() { @@ -1272,6 +1274,13 @@ func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{14} } +func (x *GetEnvironmentsRequest) GetShowAll() bool { + if x != nil { + return x.ShowAll + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1453,6 +1462,7 @@ type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1501,12 +1511,20 @@ func (x *NewEnvironmentRequest) GetVars() map[string]string { return nil } +func (x *NewEnvironmentRequest) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` } func (x *NewEnvironmentReply) Reset() { @@ -1548,6 +1566,13 @@ func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +func (x *NewEnvironmentReply) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1703,6 +1728,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` } func (x *GetEnvironmentReply) Reset() { @@ -1751,6 +1777,13 @@ func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { return nil } +func (x *GetEnvironmentReply) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type ControlEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4554,615 +4587,621 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, - 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x32, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, + 0x77, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, + 0x41, 0x6c, 0x6c, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, + 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, + 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, + 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, + 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, + 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, + 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, + 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, + 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, + 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x0c, - 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, - 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, + 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, + 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, + 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From 01e0ff91fb57cb161a67bc10c37735b29db9d85f Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 16:06:20 +0200 Subject: [PATCH 0953/2352] [core] Server support public/non-public envs --- core/protos/o2control.pb.go | 1227 ++++++++++++++++++----------------- core/protos/o2control.proto | 7 +- core/server.go | 10 +- 3 files changed, 648 insertions(+), 596 deletions(-) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 446b1dd7b..eeb2294e9 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/o2control.proto package pb @@ -1238,6 +1238,8 @@ type GetEnvironmentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` } func (x *GetEnvironmentsRequest) Reset() { @@ -1272,6 +1274,13 @@ func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{14} } +func (x *GetEnvironmentsRequest) GetShowAll() bool { + if x != nil { + return x.ShowAll + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1453,6 +1462,7 @@ type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1501,12 +1511,20 @@ func (x *NewEnvironmentRequest) GetVars() map[string]string { return nil } +func (x *NewEnvironmentRequest) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` + Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` } func (x *NewEnvironmentReply) Reset() { @@ -1548,6 +1566,13 @@ func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { return nil } +func (x *NewEnvironmentReply) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1703,6 +1728,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` } func (x *GetEnvironmentReply) Reset() { @@ -1751,6 +1777,13 @@ func (x *GetEnvironmentReply) GetWorkflow() *RoleInfo { return nil } +func (x *GetEnvironmentReply) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + type ControlEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4554,615 +4587,621 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x18, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, - 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x32, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, + 0x77, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, + 0x41, 0x6c, 0x6c, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, + 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x53, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x84, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, + 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, + 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, + 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, + 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, + 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, + 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, + 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, + 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, + 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, + 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, + 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, + 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, + 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, + 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, + 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, + 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x0c, - 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, - 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, - 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, - 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, + 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, + 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, + 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, + 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 7ffbc2754..ddcee90be 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -162,7 +162,9 @@ message TeardownReply {} //////////////////////////////////////// // Environment //////////////////////////////////////// -message GetEnvironmentsRequest {} +message GetEnvironmentsRequest { + bool showAll = 1; +} message GetEnvironmentsReply { string frameworkId = 1; repeated EnvironmentInfo environments = 2; @@ -183,9 +185,11 @@ message EnvironmentInfo { message NewEnvironmentRequest { string workflowTemplate = 1; map vars = 2; + bool public = 3; } message NewEnvironmentReply { EnvironmentInfo environment = 1; + bool public = 2; } message NewAutoEnvironmentRequest { string workflowTemplate = 1; @@ -202,6 +206,7 @@ message GetEnvironmentRequest { message GetEnvironmentReply { EnvironmentInfo environment = 1; RoleInfo workflow = 2; + bool public = 3; } message ControlEnvironmentRequest { diff --git a/core/server.go b/core/server.go index a7b9823e5..6ccdd4372 100644 --- a/core/server.go +++ b/core/server.go @@ -168,7 +168,7 @@ func (*RpcServer) Teardown(context.Context, *pb.TeardownRequest) (*pb.TeardownRe return nil, status.New(codes.Unimplemented, "not implemented").Err() } -func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { +func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { m.logMethod() r := &pb.GetEnvironmentsReply{ @@ -184,6 +184,9 @@ func (m *RpcServer) GetEnvironments(context.Context, *pb.GetEnvironmentsRequest) Error("cannot get environment") continue } + if !request.ShowAll && !env.Public { + continue + } tasks := env.Workflow().GetTasks() e := &pb.EnvironmentInfo{ Id: env.Id().String(), @@ -240,6 +243,10 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme return nil, status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()).Err() } + if request.Public { + newEnv.Public = request.Public + } + tasks := newEnv.Workflow().GetTasks() ei := &pb.EnvironmentInfo{ Id: newEnv.Id().String(), @@ -287,6 +294,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe NumberOfFlps: int32(len(env.GetFLPs())), }, Workflow: workflowToRoleTree(env.Workflow()), + Public: env.Public, } return r, nil } From 4a8468ba21747d0eab03bc2eaf26ef4f8a5854f1 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 16:08:49 +0200 Subject: [PATCH 0954/2352] [coconut] Add public info on env show command --- coconut/control/control.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index 5f66f71f8..02248e35d 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -422,6 +422,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com _, _ = fmt.Fprintf(o, "environment id: %s\n", env.GetId()) _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) + _, _ = fmt.Fprintf(o, "public: %t\n", response.Public) _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) _, _ = fmt.Fprintf(o, "number of FLPs: %s\n", formatNumber(env.GetNumberOfFlps())) if len(defaultsStr) != 0 { From a84dafd14acdc9315c4e0552db1312608e02df12 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 16:15:28 +0200 Subject: [PATCH 0955/2352] [core] Return public value on NewEnvironment --- core/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/server.go b/core/server.go index 6ccdd4372..9726b177f 100644 --- a/core/server.go +++ b/core/server.go @@ -258,6 +258,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme } r := &pb.NewEnvironmentReply{ Environment: ei, + Public: newEnv.Public, } return r, nil } From 1c9eaa18eb4c27647e0d211283780f460c873718 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 20 Jul 2021 16:21:40 +0200 Subject: [PATCH 0956/2352] [coconut] New environments are public by default --- coconut/cmd/environment_create.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 95417a96b..941456ac2 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -62,7 +62,7 @@ func init() { environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") environmentCreateCmd.MarkFlagRequired("workflow-template") environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") - environmentCreateCmd.Flags().BoolP("public", "p", false, "create a public environment") + environmentCreateCmd.Flags().BoolP("public", "p", true, "control public rights of the environment") environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } From 55119a257ff59ef1d3aa262f7fd506222659eb14 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Jul 2021 16:52:05 +0200 Subject: [PATCH 0957/2352] [core] Bump to v0.25.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index c5b6e8be5..dcf4a350b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 24 -VERSION_PATCH := 80 +VERSION_MINOR := 25 +VERSION_PATCH := 0 From d005ad15792e1827c23b3e8f0ce034ba2cac4247 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Jul 2021 10:43:09 +0200 Subject: [PATCH 0958/2352] [core] Ensure teardown can proceed from DEPLOYED state --- core/environment/manager.go | 2 +- core/server.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 481cb51fb..ba5d95533 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -202,7 +202,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } - if env.CurrentState() != "STANDBY" && !force { + if env.CurrentState() != "STANDBY" && env.CurrentState() != "DEPLOYED" && !force { return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } diff --git a/core/server.go b/core/server.go index 9726b177f..d416cd237 100644 --- a/core/server.go +++ b/core/server.go @@ -375,7 +375,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } canDestroy := false - statesForDestroy := []string{"CONFIGURED", "STANDBY"} + statesForDestroy := []string{"CONFIGURED", "DEPLOYED", "STANDBY"} for _, v := range statesForDestroy { if env.CurrentState() == v { From 8ed3572adeaa1491dac6c61d7f71e0f796f9424b Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 22 Jul 2021 10:42:31 +0200 Subject: [PATCH 0959/2352] [core] Fix error when parsing public info for env --- core/environment/manager.go | 14 ++++++++-- core/environment/utils.go | 55 +++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 core/environment/utils.go diff --git a/core/environment/manager.go b/core/environment/manager.go index ba5d95533..7f0a7d987 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -35,7 +35,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" @@ -131,7 +130,16 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Ensure the environment_id is available to all env.UserVars.Set("environment_id", env.id.String()) - env.Public, _, _ = repos.ParseWorkflowPublicVariableInfo(workflowPath) + + // in case of err==nil, env will be false unless user + // set it to True which will be overwriten in server.go + env.Public, err = parseWorkflowPublicInfo(workflowPath) + if err != nil { + log.WithField("public info", env.Public). + WithField("environment", env.Id().String()). + WithError(err). + Warn("parse workflow public info failed.") + } env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { @@ -478,7 +486,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - env.Public, _, _ = repos.ParseWorkflowPublicVariableInfo(workflowPath) + env.Public, _ = parseWorkflowPublicInfo(workflowPath) envs.mu.Lock() envs.m[env.id] = env diff --git a/core/environment/utils.go b/core/environment/utils.go new file mode 100644 index 000000000..b6858b7a8 --- /dev/null +++ b/core/environment/utils.go @@ -0,0 +1,55 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package environment + +import ( + "github.com/AliceO2Group/Control/core/the" + "gopkg.in/yaml.v3" + "io/ioutil" +) + +func parseWorkflowPublicInfo(workflowExpr string) (bool, error) { + repoManager := the.RepoManager() + + resolvedWorkflowPath, _, err := repoManager.GetWorkflow(workflowExpr) //Will fail if repo unknown + if err != nil { + return false, err + } + + yamlFile, err := ioutil.ReadFile(resolvedWorkflowPath) + if err != nil { + return false, err + } + + nodes := make(map[string]yaml.Node) + err = yaml.Unmarshal(yamlFile, &nodes) + if err != nil { + return false, err + } + + isPublic := nodes["name"].Tag == "!public" + + return isPublic, nil +} From 608967cbf6f9de5bdacb19dc3b2b3b5125992e67 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Jul 2021 13:07:37 +0200 Subject: [PATCH 0960/2352] [build] Bump to v0.25.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dcf4a350b..d94d1b305 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 25 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 1cb0203a3cef9e8958f6613e663b1a6b1c75848b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Jul 2021 15:07:40 +0200 Subject: [PATCH 0961/2352] [WIP][core] Update VarSpec structure --- core/protos/o2control.proto | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index ddcee90be..0f2b9e670 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -384,11 +384,13 @@ message GetWorkflowTemplatesRequest{ message VarSpecMessage { enum UiWidget { - editBox = 0; // plain string input line, can accept types number and string + editBox = 0; // plain string input line, can accept types number (like a spinBox) and string slider = 1; // input widget exclusively for numbers, range allowedValues[0]-[1] listBox = 2; // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed dropDownBox = 3; comboBox = 4; + radioButtonBox = 5; + checkBox = 6; } enum Type { @@ -406,6 +408,8 @@ message VarSpecMessage { UiWidget uiWidgetHint = 5; string panel = 6; // hint for the UI on where to put or group the given variable input repeated string allowedValues = 7; // list of offered values from which to choose (only for some UiWidgets) + int32 index = 8; + string visibleIf = 9; // JS expression that evaluates to bool } message WorkflowTemplateInfo { From be3c27b48938c4720917110296bcf9c3c2b2c88a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 26 Jul 2021 12:46:21 +0200 Subject: [PATCH 0962/2352] [core] Add index and visibleif to VarSpec --- apricot/protos/apricot.pb.go | 2 +- coconut/protos/o2control.pb.go | 527 +++++++++--------- core/integration/dcs/protos/dcs.pb.go | 2 +- core/integration/ddsched/protos/ddsched.pb.go | 2 +- core/integration/odc/protos/odc.pb.go | 2 +- core/protos/o2control.pb.go | 527 +++++++++--------- core/protos/o2control.proto | 2 +- core/repos/repoutils.go | 18 +- core/serverutil.go | 22 +- executor/protos/occ.pb.go | 2 +- 10 files changed, 585 insertions(+), 521 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 763e29b2c..8f7994c4f 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index eeb2294e9..4e1809402 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -213,11 +213,13 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_UiWidget int32 const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number and string - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed - VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 - VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 + VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 ) // Enum value maps for VarSpecMessage_UiWidget. @@ -228,13 +230,17 @@ var ( 2: "listBox", 3: "dropDownBox", 4: "comboBox", + 5: "radioButtonBox", + 6: "checkBox", } VarSpecMessage_UiWidget_value = map[string]int32{ - "editBox": 0, - "slider": 1, - "listBox": 2, - "dropDownBox": 3, - "comboBox": 4, + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + "radioButtonBox": 5, + "checkBox": 6, } ) @@ -3490,9 +3496,11 @@ type VarSpecMessage struct { Type VarSpecMessage_Type `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.VarSpecMessage_Type" json:"type,omitempty"` Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` + Widget VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=widget,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"widget,omitempty"` Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) + Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` + VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool } func (x *VarSpecMessage) Reset() { @@ -3555,9 +3563,9 @@ func (x *VarSpecMessage) GetDescription() string { return "" } -func (x *VarSpecMessage) GetUiWidgetHint() VarSpecMessage_UiWidget { +func (x *VarSpecMessage) GetWidget() VarSpecMessage_UiWidget { if x != nil { - return x.UiWidgetHint + return x.Widget } return VarSpecMessage_editBox } @@ -3576,6 +3584,20 @@ func (x *VarSpecMessage) GetAllowedValues() []string { return nil } +func (x *VarSpecMessage) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *VarSpecMessage) GetVisibleIf() string { + if x != nil { + return x.VisibleIf + } + return "" +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4946,7 +4968,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x6f, 0x77, 0x73, 0x22, 0xfc, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, @@ -4956,252 +4978,257 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, + 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, + 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, + 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, - 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -5350,7 +5377,7 @@ var file_protos_o2control_proto_depIdxs = []int32{ 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 42: o2control.VarSpecMessage.uiWidgetHint:type_name -> o2control.VarSpecMessage.UiWidget + 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 87a73d56c..6ceebb560 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -26,7 +26,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/dcs.proto package dcspb diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index cf7559f07..7f4f8f352 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 4d84b4a79..32ba25a62 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/odc.proto package odc diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index eeb2294e9..4e1809402 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -213,11 +213,13 @@ func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { type VarSpecMessage_UiWidget int32 const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number and string - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed - VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 - VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 + VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 ) // Enum value maps for VarSpecMessage_UiWidget. @@ -228,13 +230,17 @@ var ( 2: "listBox", 3: "dropDownBox", 4: "comboBox", + 5: "radioButtonBox", + 6: "checkBox", } VarSpecMessage_UiWidget_value = map[string]int32{ - "editBox": 0, - "slider": 1, - "listBox": 2, - "dropDownBox": 3, - "comboBox": 4, + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + "radioButtonBox": 5, + "checkBox": 6, } ) @@ -3490,9 +3496,11 @@ type VarSpecMessage struct { Type VarSpecMessage_Type `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.VarSpecMessage_Type" json:"type,omitempty"` Label string `protobuf:"bytes,3,opt,name=label,proto3" json:"label,omitempty"` Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - UiWidgetHint VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=uiWidgetHint,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"uiWidgetHint,omitempty"` + Widget VarSpecMessage_UiWidget `protobuf:"varint,5,opt,name=widget,proto3,enum=o2control.VarSpecMessage_UiWidget" json:"widget,omitempty"` Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) + Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` + VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool } func (x *VarSpecMessage) Reset() { @@ -3555,9 +3563,9 @@ func (x *VarSpecMessage) GetDescription() string { return "" } -func (x *VarSpecMessage) GetUiWidgetHint() VarSpecMessage_UiWidget { +func (x *VarSpecMessage) GetWidget() VarSpecMessage_UiWidget { if x != nil { - return x.UiWidgetHint + return x.Widget } return VarSpecMessage_editBox } @@ -3576,6 +3584,20 @@ func (x *VarSpecMessage) GetAllowedValues() []string { return nil } +func (x *VarSpecMessage) GetIndex() int32 { + if x != nil { + return x.Index + } + return 0 +} + +func (x *VarSpecMessage) GetVisibleIf() string { + if x != nil { + return x.VisibleIf + } + return "" +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4946,7 +4968,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0xb2, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x6f, 0x77, 0x73, 0x22, 0xfc, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, @@ -4956,252 +4978,257 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, + 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, + 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, + 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x0c, 0x75, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x48, 0x69, 0x6e, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x22, 0x3b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, - 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, - 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -5350,7 +5377,7 @@ var file_protos_o2control_proto_depIdxs = []int32{ 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 42: o2control.VarSpecMessage.uiWidgetHint:type_name -> o2control.VarSpecMessage.UiWidget + 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 0f2b9e670..e731350fc 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -405,7 +405,7 @@ message VarSpecMessage { Type type = 2; string label = 3; string description = 4; - UiWidget uiWidgetHint = 5; + UiWidget widget = 5; string panel = 6; // hint for the UI on where to put or group the given variable input repeated string allowedValues = 7; // list of offered values from which to choose (only for some UiWidgets) int32 index = 8; diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 1d084355d..6f399ffcd 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -3,6 +3,7 @@ * * Copyright 2021 CERN and copyright holders of ALICE O². * Author: Kostas Alexopoulos + * Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,8 +27,9 @@ package repos import ( "fmt" - "gopkg.in/yaml.v3" "io/ioutil" + + "gopkg.in/yaml.v3" ) func ParseWorkflowPublicVariableInfo(fileName string) (bool, VarSpecMap, error) { @@ -55,13 +57,15 @@ type VarSpecMap map[string]VarSpec // VarSpec is the type of struct into which public variable information from workflows may be parsed type VarSpec struct { - DefaultValue string `yaml:"value"` - VarType string `yaml:"type"` - Label string `yaml:"label"` - Description string `yaml:"description"` - UiWidgetHint string `yaml:"widget"` - Panel string `yaml:"panel" ` + DefaultValue string `yaml:"value"` + VarType string `yaml:"type"` + Label string `yaml:"label"` + Description string `yaml:"description"` + Widget string `yaml:"widget"` + Panel string `yaml:"panel" ` AllowedValues []string `yaml:"values"` + Index int32 `yaml:"index"` + VisibleIf string `yaml:"visibleif"` } // AuxNode Use an auxiliary node struct that also carries its parent Name diff --git a/core/serverutil.go b/core/serverutil.go index 07a72bf60..9ef8cfa84 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -226,21 +226,23 @@ func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*p ret := make(map[string]*pb.VarSpecMessage) var vsm *pb.VarSpecMessage for k, v := range varSpecMap { - vsm = &pb.VarSpecMessage { - DefaultValue: v.DefaultValue, - Type: convertVarTypeStringToEnum(v.VarType), - Label: v.Label, - Description: v.Description, - UiWidgetHint: convertUiWidgetHintStringToEnum(v.UiWidgetHint), - Panel: v.Panel, + vsm = &pb.VarSpecMessage{ + DefaultValue: v.DefaultValue, + Type: convertVarTypeStringToEnum(v.VarType), + Label: v.Label, + Description: v.Description, + Widget: convertWidgetStringToEnum(v.Widget), + Panel: v.Panel, AllowedValues: v.AllowedValues, + Index: v.Index, + VisibleIf: v.VisibleIf, } ret[k] = vsm } return ret } -func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { +func convertWidgetStringToEnum(hint string) pb.VarSpecMessage_UiWidget { switch hint { case "slider": return 1 @@ -250,6 +252,10 @@ func convertUiWidgetHintStringToEnum(hint string) pb.VarSpecMessage_UiWidget { return 3 case "comboBox": return 4 + case "radioButtonBox": + return 5 + case "checkBox": + return 6 default: return 0 // "editBox } diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index be825a9c9..251f011c4 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.15.8 +// protoc v3.17.3 // source: protos/occ.proto package pb From fcdb7fb7a14f1b8031ba8b12be15fb5a533b6d0f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 28 Jul 2021 15:42:11 +0200 Subject: [PATCH 0963/2352] [apricot] Add ListRuntimeEntries to runtime key-value API --- apricot/local/service.go | 24 ++ apricot/protos/apricot.pb.go | 528 +++++++++++++++++------------- apricot/protos/apricot.proto | 5 + apricot/protos/apricot_grpc.pb.go | 36 ++ apricot/remote/server.go | 16 + apricot/remote/service.go | 12 + configuration/service.go | 1 + 7 files changed, 394 insertions(+), 228 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 20c706443..6e6c946d4 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -360,6 +360,30 @@ func (s *Service) SetRuntimeEntry(component string, key string, value string) er } } +func (s *Service) ListRuntimeEntries(component string) ([]string, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + keys, err := cSrc.GetKeysByPrefix(filepath.Join(getConsulRuntimePrefix(), component)) + if err != nil { + return nil, err + } + + payload := make([]string, 0) + for _, k := range keys { + split := strings.Split(k, componentcfg.SEPARATOR) + var last string + if len(split) == 4 { // correct depth for first level + last = split[3] + payload = append(payload, last) + } else { + continue + } + } + return payload, nil + } else { + return nil, errors.New("runtime KV not supported with file backend") + } +} + func (s *Service) ListComponents() (components []string, err error) { keyPrefix := componentcfg.ConfigComponentsPath var keys []string diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 8f7994c4f..a7d2c2139 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -725,6 +725,53 @@ func (x *SetRuntimeEntryRequest) GetValue() string { return "" } +type ListRuntimeEntriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` +} + +func (x *ListRuntimeEntriesRequest) Reset() { + *x = ListRuntimeEntriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ListRuntimeEntriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListRuntimeEntriesRequest) ProtoMessage() {} + +func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListRuntimeEntriesRequest.ProtoReflect.Descriptor instead. +func (*ListRuntimeEntriesRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{11} +} + +func (x *ListRuntimeEntriesRequest) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + type ComponentEntriesQuery struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -738,7 +785,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -751,7 +798,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -764,7 +811,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{11} + return file_protos_apricot_proto_rawDescGZIP(), []int{12} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -803,7 +850,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -816,7 +863,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -829,7 +876,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{12} + return file_protos_apricot_proto_rawDescGZIP(), []int{13} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -887,7 +934,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -900,7 +947,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -913,7 +960,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{13} + return file_protos_apricot_proto_rawDescGZIP(), []int{14} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -934,7 +981,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +994,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,7 +1007,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *HostGetRequest) GetDetector() string { @@ -981,7 +1028,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -994,7 +1041,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1007,7 +1054,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{16} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1031,7 +1078,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1044,7 +1091,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1057,7 +1104,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1101,7 +1148,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1114,7 +1161,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1127,7 +1174,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1162,7 +1209,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1175,7 +1222,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1188,7 +1235,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *CRUCardsResponse) GetCards() string { @@ -1210,7 +1257,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1223,7 +1270,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1236,7 +1283,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *CardRequest) GetHostname() string { @@ -1264,7 +1311,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1277,7 +1324,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1290,7 +1337,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1368,155 +1415,165 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x0a, 0x0e, 0x48, - 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, - 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, - 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, - 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, - 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, - 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, - 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, - 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, - 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, - 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, - 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, - 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xa4, 0x09, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, - 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, - 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, - 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, - 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, + 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, + 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, + 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, + 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, + 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, + 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, + 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, + 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, + 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, + 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, + 0x32, 0x83, 0x0a, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, + 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, + 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, + 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, + 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, + 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1532,7 +1589,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1546,26 +1603,27 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*RawGetRecursiveRequest)(nil), // 9: apricot.RawGetRecursiveRequest (*GetRuntimeEntryRequest)(nil), // 10: apricot.GetRuntimeEntryRequest (*SetRuntimeEntryRequest)(nil), // 11: apricot.SetRuntimeEntryRequest - (*ComponentEntriesQuery)(nil), // 12: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 13: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 14: apricot.ComponentEntriesResponse - (*HostGetRequest)(nil), // 15: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 16: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 17: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 18: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 19: apricot.CRUCardsResponse - (*CardRequest)(nil), // 20: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 21: apricot.CRUCardEndpointResponse - nil, // 22: apricot.ComponentRequest.VarStackEntry - nil, // 23: apricot.StringMap.StringMapEntry + (*ListRuntimeEntriesRequest)(nil), // 12: apricot.ListRuntimeEntriesRequest + (*ComponentEntriesQuery)(nil), // 13: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 14: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 15: apricot.ComponentEntriesResponse + (*HostGetRequest)(nil), // 16: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 17: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 18: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 19: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 20: apricot.CRUCardsResponse + (*CardRequest)(nil), // 21: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 22: apricot.CRUCardEndpointResponse + nil, // 23: apricot.ComponentRequest.VarStackEntry + nil, // 24: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 22, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 23, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 23, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 24, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 12, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 13, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty @@ -1573,32 +1631,34 @@ var file_protos_apricot_proto_depIdxs = []int32{ 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 20, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 21, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest 10, // 14: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 11, // 15: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 15, // 16: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest - 1, // 17: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 13, // 18: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 19: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 20: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 17, // 21: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 7, // 22: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 8, // 23: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 8, // 24: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 25: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 6, // 26: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 19, // 27: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 21, // 28: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 29: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 30: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 16, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 14, // 32: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 14, // 33: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 14, // 34: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 35: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 18, // 36: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 22, // [22:37] is the sub-list for method output_type - 7, // [7:22] is the sub-list for method input_type + 12, // 16: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 16, // 17: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 1, // 18: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 14, // 19: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 20: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 21: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 18, // 22: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 7, // 23: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 8, // 24: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 8, // 25: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 26: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 6, // 27: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 20, // 28: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 22, // 29: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 30: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 31: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 15, // 32: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 17, // 33: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 15, // 34: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 15, // 35: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 15, // 36: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 37: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 19, // 38: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 23, // [23:39] is the sub-list for method output_type + 7, // [7:23] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1743,7 +1803,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*ListRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -1755,7 +1815,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -1767,7 +1827,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -1779,7 +1839,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*ComponentEntriesResponse); i { case 0: return &v.state case 1: @@ -1791,7 +1851,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -1803,7 +1863,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -1815,7 +1875,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -1827,7 +1887,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -1839,7 +1899,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*CRUCardsResponse); i { case 0: return &v.state case 1: @@ -1851,6 +1911,18 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -1867,7 +1939,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[13].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -1877,7 +1949,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 23, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index dd3ecce9e..fe5d5fa9e 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -38,6 +38,7 @@ service Apricot { rpc GetEndpointsForCRUCard(CardRequest) returns (CRUCardEndpointResponse) {} rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} + rpc ListRuntimeEntries(ListRuntimeEntriesRequest) returns (ComponentEntriesResponse) {} rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} @@ -114,6 +115,10 @@ message SetRuntimeEntryRequest { string value = 3; } +message ListRuntimeEntriesRequest { + string component = 1; +} + message ComponentEntriesQuery { string component = 1; RunType runType = 2; diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index e9f7706fc..1cce508e5 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -27,6 +27,7 @@ type ApricotClient interface { GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) + ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -124,6 +125,15 @@ func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntry return out, nil } +func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { + out := new(ComponentEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ListRuntimeEntries", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) { out := new(HostEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) @@ -191,6 +201,7 @@ type ApricotServer interface { GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) + ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) @@ -230,6 +241,9 @@ func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEn func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") } +func (UnimplementedApricotServer) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRuntimeEntries not implemented") +} func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") } @@ -422,6 +436,24 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListRuntimeEntriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ListRuntimeEntries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ListRuntimeEntries", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ListRuntimeEntries(ctx, req.(*ListRuntimeEntriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HostGetRequest) if err := dec(in); err != nil { @@ -573,6 +605,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "SetRuntimeEntry", Handler: _Apricot_SetRuntimeEntry_Handler, }, + { + MethodName: "ListRuntimeEntries", + Handler: _Apricot_ListRuntimeEntries_Handler, + }, { MethodName: "GetHostInventory", Handler: _Apricot_GetHostInventory_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 7f61f328f..532c9afce 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -213,6 +213,22 @@ func (m *RpcServer) SetRuntimeEntry(_ context.Context, request *apricotpb.SetRun return &apricotpb.Empty{}, E_OK.Err() } +func (m *RpcServer) ListRuntimeEntries(_ context.Context, request *apricotpb.ListRuntimeEntriesRequest) (*apricotpb.ComponentEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + payload, err := m.service.ListRuntimeEntries(request.Component) + if err != nil { + return nil, err + } + return &apricotpb.ComponentEntriesResponse{Payload: payload}, E_OK.Err() +} + func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 7ff3f1b9f..fbacb461d 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -193,6 +193,18 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } +func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, err error) { + request := &apricotpb.ListRuntimeEntriesRequest{ + Component: component, + } + var response *apricotpb.ComponentEntriesResponse + response, err = c.cli.ListRuntimeEntries(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetPayload(), nil +} + func (c *RemoteService) GetHostInventory(detector string) (hosts []string, err error) { var response *apricotpb.HostEntriesResponse request := &apricotpb.HostGetRequest{Detector: detector} diff --git a/configuration/service.go b/configuration/service.go index 17144bc3d..f42620468 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -31,6 +31,7 @@ import ( type RuntimeService interface { GetRuntimeEntry(component string, key string) (string, error) SetRuntimeEntry(component string, key string, value string) error + ListRuntimeEntries(component string) ([]string, error) } type Service interface { From de46f3dfac2adf692d0ba4d9298abb157ffcadb6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jul 2021 11:12:30 +0200 Subject: [PATCH 0964/2352] [core] Add enabledif trait to VarSpec --- coconut/protos/o2control.pb.go | 488 +++++++++++++++++---------------- core/protos/o2control.pb.go | 488 +++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/repos/repoutils.go | 1 + core/serverutil.go | 1 + 5 files changed, 501 insertions(+), 478 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 4e1809402..8f00523ee 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -3500,7 +3500,8 @@ type VarSpecMessage struct { Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` - VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool + VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool + EnabledIf string `protobuf:"bytes,10,opt,name=enabledIf,proto3" json:"enabledIf,omitempty"` // JS expression that evaluates to bool } func (x *VarSpecMessage) Reset() { @@ -3598,6 +3599,13 @@ func (x *VarSpecMessage) GetVisibleIf() string { return "" } +func (x *VarSpecMessage) GetEnabledIf() string { + if x != nil { + return x.EnabledIf + } + return "" +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4968,7 +4976,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0xfc, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, @@ -4989,246 +4997,248 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, - 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, - 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, - 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, + 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, + 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, + 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, + 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, + 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, + 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, + 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 4e1809402..8f00523ee 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -3500,7 +3500,8 @@ type VarSpecMessage struct { Panel string `protobuf:"bytes,6,opt,name=panel,proto3" json:"panel,omitempty"` // hint for the UI on where to put or group the given variable input AllowedValues []string `protobuf:"bytes,7,rep,name=allowedValues,proto3" json:"allowedValues,omitempty"` // list of offered values from which to choose (only for some UiWidgets) Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` - VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool + VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool + EnabledIf string `protobuf:"bytes,10,opt,name=enabledIf,proto3" json:"enabledIf,omitempty"` // JS expression that evaluates to bool } func (x *VarSpecMessage) Reset() { @@ -3598,6 +3599,13 @@ func (x *VarSpecMessage) GetVisibleIf() string { return "" } +func (x *VarSpecMessage) GetEnabledIf() string { + if x != nil { + return x.EnabledIf + } + return "" +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4968,7 +4976,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0xfc, 0x03, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, @@ -4989,246 +4997,248 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, - 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, - 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, - 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, + 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, + 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, + 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, + 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, + 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, + 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, + 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index e731350fc..7fd7668b8 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -410,6 +410,7 @@ message VarSpecMessage { repeated string allowedValues = 7; // list of offered values from which to choose (only for some UiWidgets) int32 index = 8; string visibleIf = 9; // JS expression that evaluates to bool + string enabledIf = 10; // JS expression that evaluates to bool } message WorkflowTemplateInfo { diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 6f399ffcd..2c3ba103f 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -66,6 +66,7 @@ type VarSpec struct { AllowedValues []string `yaml:"values"` Index int32 `yaml:"index"` VisibleIf string `yaml:"visibleif"` + EnabledIf string `yaml:"enabledif"` } // AuxNode Use an auxiliary node struct that also carries its parent Name diff --git a/core/serverutil.go b/core/serverutil.go index 9ef8cfa84..1421aea30 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -236,6 +236,7 @@ func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*p AllowedValues: v.AllowedValues, Index: v.Index, VisibleIf: v.VisibleIf, + EnabledIf: v.EnabledIf, } ret[k] = vsm } From 9b1b926f33e973eecb6ef4da9ba127f7ff73392f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jul 2021 11:13:56 +0200 Subject: [PATCH 0965/2352] [build] Bump to v0.25.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d94d1b305..ae955eab7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 25 -VERSION_PATCH := 1 +VERSION_PATCH := 80 From d38b0d8fc37e409aa4a3f0db40f9404b639ab848 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jul 2021 17:02:22 +0200 Subject: [PATCH 0966/2352] [core][executor] Improve logging levels --- core/environment/manager.go | 15 ++++++++-- core/environment/transition_startactivity.go | 8 ++++-- core/environment/transition_stopactivity.go | 4 ++- core/integration/odc/handlers.go | 7 +++++ core/integration/odc/plugin.go | 30 ++++++++++++++++---- core/task/manager.go | 1 + executor/executable/basictaskcommon.go | 4 ++- executor/executable/controllabletask.go | 6 +++- executor/executable/task.go | 3 +- executor/executorcmd/client.go | 3 ++ 10 files changed, 67 insertions(+), 14 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 7f0a7d987..b11ee1c71 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" @@ -172,10 +173,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Deployment/configuration failure code path starts here envState := env.CurrentState() + log.WithField("partition", env.Id().String()).Errorf("environment deployment and configuration failed (%s)", workflowPath) log.WithField("state", envState). WithField("environment", env.Id().String()). WithError(err). - Warn("environment deployment and configuration failed, cleanup in progress") + WithField("level", infologger.IL_Devel). + Warn("environment deployment and configuration error, cleanup in progress") envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally @@ -191,8 +194,11 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] log.WithFields(logrus.Fields{ "killedCount": len(killedTasks), "lastEnvState": envState, + "level": infologger.IL_Support, + "partition": env.Id().String(), }). - Warn("environment deployment failed, tasks were cleaned up") + Info("environment deployment failed, tasks were cleaned up") + log.WithField("partition", env.Id().String()).Info("environment teardown complete") return env.id, err } @@ -522,8 +528,11 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str log.WithFields(logrus.Fields{ "killedCount": len(killedTasks), "lastEnvState": envState, + "level": infologger.IL_Support, + "partition": env.Id().String(), }). - Warn("environment deployment failed, tasks were cleaned up") + Info("environment deployment failed, tasks were cleaned up") + log.WithField("partition", env.Id().String()).Info("environment teardown complete") return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 3a7803657..b9736149a 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -60,7 +60,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { return } - log.WithField(infologger.Run, runNumber).Info("starting new run") + log.WithField(infologger.Run, runNumber). + WithField("partition", env.Id().String()). + Info("starting new run") env.currentRunNumber = runNumber args := controlcommands.PropertyMap{ @@ -98,7 +100,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { return tasksStateErrors } - log.WithField(infologger.Run, env.currentRunNumber).Info("run started") + log.WithField(infologger.Run, env.currentRunNumber). + WithField("partition", env.Id().String()). + Info("run started") env.sendEnvironmentEvent(&event.EnvironmentEvent{ EnvironmentID: env.Id().String(), State: "RUNNING", diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index b0df75768..eb7d45d8d 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -52,7 +52,9 @@ func (t StopActivityTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } - log.WithField(infologger.Run, env.currentRunNumber).Info("stopping run") + log.WithField(infologger.Run, env.currentRunNumber). + WithField("partition", env.Id().String()). + Info("stopping run") runNumber := env.currentRunNumber env.currentRunNumber = 0 diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 4ac4074f9..76dfd838f 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -30,6 +30,7 @@ import ( "fmt" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/integration/odc/odcutils" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" @@ -254,18 +255,24 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri err := doReset(ctx, odcClient, arguments, envId) if err != nil { log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", envId). Warn("ODC Reset call failed") } err = doTerminate(ctx, odcClient, arguments, envId) if err != nil { log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", envId). Warn("ODC Terminate call failed") } err = doShutdown(ctx, odcClient, arguments, envId) if err != nil { log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", envId). Warn("ODC Shutdown call failed") } return nil // We clobber the error because nothing can be done for a failed cleanup diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index e53d4118b..20e2ca118 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -35,6 +35,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" @@ -177,7 +178,10 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { err := handleConfigure(context.Background(), p.odcClient, arguments, topology, plugin, resources, envId) if err != nil { - log.WithError(err).Error("ODC error") + log.WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithError(err).Error("ODC error") + log.WithField("partition", envId).Error("EPN Configure call failed") } return } @@ -193,28 +197,44 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { err := handleStart(context.Background(), p.odcClient, arguments, envId) if err != nil { - log.WithError(err).Error("ODC error") + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + Error("ODC error") + log.WithField("partition", envId).Error("EPN Start call failed") } return } stack["Stop"] = func() (out string) { err := handleStop(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Error("ODC error") + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + Error("ODC error") + log.WithField("partition", envId).Error("EPN Stop call failed") } return } stack["Reset"] = func() (out string) { err := handleReset(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Error("ODC error") + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + Error("ODC error") + log.WithField("partition", envId).Error("EPN Reset call failed") } return } stack["EnsureCleanup"] = func() (out string) { err := handleCleanup(context.Background(), p.odcClient, nil, envId) if err != nil { - log.WithError(err).Error("ODC error") + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + Error("ODC error") + log.WithField("partition", envId).Error("EPN Cleanup sequence failed") } return } diff --git a/core/task/manager.go b/core/task/manager.go index d2b011e7c..0b90d99a8 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -831,6 +831,7 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { "reason": mesosStatus.GetReason().String(), "source": mesosStatus.GetSource().String(), "message": mesosStatus.GetMessage(), + "level": infologger.IL_Devel, }). Info("task inactive exception") taskIDValue := mesosStatus.GetTaskID().Value diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 98d6279fc..2048e3381 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -153,7 +153,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { "level": infologger.IL_Devel, }). Error("task terminated with error") - log.Errorf("task terminated with error: %s %s", + log.WithField("level", infologger.IL_Support). + Errorf("task terminated with error: %s %s", tciCommandStr, err.Error()) pendingState = mesos.TASK_FAILED @@ -180,6 +181,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { "errStdout": errStdout, "id": t.ti.TaskID.Value, "task": t.ti.Name, + "level": infologger.IL_Devel, }). Warning("failed to capture stdout or stderr of task") } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index bdd36c8c9..dde353a95 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -353,7 +353,8 @@ func (t *ControllableTask) Launch() error { "level": infologger.IL_Devel, }). Error("task terminated with error") - log.Errorf("task terminated with error: %s %s", + log.WithField("level", infologger.IL_Support). + Errorf("task terminated with error: %s %s", tciCommandStr, err.Error()) pendingState = mesos.TASK_FAILED @@ -379,6 +380,7 @@ func (t *ControllableTask) Launch() error { "id": t.ti.TaskID.Value, "task": t.ti.Name, "command": tciCommandStr, + "level": infologger.IL_Devel, }). Warning("failed to capture stdout or stderr of task") } @@ -493,6 +495,7 @@ func (t *ControllableTask) Kill() error { case commitResponse = <-commitDone: case <-time.After(KILL_TRANSITION_TIMEOUT): log.WithField("task", t.ti.TaskID.Value). + WithField("level", infologger.IL_Devel). Warn("teardown transition sequence timed out") } // timeout we should break @@ -507,6 +510,7 @@ func (t *ControllableTask) Kill() error { if commitResponse.transitionError != nil || len(cmd.Event) == 0 { log.WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). + WithField("level", infologger.IL_Devel). Warn("teardown transition sequence error") break } diff --git a/executor/executable/task.go b/executor/executable/task.go index 870e7e617..063b7cd47 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" mesos "github.com/mesos/mesos-go/api/v1/lib" @@ -90,7 +91,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE Debug("instantiating task") rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") - log.Infof("launching task %s", rawCommand) + log.WithField("level", infologger.IL_Support).Infof("launching task %s", rawCommand) } else { if err != nil { log.WithError(err).WithField("task", taskInfo.Name).Error("could not launch task") diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 0514f8032..c9edaccb2 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -34,6 +34,7 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/executor/executorcmd/nopb" "github.com/k0kubun/pp" "google.golang.org/grpc" @@ -148,12 +149,14 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er "details": status.Details(), "error": status.Err().Error(), "ppStatus": pp.Sprint(status), + "level": infologger.IL_Devel, }). Error("transition call error") err = errors.New(fmt.Sprintf("occplugin returned %s: %s", status.Code().String(), status.Message())) } else { err = errors.New("invalid gRPC status") r.log.WithField("error", "invalid gRPC status response received from occplugin"). + WithField("level", infologger.IL_Support). Error("transition call error") } return From 8d02186472361edb3d555ce36f2da6c8c2af7799 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Jul 2021 12:01:20 +0200 Subject: [PATCH 0967/2352] [core] Ensure the default values shipped to UI are overriden by Apricot --- core/repos/repoutils.go | 27 +++++++++++++++++---------- core/repos/varsource/varsource.go | 31 +++++++++++++++++++++++++++++++ core/server.go | 31 ++++++++++++++++++++++++++++++- 3 files changed, 78 insertions(+), 11 deletions(-) create mode 100644 core/repos/varsource/varsource.go diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 2c3ba103f..732050376 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -29,6 +29,7 @@ import ( "fmt" "io/ioutil" + "github.com/AliceO2Group/Control/core/repos/varsource" "gopkg.in/yaml.v3" ) @@ -57,16 +58,17 @@ type VarSpecMap map[string]VarSpec // VarSpec is the type of struct into which public variable information from workflows may be parsed type VarSpec struct { - DefaultValue string `yaml:"value"` - VarType string `yaml:"type"` - Label string `yaml:"label"` - Description string `yaml:"description"` - Widget string `yaml:"widget"` - Panel string `yaml:"panel" ` - AllowedValues []string `yaml:"values"` - Index int32 `yaml:"index"` - VisibleIf string `yaml:"visibleif"` - EnabledIf string `yaml:"enabledif"` + Source varsource.Source `yaml:"-"` + DefaultValue string `yaml:"value"` + VarType string `yaml:"type"` + Label string `yaml:"label"` + Description string `yaml:"description"` + Widget string `yaml:"widget"` + Panel string `yaml:"panel" ` + AllowedValues []string `yaml:"values"` + Index int32 `yaml:"index"` + VisibleIf string `yaml:"visibleif"` + EnabledIf string `yaml:"enabledif"` } // AuxNode Use an auxiliary node struct that also carries its parent Name @@ -112,6 +114,11 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { duplicateError := fmt.Errorf("duplicate public variable \"%s\" parsed, input workflow file invalid", k) return duplicateError } + if parentName == "vars" { + varSpec.Source = varsource.WorkflowVars + } else { + varSpec.Source = varsource.WorkflowDefaults + } // Update the map (*workflowVarInfo)[k] = varSpec diff --git a/core/repos/varsource/varsource.go b/core/repos/varsource/varsource.go new file mode 100644 index 000000000..f5740008a --- /dev/null +++ b/core/repos/varsource/varsource.go @@ -0,0 +1,31 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package varsource + +type Source int +const ( + WorkflowDefaults Source = iota + WorkflowVars +) diff --git a/core/server.go b/core/server.go index d416cd237..a3d83055f 100644 --- a/core/server.go +++ b/core/server.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/repos/varsource" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/product" @@ -558,16 +559,44 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo err.Error()).Err() } + // Behaviour: in AliECS, template resolution follows specific rules of variable priority + // Apricot defaults are the most defaulty, so in the context of VarSpec, which entails as a minimum + // a declaration of type default in the WFT, no Apricot default can ever override a VarSpec default, + // so we don't even need to access Apricot defaults at all. These are only used if a variable is + // read in the WFT but never declared. + // Therefore the only thing from Apricot that can affect the VarSpec is a vars entry, and due to + // priority rules, Apricot vars can only override WFT/TT defaults, because WFT/TT vars have higher + // priority than Apricot vars. This way we ensure that the GUI receives any default values as + // expected with the correct precedence order with respect to Apricot entries. + // Here we make sure that for each VarSpec entry sourced from the WFT: + // * if declared as default + // * if the same declaration exists as Apricot var -> override + // * else no change + // * else no change + vars := the.ConfSvc().GetVars() + workflowTemplateInfos := make([]*pb.WorkflowTemplateInfo, numWorkflows) i := 0 for repo, revisions := range workflowMap { for revision, templates := range revisions { for _, template := range templates { + // First we take care of overriding any WFT VarSpec defaults with Apricot vars + varSpecMap := template.VarInfo + for k, v := range varSpecMap { + if v.Source == varsource.WorkflowDefaults { // if this varSpec was declared as a default + if apricotValue, exists := vars[k]; exists { // and a corresponding Apricot var exists + v.DefaultValue = apricotValue + varSpecMap[k] = v + } + } + } + + // Finally, we build the protobuf response workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{ Repo: string(repo), Revision: string(revision), Template: template.Name, - VarSpecMap: VarSpecMapToPbVarSpecMap(template.VarInfo) } + VarSpecMap: VarSpecMapToPbVarSpecMap(varSpecMap) } i++ } } From da7cbfdc02dc1f603a936da7cecbfe967a24cba1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Aug 2021 17:08:22 +0200 Subject: [PATCH 0968/2352] [build] Bump to v0.26.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ae955eab7..97a281985 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 25 -VERSION_PATCH := 80 +VERSION_MINOR := 26 +VERSION_PATCH := 0 From 2163d3d8963b1ace7c450c2e93c03eacb5dc54e0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 Aug 2021 15:54:43 +0200 Subject: [PATCH 0969/2352] [core] Fix processing of critical basic task hooks --- core/environment/environment.go | 189 ++++++++++++++++++++------------ 1 file changed, 120 insertions(+), 69 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 66bc36ee3..67e1bdced 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -247,94 +248,144 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map return } - err := env.hookHandlerF(hooksToTrigger) - if err != nil { - for _, h := range hooksToTrigger { - errorMap[h] = err - } - return - } - - timeoutCh := make(chan *task.Task) - hookTimers := make(map[*task.Task]*time.Timer) + timeoutCh := make(chan string) + hookTimers := make(map[string]*time.Timer) for _, hook := range hooksToTrigger { timeout, _ := time.ParseDuration(hook.GetTraits().Timeout) - hookTimers[hook] = time.AfterFunc(timeout, + log.WithField("partition", env.Id().String()). + WithField("task", hook.GetName()). + WithField("taskId", hook.GetTaskId()). + WithField("command", hook.GetTaskCommandInfo().GetValue()). + WithField("args", hook.GetTaskCommandInfo().GetArguments()). + WithField("failedHost", hook.GetHostname()). + WithField("timeout", timeout.Seconds()). + Trace("setting timer for hook before triggering") + + tid := hook.GetTaskId() + hookTimers[tid] = time.AfterFunc(timeout, func() { - thisHook := hook - timeoutCh <- thisHook + timeoutCh <- tid }) } - successfulHooks := make(task.Tasks, 0) + doneCh := make(chan struct{}) - for { - select { - case e := <-env.incomingEvents: - switch evt := e.(type) { - case *event.BasicTaskTerminated: - tid := evt.GetOrigin().TaskId - thisHook := hooksToTrigger.GetByTaskId(tid.Value) - if thisHook == nil { - continue + go func() { + successfulHooks := make(task.Tasks, 0) + + for { + select { + case tid := <-timeoutCh: + log.WithField("taskId", tid).Debug("incoming hook timeout") + thisHook := hooksToTrigger.GetByTaskId(tid) + if thisHook != nil { + if _, hasTimer := hookTimers[tid]; !hasTimer { + log.WithField("partition", env.Id().String()). + WithField("task", thisHook.GetName()). + WithField("taskId", thisHook.GetTaskId()). + WithField("command", thisHook.GetTaskCommandInfo().GetValue()). + WithField("args", thisHook.GetTaskCommandInfo().GetArguments()). + WithField("failedHost", thisHook.GetHostname()). + WithField("level", infologger.IL_Devel). + Warn("timeout for hook but no timer in timers map") + } else { + log.WithField("partition", env.Id().String()). + WithField("task", thisHook.GetName()). + WithField("taskId", thisHook.GetTaskId()). + WithField("command", thisHook.GetTaskCommandInfo().GetValue()). + WithField("args", thisHook.GetTaskCommandInfo().GetArguments()). + WithField("failedHost", thisHook.GetHostname()). + WithField("level", infologger.IL_Devel). + Warn("hook response timed out") + delete(hookTimers, tid) + errorMap[thisHook] = fmt.Errorf("hook task %s timed out after %s", + thisHook.GetName(), thisHook.GetTraits().Timeout) + } } - hookTimers[thisHook].Stop() - delete(hookTimers, thisHook) - - if evt.ExitCode != 0 { - errorMap[thisHook] = fmt.Errorf("hook task %s finished with non-zero exit code %d (status %s)", - thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) - - log.WithField("task", thisHook.GetName()). - WithFields(logrus.Fields{ - "exitCode": evt.ExitCode, - "stdout": evt.Stdout, - "stderr": evt.Stderr, - "partition": env.Id().String(), - "finalMesosState": evt.FinalMesosState.String(), - }). - Warn("hook failed") - } else if !evt.VoluntaryTermination { - errorMap[thisHook] = fmt.Errorf("hook task %s involuntary termination with exit code %d (status %s)", - thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) - - log.WithField("task", thisHook.GetName()). - WithFields(logrus.Fields{ - "exitCode": evt.ExitCode, - "stdout": evt.Stdout, - "stderr": evt.Stderr, - "partition": env.Id().String(), - "finalMesosState": evt.FinalMesosState.String(), - }). - Warn("hook failed") - } else { - successfulHooks = append(successfulHooks, thisHook) - log.WithField("partition", env.Id().String()). - WithField("task", thisHook.GetName()).Trace("hook completed") + case e := <-env.incomingEvents: + if evt, ok := e.(*event.BasicTaskTerminated); ok { + tid := evt.GetOrigin().TaskId.Value + thisHook := hooksToTrigger.GetByTaskId(tid) + if thisHook == nil { + continue + } + + hookTimers[tid].Stop() + delete(hookTimers, tid) + + if evt.ExitCode != 0 { + errorMap[thisHook] = fmt.Errorf("hook task %s finished with non-zero exit code %d (status %s)", + thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) + + log.WithField("task", thisHook.GetName()). + WithFields(logrus.Fields{ + "exitCode": evt.ExitCode, + "stdout": evt.Stdout, + "stderr": evt.Stderr, + "partition": env.Id().String(), + "finalMesosState": evt.FinalMesosState.String(), + }). + Warn("hook failed") + } else if !evt.VoluntaryTermination { + errorMap[thisHook] = fmt.Errorf("hook task %s involuntary termination with exit code %d (status %s)", + thisHook.GetName(), evt.ExitCode, evt.FinalMesosState) + + log.WithField("task", thisHook.GetName()). + WithFields(logrus.Fields{ + "exitCode": evt.ExitCode, + "stdout": evt.Stdout, + "stderr": evt.Stderr, + "partition": env.Id().String(), + "finalMesosState": evt.FinalMesosState.String(), + }). + Warn("hook failed") + } else { + successfulHooks = append(successfulHooks, thisHook) + log.WithField("partition", env.Id().String()). + WithField("taskId", tid). + WithField("task", thisHook.GetName()). + Debug("hook completed") + } } + } - default: - continue + if len(hookTimers) == 0 { + break + } else { + keys := make([]string, 0) + for k, _ := range hookTimers { + keys = append(keys, k) + } + log.WithField("taskIds", strings.Join(keys, ",")). + WithField("successfulHooks", len(successfulHooks)). + WithField("level", infologger.IL_Devel). + Debugf("hook timeout timers still left: %d, next cycle", len(hookTimers)) } - case thisHook := <-timeoutCh: - log.WithField("partition", env.Id().String()). - WithField("task", thisHook.GetName()).Warn("hook response timed out") - delete(hookTimers, thisHook) - errorMap[thisHook] = fmt.Errorf("hook task %s timed out after %s", - thisHook.GetName(), thisHook.GetTraits().Timeout) } - if len(hookTimers) == 0 { - break + log.WithField("level", infologger.IL_Devel). + Debugf("hooks to trigger: %d, successful: %d", len(hooksToTrigger), len(successfulHooks)) + + if len(hooksToTrigger) == len(successfulHooks) { + errorMap = make(map[*task.Task]error) } - } + doneCh <- struct{}{} + }() - if len(hooksToTrigger) == len(successfulHooks) { - return make(map[*task.Task]error) + err := env.hookHandlerF(hooksToTrigger) + if err != nil { + for _, h := range hooksToTrigger { + errorMap[h] = err + hookTimers[h.GetTaskId()].Stop() + delete(hookTimers, h.GetTaskId()) + } + return } + <- doneCh + return } From c6d3fd0025340b25888b6d689d6e186fcdcf5302 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 Aug 2021 15:55:17 +0200 Subject: [PATCH 0970/2352] [build] Bump to v0.26.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 97a281985..37c57439d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 108c508abd592bfa5fca064c00e27ddf46e3d4a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Aug 2021 15:49:21 +0200 Subject: [PATCH 0971/2352] [core] Remove obsolete and verbose object printout --- core/integration/odc/handlers.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 76dfd838f..67a6c5ba8 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -34,7 +34,6 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/integration/odc/odcutils" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" - "github.com/k0kubun/pp" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/status" @@ -569,8 +568,6 @@ func printGrpcError(err error) error { "message": grpcStatus.Message(), "details": grpcStatus.Details(), "error": grpcStatus.Err().Error(), - "ppStatus": pp.Sprint(grpcStatus), - "ppErr": pp.Sprint(err), }). Trace("ODC call error") err = fmt.Errorf("ODC returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) From a94c46eaf07422df6da24daedd0484eacb3bcd1a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Aug 2021 15:58:15 +0200 Subject: [PATCH 0972/2352] [common] Add Del method to gera.StringWrapMap --- common/gera/stringmap.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index b707e2385..89359c70a 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -40,6 +40,7 @@ type StringMap interface { Get(key string) (string, bool) Set(key string, value string) bool + Del(key string) bool Flattened() (map[string]string, error) FlattenedParent() (map[string]string, error) @@ -186,6 +187,16 @@ func (w *StringWrapMap) Set(key string, value string) (ok bool) { return true } +func (w *StringWrapMap) Del(key string) (ok bool) { + if w == nil || w.theMap == nil { + return false + } + if _, exists := w.theMap[key]; exists { + delete(w.theMap, key) + } + return true +} + func (w *StringWrapMap) Has(key string) bool { _, ok := w.Get(key) return ok From da28cdfa0136d95ea854fe61d2979d87894df1c6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Aug 2021 16:00:18 +0200 Subject: [PATCH 0973/2352] [core] Extend run number validity timeframe to support pre/post hooks --- core/environment/environment.go | 23 ++++++++++++++++++++ core/environment/transition_startactivity.go | 7 +----- core/environment/transition_stopactivity.go | 2 -- core/workflow/callable/call.go | 2 -- 4 files changed, 24 insertions(+), 10 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 67e1bdced..a6fb62cbf 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,6 +29,7 @@ package environment import ( "errors" "fmt" + "strconv" "strings" "sync" "time" @@ -127,6 +128,21 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { + // If the event is START_ACTIVITY, we set up a new run number early on. + // This used to be done inside the transition_startactivity, but then the new RN isn't available to the + // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially + // to plugin hooks. + if e.Event == "START_ACTIVITY" { + runNumber, rnErr := the.ConfSvc().NewRunNumber() + if rnErr != nil { + e.Cancel(rnErr) + return + } + env.currentRunNumber = runNumber + rnString := strconv.FormatUint(uint64(runNumber), 10) + env.workflow.GetVars().Set("run_number", rnString) + env.workflow.GetVars().Set("runNumber", rnString) + } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { e.Cancel(errHooks) @@ -173,6 +189,13 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { e.Event, ) } + + // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. + if e.Event == "STOP_ACTIVITY" { + env.currentRunNumber = 0 + env.workflow.GetVars().Del("run_number") + env.workflow.GetVars().Del("runNumber") + } }, }, ) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index b9736149a..a5b4df2b3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -54,17 +54,12 @@ func (t StartActivityTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } - var runNumber uint32 - runNumber, err = the.ConfSvc().NewRunNumber() - if err != nil { - return - } + runNumber := env.currentRunNumber log.WithField(infologger.Run, runNumber). WithField("partition", env.Id().String()). Info("starting new run") - env.currentRunNumber = runNumber args := controlcommands.PropertyMap{ "runNumber": strconv.FormatUint(uint64(runNumber), 10), } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index eb7d45d8d..108db8d63 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -56,8 +56,6 @@ func (t StopActivityTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). Info("stopping run") runNumber := env.currentRunNumber - - env.currentRunNumber = 0 taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 472564113..8126d0b68 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -26,7 +26,6 @@ package callable import ( "fmt" - "strconv" texttemplate "text/template" "time" @@ -129,7 +128,6 @@ func (c *Call) Call() error { template.WrapPointer(&output), template.WrapPointer(&returnVar), } - c.VarStack["run_number"] = strconv.FormatUint(uint64(c.parentRole.GetCurrentRunNumber()), 10 ) c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() objStack := integration.PluginsInstance().ObjectStack(c) From 8acf112a59fe186d098eeec1f213ca163ea52934 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Aug 2021 16:04:26 +0200 Subject: [PATCH 0974/2352] [build] Bump to v0.26.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 37c57439d..240e52775 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From d9a54a189799aeb9c4bd96503b234ada5cc33b7a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Aug 2021 17:13:33 +0200 Subject: [PATCH 0975/2352] [core] Reset integration plugin connection backoff only if not READY --- core/integration/dcs/client.go | 2 ++ core/integration/ddsched/client.go | 4 +++- core/integration/odc/client.go | 4 +++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 393f78d05..74cc1bf15 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -104,7 +104,9 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) log.Debugf("DCS client %s", connState.String()) go notifyFunc(connState) case <- time.After(2 * time.Minute): + if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() + } case <- cxt.Done(): return } diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 165566721..fde723750 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -103,7 +103,9 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) log.Debugf("DD scheduler client %s", connState.String()) go notifyFunc(connState) case <- time.After(2 * time.Minute): - conn.ResetConnectBackoff() + if conn.GetState() != connectivity.Ready { + conn.ResetConnectBackoff() + } case <- cxt.Done(): return } diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go index 82a5b973a..c50202b87 100644 --- a/core/integration/odc/client.go +++ b/core/integration/odc/client.go @@ -103,7 +103,9 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) log.Debugf("ODC client %s", connState.String()) go notifyFunc(connState) case <- time.After(2 * time.Minute): - conn.ResetConnectBackoff() + if conn.GetState() != connectivity.Ready { + conn.ResetConnectBackoff() + } case <- cxt.Done(): return } From 25f04d395b253c450724b50d583e1cf5bfee1da7 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 22 Jul 2021 17:32:26 +0200 Subject: [PATCH 0976/2352] [repos] Extend support for ssh & local backends --- coconut/cmd/repo.go | 2 + coconut/cmd/repo_add.go | 4 +- core/config.go | 13 ++ core/repos/httpsrepo.go | 52 ++++++ core/repos/httpsrepo_test.go | 176 +++++++++++++++++++ core/repos/localrepo.go | 160 +++++++++++++++++ core/repos/localrepo_test.go | 101 +++++++++++ core/repos/repo.go | 302 +++++++++++++++++++++++++------- core/repos/repo_test.go | 36 ++++ core/repos/repomanager.go | 167 ++++++++++-------- core/repos/sshrepo.go | 51 ++++++ core/repos/sshrepo_test.go | 100 +++++++++++ core/server.go | 4 +- core/task/manager.go | 8 +- core/task/match.go | 5 +- core/workflow/aggregatorrole.go | 4 +- core/workflow/callrole.go | 2 +- core/workflow/includerole.go | 4 +- core/workflow/iteratorrole.go | 2 +- core/workflow/load.go | 4 +- core/workflow/role.go | 4 +- core/workflow/taskrole.go | 4 +- 22 files changed, 1045 insertions(+), 160 deletions(-) create mode 100644 core/repos/httpsrepo.go create mode 100644 core/repos/httpsrepo_test.go create mode 100644 core/repos/localrepo.go create mode 100644 core/repos/localrepo_test.go create mode 100644 core/repos/repo_test.go create mode 100644 core/repos/sshrepo.go create mode 100644 core/repos/sshrepo_test.go diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index 3b4a16a14..e398f0caa 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -44,6 +44,8 @@ When referencing a repository, the clone method should never be prepended. Examp ` + "```" + ` github.com/AliceO2Group/ControlWorkflows gitlab.cern.ch/tmrnjava/AliECS_conf/ +alio2-cr1-hv-web.cern.ch:/opt/git/ControlWorkflows +/home/flp/git/ControlWorkflows ` + "```" + ` By default, all short task and workflow names are assumed to be in the default repository (see ` + "`coconut repo list`" + ` command). diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index f631d2a77..0d0a8e955 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -52,7 +52,9 @@ Exhaustion of the aforementioned list results in a repo add failure. The ` + "`https://`" + ` prefix and ` + "`.git`" + ` suffix should always be omitted.`, Example: ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows`" + ` - * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev`", + * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev`" + ` + * ` + "`coconut repo add alio2-cr1-hv-web.cern.ch:/opt/git/ControlWorkflows --default-revision custom-rev`" + ` + * ` + "`coconut repo add /home/flp/git/ControlWorkflows`", Run: control.WrapCall(control.AddRepo), Args: cobra.ExactArgs(1), } diff --git a/core/config.go b/core/config.go index 2184f41ae..fa47e793e 100644 --- a/core/config.go +++ b/core/config.go @@ -90,6 +90,7 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) + viper.SetDefault("reposSshKey", filepath.Join(viper.GetString("coreWorkingDir"), "/.ssh/controlworkflows-mirror-key")) viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) @@ -141,6 +142,7 @@ func setFlags() error { pflag.String("metrics.address", viper.GetString("metrics.address"), "IP of metrics server") pflag.Int("metrics.port", viper.GetInt("metrics.port"), "Port of metrics server (listens on server.address)") pflag.String("metrics.path", viper.GetString("metrics.path"), "URI path to metrics endpoint") + pflag.String("reposSshKey", viper.GetString("reposSshKey"), "Path to a readable private ssh key for repo operations") pflag.Bool("summaryMetrics", viper.GetBool("summaryMetrics"), "Collect summary metrics for tasks launched per-offer-cycle, offer processing time, etc.") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") pflag.Bool("veryVerbose", viper.GetBool("veryVerbose"), "Very verbose logging") @@ -239,6 +241,14 @@ func checkWorkingDirRights() error { return nil } +func checkSshKeyRights() error { + err := unix.Access(viper.GetString("reposSshKey"), unix.R_OK) + if err != nil { + return errors.New("No read access for repos ssh key: \"" + viper.GetString("reposSshKey") + "\": " + err.Error()) + } + return nil +} + // Remove trailing '/' func sanitizeWorkingPath() { sanitizeWorkingPath := filepath.Clean(viper.GetString("coreWorkingDir")) @@ -270,6 +280,9 @@ func NewConfig() (err error) { if err = checkRepoDirRights(); err != nil { return } + if err = checkSshKeyRights(); err != nil { + log.Warning(err) + } sanitizeWorkingPath() if err = checkWorkingDirRights(); err != nil { return diff --git a/core/repos/httpsrepo.go b/core/repos/httpsrepo.go new file mode 100644 index 000000000..3aeabb5a4 --- /dev/null +++ b/core/repos/httpsrepo.go @@ -0,0 +1,52 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "net/url" + "path" +) + +type httpsRepo struct { + Repo +} + +func (r *httpsRepo) getUri() string { + u, _ := url.Parse(r.GetProtocol() + "://") + u.Path = path.Join(u.Path, r.HostingSite) + + u.Path = path.Join(u.Path, + r.Path, + r.RepoName) + + uri := u.String() + + return uri + ".git" +} + +func(r *httpsRepo) GetProtocol() string { + return "https" +} + diff --git a/core/repos/httpsrepo_test.go b/core/repos/httpsrepo_test.go new file mode 100644 index 000000000..88cd1cc2d --- /dev/null +++ b/core/repos/httpsrepo_test.go @@ -0,0 +1,176 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "net/url" + "path" + "testing" +) + +var httpTs = ts{ + Protocol: "https", + HostingSite: "github.com", + Path: "AliceO2Group", + RepoName: "ControlWorkflows", + DefaultRevision: "main", + RepoPath: "github.com/AliceO2Group/ControlWorkflows", + RepoPathDotGit: "github.com/AliceO2Group/ControlWorkflows.git", +} + +func TestNewRepoInvalidUrl(t *testing.T) { + repoPathInvalid := "site.com/path" + _, err := NewRepo(repoPathInvalid, "") + if err == nil { + t.Errorf("NewRepo() should fail if repo URL (non-file) can't be sliced into at least 3 parts") + } +} + +func TestNewRepoDotGit(t *testing.T) { + repo, err := NewRepo(httpTs.RepoPathDotGit, "") + if err != nil { + t.Errorf("NewRepo() shouldn't fail with valid inputs") + return + } + + if repo.getRepoName() != httpTs.RepoName { + t.Errorf("Repo's name was %s instead of %s", repo.getRepoName(), httpTs.RepoName) + } +} + +func TestNewRepoWithRevision(t *testing.T) { + revision := "dummy-revision" + repoPath := httpTs.RepoPath + "@" + revision + + repo, err := NewRepo(repoPath, httpTs.DefaultRevision) + if err != nil { + t.Errorf("Creating a new valid repo shouldn't error out") + return + } + + if repo.getRepoName() != httpTs.RepoName { + t.Errorf("Repo name was %s instead of %s", repo.getRepoName(), httpTs.RepoName) + return + } + + if repo.GetDefaultRevision() != httpTs.DefaultRevision { + t.Errorf("Repo's default revision was %s instead of %s", repo.getRevision(), httpTs.DefaultRevision) + return + } + + if repo.getRevision() != revision { + t.Errorf("Repo's revision should fall back to default revision, when latter specified. Got %s instead of %s", repo.getRevision(), revision) + } +} + +func TestNewRepoWithInvalidRevision(t *testing.T) { + revision := "dummy-revision" + repoPath := httpTs.RepoPath + "@" + revision + "@" + revision + + _, err := NewRepo(repoPath, httpTs.DefaultRevision) + if err == nil { + t.Errorf("Creating a new repo with an invalid revision should error out") + return + } +} + +func TestNewRepoHttps(t *testing.T) { + repo, err := NewRepo(httpTs.RepoPath, httpTs.DefaultRevision) + if err != nil { + t.Errorf("Creating a new valid repo shouldn't error out") + return + } + + if repo.GetProtocol() != httpTs.Protocol { + t.Errorf("Repo's default protocol was %s instead of %s", repo.GetProtocol(), httpTs.Protocol) + return + } + + if repo.getHostingSite() != httpTs.HostingSite { + t.Errorf("Repo's hosting site was %s instead of %s", repo.getHostingSite(), httpTs.HostingSite) + return + } + + if repo.getPath() != httpTs.Path { + t.Errorf("Repo's path was %s instead of %s", repo.getPath(), httpTs.Path) + return + } + + if repo.getRepoName() != httpTs.RepoName { + t.Errorf("Repo name was %s instead of %s", repo.getRepoName(), httpTs.RepoName) + return + } + + if repo.GetDefaultRevision() != httpTs.DefaultRevision { + t.Errorf("Repo's default revision was %s instead of %s", repo.getRevision(), httpTs.DefaultRevision) + return + } + + if repo.getRevision() != repo.GetDefaultRevision() { + t.Errorf("Repo's revision should fall back to default revision, when latter specified. Got %s instead of %s", repo.getRevision(), repo.GetDefaultRevision()) + } +} + +func TestGetUriHttps(t *testing.T) { + repo, _ := NewRepo(httpTs.RepoPath, "") + expectedUri := "https://" + httpTs.HostingSite + "/" + httpTs.Path + "/" + httpTs.RepoName + ".git" + + if repo.getUri() != expectedUri { + t.Errorf("Got %s URI instead of %s", repo.getUri(), expectedUri) + } +} + +func TestGetUriHttpsWithDotGit(t *testing.T) { + repo, _ := NewRepo(httpTs.RepoPathDotGit, "") + u, _ := url.Parse(httpTs.Protocol + "://") + u.Path = path.Join(u.Path, + httpTs.HostingSite, + httpTs.Path, + httpTs.RepoName) + expectedUri := u.String() + ".git" + + if repo.getUri() != expectedUri { + t.Errorf("Got %s URI instead of %s", repo.getUri(), expectedUri) + } + +} + +func TestGetIdentifierHttps(t *testing.T) { + repo, _ := NewRepo(httpTs.RepoPath, "") + expectedIdentifier := path.Join(httpTs.HostingSite, httpTs.Path, httpTs.RepoName) + + if repo.GetIdentifier() != expectedIdentifier { + t.Errorf("Got identifier %s instead of %s", repo.GetIdentifier(), expectedIdentifier) + } +} + +func TestGetIdentifierHttpsDotGit(t *testing.T) { + repo, _ := NewRepo(httpTs.RepoPathDotGit, "") + expectedIdentifier := path.Join(httpTs.HostingSite, httpTs.Path, httpTs.RepoName) + + if repo.GetIdentifier() != expectedIdentifier { + t.Errorf("Got identifier %s instead of %s", repo.GetIdentifier(), expectedIdentifier) + } +} \ No newline at end of file diff --git a/core/repos/localrepo.go b/core/repos/localrepo.go new file mode 100644 index 000000000..7cfffd5fb --- /dev/null +++ b/core/repos/localrepo.go @@ -0,0 +1,160 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "fmt" + "github.com/google/uuid" + "io/ioutil" + "net/url" + "path" + "path/filepath" + "strings" + "time" +) + +type localRepo struct { + Repo +} + +func (r *localRepo) GetCloneDir() string { + cloneDir := filepath.Join(r.Path, r.RepoName) + return cloneDir +} + +func (r *localRepo) getUri() string { + u, _ := url.Parse(r.GetProtocol() + "://") + u.Path = path.Join(u.Path, r.HostingSite) + + u.Path = path.Join(u.Path, + r.Path, + r.RepoName) + + uri := u.String() + + return uri + ".git" +} + +func (r *localRepo) getWorkflowDir() string { + return filepath.Join(r.GetCloneDir(), "workflows") +} + +func (r *localRepo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdentifier string) { + if !strings.Contains(loadTaskClass, "/") { + taskClassIdentifier = filepath.Join(r.GetIdentifier(), + "tasks", + loadTaskClass) + } else { + taskClassIdentifier = loadTaskClass + } + + taskClassIdentifier += "@" + r.GetHash() + + return +} + +func (r *localRepo) checkoutRevision(string) error { + // noop for local repo + return nil +} + +func (r *localRepo) refresh() error { + // noop for local repo + return nil +} + +func (r *localRepo) GetProtocol() string { + return "local" +} + +const timeout = 10 * time.Second +var timer = time.NewTimer(timeout) +var uuidHash string + +// GetHash returns a random UUID so that tasks may never be reused +func (r *localRepo) GetHash() string { + + // Generate a UUID and keep it generated for some time + // This is to allow task matching while creating an environment + // If a request comes while the timer is running, reset the timer + // New generation happens on-demand + + select { + case <-timer.C: + // timer is finished generate a new UUID + nuuid, _ := uuid.NewUUID() + uuidHash = nuuid.String() + timer.Reset(timeout) + default: + // simply reset timeout, keeping existing UUID + timer.Reset(timeout) + } + + return uuidHash +} + +// getRevisions should make sure that the revisions always contain only "local" +// the placeholder for the localRepo revision +func (r *localRepo) getRevisions(string, []string) ([]string, error) { + r.Revisions = []string{"local"} + return r.Revisions, nil +} + +func (r *localRepo) GetTaskTemplatePath(taskClassFile string) string { + return taskClassFile + +} + +// getWorkflows should always scan for templates, the concept of a template cache is not applicable here +// moreover, revision should always be "local", which is a placeholder for saying no revision applies +func (r *localRepo) getWorkflows(revisionPattern string, _ []string, _ bool) (TemplatesByRevision, error) { + if revisionPattern != r.GetDefaultRevision() || revisionPattern != "local" { + return nil, fmt.Errorf("only 'local' revision accepted for local repos") + } + + revision := "local" + templates := make(TemplatesByRevision) + + // Go through the filesystem to locate available templates + files, err := ioutil.ReadDir(r.getWorkflowDir()) + if err != nil { + return nil, err + } + for _, file := range files { + // Only return .yaml files + if strings.HasSuffix(file.Name(), ".yaml") { + templateName := strings.TrimSuffix(file.Name(), ".yaml") + workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) + isPublic, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + if err != nil { + return nil, err + } + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], + Template{templateName, isPublic, varSpecMap}) + } + } + + return templates, nil; +} \ No newline at end of file diff --git a/core/repos/localrepo_test.go b/core/repos/localrepo_test.go new file mode 100644 index 000000000..1d9829e3c --- /dev/null +++ b/core/repos/localrepo_test.go @@ -0,0 +1,101 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "net/url" + "path" + "testing" +) + +var localTs = ts{ + Protocol: "local", + HostingSite: "", + Path: "/home/user/git", + RepoName: "ControlWorkflows", + DefaultRevision: "local", + RepoPath: "/home/user/git/ControlWorkflows", + RepoPathDotGit: "/home/user/git/ControlWorkflows.git", +} + +func TestNewRepoLocal(t *testing.T) { + repo, err := NewRepo(localTs.RepoPath, localTs.DefaultRevision) + if err != nil { + t.Errorf("Creating a new valid repo shouldn't error out") + return + } + + if repo.GetProtocol() != localTs.Protocol { + t.Errorf("Repo's default protocol was %s instead of %s", repo.GetProtocol(), localTs.Protocol) + return + } + + if repo.getHostingSite() != localTs.HostingSite { + t.Errorf("Repo's hosting site was %s instead of %s", repo.getHostingSite(), localTs.HostingSite) + return + } + + if repo.getPath() != localTs.Path { + t.Errorf("Repo's path was %s instead of %s", repo.getPath(), localTs.Path) + return + } + + if repo.getRepoName() != localTs.RepoName { + t.Errorf("Repo name was %s instead of %s", repo.getRepoName(), localTs.RepoName) + return + } + + if repo.GetDefaultRevision() != localTs.DefaultRevision { + t.Errorf("Repo's default revision was %s instead of %s", repo.getRevision(), localTs.DefaultRevision) + return + } + + if repo.getRevision() != repo.GetDefaultRevision() { + t.Errorf("Repo's revision should fall back to default revision, when latter specified. Got %s instead of %s", repo.getRevision(), repo.GetDefaultRevision()) + } +} + +func TestGetIdentifierLocal(t *testing.T) { + repo, _ := NewRepo(localTs.RepoPath, "") + expectedIdentifier := localTs.Path + "/" + localTs.RepoName + + if repo.GetIdentifier() != expectedIdentifier { + t.Errorf("Got identifier %s instead of %s", repo.GetIdentifier(), expectedIdentifier) + } +} + +func TestGetUriLocal(t *testing.T) { + repo, _ := NewRepo(localTs.RepoPath, "") + u, _ := url.Parse(localTs.Protocol + "://") + u.Path = path.Join(u.Path, + localTs.HostingSite, + localTs.Path, + localTs.RepoName) + expectedUri := u.String() + ".git" + + if repo.getUri() != expectedUri { + t.Errorf("Got %s URI instead of %s", repo.getUri(), expectedUri) + } +} \ No newline at end of file diff --git a/core/repos/repo.go b/core/repos/repo.go index fde26acbc..faa37f407 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -31,31 +31,99 @@ import ( "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" "io/ioutil" + "net/url" "os" "os/exec" "path" "path/filepath" + "regexp" "strings" ) +type IRepo interface { + GetIdentifier() string + GetCloneDir() string + getCloneParentDirs() []string + getUri() string + getWorkflowDir() string + ResolveTaskClassIdentifier(string) string + ResolveSubworkflowTemplateIdentifier(string) string + checkoutRevision(string) error + refresh() error + gatherRevisions(*git.Repository) error + populateWorkflows(string, bool) error + getWorkflows(string, []string, bool) (TemplatesByRevision, error) + getHostingSite() string + GetProtocol() string + getPath() string + getRepoName() string + GetHash() string + getRevision() string + setRevision(string) + getRevisions(string, []string) ([]string, error) + GetRevisions() []string + GetDefaultRevision() string + //getAndSetDefaultRevisionFromRs() string + setDefaultRevision(string) + updateDefaultRevision(string) (string, error) + IsDefault() bool + setDefault(bool) + GetTaskTemplatePath(string) string +} + type Repo struct { - HostingSite string - User string - RepoName string - Revision string + HostingSite string + Path string + RepoName string + Revision string DefaultRevision string - Hash string - Default bool - Revisions []string + Hash string + Default bool + Revisions []string } -func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { - revSlice := strings.Split(repoPath, "@") +func resolveProtocolFromPath(repoPath string) string { + // https + // starts with github.com/gitlab.cern.ch + // i.e. has a '.' and no `:` before the first '/' + //[^.\/]*\.[^\/:]*\/.* + httpsRegex := `[^.\/]*\.[^\/:]*\/.*` + re := regexp.MustCompile(httpsRegex) + if re.Match([]byte(repoPath)) { + return "https" + } + + // ssh + // starts with "hostname:" + // i.e. has a single ":" before the path + //[^:]*:[^:]* + sshRegex := `[^:]*:[^:]*` + re = regexp.MustCompile(sshRegex) + if re.Match([]byte(repoPath)) { + return "ssh" + } + + // local + return "local" +} + +func NewRepo(repoPath string, defaultRevision string) (IRepo, error) { + + // Repo url resolution uses splitAfter(), so if the repoPath ends with "/", it will be split to an extra "" element + // messing up the resolution. Trim the potential suffix to mitigate the issue + repoPath = strings.TrimSuffix(repoPath, "/") + + protocol := resolveProtocolFromPath(repoPath) + if (protocol == "local") { + defaultRevision = "local" + } var repoUrlSlice []string var revision string + revSlice := strings.Split(repoPath, "@") + if len(revSlice) == 2 { //revision specified in the repo path repoUrlSlice = strings.Split(revSlice[0], "/") revision = revSlice[1] @@ -66,25 +134,61 @@ func NewRepo(repoPath string, defaultRevision string) (*Repo, error) { return &Repo{}, errors.New("Repo path resolution failed") } + // Discard the "/tasks*" part of the repoPath if this comes from a taskClass + tasksClassSlice := strings.Split(revSlice[0], "/tasks") + + if protocol == "https" { + repoUrlSlice = strings.Split(tasksClassSlice[0], "/") + } else if protocol == "ssh" { + sshSlice := strings.SplitAfter(tasksClassSlice[0], ":") + repoUrlSlice = strings.SplitAfter(sshSlice[1], "/") + repoUrlSlice = append([]string{sshSlice[0]}, repoUrlSlice...) + } else { // protocol == "local" + repoUrlSlice = strings.SplitAfter(tasksClassSlice[0], "/") + repoUrlSlice = append([]string{""}, repoUrlSlice...) + } + if len(repoUrlSlice) < 3 { - return &Repo{}, errors.New("Repo path resolution failed") + return &Repo{}, errors.New("repo path resolution failed") } - newRepo := Repo{repoUrlSlice[0], repoUrlSlice[1], - repoUrlSlice[2], revision, defaultRevision, "", false, nil} + newRepo := Repo{ + HostingSite: repoUrlSlice[0], + Path: path.Join(repoUrlSlice[1 : len(repoUrlSlice)-1]...), + RepoName: strings.TrimSuffix(repoUrlSlice[len(repoUrlSlice)-1], ".git"), + Revision: revision, + DefaultRevision: defaultRevision, + } + + if protocol == "ssh" { + sshRepo := &sshRepo{ + Repo: newRepo, + } + return sshRepo, nil + } else if protocol == "https" { + httpsRepo := &httpsRepo { + Repo: newRepo, + } + return httpsRepo, nil + } else if protocol == "local"{ + localRepo := &localRepo { + Repo: newRepo, + } + return localRepo, nil + } return &newRepo, nil } func (r *Repo) GetIdentifier() string { - return path.Join(r.HostingSite, r.User, r.RepoName) + return path.Join(r.HostingSite, r.Path, r.RepoName) } -func (r *Repo) getCloneDir() string { +func (r *Repo) GetCloneDir() string { + var cloneDir string rs := &RepoService{Svc: apricot.Instance()} - cloneDir := rs.GetReposPath() - cloneDir = filepath.Join(cloneDir, r.HostingSite, r.User, r.RepoName) - + cloneDir = rs.GetReposPath() + cloneDir = filepath.Join(cloneDir, r.HostingSite, r.Path, r.RepoName) return cloneDir } @@ -93,30 +197,40 @@ func (r *Repo) getCloneParentDirs() []string { cleanDir := rs.GetReposPath() cleanDirHostingSite := filepath.Join(cleanDir, r.HostingSite) - cleanDirUser := filepath.Join(cleanDirHostingSite, r.User) - ret := make([]string, 2) - ret[0] = cleanDirUser - ret[1] = cleanDirHostingSite - return ret + cleanDir = cleanDirHostingSite + dirs := strings.Split(strings.TrimPrefix(r.Path,"/"), "/") + var cleanDirs []string + + for _, d := range dirs { + cleanDir = filepath.Join(cleanDir, d) + cleanDirs = append([]string{cleanDir}, cleanDirs...) + } + cleanDirs = append(cleanDirs, cleanDirHostingSite) + + return cleanDirs } -func (r *Repo) getUrl() string { - return "https://" + - r.HostingSite + "/" + - r.User + "/" + - r.RepoName + ".git" +func (r *Repo) getUri() string { + u, _ := url.Parse(r.GetProtocol() + "://") + u.Path = path.Join(u.Path, r.HostingSite) + + u.Path = path.Join(u.Path, + r.Path, + r.RepoName) + + uri := u.String() + + return uri + ".git" } func (r *Repo) getWorkflowDir() string { - return filepath.Join(r.getCloneDir(), "workflows") + return filepath.Join(r.GetCloneDir(), "workflows") } func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdentifier string) { if !strings.Contains(loadTaskClass, "/") { - taskClassIdentifier = filepath.Join(r.HostingSite, - r.User, - r.RepoName, + taskClassIdentifier = filepath.Join(r.GetIdentifier(), "tasks", loadTaskClass) } else { @@ -131,9 +245,7 @@ func (r *Repo) ResolveTaskClassIdentifier(loadTaskClass string) (taskClassIdenti func (r *Repo) ResolveSubworkflowTemplateIdentifier(workflowTemplateExpr string) string { expr := workflowTemplateExpr if !strings.Contains(expr, "/") { - expr = filepath.Join(r.HostingSite, - r.User, - r.RepoName, + expr = filepath.Join(r.GetIdentifier(), "workflows", expr) } @@ -150,7 +262,7 @@ func (r *Repo) checkoutRevision(revision string) error { revision = r.Revision } - ref, err := git.PlainOpen(r.getCloneDir()) + ref, err := git.PlainOpen(r.GetCloneDir()) if err != nil { return err } @@ -165,33 +277,31 @@ func (r *Repo) checkoutRevision(revision string) error { } } - coCmd := exec.Command("git", "-C", r.getCloneDir(), "checkout", newHash.String()) + coCmd := exec.Command("git", "-C", r.GetCloneDir(), "checkout", newHash.String()) err = coCmd.Run() if err != nil { //try force in the (unlikely) case that something went wrong - coCmd = exec.Command("git", "-C", r.getCloneDir(), "checkout", "-f", newHash.String()) + coCmd = exec.Command("git", "-C", r.GetCloneDir(), "checkout", "-f", newHash.String()) err = coCmd.Run() if err != nil { return err } } - r.Hash = newHash.String() //Update repo hash - r.Revision = revision //Update repo revision + r.Revision = revision //Update repo revision return nil } func (r *Repo) refresh() error { - - ref, err := git.PlainOpen(r.getCloneDir()) + ref, err := git.PlainOpen(r.GetCloneDir()) if err != nil { return errors.New(err.Error() + ": " + r.GetIdentifier()) } err = ref.Fetch(&git.FetchOptions{ RemoteName: "origin", - Force: true, + Force: true, }) if err != nil && err != git.NoErrAlreadyUpToDate { @@ -208,7 +318,7 @@ func (r *Repo) refresh() error { // populate workflows on update or if empty if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { - err = r.populateWorkflows(r.getDefaultRevision(), true) + err = r.populateWorkflows(r.GetDefaultRevision(), true) if err != nil { return err } @@ -221,7 +331,7 @@ func (r *Repo) gatherRevisions(ref *git.Repository) error { var err error if ref == nil { - ref, err = git.PlainOpen(r.getCloneDir()) + ref, err = git.PlainOpen(r.GetCloneDir()) if err != nil { return errors.New(err.Error() + ": " + r.GetIdentifier()) } @@ -229,7 +339,9 @@ func (r *Repo) gatherRevisions(ref *git.Repository) error { var revs []string refs, err := ref.References() - if err != nil { return err } + if err != nil { + return err + } err = refs.ForEach(func(ref *plumbing.Reference) error { // The HEAD is omitted in a `git show-ref` so we ignore the symbolic // references, the HEAD @@ -244,7 +356,9 @@ func (r *Repo) gatherRevisions(ref *git.Repository) error { return nil }) - if err != nil { return err } + if err != nil { + return err + } r.Revisions = revs return nil @@ -290,7 +404,9 @@ func (r *Repo) populateWorkflows(revisionPattern string, clear bool) error { templateName := strings.TrimSuffix(file.Name(), ".yaml") workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) isPublic, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) - if err != nil { return err } + if err != nil { + return err + } templatesCache[RevisionKey(revision)] = append(templatesCache[RevisionKey(revision)], Template{templateName, isPublic, varSpecMap}) } @@ -311,7 +427,9 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo for _, revision := range revisionsMatched { if len(templatesCache[RevisionKey(revision)]) == 0 { err = r.populateWorkflows(revision, false) - if err != nil { return nil, err } + if err != nil { + return nil, err + } } for _, template := range templatesCache[RevisionKey(revision)] { // Check if workflow is public in case not allWorkflows requested @@ -324,11 +442,39 @@ func (r *Repo) getWorkflows(revisionPattern string, gitRefs []string, allWorkflo return templates, nil } -func (r*Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { +func (r *Repo) getHostingSite() string { + return r.HostingSite +} + +func (r *Repo) GetProtocol() string { + return "na" +} + +func (r *Repo) getPath() string { + return r.Path +} + +func (r *Repo) getRepoName() string { + return r.RepoName +} + +func (r *Repo) GetHash() string { + return r.Hash +} + +func (r *Repo) getRevision() string { + return r.Revision +} + +func (r *Repo) setRevision(revision string) { + r.Revision = revision +} + +func (r *Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]string, error) { var revisions []string // get a handle of the repo for go-git - ref, err := git.PlainOpen(r.getCloneDir()) + ref, err := git.PlainOpen(r.GetCloneDir()) if err != nil { return nil, errors.New(err.Error() + ": " + r.GetIdentifier()) } @@ -376,17 +522,46 @@ func (r*Repo) getRevisions(revisionPattern string, refPrefixes []string) ([]stri } } - return nil + return nil }) return revisions, nil } -func (r*Repo) updateDefaultRevision(revision string) (string, error) { +func (r *Repo) GetRevisions() []string { + return r.Revisions +} + +// TODO: What was the motivation of having this? +// Currently unused +func (r *Repo) getAndSetDefaultRevisionFromRs() string { + rs := &RepoService{Svc: apricot.Instance()} + revsMap, err := rs.GetRepoDefaultRevisions() + if err != nil { + return r.DefaultRevision + } + + if defaultRevision, ok := revsMap[r.GetIdentifier()]; ok { + r.DefaultRevision = defaultRevision + } + return r.DefaultRevision +} + +func (r *Repo) GetDefaultRevision() string { + + return r.DefaultRevision +} + +// setDefaultRevision simply assigns, doesn't check +func (r *Repo) setDefaultRevision(revision string) { + r.DefaultRevision = revision +} + +func (r *Repo) updateDefaultRevision(revision string) (string, error) { var refs []string refs = append(refs, refRemotePrefix, refTagPrefix) revisionsMatched, err := r.getRevisions(revision, refs) - if err != nil{ + if err != nil { return "", err } else if len(revisionsMatched) == 0 { revisionsMatched, err = r.getRevisions("*", refs) @@ -401,14 +576,17 @@ func (r*Repo) updateDefaultRevision(revision string) (string, error) { return "", nil } -func (r*Repo) getDefaultRevision() (string) { + +func (r *Repo) IsDefault() bool { + return r.Default +} + +func (r *Repo) setDefault(def bool) { + r.Default = def +} + +func (r *Repo) GetTaskTemplatePath(taskClassFile string) string { rs := &RepoService{Svc: apricot.Instance()} - revsMap, err := rs.GetRepoDefaultRevisions() - if err != nil { - return r.DefaultRevision - } - if defaultRevision, ok := revsMap[r.GetIdentifier()]; ok { - r.DefaultRevision = defaultRevision - } - return r.DefaultRevision + return filepath.Join(rs.GetReposPath(), taskClassFile) + } \ No newline at end of file diff --git a/core/repos/repo_test.go b/core/repos/repo_test.go new file mode 100644 index 000000000..1acfb5642 --- /dev/null +++ b/core/repos/repo_test.go @@ -0,0 +1,36 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +// ts is a helper testing struct for the repos package +type ts struct { + Protocol string + HostingSite string + Path string + RepoName string + DefaultRevision string + RepoPath string + RepoPathDotGit string +} \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index be8af6e0b..87866b36d 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/configuration" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/config" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -64,17 +65,17 @@ func Instance(service configuration.Service) *RepoManager { } type RepoManager struct { - repoList map[string]*Repo - defaultRepo *Repo - defaultRevision string + repoList map[string]IRepo + defaultRepo IRepo + defaultRevision string defaultRevisions map[string]string - mutex sync.Mutex - cService configuration.Service - rService *RepoService + mutex sync.Mutex + cService configuration.Service + rService *RepoService } func initializeRepos(service configuration.Service) *RepoManager { - rm := RepoManager{repoList: map[string]*Repo{}} + rm := RepoManager{repoList: map[string]IRepo{}} rm.cService = service rm.rService = &RepoService{Svc: service} @@ -134,8 +135,6 @@ func initializeRepos(service configuration.Service) *RepoManager { func (manager *RepoManager) discoverRepos() (repos []string, err error){ var hostingSites []string - var usernames []string - var someRepos []string hostingSites, err = filepath.Glob(filepath.Join(manager.rService.GetReposPath(), "*")) if err != nil { @@ -154,61 +153,59 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ for _, hostingSite := range hostingSites { // Get rid of invalid paths if !isValidPath(hostingSite) { continue } - usernames, err = filepath.Glob(hostingSite + "/*") - if err != nil { - return - } - for _, username := range usernames { - someRepos, err = filepath.Glob(username + "/*") - if err != nil { - return - } - for _, repo := range someRepos { //sanitize path - // Get rid of invalid paths - if !isValidPath(repo) { continue } - repoDir := manager.rService.GetReposPath() - repo, err = filepath.Rel(repoDir, repo) // trim repoDir - if err == nil { - repos = append(repos, repo) - } + // find .git dir + // everything above is "path", dir containing ".git" is repo + err = filepath.Walk(hostingSite, func(path string, info os.FileInfo, err error) error { + if info.IsDir() && info.Name() == ".git" { + // hack to "sanitize" the path + // i.e. don't include repos path + // don't include trailing "/.git" + repos = append(repos, strings.TrimPrefix(strings.TrimSuffix(path, "/.git"), + manager.rService.GetReposPath() + "/")) } + + return nil + }) + + if err != nil { + return } } return } -func (manager *RepoManager) checkAndSetDefaultRevision(repo *Repo) error { +func (manager *RepoManager) checkAndSetDefaultRevision(repo IRepo) error { // Decide if requested revision = defaultRevision -> if yes lock them together // We do this because, in the case where the revision was not specified, it would fall back to the default revision // As a result, subsequent changes to the default revision, within the scope of this function, should be followed by revision revIsDefault := false - if repo.DefaultRevision == repo.Revision { + if repo.GetDefaultRevision() == repo.getRevision() { revIsDefault = true } // Check that the defaultRevision is valid, i.e. can be checked out var prefixes []string prefixes = append(prefixes, refRemotePrefix, refTagPrefix) - matchedRevs, err := repo.getRevisions(repo.DefaultRevision, prefixes) + matchedRevs, err := repo.getRevisions(repo.GetDefaultRevision(), prefixes) if err != nil { return err } else if len(matchedRevs) == 0 { - log.Warning("Default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) - if repo.DefaultRevision != manager.defaultRevision { + log.Warning("Default revision " + repo.GetDefaultRevision() + " invalid for " + repo.GetIdentifier()) + if repo.GetDefaultRevision() != manager.defaultRevision { log.Warning("Defaulting to global default revision: " + manager.defaultRevision) - repo.DefaultRevision = manager.defaultRevision - matchedRevs, err = repo.getRevisions(repo.DefaultRevision, prefixes) + repo.setDefaultRevision(manager.defaultRevision) + matchedRevs, err = repo.getRevisions(repo.GetDefaultRevision(), prefixes) if err != nil { return err } else if len(matchedRevs) == 0 { - log.Warning("Global default revision " + repo.DefaultRevision + " invalid for " + repo.GetIdentifier()) + log.Warning("Global default revision " + repo.GetDefaultRevision() + " invalid for " + repo.GetIdentifier()) } else { // if the revision was the default revision, make sure we now follow the updated default revision if revIsDefault { - repo.Revision = repo.DefaultRevision + repo.setRevision(repo.GetDefaultRevision()) } return nil } @@ -218,19 +215,19 @@ func (manager *RepoManager) checkAndSetDefaultRevision(repo *Repo) error { matchedRevs, err = repo.getRevisions("master", prefixes) if err == nil && len(matchedRevs) != 0 { log.Warning("Defaulting to master") - repo.DefaultRevision = "master" + repo.setDefaultRevision("master") return nil } matchedRevs, err = repo.getRevisions("main", prefixes) if err == nil && len(matchedRevs) != 0 { log.Warning("Defaulting to main") - repo.DefaultRevision = "main" + repo.setDefaultRevision("main") return nil } - log.Warning("Cannot fall back to any default revision for %s", repo.RepoName) - return fmt.Errorf("cannot fall back to any default revision for %s", repo.RepoName) + log.Warning("Cannot fall back to any default revision for ", repo.GetIdentifier()) + return fmt.Errorf("cannot fall back to any default revision for %s", repo.GetIdentifier()) } return nil @@ -254,24 +251,39 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st if !exists { //Try to clone it var gitRepo *git.Repository - gitRepo, err = git.PlainClone(repo.getCloneDir(), false, &git.CloneOptions{ - URL: repo.getUrl(), - NoCheckout: true, - }) + if repo.GetProtocol() == "local" { // local repo needs only be opened + // TODO: persistent local repos? + gitRepo, err = git.PlainOpen(repo.GetCloneDir()) + } else { // https and ssh repos need to be cloned + var co git.CloneOptions + + // prepare clone options for ssh authorization + if repo.GetProtocol() == "ssh" { + co.Auth, err = ssh.NewPublicKeysFromFile("git", viper.GetString("reposSshKey"), "") + if err != nil { + return "", false, err + } + } + + co.URL = repo.getUri() + co.NoCheckout = true - if err != nil && err != git.ErrRepositoryAlreadyExists{ + gitRepo, err = git.PlainClone(repo.GetCloneDir(), false, &co) + } + + if err != nil && err != git.ErrRepositoryAlreadyExists { // Something went wrong, clean up cleanErr := cleanCloneParentDirs(repo.getCloneParentDirs()) if cleanErr != nil { return "", false, errors.New(err.Error() + " Failed to clean directories: " + cleanErr.Error()) } return "", false, err - } else { - // Make sure the repo is up to date and its structs are populated - err = repo.refresh() - if err != nil { - return "", false, err - } + } + + // Make sure the repo is up to date and its structs are populated + err = repo.refresh() + if err != nil { + return "", false, err } if gitRepo != nil { @@ -306,13 +318,13 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st } // Update default revisions - manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision + manager.defaultRevisions[repo.GetIdentifier()] = repo.GetDefaultRevision() err = manager.rService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { return "", false, err } - return repo.DefaultRevision, repo.DefaultRevision == manager.defaultRevision, nil + return repo.GetDefaultRevision(), repo.GetDefaultRevision()== manager.defaultRevision, nil } func cleanCloneParentDirs(parentDirs []string) error { @@ -331,14 +343,14 @@ func cleanCloneParentDirs(parentDirs []string) error { return nil } -func (manager *RepoManager) GetAllRepos() (repoList map[string]*Repo) { +func (manager *RepoManager) GetAllRepos() (repoList map[string]IRepo) { manager.mutex.Lock() defer manager.mutex.Unlock() return manager.repoList } -func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]*Repo) { +func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]IRepo) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -346,7 +358,7 @@ func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]*R return manager.repoList } - matchedRepoList := make(map[string]*Repo) + matchedRepoList := make(map[string]IRepo) g := glob.MustCompile(repoPattern) for _, repo := range manager.repoList { @@ -358,7 +370,7 @@ func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]*R return matchedRepoList } -func (manager *RepoManager) getRepoByIndex(index int) (*Repo, error) { +func (manager *RepoManager) getRepoByIndex(index int) (IRepo, error) { keys := manager.GetOrderedRepolistKeys() if len(keys) - 1 >= index { // Verify that index is not out of bounds return manager.repoList[keys[index]], nil @@ -378,9 +390,10 @@ func (manager *RepoManager) RemoveRepoByIndex(index int) (string, error) { return "", err } - wasDefault := repo.Default + wasDefault := repo.IsDefault() - _ = os.RemoveAll(repo.getCloneDir()) // Try, but don't crash if we fail + _ = os.RemoveAll(repo.GetCloneDir()) // Try, but don't crash if we fail + _ = cleanCloneParentDirs(repo.getCloneParentDirs()) // Try, but don't crash if we fail delete(manager.repoList, repo.GetIdentifier()) // Set as default the repo sitting on top of the list @@ -414,7 +427,7 @@ func (manager *RepoManager) RefreshRepos() error { for _, repo := range manager.repoList { - manager.defaultRevisions[repo.GetIdentifier()] = repo.getDefaultRevision() + manager.defaultRevisions[repo.GetIdentifier()] = repo.GetDefaultRevision() err := repo.refresh() if err != nil { return errors.New("refresh repo for " + repo.GetIdentifier() + ":" + err.Error()) @@ -445,7 +458,7 @@ func (manager *RepoManager) RefreshRepoByIndex(index int) error { return repo.refresh() } -func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowPath string, workflowRepo *Repo, err error) { +func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowPath string, workflowRepo IRepo, err error) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -477,13 +490,13 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP } if revision != "" { // If a revision has been specified, update the Repo - workflowRepo.Revision = revision + workflowRepo.setRevision(revision) } else { // Otherwise use the default revision of the repo - workflowRepo.Revision = workflowRepo.DefaultRevision + workflowRepo.setDefaultRevision(workflowRepo.GetDefaultRevision()) } // Make sure that HEAD is on the expected revision - err = workflowRepo.checkoutRevision(workflowRepo.Revision) + err = workflowRepo.checkoutRevision(workflowRepo.getRevision()) if err != nil { return } @@ -496,9 +509,9 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP return } -func (manager *RepoManager) setDefaultRepo(repo *Repo) { +func (manager *RepoManager) setDefaultRepo(repo IRepo) { if manager.defaultRepo != nil { - manager.defaultRepo.Default = false // Update old default repo + manager.defaultRepo.setDefault(false) // Update old default repo } // Update default_repo backend @@ -508,7 +521,7 @@ func (manager *RepoManager) setDefaultRepo(repo *Repo) { } manager.defaultRepo = repo - repo.Default = true + repo.setDefault(true) } func (manager *RepoManager) UpdateDefaultRepoByIndex(index int) error { @@ -567,7 +580,7 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str } // Update default revisions - manager.defaultRevisions[repo.GetIdentifier()] = repo.DefaultRevision + manager.defaultRevisions[repo.GetIdentifier()] = repo.GetDefaultRevision() err = manager.rService.SetRepoDefaultRevisions(manager.defaultRevisions) if err != nil { return "", err @@ -577,27 +590,29 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str } func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (err error) { - reposRequired := make(map[string]Repo) + reposRequired := make(map[string]IRepo) for _, taskClass := range taskClassesRequired { - var newRepo *Repo + var newRepo IRepo newRepo, err = NewRepo(taskClass, manager.defaultRevision) if err != nil { return } - reposRequired[newRepo.RepoName] = *newRepo + reposRequired[newRepo.GetIdentifier()] = newRepo } // Make sure that the relevant repos are present and checked out on the expected revision for _, repo := range reposRequired { + id := repo.GetIdentifier() + fmt.Println(id) existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { - _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.DefaultRevision) + _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.GetDefaultRevision()) if err != nil { return } } else { - if existingRepo.Revision != repo.Revision { - err = existingRepo.checkoutRevision(repo.Revision) + if existingRepo.getRevision() != repo.getRevision() { + err = existingRepo.checkoutRevision(repo.getRevision()) if err != nil { return } @@ -629,7 +644,7 @@ type Templates []Template type TemplatesByRevision map[RevisionKey]Templates type TemplatesByRepo map[RepoKey]TemplatesByRevision -// Returns a map of templates: repo -> revision -> []templates +// GetWorkflowTemplates Returns a map of templates: repo -> revision -> []templates func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPattern string, allBranches bool, allTags bool, allWorkflows bool) (TemplatesByRepo, int, error) { templateList := make(TemplatesByRepo) numTemplates := 0 @@ -660,7 +675,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat } // Build list of repos to iterate through by pattern or by index(single repo, if pattern is an int) - repos := make(map[string]*Repo) + repos := make(map[string]IRepo) if repoIndex, err := strconv.Atoi(repoPattern); err == nil { repo, err := manager.getRepoByIndex(repoIndex) if err != nil { @@ -676,7 +691,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat var templates TemplatesByRevision var err error if revisionPattern == "" { // If the revision pattern is empty, use the default revision - templates, err = repo.getWorkflows(repo.DefaultRevision, gitRefs, allWorkflows) + templates, err = repo.getWorkflows(repo.GetDefaultRevision(), gitRefs, allWorkflows) } else { templates, err = repo.getWorkflows(revisionPattern, gitRefs, allWorkflows) } diff --git a/core/repos/sshrepo.go b/core/repos/sshrepo.go new file mode 100644 index 000000000..c6b434ddb --- /dev/null +++ b/core/repos/sshrepo.go @@ -0,0 +1,51 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "net/url" + "path" +) + +type sshRepo struct { + Repo +} + +func (r *sshRepo) getUri() string { + u, _ := url.Parse(r.GetProtocol() + "://") + u.Path = path.Join(u.Path, "git@" + r.HostingSite) + + u.Path = path.Join(u.Path, + r.Path, + r.RepoName) + + uri := u.String() + + return uri + ".git" +} + +func(r *sshRepo) GetProtocol() string { + return "ssh" +} diff --git a/core/repos/sshrepo_test.go b/core/repos/sshrepo_test.go new file mode 100644 index 000000000..72749ec62 --- /dev/null +++ b/core/repos/sshrepo_test.go @@ -0,0 +1,100 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package repos + +import ( + "net/url" + "path" + "testing" +) + +var sshTs = ts{ + Protocol: "ssh", + HostingSite: "git-server:", + Path: "/opt/git", + RepoName: "ControlWorkflows", + DefaultRevision: "main", + RepoPath: "git-server:/opt/git/ControlWorkflows", + RepoPathDotGit: "git-server:/opt/git/ControlWorkflows.git", +} + +func TestGetUriSsh(t *testing.T) { + repo, _ := NewRepo(sshTs.RepoPath, "") + u, _ := url.Parse(sshTs.Protocol + "://git@" + sshTs.HostingSite) + u.Path = path.Join(u.Path, + sshTs.Path, + sshTs.RepoName) + expectedUri := u.String() + ".git" + + if repo.getUri() != expectedUri { + t.Errorf("Got %s URI instead of %s", repo.getUri(), expectedUri) + } +} + +func TestGetIdentifierSsh(t *testing.T) { + repo, _ := NewRepo(sshTs.RepoPath, "") + expectedIdentifier := path.Join(sshTs.HostingSite, sshTs.Path, sshTs.RepoName) + + if repo.GetIdentifier() != expectedIdentifier { + t.Errorf("Got identifier %s instead of %s", repo.GetIdentifier(), expectedIdentifier) + } +} + +func TestNewRepoSsh(t *testing.T) { + repo, err := NewRepo(sshTs.RepoPath, sshTs.DefaultRevision) + if err != nil { + t.Errorf("Creating a new valid repo shouldn't error out") + return + } + + if repo.GetProtocol() != sshTs.Protocol { + t.Errorf("Repo's default protocol was %s instead of %s", repo.GetProtocol(), sshTs.Protocol) + return + } + + if repo.getHostingSite() != sshTs.HostingSite { + t.Errorf("Repo's hosting site was %s instead of %s", repo.getHostingSite(), sshTs.HostingSite) + return + } + + if repo.getPath() != sshTs.Path { + t.Errorf("Repo's path was %s instead of %s", repo.getPath(), sshTs.Path) + return + } + + if repo.getRepoName() != sshTs.RepoName { + t.Errorf("Repo name was %s instead of %s", repo.getRepoName(), sshTs.RepoName) + return + } + + if repo.GetDefaultRevision() != sshTs.DefaultRevision { + t.Errorf("Repo's default revision was %s instead of %s", repo.getRevision(), sshTs.DefaultRevision) + return + } + + if repo.getRevision() != repo.GetDefaultRevision() { + t.Errorf("Repo's revision should fall back to default revision, when latter specified. Got %s instead of %s", repo.getRevision(), repo.GetDefaultRevision()) + } +} \ No newline at end of file diff --git a/core/server.go b/core/server.go index a3d83055f..c6e4f28ba 100644 --- a/core/server.go +++ b/core/server.go @@ -622,11 +622,11 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p repo := repoList[repoName] var revisions []string if req.GetRevisions { - revisions = repo.Revisions + revisions = repo.GetRevisions() } else { revisions = nil } - repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.Default, DefaultRevision: repo.DefaultRevision, Revisions: revisions} + repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.IsDefault(), DefaultRevision: repo.GetDefaultRevision(), Revisions: revisions} } return &pb.ListReposReply{Repos: repoInfos, GlobalDefaultRevision: viper.GetString("globalDefaultRevision")}, nil diff --git a/core/task/manager.go b/core/task/manager.go index 0b90d99a8..a83df1d3f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -29,7 +29,6 @@ import ( "errors" "fmt" "io/ioutil" - "path/filepath" "strings" "github.com/AliceO2Group/Control/common/event" @@ -173,7 +172,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err for _, taskClass := range taskClassesRequired { taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" - var repo *repos.Repo + var repo repos.IRepo repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision()) if err != nil { return @@ -183,8 +182,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } - rs := &repos.RepoService{Svc: the.ConfSvc()} - taskTemplatePath := filepath.Join(rs.GetReposPath(), taskClassFile) + taskTemplatePath := repo.GetTaskTemplatePath(taskClassFile) yamlData, err = ioutil.ReadFile(taskTemplatePath) if err != nil { return nil, err @@ -196,7 +194,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err } taskClassStruct.Identifier.repoIdentifier = repo.GetIdentifier() - taskClassStruct.Identifier.hash = repo.Hash + taskClassStruct.Identifier.hash = repo.GetHash() taskClassList = append(taskClassList, &taskClassStruct) } return taskClassList, nil diff --git a/core/task/match.go b/core/task/match.go index 03b69a904..aabb2361b 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -25,10 +25,10 @@ package task import ( - "github.com/mesos/mesos-go/api/v1/lib" + "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/resources" - "github.com/AliceO2Group/Control/core/task/channel" ) type Wants struct { @@ -38,6 +38,7 @@ type Wants struct { InboundChannels []channel.Inbound } +// K42: This is where the match between taskclass and taskmanager's classes happens func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { taskClass, ok := m.classes.getClass(descriptor.TaskClassName) if ok && taskClass != nil { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 8a439149f..b35bce066 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -29,8 +29,8 @@ import ( "strings" texttemplate "text/template" - "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -99,7 +99,7 @@ func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (r *aggregatorRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { if r == nil { return errors.New("role tree error when processing templates") } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 36ab117da..281f00cad 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -130,7 +130,7 @@ func (t *callRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *callRole) ProcessTemplates(_ *repos.Repo, _ LoadSubworkflowFunc) (err error) { +func (t *callRole) ProcessTemplates(_ repos.IRepo, _ LoadSubworkflowFunc) (err error) { if t == nil { return errors.New("role tree error when processing templates") } diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 90bbd12c1..30c168109 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -79,7 +79,7 @@ func (r *includeRole) MarshalYAML() (interface{}, error) { return nil, nil } -func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { if r == nil { return errors.New("role tree error when processing templates") } @@ -134,7 +134,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow // then the returned newWfRepo will reflect this, and any additionally nested includes will // default to the repo of their direct parent. var subWfRoot *aggregatorRole - var newWfRepo *repos.Repo + var newWfRepo repos.IRepo include := workflowRepo.ResolveSubworkflowTemplateIdentifier(r.Include) subWfRoot, newWfRepo, err = loadSubworkflow(include, r) if err != nil { diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index c26d2c876..dba89134e 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -148,7 +148,7 @@ func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (i *iteratorRole) ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { if i == nil { return errors.New("role tree error when processing templates") } diff --git a/core/workflow/load.go b/core/workflow/load.go index 6049286fb..d15e60a89 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -39,14 +39,14 @@ import ( "gopkg.in/yaml.v3" ) -type LoadSubworkflowFunc func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo *repos.Repo, err error) +type LoadSubworkflowFunc func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) // FIXME: workflowPath should be of type configuration.Path, not string func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var loadSubworkflow LoadSubworkflowFunc = - func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo *repos.Repo, err error) { + func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) { var resolvedWorkflowPath string resolvedWorkflowPath, workflowRepo, err = repoManager.GetWorkflow(workflowPathExpr) //Will fail if repo unknown diff --git a/core/workflow/role.go b/core/workflow/role.go index 62e6d21f1..46cf7733d 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -29,8 +29,8 @@ package workflow import ( - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -55,7 +55,7 @@ type Role interface { GenerateTaskDescriptors() task.Descriptors getConstraints() constraint.Constraints setParent(role Updatable) - ProcessTemplates(workflowRepo *repos.Repo, loadSubworkflow LoadSubworkflowFunc) error + ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) error GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 08dbc34ae..6654ca2a6 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -126,7 +126,7 @@ func (t *taskRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo, _ LoadSubworkflowFunc) (err error) { +func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc) (err error) { if t == nil { return errors.New("role tree error when processing templates") } @@ -171,7 +171,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo *repos.Repo, _ LoadSubworkflowF return } -func (t *taskRole) resolveTaskClassIdentifier(repo *repos.Repo) { +func (t *taskRole) resolveTaskClassIdentifier(repo repos.IRepo) { t.LoadTaskClass = repo.ResolveTaskClassIdentifier(t.LoadTaskClass) } From 2aa8e2a85da71e174f6a62ab95563eedac211ae7 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 18 Aug 2021 11:33:11 +0200 Subject: [PATCH 0977/2352] [config] Update default repos ssh key dir --- core/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config.go b/core/config.go index fa47e793e..cac396986 100644 --- a/core/config.go +++ b/core/config.go @@ -90,7 +90,7 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) - viper.SetDefault("reposSshKey", filepath.Join(viper.GetString("coreWorkingDir"), "/.ssh/controlworkflows-mirror-key")) + viper.SetDefault("reposSshKey", filepath.Join("/etc/o2/aliecs/.ssh/controlworkflows-mirror-key")) viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) From ddbddae7ada3fcf573a876fce58b7a0c43f1123c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 18 Aug 2021 11:33:27 +0200 Subject: [PATCH 0978/2352] [repo] Update coconut docs --- coconut/cmd/repo.go | 15 ++++++++++----- coconut/cmd/repo_add.go | 4 ++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index e398f0caa..36f9b310b 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -39,13 +39,18 @@ var repoCmd = &cobra.Command{ A valid workflow configuration repository must contain the directories ` + "`tasks`" + ` and ` + "`workflows`" + ` in its ` + "`master`" + ` branch. -When referencing a repository, the clone method should never be prepended. Examples of valid repository identifiers: +When referencing a repository, the clone method should never be prepended. Supported repo backends and their expected format are: +- https: [hostname]/[repo_path] +- ssh: [hostname]:[repo_path] +- local [repo_path] (local repo entries are ephemeral and will not survive a core restart) + +Examples of valid repository identifiers: ` + "```" + ` -github.com/AliceO2Group/ControlWorkflows -gitlab.cern.ch/tmrnjava/AliECS_conf/ -alio2-cr1-hv-web.cern.ch:/opt/git/ControlWorkflows -/home/flp/git/ControlWorkflows +github.com/AliceO2Group/ControlWorkflows (https) +gitlab.cern.ch/tmrnjava/AliECS_conf/ (https) +alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows (ssh) +/home/flp/git/ControlWorkflows (local filesystem - (*entry does not survive a core restart*)) ` + "```" + ` By default, all short task and workflow names are assumed to be in the default repository (see ` + "`coconut repo list`" + ` command). diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index 0d0a8e955..daffbdfb9 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -49,11 +49,11 @@ Exhaustion of the aforementioned list results in a repo add failure. 1) a repository identifier 2) a repository identifier coupled with the ` + "`--default-revision`" + ` flag (see examples below) -The ` + "`https://`" + ` prefix and ` + "`.git`" + ` suffix should always be omitted.`, +The protocol prefix should always be omitted.`, Example: ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows`" + ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev`" + ` - * ` + "`coconut repo add alio2-cr1-hv-web.cern.ch:/opt/git/ControlWorkflows --default-revision custom-rev`" + ` + * ` + "`coconut repo add alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows --default-revision custom-rev`" + ` * ` + "`coconut repo add /home/flp/git/ControlWorkflows`", Run: control.WrapCall(control.AddRepo), Args: cobra.ExactArgs(1), From 2a77e110b103bcf84a24c0a3f26aaf8684e5469e Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 18 Aug 2021 11:34:57 +0200 Subject: [PATCH 0979/2352] [misc] Remove leftover comment --- core/task/match.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/match.go b/core/task/match.go index aabb2361b..b6dd354bf 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -38,7 +38,7 @@ type Wants struct { InboundChannels []channel.Inbound } -// K42: This is where the match between taskclass and taskmanager's classes happens +// GetWantsForDescriptor matches between taskclass and taskmanager's classes func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { taskClass, ok := m.classes.getClass(descriptor.TaskClassName) if ok && taskClass != nil { From 4bea441da433a010ef26435dae0cf09c9ed8f293 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 18 Aug 2021 14:33:01 +0200 Subject: [PATCH 0980/2352] [repo] Split IRepo to exported and unexported interfaces --- core/repos/repo.go | 79 +++++++++++++++++++++++---------------- core/repos/repomanager.go | 47 ++++++++++++----------- core/task/manager.go | 6 +-- 3 files changed, 75 insertions(+), 57 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index faa37f407..f0399ae81 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -40,34 +40,39 @@ import ( "strings" ) -type IRepo interface { - GetIdentifier() string - GetCloneDir() string +type iRepo interface { + IRepo getCloneParentDirs() []string getUri() string getWorkflowDir() string - ResolveTaskClassIdentifier(string) string - ResolveSubworkflowTemplateIdentifier(string) string checkoutRevision(string) error refresh() error gatherRevisions(*git.Repository) error populateWorkflows(string, bool) error getWorkflows(string, []string, bool) (TemplatesByRevision, error) getHostingSite() string - GetProtocol() string + getPath() string getRepoName() string - GetHash() string getRevision() string setRevision(string) getRevisions(string, []string) ([]string, error) - GetRevisions() []string - GetDefaultRevision() string //getAndSetDefaultRevisionFromRs() string setDefaultRevision(string) updateDefaultRevision(string) (string, error) - IsDefault() bool setDefault(bool) +} + +type IRepo interface { + GetIdentifier() string + GetCloneDir() string + ResolveTaskClassIdentifier(string) string + ResolveSubworkflowTemplateIdentifier(string) string + GetProtocol() string + GetHash() string + GetRevisions() []string + GetDefaultRevision() string + IsDefault() bool GetTaskTemplatePath(string) string } @@ -108,14 +113,41 @@ func resolveProtocolFromPath(repoPath string) string { return "local" } -func NewRepo(repoPath string, defaultRevision string) (IRepo, error) { +func newRepo(repoPath string, defaultRevision string) (iRepo, error) { + + protocol, newRepo, err := NewRepo(repoPath, defaultRevision) + if err != nil { + return nil, err + } + + if protocol == "ssh" { + sshRepo := &sshRepo{ + Repo: newRepo, + } + return sshRepo, nil + } else if protocol == "https" { + httpsRepo := &httpsRepo { + Repo: newRepo, + } + return httpsRepo, nil + } else if protocol == "local"{ + localRepo := &localRepo { + Repo: newRepo, + } + return localRepo, nil + } + + return &newRepo, nil +} + +func NewRepo(repoPath string, defaultRevision string) (string, Repo, error) { // Repo url resolution uses splitAfter(), so if the repoPath ends with "/", it will be split to an extra "" element // messing up the resolution. Trim the potential suffix to mitigate the issue repoPath = strings.TrimSuffix(repoPath, "/") protocol := resolveProtocolFromPath(repoPath) - if (protocol == "local") { + if protocol == "local" { defaultRevision = "local" } @@ -131,7 +163,7 @@ func NewRepo(repoPath string, defaultRevision string) (IRepo, error) { repoUrlSlice = strings.Split(revSlice[0], "/") revision = defaultRevision } else { - return &Repo{}, errors.New("Repo path resolution failed") + return "", Repo{}, errors.New("repo path resolution failed") } // Discard the "/tasks*" part of the repoPath if this comes from a taskClass @@ -149,7 +181,7 @@ func NewRepo(repoPath string, defaultRevision string) (IRepo, error) { } if len(repoUrlSlice) < 3 { - return &Repo{}, errors.New("repo path resolution failed") + return "", Repo{}, errors.New("repo path resolution failed") } newRepo := Repo{ @@ -160,24 +192,7 @@ func NewRepo(repoPath string, defaultRevision string) (IRepo, error) { DefaultRevision: defaultRevision, } - if protocol == "ssh" { - sshRepo := &sshRepo{ - Repo: newRepo, - } - return sshRepo, nil - } else if protocol == "https" { - httpsRepo := &httpsRepo { - Repo: newRepo, - } - return httpsRepo, nil - } else if protocol == "local"{ - localRepo := &localRepo { - Repo: newRepo, - } - return localRepo, nil - } - - return &newRepo, nil + return protocol, newRepo, nil } func (r *Repo) GetIdentifier() string { diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 87866b36d..30785c8df 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -65,8 +65,8 @@ func Instance(service configuration.Service) *RepoManager { } type RepoManager struct { - repoList map[string]IRepo - defaultRepo IRepo + repoList map[string]iRepo + defaultRepo iRepo defaultRevision string defaultRevisions map[string]string mutex sync.Mutex @@ -75,7 +75,7 @@ type RepoManager struct { } func initializeRepos(service configuration.Service) *RepoManager { - rm := RepoManager{repoList: map[string]IRepo{}} + rm := RepoManager{repoList: map[string]iRepo{}} rm.cService = service rm.rService = &RepoService{Svc: service} @@ -176,7 +176,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ return } -func (manager *RepoManager) checkAndSetDefaultRevision(repo IRepo) error { +func (manager *RepoManager) checkAndSetDefaultRevision(repo iRepo) error { // Decide if requested revision = defaultRevision -> if yes lock them together // We do this because, in the case where the revision was not specified, it would fall back to the default revision // As a result, subsequent changes to the default revision, within the scope of this function, should be followed by revision @@ -241,7 +241,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st defaultRevision = manager.defaultRevision } - repo, err := NewRepo(repoPath, defaultRevision) + repo, err := newRepo(repoPath, defaultRevision) if err != nil { return "", false, err @@ -343,14 +343,14 @@ func cleanCloneParentDirs(parentDirs []string) error { return nil } -func (manager *RepoManager) GetAllRepos() (repoList map[string]IRepo) { +func (manager *RepoManager) GetAllRepos() (repoList map[string]iRepo) { manager.mutex.Lock() defer manager.mutex.Unlock() return manager.repoList } -func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]IRepo) { +func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]iRepo) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -358,7 +358,7 @@ func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]IR return manager.repoList } - matchedRepoList := make(map[string]IRepo) + matchedRepoList := make(map[string]iRepo) g := glob.MustCompile(repoPattern) for _, repo := range manager.repoList { @@ -370,7 +370,7 @@ func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]IR return matchedRepoList } -func (manager *RepoManager) getRepoByIndex(index int) (IRepo, error) { +func (manager *RepoManager) getRepoByIndex(index int) (iRepo, error) { keys := manager.GetOrderedRepolistKeys() if len(keys) - 1 >= index { // Verify that index is not out of bounds return manager.repoList[keys[index]], nil @@ -473,12 +473,13 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP // Resolve repo var workflowFile string workflowInfo := strings.Split(workflowPath, "/workflows/") + var wfRepo iRepo if len(workflowInfo) == 1 { // Repo not specified - workflowRepo = manager.defaultRepo + wfRepo = manager.defaultRepo workflowFile = workflowInfo[0] } else if len(workflowInfo) == 2 { // Repo specified - try to find it - workflowRepo= manager.repoList[workflowInfo[0]] - if workflowRepo == nil { + wfRepo= manager.repoList[workflowInfo[0]] + if wfRepo == nil { err = errors.New("Workflow comes from an unknown repo") return } @@ -490,13 +491,13 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP } if revision != "" { // If a revision has been specified, update the Repo - workflowRepo.setRevision(revision) + wfRepo.setRevision(revision) } else { // Otherwise use the default revision of the repo - workflowRepo.setDefaultRevision(workflowRepo.GetDefaultRevision()) + wfRepo.setDefaultRevision(wfRepo.GetDefaultRevision()) } // Make sure that HEAD is on the expected revision - err = workflowRepo.checkoutRevision(workflowRepo.getRevision()) + err = wfRepo.checkoutRevision(wfRepo.getRevision()) if err != nil { return } @@ -504,12 +505,14 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP if !strings.HasSuffix(workflowFile, ".yaml") { //Add trailing ".yaml" workflowFile += ".yaml" } - resolvedWorkflowPath = filepath.Join(workflowRepo.getWorkflowDir(), workflowFile) + resolvedWorkflowPath = filepath.Join(wfRepo.getWorkflowDir(), workflowFile) + + workflowRepo = IRepo(wfRepo) return } -func (manager *RepoManager) setDefaultRepo(repo IRepo) { +func (manager *RepoManager) setDefaultRepo(repo iRepo) { if manager.defaultRepo != nil { manager.defaultRepo.setDefault(false) // Update old default repo } @@ -590,14 +593,14 @@ func (manager *RepoManager) UpdateDefaultRevisionByIndex(index int, revision str } func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (err error) { - reposRequired := make(map[string]IRepo) + reposRequired := make(map[string]iRepo) for _, taskClass := range taskClassesRequired { - var newRepo IRepo - newRepo, err = NewRepo(taskClass, manager.defaultRevision) + var taskRepo iRepo + taskRepo, err = newRepo(taskClass, manager.defaultRevision) if err != nil { return } - reposRequired[newRepo.GetIdentifier()] = newRepo + reposRequired[taskRepo.GetIdentifier()] = taskRepo } // Make sure that the relevant repos are present and checked out on the expected revision @@ -675,7 +678,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat } // Build list of repos to iterate through by pattern or by index(single repo, if pattern is an int) - repos := make(map[string]IRepo) + repos := make(map[string]iRepo) if repoIndex, err := strconv.Atoi(repoPattern); err == nil { repo, err := manager.getRepoByIndex(repoIndex) if err != nil { diff --git a/core/task/manager.go b/core/task/manager.go index a83df1d3f..0a245d23a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -172,12 +172,12 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err for _, taskClass := range taskClassesRequired { taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" - var repo repos.IRepo - repo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision()) + var tempRepo repos.Repo + _, tempRepo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision()) if err != nil { return } - repo = repoManager.GetAllRepos()[repo.GetIdentifier()] //get repo pointer from repomanager + repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] //get IRepo pointer from RepoManager if repo == nil { //should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } From 78ec01f8a0d4d61a6dfdd6595472fc2ac1a5fb2d Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 24 Aug 2021 17:12:24 +0200 Subject: [PATCH 0981/2352] [core] Bookkeeping bypass jwtToken --- core/bookkeeping/api.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 57484659a..4157389c7 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -40,6 +40,9 @@ import ( var log = logger.New(logrus.StandardLogger(), "Bookkeeping") +// [O2-2512]: Until JWT becomes optional or provided by BK +const jwtToken = "token" + type BookkeepingWrapper struct{} var ( @@ -53,11 +56,11 @@ func Instance() *BookkeepingWrapper { apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) if err == nil { apiUrl.Path = path.Join( apiUrl.Path + "api") - clientAPI.InitializeApi(apiUrl.String(), getJWTAPIToken()) + clientAPI.InitializeApi(apiUrl.String(), jwtToken) } else { log.WithField("error", err.Error()). Error("unable to parse the Bookkeeping base URL") - clientAPI.InitializeApi(viper.GetString("bookkeepingBaseUri")+"/api", getJWTAPIToken()) + clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), jwtToken) } }) return instance From 2a9b98319652d0060d566172b5f4a691d0177de6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Aug 2021 16:46:33 +0200 Subject: [PATCH 0982/2352] [core][apricot] Add proto calls for detector queries --- apricot/protos/apricot.pb.go | 740 ++++++----- apricot/protos/apricot.proto | 19 +- apricot/protos/apricot_grpc.pb.go | 150 ++- coconut/protos/o2control.pb.go | 1799 ++++++++++++++------------- coconut/protos/o2control_grpc.pb.go | 36 + core/protos/o2control.pb.go | 1799 ++++++++++++++------------- core/protos/o2control.proto | 6 + core/protos/o2control_grpc.pb.go | 36 + 8 files changed, 2527 insertions(+), 2058 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index a7d2c2139..78dad3f65 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -419,6 +419,53 @@ func (x *HostRequest) GetHostname() string { return "" } +type HostsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hosts []string `protobuf:"bytes,1,rep,name=hosts,proto3" json:"hosts,omitempty"` +} + +func (x *HostsRequest) Reset() { + *x = HostsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HostsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HostsRequest) ProtoMessage() {} + +func (x *HostsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HostsRequest.ProtoReflect.Descriptor instead. +func (*HostsRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{5} +} + +func (x *HostsRequest) GetHosts() []string { + if x != nil { + return x.Hosts + } + return nil +} + type DetectorResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -430,7 +477,7 @@ type DetectorResponse struct { func (x *DetectorResponse) Reset() { *x = DetectorResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -443,7 +490,7 @@ func (x *DetectorResponse) String() string { func (*DetectorResponse) ProtoMessage() {} func (x *DetectorResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -456,7 +503,7 @@ func (x *DetectorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorResponse.ProtoReflect.Descriptor instead. func (*DetectorResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{5} + return file_protos_apricot_proto_rawDescGZIP(), []int{6} } func (x *DetectorResponse) GetPayload() string { @@ -477,7 +524,7 @@ type RunNumberResponse struct { func (x *RunNumberResponse) Reset() { *x = RunNumberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -490,7 +537,7 @@ func (x *RunNumberResponse) String() string { func (*RunNumberResponse) ProtoMessage() {} func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -503,7 +550,7 @@ func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. func (*RunNumberResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{6} + return file_protos_apricot_proto_rawDescGZIP(), []int{7} } func (x *RunNumberResponse) GetRunNumber() uint32 { @@ -524,7 +571,7 @@ type StringMap struct { func (x *StringMap) Reset() { *x = StringMap{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -537,7 +584,7 @@ func (x *StringMap) String() string { func (*StringMap) ProtoMessage() {} func (x *StringMap) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -550,7 +597,7 @@ func (x *StringMap) ProtoReflect() protoreflect.Message { // Deprecated: Use StringMap.ProtoReflect.Descriptor instead. func (*StringMap) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{7} + return file_protos_apricot_proto_rawDescGZIP(), []int{8} } func (x *StringMap) GetStringMap() map[string]string { @@ -571,7 +618,7 @@ type RawGetRecursiveRequest struct { func (x *RawGetRecursiveRequest) Reset() { *x = RawGetRecursiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -584,7 +631,7 @@ func (x *RawGetRecursiveRequest) String() string { func (*RawGetRecursiveRequest) ProtoMessage() {} func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -597,7 +644,7 @@ func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{8} + return file_protos_apricot_proto_rawDescGZIP(), []int{9} } func (x *RawGetRecursiveRequest) GetRawPath() string { @@ -619,7 +666,7 @@ type GetRuntimeEntryRequest struct { func (x *GetRuntimeEntryRequest) Reset() { *x = GetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -632,7 +679,7 @@ func (x *GetRuntimeEntryRequest) String() string { func (*GetRuntimeEntryRequest) ProtoMessage() {} func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -645,7 +692,7 @@ func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*GetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{9} + return file_protos_apricot_proto_rawDescGZIP(), []int{10} } func (x *GetRuntimeEntryRequest) GetComponent() string { @@ -675,7 +722,7 @@ type SetRuntimeEntryRequest struct { func (x *SetRuntimeEntryRequest) Reset() { *x = SetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -688,7 +735,7 @@ func (x *SetRuntimeEntryRequest) String() string { func (*SetRuntimeEntryRequest) ProtoMessage() {} func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -701,7 +748,7 @@ func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*SetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{10} + return file_protos_apricot_proto_rawDescGZIP(), []int{11} } func (x *SetRuntimeEntryRequest) GetComponent() string { @@ -736,7 +783,7 @@ type ListRuntimeEntriesRequest struct { func (x *ListRuntimeEntriesRequest) Reset() { *x = ListRuntimeEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -749,7 +796,7 @@ func (x *ListRuntimeEntriesRequest) String() string { func (*ListRuntimeEntriesRequest) ProtoMessage() {} func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -762,7 +809,7 @@ func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRuntimeEntriesRequest.ProtoReflect.Descriptor instead. func (*ListRuntimeEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{11} + return file_protos_apricot_proto_rawDescGZIP(), []int{12} } func (x *ListRuntimeEntriesRequest) GetComponent() string { @@ -785,7 +832,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -798,7 +845,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -811,7 +858,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{12} + return file_protos_apricot_proto_rawDescGZIP(), []int{13} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -850,7 +897,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -863,7 +910,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -876,7 +923,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{13} + return file_protos_apricot_proto_rawDescGZIP(), []int{14} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -934,7 +981,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +994,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,7 +1007,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -970,6 +1017,53 @@ func (x *ComponentEntriesResponse) GetPayload() []string { return nil } +type DetectorsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *DetectorsResponse) Reset() { + *x = DetectorsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorsResponse) ProtoMessage() {} + +func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorsResponse.ProtoReflect.Descriptor instead. +func (*DetectorsResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{16} +} + +func (x *DetectorsResponse) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + type HostGetRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -981,7 +1075,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -994,7 +1088,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1007,7 +1101,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *HostGetRequest) GetDetector() string { @@ -1028,7 +1122,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1041,7 +1135,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1054,7 +1148,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1078,7 +1172,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1091,7 +1185,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1104,7 +1198,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1148,7 +1242,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1161,7 +1255,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1174,7 +1268,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1209,7 +1303,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1222,7 +1316,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1235,7 +1329,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *CRUCardsResponse) GetCards() string { @@ -1257,7 +1351,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1270,7 +1364,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1283,7 +1377,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{22} } func (x *CardRequest) GetHostname() string { @@ -1311,7 +1405,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1324,7 +1418,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1337,7 +1431,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{21} + return file_protos_apricot_proto_rawDescGZIP(), []int{23} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1386,194 +1480,208 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x29, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, + 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, + 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, + 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, + 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, + 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, - 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, - 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, - 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, - 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, - 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, - 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, - 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, - 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, - 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, - 0x32, 0x83, 0x0a, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, - 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, + 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, + 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, + 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, + 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, + 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, + 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, + 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, + 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, + 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, + 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, + 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, + 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x8f, 0x0b, 0x0a, 0x07, 0x41, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, + 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, + 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, + 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x4c, + 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, - 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, - 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, - 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, - 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, + 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, + 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, - 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1589,7 +1697,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 26) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1597,68 +1705,74 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ComponentRequest)(nil), // 3: apricot.ComponentRequest (*ComponentResponse)(nil), // 4: apricot.ComponentResponse (*HostRequest)(nil), // 5: apricot.HostRequest - (*DetectorResponse)(nil), // 6: apricot.DetectorResponse - (*RunNumberResponse)(nil), // 7: apricot.RunNumberResponse - (*StringMap)(nil), // 8: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 9: apricot.RawGetRecursiveRequest - (*GetRuntimeEntryRequest)(nil), // 10: apricot.GetRuntimeEntryRequest - (*SetRuntimeEntryRequest)(nil), // 11: apricot.SetRuntimeEntryRequest - (*ListRuntimeEntriesRequest)(nil), // 12: apricot.ListRuntimeEntriesRequest - (*ComponentEntriesQuery)(nil), // 13: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 14: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 15: apricot.ComponentEntriesResponse - (*HostGetRequest)(nil), // 16: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 17: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 18: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 19: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 20: apricot.CRUCardsResponse - (*CardRequest)(nil), // 21: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 22: apricot.CRUCardEndpointResponse - nil, // 23: apricot.ComponentRequest.VarStackEntry - nil, // 24: apricot.StringMap.StringMapEntry + (*HostsRequest)(nil), // 6: apricot.HostsRequest + (*DetectorResponse)(nil), // 7: apricot.DetectorResponse + (*RunNumberResponse)(nil), // 8: apricot.RunNumberResponse + (*StringMap)(nil), // 9: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 10: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 11: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 12: apricot.SetRuntimeEntryRequest + (*ListRuntimeEntriesRequest)(nil), // 13: apricot.ListRuntimeEntriesRequest + (*ComponentEntriesQuery)(nil), // 14: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 15: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 16: apricot.ComponentEntriesResponse + (*DetectorsResponse)(nil), // 17: apricot.DetectorsResponse + (*HostGetRequest)(nil), // 18: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 19: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 20: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 21: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 22: apricot.CRUCardsResponse + (*CardRequest)(nil), // 23: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 24: apricot.CRUCardEndpointResponse + nil, // 25: apricot.ComponentRequest.VarStackEntry + nil, // 26: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 23, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 24, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 25, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 26, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 13, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 14, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty - 9, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 5, // 11: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest - 5, // 12: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 21, // 13: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest - 10, // 14: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 11, // 15: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 12, // 16: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 16, // 17: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest - 1, // 18: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 14, // 19: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 20: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 21: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 18, // 22: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 7, // 23: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 8, // 24: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 8, // 25: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 26: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 6, // 27: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 20, // 28: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 22, // 29: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 30: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 31: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 15, // 32: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 17, // 33: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 15, // 34: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 15, // 35: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 15, // 36: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 37: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 19, // 38: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 23, // [23:39] is the sub-list for method output_type - 7, // [7:23] is the sub-list for method input_type + 10, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 1, // 11: apricot.Apricot.ListDetectors:input_type -> apricot.Empty + 18, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 5, // 13: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest + 6, // 14: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest + 5, // 15: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest + 23, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 11, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 12, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 13, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 1, // 20: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 15, // 21: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 22: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 23: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 20, // 24: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 8, // 25: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 9, // 26: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 9, // 27: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 28: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 17, // 29: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 19, // 30: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 7, // 31: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 17, // 32: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 22, // 33: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 24, // 34: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 35: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 36: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 16, // 37: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 16, // 38: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 16, // 39: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 16, // 40: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 41: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 21, // 42: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 25, // [25:43] is the sub-list for method output_type + 7, // [7:25] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1731,7 +1845,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorResponse); i { + switch v := v.(*HostsRequest); i { case 0: return &v.state case 1: @@ -1743,7 +1857,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunNumberResponse); i { + switch v := v.(*DetectorResponse); i { case 0: return &v.state case 1: @@ -1755,7 +1869,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringMap); i { + switch v := v.(*RunNumberResponse); i { case 0: return &v.state case 1: @@ -1767,7 +1881,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawGetRecursiveRequest); i { + switch v := v.(*StringMap); i { case 0: return &v.state case 1: @@ -1779,7 +1893,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuntimeEntryRequest); i { + switch v := v.(*RawGetRecursiveRequest); i { case 0: return &v.state case 1: @@ -1791,7 +1905,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRuntimeEntryRequest); i { + switch v := v.(*GetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1803,7 +1917,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRuntimeEntriesRequest); i { + switch v := v.(*SetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1815,7 +1929,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*ListRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -1827,7 +1941,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -1839,7 +1953,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -1851,7 +1965,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*ComponentEntriesResponse); i { case 0: return &v.state case 1: @@ -1863,7 +1977,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*DetectorsResponse); i { case 0: return &v.state case 1: @@ -1875,7 +1989,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -1887,7 +2001,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -1899,7 +2013,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -1911,7 +2025,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -1923,6 +2037,30 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CRUCardsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -1939,7 +2077,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[14].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -1949,7 +2087,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 24, + NumMessages: 26, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index fe5d5fa9e..2714b4269 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -33,20 +33,25 @@ service Apricot { rpc GetDefaults(Empty) returns (StringMap) {} rpc GetVars(Empty) returns (StringMap) {} rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} + + // Detectors and host inventories + rpc ListDetectors(Empty) returns (DetectorsResponse) {} + rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} + rpc GetDetectorsForHosts(HostsRequest) returns (DetectorsResponse) {} rpc GetCRUCardsForHost(HostRequest) returns (CRUCardsResponse) {} rpc GetEndpointsForCRUCard(CardRequest) returns (CRUCardEndpointResponse) {} + + // Runtime KV calls rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} rpc ListRuntimeEntries(ListRuntimeEntriesRequest) returns (ComponentEntriesResponse) {} - rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} + // Component configuration calls rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} - rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} - rpc ImportComponentConfiguration(ImportComponentConfigurationRequest) returns (ImportComponentConfigurationResponse) {} } @@ -88,6 +93,10 @@ message HostRequest { string hostname = 1; } +message HostsRequest { + repeated string hosts = 1; +} + message DetectorResponse { string payload = 1; } @@ -137,6 +146,10 @@ message ComponentEntriesResponse { repeated string payload = 1; } +message DetectorsResponse { + repeated string detectors = 1; +} + message HostGetRequest { string detector = 1; } diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 1cce508e5..11dde981f 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -22,13 +22,18 @@ type ApricotClient interface { GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + // Detectors and host inventories + ListDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorsResponse, error) + GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) + GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) + // Runtime KV calls GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) - GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) + // Component configuration calls ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -80,6 +85,24 @@ func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursive return out, nil } +func (c *apricotClient) ListDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorsResponse, error) { + out := new(DetectorsResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ListDetectors", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) { + out := new(HostEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) { out := new(DetectorResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorForHost", in, out, opts...) @@ -89,6 +112,15 @@ func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, return out, nil } +func (c *apricotClient) GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) { + out := new(DetectorsResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorsForHosts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) { out := new(CRUCardsResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetCRUCardsForHost", in, out, opts...) @@ -134,15 +166,6 @@ func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeE return out, nil } -func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) { - out := new(HostEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) @@ -196,13 +219,18 @@ type ApricotServer interface { GetDefaults(context.Context, *Empty) (*StringMap, error) GetVars(context.Context, *Empty) (*StringMap, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) + // Detectors and host inventories + ListDetectors(context.Context, *Empty) (*DetectorsResponse, error) + GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) + GetDetectorsForHosts(context.Context, *HostsRequest) (*DetectorsResponse, error) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) + // Runtime KV calls GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) - GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) + // Component configuration calls ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) @@ -226,9 +254,18 @@ func (UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") } +func (UnimplementedApricotServer) ListDetectors(context.Context, *Empty) (*DetectorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListDetectors not implemented") +} +func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") +} func (UnimplementedApricotServer) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDetectorForHost not implemented") } +func (UnimplementedApricotServer) GetDetectorsForHosts(context.Context, *HostsRequest) (*DetectorsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDetectorsForHosts not implemented") +} func (UnimplementedApricotServer) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCRUCardsForHost not implemented") } @@ -244,9 +281,6 @@ func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEn func (UnimplementedApricotServer) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRuntimeEntries not implemented") } -func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") -} func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListComponents not implemented") } @@ -346,6 +380,42 @@ func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_ListDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ListDetectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ListDetectors", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ListDetectors(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HostGetRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetHostInventory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetHostInventory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetHostInventory(ctx, req.(*HostGetRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HostRequest) if err := dec(in); err != nil { @@ -364,6 +434,24 @@ func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Apricot_GetDetectorsForHosts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(HostsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetDetectorsForHosts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetDetectorsForHosts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetDetectorsForHosts(ctx, req.(*HostsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetCRUCardsForHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HostRequest) if err := dec(in); err != nil { @@ -454,24 +542,6 @@ func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(HostGetRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetHostInventory(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetHostInventory", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetHostInventory(ctx, req.(*HostGetRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(Empty) if err := dec(in); err != nil { @@ -585,10 +655,22 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "RawGetRecursive", Handler: _Apricot_RawGetRecursive_Handler, }, + { + MethodName: "ListDetectors", + Handler: _Apricot_ListDetectors_Handler, + }, + { + MethodName: "GetHostInventory", + Handler: _Apricot_GetHostInventory_Handler, + }, { MethodName: "GetDetectorForHost", Handler: _Apricot_GetDetectorForHost_Handler, }, + { + MethodName: "GetDetectorsForHosts", + Handler: _Apricot_GetDetectorsForHosts_Handler, + }, { MethodName: "GetCRUCardsForHost", Handler: _Apricot_GetCRUCardsForHost_Handler, @@ -609,10 +691,6 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListRuntimeEntries", Handler: _Apricot_ListRuntimeEntries_Handler, }, - { - MethodName: "GetHostInventory", - Handler: _Apricot_GetHostInventory_Handler, - }, { MethodName: "ListComponents", Handler: _Apricot_ListComponents_Handler, diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 8f00523ee..6283d6a0d 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -268,7 +268,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{51, 0} } type VarSpecMessage_Type int32 @@ -323,7 +323,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{51, 1} } type Event_MesosHeartbeat struct { @@ -1347,16 +1347,17 @@ type EnvironmentInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1461,6 +1462,13 @@ func (x *EnvironmentInfo) GetNumberOfFlps() int32 { return 0 } +func (x *EnvironmentInfo) GetIncludedDetectors() []string { + if x != nil { + return x.IncludedDetectors + } + return nil +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2207,6 +2215,53 @@ func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +type GetActiveDetectorsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *GetActiveDetectorsReply) Reset() { + *x = GetActiveDetectorsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActiveDetectorsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveDetectorsReply) ProtoMessage() {} + +func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetActiveDetectorsReply.ProtoReflect.Descriptor instead. +func (*GetActiveDetectorsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} + +func (x *GetActiveDetectorsReply) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + //////////////////////////////////////// // Environment, GET/SET properties //////////////////////////////////////// @@ -2224,7 +2279,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2237,7 +2292,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2250,7 +2305,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2276,7 +2331,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2289,7 +2344,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2302,7 +2357,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } type GetEnvironmentPropertiesRequest struct { @@ -2321,7 +2376,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2334,7 +2389,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2347,7 +2402,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2382,7 +2437,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2395,7 +2450,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2408,7 +2463,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2440,7 +2495,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2453,7 +2508,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2466,7 +2521,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *ShortTaskInfo) GetName() string { @@ -2546,7 +2601,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2559,7 +2614,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2572,7 +2627,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2612,7 +2667,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2625,7 +2680,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2638,7 +2693,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } type GetTasksReply struct { @@ -2652,7 +2707,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2665,7 +2720,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2678,7 +2733,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2699,7 +2754,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2712,7 +2767,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2725,7 +2780,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTaskRequest) GetTaskId() string { @@ -2746,7 +2801,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2759,7 +2814,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2772,7 +2827,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2794,7 +2849,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2807,7 +2862,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2820,7 +2875,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *TaskClassInfo) GetName() string { @@ -2852,7 +2907,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2865,7 +2920,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2878,7 +2933,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *CommandInfo) GetEnv() []string { @@ -2929,7 +2984,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +2997,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3010,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *ChannelInfo) GetName() string { @@ -2997,7 +3052,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3010,7 +3065,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3023,7 +3078,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3093,7 +3148,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3106,7 +3161,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3119,7 +3174,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3141,7 +3196,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3154,7 +3209,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3167,7 +3222,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3199,7 +3254,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3212,7 +3267,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3225,7 +3280,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *GetRolesRequest) GetEnvId() string { @@ -3262,7 +3317,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3275,7 +3330,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3288,7 +3343,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *RoleInfo) GetName() string { @@ -3372,7 +3427,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3385,7 +3440,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3398,7 +3453,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3423,7 +3478,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3436,7 +3491,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3449,7 +3504,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3507,7 +3562,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3520,7 +3575,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3533,7 +3588,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3620,7 +3675,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3688,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3701,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3688,7 +3743,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3701,7 +3756,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3714,7 +3769,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3735,7 +3790,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3748,7 +3803,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3761,7 +3816,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3785,7 +3840,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3798,7 +3853,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3811,7 +3866,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *RepoInfo) GetName() string { @@ -3854,7 +3909,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3867,7 +3922,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3880,7 +3935,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3909,7 +3964,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3922,7 +3977,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3935,7 +3990,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *AddRepoRequest) GetName() string { @@ -3964,7 +4019,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3977,7 +4032,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3990,7 +4045,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4018,7 +4073,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +4086,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4099,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4065,7 +4120,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4078,7 +4133,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4091,7 +4146,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4112,7 +4167,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4125,7 +4180,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4138,7 +4193,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4159,7 +4214,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4227,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4240,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4206,7 +4261,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4219,7 +4274,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4232,7 +4287,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4254,7 +4309,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4267,7 +4322,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4280,7 +4335,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4308,7 +4363,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4321,7 +4376,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4334,7 +4389,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4353,7 +4408,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4366,7 +4421,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4379,7 +4434,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } type ListIntegratedServicesReply struct { @@ -4393,7 +4448,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4406,7 +4461,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4419,7 +4474,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4444,7 +4499,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4457,7 +4512,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4470,7 +4525,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{68} } func (x *IntegratedServiceInfo) GetName() string { @@ -4627,7 +4682,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, @@ -4655,590 +4710,601 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, - 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, - 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, - 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, + 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, - 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, - 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, - 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, - 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, - 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, - 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, + 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, + 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, - 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, - 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, - 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, - 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, - 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, + 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, + 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, + 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, + 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, + 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, + 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, - 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, - 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, - 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5254,7 +5320,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 82) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 83) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5291,58 +5357,59 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 35: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 36: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 37: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 38: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 39: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 40: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 41: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 42: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 43: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 44: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 45: o2control.TaskClassInfo - (*CommandInfo)(nil), // 46: o2control.CommandInfo - (*ChannelInfo)(nil), // 47: o2control.ChannelInfo - (*TaskInfo)(nil), // 48: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 49: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 50: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 51: o2control.GetRolesRequest - (*RoleInfo)(nil), // 52: o2control.RoleInfo - (*GetRolesReply)(nil), // 53: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 54: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 55: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 56: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 57: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 58: o2control.ListReposRequest - (*RepoInfo)(nil), // 59: o2control.RepoInfo - (*ListReposReply)(nil), // 60: o2control.ListReposReply - (*AddRepoRequest)(nil), // 61: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 62: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 63: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 64: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 65: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 66: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 67: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 68: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 69: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 70: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 71: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 72: o2control.IntegratedServiceInfo - nil, // 73: o2control.EnvironmentInfo.DefaultsEntry - nil, // 74: o2control.EnvironmentInfo.VarsEntry - nil, // 75: o2control.EnvironmentInfo.UserVarsEntry - nil, // 76: o2control.NewEnvironmentRequest.VarsEntry - nil, // 77: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 78: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 79: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 80: o2control.TaskInfo.PropertiesEntry - nil, // 81: o2control.RoleInfo.DefaultsEntry - nil, // 82: o2control.RoleInfo.VarsEntry - nil, // 83: o2control.RoleInfo.UserVarsEntry - nil, // 84: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 85: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 86: o2control.ListIntegratedServicesReply.ServicesEntry + (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 36: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 37: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 38: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 39: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 40: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 41: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 42: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 43: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 44: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 45: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 46: o2control.TaskClassInfo + (*CommandInfo)(nil), // 47: o2control.CommandInfo + (*ChannelInfo)(nil), // 48: o2control.ChannelInfo + (*TaskInfo)(nil), // 49: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 50: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 51: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 52: o2control.GetRolesRequest + (*RoleInfo)(nil), // 53: o2control.RoleInfo + (*GetRolesReply)(nil), // 54: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 55: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 56: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 59: o2control.ListReposRequest + (*RepoInfo)(nil), // 60: o2control.RepoInfo + (*ListReposReply)(nil), // 61: o2control.ListReposReply + (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 63: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 71: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 72: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 73: o2control.IntegratedServiceInfo + nil, // 74: o2control.EnvironmentInfo.DefaultsEntry + nil, // 75: o2control.EnvironmentInfo.VarsEntry + nil, // 76: o2control.EnvironmentInfo.UserVarsEntry + nil, // 77: o2control.NewEnvironmentRequest.VarsEntry + nil, // 78: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 79: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 80: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 81: o2control.TaskInfo.PropertiesEntry + nil, // 82: o2control.RoleInfo.DefaultsEntry + nil, // 83: o2control.RoleInfo.VarsEntry + nil, // 84: o2control.RoleInfo.UserVarsEntry + nil, // 85: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 86: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 87: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5353,47 +5420,47 @@ var file_protos_o2control_proto_depIdxs = []int32{ 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 39, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 73, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 74, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 75, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 76, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 40, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 77, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 77, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 78, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 52, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 53, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 50, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 78, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 79, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 40, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 39, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 48, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 39, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 45, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 47, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 47, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 46, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 80, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 39, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 39, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 52, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 81, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 82, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 83, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 51, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 79, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 80, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 41, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 40, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 49, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 46, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 48, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 48, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 47, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 81, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 40, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 40, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 53, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 82, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 83, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 84, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 85, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 53, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 86, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 55, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 72, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 86, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 57, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 87, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 56, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 73, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest @@ -5404,46 +5471,48 @@ var file_protos_o2control_proto_depIdxs = []int32{ 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 41, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 43, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 49, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 51, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 54, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 58, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 61, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 63, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 65, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 66, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 67, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 68, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 70, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 73: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 74: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 75: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 76: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 77: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 78: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 79: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 80: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 81: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 42, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 44, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 50, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 53, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 57, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 60, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 62, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 64, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 70, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 70, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 70, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 69, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 95: o2control.Control.Subscribe:output_type -> o2control.Event - 71, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 73, // [73:97] is the sub-list for method output_type - 49, // [49:73] is the sub-list for method input_type + 71, // 59: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 42, // 60: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 44, // 61: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 50, // 62: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 52, // 63: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 55, // 64: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 65: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 66: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 67: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 68: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 69: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 70: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 71: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 72: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 71, // 73: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 74: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 75: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 76: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 82: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 83: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 84: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 43, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 45, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 51, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 54, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event + 72, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 74, // [74:99] is the sub-list for method output_type + 49, // [49:74] is the sub-list for method input_type 49, // [49:49] is the sub-list for extension type_name 49, // [49:49] is the sub-list for extension extendee 0, // [0:49] is the sub-list for field type_name @@ -5816,7 +5885,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesRequest); i { + switch v := v.(*GetActiveDetectorsReply); i { case 0: return &v.state case 1: @@ -5828,7 +5897,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesReply); i { + switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -5840,7 +5909,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesRequest); i { + switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -5852,7 +5921,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesReply); i { + switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -5864,7 +5933,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShortTaskInfo); i { + switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -5876,7 +5945,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskDeploymentInfo); i { + switch v := v.(*ShortTaskInfo); i { case 0: return &v.state case 1: @@ -5888,7 +5957,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksRequest); i { + switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state case 1: @@ -5900,7 +5969,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksReply); i { + switch v := v.(*GetTasksRequest); i { case 0: return &v.state case 1: @@ -5912,7 +5981,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskRequest); i { + switch v := v.(*GetTasksReply); i { case 0: return &v.state case 1: @@ -5924,7 +5993,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskReply); i { + switch v := v.(*GetTaskRequest); i { case 0: return &v.state case 1: @@ -5936,7 +6005,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { + switch v := v.(*GetTaskReply); i { case 0: return &v.state case 1: @@ -5948,7 +6017,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandInfo); i { + switch v := v.(*TaskClassInfo); i { case 0: return &v.state case 1: @@ -5960,7 +6029,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelInfo); i { + switch v := v.(*CommandInfo); i { case 0: return &v.state case 1: @@ -5972,7 +6041,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskInfo); i { + switch v := v.(*ChannelInfo); i { case 0: return &v.state case 1: @@ -5984,7 +6053,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksRequest); i { + switch v := v.(*TaskInfo); i { case 0: return &v.state case 1: @@ -5996,7 +6065,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksReply); i { + switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state case 1: @@ -6008,7 +6077,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesRequest); i { + switch v := v.(*CleanupTasksReply); i { case 0: return &v.state case 1: @@ -6020,7 +6089,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInfo); i { + switch v := v.(*GetRolesRequest); i { case 0: return &v.state case 1: @@ -6032,7 +6101,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesReply); i { + switch v := v.(*RoleInfo); i { case 0: return &v.state case 1: @@ -6044,7 +6113,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesRequest); i { + switch v := v.(*GetRolesReply); i { case 0: return &v.state case 1: @@ -6056,7 +6125,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VarSpecMessage); i { + switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -6068,7 +6137,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -6080,7 +6149,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -6092,7 +6161,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -6104,7 +6173,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -6116,7 +6185,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -6128,7 +6197,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -6140,7 +6209,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -6152,7 +6221,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -6164,7 +6233,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -6176,7 +6245,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -6188,7 +6257,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -6200,7 +6269,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -6212,7 +6281,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6224,7 +6293,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6236,7 +6305,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -6248,7 +6317,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -6260,6 +6329,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6286,7 +6367,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 82, + NumMessages: 83, NumExtensions: 0, NumServices: 1, }, diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 920240034..5d799227e 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -28,6 +28,7 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -165,6 +166,15 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } +func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) { + out := new(GetActiveDetectorsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetActiveDetectors", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -328,6 +338,7 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -379,6 +390,9 @@ func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvi func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } +func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActiveDetectors not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -617,6 +631,24 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetActiveDetectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetActiveDetectors", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetActiveDetectors(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -915,6 +947,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, + { + MethodName: "GetActiveDetectors", + Handler: _Control_GetActiveDetectors_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 8f00523ee..6283d6a0d 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -268,7 +268,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{51, 0} } type VarSpecMessage_Type int32 @@ -323,7 +323,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{51, 1} } type Event_MesosHeartbeat struct { @@ -1347,16 +1347,17 @@ type EnvironmentInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1461,6 +1462,13 @@ func (x *EnvironmentInfo) GetNumberOfFlps() int32 { return 0 } +func (x *EnvironmentInfo) GetIncludedDetectors() []string { + if x != nil { + return x.IncludedDetectors + } + return nil +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2207,6 +2215,53 @@ func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +type GetActiveDetectorsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *GetActiveDetectorsReply) Reset() { + *x = GetActiveDetectorsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetActiveDetectorsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetActiveDetectorsReply) ProtoMessage() {} + +func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetActiveDetectorsReply.ProtoReflect.Descriptor instead. +func (*GetActiveDetectorsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{30} +} + +func (x *GetActiveDetectorsReply) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + //////////////////////////////////////// // Environment, GET/SET properties //////////////////////////////////////// @@ -2224,7 +2279,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2237,7 +2292,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2250,7 +2305,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2276,7 +2331,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2289,7 +2344,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2302,7 +2357,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } type GetEnvironmentPropertiesRequest struct { @@ -2321,7 +2376,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2334,7 +2389,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2347,7 +2402,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2382,7 +2437,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2395,7 +2450,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2408,7 +2463,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2440,7 +2495,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2453,7 +2508,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2466,7 +2521,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *ShortTaskInfo) GetName() string { @@ -2546,7 +2601,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2559,7 +2614,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2572,7 +2627,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2612,7 +2667,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2625,7 +2680,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2638,7 +2693,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } type GetTasksReply struct { @@ -2652,7 +2707,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2665,7 +2720,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2678,7 +2733,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2699,7 +2754,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2712,7 +2767,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2725,7 +2780,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTaskRequest) GetTaskId() string { @@ -2746,7 +2801,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2759,7 +2814,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2772,7 +2827,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2794,7 +2849,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2807,7 +2862,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2820,7 +2875,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *TaskClassInfo) GetName() string { @@ -2852,7 +2907,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2865,7 +2920,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2878,7 +2933,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *CommandInfo) GetEnv() []string { @@ -2929,7 +2984,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +2997,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3010,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *ChannelInfo) GetName() string { @@ -2997,7 +3052,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3010,7 +3065,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3023,7 +3078,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3093,7 +3148,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3106,7 +3161,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3119,7 +3174,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3141,7 +3196,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3154,7 +3209,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3167,7 +3222,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3199,7 +3254,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3212,7 +3267,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3225,7 +3280,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *GetRolesRequest) GetEnvId() string { @@ -3262,7 +3317,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3275,7 +3330,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3288,7 +3343,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *RoleInfo) GetName() string { @@ -3372,7 +3427,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3385,7 +3440,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3398,7 +3453,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3423,7 +3478,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3436,7 +3491,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3449,7 +3504,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3507,7 +3562,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3520,7 +3575,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3533,7 +3588,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3620,7 +3675,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3688,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3701,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3688,7 +3743,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3701,7 +3756,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3714,7 +3769,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3735,7 +3790,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3748,7 +3803,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3761,7 +3816,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3785,7 +3840,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3798,7 +3853,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3811,7 +3866,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *RepoInfo) GetName() string { @@ -3854,7 +3909,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3867,7 +3922,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3880,7 +3935,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3909,7 +3964,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3922,7 +3977,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3935,7 +3990,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *AddRepoRequest) GetName() string { @@ -3964,7 +4019,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3977,7 +4032,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3990,7 +4045,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4018,7 +4073,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +4086,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4099,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4065,7 +4120,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4078,7 +4133,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4091,7 +4146,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4112,7 +4167,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4125,7 +4180,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4138,7 +4193,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4159,7 +4214,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4227,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4240,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4206,7 +4261,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4219,7 +4274,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4232,7 +4287,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4254,7 +4309,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4267,7 +4322,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4280,7 +4335,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4308,7 +4363,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4321,7 +4376,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4334,7 +4389,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4353,7 +4408,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4366,7 +4421,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4379,7 +4434,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } type ListIntegratedServicesReply struct { @@ -4393,7 +4448,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4406,7 +4461,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4419,7 +4474,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4444,7 +4499,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4457,7 +4512,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4470,7 +4525,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{68} } func (x *IntegratedServiceInfo) GetName() string { @@ -4627,7 +4682,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x04, + 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, @@ -4655,590 +4710,601 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, - 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, - 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, - 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, + 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, - 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, - 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, - 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, - 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, - 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, - 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, - 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, - 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, - 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, + 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, + 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, - 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, - 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, - 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, - 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, - 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, + 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, + 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, + 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, + 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, + 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, + 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, - 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, - 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x32, 0xb4, 0x0f, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, - 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, - 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5254,7 +5320,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 82) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 83) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5291,58 +5357,59 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply - (*SetEnvironmentPropertiesRequest)(nil), // 35: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 36: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 37: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 38: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 39: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 40: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 41: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 42: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 43: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 44: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 45: o2control.TaskClassInfo - (*CommandInfo)(nil), // 46: o2control.CommandInfo - (*ChannelInfo)(nil), // 47: o2control.ChannelInfo - (*TaskInfo)(nil), // 48: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 49: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 50: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 51: o2control.GetRolesRequest - (*RoleInfo)(nil), // 52: o2control.RoleInfo - (*GetRolesReply)(nil), // 53: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 54: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 55: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 56: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 57: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 58: o2control.ListReposRequest - (*RepoInfo)(nil), // 59: o2control.RepoInfo - (*ListReposReply)(nil), // 60: o2control.ListReposReply - (*AddRepoRequest)(nil), // 61: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 62: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 63: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 64: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 65: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 66: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 67: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 68: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 69: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 70: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 71: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 72: o2control.IntegratedServiceInfo - nil, // 73: o2control.EnvironmentInfo.DefaultsEntry - nil, // 74: o2control.EnvironmentInfo.VarsEntry - nil, // 75: o2control.EnvironmentInfo.UserVarsEntry - nil, // 76: o2control.NewEnvironmentRequest.VarsEntry - nil, // 77: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 78: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 79: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 80: o2control.TaskInfo.PropertiesEntry - nil, // 81: o2control.RoleInfo.DefaultsEntry - nil, // 82: o2control.RoleInfo.VarsEntry - nil, // 83: o2control.RoleInfo.UserVarsEntry - nil, // 84: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 85: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 86: o2control.ListIntegratedServicesReply.ServicesEntry + (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 36: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 37: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 38: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 39: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 40: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 41: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 42: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 43: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 44: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 45: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 46: o2control.TaskClassInfo + (*CommandInfo)(nil), // 47: o2control.CommandInfo + (*ChannelInfo)(nil), // 48: o2control.ChannelInfo + (*TaskInfo)(nil), // 49: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 50: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 51: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 52: o2control.GetRolesRequest + (*RoleInfo)(nil), // 53: o2control.RoleInfo + (*GetRolesReply)(nil), // 54: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 55: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 56: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 59: o2control.ListReposRequest + (*RepoInfo)(nil), // 60: o2control.RepoInfo + (*ListReposReply)(nil), // 61: o2control.ListReposReply + (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 63: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 71: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 72: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 73: o2control.IntegratedServiceInfo + nil, // 74: o2control.EnvironmentInfo.DefaultsEntry + nil, // 75: o2control.EnvironmentInfo.VarsEntry + nil, // 76: o2control.EnvironmentInfo.UserVarsEntry + nil, // 77: o2control.NewEnvironmentRequest.VarsEntry + nil, // 78: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 79: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 80: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 81: o2control.TaskInfo.PropertiesEntry + nil, // 82: o2control.RoleInfo.DefaultsEntry + nil, // 83: o2control.RoleInfo.VarsEntry + nil, // 84: o2control.RoleInfo.UserVarsEntry + nil, // 85: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 86: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 87: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5353,47 +5420,47 @@ var file_protos_o2control_proto_depIdxs = []int32{ 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 39, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 73, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 74, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 75, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 76, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 40, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 77, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 77, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 78, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 52, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 53, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 50, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 78, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 79, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 40, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 39, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 48, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 39, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 45, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 47, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 47, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 46, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 80, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 39, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 39, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 52, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 81, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 82, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 83, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 84, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 52, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 51, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 79, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 80, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 41, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 40, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 49, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 46, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 48, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 48, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 47, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 81, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 40, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 40, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 53, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 82, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 83, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 84, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 85, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 53, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 85, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 56, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 59, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 86, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 55, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 72, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 86, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 57, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 87, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 56, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 73, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest @@ -5404,46 +5471,48 @@ var file_protos_o2control_proto_depIdxs = []int32{ 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 41, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 43, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 49, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 51, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 54, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 58, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 61, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 63, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 65, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 66, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 67, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 68, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 70, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 73: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 74: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 75: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 76: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 77: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 78: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 79: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 80: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 81: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 42, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 44, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 50, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 53, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 57, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 60, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 62, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 64, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 70, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 70, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 70, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 69, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 95: o2control.Control.Subscribe:output_type -> o2control.Event - 71, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 73, // [73:97] is the sub-list for method output_type - 49, // [49:73] is the sub-list for method input_type + 71, // 59: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 42, // 60: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 44, // 61: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 50, // 62: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 52, // 63: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 55, // 64: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 65: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 66: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 67: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 68: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 69: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 70: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 71: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 72: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 71, // 73: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 74: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 75: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 76: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 82: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 83: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 84: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 43, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 45, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 51, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 54, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event + 72, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 74, // [74:99] is the sub-list for method output_type + 49, // [49:74] is the sub-list for method input_type 49, // [49:49] is the sub-list for extension type_name 49, // [49:49] is the sub-list for extension extendee 0, // [0:49] is the sub-list for field type_name @@ -5816,7 +5885,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesRequest); i { + switch v := v.(*GetActiveDetectorsReply); i { case 0: return &v.state case 1: @@ -5828,7 +5897,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesReply); i { + switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -5840,7 +5909,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesRequest); i { + switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -5852,7 +5921,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesReply); i { + switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -5864,7 +5933,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShortTaskInfo); i { + switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -5876,7 +5945,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskDeploymentInfo); i { + switch v := v.(*ShortTaskInfo); i { case 0: return &v.state case 1: @@ -5888,7 +5957,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksRequest); i { + switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state case 1: @@ -5900,7 +5969,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksReply); i { + switch v := v.(*GetTasksRequest); i { case 0: return &v.state case 1: @@ -5912,7 +5981,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskRequest); i { + switch v := v.(*GetTasksReply); i { case 0: return &v.state case 1: @@ -5924,7 +5993,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskReply); i { + switch v := v.(*GetTaskRequest); i { case 0: return &v.state case 1: @@ -5936,7 +6005,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { + switch v := v.(*GetTaskReply); i { case 0: return &v.state case 1: @@ -5948,7 +6017,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandInfo); i { + switch v := v.(*TaskClassInfo); i { case 0: return &v.state case 1: @@ -5960,7 +6029,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelInfo); i { + switch v := v.(*CommandInfo); i { case 0: return &v.state case 1: @@ -5972,7 +6041,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskInfo); i { + switch v := v.(*ChannelInfo); i { case 0: return &v.state case 1: @@ -5984,7 +6053,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksRequest); i { + switch v := v.(*TaskInfo); i { case 0: return &v.state case 1: @@ -5996,7 +6065,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksReply); i { + switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state case 1: @@ -6008,7 +6077,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesRequest); i { + switch v := v.(*CleanupTasksReply); i { case 0: return &v.state case 1: @@ -6020,7 +6089,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInfo); i { + switch v := v.(*GetRolesRequest); i { case 0: return &v.state case 1: @@ -6032,7 +6101,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesReply); i { + switch v := v.(*RoleInfo); i { case 0: return &v.state case 1: @@ -6044,7 +6113,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesRequest); i { + switch v := v.(*GetRolesReply); i { case 0: return &v.state case 1: @@ -6056,7 +6125,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VarSpecMessage); i { + switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -6068,7 +6137,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -6080,7 +6149,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -6092,7 +6161,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -6104,7 +6173,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -6116,7 +6185,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -6128,7 +6197,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -6140,7 +6209,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -6152,7 +6221,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -6164,7 +6233,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -6176,7 +6245,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -6188,7 +6257,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -6200,7 +6269,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -6212,7 +6281,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6224,7 +6293,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6236,7 +6305,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -6248,7 +6317,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -6260,6 +6329,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6286,7 +6367,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 82, + NumMessages: 83, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 7fd7668b8..a6bceea67 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -72,6 +72,7 @@ service Control { rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} rpc DestroyEnvironment (DestroyEnvironmentRequest) returns (DestroyEnvironmentReply) {} + rpc GetActiveDetectors (Empty) returns (GetActiveDetectorsReply) {} // rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} // rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} @@ -180,6 +181,7 @@ message EnvironmentInfo { map vars = 8; map userVars = 9; int32 numberOfFlps = 10; + repeated string includedDetectors = 11; } message NewEnvironmentRequest { @@ -258,6 +260,10 @@ message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; } +message GetActiveDetectorsReply { + repeated string detectors = 1; +} + //////////////////////////////////////// // Environment, GET/SET properties //////////////////////////////////////// diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 713786068..5f36b5891 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -28,6 +28,7 @@ type ControlClient interface { ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) + GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -165,6 +166,15 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir return out, nil } +func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) { + out := new(GetActiveDetectorsReply) + err := c.cc.Invoke(ctx, "/o2control.Control/GetActiveDetectors", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) @@ -328,6 +338,7 @@ type ControlServer interface { ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) + GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -378,6 +389,9 @@ func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvi func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } +func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetActiveDetectors not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -615,6 +629,24 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetActiveDetectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2control.Control/GetActiveDetectors", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetActiveDetectors(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -913,6 +945,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, }, + { + MethodName: "GetActiveDetectors", + Handler: _Control_GetActiveDetectors_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, From c17daae85c46bd861a09b20d80e22294e2258df9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Aug 2021 16:47:39 +0200 Subject: [PATCH 0983/2352] [apricot] ListDetectors + DetectorsForHosts implementation --- apricot/local/service.go | 44 ++++++++++++++++++++++++++++++++++++++- apricot/remote/server.go | 29 ++++++++++++++++++++++++++ apricot/remote/service.go | 22 ++++++++++++++++++++ configuration/service.go | 2 ++ 4 files changed, 96 insertions(+), 1 deletion(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 6e6c946d4..f9636c67f 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -123,6 +123,27 @@ func (s *Service) GetDefaults() map[string]string { return smap } +func (s *Service) ListDetectors() (detectors []string, err error) { + keyPrefix := inventoryKeyPrefix + "detectors/" + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + log.WithError(err).Error("could not retrieve detectors") + return []string{}, err + } + detectorSet := make(map[string]bool, 0) + detectors = make([]string, 0) + for _, key := range keys { + detTrimmed := strings.TrimPrefix(key, keyPrefix) + detname := strings.Split(detTrimmed, "/") + if _, ok := detectorSet[detname[0]]; !ok { // the detector name we found in the path isn't already accounted for + detectorSet[detname[0]] = true + detectors = append(detectors, detname[0]) + } + } + return detectors, err +} + func (s *Service) GetHostInventory(detector string) (hosts []string, err error) { var keyPrefix string if detector != "" { @@ -130,7 +151,8 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) } else { keyPrefix = inventoryKeyPrefix + "flps/" } - keys, err := s.src.GetKeysByPrefix(keyPrefix) + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) if err != nil { log.WithError(err).Error("could not retrieve host list") return []string{}, err @@ -298,6 +320,26 @@ func (s *Service) GetDetectorForHost(hostname string) (string, error) { } } +func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { + detectorMap := make(map[string]struct{}) + for _, host := range hosts { + det, err := s.GetDetectorForHost(host) + if err != nil { + return []string{}, err + } + detectorMap[det] = struct{}{} + } + + detectorSlice := make([]string, len(detectorMap)) + i := 0 + for k, _ := range detectorMap { + detectorSlice[i] = k + i++ + } + sort.Strings(detectorSlice) + return detectorSlice, nil +} + func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var cards map[string]Cards diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 532c9afce..497716db6 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -149,6 +149,22 @@ func (m *RpcServer) GetDetectorForHost(_ context.Context, request *apricotpb.Hos return &apricotpb.DetectorResponse{Payload: payload}, E_OK.Err() } +func (m *RpcServer) GetDetectorsForHosts(_ context.Context, request *apricotpb.HostsRequest) (*apricotpb.DetectorsResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + payload, err := m.service.GetDetectorsForHosts(request.GetHosts()) + if err != nil { + return nil, err + } + return &apricotpb.DetectorsResponse{Detectors: payload}, E_OK.Err() +} + func (m *RpcServer) GetCRUCardsForHost(_ context.Context, request *apricotpb.HostRequest) (*apricotpb.CRUCardsResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE @@ -246,6 +262,19 @@ func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGet return &apricotpb.ComponentResponse{Payload: payload}, nil } +func (m *RpcServer) ListDetectors(_ context.Context, _ *apricotpb.Empty) (*apricotpb.DetectorsResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + detectors, err := m.service.ListDetectors() + if err != nil { + return nil, err + } + return &apricotpb.DetectorsResponse{Detectors: detectors}, nil +} + func (m *RpcServer) GetHostInventory(_ context.Context, request *apricotpb.HostGetRequest) (*apricotpb.HostEntriesResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index fbacb461d..c4cea8825 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -142,6 +142,19 @@ func (c *RemoteService) GetDetectorForHost(hostname string) (payload string, err } +func (c *RemoteService) GetDetectorsForHosts(hosts []string) (payload []string, err error) { + var response *apricotpb.DetectorsResponse + request := &apricotpb.HostsRequest{ + Hosts: hosts, + } + response, err = c.cli.GetDetectorsForHosts(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return []string{}, err + } + return response.GetDetectors(), nil + +} + func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards string, err error) { var response *apricotpb.CRUCardsResponse request := &apricotpb.HostRequest{ @@ -205,6 +218,15 @@ func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, return response.GetPayload(), nil } +func (c *RemoteService) ListDetectors() (detectors []string, err error) { + var response *apricotpb.DetectorsResponse + response, err = c.cli.ListDetectors(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetDetectors(), nil +} + func (c *RemoteService) GetHostInventory(detector string) (hosts []string, err error) { var response *apricotpb.HostEntriesResponse request := &apricotpb.HostGetRequest{Detector: detector} diff --git a/configuration/service.go b/configuration/service.go index f42620468..363b864b3 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -42,6 +42,7 @@ type Service interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + ListDetectors() (detectors []string, err error) GetHostInventory(detector string) (hosts []string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) @@ -50,6 +51,7 @@ type Service interface { ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) GetDetectorForHost(hostname string) (string, error) + GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) From 9aea637edbf4237caf9b57df5e840825d1de77da Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Aug 2021 16:48:12 +0200 Subject: [PATCH 0984/2352] [common] Add IDMap type to system.ID --- common/system/systemid.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common/system/systemid.go b/common/system/systemid.go index ee5cf489d..810d980d6 100644 --- a/common/system/systemid.go +++ b/common/system/systemid.go @@ -26,9 +26,24 @@ package system +import "sort" + // Source: https://alice-notes.web.cern.ch/system/files/notes/public/1052/2020-07-15-2020-07-07-O2_Report_Identification_of_sources_for_ALICE_data.pdf // System ID mapping on page 3 +type IDMap map[ID]struct{} + +func (m IDMap) StringList() []string { + list := make([]string, len(m)) + i := 0 + for k, _ := range m { + list[i] = k.String() + i++ + } + sort.Strings(list) + return list +} + type ID int const ( // 1 From 81f3903edb6bac396598cf3587e082314a5d7f40 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 Aug 2021 16:53:52 +0200 Subject: [PATCH 0985/2352] [core] Environment-level detector exclusion and variable query system --- core/environment/environment.go | 87 ++++++++++++++------ core/environment/manager.go | 53 ++++++++++++ core/environment/transition_startactivity.go | 2 +- core/environment/utils.go | 17 +++- core/server.go | 66 ++++++++++----- 5 files changed, 176 insertions(+), 49 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index a6fb62cbf..ede33698d 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -38,6 +38,8 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/runtype" + "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -617,38 +619,73 @@ func (env *Environment) closeStream() { env.Mu.Unlock() } -func (env *Environment) GetFLPs() []string { +func (env *Environment) GetKV(path, key string) string { if env == nil { - return nil + return "" + } + if len(path) == 0 { // empty path provided, we default to root item of current env workflow + path = env.workflow.GetName() + } + rolesForPath := env.QueryRoles(path) + if len(rolesForPath) == 0 { + return "" } env.Mu.RLock() defer env.Mu.RUnlock() - varStack, _ := gera.FlattenStack( - env.GlobalDefaults, - env.GlobalVars, - env.UserVars, - ) - stringFLPs := varStack["hosts"] - stringFLPs = strings.TrimPrefix(stringFLPs, "[") - stringFLPs = strings.TrimSuffix(stringFLPs, "]") - stringFLPs = strings.Replace(stringFLPs,`"`,"",-1) - return strings.Split(stringFLPs,",") + role := rolesForPath[0] + varStack, err := role.ConsolidatedVarStack() + if err != nil { + return "" + } + payload := varStack[key] + return payload } -func (env *Environment) GetRunType() string { - if env == nil { - return "" +func (env *Environment) GetActiveDetectors() (response system.IDMap) { + if env == nil || env.workflow == nil { + return nil } - env.Mu.RLock() - defer env.Mu.RUnlock() - varStack, _ := gera.FlattenStack( - env.workflow.GetDefaults(), - env.workflow.GetVars(), - env.workflow.GetUserVars(), - ) - if runtype, ok := varStack["run_type"]; ok { - return runtype + response = make(system.IDMap) + payload := env.GetKV("", "detectors") + slice, err := JSONSliceToSlice(payload) + if err != nil { + return } - return "" + for _, det := range slice { + sid, err := system.IDString(det) // generated by enumer + if err != nil { + continue + } + response[sid] = struct{}{} + } + return +} + +func (env *Environment) GetFLPs() []string { + if env == nil || env.workflow == nil { + return nil + } + payload := env.GetKV("", "hosts") + response, err := JSONSliceToSlice(payload) + if err != nil { + return []string{} + } + return response +} + +func (env *Environment) GetRunType() runtype.RunType { + if env == nil || env.workflow == nil { + return runtype.NONE + } + rtString := env.GetKV("", "run_type") + rt, err := runtype.RunTypeString(rtString) + if err != nil { + log.WithField("partition", env.id). + WithField("level", infologger.IL_Support). + WithError(err). + Warnf("invalid run type %s", rtString) + return runtype.NONE + } + return rt } diff --git a/core/environment/manager.go b/core/environment/manager.go index b11ee1c71..f46ca7c3a 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -34,10 +34,12 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" @@ -91,7 +93,29 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage return envman } +func (envs *Manager) GetActiveDetectors() system.IDMap { + envs.mu.RLock() + defer envs.mu.RUnlock() + + response := make(system.IDMap) + for _, env := range envs.m { + if env.workflow == nil { // we can only query for detectors post-workflow-load + continue + } + envDetectors := env.GetActiveDetectors() + for det, _ := range envDetectors { + response[det] = struct{}{} + } + } + return response +} + func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uid.ID, error) { + // Before we load the workflow, we get the list of currently active detectors. This query must be performed before + // loading the workflow in order to compare the currently used detectors with the detectors required by the newly + // created environment. + alreadyActiveDetectors := envs.GetActiveDetectors() + envs.mu.Lock() // userVar identifiers come in 2 forms: @@ -142,6 +166,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] Warn("parse workflow public info failed.") } + // We load the workflow (includes template processing) env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) @@ -150,6 +175,33 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] return env.id, err } + // Ensure we provide a very defaulty `detectors` variable + detectors, err := the.ConfSvc().GetDetectorsForHosts(env.GetFLPs()) + if err != nil { + err = fmt.Errorf("cannot load workflow template: %w", err) + + envs.mu.Unlock() + return env.id, err + } + detectorsStr, err := SliceToJSONSlice(detectors) + if err != nil { + err = fmt.Errorf("cannot load workflow template: %w", err) + + envs.mu.Unlock() + return env.id, err + } + env.GlobalDefaults.Set("detectors", detectorsStr) + + // env.GetActiveDetectors() is valid starting now, so we can check for detector exclusion + neededDetectors := env.GetActiveDetectors() + for det, _ := range neededDetectors { + if _, contains := alreadyActiveDetectors[det]; contains { + // required detector det is already active in some other environment + envs.mu.Unlock() + return env.id, fmt.Errorf("detector %s is already in use", det.String()) + } + } + envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh @@ -454,6 +506,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } +// FIXME: this function should be deduplicated with CreateEnvironment so detector resource matching works correctly func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { envUserVars := make(map[string]string) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index a5b4df2b3..3ca98f86c 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -65,7 +65,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } flps := env.GetFLPs() - the.BookkeepingAPI().CreateRun(env.Id().String(), 0, 0, len(flps), int32(runNumber), env.GetRunType(), time.Now(), time.Now()) + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now()) for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) } diff --git a/core/environment/utils.go b/core/environment/utils.go index b6858b7a8..7661af74b 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -25,9 +25,11 @@ package environment import ( + "encoding/json" + "io/ioutil" + "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" - "io/ioutil" ) func parseWorkflowPublicInfo(workflowExpr string) (bool, error) { @@ -53,3 +55,16 @@ func parseWorkflowPublicInfo(workflowExpr string) (bool, error) { return isPublic, nil } + +func JSONSliceToSlice(payload string) (slice []string, err error) { + slice = make([]string, 0) + err = json.Unmarshal([]byte(payload), &slice) + return +} + +func SliceToJSONSlice(slice []string) (payload string, err error) { + var payloadStr []byte + payloadStr, err = json.Marshal(slice) + payload = string(payloadStr) + return +} \ No newline at end of file diff --git a/core/server.go b/core/server.go index c6e4f28ba..bc3359e47 100644 --- a/core/server.go +++ b/core/server.go @@ -190,16 +190,18 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm } tasks := env.Workflow().GetTasks() e := &pb.EnvironmentInfo{ - Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().Format(time.RFC3339), - State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: env.Workflow().GetName(), - CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: env.GlobalDefaults.Raw(), - Vars: env.GlobalVars.Raw(), - UserVars: env.UserVars.Raw(), + Id: env.Id().String(), + CreatedWhen: env.CreatedWhen().Format(time.RFC3339), + State: env.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: env.Workflow().GetName(), + CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: env.GlobalDefaults.Raw(), + Vars: env.GlobalVars.Raw(), + UserVars: env.UserVars.Raw(), + NumberOfFlps: int32(len(env.GetFLPs())), } + e.IncludedDetectors = env.GetActiveDetectors().StringList() r.Environments = append(r.Environments, e) } @@ -250,39 +252,46 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme tasks := newEnv.Workflow().GetTasks() ei := &pb.EnvironmentInfo{ - Id: newEnv.Id().String(), - CreatedWhen: newEnv.CreatedWhen().Format(time.RFC3339), - State: newEnv.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: newEnv.Workflow().GetName(), - CurrentRunNumber: newEnv.GetCurrentRunNumber(), - } + Id: newEnv.Id().String(), + CreatedWhen: newEnv.CreatedWhen().Format(time.RFC3339), + State: newEnv.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: newEnv.Workflow().GetName(), + CurrentRunNumber: newEnv.GetCurrentRunNumber(), + Defaults: newEnv.GlobalDefaults.Raw(), + Vars: newEnv.GlobalVars.Raw(), + UserVars: newEnv.UserVars.Raw(), + NumberOfFlps: int32(len(newEnv.GetFLPs())), + } + ei.IncludedDetectors = newEnv.GetActiveDetectors().StringList() r := &pb.NewEnvironmentReply{ Environment: ei, Public: newEnv.Public, } - return r, nil + return r, err } -func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (*pb.GetEnvironmentReply, error) { +func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (reply *pb.GetEnvironmentReply, err error) { m.logMethod() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() } - envId, err := uid.FromString(req.Id) + var envId uid.ID + envId, err = uid.FromString(req.Id) if err != nil { return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() } - env, err := m.state.environments.Environment(envId) + var env *environment.Environment + env, err = m.state.environments.Environment(envId) if err != nil { return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } tasks := env.Workflow().GetTasks() - r := &pb.GetEnvironmentReply{ + reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ Id: env.Id().String(), CreatedWhen: env.CreatedWhen().Format(time.RFC3339), @@ -298,7 +307,8 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe Workflow: workflowToRoleTree(env.Workflow()), Public: env.Public, } - return r, nil + reply.Environment.IncludedDetectors = env.GetActiveDetectors().StringList() + return } func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvironmentRequest) (*pb.ControlEnvironmentReply, error) { @@ -430,6 +440,18 @@ func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force boo return &pb.DestroyEnvironmentReply{CleanupTasksReply: ctr}, nil } +func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetActiveDetectorsReply, error) { + m.logMethod() + r := &pb.GetActiveDetectorsReply{ + Detectors: make([]string, 0), + } + detIds := m.state.environments.GetActiveDetectors() + r.Detectors = detIds.StringList() + + sort.Strings(r.Detectors) + return r, nil +} + func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasksReply, error) { m.logMethod() From 260f1057ebb4245057af1ebfcb659e674400fb46 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Aug 2021 17:32:50 +0200 Subject: [PATCH 0986/2352] [core] Detector information in coconut info --- coconut/control/control.go | 14 +- coconut/protos/o2control.pb.go | 1273 ++++++++++++++++---------------- core/protos/o2control.pb.go | 1273 ++++++++++++++++---------------- core/protos/o2control.proto | 3 + core/server.go | 47 +- 5 files changed, 1352 insertions(+), 1258 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 02248e35d..186c8985d 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -139,6 +139,12 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar _, _ = fmt.Fprintf(o, "active tasks count: %s\n", green(response.GetTasksCount())) _, _ = fmt.Fprintf(o, "global state: %s\n", colorGlobalState(response.GetState())) + allDetectors := response.GetDetectorsInInstance() + _, _ = fmt.Fprintf(o, "detectors in instance: %s (%d total)\n", green(strings.Join(allDetectors, " ")), len(allDetectors)) + _, _ = fmt.Fprintf(o, " active (in use): %s\n", yellow(strings.Join(response.GetActiveDetectors(), " "))) + _, _ = fmt.Fprintf(o, " available: %s\n", green(strings.Join(response.GetAvailableDetectors(), " "))) + + // Integrated Services API query pluginsResponse, err := rpc.GetIntegratedServices(cxt, &pb.Empty{}, grpc.EmptyCallOption{}) if err != nil { @@ -193,16 +199,14 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar svcEndpoint = green(svcEndpoint) } - _, _ = fmt.Fprintf(o, " %-20s%s\n", "service name:", svc.GetName()) _, _ = fmt.Fprintf(o, " %-20s%s\n", "endpoint:", svcEndpoint) _, _ = fmt.Fprintf(o, " %-20s%s\n", "connection state:", connectionState) - _, _ = fmt.Fprintf(o, " %-20s%s\n", "data:", svc.GetData()) - + if svcData := svc.GetData(); svcData != "{}" { + _, _ = fmt.Fprintf(o, " %-20s%s\n", "data:", svcData) + } } - - return nil } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6283d6a0d..15c5f9cdf 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1061,6 +1061,9 @@ type GetFrameworkInfoReply struct { InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` ConfigurationEndpoint string `protobuf:"bytes,8,opt,name=configurationEndpoint,proto3" json:"configurationEndpoint,omitempty"` + DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` + ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` + AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -1151,6 +1154,27 @@ func (x *GetFrameworkInfoReply) GetConfigurationEndpoint() string { return "" } +func (x *GetFrameworkInfoReply) GetDetectorsInInstance() []string { + if x != nil { + return x.DetectorsInInstance + } + return nil +} + +func (x *GetFrameworkInfoReply) GetActiveDetectors() []string { + if x != nil { + return x.ActiveDetectors + } + return nil +} + +func (x *GetFrameworkInfoReply) GetAvailableDetectors() []string { + if x != nil { + return x.AvailableDetectors + } + return nil +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -4647,7 +4671,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xc5, 0x02, 0x0a, 0x15, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, @@ -4668,643 +4692,652 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, - 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x32, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, - 0x77, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, - 0x41, 0x6c, 0x6c, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, - 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, - 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x22, + 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, + 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, - 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, + 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, + 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, + 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, + 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, - 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, + 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, + 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, + 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, + 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, + 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, + 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, + 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, - 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, - 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, - 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, - 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, - 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, - 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, - 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6283d6a0d..15c5f9cdf 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1061,6 +1061,9 @@ type GetFrameworkInfoReply struct { InstanceName string `protobuf:"bytes,6,opt,name=instanceName,proto3" json:"instanceName,omitempty"` Version *Version `protobuf:"bytes,7,opt,name=version,proto3" json:"version,omitempty"` ConfigurationEndpoint string `protobuf:"bytes,8,opt,name=configurationEndpoint,proto3" json:"configurationEndpoint,omitempty"` + DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` + ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` + AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -1151,6 +1154,27 @@ func (x *GetFrameworkInfoReply) GetConfigurationEndpoint() string { return "" } +func (x *GetFrameworkInfoReply) GetDetectorsInInstance() []string { + if x != nil { + return x.DetectorsInInstance + } + return nil +} + +func (x *GetFrameworkInfoReply) GetActiveDetectors() []string { + if x != nil { + return x.ActiveDetectors + } + return nil +} + +func (x *GetFrameworkInfoReply) GetAvailableDetectors() []string { + if x != nil { + return x.AvailableDetectors + } + return nil +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -4647,7 +4671,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xc5, 0x02, 0x0a, 0x15, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, @@ -4668,643 +4692,652 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, - 0x0a, 0x0d, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x32, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, - 0x77, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, - 0x41, 0x6c, 0x6c, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, - 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, - 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x22, + 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, + 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, - 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, + 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x27, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, + 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, + 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, + 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, - 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, + 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, + 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, + 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, + 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, + 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, + 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, + 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, - 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, - 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, - 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, - 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, - 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, - 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, - 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index a6bceea67..553d98b7a 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -152,6 +152,9 @@ message GetFrameworkInfoReply { string instanceName = 6; Version version = 7; string configurationEndpoint = 8; + repeated string detectorsInInstance = 9; + repeated string activeDetectors = 10; + repeated string availableDetectors = 11; } // Not implemented yet diff --git a/core/server.go b/core/server.go index bc3359e47..7f78a7f44 100644 --- a/core/server.go +++ b/core/server.go @@ -32,6 +32,7 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" @@ -142,22 +143,42 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques min, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) + cs := the.ConfSvc() + allDetectors, err := cs.ListDetectors() + if err != nil { + allDetectors = []string{"NIL"} + } + activeDetectorsMap := m.state.environments.GetActiveDetectors() + availableDetectors := make([]string, 0) + for _, det := range allDetectors { + detId, err := system.IDString(det) + if err != nil { + continue + } + if _, contains := activeDetectorsMap[detId]; !contains { + availableDetectors = append(availableDetectors, det) + } + } + r := &pb.GetFrameworkInfoReply{ - FrameworkId: m.state.taskman.GetFrameworkID(), - EnvironmentsCount: int32(len(m.state.environments.Ids())), - TasksCount: int32(m.state.taskman.TaskCount()), - State: m.state.taskman.GetState(), - HostsCount: int32(m.state.taskman.AgentCache.Count()), - InstanceName: viper.GetString("instanceName"), - Version: &pb.Version{ - Major: int32(maj), - Minor: int32(min), - Patch: int32(pat), - Build: product.BUILD, - VersionStr: product.VERSION, - ProductName: product.PRETTY_SHORTNAME, + FrameworkId: m.state.taskman.GetFrameworkID(), + EnvironmentsCount: int32(len(m.state.environments.Ids())), + TasksCount: int32(m.state.taskman.TaskCount()), + State: m.state.taskman.GetState(), + HostsCount: int32(m.state.taskman.AgentCache.Count()), + InstanceName: viper.GetString("instanceName"), + Version: &pb.Version{ + Major: int32(maj), + Minor: int32(min), + Patch: int32(pat), + Build: product.BUILD, + VersionStr: product.VERSION, + ProductName: product.PRETTY_SHORTNAME, }, ConfigurationEndpoint: viper.GetString("configServiceUri"), + DetectorsInInstance: allDetectors, + ActiveDetectors: activeDetectorsMap.StringList(), + AvailableDetectors: availableDetectors, } return r, nil } From fd8c7e5a19dddc88f1b2b2834305d648a484b86f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Aug 2021 17:11:51 +0200 Subject: [PATCH 0987/2352] [coconut] Add detector list to environment show command --- coconut/control/control.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index 186c8985d..e6a8144e5 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -429,6 +429,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com _, _ = fmt.Fprintf(o, "public: %t\n", response.Public) _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) _, _ = fmt.Fprintf(o, "number of FLPs: %s\n", formatNumber(env.GetNumberOfFlps())) + _, _ = fmt.Fprintf(o, "detectors: %s\n", strings.Join(response.GetEnvironment().GetIncludedDetectors(), " ")) if len(defaultsStr) != 0 { _, _ = fmt.Fprintf(o, "global defaults:\n%s\n", defaultsStr) } From 82764b269a97e6f9c751912e364cdd94c88b1c6a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Jun 2021 12:09:17 +0200 Subject: [PATCH 0988/2352] [core] Update DCS protofile --- core/integration/dcs/protos/dcs.proto | 171 +++++++++++++++++--------- 1 file changed, 114 insertions(+), 57 deletions(-) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index d39d04eae..88b92aebe 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -1,8 +1,9 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2020-2021 CERN and copyright holders of ALICE O². + * Authors: Teo Mrnjavac + * Ombretta Pinazza * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,7 +22,6 @@ * immunities granted to it by virtue of its status as an * Intergovernmental Organization or submit itself to any jurisdiction. */ -/* Modified OmbrettaPinazza@DCS 13/11/2020 */ syntax = "proto3"; package dcs; @@ -31,92 +31,144 @@ option go_package = "protos;dcspb"; ////////////////////////////////////////////////////// service Configurator { + // Optional call, legal at any time, to subscribe to all future events from + // the DCS service. The server stops serving the stream when the client closes + // it. Multiple concurrent stream subscriptions are allowed. rpc Subscribe (SubscriptionRequest) returns (stream Event) {} - rpc StartOfRun (SorRequest) returns (stream Event) {} - rpc EndOfRun (EorRequest) returns (stream Event) {} - rpc GetStatus (StatusRequest) returns (stream StatusReply) {} + + // Single SOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server + // closes the stream. + rpc StartOfRun (SorRequest) returns (stream RunEvent) {} + + // Single EOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the EOR operation. Upon EOR completion (DetectorState.RUN_OK), the server + // closes the stream. + rpc EndOfRun (EorRequest) returns (stream RunEvent) {} + + // Optional call, legal at any time, to query the status of the DCS service + // and either some or all of its constituent detectors. This call returns a + // single value (not a stream), reflecting the service state at that + // specific moment. + rpc GetStatus (StatusRequest) returns (StatusReply) {} } ////////////////////////////////////////////////////// // Message definitions ////////////////////////////////////////////////////// +// Note that all fields are optional in Proto3, so some might arrive empty from the +// client. See the gRPC documentation for language-specific default values. + +////////////////////////////////////////////////////// +// Common structures +////////////////////////////////////////////////////// + +// A DetectorInfo is a full status report for a single detector, multiple such +// payloads are then aggregated in a StatusReply or Subscribe Event. +message DetectorInfo { + Detector detector = 1; // 1 detector per DetectorInfo + DetectorState state = 2;// state of this detector at the time of response generation + string timestamp = 3; // time when the detector state is as declared + repeated RunType allowedRunTypes = 4; // a list of run types that are currently + // possible with the given detector, taking into + // account all low-level information; + // for example, at a given moment TECHNICAL + // runs might be possible but not PHYSICS +} + +////////////////////////////////////////////////////// // Subscribe call +////////////////////////////////////////////////////// message SubscriptionRequest { string instanceId = 1; } +// The Subscribe response stream returns Event payloads: +// 1) as needed, Events of type ERROR_EVENT, TIMEOUT, etc. when something unexpected +// happens, especially outside of a SOR or EOR operation (which are already served +// by operation-specific streams) +// 2) periodically, Events of type HEARTBEAT with a full detectorMatrix to republish +// the full status of all detectors in the system +// 3) as needed, Events of type STATE_CHANGE_EVENT and similar, with a partial +// detectorMatrix that only reflects the changes in some detectors, usually when +// the internal state of a detector has changed on the DCS side in some way that +// makes a new RunType possible, or that inhibits a RunType that was previously +// possible and now isn't any more. message Event { - EventType eventtype = 1; - Detector detector = 2; - string parameters = 3; - string timestamp = 4; - //EventType type = 1; - //Detector detector = 2; - //string name = 3; - //string description = 4; - //DetectorState state = 5; - - // Note that all fields are optional in Proto3, so some of the above might arrive empty - // from the client. - // However, sometimes we want to add more information for certain types of event but - // not for others. A map is a type-unsafe way to do this, but we can also - // transmit complex optional structures via gRPC/Protobuf with the oneof operator. - // A oneof{} entry makes sure that only one of the contained entries is set. - // This is an example on how to embed additional strongly typed fields to this message: - //oneof ErrorEvent { - // TransitionErrorEvent = 6; - // InternalErrorEvent = 7; - // DetectorNotReadyEvent = 8; - // //... - //} + EventType eventtype = 1; // type of event being published by the DCS service + repeated DetectorInfo detectorMatrix = 2; // detector-specific status payloads (optional depending + // on event type) + map extraParameters = 3; // general key-value map just in case + string timestamp = 4; // this corresponds to the moment where this Event-answer + // was valid from the source + string message = 5; // optional user-facing error message, if the DCS wants to + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user } +////////////////////////////////////////////////////// // SOR/EOR calls -//-- I've added runNumber, as it should be a requested field +////////////////////////////////////////////////////// + +// Each SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. +// This is needed in order to pass per-detector parameters within a single SOR/EOR operation. +message DetectorOperationRequest { + Detector detector = 1; + map extraParameters = 2; // detector-specific parameters + // may include ddl_list or cluster_sum (the latter only for MCH) +} +// A SorRequest encapsulates a list of detector-specific request payloads, +// plus a common runType and a runNumber for the run about to start. message SorRequest { - repeated Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command - RunType runType = 2; + repeated DetectorOperationRequest detectors = 1; + RunType runType = 2; // default: NULL_RUNTYPE, should probably never be sent int32 runNumber = 3; - //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters - map parameters = 4; // this can be a map or something strongly typed as we figure it out } +// An EorRequest encapsulates a list of detector-specific request payloads, +// plus a runNumber to identify the run being stopped. message EorRequest { - repeated Detector detector = 1; // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command + repeated DetectorOperationRequest detectors = 1; int32 runNumber = 2; - map parameters = 3; // does EOR need other params? } +// A stream of Event objects is returned by SOR and EOR calls. +// Most fields are optional and filled as needed, depending on the type of request. +message RunEvent { + EventType eventtype = 1; // type of event being published by the DCS service + Detector detector = 2; // if detector==DCS, the update is a pre-closure summary + // of the current operation + DetectorState state = 3; // aggregate state for all detectors involved in current + // SOR/EOR operation + map extraParameters = 4; + string timestamp = 5; + string message = 6; // optional user-facing error message, if the DCS wants to + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user +} + +////////////////////////////////////////////////////// // GetStatus call +////////////////////////////////////////////////////// +// Payload for the GetStatus call, just a list of detectors to query. message StatusRequest { repeated Detector detector = 1; - // In proto3 all fields are optional, with Protobuf assuming a zero value for empty fields. - // Thus if the client sends this request with empty detector or detector = NULL_DETECTOR, - // the server should return the status of all detectors. - //--we should add repeated, but the Reply would become a stream -} -message DetectorInfo { - Detector detector = 1; - DetectorState state = 2; - string timestamp = 3; - //repeated RunType allowedRunTypes = 3; //?what is this + // If the client sends this request with empty detector list, the server should return + // the status of all detectors. } + +// Aggregate response to a GetStatus call, wraps around a list of DetectorInfo +// payloads. message StatusReply { - //repeated DetectorInfo detectorMatrix = 1; - Detector detector = 1; - DetectorState state = 2; - string timestamp = 3; - //repeated RunType allowedRunTypes = 3; //? + repeated DetectorInfo detectorMatrix = 1; // an exhaustive list of DetectorInfos + // one for each detector } -//message StatusReply { -// repeated DetectorInfo detectorMatrix = 1; -// //repeated RunType allowedRunTypes = 3; //?what is this/ -//} - ////////////////////////////////////////////////////// // Enum definitions @@ -175,7 +227,12 @@ enum RunType { PEDESTALS = 3; PULSER = 4; } -enum TriggerMode { + +enum TriggerMode { // FIXME: unused CONTINUOUS = 0; TRIGGERED = 1; } +enum SorMode { // FIXME: unused + FULL = 0; + FAST = 1; +} \ No newline at end of file From 119130f69565a38328602485d90a137f9a140958 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Aug 2021 10:56:37 +0200 Subject: [PATCH 0989/2352] [core] Add LASER run type --- common/runtype/runtype.go | 1 + common/runtype/runtype_strings.go | 28 +- core/integration/dcs/plugin.go | 9 +- core/integration/dcs/protos/dcs.pb.go | 840 ++++++++++++++------- core/integration/dcs/protos/dcs.proto | 1 + core/integration/dcs/protos/dcs_grpc.pb.go | 134 ++-- 6 files changed, 647 insertions(+), 366 deletions(-) diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 6c858a3bd..a8d736548 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -34,6 +34,7 @@ const ( TECHNICAL PEDESTAL PULSER + LASER // no correspondence with DCS: CALIBRATION diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index e0322012b..34dc94dcd 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERCALIBRATIONCOSMIC" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATIONCOSMIC" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 45, 51} +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 50, 56} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulsercalibrationcosmic" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibrationcosmic" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -30,11 +30,12 @@ func _RunTypeNoOp() { _ = x[TECHNICAL-(2)] _ = x[PEDESTAL-(3)] _ = x[PULSER-(4)] - _ = x[CALIBRATION-(5)] - _ = x[COSMIC-(6)] + _ = x[LASER-(5)] + _ = x[CALIBRATION-(6)] + _ = x[COSMIC-(7)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, CALIBRATION, COSMIC} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION, COSMIC} var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeName[0:4]: NONE, @@ -47,10 +48,12 @@ var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeLowerName[20:28]: PEDESTAL, _RunTypeName[28:34]: PULSER, _RunTypeLowerName[28:34]: PULSER, - _RunTypeName[34:45]: CALIBRATION, - _RunTypeLowerName[34:45]: CALIBRATION, - _RunTypeName[45:51]: COSMIC, - _RunTypeLowerName[45:51]: COSMIC, + _RunTypeName[34:39]: LASER, + _RunTypeLowerName[34:39]: LASER, + _RunTypeName[39:50]: CALIBRATION, + _RunTypeLowerName[39:50]: CALIBRATION, + _RunTypeName[50:56]: COSMIC, + _RunTypeLowerName[50:56]: COSMIC, } var _RunTypeNames = []string{ @@ -59,8 +62,9 @@ var _RunTypeNames = []string{ _RunTypeName[11:20], _RunTypeName[20:28], _RunTypeName[28:34], - _RunTypeName[34:45], - _RunTypeName[45:51], + _RunTypeName[34:39], + _RunTypeName[39:50], + _RunTypeName[50:56], } // RunTypeString retrieves an enum value from the enum constants string name. diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c2045b6cf..c8dcc5857 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -37,6 +37,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" @@ -183,9 +184,11 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { runTypeS, ok := varStack["run_type"] if ok { // a detector is defined in the var stack - intRt, ok := dcspb.RunType_value[runTypeS] - if ok { - // the runType was correctly matched to the DCS enum + // so we convert from the provided string to the correct enum value in common/runtype + intRt, err := runtype.RunTypeString(runTypeS) + if err == nil { + // the runType was correctly matched to the common/runtype enum, but since the DCS enum is + // kept compatible, we can directly convert the runtype.RunType to a dcspb.RunType enum value rt = dcspb.RunType(intRt) } } diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 6ceebb560..3acaeed11 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -1,8 +1,9 @@ // // === This file is part of ALICE O² === // -// Copyright 2020 CERN and copyright holders of ALICE O². -// Author: Teo Mrnjavac +// Copyright 2020-2021 CERN and copyright holders of ALICE O². +// Authors: Teo Mrnjavac +// Ombretta Pinazza // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -21,8 +22,6 @@ // immunities granted to it by virtue of its status as an // Intergovernmental Organization or submit itself to any jurisdiction. -// Modified OmbrettaPinazza@DCS 13/11/2020 - // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 @@ -289,6 +288,7 @@ const ( RunType_TECHNICAL RunType = 2 RunType_PEDESTALS RunType = 3 RunType_PULSER RunType = 4 + RunType_LASER RunType = 5 ) // Enum value maps for RunType. @@ -299,6 +299,7 @@ var ( 2: "TECHNICAL", 3: "PEDESTALS", 4: "PULSER", + 5: "LASER", } RunType_value = map[string]int32{ "NULL_RUNTYPE": 0, @@ -306,6 +307,7 @@ var ( "TECHNICAL": 2, "PEDESTALS": 3, "PULSER": 4, + "LASER": 5, } ) @@ -382,6 +384,125 @@ func (TriggerMode) EnumDescriptor() ([]byte, []int) { return file_protos_dcs_proto_rawDescGZIP(), []int{4} } +type SorMode int32 + +const ( + SorMode_FULL SorMode = 0 + SorMode_FAST SorMode = 1 +) + +// Enum value maps for SorMode. +var ( + SorMode_name = map[int32]string{ + 0: "FULL", + 1: "FAST", + } + SorMode_value = map[string]int32{ + "FULL": 0, + "FAST": 1, + } +) + +func (x SorMode) Enum() *SorMode { + p := new(SorMode) + *p = x + return p +} + +func (x SorMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SorMode) Descriptor() protoreflect.EnumDescriptor { + return file_protos_dcs_proto_enumTypes[5].Descriptor() +} + +func (SorMode) Type() protoreflect.EnumType { + return &file_protos_dcs_proto_enumTypes[5] +} + +func (x SorMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SorMode.Descriptor instead. +func (SorMode) EnumDescriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{5} +} + +// A DetectorInfo is a full status report for a single detector, multiple such +// payloads are then aggregated in a StatusReply or Subscribe Event. +type DetectorInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // 1 detector per DetectorInfo + State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` // state of this detector at the time of response generation + Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // time when the detector state is as declared + AllowedRunTypes []RunType `protobuf:"varint,4,rep,packed,name=allowedRunTypes,proto3,enum=dcs.RunType" json:"allowedRunTypes,omitempty"` // a list of run types that are currently +} + +func (x *DetectorInfo) Reset() { + *x = DetectorInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorInfo) ProtoMessage() {} + +func (x *DetectorInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorInfo.ProtoReflect.Descriptor instead. +func (*DetectorInfo) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{0} +} + +func (x *DetectorInfo) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *DetectorInfo) GetState() DetectorState { + if x != nil { + return x.State + } + return DetectorState_NULL_STATE +} + +func (x *DetectorInfo) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (x *DetectorInfo) GetAllowedRunTypes() []RunType { + if x != nil { + return x.AllowedRunTypes + } + return nil +} + type SubscriptionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -393,7 +514,7 @@ type SubscriptionRequest struct { func (x *SubscriptionRequest) Reset() { *x = SubscriptionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[0] + mi := &file_protos_dcs_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -406,7 +527,7 @@ func (x *SubscriptionRequest) String() string { func (*SubscriptionRequest) ProtoMessage() {} func (x *SubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[0] + mi := &file_protos_dcs_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -419,7 +540,7 @@ func (x *SubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionRequest.ProtoReflect.Descriptor instead. func (*SubscriptionRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{0} + return file_protos_dcs_proto_rawDescGZIP(), []int{1} } func (x *SubscriptionRequest) GetInstanceId() string { @@ -429,21 +550,35 @@ func (x *SubscriptionRequest) GetInstanceId() string { return "" } +// The Subscribe response stream returns Event payloads: +// 1) as needed, Events of type ERROR_EVENT, TIMEOUT, etc. when something unexpected +// happens, especially outside of a SOR or EOR operation (which are already served +// by operation-specific streams) +// 2) periodically, Events of type HEARTBEAT with a full detectorMatrix to republish +// the full status of all detectors in the system +// 3) as needed, Events of type STATE_CHANGE_EVENT and similar, with a partial +// detectorMatrix that only reflects the changes in some detectors, usually when +// the internal state of a detector has changed on the DCS side in some way that +// makes a new RunType possible, or that inhibits a RunType that was previously +// possible and now isn't any more. type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` - Detector Detector `protobuf:"varint,2,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` - Parameters string `protobuf:"bytes,3,opt,name=parameters,proto3" json:"parameters,omitempty"` - Timestamp string `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` // type of event being published by the DCS service + DetectorMatrix []*DetectorInfo `protobuf:"bytes,2,rep,name=detectorMatrix,proto3" json:"detectorMatrix,omitempty"` // detector-specific status payloads (optional depending + // on event type) + ExtraParameters map[string]string `protobuf:"bytes,3,rep,name=extraParameters,proto3" json:"extraParameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // general key-value map just in case + Timestamp string `protobuf:"bytes,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // this corresponds to the moment where this Event-answer + // was valid from the source + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // optional user-facing error message, if the DCS wants to } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[1] + mi := &file_protos_dcs_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -456,7 +591,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[1] + mi := &file_protos_dcs_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -469,7 +604,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{1} + return file_protos_dcs_proto_rawDescGZIP(), []int{2} } func (x *Event) GetEventtype() EventType { @@ -479,18 +614,18 @@ func (x *Event) GetEventtype() EventType { return EventType_NULL_EVENT } -func (x *Event) GetDetector() Detector { +func (x *Event) GetDetectorMatrix() []*DetectorInfo { if x != nil { - return x.Detector + return x.DetectorMatrix } - return Detector_NULL_DETECTOR + return nil } -func (x *Event) GetParameters() string { +func (x *Event) GetExtraParameters() map[string]string { if x != nil { - return x.Parameters + return x.ExtraParameters } - return "" + return nil } func (x *Event) GetTimestamp() string { @@ -500,22 +635,86 @@ func (x *Event) GetTimestamp() string { return "" } +func (x *Event) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Each SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. +// This is needed in order to pass per-detector parameters within a single SOR/EOR operation. +type DetectorOperationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` + ExtraParameters map[string]string `protobuf:"bytes,2,rep,name=extraParameters,proto3" json:"extraParameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // detector-specific parameters +} + +func (x *DetectorOperationRequest) Reset() { + *x = DetectorOperationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorOperationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorOperationRequest) ProtoMessage() {} + +func (x *DetectorOperationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorOperationRequest.ProtoReflect.Descriptor instead. +func (*DetectorOperationRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{3} +} + +func (x *DetectorOperationRequest) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *DetectorOperationRequest) GetExtraParameters() map[string]string { + if x != nil { + return x.ExtraParameters + } + return nil +} + +// A SorRequest encapsulates a list of detector-specific request payloads, +// plus a common runType and a runNumber for the run about to start. type SorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per SOR command - RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - //TriggerMode triggerMode = 4 // this is missing, but can be in the parameters - Parameters map[string]string `protobuf:"bytes,4,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // this can be a map or something strongly typed as we figure it out + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` } func (x *SorRequest) Reset() { *x = SorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[2] + mi := &file_protos_dcs_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -528,7 +727,7 @@ func (x *SorRequest) String() string { func (*SorRequest) ProtoMessage() {} func (x *SorRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[2] + mi := &file_protos_dcs_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -541,12 +740,12 @@ func (x *SorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SorRequest.ProtoReflect.Descriptor instead. func (*SorRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{2} + return file_protos_dcs_proto_rawDescGZIP(), []int{4} } -func (x *SorRequest) GetDetector() []Detector { +func (x *SorRequest) GetDetectors() []*DetectorOperationRequest { if x != nil { - return x.Detector + return x.Detectors } return nil } @@ -565,27 +764,21 @@ func (x *SorRequest) GetRunNumber() int32 { return 0 } -func (x *SorRequest) GetParameters() map[string]string { - if x != nil { - return x.Parameters - } - return nil -} - +// An EorRequest encapsulates a list of detector-specific request payloads, +// plus a runNumber to identify the run being stopped. type EorRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // or repeated Detector detectors = 1; if we want to allow multiple detectors per EOR command - RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - Parameters map[string]string `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // does EOR need other params? + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` } func (x *EorRequest) Reset() { *x = EorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[3] + mi := &file_protos_dcs_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -598,7 +791,7 @@ func (x *EorRequest) String() string { func (*EorRequest) ProtoMessage() {} func (x *EorRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[3] + mi := &file_protos_dcs_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -611,12 +804,12 @@ func (x *EorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EorRequest.ProtoReflect.Descriptor instead. func (*EorRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{3} + return file_protos_dcs_proto_rawDescGZIP(), []int{5} } -func (x *EorRequest) GetDetector() []Detector { +func (x *EorRequest) GetDetectors() []*DetectorOperationRequest { if x != nil { - return x.Detector + return x.Detectors } return nil } @@ -628,38 +821,40 @@ func (x *EorRequest) GetRunNumber() int32 { return 0 } -func (x *EorRequest) GetParameters() map[string]string { - if x != nil { - return x.Parameters - } - return nil -} - -type StatusRequest struct { +// A stream of Event objects is returned by SOR and EOR calls. +// Most fields are optional and filled as needed, depending on the type of request. +type RunEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` + Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` // type of event being published by the DCS service + Detector Detector `protobuf:"varint,2,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // if detector==DCS, the update is a pre-closure summary + // of the current operation + State DetectorState `protobuf:"varint,3,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` // aggregate state for all detectors involved in current + // SOR/EOR operation + ExtraParameters map[string]string `protobuf:"bytes,4,rep,name=extraParameters,proto3" json:"extraParameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Timestamp string `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Message string `protobuf:"bytes,6,opt,name=message,proto3" json:"message,omitempty"` // optional user-facing error message, if the DCS wants to } -func (x *StatusRequest) Reset() { - *x = StatusRequest{} +func (x *RunEvent) Reset() { + *x = RunEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[4] + mi := &file_protos_dcs_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *StatusRequest) String() string { +func (x *RunEvent) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StatusRequest) ProtoMessage() {} +func (*RunEvent) ProtoMessage() {} -func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[4] +func (x *RunEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -670,45 +865,79 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. -func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{4} +// Deprecated: Use RunEvent.ProtoReflect.Descriptor instead. +func (*RunEvent) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{6} } -func (x *StatusRequest) GetDetector() []Detector { +func (x *RunEvent) GetEventtype() EventType { + if x != nil { + return x.Eventtype + } + return EventType_NULL_EVENT +} + +func (x *RunEvent) GetDetector() Detector { if x != nil { return x.Detector } + return Detector_NULL_DETECTOR +} + +func (x *RunEvent) GetState() DetectorState { + if x != nil { + return x.State + } + return DetectorState_NULL_STATE +} + +func (x *RunEvent) GetExtraParameters() map[string]string { + if x != nil { + return x.ExtraParameters + } return nil } -type DetectorInfo struct { +func (x *RunEvent) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (x *RunEvent) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Payload for the GetStatus call, just a list of detectors to query. +type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` - State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` - Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` //repeated RunType allowedRunTypes = 3; //?what is this + Detector []Detector `protobuf:"varint,1,rep,packed,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` } -func (x *DetectorInfo) Reset() { - *x = DetectorInfo{} +func (x *StatusRequest) Reset() { + *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[5] + mi := &file_protos_dcs_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *DetectorInfo) String() string { +func (x *StatusRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*DetectorInfo) ProtoMessage() {} +func (*StatusRequest) ProtoMessage() {} -func (x *DetectorInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[5] +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -719,47 +948,32 @@ func (x *DetectorInfo) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use DetectorInfo.ProtoReflect.Descriptor instead. -func (*DetectorInfo) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{5} +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{7} } -func (x *DetectorInfo) GetDetector() Detector { +func (x *StatusRequest) GetDetector() []Detector { if x != nil { return x.Detector } - return Detector_NULL_DETECTOR -} - -func (x *DetectorInfo) GetState() DetectorState { - if x != nil { - return x.State - } - return DetectorState_NULL_STATE -} - -func (x *DetectorInfo) GetTimestamp() string { - if x != nil { - return x.Timestamp - } - return "" + return nil } +// Aggregate response to a GetStatus call, wraps around a list of DetectorInfo +// payloads. type StatusReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - //repeated DetectorInfo detectorMatrix = 1; - Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` - State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` - Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` //repeated RunType allowedRunTypes = 3; //? + DetectorMatrix []*DetectorInfo `protobuf:"bytes,1,rep,name=detectorMatrix,proto3" json:"detectorMatrix,omitempty"` // an exhaustive list of DetectorInfos } func (x *StatusReply) Reset() { *x = StatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[6] + mi := &file_protos_dcs_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -772,7 +986,7 @@ func (x *StatusReply) String() string { func (*StatusReply) ProtoMessage() {} func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[6] + mi := &file_protos_dcs_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -785,155 +999,176 @@ func (x *StatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{6} -} - -func (x *StatusReply) GetDetector() Detector { - if x != nil { - return x.Detector - } - return Detector_NULL_DETECTOR -} - -func (x *StatusReply) GetState() DetectorState { - if x != nil { - return x.State - } - return DetectorState_NULL_STATE + return file_protos_dcs_proto_rawDescGZIP(), []int{8} } -func (x *StatusReply) GetTimestamp() string { +func (x *StatusReply) GetDetectorMatrix() []*DetectorInfo { if x != nil { - return x.Timestamp + return x.DetectorMatrix } - return "" + return nil } var File_protos_dcs_proto protoreflect.FileDescriptor var file_protos_dcs_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x03, 0x64, 0x63, 0x73, 0x22, 0x35, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x9e, - 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0xfd, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd5, 0x01, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, + 0x74, 0x6f, 0x12, 0x03, 0x64, 0x63, 0x73, 0x22, 0xb9, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x22, 0x81, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x0f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xb7, 0x02, 0x0a, 0x05, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, + 0x74, 0x72, 0x69, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x49, 0x0a, + 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe7, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x0f, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, + 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, + 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, + 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, + 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x80, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2a, 0x8d, 0x01, 0x0a, 0x09, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, - 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, - 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, - 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, - 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x0b, 0x0a, - 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xb6, 0x01, 0x0a, 0x08, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, - 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, - 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, - 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, - 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, - 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, - 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, - 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, - 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, - 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, - 0x53, 0x10, 0x11, 0x2a, 0xb9, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, - 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, - 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, - 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, - 0x52, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, - 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, - 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, - 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, - 0x52, 0x10, 0x04, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, - 0x01, 0x32, 0xd8, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2d, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2b, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, - 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x35, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x42, 0x21, 0x0a, 0x11, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, - 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, + 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, + 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0x8d, 0x01, 0x0a, 0x09, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, + 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, + 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, + 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, + 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, + 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x0b, 0x0a, 0x07, + 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xb6, 0x01, 0x0a, 0x08, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, + 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, + 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, + 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, + 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, + 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, + 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, + 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, + 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, + 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, + 0x10, 0x11, 0x2a, 0xb9, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, + 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, + 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, 0x5d, + 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, + 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, + 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, + 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, + 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x2a, 0x2c, 0x0a, + 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, + 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, + 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, + 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, + 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, 0x11, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x0c, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -948,50 +1183,59 @@ func file_protos_dcs_proto_rawDescGZIP() []byte { return file_protos_dcs_proto_rawDescData } -var file_protos_dcs_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_dcs_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_protos_dcs_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_protos_dcs_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_protos_dcs_proto_goTypes = []interface{}{ - (EventType)(0), // 0: dcs.EventType - (Detector)(0), // 1: dcs.Detector - (DetectorState)(0), // 2: dcs.DetectorState - (RunType)(0), // 3: dcs.RunType - (TriggerMode)(0), // 4: dcs.TriggerMode - (*SubscriptionRequest)(nil), // 5: dcs.SubscriptionRequest - (*Event)(nil), // 6: dcs.Event - (*SorRequest)(nil), // 7: dcs.SorRequest - (*EorRequest)(nil), // 8: dcs.EorRequest - (*StatusRequest)(nil), // 9: dcs.StatusRequest - (*DetectorInfo)(nil), // 10: dcs.DetectorInfo - (*StatusReply)(nil), // 11: dcs.StatusReply - nil, // 12: dcs.SorRequest.ParametersEntry - nil, // 13: dcs.EorRequest.ParametersEntry + (EventType)(0), // 0: dcs.EventType + (Detector)(0), // 1: dcs.Detector + (DetectorState)(0), // 2: dcs.DetectorState + (RunType)(0), // 3: dcs.RunType + (TriggerMode)(0), // 4: dcs.TriggerMode + (SorMode)(0), // 5: dcs.SorMode + (*DetectorInfo)(nil), // 6: dcs.DetectorInfo + (*SubscriptionRequest)(nil), // 7: dcs.SubscriptionRequest + (*Event)(nil), // 8: dcs.Event + (*DetectorOperationRequest)(nil), // 9: dcs.DetectorOperationRequest + (*SorRequest)(nil), // 10: dcs.SorRequest + (*EorRequest)(nil), // 11: dcs.EorRequest + (*RunEvent)(nil), // 12: dcs.RunEvent + (*StatusRequest)(nil), // 13: dcs.StatusRequest + (*StatusReply)(nil), // 14: dcs.StatusReply + nil, // 15: dcs.Event.ExtraParametersEntry + nil, // 16: dcs.DetectorOperationRequest.ExtraParametersEntry + nil, // 17: dcs.RunEvent.ExtraParametersEntry } var file_protos_dcs_proto_depIdxs = []int32{ - 0, // 0: dcs.Event.eventtype:type_name -> dcs.EventType - 1, // 1: dcs.Event.detector:type_name -> dcs.Detector - 1, // 2: dcs.SorRequest.detector:type_name -> dcs.Detector - 3, // 3: dcs.SorRequest.runType:type_name -> dcs.RunType - 12, // 4: dcs.SorRequest.parameters:type_name -> dcs.SorRequest.ParametersEntry - 1, // 5: dcs.EorRequest.detector:type_name -> dcs.Detector - 13, // 6: dcs.EorRequest.parameters:type_name -> dcs.EorRequest.ParametersEntry - 1, // 7: dcs.StatusRequest.detector:type_name -> dcs.Detector - 1, // 8: dcs.DetectorInfo.detector:type_name -> dcs.Detector - 2, // 9: dcs.DetectorInfo.state:type_name -> dcs.DetectorState - 1, // 10: dcs.StatusReply.detector:type_name -> dcs.Detector - 2, // 11: dcs.StatusReply.state:type_name -> dcs.DetectorState - 5, // 12: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest - 7, // 13: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest - 8, // 14: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest - 9, // 15: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest - 6, // 16: dcs.Configurator.Subscribe:output_type -> dcs.Event - 6, // 17: dcs.Configurator.StartOfRun:output_type -> dcs.Event - 6, // 18: dcs.Configurator.EndOfRun:output_type -> dcs.Event - 11, // 19: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply - 16, // [16:20] is the sub-list for method output_type - 12, // [12:16] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 1, // 0: dcs.DetectorInfo.detector:type_name -> dcs.Detector + 2, // 1: dcs.DetectorInfo.state:type_name -> dcs.DetectorState + 3, // 2: dcs.DetectorInfo.allowedRunTypes:type_name -> dcs.RunType + 0, // 3: dcs.Event.eventtype:type_name -> dcs.EventType + 6, // 4: dcs.Event.detectorMatrix:type_name -> dcs.DetectorInfo + 15, // 5: dcs.Event.extraParameters:type_name -> dcs.Event.ExtraParametersEntry + 1, // 6: dcs.DetectorOperationRequest.detector:type_name -> dcs.Detector + 16, // 7: dcs.DetectorOperationRequest.extraParameters:type_name -> dcs.DetectorOperationRequest.ExtraParametersEntry + 9, // 8: dcs.SorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 3, // 9: dcs.SorRequest.runType:type_name -> dcs.RunType + 9, // 10: dcs.EorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 0, // 11: dcs.RunEvent.eventtype:type_name -> dcs.EventType + 1, // 12: dcs.RunEvent.detector:type_name -> dcs.Detector + 2, // 13: dcs.RunEvent.state:type_name -> dcs.DetectorState + 17, // 14: dcs.RunEvent.extraParameters:type_name -> dcs.RunEvent.ExtraParametersEntry + 1, // 15: dcs.StatusRequest.detector:type_name -> dcs.Detector + 6, // 16: dcs.StatusReply.detectorMatrix:type_name -> dcs.DetectorInfo + 7, // 17: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest + 10, // 18: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest + 11, // 19: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest + 13, // 20: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest + 8, // 21: dcs.Configurator.Subscribe:output_type -> dcs.Event + 12, // 22: dcs.Configurator.StartOfRun:output_type -> dcs.RunEvent + 12, // 23: dcs.Configurator.EndOfRun:output_type -> dcs.RunEvent + 14, // 24: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply + 21, // [21:25] is the sub-list for method output_type + 17, // [17:21] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_protos_dcs_proto_init() } @@ -1001,7 +1245,7 @@ func file_protos_dcs_proto_init() { } if !protoimpl.UnsafeEnabled { file_protos_dcs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscriptionRequest); i { + switch v := v.(*DetectorInfo); i { case 0: return &v.state case 1: @@ -1013,7 +1257,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*SubscriptionRequest); i { case 0: return &v.state case 1: @@ -1025,7 +1269,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SorRequest); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -1037,7 +1281,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EorRequest); i { + switch v := v.(*DetectorOperationRequest); i { case 0: return &v.state case 1: @@ -1049,7 +1293,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { + switch v := v.(*SorRequest); i { case 0: return &v.state case 1: @@ -1061,7 +1305,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorInfo); i { + switch v := v.(*EorRequest); i { case 0: return &v.state case 1: @@ -1073,6 +1317,30 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusReply); i { case 0: return &v.state @@ -1090,8 +1358,8 @@ func file_protos_dcs_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_dcs_proto_rawDesc, - NumEnums: 5, - NumMessages: 9, + NumEnums: 6, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 88b92aebe..8b657ef46 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -226,6 +226,7 @@ enum RunType { TECHNICAL = 2; PEDESTALS = 3; PULSER = 4; + LASER = 5; } enum TriggerMode { // FIXME: unused diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index d27cf4db1..0d6491fa4 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -18,10 +18,25 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ConfiguratorClient interface { + // Optional call, legal at any time, to subscribe to all future events from + // the DCS service. The server stops serving the stream when the client closes + // it. Multiple concurrent stream subscriptions are allowed. Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) + // Single SOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server + // closes the stream. StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) + // Single EOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the EOR operation. Upon EOR completion (DetectorState.RUN_OK), the server + // closes the stream. EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) - GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) + // Optional call, legal at any time, to query the status of the DCS service + // and either some or all of its constituent detectors. This call returns a + // single value (not a stream), reflecting the service state at that + // specific moment. + GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) } type configuratorClient struct { @@ -80,7 +95,7 @@ func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opt } type Configurator_StartOfRunClient interface { - Recv() (*Event, error) + Recv() (*RunEvent, error) grpc.ClientStream } @@ -88,8 +103,8 @@ type configuratorStartOfRunClient struct { grpc.ClientStream } -func (x *configuratorStartOfRunClient) Recv() (*Event, error) { - m := new(Event) +func (x *configuratorStartOfRunClient) Recv() (*RunEvent, error) { + m := new(RunEvent) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } @@ -112,7 +127,7 @@ func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts } type Configurator_EndOfRunClient interface { - Recv() (*Event, error) + Recv() (*RunEvent, error) grpc.ClientStream } @@ -120,54 +135,46 @@ type configuratorEndOfRunClient struct { grpc.ClientStream } -func (x *configuratorEndOfRunClient) Recv() (*Event, error) { - m := new(Event) +func (x *configuratorEndOfRunClient) Recv() (*RunEvent, error) { + m := new(RunEvent) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } -func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Configurator_GetStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/GetStatus", opts...) +func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { + out := new(StatusReply) + err := c.cc.Invoke(ctx, "/dcs.Configurator/GetStatus", in, out, opts...) if err != nil { return nil, err } - x := &configuratorGetStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Configurator_GetStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type configuratorGetStatusClient struct { - grpc.ClientStream -} - -func (x *configuratorGetStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil + return out, nil } // ConfiguratorServer is the server API for Configurator service. // All implementations should embed UnimplementedConfiguratorServer // for forward compatibility type ConfiguratorServer interface { + // Optional call, legal at any time, to subscribe to all future events from + // the DCS service. The server stops serving the stream when the client closes + // it. Multiple concurrent stream subscriptions are allowed. Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error + // Single SOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server + // closes the stream. StartOfRun(*SorRequest, Configurator_StartOfRunServer) error + // Single EOR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the EOR operation. Upon EOR completion (DetectorState.RUN_OK), the server + // closes the stream. EndOfRun(*EorRequest, Configurator_EndOfRunServer) error - GetStatus(*StatusRequest, Configurator_GetStatusServer) error + // Optional call, legal at any time, to query the status of the DCS service + // and either some or all of its constituent detectors. This call returns a + // single value (not a stream), reflecting the service state at that + // specific moment. + GetStatus(context.Context, *StatusRequest) (*StatusReply, error) } // UnimplementedConfiguratorServer should be embedded to have forward compatible implementations. @@ -183,8 +190,8 @@ func (UnimplementedConfiguratorServer) StartOfRun(*SorRequest, Configurator_Star func (UnimplementedConfiguratorServer) EndOfRun(*EorRequest, Configurator_EndOfRunServer) error { return status.Errorf(codes.Unimplemented, "method EndOfRun not implemented") } -func (UnimplementedConfiguratorServer) GetStatus(*StatusRequest, Configurator_GetStatusServer) error { - return status.Errorf(codes.Unimplemented, "method GetStatus not implemented") +func (UnimplementedConfiguratorServer) GetStatus(context.Context, *StatusRequest) (*StatusReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented") } // UnsafeConfiguratorServer may be embedded to opt out of forward compatibility for this service. @@ -228,7 +235,7 @@ func _Configurator_StartOfRun_Handler(srv interface{}, stream grpc.ServerStream) } type Configurator_StartOfRunServer interface { - Send(*Event) error + Send(*RunEvent) error grpc.ServerStream } @@ -236,7 +243,7 @@ type configuratorStartOfRunServer struct { grpc.ServerStream } -func (x *configuratorStartOfRunServer) Send(m *Event) error { +func (x *configuratorStartOfRunServer) Send(m *RunEvent) error { return x.ServerStream.SendMsg(m) } @@ -249,7 +256,7 @@ func _Configurator_EndOfRun_Handler(srv interface{}, stream grpc.ServerStream) e } type Configurator_EndOfRunServer interface { - Send(*Event) error + Send(*RunEvent) error grpc.ServerStream } @@ -257,29 +264,26 @@ type configuratorEndOfRunServer struct { grpc.ServerStream } -func (x *configuratorEndOfRunServer) Send(m *Event) error { +func (x *configuratorEndOfRunServer) Send(m *RunEvent) error { return x.ServerStream.SendMsg(m) } -func _Configurator_GetStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err +func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) + if err := dec(in); err != nil { + return nil, err } - return srv.(ConfiguratorServer).GetStatus(m, &configuratorGetStatusServer{stream}) -} - -type Configurator_GetStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type configuratorGetStatusServer struct { - grpc.ServerStream -} - -func (x *configuratorGetStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) + if interceptor == nil { + return srv.(ConfiguratorServer).GetStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/dcs.Configurator/GetStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ConfiguratorServer).GetStatus(ctx, req.(*StatusRequest)) + } + return interceptor(ctx, in, info, handler) } // Configurator_ServiceDesc is the grpc.ServiceDesc for Configurator service. @@ -288,7 +292,12 @@ func (x *configuratorGetStatusServer) Send(m *StatusReply) error { var Configurator_ServiceDesc = grpc.ServiceDesc{ ServiceName: "dcs.Configurator", HandlerType: (*ConfiguratorServer)(nil), - Methods: []grpc.MethodDesc{}, + Methods: []grpc.MethodDesc{ + { + MethodName: "GetStatus", + Handler: _Configurator_GetStatus_Handler, + }, + }, Streams: []grpc.StreamDesc{ { StreamName: "Subscribe", @@ -305,11 +314,6 @@ var Configurator_ServiceDesc = grpc.ServiceDesc{ Handler: _Configurator_EndOfRun_Handler, ServerStreams: true, }, - { - StreamName: "GetStatus", - Handler: _Configurator_GetStatus_Handler, - ServerStreams: true, - }, }, Metadata: "protos/dcs.proto", } From 468e8ee0156c76b4a52f636e07e73f10b92cb036 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 18 Aug 2021 16:44:21 +0200 Subject: [PATCH 0990/2352] [core] Adapt DCS client to new DCS protofile --- core/integration/dcs/plugin.go | 134 +++++++++++++++++++++++++-------- 1 file changed, 101 insertions(+), 33 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c8dcc5857..58c7dcb32 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -42,6 +42,7 @@ import ( "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" @@ -204,12 +205,43 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } + // Preparing the per-detector request payload in := dcspb.SorRequest{ - Detector: detectors, - RunType: rt, - RunNumber: int32(runNumber64), - Parameters: argMap, + RunType: rt, + RunNumber: int32(runNumber64), + Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), } + for i, det := range detectors { + perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_sor_parameters"] + if !ok { + log.Debug("empty DCS detectors list provided") + perDetectorParameters = "{}" + } + detectorArgMap := make(map[string]string) + bytes := []byte(perDetectorParameters) + err = json.Unmarshal(bytes, &detectorArgMap) + if err != nil { + log.WithError(err). + WithField("detector", det.String()). + Errorf("error processing DCS SOR parameters for detector %s", det.String()) + return + } + + // Per-detector parameters override any general dcs_sor_parameters + err = mergo.Merge(&detectorArgMap, argMap) + if err != nil { + log.WithError(err). + WithField("detector", det.String()). + Errorf("error building parameter map for detector %s", det.String()) + return + } + + in.Detectors[i] = &dcspb.DetectorOperationRequest{ + Detector: det, + ExtraParameters: detectorArgMap, + } + } + if p.dcsClient == nil { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). @@ -230,7 +262,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Error("failed to perform DCS SOR") } - var dcsEvent *dcspb.Event + var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() if err == io.EOF { @@ -245,20 +277,22 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Warn("bad DCS event received") break } - if dcsEvent.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { - if strings.Contains(dcsEvent.Parameters, "SOR_FAILURE") { - log.WithField("event", dcsEvent).Warn("DCS SOR failure") - return - } - if strings.Contains(dcsEvent.Parameters, "RUN_OK") { - log.WithField("event", dcsEvent).Debug("DCS SOR success") - envId, ok := varStack["environment_id"] - if !ok { - break - } - p.pendingEORs[envId] = runNumber64 + + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { + log.WithField("event", dcsEvent). + WithField("detector", dcsEvent.GetDetector().String()). + Warn("DCS SOR failure") + return + } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField("event", dcsEvent). + Debug("DCS SOR success") + envId, ok := varStack["environment_id"] + if !ok { break } + p.pendingEORs[envId] = runNumber64 + break } log.WithField("event", dcsEvent).Debug("incoming DCS SOR event") } @@ -292,11 +326,42 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } + // Preparing the per-detector request payload in := dcspb.EorRequest{ - Detector: detectors, - RunNumber: int32(runNumber), - Parameters: argMap, + RunNumber: int32(runNumber), + Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), } + for i, det := range detectors { + perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_eor_parameters"] + if !ok { + log.Debug("empty DCS detectors list provided") + perDetectorParameters = "{}" + } + detectorArgMap := make(map[string]string) + bytes := []byte(perDetectorParameters) + err = json.Unmarshal(bytes, &detectorArgMap) + if err != nil { + log.WithError(err). + WithField("detector", det.String()). + Errorf("error processing DCS EOR parameters for detector %s", det.String()) + return + } + + // Per-detector parameters override any general dcs_sor_parameters + err = mergo.Merge(&detectorArgMap, argMap) + if err != nil { + log.WithError(err). + WithField("detector", det.String()). + Errorf("error building parameter map for detector %s", det.String()) + return + } + + in.Detectors[i] = &dcspb.DetectorOperationRequest{ + Detector: det, + ExtraParameters: detectorArgMap, + } + } + if p.dcsClient == nil { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). @@ -317,7 +382,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Error("failed to perform DCS EOR") } - var dcsEvent *dcspb.Event + var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() if err == io.EOF { @@ -332,21 +397,24 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Warn("bad DCS event received") break } - if dcsEvent.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { - if strings.Contains(dcsEvent.Parameters, "EOR_FAILURE") { - log.WithField("event", dcsEvent).Warn("DCS EOR failure") - return - } - if strings.Contains(dcsEvent.Parameters, "RUN_OK") { - log.WithField("event", dcsEvent).Debug("DCS EOR success") - envId, ok := varStack["environment_id"] - if !ok { - break - } - delete(p.pendingEORs, envId) + + if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { + log.WithField("event", dcsEvent). + WithField("detector", dcsEvent.GetDetector().String()). + Warn("DCS EOR failure") + return + } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField("event", dcsEvent). + Debug("DCS EOR success") + envId, ok := varStack["environment_id"] + if !ok { break } + delete(p.pendingEORs, envId) + break } + log.WithField("event", dcsEvent).Debug("incoming DCS EOR event") } return From 2b1319c016201d37a41889e65c46bae291bb3284 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 Aug 2021 16:47:47 +0200 Subject: [PATCH 0991/2352] [core] Expose GetDetectorsForHosts in workflow template system --- configuration/template/fields.go | 1 + configuration/template/stack.go | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 85ded66bf..0a05e83c6 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -52,6 +52,7 @@ type ConfigurationService interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) GetDetectorForHost(hostname string) (string, error) + GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) } diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 3199a9648..23d827ba1 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -93,6 +93,30 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } return payload }, + "DetectorsForHosts": func(hosts string) string { + defer utils.TimeTrack(time.Now(),"DetectorsForHosts", log.WithPrefix("template")) + hostsSlice := make([]string, 0) + // first we convert the incoming string treated as JSON list into a []string + bytes := []byte(hosts) + err := json.Unmarshal(bytes, &hostsSlice) + if err != nil { + return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) + } + + payload, err := confSvc.GetDetectorsForHosts(hostsSlice) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + // and back to JSON list for the active detectors slice + bytes, err = json.Marshal(payload) + if err != nil { + return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) + } + outString := string(bytes) + + return outString + }, "CRUCardsForHost": func(hostname string) string { defer utils.TimeTrack(time.Now(),"CRUCardsForHost", log.WithPrefix("template")) payload, err := confSvc.GetCRUCardsForHost(hostname) From c55b7660c92cdcf9ac04339106d4a26498227471 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 25 Aug 2021 12:40:44 +0200 Subject: [PATCH 0992/2352] [core] Bump to v0.26.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 240e52775..c3fef8164 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From 650fd27dab9908f910fce7a47ab9e94767b61931 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 15 Sep 2021 12:26:52 +0200 Subject: [PATCH 0993/2352] [core] Update DCS protos --- common/runtype/runtype.go | 7 ++ common/runtype/runtype_strings.go | 76 ++++++++++----- core/integration/dcs/protos/dcs.pb.go | 127 ++++++++++++++++---------- core/integration/dcs/protos/dcs.proto | 8 ++ 4 files changed, 147 insertions(+), 71 deletions(-) diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index a8d736548..592ebe181 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -35,6 +35,13 @@ const ( PEDESTAL PULSER LASER + CALIBRATION_ITHR_TUNING + CALIBRATION_VCASN_TUNING + CALIBRATION_THR_SCAN + CALIBRATION_DIGITAL_SCAN + CALIBRATION_ANALOG_SCAN + CALIBRATION_FHR + CALIBRATION_ALPIDE_SCAN // no correspondence with DCS: CALIBRATION diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index 34dc94dcd..099945716 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATIONCOSMIC" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMIC" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 50, 56} +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 208} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibrationcosmic" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmic" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -31,29 +31,50 @@ func _RunTypeNoOp() { _ = x[PEDESTAL-(3)] _ = x[PULSER-(4)] _ = x[LASER-(5)] - _ = x[CALIBRATION-(6)] - _ = x[COSMIC-(7)] + _ = x[CALIBRATION_ITHR_TUNING-(6)] + _ = x[CALIBRATION_VCASN_TUNING-(7)] + _ = x[CALIBRATION_THR_SCAN-(8)] + _ = x[CALIBRATION_DIGITAL_SCAN-(9)] + _ = x[CALIBRATION_ANALOG_SCAN-(10)] + _ = x[CALIBRATION_FHR-(11)] + _ = x[CALIBRATION_ALPIDE_SCAN-(12)] + _ = x[CALIBRATION-(13)] + _ = x[COSMIC-(14)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION, COSMIC} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMIC} var _RunTypeNameToValueMap = map[string]RunType{ - _RunTypeName[0:4]: NONE, - _RunTypeLowerName[0:4]: NONE, - _RunTypeName[4:11]: PHYSICS, - _RunTypeLowerName[4:11]: PHYSICS, - _RunTypeName[11:20]: TECHNICAL, - _RunTypeLowerName[11:20]: TECHNICAL, - _RunTypeName[20:28]: PEDESTAL, - _RunTypeLowerName[20:28]: PEDESTAL, - _RunTypeName[28:34]: PULSER, - _RunTypeLowerName[28:34]: PULSER, - _RunTypeName[34:39]: LASER, - _RunTypeLowerName[34:39]: LASER, - _RunTypeName[39:50]: CALIBRATION, - _RunTypeLowerName[39:50]: CALIBRATION, - _RunTypeName[50:56]: COSMIC, - _RunTypeLowerName[50:56]: COSMIC, + _RunTypeName[0:4]: NONE, + _RunTypeLowerName[0:4]: NONE, + _RunTypeName[4:11]: PHYSICS, + _RunTypeLowerName[4:11]: PHYSICS, + _RunTypeName[11:20]: TECHNICAL, + _RunTypeLowerName[11:20]: TECHNICAL, + _RunTypeName[20:28]: PEDESTAL, + _RunTypeLowerName[20:28]: PEDESTAL, + _RunTypeName[28:34]: PULSER, + _RunTypeLowerName[28:34]: PULSER, + _RunTypeName[34:39]: LASER, + _RunTypeLowerName[34:39]: LASER, + _RunTypeName[39:62]: CALIBRATION_ITHR_TUNING, + _RunTypeLowerName[39:62]: CALIBRATION_ITHR_TUNING, + _RunTypeName[62:86]: CALIBRATION_VCASN_TUNING, + _RunTypeLowerName[62:86]: CALIBRATION_VCASN_TUNING, + _RunTypeName[86:106]: CALIBRATION_THR_SCAN, + _RunTypeLowerName[86:106]: CALIBRATION_THR_SCAN, + _RunTypeName[106:130]: CALIBRATION_DIGITAL_SCAN, + _RunTypeLowerName[106:130]: CALIBRATION_DIGITAL_SCAN, + _RunTypeName[130:153]: CALIBRATION_ANALOG_SCAN, + _RunTypeLowerName[130:153]: CALIBRATION_ANALOG_SCAN, + _RunTypeName[153:168]: CALIBRATION_FHR, + _RunTypeLowerName[153:168]: CALIBRATION_FHR, + _RunTypeName[168:191]: CALIBRATION_ALPIDE_SCAN, + _RunTypeLowerName[168:191]: CALIBRATION_ALPIDE_SCAN, + _RunTypeName[191:202]: CALIBRATION, + _RunTypeLowerName[191:202]: CALIBRATION, + _RunTypeName[202:208]: COSMIC, + _RunTypeLowerName[202:208]: COSMIC, } var _RunTypeNames = []string{ @@ -63,8 +84,15 @@ var _RunTypeNames = []string{ _RunTypeName[20:28], _RunTypeName[28:34], _RunTypeName[34:39], - _RunTypeName[39:50], - _RunTypeName[50:56], + _RunTypeName[39:62], + _RunTypeName[62:86], + _RunTypeName[86:106], + _RunTypeName[106:130], + _RunTypeName[130:153], + _RunTypeName[153:168], + _RunTypeName[168:191], + _RunTypeName[191:202], + _RunTypeName[202:208], } // RunTypeString retrieves an enum value from the enum constants string name. diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 3acaeed11..b86b64302 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -283,31 +283,52 @@ func (DetectorState) EnumDescriptor() ([]byte, []int) { type RunType int32 const ( - RunType_NULL_RUNTYPE RunType = 0 - RunType_PHYSICS RunType = 1 - RunType_TECHNICAL RunType = 2 - RunType_PEDESTALS RunType = 3 - RunType_PULSER RunType = 4 - RunType_LASER RunType = 5 + RunType_NULL_RUNTYPE RunType = 0 + RunType_PHYSICS RunType = 1 + RunType_TECHNICAL RunType = 2 + RunType_PEDESTALS RunType = 3 + RunType_PULSER RunType = 4 + RunType_LASER RunType = 5 + RunType_CALIBRATION_ITHR_TUNING RunType = 6 + RunType_CALIBRATION_VCASN_TUNING RunType = 7 + RunType_CALIBRATION_THR_SCAN RunType = 8 + RunType_CALIBRATION_DIGITAL_SCAN RunType = 9 + RunType_CALIBRATION_ANALOG_SCAN RunType = 10 + RunType_CALIBRATION_FHR RunType = 11 + RunType_CALIBRATION_ALPIDE_SCAN RunType = 12 ) // Enum value maps for RunType. var ( RunType_name = map[int32]string{ - 0: "NULL_RUNTYPE", - 1: "PHYSICS", - 2: "TECHNICAL", - 3: "PEDESTALS", - 4: "PULSER", - 5: "LASER", + 0: "NULL_RUNTYPE", + 1: "PHYSICS", + 2: "TECHNICAL", + 3: "PEDESTALS", + 4: "PULSER", + 5: "LASER", + 6: "CALIBRATION_ITHR_TUNING", + 7: "CALIBRATION_VCASN_TUNING", + 8: "CALIBRATION_THR_SCAN", + 9: "CALIBRATION_DIGITAL_SCAN", + 10: "CALIBRATION_ANALOG_SCAN", + 11: "CALIBRATION_FHR", + 12: "CALIBRATION_ALPIDE_SCAN", } RunType_value = map[string]int32{ - "NULL_RUNTYPE": 0, - "PHYSICS": 1, - "TECHNICAL": 2, - "PEDESTALS": 3, - "PULSER": 4, - "LASER": 5, + "NULL_RUNTYPE": 0, + "PHYSICS": 1, + "TECHNICAL": 2, + "PEDESTALS": 3, + "PULSER": 4, + "LASER": 5, + "CALIBRATION_ITHR_TUNING": 6, + "CALIBRATION_VCASN_TUNING": 7, + "CALIBRATION_THR_SCAN": 8, + "CALIBRATION_DIGITAL_SCAN": 9, + "CALIBRATION_ANALOG_SCAN": 10, + "CALIBRATION_FHR": 11, + "CALIBRATION_ALPIDE_SCAN": 12, } ) @@ -1140,35 +1161,47 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, 0x5d, - 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, - 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, - 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, - 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, - 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x2a, 0x2c, 0x0a, - 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, - 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, - 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, - 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, - 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, 0x11, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x0c, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, 0x9f, + 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, + 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, + 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, + 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, + 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, + 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, + 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, + 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, + 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, + 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, + 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, + 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, + 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, + 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, + 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, 0x11, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, + 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 8b657ef46..5d7d1d9df 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -227,6 +227,14 @@ enum RunType { PEDESTALS = 3; PULSER = 4; LASER = 5; + CALIBRATION_ITHR_TUNING = 6; + CALIBRATION_VCASN_TUNING = 7; + CALIBRATION_THR_SCAN = 8; + CALIBRATION_DIGITAL_SCAN = 9; + CALIBRATION_ANALOG_SCAN = 10; + CALIBRATION_FHR = 11; + CALIBRATION_ALPIDE_SCAN = 12; + } enum TriggerMode { // FIXME: unused From 430f2a27c1bb4acbc4ee9aaed4f81f081186f959 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 15 Sep 2021 14:17:43 +0200 Subject: [PATCH 0994/2352] [core] Bump to v0.26.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c3fef8164..26decf823 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 3 +VERSION_PATCH := 4 From 3c3ff6951019614525bf1e09c65369f26dd4602d Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 17 Sep 2021 16:20:07 +0200 Subject: [PATCH 0995/2352] [core] Update Bookkeeping API --- core/bookkeeping/api.go | 8 ++++---- core/environment/transition_startactivity.go | 5 ++++- go.mod | 6 +++--- go.sum | 4 ++++ 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 4157389c7..69b5083e0 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time) { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool) { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,7 +80,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart) + clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn) } func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { @@ -108,8 +108,8 @@ func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber clientAPI.CreateFlp(name, hostName, runNumber) } -func (bk *BookkeepingWrapper) UpdateFlp(flpId int32, name string, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { - clientAPI.UpdateFlp(flpId, name, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) +func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { + clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) } func (bk *BookkeepingWrapper) GetLogs() { diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 3ca98f86c..fa37acc4c 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -65,7 +65,10 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } flps := env.GetFLPs() - the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now()) + dd_enabled, _ := strconv.ParseBool(env.GetKV("","dd_enabled")) + dcs_enabled, _ := strconv.ParseBool(env.GetKV("","dcs_enabled")) + epn_enabled, _ := strconv.ParseBool(env.GetKV("","epn_enabled")) + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled ) for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) } diff --git a/go.mod b/go.mod index cf03617ac..aa49614a6 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.16.9 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e + github.com/AliceO2Group/Bookkeeping v0.17.6 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -55,7 +55,7 @@ require ( github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.4.3 - github.com/google/uuid v1.2.0 // indirect + github.com/google/uuid v1.2.0 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/mux v1.7.3 github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect diff --git a/go.sum b/go.sum index cab06f786..b56ff554c 100644 --- a/go.sum +++ b/go.sum @@ -85,12 +85,16 @@ github.com/AliceO2Group/Bookkeeping v0.16.8 h1:xNiRFMaCNLGZaDwTJz0i5l2wrkxbGfcb2 github.com/AliceO2Group/Bookkeeping v0.16.8/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.16.9 h1:yqMR7e4FDjAeNbSJ08WJJN1ug0k/VyFiEwx6Aiw4Ju0= github.com/AliceO2Group/Bookkeeping v0.16.9/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.6 h1:O6D3wr5+twn0JQHiSz5+4TWdhNmWFYqxxdtPXUxlAjI= +github.com/AliceO2Group/Bookkeeping v0.17.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e h1:9rLFEKaGcH6nmz2JcM4zcfKuGJq+/nPVr30o33s7/eM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89 h1:Wfo58o2d/ILS7Kz+tmVEBb/Gg9Dd2bOr17gH+Na3lKU= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From cd4763845d3607f0f8ec94dbe6426813ce7cc376 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 17 Sep 2021 16:31:58 +0200 Subject: [PATCH 0996/2352] [build] Bump to v0.26.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 26decf823..1054a08ec 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 4 +VERSION_PATCH := 5 From 18ba49828250f1fc47b176a0e571f32f37f4aa76 Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 24 Sep 2021 13:47:19 +0200 Subject: [PATCH 0997/2352] [core] Add epn_topology for Bookkeeping --- core/bookkeeping/api.go | 4 ++-- core/environment/transition_startactivity.go | 3 ++- go.mod | 4 ++-- go.sum | 4 ++++ 4 files changed, 10 insertions(+), 5 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 69b5083e0..2bc170a60 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool) { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string) { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,7 +80,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn) + clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology) } func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index fa37acc4c..394cbe9c4 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -68,7 +68,8 @@ func (t StartActivityTransition) do(env *Environment) (err error) { dd_enabled, _ := strconv.ParseBool(env.GetKV("","dd_enabled")) dcs_enabled, _ := strconv.ParseBool(env.GetKV("","dcs_enabled")) epn_enabled, _ := strconv.ParseBool(env.GetKV("","epn_enabled")) - the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled ) + odc_topology := env.GetKV("","odc_topology") + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology) for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) } diff --git a/go.mod b/go.mod index aa49614a6..57ba69cf9 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.6 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89 + github.com/AliceO2Group/Bookkeeping v0.17.7 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect diff --git a/go.sum b/go.sum index b56ff554c..b67003f6c 100644 --- a/go.sum +++ b/go.sum @@ -87,6 +87,8 @@ github.com/AliceO2Group/Bookkeeping v0.16.9 h1:yqMR7e4FDjAeNbSJ08WJJN1ug0k/VyFiE github.com/AliceO2Group/Bookkeeping v0.16.9/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.6 h1:O6D3wr5+twn0JQHiSz5+4TWdhNmWFYqxxdtPXUxlAjI= github.com/AliceO2Group/Bookkeeping v0.17.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.7 h1:22Mb6Hdp9tZ3z8QeAjm81S4HiLaNLBVZ5Mn3TWRSQqI= +github.com/AliceO2Group/Bookkeeping v0.17.7/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= @@ -95,6 +97,8 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89 h1:Wfo58o2d/ILS7Kz+tmVEBb/Gg9Dd2bOr17gH+Na3lKU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82 h1:2qYbJeWSSpG5cr7usLewzNaC3f7czW1of4uoHLoeXyY= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From f977631fcd679f59a9f23858f3f65260f2d0bfce Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 24 Sep 2021 13:53:05 +0200 Subject: [PATCH 0998/2352] [core] Bump to v0.26.6 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1054a08ec..29d74b8e5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 5 +VERSION_PATCH := 6 From 87bb90c79b2e1c9454e1222ce1804ca13323b974 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Fri, 3 Sep 2021 16:37:21 +0200 Subject: [PATCH 0999/2352] [apricot] The documentaton to explain how to use the TCE is created. --- apricot/doc/apricot.md | 20 ++++++++++++++++++++ apricot/doc/apricot_http_service.md | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 apricot/doc/apricot.md create mode 100644 apricot/doc/apricot_http_service.md diff --git a/apricot/doc/apricot.md b/apricot/doc/apricot.md new file mode 100644 index 000000000..e0448f6d8 --- /dev/null +++ b/apricot/doc/apricot.md @@ -0,0 +1,20 @@ +## apricot + +**A** **p**rocessor and **r**epos**i**tory for **co**nfiguration **t**emplates + +### Synopsis + +The `o2-apricot` binary implements a centralized configuration (micro)service for ALICE O². + +### Usage and options + +``` +Usage of bin/o2-apricot: + --backendUri string URI of the Consul server or YAML configuration file (default "consul://127.0.0.1:8500") + --listenPort int Port of apricot server (default 32101) + --verbose Verbose logging +``` + +### SEE ALSO + +* [apricot HTTP service](apricot_http_service.md) - make essential cluster information available via a web server diff --git a/apricot/doc/apricot_http_service.md b/apricot/doc/apricot_http_service.md new file mode 100644 index 000000000..56938e47e --- /dev/null +++ b/apricot/doc/apricot_http_service.md @@ -0,0 +1,23 @@ +## apricot HTTP service + +Web server component that implements the Trivial Configuration Endpoint (Apricot TCE). + +It serves JSON and/or plain text structures in order to make essential cluster information available to scripts and other consumers for which the gRPC interface is impractical. + +It is strictly **read-only** and only ever responds to `GET`. + +### Configuration + +To use this feature, the `o2-apricot` running machine has to communicate with Consul via the `--backendUri` option (see [here](apricot.md)). + +### Usage and options + +To retrieve the information needed regarding FLPs, use the following urls in a web browser. + +To retrieve as plain text: +* `your_machine/inventory/flps` or `your_machine/inventory/flps/text` +* `/inventory/detectors/your_detector/flps` or `/inventory/detectors/your_detector/flps/text` + +To retrieve as JSON: +* `your_machine/inventory/flps/json` +* `/inventory/detectors/your_detector/flps/json` From e3b5440e7b3991bb2ed559c4ddb87cece3d19e72 Mon Sep 17 00:00:00 2001 From: Claire Guyot Date: Wed, 22 Sep 2021 15:11:56 +0200 Subject: [PATCH 1000/2352] [apricot] The documentation for the apricot TCE has concrete examples. --- apricot/doc/apricot_http_service.md | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/apricot/doc/apricot_http_service.md b/apricot/doc/apricot_http_service.md index 56938e47e..a649de72e 100644 --- a/apricot/doc/apricot_http_service.md +++ b/apricot/doc/apricot_http_service.md @@ -12,12 +12,17 @@ To use this feature, the `o2-apricot` running machine has to communicate with Co ### Usage and options -To retrieve the information needed regarding FLPs, use the following urls in a web browser. +To retrieve the information needed regarding FLPs, use the following urls in a web browser or with `curl` or `wget`. To retrieve as plain text: -* `your_machine/inventory/flps` or `your_machine/inventory/flps/text` -* `/inventory/detectors/your_detector/flps` or `/inventory/detectors/your_detector/flps/text` +* `http:///inventory/flps` or `http:///inventory/flps/text` +* `http:///inventory/detectors//flps` or `http:///inventory/detectors//flps/text` To retrieve as JSON: -* `your_machine/inventory/flps/json` -* `/inventory/detectors/your_detector/flps/json` +* `http:///inventory/flps/json` +* `http:///inventory/detectors//flps/json` + +### Examples + +* With `curl`: `curl http://localhost:32188/inventory/flps` +* With `wget`: `wget http://localhost:32188/inventory/detectors/TST/flps/json -O ~/downloads/test` \ No newline at end of file From 10d95a19ad5ba863c346d0e7cacf0f68cd612a7d Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 27 Sep 2021 11:05:58 +0200 Subject: [PATCH 1001/2352] [repo] Disable strict host checking for ssh auth --- core/config.go | 2 +- core/repos/repomanager.go | 7 +++++- core/repos/sshrepo.go | 48 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index cac396986..5997db0af 100644 --- a/core/config.go +++ b/core/config.go @@ -90,7 +90,7 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) - viper.SetDefault("reposSshKey", filepath.Join("/etc/o2/aliecs/.ssh/controlworkflows-mirror-key")) + viper.SetDefault("reposSshKey", filepath.Join("/etc/o2.d/aliecs/.ssh/controlworkflows-mirror-key")) viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 30785c8df..e8f651d34 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -36,6 +36,7 @@ import ( "github.com/gobwas/glob" "github.com/sirupsen/logrus" "github.com/spf13/viper" + ssh2 "golang.org/x/crypto/ssh" "os" "path/filepath" "sort" @@ -259,10 +260,14 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st // prepare clone options for ssh authorization if repo.GetProtocol() == "ssh" { - co.Auth, err = ssh.NewPublicKeysFromFile("git", viper.GetString("reposSshKey"), "") + auth, err := ssh.NewPublicKeysFromFile("git", viper.GetString("reposSshKey"), "") if err != nil { return "", false, err } + + // Disable strict host checking which may block the clone op without manual intervention + auth.HostKeyCallback = ssh2.InsecureIgnoreHostKey() + co.Auth = auth } co.URL = repo.getUri() diff --git a/core/repos/sshrepo.go b/core/repos/sshrepo.go index c6b434ddb..1d7b2f7c7 100644 --- a/core/repos/sshrepo.go +++ b/core/repos/sshrepo.go @@ -25,6 +25,11 @@ package repos import ( + "errors" + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing/transport/ssh" + "github.com/spf13/viper" + ssh2 "golang.org/x/crypto/ssh" "net/url" "path" ) @@ -49,3 +54,46 @@ func (r *sshRepo) getUri() string { func(r *sshRepo) GetProtocol() string { return "ssh" } + +func (r *sshRepo) refresh() error { + ref, err := git.PlainOpen(r.GetCloneDir()) + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + auth, err := ssh.NewPublicKeysFromFile("git", viper.GetString("reposSshKey"), "") + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + // Disable strict host checking without which may block the fetch op without manual intervention + auth.HostKeyCallback = ssh2.InsecureIgnoreHostKey() + + err = ref.Fetch(&git.FetchOptions{ + RemoteName: "origin", + Force: true, + Auth: auth, + }) + + if err != nil && err != git.NoErrAlreadyUpToDate { + return errors.New(err.Error() + ": " + r.GetIdentifier() + " | revision: " + r.Revision) + } + + // gather revisions on update or if empty + if err != git.NoErrAlreadyUpToDate || r.Revisions == nil { + err = r.gatherRevisions(ref) + if err != nil { + return err + } + } + + // populate workflows on update or if empty + if err != git.NoErrAlreadyUpToDate || len(templatesCache) == 0 { + err = r.populateWorkflows(r.GetDefaultRevision(), true) + if err != nil { + return err + } + } + + return nil +} From 64cf24a90a3511ed963d87d5a71e507273fe0a64 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Sep 2021 13:26:02 +0200 Subject: [PATCH 1002/2352] [misc] Update documentation URLs --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7a976da98..93facb2bf 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ What is your use case? * I want to **run AliECS** and other O²/FLP software - :arrow_right: [O²/FLP Suite deployment instructions](https://alice-flp-suite.docs.cern.ch/installation/) + :arrow_right: [O²/FLP Suite deployment instructions](https://alice-flp.docs.cern.ch/system-configuration/utils/o2-flp-setup/) These instructions apply to both single-node and multi-node deployments. @@ -32,9 +32,9 @@ What is your use case? * I want to build and run AliECS for **development** purposes - :hammer_and_wrench: [Building instructions](https://alice-flp-suite.docs.cern.ch/aliecs/building/) + :hammer_and_wrench: [Building instructions](https://alice-flp.docs.cern.ch/aliecs/building/) - :arrow_right: [Running instructions](https://alice-flp-suite.docs.cern.ch/aliecs/running/) + :arrow_right: [Running instructions](https://alice-flp.docs.cern.ch/aliecs/running/) ## Using AliECS @@ -46,6 +46,6 @@ There are two ways of interacting with AliECS: * `coconut` - the command-line control and configuration utility, included with AliECS core - :arrow_right: [Using `coconut`](https://alice-flp-suite.docs.cern.ch/aliecs/coconut/) + :arrow_right: [Using `coconut`](https://alice-flp.docs.cern.ch/aliecs/coconut/) - :arrow_right: [`coconut` command reference](https://alice-flp-suite.docs.cern.ch/aliecs/coconut/doc/coconut/) + :arrow_right: [`coconut` command reference](https://alice-flp.docs.cern.ch/aliecs/coconut/doc/coconut/) From f4fe78c0a0f46e943394cfdc7ee1d60d3f7759af Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 29 Sep 2021 13:34:22 +0200 Subject: [PATCH 1003/2352] [core] Bookkeeping CreateLog with config as text --- core/environment/environment.go | 19 +++++++++++++++++++ core/environment/transition_startactivity.go | 4 +++- core/environment/utils.go | 10 ++++++++++ 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index ede33698d..9b93cbe51 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -689,3 +689,22 @@ func (env *Environment) GetRunType() runtype.RunType { } return rt } + +func (env *Environment) GetVarsAsString() string { + if env == nil { + return "" + } + path := env.workflow.GetName() + rolesForPath := env.QueryRoles(path) + if len(rolesForPath) == 0 { + return "" + } + env.Mu.RLock() + defer env.Mu.RUnlock() + role := rolesForPath[0] + varStack, err := role.ConsolidatedVarStack() + if err != nil { + return "" + } + return mapToString(varStack) +} diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 394cbe9c4..38328aeb3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "fmt" "strconv" "time" @@ -78,8 +79,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { // a text Log entry that is written by the shifter // TODO (malexis): we need to implement a way to // get the text from the shifter - // runNumberStr := strconv.FormatUint(uint64(runNumber), 10 ) + // parentlogId = -1 to create a new log on each run // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) + the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s",args["runNumber"],env.Id().String()), args["runNumber"], -1) taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), diff --git a/core/environment/utils.go b/core/environment/utils.go index 7661af74b..3c9356b92 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -25,7 +25,9 @@ package environment import ( + "bytes" "encoding/json" + "fmt" "io/ioutil" "github.com/AliceO2Group/Control/core/the" @@ -67,4 +69,12 @@ func SliceToJSONSlice(slice []string) (payload string, err error) { payloadStr, err = json.Marshal(slice) payload = string(payloadStr) return +} + +func mapToString(m map[string]string) string { + b := new(bytes.Buffer) + for key, value := range m { + fmt.Fprintf(b, "%s=\"%s\"\n", key, value) + } + return b.String() } \ No newline at end of file From 94e78e260d2569a0cb4ddfba8f3bb79187bf48ab Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 29 Sep 2021 13:34:55 +0200 Subject: [PATCH 1004/2352] [core] Set EPN Topology to NULL if epn disabled --- core/bookkeeping/api.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 2bc170a60..6c2a17896 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -29,7 +29,6 @@ import ( "path" "sync" "time" - clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" @@ -80,6 +79,10 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } + if !epn { + epnTopology = "NULL" + } + clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology) } From 41e009cff7e2d603a7d79ead3528994c618a2df8 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 29 Sep 2021 14:04:31 +0200 Subject: [PATCH 1005/2352] [core] Bookkeeping use empty string instead of NULL --- core/bookkeeping/api.go | 4 ---- 1 file changed, 4 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 6c2a17896..013d22076 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -79,10 +79,6 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - if !epn { - epnTopology = "NULL" - } - clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology) } From a56e3fc2b69dbb0315cf471a537216c360eb72b9 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 29 Sep 2021 15:18:06 +0200 Subject: [PATCH 1006/2352] [core] Sort config vars for Bookkeeping --- core/environment/environment.go | 2 +- core/environment/utils.go | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 9b93cbe51..ad7bf3bfc 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -706,5 +706,5 @@ func (env *Environment) GetVarsAsString() string { if err != nil { return "" } - return mapToString(varStack) + return sortMapToString(varStack) } diff --git a/core/environment/utils.go b/core/environment/utils.go index 3c9356b92..2972bfef6 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -29,6 +29,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "sort" "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" @@ -71,10 +72,16 @@ func SliceToJSONSlice(slice []string) (payload string, err error) { return } -func mapToString(m map[string]string) string { +func sortMapToString(m map[string]string) string { + keys := make([]string, 0, len(m)) + for k := range m { + keys = append(keys, k) + } + sort.Strings(keys) b := new(bytes.Buffer) - for key, value := range m { - fmt.Fprintf(b, "%s=\"%s\"\n", key, value) + + for _, k := range keys { + fmt.Fprintf(b, "%s=\"%s\"\n", k, m[k]) } return b.String() } \ No newline at end of file From e636b118eb0e022c100e8ba20393bbf30e793b0c Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 29 Sep 2021 16:11:32 +0200 Subject: [PATCH 1007/2352] [build] Bump to v0.26.7 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 29d74b8e5..7d28921b7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 6 +VERSION_PATCH := 7 From 46b39114065b1e920cad559da8337185f0523e18 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Tue, 5 Oct 2021 20:37:37 +0200 Subject: [PATCH 1008/2352] [core] Bookkeeping get JWT from consul --- core/bookkeeping/api.go | 6 +++--- core/config.go | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 013d22076..3114c8e11 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -40,7 +40,7 @@ import ( var log = logger.New(logrus.StandardLogger(), "Bookkeeping") // [O2-2512]: Until JWT becomes optional or provided by BK -const jwtToken = "token" +// const jwtToken = "token" type BookkeepingWrapper struct{} @@ -55,11 +55,11 @@ func Instance() *BookkeepingWrapper { apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) if err == nil { apiUrl.Path = path.Join( apiUrl.Path + "api") - clientAPI.InitializeApi(apiUrl.String(), jwtToken) + clientAPI.InitializeApi(apiUrl.String(), viper.GetString("bookkeepingToken")) } else { log.WithField("error", err.Error()). Error("unable to parse the Bookkeeping base URL") - clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), jwtToken) + clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) } }) return instance diff --git a/core/config.go b/core/config.go index 5997db0af..6558288bb 100644 --- a/core/config.go +++ b/core/config.go @@ -107,6 +107,7 @@ func setDefaults() error { viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") + viper.SetDefault("bookkeepingToken","token") return nil } From 0a2ab7ba47dd127117161dca90dec967bafbe649 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Sep 2021 13:54:01 +0200 Subject: [PATCH 1009/2352] [core] Improve error response consolidation and mutex granularity --- core/controlcommands/commandqueue.go | 27 ++++++++++---- core/controlcommands/mesoscommandresponse.go | 39 +++++++++++++++++--- core/controlcommands/mesoscommandservent.go | 33 +++++++++++++---- core/controlcommands/multiresponse.go | 37 +++++++++++++++++-- core/task/manager.go | 33 ++++++++++++++--- 5 files changed, 140 insertions(+), 29 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 1a52d1b10..afca44702 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -25,12 +25,15 @@ package controlcommands import ( - "sync" - "github.com/AliceO2Group/Control/common/logger" - "github.com/sirupsen/logrus" "errors" "fmt" "strings" + "sync" + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils" + "github.com/sirupsen/logrus" ) const QUEUE_SIZE = 1024 @@ -111,6 +114,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon if m == nil { return nil, errors.New("command queue is nil") } + defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), log.WithPrefix("cmdq")) type responseSemaphore struct{ receiver MesosCommandTarget @@ -151,11 +155,18 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon return } - log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - "error": res.Err().Error(), - }). - Debug("received MesosCommandResponse") + if res.Err() != nil { + log.WithFields(logrus.Fields{ + "commandName": res.GetCommandName(), + "error": res.Err().Error(), + }). + Trace("received MesosCommandResponse") + } else { + log.WithFields(logrus.Fields{ + "commandName": res.GetCommandName(), + }). + Trace("received MesosCommandResponse") + } semaphore <- responseSemaphore{ receiver: receiver, diff --git a/core/controlcommands/mesoscommandresponse.go b/core/controlcommands/mesoscommandresponse.go index 776d0da16..e21d2fe9a 100644 --- a/core/controlcommands/mesoscommandresponse.go +++ b/core/controlcommands/mesoscommandresponse.go @@ -33,15 +33,18 @@ import ( type MesosCommandResponse interface { GetCommandName() string GetCommandId() xid.ID + GetResponseSenders() []MesosCommandTarget IsMultiResponse() bool Err() error + Errors() map[MesosCommandTarget]error } type MesosCommandResponseBase struct { - CommandName string `json:"name"` - CommandId xid.ID `json:"id"` - ErrorString string `json:"error"` - MessageType string `json:"_messageType"` + CommandName string `json:"name"` + CommandId xid.ID `json:"id"` + ErrorString string `json:"error"` + MessageType string `json:"_messageType"` + ResponseSenders []MesosCommandTarget `json:"-"` } func NewMesosCommandResponse(mesosCommand MesosCommand, err error) (*MesosCommandResponseBase) { @@ -83,9 +86,35 @@ func (m *MesosCommandResponseBase) IsMultiResponse() bool { return false } +func (m *MesosCommandResponseBase) GetResponseSenders() []MesosCommandTarget { + if m != nil { + return m.ResponseSenders + } + return nil +} + func (m *MesosCommandResponseBase) Err() error { if m != nil { - return errors.New(m.ErrorString) + if len(m.ErrorString) > 0 { + return errors.New(m.ErrorString) + } + return nil } return errors.New("nil response") } + +// dummy implementation for single-origin responses which defaults to Err() +func (m *MesosCommandResponseBase) Errors() map[MesosCommandTarget]error { + errMap := make(map[MesosCommandTarget]error) + mct := MesosCommandTarget{} + if len(m.ResponseSenders) > 0 { + mct = m.ResponseSenders[0] + } + + if m != nil { + errMap[mct] = errors.New(m.ErrorString) + return errMap + } + errMap[mct] = errors.New("nil response") + return errMap +} diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index b56aae668..1eeff6c87 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -29,6 +29,7 @@ import ( "sync" "time" + "github.com/AliceO2Group/Control/common/utils" "github.com/rs/xid" "github.com/sirupsen/logrus" ) @@ -74,9 +75,9 @@ func NewServent(commandFunc SendCommandFunc) *Servent { func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (MesosCommandResponse, error) { log.Debug("Servent.RunCommand BEGIN") defer log.Debug("Servent.RunCommand END") - log.Debug("servent mutex locking") - s.mu.Lock() - log.Debug("servent mutex locked") + + defer utils.TimeTrack(time.Now(), fmt.Sprintf("servent.RunCommand %s to target %s", cmd.GetName(), receiver.TaskId.Value), log.WithPrefix("servent")) + cmdId := cmd.GetId() call := NewCall(cmd) @@ -85,8 +86,16 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes Target: receiver, } + log.Debug("servent mutex locking") + s.mu.Lock() + log.Debug("servent mutex locked") + // We append the new call to the pending map, and send the request s.pending[callId] = call + + s.mu.Unlock() + log.Debug("servent mutex unlocked") + log.WithFields(logrus.Fields{ "name": cmd.GetName(), "id": cmd.GetId(), @@ -94,15 +103,20 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes "executorId": receiver.ExecutorId, }). Debug("calling scheduler SendFunc") + err := s.SendFunc(cmd, receiver) if err != nil { + log.Debug("servent mutex locking") + s.mu.Lock() + log.Debug("servent mutex locked") + delete(s.pending, callId) + s.mu.Unlock() log.WithError(err).Debug("servent mutex unlocked") + return nil, err } - s.mu.Unlock() - log.Debug("servent mutex unlocked") log.WithField("timeout", cmd.GetResponseTimeout()).Debug("blocking until response or timeout") // Neat, now we block until done||timeout @@ -111,14 +125,18 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes // By the time we get here, ProcessResponse should have already added a Response to the // pending call, and removed it from servent.pending. case <-time.After(cmd.GetResponseTimeout()): + call.Error = fmt.Errorf("MesosCommand %s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) + log.Debug("servent mutex locking") s.mu.Lock() log.Debug("servent mutex locked") - call.Error = fmt.Errorf("MesosCommand timed out %s", cmd.GetName()) + delete(s.pending, callId) + s.mu.Unlock() log.Debug("servent mutex unlocked") } + if call.Error != nil { return nil, call.Error } @@ -126,11 +144,12 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes } func (s *Servent) ProcessResponse(res MesosCommandResponse, sender MesosCommandTarget) { - s.mu.Lock() callId := CallId{ Id: res.GetCommandId(), Target: sender, } + + s.mu.Lock() call := s.pending[callId] delete(s.pending, callId) s.mu.Unlock() diff --git a/core/controlcommands/multiresponse.go b/core/controlcommands/multiresponse.go index c7bc5a835..c4db76ba3 100644 --- a/core/controlcommands/multiresponse.go +++ b/core/controlcommands/multiresponse.go @@ -25,9 +25,9 @@ package controlcommands import ( - "strings" - "fmt" "errors" + "fmt" + "strings" ) type MesosCommandMultiResponse struct { @@ -47,10 +47,24 @@ func (m *MesosCommandMultiResponse) IsMultiResponse() bool { return true } +func (m *MesosCommandMultiResponse) GetResponseSenders() []MesosCommandTarget { + if m != nil { + senders := make([]MesosCommandTarget, len(m.responses)) + i := 0 + for k, _ := range m.responses { + senders[i] = k + i++ + } + return senders + } + return nil +} + func (m *MesosCommandMultiResponse) Err() error { if m == nil { - return nil + return errors.New("nil response") } + errs := make(map[MesosCommandTarget]error, 0) for k, v := range m.responses { if v.Err() != nil { @@ -61,13 +75,28 @@ func (m *MesosCommandMultiResponse) Err() error { return errors.New(strings.Join(func() (out []string) { for k, v := range errs { if v != nil && len(strings.TrimSpace(v.Error())) != 0 { - out = append(out, fmt.Sprintf("[%s/%s] %s", k.AgentId, k.ExecutorId, v.Error())) + out = append(out, fmt.Sprintf("[task %s] %s", k.TaskId.Value, v.Error())) } } return }(), "\n")) } +func (m *MesosCommandMultiResponse) Errors() map[MesosCommandTarget]error { + errMap := make(map[MesosCommandTarget]error) + + if m != nil { + for k, v := range m.responses { + if v.Err() != nil { + errMap[k] = v.Err() + } + } + return errMap + } + + return nil +} + func consolidateResponses(command MesosCommand, responses map[MesosCommandTarget]MesosCommandResponse) MesosCommandResponse { if len(responses) == 0 { return nil diff --git a/core/task/manager.go b/core/task/manager.go index 0a245d23a..f66d9190d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -498,7 +498,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) - m.cq.Enqueue(cmd, notify) + _ = m.cq.Enqueue(cmd, notify) response := <- notify close(notify) @@ -507,11 +507,34 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { return errors.New("nil response") } - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) + if response.IsMultiResponse() { + taskErrors := make([]string, len(response.Errors())) + i := 0 + for k, v := range response.Errors() { + task := m.GetTask(k.TaskId.Value) + var taskDescription string + if task != nil { + tci := task.GetTaskCommandInfo() + tciValue := "unknown command" + if tci.Value != nil { + tciValue = *tci.Value + } + + taskDescription = fmt.Sprintf("task '%s' on %s (id %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), v.Error()) + } else { + taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) + } + taskErrors[i] = taskDescription + i++ + } + return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskErrors, "; ")) + } else { + errText := response.Err().Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + // FIXME: improve error handling ↑ } - // FIXME: improve error handling ↑ return nil } From f0f0f3eff07368a7fa8f8631aed83c3cb30b15a1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Sep 2021 13:55:01 +0200 Subject: [PATCH 1010/2352] [core] Improve mutex granularity in environment manager --- core/environment/manager.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index f46ca7c3a..da461bacd 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -210,9 +210,11 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] nil, //roles, nil), ) - err = env.TryTransition(NewConfigureTransition( - envs.taskman), - ) + if err == nil { + err = env.TryTransition(NewConfigureTransition( + envs.taskman), + ) + } envs.mu.Unlock() if err == nil { @@ -260,10 +262,10 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error "partition": environmentId.String(), }).Info("tearing down environment") - envs.mu.Lock() - defer envs.mu.Unlock() - + envs.mu.RLock() env, err := envs.environment(environmentId) + envs.mu.RUnlock() + if err != nil { return err } @@ -289,6 +291,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } } + envs.mu.Lock() // we kill all tasks that aren't cleanup hooks taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, tasksToRelease, nil) // close state channel @@ -296,6 +299,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error close(envs.pendingStateChangeCh[environmentId]) } delete(envs.pendingStateChangeCh, environmentId) + envs.mu.Unlock() @@ -314,13 +318,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } pendingCh := make(chan *event.TasksReleasedEvent) + envs.mu.Lock() envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage incomingEv := <- pendingCh - envs.mu.Lock() // If some tasks failed to release if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { @@ -336,7 +340,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } - envs.mu.Unlock() // we trigger all cleanup hooks destroyHooks.FilterCalls().CallAll() cleanupTaskHooks := destroyHooks.FilterTasks() @@ -345,21 +348,19 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error log.WithError(err).Warn("environment post-destroy hooks failed") } - envs.mu.Lock() - // and then we kill them too taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupTaskHooks, nil) // we remake the pending teardown channel too, because each completed TasksReleasedEvent // automatically closes it pendingCh = make(chan *event.TasksReleasedEvent) + envs.mu.Lock() envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage incomingEv = <- pendingCh - envs.mu.Lock() // If some cleanup hooks failed to release if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { @@ -376,8 +377,10 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) + envs.mu.Lock() delete(envs.m, environmentId) env.unsubscribeFromWfState() + envs.mu.Unlock() return err } From 2287b52dce1ef680712f9a796ade5198605830a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Sep 2021 13:55:38 +0200 Subject: [PATCH 1011/2352] [core] Declare offending roles in failed DEPLOY transition --- core/environment/transition_deploy.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 3be94802c..6efccc54d 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -27,6 +27,7 @@ package environment import ( "errors" "fmt" + "strings" "time" "github.com/AliceO2Group/Control/common/event" @@ -192,17 +193,19 @@ func (t DeployTransition) do(env *Environment) (err error) { // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. case wfState := <-notifyState: if wfState == task.ERROR { + failedRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { if st := role.GetState(); st == task.ERROR { log.WithField("state", st). WithField("role", role.GetPath()). WithField("environment", role.GetEnvironmentId().String()). Error("environment reached invalid state") + failedRoles = append(failedRoles, role.GetPath()) } }) log.WithField("state", wfState.String()). Debug("workflow state change") - err = errors.New("workflow deployment failed, aborting and cleaning up") + err = fmt.Errorf("workflow deployment failed, aborting and cleaning up [offending roles: %s]", strings.Join(failedRoles, ", ")) break WORKFLOW_ACTIVE_LOOP } } From fdc5d40e3a99ae35785e3c272e1c4b406af7fb96 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Sep 2021 13:56:08 +0200 Subject: [PATCH 1012/2352] [build] Minor go.mod adjustment --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 57ba69cf9..e64d78564 100644 --- a/go.mod +++ b/go.mod @@ -127,7 +127,7 @@ require ( go.etcd.io/bbolt v1.3.4 // indirect go.opencensus.io v0.22.6 // indirect go.uber.org/zap v1.14.1 // indirect - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad // indirect + golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect From 6ab5fe8882e6a5d3bd304327041336abe59fa0b6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Oct 2021 10:15:00 +0200 Subject: [PATCH 1013/2352] [core] Correctly report nil error if no tasks failed to CONFIGURE --- core/task/manager.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index f66d9190d..5d04ef651 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -527,7 +527,11 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { taskErrors[i] = taskDescription i++ } - return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskErrors, "; ")) + + if len(taskErrors) > 0 { + return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskErrors, "; ")) + } + return nil } else { errText := response.Err().Error() if len(strings.TrimSpace(errText)) != 0 { From 2209f26f6e3d93c81c64669b7b28df36726c7bff Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Oct 2021 10:16:02 +0200 Subject: [PATCH 1014/2352] [executor] Remove excessive debug output --- executor/executorcmd/client.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index c9edaccb2..c1a3abf2a 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -36,7 +36,6 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/executor/executorcmd/nopb" - "github.com/k0kubun/pp" "google.golang.org/grpc" "github.com/AliceO2Group/Control/common/controlmode" @@ -148,7 +147,6 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er "message": status.Message(), "details": status.Details(), "error": status.Err().Error(), - "ppStatus": pp.Sprint(status), "level": infologger.IL_Devel, }). Error("transition call error") From 616169bf36e50bc4578239593a79f9cf6ded12c2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Oct 2021 10:16:22 +0200 Subject: [PATCH 1015/2352] [executor] Fix MesosCommandResponse error handling --- executor/handlers.go | 88 +++++++++++++++++++++++++++++++------------- 1 file changed, 62 insertions(+), 26 deletions(-) diff --git a/executor/handlers.go b/executor/handlers.go index 26e36ac93..7ee826157 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -183,24 +183,42 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { data, marshalError := json.Marshal(response) if marshalError != nil { + if response.Err() != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + } else { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + } + return + } + + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) + if response.Err() != nil { log.WithFields(logrus.Fields{ "commandName": response.GetCommandName(), "commandId": response.GetCommandId(), + "taskId": response.TaskId, "error": response.Err().Error(), - "marshalError": marshalError, }). - Error("cannot marshal MesosCommandResponse for sending as MESSAGE") - return + Trace("response sent") + } else { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "taskId": response.TaskId, + }). + Trace("response sent") } - - _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "taskId": response.TaskId, - "error": response.Err().Error(), - }). - Trace("response sent") }() case "MesosCommand_Transition": @@ -244,24 +262,42 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { data, marshalError := json.Marshal(response) if marshalError != nil { - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "marshalError": marshalError, - }). - Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + if response.Err() != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + } else { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "marshalError": marshalError, + }). + Error("cannot marshal MesosCommandResponse for sending as MESSAGE") + } return } _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) - log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "state": response.CurrentState, - }). - Trace("response sent") + if response.Err() != nil { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "state": response.CurrentState, + }). + Trace("response sent") + } else { + log.WithFields(logrus.Fields{ + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "state": response.CurrentState, + }). + Trace("response sent") + } }() From 388aee60e85718553af4ab0c8d3d7fe26ce869d8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 5 Oct 2021 15:50:14 +0200 Subject: [PATCH 1016/2352] [core] Expose call traits (including timeout) to called function --- core/workflow/callable/call.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 8126d0b68..6cc4ecb6e 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -26,6 +26,7 @@ package callable import ( "fmt" + "strconv" texttemplate "text/template" "time" @@ -129,6 +130,13 @@ func (c *Call) Call() error { template.WrapPointer(&returnVar), } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() + c.VarStack["__call_func"] = c.Func + c.VarStack["__call_timeout"] = c.Traits.Timeout + c.VarStack["__call_trigger"] = c.Traits.Trigger + c.VarStack["__call_await"] = c.Traits.Await + c.VarStack["__call_critical"] = strconv.FormatBool(c.Traits.Critical) + c.VarStack["__call_rolepath"] = c.GetParentRolePath() + objStack := integration.PluginsInstance().ObjectStack(c) err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) @@ -144,7 +152,7 @@ func (c *Call) Call() error { func (c *Call) Start() { c.await = make(chan error) go func() { - callId := fmt.Sprintf("hook:%s", c.GetName()) + callId := fmt.Sprintf("hook:%s:%s", c.GetTraits().Trigger, c.GetName()) log.Debugf("%s started", callId) defer utils.TimeTrack(time.Now(), callId, log.WithPrefix("callable")) c.await <- c.Call() From a2599b23bd1a4fed719fced6519dc78d430baf9b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 5 Oct 2021 16:21:39 +0200 Subject: [PATCH 1017/2352] [core] Improve logging in env.handleHooks --- core/environment/environment.go | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index ad7bf3bfc..7bac5dff6 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/system" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" @@ -205,34 +206,50 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err error) { - // First we start any tasks + log.WithField("partition", env.id).Debugf("begin handling hooks for trigger %s", trigger) + defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) + + // Starting point: get all hooks to be started for the current trigger allHooks := workflow.GetHooksForTrigger(trigger) + + // Hooks can be call hooks or task hooks, we do the calls first callsToStart := allHooks.FilterCalls() if len(callsToStart) != 0 { // Before we run anything asynchronously we must associate each call we're about // to start with its corresponding await expression for _, call := range callsToStart { awaitExpr := call.GetTraits().Await + // If the callsPendingAwait map has no pending calls list for the given await expression, + // we make sure it's created before we add any pending awaits. if _, ok := env.callsPendingAwait[awaitExpr]; !ok || len(env.callsPendingAwait[awaitExpr]) == 0 { env.callsPendingAwait[awaitExpr] = make(callable.Calls, 0) } env.callsPendingAwait[awaitExpr] = append(env.callsPendingAwait[awaitExpr], call) } - callsToStart.StartAll() + callsToStart.StartAll() // returns immediately (async) } - // Then we take care of any pending hooks, including from the current trigger + // Then we take care of any pending hooks whose await expression corresponds to the current trigger, + // including any tasks that have just been started (for which trigger == call.Trigger == call.Await). // TODO: this should be further refined by adding priority/weight - pendingCalls, ok := env.callsPendingAwait[trigger] callErrors := make(map[*callable.Call]error) + pendingCalls, ok := env.callsPendingAwait[trigger] if ok && len(pendingCalls) != 0 { // there are hooks to take care of + // AwaitAll blocks with no global timeout - it is up to the specific called function to implement + // a timeout internally. + // The Call instance pushes to the call's varStack some special values including the timeout + // (provided by the workflow template). At that point the integration plugin must acquire the + // timeout value and use the Context mechanism or some other approach to ensure the timeouts are + // respected. + callErrors = pendingCalls.AwaitAll() } // Tasks are handled separately for now, and they cannot have trigger!=await hooksToTrigger := allHooks.FilterTasks() - taskErrors := env.runTasksAsHooks(hooksToTrigger) + taskErrors := env.runTasksAsHooks(hooksToTrigger) // blocking call, timeouts in executor + // Prepare structures to accumulate errors allErrors := make(map[callable.Hook]error) criticalFailures := make([]error, 0) From 0e4a278d7013f3ff6a3945345bef315de096e184 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 10:45:54 +0200 Subject: [PATCH 1018/2352] [core] Ensure all ODC calls are bound by a context with timeout --- core/integration/odc/handlers.go | 12 ++-- core/integration/odc/plugin.go | 105 ++++++++++++++++++++++++++----- 2 files changed, 95 insertions(+), 22 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 67a6c5ba8..637ec35ce 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -550,12 +550,12 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "odcRunid": configureResponse.Reply.Partitionid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "odcRunid": configureResponse.Reply.Partitionid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). Debug("call to ODC complete") return err } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 20e2ca118..fba17b034 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -44,7 +44,14 @@ import ( "google.golang.org/grpc" ) -const ODC_DIAL_TIMEOUT = 2 * time.Second +const( + ODC_DIAL_TIMEOUT = 2 * time.Second + ODC_GENERAL_OP_TIMEOUT = 5 * time.Second + ODC_CONFIGURE_TIMEOUT = 60 * time.Second + ODC_START_TIMEOUT = 15 * time.Second + ODC_STOP_TIMEOUT = 15 * time.Second + ODC_RESET_TIMEOUT = 30 * time.Second +) type Plugin struct { @@ -151,20 +158,28 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { ok := false topology, ok = varStack["odc_topology"] if !ok { - log.Error("cannot acquire ODC topology") + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("cannot acquire ODC topology") return } plugin, ok = varStack["odc_plugin"] if !ok { - log.Error("cannot acquire ODC RMS plugin declaration") + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("cannot acquire ODC RMS plugin declaration") return } resources, ok = varStack["odc_resources"] if !ok { - log.Error("cannot acquire ODC resources declaration") + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("cannot acquire ODC resources declaration") return } + timeout := acquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) + arguments := make(map[string]string) arguments["environment_id"] = envId @@ -175,66 +190,101 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { arguments[strings.TrimPrefix(k, "odc_")] = v } } - - err := handleConfigure(context.Background(), p.odcClient, arguments, topology, plugin, resources, envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleConfigure(ctx, p.odcClient, arguments, topology, plugin, resources, envId) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "Configure"). WithError(err).Error("ODC error") - log.WithField("partition", envId).Error("EPN Configure call failed") + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("EPN Configure call failed") } return } stack["Start"] = func() (out string) { // must formally return string even when we return nothing rn, ok := varStack["run_number"] if !ok { - log.Warn("cannot acquire run number for ODC") + log.WithField("partition", envId). + WithField("call", "Start"). + Warn("cannot acquire run number for ODC") } + timeout := acquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) + arguments := make(map[string]string) arguments["run_number"] = rn arguments["runNumber"] = rn - err := handleStart(context.Background(), p.odcClient, arguments, envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleStart(ctx, p.odcClient, arguments, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "Start"). Error("ODC error") - log.WithField("partition", envId).Error("EPN Start call failed") + log.WithField("partition", envId). + WithField("call", "Start"). + Error("EPN Start call failed") } return } stack["Stop"] = func() (out string) { - err := handleStop(context.Background(), p.odcClient, nil, envId) + timeout := acquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleStop(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "Stop"). Error("ODC error") - log.WithField("partition", envId).Error("EPN Stop call failed") + log.WithField("partition", envId). + WithField("call", "Stop"). + Error("EPN Stop call failed") } return } stack["Reset"] = func() (out string) { - err := handleReset(context.Background(), p.odcClient, nil, envId) + timeout := acquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleReset(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "Reset"). Error("ODC error") - log.WithField("partition", envId).Error("EPN Reset call failed") + log.WithField("partition", envId). + WithField("call", "Reset"). + Error("EPN Reset call failed") } return } stack["EnsureCleanup"] = func() (out string) { - err := handleCleanup(context.Background(), p.odcClient, nil, envId) + timeout := acquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleCleanup(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "EnsureCleanup"). + Error("ODC error") - log.WithField("partition", envId).Error("EPN Cleanup sequence failed") + log.WithField("partition", envId). + WithField("call", "EnsureCleanup"). + Error("EPN Cleanup sequence failed") } return } @@ -245,3 +295,26 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { func (p *Plugin) Destroy() error { return p.odcClient.Close() } + +func acquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { + timeout := defaultTimeout + timeoutStr, ok := varStack["__call_timeout"] // the Call interface ensures we'll find this key + // see Call.Call in callable/call.go for details + if ok { + var err error + timeout, err = time.ParseDuration(timeoutStr) + if err != nil { + timeout = defaultTimeout + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not parse timeout declaration for hook call") + } + } else { + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not get timeout declaration for hook call") + } + return timeout +} \ No newline at end of file From 30669f1874d6fba500025b8dcbc51b86f3c4eb7b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 14:54:39 +0200 Subject: [PATCH 1019/2352] [core] Reduce verbosity of recurrent log messages --- core/task/constraint/attributes.go | 2 +- core/task/scheduler.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/constraint/attributes.go b/core/task/constraint/attributes.go index 8db9b7f07..678443e82 100644 --- a/core/task/constraint/attributes.go +++ b/core/task/constraint/attributes.go @@ -68,7 +68,7 @@ func (attrs Attributes) Satisfy(cts Constraints) (ok bool) { } for _, constraint := range cts { - log.WithField("constraint", constraint.String()).Debug("processing constraint") + log.WithField("constraint", constraint.String()).Trace("processing constraint") switch constraint.Operator { case Equals: var value string diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 87fac3b03..748c671ed 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -849,7 +849,7 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { "task": s.TaskID.Value, "state": s.GetState().String(), "message": s.GetMessage(), - }).Debug("task status update received") + }).Trace("task status update received") } // What's the new task state? From 55e0ea064959e06b7ea9f7239f7d247cd8fc9cb7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 14:56:26 +0200 Subject: [PATCH 1020/2352] [core] Move acquireTimeout utility function to the callable package --- core/integration/odc/plugin.go | 33 +++++---------------------------- core/workflow/callable/call.go | 23 +++++++++++++++++++++++ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index fba17b034..2a1001382 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -178,7 +178,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } - timeout := acquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) + timeout := callable.AcquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) arguments := make(map[string]string) arguments["environment_id"] = envId @@ -212,7 +212,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Warn("cannot acquire run number for ODC") } - timeout := acquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) + timeout := callable.AcquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) arguments := make(map[string]string) arguments["run_number"] = rn @@ -234,7 +234,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["Stop"] = func() (out string) { - timeout := acquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) + timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -252,7 +252,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["Reset"] = func() (out string) { - timeout := acquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -270,7 +270,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["EnsureCleanup"] = func() (out string) { - timeout := acquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -295,26 +295,3 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { func (p *Plugin) Destroy() error { return p.odcClient.Close() } - -func acquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { - timeout := defaultTimeout - timeoutStr, ok := varStack["__call_timeout"] // the Call interface ensures we'll find this key - // see Call.Call in callable/call.go for details - if ok { - var err error - timeout, err = time.ParseDuration(timeoutStr) - if err != nil { - timeout = defaultTimeout - log.WithField("partition", envId). - WithField("call", callName). - WithField("default", timeout.String()). - Warn("could not parse timeout declaration for hook call") - } - } else { - log.WithField("partition", envId). - WithField("call", callName). - WithField("default", timeout.String()). - Warn("could not get timeout declaration for hook call") - } - return timeout -} \ No newline at end of file diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 6cc4ecb6e..f3b03ba10 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -188,4 +188,27 @@ type ParentRole interface { SendEvent(event.Event) SetRuntimeVar(key string, value string) GetCurrentRunNumber() uint32 +} + +func AcquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { + timeout := defaultTimeout + timeoutStr, ok := varStack["__call_timeout"] // the Call interface ensures we'll find this key + // see Call.Call in callable/call.go for details + if ok { + var err error + timeout, err = time.ParseDuration(timeoutStr) + if err != nil { + timeout = defaultTimeout + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not parse timeout declaration for hook call") + } + } else { + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not get timeout declaration for hook call") + } + return timeout } \ No newline at end of file From d6cc6342cd40b2ae386fe2280205f664d210888a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 15:02:22 +0200 Subject: [PATCH 1021/2352] [core] Ensure all DCS calls are bound by a context with timeout --- core/integration/dcs/plugin.go | 106 +++++++++++++++++++++++++-------- 1 file changed, 81 insertions(+), 25 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 58c7dcb32..7436b740e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -48,7 +48,10 @@ import ( "google.golang.org/grpc/connectivity" ) -const DCS_DIAL_TIMEOUT = 2 * time.Hour +const ( + DCS_DIAL_TIMEOUT = 2 * time.Hour + DCS_GENERAL_OP_TIMEOUT = 45 * time.Second +) type Plugin struct { dcsHost string @@ -156,13 +159,21 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + stack = make(map[string]interface{}) stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing DCS SOR") + log.WithField("partition", envId). + Debug("performing DCS SOR") parameters, ok := varStack["dcs_sor_parameters"] if !ok { - log.Debug("no DCS SOR parameters set") + log.WithField("partition", envId). + Debug("no DCS SOR parameters set") parameters = "{}" } @@ -170,7 +181,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(parameters) err := json.Unmarshal(bytes, &argMap) if err != nil { - log.WithError(err).Error("error processing DCS SOR parameters") + log.WithField("partition", envId). + WithError(err). + Error("error processing DCS SOR parameters") return } @@ -178,7 +191,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { var runNumber64 int64 runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err).Error("cannot acquire run number for DCS SOR") + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for DCS SOR") } rt := dcspb.RunType_TECHNICAL @@ -196,7 +211,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { - log.Debug("empty DCS detectors list provided") + log.WithField("partition", envId). + Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -214,7 +230,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { for i, det := range detectors { perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_sor_parameters"] if !ok { - log.Debug("empty DCS detectors list provided") + log.WithField("partition", envId). + Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } detectorArgMap := make(map[string]string) @@ -223,6 +240,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("detector", det.String()). + WithField("partition", envId). Errorf("error processing DCS SOR parameters for detector %s", det.String()) return } @@ -232,6 +250,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("detector", det.String()). + WithField("partition", envId). Errorf("error building parameter map for detector %s", det.String()) return } @@ -245,47 +264,58 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.dcsClient == nil { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS SOR") return } if p.dcsClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DCS client connection not available")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS SOR") return } var stream dcspb.Configurator_StartOfRunClient - stream, err = p.dcsClient.StartOfRun(context.Background(), &in, grpc.EmptyCallOption{}) + timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + stream, err = p.dcsClient.StartOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS SOR") } var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() if err == io.EOF { - log.Debug("DCS SOR event stream EOF, closed") + log.WithField("partition", envId). + Debug("DCS SOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { - log.Warn("nil DCS event received") + log.WithField("partition", envId). + Warn("nil DCS event received") err = errors.New("nil DCS event") } - log.WithError(err).Warn("bad DCS event received") + log.WithError(err).WithField("partition", envId). + Warn("bad DCS event received") break } if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { log.WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). + WithField("partition", envId). Warn("DCS SOR failure") return } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). + WithField("partition", envId). Debug("DCS SOR success") envId, ok := varStack["environment_id"] if !ok { @@ -294,16 +324,18 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { p.pendingEORs[envId] = runNumber64 break } - log.WithField("event", dcsEvent).Debug("incoming DCS SOR event") + log.WithField("event", dcsEvent). + WithField("partition", envId). + Debug("incoming DCS SOR event") } return } eorFunc := func(runNumber int64) (out string) { // must formally return string even when we return nothing - log.Debug("performing DCS EOR") + log.WithField("partition", envId).Debug("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] if !ok { - log.Debug("no DCS EOR parameters set") + log.WithField("partition", envId).Debug("no DCS EOR parameters set") parameters = "{}" } @@ -311,13 +343,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(parameters) err := json.Unmarshal(bytes, &argMap) if err != nil { - log.WithError(err).Error("error processing DCS EOR parameters") + log.WithError(err). + WithField("partition", envId). + Error("error processing DCS EOR parameters") return } dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { - log.Debug("empty DCS detectors list provided") + log.WithField("partition", envId). + Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -334,7 +369,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { for i, det := range detectors { perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_eor_parameters"] if !ok { - log.Debug("empty DCS detectors list provided") + log.WithField("partition", envId). + Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } detectorArgMap := make(map[string]string) @@ -343,6 +379,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("detector", det.String()). + WithField("partition", envId). Errorf("error processing DCS EOR parameters for detector %s", det.String()) return } @@ -352,6 +389,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("detector", det.String()). + WithField("partition", envId). Errorf("error building parameter map for detector %s", det.String()) return } @@ -365,33 +403,41 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.dcsClient == nil { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS EOR") return } if p.dcsClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DCS client connection not available")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS EOR") return } var stream dcspb.Configurator_EndOfRunClient - stream, err = p.dcsClient.EndOfRun(context.Background(), &in, grpc.EmptyCallOption{}) + timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + stream, err = p.dcsClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). Error("failed to perform DCS EOR") } var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() if err == io.EOF { - log.Debug("DCS EOR event stream EOF, closed") + log.WithField("partition", envId). + Debug("DCS EOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { - log.Warn("nil DCS event received") + log.WithField("partition", envId). + Warn("nil DCS event received") err = errors.New("nil DCS event") } log.WithError(err).Warn("bad DCS event received") @@ -401,11 +447,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { log.WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). + WithField("partition", envId). Warn("DCS EOR failure") return } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). + WithField("partition", envId). Debug("DCS EOR success") envId, ok := varStack["environment_id"] if !ok { @@ -415,7 +463,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { break } - log.WithField("event", dcsEvent).Debug("incoming DCS EOR event") + log.WithField("event", dcsEvent). + WithField("partition", envId). + Debug("incoming DCS EOR event") } return } @@ -425,24 +475,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { var err error runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err).Error("cannot acquire run number for DCS EOR") + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for DCS EOR") } return eorFunc(runNumber64) } stack["Cleanup"] = func() (out string) { envId, ok := varStack["environment_id"] if !ok { - log.Warn("no environment_id found for DCS cleanup") + log.WithField("partition", envId). + Warn("no environment_id found for DCS cleanup") return } runNumber, ok := p.pendingEORs[envId] if !ok { - log.Debug("DCS cleanup: nothing to do") + log.WithField("partition", envId). + Debug("DCS cleanup: nothing to do") return } - log.WithField("runNumber", runNumber).Debug("pending DCS EOR found, performing cleanup") + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("pending DCS EOR found, performing cleanup") return eorFunc(runNumber) } From de51471eaad28ee28d679597c96967eab4127736 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 15:03:29 +0200 Subject: [PATCH 1022/2352] [core] Ensure all DDsched calls are bound by a context with timeout --- core/integration/ddsched/plugin.go | 138 +++++++++++++++-------------- 1 file changed, 72 insertions(+), 66 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 3c86e3c77..e06624d76 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -45,7 +45,12 @@ import ( "google.golang.org/grpc/connectivity" ) -const DDSCHED_DIAL_TIMEOUT = 2 * time.Second +const ( + DDSCHED_DIAL_TIMEOUT = 2 * time.Second + DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second + DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second + DDSCHED_DEFAULT_POLLING_TIMEOUT = 30 * time.Second +) type Plugin struct { @@ -148,9 +153,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + stack = make(map[string]interface{}) stack["PartitionInitialize"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing DD scheduler PartitionInitialize") + log.WithField("partition", envId). + Debug("performing DD scheduler PartitionInitialize") parentRoleI := call.GetParentRole() parentRole, ok := parentRoleI.(workflow.Role) @@ -162,7 +174,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { workflow.LeafWalk(root, func(role workflow.Role) { roleVS, err := role.ConsolidatedVarStack() if err != nil { - log.WithError(err).Error("error processing DD host_id_map") + log.WithError(err). + WithField("partition", envId). + Error("error processing DD host_id_map") return } var( @@ -185,12 +199,6 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } }) - envId, ok := varStack["environment_id"] - if !ok { - log.Error("cannot acquire environment ID for DD scheduler PartitionInitialize") - return - } - in := ddpb.PartitionInitRequest{ PartitionInfo: &ddpb.PartitionInfo{ EnvironmentId: envId, @@ -201,14 +209,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return } if p.ddSchedClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DD scheduler client connection not available")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return @@ -218,10 +226,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { response *ddpb.PartitionResponse err error ) - response, err = p.ddSchedClient.PartitionInitialize(context.Background(), &in, grpc.EmptyCallOption{}) + timeout := callable.AcquireTimeout(DDSCHED_INITIALIZE_TIMEOUT, varStack, "Initialize", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + response, err = p.ddSchedClient.PartitionInitialize(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return @@ -229,22 +240,22 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING && response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURED { log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") return } pollingSeconds, ok := varStack["dd_polling_timeout"] - if !ok { - pollingSeconds = "30" + pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT + if ok { + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout = time.Duration(pollingSecondsInt) * time.Second } - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout := time.Duration(pollingSecondsInt) * time.Second PARTITION_STATE_POLLING: for startPolling := time.Now(); ; { - response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_CONFIGURING: time.Sleep(100 * time.Millisecond) @@ -252,14 +263,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { break PARTITION_STATE_POLLING default: log.WithError(fmt.Errorf("PartitionInitialize landed on unexpected state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionInitialize") break PARTITION_STATE_POLLING } if time.Since(startPolling) > pollingTimeout { log.WithError(fmt.Errorf("PartitionInitialize timeout exceeded. Latest state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). WithField("timeout", pollingTimeout). Error("failed to perform DD scheduler PartitionInitialize") @@ -269,13 +280,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["PartitionTerminate"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing DD scheduler PartitionTerminate") - - envId, ok := varStack["environment_id"] - if !ok { - log.Error("cannot acquire environment ID for DD scheduler PartitionTerminate") - return - } + log.WithField("partition", envId). + Debug("performing DD scheduler PartitionTerminate") in := ddpb.PartitionTermRequest{ PartitionInfo: &ddpb.PartitionInfo{ @@ -285,14 +291,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") return } if p.ddSchedClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DD scheduler client connection not available")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") return @@ -302,32 +308,34 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { response *ddpb.PartitionResponse err error ) - response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) + timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } pollingSeconds, ok := varStack["dd_polling_timeout"] - if !ok { - // Default to 30s when dd_polling_timeout is not set - pollingSeconds = "30" + pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT + if ok { + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout = time.Duration(pollingSecondsInt) * time.Second } - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout := time.Duration(pollingSecondsInt) * time.Second PARTITION_STATE_POLLING: for startPolling := time.Now(); ; { - response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: time.Sleep(100 * time.Millisecond) @@ -335,14 +343,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { break PARTITION_STATE_POLLING default: log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") break PARTITION_STATE_POLLING } if time.Since(startPolling) > pollingTimeout { log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). WithField("timeout", pollingTimeout). Error("failed to perform DD scheduler PartitionTerminate") @@ -352,24 +360,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["EnsureTermination"] = func() (out string) { - log.Debug("performing DD scheduler session cleanup") - - envId, ok := varStack["environment_id"] - if !ok { - log.Error("cannot acquire environment ID for DD scheduler session cleanup") - return - } + log.WithField("partition", envId). + Debug("performing DD scheduler session cleanup") if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler session cleanup") return } if p.ddSchedClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("DD scheduler client connection not available")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler session cleanup") return @@ -384,10 +387,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { EnvironmentId: envId, PartitionId: envId, } - response, err = p.ddSchedClient.PartitionStatus(context.Background(), &infoReq, grpc.EmptyCallOption{}) + timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + response, err = p.ddSchedClient.PartitionStatus(ctx, &infoReq, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler session cleanup") return @@ -395,7 +401,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if response == nil { log.WithError(errors.New("nil response")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler session cleanup") return @@ -410,7 +416,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { response.PartitionState == ddpb.PartitionState_PARTITION_TERMINATED { // DDsched is in an acceptable state, so we return log.WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("partition_state", response.PartitionState). Trace("DD scheduler session cleanup not needed") return @@ -427,35 +433,35 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } log.WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("environment_id", envId). + WithField("partition", envId). WithField("partition_state", response.PartitionState). Warn("DD scheduler partition still active, performing PartitionTerminate") - response, err = p.ddSchedClient.PartitionTerminate(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") } pollingSeconds, ok := varStack["dd_polling_timeout"] - if !ok { - // Default to 30s when dd_polling_timeout is not set - pollingSeconds = "30" + pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT + if ok { + pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) + pollingTimeout = time.Duration(pollingSecondsInt) * time.Second } - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout := time.Duration(pollingSecondsInt) * time.Second + PARTITION_STATE_POLLING: for startPolling := time.Now(); ; { - response, err = p.ddSchedClient.PartitionStatus(context.Background(), in.PartitionInfo, grpc.EmptyCallOption{}) + response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: time.Sleep(100 * time.Millisecond) @@ -463,14 +469,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { break PARTITION_STATE_POLLING default: log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). Error("failed to perform DD scheduler PartitionTerminate") break PARTITION_STATE_POLLING } if time.Since(startPolling) > pollingTimeout { log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). - WithField("environment_id", envId). + WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). WithField("timeout", pollingTimeout). Error("failed to perform DD scheduler PartitionTerminate") From 234de810071ad935ddec0e3be5aec97c9dc290ed Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Oct 2021 15:05:54 +0200 Subject: [PATCH 1023/2352] [build] Bump to v0.26.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7d28921b7..ec37d39fb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 7 +VERSION_PATCH := 80 From 4a2fcf1f885446c9911f5f56b43dc033038f5be4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Oct 2021 11:02:46 +0200 Subject: [PATCH 1024/2352] [core] Adjust level of DCS client log messages --- core/integration/dcs/plugin.go | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 7436b740e..8131ee65e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -37,6 +37,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" @@ -168,7 +169,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). - Debug("performing DCS SOR") + WithField("level", infologger.IL_Ops). + Info("performing DCS SOR") parameters, ok := varStack["dcs_sor_parameters"] if !ok { @@ -326,12 +328,15 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } log.WithField("event", dcsEvent). WithField("partition", envId). - Debug("incoming DCS SOR event") + WithField("level", infologger.IL_Support). + Info("incoming DCS SOR event") } return } eorFunc := func(runNumber int64) (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId).Debug("performing DCS EOR") + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + Info("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] if !ok { @@ -465,7 +470,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). - Debug("incoming DCS EOR event") + WithField("level", infologger.IL_Support). + Info("incoming DCS EOR event") } return } From c1f40cb1c7ff21fd39fcef9210b2b2380cdc7172 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Oct 2021 18:17:11 +0200 Subject: [PATCH 1025/2352] [core] Return inline error of the correct type --- configuration/template/stack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 23d827ba1..d7a820d4c 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -121,7 +121,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str defer utils.TimeTrack(time.Now(),"CRUCardsForHost", log.WithPrefix("template")) payload, err := confSvc.GetCRUCardsForHost(hostname) if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + return fmt.Sprintf("[\"error: %s\"]", err.Error()) } return payload }, From 74a13ca0dc3b581d4e1898a268477f4cd6fbebda Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Oct 2021 18:18:30 +0200 Subject: [PATCH 1026/2352] [core] Don't crash when parsing error on MesosCommandResponse --- core/task/manager.go | 35 +++++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 5d04ef651..257749a2f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -533,11 +533,14 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } return nil } else { - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) + respError := response.Err() + if respError != nil { + errText := respError.Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + // FIXME: improve error handling ↑ } - // FIXME: improve error handling ↑ } return nil @@ -573,13 +576,15 @@ func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest st return errors.New("unknown MesosCommand error: nil response received") } - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) + respError := response.Err() + if respError != nil { + errText := respError.Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + // FIXME: improve error handling ↑ } - // FIXME: improve error handling ↑ - return nil } @@ -608,13 +613,15 @@ func (m *Manager) TriggerHooks(tasks Tasks) error { return errors.New("unknown MesosCommand error: nil response received") } - errText := response.Err().Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) + respError := response.Err() + if respError != nil { + errText := respError.Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + // FIXME: improve error handling ↑ } - // FIXME: improve error handling ↑ - return nil } From dfd8ef3212fcc6760cd44cc30ccacc8f4dd79088 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Oct 2021 13:03:42 +0200 Subject: [PATCH 1027/2352] [core] Forward ODC error messages --- core/integration/odc/handlers.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 637ec35ce..f2cec745a 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -572,8 +572,12 @@ func printGrpcError(err error) error { Trace("ODC call error") err = fmt.Errorf("ODC returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) } else { - err = errors.New("invalid gRPC status") - log.WithField("error", "invalid gRPC status"). + if err == nil { + err = errors.New("nil gRPC status") + } else { + err = fmt.Errorf("invalid gRPC status: %w", err) + } + log.WithField("error", err.Error()). Trace("ODC call error") } return err From ab92bf1755331785815fdfc5ac9c816ea76caa04 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 30 Jun 2021 09:43:26 +0200 Subject: [PATCH 1028/2352] [core] Add ctpecs protos --- core/integration/cts/protos/ctpecs.pb.go | 637 ++++++++++++++++++ core/integration/cts/protos/ctpecs.proto | 61 ++ core/integration/cts/protos/ctpecs_grpc.pb.go | 283 ++++++++ 3 files changed, 981 insertions(+) create mode 100644 core/integration/cts/protos/ctpecs.pb.go create mode 100644 core/integration/cts/protos/ctpecs.proto create mode 100644 core/integration/cts/protos/ctpecs_grpc.pb.go diff --git a/core/integration/cts/protos/ctpecs.pb.go b/core/integration/cts/protos/ctpecs.pb.go new file mode 100644 index 000000000..f0c547af2 --- /dev/null +++ b/core/integration/cts/protos/ctpecs.pb.go @@ -0,0 +1,637 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.16.0 +// source: protos/ctpecs.proto + +package ctpecs + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +// -config, e.g. "trig\nPH_bc 100 inf" or +// -key in case the config is available in Consul[key] +// -"" use default configuration +// +// Optional parameters follows, overriding parameters in config string +// for the begining let's agree on three parameters : +type RunStartRequest_Mode int32 + +const ( + RunStartRequest_NULL RunStartRequest_Mode = 0 // use default (from config) + RunStartRequest_TRIG RunStartRequest_Mode = 1 + RunStartRequest_CONT RunStartRequest_Mode = 2 +) + +// Enum value maps for RunStartRequest_Mode. +var ( + RunStartRequest_Mode_name = map[int32]string{ + 0: "NULL", + 1: "TRIG", + 2: "CONT", + } + RunStartRequest_Mode_value = map[string]int32{ + "NULL": 0, + "TRIG": 1, + "CONT": 2, + } +) + +func (x RunStartRequest_Mode) Enum() *RunStartRequest_Mode { + p := new(RunStartRequest_Mode) + *p = x + return p +} + +func (x RunStartRequest_Mode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunStartRequest_Mode) Descriptor() protoreflect.EnumDescriptor { + return file_protos_ctpecs_proto_enumTypes[0].Descriptor() +} + +func (RunStartRequest_Mode) Type() protoreflect.EnumType { + return &file_protos_ctpecs_proto_enumTypes[0] +} + +func (x RunStartRequest_Mode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunStartRequest_Mode.Descriptor instead. +func (RunStartRequest_Mode) EnumDescriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{1, 0} +} + +//import "ctpecs_m.proto"; +// global runs only: +type RunLoadRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Runn uint32 `protobuf:"varint,1,opt,name=runn,proto3" json:"runn,omitempty"` // run number + Config string `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + // -config, i.e. the content of partname.pd + // -partname -the content is in ctp config dir partname.pd + // -key in case the config is available in Consul[key] + Detectors string `protobuf:"bytes,3,opt,name=detectors,proto3" json:"detectors,omitempty"` // available detectors, "" -all required must be ready +} + +func (x *RunLoadRequest) Reset() { + *x = RunLoadRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunLoadRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunLoadRequest) ProtoMessage() {} + +func (x *RunLoadRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunLoadRequest.ProtoReflect.Descriptor instead. +func (*RunLoadRequest) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{0} +} + +func (x *RunLoadRequest) GetRunn() uint32 { + if x != nil { + return x.Runn + } + return 0 +} + +func (x *RunLoadRequest) GetConfig() string { + if x != nil { + return x.Config + } + return "" +} + +func (x *RunLoadRequest) GetDetectors() string { + if x != nil { + return x.Detectors + } + return "" +} + +// global + stdalone runs (common for ctpd/ltud): +type RunStartRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Runn uint32 `protobuf:"varint,1,opt,name=runn,proto3" json:"runn,omitempty"` // run number + Config string `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` + Mode RunStartRequest_Mode `protobuf:"varint,3,opt,name=mode,proto3,enum=cts.RunStartRequest_Mode" json:"mode,omitempty"` + PhBc string `protobuf:"bytes,4,opt,name=ph_bc,json=phBc,proto3" json:"ph_bc,omitempty"` // BC-downscaled rate of physics triggers + PhRnd string `protobuf:"bytes,5,opt,name=ph_rnd,json=phRnd,proto3" json:"ph_rnd,omitempty"` // rate of physics triggers generated randomly + // ph_ ...: "": use default (from config) + // N : number of BCs between 2 triggers + // 2.3khz rate of triggers: 2.3 khz + Detector string `protobuf:"bytes,6,opt,name=detector,proto3" json:"detector,omitempty"` // detector has to be given for stdalone runs, "" for global run +} + +func (x *RunStartRequest) Reset() { + *x = RunStartRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunStartRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunStartRequest) ProtoMessage() {} + +func (x *RunStartRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunStartRequest.ProtoReflect.Descriptor instead. +func (*RunStartRequest) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{1} +} + +func (x *RunStartRequest) GetRunn() uint32 { + if x != nil { + return x.Runn + } + return 0 +} + +func (x *RunStartRequest) GetConfig() string { + if x != nil { + return x.Config + } + return "" +} + +func (x *RunStartRequest) GetMode() RunStartRequest_Mode { + if x != nil { + return x.Mode + } + return RunStartRequest_NULL +} + +func (x *RunStartRequest) GetPhBc() string { + if x != nil { + return x.PhBc + } + return "" +} + +func (x *RunStartRequest) GetPhRnd() string { + if x != nil { + return x.PhRnd + } + return "" +} + +func (x *RunStartRequest) GetDetector() string { + if x != nil { + return x.Detector + } + return "" +} + +type RunStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Runn uint32 `protobuf:"varint,1,opt,name=runn,proto3" json:"runn,omitempty"` +} + +func (x *RunStatusRequest) Reset() { + *x = RunStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunStatusRequest) ProtoMessage() {} + +func (x *RunStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunStatusRequest.ProtoReflect.Descriptor instead. +func (*RunStatusRequest) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{2} +} + +func (x *RunStatusRequest) GetRunn() uint32 { + if x != nil { + return x.Runn + } + return 0 +} + +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{3} +} + +type RunStopRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Runn uint32 `protobuf:"varint,1,opt,name=runn,proto3" json:"runn,omitempty"` + Detector string `protobuf:"bytes,2,opt,name=detector,proto3" json:"detector,omitempty"` // only for stdalone runs (forced stop) +} + +func (x *RunStopRequest) Reset() { + *x = RunStopRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunStopRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunStopRequest) ProtoMessage() {} + +func (x *RunStopRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunStopRequest.ProtoReflect.Descriptor instead. +func (*RunStopRequest) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{4} +} + +func (x *RunStopRequest) GetRunn() uint32 { + if x != nil { + return x.Runn + } + return 0 +} + +func (x *RunStopRequest) GetDetector() string { + if x != nil { + return x.Detector + } + return "" +} + +type RunReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rc int32 `protobuf:"varint,1,opt,name=rc,proto3" json:"rc,omitempty"` // 0: ok + // RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist + Msg string `protobuf:"bytes,2,opt,name=msg,proto3" json:"msg,omitempty"` // response (usually "" when rc is 0) +} + +func (x *RunReply) Reset() { + *x = RunReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunReply) ProtoMessage() {} + +func (x *RunReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunReply.ProtoReflect.Descriptor instead. +func (*RunReply) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{5} +} + +func (x *RunReply) GetRc() int32 { + if x != nil { + return x.Rc + } + return 0 +} + +func (x *RunReply) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +var File_protos_ctpecs_proto protoreflect.FileDescriptor + +var file_protos_ctpecs_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, 0x74, 0x73, 0x22, 0x5a, 0x0a, 0x0e, 0x52, 0x75, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, + 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, + 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x68, + 0x5f, 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x52, 0x6e, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x24, 0x0a, + 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x4e, + 0x54, 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6d, 0x73, 0x67, 0x32, 0xab, 0x02, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, 0x2f, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, + 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, + 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x73, + 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, + 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x0a, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, + 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2f, + 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x13, 0x2e, 0x63, 0x74, 0x73, 0x2e, + 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, + 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x31, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x13, 0x2e, 0x63, + 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, + 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_ctpecs_proto_rawDescOnce sync.Once + file_protos_ctpecs_proto_rawDescData = file_protos_ctpecs_proto_rawDesc +) + +func file_protos_ctpecs_proto_rawDescGZIP() []byte { + file_protos_ctpecs_proto_rawDescOnce.Do(func() { + file_protos_ctpecs_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_ctpecs_proto_rawDescData) + }) + return file_protos_ctpecs_proto_rawDescData +} + +var file_protos_ctpecs_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_ctpecs_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_ctpecs_proto_goTypes = []interface{}{ + (RunStartRequest_Mode)(0), // 0: cts.RunStartRequest.Mode + (*RunLoadRequest)(nil), // 1: cts.RunLoadRequest + (*RunStartRequest)(nil), // 2: cts.RunStartRequest + (*RunStatusRequest)(nil), // 3: cts.RunStatusRequest + (*Empty)(nil), // 4: cts.Empty + (*RunStopRequest)(nil), // 5: cts.RunStopRequest + (*RunReply)(nil), // 6: cts.RunReply +} +var file_protos_ctpecs_proto_depIdxs = []int32{ + 0, // 0: cts.RunStartRequest.mode:type_name -> cts.RunStartRequest.Mode + 1, // 1: cts.CTPd.RunLoad:input_type -> cts.RunLoadRequest + 2, // 2: cts.CTPd.RunStart:input_type -> cts.RunStartRequest + 3, // 3: cts.CTPd.RunStatus:input_type -> cts.RunStatusRequest + 4, // 4: cts.CTPd.RunList:input_type -> cts.Empty + 5, // 5: cts.CTPd.RunStop:input_type -> cts.RunStopRequest + 5, // 6: cts.CTPd.RunConfig:input_type -> cts.RunStopRequest + 6, // 7: cts.CTPd.RunLoad:output_type -> cts.RunReply + 6, // 8: cts.CTPd.RunStart:output_type -> cts.RunReply + 6, // 9: cts.CTPd.RunStatus:output_type -> cts.RunReply + 6, // 10: cts.CTPd.RunList:output_type -> cts.RunReply + 6, // 11: cts.CTPd.RunStop:output_type -> cts.RunReply + 6, // 12: cts.CTPd.RunConfig:output_type -> cts.RunReply + 7, // [7:13] is the sub-list for method output_type + 1, // [1:7] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_protos_ctpecs_proto_init() } +func file_protos_ctpecs_proto_init() { + if File_protos_ctpecs_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_ctpecs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunLoadRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunStartRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunStopRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_ctpecs_proto_rawDesc, + NumEnums: 1, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_ctpecs_proto_goTypes, + DependencyIndexes: file_protos_ctpecs_proto_depIdxs, + EnumInfos: file_protos_ctpecs_proto_enumTypes, + MessageInfos: file_protos_ctpecs_proto_msgTypes, + }.Build() + File_protos_ctpecs_proto = out.File + file_protos_ctpecs_proto_rawDesc = nil + file_protos_ctpecs_proto_goTypes = nil + file_protos_ctpecs_proto_depIdxs = nil +} diff --git a/core/integration/cts/protos/ctpecs.proto b/core/integration/cts/protos/ctpecs.proto new file mode 100644 index 000000000..28209c79f --- /dev/null +++ b/core/integration/cts/protos/ctpecs.proto @@ -0,0 +1,61 @@ +syntax = "proto3"; +package cts; +option go_package = "protos;ctpecs"; + +// ctpd interface for ECS +service CTPd { +// global run: + rpc RunLoad (RunLoadRequest) returns (RunReply) {} +// stdalone and global runs: + rpc RunStart (RunStartRequest) returns (RunReply) {} + rpc RunStatus (RunStatusRequest) returns (RunReply) {} + rpc RunList (Empty) returns (RunReply) {} + rpc RunStop (RunStopRequest) returns (RunReply) {} + rpc RunConfig (RunStopRequest) returns (RunReply) {} +} +//import "ctpecs_m.proto"; +// global runs only: +message RunLoadRequest { + uint32 runn = 1; // run number + string config = 2; + // -config, i.e. the content of partname.pd + // -partname -the content is in ctp config dir partname.pd + // -key in case the config is available in Consul[key] + string detectors= 3; // available detectors, "" -all required must be ready +} +// global + stdalone runs (common for ctpd/ltud): +message RunStartRequest { + uint32 runn = 1; // run number + string config = 2; + // -config, e.g. "trig\nPH_bc 100 inf" or + // -key in case the config is available in Consul[key] + // -"" use default configuration + // + // Optional parameters follows, overriding parameters in config string + // for the begining let's agree on three parameters : + enum Mode { + NULL = 0; // use default (from config) + TRIG = 1; + CONT = 2; + } + Mode mode = 3; + string ph_bc = 4; // BC-downscaled rate of physics triggers + string ph_rnd = 5; // rate of physics triggers generated randomly + // ph_ ...: "": use default (from config) + // N : number of BCs between 2 triggers + // 2.3khz rate of triggers: 2.3 khz + string detector = 6; // detector has to be given for stdalone runs, "" for global run +} +message RunStatusRequest { + uint32 runn = 1; +} +message Empty {} +message RunStopRequest { + uint32 runn = 1; + string detector = 2; // only for stdalone runs (forced stop) +} +message RunReply { + int32 rc = 1; // 0: ok +// RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist + string msg = 2; // response (usually "" when rc is 0) +} diff --git a/core/integration/cts/protos/ctpecs_grpc.pb.go b/core/integration/cts/protos/ctpecs_grpc.pb.go new file mode 100644 index 000000000..ff45d1c44 --- /dev/null +++ b/core/integration/cts/protos/ctpecs_grpc.pb.go @@ -0,0 +1,283 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package ctpecs + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// CTPdClient is the client API for CTPd service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type CTPdClient interface { + // global run: + RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) + // stdalone and global runs: + RunStart(ctx context.Context, in *RunStartRequest, opts ...grpc.CallOption) (*RunReply, error) + RunStatus(ctx context.Context, in *RunStatusRequest, opts ...grpc.CallOption) (*RunReply, error) + RunList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) + RunStop(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) + RunConfig(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) +} + +type cTPdClient struct { + cc grpc.ClientConnInterface +} + +func NewCTPdClient(cc grpc.ClientConnInterface) CTPdClient { + return &cTPdClient{cc} +} + +func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunLoad", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunStart(ctx context.Context, in *RunStartRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunStart", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunStatus(ctx context.Context, in *RunStatusRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunStatus", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunList", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunStop(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunStop", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/cts.CTPd/RunConfig", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// CTPdServer is the server API for CTPd service. +// All implementations should embed UnimplementedCTPdServer +// for forward compatibility +type CTPdServer interface { + // global run: + RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) + // stdalone and global runs: + RunStart(context.Context, *RunStartRequest) (*RunReply, error) + RunStatus(context.Context, *RunStatusRequest) (*RunReply, error) + RunList(context.Context, *Empty) (*RunReply, error) + RunStop(context.Context, *RunStopRequest) (*RunReply, error) + RunConfig(context.Context, *RunStopRequest) (*RunReply, error) +} + +// UnimplementedCTPdServer should be embedded to have forward compatible implementations. +type UnimplementedCTPdServer struct { +} + +func (UnimplementedCTPdServer) RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunLoad not implemented") +} +func (UnimplementedCTPdServer) RunStart(context.Context, *RunStartRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunStart not implemented") +} +func (UnimplementedCTPdServer) RunStatus(context.Context, *RunStatusRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunStatus not implemented") +} +func (UnimplementedCTPdServer) RunList(context.Context, *Empty) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunList not implemented") +} +func (UnimplementedCTPdServer) RunStop(context.Context, *RunStopRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunStop not implemented") +} +func (UnimplementedCTPdServer) RunConfig(context.Context, *RunStopRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunConfig not implemented") +} + +// UnsafeCTPdServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to CTPdServer will +// result in compilation errors. +type UnsafeCTPdServer interface { + mustEmbedUnimplementedCTPdServer() +} + +func RegisterCTPdServer(s grpc.ServiceRegistrar, srv CTPdServer) { + s.RegisterService(&CTPd_ServiceDesc, srv) +} + +func _CTPd_RunLoad_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunLoadRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunLoad(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunLoad", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunLoad(ctx, req.(*RunLoadRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_RunStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunStartRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunStart(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunStart", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunStart(ctx, req.(*RunStartRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_RunStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunStatus", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunStatus(ctx, req.(*RunStatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_RunList_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunList(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunList", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunList(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_RunStop_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunStopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunStop(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunStop", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunStop(ctx, req.(*RunStopRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_RunConfig_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunStopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunConfig(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/cts.CTPd/RunConfig", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunConfig(ctx, req.(*RunStopRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// CTPd_ServiceDesc is the grpc.ServiceDesc for CTPd service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var CTPd_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "cts.CTPd", + HandlerType: (*CTPdServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "RunLoad", + Handler: _CTPd_RunLoad_Handler, + }, + { + MethodName: "RunStart", + Handler: _CTPd_RunStart_Handler, + }, + { + MethodName: "RunStatus", + Handler: _CTPd_RunStatus_Handler, + }, + { + MethodName: "RunList", + Handler: _CTPd_RunList_Handler, + }, + { + MethodName: "RunStop", + Handler: _CTPd_RunStop_Handler, + }, + { + MethodName: "RunConfig", + Handler: _CTPd_RunConfig_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/ctpecs.proto", +} From 0dfddd8cca2545aaa0ad671a8c43e3a5660b3031 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 30 Jun 2021 09:44:07 +0200 Subject: [PATCH 1029/2352] [core] Create CTS client --- core/integration/cts/client.go | 131 +++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 core/integration/cts/client.go diff --git a/core/integration/cts/client.go b/core/integration/cts/client.go new file mode 100644 index 000000000..f7b43c042 --- /dev/null +++ b/core/integration/cts/client.go @@ -0,0 +1,131 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cts + +import ( + "context" + "time" + + "github.com/AliceO2Group/Control/common/logger" + ctpecs "github.com/AliceO2Group/Control/core/integration/cts/protos" + ctpecspb "github.com/AliceO2Group/Control/core/integration/cts/protos" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" +) + +var log = logger.New(logrus.StandardLogger(),"ctpclient") + + +type RpcClient struct { + ctpecspb.CTPdClient + conn *grpc.ClientConn +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing CTP endpoint") + + dialOptions := []grpc.DialOption { + grpc.WithInsecure(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 20 * time.Second, + }, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, + }), + } + if !viper.GetBool("ctsServiceUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + log.Debug("CTS client connected") + + go func() { + connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + + for { + select { + case ok := <- stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("CTS client %s", connState.String()) + go notifyFunc(connState) + case <- time.After(2 * time.Minute): + conn.ResetConnectBackoff() + case <- cxt.Done(): + return + } + } + }() + + client := &RpcClient { + CTPdClient: ctpecs.NewCTPdClient(conn), + conn: conn, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + return m.conn.Close() +} \ No newline at end of file From 6e95dc74f876fd79df984d7c6f149464756f393a Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 30 Jun 2021 09:46:11 +0200 Subject: [PATCH 1030/2352] [core] Create CTS plugin --- core/integration/cts/plugin.go | 293 +++++++++++++++++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 core/integration/cts/plugin.go diff --git a/core/integration/cts/plugin.go b/core/integration/cts/plugin.go new file mode 100644 index 000000000..394eefe8e --- /dev/null +++ b/core/integration/cts/plugin.go @@ -0,0 +1,293 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto + +package cts + +import ( + "context" + "fmt" + "net/url" + "strconv" + "time" + + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" + ctpecspb "github.com/AliceO2Group/Control/core/integration/cts/protos" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +const CTS_DIAL_TIMEOUT = 2 * time.Second + +type Plugin struct { + ctsHost string + ctsPort int + + ctsClient *RpcClient + +} + +func NewPlugin(endpoint string) integration.Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + ctsHost: u.Hostname(), + ctsPort: portNumber, + ctsClient: nil, + } +} + +func (p *Plugin) GetName() string { + return "cts" +} + +func (p *Plugin) GetPrettyName() string { + return "Central Trigger System" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("ctsServiceEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.ctsClient == nil { + return "UNKNOWN" + } + return p.ctsClient.conn.GetState().String() +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.ctsClient == nil { + return "" + } + return "" +} + +func (p *Plugin) Init(instanceId string) error { + if p.ctsClient == nil { + callTimeout := CTS_DIAL_TIMEOUT + cxt, cancel := context.WithTimeout(context.Background(), callTimeout) + p.ctsClient = NewClient(cxt, cancel, viper.GetString("ctsServiceEndpoint")) + if p.ctsClient == nil { + return fmt.Errorf("failed to connect to CTS service on %s", viper.GetString("ctsServiceEndpoint")) + } + } + if p.ctsClient == nil { + return fmt.Errorf("failed to start CTS client on %s", viper.GetString("ctsServiceEndpoint")) + } + return nil +} + +func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + stack = make(map[string]interface{}) + // global runs only + stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing run load request") + + parameters, ok := varStack["cts_run_parameters"] + if !ok { + log.Debug("no CTS config set, using default configuration") + parameters = "" + } + // TODO (malexis): pass consul key to CTS if avail + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for Run Load") + } + + ctsDetectorsParam, ok := varStack["cts_detectors"] + if !ok { + // "" -all required must be ready + log.Debug("empty CTS detectors list provided") + ctsDetectorsParam = "" + } + + in := ctpecspb.RunLoadRequest{ + Runn: uint32(runNumber64), + Detectors: ctsDetectorsParam, + Config: parameters, + } + if p.ctsClient == nil { + log.WithError(fmt.Errorf("CTS plugin not initialized")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Load request") + return + } + if p.ctsClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTS client connection not available")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Load request") + return + } + + var response *ctpecspb.RunReply + response, err = p.ctsClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Load request") + } + if response.Rc != 2 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Load failed") + } + return + } + stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing + log.Debug("performing CTS run start") + + parameters, ok := varStack["cts_run_parameters"] + if !ok { + log.Debug("no CTS config set, using default configuration") + parameters = "" + } + // TODO (malexis): pass consul key to CTS if avail + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for Run Start") + } + + ctsDetector, ok := varStack["detector"] + if !ok { + // "" it is a global run + log.Debug("Detector for host is not available, starting global run") + ctsDetector = "" + } + + in := ctpecspb.RunStartRequest{ + Runn: uint32(runNumber64), + Detector: ctsDetector, + Config: parameters, + } + + if p.ctsClient == nil { + log.WithError(fmt.Errorf("CTS plugin not initialized")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Start request") + return + } + if p.ctsClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTS client connection not available")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Start request") + return + } + + var response *ctpecspb.RunReply + log.Debug(p.ctsClient) + log.Debug("CTS RUN Start") + response, err = p.ctsClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) + log.Debug(response) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Start request") + } + if response.Rc != 0 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Start failed") + } + log.Debug(response) + return + } + stack["RunStop"] = func() (out string) { + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for CTS Run Stop") + } + + ctsDetector, ok := varStack["DetectorForHost"] + if !ok { + // "" it is a global run + log.Debug("Detector for host is not available, starting global run") + ctsDetector = "" + } + + in := ctpecspb.RunStopRequest{ + Runn: uint32(runNumber64), + Detector: ctsDetector, + } + + if p.ctsClient == nil { + log.WithError(fmt.Errorf("CTS plugin not initialized")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Stop request") + return + } + if p.ctsClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTS client connection not available")). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Stop request") + return + } + + var response *ctpecspb.RunReply + response, err = p.ctsClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + Error("failed to perform Run Stop request") + } + if response.Rc == 3 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Stop failed") + } + return + } + + return +} + +func (p *Plugin) Destroy() error { + return p.ctsClient.Close() +} From 2052b7604ee29952595c476c9f1a3ac42cd88cdd Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 30 Jun 2021 09:46:35 +0200 Subject: [PATCH 1031/2352] [core] Register CTS plugin --- cmd/o2-aliecs-core/main.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index cdf8435a8..b0949456c 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/cts" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/odc" @@ -51,6 +52,10 @@ func init() { "odc", "odcEndpoint", odc.NewPlugin) + integration.RegisterPlugin( + "cts", + "ctsServiceEndpoint", + cts.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, From f3e69bbc02e04b8bc07bd4e8b0b7dd4b17660f87 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Wed, 30 Jun 2021 10:09:14 +0200 Subject: [PATCH 1032/2352] [core] CTS plugin cleanup debug messages --- core/integration/cts/plugin.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/core/integration/cts/plugin.go b/core/integration/cts/plugin.go index 394eefe8e..a046096e8 100644 --- a/core/integration/cts/plugin.go +++ b/core/integration/cts/plugin.go @@ -219,10 +219,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } var response *ctpecspb.RunReply - log.Debug(p.ctsClient) - log.Debug("CTS RUN Start") + response, err = p.ctsClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) - log.Debug(response) if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("ctsServiceEndpoint")). @@ -233,7 +231,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("Message", response.Msg). Error("Run Start failed") } - log.Debug(response) + return } stack["RunStop"] = func() (out string) { From 54896aeb0e6207bc26bb3e29889a6cfce367c27c Mon Sep 17 00:00:00 2001 From: miltalex Date: Thu, 2 Sep 2021 14:02:04 +0200 Subject: [PATCH 1033/2352] [core] Update ctp proto file --- Makefile | 2 +- core/integration/cts/protos/ctpecs.pb.go | 156 +++++++++--------- core/integration/cts/protos/ctpecs.proto | 3 +- core/integration/cts/protos/ctpecs_grpc.pb.go | 62 +++++-- 4 files changed, 133 insertions(+), 90 deletions(-) diff --git a/Makefile b/Makefile index 569681e7f..4b3bc00f6 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/cts SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/core/integration/cts/protos/ctpecs.pb.go b/core/integration/cts/protos/ctpecs.pb.go index f0c547af2..389b0d456 100644 --- a/core/integration/cts/protos/ctpecs.pb.go +++ b/core/integration/cts/protos/ctpecs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.16.0 +// protoc v3.17.3 // source: protos/ctpecs.proto package ctpecs @@ -156,7 +156,7 @@ type RunStartRequest struct { Runn uint32 `protobuf:"varint,1,opt,name=runn,proto3" json:"runn,omitempty"` // run number Config string `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"` - Mode RunStartRequest_Mode `protobuf:"varint,3,opt,name=mode,proto3,enum=cts.RunStartRequest_Mode" json:"mode,omitempty"` + Mode RunStartRequest_Mode `protobuf:"varint,3,opt,name=mode,proto3,enum=ctpd.RunStartRequest_Mode" json:"mode,omitempty"` PhBc string `protobuf:"bytes,4,opt,name=ph_bc,json=phBc,proto3" json:"ph_bc,omitempty"` // BC-downscaled rate of physics triggers PhRnd string `protobuf:"bytes,5,opt,name=ph_rnd,json=phRnd,proto3" json:"ph_rnd,omitempty"` // rate of physics triggers generated randomly // ph_ ...: "": use default (from config) @@ -439,57 +439,61 @@ var File_protos_ctpecs_proto protoreflect.FileDescriptor var file_protos_ctpecs_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x03, 0x63, 0x74, 0x73, 0x22, 0x5a, 0x0a, 0x0e, 0x52, 0x75, - 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, - 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xda, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, - 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x68, - 0x5f, 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x52, 0x6e, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x24, 0x0a, - 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x4e, - 0x54, 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6d, 0x73, 0x67, 0x32, 0xab, 0x02, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, 0x2f, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, - 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, - 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, - 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x73, - 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, - 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x0a, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, - 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2f, - 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x13, 0x2e, 0x63, 0x74, 0x73, 0x2e, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, - 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x31, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x13, 0x2e, 0x63, - 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x63, 0x74, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, - 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x74, 0x70, 0x64, 0x22, 0x5a, 0x0a, 0x0e, 0x52, + 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, + 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, + 0x70, 0x68, 0x5f, 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, + 0x52, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x24, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, + 0x4f, 0x4e, 0x54, 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0xec, 0x02, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, + 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x12, 0x15, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, + 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x63, 0x74, 0x70, 0x64, + 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x28, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0b, + 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, + 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, + 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, + 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, + 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -507,30 +511,32 @@ func file_protos_ctpecs_proto_rawDescGZIP() []byte { var file_protos_ctpecs_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_protos_ctpecs_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_protos_ctpecs_proto_goTypes = []interface{}{ - (RunStartRequest_Mode)(0), // 0: cts.RunStartRequest.Mode - (*RunLoadRequest)(nil), // 1: cts.RunLoadRequest - (*RunStartRequest)(nil), // 2: cts.RunStartRequest - (*RunStatusRequest)(nil), // 3: cts.RunStatusRequest - (*Empty)(nil), // 4: cts.Empty - (*RunStopRequest)(nil), // 5: cts.RunStopRequest - (*RunReply)(nil), // 6: cts.RunReply + (RunStartRequest_Mode)(0), // 0: ctpd.RunStartRequest.Mode + (*RunLoadRequest)(nil), // 1: ctpd.RunLoadRequest + (*RunStartRequest)(nil), // 2: ctpd.RunStartRequest + (*RunStatusRequest)(nil), // 3: ctpd.RunStatusRequest + (*Empty)(nil), // 4: ctpd.Empty + (*RunStopRequest)(nil), // 5: ctpd.RunStopRequest + (*RunReply)(nil), // 6: ctpd.RunReply } var file_protos_ctpecs_proto_depIdxs = []int32{ - 0, // 0: cts.RunStartRequest.mode:type_name -> cts.RunStartRequest.Mode - 1, // 1: cts.CTPd.RunLoad:input_type -> cts.RunLoadRequest - 2, // 2: cts.CTPd.RunStart:input_type -> cts.RunStartRequest - 3, // 3: cts.CTPd.RunStatus:input_type -> cts.RunStatusRequest - 4, // 4: cts.CTPd.RunList:input_type -> cts.Empty - 5, // 5: cts.CTPd.RunStop:input_type -> cts.RunStopRequest - 5, // 6: cts.CTPd.RunConfig:input_type -> cts.RunStopRequest - 6, // 7: cts.CTPd.RunLoad:output_type -> cts.RunReply - 6, // 8: cts.CTPd.RunStart:output_type -> cts.RunReply - 6, // 9: cts.CTPd.RunStatus:output_type -> cts.RunReply - 6, // 10: cts.CTPd.RunList:output_type -> cts.RunReply - 6, // 11: cts.CTPd.RunStop:output_type -> cts.RunReply - 6, // 12: cts.CTPd.RunConfig:output_type -> cts.RunReply - 7, // [7:13] is the sub-list for method output_type - 1, // [1:7] is the sub-list for method input_type + 0, // 0: ctpd.RunStartRequest.mode:type_name -> ctpd.RunStartRequest.Mode + 1, // 1: ctpd.CTPd.RunLoad:input_type -> ctpd.RunLoadRequest + 5, // 2: ctpd.CTPd.RunUnload:input_type -> ctpd.RunStopRequest + 2, // 3: ctpd.CTPd.RunStart:input_type -> ctpd.RunStartRequest + 3, // 4: ctpd.CTPd.RunStatus:input_type -> ctpd.RunStatusRequest + 4, // 5: ctpd.CTPd.RunList:input_type -> ctpd.Empty + 5, // 6: ctpd.CTPd.RunStop:input_type -> ctpd.RunStopRequest + 5, // 7: ctpd.CTPd.RunConfig:input_type -> ctpd.RunStopRequest + 6, // 8: ctpd.CTPd.RunLoad:output_type -> ctpd.RunReply + 6, // 9: ctpd.CTPd.RunUnload:output_type -> ctpd.RunReply + 6, // 10: ctpd.CTPd.RunStart:output_type -> ctpd.RunReply + 6, // 11: ctpd.CTPd.RunStatus:output_type -> ctpd.RunReply + 6, // 12: ctpd.CTPd.RunList:output_type -> ctpd.RunReply + 6, // 13: ctpd.CTPd.RunStop:output_type -> ctpd.RunReply + 6, // 14: ctpd.CTPd.RunConfig:output_type -> ctpd.RunReply + 8, // [8:15] is the sub-list for method output_type + 1, // [1:8] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name diff --git a/core/integration/cts/protos/ctpecs.proto b/core/integration/cts/protos/ctpecs.proto index 28209c79f..c1b7e9a13 100644 --- a/core/integration/cts/protos/ctpecs.proto +++ b/core/integration/cts/protos/ctpecs.proto @@ -1,11 +1,12 @@ syntax = "proto3"; -package cts; +package ctpd; option go_package = "protos;ctpecs"; // ctpd interface for ECS service CTPd { // global run: rpc RunLoad (RunLoadRequest) returns (RunReply) {} + rpc RunUnload (RunStopRequest) returns (RunReply) {} // stdalone and global runs: rpc RunStart (RunStartRequest) returns (RunReply) {} rpc RunStatus (RunStatusRequest) returns (RunReply) {} diff --git a/core/integration/cts/protos/ctpecs_grpc.pb.go b/core/integration/cts/protos/ctpecs_grpc.pb.go index ff45d1c44..3ebdfa98e 100644 --- a/core/integration/cts/protos/ctpecs_grpc.pb.go +++ b/core/integration/cts/protos/ctpecs_grpc.pb.go @@ -20,6 +20,7 @@ const _ = grpc.SupportPackageIsVersion7 type CTPdClient interface { // global run: RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) + RunUnload(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) // stdalone and global runs: RunStart(ctx context.Context, in *RunStartRequest, opts ...grpc.CallOption) (*RunReply, error) RunStatus(ctx context.Context, in *RunStatusRequest, opts ...grpc.CallOption) (*RunReply, error) @@ -38,7 +39,16 @@ func NewCTPdClient(cc grpc.ClientConnInterface) CTPdClient { func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunLoad", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunLoad", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) RunUnload(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunUnload", in, out, opts...) if err != nil { return nil, err } @@ -47,7 +57,7 @@ func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...gr func (c *cTPdClient) RunStart(ctx context.Context, in *RunStartRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunStart", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStart", in, out, opts...) if err != nil { return nil, err } @@ -56,7 +66,7 @@ func (c *cTPdClient) RunStart(ctx context.Context, in *RunStartRequest, opts ... func (c *cTPdClient) RunStatus(ctx context.Context, in *RunStatusRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunStatus", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStatus", in, out, opts...) if err != nil { return nil, err } @@ -65,7 +75,7 @@ func (c *cTPdClient) RunStatus(ctx context.Context, in *RunStatusRequest, opts . func (c *cTPdClient) RunList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunList", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunList", in, out, opts...) if err != nil { return nil, err } @@ -74,7 +84,7 @@ func (c *cTPdClient) RunList(ctx context.Context, in *Empty, opts ...grpc.CallOp func (c *cTPdClient) RunStop(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunStop", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStop", in, out, opts...) if err != nil { return nil, err } @@ -83,7 +93,7 @@ func (c *cTPdClient) RunStop(ctx context.Context, in *RunStopRequest, opts ...gr func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/cts.CTPd/RunConfig", in, out, opts...) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunConfig", in, out, opts...) if err != nil { return nil, err } @@ -96,6 +106,7 @@ func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ... type CTPdServer interface { // global run: RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) + RunUnload(context.Context, *RunStopRequest) (*RunReply, error) // stdalone and global runs: RunStart(context.Context, *RunStartRequest) (*RunReply, error) RunStatus(context.Context, *RunStatusRequest) (*RunReply, error) @@ -111,6 +122,9 @@ type UnimplementedCTPdServer struct { func (UnimplementedCTPdServer) RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RunLoad not implemented") } +func (UnimplementedCTPdServer) RunUnload(context.Context, *RunStopRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunUnload not implemented") +} func (UnimplementedCTPdServer) RunStart(context.Context, *RunStartRequest) (*RunReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RunStart not implemented") } @@ -148,7 +162,7 @@ func _CTPd_RunLoad_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunLoad", + FullMethod: "/ctpd.CTPd/RunLoad", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunLoad(ctx, req.(*RunLoadRequest)) @@ -156,6 +170,24 @@ func _CTPd_RunLoad_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _CTPd_RunUnload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunStopRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunUnload(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ctpd.CTPd/RunUnload", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunUnload(ctx, req.(*RunStopRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _CTPd_RunStart_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RunStartRequest) if err := dec(in); err != nil { @@ -166,7 +198,7 @@ func _CTPd_RunStart_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunStart", + FullMethod: "/ctpd.CTPd/RunStart", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStart(ctx, req.(*RunStartRequest)) @@ -184,7 +216,7 @@ func _CTPd_RunStatus_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunStatus", + FullMethod: "/ctpd.CTPd/RunStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStatus(ctx, req.(*RunStatusRequest)) @@ -202,7 +234,7 @@ func _CTPd_RunList_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunList", + FullMethod: "/ctpd.CTPd/RunList", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunList(ctx, req.(*Empty)) @@ -220,7 +252,7 @@ func _CTPd_RunStop_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunStop", + FullMethod: "/ctpd.CTPd/RunStop", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStop(ctx, req.(*RunStopRequest)) @@ -238,7 +270,7 @@ func _CTPd_RunConfig_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/cts.CTPd/RunConfig", + FullMethod: "/ctpd.CTPd/RunConfig", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunConfig(ctx, req.(*RunStopRequest)) @@ -250,13 +282,17 @@ func _CTPd_RunConfig_Handler(srv interface{}, ctx context.Context, dec func(inte // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var CTPd_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "cts.CTPd", + ServiceName: "ctpd.CTPd", HandlerType: (*CTPdServer)(nil), Methods: []grpc.MethodDesc{ { MethodName: "RunLoad", Handler: _CTPd_RunLoad_Handler, }, + { + MethodName: "RunUnload", + Handler: _CTPd_RunUnload_Handler, + }, { MethodName: "RunStart", Handler: _CTPd_RunStart_Handler, From 5c2f1b7377e8e4931eb2dc607553b1f9220ee1bb Mon Sep 17 00:00:00 2001 From: miltalex Date: Fri, 10 Sep 2021 10:20:46 +0200 Subject: [PATCH 1034/2352] [core] Rename cts to ctp --- Makefile | 2 +- cmd/o2-aliecs-core/main.go | 8 +- core/integration/{cts => ctp}/client.go | 13 +- core/integration/{cts => ctp}/plugin.go | 130 +++++++++--------- .../{cts => ctp}/protos/ctpecs.pb.go | 0 .../{cts => ctp}/protos/ctpecs.proto | 0 .../{cts => ctp}/protos/ctpecs_grpc.pb.go | 0 7 files changed, 77 insertions(+), 76 deletions(-) rename core/integration/{cts => ctp}/client.go (91%) rename core/integration/{cts => ctp}/plugin.go (63%) rename core/integration/{cts => ctp}/protos/ctpecs.pb.go (100%) rename core/integration/{cts => ctp}/protos/ctpecs.proto (100%) rename core/integration/{cts => ctp}/protos/ctpecs_grpc.pb.go (100%) diff --git a/Makefile b/Makefile index 4b3bc00f6..37aea30fe 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/cts +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/ctp SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index b0949456c..e453012b6 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -30,7 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" "github.com/AliceO2Group/Control/core/integration" - "github.com/AliceO2Group/Control/core/integration/cts" + "github.com/AliceO2Group/Control/core/integration/ctp" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/odc" @@ -53,9 +53,9 @@ func init() { "odcEndpoint", odc.NewPlugin) integration.RegisterPlugin( - "cts", - "ctsServiceEndpoint", - cts.NewPlugin) + "ctp", + "ctpServiceEndpoint", + ctp.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, diff --git a/core/integration/cts/client.go b/core/integration/ctp/client.go similarity index 91% rename from core/integration/cts/client.go rename to core/integration/ctp/client.go index f7b43c042..80ff72bb6 100644 --- a/core/integration/cts/client.go +++ b/core/integration/ctp/client.go @@ -22,15 +22,15 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package cts +package ctp import ( "context" "time" "github.com/AliceO2Group/Control/common/logger" - ctpecs "github.com/AliceO2Group/Control/core/integration/cts/protos" - ctpecspb "github.com/AliceO2Group/Control/core/integration/cts/protos" + ctpecs "github.com/AliceO2Group/Control/core/integration/ctp/protos" + ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" @@ -69,7 +69,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) PermitWithoutStream: true, }), } - if !viper.GetBool("ctsServiceUseSystemProxy") { + if !viper.GetBool("ctpServiceUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) } conn, err := grpc.DialContext(cxt, @@ -83,7 +83,6 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) cancel() return nil } - log.Debug("CTS client connected") go func() { connState := connectivity.Idle @@ -101,10 +100,12 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) return } connState = conn.GetState() - log.Debugf("CTS client %s", connState.String()) + log.Debugf("CTP client %s", connState.String()) go notifyFunc(connState) case <- time.After(2 * time.Minute): + if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() + } case <- cxt.Done(): return } diff --git a/core/integration/cts/plugin.go b/core/integration/ctp/plugin.go similarity index 63% rename from core/integration/cts/plugin.go rename to core/integration/ctp/plugin.go index a046096e8..1851b0133 100644 --- a/core/integration/cts/plugin.go +++ b/core/integration/ctp/plugin.go @@ -24,7 +24,7 @@ //go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto -package cts +package ctp import ( "context" @@ -35,20 +35,20 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" - ctpecspb "github.com/AliceO2Group/Control/core/integration/cts/protos" + ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) -const CTS_DIAL_TIMEOUT = 2 * time.Second +const CTP_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - ctsHost string - ctsPort int + ctpHost string + ctpPort int - ctsClient *RpcClient + ctpClient *RpcClient } @@ -64,49 +64,49 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - ctsHost: u.Hostname(), - ctsPort: portNumber, - ctsClient: nil, + ctpHost: u.Hostname(), + ctpPort: portNumber, + ctpClient: nil, } } func (p *Plugin) GetName() string { - return "cts" + return "ctp" } func (p *Plugin) GetPrettyName() string { - return "Central Trigger System" + return "Central Trigger Processor" } func (p *Plugin) GetEndpoint() string { - return viper.GetString("ctsServiceEndpoint") + return viper.GetString("ctpServiceEndpoint") } func (p *Plugin) GetConnectionState() string { - if p == nil || p.ctsClient == nil { + if p == nil || p.ctpClient == nil { return "UNKNOWN" } - return p.ctsClient.conn.GetState().String() + return p.ctpClient.conn.GetState().String() } func (p *Plugin) GetData(environmentIds []uid.ID) string { - if p == nil || p.ctsClient == nil { + if p == nil || p.ctpClient == nil { return "" } return "" } func (p *Plugin) Init(instanceId string) error { - if p.ctsClient == nil { - callTimeout := CTS_DIAL_TIMEOUT + if p.ctpClient == nil { + callTimeout := CTP_DIAL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) - p.ctsClient = NewClient(cxt, cancel, viper.GetString("ctsServiceEndpoint")) - if p.ctsClient == nil { - return fmt.Errorf("failed to connect to CTS service on %s", viper.GetString("ctsServiceEndpoint")) + p.ctpClient = NewClient(cxt, cancel, viper.GetString("ctpServiceEndpoint")) + if p.ctpClient == nil { + return fmt.Errorf("failed to connect to CTP service on %s", viper.GetString("ctpServiceEndpoint")) } } - if p.ctsClient == nil { - return fmt.Errorf("failed to start CTS client on %s", viper.GetString("ctsServiceEndpoint")) + if p.ctpClient == nil { + return fmt.Errorf("failed to start CTP client on %s", viper.GetString("ctpServiceEndpoint")) } return nil } @@ -122,12 +122,12 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing run load request") - parameters, ok := varStack["cts_run_parameters"] + parameters, ok := varStack["ctp_run_parameters"] if !ok { - log.Debug("no CTS config set, using default configuration") + log.Debug("no CTP config set, using default configuration") parameters = "" } - // TODO (malexis): pass consul key to CTS if avail + // TODO (malexis): pass consul key to CTP if avail rn := varStack["run_number"] var runNumber64 int64 @@ -136,36 +136,36 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for Run Load") } - ctsDetectorsParam, ok := varStack["cts_detectors"] + ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" -all required must be ready - log.Debug("empty CTS detectors list provided") - ctsDetectorsParam = "" + log.Debug("empty CTP detectors list provided") + ctpDetectorsParam = "" } in := ctpecspb.RunLoadRequest{ Runn: uint32(runNumber64), - Detectors: ctsDetectorsParam, + Detectors: ctpDetectorsParam, Config: parameters, } - if p.ctsClient == nil { - log.WithError(fmt.Errorf("CTS plugin not initialized")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient == nil { + log.WithError(fmt.Errorf("CTP plugin not initialized")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Load request") return } - if p.ctsClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTS client connection not available")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTP client connection not available")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Load request") return } var response *ctpecspb.RunReply - response, err = p.ctsClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.ctpClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Load request") } if response.Rc != 2 { @@ -176,14 +176,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing CTS run start") + log.Debug("performing CTP run start") - parameters, ok := varStack["cts_run_parameters"] + parameters, ok := varStack["ctp_run_parameters"] if !ok { - log.Debug("no CTS config set, using default configuration") + log.Debug("no CTP config set, using default configuration") parameters = "" } - // TODO (malexis): pass consul key to CTS if avail + // TODO (malexis): pass consul key to CTP if avail rn := varStack["run_number"] var runNumber64 int64 @@ -192,38 +192,38 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for Run Start") } - ctsDetector, ok := varStack["detector"] + ctpDetector, ok := varStack["detector"] if !ok { // "" it is a global run log.Debug("Detector for host is not available, starting global run") - ctsDetector = "" + ctpDetector = "" } in := ctpecspb.RunStartRequest{ Runn: uint32(runNumber64), - Detector: ctsDetector, + Detector: ctpDetector, Config: parameters, } - if p.ctsClient == nil { - log.WithError(fmt.Errorf("CTS plugin not initialized")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient == nil { + log.WithError(fmt.Errorf("CTP plugin not initialized")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Start request") return } - if p.ctsClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTS client connection not available")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTP client connection not available")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Start request") return } var response *ctpecspb.RunReply - response, err = p.ctsClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.ctpClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Start request") } if response.Rc != 0 { @@ -240,39 +240,39 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { var err error runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err).Error("cannot acquire run number for CTS Run Stop") + log.WithError(err).Error("cannot acquire run number for CTP Run Stop") } - ctsDetector, ok := varStack["DetectorForHost"] + ctpDetector, ok := varStack["DetectorForHost"] if !ok { // "" it is a global run log.Debug("Detector for host is not available, starting global run") - ctsDetector = "" + ctpDetector = "" } in := ctpecspb.RunStopRequest{ Runn: uint32(runNumber64), - Detector: ctsDetector, + Detector: ctpDetector, } - if p.ctsClient == nil { - log.WithError(fmt.Errorf("CTS plugin not initialized")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient == nil { + log.WithError(fmt.Errorf("CTP plugin not initialized")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Stop request") return } - if p.ctsClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTS client connection not available")). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + if p.ctpClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTP client connection not available")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Stop request") return } var response *ctpecspb.RunReply - response, err = p.ctsClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.ctpClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctsServiceEndpoint")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Stop request") } if response.Rc == 3 { @@ -287,5 +287,5 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } func (p *Plugin) Destroy() error { - return p.ctsClient.Close() + return p.ctpClient.Close() } diff --git a/core/integration/cts/protos/ctpecs.pb.go b/core/integration/ctp/protos/ctpecs.pb.go similarity index 100% rename from core/integration/cts/protos/ctpecs.pb.go rename to core/integration/ctp/protos/ctpecs.pb.go diff --git a/core/integration/cts/protos/ctpecs.proto b/core/integration/ctp/protos/ctpecs.proto similarity index 100% rename from core/integration/cts/protos/ctpecs.proto rename to core/integration/ctp/protos/ctpecs.proto diff --git a/core/integration/cts/protos/ctpecs_grpc.pb.go b/core/integration/ctp/protos/ctpecs_grpc.pb.go similarity index 100% rename from core/integration/cts/protos/ctpecs_grpc.pb.go rename to core/integration/ctp/protos/ctpecs_grpc.pb.go From 2fe5d85e1dad8954630721f93bf8c5b686cba811 Mon Sep 17 00:00:00 2001 From: miltalex Date: Tue, 14 Sep 2021 18:39:45 +0200 Subject: [PATCH 1035/2352] [core] Add RunUnload and extend logic for the remaining ones --- core/integration/ctp/plugin.go | 160 ++++++++++++++++++++++++++++----- core/integration/plugin.go | 1 - 2 files changed, 139 insertions(+), 22 deletions(-) diff --git a/core/integration/ctp/plugin.go b/core/integration/ctp/plugin.go index 1851b0133..1c7fcd05d 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/ctp/plugin.go @@ -28,9 +28,11 @@ package ctp import ( "context" + "encoding/json" "fmt" "net/url" "strconv" + "strings" "time" "github.com/AliceO2Group/Control/common/utils/uid" @@ -120,9 +122,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) // global runs only stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing run load request") + log.Debug("performing CTP Run load Request") - parameters, ok := varStack["ctp_run_parameters"] + parameters, ok := varStack["ctp_load_parameters"] if !ok { log.Debug("no CTP config set, using default configuration") parameters = "" @@ -143,9 +145,21 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { ctpDetectorsParam = "" } + detectors, err := p.parseDetectors(ctpDetectorsParam) + if err != nil { + return + } + + // standalone run + if len(strings.Split(detectors," ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + // we do not load any run cause it is standalone + log.Debug("not a CTP Global Run") + return + } + in := ctpecspb.RunLoadRequest{ Runn: uint32(runNumber64), - Detectors: ctpDetectorsParam, + Detectors: detectors, Config: parameters, } if p.ctpClient == nil { @@ -168,15 +182,17 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Load request") } - if response.Rc != 2 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - Error("Run Load failed") + if response != nil { + if response.Rc != 0 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Load failed") + } } return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing CTP run start") + log.Debug("performing CTP Run Start") parameters, ok := varStack["ctp_run_parameters"] if !ok { @@ -192,16 +208,27 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for Run Start") } - ctpDetector, ok := varStack["detector"] + ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" it is a global run log.Debug("Detector for host is not available, starting global run") - ctpDetector = "" + ctpDetectorsParam = "" + } + + detectors, err := p.parseDetectors(ctpDetectorsParam) + if err != nil { + return + } + + // if global run then start with empty + if len(strings.Split(detectors," ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + // global run detectors "" + detectors = "" } in := ctpecspb.RunStartRequest{ Runn: uint32(runNumber64), - Detector: ctpDetector, + Detector: detectors, Config: parameters, } @@ -226,15 +253,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Start request") } - if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - Error("Run Start failed") + if response != nil { + if response.Rc != 0 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Start failed") + } } return } stack["RunStop"] = func() (out string) { + log.Debug("performing CTP Run Stop") + rn := varStack["run_number"] var runNumber64 int64 var err error @@ -243,16 +274,27 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err).Error("cannot acquire run number for CTP Run Stop") } - ctpDetector, ok := varStack["DetectorForHost"] + ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" it is a global run - log.Debug("Detector for host is not available, starting global run") - ctpDetector = "" + log.Debug("Detector for host is not available, stoping global run") + ctpDetectorsParam = "" + } + + detectors, err := p.parseDetectors(ctpDetectorsParam) + if err != nil { + return + } + + // if global run then start with empty + if len(strings.Split(detectors," ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + // global run detectors "" + detectors = "" } in := ctpecspb.RunStopRequest{ Runn: uint32(runNumber64), - Detector: ctpDetector, + Detector: detectors, } if p.ctpClient == nil { @@ -275,10 +317,73 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("ctpServiceEndpoint")). Error("failed to perform Run Stop request") } - if response.Rc == 3 { + if response != nil { + if response.Rc != 0 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Stop failed") + } + } + return + } + stack["RunUnload"] = func() (out string) { + log.Debug("performing CTP Run Unload") + + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err).Error("cannot acquire run number for CTP Run Stop") + } + + ctpDetectorsParam, ok := varStack["ctp_detectors"] + if !ok { + ctpDetectorsParam = "" + } + + detectors, err := p.parseDetectors(ctpDetectorsParam) + if err != nil { + return + } + + // if global run then unloa + if len(strings.Split(detectors," ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + return + } + + in := ctpecspb.RunStopRequest{ + Runn: uint32(runNumber64), + // "" when unloading global run + Detector: "", + } + + if p.ctpClient == nil { + log.WithError(fmt.Errorf("CTP plugin not initialized")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + Error("failed to perform Run Unload request") + return + } + if p.ctpClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("CTP client connection not available")). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + Error("failed to perform Run Unload request") + return + } + + var response *ctpecspb.RunReply + response, err = p.ctpClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + Error("failed to perform Run Unload request") + } + if response != nil { + if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). - Error("Run Stop failed") + Error("Run Unload failed") + } } return } @@ -286,6 +391,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } +func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err error) { + detectorsSlice := make([]string, 0) + bytes := []byte(ctsDetectorsParam) + err = json.Unmarshal(bytes, &detectorsSlice) + if err != nil { + log.WithError(err).Error("error processing CTP detectors list") + return + } + + detectors = strings.ToLower(strings.Join(detectorsSlice, " ")) + return +} + func (p *Plugin) Destroy() error { return p.ctpClient.Close() } diff --git a/core/integration/plugin.go b/core/integration/plugin.go index defade5e6..6260965d3 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -141,4 +141,3 @@ func PluginsInstance() Plugins { }) return instance } - From d7cb32a0b97989756ba7fd57bc3c4a65ea064be0 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 7 Oct 2021 17:50:27 +0200 Subject: [PATCH 1036/2352] [core] CTP run start read config from consul --- core/integration/ctp/plugin.go | 67 +++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 30 deletions(-) diff --git a/core/integration/ctp/plugin.go b/core/integration/ctp/plugin.go index 1c7fcd05d..cfde7576a 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/ctp/plugin.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" @@ -47,11 +48,10 @@ import ( const CTP_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - ctpHost string - ctpPort int - - ctpClient *RpcClient + ctpHost string + ctpPort int + ctpClient *RpcClient } func NewPlugin(endpoint string) integration.Plugin { @@ -121,12 +121,12 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) // global runs only - stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing + stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing CTP Run load Request") parameters, ok := varStack["ctp_load_parameters"] if !ok { - log.Debug("no CTP config set, using default configuration") + log.Debug("no CTP Global config set") parameters = "" } // TODO (malexis): pass consul key to CTP if avail @@ -151,16 +151,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } // standalone run - if len(strings.Split(detectors," ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { // we do not load any run cause it is standalone - log.Debug("not a CTP Global Run") - return + log.Debug("not a CTP Global Run, continuing with CTP Run Start") + return } in := ctpecspb.RunLoadRequest{ - Runn: uint32(runNumber64), + Runn: uint32(runNumber64), Detectors: detectors, - Config: parameters, + Config: parameters, } if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). @@ -191,15 +191,21 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } - stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing + stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing CTP Run Start") - parameters, ok := varStack["ctp_run_parameters"] + parameters, ok := varStack["ctp_runtime_config"] if !ok { log.Debug("no CTP config set, using default configuration") parameters = "" } - // TODO (malexis): pass consul key to CTP if avail + ctpConfig, ctpErr := the.ConfSvc().GetRuntimeEntry("ctp", parameters) + if ctpErr != nil { + log.WithError(ctpErr). + WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + Error("failed to load config") + return + } rn := varStack["run_number"] var runNumber64 int64 @@ -220,16 +226,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } - // if global run then start with empty - if len(strings.Split(detectors," ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + // if global run then start with empty string in detectors + if len(strings.Split(detectors, " ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { // global run detectors "" detectors = "" } in := ctpecspb.RunStartRequest{ - Runn: uint32(runNumber64), + Runn: uint32(runNumber64), Detector: detectors, - Config: parameters, + Config: ctpConfig, } if p.ctpClient == nil { @@ -287,13 +293,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } // if global run then start with empty - if len(strings.Split(detectors," ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + if len(strings.Split(detectors, " ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { // global run detectors "" detectors = "" } in := ctpecspb.RunStopRequest{ - Runn: uint32(runNumber64), + Runn: uint32(runNumber64), Detector: detectors, } @@ -318,7 +324,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform Run Stop request") } if response != nil { - if response.Rc != 0 { + if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). Error("Run Stop failed") @@ -347,15 +353,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } - // if global run then unloa - if len(strings.Split(detectors," ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + // if global run then unload + if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + log.Debug("not a CTP Global Run, skipping CTP Run Unload") return } in := ctpecspb.RunStopRequest{ - Runn: uint32(runNumber64), + Runn: uint32(runNumber64), // "" when unloading global run - Detector: "", + Detector: "", } if p.ctpClient == nil { @@ -379,10 +386,10 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("failed to perform Run Unload request") } if response != nil { - if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - Error("Run Unload failed") + if response.Rc != 0 { + log.WithField("response rc", response.Rc). + WithField("Message", response.Msg). + Error("Run Unload failed") } } return @@ -401,7 +408,7 @@ func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err } detectors = strings.ToLower(strings.Join(detectorsSlice, " ")) - return + return } func (p *Plugin) Destroy() error { From 30a2dc2e20dc3484a74aa5ffb8a376d2f23fd0e0 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Thu, 7 Oct 2021 18:43:44 +0200 Subject: [PATCH 1037/2352] [core] Add GetRuntimeConfig func in templates --- configuration/template/fields.go | 5 +++-- configuration/template/stack.go | 24 ++++++++++++++++-------- core/integration/ctp/plugin.go | 14 +++----------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 0a05e83c6..30f473b3e 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -55,6 +55,7 @@ type ConfigurationService interface { GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) + GetRuntimeEntry(component string, key string) (string, error) } func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { @@ -206,8 +207,8 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va environment[k] = v } - CRUCardconfigAccessFuncs := MakeConfigAccessFuncsCRUCard(confSvc, varStack) - for k, v := range CRUCardconfigAccessFuncs { + multiVarconfigAccessFuncs := MakeConfigAccessFuncsMultiVar(confSvc, varStack) + for k, v := range multiVarconfigAccessFuncs { environment[k] = v } diff --git a/configuration/template/stack.go b/configuration/template/stack.go index d7a820d4c..d8cb1c255 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -42,14 +42,13 @@ import ( type GetConfigFunc func(string) string type ConfigAccessFuncs map[string]GetConfigFunc type ToPtreeFunc func(string, string) string -type CRUCardConfigAccessFuncs map[string]GetCRUCardConfigFunc -type GetCRUCardConfigFunc func(string, string) string - +type MultiVarConfigAccessFuncs map[string]GetMultiVarConfigFunc +type GetMultiVarConfigFunc func(string, string) string func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]string) ConfigAccessFuncs { return ConfigAccessFuncs{ "GetConfigLegacy": func(path string) string { - defer utils.TimeTrack(time.Now(),"GetConfigLegacy", log.WithPrefix("template")) + defer utils.TimeTrack(time.Now(), "GetConfigLegacy", log.WithPrefix("template")) query, err := componentcfg.NewQuery(path) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) @@ -128,20 +127,29 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } } -func MakeConfigAccessFuncsCRUCard(confSvc ConfigurationService, varStack map[string]string) CRUCardConfigAccessFuncs { - return CRUCardConfigAccessFuncs{ +func MakeConfigAccessFuncsMultiVar(confSvc ConfigurationService, varStack map[string]string) MultiVarConfigAccessFuncs { + return MultiVarConfigAccessFuncs{ "EndpointsForCRUCard": func(hostname, cardSerial string) string { - defer utils.TimeTrack(time.Now(),"EndpointsForCRUCard", log.WithPrefix("template")) + defer utils.TimeTrack(time.Now(), "EndpointsForCRUCard", log.WithPrefix("template")) payload, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } return payload }, + "GetRuntimeConfig": func(component string, key string) string { + defer utils.TimeTrack(time.Now(), "GetRuntimeConfig", log.WithPrefix("template")) + + payload, err := confSvc.GetRuntimeEntry(component, key) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + return payload + }, } } - func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload diff --git a/core/integration/ctp/plugin.go b/core/integration/ctp/plugin.go index cfde7576a..1287ebac1 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/ctp/plugin.go @@ -38,7 +38,6 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" - "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" @@ -194,17 +193,10 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing CTP Run Start") - parameters, ok := varStack["ctp_runtime_config"] + runtimeConfig, ok := varStack["ctp_runtime_config"] if !ok { log.Debug("no CTP config set, using default configuration") - parameters = "" - } - ctpConfig, ctpErr := the.ConfSvc().GetRuntimeEntry("ctp", parameters) - if ctpErr != nil { - log.WithError(ctpErr). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). - Error("failed to load config") - return + runtimeConfig = "" } rn := varStack["run_number"] @@ -235,7 +227,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { in := ctpecspb.RunStartRequest{ Runn: uint32(runNumber64), Detector: detectors, - Config: ctpConfig, + Config: runtimeConfig, } if p.ctpClient == nil { From 710bf863839adf153c24f9d95cf14cc4b1c8bef9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Oct 2021 13:05:38 +0200 Subject: [PATCH 1038/2352] [build] Bump to v0.26.81 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ec37d39fb..72fc9b7a3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 80 +VERSION_PATCH := 81 From 1200e8a2dd651cceb0c95f785ad0893ac3866f81 Mon Sep 17 00:00:00 2001 From: Miltiadis Alexis Date: Fri, 8 Oct 2021 17:47:10 +0200 Subject: [PATCH 1039/2352] [core] Pass detectors to Bookkeeping API --- core/bookkeeping/api.go | 10 +++++----- core/environment/transition_startactivity.go | 13 ++++++++----- go.mod | 4 ++-- go.sum | 4 ++++ 4 files changed, 19 insertions(+), 12 deletions(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 3114c8e11..0ae296950 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -52,20 +52,20 @@ var ( func Instance() *BookkeepingWrapper { once.Do(func() { - apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) + apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) if err == nil { - apiUrl.Path = path.Join( apiUrl.Path + "api") + apiUrl.Path = path.Join(apiUrl.Path + "api") clientAPI.InitializeApi(apiUrl.String(), viper.GetString("bookkeepingToken")) } else { log.WithField("error", err.Error()). - Error("unable to parse the Bookkeeping base URL") + Error("unable to parse the Bookkeeping base URL") clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) } }) return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string) { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -79,7 +79,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology) + clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) } func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 38328aeb3..845ce17a3 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -28,6 +28,7 @@ import ( "errors" "fmt" "strconv" + "strings" "time" "github.com/AliceO2Group/Control/common/event" @@ -66,11 +67,13 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } flps := env.GetFLPs() - dd_enabled, _ := strconv.ParseBool(env.GetKV("","dd_enabled")) - dcs_enabled, _ := strconv.ParseBool(env.GetKV("","dcs_enabled")) - epn_enabled, _ := strconv.ParseBool(env.GetKV("","epn_enabled")) - odc_topology := env.GetKV("","odc_topology") - the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology) + dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) + dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) + epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) + odc_topology := env.GetKV("", "odc_topology") + // GetString of active detectors and pass it to the BK API + detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) } diff --git a/go.mod b/go.mod index e64d78564..6c22f26e9 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.7 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82 + github.com/AliceO2Group/Bookkeeping v0.17.11 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect diff --git a/go.sum b/go.sum index b67003f6c..32c501b6f 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,8 @@ github.com/AliceO2Group/Bookkeeping v0.17.6 h1:O6D3wr5+twn0JQHiSz5+4TWdhNmWFYqxx github.com/AliceO2Group/Bookkeeping v0.17.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.7 h1:22Mb6Hdp9tZ3z8QeAjm81S4HiLaNLBVZ5Mn3TWRSQqI= github.com/AliceO2Group/Bookkeeping v0.17.7/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.11 h1:Ktmua360dZEaLSbD4z1pfXVGnVa7x6b8hKsog+PLH50= +github.com/AliceO2Group/Bookkeeping v0.17.11/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= @@ -99,6 +101,8 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674 github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82 h1:2qYbJeWSSpG5cr7usLewzNaC3f7czW1of4uoHLoeXyY= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18 h1:f20KwRKWuJgZtXDrTvKUreQLACfDeqmpwLi/xD45b3g= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From e15ac8dbbb5f89e458aeb5dc8e38a01a298b9500 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Oct 2021 17:50:16 +0200 Subject: [PATCH 1040/2352] [build] Bump to v0.26.82 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 72fc9b7a3..72af372b1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 26 -VERSION_PATCH := 81 +VERSION_PATCH := 82 From d12aa098f21c6f9d95025cfe1967f0e124aca7e4 Mon Sep 17 00:00:00 2001 From: miltalex Date: Wed, 13 Oct 2021 13:45:49 +0200 Subject: [PATCH 1041/2352] [core] CTP get global config --- core/integration/ctp/plugin.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/core/integration/ctp/plugin.go b/core/integration/ctp/plugin.go index 1287ebac1..b00677c17 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/ctp/plugin.go @@ -123,10 +123,11 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.Debug("performing CTP Run load Request") - parameters, ok := varStack["ctp_load_parameters"] + globalConfig, ok := varStack["ctp_global_config"] + log.WithField("gloablConfig",globalConfig).Debug("not a CTP Global Run, continuing with CTP Run Start") if !ok { log.Debug("no CTP Global config set") - parameters = "" + globalConfig = "" } // TODO (malexis): pass consul key to CTP if avail @@ -159,7 +160,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { in := ctpecspb.RunLoadRequest{ Runn: uint32(runNumber64), Detectors: detectors, - Config: parameters, + Config: globalConfig, } if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). From 7934208928cba64b845aba4230cfdd7f03c387da Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Oct 2021 13:29:26 +0200 Subject: [PATCH 1042/2352] [core] Pass any var ddsched_ to DD scheduler as param --- core/integration/ddsched/plugin.go | 12 ++ core/integration/ddsched/protos/ddsched.pb.go | 160 ++++++++++-------- core/integration/ddsched/protos/ddsched.proto | 3 + 3 files changed, 106 insertions(+), 69 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index e06624d76..bec3e8095 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -33,6 +33,7 @@ import ( "fmt" "net/url" "strconv" + "strings" "time" "github.com/AliceO2Group/Control/common/utils/uid" @@ -199,6 +200,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } }) + partitionParams := make(map[string]string) + + // FIXME: this only copies over vars prefixed with "ddsched_" + // Figure out a better way! + for k, v := range varStack { + if strings.HasPrefix(k, "ddsched_") && k != "ddsched_enabled" { + partitionParams[strings.TrimPrefix(k, "ddsched_")] = v + } + } + in := ddpb.PartitionInitRequest{ PartitionInfo: &ddpb.PartitionInfo{ EnvironmentId: envId, @@ -206,6 +217,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { }, StfbHostIdMap: p.stfbHostIdMap, StfsHostIdMap: p.stfsHostIdMap, + PartitionParams: partitionParams, } if p.ddSchedClient == nil { log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 7f4f8f352..135decb8d 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -217,6 +217,8 @@ type PartitionInitRequest struct { // Mapping between StfBuilder::discovery-id parameter and its FLP host name (must resolve to IB IP), for all // StfBuilder processes in the partition. StfsHostIdMap map[string]string `protobuf:"bytes,3,rep,name=stfs_host_id_map,json=stfsHostIdMap,proto3" json:"stfs_host_id_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // [optional] parameters passed from AliECS to TfScheduler + PartitionParams map[string]string `protobuf:"bytes,4,rep,name=partition_params,json=partitionParams,proto3" json:"partition_params,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *PartitionInitRequest) Reset() { @@ -272,6 +274,13 @@ func (x *PartitionInitRequest) GetStfsHostIdMap() map[string]string { return nil } +func (x *PartitionInitRequest) GetPartitionParams() map[string]string { + if x != nil { + return x.PartitionParams + } + return nil +} + // Request for partition to be terminated. // This operation will terminate all connections between EPN and FLP, and remove the partition from DD control-plane. // Lifetime of individual DD components is managed by the respective FairMQ controller. @@ -342,7 +351,7 @@ var file_protos_ddsched_proto_rawDesc = []byte{ 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xcb, 0x03, + 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x82, 0x05, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, @@ -363,61 +372,72 @@ var file_protos_ddsched_proto_rawDesc = []byte{ 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x66, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x73, 0x74, 0x66, 0x73, 0x48, 0x6f, - 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x74, 0x66, 0x62, 0x48, - 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x74, 0x66, - 0x73, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x69, 0x0a, 0x14, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0xd3, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x47, 0x4e, - 0x4f, 0x52, 0x45, 0x5f, 0x5f, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x13, - 0x0a, 0x0f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x04, 0x12, 0x18, 0x0a, - 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, - 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x07, 0x32, 0x81, 0x03, 0x0a, - 0x17, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x7a, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, - 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, + 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x12, 0x71, 0x0a, 0x10, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x46, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x40, 0x0a, 0x12, 0x53, 0x74, + 0x66, 0x62, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, + 0x53, 0x74, 0x66, 0x73, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x64, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x42, + 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x69, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x12, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, - 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6f, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, - 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0d, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x2a, 0xd3, 0x01, + 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x47, 0x4e, 0x4f, 0x52, 0x45, 0x5f, 0x5f, 0x10, 0x00, 0x12, 0x15, + 0x0a, 0x11, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x1d, 0x0a, 0x19, 0x50, 0x41, + 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x50, 0x41, 0x52, + 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x49, + 0x4e, 0x47, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x44, 0x10, 0x05, 0x12, 0x19, + 0x0a, 0x15, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x52, 0x4d, + 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x50, 0x41, 0x52, + 0x54, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, + 0x44, 0x10, 0x07, 0x32, 0x81, 0x03, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x7a, 0x0a, 0x13, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, + 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x12, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x12, 0x31, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, + 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, + 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x44, + 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -433,7 +453,7 @@ func file_protos_ddsched_proto_rawDescGZIP() []byte { } var file_protos_ddsched_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_ddsched_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_ddsched_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_protos_ddsched_proto_goTypes = []interface{}{ (PartitionState)(0), // 0: o2.DataDistribution.Control.PartitionState (*PartitionInfo)(nil), // 1: o2.DataDistribution.Control.PartitionInfo @@ -442,24 +462,26 @@ var file_protos_ddsched_proto_goTypes = []interface{}{ (*PartitionTermRequest)(nil), // 4: o2.DataDistribution.Control.PartitionTermRequest nil, // 5: o2.DataDistribution.Control.PartitionInitRequest.StfbHostIdMapEntry nil, // 6: o2.DataDistribution.Control.PartitionInitRequest.StfsHostIdMapEntry + nil, // 7: o2.DataDistribution.Control.PartitionInitRequest.PartitionParamsEntry } var file_protos_ddsched_proto_depIdxs = []int32{ 0, // 0: o2.DataDistribution.Control.PartitionResponse.partition_state:type_name -> o2.DataDistribution.Control.PartitionState 1, // 1: o2.DataDistribution.Control.PartitionInitRequest.partition_info:type_name -> o2.DataDistribution.Control.PartitionInfo 5, // 2: o2.DataDistribution.Control.PartitionInitRequest.stfb_host_id_map:type_name -> o2.DataDistribution.Control.PartitionInitRequest.StfbHostIdMapEntry 6, // 3: o2.DataDistribution.Control.PartitionInitRequest.stfs_host_id_map:type_name -> o2.DataDistribution.Control.PartitionInitRequest.StfsHostIdMapEntry - 1, // 4: o2.DataDistribution.Control.PartitionTermRequest.partition_info:type_name -> o2.DataDistribution.Control.PartitionInfo - 3, // 5: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:input_type -> o2.DataDistribution.Control.PartitionInitRequest - 4, // 6: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:input_type -> o2.DataDistribution.Control.PartitionTermRequest - 1, // 7: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:input_type -> o2.DataDistribution.Control.PartitionInfo - 2, // 8: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:output_type -> o2.DataDistribution.Control.PartitionResponse - 2, // 9: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:output_type -> o2.DataDistribution.Control.PartitionResponse - 2, // 10: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:output_type -> o2.DataDistribution.Control.PartitionResponse - 8, // [8:11] is the sub-list for method output_type - 5, // [5:8] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 7, // 4: o2.DataDistribution.Control.PartitionInitRequest.partition_params:type_name -> o2.DataDistribution.Control.PartitionInitRequest.PartitionParamsEntry + 1, // 5: o2.DataDistribution.Control.PartitionTermRequest.partition_info:type_name -> o2.DataDistribution.Control.PartitionInfo + 3, // 6: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:input_type -> o2.DataDistribution.Control.PartitionInitRequest + 4, // 7: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:input_type -> o2.DataDistribution.Control.PartitionTermRequest + 1, // 8: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:input_type -> o2.DataDistribution.Control.PartitionInfo + 2, // 9: o2.DataDistribution.Control.DataDistributionControl.PartitionInitialize:output_type -> o2.DataDistribution.Control.PartitionResponse + 2, // 10: o2.DataDistribution.Control.DataDistributionControl.PartitionTerminate:output_type -> o2.DataDistribution.Control.PartitionResponse + 2, // 11: o2.DataDistribution.Control.DataDistributionControl.PartitionStatus:output_type -> o2.DataDistribution.Control.PartitionResponse + 9, // [9:12] is the sub-list for method output_type + 6, // [6:9] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_protos_ddsched_proto_init() } @@ -523,7 +545,7 @@ func file_protos_ddsched_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_ddsched_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto index f5d82dc04..50e98c8d2 100644 --- a/core/integration/ddsched/protos/ddsched.proto +++ b/core/integration/ddsched/protos/ddsched.proto @@ -80,6 +80,9 @@ message PartitionInitRequest { // 4. discovery-ids are used for debugging purposes. It would be helpful if the values assigned by AliECS // provided human-readable information. E.g. an id for the first StfSender on flp009 could be: // "stfs-flp009#0-". + + // [optional] parameters passed from AliECS to TfScheduler + map partition_params = 4; } // Request for partition to be terminated. From 7625ea29037f102f26b2f77288b8adf8a067d0aa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Oct 2021 13:31:03 +0200 Subject: [PATCH 1043/2352] [core] Pass any var odc_ to ODC except known named params --- core/integration/odc/plugin.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2a1001382..c0f09c40f 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -186,7 +186,11 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { // FIXME: this only copies over vars prefixed with "odc_" // Figure out a better way! for k, v := range varStack { - if strings.HasPrefix(k, "odc_") { + if strings.HasPrefix(k, "odc_") && + k != "odc_enabled" && + k != "odc_resources" && + k != "odc_plugin" && + k != "odc_topology" { arguments[strings.TrimPrefix(k, "odc_")] = v } } From 0b3af28f26ff6ddd8f51fac64feecbd44bd0302a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Oct 2021 16:44:14 +0200 Subject: [PATCH 1044/2352] [core] Update ODC protofile --- core/integration/odc/protos/odc.pb.go | 1054 +++++++++++++++----- core/integration/odc/protos/odc.proto | 71 +- core/integration/odc/protos/odc_grpc.pb.go | 38 + 3 files changed, 917 insertions(+), 246 deletions(-) diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 32ba25a62..a05c09a9e 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -75,6 +75,56 @@ func (ReplyStatus) EnumDescriptor() ([]byte, []int) { return file_protos_odc_proto_rawDescGZIP(), []int{0} } +// Session status as defined by DDS +type SessionStatus int32 + +const ( + SessionStatus_UNKNOWN_ SessionStatus = 0 // Status is unknown + SessionStatus_RUNNING SessionStatus = 1 // DDS session is running + SessionStatus_STOPPED SessionStatus = 2 // DDS session is stopped +) + +// Enum value maps for SessionStatus. +var ( + SessionStatus_name = map[int32]string{ + 0: "UNKNOWN_", + 1: "RUNNING", + 2: "STOPPED", + } + SessionStatus_value = map[string]int32{ + "UNKNOWN_": 0, + "RUNNING": 1, + "STOPPED": 2, + } +) + +func (x SessionStatus) Enum() *SessionStatus { + p := new(SessionStatus) + *p = x + return p +} + +func (x SessionStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SessionStatus) Descriptor() protoreflect.EnumDescriptor { + return file_protos_odc_proto_enumTypes[1].Descriptor() +} + +func (SessionStatus) Type() protoreflect.EnumType { + return &file_protos_odc_proto_enumTypes[1] +} + +func (x SessionStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SessionStatus.Descriptor instead. +func (SessionStatus) EnumDescriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{1} +} + // General error type Error struct { state protoimpl.MessageState @@ -142,6 +192,7 @@ type GeneralReply struct { Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,8,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS (optional) Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. } @@ -213,6 +264,13 @@ func (x *GeneralReply) GetPartitionid() string { return "" } +func (x *GeneralReply) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + func (x *GeneralReply) GetSessionid() string { if x != nil { return x.Sessionid @@ -300,6 +358,8 @@ type StateRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,4,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. Detailed bool `protobuf:"varint,3,opt,name=detailed,proto3" json:"detailed,omitempty"` // If true then a list of affected devices is populated in the reply. } @@ -343,6 +403,20 @@ func (x *StateRequest) GetPartitionid() string { return "" } +func (x *StateRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *StateRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *StateRequest) GetPath() string { if x != nil { return x.Path @@ -413,6 +487,174 @@ func (x *StateReply) GetDevices() []*Device { return nil } +// Status of each partition +type PartitionStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,5,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. + Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID + Status SessionStatus `protobuf:"varint,3,opt,name=status,proto3,enum=odc.SessionStatus" json:"status,omitempty"` // DDS session status + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. +} + +func (x *PartitionStatus) Reset() { + *x = PartitionStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PartitionStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PartitionStatus) ProtoMessage() {} + +func (x *PartitionStatus) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PartitionStatus.ProtoReflect.Descriptor instead. +func (*PartitionStatus) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{5} +} + +func (x *PartitionStatus) GetPartitionid() string { + if x != nil { + return x.Partitionid + } + return "" +} + +func (x *PartitionStatus) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *PartitionStatus) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + +func (x *PartitionStatus) GetSessionid() string { + if x != nil { + return x.Sessionid + } + return "" +} + +func (x *PartitionStatus) GetStatus() SessionStatus { + if x != nil { + return x.Status + } + return SessionStatus_UNKNOWN_ +} + +func (x *PartitionStatus) GetState() string { + if x != nil { + return x.State + } + return "" +} + +// ODC status reply +type StatusReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Msg string `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"` // Detailed reply message + Status ReplyStatus `protobuf:"varint,2,opt,name=status,proto3,enum=odc.ReplyStatus" json:"status,omitempty"` // Request status code (UNKNOWN, SUCCESS, ERROR) + Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty + Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms + Partitions []*PartitionStatus `protobuf:"bytes,5,rep,name=partitions,proto3" json:"partitions,omitempty"` // Status of each partition +} + +func (x *StatusReply) Reset() { + *x = StatusReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusReply) ProtoMessage() {} + +func (x *StatusReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. +func (*StatusReply) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{6} +} + +func (x *StatusReply) GetMsg() string { + if x != nil { + return x.Msg + } + return "" +} + +func (x *StatusReply) GetStatus() ReplyStatus { + if x != nil { + return x.Status + } + return ReplyStatus_UNKNOWN +} + +func (x *StatusReply) GetError() *Error { + if x != nil { + return x.Error + } + return nil +} + +func (x *StatusReply) GetExectime() int32 { + if x != nil { + return x.Exectime + } + return 0 +} + +func (x *StatusReply) GetPartitions() []*PartitionStatus { + if x != nil { + return x.Partitions + } + return nil +} + // Initialize request type InitializeRequest struct { state protoimpl.MessageState @@ -420,13 +662,15 @@ type InitializeRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,3,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,4,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. Sessionid string `protobuf:"bytes,2,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. } func (x *InitializeRequest) Reset() { *x = InitializeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[5] + mi := &file_protos_odc_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -439,7 +683,7 @@ func (x *InitializeRequest) String() string { func (*InitializeRequest) ProtoMessage() {} func (x *InitializeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[5] + mi := &file_protos_odc_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -452,7 +696,7 @@ func (x *InitializeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. func (*InitializeRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{5} + return file_protos_odc_proto_rawDescGZIP(), []int{7} } func (x *InitializeRequest) GetPartitionid() string { @@ -462,6 +706,20 @@ func (x *InitializeRequest) GetPartitionid() string { return "" } +func (x *InitializeRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *InitializeRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *InitializeRequest) GetSessionid() string { if x != nil { return x.Sessionid @@ -476,6 +734,8 @@ type SubmitRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,4,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. Plugin string `protobuf:"bytes,2,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server Resources string `protobuf:"bytes,3,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } @@ -483,7 +743,7 @@ type SubmitRequest struct { func (x *SubmitRequest) Reset() { *x = SubmitRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[6] + mi := &file_protos_odc_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -496,7 +756,7 @@ func (x *SubmitRequest) String() string { func (*SubmitRequest) ProtoMessage() {} func (x *SubmitRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[6] + mi := &file_protos_odc_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -509,7 +769,7 @@ func (x *SubmitRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitRequest.ProtoReflect.Descriptor instead. func (*SubmitRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{6} + return file_protos_odc_proto_rawDescGZIP(), []int{8} } func (x *SubmitRequest) GetPartitionid() string { @@ -519,6 +779,20 @@ func (x *SubmitRequest) GetPartitionid() string { return "" } +func (x *SubmitRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *SubmitRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *SubmitRequest) GetPlugin() string { if x != nil { return x.Plugin @@ -540,13 +814,18 @@ type ActivateRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file + Runnr uint64 `protobuf:"varint,5,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to the XML DDS topology file + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` // Content of the XML DDS topology + Script string `protobuf:"bytes,4,opt,name=script,proto3" json:"script,omitempty"` // Shell commands to be executed by ODC in order to generate content of the XML DDS topology } func (x *ActivateRequest) Reset() { *x = ActivateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[7] + mi := &file_protos_odc_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -559,7 +838,7 @@ func (x *ActivateRequest) String() string { func (*ActivateRequest) ProtoMessage() {} func (x *ActivateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[7] + mi := &file_protos_odc_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -572,7 +851,7 @@ func (x *ActivateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivateRequest.ProtoReflect.Descriptor instead. func (*ActivateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{7} + return file_protos_odc_proto_rawDescGZIP(), []int{9} } func (x *ActivateRequest) GetPartitionid() string { @@ -582,6 +861,20 @@ func (x *ActivateRequest) GetPartitionid() string { return "" } +func (x *ActivateRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *ActivateRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *ActivateRequest) GetTopology() string { if x != nil { return x.Topology @@ -589,6 +882,20 @@ func (x *ActivateRequest) GetTopology() string { return "" } +func (x *ActivateRequest) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *ActivateRequest) GetScript() string { + if x != nil { + return x.Script + } + return "" +} + // Run request type RunRequest struct { state protoimpl.MessageState @@ -596,15 +903,20 @@ type RunRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file - Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server - Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description + Runnr uint64 `protobuf:"varint,7,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,8,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to the XML DDS topology file + Content string `protobuf:"bytes,5,opt,name=content,proto3" json:"content,omitempty"` // Content of the XML DDS topology + Script string `protobuf:"bytes,6,opt,name=script,proto3" json:"script,omitempty"` // Shell commands to be executed by ODC in order to generate content of the XML DDS topology + Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description } func (x *RunRequest) Reset() { *x = RunRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[8] + mi := &file_protos_odc_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -617,7 +929,7 @@ func (x *RunRequest) String() string { func (*RunRequest) ProtoMessage() {} func (x *RunRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[8] + mi := &file_protos_odc_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -630,7 +942,7 @@ func (x *RunRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunRequest.ProtoReflect.Descriptor instead. func (*RunRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{8} + return file_protos_odc_proto_rawDescGZIP(), []int{10} } func (x *RunRequest) GetPartitionid() string { @@ -640,6 +952,20 @@ func (x *RunRequest) GetPartitionid() string { return "" } +func (x *RunRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *RunRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *RunRequest) GetTopology() string { if x != nil { return x.Topology @@ -647,6 +973,20 @@ func (x *RunRequest) GetTopology() string { return "" } +func (x *RunRequest) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *RunRequest) GetScript() string { + if x != nil { + return x.Script + } + return "" +} + func (x *RunRequest) GetPlugin() string { if x != nil { return x.Plugin @@ -668,13 +1008,18 @@ type UpdateRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to a DDS topology file + Runnr uint64 `protobuf:"varint,5,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,6,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to the XML DDS topology file + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` // Content of the XML DDS topology + Script string `protobuf:"bytes,4,opt,name=script,proto3" json:"script,omitempty"` // Shell commands to be executed by ODC in order to generate content of the XML DDS topology } func (x *UpdateRequest) Reset() { *x = UpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[9] + mi := &file_protos_odc_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -687,7 +1032,7 @@ func (x *UpdateRequest) String() string { func (*UpdateRequest) ProtoMessage() {} func (x *UpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[9] + mi := &file_protos_odc_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -700,7 +1045,7 @@ func (x *UpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. func (*UpdateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{9} + return file_protos_odc_proto_rawDescGZIP(), []int{11} } func (x *UpdateRequest) GetPartitionid() string { @@ -710,6 +1055,20 @@ func (x *UpdateRequest) GetPartitionid() string { return "" } +func (x *UpdateRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *UpdateRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *UpdateRequest) GetTopology() string { if x != nil { return x.Topology @@ -717,6 +1076,20 @@ func (x *UpdateRequest) GetTopology() string { return "" } +func (x *UpdateRequest) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *UpdateRequest) GetScript() string { + if x != nil { + return x.Script + } + return "" +} + // Shutdown request type ShutdownRequest struct { state protoimpl.MessageState @@ -724,12 +1097,14 @@ type ShutdownRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,2,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,3,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. } func (x *ShutdownRequest) Reset() { *x = ShutdownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[10] + mi := &file_protos_odc_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -742,7 +1117,7 @@ func (x *ShutdownRequest) String() string { func (*ShutdownRequest) ProtoMessage() {} func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[10] + mi := &file_protos_odc_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -755,7 +1130,7 @@ func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShutdownRequest.ProtoReflect.Descriptor instead. func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{10} + return file_protos_odc_proto_rawDescGZIP(), []int{12} } func (x *ShutdownRequest) GetPartitionid() string { @@ -765,6 +1140,20 @@ func (x *ShutdownRequest) GetPartitionid() string { return "" } +func (x *ShutdownRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *ShutdownRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + // Key-Value property type Property struct { state protoimpl.MessageState @@ -778,7 +1167,7 @@ type Property struct { func (x *Property) Reset() { *x = Property{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[11] + mi := &file_protos_odc_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -791,7 +1180,7 @@ func (x *Property) String() string { func (*Property) ProtoMessage() {} func (x *Property) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[11] + mi := &file_protos_odc_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -804,7 +1193,7 @@ func (x *Property) ProtoReflect() protoreflect.Message { // Deprecated: Use Property.ProtoReflect.Descriptor instead. func (*Property) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{11} + return file_protos_odc_proto_rawDescGZIP(), []int{13} } func (x *Property) GetKey() string { @@ -828,6 +1217,8 @@ type SetPropertiesRequest struct { unknownFields protoimpl.UnknownFields Partitionid string `protobuf:"bytes,1,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS + Runnr uint64 `protobuf:"varint,4,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS + Timeout uint32 `protobuf:"varint,5,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` // Task path in the DDS topology. Can be a regular expression. Properties []*Property `protobuf:"bytes,3,rep,name=properties,proto3" json:"properties,omitempty"` // List of properties to be set } @@ -835,7 +1226,7 @@ type SetPropertiesRequest struct { func (x *SetPropertiesRequest) Reset() { *x = SetPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[12] + mi := &file_protos_odc_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -848,7 +1239,7 @@ func (x *SetPropertiesRequest) String() string { func (*SetPropertiesRequest) ProtoMessage() {} func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[12] + mi := &file_protos_odc_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -861,7 +1252,7 @@ func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{12} + return file_protos_odc_proto_rawDescGZIP(), []int{14} } func (x *SetPropertiesRequest) GetPartitionid() string { @@ -871,6 +1262,20 @@ func (x *SetPropertiesRequest) GetPartitionid() string { return "" } +func (x *SetPropertiesRequest) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *SetPropertiesRequest) GetTimeout() uint32 { + if x != nil { + return x.Timeout + } + return 0 +} + func (x *SetPropertiesRequest) GetPath() string { if x != nil { return x.Path @@ -897,7 +1302,7 @@ type ConfigureRequest struct { func (x *ConfigureRequest) Reset() { *x = ConfigureRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[13] + mi := &file_protos_odc_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -910,7 +1315,7 @@ func (x *ConfigureRequest) String() string { func (*ConfigureRequest) ProtoMessage() {} func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[13] + mi := &file_protos_odc_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -923,7 +1328,7 @@ func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigureRequest.ProtoReflect.Descriptor instead. func (*ConfigureRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{13} + return file_protos_odc_proto_rawDescGZIP(), []int{15} } func (x *ConfigureRequest) GetRequest() *StateRequest { @@ -945,7 +1350,7 @@ type StartRequest struct { func (x *StartRequest) Reset() { *x = StartRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[14] + mi := &file_protos_odc_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -958,7 +1363,7 @@ func (x *StartRequest) String() string { func (*StartRequest) ProtoMessage() {} func (x *StartRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[14] + mi := &file_protos_odc_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -971,7 +1376,7 @@ func (x *StartRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartRequest.ProtoReflect.Descriptor instead. func (*StartRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{14} + return file_protos_odc_proto_rawDescGZIP(), []int{16} } func (x *StartRequest) GetRequest() *StateRequest { @@ -993,7 +1398,7 @@ type StopRequest struct { func (x *StopRequest) Reset() { *x = StopRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[15] + mi := &file_protos_odc_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1006,7 +1411,7 @@ func (x *StopRequest) String() string { func (*StopRequest) ProtoMessage() {} func (x *StopRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[15] + mi := &file_protos_odc_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1019,7 +1424,7 @@ func (x *StopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. func (*StopRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{15} + return file_protos_odc_proto_rawDescGZIP(), []int{17} } func (x *StopRequest) GetRequest() *StateRequest { @@ -1041,7 +1446,7 @@ type ResetRequest struct { func (x *ResetRequest) Reset() { *x = ResetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[16] + mi := &file_protos_odc_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1054,7 +1459,7 @@ func (x *ResetRequest) String() string { func (*ResetRequest) ProtoMessage() {} func (x *ResetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[16] + mi := &file_protos_odc_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1067,7 +1472,7 @@ func (x *ResetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. func (*ResetRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{16} + return file_protos_odc_proto_rawDescGZIP(), []int{18} } func (x *ResetRequest) GetRequest() *StateRequest { @@ -1089,7 +1494,7 @@ type TerminateRequest struct { func (x *TerminateRequest) Reset() { *x = TerminateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[17] + mi := &file_protos_odc_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1102,7 +1507,7 @@ func (x *TerminateRequest) String() string { func (*TerminateRequest) ProtoMessage() {} func (x *TerminateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[17] + mi := &file_protos_odc_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1115,7 +1520,7 @@ func (x *TerminateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. func (*TerminateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{17} + return file_protos_odc_proto_rawDescGZIP(), []int{19} } func (x *TerminateRequest) GetRequest() *StateRequest { @@ -1125,6 +1530,54 @@ func (x *TerminateRequest) GetRequest() *StateRequest { return nil } +// Status request +type StatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Running bool `protobuf:"varint,1,opt,name=running,proto3" json:"running,omitempty"` // Select only running DDS sessions +} + +func (x *StatusRequest) Reset() { + *x = StatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StatusRequest) ProtoMessage() {} + +func (x *StatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. +func (*StatusRequest) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{20} +} + +func (x *StatusRequest) GetRunning() bool { + if x != nil { + return x.Running + } + return false +} + var File_protos_odc_proto protoreflect.FileDescriptor var file_protos_odc_proto_rawDesc = []byte{ @@ -1132,7 +1585,7 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xde, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, @@ -1143,138 +1596,207 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x60, 0x0a, 0x0c, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, - 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x53, 0x0a, 0x11, 0x49, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, + 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x69, + 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x97, + 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x22, 0x67, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4f, 0x0a, 0x0f, 0x41, 0x63, 0x74, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, + 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, + 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x80, 0x01, 0x0a, 0x0a, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0x4d, 0x0a, - 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x22, 0x33, 0x0a, 0x0f, - 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x7b, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, - 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x32, 0xad, - 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, - 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xe2, 0x01, 0x0a, + 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, + 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, + 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, + 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, + 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, + 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, + 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, + 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, + 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, + 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, - 0x5a, 0x0a, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, + 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1289,71 +1811,81 @@ func file_protos_odc_proto_rawDescGZIP() []byte { return file_protos_odc_proto_rawDescData } -var file_protos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_protos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_protos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_protos_odc_proto_goTypes = []interface{}{ (ReplyStatus)(0), // 0: odc.ReplyStatus - (*Error)(nil), // 1: odc.Error - (*GeneralReply)(nil), // 2: odc.GeneralReply - (*Device)(nil), // 3: odc.Device - (*StateRequest)(nil), // 4: odc.StateRequest - (*StateReply)(nil), // 5: odc.StateReply - (*InitializeRequest)(nil), // 6: odc.InitializeRequest - (*SubmitRequest)(nil), // 7: odc.SubmitRequest - (*ActivateRequest)(nil), // 8: odc.ActivateRequest - (*RunRequest)(nil), // 9: odc.RunRequest - (*UpdateRequest)(nil), // 10: odc.UpdateRequest - (*ShutdownRequest)(nil), // 11: odc.ShutdownRequest - (*Property)(nil), // 12: odc.Property - (*SetPropertiesRequest)(nil), // 13: odc.SetPropertiesRequest - (*ConfigureRequest)(nil), // 14: odc.ConfigureRequest - (*StartRequest)(nil), // 15: odc.StartRequest - (*StopRequest)(nil), // 16: odc.StopRequest - (*ResetRequest)(nil), // 17: odc.ResetRequest - (*TerminateRequest)(nil), // 18: odc.TerminateRequest + (SessionStatus)(0), // 1: odc.SessionStatus + (*Error)(nil), // 2: odc.Error + (*GeneralReply)(nil), // 3: odc.GeneralReply + (*Device)(nil), // 4: odc.Device + (*StateRequest)(nil), // 5: odc.StateRequest + (*StateReply)(nil), // 6: odc.StateReply + (*PartitionStatus)(nil), // 7: odc.PartitionStatus + (*StatusReply)(nil), // 8: odc.StatusReply + (*InitializeRequest)(nil), // 9: odc.InitializeRequest + (*SubmitRequest)(nil), // 10: odc.SubmitRequest + (*ActivateRequest)(nil), // 11: odc.ActivateRequest + (*RunRequest)(nil), // 12: odc.RunRequest + (*UpdateRequest)(nil), // 13: odc.UpdateRequest + (*ShutdownRequest)(nil), // 14: odc.ShutdownRequest + (*Property)(nil), // 15: odc.Property + (*SetPropertiesRequest)(nil), // 16: odc.SetPropertiesRequest + (*ConfigureRequest)(nil), // 17: odc.ConfigureRequest + (*StartRequest)(nil), // 18: odc.StartRequest + (*StopRequest)(nil), // 19: odc.StopRequest + (*ResetRequest)(nil), // 20: odc.ResetRequest + (*TerminateRequest)(nil), // 21: odc.TerminateRequest + (*StatusRequest)(nil), // 22: odc.StatusRequest } var file_protos_odc_proto_depIdxs = []int32{ 0, // 0: odc.GeneralReply.status:type_name -> odc.ReplyStatus - 1, // 1: odc.GeneralReply.error:type_name -> odc.Error - 2, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply - 3, // 3: odc.StateReply.devices:type_name -> odc.Device - 12, // 4: odc.SetPropertiesRequest.properties:type_name -> odc.Property - 4, // 5: odc.ConfigureRequest.request:type_name -> odc.StateRequest - 4, // 6: odc.StartRequest.request:type_name -> odc.StateRequest - 4, // 7: odc.StopRequest.request:type_name -> odc.StateRequest - 4, // 8: odc.ResetRequest.request:type_name -> odc.StateRequest - 4, // 9: odc.TerminateRequest.request:type_name -> odc.StateRequest - 6, // 10: odc.ODC.Initialize:input_type -> odc.InitializeRequest - 7, // 11: odc.ODC.Submit:input_type -> odc.SubmitRequest - 8, // 12: odc.ODC.Activate:input_type -> odc.ActivateRequest - 9, // 13: odc.ODC.Run:input_type -> odc.RunRequest - 10, // 14: odc.ODC.Update:input_type -> odc.UpdateRequest - 14, // 15: odc.ODC.Configure:input_type -> odc.ConfigureRequest - 13, // 16: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest - 4, // 17: odc.ODC.GetState:input_type -> odc.StateRequest - 15, // 18: odc.ODC.Start:input_type -> odc.StartRequest - 16, // 19: odc.ODC.Stop:input_type -> odc.StopRequest - 17, // 20: odc.ODC.Reset:input_type -> odc.ResetRequest - 18, // 21: odc.ODC.Terminate:input_type -> odc.TerminateRequest - 11, // 22: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest - 2, // 23: odc.ODC.Initialize:output_type -> odc.GeneralReply - 2, // 24: odc.ODC.Submit:output_type -> odc.GeneralReply - 2, // 25: odc.ODC.Activate:output_type -> odc.GeneralReply - 2, // 26: odc.ODC.Run:output_type -> odc.GeneralReply - 2, // 27: odc.ODC.Update:output_type -> odc.GeneralReply - 5, // 28: odc.ODC.Configure:output_type -> odc.StateReply - 2, // 29: odc.ODC.SetProperties:output_type -> odc.GeneralReply - 5, // 30: odc.ODC.GetState:output_type -> odc.StateReply - 5, // 31: odc.ODC.Start:output_type -> odc.StateReply - 5, // 32: odc.ODC.Stop:output_type -> odc.StateReply - 5, // 33: odc.ODC.Reset:output_type -> odc.StateReply - 5, // 34: odc.ODC.Terminate:output_type -> odc.StateReply - 2, // 35: odc.ODC.Shutdown:output_type -> odc.GeneralReply - 23, // [23:36] is the sub-list for method output_type - 10, // [10:23] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 2, // 1: odc.GeneralReply.error:type_name -> odc.Error + 3, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply + 4, // 3: odc.StateReply.devices:type_name -> odc.Device + 1, // 4: odc.PartitionStatus.status:type_name -> odc.SessionStatus + 0, // 5: odc.StatusReply.status:type_name -> odc.ReplyStatus + 2, // 6: odc.StatusReply.error:type_name -> odc.Error + 7, // 7: odc.StatusReply.partitions:type_name -> odc.PartitionStatus + 15, // 8: odc.SetPropertiesRequest.properties:type_name -> odc.Property + 5, // 9: odc.ConfigureRequest.request:type_name -> odc.StateRequest + 5, // 10: odc.StartRequest.request:type_name -> odc.StateRequest + 5, // 11: odc.StopRequest.request:type_name -> odc.StateRequest + 5, // 12: odc.ResetRequest.request:type_name -> odc.StateRequest + 5, // 13: odc.TerminateRequest.request:type_name -> odc.StateRequest + 9, // 14: odc.ODC.Initialize:input_type -> odc.InitializeRequest + 10, // 15: odc.ODC.Submit:input_type -> odc.SubmitRequest + 11, // 16: odc.ODC.Activate:input_type -> odc.ActivateRequest + 12, // 17: odc.ODC.Run:input_type -> odc.RunRequest + 13, // 18: odc.ODC.Update:input_type -> odc.UpdateRequest + 17, // 19: odc.ODC.Configure:input_type -> odc.ConfigureRequest + 16, // 20: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest + 5, // 21: odc.ODC.GetState:input_type -> odc.StateRequest + 18, // 22: odc.ODC.Start:input_type -> odc.StartRequest + 19, // 23: odc.ODC.Stop:input_type -> odc.StopRequest + 20, // 24: odc.ODC.Reset:input_type -> odc.ResetRequest + 21, // 25: odc.ODC.Terminate:input_type -> odc.TerminateRequest + 14, // 26: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest + 22, // 27: odc.ODC.Status:input_type -> odc.StatusRequest + 3, // 28: odc.ODC.Initialize:output_type -> odc.GeneralReply + 3, // 29: odc.ODC.Submit:output_type -> odc.GeneralReply + 3, // 30: odc.ODC.Activate:output_type -> odc.GeneralReply + 3, // 31: odc.ODC.Run:output_type -> odc.GeneralReply + 3, // 32: odc.ODC.Update:output_type -> odc.GeneralReply + 6, // 33: odc.ODC.Configure:output_type -> odc.StateReply + 3, // 34: odc.ODC.SetProperties:output_type -> odc.GeneralReply + 6, // 35: odc.ODC.GetState:output_type -> odc.StateReply + 6, // 36: odc.ODC.Start:output_type -> odc.StateReply + 6, // 37: odc.ODC.Stop:output_type -> odc.StateReply + 6, // 38: odc.ODC.Reset:output_type -> odc.StateReply + 6, // 39: odc.ODC.Terminate:output_type -> odc.StateReply + 3, // 40: odc.ODC.Shutdown:output_type -> odc.GeneralReply + 8, // 41: odc.ODC.Status:output_type -> odc.StatusReply + 28, // [28:42] is the sub-list for method output_type + 14, // [14:28] is the sub-list for method input_type + 14, // [14:14] is the sub-list for extension type_name + 14, // [14:14] is the sub-list for extension extendee + 0, // [0:14] is the sub-list for field type_name } func init() { file_protos_odc_proto_init() } @@ -1423,7 +1955,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitializeRequest); i { + switch v := v.(*PartitionStatus); i { case 0: return &v.state case 1: @@ -1435,7 +1967,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitRequest); i { + switch v := v.(*StatusReply); i { case 0: return &v.state case 1: @@ -1447,7 +1979,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivateRequest); i { + switch v := v.(*InitializeRequest); i { case 0: return &v.state case 1: @@ -1459,7 +1991,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunRequest); i { + switch v := v.(*SubmitRequest); i { case 0: return &v.state case 1: @@ -1471,7 +2003,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRequest); i { + switch v := v.(*ActivateRequest); i { case 0: return &v.state case 1: @@ -1483,7 +2015,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShutdownRequest); i { + switch v := v.(*RunRequest); i { case 0: return &v.state case 1: @@ -1495,7 +2027,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Property); i { + switch v := v.(*UpdateRequest); i { case 0: return &v.state case 1: @@ -1507,7 +2039,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetPropertiesRequest); i { + switch v := v.(*ShutdownRequest); i { case 0: return &v.state case 1: @@ -1519,7 +2051,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureRequest); i { + switch v := v.(*Property); i { case 0: return &v.state case 1: @@ -1531,7 +2063,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartRequest); i { + switch v := v.(*SetPropertiesRequest); i { case 0: return &v.state case 1: @@ -1543,7 +2075,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopRequest); i { + switch v := v.(*ConfigureRequest); i { case 0: return &v.state case 1: @@ -1555,7 +2087,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetRequest); i { + switch v := v.(*StartRequest); i { case 0: return &v.state case 1: @@ -1567,6 +2099,30 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ResetRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TerminateRequest); i { case 0: return &v.state @@ -1578,14 +2134,26 @@ func file_protos_odc_proto_init() { return nil } } + file_protos_odc_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_odc_proto_rawDesc, - NumEnums: 1, - NumMessages: 18, + NumEnums: 2, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 43c3464ad..2ac1fd48f 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -36,6 +36,8 @@ service ODC { rpc Terminate (TerminateRequest) returns (StateReply) {} // Shutdown DDS session. rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} + // Status request. + rpc Status (StatusRequest) returns (StatusReply) {} } // Request status @@ -45,6 +47,13 @@ enum ReplyStatus { ERROR = 2; // Failed to perform request } +// Session status as defined by DDS +enum SessionStatus { + UNKNOWN_ = 0; // Status is unknown + RUNNING = 1; // DDS session is running + STOPPED = 2; // DDS session is stopped +} + // General error message Error { string msg = 1; // Detailed error message @@ -60,6 +69,7 @@ message GeneralReply { Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty int32 exectime = 4; // Request execution time in ms string partitionid = 5; // Partition ID from ECS + uint64 runnr = 8; // Run number from ECS (optional) string sessionid = 6; // DDS session ID string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. } @@ -76,6 +86,8 @@ message Device { // Device change/get state request message StateRequest { string partitionid = 1; // Partition ID from ECS + uint64 runnr = 4; // Run number from ECS + uint32 timeout = 5; // Request timeout in sec. If not set or 0 than default is used. string path = 2; // Task path in the DDS topology. Can be a regular expression. bool detailed = 3; // If true then a list of affected devices is populated in the reply. } @@ -86,6 +98,25 @@ message StateReply { repeated Device devices = 2; // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. } +// Status of each partition +message PartitionStatus { + string partitionid = 1; // Partition ID from ECS + uint64 runnr = 5; // Run number from ECS + uint32 timeout = 6; // Request timeout in sec. If not set or 0 than default is used. + string sessionid = 2; // DDS session ID + SessionStatus status = 3; // DDS session status + string state = 4; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. +} + +// ODC status reply +message StatusReply { + string msg = 1; // Detailed reply message + ReplyStatus status = 2; // Request status code (UNKNOWN, SUCCESS, ERROR) + Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty + int32 exectime = 4; // Request execution time in ms + repeated PartitionStatus partitions = 5; // Status of each partition +} + // // Requests // @@ -93,12 +124,16 @@ message StateReply { // Initialize request message InitializeRequest { string partitionid = 1; // Partition ID from ECS + uint64 runnr = 3; // Run number from ECS + uint32 timeout = 4; // Request timeout in sec. If not set or 0 than default is used. string sessionid = 2; // DDS session ID. If session ID is provided that ODC connects to an existing DDS session. If session ID is an empty string that a new DDS session is created. } // Submit request message SubmitRequest { string partitionid = 1; // Partition ID from ECS + uint64 runnr = 4; // Run number from ECS + uint32 timeout = 5; // Request timeout in sec. If not set or 0 than default is used. string plugin = 2; // Name of the resource plugin registered in odc-server string resources = 3; // Resource description } @@ -106,13 +141,23 @@ message SubmitRequest { // Activate request message ActivateRequest { string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file + uint64 runnr = 5; // Run number from ECS + uint32 timeout = 6; // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + string topology = 2; // Filepath to the XML DDS topology file + string content = 3; // Content of the XML DDS topology + string script = 4; // Shell commands to be executed by ODC in order to generate content of the XML DDS topology } // Run request message RunRequest { string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file + uint64 runnr = 7; // Run number from ECS + uint32 timeout = 8; // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + string topology = 2; // Filepath to the XML DDS topology file + string content = 5; // Content of the XML DDS topology + string script = 6; // Shell commands to be executed by ODC in order to generate content of the XML DDS topology string plugin = 3; // Name of the resource plugin registered in odc-server string resources = 4; // Resource description } @@ -120,12 +165,19 @@ message RunRequest { // Update request message UpdateRequest { string partitionid = 1; // Partition ID from ECS - string topology = 2; // Filepath to a DDS topology file + uint64 runnr = 5; // Run number from ECS + uint32 timeout = 6; // Request timeout in sec. If not set or 0 than default is used. + // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. + string topology = 2; // Filepath to the XML DDS topology file + string content = 3; // Content of the XML DDS topology + string script = 4; // Shell commands to be executed by ODC in order to generate content of the XML DDS topology } // Shutdown request message ShutdownRequest { string partitionid = 1; // Partition ID from ECS + uint64 runnr = 2; // Run number from ECS + uint32 timeout = 3; // Request timeout in sec. If not set or 0 than default is used. } // Key-Value property @@ -137,6 +189,8 @@ message Property { // Set properties request message SetPropertiesRequest { string partitionid = 1; // Partition ID from ECS + uint64 runnr = 4; // Run number from ECS + uint32 timeout = 5; // Request timeout in sec. If not set or 0 than default is used. string path = 2; // Task path in the DDS topology. Can be a regular expression. repeated Property properties = 3; // List of properties to be set } @@ -169,3 +223,14 @@ message ResetRequest { message TerminateRequest { StateRequest request = 1; // State change request. See StateRequest for details. } + +// +// Generic requests +// + +// Status request +message StatusRequest +{ + bool running = 1; // Select only running DDS sessions +} + diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 1bcc9baa5..1dd372c39 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -48,6 +48,8 @@ type ODCClient interface { Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) // Shutdown DDS session. Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) + // Status request. + Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) } type oDCClient struct { @@ -175,6 +177,15 @@ func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...g return out, nil } +func (c *oDCClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { + out := new(StatusReply) + err := c.cc.Invoke(ctx, "/odc.ODC/Status", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ODCServer is the server API for ODC service. // All implementations should embed UnimplementedODCServer // for forward compatibility @@ -209,6 +220,8 @@ type ODCServer interface { Terminate(context.Context, *TerminateRequest) (*StateReply, error) // Shutdown DDS session. Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) + // Status request. + Status(context.Context, *StatusRequest) (*StatusReply, error) } // UnimplementedODCServer should be embedded to have forward compatible implementations. @@ -254,6 +267,9 @@ func (UnimplementedODCServer) Terminate(context.Context, *TerminateRequest) (*St func (UnimplementedODCServer) Shutdown(context.Context, *ShutdownRequest) (*GeneralReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Shutdown not implemented") } +func (UnimplementedODCServer) Status(context.Context, *StatusRequest) (*StatusReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Status not implemented") +} // UnsafeODCServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ODCServer will @@ -500,6 +516,24 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _ODC_Status_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(StatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ODCServer).Status(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/odc.ODC/Status", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ODCServer).Status(ctx, req.(*StatusRequest)) + } + return interceptor(ctx, in, info, handler) +} + // ODC_ServiceDesc is the grpc.ServiceDesc for ODC service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -559,6 +593,10 @@ var ODC_ServiceDesc = grpc.ServiceDesc{ MethodName: "Shutdown", Handler: _ODC_Shutdown_Handler, }, + { + MethodName: "Status", + Handler: _ODC_Status_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/odc.proto", From 55aadadc85380193ad64e1578f9840df7486a7e7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Oct 2021 16:44:51 +0200 Subject: [PATCH 1045/2352] [core] Make environment.Manager single instance accessible from outside --- core/environment/manager.go | 22 +++++++++++++++------- core/the/singleton.go | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index da461bacd..19b6ce024 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -54,8 +54,16 @@ type Manager struct { pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent } +var ( + instance *Manager +) + +func ManagerInstance() *Manager { + return instance +} + func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manager { - envman := &Manager{ + instance = &Manager{ m: make(map[uid.ID]*Environment), taskman: tm, incomingEventCh: incomingEventCh, @@ -66,22 +74,22 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage go func() { for ;; { select { - case incomingEvent := <- envman.incomingEventCh: + case incomingEvent := <- instance.incomingEventCh: switch typedEvent := incomingEvent.(type) { case event.DeviceEvent: - envman.handleDeviceEvent(typedEvent) + instance.handleDeviceEvent(typedEvent) case *event.TasksReleasedEvent: // If we got a TasksReleasedEvent, it must be matched with a pending // environment teardown. - if thisEnvCh, ok := envman.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { + if thisEnvCh, ok := instance.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent close(thisEnvCh) - delete(envman.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) } case *event.TasksStateChangedEvent: // If we got a TasksStateChangedEvent, it must be matched with a pending // environment transition. - if thisEnvCh, ok := envman.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { + if thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent } default: @@ -90,7 +98,7 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage } } }() - return envman + return instance } func (envs *Manager) GetActiveDetectors() system.IDMap { diff --git a/core/the/singleton.go b/core/the/singleton.go index cea09d902..c2f83aef6 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -41,4 +41,4 @@ func RepoManager() *repos.RepoManager { func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { return bookkeeping.Instance() -} \ No newline at end of file +} From 7b47a4bc31880d1f3d72505cfd6ae01106f0158f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Oct 2021 17:15:10 +0200 Subject: [PATCH 1046/2352] [core] New cleanup facilities for ODC --- core/integration/odc/handlers.go | 102 ++++++++++++++++++++++++++++--- core/integration/odc/plugin.go | 51 ++++++++++++++++ 2 files changed, 146 insertions(+), 7 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index f2cec745a..aec9d5e54 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration/odc/odcutils" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/sirupsen/logrus" @@ -243,7 +244,7 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return nil } -func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -277,6 +278,93 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri return nil // We clobber the error because nothing can be done for a failed cleanup } +func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + + // First we query ODC for the full list of active partitions + req := &odcpb.StatusRequest{} + + var err error = nil + var rep *odcpb.StatusReply + + rep, err = odcClient.Status(ctx, req, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if rep == nil || rep.GetStatus() == odcpb.ReplyStatus_UNKNOWN { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := rep.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := rep.GetStatus(); replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": rep.GetMsg(), + "odcStatus": rep.GetStatus().String(), + "odcExectime": rep.GetExectime(), + }). + Trace("call to ODC complete") + + knownEnvs := environment.ManagerInstance().Ids() + partitionsToClean := make(map[string]struct{}) + for _, odcPartition := range rep.GetPartitions() { + isOrphan := true + for _, knownEnv := range knownEnvs { + if odcPartition.Partitionid == knownEnv.String() { // found a matching env + isOrphan = false + break + } + } + if isOrphan { // no env was found for the given ODC partition + partitionsToClean[odcPartition.Partitionid] = struct{}{} + } + } + + // The present function can in principle be called with envId = "", if the cleanup is triggered from + // outside of an active environment. + // If an envId is passed, we append it to the list of partitions to clean up just in case, otherwise we + // ignore it. + if envId != "" { + partitionsToClean[envId] = struct {}{} + } + + // Then the actual cleanup calls begin, one partition at a time... + for odcPartitionId, _ := range partitionsToClean { + // This block tries to perform the regular teardown sequence. + // Since Shutdown is supposed to work in any state, we don't bail on error. + err := doReset(ctx, odcClient, arguments, odcPartitionId) + if err != nil { + log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", odcPartitionId). + Warn("ODC Reset call failed") + } + + err = doTerminate(ctx, odcClient, arguments, odcPartitionId) + if err != nil { + log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", odcPartitionId). + Warn("ODC Terminate call failed") + } + + err = doShutdown(ctx, odcClient, arguments, odcPartitionId) + if err != nil { + log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", odcPartitionId). + Warn("ODC Shutdown call failed") + } + } + + return nil // We clobber the error because nothing can be done for a failed cleanup +} + func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { // RESET req := &odcpb.ResetRequest{ @@ -307,12 +395,12 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). Debug("call to ODC complete") return err } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index c0f09c40f..526ccb571 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -154,6 +154,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["Configure"] = func() (out string) { + // ODC Run + SetProperties + Configure + var topology, plugin, resources string ok := false topology, ok = varStack["odc_topology"] @@ -209,6 +211,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["Start"] = func() (out string) { // must formally return string even when we return nothing + // ODC SetProperties + Start + rn, ok := varStack["run_number"] if !ok { log.WithField("partition", envId). @@ -238,6 +242,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["Stop"] = func() (out string) { + // ODC Stop + timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -256,6 +262,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["Reset"] = func() (out string) { + // ODC Reset + Terminate + Shutdown + timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -273,7 +281,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } + stack["EnsureCleanupLegacy"] = func() (out string) { + // ODC Reset + Terminate + Shutdown for current env + + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleCleanupLegacy(ctx, p.odcClient, nil, envId) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EnsureCleanupLegacy"). + + Error("ODC error") + log.WithField("partition", envId). + WithField("call", "EnsureCleanupLegacy"). + Error("EPN Cleanup sequence failed") + } + return + } stack["EnsureCleanup"] = func() (out string) { + // ODC Reset + Terminate + Shutdown for currend env + all orphans + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -292,7 +323,27 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } return } + stack["PreDeploymentCleanup"] = func() (out string) { + // ODC Reset + Terminate + Shutdown for all orphans + + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleCleanup(ctx, p.odcClient, nil, "") + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PreDeploymentCleanup"). + + Error("ODC error") + log.WithField("partition", envId). + WithField("call", "PreDeploymentCleanup"). + Error("EPN PreDeploymentCleanup sequence failed") + } + return + } return } From 073c742d85aea596a0b5f27d0d9f6750206e95a2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Oct 2021 17:16:36 +0200 Subject: [PATCH 1047/2352] [build] Bump to v0.27.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 72af372b1..32bc97af8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 26 -VERSION_PATCH := 82 +VERSION_MINOR := 27 +VERSION_PATCH := 0 From 08c437fe054f4c49e979bc4cdffc035a712d2e67 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Oct 2021 19:01:41 +0200 Subject: [PATCH 1048/2352] [core] Improve debug output of ODC cleanup operations --- core/integration/odc/handlers.go | 28 +++++++++++++++++++++++----- core/integration/odc/plugin.go | 4 ++-- core/workflow/callable/call.go | 6 ++++++ 3 files changed, 31 insertions(+), 7 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index aec9d5e54..2d418a7f8 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -28,6 +28,7 @@ import ( "context" "errors" "fmt" + "strings" "time" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -279,6 +280,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma } func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + log.Debug("handleCleanup starting") defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) // First we query ODC for the full list of active partitions @@ -288,6 +290,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri var rep *odcpb.StatusReply rep, err = odcClient.Status(ctx, req, grpc.EmptyCallOption{}) + log.Debug("ODC status query done") if err != nil { return printGrpcError(err) } @@ -304,24 +307,31 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ + "odcCall": "Status", "odcMsg": rep.GetMsg(), "odcStatus": rep.GetStatus().String(), "odcExectime": rep.GetExectime(), }). - Trace("call to ODC complete") + Debug("call to ODC complete") + + partitionIdsKnownToOdc := make([]string, len(rep.GetPartitions())) + for i, v := range rep.GetPartitions() { + partitionIdsKnownToOdc[i] = v.Partitionid + } + log.Debugf("partitions known to ODC: %s", strings.Join(partitionIdsKnownToOdc, ", ")) knownEnvs := environment.ManagerInstance().Ids() partitionsToClean := make(map[string]struct{}) - for _, odcPartition := range rep.GetPartitions() { + for _, odcPartition := range partitionIdsKnownToOdc { isOrphan := true for _, knownEnv := range knownEnvs { - if odcPartition.Partitionid == knownEnv.String() { // found a matching env + if odcPartition == knownEnv.String() { // found a matching env isOrphan = false break } } if isOrphan { // no env was found for the given ODC partition - partitionsToClean[odcPartition.Partitionid] = struct{}{} + partitionsToClean[odcPartition] = struct{}{} } } @@ -330,8 +340,16 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri // If an envId is passed, we append it to the list of partitions to clean up just in case, otherwise we // ignore it. if envId != "" { - partitionsToClean[envId] = struct {}{} + partitionsToClean[envId] = struct{}{} + } + + partitionsToCleanStr := make([]string, len(partitionsToClean)) + i := 0 + for k, _ := range partitionsToClean { + partitionsToCleanStr[i] = k + i++ } + log.Debugf("partitions about to be cleaned: %s", strings.Join(partitionIdsKnownToOdc, ", ")) // Then the actual cleanup calls begin, one partition at a time... for odcPartitionId, _ := range partitionsToClean { diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 526ccb571..3ceadd0c8 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -284,7 +284,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["EnsureCleanupLegacy"] = func() (out string) { // ODC Reset + Terminate + Shutdown for current env - timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanupLegacy", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -326,7 +326,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["PreDeploymentCleanup"] = func() (out string) { // ODC Reset + Terminate + Shutdown for all orphans - timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "PreDeploymentCleanup", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index f3b03ba10..89fb188ba 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" @@ -123,6 +124,11 @@ func NewCall(funcCall string, returnVar string, varStack map[string]string, pare } func (c *Call) Call() error { + log.WithField("trigger", c.Traits.Trigger). + WithField("await", c.Traits.Await). + WithField("partition", c.parentRole.GetEnvironmentId().String()). + WithField("level", infologger.IL_Devel). + Debugf("calling hook function %s", c.Func) output := "{{" + c.Func + "}}" returnVar := c.Return fields := template.Fields{ From 6c54603d934703651de36b5266e9115dbd8ccce5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 16:48:57 +0200 Subject: [PATCH 1049/2352] [core] Relax locking in environment manager --- core/environment/manager.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 19b6ce024..ef9bdb574 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -124,8 +124,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // created environment. alreadyActiveDetectors := envs.GetActiveDetectors() - envs.mu.Lock() - // userVar identifiers come in 2 forms: // environment user var: "someKey" // workflow user var: "path.to.some.role:someKey" @@ -154,7 +152,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }).Info("creating new environment") if err != nil { - envs.mu.Unlock() return uid.NilID(), err } env.hookHandlerF = func(hooks task.Tasks) error { @@ -179,7 +176,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) - envs.mu.Unlock() return env.id, err } @@ -188,14 +184,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) - envs.mu.Unlock() return env.id, err } detectorsStr, err := SliceToJSONSlice(detectors) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) - envs.mu.Unlock() return env.id, err } env.GlobalDefaults.Set("detectors", detectorsStr) @@ -205,13 +199,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] for det, _ := range neededDetectors { if _, contains := alreadyActiveDetectors[det]; contains { // required detector det is already active in some other environment - envs.mu.Unlock() return env.id, fmt.Errorf("detector %s is already in use", det.String()) } } + envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh + envs.mu.Unlock() err = env.TryTransition(NewDeployTransition( envs.taskman, @@ -223,7 +218,6 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman), ) } - envs.mu.Unlock() if err == nil { // CONFIGURE transition successful! From ff7512b6db13351a7f4d7ae72c5a0e7cf5266cf2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 16:49:43 +0200 Subject: [PATCH 1050/2352] [core] Improve thread safety in task manager class cache --- core/task/class.go | 26 +++++++++++--------------- core/task/manager.go | 11 +++++------ 2 files changed, 16 insertions(+), 21 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 033ce0dc3..7e04dc7c3 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -224,27 +224,23 @@ func (c *classes) deleteKey(key string) { delete(c.classMap, key) } -func (c *classes) contains(key string) bool { - c.mu.RLock() - defer c.mu.RUnlock() - - _, ok := c.classMap[key] - - return ok -} - -func (c *classes) updateClass(key string,class *Class) { +func (c *classes) deleteKeys(keys []string) { c.mu.Lock() defer c.mu.Unlock() - - *c.classMap[key] = *class + + for _, k := range keys { + delete(c.classMap, k) + } } -func (c *classes) addClass(key string,class *Class) { +func (c *classes) updateClass(key string, class *Class) { c.mu.Lock() defer c.mu.Unlock() - - c.classMap[key] = class + if _, ok := c.classMap[key]; ok { //contains + *c.classMap[key] = *class // update + } else { + c.classMap[key] = class // else add class as new entry + } } func (c *classes) getClass(key string) (class *Class, ok bool) { diff --git a/core/task/manager.go b/core/task/manager.go index 257749a2f..bc4c352c8 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -212,12 +212,15 @@ func (m *Manager) removeInactiveClasses() { classMap := m.classes.getMap() + keys := make([]string, 0) for taskClassIdentifier := range classMap { if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { - m.classes.deleteKey(taskClassIdentifier) + keys = append(keys, taskClassIdentifier) } } + m.classes.deleteKeys(keys) + return } @@ -248,11 +251,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { for _, class := range taskClassList { taskClassIdentifier := class.Identifier.String() // If it already exists we update, otherwise we add the new class - if m.classes.contains(taskClassIdentifier) { - m.classes.updateClass(taskClassIdentifier, class) - } else { - m.classes.addClass(taskClassIdentifier, class) - } + m.classes.updateClass(taskClassIdentifier, class) } return } From 37687e0f6ccfa359690d0d18244ea6ffeaccce07 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 16:53:03 +0200 Subject: [PATCH 1051/2352] [core] Only query for active ODC partitions, and immediately Shutdown --- core/integration/odc/handlers.go | 21 ++------------------- core/integration/odc/plugin.go | 4 ++-- 2 files changed, 4 insertions(+), 21 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 2d418a7f8..9243162b7 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -284,7 +284,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) // First we query ODC for the full list of active partitions - req := &odcpb.StatusRequest{} + req := &odcpb.StatusRequest{Running: true} var err error = nil var rep *odcpb.StatusReply @@ -353,25 +353,8 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri // Then the actual cleanup calls begin, one partition at a time... for odcPartitionId, _ := range partitionsToClean { - // This block tries to perform the regular teardown sequence. - // Since Shutdown is supposed to work in any state, we don't bail on error. - err := doReset(ctx, odcClient, arguments, odcPartitionId) - if err != nil { - log.WithError(printGrpcError(err)). - WithField("level", infologger.IL_Devel). - WithField("partition", odcPartitionId). - Warn("ODC Reset call failed") - } - - err = doTerminate(ctx, odcClient, arguments, odcPartitionId) - if err != nil { - log.WithError(printGrpcError(err)). - WithField("level", infologger.IL_Devel). - WithField("partition", odcPartitionId). - Warn("ODC Terminate call failed") - } - err = doShutdown(ctx, odcClient, arguments, odcPartitionId) + err = doShutdown(ctx, odcClient, arguments, odcPartitionId) // FIXME make this parallel if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 3ceadd0c8..f8406eec9 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -303,7 +303,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["EnsureCleanup"] = func() (out string) { - // ODC Reset + Terminate + Shutdown for currend env + all orphans + // ODC Shutdown for current env + all orphans timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) @@ -324,7 +324,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } stack["PreDeploymentCleanup"] = func() (out string) { - // ODC Reset + Terminate + Shutdown for all orphans + // ODC Shutdown for all orphans timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "PreDeploymentCleanup", envId) From 219599fdfdbf3aa5308708d932b36983778a6ef6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 17:28:16 +0200 Subject: [PATCH 1052/2352] [core] Parallelize ODC Shutdown calls during cleanup --- core/integration/odc/handlers.go | 85 ++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 38 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 9243162b7..a06a3d8dc 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -29,6 +29,7 @@ import ( "errors" "fmt" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -90,7 +91,7 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st } func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) req := &odcpb.StartRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, @@ -141,7 +142,8 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { return fmt.Errorf("status %s from ODC", replyStatus.String()) } - log.WithFields(logrus.Fields{ + log.WithField("partition", envId). + WithFields(logrus.Fields{ "odcMsg": setPropertiesResponse.Msg, "odcStatus": setPropertiesResponse.Status.String(), "odcExectime": setPropertiesResponse.Exectime, @@ -167,19 +169,20 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { return fmt.Errorf("status %s from ODC", replyStatus.String()) } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). + log.WithField("partition", envId). + WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). Debug("call to ODC complete") return err } func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) req := &odcpb.StopRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, @@ -211,19 +214,20 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { return fmt.Errorf("status %s from ODC", replyStatus.String()) } - log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). + log.WithField("partition", envId). + WithFields(logrus.Fields{ + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "odcRunid": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). Debug("call to ODC complete") return err } func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -246,7 +250,7 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string } func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } @@ -280,8 +284,9 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma } func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { - log.Debug("handleCleanup starting") - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + log.WithField("partition", envId). + Debug("handleCleanup starting") + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) // First we query ODC for the full list of active partitions req := &odcpb.StatusRequest{Running: true} @@ -290,7 +295,6 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri var rep *odcpb.StatusReply rep, err = odcClient.Status(ctx, req, grpc.EmptyCallOption{}) - log.Debug("ODC status query done") if err != nil { return printGrpcError(err) } @@ -306,7 +310,8 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri if replyStatus := rep.GetStatus(); replyStatus != odcpb.ReplyStatus_SUCCESS { return fmt.Errorf("status %s from ODC", replyStatus.String()) } - log.WithFields(logrus.Fields{ + log.WithField("partition", envId). + WithFields(logrus.Fields{ "odcCall": "Status", "odcMsg": rep.GetMsg(), "odcStatus": rep.GetStatus().String(), @@ -318,7 +323,8 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri for i, v := range rep.GetPartitions() { partitionIdsKnownToOdc[i] = v.Partitionid } - log.Debugf("partitions known to ODC: %s", strings.Join(partitionIdsKnownToOdc, ", ")) + log.WithField("partition", envId). + Debugf("partitions known to ODC: %s", strings.Join(partitionIdsKnownToOdc, ", ")) knownEnvs := environment.ManagerInstance().Ids() partitionsToClean := make(map[string]struct{}) @@ -349,19 +355,26 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri partitionsToCleanStr[i] = k i++ } - log.Debugf("partitions about to be cleaned: %s", strings.Join(partitionIdsKnownToOdc, ", ")) + log.WithField("partition", envId). + Debugf("partitions about to be cleaned: %s", strings.Join(partitionIdsKnownToOdc, ", ")) - // Then the actual cleanup calls begin, one partition at a time... - for odcPartitionId, _ := range partitionsToClean { + wg := &sync.WaitGroup{} + wg.Add(len(partitionsToClean)) - err = doShutdown(ctx, odcClient, arguments, odcPartitionId) // FIXME make this parallel - if err != nil { - log.WithError(printGrpcError(err)). - WithField("level", infologger.IL_Devel). - WithField("partition", odcPartitionId). - Warn("ODC Shutdown call failed") - } + // Then the actual cleanup calls begin, in parallel... + for odcPartitionId, _ := range partitionsToClean { + go func(odcPartitionId string) { + defer wg.Done() + err = doShutdown(ctx, odcClient, arguments, odcPartitionId) // FIXME make this parallel + if err != nil { + log.WithError(printGrpcError(err)). + WithField("level", infologger.IL_Devel). + WithField("partition", odcPartitionId). + Warn("ODC Shutdown call failed") + } + }(odcPartitionId) } + wg.Wait() return nil // We clobber the error because nothing can be done for a failed cleanup } @@ -481,10 +494,6 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } -func handleExit(ctx context.Context, odcClient *RpcClient, arguments map[string]string ) error { - return nil -} - func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { From 210a7335e26f7f73d3409cbe977fc43b322efc6d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 17:28:49 +0200 Subject: [PATCH 1053/2352] [core] Parallelize AwaitAll in hook call processing --- core/workflow/callable/call.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 89fb188ba..864c9d95f 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -27,6 +27,7 @@ package callable import ( "fmt" "strconv" + "sync" texttemplate "text/template" "time" @@ -102,13 +103,20 @@ func (s Calls) StartAll() { } func (s Calls) AwaitAll() map[*Call]error { + // Since each Await call blocks, we call it in parallel and then collect errors := make(map[*Call]error) + wg := &sync.WaitGroup{} + wg.Add(len(s)) for _, v := range s { - err := v.Await() - if err != nil { - errors[v] = err - } + go func(v *Call) { + defer wg.Done() + err := v.Await() + if err != nil { + errors[v] = err + } + }(v) } + wg.Wait() return errors } From fec9a69a54c588ac7da63ca3b5ca311265aaace2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 17:57:30 +0200 Subject: [PATCH 1054/2352] [core] Send run number in ODC Start/Stop calls --- core/integration/odc/handlers.go | 9 +++++--- core/integration/odc/plugin.go | 35 ++++++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 5 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index a06a3d8dc..e9f442c22 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -90,13 +90,15 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st return odcutils.StateForOdcState(newState), err } -func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string, runNumber uint64) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) + req := &odcpb.StartRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, Path: "", Detailed: false, + Runnr: runNumber, }, } @@ -181,13 +183,14 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return err } -func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string, runNumber uint64) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) req := &odcpb.StopRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, Path: "", Detailed: false, + Runnr: runNumber, }, } @@ -382,7 +385,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { // RESET req := &odcpb.ResetRequest{ - Request: &odcpb.StateRequest{ + Request: &odcpb.StateRequest{ Partitionid: envId, Path: "", Detailed: false, diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index f8406eec9..28855a3b2 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -219,6 +219,18 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Start"). Warn("cannot acquire run number for ODC") } + var ( + runNumberu64 uint64 + err error + ) + + runNumberu64, err = strconv.ParseUint(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for DCS SOR") + runNumberu64 = 0 + } timeout := callable.AcquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) @@ -228,7 +240,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleStart(ctx, p.odcClient, arguments, envId) + err = handleStart(ctx, p.odcClient, arguments, envId, runNumberu64) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -244,11 +256,30 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["Stop"] = func() (out string) { // ODC Stop + rn, ok := varStack["run_number"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Start"). + Warn("cannot acquire run number for ODC") + } + var ( + runNumberu64 uint64 + err error + ) + + runNumberu64, err = strconv.ParseUint(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for DCS SOR") + runNumberu64 = 0 + } + timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleStop(ctx, p.odcClient, nil, envId) + err = handleStop(ctx, p.odcClient, nil, envId, runNumberu64) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). From 4a9c89687d521b905952ea2f73bee2e753ec0c3d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Oct 2021 18:01:22 +0200 Subject: [PATCH 1055/2352] [core] Also send run number to ODC in SetProperties call --- core/integration/odc/handlers.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index e9f442c22..901accf57 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -114,6 +114,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string Partitionid: envId, Path: "", Properties: make([]*odcpb.Property, len(arguments)), + Runnr: runNumber, } // Extract relevant parameters from Arguments payload From c54f70acaa28657841a25ca75a1b7c457d7e0fac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Oct 2021 17:16:00 +0200 Subject: [PATCH 1056/2352] [build] Bump to v0.27.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 32bc97af8..c6e2e0dd1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 27 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From ced6d9e8d9f43cb3058e70c6849a9956a500a0c5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 20 Oct 2021 12:31:28 +0200 Subject: [PATCH 1057/2352] [core][coconut] Add minification switches to GetEnvs/GetEnv calls --- coconut/control/control.go | 2 +- coconut/protos/o2control.pb.go | 1261 ++++++++++++++++---------------- core/protos/o2control.pb.go | 1261 ++++++++++++++++---------------- core/protos/o2control.proto | 2 + core/server.go | 8 +- 5 files changed, 1291 insertions(+), 1243 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index e6a8144e5..965dd8d4b 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -408,7 +408,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } var response *pb.GetEnvironmentReply - response, err = rpc.GetEnvironment(cxt, &pb.GetEnvironmentRequest{Id: args[0]}, grpc.EmptyCallOption{}) + response, err = rpc.GetEnvironment(cxt, &pb.GetEnvironmentRequest{Id: args[0], ShowWorkflowTree: true}, grpc.EmptyCallOption{}) if err != nil { return } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 15c5f9cdf..6ec82ea8f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1269,7 +1269,8 @@ type GetEnvironmentsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` } func (x *GetEnvironmentsRequest) Reset() { @@ -1311,6 +1312,13 @@ func (x *GetEnvironmentsRequest) GetShowAll() bool { return false } +func (x *GetEnvironmentsRequest) GetShowTaskInfos() bool { + if x != nil { + return x.ShowTaskInfos + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1717,7 +1725,8 @@ type GetEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ShowWorkflowTree bool `protobuf:"varint,2,opt,name=showWorkflowTree,proto3" json:"showWorkflowTree,omitempty"` } func (x *GetEnvironmentRequest) Reset() { @@ -1759,6 +1768,13 @@ func (x *GetEnvironmentRequest) GetId() string { return "" } +func (x *GetEnvironmentRequest) GetShowWorkflowTree() bool { + if x != nil { + return x.ShowWorkflowTree + } + return false +} + type GetEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4704,640 +4720,645 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, 0x16, 0x47, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x22, - 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, - 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, + 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, + 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, - 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, - 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, - 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, + 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, + 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, + 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, + 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, + 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, - 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, - 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, - 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, - 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, - 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, - 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, - 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, + 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, + 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, + 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, + 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 15c5f9cdf..6ec82ea8f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1269,7 +1269,8 @@ type GetEnvironmentsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` } func (x *GetEnvironmentsRequest) Reset() { @@ -1311,6 +1312,13 @@ func (x *GetEnvironmentsRequest) GetShowAll() bool { return false } +func (x *GetEnvironmentsRequest) GetShowTaskInfos() bool { + if x != nil { + return x.ShowTaskInfos + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1717,7 +1725,8 @@ type GetEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ShowWorkflowTree bool `protobuf:"varint,2,opt,name=showWorkflowTree,proto3" json:"showWorkflowTree,omitempty"` } func (x *GetEnvironmentRequest) Reset() { @@ -1759,6 +1768,13 @@ func (x *GetEnvironmentRequest) GetId() string { return "" } +func (x *GetEnvironmentRequest) GetShowWorkflowTree() bool { + if x != nil { + return x.ShowWorkflowTree + } + return false +} + type GetEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4704,640 +4720,645 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x32, 0x0a, 0x16, 0x47, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x22, - 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, - 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, + 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, + 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, - 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x27, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, - 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, - 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, - 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, + 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, + 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, + 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, + 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, + 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, + 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, + 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, - 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, - 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, - 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, - 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, - 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, - 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, - 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, + 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, + 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, + 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, + 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, + 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 553d98b7a..aa9ec16ca 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -168,6 +168,7 @@ message TeardownReply {} //////////////////////////////////////// message GetEnvironmentsRequest { bool showAll = 1; + bool showTaskInfos = 2; } message GetEnvironmentsReply { string frameworkId = 1; @@ -207,6 +208,7 @@ message NewAutoEnvironmentReply { message GetEnvironmentRequest { string id = 1; + bool showWorkflowTree = 2; } message GetEnvironmentReply { EnvironmentInfo environment = 1; diff --git a/core/server.go b/core/server.go index 7f78a7f44..74351a3f5 100644 --- a/core/server.go +++ b/core/server.go @@ -214,7 +214,6 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm Id: env.Id().String(), CreatedWhen: env.CreatedWhen().Format(time.RFC3339), State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), @@ -222,6 +221,9 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm UserVars: env.UserVars.Raw(), NumberOfFlps: int32(len(env.GetFLPs())), } + if request.GetShowTaskInfos() { + e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) + } e.IncludedDetectors = env.GetActiveDetectors().StringList() r.Environments = append(r.Environments, e) @@ -325,9 +327,11 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe UserVars: env.UserVars.Raw(), NumberOfFlps: int32(len(env.GetFLPs())), }, - Workflow: workflowToRoleTree(env.Workflow()), Public: env.Public, } + if req.GetShowWorkflowTree() { + reply.Workflow = workflowToRoleTree(env.Workflow()) + } reply.Environment.IncludedDetectors = env.GetActiveDetectors().StringList() return } From cf638b8df3d91a8c6cfaaba5a8ebec1eda2ecee5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Oct 2021 17:53:47 +0200 Subject: [PATCH 1058/2352] [core] Improve DCS client logging and run number cache --- core/integration/dcs/plugin.go | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 8131ee65e..3d44526c6 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -214,6 +214,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -233,6 +234,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_sor_parameters"] if !ok { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } @@ -243,6 +245,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("detector", det.String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Errorf("error processing DCS SOR parameters for detector %s", det.String()) return } @@ -267,6 +270,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS SOR") return } @@ -274,6 +278,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(fmt.Errorf("DCS client connection not available")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS SOR") return } @@ -287,6 +292,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS SOR") } var dcsEvent *dcspb.RunEvent @@ -294,16 +300,20 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if err == io.EOF { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("DCS SOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Warn("nil DCS event received") err = errors.New("nil DCS event") } - log.WithError(err).WithField("partition", envId). + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). Warn("bad DCS event received") break } @@ -312,12 +322,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Warn("DCS SOR failure") return } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("DCS SOR success") envId, ok := varStack["environment_id"] if !ok { @@ -329,6 +341,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("runNumber", runNumber64). Info("incoming DCS SOR event") } return @@ -491,6 +504,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { envId, ok := varStack["environment_id"] if !ok { log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). Warn("no environment_id found for DCS cleanup") return } @@ -498,13 +512,18 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { runNumber, ok := p.pendingEORs[envId] if !ok { log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). Debug("DCS cleanup: nothing to do") return } log.WithField("runNumber", runNumber). WithField("partition", envId). + WithField("level", infologger.IL_Devel). Debug("pending DCS EOR found, performing cleanup") + + delete(p.pendingEORs, envId) + return eorFunc(runNumber) } @@ -516,7 +535,8 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Det bytes := []byte(dcsDetectorsParam) err = json.Unmarshal(bytes, &detectorsSlice) if err != nil { - log.WithError(err).Error("error processing DCS detectors list") + log.WithError(err). + Error("error processing DCS detectors list") return } From a89003c19cb549cc6ebdffefb836cf681deee423 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Oct 2021 17:57:59 +0200 Subject: [PATCH 1059/2352] [core] Trigger client run number cache and Cleanup function --- core/integration/ctp/plugin.go | 197 +++++++++++++++++++++++++++------ 1 file changed, 162 insertions(+), 35 deletions(-) diff --git a/core/integration/ctp/plugin.go b/core/integration/ctp/plugin.go index b00677c17..90dbe4437 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/ctp/plugin.go @@ -35,6 +35,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" @@ -47,10 +48,12 @@ import ( const CTP_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - ctpHost string - ctpPort int + ctpHost string + ctpPort int - ctpClient *RpcClient + ctpClient *RpcClient + + pendingEORs map[string /*envId*/]int64 } func NewPlugin(endpoint string) integration.Plugin { @@ -68,6 +71,7 @@ func NewPlugin(endpoint string) integration.Plugin { ctpHost: u.Hostname(), ctpPort: portNumber, ctpClient: nil, + pendingEORs: make(map[string]int64), } } @@ -76,7 +80,7 @@ func (p *Plugin) GetName() string { } func (p *Plugin) GetPrettyName() string { - return "Central Trigger Processor" + return "Trigger System" } func (p *Plugin) GetEndpoint() string { @@ -118,13 +122,23 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + stack = make(map[string]interface{}) // global runs only stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing CTP Run load Request") + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + Debug("performing CTP Run load Request") globalConfig, ok := varStack["ctp_global_config"] - log.WithField("gloablConfig",globalConfig).Debug("not a CTP Global Run, continuing with CTP Run Start") + log.WithField("gloablConfig",globalConfig). + WithField("partition", envId). + Debug("not a CTP Global Run, continuing with CTP Run Start") if !ok { log.Debug("no CTP Global config set") globalConfig = "" @@ -135,13 +149,17 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { var runNumber64 int64 runNumber64, err := strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err).Error("cannot acquire run number for Run Load") + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Run Load") } ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" -all required must be ready - log.Debug("empty CTP detectors list provided") + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("empty CTP detectors list provided") ctpDetectorsParam = "" } @@ -153,7 +171,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { // standalone run if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { // we do not load any run cause it is standalone - log.Debug("not a CTP Global Run, continuing with CTP Run Start") + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("not a CTP Global Run, continuing with CTP Run Start") return } @@ -165,12 +185,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Load request") return } if p.ctpClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("CTP client connection not available")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Load request") return } @@ -180,15 +204,27 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Load request") + return } if response != nil { if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("Run Load failed") + return } } + // runLoad successful, we cache the run number for eventual cleanup + p.pendingEORs[envId] = runNumber64 + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("CTP RunLoad success") + return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing @@ -196,7 +232,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { runtimeConfig, ok := varStack["ctp_runtime_config"] if !ok { - log.Debug("no CTP config set, using default configuration") + log.WithField("partition", envId). + Debug("no CTP config set, using default configuration") runtimeConfig = "" } @@ -204,13 +241,17 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { var runNumber64 int64 runNumber64, err := strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err).Error("cannot acquire run number for Run Start") + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for Run Start") } ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" it is a global run - log.Debug("Detector for host is not available, starting global run") + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("Detector for host is not available, starting global run") ctpDetectorsParam = "" } @@ -234,12 +275,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Start request") return } if p.ctpClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("CTP client connection not available")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Start request") return } @@ -250,33 +295,34 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Start request") + return } if response != nil { if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("Run Start failed") + return } } + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("CTP RunStart success") return } - stack["RunStop"] = func() (out string) { - log.Debug("performing CTP Run Stop") - - rn := varStack["run_number"] - var runNumber64 int64 - var err error - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithError(err).Error("cannot acquire run number for CTP Run Stop") - } - + runStopFunc := func(runNumber64 int64) (out string) { ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { // "" it is a global run - log.Debug("Detector for host is not available, stoping global run") + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("Detector for host is not available, stoping global run") ctpDetectorsParam = "" } @@ -299,12 +345,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") return } if p.ctpClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("CTP client connection not available")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") return } @@ -314,27 +364,28 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") + return } if response != nil { if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("Run Stop failed") + return } } + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("CTP RunStop success") + return } - stack["RunUnload"] = func() (out string) { - log.Debug("performing CTP Run Unload") - - rn := varStack["run_number"] - var runNumber64 int64 - var err error - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithError(err).Error("cannot acquire run number for CTP Run Stop") - } + runUnloadFunc := func(runNumber64 int64) (out string) { ctpDetectorsParam, ok := varStack["ctp_detectors"] if !ok { @@ -348,7 +399,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { // if global run then unload if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { - log.Debug("not a CTP Global Run, skipping CTP Run Unload") + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("not a CTP Global Run, skipping CTP Run Unload") return } @@ -361,12 +414,16 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if p.ctpClient == nil { log.WithError(fmt.Errorf("CTP plugin not initialized")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") return } if p.ctpClient.GetConnState() != connectivity.Ready { log.WithError(fmt.Errorf("CTP client connection not available")). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") return } @@ -376,17 +433,87 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") + return } if response != nil { if response.Rc != 0 { log.WithField("response rc", response.Rc). WithField("Message", response.Msg). + WithField("partition", envId). + WithField("runNumber", runNumber64). Error("Run Unload failed") + return } } + + // RunUnload successful, we pop the run number from the cache + delete(p.pendingEORs, envId) + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("CTP RunUnload success") + return } + stack["RunStop"] = func() (out string) { + log.Debug("performing CTP Run Stop") + + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for CTP Run Stop") + } + + return runStopFunc(runNumber64) + } + stack["RunUnload"] = func() (out string) { + log.Debug("performing CTP Run Unload") + + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for CTP Run Stop") + } + + return runUnloadFunc(runNumber64) + } + stack["Cleanup"] = func() (out string) { + envId, ok := varStack["environment_id"] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Warn("no environment_id found for CTP cleanup") + return + } + + runNumber, ok := p.pendingEORs[envId] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("CTP cleanup: nothing to do") + return + } + + log.WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("pending CTP Stop/Unload found, performing cleanup") + + delete(p.pendingEORs, envId) + + _ = runStopFunc(runNumber) + return runUnloadFunc(runNumber) + } return } From 02e849c629d193807d67ec106b8c490fda4471ab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Oct 2021 18:28:13 +0200 Subject: [PATCH 1060/2352] [core] The ctp plugin is now called trg --- Makefile | 2 +- cmd/o2-aliecs-core/main.go | 8 +- core/integration/{ctp => trg}/client.go | 17 +- core/integration/{ctp => trg}/plugin.go | 202 +++++++++--------- .../{ctp => trg}/protos/ctpecs.pb.go | 0 .../{ctp => trg}/protos/ctpecs.proto | 0 .../{ctp => trg}/protos/ctpecs_grpc.pb.go | 0 7 files changed, 114 insertions(+), 115 deletions(-) rename core/integration/{ctp => trg}/client.go (88%) rename core/integration/{ctp => trg}/plugin.go (68%) rename core/integration/{ctp => trg}/protos/ctpecs.pb.go (100%) rename core/integration/{ctp => trg}/protos/ctpecs.proto (100%) rename core/integration/{ctp => trg}/protos/ctpecs_grpc.pb.go (100%) diff --git a/Makefile b/Makefile index 37aea30fe..07341f114 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/ctp +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/trg SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index e453012b6..7485aefca 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -30,10 +30,10 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" "github.com/AliceO2Group/Control/core/integration" - "github.com/AliceO2Group/Control/core/integration/ctp" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/odc" + "github.com/AliceO2Group/Control/core/integration/trg" log "github.com/sirupsen/logrus" "github.com/teo/logrus-prefixed-formatter" ) @@ -53,9 +53,9 @@ func init() { "odcEndpoint", odc.NewPlugin) integration.RegisterPlugin( - "ctp", - "ctpServiceEndpoint", - ctp.NewPlugin) + "trg", + "trgServiceEndpoint", + trg.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, diff --git a/core/integration/ctp/client.go b/core/integration/trg/client.go similarity index 88% rename from core/integration/ctp/client.go rename to core/integration/trg/client.go index 80ff72bb6..4b9293dde 100644 --- a/core/integration/ctp/client.go +++ b/core/integration/trg/client.go @@ -22,15 +22,14 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package ctp +package trg import ( "context" "time" "github.com/AliceO2Group/Control/common/logger" - ctpecs "github.com/AliceO2Group/Control/core/integration/ctp/protos" - ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" + trgecspb "github.com/AliceO2Group/Control/core/integration/trg/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" @@ -39,18 +38,18 @@ import ( "google.golang.org/grpc/keepalive" ) -var log = logger.New(logrus.StandardLogger(),"ctpclient") +var log = logger.New(logrus.StandardLogger(),"trgclient") type RpcClient struct { - ctpecspb.CTPdClient + trgecspb.CTPdClient conn *grpc.ClientConn } func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { log.WithFields(logrus.Fields{ "endpoint": endpoint, - }).Debug("dialing CTP endpoint") + }).Debug("dialing TRG endpoint") dialOptions := []grpc.DialOption { grpc.WithInsecure(), @@ -69,7 +68,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) PermitWithoutStream: true, }), } - if !viper.GetBool("ctpServiceUseSystemProxy") { + if !viper.GetBool("trgServiceUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) } conn, err := grpc.DialContext(cxt, @@ -100,7 +99,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) return } connState = conn.GetState() - log.Debugf("CTP client %s", connState.String()) + log.Debugf("TRG client %s", connState.String()) go notifyFunc(connState) case <- time.After(2 * time.Minute): if conn.GetState() != connectivity.Ready { @@ -113,7 +112,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) }() client := &RpcClient { - CTPdClient: ctpecs.NewCTPdClient(conn), + CTPdClient: trgecspb.NewCTPdClient(conn), conn: conn, } diff --git a/core/integration/ctp/plugin.go b/core/integration/trg/plugin.go similarity index 68% rename from core/integration/ctp/plugin.go rename to core/integration/trg/plugin.go index 90dbe4437..08b5299a5 100644 --- a/core/integration/ctp/plugin.go +++ b/core/integration/trg/plugin.go @@ -24,7 +24,7 @@ //go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto -package ctp +package trg import ( "context" @@ -38,20 +38,20 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" - ctpecspb "github.com/AliceO2Group/Control/core/integration/ctp/protos" + trgecspb "github.com/AliceO2Group/Control/core/integration/trg/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) -const CTP_DIAL_TIMEOUT = 2 * time.Second +const TRG_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - ctpHost string - ctpPort int + trgHost string + trgPort int - ctpClient *RpcClient + trgClient *RpcClient pendingEORs map[string /*envId*/]int64 } @@ -68,15 +68,15 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - ctpHost: u.Hostname(), - ctpPort: portNumber, - ctpClient: nil, + trgHost: u.Hostname(), + trgPort: portNumber, + trgClient: nil, pendingEORs: make(map[string]int64), } } func (p *Plugin) GetName() string { - return "ctp" + return "trg" } func (p *Plugin) GetPrettyName() string { @@ -84,34 +84,34 @@ func (p *Plugin) GetPrettyName() string { } func (p *Plugin) GetEndpoint() string { - return viper.GetString("ctpServiceEndpoint") + return viper.GetString("trgServiceEndpoint") } func (p *Plugin) GetConnectionState() string { - if p == nil || p.ctpClient == nil { + if p == nil || p.trgClient == nil { return "UNKNOWN" } - return p.ctpClient.conn.GetState().String() + return p.trgClient.conn.GetState().String() } func (p *Plugin) GetData(environmentIds []uid.ID) string { - if p == nil || p.ctpClient == nil { + if p == nil || p.trgClient == nil { return "" } return "" } func (p *Plugin) Init(instanceId string) error { - if p.ctpClient == nil { - callTimeout := CTP_DIAL_TIMEOUT + if p.trgClient == nil { + callTimeout := TRG_DIAL_TIMEOUT cxt, cancel := context.WithTimeout(context.Background(), callTimeout) - p.ctpClient = NewClient(cxt, cancel, viper.GetString("ctpServiceEndpoint")) - if p.ctpClient == nil { - return fmt.Errorf("failed to connect to CTP service on %s", viper.GetString("ctpServiceEndpoint")) + p.trgClient = NewClient(cxt, cancel, viper.GetString("trgServiceEndpoint")) + if p.trgClient == nil { + return fmt.Errorf("failed to connect to TRG service on %s", viper.GetString("trgServiceEndpoint")) } } - if p.ctpClient == nil { - return fmt.Errorf("failed to start CTP client on %s", viper.GetString("ctpServiceEndpoint")) + if p.trgClient == nil { + return fmt.Errorf("failed to start TRG client on %s", viper.GetString("trgServiceEndpoint")) } return nil } @@ -133,17 +133,17 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - Debug("performing CTP Run load Request") + Debug("performing TRG Run load Request") - globalConfig, ok := varStack["ctp_global_config"] + globalConfig, ok := varStack["trg_global_config"] log.WithField("gloablConfig",globalConfig). WithField("partition", envId). - Debug("not a CTP Global Run, continuing with CTP Run Start") + Debug("not a TRG Global Run, continuing with TRG Run Start") if !ok { - log.Debug("no CTP Global config set") + log.Debug("no TRG Global config set") globalConfig = "" } - // TODO (malexis): pass consul key to CTP if avail + // TODO (malexis): pass consul key to TRG if avail rn := varStack["run_number"] var runNumber64 int64 @@ -154,56 +154,56 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for Run Load") } - ctpDetectorsParam, ok := varStack["ctp_detectors"] + trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" -all required must be ready log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("empty CTP detectors list provided") - ctpDetectorsParam = "" + Debug("empty TRG detectors list provided") + trgDetectorsParam = "" } - detectors, err := p.parseDetectors(ctpDetectorsParam) + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { return } // standalone run - if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { // we do not load any run cause it is standalone log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("not a CTP Global Run, continuing with CTP Run Start") + Debug("not a TRG Global Run, continuing with TRG Run Start") return } - in := ctpecspb.RunLoadRequest{ + in := trgecspb.RunLoadRequest{ Runn: uint32(runNumber64), Detectors: detectors, Config: globalConfig, } - if p.ctpClient == nil { - log.WithError(fmt.Errorf("CTP plugin not initialized")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient == nil { + log.WithError(fmt.Errorf("TRG plugin not initialized")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Load request") return } - if p.ctpClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTP client connection not available")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("TRG client connection not available")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Load request") return } - var response *ctpecspb.RunReply - response, err = p.ctpClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) + var response *trgecspb.RunReply + response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Load request") @@ -223,17 +223,17 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { p.pendingEORs[envId] = runNumber64 log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("CTP RunLoad success") + Debug("TRG RunLoad success") return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing CTP Run Start") + log.Debug("performing TRG Run Start") - runtimeConfig, ok := varStack["ctp_runtime_config"] + runtimeConfig, ok := varStack["trg_runtime_config"] if !ok { log.WithField("partition", envId). - Debug("no CTP config set, using default configuration") + Debug("no TRG config set, using default configuration") runtimeConfig = "" } @@ -246,55 +246,55 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for Run Start") } - ctpDetectorsParam, ok := varStack["ctp_detectors"] + trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" it is a global run log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("Detector for host is not available, starting global run") - ctpDetectorsParam = "" + trgDetectorsParam = "" } - detectors, err := p.parseDetectors(ctpDetectorsParam) + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { return } // if global run then start with empty string in detectors - if len(strings.Split(detectors, " ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + if len(strings.Split(detectors, " ")) >= 2 || varStack["trg_global_run_enabled"] == "true" { // global run detectors "" detectors = "" } - in := ctpecspb.RunStartRequest{ + in := trgecspb.RunStartRequest{ Runn: uint32(runNumber64), Detector: detectors, Config: runtimeConfig, } - if p.ctpClient == nil { - log.WithError(fmt.Errorf("CTP plugin not initialized")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient == nil { + log.WithError(fmt.Errorf("TRG plugin not initialized")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Start request") return } - if p.ctpClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTP client connection not available")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("TRG client connection not available")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Start request") return } - var response *ctpecspb.RunReply + var response *trgecspb.RunReply - response, err = p.ctpClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Start request") @@ -312,58 +312,58 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("CTP RunStart success") + Debug("TRG RunStart success") return } runStopFunc := func(runNumber64 int64) (out string) { - ctpDetectorsParam, ok := varStack["ctp_detectors"] + trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" it is a global run log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("Detector for host is not available, stoping global run") - ctpDetectorsParam = "" + trgDetectorsParam = "" } - detectors, err := p.parseDetectors(ctpDetectorsParam) + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { return } // if global run then start with empty - if len(strings.Split(detectors, " ")) >= 2 || varStack["ctp_global_run_enabled"] == "true" { + if len(strings.Split(detectors, " ")) >= 2 || varStack["trg_global_run_enabled"] == "true" { // global run detectors "" detectors = "" } - in := ctpecspb.RunStopRequest{ + in := trgecspb.RunStopRequest{ Runn: uint32(runNumber64), Detector: detectors, } - if p.ctpClient == nil { - log.WithError(fmt.Errorf("CTP plugin not initialized")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient == nil { + log.WithError(fmt.Errorf("TRG plugin not initialized")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") return } - if p.ctpClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTP client connection not available")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("TRG client connection not available")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") return } - var response *ctpecspb.RunReply - response, err = p.ctpClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) + var response *trgecspb.RunReply + response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Stop request") @@ -381,58 +381,58 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { } log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("CTP RunStop success") + Debug("TRG RunStop success") return } runUnloadFunc := func(runNumber64 int64) (out string) { - ctpDetectorsParam, ok := varStack["ctp_detectors"] + trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { - ctpDetectorsParam = "" + trgDetectorsParam = "" } - detectors, err := p.parseDetectors(ctpDetectorsParam) + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { return } // if global run then unload - if len(strings.Split(detectors, " ")) < 2 && varStack["ctp_global_run_enabled"] == "false" { + if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("not a CTP Global Run, skipping CTP Run Unload") + Debug("not a TRG Global Run, skipping TRG Run Unload") return } - in := ctpecspb.RunStopRequest{ + in := trgecspb.RunStopRequest{ Runn: uint32(runNumber64), // "" when unloading global run Detector: "", } - if p.ctpClient == nil { - log.WithError(fmt.Errorf("CTP plugin not initialized")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient == nil { + log.WithError(fmt.Errorf("TRG plugin not initialized")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") return } - if p.ctpClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("CTP client connection not available")). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + if p.trgClient.GetConnState() != connectivity.Ready { + log.WithError(fmt.Errorf("TRG client connection not available")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") return } - var response *ctpecspb.RunReply - response, err = p.ctpClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) + var response *trgecspb.RunReply + response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("endpoint", viper.GetString("ctpServiceEndpoint")). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("partition", envId). WithField("runNumber", runNumber64). Error("failed to perform Run Unload request") @@ -453,12 +453,12 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingEORs, envId) log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("CTP RunUnload success") + Debug("TRG RunUnload success") return } stack["RunStop"] = func() (out string) { - log.Debug("performing CTP Run Stop") + log.Debug("performing TRG Run Stop") rn := varStack["run_number"] var runNumber64 int64 @@ -467,13 +467,13 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("partition", envId). - Error("cannot acquire run number for CTP Run Stop") + Error("cannot acquire run number for TRG Run Stop") } return runStopFunc(runNumber64) } stack["RunUnload"] = func() (out string) { - log.Debug("performing CTP Run Unload") + log.Debug("performing TRG Run Unload") rn := varStack["run_number"] var runNumber64 int64 @@ -482,7 +482,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("partition", envId). - Error("cannot acquire run number for CTP Run Stop") + Error("cannot acquire run number for TRG Run Stop") } return runUnloadFunc(runNumber64) @@ -492,7 +492,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if !ok { log.WithField("partition", envId). WithField("level", infologger.IL_Devel). - Warn("no environment_id found for CTP cleanup") + Warn("no environment_id found for TRG cleanup") return } @@ -500,14 +500,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { if !ok { log.WithField("partition", envId). WithField("level", infologger.IL_Devel). - Debug("CTP cleanup: nothing to do") + Debug("TRG cleanup: nothing to do") return } log.WithField("runNumber", runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). - Debug("pending CTP Stop/Unload found, performing cleanup") + Debug("pending TRG Stop/Unload found, performing cleanup") delete(p.pendingEORs, envId) @@ -523,7 +523,7 @@ func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err bytes := []byte(ctsDetectorsParam) err = json.Unmarshal(bytes, &detectorsSlice) if err != nil { - log.WithError(err).Error("error processing CTP detectors list") + log.WithError(err).Error("error processing TRG detectors list") return } @@ -532,5 +532,5 @@ func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err } func (p *Plugin) Destroy() error { - return p.ctpClient.Close() + return p.trgClient.Close() } diff --git a/core/integration/ctp/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go similarity index 100% rename from core/integration/ctp/protos/ctpecs.pb.go rename to core/integration/trg/protos/ctpecs.pb.go diff --git a/core/integration/ctp/protos/ctpecs.proto b/core/integration/trg/protos/ctpecs.proto similarity index 100% rename from core/integration/ctp/protos/ctpecs.proto rename to core/integration/trg/protos/ctpecs.proto diff --git a/core/integration/ctp/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go similarity index 100% rename from core/integration/ctp/protos/ctpecs_grpc.pb.go rename to core/integration/trg/protos/ctpecs_grpc.pb.go From a216f2d8e933faecc990cf14c945ec41b70937cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Oct 2021 18:43:54 +0200 Subject: [PATCH 1061/2352] [build] Bump to v0.27.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c6e2e0dd1..5f97e2c1d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 27 -VERSION_PATCH := 1 +VERSION_PATCH := 80 From d1c59a8ededdc5e0fe96ab83aa6b3e73f5baac79 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Oct 2021 14:22:16 +0200 Subject: [PATCH 1062/2352] [core] Greedy run number caching in DCS client --- core/integration/dcs/plugin.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 3d44526c6..21307290a 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -326,15 +326,18 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Warn("DCS SOR failure") return } + + // FIXME(teo): DCS should conclude each SOR/EOR with a final `RUN_OK` with detector name `DCS` + // this currently doesn't happen, so we have to be greedy with run number caching + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + p.pendingEORs[envId] = runNumber64 + } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS SOR success") - envId, ok := varStack["environment_id"] - if !ok { - break - } p.pendingEORs[envId] = runNumber64 break } @@ -469,6 +472,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Warn("DCS EOR failure") return } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). From 160b4ea3d1a7a67a987088e0c90bef39eddca253 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Oct 2021 16:29:19 +0200 Subject: [PATCH 1063/2352] [core] Track DCS operation status for each detector --- core/integration/dcs/plugin.go | 79 ++++++++++++++++++++++++++-------- 1 file changed, 62 insertions(+), 17 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 21307290a..37ac13f5c 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -183,8 +183,8 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(parameters) err := json.Unmarshal(bytes, &argMap) if err != nil { - log.WithField("partition", envId). - WithError(err). + log.WithError(err). + WithField("partition", envId). Error("error processing DCS SOR parameters") return } @@ -256,6 +256,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("detector", det.String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Errorf("error building parameter map for detector %s", det.String()) return } @@ -295,6 +296,12 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). Error("failed to perform DCS SOR") } + + detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) + for _, v := range detectors { + detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE + } + var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() @@ -327,11 +334,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } - // FIXME(teo): DCS should conclude each SOR/EOR with a final `RUN_OK` with detector name `DCS` - // this currently doesn't happen, so we have to be greedy with run number caching - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - p.pendingEORs[envId] = runNumber64 - } + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). @@ -347,16 +350,28 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). Info("incoming DCS SOR event") } + + dcsopOk := true + for _, v := range detectors { + if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { + dcsopOk = false + break + } + } + if dcsopOk { + p.pendingEORs[envId] = runNumber64 + } return } - eorFunc := func(runNumber int64) (out string) { // must formally return string even when we return nothing + eorFunc := func(runNumber64 int64) (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). WithField("level", infologger.IL_Ops). Info("performing DCS EOR") parameters, ok := varStack["dcs_eor_parameters"] if !ok { - log.WithField("partition", envId).Debug("no DCS EOR parameters set") + log.WithField("partition", envId). + Debug("no DCS EOR parameters set") parameters = "{}" } @@ -373,6 +388,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -384,13 +400,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.EorRequest{ - RunNumber: int32(runNumber), + RunNumber: int32(runNumber64), Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), } for i, det := range detectors { perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_eor_parameters"] if !ok { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } @@ -401,6 +418,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("detector", det.String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Errorf("error processing DCS EOR parameters for detector %s", det.String()) return } @@ -411,6 +429,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("detector", det.String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Errorf("error building parameter map for detector %s", det.String()) return } @@ -425,6 +444,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(fmt.Errorf("DCS plugin not initialized")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS EOR") return } @@ -432,6 +452,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(fmt.Errorf("DCS client connection not available")). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS EOR") return } @@ -445,23 +466,35 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("partition", envId). + WithField("runNumber", runNumber64). Error("failed to perform DCS EOR") } + + detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) + for _, v := range detectors { + detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE + } + var dcsEvent *dcspb.RunEvent for { dcsEvent, err = stream.Recv() if err == io.EOF { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("DCS EOR event stream EOF, closed") break // no more data } if err != nil || dcsEvent == nil { if dcsEvent == nil { log.WithField("partition", envId). + WithField("runNumber", runNumber64). Warn("nil DCS event received") err = errors.New("nil DCS event") } - log.WithError(err).Warn("bad DCS event received") + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). + Warn("bad DCS event received") break } @@ -469,18 +502,18 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). WithField("partition", envId). + WithField("runNumber", runNumber64). Warn("DCS EOR failure") return } + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). + WithField("runNumber", runNumber64). Debug("DCS EOR success") - envId, ok := varStack["environment_id"] - if !ok { - break - } delete(p.pendingEORs, envId) break } @@ -488,8 +521,20 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("runNumber", runNumber64). Info("incoming DCS EOR event") } + + dcsopOk := true + for _, v := range detectors { + if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { + dcsopOk = false + break + } + } + if dcsopOk { + delete(p.pendingEORs, envId) + } return } stack["EndOfRun"] = func() (out string) { @@ -526,9 +571,9 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Devel). Debug("pending DCS EOR found, performing cleanup") + out = eorFunc(runNumber) delete(p.pendingEORs, envId) - - return eorFunc(runNumber) + return } return From f56b18d399de5eb24f0497946583f36cdd2b59b8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Oct 2021 15:29:20 +0200 Subject: [PATCH 1064/2352] [core] Support weight in hook target/await expressions Lower weight -> runs/stops earlier within the a given trigger/await Higher weight -> runs/stops later Examples in order of execution: enter_RUNNING-100 enter_RUNNING (== enter_RUNNING+0) enter_RUNNING+2 after_START_ACTIVITY-9 after_START_ACTIVITY DESTROY-1 DESTROY DESTROY+1 DESTROY+300 Weight has no relation to wall time! Its only purpose is to define without ambiguity the order in which hook events must be resolved. --- core/environment/environment.go | 124 ++++++++++++++++---------- core/environment/manager.go | 58 +++++++----- core/environment/transition_deploy.go | 2 +- core/workflow/aggregator.go | 25 +++++- core/workflow/callable/call.go | 61 +++++++++++++ core/workflow/callrole.go | 30 ++++++- core/workflow/role.go | 3 +- core/workflow/taskrole.go | 28 +++++- 8 files changed, 254 insertions(+), 77 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 7bac5dff6..ce05ffc86 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -76,7 +76,7 @@ type Environment struct { eventStream Subscription Public bool // From workflow or user - callsPendingAwait map[string /*await expression*/]callable.Calls + callsPendingAwait map[string /*await expression, trigger only*/]callable.CallsMap } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -102,7 +102,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { UserVars: gera.MakeStringMapWithMap(userVars), stateChangedCh: make(chan *event.TasksStateChangedEvent), - callsPendingAwait: make(map[string]callable.Calls), + callsPendingAwait: make(map[string]callable.CallsMap), } // Make the KVs accessible to the workflow via ParentAdapter @@ -210,56 +210,90 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) // Starting point: get all hooks to be started for the current trigger - allHooks := workflow.GetHooksForTrigger(trigger) - - // Hooks can be call hooks or task hooks, we do the calls first - callsToStart := allHooks.FilterCalls() - if len(callsToStart) != 0 { - // Before we run anything asynchronously we must associate each call we're about - // to start with its corresponding await expression - for _, call := range callsToStart { - awaitExpr := call.GetTraits().Await - // If the callsPendingAwait map has no pending calls list for the given await expression, - // we make sure it's created before we add any pending awaits. - if _, ok := env.callsPendingAwait[awaitExpr]; !ok || len(env.callsPendingAwait[awaitExpr]) == 0 { - env.callsPendingAwait[awaitExpr] = make(callable.Calls, 0) - } - env.callsPendingAwait[awaitExpr] = append(env.callsPendingAwait[awaitExpr], call) - } - callsToStart.StartAll() // returns immediately (async) - } + hooksMapForTrigger := workflow.GetHooksMapForTrigger(trigger) + callsMapForAwait := env.callsPendingAwait[trigger] - // Then we take care of any pending hooks whose await expression corresponds to the current trigger, - // including any tasks that have just been started (for which trigger == call.Trigger == call.Await). - // TODO: this should be further refined by adding priority/weight - callErrors := make(map[*callable.Call]error) - pendingCalls, ok := env.callsPendingAwait[trigger] - if ok && len(pendingCalls) != 0 { // there are hooks to take care of - // AwaitAll blocks with no global timeout - it is up to the specific called function to implement - // a timeout internally. - // The Call instance pushes to the call's varStack some special values including the timeout - // (provided by the workflow template). At that point the integration plugin must acquire the - // timeout value and use the Context mechanism or some other approach to ensure the timeouts are - // respected. - - callErrors = pendingCalls.AwaitAll() + allWeightsSet := make(callable.HooksMap) + for k, _ := range hooksMapForTrigger { + allWeightsSet[k] = callable.Hooks{} } - - // Tasks are handled separately for now, and they cannot have trigger!=await - hooksToTrigger := allHooks.FilterTasks() - taskErrors := env.runTasksAsHooks(hooksToTrigger) // blocking call, timeouts in executor + for k, _ := range callsMapForAwait { + allWeightsSet[k] = callable.Hooks{} + } + allWeights := allWeightsSet.GetWeights() // Prepare structures to accumulate errors allErrors := make(map[callable.Hook]error) criticalFailures := make([]error, 0) - // We merge hook call errors and hook task errors into a single map for - // critical trait processing - for hook, err := range callErrors { - allErrors[hook] = err - } - for hook, err := range taskErrors { - allErrors[hook] = err + // FOR EACH weight within the current state machine trigger moment + // 4 phases: start calls, await calls, execute task hooks, error handling + for _, weight := range allWeights { + hooksForWeight, ok := hooksMapForTrigger[weight] + if ok { + // PHASE 1: start asynchronously any call hooks and add them to the pending await map + + // Hooks can be call hooks or task hooks, we do the calls first + callsToStart := hooksForWeight.FilterCalls() + if len(callsToStart) != 0 { + // Before we run anything asynchronously we must associate each call we're about + // to start with its corresponding await expression + for _, call := range callsToStart { + awaitExpr := call.GetTraits().Await + + awaitName, awaitWeight := callable.ParseTriggerExpression(awaitExpr) + + // If the callsPendingAwait map has no pending calls list for the given await expression + // (await name + await weight), we make sure the per-name map and per-weight slice are + // created before we add any pending awaits. + if _, ok := env.callsPendingAwait[awaitName]; !ok || len(env.callsPendingAwait[awaitName]) == 0 { + env.callsPendingAwait[awaitName] = make(callable.CallsMap) + } + if _, ok := env.callsPendingAwait[awaitName][awaitWeight]; !ok || len(env.callsPendingAwait[awaitName][awaitWeight]) == 0 { + env.callsPendingAwait[awaitName][awaitWeight] = make(callable.Calls, 0) + } + env.callsPendingAwait[awaitName][awaitWeight] = append( + env.callsPendingAwait[awaitName][awaitWeight], call) + } + callsToStart.StartAll() // returns immediately (async) + } + + // PHASE 2: collect any calls awaiting termination + + // We take care of any pending hooks whose await expression corresponds to the current trigger, + // including any calls that have just been started (for which trigger == call.Trigger == call.Await). + callErrors := make(map[*callable.Call]error) + if _, ok := env.callsPendingAwait[trigger]; ok { + pendingCalls, ok := env.callsPendingAwait[trigger][weight] + if ok && len(pendingCalls) != 0 { // meaning there are hook calls to take care of + // AwaitAll blocks with no global timeout - it is up to the specific called function to implement + // a timeout internally. + // The Call instance pushes to the call's varStack some special values including the timeout + // (provided by the workflow template). At that point the integration plugin must acquire the + // timeout value and use the Context mechanism or some other approach to ensure the timeouts are + // respected. + + callErrors = pendingCalls.AwaitAll() + } + } + + // PHASE 3: start and finish any task hooks (synchronous!) + + // Tasks are handled separately for now, and they must have trigger==await + hookTasksToTrigger := hooksForWeight.FilterTasks() + taskErrors := env.runTasksAsHooks(hookTasksToTrigger) // blocking call, timeouts in executor + + // PHASE 4: collect any errors + + // We merge hook call errors and hook task errors into a single map for + // critical trait processing + for hook, err := range callErrors { + allErrors[hook] = err + } + for hook, err := range taskErrors { + allErrors[hook] = err + } + } //validity of hooksForWeight } for hook, err := range allErrors { diff --git a/core/environment/manager.go b/core/environment/manager.go index ef9bdb574..cbde56a18 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -279,16 +279,26 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error tasksToRelease := env.Workflow().GetTasks() // we gather all DESTROY/after_DESTROY hooks, as these require special treatment - destroyHooks := env.Workflow().GetHooksForTrigger("DESTROY") - destroyHooks = append(destroyHooks, env.Workflow().GetHooksForTrigger("after_DESTROY")...) - - // for each found DESTROY hook, - // for each of *all* tasks last-to-first - // if the pointed task is one of the known cleanup hooks, remove it - for _, hook := range destroyHooks { - for i := len(tasksToRelease)-1; i >= 0; i-- { - if hook == tasksToRelease[i] { - tasksToRelease = append(tasksToRelease[:i], tasksToRelease[i+1:]...) + hooksMapForDestroy := env.Workflow().GetHooksMapForTrigger("DESTROY") + for k, v := range env.Workflow().GetHooksMapForTrigger("after_DESTROY") { + hooksMapForDestroy[k] = v + } + + allWeights := hooksMapForDestroy.GetWeights() + + // for each weight within DESTROY + // for each found DESTROY hook, + // for each of *all* tasks last-to-first + // if the pointed task is one of the known cleanup hooks, remove it + for _, weight := range allWeights { + hooksForWeight, ok := hooksMapForDestroy[weight] + if ok { + for _, hook := range hooksForWeight { + for i := len(tasksToRelease)-1; i >= 0; i-- { + if hook == tasksToRelease[i] { + tasksToRelease = append(tasksToRelease[:i], tasksToRelease[i+1:]...) + } + } } } } @@ -302,12 +312,11 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } delete(envs.pendingStateChangeCh, environmentId) envs.mu.Unlock() - // We set all callRoles to INACTIVE right now, because there's no task activation for them. // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. - allHooks := env.Workflow().GetHooksForTrigger("") // no trigger = all hooks + allHooks := env.Workflow().GetAllHooks() callHooks := allHooks.FilterCalls() // get the calls if len(callHooks) > 0 { for _, h := range callHooks { @@ -342,16 +351,23 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } - // we trigger all cleanup hooks - destroyHooks.FilterCalls().CallAll() - cleanupTaskHooks := destroyHooks.FilterTasks() - err = envs.taskman.TriggerHooks(cleanupTaskHooks) - if err != nil { - log.WithError(err).Warn("environment post-destroy hooks failed") - } + // we trigger all cleanup hooks, first calls, then tasks immediately after + for _, weight := range allWeights { + hooksForWeight, ok := hooksMapForDestroy[weight] + if ok { + hooksForWeight.FilterCalls().CallAll() - // and then we kill them too - taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupTaskHooks, nil) + // calls done, we start the task hooks... + cleanupTaskHooks := hooksForWeight.FilterTasks() + err = envs.taskman.TriggerHooks(cleanupTaskHooks) + if err != nil { + log.WithError(err).Warn("environment post-destroy hooks failed") + } + + // and then we kill them too + taskmanMessage = task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, cleanupTaskHooks, nil) + } + } // we remake the pending teardown channel too, because each completed TasksReleasedEvent // automatically closes it diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 6efccc54d..ba09f47b5 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -158,7 +158,7 @@ func (t DeployTransition) do(env *Environment) (err error) { // We set all callRoles to ACTIVE right now, because there's no task activation for them. // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. - allHooks := wf.GetHooksForTrigger("") // no trigger = all hooks + allHooks := wf.GetAllHooks() callHooks := allHooks.FilterCalls() // get the calls if len(callHooks) > 0 { for _, h := range callHooks { diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index a83151a14..4642d34ed 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -153,14 +153,35 @@ func (r *aggregator) GetTasks() (tasks task.Tasks) { return } -func (r *aggregator) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { +func (r *aggregator) GetHooksMapForTrigger(trigger string) (hooksMap callable.HooksMap) { + if r == nil { + return make(callable.HooksMap) + } + + hooksMap = make(callable.HooksMap) + for _, role := range r.GetRoles() { + childHooksMap := role.GetHooksMapForTrigger(trigger) + + for k, v := range childHooksMap { + _, exists := hooksMap[k] + if exists && len(hooksMap[k]) > 0 { + hooksMap[k] = append(hooksMap[k], v...) + } else { + hooksMap[k] = v + } + } + } + return +} + +func (r *aggregator) GetAllHooks() (hooks callable.Hooks) { if r == nil { return nil } hooks = make(callable.Hooks, 0) for _, role := range r.GetRoles() { - hooks = append(hooks, role.GetHooksForTrigger(trigger)...) + hooks = append(hooks, role.GetAllHooks()...) } return } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 864c9d95f..001ddd958 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -26,7 +26,9 @@ package callable import ( "fmt" + "sort" "strconv" + "strings" "sync" texttemplate "text/template" "time" @@ -45,8 +47,11 @@ import ( var log = logger.New(logrus.StandardLogger(), "callable") +type HookWeight int type Calls []*Call type Hooks []Hook +type HooksMap map[HookWeight]Hooks +type CallsMap map[HookWeight]Calls type Hook interface { GetParentRole() interface{} @@ -65,6 +70,62 @@ type Call struct { await chan error } +func ParseTriggerExpression(triggerExpr string) (triggerName string, triggerWeight HookWeight) { + var ( + triggerWeightS string + triggerWeightI int + err error + ) + + // Split the trigger expression of this task by + or - + if splitIndex := strings.LastIndexFunc(triggerExpr, func(r rune) bool { + return r == '+' || r == '-' + }); splitIndex >= 0 { + triggerName, triggerWeightS = triggerExpr[:splitIndex], triggerExpr[splitIndex:] + } else { + triggerName, triggerWeightS = triggerExpr, "+0" + } + + triggerWeightI, err = strconv.Atoi(triggerWeightS) + if err != nil { + log.Warnf("invalid trigger weight definition %s, defaulting to %s", triggerExpr, triggerName + "+0") + triggerWeightI = 0 + } + triggerWeight = HookWeight(triggerWeightI) + + return +} + +func (m HooksMap) GetWeights() []HookWeight { + weights := make([]int, len(m)) + for k, v := range m { + if len(v) != 0 { + weights = append(weights, int(k)) + } + } + sort.Ints(weights) + out := make([]HookWeight, len(weights)) + for i, v := range weights{ + out[i] = HookWeight(v) + } + return out +} + +func (m CallsMap) GetWeights() []HookWeight { + weights := make([]int, len(m)) + for k, v := range m { + if len(v) != 0 { + weights = append(weights, int(k)) + } + } + sort.Ints(weights) + out := make([]HookWeight, len(weights)) + for i, v := range weights{ + out[i] = HookWeight(v) + } + return out +} + func (s Hooks) FilterCalls() (calls Calls) { calls = make(Calls, 0) for _, v := range s { diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 281f00cad..f5feb93f0 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -226,17 +226,41 @@ func (t *callRole) GetTasks() task.Tasks { return []*task.Task{} } -func (t *callRole) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { +func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMap) { + if len(trigger) == 0 { + return make(callable.HooksMap) + } + cvs, err := t.ConsolidatedVarStack() defer t.updateState(task.INVARIANT) if err != nil { - return []callable.Hook{} + return make(callable.HooksMap) } // If a trigger is defined for this role && // If the input trigger is empty OR a positive match... - if len(t.Trigger) > 0 && (len(trigger) == 0 || t.Trigger == trigger) { + if len(t.Trigger) > 0 { + triggerName, triggerWeight := callable.ParseTriggerExpression(t.Trigger) + if trigger == triggerName { + return callable.HooksMap{ + triggerWeight: callable.Hooks{callable.NewCall(t.FuncCall, t.ReturnVar, cvs, t)}, + } + } + } + return make(callable.HooksMap) +} + +func (t *callRole) GetAllHooks() callable.Hooks { + cvs, err := t.ConsolidatedVarStack() + defer t.updateState(task.INVARIANT) + + if err != nil { + return callable.Hooks{} + } + + // If a trigger is defined for this role + if len(t.Trigger) > 0 { return []callable.Hook{ callable.NewCall(t.FuncCall, t.ReturnVar, cvs, t), } diff --git a/core/workflow/role.go b/core/workflow/role.go index 46cf7733d..93b57e354 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -59,7 +59,8 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) - GetHooksForTrigger(trigger string) callable.Hooks + GetHooksMapForTrigger(trigger string) callable.HooksMap + GetAllHooks() callable.Hooks IsEnabled() bool GetCurrentRunNumber() uint32 ConsolidatedVarStack() (varStack map[string]string, err error) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 6654ca2a6..7fae3bdba 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -246,14 +246,34 @@ func (t *taskRole) GetTasks() task.Tasks { return []*task.Task{t.GetTask()} } -func (t *taskRole) GetHooksForTrigger(trigger string) (hooks callable.Hooks) { +func (t *taskRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMap) { if ttask := t.GetTask(); ttask == nil { - return []callable.Hook{} + return make(callable.HooksMap) + } + if len(trigger) == 0 { + return make(callable.HooksMap) } // If a trigger is defined for this role && - // If the input trigger is empty OR a positive match... - if len(t.Trigger) > 0 && (len(trigger) == 0 || t.Trigger == trigger) { + // If the input trigger is a positive match... + if len(t.Trigger) > 0 { + triggerName, triggerWeight := callable.ParseTriggerExpression(t.Trigger) + if trigger == triggerName { + return callable.HooksMap{ + triggerWeight: callable.Hooks{t.GetTask()}, + } + } + } + return make(callable.HooksMap) +} + +func (t *taskRole) GetAllHooks() callable.Hooks { + if ttask := t.GetTask(); ttask == nil { + return []callable.Hook{} + } + + // If a trigger is defined for this role + if len(t.Trigger) > 0 { return []callable.Hook{t.GetTask()} } return []callable.Hook{} From a13ff9484fa60334ad45baad289c2d0a045afece Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Oct 2021 16:54:51 +0200 Subject: [PATCH 1065/2352] [core] New plugin "testplugin" with call testplugin.Noop() --- cmd/o2-aliecs-core/main.go | 5 + core/integration/testplugin/plugin.go | 137 ++++++++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 core/integration/testplugin/plugin.go diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index 7485aefca..1149979cb 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/odc" + "github.com/AliceO2Group/Control/core/integration/testplugin" "github.com/AliceO2Group/Control/core/integration/trg" log "github.com/sirupsen/logrus" "github.com/teo/logrus-prefixed-formatter" @@ -56,6 +57,10 @@ func init() { "trg", "trgServiceEndpoint", trg.NewPlugin) + integration.RegisterPlugin( + "testplugin", + "testPluginEndpoint", + testplugin.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ FullTimestamp: true, diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go new file mode 100644 index 000000000..e60414ab5 --- /dev/null +++ b/core/integration/testplugin/plugin.go @@ -0,0 +1,137 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package testplugin + +import ( + "strconv" + "time" + + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/workflow/callable" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +const ( + TESTPLUGIN_GENERAL_OP_TIMEOUT = 15 * time.Second +) + +type Plugin struct { +} + +func NewPlugin(endpoint string) integration.Plugin { + log.WithField("endpoint", endpoint). + Info("initializing test plugin, DO NOT USE IN PRODUCTION") + + return &Plugin{} +} + +func (p *Plugin) GetName() string { + return "testplugin" +} + +func (p *Plugin) GetPrettyName() string { + return "Test plugin" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("testPluginEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + return "READY" +} + +func (p *Plugin) GetData(_ []uid.ID) string { + return "" +} + +func (p *Plugin) Init(_ string) error { + log.Debug("Test plugin initialized") + return nil +} + +func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + + message, ok := varStack["testplugin_message"] + if !ok { + log.Warn("cannot acquire testplugin message") + message = "running testplugin.Noop" + return + } + + stack = make(map[string]interface{}) + stack["Noop"] = func() (out string) { // must formally return string even when we return nothing + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("rolepath", call.GetParentRolePath()). + WithField("trigger", call.GetTraits().Trigger). + WithField("await", call.GetTraits().Await). + Infof("executing testplugin.Noop call: %s", message) + + rn := varStack["run_number"] + var ( + runNumber64 int64 + err error + ) + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for testplugin.Noop") + } + + timeout := callable.AcquireTimeout(TESTPLUGIN_GENERAL_OP_TIMEOUT, varStack, "Noop", envId) + defer log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("rolepath", call.GetParentRolePath()). + WithField("trigger", call.GetTraits().Trigger). + WithField("await", call.GetTraits().Await). + WithField("runNumber", runNumber64). + Infof("executed testplugin.Noop call in %s", timeout) + + time.Sleep(timeout) + + return + } + + return +} + +func (p *Plugin) Destroy() error { + return nil +} From 4a1cad186e89fe1c7f585f882f1e35b702135910 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Oct 2021 17:44:53 +0200 Subject: [PATCH 1066/2352] [core] Ensure the testplugin can be loaded --- core/config.go | 2 ++ core/integration/testplugin/plugin.go | 12 ++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/core/config.go b/core/config.go index 6558288bb..903de9f98 100644 --- a/core/config.go +++ b/core/config.go @@ -103,6 +103,7 @@ func setDefaults() error { viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("odcEndpoint", "//127.0.0.1:50053") viper.SetDefault("odcUseSystemProxy", false) + viper.SetDefault("testPluginEndpoint", "//127.0.0.1:00000") viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") @@ -155,6 +156,7 @@ func setFlags() error { pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("odcEndpoint", viper.GetString("odcEndpoint"), "Endpoint of the ODC gRPC service (`host:port`)") pflag.Bool("odcUseSystemProxy", viper.GetBool("odcUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") + pflag.String("testPluginEndpoint", viper.GetString("testPluginEndpoint"), "Endpoint of the TEST plugin, actually a NOOP") pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index e60414ab5..2f23e0d62 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -28,16 +28,19 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/workflow/callable" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/spf13/viper" ) +var log = logger.New(logrus.StandardLogger(),"testplugin") + const ( - TESTPLUGIN_GENERAL_OP_TIMEOUT = 15 * time.Second + TESTPLUGIN_GENERAL_OP_TIMEOUT = 3 * time.Second ) type Plugin struct { @@ -89,7 +92,6 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { message, ok := varStack["testplugin_message"] if !ok { - log.Warn("cannot acquire testplugin message") message = "running testplugin.Noop" return } @@ -110,9 +112,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { ) runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for testplugin.Noop") + runNumber64 = 0 } timeout := callable.AcquireTimeout(TESTPLUGIN_GENERAL_OP_TIMEOUT, varStack, "Noop", envId) From 993cc1f0990ace6ae68f8435178df3ae6cd34194 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Oct 2021 17:45:11 +0200 Subject: [PATCH 1067/2352] [core] Fix hook call weights list generation --- core/workflow/callable/call.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 001ddd958..cf21e0489 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -98,10 +98,10 @@ func ParseTriggerExpression(triggerExpr string) (triggerName string, triggerWeig func (m HooksMap) GetWeights() []HookWeight { weights := make([]int, len(m)) - for k, v := range m { - if len(v) != 0 { - weights = append(weights, int(k)) - } + i := 0 + for k, _ := range m { + weights[i] = int(k) + i++ } sort.Ints(weights) out := make([]HookWeight, len(weights)) @@ -113,10 +113,10 @@ func (m HooksMap) GetWeights() []HookWeight { func (m CallsMap) GetWeights() []HookWeight { weights := make([]int, len(m)) - for k, v := range m { - if len(v) != 0 { - weights = append(weights, int(k)) - } + i := 0 + for k, _ := range m { + weights[i] = int(k) + i++ } sort.Ints(weights) out := make([]HookWeight, len(weights)) From 38e10c9dc28ef9b28ae27cbfa166202719586908 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Oct 2021 09:39:01 +0200 Subject: [PATCH 1068/2352] [build] Bump to v0.28.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 5f97e2c1d..72fb35356 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 27 -VERSION_PATCH := 80 +VERSION_MINOR := 28 +VERSION_PATCH := 0 From e7a77e555c5020f0b06fdeab69c9dff01b5c54e7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Nov 2021 17:34:37 +0100 Subject: [PATCH 1069/2352] [core] Add ObjectStack + CallStack to plugin system The old ObjectStack is now CallStack, and it only applies to the hook call context. Objects that need to be exposed to the general context live in the new ObjectStack call. --- configuration/template/fields.go | 5 +++++ configuration/template/stack.go | 5 +++++ core/integration/dcs/plugin.go | 6 +++++- core/integration/ddsched/plugin.go | 6 +++++- core/integration/plugin.go | 16 +++++++++++++--- core/integration/testplugin/plugin.go | 6 +++++- core/integration/trg/plugin.go | 6 +++++- core/workflow/callable/call.go | 2 +- 8 files changed, 44 insertions(+), 8 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 30f473b3e..0385e9179 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -212,6 +212,11 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va environment[k] = v } + pluginObjects := MakePluginObjectStack(varStack) + for k, v := range pluginObjects { + environment[k] = v + } + for _, field := range fields { buf := new(bytes.Buffer) // FIXME: the line below implements the cache diff --git a/configuration/template/stack.go b/configuration/template/stack.go index d8cb1c255..48133df32 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/core/integration" "github.com/sirupsen/logrus" ) @@ -150,6 +151,10 @@ func MakeConfigAccessFuncsMultiVar(confSvc ConfigurationService, varStack map[st } } +func MakePluginObjectStack(varStack map[string]string) map[string]interface{} { + return integration.PluginsInstance().ObjectStack(varStack) +} + func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 37ac13f5c..b3ad81bb8 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -154,7 +154,11 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { return diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index bec3e8095..1147931d2 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -148,7 +148,11 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { return diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 6260965d3..2f3bd23c1 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -53,7 +53,8 @@ type Plugin interface { GetData(environmentIds []uid.ID) string Init(instanceId string) error - ObjectStack(data interface{}) map[string]interface{} + CallStack(data interface{}) map[string]interface{} // used in hook call context + ObjectStack(varStack map[string]string) map[string]interface{} // all other ProcessTemplates contexts Destroy() error } @@ -104,10 +105,19 @@ func (p Plugins) DestroyAll() { } } -func (p Plugins) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p Plugins) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) for _, plugin := range p { - s := plugin.ObjectStack(data) + s := plugin.CallStack(data) + stack[plugin.GetName()] = s + } + return +} + +func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + for _, plugin := range p { + s := plugin.ObjectStack(varStack) stack[plugin.GetName()] = s } return diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 2f23e0d62..eec4cb8c3 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -78,7 +78,11 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { return diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 08b5299a5..9116bf119 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -116,7 +116,11 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { return diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index cf21e0489..c582c91c9 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -212,7 +212,7 @@ func (c *Call) Call() error { c.VarStack["__call_critical"] = strconv.FormatBool(c.Traits.Critical) c.VarStack["__call_rolepath"] = c.GetParentRolePath() - objStack := integration.PluginsInstance().ObjectStack(c) + objStack := integration.PluginsInstance().CallStack(c) err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) if err != nil { From c81d4999552ba63237a6450980aaa8b3ac77f072 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Nov 2021 17:38:55 +0100 Subject: [PATCH 1070/2352] [core] Support script vs topology alternatives in ODC calls --- core/integration/odc/handlers.go | 43 ++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 901accf57..00841ce7e 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -498,7 +498,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } -func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, arguments map[string]string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -508,13 +508,17 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s defer log.Trace("END handleRun") // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE - var topology, plugin, resources string + var topology, script, plugin, resources string exists := false topology, exists = arguments["topology"] - if !exists || len(topology) == 0 { + if isManualXml && (!exists || len(topology) == 0) { return errors.New("empty topology received") } + script, exists = arguments["script"] + if !isManualXml && (!exists || len(script) == 0) { + return errors.New("empty script received") + } plugin, exists = arguments["plugin"] if !exists || len(plugin) == 0 { return errors.New("empty plugin received") @@ -526,11 +530,16 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s runRequest := &odcpb.RunRequest{ Partitionid: envId, - Topology: topology, Plugin: plugin, Resources: resources, } + if isManualXml { + runRequest.Topology = topology + } else { + runRequest.Script = script + } + var err error = nil var runResponse *odcpb.GeneralReply @@ -551,18 +560,18 @@ func handleRun(ctx context.Context, odcClient *RpcClient, arguments map[string]s return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) } log.WithFields(logrus.Fields{ - "odcMsg": runResponse.Msg, - "odcStatus": runResponse.Status.String(), - "odcExectime": runResponse.Exectime, - "odcRunid": runResponse.Partitionid, - "odcSessionid": runResponse.Sessionid, - }). + "odcMsg": runResponse.Msg, + "odcStatus": runResponse.Status.String(), + "odcExectime": runResponse.Exectime, + "odcRunid": runResponse.Partitionid, + "odcSessionid": runResponse.Sessionid, + }). Debug("call to ODC complete") return err } -func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, topology string, plugin string, resources string, envId string) error { +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -588,11 +597,13 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st i++ } - err = handleRun(ctx, odcClient, map[string]string{ - "topology": topology, - "plugin": plugin, - "resources": resources, - }, envId) + err = handleRun(ctx, odcClient, isManualXml, map[string]string{ + "topology": topology, + "script": script, + "plugin": plugin, + "resources": resources, + }, + envId) if err != nil { return printGrpcError(err) } From bbd88320446d7965af31ab25ef821fa4e1acc157 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 Nov 2021 17:42:10 +0100 Subject: [PATCH 1071/2352] [core] Implementation of GenerateEPNWorkflowScript + usage in Configure --- core/integration/odc/plugin.go | 342 ++++++++++++++++++++++++++++++++- 1 file changed, 337 insertions(+), 5 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 28855a3b2..57de737c1 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -140,7 +140,290 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + + stack["GenerateEPNWorkflowScript"] = func() (out string) { + /* OCTRL-558 example: + GEN_TOPO_HASH=[0/1] GEN_TOPO_SOURCE=[...] DDMODE=[TfBuilder Mode] GEN_TOPO_LIBRARY_FILE=[...] + GEN_TOPO_WORKFLOW_NAME=[...] WORKFLOW_DETECTORS=[...] WORKFLOW_DETECTORS_QC=[...] + WORKFLOW_DETECTORS_CALIB=[...] WORKFLOW_PARAMETERS=[...] RECO_NUM_NODES_OVERRIDE=[...] + MULTIPLICITY_FACTOR_RAWDECODERS=[...] MULTIPLICITY_FACTOR_CTFENCODERS=[...] + MULTIPLICITY_FACTOR_REST=[...] GEN_TOPO_WIPE_CACHE=[0/1] BEAMTYPE=[PbPb/pp/pPb/cosmic/technical] + NHBPERTF=[...] GEN_TOPO_PARTITION=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] + /home/epn/pdp/gen_topo.sh + */ + + var ( + pdpConfigOption, o2DPSource, tfbDDMode string + pdpLibraryFile, pdpLibWorkflowName string + pdpDetectorList, pdpDetectorListQc, pdpDetectorListCalib string + pdpWorkflowParams, pdpNrComputeNodes string + pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string + pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string + pdpExtraEnvVars, pdpGeneratorScriptPath string + ok bool + accumulator []string + ) + accumulator = make([]string, 0) + + pdpConfigOption, ok = varStack["pdp_config_option"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow configuration mode") + return + } + + switch pdpConfigOption { + case "Repository hash": + o2DPSource, ok = varStack["pdp_o2_data_processing_hash"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP Repository hash") + return + } + accumulator = append(accumulator, "GEN_TOPO_HASH=1") + + case "Repository path": + o2DPSource, ok = varStack["pdp_o2_data_processing_path"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP Repository path") + return + } + accumulator = append(accumulator, "GEN_TOPO_HASH=0") + + case "Manual XML": fallthrough + default: + return + } + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_SOURCE='%s'", o2DPSource)) + + tfbDDMode, ok = varStack["tfb_dd_mode"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire TF Builder mode") + return + } + accumulator = append(accumulator, fmt.Sprintf("DDMODE='%s'", tfbDDMode)) + + pdpLibraryFile, ok = varStack["pdp_topology_description_library_file"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire topology description library file") + return + } + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_LIBRARY_FILE='%s'", pdpLibraryFile)) + + pdpLibWorkflowName, ok = varStack["pdp_workflow_name"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow name in topology library file") + return + } + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WORKFLOW_NAME='%s'", pdpLibWorkflowName)) + + pdpDetectorList, ok = varStack["pdp_detector_list_global"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow name in topology library file") + return + } + if strings.TrimSpace(pdpDetectorList) == "ALL" { + pdpDetectorList, ok = varStack["detectors"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire general detector list from varStack") + return + } + detectorsSlice, err := p.parseDetectors(pdpDetectorList) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse general detector list") + return + } + pdpDetectorList = strings.Join(detectorsSlice, ",") + } + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", pdpDetectorList)) + + pdpDetectorListQc, ok = varStack["pdp_detector_list_qc"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow name in topology library file") + return + } + if strings.TrimSpace(pdpDetectorListQc) == "ALL" { + pdpDetectorListQc, ok = varStack["detectors"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire general detector list from varStack") + return + } + detectorsSlice, err := p.parseDetectors(pdpDetectorListQc) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse general detector list") + return + } + pdpDetectorListQc = strings.Join(detectorsSlice, ",") + } + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_QC='%s'", pdpDetectorListQc)) + + pdpDetectorListCalib, ok = varStack["pdp_detector_list_calib"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow name in topology library file") + return + } + if strings.TrimSpace(pdpDetectorListCalib) == "ALL" { + pdpDetectorListCalib, ok = varStack["detectors"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire general detector list from varStack") + return + } + detectorsSlice, err := p.parseDetectors(pdpDetectorListCalib) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse general detector list") + return + } + pdpDetectorListCalib = strings.Join(detectorsSlice, ",") + } + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_CALIB='%s'", pdpDetectorListCalib)) + + pdpWorkflowParams, ok = varStack["pdp_workflow_parameters"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow parameters") + return + } + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_PARAMETERS='%s'", pdpWorkflowParams)) + + pdpNrComputeNodes, ok = varStack["pdp_nr_compute_nodes"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP number of compute nodes") + return + } + accumulator = append(accumulator, fmt.Sprintf("RECO_NUM_NODES_OVERRIDE='%s'", pdpNrComputeNodes)) + + pdpRawDecoderMultiFactor, ok = varStack["pdp_raw_decoder_multi_factor"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP number of raw decoder processing instances") + return + } + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_RAWDECODERS='%s'", pdpRawDecoderMultiFactor)) + + pdpCtfEncoderMultiFactor, ok = varStack["pdp_ctf_encoder_multi_factor"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP number of CTF encoder processing instances") + return + } + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_CTFENCODERS='%s'", pdpCtfEncoderMultiFactor)) + + pdpRecoProcessMultiFactor, ok = varStack["pdp_reco_process_multi_factor"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP number of other reconstruction processing instances") + return + } + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_REST='%s'", pdpRecoProcessMultiFactor)) + + pdpWipeWorkflowCache, ok = varStack["pdp_wipe_workflow_cache"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP workflow cache wipe option") + return + } + pdpWipeWorkflowCacheB, err := strconv.ParseBool(pdpWipeWorkflowCache) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse PDP workflow cache wipe option") + pdpWipeWorkflowCacheB = false + } + pdpWipeWorkflowCacheI := 0 + if pdpWipeWorkflowCacheB { + pdpWipeWorkflowCacheI = 1 + } + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WIPE_CACHE=%d", pdpWipeWorkflowCacheI)) + + pdpBeamType, ok = varStack["pdp_beam_type"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire beam type") + return + } + accumulator = append(accumulator, fmt.Sprintf("BEAMTYPE='%s'", pdpBeamType)) + + pdpNHbfPerTf, ok = varStack["pdp_n_hbf_per_tf"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire number of HBFs per TF") + return + } + accumulator = append(accumulator, fmt.Sprintf("NHBPERTF='%s'", pdpNHbfPerTf)) + + // envId + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_PARTITION='%s'", envId)) + + accumulator = append(accumulator, "GEN_TOPO_ONTHEFLY=1") + + pdpExtraEnvVars, ok = varStack["pdp_extra_env_vars"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP extra environment variables") + return + } + accumulator = append(accumulator, pdpExtraEnvVars) + + pdpGeneratorScriptPath, ok = varStack["pdp_generator_script_path"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP generator script path") + return + } + accumulator = append(accumulator, pdpGeneratorScriptPath) + + out = strings.Join(accumulator, " ") + return + } + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { return @@ -156,15 +439,49 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { stack["Configure"] = func() (out string) { // ODC Run + SetProperties + Configure - var topology, plugin, resources string + var ( + pdpConfigOption, script, topology, plugin, resources string + ) ok := false - topology, ok = varStack["odc_topology"] + isManualXml := false + + pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire ODC topology") + Error("cannot acquire PDP workflow configuration mode") + return + } + switch pdpConfigOption { + case "Repository hash": fallthrough + case "Repository path": + script, ok = varStack["odc_script"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + + "output is written to odc_script") + return + } + + case "Manual XML": + topology, ok = varStack["odc_topology"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Configure"). + Error("cannot acquire ODC topology") + return + } + isManualXml = true + + default: + log.WithField("partition", envId). + WithField("call", "Configure"). + WithField("value", pdpConfigOption). + Error("cannot acquire valid PDP workflow configuration mode value") return } + plugin, ok = varStack["odc_plugin"] if !ok { log.WithField("partition", envId). @@ -172,6 +489,7 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire ODC RMS plugin declaration") return } + resources, ok = varStack["odc_resources"] if !ok { log.WithField("partition", envId). @@ -192,13 +510,14 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { k != "odc_enabled" && k != "odc_resources" && k != "odc_plugin" && + k != "odc_script" && k != "odc_topology" { arguments[strings.TrimPrefix(k, "odc_")] = v } } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleConfigure(ctx, p.odcClient, arguments, topology, plugin, resources, envId) + err := handleConfigure(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, envId) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -378,6 +697,19 @@ func (p *Plugin) ObjectStack(data interface{}) (stack map[string]interface{}) { return } +func (p *Plugin) parseDetectors(detectorsParam string) (detectors []string, err error) { + detectorsSlice := make([]string, 0) + bytes := []byte(detectorsParam) + err = json.Unmarshal(bytes, &detectorsSlice) + if err != nil { + log.WithError(err). + Error("error processing EPN/PDP detectors list") + return + } + detectors = detectorsSlice + return +} + func (p *Plugin) Destroy() error { return p.odcClient.Close() } From b1d88e70d27d34788a03e7591546ce0d16db99b6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 Nov 2021 14:40:29 +0100 Subject: [PATCH 1072/2352] [core] Add missing initialization in ODC plugin --- core/integration/odc/plugin.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 57de737c1..0eb1d4ec4 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -147,6 +147,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter return } + stack = make(map[string]interface{}) stack["GenerateEPNWorkflowScript"] = func() (out string) { /* OCTRL-558 example: GEN_TOPO_HASH=[0/1] GEN_TOPO_SOURCE=[...] DDMODE=[TfBuilder Mode] GEN_TOPO_LIBRARY_FILE=[...] From afd97b016aa9c59fff1c60db69f5aa7a0888be39 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 Nov 2021 17:42:15 +0100 Subject: [PATCH 1073/2352] [core] Ensure all plugin functions are deep-copied into template context --- configuration/template/fields.go | 32 +++++++++++++++++++++------ core/environment/environment.go | 7 ++++-- core/integration/dcs/plugin.go | 1 + core/integration/ddsched/plugin.go | 1 + core/integration/testplugin/plugin.go | 2 +- core/integration/trg/plugin.go | 1 + 6 files changed, 34 insertions(+), 10 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 0385e9179..854c6ce6c 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -195,9 +195,8 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va for k, v := range varStack { environment[k] = v } - for k, v := range objStack { - environment[k] = v - } + copyMap(objStack, environment) // needed for deep copy e.g. odc.Configure + for k, v := range strOpStack { environment[k] = v } @@ -213,9 +212,7 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va } pluginObjects := MakePluginObjectStack(varStack) - for k, v := range pluginObjects { - environment[k] = v - } + copyMap(pluginObjects, environment) for _, field := range fields { buf := new(bytes.Buffer) @@ -272,4 +269,25 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va field.Set(buf.String()) } return -} \ No newline at end of file +} + +func copyMap(src map[string]interface{}, dest map[string]interface{}) { + for k, v := range src { + vm, ok := v.(map[string]interface{}) + if ok { + var destk map[string]interface{} + if _, exists := dest[k]; exists { + destk, ok = dest[k].(map[string]interface{}) + if !ok { + destk = make(map[string]interface{}) + } + } else { + destk = make(map[string]interface{}) + } + copyMap(vm, destk) + dest[k] = destk + } else { + dest[k] = v + } + } +} diff --git a/core/environment/environment.go b/core/environment/environment.go index ce05ffc86..4bd98c9ca 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -454,8 +454,11 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map if err != nil { for _, h := range hooksToTrigger { errorMap[h] = err - hookTimers[h.GetTaskId()].Stop() - delete(hookTimers, h.GetTaskId()) + timer, ok := hookTimers[h.GetTaskId()] + if ok { + timer.Stop() + delete(hookTimers, h.GetTaskId()) + } } return } diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index b3ad81bb8..2504541f2 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -155,6 +155,7 @@ func (p *Plugin) Init(instanceId string) error { } func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) return stack } diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 1147931d2..a9a5db44e 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -149,6 +149,7 @@ func (p *Plugin) Init(_ string) error { } func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) return stack } diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index eec4cb8c3..69769121b 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -79,6 +79,7 @@ func (p *Plugin) Init(_ string) error { } func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) return stack } @@ -97,7 +98,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { message, ok := varStack["testplugin_message"] if !ok { message = "running testplugin.Noop" - return } stack = make(map[string]interface{}) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 9116bf119..6d94a586d 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -117,6 +117,7 @@ func (p *Plugin) Init(instanceId string) error { } func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) return stack } From 4d226396d96972542ede2b0340a0babf61408465 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Nov 2021 10:06:18 +0100 Subject: [PATCH 1074/2352] [core] Improve EPN script generator default behaviour --- core/integration/odc/plugin.go | 58 ++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 16 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 0eb1d4ec4..cf31997ec 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -167,6 +167,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string pdpExtraEnvVars, pdpGeneratorScriptPath string + odcNEpns string ok bool accumulator []string ) @@ -205,7 +206,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter default: return } - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_SOURCE='%s'", o2DPSource)) + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_SOURCE='%s'", strings.TrimSpace(o2DPSource))) tfbDDMode, ok = varStack["tfb_dd_mode"] if !ok { @@ -214,7 +215,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire TF Builder mode") return } - accumulator = append(accumulator, fmt.Sprintf("DDMODE='%s'", tfbDDMode)) + accumulator = append(accumulator, fmt.Sprintf("DDMODE='%s'", strings.TrimSpace(tfbDDMode))) pdpLibraryFile, ok = varStack["pdp_topology_description_library_file"] if !ok { @@ -223,7 +224,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire topology description library file") return } - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_LIBRARY_FILE='%s'", pdpLibraryFile)) + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_LIBRARY_FILE='%s'", strings.TrimSpace(pdpLibraryFile))) pdpLibWorkflowName, ok = varStack["pdp_workflow_name"] if !ok { @@ -232,7 +233,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP workflow name in topology library file") return } - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WORKFLOW_NAME='%s'", pdpLibWorkflowName)) + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WORKFLOW_NAME='%s'", strings.TrimSpace(pdpLibWorkflowName))) pdpDetectorList, ok = varStack["pdp_detector_list_global"] if !ok { @@ -258,7 +259,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } pdpDetectorList = strings.Join(detectorsSlice, ",") } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", pdpDetectorList)) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", strings.TrimSpace(pdpDetectorList))) pdpDetectorListQc, ok = varStack["pdp_detector_list_qc"] if !ok { @@ -284,7 +285,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } pdpDetectorListQc = strings.Join(detectorsSlice, ",") } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_QC='%s'", pdpDetectorListQc)) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_QC='%s'", strings.TrimSpace(pdpDetectorListQc))) pdpDetectorListCalib, ok = varStack["pdp_detector_list_calib"] if !ok { @@ -310,7 +311,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } pdpDetectorListCalib = strings.Join(detectorsSlice, ",") } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_CALIB='%s'", pdpDetectorListCalib)) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_CALIB='%s'", strings.TrimSpace(pdpDetectorListCalib))) pdpWorkflowParams, ok = varStack["pdp_workflow_parameters"] if !ok { @@ -319,7 +320,22 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP workflow parameters") return } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_PARAMETERS='%s'", pdpWorkflowParams)) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_PARAMETERS='%s'", strings.TrimSpace(pdpWorkflowParams))) + + odcNEpns, ok = varStack["odc_n_epns"] // only needed as default value for pdp_nr_compute_nodes if == -1 + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire ODC number of EPNs") + return + } + odcNEpnsI, err := strconv.Atoi(odcNEpns) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse ODC number of EPNs") + return + } pdpNrComputeNodes, ok = varStack["pdp_nr_compute_nodes"] if !ok { @@ -328,7 +344,17 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP number of compute nodes") return } - accumulator = append(accumulator, fmt.Sprintf("RECO_NUM_NODES_OVERRIDE='%s'", pdpNrComputeNodes)) + pdpNrComputeNodesI, err := strconv.Atoi(pdpNrComputeNodes) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse PDP number of compute nodes") + pdpNrComputeNodesI = odcNEpnsI + } + if pdpNrComputeNodesI == -1 { + pdpNrComputeNodesI = odcNEpnsI + } + accumulator = append(accumulator, fmt.Sprintf("RECO_NUM_NODES_OVERRIDE=%d", pdpNrComputeNodesI)) pdpRawDecoderMultiFactor, ok = varStack["pdp_raw_decoder_multi_factor"] if !ok { @@ -337,7 +363,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP number of raw decoder processing instances") return } - accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_RAWDECODERS='%s'", pdpRawDecoderMultiFactor)) + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_RAWDECODERS=%s", strings.TrimSpace(pdpRawDecoderMultiFactor))) pdpCtfEncoderMultiFactor, ok = varStack["pdp_ctf_encoder_multi_factor"] if !ok { @@ -346,7 +372,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP number of CTF encoder processing instances") return } - accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_CTFENCODERS='%s'", pdpCtfEncoderMultiFactor)) + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_CTFENCODERS=%s", strings.TrimSpace(pdpCtfEncoderMultiFactor))) pdpRecoProcessMultiFactor, ok = varStack["pdp_reco_process_multi_factor"] if !ok { @@ -355,7 +381,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP number of other reconstruction processing instances") return } - accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_REST='%s'", pdpRecoProcessMultiFactor)) + accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_REST=%s", strings.TrimSpace(pdpRecoProcessMultiFactor))) pdpWipeWorkflowCache, ok = varStack["pdp_wipe_workflow_cache"] if !ok { @@ -384,7 +410,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire beam type") return } - accumulator = append(accumulator, fmt.Sprintf("BEAMTYPE='%s'", pdpBeamType)) + accumulator = append(accumulator, fmt.Sprintf("BEAMTYPE='%s'", strings.TrimSpace(pdpBeamType))) pdpNHbfPerTf, ok = varStack["pdp_n_hbf_per_tf"] if !ok { @@ -393,7 +419,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire number of HBFs per TF") return } - accumulator = append(accumulator, fmt.Sprintf("NHBPERTF='%s'", pdpNHbfPerTf)) + accumulator = append(accumulator, fmt.Sprintf("NHBPERTF=%s", strings.TrimSpace(pdpNHbfPerTf))) // envId accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_PARTITION='%s'", envId)) @@ -407,7 +433,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP extra environment variables") return } - accumulator = append(accumulator, pdpExtraEnvVars) + accumulator = append(accumulator, strings.TrimSpace(pdpExtraEnvVars)) pdpGeneratorScriptPath, ok = varStack["pdp_generator_script_path"] if !ok { @@ -416,7 +442,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP generator script path") return } - accumulator = append(accumulator, pdpGeneratorScriptPath) + accumulator = append(accumulator, strings.TrimSpace(pdpGeneratorScriptPath)) out = strings.Join(accumulator, " ") return From 59ccdaa1631e8aa0031bf872f50b79d503c642e6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Nov 2021 11:05:02 +0100 Subject: [PATCH 1075/2352] [core] Use `default` as default string for PDP detector lists --- core/integration/odc/plugin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index cf31997ec..a6b217f80 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -242,7 +242,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP workflow name in topology library file") return } - if strings.TrimSpace(pdpDetectorList) == "ALL" { + if strings.TrimSpace(pdpDetectorList) == "default" { pdpDetectorList, ok = varStack["detectors"] if !ok { log.WithField("partition", envId). @@ -268,7 +268,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP workflow name in topology library file") return } - if strings.TrimSpace(pdpDetectorListQc) == "ALL" { + if strings.TrimSpace(pdpDetectorListQc) == "default" { pdpDetectorListQc, ok = varStack["detectors"] if !ok { log.WithField("partition", envId). @@ -294,7 +294,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP workflow name in topology library file") return } - if strings.TrimSpace(pdpDetectorListCalib) == "ALL" { + if strings.TrimSpace(pdpDetectorListCalib) == "default" { pdpDetectorListCalib, ok = varStack["detectors"] if !ok { log.WithField("partition", envId). From f7c8006e803e50d2a987b2ed9870a57c036f09df Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 Nov 2021 12:21:17 +0100 Subject: [PATCH 1076/2352] [build] Bump to v0.29.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 72fb35356..75a1197fd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 28 +VERSION_MINOR := 29 VERSION_PATCH := 0 From 86c787e2408f1b4c2cc0d54e3b7d9a1ef25aa55a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Nov 2021 12:31:32 +0100 Subject: [PATCH 1077/2352] [core] Print debug message to IL on Bookkeeping client calls --- core/bookkeeping/api.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/core/bookkeeping/api.go b/core/bookkeeping/api.go index 0ae296950..64c632bc3 100644 --- a/core/bookkeeping/api.go +++ b/core/bookkeeping/api.go @@ -37,7 +37,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(), "Bookkeeping") +var log = logger.New(logrus.StandardLogger(), "bookkeeping") // [O2-2512]: Until JWT becomes optional or provided by BK // const jwtToken = "token" @@ -80,6 +80,10 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns } clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) + log.WithField("runType", runType). + WithField("partition", activityId). + WithField("runNumber", runNumber). + Debug("CreateRun call done") } func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { @@ -97,24 +101,33 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) + log.WithField("runNumber", runNumber). + Debug("UpdateRun call done") } func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { clientAPI.CreateLog(text, title, runNumbers, parentLogId) + log.Debug("CreateLog call done") } func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { clientAPI.CreateFlp(name, hostName, runNumber) + log.WithField("runNumber", runNumber). + Debug("CreateFlp call done") } func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) + log.WithField("runNumber", runNumber). + Debug("UpdateFlp call done") } func (bk *BookkeepingWrapper) GetLogs() { clientAPI.GetLogs() + log.Debug("GetLogs call done") } func (bk *BookkeepingWrapper) GetRuns() { clientAPI.GetRuns() + log.Debug("GetRuns call done") } From 3ab085e58a73b18f2def63e36d001ff8d29405ec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 24 Nov 2021 14:55:37 +0100 Subject: [PATCH 1078/2352] [build] Bump to v0.29.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 75a1197fd..fa527840c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 29 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 9ea71a32c2f86d9cdf51d5cf7861d8d49ad09a69 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 2 Nov 2021 15:22:01 +0100 Subject: [PATCH 1079/2352] [translate] Add translate role for JIT --- core/workflow/aggregator.go | 6 + core/workflow/iteratorrole.go | 2 + core/workflow/translaterole.go | 217 +++++++++++++++++++++++++++++ core/workflow/translatetemplate.go | 90 ++++++++++++ 4 files changed, 315 insertions(+) create mode 100644 core/workflow/translaterole.go create mode 100644 core/workflow/translatetemplate.go diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 4642d34ed..76aa2dd48 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -53,6 +53,7 @@ type _unionTypeProbe struct { Roles []interface{} Call *struct{} Include *string + Translate *string } type _roleUnion struct{ *iteratorRole @@ -60,6 +61,7 @@ type _roleUnion struct{ *taskRole *callRole *includeRole + *translateRole } func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { @@ -80,6 +82,8 @@ func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (union unionErr = unmarshal(&union.callRole) case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: unionErr = unmarshal(&union.includeRole) + case _probe.Translate != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: + unionErr = unmarshal(&union.translateRole) default: unionErr = errors.New("cannot unmarshal invalid role to union") } @@ -112,6 +116,8 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error roles[i] = v.callRole case v.includeRole != nil: roles[i] = v.includeRole + case v.translateRole != nil: + roles[i] = v.translateRole default: err = errors.New("invalid child role at index " + strconv.Itoa(i)) return diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index dba89134e..13519e776 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -106,6 +106,8 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err template = &callTemplate{} case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: template = &includeTemplate{} + case _probe.Translate != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: + template = &translateTemplate{} default: err = errors.New("invalid template role in iterator") return diff --git a/core/workflow/translaterole.go b/core/workflow/translaterole.go new file mode 100644 index 000000000..3bc5b37d8 --- /dev/null +++ b/core/workflow/translaterole.go @@ -0,0 +1,217 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Kostas Alexopoulos + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "crypto/sha1" + "encoding/hex" + "errors" + "fmt" + "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" + "os/exec" + "strings" + texttemplate "text/template" +) + +// A translateRole is a delayed aggregatorRole +// It takes a `translate` entry, which is then translated into a dpl workflow +// and expanded into a full aggregatorRole during the ProcessTemplates function. +type translateRole struct { + aggregatorRole + + Translate string `yaml:"translate,omitempty"` +} + +func (r *translateRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + // NOTE: see NOTE in roleBase.UnmarshalYAML + + innerRoleBase := roleBase{} + err = unmarshal(&innerRoleBase) + if err != nil { + return + } + + type auxTranslate struct{ + Translate string `yaml:"translate,omitempty"` + } + _auxTranslate:= auxTranslate{} + err = unmarshal(&_auxTranslate) + if err != nil { + return + } + + role := translateRole{ + aggregatorRole: aggregatorRole{ + roleBase: innerRoleBase, + aggregator: aggregator{}, + }, + Translate: _auxTranslate.Translate, + } + + + *r = role + return +} + +func (r *translateRole) MarshalYAML() (interface{}, error) { + return nil, nil +} + +func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { + + // TODO: Two "rounds" of templating are necessary here as the initial thing received is {{ dpl_command }} which is *THEN* templated to the actual dpl command payload + // TODO: Check with Teo on what the best way to do this is + for i := 0; i < 2; i++ { + + if r == nil { + return errors.New("role tree error when processing templates") + } + + templSequence := template.Sequence{ + template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), + template.STAGE1: template.WrapMapItems(r.Vars.Raw()), + template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), + template.STAGE3: template.Fields{ + template.WrapPointer(&r.Name), + template.WrapPointer(&r.Translate), + }, + template.STAGE4: append(append( + WrapConstraints(r.Constraints), + r.wrapBindAndConnectFields()...), + template.WrapPointer(&r.Enabled)), + } + + err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) + if err != nil { + return + } + + // After template processing we write the Locals to Vars in order to make them available to children + for k, v := range r.Locals { + r.Vars.Set(k, v) + } + + r.Enabled = strings.TrimSpace(r.Enabled) + + if !r.IsEnabled() { + // Normally it's the parent that checks whether a child is enabled after that child's + // ProcessTemplates is done, and this is true for the current role as well, but if + // at this point we already know that the current role is disabled (and will + // therefore be excluded by its parent), we don't try to resolve the workflow + // inclusion because there's no reason to do so anyway. + return nil + } + } + + // JIT requires DPL command as input and returns the ready-to-use workflow name as output + // JIT takes place after the templated DPL command has been resolved + jit := func(dplCommand string) (string, error) { + //start := time.Now().UnixNano() / int64(time.Millisecond) + + hash := sha1.New() + hash.Write([]byte(r.Translate)) + jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) + // TODO: Check if tasks / workflows already exist? + + log.Trace("Resolved DPL command: " + dplCommand) + + // TODO: Before executing we need to check that this is a valid dpl command + // If not, any command may be injected on the aliecs host + // since this will be run as user `aliecs` it might not poes a problem at this point + cmdString := dplCommand + " --o2-control " + jitWorkflowName + dplCmd := exec.Command("bash", "-c", cmdString) + + // execute the DPL command in the repo of the workflow used + dplCmd.Dir = workflowRepo.GetCloneDir() + var dplOut []byte + dplOut, err = dplCmd.CombinedOutput() + log.Trace("DPL command out: " + string(dplOut)) + if err != nil { + return "", fmt.Errorf("Failed to run DPL command : " + err.Error()) + } + + /*end := time.Now().UnixNano() / int64(time.Millisecond) + log.Tracef("JIT took %d ms", end-start)*/ + return jitWorkflowName, err + } + + // Common part done, include resolution starts here. + // An include Role is essentially a baseRole + `include:` expression. We first need to resolve + // the expression to obtain a full subworkflow template identifier, i.e. a full repo/wft/branch + // combo. + // Once that's done we can load the subworkflow and obtain the root `aggregatorRole` plus a new + // repos.Repo definition. If a repo or branch is already provided in the subworkflow expression + // then the returned newWfRepo will reflect this, and any additionally nested includes will + // default to the repo of their direct parent. + var subWfRoot *aggregatorRole + var newWfRepo repos.IRepo + + var jitWorkflowName string + jitWorkflowName, err = jit(r.Translate) + translate := workflowRepo.ResolveSubworkflowTemplateIdentifier(jitWorkflowName) + subWfRoot, newWfRepo, err = loadSubworkflow(translate, r) + if err != nil { + return err + } + + // By now the subworkflow is loaded and reparented to this translateRole. This reparenting is + // needed to ensure the correct gera.StringMap hierarchies, but now that we replace the + // composed aggregatorRole with the newly loaded one, we must also fix the reparenting and + // ensure the loaded name doesn't overwrite the original name of the translateRole. + parent := r.parent + name := r.Name + r.aggregatorRole = *subWfRoot // The previously composed aggregatorRole+roleBase are overwritten here + r.parent = parent + r.Name = name + + return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) +} + +func (r* translateRole) UpdateStatus(s task.Status) { + r.updateStatus(s) +} + +func (r* translateRole) UpdateState(s task.State) { + r.updateState(s) +} + +func (r *translateRole) copy() copyable { + rCopy := translateRole{ + aggregatorRole: *r.aggregatorRole.copy().(*aggregatorRole), + Translate: r.Translate, + } + rCopy.status = SafeStatus{status:rCopy.GetStatus()} + rCopy.state = SafeState{state:rCopy.GetState()} + return &rCopy +} diff --git a/core/workflow/translatetemplate.go b/core/workflow/translatetemplate.go new file mode 100644 index 000000000..a77cfc505 --- /dev/null +++ b/core/workflow/translatetemplate.go @@ -0,0 +1,90 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * Author: Kostas Alexopoulos + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "errors" + "github.com/jinzhu/copier" + "text/template" +) + +type translateTemplate struct { + translateRole + stringTemplates map[string]template.Template `yaml:"-,omitempty"` +} + +func (tt *translateTemplate) copy() copyable { + rCopy := translateTemplate{ + translateRole: *tt.translateRole.copy().(*translateRole), + } + _ = copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) + return &rCopy +} + +func (tt *translateTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _translateTemplate translateTemplate + aux := _translateTemplate{} + err = unmarshal(&aux) + if err != nil { + return + } + aux.stringTemplates = make(map[string]template.Template) + + /* template cache builder + tmpl := template.New(aux.GetPath()) + + // Fields to parse as templates: + for _, str := range []string{ + aux.LoadTaskClass, + aux.Name, + } { + var tempTmpl *template.Template + tempTmpl, err = tmpl.Parse(str) + if err != nil { + return + } + aux.stringTemplates[str] = *tempTmpl + } + */ + + *tt = translateTemplate(aux) + return +} + +func (tt *translateTemplate) generateRole(localVars map[string]string) (c Role, err error) { + if tt == nil { + return nil, errors.New("cannot generate from nil sender") + } + + // See note for aggregatorTemplate.generateRole + tr := *tt.translateRole.copy().(*translateRole) + for k, v := range localVars { + tr.Locals[k] = v + } + + c = &tr + return +} \ No newline at end of file From cb80c6eaabda2b5d7dcdac358c0fe2718a5c3051 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 1 Nov 2021 16:46:42 +0100 Subject: [PATCH 1080/2352] [repo] Clean repo on refresh --- core/repos/repo.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/repos/repo.go b/core/repos/repo.go index f0399ae81..1b86738cb 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -314,6 +314,18 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier()) } + // clean the repo before doing anything + // this removes the untracked JIT-produced tasks and workflows + clnCmd := exec.Command("git", "-C", r.GetCloneDir(), "clean", "-f") + err = clnCmd.Run() + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + err = ref.Fetch(&git.FetchOptions{ RemoteName: "origin", Force: true, From 1b632143b8b59669bab36a4616f4d053df2a1b00 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 2 Nov 2021 15:01:02 +0100 Subject: [PATCH 1081/2352] [workflow] Best effort aggregator & iterator parallelization --- core/workflow/aggregatorrole.go | 19 ++++++++---- core/workflow/iteratorrole.go | 52 ++++++++++++++++++++++++--------- core/workflow/translaterole.go | 23 ++++++++------- 3 files changed, 64 insertions(+), 30 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index b35bce066..67adff9be 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -27,6 +27,7 @@ package workflow import ( "errors" "strings" + "sync" texttemplate "text/template" "github.com/AliceO2Group/Control/common/event" @@ -135,15 +136,23 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf r.Enabled = strings.TrimSpace(r.Enabled) + var wg sync.WaitGroup + wg.Add(len(r.Roles)) + // Process templates for child roles for _, role := range r.Roles { - role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) - if err != nil { - return - } + go func(role Role) { + defer wg.Done() + role.setParent(r) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } + }(role) } + wg.Wait() + // If any child is not Enabled after template resolution, // we filter it out of existence enabledRoles := make([]Role, 0) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 13519e776..af316fb72 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -26,10 +26,11 @@ package workflow import ( "errors" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" + "sync" + "time" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" @@ -160,12 +161,27 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } + start := time.Now().UnixNano() / int64(time.Millisecond) + + var wg sync.WaitGroup + wg.Add(len(i.Roles)) + // Process templates for child roles for _, role := range i.Roles { - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) - if err != nil { - return - } + go func(role Role) { + defer wg.Done() + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } + }(role) + } + + wg.Wait() + + end := time.Now().UnixNano() / int64(time.Millisecond) + if len(i.Roles) > 1 { + log.Errorf("ProcessTemplates across %d nodes took %d ms", len(i.Roles), end-start) } // If any child is not Enabled after template resolution, @@ -199,16 +215,24 @@ func (i *iteratorRole) expandTemplate() (err error) { return } + var wg sync.WaitGroup + wg.Add(len(ran)) + for _, localValue := range ran { - locals := make(map[string]string) - locals[i.For.GetVar()] = localValue - var newRole Role - newRole, err = i.template.generateRole(locals) - if err != nil { - return - } - roles = append(roles, newRole) - } + go func(localValue string) { + defer wg.Done() + locals := make(map[string]string) + locals[i.For.GetVar()] = localValue + var newRole Role + newRole, err = i.template.generateRole(locals) + if err != nil { + return + } + roles = append(roles, newRole) + } (localValue) + } + + wg.Wait() i.Roles = roles for j := 0; j < len(i.Roles); j++ { diff --git a/core/workflow/translaterole.go b/core/workflow/translaterole.go index 3bc5b37d8..85f98f07f 100644 --- a/core/workflow/translaterole.go +++ b/core/workflow/translaterole.go @@ -85,8 +85,7 @@ func (r *translateRole) MarshalYAML() (interface{}, error) { func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { - // TODO: Two "rounds" of templating are necessary here as the initial thing received is {{ dpl_command }} which is *THEN* templated to the actual dpl command payload - // TODO: Check with Teo on what the best way to do this is + // Two "rounds" of templating are necessary here as the initial thing received is {{ dpl_command }} which is *THEN* templated to the actual dpl command payload for i := 0; i < 2; i++ { if r == nil { @@ -133,6 +132,16 @@ func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkfl return nil } } + // Common part done, translate resolution starts here. + // A translateRole consists of DPL JIT and the equivalent of an `include:` + // expression. We first resolve the DPL command, we run it and then follow the + // `include` role strategy with the resulting workflow: + // We first need to resolve the expression to obtain a full subworkflow template identifier, + // i.e. a full repo/wft/branch combo. + // Once that's done we can load the subworkflow and obtain the root `aggregatorRole` plus a new + // repos.Repo definition. If a repo or branch is already provided in the subworkflow expression + // then the returned newWfRepo will reflect this, and any additionally nested includes will + // default to the repo of their direct parent. // JIT requires DPL command as input and returns the ready-to-use workflow name as output // JIT takes place after the templated DPL command has been resolved @@ -148,7 +157,7 @@ func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkfl // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host - // since this will be run as user `aliecs` it might not poes a problem at this point + // since this will be run as user `aliecs` it might not pose a problem at this point cmdString := dplCommand + " --o2-control " + jitWorkflowName dplCmd := exec.Command("bash", "-c", cmdString) @@ -166,14 +175,6 @@ func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkfl return jitWorkflowName, err } - // Common part done, include resolution starts here. - // An include Role is essentially a baseRole + `include:` expression. We first need to resolve - // the expression to obtain a full subworkflow template identifier, i.e. a full repo/wft/branch - // combo. - // Once that's done we can load the subworkflow and obtain the root `aggregatorRole` plus a new - // repos.Repo definition. If a repo or branch is already provided in the subworkflow expression - // then the returned newWfRepo will reflect this, and any additionally nested includes will - // default to the repo of their direct parent. var subWfRoot *aggregatorRole var newWfRepo repos.IRepo From f56ea41a11de83db0cbf9753d20f6030584eba65 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 16 Nov 2021 17:30:14 +0100 Subject: [PATCH 1082/2352] [apricot] Add GetEntryWithLastIndex runtime service --- apricot/local/service.go | 8 + apricot/protos/apricot.pb.go | 818 +++++++++++++---------- apricot/protos/apricot.proto | 10 + apricot/protos/apricot_grpc.pb.go | 36 + apricot/remote/server.go | 16 + apricot/remote/service.go | 12 + configuration/cfgbackend/consulsource.go | 20 + configuration/service.go | 2 + go.mod | 1 + go.sum | 2 + 10 files changed, 588 insertions(+), 337 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index f9636c67f..62f5efc66 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -426,6 +426,14 @@ func (s *Service) ListRuntimeEntries(component string) ([]string, error) { } } +func (s *Service) GetEntryWithLastIndex(key string) (string, uint64, error) { + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + return cSrc.GetWithLastIndex(key) + } else { + return "", 0, errors.New("runtime KV not supported with file backend") + } +} + func (s *Service) ListComponents() (components []string, err error) { keyPrefix := componentcfg.ConfigComponentsPath var keys []string diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 78dad3f65..5cd12b67a 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -372,6 +372,61 @@ func (x *ComponentResponse) GetPayload() string { return "" } +type ComponentResponseWithLastIndex struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Payload string `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"` + LastIndex uint64 `protobuf:"varint,2,opt,name=lastIndex,proto3" json:"lastIndex,omitempty"` +} + +func (x *ComponentResponseWithLastIndex) Reset() { + *x = ComponentResponseWithLastIndex{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ComponentResponseWithLastIndex) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ComponentResponseWithLastIndex) ProtoMessage() {} + +func (x *ComponentResponseWithLastIndex) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ComponentResponseWithLastIndex.ProtoReflect.Descriptor instead. +func (*ComponentResponseWithLastIndex) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{4} +} + +func (x *ComponentResponseWithLastIndex) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + +func (x *ComponentResponseWithLastIndex) GetLastIndex() uint64 { + if x != nil { + return x.LastIndex + } + return 0 +} + type HostRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -383,7 +438,7 @@ type HostRequest struct { func (x *HostRequest) Reset() { *x = HostRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[4] + mi := &file_protos_apricot_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -396,7 +451,7 @@ func (x *HostRequest) String() string { func (*HostRequest) ProtoMessage() {} func (x *HostRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[4] + mi := &file_protos_apricot_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -409,7 +464,7 @@ func (x *HostRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostRequest.ProtoReflect.Descriptor instead. func (*HostRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{4} + return file_protos_apricot_proto_rawDescGZIP(), []int{5} } func (x *HostRequest) GetHostname() string { @@ -430,7 +485,7 @@ type HostsRequest struct { func (x *HostsRequest) Reset() { *x = HostsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -443,7 +498,7 @@ func (x *HostsRequest) String() string { func (*HostsRequest) ProtoMessage() {} func (x *HostsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[5] + mi := &file_protos_apricot_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -456,7 +511,7 @@ func (x *HostsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostsRequest.ProtoReflect.Descriptor instead. func (*HostsRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{5} + return file_protos_apricot_proto_rawDescGZIP(), []int{6} } func (x *HostsRequest) GetHosts() []string { @@ -477,7 +532,7 @@ type DetectorResponse struct { func (x *DetectorResponse) Reset() { *x = DetectorResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -490,7 +545,7 @@ func (x *DetectorResponse) String() string { func (*DetectorResponse) ProtoMessage() {} func (x *DetectorResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[6] + mi := &file_protos_apricot_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -503,7 +558,7 @@ func (x *DetectorResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorResponse.ProtoReflect.Descriptor instead. func (*DetectorResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{6} + return file_protos_apricot_proto_rawDescGZIP(), []int{7} } func (x *DetectorResponse) GetPayload() string { @@ -524,7 +579,7 @@ type RunNumberResponse struct { func (x *RunNumberResponse) Reset() { *x = RunNumberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -537,7 +592,7 @@ func (x *RunNumberResponse) String() string { func (*RunNumberResponse) ProtoMessage() {} func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[7] + mi := &file_protos_apricot_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -550,7 +605,7 @@ func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. func (*RunNumberResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{7} + return file_protos_apricot_proto_rawDescGZIP(), []int{8} } func (x *RunNumberResponse) GetRunNumber() uint32 { @@ -571,7 +626,7 @@ type StringMap struct { func (x *StringMap) Reset() { *x = StringMap{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -584,7 +639,7 @@ func (x *StringMap) String() string { func (*StringMap) ProtoMessage() {} func (x *StringMap) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -597,7 +652,7 @@ func (x *StringMap) ProtoReflect() protoreflect.Message { // Deprecated: Use StringMap.ProtoReflect.Descriptor instead. func (*StringMap) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{8} + return file_protos_apricot_proto_rawDescGZIP(), []int{9} } func (x *StringMap) GetStringMap() map[string]string { @@ -618,7 +673,7 @@ type RawGetRecursiveRequest struct { func (x *RawGetRecursiveRequest) Reset() { *x = RawGetRecursiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -631,7 +686,7 @@ func (x *RawGetRecursiveRequest) String() string { func (*RawGetRecursiveRequest) ProtoMessage() {} func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -644,7 +699,7 @@ func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{9} + return file_protos_apricot_proto_rawDescGZIP(), []int{10} } func (x *RawGetRecursiveRequest) GetRawPath() string { @@ -666,7 +721,7 @@ type GetRuntimeEntryRequest struct { func (x *GetRuntimeEntryRequest) Reset() { *x = GetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -679,7 +734,7 @@ func (x *GetRuntimeEntryRequest) String() string { func (*GetRuntimeEntryRequest) ProtoMessage() {} func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -692,7 +747,7 @@ func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*GetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{10} + return file_protos_apricot_proto_rawDescGZIP(), []int{11} } func (x *GetRuntimeEntryRequest) GetComponent() string { @@ -722,7 +777,7 @@ type SetRuntimeEntryRequest struct { func (x *SetRuntimeEntryRequest) Reset() { *x = SetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -735,7 +790,7 @@ func (x *SetRuntimeEntryRequest) String() string { func (*SetRuntimeEntryRequest) ProtoMessage() {} func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -748,7 +803,7 @@ func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*SetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{11} + return file_protos_apricot_proto_rawDescGZIP(), []int{12} } func (x *SetRuntimeEntryRequest) GetComponent() string { @@ -772,6 +827,53 @@ func (x *SetRuntimeEntryRequest) GetValue() string { return "" } +type GetEntryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` +} + +func (x *GetEntryRequest) Reset() { + *x = GetEntryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetEntryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetEntryRequest) ProtoMessage() {} + +func (x *GetEntryRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetEntryRequest.ProtoReflect.Descriptor instead. +func (*GetEntryRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{13} +} + +func (x *GetEntryRequest) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + type ListRuntimeEntriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -783,7 +885,7 @@ type ListRuntimeEntriesRequest struct { func (x *ListRuntimeEntriesRequest) Reset() { *x = ListRuntimeEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -796,7 +898,7 @@ func (x *ListRuntimeEntriesRequest) String() string { func (*ListRuntimeEntriesRequest) ProtoMessage() {} func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -809,7 +911,7 @@ func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRuntimeEntriesRequest.ProtoReflect.Descriptor instead. func (*ListRuntimeEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{12} + return file_protos_apricot_proto_rawDescGZIP(), []int{14} } func (x *ListRuntimeEntriesRequest) GetComponent() string { @@ -832,7 +934,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -845,7 +947,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -858,7 +960,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{13} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -897,7 +999,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -910,7 +1012,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -923,7 +1025,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{16} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -981,7 +1083,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -994,7 +1096,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1007,7 +1109,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -1028,7 +1130,7 @@ type DetectorsResponse struct { func (x *DetectorsResponse) Reset() { *x = DetectorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1041,7 +1143,7 @@ func (x *DetectorsResponse) String() string { func (*DetectorsResponse) ProtoMessage() {} func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1054,7 +1156,7 @@ func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsResponse.ProtoReflect.Descriptor instead. func (*DetectorsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *DetectorsResponse) GetDetectors() []string { @@ -1075,7 +1177,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1088,7 +1190,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1101,7 +1203,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *HostGetRequest) GetDetector() string { @@ -1122,7 +1224,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1135,7 +1237,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1148,7 +1250,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1172,7 +1274,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1185,7 +1287,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1198,7 +1300,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1242,7 +1344,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1255,7 +1357,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1268,7 +1370,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{22} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1303,7 +1405,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1316,7 +1418,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1329,7 +1431,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{21} + return file_protos_apricot_proto_rawDescGZIP(), []int{23} } func (x *CRUCardsResponse) GetCards() string { @@ -1351,7 +1453,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1364,7 +1466,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1377,7 +1479,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{22} + return file_protos_apricot_proto_rawDescGZIP(), []int{24} } func (x *CardRequest) GetHostname() string { @@ -1405,7 +1507,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1418,7 +1520,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1431,7 +1533,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{23} + return file_protos_apricot_proto_rawDescGZIP(), []int{25} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1478,210 +1580,224 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x22, 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, - 0x29, 0x0a, 0x0b, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, - 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, - 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, - 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, - 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, - 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x58, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, + 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x29, 0x0a, 0x0b, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x39, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x39, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, + 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, - 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, - 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, - 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, - 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, - 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, - 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, - 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, - 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, - 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, - 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, - 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, - 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, - 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, - 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, - 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x8f, 0x0b, 0x0a, 0x07, 0x41, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, + 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, + 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, + 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, + 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, + 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, + 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, + 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, + 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, + 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xed, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, + 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, - 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, - 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, - 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, - 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, - 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, + 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x4c, 0x69, + 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, + 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, + 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x5c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x57, 0x69, 0x74, 0x68, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, + 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1697,82 +1813,86 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty (*ComponentQuery)(nil), // 2: apricot.ComponentQuery (*ComponentRequest)(nil), // 3: apricot.ComponentRequest (*ComponentResponse)(nil), // 4: apricot.ComponentResponse - (*HostRequest)(nil), // 5: apricot.HostRequest - (*HostsRequest)(nil), // 6: apricot.HostsRequest - (*DetectorResponse)(nil), // 7: apricot.DetectorResponse - (*RunNumberResponse)(nil), // 8: apricot.RunNumberResponse - (*StringMap)(nil), // 9: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 10: apricot.RawGetRecursiveRequest - (*GetRuntimeEntryRequest)(nil), // 11: apricot.GetRuntimeEntryRequest - (*SetRuntimeEntryRequest)(nil), // 12: apricot.SetRuntimeEntryRequest - (*ListRuntimeEntriesRequest)(nil), // 13: apricot.ListRuntimeEntriesRequest - (*ComponentEntriesQuery)(nil), // 14: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 15: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 16: apricot.ComponentEntriesResponse - (*DetectorsResponse)(nil), // 17: apricot.DetectorsResponse - (*HostGetRequest)(nil), // 18: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 19: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 20: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 21: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 22: apricot.CRUCardsResponse - (*CardRequest)(nil), // 23: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 24: apricot.CRUCardEndpointResponse - nil, // 25: apricot.ComponentRequest.VarStackEntry - nil, // 26: apricot.StringMap.StringMapEntry + (*ComponentResponseWithLastIndex)(nil), // 5: apricot.ComponentResponseWithLastIndex + (*HostRequest)(nil), // 6: apricot.HostRequest + (*HostsRequest)(nil), // 7: apricot.HostsRequest + (*DetectorResponse)(nil), // 8: apricot.DetectorResponse + (*RunNumberResponse)(nil), // 9: apricot.RunNumberResponse + (*StringMap)(nil), // 10: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 11: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 12: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 13: apricot.SetRuntimeEntryRequest + (*GetEntryRequest)(nil), // 14: apricot.GetEntryRequest + (*ListRuntimeEntriesRequest)(nil), // 15: apricot.ListRuntimeEntriesRequest + (*ComponentEntriesQuery)(nil), // 16: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 17: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 18: apricot.ComponentEntriesResponse + (*DetectorsResponse)(nil), // 19: apricot.DetectorsResponse + (*HostGetRequest)(nil), // 20: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 21: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 22: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 23: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 24: apricot.CRUCardsResponse + (*CardRequest)(nil), // 25: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 26: apricot.CRUCardEndpointResponse + nil, // 27: apricot.ComponentRequest.VarStackEntry + nil, // 28: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 25, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 26, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 27, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 28, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 14, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 16, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty - 10, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 11, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest 1, // 11: apricot.Apricot.ListDetectors:input_type -> apricot.Empty - 18, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest - 5, // 13: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest - 6, // 14: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest - 5, // 15: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 23, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest - 11, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 12, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 13, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 1, // 20: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 15, // 21: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 22: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 23: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 20, // 24: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 8, // 25: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 9, // 26: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 9, // 27: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 28: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 17, // 29: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 19, // 30: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 7, // 31: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 17, // 32: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 22, // 33: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 24, // 34: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 35: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 36: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 16, // 37: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 16, // 38: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 16, // 39: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 16, // 40: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 41: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 21, // 42: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 25, // [25:43] is the sub-list for method output_type - 7, // [7:25] is the sub-list for method input_type + 20, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 6, // 13: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest + 7, // 14: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest + 6, // 15: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest + 25, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 12, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 13, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 15, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 14, // 20: apricot.Apricot.GetEntryWithLastIndex:input_type -> apricot.GetEntryRequest + 1, // 21: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 17, // 22: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 23: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 24: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 22, // 25: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 9, // 26: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 10, // 27: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 10, // 28: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 29: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 19, // 30: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 21, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 8, // 32: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 19, // 33: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 24, // 34: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 26, // 35: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 36: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 37: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 18, // 38: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 5, // 39: apricot.Apricot.GetEntryWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 18, // 40: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 18, // 41: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 18, // 42: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 43: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 23, // 44: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 26, // [26:45] is the sub-list for method output_type + 7, // [7:26] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name 7, // [7:7] is the sub-list for extension extendee 0, // [0:7] is the sub-list for field type_name @@ -1833,7 +1953,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostRequest); i { + switch v := v.(*ComponentResponseWithLastIndex); i { case 0: return &v.state case 1: @@ -1845,7 +1965,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostsRequest); i { + switch v := v.(*HostRequest); i { case 0: return &v.state case 1: @@ -1857,7 +1977,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorResponse); i { + switch v := v.(*HostsRequest); i { case 0: return &v.state case 1: @@ -1869,7 +1989,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunNumberResponse); i { + switch v := v.(*DetectorResponse); i { case 0: return &v.state case 1: @@ -1881,7 +2001,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringMap); i { + switch v := v.(*RunNumberResponse); i { case 0: return &v.state case 1: @@ -1893,7 +2013,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawGetRecursiveRequest); i { + switch v := v.(*StringMap); i { case 0: return &v.state case 1: @@ -1905,7 +2025,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuntimeEntryRequest); i { + switch v := v.(*RawGetRecursiveRequest); i { case 0: return &v.state case 1: @@ -1917,7 +2037,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRuntimeEntryRequest); i { + switch v := v.(*GetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1929,7 +2049,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRuntimeEntriesRequest); i { + switch v := v.(*SetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -1941,7 +2061,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*GetEntryRequest); i { case 0: return &v.state case 1: @@ -1953,7 +2073,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*ListRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -1965,7 +2085,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -1977,7 +2097,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsResponse); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -1989,7 +2109,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*ComponentEntriesResponse); i { case 0: return &v.state case 1: @@ -2001,7 +2121,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*DetectorsResponse); i { case 0: return &v.state case 1: @@ -2013,7 +2133,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -2025,7 +2145,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -2037,7 +2157,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -2049,7 +2169,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -2061,6 +2181,30 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CRUCardsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -2077,7 +2221,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[16].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -2087,7 +2231,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 26, + NumMessages: 28, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 2714b4269..cba1e9d98 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -47,6 +47,8 @@ service Apricot { rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} rpc ListRuntimeEntries(ListRuntimeEntriesRequest) returns (ComponentEntriesResponse) {} + rpc GetEntryWithLastIndex(GetEntryRequest) returns (ComponentResponseWithLastIndex) {} + // Component configuration calls rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} @@ -89,6 +91,11 @@ message ComponentResponse { string payload = 1; } +message ComponentResponseWithLastIndex { + string payload = 1; + uint64 lastIndex = 2; +} + message HostRequest { string hostname = 1; } @@ -123,6 +130,9 @@ message SetRuntimeEntryRequest { string key = 2; string value = 3; } +message GetEntryRequest { + string key = 1; +} message ListRuntimeEntriesRequest { string component = 1; diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 11dde981f..3083af72e 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -33,6 +33,7 @@ type ApricotClient interface { GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) + GetEntryWithLastIndex(ctx context.Context, in *GetEntryRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) // Component configuration calls ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -166,6 +167,15 @@ func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeE return out, nil } +func (c *apricotClient) GetEntryWithLastIndex(ctx context.Context, in *GetEntryRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) { + out := new(ComponentResponseWithLastIndex) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetEntryWithLastIndex", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) @@ -230,6 +240,7 @@ type ApricotServer interface { GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) + GetEntryWithLastIndex(context.Context, *GetEntryRequest) (*ComponentResponseWithLastIndex, error) // Component configuration calls ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) @@ -281,6 +292,9 @@ func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEn func (UnimplementedApricotServer) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRuntimeEntries not implemented") } +func (UnimplementedApricotServer) GetEntryWithLastIndex(context.Context, *GetEntryRequest) (*ComponentResponseWithLastIndex, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetEntryWithLastIndex not implemented") +} func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListComponents not implemented") } @@ -542,6 +556,24 @@ func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Apricot_GetEntryWithLastIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetEntryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetEntryWithLastIndex(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetEntryWithLastIndex", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetEntryWithLastIndex(ctx, req.(*GetEntryRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(Empty) if err := dec(in); err != nil { @@ -691,6 +723,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListRuntimeEntries", Handler: _Apricot_ListRuntimeEntries_Handler, }, + { + MethodName: "GetEntryWithLastIndex", + Handler: _Apricot_GetEntryWithLastIndex_Handler, + }, { MethodName: "ListComponents", Handler: _Apricot_ListComponents_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 497716db6..a5b7318a7 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -245,6 +245,22 @@ func (m *RpcServer) ListRuntimeEntries(_ context.Context, request *apricotpb.Lis return &apricotpb.ComponentEntriesResponse{Payload: payload}, E_OK.Err() } +func (m *RpcServer) GetEntryWithLastIndex(_ context.Context, request *apricotpb.GetEntryRequest) (*apricotpb.ComponentResponseWithLastIndex, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + payload, lastIndex, err := m.service.GetEntryWithLastIndex(request.Key) + if err != nil { + return nil, err + } + return &apricotpb.ComponentResponseWithLastIndex{Payload: payload, LastIndex: lastIndex}, E_OK.Err() +} + func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index c4cea8825..85760a60c 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -218,6 +218,18 @@ func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, return response.GetPayload(), nil } +func (c *RemoteService) GetEntryWithLastIndex(key string) (payload string, lastIndex uint64, err error) { + var response *apricotpb.ComponentResponseWithLastIndex + request := &apricotpb.GetEntryRequest{ + Key: key, + } + response, err = c.cli.GetEntryWithLastIndex(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", 0, err + } + return response.GetPayload(), response.GetLastIndex(), nil +} + func (c *RemoteService) ListDetectors() (detectors []string, err error) { var response *apricotpb.DetectorsResponse response, err = c.cli.ListDetectors(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) diff --git a/configuration/cfgbackend/consulsource.go b/configuration/cfgbackend/consulsource.go index 4ff2f692e..d21da1856 100644 --- a/configuration/cfgbackend/consulsource.go +++ b/configuration/cfgbackend/consulsource.go @@ -97,6 +97,26 @@ func (cc *ConsulSource) Get(key string) (value string, err error) { return } +func (cc *ConsulSource) GetWithLastIndex(key string) (value string, lastIndex uint64, err error) { + var kvp *api.KVPair + var qm *api.QueryMeta + kvp, qm, err = cc.kv.Get(formatKey(key), nil) + if err != nil { + return + } + if kvp != nil { + value = string(kvp.Value[:]) + } else { + err = fmt.Errorf("nil value response for key %s", key) + } + if qm != nil { + lastIndex = qm.LastIndex + } else { + err = fmt.Errorf("nil metadata response for key %s", key) + } + return +} + func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { // An empty keyPrefix is ok by definition. // If it's non-empty, we must ensure its sanity. diff --git a/configuration/service.go b/configuration/service.go index 363b864b3..28681cd00 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -32,6 +32,8 @@ type RuntimeService interface { GetRuntimeEntry(component string, key string) (string, error) SetRuntimeEntry(component string, key string, value string) error ListRuntimeEntries(component string) ([]string, error) + + GetEntryWithLastIndex(key string) (string, uint64, error) } type Service interface { diff --git a/go.mod b/go.mod index 6c22f26e9..28a32b902 100644 --- a/go.mod +++ b/go.mod @@ -47,6 +47,7 @@ require ( github.com/envoyproxy/go-control-plane v0.9.8 // indirect github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect github.com/fatih/color v1.10.0 + github.com/fatih/structs v1.1.0 // indirect github.com/flosch/pongo2/v4 v4.0.2 github.com/gdamore/tcell/v2 v2.1.0 github.com/gliderlabs/ssh v0.3.0 // indirect diff --git a/go.sum b/go.sum index 32c501b6f..20082015c 100644 --- a/go.sum +++ b/go.sum @@ -303,6 +303,8 @@ github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE= github.com/flosch/pongo2/v4 v4.0.0 h1:6eZe8NSNxtTTGwXgJqqXiiLEDAj7CvkwiYrZFQRW6cQ= github.com/flosch/pongo2/v4 v4.0.0/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= From 9281c599c7d58dd48ee77b0373e108a7fe954627 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 16 Nov 2021 17:34:23 +0100 Subject: [PATCH 1083/2352] [translate] Remove translate role --- core/workflow/aggregator.go | 5 - core/workflow/iteratorrole.go | 2 - core/workflow/translaterole.go | 218 ----------------------------- core/workflow/translatetemplate.go | 90 ------------ 4 files changed, 315 deletions(-) delete mode 100644 core/workflow/translaterole.go delete mode 100644 core/workflow/translatetemplate.go diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 76aa2dd48..5b0981016 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -61,7 +61,6 @@ type _roleUnion struct{ *taskRole *callRole *includeRole - *translateRole } func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { @@ -82,8 +81,6 @@ func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (union unionErr = unmarshal(&union.callRole) case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: unionErr = unmarshal(&union.includeRole) - case _probe.Translate != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: - unionErr = unmarshal(&union.translateRole) default: unionErr = errors.New("cannot unmarshal invalid role to union") } @@ -116,8 +113,6 @@ func (r *aggregator) UnmarshalYAML(unmarshal func(interface{}) error) (err error roles[i] = v.callRole case v.includeRole != nil: roles[i] = v.includeRole - case v.translateRole != nil: - roles[i] = v.translateRole default: err = errors.New("invalid child role at index " + strconv.Itoa(i)) return diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index af316fb72..e06e643cf 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -107,8 +107,6 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err template = &callTemplate{} case _probe.Include != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: template = &includeTemplate{} - case _probe.Translate != nil && _probe.Task == nil && _probe.Roles == nil && _probe.Call == nil: - template = &translateTemplate{} default: err = errors.New("invalid template role in iterator") return diff --git a/core/workflow/translaterole.go b/core/workflow/translaterole.go deleted file mode 100644 index 85f98f07f..000000000 --- a/core/workflow/translaterole.go +++ /dev/null @@ -1,218 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Kostas Alexopoulos - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -import ( - "crypto/sha1" - "encoding/hex" - "errors" - "fmt" - "github.com/AliceO2Group/Control/configuration/template" - "github.com/AliceO2Group/Control/core/repos" - "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" - "os/exec" - "strings" - texttemplate "text/template" -) - -// A translateRole is a delayed aggregatorRole -// It takes a `translate` entry, which is then translated into a dpl workflow -// and expanded into a full aggregatorRole during the ProcessTemplates function. -type translateRole struct { - aggregatorRole - - Translate string `yaml:"translate,omitempty"` -} - -func (r *translateRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - // NOTE: see NOTE in roleBase.UnmarshalYAML - - innerRoleBase := roleBase{} - err = unmarshal(&innerRoleBase) - if err != nil { - return - } - - type auxTranslate struct{ - Translate string `yaml:"translate,omitempty"` - } - _auxTranslate:= auxTranslate{} - err = unmarshal(&_auxTranslate) - if err != nil { - return - } - - role := translateRole{ - aggregatorRole: aggregatorRole{ - roleBase: innerRoleBase, - aggregator: aggregator{}, - }, - Translate: _auxTranslate.Translate, - } - - - *r = role - return -} - -func (r *translateRole) MarshalYAML() (interface{}, error) { - return nil, nil -} - -func (r *translateRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { - - // Two "rounds" of templating are necessary here as the initial thing received is {{ dpl_command }} which is *THEN* templated to the actual dpl command payload - for i := 0; i < 2; i++ { - - if r == nil { - return errors.New("role tree error when processing templates") - } - - templSequence := template.Sequence{ - template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), - template.STAGE1: template.WrapMapItems(r.Vars.Raw()), - template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), - template.STAGE3: template.Fields{ - template.WrapPointer(&r.Name), - template.WrapPointer(&r.Translate), - }, - template.STAGE4: append(append( - WrapConstraints(r.Constraints), - r.wrapBindAndConnectFields()...), - template.WrapPointer(&r.Enabled)), - } - - err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ - Locals: r.Locals, - Defaults: r.Defaults, - Vars: r.Vars, - UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) - if err != nil { - return - } - - // After template processing we write the Locals to Vars in order to make them available to children - for k, v := range r.Locals { - r.Vars.Set(k, v) - } - - r.Enabled = strings.TrimSpace(r.Enabled) - - if !r.IsEnabled() { - // Normally it's the parent that checks whether a child is enabled after that child's - // ProcessTemplates is done, and this is true for the current role as well, but if - // at this point we already know that the current role is disabled (and will - // therefore be excluded by its parent), we don't try to resolve the workflow - // inclusion because there's no reason to do so anyway. - return nil - } - } - // Common part done, translate resolution starts here. - // A translateRole consists of DPL JIT and the equivalent of an `include:` - // expression. We first resolve the DPL command, we run it and then follow the - // `include` role strategy with the resulting workflow: - // We first need to resolve the expression to obtain a full subworkflow template identifier, - // i.e. a full repo/wft/branch combo. - // Once that's done we can load the subworkflow and obtain the root `aggregatorRole` plus a new - // repos.Repo definition. If a repo or branch is already provided in the subworkflow expression - // then the returned newWfRepo will reflect this, and any additionally nested includes will - // default to the repo of their direct parent. - - // JIT requires DPL command as input and returns the ready-to-use workflow name as output - // JIT takes place after the templated DPL command has been resolved - jit := func(dplCommand string) (string, error) { - //start := time.Now().UnixNano() / int64(time.Millisecond) - - hash := sha1.New() - hash.Write([]byte(r.Translate)) - jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) - // TODO: Check if tasks / workflows already exist? - - log.Trace("Resolved DPL command: " + dplCommand) - - // TODO: Before executing we need to check that this is a valid dpl command - // If not, any command may be injected on the aliecs host - // since this will be run as user `aliecs` it might not pose a problem at this point - cmdString := dplCommand + " --o2-control " + jitWorkflowName - dplCmd := exec.Command("bash", "-c", cmdString) - - // execute the DPL command in the repo of the workflow used - dplCmd.Dir = workflowRepo.GetCloneDir() - var dplOut []byte - dplOut, err = dplCmd.CombinedOutput() - log.Trace("DPL command out: " + string(dplOut)) - if err != nil { - return "", fmt.Errorf("Failed to run DPL command : " + err.Error()) - } - - /*end := time.Now().UnixNano() / int64(time.Millisecond) - log.Tracef("JIT took %d ms", end-start)*/ - return jitWorkflowName, err - } - - var subWfRoot *aggregatorRole - var newWfRepo repos.IRepo - - var jitWorkflowName string - jitWorkflowName, err = jit(r.Translate) - translate := workflowRepo.ResolveSubworkflowTemplateIdentifier(jitWorkflowName) - subWfRoot, newWfRepo, err = loadSubworkflow(translate, r) - if err != nil { - return err - } - - // By now the subworkflow is loaded and reparented to this translateRole. This reparenting is - // needed to ensure the correct gera.StringMap hierarchies, but now that we replace the - // composed aggregatorRole with the newly loaded one, we must also fix the reparenting and - // ensure the loaded name doesn't overwrite the original name of the translateRole. - parent := r.parent - name := r.Name - r.aggregatorRole = *subWfRoot // The previously composed aggregatorRole+roleBase are overwritten here - r.parent = parent - r.Name = name - - return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) -} - -func (r* translateRole) UpdateStatus(s task.Status) { - r.updateStatus(s) -} - -func (r* translateRole) UpdateState(s task.State) { - r.updateState(s) -} - -func (r *translateRole) copy() copyable { - rCopy := translateRole{ - aggregatorRole: *r.aggregatorRole.copy().(*aggregatorRole), - Translate: r.Translate, - } - rCopy.status = SafeStatus{status:rCopy.GetStatus()} - rCopy.state = SafeState{state:rCopy.GetState()} - return &rCopy -} diff --git a/core/workflow/translatetemplate.go b/core/workflow/translatetemplate.go deleted file mode 100644 index a77cfc505..000000000 --- a/core/workflow/translatetemplate.go +++ /dev/null @@ -1,90 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * Author: Kostas Alexopoulos - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -import ( - "errors" - "github.com/jinzhu/copier" - "text/template" -) - -type translateTemplate struct { - translateRole - stringTemplates map[string]template.Template `yaml:"-,omitempty"` -} - -func (tt *translateTemplate) copy() copyable { - rCopy := translateTemplate{ - translateRole: *tt.translateRole.copy().(*translateRole), - } - _ = copier.Copy(&rCopy.stringTemplates, &tt.stringTemplates) - return &rCopy -} - -func (tt *translateTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - type _translateTemplate translateTemplate - aux := _translateTemplate{} - err = unmarshal(&aux) - if err != nil { - return - } - aux.stringTemplates = make(map[string]template.Template) - - /* template cache builder - tmpl := template.New(aux.GetPath()) - - // Fields to parse as templates: - for _, str := range []string{ - aux.LoadTaskClass, - aux.Name, - } { - var tempTmpl *template.Template - tempTmpl, err = tmpl.Parse(str) - if err != nil { - return - } - aux.stringTemplates[str] = *tempTmpl - } - */ - - *tt = translateTemplate(aux) - return -} - -func (tt *translateTemplate) generateRole(localVars map[string]string) (c Role, err error) { - if tt == nil { - return nil, errors.New("cannot generate from nil sender") - } - - // See note for aggregatorTemplate.generateRole - tr := *tt.translateRole.copy().(*translateRole) - for k, v := range localVars { - tr.Locals[k] = v - } - - c = &tr - return -} \ No newline at end of file From 37bee26b7f1228cab05b5714b35892e62182b1a9 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 16 Nov 2021 17:36:12 +0100 Subject: [PATCH 1084/2352] [repos] Remove apricot dependency from package --- core/repos/repo.go | 32 ++++++++------------------------ core/repos/repomanager.go | 10 ++++++++-- core/task/manager.go | 2 +- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 1b86738cb..fc20f72e4 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,7 +26,6 @@ package repos import ( "errors" - "github.com/AliceO2Group/Control/apricot" "github.com/go-git/go-git/v5" "github.com/go-git/go-git/v5/plumbing" "github.com/gobwas/glob" @@ -85,6 +84,7 @@ type Repo struct { Hash string Default bool Revisions []string + ReposPath string } @@ -113,9 +113,9 @@ func resolveProtocolFromPath(repoPath string) string { return "local" } -func newRepo(repoPath string, defaultRevision string) (iRepo, error) { +func newRepo(repoPath string, defaultRevision string, reposPath string) (iRepo, error) { - protocol, newRepo, err := NewRepo(repoPath, defaultRevision) + protocol, newRepo, err := NewRepo(repoPath, defaultRevision, reposPath) if err != nil { return nil, err } @@ -140,7 +140,7 @@ func newRepo(repoPath string, defaultRevision string) (iRepo, error) { return &newRepo, nil } -func NewRepo(repoPath string, defaultRevision string) (string, Repo, error) { +func NewRepo(repoPath string, defaultRevision string, reposPath string) (string, Repo, error) { // Repo url resolution uses splitAfter(), so if the repoPath ends with "/", it will be split to an extra "" element // messing up the resolution. Trim the potential suffix to mitigate the issue @@ -190,6 +190,7 @@ func NewRepo(repoPath string, defaultRevision string) (string, Repo, error) { RepoName: strings.TrimSuffix(repoUrlSlice[len(repoUrlSlice)-1], ".git"), Revision: revision, DefaultRevision: defaultRevision, + ReposPath: reposPath, } return protocol, newRepo, nil @@ -201,15 +202,13 @@ func (r *Repo) GetIdentifier() string { func (r *Repo) GetCloneDir() string { var cloneDir string - rs := &RepoService{Svc: apricot.Instance()} - cloneDir = rs.GetReposPath() + cloneDir = r.ReposPath cloneDir = filepath.Join(cloneDir, r.HostingSite, r.Path, r.RepoName) return cloneDir } func (r *Repo) getCloneParentDirs() []string { - rs := &RepoService{Svc: apricot.Instance()} - cleanDir := rs.GetReposPath() + cleanDir := r.ReposPath cleanDirHostingSite := filepath.Join(cleanDir, r.HostingSite) @@ -559,20 +558,6 @@ func (r *Repo) GetRevisions() []string { return r.Revisions } -// TODO: What was the motivation of having this? -// Currently unused -func (r *Repo) getAndSetDefaultRevisionFromRs() string { - rs := &RepoService{Svc: apricot.Instance()} - revsMap, err := rs.GetRepoDefaultRevisions() - if err != nil { - return r.DefaultRevision - } - - if defaultRevision, ok := revsMap[r.GetIdentifier()]; ok { - r.DefaultRevision = defaultRevision - } - return r.DefaultRevision -} func (r *Repo) GetDefaultRevision() string { @@ -613,7 +598,6 @@ func (r *Repo) setDefault(def bool) { } func (r *Repo) GetTaskTemplatePath(taskClassFile string) string { - rs := &RepoService{Svc: apricot.Instance()} - return filepath.Join(rs.GetReposPath(), taskClassFile) + return filepath.Join(r.ReposPath, taskClassFile) } \ No newline at end of file diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index e8f651d34..83a5e251b 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -80,6 +80,8 @@ func initializeRepos(service configuration.Service) *RepoManager { rm.cService = service rm.rService = &RepoService{Svc: service} + rm.rService.GetReposPath() + var err error // Get global default revision rm.defaultRevision, err = rm.rService.GetDefaultRevision() @@ -242,7 +244,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st defaultRevision = manager.defaultRevision } - repo, err := newRepo(repoPath, defaultRevision) + repo, err := newRepo(repoPath, defaultRevision, manager.rService.GetReposPath()) if err != nil { return "", false, err @@ -601,7 +603,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er reposRequired := make(map[string]iRepo) for _, taskClass := range taskClassesRequired { var taskRepo iRepo - taskRepo, err = newRepo(taskClass, manager.defaultRevision) + taskRepo, err = newRepo(taskClass, manager.defaultRevision, manager.rService.GetReposPath()) if err != nil { return } @@ -721,3 +723,7 @@ func (manager *RepoManager) GetWorkflowTemplates(repoPattern string, revisionPat func (manager *RepoManager) GetDefaultRevision() string { return manager.defaultRevision } + +func (manager *RepoManager) GetReposPath() string { + return manager.rService.GetReposPath() +} diff --git a/core/task/manager.go b/core/task/manager.go index bc4c352c8..566b3e35f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -173,7 +173,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err taskClassString := strings.Split(taskClass, "@") taskClassFile := taskClassString[0] + ".yaml" var tempRepo repos.Repo - _, tempRepo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision()) + _, tempRepo, err = repos.NewRepo(strings.Split(taskClassFile, "tasks")[0], repoManager.GetDefaultRevision(), repoManager.GetReposPath()) if err != nil { return } From 47ac0eba0686a68da02c58d58590f091259b5e00 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 16 Nov 2021 17:55:56 +0100 Subject: [PATCH 1085/2352] [core] Add RepoAccessFuncs in templates --- configuration/template/fields.go | 15 ++++++++++++--- configuration/template/stack.go | 2 +- core/task/task.go | 9 ++++++--- core/workflow/aggregatorrole.go | 2 +- core/workflow/callable/call.go | 3 ++- core/workflow/callrole.go | 3 ++- core/workflow/includerole.go | 2 +- core/workflow/iteratorrange.go | 6 ++++-- core/workflow/taskrole.go | 2 +- 9 files changed, 30 insertions(+), 14 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 854c6ce6c..ad1ce83e6 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -28,6 +28,7 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/AliceO2Group/Control/core/repos" "io" "strings" "text/template" @@ -56,9 +57,10 @@ type ConfigurationService interface { GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) GetRuntimeEntry(component string, key string) (string, error) + GetEntryWithLastIndex(key string) (string, uint64, error) } -func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template) (err error) { +func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { for i := 0; i < int(_STAGE_MAX); i++ { currentStage := Stage(i) @@ -84,7 +86,7 @@ func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varS }(), }).Trace("about to process fields for stage") } - err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache) + err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache, workflowRepo) if err != nil { log.WithError(err).Errorf("template processing error") return @@ -189,7 +191,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri return } -func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template) (err error) { +func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { environment := make(map[string]interface{}, len(varStack)) strOpStack := MakeStrOperationFuncMap(varStack) for k, v := range varStack { @@ -201,6 +203,13 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va environment[k] = v } + if workflowRepo != nil { + repoAccessFuncs := MakeRepoAccessFuncs(confSvc, varStack, workflowRepo) + for k, v := range repoAccessFuncs { + environment[k] = v + } + } + configAccessFuncs := MakeConfigAccessFuncs(confSvc, varStack) for k, v := range configAccessFuncs { environment[k] = v diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 48133df32..2ee6e9e6a 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -64,7 +64,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } fields := Fields{WrapPointer(&payload)} - err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template)) + err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template), nil) log.Warn(varStack) log.Warn(payload) return payload diff --git a/core/task/task.go b/core/task/task.go index 951cac460..4028644b7 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -268,7 +268,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We resolve any template expressions in Defaults defaultFields := template.WrapMapItems(localDefaults) - err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template)) + //TODO: A repo can be constructed from the taskClass + err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err).Error("cannot resolve templates for task defaults") @@ -303,7 +304,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) } - err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template)) + //TODO: A repo can be constructed from the taskClass + err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err).Error("cannot resolve templates for task command info") @@ -523,7 +525,8 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand fields := template.WrapMapItems(propMap) - err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template)) + //TODO: A repo can be constructed from the taskClass + err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { log.WithError(err).Error("cannot resolve templates for property map") return diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 67adff9be..96210d44b 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -124,7 +124,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf Defaults: r.Defaults, Vars: r.Vars, UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) if err != nil { return } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index c582c91c9..abeeccd50 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -214,7 +214,8 @@ func (c *Call) Call() error { objStack := integration.PluginsInstance().CallStack(c) - err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template)) + //TODO: Can the repo be fetched from somewhere? + err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { return err } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index f5feb93f0..5e7c97c04 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -130,7 +130,7 @@ func (t *callRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *callRole) ProcessTemplates(_ repos.IRepo, _ LoadSubworkflowFunc) (err error) { +func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc) (err error) { if t == nil { return errors.New("role tree error when processing templates") } @@ -164,6 +164,7 @@ func (t *callRole) ProcessTemplates(_ repos.IRepo, _ LoadSubworkflowFunc) (err e }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), + workflowRepo, ) if err != nil { return diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 30c168109..27d2bf2cb 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -104,7 +104,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow Defaults: r.Defaults, Vars: r.Vars, UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) if err != nil { return } diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index 97208387f..25886ee56 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -58,7 +58,8 @@ func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, fields := template.Fields{ template.WrapPointer(&f.Range), } - err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) + //TODO: Can the repo be fetched from somewhere? + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) if err != nil { return } @@ -95,7 +96,8 @@ func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, e template.WrapPointer(&f.Begin), template.WrapPointer(&f.End), } - err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template)) + //TODO: Can the repo be fetched from somewhere? + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) if err != nil { return } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 7fae3bdba..c3d99177f 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -154,7 +154,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF Defaults: t.Defaults, Vars: t.Vars, UserVars: t.UserVars, - }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template)) + }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) if err != nil { return } From 7688c2e1afb93973262df32bcbc54ab0bef2b2e5 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 16 Nov 2021 17:56:24 +0100 Subject: [PATCH 1086/2352] [core] Add JIT func in templates (provisional) --- configuration/template/fields.go | 2 +- configuration/template/stack.go | 88 ++++++++++++++++++++++++++++++++ core/repos/repo.go | 4 -- core/repos/repomanager.go | 2 - core/workflow/aggregator.go | 1 - core/workflow/iteratorrole.go | 1 + 6 files changed, 90 insertions(+), 8 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index ad1ce83e6..e79292fd4 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -204,7 +204,7 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va } if workflowRepo != nil { - repoAccessFuncs := MakeRepoAccessFuncs(confSvc, varStack, workflowRepo) + repoAccessFuncs := MakeConfigAndRepoAccessFuncs(confSvc, varStack, workflowRepo) for k, v := range repoAccessFuncs { environment[k] = v } diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 2ee6e9e6a..e22e034e6 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -25,9 +25,16 @@ package template import ( + "crypto/sha1" + "encoding/hex" "encoding/json" "errors" "fmt" + "github.com/AliceO2Group/Control/core/repos" + "os" + "os/exec" + "path/filepath" + "regexp" "strconv" "strings" texttemplate "text/template" @@ -128,6 +135,87 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } } +func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { + return map[string]interface{} { + "JIT": func (dplCommand string) string { + jit := func(dplCommand string) (dplWorkflow string) { + //start := time.Now().UnixNano() / int64(time.Millisecond) + + const nMaxExpectedQcPayloads = 2 + var metadata string + + // Isolate possible consul qc config payloads + // TODO: this may be easily replaced to match __any__ consul key + //re := regexp.MustCompile(`'consul-json://[^']*'`) + re := regexp.MustCompile(`'consul-json://[^/]*/o2/components/qc/[^']*'`) + matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) + + // Concatenate the consul LastIndex for each payload in a single string + for _, match := range matches { + keyRe := regexp.MustCompile(`/o2/components/qc/[^']*`) + consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) + _, lastIndex, err := confSvc.GetEntryWithLastIndex(consulKeyMatch[0][0]) + if err != nil { + return fmt.Sprintf("JIT failed trying to query qc consul payload %s : " + err.Error(), + match) + } + metadata += strconv.FormatUint(lastIndex, 10) + } + + var err error + + // Generate a hash out of the concatenation of + // 1) The full DPL command + // 2) The LastIndex of each payload + hash := sha1.New() + hash.Write([]byte(dplCommand + metadata)) + //hash.Write([]byte(consulConfigTimestamp)) + jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) + + // We now have a workflow name made out of a hash that should be unique with respect to + // 1) DPL command and + // 2) Consul payload versions + // Only generate new tasks & workflows if the files don't exist + // If they exist, hash comparison guarantees validity + if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+ ".yaml")); err == nil { + log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) + return jitWorkflowName + } + + log.Trace("Resolved DPL command: " + dplCommand) + + // TODO: Before executing we need to check that this is a valid dpl command + // If not, any command may be injected on the aliecs host + // since this will be run as user `aliecs` it might not pose a problem at this point + cmdString := dplCommand + " --o2-control " + jitWorkflowName + dplCmd := exec.Command("bash", "-c", cmdString) + + // execute the DPL command in the repo of the workflow used + dplCmd.Dir = workflowRepo.GetCloneDir() + var dplOut []byte + dplOut, err = dplCmd.CombinedOutput() + log.Trace("DPL command out: " + string(dplOut)) + if err != nil { + return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) + } + + /*end := time.Now().UnixNano() / int64(time.Millisecond) + log.Tracef("JIT took %d ms", end-start)*/ + return jitWorkflowName + } + + // Resolve any templates as part of the DPL command + fields := Fields{WrapPointer(&dplCommand)} + err := fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + if err != nil { + return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + } + + return jit(dplCommand) + }, + } +} + func MakeConfigAccessFuncsMultiVar(confSvc ConfigurationService, varStack map[string]string) MultiVarConfigAccessFuncs { return MultiVarConfigAccessFuncs{ "EndpointsForCRUCard": func(hostname, cardSerial string) string { diff --git a/core/repos/repo.go b/core/repos/repo.go index fc20f72e4..d165728a0 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -321,10 +321,6 @@ func (r *Repo) refresh() error { return errors.New(err.Error() + ": " + r.GetIdentifier()) } - if err != nil { - return errors.New(err.Error() + ": " + r.GetIdentifier()) - } - err = ref.Fetch(&git.FetchOptions{ RemoteName: "origin", Force: true, diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 83a5e251b..0bb1b1326 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -80,8 +80,6 @@ func initializeRepos(service configuration.Service) *RepoManager { rm.cService = service rm.rService = &RepoService{Svc: service} - rm.rService.GetReposPath() - var err error // Get global default revision rm.defaultRevision, err = rm.rService.GetDefaultRevision() diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 5b0981016..4642d34ed 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -53,7 +53,6 @@ type _unionTypeProbe struct { Roles []interface{} Call *struct{} Include *string - Translate *string } type _roleUnion struct{ *iteratorRole diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index e06e643cf..7be564f1e 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -159,6 +159,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } + // TODO: Remove this timings start := time.Now().UnixNano() / int64(time.Millisecond) var wg sync.WaitGroup From 48d6c6bf56f1da18760c5dd8f27dcfff34c2e37f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 19 Nov 2021 16:55:37 +0100 Subject: [PATCH 1087/2352] [core] Use Component config for JIT consul payloads --- apricot/local/service.go | 47 ++++++++++++--- apricot/protos/apricot.pb.go | 95 ++++++++++++++++--------------- apricot/protos/apricot.proto | 3 +- apricot/protos/apricot_grpc.pb.go | 72 +++++++++++------------ apricot/remote/server.go | 61 ++++++++++++++------ apricot/remote/service.go | 37 ++++++++---- configuration/service.go | 3 +- configuration/template/fields.go | 2 +- configuration/template/stack.go | 29 +++++----- core/repos/repomanager.go | 2 - core/task/task.go | 3 - core/workflow/callable/call.go | 1 - core/workflow/iteratorrange.go | 2 - core/workflow/iteratorrole.go | 2 +- 14 files changed, 212 insertions(+), 147 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 62f5efc66..85af57a8f 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -242,6 +242,45 @@ func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload return } +func (s *Service) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) { + if query == nil { + return + } + + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { + var timestamp string + + if len(query.Timestamp) == 0 { + keyPrefix := query.AbsoluteWithoutTimestamp() + if cSrc.IsDir(keyPrefix) { + var keys []string + keys, err = cSrc.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, query) + if err != nil { + return + } + } + } else { + timestamp = query.Timestamp + } + absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp + if exists, _ := cSrc.Exists(absKey); exists && len(timestamp) > 0 { + payload, lastIndex, err = cSrc.GetWithLastIndex(absKey) + } else { + // falling back to timestampless configuration + absKey = query.AbsoluteWithoutTimestamp() + payload, lastIndex, err = cSrc.GetWithLastIndex(absKey) + } + } else { + err = errors.New("component with last index not supported with file backend") + } + + return +} + func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { path := query.Path() @@ -426,14 +465,6 @@ func (s *Service) ListRuntimeEntries(component string) ([]string, error) { } } -func (s *Service) GetEntryWithLastIndex(key string) (string, uint64, error) { - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - return cSrc.GetWithLastIndex(key) - } else { - return "", 0, errors.New("runtime KV not supported with file backend") - } -} - func (s *Service) ListComponents() (components []string, err error) { keyPrefix := componentcfg.ConfigComponentsPath var keys []string diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 5cd12b67a..f2450b7c5 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1698,7 +1698,7 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xed, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x72, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xff, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, @@ -1758,46 +1758,47 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5c, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x18, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, - 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, + 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1866,11 +1867,11 @@ var file_protos_apricot_proto_depIdxs = []int32{ 12, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 13, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest 15, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 14, // 20: apricot.Apricot.GetEntryWithLastIndex:input_type -> apricot.GetEntryRequest - 1, // 21: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 17, // 22: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 23: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 24: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 1, // 20: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 17, // 21: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 22: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 23: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 3, // 24: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest 22, // 25: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest 9, // 26: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse 10, // 27: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap @@ -1885,11 +1886,11 @@ var file_protos_apricot_proto_depIdxs = []int32{ 4, // 36: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse 1, // 37: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty 18, // 38: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 5, // 39: apricot.Apricot.GetEntryWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 18, // 40: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 18, // 41: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 18, // 42: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 43: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 18, // 39: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 18, // 40: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 18, // 41: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 42: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 43: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex 23, // 44: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse 26, // [26:45] is the sub-list for method output_type 7, // [7:26] is the sub-list for method input_type diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index cba1e9d98..68d88e386 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -47,13 +47,12 @@ service Apricot { rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} rpc ListRuntimeEntries(ListRuntimeEntriesRequest) returns (ComponentEntriesResponse) {} - rpc GetEntryWithLastIndex(GetEntryRequest) returns (ComponentResponseWithLastIndex) {} - // Component configuration calls rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} + rpc GetComponentConfigurationWithLastIndex(ComponentRequest) returns (ComponentResponseWithLastIndex) {} rpc ImportComponentConfiguration(ImportComponentConfigurationRequest) returns (ImportComponentConfigurationResponse) {} } diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 3083af72e..9b5865c0f 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -33,12 +33,12 @@ type ApricotClient interface { GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) - GetEntryWithLastIndex(ctx context.Context, in *GetEntryRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) // Component configuration calls ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) + GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) } @@ -167,15 +167,6 @@ func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeE return out, nil } -func (c *apricotClient) GetEntryWithLastIndex(ctx context.Context, in *GetEntryRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) { - out := new(ComponentResponseWithLastIndex) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetEntryWithLastIndex", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) @@ -212,6 +203,15 @@ func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *Compo return out, nil } +func (c *apricotClient) GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) { + out := new(ComponentResponseWithLastIndex) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfigurationWithLastIndex", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) { out := new(ImportComponentConfigurationResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ImportComponentConfiguration", in, out, opts...) @@ -240,12 +240,12 @@ type ApricotServer interface { GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) - GetEntryWithLastIndex(context.Context, *GetEntryRequest) (*ComponentResponseWithLastIndex, error) // Component configuration calls ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) + GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) } @@ -292,9 +292,6 @@ func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEn func (UnimplementedApricotServer) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRuntimeEntries not implemented") } -func (UnimplementedApricotServer) GetEntryWithLastIndex(context.Context, *GetEntryRequest) (*ComponentResponseWithLastIndex, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetEntryWithLastIndex not implemented") -} func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListComponents not implemented") } @@ -307,6 +304,9 @@ func (UnimplementedApricotServer) ListComponentEntryHistory(context.Context, *Co func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") } +func (UnimplementedApricotServer) GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfigurationWithLastIndex not implemented") +} func (UnimplementedApricotServer) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ImportComponentConfiguration not implemented") } @@ -556,24 +556,6 @@ func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Apricot_GetEntryWithLastIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetEntryRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).GetEntryWithLastIndex(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/apricot.Apricot/GetEntryWithLastIndex", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).GetEntryWithLastIndex(ctx, req.(*GetEntryRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(Empty) if err := dec(in); err != nil { @@ -646,6 +628,24 @@ func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Con return interceptor(ctx, in, info, handler) } +func _Apricot_GetComponentConfigurationWithLastIndex_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetComponentConfigurationWithLastIndex(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetComponentConfigurationWithLastIndex", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetComponentConfigurationWithLastIndex(ctx, req.(*ComponentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ImportComponentConfigurationRequest) if err := dec(in); err != nil { @@ -723,10 +723,6 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListRuntimeEntries", Handler: _Apricot_ListRuntimeEntries_Handler, }, - { - MethodName: "GetEntryWithLastIndex", - Handler: _Apricot_GetEntryWithLastIndex_Handler, - }, { MethodName: "ListComponents", Handler: _Apricot_ListComponents_Handler, @@ -743,6 +739,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetComponentConfiguration", Handler: _Apricot_GetComponentConfiguration_Handler, }, + { + MethodName: "GetComponentConfigurationWithLastIndex", + Handler: _Apricot_GetComponentConfigurationWithLastIndex_Handler, + }, { MethodName: "ImportComponentConfiguration", Handler: _Apricot_ImportComponentConfiguration_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index a5b7318a7..6a8d26f85 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -133,6 +133,51 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico return &apricotpb.ComponentResponse{Payload: payload}, E_OK.Err() } +func (m *RpcServer) GetComponentConfigurationWithLastIndex(_ context.Context, request *apricotpb.ComponentRequest) (*apricotpb.ComponentResponseWithLastIndex, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + var query *componentcfg.Query + if rawPath := request.GetPath(); len(rawPath) > 0 { + var err error + query, err = componentcfg.NewQuery(rawPath) + if err != nil { + return nil, E_BAD_INPUT + } + } else if reqQuery := request.GetQuery(); reqQuery != nil { + query = &componentcfg.Query{ + Component: reqQuery.Component, + RunType: reqQuery.RunType, + RoleName: reqQuery.MachineRole, + EntryKey: reqQuery.Entry, + Timestamp: reqQuery.Timestamp, + } + } else { + return nil, E_BAD_INPUT + } + + var payload string + var lastIndex uint64 + var err error + // ProcessTemplates not supported for this response + if request.ProcessTemplate { + return nil, E_BAD_INPUT + } else { + payload, lastIndex, err = m.service.GetComponentConfigurationWithLastIndex(query) + } + + if err != nil { + return nil, err + } + return &apricotpb.ComponentResponseWithLastIndex{Payload: payload, LastIndex: lastIndex}, E_OK.Err() +} + func (m *RpcServer) GetDetectorForHost(_ context.Context, request *apricotpb.HostRequest) (*apricotpb.DetectorResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE @@ -245,22 +290,6 @@ func (m *RpcServer) ListRuntimeEntries(_ context.Context, request *apricotpb.Lis return &apricotpb.ComponentEntriesResponse{Payload: payload}, E_OK.Err() } -func (m *RpcServer) GetEntryWithLastIndex(_ context.Context, request *apricotpb.GetEntryRequest) (*apricotpb.ComponentResponseWithLastIndex, error) { - if m == nil || m.service == nil { - return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE - } - m.logMethod() - if request == nil { - return nil, E_BAD_INPUT - } - - payload, lastIndex, err := m.service.GetEntryWithLastIndex(request.Key) - if err != nil { - return nil, err - } - return &apricotpb.ComponentResponseWithLastIndex{Payload: payload, LastIndex: lastIndex}, E_OK.Err() -} - func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGetRecursiveRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 85760a60c..4c68321a0 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -94,6 +94,10 @@ func (c *RemoteService) GetComponentConfiguration(query *componentcfg.Query) (pa return c.getComponentConfigurationInternal(query, false, nil) } +func (c *RemoteService) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) { + return c.getComponentConfigurationInternalWithLastIndex(query, false, nil) +} + func (c *RemoteService) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { return c.getComponentConfigurationInternal(query, true, varStack) } @@ -119,6 +123,27 @@ func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Qu return response.GetPayload(), nil } +func (c *RemoteService) getComponentConfigurationInternalWithLastIndex(query *componentcfg.Query, processTemplate bool, varStack map[string]string) (payload string, lastIndex uint64, err error) { + var response *apricotpb.ComponentResponseWithLastIndex + componentQuery := &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + Entry: query.EntryKey, + Timestamp: query.Timestamp, + } + request := &apricotpb.ComponentRequest{ + QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, + ProcessTemplate: processTemplate, + VarStack: varStack, + } + response, err = c.cli.GetComponentConfigurationWithLastIndex(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return "", 0, err + } + return response.GetPayload(), response.GetLastIndex(), nil +} + func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.RawGetRecursiveRequest{RawPath: path} @@ -218,18 +243,6 @@ func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, return response.GetPayload(), nil } -func (c *RemoteService) GetEntryWithLastIndex(key string) (payload string, lastIndex uint64, err error) { - var response *apricotpb.ComponentResponseWithLastIndex - request := &apricotpb.GetEntryRequest{ - Key: key, - } - response, err = c.cli.GetEntryWithLastIndex(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return "", 0, err - } - return response.GetPayload(), response.GetLastIndex(), nil -} - func (c *RemoteService) ListDetectors() (detectors []string, err error) { var response *apricotpb.DetectorsResponse response, err = c.cli.ListDetectors(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) diff --git a/configuration/service.go b/configuration/service.go index 28681cd00..6805d78f1 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -32,8 +32,6 @@ type RuntimeService interface { GetRuntimeEntry(component string, key string) (string, error) SetRuntimeEntry(component string, key string, value string) error ListRuntimeEntries(component string) ([]string, error) - - GetEntryWithLastIndex(key string) (string, uint64, error) } type Service interface { @@ -42,6 +40,7 @@ type Service interface { GetDefaults() map[string]string GetVars() map[string]string GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) + GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) ListDetectors() (detectors []string, err error) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index e79292fd4..8f7d60b13 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -51,13 +51,13 @@ type BuildObjectStackFunc func(stage Stage) map[string]interface{} type ConfigurationService interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) + GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) GetDetectorForHost(hostname string) (string, error) GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) GetRuntimeEntry(component string, key string) (string, error) - GetEntryWithLastIndex(key string) (string, uint64, error) } func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { diff --git a/configuration/template/stack.go b/configuration/template/stack.go index e22e034e6..1de2c1cc4 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -137,24 +137,28 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { return map[string]interface{} { - "JIT": func (dplCommand string) string { - jit := func(dplCommand string) (dplWorkflow string) { - //start := time.Now().UnixNano() / int64(time.Millisecond) - + "GenerateDplSubworkflow": func (dplCommand string) string { + // jitDplGenerate takes a resolved dplCommand as an argument, + // generates the corresponding tasks and workflow + // and returns the resolved dplWorkflow as a string + jitDplGenerate := func(dplCommand string) (dplWorkflow string) { const nMaxExpectedQcPayloads = 2 var metadata string - // Isolate possible consul qc config payloads - // TODO: this may be easily replaced to match __any__ consul key - //re := regexp.MustCompile(`'consul-json://[^']*'`) - re := regexp.MustCompile(`'consul-json://[^/]*/o2/components/qc/[^']*'`) + // Match any consul URL + re := regexp.MustCompile(`'consul-json://[^']*'`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) // Concatenate the consul LastIndex for each payload in a single string for _, match := range matches { - keyRe := regexp.MustCompile(`/o2/components/qc/[^']*`) + // Match any key under components + keyRe := regexp.MustCompile(`components/[^']*`) consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) - _, lastIndex, err := confSvc.GetEntryWithLastIndex(consulKeyMatch[0][0]) + consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") + + // And query for Consul for its LastIndex + newQ, err := componentcfg.NewQuery(consulKey[1]) + _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) if err != nil { return fmt.Sprintf("JIT failed trying to query qc consul payload %s : " + err.Error(), match) @@ -169,7 +173,6 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str // 2) The LastIndex of each payload hash := sha1.New() hash.Write([]byte(dplCommand + metadata)) - //hash.Write([]byte(consulConfigTimestamp)) jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) // We now have a workflow name made out of a hash that should be unique with respect to @@ -199,8 +202,6 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) } - /*end := time.Now().UnixNano() / int64(time.Millisecond) - log.Tracef("JIT took %d ms", end-start)*/ return jitWorkflowName } @@ -211,7 +212,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) } - return jit(dplCommand) + return jitDplGenerate(dplCommand) }, } } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 0bb1b1326..871842e55 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -610,8 +610,6 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er // Make sure that the relevant repos are present and checked out on the expected revision for _, repo := range reposRequired { - id := repo.GetIdentifier() - fmt.Println(id) existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.GetDefaultRevision()) diff --git a/core/task/task.go b/core/task/task.go index 4028644b7..793216425 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -268,7 +268,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We resolve any template expressions in Defaults defaultFields := template.WrapMapItems(localDefaults) - //TODO: A repo can be constructed from the taskClass err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} @@ -304,7 +303,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) } - //TODO: A repo can be constructed from the taskClass err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} @@ -525,7 +523,6 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand fields := template.WrapMapItems(propMap) - //TODO: A repo can be constructed from the taskClass err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { log.WithError(err).Error("cannot resolve templates for property map") diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index abeeccd50..7cc6e7c1b 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -214,7 +214,6 @@ func (c *Call) Call() error { objStack := integration.PluginsInstance().CallStack(c) - //TODO: Can the repo be fetched from somewhere? err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { return err diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index 25886ee56..58a6809eb 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -58,7 +58,6 @@ func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, fields := template.Fields{ template.WrapPointer(&f.Range), } - //TODO: Can the repo be fetched from somewhere? err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) if err != nil { return @@ -96,7 +95,6 @@ func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, e template.WrapPointer(&f.Begin), template.WrapPointer(&f.End), } - //TODO: Can the repo be fetched from somewhere? err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) if err != nil { return diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 7be564f1e..988637188 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -159,7 +159,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } - // TODO: Remove this timings + // TODO: Remove these timings start := time.Now().UnixNano() / int64(time.Millisecond) var wg sync.WaitGroup From 9c26b2f679b46897434c2111f21b5ea1c26147ba Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 23 Nov 2021 18:32:42 +0100 Subject: [PATCH 1088/2352] Remove leftover timings --- core/workflow/iteratorrole.go | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 988637188..4014e5283 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -29,12 +29,10 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" - "sync" - "time" - "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/gobwas/glob" + "sync" ) type iteratorRole struct { @@ -159,9 +157,6 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } - // TODO: Remove these timings - start := time.Now().UnixNano() / int64(time.Millisecond) - var wg sync.WaitGroup wg.Add(len(i.Roles)) @@ -178,11 +173,6 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo wg.Wait() - end := time.Now().UnixNano() / int64(time.Millisecond) - if len(i.Roles) > 1 { - log.Errorf("ProcessTemplates across %d nodes took %d ms", len(i.Roles), end-start) - } - // If any child is not Enabled after template resolution, // we filter it out of existence enabledRoles := make([]Role, 0) From 9ecf179319c6095410b4e3d9885f4f2e648f0d50 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Nov 2021 13:44:31 +0100 Subject: [PATCH 1089/2352] [build] Bump to v0.29.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fa527840c..7405e98a4 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 29 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From b8df00c4126d68fade19c301aebbd07d318f22bc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 1 Dec 2021 15:04:41 +0100 Subject: [PATCH 1090/2352] [core] Ensure an autoenvironment that fails to deploy doesn't configure --- core/environment/manager.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index cbde56a18..02eae8987 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -576,9 +576,13 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str err = env.TryTransition(NewDeployTransition( envs.taskman, nil, //roles, - nil)) - err = env.TryTransition(NewConfigureTransition( - envs.taskman)) + nil), + ) + if err == nil { + err = env.TryTransition(NewConfigureTransition( + envs.taskman), + ) + } if err != nil { envState := env.CurrentState() From 4e02a2df60f8dc83f0690be3177ea227fe9cf2aa Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 10 Dec 2021 11:53:59 +0100 Subject: [PATCH 1091/2352] [workflow] Revert role parallelization --- configuration/template/stack.go | 4 +-- core/workflow/aggregatorrole.go | 9 ------- core/workflow/iteratorrole.go | 43 ++++++++++----------------------- 3 files changed, 15 insertions(+), 41 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 1de2c1cc4..4ab127732 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -185,7 +185,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return jitWorkflowName } - log.Trace("Resolved DPL command: " + dplCommand) + log.Debug("Resolved DPL command: " + dplCommand) // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host @@ -197,7 +197,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str dplCmd.Dir = workflowRepo.GetCloneDir() var dplOut []byte dplOut, err = dplCmd.CombinedOutput() - log.Trace("DPL command out: " + string(dplOut)) + log.Debug("DPL command out: " + string(dplOut)) if err != nil { return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 96210d44b..dcccb8226 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -27,7 +27,6 @@ package workflow import ( "errors" "strings" - "sync" texttemplate "text/template" "github.com/AliceO2Group/Control/common/event" @@ -136,23 +135,15 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf r.Enabled = strings.TrimSpace(r.Enabled) - var wg sync.WaitGroup - wg.Add(len(r.Roles)) - // Process templates for child roles for _, role := range r.Roles { - go func(role Role) { - defer wg.Done() role.setParent(r) err = role.ProcessTemplates(workflowRepo, loadSubworkflow) if err != nil { return } - }(role) } - wg.Wait() - // If any child is not Enabled after template resolution, // we filter it out of existence enabledRoles := make([]Role, 0) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 4014e5283..07fbf2b4d 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -32,7 +32,6 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/gobwas/glob" - "sync" ) type iteratorRole struct { @@ -157,22 +156,14 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } - var wg sync.WaitGroup - wg.Add(len(i.Roles)) - // Process templates for child roles for _, role := range i.Roles { - go func(role Role) { - defer wg.Done() - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) - if err != nil { - return - } - }(role) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } } - wg.Wait() - // If any child is not Enabled after template resolution, // we filter it out of existence enabledRoles := make([]Role, 0) @@ -204,24 +195,16 @@ func (i *iteratorRole) expandTemplate() (err error) { return } - var wg sync.WaitGroup - wg.Add(len(ran)) - for _, localValue := range ran { - go func(localValue string) { - defer wg.Done() - locals := make(map[string]string) - locals[i.For.GetVar()] = localValue - var newRole Role - newRole, err = i.template.generateRole(locals) - if err != nil { - return - } - roles = append(roles, newRole) - } (localValue) - } - - wg.Wait() + locals := make(map[string]string) + locals[i.For.GetVar()] = localValue + var newRole Role + newRole, err = i.template.generateRole(locals) + if err != nil { + return + } + roles = append(roles, newRole) + } i.Roles = roles for j := 0; j < len(i.Roles); j++ { From ccfb2a5d1d4cf781b12d0c05b676c3130388f418 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 14 Dec 2021 12:52:40 +0200 Subject: [PATCH 1092/2352] [repos] Clean ssh repos git dir on refresh --- configuration/template/stack.go | 4 ++-- core/repos/sshrepo.go | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 4ab127732..1de2c1cc4 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -185,7 +185,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return jitWorkflowName } - log.Debug("Resolved DPL command: " + dplCommand) + log.Trace("Resolved DPL command: " + dplCommand) // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host @@ -197,7 +197,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str dplCmd.Dir = workflowRepo.GetCloneDir() var dplOut []byte dplOut, err = dplCmd.CombinedOutput() - log.Debug("DPL command out: " + string(dplOut)) + log.Trace("DPL command out: " + string(dplOut)) if err != nil { return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) } diff --git a/core/repos/sshrepo.go b/core/repos/sshrepo.go index 1d7b2f7c7..841ccd8d9 100644 --- a/core/repos/sshrepo.go +++ b/core/repos/sshrepo.go @@ -31,6 +31,7 @@ import ( "github.com/spf13/viper" ssh2 "golang.org/x/crypto/ssh" "net/url" + "os/exec" "path" ) @@ -69,6 +70,14 @@ func (r *sshRepo) refresh() error { // Disable strict host checking without which may block the fetch op without manual intervention auth.HostKeyCallback = ssh2.InsecureIgnoreHostKey() + // clean the repo before doing anything + // this removes the untracked JIT-produced tasks and workflows + clnCmd := exec.Command("git", "-C", r.GetCloneDir(), "clean", "-f") + err = clnCmd.Run() + if err != nil { + return errors.New(err.Error() + ": " + r.GetIdentifier()) + } + err = ref.Fetch(&git.FetchOptions{ RemoteName: "origin", Force: true, From 72740a0e69086343f95105496be56b030ad16bd5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Dec 2021 15:22:35 +0100 Subject: [PATCH 1093/2352] [coconut] Increase max gRPC payload size to 50M --- coconut/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coconut/client.go b/coconut/client.go index 62ffc5f44..6965172ec 100644 --- a/coconut/client.go +++ b/coconut/client.go @@ -35,7 +35,7 @@ import ( var log = logger.New(logrus.StandardLogger(), "coconut") -const GrpcMaxCallRecvSize = 10*1024*1024 +const GrpcMaxCallRecvSize = 50*1024*1024 type internalState struct { } From fe5724bc5ff1aa3236f9f1bdc9dc3e8f9908298e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Dec 2021 15:24:58 +0100 Subject: [PATCH 1094/2352] [core] Add Dump(var, filepath) function to template system --- configuration/template/stack.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 1de2c1cc4..fec043be0 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -30,7 +30,7 @@ import ( "encoding/json" "errors" "fmt" - "github.com/AliceO2Group/Control/core/repos" + "io/ioutil" "os" "os/exec" "path/filepath" @@ -40,6 +40,8 @@ import ( texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/componentcfg" @@ -93,7 +95,6 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str return payload }, "DetectorForHost": func(hostname string) string { - defer utils.TimeTrack(time.Now(),"DetectorForHost", log.WithPrefix("template")) payload, err := confSvc.GetDetectorForHost(hostname) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) @@ -324,7 +325,7 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} "NewID": func() (out string) { return uid.New().String() }, - "PrefixedOverride": func(varname, prefix string) (out string) { + "PrefixedOverride": func(varname, prefix string) string { prefixed, prefixedOk := varStack[prefix + "_" + varname] fallback, fallbackOk := varStack[varname] @@ -346,5 +347,12 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} // prefixedOk is true, fallbackOk we don't know & don't care at this point return prefixed }, + "Dump": func(in, filepath string) string { + err := ioutil.WriteFile(filepath, []byte(in), 0644) + if err != nil { + log.WithError(err).Warn("could dump variable to file") + } + return in + }, } } \ No newline at end of file From 1ee5f56bd6710e16cf31fb751e5cb6a9ce6cae66 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Dec 2021 12:41:56 +0100 Subject: [PATCH 1095/2352] [occ] Add reflection support to OCC gRPC server --- occ/CMakeLists.txt | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index a1424b2c2..05a295a13 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -326,9 +326,14 @@ target_include_directories(${OCCLIBRARY} ${PROTO_SOURCE_DIR} ${GRPC_INCLUDE_DIRS}) +target_link_options(${OCCLIBRARY} + PUBLIC + "LINKER:--no-as-needed") + target_link_libraries(${OCCLIBRARY} PUBLIC gRPC::grpc++ + gRPC::grpc++_reflection protobuf::libprotobuf Boost::program_options) @@ -423,6 +428,7 @@ add_library(${OCCPLUGIN} SHARED target_link_libraries(${OCCPLUGIN} PUBLIC FairMQ::FairMQ gRPC::grpc++ + gRPC::grpc++_reflection protobuf::libprotobuf Boost::program_options) @@ -435,6 +441,10 @@ target_include_directories(${OCCPLUGIN} ${GRPC_INCLUDE_DIRS} ${RapidJSON_INCLUDE_DIRS}) +target_link_options(${OCCPLUGIN} + PUBLIC + "LINKER:--no-as-needed") + set_target_properties(${OCCPLUGIN} PROPERTIES CXX_VISIBILITY_PRESET hidden VERSION ${OCC_VERSION_SHORT} @@ -468,6 +478,7 @@ add_library(${OCCLITE} SHARED target_link_libraries(${OCCLITE} PRIVATE FairMQ::FairMQ gRPC::grpc++ + gRPC::grpc++_reflection Boost::program_options) target_include_directories(${OCCLITE} @@ -479,6 +490,12 @@ target_include_directories(${OCCLITE} ${GRPC_INCLUDE_DIRS} ${RapidJSON_INCLUDE_DIRS}) +# --no-as-needed is necessary when linking against grpc++_reflection, to ensure +# the gRPC reflection library is linked against even if not used +target_link_options(${OCCLITE} + PUBLIC + "LINKER:--no-as-needed") + set_target_properties(${OCCLITE} PROPERTIES CXX_VISIBILITY_PRESET hidden VERSION ${OCC_VERSION_SHORT} From 05ad37619270cf1ccfd82a9fad678d7de5f15a07 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Dec 2021 15:31:51 +0100 Subject: [PATCH 1096/2352] [core] Add support for vars in task templates --- core/task/class.go | 6 ++++++ core/task/task.go | 28 +++++++++++++++++++++++----- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/core/task/class.go b/core/task/class.go index 7e04dc7c3..a0fca93e7 100644 --- a/core/task/class.go +++ b/core/task/class.go @@ -42,6 +42,7 @@ import ( type Class struct { Identifier TaskClassIdentifier `yaml:"name"` Defaults gera.StringMap `yaml:"defaults"` + Vars gera.StringMap `yaml:"vars"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` @@ -59,6 +60,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _class struct { Identifier TaskClassIdentifier `yaml:"name"` Defaults map[string]string `yaml:"defaults"` + Vars map[string]string `yaml:"vars"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` @@ -71,6 +73,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } aux := _class{ Defaults: make(map[string]string), + Vars: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -85,6 +88,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { *c = Class{ Identifier: aux.Identifier, Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Vars: gera.MakeStringMapWithMap(aux.Vars), Control: aux.Control, Command: aux.Command, Wants: aux.Wants, @@ -102,6 +106,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { Name string `yaml:"name"` Defaults map[string]string `yaml:"defaults,omitempty"` + Vars map[string]string `yaml:"vars,omitempty"` Control struct { Mode string `yaml:"mode"` } `yaml:"control"` @@ -115,6 +120,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { aux := _class{ Name: c.Identifier.Name, Defaults: c.Defaults.Raw(), + Vars: c.Vars.Raw(), Properties: c.Properties.Raw(), Wants: c.Wants, Bind: c.Bind, diff --git a/core/task/task.go b/core/task/task.go index 793216425..3ff536507 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -261,7 +261,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return } - // We make a copy of the Defaults map from the taskClass, this is necessary because + // We make a copy of the Defaults/Vars maps from the taskClass, this is necessary because // entries may be templated, so they may resolve to different values in each task. localDefaults := class.Defaults.Copy().Raw() @@ -274,9 +274,22 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { log.WithError(err).Error("cannot resolve templates for task defaults") } + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) + + localVars := class.Vars.Copy().Raw() + + // We resolve any template expressions in Vars + varFields := template.WrapMapItems(localVars) + + err = varFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) + if err != nil { + t.commandInfo = &common.TaskCommandInfo{} + log.WithError(err).Error("cannot resolve templates for task vars") + } + // We wrap the parent varStack around the task's already processed Defaults, // ensuring that any taskclass Defaults are overridden by anything else. - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localVars)) if err != nil { log.WithError(err).Error("cannot fetch task class defaults for task command info") return @@ -466,13 +479,18 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand return } - // We wrap the parent varStack around the class Defaults, ensuring - // the class Defaults are overridden by anything else. - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(class.Defaults) + // We wrap the parent varStack around the class Defaults+Vars, ensuring + // the class Defaults+Vars are overridden by anything else. + classStack := gera.MakeStringMapWithMap(class.Vars.Raw()).Wrap(class.Defaults) if err != nil { err = fmt.Errorf("cannot fetch task class defaults for property map: %w", err) return } + varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(classStack) + if err != nil { + err = fmt.Errorf("cannot fetch task class vars for property map: %w", err) + return + } // Finally we build the task-specific special values, and write them // into the varStack (overwriting anything). From 31a4d718f787f29bed5497d2264a1ad1a155d89f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Dec 2021 15:32:35 +0100 Subject: [PATCH 1097/2352] [build] Bump to v0.30.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 7405e98a4..05ee090ec 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 29 -VERSION_PATCH := 2 +VERSION_MINOR := 30 +VERSION_PATCH := 0 From 38512df4a7d5dcf0a8a8eb1cc9219afc96e9d521 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Dec 2021 10:05:59 +0100 Subject: [PATCH 1098/2352] [build] Fix linkage on Mac --- occ/CMakeLists.txt | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 05a295a13..6089673f5 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -326,9 +326,12 @@ target_include_directories(${OCCLIBRARY} ${PROTO_SOURCE_DIR} ${GRPC_INCLUDE_DIRS}) -target_link_options(${OCCLIBRARY} - PUBLIC - "LINKER:--no-as-needed") +if (UNIX AND NOT APPLE) + target_link_options(${OCCLIBRARY} + PUBLIC + "LINKER:--no-as-needed") +endif() + target_link_libraries(${OCCLIBRARY} PUBLIC @@ -441,9 +444,11 @@ target_include_directories(${OCCPLUGIN} ${GRPC_INCLUDE_DIRS} ${RapidJSON_INCLUDE_DIRS}) -target_link_options(${OCCPLUGIN} - PUBLIC - "LINKER:--no-as-needed") +if (UNIX AND NOT APPLE) + target_link_options(${OCCPLUGIN} + PUBLIC + "LINKER:--no-as-needed") +endif() set_target_properties(${OCCPLUGIN} PROPERTIES CXX_VISIBILITY_PRESET hidden @@ -492,9 +497,11 @@ target_include_directories(${OCCLITE} # --no-as-needed is necessary when linking against grpc++_reflection, to ensure # the gRPC reflection library is linked against even if not used -target_link_options(${OCCLITE} - PUBLIC - "LINKER:--no-as-needed") +if (UNIX AND NOT APPLE) + target_link_options(${OCCLITE} + PUBLIC + "LINKER:--no-as-needed") +endif() set_target_properties(${OCCLITE} PROPERTIES CXX_VISIBILITY_PRESET hidden From 3920875df7709a32d3d123f79e531d6226ff0cc6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Jan 2022 13:51:52 +0100 Subject: [PATCH 1099/2352] [apricot] Sanitize (TrimSpace) incoming varStack keys in GetCompConfig --- apricot/local/service.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 85af57a8f..83524f065 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -311,7 +311,7 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, bindings := make(map[string]interface{}) for k, v := range varStack { - bindings[k] = v + bindings[strings.TrimSpace(k)] = v } // Add custom functions to bindings: From 6e48425b5c7c95f6e4bf5c9f92d135a108b50a8a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 1 Feb 2022 11:19:41 +0100 Subject: [PATCH 1100/2352] [core] Update PDP script call generator --- core/integration/odc/plugin.go | 134 +++++++++++++++++++++++++++++---- 1 file changed, 121 insertions(+), 13 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a6b217f80..14d4bc338 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2021-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -35,6 +35,8 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" @@ -147,9 +149,18 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter return } + var csErr error + configStack := apricot.Instance().GetDefaults() + configStack, csErr = gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(configStack)) + if csErr != nil { + log.Error("cannot access AliECS workflow configuration defaults") + return + } + stack = make(map[string]interface{}) stack["GenerateEPNWorkflowScript"] = func() (out string) { - /* OCTRL-558 example: + /* + OCTRL-558 example: GEN_TOPO_HASH=[0/1] GEN_TOPO_SOURCE=[...] DDMODE=[TfBuilder Mode] GEN_TOPO_LIBRARY_FILE=[...] GEN_TOPO_WORKFLOW_NAME=[...] WORKFLOW_DETECTORS=[...] WORKFLOW_DETECTORS_QC=[...] WORKFLOW_DETECTORS_CALIB=[...] WORKFLOW_PARAMETERS=[...] RECO_NUM_NODES_OVERRIDE=[...] @@ -157,19 +168,35 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter MULTIPLICITY_FACTOR_REST=[...] GEN_TOPO_WIPE_CACHE=[0/1] BEAMTYPE=[PbPb/pp/pPb/cosmic/technical] NHBPERTF=[...] GEN_TOPO_PARTITION=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] /home/epn/pdp/gen_topo.sh + + R3C-710: + `pdp_o2pdpsuite_version` is a new field. Its content should be sent in the string as `OVERRIDE_PDPSUITE_VERSION=[...]`. + In case it is set to `default`, instead of the string `default` the preconfigured default version in consul should be sent. + `pdp_qcjson_version`: similar to avove, new field. please send as `SET_QCJSON_VERSION`. + If set to the string `default`, please sent the default version configured in consul instead. + `pdp_o2_data_processing_hash`: if set to the string `default`, sent the default hash configured in consul instead. + `odc_n_epns_max_fail` : new field. Please send as `RECO_MAX_FAIL_NODES_OVERRIDE=[...]`. + `epn_store_raw_data_fraction` new field, please send as `DD_DISK_FRACTION=[...]`. + `pdp_nr_compute_nodes` removed this field since no longer needed. + Please send the value of `odc_n_epns` directly as `RECO_NUM_NODES_OVERRIDE=[...]`. + `pdp_epn_shmid`: new field, please send as `SHM_MANAGER_SHMID=[...]` + `pdp_epn_shm_recreate`: new field, please send as `SHM_MANAGER_SHM_RECREATE=[0|1]` */ var ( pdpConfigOption, o2DPSource, tfbDDMode string pdpLibraryFile, pdpLibWorkflowName string pdpDetectorList, pdpDetectorListQc, pdpDetectorListCalib string - pdpWorkflowParams, pdpNrComputeNodes string + pdpWorkflowParams string pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string pdpExtraEnvVars, pdpGeneratorScriptPath string odcNEpns string ok bool accumulator []string + pdpO2PdpSuiteVersion, pdpQcJsonVersion string + odcNEpnsMaxFail, epnStoreRawDataFraction string + pdpEpnShmId, pdpEpnShmRecreate string ) accumulator = make([]string, 0) @@ -190,6 +217,15 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP Repository hash") return } + if strings.TrimSpace(o2DPSource) == "default" { // if UI sends 'default', we look in Consul + pdpO2PdpSuiteVersion, ok = configStack["pdp_o2_data_processing_hash"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP Repository hash default") + return + } + } accumulator = append(accumulator, "GEN_TOPO_HASH=1") case "Repository path": @@ -322,7 +358,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_PARAMETERS='%s'", strings.TrimSpace(pdpWorkflowParams))) - odcNEpns, ok = varStack["odc_n_epns"] // only needed as default value for pdp_nr_compute_nodes if == -1 + odcNEpns, ok = varStack["odc_n_epns"] if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). @@ -336,25 +372,23 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot parse ODC number of EPNs") return } + accumulator = append(accumulator, fmt.Sprintf("RECO_NUM_NODES_OVERRIDE=%d", odcNEpnsI)) - pdpNrComputeNodes, ok = varStack["pdp_nr_compute_nodes"] + odcNEpnsMaxFail, ok = varStack["odc_n_epns_max_fail"] if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP number of compute nodes") + Error("cannot acquire ODC number of EPNs max fail") return } - pdpNrComputeNodesI, err := strconv.Atoi(pdpNrComputeNodes) + odcNEpnsMaxFailI, err := strconv.Atoi(odcNEpnsMaxFail) if err != nil { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse PDP number of compute nodes") - pdpNrComputeNodesI = odcNEpnsI - } - if pdpNrComputeNodesI == -1 { - pdpNrComputeNodesI = odcNEpnsI + Error("cannot parse ODC number of EPNs max fail") + return } - accumulator = append(accumulator, fmt.Sprintf("RECO_NUM_NODES_OVERRIDE=%d", pdpNrComputeNodesI)) + accumulator = append(accumulator, fmt.Sprintf("RECO_MAX_FAIL_NODES_OVERRIDE=%d", odcNEpnsMaxFailI)) pdpRawDecoderMultiFactor, ok = varStack["pdp_raw_decoder_multi_factor"] if !ok { @@ -426,6 +460,80 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter accumulator = append(accumulator, "GEN_TOPO_ONTHEFLY=1") + pdpO2PdpSuiteVersion, ok = varStack["pdp_o2pdpsuite_version"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP Suite version") + return + } + if strings.TrimSpace(pdpO2PdpSuiteVersion) == "default" { // if UI sends 'default', we look in Consul + pdpO2PdpSuiteVersion, ok = configStack["pdp_o2pdpsuite_version"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP Suite version default") + return + } + } + accumulator = append(accumulator, fmt.Sprintf("OVERRIDE_PDPSUITE_VERSION='%s'", pdpO2PdpSuiteVersion)) + + pdpQcJsonVersion, ok = varStack["pdp_qcjson_version"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP QCJson version") + return + } + if strings.TrimSpace(pdpQcJsonVersion) == "default" { // if UI sends 'default', we look in Consul + pdpQcJsonVersion, ok = configStack["pdp_qcjson_version"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP QCJson version default") + return + } + } + accumulator = append(accumulator, fmt.Sprintf("SET_QCJSON_VERSION='%s'", pdpQcJsonVersion)) + + epnStoreRawDataFraction, ok = varStack["epn_store_raw_data_fraction"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire EPN DD disk raw data fraction") + return + } + accumulator = append(accumulator, fmt.Sprintf("DD_DISK_FRACTION='%s'", epnStoreRawDataFraction)) + + pdpEpnShmId, ok = varStack["pdp_epn_shmid"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP EPN SHMID") + return + } + accumulator = append(accumulator, fmt.Sprintf("SHM_MANAGER_SHMID='%s'", pdpEpnShmId)) + + pdpEpnShmRecreate, ok = varStack["pdp_epn_shm_recreate"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP EPN SHM recreate") + return + } + pdpEpnShmRecreateB, err := strconv.ParseBool(pdpEpnShmRecreate) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse PDP EPN SHM recreate") + pdpEpnShmRecreateB = false + } + pdpEpnShmRecreateI := 0 + if pdpEpnShmRecreateB { + pdpEpnShmRecreateI = 1 + } + accumulator = append(accumulator, fmt.Sprintf("SHM_MANAGER_SHM_RECREATE=%d", pdpEpnShmRecreateI)) + pdpExtraEnvVars, ok = varStack["pdp_extra_env_vars"] if !ok { log.WithField("partition", envId). From 1a9334e4e5e90e04da3e0cdd90979a926a23c1fb Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 28 Jan 2022 16:11:00 +0100 Subject: [PATCH 1101/2352] Fix a gazillion of deprecation warnings from FairLogger --- occ/plugin/OccFMQCommon.cxx | 26 +++++++++++++------------- occ/plugin/OccLiteServer.cxx | 6 +++--- occ/plugin/OccPlugin.cxx | 12 ++++++------ occ/plugin/OccPluginServer.cxx | 4 ++-- occ/plugin/litestructs/JsonMessage.cxx | 4 ++-- occ/plugin/litestructs/Transition.cxx | 10 +++++----- 6 files changed, 31 insertions(+), 31 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 77db7df39..aa54f6105 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -37,7 +37,7 @@ std::string generateSubscriptionId(const std::string& prefix) boost::uuids::random_generator gen; id = boost::uuids::to_string(gen()); } catch(const boost::uuids::entropy_error &err) { - OLOG(WARNING) << "[generateSubscriptionId] boost::uuids::entropy_error: " << err.what() << " falling back to std::time"; + OLOG(warning) << "[generateSubscriptionId] boost::uuids::entropy_error: " << err.what() << " falling back to std::time"; id = std::to_string(std::time(nullptr)); } return "OCC_"s + (prefix.size() ? (prefix + "_") : "") + id; @@ -64,7 +64,7 @@ std::tuple doTransition(fair: currentState)); } - OLOG(DEBUG) << "transition src: " << srcState + OLOG(debug) << "transition src: " << srcState << " currentState: " << currentState << " event: " << event; @@ -121,7 +121,7 @@ std::tuple doTransition(fair: std::unique_lock lk(cv_mu); newStates.push_back(fair::mq::PluginServices::ToStr(reachedState)); - OLOG(DEBUG) << "transition newStates vector: " << boost::algorithm::join(newStates, ", "); + OLOG(debug) << "transition newStates vector: " << boost::algorithm::join(newStates, ", "); cv.notify_one(); }; @@ -172,7 +172,7 @@ std::tuple doTransition(fair: line.push_back(jt->first + "=" + jt->second); } channelLines.push_back(boost::join(line, ",")); - OLOG(DEBUG) << "transition pushing channel configuration " << channelLines.back(); + OLOG(debug) << "transition pushing channel configuration " << channelLines.back(); } if (!channelLines.empty()) { m_pluginServices->SetProperty("channel-config", channelLines); @@ -186,17 +186,17 @@ std::tuple doTransition(fair: } } catch (std::runtime_error &e) { - OLOG(WARNING) << "transition cannot push RUN transition arguments, reason:" << e.what(); + OLOG(warning) << "transition cannot push RUN transition arguments, reason:" << e.what(); } } m_pluginServices->ChangeDeviceState(FMQ_CONTROLLER_NAME, evt); } catch (fair::mq::PluginServices::DeviceControlError& e) { - OLOG(ERROR) << "transition cannot request transition: " << e.what(); + OLOG(error) << "transition cannot request transition: " << e.what(); return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INTERNAL, "cannot request transition, OCC plugin has no device control")); } catch (std::out_of_range& e) { - OLOG(ERROR) << "transition invalid event name: " << event; + OLOG(error) << "transition invalid event name: " << event; return std::make_tuple(OccLite::nopb::TransitionResponse(), grpc::Status(grpc::INVALID_ARGUMENT, "argument " + event + " is not a valid transition name")); } @@ -210,11 +210,11 @@ std::tuple doTransition(fair: for (;;) { cv.wait(lk); if (newStates.empty()) { - OLOG(ERROR) << "[request Transition] notify condition met but no states written"; + OLOG(error) << "[request Transition] notify condition met but no states written"; break; } - OLOG(DEBUG) << "transition notify condition met, reached state: " << newStates.back(); + OLOG(debug) << "transition notify condition met, reached state: " << newStates.back(); if (isIntermediateFMQState(newStates.back())) { //if it's an auto state continue; } else { @@ -233,12 +233,12 @@ std::tuple doTransition(fair: // Debug: list of FairMQ property keys auto pk = m_pluginServices->GetPropertyKeys(); for (const auto &k : pk) { - OLOG(DEBUG) << std::setw(30) << k << " = " + m_pluginServices->GetPropertyAsString(k); + OLOG(debug) << std::setw(30) << k << " = " + m_pluginServices->GetPropertyAsString(k); } auto chi = m_pluginServices->GetChannelInfo(); - OLOG(DEBUG) << "channel info:"; + OLOG(debug) << "channel info:"; for (const auto &k : chi) { - OLOG(DEBUG) << k.first << " : " << k.second; + OLOG(debug) << k.first << " : " << k.second; } } @@ -254,6 +254,6 @@ std::tuple doTransition(fair: response.trigger = OccLite::nopb::DEVICE_INTENTIONAL; } - OLOG(DEBUG) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); + OLOG(debug) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); return std::make_tuple(response, grpc::Status::OK); } \ No newline at end of file diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index e7f1efbaa..9c7ecece8 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -84,7 +84,7 @@ ::grpc::Status OccLite::Service::GetState(::grpc::ServerContext* context, response->state = state; response->pid = pid; - OLOG(INFO) << "GetState response: " << response->state; + OLOG(info) << "GetState response: " << response->state; return grpc::Status::OK; } @@ -93,7 +93,7 @@ ::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, const OccLite::nopb::TransitionRequest* request, OccLite::nopb::TransitionResponse* response) { - OLOG(INFO) << "Incoming Transition request:" << request->JsonMessage::Serialize(); + OLOG(info) << "Incoming Transition request:" << request->JsonMessage::Serialize(); auto transitionOutcome = doTransition(m_pluginServices, *request); ::grpc::Status grpcStatus = std::get<1>(transitionOutcome); @@ -122,7 +122,7 @@ OccLite::Service::EventStream(::grpc::ServerContext* context, const OccLite::nop std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - OLOG(DEBUG) << "[EventStream] new state: " << state; + OLOG(debug) << "[EventStream] new state: " << state; if (state == "EXITING") { std::unique_lock finished_lk(finished_mu); diff --git a/occ/plugin/OccPlugin.cxx b/occ/plugin/OccPlugin.cxx index 264972e1f..05baedc9f 100644 --- a/occ/plugin/OccPlugin.cxx +++ b/occ/plugin/OccPlugin.cxx @@ -45,7 +45,7 @@ OccPlugin::OccPlugin(const std::string& name, { // Debug: list of FairMQ property keys // auto pk = GetPropertyKeys(); - // std::for_each( pk.begin(), pk.end(), [](auto it){OLOG(DEBUG) << "\t" << it; } ); + // std::for_each( pk.begin(), pk.end(), [](auto it){OLOG(debug) << "\t" << it; } ); auto controlPort = std::to_string(OCC_DEFAULT_PORT); if (const char* env_controlPort = std::getenv(OCC_CONTROL_PORT_ENV)) { @@ -56,7 +56,7 @@ OccPlugin::OccPlugin(const std::string& name, controlPort = GetPropertyAsString(OCC_CONTROL_PORT_ARG); } catch (std::exception& e) { - OLOG(DEBUG) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; + OLOG(debug) << "O² control port not specified, defaulting to " << OCC_DEFAULT_PORT; } } @@ -65,7 +65,7 @@ OccPlugin::OccPlugin(const std::string& name, } catch (fair::mq::PluginServices::DeviceControlError& e) { // If we are here, it means another plugin has taken control. - OLOG(ERROR) << "Cannot take device control" << e.what(); + OLOG(error) << "Cannot take device control" << e.what(); } m_grpcThread = std::thread(&OccPlugin::runServer, this, pluginServices, controlPort); @@ -95,16 +95,16 @@ void OccPlugin::runServer(fair::mq::PluginServices* pluginServices, const std::s std::unique_ptr server(builder.BuildAndStart()); #ifdef OCC_LITE_SERVICE - OLOG(DEBUG) << OCCLITE_PRODUCT_NAME << " v" << OCC_VERSION << " listening on port " << controlPort; + OLOG(debug) << OCCLITE_PRODUCT_NAME << " v" << OCC_VERSION << " listening on port " << controlPort; #else - OLOG(DEBUG) << OCCPLUGIN_PRODUCT_NAME << " (legacy) v" << OCC_VERSION << " listening on port " << controlPort; + OLOG(debug) << OCCPLUGIN_PRODUCT_NAME << " (legacy) v" << OCC_VERSION << " listening on port " << controlPort; #endif std::function teardown = [&server]() { server->Shutdown(); }; addTeardownTask(teardown); server->Wait(); - OLOG(DEBUG) << "OCC control server stopped"; + OLOG(debug) << "OCC control server stopped"; } void OccPlugin::addTeardownTask(std::function& func) diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index e013a866a..11b8c03d0 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -63,7 +63,7 @@ OccPluginServer::EventStream(grpc::ServerContext* context, std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - OLOG(DEBUG) << "[EventStream] new state: " << state; + OLOG(debug) << "[EventStream] new state: " << state; if (state == "EXITING") { std::unique_lock finished_lk(finished_mu); @@ -116,7 +116,7 @@ OccPluginServer::StateStream(grpc::ServerContext* context, response.set_type(sType); response.set_state(state); - OLOG(DEBUG) << "[StateStream] new state: " << state << "; type: " + OLOG(debug) << "[StateStream] new state: " << state << "; type: " << pb::StateType_Name(sType); if (state != "EXITING") { diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index d18ed3291..50883a16a 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -64,7 +64,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) auto rawSlice = (*slices)[0].c_slice(); std::string str = grpc::StringFromCopiedSlice(rawSlice); ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); - OLOG(INFO) << "Deserializing Message:\n" << str; + OLOG(info) << "Deserializing Message:\n" << str; return Deserialize(str); } @@ -72,7 +72,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) ::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const { std::string str = Serialize(); - OLOG(INFO) << "Serialized Message:\n" << str; + OLOG(info) << "Serialized Message:\n" << str; // grpc::string = std::string // We build a Slice(grpc::string) and we add it to the ByteBuffer diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index 82a329fa1..a4d548885 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -41,11 +41,11 @@ bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::WriterDeserialize(*it); if (!ok) { - OLOG(WARN) << "Some transition parameters could not be deserialized, task configuration might be incomplete"; + OLOG(warn) << "Some transition parameters could not be deserialized, task configuration might be incomplete"; continue; } arguments.push_back(*ce); } } - OLOG(INFO) << "Deserialized TransitionRequest:"; - OLOG(INFO) << JsonMessage::Serialize(); + OLOG(info) << "Deserialized TransitionRequest:"; + OLOG(info) << JsonMessage::Serialize(); return true; } From 261d891cf0fa6851ee1155767317b0d405a77c4a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 25 Jan 2022 14:15:43 +0100 Subject: [PATCH 1102/2352] Reduce logging verbosity --- core/controlcommands/commandqueue.go | 52 +++--- core/controlcommands/mesoscommandservent.go | 60 +++--- core/environment/transition_deploy.go | 22 +-- core/task/constraint/attributes.go | 5 +- core/task/scheduler.go | 197 ++++++++++---------- core/workflow/aggregatorrole.go | 20 +- core/workflow/callrole.go | 57 +++--- core/workflow/safestatus.go | 16 +- core/workflow/taskrole.go | 53 +++--- executor/executorcmd/client.go | 25 +-- executor/handlers.go | 155 +++++++-------- 11 files changed, 335 insertions(+), 327 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index afca44702..a5a770f46 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -50,8 +50,8 @@ type empty struct{} type CommandQueue struct { sync.Mutex - q chan queueEntry - servent *Servent + q chan queueEntry + servent *Servent } func NewCommandQueue(s *Servent) *CommandQueue { @@ -70,13 +70,13 @@ func (m *CommandQueue) Enqueue(cmd MesosCommand, callback chan<- MesosCommandRes default: // Buffer full! err := errors.New("the queue for MESSAGE commands is full") log.WithField("error", err.Error()). - WithField("queueSize", QUEUE_SIZE). - Error("cannot enqueue control command") + WithField("queueSize", QUEUE_SIZE). + Error("cannot enqueue control command") return err } } -func (m* CommandQueue) Start() { +func (m *CommandQueue) Start() { m.Lock() m.q = make(chan queueEntry, QUEUE_SIZE) m.Unlock() @@ -86,7 +86,7 @@ func (m* CommandQueue) Start() { select { case entry, more := <-m.q: m.Lock() - if !more { // if the channel is closed, we bail + if !more { // if the channel is closed, we bail return } response, err := m.commit(entry.cmd) @@ -116,7 +116,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), log.WithPrefix("cmdq")) - type responseSemaphore struct{ + type responseSemaphore struct { receiver MesosCommandTarget response MesosCommandResponse err error @@ -129,19 +129,19 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon responses := make(map[MesosCommandTarget]MesosCommandResponse) log.WithFields(logrus.Fields{ - "name": command.GetName(), - "id": command.GetId(), - }). + "name": command.GetName(), + "id": command.GetId(), + }). Debug("ready to commit MesosCommand") for _, rec := range command.targets() { go func(receiver MesosCommandTarget) { log.WithFields(logrus.Fields{ - "agentId": receiver.AgentId, - "executorId": receiver.ExecutorId, - "name": command.GetName(), - }). - Debug("sending MesosCommand to target") + "agentId": receiver.AgentId, + "executorId": receiver.ExecutorId, + "name": command.GetName(), + }). + Trace("sending MesosCommand to target") singleCommand := command.MakeSingleTarget(receiver) res, err := m.servent.RunCommand(singleCommand, receiver) if err != nil { @@ -150,36 +150,36 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon semaphore <- responseSemaphore{ receiver: receiver, response: res, - err: err, + err: err, } return } if res.Err() != nil { log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - "error": res.Err().Error(), - }). + "commandName": res.GetCommandName(), + "error": res.Err().Error(), + }). Trace("received MesosCommandResponse") } else { log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - }). + "commandName": res.GetCommandName(), + }). Trace("received MesosCommandResponse") } semaphore <- responseSemaphore{ - receiver: receiver, - response: res, - } + receiver: receiver, + response: res, + } }(rec) } // Wait for goroutines to finish for i := 0; i < len(command.targets()); i++ { - respSemaphore := <- semaphore + respSemaphore := <-semaphore responses[respSemaphore.receiver] = respSemaphore.response if respSemaphore.err != nil { - sendErrorList = append(sendErrorList, respSemaphore.err) + sendErrorList = append(sendErrorList, respSemaphore.err) } } close(semaphore) diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index 1eeff6c87..4d00dee67 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -46,20 +46,20 @@ type Call struct { func NewCall(cmd MesosCommand) *Call { return &Call{ - Request: cmd, + Request: cmd, Response: nil, - Done: make(chan empty), - Error: nil, + Done: make(chan empty), + Error: nil, } } type CallId struct { - Id xid.ID + Id xid.ID Target MesosCommandTarget } type Servent struct { - mu sync.Mutex + mu sync.Mutex pending map[CallId]*Call SendFunc SendCommandFunc @@ -67,8 +67,8 @@ type Servent struct { func NewServent(commandFunc SendCommandFunc) *Servent { return &Servent{ - SendFunc: commandFunc, - pending: make(map[CallId]*Call), + SendFunc: commandFunc, + pending: make(map[CallId]*Call), } } @@ -82,43 +82,43 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes call := NewCall(cmd) callId := CallId{ - Id: cmdId, + Id: cmdId, Target: receiver, } - log.Debug("servent mutex locking") + log.Trace("servent mutex locking") s.mu.Lock() - log.Debug("servent mutex locked") + log.Trace("servent mutex locked") // We append the new call to the pending map, and send the request s.pending[callId] = call s.mu.Unlock() - log.Debug("servent mutex unlocked") + log.Trace("servent mutex unlocked") log.WithFields(logrus.Fields{ - "name": cmd.GetName(), - "id": cmd.GetId(), - "agentId": receiver.AgentId, - "executorId": receiver.ExecutorId, - }). - Debug("calling scheduler SendFunc") + "name": cmd.GetName(), + "id": cmd.GetId(), + "agentId": receiver.AgentId, + "executorId": receiver.ExecutorId, + }). + Trace("calling scheduler SendFunc") err := s.SendFunc(cmd, receiver) if err != nil { - log.Debug("servent mutex locking") + log.Trace("servent mutex locking") s.mu.Lock() - log.Debug("servent mutex locked") + log.Trace("servent mutex locked") delete(s.pending, callId) s.mu.Unlock() - log.WithError(err).Debug("servent mutex unlocked") + log.WithError(err).Trace("servent mutex unlocked") return nil, err } - log.WithField("timeout", cmd.GetResponseTimeout()).Debug("blocking until response or timeout") + log.WithField("timeout", cmd.GetResponseTimeout()).Trace("blocking until response or timeout") // Neat, now we block until done||timeout select { case <-call.Done: @@ -127,14 +127,14 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes case <-time.After(cmd.GetResponseTimeout()): call.Error = fmt.Errorf("MesosCommand %s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) - log.Debug("servent mutex locking") + log.Trace("servent mutex locking") s.mu.Lock() - log.Debug("servent mutex locked") + log.Trace("servent mutex locked") delete(s.pending, callId) s.mu.Unlock() - log.Debug("servent mutex unlocked") + log.Trace("servent mutex unlocked") } if call.Error != nil { @@ -145,7 +145,7 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes func (s *Servent) ProcessResponse(res MesosCommandResponse, sender MesosCommandTarget) { callId := CallId{ - Id: res.GetCommandId(), + Id: res.GetCommandId(), Target: sender, } @@ -157,14 +157,14 @@ func (s *Servent) ProcessResponse(res MesosCommandResponse, sender MesosCommandT if call == nil { log.WithFields(logrus.Fields{ "commandName": res.GetCommandName(), - "commandId": res.GetCommandId(), - "agentId": sender.AgentId, - "executorId": sender.ExecutorId, + "commandId": res.GetCommandId(), + "agentId": sender.AgentId, + "executorId": sender.ExecutorId, }). - Warning("no pending request found") + Warning("no pending request found") return } call.Response = res call.Done <- empty{} -} \ No newline at end of file +} diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index ba09f47b5..4aab7250d 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -41,18 +41,18 @@ import ( func NewDeployTransition(taskman *task.Manager, addRoles []string, removeRoles []string) Transition { return &DeployTransition{ baseTransition: baseTransition{ - name: "DEPLOY", + name: "DEPLOY", taskman: taskman, }, - addRoles: addRoles, + addRoles: addRoles, removeRoles: removeRoles, } } type DeployTransition struct { baseTransition - addRoles []string - removeRoles []string + addRoles []string + removeRoles []string } func (t DeployTransition) do(env *Environment) (err error) { @@ -159,7 +159,7 @@ func (t DeployTransition) do(env *Environment) (err error) { // We set all callRoles to ACTIVE right now, because there's no task activation for them. // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. allHooks := wf.GetAllHooks() - callHooks := allHooks.FilterCalls() // get the calls + callHooks := allHooks.FilterCalls() // get the calls if len(callHooks) > 0 { for _, h := range callHooks { pr, ok := h.GetParentRole().(workflow.PublicUpdatable) @@ -173,19 +173,19 @@ func (t DeployTransition) do(env *Environment) (err error) { deploymentTimeout := 90 * time.Second wfStatus := wf.GetStatus() if wfStatus != task.ACTIVE { - WORKFLOW_ACTIVE_LOOP: + log.Debug("waiting for workflow to become active") + WORKFLOW_ACTIVE_LOOP: for { - log.Debug("waiting for workflow to become active") select { case wfStatus = <-notifyStatus: log.WithField("status", wfStatus.String()). - Debug("workflow status change") + Debug("workflow status change") if wfStatus == task.ACTIVE { break WORKFLOW_ACTIVE_LOOP } continue case <-time.After(deploymentTimeout): - err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s",deploymentTimeout.String())) + err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s", deploymentTimeout.String())) break WORKFLOW_ACTIVE_LOOP // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster @@ -195,7 +195,7 @@ func (t DeployTransition) do(env *Environment) (err error) { if wfState == task.ERROR { failedRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { - if st := role.GetState(); st == task.ERROR { + if st := role.GetState(); st == task.ERROR { log.WithField("state", st). WithField("role", role.GetPath()). WithField("environment", role.GetEnvironmentId().String()). @@ -204,7 +204,7 @@ func (t DeployTransition) do(env *Environment) (err error) { } }) log.WithField("state", wfState.String()). - Debug("workflow state change") + Debug("workflow state change") err = fmt.Errorf("workflow deployment failed, aborting and cleaning up [offending roles: %s]", strings.Join(failedRoles, ", ")) break WORKFLOW_ACTIVE_LOOP } diff --git a/core/task/constraint/attributes.go b/core/task/constraint/attributes.go index 678443e82..d824bbefa 100644 --- a/core/task/constraint/attributes.go +++ b/core/task/constraint/attributes.go @@ -29,7 +29,7 @@ import ( "strings" "github.com/AliceO2Group/Control/common/utils" - "github.com/mesos/mesos-go/api/v1/lib" + mesos "github.com/mesos/mesos-go/api/v1/lib" ) type Attributes []mesos.Attribute @@ -68,13 +68,12 @@ func (attrs Attributes) Satisfy(cts Constraints) (ok bool) { } for _, constraint := range cts { - log.WithField("constraint", constraint.String()).Trace("processing constraint") switch constraint.Operator { case Equals: var value string if value, ok = attrs.Get(constraint.Attribute); ok { if strings.Contains(value, ",") { - values := strings.Split(value,",") + values := strings.Split(value, ",") if utils.StringSliceContains(values, constraint.Value) { ok = true continue diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 748c671ed..8569a02f8 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -47,8 +47,8 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/constraint" - "github.com/AliceO2Group/Control/executor/protos" - "github.com/mesos/mesos-go/api/v1/lib" + pb "github.com/AliceO2Group/Control/executor/protos" + mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" xmetrics "github.com/mesos/mesos-go/api/v1/lib/extras/metrics" "github.com/mesos/mesos-go/api/v1/lib/extras/scheduler/callrules" @@ -68,7 +68,6 @@ var ( RegistrationMaxBackoff = 15 * time.Second ) - // StateError is returned when the system encounters an unresolvable state transition error and // should likely exit. type StateError string @@ -78,8 +77,8 @@ func (err StateError) Error() string { return string(err) } var schedEventsCh = make(chan scheduler.Event_Type) func runSchedulerController(ctx context.Context, - state *schedulerState, - fidStore store.Singleton) error { + state *schedulerState, + fidStore store.Singleton) error { // Set up communication from controller to state machine. go func() { for { @@ -96,7 +95,7 @@ func runSchedulerController(ctx context.Context, // Set up communication from state machine to controller go func() { for { - <- state.reviveOffersTrg + <-state.reviveOffersTrg doReviveOffers(ctx, state) state.reviveOffersTrg <- struct{}{} } @@ -137,7 +136,6 @@ func runSchedulerController(ctx context.Context, ) } - // buildEventHandler generates and returns a handler to process events received // from the subscription. The handler is then passed as controller.Option to // controller.Run. @@ -164,7 +162,6 @@ func (state *schedulerState) buildEventHandler(fidStore store.Singleton) events. }.Otherwise(logger.HandleEvent)) } - // Channel the event type of the newly received event to an asynchronous dispatcher // in runSchedulerController func (state *schedulerState) notifyStateMachine() events.HandlerFunc { @@ -174,7 +171,7 @@ func (state *schedulerState) notifyStateMachine() events.HandlerFunc { } } -// Implicit Reconciliation Call that sends an empty list of tasks and the master responds +// Implicit Reconciliation Call that sends an empty list of tasks and the master responds // with the latest state for all currently known non-terminal tasks. func (state *schedulerState) reconciliationCall() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { @@ -204,7 +201,7 @@ func failure(_ context.Context, e *scheduler.Event) error { if eid != nil { // executor failed.. fields := logrus.Fields{ - "executor": eid.Value, + "executor": eid.Value, } if aid != nil { fields["agent"] = aid.Value @@ -236,8 +233,6 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // only one entry in the list, we signal back to commandqueue // otherwise, we log and ignore. return func(ctx context.Context, e *scheduler.Event) (err error) { - log.Debug("scheduler.incomingMessageHandler BEGIN") - defer log.Debug("scheduler.incomingMessageHandler END") mesosMessage := e.GetMessage() if mesosMessage == nil { @@ -253,9 +248,9 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { err = errors.New("message handler got MESSAGE with no valid sender") log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "agentId": agentId.GetValue(), + "agentId": agentId.GetValue(), "executorId": executorId.GetValue(), - "error": err.Error(), + "error": err.Error(), }). Warning("message handler cannot continue") return @@ -274,7 +269,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { switch incomingType.MessageType { case "DeviceEvent": var incomingEvent struct { - Type pb.DeviceEventType `json:"type"` + Type pb.DeviceEventType `json:"type"` Origin event.DeviceEventOrigin `json:"origin"` } err = json.Unmarshal(data, &incomingEvent) @@ -291,9 +286,9 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { //state.handleDeviceEvent(ev) } else { log.WithFields(logrus.Fields{ - "type": incomingEvent.Type.String(), - "originTask": incomingEvent.Origin.TaskId.Value, - }). + "type": incomingEvent.Type.String(), + "originTask": incomingEvent.Origin.TaskId.Value, + }). Error("cannot handle incoming device event") } @@ -315,19 +310,19 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { err = json.Unmarshal(data, &res) if err != nil { log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "commandName": incomingCommand.CommandName, - "agentId": agentId.GetValue(), - "executorId": executorId.GetValue(), - "message": string(data[:]), - "error": err.Error(), - }). + "commandName": incomingCommand.CommandName, + "agentId": agentId.GetValue(), + "executorId": executorId.GetValue(), + "message": string(data[:]), + "error": err.Error(), + }). Error("cannot unmarshal incoming MESSAGE") return } sender := controlcommands.MesosCommandTarget{ - AgentId: agentId, + AgentId: agentId, ExecutorId: executorId, - TaskId: mesos.TaskID{Value: res.TaskId}, + TaskId: mesos.TaskID{Value: res.TaskId}, } go func() { @@ -339,24 +334,24 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { err = json.Unmarshal(data, &res) if err != nil { log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "commandName": incomingCommand.CommandName, - "agentId": agentId.GetValue(), - "executorId": executorId.GetValue(), - "message": string(data[:]), - "error": err.Error(), - }). + "commandName": incomingCommand.CommandName, + "agentId": agentId.GetValue(), + "executorId": executorId.GetValue(), + "message": string(data[:]), + "error": err.Error(), + }). Error("cannot unmarshal incoming MESSAGE") return } sender := controlcommands.MesosCommandTarget{ - AgentId: agentId, + AgentId: agentId, ExecutorId: executorId, - TaskId: mesos.TaskID{Value: res.TaskId}, + TaskId: mesos.TaskID{Value: res.TaskId}, } go func() { taskmanMessage := NewTaskStateMessage(res.TaskId, res.CurrentState) - state.taskman.MessageChannel <-taskmanMessage + state.taskman.MessageChannel <- taskmanMessage // servent should be inside taskman and eventually // all this handling. @@ -387,15 +382,15 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han return func(ctx context.Context, e *scheduler.Event) error { var ( offers = e.GetOffers().GetOffers() - callOption = calls.RefuseSeconds(time.Second)//calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) + callOption = calls.RefuseSeconds(time.Second) //calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) tasksLaunchedThisCycle = 0 offersDeclined = 0 ) if viper.GetBool("veryVerbose") { - var( + var ( prettyOffers []string - offerIds []string + offerIds []string ) for i := range offers { prettyOffer, _ := json.MarshalIndent(offers[i], "", "\t") @@ -403,14 +398,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han offerIds = append(offerIds, offers[i].ID.Value) } log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "offerIds": strings.Join(offerIds, ", "), + "offerIds": strings.Join(offerIds, ", "), //"offers": strings.Join(prettyOffers, "\n"), }).Trace("received offers") } var descriptorsStillToDeploy Descriptors select { - case descriptorsStillToDeploy = <- state.tasksToDeploy: + case descriptorsStillToDeploy = <-state.tasksToDeploy: if viper.GetBool("veryVerbose") { rolePaths := make([]string, len(descriptorsStillToDeploy)) taskClasses := make([]string, len(descriptorsStillToDeploy)) @@ -420,7 +415,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "roles": strings.Join(rolePaths, ", "), + "roles": strings.Join(rolePaths, ", "), "classes": strings.Join(taskClasses, ", "), }). Debug("received descriptors for tasks to deploy on this offers round") @@ -452,7 +447,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler").Debug("about to deploy workflow tasks") - var err error + var err error // We make a map[Descriptor]constraint.Constraints and for each descriptor to deploy we // fill it with the pre-computed total constraints for that Descriptor. @@ -463,10 +458,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // for a likely significant multinode launch performance increase for _, offer := range offers { var ( - remainingResourcesInOffer = mesos.Resources(offer.Resources) + remainingResourcesInOffer = mesos.Resources(offer.Resources) taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(DeploymentMap) - targetExecutorId = mesos.ExecutorID{} + tasksDeployedForCurrentOffer = make(DeploymentMap) + targetExecutorId = mesos.ExecutorID{} ) // If there are no executors provided by the offer, @@ -479,9 +474,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - }).Debug("processing offer") + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + }).Debug("processing offer") remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) @@ -499,22 +494,19 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han state.Lock() // We iterate down over the descriptors, and we remove them as we match - FOR_DESCRIPTORS: - for i := len(descriptorsStillToDeploy)-1; i >= 0; i-- { + FOR_DESCRIPTORS: + for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { descriptor := descriptorsStillToDeploy[i] - log.WithPrefix("scheduler"). - WithField("taskClass", descriptor.TaskClassName). - Debug("processing descriptor") offerAttributes := constraint.Attributes(offer.Attributes) if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "attributes": offerAttributes.String(), + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), }). Trace("descriptor constraints not satisfied by offer attributes") } @@ -532,10 +524,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), }). Trace("descriptor wants not satisfied by offer resources") } @@ -564,14 +556,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } // global channel alias processing if len(ch.Global) != 0 { - bindMap["::" + ch.Global] = bindMap[ch.Name] + bindMap["::"+ch.Global] = bindMap[ch.Name] } } agentForCache := AgentCacheInfo{ - AgentId: offer.AgentID, + AgentId: offer.AgentID, Attributes: offer.Attributes, - Hostname: offer.Hostname, + Hostname: offer.Hostname, } state.taskman.AgentCache.Update(agentForCache) //thread safe @@ -646,7 +638,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // Iterated call of the above function for the given kv-map of // env var defaults for varName, defaultValue := range map[string]string{ - "O2_ROLE": offer.Hostname, + "O2_ROLE": offer.Hostname, "O2_SYSTEM": "FLP", } { fillEnvDefault(varName, defaultValue) @@ -721,24 +713,24 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} if ok { mesosTaskInfo.Executor.Command.Environment.Variables = - append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) + append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) } log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "taskId": newTaskId, - "offerId": offer.ID.Value, - "executorId": state.executor.ExecutorID.Value, - "command": mesosTaskInfo.Command.GetValue(), - "arguments": mesosTaskInfo.Command.GetArguments(), - "shenv": mesosTaskInfo.Command.GetEnvironment().String(), - "user": mesosTaskInfo.Command.GetUser(), - }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State:"LAUNCHED", Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) + "taskId": newTaskId, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + "command": mesosTaskInfo.Command.GetValue(), + "arguments": mesosTaskInfo.Command.GetArguments(), + "shenv": mesosTaskInfo.Command.GetEnvironment().String(), + "user": mesosTaskInfo.Command.GetUser(), + }).Debug("launching task") + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State: "LAUNCHED", Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) @@ -768,10 +760,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han for _, taskInfo := range taskInfosToLaunchForCurrentOffer { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "executorId": taskInfo.GetExecutor().ExecutorID.Value, + "executorId": taskInfo.GetExecutor().ExecutorID.Value, "executorName": taskInfo.GetExecutor().GetName(), - "agentId": taskInfo.GetAgentID().Value, - "taskId": taskInfo.GetTaskID().Value, + "agentId": taskInfo.GetAgentID().Value, + "taskId": taskInfo.GetTaskID().Value, }). Debug("launched") } @@ -846,9 +838,9 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { s := e.GetUpdate().GetStatus() if viper.GetBool("verbose") { log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "task": s.TaskID.Value, - "state": s.GetState().String(), - "message": s.GetMessage(), + "task": s.TaskID.Value, + "state": s.GetState().String(), + "message": s.GetMessage(), }).Trace("task status update received") } @@ -862,19 +854,18 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { // FIXME: this should not quit when all tasks are done, but rather do some transition /* - if state.tasksFinished == state.totalTasks { - log.Println("Mission accomplished, all tasks completed. Terminating scheduler.") - state.shutdown() - } else { - state.tryReviveOffers(ctx) - }*/ + if state.tasksFinished == state.totalTasks { + log.Println("Mission accomplished, all tasks completed. Terminating scheduler.") + state.shutdown() + } else { + state.tryReviveOffers(ctx) + }*/ // log.WithPrefix("scheduler").Debug("state unlock") } taskmanMessage := NewTaskStatusMessage(s) state.taskman.MessageChannel <- taskmanMessage - return nil } } @@ -912,8 +903,6 @@ func (state *schedulerState) killTask(ctx context.Context, receiver controlcomma } func (state *schedulerState) sendCommand(ctx context.Context, command controlcommands.MesosCommand, receiver controlcommands.MesosCommandTarget) (err error) { - log.Debug("sendCommand BEGIN") - defer log.Debug("sendCommand END") var bytes []byte bytes, err = json.Marshal(command) if err != nil { @@ -926,12 +915,18 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "agentId": receiver.AgentId.Value, - "executorId": receiver.ExecutorId.Value, - "payload": string(bytes), - "error": func() string { if err == nil { return "nil" } else { return err.Error() } }(), - }). - Debug("outgoing MESSAGE call") + "agentId": receiver.AgentId.Value, + "executorId": receiver.ExecutorId.Value, + "payload": string(bytes), + "error": func() string { + if err == nil { + return "nil" + } else { + return err.Error() + } + }(), + }). + Trace("outgoing MESSAGE call") return err } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index dcccb8226..b33b57a58 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -83,7 +83,7 @@ func (r *aggregatorRole) MarshalYAML() (interface{}, error) { } return aux, err -} +} func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { rs = make([]Role, 0) @@ -159,7 +159,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ - roleBase: *r.roleBase.copy().(*roleBase), + roleBase: *r.roleBase.copy().(*roleBase), aggregator: *r.aggregator.copy().(*aggregator), } for i := 0; i < len(rCopy.Roles); i++ { @@ -180,13 +180,13 @@ func (r *aggregatorRole) updateStatus(s task.Status) { return } log.WithFields(logrus.Fields{ - "child status": s.String(), - "aggregator status": r.status.get().String(), - "aggregator role": r.Name, - }). - Debug("aggregator role about to merge incoming child status") + "child status": s.String(), + "aggregator status": r.status.get().String(), + "aggregator role": r.Name, + }). + Trace("aggregator role about to merge incoming child status") r.status.merge(s, r) - log.WithField("new status", r.status.get()).Debug("status merged") + log.WithField("new status", r.status.get()).Trace("status merged") r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) @@ -197,10 +197,10 @@ func (r *aggregatorRole) updateState(s task.State) { if r == nil { return } - log.WithField("role", r.Name).WithField("state", s.String()).Debug("updating state") + log.WithField("role", r.Name).WithField("state", s.String()).Trace("updating state") r.state.merge(s, r) r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) } -} \ No newline at end of file +} diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 5e7c97c04..0d94d5289 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -47,13 +47,13 @@ type callRole struct { } func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - aux := struct{ - Call struct{ - Func string - Return string - Trigger *string - Await *string - Timeout *string + aux := struct { + Call struct { + Func string + Return string + Trigger *string + Await *string + Timeout *string Critical *bool } }{} @@ -109,12 +109,18 @@ func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *callRole) MarshalYAML() (interface{}, error) { callRole := make(map[string]interface{}) - if t.Traits.Trigger != "" { callRole["trigger"] = t.Traits.Trigger } - if t.Traits.Await != "" { callRole["await"] = t.Traits.Await } - if t.Traits.Timeout != "" { callRole["timeout"] = t.Traits.Timeout } + if t.Traits.Trigger != "" { + callRole["trigger"] = t.Traits.Trigger + } + if t.Traits.Await != "" { + callRole["await"] = t.Traits.Await + } + if t.Traits.Timeout != "" { + callRole["timeout"] = t.Traits.Timeout + } callRole["critical"] = t.Traits.Critical - callRole["func"] = t.FuncCall - callRole["return"] = t.ReturnVar + callRole["func"] = t.FuncCall + callRole["return"] = t.ReturnVar auxRoleBase, err := t.roleBase.MarshalYAML() aux := auxRoleBase.(map[string]interface{}) @@ -180,11 +186,11 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF return } -func (t* callRole) UpdateStatus(s task.Status) { +func (t *callRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t* callRole) UpdateState(s task.State) { +func (t *callRole) UpdateState(s task.State) { t.updateState(s) } @@ -201,7 +207,7 @@ func (t *callRole) updateState(s task.State) { if t.parent == nil { log.WithField("state", s.String()).Error("cannot update state with nil parent") } - log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") + log.WithField("role", t.Name).WithField("state", s.String()).Trace("updating state") t.state.merge(s, t) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) @@ -209,13 +215,13 @@ func (t *callRole) updateState(s task.State) { func (t *callRole) copy() copyable { rCopy := callRole{ - roleBase: *t.roleBase.copy().(*roleBase), - FuncCall: t.FuncCall, - ReturnVar: t.ReturnVar, - Traits: t.Traits, + roleBase: *t.roleBase.copy().(*roleBase), + FuncCall: t.FuncCall, + ReturnVar: t.ReturnVar, + Traits: t.Traits, } - rCopy.status = SafeStatus{status:rCopy.GetStatus()} - rCopy.state = SafeState{state:rCopy.GetState()} + rCopy.status = SafeStatus{status: rCopy.GetStatus()} + rCopy.state = SafeState{state: rCopy.GetState()} return &rCopy } @@ -224,7 +230,7 @@ func (t *callRole) GenerateTaskDescriptors() (ds task.Descriptors) { } func (t *callRole) GetTasks() task.Tasks { - return []*task.Task{} + return []*task.Task{} } func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMap) { @@ -269,11 +275,11 @@ func (t *callRole) GetAllHooks() callable.Hooks { return callable.Hooks{} } -func (t* callRole) GetTaskTraits() task.Traits { +func (t *callRole) GetTaskTraits() task.Traits { if t == nil { return task.Traits{ Trigger: "", - Await: "", + Await: "", Timeout: "0s", Critical: false, } @@ -281,8 +287,7 @@ func (t* callRole) GetTaskTraits() task.Traits { return t.Traits } - -func (t* callRole) GetTaskClasses() []string { +func (t *callRole) GetTaskClasses() []string { return nil } diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 7f5bea84d..33f1a2049 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -33,7 +33,7 @@ import ( ) type SafeStatus struct { - mu sync.RWMutex + mu sync.RWMutex status task.Status } @@ -52,10 +52,10 @@ func aggregateStatus(roles []Role) (status task.Status) { for _, c := range roles[1:] { if status == task.UNDEFINED { log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), + "statuses": strings.Join(stati, ", "), "aggregated": status.String(), }). - Debug("aggregating statuses") + Trace("aggregating statuses") return } @@ -63,10 +63,10 @@ func aggregateStatus(roles []Role) (status task.Status) { } } log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "aggregated": status.String(), - }). - Debug("aggregating statuses") + "statuses": strings.Join(stati, ", "), + "aggregated": status.String(), + }). + Trace("aggregating statuses") return } @@ -80,7 +80,7 @@ func (t *SafeStatus) merge(s task.Status, r Role) { _, isTaskRole := r.(*taskRole) _, isCallRole := r.(*callRole) - if isTaskRole || isCallRole { // no aggregation, we just update + if isTaskRole || isCallRole { // no aggregation, we just update t.status = s return } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index c3d99177f..1519b3274 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -47,12 +47,12 @@ type taskRole struct { } func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - aux := struct{ - Task struct{ - Load string - Trigger *string - Await *string - Timeout *string + aux := struct { + Task struct { + Load string + Trigger *string + Await *string + Timeout *string Critical *bool } }{} @@ -106,11 +106,17 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) func (t *taskRole) MarshalYAML() (interface{}, error) { taskRole := make(map[string]interface{}) - if t.Traits.Trigger != "" { taskRole["trigger"] = t.Traits.Trigger } - if t.Traits.Await != "" { taskRole["await"] = t.Traits.Await } - if t.Traits.Timeout != "" { taskRole["timeout"] = t.Traits.Timeout } + if t.Traits.Trigger != "" { + taskRole["trigger"] = t.Traits.Trigger + } + if t.Traits.Await != "" { + taskRole["await"] = t.Traits.Await + } + if t.Traits.Timeout != "" { + taskRole["timeout"] = t.Traits.Timeout + } taskRole["critical"] = t.Traits.Critical - taskRole["load"] = t.LoadTaskClass + taskRole["load"] = t.LoadTaskClass auxRoleBase, err := t.roleBase.MarshalYAML() aux := auxRoleBase.(map[string]interface{}) @@ -175,11 +181,11 @@ func (t *taskRole) resolveTaskClassIdentifier(repo repos.IRepo) { t.LoadTaskClass = repo.ResolveTaskClassIdentifier(t.LoadTaskClass) } -func (t* taskRole) UpdateStatus(s task.Status) { +func (t *taskRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t* taskRole) UpdateState(s task.State) { +func (t *taskRole) UpdateState(s task.State) { t.updateState(s) } @@ -196,7 +202,7 @@ func (t *taskRole) updateState(s task.State) { if t.parent == nil { log.WithField("state", s.String()).Error("cannot update state with nil parent") } - log.WithField("role", t.Name).WithField("state", s.String()).Debug("updating state") + log.WithField("role", t.Name).WithField("state", s.String()).Trace("updating state") t.state.merge(s, t) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) @@ -214,8 +220,8 @@ func (t *taskRole) copy() copyable { LoadTaskClass: t.LoadTaskClass, Traits: t.Traits, } - rCopy.status = SafeStatus{status:task.INACTIVE} - rCopy.state = SafeState{state:task.STANDBY} + rCopy.status = SafeStatus{status: task.INACTIVE} + rCopy.state = SafeState{state: task.STANDBY} return &rCopy } @@ -230,11 +236,11 @@ func (t *taskRole) GenerateTaskDescriptors() (ds task.Descriptors) { } ds = task.Descriptors{{ - TaskRole: t, - TaskClassName: t.LoadTaskClass, + TaskRole: t, + TaskClassName: t.LoadTaskClass, RoleConstraints: t.getConstraints(), - RoleConnect: t.CollectOutboundChannels(), - RoleBind: t.CollectInboundChannels(), + RoleConnect: t.CollectOutboundChannels(), + RoleBind: t.CollectInboundChannels(), }} return } @@ -286,18 +292,18 @@ func (t *taskRole) GetTask() *task.Task { return t.Task.GetTask() } -func (t* taskRole) GetTaskClass() string { +func (t *taskRole) GetTaskClass() string { if t == nil { return "" } return t.LoadTaskClass } -func (t* taskRole) GetTaskTraits() task.Traits { +func (t *taskRole) GetTaskTraits() task.Traits { if t == nil { return task.Traits{ Trigger: "", - Await: "", + Await: "", Timeout: "0s", Critical: false, } @@ -305,8 +311,7 @@ func (t* taskRole) GetTaskTraits() task.Traits { return t.Traits } - -func (t* taskRole) GetTaskClasses() []string { +func (t *taskRole) GetTaskClasses() []string { if t == nil { return nil } diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index c1a3abf2a..36d51229e 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -40,15 +40,16 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" - "github.com/AliceO2Group/Control/executor/protos" + pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" "google.golang.org/grpc/status" ) type ControlTransport uint32 + const ( ProtobufTransport = ControlTransport(0) - JsonTransport = ControlTransport(1) + JsonTransport = ControlTransport(1) ) const GRPC_DIAL_TIMEOUT = 30 * time.Second @@ -86,9 +87,9 @@ func NewClient( occClient = pb.NewOccClient(conn) } - client := &RpcClient { + client := &RpcClient{ OccClient: occClient, - conn: conn, + conn: conn, } log.WithFields(logrus.Fields{"endpoint": endpoint, "controlMode": controlMode.String()}).Debug("instantiating new transitioner") @@ -128,28 +129,28 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er cfg = append(cfg, &pb.ConfigEntry{Key: k, Value: v}) r.log.WithField("key", k). WithField("value", v). - Debug("pushing argument") + Trace("pushing argument") } return }() response, err = r.Transition(context.TODO(), &pb.TransitionRequest{ TransitionEvent: ei.Evt, - Arguments: argsToPush, - SrcState: ei.Src, + Arguments: argsToPush, + SrcState: ei.Src, }, grpc.EmptyCallOption{}) if err != nil { status, ok := status.FromError(err) if ok { r.log.WithFields(logrus.Fields{ - "code": status.Code().String(), + "code": status.Code().String(), "message": status.Message(), "details": status.Details(), - "error": status.Err().Error(), - "level": infologger.IL_Devel, + "error": status.Err().Error(), + "level": infologger.IL_Devel, }). - Error("transition call error") + Error("transition call error") err = errors.New(fmt.Sprintf("occplugin returned %s: %s", status.Code().String(), status.Message())) } else { err = errors.New("invalid gRPC status") @@ -182,4 +183,4 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er err = fmt.Errorf("transition unsuccessful: id: %s invalid response but no gRPC error", taskId) } return -} \ No newline at end of file +} diff --git a/executor/handlers.go b/executor/handlers.go index 7ee826157..dd8d4df0c 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -43,7 +43,7 @@ import ( ) func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executable.SendStatusFunc { - return func(mesosState mesos.TaskState, message string){ + return func(mesosState mesos.TaskState, message string) { status := newStatus(state, task.TaskID) status.State = &mesosState status.Message = utils.ProtoString(message) @@ -74,7 +74,7 @@ func handleOutgoingMessage(state *internalState, message []byte) { log.WithFields(logrus.Fields{ "event": string(message), }). - Debug("event sent") + Debug("event sent") } func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { @@ -87,10 +87,14 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { state.activeTasksMu.Unlock() } else { switch *status.State { - case mesos.TASK_DROPPED: fallthrough - case mesos.TASK_FINISHED: fallthrough - case mesos.TASK_GONE: fallthrough - case mesos.TASK_KILLED: fallthrough + case mesos.TASK_DROPPED: + fallthrough + case mesos.TASK_FINISHED: + fallthrough + case mesos.TASK_GONE: + fallthrough + case mesos.TASK_KILLED: + fallthrough case mesos.TASK_LOST: state.activeTasksMu.Lock() delete(state.activeTasks, status.TaskID) @@ -102,7 +106,7 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { "task": status.TaskID, "state": status.State.String(), }). - Warn("failed to update task status") + Warn("failed to update task status") } } @@ -111,10 +115,10 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { // Handle incoming message event. This function is thread-safe with respect to state. func handleMessageEvent(state *internalState, data []byte) (err error) { var incoming struct { - Name string `json:"name"` - TargetList []struct{ - TaskId mesos.TaskID - } `json:"targetList"` + Name string `json:"name"` + TargetList []struct { + TaskId mesos.TaskID + } `json:"targetList"` } err = json.Unmarshal(data, &incoming) if err != nil { @@ -128,7 +132,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { log.WithField("name", incoming.Name). WithField("payload", string(data[:])). - Debug("processing incoming MESSAGE") + Trace("processing incoming MESSAGE") taskId := incoming.TargetList[0].TaskId @@ -141,10 +145,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { if !ok || activeTask == nil { err = fmt.Errorf("no active task %s", taskId.Value) log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": err.Error(), - }). + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). Error("no task for incoming MESSAGE") return } @@ -152,14 +156,14 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { // Asynchronous and thread-unsafe, but probably ok because a hook only fires // once per environment cycle go func() { - var cmd = new(controlcommands.MesosCommand_TriggerHook) + var cmd = new(controlcommands.MesosCommand_TriggerHook) err = json.Unmarshal(data, cmd) if err != nil { log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": err.Error(), - }). + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). Error("cannot unmarshal incoming MESSAGE") return } @@ -168,10 +172,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { hookTask, ok := activeTask.(*executable.HookTask) if !ok { log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": "type assertion error", - }). + "name": incoming.Name, + "message": string(data[:]), + "error": "type assertion error", + }). Warning("received TriggerHook for non-hook task") return } @@ -185,18 +189,18 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { if marshalError != nil { if response.Err() != nil { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "marshalError": marshalError, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). Error("cannot marshal MesosCommandResponse for sending as MESSAGE") } else { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "marshalError": marshalError, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "marshalError": marshalError, + }). Error("cannot marshal MesosCommandResponse for sending as MESSAGE") } return @@ -205,18 +209,18 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) if response.Err() != nil { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "taskId": response.TaskId, - "error": response.Err().Error(), - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "taskId": response.TaskId, + "error": response.Err().Error(), + }). Trace("response sent") } else { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "taskId": response.TaskId, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "taskId": response.TaskId, + }). Trace("response sent") } }() @@ -229,10 +233,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { if !ok || activeTask == nil { err = fmt.Errorf("no active task %s", taskId.Value) log.WithFields(logrus.Fields{ - "name": incoming.Name, - "message": string(data[:]), - "error": err.Error(), - }). + "name": incoming.Name, + "message": string(data[:]), + "error": err.Error(), + }). Error("no task for incoming MESSAGE") return } @@ -246,10 +250,10 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { cmd, err = activeTask.UnmarshalTransition(data) if err != nil { log.WithFields(logrus.Fields{ - "name": cmd.Name, - "message": string(data[:]), - "error": err.Error(), - }). + "name": cmd.Name, + "message": string(data[:]), + "error": err.Error(), + }). Error("cannot unmarshal incoming MESSAGE") return } @@ -264,18 +268,18 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { if marshalError != nil { if response.Err() != nil { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "marshalError": marshalError, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "marshalError": marshalError, + }). Error("cannot marshal MesosCommandResponse for sending as MESSAGE") } else { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "marshalError": marshalError, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "marshalError": marshalError, + }). Error("cannot marshal MesosCommandResponse for sending as MESSAGE") } return @@ -284,23 +288,22 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) if response.Err() != nil { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "error": response.Err().Error(), - "state": response.CurrentState, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "error": response.Err().Error(), + "state": response.CurrentState, + }). Trace("response sent") } else { log.WithFields(logrus.Fields{ - "commandName": response.GetCommandName(), - "commandId": response.GetCommandId(), - "state": response.CurrentState, - }). + "commandName": response.GetCommandName(), + "commandId": response.GetCommandId(), + "state": response.CurrentState, + }). Trace("response sent") } }() - default: err = errors.New(fmt.Sprintf("unrecognized controlcommand %s", incoming.Name)) } @@ -346,18 +349,18 @@ func handleKillEvent(state *internalState, e *executor.Event_Kill) error { if ht, ok := activeTask.(*executable.HookTask); ok { // if it's a hook, it might be a DESTROY hook and therefore run after Kill // so we give it timeout seconds to stop, and in any case no more than 10s - timeout := 10*time.Second + timeout := 10 * time.Second if ht.Tci.Timeout != 0 && ht.Tci.Timeout < timeout { timeout = ht.Tci.Timeout } // this timeout is necessary so any incoming trigger commands can still use // state.activeTasks after the task is killed i.e. formally not active any more - select{ - case <- time.After(timeout): - state.activeTasksMu.Lock() - delete(state.activeTasks, e.GetTaskID()) - state.activeTasksMu.Unlock() + select { + case <-time.After(timeout): + state.activeTasksMu.Lock() + delete(state.activeTasks, e.GetTaskID()) + state.activeTasksMu.Unlock() } } else { state.activeTasksMu.Lock() From f3edb57dfc5b78d8641edb92c6f8e841997bb0ed Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Feb 2022 09:40:48 +0100 Subject: [PATCH 1103/2352] [build] Bump to v0.31.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 05ee090ec..dbc0dcf95 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 30 +VERSION_MINOR := 31 VERSION_PATCH := 0 From 542311c1d71aae7873d281b940e725a07b03bf5d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Feb 2022 14:11:55 +0100 Subject: [PATCH 1104/2352] [occ] Release device control when FairMQ device reaches EXITING --- occ/plugin/OccFMQCommon.cxx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index aa54f6105..b3c6910e9 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -242,6 +242,11 @@ std::tuple doTransition(fair: } } + if (newStates.back() == "EXITING") { + m_pluginServices->ReleaseDeviceControl("OCC"); + OLOG(debug) << "releasing device control"; + } + auto response = OccLite::nopb::TransitionResponse(); response.state = newStates.back(); response.transitionEvent = event; From c747b063cfe2396553ce8bb9c476d1cb7a9c89c2 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 8 Feb 2022 15:37:47 +0200 Subject: [PATCH 1105/2352] [core] Improve JIT consul query --- configuration/template/stack.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index fec043be0..21acdab76 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -147,7 +147,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str var metadata string // Match any consul URL - re := regexp.MustCompile(`'consul-json://[^']*'`) + re := regexp.MustCompile(`consul-json://[^ |]*`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) // Concatenate the consul LastIndex for each payload in a single string From 1f783454e5da1d96fb08c692dfc1ba8feafcf9b4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Feb 2022 14:15:53 +0100 Subject: [PATCH 1106/2352] [build] Bump to v0.31.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index dbc0dcf95..b624de746 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 31 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 56bc83f96b196b8be6a6a4f9e4edaefbd211df72 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Feb 2022 10:14:06 +0100 Subject: [PATCH 1107/2352] [core] Fix issue with GEN_TOPO_SOURCE generation R3C-710 #close --- core/integration/odc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 14d4bc338..4f70eb9ca 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -218,7 +218,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter return } if strings.TrimSpace(o2DPSource) == "default" { // if UI sends 'default', we look in Consul - pdpO2PdpSuiteVersion, ok = configStack["pdp_o2_data_processing_hash"] + o2DPSource, ok = configStack["pdp_o2_data_processing_hash"] if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). From 3bcbd802a60951224422679733de3e1753f1fd4d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Feb 2022 10:16:00 +0100 Subject: [PATCH 1108/2352] [build] Bump to v0.31.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b624de746..2d51852b5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 31 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 9a77bb5cd438fcd44760abdc48f2e3a7197a9531 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 10 Feb 2022 13:52:53 +0100 Subject: [PATCH 1109/2352] [OCTRL-564] Upload GeneralRunParameters to CCDB --- Makefile | 2 +- cmd/o2-aliecs-core/main.go | 5 + core/config.go | 1 + core/environment/environment.go | 8 +- core/integration/ccdb/plugin.go | 296 ++++++++++++++++++++++++++++++++ 5 files changed, 310 insertions(+), 2 deletions(-) create mode 100644 core/integration/ccdb/plugin.go diff --git a/Makefile b/Makefile index 07341f114..1986e43bf 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/trg +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/trg SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index 1149979cb..c72c933f0 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/ccdb" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/odc" @@ -41,6 +42,10 @@ import ( func init() { // TODO: enable/disable switches for plugins + integration.RegisterPlugin( + "ccdb", + "ccdbEndpoint", + ccdb.NewPlugin) integration.RegisterPlugin( "dcs", "dcsServiceEndpoint", diff --git a/core/config.go b/core/config.go index 903de9f98..5f73cfe9c 100644 --- a/core/config.go +++ b/core/config.go @@ -97,6 +97,7 @@ func setDefaults() error { viper.SetDefault("dumpWorkflows", false) viper.SetDefault("configServiceUri", "apricot://127.0.0.1:32101") viper.SetDefault("bookkeepingBaseUri", "http://127.0.0.1:4000") + viper.SetDefault("ccdbEndpoint", "http://ccdb-test.cern.ch:8080") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") diff --git a/core/environment/environment.go b/core/environment/environment.go index 4bd98c9ca..98b64fd32 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -131,7 +131,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { - // If the event is START_ACTIVITY, we set up a new run number early on. + // If the event is START_ACTIVITY, we set up a new run number and start time early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially // to plugin hooks. @@ -145,6 +145,12 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { rnString := strconv.FormatUint(uint64(runNumber), 10) env.workflow.GetVars().Set("run_number", rnString) env.workflow.GetVars().Set("runNumber", rnString) + + runStartTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) + env.workflow.GetVars().Set("run_start_time_ms", runStartTime) + } else if e.Event == "STOP_ACTIVITY" { + runEndTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) + env.workflow.GetVars().Set("run_end_time_ms", runEndTime) } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go new file mode 100644 index 000000000..d428ae857 --- /dev/null +++ b/core/integration/ccdb/plugin.go @@ -0,0 +1,296 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package ccdb + +import ( + "encoding/json" + "fmt" + "github.com/AliceO2Group/Control/common/runtype" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/workflow/callable" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "net/url" + "os/exec" + "strconv" + "strings" +) + +type GeneralRunParameters struct { + runNumber uint32 + runType runtype.RunType + startTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + endTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + detectors []string + continuousReadoutDetectors []string + triggeringDetectors []string + hbfPerTf uint32 // number of HeartBeatFrames per TimeFrame + lhcPeriod string +} + +func parseDetectors(detectorsParam string) (detectors []string, err error) { + detectorsSlice := make([]string, 0) + bytes := []byte(detectorsParam) + err = json.Unmarshal(bytes, &detectorsSlice) + if err != nil { + log.WithError(err). + Error("error processing the detectors list") + return + } + return detectorsSlice, nil +} + +func NewGRPObject(varStack map[string]string) *GeneralRunParameters { + + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return nil + } + + runNumber, err := strconv.ParseUint(varStack["run_number"], 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for Run Start") + return nil + } + + runType := runtype.NONE + runTypeStr, ok := varStack["run_type"] + if ok { + intRt, err := runtype.RunTypeString(runTypeStr) + if err == nil { + runType = intRt + } + } + + startTime := varStack["run_start_time_ms"] + endTime := varStack["run_end_time_ms"] + + detectorsStr, ok := varStack["detectors"] + if !ok { + log.WithField("partition", envId). + Error("cannot acquire general detector list from varStack") + } + detectorsSlice, err := parseDetectors(detectorsStr) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse general detector list") + return nil + } + + // TODO fill once we have those available + var continuousReadoutDetectors []string + var triggeringDetectors []string + + hbfPerTf, err := strconv.ParseUint(varStack["n_hbf_per_tf"], 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for Run Start") + return nil + } + + lhcPeriod, ok := varStack["lhc_period"] + if !ok { + log.WithField("partition", envId). + WithField("runNumber", runNumber). + Debug("CCDB interface could not retrieve 'lhc_period', putting 'Unknown'.") + lhcPeriod = "Unknown" + } + + return &GeneralRunParameters{ + uint32(runNumber), + runType, + startTime, + endTime, + detectorsSlice, + continuousReadoutDetectors, + triggeringDetectors, + uint32(hbfPerTf), + lhcPeriod, + } +} + +type Plugin struct { + ccdbUrl string +} + +func NewPlugin(endpoint string) integration.Plugin { + _, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + return &Plugin{ + ccdbUrl: endpoint, + } +} + +func (p *Plugin) GetName() string { + return "ccdb" +} + +func (p *Plugin) GetPrettyName() string { + return "The Condition and Calibration Data Base" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("ccdbEndpoint") +} + +func (p *Plugin) GetConnectionState() string { + return "READY" +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + return "" +} + +func (p *Plugin) Init(instanceId string) error { + return nil +} + +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + return stack +} + +func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl string) (cmd string, err error) { + // o2-ecs-grp-create -h + //Create GRP-ECS object and upload to the CCDB + //Usage: + // o2-ecs-grp-create + // -h [ --help ] Print this help message + // -p [ --period ] arg data taking period + // -r [ --run ] arg run number + // -n [ --hbf-per-tf ] arg (=128) number of HBFs per TF + // -d [ --detectors ] arg (=all) comma separated list of detectors + // -c [ --continuous ] arg (=ITS,TPC,TOF,MFT,MCH,MID,ZDC,FT0,FV0,FDD,CTP) comma separated list of detectors in continuous readout mode + // -t [ --triggering ] arg (=FT0,FV0) comma separated list of detectors providing a trigger + // -s [ --start-time ] arg (=0) run start time in ms, now() if 0 + // -e [ --end-time ] arg (=0) run end time in ms, start-time+3days is used if 0 + // --ccdb-server arg (=http://alice-ccdb.cern.ch) CCDB server for upload, local file if empty + + cmd = "source /etc/profile.d/o2.sh && o2-ecs-grp-create" + if len(grp.lhcPeriod) == 0 { + return "", fmt.Errorf("could not create a command for CCDB interface because LHC period is empty") + } + cmd += " -p " + grp.lhcPeriod + if grp.runNumber == 0 { + return "", fmt.Errorf("could not create a command for CCDB interface because run number is 0") + } + cmd += " -r " + strconv.FormatUint(uint64(grp.runNumber), 10) + if grp.hbfPerTf != 0 { + cmd += " -n " + strconv.FormatUint(uint64(grp.hbfPerTf), 10) + } + // TODO enable once PR#8082 to O2 is at P2 + //if grp.runType != runtype.NONE { + // cmd += " --run-type " + grp.runType.String() + //} + if len(grp.detectors) != 0 { + cmd += " -d \"" + strings.Join(grp.detectors, ",") + "\"" + } + if len(grp.continuousReadoutDetectors) != 0 { + cmd += " -c \"" + strings.Join(grp.continuousReadoutDetectors, ",") + "\"" + } + if len(grp.triggeringDetectors) != 0 { + // keeping the full argument until the conflict between '-t's of triggering and run-type is resolved + cmd += " --triggering \"" + strings.Join(grp.triggeringDetectors, ",") + "\"" + } + if len(grp.startTimeMs) > 0 { + cmd += " -s " + grp.startTimeMs + } + if len(grp.endTimeMs) > 0 { + cmd += " -e " + grp.endTimeMs + } + + cmd += " --ccdb-server " + ccdbUrl + return +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + + stack = make(map[string]interface{}) + stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing + + log.WithField("partition", envId).Debug("performing CCDB interface Run Start") + return p.uploadCurrentGRP(varStack, envId) + } + stack["RunStop"] = func() (out string) { + log.WithField("partition", envId).Debug("performing CCDB interface Run Stop") + return p.uploadCurrentGRP(varStack, envId) + } + + return +} + +func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) string { + grp := NewGRPObject(varStack) + + if grp == nil { + return fmt.Sprintf("Failed to create a GRP object") + } + log.WithField("partition", envId).Debug( + fmt.Sprintf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", + grp.runNumber, grp.runType.String(), grp.startTimeMs, grp.endTimeMs, grp.hbfPerTf, grp.lhcPeriod, + strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ","))) + cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl) + if err != nil { + return fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error()) + } + log.WithField("partition", envId).Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) + + cmd := exec.Command("bash", "-c", cmdStr) + // execute the DPL command in the repo of the workflow used + cmd.Dir = "/tmp" + var cmdOut []byte + cmdOut, err = cmd.CombinedOutput() + log.Debug("CCDB GRP upload command out: " + string(cmdOut)) + if err != nil { + return fmt.Sprintf("Failed to run the command to upload GRP to CCDB: " + err.Error() + "\ncommand out : " + string(cmdOut)) + } + return "" +} + +func (p *Plugin) Destroy() error { + return nil +} From 547f93a0386ca14f84bf463a3c6bc01743b423e3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 11 Feb 2022 15:54:15 +0100 Subject: [PATCH 1110/2352] Delete EOR time before (re)starting a new run --- core/environment/environment.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 98b64fd32..bc75ead40 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -148,6 +148,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { runStartTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) env.workflow.GetVars().Set("run_start_time_ms", runStartTime) + env.workflow.GetVars().Del("run_end_time_ms") // we delete previous EOR } else if e.Event == "STOP_ACTIVITY" { runEndTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) env.workflow.GetVars().Set("run_end_time_ms", runEndTime) From 3fe6fa9a7c682991a9720d4e8ed4344e499ffd02 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 14 Feb 2022 10:25:45 +0100 Subject: [PATCH 1111/2352] Update LHC period and nHbfPerTf before activity start --- core/environment/environment.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index bc75ead40..bd1fadddc 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,6 +29,7 @@ package environment import ( "errors" "fmt" + "github.com/AliceO2Group/Control/apricot" "strconv" "strings" "sync" @@ -131,7 +132,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { - // If the event is START_ACTIVITY, we set up a new run number and start time early on. + // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially // to plugin hooks. @@ -149,6 +150,20 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { runStartTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) env.workflow.GetVars().Set("run_start_time_ms", runStartTime) env.workflow.GetVars().Del("run_end_time_ms") // we delete previous EOR + + configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(apricot.Instance().GetDefaults())) + if err == nil { + lhcPeriod, ok := configStack["lhc_period"] + if ok { + env.workflow.GetVars().Set("lhc_period", lhcPeriod) + } + nHbfPerTf, ok := configStack["n_hbf_per_tf"] + if ok { + env.workflow.GetVars().Set("n_hbf_per_tf", nHbfPerTf) + } + } else { + log.Error("cannot access AliECS workflow configuration defaults") + } } else if e.Event == "STOP_ACTIVITY" { runEndTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) env.workflow.GetVars().Set("run_end_time_ms", runEndTime) From adaf3a5af5bac9a051fff02cab8ffd2bf1fff391 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 14 Feb 2022 10:31:21 +0100 Subject: [PATCH 1112/2352] correct author --- core/integration/ccdb/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index d428ae857..773bdec7e 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -2,7 +2,7 @@ * === This file is part of ALICE O² === * * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis + * Author: Piotr Konopka * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by From cb6e0019cb3f5362d2886da50704ff228fabc3fa Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 15 Feb 2022 11:10:08 +0100 Subject: [PATCH 1113/2352] Use SetRuntimeVar to handle SOR/EOR times This makes sure they are overwritten for all child roles --- core/environment/environment.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index bd1fadddc..22da5b2e0 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -148,8 +148,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.workflow.GetVars().Set("runNumber", rnString) runStartTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) - env.workflow.GetVars().Set("run_start_time_ms", runStartTime) - env.workflow.GetVars().Del("run_end_time_ms") // we delete previous EOR + env.workflow.SetRuntimeVar("run_start_time_ms", runStartTime) + env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous EOR configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(apricot.Instance().GetDefaults())) if err == nil { @@ -166,7 +166,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } } else if e.Event == "STOP_ACTIVITY" { runEndTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) - env.workflow.GetVars().Set("run_end_time_ms", runEndTime) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { From e9e68c090a92ec5c8eae986372e13373960e1db3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 15 Feb 2022 11:11:07 +0100 Subject: [PATCH 1114/2352] Use err.ConfSvc() as the source of configuration in environment.go --- core/environment/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 22da5b2e0..ff2a66faa 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -151,7 +151,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.workflow.SetRuntimeVar("run_start_time_ms", runStartTime) env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous EOR - configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(apricot.Instance().GetDefaults())) + configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults())) if err == nil { lhcPeriod, ok := configStack["lhc_period"] if ok { From 3f4a2c603734cf8eb4e29f73ae5211048f3ea5b9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 15 Feb 2022 11:12:56 +0100 Subject: [PATCH 1115/2352] Apply a timeout to the GRP upload command and make sure errors are reported --- core/integration/ccdb/plugin.go | 39 +++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 773bdec7e..742c9b449 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -25,7 +25,9 @@ package ccdb import ( + "context" "encoding/json" + "errors" "fmt" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -37,6 +39,7 @@ import ( "os/exec" "strconv" "strings" + "time" ) type GeneralRunParameters struct { @@ -251,23 +254,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId).Debug("performing CCDB interface Run Start") - return p.uploadCurrentGRP(varStack, envId) + err := p.uploadCurrentGRP(varStack, envId) + if err != nil { + log.WithField("partition", envId).Error(err.Error()) + } + return } stack["RunStop"] = func() (out string) { log.WithField("partition", envId).Debug("performing CCDB interface Run Stop") - return p.uploadCurrentGRP(varStack, envId) + err := p.uploadCurrentGRP(varStack, envId) + if err != nil { + log.WithField("partition", envId).Error(err.Error()) + } + return } - return } -func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) string { +func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) error { grp := NewGRPObject(varStack) if grp == nil { - return fmt.Sprintf("Failed to create a GRP object") + return errors.New(fmt.Sprintf("Failed to create a GRP object")) } log.WithField("partition", envId).Debug( fmt.Sprintf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", @@ -275,20 +284,26 @@ func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) stri strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ","))) cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl) if err != nil { - return fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error()) + return errors.New(fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error())) } log.WithField("partition", envId).Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) - cmd := exec.Command("bash", "-c", cmdStr) + const timeoutSeconds = 10 + ctx, cancel := context.WithTimeout(context.Background(), timeoutSeconds*time.Second) + defer cancel() + + cmd := exec.CommandContext(ctx, "bash", "-c", cmdStr) // execute the DPL command in the repo of the workflow used cmd.Dir = "/tmp" - var cmdOut []byte - cmdOut, err = cmd.CombinedOutput() + cmdOut, err := cmd.CombinedOutput() log.Debug("CCDB GRP upload command out: " + string(cmdOut)) + if ctx.Err() == context.DeadlineExceeded { + return errors.New(fmt.Sprintf("The command to upload GRP to CCDB timed out (" + strconv.Itoa(timeoutSeconds) + "s).")) + } if err != nil { - return fmt.Sprintf("Failed to run the command to upload GRP to CCDB: " + err.Error() + "\ncommand out : " + string(cmdOut)) + return errors.New(fmt.Sprintf("Failed to run the command to upload GRP to CCDB: " + err.Error() + "\ncommand out : " + string(cmdOut))) } - return "" + return nil } func (p *Plugin) Destroy() error { From 28c790b8614505c0eeae30298ed4a955cc5ceccf Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 15 Feb 2022 11:13:29 +0100 Subject: [PATCH 1116/2352] Happy New Year --- core/integration/ccdb/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 742c9b449..e77cc31f2 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2022 CERN and copyright holders of ALICE O². * Author: Piotr Konopka * * This program is free software: you can redistribute it and/or modify From 97746f0cc284c1e431cc889cb74fec8f86e0e975 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Feb 2022 16:54:10 +0100 Subject: [PATCH 1117/2352] [build] Bump to v0.32.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2d51852b5..f4f82b27c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 31 -VERSION_PATCH := 2 +VERSION_MINOR := 32 +VERSION_PATCH := 0 From ed93d2914adca1dd5ffa553788e450a29f7b9084 Mon Sep 17 00:00:00 2001 From: Dennis Klein Date: Wed, 23 Feb 2022 17:49:56 +0100 Subject: [PATCH 1118/2352] OCClite plugin: Release device control with the same plugin name as it was taken --- occ/plugin/OccFMQCommon.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index b3c6910e9..2853fc27f 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -243,7 +243,7 @@ std::tuple doTransition(fair: } if (newStates.back() == "EXITING") { - m_pluginServices->ReleaseDeviceControl("OCC"); + m_pluginServices->ReleaseDeviceControl(FMQ_CONTROLLER_NAME); OLOG(debug) << "releasing device control"; } @@ -261,4 +261,4 @@ std::tuple doTransition(fair: OLOG(debug) << "transition done, states visited: " << boost::algorithm::join(newStates, ", "); return std::make_tuple(response, grpc::Status::OK); -} \ No newline at end of file +} From 34ed4ad3bd2519b50fddd03628aebc39b7b9f9ce Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Feb 2022 16:27:41 +0100 Subject: [PATCH 1119/2352] [core] Fix typo --- core/integration/trg/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 6d94a586d..0d8461790 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -141,7 +141,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("performing TRG Run load Request") globalConfig, ok := varStack["trg_global_config"] - log.WithField("gloablConfig",globalConfig). + log.WithField("globalConfig",globalConfig). WithField("partition", envId). Debug("not a TRG Global Run, continuing with TRG Run Start") if !ok { From 404e66d01d45bc61be96b314c19ef23eddf03229 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 10:01:11 +0100 Subject: [PATCH 1120/2352] [core] Add possibility for testplugin call to fail --- core/integration/testplugin/plugin.go | 43 +++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 69769121b..148c20611 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -100,6 +100,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { message = "running testplugin.Noop" } + doFailS, ok := varStack["testplugin_fail"] + if !ok { + doFailS = "false" + } + doFail, convErr := strconv.ParseBool(doFailS) + if convErr != nil { + doFail = false + } + stack = make(map[string]interface{}) stack["Noop"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). @@ -132,6 +141,40 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + stack["Test"] = func() (out string) { // must formally return string even when we return nothing + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("rolepath", call.GetParentRolePath()). + WithField("trigger", call.GetTraits().Trigger). + WithField("await", call.GetTraits().Await). + Infof("executing testplugin.Test call: %s", message) + + rn := varStack["run_number"] + var ( + runNumber64 int64 + err error + ) + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + runNumber64 = 0 + } + + timeout := callable.AcquireTimeout(TESTPLUGIN_GENERAL_OP_TIMEOUT, varStack, "Test", envId) + defer log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("rolepath", call.GetParentRolePath()). + WithField("trigger", call.GetTraits().Trigger). + WithField("await", call.GetTraits().Await). + WithField("runNumber", runNumber64). + Infof("executed testplugin.Test call in %s", timeout) + + time.Sleep(timeout) + if doFail { + call.VarStack["__call_error"] = "error triggered in testplugin.Test call" + } + + return + } return } From f26d477dbdf6aeeaff30a6aa0e3d5db0aaedd094 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 10:01:31 +0100 Subject: [PATCH 1121/2352] [core] Fix handling of await and failures --- core/environment/environment.go | 77 ++++++++++++++++++--------------- 1 file changed, 43 insertions(+), 34 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index ff2a66faa..03c8b38bd 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,12 +29,13 @@ package environment import ( "errors" "fmt" - "github.com/AliceO2Group/Control/apricot" "strconv" "strings" "sync" "time" + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" @@ -251,10 +252,11 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // FOR EACH weight within the current state machine trigger moment // 4 phases: start calls, await calls, execute task hooks, error handling for _, weight := range allWeights { - hooksForWeight, ok := hooksMapForTrigger[weight] - if ok { - // PHASE 1: start asynchronously any call hooks and add them to the pending await map + hooksForWeight, thereAreHooksToStartForTheCurrentTriggerAndWeight := hooksMapForTrigger[weight] + + // PHASE 1: start asynchronously any call hooks and add them to the pending await map + if thereAreHooksToStartForTheCurrentTriggerAndWeight { // Hooks can be call hooks or task hooks, we do the calls first callsToStart := hooksForWeight.FilterCalls() if len(callsToStart) != 0 { @@ -277,45 +279,49 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err env.callsPendingAwait[awaitName][awaitWeight] = append( env.callsPendingAwait[awaitName][awaitWeight], call) } - callsToStart.StartAll() // returns immediately (async) + callsToStart.StartAll() // returns immediately (async) } + } - // PHASE 2: collect any calls awaiting termination - - // We take care of any pending hooks whose await expression corresponds to the current trigger, - // including any calls that have just been started (for which trigger == call.Trigger == call.Await). - callErrors := make(map[*callable.Call]error) - if _, ok := env.callsPendingAwait[trigger]; ok { - pendingCalls, ok := env.callsPendingAwait[trigger][weight] - if ok && len(pendingCalls) != 0 { // meaning there are hook calls to take care of - // AwaitAll blocks with no global timeout - it is up to the specific called function to implement - // a timeout internally. - // The Call instance pushes to the call's varStack some special values including the timeout - // (provided by the workflow template). At that point the integration plugin must acquire the - // timeout value and use the Context mechanism or some other approach to ensure the timeouts are - // respected. - - callErrors = pendingCalls.AwaitAll() - } + // PHASE 2: collect any calls awaiting termination + + // We take care of any pending hooks whose await expression corresponds to the current trigger, + // including any calls that have just been started (for which trigger == call.Trigger == call.Await). + callErrors := make(map[*callable.Call]error) + if _, ok := env.callsPendingAwait[trigger]; ok { + pendingCalls, ok := env.callsPendingAwait[trigger][weight] + if ok && len(pendingCalls) != 0 { // meaning there are hook calls to take care of + // AwaitAll blocks with no global timeout - it is up to the specific called function to implement + // a timeout internally. + // The Call instance pushes to the call's varStack some special values including the timeout + // (provided by the workflow template). At that point the integration plugin must acquire the + // timeout value and use the Context mechanism or some other approach to ensure the timeouts are + // respected. + + callErrors = pendingCalls.AwaitAll() } + } - // PHASE 3: start and finish any task hooks (synchronous!) + // PHASE 3: start and finish any task hooks (synchronous!) + + taskErrors := make(map[*task.Task]error) + if thereAreHooksToStartForTheCurrentTriggerAndWeight { // Tasks are handled separately for now, and they must have trigger==await hookTasksToTrigger := hooksForWeight.FilterTasks() - taskErrors := env.runTasksAsHooks(hookTasksToTrigger) // blocking call, timeouts in executor + taskErrors = env.runTasksAsHooks(hookTasksToTrigger) // blocking call, timeouts in executor + } - // PHASE 4: collect any errors + // PHASE 4: collect any errors - // We merge hook call errors and hook task errors into a single map for - // critical trait processing - for hook, err := range callErrors { - allErrors[hook] = err - } - for hook, err := range taskErrors { - allErrors[hook] = err - } - } //validity of hooksForWeight + // We merge hook call errors and hook task errors into a single map for + // critical trait processing + for hook, err := range callErrors { + allErrors[hook] = err + } + for hook, err := range taskErrors { + allErrors[hook] = err + } } for hook, err := range allErrors { @@ -327,6 +333,9 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err if hook.GetTraits().Critical { log.Errorf("critical hook failed: %s", err) criticalFailures = append(criticalFailures, err) + } else { + log.WithField("level", infologger.IL_Devel). + Debugf("non-critical hook failed: %s", err) } } From 17e5b462c3591bc74365b35f54e9d4a3e0aed94c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 10:02:18 +0100 Subject: [PATCH 1122/2352] [core] Ensure call failures are propagated correctly --- core/workflow/callable/call.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 7cc6e7c1b..6fb331ddd 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -25,6 +25,7 @@ package callable import ( + "errors" "fmt" "sort" "strconv" @@ -221,6 +222,12 @@ func (c *Call) Call() error { if len(returnVar) > 0 { c.parentRole.SetRuntimeVar(returnVar, output) } + + // if __call_error was written into the VarStack we treat it as an error exit from the call + if errMsg, ok := c.VarStack["__call_error"]; ok && len(errMsg) > 0 { + return errors.New(errMsg) + } + return nil } @@ -236,6 +243,7 @@ func (c *Call) Start() { } func (c *Call) Await() error { + log.Trace("awaiting " + c.Func + " in trigger phase " + c.Traits.Await) return <-c.await } From 80488a5bbedec4bc5151fec8dd717cc43609769e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 12:35:05 +0100 Subject: [PATCH 1123/2352] [core] Move to global ERROR state if critical hook fails --- core/server.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/server.go b/core/server.go index 74351a3f5..3eb8d9d2e 100644 --- a/core/server.go +++ b/core/server.go @@ -360,6 +360,10 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir err = env.TryTransition(trans) + if err != nil { + env.Sm.SetState("ERROR") + } + reply := &pb.ControlEnvironmentReply{ Id: env.Id().String(), State: env.CurrentState(), From b6478c8dff922fa48dee605a55eeeece0d2050e2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 12:48:23 +0100 Subject: [PATCH 1124/2352] [core] Improve error condition reporting --- core/environment/environment.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 03c8b38bd..8b99dfcc5 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -331,16 +331,19 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // If the hook call or task is critical: true if hook.GetTraits().Critical { - log.Errorf("critical hook failed: %s", err) + log.WithField("partition", env.Id().String()). + Logf(logrus.FatalLevel, "critical hook failed: %s", err) // Must use Logf(FatalLevel) instead of + // Fatalf because the latter calls Exit criticalFailures = append(criticalFailures, err) } else { log.WithField("level", infologger.IL_Devel). + WithField("partition", env.Id().String()). Debugf("non-critical hook failed: %s", err) } } if len(criticalFailures) != 0 { - return fmt.Errorf("one or more critical hooks failed") + return fmt.Errorf("%d critical hooks failed at trigger %s", len(criticalFailures), trigger) } return nil } From 4dbd677c8010275cf75323ff15e2d6cc67d2e859 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Feb 2022 12:56:19 +0100 Subject: [PATCH 1125/2352] [build] Bump to v0.33.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f4f82b27c..ace88b5f8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 32 +VERSION_MINOR := 33 VERSION_PATCH := 0 From 090a3e33b1c85306844c4a2108e4f2734a95568d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 28 Feb 2022 16:39:03 +0100 Subject: [PATCH 1126/2352] [core] Add support for ODC call error status --- core/integration/odc/plugin.go | 38 ++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 9 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 4f70eb9ca..74c4af55d 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -145,7 +145,7 @@ func (p *Plugin) Init(_ string) error { func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + log.Error("ObjectStack cannot acquire environment ID") return } @@ -566,7 +566,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + log.Error("CallStack cannot acquire environment ID") return } @@ -582,9 +582,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { + msg := "cannot acquire PDP workflow configuration mode" log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire PDP workflow configuration mode") + Error(msg) + call.VarStack["__call_error"] = msg return } switch pdpConfigOption { @@ -592,44 +594,54 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case "Repository path": script, ok = varStack["odc_script"] if !ok { + msg := "cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + + "output is written to odc_script" log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + - "output is written to odc_script") + Error(msg) + call.VarStack["__call_error"] = msg return } case "Manual XML": topology, ok = varStack["odc_topology"] if !ok { + msg := "cannot acquire ODC topology" log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire ODC topology") + Error(msg) + call.VarStack["__call_error"] = msg return } isManualXml = true default: + msg := "cannot acquire valid PDP workflow configuration mode value" log.WithField("partition", envId). WithField("call", "Configure"). WithField("value", pdpConfigOption). - Error("cannot acquire valid PDP workflow configuration mode value") + Error(msg) + call.VarStack["__call_error"] = msg return } plugin, ok = varStack["odc_plugin"] if !ok { + msg := "cannot acquire ODC RMS plugin declaration" log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire ODC RMS plugin declaration") + Error(msg) + call.VarStack["__call_error"] = msg return } resources, ok = varStack["odc_resources"] if !ok { + msg := "cannot acquire ODC resources declaration" log.WithField("partition", envId). WithField("call", "Configure"). - Error("cannot acquire ODC resources declaration") + Error(msg) + call.VarStack["__call_error"] = msg return } @@ -661,7 +673,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error("EPN Configure call failed") + call.VarStack["__call_error"] = err.Error() } + return } stack["Start"] = func() (out string) { // must formally return string even when we return nothing @@ -704,6 +718,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Start"). Error("EPN Start call failed") + call.VarStack["__call_error"] = err.Error() } return } @@ -743,6 +758,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Stop"). Error("EPN Stop call failed") + call.VarStack["__call_error"] = err.Error() } return } @@ -763,6 +779,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Reset"). Error("EPN Reset call failed") + call.VarStack["__call_error"] = err.Error() } return } @@ -784,6 +801,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "EnsureCleanupLegacy"). Error("EPN Cleanup sequence failed") + call.VarStack["__call_error"] = err.Error() } return } @@ -805,6 +823,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "EnsureCleanup"). Error("EPN Cleanup sequence failed") + call.VarStack["__call_error"] = err.Error() } return } @@ -826,6 +845,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "PreDeploymentCleanup"). Error("EPN PreDeploymentCleanup sequence failed") + call.VarStack["__call_error"] = err.Error() } return } From 9c477b7992d8684d511c958e5037219fa034a794 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 28 Feb 2022 16:39:30 +0100 Subject: [PATCH 1127/2352] [core] Harmonize environment_id setting between regular and AUTO env --- core/environment/manager.go | 31 ++++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 02eae8987..ab9e3a651 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -145,15 +145,16 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] newEnvId := uid.NilID() if err == nil && env != nil { newEnvId = env.Id() + } else { + log.WithError(err).Logf(logrus.FatalLevel, "environment creation failed") + return newEnvId, err } + log.WithFields(logrus.Fields{ "workflow": workflowPath, "partition": newEnvId.String(), }).Info("creating new environment") - if err != nil { - return uid.NilID(), err - } env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) } @@ -544,21 +545,37 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str newEnvId := uid.NilID() if err == nil && env != nil { newEnvId = env.Id() + } else { + log.WithError(err).Logf(logrus.FatalLevel, "environment creation failed") + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: newEnvId.String(), Error: err}) + return } + log.WithFields(logrus.Fields{ "workflow": workflowPath, "partition": newEnvId.String(), }).Info("creating new automatic environment") - if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - return - } env.addSubscription(sub) defer env.closeStream() + env.hookHandlerF = func(hooks task.Tasks) error { return envs.taskman.TriggerHooks(hooks) } + + // Ensure the environment_id is available to all + env.UserVars.Set("environment_id", env.id.String()) + + // in case of err==nil, env will be false unless user + // set it to True which will be overwriten in server.go + env.Public, err = parseWorkflowPublicInfo(workflowPath) + if err != nil { + log.WithField("public info", env.Public). + WithField("environment", env.Id().String()). + WithError(err). + Warn("parse workflow public info failed.") + } + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) From bef40969ba69c16ee8f5d4fdb24402ea85626fb5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 28 Feb 2022 18:19:28 +0100 Subject: [PATCH 1128/2352] [build] Bump to v0.33.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ace88b5f8..63988a82a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 33 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 3c8ee96b2b9cda4b2a695f42fcf1f30415509eb3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 1 Mar 2022 17:52:48 +0100 Subject: [PATCH 1129/2352] [core] Improve error message for failed hooks + output of ODC calls --- core/environment/environment.go | 14 ++++++- core/integration/odc/plugin.go | 74 ++++++++++++++++----------------- 2 files changed, 50 insertions(+), 38 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 8b99dfcc5..e72826e76 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -343,7 +343,19 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err } if len(criticalFailures) != 0 { - return fmt.Errorf("%d critical hooks failed at trigger %s", len(criticalFailures), trigger) + if len(criticalFailures) > 3 { + return fmt.Errorf("%d critical hooks failed at trigger %s (see InfoLogger for details)", len(criticalFailures), trigger) + } else if len(criticalFailures) > 1 { // 2-3 failed hooks + consolidated := make([]string, len(criticalFailures)) + for i, cf := range criticalFailures { + consolidated[i] = cf.Error() + } + consolidatedS := strings.Join(consolidated, "; ") + + return fmt.Errorf("%d critical hooks failed at trigger %s: %s", len(criticalFailures), trigger, consolidatedS) + } else { // 1 hook failed + return fmt.Errorf("critical hook failed at trigger %s: %s", trigger, criticalFailures[0]) + } } return nil } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 74c4af55d..1c34b74dd 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -579,6 +579,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ) ok := false isManualXml := false + callFailedStr := "EPN Configure call failed" pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { @@ -586,7 +587,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } switch pdpConfigOption { @@ -599,7 +601,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } @@ -610,7 +613,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } isManualXml = true @@ -621,7 +625,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Configure"). WithField("value", pdpConfigOption). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } @@ -631,7 +636,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } @@ -641,7 +647,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). Error(msg) - call.VarStack["__call_error"] = msg + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr return } @@ -670,10 +677,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "Configure"). WithError(err).Error("ODC error") - log.WithField("partition", envId). - WithField("call", "Configure"). - Error("EPN Configure call failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return @@ -691,6 +696,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { runNumberu64 uint64 err error ) + callFailedStr := "EPN Start call failed" runNumberu64, err = strconv.ParseUint(rn, 10, 32) if err != nil { @@ -715,10 +721,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "Start"). Error("ODC error") - log.WithField("partition", envId). - WithField("call", "Start"). - Error("EPN Start call failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -735,6 +739,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { runNumberu64 uint64 err error ) + callFailedStr := "EPN Stop call failed" runNumberu64, err = strconv.ParseUint(rn, 10, 32) if err != nil { @@ -755,10 +760,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "Stop"). Error("ODC error") - log.WithField("partition", envId). - WithField("call", "Stop"). - Error("EPN Stop call failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -767,6 +770,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + callFailedStr := "EPN Reset call failed" + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleReset(ctx, p.odcClient, nil, envId) @@ -776,10 +781,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "Reset"). Error("ODC error") - log.WithField("partition", envId). - WithField("call", "Reset"). - Error("EPN Reset call failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -788,6 +791,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanupLegacy", envId) + callFailedStr := "EPN EnsureCleanupLegacy call failed" + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleCleanupLegacy(ctx, p.odcClient, nil, envId) @@ -796,12 +801,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "EnsureCleanupLegacy"). - Error("ODC error") - log.WithField("partition", envId). - WithField("call", "EnsureCleanupLegacy"). - Error("EPN Cleanup sequence failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -810,6 +812,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + callFailedStr := "EPN EnsureCleanup call failed" + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleCleanup(ctx, p.odcClient, nil, envId) @@ -818,12 +822,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "EnsureCleanup"). - Error("ODC error") - log.WithField("partition", envId). - WithField("call", "EnsureCleanup"). - Error("EPN Cleanup sequence failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -832,6 +833,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "PreDeploymentCleanup", envId) + callFailedStr := "EPN PreDeploymentCleanup call failed" + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleCleanup(ctx, p.odcClient, nil, "") @@ -840,12 +843,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "PreDeploymentCleanup"). - Error("ODC error") - log.WithField("partition", envId). - WithField("call", "PreDeploymentCleanup"). - Error("EPN PreDeploymentCleanup sequence failed") - call.VarStack["__call_error"] = err.Error() + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } From 90d871abf78f3bc12ecbb976edd60c83b064173f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 1 Mar 2022 16:25:52 +0100 Subject: [PATCH 1130/2352] [core] Indicate run type in GRP objects --- core/integration/ccdb/plugin.go | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index e77cc31f2..b280322ac 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -191,17 +191,23 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin // o2-ecs-grp-create -h //Create GRP-ECS object and upload to the CCDB //Usage: - // o2-ecs-grp-create // -h [ --help ] Print this help message // -p [ --period ] arg data taking period // -r [ --run ] arg run number + // -t [ --run-type ] arg (=0) run type // -n [ --hbf-per-tf ] arg (=128) number of HBFs per TF // -d [ --detectors ] arg (=all) comma separated list of detectors - // -c [ --continuous ] arg (=ITS,TPC,TOF,MFT,MCH,MID,ZDC,FT0,FV0,FDD,CTP) comma separated list of detectors in continuous readout mode - // -t [ --triggering ] arg (=FT0,FV0) comma separated list of detectors providing a trigger + // -c [ --continuous ] arg (=ITS,TPC,TOF,MFT,MCH,MID,ZDC,FT0,FV0,FDD,CTP) + // comma separated list of detectors in + // continuous readout mode + // -g [ --triggering ] arg (=FT0,FV0) comma separated list of detectors + // providing a trigger // -s [ --start-time ] arg (=0) run start time in ms, now() if 0 - // -e [ --end-time ] arg (=0) run end time in ms, start-time+3days is used if 0 - // --ccdb-server arg (=http://alice-ccdb.cern.ch) CCDB server for upload, local file if empty + // -e [ --end-time ] arg (=0) run end time in ms, start-time+3days is + // used if 0 + // --ccdb-server arg (=http://alice-ccdb.cern.ch) + // CCDB server for upload, local file if + // empty cmd = "source /etc/profile.d/o2.sh && o2-ecs-grp-create" if len(grp.lhcPeriod) == 0 { @@ -215,10 +221,9 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin if grp.hbfPerTf != 0 { cmd += " -n " + strconv.FormatUint(uint64(grp.hbfPerTf), 10) } - // TODO enable once PR#8082 to O2 is at P2 - //if grp.runType != runtype.NONE { - // cmd += " --run-type " + grp.runType.String() - //} + if grp.runType != runtype.NONE { + cmd += " -t " + strconv.Itoa(int(grp.runType)) + } if len(grp.detectors) != 0 { cmd += " -d \"" + strings.Join(grp.detectors, ",") + "\"" } @@ -226,8 +231,7 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin cmd += " -c \"" + strings.Join(grp.continuousReadoutDetectors, ",") + "\"" } if len(grp.triggeringDetectors) != 0 { - // keeping the full argument until the conflict between '-t's of triggering and run-type is resolved - cmd += " --triggering \"" + strings.Join(grp.triggeringDetectors, ",") + "\"" + cmd += " -g \"" + strings.Join(grp.triggeringDetectors, ",") + "\"" } if len(grp.startTimeMs) > 0 { cmd += " -s " + grp.startTimeMs From d4076225e9a17931249bdb932732b46e85491fff Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Mar 2022 18:04:02 +0100 Subject: [PATCH 1131/2352] [core] Ensure the soft open file limit is raised 1024->[8192-65536] --- core/core.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/core/core.go b/core/core.go index 4df8d89b5..26e9d55d7 100644 --- a/core/core.go +++ b/core/core.go @@ -28,6 +28,7 @@ import ( "context" "fmt" "net" + "syscall" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/the" @@ -41,6 +42,9 @@ import ( var log = logger.New(logrus.StandardLogger(),"core") +const fileLimitWant = 65536 +const fileLimitMin = 8192 + // Run is the entry point for this scheduler. // TODO: refactor Config to reflect our specific requirements func Run() error { @@ -71,6 +75,12 @@ func Run() error { // Set up channel to receive Unix Signals. signals(state) + // Raise soft file limit + err = setLimits() + if err != nil { + return err + } + // Start the Repo Manager instance log.WithField("level", infologger.IL_Support).Infof("Starting the Control Workflows repo manager") _ = the.RepoManager() @@ -99,4 +109,37 @@ func Run() error { return err } +func setLimits() error { + var rLimit syscall.Rlimit + + err := syscall.Getrlimit(syscall.RLIMIT_NOFILE, &rLimit) + if err != nil { + return err + } + if rLimit.Cur > fileLimitWant { + return nil + } + if rLimit.Max < fileLimitMin { + err = fmt.Errorf("need at least %v file descriptors", + fileLimitMin) + return err + } + if rLimit.Max < fileLimitWant { + rLimit.Cur = rLimit.Max + } else { + rLimit.Cur = fileLimitWant + } + err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) + if err != nil { + // try min value + rLimit.Cur = fileLimitMin + err = syscall.Setrlimit(syscall.RLIMIT_NOFILE, &rLimit) + if err != nil { + return err + } + } + + return nil +} + // end Run From 001a1fb7342fb6c8169de581e4dcbb1c9f7559d1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Mar 2022 10:31:21 +0100 Subject: [PATCH 1132/2352] [core] Split ODC Init/Term out of Configure/Reset + debug output --- core/integration/odc/handlers.go | 210 +++++++++++++++++++++---- core/integration/odc/plugin.go | 257 +++++++++++++++++++++++++++---- 2 files changed, 406 insertions(+), 61 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 00841ce7e..bd4166bda 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -82,11 +82,11 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, "odcState": rep.Reply.State, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.GetState") return odcutils.StateForOdcState(newState), err } @@ -150,10 +150,10 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string "odcMsg": setPropertiesResponse.Msg, "odcStatus": setPropertiesResponse.Status.String(), "odcExectime": setPropertiesResponse.Exectime, - "odcRunid": setPropertiesResponse.Partitionid, + "partition": setPropertiesResponse.Partitionid, "odcSessionid": setPropertiesResponse.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.SetProperties") // The actual START operation starts here rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) @@ -177,10 +177,10 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Start") return err } @@ -223,13 +223,33 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Stop") return err } + +func handlePartitionTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + err := doTerminate(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + + err = doShutdown(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + return nil +} + + func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { @@ -241,6 +261,21 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return printGrpcError(err) } + return nil +} + + +func handleResetLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + err := doReset(ctx, odcClient, arguments, envId) + if err != nil { + return printGrpcError(err) + } + err = doTerminate(ctx, odcClient, arguments, envId) if err != nil { return printGrpcError(err) @@ -321,7 +356,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri "odcStatus": rep.GetStatus().String(), "odcExectime": rep.GetExectime(), }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.GetStatus") partitionIdsKnownToOdc := make([]string, len(rep.GetPartitions())) for i, v := range rep.GetPartitions() { @@ -416,10 +451,10 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Reset") return err } @@ -456,10 +491,10 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), "odcExectime": rep.Reply.Exectime, - "odcRunid": rep.Reply.Partitionid, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Terminate") return err } @@ -491,10 +526,10 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] "odcMsg": shutdownResponse.Msg, "odcStatus": shutdownResponse.Status.String(), "odcExectime": shutdownResponse.Exectime, - "odcRunid": shutdownResponse.Partitionid, + "partition": shutdownResponse.Partitionid, "odcSessionid": shutdownResponse.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Shutdown") return err } @@ -563,15 +598,15 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu "odcMsg": runResponse.Msg, "odcStatus": runResponse.Status.String(), "odcExectime": runResponse.Exectime, - "odcRunid": runResponse.Partitionid, + "partition": runResponse.Partitionid, "odcSessionid": runResponse.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Run") return err } -func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, envId string) error { +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -597,6 +632,112 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st i++ } + log.WithField("partition", envId).Debugf("preparing call odc.SetProperties") + + var setPropertiesResponse *odcpb.GeneralReply + setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties with ERROR") + return printGrpcError(err) + } + + + if setPropertiesResponse == nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") + + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR in response payload") + + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, bad status in response payload") + + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + + log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") + + log.WithFields(logrus.Fields{ + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "partition": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). + Debug("call to ODC complete: odc.SetProperties") + + + // CONFIGURE + configureRequest := &odcpb.ConfigureRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + }, + } + + var configureResponse *odcpb.StateReply + configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) + if err != nil { + return printGrpcError(err) + } + + if configureResponse == nil || configureResponse.Reply == nil { + // We got a nil response with nil error, this should never happen + return errors.New("nil response error") + } + + if odcErr := configureResponse.Reply.GetError(); odcErr != nil { + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + } + if replyStatus := configureResponse.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + return fmt.Errorf("status %s from ODC", replyStatus.String()) + } + log.WithFields(logrus.Fields{ + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "partition": configureResponse.Reply.Partitionid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). + Debug("call to ODC complete: odc.Configure") + return err +} + + +func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, envId string) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + var err error = nil + + // SetProperties before CONFIGURE + setPropertiesRequest := &odcpb.SetPropertiesRequest{ + Partitionid: envId, + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + } + + // Extract relevant parameters from Arguments payload + // and build payload for SetProperty+Configure + i := 0 + for k, v := range arguments { + setPropertiesRequest.Properties[i] = &odcpb.Property{ + Key: k, + Value: v, + } + i++ + } + + log.WithField("partition", envId).Debugf("preparing call odc.Run") + err = handleRun(ctx, odcClient, isManualXml, map[string]string{ "topology": topology, "script": script, @@ -605,35 +746,50 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st }, envId) if err != nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.Run with ERROR") return printGrpcError(err) } + log.WithField("partition", envId).Debugf("finished call odc.Run with SUCCESS") + + log.WithField("partition", envId).Debugf("preparing call odc.SetProperties") var setPropertiesResponse *odcpb.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties with ERROR") return printGrpcError(err) } + if setPropertiesResponse == nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") + // We got a nil response with nil error, this should never happen return errors.New("nil response error") } if odcErr := setPropertiesResponse.GetError(); odcErr != nil { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR in response payload") + return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) } if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, bad status in response payload") + return fmt.Errorf("status %s from ODC", replyStatus.String()) } + + log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") + log.WithFields(logrus.Fields{ - "odcMsg": setPropertiesResponse.Msg, - "odcStatus": setPropertiesResponse.Status.String(), - "odcExectime": setPropertiesResponse.Exectime, - "odcRunid": setPropertiesResponse.Partitionid, - "odcSessionid": setPropertiesResponse.Sessionid, - }). - Debug("call to ODC complete") + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "partition": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). + Debug("call to ODC complete: odc.SetProperties") // CONFIGURE @@ -666,10 +822,10 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st "odcMsg": configureResponse.Reply.Msg, "odcStatus": configureResponse.Reply.Status.String(), "odcExectime": configureResponse.Reply.Exectime, - "odcRunid": configureResponse.Reply.Partitionid, + "partition": configureResponse.Reply.Partitionid, "odcSessionid": configureResponse.Reply.Sessionid, }). - Debug("call to ODC complete") + Debug("call to ODC complete: odc.Configure") return err } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 1c34b74dd..1c50e7707 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -50,9 +50,11 @@ const( ODC_DIAL_TIMEOUT = 2 * time.Second ODC_GENERAL_OP_TIMEOUT = 5 * time.Second ODC_CONFIGURE_TIMEOUT = 60 * time.Second + ODC_PARTITIONINITIALIZE_TIMEOUT = 60 * time.Second ODC_START_TIMEOUT = 15 * time.Second ODC_STOP_TIMEOUT = 15 * time.Second ODC_RESET_TIMEOUT = 30 * time.Second + ODC_PARTITIONTERMINATE_TIMEOUT = 30 * time.Second ) @@ -571,21 +573,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) - stack["Configure"] = func() (out string) { - // ODC Run + SetProperties + Configure + stack["PartitionInitialize"] = func() (out string) { + // ODC Run + var err error = nil + + log.WithField("partition", envId).Debugf("preparing call odc.PartitionInitialize") + var ( pdpConfigOption, script, topology, plugin, resources string ) ok := false isManualXml := false - callFailedStr := "EPN Configure call failed" + callFailedStr := "EPN PartitionInitialize call failed" pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { msg := "cannot acquire PDP workflow configuration mode" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). Error(msg) call.VarStack["__call_error_reason"] = msg call.VarStack["__call_error"] = callFailedStr @@ -599,7 +605,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { msg := "cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + "output is written to odc_script" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). Error(msg) call.VarStack["__call_error_reason"] = msg call.VarStack["__call_error"] = callFailedStr @@ -611,7 +617,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { msg := "cannot acquire ODC topology" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). Error(msg) call.VarStack["__call_error_reason"] = msg call.VarStack["__call_error"] = callFailedStr @@ -622,7 +628,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { default: msg := "cannot acquire valid PDP workflow configuration mode value" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). WithField("value", pdpConfigOption). Error(msg) call.VarStack["__call_error_reason"] = msg @@ -634,7 +640,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { msg := "cannot acquire ODC RMS plugin declaration" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). Error(msg) call.VarStack["__call_error_reason"] = msg call.VarStack["__call_error"] = callFailedStr @@ -645,13 +651,41 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { msg := "cannot acquire ODC resources declaration" log.WithField("partition", envId). - WithField("call", "Configure"). + WithField("call", "PartitionInitialize"). Error(msg) call.VarStack["__call_error_reason"] = msg call.VarStack["__call_error"] = callFailedStr return } + timeout := callable.AcquireTimeout(ODC_PARTITIONINITIALIZE_TIMEOUT, varStack, "PartitionInitialize", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err = handleRun(ctx, p.odcClient, isManualXml, map[string]string{ + "topology": topology, + "script": script, + "plugin": plugin, + "resources": resources, + }, + envId) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + log.WithField("partition", envId).Debugf("finished call odc.PartitionInitialize with SUCCESS") + return + } + stack["Configure"] = func() (out string) { + // ODC SetProperties + Configure + + callFailedStr := "EPN Configure call failed" + timeout := callable.AcquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) arguments := make(map[string]string) @@ -671,7 +705,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleConfigure(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, envId) + err := handleConfigure(ctx, p.odcClient, arguments, envId) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -683,7 +717,50 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + stack["Reset"] = func() (out string) { + // ODC Reset + + timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + + callFailedStr := "EPN Reset call failed" + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleReset(ctx, p.odcClient, nil, envId) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "Reset"). + Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + return + } + stack["PartitionTerminate"] = func() (out string) { + // ODC Terminate + Shutdown + + timeout := callable.AcquireTimeout(ODC_PARTITIONTERMINATE_TIMEOUT, varStack, "PartitionTerminate", envId) + + callFailedStr := "EPN PartitionTerminate call failed" + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handlePartitionTerminate(ctx, p.odcClient, nil, envId) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PartitionTerminate"). + Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + return + } stack["Start"] = func() (out string) { // must formally return string even when we return nothing + // ODC SetProperties + Start rn, ok := varStack["run_number"] @@ -765,84 +842,196 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - stack["Reset"] = func() (out string) { - // ODC Reset + Terminate + Shutdown + stack["EnsureCleanup"] = func() (out string) { + // ODC Shutdown for current env + all orphans - timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) - callFailedStr := "EPN Reset call failed" + callFailedStr := "EPN EnsureCleanup call failed" ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleReset(ctx, p.odcClient, nil, envId) + err := handleCleanup(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("call", "Reset"). + WithField("call", "EnsureCleanup"). Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr } return } - stack["EnsureCleanupLegacy"] = func() (out string) { - // ODC Reset + Terminate + Shutdown for current env + stack["PreDeploymentCleanup"] = func() (out string) { + // ODC Shutdown for all orphans - timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanupLegacy", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "PreDeploymentCleanup", envId) - callFailedStr := "EPN EnsureCleanupLegacy call failed" + callFailedStr := "EPN PreDeploymentCleanup call failed" ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanupLegacy(ctx, p.odcClient, nil, envId) + err := handleCleanup(ctx, p.odcClient, nil, "") if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("call", "EnsureCleanupLegacy"). + WithField("call", "PreDeploymentCleanup"). Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr } return } - stack["EnsureCleanup"] = func() (out string) { - // ODC Shutdown for current env + all orphans + stack["ConfigureLegacy"] = func() (out string) { + // ODC Run + SetProperties + Configure - timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanup", envId) + var ( + pdpConfigOption, script, topology, plugin, resources string + ) + ok := false + isManualXml := false + callFailedStr := "EPN ConfigureLegacy call failed" - callFailedStr := "EPN EnsureCleanup call failed" + pdpConfigOption, ok = varStack["pdp_config_option"] + if !ok { + msg := "cannot acquire PDP workflow configuration mode" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + switch pdpConfigOption { + case "Repository hash": fallthrough + case "Repository path": + script, ok = varStack["odc_script"] + if !ok { + msg := "cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + + "output is written to odc_script" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + + case "Manual XML": + topology, ok = varStack["odc_topology"] + if !ok { + msg := "cannot acquire ODC topology" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + isManualXml = true + + default: + msg := "cannot acquire valid PDP workflow configuration mode value" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + WithField("value", pdpConfigOption). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + + plugin, ok = varStack["odc_plugin"] + if !ok { + msg := "cannot acquire ODC RMS plugin declaration" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + + resources, ok = varStack["odc_resources"] + if !ok { + msg := "cannot acquire ODC resources declaration" + log.WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + timeout := callable.AcquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) + + arguments := make(map[string]string) + arguments["environment_id"] = envId + + // FIXME: this only copies over vars prefixed with "odc_" + // Figure out a better way! + for k, v := range varStack { + if strings.HasPrefix(k, "odc_") && + k != "odc_enabled" && + k != "odc_resources" && + k != "odc_plugin" && + k != "odc_script" && + k != "odc_topology" { + arguments[strings.TrimPrefix(k, "odc_")] = v + } + } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, envId) + err := handleConfigureLegacy(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, envId) + if err != nil { + log.WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "ConfigureLegacy"). + WithError(err).Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + + return + } + stack["ResetLegacy"] = func() (out string) { + // ODC Reset + Terminate + Shutdown + + timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) + + callFailedStr := "EPN ResetLegacy call failed" + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + err := handleResetLegacy(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("call", "EnsureCleanup"). + WithField("call", "ResetLegacy"). Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr } return } - stack["PreDeploymentCleanup"] = func() (out string) { - // ODC Shutdown for all orphans + stack["EnsureCleanupLegacy"] = func() (out string) { + // ODC Reset + Terminate + Shutdown for current env - timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "PreDeploymentCleanup", envId) + timeout := callable.AcquireTimeout(ODC_GENERAL_OP_TIMEOUT, varStack, "EnsureCleanupLegacy", envId) - callFailedStr := "EPN PreDeploymentCleanup call failed" + callFailedStr := "EPN EnsureCleanupLegacy call failed" ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, "") + err := handleCleanupLegacy(ctx, p.odcClient, nil, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("call", "PreDeploymentCleanup"). + WithField("call", "EnsureCleanupLegacy"). Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr From 12a8adb66dcbefd7a252eafa54f6d849c2ed422c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Mar 2022 11:00:24 +0100 Subject: [PATCH 1133/2352] [build] Bump to v0.34.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 63988a82a..e4ef1455e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 33 -VERSION_PATCH := 1 +VERSION_MINOR := 34 +VERSION_PATCH := 0 From 1dae481878a59cfad5a94643b030ea054e5c3ba5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Mar 2022 17:12:04 +0100 Subject: [PATCH 1134/2352] [core] Minor logic fix in ODC integration (behaviour unchanged) --- core/integration/odc/plugin.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 1c50e7707..5a74c7eb5 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -662,6 +662,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + err = handleRun(ctx, p.odcClient, isManualXml, map[string]string{ "topology": topology, "script": script, @@ -677,6 +678,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } log.WithField("partition", envId).Debugf("finished call odc.PartitionInitialize with SUCCESS") return From 4c1dbf33b796301896101a123277a2e34444c80f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Mar 2022 17:12:43 +0100 Subject: [PATCH 1135/2352] [core] Fix END_OF_STREAM log message --- core/environment/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index ab9e3a651..c612044a5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -507,7 +507,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { taskId := evt.GetOrigin().TaskId t := envs.taskman.GetTask(taskId.Value) if t == nil { - log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent END_OF_STREAM") return } env, err := envs.environment(t.GetEnvironmentId()) From 06d38e23215552a0a7a9d83cde14f61b0092f8a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Mar 2022 16:41:04 +0100 Subject: [PATCH 1136/2352] [core] Correct error reporting from TRG plugin --- core/integration/trg/plugin.go | 247 ++++++++++++++++++++++++++------- 1 file changed, 199 insertions(+), 48 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 0d8461790..2a7a0db94 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -168,8 +168,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { trgDetectorsParam = "" } + callFailedStr := "TRG RunLoad call failed" + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -179,6 +189,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("not a TRG Global Run, continuing with TRG Run Start") + return } @@ -188,19 +199,36 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Config: globalConfig, } if p.trgClient == nil { - log.WithError(fmt.Errorf("TRG plugin not initialized")). + err = fmt.Errorf("TRG plugin not initialized, RunLoad impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Load request") + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } + if p.trgClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("TRG client connection not available")). + err = fmt.Errorf("TRG client connection not available, RunLoad impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Load request") + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -208,22 +236,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Load request") + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } + if response != nil { if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - WithField("partition", envId). + err = fmt.Errorf("response code %d from TRG: %s", response.Rc, response.Msg) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("runNumber", runNumber64). - Error("Run Load failed") + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } } + // runLoad successful, we cache the run number for eventual cleanup p.pendingEORs[envId] = runNumber64 log.WithField("partition", envId). @@ -260,8 +304,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { trgDetectorsParam = "" } + callFailedStr := "TRG RunStart call failed" + detectors, err := p.parseDetectors(trgDetectorsParam) if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -278,19 +335,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if p.trgClient == nil { - log.WithError(fmt.Errorf("TRG plugin not initialized")). + err = fmt.Errorf("TRG plugin not initialized, RunStart impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Start request") + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.trgClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("TRG client connection not available")). + err = fmt.Errorf("TRG client connection not available, RunStart impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Start request") + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -299,19 +372,33 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.trgClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Start request") + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if response != nil { if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - WithField("partition", envId). + err = fmt.Errorf("response code %d from TRG: %s", response.Rc, response.Msg) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("runNumber", runNumber64). - Error("Run Start failed") + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } } @@ -347,20 +434,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detector: detectors, } + callFailedStr := "TRG RunStop call failed" + if p.trgClient == nil { - log.WithError(fmt.Errorf("TRG plugin not initialized")). + err = fmt.Errorf("TRG plugin not initialized, RunStop impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Stop request") + WithField("partition", envId). + WithField("call", "RunStop"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.trgClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("TRG client connection not available")). + err = fmt.Errorf("TRG client connection not available, RunStop impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Stop request") + WithField("partition", envId). + WithField("call", "RunStop"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -368,19 +473,33 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Stop request") + WithField("partition", envId). + WithField("call", "RunStop"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if response != nil { if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - WithField("partition", envId). + err = fmt.Errorf("response code %d from TRG: %s", response.Rc, response.Msg) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("runNumber", runNumber64). - Error("Run Stop failed") + WithField("partition", envId). + WithField("call", "RunStop"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } } @@ -416,20 +535,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detector: "", } + callFailedStr := "TRG RunUnload call failed" + if p.trgClient == nil { - log.WithError(fmt.Errorf("TRG plugin not initialized")). + err = fmt.Errorf("TRG plugin not initialized, RunUnload impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Unload request") + WithField("partition", envId). + WithField("call", "RunUnload"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.trgClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("TRG client connection not available")). + err = fmt.Errorf("TRG client connection not available, RunUnload impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Unload request") + WithField("partition", envId). + WithField("call", "RunUnload"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -437,19 +574,33 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform Run Unload request") + WithField("partition", envId). + WithField("call", "RunUnload"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if response != nil { if response.Rc != 0 { - log.WithField("response rc", response.Rc). - WithField("Message", response.Msg). - WithField("partition", envId). + err = fmt.Errorf("response code %d from TRG: %s", response.Rc, response.Msg) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("runNumber", runNumber64). - Error("Run Unload failed") + WithField("partition", envId). + WithField("call", "RunUnload"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } } From babff28b480cd1556222d72ccb7e521cdca88226 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Mar 2022 17:49:15 +0100 Subject: [PATCH 1137/2352] [core] Correct error reporting from DDsched plugin --- core/integration/ddsched/plugin.go | 299 ++++++++++++++++++++++------- 1 file changed, 230 insertions(+), 69 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index a9a5db44e..eee71c1aa 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -36,6 +36,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" @@ -170,8 +171,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). Debug("performing DD scheduler PartitionInitialize") + var err error + callFailedStr := "DDsched PartitionInitialize call failed" + parentRoleI := call.GetParentRole() parentRole, ok := parentRoleI.(workflow.Role) + if !ok { + err = errors.New("internal error: cannot acquire parent role") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } root := workflow.GetRoot(parentRole) p.stfbHostIdMap = make(map[string]string) @@ -224,24 +242,39 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { StfsHostIdMap: p.stfsHostIdMap, PartitionParams: partitionParams, } + if p.ddSchedClient == nil { - log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + err = fmt.Errorf("DD scheduler plugin not initialized, PartitionInitialize impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionInitialize") + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } + if p.ddSchedClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("DD scheduler client connection not available")). + err = fmt.Errorf("DD scheduler client connection not available, PartitionInitialize impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionInitialize") + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } var ( response *ddpb.PartitionResponse - err error ) timeout := callable.AcquireTimeout(DDSCHED_INITIALIZE_TIMEOUT, varStack, "Initialize", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -249,48 +282,73 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionInitialize(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionInitialize") + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING && response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURED { - log.WithError(fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String())). + err = fmt.Errorf("PartitionInitialize returned unexpected state %s (expected: PARTITION_CONFIGURING)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionInitialize") - return - } + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr - pollingSeconds, ok := varStack["dd_polling_timeout"] - pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT - if ok { - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout = time.Duration(pollingSecondsInt) * time.Second + return } PARTITION_STATE_POLLING: - for startPolling := time.Now(); ; { + for ; ctx.Err() == nil ; { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) + switch response.PartitionState { case ddpb.PartitionState_PARTITION_CONFIGURING: time.Sleep(100 * time.Millisecond) case ddpb.PartitionState_PARTITION_CONFIGURED: break PARTITION_STATE_POLLING default: - log.WithError(fmt.Errorf("PartitionInitialize landed on unexpected state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). + err = fmt.Errorf("PartitionInitialize landed on unexpected state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionInitialize") + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break PARTITION_STATE_POLLING } - if time.Since(startPolling) > pollingTimeout { - log.WithError(fmt.Errorf("PartitionInitialize timeout exceeded. Latest state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String())). + + if ctx.Err() != nil { + err = fmt.Errorf("PartitionInitialize timeout exceeded. Latest state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("timeout", pollingTimeout). - Error("failed to perform DD scheduler PartitionInitialize") + WithField("call", "PartitionInitialize"). + WithField("timeout", timeout). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break } } @@ -306,24 +364,42 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { PartitionId: envId, }, } + var err error + callFailedStr := "DDsched PartitionTerminate call failed" + if p.ddSchedClient == nil { - log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + err = fmt.Errorf("DD scheduler plugin not initialized, PartitionTerminate impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.ddSchedClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("DD scheduler client connection not available")). + err = fmt.Errorf("DD scheduler client connection not available, PartitionTerminate impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } var ( response *ddpb.PartitionResponse - err error ) timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -331,46 +407,73 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return } + if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { - log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + err = fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") - } + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr - pollingSeconds, ok := varStack["dd_polling_timeout"] - pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT - if ok { - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout = time.Duration(pollingSecondsInt) * time.Second + return } PARTITION_STATE_POLLING: - for startPolling := time.Now(); ; { + for ; ctx.Err() == nil ; { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) + switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: time.Sleep(100 * time.Millisecond) case ddpb.PartitionState_PARTITION_TERMINATED: break PARTITION_STATE_POLLING default: - log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + err = fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break PARTITION_STATE_POLLING } - if time.Since(startPolling) > pollingTimeout { - log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + if ctx.Err() != nil { + err = fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("timeout", pollingTimeout). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "PartitionTerminate"). + WithField("timeout", timeout). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break } } @@ -380,24 +483,42 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). Debug("performing DD scheduler session cleanup") + var err error + callFailedStr := "DDsched EnsureTermination call failed" + if p.ddSchedClient == nil { - log.WithError(fmt.Errorf("DD scheduler plugin not initialized")). + err = fmt.Errorf("DD scheduler plugin not initialized, EnsureTermination impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler session cleanup") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.ddSchedClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("DD scheduler client connection not available")). + err = fmt.Errorf("DD scheduler client connection not available, EnsureTermination impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler session cleanup") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } var ( response *ddpb.PartitionResponse - err error ) infoReq := ddpb.PartitionInfo{ @@ -410,17 +531,31 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionStatus(ctx, &infoReq, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler session cleanup") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if response == nil { - log.WithError(errors.New("nil response")). + err = errors.New("nil response") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler session cleanup") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -457,27 +592,37 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return } if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATED { - log.WithError(fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String())). + err = fmt.Errorf("PartitionTerminate returned unexpected state %s (expected: PARTITION_TERMINATING)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") - } + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr - pollingSeconds, ok := varStack["dd_polling_timeout"] - pollingTimeout := DDSCHED_DEFAULT_POLLING_TIMEOUT - if ok { - pollingSecondsInt, _ := strconv.Atoi(pollingSeconds) - pollingTimeout = time.Duration(pollingSecondsInt) * time.Second + return } + PARTITION_STATE_POLLING: - for startPolling := time.Now(); ; { + for ; ctx.Err() == nil ; { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: @@ -485,18 +630,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_TERMINATED: break PARTITION_STATE_POLLING default: - log.WithError(fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + err = fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break PARTITION_STATE_POLLING } - if time.Since(startPolling) > pollingTimeout { - log.WithError(fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String())). + if ctx.Err() != nil { + err = fmt.Errorf("PartitionTerminate timeout exceeded. Latest state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("timeout", pollingTimeout). - Error("failed to perform DD scheduler PartitionTerminate") + WithField("call", "EnsureTermination"). + WithField("timeout", timeout). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + break } } From 906ae687550dc6ddd1efa6c4548c9c3a0ae694e1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Mar 2022 11:14:17 +0100 Subject: [PATCH 1138/2352] [core] TRG cleanup fix for standalone runs --- core/integration/trg/plugin.go | 70 +++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 23 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 2a7a0db94..df5ae4e29 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -1,8 +1,9 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2021-2022 CERN and copyright holders of ALICE O². * Author: Miltiadis Alexis + * Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -48,12 +49,13 @@ import ( const TRG_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - trgHost string - trgPort int + trgHost string + trgPort int - trgClient *RpcClient + trgClient *RpcClient - pendingEORs map[string /*envId*/]int64 + pendingRunStops map[string /*envId*/]int64 + pendingRunUnloads map[string /*envId*/]int64 } func NewPlugin(endpoint string) integration.Plugin { @@ -68,10 +70,11 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - trgHost: u.Hostname(), - trgPort: portNumber, - trgClient: nil, - pendingEORs: make(map[string]int64), + trgHost: u.Hostname(), + trgPort: portNumber, + trgClient: nil, + pendingRunStops: make(map[string]int64), + pendingRunUnloads: make(map[string]int64), } } @@ -269,7 +272,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // runLoad successful, we cache the run number for eventual cleanup - p.pendingEORs[envId] = runNumber64 + p.pendingRunUnloads[envId] = runNumber64 log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("TRG RunLoad success") @@ -402,6 +405,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } } + + // runStart successful, we cache the run number for eventual cleanup + p.pendingRunStops[envId] = runNumber64 log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("TRG RunStart success") @@ -503,6 +509,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } } + + // RunStop successful, we pop the run number from the cache + delete(p.pendingRunStops, envId) log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("TRG RunStop success") @@ -606,7 +615,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // RunUnload successful, we pop the run number from the cache - delete(p.pendingEORs, envId) + delete(p.pendingRunUnloads, envId) log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("TRG RunUnload success") @@ -652,23 +661,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - runNumber, ok := p.pendingEORs[envId] - if !ok { + // runStop if found pending + runNumberStop, ok := p.pendingRunStops[envId] + if ok { + log.WithField("runNumber", runNumberStop). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("pending TRG Stop found, performing cleanup") + + delete(p.pendingRunStops, envId) + _ = runStopFunc(runNumberStop) + } else { log.WithField("partition", envId). WithField("level", infologger.IL_Devel). - Debug("TRG cleanup: nothing to do") - return + Debug("TRG cleanup: Stop not needed") } - log.WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("level", infologger.IL_Devel). - Debug("pending TRG Stop/Unload found, performing cleanup") - - delete(p.pendingEORs, envId) + // runUnload if found pending + runNumberUnload, ok := p.pendingRunUnloads[envId] + if ok { + log.WithField("runNumber", runNumberUnload). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("pending TRG Unload found, performing cleanup") - _ = runStopFunc(runNumber) - return runUnloadFunc(runNumber) + delete(p.pendingRunUnloads, envId) + _ = runUnloadFunc(runNumberUnload) + } else { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("TRG cleanup: Unload not needed") + } + return } return From 149b8a15d67bbcbbf72b17d83fc5a56e8cf78509 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Mar 2022 12:41:18 +0100 Subject: [PATCH 1139/2352] [core] DCS client call handling refactor and miscellaneous fixes --- core/integration/dcs/plugin.go | 251 ++++++++++++++++++++++++++++----- 1 file changed, 216 insertions(+), 35 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 2504541f2..f73fe7ca2 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -184,13 +184,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parameters = "{}" } + callFailedStr := "DCS StartOfRun call failed" + argMap := make(map[string]string) bytes := []byte(parameters) err := json.Unmarshal(bytes, &argMap) if err != nil { + err = fmt.Errorf("error processing DCS SOR parameters: %w", err) log.WithError(err). WithField("partition", envId). - Error("error processing DCS SOR parameters") + WithField("level", infologger.IL_Support). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -226,6 +235,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -247,22 +265,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(perDetectorParameters) err = json.Unmarshal(bytes, &detectorArgMap) if err != nil { + err = fmt.Errorf("error processing %s DCS SOR parameter map: %w", det.String(), err) + log.WithError(err). - WithField("detector", det.String()). + WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "StartOfRun"). + WithField("detector", det.String()). WithField("runNumber", runNumber64). - Errorf("error processing DCS SOR parameters for detector %s", det.String()) + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } // Per-detector parameters override any general dcs_sor_parameters err = mergo.Merge(&detectorArgMap, argMap) if err != nil { + err = fmt.Errorf("error processing %s DCS SOR general parameters override: %w", det.String(), err) + log.WithError(err). - WithField("detector", det.String()). + WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "StartOfRun"). + WithField("detector", det.String()). WithField("runNumber", runNumber64). - Errorf("error building parameter map for detector %s", det.String()) + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -273,19 +307,36 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if p.dcsClient == nil { - log.WithError(fmt.Errorf("DCS plugin not initialized")). + err = fmt.Errorf("DCS plugin not initialized, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS SOR") + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } + if p.dcsClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("DCS client connection not available")). + err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS SOR") + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -296,10 +347,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stream, err = p.dcsClient.StartOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS SOR") + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return } detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) @@ -309,6 +367,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var dcsEvent *dcspb.RunEvent for { + if ctx.Err() != nil { + err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + break + } dcsEvent, err = stream.Recv() if err == io.EOF { log.WithField("partition", envId). @@ -331,11 +393,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - log.WithField("event", dcsEvent). + if err == nil { + err = fmt.Errorf("%s SOR failure event from DCS", dcsEvent.GetDetector().String()) + } + log.WithError(err). + WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). - WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). - Warn("DCS SOR failure") + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -349,6 +422,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingEORs[envId] = runNumber64 break } + log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Support). @@ -356,15 +430,31 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("incoming DCS SOR event") } + dcsFailedDetectors := make([]string, 0) dcsopOk := true for _, v := range detectors { if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { dcsopOk = false - break + dcsFailedDetectors = append(dcsFailedDetectors, v.String()) } } if dcsopOk { p.pendingEORs[envId] = runNumber64 + } else { + if err == nil { + err = fmt.Errorf("SOR failed for %s, DCS EOR cleanup will not run", strings.Join(dcsFailedDetectors, ", ")) + } + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -380,13 +470,23 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parameters = "{}" } + callFailedStr := "DCS EndOfRun call failed" + argMap := make(map[string]string) bytes := []byte(parameters) err := json.Unmarshal(bytes, &argMap) if err != nil { + err = fmt.Errorf("error processing DCS SOR parameters: %w", err) + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("partition", envId). - Error("error processing DCS EOR parameters") + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -400,6 +500,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -420,22 +529,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(perDetectorParameters) err = json.Unmarshal(bytes, &detectorArgMap) if err != nil { + err = fmt.Errorf("error processing %s DCS EOR parameter map: %w", det.String(), err) + log.WithError(err). - WithField("detector", det.String()). + WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "EndOfRun"). + WithField("detector", det.String()). WithField("runNumber", runNumber64). - Errorf("error processing DCS EOR parameters for detector %s", det.String()) + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } - // Per-detector parameters override any general dcs_sor_parameters + // Per-detector parameters override any general dcs_eor_parameters err = mergo.Merge(&detectorArgMap, argMap) if err != nil { + err = fmt.Errorf("error processing %s DCS EOR general parameters override: %w", det.String(), err) + log.WithError(err). - WithField("detector", det.String()). + WithField("level", infologger.IL_Support). WithField("partition", envId). + WithField("call", "EndOfRun"). + WithField("detector", det.String()). WithField("runNumber", runNumber64). - Errorf("error building parameter map for detector %s", det.String()) + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -446,19 +571,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if p.dcsClient == nil { - log.WithError(fmt.Errorf("DCS plugin not initialized")). + err = fmt.Errorf("DCS plugin not initialized, EndOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS EOR") + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } if p.dcsClient.GetConnState() != connectivity.Ready { - log.WithError(fmt.Errorf("DCS client connection not available")). + err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS EOR") + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -469,10 +610,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stream, err = p.dcsClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). WithField("runNumber", runNumber64). - Error("failed to perform DCS EOR") + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return } detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) @@ -482,6 +630,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var dcsEvent *dcspb.RunEvent for { + if ctx.Err() != nil { + err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + break + } dcsEvent, err = stream.Recv() if err == io.EOF { log.WithField("partition", envId). @@ -504,11 +656,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { - log.WithField("event", dcsEvent). + if err == nil { + err = fmt.Errorf("%s EOR failure event from DCS", dcsEvent.GetDetector().String()) + } + log.WithError(err). + WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). - WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). - Warn("DCS EOR failure") + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } @@ -530,15 +693,31 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("incoming DCS EOR event") } + dcsFailedDetectors := make([]string, 0) dcsopOk := true for _, v := range detectors { if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { dcsopOk = false - break + dcsFailedDetectors = append(dcsFailedDetectors, v.String()) } } if dcsopOk { delete(p.pendingEORs, envId) + } else { + if err == nil { + err = fmt.Errorf("EOR failed for %s", strings.Join(dcsFailedDetectors, ", ")) + } + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr } return } @@ -574,10 +753,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("runNumber", runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). + WithField("call", "Cleanup"). Debug("pending DCS EOR found, performing cleanup") out = eorFunc(runNumber) delete(p.pendingEORs, envId) + return } From 6562a0da87237b4da84766eb07b5a1159451fc98 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Mar 2022 12:42:28 +0100 Subject: [PATCH 1140/2352] [build] Bump to v0.35.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e4ef1455e..f37a66aff 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 34 +VERSION_MINOR := 35 VERSION_PATCH := 0 From 040d73d0b8228e544c24b50679396da45e7290b6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 14 Mar 2022 17:16:47 +0100 Subject: [PATCH 1141/2352] [core] More permissive DCS client behaviour --- core/integration/dcs/plugin.go | 66 ++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 23 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index f73fe7ca2..d0b3e018c 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -29,7 +29,6 @@ package dcs import ( "context" "encoding/json" - "errors" "fmt" "io" "net/url" @@ -344,6 +343,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + + // Point of no return + // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via + // the response stream. + // Regardless of DCS SOR success or failure, once the StartOfRun call returns, an EndOfRun **must** be enqueued + // for later, either during STOP_ACTIVITY or cleanup. stream, err = p.dcsClient.StartOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -359,6 +364,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) for _, v := range detectors { @@ -372,25 +378,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if err == io.EOF { + if err == io.EOF { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS SOR event stream EOF, closed") break // no more data } - if err != nil || dcsEvent == nil { - if dcsEvent == nil { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Warn("nil DCS event received") - err = errors.New("nil DCS event") - } + if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). WithField("runNumber", runNumber64). - Warn("bad DCS event received") + Warn("bad DCS SOR event received, any future DCS events are ignored") break } + if dcsEvent == nil { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Warn("nil DCS SOR event received, skipping to next DCS event") + continue + } if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { if err == nil { @@ -425,7 +431,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Devel). WithField("runNumber", runNumber64). Info("incoming DCS SOR event") } @@ -442,7 +448,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingEORs[envId] = runNumber64 } else { if err == nil { - err = fmt.Errorf("SOR failed for %s, DCS EOR cleanup will not run", strings.Join(dcsFailedDetectors, ", ")) + err = fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedDetectors, ", ")) } log.WithError(err). @@ -607,6 +613,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + + // Point of no return + // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via + // the response stream. + // Regardless of DCS EOR success or failure, it must run once and only once, therefore if this call returns + // a nil error, we immediately dequeue the pending EOR. stream, err = p.dcsClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -622,6 +634,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + delete(p.pendingEORs, envId) // make sure this EOR never runs again + + log.WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Debug("DCS EndOfRun returned stream, awaiting responses (DCS cleanup will not run for this environment)") detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) for _, v := range detectors { @@ -635,25 +655,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if err == io.EOF { + if err == io.EOF { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS EOR event stream EOF, closed") break // no more data } - if err != nil || dcsEvent == nil { - if dcsEvent == nil { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Warn("nil DCS event received") - err = errors.New("nil DCS event") - } + if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). WithField("runNumber", runNumber64). - Warn("bad DCS event received") + Warn("bad DCS EOR event received, any future DCS events are ignored") break } + if dcsEvent == nil { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Warn("nil DCS EOR event received, skipping to next DCS event") + continue + } if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { if err == nil { @@ -688,7 +708,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Devel). WithField("runNumber", runNumber64). Info("incoming DCS EOR event") } @@ -705,7 +725,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingEORs, envId) } else { if err == nil { - err = fmt.Errorf("EOR failed for %s", strings.Join(dcsFailedDetectors, ", ")) + err = fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedDetectors, ", ")) } log.WithError(err). From 0feca5d52842401eabc394e292b38303d1123475 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 16 Mar 2022 12:58:53 +0100 Subject: [PATCH 1142/2352] [apricot] Add getAll flag for ListDetectors RPC --- apricot/local/service.go | 3 ++- apricot/protos/apricot.proto | 6 +++++- apricot/remote/server.go | 4 ++-- apricot/remote/service.go | 4 ++-- configuration/service.go | 2 +- core/server.go | 2 +- 6 files changed, 13 insertions(+), 8 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 83524f065..439339494 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -123,7 +123,7 @@ func (s *Service) GetDefaults() map[string]string { return smap } -func (s *Service) ListDetectors() (detectors []string, err error) { +func (s *Service) ListDetectors(getAll bool) (detectors []string, err error) { keyPrefix := inventoryKeyPrefix + "detectors/" var keys []string keys, err = s.src.GetKeysByPrefix(keyPrefix) @@ -136,6 +136,7 @@ func (s *Service) ListDetectors() (detectors []string, err error) { for _, key := range keys { detTrimmed := strings.TrimPrefix(key, keyPrefix) detname := strings.Split(detTrimmed, "/") + if !getAll && detname[0] == "TRG" { continue } if _, ok := detectorSet[detname[0]]; !ok { // the detector name we found in the path isn't already accounted for detectorSet[detname[0]] = true detectors = append(detectors, detname[0]) diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 68d88e386..a4407164a 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -35,7 +35,7 @@ service Apricot { rpc RawGetRecursive(RawGetRecursiveRequest) returns (ComponentResponse) {} // Detectors and host inventories - rpc ListDetectors(Empty) returns (DetectorsResponse) {} + rpc ListDetectors(DetectorsRequest) returns (DetectorsResponse) {} rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} rpc GetDetectorsForHosts(HostsRequest) returns (DetectorsResponse) {} @@ -155,6 +155,10 @@ message ComponentEntriesResponse { repeated string payload = 1; } +message DetectorsRequest { + bool getAll = 1; // if false(default) restricts "private" detectors (e.g. TRG) +} + message DetectorsResponse { repeated string detectors = 1; } diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 6a8d26f85..e7b2a6ff4 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -307,13 +307,13 @@ func (m *RpcServer) RawGetRecursive(_ context.Context, request *apricotpb.RawGet return &apricotpb.ComponentResponse{Payload: payload}, nil } -func (m *RpcServer) ListDetectors(_ context.Context, _ *apricotpb.Empty) (*apricotpb.DetectorsResponse, error) { +func (m *RpcServer) ListDetectors(_ context.Context, request *apricotpb.DetectorsRequest) (*apricotpb.DetectorsResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE } m.logMethod() - detectors, err := m.service.ListDetectors() + detectors, err := m.service.ListDetectors(request.GetAll) if err != nil { return nil, err } diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 4c68321a0..f54c1371f 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -243,9 +243,9 @@ func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, return response.GetPayload(), nil } -func (c *RemoteService) ListDetectors() (detectors []string, err error) { +func (c *RemoteService) ListDetectors(getAll bool) (detectors []string, err error) { var response *apricotpb.DetectorsResponse - response, err = c.cli.ListDetectors(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + response, err = c.cli.ListDetectors(context.Background(), &apricotpb.DetectorsRequest{GetAll: getAll}, grpc.EmptyCallOption{}) if err != nil { return nil, err } diff --git a/configuration/service.go b/configuration/service.go index 6805d78f1..97616b859 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -43,7 +43,7 @@ type Service interface { GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) - ListDetectors() (detectors []string, err error) + ListDetectors(getAll bool) (detectors []string, err error) GetHostInventory(detector string) (hosts []string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) diff --git a/core/server.go b/core/server.go index 3eb8d9d2e..d0862fe5a 100644 --- a/core/server.go +++ b/core/server.go @@ -144,7 +144,7 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) cs := the.ConfSvc() - allDetectors, err := cs.ListDetectors() + allDetectors, err := cs.ListDetectors(true) if err != nil { allDetectors = []string{"NIL"} } From fda15f3513fa5307c53bbeff243606b320e7aed1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Mar 2022 14:11:58 +0100 Subject: [PATCH 1143/2352] [apricot] Regenerate Apricot protobuf code --- apricot/protos/apricot.pb.go | 472 +++++++++++++++++------------- apricot/protos/apricot_grpc.pb.go | 12 +- 2 files changed, 274 insertions(+), 210 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index f2450b7c5..033a72d08 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -1119,6 +1119,53 @@ func (x *ComponentEntriesResponse) GetPayload() []string { return nil } +type DetectorsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GetAll bool `protobuf:"varint,1,opt,name=getAll,proto3" json:"getAll,omitempty"` // if false(default) restricts "private" detectors (e.g. TRG) +} + +func (x *DetectorsRequest) Reset() { + *x = DetectorsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorsRequest) ProtoMessage() {} + +func (x *DetectorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorsRequest.ProtoReflect.Descriptor instead. +func (*DetectorsRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{18} +} + +func (x *DetectorsRequest) GetGetAll() bool { + if x != nil { + return x.GetAll + } + return false +} + type DetectorsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1130,7 +1177,7 @@ type DetectorsResponse struct { func (x *DetectorsResponse) Reset() { *x = DetectorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1143,7 +1190,7 @@ func (x *DetectorsResponse) String() string { func (*DetectorsResponse) ProtoMessage() {} func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1156,7 +1203,7 @@ func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsResponse.ProtoReflect.Descriptor instead. func (*DetectorsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *DetectorsResponse) GetDetectors() []string { @@ -1177,7 +1224,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1237,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1250,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *HostGetRequest) GetDetector() string { @@ -1224,7 +1271,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1237,7 +1284,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1250,7 +1297,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1274,7 +1321,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1287,7 +1334,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1300,7 +1347,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{21} + return file_protos_apricot_proto_rawDescGZIP(), []int{22} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1344,7 +1391,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1357,7 +1404,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1370,7 +1417,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{22} + return file_protos_apricot_proto_rawDescGZIP(), []int{23} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1405,7 +1452,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1418,7 +1465,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1431,7 +1478,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{23} + return file_protos_apricot_proto_rawDescGZIP(), []int{24} } func (x *CRUCardsResponse) GetCards() string { @@ -1453,7 +1500,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1466,7 +1513,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1479,7 +1526,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{24} + return file_protos_apricot_proto_rawDescGZIP(), []int{25} } func (x *CardRequest) GetHostname() string { @@ -1507,7 +1554,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1520,7 +1567,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1533,7 +1580,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{25} + return file_protos_apricot_proto_rawDescGZIP(), []int{26} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1647,158 +1694,162 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, - 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, - 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, - 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, - 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, - 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, - 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, - 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, - 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, - 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, - 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, - 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, - 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xff, 0x0b, 0x0a, 0x07, 0x41, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, - 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, - 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, + 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3d, 0x0a, 0x0d, 0x4c, 0x69, - 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, - 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, - 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, + 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, + 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, + 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, + 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, + 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, + 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, + 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x8a, 0x0c, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, + 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, + 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, - 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, - 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, + 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, + 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, + 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -1814,7 +1865,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 28) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1835,22 +1886,23 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*ComponentEntriesQuery)(nil), // 16: apricot.ComponentEntriesQuery (*ListComponentEntriesRequest)(nil), // 17: apricot.ListComponentEntriesRequest (*ComponentEntriesResponse)(nil), // 18: apricot.ComponentEntriesResponse - (*DetectorsResponse)(nil), // 19: apricot.DetectorsResponse - (*HostGetRequest)(nil), // 20: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 21: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 22: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 23: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 24: apricot.CRUCardsResponse - (*CardRequest)(nil), // 25: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 26: apricot.CRUCardEndpointResponse - nil, // 27: apricot.ComponentRequest.VarStackEntry - nil, // 28: apricot.StringMap.StringMapEntry + (*DetectorsRequest)(nil), // 19: apricot.DetectorsRequest + (*DetectorsResponse)(nil), // 20: apricot.DetectorsResponse + (*HostGetRequest)(nil), // 21: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 22: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 23: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 24: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 25: apricot.CRUCardsResponse + (*CardRequest)(nil), // 26: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 27: apricot.CRUCardEndpointResponse + nil, // 28: apricot.ComponentRequest.VarStackEntry + nil, // 29: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 27, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 28, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 28, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 29, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 16, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -1858,12 +1910,12 @@ var file_protos_apricot_proto_depIdxs = []int32{ 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty 11, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 1, // 11: apricot.Apricot.ListDetectors:input_type -> apricot.Empty - 20, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 19, // 11: apricot.Apricot.ListDetectors:input_type -> apricot.DetectorsRequest + 21, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest 6, // 13: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 7, // 14: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest 6, // 15: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 25, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 26, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest 12, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 13, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest 15, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest @@ -1872,17 +1924,17 @@ var file_protos_apricot_proto_depIdxs = []int32{ 2, // 22: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery 3, // 23: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest 3, // 24: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 22, // 25: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 23, // 25: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest 9, // 26: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse 10, // 27: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap 10, // 28: apricot.Apricot.GetVars:output_type -> apricot.StringMap 4, // 29: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 19, // 30: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 21, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 20, // 30: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 22, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse 8, // 32: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 19, // 33: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 24, // 34: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 26, // 35: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 20, // 33: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 25, // 34: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 27, // 35: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse 4, // 36: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse 1, // 37: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty 18, // 38: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse @@ -1891,7 +1943,7 @@ var file_protos_apricot_proto_depIdxs = []int32{ 18, // 41: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse 4, // 42: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse 5, // 43: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 23, // 44: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 24, // 44: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse 26, // [26:45] is the sub-list for method output_type 7, // [7:26] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name @@ -2122,7 +2174,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsResponse); i { + switch v := v.(*DetectorsRequest); i { case 0: return &v.state case 1: @@ -2134,7 +2186,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*DetectorsResponse); i { case 0: return &v.state case 1: @@ -2146,7 +2198,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -2158,7 +2210,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -2170,7 +2222,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -2182,7 +2234,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -2194,7 +2246,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*CRUCardsResponse); i { case 0: return &v.state case 1: @@ -2206,6 +2258,18 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -2232,7 +2296,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 28, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 9b5865c0f..45455362b 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -23,7 +23,7 @@ type ApricotClient interface { GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) // Detectors and host inventories - ListDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorsResponse, error) + ListDetectors(ctx context.Context, in *DetectorsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) @@ -86,7 +86,7 @@ func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursive return out, nil } -func (c *apricotClient) ListDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorsResponse, error) { +func (c *apricotClient) ListDetectors(ctx context.Context, in *DetectorsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) { out := new(DetectorsResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ListDetectors", in, out, opts...) if err != nil { @@ -230,7 +230,7 @@ type ApricotServer interface { GetVars(context.Context, *Empty) (*StringMap, error) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) // Detectors and host inventories - ListDetectors(context.Context, *Empty) (*DetectorsResponse, error) + ListDetectors(context.Context, *DetectorsRequest) (*DetectorsResponse, error) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) GetDetectorsForHosts(context.Context, *HostsRequest) (*DetectorsResponse, error) @@ -265,7 +265,7 @@ func (UnimplementedApricotServer) GetVars(context.Context, *Empty) (*StringMap, func (UnimplementedApricotServer) RawGetRecursive(context.Context, *RawGetRecursiveRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RawGetRecursive not implemented") } -func (UnimplementedApricotServer) ListDetectors(context.Context, *Empty) (*DetectorsResponse, error) { +func (UnimplementedApricotServer) ListDetectors(context.Context, *DetectorsRequest) (*DetectorsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListDetectors not implemented") } func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { @@ -395,7 +395,7 @@ func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec } func _Apricot_ListDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) + in := new(DetectorsRequest) if err := dec(in); err != nil { return nil, err } @@ -407,7 +407,7 @@ func _Apricot_ListDetectors_Handler(srv interface{}, ctx context.Context, dec fu FullMethod: "/apricot.Apricot/ListDetectors", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).ListDetectors(ctx, req.(*Empty)) + return srv.(ApricotServer).ListDetectors(ctx, req.(*DetectorsRequest)) } return interceptor(ctx, in, info, handler) } From d96048c2529cd5880795030e67d0bb0342f6ed2a Mon Sep 17 00:00:00 2001 From: Pierre Vande Vyvre Date: Tue, 8 Feb 2022 14:15:54 +0100 Subject: [PATCH 1144/2352] Reduce verbosity of the most vocal log message #31 to #60 --- core/environment/manager.go | 1 + core/task/manager.go | 3 ++- core/task/scheduler.go | 11 ++++----- executor/executable/basictaskcommon.go | 2 +- executor/executable/controllabletask.go | 30 +++++++++++++++---------- executor/executable/task.go | 3 ++- executor/executorcmd/client.go | 5 ----- executor/handlers.go | 8 ------- 8 files changed, 30 insertions(+), 33 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index c612044a5..d75fa9b45 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -460,6 +460,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { "stdout": btt.Stdout, "stderr": btt.Stderr, "finalMesosState": btt.FinalMesosState.String(), + "level" : infologger.IL_Devel, }). Debug("basic task terminated") diff --git a/core/task/manager.go b/core/task/manager.go index 566b3e35f..2b544411b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -45,7 +45,7 @@ import ( "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/k0kubun/pp" - "github.com/mesos/mesos-go/api/v1/lib" + mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/scheduler/calls" "github.com/sirupsen/logrus" ) @@ -700,6 +700,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { case mesos.TASK_RUNNING: log.WithField("taskId", taskId). WithField("name", taskPtr.GetName()). + WithField("level", infologger.IL_Devel). Debug("task running") taskPtr.status = ACTIVE if taskPtr.GetParent() != nil { diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 8569a02f8..322e7fa8c 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -476,7 +476,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithFields(logrus.Fields{ "offerId": offer.ID.Value, "resources": remainingResourcesInOffer.String(), - }).Debug("processing offer") + }).Trace("processing offer") remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) @@ -490,7 +490,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } } - log.WithPrefix("scheduler").Debug("state lock to process descriptors to deploy") + log.WithPrefix("scheduler").Trace("state lock to process descriptors to deploy") state.Lock() // We iterate down over the descriptors, and we remove them as we match @@ -572,7 +572,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithField("offerId", offer.ID.Value). Error("cannot get task for offer+descriptor, this should never happen") - log.Debug("state unlock") + log.Trace("state unlock") continue } @@ -661,7 +661,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Error("cannot serialize mesos.CommandInfo for executor") state.Unlock() log.WithPrefix("scheduler"). - Debug("state unlock") + Trace("state unlock") continue } @@ -737,7 +737,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han tasksDeployedForCurrentOffer[taskPtr] = descriptor } // end FOR_DESCRIPTORS state.Unlock() - log.WithPrefix("scheduler").Debug("state unlock") + log.WithPrefix("scheduler").Trace("state unlock") // build ACCEPT call to launch all of the tasks we've assembled accept := calls.Accept( @@ -764,6 +764,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "executorName": taskInfo.GetExecutor().GetName(), "agentId": taskInfo.GetAgentID().Value, "taskId": taskInfo.GetTaskID().Value, + "level" : infologger.IL_Devel, }). Debug("launched") } diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 2048e3381..45b9e579b 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -241,6 +241,7 @@ func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) e t.transitioner = transitioner.NewTransitioner(t.Tci.ControlMode, transitionFunc) log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). + WithField("level",infologger.IL_Devel). Debug("basic task staged") go t.sendStatus(mesos.TASK_RUNNING, "") @@ -269,7 +270,6 @@ func (t *basicTaskBase) Transition(cmd *executorcmd.ExecutorCommand_Transition) func (t *basicTaskBase) Kill() error { if t.taskCmd != nil { t.taskCmd = nil - log.Debug("exec.Cmd wrapper removed") } go t.sendStatus(mesos.TASK_FINISHED, "") diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index dde353a95..eabc36e04 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -84,6 +84,7 @@ func (t *ControllableTask) Launch() error { log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). + WithField("level", infologger.IL_Devel). Debug("starting task asynchronously") // We fork out into a goroutine for the actual process management. @@ -165,6 +166,7 @@ func (t *ControllableTask) Launch() error { "path": taskCmd.Path, "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", "argc": len(taskCmd.Args), + "level": infologger.IL_Devel, }). Debug("starting gRPC client") @@ -211,6 +213,7 @@ func (t *ControllableTask) Launch() error { "task": t.ti.Name, "command": tciCommandStr, "elapsed": elapsed.String(), + "level": infologger.IL_Devel, }). Debug("polling task for IDLE state reached") @@ -228,6 +231,7 @@ func (t *ControllableTask) Launch() error { "state": response.GetState(), "task": t.ti.Name, "command": tciCommandStr, + "level": infologger.IL_Devel, }). Debug("task status queried") t.knownPid = int(response.GetPid()) @@ -239,6 +243,7 @@ func (t *ControllableTask) Launch() error { log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). WithField("command", tciCommandStr). + WithField("level", infologger.IL_Devel). Debug("task running and ready for control input") break } else if reachedState == "DONE" || reachedState == "ERROR" { @@ -283,8 +288,6 @@ func (t *ControllableTask) Launch() error { return } - log.WithField("task", t.ti.Name).Debug("notifying of task running state") - // send RUNNING t.sendStatus(mesos.TASK_RUNNING, "") taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) @@ -341,6 +344,7 @@ func (t *ControllableTask) Launch() error { "id": t.ti.TaskID.Value, "task": t.ti.Name, "command": tciCommandStr, + "level" : infologger.IL_Devel, }).Debug("task done, preparing final update") pendingState := mesos.TASK_FINISHED @@ -385,13 +389,14 @@ func (t *ControllableTask) Launch() error { Warning("failed to capture stdout or stderr of task") } - log.WithField("task", t.ti.Name). - WithField("status", pendingState.String()). - Debug("sending final status update") t.sendStatus(pendingState, "") }() - log.WithField("task", t.ti.Name).Debug("gRPC client running, handler forked") + log.WithFields(logrus.Fields{ + "task": t.ti.Name, + "level": infologger.IL_Devel, + }). + Debug("gRPC client running, handler forked") return nil } @@ -426,14 +431,15 @@ func (t *ControllableTask) Kill() error { defer cancel() response, err := t.rpc.GetState(cxt, &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err == nil { // we successfully got the state from the task - log.WithField("nativeState", response.GetState()).WithField("taskId", t.ti.GetTaskID()).Debug("task status queried for upcoming soft kill") + log.WithField("nativeState", response.GetState()). + WithField("taskId", t.ti.GetTaskID()). + WithField("level",infologger.IL_Devel). + Debug("task status queried for upcoming soft kill") // NOTE: we acquire the transitioner-dependent STANDBY equivalent state reachedState = t.rpc.FromDeviceState(response.GetState()) nextTransition := func(currentState string) (exc *executorcmd.ExecutorCommand_Transition) { - log.WithField("currentState", currentState). - Debug("nextTransition(currentState) BEGIN") var evt, destination string switch currentState { case "RUNNING": @@ -449,9 +455,6 @@ func (t *ControllableTask) Kill() error { evt = "EXIT" destination = "DONE" } - log.WithField("evt", evt). - WithField("dst", destination). - Debug("nextTransition(currentState) BEGIN") exc = executorcmd.NewLocalExecutorCommand_Transition( t.rpc.Transitioner, @@ -478,6 +481,7 @@ func (t *ControllableTask) Kill() error { "src": cmd.Source, "dst": cmd.Destination, "targetList": cmd.TargetList, + "level" : infologger.IL_Devel, }). Debug("state DONE not reached, about to commit transition") @@ -506,6 +510,7 @@ func (t *ControllableTask) Kill() error { log.WithField("newState", commitResponse.newState). WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). + WithField("level", infologger.IL_Devel). Debug("transition committed") if commitResponse.transitionError != nil || len(cmd.Event) == 0 { log.WithError(commitResponse.transitionError). @@ -518,6 +523,7 @@ func (t *ControllableTask) Kill() error { } log.WithField("task", t.ti.TaskID.Value). + WithField("level", infologger.IL_Devel). Debug("teardown transition sequence done") pid = int(response.GetPid()) if pid == 0 { diff --git a/executor/executable/task.go b/executor/executable/task.go index 063b7cd47..9f2d174c4 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -87,6 +87,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE "args": commandInfo.Arguments, "task": taskInfo.Name, "controlmode": commandInfo.ControlMode.String(), + "level": infologger.IL_Devel, }). Debug("instantiating task") @@ -221,7 +222,7 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { "gid": credential.Gid, "groups": gidStrings, }). - Debug("custom credentials set") + Trace("custom credentials set") } return taskCmd, nil diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 36d51229e..91d42b7d1 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -65,10 +65,6 @@ func NewClient( controlTransportS = "JSON" } - log.WithField("endpoint", endpoint). - WithField("transport", controlTransportS). - Debug("starting new gRPC client") - cxt, cancel := context.WithTimeout(context.Background(), GRPC_DIAL_TIMEOUT) conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) if err != nil { @@ -92,7 +88,6 @@ func NewClient( conn: conn, } - log.WithFields(logrus.Fields{"endpoint": endpoint, "controlMode": controlMode.String()}).Debug("instantiating new transitioner") client.Transitioner = transitioner.NewTransitioner(controlMode, client.doTransition) client.log = log return client diff --git a/executor/handlers.go b/executor/handlers.go index dd8d4df0c..87db9ad4e 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -71,10 +71,6 @@ func makeSendMessageFunc(state *internalState) executable.SendMessageFunc { func handleOutgoingMessage(state *internalState, message []byte) { _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(message))) - log.WithFields(logrus.Fields{ - "event": string(message), - }). - Debug("event sent") } func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { @@ -258,10 +254,6 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { return } - if cmd.Event == "CONFIGURE" { - log.WithFields(logrus.Fields{"map": cmd.Arguments, "taskId": taskId}).Debug("CONFIGURE pushing FairMQ properties") - } - response := activeTask.Transition(cmd) data, marshalError := json.Marshal(response) From fd6241652e23d95198611b656aa907e9f25815ac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Mar 2022 12:32:14 +0100 Subject: [PATCH 1145/2352] [core] Report DeadlineExceeded as timeout error --- core/integration/dcs/plugin.go | 63 +++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 16 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index d0b3e018c..bc8ef6f8e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -29,6 +29,7 @@ package dcs import ( "context" "encoding/json" + "errors" "fmt" "io" "net/url" @@ -378,12 +379,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if err == io.EOF { // correct stream termination + if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS SOR event stream EOF, closed") break // no more data } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). + WithField("timeout", timeout.String()). + Debug("DCS SOR timed out") + err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) + break + } if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). @@ -420,13 +430,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("DCS SOR success") - p.pendingEORs[envId] = runNumber64 - break + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("DCS SOR completed successfully") + p.pendingEORs[envId] = runNumber64 + break + } else { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + } } log.WithField("event", dcsEvent). @@ -655,12 +671,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if err == io.EOF { // correct stream termination + if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS EOR event stream EOF, closed") break // no more data } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). + WithField("timeout", timeout.String()). + Debug("DCS EOR timed out") + err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) + break + } if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). @@ -697,13 +722,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK && dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("DCS EOR success") - delete(p.pendingEORs, envId) - break + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("DCS EOR completed successfully") + delete(p.pendingEORs, envId) + break + } else { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("DCS EOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + } } log.WithField("event", dcsEvent). From 4a546e37c5e498a9080e1c8fe6a16756476a4d22 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Mar 2022 13:24:02 +0100 Subject: [PATCH 1146/2352] [core] Push detector list to InfoLogger at the beginning of DCS SOR/EOR --- core/integration/dcs/plugin.go | 132 +++++++++++++++++++-------------- 1 file changed, 77 insertions(+), 55 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index bc8ef6f8e..19593b100 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -63,6 +63,8 @@ type Plugin struct { pendingEORs map[string /*envId*/]int64 } +type DCSDetectors []dcspb.Detector + func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -173,9 +175,44 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing + var err error + callFailedStr := "DCS StartOfRun call failed" + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for DCS SOR") + } + + dcsDetectorsParam, ok := varStack["dcs_detectors"] + if !ok { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("empty DCS detectors list provided") + dcsDetectorsParam = "[\"NULL_DETECTOR\"]" + } + + detectors, err := p.parseDetectors(dcsDetectorsParam) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - Info("performing DCS SOR") + WithField("runNumber", runNumber64). + Infof("performing DCS SOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] if !ok { @@ -184,11 +221,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parameters = "{}" } - callFailedStr := "DCS StartOfRun call failed" - argMap := make(map[string]string) bytes := []byte(parameters) - err := json.Unmarshal(bytes, &argMap) + err = json.Unmarshal(bytes, &argMap) if err != nil { err = fmt.Errorf("error processing DCS SOR parameters: %w", err) log.WithError(err). @@ -203,15 +238,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - rn := varStack["run_number"] - var runNumber64 int64 - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for DCS SOR") - } - rt := dcspb.RunType_TECHNICAL runTypeS, ok := varStack["run_type"] if ok { @@ -225,28 +251,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } - dcsDetectorsParam, ok := varStack["dcs_detectors"] - if !ok { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("empty DCS detectors list provided") - dcsDetectorsParam = "[\"NULL_DETECTOR\"]" - } - - detectors, err := p.parseDetectors(dcsDetectorsParam) - if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("DCS error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - // Preparing the per-detector request payload in := dcspb.SorRequest{ RunType: rt, @@ -441,6 +445,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { log.WithField("partition", envId). WithField("runNumber", runNumber64). + WithField("detector", dcsEvent.GetDetector().String()). Debug("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) } } @@ -481,25 +486,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } eorFunc := func(runNumber64 int64) (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - Info("performing DCS EOR") + callFailedStr := "DCS EndOfRun call failed" - parameters, ok := varStack["dcs_eor_parameters"] + dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). - Debug("no DCS EOR parameters set") - parameters = "{}" + WithField("runNumber", runNumber64). + Debug("empty DCS detectors list provided") + dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } - callFailedStr := "DCS EndOfRun call failed" - - argMap := make(map[string]string) - bytes := []byte(parameters) - err := json.Unmarshal(bytes, &argMap) + detectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { - err = fmt.Errorf("error processing DCS SOR parameters: %w", err) - log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -512,16 +510,24 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - dcsDetectorsParam, ok := varStack["dcs_detectors"] + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("runNumber", runNumber64). + Infof("performing DCS EOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + + parameters, ok := varStack["dcs_eor_parameters"] if !ok { log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("empty DCS detectors list provided") - dcsDetectorsParam = "[\"NULL_DETECTOR\"]" + Debug("no DCS EOR parameters set") + parameters = "{}" } - detectors, err := p.parseDetectors(dcsDetectorsParam) + argMap := make(map[string]string) + bytes := []byte(parameters) + err = json.Unmarshal(bytes, &argMap) if err != nil { + err = fmt.Errorf("error processing DCS EOR parameters: %w", err) + log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -733,6 +739,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { log.WithField("partition", envId). WithField("runNumber", runNumber64). + WithField("detector", dcsEvent.GetDetector().String()). Debug("DCS EOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) } } @@ -816,7 +823,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } -func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Detector, err error) { +func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors DCSDetectors, err error) { detectorsSlice := make([]string, 0) bytes := []byte(dcsDetectorsParam) err = json.Unmarshal(bytes, &detectorsSlice) @@ -827,7 +834,7 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Det } // Now we process the stringSlice into a slice of detector enum values - detectors = make([]dcspb.Detector, len(detectorsSlice)) + detectors = make(DCSDetectors, len(detectorsSlice)) for i, det := range detectorsSlice { intDet, ok := dcspb.Detector_value[det] if !ok { @@ -845,3 +852,18 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors []dcspb.Det func (p *Plugin) Destroy() error { return p.dcsClient.Close() } + +func (d DCSDetectors) StringSlice() (sslice []string) { + if d == nil { + return + } + sslice = make([]string, len(d)) + if len(d) == 0 { + return + } + + for i, det := range d { + sslice[i] = det.String() + } + return +} \ No newline at end of file From c628e9589ede97e4eee6cb242b07e8bab9837c2f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Mar 2022 13:31:31 +0100 Subject: [PATCH 1147/2352] [build] Bump to v0.36.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f37a66aff..db9471501 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 35 +VERSION_MINOR := 36 VERSION_PATCH := 0 From c3b466b069b249e91a74aea1e502f6872ed4311b Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 17 Mar 2022 16:55:18 +0100 Subject: [PATCH 1148/2352] [octrl-203] An error is returned if the workflow template file name and the workflow name don't match. --- core/workflow/load.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/workflow/load.go b/core/workflow/load.go index d15e60a89..bd6671321 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -25,9 +25,11 @@ package workflow import ( + "errors" "fmt" "io/ioutil" "os" + "strings" "time" "github.com/AliceO2Group/Control/common/gera" @@ -77,6 +79,24 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return nil, err } + var workflowFilename string + revSlice := strings.Split(workflowPath, "@") + if len(revSlice) == 2 { + workflowPath = revSlice[0] + } + workflowInfo := strings.Split(workflowPath, "/workflows/") + if len(workflowInfo) == 1 { + workflowFilename = workflowInfo[0] + + } else { + workflowFilename = workflowInfo[1] + } + + if root.roleBase.Name != workflowFilename { + err = errors.New("the name of the workflow template file and the name of the workflow don't match") + return + } + workflow = root timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) From 3e8220138227441db49e86e6dcacdfd2d12d0cf4 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 21 Mar 2022 09:53:52 +0100 Subject: [PATCH 1149/2352] [octrl-203] An error is returned when the task template file name and the task name don't match. --- core/task/manager.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index 2b544411b..c34b5be4a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -193,6 +193,26 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return nil, fmt.Errorf("task template load error (template=%s): %w", taskTemplatePath, err) } + var taskFilename, taskPath string + taskRev := strings.Split(taskClass, "@") + if len(taskRev) == 2 { + taskPath = taskRev[0] + } else { + taskPath = taskClass + } + taskInfo := strings.Split(taskPath, "/tasks/") + if len(taskInfo) == 1 { + taskFilename = taskInfo[0] + + } else { + taskFilename = taskInfo[1] + } + + if taskClassStruct.Identifier.Name != taskFilename { + err = errors.New("the name of the task template file and the name of the task don't match") + return + } + taskClassStruct.Identifier.repoIdentifier = repo.GetIdentifier() taskClassStruct.Identifier.hash = repo.GetHash() taskClassList = append(taskClassList, &taskClassStruct) From 9b9533e077c10cfec101c22386acbf673fc56982 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 15 Mar 2022 16:49:20 +0100 Subject: [PATCH 1150/2352] [octrl-210] Timestamps are returned by ControlEnvironment, when launching environment transitions. --- coconut/control/control.go | 23 +- coconut/protos/o2control.pb.go | 1054 ++++++++++++++++---------------- core/protos/o2control.pb.go | 1054 ++++++++++++++++---------------- core/protos/o2control.proto | 3 + core/server.go | 8 + 5 files changed, 1117 insertions(+), 1025 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 965dd8d4b..2764da9b9 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -487,10 +487,27 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. rnString := formatRunNumber(response.GetCurrentRunNumber()) + sotTimestamp, err := time.Parse(time.RFC3339, response.GetStartOfTransition()) + var sotFormatted, eotFormatted string + if err == nil { + sotFormatted = sotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") + } else { + sotFormatted = "unknown" + } + eotTimestamp, err := time.Parse(time.RFC3339, response.GetEndOfTransition()) + if err == nil { + eotFormatted = eotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") + } else { + eotFormatted = "unknown" + } + _, _ = fmt.Fprintln(o, "transition complete") - _, _ = fmt.Fprintf(o, "environment id: %s\n", response.GetId()) - _, _ = fmt.Fprintf(o, "state: %s\n", colorState(response.GetState())) - _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) + _, _ = fmt.Fprintf(o, "environment id: %s\n", response.GetId()) + _, _ = fmt.Fprintf(o, "state: %s\n", colorState(response.GetState())) + _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) + _, _ = fmt.Fprintf(o, "start of transition: %s\n", grey(sotFormatted)) + _, _ = fmt.Fprintf(o, "end of transition: %s\n", grey(eotFormatted)) + _, _ = fmt.Fprintf(o, "transition duration: %ss\n", grey(response.GetTransitionDuration())) return } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 6ec82ea8f..56207d088 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.6.1 // source: protos/o2control.proto package pb @@ -1898,9 +1898,12 @@ type ControlEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + StartOfTransition string `protobuf:"bytes,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` + EndOfTransition string `protobuf:"bytes,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` + TransitionDuration string `protobuf:"bytes,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1956,6 +1959,27 @@ func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { return 0 } +func (x *ControlEnvironmentReply) GetStartOfTransition() string { + if x != nil { + return x.StartOfTransition + } + return "" +} + +func (x *ControlEnvironmentReply) GetEndOfTransition() string { + if x != nil { + return x.EndOfTransition + } + return "" +} + +func (x *ControlEnvironmentReply) GetTransitionDuration() string { + if x != nil { + return x.TransitionDuration + } + return "" +} + type ModifyEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4840,525 +4864,533 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, + 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, + 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, + 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, + 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, + 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, - 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, - 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, - 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, - 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, - 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, + 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, + 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, + 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, + 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, + 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, + 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, + 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, + 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, + 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, + 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, + 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, + 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, + 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, + 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 6ec82ea8f..56207d088 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.6.1 // source: protos/o2control.proto package pb @@ -1898,9 +1898,12 @@ type ControlEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + StartOfTransition string `protobuf:"bytes,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` + EndOfTransition string `protobuf:"bytes,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` + TransitionDuration string `protobuf:"bytes,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1956,6 +1959,27 @@ func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { return 0 } +func (x *ControlEnvironmentReply) GetStartOfTransition() string { + if x != nil { + return x.StartOfTransition + } + return "" +} + +func (x *ControlEnvironmentReply) GetEndOfTransition() string { + if x != nil { + return x.EndOfTransition + } + return "" +} + +func (x *ControlEnvironmentReply) GetTransitionDuration() string { + if x != nil { + return x.TransitionDuration + } + return "" +} + type ModifyEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4840,525 +4864,533 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x6b, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, + 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, + 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, + 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, + 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, + 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, + 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, - 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, - 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, - 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, - 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, - 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, + 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, + 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, + 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, + 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, + 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, + 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, + 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, + 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, + 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, + 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, + 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, + 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, + 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, + 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, + 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index aa9ec16ca..49cd44cb7 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -233,6 +233,9 @@ message ControlEnvironmentReply { string id = 1; string state = 2; uint32 currentRunNumber = 3; + string StartOfTransition = 4; + string EndOfTransition = 5; + string TransitionDuration = 6; } message ModifyEnvironmentRequest { diff --git a/core/server.go b/core/server.go index d0862fe5a..469d79567 100644 --- a/core/server.go +++ b/core/server.go @@ -358,7 +358,12 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir return nil, status.Newf(codes.InvalidArgument, "cannot prepare invalid transition %s", req.GetType().String()).Err() } + var sot, eot time.Time + var td time.Duration + sot = time.Now() err = env.TryTransition(trans) + eot = time.Now() + td = eot.Sub(sot) if err != nil { env.Sm.SetState("ERROR") @@ -368,6 +373,9 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir Id: env.Id().String(), State: env.CurrentState(), CurrentRunNumber: env.GetCurrentRunNumber(), + StartOfTransition: sot.Format(time.RFC3339Nano), + EndOfTransition: eot.Format(time.RFC3339Nano), + TransitionDuration: strconv.FormatFloat(td.Seconds(), 'f', 6, 64), } if err != nil { From f79f2f284418529042628389464acb7c9b635ed9 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 21 Mar 2022 14:40:45 +0100 Subject: [PATCH 1151/2352] [octrl-210] The start, end and duration of transitions are represented by an int64. --- coconut/control/control.go | 20 ++++++-------------- coconut/protos/o2control.pb.go | 24 ++++++++++++------------ core/protos/o2control.pb.go | 24 ++++++++++++------------ core/protos/o2control.proto | 6 +++--- core/server.go | 14 ++++++-------- 5 files changed, 39 insertions(+), 49 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 2764da9b9..9f9536d61 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -487,19 +487,11 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. rnString := formatRunNumber(response.GetCurrentRunNumber()) - sotTimestamp, err := time.Parse(time.RFC3339, response.GetStartOfTransition()) - var sotFormatted, eotFormatted string - if err == nil { - sotFormatted = sotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") - } else { - sotFormatted = "unknown" - } - eotTimestamp, err := time.Parse(time.RFC3339, response.GetEndOfTransition()) - if err == nil { - eotFormatted = eotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") - } else { - eotFormatted = "unknown" - } + sotTimestamp := time.Unix(0, response.GetStartOfTransition()) + sotFormatted := sotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") + eotTimestamp := time.Unix(0, response.GetEndOfTransition()) + eotFormatted := eotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") + tdTimestamp := time.Duration(response.GetTransitionDuration()) _, _ = fmt.Fprintln(o, "transition complete") _, _ = fmt.Fprintf(o, "environment id: %s\n", response.GetId()) @@ -507,7 +499,7 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) _, _ = fmt.Fprintf(o, "start of transition: %s\n", grey(sotFormatted)) _, _ = fmt.Fprintf(o, "end of transition: %s\n", grey(eotFormatted)) - _, _ = fmt.Fprintf(o, "transition duration: %ss\n", grey(response.GetTransitionDuration())) + _, _ = fmt.Fprintf(o, "transition duration: %ss\n", grey(strconv.FormatFloat(tdTimestamp.Seconds(), 'f', 6, 64))) return } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 56207d088..14d2735be 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1901,9 +1901,9 @@ type ControlEnvironmentReply struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition string `protobuf:"bytes,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` - EndOfTransition string `protobuf:"bytes,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` - TransitionDuration string `protobuf:"bytes,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` + StartOfTransition int64 `protobuf:"varint,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1959,25 +1959,25 @@ func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { return 0 } -func (x *ControlEnvironmentReply) GetStartOfTransition() string { +func (x *ControlEnvironmentReply) GetStartOfTransition() int64 { if x != nil { return x.StartOfTransition } - return "" + return 0 } -func (x *ControlEnvironmentReply) GetEndOfTransition() string { +func (x *ControlEnvironmentReply) GetEndOfTransition() int64 { if x != nil { return x.EndOfTransition } - return "" + return 0 } -func (x *ControlEnvironmentReply) GetTransitionDuration() string { +func (x *ControlEnvironmentReply) GetTransitionDuration() int64 { if x != nil { return x.TransitionDuration } - return "" + return 0 } type ModifyEnvironmentRequest struct { @@ -4872,13 +4872,13 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 56207d088..14d2735be 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1901,9 +1901,9 @@ type ControlEnvironmentReply struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition string `protobuf:"bytes,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` - EndOfTransition string `protobuf:"bytes,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` - TransitionDuration string `protobuf:"bytes,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` + StartOfTransition int64 `protobuf:"varint,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1959,25 +1959,25 @@ func (x *ControlEnvironmentReply) GetCurrentRunNumber() uint32 { return 0 } -func (x *ControlEnvironmentReply) GetStartOfTransition() string { +func (x *ControlEnvironmentReply) GetStartOfTransition() int64 { if x != nil { return x.StartOfTransition } - return "" + return 0 } -func (x *ControlEnvironmentReply) GetEndOfTransition() string { +func (x *ControlEnvironmentReply) GetEndOfTransition() int64 { if x != nil { return x.EndOfTransition } - return "" + return 0 } -func (x *ControlEnvironmentReply) GetTransitionDuration() string { +func (x *ControlEnvironmentReply) GetTransitionDuration() int64 { if x != nil { return x.TransitionDuration } - return "" + return 0 } type ModifyEnvironmentRequest struct { @@ -4872,13 +4872,13 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 49cd44cb7..8a69bbcff 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -233,9 +233,9 @@ message ControlEnvironmentReply { string id = 1; string state = 2; uint32 currentRunNumber = 3; - string StartOfTransition = 4; - string EndOfTransition = 5; - string TransitionDuration = 6; + int64 StartOfTransition = 4; + int64 EndOfTransition = 5; + int64 TransitionDuration = 6; } message ModifyEnvironmentRequest { diff --git a/core/server.go b/core/server.go index 469d79567..b22470039 100644 --- a/core/server.go +++ b/core/server.go @@ -358,12 +358,10 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir return nil, status.Newf(codes.InvalidArgument, "cannot prepare invalid transition %s", req.GetType().String()).Err() } - var sot, eot time.Time - var td time.Duration - sot = time.Now() + sot := time.Now() err = env.TryTransition(trans) - eot = time.Now() - td = eot.Sub(sot) + eot := time.Now() + td := eot.Sub(sot) if err != nil { env.Sm.SetState("ERROR") @@ -373,9 +371,9 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir Id: env.Id().String(), State: env.CurrentState(), CurrentRunNumber: env.GetCurrentRunNumber(), - StartOfTransition: sot.Format(time.RFC3339Nano), - EndOfTransition: eot.Format(time.RFC3339Nano), - TransitionDuration: strconv.FormatFloat(td.Seconds(), 'f', 6, 64), + StartOfTransition: sot.UnixNano(), + EndOfTransition: eot.UnixNano(), + TransitionDuration: td.Nanoseconds(), } if err != nil { From 7994b577ffcd7c70eafd7c3b6b2f99687548058c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 21 Mar 2022 15:18:13 +0100 Subject: [PATCH 1152/2352] [octrl-210] The timestamp of an environment's creation is represented by an int64. --- coconut/control/controlutil.go | 11 +++-------- coconut/protos/o2control.pb.go | 8 ++++---- core/protos/o2control.pb.go | 8 ++++---- core/protos/o2control.proto | 2 +- core/server.go | 6 +++--- core/servertypes.go | 12 +----------- 6 files changed, 16 insertions(+), 31 deletions(-) diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index 57dbcfe17..e8a7b617c 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -143,14 +143,9 @@ func drawTableShortTaskInfos(tasks []*pb.ShortTaskInfo, headers []string, linePr table.Render() } -func formatTimestamp(rfc3339timestamp string) string { - timestamp, err := time.Parse(time.RFC3339, rfc3339timestamp) - var formatted string - if err == nil { - formatted = timestamp.Local().Format("2006-01-02 15:04:05 MST") - } else { - formatted = "unknown" - } +func formatTimestamp(int64timestamp int64) string { + timestamp := time.Unix(0, int64timestamp) + formatted := timestamp.Local().Format("2006-01-02 15:04:05 MST") return formatted } diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 14d2735be..2b822474c 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1380,7 +1380,7 @@ type EnvironmentInfo struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` @@ -1431,11 +1431,11 @@ func (x *EnvironmentInfo) GetId() string { return "" } -func (x *EnvironmentInfo) GetCreatedWhen() string { +func (x *EnvironmentInfo) GetCreatedWhen() int64 { if x != nil { return x.CreatedWhen } - return "" + return 0 } func (x *EnvironmentInfo) GetState() string { @@ -4761,7 +4761,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 14d2735be..2b822474c 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1380,7 +1380,7 @@ type EnvironmentInfo struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen string `protobuf:"bytes,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` @@ -1431,11 +1431,11 @@ func (x *EnvironmentInfo) GetId() string { return "" } -func (x *EnvironmentInfo) GetCreatedWhen() string { +func (x *EnvironmentInfo) GetCreatedWhen() int64 { if x != nil { return x.CreatedWhen } - return "" + return 0 } func (x *EnvironmentInfo) GetState() string { @@ -4761,7 +4761,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 8a69bbcff..53b351485 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -176,7 +176,7 @@ message GetEnvironmentsReply { } message EnvironmentInfo { string id = 1; - string createdWhen = 2; + int64 createdWhen = 2; string state = 3; repeated ShortTaskInfo tasks = 4; string rootRole = 5; diff --git a/core/server.go b/core/server.go index b22470039..da96d7b6e 100644 --- a/core/server.go +++ b/core/server.go @@ -212,7 +212,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm tasks := env.Workflow().GetTasks() e := &pb.EnvironmentInfo{ Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().Format(time.RFC3339), + CreatedWhen: env.CreatedWhen().UnixNano(), State: env.CurrentState(), RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), @@ -276,7 +276,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme tasks := newEnv.Workflow().GetTasks() ei := &pb.EnvironmentInfo{ Id: newEnv.Id().String(), - CreatedWhen: newEnv.CreatedWhen().Format(time.RFC3339), + CreatedWhen: newEnv.CreatedWhen().UnixNano(), State: newEnv.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: newEnv.Workflow().GetName(), @@ -317,7 +317,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().Format(time.RFC3339), + CreatedWhen: env.CreatedWhen().UnixNano(), State: env.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), diff --git a/core/servertypes.go b/core/servertypes.go index 88f3a8ca8..203db70f1 100644 --- a/core/servertypes.go +++ b/core/servertypes.go @@ -25,8 +25,6 @@ package core import ( - "time" - pb "github.com/AliceO2Group/Control/core/protos" ) @@ -43,15 +41,7 @@ func (infos EnvironmentInfos) Less(i, j int) bool { if jv == nil { return false } - iTime, err := time.Parse(time.RFC3339, iv.CreatedWhen) - if err != nil { - return true - } - jTime, err := time.Parse(time.RFC3339, jv.CreatedWhen) - if err != nil { - return false - } - if iTime.Unix() < jTime.Unix() { + if iv.CreatedWhen < jv.CreatedWhen { return true } else { return false From 5cc41e7c26596bf07475defe8eb6ba69240a781c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 23 Mar 2022 16:34:04 +0100 Subject: [PATCH 1153/2352] [octrl-210-fix] The proto names of the timestamp variables are uniform with the rest of the code. --- coconut/protos/o2control.pb.go | 18 +++++++++--------- core/protos/o2control.pb.go | 18 +++++++++--------- core/protos/o2control.proto | 6 +++--- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 2b822474c..5dea53526 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1901,9 +1901,9 @@ type ControlEnvironmentReply struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition int64 `protobuf:"varint,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` - EndOfTransition int64 `protobuf:"varint,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` - TransitionDuration int64 `protobuf:"varint,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` + StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -4871,14 +4871,14 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 2b822474c..5dea53526 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1901,9 +1901,9 @@ type ControlEnvironmentReply struct { Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition int64 `protobuf:"varint,4,opt,name=StartOfTransition,proto3" json:"StartOfTransition,omitempty"` - EndOfTransition int64 `protobuf:"varint,5,opt,name=EndOfTransition,proto3" json:"EndOfTransition,omitempty"` - TransitionDuration int64 `protobuf:"varint,6,opt,name=TransitionDuration,proto3" json:"TransitionDuration,omitempty"` + StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -4871,14 +4871,14 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x45, 0x6e, 0x64, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 53b351485..d25710ee8 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -233,9 +233,9 @@ message ControlEnvironmentReply { string id = 1; string state = 2; uint32 currentRunNumber = 3; - int64 StartOfTransition = 4; - int64 EndOfTransition = 5; - int64 TransitionDuration = 6; + int64 startOfTransition = 4; + int64 endOfTransition = 5; + int64 transitionDuration = 6; } message ModifyEnvironmentRequest { From 298d8647a82f301b9db10463ab4ecb8c61c69042 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Mar 2022 17:41:03 +0100 Subject: [PATCH 1154/2352] [core] Always return EnvironmentInfo with envId on failed deployment --- core/environment/manager.go | 98 +++++++++++++------------- core/server.go | 134 +++++++++++++++++++++--------------- 2 files changed, 126 insertions(+), 106 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index d75fa9b45..4d0e85f6f 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2017-2018 CERN and copyright holders of ALICE O². + * Copyright 2017-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -46,12 +46,12 @@ import ( ) type Manager struct { - mu sync.RWMutex - m map[uid.ID]*Environment - taskman *task.Manager - incomingEventCh <-chan event.Event - pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent - pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent + mu sync.RWMutex + m map[uid.ID]*Environment + taskman *task.Manager + incomingEventCh <-chan event.Event + pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent + pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent } var ( @@ -64,17 +64,17 @@ func ManagerInstance() *Manager { func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manager { instance = &Manager{ - m: make(map[uid.ID]*Environment), - taskman: tm, - incomingEventCh: incomingEventCh, - pendingTeardownsCh: make(map[uid.ID]chan *event.TasksReleasedEvent), + m: make(map[uid.ID]*Environment), + taskman: tm, + incomingEventCh: incomingEventCh, + pendingTeardownsCh: make(map[uid.ID]chan *event.TasksReleasedEvent), pendingStateChangeCh: make(map[uid.ID]chan *event.TasksStateChangedEvent), } go func() { - for ;; { + for { select { - case incomingEvent := <- instance.incomingEventCh: + case incomingEvent := <-instance.incomingEventCh: switch typedEvent := incomingEvent.(type) { case event.DeviceEvent: instance.handleDeviceEvent(typedEvent) @@ -151,7 +151,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } log.WithFields(logrus.Fields{ - "workflow": workflowPath, + "workflow": workflowPath, "partition": newEnvId.String(), }).Info("creating new environment") @@ -163,13 +163,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env.UserVars.Set("environment_id", env.id.String()) // in case of err==nil, env will be false unless user - // set it to True which will be overwriten in server.go + // set it to True which will be overwritten in server.go env.Public, err = parseWorkflowPublicInfo(workflowPath) if err != nil { log.WithField("public info", env.Public). WithField("environment", env.Id().String()). WithError(err). Warn("parse workflow public info failed.") + return newEnvId, fmt.Errorf("workflow public info parsing failed: %w", err) } // We load the workflow (includes template processing) @@ -242,19 +243,19 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // We do not get the error here cause it overwrites the failed deployment error // with which results to server.go to report back // cannot get newly created environment: no environment with id - _ = envs.TeardownEnvironment(env.Id(), true/*force*/) + _ = envs.TeardownEnvironment(env.Id(), true /*force*/) killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) if rlsErr != nil { log.WithError(rlsErr).Warn("task teardown error") } log.WithFields(logrus.Fields{ - "killedCount": len(killedTasks), + "killedCount": len(killedTasks), "lastEnvState": envState, - "level": infologger.IL_Support, - "partition": env.Id().String(), + "level": infologger.IL_Support, + "partition": env.Id().String(), }). - Info("environment deployment failed, tasks were cleaned up") + Info("environment deployment failed, tasks were cleaned up") log.WithField("partition", env.Id().String()).Info("environment teardown complete") return env.id, err @@ -295,7 +296,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error hooksForWeight, ok := hooksMapForDestroy[weight] if ok { for _, hook := range hooksForWeight { - for i := len(tasksToRelease)-1; i >= 0; i-- { + for i := len(tasksToRelease) - 1; i >= 0; i-- { if hook == tasksToRelease[i] { tasksToRelease = append(tasksToRelease[:i], tasksToRelease[i+1:]...) } @@ -314,11 +315,10 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error delete(envs.pendingStateChangeCh, environmentId) envs.mu.Unlock() - // We set all callRoles to INACTIVE right now, because there's no task activation for them. // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. allHooks := env.Workflow().GetAllHooks() - callHooks := allHooks.FilterCalls() // get the calls + callHooks := allHooks.FilterCalls() // get the calls if len(callHooks) > 0 { for _, h := range callHooks { pr, ok := h.GetParentRole().(workflow.PublicUpdatable) @@ -335,15 +335,15 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage - incomingEv := <- pendingCh + incomingEv := <-pendingCh // If some tasks failed to release if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": environmentId, - }). + "taskId": taskId, + "environmentId": environmentId, + }). WithError(err). Warn("task failed to release") } @@ -378,17 +378,17 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error envs.mu.Unlock() envs.taskman.MessageChannel <- taskmanMessage - incomingEv = <- pendingCh + incomingEv = <-pendingCh // If some cleanup hooks failed to release if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { log.WithFields(logrus.Fields{ - "taskId": taskId, + "taskId": taskId, "environmentId": environmentId, }). - WithError(err). - Warn("task failed to release") + WithError(err). + Warn("task failed to release") } err = fmt.Errorf("%d tasks failed to release for environment %s", len(taskReleaseErrors), environmentId) @@ -456,11 +456,11 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if btt, ok := evt.(*event.BasicTaskTerminated); ok { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "exitCode": btt.ExitCode, - "stdout": btt.Stdout, - "stderr": btt.Stderr, + "exitCode": btt.ExitCode, + "stdout": btt.Stdout, + "stderr": btt.Stderr, "finalMesosState": btt.FinalMesosState.String(), - "level" : infologger.IL_Devel, + "level": infologger.IL_Devel, }). Debug("basic task terminated") @@ -469,14 +469,14 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { t := envs.taskman.GetTask(taskId.Value) isHook := false if t != nil { - t.SendEvent(&event.TaskEvent{Name: t.GetName(), TaskID: taskId.Value, Status: btt.FinalMesosState.String(), Hostname: t.GetHostname() , ClassName: t.GetClassName()}) + t.SendEvent(&event.TaskEvent{Name: t.GetName(), TaskID: taskId.Value, Status: btt.FinalMesosState.String(), Hostname: t.GetHostname(), ClassName: t.GetClassName()}) if parentRole, ok := t.GetParentRole().(workflow.Role); ok { parentRole.SetRuntimeVars(map[string]string{ - "taskResult.exitCode": strconv.Itoa(btt.ExitCode), - "taskResult.stdout": btt.Stdout, - "taskResult.stderr": btt.Stderr, + "taskResult.exitCode": strconv.Itoa(btt.ExitCode), + "taskResult.stdout": btt.Stdout, + "taskResult.stderr": btt.Stderr, "taskResult.finalStatus": btt.FinalMesosState.String(), - "taskResult.timestamp": utils.NewUnixTimestamp(), + "taskResult.timestamp": utils.NewUnixTimestamp(), }) // If it's an update following a HOOK execution @@ -518,7 +518,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if env.CurrentState() == "RUNNING" { t.SetSafeToStop(true) // we mark this specific task as ok to STOP go func() { - if env.IsSafeToStop() { // but then we ask the env whether *all* of them are + if env.IsSafeToStop() { // but then we ask the env whether *all* of them are err = env.TryTransition(NewStopActivityTransition(envs.taskman)) if err != nil { log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") @@ -553,7 +553,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } log.WithFields(logrus.Fields{ - "workflow": workflowPath, + "workflow": workflowPath, "partition": newEnvId.String(), }).Info("creating new automatic environment") @@ -612,7 +612,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally - err = envs.TeardownEnvironment(env.Id(), true/*force*/) + err = envs.TeardownEnvironment(env.Id(), true /*force*/) if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) } @@ -622,12 +622,12 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str log.WithError(rlsErr).Warn("task teardown error") } log.WithFields(logrus.Fields{ - "killedCount": len(killedTasks), + "killedCount": len(killedTasks), "lastEnvState": envState, - "level": infologger.IL_Support, - "partition": env.Id().String(), + "level": infologger.IL_Support, + "partition": env.Id().String(), }). - Info("environment deployment failed, tasks were cleaned up") + Info("environment deployment failed, tasks were cleaned up") log.WithField("partition", env.Id().String()).Info("environment teardown complete") return } @@ -645,12 +645,12 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str err = env.TryTransition(trans) if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - return + return } for { envState := env.CurrentState() - switch envState { + switch envState { case "CONFIGURED": // RUN finished so we can reset and delete the environment err := env.TryTransition(NewResetTransition(envs.taskman)) diff --git a/core/server.go b/core/server.go index da96d7b6e..5b46fa6ca 100644 --- a/core/server.go +++ b/core/server.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018-2020 CERN and copyright holders of ALICE O². + * Copyright 2018-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -53,11 +53,10 @@ import ( "google.golang.org/grpc/status" ) - func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ - state: state, + state: state, streams: newSafeStreamsMap(), }) // Register reflection service on gRPC server. @@ -84,8 +83,8 @@ func (m *RpcServer) logMethod() { // Implements interface pb.ControlServer type RpcServer struct { - state *globalState - streams SafeStreamsMap + state *globalState + streams SafeStreamsMap } func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { @@ -194,7 +193,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm m.logMethod() r := &pb.GetEnvironmentsReply{ - FrameworkId: m.state.taskman.GetFrameworkID(), + FrameworkId: m.state.taskman.GetFrameworkID(), Environments: make(EnvironmentInfos, 0, 0), } for _, id := range m.state.environments.Ids() { @@ -211,15 +210,15 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm } tasks := env.Workflow().GetTasks() e := &pb.EnvironmentInfo{ - Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixNano(), - State: env.CurrentState(), - RootRole: env.Workflow().GetName(), - CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: env.GlobalDefaults.Raw(), - Vars: env.GlobalVars.Raw(), - UserVars: env.UserVars.Raw(), - NumberOfFlps: int32(len(env.GetFLPs())), + Id: env.Id().String(), + CreatedWhen: env.CreatedWhen().UnixNano(), + State: env.CurrentState(), + RootRole: env.Workflow().GetName(), + CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: env.GlobalDefaults.Raw(), + Vars: env.GlobalVars.Raw(), + UserVars: env.UserVars.Raw(), + NumberOfFlps: int32(len(env.GetFLPs())), } if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) @@ -233,7 +232,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm return r, nil } -func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (*pb.NewEnvironmentReply, error) { +func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (reply *pb.NewEnvironmentReply, err error) { m.logMethod() // NEW_ENVIRONMENT transition // The following should @@ -258,15 +257,36 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme // return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() //} + reply = &pb.NewEnvironmentReply{Public: request.Public} + // Create new Environment instance with some roles, we get back a UUID - id, err := m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) + id := uid.NilID() + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) if err != nil { - return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() + err = status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() + reply.Environment = &pb.EnvironmentInfo{ + Id: id.String(), + CreatedWhen: time.Now().UnixNano(), + State: "ERROR", // not really, but close + UserVars: request.GetVars(), + NumberOfFlps: 0, + } + + return } newEnv, err := m.state.environments.Environment(id) if err != nil { - return nil, status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()).Err() + err = status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()).Err() + reply.Environment = &pb.EnvironmentInfo{ + Id: id.String(), + CreatedWhen: time.Now().UnixNano(), + State: "ERROR", // not really, but close + UserVars: request.GetVars(), + NumberOfFlps: 0, + } + + return } if request.Public { @@ -285,13 +305,13 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Vars: newEnv.GlobalVars.Raw(), UserVars: newEnv.UserVars.Raw(), NumberOfFlps: int32(len(newEnv.GetFLPs())), + IncludedDetectors: newEnv.GetActiveDetectors().StringList(), } - ei.IncludedDetectors = newEnv.GetActiveDetectors().StringList() - r := &pb.NewEnvironmentReply{ + reply = &pb.NewEnvironmentReply{ Environment: ei, - Public: newEnv.Public, + Public: newEnv.Public, } - return r, err + return } func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (reply *pb.GetEnvironmentReply, err error) { @@ -316,16 +336,16 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe tasks := env.Workflow().GetTasks() reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ - Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixNano(), - State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: env.Workflow().GetName(), + Id: env.Id().String(), + CreatedWhen: env.CreatedWhen().UnixNano(), + State: env.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: env.Workflow().GetName(), CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: env.GlobalDefaults.Raw(), - Vars: env.GlobalVars.Raw(), - UserVars: env.UserVars.Raw(), - NumberOfFlps: int32(len(env.GetFLPs())), + Defaults: env.GlobalDefaults.Raw(), + Vars: env.GlobalVars.Raw(), + UserVars: env.UserVars.Raw(), + NumberOfFlps: int32(len(env.GetFLPs())), }, Public: env.Public, } @@ -368,11 +388,11 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir } reply := &pb.ControlEnvironmentReply{ - Id: env.Id().String(), - State: env.CurrentState(), - CurrentRunNumber: env.GetCurrentRunNumber(), - StartOfTransition: sot.UnixNano(), - EndOfTransition: eot.UnixNano(), + Id: env.Id().String(), + State: env.CurrentState(), + CurrentRunNumber: env.GetCurrentRunNumber(), + StartOfTransition: sot.UnixNano(), + EndOfTransition: eot.UnixNano(), TransitionDuration: td.Nanoseconds(), } @@ -407,7 +427,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } - // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. + // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. if req.Force { return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) } @@ -416,7 +436,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) if err != nil { log.Warn("could not perform STOP transition for environment teardown, forcing") - return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) + return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } } @@ -432,7 +452,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if !canDestroy { log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) - return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) + return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } // This might transition to STANDBY if needed, or do nothing if we're already there @@ -440,7 +460,7 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_RESET)) if err != nil { log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) - return m.doTeardownAndCleanup(env, true/*force*/, false/*keepTasks*/) + return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } } @@ -534,15 +554,15 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge Task: &pb.TaskInfo{ ShortInfo: taskToShortTaskInfo(task, m.state.taskman), ClassInfo: &pb.TaskClassInfo{ - Name: task.GetClassName(), + Name: task.GetClassName(), ControlMode: task.GetControlMode().String(), }, - InboundChannels: inboundChannelsToPbChannels(inbound), + InboundChannels: inboundChannelsToPbChannels(inbound), OutboundChannels: outboundChannelsToPbChannels(outbound), - CommandInfo: commandInfoToPbCommandInfo(commandInfo), - TaskPath: taskPath, - EnvId: task.GetEnvironmentId().String(), - Properties: task.GetProperties(), + CommandInfo: commandInfoToPbCommandInfo(commandInfo), + TaskPath: taskPath, + EnvId: task.GetEnvironmentId().String(), + Properties: task.GetProperties(), }, } return rep, nil @@ -562,7 +582,7 @@ func (m *RpcServer) CleanupTasks(cxt context.Context, req *pb.CleanupTasksReques } func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.ShortTaskInfo, runningTaskInfos []*pb.ShortTaskInfo, err error) { - var( + var ( killedTasks, runningTasks task.Tasks ) if len(taskIds) == 0 { // by default we try to kill all, best effort @@ -612,7 +632,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo workflowMap, numWorkflows, err := the.RepoManager().GetWorkflowTemplates(req.GetRepoPattern(), req.GetRevisionPattern(), req.GetAllBranches(), req.GetAllTags(), req.GetAllWorkflows()) if err != nil { - return nil, status.New(codes.InvalidArgument, "cannot query available workflows for " + req.GetRepoPattern() + "@" + req.GetRevisionPattern() + ": " + + return nil, status.New(codes.InvalidArgument, "cannot query available workflows for "+req.GetRepoPattern()+"@"+req.GetRevisionPattern()+": "+ err.Error()).Err() } @@ -640,7 +660,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo // First we take care of overriding any WFT VarSpec defaults with Apricot vars varSpecMap := template.VarInfo for k, v := range varSpecMap { - if v.Source == varsource.WorkflowDefaults { // if this varSpec was declared as a default + if v.Source == varsource.WorkflowDefaults { // if this varSpec was declared as a default if apricotValue, exists := vars[k]; exists { // and a corresponding Apricot var exists v.DefaultValue = apricotValue varSpecMap[k] = v @@ -650,10 +670,10 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo // Finally, we build the protobuf response workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{ - Repo: string(repo), - Revision: string(revision), - Template: template.Name, - VarSpecMap: VarSpecMapToPbVarSpecMap(varSpecMap) } + Repo: string(repo), + Revision: string(revision), + Template: template.Name, + VarSpecMap: VarSpecMapToPbVarSpecMap(varSpecMap)} i++ } } @@ -789,7 +809,7 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD info, err := the.RepoManager().UpdateDefaultRevisionByIndex(int(req.Index), req.Revision) if err != nil { return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is filled with available revisions - // err can't be set here, otherwise the response will be empty + // err can't be set here, otherwise the response will be empty } return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is empty @@ -803,7 +823,7 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe continue } select { - case event, ok := <- ch: + case event, ok := <-ch: if !ok { m.streams.delete(req.GetId()) return nil @@ -826,4 +846,4 @@ func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoE go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) r := &pb.NewAutoEnvironmentReply{} return r, nil -} +} From 432b3319ce6c92c577582f945aa79b5d34d85f1e Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 11 Mar 2022 10:46:34 +0100 Subject: [PATCH 1155/2352] [octrl-161] The workflow template description is associated with environment info. --- coconut/control/control.go | 7 +- coconut/protos/o2control.pb.go | 1205 ++++++++++++++++--------------- core/environment/environment.go | 1 + core/environment/manager.go | 6 +- core/environment/utils.go | 14 +- core/protos/o2control.pb.go | 1205 ++++++++++++++++--------------- core/protos/o2control.proto | 2 + core/repos/localrepo.go | 4 +- core/repos/repo.go | 4 +- core/repos/repomanager.go | 7 +- core/repos/repoutils.go | 15 +- core/server.go | 23 +- 12 files changed, 1277 insertions(+), 1216 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 9f9536d61..b8ca55b71 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -230,7 +230,7 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com fmt.Fprintln(o, "no environments running") } else { table := tablewriter.NewWriter(o) - table.SetHeader([]string{"id", "root role", "created", "state"}) + table.SetHeader([]string{"id", "workflow template", "created", "state"}) table.SetBorder(false) fg := tablewriter.Colors{tablewriter.Bold, tablewriter.FgYellowColor} table.SetHeaderColor(fg, fg, fg, fg) @@ -352,8 +352,9 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C tasks := env.GetTasks() _, _ = fmt.Fprintf(o, "new environment created with %s tasks\n", blue(len(tasks))) _, _ = fmt.Fprintf(o, "environment id: %s\n", grey(env.GetId())) + _, _ = fmt.Fprintf(o, "workflow template: %s\n", env.GetRootRole()) + _, _ = fmt.Fprintf(o, "description: %s\n", env.GetDescription()) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) - _, _ = fmt.Fprintf(o, "root role: %s\n", env.GetRootRole()) _, _ = fmt.Fprintf(o, "public: %v\n", response.Public) var ( @@ -424,6 +425,8 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com ) _, _ = fmt.Fprintf(o, "environment id: %s\n", env.GetId()) + _, _ = fmt.Fprintf(o, "workflow template: %s\n", env.GetRootRole()) + _, _ = fmt.Fprintf(o, "description: %s\n", env.GetDescription()) _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "public: %t\n", response.Public) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 5dea53526..4c993d92f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1390,6 +1390,7 @@ type EnvironmentInfo struct { UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` + Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1501,6 +1502,13 @@ func (x *EnvironmentInfo) GetIncludedDetectors() []string { return nil } +func (x *EnvironmentInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3376,6 +3384,7 @@ type RoleInfo struct { Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Description string `protobuf:"bytes,11,opt,name=description,proto3" json:"description,omitempty"` } func (x *RoleInfo) Reset() { @@ -3480,6 +3489,13 @@ func (x *RoleInfo) GetConsolidatedStack() map[string]string { return nil } +func (x *RoleInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type GetRolesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4758,7 +4774,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xbe, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4788,609 +4804,614 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, - 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, + 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, + 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, - 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, - 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, - 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, - 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, - 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, - 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, + 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, + 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, + 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, + 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, + 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, + 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, + 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, + 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, - 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, - 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, - 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, - 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, - 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, - 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, - 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, - 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, - 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, - 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, - 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, - 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, + 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, + 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, + 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, + 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, - 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, - 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/environment/environment.go b/core/environment/environment.go index e72826e76..07000ecbd 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -77,6 +77,7 @@ type Environment struct { unsubscribe chan struct{} eventStream Subscription Public bool // From workflow or user + Description string // From workflow callsPendingAwait map[string /*await expression, trigger only*/]callable.CallsMap } diff --git a/core/environment/manager.go b/core/environment/manager.go index 4d0e85f6f..0687afd35 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -164,7 +164,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // in case of err==nil, env will be false unless user // set it to True which will be overwritten in server.go - env.Public, err = parseWorkflowPublicInfo(workflowPath) + env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) if err != nil { log.WithField("public info", env.Public). WithField("environment", env.Id().String()). @@ -569,7 +569,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // in case of err==nil, env will be false unless user // set it to True which will be overwriten in server.go - env.Public, err = parseWorkflowPublicInfo(workflowPath) + env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) if err != nil { log.WithField("public info", env.Public). WithField("environment", env.Id().String()). @@ -584,7 +584,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - env.Public, _ = parseWorkflowPublicInfo(workflowPath) + env.Public, env.Description, _ = parseWorkflowPublicInfo(workflowPath) envs.mu.Lock() envs.m[env.id] = env diff --git a/core/environment/utils.go b/core/environment/utils.go index 2972bfef6..791425bfb 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -35,28 +35,32 @@ import ( "gopkg.in/yaml.v3" ) -func parseWorkflowPublicInfo(workflowExpr string) (bool, error) { +func parseWorkflowPublicInfo(workflowExpr string) (bool, string, error) { repoManager := the.RepoManager() resolvedWorkflowPath, _, err := repoManager.GetWorkflow(workflowExpr) //Will fail if repo unknown if err != nil { - return false, err + return false, "", err } yamlFile, err := ioutil.ReadFile(resolvedWorkflowPath) if err != nil { - return false, err + return false, "", err } nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) if err != nil { - return false, err + return false, "", err } + description := "" isPublic := nodes["name"].Tag == "!public" + if nodes["description"].Tag == "!public" { + description = nodes["description"].Value + } - return isPublic, nil + return isPublic, description, nil } func JSONSliceToSlice(payload string) (slice []string, err error) { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 5dea53526..4c993d92f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1390,6 +1390,7 @@ type EnvironmentInfo struct { UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` + Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1501,6 +1502,13 @@ func (x *EnvironmentInfo) GetIncludedDetectors() []string { return nil } +func (x *EnvironmentInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3376,6 +3384,7 @@ type RoleInfo struct { Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` ConsolidatedStack map[string]string `protobuf:"bytes,10,rep,name=consolidatedStack,proto3" json:"consolidatedStack,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Description string `protobuf:"bytes,11,opt,name=description,proto3" json:"description,omitempty"` } func (x *RoleInfo) Reset() { @@ -3480,6 +3489,13 @@ func (x *RoleInfo) GetConsolidatedStack() map[string]string { return nil } +func (x *RoleInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type GetRolesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4758,7 +4774,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x9c, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xbe, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4788,609 +4804,614 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, - 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, - 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, + 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, + 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, + 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, + 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, - 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, - 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, - 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, - 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, - 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, - 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, - 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, - 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, + 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, + 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, + 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, + 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, + 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, + 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, + 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, + 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, + 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, + 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, - 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xb1, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, - 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, - 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, - 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, - 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, - 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, - 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, - 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, - 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, - 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0x8d, - 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, - 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, - 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, - 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, - 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, + 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, + 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, + 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, + 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, + 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, + 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, + 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, - 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, - 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index d25710ee8..eff46561a 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -186,6 +186,7 @@ message EnvironmentInfo { map userVars = 9; int32 numberOfFlps = 10; repeated string includedDetectors = 11; + string description = 12; } message NewEnvironmentRequest { @@ -382,6 +383,7 @@ message RoleInfo { map vars = 8; map userVars = 9; map consolidatedStack = 10; + string description = 11; } message GetRolesReply { diff --git a/core/repos/localrepo.go b/core/repos/localrepo.go index 7cfffd5fb..fff4768fc 100644 --- a/core/repos/localrepo.go +++ b/core/repos/localrepo.go @@ -147,12 +147,12 @@ func (r *localRepo) getWorkflows(revisionPattern string, _ []string, _ bool) (Te if strings.HasSuffix(file.Name(), ".yaml") { templateName := strings.TrimSuffix(file.Name(), ".yaml") workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) - isPublic, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + isPublic, description, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) if err != nil { return nil, err } templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], - Template{templateName, isPublic, varSpecMap}) + Template{templateName, description, isPublic, varSpecMap}) } } diff --git a/core/repos/repo.go b/core/repos/repo.go index d165728a0..fc17a4844 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -425,12 +425,12 @@ func (r *Repo) populateWorkflows(revisionPattern string, clear bool) error { if strings.HasSuffix(file.Name(), ".yaml") { templateName := strings.TrimSuffix(file.Name(), ".yaml") workflowPath := filepath.Join(r.getWorkflowDir(), file.Name()) - isPublic, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) + isPublic, description, varSpecMap, err := ParseWorkflowPublicVariableInfo(workflowPath) if err != nil { return err } templatesCache[RevisionKey(revision)] = append(templatesCache[RevisionKey(revision)], - Template{templateName, isPublic, varSpecMap}) + Template{templateName, description, isPublic, varSpecMap}) } } } diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 871842e55..2b853a0ef 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -642,9 +642,10 @@ func (manager *RepoManager) GetOrderedRepolistKeys() []string { type RepoKey string type RevisionKey string type Template struct { - Name string - Public bool - VarInfo VarSpecMap + Name string + Description string + Public bool + VarInfo VarSpecMap } type Templates []Template type TemplatesByRevision map[RevisionKey]Templates diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 732050376..b23ddff49 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -33,24 +33,29 @@ import ( "gopkg.in/yaml.v3" ) -func ParseWorkflowPublicVariableInfo(fileName string) (bool, VarSpecMap, error) { +func ParseWorkflowPublicVariableInfo(fileName string) (bool, string, VarSpecMap, error) { yamlFile, err := ioutil.ReadFile(fileName) - if err != nil { return false, nil, err } + if err != nil { return false, "", nil, err } nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) - if err != nil { return false, nil, err } + if err != nil { return false, "", nil, err } isPublic := nodes["name"].Tag == "!public" + description := "" + if nodes["description"].Tag == "!public" { + description = nodes["description"].Value + } + workflowVarInfo := make(VarSpecMap) for k, v := range nodes { if err = parseYamlPublicVars(&AuxNode{k, &v }, &workflowVarInfo); err != nil { - return false, nil, err + return false, "", nil, err } } - return isPublic, workflowVarInfo, nil + return isPublic, description, workflowVarInfo, nil } // VarSpecMap holds a map of variable names to their variable information struct diff --git a/core/server.go b/core/server.go index 5b46fa6ca..9bdcb0ef6 100644 --- a/core/server.go +++ b/core/server.go @@ -214,6 +214,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm CreatedWhen: env.CreatedWhen().UnixNano(), State: env.CurrentState(), RootRole: env.Workflow().GetName(), + Description: env.Workflow().GetDescription(), CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), @@ -295,16 +296,17 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme tasks := newEnv.Workflow().GetTasks() ei := &pb.EnvironmentInfo{ - Id: newEnv.Id().String(), - CreatedWhen: newEnv.CreatedWhen().UnixNano(), - State: newEnv.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: newEnv.Workflow().GetName(), - CurrentRunNumber: newEnv.GetCurrentRunNumber(), - Defaults: newEnv.GlobalDefaults.Raw(), - Vars: newEnv.GlobalVars.Raw(), - UserVars: newEnv.UserVars.Raw(), - NumberOfFlps: int32(len(newEnv.GetFLPs())), + Id: newEnv.Id().String(), + CreatedWhen: newEnv.CreatedWhen().UnixNano(), + State: newEnv.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: newEnv.Workflow().GetName(), + Description: newEnv.Workflow().GetDescription(), + CurrentRunNumber: newEnv.GetCurrentRunNumber(), + Defaults: newEnv.GlobalDefaults.Raw(), + Vars: newEnv.GlobalVars.Raw(), + UserVars: newEnv.UserVars.Raw(), + NumberOfFlps: int32(len(newEnv.GetFLPs())), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), } reply = &pb.NewEnvironmentReply{ @@ -341,6 +343,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe State: env.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), + Description: env.Workflow().GetDescription(), CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), From 9d73952894de0d8a22c6b72ca18586c5c8458ff3 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 15 Mar 2022 09:42:28 +0100 Subject: [PATCH 1156/2352] [octrl-161] The workflow template description doesn't need to go through the roles. --- core/server.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/server.go b/core/server.go index 9bdcb0ef6..cc868d458 100644 --- a/core/server.go +++ b/core/server.go @@ -214,7 +214,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm CreatedWhen: env.CreatedWhen().UnixNano(), State: env.CurrentState(), RootRole: env.Workflow().GetName(), - Description: env.Workflow().GetDescription(), + Description: env.Description, CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), @@ -301,7 +301,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme State: newEnv.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: newEnv.Workflow().GetName(), - Description: newEnv.Workflow().GetDescription(), + Description: newEnv.Description, CurrentRunNumber: newEnv.GetCurrentRunNumber(), Defaults: newEnv.GlobalDefaults.Raw(), Vars: newEnv.GlobalVars.Raw(), @@ -343,7 +343,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe State: env.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), - Description: env.Workflow().GetDescription(), + Description: env.Description, CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), From 39daca9d15c6b0f826ac2d24565a8822dcad3654 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Mar 2022 11:33:37 +0100 Subject: [PATCH 1157/2352] [build] Update ODC protofile URL --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 1986e43bf..d6d2283f5 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ CGO_LDFLAGS=CGO_LDFLAGS="$(ROOT_DIR)/vendor/infoLoggerForGo/infoLoggerForGo.a -s BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) endif REPOPATH = github.com/AliceO2Group/Control -ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/grpc-proto/odc.proto" +ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/odc/grpc/odc.proto" DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master/src/DataDistControl/DataDistControl.proto" VERBOSE_1 := -v From 309379f77ccd3df7e6112e91c5262169f88cff5d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Mar 2022 13:22:23 +0100 Subject: [PATCH 1158/2352] [core] Propagate ODC timeouts to the server side + odc_padding_timeout --- core/integration/odc/handlers.go | 334 ++++++++++++++++++------------- core/integration/odc/plugin.go | 157 ++++++++------- 2 files changed, 276 insertions(+), 215 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index bd4166bda..fe480673e 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -46,14 +46,14 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) req := &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, + Path: "", + Detailed: false, } var ( - err error = nil - newState = "UNKNOWN" - rep *odcpb.StateReply + err error = nil + newState = "UNKNOWN" + rep *odcpb.StateReply ) if envId == "" { @@ -79,29 +79,20 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st return newState, fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "partition": rep.Reply.Partitionid, + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, - "odcState": rep.Reply.State, + "odcState": rep.Reply.State, }). Debug("call to ODC complete: odc.GetState") return odcutils.StateForOdcState(newState), err } -func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string, runNumber uint64) error { +func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) - req := &odcpb.StartRequest{ - Request: &odcpb.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - Runnr: runNumber, - }, - } - var err error = nil var rep *odcpb.StateReply @@ -112,9 +103,14 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string // SetProperties before START setPropertiesRequest := &odcpb.SetPropertiesRequest{ Partitionid: envId, - Path: "", - Properties: make([]*odcpb.Property, len(arguments)), - Runnr: runNumber, + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + Runnr: runNumber, + } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + setPropertiesRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } // Extract relevant parameters from Arguments payload @@ -150,12 +146,26 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string "odcMsg": setPropertiesResponse.Msg, "odcStatus": setPropertiesResponse.Status.String(), "odcExectime": setPropertiesResponse.Exectime, - "partition": setPropertiesResponse.Partitionid, + "partition": setPropertiesResponse.Partitionid, "odcSessionid": setPropertiesResponse.Sessionid, }). Debug("call to ODC complete: odc.SetProperties") // The actual START operation starts here + req := &odcpb.StartRequest{ + Request: &odcpb.StateRequest{ + Partitionid: envId, + Path: "", + Detailed: false, + Runnr: runNumber, + }, + } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok = ctx.Deadline() + if ok { + req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } + rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) if err != nil { return printGrpcError(err) @@ -174,26 +184,31 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string } log.WithField("partition", envId). WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "partition": rep.Reply.Partitionid, + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete: odc.Start") return err } -func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string, runNumber uint64) error { +func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) req := &odcpb.StopRequest{ - Request: &odcpb.StateRequest{ + Request: &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, - Runnr: runNumber, + Path: "", + Detailed: false, + Runnr: runNumber, }, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var err error = nil var rep *odcpb.StateReply @@ -220,43 +235,41 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] } log.WithField("partition", envId). WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "partition": rep.Reply.Partitionid, + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete: odc.Stop") return err } - -func handlePartitionTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handlePartitionTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } - err := doTerminate(ctx, odcClient, arguments, envId) + err := doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } - err = doShutdown(ctx, odcClient, arguments, envId) + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } return nil } - -func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } - err := doReset(ctx, odcClient, arguments, envId) + err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } @@ -264,31 +277,30 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return nil } - -func handleResetLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleResetLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } - err := doReset(ctx, odcClient, arguments, envId) + err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } - err = doTerminate(ctx, odcClient, arguments, envId) + err = doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } - err = doShutdown(ctx, odcClient, arguments, envId) + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { return printGrpcError(err) } return nil } -func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -296,7 +308,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma // This function tries to perform the regular teardown sequence. // Since Shutdown is supposed to work in any state, we don't bail on error. - err := doReset(ctx, odcClient, arguments, envId) + err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -304,7 +316,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma Warn("ODC Reset call failed") } - err = doTerminate(ctx, odcClient, arguments, envId) + err = doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -312,7 +324,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma Warn("ODC Terminate call failed") } - err = doShutdown(ctx, odcClient, arguments, envId) + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -322,7 +334,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma return nil // We clobber the error because nothing can be done for a failed cleanup } -func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { log.WithField("partition", envId). Debug("handleCleanup starting") defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) @@ -351,9 +363,9 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri } log.WithField("partition", envId). WithFields(logrus.Fields{ - "odcCall": "Status", - "odcMsg": rep.GetMsg(), - "odcStatus": rep.GetStatus().String(), + "odcCall": "Status", + "odcMsg": rep.GetMsg(), + "odcStatus": rep.GetStatus().String(), "odcExectime": rep.GetExectime(), }). Debug("call to ODC complete: odc.GetStatus") @@ -404,7 +416,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri for odcPartitionId, _ := range partitionsToClean { go func(odcPartitionId string) { defer wg.Done() - err = doShutdown(ctx, odcClient, arguments, odcPartitionId) // FIXME make this parallel + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, odcPartitionId) // FIXME make this parallel if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -418,15 +430,20 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri return nil // We clobber the error because nothing can be done for a failed cleanup } -func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { // RESET req := &odcpb.ResetRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, + Path: "", + Detailed: false, }, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var err error = nil var rep *odcpb.StateReply @@ -448,25 +465,30 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "partition": rep.Reply.Partitionid, - "odcSessionid": rep.Reply.Sessionid, - }). + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "partition": rep.Reply.Partitionid, + "odcSessionid": rep.Reply.Sessionid, + }). Debug("call to ODC complete: odc.Reset") return err } -func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { // TERMINATE req := &odcpb.TerminateRequest{ - Request: &odcpb.StateRequest{ + Request: &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, + Path: "", + Detailed: false, }, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var err error = nil var rep *odcpb.StateReply @@ -488,21 +510,26 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": rep.Reply.Msg, - "odcStatus": rep.Reply.Status.String(), - "odcExectime": rep.Reply.Exectime, - "partition": rep.Reply.Partitionid, + "odcMsg": rep.Reply.Msg, + "odcStatus": rep.Reply.Status.String(), + "odcExectime": rep.Reply.Exectime, + "partition": rep.Reply.Partitionid, "odcSessionid": rep.Reply.Sessionid, }). Debug("call to ODC complete: odc.Terminate") return err } -func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error{ +func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { // SHUTDOWN shutdownRequest := &odcpb.ShutdownRequest{ Partitionid: envId, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + shutdownRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var err error = nil var shutdownResponse *odcpb.GeneralReply @@ -523,17 +550,17 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": shutdownResponse.Msg, - "odcStatus": shutdownResponse.Status.String(), - "odcExectime": shutdownResponse.Exectime, - "partition": shutdownResponse.Partitionid, + "odcMsg": shutdownResponse.Msg, + "odcStatus": shutdownResponse.Status.String(), + "odcExectime": shutdownResponse.Exectime, + "partition": shutdownResponse.Partitionid, "odcSessionid": shutdownResponse.Sessionid, }). Debug("call to ODC complete: odc.Shutdown") return err } -func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, arguments map[string]string, envId string) error { +func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -565,8 +592,13 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu runRequest := &odcpb.RunRequest{ Partitionid: envId, - Plugin: plugin, - Resources: resources, + Plugin: plugin, + Resources: resources, + } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + runRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } if isManualXml { @@ -595,18 +627,17 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) } log.WithFields(logrus.Fields{ - "odcMsg": runResponse.Msg, - "odcStatus": runResponse.Status.String(), - "odcExectime": runResponse.Exectime, - "partition": runResponse.Partitionid, - "odcSessionid": runResponse.Sessionid, - }). + "odcMsg": runResponse.Msg, + "odcStatus": runResponse.Status.String(), + "odcExectime": runResponse.Exectime, + "partition": runResponse.Partitionid, + "odcSessionid": runResponse.Sessionid, + }). Debug("call to ODC complete: odc.Run") return err } - -func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, envId string) error { +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -617,8 +648,13 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st // SetProperties before CONFIGURE setPropertiesRequest := &odcpb.SetPropertiesRequest{ Partitionid: envId, - Path: "", - Properties: make([]*odcpb.Property, len(arguments)), + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + setPropertiesRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } // Extract relevant parameters from Arguments payload @@ -641,7 +677,6 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return printGrpcError(err) } - if setPropertiesResponse == nil { log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") @@ -663,23 +698,27 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") log.WithFields(logrus.Fields{ - "odcMsg": setPropertiesResponse.Msg, - "odcStatus": setPropertiesResponse.Status.String(), - "odcExectime": setPropertiesResponse.Exectime, - "partition": setPropertiesResponse.Partitionid, - "odcSessionid": setPropertiesResponse.Sessionid, - }). + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "partition": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). Debug("call to ODC complete: odc.SetProperties") - // CONFIGURE configureRequest := &odcpb.ConfigureRequest{ - Request: &odcpb.StateRequest{ + Request: &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, + Path: "", + Detailed: false, }, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok = ctx.Deadline() + if ok { + configureRequest.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var configureResponse *odcpb.StateReply configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) @@ -699,18 +738,17 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "partition": configureResponse.Reply.Partitionid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "partition": configureResponse.Reply.Partitionid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). Debug("call to ODC complete: odc.Configure") return err } - -func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, envId string) error { +func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -721,8 +759,13 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments // SetProperties before CONFIGURE setPropertiesRequest := &odcpb.SetPropertiesRequest{ Partitionid: envId, - Path: "", - Properties: make([]*odcpb.Property, len(arguments)), + Path: "", + Properties: make([]*odcpb.Property, len(arguments)), + } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok := ctx.Deadline() + if ok { + setPropertiesRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } // Extract relevant parameters from Arguments payload @@ -739,11 +782,12 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments log.WithField("partition", envId).Debugf("preparing call odc.Run") err = handleRun(ctx, odcClient, isManualXml, map[string]string{ - "topology": topology, - "script": script, - "plugin": plugin, - "resources": resources, - }, + "topology": topology, + "script": script, + "plugin": plugin, + "resources": resources, + }, + paddingTimeout, envId) if err != nil { log.WithField("partition", envId).WithError(err).Debugf("finished call odc.Run with ERROR") @@ -751,7 +795,6 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments } log.WithField("partition", envId).Debugf("finished call odc.Run with SUCCESS") - log.WithField("partition", envId).Debugf("preparing call odc.SetProperties") var setPropertiesResponse *odcpb.GeneralReply @@ -761,7 +804,6 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments return printGrpcError(err) } - if setPropertiesResponse == nil { log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") @@ -783,23 +825,27 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") log.WithFields(logrus.Fields{ - "odcMsg": setPropertiesResponse.Msg, - "odcStatus": setPropertiesResponse.Status.String(), - "odcExectime": setPropertiesResponse.Exectime, - "partition": setPropertiesResponse.Partitionid, - "odcSessionid": setPropertiesResponse.Sessionid, - }). + "odcMsg": setPropertiesResponse.Msg, + "odcStatus": setPropertiesResponse.Status.String(), + "odcExectime": setPropertiesResponse.Exectime, + "partition": setPropertiesResponse.Partitionid, + "odcSessionid": setPropertiesResponse.Sessionid, + }). Debug("call to ODC complete: odc.SetProperties") - // CONFIGURE configureRequest := &odcpb.ConfigureRequest{ - Request: &odcpb.StateRequest{ + Request: &odcpb.StateRequest{ Partitionid: envId, - Path: "", - Detailed: false, + Path: "", + Detailed: false, }, } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second + ctxDeadline, ok = ctx.Deadline() + if ok { + configureRequest.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) + } var configureResponse *odcpb.StateReply configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) @@ -819,12 +865,12 @@ func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments return fmt.Errorf("status %s from ODC", replyStatus.String()) } log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "partition": configureResponse.Reply.Partitionid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). + "odcMsg": configureResponse.Reply.Msg, + "odcStatus": configureResponse.Reply.Status.String(), + "odcExectime": configureResponse.Reply.Exectime, + "partition": configureResponse.Reply.Partitionid, + "odcSessionid": configureResponse.Reply.Sessionid, + }). Debug("call to ODC complete: odc.Configure") return err } @@ -833,11 +879,11 @@ func printGrpcError(err error) error { grpcStatus, ok := status.FromError(err) if ok { log.WithFields(logrus.Fields{ - "code": grpcStatus.Code().String(), - "message": grpcStatus.Message(), - "details": grpcStatus.Details(), - "error": grpcStatus.Err().Error(), - }). + "code": grpcStatus.Code().String(), + "message": grpcStatus.Message(), + "details": grpcStatus.Details(), + "error": grpcStatus.Err().Error(), + }). Trace("ODC call error") err = fmt.Errorf("ODC returned %s: %s", grpcStatus.Code().String(), grpcStatus.Message()) } else { @@ -850,4 +896,4 @@ func printGrpcError(err error) error { Trace("ODC call error") } return err -} \ No newline at end of file +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 5a74c7eb5..9f4c0d18c 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -46,18 +46,18 @@ import ( "google.golang.org/grpc" ) -const( - ODC_DIAL_TIMEOUT = 2 * time.Second - ODC_GENERAL_OP_TIMEOUT = 5 * time.Second - ODC_CONFIGURE_TIMEOUT = 60 * time.Second +const ( + ODC_DIAL_TIMEOUT = 2 * time.Second + ODC_GENERAL_OP_TIMEOUT = 5 * time.Second + ODC_CONFIGURE_TIMEOUT = 60 * time.Second ODC_PARTITIONINITIALIZE_TIMEOUT = 60 * time.Second - ODC_START_TIMEOUT = 15 * time.Second - ODC_STOP_TIMEOUT = 15 * time.Second - ODC_RESET_TIMEOUT = 30 * time.Second - ODC_PARTITIONTERMINATE_TIMEOUT = 30 * time.Second + ODC_START_TIMEOUT = 15 * time.Second + ODC_STOP_TIMEOUT = 15 * time.Second + ODC_RESET_TIMEOUT = 30 * time.Second + ODC_PARTITIONTERMINATE_TIMEOUT = 30 * time.Second + ODC_PADDING_TIMEOUT = 3 * time.Second ) - type Plugin struct { odcHost string odcPort int @@ -77,9 +77,9 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - odcHost: u.Hostname(), - odcPort: portNumber, - odcClient: nil, + odcHost: u.Hostname(), + odcPort: portNumber, + odcClient: nil, } } @@ -162,43 +162,43 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter stack = make(map[string]interface{}) stack["GenerateEPNWorkflowScript"] = func() (out string) { /* - OCTRL-558 example: - GEN_TOPO_HASH=[0/1] GEN_TOPO_SOURCE=[...] DDMODE=[TfBuilder Mode] GEN_TOPO_LIBRARY_FILE=[...] - GEN_TOPO_WORKFLOW_NAME=[...] WORKFLOW_DETECTORS=[...] WORKFLOW_DETECTORS_QC=[...] - WORKFLOW_DETECTORS_CALIB=[...] WORKFLOW_PARAMETERS=[...] RECO_NUM_NODES_OVERRIDE=[...] - MULTIPLICITY_FACTOR_RAWDECODERS=[...] MULTIPLICITY_FACTOR_CTFENCODERS=[...] - MULTIPLICITY_FACTOR_REST=[...] GEN_TOPO_WIPE_CACHE=[0/1] BEAMTYPE=[PbPb/pp/pPb/cosmic/technical] - NHBPERTF=[...] GEN_TOPO_PARTITION=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] - /home/epn/pdp/gen_topo.sh - - R3C-710: - `pdp_o2pdpsuite_version` is a new field. Its content should be sent in the string as `OVERRIDE_PDPSUITE_VERSION=[...]`. - In case it is set to `default`, instead of the string `default` the preconfigured default version in consul should be sent. - `pdp_qcjson_version`: similar to avove, new field. please send as `SET_QCJSON_VERSION`. - If set to the string `default`, please sent the default version configured in consul instead. - `pdp_o2_data_processing_hash`: if set to the string `default`, sent the default hash configured in consul instead. - `odc_n_epns_max_fail` : new field. Please send as `RECO_MAX_FAIL_NODES_OVERRIDE=[...]`. - `epn_store_raw_data_fraction` new field, please send as `DD_DISK_FRACTION=[...]`. - `pdp_nr_compute_nodes` removed this field since no longer needed. - Please send the value of `odc_n_epns` directly as `RECO_NUM_NODES_OVERRIDE=[...]`. - `pdp_epn_shmid`: new field, please send as `SHM_MANAGER_SHMID=[...]` - `pdp_epn_shm_recreate`: new field, please send as `SHM_MANAGER_SHM_RECREATE=[0|1]` + OCTRL-558 example: + GEN_TOPO_HASH=[0/1] GEN_TOPO_SOURCE=[...] DDMODE=[TfBuilder Mode] GEN_TOPO_LIBRARY_FILE=[...] + GEN_TOPO_WORKFLOW_NAME=[...] WORKFLOW_DETECTORS=[...] WORKFLOW_DETECTORS_QC=[...] + WORKFLOW_DETECTORS_CALIB=[...] WORKFLOW_PARAMETERS=[...] RECO_NUM_NODES_OVERRIDE=[...] + MULTIPLICITY_FACTOR_RAWDECODERS=[...] MULTIPLICITY_FACTOR_CTFENCODERS=[...] + MULTIPLICITY_FACTOR_REST=[...] GEN_TOPO_WIPE_CACHE=[0/1] BEAMTYPE=[PbPb/pp/pPb/cosmic/technical] + NHBPERTF=[...] GEN_TOPO_PARTITION=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] + /home/epn/pdp/gen_topo.sh + + R3C-710: + `pdp_o2pdpsuite_version` is a new field. Its content should be sent in the string as `OVERRIDE_PDPSUITE_VERSION=[...]`. + In case it is set to `default`, instead of the string `default` the preconfigured default version in consul should be sent. + `pdp_qcjson_version`: similar to avove, new field. please send as `SET_QCJSON_VERSION`. + If set to the string `default`, please sent the default version configured in consul instead. + `pdp_o2_data_processing_hash`: if set to the string `default`, sent the default hash configured in consul instead. + `odc_n_epns_max_fail` : new field. Please send as `RECO_MAX_FAIL_NODES_OVERRIDE=[...]`. + `epn_store_raw_data_fraction` new field, please send as `DD_DISK_FRACTION=[...]`. + `pdp_nr_compute_nodes` removed this field since no longer needed. + Please send the value of `odc_n_epns` directly as `RECO_NUM_NODES_OVERRIDE=[...]`. + `pdp_epn_shmid`: new field, please send as `SHM_MANAGER_SHMID=[...]` + `pdp_epn_shm_recreate`: new field, please send as `SHM_MANAGER_SHM_RECREATE=[0|1]` */ var ( - pdpConfigOption, o2DPSource, tfbDDMode string - pdpLibraryFile, pdpLibWorkflowName string - pdpDetectorList, pdpDetectorListQc, pdpDetectorListCalib string - pdpWorkflowParams string + pdpConfigOption, o2DPSource, tfbDDMode string + pdpLibraryFile, pdpLibWorkflowName string + pdpDetectorList, pdpDetectorListQc, pdpDetectorListCalib string + pdpWorkflowParams string pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string - pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string - pdpExtraEnvVars, pdpGeneratorScriptPath string - odcNEpns string - ok bool - accumulator []string - pdpO2PdpSuiteVersion, pdpQcJsonVersion string - odcNEpnsMaxFail, epnStoreRawDataFraction string - pdpEpnShmId, pdpEpnShmRecreate string + pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string + pdpExtraEnvVars, pdpGeneratorScriptPath string + odcNEpns string + ok bool + accumulator []string + pdpO2PdpSuiteVersion, pdpQcJsonVersion string + odcNEpnsMaxFail, epnStoreRawDataFraction string + pdpEpnShmId, pdpEpnShmRecreate string ) accumulator = make([]string, 0) @@ -219,7 +219,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP Repository hash") return } - if strings.TrimSpace(o2DPSource) == "default" { // if UI sends 'default', we look in Consul + if strings.TrimSpace(o2DPSource) == "default" { // if UI sends 'default', we look in Consul o2DPSource, ok = configStack["pdp_o2_data_processing_hash"] if !ok { log.WithField("partition", envId). @@ -240,7 +240,8 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, "GEN_TOPO_HASH=0") - case "Manual XML": fallthrough + case "Manual XML": + fallthrough default: return } @@ -469,7 +470,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP Suite version") return } - if strings.TrimSpace(pdpO2PdpSuiteVersion) == "default" { // if UI sends 'default', we look in Consul + if strings.TrimSpace(pdpO2PdpSuiteVersion) == "default" { // if UI sends 'default', we look in Consul pdpO2PdpSuiteVersion, ok = configStack["pdp_o2pdpsuite_version"] if !ok { log.WithField("partition", envId). @@ -487,7 +488,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire PDP QCJson version") return } - if strings.TrimSpace(pdpQcJsonVersion) == "default" { // if UI sends 'default', we look in Consul + if strings.TrimSpace(pdpQcJsonVersion) == "default" { // if UI sends 'default', we look in Consul pdpQcJsonVersion, ok = configStack["pdp_qcjson_version"] if !ok { log.WithField("partition", envId). @@ -572,6 +573,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + paddingTimeout := ODC_PADDING_TIMEOUT + paddingTimeoutStr, ok := varStack["odc_padding_timeout"] + if ok { + var err error + paddingTimeout, err = time.ParseDuration(paddingTimeoutStr) + if err != nil { + paddingTimeout = ODC_PADDING_TIMEOUT + log.Debug("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) + } + } else { + log.Debug("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) + } + stack = make(map[string]interface{}) stack["PartitionInitialize"] = func() (out string) { // ODC Run @@ -579,7 +593,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId).Debugf("preparing call odc.PartitionInitialize") - var ( pdpConfigOption, script, topology, plugin, resources string ) @@ -598,7 +611,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } switch pdpConfigOption { - case "Repository hash": fallthrough + case "Repository hash": + fallthrough case "Repository path": script, ok = varStack["odc_script"] if !ok { @@ -664,12 +678,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer cancel() err = handleRun(ctx, p.odcClient, isManualXml, map[string]string{ - "topology": topology, - "script": script, - "plugin": plugin, - "resources": resources, - }, - envId) + "topology": topology, + "script": script, + "plugin": plugin, + "resources": resources, + }, + paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -707,7 +721,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleConfigure(ctx, p.odcClient, arguments, envId) + err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -728,7 +742,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleReset(ctx, p.odcClient, nil, envId) + err := handleReset(ctx, p.odcClient, nil, paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -749,7 +763,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handlePartitionTerminate(ctx, p.odcClient, nil, envId) + err := handlePartitionTerminate(ctx, p.odcClient, nil, paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -761,7 +775,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - stack["Start"] = func() (out string) { // must formally return string even when we return nothing + stack["Start"] = func() (out string) { // must formally return string even when we return nothing // ODC SetProperties + Start @@ -773,7 +787,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } var ( runNumberu64 uint64 - err error + err error ) callFailedStr := "EPN Start call failed" @@ -793,7 +807,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err = handleStart(ctx, p.odcClient, arguments, envId, runNumberu64) + err = handleStart(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -816,7 +830,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } var ( runNumberu64 uint64 - err error + err error ) callFailedStr := "EPN Stop call failed" @@ -832,7 +846,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err = handleStop(ctx, p.odcClient, nil, envId, runNumberu64) + err = handleStop(ctx, p.odcClient, nil, paddingTimeout, envId, runNumberu64) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -853,7 +867,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, envId) + err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -874,7 +888,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, "") + err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, "") if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -907,7 +921,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } switch pdpConfigOption { - case "Repository hash": fallthrough + case "Repository hash": + fallthrough case "Repository path": script, ok = varStack["odc_script"] if !ok { @@ -986,7 +1001,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleConfigureLegacy(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, envId) + err := handleConfigureLegacy(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, paddingTimeout, envId) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -1007,7 +1022,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleResetLegacy(ctx, p.odcClient, nil, envId) + err := handleResetLegacy(ctx, p.odcClient, nil, paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1028,7 +1043,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanupLegacy(ctx, p.odcClient, nil, envId) + err := handleCleanupLegacy(ctx, p.odcClient, nil, paddingTimeout, envId) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). From 1f31a42915e0a7d2db0a1eb519dd3d47b1ab88b2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Mar 2022 13:53:11 +0100 Subject: [PATCH 1159/2352] [core] Ensure all timestamps sent by AliECS are in milliseconds --- coconut/control/control.go | 70 +++++++++++++++---------------------- core/protos/o2control.proto | 3 +- core/server.go | 38 ++++++++++---------- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index b8ca55b71..37ca6dbd7 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -54,17 +54,16 @@ import ( "google.golang.org/grpc" ) -const( - CALL_TIMEOUT = 55*time.Second - SPINNER_TICK = 100*time.Millisecond +const ( + CALL_TIMEOUT = 55 * time.Second + SPINNER_TICK = 100 * time.Millisecond ) var log = logger.New(logrus.StandardLogger(), "coconut") type RunFunc func(*cobra.Command, []string) -type ControlCall func(context.Context, *coconut.RpcClient, *cobra.Command, []string, io.Writer) (error) - +type ControlCall func(context.Context, *coconut.RpcClient, *cobra.Command, []string, io.Writer) error func WrapCall(call ControlCall) RunFunc { return func(cmd *cobra.Command, args []string) { @@ -89,7 +88,7 @@ func WrapCall(call ControlCall) RunFunc { // redirect stdout to null, the only way to output is stdout := os.Stdout if !auto { - os.Stdout,_ = os.Open(os.DevNull) + os.Stdout, _ = os.Open(os.DevNull) } err := call(cxt, rpc, cmd, args, &out) os.Stdout = stdout @@ -109,7 +108,6 @@ func WrapCall(call ControlCall) RunFunc { } } - func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { var response *pb.GetFrameworkInfoReply response, err = rpc.GetFrameworkInfo(cxt, &pb.GetFrameworkInfoRequest{}, grpc.EmptyCallOption{}) @@ -144,7 +142,6 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar _, _ = fmt.Fprintf(o, " active (in use): %s\n", yellow(strings.Join(response.GetActiveDetectors(), " "))) _, _ = fmt.Fprintf(o, " available: %s\n", green(strings.Join(response.GetAvailableDetectors(), " "))) - // Integrated Services API query pluginsResponse, err := rpc.GetIntegratedServices(cxt, &pb.Empty{}, grpc.EmptyCallOption{}) if err != nil { @@ -180,7 +177,7 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar enabledString = green("enabled") } - _, _ = fmt.Fprintf(o, " %-22s%s\n", svcId + ":", enabledString) + _, _ = fmt.Fprintf(o, " %-22s%s\n", svcId+":", enabledString) if !svc.Enabled { continue } @@ -210,14 +207,12 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar return nil } - func Teardown(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { log.Fatal("not implemented yet") os.Exit(1) return } - func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { var response *pb.GetEnvironmentsReply showAll, _ := cmd.Flags().GetBool("show-all") @@ -301,13 +296,13 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - if evt := rcv.GetEnvironmentEvent(); evt != nil{ + if evt := rcv.GetEnvironmentEvent(); evt != nil { if evt.Error != "" { if viper.GetBool("verbose") { log.WithPrefix("Event"). WithError(fmt.Errorf(evt.Error)). Error(evt.EnvironmentId) - return nil + return nil } fmt.Printf("\nEnvironment with id %s failed with error: %s\n", evt.EnvironmentId, evt.Error) } else { @@ -323,7 +318,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } if viper.GetBool("verbose") { log.WithPrefix("Event"). - Info(rcv) + Info(rcv) } if evt := rcv.GetTaskEvent(); evt != nil { tmpl, err := template.New("taskEvents").Parse("Task {{.Taskid}} of class {{.ClassName}} changed{{if .State}} state to {{.State}}{{end}}{{if .Status}} status to {{.Status}}{{end}} on machine {{.Hostname}}\n") @@ -359,7 +354,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C var ( defaultsStr = stringMapToString(env.Defaults, "\t") - varsStr = stringMapToString(env.Vars, "\t") + varsStr = stringMapToString(env.Vars, "\t") userVarsStr = stringMapToString(env.UserVars, "\t") ) if len(defaultsStr) != 0 { @@ -420,7 +415,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com var ( defaultsStr = stringMapToString(env.Defaults, "\t") - varsStr = stringMapToString(env.Vars, "\t") + varsStr = stringMapToString(env.Vars, "\t") userVarsStr = stringMapToString(env.UserVars, "\t") ) @@ -464,7 +459,6 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com return } - func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) @@ -477,7 +471,8 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. } event = strings.ToUpper(event) switch event { - case "START": fallthrough + case "START": + fallthrough case "STOP": event = event + "_ACTIVITY" } @@ -490,11 +485,11 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. rnString := formatRunNumber(response.GetCurrentRunNumber()) - sotTimestamp := time.Unix(0, response.GetStartOfTransition()) + sotTimestamp := time.Unix(0, response.GetStartOfTransition()*int64(time.Millisecond)) sotFormatted := sotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") - eotTimestamp := time.Unix(0, response.GetEndOfTransition()) + eotTimestamp := time.Unix(0, response.GetEndOfTransition()*int64(time.Millisecond)) eotFormatted := eotTimestamp.Local().Format("2006-01-02 15:04:05.000000 MST") - tdTimestamp := time.Duration(response.GetTransitionDuration()) + tdTimestamp := time.Duration(response.GetTransitionDuration() * int64(time.Millisecond)) _, _ = fmt.Fprintln(o, "transition complete") _, _ = fmt.Fprintf(o, "environment id: %s\n", response.GetId()) @@ -506,7 +501,6 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. return } - func ModifyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) @@ -535,13 +529,13 @@ func ModifyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C ops := make([]*pb.EnvironmentOperation, 0) for _, it := range addRoles { ops = append(ops, &pb.EnvironmentOperation{ - Type: pb.EnvironmentOperation_ADD_ROLE, + Type: pb.EnvironmentOperation_ADD_ROLE, RoleName: it, }) } for _, it := range removeRoles { ops = append(ops, &pb.EnvironmentOperation{ - Type: pb.EnvironmentOperation_REMOVE_ROLE, + Type: pb.EnvironmentOperation_REMOVE_ROLE, RoleName: it, }) } @@ -568,8 +562,8 @@ func ModifyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C // Do the request var response *pb.ModifyEnvironmentReply response, err = rpc.ModifyEnvironment(cxt, &pb.ModifyEnvironmentRequest{ - Id: envId, - Operations: ops, + Id: envId, + Operations: ops, ReconfigureAll: reconfigure, }, grpc.EmptyCallOption{}) if err != nil { @@ -587,11 +581,10 @@ func ModifyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C } return }() - fmt.Fprintf(o, "failed operations: %s\n", failedOpNames ) + fmt.Fprintf(o, "failed operations: %s\n", failedOpNames) return } - func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) @@ -624,7 +617,6 @@ func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. return } - func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { var response *pb.GetTasksReply response, err = rpc.GetTasks(cxt, &pb.GetTasksRequest{}, grpc.EmptyCallOption{}) @@ -655,7 +647,6 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a return nil } - func CleanTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) > 0 { for _, id := range args { @@ -689,7 +680,6 @@ func CleanTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, return } - func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { if len(args) != 2 { err = errors.New(fmt.Sprintf("accepts 2 arg(s), received %d", len(args))) @@ -711,9 +701,9 @@ func QueryRoles(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, } else { for i, root := range roots { var ( - defaultsStr = stringMapToString(root.Defaults, "\t") - varsStr = stringMapToString(root.Vars, "\t") - userVarsStr = stringMapToString(root.UserVars, "\t") + defaultsStr = stringMapToString(root.Defaults, "\t") + varsStr = stringMapToString(root.Vars, "\t") + userVarsStr = stringMapToString(root.UserVars, "\t") consolidatedStr = stringMapToString(root.ConsolidatedStack, "\t") ) @@ -783,7 +773,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob } } - } else if len(args) == 1 { // If we have an argument, give priority over the flags + } else if len(args) == 1 { // If we have an argument, give priority over the flags simpleRepoRegex := regexp.MustCompile("\\A[^@]+\\z") repoRevisionRegex := regexp.MustCompile("\\A[^@]+@[^@]+\\z") @@ -820,7 +810,6 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob return } - var response *pb.GetWorkflowTemplatesReply response, err = rpc.GetWorkflowTemplates(cxt, &pb.GetWorkflowTemplatesRequest{RepoPattern: repoPattern, RevisionPattern: revisionPattern, AllBranches: allBranches, AllTags: allTags, AllWorkflows: allWorkflows}, grpc.EmptyCallOption{}) @@ -955,7 +944,7 @@ func RemoveRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, newDefaultRepo := response.GetNewDefaultRepo() fmt.Fprintln(o, "Repository removed successfully.") if newDefaultRepo != "" { - fmt.Fprintln(o, "New default repo is: " + newDefaultRepo) + fmt.Fprintln(o, "New default repo is: "+newDefaultRepo) } return nil @@ -1016,7 +1005,6 @@ func SetDefaultRepo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Comm return nil } - // SetDefaultRevision selects the default repository revision. // This can be done on the global or on the repository level. func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) error { @@ -1026,7 +1014,7 @@ func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. fmt.Fprintln(o, "Operation failed.") return err } - fmt.Fprintln(o, "The global default revision has been succesfuly updated to \"" + args[0] + "\".") + fmt.Fprintln(o, "The global default revision has been succesfuly updated to \""+args[0]+"\".") } else if len(args) == 2 { // Set per-repo default index, err := strconv.ParseInt(args[0], 10, 32) if err != nil { @@ -1044,11 +1032,11 @@ func SetDefaultRevision(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. fmt.Fprintln(o, "Available revisions for this repo: \n"+response.GetInfo()) return errors.New("Could not update the default revision.") } - fmt.Fprintln(o, "The default revision for this repo has been successfuly updated to \"" + args[1] + "\".") + fmt.Fprintln(o, "The default revision for this repo has been successfuly updated to \""+args[1]+"\".") } else { err := errors.New(fmt.Sprintf("expects 1 or 2 args, received %d", len(args))) return err } return nil -} \ No newline at end of file +} diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index eff46561a..171caf6a8 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -176,7 +176,7 @@ message GetEnvironmentsReply { } message EnvironmentInfo { string id = 1; - int64 createdWhen = 2; + int64 createdWhen = 2; // msec string state = 3; repeated ShortTaskInfo tasks = 4; string rootRole = 5; @@ -234,6 +234,7 @@ message ControlEnvironmentReply { string id = 1; string state = 2; uint32 currentRunNumber = 3; + // All times are in milliseconds int64 startOfTransition = 4; int64 endOfTransition = 5; int64 transitionDuration = 6; diff --git a/core/server.go b/core/server.go index cc868d458..0927e284e 100644 --- a/core/server.go +++ b/core/server.go @@ -211,7 +211,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm tasks := env.Workflow().GetTasks() e := &pb.EnvironmentInfo{ Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixNano(), + CreatedWhen: env.CreatedWhen().UnixMilli(), State: env.CurrentState(), RootRole: env.Workflow().GetName(), Description: env.Description, @@ -267,7 +267,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme err = status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() reply.Environment = &pb.EnvironmentInfo{ Id: id.String(), - CreatedWhen: time.Now().UnixNano(), + CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close UserVars: request.GetVars(), NumberOfFlps: 0, @@ -281,7 +281,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme err = status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()).Err() reply.Environment = &pb.EnvironmentInfo{ Id: id.String(), - CreatedWhen: time.Now().UnixNano(), + CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close UserVars: request.GetVars(), NumberOfFlps: 0, @@ -296,17 +296,17 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme tasks := newEnv.Workflow().GetTasks() ei := &pb.EnvironmentInfo{ - Id: newEnv.Id().String(), - CreatedWhen: newEnv.CreatedWhen().UnixNano(), - State: newEnv.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: newEnv.Workflow().GetName(), - Description: newEnv.Description, - CurrentRunNumber: newEnv.GetCurrentRunNumber(), - Defaults: newEnv.GlobalDefaults.Raw(), - Vars: newEnv.GlobalVars.Raw(), - UserVars: newEnv.UserVars.Raw(), - NumberOfFlps: int32(len(newEnv.GetFLPs())), + Id: newEnv.Id().String(), + CreatedWhen: newEnv.CreatedWhen().UnixMilli(), + State: newEnv.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: newEnv.Workflow().GetName(), + Description: newEnv.Description, + CurrentRunNumber: newEnv.GetCurrentRunNumber(), + Defaults: newEnv.GlobalDefaults.Raw(), + Vars: newEnv.GlobalVars.Raw(), + UserVars: newEnv.UserVars.Raw(), + NumberOfFlps: int32(len(newEnv.GetFLPs())), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), } reply = &pb.NewEnvironmentReply{ @@ -339,11 +339,11 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixNano(), + CreatedWhen: env.CreatedWhen().UnixMilli(), State: env.CurrentState(), Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), RootRole: env.Workflow().GetName(), - Description: env.Description, + Description: env.Description, CurrentRunNumber: env.GetCurrentRunNumber(), Defaults: env.GlobalDefaults.Raw(), Vars: env.GlobalVars.Raw(), @@ -394,9 +394,9 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir Id: env.Id().String(), State: env.CurrentState(), CurrentRunNumber: env.GetCurrentRunNumber(), - StartOfTransition: sot.UnixNano(), - EndOfTransition: eot.UnixNano(), - TransitionDuration: td.Nanoseconds(), + StartOfTransition: sot.UnixMilli(), + EndOfTransition: eot.UnixMilli(), + TransitionDuration: td.Milliseconds(), } if err != nil { From c15a0504888acdf8d44b6be0903288ffd660ada0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Mar 2022 13:58:13 +0100 Subject: [PATCH 1160/2352] [build] Bump to v0.37.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index db9471501..8f2ea0d2b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 36 +VERSION_MINOR := 37 VERSION_PATCH := 0 From 645a2a2e86efea696e64adf6ded38aa3e2b6482b Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 24 Mar 2022 15:35:41 +0100 Subject: [PATCH 1161/2352] [coconut+core][OCTRL-161-fix] The workflow template descriptions are shown using the templ list command. --- coconut/cmd/template_list.go | 18 +- coconut/control/control.go | 10 +- coconut/protos/o2control.pb.go | 473 +++++++++++++++++---------------- core/protos/o2control.pb.go | 473 +++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/server.go | 10 +- 6 files changed, 509 insertions(+), 476 deletions(-) diff --git a/coconut/cmd/template_list.go b/coconut/cmd/template_list.go index 03c587793..4061bdfdb 100644 --- a/coconut/cmd/template_list.go +++ b/coconut/cmd/template_list.go @@ -31,28 +31,27 @@ import ( // templateListCmd represents the template list command var templateListCmd = &cobra.Command{ - Use: "list", + Use: "list", Aliases: []string{"list", "ls", "l"}, - Short: "list available workflow templates", + Short: "list available workflow templates", Long: `The template list command shows a list of available workflow templates. These workflow templates can then be loaded to create an environment. ` + "`coconut templ list` " + `can be called with 1) a combination of the ` + "`--repo` " + `, ` + "`--revision` " + `, ` + "`--all-branches` " + `, ` + "`--all-tags` " + `, ` + "`--all-workflows` " + `flags, or with 2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing.`, - Example: -` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories + Example: ` * ` + "`coconut templ list`" + ` lists templates from the HEAD of master for all git repositories * ` + "`coconut templ list --all-workflows`" + ` lists all templates (including non-public ones) from the HEAD of master for all git repositories * ` + "`coconut templ list '*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * ` + "`coconut templ list '*@v*'`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories - * ` + "`coconut templ list --repository='*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* - * ` + "`coconut templ list --revision='dev*'`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories + * ` + "`coconut templ list '*@v*'`" + ` lists templates coming from revisions matching the ` + "`v*`" + `pattern for all git repositories + * ` + "`coconut templ list --repository='*AliceO2Group*'`" + ` lists all templates coming from the HEAD of master of git repositories that match the pattern *AliceO2Group* + * ` + "`coconut templ list --revision='dev*'`" + ` lists templates coming from revisions matching the ` + "`dev*`" + `pattern for all git repositories * ` + "`coconut templ list --repository='*gitlab.cern.ch*' --revision=master`" + ` lists templates for revisions ` + "`master`" + `for git repositories matching ` + "`*gitlab.cern.ch*`" + ` * ` + "`coconut templ list --all-branches`" + ` lists templates from all branches for all git repositories * ` + "`coconut templ list --repository='*github.com*' --all-tags`" + ` lists templates from all tags for git repositories which match the *github.com* pattern * ` + "`coconut templ list --revision=5c7f1c1fded1b87243998579ed876c8035a08377 `" + ` lists templates from the commit corresponding to the hash for all git repositories`, - Run: control.WrapCall(control.ListWorkflowTemplates), + Run: control.WrapCall(control.ListWorkflowTemplates), } func init() { @@ -63,4 +62,5 @@ func init() { templateListCmd.Flags().BoolP("all-branches", "b", false, "list templates from all branches") templateListCmd.Flags().BoolP("all-tags", "t", false, "list templates from all tags") templateListCmd.Flags().BoolP("all-workflows", "a", false, "list all templates, even non-public ones") -} \ No newline at end of file + templateListCmd.Flags().BoolP("show-description", "d", false, "show the description of each template") +} diff --git a/coconut/control/control.go b/coconut/control/control.go index 37ca6dbd7..8b08bbd10 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -738,6 +738,7 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob allBranches := false allTags := false allWorkflows := false + showDescription := false if len(args) == 0 { repoPattern, err = cmd.Flags().GetString("repository") @@ -765,6 +766,8 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob return } + showDescription, err = cmd.Flags().GetBool("show-description") + if allBranches || allTags { if revisionPattern != "" { fmt.Fprintln(o, "Ignoring `--all-{branches,tags}` flags, as a valid revision has been specified") @@ -842,7 +845,12 @@ func ListWorkflowTemplates(cxt context.Context, rpc *coconut.RpcClient, cmd *cob revBranch.SetValue(yellow("[revision] " + tmpl.GetRevision())) // Otherwise the pointer value was set as the branch's value prevRevision = tmpl.GetRevision() } - revBranch.AddNode(tmpl.GetTemplate()) + if showDescription { + tmplBranch := revBranch.AddBranch(tmpl.GetTemplate()) + tmplBranch.AddNode(grey(tmpl.GetDescription())) + } else { + revBranch.AddNode(tmpl.GetTemplate()) + } } fmt.Fprint(o, aTree.String()) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 4c993d92f..262b7f049 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1380,7 +1380,7 @@ type EnvironmentInfo struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` @@ -1906,12 +1906,13 @@ type ControlEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` - EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` - TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + // All times are in milliseconds + StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -3746,10 +3747,11 @@ type WorkflowTemplateInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` } func (x *WorkflowTemplateInfo) Reset() { @@ -3812,6 +3814,13 @@ func (x *WorkflowTemplateInfo) GetVarSpecMap() map[string]*VarSpecMessage { return nil } +func (x *WorkflowTemplateInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type GetWorkflowTemplatesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5178,7 +5187,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -5189,229 +5198,231 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, + 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, + 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, + 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 4c993d92f..262b7f049 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1380,7 +1380,7 @@ type EnvironmentInfo struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` @@ -1906,12 +1906,13 @@ type ControlEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` - EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` - TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + // All times are in milliseconds + StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` + EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` + TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -3746,10 +3747,11 @@ type WorkflowTemplateInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` - Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` - Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` - VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Repo string `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"` + Template string `protobuf:"bytes,2,opt,name=template,proto3" json:"template,omitempty"` + Revision string `protobuf:"bytes,3,opt,name=revision,proto3" json:"revision,omitempty"` + VarSpecMap map[string]*VarSpecMessage `protobuf:"bytes,4,rep,name=varSpecMap,proto3" json:"varSpecMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Description string `protobuf:"bytes,5,opt,name=description,proto3" json:"description,omitempty"` } func (x *WorkflowTemplateInfo) Reset() { @@ -3812,6 +3814,13 @@ func (x *WorkflowTemplateInfo) GetVarSpecMap() map[string]*VarSpecMessage { return nil } +func (x *WorkflowTemplateInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + type GetWorkflowTemplatesReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5178,7 +5187,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0x8d, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -5189,229 +5198,231 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, + 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, + 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, + 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, + 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 171caf6a8..6537f3ca3 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -435,6 +435,7 @@ message WorkflowTemplateInfo { string template = 2; string revision = 3; map varSpecMap = 4; + string description = 5; } message GetWorkflowTemplatesReply{ diff --git a/core/server.go b/core/server.go index 0927e284e..9d3835e86 100644 --- a/core/server.go +++ b/core/server.go @@ -673,10 +673,12 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo // Finally, we build the protobuf response workflowTemplateInfos[i] = &pb.WorkflowTemplateInfo{ - Repo: string(repo), - Revision: string(revision), - Template: template.Name, - VarSpecMap: VarSpecMapToPbVarSpecMap(varSpecMap)} + Repo: string(repo), + Revision: string(revision), + Template: template.Name, + VarSpecMap: VarSpecMapToPbVarSpecMap(varSpecMap), + Description: template.Description, + } i++ } } From 639a4604335535e7d9ad7511313a4fe3944a5222 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Thu, 24 Mar 2022 17:00:02 +0100 Subject: [PATCH 1162/2352] [build] Bump Go version for GitHub build checks --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index e66d4e87e..634eb5424 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-18.04] - go: [ '1.15.6' ] + go: [ '1.17' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From c15c0c3f28a2cb46237ee2d0b1e6f5f5238eef08 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Mar 2022 16:43:03 +0100 Subject: [PATCH 1163/2352] [build] Update dependencies --- go.mod | 12 ++++++------ go.sum | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 28a32b902..94f4f9516 100644 --- a/go.mod +++ b/go.mod @@ -55,7 +55,7 @@ require ( github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 // indirect github.com/go-yaml/yaml v2.1.0+incompatible // indirect github.com/gobwas/glob v0.2.3 - github.com/golang/protobuf v1.4.3 + github.com/golang/protobuf v1.5.2 github.com/google/uuid v1.2.0 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect github.com/gorilla/mux v1.7.3 @@ -133,16 +133,16 @@ require ( golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20210119194325-5f4716e94777 - golang.org/x/sys v0.0.0-20210423082822-04245dca01da + golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 + golang.org/x/sys v0.0.0-20210510120138-977fb7262007 golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect google.golang.org/api v0.39.0 // indirect - google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea // indirect - google.golang.org/grpc v1.35.0 + google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect + google.golang.org/grpc v1.45.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162 // indirect - google.golang.org/protobuf v1.25.0 + google.golang.org/protobuf v1.28.0 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/ini.v1 v1.62.0 // indirect gopkg.in/osteele/liquid.v1 v1.2.4 // indirect diff --git a/go.sum b/go.sum index 20082015c..96c85bdd8 100644 --- a/go.sum +++ b/go.sum @@ -410,6 +410,9 @@ github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0 github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= @@ -429,6 +432,8 @@ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -1221,6 +1226,8 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -1324,8 +1331,11 @@ golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1522,6 +1532,8 @@ google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 h1:m9+RjTMas6brUP8 google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea h1:N98SvVh7Hdle2lgUVFuIkf0B3u29CUakMUQa7Hwz8Wc= google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= +google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= @@ -1548,6 +1560,11 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= +google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From bb4f86dfeaf0609d24da06665fff33f97f70229d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Mar 2022 17:02:15 +0100 Subject: [PATCH 1164/2352] [core] Attach environment info to outgoing gRPC status on deploy fail --- core/server.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/core/server.go b/core/server.go index 9d3835e86..e64be9e90 100644 --- a/core/server.go +++ b/core/server.go @@ -38,6 +38,9 @@ import ( "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/repos/varsource" "github.com/spf13/viper" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/reflection" + "google.golang.org/grpc/status" "github.com/AliceO2Group/Control/common/product" "github.com/AliceO2Group/Control/core/task" @@ -48,9 +51,6 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/protos" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/reflection" - "google.golang.org/grpc/status" ) func NewServer(state *globalState) *grpc.Server { @@ -264,28 +264,32 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme id := uid.NilID() id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) if err != nil { - err = status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() - reply.Environment = &pb.EnvironmentInfo{ + st := status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()) + ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close UserVars: request.GetVars(), NumberOfFlps: 0, } + st, _ = st.WithDetails(ei) + err = st.Err() return } newEnv, err := m.state.environments.Environment(id) if err != nil { - err = status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()).Err() - reply.Environment = &pb.EnvironmentInfo{ + st := status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()) + ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close UserVars: request.GetVars(), NumberOfFlps: 0, } + st, _ = st.WithDetails(ei) + err = st.Err() return } From a73ce9ba01f57a63ba9adeb7fcb616cb8884d1cc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 29 Mar 2022 17:07:23 +0200 Subject: [PATCH 1165/2352] [core] Fix minor log message bugs --- core/integration/dcs/plugin.go | 38 +++++++++++++++++----------------- core/integration/odc/plugin.go | 4 ++-- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 19593b100..f49393c33 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -50,17 +50,17 @@ import ( ) const ( - DCS_DIAL_TIMEOUT = 2 * time.Hour + DCS_DIAL_TIMEOUT = 2 * time.Hour DCS_GENERAL_OP_TIMEOUT = 45 * time.Second ) type Plugin struct { - dcsHost string - dcsPort int + dcsHost string + dcsPort int - dcsClient *RpcClient + dcsClient *RpcClient - pendingEORs map[string /*envId*/]int64 + pendingEORs map[string] /*envId*/ int64 } type DCSDetectors []dcspb.Detector @@ -77,9 +77,9 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - dcsHost: u.Hostname(), - dcsPort: portNumber, - dcsClient: nil, + dcsHost: u.Hostname(), + dcsPort: portNumber, + dcsClient: nil, pendingEORs: make(map[string]int64), } } @@ -174,7 +174,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) - stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing + stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing var err error callFailedStr := "DCS StartOfRun call failed" @@ -258,7 +258,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), } for i, det := range detectors { - perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_sor_parameters"] + perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_dcs_sor_parameters"] if !ok { log.WithField("partition", envId). WithField("runNumber", runNumber64). @@ -369,7 +369,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later + p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) for _, v := range detectors { @@ -383,7 +383,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination + if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS SOR event stream EOF, closed") @@ -398,7 +398,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) break } - if err != nil { // stream termination in case of general error + if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). WithField("runNumber", runNumber64). @@ -446,7 +446,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("runNumber", runNumber64). WithField("detector", dcsEvent.GetDetector().String()). - Debug("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + Debugf("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) } } @@ -546,7 +546,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), } for i, det := range detectors { - perDetectorParameters, ok := varStack[strings.ToLower(det.String()) + "_dcs_eor_parameters"] + perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_dcs_eor_parameters"] if !ok { log.WithField("partition", envId). WithField("runNumber", runNumber64). @@ -656,7 +656,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - delete(p.pendingEORs, envId) // make sure this EOR never runs again + delete(p.pendingEORs, envId) // make sure this EOR never runs again log.WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). @@ -677,7 +677,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } dcsEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination + if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("DCS EOR event stream EOF, closed") @@ -740,7 +740,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("runNumber", runNumber64). WithField("detector", dcsEvent.GetDetector().String()). - Debug("DCS EOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + Debugf("DCS EOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) } } @@ -866,4 +866,4 @@ func (d DCSDetectors) StringSlice() (sslice []string) { sslice[i] = det.String() } return -} \ No newline at end of file +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 9f4c0d18c..b5cd8efef 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -580,10 +580,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { paddingTimeout, err = time.ParseDuration(paddingTimeoutStr) if err != nil { paddingTimeout = ODC_PADDING_TIMEOUT - log.Debug("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) + log.Debugf("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) } } else { - log.Debug("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) + log.Debugf("CallStack cannot acquire ODC padding timeout, defaulting to %s", ODC_PADDING_TIMEOUT.String()) } stack = make(map[string]interface{}) From 5212ac47950023713690b41740918b388c4c073d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 31 Mar 2022 12:09:25 +0200 Subject: [PATCH 1166/2352] [core] Use odc.Status for GetData implementation --- core/integration/odc/plugin.go | 37 +++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index b5cd8efef..562d40abf 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -56,6 +56,7 @@ const ( ODC_RESET_TIMEOUT = 30 * time.Second ODC_PARTITIONTERMINATE_TIMEOUT = 30 * time.Second ODC_PADDING_TIMEOUT = 3 * time.Second + ODC_STATUS_TIMEOUT = 3 * time.Second ) type Plugin struct { @@ -102,27 +103,35 @@ func (p *Plugin) GetConnectionState() string { return p.odcClient.conn.GetState().String() } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []uid.ID) string { if p == nil || p.odcClient == nil { return "" } + ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) + defer cancel() + + statusRep, err := p.odcClient.Status(ctx, &odc.StatusRequest{Running: true}, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("level", infologger.IL_Support). + WithField("call", "Status"). + WithError(err).Error("ODC error") + } + if statusRep == nil { + log.WithField("level", infologger.IL_Support). + WithField("call", "Status"). + WithError(fmt.Errorf("ODC Status response is nil")).Error("ODC error") + } + partitionStates := make(map[string]string) - for _, envId := range environmentIds { - in := odc.StateRequest{ - Partitionid: envId.String(), - Path: "", - Detailed: false, - } - state, err := p.odcClient.GetState(context.Background(), &in, grpc.EmptyCallOption{}) - if err != nil { - continue - } - if state == nil || state.Reply == nil { - continue + if statusRep.Status == odc.ReplyStatus_SUCCESS { + for _, partitionInfo := range statusRep.Partitions { + if partitionInfo == nil { + continue + } + partitionStates[partitionInfo.Partitionid] = partitionInfo.State } - partitionStates[envId.String()] = state.Reply.State } out, err := json.Marshal(partitionStates) From fa0b8cd99f32ef8fdb58b2cf0482ec8f35d021be Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 11:25:49 +0200 Subject: [PATCH 1167/2352] [core] ODC status polling + GetData from client-side cache --- core/config.go | 4 +- core/integration/odc/plugin.go | 98 +++++++++++++++++++++++++++++----- 2 files changed, 89 insertions(+), 13 deletions(-) diff --git a/core/config.go b/core/config.go index 5f73cfe9c..4147fed90 100644 --- a/core/config.go +++ b/core/config.go @@ -103,13 +103,14 @@ func setDefaults() error { viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("odcEndpoint", "//127.0.0.1:50053") + viper.SetDefault("odcPollingInterval", "3s") viper.SetDefault("odcUseSystemProxy", false) viper.SetDefault("testPluginEndpoint", "//127.0.0.1:00000") viper.SetDefault("integrationPlugins", []string{}) viper.SetDefault("coreConfigEntry", "settings") viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") - viper.SetDefault("bookkeepingToken","token") + viper.SetDefault("bookkeepingToken", "token") return nil } @@ -156,6 +157,7 @@ func setFlags() error { pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("odcEndpoint", viper.GetString("odcEndpoint"), "Endpoint of the ODC gRPC service (`host:port`)") + pflag.String("odcPollingInterval", viper.GetString("odcPollingInterval"), "How often to query the ODC gRPC service for partition status (default: 3s)") pflag.Bool("odcUseSystemProxy", viper.GetBool("odcUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("testPluginEndpoint", viper.GetString("testPluginEndpoint"), "Endpoint of the TEST plugin, actually a NOOP") pflag.StringSlice("integrationPlugins", viper.GetStringSlice("integrationPlugins"), "List of integration plugins to load (default: empty)") diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 562d40abf..1ce242005 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -33,6 +33,7 @@ import ( "net/url" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/apricot" @@ -57,6 +58,7 @@ const ( ODC_PARTITIONTERMINATE_TIMEOUT = 30 * time.Second ODC_PADDING_TIMEOUT = 3 * time.Second ODC_STATUS_TIMEOUT = 3 * time.Second + ODC_POLLING_INTERVAL = 3 * time.Second ) type Plugin struct { @@ -64,6 +66,22 @@ type Plugin struct { odcPort int odcClient *RpcClient + + cachedStatus *OdcStatus + cachedStatusMu sync.RWMutex + cachedStatusCancelFunc context.CancelFunc +} + +type OdcStatus struct { + Partitions map[uid.ID]OdcPartitionInfo + Status odc.ReplyStatus + Message string + Error *odc.Error +} + +type OdcPartitionInfo struct { + RunNumber uint32 + State string } func NewPlugin(endpoint string) integration.Plugin { @@ -103,15 +121,14 @@ func (p *Plugin) GetConnectionState() string { return p.odcClient.conn.GetState().String() } -func (p *Plugin) GetData(_ []uid.ID) string { - if p == nil || p.odcClient == nil { - return "" - } - +func (p *Plugin) queryPartitionStatus() { ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) defer cancel() - statusRep, err := p.odcClient.Status(ctx, &odc.StatusRequest{Running: true}, grpc.EmptyCallOption{}) + statusRep := &odc.StatusReply{} + var err error + + statusRep, err = p.odcClient.Status(ctx, &odc.StatusRequest{Running: true}, grpc.EmptyCallOption{}) if err != nil { log.WithField("level", infologger.IL_Support). WithField("call", "Status"). @@ -121,18 +138,52 @@ func (p *Plugin) GetData(_ []uid.ID) string { log.WithField("level", infologger.IL_Support). WithField("call", "Status"). WithError(fmt.Errorf("ODC Status response is nil")).Error("ODC error") + statusRep = &odc.StatusReply{} + } + + response := &OdcStatus{ + Status: statusRep.Status, + Message: statusRep.Msg, + Error: statusRep.Error, + Partitions: make(map[uid.ID]OdcPartitionInfo), + } + for _, v := range statusRep.Partitions { + var id uid.ID + id, err = uid.FromString(v.Partitionid) + if err != nil { + continue + } + response.Partitions[id] = OdcPartitionInfo{ + RunNumber: uint32(v.Runnr), + State: v.State, + } + } + + p.cachedStatusMu.Lock() + p.cachedStatus = response + p.cachedStatusMu.Unlock() +} + +func (p *Plugin) GetData(_ []uid.ID) string { + if p == nil || p.odcClient == nil { + return "" + } + + p.cachedStatusMu.RLock() + r := p.cachedStatus + if r == nil { + p.cachedStatusMu.RUnlock() + return "" } partitionStates := make(map[string]string) - if statusRep.Status == odc.ReplyStatus_SUCCESS { - for _, partitionInfo := range statusRep.Partitions { - if partitionInfo == nil { - continue - } - partitionStates[partitionInfo.Partitionid] = partitionInfo.State + if r.Status == odc.ReplyStatus_SUCCESS { + for id, partitionInfo := range r.Partitions { + partitionStates[id.String()] = partitionInfo.State } } + p.cachedStatusMu.RUnlock() out, err := json.Marshal(partitionStates) if err != nil { @@ -150,6 +201,28 @@ func (p *Plugin) Init(_ string) error { } log.Debug("ODC plugin initialized") } + + var ctx context.Context + ctx, p.cachedStatusCancelFunc = context.WithCancel(context.Background()) + + odcPollingIntervalStr := viper.GetString("odcPollingInterval") + odcPollingInterval, err := time.ParseDuration(odcPollingIntervalStr) + if err != nil { + odcPollingInterval = ODC_POLLING_INTERVAL + log.Debugf("ODC plugin cannot acquire polling interval, defaulting to %s", ODC_POLLING_INTERVAL.String()) + } + + // polling + go func() { + for { + select { + case <-ctx.Done(): + return + case <-time.After(odcPollingInterval): + p.queryPartitionStatus() + } + } + }() return nil } @@ -1081,5 +1154,6 @@ func (p *Plugin) parseDetectors(detectorsParam string) (detectors []string, err } func (p *Plugin) Destroy() error { + p.cachedStatusCancelFunc() return p.odcClient.Close() } From 9e2c5dcda17be3f838d1ed6853d5b746e3804f7a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 11:54:32 +0200 Subject: [PATCH 1168/2352] [core] CCDB user-visible string rename --- core/integration/ccdb/plugin.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index b280322ac..278e808b2 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,17 +29,18 @@ import ( "encoding/json" "errors" "fmt" + "net/url" + "os/exec" + "strconv" + "strings" + "time" + "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/workflow/callable" log "github.com/sirupsen/logrus" "github.com/spf13/viper" - "net/url" - "os/exec" - "strconv" - "strings" - "time" ) type GeneralRunParameters struct { @@ -163,7 +164,7 @@ func (p *Plugin) GetName() string { } func (p *Plugin) GetPrettyName() string { - return "The Condition and Calibration Data Base" + return "CCDB" } func (p *Plugin) GetEndpoint() string { From ff5f96453292ba1493c5af8acf8e30801051c4a4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 11:54:50 +0200 Subject: [PATCH 1169/2352] [core] ODC user-visible string rename --- core/integration/odc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 1ce242005..cfeeac3c7 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -107,7 +107,7 @@ func (p *Plugin) GetName() string { } func (p *Plugin) GetPrettyName() string { - return "ODC" + return "ODC (EPN subcontrol)" } func (p *Plugin) GetEndpoint() string { From 33cb8d8c906a0c6f6824f0ad58a02bcd588f728b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 11:56:27 +0200 Subject: [PATCH 1170/2352] [core] DD user-visible string rename --- core/integration/ddsched/plugin.go | 36 ++++++++++++++---------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index eee71c1aa..5c872f15c 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -48,13 +48,12 @@ import ( ) const ( - DDSCHED_DIAL_TIMEOUT = 2 * time.Second - DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second - DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second + DDSCHED_DIAL_TIMEOUT = 2 * time.Second + DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second + DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second DDSCHED_DEFAULT_POLLING_TIMEOUT = 30 * time.Second ) - type Plugin struct { ddSchedulerHost string ddSchedulerPort int @@ -90,7 +89,7 @@ func (p *Plugin) GetName() string { } func (p *Plugin) GetPrettyName() string { - return "DD scheduler" + return "DD (EPN DataDistribution TfScheduler)" } func (p *Plugin) GetEndpoint() string { @@ -113,7 +112,7 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { for _, envId := range environmentIds { in := ddpb.PartitionInfo{ - PartitionId: envId.String(), + PartitionId: envId.String(), EnvironmentId: envId.String(), } state, err := p.ddSchedClient.PartitionStatus(context.Background(), &in, grpc.EmptyCallOption{}) @@ -167,7 +166,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) - stack["PartitionInitialize"] = func() (out string) { // must formally return string even when we return nothing + stack["PartitionInitialize"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). Debug("performing DD scheduler PartitionInitialize") @@ -203,8 +202,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("error processing DD host_id_map") return } - var( - ddDiscoveryIbHostname, ddDiscoveryStfbId, ddDiscoveryStfsId string + var ( + ddDiscoveryIbHostname, ddDiscoveryStfbId, ddDiscoveryStfsId string ddDiscoveryIbHostnameOk, ddDiscoveryStfbIdOk, ddDiscoveryStfsIdOk bool ) ddDiscoveryIbHostname, ddDiscoveryIbHostnameOk = roleVS["dd_discovery_ib_hostname"] @@ -238,8 +237,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { EnvironmentId: envId, PartitionId: envId, }, - StfbHostIdMap: p.stfbHostIdMap, - StfsHostIdMap: p.stfsHostIdMap, + StfbHostIdMap: p.stfbHostIdMap, + StfsHostIdMap: p.stfsHostIdMap, PartitionParams: partitionParams, } @@ -310,8 +309,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - PARTITION_STATE_POLLING: - for ; ctx.Err() == nil ; { + PARTITION_STATE_POLLING: + for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { @@ -354,7 +353,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - stack["PartitionTerminate"] = func() (out string) { // must formally return string even when we return nothing + stack["PartitionTerminate"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). Debug("performing DD scheduler PartitionTerminate") @@ -436,8 +435,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - PARTITION_STATE_POLLING: - for ; ctx.Err() == nil ; { + PARTITION_STATE_POLLING: + for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { @@ -620,9 +619,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - - PARTITION_STATE_POLLING: - for ; ctx.Err() == nil ; { + PARTITION_STATE_POLLING: + for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: From d89e6af54053c4517cf154c2dbae0eb7784452e1 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 30 Mar 2022 14:21:55 +0200 Subject: [PATCH 1171/2352] [coconut][octrl-180] The nocolor output option is available for all coconut commands. --- coconut/README.md | 3 +++ coconut/cmd/root.go | 7 +++++-- coconut/control/control.go | 5 +++++ coconut/doc/coconut.md | 1 + coconut/doc/coconut_about.md | 1 + coconut/doc/coconut_configuration.md | 1 + coconut/doc/coconut_configuration_dump.md | 1 + coconut/doc/coconut_configuration_history.md | 1 + coconut/doc/coconut_configuration_import.md | 1 + coconut/doc/coconut_configuration_list.md | 1 + coconut/doc/coconut_configuration_show.md | 1 + coconut/doc/coconut_environment.md | 1 + coconut/doc/coconut_environment_control.md | 1 + coconut/doc/coconut_environment_create.md | 1 + coconut/doc/coconut_environment_destroy.md | 1 + coconut/doc/coconut_environment_list.md | 1 + coconut/doc/coconut_environment_show.md | 1 + coconut/doc/coconut_info.md | 1 + coconut/doc/coconut_repository.md | 1 + coconut/doc/coconut_repository_add.md | 1 + coconut/doc/coconut_repository_default-revision.md | 1 + coconut/doc/coconut_repository_default.md | 1 + coconut/doc/coconut_repository_list.md | 1 + coconut/doc/coconut_repository_refresh.md | 1 + coconut/doc/coconut_repository_remove.md | 1 + coconut/doc/coconut_role.md | 1 + coconut/doc/coconut_role_query.md | 1 + coconut/doc/coconut_task.md | 1 + coconut/doc/coconut_task_clean.md | 1 + coconut/doc/coconut_task_list.md | 1 + coconut/doc/coconut_template.md | 1 + coconut/doc/coconut_template_list.md | 1 + 32 files changed, 42 insertions(+), 2 deletions(-) diff --git a/coconut/README.md b/coconut/README.md index 8116105cf..f20c2bfa6 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -26,6 +26,7 @@ log: level: info # values: panic fatal error warning info debug verbose: false # set to true to debug coconut nospinner: false # set to true if calling coconut from a script +nocolor: false # set to true if calling coconut from a script ``` ## Using `coconut` @@ -55,6 +56,7 @@ Global Flags: --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` @@ -119,6 +121,7 @@ Global Flags: --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/cmd/root.go b/coconut/cmd/root.go index 55f68a68d..ed24ae0ce 100644 --- a/coconut/cmd/root.go +++ b/coconut/cmd/root.go @@ -80,15 +80,17 @@ func init() { // Cobra supports persistent flags, which, if defined here, // will be global for your application. rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) - rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:32102", product.PRETTY_SHORTNAME + " core endpoint as HOST:PORT") + rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:32102", product.PRETTY_SHORTNAME+" core endpoint as HOST:PORT") rootCmd.PersistentFlags().String("config_endpoint", "consul://127.0.0.1:8500", "configuration endpoint used by AliECS core as PROTO://HOST:PORT") rootCmd.PersistentFlags().BoolP("verbose", "v", false, "show verbose output for debug purposes") rootCmd.PersistentFlags().Bool("nospinner", false, "disable animations in output") + rootCmd.PersistentFlags().Bool("nocolor", false, "disable colors in output") viper.BindPFlag("endpoint", rootCmd.PersistentFlags().Lookup("endpoint")) viper.BindPFlag("config_endpoint", rootCmd.PersistentFlags().Lookup("config_endpoint")) viper.BindPFlag("verbose", rootCmd.PersistentFlags().Lookup("verbose")) viper.BindPFlag("nospinner", rootCmd.PersistentFlags().Lookup("nospinner")) + viper.BindPFlag("nocolor", rootCmd.PersistentFlags().Lookup("nocolor")) // Cobra also supports local flags, which will only run // when this action is called directly. @@ -102,6 +104,7 @@ func initConfig() { viper.SetDefault("config_endpoint", "127.0.0.1:8500") viper.SetDefault("verbose", false) viper.SetDefault("nospinner", false) + viper.SetDefault("nocolor", false) if cfgFile != "" { // Use config file from the flag. @@ -115,7 +118,7 @@ func initConfig() { } // Search config in .config/coconut directory with name "settings.yaml" - viper.AddConfigPath(path.Join(home, ".config/" + app.NAME)) + viper.AddConfigPath(path.Join(home, ".config/"+app.NAME)) viper.SetConfigName("settings") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 8b08bbd10..17bdff82e 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -30,6 +30,7 @@ import ( "context" "errors" "fmt" + "github.com/fatih/color" "io" "os" "regexp" @@ -80,6 +81,10 @@ func WrapCall(call ControlCall) RunFunc { s.Start() } + if viper.GetBool("nocolor") { + color.NoColor = true + } + cxt, cancel := context.WithTimeout(context.Background(), CALL_TIMEOUT) rpc := coconut.NewClient(cxt, cancel, endpoint) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 458886d81..0fe71417f 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -17,6 +17,7 @@ For more information on the available commands, see the individual documentation --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") -h, --help help for coconut --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index b7ebd46c5..7d64ccf6c 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -23,6 +23,7 @@ coconut about [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 35ba31793..492ee23c6 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -20,6 +20,7 @@ configuration store. --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index bacfa9990..0152ede26 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -28,6 +28,7 @@ coconut configuration dump [key] [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index eca60db8d..43ef6b7c8 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -34,6 +34,7 @@ coconut conf history /// --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index 7a3a6400a..b8f969ccd 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -44,6 +44,7 @@ coconut conf import --no-versioning --new-compon --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index 63006ea7c..d2fdde926 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -34,6 +34,7 @@ coconut conf list -t --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 8452ed8ca..9af0ae7c6 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -42,6 +42,7 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 78af30e82..85be2041a 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -40,6 +40,7 @@ For more information on the behavior of coconut environments, see the subcommand --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 860620b69..80e8c74fc 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -33,6 +33,7 @@ coconut environment control [environment id] [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index a8f24b0e9..07d163eb6 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -40,6 +40,7 @@ coconut environment create [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 4d7804f0c..2da544e2f 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -30,6 +30,7 @@ coconut environment destroy [environment id] [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 8f1d7e64c..c6151722d 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -24,6 +24,7 @@ coconut environment list [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index ac42fd55f..168af95c4 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -26,6 +26,7 @@ coconut environment show [environment id] [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index 6aedcb473..7677ebf7c 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -24,6 +24,7 @@ coconut info [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 06059b186..c339b93df 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -44,6 +44,7 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index a4964129a..e65b6a31d 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -30,6 +30,7 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index d3d28cff5..50bf47400 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -30,6 +30,7 @@ coconut repository default-revision [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index d6e4208bf..28768fe59 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -23,6 +23,7 @@ coconut repository default [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 4c884c79b..5b0fb956f 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -23,6 +23,7 @@ coconut repository list [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 7dffd58f3..9d3424cb9 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -23,6 +23,7 @@ coconut repository refresh [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 84797decb..881c1a4ca 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -23,6 +23,7 @@ coconut repository remove [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index bd72b8d7b..16c97dbae 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -20,6 +20,7 @@ display information on active roles. --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 80007fd57..3a248d0c8 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -23,6 +23,7 @@ coconut role query [environment id] [query path] [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 18ea6230a..9e09b8c01 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -20,6 +20,7 @@ manage active tasks. --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 78daea9af..29ab4782a 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -25,6 +25,7 @@ coconut task clean [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index d8ca802ca..4b4e7763e 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -24,6 +24,7 @@ coconut task list [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 083a36245..e030f60f6 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -20,6 +20,7 @@ display information on available workflow templates. --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index e08016b90..a3e1a60dc 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -48,6 +48,7 @@ coconut template list [flags] --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") --nospinner disable animations in output + --nocolor disable colors in output -v, --verbose show verbose output for debug purposes ``` From afc5c9ce7d7538aaf411f71fdd81799192ef8b80 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 12:09:48 +0200 Subject: [PATCH 1172/2352] [core] SOR/EOR messages for DCS and TRG improvements --- core/integration/dcs/plugin.go | 23 +++++++++++++++-------- core/integration/trg/plugin.go | 17 +++++++++++------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index f49393c33..73994f204 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -58,8 +58,7 @@ type Plugin struct { dcsHost string dcsPort int - dcsClient *RpcClient - + dcsClient *RpcClient pendingEORs map[string] /*envId*/ int64 } @@ -449,12 +448,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debugf("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) } } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("runNumber", runNumber64). + Info("ALIECS SOR operation : completed DCS SOR for ") + } else { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("runNumber", runNumber64). + Info("ALIECS SOR operation : processing DCS SOR for ") + } - log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("level", infologger.IL_Devel). - WithField("runNumber", runNumber64). - Info("incoming DCS SOR event") } dcsFailedDetectors := make([]string, 0) @@ -748,7 +755,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("runNumber", runNumber64). - Info("incoming DCS EOR event") + Info("ALIECS EOR operation : processing DCS EOR for ") } dcsFailedDetectors := make([]string, 0) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index df5ae4e29..e873d988d 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -141,7 +141,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - Debug("performing TRG Run load Request") + Info("ALIECS SOR operation : performing TRG Run Load Request") globalConfig, ok := varStack["trg_global_config"] log.WithField("globalConfig",globalConfig). @@ -275,12 +275,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingRunUnloads[envId] = runNumber64 log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("TRG RunLoad success") + Info("ALIECS SOR Operation : TRG RunLoad success") return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.Debug("performing TRG Run Start") + log.WithField("partition", envId). + Info("ALIECS SOR operation : performing TRG Run Start") runtimeConfig, ok := varStack["trg_runtime_config"] if !ok { @@ -618,12 +619,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingRunUnloads, envId) log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("TRG RunUnload success") + Info("ALICECS EOR operation : TRG RunUnload success") return } stack["RunStop"] = func() (out string) { - log.Debug("performing TRG Run Stop") + log.WithField("partition", envId). + //WithField("runNumber", runNumber64). + Info("ALIECS EOR operation : performing TRG Run Stop ") rn := varStack["run_number"] var runNumber64 int64 @@ -638,7 +641,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return runStopFunc(runNumber64) } stack["RunUnload"] = func() (out string) { - log.Debug("performing TRG Run Unload") + log.WithField("partition", envId). + //WithField("runNumber", runNumber64). + Info("ALIECS EOR operation : performing TRG Run Unload ") rn := varStack["run_number"] var runNumber64 int64 From f75684d2803aa3a6347d130abae69fb40afb80fc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 12:13:51 +0200 Subject: [PATCH 1173/2352] [build] Bump to v0.38.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8f2ea0d2b..a48de784f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 37 +VERSION_MINOR := 38 VERSION_PATCH := 0 From eae90a7d99d42744da6a649cc04fbfb43a34da2e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 31 Mar 2022 11:26:19 +0200 Subject: [PATCH 1174/2352] [core] TRG: implement run list query in GetData --- core/integration/dcs/plugin.go | 10 +- core/integration/trg/plugin.go | 53 +++++++-- core/integration/trg/protos/ctpecs.proto | 61 +++++----- core/integration/trg/trgutil.go | 140 +++++++++++++++++++++++ 4 files changed, 222 insertions(+), 42 deletions(-) create mode 100644 core/integration/trg/trgutil.go diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 73994f204..582cacebd 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -348,6 +348,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) + for _, v := range detectors { + detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE + } + // Point of no return // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via // the response stream. @@ -370,11 +375,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later - detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) - for _, v := range detectors { - detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE - } - var dcsEvent *dcspb.RunEvent for { if ctx.Err() != nil { diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index e873d988d..2a86fbad4 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -49,13 +49,13 @@ import ( const TRG_DIAL_TIMEOUT = 2 * time.Second type Plugin struct { - trgHost string - trgPort int + trgHost string + trgPort int - trgClient *RpcClient + trgClient *RpcClient - pendingRunStops map[string /*envId*/]int64 - pendingRunUnloads map[string /*envId*/]int64 + pendingRunStops map[string] /*envId*/ int64 + pendingRunUnloads map[string] /*envId*/ int64 } func NewPlugin(endpoint string) integration.Plugin { @@ -101,7 +101,46 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { if p == nil || p.trgClient == nil { return "" } - return "" + + runReply, err := p.trgClient.RunList(context.Background(), &trgecspb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("call", "RunList"). + Error("TRG error") + + return fmt.Sprintf("error querying TRG service at %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + } + + structured, err := parseRunList(int(runReply.Rc), runReply.Msg) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("call", "RunList"). + Error("TRG error") + + return fmt.Sprintf("error parsing response from TRG service at %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + } + + out := struct { + RunCount int `json:"runCount,omitempty"` + Lines []string `json:"lines,omitempty"` + Structured Runs `json:"structured,omitempty"` + }{ + RunCount: int(runReply.Rc), + Lines: strings.Split(runReply.Msg, "\n"), + Structured: structured, + } + + var js []byte + js, err = json.Marshal(out) + if err != nil { + return fmt.Sprintf("error marshaling TRG service response from %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + } + + return string(js[:]) } func (p *Plugin) Init(instanceId string) error { @@ -144,7 +183,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("ALIECS SOR operation : performing TRG Run Load Request") globalConfig, ok := varStack["trg_global_config"] - log.WithField("globalConfig",globalConfig). + log.WithField("globalConfig", globalConfig). WithField("partition", envId). Debug("not a TRG Global Run, continuing with TRG Run Start") if !ok { diff --git a/core/integration/trg/protos/ctpecs.proto b/core/integration/trg/protos/ctpecs.proto index c1b7e9a13..6647f0adc 100644 --- a/core/integration/trg/protos/ctpecs.proto +++ b/core/integration/trg/protos/ctpecs.proto @@ -4,10 +4,10 @@ option go_package = "protos;ctpecs"; // ctpd interface for ECS service CTPd { -// global run: + // global run: rpc RunLoad (RunLoadRequest) returns (RunReply) {} rpc RunUnload (RunStopRequest) returns (RunReply) {} -// stdalone and global runs: + // stdalone and global runs: rpc RunStart (RunStartRequest) returns (RunReply) {} rpc RunStatus (RunStatusRequest) returns (RunReply) {} rpc RunList (Empty) returns (RunReply) {} @@ -17,35 +17,35 @@ service CTPd { //import "ctpecs_m.proto"; // global runs only: message RunLoadRequest { - uint32 runn = 1; // run number - string config = 2; - // -config, i.e. the content of partname.pd - // -partname -the content is in ctp config dir partname.pd - // -key in case the config is available in Consul[key] - string detectors= 3; // available detectors, "" -all required must be ready + uint32 runn = 1; // run number + string config = 2; + // -config, i.e. the content of partname.pd + // -partname -the content is in ctp config dir partname.pd + // -key in case the config is available in Consul[key] + string detectors= 3; // available detectors, "" -all required must be ready } // global + stdalone runs (common for ctpd/ltud): message RunStartRequest { - uint32 runn = 1; // run number - string config = 2; - // -config, e.g. "trig\nPH_bc 100 inf" or - // -key in case the config is available in Consul[key] - // -"" use default configuration - // - // Optional parameters follows, overriding parameters in config string - // for the begining let's agree on three parameters : - enum Mode { - NULL = 0; // use default (from config) - TRIG = 1; - CONT = 2; - } - Mode mode = 3; - string ph_bc = 4; // BC-downscaled rate of physics triggers - string ph_rnd = 5; // rate of physics triggers generated randomly - // ph_ ...: "": use default (from config) - // N : number of BCs between 2 triggers - // 2.3khz rate of triggers: 2.3 khz - string detector = 6; // detector has to be given for stdalone runs, "" for global run + uint32 runn = 1; // run number + string config = 2; + // -config, e.g. "trig\nPH_bc 100 inf" or + // -key in case the config is available in Consul[key] + // -"" use default configuration + // + // Optional parameters follows, overriding parameters in config string + // for the begining let's agree on three parameters : + enum Mode { + NULL = 0; // use default (from config) + TRIG = 1; + CONT = 2; + } + Mode mode = 3; + string ph_bc = 4; // BC-downscaled rate of physics triggers + string ph_rnd = 5; // rate of physics triggers generated randomly + // ph_ ...: "": use default (from config) + // N : number of BCs between 2 triggers + // 2.3khz rate of triggers: 2.3 khz + string detector = 6; // detector has to be given for stdalone runs, "" for global run } message RunStatusRequest { uint32 runn = 1; @@ -55,8 +55,9 @@ message RunStopRequest { uint32 runn = 1; string detector = 2; // only for stdalone runs (forced stop) } -message RunReply { +message RunReply { int32 rc = 1; // 0: ok -// RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist + // RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist string msg = 2; // response (usually "" when rc is 0) } + diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go new file mode 100644 index 000000000..61bc9ac98 --- /dev/null +++ b/core/integration/trg/trgutil.go @@ -0,0 +1,140 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package trg + +import ( + "fmt" + "strconv" + "strings" + + "github.com/AliceO2Group/Control/common/system" +) + +type Run struct { + Cardinality RunCardinality + RunNumber uint32 + State State + Detectors []system.ID +} + +type Runs []Run + +type RunCardinality int +type State int + +const ( + __RunCardinality_NIL RunCardinality = iota + CTP_STANDALONE + CTP_GLOBAL + __RunCardinality_MAX +) + +const ( + __State_NIL State = iota + CTP_LOADED + CTP_RUNNING + __State_MAX +) + +// respose examples: +//ecsc>rlist +//rc:4 +//G 511707 R tpc run511707 +//G 511713 R its, mft, mid, mch, tof, trd, emc, cpv run511713 +//G 511714 R phs run511714 +//G 511715 R zdc run511715 +// +//ecsc>rlist +//rc:3 +//S 2222 R hmp +//S 2223 R fv0 +//G 2224 L its, tpc run2224 + +func parseRunList(runCount int, payload string) (runs Runs, err error) { + lines := strings.Split(strings.TrimSpace(payload), "\n") + if len(lines) != runCount { + err = fmt.Errorf("cannot parse run count mismatch in payload: %s", payload) + return + } + runs = make(Runs, runCount) + + for i, line := range lines { + runs[i], err = parseRunLine(line) + err = fmt.Errorf("cannot parse line %d: %w", i, err) + return + } + + return +} + +func parseRunLine(line string) (run Run, err error) { + // lst= lst+"S {:6} R {:3}\n".format(runn, self.sruns[runn]) + // lst= lst+"G {:6} {:1} {} {}\n".format(runn, st, ", ".join(self.gruns[runn].getDets()), self.gruns[runn].pname) + coarseSplit := strings.Split(line, " ") // first we split by 5-spaces + + first3cols := strings.Fields(coarseSplit[0]) + + if first3cols[0] == "S" { + run.Cardinality = CTP_STANDALONE + run.State = CTP_RUNNING + } else if first3cols[0] == "G" { + run.Cardinality = CTP_GLOBAL + if first3cols[2] == "R" { + run.State = CTP_RUNNING + } else if first3cols[2] == "L" { + run.State = CTP_LOADED + } else { + run.State = __State_NIL + err = fmt.Errorf("cannot parse run state from line: %s", line) + return + } + } else { + run.Cardinality = __RunCardinality_NIL + err = fmt.Errorf("cannot parse run cardinality from line: %s", line) + return + } + + rn64, err := strconv.ParseUint(first3cols[1], 10, 32) + run.RunNumber = uint32(rn64) + if err != nil { + err = fmt.Errorf("cannot parse run number from line: %s", line) + return + } + + run.Detectors = make([]system.ID, 0) + + detectorsSSlice := strings.Split(strings.ToUpper(coarseSplit[1]), ", ") + for _, item := range detectorsSSlice { + var det system.ID + det, err = system.IDString(strings.TrimSpace(item)) + if err != nil { + err = fmt.Errorf("cannot parse detector %s from line: %s", item, line) + return + } + run.Detectors = append(run.Detectors, det) + } + + return +} From 9bddeea00f67abd17be5135000ebf723bc44aefa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 18:13:23 +0200 Subject: [PATCH 1175/2352] [core] TRG asynchronous GetData + RunList polling + reconciliation --- core/config.go | 4 + core/integration/trg/plugin.go | 198 +++++++++++++++++++++++++++----- core/integration/trg/trgutil.go | 7 +- 3 files changed, 179 insertions(+), 30 deletions(-) diff --git a/core/config.go b/core/config.go index 4147fed90..8a02d0df8 100644 --- a/core/config.go +++ b/core/config.go @@ -102,6 +102,8 @@ func setDefaults() error { viper.SetDefault("dcsServiceUseSystemProxy", false) viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) + viper.SetDefault("trgServiceEndpoint", "//127.0.0.1:50060") + viper.SetDefault("trgPollingInterval", "3s") viper.SetDefault("odcEndpoint", "//127.0.0.1:50053") viper.SetDefault("odcPollingInterval", "3s") viper.SetDefault("odcUseSystemProxy", false) @@ -156,6 +158,8 @@ func setFlags() error { pflag.Bool("dcsServiceUseSystemProxy", viper.GetBool("dcsServiceUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") + pflag.String("trgServiceEndpoint", viper.GetString("trgServiceEndpoint"), "Endpoint of the TRG gRPC service (`host:port`)") + pflag.String("trgPollingInterval", viper.GetString("trgPollingInterval"), "How often to query the TRG gRPC service for run status (default: 3s)") pflag.String("odcEndpoint", viper.GetString("odcEndpoint"), "Endpoint of the ODC gRPC service (`host:port`)") pflag.String("odcPollingInterval", viper.GetString("odcPollingInterval"), "How often to query the ODC gRPC service for partition status (default: 3s)") pflag.Bool("odcUseSystemProxy", viper.GetBool("odcUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 2a86fbad4..46dfc524b 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -34,19 +34,25 @@ import ( "net/url" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" - trgecspb "github.com/AliceO2Group/Control/core/integration/trg/protos" + trgpb "github.com/AliceO2Group/Control/core/integration/trg/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) -const TRG_DIAL_TIMEOUT = 2 * time.Second +const ( + TRG_DIAL_TIMEOUT = 2 * time.Second + TRG_POLLING_INTERVAL = 3 * time.Second + TRG_RECONCILIATION_TIMEOUT = 5 * time.Second +) type Plugin struct { trgHost string @@ -56,6 +62,16 @@ type Plugin struct { pendingRunStops map[string] /*envId*/ int64 pendingRunUnloads map[string] /*envId*/ int64 + + cachedStatus *TrgStatus + cachedStatusMu sync.RWMutex + cachedStatusCancelFunc context.CancelFunc +} + +type TrgStatus struct { + RunCount int `json:"runCount,omitempty"` + Lines []string `json:"lines,omitempty"` + Structured Runs `json:"structured,omitempty"` } func NewPlugin(endpoint string) integration.Plugin { @@ -97,50 +113,69 @@ func (p *Plugin) GetConnectionState() string { return p.trgClient.conn.GetState().String() } -func (p *Plugin) GetData(environmentIds []uid.ID) string { - if p == nil || p.trgClient == nil { - return "" - } - - runReply, err := p.trgClient.RunList(context.Background(), &trgecspb.Empty{}, grpc.EmptyCallOption{}) +func (p *Plugin) queryRunList() { + runReply, err := p.trgClient.RunList(context.Background(), &trgpb.Empty{}, grpc.EmptyCallOption{}) if err != nil { + err = fmt.Errorf("error querying TRG service at %s: %w", viper.GetString("trgServiceEndpoint"), err) log.WithError(err). WithField("level", infologger.IL_Devel). WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("call", "RunList"). Error("TRG error") - - return fmt.Sprintf("error querying TRG service at %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + } + if runReply == nil { + log.WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("call", "RunList"). + WithError(fmt.Errorf("TRG RunList response is nil")). + Error("TRG error") + runReply = &trgpb.RunReply{} } structured, err := parseRunList(int(runReply.Rc), runReply.Msg) if err != nil { + err = fmt.Errorf("error parsing response from TRG service at %s: %w", viper.GetString("trgServiceEndpoint"), err) log.WithError(err). WithField("level", infologger.IL_Devel). WithField("endpoint", viper.GetString("trgServiceEndpoint")). WithField("call", "RunList"). Error("TRG error") - - return fmt.Sprintf("error parsing response from TRG service at %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + } + if structured == nil { + structured = make(Runs, 0) } - out := struct { - RunCount int `json:"runCount,omitempty"` - Lines []string `json:"lines,omitempty"` - Structured Runs `json:"structured,omitempty"` - }{ + out := &TrgStatus{ RunCount: int(runReply.Rc), Lines: strings.Split(runReply.Msg, "\n"), Structured: structured, } - var js []byte - js, err = json.Marshal(out) + p.cachedStatusMu.Lock() + p.cachedStatus = out + p.cachedStatusMu.Unlock() +} + +func (p *Plugin) GetData(_ []uid.ID) string { + if p == nil || p.trgClient == nil { + return "" + } + + p.cachedStatusMu.RLock() + r := p.cachedStatus + if r == nil { + p.cachedStatusMu.RUnlock() + return "" + } + + out, err := json.Marshal(r) + p.cachedStatusMu.RUnlock() + if err != nil { - return fmt.Sprintf("error marshaling TRG service response from %s: %s", viper.GetString("trgServiceEndpoint"), err.Error()) + return "" } + return string(out[:]) - return string(js[:]) } func (p *Plugin) Init(instanceId string) error { @@ -155,9 +190,113 @@ func (p *Plugin) Init(instanceId string) error { if p.trgClient == nil { return fmt.Errorf("failed to start TRG client on %s", viper.GetString("trgServiceEndpoint")) } + + var ctx context.Context + ctx, p.cachedStatusCancelFunc = context.WithCancel(context.Background()) + + trgPollingIntervalStr := viper.GetString("trgPollingInterval") + trgPollingInterval, err := time.ParseDuration(trgPollingIntervalStr) + if err != nil { + trgPollingInterval = TRG_POLLING_INTERVAL + log.Debugf("TRG plugin cannot acquire polling interval, defaulting to %s", TRG_POLLING_INTERVAL.String()) + } + + // polling + go func() { + for { + select { + case <-ctx.Done(): + return + case <-time.After(trgPollingInterval): + p.queryRunList() + p.reconcile() + } + } + }() return nil } +func (p *Plugin) reconcile() { + envMan := environment.ManagerInstance() + envIds := envMan.Ids() + activeEcsRuns := make(map[uint32]struct{}) + for _, envId := range envIds { + env, err := envMan.Environment(envId) + if err != nil || env == nil { + continue + } + rn := env.GetCurrentRunNumber() + if rn != 0 { + activeEcsRuns[rn] = struct{}{} + } + } + + p.cachedStatusMu.RLock() + if p.cachedStatus != nil && len(p.cachedStatus.Structured) > 0 { + for _, trgRun := range p.cachedStatus.Structured { + if _, contains := activeEcsRuns[trgRun.RunNumber]; contains { // if activeEcsRuns contains a RN known to TRG + continue + } else { // found TRG run unknown to AliECS + if p.trgClient == nil { + continue + } + in := trgpb.RunStopRequest{ // applies to both RunStop and RunUnload + Runn: trgRun.RunNumber, + Detector: "", + } + + if trgRun.State == CTP_RUNNING { // both STANDALONE and GLOBAL + if trgRun.Cardinality == CTP_STANDALONE { // if global run, we send no detector + if len(trgRun.Detectors) == 1 { + in.Detector = trgRun.Detectors[0].String() + } + } + ctx, _ := context.WithTimeout(context.Background(), TRG_RECONCILIATION_TIMEOUT) + _, err := p.trgClient.RunStop(ctx, &in, grpc.EmptyCallOption{}) + if err != nil { + err = fmt.Errorf("TRG reconciliation failure: %w", err) + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", trgRun.RunNumber). + WithField("call", "RunStop"). + Error("TRG error") + } else { + if trgRun.Cardinality == CTP_GLOBAL { + trgRun.State = CTP_LOADED // must be loaded if GLOBAL && RunStop successful + } else { + log.WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", trgRun.RunNumber). + Info("TRG STANDALONE reconciliation complete") + } + } + } + if trgRun.State == CTP_LOADED && trgRun.Cardinality == CTP_GLOBAL { + ctx, _ := context.WithTimeout(context.Background(), TRG_RECONCILIATION_TIMEOUT) + _, err := p.trgClient.RunUnload(ctx, &in, grpc.EmptyCallOption{}) + if err != nil { + err = fmt.Errorf("TRG reconciliation failure: %w", err) + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", trgRun.RunNumber). + WithField("call", "RunUnload"). + Error("TRG error") + } else { + log.WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", trgRun.RunNumber). + Info("TRG GLOBAL reconciliation complete") + } + } + } + } + } + p.cachedStatusMu.RUnlock() + +} + func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack @@ -235,7 +374,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - in := trgecspb.RunLoadRequest{ + in := trgpb.RunLoadRequest{ Runn: uint32(runNumber64), Detectors: detectors, Config: globalConfig, @@ -274,7 +413,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var response *trgecspb.RunReply + var response *trgpb.RunReply response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -371,7 +510,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectors = "" } - in := trgecspb.RunStartRequest{ + in := trgpb.RunStartRequest{ Runn: uint32(runNumber64), Detector: detectors, Config: runtimeConfig, @@ -410,7 +549,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var response *trgecspb.RunReply + var response *trgpb.RunReply response, err = p.trgClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { @@ -475,7 +614,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectors = "" } - in := trgecspb.RunStopRequest{ + in := trgpb.RunStopRequest{ Runn: uint32(runNumber64), Detector: detectors, } @@ -515,7 +654,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var response *trgecspb.RunReply + var response *trgpb.RunReply response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -578,7 +717,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - in := trgecspb.RunStopRequest{ + in := trgpb.RunStopRequest{ Runn: uint32(runNumber64), // "" when unloading global run Detector: "", @@ -619,7 +758,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var response *trgecspb.RunReply + var response *trgpb.RunReply response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -756,5 +895,6 @@ func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err } func (p *Plugin) Destroy() error { + p.cachedStatusCancelFunc() return p.trgClient.Close() } diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index 61bc9ac98..d89362656 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -73,7 +73,12 @@ const ( //G 2224 L its, tpc run2224 func parseRunList(runCount int, payload string) (runs Runs, err error) { - lines := strings.Split(strings.TrimSpace(payload), "\n") + cleanPayload := strings.TrimSpace(payload) + if len(cleanPayload) == 0 { + err = fmt.Errorf("empty RunList response payload") + return + } + lines := strings.Split(strings.TrimSpace(cleanPayload), "\n") if len(lines) != runCount { err = fmt.Errorf("cannot parse run count mismatch in payload: %s", payload) return From 81471669b7048253342c3c532debe9f57bded36b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Apr 2022 18:16:49 +0200 Subject: [PATCH 1176/2352] [build] Bump to v0.38.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a48de784f..ec1a0bbc8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 38 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 399e8d8a2e31bdfe46903bdfb8187eed515ee6d5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 4 Apr 2022 16:35:01 +0200 Subject: [PATCH 1177/2352] [core] Make TRG RunList line parsing forward-compatible --- core/integration/trg/trgutil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index d89362656..0a4e5d850 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -130,7 +130,7 @@ func parseRunLine(line string) (run Run, err error) { run.Detectors = make([]system.ID, 0) - detectorsSSlice := strings.Split(strings.ToUpper(coarseSplit[1]), ", ") + detectorsSSlice := strings.Split(strings.ToUpper(coarseSplit[1]), ",") for _, item := range detectorsSSlice { var det system.ID det, err = system.IDString(strings.TrimSpace(item)) From 4d5a427dbf6fd43d9da7f05ad9d2f3a80ee864a0 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 24 Mar 2022 10:06:06 +0100 Subject: [PATCH 1178/2352] [core] Kafka plugin to publish FSM state transitions --- Makefile | 2 +- cmd/o2-aliecs-core/main.go | 5 + core/config.go | 1 + core/integration/ccdb/plugin.go | 1 - core/integration/kafka/plugin.go | 271 +++++++++++++++++ core/integration/kafka/protos/kafka.pb.go | 340 ++++++++++++++++++++++ core/integration/kafka/protos/kafka.proto | 21 ++ go.mod | 1 + go.sum | 2 + 9 files changed, 642 insertions(+), 2 deletions(-) create mode 100644 core/integration/kafka/plugin.go create mode 100644 core/integration/kafka/protos/kafka.pb.go create mode 100644 core/integration/kafka/protos/kafka.proto diff --git a/Makefile b/Makefile index d6d2283f5..2c7498baa 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/odc ./executor ./walnut ./core/integration/trg +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index c72c933f0..4fa1ed7d7 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/core/integration/ccdb" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" + "github.com/AliceO2Group/Control/core/integration/kafka" "github.com/AliceO2Group/Control/core/integration/odc" "github.com/AliceO2Group/Control/core/integration/testplugin" "github.com/AliceO2Group/Control/core/integration/trg" @@ -54,6 +55,10 @@ func init() { "ddsched", "ddSchedulerEndpoint", ddsched.NewPlugin) + integration.RegisterPlugin( + "kafka", + "kafkaBroker", + kafka.NewPlugin) integration.RegisterPlugin( "odc", "odcEndpoint", diff --git a/core/config.go b/core/config.go index 8a02d0df8..d2936f2d3 100644 --- a/core/config.go +++ b/core/config.go @@ -113,6 +113,7 @@ func setDefaults() error { viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") + viper.SetDefault("kafkaBroker", "localhost:9092") return nil } diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 278e808b2..0c90b14c7 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -103,7 +103,6 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { detectorsSlice, err := parseDetectors(detectorsStr) if err != nil { log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). Error("cannot parse general detector list") return nil } diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go new file mode 100644 index 000000000..1b0ebfdca --- /dev/null +++ b/core/integration/kafka/plugin.go @@ -0,0 +1,271 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. protos/kafka.proto + +package kafka + +import ( + "encoding/json" + "fmt" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" + kafkapb "github.com/AliceO2Group/Control/core/integration/kafka/protos" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/confluentinc/confluent-kafka-go/kafka" + "github.com/golang/protobuf/proto" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "net/url" + "strconv" + "time" +) + +type Plugin struct { + kafkaBroker string + kafkaProducer *kafka.Producer + envsInRunning map[string]*kafkapb.EnvInfo // env id is the key +} + +func NewPlugin(endpoint string) integration.Plugin { + _, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + return &Plugin{ + kafkaBroker: endpoint, + kafkaProducer: nil, + } +} + +func (p *Plugin) GetName() string { + return "kafka" +} + +func (p *Plugin) GetPrettyName() string { + return "Kafka FSM transition information service" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("kafkaBroker") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.kafkaProducer == nil { + return "UNKNOWN" + } else { + return "READY" + } +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + return "" +} + +func (p *Plugin) FSMTransitionTopic(state string) string { + return "FSM_" + state +} + +func (p *Plugin) ActiveRunsListTopic() string { + return "ACTIVE_RUNS" +} + +func (p *Plugin) Init(instanceId string) error { + var err error + p.kafkaProducer, err = kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": p.kafkaBroker}) + if err != nil { + return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %s", p.kafkaBroker, err.Error()) + } + p.envsInRunning = make(map[string]*kafkapb.EnvInfo) + log.Info("Successfully created a kafka producer with broker '" + p.kafkaBroker + "'") + return nil +} + +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + return stack +} + +func parseDetectors(detectorsParam string) (detectors []string, err error) { + detectorsSlice := make([]string, 0) + bytes := []byte(detectorsParam) + err = json.Unmarshal(bytes, &detectorsSlice) + if err != nil { + log.WithError(err). + Error("error processing the detectors list") + return + } + return detectorsSlice, nil +} + +func (p *Plugin) NewEnvStateObject(varStack map[string]string, state string) *kafkapb.EnvInfo { + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return nil + } + + var runNumberOpt *uint32 = nil + var runTypeOpt *string = nil + if state == "RUNNING" { + // the following fields are relevant only in RUNNING state + runNumberStr, ok := varStack["run_number"] + if ok { + runNumber, err := strconv.ParseUint(runNumberStr, 10, 32) + if err == nil { + runNumber32 := uint32(runNumber) + runNumberOpt = &runNumber32 + } + } + + runType, ok := varStack["run_type"] + if ok { + runTypeOpt = &runType + } + } + + detectorsStr, ok := varStack["detectors"] + if !ok { + log.WithField("partition", envId). + Error("cannot acquire general detector list from varStack") + } + detectorsSlice, err := parseDetectors(detectorsStr) + if err != nil { + log.WithField("partition", envId). + Error("cannot parse general detector list") + return nil + } + + return &kafkapb.EnvInfo{ + EnvironmentId: envId, + RunNumber: runNumberOpt, + RunType: runTypeOpt, + State: state, + Detectors: detectorsSlice, + } +} + +func (p *Plugin) UpdateRunningEnvList(envInfo *kafkapb.EnvInfo) { + if envInfo.State == "RUNNING" { + p.envsInRunning[envInfo.EnvironmentId] = envInfo + } else { + delete(p.envsInRunning, envInfo.EnvironmentId) + } +} + +func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { + var array []*kafkapb.EnvInfo + for _, v := range p.envsInRunning { + array = append(array, v) + } + return array +} + +func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { + log.WithField("partition", envId). + Debug("Producing a new kafka message on topic ", topic) + + deliveryChannel := make(chan kafka.Event) + err := p.kafkaProducer.Produce(&kafka.Message{ + TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, + Value: message, + }, deliveryChannel) + + if err != nil { + log.WithField("partition", envId). + Error("Kafka message delivery failed: ", err.Error()) + } + + e := <-deliveryChannel + m := e.(*kafka.Message) + + if m.TopicPartition.Error != nil { + log.WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) + } else { + log.WithField("partition", envId).Debugf("Kafka message delivered message to topic %s [%d] at offset %v\n", + *m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset) + } +} + +func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) func() string { + return func() (out string) { + // Retrieve and update the env info + timestamp := uint64(time.Now().UnixNano() / 1000000) + envInfo := p.NewEnvStateObject(varStack, state) + p.UpdateRunningEnvList(envInfo) + + // Prepare and send new state notification + log.WithField("partition", envInfo.EnvironmentId). + Debug("Advertising the environment state (" + state + ") and active runs list to Kafka") + newStateNotification := &kafkapb.NewStateNotification{ + EnvInfo: envInfo, + Timestamp: timestamp, + } + nsnData, err := proto.Marshal(newStateNotification) + if err != nil { + log.WithField("partition", envInfo.EnvironmentId). + Error("Could not marshall a new state notification: ", err) + } + p.ProduceMessage(nsnData, p.FSMTransitionTopic(state), envInfo.EnvironmentId) + + // Prepare and send active run list + activeRunsList := &kafkapb.ActiveRunsList{ + ActiveRuns: p.GetRunningEnvList(), + Timestamp: timestamp, + } + arlData, err := proto.Marshal(activeRunsList) + if err != nil { + log.WithField("partition", envInfo.EnvironmentId). + Error("Could not marshall an active runs list: ", err) + } + p.ProduceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId) + return + } +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + + stack = make(map[string]interface{}) + stack["Standby"] = p.CreateUpdateCallback(varStack, "STANDBY") + stack["Deployed"] = p.CreateUpdateCallback(varStack, "DEPLOYED") + stack["Configured"] = p.CreateUpdateCallback(varStack, "CONFIGURED") + stack["Running"] = p.CreateUpdateCallback(varStack, "RUNNING") + stack["Done"] = p.CreateUpdateCallback(varStack, "DONE") + stack["Error"] = p.CreateUpdateCallback(varStack, "ERROR") + return +} + +func (p *Plugin) Destroy() error { + p.kafkaProducer.Close() + return nil +} diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go new file mode 100644 index 000000000..1a4dcc9b3 --- /dev/null +++ b/core/integration/kafka/protos/kafka.pb.go @@ -0,0 +1,340 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.19.4 +// source: protos/kafka.proto + +package kafka + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type NewStateNotification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvInfo *EnvInfo `protobuf:"bytes,1,opt,name=envInfo,proto3" json:"envInfo,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch +} + +func (x *NewStateNotification) Reset() { + *x = NewStateNotification{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_kafka_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *NewStateNotification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*NewStateNotification) ProtoMessage() {} + +func (x *NewStateNotification) ProtoReflect() protoreflect.Message { + mi := &file_protos_kafka_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use NewStateNotification.ProtoReflect.Descriptor instead. +func (*NewStateNotification) Descriptor() ([]byte, []int) { + return file_protos_kafka_proto_rawDescGZIP(), []int{0} +} + +func (x *NewStateNotification) GetEnvInfo() *EnvInfo { + if x != nil { + return x.EnvInfo + } + return nil +} + +func (x *NewStateNotification) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +type ActiveRunsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ActiveRuns []*EnvInfo `protobuf:"bytes,1,rep,name=activeRuns,proto3" json:"activeRuns,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch +} + +func (x *ActiveRunsList) Reset() { + *x = ActiveRunsList{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_kafka_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ActiveRunsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ActiveRunsList) ProtoMessage() {} + +func (x *ActiveRunsList) ProtoReflect() protoreflect.Message { + mi := &file_protos_kafka_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ActiveRunsList.ProtoReflect.Descriptor instead. +func (*ActiveRunsList) Descriptor() ([]byte, []int) { + return file_protos_kafka_proto_rawDescGZIP(), []int{1} +} + +func (x *ActiveRunsList) GetActiveRuns() []*EnvInfo { + if x != nil { + return x.ActiveRuns + } + return nil +} + +func (x *ActiveRunsList) GetTimestamp() uint64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +type EnvInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + RunNumber *uint32 `protobuf:"varint,2,opt,name=runNumber,proto3,oneof" json:"runNumber,omitempty"` + RunType *string `protobuf:"bytes,3,opt,name=runType,proto3,oneof" json:"runType,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + Detectors []string `protobuf:"bytes,5,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *EnvInfo) Reset() { + *x = EnvInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_kafka_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvInfo) ProtoMessage() {} + +func (x *EnvInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_kafka_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. +func (*EnvInfo) Descriptor() ([]byte, []int) { + return file_protos_kafka_proto_rawDescGZIP(), []int{2} +} + +func (x *EnvInfo) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *EnvInfo) GetRunNumber() uint32 { + if x != nil && x.RunNumber != nil { + return *x.RunNumber + } + return 0 +} + +func (x *EnvInfo) GetRunType() string { + if x != nil && x.RunType != nil { + return *x.RunType + } + return "" +} + +func (x *EnvInfo) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *EnvInfo) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + +var File_protos_kafka_proto protoreflect.FileDescriptor + +var file_protos_kafka_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x22, 0x5e, 0x0a, 0x14, 0x4e, + 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x0e, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, + 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xbf, 0x01, 0x0a, 0x07, + 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0e, 0x5a, + 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_kafka_proto_rawDescOnce sync.Once + file_protos_kafka_proto_rawDescData = file_protos_kafka_proto_rawDesc +) + +func file_protos_kafka_proto_rawDescGZIP() []byte { + file_protos_kafka_proto_rawDescOnce.Do(func() { + file_protos_kafka_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_kafka_proto_rawDescData) + }) + return file_protos_kafka_proto_rawDescData +} + +var file_protos_kafka_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_protos_kafka_proto_goTypes = []interface{}{ + (*NewStateNotification)(nil), // 0: kafka.NewStateNotification + (*ActiveRunsList)(nil), // 1: kafka.ActiveRunsList + (*EnvInfo)(nil), // 2: kafka.EnvInfo +} +var file_protos_kafka_proto_depIdxs = []int32{ + 2, // 0: kafka.NewStateNotification.envInfo:type_name -> kafka.EnvInfo + 2, // 1: kafka.ActiveRunsList.activeRuns:type_name -> kafka.EnvInfo + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_protos_kafka_proto_init() } +func file_protos_kafka_proto_init() { + if File_protos_kafka_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_kafka_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewStateNotification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_kafka_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveRunsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_kafka_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_kafka_proto_msgTypes[2].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_kafka_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_kafka_proto_goTypes, + DependencyIndexes: file_protos_kafka_proto_depIdxs, + MessageInfos: file_protos_kafka_proto_msgTypes, + }.Build() + File_protos_kafka_proto = out.File + file_protos_kafka_proto_rawDesc = nil + file_protos_kafka_proto_goTypes = nil + file_protos_kafka_proto_depIdxs = nil +} diff --git a/core/integration/kafka/protos/kafka.proto b/core/integration/kafka/protos/kafka.proto new file mode 100644 index 000000000..db91cdc21 --- /dev/null +++ b/core/integration/kafka/protos/kafka.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; +package kafka; +option go_package = "protos;kafka"; + +message NewStateNotification { + EnvInfo envInfo = 1; + uint64 timestamp = 2; // ms since epoch +} + +message ActiveRunsList { + repeated EnvInfo activeRuns = 1; + uint64 timestamp = 2; // ms since epoch +} + +message EnvInfo { + string environmentId = 1; + optional uint32 runNumber = 2; + optional string runType = 3; + string state = 4; + repeated string detectors = 5; +} \ No newline at end of file diff --git a/go.mod b/go.mod index 94f4f9516..cc18b44c7 100644 --- a/go.mod +++ b/go.mod @@ -37,6 +37,7 @@ require ( github.com/briandowns/spinner v1.12.0 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect + github.com/confluentinc/confluent-kafka-go v1.8.2 github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.25+incompatible // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect diff --git a/go.sum b/go.sum index 96c85bdd8..f99d93fb3 100644 --- a/go.sum +++ b/go.sum @@ -241,6 +241,8 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 h1:r3DTlrs4TDsAOv3sTv8XlcUUj5J/t2l4/rCdwPuc13s= github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/confluentinc/confluent-kafka-go v1.8.2 h1:PBdbvYpyOdFLehj8j+9ba7FL4c4Moxn79gy9cYKxG5E= +github.com/confluentinc/confluent-kafka-go v1.8.2/go.mod h1:u2zNLny2xq+5rWeTQjFHbDzzNuba4P1vo31r9r4uAdg= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= From b56e4fce2237de8c4af0bfa99c42226eaa3da3bb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Mar 2022 16:53:46 +0200 Subject: [PATCH 1179/2352] [core] Check if kafka message status can be read --- core/integration/kafka/plugin.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 1b0ebfdca..7afaad0f4 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -202,9 +202,11 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { } e := <-deliveryChannel - m := e.(*kafka.Message) + m, ok := e.(*kafka.Message) - if m.TopicPartition.Error != nil { + if !ok { + log.WithField("partition", envId).Error("Could not read Kafka message delivery status") + } else if m.TopicPartition.Error != nil { log.WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) } else { log.WithField("partition", envId).Debugf("Kafka message delivered message to topic %s [%d] at offset %v\n", From de82aad82ada8890404ec537244b839d8e94bcda Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Mar 2022 16:55:31 +0200 Subject: [PATCH 1180/2352] [core] Store environment state in varStack and make kafka plugin get it from there --- core/integration/kafka/plugin.go | 12 ++++++++++-- core/workflow/callable/call.go | 13 +++++++------ core/workflow/callrole.go | 4 ++++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 7afaad0f4..d82e98954 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -123,13 +123,20 @@ func parseDetectors(detectorsParam string) (detectors []string, err error) { return detectorsSlice, nil } -func (p *Plugin) NewEnvStateObject(varStack map[string]string, state string) *kafkapb.EnvInfo { +func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo { envId, ok := varStack["environment_id"] if !ok { log.Error("cannot acquire environment ID") return nil } + state, ok := varStack["__call_current_fsm_state"] + if !ok { + log.WithField("partition", envId). + Error("cannot acquire state from varStack") + return nil + } + var runNumberOpt *uint32 = nil var runTypeOpt *string = nil if state == "RUNNING" { @@ -153,6 +160,7 @@ func (p *Plugin) NewEnvStateObject(varStack map[string]string, state string) *ka if !ok { log.WithField("partition", envId). Error("cannot acquire general detector list from varStack") + return nil } detectorsSlice, err := parseDetectors(detectorsStr) if err != nil { @@ -218,7 +226,7 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) return func() (out string) { // Retrieve and update the env info timestamp := uint64(time.Now().UnixNano() / 1000000) - envInfo := p.NewEnvStateObject(varStack, state) + envInfo := p.NewEnvStateObject(varStack) p.UpdateRunningEnvList(envInfo) // Prepare and send new state notification diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 6fb331ddd..41ff708ff 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -62,10 +62,10 @@ type Hook interface { } type Call struct { - Func string - Return string - VarStack map[string]string - Traits task.Traits + Func string + Return string + VarStack map[string]string + Traits task.Traits parentRole ParentRole await chan error @@ -75,7 +75,7 @@ func ParseTriggerExpression(triggerExpr string) (triggerName string, triggerWeig var ( triggerWeightS string triggerWeightI int - err error + err error ) // Split the trigger expression of this task by + or - @@ -182,7 +182,6 @@ func (s Calls) AwaitAll() map[*Call]error { return errors } - func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { return &Call{ Func: funcCall, @@ -206,6 +205,7 @@ func (c *Call) Call() error { template.WrapPointer(&returnVar), } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() + c.VarStack["__call_current_fsm_state"] = c.parentRole.GetState().String() c.VarStack["__call_func"] = c.Func c.VarStack["__call_timeout"] = c.Traits.Timeout c.VarStack["__call_trigger"] = c.Traits.Trigger @@ -271,6 +271,7 @@ type ParentRole interface { SendEvent(event.Event) SetRuntimeVar(key string, value string) GetCurrentRunNumber() uint32 + GetState() task.State } func AcquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 0d94d5289..8715549d8 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -301,3 +301,7 @@ func (t *callRole) setParent(role Updatable) { t.Vars.Wrap(role.GetVars()) t.UserVars.Wrap(role.GetUserVars()) } + +func (t *callRole) getState() task.State { + return t.state.get() +} From 77f2acef21ec0b7fbaf46e7f9149f4aec0ab0b02 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 4 Apr 2022 16:13:28 +0200 Subject: [PATCH 1181/2352] [core] Use UnixMilli(), since Go 1.17 supports it --- core/integration/kafka/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index d82e98954..2deefad48 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -225,7 +225,7 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) func() string { return func() (out string) { // Retrieve and update the env info - timestamp := uint64(time.Now().UnixNano() / 1000000) + timestamp := uint64(time.Now().UnixMilli()) envInfo := p.NewEnvStateObject(varStack) p.UpdateRunningEnvList(envInfo) From 3b8473342a8d89553a6042e0405494cc86768ff7 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 4 Apr 2022 16:25:26 +0200 Subject: [PATCH 1182/2352] [core] Initialize loggers in CCDB and Kafka plugins --- core/integration/ccdb/plugin.go | 6 ++++-- core/integration/kafka/plugin.go | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 0c90b14c7..320f8d7d5 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -34,15 +34,17 @@ import ( "strconv" "strings" "time" - + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/workflow/callable" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/spf13/viper" ) +var log = logger.New(logrus.StandardLogger(), "ccdbplugin") + type GeneralRunParameters struct { runNumber uint32 runType runtype.RunType diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 2deefad48..47a523aee 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -29,19 +29,22 @@ package kafka import ( "encoding/json" "fmt" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" kafkapb "github.com/AliceO2Group/Control/core/integration/kafka/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/confluentinc/confluent-kafka-go/kafka" "github.com/golang/protobuf/proto" - log "github.com/sirupsen/logrus" + "github.com/sirupsen/logrus" "github.com/spf13/viper" "net/url" "strconv" "time" ) +var log = logger.New(logrus.StandardLogger(), "kafkaplugin") + type Plugin struct { kafkaBroker string kafkaProducer *kafka.Producer From a48c5d901451f0d9c5796af975df9a204eb99eaf Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 5 Apr 2022 15:12:25 +0200 Subject: [PATCH 1183/2352] [core] A different (working) approach to obtaining current state --- core/integration/kafka/plugin.go | 32 +++++++++++++++++++++----------- core/workflow/callable/call.go | 2 -- core/workflow/callrole.go | 4 ---- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 47a523aee..0b92ae862 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/spf13/viper" "net/url" "strconv" + "strings" "time" ) @@ -133,13 +134,22 @@ func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo return nil } - state, ok := varStack["__call_current_fsm_state"] + trigger, ok := varStack["__call_trigger"] if !ok { log.WithField("partition", envId). - Error("cannot acquire state from varStack") + Error("cannot acquire trigger from varStack") return nil } + var state string = "UNKNOWN" + if strings.Contains(trigger, "enter_") { + state = strings.TrimPrefix(trigger, "enter_") + } else { + log.WithField("partition", envId).Error("could not obtain state from trigger: ", trigger) + return nil + } + //stateLowerCase := strings.ToLower(state) + var runNumberOpt *uint32 = nil var runTypeOpt *string = nil if state == "RUNNING" { @@ -225,7 +235,7 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { } } -func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) func() string { +func (p *Plugin) CreateUpdateCallback(varStack map[string]string) func() string { return func() (out string) { // Retrieve and update the env info timestamp := uint64(time.Now().UnixMilli()) @@ -234,7 +244,7 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) // Prepare and send new state notification log.WithField("partition", envInfo.EnvironmentId). - Debug("Advertising the environment state (" + state + ") and active runs list to Kafka") + Debug("Advertising the environment state (" + envInfo.State + ") and active runs list to Kafka") newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, Timestamp: timestamp, @@ -244,7 +254,7 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string, state string) log.WithField("partition", envInfo.EnvironmentId). Error("Could not marshall a new state notification: ", err) } - p.ProduceMessage(nsnData, p.FSMTransitionTopic(state), envInfo.EnvironmentId) + p.ProduceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId) // Prepare and send active run list activeRunsList := &kafkapb.ActiveRunsList{ @@ -269,12 +279,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) - stack["Standby"] = p.CreateUpdateCallback(varStack, "STANDBY") - stack["Deployed"] = p.CreateUpdateCallback(varStack, "DEPLOYED") - stack["Configured"] = p.CreateUpdateCallback(varStack, "CONFIGURED") - stack["Running"] = p.CreateUpdateCallback(varStack, "RUNNING") - stack["Done"] = p.CreateUpdateCallback(varStack, "DONE") - stack["Error"] = p.CreateUpdateCallback(varStack, "ERROR") + stack["Standby"] = p.CreateUpdateCallback(varStack) + stack["Deployed"] = p.CreateUpdateCallback(varStack) + stack["Configured"] = p.CreateUpdateCallback(varStack) + stack["Running"] = p.CreateUpdateCallback(varStack) + stack["Done"] = p.CreateUpdateCallback(varStack) + stack["Error"] = p.CreateUpdateCallback(varStack) return } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 41ff708ff..3f7c03cfb 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -205,7 +205,6 @@ func (c *Call) Call() error { template.WrapPointer(&returnVar), } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() - c.VarStack["__call_current_fsm_state"] = c.parentRole.GetState().String() c.VarStack["__call_func"] = c.Func c.VarStack["__call_timeout"] = c.Traits.Timeout c.VarStack["__call_trigger"] = c.Traits.Trigger @@ -271,7 +270,6 @@ type ParentRole interface { SendEvent(event.Event) SetRuntimeVar(key string, value string) GetCurrentRunNumber() uint32 - GetState() task.State } func AcquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 8715549d8..0d94d5289 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -301,7 +301,3 @@ func (t *callRole) setParent(role Updatable) { t.Vars.Wrap(role.GetVars()) t.UserVars.Wrap(role.GetUserVars()) } - -func (t *callRole) getState() task.State { - return t.state.get() -} From 176c0c9a9797f71d2b813a1e2755f583876aa82f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 5 Apr 2022 15:43:00 +0200 Subject: [PATCH 1184/2352] [core] Update kafka topics to the agreed convention --- core/integration/kafka/plugin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 0b92ae862..4263febe4 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -92,11 +92,11 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { } func (p *Plugin) FSMTransitionTopic(state string) string { - return "FSM_" + state + return "aliecs.env_state." + state } func (p *Plugin) ActiveRunsListTopic() string { - return "ACTIVE_RUNS" + return "aliecs.env_list.RUNNING" } func (p *Plugin) Init(instanceId string) error { From b0379ddb86f711e14bf8d8ab803ffa5c0763840a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 7 Apr 2022 11:46:25 +0200 Subject: [PATCH 1185/2352] [core] rename kafkaBroker to kafkaEndpoint for consistency, fix log --- cmd/o2-aliecs-core/main.go | 2 +- core/config.go | 2 +- core/integration/kafka/plugin.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index 4fa1ed7d7..6b35091bb 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -57,7 +57,7 @@ func init() { ddsched.NewPlugin) integration.RegisterPlugin( "kafka", - "kafkaBroker", + "kafkaEndpoint", kafka.NewPlugin) integration.RegisterPlugin( "odc", diff --git a/core/config.go b/core/config.go index d2936f2d3..29b749cd7 100644 --- a/core/config.go +++ b/core/config.go @@ -113,7 +113,7 @@ func setDefaults() error { viper.SetDefault("fmqPlugin", "OCClite") viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") - viper.SetDefault("kafkaBroker", "localhost:9092") + viper.SetDefault("kafkaEndpoint", "localhost:9092") return nil } diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 4263febe4..2859655e4 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -230,7 +230,7 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { } else if m.TopicPartition.Error != nil { log.WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) } else { - log.WithField("partition", envId).Debugf("Kafka message delivered message to topic %s [%d] at offset %v\n", + log.WithField("partition", envId).Debugf("Kafka message delivered to topic %s [%d] at offset %v\n", *m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset) } } From ac685b80b916ddb7cb99e04fe20802ad3dead8d2 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 7 Apr 2022 14:58:42 +0200 Subject: [PATCH 1186/2352] Disable the mac build to be reenabled once we understand how to fix the problem with: ld: library not found for -lcrt0.o No one seems to be using mac builds and we would like to unblock Kafka integration --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 634eb5424..fb3e49be3 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macOS-latest, ubuntu-18.04] + os: [ubuntu-18.04] go: [ '1.17' ] steps: - uses: actions/checkout@v2 From c381cc6fc627323eb70f5823807ee97ddc42ad89 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 7 Apr 2022 15:49:51 +0200 Subject: [PATCH 1187/2352] Document the kafka plugin --- README.md | 4 ++++ docs/kafka.md | 29 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 docs/kafka.md diff --git a/README.md b/README.md index 93facb2bf..c72abca5b 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,10 @@ What is your use case? :arrow_right: [Running instructions](https://alice-flp.docs.cern.ch/aliecs/running/) +* I want to communicate with AliECS via one of the plugins + + * [Receive updates on running environments via Kafka](docs/kafka.md) + ## Using AliECS There are two ways of interacting with AliECS: diff --git a/docs/kafka.md b/docs/kafka.md new file mode 100644 index 000000000..e25a77847 --- /dev/null +++ b/docs/kafka.md @@ -0,0 +1,29 @@ +# Kafka plugin + +The Kafka plugin in AliECS publishes updates messages about new states of environments and lists of environments in the RUNNING state. +The messages are encoded with protobuf. + +## Making sure that AliECS sends messages + +To enable the plugin, one should make sure that the following points are fullfiled. +* The consul instance includes coordinates to your kafka broker and enables the plugin. + Navigate to `o2/components/aliecs/ANY/any/settings` and make sure the following key value pairs are there: + ``` + kafkaEndpoint: "my-kafka-broker:9092" + integrationPlugins: + - kafka + ``` + Please restart the AliECS core if you modify this file. +* Plugin is enabled for the new environments. Make sure that there is a `true` value set in the consul instance at the path `o2/runtime/aliecs/vars/kafka_enabled`. + Alternatively, one can put `kafka_enabled : true` in the Advanced configuration panel in the AliECS GUI. + +## Currently available topics + +As for today, AliECS publishes on two types of topics: + +* `aliecs.env_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `DONE`, `ERROR`. For each topic, AliECS publishes a `NewStateNotification` message when any environment reaches the corresponding state. +* `aliecs.env_list.` where `state` is only `RUNNING`. Each time there is an environment state change, AliECS publishes an `ActiveRunsList` message which contains a list of all environments which are currently in `RUNNING` state. + +## Decoding the messages + +Messages are encoded with protobuf. Please use [this](../core/integration/kafka/protos/kafka.proto) proto file to generate code which deserializes the messages. From d12fa38628f9c1747034b0169dd5afb830a95423 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 19 Apr 2022 14:12:58 +0200 Subject: [PATCH 1188/2352] [core] Publish an empty env list to kafka at init --- core/integration/kafka/plugin.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 2859655e4..8e2a7dce4 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -107,6 +107,18 @@ func (p *Plugin) Init(instanceId string) error { } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) log.Info("Successfully created a kafka producer with broker '" + p.kafkaBroker + "'") + + // Prepare and send active run list (expected to be empty during init) + timestamp := uint64(time.Now().UnixMilli()) + activeRunsList := &kafkapb.ActiveRunsList{ + ActiveRuns: p.GetRunningEnvList(), + Timestamp: timestamp, + } + arlData, err := proto.Marshal(activeRunsList) + if err != nil { + log.Error("Could not marshall an active runs list: ", err) + } + p.ProduceMessage(arlData, p.ActiveRunsListTopic(), "") return nil } From bba4b355198584f8b8114020d4427530ce19e03b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 09:58:39 +0200 Subject: [PATCH 1189/2352] [core] Publish Error state and react to DESTROY in kafka plugin --- core/environment/environment.go | 6 +++- core/environment/transition_goerror.go | 48 ++++++++++++++++++++++++++ core/integration/kafka/plugin.go | 7 +++- core/server.go | 6 +++- 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 core/environment/transition_goerror.go diff --git a/core/environment/environment.go b/core/environment/environment.go index 07000ecbd..57312a9a6 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -652,7 +652,11 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { select { case wfState = <-notify: if wfState == task.ERROR { - env.setState(wfState.String()) + err := env.TryTransition(NewGoErrorTransition(taskman)) + if err != nil { + log.WithField("partition", env.id).Warn("we could not transition gently to ERROR, thus forcing it.") + env.setState(wfState.String()) + } toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { t.SetSafeToStop(true) return t.IsSafeToStop() diff --git a/core/environment/transition_goerror.go b/core/environment/transition_goerror.go new file mode 100644 index 000000000..f8f5467df --- /dev/null +++ b/core/environment/transition_goerror.go @@ -0,0 +1,48 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package environment + +import ( + "github.com/AliceO2Group/Control/core/task" +) + +func NewGoErrorTransition(taskman *task.Manager) Transition { + return &GoErrorTransition{ + baseTransition: baseTransition{ + name: "GO_ERROR", + taskman: taskman, + }, + } +} + +type GoErrorTransition struct { + baseTransition +} + +func (t GoErrorTransition) do(env *Environment) (err error) { + // We do not do anything here, because the error handling was already implemented elsewhere + // and we do not expose this transition to external calls (e.g. from the GUI). + return +} diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 8e2a7dce4..57a840fe6 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -156,6 +156,11 @@ func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo var state string = "UNKNOWN" if strings.Contains(trigger, "enter_") { state = strings.TrimPrefix(trigger, "enter_") + } else if strings.Contains(trigger, "DESTROY") { + // We cannot hook to enter_DONE, since the hooks are released before it happens. + // On the other hand, we cannot assume that a DESTROY trigger leads successfully to DONE. + // Thus, we put UNKNOWN state + state = "UNKNOWN" } else { log.WithField("partition", envId).Error("could not obtain state from trigger: ", trigger) return nil @@ -295,8 +300,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["Deployed"] = p.CreateUpdateCallback(varStack) stack["Configured"] = p.CreateUpdateCallback(varStack) stack["Running"] = p.CreateUpdateCallback(varStack) - stack["Done"] = p.CreateUpdateCallback(varStack) stack["Error"] = p.CreateUpdateCallback(varStack) + stack["Destroy"] = p.CreateUpdateCallback(varStack) return } diff --git a/core/server.go b/core/server.go index e64be9e90..7ade6ff87 100644 --- a/core/server.go +++ b/core/server.go @@ -391,7 +391,11 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir td := eot.Sub(sot) if err != nil { - env.Sm.SetState("ERROR") + err := env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) + if err != nil { + log.WithField("partition", env.Id()).Warn("we could not transition gently to ERROR, thus forcing it.") + env.Sm.SetState("ERROR") + } } reply := &pb.ControlEnvironmentReply{ From 33404d631875830005273a64ca59618c409275a6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 13:18:49 +0200 Subject: [PATCH 1190/2352] [core] Use one common callback in the kafka plugin --- core/integration/kafka/plugin.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 57a840fe6..c1b318ffc 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -296,12 +296,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) - stack["Standby"] = p.CreateUpdateCallback(varStack) - stack["Deployed"] = p.CreateUpdateCallback(varStack) - stack["Configured"] = p.CreateUpdateCallback(varStack) - stack["Running"] = p.CreateUpdateCallback(varStack) - stack["Error"] = p.CreateUpdateCallback(varStack) - stack["Destroy"] = p.CreateUpdateCallback(varStack) + stack["PublishUpdate"] = p.CreateUpdateCallback(varStack) return } From b70b6a2619e1d858729aa03d4cf82a2a95f0001b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 13:35:56 +0200 Subject: [PATCH 1191/2352] [core] several improvements to logging in kafka and ccdb plugins includes: - adding "call" field, - kafkaplugin->kafkaclient, ccdbplugin -> ccdbclient for consistency - better wrapping of error messages --- core/integration/ccdb/plugin.go | 24 +++++++----- core/integration/kafka/plugin.go | 64 +++++++++++++++++++------------- core/server.go | 2 +- 3 files changed, 53 insertions(+), 37 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 320f8d7d5..e5cc8d66f 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,11 +29,6 @@ import ( "encoding/json" "errors" "fmt" - "net/url" - "os/exec" - "strconv" - "strings" - "time" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -41,9 +36,14 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "net/url" + "os/exec" + "strconv" + "strings" + "time" ) -var log = logger.New(logrus.StandardLogger(), "ccdbplugin") +var log = logger.New(logrus.StandardLogger(), "ccdbclient") type GeneralRunParameters struct { runNumber uint32 @@ -260,18 +260,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId).Debug("performing CCDB interface Run Start") + log.WithField("call", "RunStart"). + WithField("partition", envId).Debug("performing CCDB interface Run Start") err := p.uploadCurrentGRP(varStack, envId) if err != nil { - log.WithField("partition", envId).Error(err.Error()) + log.WithField("call", "RunStop"). + WithField("partition", envId).Error(err.Error()) } return } stack["RunStop"] = func() (out string) { - log.WithField("partition", envId).Debug("performing CCDB interface Run Stop") + log.WithField("call", "RunStop"). + WithField("partition", envId).Debug("performing CCDB interface Run Stop") err := p.uploadCurrentGRP(varStack, envId) if err != nil { - log.WithField("partition", envId).Error(err.Error()) + log.WithField("call", "RunStop"). + WithField("partition", envId).Error(err.Error()) } return } diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index c1b318ffc..c7a5a3d22 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -44,7 +44,7 @@ import ( "time" ) -var log = logger.New(logrus.StandardLogger(), "kafkaplugin") +var log = logger.New(logrus.StandardLogger(), "kafkaclient") type Plugin struct { kafkaBroker string @@ -100,13 +100,14 @@ func (p *Plugin) ActiveRunsListTopic() string { } func (p *Plugin) Init(instanceId string) error { + const call = "Init" var err error p.kafkaProducer, err = kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": p.kafkaBroker}) if err != nil { - return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %s", p.kafkaBroker, err.Error()) + return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %w", p.kafkaBroker, err) } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) - log.Info("Successfully created a kafka producer with broker '" + p.kafkaBroker + "'") + log.WithField("call", call).Info("Successfully created a kafka producer with broker '" + p.kafkaBroker + "'") // Prepare and send active run list (expected to be empty during init) timestamp := uint64(time.Now().UnixMilli()) @@ -116,9 +117,9 @@ func (p *Plugin) Init(instanceId string) error { } arlData, err := proto.Marshal(activeRunsList) if err != nil { - log.Error("Could not marshall an active runs list: ", err) + log.WithField("call", call).Error("Could not marshall an active runs list: ", err) } - p.ProduceMessage(arlData, p.ActiveRunsListTopic(), "") + p.ProduceMessage(arlData, p.ActiveRunsListTopic(), "", "Init") return nil } @@ -139,16 +140,16 @@ func parseDetectors(detectorsParam string) (detectors []string, err error) { return detectorsSlice, nil } -func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo { +func (p *Plugin) NewEnvStateObject(varStack map[string]string, call string) *kafkapb.EnvInfo { envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + log.WithField("call", call).Error("cannot acquire environment ID") return nil } trigger, ok := varStack["__call_trigger"] if !ok { - log.WithField("partition", envId). + log.WithField("call", call).WithField("partition", envId). Error("cannot acquire trigger from varStack") return nil } @@ -162,7 +163,8 @@ func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo // Thus, we put UNKNOWN state state = "UNKNOWN" } else { - log.WithField("partition", envId).Error("could not obtain state from trigger: ", trigger) + log.WithField("call", call). + WithField("partition", envId).Error("could not obtain state from trigger: ", trigger) return nil } //stateLowerCase := strings.ToLower(state) @@ -188,13 +190,15 @@ func (p *Plugin) NewEnvStateObject(varStack map[string]string) *kafkapb.EnvInfo detectorsStr, ok := varStack["detectors"] if !ok { - log.WithField("partition", envId). + log.WithField("call", call). + WithField("partition", envId). Error("cannot acquire general detector list from varStack") return nil } detectorsSlice, err := parseDetectors(detectorsStr) if err != nil { - log.WithField("partition", envId). + log.WithField("call", call). + WithField("partition", envId). Error("cannot parse general detector list") return nil } @@ -224,8 +228,9 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { return array } -func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { - log.WithField("partition", envId). +func (p *Plugin) ProduceMessage(message []byte, topic string, envId string, call string) { + log.WithField("call", call). + WithField("partition", envId). Debug("Producing a new kafka message on topic ", topic) deliveryChannel := make(chan kafka.Event) @@ -235,32 +240,37 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string) { }, deliveryChannel) if err != nil { - log.WithField("partition", envId). - Error("Kafka message delivery failed: ", err.Error()) + log.WithField("call", call). + WithField("partition", envId). + Error("Kafka message delivery failed: %w", err) } e := <-deliveryChannel m, ok := e.(*kafka.Message) if !ok { - log.WithField("partition", envId).Error("Could not read Kafka message delivery status") + log.WithField("call", call). + WithField("partition", envId).Error("Could not read Kafka message delivery status") } else if m.TopicPartition.Error != nil { - log.WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) + log.WithField("call", call). + WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) } else { - log.WithField("partition", envId).Debugf("Kafka message delivered to topic %s [%d] at offset %v\n", + log.WithField("call", call). + WithField("partition", envId).Debugf("Kafka message delivered to topic %s [%d] at offset %v\n", *m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset) } } -func (p *Plugin) CreateUpdateCallback(varStack map[string]string) func() string { +func (p *Plugin) CreateUpdateCallback(varStack map[string]string, call string) func() string { return func() (out string) { // Retrieve and update the env info timestamp := uint64(time.Now().UnixMilli()) - envInfo := p.NewEnvStateObject(varStack) + envInfo := p.NewEnvStateObject(varStack, call) p.UpdateRunningEnvList(envInfo) // Prepare and send new state notification - log.WithField("partition", envInfo.EnvironmentId). + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). Debug("Advertising the environment state (" + envInfo.State + ") and active runs list to Kafka") newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, @@ -268,10 +278,11 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string) func() string } nsnData, err := proto.Marshal(newStateNotification) if err != nil { - log.WithField("partition", envInfo.EnvironmentId). + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). Error("Could not marshall a new state notification: ", err) } - p.ProduceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId) + p.ProduceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId, call) // Prepare and send active run list activeRunsList := &kafkapb.ActiveRunsList{ @@ -280,10 +291,11 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string) func() string } arlData, err := proto.Marshal(activeRunsList) if err != nil { - log.WithField("partition", envInfo.EnvironmentId). + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). Error("Could not marshall an active runs list: ", err) } - p.ProduceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId) + p.ProduceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId, call) return } } @@ -296,7 +308,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) - stack["PublishUpdate"] = p.CreateUpdateCallback(varStack) + stack["PublishUpdate"] = p.CreateUpdateCallback(varStack, "PublishUpdate") return } diff --git a/core/server.go b/core/server.go index 7ade6ff87..c1cbbdb57 100644 --- a/core/server.go +++ b/core/server.go @@ -393,7 +393,7 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir if err != nil { err := env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) if err != nil { - log.WithField("partition", env.Id()).Warn("we could not transition gently to ERROR, thus forcing it.") + log.WithField("partition", env.Id()).Warnf("could not complete requested GO_ERROR transition, forcing move to ERROR: %s", err.Error()) env.Sm.SetState("ERROR") } } From 1d63b49b7cf2adacbfde15d4b30ec0335dcd019a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 13:40:04 +0200 Subject: [PATCH 1192/2352] [core] make some member of kafka plugin private --- core/integration/kafka/plugin.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index c7a5a3d22..4aa164ced 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -119,7 +119,7 @@ func (p *Plugin) Init(instanceId string) error { if err != nil { log.WithField("call", call).Error("Could not marshall an active runs list: ", err) } - p.ProduceMessage(arlData, p.ActiveRunsListTopic(), "", "Init") + p.produceMessage(arlData, p.ActiveRunsListTopic(), "", "Init") return nil } @@ -140,7 +140,7 @@ func parseDetectors(detectorsParam string) (detectors []string, err error) { return detectorsSlice, nil } -func (p *Plugin) NewEnvStateObject(varStack map[string]string, call string) *kafkapb.EnvInfo { +func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kafkapb.EnvInfo { envId, ok := varStack["environment_id"] if !ok { log.WithField("call", call).Error("cannot acquire environment ID") @@ -228,7 +228,7 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { return array } -func (p *Plugin) ProduceMessage(message []byte, topic string, envId string, call string) { +func (p *Plugin) produceMessage(message []byte, topic string, envId string, call string) { log.WithField("call", call). WithField("partition", envId). Debug("Producing a new kafka message on topic ", topic) @@ -261,11 +261,11 @@ func (p *Plugin) ProduceMessage(message []byte, topic string, envId string, call } } -func (p *Plugin) CreateUpdateCallback(varStack map[string]string, call string) func() string { +func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) func() string { return func() (out string) { // Retrieve and update the env info timestamp := uint64(time.Now().UnixMilli()) - envInfo := p.NewEnvStateObject(varStack, call) + envInfo := p.newEnvStateObject(varStack, call) p.UpdateRunningEnvList(envInfo) // Prepare and send new state notification @@ -282,7 +282,7 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string, call string) f WithField("partition", envInfo.EnvironmentId). Error("Could not marshall a new state notification: ", err) } - p.ProduceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId, call) + p.produceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId, call) // Prepare and send active run list activeRunsList := &kafkapb.ActiveRunsList{ @@ -295,7 +295,7 @@ func (p *Plugin) CreateUpdateCallback(varStack map[string]string, call string) f WithField("partition", envInfo.EnvironmentId). Error("Could not marshall an active runs list: ", err) } - p.ProduceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId, call) + p.produceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId, call) return } } @@ -308,7 +308,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) - stack["PublishUpdate"] = p.CreateUpdateCallback(varStack, "PublishUpdate") + stack["PublishUpdate"] = p.createUpdateCallback(varStack, "PublishUpdate") return } From 8c454c9cee67bdb6f9d875bdf4be34f79a33a719 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 13:51:09 +0200 Subject: [PATCH 1193/2352] [core] include STANDBY in the states which can initiate GO_ERROR --- core/environment/environment.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 57312a9a6..b88f1a05c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -109,28 +109,29 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } // Make the KVs accessible to the workflow via ParentAdapter - env.wfAdapter = workflow.NewParentAdapter( - func() uid.ID { return env.Id() }, - func() uint32 { return env.GetCurrentRunNumber() }, + env.wfAdapter = workflow.NewParentAdapter( + func() uid.ID { return env.Id() }, + func() uint32 { return env.GetCurrentRunNumber() }, func() gera.StringMap { return env.GlobalDefaults }, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, - func(ev event.Event) { - if env.eventStream != nil{ + func(ev event.Event) { + if env.eventStream != nil { env.eventStream.Send(ev) - }}, - ) + } + }, + ) env.Sm = fsm.NewFSM( "STANDBY", fsm.Events{ - {Name: "DEPLOY", Src: []string{"STANDBY"}, Dst: "DEPLOYED"}, - {Name: "CONFIGURE", Src: []string{"DEPLOYED"}, Dst: "CONFIGURED"}, - {Name: "RESET", Src: []string{"CONFIGURED"}, Dst: "DEPLOYED"}, - {Name: "START_ACTIVITY", Src: []string{"CONFIGURED"}, Dst: "RUNNING"}, - {Name: "STOP_ACTIVITY", Src: []string{"RUNNING"}, Dst: "CONFIGURED"}, - {Name: "EXIT", Src: []string{"CONFIGURED", "DEPLOYED", "STANDBY"}, Dst: "DONE"}, - {Name: "GO_ERROR", Src: []string{"CONFIGURED", "DEPLOYED", "RUNNING"}, Dst: "ERROR"}, - {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "DEPLOYED"}, + {Name: "DEPLOY", Src: []string{"STANDBY"}, Dst: "DEPLOYED"}, + {Name: "CONFIGURE", Src: []string{"DEPLOYED"}, Dst: "CONFIGURED"}, + {Name: "RESET", Src: []string{"CONFIGURED"}, Dst: "DEPLOYED"}, + {Name: "START_ACTIVITY", Src: []string{"CONFIGURED"}, Dst: "RUNNING"}, + {Name: "STOP_ACTIVITY", Src: []string{"RUNNING"}, Dst: "CONFIGURED"}, + {Name: "EXIT", Src: []string{"CONFIGURED", "DEPLOYED", "STANDBY"}, Dst: "DONE"}, + {Name: "GO_ERROR", Src: []string{"STANDBY", "CONFIGURED", "DEPLOYED", "RUNNING"}, Dst: "ERROR"}, + {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "DEPLOYED"}, }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { From 777b477b65a69353f9fdb799f33868f19d932d0c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 25 Apr 2022 14:39:49 +0200 Subject: [PATCH 1194/2352] Update the kafka plugin documentation wrt state list --- docs/kafka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/kafka.md b/docs/kafka.md index e25a77847..091029dc1 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -21,7 +21,7 @@ To enable the plugin, one should make sure that the following points are fullfil As for today, AliECS publishes on two types of topics: -* `aliecs.env_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `DONE`, `ERROR`. For each topic, AliECS publishes a `NewStateNotification` message when any environment reaches the corresponding state. +* `aliecs.env_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `ERROR`, `UNKNOWN`. For each topic, AliECS publishes a `NewStateNotification` message when any environment reaches the corresponding state. The `UNKNOWN` state is usually published when an environment gets a `DESTROY` request, but the plugin cannot know what will be the state after the transition. * `aliecs.env_list.` where `state` is only `RUNNING`. Each time there is an environment state change, AliECS publishes an `ActiveRunsList` message which contains a list of all environments which are currently in `RUNNING` state. ## Decoding the messages From 135863e204c8cd4a4f5c640669080058c519ec8c Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 7 Apr 2022 18:56:14 +0200 Subject: [PATCH 1195/2352] [core] Add dirty hack for FLP cleanup before DEPLOY --- cmd/o2-aliecs-shmcleaner | 29 +++++++++++++++++++++++++++ core/environment/transition_deploy.go | 26 ++++++++++++++++++++++++ 2 files changed, 55 insertions(+) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index c2bc74b54..2a17d7449 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -28,6 +28,35 @@ export O2_FACILITY=core/shmcleaner export O2_PARTITION=${O2_PARTITION:-} export O2_ROLE=${O2_ROLE:-} +# ------ Beginning extra cleanup ------ +n=0 +for p in `pgrep -u flp`; do + c="`ps -ho %c $p`" + [ "$c" = "o2-alf" ] && continue + echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + printf "%s\t%s\tKilling '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" + n=$((n+1)) + kill $p +done + +if (( n > 0 )); then + + sleep 5 + + for p in `pgrep -u flp`; do + c="`ps -ho %c $p`" + [ "$c" = "o2-alf" ] && continue + echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Fatal -o Facility=$O2_FACILITY + printf "%s\t%s\tKilling \"-9\" '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" + kill -9 $p + done +fi + +rm -f /dev/shm/*fmq* + +yes | roc-cleanup --light > /dev/null 3>&1 +# ------ End extra cleanup ------- + ANY_FILES_CLEANED=false for SHM_FILE in /dev/shm/*; do diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 4aab7250d..168ca2dda 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -27,7 +27,9 @@ package environment import ( "errors" "fmt" + "os/exec" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/event" @@ -62,6 +64,30 @@ func (t DeployTransition) do(env *Environment) (err error) { wf := env.Workflow() + flps := env.GetFLPs() + var wg sync.WaitGroup + wg.Add(len(flps)) + + // Execute the cleanup script on all FLPs before the DEPLOY transition commences + for _, flp := range flps { + go func(flp string) { + defer wg.Done() + + cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" + log.Traceln("[cleanup binary] Executing: " + cmdString) + cmd := exec.Command("/bin/bash", "-c", cmdString) + err = cmd.Run() + if err != nil { + log.Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) + err = nil // don't kill the env if we don't make it + } else { + log.Infof("[cleanup binary] execution successful on %s\n", flp) + } + }(flp) + } + + wg.Wait() + // Role tree operations go here, and afterwards we'll generally get a role tree which // has // - some TaskRoles already deployed with Tasks From aea489782997bab057cd4dfa2a46311d2c189938 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 8 Apr 2022 12:46:42 +0200 Subject: [PATCH 1196/2352] Remove prints --- cmd/o2-aliecs-shmcleaner | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index 2a17d7449..b6123c0d3 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -34,7 +34,6 @@ for p in `pgrep -u flp`; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY - printf "%s\t%s\tKilling '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" n=$((n+1)) kill $p done @@ -46,8 +45,7 @@ if (( n > 0 )); then for p in `pgrep -u flp`; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue - echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Fatal -o Facility=$O2_FACILITY - printf "%s\t%s\tKilling \"-9\" '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" + echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY kill -9 $p done fi From 67a87fe739299b4e308856ac20ddca080e0da51e Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 12 Apr 2022 09:30:52 +0200 Subject: [PATCH 1197/2352] [core] Properly set facility & partition for shmcleaner logs --- cmd/o2-aliecs-shmcleaner | 2 +- core/environment/transition_deploy.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index b6123c0d3..4ae43f42b 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -33,7 +33,7 @@ n=0 for p in `pgrep -u flp`; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue - echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION n=$((n+1)) kill $p done diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 168ca2dda..26b0223a1 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -73,7 +73,7 @@ func (t DeployTransition) do(env *Environment) (err error) { go func(flp string) { defer wg.Done() - cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" + cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" log.Traceln("[cleanup binary] Executing: " + cmdString) cmd := exec.Command("/bin/bash", "-c", cmdString) err = cmd.Run() From 5e34a664157cce7ef3770e9284c88af107983491 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 8 Apr 2022 14:48:03 +0200 Subject: [PATCH 1198/2352] [core] TRG: Improve run parsing --- core/integration/trg/plugin.go | 18 +++++++------- core/integration/trg/trgutil.go | 42 ++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 46dfc524b..804bf0751 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -132,14 +132,16 @@ func (p *Plugin) queryRunList() { runReply = &trgpb.RunReply{} } - structured, err := parseRunList(int(runReply.Rc), runReply.Msg) - if err != nil { - err = fmt.Errorf("error parsing response from TRG service at %s: %w", viper.GetString("trgServiceEndpoint"), err) - log.WithError(err). - WithField("level", infologger.IL_Devel). - WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("call", "RunList"). - Error("TRG error") + structured, errSlice := parseRunList(int(runReply.Rc), runReply.Msg) + for _, err := range errSlice { + if err != nil { + err = fmt.Errorf("error parsing response from TRG service at %s: %w", viper.GetString("trgServiceEndpoint"), err) + log.WithError(err). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("call", "RunList"). + Error("TRG error") + } } if structured == nil { structured = make(Runs, 0) diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index 0a4e5d850..96b056817 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -72,23 +72,24 @@ const ( //S 2223 R fv0 //G 2224 L its, tpc run2224 -func parseRunList(runCount int, payload string) (runs Runs, err error) { +func parseRunList(runCount int, payload string) (runs Runs, err []error) { cleanPayload := strings.TrimSpace(payload) if len(cleanPayload) == 0 { - err = fmt.Errorf("empty RunList response payload") + err = append(err, fmt.Errorf("empty RunList response payload")) return } lines := strings.Split(strings.TrimSpace(cleanPayload), "\n") if len(lines) != runCount { - err = fmt.Errorf("cannot parse run count mismatch in payload: %s", payload) + err = append(err, fmt.Errorf("cannot parse run count mismatch in payload: %s", payload)) return } - runs = make(Runs, runCount) - for i, line := range lines { - runs[i], err = parseRunLine(line) - err = fmt.Errorf("cannot parse line %d: %w", i, err) - return + run, parseErr := parseRunLine(line) + if parseErr != nil { + err = append(err, fmt.Errorf("cannot parse line %d: %s", i, parseErr.Error())) + continue + } + runs = append(runs, run) } return @@ -97,18 +98,25 @@ func parseRunList(runCount int, payload string) (runs Runs, err error) { func parseRunLine(line string) (run Run, err error) { // lst= lst+"S {:6} R {:3}\n".format(runn, self.sruns[runn]) // lst= lst+"G {:6} {:1} {} {}\n".format(runn, st, ", ".join(self.gruns[runn].getDets()), self.gruns[runn].pname) - coarseSplit := strings.Split(line, " ") // first we split by 5-spaces - - first3cols := strings.Fields(coarseSplit[0]) + cols := strings.Fields(line) + // col 0 -> TRG TYPE + // col 1 -> RUN NUMBER + // col 2 -> TRG STATUS + // col 3 -> comma-seperated list of DETECTORS + + if len(cols) < 4 { + err = fmt.Errorf("cannot parse run state from line with less than 4 columns: %s", line) + return + } - if first3cols[0] == "S" { + if cols[0] == "S" { run.Cardinality = CTP_STANDALONE run.State = CTP_RUNNING - } else if first3cols[0] == "G" { + } else if cols[0] == "G" { run.Cardinality = CTP_GLOBAL - if first3cols[2] == "R" { + if cols[2] == "R" { run.State = CTP_RUNNING - } else if first3cols[2] == "L" { + } else if cols[2] == "L" { run.State = CTP_LOADED } else { run.State = __State_NIL @@ -121,7 +129,7 @@ func parseRunLine(line string) (run Run, err error) { return } - rn64, err := strconv.ParseUint(first3cols[1], 10, 32) + rn64, err := strconv.ParseUint(cols[1], 10, 32) run.RunNumber = uint32(rn64) if err != nil { err = fmt.Errorf("cannot parse run number from line: %s", line) @@ -130,7 +138,7 @@ func parseRunLine(line string) (run Run, err error) { run.Detectors = make([]system.ID, 0) - detectorsSSlice := strings.Split(strings.ToUpper(coarseSplit[1]), ",") + detectorsSSlice := strings.Split(cols[3], ",") for _, item := range detectorsSSlice { var det system.ID det, err = system.IDString(strings.TrimSpace(item)) From 1315510a33a58667604e73bc6cba409c12cd3e41 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 13 Apr 2022 16:09:34 +0300 Subject: [PATCH 1199/2352] [core] TRG should ignore the daq trigger --- core/integration/trg/trgutil.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index 96b056817..e312dc52b 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -140,6 +140,12 @@ func parseRunLine(line string) (run Run, err error) { detectorsSSlice := strings.Split(cols[3], ",") for _, item := range detectorsSSlice { + // don't interfere with daq + // also daq not in known system ids -> results in error + if strings.TrimSpace(item) == "daq" { + continue + } + var det system.ID det, err = system.IDString(strings.TrimSpace(item)) if err != nil { From ba42bf2103169c8d05520d42b788d27bfb2acb4f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 14 Apr 2022 11:21:59 +0300 Subject: [PATCH 1200/2352] [core] Handle daq & standalone trg reconciliation gracefully --- core/integration/trg/plugin.go | 9 +++++++-- core/integration/trg/trgutil.go | 8 ++++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 804bf0751..19f35e8ee 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -248,13 +248,18 @@ func (p *Plugin) reconcile() { } if trgRun.State == CTP_RUNNING { // both STANDALONE and GLOBAL - if trgRun.Cardinality == CTP_STANDALONE { // if global run, we send no detector + + // Setting the detector here results in a failed RunStop call + // Returns with RC:12 "Unknown ltud [DETNAME]" + /*if trgRun.Cardinality == CTP_STANDALONE { // if global run, we send no detector if len(trgRun.Detectors) == 1 { in.Detector = trgRun.Detectors[0].String() } - } + }*/ + ctx, _ := context.WithTimeout(context.Background(), TRG_RECONCILIATION_TIMEOUT) _, err := p.trgClient.RunStop(ctx, &in, grpc.EmptyCallOption{}) + // TODO: Response's RC should also be checked here if err != nil { err = fmt.Errorf("TRG reconciliation failure: %w", err) log.WithError(err). diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index e312dc52b..5bc9785f2 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -37,6 +37,7 @@ type Run struct { RunNumber uint32 State State Detectors []system.ID + Skip bool } type Runs []Run @@ -75,7 +76,7 @@ const ( func parseRunList(runCount int, payload string) (runs Runs, err []error) { cleanPayload := strings.TrimSpace(payload) if len(cleanPayload) == 0 { - err = append(err, fmt.Errorf("empty RunList response payload")) + // nothing to do return } lines := strings.Split(strings.TrimSpace(cleanPayload), "\n") @@ -89,7 +90,9 @@ func parseRunList(runCount int, payload string) (runs Runs, err []error) { err = append(err, fmt.Errorf("cannot parse line %d: %s", i, parseErr.Error())) continue } - runs = append(runs, run) + if !run.Skip { + runs = append(runs, run) + } } return @@ -143,6 +146,7 @@ func parseRunLine(line string) (run Run, err error) { // don't interfere with daq // also daq not in known system ids -> results in error if strings.TrimSpace(item) == "daq" { + run.Skip = true continue } From ef379dfb59bc81aa0c9c461db9e614647c1f1a0f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Apr 2022 16:05:31 +0200 Subject: [PATCH 1201/2352] [build] Bump to v0.38.80 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ec1a0bbc8..b338a5c8f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 38 -VERSION_PATCH := 1 +VERSION_PATCH := 80 From b4e97dae95936944b9b1d5e84dfc3a7ada798a17 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Apr 2022 13:10:40 +0200 Subject: [PATCH 1202/2352] [core] Port kafka plugin to kafka-go package --- core/integration/kafka/plugin.go | 63 ++++++++++++++------------------ go.mod | 3 +- go.sum | 13 ++++++- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 4aa164ced..d4aa3e084 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -27,28 +27,30 @@ package kafka import ( + "context" "encoding/json" "fmt" + "net/url" + "strconv" + "strings" + "time" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" kafkapb "github.com/AliceO2Group/Control/core/integration/kafka/protos" "github.com/AliceO2Group/Control/core/workflow/callable" - "github.com/confluentinc/confluent-kafka-go/kafka" "github.com/golang/protobuf/proto" + "github.com/segmentio/kafka-go" "github.com/sirupsen/logrus" "github.com/spf13/viper" - "net/url" - "strconv" - "strings" - "time" ) var log = logger.New(logrus.StandardLogger(), "kafkaclient") type Plugin struct { - kafkaBroker string - kafkaProducer *kafka.Producer + endpoint string + kafkaWriter *kafka.Writer envsInRunning map[string]*kafkapb.EnvInfo // env id is the key } @@ -62,8 +64,8 @@ func NewPlugin(endpoint string) integration.Plugin { } return &Plugin{ - kafkaBroker: endpoint, - kafkaProducer: nil, + endpoint: endpoint, + kafkaWriter: nil, } } @@ -80,7 +82,7 @@ func (p *Plugin) GetEndpoint() string { } func (p *Plugin) GetConnectionState() string { - if p == nil || p.kafkaProducer == nil { + if p == nil || p.kafkaWriter == nil { return "UNKNOWN" } else { return "READY" @@ -99,15 +101,20 @@ func (p *Plugin) ActiveRunsListTopic() string { return "aliecs.env_list.RUNNING" } -func (p *Plugin) Init(instanceId string) error { +func (p *Plugin) Init(_ string) error { const call = "Init" var err error - p.kafkaProducer, err = kafka.NewProducer(&kafka.ConfigMap{"bootstrap.servers": p.kafkaBroker}) + + p.kafkaWriter = &kafka.Writer{ + Addr: kafka.TCP(p.endpoint), + Balancer: &kafka.CRC32Balancer{}, // same behaviour as confluent-kafka client + } + if err != nil { - return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %w", p.kafkaBroker, err) + return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %w", p.endpoint, err) } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) - log.WithField("call", call).Info("Successfully created a kafka producer with broker '" + p.kafkaBroker + "'") + log.WithField("call", call).Info("Successfully created a kafka producer with broker '" + p.endpoint + "'") // Prepare and send active run list (expected to be empty during init) timestamp := uint64(time.Now().UnixMilli()) @@ -233,32 +240,16 @@ func (p *Plugin) produceMessage(message []byte, topic string, envId string, call WithField("partition", envId). Debug("Producing a new kafka message on topic ", topic) - deliveryChannel := make(chan kafka.Event) - err := p.kafkaProducer.Produce(&kafka.Message{ - TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, - Value: message, - }, deliveryChannel) + err := p.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ + Topic: topic, + Value: message, + }) if err != nil { log.WithField("call", call). WithField("partition", envId). Error("Kafka message delivery failed: %w", err) } - - e := <-deliveryChannel - m, ok := e.(*kafka.Message) - - if !ok { - log.WithField("call", call). - WithField("partition", envId).Error("Could not read Kafka message delivery status") - } else if m.TopicPartition.Error != nil { - log.WithField("call", call). - WithField("partition", envId).Error("Kafka message delivery failed: ", m.TopicPartition.Error) - } else { - log.WithField("call", call). - WithField("partition", envId).Debugf("Kafka message delivered to topic %s [%d] at offset %v\n", - *m.TopicPartition.Topic, m.TopicPartition.Partition, m.TopicPartition.Offset) - } } func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) func() string { @@ -313,6 +304,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } func (p *Plugin) Destroy() error { - p.kafkaProducer.Close() + if err := p.kafkaWriter.Close(); err != nil { + log.Fatal("failed to close Kafka writer:", err) + } return nil } diff --git a/go.mod b/go.mod index cc18b44c7..a5c26af0b 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,6 @@ require ( github.com/briandowns/spinner v1.12.0 github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect - github.com/confluentinc/confluent-kafka-go v1.8.2 github.com/coreos/bbolt v1.3.4 // indirect github.com/coreos/etcd v3.3.25+incompatible // indirect github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect @@ -76,6 +75,7 @@ require ( github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/k0kubun/pp v3.0.1+incompatible github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect + github.com/klauspost/compress v1.15.2 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/looplab/fsm v0.2.0 github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -106,6 +106,7 @@ require ( github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 github.com/rs/xid v1.2.1 github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/segmentio/kafka-go v0.4.31 // indirect github.com/sirupsen/logrus v1.7.0 github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.5.1 // indirect diff --git a/go.sum b/go.sum index f99d93fb3..8fa2086fc 100644 --- a/go.sum +++ b/go.sum @@ -241,8 +241,6 @@ github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnht github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 h1:r3DTlrs4TDsAOv3sTv8XlcUUj5J/t2l4/rCdwPuc13s= github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/confluentinc/confluent-kafka-go v1.8.2 h1:PBdbvYpyOdFLehj8j+9ba7FL4c4Moxn79gy9cYKxG5E= -github.com/confluentinc/confluent-kafka-go v1.8.2/go.mod h1:u2zNLny2xq+5rWeTQjFHbDzzNuba4P1vo31r9r4uAdg= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= @@ -629,6 +627,9 @@ github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/compress v1.15.2 h1:3WH+AG7s2+T8o3nrM/8u2rdqUEcQhmga7smjrT41nAw= +github.com/klauspost/compress v1.15.2/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -827,7 +828,10 @@ github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNC github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.14 h1:+fL8AQEZtz/ijeNnpduH0bROTu0O3NZAlPjQxGn8LwE= +github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -926,6 +930,8 @@ github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9 github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/segmentio/kafka-go v0.4.31 h1:+ImsrkJRju9j1D9U44rvRGRlpsI9GnwD8s9WTFagNLQ= +github.com/segmentio/kafka-go v0.4.31/go.mod h1:m1lXeqJtIFYZayv0shM/tjrAFljvWLTprxBHd+3PnaU= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= @@ -1038,6 +1044,8 @@ github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70 github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= @@ -1101,6 +1109,7 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= From 3a4142b3813d68c66b938c65b84888d41d2c505d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Apr 2022 13:30:26 +0200 Subject: [PATCH 1203/2352] [core] Minor string fixes in kafka plugin --- core/integration/kafka/plugin.go | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index d4aa3e084..27d4fee96 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -29,7 +29,6 @@ package kafka import ( "context" "encoding/json" - "fmt" "net/url" "strconv" "strings" @@ -110,11 +109,9 @@ func (p *Plugin) Init(_ string) error { Balancer: &kafka.CRC32Balancer{}, // same behaviour as confluent-kafka client } - if err != nil { - return fmt.Errorf("failed to initialize a kafka producer with broker '%s'. Details: %w", p.endpoint, err) - } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) - log.WithField("call", call).Info("Successfully created a kafka producer with broker '" + p.endpoint + "'") + log.WithField("call", call). + Info("successfully created a kafka producer with broker '" + p.endpoint + "'") // Prepare and send active run list (expected to be empty during init) timestamp := uint64(time.Now().UnixMilli()) @@ -124,7 +121,7 @@ func (p *Plugin) Init(_ string) error { } arlData, err := proto.Marshal(activeRunsList) if err != nil { - log.WithField("call", call).Error("Could not marshall an active runs list: ", err) + log.WithField("call", call).Error("could not marshall an active runs list: ", err) } p.produceMessage(arlData, p.ActiveRunsListTopic(), "", "Init") return nil @@ -161,7 +158,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf return nil } - var state string = "UNKNOWN" + var state = "UNKNOWN" if strings.Contains(trigger, "enter_") { state = strings.TrimPrefix(trigger, "enter_") } else if strings.Contains(trigger, "DESTROY") { @@ -238,7 +235,7 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { func (p *Plugin) produceMessage(message []byte, topic string, envId string, call string) { log.WithField("call", call). WithField("partition", envId). - Debug("Producing a new kafka message on topic ", topic) + Debug("producing a new kafka message on topic ", topic) err := p.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ Topic: topic, @@ -262,7 +259,7 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f // Prepare and send new state notification log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). - Debug("Advertising the environment state (" + envInfo.State + ") and active runs list to Kafka") + Debug("advertising the environment state (" + envInfo.State + ") and active runs list to Kafka") newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, Timestamp: timestamp, @@ -271,7 +268,7 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). - Error("Could not marshall a new state notification: ", err) + Error("could not marshall a new state notification: ", err) } p.produceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId, call) @@ -284,7 +281,7 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). - Error("Could not marshall an active runs list: ", err) + Error("could not marshall an active runs list: ", err) } p.produceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId, call) return From fcd33d767d6b92a5db395cee740f43a4c795226c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Apr 2022 13:31:26 +0200 Subject: [PATCH 1204/2352] [build] Bump to v0.39.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index b338a5c8f..25a57024f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 38 -VERSION_PATCH := 80 +VERSION_MINOR := 39 +VERSION_PATCH := 0 From 41fed2763f95f32e27da841233e0c40921b9d182 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 28 Apr 2022 13:33:44 +0200 Subject: [PATCH 1205/2352] Revert "Disable the mac build" This reverts commit ac685b80b916ddb7cb99e04fe20802ad3dead8d2. --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index fb3e49be3..634eb5424 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [ubuntu-18.04] + os: [macOS-latest, ubuntu-18.04] go: [ '1.17' ] steps: - uses: actions/checkout@v2 From e988d0a5fc9bcdf0e08b5a51060cb33a8927e98f Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 22 Apr 2022 14:39:08 +0200 Subject: [PATCH 1206/2352] [core][OCTRL-621] The Bookkeeping should become an integration plugin to take advantage of hooks. --- core/environment/transition_startactivity.go | 44 +- .../bookkeeping/bookkeepingutils.go | 58 ++ core/integration/bookkeeping/client.go | 134 ++++ core/integration/bookkeeping/plugin.go | 637 ++++++++++++++++++ .../bookkeeping/protos/bookkeeping.proto | 172 +++++ core/the/singleton.go | 4 +- 6 files changed, 1025 insertions(+), 24 deletions(-) create mode 100644 core/integration/bookkeeping/bookkeepingutils.go create mode 100644 core/integration/bookkeeping/client.go create mode 100644 core/integration/bookkeeping/plugin.go create mode 100644 core/integration/bookkeeping/protos/bookkeeping.proto diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 845ce17a3..fd8350ea1 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,7 +26,6 @@ package environment import ( "errors" - "fmt" "strconv" "strings" "time" @@ -73,27 +72,28 @@ func (t StartActivityTransition) do(env *Environment) (err error) { odc_topology := env.GetKV("", "odc_topology") // GetString of active detectors and pass it to the BK API detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) - for _, flp := range flps { - the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) - } - - // According to documentation the 1st input should - // a text Log entry that is written by the shifter - // TODO (malexis): we need to implement a way to - // get the text from the shifter - // parentlogId = -1 to create a new log on each run - // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) - the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s",args["runNumber"],env.Id().String()), args["runNumber"], -1) + /* + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) + for _, flp := range flps { + the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) + } + // According to documentation the 1st input should + // a text Log entry that is written by the shifter + // TODO (malexis): we need to implement a way to + // get the text from the shifter + // parentlogId = -1 to create a new log on each run + // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) + the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s",args["runNumber"],env.Id().String()), args["runNumber"], -1) + */ taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), - task.CONFIGURED.String(), - task.START.String(), - task.RUNNING.String(), - args, - env.Id(), - ) + env.Workflow().GetTasks(), + task.CONFIGURED.String(), + task.START.String(), + task.RUNNING.String(), + args, + env.Id(), + ) t.taskman.MessageChannel <- taskmanMessage incomingEv := <-env.stateChangedCh @@ -109,8 +109,8 @@ func (t StartActivityTransition) do(env *Environment) (err error) { Info("run started") env.sendEnvironmentEvent(&event.EnvironmentEvent{ EnvironmentID: env.Id().String(), - State: "RUNNING", - Run: env.currentRunNumber, + State: "RUNNING", + Run: env.currentRunNumber, }) return diff --git a/core/integration/bookkeeping/bookkeepingutils.go b/core/integration/bookkeeping/bookkeepingutils.go new file mode 100644 index 000000000..932497b0d --- /dev/null +++ b/core/integration/bookkeeping/bookkeepingutils.go @@ -0,0 +1,58 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeeping + +import ( + "net/http" + + "github.com/spf13/viper" +) + +func getJWTAPIToken() (jwtToken string) { + req, err := http.NewRequest("GET", viper.GetString("bookkeepingBaseUri"), nil) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot create http GET request") + return + } + client := new(http.Client) + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + if token, ok := req.URL.Query()["token"]; ok { + log.WithField("JWT token", token[0]). + Debug("bookkeeping jwt token") + jwtToken = token[0] + } + return nil + } + + _, err = client.Do(req) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot execute http request") + return + } + return +} diff --git a/core/integration/bookkeeping/client.go b/core/integration/bookkeeping/client.go new file mode 100644 index 000000000..487f9c6da --- /dev/null +++ b/core/integration/bookkeeping/client.go @@ -0,0 +1,134 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeeping + +import ( + "context" + "github.com/AliceO2Group/Control/common/logger" + "time" + + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" +) + +var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") + +type RpcClient struct { + bkpb.BookkeepingClient + conn *grpc.ClientConn + cancel context.CancelFunc +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing Bookkeeping endpoint") + + dialOptions := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 20 * time.Second, + }, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, + }), + } + if !viper.GetBool("bookkeepingServiceUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + go func() { + connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + + for { + select { + case ok := <-stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("Bookkeeping client %s", connState.String()) + go notifyFunc(connState) + case <-time.After(2 * time.Minute): + if conn.GetState() != connectivity.Ready { + conn.ResetConnectBackoff() + } + case <-cxt.Done(): + return + } + } + }() + + client := &RpcClient{ + BookkeepingClient: bkpb.NewBookkeepingClient(conn), + conn: conn, + cancel: cancel, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + m.cancel() + return m.conn.Close() +} diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go new file mode 100644 index 000000000..98086e464 --- /dev/null +++ b/core/integration/bookkeeping/plugin.go @@ -0,0 +1,637 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/bookkeeping.proto + +package bookkeeping + +import ( + "context" + "encoding/json" + "errors" + "fmt" + log "github.com/sirupsen/logrus" + "io" + "net/url" + "path" + "strconv" + "strings" + "time" + + clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" + sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/core/integration" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/imdario/mergo" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" +) + +const ( + BK_DIAL_TIMEOUT = 2 * time.Hour + BK_GENERAL_OP_TIMEOUT = 45 * time.Second +) + +type Plugin struct { + bookkeepingHost string + bookkeepingPort int + + bookkeepingClient *RpcClient +} + +func NewPlugin(endpoint string) integration.Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + bookkeepingHost: u.Hostname(), + bookkeepingPort: portNumber, + bookkeepingClient: nil, + } +} + +func (p *Plugin) GetName() string { + return "bookkeeping" +} + +func (p *Plugin) GetPrettyName() string { + return "Bookkeeping" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("bookkeepingBaseUri") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.bookkeepingClient == nil { + return "UNKNOWN" + } + return p.bookkeepingClient.conn.GetState().String() +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.bookkeepingClient == nil { + return "" + } + + partitionStates := make(map[string]string) + + for _, envId := range environmentIds { + // ADD HERE + } + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + +func (p *Plugin) Init(instanceId string) error { + if p.bookkeepingClient == nil { + cxt, cancel := context.WithCancel(context.Background()) + p.bookkeepingClient = NewClient(cxt, cancel, viper.GetString("bookkeepingBaseUri")) + if p.bookkeepingClient == nil { + return fmt.Errorf("failed to connect to Bookkeeping service on %s", viper.GetString("bookkeepingBaseUri")) + } + apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) + if err == nil { + apiUrl.Path = path.Join(apiUrl.Path + "api") + clientAPI.InitializeApi(apiUrl.String(), viper.GetString("bookkeepingToken")) + } else { + log.WithField("error", err.Error()). + Error("unable to parse the Bookkeeping base URL") + clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) + } + log.Debug("Bookkeeping plugin initialized") + } + return nil +} + +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + log.Error("cannot acquire environment ID") + return + } + + stack = make(map[string]interface{}) + stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing + var err error + callFailedStr := "Bookkeeping StartOfRun call failed" + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping SOR") + } + + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("runNumber", runNumber64). + Infof("performing Bookkeeping SOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if p.bookkeepingClient.GetConnState() != connectivity.Ready { + err = fmt.Errorf("Bookkeeping client connection not available, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + envMan := environment.ManagerInstance() + env := envMan.Environment(envId) + runNumber := env.currentRunNumber + runType := env.GetRunType().String() + + args := controlcommands.PropertyMap{ + "runNumber": strconv.FormatUint(uint64(runNumber), 10), + } + + flps := env.GetFLPs() + dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) + dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) + epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) + odc_topology := env.GetKV("", "odc_topology") + // GetString of active detectors and pass it to the BK API + detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") + var runtypeAPI sw.RunType + switch runType { + case string(sw.TECHNICAL_RunType): + runtypeAPI = sw.TECHNICAL_RunType + case string(sw.COSMICS_RunType): + runtypeAPI = sw.COSMICS_RunType + case string(sw.PHYSICS_RunType): + runtypeAPI = sw.PHYSICS_RunType + default: + // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType + runtypeAPI = sw.TECHNICAL_RunType + } + + timeO2start := time.Now().UnixMilli() + timeTrgstart := time.Now().UnixMilli() + + in := bkpb.RunCreationRequest{ + EnvironmentId = env.Id().String(), + NDetectors = len(env.GetActiveDetectors()), + NEpns = 0, + NFlps = len(flps), + RunNumber = int32(runNumber) + RunType = runtypeAPI, + TimeO2start = timeO2start, + TimeTrgStart = timeTrgstart, + Dd_flp = dd_enabled, + Dcs = dcs_enabled, + Epn = epn_enabled, + EpnTopology = odc_topology, + Detectors = detectors, + } + + clientAPI.CreateRun(env.Id().String(), int32(len(env.GetActiveDetectors())), int32(0), int32(len(flps)), int32(runNumber), runtypeAPI, timeO2start, timeTrgstart, dd_enabled, dcs_enabled, epn_enabled, odc_topology, sw.Detectors(detectors)) + + log.WithField("runType", runType). + WithField("partition", env.Id().String()). + WithField("runNumber", runNumber). + Debug("CreateRun call done") +/* + for _, flp := range flps { + the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) + } + + the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", args["runNumber"], env.Id().String()), args["runNumber"], -1) +*/ + var stream bkpb.Configurator_StartOfRunClient + timeout := callable.AcquireTimeout(BK_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + stream, err = p.bookkeepingClient.CreateRun(ctx, &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + return + } + eorFunc := func(runNumber64 int64) (out string) { // must formally return string even when we return nothing + callFailedStr := "Bookkeeping EndOfRun call failed" + + bookkeepingDetectorsParam, ok := varStack["bookkeeping_detectors"] + if !ok { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("empty Bookkeeping detectors list provided") + bookkeepingDetectorsParam = "[\"NULL_DETECTOR\"]" + } + + detectors, err := p.parseDetectors(bookkeepingDetectorsParam) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("runNumber", runNumber64). + Infof("performing Bookkeeping EOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + + parameters, ok := varStack["bookkeeping_eor_parameters"] + if !ok { + log.WithField("partition", envId). + Debug("no Bookkeeping EOR parameters set") + parameters = "{}" + } + + argMap := make(map[string]string) + bytes := []byte(parameters) + err = json.Unmarshal(bytes, &argMap) + if err != nil { + err = fmt.Errorf("error processing Bookkeeping EOR parameters: %w", err) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + // Preparing the per-detector request payload + in := bkpb.EorRequest{ + RunNumber: int32(runNumber64), + Detectors: make([]*bkpb.DetectorOperationRequest, len(detectors)), + } + for i, det := range detectors { + perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_bookkeeping_eor_parameters"] + if !ok { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("empty Bookkeeping detectors list provided") + perDetectorParameters = "{}" + } + detectorArgMap := make(map[string]string) + bytes := []byte(perDetectorParameters) + err = json.Unmarshal(bytes, &detectorArgMap) + if err != nil { + err = fmt.Errorf("error processing %s Bookkeeping EOR parameter map: %w", det.String(), err) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EndOfRun"). + WithField("detector", det.String()). + WithField("runNumber", runNumber64). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + // Per-detector parameters override any general bookkeeping_eor_parameters + err = mergo.Merge(&detectorArgMap, argMap) + if err != nil { + err = fmt.Errorf("error processing %s Bookkeeping EOR general parameters override: %w", det.String(), err) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EndOfRun"). + WithField("detector", det.String()). + WithField("runNumber", runNumber64). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + in.Detectors[i] = &bkpb.DetectorOperationRequest{ + Detector: det, + ExtraParameters: detectorArgMap, + } + } + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, EndOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + if p.bookkeepingClient.GetConnState() != connectivity.Ready { + err = fmt.Errorf("Bookkeeping client connection not available, EndOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + var stream bkpb.Configurator_EndOfRunClient + timeout := callable.AcquireTimeout(BK_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + // Point of no return + // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via + // the response stream. + // Regardless of Bookkeeping EOR success or failure, it must run once and only once, therefore if this call returns + // a nil error, we immediately dequeue the pending EOR. + stream, err = p.bookkeepingClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + delete(p.pendingEORs, envId) // make sure this EOR never runs again + + log.WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Debug("Bookkeeping EndOfRun returned stream, awaiting responses (Bookkeeping cleanup will not run for this environment)") + + detectorStatusMap := make(map[bkpb.Detector]bkpb.DetectorState) + for _, v := range detectors { + detectorStatusMap[v] = bkpb.DetectorState_NULL_STATE + } + + var bookkeepingEvent *bkpb.RunEvent + for { + if ctx.Err() != nil { + err = fmt.Errorf("Bookkeeping EndOfRun context timed out (%s), any future Bookkeeping events are ignored", timeout.String()) + break + } + bookkeepingEvent, err = stream.Recv() + if errors.Is(err, io.EOF) { // correct stream termination + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("Bookkeeping EOR event stream EOF, closed") + break // no more data + } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). + WithField("timeout", timeout.String()). + Debug("Bookkeeping EOR timed out") + err = fmt.Errorf("Bookkeeping EOR timed out after %s: %w", timeout.String(), err) + break + } + if err != nil { // stream termination in case of general error + log.WithError(err). + WithField("partition", envId). + WithField("runNumber", runNumber64). + Warn("bad Bookkeeping EOR event received, any future Bookkeeping events are ignored") + break + } + if bookkeepingEvent == nil { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + Warn("nil Bookkeeping EOR event received, skipping to next Bookkeeping event") + continue + } + + if bookkeepingEvent.GetState() == bkpb.DetectorState_EOR_FAILURE { + if err == nil { + err = fmt.Errorf("%s EOR failure event from Bookkeeping", bookkeepingEvent.GetDetector().String()) + } + log.WithError(err). + WithField("event", bookkeepingEvent). + WithField("detector", bookkeepingEvent.GetDetector().String()). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + detectorStatusMap[bookkeepingEvent.GetDetector()] = bookkeepingEvent.GetState() + + if bookkeepingEvent.GetState() == bkpb.DetectorState_RUN_OK { + if bookkeepingEvent.GetDetector() == bkpb.Detector_BK { + log.WithField("event", bookkeepingEvent). + WithField("partition", envId). + WithField("runNumber", runNumber64). + Debug("Bookkeeping EOR completed successfully") + delete(p.pendingEORs, envId) + break + } else { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + WithField("detector", bookkeepingEvent.GetDetector().String()). + Debugf("Bookkeeping EOR for %s: received status %s", bookkeepingEvent.GetDetector().String(), bookkeepingEvent.GetState().String()) + } + } + + log.WithField("event", bookkeepingEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("runNumber", runNumber64). + Info("ALIECS EOR operation : processing Bookkeeping EOR for ") + } + + bookkeepingFailedDetectors := make([]string, 0) + bookkeepingopOk := true + for _, v := range detectors { + if detectorStatusMap[v] != bkpb.DetectorState_RUN_OK { + bookkeepingopOk = false + bookkeepingFailedDetectors = append(bookkeepingFailedDetectors, v.String()) + } + } + if bookkeepingopOk { + delete(p.pendingEORs, envId) + } else { + if err == nil { + err = fmt.Errorf("EOR failed for %s, Bookkeeping EOR will NOT run again for this run", strings.Join(bookkeepingFailedDetectors, ", ")) + } + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("Bookkeeping error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + return + } + stack["EndOfRun"] = func() (out string) { + rn := varStack["run_number"] + var runNumber64 int64 + var err error + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire run number for Bookkeeping EOR") + } + return eorFunc(runNumber64) + } + stack["Cleanup"] = func() (out string) { + envId, ok := varStack["environment_id"] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Warn("no environment_id found for Bookkeeping cleanup") + return + } + + runNumber, ok := p.pendingEORs[envId] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("Bookkeeping cleanup: nothing to do") + return + } + + log.WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("call", "Cleanup"). + Debug("pending Bookkeeping EOR found, performing cleanup") + + out = eorFunc(runNumber) + delete(p.pendingEORs, envId) + + return + } + + return +} + +func (p *Plugin) Destroy() error { + return p.bookkeepingClient.Close() +} diff --git a/core/integration/bookkeeping/protos/bookkeeping.proto b/core/integration/bookkeeping/protos/bookkeeping.proto new file mode 100644 index 000000000..8dff7fc5a --- /dev/null +++ b/core/integration/bookkeeping/protos/bookkeeping.proto @@ -0,0 +1,172 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2021 CERN and copyright holders of ALICE O². + * Authors: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ +syntax = "proto3"; + +package bookkeeping; +option go_package = "protos;bkpb"; + + +////////////////////////////////////////////////////// + +service Bookkeeping { + //rpc Instantiate (InstantiationRequest) returns (InstantiationResponse) {} + + rpc CreateRun (RunCreationRequest) returns (RunCreationResponse) {} + /* + rpc UpdateRun (RunUpdateRequest) returns (RunUpdateResponse) {} + rpc GetRuns (RunGetRequest) returns (RunEntriesResponse) {} + + rpc CreateFlp (FlpCreationRequest) returns (FlpCreationResponse) {} + rpc UpdateFlp (FlpUpdateRequest) returns (FlpUpdateResponse) {} + + rpc CreateLog (LogCreationRequest) returns (LogCreationResponse) {} + rpc GetLogs (LogGetRequest) returns (LogEntriesResponse) {} + */ +} + +////////////////////////////////////////////////////// + +////////////////////////////////////////////////////// +// Instance +////////////////////////////////////////////////////// + +//message InstantiationRequest {} + +//message InstantiationResponse {} + +////////////////////////////////////////////////////// +// Runs +////////////////////////////////////////////////////// + +message RunCreationRequest { + string environmentId = 1; + int64 nDetectors = 2; + int64 nEpns = 3; + int64 nFlps = 4; + uint32 runNumber = 5; + RunType runType = 6; + int64 timeO2start = 7; + int64 timeTrgStart = 8; + bool dd_flp = 9; + bool dcs = 10; + bool epn = 11; + string epnTopology = 12; + string detectors = 13; +} + + +message RunCreationResponse { + +} + +/* +message RunUpdateRequest { + +} + +message RunUpdateResponse { + +} + +message RunGetRequest { + +} + +message RunEntriesResponse { + +} + +////////////////////////////////////////////////////// +// Flps +////////////////////////////////////////////////////// + +message FlpCreationRequest { + +} + +message FlpCreationResponse { + +} + +message FlpUpdateRequest { + +} + +message FlpUpdateResponse { + +} + +////////////////////////////////////////////////////// +// Logs +////////////////////////////////////////////////////// + +message LogCreationRequest { + +} + +message LogCreationResponse { + +} + +message LogGetRequest { + +} + +message LogEntriesResponse { + +} + +////////////////////////////////////////////////////// +// Enum definitions +////////////////////////////////////////////////////// + +enum EventType { + NULL_EVENT = 0; + HEARTBEAT = 1; + STATE_CHANGE_EVENT = 2; + ERROR_EVENT = 3; + ACK_EVENT = 4; + SOR_EVENT = 20; + EOR_EVENT = 30; + TIMEOUT = 40; +} +*/ + + +enum RunType { + NULL_RUNTYPE = 0; + PHYSICS = 1; + TECHNICAL = 2; + PEDESTALS = 3; + PULSER = 4; + LASER = 5; + CALIBRATION_ITHR_TUNING = 6; + CALIBRATION_VCASN_TUNING = 7; + CALIBRATION_THR_SCAN = 8; + CALIBRATION_DIGITAL_SCAN = 9; + CALIBRATION_ANALOG_SCAN = 10; + CALIBRATION_FHR = 11; + CALIBRATION_ALPIDE_SCAN = 12; + +} diff --git a/core/the/singleton.go b/core/the/singleton.go index c2f83aef6..3609b5cf6 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -27,7 +27,7 @@ package the import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/configuration" - "github.com/AliceO2Group/Control/core/bookkeeping" + "github.com/AliceO2Group/Control/core/integration/bookkeeping" "github.com/AliceO2Group/Control/core/repos" ) @@ -40,5 +40,5 @@ func RepoManager() *repos.RepoManager { } func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { - return bookkeeping.Instance() + return bookkeeping.Instance() } From 071f8554c225cfb0838166e2025235ade979eff7 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 26 Apr 2022 09:47:11 +0200 Subject: [PATCH 1207/2352] [core][OCTRL-621] Bookkeeping is an integration plugin that can take advantage of hooks. --- cmd/o2-aliecs-core/main.go | 11 +- core/environment/transition_startactivity.go | 25 +- core/environment/transition_stopactivity.go | 33 +- core/{ => integration}/bookkeeping/api.go | 5 +- .../bookkeeping/bookkeepingutils.go | 58 --- core/integration/bookkeeping/client.go | 134 ----- core/integration/bookkeeping/plugin.go | 488 +++--------------- .../bookkeeping/protos/bookkeeping.proto | 172 ------ core/{ => integration}/bookkeeping/utils.go | 2 + core/the/singleton.go | 10 +- 10 files changed, 132 insertions(+), 806 deletions(-) rename core/{ => integration}/bookkeeping/api.go (96%) delete mode 100644 core/integration/bookkeeping/bookkeepingutils.go delete mode 100644 core/integration/bookkeeping/client.go delete mode 100644 core/integration/bookkeeping/protos/bookkeeping.proto rename core/{ => integration}/bookkeeping/utils.go (95%) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index 6b35091bb..df1f90e49 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/bookkeeping" "github.com/AliceO2Group/Control/core/integration/ccdb" "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" @@ -43,6 +44,10 @@ import ( func init() { // TODO: enable/disable switches for plugins + integration.RegisterPlugin( + "bookkeeping", + "bookkeepingBaseUri", + bookkeeping.NewPlugin) integration.RegisterPlugin( "ccdb", "ccdbEndpoint", @@ -73,9 +78,9 @@ func init() { testplugin.NewPlugin) log.SetFormatter(&prefixed.TextFormatter{ - FullTimestamp: true, - SpacePadding: 20, - PrefixPadding: 12, + FullTimestamp: true, + SpacePadding: 20, + PrefixPadding: 12, // Needed for colored stdout/stderr in GoLand, IntelliJ, etc. ForceColors: true, diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index fd8350ea1..a6c441495 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,15 +26,11 @@ package environment import ( "errors" - "strconv" - "strings" - "time" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" + "strconv" ) func NewStartActivityTransition(taskman *task.Manager) Transition { @@ -65,14 +61,15 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "runNumber": strconv.FormatUint(uint64(runNumber), 10), } - flps := env.GetFLPs() - dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) - dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) - epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) - odc_topology := env.GetKV("", "odc_topology") - // GetString of active detectors and pass it to the BK API - detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") /* + flps := env.GetFLPs() + dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) + dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) + epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) + odc_topology := env.GetKV("", "odc_topology") + // GetString of active detectors and pass it to the BK API + detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") + the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) for _, flp := range flps { the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) @@ -99,7 +96,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) + /* + the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) + */ env.currentRunNumber = 0 return tasksStateErrors } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 108db8d63..4cbf910df 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -26,12 +26,9 @@ package environment import ( "errors" - "time" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" - "github.com/AliceO2Group/Control/core/the" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -55,25 +52,31 @@ func (t StopActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber). WithField("partition", env.Id().String()). Info("stopping run") - runNumber := env.currentRunNumber - + /* + runNumber := env.currentRunNumber + */ + taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), - nil, - env.Id(), - ) + env.Workflow().GetTasks(), + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + env.Id(), + ) t.taskman.MessageChannel <- taskmanMessage incomingEv := <-env.stateChangedCh // If some tasks failed to transition - if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + /* + the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) + */ return tasksStateErrors } - the.BookkeepingAPI().UpdateRun(int32(runNumber), "good", time.Now(), time.Now()) + /* + the.BookkeepingAPI().UpdateRun(int32(runNumber), "good", time.Now(), time.Now()) + */ env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return diff --git a/core/bookkeeping/api.go b/core/integration/bookkeeping/api.go similarity index 96% rename from core/bookkeeping/api.go rename to core/integration/bookkeeping/api.go index 64c632bc3..c0ea9c6d7 100644 --- a/core/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -25,6 +25,7 @@ package bookkeeping import ( + log "github.com/sirupsen/logrus" "net/url" "path" "sync" @@ -32,13 +33,9 @@ import ( clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" - "github.com/AliceO2Group/Control/common/logger" - "github.com/sirupsen/logrus" "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(), "bookkeeping") - // [O2-2512]: Until JWT becomes optional or provided by BK // const jwtToken = "token" diff --git a/core/integration/bookkeeping/bookkeepingutils.go b/core/integration/bookkeeping/bookkeepingutils.go deleted file mode 100644 index 932497b0d..000000000 --- a/core/integration/bookkeeping/bookkeepingutils.go +++ /dev/null @@ -1,58 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * Claire Guyot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package bookkeeping - -import ( - "net/http" - - "github.com/spf13/viper" -) - -func getJWTAPIToken() (jwtToken string) { - req, err := http.NewRequest("GET", viper.GetString("bookkeepingBaseUri"), nil) - if err != nil { - log.WithField("error", err.Error()). - Error("cannot create http GET request") - return - } - client := new(http.Client) - client.CheckRedirect = func(req *http.Request, via []*http.Request) error { - if token, ok := req.URL.Query()["token"]; ok { - log.WithField("JWT token", token[0]). - Debug("bookkeeping jwt token") - jwtToken = token[0] - } - return nil - } - - _, err = client.Do(req) - if err != nil { - log.WithField("error", err.Error()). - Error("cannot execute http request") - return - } - return -} diff --git a/core/integration/bookkeeping/client.go b/core/integration/bookkeeping/client.go deleted file mode 100644 index 487f9c6da..000000000 --- a/core/integration/bookkeeping/client.go +++ /dev/null @@ -1,134 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Claire Guyot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package bookkeeping - -import ( - "context" - "github.com/AliceO2Group/Control/common/logger" - "time" - - bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" - "google.golang.org/grpc" - "google.golang.org/grpc/backoff" - "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/keepalive" -) - -var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") - -type RpcClient struct { - bkpb.BookkeepingClient - conn *grpc.ClientConn - cancel context.CancelFunc -} - -func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { - log.WithFields(logrus.Fields{ - "endpoint": endpoint, - }).Debug("dialing Bookkeeping endpoint") - - dialOptions := []grpc.DialOption{ - grpc.WithInsecure(), - grpc.WithConnectParams(grpc.ConnectParams{ - Backoff: backoff.Config{ - BaseDelay: backoff.DefaultConfig.BaseDelay, - Multiplier: backoff.DefaultConfig.Multiplier, - Jitter: backoff.DefaultConfig.Jitter, - MaxDelay: 20 * time.Second, - }, - MinConnectTimeout: 10 * time.Second, - }), - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: 5 * time.Second, - Timeout: time.Second, - PermitWithoutStream: true, - }), - } - if !viper.GetBool("bookkeepingServiceUseSystemProxy") { - dialOptions = append(dialOptions, grpc.WithNoProxy()) - } - - conn, err := grpc.DialContext(cxt, - endpoint, - dialOptions..., - ) - if err != nil { - log.WithField("error", err.Error()). - WithField("endpoint", endpoint). - Errorf("cannot dial RPC endpoint") - cancel() - return nil - } - - go func() { - connState := connectivity.Idle - stateChangedNotify := make(chan bool) - notifyFunc := func(st connectivity.State) { - ok := conn.WaitForStateChange(cxt, st) - stateChangedNotify <- ok - } - go notifyFunc(connState) - - for { - select { - case ok := <-stateChangedNotify: - if !ok { - return - } - connState = conn.GetState() - log.Debugf("Bookkeeping client %s", connState.String()) - go notifyFunc(connState) - case <-time.After(2 * time.Minute): - if conn.GetState() != connectivity.Ready { - conn.ResetConnectBackoff() - } - case <-cxt.Done(): - return - } - } - }() - - client := &RpcClient{ - BookkeepingClient: bkpb.NewBookkeepingClient(conn), - conn: conn, - cancel: cancel, - } - - return client -} - -func (m *RpcClient) GetConnState() connectivity.State { - if m.conn == nil { - return connectivity.Idle - } - return m.conn.GetState() -} - -func (m *RpcClient) Close() error { - m.cancel() - return m.conn.Close() -} diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 98086e464..477cd65d0 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -22,47 +22,35 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/bookkeeping.proto +/* + //go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/bookkeeping.proto +*/ package bookkeeping import ( - "context" "encoding/json" - "errors" "fmt" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/environment" log "github.com/sirupsen/logrus" - "io" "net/url" - "path" "strconv" "strings" "time" - clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" - sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" "github.com/AliceO2Group/Control/common/logger/infologger" - "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" - bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" "github.com/AliceO2Group/Control/core/workflow/callable" - "github.com/imdario/mergo" "github.com/spf13/viper" - "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" -) - -const ( - BK_DIAL_TIMEOUT = 2 * time.Hour - BK_GENERAL_OP_TIMEOUT = 45 * time.Second ) type Plugin struct { bookkeepingHost string bookkeepingPort int - bookkeepingClient *RpcClient + bookkeepingClient *BookkeepingWrapper } func NewPlugin(endpoint string) integration.Plugin { @@ -99,7 +87,9 @@ func (p *Plugin) GetConnectionState() string { if p == nil || p.bookkeepingClient == nil { return "UNKNOWN" } - return p.bookkeepingClient.conn.GetState().String() + // TODO: + // add bookkeeping api connection state + return "" } func (p *Plugin) GetData(environmentIds []uid.ID) string { @@ -109,10 +99,6 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { partitionStates := make(map[string]string) - for _, envId := range environmentIds { - // ADD HERE - } - out, err := json.Marshal(partitionStates) if err != nil { return "" @@ -122,20 +108,10 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { func (p *Plugin) Init(instanceId string) error { if p.bookkeepingClient == nil { - cxt, cancel := context.WithCancel(context.Background()) - p.bookkeepingClient = NewClient(cxt, cancel, viper.GetString("bookkeepingBaseUri")) + p.bookkeepingClient = Instance() if p.bookkeepingClient == nil { return fmt.Errorf("failed to connect to Bookkeeping service on %s", viper.GetString("bookkeepingBaseUri")) } - apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) - if err == nil { - apiUrl.Path = path.Join(apiUrl.Path + "api") - clientAPI.InitializeApi(apiUrl.String(), viper.GetString("bookkeepingToken")) - } else { - log.WithField("error", err.Error()). - Error("unable to parse the Bookkeeping base URL") - clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) - } log.Debug("Bookkeeping plugin initialized") } return nil @@ -175,7 +151,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - Infof("performing Bookkeeping SOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + Infof("performing Bookkeeping SOR") if p.bookkeepingClient == nil { err = fmt.Errorf("Bookkeeping plugin not initialized, StartOfRun impossible") @@ -186,24 +162,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - if p.bookkeepingClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("Bookkeeping client connection not available, StartOfRun impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("Bookkeeping error") + Error("Bookkeeping SOR error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -211,10 +170,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + parsedEnvId, err := uid.FromString(envId) envMan := environment.ManagerInstance() - env := envMan.Environment(envId) - runNumber := env.currentRunNumber - runType := env.GetRunType().String() + env, err := envMan.Environment(parsedEnvId) + runNumber := env.GetCurrentRunNumber() args := controlcommands.PropertyMap{ "runNumber": strconv.FormatUint(uint64(runNumber), 10), @@ -227,172 +186,24 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { odc_topology := env.GetKV("", "odc_topology") // GetString of active detectors and pass it to the BK API detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - var runtypeAPI sw.RunType - switch runType { - case string(sw.TECHNICAL_RunType): - runtypeAPI = sw.TECHNICAL_RunType - case string(sw.COSMICS_RunType): - runtypeAPI = sw.COSMICS_RunType - case string(sw.PHYSICS_RunType): - runtypeAPI = sw.PHYSICS_RunType - default: - // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType - runtypeAPI = sw.TECHNICAL_RunType - } - - timeO2start := time.Now().UnixMilli() - timeTrgstart := time.Now().UnixMilli() - - in := bkpb.RunCreationRequest{ - EnvironmentId = env.Id().String(), - NDetectors = len(env.GetActiveDetectors()), - NEpns = 0, - NFlps = len(flps), - RunNumber = int32(runNumber) - RunType = runtypeAPI, - TimeO2start = timeO2start, - TimeTrgStart = timeTrgstart, - Dd_flp = dd_enabled, - Dcs = dcs_enabled, - Epn = epn_enabled, - EpnTopology = odc_topology, - Detectors = detectors, - } - clientAPI.CreateRun(env.Id().String(), int32(len(env.GetActiveDetectors())), int32(0), int32(len(flps)), int32(runNumber), runtypeAPI, timeO2start, timeTrgstart, dd_enabled, dcs_enabled, epn_enabled, odc_topology, sw.Detectors(detectors)) + // TODO: + // add return error ??? + p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) - log.WithField("runType", runType). - WithField("partition", env.Id().String()). - WithField("runNumber", runNumber). - Debug("CreateRun call done") -/* for _, flp := range flps { - the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) - } - - the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", args["runNumber"], env.Id().String()), args["runNumber"], -1) -*/ - var stream bkpb.Configurator_StartOfRunClient - timeout := callable.AcquireTimeout(BK_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - stream, err = p.bookkeepingClient.CreateRun(ctx, &in, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - return - } - eorFunc := func(runNumber64 int64) (out string) { // must formally return string even when we return nothing - callFailedStr := "Bookkeeping EndOfRun call failed" - - bookkeepingDetectorsParam, ok := varStack["bookkeeping_detectors"] - if !ok { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("empty Bookkeeping detectors list provided") - bookkeepingDetectorsParam = "[\"NULL_DETECTOR\"]" + p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) } - detectors, err := p.parseDetectors(bookkeepingDetectorsParam) - if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). - Infof("performing Bookkeeping EOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) - - parameters, ok := varStack["bookkeeping_eor_parameters"] - if !ok { - log.WithField("partition", envId). - Debug("no Bookkeeping EOR parameters set") - parameters = "{}" - } - - argMap := make(map[string]string) - bytes := []byte(parameters) - err = json.Unmarshal(bytes, &argMap) - if err != nil { - err = fmt.Errorf("error processing Bookkeeping EOR parameters: %w", err) - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - // Preparing the per-detector request payload - in := bkpb.EorRequest{ - RunNumber: int32(runNumber64), - Detectors: make([]*bkpb.DetectorOperationRequest, len(detectors)), - } - for i, det := range detectors { - perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_bookkeeping_eor_parameters"] - if !ok { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("empty Bookkeeping detectors list provided") - perDetectorParameters = "{}" - } - detectorArgMap := make(map[string]string) - bytes := []byte(perDetectorParameters) - err = json.Unmarshal(bytes, &detectorArgMap) + p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", args["runNumber"], env.Id().String()), args["runNumber"], -1) + /* if err != nil { - err = fmt.Errorf("error processing %s Bookkeeping EOR parameter map: %w", det.String(), err) - log.WithError(err). WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "EndOfRun"). - WithField("detector", det.String()). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("runNumber", runNumber64). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - // Per-detector parameters override any general bookkeeping_eor_parameters - err = mergo.Merge(&detectorArgMap, argMap) - if err != nil { - err = fmt.Errorf("error processing %s Bookkeeping EOR general parameters override: %w", det.String(), err) - - log.WithError(err). - WithField("level", infologger.IL_Support). WithField("partition", envId). - WithField("call", "EndOfRun"). - WithField("detector", det.String()). - WithField("runNumber", runNumber64). + WithField("call", "StartOfRun"). Error("Bookkeeping error") call.VarStack["__call_error_reason"] = err.Error() @@ -401,237 +212,108 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - in.Detectors[i] = &bkpb.DetectorOperationRequest{ - Detector: det, - ExtraParameters: detectorArgMap, - } + */ + return + } + updateFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing + p.bookkeepingClient.UpdateRun(int32(runNumber64), state, time.Now(), time.Now()) + return + } + stack["UpdateRunStart"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateRun call failed" + + rn := varStack["run_number"] + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping UpdateRun") } + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("runNumber", runNumber64). + Infof("performing Bookkeeping UpdateRun") + if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, EndOfRun impossible") + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRun impossible") log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("runNumber", runNumber64). WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") + WithField("call", "UpdateRun"). + Error("Bookkeeping UpdateRun error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr return } - if p.bookkeepingClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("Bookkeeping client connection not available, EndOfRun impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState != "RUNNING" { + return updateFunc(runNumber64, "bad") + } else { return } + } + stack["UpdateRunStop"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateRun call failed" - var stream bkpb.Configurator_EndOfRunClient - timeout := callable.AcquireTimeout(BK_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - - // Point of no return - // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via - // the response stream. - // Regardless of Bookkeeping EOR success or failure, it must run once and only once, therefore if this call returns - // a nil error, we immediately dequeue the pending EOR. - stream, err = p.bookkeepingClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) + rn := varStack["run_number"] + runNumber64, err := strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping UpdateRun") } - delete(p.pendingEORs, envId) // make sure this EOR never runs again - log.WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Debug("Bookkeeping EndOfRun returned stream, awaiting responses (Bookkeeping cleanup will not run for this environment)") - - detectorStatusMap := make(map[bkpb.Detector]bkpb.DetectorState) - for _, v := range detectors { - detectorStatusMap[v] = bkpb.DetectorState_NULL_STATE - } + Infof("performing Bookkeeping UpdateRun") - var bookkeepingEvent *bkpb.RunEvent - for { - if ctx.Err() != nil { - err = fmt.Errorf("Bookkeeping EndOfRun context timed out (%s), any future Bookkeeping events are ignored", timeout.String()) - break - } - bookkeepingEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("Bookkeeping EOR event stream EOF, closed") - break // no more data - } - if errors.Is(err, context.DeadlineExceeded) { - log.WithError(err). - WithField("partition", envId). - WithField("runNumber", runNumber64). - WithField("timeout", timeout.String()). - Debug("Bookkeeping EOR timed out") - err = fmt.Errorf("Bookkeeping EOR timed out after %s: %w", timeout.String(), err) - break - } - if err != nil { // stream termination in case of general error - log.WithError(err). - WithField("partition", envId). - WithField("runNumber", runNumber64). - Warn("bad Bookkeeping EOR event received, any future Bookkeeping events are ignored") - break - } - if bookkeepingEvent == nil { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - Warn("nil Bookkeeping EOR event received, skipping to next Bookkeeping event") - continue - } - - if bookkeepingEvent.GetState() == bkpb.DetectorState_EOR_FAILURE { - if err == nil { - err = fmt.Errorf("%s EOR failure event from Bookkeeping", bookkeepingEvent.GetDetector().String()) - } - log.WithError(err). - WithField("event", bookkeepingEvent). - WithField("detector", bookkeepingEvent.GetDetector().String()). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - detectorStatusMap[bookkeepingEvent.GetDetector()] = bookkeepingEvent.GetState() - - if bookkeepingEvent.GetState() == bkpb.DetectorState_RUN_OK { - if bookkeepingEvent.GetDetector() == bkpb.Detector_BK { - log.WithField("event", bookkeepingEvent). - WithField("partition", envId). - WithField("runNumber", runNumber64). - Debug("Bookkeeping EOR completed successfully") - delete(p.pendingEORs, envId) - break - } else { - log.WithField("partition", envId). - WithField("runNumber", runNumber64). - WithField("detector", bookkeepingEvent.GetDetector().String()). - Debugf("Bookkeeping EOR for %s: received status %s", bookkeepingEvent.GetDetector().String(), bookkeepingEvent.GetState().String()) - } - } - - log.WithField("event", bookkeepingEvent). - WithField("partition", envId). - WithField("level", infologger.IL_Devel). - WithField("runNumber", runNumber64). - Info("ALIECS EOR operation : processing Bookkeeping EOR for ") - } - - bookkeepingFailedDetectors := make([]string, 0) - bookkeepingopOk := true - for _, v := range detectors { - if detectorStatusMap[v] != bkpb.DetectorState_RUN_OK { - bookkeepingopOk = false - bookkeepingFailedDetectors = append(bookkeepingFailedDetectors, v.String()) - } - } - if bookkeepingopOk { - delete(p.pendingEORs, envId) - } else { - if err == nil { - err = fmt.Errorf("EOR failed for %s, Bookkeeping EOR will NOT run again for this run", strings.Join(bookkeepingFailedDetectors, ", ")) - } + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRun impossible") log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("runNumber", runNumber64). WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("Bookkeeping error") + WithField("call", "UpdateRun"). + Error("Bookkeeping UpdateRun error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - } - return - } - stack["EndOfRun"] = func() (out string) { - rn := varStack["run_number"] - var runNumber64 int64 - var err error - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithError(err). - WithField("partition", envId). - Error("cannot acquire run number for Bookkeeping EOR") - } - return eorFunc(runNumber64) - } - stack["Cleanup"] = func() (out string) { - envId, ok := varStack["environment_id"] - if !ok { - log.WithField("partition", envId). - WithField("level", infologger.IL_Devel). - Warn("no environment_id found for Bookkeeping cleanup") - return - } - runNumber, ok := p.pendingEORs[envId] - if !ok { - log.WithField("partition", envId). - WithField("level", infologger.IL_Devel). - Debug("Bookkeeping cleanup: nothing to do") return } - log.WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("level", infologger.IL_Devel). - WithField("call", "Cleanup"). - Debug("pending Bookkeeping EOR found, performing cleanup") - - out = eorFunc(runNumber) - delete(p.pendingEORs, envId) - - return + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState != "CONFIGURED" { + return updateFunc(runNumber64, "bad") + } else { + return updateFunc(runNumber64, "good") + } } return } func (p *Plugin) Destroy() error { - return p.bookkeepingClient.Close() + var err error + // TODO: + // destroy bookkeeping api connection + return err } diff --git a/core/integration/bookkeeping/protos/bookkeeping.proto b/core/integration/bookkeeping/protos/bookkeeping.proto deleted file mode 100644 index 8dff7fc5a..000000000 --- a/core/integration/bookkeeping/protos/bookkeeping.proto +++ /dev/null @@ -1,172 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020-2021 CERN and copyright holders of ALICE O². - * Authors: Claire Guyot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ -syntax = "proto3"; - -package bookkeeping; -option go_package = "protos;bkpb"; - - -////////////////////////////////////////////////////// - -service Bookkeeping { - //rpc Instantiate (InstantiationRequest) returns (InstantiationResponse) {} - - rpc CreateRun (RunCreationRequest) returns (RunCreationResponse) {} - /* - rpc UpdateRun (RunUpdateRequest) returns (RunUpdateResponse) {} - rpc GetRuns (RunGetRequest) returns (RunEntriesResponse) {} - - rpc CreateFlp (FlpCreationRequest) returns (FlpCreationResponse) {} - rpc UpdateFlp (FlpUpdateRequest) returns (FlpUpdateResponse) {} - - rpc CreateLog (LogCreationRequest) returns (LogCreationResponse) {} - rpc GetLogs (LogGetRequest) returns (LogEntriesResponse) {} - */ -} - -////////////////////////////////////////////////////// - -////////////////////////////////////////////////////// -// Instance -////////////////////////////////////////////////////// - -//message InstantiationRequest {} - -//message InstantiationResponse {} - -////////////////////////////////////////////////////// -// Runs -////////////////////////////////////////////////////// - -message RunCreationRequest { - string environmentId = 1; - int64 nDetectors = 2; - int64 nEpns = 3; - int64 nFlps = 4; - uint32 runNumber = 5; - RunType runType = 6; - int64 timeO2start = 7; - int64 timeTrgStart = 8; - bool dd_flp = 9; - bool dcs = 10; - bool epn = 11; - string epnTopology = 12; - string detectors = 13; -} - - -message RunCreationResponse { - -} - -/* -message RunUpdateRequest { - -} - -message RunUpdateResponse { - -} - -message RunGetRequest { - -} - -message RunEntriesResponse { - -} - -////////////////////////////////////////////////////// -// Flps -////////////////////////////////////////////////////// - -message FlpCreationRequest { - -} - -message FlpCreationResponse { - -} - -message FlpUpdateRequest { - -} - -message FlpUpdateResponse { - -} - -////////////////////////////////////////////////////// -// Logs -////////////////////////////////////////////////////// - -message LogCreationRequest { - -} - -message LogCreationResponse { - -} - -message LogGetRequest { - -} - -message LogEntriesResponse { - -} - -////////////////////////////////////////////////////// -// Enum definitions -////////////////////////////////////////////////////// - -enum EventType { - NULL_EVENT = 0; - HEARTBEAT = 1; - STATE_CHANGE_EVENT = 2; - ERROR_EVENT = 3; - ACK_EVENT = 4; - SOR_EVENT = 20; - EOR_EVENT = 30; - TIMEOUT = 40; -} -*/ - - -enum RunType { - NULL_RUNTYPE = 0; - PHYSICS = 1; - TECHNICAL = 2; - PEDESTALS = 3; - PULSER = 4; - LASER = 5; - CALIBRATION_ITHR_TUNING = 6; - CALIBRATION_VCASN_TUNING = 7; - CALIBRATION_THR_SCAN = 8; - CALIBRATION_DIGITAL_SCAN = 9; - CALIBRATION_ANALOG_SCAN = 10; - CALIBRATION_FHR = 11; - CALIBRATION_ALPIDE_SCAN = 12; - -} diff --git a/core/bookkeeping/utils.go b/core/integration/bookkeeping/utils.go similarity index 95% rename from core/bookkeeping/utils.go rename to core/integration/bookkeeping/utils.go index 7813ed844..c4d141c4a 100644 --- a/core/bookkeeping/utils.go +++ b/core/integration/bookkeeping/utils.go @@ -3,6 +3,7 @@ * * Copyright 2021 CERN and copyright holders of ALICE O². * Author: Miltiadis Alexis + * Claire Guyot * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -25,6 +26,7 @@ package bookkeeping import ( + log "github.com/sirupsen/logrus" "net/http" "github.com/spf13/viper" diff --git a/core/the/singleton.go b/core/the/singleton.go index 3609b5cf6..e6727981b 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -27,7 +27,7 @@ package the import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/configuration" - "github.com/AliceO2Group/Control/core/integration/bookkeeping" + //"github.com/AliceO2Group/Control/core/integration/bookkeeping" "github.com/AliceO2Group/Control/core/repos" ) @@ -39,6 +39,8 @@ func RepoManager() *repos.RepoManager { return repos.Instance(ConfSvc()) } -func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { - return bookkeeping.Instance() -} +/* + func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { + return bookkeeping.Instance() + } +*/ From 40c2ce5fdbec0a9ffe152782aea63b628c011552 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 26 Apr 2022 10:49:44 +0200 Subject: [PATCH 1208/2352] [core][OCTRL-621] Bookkeeping integration plugin related files are cleaned up. --- core/environment/transition_startactivity.go | 28 ++------------- core/environment/transition_stopactivity.go | 10 +----- core/integration/bookkeeping/api.go | 2 +- core/integration/bookkeeping/plugin.go | 37 ++++---------------- core/integration/bookkeeping/utils.go | 1 - core/the/singleton.go | 7 ---- 6 files changed, 10 insertions(+), 75 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index a6c441495..87b37416d 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,11 +26,12 @@ package environment import ( "errors" + "strconv" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" - "strconv" ) func NewStartActivityTransition(taskman *task.Manager) Transition { @@ -61,28 +62,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "runNumber": strconv.FormatUint(uint64(runNumber), 10), } - /* - flps := env.GetFLPs() - dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) - dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) - epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) - odc_topology := env.GetKV("", "odc_topology") - // GetString of active detectors and pass it to the BK API - detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - - the.BookkeepingAPI().CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) - for _, flp := range flps { - the.BookkeepingAPI().CreateFlp(flp, flp, int32(runNumber)) - } - - // According to documentation the 1st input should - // a text Log entry that is written by the shifter - // TODO (malexis): we need to implement a way to - // get the text from the shifter - // parentlogId = -1 to create a new log on each run - // the.BookkeepingAPI().CreateLog(env.Id().String(), fmt.Sprintf("Log for run %s and environment %s",runNumberStr,env.Id().String()), runNumberStr, -1) - the.BookkeepingAPI().CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s",args["runNumber"],env.Id().String()), args["runNumber"], -1) - */ taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.CONFIGURED.String(), @@ -96,9 +75,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - /* - the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) - */ env.currentRunNumber = 0 return tasksStateErrors } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 4cbf910df..4db7aaf99 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" @@ -52,9 +53,6 @@ func (t StopActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber). WithField("partition", env.Id().String()). Info("stopping run") - /* - runNumber := env.currentRunNumber - */ taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), @@ -69,14 +67,8 @@ func (t StopActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - /* - the.BookkeepingAPI().UpdateRun(int32(runNumber), "bad", time.Now(), time.Now()) - */ return tasksStateErrors } - /* - the.BookkeepingAPI().UpdateRun(int32(runNumber), "good", time.Now(), time.Now()) - */ env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) return diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index c0ea9c6d7..60343ea2b 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -25,7 +25,6 @@ package bookkeeping import ( - log "github.com/sirupsen/logrus" "net/url" "path" "sync" @@ -33,6 +32,7 @@ import ( clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" + log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 477cd65d0..e232edabe 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -31,18 +31,18 @@ package bookkeeping import ( "encoding/json" "fmt" - "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/AliceO2Group/Control/core/environment" - log "github.com/sirupsen/logrus" "net/url" "strconv" "strings" "time" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/workflow/callable" + log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -87,9 +87,7 @@ func (p *Plugin) GetConnectionState() string { if p == nil || p.bookkeepingClient == nil { return "UNKNOWN" } - // TODO: - // add bookkeeping api connection state - return "" + return "READY" } func (p *Plugin) GetData(environmentIds []uid.ID) string { @@ -184,11 +182,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) odc_topology := env.GetKV("", "odc_topology") - // GetString of active detectors and pass it to the BK API detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - // TODO: - // add return error ??? p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) for _, flp := range flps { @@ -196,23 +191,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", args["runNumber"], env.Id().String()), args["runNumber"], -1) - /* - if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("Bookkeeping error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - */ return } updateFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing @@ -312,8 +290,5 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } func (p *Plugin) Destroy() error { - var err error - // TODO: - // destroy bookkeeping api connection - return err + return nil } diff --git a/core/integration/bookkeeping/utils.go b/core/integration/bookkeeping/utils.go index c4d141c4a..30b84efa4 100644 --- a/core/integration/bookkeeping/utils.go +++ b/core/integration/bookkeeping/utils.go @@ -3,7 +3,6 @@ * * Copyright 2021 CERN and copyright holders of ALICE O². * Author: Miltiadis Alexis - * Claire Guyot * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/core/the/singleton.go b/core/the/singleton.go index e6727981b..8befa7b79 100644 --- a/core/the/singleton.go +++ b/core/the/singleton.go @@ -27,7 +27,6 @@ package the import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/configuration" - //"github.com/AliceO2Group/Control/core/integration/bookkeeping" "github.com/AliceO2Group/Control/core/repos" ) @@ -38,9 +37,3 @@ func ConfSvc() configuration.Service { func RepoManager() *repos.RepoManager { return repos.Instance(ConfSvc()) } - -/* - func BookkeepingAPI() *bookkeeping.BookkeepingWrapper { - return bookkeeping.Instance() - } -*/ From e606312c63be34523a6f98e2e7dc89eab5f431d6 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 26 Apr 2022 14:47:47 +0200 Subject: [PATCH 1209/2352] [core][OCTRL-621] Resolving PR comments for the Bookkeeping integration plugin. --- core/integration/bookkeeping/api.go | 5 ++++- core/integration/bookkeeping/plugin.go | 23 +++++------------------ core/integration/bookkeeping/utils.go | 1 - 3 files changed, 9 insertions(+), 20 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 60343ea2b..50be97dc4 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -32,13 +32,16 @@ import ( clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" - log "github.com/sirupsen/logrus" + "github.com/AliceO2Group/Control/common/logger" + "github.com/sirupsen/logrus" "github.com/spf13/viper" ) // [O2-2512]: Until JWT becomes optional or provided by BK // const jwtToken = "token" +var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") + type BookkeepingWrapper struct{} var ( diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e232edabe..99fe8615c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -22,10 +22,6 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -/* - //go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/bookkeeping.proto -*/ - package bookkeeping import ( @@ -38,11 +34,9 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/workflow/callable" - log "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -84,9 +78,6 @@ func (p *Plugin) GetEndpoint() string { } func (p *Plugin) GetConnectionState() string { - if p == nil || p.bookkeepingClient == nil { - return "UNKNOWN" - } return "READY" } @@ -105,13 +96,11 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { } func (p *Plugin) Init(instanceId string) error { + p.bookkeepingClient = Instance() if p.bookkeepingClient == nil { - p.bookkeepingClient = Instance() - if p.bookkeepingClient == nil { - return fmt.Errorf("failed to connect to Bookkeeping service on %s", viper.GetString("bookkeepingBaseUri")) - } - log.Debug("Bookkeeping plugin initialized") + return fmt.Errorf("failed to connect to Bookkeeping service on %s", viper.GetString("bookkeepingBaseUri")) } + log.Debug("Bookkeeping plugin initialized") return nil } @@ -173,9 +162,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { env, err := envMan.Environment(parsedEnvId) runNumber := env.GetCurrentRunNumber() - args := controlcommands.PropertyMap{ - "runNumber": strconv.FormatUint(uint64(runNumber), 10), - } + rnString := strconv.FormatUint(uint64(runNumber), 10) flps := env.GetFLPs() dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) @@ -190,7 +177,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) } - p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", args["runNumber"], env.Id().String()), args["runNumber"], -1) + p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) return } updateFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing diff --git a/core/integration/bookkeeping/utils.go b/core/integration/bookkeeping/utils.go index 30b84efa4..7813ed844 100644 --- a/core/integration/bookkeeping/utils.go +++ b/core/integration/bookkeeping/utils.go @@ -25,7 +25,6 @@ package bookkeeping import ( - log "github.com/sirupsen/logrus" "net/http" "github.com/spf13/viper" From 4c574bc12340726d23d8bb29873f2637cfedad0b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Apr 2022 17:28:23 +0200 Subject: [PATCH 1210/2352] [core] Push lhc_period, run_type and detectors to EPN tasks --- core/integration/odc/plugin.go | 37 +++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index cfeeac3c7..74cfe66f0 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -789,6 +789,40 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments := make(map[string]string) arguments["environment_id"] = envId + runType, ok := varStack["run_type"] + if ok { + arguments["run_type"] = runType + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("could not get get variable run_type from environment context") + } + + lhcPeriod, ok := varStack["lhc_period"] + if ok { + arguments["lhc_period"] = lhcPeriod + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("could not get get variable lhc_period from environment context") + } + + detectorListS, ok := varStack["detectors"] + if ok { + detectorsSlice, err := p.parseDetectors(detectorListS) + if err == nil { + arguments["detectors"] = strings.Join(detectorsSlice, ",") + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("cannot parse general detector list") + } + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("cannot acquire general detector list from varStack") + } + // FIXME: this only copies over vars prefixed with "odc_" // Figure out a better way! for k, v := range varStack { @@ -808,7 +842,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "Configure"). - WithError(err).Error("ODC error") + WithError(err). + Error("ODC error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr } From abddf625d0610a00623214229f5ad67ac645488a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 29 Apr 2022 10:06:42 +0200 Subject: [PATCH 1211/2352] [core] kafkaBroker -> kafkaEndpoint This does not seem to have an influence on what is actually used, but perhaps this is used to report the endpoint to some other parties. --- core/integration/kafka/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 27d4fee96..285f5ac89 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -77,7 +77,7 @@ func (p *Plugin) GetPrettyName() string { } func (p *Plugin) GetEndpoint() string { - return viper.GetString("kafkaBroker") + return viper.GetString("kafkaEndpoint") } func (p *Plugin) GetConnectionState() string { From 86bc3662aafbf6d39a47457c1bea90969dbee9ff Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 13:27:24 +0200 Subject: [PATCH 1212/2352] [core] Add kafkaEndpoint as known cli flag --- core/config.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/config.go b/core/config.go index 29b749cd7..161f9e4b7 100644 --- a/core/config.go +++ b/core/config.go @@ -169,6 +169,7 @@ func setFlags() error { pflag.String("coreConfigEntry", viper.GetString("coreConfigEntry"), "key for AliECS core configuration within the `aliecs` component [EXPERT SETTING]") pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") + pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From 0bd0e811db726f24c7544910a213359d26304cf4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 13:33:17 +0200 Subject: [PATCH 1213/2352] [core] Allow auto topic creation in Kafka client + improved logging --- core/integration/kafka/plugin.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 285f5ac89..a3c64163f 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -105,8 +105,9 @@ func (p *Plugin) Init(_ string) error { var err error p.kafkaWriter = &kafka.Writer{ - Addr: kafka.TCP(p.endpoint), - Balancer: &kafka.CRC32Balancer{}, // same behaviour as confluent-kafka client + Addr: kafka.TCP(p.endpoint), + Balancer: &kafka.CRC32Balancer{}, // same behaviour as confluent-kafka client + AllowAutoTopicCreation: true, } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) @@ -235,7 +236,7 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { func (p *Plugin) produceMessage(message []byte, topic string, envId string, call string) { log.WithField("call", call). WithField("partition", envId). - Debug("producing a new kafka message on topic ", topic) + Debugf("producing a new kafka message on topic %s", topic) err := p.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ Topic: topic, @@ -245,7 +246,8 @@ func (p *Plugin) produceMessage(message []byte, topic string, envId string, call if err != nil { log.WithField("call", call). WithField("partition", envId). - Error("Kafka message delivery failed: %w", err) + WithField("topic", topic). + Errorf("Kafka message delivery failed: %s", err.Error()) } } From 34fd8b0250bb95b831b16a22589551a56fcc2163 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 15:07:48 +0200 Subject: [PATCH 1214/2352] [core] Introduce START counter as __fmq_cleanup_count variable --- core/environment/environment.go | 76 +++++++++++++++++++++------------ 1 file changed, 48 insertions(+), 28 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index b88f1a05c..e51cd222b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -54,8 +54,7 @@ import ( "github.com/sirupsen/logrus" ) -var log = logger.New(logrus.StandardLogger(),"env") - +var log = logger.New(logrus.StandardLogger(), "env") type Environment struct { Mu sync.RWMutex @@ -76,10 +75,10 @@ type Environment struct { stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} eventStream Subscription - Public bool // From workflow or user + Public bool // From workflow or user Description string // From workflow - callsPendingAwait map[string /*await expression, trigger only*/]callable.CallsMap + callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -94,9 +93,9 @@ func (env *Environment) NotifyEvent(e event.DeviceEvent) { func newEnvironment(userVars map[string]string) (env *Environment, err error) { envId := uid.New() env = &Environment{ - id: envId, - workflow: nil, - ts: time.Now(), + id: envId, + workflow: nil, + ts: time.Now(), incomingEvents: make(chan event.DeviceEvent), // Every Environment instantiation performs a ConfSvc query for defaults and vars // these key-values stay frozen throughout the lifetime of the environment @@ -121,6 +120,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } }, ) + env.GlobalVars.Set("__fmq_cleanup_count", "0") // initialize to 0 the number of START transitions + env.Sm = fsm.NewFSM( "STANDBY", fsm.Events{ @@ -154,6 +155,17 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.workflow.SetRuntimeVar("run_start_time_ms", runStartTime) env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous EOR + cleanupCount := 0 + cleanupCountS, ok := env.GlobalVars.Get("__fmq_cleanup_count") + if ok && len(cleanupCountS) > 0 { + var parseErr error + cleanupCount, parseErr = strconv.Atoi(cleanupCountS) + if parseErr != nil { + cleanupCount = 1 // something was there, even though non-parsable, so we signal to clean up + } + } + env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) // number of times the START transition has run for this env + configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults())) if err == nil { lhcPeriod, ok := configStack["lhc_period"] @@ -218,8 +230,17 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { ) } - // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. - if e.Event == "STOP_ACTIVITY" { + if e.Event == "START_ACTIVITY" { + // If START_ACTIVITY is complete, we increment the FairMQ cleanup counter + cleanupCount := 0 + cleanupCountS, ok := env.GlobalVars.Get("__fmq_cleanup_count") + if ok && len(cleanupCountS) > 0 { + cleanupCount, _ = strconv.Atoi(cleanupCountS) + } + cleanupCount++ + env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) + } else if e.Event == "STOP_ACTIVITY" { + // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. env.currentRunNumber = 0 env.workflow.GetVars().Del("run_number") env.workflow.GetVars().Del("runNumber") @@ -334,8 +355,8 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // If the hook call or task is critical: true if hook.GetTraits().Critical { log.WithField("partition", env.Id().String()). - Logf(logrus.FatalLevel, "critical hook failed: %s", err) // Must use Logf(FatalLevel) instead of - // Fatalf because the latter calls Exit + Logf(logrus.FatalLevel, "critical hook failed: %s", err) // Must use Logf(FatalLevel) instead of + // Fatalf because the latter calls Exit criticalFailures = append(criticalFailures, err) } else { log.WithField("level", infologger.IL_Devel). @@ -511,7 +532,7 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map return } - <- doneCh + <-doneCh return } @@ -530,7 +551,7 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { return nil } return func(e *fsm.Event) { - if e.Err != nil { // If the event was already cancelled + if e.Err != nil { // If the event was already cancelled return } log.WithFields(logrus.Fields{ @@ -555,7 +576,6 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { } } - // Accessors func (env *Environment) Id() uid.ID { @@ -569,7 +589,7 @@ func (env *Environment) Id() uid.ID { func (env *Environment) CreatedWhen() time.Time { if env == nil { - return time.Unix(0,0) + return time.Unix(0, 0) } env.Mu.RLock() defer env.Mu.RUnlock() @@ -648,7 +668,7 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { wfState := wf.GetState() if wfState != task.ERROR { - WORKFLOW_STATE_LOOP: + WORKFLOW_STATE_LOOP: for { select { case wfState = <-notify: @@ -664,22 +684,22 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { }) if len(toStop) > 0 { taskmanMessage := task.NewTransitionTaskMessage( - toStop, - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), - nil, - env.Id(), - ) - taskman.MessageChannel <- taskmanMessage - <-env.stateChangedCh + toStop, + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + env.Id(), + ) + taskman.MessageChannel <- taskmanMessage + <-env.stateChangedCh } break WORKFLOW_STATE_LOOP } if wfState == task.DONE { break WORKFLOW_STATE_LOOP } - case <- env.unsubscribe: + case <-env.unsubscribe: break WORKFLOW_STATE_LOOP } } @@ -699,7 +719,7 @@ func (env *Environment) unsubscribeFromWfState() { close(env.unsubscribe) } } - }) + }) } func (env *Environment) addSubscription(sub Subscription) { @@ -759,7 +779,7 @@ func (env *Environment) GetActiveDetectors() (response system.IDMap) { return } for _, det := range slice { - sid, err := system.IDString(det) // generated by enumer + sid, err := system.IDString(det) // generated by enumer if err != nil { continue } From ae31b5102003e4737dd00892c8e6f838c29473b8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 15:09:16 +0200 Subject: [PATCH 1215/2352] [core] Push cleanup variable (__fairmq_cleanup_count) to FLP and EPN --- core/environment/transition_startactivity.go | 11 +++++++++++ core/integration/odc/plugin.go | 18 +++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 87b37416d..be4bf822f 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -58,8 +58,19 @@ func (t StartActivityTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). Info("starting new run") + cleanupCount := 0 + cleanupCountS, ok := env.GlobalVars.Get("__fmq_cleanup_count") + if ok && len(cleanupCountS) > 0 { + var parseErr error + cleanupCount, parseErr = strconv.Atoi(cleanupCountS) + if parseErr != nil { + cleanupCount = 1 // something was there, even though non-parsable, so we signal to clean up + } + } + args := controlcommands.PropertyMap{ "runNumber": strconv.FormatUint(uint64(runNumber), 10), + "cleanup": strconv.Itoa(cleanupCount), } taskmanMessage := task.NewTransitionTaskMessage( diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 74cfe66f0..8104a57c6 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -902,8 +902,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Start"). Warn("cannot acquire run number for ODC") } + cleanupCountS, ok := varStack["__fmq_cleanup_count"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Start"). + Warn("cannot acquire FairMQ devices cleanup count for ODC") + } + var ( runNumberu64 uint64 + cleanupCount int err error ) callFailedStr := "EPN Start call failed" @@ -912,15 +920,23 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithField("partition", envId). WithError(err). - Error("cannot acquire run number for DCS SOR") + Error("cannot acquire run number for ODC SOR") runNumberu64 = 0 } + cleanupCount, err = strconv.Atoi(cleanupCountS) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire FairMQ devices cleanup count for ODC SOR") + cleanupCount = 1 + } timeout := callable.AcquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) arguments := make(map[string]string) arguments["run_number"] = rn arguments["runNumber"] = rn + arguments["cleanup"] = strconv.Itoa(cleanupCount) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() From 0825e486f7587b392061a9f4b1747bc089b310b9 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 29 Apr 2022 10:13:09 +0200 Subject: [PATCH 1216/2352] [apricot][OCTRL-547] ListRuntimeEntries returns the correct flattened tree. --- apricot/local/service.go | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 439339494..31f1df728 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -47,6 +47,7 @@ import ( ) var log = logger.New(logrus.StandardLogger(), "confsys") + const inventoryKeyPrefix = "o2/hardware/" type Service struct { @@ -136,7 +137,9 @@ func (s *Service) ListDetectors(getAll bool) (detectors []string, err error) { for _, key := range keys { detTrimmed := strings.TrimPrefix(key, keyPrefix) detname := strings.Split(detTrimmed, "/") - if !getAll && detname[0] == "TRG" { continue } + if !getAll && detname[0] == "TRG" { + continue + } if _, ok := detectorSet[detname[0]]; !ok { // the detector name we found in the path isn't already accounted for detectorSet[detname[0]] = true detectors = append(detectors, detname[0]) @@ -389,12 +392,12 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { return "", err } json.Unmarshal([]byte(cfgCards), &cards) - unique := make(map[string]bool) - for _, card := range cards { + unique := make(map[string]bool) + for _, card := range cards { if _, value := unique[card.Serial]; !value { - unique[card.Serial] = true - serials = append(serials, card.Serial) - } + unique[card.Serial] = true + serials = append(serials, card.Serial) + } } bytes, err := json.Marshal(serials) if err != nil { @@ -415,7 +418,7 @@ func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, e return "", err } json.Unmarshal([]byte(cfgCards), &cards) - for _, card := range cards { + for _, card := range cards { if card.Serial == cardSerial { endpoints = endpoints + card.Endpoint + " " } @@ -444,20 +447,25 @@ func (s *Service) SetRuntimeEntry(component string, key string, value string) er func (s *Service) ListRuntimeEntries(component string) ([]string, error) { if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - keys, err := cSrc.GetKeysByPrefix(filepath.Join(getConsulRuntimePrefix(), component)) + path := filepath.Join(getConsulRuntimePrefix(), component) + keys, err := cSrc.GetKeysByPrefix(path) if err != nil { return nil, err } payload := make([]string, 0) for _, k := range keys { - split := strings.Split(k, componentcfg.SEPARATOR) + keySuffix := strings.TrimPrefix(k, path+"/") + if keySuffix == "" { + continue + } + split := strings.Split(keySuffix, componentcfg.SEPARATOR) var last string - if len(split) == 4 { // correct depth for first level - last = split[3] - payload = append(payload, last) - } else { + last = split[len(split)-1] + if last == "" { continue + } else { + payload = append(payload, keySuffix) } } return payload, nil From cdbeea2553f344cdf59c58249dfc7d2b5d3d1129 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 15:38:05 +0200 Subject: [PATCH 1217/2352] [build] Bump to v0.40.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 25a57024f..fcdd10136 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 39 +VERSION_MINOR := 40 VERSION_PATCH := 0 From c812362e6a30ec884e5b6b208c36a1a6776a5482 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 17:44:31 +0200 Subject: [PATCH 1218/2352] [core] Add bookkeepingBaseUri to list of viper flags --- core/config.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/config.go b/core/config.go index 161f9e4b7..b54213bd9 100644 --- a/core/config.go +++ b/core/config.go @@ -170,6 +170,7 @@ func setFlags() error { pflag.String("fmqPlugin", viper.GetString("fmqPlugin"), "Name of the plugin for FairMQ tasks") pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") + pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From a2d4f4423d59f11e6cab92930fdf49175cfdeb10 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 17:46:04 +0200 Subject: [PATCH 1219/2352] [core] Fix initialization of Bookkeeping instance singleton --- core/integration/bookkeeping/api.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 50be97dc4..d76ae5b6f 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -61,6 +61,7 @@ func Instance() *BookkeepingWrapper { Error("unable to parse the Bookkeeping base URL") clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) } + instance = &BookkeepingWrapper{} }) return instance } From 03fd9144b968eaea579b7f6215eada29854645cd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 29 Apr 2022 17:48:54 +0200 Subject: [PATCH 1220/2352] [core] Bump AliECS to v0.40.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fcdd10136..4ccae7ee2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 40 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 50e4b5a81ee7db1b70baa9712cdf9cd5e1ef54cb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 5 May 2022 16:14:48 +0200 Subject: [PATCH 1221/2352] [core] Handle hooks for leave_state trigger upon environment destruction --- core/environment/manager.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 0687afd35..7483239a4 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -278,6 +278,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } + err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) + if err != nil { + log.WithFields(logrus.Fields{ + "partition": environmentId.String(), + }).Error(fmt.Errorf("could not handle hooks for the trigger leave_%s, error: %w", env.CurrentState(), err)) + } + tasksToRelease := env.Workflow().GetTasks() // we gather all DESTROY/after_DESTROY hooks, as these require special treatment From 88f5999d3dfa079f150ebe4776e4293d10dca611 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 5 May 2022 16:17:33 +0200 Subject: [PATCH 1222/2352] [core] make kafka notify upon leaving states --- core/integration/kafka/plugin.go | 74 +++++++++++++++++++++++--------- 1 file changed, 54 insertions(+), 20 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index a3c64163f..2baca54ca 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -92,10 +92,14 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { return "" } -func (p *Plugin) FSMTransitionTopic(state string) string { +func (p *Plugin) FSMEnterStateTopic(state string) string { return "aliecs.env_state." + state } +func (p *Plugin) FSMLeaveStateTopic(state string) string { + return "aliecs.env_leave_state." + state +} + func (p *Plugin) ActiveRunsListTopic() string { return "aliecs.env_list.RUNNING" } @@ -145,6 +149,18 @@ func parseDetectors(detectorsParam string) (detectors []string, err error) { return detectorsSlice, nil } +func (p *Plugin) extractStateFromTrigger(trigger string) string { + if strings.Contains(trigger, "enter_") { + return strings.TrimPrefix(trigger, "enter_") + } else if strings.Contains(trigger, "leave_") { + return strings.TrimPrefix(trigger, "leave_") + } else if trigger == "after_START_ACTIVITY" || trigger == "before_STOP_ACTIVITY" { + return "RUNNING" + } else { + return "UNKNOWN" + } +} + func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kafkapb.EnvInfo { envId, ok := varStack["environment_id"] if !ok { @@ -158,21 +174,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf Error("cannot acquire trigger from varStack") return nil } - - var state = "UNKNOWN" - if strings.Contains(trigger, "enter_") { - state = strings.TrimPrefix(trigger, "enter_") - } else if strings.Contains(trigger, "DESTROY") { - // We cannot hook to enter_DONE, since the hooks are released before it happens. - // On the other hand, we cannot assume that a DESTROY trigger leads successfully to DONE. - // Thus, we put UNKNOWN state - state = "UNKNOWN" - } else { - log.WithField("call", call). - WithField("partition", envId).Error("could not obtain state from trigger: ", trigger) - return nil - } - //stateLowerCase := strings.ToLower(state) + state := p.extractStateFromTrigger(trigger) var runNumberOpt *uint32 = nil var runTypeOpt *string = nil @@ -251,7 +253,7 @@ func (p *Plugin) produceMessage(message []byte, topic string, envId string, call } } -func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) func() string { +func (p *Plugin) createNewStateCallback(varStack map[string]string, call string) func() string { return func() (out string) { // Retrieve and update the env info timestamp := uint64(time.Now().UnixMilli()) @@ -261,7 +263,7 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f // Prepare and send new state notification log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). - Debug("advertising the environment state (" + envInfo.State + ") and active runs list to Kafka") + Debug("Notifying Kafka that the environment is entering the state " + envInfo.State) newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, Timestamp: timestamp, @@ -272,8 +274,11 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f WithField("partition", envInfo.EnvironmentId). Error("could not marshall a new state notification: ", err) } - p.produceMessage(nsnData, p.FSMTransitionTopic(envInfo.State), envInfo.EnvironmentId, call) + p.produceMessage(nsnData, p.FSMEnterStateTopic(envInfo.State), envInfo.EnvironmentId, call) + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Debug("Notifying Kafka about the new list of environments in RUNNING") // Prepare and send active run list activeRunsList := &kafkapb.ActiveRunsList{ ActiveRuns: p.GetRunningEnvList(), @@ -290,6 +295,32 @@ func (p *Plugin) createUpdateCallback(varStack map[string]string, call string) f } } +func (p *Plugin) createLeaveStateCallback(varStack map[string]string, call string) func() string { + return func() (out string) { + // Retrieve and update the env info + timestamp := uint64(time.Now().UnixMilli()) + envInfo := p.newEnvStateObject(varStack, call) + + // Prepare and send new state notification + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Debug("Notifying Kafka that the environment is leaving the state " + envInfo.State) + newStateNotification := &kafkapb.NewStateNotification{ + EnvInfo: envInfo, + Timestamp: timestamp, + } + nsnData, err := proto.Marshal(newStateNotification) + if err != nil { + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Error("could not marshall a new state notification: ", err) + } + p.produceMessage(nsnData, p.FSMLeaveStateTopic(envInfo.State), envInfo.EnvironmentId, call) + + return + } +} + func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { @@ -298,7 +329,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack stack = make(map[string]interface{}) - stack["PublishUpdate"] = p.createUpdateCallback(varStack, "PublishUpdate") + // The first two are actually equal. We create both to allow to migrate to a more accurate name. + stack["PublishUpdate"] = p.createNewStateCallback(varStack, "PublishUpdate") + stack["PublishEnterStateUpdate"] = p.createNewStateCallback(varStack, "PublishEnterStateUpdate") + stack["PublishLeaveStateUpdate"] = p.createLeaveStateCallback(varStack, "PublishLeaveStateUpdate") return } From eeeb8edd7b006e708c4e0c28d35181a0676852a2 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 5 May 2022 09:58:24 +0200 Subject: [PATCH 1223/2352] [core] Set odc_topology_fullname as a runtime variable available to the API. --- core/integration/odc/plugin.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 8104a57c6..2010d1669 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -30,6 +30,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/AliceO2Group/Control/core/environment" "net/url" "strconv" "strings" @@ -281,6 +282,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter pdpO2PdpSuiteVersion, pdpQcJsonVersion string odcNEpnsMaxFail, epnStoreRawDataFraction string pdpEpnShmId, pdpEpnShmRecreate string + odc_topology_fullname string ) accumulator = make([]string, 0) @@ -637,6 +639,33 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, strings.TrimSpace(pdpGeneratorScriptPath)) + odc_topology_fullname = "" + switch pdpConfigOption { + case "Repository hash": + odc_topology_fullname = "(hash, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" + + case "Repository path": + odc_topology_fullname = "(path, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" + + case "Manual XML": + odc_topology, ok := varStack["odc_topology"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire ODC topology variable") + return + } + odc_topology_fullname = "(xml, " + odc_topology + ")" + + default: + odc_topology_fullname = "" + } + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + + env.Workflow().SetRuntimeVar("odc_topology_fullname", odc_topology_fullname) + out = strings.Join(accumulator, " ") return } From 6718b87462e0ff60a942e786dcb75c5ac27e9816 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 6 May 2022 11:33:54 +0200 Subject: [PATCH 1224/2352] [core][OCTRL-574] Errors are handled correctly in GenerateEPNWorkflowScript. --- core/integration/odc/plugin.go | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2010d1669..801eadebe 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -282,7 +282,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter pdpO2PdpSuiteVersion, pdpQcJsonVersion string odcNEpnsMaxFail, epnStoreRawDataFraction string pdpEpnShmId, pdpEpnShmRecreate string - odc_topology_fullname string + odcTopologyFullname string ) accumulator = make([]string, 0) @@ -639,13 +639,13 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, strings.TrimSpace(pdpGeneratorScriptPath)) - odc_topology_fullname = "" + odcTopologyFullname = "" switch pdpConfigOption { case "Repository hash": - odc_topology_fullname = "(hash, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" + odcTopologyFullname = "(hash, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" case "Repository path": - odc_topology_fullname = "(path, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" + odcTopologyFullname = "(path, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" case "Manual XML": odc_topology, ok := varStack["odc_topology"] @@ -655,16 +655,25 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot acquire ODC topology variable") return } - odc_topology_fullname = "(xml, " + odc_topology + ")" - - default: - odc_topology_fullname = "" + odcTopologyFullname = "(xml, " + odc_topology + ")" } parsedEnvId, err := uid.FromString(envId) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse environment ID") + return + } envMan := environment.ManagerInstance() env, err := envMan.Environment(parsedEnvId) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire environment from parsed environment ID") + return + } - env.Workflow().SetRuntimeVar("odc_topology_fullname", odc_topology_fullname) + env.Workflow().SetRuntimeVar("odc_topology_fullname", odcTopologyFullname) out = strings.Join(accumulator, " ") return From 9c123167825813d702d0045dbaaa426e8e1e9a82 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 3 May 2022 10:12:14 +0200 Subject: [PATCH 1225/2352] [core] The Bookkeeping integration plugin is extended to support environment updates. --- core/integration/bookkeeping/api.go | 18 +- core/integration/bookkeeping/plugin.go | 309 +++++++++++++++++++++++-- 2 files changed, 308 insertions(+), 19 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index d76ae5b6f..23c213fc5 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -94,11 +94,11 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.GOOD_RunQuality case string(sw.BAD_RunQuality): runquality = sw.BAD_RunQuality - case string(sw.UNKNOWN_RunQuality): - runquality = sw.UNKNOWN_RunQuality + //case string(sw.UNKNOWN_RunQuality): + // runquality = sw.UNKNOWN_RunQuality default: // log runquality is %s and it is not valid. overwrite with UNKNOWN_RunQuality - runquality = sw.UNKNOWN_RunQuality + runquality = sw.TEST_RunQuality } clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) @@ -132,3 +132,15 @@ func (bk *BookkeepingWrapper) GetRuns() { clientAPI.GetRuns() log.Debug("GetRuns call done") } + +func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) { + clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) + log.WithField("environment", envId). + Debug("CreateEnvironment call done") +} + +func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) { + clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) + log.WithField("environment", envId). + Debug("UpdateEnvironment call done") +} diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 99fe8615c..aef2bc259 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -122,6 +122,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) + // Run related Bookkeeping functions stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing var err error callFailedStr := "Bookkeeping StartOfRun call failed" @@ -180,37 +181,37 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) return } - updateFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing + updateRunFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing p.bookkeepingClient.UpdateRun(int32(runNumber64), state, time.Now(), time.Now()) return } stack["UpdateRunStart"] = func() (out string) { var err error - callFailedStr := "Bookkeeping UpdateRun call failed" + callFailedStr := "Bookkeeping UpdateRunStart call failed" rn := varStack["run_number"] runNumber64, err := strconv.ParseInt(rn, 10, 32) if err != nil { log.WithField("partition", envId). WithError(err). - Error("cannot acquire run number for Bookkeeping UpdateRun") + Error("cannot acquire run number for Bookkeeping UpdateRunStart") } log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - Infof("performing Bookkeeping UpdateRun") + Infof("performing Bookkeeping UpdateRunStart") if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRun impossible") + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStart impossible") log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("runNumber", runNumber64). WithField("partition", envId). - WithField("call", "UpdateRun"). - Error("Bookkeeping UpdateRun error") + WithField("call", "UpdateRunStart"). + Error("Bookkeeping UpdateRunStart error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -223,38 +224,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState != "RUNNING" { - return updateFunc(runNumber64, "bad") + return updateRunFunc(runNumber64, "bad") } else { return } } stack["UpdateRunStop"] = func() (out string) { var err error - callFailedStr := "Bookkeeping UpdateRun call failed" + callFailedStr := "Bookkeeping UpdateRunStop call failed" rn := varStack["run_number"] runNumber64, err := strconv.ParseInt(rn, 10, 32) if err != nil { log.WithField("partition", envId). WithError(err). - Error("cannot acquire run number for Bookkeeping UpdateRun") + Error("cannot acquire run number for Bookkeeping UpdateRunStop") } log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - Infof("performing Bookkeeping UpdateRun") + Infof("performing Bookkeeping UpdateRunStop") if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRun impossible") + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStop impossible") log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("runNumber", runNumber64). WithField("partition", envId). - WithField("call", "UpdateRun"). - Error("Bookkeeping UpdateRun error") + WithField("call", "UpdateRunStop"). + Error("Bookkeeping UpdateRunStop error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -267,9 +268,285 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState != "CONFIGURED" { - return updateFunc(runNumber64, "bad") + return updateRunFunc(runNumber64, "bad") } else { - return updateFunc(runNumber64, "good") + return updateRunFunc(runNumber64, "good") + } + } + // Environment related Bookkeeping functions + stack["CreateEnv"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping CreateEnv call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, CreateEnv impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "CreateEnv"). + Error("Bookkeeping CreateEnv error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "STANDBY" { + p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in STANDBY state after creation") + } else { + p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after creation") + } + return + } + updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { + p.bookkeepingClient.UpdateEnvironment(envId, toredownAt, status, statusMessage) + return + } + stack["UpdateDeployEnv"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateDeployEnv call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateDeployEnv impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateDeployEnv"). + Error("Bookkeeping UpdateDeployEnv error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") + } + } + stack["UpdateEnvConfigure"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvConfigure call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvConfigure impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvConfigure"). + Error("Bookkeeping UpdateEnvConfigure error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") + } + } + stack["UpdateEnvReset"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvReset call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvReset impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvReset"). + Error("Bookkeeping UpdateEnvReset error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") + } + } + stack["UpdateEnvStart"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvStart call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvStart impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvStart"). + Error("Bookkeeping UpdateEnvStart error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "RUNNING" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") + } + } + stack["UpdateEnvStop"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvStop call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvStop impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvStop"). + Error("Bookkeeping UpdateEnvStop error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") + } + } + stack["UpdateEnvExit"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvStop call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvExit impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvExit"). + Error("Bookkeeping UpdateEnvExit error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "DONE" { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") + } else { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") + } + } + stack["UpdateEnvGoError"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvGoError call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvGoError impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvGoError"). + Error("Bookkeeping UpdateEnvGoError error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "ERROR" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") + } + } + stack["UpdateEnvRecover"] = func() (out string) { + var err error + callFailedStr := "Bookkeeping UpdateEnvRecover call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvRecover impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnvRecover"). + Error("Bookkeeping UpdateEnvRecover error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + parsedEnvId, err := uid.FromString(envId) + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + envState := env.CurrentState() + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") } } From 6854ea98cedd5732862c4dedc3e12ac2205cc94b Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 4 May 2022 15:09:10 +0200 Subject: [PATCH 1226/2352] [core] Bookkeeping plugin handles errors for better debugging, and handles the DESTROY hook. --- core/integration/bookkeeping/api.go | 118 +++++++++-- core/integration/bookkeeping/plugin.go | 274 ++++++------------------- 2 files changed, 162 insertions(+), 230 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 23c213fc5..ae00f12ea 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -80,11 +80,23 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) - log.WithField("runType", runType). - WithField("partition", activityId). - WithField("runNumber", runNumber). - Debug("CreateRun call done") + arrayResponse, response, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) + if err != nil || arrayResponse.Data.RunNumber != runNumber { + log.WithError(err). + WithField("runType", runType). + WithField("partition", activityId). + WithField("runNumber", runNumber). + WithField("response", arrayResponse.Data.RunNumber). + WithField("httpresponse", response.Status). + WithField("call", "CreateRun"). + Error("Bookkeeping API CreateRun error") + } else { + log.WithField("runType", runType). + WithField("partition", activityId). + WithField("runNumber", runNumber). + WithField("httpresponse", response.Status). + Debug("CreateRun call successful") + } } func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { @@ -101,26 +113,68 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) - log.WithField("runNumber", runNumber). - Debug("UpdateRun call done") + arrayResponse, response, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) + if err != nil || arrayResponse.Data.RunNumber != runNumber { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("response", arrayResponse.Data.RunNumber). + WithField("httpresponse", response.Status). + WithField("call", "UpdateRun"). + Error("Bookkeeping API UpdateRun error") + } else { + log.WithField("runNumber", runNumber). + WithField("httpresponse", response.Status). + Debug("UpdateRun call successful") + } } func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { - clientAPI.CreateLog(text, title, runNumbers, parentLogId) - log.Debug("CreateLog call done") + arrayResponse, response, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) + if err != nil || arrayResponse.Data.Title != title { + log.WithError(err). + WithField("title", title). + WithField("response", arrayResponse.Data.Title). + WithField("httpresponse", response.Status). + WithField("call", "CreateLog"). + Error("Bookkeeping API CreateLog error") + } else { + log.WithField("title", title). + WithField("httpresponse", response.Status). + Debug("CreateLog call successful") + } } func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { - clientAPI.CreateFlp(name, hostName, runNumber) - log.WithField("runNumber", runNumber). - Debug("CreateFlp call done") + arrayResponse, response, err := clientAPI.CreateFlp(name, hostName, runNumber) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("response", arrayResponse.Data.Title). + WithField("httpresponse", response.Status). + WithField("call", "CreateFlp"). + Error("Bookkeeping API CreateFlp error") + } else { + log.WithField("runNumber", runNumber). + WithField("httpresponse", response.Status). + Debug("CreateFlp call successful") + } } func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { - clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) - log.WithField("runNumber", runNumber). - Debug("UpdateFlp call done") + arrayResponse, response, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) + if err != nil || arrayResponse.Data.Name != name { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("name", name). + WithField("response", arrayResponse.Data.Name). + WithField("httpresponse", response.Status). + WithField("call", "UpdateFlp"). + Error("Bookkeeping API UpdateFlp error") + } else { + log.WithField("runNumber", runNumber). + WithField("httpresponse", response.Status). + Debug("UpdateFlp call successful") + } } func (bk *BookkeepingWrapper) GetLogs() { @@ -134,13 +188,33 @@ func (bk *BookkeepingWrapper) GetRuns() { } func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) { - clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) - log.WithField("environment", envId). - Debug("CreateEnvironment call done") + arrayResponse, response, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) + if err != nil || arrayResponse.Data.Id != envId { + log.WithError(err). + WithField("environment", envId). + WithField("response", arrayResponse.Data.Id). + WithField("httpresponse", response.Status). + WithField("call", "CreateEnvironment"). + Error("Bookkeeping API CreateEnvironment error") + } else { + log.WithField("environment", envId). + WithField("httpresponse", response.Status). + Debug("CreateEnvironment call successful") + } } func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) { - clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) - log.WithField("environment", envId). - Debug("UpdateEnvironment call done") + arrayResponse, response, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) + if err != nil || arrayResponse.Data.Id != envId { + log.WithError(err). + WithField("environment", envId). + WithField("response", arrayResponse.Data.Id). + WithField("httpresponse", response.Status). + WithField("call", "UpdateEnvironment"). + Error("Bookkeeping API UpdateEnvironment error") + } else { + log.WithField("environment", envId). + WithField("httpresponse", response.Status). + Debug("UpdateEnvironment call successful") + } } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index aef2bc259..aeeeda6c7 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -298,8 +298,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envMan := environment.ManagerInstance() env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() - if envState == "STANDBY" { - p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in STANDBY state after creation") + if envState == "STANDBY" || envState == "DEPLOYED" { + p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in "+envState+" state after creation") } else { p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after creation") } @@ -309,19 +309,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.bookkeepingClient.UpdateEnvironment(envId, toredownAt, status, statusMessage) return } - stack["UpdateDeployEnv"] = func() (out string) { + stack["UpdateEnv"] = func() (out string) { var err error - callFailedStr := "Bookkeeping UpdateDeployEnv call failed" + callFailedStr := "Bookkeeping UpdateEnv call failed" if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateDeployEnv impossible") + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnv impossible") log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("partition", envId). - WithField("call", "UpdateDeployEnv"). - Error("Bookkeeping UpdateDeployEnv error") + WithField("call", "UpdateEnv"). + Error("Bookkeeping UpdateEnv error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -329,63 +329,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") - } - } - stack["UpdateEnvConfigure"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvConfigure call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvConfigure impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvConfigure"). - Error("Bookkeeping UpdateEnvConfigure error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") - } - } - stack["UpdateEnvReset"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvReset call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvReset impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + trigger, ok := varStack["__call_trigger"] + if !ok { + log.WithField("call", call). WithField("partition", envId). - WithField("call", "UpdateEnvReset"). - Error("Bookkeeping UpdateEnvReset error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - + Error("cannot acquire trigger from varStack in UpdateEnv") return } @@ -393,161 +341,71 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envMan := environment.ManagerInstance() env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") - } - } - stack["UpdateEnvStart"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvStart call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvStart impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvStart"). - Error("Bookkeeping UpdateEnvStart error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return + if strings.Contains(trigger, "DESTROY") { + envState = "DESTROYED" + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "the environment is DESTROYED after DESTROY transition") } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "RUNNING" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") - } - } - stack["UpdateEnvStop"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvStop call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvStop impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvStop"). - Error("Bookkeeping UpdateEnvStop error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return + if strings.Contains(trigger, "DEPLOY") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") + } } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") + if strings.Contains(trigger, "CONFIGURE") { + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") + } } - } - stack["UpdateEnvExit"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvStop call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvExit impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvExit"). - Error("Bookkeeping UpdateEnvExit error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return + if strings.Contains(trigger, "RESET") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") + } } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "DONE" { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") - } else { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") + if strings.Contains(trigger, "START_ACTIVITY") { + if envState == "RUNNING" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") + } } - } - stack["UpdateEnvGoError"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvGoError call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvGoError impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvGoError"). - Error("Bookkeeping UpdateEnvGoError error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return + if strings.Contains(trigger, "STOP_ACTIVITY") { + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") + } } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "ERROR" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") + if strings.Contains(trigger, "EXIT") { + if envState == "DONE" { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") + } else { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") + } } - } - stack["UpdateEnvRecover"] = func() (out string) { - var err error - callFailedStr := "Bookkeeping UpdateEnvRecover call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnvRecover impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnvRecover"). - Error("Bookkeeping UpdateEnvRecover error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return + if strings.Contains(trigger, "GO_ERROR") { + if envState == "ERROR" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") + } } - - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - envState := env.CurrentState() - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") + if strings.Contains(trigger, "RECOVER") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") + } } + log.WithField("partition", envId). + WithField("call", call). + Error("could not obtain transition in UpdateEnv from trigger: ", trigger) + return } return From bd27e9f1a3578832185ce53e9dec25393d588a0a Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 4 May 2022 18:15:33 +0200 Subject: [PATCH 1227/2352] [core] Bookkeeping plugin handles the errors from CreateFlp after reponse type correction. --- core/integration/bookkeeping/api.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index ae00f12ea..d03d6f97f 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -146,10 +146,11 @@ func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers st func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { arrayResponse, response, err := clientAPI.CreateFlp(name, hostName, runNumber) - if err != nil { + if err != nil || arrayResponse.Data.Name != name { log.WithError(err). WithField("runNumber", runNumber). - WithField("response", arrayResponse.Data.Title). + WithField("name", name). + WithField("response", arrayResponse.Data.Name). WithField("httpresponse", response.Status). WithField("call", "CreateFlp"). Error("Bookkeeping API CreateFlp error") From bdc3704b52fe1a5b97fe023ccbd55e4ba4255740 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 5 May 2022 11:59:58 +0200 Subject: [PATCH 1228/2352] [core][OCTRL-621] Making sure CreateLog is called from Bookkeeping plugin. --- core/integration/bookkeeping/api.go | 16 +++++++++------- core/integration/bookkeeping/plugin.go | 4 ++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index d03d6f97f..7c748880a 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -81,7 +81,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns } arrayResponse, response, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) - if err != nil || arrayResponse.Data.RunNumber != runNumber { + if err != nil { log.WithError(err). WithField("runType", runType). WithField("partition", activityId). @@ -114,7 +114,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } arrayResponse, response, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) - if err != nil || arrayResponse.Data.RunNumber != runNumber { + if err != nil { log.WithError(err). WithField("runNumber", runNumber). WithField("response", arrayResponse.Data.RunNumber). @@ -129,8 +129,10 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { + log.WithField("title", title). + Debug("CreateLog call successful") arrayResponse, response, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) - if err != nil || arrayResponse.Data.Title != title { + if err != nil { log.WithError(err). WithField("title", title). WithField("response", arrayResponse.Data.Title). @@ -146,7 +148,7 @@ func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers st func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { arrayResponse, response, err := clientAPI.CreateFlp(name, hostName, runNumber) - if err != nil || arrayResponse.Data.Name != name { + if err != nil { log.WithError(err). WithField("runNumber", runNumber). WithField("name", name). @@ -163,7 +165,7 @@ func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { arrayResponse, response, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) - if err != nil || arrayResponse.Data.Name != name { + if err != nil { log.WithError(err). WithField("runNumber", runNumber). WithField("name", name). @@ -190,7 +192,7 @@ func (bk *BookkeepingWrapper) GetRuns() { func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) { arrayResponse, response, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) - if err != nil || arrayResponse.Data.Id != envId { + if err != nil { log.WithError(err). WithField("environment", envId). WithField("response", arrayResponse.Data.Id). @@ -206,7 +208,7 @@ func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Tim func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) { arrayResponse, response, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) - if err != nil || arrayResponse.Data.Id != envId { + if err != nil { log.WithError(err). WithField("environment", envId). WithField("response", arrayResponse.Data.Id). diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index aeeeda6c7..c1a7c3ef2 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -178,6 +178,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) } + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("runNumber", runNumber64). + Infof("performing Bookkeeping CreateLog") p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) return } From 998bcb91507c3b8756eb025565cd8c2e8e299694 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 5 May 2022 15:47:27 +0200 Subject: [PATCH 1229/2352] [core][OCTRL-621] Bookkeeping plugin now handles Bookkeeping API errors correctly. --- core/integration/bookkeeping/api.go | 72 ++++++----------- core/integration/bookkeeping/plugin.go | 104 +++++++++++++++++++++---- 2 files changed, 113 insertions(+), 63 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 7c748880a..752e3641f 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) error { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,26 +80,12 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - arrayResponse, response, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) - if err != nil { - log.WithError(err). - WithField("runType", runType). - WithField("partition", activityId). - WithField("runNumber", runNumber). - WithField("response", arrayResponse.Data.RunNumber). - WithField("httpresponse", response.Status). - WithField("call", "CreateRun"). - Error("Bookkeeping API CreateRun error") - } else { - log.WithField("runType", runType). - WithField("partition", activityId). - WithField("runNumber", runNumber). - WithField("httpresponse", response.Status). - Debug("CreateRun call successful") - } + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) + + return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -113,71 +99,61 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - arrayResponse, response, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) if err != nil { log.WithError(err). WithField("runNumber", runNumber). - WithField("response", arrayResponse.Data.RunNumber). - WithField("httpresponse", response.Status). WithField("call", "UpdateRun"). Error("Bookkeeping API UpdateRun error") } else { log.WithField("runNumber", runNumber). - WithField("httpresponse", response.Status). Debug("UpdateRun call successful") } + return err } -func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) { - log.WithField("title", title). - Debug("CreateLog call successful") - arrayResponse, response, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) +func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) error { + _, _, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) if err != nil { log.WithError(err). WithField("title", title). - WithField("response", arrayResponse.Data.Title). - WithField("httpresponse", response.Status). WithField("call", "CreateLog"). Error("Bookkeeping API CreateLog error") } else { log.WithField("title", title). - WithField("httpresponse", response.Status). Debug("CreateLog call successful") } + return err } -func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) { - arrayResponse, response, err := clientAPI.CreateFlp(name, hostName, runNumber) +func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) error { + _, _, err := clientAPI.CreateFlp(name, hostName, runNumber) if err != nil { log.WithError(err). WithField("runNumber", runNumber). WithField("name", name). - WithField("response", arrayResponse.Data.Name). - WithField("httpresponse", response.Status). WithField("call", "CreateFlp"). Error("Bookkeeping API CreateFlp error") } else { log.WithField("runNumber", runNumber). - WithField("httpresponse", response.Status). Debug("CreateFlp call successful") } + return err } -func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) { - arrayResponse, response, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) +func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) error { + _, _, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) if err != nil { log.WithError(err). WithField("runNumber", runNumber). WithField("name", name). - WithField("response", arrayResponse.Data.Name). - WithField("httpresponse", response.Status). WithField("call", "UpdateFlp"). Error("Bookkeeping API UpdateFlp error") } else { log.WithField("runNumber", runNumber). - WithField("httpresponse", response.Status). Debug("UpdateFlp call successful") } + return err } func (bk *BookkeepingWrapper) GetLogs() { @@ -190,34 +166,30 @@ func (bk *BookkeepingWrapper) GetRuns() { log.Debug("GetRuns call done") } -func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) { - arrayResponse, response, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) +func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) error { + _, _, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) if err != nil { log.WithError(err). WithField("environment", envId). - WithField("response", arrayResponse.Data.Id). - WithField("httpresponse", response.Status). WithField("call", "CreateEnvironment"). Error("Bookkeeping API CreateEnvironment error") } else { log.WithField("environment", envId). - WithField("httpresponse", response.Status). Debug("CreateEnvironment call successful") } + return err } -func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) { - arrayResponse, response, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) +func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) error { + _, _, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) if err != nil { log.WithError(err). WithField("environment", envId). - WithField("response", arrayResponse.Data.Id). - WithField("httpresponse", response.Status). WithField("call", "UpdateEnvironment"). Error("Bookkeeping API UpdateEnvironment error") } else { log.WithField("environment", envId). - WithField("httpresponse", response.Status). Debug("UpdateEnvironment call successful") } + return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index c1a7c3ef2..e375297f2 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -123,7 +123,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) // Run related Bookkeeping functions - stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing + stack["StartOfRun"] = func() (out string) { var err error callFailedStr := "Bookkeeping StartOfRun call failed" @@ -172,21 +172,74 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { odc_topology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateRun"). + Error("Bookkeeping API CreateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateRun call successful") + } for _, flp := range flps { - p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) + err = p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) + if err != nil { + log.WithError(err). + WithField("flp", flp). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateFlp"). + Error("Bookkeeping API CreateFlp error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } } + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateFlp call successful") - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). - Infof("performing Bookkeeping CreateLog") - p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) + err = p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateLog"). + Error("Bookkeeping API CreateLog error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateLog call successful") + } return } - updateRunFunc := func(runNumber64 int64, state string) (out string) { // must formally return string even when we return nothing - p.bookkeepingClient.UpdateRun(int32(runNumber64), state, time.Now(), time.Now()) + updateRunFunc := func(runNumber64 int64, state string) (out string) { + callFailedStr := "Bookkeeping UpdateRun call failed" + err := p.bookkeepingClient.UpdateRun(int32(runNumber64), state, time.Now(), time.Now()) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("Bookkeeping API UpdateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + Debug("UpdateRun call successful") + } return } stack["UpdateRunStart"] = func() (out string) { @@ -303,14 +356,39 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState == "STANDBY" || envState == "DEPLOYED" { - p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in "+envState+" state after creation") + err = p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in "+envState+" state after creation") } else { - p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after creation") + err = p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after creation") + } + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("call", "CreateEnvironment"). + Error("Bookkeeping API CreateEnvironment error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + log.WithField("partition", envId). + Debug("CreateEnvironment call successful") } return } updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { - p.bookkeepingClient.UpdateEnvironment(envId, toredownAt, status, statusMessage) + callFailedStr := "Bookkeeping UpdateEnv call failed" + err := p.bookkeepingClient.UpdateEnvironment(envId, toredownAt, status, statusMessage) + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("call", "UpdateEnvironment"). + Error("Bookkeeping API UpdateEnvironment error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + log.WithField("partition", envId). + Debug("UpdateEnvironment call successful") + } return } stack["UpdateEnv"] = func() (out string) { From bf2e447c46068747ee00b95eabcb83fb5d95759e Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 6 May 2022 11:23:30 +0200 Subject: [PATCH 1230/2352] [core][OCTRL-621] Bookkeeping plugin handles errors correctly. --- core/integration/bookkeeping/api.go | 56 -------------------------- core/integration/bookkeeping/plugin.go | 54 +++++++++++-------------- 2 files changed, 23 insertions(+), 87 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 752e3641f..529277d91 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -100,59 +100,21 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("call", "UpdateRun"). - Error("Bookkeeping API UpdateRun error") - } else { - log.WithField("runNumber", runNumber). - Debug("UpdateRun call successful") - } return err } func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) error { _, _, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) - if err != nil { - log.WithError(err). - WithField("title", title). - WithField("call", "CreateLog"). - Error("Bookkeeping API CreateLog error") - } else { - log.WithField("title", title). - Debug("CreateLog call successful") - } return err } func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) error { _, _, err := clientAPI.CreateFlp(name, hostName, runNumber) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("name", name). - WithField("call", "CreateFlp"). - Error("Bookkeeping API CreateFlp error") - } else { - log.WithField("runNumber", runNumber). - Debug("CreateFlp call successful") - } return err } func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) error { _, _, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("name", name). - WithField("call", "UpdateFlp"). - Error("Bookkeeping API UpdateFlp error") - } else { - log.WithField("runNumber", runNumber). - Debug("UpdateFlp call successful") - } return err } @@ -168,28 +130,10 @@ func (bk *BookkeepingWrapper) GetRuns() { func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) error { _, _, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) - if err != nil { - log.WithError(err). - WithField("environment", envId). - WithField("call", "CreateEnvironment"). - Error("Bookkeeping API CreateEnvironment error") - } else { - log.WithField("environment", envId). - Debug("CreateEnvironment call successful") - } return err } func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) error { _, _, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) - if err != nil { - log.WithError(err). - WithField("environment", envId). - WithField("call", "UpdateEnvironment"). - Error("Bookkeeping API UpdateEnvironment error") - } else { - log.WithField("environment", envId). - Debug("UpdateEnvironment call successful") - } return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e375297f2..b820337a5 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -120,6 +120,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.Error("cannot acquire environment ID") return } + var err error + parsedEnvId, err := uid.FromString(envId) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot parse environment ID") + return + } + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire environment from parsed environment ID") + return + } stack = make(map[string]interface{}) // Run related Bookkeeping functions @@ -136,11 +152,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for Bookkeeping SOR") } - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). - Infof("performing Bookkeeping SOR") - if p.bookkeepingClient == nil { err = fmt.Errorf("Bookkeeping plugin not initialized, StartOfRun impossible") @@ -158,9 +169,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) runNumber := env.GetCurrentRunNumber() rnString := strconv.FormatUint(uint64(runNumber), 10) @@ -182,6 +190,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } else { log.WithField("runNumber", runNumber). WithField("partition", envId). @@ -200,11 +209,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } } log.WithField("runNumber", runNumber). WithField("partition", envId). - Debug("CreateFlp call successful") + Debug("CreateFlp call done") err = p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) if err != nil { @@ -216,6 +226,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } else { log.WithField("runNumber", runNumber). WithField("partition", envId). @@ -235,6 +246,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } else { log.WithField("runNumber", runNumber64). WithField("partition", envId). @@ -254,11 +266,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for Bookkeeping UpdateRunStart") } - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). - Infof("performing Bookkeeping UpdateRunStart") - if p.bookkeepingClient == nil { err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStart impossible") @@ -276,9 +283,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState != "RUNNING" { return updateRunFunc(runNumber64, "bad") @@ -298,11 +302,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for Bookkeeping UpdateRunStop") } - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). - Infof("performing Bookkeeping UpdateRunStop") - if p.bookkeepingClient == nil { err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStop impossible") @@ -320,9 +319,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState != "CONFIGURED" { return updateRunFunc(runNumber64, "bad") @@ -351,9 +347,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if envState == "STANDBY" || envState == "DEPLOYED" { err = p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in "+envState+" state after creation") @@ -368,6 +361,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } else { log.WithField("partition", envId). Debug("CreateEnvironment call successful") @@ -385,6 +379,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + return } else { log.WithField("partition", envId). Debug("UpdateEnvironment call successful") @@ -419,9 +414,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - parsedEnvId, err := uid.FromString(envId) - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) envState := env.CurrentState() if strings.Contains(trigger, "DESTROY") { From 5a15adf252329b8dfe98fdd996affe4818471653 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 May 2022 12:18:58 +0200 Subject: [PATCH 1231/2352] [build] Bump Bookkeeping package and related dependencies --- go.mod | 15 ++++++++------- go.sum | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index a5c26af0b..6cf0eee1e 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.11 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18 + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -107,7 +107,7 @@ require ( github.com/rs/xid v1.2.1 github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/segmentio/kafka-go v0.4.31 // indirect - github.com/sirupsen/logrus v1.7.0 + github.com/sirupsen/logrus v1.8.1 github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.5.1 // indirect github.com/spf13/cast v1.3.1 // indirect @@ -130,14 +130,15 @@ require ( go.etcd.io/bbolt v1.3.4 // indirect go.opencensus.io v0.22.6 // indirect go.uber.org/zap v1.14.1 // indirect - golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad + golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect golang.org/x/mod v0.4.2 // indirect - golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 - golang.org/x/sys v0.0.0-20210510120138-977fb7262007 - golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf // indirect + golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect + golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 + golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect google.golang.org/api v0.39.0 // indirect google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect diff --git a/go.sum b/go.sum index 8fa2086fc..0db2e6d3a 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,10 @@ github.com/AliceO2Group/Bookkeeping v0.17.7 h1:22Mb6Hdp9tZ3z8QeAjm81S4HiLaNLBVZ5 github.com/AliceO2Group/Bookkeeping v0.17.7/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.11 h1:Ktmua360dZEaLSbD4z1pfXVGnVa7x6b8hKsog+PLH50= github.com/AliceO2Group/Bookkeeping v0.17.11/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.12 h1:ZyV2aDM348nvtQDiI/5H5cart9B4dHvFbcf4C2OEcTw= +github.com/AliceO2Group/Bookkeeping v0.17.12/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 h1:a3CKsuyQtuiIT5e89at/rp+OgZK/1PvI5PjMVot67tY= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= @@ -103,6 +107,10 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559ae github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18 h1:f20KwRKWuJgZtXDrTvKUreQLACfDeqmpwLi/xD45b3g= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d9725 h1:g+Q7GFhMF6ohdHOuPlGTYaOQYbqzHvrHQ7bG3xjjPoE= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d9725/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459 h1:cS+ZX4ZVvDfKcBtHne25XJFLksfnpyJMcT4nDYQXEqk= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= @@ -947,6 +955,8 @@ github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= +github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= @@ -1127,6 +1137,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= +golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -1239,6 +1251,10 @@ golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= @@ -1254,6 +1270,8 @@ golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd h1:2arJsLyTCJGek+eeptQ3z4 golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1347,11 +1365,18 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZOR golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= +golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1363,6 +1388,9 @@ golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= From 793f2e7ebf6ad0ab70e1883a75ce06ac5437732c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 May 2022 12:47:04 +0200 Subject: [PATCH 1232/2352] [build] Bump AliECS to v0.41.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4ccae7ee2..b4cdcf26c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 40 -VERSION_PATCH := 1 +VERSION_MINOR := 41 +VERSION_PATCH := 0 From 3d44398e315777fb09ad821914d9ec109fdca0a7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 6 May 2022 19:16:02 +0200 Subject: [PATCH 1233/2352] [core] Disable ODC topology fullname output --- core/integration/odc/plugin.go | 37 ++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 801eadebe..bd15eead1 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -657,23 +657,26 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } odcTopologyFullname = "(xml, " + odc_topology + ")" } - parsedEnvId, err := uid.FromString(envId) - if err != nil { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse environment ID") - return - } - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - if err != nil { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire environment from parsed environment ID") - return - } - - env.Workflow().SetRuntimeVar("odc_topology_fullname", odcTopologyFullname) + + log.Debugf("ODC topology pretty name: %s", odcTopologyFullname) + //FIXME: Disabled because env does not exist yet when GenerateEPNWorkflowScript is called + //parsedEnvId, err := uid.FromString(envId) + //if err != nil { + // log.WithField("partition", envId). + // WithField("call", "GenerateEPNWorkflowScript"). + // Error("cannot parse environment ID") + // return + //} + //envMan := environment.ManagerInstance() + //env, err := envMan.Environment(parsedEnvId) + //if err != nil { + // log.WithField("partition", envId). + // WithField("call", "GenerateEPNWorkflowScript"). + // Error("cannot acquire environment from parsed environment ID") + // return + //} + // + //env.Workflow().SetRuntimeVar("odc_topology_fullname", odcTopologyFullname) out = strings.Join(accumulator, " ") return From cc11b04548efc4a4f5eab3114ff123cb45401edb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 6 May 2022 19:18:16 +0200 Subject: [PATCH 1234/2352] [core] Obsolete import is obsolete --- core/integration/odc/plugin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index bd15eead1..6da598e04 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -30,7 +30,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/AliceO2Group/Control/core/environment" "net/url" "strconv" "strings" From 0e147a58164132bc7449a667d90b5628803ca9b3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 12:54:28 +0200 Subject: [PATCH 1235/2352] [core] Add GetRootRole and SetGlobalVar to workflow & refactor callable --- core/integration/odc/plugin.go | 2 +- core/workflow/callable/call.go | 148 +++------------------------ core/workflow/callable/hook.go | 56 ++++++++++ core/workflow/callable/maps.go | 61 +++++++++++ core/workflow/callable/parentrole.go | 44 ++++++++ core/workflow/callable/utils.go | 56 ++++++++++ core/workflow/iteratorrole.go | 16 ++- core/workflow/role.go | 1 + core/workflow/rolebase.go | 91 +++++++++++----- 9 files changed, 310 insertions(+), 165 deletions(-) create mode 100644 core/workflow/callable/hook.go create mode 100644 core/workflow/callable/maps.go create mode 100644 core/workflow/callable/parentrole.go create mode 100644 core/workflow/callable/utils.go diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 6da598e04..9d72df614 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -656,7 +656,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } odcTopologyFullname = "(xml, " + odc_topology + ")" } - + log.Debugf("ODC topology pretty name: %s", odcTopologyFullname) //FIXME: Disabled because env does not exist yet when GenerateEPNWorkflowScript is called //parsedEnvId, err := uid.FromString(envId) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 3f7c03cfb..5e0742fc8 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2021-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -27,19 +27,15 @@ package callable import ( "errors" "fmt" - "sort" "strconv" - "strings" "sync" texttemplate "text/template" "time" "github.com/AliceO2Group/Control/apricot" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/task" @@ -48,19 +44,6 @@ import ( var log = logger.New(logrus.StandardLogger(), "callable") -type HookWeight int -type Calls []*Call -type Hooks []Hook -type HooksMap map[HookWeight]Hooks -type CallsMap map[HookWeight]Calls - -type Hook interface { - GetParentRole() interface{} - GetParentRolePath() string - GetName() string - GetTraits() task.Traits -} - type Call struct { Func string Return string @@ -71,80 +54,16 @@ type Call struct { await chan error } -func ParseTriggerExpression(triggerExpr string) (triggerName string, triggerWeight HookWeight) { - var ( - triggerWeightS string - triggerWeightI int - err error - ) - - // Split the trigger expression of this task by + or - - if splitIndex := strings.LastIndexFunc(triggerExpr, func(r rune) bool { - return r == '+' || r == '-' - }); splitIndex >= 0 { - triggerName, triggerWeightS = triggerExpr[:splitIndex], triggerExpr[splitIndex:] - } else { - triggerName, triggerWeightS = triggerExpr, "+0" - } - - triggerWeightI, err = strconv.Atoi(triggerWeightS) - if err != nil { - log.Warnf("invalid trigger weight definition %s, defaulting to %s", triggerExpr, triggerName + "+0") - triggerWeightI = 0 - } - triggerWeight = HookWeight(triggerWeightI) - - return -} - -func (m HooksMap) GetWeights() []HookWeight { - weights := make([]int, len(m)) - i := 0 - for k, _ := range m { - weights[i] = int(k) - i++ - } - sort.Ints(weights) - out := make([]HookWeight, len(weights)) - for i, v := range weights{ - out[i] = HookWeight(v) - } - return out -} - -func (m CallsMap) GetWeights() []HookWeight { - weights := make([]int, len(m)) - i := 0 - for k, _ := range m { - weights[i] = int(k) - i++ - } - sort.Ints(weights) - out := make([]HookWeight, len(weights)) - for i, v := range weights{ - out[i] = HookWeight(v) - } - return out -} - -func (s Hooks) FilterCalls() (calls Calls) { - calls = make(Calls, 0) - for _, v := range s { - if c, ok := v.(*Call); ok { - calls = append(calls, c) - } - } - return -} +type Calls []*Call -func (s Hooks) FilterTasks() (tasks task.Tasks) { - tasks = make(task.Tasks, 0) - for _, v := range s { - if t, ok := v.(*task.Task); ok { - tasks = append(tasks, t) - } +func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { + return &Call{ + Func: funcCall, + Return: returnVar, + VarStack: varStack, + Traits: parent.GetTaskTraits(), + parentRole: parent, } - return } func (s Calls) CallAll() map[*Call]error { @@ -182,16 +101,6 @@ func (s Calls) AwaitAll() map[*Call]error { return errors } -func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { - return &Call{ - Func: funcCall, - Return: returnVar, - VarStack: varStack, - Traits: parent.GetTaskTraits(), - parentRole: parent, - } -} - func (c *Call) Call() error { log.WithField("trigger", c.Traits.Trigger). WithField("await", c.Traits.Await). @@ -201,9 +110,9 @@ func (c *Call) Call() error { output := "{{" + c.Func + "}}" returnVar := c.Return fields := template.Fields{ - template.WrapPointer(&output), - template.WrapPointer(&returnVar), - } + template.WrapPointer(&output), + template.WrapPointer(&returnVar), + } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() c.VarStack["__call_func"] = c.Func c.VarStack["__call_timeout"] = c.Traits.Timeout @@ -261,36 +170,3 @@ func (c *Call) GetName() string { func (c *Call) GetTraits() task.Traits { return c.Traits } - -type ParentRole interface { - GetPath() string - GetTaskTraits() task.Traits - GetEnvironmentId() uid.ID - ConsolidatedVarStack() (varStack map[string]string, err error) - SendEvent(event.Event) - SetRuntimeVar(key string, value string) - GetCurrentRunNumber() uint32 -} - -func AcquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { - timeout := defaultTimeout - timeoutStr, ok := varStack["__call_timeout"] // the Call interface ensures we'll find this key - // see Call.Call in callable/call.go for details - if ok { - var err error - timeout, err = time.ParseDuration(timeoutStr) - if err != nil { - timeout = defaultTimeout - log.WithField("partition", envId). - WithField("call", callName). - WithField("default", timeout.String()). - Warn("could not parse timeout declaration for hook call") - } - } else { - log.WithField("partition", envId). - WithField("call", callName). - WithField("default", timeout.String()). - Warn("could not get timeout declaration for hook call") - } - return timeout -} \ No newline at end of file diff --git a/core/workflow/callable/hook.go b/core/workflow/callable/hook.go new file mode 100644 index 000000000..917fd23af --- /dev/null +++ b/core/workflow/callable/hook.go @@ -0,0 +1,56 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package callable + +import "github.com/AliceO2Group/Control/core/task" + +type Hook interface { + GetParentRole() interface{} + GetParentRolePath() string + GetName() string + GetTraits() task.Traits +} + +type Hooks []Hook + +func (s Hooks) FilterCalls() (calls Calls) { + calls = make(Calls, 0) + for _, v := range s { + if c, ok := v.(*Call); ok { + calls = append(calls, c) + } + } + return +} + +func (s Hooks) FilterTasks() (tasks task.Tasks) { + tasks = make(task.Tasks, 0) + for _, v := range s { + if t, ok := v.(*task.Task); ok { + tasks = append(tasks, t) + } + } + return +} diff --git a/core/workflow/callable/maps.go b/core/workflow/callable/maps.go new file mode 100644 index 000000000..694480086 --- /dev/null +++ b/core/workflow/callable/maps.go @@ -0,0 +1,61 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package callable + +import "sort" + +type HooksMap map[HookWeight]Hooks +type CallsMap map[HookWeight]Calls +type HookWeight int + +func (m HooksMap) GetWeights() []HookWeight { + weights := make([]int, len(m)) + i := 0 + for k, _ := range m { + weights[i] = int(k) + i++ + } + sort.Ints(weights) + out := make([]HookWeight, len(weights)) + for i, v := range weights { + out[i] = HookWeight(v) + } + return out +} + +func (m CallsMap) GetWeights() []HookWeight { + weights := make([]int, len(m)) + i := 0 + for k, _ := range m { + weights[i] = int(k) + i++ + } + sort.Ints(weights) + out := make([]HookWeight, len(weights)) + for i, v := range weights { + out[i] = HookWeight(v) + } + return out +} diff --git a/core/workflow/callable/parentrole.go b/core/workflow/callable/parentrole.go new file mode 100644 index 000000000..67a2d408c --- /dev/null +++ b/core/workflow/callable/parentrole.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package callable + +import ( + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/task" +) + +type ParentRole interface { + GetPath() string + GetTaskTraits() task.Traits + GetEnvironmentId() uid.ID + ConsolidatedVarStack() (varStack map[string]string, err error) + SendEvent(event.Event) + SetRuntimeVar(key string, value string) + SetRuntimeVars(kv map[string]string) + SetGlobalRuntimeVar(key string, value string) + SetGlobalRuntimeVars(kv map[string]string) + GetCurrentRunNumber() uint32 +} diff --git a/core/workflow/callable/utils.go b/core/workflow/callable/utils.go new file mode 100644 index 000000000..df2eae902 --- /dev/null +++ b/core/workflow/callable/utils.go @@ -0,0 +1,56 @@ +package callable + +import ( + "strconv" + "strings" + "time" +) + +func AcquireTimeout(defaultTimeout time.Duration, varStack map[string]string, callName string, envId string) time.Duration { + timeout := defaultTimeout + timeoutStr, ok := varStack["__call_timeout"] // the Call interface ensures we'll find this key + // see Call.Call in callable/call.go for details + if ok { + var err error + timeout, err = time.ParseDuration(timeoutStr) + if err != nil { + timeout = defaultTimeout + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not parse timeout declaration for hook call") + } + } else { + log.WithField("partition", envId). + WithField("call", callName). + WithField("default", timeout.String()). + Warn("could not get timeout declaration for hook call") + } + return timeout +} + +func ParseTriggerExpression(triggerExpr string) (triggerName string, triggerWeight HookWeight) { + var ( + triggerWeightS string + triggerWeightI int + err error + ) + + // Split the trigger expression of this task by + or - + if splitIndex := strings.LastIndexFunc(triggerExpr, func(r rune) bool { + return r == '+' || r == '-' + }); splitIndex >= 0 { + triggerName, triggerWeightS = triggerExpr[:splitIndex], triggerExpr[splitIndex:] + } else { + triggerName, triggerWeightS = triggerExpr, "+0" + } + + triggerWeightI, err = strconv.Atoi(triggerWeightS) + if err != nil { + log.Warnf("invalid trigger weight definition %s, defaulting to %s", triggerExpr, triggerName+"+0") + triggerWeightI = 0 + } + triggerWeight = HookWeight(triggerWeightI) + + return +} diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 07fbf2b4d..b64d8b523 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" @@ -56,10 +57,10 @@ func (i *iteratorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err err } type _iteratorRangeUnion struct { - Begin *string `yaml:"begin"` - End *string `yaml:"end"` - Var *string `yaml:"var"` - Range *string `yaml:"range"` + Begin *string `yaml:"begin"` + End *string `yaml:"end"` + Var *string `yaml:"var"` + Range *string `yaml:"range"` } auxForUnion := struct { For _iteratorRangeUnion `yaml:"for"` @@ -240,6 +241,13 @@ func (i *iteratorRole) GetParentRole() Role { return i.template.GetParentRole() } +func (i *iteratorRole) GetRootRole() Role { + if i == nil || i.template == nil { + return nil + } + return i.template.GetRootRole() +} + func (i *iteratorRole) GetName() string { if i == nil || i.template == nil { return "" diff --git a/core/workflow/role.go b/core/workflow/role.go index 93b57e354..e93f683db 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -45,6 +45,7 @@ type Role interface { VarNode GetParent() Updatable GetParentRole() Role + GetRootRole() Role GetRoles() []Role GetPath() string GetName() string diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 7a72292ca..8ab277c2d 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -42,26 +42,25 @@ import ( var log = logger.New(logrus.StandardLogger(), "workflow") -const( - PATH_SEPARATOR = "." +const ( + PATH_SEPARATOR = "." PATH_SEPARATOR_RUNE = '.' ) - type roleBase struct { - Name string `yaml:"name"` + Name string `yaml:"name"` parent Updatable - Connect []channel.Outbound `yaml:"connect,omitempty"` - Constraints constraint.Constraints `yaml:"constraints,omitempty"` + Connect []channel.Outbound `yaml:"connect,omitempty"` + Constraints constraint.Constraints `yaml:"constraints,omitempty"` status SafeStatus state SafeState - Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` - Vars *gera.StringWrapMap `yaml:"vars,omitempty"` - UserVars *gera.StringWrapMap `yaml:"-"` - Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role - Bind []channel.Inbound `yaml:"bind,omitempty"` - Enabled string `yaml:"enabled,omitempty"` + Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` + Vars *gera.StringWrapMap `yaml:"vars,omitempty"` + UserVars *gera.StringWrapMap `yaml:"-"` + Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role + Bind []channel.Inbound `yaml:"bind,omitempty"` + Enabled string `yaml:"enabled,omitempty"` } func (r *roleBase) IsEnabled() bool { @@ -80,6 +79,21 @@ func (r *roleBase) SetRuntimeVars(kv map[string]string) { } } +func (r *roleBase) SetGlobalRuntimeVar(key string, value string) { + root := r.GetRootRole() + if root != nil { + root.SetRuntimeVar(key, value) + } else { + r.SetRuntimeVar(key, value) + } +} + +func (r *roleBase) SetGlobalRuntimeVars(kv map[string]string) { + for k, v := range kv { + r.SetGlobalRuntimeVar(k, v) + } +} + func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error) { // This function is used in task.go to get the parent role's varStack var defaults, vars, userVars map[string]string @@ -178,8 +192,8 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) Vars: nil, UserVars: nil, Locals: make(map[string]string), - status: SafeStatus{status:task.INACTIVE}, - state: SafeState{state:task.STANDBY}, + status: SafeStatus{status: task.INACTIVE}, + state: SafeState{state: task.STANDBY}, Enabled: "true", } err = unmarshal(&role) @@ -202,12 +216,24 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { aux := make(map[string]interface{}) aux["name"] = r.Name - if r.Connect != nil { aux["connect"] = r.Connect } - if r.Constraints != nil { aux["constraints"] = r.Constraints } - if r.Defaults.Raw() != nil { aux["defaults"] = r.Defaults.Raw() } - if r.Vars.Raw() != nil { aux["vars"] = r.Vars.Raw() } - if r.Bind != nil { aux["bind"] = r.Bind } - if r.Enabled != "" { aux["enabled"] = r.Enabled } + if r.Connect != nil { + aux["connect"] = r.Connect + } + if r.Constraints != nil { + aux["constraints"] = r.Constraints + } + if r.Defaults.Raw() != nil { + aux["defaults"] = r.Defaults.Raw() + } + if r.Vars.Raw() != nil { + aux["vars"] = r.Vars.Raw() + } + if r.Bind != nil { + aux["bind"] = r.Bind + } + if r.Enabled != "" { + aux["enabled"] = r.Enabled + } return aux, nil } @@ -310,6 +336,23 @@ func (r *roleBase) GetParentRole() Role { return nil } +func (r *roleBase) GetRootRole() Role { + if r == nil { + return nil + } + + current := r.GetParentRole() + for current != nil { + par := current.GetParentRole() + if par != nil { + current = par + } else { + break + } + } + return current +} + func (r *roleBase) GetName() string { if r == nil { return "" @@ -317,14 +360,14 @@ func (r *roleBase) GetName() string { return r.Name } -func (r* roleBase) GetEnvironmentId() uid.ID { +func (r *roleBase) GetEnvironmentId() uid.ID { if r.parent == nil { return uid.NilID() } return r.parent.GetEnvironmentId() } -func (r* roleBase) SendEvent(ev event.Event) { +func (r *roleBase) SendEvent(ev event.Event) { if r.parent == nil { return } @@ -409,7 +452,7 @@ func (r *roleBase) CollectInboundChannels() (channels []channel.Inbound) { channels = make([]channel.Inbound, 0) } else { channels = channel.MergeInbound(r.Bind, r.parent.CollectInboundChannels()) - } + } return } @@ -421,4 +464,4 @@ func (r *roleBase) GetCurrentRunNumber() uint32 { return 0 } return r.parent.GetCurrentRunNumber() -} \ No newline at end of file +} From a7653780b96b5ca761793545f906779d329227bc Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 9 May 2022 16:22:28 +0200 Subject: [PATCH 1236/2352] Update the documentation about the kafka plugin --- docs/kafka.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/docs/kafka.md b/docs/kafka.md index 091029dc1..76354a030 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -19,11 +19,34 @@ To enable the plugin, one should make sure that the following points are fullfil ## Currently available topics -As for today, AliECS publishes on two types of topics: +As for today, AliECS publishes on the following types of topics: * `aliecs.env_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `ERROR`, `UNKNOWN`. For each topic, AliECS publishes a `NewStateNotification` message when any environment reaches the corresponding state. The `UNKNOWN` state is usually published when an environment gets a `DESTROY` request, but the plugin cannot know what will be the state after the transition. +* `aliecs.env_leave_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `ERROR`. For each topic, AliECS publishes a `NewStateNotification` message when any environment is about to leave the corresponding state. * `aliecs.env_list.` where `state` is only `RUNNING`. Each time there is an environment state change, AliECS publishes an `ActiveRunsList` message which contains a list of all environments which are currently in `RUNNING` state. ## Decoding the messages Messages are encoded with protobuf. Please use [this](../core/integration/kafka/protos/kafka.proto) proto file to generate code which deserializes the messages. + +## Getting Start of Run and End of Run notifications + +To get SOR and EOR notifications, please subscribe to the two corresponding topics: +* `aliecs.env_state.RUNNING` for Start of Run +* `aliecs.env_leave_state.RUNNING` for End of Run + +Both will provide `NewStateNotification` messages encoded with protobuf. Please note that the EOR message will still contain the RUNNING state, because it is sent just before the transition starts. + +## Using Kafka debug tools + +One can use some Kafka command line tools to verify that a given setup works correctly. One should make sure to have Kafka installed on the machine used to run the tools. + +To get a list of topics: +``` +/opt/kafka/kafka_2.12-2.8.1/bin/kafka-topics.sh --bootstrap-server : --list +``` + +To subscribe to a concrete topic: +``` +/opt/kafka/kafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server : --topic aliecs.env_state.RUNNING +``` From 19fe87db6f6c099bf23947df92cf5fcccd7162a9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 9 May 2022 16:24:47 +0200 Subject: [PATCH 1237/2352] Additional comment about kafka debug tools --- docs/kafka.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/kafka.md b/docs/kafka.md index 76354a030..8329d509a 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -50,3 +50,4 @@ To subscribe to a concrete topic: ``` /opt/kafka/kafka_2.12-2.8.1/bin/kafka-console-consumer.sh --bootstrap-server : --topic aliecs.env_state.RUNNING ``` +Please note that Kafka is distributes the messages in the push-pull mode by default. Thus, if you subscribe to messages with a debug tool, you might not see them in another application. From ab26215535a9cbe47c5e391af41e7747e9dfe71f Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 11 May 2022 16:13:48 +0200 Subject: [PATCH 1238/2352] [core] Run the cleanup binary only for readout-dataflow --- core/environment/transition_deploy.go | 48 +++++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 26b0223a1..c482aa1eb 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -64,29 +64,33 @@ func (t DeployTransition) do(env *Environment) (err error) { wf := env.Workflow() - flps := env.GetFLPs() - var wg sync.WaitGroup - wg.Add(len(flps)) - - // Execute the cleanup script on all FLPs before the DEPLOY transition commences - for _, flp := range flps { - go func(flp string) { - defer wg.Done() - - cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" - log.Traceln("[cleanup binary] Executing: " + cmdString) - cmd := exec.Command("/bin/bash", "-c", cmdString) - err = cmd.Run() - if err != nil { - log.Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) - err = nil // don't kill the env if we don't make it - } else { - log.Infof("[cleanup binary] execution successful on %s\n", flp) - } - }(flp) - } + // Skip cleanup for anything other than readout-dataflow + if wf.GetName() == "readout-dataflow" { + + flps := env.GetFLPs() + var wg sync.WaitGroup + wg.Add(len(flps)) + + // Execute the cleanup script on all FLPs before the DEPLOY transition commences + for _, flp := range flps { + go func(flp string) { + defer wg.Done() + + cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" + log.Traceln("[cleanup binary] Executing: " + cmdString) + cmd := exec.Command("/bin/bash", "-c", cmdString) + err = cmd.Run() + if err != nil { + log.Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) + err = nil // don't kill the env if we don't make it + } else { + log.Infof("[cleanup binary] execution successful on %s\n", flp) + } + }(flp) + } - wg.Wait() + wg.Wait() + } // Role tree operations go here, and afterwards we'll generally get a role tree which // has From 6d36b9a7615edb2d5a79a920845c70185378066d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 15:02:19 +0200 Subject: [PATCH 1239/2352] [occ] Add debug spam to SetProperty calls --- occ/plugin/OccFMQCommon.cxx | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 2853fc27f..c9bc7d58e 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -99,9 +99,11 @@ std::tuple doTransition(fair: if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { auto intValue = std::stoi(value); m_pluginServices->SetProperty(key, intValue); + OLOG(debug) << "SetProperty(chan int) called " << key << ":" << intValue; } else { m_pluginServices->SetProperty(key, value); + OLOG(debug) << "SetProperty(chan string) called " << key << ":" << value; } } else if (boost::starts_with(key, "__ptree__:")) { @@ -112,9 +114,11 @@ std::tuple doTransition(fair: } m_pluginServices->SetProperty(newKey, newValue); + OLOG(debug) << "SetProperty(ptree) called " << newKey << ":" << newValue; } else { // default case, 1 k-v ==> 1 SetProperty m_pluginServices->SetProperty(key, value); + OLOG(debug) << "SetProperty(string) called " << key << ":" << value; } } } @@ -178,7 +182,7 @@ std::tuple doTransition(fair: m_pluginServices->SetProperty("channel-config", channelLines); } } - // Run number must be pushed immediately before RUN transition + // Run number must be pushed immediately before RUN transition else if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { try { for (auto const& entry : arguments) { From 339e032cdd896d92b216cb019c8bc9542c986a06 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 15:03:09 +0200 Subject: [PATCH 1240/2352] [occ] Correct path of channel configuration keys --- occ/plugin/OccFMQCommon.cxx | 1 - 1 file changed, 1 deletion(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index c9bc7d58e..02fda4cfd 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -93,7 +93,6 @@ std::tuple doTransition(fair: std::string key = it->key; std::string value = it->value; if (boost::starts_with(key, "chans.")) { - key.erase(0, 6); std::vector split; boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { From 0d903e4d7ae800699d07d1b4e6f7baecd141060f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 15:04:09 +0200 Subject: [PATCH 1241/2352] [occ] Remove --channel-config workaround and rely on implicit creation --- occ/plugin/OccFMQCommon.cxx | 45 +------------------------------------ 1 file changed, 1 insertion(+), 44 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 02fda4cfd..56d73afb4 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -138,51 +138,8 @@ std::tuple doTransition(fair: try { auto evt = fair::mq::PluginServices::ToDeviceStateTransition(event); - // FIXME: big ugly workaround over here - // Since FairMQ currently (11/2018) can't yet implicitly create channels when receiving - // chans.* properties during INITIALIZING DEVICE, we must fake a --channel-config cli - // parameter during INIT and before the INIT DEVICE event. - // We extract channel related properties from the OCC transition arguments vector and we - // build up a vector of strings which mimics stuff along the lines of - // --channel-config name=data,type=push,method=bind,address=tcp://*:5555,rateLogging=0" - // See https://github.com/FairRootGroup/FairMQ/pull/111 - // When the relevant FairMQ 1.4.x version implements implicit channel creation, this whole - // block should be removed with no loss of functionality. - if (evt == fair::mq::PluginServices::DeviceStateTransition::InitDevice) { - std::unordered_map> channels; - for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { - std::string key = it->key; - std::string value = it->value; - if (boost::starts_with(key, "chans.")) { - key.erase(0, 6); - std::vector split; - boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); - if (split.size() != 3) - continue; - auto name = split[0]; - auto propKey = split[2]; - if (channels.find(name) == channels.end()) // if map for this chan doesn't exist yet - channels[name] = std::unordered_map(); - channels[name][propKey] = value; - } - } - - std::vector channelLines; - for (auto it = channels.cbegin(); it != channels.cend(); ++it) { - std::vector line; - line.push_back("name=" + it->first); - for (auto jt = it->second.cbegin(); jt != it->second.cend(); ++jt) { - line.push_back(jt->first + "=" + jt->second); - } - channelLines.push_back(boost::join(line, ",")); - OLOG(debug) << "transition pushing channel configuration " << channelLines.back(); - } - if (!channelLines.empty()) { - m_pluginServices->SetProperty("channel-config", channelLines); - } - } // Run number must be pushed immediately before RUN transition - else if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { + if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { try { for (auto const& entry : arguments) { m_pluginServices->SetProperty(entry.key, entry.value); From 05662b9f9a324e8d9d948371edde0704ee6423af Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 15:50:16 +0200 Subject: [PATCH 1242/2352] [occ] Build with C++17 --- occ/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 6089673f5..99a72b211 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -103,7 +103,7 @@ project(occ ### set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) From f98f266f555e840cf85a54cfe4c70ada6aee2d98 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 10 May 2022 15:50:45 +0200 Subject: [PATCH 1243/2352] [occ] Make debug output parsable --- occ/plugin/OccFMQCommon.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 56d73afb4..e59e48d5c 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -113,7 +113,7 @@ std::tuple doTransition(fair: } m_pluginServices->SetProperty(newKey, newValue); - OLOG(debug) << "SetProperty(ptree) called " << newKey << ":" << newValue; + OLOG(debug) << "SetProperty(ptree) called " << newKey << ":" << value; } else { // default case, 1 k-v ==> 1 SetProperty m_pluginServices->SetProperty(key, value); From e307ff10a99879573077c2b560905e1e45060c83 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 May 2022 09:58:03 +0200 Subject: [PATCH 1244/2352] [occ] Query back chans. properties for debug purposes --- occ/plugin/OccFMQCommon.cxx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index e59e48d5c..1484789d5 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -120,6 +120,10 @@ std::tuple doTransition(fair: OLOG(debug) << "SetProperty(string) called " << key << ":" << value; } } + auto chInfo = m_pluginServices->GetPropertiesAsStringStartingWith("chans."); + for (auto it = chInfo.cbegin(); it != chInfo.cend(); ++it) { + OLOG(debug) << "Written chan cfg: " << it->first << ":" << it->second; + } } std::unique_lock lk(cv_mu); From f7aa964008749e2910d5bd6167f409639583407d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 May 2022 09:58:27 +0200 Subject: [PATCH 1245/2352] [occ] Reduce debug output volume --- occ/plugin/litestructs/JsonMessage.cxx | 2 -- occ/plugin/litestructs/Transition.cxx | 3 --- 2 files changed, 5 deletions(-) diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index 50883a16a..dd28dc2ad 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -64,7 +64,6 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) auto rawSlice = (*slices)[0].c_slice(); std::string str = grpc::StringFromCopiedSlice(rawSlice); ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); - OLOG(info) << "Deserializing Message:\n" << str; return Deserialize(str); } @@ -72,7 +71,6 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) ::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const { std::string str = Serialize(); - OLOG(info) << "Serialized Message:\n" << str; // grpc::string = std::string // We build a Slice(grpc::string) and we add it to the ByteBuffer diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index a4d548885..c19b6b0a7 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -41,11 +41,8 @@ bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::Writer Date: Wed, 11 May 2022 09:41:01 +0200 Subject: [PATCH 1246/2352] [core][OCTRL-574] The odc_topology_fullname value is generated in a separate function. --- core/integration/odc/plugin.go | 71 +++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 9d72df614..599d165ef 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -281,7 +281,6 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter pdpO2PdpSuiteVersion, pdpQcJsonVersion string odcNEpnsMaxFail, epnStoreRawDataFraction string pdpEpnShmId, pdpEpnShmRecreate string - odcTopologyFullname string ) accumulator = make([]string, 0) @@ -638,47 +637,67 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, strings.TrimSpace(pdpGeneratorScriptPath)) - odcTopologyFullname = "" + out = strings.Join(accumulator, " ") + return + } + stack["GenerateEPNTopologyFullname"] = func() (out string) { + pdpConfigOption, ok := varStack["pdp_config_option"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNTopologyFullname"). + Error("cannot acquire PDP workflow configuration mode") + return + } + + pdpLibraryFile, ok := varStack["pdp_topology_description_library_file"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNTopologyFullname"). + Error("cannot acquire topology description library file") + return + } + + pdpLibWorkflowName, ok := varStack["pdp_workflow_name"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNTopologyFullname"). + Error("cannot acquire PDP workflow name in topology library file") + return + } + + odcTopologyFullname := "" switch pdpConfigOption { case "Repository hash": + o2DPSource, ok := varStack["pdp_o2_data_processing_hash"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNTopologyFullname"). + Error("cannot acquire PDP Repository hash") + return + } odcTopologyFullname = "(hash, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" case "Repository path": + o2DPSource, ok := varStack["pdp_o2_data_processing_path"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNTopologyFullname"). + Error("cannot acquire PDP Repository hash") + return + } odcTopologyFullname = "(path, " + o2DPSource + ", " + pdpLibraryFile + ", " + pdpLibWorkflowName + ")" case "Manual XML": odc_topology, ok := varStack["odc_topology"] if !ok { log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). + WithField("call", "GenerateEPNTopologyFullname"). Error("cannot acquire ODC topology variable") return } odcTopologyFullname = "(xml, " + odc_topology + ")" } - - log.Debugf("ODC topology pretty name: %s", odcTopologyFullname) - //FIXME: Disabled because env does not exist yet when GenerateEPNWorkflowScript is called - //parsedEnvId, err := uid.FromString(envId) - //if err != nil { - // log.WithField("partition", envId). - // WithField("call", "GenerateEPNWorkflowScript"). - // Error("cannot parse environment ID") - // return - //} - //envMan := environment.ManagerInstance() - //env, err := envMan.Environment(parsedEnvId) - //if err != nil { - // log.WithField("partition", envId). - // WithField("call", "GenerateEPNWorkflowScript"). - // Error("cannot acquire environment from parsed environment ID") - // return - //} - // - //env.Workflow().SetRuntimeVar("odc_topology_fullname", odcTopologyFullname) - - out = strings.Join(accumulator, " ") - return + return odcTopologyFullname } return stack } From bfe4a0bad5866933cf30de337d4a197bbe3b02bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 May 2022 17:26:24 +0200 Subject: [PATCH 1247/2352] [build] Bump AliECS to v0.42.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b4cdcf26c..14d4814f0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 41 +VERSION_MINOR := 42 VERSION_PATCH := 0 From df7d8246e3603fb65e2e3474d6cdda78c92adadf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 May 2022 15:28:20 +0200 Subject: [PATCH 1248/2352] Revert "[occ] Reduce debug output volume" This reverts commit 6d513fc19be8e3b28aee231c093c0bbedf13dca7. --- occ/plugin/litestructs/JsonMessage.cxx | 2 ++ occ/plugin/litestructs/Transition.cxx | 3 +++ 2 files changed, 5 insertions(+) diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index dd28dc2ad..50883a16a 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -64,6 +64,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) auto rawSlice = (*slices)[0].c_slice(); std::string str = grpc::StringFromCopiedSlice(rawSlice); ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); + OLOG(info) << "Deserializing Message:\n" << str; return Deserialize(str); } @@ -71,6 +72,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) ::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const { std::string str = Serialize(); + OLOG(info) << "Serialized Message:\n" << str; // grpc::string = std::string // We build a Slice(grpc::string) and we add it to the ByteBuffer diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index c19b6b0a7..a4d548885 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -41,8 +41,11 @@ bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::Writer Date: Fri, 13 May 2022 17:22:19 +0200 Subject: [PATCH 1249/2352] [occ] Fix large cfg payloads cut off because of gRPC slices --- occ/plugin/OccFMQCommon.cxx | 53 ++++++++++++++------------ occ/plugin/OccLiteServer.cxx | 9 ++++- occ/plugin/litestructs/JsonMessage.cxx | 24 ++++++++---- occ/plugin/litestructs/Transition.cxx | 6 +-- 4 files changed, 54 insertions(+), 38 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 1484789d5..b8cff317d 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -77,6 +77,7 @@ std::tuple doTransition(fair: auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { // CONFIGURE arguments must be pushed during InitializingDevice if (reachedState == fair::mq::PluginServices::DeviceState::InitializingDevice) { + OLOG(debug) << "INITIALIZING_DEVICE reached, pushing configuration parameters"; // FIXME: workaround which special cases a stoi for certain properties // which must be pushed as int. @@ -92,38 +93,42 @@ std::tuple doTransition(fair: for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { std::string key = it->key; std::string value = it->value; - if (boost::starts_with(key, "chans.")) { - std::vector split; - boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); - if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { - auto intValue = std::stoi(value); - m_pluginServices->SetProperty(key, intValue); - OLOG(debug) << "SetProperty(chan int) called " << key << ":" << intValue; - } - else { + try { + if (boost::starts_with(key, "chans.")) { + std::vector split; + boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); + if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { + auto intValue = std::stoi(value); + m_pluginServices->SetProperty(key, intValue); + OLOG(debug) << "SetProperty(chan int) called " << key << ":" << intValue; + } else { + m_pluginServices->SetProperty(key, value); + OLOG(debug) << "SetProperty(chan string) called " << key << ":" << value; + } + } else if (boost::starts_with(key, "__ptree__:")) { + // we need to ptreefy whatever payload we got under this kind of key, on a best-effort basis + auto[newKey, newValue] = propMapEntryToPtree(key, value); + if (newKey == + key) { // Means something went wrong and the called function already printed out the message + continue; + } + + m_pluginServices->SetProperty(newKey, newValue); + OLOG(debug) << "SetProperty(ptree) called " << newKey << ":" << value; + } else { // default case, 1 k-v ==> 1 SetProperty m_pluginServices->SetProperty(key, value); - OLOG(debug) << "SetProperty(chan string) called " << key << ":" << value; - } - } - else if (boost::starts_with(key, "__ptree__:")) { - // we need to ptreefy whatever payload we got under this kind of key, on a best-effort basis - auto [newKey, newValue] = propMapEntryToPtree(key, value); - if (newKey == key) { // Means something went wrong and the called function already printed out the message - continue; + OLOG(debug) << "SetProperty(string) called " << key << ":" << value; } - - m_pluginServices->SetProperty(newKey, newValue); - OLOG(debug) << "SetProperty(ptree) called " << newKey << ":" << value; } - else { // default case, 1 k-v ==> 1 SetProperty - m_pluginServices->SetProperty(key, value); - OLOG(debug) << "SetProperty(string) called " << key << ":" << value; + catch (std::runtime_error &e) { + OLOG(warning) << "SetProperty call failed for key " + key + " with reason: " << e.what(); } } auto chInfo = m_pluginServices->GetPropertiesAsStringStartingWith("chans."); for (auto it = chInfo.cbegin(); it != chInfo.cend(); ++it) { - OLOG(debug) << "Written chan cfg: " << it->first << ":" << it->second; + OLOG(debug) << "Written chan cfg: " << it->first << ": " << it->second; } + OLOG(debug) << "INITIALIZING_DEVICE configuration push DONE"; } std::unique_lock lk(cv_mu); diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 9c7ecece8..5f14fc3ac 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -79,6 +79,8 @@ ::grpc::Status OccLite::Service::GetState(::grpc::ServerContext* context, (void) context; (void) request; + OLOG(info) << "Incoming GetState request: " << request->JsonMessage::Serialize(); + auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); pid_t pid = getpid(); @@ -93,16 +95,19 @@ ::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, const OccLite::nopb::TransitionRequest* request, OccLite::nopb::TransitionResponse* response) { - OLOG(info) << "Incoming Transition request:" << request->JsonMessage::Serialize(); + OLOG(info) << "Incoming Transition request: " << request->JsonMessage::Serialize(); auto transitionOutcome = doTransition(m_pluginServices, *request); ::grpc::Status grpcStatus = std::get<1>(transitionOutcome); if (!grpcStatus.ok()) { - return grpcStatus; + OLOG(error) << "Transition failed with error: " << grpcStatus.error_code() << " " << grpcStatus.error_message() << " " << grpcStatus.error_details(); + return grpc::Status::CANCELLED; } auto nopbResponse = std::get<0>(transitionOutcome); *response = nopbResponse; + OLOG(info) << "Transition response: " << response->state << "ok: " << response->ok; + return grpc::Status::OK; } diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index 50883a16a..15c1d7d17 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -24,6 +24,7 @@ #include "JsonMessage.h" + std::string OccLite::nopb::JsonMessage::Serialize() const { rapidjson::StringBuffer ss; @@ -59,20 +60,29 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) { auto slices = new std::vector<::grpc::Slice>; auto status = byte_buffer->Dump(slices); - if (slices->size() != 1) return false; - auto rawSlice = (*slices)[0].c_slice(); - std::string str = grpc::StringFromCopiedSlice(rawSlice); - ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); - OLOG(info) << "Deserializing Message:\n" << str; + if (!status.ok()) { + OLOG(info) << "Cannot dump JsonMessage slices, error code " << status.error_code() << " " << status.error_message() << " " << status.error_details(); + return false; + } + + std::stringstream ss; + for (auto sl = slices->cbegin(); sl != slices->cend(); sl++) { + auto rawSlice = sl->c_slice(); + std::string str = grpc::StringFromCopiedSlice(rawSlice); + ss << str; + ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); + } + + OLOG(info) << "Deserialized JsonMessage: " << ss.str(); - return Deserialize(str); + return Deserialize(ss.str()); } ::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const { std::string str = Serialize(); - OLOG(info) << "Serialized Message:\n" << str; + OLOG(info) << "Serialized JsonMessage: " << str; // grpc::string = std::string // We build a Slice(grpc::string) and we add it to the ByteBuffer diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index a4d548885..e0d539bdf 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -41,11 +41,8 @@ bool OccLite::nopb::TransitionRequest::Serialize(rapidjson::Writer Date: Fri, 13 May 2022 17:27:36 +0200 Subject: [PATCH 1250/2352] [build] Bump to v0.42.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 14d4814f0..d38af0c07 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 42 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 5532f574997231d785549f3de66d328eac885f2c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 May 2022 17:46:26 +0200 Subject: [PATCH 1251/2352] [core] Prevent DD from crashing AliECS core with a bad response --- core/integration/ddsched/plugin.go | 40 ++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 5c872f15c..c162ac495 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -312,6 +312,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("call", "PartitionStatus"). + WithField("timeout", timeout.String()). + Error("DDsched error, will keep retying until timeout") + + // The query failed, we'll keep retrying until timeout + time.Sleep(100 * time.Millisecond) + continue + } switch response.PartitionState { case ddpb.PartitionState_PARTITION_CONFIGURING: @@ -438,6 +451,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("call", "PartitionStatus"). + WithField("timeout", timeout.String()). + Error("DDsched error, will keep retying until timeout") + + // The query failed, we'll keep retrying until timeout + time.Sleep(100 * time.Millisecond) + continue + } switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: @@ -622,6 +648,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("call", "PartitionStatus"). + WithField("timeout", timeout.String()). + Error("DDsched error, will keep retying until timeout") + + // The query failed, we'll keep retrying until timeout + time.Sleep(100 * time.Millisecond) + continue + } + switch response.PartitionState { case ddpb.PartitionState_PARTITION_TERMINATING: time.Sleep(100 * time.Millisecond) From 3b1ab6f6ebfd75cf56e0976a38834592bb295e48 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 May 2022 17:47:53 +0200 Subject: [PATCH 1252/2352] [build] Bump AliECS to v0.42.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d38af0c07..8e1c3687b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 42 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 7e7feafb36b7f9149d9d073e74df82d523921551 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 13 May 2022 12:23:21 +0200 Subject: [PATCH 1253/2352] [core] Add auto-stop functionality for environments --- core/environment/environment.go | 54 +++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index e51cd222b..fbcddb6ae 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -79,6 +79,8 @@ type Environment struct { Description string // From workflow callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap + + autoStopTimer *time.Timer } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -239,11 +241,22 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } cleanupCount++ env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) + + // Register auto stop transition (if enabled) + scheduled, expected := env.scheduleAutoStopTransition() + if scheduled { + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Infof("auto stop transition scheduled, expected execution at %s",expected) + } + } else if e.Event == "STOP_ACTIVITY" { // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. env.currentRunNumber = 0 env.workflow.GetVars().Del("run_number") env.workflow.GetVars().Del("runNumber") + // Ensure the auto stop timer is stopped (important for stop transitions NOT triggered by the timer itself) + env.invalidateAutoStopTransition() } }, }, @@ -834,3 +847,44 @@ func (env *Environment) GetVarsAsString() string { } return sortMapToString(varStack) } + +// return true if the auto stop transition has been scheduled, false otherwise +// if true, the expected stop time is also returned +func (env *Environment) scheduleAutoStopTransition() (bool, time.Time) { + autoStopEnabled, ok := env.UserVars.Get("auto_stop_enabled") + if autoStopEnabled == "true" && ok { + var autoStopTimeout string + autoStopTimeout, ok = env.UserVars.Get("auto_stop_timeout") + if ok { + // if auto stop is enabled, parse the timeout, start a timer + // and start a go routine that will try a STOP transition after the timeout + autoStopDuration, err := time.ParseDuration(autoStopTimeout) + if err == nil { + env.autoStopTimer = time.NewTimer(autoStopDuration) + go func() { + select { + case <-env.autoStopTimer.C: + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Infof("Executing scheduled auto stop transition following expiration of %s", autoStopDuration) + err = env.TryTransition(NewStopActivityTransition(ManagerInstance().taskman)) + if err != nil { + fmt.Println(err) + } + } + }() + + // if registered + return true, time.Now().Add(autoStopDuration) + } + } + } + return false, time.Time{} +} + +func (env *Environment) invalidateAutoStopTransition() { + // Only try to stop an initialized timer + if env.autoStopTimer != nil { + env.autoStopTimer.Stop() + } +} From e66893c36cca3712115be9acf34610000658b019 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 16 May 2022 11:53:16 +0200 Subject: [PATCH 1254/2352] [core] Auto-stop: use `getKV` and improve error logging --- core/environment/environment.go | 51 +++++++++++++++++++-------------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index fbcddb6ae..88ad43549 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -850,36 +850,45 @@ func (env *Environment) GetVarsAsString() string { // return true if the auto stop transition has been scheduled, false otherwise // if true, the expected stop time is also returned -func (env *Environment) scheduleAutoStopTransition() (bool, time.Time) { - autoStopEnabled, ok := env.UserVars.Get("auto_stop_enabled") - if autoStopEnabled == "true" && ok { - var autoStopTimeout string - autoStopTimeout, ok = env.UserVars.Get("auto_stop_timeout") - if ok { +func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected time.Time) { + autoStopEnabled := env.GetKV("", "auto_stop_enabled") + if autoStopEnabled == "true" { + autoStopTimeout := env.GetKV("", "auto_stop_timeout") + if autoStopTimeout != "" { // if auto stop is enabled, parse the timeout, start a timer // and start a go routine that will try a STOP transition after the timeout autoStopDuration, err := time.ParseDuration(autoStopTimeout) - if err == nil { - env.autoStopTimer = time.NewTimer(autoStopDuration) - go func() { - select { - case <-env.autoStopTimer.C: + if err != nil { + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Errorf("Auto stop duration string parsing failed: %s", err.Error()) + return + } + + env.autoStopTimer = time.NewTimer(autoStopDuration) + go func() { + select { + case <-env.autoStopTimer.C: + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Infof("Executing scheduled auto stop transition following expiration of %s", autoStopDuration) + err = env.TryTransition(NewStopActivityTransition(ManagerInstance().taskman)) + if err != nil { log.WithField("partition", env.id). WithField("run", env.currentRunNumber). - Infof("Executing scheduled auto stop transition following expiration of %s", autoStopDuration) - err = env.TryTransition(NewStopActivityTransition(ManagerInstance().taskman)) - if err != nil { - fmt.Println(err) - } + Errorf("Scheduled auto stop transition failed: %s", err.Error()) + return } - }() + } + }() - // if registered - return true, time.Now().Add(autoStopDuration) - } + // if registered + scheduled = true + expected = time.Now().Add(autoStopDuration) + return } } - return false, time.Time{} + return } func (env *Environment) invalidateAutoStopTransition() { From 43c919bd48fc1c0e0e59ca617a95f9396bcad008 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 May 2022 09:50:01 +0200 Subject: [PATCH 1255/2352] [core] Only send curated properties to ODC --- core/integration/odc/plugin.go | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 599d165ef..15db7678b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -882,18 +882,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warn("cannot acquire general detector list from varStack") } - // FIXME: this only copies over vars prefixed with "odc_" - // Figure out a better way! - for k, v := range varStack { - if strings.HasPrefix(k, "odc_") && - k != "odc_enabled" && - k != "odc_resources" && - k != "odc_plugin" && - k != "odc_script" && - k != "odc_topology" { - arguments[strings.TrimPrefix(k, "odc_")] = v - } - } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId) @@ -1179,18 +1167,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments := make(map[string]string) arguments["environment_id"] = envId - // FIXME: this only copies over vars prefixed with "odc_" - // Figure out a better way! - for k, v := range varStack { - if strings.HasPrefix(k, "odc_") && - k != "odc_enabled" && - k != "odc_resources" && - k != "odc_plugin" && - k != "odc_script" && - k != "odc_topology" { - arguments[strings.TrimPrefix(k, "odc_")] = v - } - } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleConfigureLegacy(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, paddingTimeout, envId) From a00cc7738322084ccbe1cd7bc0dad4fcdd267089 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 May 2022 17:11:22 +0200 Subject: [PATCH 1256/2352] [coconut] Update default apricot endpoint --- coconut/cmd/root.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coconut/cmd/root.go b/coconut/cmd/root.go index ed24ae0ce..9876a8a65 100644 --- a/coconut/cmd/root.go +++ b/coconut/cmd/root.go @@ -81,7 +81,7 @@ func init() { // will be global for your application. rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) rootCmd.PersistentFlags().String("endpoint", "127.0.0.1:32102", product.PRETTY_SHORTNAME+" core endpoint as HOST:PORT") - rootCmd.PersistentFlags().String("config_endpoint", "consul://127.0.0.1:8500", "configuration endpoint used by AliECS core as PROTO://HOST:PORT") + rootCmd.PersistentFlags().String("config_endpoint", "apricot://127.0.0.1:32101", "configuration endpoint used by AliECS core as PROTO://HOST:PORT") rootCmd.PersistentFlags().BoolP("verbose", "v", false, "show verbose output for debug purposes") rootCmd.PersistentFlags().Bool("nospinner", false, "disable animations in output") rootCmd.PersistentFlags().Bool("nocolor", false, "disable colors in output") @@ -101,7 +101,7 @@ func init() { func initConfig() { viper.SetDefault("log.level", "info") viper.SetDefault("endpoint", "127.0.0.1:32102") - viper.SetDefault("config_endpoint", "127.0.0.1:8500") + viper.SetDefault("config_endpoint", "apricot://127.0.0.1:32101") viper.SetDefault("verbose", false) viper.SetDefault("nospinner", false) viper.SetDefault("nocolor", false) From 0ad1e70e79ef14d53c3352b6b68f378eb3b8fbdc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 May 2022 17:28:41 +0200 Subject: [PATCH 1257/2352] [core] New --version convenience parameter for manual deployment --- core/config.go | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/core/config.go b/core/config.go index b54213bd9..b182ce8f1 100644 --- a/core/config.go +++ b/core/config.go @@ -30,6 +30,7 @@ import ( "fmt" "net/url" "os" + "os/user" "path/filepath" "strings" @@ -53,6 +54,7 @@ func setDefaults() error { exeDir := filepath.Dir(exe) viper.Set("component", "core") + viper.SetDefault("version", false) viper.SetDefault("controlPort", 32102) viper.SetDefault("coreConfigurationUri", "") viper.SetDefault("consulBasePath", "o2/components/aliecs/ANY/any") @@ -118,6 +120,7 @@ func setDefaults() error { } func setFlags() error { + pflag.Bool("version", viper.GetBool("version"), "The current AliECS core version") pflag.Int("controlPort", viper.GetInt("controlPort"), "Port of control server") pflag.String("coreConfigurationUri", viper.GetString("coreConfigurationUri"), "Consul URI or filesystem path to JSON/YAML configuration payload to initialize core settings [EXPERT SETTING]") pflag.String("coreWorkingDir", viper.GetString("coreWorkingDir"), "Path to a writable directory for runtime AliECS data") @@ -283,6 +286,32 @@ func NewConfig() (err error) { if err = setFlags(); err != nil { return } + + if viper.GetBool("version") { + var executable string + executable, err = os.Executable() + if err != nil { + executable = "unknown path" + err = nil + } + var usr *user.User + usr, err = user.Current() + if err != nil { + usr = &user.User{} + err = nil + } + + fmt.Printf("%s core (%s) v%s build %s running as user %s from %s\n", + product.PRETTY_FULLNAME, + product.PRETTY_SHORTNAME, + product.VERSION, + product.BUILD, + usr.Username, + executable) + os.Exit(0) + return + } + if err = parseCoreConfig(); err != nil { return } From ca542f270e30dbe65fb922677dca40b35f40a231 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 May 2022 16:32:49 +0200 Subject: [PATCH 1258/2352] [core] Increase commandqueue max length and improve error handling --- core/controlcommands/commandqueue.go | 19 +++++++++++-------- core/controlcommands/mesoscommandservent.go | 4 ++-- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index a5a770f46..8ff6d72b6 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -36,7 +36,7 @@ import ( "github.com/sirupsen/logrus" ) -const QUEUE_SIZE = 1024 +const QUEUE_SIZE = 16384 // upper limit of command queue size var log = logger.New(logrus.StandardLogger(), "cmdq") @@ -61,9 +61,6 @@ func NewCommandQueue(s *Servent) *CommandQueue { } func (m *CommandQueue) Enqueue(cmd MesosCommand, callback chan<- MesosCommandResponse) error { - m.Lock() - defer m.Unlock() - select { case m.q <- queueEntry{cmd, callback}: return nil @@ -85,15 +82,21 @@ func (m *CommandQueue) Start() { for { select { case entry, more := <-m.q: - m.Lock() if !more { // if the channel is closed, we bail return } + m.Lock() response, err := m.commit(entry.cmd) if err != nil { - log.Debug(err) + if entry.cmd != nil { + log.WithError(err). + Debugf("failed to commit CommandQueue entry %s", entry.cmd.GetName()) + } else { + log.WithError(err). + Debug("failed to commit unknown CommandQueue entry") + } } - if response == nil { + if err == nil && response == nil { log.Error("nil response") } @@ -160,7 +163,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon "commandName": res.GetCommandName(), "error": res.Err().Error(), }). - Trace("received MesosCommandResponse") + Trace("received MesosCommandResponse with error") } else { log.WithFields(logrus.Fields{ "commandName": res.GetCommandName(), diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index 4d00dee67..f67a2111a 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -150,11 +150,11 @@ func (s *Servent) ProcessResponse(res MesosCommandResponse, sender MesosCommandT } s.mu.Lock() - call := s.pending[callId] + call, ok := s.pending[callId] delete(s.pending, callId) s.mu.Unlock() - if call == nil { + if !ok || call == nil { log.WithFields(logrus.Fields{ "commandName": res.GetCommandName(), "commandId": res.GetCommandId(), From 40dd2a9cdc35c703315ad53071523315e6f970be Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 May 2022 16:33:48 +0200 Subject: [PATCH 1259/2352] [core] Show list of inactive roles on deployment failure --- core/environment/transition_deploy.go | 29 +++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index c482aa1eb..37bde092d 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -28,6 +28,7 @@ import ( "errors" "fmt" "os/exec" + "sort" "strings" "sync" "time" @@ -37,7 +38,6 @@ import ( "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" "github.com/pborman/uuid" - "github.com/sirupsen/logrus" ) func NewDeployTransition(taskman *task.Manager, addRoles []string, removeRoles []string) Transition { @@ -215,12 +215,29 @@ func (t DeployTransition) do(env *Environment) (err error) { } continue case <-time.After(deploymentTimeout): - err = errors.New(fmt.Sprintf("workflow deployment timed out. timeout: %s", deploymentTimeout.String())) + wfStatus = wf.GetStatus() + inactiveTaskRoles := make([]string, 0) + workflow.LeafWalk(wf, func(role workflow.Role) { + if roleStatus := role.GetStatus(); roleStatus != task.ACTIVE { + log.WithField("state", role.GetState().String()). + WithField("status", roleStatus.String()). + WithField("role", role.GetPath()). + WithField("partition", role.GetEnvironmentId().String()). + WithField("timeout", deploymentTimeout). + Error("role failed to deploy within timeout") + inactiveTaskRoles = append(inactiveTaskRoles, role.GetPath()) + } + }) + + sort.Strings(inactiveTaskRoles) + inactiveTaskRolesS := strings.Join(inactiveTaskRoles, ", ") + + err = fmt.Errorf("workflow deployment timed out (%s), aborting and cleaning up [inactive roles: %s]", deploymentTimeout.String(), inactiveTaskRolesS) break WORKFLOW_ACTIVE_LOOP // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster // in the CreateEnvironment (environment/manager.go) and the lock in the `envman` is reserved for a sorter period, which allows operations like - // `environment list` to be done almost immediatelly after mesos informs with TASK_FAILED. + // `environment list` to be done almost immediately after mesos informs with TASK_FAILED. case wfState := <-notifyState: if wfState == task.ERROR { failedRoles := make([]string, 0) @@ -235,7 +252,7 @@ func (t DeployTransition) do(env *Environment) (err error) { }) log.WithField("state", wfState.String()). Debug("workflow state change") - err = fmt.Errorf("workflow deployment failed, aborting and cleaning up [offending roles: %s]", strings.Join(failedRoles, ", ")) + err = fmt.Errorf("workflow deployment failed, aborting and cleaning up [failed roles: %s]", strings.Join(failedRoles, ", ")) break WORKFLOW_ACTIVE_LOOP } } @@ -243,8 +260,8 @@ func (t DeployTransition) do(env *Environment) (err error) { } if err != nil { - log.WithFields(logrus.Fields{"error": err.Error()}). - Error("workflow deployment error") + log.WithError(err). + Error("deployment error") return } From e287f2c39b1c33fc3a9e1a558b20ea7c3f10f861 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 May 2022 16:34:44 +0200 Subject: [PATCH 1260/2352] [core] String representation of descriptors slice --- core/task/descriptor.go | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/core/task/descriptor.go b/core/task/descriptor.go index de941c0d5..77a2483af 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -25,8 +25,11 @@ package task import ( - "github.com/AliceO2Group/Control/core/task/constraint" + "fmt" + "strings" + "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/constraint" ) /* @@ -43,19 +46,34 @@ import ( matchRoles, which must return a *Task. This Task must then be added to the roster and a pointer to it set on the relevant TaskRole. - */ +*/ type Descriptor struct { - TaskRole parentRole - TaskClassName string - RoleConstraints constraint.Constraints - RoleConnect []channel.Outbound - RoleBind []channel.Inbound + TaskRole parentRole + TaskClassName string + RoleConstraints constraint.Constraints + RoleConnect []channel.Outbound + RoleBind []channel.Inbound //CmdExtraEnv []string //CmdExtraArguments []string } type Descriptors []*Descriptor +func (ds Descriptors) String() string { + if len(ds) == 0 { + return "" + } + lines := make([]string, len(ds)) + for i, desc := range ds { + if desc == nil || desc.TaskRole == nil { + lines[i] = "unknown" + continue + } + lines[i] = fmt.Sprintf("%s→%s", desc.TaskRole.GetPath(), desc.TaskClassName) + } + return strings.Join(lines, ", ") +} + /* func (this Descriptor) Equals(other *Descriptor) (response bool) { return this.EqualsPtr(other) @@ -328,8 +346,6 @@ func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryF // ↑ this guy will initially only have 2 states: running and not running, or somesuch // but he doesn't belong here because all this should be immutable - - /*func NewO2Process() *ProcessDescriptor { return &ProcessDescriptor{ Fsm: fsm.NewFSM( @@ -342,4 +358,4 @@ func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryF ), Deployed: false, } -}*/ \ No newline at end of file +}*/ From cf9f61527c88fc869dddc26ad0a98fe5f9b6ec06 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 19 May 2022 16:36:39 +0200 Subject: [PATCH 1261/2352] [core] Increase TaskMan queue size and improve error handling --- core/task/errors.go | 17 +++- core/task/manager.go | 155 ++++++++++++++++++++---------------- core/task/scheduler.go | 4 +- core/task/schedulerstate.go | 51 ++++++------ 4 files changed, 128 insertions(+), 99 deletions(-) diff --git a/core/task/errors.go b/core/task/errors.go index b203ef6ae..f233ee6fd 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -44,6 +44,7 @@ type TasksError interface { type taskErrorBase struct { taskId string } + func (r taskErrorBase) GetTaskId() string { return r.taskId } @@ -51,6 +52,7 @@ func (r taskErrorBase) GetTaskId() string { type tasksErrorBase struct { taskIds []string } + func (r tasksErrorBase) GetTaskIds() []string { return r.taskIds } @@ -59,6 +61,7 @@ type GenericTaskError struct { taskErrorBase message string } + func (r GenericTaskError) Error() string { return fmt.Sprintf("task %s error: %s", r.taskId, r.message) } @@ -67,21 +70,28 @@ type GenericTasksError struct { tasksErrorBase message string } + func (r GenericTasksError) Error() string { return fmt.Sprintf("tasks [%s] error: %s", strings.Join(r.taskIds, ", "), r.message) } -type TasksDeploymentError tasksErrorBase +type TasksDeploymentError struct { + tasksErrorBase + failedDescriptors Descriptors +} + func (r TasksDeploymentError) Error() string { - return fmt.Sprintf("deployment failed for tasks [%s]", strings.Join(r.taskIds, ", ")) + return fmt.Sprintf("deployment failed for %d tasks [%s]", len(r.failedDescriptors), r.failedDescriptors.String()) } type TaskAlreadyReleasedError taskErrorBase + func (r TaskAlreadyReleasedError) Error() string { return fmt.Sprintf("task %s already released", r.taskId) } type TaskNotFoundError taskErrorBase + func (r TaskNotFoundError) Error() string { return fmt.Sprintf("task %s not found", r.taskId) } @@ -90,9 +100,10 @@ type TaskLockedError struct { taskErrorBase envId uid.ID } + func (r TaskLockedError) Error() string { return fmt.Sprintf("task %s is locked by environment %s", r.taskId, r.envId) } func (r TaskLockedError) EnvironmentId() uid.ID { return r.envId -} \ No newline at end of file +} diff --git a/core/task/manager.go b/core/task/manager.go index c34b5be4a..85d55f38b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -54,31 +54,36 @@ type KillTaskFunc func(*Task) error const ( TARGET_SEPARATOR_RUNE = ':' - TARGET_SEPARATOR = ":" + TARGET_SEPARATOR = ":" ) -const TaskMan_QUEUE = 1024 +const TaskMan_QUEUE = 32768 + +type ResourceOffersOutcome struct { + deployed DeploymentMap + undeployed Descriptors +} type Manager struct { - ctx context.Context - fidStore store.Singleton - AgentCache AgentCache - MessageChannel chan *TaskmanMessage + ctx context.Context + fidStore store.Singleton + AgentCache AgentCache + MessageChannel chan *TaskmanMessage - classes *classes - roster *roster + classes *classes + roster *roster - resourceOffersDone <-chan DeploymentMap + resourceOffersDone <-chan ResourceOffersOutcome tasksToDeploy chan<- Descriptors reviveOffersTrg chan struct{} cq *controlcommands.CommandQueue - tasksLaunched int - tasksFinished int + tasksLaunched int + tasksFinished int - schedulerState *schedulerState - internalEventCh chan<- event.Event - ackKilledTasks *safeAcks + schedulerState *schedulerState + internalEventCh chan<- event.Event + ackKilledTasks *safeAcks } func NewManager(shutdown func(), @@ -108,9 +113,9 @@ func NewManager(shutdown func(), } taskman = &Manager{ - classes: newClasses(), - roster: newRoster(), - internalEventCh: internalEventCh, + classes: newClasses(), + roster: newRoster(), + internalEventCh: internalEventCh, } schedulerState, err := NewScheduler(taskman, fidStore, shutdown) if err != nil { @@ -178,7 +183,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return } repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] //get IRepo pointer from RepoManager - if repo == nil { //should never end up here + if repo == nil { //should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } @@ -279,17 +284,17 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { /* - Here's what's gonna happen: - 1) check if any tasks are already in Roster, whether they are already locked - in an environment, and whether their host has attributes that satisfy the - constraints - 1a) TODO: for each of them in Roster with matching attributes but wrong class, - mark for teardown and mesos-deployment - 1b) for each of them in Roster with matching attributes and class, mark for - takeover and reconfiguration - 3) TODO: teardown the tasks in tasksToTeardown - 4) start the tasks in tasksToRun - 5) ensure that all of them reach a CONFIGURED state + Here's what's gonna happen: + 1) check if any tasks are already in Roster, whether they are already locked + in an environment, and whether their host has attributes that satisfy the + constraints + 1a) TODO: for each of them in Roster with matching attributes but wrong class, + mark for teardown and mesos-deployment + 1b) for each of them in Roster with matching attributes and class, mark for + takeover and reconfiguration + 3) TODO: teardown the tasks in tasksToTeardown + 4) start the tasks in tasksToRun + 5) ensure that all of them reach a CONFIGURED state */ tasksToRun := make(Descriptors, 0) @@ -299,12 +304,12 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e tasksAlreadyRunning := make(DeploymentMap) for _, descriptor := range taskDescriptors { /* - For each descriptor we check m.AgentCache for agent attributes: - this allows us for each idle task in roster, get agentid and plug it in cache to get the - attributes for that host, and then we know whether - 1) a running task of the same class on that agent would qualify - 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify - */ + For each descriptor we check m.AgentCache for agent attributes: + this allows us for each idle task in roster, get agentid and plug it in cache to get the + attributes for that host, and then we know whether + 1) a running task of the same class on that agent would qualify + 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify + */ // Filter function that accepts a Task if // a) it's !Locked @@ -362,6 +367,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // - matched to a TaskPtr in tasksAlreadyRunning // - awaiting Task deployment in tasksToRun deploymentSuccess := true // hopefully + undeployedDescriptors := make(Descriptors, 0) deployedTasks := make(DeploymentMap) if len(tasksToRun) > 0 { @@ -371,23 +377,31 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // the offers, we ask Mesos to run the required roles - if any. m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers - <- m.reviveOffersTrg // we only continue when it's done + <-m.reviveOffersTrg // we only continue when it's done m.tasksToDeploy <- tasksToRun // blocks until received - log.WithField("environmentId", envId). - Debug("scheduler should have received request to deploy") + log.WithField("partition", envId). + Debugf("scheduler has received request to deploy %d tasks", len(tasksToRun)) // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static // reservation for that mesos-role on behalf of our scheduler - deployedTasks = <- m.resourceOffersDone + roOutcome := <-m.resourceOffersDone + deployedTasks = roOutcome.deployed + undeployedDescriptors = roOutcome.undeployed + log.WithField("tasks", deployedTasks). - Debug("resourceOffers is done, new tasks running") + WithField("partition", envId). + Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) if len(deployedTasks) != len(tasksToRun) { // ↑ Not all roles could be deployed. We cannot proceed // with running this environment, but we keep the roles // running since they might be useful in the future. + log.WithField("partition", envId). + WithField("undeployed", undeployedDescriptors.String()). + Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + deploymentSuccess = false } } @@ -413,7 +427,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } - err = TasksDeploymentError{taskIds: deployedTaskIds} + + err = TasksDeploymentError{ + tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, + failedDescriptors: undeployedDescriptors, + } } // Finally, we write to the roster. Point of no return! @@ -519,7 +537,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) _ = m.cq.Enqueue(cmd, notify) - response := <- notify + response := <-notify close(notify) if response == nil { @@ -588,7 +606,7 @@ func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest st cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) m.cq.Enqueue(cmd, notify) - response := <- notify + response := <-notify close(notify) if response == nil { @@ -625,7 +643,7 @@ func (m *Manager) TriggerHooks(tasks Tasks) error { return err } - response := <- notify + response := <-notify close(notify) if response == nil { @@ -690,7 +708,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { st := StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateState(st) } @@ -732,7 +750,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(INACTIVE) } } - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname , ClassName: taskPtr.GetClassName()}) + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) } // Kill all tasks outside an environment (all unlocked tasks) @@ -772,8 +790,8 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err killed, running, err = m.doKillTasks(toKill) for _, id := range killed.GetTaskIds() { - ack,_ := m.ackKilledTasks.getValue(id) - <- ack + ack, _ := m.ackKilledTasks.getValue(id) + <-ack close(ack) m.ackKilledTasks.deleteKey(id) } @@ -784,7 +802,6 @@ func (m *Manager) doKillTask(task *Task) error { return m.schedulerState.killTask(context.TODO(), task.GetMesosCommandTarget()) } - func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err error) { // We assume all tasks are unlocked @@ -800,7 +817,7 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err })) // Remove from the roster the tasks we are going to kill - // if we couldn't kill a task add it back to the roster + // if we couldn't kill a task add it back to the roster m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !tasks.Contains(func(t *Task) bool { return t.taskId == task.taskId @@ -833,7 +850,7 @@ func (m *Manager) Start(ctx context.Context) { for { select { case taskmanMessage, ok := <-m.MessageChannel: - if !ok { // if the channel is closed, we bail + if !ok { // if the channel is closed, we bail return } err := m.handleMessage(taskmanMessage) @@ -849,24 +866,29 @@ func (m *Manager) stop() { close(m.MessageChannel) } -func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { +func (m *Manager) handleMessage(tm *TaskmanMessage) error { if m == nil { return errors.New("manager is nil") } messageType := tm.GetMessageType() - switch messageType{ + switch messageType { case taskop.AcquireTasks: - go m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) + go func() { + err := m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) + if err != nil { + log.WithError(err).WithField("level", infologger.IL_Devel).Errorf("acquireTasks failed") + } + }() case taskop.ConfigureTasks: - go func(){ - err := m.configureTasks(tm.GetEnvironmentId(),tm.GetTasks()) + go func() { + err := m.configureTasks(tm.GetEnvironmentId(), tm.GetTasks()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) }() case taskop.TransitionTasks: - go func(){ - err := m.transitionTasks(tm.GetTasks(),tm.GetSource(),tm.GetEvent(),tm.GetDestination(),tm.GetArguments()) + go func() { + err := m.transitionTasks(tm.GetTasks(), tm.GetSource(), tm.GetEvent(), tm.GetDestination(), tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) }() case taskop.TaskStatusMessage: @@ -878,17 +900,17 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: log.WithPrefix("taskman"). WithFields(logrus.Fields{ - "taskId": mesosStatus.GetTaskID().Value, - "state": mesosState.String(), - "reason": mesosStatus.GetReason().String(), - "source": mesosStatus.GetSource().String(), + "taskId": mesosStatus.GetTaskID().Value, + "state": mesosState.String(), + "reason": mesosStatus.GetReason().String(), + "source": mesosStatus.GetSource().String(), "message": mesosStatus.GetMessage(), - "level": infologger.IL_Devel, + "level": infologger.IL_Devel, }). Info("task inactive exception") taskIDValue := mesosStatus.GetTaskID().Value t := m.GetTask(taskIDValue) - if t != nil && t.IsLocked() { + if t != nil && t.IsLocked() { go m.updateTaskState(taskIDValue, "ERROR") } } @@ -914,7 +936,6 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) (error) { go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) } - return nil } @@ -924,7 +945,7 @@ func (m *Manager) EmergencyKillTasks(tasks Tasks) { killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s",t.GetTaskId())) + log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s", t.GetTaskId())) } } -} \ No newline at end of file +} diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 322e7fa8c..b3e96412c 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -764,7 +764,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "executorName": taskInfo.GetExecutor().GetName(), "agentId": taskInfo.GetAgentID().Value, "taskId": taskInfo.GetTaskID().Value, - "level" : infologger.IL_Devel, + "level": infologger.IL_Devel, }). Debug("launched") } @@ -804,7 +804,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // Notify listeners... select { - case state.resourceOffersDone <- tasksDeployed: + case state.resourceOffersDone <- ResourceOffersOutcome{tasksDeployed, descriptorsStillToDeploy}: log.WithPrefix("scheduler"). WithField("tasksDeployed", len(tasksDeployed)). Trace("notified listeners on resourceOffers done") diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 2d7dbf9b8..5e9c84157 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -47,13 +47,12 @@ import ( "github.com/spf13/viper" ) - type schedulerState struct { sync.RWMutex - sm *fsm.FSM + sm *fsm.FSM - fidStore store.Singleton + fidStore store.Singleton // needs locking: wantsTaskResources mesos.Resources @@ -62,27 +61,25 @@ type schedulerState struct { // not used in multiple goroutines: executor *mesos.ExecutorInfo reviveTokens <-chan struct{} - resourceOffersDone chan DeploymentMap + resourceOffersDone chan ResourceOffersOutcome tasksToDeploy chan Descriptors reviveOffersTrg chan struct{} random *rand.Rand // shouldn't change at runtime, so thread safe: - role string - cli calls.Caller - shutdown func() + role string + cli calls.Caller + shutdown func() // uses prometheus counters, so thread safe - metricsAPI *metricsAPI + metricsAPI *metricsAPI // uses locks, so thread safe - servent *controlcommands.Servent - commandqueue *controlcommands.CommandQueue - taskman *Manager - + servent *controlcommands.Servent + commandqueue *controlcommands.CommandQueue + taskman *Manager } - func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) (*schedulerState, error) { metricsAPI := initMetrics() executorInfo, err := schedutil.PrepareExecutorInfo( @@ -102,14 +99,14 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( return nil, err } - resourceOffersDone := make(chan DeploymentMap) + resourceOffersDone := make(chan ResourceOffersOutcome) tasksToDeploy := make(chan Descriptors) reviveOffersTrg := make(chan struct{}) state := &schedulerState{ - taskman: taskman, - fidStore: fidStore, - reviveTokens: backoff.BurstNotifier( + taskman: taskman, + fidStore: fidStore, + reviveTokens: backoff.BurstNotifier( viper.GetInt("mesosReviveBurst"), viper.GetDuration("mesosReviveWait"), viper.GetDuration("mesosReviveWait"), @@ -132,30 +129,30 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( ) state.commandqueue = controlcommands.NewCommandQueue(state.servent) - state.commandqueue.Start() // FIXME: should there be 1 cq per env? + state.commandqueue.Start() // FIXME: should there be 1 cq per env? state.sm = fsm.NewFSM( "INITIAL", fsm.Events{ - {Name: "CONNECT", Src: []string{"INITIAL"}, Dst: "CONNECTED"}, - {Name: "NEW_ENVIRONMENT", Src: []string{"CONNECTED"}, Dst: "CONNECTED"}, - {Name: "GO_ERROR", Src: []string{"CONNECTED"}, Dst: "ERROR"}, - {Name: "RESET", Src: []string{"ERROR"}, Dst: "INITIAL"}, - {Name: "EXIT", Src: []string{"CONNECTED"}, Dst: "FINAL"}, + {Name: "CONNECT", Src: []string{"INITIAL"}, Dst: "CONNECTED"}, + {Name: "NEW_ENVIRONMENT", Src: []string{"CONNECTED"}, Dst: "CONNECTED"}, + {Name: "GO_ERROR", Src: []string{"CONNECTED"}, Dst: "ERROR"}, + {Name: "RESET", Src: []string{"ERROR"}, Dst: "INITIAL"}, + {Name: "EXIT", Src: []string{"CONNECTED"}, Dst: "FINAL"}, }, fsm.Callbacks{ "before_event": func(e *fsm.Event) { log.WithFields(logrus.Fields{ "event": e.Event, - "src": e.Src, - "dst": e.Dst, + "src": e.Src, + "dst": e.Dst, }).Debug("state.sm starting transition") }, "enter_state": func(e *fsm.Event) { log.WithFields(logrus.Fields{ "event": e.Event, - "src": e.Src, - "dst": e.Dst, + "src": e.Src, + "dst": e.Dst, }).Debug("state.sm entering state") }, "leave_CONNECTED": func(e *fsm.Event) { From 7f6cc959c3423ff404615387416bbdeb1d86cf4a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 May 2022 15:17:42 +0200 Subject: [PATCH 1262/2352] [core] Improve error output of undeployed task descriptors --- core/task/descriptor.go | 10 +++++++--- core/task/manager.go | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/task/descriptor.go b/core/task/descriptor.go index 77a2483af..8be07021b 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -60,8 +60,12 @@ type Descriptor struct { type Descriptors []*Descriptor func (ds Descriptors) String() string { + return strings.Join(ds.StringSlice(), ", ") +} + +func (ds Descriptors) StringSlice() []string { if len(ds) == 0 { - return "" + return []string{} } lines := make([]string, len(ds)) for i, desc := range ds { @@ -69,9 +73,9 @@ func (ds Descriptors) String() string { lines[i] = "unknown" continue } - lines[i] = fmt.Sprintf("%s→%s", desc.TaskRole.GetPath(), desc.TaskClassName) + lines[i] = fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) } - return strings.Join(lines, ", ") + return lines } /* diff --git a/core/task/manager.go b/core/task/manager.go index 85d55f38b..7172c853d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -399,8 +399,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // with running this environment, but we keep the roles // running since they might be useful in the future. log.WithField("partition", envId). - WithField("undeployed", undeployedDescriptors.String()). Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + for _, v := range undeployedDescriptors.StringSlice() { + log.WithField("partition", envId). + Errorf("task deployment failure: %s", v) + } deploymentSuccess = false } From 7117032ed23b478b283e581d1767ee150c1a4719 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 May 2022 15:18:28 +0200 Subject: [PATCH 1263/2352] [core] Env deployment timeout is now governed by var deploy_timeout --- core/environment/transition_deploy.go | 40 +++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 37bde092d..cc140ae7c 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -200,10 +200,11 @@ func (t DeployTransition) do(env *Environment) (err error) { } } - deploymentTimeout := 90 * time.Second + deploymentTimeout := acquireDeploymentTimeout(wf) + wfStatus := wf.GetStatus() if wfStatus != task.ACTIVE { - log.Debug("waiting for workflow to become active") + log.Infof("waiting %s for workflow to become active", deploymentTimeout.String()) WORKFLOW_ACTIVE_LOOP: for { select { @@ -268,3 +269,38 @@ func (t DeployTransition) do(env *Environment) (err error) { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "DEPLOYED"}) return } + +func acquireDeploymentTimeout(wf workflow.Role) time.Duration { + envId := wf.GetEnvironmentId() + + var ( + cws map[string]string + err error + ) + deploymentTimeout := 90 * time.Second + cws, err = wf.ConsolidatedVarStack() + if err != nil { + log.WithField("partition", envId). + WithError(err). + Warnf("could not get consolidated variable stack, deploy_timeout defaulting to %s", deploymentTimeout.String()) + err = nil + } else { + deploymentTimeoutS, ok := cws["deploy_timeout"] + if ok { + var timeout time.Duration + timeout, err = time.ParseDuration(deploymentTimeoutS) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Warnf("variable deploy_timeout (%s) could not be parsed, defaulting to %s", deploymentTimeoutS, deploymentTimeout.String()) + err = nil + } else { + deploymentTimeout = timeout + } + } else { + log.WithField("partition", envId). + Warnf("variable deploy_timeout not provided, defaulting to %s", deploymentTimeout.String()) + } + } + return deploymentTimeout +} From 3eabd9f3a23637dcaf74dfb26fd498b4117999a7 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 25 May 2022 15:33:17 +0300 Subject: [PATCH 1264/2352] [task] Add a random sleep of up to 10s before each task for debugging purposes --- core/task/task.go | 77 ++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 35 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 3ff536507..6efcae812 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -32,6 +32,7 @@ package task import ( "errors" "fmt" + "math/rand" "strconv" "strings" "sync" @@ -54,7 +55,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(),"task") +var log = logger.New(logrus.StandardLogger(), "task") type parentRole interface { UpdateStatus(Status) @@ -73,11 +74,10 @@ type parentRole interface { SendEvent(event.Event) } - type Traits struct { - Trigger string - Await string - Timeout string + Trigger string + Await string + Timeout string Critical bool } @@ -103,32 +103,31 @@ type Task interface { GetMesosCommandTarget() controlcommands.MesosCommandTarget }*/ - type Task struct { - mu sync.RWMutex - parent parentRole - className string + mu sync.RWMutex + parent parentRole + className string //configuration Descriptor - name string - hostname string - agentId string - offerId string - taskId string - executorId string + name string + hostname string + agentId string + offerId string + taskId string + executorId string localBindMap channel.BindMap - status Status - state State - safeToStop bool + status Status + state State + safeToStop bool - properties gera.StringMap + properties gera.StringMap GetTaskClass func() *Class // ↑ to be filled in by NewTaskForMesosOffer in Manager - commandInfo *common.TaskCommandInfo - pid string + commandInfo *common.TaskCommandInfo + pid string } func (t *Task) IsSafeToStop() bool { @@ -163,11 +162,11 @@ func (t *Task) IsLocked() bool { t.mu.RLock() defer t.mu.RUnlock() return len(t.hostname) > 0 && - len(t.agentId) > 0 && - len(t.offerId) > 0 && - len(t.taskId) > 0 && - len(t.executorId) > 0 && - t.parent != nil + len(t.agentId) > 0 && + len(t.offerId) > 0 && + len(t.taskId) > 0 && + len(t.executorId) > 0 && + t.parent != nil } func (t *Task) GetName() string { @@ -196,11 +195,11 @@ func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { varStack := make(map[string]string) - varStack["task_name"] = t.GetName() - varStack["task_id"] = t.GetTaskId() - varStack["task_class_name"] = t.GetClassName() - varStack["task_hostname"] = t.GetHostname() - varStack["environment_id"] = role.GetEnvironmentId().String() + varStack["task_name"] = t.GetName() + varStack["task_id"] = t.GetTaskId() + varStack["task_class_name"] = t.GetClassName() + varStack["task_hostname"] = t.GetHostname() + varStack["environment_id"] = role.GetEnvironmentId().String() varStack["task_parent_role"] = role.GetPath() return varStack } @@ -310,12 +309,13 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { }, append( template.WrapSliceItems(cmd.Env), - template.WrapSliceItems(cmd.Arguments)... - )... + template.WrapSliceItems(cmd.Arguments)..., + )..., ) if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) } + // K42: cmd.Value has been respolved here err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} @@ -357,6 +357,13 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.Log = &none } + // We want each task to randomly sleep for a bit before it executes... + // TODO: for debugging only to be removed imminently + rand.Seed(time.Now().UnixNano()) + sleepFor := rand.Intn(10) + 1 // returns a number between [1-10] + + *cmd.Value = "sleep " + strconv.Itoa(sleepFor) + " && " + *cmd.Value + t.commandInfo = cmd } else { t.commandInfo = &common.TaskCommandInfo{} @@ -442,7 +449,7 @@ func (t *Task) SendEvent(ev event.Event) { defer t.mu.RUnlock() if t.parent == nil { - return + return } t.parent.SendEvent(ev) } @@ -645,4 +652,4 @@ func (t *Task) GetTask() *Task { defer t.mu.RUnlock() return t -} \ No newline at end of file +} From 88dd49c47e9669a6beab680e43f2ac7367f1c880 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 25 May 2022 15:41:24 +0200 Subject: [PATCH 1265/2352] [core] Improve core/scheduler debug output (utils.TimeTrack) --- common/utils/utils.go | 5 +- core/task/manager.go | 26 +++++++-- core/task/scheduler.go | 104 ++++++++++++++++++++++++++++++------ core/task/schedulerstate.go | 10 ++-- 4 files changed, 117 insertions(+), 28 deletions(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index b1bb2cb50..efd3e70a2 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -40,13 +40,12 @@ import ( "gopkg.in/yaml.v3" ) - func TimeTrack(start time.Time, name string, log *logrus.Entry) { if log == nil { - log = logger.New(logrus.StandardLogger(),"debug").WithPrefix("debug") + log = logger.New(logrus.StandardLogger(), "debug").WithPrefix("debug") } elapsed := time.Since(start) - log.Debugf("%s took %s", name, elapsed) + log.WithField("level", 11 /*devel*/).Debugf("%s took %s", name, elapsed) } func TimeTrackFunction(start time.Time, log *logrus.Entry) { diff --git a/core/task/manager.go b/core/task/manager.go index 7172c853d..e63460308 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -30,6 +30,7 @@ import ( "fmt" "io/ioutil" "strings" + "time" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" @@ -64,6 +65,11 @@ type ResourceOffersOutcome struct { undeployed Descriptors } +type ResourceOffersDeploymentRequest struct { + tasksToDeploy Descriptors + envId uid.ID +} + type Manager struct { ctx context.Context fidStore store.Singleton @@ -74,9 +80,10 @@ type Manager struct { roster *roster resourceOffersDone <-chan ResourceOffersOutcome - tasksToDeploy chan<- Descriptors - reviveOffersTrg chan struct{} - cq *controlcommands.CommandQueue + tasksToDeploy chan<- ResourceOffersDeploymentRequest + + reviveOffersTrg chan struct{} + cq *controlcommands.CommandQueue tasksLaunched int tasksFinished int @@ -345,6 +352,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } else { // task not claimed yet, we do so now tasksAlreadyRunning[taskPtr] = descriptor claimed = true + log.WithField("partition", envId.String()). + WithField("class", descriptor.TaskClassName). + WithField("task", taskPtr.className). + WithField("taskHost", taskPtr.hostname). + Warn("claiming existing unlocked task for incoming descriptor") break } } @@ -376,10 +388,16 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // First we ask Mesos to revive offers and block until done, then upon receiving // the offers, we ask Mesos to run the required roles - if any. + timeReviveOffers := time.Now() m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers <-m.reviveOffersTrg // we only continue when it's done + utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", log.WithField("tasksToRun", len(tasksToRun)).WithField("partition", envId)) + + m.tasksToDeploy <- ResourceOffersDeploymentRequest{ + tasksToDeploy: tasksToRun, + envId: envId, + } // blocks until received - m.tasksToDeploy <- tasksToRun // blocks until received log.WithField("partition", envId). Debugf("scheduler has received request to deploy %d tasks", len(tasksToRun)) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index b3e96412c..8ac6a64b0 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -39,6 +39,7 @@ import ( "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/schedutil" @@ -380,6 +381,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // Handler for Event_OFFERS func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { + timeResourceOffersCall := time.Now() var ( offers = e.GetOffers().GetOffers() callOption = calls.RefuseSeconds(time.Second) //calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) @@ -400,12 +402,19 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler").WithFields(logrus.Fields{ "offerIds": strings.Join(offerIds, ", "), //"offers": strings.Join(prettyOffers, "\n"), - }).Trace("received offers") + "offers": len(offerIds), + }). + Trace("received offers") } var descriptorsStillToDeploy Descriptors + envId := uid.NilID() + select { - case descriptorsStillToDeploy = <-state.tasksToDeploy: + case deploymentRequestPayload := <-state.tasksToDeploy: + descriptorsStillToDeploy = deploymentRequestPayload.tasksToDeploy + envId = deploymentRequestPayload.envId + if viper.GetBool("veryVerbose") { rolePaths := make([]string, len(descriptorsStillToDeploy)) taskClasses := make([]string, len(descriptorsStillToDeploy)) @@ -415,10 +424,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } log.WithPrefix("scheduler"). WithFields(logrus.Fields{ - "roles": strings.Join(rolePaths, ", "), - "classes": strings.Join(taskClasses, ", "), + "roles": strings.Join(rolePaths, ", "), + "classes": strings.Join(taskClasses, ", "), + "descriptors": len(descriptorsStillToDeploy), }). Debug("received descriptors for tasks to deploy on this offers round") + utils.TimeTrack(timeResourceOffersCall, "resourceOffers: start to descriptors channel receive", log.WithField("descriptors", len(descriptorsStillToDeploy))) } default: if viper.GetBool("veryVerbose") { @@ -427,6 +438,8 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } } + timeGotDescriptors := time.Now() + // by default we get ready to decline all offers offerIDsToDecline := make(map[mesos.OfferID]struct{}, len(offers)) for i := range offers { @@ -445,7 +458,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // Walk through the roles list and find out if the current []offers satisfies // what we need. - log.WithPrefix("scheduler").Debug("about to deploy workflow tasks") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Debug("about to deploy workflow tasks") var err error @@ -453,10 +468,16 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // fill it with the pre-computed total constraints for that Descriptor. descriptorConstraints := state.taskman.BuildDescriptorConstraints(descriptorsStillToDeploy) + utils.TimeTrack(timeGotDescriptors, "resourceOffers: descriptors channel receive to constraints built", log. + WithField("descriptors", len(descriptorsStillToDeploy)). + WithField("partition", envId.String())) + timeForOffers := time.Now() + // NOTE: 1 offer per host // FIXME: this for should be parallelized with a sync.WaitGroup // for a likely significant multinode launch performance increase for _, offer := range offers { + timeSingleOffer := time.Now() var ( remainingResourcesInOffer = mesos.Resources(offer.Resources) taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) @@ -476,7 +497,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithFields(logrus.Fields{ "offerId": offer.ID.Value, "resources": remainingResourcesInOffer.String(), - }).Trace("processing offer") + }). + WithField("partition", envId.String()). + Trace("processing offer") remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) @@ -490,7 +513,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } } - log.WithPrefix("scheduler").Trace("state lock to process descriptors to deploy") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("state lock to process descriptors to deploy") state.Lock() // We iterate down over the descriptors, and we remove them as we match @@ -516,8 +541,13 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han wants := state.taskman.GetWantsForDescriptor(descriptor) if wants == nil { - log.WithPrefix("scheduler").WithField("class", descriptor.TaskClassName). - Warning("no resource demands for descriptor, invalid class perhaps?") + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "class": descriptor.TaskClassName, + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Error("invalid task class: no resource demands for descriptor, WILL NOT BE DEPLOYED") continue } if !Resources(remainingResourcesInOffer).Satisfy(wants) { @@ -528,8 +558,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "wants": *wants, "offerId": offer.ID.Value, "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, }). - Trace("descriptor wants not satisfied by offer resources") + Warn("descriptor wants not satisfied by offer resources") } continue } @@ -737,7 +769,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han tasksDeployedForCurrentOffer[taskPtr] = descriptor } // end FOR_DESCRIPTORS state.Unlock() - log.WithPrefix("scheduler").Trace("state unlock") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("state unlock") // build ACCEPT call to launch all of the tasks we've assembled accept := calls.Accept( @@ -747,7 +781,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // send ACCEPT call to mesos err = calls.CallNoData(ctx, state.cli, accept) if err != nil { - log.WithPrefix("scheduler").WithField("error", err.Error()). + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("error", err.Error()). Error("failed to launch tasks") // FIXME: we probably need to react to a failed ACCEPT here } else { @@ -755,6 +791,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han tasksLaunchedThisCycle += n log.WithPrefix("scheduler"). WithField("tasks", n). + WithField("partition", envId.String()). WithField("level", infologger.IL_Support). Info("tasks launched") for _, taskInfo := range taskInfosToLaunchForCurrentOffer { @@ -766,6 +803,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "taskId": taskInfo.GetTaskID().Value, "level": infologger.IL_Devel, }). + WithField("partition", envId.String()). Debug("launched") } @@ -777,9 +815,23 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han offersDeclined++ } } + utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. + WithField("partition", envId.String()). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offersDeclined", len(offerIDsToDecline)). + WithField("offerHost", offer.Hostname)) + } // end for _, offerUsed := range offersUsed + + utils.TimeTrack(timeForOffers, "resourceOffers: constraints built to for_offers done", log. + WithField("partition", envId.String()). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offersDeclined", len(offerIDsToDecline))) } // end if len(descriptorsStillToDeploy) > 0 + timeBeforeDecline := time.Now() // build DECLINE call to reject offers we don't need any more declineSlice := make([]mesos.OfferID, len(offerIDsToDecline)) j := 0 @@ -792,14 +844,20 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if n := len(offerIDsToDecline); n > 0 { err := calls.CallNoData(ctx, state.cli, decline) if err != nil { - log.WithPrefix("scheduler").WithField("error", err.Error()). + log.WithPrefix("scheduler"). + WithField("error", err.Error()). + WithField("partition", envId.String()). Error("failed to decline tasks") } else { - log.WithPrefix("scheduler").WithField("offers", n). + log.WithPrefix("scheduler"). + WithField("offers", n). + WithField("partition", envId.String()). Trace("offers declined") } } else { - log.WithPrefix("scheduler").Trace("no offers to decline") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("no offers to decline") } // Notify listeners... @@ -807,10 +865,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han case state.resourceOffersDone <- ResourceOffersOutcome{tasksDeployed, descriptorsStillToDeploy}: log.WithPrefix("scheduler"). WithField("tasksDeployed", len(tasksDeployed)). + WithField("partition", envId.String()). Trace("notified listeners on resourceOffers done") default: if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). Trace("no listeners notified") } } @@ -823,11 +883,21 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } if tasksLaunchedThisCycle == 0 { if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler").Trace("offers cycle complete, no tasks launched") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("offers cycle complete, no tasks launched") } } else { - log.WithPrefix("scheduler").WithField("tasks", tasksLaunchedThisCycle).Debug("offers cycle complete, tasks launched") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("tasks", tasksLaunchedThisCycle). + Debug("offers cycle complete, tasks launched") } + utils.TimeTrack(timeBeforeDecline, "resourceOffers: decline-notify-return", log. + WithField("partition", envId.String()). + WithField("tasksLaunched", tasksLaunchedThisCycle). + WithField("offersDeclined", offersDeclined)) + return nil } } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 5e9c84157..b2fb6e016 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -62,9 +62,10 @@ type schedulerState struct { executor *mesos.ExecutorInfo reviveTokens <-chan struct{} resourceOffersDone chan ResourceOffersOutcome - tasksToDeploy chan Descriptors - reviveOffersTrg chan struct{} - random *rand.Rand + tasksToDeploy chan ResourceOffersDeploymentRequest + + reviveOffersTrg chan struct{} + random *rand.Rand // shouldn't change at runtime, so thread safe: role string @@ -100,7 +101,8 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( } resourceOffersDone := make(chan ResourceOffersOutcome) - tasksToDeploy := make(chan Descriptors) + tasksToDeploy := make(chan ResourceOffersDeploymentRequest) + reviveOffersTrg := make(chan struct{}) state := &schedulerState{ From 58457cef15d92c841139785b7b4ccf57a3acc96c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 May 2022 16:49:40 +0200 Subject: [PATCH 1266/2352] [executor] Ensure stdout/stderr pipes are closed --- executor/executable/controllabletask.go | 161 +++++++++++++----------- 1 file changed, 85 insertions(+), 76 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index eabc36e04..e119df4c9 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -47,22 +47,22 @@ import ( "google.golang.org/grpc/status" ) -const( - SIGTERM_TIMEOUT = 1*time.Second - SIGINT_TIMEOUT = 3*time.Second - KILL_TRANSITION_TIMEOUT = 1*time.Second - TRANSITION_TIMEOUT = 10*time.Second +const ( + SIGTERM_TIMEOUT = 1 * time.Second + SIGINT_TIMEOUT = 3 * time.Second + KILL_TRANSITION_TIMEOUT = 1 * time.Second + TRANSITION_TIMEOUT = 10 * time.Second ) type ControllableTask struct { taskBase - rpc *executorcmd.RpcClient + rpc *executorcmd.RpcClient pendingFinalTaskStateCh chan mesos.TaskState - knownPid int + knownPid int } type CommitResponse struct { - newState string + newState string transitionError error } @@ -72,13 +72,13 @@ func (t *ControllableTask) Launch() error { if err != nil { msg := "cannot build task command" log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). Error(msg) - t.sendStatus(mesos.TASK_FAILED, msg + ": " + err.Error()) + t.sendStatus(mesos.TASK_FAILED, msg+": "+err.Error()) return err } @@ -110,10 +110,10 @@ func (t *ControllableTask) Launch() error { "error": err.Error(), "command": tciCommandStr, }). - Error("failed to run task") + Error("failed to run task") t.sendStatus(mesos.TASK_FAILED, err.Error()) - _ = t.doKill(-taskCmd.Process.Pid) + _ = t.doTermIntKill(-taskCmd.Process.Pid) return } log.WithField("id", t.ti.TaskID.Value). @@ -166,9 +166,9 @@ func (t *ControllableTask) Launch() error { "path": taskCmd.Path, "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", "argc": len(taskCmd.Args), - "level": infologger.IL_Devel, + "level": infologger.IL_Devel, }). - Debug("starting gRPC client") + Debug("starting gRPC client") controlTransport := executorcmd.ProtobufTransport for _, v := range taskCmd.Args { @@ -184,24 +184,24 @@ func (t *ControllableTask) Launch() error { controlTransport, log.WithPrefix("executorcmd"). WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, "command": tciCommandStr, }, - ), + ), ) if t.rpc == nil { err = errors.New("rpc client is nil") log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "command": tciCommandStr, - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + "command": tciCommandStr, + }). Error("could not start gRPC client") t.sendStatus(mesos.TASK_FAILED, err.Error()) - t.doKill(-taskCmd.Process.Pid) + _ = t.doTermIntKill(-taskCmd.Process.Pid) return } t.rpc.TaskCmd = taskCmd @@ -209,30 +209,30 @@ func (t *ControllableTask) Launch() error { elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "elapsed": elapsed.String(), - "level": infologger.IL_Devel, - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "elapsed": elapsed.String(), + "level": infologger.IL_Devel, + }). Debug("polling task for IDLE state reached") response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithFields(logrus.Fields{ - "state": response.GetState(), - "task": t.ti.Name, + "state": response.GetState(), + "task": t.ti.Name, "command": tciCommandStr, }). Info("cannot query task status") } else { log.WithFields(logrus.Fields{ - "state": response.GetState(), - "task": t.ti.Name, - "command": tciCommandStr, - "level": infologger.IL_Devel, - }). + "state": response.GetState(), + "task": t.ti.Name, + "command": tciCommandStr, + "level": infologger.IL_Devel, + }). Debug("task status queried") t.knownPid = int(response.GetPid()) } @@ -256,6 +256,8 @@ func (t *ControllableTask) Launch() error { } _ = syscall.Kill(pid, syscall.SIGKILL) + _ = stdoutIn.Close() + _ = stderrIn.Close() log.WithField("task", t.ti.Name).Debug("task killed") t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") @@ -266,6 +268,10 @@ func (t *ControllableTask) Launch() error { t.sendStatus(mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() t.rpc = nil + + _ = stdoutIn.Close() + _ = stderrIn.Close() + return } else { log.WithField("task", t.ti.Name). @@ -297,7 +303,6 @@ func (t *ControllableTask) Launch() error { } else { t.sendMessage(jsonEvent) } - // Process events from task in yet another goroutine go func() { @@ -344,28 +349,28 @@ func (t *ControllableTask) Launch() error { "id": t.ti.TaskID.Value, "task": t.ti.Name, "command": tciCommandStr, - "level" : infologger.IL_Devel, + "level": infologger.IL_Devel, }).Debug("task done, preparing final update") pendingState := mesos.TASK_FINISHED if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "error": err.Error(), - "level": infologger.IL_Devel, - }). + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "error": err.Error(), + "level": infologger.IL_Devel, + }). Error("task terminated with error") log.WithField("level", infologger.IL_Support). Errorf("task terminated with error: %s %s", - tciCommandStr, - err.Error()) + tciCommandStr, + err.Error()) pendingState = mesos.TASK_FAILED } select { - case pending := <- t.pendingFinalTaskStateCh: + case pending := <-t.pendingFinalTaskStateCh: pendingState = pending default: } @@ -386,16 +391,16 @@ func (t *ControllableTask) Launch() error { "command": tciCommandStr, "level": infologger.IL_Devel, }). - Warning("failed to capture stdout or stderr of task") + Warning("failed to capture stdout or stderr of task") } t.sendStatus(pendingState, "") }() log.WithFields(logrus.Fields{ - "task": t.ti.Name, + "task": t.ti.Name, "level": infologger.IL_Devel, - }). + }). Debug("gRPC client running, handler forked") return nil } @@ -423,8 +428,8 @@ func (t *ControllableTask) Transition(cmd *executorcmd.ExecutorCommand_Transitio } func (t *ControllableTask) Kill() error { - var( - pid = 0 + var ( + pid = 0 reachedState = "UNKNOWN" // FIXME: should be LAUNCHING or similar ) cxt, cancel := context.WithTimeout(context.Background(), KILL_TRANSITION_TIMEOUT) @@ -433,7 +438,7 @@ func (t *ControllableTask) Kill() error { if err == nil { // we successfully got the state from the task log.WithField("nativeState", response.GetState()). WithField("taskId", t.ti.GetTaskID()). - WithField("level",infologger.IL_Devel). + WithField("level", infologger.IL_Devel). Debug("task status queried for upcoming soft kill") // NOTE: we acquire the transitioner-dependent STANDBY equivalent state @@ -477,12 +482,12 @@ func (t *ControllableTask) Kill() error { reachedState != "ERROR" { cmd := nextTransition(reachedState) log.WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - "level" : infologger.IL_Devel, - }). + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + "level": infologger.IL_Devel, + }). Debug("state DONE not reached, about to commit transition") // Call cmd.Commit() asynchronous @@ -567,10 +572,21 @@ func (t *ControllableTask) Kill() error { t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } - return t.doKill(pid) + return t.doTermIntKill(pid) +} + +func (t *ControllableTask) doKill9(pid int) error { + killErr := syscall.Kill(pid, syscall.SIGKILL) + if killErr != nil { + log.WithError(killErr). + WithField("taskId", t.ti.GetTaskID()). + Warning("task SIGKILL failed") + } + + return killErr } -func (t *ControllableTask) doKill(pid int) error { +func (t *ControllableTask) doTermIntKill(pid int) error { killErrCh := make(chan error) go func() { @@ -586,11 +602,11 @@ func (t *ControllableTask) doKill(pid int) error { // Set a small timeout to SIGTERM if SIGTERM fails or timeout passes, // we perform a SIGKILL. select { - case killErr := <- killErrCh: + case killErr := <-killErrCh: if killErr == nil { - time.Sleep(SIGTERM_TIMEOUT) // Waiting for the SIGTERM to kick in + time.Sleep(SIGTERM_TIMEOUT) // Waiting for the SIGTERM to kick in if pidExists(pid) { - // SIGINT for the "Waiting for graceful device shutdown. + // SIGINT for the "Waiting for graceful device shutdown. // Hit Ctrl-C again to abort immediately" message. killErr = syscall.Kill(pid, syscall.SIGINT) if killErr != nil { @@ -607,12 +623,5 @@ func (t *ControllableTask) doKill(pid int) error { case <-time.After(SIGTERM_TIMEOUT + SIGINT_TIMEOUT): } - killErr := syscall.Kill(pid, syscall.SIGKILL) - if killErr != nil { - log.WithError(killErr). - WithField("taskId", t.ti.GetTaskID()). - Warning("task SIGKILL failed") - } - - return killErr -} \ No newline at end of file + return t.doKill9(pid) +} From 08b86a1f9c59310b37e1f149fd8adcdafb44e001 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 May 2022 16:56:19 +0200 Subject: [PATCH 1267/2352] [build] Bump to v0.43.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8e1c3687b..4213bbf9e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 42 -VERSION_PATCH := 2 +VERSION_MINOR := 43 +VERSION_PATCH := 0 From e19e4a7243d56cee7fad5579dd26e528d169d21b Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 2 Jun 2022 14:37:55 +0200 Subject: [PATCH 1268/2352] [apricot][OCTRL-554] Apricot HTTP Service returns the complete result of /inventory/detectors. --- apricot/local/service.go | 18 + apricot/local/servicehttp.go | 63 ++- apricot/protos/apricot.pb.go | 845 ++++++++++++++++++------------ apricot/protos/apricot.proto | 9 + apricot/protos/apricot_grpc.pb.go | 36 ++ apricot/remote/remoteutil.go | 47 ++ apricot/remote/server.go | 21 +- apricot/remote/service.go | 21 +- configuration/service.go | 1 + 9 files changed, 688 insertions(+), 373 deletions(-) create mode 100644 apricot/remote/remoteutil.go diff --git a/apricot/local/service.go b/apricot/local/service.go index 31f1df728..52072ff52 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -174,6 +174,24 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) return hosts, err } +func (s *Service) GetDetectorsInventory() (inventory map[string][]string, err error) { + inventory = map[string][]string{} + detectors, err := s.ListDetectors(true) + if err != nil { + log.WithError(err).Error("could not retrieve detectors list") + return nil, err + } + for _, detector := range detectors { + hosts, err := s.GetHostInventory(detector) + if err != nil { + log.WithError(err).Error("could not retrieve hosts list") + return nil, err + } + inventory[detector] = hosts + } + return inventory, err +} + func (s *Service) GetVars() map[string]string { return s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "vars")) } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 59431c0c6..427775ba4 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -42,7 +42,7 @@ type HttpService struct { } func (httpsvc *HttpService) ApiGetFlps(w http.ResponseWriter, r *http.Request) { - httpsvc.ApiGetClusterInformation(w, r, "") + httpsvc.ApiGetHostInventory(w, r, "") } func (httpsvc *HttpService) ApiGetDetectorFlps(w http.ResponseWriter, r *http.Request) { @@ -52,36 +52,67 @@ func (httpsvc *HttpService) ApiGetDetectorFlps(w http.ResponseWriter, r *http.Re if err != nil { log.WithError(err).Warn("Error, the detector name provided is not valid.") } else { - httpsvc.ApiGetClusterInformation(w, r, detector) + httpsvc.ApiGetHostInventory(w, r, detector) } } -func (httpsvc *HttpService) ApiGetClusterInformation(w http.ResponseWriter, r *http.Request, detector string) { +func (httpsvc *HttpService) ApiGetHostInventory(w http.ResponseWriter, r *http.Request, detector string) { + hosts, err := httpsvc.svc.GetHostInventory(detector) + if err != nil { + log.WithError(err).Warn("Error, could not retrieve host list.") + } + httpsvc.ApiPrintClusterInformation(w, r, hosts, nil) +} + +func (httpsvc *HttpService) ApiGetDetectorsInventory(w http.ResponseWriter, r *http.Request) { + inventory, err := httpsvc.svc.GetDetectorsInventory() + if err != nil { + log.WithError(err).Warn("Error, could not retrieve detectors inventory list.") + } + httpsvc.ApiPrintClusterInformation(w, r, nil, inventory) +} + +func (httpsvc *HttpService) ApiPrintClusterInformation(w http.ResponseWriter, r *http.Request, hosts []string, inventory map[string][]string) { queryParam := mux.Vars(r) format := "" format = queryParam["format"] if format == "" { format = "text" } - keys, err := httpsvc.svc.GetHostInventory(detector) - if err != nil { - log.WithError(err).Warn("Error, could not retrieve host list.") - } switch format { case "json": w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) - hosts, err := json.MarshalIndent(keys, "", "\t") - if err != nil { - log.WithError(err).Warn("Error, could not marshal hosts.") + var result []byte + var err error + if hosts != nil { + result, err = json.MarshalIndent(hosts, "", "\t") + if err != nil { + log.WithError(err).Warn("Error, could not marshal hosts.") + } + } else if inventory != nil { + result, err = json.MarshalIndent(inventory, "", "\t") + if err != nil { + log.WithError(err).Warn("Error, could not marshal inventory.") + } } - fmt.Fprintln(w, string(hosts)) - case "text": fallthrough + fmt.Fprintln(w, string(result)) + case "text": + fallthrough default: w.Header().Set("Content-Type", "text/plain") w.WriteHeader(http.StatusOK) - for _, hostname := range keys { - fmt.Fprintf(w,"%s\n", hostname) + if hosts != nil { + for _, hostname := range hosts { + fmt.Fprintf(w, "%s\n", hostname) + } + } else if inventory != nil { + for detector, flps := range inventory { + fmt.Fprintf(w, "%s\n", detector) + for _, hostname := range flps { + fmt.Fprintf(w, "\t%s\n", hostname) + } + } } } } @@ -101,6 +132,10 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { apiFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) apiFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) apiFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiDetectors := router.PathPrefix("/inventory/detectors").Subrouter() + apiDetectors.HandleFunc("", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiDetectors.HandleFunc("/", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiDetectors.HandleFunc("/{format}", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) apiDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 033a72d08..515963e83 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.6.1 // source: protos/apricot.proto package apricotpb @@ -568,6 +568,100 @@ func (x *DetectorResponse) GetPayload() string { return "" } +type DetectorInventoryResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Flps []string `protobuf:"bytes,1,rep,name=flps,proto3" json:"flps,omitempty"` +} + +func (x *DetectorInventoryResponse) Reset() { + *x = DetectorInventoryResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorInventoryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorInventoryResponse) ProtoMessage() {} + +func (x *DetectorInventoryResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorInventoryResponse.ProtoReflect.Descriptor instead. +func (*DetectorInventoryResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{8} +} + +func (x *DetectorInventoryResponse) GetFlps() []string { + if x != nil { + return x.Flps + } + return nil +} + +type DetectorEntriesResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + DetectorEntries map[string]*DetectorInventoryResponse `protobuf:"bytes,1,rep,name=detectorEntries,proto3" json:"detectorEntries,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *DetectorEntriesResponse) Reset() { + *x = DetectorEntriesResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorEntriesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorEntriesResponse) ProtoMessage() {} + +func (x *DetectorEntriesResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorEntriesResponse.ProtoReflect.Descriptor instead. +func (*DetectorEntriesResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{9} +} + +func (x *DetectorEntriesResponse) GetDetectorEntries() map[string]*DetectorInventoryResponse { + if x != nil { + return x.DetectorEntries + } + return nil +} + type RunNumberResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -579,7 +673,7 @@ type RunNumberResponse struct { func (x *RunNumberResponse) Reset() { *x = RunNumberResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -592,7 +686,7 @@ func (x *RunNumberResponse) String() string { func (*RunNumberResponse) ProtoMessage() {} func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[8] + mi := &file_protos_apricot_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -605,7 +699,7 @@ func (x *RunNumberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RunNumberResponse.ProtoReflect.Descriptor instead. func (*RunNumberResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{8} + return file_protos_apricot_proto_rawDescGZIP(), []int{10} } func (x *RunNumberResponse) GetRunNumber() uint32 { @@ -626,7 +720,7 @@ type StringMap struct { func (x *StringMap) Reset() { *x = StringMap{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -639,7 +733,7 @@ func (x *StringMap) String() string { func (*StringMap) ProtoMessage() {} func (x *StringMap) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[9] + mi := &file_protos_apricot_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -652,7 +746,7 @@ func (x *StringMap) ProtoReflect() protoreflect.Message { // Deprecated: Use StringMap.ProtoReflect.Descriptor instead. func (*StringMap) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{9} + return file_protos_apricot_proto_rawDescGZIP(), []int{11} } func (x *StringMap) GetStringMap() map[string]string { @@ -673,7 +767,7 @@ type RawGetRecursiveRequest struct { func (x *RawGetRecursiveRequest) Reset() { *x = RawGetRecursiveRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -686,7 +780,7 @@ func (x *RawGetRecursiveRequest) String() string { func (*RawGetRecursiveRequest) ProtoMessage() {} func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[10] + mi := &file_protos_apricot_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -699,7 +793,7 @@ func (x *RawGetRecursiveRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RawGetRecursiveRequest.ProtoReflect.Descriptor instead. func (*RawGetRecursiveRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{10} + return file_protos_apricot_proto_rawDescGZIP(), []int{12} } func (x *RawGetRecursiveRequest) GetRawPath() string { @@ -721,7 +815,7 @@ type GetRuntimeEntryRequest struct { func (x *GetRuntimeEntryRequest) Reset() { *x = GetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -734,7 +828,7 @@ func (x *GetRuntimeEntryRequest) String() string { func (*GetRuntimeEntryRequest) ProtoMessage() {} func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[11] + mi := &file_protos_apricot_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -747,7 +841,7 @@ func (x *GetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*GetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{11} + return file_protos_apricot_proto_rawDescGZIP(), []int{13} } func (x *GetRuntimeEntryRequest) GetComponent() string { @@ -777,7 +871,7 @@ type SetRuntimeEntryRequest struct { func (x *SetRuntimeEntryRequest) Reset() { *x = SetRuntimeEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +884,7 @@ func (x *SetRuntimeEntryRequest) String() string { func (*SetRuntimeEntryRequest) ProtoMessage() {} func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[12] + mi := &file_protos_apricot_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +897,7 @@ func (x *SetRuntimeEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRuntimeEntryRequest.ProtoReflect.Descriptor instead. func (*SetRuntimeEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{12} + return file_protos_apricot_proto_rawDescGZIP(), []int{14} } func (x *SetRuntimeEntryRequest) GetComponent() string { @@ -838,7 +932,7 @@ type GetEntryRequest struct { func (x *GetEntryRequest) Reset() { *x = GetEntryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -851,7 +945,7 @@ func (x *GetEntryRequest) String() string { func (*GetEntryRequest) ProtoMessage() {} func (x *GetEntryRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[13] + mi := &file_protos_apricot_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -864,7 +958,7 @@ func (x *GetEntryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEntryRequest.ProtoReflect.Descriptor instead. func (*GetEntryRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{13} + return file_protos_apricot_proto_rawDescGZIP(), []int{15} } func (x *GetEntryRequest) GetKey() string { @@ -885,7 +979,7 @@ type ListRuntimeEntriesRequest struct { func (x *ListRuntimeEntriesRequest) Reset() { *x = ListRuntimeEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -898,7 +992,7 @@ func (x *ListRuntimeEntriesRequest) String() string { func (*ListRuntimeEntriesRequest) ProtoMessage() {} func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[14] + mi := &file_protos_apricot_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -911,7 +1005,7 @@ func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRuntimeEntriesRequest.ProtoReflect.Descriptor instead. func (*ListRuntimeEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{14} + return file_protos_apricot_proto_rawDescGZIP(), []int{16} } func (x *ListRuntimeEntriesRequest) GetComponent() string { @@ -934,7 +1028,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -947,7 +1041,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[15] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -960,7 +1054,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{15} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -999,7 +1093,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1012,7 +1106,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1025,7 +1119,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -1083,7 +1177,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1096,7 +1190,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1109,7 +1203,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -1130,7 +1224,7 @@ type DetectorsRequest struct { func (x *DetectorsRequest) Reset() { *x = DetectorsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1143,7 +1237,7 @@ func (x *DetectorsRequest) String() string { func (*DetectorsRequest) ProtoMessage() {} func (x *DetectorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1156,7 +1250,7 @@ func (x *DetectorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsRequest.ProtoReflect.Descriptor instead. func (*DetectorsRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *DetectorsRequest) GetGetAll() bool { @@ -1177,7 +1271,7 @@ type DetectorsResponse struct { func (x *DetectorsResponse) Reset() { *x = DetectorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1284,7 @@ func (x *DetectorsResponse) String() string { func (*DetectorsResponse) ProtoMessage() {} func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,7 +1297,7 @@ func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsResponse.ProtoReflect.Descriptor instead. func (*DetectorsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *DetectorsResponse) GetDetectors() []string { @@ -1224,7 +1318,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1237,7 +1331,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1250,7 +1344,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{22} } func (x *HostGetRequest) GetDetector() string { @@ -1271,7 +1365,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1284,7 +1378,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1297,7 +1391,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{21} + return file_protos_apricot_proto_rawDescGZIP(), []int{23} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1321,7 +1415,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1334,7 +1428,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1347,7 +1441,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{22} + return file_protos_apricot_proto_rawDescGZIP(), []int{24} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1391,7 +1485,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1404,7 +1498,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1417,7 +1511,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{23} + return file_protos_apricot_proto_rawDescGZIP(), []int{25} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1452,7 +1546,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1465,7 +1559,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1478,7 +1572,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{24} + return file_protos_apricot_proto_rawDescGZIP(), []int{26} } func (x *CRUCardsResponse) GetCards() string { @@ -1500,7 +1594,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1513,7 +1607,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1526,7 +1620,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{25} + return file_protos_apricot_proto_rawDescGZIP(), []int{27} } func (x *CardRequest) GetHostname() string { @@ -1554,7 +1648,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[26] + mi := &file_protos_apricot_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1567,7 +1661,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[26] + mi := &file_protos_apricot_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1580,7 +1674,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{26} + return file_protos_apricot_proto_rawDescGZIP(), []int{28} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1640,216 +1734,238 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, - 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x0a, 0x19, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x17, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x66, 0x0a, 0x14, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x31, + 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, + 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, + 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, + 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x39, 0x0a, 0x19, 0x4c, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0f, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x22, 0x39, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, + 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, + 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, + 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, + 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, + 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, + 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, + 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, + 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, + 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, + 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, + 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, + 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, + 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, + 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, + 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xd7, 0x0c, 0x0a, 0x07, 0x41, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, + 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, + 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, - 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, - 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, - 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, - 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, - 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, - 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, - 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, - 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, - 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x10, 0x07, 0x32, 0x8a, 0x0c, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, - 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, - 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, + 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, - 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, + 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, - 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1865,7 +1981,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -1876,79 +1992,86 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*HostRequest)(nil), // 6: apricot.HostRequest (*HostsRequest)(nil), // 7: apricot.HostsRequest (*DetectorResponse)(nil), // 8: apricot.DetectorResponse - (*RunNumberResponse)(nil), // 9: apricot.RunNumberResponse - (*StringMap)(nil), // 10: apricot.StringMap - (*RawGetRecursiveRequest)(nil), // 11: apricot.RawGetRecursiveRequest - (*GetRuntimeEntryRequest)(nil), // 12: apricot.GetRuntimeEntryRequest - (*SetRuntimeEntryRequest)(nil), // 13: apricot.SetRuntimeEntryRequest - (*GetEntryRequest)(nil), // 14: apricot.GetEntryRequest - (*ListRuntimeEntriesRequest)(nil), // 15: apricot.ListRuntimeEntriesRequest - (*ComponentEntriesQuery)(nil), // 16: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 17: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 18: apricot.ComponentEntriesResponse - (*DetectorsRequest)(nil), // 19: apricot.DetectorsRequest - (*DetectorsResponse)(nil), // 20: apricot.DetectorsResponse - (*HostGetRequest)(nil), // 21: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 22: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 23: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 24: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 25: apricot.CRUCardsResponse - (*CardRequest)(nil), // 26: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 27: apricot.CRUCardEndpointResponse - nil, // 28: apricot.ComponentRequest.VarStackEntry - nil, // 29: apricot.StringMap.StringMapEntry + (*DetectorInventoryResponse)(nil), // 9: apricot.DetectorInventoryResponse + (*DetectorEntriesResponse)(nil), // 10: apricot.DetectorEntriesResponse + (*RunNumberResponse)(nil), // 11: apricot.RunNumberResponse + (*StringMap)(nil), // 12: apricot.StringMap + (*RawGetRecursiveRequest)(nil), // 13: apricot.RawGetRecursiveRequest + (*GetRuntimeEntryRequest)(nil), // 14: apricot.GetRuntimeEntryRequest + (*SetRuntimeEntryRequest)(nil), // 15: apricot.SetRuntimeEntryRequest + (*GetEntryRequest)(nil), // 16: apricot.GetEntryRequest + (*ListRuntimeEntriesRequest)(nil), // 17: apricot.ListRuntimeEntriesRequest + (*ComponentEntriesQuery)(nil), // 18: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 19: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 20: apricot.ComponentEntriesResponse + (*DetectorsRequest)(nil), // 21: apricot.DetectorsRequest + (*DetectorsResponse)(nil), // 22: apricot.DetectorsResponse + (*HostGetRequest)(nil), // 23: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 24: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 25: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 26: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 27: apricot.CRUCardsResponse + (*CardRequest)(nil), // 28: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 29: apricot.CRUCardEndpointResponse + nil, // 30: apricot.ComponentRequest.VarStackEntry + nil, // 31: apricot.DetectorEntriesResponse.DetectorEntriesEntry + nil, // 32: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 28, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 29, // 3: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry - 0, // 4: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 16, // 5: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery - 2, // 6: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery - 1, // 7: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty - 1, // 8: apricot.Apricot.GetDefaults:input_type -> apricot.Empty - 1, // 9: apricot.Apricot.GetVars:input_type -> apricot.Empty - 11, // 10: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 19, // 11: apricot.Apricot.ListDetectors:input_type -> apricot.DetectorsRequest - 21, // 12: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest - 6, // 13: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest - 7, // 14: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest - 6, // 15: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 26, // 16: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest - 12, // 17: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 13, // 18: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 15, // 19: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 1, // 20: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 17, // 21: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 22: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 23: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 3, // 24: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 23, // 25: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 9, // 26: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 10, // 27: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 10, // 28: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 29: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 20, // 30: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 22, // 31: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 8, // 32: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 20, // 33: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 25, // 34: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 27, // 35: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 36: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 37: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 18, // 38: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 18, // 39: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 18, // 40: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 18, // 41: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 42: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 43: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 24, // 44: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 26, // [26:45] is the sub-list for method output_type - 7, // [7:26] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 30, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 31, // 3: apricot.DetectorEntriesResponse.detectorEntries:type_name -> apricot.DetectorEntriesResponse.DetectorEntriesEntry + 32, // 4: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 0, // 5: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType + 18, // 6: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 2, // 7: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery + 9, // 8: apricot.DetectorEntriesResponse.DetectorEntriesEntry.value:type_name -> apricot.DetectorInventoryResponse + 1, // 9: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty + 1, // 10: apricot.Apricot.GetDefaults:input_type -> apricot.Empty + 1, // 11: apricot.Apricot.GetVars:input_type -> apricot.Empty + 13, // 12: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest + 21, // 13: apricot.Apricot.ListDetectors:input_type -> apricot.DetectorsRequest + 23, // 14: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 1, // 15: apricot.Apricot.GetDetectorsInventory:input_type -> apricot.Empty + 6, // 16: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest + 7, // 17: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest + 6, // 18: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest + 28, // 19: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 14, // 20: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 15, // 21: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 17, // 22: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 1, // 23: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 19, // 24: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 25: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 26: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest + 25, // 28: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 11, // 29: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 30: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 31: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 32: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 22, // 33: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 24, // 34: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 35: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 36: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 22, // 37: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 27, // 38: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 29, // 39: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 40: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 41: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 20, // 42: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 43: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 20, // 44: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 45: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 46: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 47: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 26, // 48: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 29, // [29:49] is the sub-list for method output_type + 9, // [9:29] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_protos_apricot_proto_init() } @@ -2054,7 +2177,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunNumberResponse); i { + switch v := v.(*DetectorInventoryResponse); i { case 0: return &v.state case 1: @@ -2066,7 +2189,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StringMap); i { + switch v := v.(*DetectorEntriesResponse); i { case 0: return &v.state case 1: @@ -2078,7 +2201,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RawGetRecursiveRequest); i { + switch v := v.(*RunNumberResponse); i { case 0: return &v.state case 1: @@ -2090,7 +2213,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuntimeEntryRequest); i { + switch v := v.(*StringMap); i { case 0: return &v.state case 1: @@ -2102,7 +2225,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRuntimeEntryRequest); i { + switch v := v.(*RawGetRecursiveRequest); i { case 0: return &v.state case 1: @@ -2114,7 +2237,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEntryRequest); i { + switch v := v.(*GetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -2126,7 +2249,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRuntimeEntriesRequest); i { + switch v := v.(*SetRuntimeEntryRequest); i { case 0: return &v.state case 1: @@ -2138,7 +2261,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*GetEntryRequest); i { case 0: return &v.state case 1: @@ -2150,7 +2273,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*ListRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -2162,7 +2285,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -2174,7 +2297,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsRequest); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -2186,7 +2309,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsResponse); i { + switch v := v.(*ComponentEntriesResponse); i { case 0: return &v.state case 1: @@ -2198,7 +2321,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*DetectorsRequest); i { case 0: return &v.state case 1: @@ -2210,7 +2333,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*DetectorsResponse); i { case 0: return &v.state case 1: @@ -2222,7 +2345,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -2234,7 +2357,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -2246,7 +2369,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -2258,7 +2381,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -2270,6 +2393,30 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CRUCardsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -2286,7 +2433,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[16].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[18].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -2296,7 +2443,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 29, + NumMessages: 32, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index a4407164a..f77c1e641 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -37,6 +37,7 @@ service Apricot { // Detectors and host inventories rpc ListDetectors(DetectorsRequest) returns (DetectorsResponse) {} rpc GetHostInventory(HostGetRequest) returns (HostEntriesResponse) {} + rpc GetDetectorsInventory(Empty) returns (DetectorEntriesResponse) {} rpc GetDetectorForHost(HostRequest) returns (DetectorResponse) {} rpc GetDetectorsForHosts(HostsRequest) returns (DetectorsResponse) {} rpc GetCRUCardsForHost(HostRequest) returns (CRUCardsResponse) {} @@ -107,6 +108,14 @@ message DetectorResponse { string payload = 1; } +message DetectorInventoryResponse { + repeated string flps = 1; +} + +message DetectorEntriesResponse { + map detectorEntries = 1; +} + message RunNumberResponse { uint32 runNumber = 1; } diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 45455362b..739ff40c7 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -25,6 +25,7 @@ type ApricotClient interface { // Detectors and host inventories ListDetectors(ctx context.Context, in *DetectorsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) + GetDetectorsInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorEntriesResponse, error) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) @@ -104,6 +105,15 @@ func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest return out, nil } +func (c *apricotClient) GetDetectorsInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorEntriesResponse, error) { + out := new(DetectorEntriesResponse) + err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorsInventory", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) { out := new(DetectorResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorForHost", in, out, opts...) @@ -232,6 +242,7 @@ type ApricotServer interface { // Detectors and host inventories ListDetectors(context.Context, *DetectorsRequest) (*DetectorsResponse, error) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) + GetDetectorsInventory(context.Context, *Empty) (*DetectorEntriesResponse, error) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) GetDetectorsForHosts(context.Context, *HostsRequest) (*DetectorsResponse, error) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) @@ -271,6 +282,9 @@ func (UnimplementedApricotServer) ListDetectors(context.Context, *DetectorsReque func (UnimplementedApricotServer) GetHostInventory(context.Context, *HostGetRequest) (*HostEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetHostInventory not implemented") } +func (UnimplementedApricotServer) GetDetectorsInventory(context.Context, *Empty) (*DetectorEntriesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetDetectorsInventory not implemented") +} func (UnimplementedApricotServer) GetDetectorForHost(context.Context, *HostRequest) (*DetectorResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetDetectorForHost not implemented") } @@ -430,6 +444,24 @@ func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_GetDetectorsInventory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetDetectorsInventory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/GetDetectorsInventory", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetDetectorsInventory(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(HostRequest) if err := dec(in); err != nil { @@ -695,6 +727,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetHostInventory", Handler: _Apricot_GetHostInventory_Handler, }, + { + MethodName: "GetDetectorsInventory", + Handler: _Apricot_GetDetectorsInventory_Handler, + }, { MethodName: "GetDetectorForHost", Handler: _Apricot_GetDetectorForHost_Handler, diff --git a/apricot/remote/remoteutil.go b/apricot/remote/remoteutil.go new file mode 100644 index 000000000..126bca90d --- /dev/null +++ b/apricot/remote/remoteutil.go @@ -0,0 +1,47 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package remote + +import apricotpb "github.com/AliceO2Group/Control/apricot/protos" + +func DetectorInventoryToPbDetectorInventory(inventory map[string][]string) map[string]*apricotpb.DetectorInventoryResponse { + response := make(map[string]*apricotpb.DetectorInventoryResponse) + var inventoryResp *apricotpb.DetectorInventoryResponse + for det, flps := range inventory { + inventoryResp = &apricotpb.DetectorInventoryResponse{ + Flps: flps, + } + response[det] = inventoryResp + } + return response +} + +func PbDetectorInventoryToDetectorInventory(inventory map[string]*apricotpb.DetectorInventoryResponse) map[string][]string { + response := make(map[string][]string) + for det, flps := range inventory { + response[det] = flps.Flps + } + return response +} diff --git a/apricot/remote/server.go b/apricot/remote/server.go index e7b2a6ff4..763e78f88 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -41,12 +41,12 @@ import ( "google.golang.org/grpc/status" ) -var log = logger.New(logrus.StandardLogger(),"apricot") +var log = logger.New(logrus.StandardLogger(), "apricot") -var( - E_OK = status.New(codes.OK, "") +var ( + E_OK = status.New(codes.OK, "") E_CONFIGURATION_BACKEND_UNAVAILABLE = status.Errorf(codes.Internal, "configuration backend unavailable") - E_BAD_INPUT = status.Errorf(codes.InvalidArgument, "bad request received") + E_BAD_INPUT = status.Errorf(codes.InvalidArgument, "bad request received") ) type RpcServer struct { @@ -337,6 +337,19 @@ func (m *RpcServer) GetHostInventory(_ context.Context, request *apricotpb.HostG return &apricotpb.HostEntriesResponse{Hosts: entries}, nil } +func (m *RpcServer) GetDetectorsInventory(_ context.Context, _ *apricotpb.Empty) (*apricotpb.DetectorEntriesResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + entries, err := m.service.GetDetectorsInventory() + if err != nil { + return nil, err + } + return &apricotpb.DetectorEntriesResponse{DetectorEntries: DetectorInventoryToPbDetectorInventory(entries)}, nil +} + func (m *RpcServer) ListComponents(_ context.Context, _ *apricotpb.Empty) (*apricotpb.ComponentEntriesResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index f54c1371f..af9fe8950 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -37,7 +37,7 @@ import ( "google.golang.org/grpc" ) -const CALL_TIMEOUT = 10*time.Second +const CALL_TIMEOUT = 10 * time.Second type RemoteService struct { cli rpcClient @@ -112,7 +112,7 @@ func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Qu Timestamp: query.Timestamp, } request := &apricotpb.ComponentRequest{ - QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, + QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, ProcessTemplate: processTemplate, VarStack: varStack, } @@ -133,7 +133,7 @@ func (c *RemoteService) getComponentConfigurationInternalWithLastIndex(query *co Timestamp: query.Timestamp, } request := &apricotpb.ComponentRequest{ - QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, + QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, ProcessTemplate: processTemplate, VarStack: varStack, } @@ -195,7 +195,7 @@ func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards string, err e func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (cards string, err error) { var response *apricotpb.CRUCardEndpointResponse request := &apricotpb.CardRequest{ - Hostname: hostname, + Hostname: hostname, CardSerial: cardSerial, } response, err = c.cli.GetEndpointsForCRUCard(context.Background(), request, grpc.EmptyCallOption{}) @@ -262,6 +262,16 @@ func (c *RemoteService) GetHostInventory(detector string) (hosts []string, err e return response.GetHosts(), nil } +func (c *RemoteService) GetDetectorsInventory() (inventory map[string][]string, err error) { + var response *apricotpb.DetectorEntriesResponse + response, err = c.cli.GetDetectorsInventory(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + inventory = PbDetectorInventoryToDetectorInventory(response.GetDetectorEntries()) + return +} + func (c *RemoteService) ListComponents() (components []string, err error) { var response *apricotpb.ComponentEntriesResponse response, err = c.cli.ListComponents(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) @@ -313,7 +323,7 @@ func (c *RemoteService) ListComponentEntryHistory(query *componentcfg.Query) (en func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { var response *apricotpb.ImportComponentConfigurationResponse request := &apricotpb.ImportComponentConfigurationRequest{ - Query: &apricotpb.ComponentQuery{ + Query: &apricotpb.ComponentQuery{ Component: query.Component, RunType: query.RunType, MachineRole: query.RoleName, @@ -325,7 +335,6 @@ func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, UseVersioning: useVersioning, } - response, err = c.cli.ImportComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { return diff --git a/configuration/service.go b/configuration/service.go index 97616b859..c167df847 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -45,6 +45,7 @@ type Service interface { ListDetectors(getAll bool) (detectors []string, err error) GetHostInventory(detector string) (hosts []string, err error) + GetDetectorsInventory() (inventory map[string][]string, err error) ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) From 353325d6e3cc23c6dac135569ae650bbe7dc63b3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Jun 2022 11:12:54 +0200 Subject: [PATCH 1269/2352] [core] Ensure the run number is correctly returned before_START_ACTIVITY --- core/environment/environment.go | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 88ad43549..8c2e06a9f 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -80,7 +80,7 @@ type Environment struct { callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap - autoStopTimer *time.Timer + autoStopTimer *time.Timer } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -247,7 +247,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { if scheduled { log.WithField("partition", env.id). WithField("run", env.currentRunNumber). - Infof("auto stop transition scheduled, expected execution at %s",expected) + Infof("auto stop transition scheduled, expected execution at %s", expected) } } else if e.Event == "STOP_ACTIVITY" { @@ -653,9 +653,6 @@ func (env *Environment) GetCurrentRunNumber() (rn uint32) { env.Mu.RLock() defer env.Mu.RUnlock() - if env.Sm.Current() != "RUNNING" { - return 0 - } return env.currentRunNumber } From ce2d917d8173d4e7732b1073bcd2c81e8ec167f6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jun 2022 14:30:50 +0200 Subject: [PATCH 1270/2352] [core] Improved logging and timetracking in scheduler, taskman, cmdq --- core/controlcommands/commandqueue.go | 5 +++- core/task/manager.go | 5 +++- core/task/scheduler.go | 35 +++++++++++++++++----------- 3 files changed, 30 insertions(+), 15 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 8ff6d72b6..be402da0e 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -117,7 +117,10 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon if m == nil { return nil, errors.New("command queue is nil") } - defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), log.WithPrefix("cmdq")) + log.WithPrefix("cmdq").Debug("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) + defer utils.TimeTrack(time.Now(), + fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), + log.WithPrefix("cmdq")) type responseSemaphore struct { receiver MesosCommandTarget diff --git a/core/task/manager.go b/core/task/manager.go index e63460308..9f89958cb 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -746,6 +746,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { log.WithField("taskId", taskId). WithField("mesosStatus", status.GetState().String()). WithField("level", infologger.IL_Devel). + WithField("status", status.GetState().String()). + WithField("reason", status.GetReason().String()). Warn("attempted status update of task not in roster") } if val, ok := m.ackKilledTasks.getValue(taskId); ok { @@ -760,7 +762,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { log.WithField("taskId", taskId). WithField("name", taskPtr.GetName()). WithField("level", infologger.IL_Devel). - Debug("task running") + WithField("cmd", taskPtr.GetTaskClass().Command.GetValue()). + Debug("task active (received TASK_RUNNING event from executor)") taskPtr.status = ACTIVE if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateStatus(ACTIVE) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 8ac6a64b0..72a6430e1 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -428,7 +428,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "classes": strings.Join(taskClasses, ", "), "descriptors": len(descriptorsStillToDeploy), }). - Debug("received descriptors for tasks to deploy on this offers round") + Debugf("received %d descriptors for tasks to deploy on this offers round", len(deploymentRequestPayload.tasksToDeploy)) utils.TimeTrack(timeResourceOffersCall, "resourceOffers: start to descriptors channel receive", log.WithField("descriptors", len(descriptorsStillToDeploy))) } default: @@ -793,7 +793,8 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("tasks", n). WithField("partition", envId.String()). WithField("level", infologger.IL_Support). - Info("tasks launched") + WithField("offerHost", offer.Hostname). + Infof("launch request sent to %s: %d tasks", offer.Hostname, n) for _, taskInfo := range taskInfosToLaunchForCurrentOffer { log.WithPrefix("scheduler"). WithFields(logrus.Fields{ @@ -803,8 +804,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "taskId": taskInfo.GetTaskID().Value, "level": infologger.IL_Devel, }). + WithField("offerHost", offer.Hostname). WithField("partition", envId.String()). - Debug("launched") + Debug("task launch requested") } // update deployment map @@ -822,7 +824,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("offersDeclined", len(offerIDsToDecline)). WithField("offerHost", offer.Hostname)) - } // end for _, offerUsed := range offersUsed + } // end for _, offer := range offers utils.TimeTrack(timeForOffers, "resourceOffers: constraints built to for_offers done", log. WithField("partition", envId.String()). @@ -923,15 +925,22 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { // log.WithPrefix("scheduler").Debug("state lock") state.metricsAPI.tasksFinished() - // FIXME: this should not quit when all tasks are done, but rather do some transition - /* - if state.tasksFinished == state.totalTasks { - log.Println("Mission accomplished, all tasks completed. Terminating scheduler.") - state.shutdown() - } else { - state.tryReviveOffers(ctx) - }*/ - // log.WithPrefix("scheduler").Debug("state unlock") + // FIXME: this should not quit when all tasks are done, but rather do some transition + /* + if state.tasksFinished == state.totalTasks { + log.Println("Mission accomplished, all tasks completed. Terminating scheduler.") + state.shutdown() + } else { + state.tryReviveOffers(ctx) + }*/ + // log.WithPrefix("scheduler").Debug("state unlock") + case mesos.TASK_RUNNING: + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "taskId": s.TaskID.GetValue(), + "state": s.GetState().String(), + "message": s.GetMessage(), + }).Trace("task status update received") } taskmanMessage := NewTaskStatusMessage(s) From 23e00eda5c586b5ac261f858010872710d4ef053 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jun 2022 14:35:31 +0200 Subject: [PATCH 1271/2352] [executor] Launch refactor + improved logging and timetracking --- executor/eventloop.go | 107 +++++++++++++++++++ executor/executable/controllabletask.go | 83 ++++++++++++++- executor/executable/task.go | 95 +++++++++-------- executor/executor.go | 136 ++++++------------------ executor/handlers.go | 47 +++++++- 5 files changed, 314 insertions(+), 154 deletions(-) create mode 100644 executor/eventloop.go diff --git a/executor/eventloop.go b/executor/eventloop.go new file mode 100644 index 000000000..65cdf0755 --- /dev/null +++ b/executor/eventloop.go @@ -0,0 +1,107 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executor + +import ( + "context" + + "github.com/mesos/mesos-go/api/v1/lib/encoding" + "github.com/mesos/mesos-go/api/v1/lib/executor" + "github.com/mesos/mesos-go/api/v1/lib/executor/events" + "github.com/sirupsen/logrus" +) + +// nextEventNotify blocks waiting for an incoming event. When an event arrives, it is sent back via +// the eventCh channel, and the function quits. +func nextEventNotify(decoder encoding.Decoder, eventCh chan<- executor.Event, errorCh chan<- error) { + log.Trace("EVENT LOOP nextEventNotify start") + var e executor.Event + var err error + if err = decoder.Decode(&e); err == nil { + eventCh <- e + } else { + errorCh <- err + } +} + +// eventLoop dispatches incoming events from mesos-agent to the events.Handler (built in buildEventhandler). +func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) (err error) { + log.Trace("listening for events from agent") + ctx := context.TODO() // dummy context + + // The decoder object is the response obtained from the Mesos slave subscription. We use decoder.Decode + // to acquire the next event from Mesos. Unfortunately this call blocks, so we rather keep it in a separate + // goroutine and only pipe single events into the main loop as they come. + errorCh := make(chan error) // errors come through here + eventCh := make(chan executor.Event) // events from Mesos come through here + + // Spawn a goroutine to wait for the first event + go nextEventNotify(decoder, eventCh, errorCh) + + for err == nil && !state.shouldQuit { + log.Trace("EVENT LOOP begin new main event loop iteration") + // housekeeping + sendFailedTasks(state) + + select { + case e := <-eventCh: + log.Trace("EVENT LOOP about to handle event") + err = h.HandleEvent(ctx, &e) + + // Spawn a goroutine to wait for the next event + go nextEventNotify(decoder, eventCh, errorCh) + case err = <-errorCh: + log.Trace("EVENT LOOP got error") + // Any error coming through here should immediately destroy the event loop and return + // control to the Mesos subscription handling. + case status := <-state.statusCh: + handleStatusUpdate(state, status) + case message := <-state.messageCh: + handleOutgoingMessage(state, message) + } + } + return err +} + +// sendFailedTasks runs on every iteration of eventLoop to send an UPDATE on any failed tasks to the agent. +func sendFailedTasks(state *internalState) { + for taskID, status := range state.failedTasks { + updateErr := update(state, status) + if updateErr != nil { + log.WithFields(logrus.Fields{ + "taskId": taskID.Value, + "error": updateErr, + }). + Error("failed to send status update for task") + } else { + // If we have successfully notified Mesos, we clear our list of failed tasks. + delete(state.failedTasks, taskID) + // If there aren't any failed and active tasks, we request to shutdown the executor. + if len(state.failedTasks) == 0 && len(state.activeTasks) == 0 { + state.shouldQuit = true + } + } + } +} diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index e119df4c9..97f29d591 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -67,6 +68,24 @@ type CommitResponse struct { } func (t *ControllableTask) Launch() error { + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + }).Debug("executor.ControllableTask.Launch begin") + + launchStartTime := time.Now() + + defer utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed taskCmd, err := prepareTaskCmd(t.Tci) if err != nil { @@ -92,6 +111,12 @@ func (t *ControllableTask) Launch() error { // Anything in the following goroutine must not touch *internalState, except // via channels. go func() { + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + }).Debug("executor.ControllableTask.Launch.async begin") // Set up pipes for controlled process var errStdout, errStderr error @@ -120,6 +145,15 @@ func (t *ControllableTask) Launch() error { WithField("task", t.ti.Name). Debug("task launched") + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + if t.Tci.Log == nil { none := "none" t.Tci.Log = &none @@ -178,6 +212,8 @@ func (t *ControllableTask) Launch() error { } } + rpcDialStartTime := time.Now() + t.rpc = executorcmd.NewClient( t.Tci.ControlPort, t.Tci.ControlMode, @@ -206,6 +242,25 @@ func (t *ControllableTask) Launch() error { } t.rpc.TaskCmd = taskCmd + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + + utils.TimeTrack(rpcDialStartTime, + "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + + statePollingStartTime := time.Now() elapsed := 0 * time.Second for { log.WithFields(logrus.Fields{ @@ -282,6 +337,24 @@ func (t *ControllableTask) Launch() error { } } + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + + utils.TimeTrack(statePollingStartTime, + "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) + // Set up event stream from task esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) if err != nil { @@ -302,6 +375,12 @@ func (t *ControllableTask) Launch() error { log.WithError(err).Warning("error marshaling message from task") } else { t.sendMessage(jsonEvent) + log.WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + }).Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") } // Process events from task in yet another goroutine @@ -350,7 +429,7 @@ func (t *ControllableTask) Launch() error { "task": t.ti.Name, "command": tciCommandStr, "level": infologger.IL_Devel, - }).Debug("task done, preparing final update") + }).Debug("task done (taskCmd.Wait unblocks), preparing final update") pendingState := mesos.TASK_FINISHED if err != nil { @@ -401,7 +480,7 @@ func (t *ControllableTask) Launch() error { "task": t.ti.Name, "level": infologger.IL_Devel, }). - Debug("gRPC client running, handler forked") + Debug("gRPC client starting, handler forked: executor.ControllableTask.Launch end") return nil } diff --git a/executor/executable/task.go b/executor/executable/task.go index 9f2d174c4..066bf9dfa 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -47,7 +47,7 @@ import ( "github.com/sirupsen/logrus" ) -const( +const ( startupPollingInterval = 500 * time.Millisecond startupTimeout = 30 * time.Second ) @@ -69,9 +69,9 @@ type taskBase struct { ti *mesos.TaskInfo Tci *common.TaskCommandInfo - sendStatus SendStatusFunc + sendStatus SendStatusFunc sendDeviceEvent SendDeviceEventFunc - sendMessage SendMessageFunc + sendMessage SendMessageFunc } func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc, sendMessageFunc SendMessageFunc) Task { @@ -79,25 +79,31 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE tciData := taskInfo.GetData() - log.WithField("json", string(tciData[:])).Trace("received TaskCommandInfo") + log.WithField("json", string(tciData[:])). + Trace("received TaskCommandInfo") if err := json.Unmarshal(tciData, &commandInfo); tciData != nil && err == nil { log.WithFields(logrus.Fields{ - "shell": *commandInfo.Shell, - "value": *commandInfo.Value, - "args": commandInfo.Arguments, - "task": taskInfo.Name, + "shell": *commandInfo.Shell, + "value": *commandInfo.Value, + "args": commandInfo.Arguments, + "task": taskInfo.Name, "controlmode": commandInfo.ControlMode.String(), - "level": infologger.IL_Devel, + "level": infologger.IL_Devel, }). - Debug("instantiating task") + Debug("instantiating task") rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") - log.WithField("level", infologger.IL_Support).Infof("launching task %s", rawCommand) + log.WithField("level", infologger.IL_Support). + Infof("launching task %s", rawCommand) } else { if err != nil { - log.WithError(err).WithField("task", taskInfo.Name).Error("could not launch task") + log.WithError(err). + WithField("task", taskInfo.Name). + Error("could not launch task") } else { - log.WithError(errors.New("command data is nil")).WithField("task", taskInfo.Name).Error("could not launch task") + log.WithError(errors.New("command data is nil")). + WithField("task", taskInfo.Name). + Error("could not launch task") } sendStatusFunc(mesos.TASK_FAILED, "TaskInfo.Data is nil") return nil @@ -185,27 +191,7 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { return nil, err } - gidStrings, err := targetUser.GroupIds() - if err != nil { - // Non-nil error means we're building with !osusergo, so our binary is fully - // static and therefore certain CGO calls needed by os.user aren't available. - // We work around by calling `id -G username` like in the shell. - idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user - output, err := idCmd.Output() - if err != nil { - return nil, err - } - gidStrings = strings.Split(string(output[:]), " ") - } - - gids := make([]uint32, len(gidStrings)) - for i, v := range gidStrings { - parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32) - if err != nil { - return nil, err - } - gids[i] = uint32(parsed) - } + gids, gidStrings := getGroupIDs(targetUser) credential := &syscall.Credential{ Uid: uint32(uid), @@ -215,15 +201,40 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { } taskCmd.SysProcAttr.Credential = credential log.WithFields(logrus.Fields{ - "shell": *commandInfo.Shell, - "value": *commandInfo.Value, - "args": commandInfo.Arguments, - "uid": credential.Uid, - "gid": credential.Gid, - "groups": gidStrings, - }). - Trace("custom credentials set") + "shell": *commandInfo.Shell, + "value": *commandInfo.Value, + "args": commandInfo.Arguments, + "uid": credential.Uid, + "gid": credential.Gid, + "groups": gidStrings, + }). + Trace("custom credentials set") } return taskCmd, nil } + +func getGroupIDs(targetUser *user.User) ([]uint32, []string) { + gidStrings, err := targetUser.GroupIds() + if err != nil { + // Non-nil error means we're building with !osusergo, so our binary is fully + // static and therefore certain CGO calls needed by os.user aren't available. + // We work around by calling `id -G username` like in the shell. + idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user + output, err := idCmd.Output() + if err != nil { + return []uint32{}, []string{} + } + gidStrings = strings.Split(string(output[:]), " ") + } + + gids := make([]uint32, len(gidStrings)) + for i, v := range gidStrings { + parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32) + if err != nil { + return []uint32{}, []string{} + } + gids[i] = uint32(parsed) + } + return gids, gidStrings +} diff --git a/executor/executor.go b/executor/executor.go index ea242dc18..ab0426f3e 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -46,7 +46,6 @@ import ( "github.com/golang/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" - "github.com/mesos/mesos-go/api/v1/lib/encoding" "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" "github.com/mesos/mesos-go/api/v1/lib/executor" "github.com/mesos/mesos-go/api/v1/lib/executor/calls" @@ -59,14 +58,32 @@ import ( ) const ( - apiPath = "/api/v1/executor" - httpTimeout = 10 * time.Second + apiPath = "/api/v1/executor" + httpTimeout = 10 * time.Second ) var log = logger.New(logrus.StandardLogger(), "executor") var errMustAbort = errors.New("executor received abort signal from Mesos, will attempt to re-subscribe") +// internalState of the executor. +type internalState struct { + activeTasksMu sync.RWMutex + cli calls.Sender + cfg config.Config + framework mesos.FrameworkInfo + executor mesos.ExecutorInfo + agent mesos.AgentInfo + unackedTasks map[mesos.TaskID]mesos.TaskInfo + unackedUpdates map[string]executor.Call_Update + failedTasks map[mesos.TaskID]mesos.TaskStatus // send updates for these as we can + killedTasks map[mesos.TaskID]mesos.TaskStatus + activeTasks map[mesos.TaskID]executable.Task + shouldQuit bool + + statusCh chan mesos.TaskStatus + messageCh chan []byte +} // maybeReconnect returns a backoff.Notifier chan if framework checkpointing is enabled. func maybeReconnect(cfg config.Config) <-chan struct{} { @@ -125,10 +142,10 @@ func Run(cfg config.Config) { killedTasks: make(map[mesos.TaskID]mesos.TaskStatus), // The executor keeps a map of controlled tasks. - activeTasks: make(map[mesos.TaskID]executable.Task), + activeTasks: make(map[mesos.TaskID]executable.Task), - statusCh: make(chan mesos.TaskStatus), - messageCh: make(chan []byte), + statusCh: make(chan mesos.TaskStatus), + messageCh: make(chan []byte), } subscriber = calls.SenderWith( // Here too, callOptions for all outgoing subscriber calls @@ -211,58 +228,6 @@ func unacknowledgedUpdates(state *internalState) (result []executor.Call_Update) return } -// nextEventNotify blocks waiting for an incoming event. When an event arrives, it is sent back via -// the eventCh channel, and the function quits. -func nextEventNotify(decoder encoding.Decoder, eventCh chan<- executor.Event, errorCh chan<- error) { - log.Trace("EVENT LOOP nextEventNotify start") - var e executor.Event - var err error - if err = decoder.Decode(&e); err == nil { - eventCh <- e - } else { - errorCh <- err - } -} - -// eventLoop dispatches incoming events from mesos-agent to the events.Handler (built in buildEventhandler). -func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) (err error) { - log.Trace("listening for events from agent") - ctx := context.TODO() // dummy context - - // The decoder object is the response obtained from the Mesos slave subscription. We use decoder.Decode - // to acquire the next event from Mesos. Unfortunately this call blocks, so we rather keep it in a separate - // goroutine and only pipe single events into the main loop as they come. - errorCh := make(chan error) // errors come through here - eventCh := make(chan executor.Event) // events from Mesos come through here - - // Spawn a goroutine to wait for the first event - go nextEventNotify(decoder, eventCh, errorCh) - - for err == nil && !state.shouldQuit { - log.Trace("EVENT LOOP begin new main event loop iteration") - // housekeeping - sendFailedTasks(state) - - select { - case e := <- eventCh: - log.Trace("EVENT LOOP about to handle event") - err = h.HandleEvent(ctx, &e) - - // Spawn a goroutine to wait for the next event - go nextEventNotify(decoder, eventCh, errorCh) - case err = <- errorCh: - log.Trace("EVENT LOOP got error") - // Any error coming through here should immediately destroy the event loop and return - // control to the Mesos subscription handling. - case status := <- state.statusCh: - handleStatusUpdate(state, status) - case message := <- state.messageCh: - handleOutgoingMessage(state, message) - } - } - return err -} - // buildEventHandler builds an events.Handler, whose HandleEvent is triggered from the eventLoop. func buildEventHandler(state *internalState) events.Handler { return events.HandlerFuncs{ @@ -278,8 +243,8 @@ func buildEventHandler(state *internalState) events.Handler { executor.Event_LAUNCH: func(_ context.Context, e *executor.Event) error { // Launch one task. We're not handling LAUNCH_GROUP. log.WithField("event", e.Type.String()).Trace("handling event") - handleLaunchEvent(state, e.Launch.Task) - return nil + + return handleLaunchEvent(state, e.Launch.Task) }, executor.Event_KILL: func(_ context.Context, e *executor.Event) error { log.WithField("event", e.Type.String()).Trace("handling event") @@ -300,7 +265,7 @@ func buildEventHandler(state *internalState) events.Handler { "length": len(e.Message.Data), "message": string(e.Message.Data[:]), }). - Trace("received message data") + Trace("received message data") err := handleMessageEvent(state, e.Message.Data) if err != nil { log.WithField("error", err.Error()).Debug("MESSAGE handler error") @@ -326,34 +291,13 @@ func buildEventHandler(state *internalState) events.Handler { }) } -// sendFailedTasks runs on every iteration of eventLoop to send an UPDATE on any failed tasks to the agent. -func sendFailedTasks(state *internalState) { - for taskID, status := range state.failedTasks { - updateErr := update(state, status) - if updateErr != nil { - log.WithFields(logrus.Fields{ - "taskId": taskID.Value, - "error": updateErr, - }). - Error("failed to send status update for task") - } else { - // If we have successfully notified Mesos, we clear our list of failed tasks. - delete(state.failedTasks, taskID) - // If there aren't any failed and active tasks, we request to shutdown the executor. - if len(state.failedTasks) == 0 && len(state.activeTasks) == 0 { - state.shouldQuit = true - } - } - } -} - // update sends UPDATE to agent. func update(state *internalState, status mesos.TaskStatus) error { status.Timestamp = proto.Float64(float64(time.Now().Unix())) log.WithFields(logrus.Fields{ - "status": status.State.String(), - "id": status.TaskID.Value, - }). + "status": status.State.String(), + "id": status.TaskID.Value, + }). Debug("sending UPDATE on task status") upd := calls.Update(status) resp, err := state.cli.Send(context.TODO(), calls.NonStreaming(upd)) @@ -361,7 +305,8 @@ func update(state *internalState, status mesos.TaskStatus) error { resp.Close() } if err != nil { - log.WithField("error", err).Error("failed to send update") + log.WithField("error", err). + Error("executor failed to send update") debugJSON(upd) } else { state.unackedUpdates[string(status.UUID)] = *upd.Update @@ -378,22 +323,3 @@ func newStatus(state *internalState, id mesos.TaskID) mesos.TaskStatus { UUID: []byte(uuid.NewRandom()), } } - -// internalState of the executor. -type internalState struct { - activeTasksMu sync.RWMutex - cli calls.Sender - cfg config.Config - framework mesos.FrameworkInfo - executor mesos.ExecutorInfo - agent mesos.AgentInfo - unackedTasks map[mesos.TaskID]mesos.TaskInfo - unackedUpdates map[string]executor.Call_Update - failedTasks map[mesos.TaskID]mesos.TaskStatus // send updates for these as we can - killedTasks map[mesos.TaskID]mesos.TaskStatus - activeTasks map[mesos.TaskID]executable.Task - shouldQuit bool - - statusCh chan mesos.TaskStatus - messageCh chan []byte -} diff --git a/executor/handlers.go b/executor/handlers.go index 87db9ad4e..a85782540 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -32,6 +32,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executable" @@ -102,7 +103,7 @@ func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { "task": status.TaskID, "state": status.State.String(), }). - Warn("failed to update task status") + Warn("executor failed to send task status update") } } @@ -303,11 +304,30 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { } // Attempts to launch a task described by a mesos.TaskInfo. This function is thread-safe with respect to state. -func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { +func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { + log.WithFields(logrus.Fields{ + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + }).Debug("executor.handleLaunchEvent begin") + + defer utils.TimeTrack(time.Now(), + "executor.handleLaunchEvent", + log.WithFields(logrus.Fields{ + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + })) + state.unackedTasks[taskInfo.TaskID] = taskInfo jsonTask, _ := json.MarshalIndent(taskInfo, "", "\t") - log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])).Trace("received task to launch") + log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])). + Trace("received task to launch") myTask := executable.NewTask(taskInfo, makeSendStatusUpdateFunc(state, taskInfo), @@ -320,9 +340,26 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) { state.activeTasksMu.Lock() state.activeTasks[taskInfo.TaskID] = myTask state.activeTasksMu.Unlock() - log.Trace("task launching") + log.WithFields(logrus.Fields{ + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + }).Debug("task launching") + return nil } else { - log.Error("task launch failed") + // If Launch returned non-nil error, it should already have sent back a status update + log.WithError(err). + WithFields(logrus.Fields{ + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + }). + Error("task launch failed") + return err } } From 14ede00148cf697a1464636d0cd410dff7f940b2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jun 2022 14:36:25 +0200 Subject: [PATCH 1272/2352] [build] Bump to v0.43.90 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4213bbf9e..9559e45b6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 43 -VERSION_PATCH := 0 +VERSION_PATCH := 90 From 07df41558b372a06d04ed8c3578dad5788231090 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 8 Jun 2022 13:36:08 +0200 Subject: [PATCH 1273/2352] [core] ccdb plugin: refresh server cache at SOR --- core/integration/ccdb/plugin.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index e5cc8d66f..e173396c6 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -189,7 +189,7 @@ func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) return stack } -func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl string) (cmd string, err error) { +func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl string, refresh bool) (cmd string, err error) { // o2-ecs-grp-create -h //Create GRP-ECS object and upload to the CCDB //Usage: @@ -210,6 +210,7 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin // --ccdb-server arg (=http://alice-ccdb.cern.ch) // CCDB server for upload, local file if // empty + // --refresh refresh server cache after upload cmd = "source /etc/profile.d/o2.sh && o2-ecs-grp-create" if len(grp.lhcPeriod) == 0 { @@ -220,6 +221,9 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin return "", fmt.Errorf("could not create a command for CCDB interface because run number is 0") } cmd += " -r " + strconv.FormatUint(uint64(grp.runNumber), 10) + if refresh { + cmd += " --refresh" + } if grp.hbfPerTf != 0 { cmd += " -n " + strconv.FormatUint(uint64(grp.hbfPerTf), 10) } @@ -262,7 +266,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing log.WithField("call", "RunStart"). WithField("partition", envId).Debug("performing CCDB interface Run Start") - err := p.uploadCurrentGRP(varStack, envId) + err := p.uploadCurrentGRP(varStack, envId, true) if err != nil { log.WithField("call", "RunStop"). WithField("partition", envId).Error(err.Error()) @@ -272,7 +276,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["RunStop"] = func() (out string) { log.WithField("call", "RunStop"). WithField("partition", envId).Debug("performing CCDB interface Run Stop") - err := p.uploadCurrentGRP(varStack, envId) + err := p.uploadCurrentGRP(varStack, envId, false) if err != nil { log.WithField("call", "RunStop"). WithField("partition", envId).Error(err.Error()) @@ -282,7 +286,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } -func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) error { +func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string, refresh bool) error { grp := NewGRPObject(varStack) if grp == nil { @@ -292,7 +296,7 @@ func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string) erro fmt.Sprintf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", grp.runNumber, grp.runType.String(), grp.startTimeMs, grp.endTimeMs, grp.hbfPerTf, grp.lhcPeriod, strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ","))) - cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl) + cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl, refresh) if err != nil { return errors.New(fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error())) } From 98fc5bd2bb4554fd799939353849325a9526d0f3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 23 May 2022 17:42:20 +0200 Subject: [PATCH 1274/2352] [OCTRL-661] [core] Add state enter timestamp to kafka plugin messages --- core/environment/environment.go | 9 +- core/integration/kafka/plugin.go | 27 +- core/integration/kafka/protos/kafka.pb.go | 477 +++++++++++----------- core/integration/kafka/protos/kafka.proto | 3 +- 4 files changed, 274 insertions(+), 242 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 8c2e06a9f..0151387b3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -124,6 +124,10 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { ) env.GlobalVars.Set("__fmq_cleanup_count", "0") // initialize to 0 the number of START transitions + // We start with STANDBY, which will not be preceded with enter_STANDBY, thus we set the value here. + enterStateTimeMs := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.UserVars.Set("enter_state_time_ms", enterStateTimeMs) + env.Sm = fsm.NewFSM( "STANDBY", fsm.Events{ @@ -153,7 +157,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.workflow.GetVars().Set("run_number", rnString) env.workflow.GetVars().Set("runNumber", rnString) - runStartTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) + runStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("run_start_time_ms", runStartTime) env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous EOR @@ -200,6 +204,9 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.handlerFunc()(e) }, "enter_state": func(e *fsm.Event) { + enterStateTimeMs := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("enter_state_time_ms", enterStateTimeMs) + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("enter_%s", e.Dst)) if errHooks != nil { e.Cancel(errHooks) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 2baca54ca..b658daf43 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -195,6 +195,22 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf } } + enterStateTimeMsStr, ok := varStack["enter_state_time_ms"] + if !ok { + log.WithField("call", call). + WithField("partition", envId). + Error("cannot acquire enter_state_time_ms") + return nil + } + enterStateTimeMs, err := strconv.ParseUint(enterStateTimeMsStr, 10, 64) + if err != nil { + log.WithError(err). + WithField("call", call). + WithField("partition", envId). + Errorf("cannot convert enter_state_time_ms (%s) to an unsigned integer", enterStateTimeMsStr) + return nil + } + detectorsStr, ok := varStack["detectors"] if !ok { log.WithField("call", call). @@ -211,11 +227,12 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf } return &kafkapb.EnvInfo{ - EnvironmentId: envId, - RunNumber: runNumberOpt, - RunType: runTypeOpt, - State: state, - Detectors: detectorsSlice, + EnvironmentId: envId, + RunNumber: runNumberOpt, + RunType: runTypeOpt, + State: state, + Detectors: detectorsSlice, + EnterStateTimestamp: enterStateTimeMs, } } diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go index 1a4dcc9b3..6d0a55b0b 100644 --- a/core/integration/kafka/protos/kafka.pb.go +++ b/core/integration/kafka/protos/kafka.pb.go @@ -1,340 +1,347 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.19.4 -// source: protos/kafka.proto +// protoc-gen-go v1.28.0 +// protoc v3.15.8 +// source: kafka.proto package kafka import ( - proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" ) const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type NewStateNotification struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields - EnvInfo *EnvInfo `protobuf:"bytes,1,opt,name=envInfo,proto3" json:"envInfo,omitempty"` - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch + EnvInfo *EnvInfo `protobuf:"bytes,1,opt,name=envInfo,proto3" json:"envInfo,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch } func (x *NewStateNotification) Reset() { - *x = NewStateNotification{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_kafka_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + *x = NewStateNotification{} + if protoimpl.UnsafeEnabled { + mi := &file_kafka_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *NewStateNotification) String() string { - return protoimpl.X.MessageStringOf(x) + return protoimpl.X.MessageStringOf(x) } func (*NewStateNotification) ProtoMessage() {} func (x *NewStateNotification) ProtoReflect() protoreflect.Message { - mi := &file_protos_kafka_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) + mi := &file_kafka_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } // Deprecated: Use NewStateNotification.ProtoReflect.Descriptor instead. func (*NewStateNotification) Descriptor() ([]byte, []int) { - return file_protos_kafka_proto_rawDescGZIP(), []int{0} + return file_kafka_proto_rawDescGZIP(), []int{0} } func (x *NewStateNotification) GetEnvInfo() *EnvInfo { - if x != nil { - return x.EnvInfo - } - return nil + if x != nil { + return x.EnvInfo + } + return nil } func (x *NewStateNotification) GetTimestamp() uint64 { - if x != nil { - return x.Timestamp - } - return 0 + if x != nil { + return x.Timestamp + } + return 0 } type ActiveRunsList struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields - ActiveRuns []*EnvInfo `protobuf:"bytes,1,rep,name=activeRuns,proto3" json:"activeRuns,omitempty"` - Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch + ActiveRuns []*EnvInfo `protobuf:"bytes,1,rep,name=activeRuns,proto3" json:"activeRuns,omitempty"` + Timestamp uint64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // ms since epoch } func (x *ActiveRunsList) Reset() { - *x = ActiveRunsList{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_kafka_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + *x = ActiveRunsList{} + if protoimpl.UnsafeEnabled { + mi := &file_kafka_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *ActiveRunsList) String() string { - return protoimpl.X.MessageStringOf(x) + return protoimpl.X.MessageStringOf(x) } func (*ActiveRunsList) ProtoMessage() {} func (x *ActiveRunsList) ProtoReflect() protoreflect.Message { - mi := &file_protos_kafka_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) + mi := &file_kafka_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } // Deprecated: Use ActiveRunsList.ProtoReflect.Descriptor instead. func (*ActiveRunsList) Descriptor() ([]byte, []int) { - return file_protos_kafka_proto_rawDescGZIP(), []int{1} + return file_kafka_proto_rawDescGZIP(), []int{1} } func (x *ActiveRunsList) GetActiveRuns() []*EnvInfo { - if x != nil { - return x.ActiveRuns - } - return nil + if x != nil { + return x.ActiveRuns + } + return nil } func (x *ActiveRunsList) GetTimestamp() uint64 { - if x != nil { - return x.Timestamp - } - return 0 + if x != nil { + return x.Timestamp + } + return 0 } type EnvInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - RunNumber *uint32 `protobuf:"varint,2,opt,name=runNumber,proto3,oneof" json:"runNumber,omitempty"` - RunType *string `protobuf:"bytes,3,opt,name=runType,proto3,oneof" json:"runType,omitempty"` - State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` - Detectors []string `protobuf:"bytes,5,rep,name=detectors,proto3" json:"detectors,omitempty"` + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + RunNumber *uint32 `protobuf:"varint,2,opt,name=runNumber,proto3,oneof" json:"runNumber,omitempty"` + RunType *string `protobuf:"bytes,3,opt,name=runType,proto3,oneof" json:"runType,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + Detectors []string `protobuf:"bytes,5,rep,name=detectors,proto3" json:"detectors,omitempty"` + EnterStateTimestamp uint64 `protobuf:"varint,6,opt,name=enterStateTimestamp,proto3" json:"enterStateTimestamp,omitempty"` // ms since epoch. } func (x *EnvInfo) Reset() { - *x = EnvInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_kafka_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + *x = EnvInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_kafka_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } } func (x *EnvInfo) String() string { - return protoimpl.X.MessageStringOf(x) + return protoimpl.X.MessageStringOf(x) } func (*EnvInfo) ProtoMessage() {} func (x *EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_kafka_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) + mi := &file_kafka_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) } // Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. func (*EnvInfo) Descriptor() ([]byte, []int) { - return file_protos_kafka_proto_rawDescGZIP(), []int{2} + return file_kafka_proto_rawDescGZIP(), []int{2} } func (x *EnvInfo) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" + if x != nil { + return x.EnvironmentId + } + return "" } func (x *EnvInfo) GetRunNumber() uint32 { - if x != nil && x.RunNumber != nil { - return *x.RunNumber - } - return 0 + if x != nil && x.RunNumber != nil { + return *x.RunNumber + } + return 0 } func (x *EnvInfo) GetRunType() string { - if x != nil && x.RunType != nil { - return *x.RunType - } - return "" + if x != nil && x.RunType != nil { + return *x.RunType + } + return "" } func (x *EnvInfo) GetState() string { - if x != nil { - return x.State - } - return "" + if x != nil { + return x.State + } + return "" } func (x *EnvInfo) GetDetectors() []string { - if x != nil { - return x.Detectors - } - return nil + if x != nil { + return x.Detectors + } + return nil +} + +func (x *EnvInfo) GetEnterStateTimestamp() uint64 { + if x != nil { + return x.EnterStateTimestamp + } + return 0 } -var File_protos_kafka_proto protoreflect.FileDescriptor - -var file_protos_kafka_proto_rawDesc = []byte{ - 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x22, 0x5e, 0x0a, 0x14, 0x4e, - 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x0e, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, - 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xbf, 0x01, 0x0a, 0x07, - 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0e, 0x5a, - 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, +var File_kafka_proto protoreflect.FileDescriptor + +var file_kafka_proto_rawDesc = []byte{ + 0x0a, 0x0b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6b, + 0x61, 0x66, 0x6b, 0x61, 0x22, 0x5e, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, + 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, + 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, + 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x52, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, + 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf1, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x13, + 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x65, 0x6e, 0x74, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, + 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x2e, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, + 0x61, 0x66, 0x6b, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, + 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_protos_kafka_proto_rawDescOnce sync.Once - file_protos_kafka_proto_rawDescData = file_protos_kafka_proto_rawDesc + file_kafka_proto_rawDescOnce sync.Once + file_kafka_proto_rawDescData = file_kafka_proto_rawDesc ) -func file_protos_kafka_proto_rawDescGZIP() []byte { - file_protos_kafka_proto_rawDescOnce.Do(func() { - file_protos_kafka_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_kafka_proto_rawDescData) - }) - return file_protos_kafka_proto_rawDescData +func file_kafka_proto_rawDescGZIP() []byte { + file_kafka_proto_rawDescOnce.Do(func() { + file_kafka_proto_rawDescData = protoimpl.X.CompressGZIP(file_kafka_proto_rawDescData) + }) + return file_kafka_proto_rawDescData } -var file_protos_kafka_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_protos_kafka_proto_goTypes = []interface{}{ - (*NewStateNotification)(nil), // 0: kafka.NewStateNotification - (*ActiveRunsList)(nil), // 1: kafka.ActiveRunsList - (*EnvInfo)(nil), // 2: kafka.EnvInfo +var file_kafka_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_kafka_proto_goTypes = []interface{}{ + (*NewStateNotification)(nil), // 0: kafka.NewStateNotification + (*ActiveRunsList)(nil), // 1: kafka.ActiveRunsList + (*EnvInfo)(nil), // 2: kafka.EnvInfo } -var file_protos_kafka_proto_depIdxs = []int32{ - 2, // 0: kafka.NewStateNotification.envInfo:type_name -> kafka.EnvInfo - 2, // 1: kafka.ActiveRunsList.activeRuns:type_name -> kafka.EnvInfo - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name +var file_kafka_proto_depIdxs = []int32{ + 2, // 0: kafka.NewStateNotification.envInfo:type_name -> kafka.EnvInfo + 2, // 1: kafka.ActiveRunsList.activeRuns:type_name -> kafka.EnvInfo + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } -func init() { file_protos_kafka_proto_init() } -func file_protos_kafka_proto_init() { - if File_protos_kafka_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_protos_kafka_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewStateNotification); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_kafka_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActiveRunsList); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_kafka_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_protos_kafka_proto_msgTypes[2].OneofWrappers = []interface{}{} - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_protos_kafka_proto_rawDesc, - NumEnums: 0, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_protos_kafka_proto_goTypes, - DependencyIndexes: file_protos_kafka_proto_depIdxs, - MessageInfos: file_protos_kafka_proto_msgTypes, - }.Build() - File_protos_kafka_proto = out.File - file_protos_kafka_proto_rawDesc = nil - file_protos_kafka_proto_goTypes = nil - file_protos_kafka_proto_depIdxs = nil +func init() { file_kafka_proto_init() } +func file_kafka_proto_init() { + if File_kafka_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_kafka_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*NewStateNotification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_kafka_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ActiveRunsList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_kafka_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_kafka_proto_msgTypes[2].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_kafka_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_kafka_proto_goTypes, + DependencyIndexes: file_kafka_proto_depIdxs, + MessageInfos: file_kafka_proto_msgTypes, + }.Build() + File_kafka_proto = out.File + file_kafka_proto_rawDesc = nil + file_kafka_proto_goTypes = nil + file_kafka_proto_depIdxs = nil } diff --git a/core/integration/kafka/protos/kafka.proto b/core/integration/kafka/protos/kafka.proto index db91cdc21..2d839f0a9 100644 --- a/core/integration/kafka/protos/kafka.proto +++ b/core/integration/kafka/protos/kafka.proto @@ -18,4 +18,5 @@ message EnvInfo { optional string runType = 3; string state = 4; repeated string detectors = 5; -} \ No newline at end of file + uint64 enterStateTimestamp = 6; // ms since epoch. +} From df8aebfaacaf5d7118667157aec5ca944d18f554 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 18 May 2022 18:04:28 +0200 Subject: [PATCH 1275/2352] [cleanup-binary] Synchronize after kills --- cmd/o2-aliecs-shmcleaner | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index 4ae43f42b..2d125f9a7 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -30,7 +30,10 @@ export O2_ROLE=${O2_ROLE:-} # ------ Beginning extra cleanup ------ n=0 -for p in `pgrep -u flp`; do +pids=$(pgrep -u flp) + +# Try to kill any flp-owned processes gracefully +for p in $pids; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION @@ -38,18 +41,28 @@ for p in `pgrep -u flp`; do kill $p done +# Force kill any flp-owned processes remaining if (( n > 0 )); then sleep 5 - for p in `pgrep -u flp`; do + for p in $pids; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue - echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY + echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION kill -9 $p done fi +# Ensure that no flp-owned processes remain before returning +if (( n > 0 )); then + for p in $pids; do + while [ kill -0 $p > /dev/null 2>&1]; do + sleep 0.1 + done + done +fi + rm -f /dev/shm/*fmq* yes | roc-cleanup --light > /dev/null 3>&1 From dbeed29b78ea5995d97f1acdcd8f1d79e50337d2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Jun 2022 16:56:29 +0200 Subject: [PATCH 1276/2352] [build] Bump to v0.44.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 9559e45b6..15f36a49a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 43 -VERSION_PATCH := 90 +VERSION_MINOR := 44 +VERSION_PATCH := 0 From f32077fe25c40cd16a53c9b43bcc6b34c3de2977 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jun 2022 11:22:41 +0200 Subject: [PATCH 1277/2352] [core] Fix crash in task.Manager.configureTasks --- core/task/manager.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index 9f89958cb..169cbe9dc 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -516,11 +516,18 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { return err } + if tasks == nil || len(tasks) == 0 { + return fmt.Errorf("empty task list to configure for environment %s", envId.String()) + } + // We fetch each task's local bindMap to generate a global bindMap for the whole Tasks slice, // i.e. a map of the paths of registered inbound channels and their ports. bindMap := make(channel.BindMap) for _, task := range tasks { - taskPath := task.GetParent().GetPath() + if task.GetParent() == nil { // Crash reported here by Roberto 6/2022 + return fmt.Errorf("task %s on %s has nil parent, this should never happen", task.GetClassName(), task.GetHostname()) + } + taskPath := task.GetParentRolePath() for inbChName, endpoint := range task.GetLocalBindMap() { var bindMapKey string if strings.HasPrefix(inbChName, "::") { //global channel alias From 381e47c44d93a3ba908c3adf9a663e254f7ffa6f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Jun 2022 11:23:18 +0200 Subject: [PATCH 1278/2352] [build] Bump to v0.44.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 15f36a49a..dec579071 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 44 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From ec01f4e880ca3fec3b841ed58cd47815e9975ed8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jun 2022 14:20:18 +0200 Subject: [PATCH 1279/2352] [core] Fix cmdq.commit debug message --- core/controlcommands/commandqueue.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index be402da0e..22f33e500 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -117,7 +117,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon if m == nil { return nil, errors.New("command queue is nil") } - log.WithPrefix("cmdq").Debug("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) + log.WithPrefix("cmdq").Debugf("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), log.WithPrefix("cmdq")) From 05594ad75d6118bd5475fb195f174ec45fcab3ca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jun 2022 15:22:26 +0200 Subject: [PATCH 1280/2352] [core] Improved debug output in commandqueue and task.Manager --- core/controlcommands/commandqueue.go | 7 +++++-- core/task/manager.go | 12 +++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 22f33e500..32e0252da 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -117,10 +117,13 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon if m == nil { return nil, errors.New("command queue is nil") } - log.WithPrefix("cmdq").Debugf("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) + log.WithPrefix("cmdq"). + WithField("id", command.GetId().String()). + Debugf("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), - log.WithPrefix("cmdq")) + log.WithPrefix("cmdq"). + WithField("id", command.GetId().String())) type responseSemaphore struct { receiver MesosCommandTarget diff --git a/core/task/manager.go b/core/task/manager.go index 169cbe9dc..e142adbd9 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -766,10 +766,20 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { switch st := status.GetState(); st { case mesos.TASK_RUNNING: + cmdInfo := taskPtr.GetTaskCommandInfo() + var ( + cmdStr string + controlMode string + ) + if cmdInfo != nil { + cmdStr = cmdInfo.GetValue() + controlMode = cmdInfo.ControlMode.String() + } log.WithField("taskId", taskId). WithField("name", taskPtr.GetName()). WithField("level", infologger.IL_Devel). - WithField("cmd", taskPtr.GetTaskClass().Command.GetValue()). + WithField("cmd", cmdStr). + WithField("controlmode", controlMode). Debug("task active (received TASK_RUNNING event from executor)") taskPtr.status = ACTIVE if taskPtr.GetParent() != nil { From da7b98bd12dd33ac17b94b079fafbf32d4b4edda Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jun 2022 15:22:49 +0200 Subject: [PATCH 1281/2352] [executor] Fix command output in debug messages from controllabletask --- executor/executable/controllabletask.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 97f29d591..6f8818354 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -245,7 +245,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -254,7 +254,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(rpcDialStartTime, "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -340,7 +340,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -349,7 +349,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(statePollingStartTime, "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -376,7 +376,7 @@ func (t *ControllableTask) Launch() error { } else { t.sendMessage(jsonEvent) log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, From 1aa3b63bf7ed48e3f5c807b5168d7c425149fe94 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Jun 2022 11:23:44 +0200 Subject: [PATCH 1282/2352] [OCTRL-667][core] Write down EOR time also on RUNNING->ERROR --- core/environment/environment.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 0151387b3..2ec617ea7 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -186,7 +186,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { log.Error("cannot access AliECS workflow configuration defaults") } } else if e.Event == "STOP_ACTIVITY" { - runEndTime := strconv.FormatInt(time.Now().UnixNano()/1000000, 10) + // once we make a smooth transition to "leave_RUNNING" in ControlWorkflows, this could be deleted. + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) @@ -195,6 +196,11 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } }, "leave_state": func(e *fsm.Event) { + // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. + if e.Src == "RUNNING" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) if errHooks != nil { e.Cancel(errHooks) From e59394c8a62fbe00abe371f08436011054a341c6 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 13 Jun 2022 10:38:07 +0200 Subject: [PATCH 1283/2352] [auto-stop] Transition into ERROR if stop fails --- core/environment/environment.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 2ec617ea7..e8802a1d9 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -886,7 +886,8 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t if err != nil { log.WithField("partition", env.id). WithField("run", env.currentRunNumber). - Errorf("Scheduled auto stop transition failed: %s", err.Error()) + Errorf("Scheduled auto stop transition failed: %s\n Transitioning into ERROR", err.Error()) + _ = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) return } } From 41d72a175e342da398978fa97ab960b827bd0abb Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 14 Jun 2022 15:44:19 +0200 Subject: [PATCH 1284/2352] Replace `\n` with `,` --- core/environment/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index e8802a1d9..352d2315f 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -886,7 +886,7 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t if err != nil { log.WithField("partition", env.id). WithField("run", env.currentRunNumber). - Errorf("Scheduled auto stop transition failed: %s\n Transitioning into ERROR", err.Error()) + Errorf("Scheduled auto stop transition failed: %s, Transitioning into ERROR", err.Error()) _ = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) return } From 53c9a8439c4a424a87256a16c7a2619fdbd6e9b8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Jun 2022 17:09:14 +0200 Subject: [PATCH 1285/2352] [core] Ensure an executor failure reports a hostname --- core/task/scheduler.go | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 72a6430e1..82ed5e024 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -151,7 +151,7 @@ func (state *schedulerState) buildEventHandler(fidStore store.Singleton) events. eventrules.HandleF(state.notifyStateMachine()), ).Handle(events.Handlers{ // scheduler.Event_Type: events.Handler - scheduler.Event_FAILURE: logger.HandleF(failure), // wrapper + print error + scheduler.Event_FAILURE: logger.HandleF(state.failure), // wrapper + print error scheduler.Event_OFFERS: state.trackOffersReceived().HandleF(state.resourceOffers(fidStore)), scheduler.Event_UPDATE: controller.AckStatusUpdates(state.cli).AndThen().HandleF(state.statusUpdate()), scheduler.Event_SUBSCRIBED: eventrules.New( @@ -194,7 +194,7 @@ func (state *schedulerState) trackOffersReceived() eventrules.Rule { // Handle an incoming Event_FAILURE, which may be a failure in the executor or // in the Mesos agent. -func failure(_ context.Context, e *scheduler.Event) error { +func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) error { var ( f = e.GetFailure() eid, aid, stat = f.ExecutorID, f.AgentID, f.Status @@ -206,6 +206,7 @@ func failure(_ context.Context, e *scheduler.Event) error { } if aid != nil { fields["agent"] = aid.Value + fields["srcHost"] = state.getAgentCacheHostname(*aid) } if stat != nil { fields["error"] = strconv.Itoa(int(*stat)) @@ -219,11 +220,23 @@ func failure(_ context.Context, e *scheduler.Event) error { log.WithPrefix("scheduler"). WithField("agent", aid.Value). WithField("level", infologger.IL_Support). + WithField("srcHost", state.getAgentCacheHostname(*aid)). Error("agent failed") } return nil } +func (state *schedulerState) getAgentCacheHostname(id mesos.AgentID) string { + if state == nil || + state.taskman == nil { + return "" + } + if entry := state.taskman.AgentCache.Get(id); entry != nil { + return entry.Hostname + } + return "" +} + // Handler for Event_MESSAGE func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // instantiate map of MCtargets, command IDs and timeouts here From f17fbbe2d20ef848a1d7a0d68e4be30e8af69aaa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jun 2022 08:27:34 +0200 Subject: [PATCH 1286/2352] [core] Add machine counter to scheduler.go offers handler --- core/task/scheduler.go | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 82ed5e024..6481e8192 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -43,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/schedutil" + "github.com/AliceO2Group/Control/core/the" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/event" @@ -453,6 +454,8 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han timeGotDescriptors := time.Now() + machinesUsed := make(map[string]struct{}) + // by default we get ready to decline all offers offerIDsToDecline := make(map[mesos.OfferID]struct{}, len(offers)) for i := range offers { @@ -611,6 +614,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Hostname: offer.Hostname, } state.taskman.AgentCache.Update(agentForCache) //thread safe + machinesUsed[offer.Hostname] = struct{}{} taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) if taskPtr == nil { @@ -900,17 +904,33 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("level", infologger.IL_Devel). Trace("offers cycle complete, no tasks launched") } } else { + machinesUsedSlice := func(machines map[string]struct{}) []string { // StringSet to StringSlice + out := make([]string, len(machines)) + i := 0 + for k, _ := range machines { + out[i] = k + i++ + } + return out + }(machinesUsed) + + detectorsForHosts, _ := the.ConfSvc().GetDetectorsForHosts(machinesUsedSlice) + log.WithPrefix("scheduler"). WithField("partition", envId.String()). - WithField("tasks", tasksLaunchedThisCycle). - Debug("offers cycle complete, tasks launched") + WithField("hosts", strings.Join(machinesUsedSlice, " ")). + WithField("hostCount", len(machinesUsedSlice)). + WithField("detectors", strings.Join(detectorsForHosts, " ")). + Debugf("offers cycle complete, %d tasks launched for %d detectors", tasksLaunchedThisCycle, len(detectorsForHosts)) } utils.TimeTrack(timeBeforeDecline, "resourceOffers: decline-notify-return", log. WithField("partition", envId.String()). WithField("tasksLaunched", tasksLaunchedThisCycle). + WithField("level", infologger.IL_Devel). WithField("offersDeclined", offersDeclined)) return nil @@ -923,11 +943,13 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { s := e.GetUpdate().GetStatus() if viper.GetBool("verbose") { - log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "task": s.TaskID.Value, - "state": s.GetState().String(), - "message": s.GetMessage(), - }).Trace("task status update received") + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "task": s.TaskID.Value, + "state": s.GetState().String(), + "message": s.GetMessage(), + }). + Trace("task status update received") } // What's the new task state? From b5188362af87b72b0cbc07b8e4ffc077dec864d9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Jun 2022 14:45:59 +0200 Subject: [PATCH 1287/2352] [build] Bump AliECS to v0.45.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index dec579071..19bd9e9ff 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 44 -VERSION_PATCH := 1 +VERSION_MINOR := 45 +VERSION_PATCH := 0 From 488c03a2a16743d4696648a2b766d2f7c836cda9 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 22 Jun 2022 15:10:02 +0200 Subject: [PATCH 1288/2352] [core] taskmanager: Don't close a closed channel --- core/task/manager.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index e142adbd9..df802a6ba 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -831,10 +831,14 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err killed, running, err = m.doKillTasks(toKill) for _, id := range killed.GetTaskIds() { - ack, _ := m.ackKilledTasks.getValue(id) - <-ack - close(ack) - m.ackKilledTasks.deleteKey(id) + ack, ok := m.ackKilledTasks.getValue(id) + if ok { + _, open := <-ack + if open { // if we try to close a closed chan we panic + close(ack) + } + m.ackKilledTasks.deleteKey(id) + } } return } From 5f310bd6ac295dd250c9b371a799cab7e876d3fc Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 16 May 2022 16:48:40 +0200 Subject: [PATCH 1289/2352] [jit] Add option for DPL commands contained in files --- apricot/protos/apricot.pb.go | 2 +- coconut/protos/o2control.pb.go | 2 +- configuration/template/stack.go | 178 +++++----- core/integration/kafka/protos/kafka.pb.go | 146 +++++---- core/integration/odc/protos/odc.pb.go | 380 +++++++++++----------- core/integration/odc/protos/odc.proto | 47 +-- core/protos/o2control.pb.go | 2 +- core/repos/httpsrepo.go | 10 +- core/repos/localrepo.go | 32 +- core/repos/repo.go | 27 +- core/repos/sshrepo.go | 15 +- core/task/task.go | 1 - 12 files changed, 467 insertions(+), 375 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 515963e83..1a0d6e026 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc v3.17.3 // source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 262b7f049..d902af152 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc v3.17.3 // source: protos/o2control.proto package pb diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 21acdab76..26a422a51 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -79,7 +79,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str return payload }, "GetConfig": func(path string) string { - defer utils.TimeTrack(time.Now(),"GetConfig", log.WithPrefix("template")) + defer utils.TimeTrack(time.Now(), "GetConfig", log.WithPrefix("template")) query, err := componentcfg.NewQuery(path) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) @@ -102,7 +102,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str return payload }, "DetectorsForHosts": func(hosts string) string { - defer utils.TimeTrack(time.Now(),"DetectorsForHosts", log.WithPrefix("template")) + defer utils.TimeTrack(time.Now(), "DetectorsForHosts", log.WithPrefix("template")) hostsSlice := make([]string, 0) // first we convert the incoming string treated as JSON list into a []string bytes := []byte(hosts) @@ -126,7 +126,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str return outString }, "CRUCardsForHost": func(hostname string) string { - defer utils.TimeTrack(time.Now(),"CRUCardsForHost", log.WithPrefix("template")) + defer utils.TimeTrack(time.Now(), "CRUCardsForHost", log.WithPrefix("template")) payload, err := confSvc.GetCRUCardsForHost(hostname) if err != nil { return fmt.Sprintf("[\"error: %s\"]", err.Error()) @@ -137,73 +137,86 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str } func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { - return map[string]interface{} { - "GenerateDplSubworkflow": func (dplCommand string) string { - // jitDplGenerate takes a resolved dplCommand as an argument, - // generates the corresponding tasks and workflow - // and returns the resolved dplWorkflow as a string - jitDplGenerate := func(dplCommand string) (dplWorkflow string) { - const nMaxExpectedQcPayloads = 2 - var metadata string - - // Match any consul URL - re := regexp.MustCompile(`consul-json://[^ |]*`) - matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) - - // Concatenate the consul LastIndex for each payload in a single string - for _, match := range matches { - // Match any key under components - keyRe := regexp.MustCompile(`components/[^']*`) - consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) - consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") - - // And query for Consul for its LastIndex - newQ, err := componentcfg.NewQuery(consulKey[1]) - _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) - if err != nil { - return fmt.Sprintf("JIT failed trying to query qc consul payload %s : " + err.Error(), - match) - } - metadata += strconv.FormatUint(lastIndex, 10) - } + // jitDplGenerate takes a resolved dplCommand as an argument, + // generates the corresponding tasks and workflow + // and returns the resolved dplWorkflow as a string + jitDplGenerate := func(dplCommand string) (dplWorkflow string) { + const nMaxExpectedQcPayloads = 2 + var metadata string + + // Match any consul URL + re := regexp.MustCompile(`consul-json://[^ |]*`) + matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) + + // Concatenate the consul LastIndex for each payload in a single string + for _, match := range matches { + // Match any key under components + keyRe := regexp.MustCompile(`components/[^']*`) + consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) + consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") + + // And query for Consul for its LastIndex + newQ, err := componentcfg.NewQuery(consulKey[1]) + _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) + if err != nil { + return fmt.Sprintf("JIT failed trying to query qc consul payload %s : "+err.Error(), + match) + } + metadata += strconv.FormatUint(lastIndex, 10) + } - var err error - - // Generate a hash out of the concatenation of - // 1) The full DPL command - // 2) The LastIndex of each payload - hash := sha1.New() - hash.Write([]byte(dplCommand + metadata)) - jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) - - // We now have a workflow name made out of a hash that should be unique with respect to - // 1) DPL command and - // 2) Consul payload versions - // Only generate new tasks & workflows if the files don't exist - // If they exist, hash comparison guarantees validity - if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+ ".yaml")); err == nil { - log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) - return jitWorkflowName - } + // Get the O2 version + o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2") + o2VersionOut, err := o2VersionCmd.Output() + if err != nil { + log.Warn("JIT couldn't get O2 version: " + err.Error()) + } - log.Trace("Resolved DPL command: " + dplCommand) - - // TODO: Before executing we need to check that this is a valid dpl command - // If not, any command may be injected on the aliecs host - // since this will be run as user `aliecs` it might not pose a problem at this point - cmdString := dplCommand + " --o2-control " + jitWorkflowName - dplCmd := exec.Command("bash", "-c", cmdString) - - // execute the DPL command in the repo of the workflow used - dplCmd.Dir = workflowRepo.GetCloneDir() - var dplOut []byte - dplOut, err = dplCmd.CombinedOutput() - log.Trace("DPL command out: " + string(dplOut)) - if err != nil { - return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) - } + // Generate a hash out of the concatenation of + // 1) The full DPL command + // 2) The LastIndex of each payload + // 3) The O2 package version + hash := sha1.New() + hash.Write([]byte(dplCommand + metadata + string(o2VersionOut))) + jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) + + // We now have a workflow name made out of a hash that should be unique with respect to + // 1) DPL command and + // 2) Consul payload versions + // 3) O2 package version + // Only generate new tasks & workflows if the files don't exist + // If they exist, hash comparison guarantees validity + if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { + log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) + return jitWorkflowName + } + + log.Trace("Resolved DPL command: " + dplCommand) + + // TODO: Before executing we need to check that this is a valid dpl command + // If not, any command may be injected on the aliecs host + // since this will be run as user `aliecs` it might not pose a problem at this point + cmdString := dplCommand + " --o2-control " + jitWorkflowName + // for some reason the above concatenation may introduce new lines + cmdString = strings.ReplaceAll(cmdString, "\n", "") + dplCmd := exec.Command("bash", "-c", cmdString) + + // execute the DPL command in the repo of the workflow used + dplCmd.Dir = workflowRepo.GetCloneDir() + var dplOut []byte + dplOut, err = dplCmd.CombinedOutput() + log.Trace("DPL command out: " + string(dplOut)) + if err != nil { + return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) + } - return jitWorkflowName + return jitWorkflowName + } + + return map[string]interface{}{ + "GenerateDplSubworkflow": func(dplCommand string) string { + if dplCommand == "none" { + return "" } // Resolve any templates as part of the DPL command @@ -213,7 +226,26 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) } - return jitDplGenerate(dplCommand) + return jitDplGenerate("source /etc/profile.d/o2.sh &&" + dplCommand) + }, + "GenerateDplSubworkflowFromUri": func(dplCommandUri string) string { + if dplCommandUri == "none" { + return "" + } + + dplCommand, err := workflowRepo.GetDplCommand(dplCommandUri) + if err != nil { + return fmt.Sprintf("Failed to read DPL command from %s : %s\n", dplCommandUri, err.Error()) + } + + // Resolve any templates as part of the DPL command + fields := Fields{WrapPointer(&dplCommand)} + err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + if err != nil { + return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + } + + return jitDplGenerate("source /etc/profile.d/o2.sh && " + dplCommand) }, } } @@ -303,9 +335,9 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} bytes := []byte(in) err := json.Unmarshal(bytes, &out) log.WithFields(logrus.Fields{ - "in": in, - "out": out, - }). + "in": in, + "out": out, + }). Debug("FromJson") if err != nil { log.WithError(err).Warn("error unmarshaling JSON/YAML in template system") @@ -326,7 +358,7 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} return uid.New().String() }, "PrefixedOverride": func(varname, prefix string) string { - prefixed, prefixedOk := varStack[prefix + "_" + varname] + prefixed, prefixedOk := varStack[prefix+"_"+varname] fallback, fallbackOk := varStack[varname] // Handle explicit null values @@ -355,4 +387,4 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} return in }, } -} \ No newline at end of file +} diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go index 6d0a55b0b..88bd5026f 100644 --- a/core/integration/kafka/protos/kafka.pb.go +++ b/core/integration/kafka/protos/kafka.pb.go @@ -1,12 +1,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.15.8 -// source: kafka.proto +// protoc-gen-go v1.25.0 +// protoc v3.17.3 +// source: protos/kafka.proto package kafka import ( + proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -20,6 +21,10 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + type NewStateNotification struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -32,7 +37,7 @@ type NewStateNotification struct { func (x *NewStateNotification) Reset() { *x = NewStateNotification{} if protoimpl.UnsafeEnabled { - mi := &file_kafka_proto_msgTypes[0] + mi := &file_protos_kafka_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -45,7 +50,7 @@ func (x *NewStateNotification) String() string { func (*NewStateNotification) ProtoMessage() {} func (x *NewStateNotification) ProtoReflect() protoreflect.Message { - mi := &file_kafka_proto_msgTypes[0] + mi := &file_protos_kafka_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -58,7 +63,7 @@ func (x *NewStateNotification) ProtoReflect() protoreflect.Message { // Deprecated: Use NewStateNotification.ProtoReflect.Descriptor instead. func (*NewStateNotification) Descriptor() ([]byte, []int) { - return file_kafka_proto_rawDescGZIP(), []int{0} + return file_protos_kafka_proto_rawDescGZIP(), []int{0} } func (x *NewStateNotification) GetEnvInfo() *EnvInfo { @@ -87,7 +92,7 @@ type ActiveRunsList struct { func (x *ActiveRunsList) Reset() { *x = ActiveRunsList{} if protoimpl.UnsafeEnabled { - mi := &file_kafka_proto_msgTypes[1] + mi := &file_protos_kafka_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -100,7 +105,7 @@ func (x *ActiveRunsList) String() string { func (*ActiveRunsList) ProtoMessage() {} func (x *ActiveRunsList) ProtoReflect() protoreflect.Message { - mi := &file_kafka_proto_msgTypes[1] + mi := &file_protos_kafka_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -113,7 +118,7 @@ func (x *ActiveRunsList) ProtoReflect() protoreflect.Message { // Deprecated: Use ActiveRunsList.ProtoReflect.Descriptor instead. func (*ActiveRunsList) Descriptor() ([]byte, []int) { - return file_kafka_proto_rawDescGZIP(), []int{1} + return file_protos_kafka_proto_rawDescGZIP(), []int{1} } func (x *ActiveRunsList) GetActiveRuns() []*EnvInfo { @@ -146,7 +151,7 @@ type EnvInfo struct { func (x *EnvInfo) Reset() { *x = EnvInfo{} if protoimpl.UnsafeEnabled { - mi := &file_kafka_proto_msgTypes[2] + mi := &file_protos_kafka_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -159,7 +164,7 @@ func (x *EnvInfo) String() string { func (*EnvInfo) ProtoMessage() {} func (x *EnvInfo) ProtoReflect() protoreflect.Message { - mi := &file_kafka_proto_msgTypes[2] + mi := &file_protos_kafka_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -172,7 +177,7 @@ func (x *EnvInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvInfo.ProtoReflect.Descriptor instead. func (*EnvInfo) Descriptor() ([]byte, []int) { - return file_kafka_proto_rawDescGZIP(), []int{2} + return file_protos_kafka_proto_rawDescGZIP(), []int{2} } func (x *EnvInfo) GetEnvironmentId() string { @@ -217,62 +222,61 @@ func (x *EnvInfo) GetEnterStateTimestamp() uint64 { return 0 } -var File_kafka_proto protoreflect.FileDescriptor - -var file_kafka_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6b, - 0x61, 0x66, 0x6b, 0x61, 0x22, 0x5e, 0x0a, 0x14, 0x4e, 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, - 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, - 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x0e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, - 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x52, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, - 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf1, 0x01, 0x0a, 0x07, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x72, 0x75, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x13, - 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x65, 0x6e, 0x74, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x2e, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6b, - 0x61, 0x66, 0x6b, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, - 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +var File_protos_kafka_proto protoreflect.FileDescriptor + +var file_protos_kafka_proto_rawDesc = []byte{ + 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x22, 0x5e, 0x0a, 0x14, 0x4e, + 0x65, 0x77, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x65, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x5e, 0x0a, 0x0e, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x2e, 0x0a, + 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xf1, 0x01, 0x0a, 0x07, + 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x13, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, + 0x0e, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( - file_kafka_proto_rawDescOnce sync.Once - file_kafka_proto_rawDescData = file_kafka_proto_rawDesc + file_protos_kafka_proto_rawDescOnce sync.Once + file_protos_kafka_proto_rawDescData = file_protos_kafka_proto_rawDesc ) -func file_kafka_proto_rawDescGZIP() []byte { - file_kafka_proto_rawDescOnce.Do(func() { - file_kafka_proto_rawDescData = protoimpl.X.CompressGZIP(file_kafka_proto_rawDescData) +func file_protos_kafka_proto_rawDescGZIP() []byte { + file_protos_kafka_proto_rawDescOnce.Do(func() { + file_protos_kafka_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_kafka_proto_rawDescData) }) - return file_kafka_proto_rawDescData + return file_protos_kafka_proto_rawDescData } -var file_kafka_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_kafka_proto_goTypes = []interface{}{ +var file_protos_kafka_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_protos_kafka_proto_goTypes = []interface{}{ (*NewStateNotification)(nil), // 0: kafka.NewStateNotification (*ActiveRunsList)(nil), // 1: kafka.ActiveRunsList (*EnvInfo)(nil), // 2: kafka.EnvInfo } -var file_kafka_proto_depIdxs = []int32{ +var file_protos_kafka_proto_depIdxs = []int32{ 2, // 0: kafka.NewStateNotification.envInfo:type_name -> kafka.EnvInfo 2, // 1: kafka.ActiveRunsList.activeRuns:type_name -> kafka.EnvInfo 2, // [2:2] is the sub-list for method output_type @@ -282,13 +286,13 @@ var file_kafka_proto_depIdxs = []int32{ 0, // [0:2] is the sub-list for field type_name } -func init() { file_kafka_proto_init() } -func file_kafka_proto_init() { - if File_kafka_proto != nil { +func init() { file_protos_kafka_proto_init() } +func file_protos_kafka_proto_init() { + if File_protos_kafka_proto != nil { return } if !protoimpl.UnsafeEnabled { - file_kafka_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_protos_kafka_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewStateNotification); i { case 0: return &v.state @@ -300,7 +304,7 @@ func file_kafka_proto_init() { return nil } } - file_kafka_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_protos_kafka_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ActiveRunsList); i { case 0: return &v.state @@ -312,7 +316,7 @@ func file_kafka_proto_init() { return nil } } - file_kafka_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_protos_kafka_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvInfo); i { case 0: return &v.state @@ -325,23 +329,23 @@ func file_kafka_proto_init() { } } } - file_kafka_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_protos_kafka_proto_msgTypes[2].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_kafka_proto_rawDesc, + RawDescriptor: file_protos_kafka_proto_rawDesc, NumEnums: 0, NumMessages: 3, NumExtensions: 0, NumServices: 0, }, - GoTypes: file_kafka_proto_goTypes, - DependencyIndexes: file_kafka_proto_depIdxs, - MessageInfos: file_kafka_proto_msgTypes, + GoTypes: file_protos_kafka_proto_goTypes, + DependencyIndexes: file_protos_kafka_proto_depIdxs, + MessageInfos: file_protos_kafka_proto_msgTypes, }.Build() - File_kafka_proto = out.File - file_kafka_proto_rawDesc = nil - file_kafka_proto_goTypes = nil - file_kafka_proto_depIdxs = nil + File_protos_kafka_proto = out.File + file_protos_kafka_proto_rawDesc = nil + file_protos_kafka_proto_goTypes = nil + file_protos_kafka_proto_depIdxs = nil } diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index a05c09a9e..af05335c6 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -293,9 +293,11 @@ type Device struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) + Ignored bool `protobuf:"varint,4,opt,name=ignored,proto3" json:"ignored,omitempty"` // Device was stopped and set to be ignored + Host string `protobuf:"bytes,5,opt,name=host,proto3" json:"host,omitempty"` // Host where the task runs } func (x *Device) Reset() { @@ -351,6 +353,20 @@ func (x *Device) GetPath() string { return "" } +func (x *Device) GetIgnored() bool { + if x != nil { + return x.Ignored + } + return false +} + +func (x *Device) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + // Device change/get state request type StateRequest struct { state protoimpl.MessageState @@ -1600,203 +1616,205 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x42, 0x0a, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x70, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x69, - 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x97, - 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, + 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, + 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, + 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xe2, 0x01, 0x0a, - 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, - 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, + 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, + 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xe2, 0x01, 0x0a, 0x0a, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, + 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, - 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, - 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, - 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, - 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, - 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, - 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, - 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, - 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, - 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, + 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, + 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, + 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, + 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, + 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, + 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, + 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, - 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, - 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 2ac1fd48f..3fee54396 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -7,37 +7,37 @@ option go_package = "protos;odc"; // For details also see https://github.com/FairRootGroup/ODC#command-mapping service ODC { // Creates a new DDS session or attaches to an existing DDS session. - rpc Initialize (InitializeRequest) returns (GeneralReply) {} + rpc Initialize (InitializeRequest) returns (GeneralReply) {} // Submits DDS agents (deploys a dynamic cluster) according to a specified computing resources. // Can be called multiple times in order to submit more DDS agents (allocate more resources). - rpc Submit (SubmitRequest) returns (GeneralReply) {} + rpc Submit (SubmitRequest) returns (GeneralReply) {} // Activates a given topology. - rpc Activate (ActivateRequest) returns (GeneralReply) {} + rpc Activate (ActivateRequest) returns (GeneralReply) {} // Run request combines Initialize, Submit and Activate into a single request. // Run request always creates a new DDS session. - rpc Run (RunRequest) returns (GeneralReply) {} + rpc Run (RunRequest) returns (GeneralReply) {} // Updates a topology (up or down scale number of tasks or any other topology change). // It consists of 3 commands: Reset, Activate and Configure. // Can be called multiple times. - rpc Update (UpdateRequest) returns (GeneralReply) {} + rpc Update (UpdateRequest) returns (GeneralReply) {} // Transitions devices into Ready state. - rpc Configure (ConfigureRequest) returns (StateReply) {} + rpc Configure (ConfigureRequest) returns (StateReply) {} // Changes devices configuration. rpc SetProperties (SetPropertiesRequest) returns (GeneralReply) {} // Get current aggregated state of devices. - rpc GetState (StateRequest) returns (StateReply) {} + rpc GetState (StateRequest) returns (StateReply) {} // Transition devices into Running state. - rpc Start (StartRequest) returns (StateReply) {} + rpc Start (StartRequest) returns (StateReply) {} // Transitions devices into Ready state. - rpc Stop (StopRequest) returns (StateReply) {} + rpc Stop (StopRequest) returns (StateReply) {} // Transitions devices into Idle state. - rpc Reset (ResetRequest) returns (StateReply) {} + rpc Reset (ResetRequest) returns (StateReply) {} // Shuts devices down via End transition. - rpc Terminate (TerminateRequest) returns (StateReply) {} + rpc Terminate (TerminateRequest) returns (StateReply) {} // Shutdown DDS session. - rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} + rpc Shutdown (ShutdownRequest) returns (GeneralReply) {} // Status request. - rpc Status (StatusRequest) returns (StatusReply) {} + rpc Status (StatusRequest) returns (StatusReply) {} } // Request status @@ -81,6 +81,8 @@ message Device { uint64 id = 1; // Runtime task ID (same as in DDS) string state = 2; // FairMQ device state as string string path = 3; // Runtime task path (same as in DDS) + bool ignored = 4; // Device was stopped and set to be ignored + string host = 5; // Host where the task runs } // Device change/get state request @@ -117,10 +119,6 @@ message StatusReply { repeated PartitionStatus partitions = 5; // Status of each partition } -// -// Requests -// - // Initialize request message InitializeRequest { string partitionid = 1; // Partition ID from ECS @@ -135,7 +133,7 @@ message SubmitRequest { uint64 runnr = 4; // Run number from ECS uint32 timeout = 5; // Request timeout in sec. If not set or 0 than default is used. string plugin = 2; // Name of the resource plugin registered in odc-server - string resources = 3; // Resource description + string resources = 3; // Resource description } // Activate request @@ -159,7 +157,7 @@ message RunRequest { string content = 5; // Content of the XML DDS topology string script = 6; // Shell commands to be executed by ODC in order to generate content of the XML DDS topology string plugin = 3; // Name of the resource plugin registered in odc-server - string resources = 4; // Resource description + string resources = 4; // Resource description } // Update request @@ -195,10 +193,6 @@ message SetPropertiesRequest { repeated Property properties = 3; // List of properties to be set } -// -// FairMQ device state change requests -// - // Configure request message ConfigureRequest { StateRequest request = 1; // State change request. See StateRequest for details. @@ -224,13 +218,8 @@ message TerminateRequest { StateRequest request = 1; // State change request. See StateRequest for details. } -// -// Generic requests -// - // Status request -message StatusRequest -{ +message StatusRequest { bool running = 1; // Select only running DDS sessions } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 262b7f049..d902af152 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc v3.17.3 // source: protos/o2control.proto package pb diff --git a/core/repos/httpsrepo.go b/core/repos/httpsrepo.go index 3aeabb5a4..d997f267c 100644 --- a/core/repos/httpsrepo.go +++ b/core/repos/httpsrepo.go @@ -46,7 +46,15 @@ func (r *httpsRepo) getUri() string { return uri + ".git" } -func(r *httpsRepo) GetProtocol() string { +func (r *httpsRepo) GetProtocol() string { return "https" } +/*func (r *httpsRepo) GetDplCommand(dplCommandUri string) (string, error) { + dplCommandPath := filepath.Join(r.GetCloneDir(), jitScriptsDir, dplCommandUri) + dplCommandPayload, err := os.ReadFile(dplCommandPath) + if err != nil { + return "", err + } + return string(dplCommandPayload), nil +}*/ diff --git a/core/repos/localrepo.go b/core/repos/localrepo.go index fff4768fc..2e4998b6d 100644 --- a/core/repos/localrepo.go +++ b/core/repos/localrepo.go @@ -29,6 +29,7 @@ import ( "github.com/google/uuid" "io/ioutil" "net/url" + "os" "path" "path/filepath" "strings" @@ -90,6 +91,7 @@ func (r *localRepo) GetProtocol() string { } const timeout = 10 * time.Second + var timer = time.NewTimer(timeout) var uuidHash string @@ -151,10 +153,32 @@ func (r *localRepo) getWorkflows(revisionPattern string, _ []string, _ bool) (Te if err != nil { return nil, err } - templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], - Template{templateName, description, isPublic, varSpecMap}) + if isPublic { + templates[RevisionKey(revision)] = append(templates[RevisionKey(revision)], + Template{templateName, description, isPublic, varSpecMap}) + } } } - return templates, nil; -} \ No newline at end of file + return templates, nil +} + +func (r *localRepo) GetDplCommand(dplCommandUri string) (string, error) { + dplCommandPath := filepath.Join(r.GetCloneDir(), jitScriptsDir, dplCommandUri) + dplCommandPayload, err := os.ReadFile(dplCommandPath) + if err != nil { + return "", err + } + return string(dplCommandPayload), nil +} + +func (r *localRepo) ResolveSubworkflowTemplateIdentifier(workflowTemplateExpr string) string { + expr := workflowTemplateExpr + if !strings.Contains(expr, "/") { + expr = filepath.Join(r.GetIdentifier(), + "workflows", + expr) + } + + return expr +} diff --git a/core/repos/repo.go b/core/repos/repo.go index fc17a4844..9c20ce3e3 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -73,6 +73,7 @@ type IRepo interface { GetDefaultRevision() string IsDefault() bool GetTaskTemplatePath(string) string + GetDplCommand(string) (string, error) } type Repo struct { @@ -84,9 +85,10 @@ type Repo struct { Hash string Default bool Revisions []string - ReposPath string + ReposPath string } +const jitScriptsDir = "jit" func resolveProtocolFromPath(repoPath string) string { // https @@ -126,12 +128,12 @@ func newRepo(repoPath string, defaultRevision string, reposPath string) (iRepo, } return sshRepo, nil } else if protocol == "https" { - httpsRepo := &httpsRepo { + httpsRepo := &httpsRepo{ Repo: newRepo, } return httpsRepo, nil - } else if protocol == "local"{ - localRepo := &localRepo { + } else if protocol == "local" { + localRepo := &localRepo{ Repo: newRepo, } return localRepo, nil @@ -190,7 +192,7 @@ func NewRepo(repoPath string, defaultRevision string, reposPath string) (string, RepoName: strings.TrimSuffix(repoUrlSlice[len(repoUrlSlice)-1], ".git"), Revision: revision, DefaultRevision: defaultRevision, - ReposPath: reposPath, + ReposPath: reposPath, } return protocol, newRepo, nil @@ -213,7 +215,7 @@ func (r *Repo) getCloneParentDirs() []string { cleanDirHostingSite := filepath.Join(cleanDir, r.HostingSite) cleanDir = cleanDirHostingSite - dirs := strings.Split(strings.TrimPrefix(r.Path,"/"), "/") + dirs := strings.Split(strings.TrimPrefix(r.Path, "/"), "/") var cleanDirs []string for _, d := range dirs { @@ -554,7 +556,6 @@ func (r *Repo) GetRevisions() []string { return r.Revisions } - func (r *Repo) GetDefaultRevision() string { return r.DefaultRevision @@ -584,7 +585,6 @@ func (r *Repo) updateDefaultRevision(revision string) (string, error) { return "", nil } - func (r *Repo) IsDefault() bool { return r.Default } @@ -596,4 +596,13 @@ func (r *Repo) setDefault(def bool) { func (r *Repo) GetTaskTemplatePath(taskClassFile string) string { return filepath.Join(r.ReposPath, taskClassFile) -} \ No newline at end of file +} + +func (r *Repo) GetDplCommand(dplCommandUri string) (string, error) { + dplCommandPath := filepath.Join(r.GetCloneDir(), jitScriptsDir, dplCommandUri) + dplCommandPayload, err := os.ReadFile(dplCommandPath) + if err != nil { + return "", err + } + return string(dplCommandPayload), nil +} diff --git a/core/repos/sshrepo.go b/core/repos/sshrepo.go index 841ccd8d9..1ad7e0702 100644 --- a/core/repos/sshrepo.go +++ b/core/repos/sshrepo.go @@ -41,7 +41,7 @@ type sshRepo struct { func (r *sshRepo) getUri() string { u, _ := url.Parse(r.GetProtocol() + "://") - u.Path = path.Join(u.Path, "git@" + r.HostingSite) + u.Path = path.Join(u.Path, "git@"+r.HostingSite) u.Path = path.Join(u.Path, r.Path, @@ -52,7 +52,7 @@ func (r *sshRepo) getUri() string { return uri + ".git" } -func(r *sshRepo) GetProtocol() string { +func (r *sshRepo) GetProtocol() string { return "ssh" } @@ -81,7 +81,7 @@ func (r *sshRepo) refresh() error { err = ref.Fetch(&git.FetchOptions{ RemoteName: "origin", Force: true, - Auth: auth, + Auth: auth, }) if err != nil && err != git.NoErrAlreadyUpToDate { @@ -106,3 +106,12 @@ func (r *sshRepo) refresh() error { return nil } + +/*func (r *sshRepo) GetDplCommand(dplCommandUri string) (string, error) { + dplCommandPath := filepath.Join(r.GetCloneDir(), jitScriptsDir, dplCommandUri) + dplCommandPayload, err := os.ReadFile(dplCommandPath) + if err != nil { + return "", err + } + return string(dplCommandPayload), nil +}*/ diff --git a/core/task/task.go b/core/task/task.go index 6efcae812..f6ea8c4a2 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -315,7 +315,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) } - // K42: cmd.Value has been respolved here err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} From 57974628dbe30aae3d2c8d1744331bd7902cebec Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 16 Jun 2022 17:47:52 +0200 Subject: [PATCH 1290/2352] [jit] Use JIT env vars during generation --- configuration/template/stack.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 26a422a51..7e71cd2d1 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -172,18 +172,23 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str log.Warn("JIT couldn't get O2 version: " + err.Error()) } + // Get the env vars necessary for JIT + jitEnvVars := varStack["jit_env_vars"] + // Generate a hash out of the concatenation of // 1) The full DPL command // 2) The LastIndex of each payload // 3) The O2 package version + // 4) The JIT env vars hash := sha1.New() - hash.Write([]byte(dplCommand + metadata + string(o2VersionOut))) + hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) // We now have a workflow name made out of a hash that should be unique with respect to // 1) DPL command and // 2) Consul payload versions // 3) O2 package version + // 4) JIT env vars // Only generate new tasks & workflows if the files don't exist // If they exist, hash comparison guarantees validity if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { @@ -196,9 +201,9 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host // since this will be run as user `aliecs` it might not pose a problem at this point - cmdString := dplCommand + " --o2-control " + jitWorkflowName + cmdString := "export " + jitEnvVars + " && " + dplCommand + " --o2-control " + jitWorkflowName // for some reason the above concatenation may introduce new lines - cmdString = strings.ReplaceAll(cmdString, "\n", "") + cmdString = strings.ReplaceAll(cmdString, "\n", " ") dplCmd := exec.Command("bash", "-c", cmdString) // execute the DPL command in the repo of the workflow used From df17de35b04c7f0abc6625ba945c789fdc2b6b24 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 23 Jun 2022 12:25:50 +0200 Subject: [PATCH 1291/2352] [jit] Include env vars in resolved command trace --- configuration/template/stack.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 7e71cd2d1..ea83beb81 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -196,14 +196,13 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return jitWorkflowName } - log.Trace("Resolved DPL command: " + dplCommand) - // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host // since this will be run as user `aliecs` it might not pose a problem at this point cmdString := "export " + jitEnvVars + " && " + dplCommand + " --o2-control " + jitWorkflowName // for some reason the above concatenation may introduce new lines cmdString = strings.ReplaceAll(cmdString, "\n", " ") + log.Trace("Resolved DPL command: " + cmdString) dplCmd := exec.Command("bash", "-c", cmdString) // execute the DPL command in the repo of the workflow used From c3b8353af0697ac51541530e6f8ce81fce9ee905 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 23 Jun 2022 14:16:47 +0200 Subject: [PATCH 1292/2352] [jit] Also check QC version for jit hash --- configuration/template/stack.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index ea83beb81..68d8aaf3a 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -165,11 +165,11 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str metadata += strconv.FormatUint(lastIndex, 10) } - // Get the O2 version - o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2") + // Get the O2 & QualityControl version + o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2 o2-QualityControl") o2VersionOut, err := o2VersionCmd.Output() if err != nil { - log.Warn("JIT couldn't get O2 version: " + err.Error()) + log.Warn("JIT couldn't get O2 / QualityControl version: " + err.Error()) } // Get the env vars necessary for JIT @@ -178,7 +178,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str // Generate a hash out of the concatenation of // 1) The full DPL command // 2) The LastIndex of each payload - // 3) The O2 package version + // 3) The O2 + QualityControl package versions // 4) The JIT env vars hash := sha1.New() hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) @@ -187,7 +187,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str // We now have a workflow name made out of a hash that should be unique with respect to // 1) DPL command and // 2) Consul payload versions - // 3) O2 package version + // 3) O2 + QualityControl package versions // 4) JIT env vars // Only generate new tasks & workflows if the files don't exist // If they exist, hash comparison guarantees validity From 9b5d93e9d14e948a4ad3b0dc9ea023397b6c8875 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Thu, 23 Jun 2022 14:45:33 +0200 Subject: [PATCH 1293/2352] Bump AliECS to v0.45.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 19bd9e9ff..a84480157 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 45 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From fa561a9f40e300fde5fa902be466553f5c1dcee2 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Mon, 27 Jun 2022 15:50:09 +0200 Subject: [PATCH 1294/2352] [core] taskmanager: Channel should be closed by sender --- core/task/manager.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index df802a6ba..3e715181f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -757,8 +757,9 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { WithField("reason", status.GetReason().String()). Warn("attempted status update of task not in roster") } - if val, ok := m.ackKilledTasks.getValue(taskId); ok { - val <- struct{}{} + if ack, ok := m.ackKilledTasks.getValue(taskId); ok { + ack <- struct{}{} + close(ack) } return @@ -833,10 +834,7 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err for _, id := range killed.GetTaskIds() { ack, ok := m.ackKilledTasks.getValue(id) if ok { - _, open := <-ack - if open { // if we try to close a closed chan we panic - close(ack) - } + <-ack m.ackKilledTasks.deleteKey(id) } } From 1b15311f466e0e4a9963359750dcbd6a0f9a171d Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 29 Jun 2022 14:50:00 +0200 Subject: [PATCH 1295/2352] [core] taskmanager: Channel can remain open until deletion --- core/task/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index 3e715181f..089e7d6cf 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -759,7 +759,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { } if ack, ok := m.ackKilledTasks.getValue(taskId); ok { ack <- struct{}{} - close(ack) + //close(ack) // It can even be left open? } return From 37e88e1046a482b2c95af4919108ba26210ace13 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Wed, 6 Jul 2022 13:39:32 +0300 Subject: [PATCH 1296/2352] [dcs] More desciptive messages for some DCS failures --- core/integration/dcs/plugin.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 582cacebd..cb60bac60 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -412,10 +412,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - if err == nil { - err = fmt.Errorf("%s SOR failure event from DCS", dcsEvent.GetDetector().String()) + logErr := fmt.Errorf("%s SOR failure event from DCS", dcsEvent.GetDetector().String()) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) } - log.WithError(err). + log.WithError(logErr). WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). WithField("level", infologger.IL_Support). @@ -475,11 +476,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsopOk { p.pendingEORs[envId] = runNumber64 } else { - if err == nil { - err = fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedDetectors, ", ")) + logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedDetectors, ", ")) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) } - log.WithError(err). + log.WithError(logErr). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). @@ -714,10 +716,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { - if err == nil { - err = fmt.Errorf("%s EOR failure event from DCS", dcsEvent.GetDetector().String()) + logErr := fmt.Errorf("%s EOR failure event from DCS", dcsEvent.GetDetector().String()) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) } - log.WithError(err). + log.WithError(logErr). WithField("event", dcsEvent). WithField("detector", dcsEvent.GetDetector().String()). WithField("level", infologger.IL_Support). @@ -769,11 +772,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsopOk { delete(p.pendingEORs, envId) } else { - if err == nil { - err = fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedDetectors, ", ")) + logErr := fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedDetectors, ", ")) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) } - log.WithError(err). + log.WithError(logErr). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). From 59fa3739cf57f26b3dd399966f79f072fa3294b5 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 17 Jun 2022 14:23:45 +0200 Subject: [PATCH 1297/2352] [config] Empty repos ssh key by default --- core/config.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index b182ce8f1..cfcf34b43 100644 --- a/core/config.go +++ b/core/config.go @@ -92,7 +92,7 @@ func setDefaults() error { viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) viper.SetDefault("metrics.port", envInt("PORT0", "64009")) viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) - viper.SetDefault("reposSshKey", filepath.Join("/etc/o2.d/aliecs/.ssh/controlworkflows-mirror-key")) + viper.SetDefault("reposSshKey", "") viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) viper.SetDefault("veryVerbose", false) @@ -258,7 +258,13 @@ func checkWorkingDirRights() error { } func checkSshKeyRights() error { - err := unix.Access(viper.GetString("reposSshKey"), unix.R_OK) + reposSshKey := viper.GetString("reposSshKey") + if reposSshKey == "" { + log.Trace("No repos ssh key provided") + return nil + } + + err := unix.Access(reposSshKey, unix.R_OK) if err != nil { return errors.New("No read access for repos ssh key: \"" + viper.GetString("reposSshKey") + "\": " + err.Error()) } From 4e50a6075905f9578e58f89241638e598d8eae7b Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 17 Jun 2022 17:42:54 +0200 Subject: [PATCH 1298/2352] [repos] Local repo accessibility check before PlainOpen --- core/repos/repomanager.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index 2b853a0ef..cd36931d4 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -37,6 +37,7 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/viper" ssh2 "golang.org/x/crypto/ssh" + "golang.org/x/sys/unix" "os" "path/filepath" "sort" @@ -253,6 +254,13 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st var gitRepo *git.Repository if repo.GetProtocol() == "local" { // local repo needs only be opened + // We first need to make sure that the local repo is accessible, if not `git.PlainOpen` will crash us with a segfault + // It should also be writable for JIT + err := unix.Access(repo.GetCloneDir(), unix.W_OK) + if err != nil { + return "", false, err + } + // TODO: persistent local repos? gitRepo, err = git.PlainOpen(repo.GetCloneDir()) } else { // https and ssh repos need to be cloned From 9e0e3941fdda3befcc4afa945e236e65e6231d65 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 4 Jul 2022 15:37:51 +0200 Subject: [PATCH 1299/2352] Kafka: more logs, require ACK from all brokers --- core/integration/kafka/plugin.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index b658daf43..7412908fc 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -104,6 +104,14 @@ func (p *Plugin) ActiveRunsListTopic() string { return "aliecs.env_list.RUNNING" } +func (p *Plugin) LoggerCallback(msg string, a ...interface{}) { + log.Infof(msg, a...) +} + +func (p *Plugin) ErrorLoggerCallback(msg string, a ...interface{}) { + log.Errorf(msg, a...) +} + func (p *Plugin) Init(_ string) error { const call = "Init" var err error @@ -112,6 +120,9 @@ func (p *Plugin) Init(_ string) error { Addr: kafka.TCP(p.endpoint), Balancer: &kafka.CRC32Balancer{}, // same behaviour as confluent-kafka client AllowAutoTopicCreation: true, + Logger: kafka.LoggerFunc(p.LoggerCallback), + ErrorLogger: kafka.LoggerFunc(p.ErrorLoggerCallback), + RequiredAcks: kafka.RequireAll, } p.envsInRunning = make(map[string]*kafkapb.EnvInfo) From 3c77d90734da9a1c511fa2dad1deb129fde53318 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 13 May 2022 11:40:17 +0200 Subject: [PATCH 1300/2352] [core][bookkeeping-plugin] Some debug fields are added and unused Run_Quality is corrected. --- core/integration/bookkeeping/api.go | 3 --- core/integration/bookkeeping/plugin.go | 2 ++ 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 529277d91..de316db72 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -92,10 +92,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.GOOD_RunQuality case string(sw.BAD_RunQuality): runquality = sw.BAD_RunQuality - //case string(sw.UNKNOWN_RunQuality): - // runquality = sw.UNKNOWN_RunQuality default: - // log runquality is %s and it is not valid. overwrite with UNKNOWN_RunQuality runquality = sw.TEST_RunQuality } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index b820337a5..db47bcc81 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -249,6 +249,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { log.WithField("runNumber", runNumber64). + WithField("state", state). WithField("partition", envId). Debug("UpdateRun call successful") } @@ -382,6 +383,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { log.WithField("partition", envId). + WithField("state", status). Debug("UpdateEnvironment call successful") } return From 86952d409e6119d7233a3a5f8a88d76195cf3c83 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 16 May 2022 10:05:57 +0200 Subject: [PATCH 1301/2352] [core][O2B-560] Bookkeeping plugin is ready to return required fields for Run information in Bookkeeping. --- core/integration/bookkeeping/api.go | 4 ++-- core/integration/bookkeeping/plugin.go | 11 +++++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index de316db72..ef2241f82 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) error { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string, odcFullname string, trgGlobal bool, trg bool, tfbMode string, lhcPeriod string) error { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,7 +80,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors) /*, odcFullname, trgGlobal, trg, tfbMode, lhcPeriod*/) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index db47bcc81..63c91946c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -179,8 +179,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) odc_topology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) + odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") + trg_global_run_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) + trg_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_enabled")) + //pdp_config_option := env.GetKV("", "pdp_config_option") + //pdp_topology_description_library_file := env.GetKV("", "pdp_topology_description_library_file") + tfb_dd_mode := env.GetKV("", "tfb_dd_mode") + lhc_period := env.GetKV("", "lhc_period") + + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors, odc_topology_fullname, trg_global_run_enabled, trg_enabled, tfb_dd_mode, lhc_period) if err != nil { log.WithError(err). WithField("runNumber", runNumber). From db5f120c93d86be381ae6a80d209c22cf1323a47 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 6 Jul 2022 13:25:41 +0200 Subject: [PATCH 1302/2352] [O2B-560] A Bookkeeping run is created as early as possible with as many parameters as available, and updated afterwards with the necessary information. --- core/integration/bookkeeping/api.go | 8 ++++---- core/integration/bookkeeping/plugin.go | 28 ++++++++++++++------------ 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index ef2241f82..c0a4d72f2 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, timeO2Start time.Time, timeTrgStart time.Time, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string, odcFullname string, trgGlobal bool, trg bool, tfbMode string, lhcPeriod string) error { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) error { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,12 +80,12 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, timeO2Start, timeTrgStart, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors) /*, odcFullname, trgGlobal, trg, tfbMode, lhcPeriod*/) + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2End time.Time, timeTrgEnd time.Time) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time, trgGlobal bool, trg bool, pdpconfig string, pdptopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -96,7 +96,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2End, timeTrgEnd) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2Start.UnixMilli(), timeO2End.UnixMilli(), timeTrgStart.UnixMilli(), timeTrgEnd.UnixMilli(), trgGlobal, trg, pdpconfig, pdptopology, tfbMode /*, odcFullname, lhcPeriod */) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 63c91946c..3583c9698 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -179,15 +179,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) odc_topology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - trg_global_run_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) - trg_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_enabled")) - //pdp_config_option := env.GetKV("", "pdp_config_option") - //pdp_topology_description_library_file := env.GetKV("", "pdp_topology_description_library_file") - tfb_dd_mode := env.GetKV("", "tfb_dd_mode") - lhc_period := env.GetKV("", "lhc_period") + //odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") + //lhc_period := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), time.Now(), time.Now(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors, odc_topology_fullname, trg_global_run_enabled, trg_enabled, tfb_dd_mode, lhc_period) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). @@ -241,9 +236,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - updateRunFunc := func(runNumber64 int64, state string) (out string) { + updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" - err := p.bookkeepingClient.UpdateRun(int32(runNumber64), state, time.Now(), time.Now()) + //odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") + trg_global_run_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) + trg_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_enabled")) + pdp_config_option, _ := varStack["pdp_config_option"] + pdp_topology_description_library_file, _ := varStack["pdp_topology_description_library_file"] + tfb_dd_mode := env.GetKV("", "tfb_dd_mode") + //lhc_period := env.GetKV("", "lhc_period") + err := p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg_global_run_enabled, trg_enabled, pdp_config_option, pdp_topology_description_library_file, tfb_dd_mode /*, odc_topology_fullname, lhc_period */) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). @@ -293,7 +295,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envState := env.CurrentState() if envState != "RUNNING" { - return updateRunFunc(runNumber64, "bad") + return updateRunFunc(runNumber64, "bad", time.Now(), time.Now(), time.Time{}, time.Time{}) } else { return } @@ -329,9 +331,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envState := env.CurrentState() if envState != "CONFIGURED" { - return updateRunFunc(runNumber64, "bad") + return updateRunFunc(runNumber64, "bad", time.Time{}, time.Time{}, time.Now(), time.Now()) } else { - return updateRunFunc(runNumber64, "good") + return updateRunFunc(runNumber64, "good", time.Time{}, time.Time{}, time.Now(), time.Now()) } } // Environment related Bookkeeping functions From 13a34a1290de7e8451057ac908cfcff9baf67762 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 6 Jul 2022 16:27:31 +0200 Subject: [PATCH 1303/2352] [O2B-560] Run details are updated successfully in Bookkeeping. --- core/integration/bookkeeping/plugin.go | 55 +++++++++++++++++++++----- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 3583c9698..04776913e 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -239,13 +239,49 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" //odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - trg_global_run_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) - trg_enabled, _ := strconv.ParseBool(env.GetKV("", "trg_enabled")) - pdp_config_option, _ := varStack["pdp_config_option"] - pdp_topology_description_library_file, _ := varStack["pdp_topology_description_library_file"] + trg_global_run_enabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("Bookkeeping API UpdateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + trg_enabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("Bookkeeping API UpdateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + pdp_config_option, ok := varStack["pdp_config_option"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("cannot acquire PDP workflow configuration mode") + return + } + pdp_topology_description_library_file, ok := varStack["pdp_topology_description_library_file"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("cannot acquire PDP topology description library file") + return + } tfb_dd_mode := env.GetKV("", "tfb_dd_mode") //lhc_period := env.GetKV("", "lhc_period") - err := p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg_global_run_enabled, trg_enabled, pdp_config_option, pdp_topology_description_library_file, tfb_dd_mode /*, odc_topology_fullname, lhc_period */) + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg_global_run_enabled, trg_enabled, pdp_config_option, pdp_topology_description_library_file, tfb_dd_mode /*, odc_topology_fullname, lhc_period */) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). @@ -294,10 +330,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } envState := env.CurrentState() + if envState != "RUNNING" { - return updateRunFunc(runNumber64, "bad", time.Now(), time.Now(), time.Time{}, time.Time{}) + return updateRunFunc(runNumber64, "bad", time.Now(), time.Time{}, time.Now(), time.Time{}) } else { - return + return updateRunFunc(runNumber64, "good", time.Now(), time.Time{}, time.Now(), time.Time{}) } } stack["UpdateRunStop"] = func() (out string) { @@ -331,9 +368,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envState := env.CurrentState() if envState != "CONFIGURED" { - return updateRunFunc(runNumber64, "bad", time.Time{}, time.Time{}, time.Now(), time.Now()) + return updateRunFunc(runNumber64, "bad", time.Time{}, time.Now(), time.Time{}, time.Now()) } else { - return updateRunFunc(runNumber64, "good", time.Time{}, time.Time{}, time.Now(), time.Now()) + return updateRunFunc(runNumber64, "good", time.Time{}, time.Now(), time.Time{}, time.Now()) } } // Environment related Bookkeeping functions From 7cd07422b3176133bcccd38a3a9c6b85c007256c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 7 Jul 2022 09:49:13 +0200 Subject: [PATCH 1304/2352] [O2B-560] UpdateRun passes test as default run quality to Bookkeeping. --- core/integration/bookkeeping/plugin.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 04776913e..ca540080c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -245,7 +245,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("Bookkeeping API UpdateRun error") + Error("cannot acquire TRG global run enabled") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -257,7 +257,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("Bookkeeping API UpdateRun error") + Error("cannot acquire TRG enabled") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -332,9 +332,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envState := env.CurrentState() if envState != "RUNNING" { - return updateRunFunc(runNumber64, "bad", time.Now(), time.Time{}, time.Now(), time.Time{}) + return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } else { - return updateRunFunc(runNumber64, "good", time.Now(), time.Time{}, time.Now(), time.Time{}) + return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } } stack["UpdateRunStop"] = func() (out string) { @@ -368,9 +368,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envState := env.CurrentState() if envState != "CONFIGURED" { - return updateRunFunc(runNumber64, "bad", time.Time{}, time.Now(), time.Time{}, time.Now()) + return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) } else { - return updateRunFunc(runNumber64, "good", time.Time{}, time.Now(), time.Time{}, time.Now()) + return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) } } // Environment related Bookkeeping functions From c99d6af1b1d2ded6a6b2d31513f8735aae0fa755 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 08:49:12 +0200 Subject: [PATCH 1305/2352] [O2B-560] AliECS Bookkeeping plugin is looking at the branch main from Bookkeeping. --- go.mod | 4 ++-- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6cf0eee1e..d7acb4d9c 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459 + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168 // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168 github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect diff --git a/go.sum b/go.sum index 0db2e6d3a..918a6446b 100644 --- a/go.sum +++ b/go.sum @@ -95,6 +95,8 @@ github.com/AliceO2Group/Bookkeeping v0.17.12 h1:ZyV2aDM348nvtQDiI/5H5cart9B4dHvF github.com/AliceO2Group/Bookkeeping v0.17.12/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 h1:a3CKsuyQtuiIT5e89at/rp+OgZK/1PvI5PjMVot67tY= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168 h1:dNmTnFLXTwGVpt0spEYALJPgF20D1DmUGCdn2BaeF+Y= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= @@ -111,6 +113,8 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d9725/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459 h1:cS+ZX4ZVvDfKcBtHne25XJFLksfnpyJMcT4nDYQXEqk= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168 h1:XN/vDB2JmiV+HgKb0Nkj7NC9r5z/j1SH9klfxrBXkwM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From 2347f571be64792f6d5a02053efb4e71c8590d15 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 11:02:23 +0200 Subject: [PATCH 1306/2352] [O2B-560] Variable naming is more consistent, and parsing errors do not result in exit. --- core/integration/bookkeeping/api.go | 8 +-- core/integration/bookkeeping/plugin.go | 84 +++++++++++++------------- 2 files changed, 46 insertions(+), 46 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index c0a4d72f2..f1f6fb0d1 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -66,7 +66,7 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, dd_flp bool, dcs bool, epn bool, epnTopology string, detectors string) error { +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, ddFlp bool, dcs bool, epn bool, epnTopology string, detectors string) error { var runtypeAPI sw.RunType switch runType { case string(sw.TECHNICAL_RunType): @@ -80,12 +80,12 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns runtypeAPI = sw.TECHNICAL_RunType } - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, dd_flp, dcs, epn, epnTopology, sw.Detectors(detectors)) + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, ddFlp, dcs, epn, epnTopology, sw.Detectors(detectors)) return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time, trgGlobal bool, trg bool, pdpconfig string, pdptopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -96,7 +96,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2Start.UnixMilli(), timeO2End.UnixMilli(), timeTrgStart.UnixMilli(), timeTrgEnd.UnixMilli(), trgGlobal, trg, pdpconfig, pdptopology, tfbMode /*, odcFullname, lhcPeriod */) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2Start.UnixMilli(), timeO2End.UnixMilli(), timeTrgStart.UnixMilli(), timeTrgEnd.UnixMilli(), trgGlobal, trg, pdpConfig, pdpTopology, tfbMode /*, odcFullname, lhcPeriod */) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index ca540080c..5ef456c8a 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -174,15 +174,36 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rnString := strconv.FormatUint(uint64(runNumber), 10) flps := env.GetFLPs() - dd_enabled, _ := strconv.ParseBool(env.GetKV("", "dd_enabled")) - dcs_enabled, _ := strconv.ParseBool(env.GetKV("", "dcs_enabled")) - epn_enabled, _ := strconv.ParseBool(env.GetKV("", "epn_enabled")) - odc_topology := env.GetKV("", "odc_topology") + ddEnabled, err := strconv.ParseBool(env.GetKV("", "dd_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse DD enabled") + } + dcsEnabled, err := strconv.ParseBool(env.GetKV("", "dcs_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse DCS enabled") + } + epnEnabled, err := strconv.ParseBool(env.GetKV("", "epn_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse EPN enabled") + } + odcTopology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - //odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - //lhc_period := env.GetKV("", "lhc_period") + //odcTopology, _ := env.Workflow().GetVars().Get("odc_topology_fullname") + //lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), dd_enabled, dcs_enabled, epn_enabled, odc_topology, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). @@ -238,50 +259,40 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" - //odc_topology_fullname, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - trg_global_run_enabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) + trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("cannot acquire TRG global run enabled") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return + Warning("cannot parse TRG global run enabled") } - trg_enabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) + trgEnabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("cannot acquire TRG enabled") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return + Warning("cannot parse TRG enabled") } - pdp_config_option, ok := varStack["pdp_config_option"] + pdpConfig, ok := varStack["pdp_config_option"] if !ok { log.WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("cannot acquire PDP workflow configuration mode") - return + Warning("cannot acquire PDP workflow configuration mode") } - pdp_topology_description_library_file, ok := varStack["pdp_topology_description_library_file"] + pdpTopology, ok := varStack["pdp_topology_description_library_file"] if !ok { log.WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). - Error("cannot acquire PDP topology description library file") - return + Warning("cannot acquire PDP topology description library file") } - tfb_dd_mode := env.GetKV("", "tfb_dd_mode") - //lhc_period := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg_global_run_enabled, trg_enabled, pdp_config_option, pdp_topology_description_library_file, tfb_dd_mode /*, odc_topology_fullname, lhc_period */) + tfbMode := env.GetKV("", "tfb_dd_mode") + //odcTopology, _ := env.Workflow().GetVars().Get("odc_topology_fullname") + //lhcPeriod := env.GetKV("", "lhc_period") + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trgGlobalRunEnabled, trgEnabled, pdpConfig, pdpTopology, tfbMode /*, odcTopology, lhcPeriod */) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). @@ -329,13 +340,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - envState := env.CurrentState() - - if envState != "RUNNING" { - return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) - } else { - return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) - } + return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } stack["UpdateRunStop"] = func() (out string) { var err error @@ -366,12 +371,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - envState := env.CurrentState() - if envState != "CONFIGURED" { - return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) - } else { - return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) - } + return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) } // Environment related Bookkeeping functions stack["CreateEnv"] = func() (out string) { From 83964eb4fa6d813a48b3f5399998656b04282503 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 25 May 2022 15:58:36 +0200 Subject: [PATCH 1307/2352] [core] Bookkeeping plugin run errors are better handled in case of DESTROY or GO_ERROR transition. --- core/integration/bookkeeping/plugin.go | 33 ++++++++++++++++---------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 5ef456c8a..d710bd0fa 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -120,6 +120,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.Error("cannot acquire environment ID") return } + trigger, ok := varStack["__call_trigger"] + if !ok { + log.WithField("call", call). + WithField("partition", envId). + Error("cannot acquire trigger from varStack") + return + } var err error parsedEnvId, err := uid.FromString(envId) if err != nil { @@ -131,6 +138,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { envMan := environment.ManagerInstance() env, err := envMan.Environment(parsedEnvId) if err != nil { + if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { + log.WithField("partition", envId). + Debug("cannot acquire environment from parsed environment ID when DESTROY or GO_ERROR transition") + return + } log.WithError(err). WithField("partition", envId). Error("cannot acquire environment from parsed environment ID") @@ -140,7 +152,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) // Run related Bookkeeping functions stack["StartOfRun"] = func() (out string) { - var err error callFailedStr := "Bookkeeping StartOfRun call failed" rn := varStack["run_number"] @@ -150,6 +161,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping SOR") + return } if p.bookkeepingClient == nil { @@ -312,7 +324,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } stack["UpdateRunStart"] = func() (out string) { - var err error callFailedStr := "Bookkeeping UpdateRunStart call failed" rn := varStack["run_number"] @@ -321,6 +332,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping UpdateRunStart") + return } if p.bookkeepingClient == nil { @@ -343,15 +355,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } stack["UpdateRunStop"] = func() (out string) { - var err error callFailedStr := "Bookkeeping UpdateRunStop call failed" rn := varStack["run_number"] runNumber64, err := strconv.ParseInt(rn, 10, 32) + if (strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR")) && (rn == "" || runNumber64 == 0) { + log.WithField("partition", envId). + Debug("cannot update run, run number is 0 in UpdateRunStop") + return + } if err != nil { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping UpdateRunStop") + return } if p.bookkeepingClient == nil { @@ -375,7 +392,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // Environment related Bookkeeping functions stack["CreateEnv"] = func() (out string) { - var err error callFailedStr := "Bookkeeping CreateEnv call failed" if p.bookkeepingClient == nil { @@ -435,7 +451,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } stack["UpdateEnv"] = func() (out string) { - var err error callFailedStr := "Bookkeeping UpdateEnv call failed" if p.bookkeepingClient == nil { @@ -454,14 +469,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - trigger, ok := varStack["__call_trigger"] - if !ok { - log.WithField("call", call). - WithField("partition", envId). - Error("cannot acquire trigger from varStack in UpdateEnv") - return - } - envState := env.CurrentState() if strings.Contains(trigger, "DESTROY") { From 70953bb99d27fdab1bf0175be8b7cfe9e24aa71a Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 11:13:59 +0200 Subject: [PATCH 1308/2352] [core] Error are handled better for the plugin. --- core/integration/bookkeeping/plugin.go | 31 ++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index d710bd0fa..565c2ed23 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -26,6 +26,7 @@ package bookkeeping import ( "encoding/json" + "errors" "fmt" "net/url" "strconv" @@ -117,14 +118,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + err := errors.New("cannot acquire environment ID") + log.Error(err) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" return } trigger, ok := varStack["__call_trigger"] if !ok { + err := errors.New("cannot acquire trigger from varStack") log.WithField("call", call). WithField("partition", envId). - Error("cannot acquire trigger from varStack") + Error(err) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" return } var err error @@ -133,6 +142,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("partition", envId). Error("cannot parse environment ID") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" return } envMan := environment.ManagerInstance() @@ -146,6 +158,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("partition", envId). Error("cannot acquire environment from parsed environment ID") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" return } @@ -161,6 +176,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping SOR") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr return } @@ -332,6 +350,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping UpdateRunStart") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr return } @@ -368,6 +389,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithError(err). Error("cannot acquire run number for Bookkeeping UpdateRunStop") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr return } @@ -534,6 +558,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", call). Error("could not obtain transition in UpdateEnv from trigger: ", trigger) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr return } From 9b218fd2536d7b96e03dbd719e245bcef9a2e5b9 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 12:47:33 +0200 Subject: [PATCH 1309/2352] [core] PR comments and merge conflicts resolved. --- core/integration/bookkeeping/plugin.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 565c2ed23..dcfd1b503 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -139,6 +139,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var err error parsedEnvId, err := uid.FromString(envId) if err != nil { + if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { + log.WithField("partition", envId). + Debug("cannot parse environment ID when DESTROY or GO_ERROR transition") + return + } log.WithError(err). WithField("partition", envId). Error("cannot parse environment ID") From d139de9ccc9d8610278d28ba1c97a598ea994012 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Fri, 8 Jul 2022 14:15:47 +0300 Subject: [PATCH 1310/2352] Bump AliECS to v0.45.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a84480157..b368af8be 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 45 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From c843a67c65b7e8bd1a94b2b8270a519628be78ee Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 16:21:09 +0200 Subject: [PATCH 1311/2352] [O2B-560] Empty time objects are handled correctly and pass -1 to Bookkeeping if empty. --- core/integration/bookkeeping/api.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index f1f6fb0d1..1d91e64a4 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -96,7 +96,24 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2Start.UnixMilli(), timeO2End.UnixMilli(), timeTrgStart.UnixMilli(), timeTrgEnd.UnixMilli(), trgGlobal, trg, pdpConfig, pdpTopology, tfbMode /*, odcFullname, lhcPeriod */) + timeO2S := timeO2Start.UnixMilli() + if (timeO2Start == time.Time{} || timeO2S < 0) { + timeO2S = -1 + } + timeO2E := timeO2End.UnixMilli() + if (timeO2End == time.Time{} || timeO2E < 0) { + timeO2E = -1 + } + timeTrgS := timeTrgStart.UnixMilli() + if (timeTrgStart == time.Time{} || timeTrgS < 0) { + timeTrgS = -1 + } + timeTrgE := timeTrgEnd.UnixMilli() + if (timeTrgEnd == time.Time{} || timeTrgE < 0) { + timeTrgE = -1 + } + + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trgGlobal, trg, pdpConfig, pdpTopology, tfbMode /*, odcFullname, lhcPeriod */) return err } From a2b4c3e65d8f3b57311f2eecf00fba2a20e822ce Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 8 Jul 2022 16:26:02 +0200 Subject: [PATCH 1312/2352] Bumping AliECS v0.45.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b368af8be..29d033d5c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 45 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From cbe18736729e5a55bfb0d79a9a38bc67e8e85c26 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 11:03:39 +0200 Subject: [PATCH 1313/2352] [core] ODC GEN_TOPO_PARTITION parameter is no more --- core/integration/odc/plugin.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 15db7678b..ecfa31941 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -250,7 +250,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter WORKFLOW_DETECTORS_CALIB=[...] WORKFLOW_PARAMETERS=[...] RECO_NUM_NODES_OVERRIDE=[...] MULTIPLICITY_FACTOR_RAWDECODERS=[...] MULTIPLICITY_FACTOR_CTFENCODERS=[...] MULTIPLICITY_FACTOR_REST=[...] GEN_TOPO_WIPE_CACHE=[0/1] BEAMTYPE=[PbPb/pp/pPb/cosmic/technical] - NHBPERTF=[...] GEN_TOPO_PARTITION=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] + NHBPERTF=[...] GEN_TOPO_ONTHEFLY=1 [Extra environment variables] /home/epn/pdp/gen_topo.sh R3C-710: @@ -540,9 +540,6 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("NHBPERTF=%s", strings.TrimSpace(pdpNHbfPerTf))) - // envId - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_PARTITION='%s'", envId)) - accumulator = append(accumulator, "GEN_TOPO_ONTHEFLY=1") pdpO2PdpSuiteVersion, ok = varStack["pdp_o2pdpsuite_version"] From 9d5941e83bf5f940f25dea4a5a563a0365d0293a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 11:34:07 +0200 Subject: [PATCH 1314/2352] [core] ODC add RUNTYPE and GEN_TOPO_CACHE_HASH to script generator --- core/integration/odc/plugin.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index ecfa31941..e5c3fddaa 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -28,6 +28,8 @@ package odc import ( "context" + "crypto/md5" + "encoding/hex" "encoding/json" "fmt" "net/url" @@ -281,6 +283,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter pdpO2PdpSuiteVersion, pdpQcJsonVersion string odcNEpnsMaxFail, epnStoreRawDataFraction string pdpEpnShmId, pdpEpnShmRecreate string + runType string ) accumulator = make([]string, 0) @@ -616,6 +619,15 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("SHM_MANAGER_SHM_RECREATE=%d", pdpEpnShmRecreateI)) + runType, ok = varStack["run_type"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Warn("could not get get variable run_type from environment context, using NONE") + runType = "NONE" + } + accumulator = append(accumulator, fmt.Sprintf("RUNTYPE=%s", strings.TrimSpace(runType))) + pdpExtraEnvVars, ok = varStack["pdp_extra_env_vars"] if !ok { log.WithField("partition", envId). @@ -635,6 +647,13 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter accumulator = append(accumulator, strings.TrimSpace(pdpGeneratorScriptPath)) out = strings.Join(accumulator, " ") + + // before we ship out the payload, we take the hash of the full string and prepend a last variable with the + // hash of everything else that follows + hash := md5.Sum([]byte(out)) + hashS := hex.EncodeToString(hash[:]) + out = fmt.Sprintf("GEN_TOPO_CACHE_HASH=%s", hashS) + " " + out + return } stack["GenerateEPNTopologyFullname"] = func() (out string) { From 3910f00763c578aeb2a4fe34579385de1bcaddf6 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 12 Jul 2022 12:23:39 +0200 Subject: [PATCH 1315/2352] [OCTRL-680] Bookkeeping run O2End and TrgEnd times are only updated once. --- core/integration/bookkeeping/plugin.go | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index dcfd1b503..e3f91730c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -46,6 +46,8 @@ type Plugin struct { bookkeepingPort int bookkeepingClient *BookkeepingWrapper + + pendingRunStops map[string] /*envId*/ int64 } func NewPlugin(endpoint string) integration.Plugin { @@ -63,6 +65,7 @@ func NewPlugin(endpoint string) integration.Plugin { bookkeepingHost: u.Hostname(), bookkeepingPort: portNumber, bookkeepingClient: nil, + pendingRunStops: make(map[string]int64), } } @@ -250,6 +253,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error"] = callFailedStr return } else { + p.pendingRunStops[envId] = runNumber64 log.WithField("runNumber", runNumber). WithField("partition", envId). Debug("CreateRun call successful") @@ -292,7 +296,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { + updateRunFunc := func(updateCall string, runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { @@ -339,8 +343,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error"] = callFailedStr return } else { + if updateCall == "stop" { + delete(p.pendingRunStops, envId) + } log.WithField("runNumber", runNumber64). - WithField("state", state). + WithField("updated to", updateCall). WithField("partition", envId). Debug("UpdateRun call successful") } @@ -378,7 +385,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) + return updateRunFunc("start", runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } stack["UpdateRunStop"] = func() (out string) { callFailedStr := "Bookkeeping UpdateRunStop call failed" @@ -387,7 +394,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { runNumber64, err := strconv.ParseInt(rn, 10, 32) if (strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR")) && (rn == "" || runNumber64 == 0) { log.WithField("partition", envId). - Debug("cannot update run, run number is 0 in UpdateRunStop") + Debug("cannot update run on stop, no run for the environment") return } if err != nil { @@ -417,7 +424,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) + if _, ok := p.pendingRunStops[envId]; ok { + return updateRunFunc("stop", runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) + } else { + return + } } // Environment related Bookkeeping functions stack["CreateEnv"] = func() (out string) { From a328d98967951dff34a2637cd142041ba46d89ad Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 12 Jul 2022 13:36:12 +0200 Subject: [PATCH 1316/2352] [OCTRL-680] Bookkeeping plugin UpdateRun function checks whether it is a start or a stop call. --- core/integration/bookkeeping/plugin.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e3f91730c..eb0b8b0cf 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -296,7 +296,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - updateRunFunc := func(updateCall string, runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { + updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { @@ -343,11 +343,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error"] = callFailedStr return } else { - if updateCall == "stop" { + var updatedRun string + emptyTime := time.Time{} + if timeO2Start == emptyTime { + updatedRun = "STOPPED" delete(p.pendingRunStops, envId) + } else { + updatedRun = "STARTED" } log.WithField("runNumber", runNumber64). - WithField("updated to", updateCall). + WithField("updated to", updatedRun). WithField("partition", envId). Debug("UpdateRun call successful") } @@ -385,7 +390,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - return updateRunFunc("start", runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) + return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) } stack["UpdateRunStop"] = func() (out string) { callFailedStr := "Bookkeeping UpdateRunStop call failed" @@ -425,7 +430,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if _, ok := p.pendingRunStops[envId]; ok { - return updateRunFunc("stop", runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) + return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) } else { return } From e1bf6f5127485f7cf8f82732a396f865e61288b5 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 12 Jul 2022 13:50:42 +0200 Subject: [PATCH 1317/2352] [OCTRL-680] A warning is issued if there is no run number found in the pending runs of the BK plugin cache. --- core/integration/bookkeeping/plugin.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index eb0b8b0cf..de62310e5 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -432,6 +432,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if _, ok := p.pendingRunStops[envId]; ok { return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) } else { + log.WithField("partition", envId). + Warning("skipping UpdateRun call, no pending run number found") return } } From c36ff3c5a731399999e52c1be39ab90484fc586e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 14:26:11 +0200 Subject: [PATCH 1318/2352] [core] Push orbit-reset-time to all FairMQ devices on FLP and EPN --- core/integration/odc/plugin.go | 24 ++++++++++++++++++++++++ core/task/task.go | 6 ++++++ 2 files changed, 30 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index e5c3fddaa..27c7fca36 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -898,6 +898,30 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warn("cannot acquire general detector list from varStack") } + // Push orbit-reset-time if pdp_override_run_start_time set + pdpOverrideRunStartTime, ok := varStack["pdp_override_run_start_time"] + if ok && len(pdpOverrideRunStartTime) > 0 { + arguments["orbit-reset-time"] = pdpOverrideRunStartTime + if strings.Contains(runType, "SYNTHETIC") { + log.WithField("partition", envId). + WithField("call", "Configure"). + WithField("runType", runType). + Infof("overriding run start time (orbit-reset-time) to %s for SYNTHETIC run", pdpOverrideRunStartTime) + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + WithField("runType", runType). + Warnf("overriding run start time (orbit-reset-time) to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) + } + } else { // no run start override defined + if strings.Contains(runType, "SYNTHETIC") { + log.WithField("partition", envId). + WithField("call", "Configure"). + WithField("runType", runType). + Warnf("requested SYNTHETIC run but run start time (orbit-reset-time) override not provided") + } + } + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId) diff --git a/core/task/task.go b/core/task/task.go index f6ea8c4a2..70120e641 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -509,6 +509,12 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap[k] = v } + // Push orbit-reset-time if pdp_override_run_start_time set + pdpOverrideRunStartTime, ok := varStack["pdp_override_run_start_time"] + if ok { + propMap["orbit-reset-time"] = pdpOverrideRunStartTime + } + // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT { From 22ba0ace63a3f934c607be460afd3728382c448b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 15:35:35 +0200 Subject: [PATCH 1319/2352] [common] COSMIC->COSMICS plus add SYNTHETIC to run types --- common/runtype/runtype.go | 6 ++++-- common/runtype/runtype_strings.go | 24 ++++++++++++++---------- common/system/systemid_strings.go | 4 ++-- go.mod | 8 ++++---- go.sum | 18 ++++++++++++++++++ 5 files changed, 42 insertions(+), 18 deletions(-) diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 592ebe181..59fe0c016 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -28,6 +28,7 @@ package runtype // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go type RunType int + const ( NONE RunType = iota PHYSICS @@ -45,5 +46,6 @@ const ( // no correspondence with DCS: CALIBRATION - COSMIC -) \ No newline at end of file + COSMICS + SYNTHETIC +) diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index 099945716..c17aea083 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMIC" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMICSSYNTHETIC" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 208} +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 209, 218} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmic" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmicssynthetic" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -39,10 +39,11 @@ func _RunTypeNoOp() { _ = x[CALIBRATION_FHR-(11)] _ = x[CALIBRATION_ALPIDE_SCAN-(12)] _ = x[CALIBRATION-(13)] - _ = x[COSMIC-(14)] + _ = x[COSMICS-(14)] + _ = x[SYNTHETIC-(15)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMIC} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMICS, SYNTHETIC} var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeName[0:4]: NONE, @@ -73,8 +74,10 @@ var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeLowerName[168:191]: CALIBRATION_ALPIDE_SCAN, _RunTypeName[191:202]: CALIBRATION, _RunTypeLowerName[191:202]: CALIBRATION, - _RunTypeName[202:208]: COSMIC, - _RunTypeLowerName[202:208]: COSMIC, + _RunTypeName[202:209]: COSMICS, + _RunTypeLowerName[202:209]: COSMICS, + _RunTypeName[209:218]: SYNTHETIC, + _RunTypeLowerName[209:218]: SYNTHETIC, } var _RunTypeNames = []string{ @@ -92,7 +95,8 @@ var _RunTypeNames = []string{ _RunTypeName[153:168], _RunTypeName[168:191], _RunTypeName[191:202], - _RunTypeName[202:208], + _RunTypeName[202:209], + _RunTypeName[209:218], } // RunTypeString retrieves an enum value from the enum constants string name. @@ -101,8 +105,8 @@ func RunTypeString(s string) (RunType, error) { if val, ok := _RunTypeNameToValueMap[s]; ok { return val, nil } - s = strings.ToLower(s) - if val, ok := _RunTypeNameToValueMap[s]; ok { + + if val, ok := _RunTypeNameToValueMap[strings.ToLower(s)]; ok { return val, nil } return 0, fmt.Errorf("%s does not belong to RunType values", s) diff --git a/common/system/systemid_strings.go b/common/system/systemid_strings.go index 5ccecf525..7ad087f90 100644 --- a/common/system/systemid_strings.go +++ b/common/system/systemid_strings.go @@ -177,8 +177,8 @@ func IDString(s string) (ID, error) { if val, ok := _IDNameToValueMap[s]; ok { return val, nil } - s = strings.ToLower(s) - if val, ok := _IDNameToValueMap[s]; ok { + + if val, ok := _IDNameToValueMap[strings.ToLower(s)]; ok { return val, nil } return 0, fmt.Errorf("%s does not belong to ID values", s) diff --git a/go.mod b/go.mod index d7acb4d9c..eb087f8a0 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect github.com/deckarep/golang-set v1.7.1 // indirect github.com/denisbrodbeck/machineid v1.0.1 - github.com/dmarkham/enumer v1.5.2 + github.com/dmarkham/enumer v1.5.5 github.com/dustin/go-humanize v1.0.0 // indirect github.com/envoyproxy/go-control-plane v0.9.8 // indirect github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect @@ -126,7 +126,6 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.0.0 github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 // indirect - github.com/yuin/goldmark v1.3.2 // indirect go.etcd.io/bbolt v1.3.4 // indirect go.opencensus.io v0.22.6 // indirect go.uber.org/zap v1.14.1 // indirect @@ -134,12 +133,13 @@ require ( golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect - golang.org/x/mod v0.4.2 // indirect golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect - golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 + golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect + golang.org/x/tools v0.1.11 // indirect + golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/api v0.39.0 // indirect google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect google.golang.org/grpc v1.45.0 diff --git a/go.sum b/go.sum index 918a6446b..552ccf9d4 100644 --- a/go.sum +++ b/go.sum @@ -288,6 +288,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dmarkham/enumer v1.5.2 h1:dZxvuDqF8oL1fg9vxp1TjqHJ0JSL9ADU+hHbisgsRB8= github.com/dmarkham/enumer v1.5.2/go.mod h1:jZ3PNbNJDEkFGx54MlkSjnDQUo7445l7/guoKdh9cY8= +github.com/dmarkham/enumer v1.5.5 h1:LpOGL3PQTPOM87rgowZEf7Z5EmkgnKqUtS92Vo+vqzs= +github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= @@ -1081,6 +1083,7 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.2 h1:YjHC5TgyMmHpicTgEqDN0Q96Xo8K6tLXPnmNOHXCgs0= github.com/yuin/goldmark v1.3.2/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= @@ -1141,6 +1144,7 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1197,6 +1201,9 @@ golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1253,8 +1260,10 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= @@ -1291,6 +1300,7 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1370,9 +1380,12 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew= +golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1479,12 +1492,17 @@ golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= +golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= +golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= +golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= From daaf1ffbae63aff9eaa45d34447e2c7cf2e0dcea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 16:11:26 +0200 Subject: [PATCH 1320/2352] [core] Special case for COSMICS run type in DCS --- core/integration/dcs/plugin.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index cb60bac60..d13cffc4f 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -244,9 +244,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // so we convert from the provided string to the correct enum value in common/runtype intRt, err := runtype.RunTypeString(runTypeS) if err == nil { - // the runType was correctly matched to the common/runtype enum, but since the DCS enum is - // kept compatible, we can directly convert the runtype.RunType to a dcspb.RunType enum value - rt = dcspb.RunType(intRt) + if intRt == runtype.COSMICS { + // special case for COSMICS runs: there is no DCS run type for it, so we send PHYSICS + rt = dcspb.RunType_PHYSICS + } else { + // the runType was correctly matched to the common/runtype enum, but since the DCS enum is + // kept compatible, we can directly convert the runtype.RunType to a dcspb.RunType enum value + rt = dcspb.RunType(intRt) + } } } From 0eadca07517c4022116a20c51d5ac91cd0ac3d6c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 12 Jul 2022 15:56:46 +0200 Subject: [PATCH 1321/2352] [OCTRL-679] O2 times and Trg times should be the correct ones for BK run details. --- core/integration/bookkeeping/api.go | 43 ++++++++++++++++++++------ core/integration/bookkeeping/plugin.go | 18 ++++++++--- core/integration/trg/plugin.go | 6 ++++ 3 files changed, 53 insertions(+), 14 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 1d91e64a4..b4a78daf2 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -27,6 +27,7 @@ package bookkeeping import ( "net/url" "path" + "strconv" "sync" "time" @@ -85,7 +86,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -96,20 +97,44 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO runquality = sw.TEST_RunQuality } - timeO2S := timeO2Start.UnixMilli() - if (timeO2Start == time.Time{} || timeO2S < 0) { + timeO2S, ok := strconv.ParseInt(timeO2Start, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeO2Start). + Warning("cannot parse O2 start time") timeO2S = -1 } - timeO2E := timeO2End.UnixMilli() - if (timeO2End == time.Time{} || timeO2E < 0) { + if timeO2Start == "" || timeO2S <= 0 { + timeO2S = -1 + } + timeO2E, ok := strconv.ParseInt(timeO2End, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeO2End). + Warning("cannot parse O2 end time") + timeO2E = -1 + } + if timeO2End == "" || timeO2E <= 0 { timeO2E = -1 } - timeTrgS := timeTrgStart.UnixMilli() - if (timeTrgStart == time.Time{} || timeTrgS < 0) { + timeTrgS, ok := strconv.ParseInt(timeTrgStart, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeTrgStart). + Warning("cannot parse Trg start time") timeTrgS = -1 } - timeTrgE := timeTrgEnd.UnixMilli() - if (timeTrgEnd == time.Time{} || timeTrgE < 0) { + if timeTrgStart == "" || timeTrgS <= 0 { + timeTrgS = -1 + } + timeTrgE, ok := strconv.ParseInt(timeTrgEnd, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeTrgEnd). + Warning("cannot parse Trg end time") + timeTrgE = -1 + } + if timeTrgEnd == "" || timeTrgE <= 0 { timeTrgE = -1 } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index de62310e5..6de77a23e 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -296,7 +296,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - updateRunFunc := func(runNumber64 int64, state string, timeO2Start time.Time, timeO2End time.Time, timeTrgStart time.Time, timeTrgEnd time.Time) (out string) { + updateRunFunc := func(runNumber64 int64, state string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { @@ -344,8 +344,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { var updatedRun string - emptyTime := time.Time{} - if timeO2Start == emptyTime { + if function, ok := varStack["__call_func"]; ok && function == "UpdateRunStop" { updatedRun = "STOPPED" delete(p.pendingRunStops, envId) } else { @@ -390,7 +389,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - return updateRunFunc(runNumber64, "test", time.Now(), time.Time{}, time.Now(), time.Time{}) + O2StartTime := varStack["run_start_time_ms"] + TrgStartTime := varStack["trg_start_time_ms"] + + return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") } stack["UpdateRunStop"] = func() (out string) { callFailedStr := "Bookkeeping UpdateRunStop call failed" @@ -429,8 +431,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + O2StartTime := varStack["run_start_time_ms"] + O2EndTime := varStack["run_end_time_ms"] + + TrgStartTime := varStack["trg_start_time_ms"] + TrgEndTime := varStack["trg_end_time_ms"] + if _, ok := p.pendingRunStops[envId]; ok { - return updateRunFunc(runNumber64, "test", time.Time{}, time.Now(), time.Time{}, time.Now()) + return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) } else { log.WithField("partition", envId). Warning("skipping UpdateRun call, no pending run number found") diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 19f35e8ee..4b4ea36a0 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -598,6 +598,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). Debug("TRG RunStart success") + trgStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + call.GetParentRole().(callable.ParentRole).SetRuntimeVar("trg_start_time_ms", trgStartTime) + return } runStopFunc := func(runNumber64 int64) (out string) { @@ -702,6 +705,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). Debug("TRG RunStop success") + trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + call.GetParentRole().(callable.ParentRole).SetRuntimeVar("trg_end_time_ms", trgEndTime) + return } runUnloadFunc := func(runNumber64 int64) (out string) { From 8081e74fa681201cfba1b021a34d4e4571d8055e Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 12 Jul 2022 16:12:26 +0200 Subject: [PATCH 1322/2352] [OCTRL-680] Correcting PR problems. --- core/integration/bookkeeping/plugin.go | 2 +- core/integration/trg/plugin.go | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 6de77a23e..14749ab8a 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -344,7 +344,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { var updatedRun string - if function, ok := varStack["__call_func"]; ok && function == "UpdateRunStop" { + if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { updatedRun = "STOPPED" delete(p.pendingRunStops, envId) } else { diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 4b4ea36a0..2f142ab6a 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -599,7 +599,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("TRG RunStart success") trgStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - call.GetParentRole().(callable.ParentRole).SetRuntimeVar("trg_start_time_ms", trgStartTime) + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar("trg_start_time_ms", trgStartTime) + } return } @@ -706,7 +709,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("TRG RunStop success") trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - call.GetParentRole().(callable.ParentRole).SetRuntimeVar("trg_end_time_ms", trgEndTime) + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + } return } From 37e19d1c1cb9db0c8eda37d0ab58a6d8b5084afe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 12 Jul 2022 16:28:45 +0200 Subject: [PATCH 1323/2352] [build] Bump to v0.46.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 29d033d5c..a5450fb11 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 45 -VERSION_PATCH := 3 +VERSION_MINOR := 46 +VERSION_PATCH := 0 From ea43368da8e28c9ba46fb5b57590decac91ba676 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 13 Jul 2022 15:21:47 +0200 Subject: [PATCH 1324/2352] [core] allow to override the start of run time in GRP objects --- core/integration/ccdb/plugin.go | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index e173396c6..8654cd243 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -97,6 +97,54 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { startTime := varStack["run_start_time_ms"] endTime := varStack["run_end_time_ms"] + // use the fake run start time if available + pdpOverrideRunStartTime, ok := varStack["pdp_override_run_start_time"] + if ok && len(pdpOverrideRunStartTime) > 0 { + if strings.Contains(runTypeStr, "SYNTHETIC") { + log.WithField("partition", envId). + WithField("runType", runTypeStr). + Infof("overriding run start time in the GRP object to %s for SYNTHETIC run", pdpOverrideRunStartTime) + } else { + log.WithField("partition", envId). + WithField("runType", runTypeStr). + Warnf("overriding run start time to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) + } + if len(endTime) > 0 { + // calculate eor time as pdp_override_run_start_time + real run duration + startTimeNumber, err := strconv.ParseUint(startTime, 10, 64) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Errorf("could not parse run startTime: %s", startTime) + } + pdpOverrideRunStartTimeNumber, err := strconv.ParseUint(pdpOverrideRunStartTime, 10, 64) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Errorf("could not parse pdpOverrideRunStartTimeNumber: %s", pdpOverrideRunStartTime) + } + endTimeNumber, err := strconv.ParseUint(endTime, 10, 64) + if err != nil { + log.WithError(err). + WithField("partition", envId). + Errorf("could not parse run endTime: %s", endTime) + } + if endTimeNumber <= startTimeNumber { + log.WithError(err). + WithField("partition", envId). + Errorf("endTimeNumber (%d) is smaller or equal to startTimeNumber (%d)", endTimeNumber, startTimeNumber) + } + + runDuration := endTimeNumber - startTimeNumber + endTime = strconv.FormatUint(pdpOverrideRunStartTimeNumber+runDuration, 10) + } + startTime = pdpOverrideRunStartTime + } else if strings.Contains(runTypeStr, "SYNTHETIC") { + log.WithField("partition", envId). + WithField("runType", runTypeStr). + Warnf("requested SYNTHETIC run but run start time override not provided") + } + detectorsStr, ok := varStack["detectors"] if !ok { log.WithField("partition", envId). From c06c09343db5763b11367260eae21eeb8c52c066 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Jul 2022 15:58:22 +0200 Subject: [PATCH 1325/2352] [executor] Fix gRPC socket GC issue that caused failed deployments --- executor/executable/controllabletask.go | 2 +- executor/executorcmd/client.go | 23 +++++++++++++++++++++-- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6f8818354..b817e2c2d 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -112,7 +112,7 @@ func (t *ControllableTask) Launch() error { // via channels. go func() { log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "cmd": t.Tci.GetValue(), "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 91d42b7d1..8c7a865ea 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/executor/executorcmd/nopb" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" @@ -66,14 +67,32 @@ func NewClient( } cxt, cancel := context.WithTimeout(context.Background(), GRPC_DIAL_TIMEOUT) - conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock()) + conn, err := grpc.DialContext(cxt, endpoint, grpc.WithInsecure(), grpc.WithBlock(), grpc.WithReturnConnectionError(), grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: 200 * time.Millisecond, + Multiplier: 1.1, + Jitter: 0.02, + MaxDelay: GRPC_DIAL_TIMEOUT, + }, + MinConnectTimeout: 5 * time.Second, + })) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). WithField("transport", controlTransportS). - Errorf("gRPC client can't dial") + Error("gRPC client can't dial") cancel() + if conn != nil { + log.WithField("endpoint", endpoint). + WithField("transport", controlTransportS). + Warn("gRPC client connection failure: cleaning up leftover connection") + _ = conn.Close() + } return nil + } else { + log.WithField("endpoint", endpoint). + WithField("transport", controlTransportS). + Debug("gRPC client dial successful") } var occClient pb.OccClient From e4b467cd908024ed2b94f3ed060f1974e5e4efa8 Mon Sep 17 00:00:00 2001 From: Kostas Alexopoulos Date: Tue, 19 Jul 2022 10:44:00 +0200 Subject: [PATCH 1326/2352] Revert "[task] Add a random sleep of up to 10s before each task for debugging purposes" This reverts commit 3eabd9f3a23637dcaf74dfb26fd498b4117999a7. --- core/task/task.go | 76 ++++++++++++++++++++++------------------------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index 70120e641..363232aab 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -32,7 +32,6 @@ package task import ( "errors" "fmt" - "math/rand" "strconv" "strings" "sync" @@ -55,7 +54,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(), "task") +var log = logger.New(logrus.StandardLogger(),"task") type parentRole interface { UpdateStatus(Status) @@ -74,10 +73,11 @@ type parentRole interface { SendEvent(event.Event) } + type Traits struct { - Trigger string - Await string - Timeout string + Trigger string + Await string + Timeout string Critical bool } @@ -103,31 +103,32 @@ type Task interface { GetMesosCommandTarget() controlcommands.MesosCommandTarget }*/ + type Task struct { - mu sync.RWMutex - parent parentRole - className string + mu sync.RWMutex + parent parentRole + className string //configuration Descriptor - name string - hostname string - agentId string - offerId string - taskId string - executorId string + name string + hostname string + agentId string + offerId string + taskId string + executorId string localBindMap channel.BindMap - status Status - state State - safeToStop bool + status Status + state State + safeToStop bool - properties gera.StringMap + properties gera.StringMap GetTaskClass func() *Class // ↑ to be filled in by NewTaskForMesosOffer in Manager - commandInfo *common.TaskCommandInfo - pid string + commandInfo *common.TaskCommandInfo + pid string } func (t *Task) IsSafeToStop() bool { @@ -162,11 +163,11 @@ func (t *Task) IsLocked() bool { t.mu.RLock() defer t.mu.RUnlock() return len(t.hostname) > 0 && - len(t.agentId) > 0 && - len(t.offerId) > 0 && - len(t.taskId) > 0 && - len(t.executorId) > 0 && - t.parent != nil + len(t.agentId) > 0 && + len(t.offerId) > 0 && + len(t.taskId) > 0 && + len(t.executorId) > 0 && + t.parent != nil } func (t *Task) GetName() string { @@ -195,11 +196,11 @@ func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { varStack := make(map[string]string) - varStack["task_name"] = t.GetName() - varStack["task_id"] = t.GetTaskId() - varStack["task_class_name"] = t.GetClassName() - varStack["task_hostname"] = t.GetHostname() - varStack["environment_id"] = role.GetEnvironmentId().String() + varStack["task_name"] = t.GetName() + varStack["task_id"] = t.GetTaskId() + varStack["task_class_name"] = t.GetClassName() + varStack["task_hostname"] = t.GetHostname() + varStack["environment_id"] = role.GetEnvironmentId().String() varStack["task_parent_role"] = role.GetPath() return varStack } @@ -309,8 +310,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { }, append( template.WrapSliceItems(cmd.Env), - template.WrapSliceItems(cmd.Arguments)..., - )..., + template.WrapSliceItems(cmd.Arguments)... + )... ) if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) @@ -356,13 +357,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.Log = &none } - // We want each task to randomly sleep for a bit before it executes... - // TODO: for debugging only to be removed imminently - rand.Seed(time.Now().UnixNano()) - sleepFor := rand.Intn(10) + 1 // returns a number between [1-10] - - *cmd.Value = "sleep " + strconv.Itoa(sleepFor) + " && " + *cmd.Value - t.commandInfo = cmd } else { t.commandInfo = &common.TaskCommandInfo{} @@ -448,7 +442,7 @@ func (t *Task) SendEvent(ev event.Event) { defer t.mu.RUnlock() if t.parent == nil { - return + return } t.parent.SendEvent(ev) } @@ -657,4 +651,4 @@ func (t *Task) GetTask() *Task { defer t.mu.RUnlock() return t -} +} \ No newline at end of file From 91147b5ae8e6bb494cb6e8d4ebd4385a9f7410dc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Jul 2022 16:49:31 +0200 Subject: [PATCH 1327/2352] [core] Add support for pdp_force_run_as_raw variable in ODC --- core/integration/odc/plugin.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 27c7fca36..2ccb88dbe 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -882,6 +882,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warn("could not get get variable lhc_period from environment context") } + forceRunAsRaw, ok := varStack["pdp_force_run_as_raw"] + if ok { + arguments["force_run_as_raw"] = forceRunAsRaw + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("could not get get variable force_run_as_raw from environment context") + } + detectorListS, ok := varStack["detectors"] if ok { detectorsSlice, err := p.parseDetectors(detectorListS) From 957bc27bae5483738a18ead7b7cb5d30d9430e7b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Jul 2022 16:26:24 +0200 Subject: [PATCH 1328/2352] [core] Refactor task.Class into its own package + thread safety --- core/task/classToTask.go | 8 +- core/task/descriptor.go | 2 +- core/task/manager.go | 61 +++++----- core/task/match.go | 19 ++-- core/task/scheduler.go | 2 +- core/task/task.go | 8 +- core/task/{ => taskclass}/class.go | 142 ++++++++++++++---------- core/task/{ => taskclass/port}/range.go | 12 +- core/workflow/load.go | 18 +-- walnut/cmd/convert.go | 14 +-- walnut/converter/converter.go | 25 +++-- 11 files changed, 174 insertions(+), 137 deletions(-) rename core/task/{ => taskclass}/class.go (64%) rename core/task/{ => taskclass/port}/range.go (92%) diff --git a/core/task/classToTask.go b/core/task/classToTask.go index c775d2c64..40b41250f 100644 --- a/core/task/classToTask.go +++ b/core/task/classToTask.go @@ -24,10 +24,12 @@ package task -func ClassToTask(input *Class, parent parentRole) *Task { +import "github.com/AliceO2Group/Control/core/task/taskclass" + +func ClassToTask(input *taskclass.Class, parent parentRole) *Task { output := Task{ - parent: parent, - GetTaskClass: func() *Class { + parent: parent, + GetTaskClass: func() *taskclass.Class { return input }, commandInfo: nil, diff --git a/core/task/descriptor.go b/core/task/descriptor.go index 8be07021b..c59a031b6 100644 --- a/core/task/descriptor.go +++ b/core/task/descriptor.go @@ -280,7 +280,7 @@ func roleInfoFromConfiguration(name string, cfgMap configuration.Map, mandatoryF Debug(cfgErr.Error()) } } else { - wantsPortsR, err = parsePortRanges(string(wantsPorts.Value())) + wantsPortsR, err = class.RangesFromExpression(string(wantsPorts.Value())) if err != nil { err = errors.New(fmt.Sprintf("%s: %s", cfgErr.Error(), err.Error())) diff --git a/core/task/manager.go b/core/task/manager.go index 089e7d6cf..b815d2093 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" "github.com/mesos/mesos-go/api/v1/lib/extras/store" @@ -76,7 +77,7 @@ type Manager struct { AgentCache AgentCache MessageChannel chan *TaskmanMessage - classes *classes + classes *taskclass.Classes roster *roster resourceOffersDone <-chan ResourceOffersOutcome @@ -120,7 +121,7 @@ func NewManager(shutdown func(), } taskman = &Manager{ - classes: newClasses(), + classes: taskclass.NewClasses(), roster: newRoster(), internalEventCh: internalEventCh, } @@ -165,7 +166,7 @@ func (m *Manager) newTaskForMesosOffer( state: STANDBY, status: INACTIVE, } - t.GetTaskClass = func() *Class { + t.GetTaskClass = func() *taskclass.Class { return m.GetTaskClass(t.className) } t.localBindMap = make(channel.BindMap) @@ -175,11 +176,11 @@ func (m *Manager) newTaskForMesosOffer( return } -func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err error) { +func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass.Class, err error) { repoManager := the.RepoManager() var yamlData []byte - taskClassList = make([]*Class, 0) + taskClassList = make([]*taskclass.Class, 0) for _, taskClass := range taskClassesRequired { taskClassString := strings.Split(taskClass, "@") @@ -199,7 +200,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err if err != nil { return nil, err } - taskClassStruct := Class{} + taskClassStruct := taskclass.Class{} err = yaml.Unmarshal(yamlData, &taskClassStruct) if err != nil { return nil, fmt.Errorf("task template load error (template=%s): %w", taskTemplatePath, err) @@ -225,8 +226,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*Class, err return } - taskClassStruct.Identifier.repoIdentifier = repo.GetIdentifier() - taskClassStruct.Identifier.hash = repo.GetHash() + taskClassStruct.Identifier.RepoIdentifier = repo.GetIdentifier() + taskClassStruct.Identifier.Hash = repo.GetHash() taskClassList = append(taskClassList, &taskClassStruct) } return taskClassList, nil @@ -241,31 +242,39 @@ func (m *Manager) GetFrameworkID() string { } func (m *Manager) removeInactiveClasses() { + _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { + keys := make([]string, 0) - classMap := m.classes.getMap() + // push keys of classes that don't appear in roster any more into a slice + for taskClassIdentifier := range *classMap { + if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + keys = append(keys, taskClassIdentifier) + } + } - keys := make([]string, 0) - for taskClassIdentifier := range classMap { - if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { - keys = append(keys, taskClassIdentifier) + // and delete them + for _, k := range keys { + delete(*classMap, k) } - } - m.classes.deleteKeys(keys) + return nil + }) return } func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused - utils.EnsureTrailingSlash(&repoPath) - for taskClassIdentifier := range m.classes.getMap() { - if strings.HasPrefix(taskClassIdentifier, repoPath) && - len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { - m.classes.deleteKey(taskClassIdentifier) + _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { + for taskClassIdentifier := range *classMap { + if strings.HasPrefix(taskClassIdentifier, repoPath) && + len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { + delete(*classMap, taskClassIdentifier) + } } - } + return nil + }) return } @@ -274,7 +283,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { m.removeInactiveClasses() - var taskClassList []*Class + var taskClassList []*taskclass.Class taskClassList, err = getTaskClassList(taskClassesRequired) if err != nil { return err @@ -283,7 +292,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { for _, class := range taskClassList { taskClassIdentifier := class.Identifier.String() // If it already exists we update, otherwise we add the new class - m.classes.updateClass(taskClassIdentifier, class) + m.classes.UpdateClass(taskClassIdentifier, class) } return } @@ -326,7 +335,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e if taskPtr != nil { if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) - taskClass, classFound := m.classes.getClass(descriptor.TaskClassName) + taskClass, classFound := m.classes.GetClass(descriptor.TaskClassName) if classFound && taskClass != nil && agentInfo != nil { targetConstraints := descriptor. RoleConstraints.MergeParent(taskClass.Constraints) @@ -690,11 +699,11 @@ func (m *Manager) TriggerHooks(tasks Tasks) error { return nil } -func (m *Manager) GetTaskClass(name string) (b *Class) { +func (m *Manager) GetTaskClass(name string) (b *taskclass.Class) { if m == nil { return } - b, _ = m.classes.getClass(name) + b, _ = m.classes.GetClass(name) return } diff --git a/core/task/match.go b/core/task/match.go index b6dd354bf..b83484c23 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -27,6 +27,7 @@ package task import ( "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/resources" ) @@ -34,13 +35,13 @@ import ( type Wants struct { Cpu float64 Memory float64 - StaticPorts Ranges + StaticPorts port.Ranges InboundChannels []channel.Inbound } // GetWantsForDescriptor matches between taskclass and taskmanager's classes func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { - taskClass, ok := m.classes.getClass(descriptor.TaskClassName) + taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) if ok && taskClass != nil { r = &Wants{} wants := taskClass.Wants @@ -51,17 +52,21 @@ func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { r.Memory = *wants.Memory } if wants.Ports != nil { - r.StaticPorts = make(Ranges, len(wants.Ports)) + r.StaticPorts = make(port.Ranges, len(wants.Ports)) copy(r.StaticPorts, wants.Ports) } r.InboundChannels = channel.MergeInbound(descriptor.RoleBind, taskClass.Bind) + } else { + log.WithField("taskClass", descriptor.TaskClassName). + WithField("constraints", descriptor.RoleConstraints.String()). + Warnf("task class not found for descriptor") } return } type Resources mesos.Resources -func (r Resources) Satisfy(wants *Wants) (bool) { +func (r Resources) Satisfy(wants *Wants) bool { availCpu, ok := resources.CPUs(r...) if !ok || wants.Cpu > availCpu { return false @@ -86,7 +91,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { wantsBindCount := len(wants.InboundChannels) // if total ports minus what we use for static ranges is LESS than the number of dynamic ports we'll need... - if availPorts.Size() - wantsStaticRanges.Size() < uint64(wantsBindCount) { + if availPorts.Size()-wantsStaticRanges.Size() < uint64(wantsBindCount) { return false } @@ -97,7 +102,7 @@ func (r Resources) Satisfy(wants *Wants) (bool) { func (m *Manager) BuildDescriptorConstraints(descriptors Descriptors) (cm map[*Descriptor]constraint.Constraints) { cm = make(map[*Descriptor]constraint.Constraints) for _, descriptor := range descriptors { - taskClass, ok := m.classes.getClass(descriptor.TaskClassName) + taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) if ok && taskClass != nil { cm[descriptor] = descriptor.RoleConstraints.MergeParent(taskClass.Constraints) } else { @@ -144,4 +149,4 @@ func (m *Manager) BuildTasksForOffers(descriptors Descriptors, offers []mesos.Of } return } -*/ \ No newline at end of file +*/ diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 6481e8192..ef3d7a768 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -563,7 +563,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "level": infologger.IL_Devel, "offerHost": offer.Hostname, }). - Error("invalid task class: no resource demands for descriptor, WILL NOT BE DEPLOYED") + Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") continue } if !Resources(remainingResourcesInOffer).Satisfy(wants) { diff --git a/core/task/task.go b/core/task/task.go index 363232aab..032d0f438 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -48,6 +48,8 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/taskclass" + "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/AliceO2Group/Control/core/the" "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" @@ -124,7 +126,7 @@ type Task struct { properties gera.StringMap - GetTaskClass func() *Class + GetTaskClass func() *taskclass.Class // ↑ to be filled in by NewTaskForMesosOffer in Manager commandInfo *common.TaskCommandInfo @@ -383,10 +385,10 @@ func (t *Task) GetWantsMemory() float64 { return -1 } -func (t *Task) GetWantsPorts() Ranges { +func (t *Task) GetWantsPorts() port.Ranges { if t != nil { if tt := t.GetTaskClass(); tt != nil { - wantsPorts := make(Ranges, len(tt.Wants.Ports)) + wantsPorts := make(port.Ranges, len(tt.Wants.Ports)) copy(wantsPorts, tt.Wants.Ports) return wantsPorts } diff --git a/core/task/class.go b/core/task/taskclass/class.go similarity index 64% rename from core/task/class.go rename to core/task/taskclass/class.go index a0fca93e7..11298923d 100644 --- a/core/task/class.go +++ b/core/task/taskclass/class.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package task +package taskclass import ( "fmt" @@ -32,48 +32,53 @@ import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/task/taskclass/port" + "github.com/sirupsen/logrus" ) +var log = logger.New(logrus.StandardLogger(), "taskclass") + // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Vars gera.StringMap `yaml:"vars"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier Id `yaml:"name"` + Defaults gera.StringMap `yaml:"defaults"` + Vars gera.StringMap `yaml:"vars"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because // gera.StringMap is an interface type _class struct { - Identifier TaskClassIdentifier `yaml:"name"` - Defaults map[string]string `yaml:"defaults"` - Vars map[string]string `yaml:"vars"` - Control struct { - Mode controlmode.ControlMode `yaml:"mode"` - } `yaml:"control"` + Identifier Id `yaml:"name"` + Defaults map[string]string `yaml:"defaults"` + Vars map[string]string `yaml:"vars"` + Control struct { + Mode controlmode.ControlMode `yaml:"mode"` + } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Connect []channel.Outbound `yaml:"connect"` } aux := _class{ - Defaults: make(map[string]string), - Vars: make(map[string]string), + Defaults: make(map[string]string), + Vars: make(map[string]string), Properties: make(map[string]string), } err = unmarshal(&aux) @@ -86,16 +91,16 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Vars: gera.MakeStringMapWithMap(aux.Vars), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints:aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Vars: gera.MakeStringMapWithMap(aux.Vars), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, } } return @@ -104,12 +109,12 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { func (c *Class) MarshalYAML() (interface{}, error) { type _class struct { - Name string `yaml:"name"` - Defaults map[string]string `yaml:"defaults,omitempty"` - Vars map[string]string `yaml:"vars,omitempty"` + Name string `yaml:"name"` + Defaults map[string]string `yaml:"defaults,omitempty"` + Vars map[string]string `yaml:"vars,omitempty"` Control struct { - Mode string `yaml:"mode"` - } `yaml:"control"` + Mode string `yaml:"mode"` + } `yaml:"control"` Wants ResourceWants `yaml:"wants"` Bind []channel.Inbound `yaml:"bind,omitempty"` Properties map[string]string `yaml:"properties,omitempty"` @@ -139,32 +144,32 @@ func (c *Class) MarshalYAML() (interface{}, error) { return aux, nil } -type TaskClassIdentifier struct { - repoIdentifier string - hash string +type Id struct { + RepoIdentifier string + Hash string Name string } -func (tcID TaskClassIdentifier) String() string { - return fmt.Sprintf("%s/tasks/%s@%s", tcID.repoIdentifier, tcID.Name, tcID.hash) +func (tcID Id) String() string { + return fmt.Sprintf("%s/tasks/%s@%s", tcID.RepoIdentifier, tcID.Name, tcID.Hash) } -func (tcID *TaskClassIdentifier) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { +func (tcID *Id) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { err = unmarshal(&tcID.Name) return } type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports Ranges `yaml:"ports,omitempty"` + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports port.Ranges `yaml:"ports,omitempty"` } func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` } aux := _resourceWants{} err = unmarshal(&aux) @@ -189,8 +194,8 @@ func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err e rw.Memory = &memCount } if aux.Ports != nil { - var ranges Ranges - ranges, err = parsePortRanges(*aux.Ports) + var ranges port.Ranges + ranges, err = port.RangesFromExpression(*aux.Ports) if err != nil { return } @@ -210,27 +215,44 @@ func (c *Class) Equals(other *Class) (response bool) { return } -type classes struct { +type Classes struct { mu sync.RWMutex classMap map[string]*Class } +func (c *Classes) Do(f func(classMap *map[string]*Class) error) error { + c.mu.Lock() + defer c.mu.Unlock() + return f(&c.classMap) +} + +func (c *Classes) Foreach(do func(string, *Class) bool) { + c.mu.Lock() + defer c.mu.Unlock() + + for taskClassIdentifier, classPtr := range c.classMap { + ok := do(taskClassIdentifier, classPtr) + if !ok { + return + } + } +} -func (c *classes) getMap() map[string]*Class { +func (c *Classes) getMap() map[string]*Class { c.mu.RLock() defer c.mu.RUnlock() return c.classMap } -func (c *classes) deleteKey(key string) { +func (c *Classes) DeleteKey(key string) { c.mu.Lock() defer c.mu.Unlock() delete(c.classMap, key) } -func (c *classes) deleteKeys(keys []string) { +func (c *Classes) DeleteKeys(keys []string) { c.mu.Lock() defer c.mu.Unlock() @@ -239,26 +261,26 @@ func (c *classes) deleteKeys(keys []string) { } } -func (c *classes) updateClass(key string, class *Class) { +func (c *Classes) UpdateClass(key string, class *Class) { c.mu.Lock() defer c.mu.Unlock() - if _, ok := c.classMap[key]; ok { //contains + if _, ok := c.classMap[key]; ok { //contains *c.classMap[key] = *class // update } else { - c.classMap[key] = class // else add class as new entry + c.classMap[key] = class // else add class as new entry } } -func (c *classes) getClass(key string) (class *Class, ok bool) { - c.mu.Lock() - defer c.mu.Unlock() +func (c *Classes) GetClass(key string) (class *Class, ok bool) { + c.mu.RLock() + defer c.mu.RUnlock() class, ok = c.classMap[key] - return + return } -func newClasses() *classes { - return &classes{ +func NewClasses() *Classes { + return &Classes{ classMap: make(map[string]*Class), } -} \ No newline at end of file +} diff --git a/core/task/range.go b/core/task/taskclass/port/range.go similarity index 92% rename from core/task/range.go rename to core/task/taskclass/port/range.go index b79277652..9072b2b14 100644 --- a/core/task/range.go +++ b/core/task/taskclass/port/range.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package task +package port import ( "errors" @@ -31,8 +31,8 @@ import ( ) type Range struct { - Begin uint64 `json:"begin" yaml:"begin"` - End uint64 `json:"end" yaml:"end"` + Begin uint64 `json:"begin" yaml:"begin"` + End uint64 `json:"end" yaml:"end"` } /*func (r *Range) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -62,8 +62,6 @@ type Range struct { type Ranges []Range - - func (this Ranges) Equals(other Ranges) (response bool) { if len(this) != len(other) { return false @@ -80,7 +78,7 @@ func (this Ranges) Equals(other Ranges) (response bool) { return } -func parsePortRanges(str string) (ranges Ranges, err error) { +func RangesFromExpression(str string) (ranges Ranges, err error) { r := make(Ranges, 0) if len(strings.TrimSpace(str)) == 0 { return @@ -117,4 +115,4 @@ func parsePortRanges(str string) (ranges Ranges, err error) { } ranges = r return -} \ No newline at end of file +} diff --git a/core/workflow/load.go b/core/workflow/load.go index bd6671321..46a106aa1 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/the" "github.com/k0kubun/pp" "github.com/spf13/viper" @@ -47,8 +48,7 @@ type LoadSubworkflowFunc func(workflowPathExpr string, parent Updatable) (root * func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() - var loadSubworkflow LoadSubworkflowFunc = - func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) { + var loadSubworkflow LoadSubworkflowFunc = func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) { var resolvedWorkflowPath string resolvedWorkflowPath, workflowRepo, err = repoManager.GetWorkflow(workflowPathExpr) //Will fail if repo unknown @@ -130,7 +130,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return } -func LoadDPL(tasks []*task.Class, rootRoleName string, extraVarsMap map[string]string) (workflow Role, err error) { +func LoadDPL(tasks []*taskclass.Class, rootRoleName string, extraVarsMap map[string]string) (workflow Role, err error) { root := new(aggregatorRole) root.roleBase.Name = rootRoleName @@ -139,17 +139,17 @@ func LoadDPL(tasks []*task.Class, rootRoleName string, extraVarsMap map[string]s for _, taskItem := range tasks { SingleTaskRole := taskRole{ roleBase: roleBase{ - Name: taskItem.Identifier.Name, - parent: root, + Name: taskItem.Identifier.Name, + parent: root, }, } - SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) + SingleTaskRole.Connect = append(SingleTaskRole.Connect, taskItem.Connect...) SingleTaskRole.Constraints = append(SingleTaskRole.Constraints, taskItem.Constraints...) - SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) - SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) + SingleTaskRole.Bind = append(SingleTaskRole.Bind, taskItem.Bind...) + SingleTaskRole.Task = task.ClassToTask(taskItem, &SingleTaskRole) - root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) + root.aggregator.Roles = append(root.aggregator.Roles, &SingleTaskRole) } workflow = root diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go index 9f6a9b44f..fb675cc68 100644 --- a/walnut/cmd/convert.go +++ b/walnut/cmd/convert.go @@ -36,12 +36,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/walnut/converter" ) @@ -55,7 +55,6 @@ var staticConfigURI string var extraVars string var taskNamePrefix string - // convertCmd represents the convert command var convertCmd = &cobra.Command{ Use: "convert", @@ -67,10 +66,10 @@ specify which modules should be used when generating task templates. Control-OCC for _, dumpFile := range args { // Strip .json from end of filename nameOfDump := filepath.Base(dumpFile)[:len(filepath.Base(dumpFile))-5] - defaults := map[string]string { - "user": "flp", + defaults := map[string]string{ + "user": "flp", nameOfDump + "_monitoring_url": "no-op://", - "dpl_config": "", + "dpl_config": "", } // Open specified DPL Dump @@ -84,10 +83,9 @@ specify which modules should be used when generating task templates. Control-OCC if configURIVarname != "" { defaults[configURIVarname] = staticConfigURI } else { - defaults[nameOfDump + "_config_uri"] = staticConfigURI + defaults[nameOfDump+"_config_uri"] = staticConfigURI } - // Import the dump and convert it to []*task.Class dplDump, err := converter.DPLImporter(file) taskClass, err := converter.ExtractTaskClasses(dplDump, taskNamePrefix, modules) @@ -196,7 +194,7 @@ func runGitCmd(args []string) string { return string(out) } -func WriteTemplates(taskClass []*task.Class, nameOfDump string, extraVarsMap map[string]string, defaults map[string]string) (err error) { +func WriteTemplates(taskClass []*taskclass.Class, nameOfDump string, extraVarsMap map[string]string, defaults map[string]string) (err error) { err = converter.GenerateTaskTemplate(taskClass, outputDir, defaults) if err != nil { return fmt.Errorf("conversion to task failed for %s: %w", nameOfDump, err) diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 65c36c0b4..655791ef6 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -32,13 +32,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/AliceO2Group/Control/core/task/taskclass" + "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/mitchellh/go-homedir" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/workflow" ) @@ -60,7 +61,7 @@ func createString(x string) *string { // ExtractTaskClasses takes in a DPL Dump string and extracts // an array of Tasks -func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string) (tasks []*task.Class, err error) { +func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string) (tasks []*taskclass.Class, err error) { envModules = append(envModules, "Control-OCCPlugin") for index := range dplDump.Workflows { @@ -72,23 +73,23 @@ func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry channelNames := dplDump.Metadata[correspondingMetadata].Channels - task := task.Class{ - Identifier: task.TaskClassIdentifier{ + task := taskclass.Class{ + Identifier: taskclass.Id{ Name: taskNamePrefix + taskName, }, Control: struct { Mode controlmode.ControlMode "yaml:\"mode\"" }{Mode: controlmode.FAIRMQ}, Command: &common.CommandInfo{ - Env: []string{}, // -> Default to empty array - Shell: createBool(true), + Env: []string{}, // -> Default to empty array + Shell: createBool(true), Arguments: sanitizeCmdLineArgs(dplDump.Metadata[correspondingMetadata].CmdlLineArgs, taskName), }, - Wants: task.ResourceWants{ + Wants: taskclass.ResourceWants{ Cpu: createFloat(0.15), Memory: createFloat(128), - Ports: task.Ranges{}, // begin - end OR range + Ports: port.Ranges{}, // begin - end OR range }, Properties: gera.MakeStringMapWithMap(map[string]string{ "severity": "trace", @@ -124,7 +125,7 @@ func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string Name: channelName, Type: channel.ChannelType("pull"), Transport: channel.TransportType("shmem"), - Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), + Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), }, } task.Connect = append(task.Connect, singleConnect) @@ -136,11 +137,11 @@ func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string return tasks, nil } -func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { +func sanitizeCmdLineArgs(input []string, taskName string) (output []string) { for index, value := range input { // Check args for dump arguments and remove them if !(strings.Contains(value, "--dump-workflow") || - (strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file")) { + (strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file")) { output = append(output, value) } } @@ -152,7 +153,7 @@ func sanitizeCmdLineArgs (input []string, taskName string) (output []string) { // GenerateTaskTemplate takes as input an array of pointers to task.Class // and writes them to a AliECS friendly YAML file -func GenerateTaskTemplate(extractedTasks []*task.Class, outputDir string, defaults map[string]string) (err error) { +func GenerateTaskTemplate(extractedTasks []*taskclass.Class, outputDir string, defaults map[string]string) (err error) { path := filepath.Join(outputDir, "tasks") path, _ = homedir.Expand(path) _ = os.MkdirAll(path, os.ModePerm) From b0c2d440c6c89b5dce511ee28518f6b593ef293c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Jul 2022 17:03:15 +0200 Subject: [PATCH 1329/2352] [core] Restrict task claimability criterion to avoid trash --- core/task/manager.go | 2 +- core/task/task.go | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index b815d2093..4e77c303b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -333,7 +333,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // c) its Agent's Attributes satisfy the Descriptor's Constraints taskMatches := func(taskPtr *Task) (ok bool) { if taskPtr != nil { - if !taskPtr.IsLocked() && taskPtr.className == descriptor.TaskClassName { + if taskPtr.IsClaimable() && taskPtr.className == descriptor.TaskClassName { agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) taskClass, classFound := m.classes.GetClass(descriptor.TaskClassName) if classFound && taskClass != nil && agentInfo != nil { diff --git a/core/task/task.go b/core/task/task.go index 032d0f438..26c89e8a2 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -164,6 +164,10 @@ func (t *Task) GetParentRolePath() string { func (t *Task) IsLocked() bool { t.mu.RLock() defer t.mu.RUnlock() + return t.isLocked() +} + +func (t *Task) isLocked() bool { return len(t.hostname) > 0 && len(t.agentId) > 0 && len(t.offerId) > 0 && @@ -172,6 +176,12 @@ func (t *Task) IsLocked() bool { t.parent != nil } +func (t *Task) IsClaimable() bool { + t.mu.RLock() + defer t.mu.RUnlock() + return !t.isLocked() && t.status == ACTIVE && t.state == STANDBY +} + func (t *Task) GetName() string { t.mu.RLock() defer t.mu.RUnlock() From 58db500962fda6868cdd63ebc30cbb5b480f2421 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Jul 2022 15:38:20 +0200 Subject: [PATCH 1330/2352] [core] Add task claimability property to API --- coconut/protos/o2control.pb.go | 836 +++++++++++++++++---------------- core/protos/o2control.pb.go | 836 +++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/serverutil.go | 47 +- 4 files changed, 871 insertions(+), 849 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index d902af152..9aee0f642 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.21.1 // source: protos/o2control.proto package pb @@ -2563,6 +2563,7 @@ type ShortTaskInfo struct { DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` + Claimable bool `protobuf:"varint,10,opt,name=claimable,proto3" json:"claimable,omitempty"` } func (x *ShortTaskInfo) Reset() { @@ -2660,6 +2661,13 @@ func (x *ShortTaskInfo) GetSandboxStdout() string { return "" } +func (x *ShortTaskInfo) GetClaimable() bool { + if x != nil { + return x.Claimable + } + return false +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4988,7 +4996,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, @@ -5006,423 +5014,425 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, - 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, - 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, - 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, - 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, - 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, - 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, - 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, - 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, - 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, - 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, + 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, + 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, + 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index d902af152..9aee0f642 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.21.1 // source: protos/o2control.proto package pb @@ -2563,6 +2563,7 @@ type ShortTaskInfo struct { DeploymentInfo *TaskDeploymentInfo `protobuf:"bytes,7,opt,name=deploymentInfo,proto3" json:"deploymentInfo,omitempty"` Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` + Claimable bool `protobuf:"varint,10,opt,name=claimable,proto3" json:"claimable,omitempty"` } func (x *ShortTaskInfo) Reset() { @@ -2660,6 +2661,13 @@ func (x *ShortTaskInfo) GetSandboxStdout() string { return "" } +func (x *ShortTaskInfo) GetClaimable() bool { + if x != nil { + return x.Claimable + } + return false +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4988,7 +4996,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9e, 0x02, 0x0a, 0x0d, 0x53, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, @@ -5006,423 +5014,425 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x22, 0x84, 0x01, 0x0a, 0x12, - 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, - 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, - 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, + 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, + 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, + 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, + 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, + 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, - 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, - 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, - 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, - 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, - 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, - 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, - 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, + 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, - 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, - 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, - 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, - 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, + 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, + 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, + 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, + 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, + 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, + 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, + 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, + 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 6537f3ca3..1c7b769cc 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -311,6 +311,7 @@ message ShortTaskInfo { TaskDeploymentInfo deploymentInfo = 7; string pid = 8; string sandboxStdout = 9; + bool claimable = 10; } message TaskDeploymentInfo { string hostname = 1; diff --git a/core/serverutil.go b/core/serverutil.go index 1421aea30..e8a9e88aa 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -45,11 +45,11 @@ func commandInfoToPbCommandInfo(c *common.TaskCommandInfo) (pci *pb.CommandInfo) return } pci = &pb.CommandInfo{ - Env: c.GetEnv(), - Shell: c.GetShell(), - Value: c.GetValue(), + Env: c.GetEnv(), + Shell: c.GetShell(), + Value: c.GetValue(), Arguments: c.GetArguments(), - User: c.GetUser(), + User: c.GetUser(), } return } @@ -86,8 +86,8 @@ func outboundChannelsToPbChannels(chs []channel.Outbound) (pchs []*pb.ChannelInf func outboundChannelToPbChannel(ch channel.Outbound) (pch *pb.ChannelInfo) { pch = &pb.ChannelInfo{ - Name: ch.Name, - Type: ch.Type.String(), + Name: ch.Name, + Type: ch.Type.String(), Target: ch.Target, } return @@ -98,13 +98,13 @@ func taskToShortTaskInfo(t *task.Task, taskman *task.Manager) (sti *pb.ShortTask return } - var( - slaveHost = t.GetHostname() - slavePort = MESOS_AGENT_PORT - workDir = "/var/mesos" - slaveId = t.GetAgentId() + var ( + slaveHost = t.GetHostname() + slavePort = MESOS_AGENT_PORT + workDir = "/var/mesos" + slaveId = t.GetAgentId() frameworkId = taskman.GetFrameworkID() - executorId = t.GetExecutorId() + executorId = t.GetExecutorId() containerId = "latest" ) sandboxStdoutUri := fmt.Sprintf("http://%s:%d/files/download?path=%s/slaves/%s/frameworks/%s/executors/%s/runs/%s/stdout", @@ -117,19 +117,20 @@ func taskToShortTaskInfo(t *task.Task, taskman *task.Manager) (sti *pb.ShortTask containerId) sti = &pb.ShortTaskInfo{ - Name: t.GetName(), - Locked: t.IsLocked(), - TaskId: t.GetTaskId(), - Status: "UNKNOWN", - State: "UNKNOWN", + Name: t.GetName(), + Locked: t.IsLocked(), + Claimable: t.IsClaimable(), + TaskId: t.GetTaskId(), + Status: "UNKNOWN", + State: "UNKNOWN", ClassName: t.GetClassName(), DeploymentInfo: &pb.TaskDeploymentInfo{ - Hostname: t.GetHostname(), - AgentId: t.GetAgentId(), - OfferId: t.GetOfferId(), + Hostname: t.GetHostname(), + AgentId: t.GetAgentId(), + OfferId: t.GetOfferId(), ExecutorId: t.GetExecutorId(), }, - Pid: t.GetTaskPID(), + Pid: t.GetTaskPID(), SandboxStdout: sandboxStdoutUri, } parentRole, ok := t.GetParentRole().(workflow.Role) @@ -190,10 +191,10 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { // SafeStreamsMap is a safe map where the key is usually a // subscriptionID received from the grpc call and as a value -// a channel where get events from the environment +// a channel where get events from the environment // and we stream them to the grpc client. type SafeStreamsMap struct { - mu sync.RWMutex + mu sync.RWMutex streams map[string]chan *pb.Event } From e2205da55b6a2c627034483b96d87ca7904ad276 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Jul 2022 15:41:08 +0200 Subject: [PATCH 1331/2352] [coconut] Show task claimability --- coconut/control/control.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 17bdff82e..fcf88a1c9 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -30,7 +30,6 @@ import ( "context" "errors" "fmt" - "github.com/fatih/color" "io" "os" "regexp" @@ -40,6 +39,8 @@ import ( "text/template" "time" + "github.com/fatih/color" + "github.com/xlab/treeprint" "github.com/AliceO2Group/Control/coconut" @@ -635,13 +636,14 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a fmt.Fprintln(o, "no tasks running") } else { drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "status", "state", "PID"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "claimable", "status", "state", "PID"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), t.GetClassName(), t.GetDeploymentInfo().GetHostname(), strconv.FormatBool(t.GetLocked()), + strconv.FormatBool(t.GetClaimable()), t.GetStatus(), colorState(t.GetState()), t.GetPid(), From d209075ce2e3ab1c6ddc30cd68733cd33e945871 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 20 Jul 2022 16:31:25 +0200 Subject: [PATCH 1332/2352] [core] DCS override "ddl_list: default" with _default_ddl_list --- core/integration/dcs/dcsutil.go | 51 +++++++++++++++++++++++++++++++++ core/integration/dcs/plugin.go | 7 +++++ 2 files changed, 58 insertions(+) create mode 100644 core/integration/dcs/dcsutil.go diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go new file mode 100644 index 000000000..7df6737cb --- /dev/null +++ b/core/integration/dcs/dcsutil.go @@ -0,0 +1,51 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package dcs + +import ( + "strings" + + dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" + "github.com/sirupsen/logrus" +) + +func resolveDefaults(detectorArgMap map[string]string, varStack map[string]string, det dcspb.Detector, theLog *logrus.Entry) map[string]string { + // Do we have any default expressions for defaultable values? + defaultableKeys := []string{"ddl_list"} + + for _, key := range defaultableKeys { + if defaultableValue, ok := detectorArgMap[key]; ok { + if strings.TrimSpace(strings.ToLower(defaultableValue)) == "default" { // if one of the defaultable keys has value `default`... + defaultPayloadKey := strings.ToLower(det.String()) + "_default_" + key // e.g. tof_default_ddl_list + if defaultPayload, ok := varStack[defaultPayloadKey]; ok { + detectorArgMap[key] = defaultPayload + } else { + theLog.Warnf("requested default value for DCS parameter %s but no payload found at key %s: the string 'default' will be sent instead", key, defaultPayloadKey) + } + } + } + } + return detectorArgMap +} diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index d13cffc4f..ae243ba96 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -308,6 +308,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + // We parse the consolidated per-detector payload for any defaultable parameters with value "default" + detectorArgMap = resolveDefaults(detectorArgMap, varStack, det, + log.WithField("partition", envId). + WithField("call", "StartOfRun"). + WithField("detector", det.String()). + WithField("runNumber", runNumber64)) + in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: det, ExtraParameters: detectorArgMap, From b26bb59cfafc50e7b1f5e5aece5b95e297f9c4d1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Jul 2022 13:36:08 +0200 Subject: [PATCH 1333/2352] [core] Fix nil pointer dereference in DCS plugin --- core/integration/dcs/plugin.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index ae243ba96..c09db653e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -438,7 +438,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "StartOfRun"). Error("DCS error") - call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr return @@ -501,7 +501,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "StartOfRun"). Error("DCS error") - call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr } return @@ -742,7 +742,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "EndOfRun"). Error("DCS error") - call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr return @@ -797,7 +797,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "EndOfRun"). Error("DCS error") - call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr } return From 7da43371345e93a6e42edca3b94d357d86039557 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 15 Jul 2022 17:37:21 +0200 Subject: [PATCH 1334/2352] [core] AliECS trigger plugin returns the correct TRG Stop timestamp on RunStop and Cleanup. --- core/integration/trg/plugin.go | 9 ++++++++- core/workflow/callable/parentrole.go | 4 ++++ core/workflow/iteratorrole.go | 14 ++++++++++++++ core/workflow/role.go | 2 ++ core/workflow/rolebase.go | 25 +++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 1 deletion(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 2f142ab6a..270694cc3 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -602,6 +602,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { parentRole.SetGlobalRuntimeVar("trg_start_time_ms", trgStartTime) + parentRole.DeleteGlobalRuntimeVar("trg_end_time_ms") } return @@ -849,7 +850,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("partition", envId). - Error("cannot acquire run number for TRG Run Stop") + Error("cannot acquire run number for TRG Run Unload") } return runUnloadFunc(runNumber64) @@ -873,6 +874,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingRunStops, envId) _ = runStopFunc(runNumberStop) + + trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + } } else { log.WithField("partition", envId). WithField("level", infologger.IL_Devel). diff --git a/core/workflow/callable/parentrole.go b/core/workflow/callable/parentrole.go index 67a2d408c..5dc3ac5a6 100644 --- a/core/workflow/callable/parentrole.go +++ b/core/workflow/callable/parentrole.go @@ -38,7 +38,11 @@ type ParentRole interface { SendEvent(event.Event) SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) + DeleteRuntimeVar(key string) + DeleteRuntimeVars(keys []string) SetGlobalRuntimeVar(key string, value string) SetGlobalRuntimeVars(kv map[string]string) + DeleteGlobalRuntimeVar(key string) + DeleteGlobalRuntimeVars(keys []string) GetCurrentRunNumber() uint32 } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index b64d8b523..7368a06ee 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -329,6 +329,20 @@ func (i *iteratorRole) SetRuntimeVars(kv map[string]string) { i.template.SetRuntimeVars(kv) } +func (i *iteratorRole) DeleteRuntimeVar(key string) { + if i == nil { + return + } + i.template.DeleteRuntimeVar(key) +} + +func (i *iteratorRole) DeleteRuntimeVars(keys []string) { + if i == nil { + return + } + i.template.DeleteRuntimeVars(keys) +} + func (i *iteratorRole) GetCurrentRunNumber() uint32 { if i == nil { return 0 diff --git a/core/workflow/role.go b/core/workflow/role.go index e93f683db..3f796ef9b 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -60,6 +60,8 @@ type Role interface { GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) + DeleteRuntimeVar(key string) + DeleteRuntimeVars(keys []string) GetHooksMapForTrigger(trigger string) callable.HooksMap GetAllHooks() callable.Hooks IsEnabled() bool diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 8ab277c2d..8ce9000ed 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -79,6 +79,16 @@ func (r *roleBase) SetRuntimeVars(kv map[string]string) { } } +func (r *roleBase) DeleteRuntimeVar(key string) { + r.UserVars.Del(key) +} + +func (r *roleBase) DeleteRuntimeVars(keys []string) { + for _, k := range keys { + r.UserVars.Del(k) + } +} + func (r *roleBase) SetGlobalRuntimeVar(key string, value string) { root := r.GetRootRole() if root != nil { @@ -94,6 +104,21 @@ func (r *roleBase) SetGlobalRuntimeVars(kv map[string]string) { } } +func (r *roleBase) DeleteGlobalRuntimeVar(key string) { + root := r.GetRootRole() + if root != nil { + root.DeleteRuntimeVar(key) + } else { + r.DeleteRuntimeVar(key) + } +} + +func (r *roleBase) DeleteGlobalRuntimeVars(keys []string) { + for _, k := range keys { + r.DeleteGlobalRuntimeVar(k) + } +} + func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error) { // This function is used in task.go to get the parent role's varStack var defaults, vars, userVars map[string]string From b616fc70192042f57f1c2f3a7887bfdcccc69482 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 22 Jul 2022 10:16:22 +0200 Subject: [PATCH 1335/2352] [core] Trigger timestamps are cleared before run start. --- core/integration/trg/plugin.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 270694cc3..44b02e7ef 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -328,6 +328,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Ops). Info("ALIECS SOR operation : performing TRG Run Load Request") + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.DeleteGlobalRuntimeVar("trg_start_time_ms") + parentRole.DeleteGlobalRuntimeVar("trg_end_time_ms") + } + globalConfig, ok := varStack["trg_global_config"] log.WithField("globalConfig", globalConfig). WithField("partition", envId). From c6175740341d745b3347462455df0ffc55102c43 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Jul 2022 11:39:19 +0200 Subject: [PATCH 1336/2352] [build] Bump to v0.47.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a5450fb11..5f17e0f39 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 46 +VERSION_MINOR := 47 VERSION_PATCH := 0 From 83f33e48131611761a8e9ab24cb3c1c2fc907f0d Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 22 Jul 2022 12:55:26 +0200 Subject: [PATCH 1337/2352] [OCTRL-676] Bookkeeping stores the EPN Workflow script in the Run details. --- core/environment/environment.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 352d2315f..1645851f9 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -855,6 +855,16 @@ func (env *Environment) GetVarsAsString() string { if err != nil { return "" } + for _, r := range role.GetRoles() { + if r.GetName() == "odc" { + epnWorkflowCmdResult, ok := r.GetVars().Get("odc_script") + if !ok { + epnWorkflowCmdResult = "" + } + varStack["odc_script"] = epnWorkflowCmdResult + return sortMapToString(varStack) + } + } return sortMapToString(varStack) } From 9be16d9cf640352175589a2c0cdfea3fb6ac0a89 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Jul 2022 16:51:58 +0200 Subject: [PATCH 1338/2352] [core] Add total host count to EnvironmentInfo --- coconut/protos/o2control.pb.go | 1178 ++++++++++++++++--------------- core/environment/environment.go | 13 + core/protos/o2control.pb.go | 1178 ++++++++++++++++--------------- core/protos/o2control.proto | 1 + core/server.go | 3 + 5 files changed, 1205 insertions(+), 1168 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 9aee0f642..a94353b0a 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1391,6 +1391,7 @@ type EnvironmentInfo struct { NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` + NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1509,6 +1510,13 @@ func (x *EnvironmentInfo) GetDescription() string { return "" } +func (x *EnvironmentInfo) GetNumberOfHosts() int32 { + if x != nil { + return x.NumberOfHosts + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4791,7 +4799,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xbe, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xe4, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4823,616 +4831,618 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, - 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, - 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, - 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, - 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, + 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, + 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, + 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, + 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, + 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, - 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, + 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, + 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, - 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, - 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, - 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, - 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, + 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, + 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, + 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, + 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/environment/environment.go b/core/environment/environment.go index 1645851f9..d946e331f 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -823,6 +823,19 @@ func (env *Environment) GetFLPs() []string { return response } +func (env *Environment) GetAllHosts() []string { + if env == nil || env.workflow == nil { + return nil + } + + tasks := env.workflow.GetTasks() + out := make([]string, len(tasks)) + for i, t := range tasks { + out[i] = t.GetHostname() + } + return out +} + func (env *Environment) GetRunType() runtype.RunType { if env == nil || env.workflow == nil { return runtype.NONE diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 9aee0f642..a94353b0a 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1391,6 +1391,7 @@ type EnvironmentInfo struct { NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` + NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1509,6 +1510,13 @@ func (x *EnvironmentInfo) GetDescription() string { return "" } +func (x *EnvironmentInfo) GetNumberOfHosts() int32 { + if x != nil { + return x.NumberOfHosts + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4791,7 +4799,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xbe, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xe4, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4823,616 +4831,618 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, - 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, + 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, - 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, - 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, - 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, - 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, - 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, - 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, - 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, - 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, + 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, + 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, + 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, + 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, + 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, + 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, + 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, + 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, - 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, - 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, - 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, - 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, - 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, - 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, + 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, + 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, + 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, - 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, - 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, - 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, - 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, - 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, - 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, - 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, - 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, + 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, + 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, + 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, + 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, + 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 1c7b769cc..f54cca536 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -187,6 +187,7 @@ message EnvironmentInfo { int32 numberOfFlps = 10; repeated string includedDetectors = 11; string description = 12; + int32 numberOfHosts = 13; } message NewEnvironmentRequest { diff --git a/core/server.go b/core/server.go index c1cbbdb57..2f2079031 100644 --- a/core/server.go +++ b/core/server.go @@ -220,6 +220,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm Vars: env.GlobalVars.Raw(), UserVars: env.UserVars.Raw(), NumberOfFlps: int32(len(env.GetFLPs())), + NumberOfHosts: int32(len(env.GetAllHosts())), } if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) @@ -311,6 +312,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Vars: newEnv.GlobalVars.Raw(), UserVars: newEnv.UserVars.Raw(), NumberOfFlps: int32(len(newEnv.GetFLPs())), + NumberOfHosts: int32(len(newEnv.GetAllHosts())), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), } reply = &pb.NewEnvironmentReply{ @@ -353,6 +355,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe Vars: env.GlobalVars.Raw(), UserVars: env.UserVars.Raw(), NumberOfFlps: int32(len(env.GetFLPs())), + NumberOfHosts: int32(len(env.GetAllHosts())), }, Public: env.Public, } From 884b39d74c445c3684eca43704e33cc6c552a1b3 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 28 Jul 2022 11:50:53 +0200 Subject: [PATCH 1339/2352] [core] AliECS plugin calls instanciate the varStack within their call to access runtime variable from other plugins. --- core/integration/trg/plugin.go | 10 ++++++++++ core/workflow/callable/call.go | 13 ++++++++++--- core/workflow/callrole.go | 14 ++------------ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 44b02e7ef..c56572516 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -719,6 +719,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + } else { + log.WithField("partition", envId). + WithField("runNumber", runNumber64). + WithField("trgEndTime", trgEndTime). + Debug("could not get parentRole and set TRG end time") } return @@ -885,6 +890,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + } else { + log.WithField("partition", envId). + WithField("runNumber", runNumberStop). + WithField("trgEndTime", trgEndTime). + Debug("could not get parentRole and set TRG end time") } } else { log.WithField("partition", envId). diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 5e0742fc8..732c6747c 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -56,11 +56,11 @@ type Call struct { type Calls []*Call -func NewCall(funcCall string, returnVar string, varStack map[string]string, parent ParentRole) (call *Call) { +func NewCall(funcCall string, returnVar string, parent ParentRole) (call *Call) { return &Call{ Func: funcCall, Return: returnVar, - VarStack: varStack, + VarStack: map[string]string{}, Traits: parent.GetTaskTraits(), parentRole: parent, } @@ -113,6 +113,13 @@ func (c *Call) Call() error { template.WrapPointer(&output), template.WrapPointer(&returnVar), } + var err error + c.VarStack, err = c.parentRole.ConsolidatedVarStack() + if err != nil { + log.WithField("trigger", c.Traits.Trigger). + WithField("partition", c.parentRole.GetEnvironmentId().String()). + Debug("could not instanciate varStack") + } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() c.VarStack["__call_func"] = c.Func c.VarStack["__call_timeout"] = c.Traits.Timeout @@ -123,7 +130,7 @@ func (c *Call) Call() error { objStack := integration.PluginsInstance().CallStack(c) - err := fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template), nil) + err = fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { return err } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 0d94d5289..bbc1bc781 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -238,20 +238,15 @@ func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMa return make(callable.HooksMap) } - cvs, err := t.ConsolidatedVarStack() defer t.updateState(task.INVARIANT) - if err != nil { - return make(callable.HooksMap) - } - // If a trigger is defined for this role && // If the input trigger is empty OR a positive match... if len(t.Trigger) > 0 { triggerName, triggerWeight := callable.ParseTriggerExpression(t.Trigger) if trigger == triggerName { return callable.HooksMap{ - triggerWeight: callable.Hooks{callable.NewCall(t.FuncCall, t.ReturnVar, cvs, t)}, + triggerWeight: callable.Hooks{callable.NewCall(t.FuncCall, t.ReturnVar, t)}, } } } @@ -259,17 +254,12 @@ func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMa } func (t *callRole) GetAllHooks() callable.Hooks { - cvs, err := t.ConsolidatedVarStack() defer t.updateState(task.INVARIANT) - if err != nil { - return callable.Hooks{} - } - // If a trigger is defined for this role if len(t.Trigger) > 0 { return []callable.Hook{ - callable.NewCall(t.FuncCall, t.ReturnVar, cvs, t), + callable.NewCall(t.FuncCall, t.ReturnVar, t), } } return callable.Hooks{} From 4a31edd7fad65c53511f0946809a183ab142889f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Jul 2022 13:29:06 +0200 Subject: [PATCH 1340/2352] [core] Improve performance of o2-aliecs-shmcleaner --- cmd/o2-aliecs-shmcleaner | 76 ++++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 19 deletions(-) diff --git a/cmd/o2-aliecs-shmcleaner b/cmd/o2-aliecs-shmcleaner index 2d125f9a7..ce3bda1f8 100644 --- a/cmd/o2-aliecs-shmcleaner +++ b/cmd/o2-aliecs-shmcleaner @@ -2,8 +2,10 @@ # === This file is part of ALICE O² === # -# Copyright 2021 CERN and copyright holders of ALICE O². +# Copyright 2021-2022 CERN and copyright holders of ALICE O². # Author: Teo Mrnjavac +# Kostas Alexopoulos +# Roberto Divià # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,44 +30,80 @@ export O2_FACILITY=core/shmcleaner export O2_PARTITION=${O2_PARTITION:-} export O2_ROLE=${O2_ROLE:-} +waitFor=5 # Number of seconds to wait before force-killing + +memStart="`grep MemAvailable /proc/meminfo | sed 's/.*: *//'`" + # ------ Beginning extra cleanup ------ -n=0 -pids=$(pgrep -u flp) -# Try to kill any flp-owned processes gracefully -for p in $pids; do +# Try to kill leftover processes gracefully +n=0 +for p in `pgrep -u flp`; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue - echo "Kill '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION - n=$((n+1)) + [ "$c" ] || continue + echo "Killing '$c' PID:$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION kill $p + n=$(( n + 1 )) done -# Force kill any flp-owned processes remaining -if (( n > 0 )); then - - sleep 5 +# Check if all cleaned +w="" +for p in `pgrep -u flp`; do + c="`ps -ho %c $p`" + [ "$c" = "o2-alf" ] && continue + [ "$c" ] || continue + w="T" +done - for p in $pids; do +# Force kill anything remaining +nn=0 +if [ "$w" = "T" ]; then + sleep ${waitFor} + for p in `pgrep -u flp`; do c="`ps -ho %c $p`" [ "$c" = "o2-alf" ] && continue - echo "Kill -9 '%s' (PID:%s)\n" "`date`" "`hostname -s`" "$c" "$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION + [ "$c" ] || continue + echo "Killing -9 '$c' PID:$p" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION kill -9 $p + nn=$(( nn + 1 )) done fi # Ensure that no flp-owned processes remain before returning -if (( n > 0 )); then - for p in $pids; do - while [ kill -0 $p > /dev/null 2>&1]; do - sleep 0.1 - done +t=0 +while true; do + l="" + x=0 + for p in `pgrep -u flp`; do + c="`ps -ho %c $p`" + [ "$c" = "o2-alf" ] && continue + [ "$c" ] || continue + l="$l'$c':$p " + x=$(( x + 1 )) done -fi + [ "$l" ] || break + if (( t++ > 50 )); then + echo "Unkillable process(es):$l" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION + break + fi + sleep 0.1 +done +# Cleanup all SHM (unused as all processes should have been stopped) rm -f /dev/shm/*fmq* +# Cleanup any ROC-allocated memory yes | roc-cleanup --light > /dev/null 3>&1 + +memEnd="`grep MemAvailable /proc/meminfo | sed 's/.*: *//'`" +memDelta=$(( `echo ${memEnd} | awk '{print $1;}'`- `echo ${memStart} | awk '{print $1;}'` )) +memDelta="${memDelta} `echo ${memEnd} | awk '{print $2;}'`" + +echo "Cleanup completed killed:$n killed-9:$nn leftover:$x memStart:${memStart} memEnd:${memEnd} memDelta:${memDelta}" | $O2_INFOLOGGER_PATH/bin/o2-infologger-log -x -s Debug -o Facility=$O2_FACILITY -o Partition=$O2_PARTITION + +exit 0 + # ------ End extra cleanup ------- ANY_FILES_CLEANED=false From ad3b0711180bf4e553c38be39b763f5e5aabdf8e Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 28 Jul 2022 16:16:51 +0200 Subject: [PATCH 1341/2352] [core] Transition to ERROR in case of failed deployment or configuration, before tearing down. --- core/environment/manager.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 7483239a4..f1bc156d5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -238,6 +238,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("level", infologger.IL_Devel). Warn("environment deployment and configuration error, cleanup in progress") + err = env.TryTransition(NewGoErrorTransition( + envs.taskman), + ) + if err != nil { + log.WithField("partition", env.Id().String()). + WithField("state", envState). + Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") + } envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally // We do not get the error here cause it overwrites the failed deployment error @@ -617,6 +625,15 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str WithError(err). Warn("environment deployment and configuration failed, cleanup in progress") + err = env.TryTransition(NewGoErrorTransition( + envs.taskman), + ) + if err != nil { + log.WithField("partition", env.Id().String()). + WithField("state", envState). + Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") + } + envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally err = envs.TeardownEnvironment(env.Id(), true /*force*/) From ac7fd07134aa74ed8ff4b2e46b041850c92850d0 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 13 Jul 2022 16:57:29 +0200 Subject: [PATCH 1342/2352] Add a comment to let Ruben know when run type list changes --- common/runtype/runtype.go | 1 + 1 file changed, 1 insertion(+) diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 59fe0c016..588f20e24 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -27,6 +27,7 @@ package runtype // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go +// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. type RunType int const ( From 72467c5b19e9284044ff4634c86429f2e49cc361 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 13 Jul 2022 12:53:40 +0200 Subject: [PATCH 1343/2352] [core] The number of warning messages of the BK plugin is reduced. --- core/integration/bookkeeping/api.go | 57 ++++++++++++++++------------- 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index b4a78daf2..a623ad36e 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -107,35 +107,42 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO if timeO2Start == "" || timeO2S <= 0 { timeO2S = -1 } - timeO2E, ok := strconv.ParseInt(timeO2End, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeO2End). - Warning("cannot parse O2 end time") - timeO2E = -1 + var timeO2E int64 = -1 + if timeO2End != "" { + timeO2E, ok = strconv.ParseInt(timeO2End, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeO2End). + Warning("cannot parse O2 end time") + timeO2E = -1 + } } if timeO2End == "" || timeO2E <= 0 { timeO2E = -1 } - timeTrgS, ok := strconv.ParseInt(timeTrgStart, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeTrgStart). - Warning("cannot parse Trg start time") - timeTrgS = -1 - } - if timeTrgStart == "" || timeTrgS <= 0 { - timeTrgS = -1 - } - timeTrgE, ok := strconv.ParseInt(timeTrgEnd, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeTrgEnd). - Warning("cannot parse Trg end time") - timeTrgE = -1 - } - if timeTrgEnd == "" || timeTrgE <= 0 { - timeTrgE = -1 + var timeTrgS int64 = -1 + var timeTrgE int64 = -1 + if trg { + timeTrgS, ok = strconv.ParseInt(timeTrgStart, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeTrgStart). + Warning("cannot parse Trg start time") + timeTrgS = -1 + } + if timeTrgStart == "" || timeTrgS <= 0 { + timeTrgS = -1 + } + timeTrgE, ok = strconv.ParseInt(timeTrgEnd, 10, 64) + if ok != nil { + log.WithField("runNumber", runNumber). + WithField("time", timeTrgEnd). + Warning("cannot parse Trg end time") + timeTrgE = -1 + } + if timeTrgEnd == "" || timeTrgE <= 0 { + timeTrgE = -1 + } } _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trgGlobal, trg, pdpConfig, pdpTopology, tfbMode /*, odcFullname, lhcPeriod */) From 26eb660ef1297e627bda7dcc233c2466288ea878 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 14 Jul 2022 17:03:36 +0200 Subject: [PATCH 1344/2352] [core] AliECS Bookkeeping plugin returns the requested number of EPNs for a run. --- core/integration/bookkeeping/plugin.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 14749ab8a..354aa5eb1 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -212,6 +212,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rnString := strconv.FormatUint(uint64(runNumber), 10) flps := env.GetFLPs() + epns, err := strconv.ParseInt(env.GetKV("", "odc_n_epns"), 10, 0) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse number of EPNs") + } ddEnabled, err := strconv.ParseBool(env.GetKV("", "dd_enabled")) if err != nil { log.WithError(err). @@ -241,7 +249,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { //odcTopology, _ := env.Workflow().GetVars().Get("odc_topology_fullname") //lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), 0, len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). From 55a3b4ca7854500f76cd120ab1bfb79ab1abb9b2 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 26 Jul 2022 11:08:02 +0200 Subject: [PATCH 1345/2352] [OCTRL-657][OCTRL-677] Lhc_period and odc_topology_fullname are added to the BK run details with UpdateRun. --- core/integration/bookkeeping/api.go | 4 ++-- core/integration/bookkeeping/plugin.go | 14 +++++++++----- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index a623ad36e..50165947e 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -86,7 +86,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string /*, odcFullname string, lhcPeriod string*/) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string, odcTopologyFull string, lhcPeriod string) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -145,7 +145,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trgGlobal, trg, pdpConfig, pdpTopology, tfbMode /*, odcFullname, lhcPeriod */) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trgGlobal, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 354aa5eb1..80d4475b1 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -246,8 +246,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } odcTopology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - //odcTopology, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - //lhcPeriod := env.GetKV("", "lhc_period") err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) if err != nil { @@ -337,9 +335,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire PDP topology description library file") } tfbMode := env.GetKV("", "tfb_dd_mode") - //odcTopology, _ := env.Workflow().GetVars().Get("odc_topology_fullname") - //lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trgGlobalRunEnabled, trgEnabled, pdpConfig, pdpTopology, tfbMode /*, odcTopology, lhcPeriod */) + odcTopologyFull, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } + lhcPeriod := env.GetKV("", "lhc_period") + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trgGlobalRunEnabled, trgEnabled, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). From e0456e069685667ef766a841b8d76d46e57098ff Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 26 Jul 2022 14:44:43 +0200 Subject: [PATCH 1346/2352] [OCTRL-687] Trigger values are set and passed to BK depending on trg_enabled and trg_global_enabled. --- core/integration/bookkeeping/api.go | 6 +++--- core/integration/bookkeeping/plugin.go | 12 +++++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 50165947e..cbec05dce 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -86,7 +86,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trgGlobal bool, trg bool, pdpConfig string, pdpTopology string, tfbMode string, odcTopologyFull string, lhcPeriod string) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, odcTopologyFull string, lhcPeriod string) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -122,7 +122,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } var timeTrgS int64 = -1 var timeTrgE int64 = -1 - if trg { + if trg == "LTU" || trg == "CTP" { timeTrgS, ok = strconv.ParseInt(timeTrgStart, 10, 64) if ok != nil { log.WithField("runNumber", runNumber). @@ -145,7 +145,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trgGlobal, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 80d4475b1..30a60e8ae 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -320,6 +320,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "UpdateRun"). Warning("cannot parse TRG enabled") } + var trg = "" + if trgEnabled == false { + trg = "OFF" + } else { + if trgGlobalRunEnabled == false { + trg = "LTU" + } else { + trg = "CTP" + } + } pdpConfig, ok := varStack["pdp_config_option"] if !ok { log.WithField("runNumber", runNumber64). @@ -343,7 +353,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire ODC topology fullname") } lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trgGlobalRunEnabled, trgEnabled, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). From 2ab51e2722cbb5064c52b4785cce587a12de796c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 1 Aug 2022 10:59:14 +0200 Subject: [PATCH 1347/2352] [core] UpdateRun is adjusted to match the one from Bookkeeping API. --- core/integration/bookkeeping/api.go | 4 ++-- core/integration/bookkeeping/plugin.go | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index cbec05dce..60538c43a 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -86,7 +86,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, odcTopologyFull string, lhcPeriod string) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -145,7 +145,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 30a60e8ae..fe0879121 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -345,15 +345,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire PDP topology description library file") } tfbMode := env.GetKV("", "tfb_dd_mode") - odcTopologyFull, ok := env.Workflow().GetVars().Get("odc_topology_fullname") - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire ODC topology fullname") - } + /* + odcTopologyFull, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } + */ lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, odcTopologyFull, lhcPeriod) + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). From 176b17998183084e242b41b41087ea271f79c3e7 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 1 Aug 2022 11:11:48 +0200 Subject: [PATCH 1348/2352] [core] go.mod and go.sum files point to Bookkeeping@main. --- go.mod | 6 +++--- go.sum | 8 ++++++++ 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index eb087f8a0..265202266 100644 --- a/go.mod +++ b/go.mod @@ -20,8 +20,8 @@ require ( cloud.google.com/go v0.76.0 // indirect cloud.google.com/go/firestore v1.4.0 // indirect github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168 // indirect - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168 + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d // indirect + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect @@ -106,7 +106,7 @@ require ( github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 github.com/rs/xid v1.2.1 github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/kafka-go v0.4.31 // indirect + github.com/segmentio/kafka-go v0.4.31 github.com/sirupsen/logrus v1.8.1 github.com/smartystreets/assertions v1.0.1 // indirect github.com/spf13/afero v1.5.1 // indirect diff --git a/go.sum b/go.sum index 552ccf9d4..86dd6a56d 100644 --- a/go.sum +++ b/go.sum @@ -97,6 +97,10 @@ github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 h1:a3 github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168 h1:dNmTnFLXTwGVpt0spEYALJPgF20D1DmUGCdn2BaeF+Y= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220728074543-2e10e2e0bb45 h1:yh95IlA8mlp2HZMOzsq/2S+eOqIak9ejv86L4/E7MI0= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220728074543-2e10e2e0bb45/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d h1:OxlrgZ1yhEi8W+7U0OX7TMeH5T0Vy12BEJjMemP+idc= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= @@ -115,6 +119,10 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168 h1:XN/vDB2JmiV+HgKb0Nkj7NC9r5z/j1SH9klfxrBXkwM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220728074543-2e10e2e0bb45 h1:OEzfMzQahfhYAZz9m8xF/m1+F/kPnEQ9t5Vk5uDFu3U= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220728074543-2e10e2e0bb45/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d h1:berCePbayn2xvvMmO6hwriVip7TrAPb4mmnbRZRM7Xs= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= From de59af7b38c15608cd9dc0b15160fda346722184 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 Jul 2022 17:41:50 +0200 Subject: [PATCH 1349/2352] [core] Add envId to all servent/envman/commandqueue messages --- core/controlcommands/commandqueue.go | 56 ++++++++------ core/controlcommands/mesoscommand.go | 22 ++++-- .../mesoscommand_transition.go | 14 ++-- .../mesoscommand_triggerhook.go | 10 ++- core/controlcommands/mesoscommandresponse.go | 21 ++++-- core/controlcommands/mesoscommandservent.go | 75 +++++++++++++------ core/environment/manager.go | 29 ++++--- core/environment/transition_deploy.go | 19 +++-- core/task/manager.go | 14 ++-- executor/executable/controllabletask.go | 2 + .../executorcmd/executorcommand_transition.go | 9 +-- 11 files changed, 176 insertions(+), 95 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 32e0252da..d14933ff7 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -66,7 +66,8 @@ func (m *CommandQueue) Enqueue(cmd MesosCommand, callback chan<- MesosCommandRes return nil default: // Buffer full! err := errors.New("the queue for MESSAGE commands is full") - log.WithField("error", err.Error()). + log.WithField("partition", cmd.GetEnvironmentId().String()). + WithField("error", err.Error()). WithField("queueSize", QUEUE_SIZE). Error("cannot enqueue control command") return err @@ -90,14 +91,17 @@ func (m *CommandQueue) Start() { if err != nil { if entry.cmd != nil { log.WithError(err). + WithField("partition", entry.cmd.GetEnvironmentId().String()). Debugf("failed to commit CommandQueue entry %s", entry.cmd.GetName()) } else { log.WithError(err). + WithField("partition", entry.cmd.GetEnvironmentId().String()). Debug("failed to commit unknown CommandQueue entry") } } if err == nil && response == nil { - log.Error("nil response") + log.WithField("partition", entry.cmd.GetEnvironmentId().String()). + Error("nil response") } entry.callback <- response @@ -119,10 +123,12 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } log.WithPrefix("cmdq"). WithField("id", command.GetId().String()). + WithField("partition", command.GetEnvironmentId().String()). Debugf("cmdq.commit %s to %d targets begin", command.GetName(), len(command.targets())) defer utils.TimeTrack(time.Now(), fmt.Sprintf("cmdq.commit %s to %d targets", command.GetName(), len(command.targets())), log.WithPrefix("cmdq"). + WithField("partition", command.GetEnvironmentId().String()). WithField("id", command.GetId().String())) type responseSemaphore struct { @@ -137,24 +143,28 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon responses := make(map[MesosCommandTarget]MesosCommandResponse) - log.WithFields(logrus.Fields{ - "name": command.GetName(), - "id": command.GetId(), - }). + log.WithField("partition", command.GetEnvironmentId().String()). + WithFields(logrus.Fields{ + "name": command.GetName(), + "id": command.GetId(), + }). Debug("ready to commit MesosCommand") for _, rec := range command.targets() { go func(receiver MesosCommandTarget) { - log.WithFields(logrus.Fields{ - "agentId": receiver.AgentId, - "executorId": receiver.ExecutorId, - "name": command.GetName(), - }). + log.WithField("partition", command.GetEnvironmentId().String()). + WithFields(logrus.Fields{ + "agentId": receiver.AgentId, + "executorId": receiver.ExecutorId, + "name": command.GetName(), + }). Trace("sending MesosCommand to target") singleCommand := command.MakeSingleTarget(receiver) res, err := m.servent.RunCommand(singleCommand, receiver) if err != nil { - log.WithError(err).Warning("MesosCommand send error") + log.WithField("partition", command.GetEnvironmentId().String()). + WithError(err). + Warning("MesosCommand send error") semaphore <- responseSemaphore{ receiver: receiver, @@ -165,15 +175,17 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } if res.Err() != nil { - log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - "error": res.Err().Error(), - }). + log.WithField("partition", command.GetEnvironmentId().String()). + WithFields(logrus.Fields{ + "commandName": res.GetCommandName(), + "error": res.Err().Error(), + }). Trace("received MesosCommandResponse with error") } else { - log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - }). + log.WithField("partition", command.GetEnvironmentId().String()). + WithFields(logrus.Fields{ + "commandName": res.GetCommandName(), + }). Trace("received MesosCommandResponse") } @@ -193,7 +205,8 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } close(semaphore) - log.WithFields(logrus.Fields{}).Debug("responses collected") + log.WithField("partition", command.GetEnvironmentId().String()). + Debug("responses collected") if len(sendErrorList) != 0 { err = errors.New(strings.Join(func() (out []string) { @@ -206,7 +219,8 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } response = consolidateResponses(command, responses) - log.Debug("responses consolidated, CommandQueue commit done") + log.WithField("partition", command.GetEnvironmentId().String()). + Debug("responses consolidated, CommandQueue commit done") return response, nil } diff --git a/core/controlcommands/mesoscommand.go b/core/controlcommands/mesoscommand.go index bd58411d8..b7c1fea82 100644 --- a/core/controlcommands/mesoscommand.go +++ b/core/controlcommands/mesoscommand.go @@ -25,6 +25,7 @@ package controlcommands import ( + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/mesos/mesos-go/api/v1/lib" "github.com/rs/xid" @@ -38,6 +39,7 @@ const ( type MesosCommand interface { GetName() string GetId() xid.ID + GetEnvironmentId() uid.ID IsMultiCmd() bool MakeSingleTarget(target MesosCommandTarget) MesosCommand IsMutator() bool @@ -47,9 +49,9 @@ type MesosCommand interface { } type MesosCommandTarget struct { - AgentId mesos.AgentID - ExecutorId mesos.ExecutorID - TaskId mesos.TaskID + AgentId mesos.AgentID + ExecutorId mesos.ExecutorID + TaskId mesos.TaskID } type PropertyMap map[string]string @@ -58,16 +60,18 @@ type PropertyMapsMap map[MesosCommandTarget]PropertyMap type MesosCommandBase struct { Name string `json:"name"` Id xid.ID `json:"id"` + EnvironmentId uid.ID `json:"environmentId"` ResponseTimeout time.Duration `json:"timeout"` Arguments PropertyMap `json:"arguments"` TargetList []MesosCommandTarget `json:"targetList"` argMap PropertyMapsMap `json:"-"` } -func NewMesosCommand(name string, receivers []MesosCommandTarget, argMap PropertyMapsMap) (*MesosCommandBase) { +func NewMesosCommand(name string, envId uid.ID, receivers []MesosCommandTarget, argMap PropertyMapsMap) *MesosCommandBase { return &MesosCommandBase{ Name: name, Id: xid.New(), + EnvironmentId: envId, ResponseTimeout: defaultResponseTimeout, TargetList: receivers, argMap: argMap, @@ -88,6 +92,13 @@ func (m *MesosCommandBase) GetId() xid.ID { return xid.NilID() } +func (m *MesosCommandBase) GetEnvironmentId() uid.ID { + if m != nil { + return m.EnvironmentId + } + return uid.NilID() +} + func (m *MesosCommandBase) IsMultiCmd() bool { if m != nil { return len(m.TargetList) > 1 @@ -120,6 +131,7 @@ func (m *MesosCommandBase) MakeSingleTarget(receiver MesosCommandTarget) (cmd Me cmd = &MesosCommandBase{ Name: m.Name, Id: m.Id, + EnvironmentId: m.EnvironmentId, ResponseTimeout: m.ResponseTimeout, TargetList: []MesosCommandTarget{receiver}, argMap: argMap, @@ -144,4 +156,4 @@ func (m *MesosCommandBase) targets() []MesosCommandTarget { return m.TargetList } return nil -} \ No newline at end of file +} diff --git a/core/controlcommands/mesoscommand_transition.go b/core/controlcommands/mesoscommand_transition.go index 97c59435d..48e56dbf7 100644 --- a/core/controlcommands/mesoscommand_transition.go +++ b/core/controlcommands/mesoscommand_transition.go @@ -24,12 +24,14 @@ package controlcommands +import "github.com/AliceO2Group/Control/common/utils/uid" + type MesosCommand_Transition struct { MesosCommandBase - Source string `json:"source"` - Event string `json:"event"` - Destination string `json:"destination"` + Source string `json:"source"` + Event string `json:"event"` + Destination string `json:"destination"` } func (m *MesosCommand_Transition) MakeSingleTarget(target MesosCommandTarget) (cmd MesosCommand) { @@ -51,9 +53,9 @@ func (m *MesosCommand_Transition) MakeSingleTarget(target MesosCommandTarget) (c return } -func NewMesosCommand_Transition(receivers []MesosCommandTarget, source string, event string, destination string, arguments PropertyMapsMap) (*MesosCommand_Transition) { +func NewMesosCommand_Transition(envId uid.ID, receivers []MesosCommandTarget, source string, event string, destination string, arguments PropertyMapsMap) *MesosCommand_Transition { return &MesosCommand_Transition{ - MesosCommandBase: *NewMesosCommand("MesosCommand_Transition", receivers, arguments), + MesosCommandBase: *NewMesosCommand("MesosCommand_Transition", envId, receivers, arguments), Source: source, Event: event, Destination: destination, @@ -73,4 +75,4 @@ func NewMesosCommandResponse_Transition(mesosCommand *MesosCommand_Transition, e CurrentState: currentState, TaskId: taskId, } -} \ No newline at end of file +} diff --git a/core/controlcommands/mesoscommand_triggerhook.go b/core/controlcommands/mesoscommand_triggerhook.go index 7de832bf5..13bd0cc4e 100644 --- a/core/controlcommands/mesoscommand_triggerhook.go +++ b/core/controlcommands/mesoscommand_triggerhook.go @@ -24,6 +24,8 @@ package controlcommands +import "github.com/AliceO2Group/Control/common/utils/uid" + type MesosCommand_TriggerHook struct { MesosCommandBase } @@ -44,15 +46,15 @@ func (m *MesosCommand_TriggerHook) MakeSingleTarget(target MesosCommandTarget) ( return } -func NewMesosCommand_TriggerHook(receivers []MesosCommandTarget) (*MesosCommand_TriggerHook) { +func NewMesosCommand_TriggerHook(envId uid.ID, receivers []MesosCommandTarget) *MesosCommand_TriggerHook { return &MesosCommand_TriggerHook{ - MesosCommandBase: *NewMesosCommand("MesosCommand_TriggerHook", receivers, PropertyMapsMap{}), + MesosCommandBase: *NewMesosCommand("MesosCommand_TriggerHook", envId, receivers, PropertyMapsMap{}), } } type MesosCommandResponse_TriggerHook struct { MesosCommandResponseBase - TaskId string `json:"taskId"` + TaskId string `json:"taskId"` } func NewMesosCommandResponse_TriggerHook(mesosCommand *MesosCommand_TriggerHook, err error, taskId string) *MesosCommandResponse_TriggerHook { @@ -60,4 +62,4 @@ func NewMesosCommandResponse_TriggerHook(mesosCommand *MesosCommand_TriggerHook, MesosCommandResponseBase: *NewMesosCommandResponse(mesosCommand, err), TaskId: taskId, } -} \ No newline at end of file +} diff --git a/core/controlcommands/mesoscommandresponse.go b/core/controlcommands/mesoscommandresponse.go index e21d2fe9a..6163de889 100644 --- a/core/controlcommands/mesoscommandresponse.go +++ b/core/controlcommands/mesoscommandresponse.go @@ -27,12 +27,14 @@ package controlcommands import ( "errors" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/rs/xid" ) type MesosCommandResponse interface { GetCommandName() string GetCommandId() xid.ID + GetEnvironmentId() uid.ID GetResponseSenders() []MesosCommandTarget IsMultiResponse() bool Err() error @@ -42,12 +44,13 @@ type MesosCommandResponse interface { type MesosCommandResponseBase struct { CommandName string `json:"name"` CommandId xid.ID `json:"id"` + EnvironmentId uid.ID `json:"environmentId"` ErrorString string `json:"error"` MessageType string `json:"_messageType"` ResponseSenders []MesosCommandTarget `json:"-"` } -func NewMesosCommandResponse(mesosCommand MesosCommand, err error) (*MesosCommandResponseBase) { +func NewMesosCommandResponse(mesosCommand MesosCommand, err error) *MesosCommandResponseBase { if mesosCommand == nil { log.Debug("trying to create MesosCommandResponseBase for nil MesosCommand, failing miserably") return nil @@ -61,10 +64,11 @@ func NewMesosCommandResponse(mesosCommand MesosCommand, err error) (*MesosComman } return &MesosCommandResponseBase{ - CommandName: mesosCommand.GetName(), - CommandId: mesosCommand.GetId(), - ErrorString: errStr, - MessageType: "MesosCommandResponse", + CommandName: mesosCommand.GetName(), + CommandId: mesosCommand.GetId(), + EnvironmentId: mesosCommand.GetEnvironmentId(), + ErrorString: errStr, + MessageType: "MesosCommandResponse", } } @@ -82,6 +86,13 @@ func (m *MesosCommandResponseBase) GetCommandId() xid.ID { return xid.NilID() } +func (m *MesosCommandResponseBase) GetEnvironmentId() uid.ID { + if m != nil { + return m.EnvironmentId + } + return uid.NilID() +} + func (m *MesosCommandResponseBase) IsMultiResponse() bool { return false } diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index f67a2111a..52708043c 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -76,7 +76,8 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes log.Debug("Servent.RunCommand BEGIN") defer log.Debug("Servent.RunCommand END") - defer utils.TimeTrack(time.Now(), fmt.Sprintf("servent.RunCommand %s to target %s", cmd.GetName(), receiver.TaskId.Value), log.WithPrefix("servent")) + defer utils.TimeTrack(time.Now(), fmt.Sprintf("servent.RunCommand %s to target %s", cmd.GetName(), receiver.TaskId.Value), + log.WithPrefix("servent").WithField("partition", cmd.GetEnvironmentId().String())) cmdId := cmd.GetId() call := NewCall(cmd) @@ -86,39 +87,57 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes Target: receiver, } - log.Trace("servent mutex locking") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locking") s.mu.Lock() - log.Trace("servent mutex locked") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locked") // We append the new call to the pending map, and send the request s.pending[callId] = call s.mu.Unlock() - log.Trace("servent mutex unlocked") - - log.WithFields(logrus.Fields{ - "name": cmd.GetName(), - "id": cmd.GetId(), - "agentId": receiver.AgentId, - "executorId": receiver.ExecutorId, - }). + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex unlocked") + + log.WithPrefix("servent"). + WithFields(logrus.Fields{ + "name": cmd.GetName(), + "partition": cmd.GetEnvironmentId().String(), + "id": cmd.GetId(), + "agentId": receiver.AgentId, + "executorId": receiver.ExecutorId, + }). Trace("calling scheduler SendFunc") err := s.SendFunc(cmd, receiver) if err != nil { - log.Trace("servent mutex locking") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locking") s.mu.Lock() - log.Trace("servent mutex locked") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locked") delete(s.pending, callId) s.mu.Unlock() - log.WithError(err).Trace("servent mutex unlocked") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + WithError(err). + Trace("servent mutex unlocked") return nil, err } - log.WithField("timeout", cmd.GetResponseTimeout()).Trace("blocking until response or timeout") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + WithField("timeout", cmd.GetResponseTimeout()). + Trace("blocking until response or timeout") // Neat, now we block until done||timeout select { case <-call.Done: @@ -127,14 +146,20 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes case <-time.After(cmd.GetResponseTimeout()): call.Error = fmt.Errorf("MesosCommand %s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) - log.Trace("servent mutex locking") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locking") s.mu.Lock() - log.Trace("servent mutex locked") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex locked") delete(s.pending, callId) s.mu.Unlock() - log.Trace("servent mutex unlocked") + log.WithPrefix("servent"). + WithField("partition", cmd.GetEnvironmentId().String()). + Trace("servent mutex unlocked") } if call.Error != nil { @@ -155,12 +180,14 @@ func (s *Servent) ProcessResponse(res MesosCommandResponse, sender MesosCommandT s.mu.Unlock() if !ok || call == nil { - log.WithFields(logrus.Fields{ - "commandName": res.GetCommandName(), - "commandId": res.GetCommandId(), - "agentId": sender.AgentId, - "executorId": sender.ExecutorId, - }). + log.WithPrefix("servent"). + WithField("partition", res.GetEnvironmentId().String()). + WithFields(logrus.Fields{ + "commandName": res.GetCommandName(), + "commandId": res.GetCommandId(), + "agentId": sender.AgentId, + "executorId": sender.ExecutorId, + }). Warning("no pending request found") return } diff --git a/core/environment/manager.go b/core/environment/manager.go index f1bc156d5..a69b2fbde 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -146,7 +146,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err == nil && env != nil { newEnvId = env.Id() } else { - log.WithError(err).Logf(logrus.FatalLevel, "environment creation failed") + log.WithError(err). + WithField("partition", newEnvId.String()). + Logf(logrus.FatalLevel, "environment creation failed") return newEnvId, err } @@ -156,7 +158,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }).Info("creating new environment") env.hookHandlerF = func(hooks task.Tasks) error { - return envs.taskman.TriggerHooks(hooks) + return envs.taskman.TriggerHooks(newEnvId, hooks) } // Ensure the environment_id is available to all @@ -167,7 +169,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) if err != nil { log.WithField("public info", env.Public). - WithField("environment", env.Id().String()). + WithField("partition", env.Id().String()). WithError(err). Warn("parse workflow public info failed.") return newEnvId, fmt.Errorf("workflow public info parsing failed: %w", err) @@ -231,9 +233,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Deployment/configuration failure code path starts here envState := env.CurrentState() - log.WithField("partition", env.Id().String()).Errorf("environment deployment and configuration failed (%s)", workflowPath) + log.WithField("partition", env.Id().String()). + Errorf("environment deployment and configuration failed (%s)", workflowPath) log.WithField("state", envState). - WithField("environment", env.Id().String()). + WithField("partition", env.Id().String()). WithError(err). WithField("level", infologger.IL_Devel). Warn("environment deployment and configuration error, cleanup in progress") @@ -356,8 +359,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": environmentId, + "taskId": taskId, + "partition": environmentId, }). WithError(err). Warn("task failed to release") @@ -375,9 +378,11 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error // calls done, we start the task hooks... cleanupTaskHooks := hooksForWeight.FilterTasks() - err = envs.taskman.TriggerHooks(cleanupTaskHooks) + err = envs.taskman.TriggerHooks(environmentId, cleanupTaskHooks) if err != nil { - log.WithError(err).Warn("environment post-destroy hooks failed") + log.WithField("partition", environmentId.String()). + WithError(err). + Warn("environment post-destroy hooks failed") } // and then we kill them too @@ -399,8 +404,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error if taskReleaseErrors := incomingEv.GetTaskReleaseErrors(); len(taskReleaseErrors) > 0 { for taskId, err := range taskReleaseErrors { log.WithFields(logrus.Fields{ - "taskId": taskId, - "environmentId": environmentId, + "taskId": taskId, + "partition": environmentId, }). WithError(err). Warn("task failed to release") @@ -576,7 +581,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str defer env.closeStream() env.hookHandlerF = func(hooks task.Tasks) error { - return envs.taskman.TriggerHooks(hooks) + return envs.taskman.TriggerHooks(newEnvId, hooks) } // Ensure the environment_id is available to all diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index cc140ae7c..e317b0233 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -77,14 +77,17 @@ func (t DeployTransition) do(env *Environment) (err error) { defer wg.Done() cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" - log.Traceln("[cleanup binary] Executing: " + cmdString) + log.WithField("partition", env.Id().String()). + Traceln("[cleanup binary] Executing: " + cmdString) cmd := exec.Command("/bin/bash", "-c", cmdString) err = cmd.Run() if err != nil { - log.Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) + log.WithField("partition", env.Id().String()). + Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) err = nil // don't kill the env if we don't make it } else { - log.Infof("[cleanup binary] execution successful on %s\n", flp) + log.WithField("partition", env.Id().String()). + Infof("[cleanup binary] execution successful on %s\n", flp) } }(flp) } @@ -204,12 +207,14 @@ func (t DeployTransition) do(env *Environment) (err error) { wfStatus := wf.GetStatus() if wfStatus != task.ACTIVE { - log.Infof("waiting %s for workflow to become active", deploymentTimeout.String()) + log.WithField("partition", env.Id().String()). + Infof("waiting %s for workflow to become active", deploymentTimeout.String()) WORKFLOW_ACTIVE_LOOP: for { select { case wfStatus = <-notifyStatus: log.WithField("status", wfStatus.String()). + WithField("partition", env.Id().String()). Debug("workflow status change") if wfStatus == task.ACTIVE { break WORKFLOW_ACTIVE_LOOP @@ -223,7 +228,7 @@ func (t DeployTransition) do(env *Environment) (err error) { log.WithField("state", role.GetState().String()). WithField("status", roleStatus.String()). WithField("role", role.GetPath()). - WithField("partition", role.GetEnvironmentId().String()). + WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). Error("role failed to deploy within timeout") inactiveTaskRoles = append(inactiveTaskRoles, role.GetPath()) @@ -246,12 +251,13 @@ func (t DeployTransition) do(env *Environment) (err error) { if st := role.GetState(); st == task.ERROR { log.WithField("state", st). WithField("role", role.GetPath()). - WithField("environment", role.GetEnvironmentId().String()). + WithField("partition", env.Id().String()). Error("environment reached invalid state") failedRoles = append(failedRoles, role.GetPath()) } }) log.WithField("state", wfState.String()). + WithField("partition", env.Id().String()). Debug("workflow state change") err = fmt.Errorf("workflow deployment failed, aborting and cleaning up [failed roles: %s]", strings.Join(failedRoles, ", ")) break WORKFLOW_ACTIVE_LOOP @@ -262,6 +268,7 @@ func (t DeployTransition) do(env *Environment) (err error) { if err != nil { log.WithError(err). + WithField("partition", env.Id().String()). Error("deployment error") return } diff --git a/core/task/manager.go b/core/task/manager.go index 4e77c303b..8e6f07472 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -571,7 +571,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") - cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) + cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, event, dest, args) _ = m.cq.Enqueue(cmd, notify) response := <-notify @@ -620,7 +620,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { return nil } -func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { +func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() @@ -640,8 +640,8 @@ func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest st } } - cmd := controlcommands.NewMesosCommand_Transition(receivers, src, event, dest, args) - m.cq.Enqueue(cmd, notify) + cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, event, dest, args) + _ = m.cq.Enqueue(cmd, notify) response := <-notify close(notify) @@ -662,7 +662,7 @@ func (m *Manager) transitionTasks(tasks Tasks, src string, event string, dest st return nil } -func (m *Manager) TriggerHooks(tasks Tasks) error { +func (m *Manager) TriggerHooks(envId uid.ID, tasks Tasks) error { if len(tasks) == 0 { return nil } @@ -674,7 +674,7 @@ func (m *Manager) TriggerHooks(tasks Tasks) error { return err } - cmd := controlcommands.NewMesosCommand_TriggerHook(receivers) + cmd := controlcommands.NewMesosCommand_TriggerHook(envId, receivers) err = m.cq.Enqueue(cmd, notify) if err != nil { return err @@ -940,7 +940,7 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { }() case taskop.TransitionTasks: go func() { - err := m.transitionTasks(tm.GetTasks(), tm.GetSource(), tm.GetEvent(), tm.GetDestination(), tm.GetArguments()) + err := m.transitionTasks(tm.GetEnvironmentId(), tm.GetTasks(), tm.GetSource(), tm.GetEvent(), tm.GetDestination(), tm.GetArguments()) m.internalEventCh <- event.NewTasksStateChangedEvent(tm.GetEnvironmentId(), tm.GetTasks().GetTaskIds(), err) }() case taskop.TaskStatusMessage: diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index b817e2c2d..de29bae5d 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -542,6 +543,7 @@ func (t *ControllableTask) Kill() error { exc = executorcmd.NewLocalExecutorCommand_Transition( t.rpc.Transitioner, + uid.NilID(), []controlcommands.MesosCommandTarget{ { AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a diff --git a/executor/executorcmd/executorcommand_transition.go b/executor/executorcmd/executorcommand_transition.go index 16fbc835f..8c87cca65 100644 --- a/executor/executorcmd/executorcommand_transition.go +++ b/executor/executorcmd/executorcommand_transition.go @@ -25,6 +25,7 @@ package executorcmd import ( + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" ) @@ -35,15 +36,13 @@ type ExecutorCommand_Transition struct { Transitioner transitioner.Transitioner } - -func NewLocalExecutorCommand_Transition(transitioner transitioner.Transitioner, receivers []controlcommands.MesosCommandTarget, source string, event string, destination string, arguments controlcommands.PropertyMapsMap) (*ExecutorCommand_Transition) { +func NewLocalExecutorCommand_Transition(transitioner transitioner.Transitioner, envId uid.ID, receivers []controlcommands.MesosCommandTarget, source string, event string, destination string, arguments controlcommands.PropertyMapsMap) *ExecutorCommand_Transition { return &ExecutorCommand_Transition{ - Transitioner: transitioner, - MesosCommand_Transition: *controlcommands.NewMesosCommand_Transition(receivers, source, event, destination, arguments), + Transitioner: transitioner, + MesosCommand_Transition: *controlcommands.NewMesosCommand_Transition(envId, receivers, source, event, destination, arguments), } } - func (e *ExecutorCommand_Transition) PrepareResponse(err error, currentState string, taskId string) *controlcommands.MesosCommandResponse_Transition { return controlcommands.NewMesosCommandResponse_Transition(&e.MesosCommand_Transition, err, currentState, taskId) } From 54d36282e3bedfa6fec8640431da4ae8583df4d2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Jul 2022 17:06:12 +0200 Subject: [PATCH 1350/2352] [core] Add environment ID to log messages in scheduler and task.Task --- core/task/scheduler.go | 36 ++++++++++++++--- core/task/task.go | 92 +++++++++++++++++++++++------------------- 2 files changed, 81 insertions(+), 47 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index ef3d7a768..dcd20a539 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -133,7 +133,8 @@ func runSchedulerController(ctx context.Context, } return } - log.WithPrefix("scheduler").Info("disconnected") + log.WithPrefix("scheduler"). + Info("disconnected") }), ) } @@ -437,6 +438,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han taskClasses[i] = d.TaskClassName } log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "roles": strings.Join(rolePaths, ", "), "classes": strings.Join(taskClasses, ", "), @@ -542,6 +544,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "taskClass": descriptor.TaskClassName, "constraints": descriptorConstraints[descriptor], @@ -553,11 +556,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } continue } - log.WithPrefix("scheduler").Debug("offer attributes satisfy constraints") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Debug("offer attributes satisfy constraints") wants := state.taskman.GetWantsForDescriptor(descriptor) if wants == nil { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "class": descriptor.TaskClassName, "level": infologger.IL_Devel, @@ -569,6 +575,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if !Resources(remainingResourcesInOffer).Satisfy(wants) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "taskClass": descriptor.TaskClassName, "wants": *wants, @@ -619,9 +626,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) if taskPtr == nil { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithField("offerId", offer.ID.Value). Error("cannot get task for offer+descriptor, this should never happen") - log.Trace("state unlock") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("state unlock") continue } @@ -637,6 +647,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithField("offerId", offer.ID.Value). WithError(err). + WithField("partition", envId.String()). Error("cannot build task command") continue } @@ -700,6 +711,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han jsonCommand, err = json.Marshal(&runCommand) if err != nil { log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "error": err.Error(), "value": *runCommand.Value, @@ -710,6 +722,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Error("cannot serialize mesos.CommandInfo for executor") state.Unlock() log.WithPrefix("scheduler"). + WithField("partition", envId.String()). Trace("state unlock") continue } @@ -737,6 +750,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // Append executor resources to request executorResources := mesos.Resources(state.executor.Resources) log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithField("taskResources", resourcesRequest). WithField("executorResources", executorResources). Debug("creating Mesos task") @@ -746,6 +760,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han executor := state.executor executor.ExecutorID.Value = taskPtr.GetExecutorId() + envIdS := envId.String() mesosTaskInfo := mesos.TaskInfo{ Name: taskPtr.GetName(), @@ -754,6 +769,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Executor: executor, Resources: resourcesRequest, Data: jsonCommand, // this ends up in LAUNCH for the executor + Labels: &mesos.Labels{Labels: []mesos.Label{{ + Key: "environmentId", + Value: &envIdS, + }}}, } // We must run the executor with a special LD_LIBRARY_PATH because @@ -770,6 +789,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } log.WithPrefix("scheduler"). + WithField("partition", envId.String()). WithFields(logrus.Fields{ "taskId": newTaskId, "offerId": offer.ID.Value, @@ -1003,11 +1023,13 @@ func (state *schedulerState) tryReviveOffers(ctx context.Context) { func doReviveOffers(ctx context.Context, state *schedulerState) { err := calls.CallNoData(ctx, state.cli, calls.Revive()) if err != nil { - log.WithPrefix("scheduler").WithField("error", err.Error()). + log.WithPrefix("scheduler"). + WithField("error", err.Error()). Error("failed to revive offers") return } - log.WithPrefix("scheduler").Debug("revive offers done") + log.WithPrefix("scheduler"). + Debug("revive offers done") } func (state *schedulerState) killTask(ctx context.Context, receiver controlcommands.MesosCommandTarget) (err error) { @@ -1029,6 +1051,7 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom err = calls.CallNoData(ctx, state.cli, message) log.WithPrefix("scheduler"). + WithField("partition", command.GetEnvironmentId().String()). WithFields(logrus.Fields{ "agentId": receiver.AgentId.Value, "executorId": receiver.ExecutorId.Value, @@ -1085,7 +1108,8 @@ func logAllEvents() eventrules.Rule { fields["raw"] = fmt.Sprintf("%+v", *e) } log.WithPrefix("scheduler"). - WithFields(fields).Trace("incoming event") + WithFields(fields). + Trace("incoming event") return ch(ctx, e, err) } } diff --git a/core/task/task.go b/core/task/task.go index 26c89e8a2..ae3add20c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -56,7 +56,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(),"task") +var log = logger.New(logrus.StandardLogger(), "task") type parentRole interface { UpdateStatus(Status) @@ -75,11 +75,10 @@ type parentRole interface { SendEvent(event.Event) } - type Traits struct { - Trigger string - Await string - Timeout string + Trigger string + Await string + Timeout string Critical bool } @@ -105,32 +104,31 @@ type Task interface { GetMesosCommandTarget() controlcommands.MesosCommandTarget }*/ - type Task struct { - mu sync.RWMutex - parent parentRole - className string + mu sync.RWMutex + parent parentRole + className string //configuration Descriptor - name string - hostname string - agentId string - offerId string - taskId string - executorId string + name string + hostname string + agentId string + offerId string + taskId string + executorId string localBindMap channel.BindMap - status Status - state State - safeToStop bool + status Status + state State + safeToStop bool - properties gera.StringMap + properties gera.StringMap GetTaskClass func() *taskclass.Class // ↑ to be filled in by NewTaskForMesosOffer in Manager - commandInfo *common.TaskCommandInfo - pid string + commandInfo *common.TaskCommandInfo + pid string } func (t *Task) IsSafeToStop() bool { @@ -169,11 +167,11 @@ func (t *Task) IsLocked() bool { func (t *Task) isLocked() bool { return len(t.hostname) > 0 && - len(t.agentId) > 0 && - len(t.offerId) > 0 && - len(t.taskId) > 0 && - len(t.executorId) > 0 && - t.parent != nil + len(t.agentId) > 0 && + len(t.offerId) > 0 && + len(t.taskId) > 0 && + len(t.executorId) > 0 && + t.parent != nil } func (t *Task) IsClaimable() bool { @@ -208,11 +206,11 @@ func (t *Task) GetTaskCommandInfo() *common.TaskCommandInfo { func (t *Task) buildSpecialVarStack(role parentRole) map[string]string { varStack := make(map[string]string) - varStack["task_name"] = t.GetName() - varStack["task_id"] = t.GetTaskId() - varStack["task_class_name"] = t.GetClassName() - varStack["task_hostname"] = t.GetHostname() - varStack["environment_id"] = role.GetEnvironmentId().String() + varStack["task_name"] = t.GetName() + varStack["task_id"] = t.GetTaskId() + varStack["task_class_name"] = t.GetClassName() + varStack["task_hostname"] = t.GetHostname() + varStack["environment_id"] = role.GetEnvironmentId().String() varStack["task_parent_role"] = role.GetPath() return varStack } @@ -269,7 +267,9 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { varStack, err = role.ConsolidatedVarStack() if err != nil { t.commandInfo = &common.TaskCommandInfo{} - log.WithError(err).Error("cannot fetch variables stack for task command info") + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + Error("cannot fetch variables stack for task command info") return } @@ -283,7 +283,9 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} - log.WithError(err).Error("cannot resolve templates for task defaults") + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + Error("cannot resolve templates for task defaults") } varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) @@ -296,14 +298,18 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { err = varFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} - log.WithError(err).Error("cannot resolve templates for task vars") + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + Error("cannot resolve templates for task vars") } // We wrap the parent varStack around the task's already processed Defaults, // ensuring that any taskclass Defaults are overridden by anything else. varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localVars)) if err != nil { - log.WithError(err).Error("cannot fetch task class defaults for task command info") + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + Error("cannot fetch task class defaults for task command info") return } @@ -322,8 +328,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { }, append( template.WrapSliceItems(cmd.Env), - template.WrapSliceItems(cmd.Arguments)... - )... + template.WrapSliceItems(cmd.Arguments)..., + )..., ) if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) @@ -331,7 +337,9 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} - log.WithError(err).Error("cannot resolve templates for task command info") + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + Error("cannot resolve templates for task command info") } } @@ -454,7 +462,7 @@ func (t *Task) SendEvent(ev event.Event) { defer t.mu.RUnlock() if t.parent == nil { - return + return } t.parent.SendEvent(ev) } @@ -561,7 +569,9 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template), nil) if err != nil { - log.WithError(err).Error("cannot resolve templates for property map") + log.WithError(err). + WithField("partition", t.GetParent().GetEnvironmentId().String()). + Error("cannot resolve templates for property map") return } @@ -663,4 +673,4 @@ func (t *Task) GetTask() *Task { defer t.mu.RUnlock() return t -} \ No newline at end of file +} From 6c4ecfdd38a69d603950cdf9235c8f61d4b11dab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Jul 2022 11:34:34 +0200 Subject: [PATCH 1351/2352] [core] Add missing environment ID to TRG plugin IL output --- core/integration/trg/plugin.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index c56572516..f6e9d0535 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -339,7 +339,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). Debug("not a TRG Global Run, continuing with TRG Run Start") if !ok { - log.Debug("no TRG Global config set") + log.WithField("partition", envId). + Debug("no TRG Global config set") globalConfig = "" } // TODO (malexis): pass consul key to TRG if avail From bef8ac55734361f11bc46b4ec53f39684feb7dc4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Jul 2022 13:32:59 +0200 Subject: [PATCH 1352/2352] [executor] Include environment ID in log messages --- executor/executable/basictask.go | 3 +- executor/executable/basictaskcommon.go | 52 ++-- executor/executable/controllabletask.go | 344 ++++++++++++++---------- executor/executable/hooktask.go | 3 +- executor/executable/task.go | 75 +++--- executor/executor.go | 19 +- executor/executorcmd/client.go | 16 +- executor/executorutil/executorutil.go | 81 ++++++ executor/handlers.go | 59 ++-- 9 files changed, 402 insertions(+), 250 deletions(-) create mode 100644 executor/executorutil/executorutil.go diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index c1f9a5c86..ae3c417aa 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -36,7 +36,8 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { // If it's a basic task role, we make a RUNNING-state based transition function // otherwise we process the hooks spec. return func(ei transitioner.EventInfo) (newState string, err error) { - log.WithField("event", ei.Evt). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("event", ei.Evt). Debug("executor basic task transitioner requesting transition") switch { diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 45b9e579b..2a038cb26 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -45,8 +45,8 @@ import ( type basicTaskBase struct { taskBase - taskCmd *exec.Cmd - transitioner transitioner.Transitioner + taskCmd *exec.Cmd + transitioner transitioner.Transitioner pendingFinalTaskStateCh chan mesos.TaskState } @@ -54,11 +54,12 @@ func (t *basicTaskBase) startBasicTask() (err error) { t.taskCmd, err = prepareTaskCmd(t.Tci) if err != nil { msg := "cannot build task command" - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + }). Error(msg) return err } @@ -78,10 +79,12 @@ func (t *basicTaskBase) startBasicTask() (err error) { switch *t.Tci.Log { case "stdout": stdoutLog := log.WithPrefix("task-stdout"). + WithField("partition", t.knownEnvironmentId.String()). WithField("task", t.ti.Name). WithField("nohooks", true). WriterLevel(logrus.TraceLevel) stderrLog := log.WithPrefix("task-stderr"). + WithField("partition", t.knownEnvironmentId.String()). WithField("task", t.ti.Name). WithField("nohooks", true). WriterLevel(logrus.TraceLevel) @@ -92,9 +95,11 @@ func (t *basicTaskBase) startBasicTask() (err error) { case "all": stdoutLog := log.WithPrefix("task-stdout"). + WithField("partition", t.knownEnvironmentId.String()). WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) stderrLog := log.WithPrefix("task-stderr"). + WithField("partition", t.knownEnvironmentId.String()). WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) @@ -113,7 +118,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { err = t.taskCmd.Start() if err != nil { - log.WithFields(logrus.Fields{ + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err, @@ -123,7 +129,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { return err } - log.WithField("id", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). Debug("basic task started") @@ -146,17 +153,19 @@ func (t *basicTaskBase) startBasicTask() (err error) { } if err != nil { - log.WithFields(logrus.Fields{ + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err.Error(), "level": infologger.IL_Devel, }). Error("task terminated with error") - log.WithField("level", infologger.IL_Support). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("level", infologger.IL_Support). Errorf("task terminated with error: %s %s", - tciCommandStr, - err.Error()) + tciCommandStr, + err.Error()) pendingState = mesos.TASK_FAILED } @@ -169,14 +178,15 @@ func (t *basicTaskBase) startBasicTask() (err error) { } select { - case pending := <- t.pendingFinalTaskStateCh: + case pending := <-t.pendingFinalTaskStateCh: pendingState = pending processTerminatedOnItsOwn = false default: } if errStdout != nil || errStderr != nil { - log.WithFields(logrus.Fields{ + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ "errStderr": errStderr, "errStdout": errStdout, "id": t.ti.TaskID.Value, @@ -198,7 +208,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { btt.FinalMesosState = pendingState btt.Stderr = stderrBuf.String() btt.Stdout = stdoutBuf.String() - t.sendDeviceEvent(btt) + t.sendDeviceEvent(t.knownEnvironmentId, btt) } }() @@ -225,6 +235,7 @@ func (t *basicTaskBase) ensureBasicTaskKilled() (err error) { err = syscall.Kill(-pid, syscall.SIGKILL) if err != nil { log.WithError(err). + WithField("partition", t.knownEnvironmentId.String()). WithField("taskId", t.ti.GetTaskID()). Warning("could not kill task") } @@ -239,12 +250,13 @@ func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) e } t.transitioner = transitioner.NewTransitioner(t.Tci.ControlMode, transitionFunc) - log.WithField("payload", string(t.ti.GetData()[:])). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). - WithField("level",infologger.IL_Devel). + WithField("level", infologger.IL_Devel). Debug("basic task staged") - go t.sendStatus(mesos.TASK_RUNNING, "") + go t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") return nil } @@ -272,6 +284,6 @@ func (t *basicTaskBase) Kill() error { t.taskCmd = nil } - go t.sendStatus(mesos.TASK_FINISHED, "") + go t.sendStatus(t.knownEnvironmentId, mesos.TASK_FINISHED, "") return nil } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index de29bae5d..1372fb480 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -38,7 +38,6 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" pb "github.com/AliceO2Group/Control/executor/protos" @@ -70,10 +69,11 @@ type CommitResponse struct { func (t *ControllableTask) Launch() error { log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + "partition": t.knownEnvironmentId.String(), }).Debug("executor.ControllableTask.Launch begin") launchStartTime := time.Now() @@ -81,10 +81,11 @@ func (t *ControllableTask) Launch() error { defer utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + "partition": t.knownEnvironmentId.String(), })) t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed @@ -92,19 +93,21 @@ func (t *ControllableTask) Launch() error { if err != nil { msg := "cannot build task command" log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err, + "partition": t.knownEnvironmentId.String(), }). Error(msg) - t.sendStatus(mesos.TASK_FAILED, msg+": "+err.Error()) + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, msg+": "+err.Error()) return err } log.WithField("payload", string(t.ti.GetData()[:])). WithField("task", t.ti.Name). WithField("level", infologger.IL_Devel). + WithField("partition", t.knownEnvironmentId.String()). Debug("starting task asynchronously") // We fork out into a goroutine for the actual process management. @@ -113,10 +116,11 @@ func (t *ControllableTask) Launch() error { // via channels. go func() { log.WithFields(logrus.Fields{ - "cmd": t.Tci.GetValue(), - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, + "cmd": t.Tci.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + "partition": t.knownEnvironmentId.String(), }).Debug("executor.ControllableTask.Launch.async begin") // Set up pipes for controlled process @@ -131,29 +135,32 @@ func (t *ControllableTask) Launch() error { } if err != nil { log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "command": tciCommandStr, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + "command": tciCommandStr, + "partition": t.knownEnvironmentId.String(), }). Error("failed to run task") - t.sendStatus(mesos.TASK_FAILED, err.Error()) + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.doTermIntKill(-taskCmd.Process.Pid) return } log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). + WithField("partition", t.knownEnvironmentId.String()). Debug("task launched") utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", - log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "cmd": t.ti.Command.GetValue(), + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) if t.Tci.Log == nil { none := "none" @@ -193,16 +200,17 @@ func (t *ControllableTask) Launch() error { }() } - log.WithFields(logrus.Fields{ - "controlPort": t.Tci.ControlPort, - "controlMode": t.Tci.ControlMode.String(), - "task": t.ti.Name, - "id": t.ti.TaskID.Value, - "path": taskCmd.Path, - "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", - "argc": len(taskCmd.Args), - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "controlPort": t.Tci.ControlPort, + "controlMode": t.Tci.ControlMode.String(), + "task": t.ti.Name, + "id": t.ti.TaskID.Value, + "path": taskCmd.Path, + "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", + "argc": len(taskCmd.Args), + "level": infologger.IL_Devel, + }). Debug("starting gRPC client") controlTransport := executorcmd.ProtobufTransport @@ -220,6 +228,7 @@ func (t *ControllableTask) Launch() error { t.Tci.ControlMode, controlTransport, log.WithPrefix("executorcmd"). + WithField("partition", t.knownEnvironmentId.String()). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -229,15 +238,16 @@ func (t *ControllableTask) Launch() error { ) if t.rpc == nil { err = errors.New("rpc client is nil") - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "command": tciCommandStr, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "error": err.Error(), + "command": tciCommandStr, + }). Error("could not start gRPC client") - t.sendStatus(mesos.TASK_FAILED, err.Error()) + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.doTermIntKill(-taskCmd.Process.Pid) return } @@ -245,37 +255,41 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", - log.WithFields(logrus.Fields{ - "command": tciCommandStr, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "command": tciCommandStr, + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) utils.TimeTrack(rpcDialStartTime, "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", - log.WithFields(logrus.Fields{ - "command": tciCommandStr, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "command": tciCommandStr, + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) statePollingStartTime := time.Now() elapsed := 0 * time.Second for { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "elapsed": elapsed.String(), - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "elapsed": elapsed.String(), + "level": infologger.IL_Devel, + }). Debug("polling task for IDLE state reached") response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). + WithField("partition", t.knownEnvironmentId.String()). WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, @@ -283,12 +297,13 @@ func (t *ControllableTask) Launch() error { }). Info("cannot query task status") } else { - log.WithFields(logrus.Fields{ - "state": response.GetState(), - "task": t.ti.Name, - "command": tciCommandStr, - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "state": response.GetState(), + "task": t.ti.Name, + "command": tciCommandStr, + "level": infologger.IL_Devel, + }). Debug("task status queried") t.knownPid = int(response.GetPid()) } @@ -296,7 +311,8 @@ func (t *ControllableTask) Launch() error { reachedState := t.rpc.FromDeviceState(response.GetState()) if reachedState == "STANDBY" && err == nil { - log.WithField("id", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). WithField("command", tciCommandStr). WithField("level", infologger.IL_Devel). @@ -315,13 +331,15 @@ func (t *ControllableTask) Launch() error { _ = stdoutIn.Close() _ = stderrIn.Close() - log.WithField("task", t.ti.Name).Debug("task killed") - t.sendStatus(mesos.TASK_FAILED, "task reached wrong state on startup") + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("task", t.ti.Name).Debug("task killed") + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, "task reached wrong state on startup") return } else if elapsed >= startupTimeout { err = errors.New("timeout while waiting for task startup") - log.WithField("task", t.ti.Name).Error(err.Error()) - t.sendStatus(mesos.TASK_FAILED, err.Error()) + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("task", t.ti.Name).Error(err.Error()) + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() t.rpc = nil @@ -330,7 +348,8 @@ func (t *ControllableTask) Launch() error { return } else { - log.WithField("task", t.ti.Name). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("task", t.ti.Name). WithField("command", tciCommandStr). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) time.Sleep(startupPollingInterval) @@ -340,48 +359,53 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", - log.WithFields(logrus.Fields{ - "command": tciCommandStr, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "command": tciCommandStr, + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) utils.TimeTrack(statePollingStartTime, "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", - log.WithFields(logrus.Fields{ - "command": tciCommandStr, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "command": tciCommandStr, + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + })) // Set up event stream from task esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) if err != nil { log.WithField("task", t.ti.Name). WithError(err). + WithField("partition", t.knownEnvironmentId.String()). Error("cannot set up event stream from task") - t.sendStatus(mesos.TASK_FAILED, err.Error()) + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() t.rpc = nil return } // send RUNNING - t.sendStatus(mesos.TASK_RUNNING, "") + t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) jsonEvent, err := json.Marshal(taskMessage) if err != nil { - log.WithError(err).Warning("error marshaling message from task") + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err).Warning("error marshaling message from task") } else { t.sendMessage(jsonEvent) - log.WithFields(logrus.Fields{ - "command": tciCommandStr, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - }).Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "command": tciCommandStr, + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "level": infologger.IL_Devel, + }).Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") } // Process events from task in yet another goroutine @@ -393,16 +417,19 @@ func (t *ControllableTask) Launch() error { } for { if t.rpc == nil { - log.WithError(err).Debug("event stream done") + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err).Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { - log.WithError(err).Debug("event stream EOF") + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err).Debug("event stream EOF") break } if err != nil { log.WithError(err). + WithField("partition", t.knownEnvironmentId.String()). WithField("errorType", reflect.TypeOf(err)). WithField("level", infologger.IL_Devel). Warning("error receiving event from task") @@ -415,34 +442,38 @@ func (t *ControllableTask) Launch() error { deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) if deviceEvent == nil { - log.Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") + log.WithField("partition", t.knownEnvironmentId.String()). + Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } - t.sendDeviceEvent(deviceEvent) + t.sendDeviceEvent(t.knownEnvironmentId, deviceEvent) } }() err = taskCmd.Wait() // ^ when this unblocks, the task is done - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "level": infologger.IL_Devel, - }).Debug("task done (taskCmd.Wait unblocks), preparing final update") - - pendingState := mesos.TASK_FINISHED - if err != nil { - log.WithFields(logrus.Fields{ + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "command": tciCommandStr, - "error": err.Error(), "level": infologger.IL_Devel, - }). + }).Debug("task done (taskCmd.Wait unblocks), preparing final update") + + pendingState := mesos.TASK_FINISHED + if err != nil { + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "error": err.Error(), + "level": infologger.IL_Devel, + }). Error("task terminated with error") - log.WithField("level", infologger.IL_Support). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("level", infologger.IL_Support). Errorf("task terminated with error: %s %s", tciCommandStr, err.Error()) @@ -457,30 +488,34 @@ func (t *ControllableTask) Launch() error { if t.rpc != nil { _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much - log.Debug("rpc client closed") + log.WithField("partition", t.knownEnvironmentId.String()). + Debug("rpc client closed") t.rpc = nil - log.Debug("rpc client removed") + log.WithField("partition", t.knownEnvironmentId.String()). + Debug("rpc client removed") } if errStdout != nil || errStderr != nil { - log.WithFields(logrus.Fields{ - "errStderr": errStderr, - "errStdout": errStdout, - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": tciCommandStr, - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "errStderr": errStderr, + "errStdout": errStdout, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "level": infologger.IL_Devel, + }). Warning("failed to capture stdout or stderr of task") } - t.sendStatus(pendingState, "") + t.sendStatus(t.knownEnvironmentId, pendingState, "") }() - log.WithFields(logrus.Fields{ - "task": t.ti.Name, - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "task": t.ti.Name, + "level": infologger.IL_Devel, + }). Debug("gRPC client starting, handler forked: executor.ControllableTask.Launch end") return nil } @@ -519,6 +554,7 @@ func (t *ControllableTask) Kill() error { log.WithField("nativeState", response.GetState()). WithField("taskId", t.ti.GetTaskID()). WithField("level", infologger.IL_Devel). + WithField("partition", t.knownEnvironmentId.String()). Debug("task status queried for upcoming soft kill") // NOTE: we acquire the transitioner-dependent STANDBY equivalent state @@ -543,7 +579,7 @@ func (t *ControllableTask) Kill() error { exc = executorcmd.NewLocalExecutorCommand_Transition( t.rpc.Transitioner, - uid.NilID(), + t.knownEnvironmentId, []controlcommands.MesosCommandTarget{ { AgentId: mesos.AgentID{}, // AgentID and ExecutorID can stay empty because it's a @@ -562,13 +598,14 @@ func (t *ControllableTask) Kill() error { for reachedState != "DONE" && reachedState != "ERROR" { cmd := nextTransition(reachedState) - log.WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - "level": infologger.IL_Devel, - }). + log.WithField("partition", t.knownEnvironmentId.String()). + WithFields(logrus.Fields{ + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + "level": infologger.IL_Devel, + }). Debug("state DONE not reached, about to commit transition") // Call cmd.Commit() asynchronous @@ -584,7 +621,8 @@ func (t *ControllableTask) Kill() error { select { case commitResponse = <-commitDone: case <-time.After(KILL_TRANSITION_TIMEOUT): - log.WithField("task", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Warn("teardown transition sequence timed out") } @@ -593,13 +631,15 @@ func (t *ControllableTask) Kill() error { break } - log.WithField("newState", commitResponse.newState). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("newState", commitResponse.newState). WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Debug("transition committed") if commitResponse.transitionError != nil || len(cmd.Event) == 0 { - log.WithError(commitResponse.transitionError). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Warn("teardown transition sequence error") @@ -608,7 +648,8 @@ func (t *ControllableTask) Kill() error { reachedState = commitResponse.newState } - log.WithField("task", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Debug("teardown transition sequence done") pid = int(response.GetPid()) @@ -620,7 +661,8 @@ func (t *ControllableTask) Kill() error { // If GetState didn't succeed during this Kill code path, but might still have // at some earlier point during the lifetime of this task. // Either way, we might or might not have the true PID. - log.WithError(err). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err). WithField("taskId", t.ti.GetTaskID()). Warn("cannot query task status for graceful process termination") pid = t.knownPid @@ -635,7 +677,8 @@ func (t *ControllableTask) Kill() error { // terminate the shell that is wrapping the command, so we avoid using // negative PID is all other cases in order to allow FairMQ cleanup to // run. - log.WithError(err).WithField("taskId", t.ti.GetTaskID()). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err).WithField("taskId", t.ti.GetTaskID()). Warn("task PID not known from task, using containing shell PGID") } } @@ -644,11 +687,13 @@ func (t *ControllableTask) Kill() error { t.rpc = nil if reachedState == "DONE" { - log.WithField("taskId", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("taskId", t.ti.TaskID.Value). Debug("task exited correctly") t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED } else { // something went wrong - log.WithField("taskId", t.ti.TaskID.Value). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("taskId", t.ti.TaskID.Value). Debug("task killed") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } @@ -659,7 +704,8 @@ func (t *ControllableTask) Kill() error { func (t *ControllableTask) doKill9(pid int) error { killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { - log.WithError(killErr). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(killErr). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGKILL failed") } @@ -673,7 +719,8 @@ func (t *ControllableTask) doTermIntKill(pid int) error { go func() { err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { - log.WithError(err). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(err). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGTERM failed") } @@ -691,7 +738,8 @@ func (t *ControllableTask) doTermIntKill(pid int) error { // Hit Ctrl-C again to abort immediately" message. killErr = syscall.Kill(pid, syscall.SIGINT) if killErr != nil { - log.WithError(killErr). + log.WithField("partition", t.knownEnvironmentId.String()). + WithError(killErr). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGINT failed") } diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go index 39eb94b8f..c8e856339 100644 --- a/executor/executable/hooktask.go +++ b/executor/executable/hooktask.go @@ -35,7 +35,8 @@ type HookTask struct { func (t *HookTask) makeTransitionFunc() transitioner.DoTransitionFunc { // NOOP transition function, because hooks don't obey any transition return func(ei transitioner.EventInfo) (newState string, err error) { - log.WithField("event", ei.Evt). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("event", ei.Evt). Debug("executor hook task transitioner requesting transition") return ei.Dst, nil diff --git a/executor/executable/task.go b/executor/executable/task.go index 066bf9dfa..8642c37e8 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -41,8 +41,10 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorutil" mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" ) @@ -54,8 +56,8 @@ const ( var log = logger.New(logrus.StandardLogger(), "executor") -type SendStatusFunc func(state mesos.TaskState, message string) -type SendDeviceEventFunc func(event event.DeviceEvent) +type SendStatusFunc func(envId uid.ID, state mesos.TaskState, message string) +type SendDeviceEventFunc func(envId uid.ID, event event.DeviceEvent) type SendMessageFunc func(message []byte) type Task interface { @@ -72,10 +74,13 @@ type taskBase struct { sendStatus SendStatusFunc sendDeviceEvent SendDeviceEventFunc sendMessage SendMessageFunc + + knownEnvironmentId uid.ID } func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc, sendMessageFunc SendMessageFunc) Task { var commandInfo common.TaskCommandInfo + envId := executorutil.GetEnvironmentIdFromLabelerType(&taskInfo) tciData := taskInfo.GetData() @@ -89,23 +94,27 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE "task": taskInfo.Name, "controlmode": commandInfo.ControlMode.String(), "level": infologger.IL_Devel, + "partition": envId.String(), }). Debug("instantiating task") rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") log.WithField("level", infologger.IL_Support). + WithField("partition", envId.String()). Infof("launching task %s", rawCommand) } else { if err != nil { log.WithError(err). WithField("task", taskInfo.Name). + WithField("partition", envId.String()). Error("could not launch task") } else { log.WithError(errors.New("command data is nil")). WithField("task", taskInfo.Name). + WithField("partition", envId.String()). Error("could not launch task") } - sendStatusFunc(mesos.TASK_FAILED, "TaskInfo.Data is nil") + sendStatusFunc(envId, mesos.TASK_FAILED, "TaskInfo.Data is nil") return nil } @@ -116,11 +125,12 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE newTask = &BasicTask{ basicTaskBase: basicTaskBase{ taskBase: taskBase{ - ti: &taskInfo, - Tci: &commandInfo, - sendStatus: sendStatusFunc, - sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + knownEnvironmentId: envId, }, }, } @@ -128,11 +138,12 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE newTask = &HookTask{ basicTaskBase: basicTaskBase{ taskBase: taskBase{ - ti: &taskInfo, - Tci: &commandInfo, - sendStatus: sendStatusFunc, - sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + knownEnvironmentId: envId, }, }, } @@ -141,11 +152,12 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE case controlmode.FAIRMQ: newTask = &ControllableTask{ taskBase: taskBase{ - ti: &taskInfo, - Tci: &commandInfo, - sendStatus: sendStatusFunc, - sendDeviceEvent: sendDeviceEventFunc, - sendMessage: sendMessageFunc, + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + knownEnvironmentId: envId, }, rpc: nil, } @@ -191,7 +203,7 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { return nil, err } - gids, gidStrings := getGroupIDs(targetUser) + gids, gidStrings := executorutil.GetGroupIDs(targetUser) credential := &syscall.Credential{ Uid: uint32(uid), @@ -213,28 +225,3 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { return taskCmd, nil } - -func getGroupIDs(targetUser *user.User) ([]uint32, []string) { - gidStrings, err := targetUser.GroupIds() - if err != nil { - // Non-nil error means we're building with !osusergo, so our binary is fully - // static and therefore certain CGO calls needed by os.user aren't available. - // We work around by calling `id -G username` like in the shell. - idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user - output, err := idCmd.Output() - if err != nil { - return []uint32{}, []string{} - } - gidStrings = strings.Split(string(output[:]), " ") - } - - gids := make([]uint32, len(gidStrings)) - for i, v := range gidStrings { - parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32) - if err != nil { - return []uint32{}, []string{} - } - gids[i] = uint32(parsed) - } - return gids, gidStrings -} diff --git a/executor/executor.go b/executor/executor.go index ab0426f3e..959f8b487 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -42,7 +42,9 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/executor/executable" + "github.com/AliceO2Group/Control/executor/executorutil" "github.com/golang/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" @@ -182,7 +184,8 @@ func Run(cfg config.Config) { log.Debug("event loop finished") } if err != nil && err != io.EOF { - log.WithField("error", err).Error("executor disconnected with error") + log.WithField("error", err). + Error("executor disconnected with error") } else { log.Info("executor disconnected") } @@ -293,10 +296,13 @@ func buildEventHandler(state *internalState) events.Handler { // update sends UPDATE to agent. func update(state *internalState, status mesos.TaskStatus) error { + envId := executorutil.GetEnvironmentIdFromLabelerType(&status) + status.Timestamp = proto.Float64(float64(time.Now().Unix())) log.WithFields(logrus.Fields{ - "status": status.State.String(), - "id": status.TaskID.Value, + "partition": envId.String(), + "status": status.State.String(), + "id": status.TaskID.Value, }). Debug("sending UPDATE on task status") upd := calls.Update(status) @@ -306,6 +312,7 @@ func update(state *internalState, status mesos.TaskStatus) error { } if err != nil { log.WithField("error", err). + WithField("partition", envId.String()). Error("executor failed to send update") debugJSON(upd) } else { @@ -315,11 +322,15 @@ func update(state *internalState, status mesos.TaskStatus) error { } // newStatus constructs a new mesos.TaskStatus to describe a task. -func newStatus(state *internalState, id mesos.TaskID) mesos.TaskStatus { +func newStatus(envId uid.ID, state *internalState, id mesos.TaskID) mesos.TaskStatus { + envIdS := envId.String() return mesos.TaskStatus{ TaskID: id, Source: mesos.SOURCE_EXECUTOR.Enum(), ExecutorID: &state.executor.ExecutorID, UUID: []byte(uuid.NewRandom()), + Labels: &mesos.Labels{ + Labels: []mesos.Label{{Key: "environmentId", Value: &envIdS}}, + }, } } diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 8c7a865ea..78da7267d 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -108,7 +108,7 @@ func NewClient( } client.Transitioner = transitioner.NewTransitioner(controlMode, client.doTransition) - client.log = log + client.Log = log return client } @@ -117,7 +117,7 @@ type RpcClient struct { conn *grpc.ClientConn Transitioner transitioner.Transitioner TaskCmd *exec.Cmd - log *logrus.Entry + Log *logrus.Entry } func (r *RpcClient) Close() error { @@ -129,7 +129,7 @@ func (r *RpcClient) FromDeviceState(state string) string { } func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, err error) { - r.log.WithField("event", ei.Evt). + r.Log.WithField("event", ei.Evt). Debug("executor<->occplugin interface requesting transition") var response *pb.TransitionReply @@ -141,7 +141,7 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er } for k, v := range ei.Args { cfg = append(cfg, &pb.ConfigEntry{Key: k, Value: v}) - r.log.WithField("key", k). + r.Log.WithField("key", k). WithField("value", v). Trace("pushing argument") } @@ -157,7 +157,7 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er if err != nil { status, ok := status.FromError(err) if ok { - r.log.WithFields(logrus.Fields{ + r.Log.WithFields(logrus.Fields{ "code": status.Code().String(), "message": status.Message(), "details": status.Details(), @@ -168,14 +168,14 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er err = errors.New(fmt.Sprintf("occplugin returned %s: %s", status.Code().String(), status.Message())) } else { err = errors.New("invalid gRPC status") - r.log.WithField("error", "invalid gRPC status response received from occplugin"). + r.Log.WithField("error", "invalid gRPC status response received from occplugin"). WithField("level", infologger.IL_Support). Error("transition call error") } return } - taskId, _ := r.log.Data["id"] + taskId, _ := r.Log.Data["id"] if response != nil && response.GetOk() && response.GetTrigger() == pb.StateChangeTrigger_EXECUTOR && @@ -183,7 +183,7 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er response.GetState() == ei.Dst { newState = response.GetState() err = nil - r.log.WithField("dst", newState).Debug("occ transition complete") + r.Log.WithField("dst", newState).Debug("occ transition complete") } else if response != nil { newState = response.GetState() err = fmt.Errorf("transition unsuccessful: ok: %s, trigger: %s, event: %s, state: %s, id: %s", diff --git a/executor/executorutil/executorutil.go b/executor/executorutil/executorutil.go new file mode 100644 index 000000000..f2ee8a4f2 --- /dev/null +++ b/executor/executorutil/executorutil.go @@ -0,0 +1,81 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executorutil + +import ( + "os/exec" + "os/user" + "strconv" + "strings" + + "github.com/AliceO2Group/Control/common/utils/uid" + mesos "github.com/mesos/mesos-go/api/v1/lib" +) + +type Labeler interface { + GetLabels() *mesos.Labels +} + +func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID { + envId := uid.NilID() + var err error + if labeler.GetLabels() != nil && len(labeler.GetLabels().Labels) > 0 { + for _, label := range labeler.GetLabels().Labels { + if label.Key == "environmentId" && label.Value != nil { + envId, err = uid.FromString(*label.Value) + if err != nil { + envId = uid.NilID() + } + break + } + } + } + return envId +} + +func GetGroupIDs(targetUser *user.User) ([]uint32, []string) { + gidStrings, err := targetUser.GroupIds() + if err != nil { + // Non-nil error means we're building with !osusergo, so our binary is fully + // static and therefore certain CGO calls needed by os.user aren't available. + // We work around by calling `id -G username` like in the shell. + idCmd := exec.Command("id", "-G", targetUser.Username) // list of GIDs for a given user + output, err := idCmd.Output() + if err != nil { + return []uint32{}, []string{} + } + gidStrings = strings.Split(string(output[:]), " ") + } + + gids := make([]uint32, len(gidStrings)) + for i, v := range gidStrings { + parsed, err := strconv.ParseUint(strings.TrimSpace(v), 10, 32) + if err != nil { + return []uint32{}, []string{} + } + gids[i] = uint32(parsed) + } + return gids, gidStrings +} diff --git a/executor/handlers.go b/executor/handlers.go index a85782540..d4167c334 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -34,9 +34,11 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executable" "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorutil" mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/executor" "github.com/mesos/mesos-go/api/v1/lib/executor/calls" @@ -44,8 +46,8 @@ import ( ) func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executable.SendStatusFunc { - return func(mesosState mesos.TaskState, message string) { - status := newStatus(state, task.TaskID) + return func(envId uid.ID, mesosState mesos.TaskState, message string) { + status := newStatus(envId, state, task.TaskID) status.State = &mesosState status.Message = utils.ProtoString(message) state.statusCh <- status @@ -53,10 +55,11 @@ func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executa } func makeSendDeviceEventFunc(state *internalState) executable.SendDeviceEventFunc { - return func(event event.DeviceEvent) { + return func(envId uid.ID, event event.DeviceEvent) { jsonEvent, err := json.Marshal(event) if err != nil { - log.WithError(err).Warning("error marshaling event from task") + log.WithError(err). + Warning("error marshaling event from task") return } state.messageCh <- jsonEvent @@ -305,28 +308,34 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { // Attempts to launch a task described by a mesos.TaskInfo. This function is thread-safe with respect to state. func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { + // Before we do anything else, we try to get an environment ID for log messages + envId := executorutil.GetEnvironmentIdFromLabelerType(&taskInfo) + log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), - "taskId": taskInfo.TaskID.GetValue(), - "taskName": taskInfo.Name, - "hostname": state.agent.GetHostname(), - "level": infologger.IL_Devel, + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + "partition": envId.String(), }).Debug("executor.handleLaunchEvent begin") defer utils.TimeTrack(time.Now(), "executor.handleLaunchEvent", log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), - "taskId": taskInfo.TaskID.GetValue(), - "taskName": taskInfo.Name, - "hostname": state.agent.GetHostname(), - "level": infologger.IL_Devel, + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + "partition": envId.String(), })) state.unackedTasks[taskInfo.TaskID] = taskInfo jsonTask, _ := json.MarshalIndent(taskInfo, "", "\t") log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])). + WithField("partition", envId.String()). Trace("received task to launch") myTask := executable.NewTask(taskInfo, @@ -341,22 +350,24 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { state.activeTasks[taskInfo.TaskID] = myTask state.activeTasksMu.Unlock() log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), - "taskId": taskInfo.TaskID.GetValue(), - "taskName": taskInfo.Name, - "hostname": state.agent.GetHostname(), - "level": infologger.IL_Devel, + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + "partition": envId.String(), }).Debug("task launching") return nil } else { // If Launch returned non-nil error, it should already have sent back a status update log.WithError(err). WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), - "taskId": taskInfo.TaskID.GetValue(), - "taskName": taskInfo.Name, - "hostname": state.agent.GetHostname(), - "level": infologger.IL_Devel, + "cmd": taskInfo.Command.GetValue(), + "taskId": taskInfo.TaskID.GetValue(), + "taskName": taskInfo.Name, + "hostname": state.agent.GetHostname(), + "level": infologger.IL_Devel, + "partition": envId.String(), }). Error("task launch failed") return err From 43a66dbf4e8481381d6847a0f5b0decdc047223e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 10:29:55 +0200 Subject: [PATCH 1353/2352] [core] Do not loop forever on DCS global stream bad response --- core/integration/dcs/plugin.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c09db653e..cae4ee798 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -46,7 +46,9 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/status" ) const ( @@ -142,7 +144,16 @@ func (p *Plugin) Init(instanceId string) error { break } if err != nil { - log.WithError(err).Error("bad event from DCS service") + if st, ok := status.FromError(err); ok { + if st.Code() != codes.OK { + log.WithError(err). + WithField("code", st.Code().String()). + Error("bad event from DCS service, disconnecting; fix DCS issue then restart ECS core") + break + } + } else { + log.WithError(err).Error("bad event from DCS service") + } } log.WithField("event", ev.String()).Debug("received DCS event") } From c29492c518548aaf949ebcfb0696a6283a6423c9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:08:29 +0200 Subject: [PATCH 1354/2352] [common] Yank out spf13/viper remote package and all its deps --- apricot/config.go | 4 +--- core/config.go | 1 - 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/apricot/config.go b/apricot/config.go index b8364c16f..723cf7f01 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -31,7 +31,6 @@ import ( "github.com/sirupsen/logrus" "github.com/spf13/pflag" "github.com/spf13/viper" - _ "github.com/spf13/viper/remote" "golang.org/x/sys/unix" ) @@ -60,7 +59,7 @@ func setFlags() error { func checkWorkingDirRights() error { err := unix.Access(viper.GetString("workingDir"), unix.W_OK) if err != nil { - return errors.New("No write access for core working path \"" + viper.GetString("workingDir") + "\": "+ err.Error()) + return errors.New("No write access for core working path \"" + viper.GetString("workingDir") + "\": " + err.Error()) } return nil } @@ -78,7 +77,6 @@ func bindEnvironmentVariables() { viper.AutomaticEnv() } - // NewConfig is the constructor for a new config. func NewConfig() (err error) { if err = setDefaults(); err != nil { diff --git a/core/config.go b/core/config.go index cfcf34b43..da91f3633 100644 --- a/core/config.go +++ b/core/config.go @@ -42,7 +42,6 @@ import ( "github.com/AliceO2Group/Control/core/task/schedutil" "github.com/spf13/pflag" "github.com/spf13/viper" - _ "github.com/spf13/viper/remote" "golang.org/x/sys/unix" ) From 1de518fb74f12511d284d61590163e2c5249cd7c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:09:29 +0200 Subject: [PATCH 1355/2352] [build] go mod tidy - finally successful, including bump to Go 1.18 --- go.mod | 228 +++++------ go.sum | 1251 +++++++++++++------------------------------------------- 2 files changed, 399 insertions(+), 1080 deletions(-) diff --git a/go.mod b/go.mod index 265202266..54acb0ffc 100644 --- a/go.mod +++ b/go.mod @@ -1,156 +1,156 @@ module github.com/AliceO2Group/Control -go 1.14 +go 1.18 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt // but was required as: github.com/coreos/bbolt -replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.3 +replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 // Issue: https://github.com/etcd-io/etcd/issues/11563 -replace ( - github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 - google.golang.org/grpc => google.golang.org/grpc v1.34.0 -) +//replace ( +// github.com/coreos/go-systemd => github.com/coreos/go-systemd/v22 v22.0.0 +// google.golang.org/grpc => google.golang.org/grpc v1.43.0 +//) // Issue: https://github.com/rivo/tview/issues/416 // tview should be version 0ba8301b415c otherwise peanut will deadlock require ( - cloud.google.com/go v0.76.0 // indirect - cloud.google.com/go/firestore v1.4.0 // indirect - github.com/AlecAivazis/survey/v2 v2.2.7 - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d // indirect + github.com/AlecAivazis/survey/v2 v2.3.5 github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d - github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/Microsoft/go-winio v0.4.16 // indirect - github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 // indirect - github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca // indirect - github.com/antonmedv/expr v1.8.9 - github.com/aokoli/goutils v1.1.1 // indirect - github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 // indirect - github.com/armon/go-metrics v0.3.6 // indirect - github.com/bketelsen/crypt v0.0.3 // indirect - github.com/briandowns/spinner v1.12.0 - github.com/census-instrumentation/opencensus-proto v0.3.0 // indirect - github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 // indirect - github.com/coreos/bbolt v1.3.4 // indirect - github.com/coreos/etcd v3.3.25+incompatible // indirect - github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf // indirect - github.com/deckarep/golang-set v1.7.1 // indirect + github.com/Microsoft/go-winio v0.5.2 // indirect + github.com/antonmedv/expr v1.9.0 + github.com/briandowns/spinner v1.19.0 github.com/denisbrodbeck/machineid v1.0.1 github.com/dmarkham/enumer v1.5.5 - github.com/dustin/go-humanize v1.0.0 // indirect - github.com/envoyproxy/go-control-plane v0.9.8 // indirect - github.com/envoyproxy/protoc-gen-validate v0.4.1 // indirect - github.com/fatih/color v1.10.0 - github.com/fatih/structs v1.1.0 // indirect + github.com/fatih/color v1.13.0 github.com/flosch/pongo2/v4 v4.0.2 - github.com/gdamore/tcell/v2 v2.1.0 - github.com/gliderlabs/ssh v0.3.0 // indirect - github.com/go-git/go-git/v5 v5.2.0 - github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 // indirect - github.com/go-yaml/yaml v2.1.0+incompatible // indirect + github.com/gdamore/tcell/v2 v2.5.2 + github.com/go-git/go-git/v5 v5.4.2 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.2 - github.com/google/uuid v1.2.0 - github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect - github.com/gorilla/mux v1.7.3 - github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 // indirect - github.com/grpc-ecosystem/grpc-gateway v1.14.3 // indirect - github.com/hashicorp/consul/api v1.8.1 + github.com/google/uuid v1.3.0 + github.com/gorilla/mux v1.8.0 + github.com/hashicorp/consul/api v1.13.1 + github.com/imdario/mergo v0.3.13 + github.com/jinzhu/copier v0.3.5 + github.com/k0kubun/pp v3.0.1+incompatible + github.com/looplab/fsm v0.3.0 + github.com/mesos/mesos-go v0.0.11 + github.com/mitchellh/go-homedir v1.1.0 + github.com/naoina/toml v0.1.1 + github.com/olekukonko/tablewriter v0.0.5 + github.com/onsi/ginkgo v1.15.0 + github.com/onsi/gomega v1.10.5 + github.com/osamingo/indigo v1.1.0 + github.com/pborman/uuid v1.2.1 + github.com/prometheus/client_golang v1.12.2 + github.com/pseudomuto/protoc-gen-doc v1.5.1 + github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e + github.com/rs/xid v1.4.0 + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/segmentio/kafka-go v0.4.33 + github.com/sirupsen/logrus v1.9.0 + github.com/spf13/cobra v1.5.0 + github.com/spf13/pflag v1.0.5 + github.com/spf13/viper v1.12.0 + github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 + github.com/valyala/fasttemplate v1.2.1 + github.com/xeipuuv/gojsonschema v1.2.0 + github.com/xlab/treeprint v1.1.0 + golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa + golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 + golang.org/x/sys v0.0.0-20220731174439-a90be440212d + google.golang.org/grpc v1.48.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 + google.golang.org/protobuf v1.28.1 + gopkg.in/yaml.v3 v3.0.1 +) + +require ( + github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect + github.com/acomagu/bufpipe v1.0.3 // indirect + github.com/armon/go-metrics v0.4.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.1.2 // indirect + github.com/cloudflare/circl v1.2.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/emirpasic/gods v1.18.1 // indirect + github.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/gdamore/encoding v1.0.0 // indirect + github.com/gliderlabs/ssh v0.3.0 // indirect + github.com/go-git/gcfg v1.5.0 // indirect + github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/gogo/protobuf v1.3.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v0.15.0 // indirect - github.com/hashicorp/go-immutable-radix v1.3.0 // indirect + github.com/hashicorp/go-hclog v1.2.2 // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/serf v0.9.8 // indirect github.com/huandu/xstrings v1.3.2 // indirect - github.com/imdario/mergo v0.3.11 - github.com/jinzhu/copier v0.2.4 + github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect - github.com/k0kubun/pp v3.0.1+incompatible - github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 // indirect - github.com/klauspost/compress v1.15.2 // indirect + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/kevinburke/ssh_config v1.2.0 // indirect + github.com/klauspost/compress v1.15.9 // indirect github.com/kylelemons/godebug v1.1.0 // indirect - github.com/looplab/fsm v0.2.0 github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.4 // indirect - github.com/mesos/mesos-go v0.0.11 + github.com/magiconair/properties v1.8.6 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect - github.com/miekg/dns v1.1.29 // indirect - github.com/mitchellh/copystructure v1.1.1 // indirect - github.com/mitchellh/go-homedir v1.1.0 - github.com/mitchellh/mapstructure v1.4.1 // indirect + github.com/mitchellh/copystructure v1.2.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/mwitkow/go-proto-validators v0.3.2 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect - github.com/naoina/toml v0.1.1 github.com/nxadm/tail v1.4.8 // indirect - github.com/olekukonko/tablewriter v0.0.5 - github.com/onsi/ginkgo v1.15.0 - github.com/onsi/gomega v1.10.5 - github.com/osamingo/indigo v1.1.0 - github.com/osteele/liquid v1.2.4 // indirect - github.com/osteele/tuesday v1.0.3 // indirect + github.com/osamingo/base58 v1.0.0 // indirect github.com/pascaldekloe/name v1.0.1 // indirect - github.com/pborman/uuid v1.2.1 - github.com/pelletier/go-toml v1.8.1 // indirect - github.com/pkg/sftp v1.12.0 // indirect + github.com/pelletier/go-toml v1.9.5 // indirect + github.com/pelletier/go-toml/v2 v2.0.2 // indirect + github.com/pierrec/lz4/v4 v4.1.15 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/pressly/chi v0.0.0-00010101000000-000000000000 // indirect - github.com/prometheus/client_golang v1.9.0 - github.com/pseudomuto/protoc-gen-doc v1.4.1 - github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 - github.com/rs/xid v1.2.1 - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/kafka-go v0.4.31 - github.com/sirupsen/logrus v1.8.1 - github.com/smartystreets/assertions v1.0.1 // indirect - github.com/spf13/afero v1.5.1 // indirect - github.com/spf13/cast v1.3.1 // indirect - github.com/spf13/cobra v1.1.3 + github.com/prometheus/client_model v0.2.0 // indirect + github.com/prometheus/common v0.37.0 // indirect + github.com/prometheus/procfs v0.8.0 // indirect + github.com/pseudomuto/protokit v0.2.1 // indirect + github.com/rivo/uniseg v0.3.1 // indirect + github.com/sergi/go-diff v1.2.0 // indirect + github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4 // indirect + github.com/spf13/afero v1.9.2 // indirect + github.com/spf13/cast v1.5.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.7.1 - github.com/stretchr/testify v1.7.0 // indirect - github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 - github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc // indirect - github.com/ugorji/go v1.1.4 // indirect - github.com/valyala/fasttemplate v1.2.1 + github.com/subosito/gotenv v1.4.0 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect - github.com/xanzy/ssh-agent v0.3.0 // indirect + github.com/xanzy/ssh-agent v0.3.1 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonschema v1.2.0 - github.com/xlab/treeprint v1.0.0 - github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 // indirect - go.etcd.io/bbolt v1.3.4 // indirect - go.opencensus.io v0.22.6 // indirect - go.uber.org/zap v1.14.1 // indirect - golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f - golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb // indirect - golang.org/x/image v0.0.0-20201208152932-35266b937fa6 // indirect - golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f // indirect - golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 - golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 // indirect - golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e - golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 // indirect - golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 // indirect - golang.org/x/tools v0.1.11 // indirect - golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect - google.golang.org/api v0.39.0 // indirect - google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect - google.golang.org/grpc v1.45.0 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 - google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162 // indirect - google.golang.org/protobuf v1.28.0 - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect - gopkg.in/ini.v1 v1.62.0 // indirect - gopkg.in/osteele/liquid.v1 v1.2.4 // indirect - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - sigs.k8s.io/yaml v1.2.0 // indirect + github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c // indirect + golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/tools v0.1.12 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9 // indirect + gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/codahale/hdrhistogram => github.com/HdrHistogram/hdrhistogram-go v1.0.1 diff --git a/go.sum b/go.sum index 86dd6a56d..d5c3bf405 100644 --- a/go.sum +++ b/go.sum @@ -1,410 +1,191 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.55.0/go.mod h1:ZHmoY+/lIMNkN2+fBmuTiqZ4inFhvQad8ft7MT8IV5Y= cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0 h1:EpMNVUorLiZIELdMZbCYX/ByTFCdoYopYAGxaGVz9ms= cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAqw= -cloud.google.com/go v0.62.0 h1:RmDygqvj27Zf3fCQjQRtLyC7KwFcHkeJitcO0OoGOcA= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.63.0 h1:A+DfAZQ/eWca7gvu42CS6FNSDX4R8cghF+XfWLn4R6g= -cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= -cloud.google.com/go v0.64.0/go.mod h1:xfORb36jGvE+6EexW71nMEtL025s3x6xvuYUKM4JLv4= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.66.0/go.mod h1:dgqGAjKCDxyhGTtC9dAREQGUJpkceNm1yt590Qno0Ko= -cloud.google.com/go v0.67.0/go.mod h1:YNan/mUhNZFrYUor0vqrsQ0Ffl7Xtm/ACOy/vsTS858= -cloud.google.com/go v0.68.0/go.mod h1:91NO4SCDjUfe1zeC0f4/dpckkUNpuNEyqm4X2KLrzNQ= -cloud.google.com/go v0.69.0/go.mod h1:nBQK+D2Y4slKAj03c6wkILB3imWdzebeEZgWHEmGREE= -cloud.google.com/go v0.69.1/go.mod h1:nBQK+D2Y4slKAj03c6wkILB3imWdzebeEZgWHEmGREE= -cloud.google.com/go v0.70.0/go.mod h1:/UTKYRQTWjVnSe7nGvoSzxEFUELzSI/yAYd0JQT6cRo= -cloud.google.com/go v0.71.0/go.mod h1:qZfY4Y7AEIQwG/fQYD3xrxLNkQZ0Xzf3HGeqCkA6LVM= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.73.0/go.mod h1:BkDh9dFvGjCitVw03TNjKbBxXNKULXXIq6orU6HrJ4Q= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.76.0 h1:Ckw+E/QYZgd/5bpI4wz4h6f+jmpvh9S9uSrKNnbicJI= -cloud.google.com/go v0.76.0/go.mod h1:r9EvIAvLrunusnetGdQ50M/gKui1x3zdGW/VELGkdpw= -cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/firestore v1.1.0 h1:9x7Bx0A9R5/M9jibeJeZWqjeVEIxYW9fZYqB9a70/bY= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= -cloud.google.com/go/firestore v1.2.0 h1:zrl+2VJAYC/C6WzEPnkqZIBeHyHFs/UmtzJdXU4Bvmo= -cloud.google.com/go/firestore v1.2.0/go.mod h1:iISCjWnTpnoJT1R287xRdjvQHJrxQOpeah4phb5D3h0= -cloud.google.com/go/firestore v1.3.0 h1:QaBSisuvNi9/o+3nCHqUEfduHCPfhEw2jcUofi0n8oY= -cloud.google.com/go/firestore v1.3.0/go.mod h1:Qt0gS9Qz9tROrmgFavo36+hdST1FXvmtnGnO0Dr03pU= -cloud.google.com/go/firestore v1.4.0 h1:A8eudYNUtdspdyoR6OaPoZxSFxE4qu7ctKcxvhGsUOE= -cloud.google.com/go/firestore v1.4.0/go.mod h1:NjjGEnxCS3CAKYp+vmALu20QzcqasGodQp48WxJGAYc= -cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0 h1:86K1Gel7BQ9/WmNWn7dTKMvTLFzwtBe5FNqYbi9X35g= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037 h1:+PdD6GLKejR9DizMAKT5DpSAkKswvZrurk1/eEt9+pw= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20201218220906-28db891af037/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey v1.8.8 h1:Y4yypp763E8cbqb5RBqZhGgkCFLRFnbRBHrxnpMMsgQ= -github.com/AlecAivazis/survey/v2 v2.1.1 h1:LEMbHE0pLj75faaVEKClEX1TM4AJmmnOh9eimREzLWI= -github.com/AlecAivazis/survey/v2 v2.1.1/go.mod h1:9FJRdMdDm8rnT+zHVbvQT2RTSTLq0Ttd6q3Vl2fahjk= -github.com/AlecAivazis/survey/v2 v2.2.7 h1:5NbxkF4RSKmpywYdcRgUmos1o+roJY8duCLZXbVjoig= -github.com/AlecAivazis/survey/v2 v2.2.7/go.mod h1:9DYvHgXtiXm6nCn+jXnOXLKbH+Yo9u8fAS/SduGdoPk= -github.com/AliceO2Group/Bookkeeping v0.16.3 h1:4Ng3xtgrVarj1YFyEdAUkjXUv44HHjry7LjuMJUaykA= -github.com/AliceO2Group/Bookkeeping v0.16.3/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.16.4 h1:Te0bbfYUiPRoL9TiIhbIs/NP/lmUV8E8E6d6mMHYWAk= -github.com/AliceO2Group/Bookkeeping v0.16.4/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.16.6 h1:jl9OqxujN48U82M7lOfUCyIGCteW7nYHMYRCZWPxJaY= -github.com/AliceO2Group/Bookkeeping v0.16.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.16.8 h1:xNiRFMaCNLGZaDwTJz0i5l2wrkxbGfcb293jb77/8KI= -github.com/AliceO2Group/Bookkeeping v0.16.8/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.16.9 h1:yqMR7e4FDjAeNbSJ08WJJN1ug0k/VyFiEwx6Aiw4Ju0= -github.com/AliceO2Group/Bookkeeping v0.16.9/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.6 h1:O6D3wr5+twn0JQHiSz5+4TWdhNmWFYqxxdtPXUxlAjI= -github.com/AliceO2Group/Bookkeeping v0.17.6/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.7 h1:22Mb6Hdp9tZ3z8QeAjm81S4HiLaNLBVZ5Mn3TWRSQqI= -github.com/AliceO2Group/Bookkeeping v0.17.7/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.11 h1:Ktmua360dZEaLSbD4z1pfXVGnVa7x6b8hKsog+PLH50= -github.com/AliceO2Group/Bookkeeping v0.17.11/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.12 h1:ZyV2aDM348nvtQDiI/5H5cart9B4dHvFbcf4C2OEcTw= -github.com/AliceO2Group/Bookkeeping v0.17.12/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459 h1:a3CKsuyQtuiIT5e89at/rp+OgZK/1PvI5PjMVot67tY= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220506100653-5023df7a3459/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168 h1:dNmTnFLXTwGVpt0spEYALJPgF20D1DmUGCdn2BaeF+Y= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220708054416-8f6ce27ae168/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220728074543-2e10e2e0bb45 h1:yh95IlA8mlp2HZMOzsq/2S+eOqIak9ejv86L4/E7MI0= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220728074543-2e10e2e0bb45/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d h1:OxlrgZ1yhEi8W+7U0OX7TMeH5T0Vy12BEJjMemP+idc= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220801084726-26c98c9e315d/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f h1:s8o3xu0+3TrjYuRypa5C4XyLOIpoLxupdnS5z2LetDU= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210308150404-e78be0de914f/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba h1:hbiftnpE/yrRFcuuo2DGOtLhcyy1SFer1cWLS/GWG00= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210409104827-fd1b74c641ba/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e h1:9rLFEKaGcH6nmz2JcM4zcfKuGJq+/nPVr30o33s7/eM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210504163454-decc0eed681e/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89 h1:Wfo58o2d/ILS7Kz+tmVEBb/Gg9Dd2bOr17gH+Na3lKU= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210917100552-e0d4d674fe89/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82 h1:2qYbJeWSSpG5cr7usLewzNaC3f7czW1of4uoHLoeXyY= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20210924092906-25a559aecc82/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18 h1:f20KwRKWuJgZtXDrTvKUreQLACfDeqmpwLi/xD45b3g= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20211008112908-4cf8d3c04b18/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d9725 h1:g+Q7GFhMF6ohdHOuPlGTYaOQYbqzHvrHQ7bG3xjjPoE= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220505082553-b9e96c1d9725/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459 h1:cS+ZX4ZVvDfKcBtHne25XJFLksfnpyJMcT4nDYQXEqk= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220506100653-5023df7a3459/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168 h1:XN/vDB2JmiV+HgKb0Nkj7NC9r5z/j1SH9klfxrBXkwM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220708054416-8f6ce27ae168/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220728074543-2e10e2e0bb45 h1:OEzfMzQahfhYAZz9m8xF/m1+F/kPnEQ9t5Vk5uDFu3U= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220728074543-2e10e2e0bb45/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= +github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d h1:berCePbayn2xvvMmO6hwriVip7TrAPb4mmnbRZRM7Xs= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk= -github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/HdrHistogram/hdrhistogram-go v1.0.1/go.mod h1:BWJ+nMSHY3L41Zj7CA3uXnloDp7xxV0YvstAE7nKTaM= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= -github.com/Masterminds/semver v1.4.2 h1:WBLTQ37jOCzSLtXNdoo8bNM8876KhNqOKvrlGITgsTc= -github.com/Masterminds/semver v1.4.2/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= -github.com/Masterminds/sprig v2.15.0+incompatible h1:0gSxPGWS9PAr7U2NsQ2YQg6juRDINkUyuvbb4b2Xm8w= -github.com/Masterminds/sprig v2.15.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.16 h1:FtSW/jqD+l4ba5iPBj9CODVtgfYAD8w2wS923g/cFDk= github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8 h1:xzYJEypr/85nBpB11F9br+3HUrpgb+fcm5iADzXXYEw= -github.com/Netflix/go-expect v0.0.0-20180615182759-c93bf25de8e8/go.mod h1:oX5x61PbNXchhh0oikYAH+4Pcfw5LKv21+Jnpr6r6Pc= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= -github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= +github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= +github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= +github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= +github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= +github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf h1:aFFtnGZ6/2Qlvx80yxA2fFSYDQWTFjtKozQKB36A3/A= +github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4 h1:Hs82Z41s6SdL1CELW+XaDYmOH4hkBN4/N9og/AsOv7E= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15 h1:AUNCr9CiJuwrRYS3XieqF+Z9B9gNxo/eANAJCF2eiN4= -github.com/alecthomas/units v0.0.0-20210208195552-ff826a37aa15/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= -github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca h1:QHbltbNkVcw97h4zA/L8gA4o3dJiFvBZ0gyZHrYXHbs= -github.com/antlr/antlr4 v0.0.0-20191011202612-ad2bd05285ca/go.mod h1:T7PbCXFs94rrTttyxjbyT5+/1V8T2TYDejxUfHJjw1Y= -github.com/antonmedv/expr v1.4.5 h1:yYjQAps1CZTBJBKntVnSEWYp15ML9IWnlrKuFHQ6/HY= -github.com/antonmedv/expr v1.4.5/go.mod h1:xesgliOuukGf21740qhh8PvFdN66yZ9lJJ/PzSFAmzI= -github.com/antonmedv/expr v1.5.0/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.1/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.2/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.3/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.4/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.5/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.6/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.7/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.8/go.mod h1:i5qAyxwTt2v5ZffcBiLX9LqFS+1/B1nV7/oUEkaUFNQ= -github.com/antonmedv/expr v1.5.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.5.10/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.6.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.7.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.7.1 h1:KK+VpHu1TtIDQL1ej2kA1VC/4TbtEeuLoNY10y1889Y= -github.com/antonmedv/expr v1.7.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.1/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.2/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.3/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.4/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.5/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.6/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.7/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.8 h1:uVwIkIBNO2yn4vY2u2DQUqXTmv9jEEMCEcHa19G5weY= -github.com/antonmedv/expr v1.8.8/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/antonmedv/expr v1.8.9 h1:O9stiHmHHww9b4ozhPx7T6BK7fXfOCHJ8ybxf0833zw= -github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= -github.com/aokoli/goutils v1.0.1 h1:7fpzNGoJ3VA8qcrm++XEE1QUe0mIwNeLa02Nwq7RDkg= -github.com/aokoli/goutils v1.0.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/aokoli/goutils v1.1.1/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/antonmedv/expr v1.9.0 h1:j4HI3NHEdgDnN9p6oI6Ndr0G5QryMY0FNxT4ONrFDGU= +github.com/antonmedv/expr v1.9.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro= -github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.6 h1:x/tmtOF9cDBoXH7XoAGOz2qqm1DknFD1590XmD/DUJ8= -github.com/armon/go-metrics v0.3.6/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= +github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c h1:+0HFd5KSZ/mm3JmhmrDukiId5iR6w4+BdFtfSy4yWIc= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.3 h1:6bNynYE39IsvJHCLr6ziogOcIAec7LO6cuW/lwWGEWw= -github.com/bketelsen/crypt v0.0.3/go.mod h1:XG4b7lkBbt44/SZ4QOtOjhd5SXJzF+pTJE+nWFY+Yqs= -github.com/briandowns/spinner v1.9.0 h1:+OMAisemaHar1hjuJ3Z2hIvNhQl9Y7GLPWUwwz2Pxo8= -github.com/briandowns/spinner v1.9.0/go.mod h1://Zf9tMcxfRUA36V23M6YGEAv+kECGfvpnLTnb8n4XQ= -github.com/briandowns/spinner v1.11.1 h1:OixPqDEcX3juo5AjQZAnFPbeUA0jvkp2qzB5gOZJ/L0= -github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= -github.com/briandowns/spinner v1.12.0 h1:72O0PzqGJb6G3KgrcIOtL/JAGGZ5ptOMCn9cUHmqsmw= -github.com/briandowns/spinner v1.12.0/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/census-instrumentation/opencensus-proto v0.2.1 h1:glEXhBS5PSLLv4IXzLA5yPRVX4bilULVyxxbrfOtDAk= +github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= +github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= +github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/bwesterb/go-ristretto v1.2.1/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/census-instrumentation/opencensus-proto v0.3.0 h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk= -github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= +github.com/cloudflare/circl v1.2.0 h1:NheeISPSUcYftKlfrLuOo4T62FkmD4t4jviLfFFYaec= +github.com/cloudflare/circl v1.2.0/go.mod h1:Ch2UgYr6ti2KTtlejELlROl0YIYj7SLjAC8M+INXlMk= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354 h1:9kRtNpqLHbZVO/NNxhHp2ymxFxsHOe3x2efJGn//Tas= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0 h1:r3DTlrs4TDsAOv3sTv8XlcUUj5J/t2l4/rCdwPuc13s= -github.com/cncf/udpa/go v0.0.0-20210210032658-bff43e8824d0/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.19+incompatible h1:2tYUqV9YMS1r2UKH1jUxEtLRVEu38yhUW7kl42Ou6P0= -github.com/coreos/etcd v3.3.19+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.22+incompatible h1:AnRMUyVdVvh1k7lHe61YEd227+CLoNogQuAypztGSK4= -github.com/coreos/etcd v3.3.22+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.24+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/etcd v3.3.25+incompatible h1:0GQEw6h3YnuOVdtwygkIfJ+Omx0tZ8/QkVyXI4LkbeY= -github.com/coreos/etcd v3.3.25+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.0.0 h1:XJIw/+VlJ+87J+doOxznsAWIdmWuViOVhkQamW5YV28= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f h1:lBNOc5arjvs8E5mO2tbpBpLoyyu8B6e44T7hJy6potg= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= +github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set v1.7.1 h1:SCQV0S6gTtp6itiFrTqI+pfmJ4LN85S1YzhDf9rTHJQ= -github.com/deckarep/golang-set v1.7.1/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/dmarkham/enumer v1.5.2 h1:dZxvuDqF8oL1fg9vxp1TjqHJ0JSL9ADU+hHbisgsRB8= -github.com/dmarkham/enumer v1.5.2/go.mod h1:jZ3PNbNJDEkFGx54MlkSjnDQUo7445l7/guoKdh9cY8= github.com/dmarkham/enumer v1.5.5 h1:LpOGL3PQTPOM87rgowZEf7Z5EmkgnKqUtS92Vo+vqzs= github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= +github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7 h1:EARl0OvqMoxq/UMgMSCLnXzkaXbxzskluEBlMQCJPms= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.8 h1:bbmjRkjmP0ZggMoahdNMmJFFnK7v5H+/j5niP5QH6bg= -github.com/envoyproxy/go-control-plane v0.9.8/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.0.14/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.1.0 h1:EQciDnbrYxy13PgWoY8AqoxGiPrpgBZ1R8UNe3ddc+A= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java h1:bV5JGEB1ouEzZa0hgVDFFiClrUEuGWRaAc/3mxR2QK0= -github.com/envoyproxy/protoc-gen-validate v0.3.0-java/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.4.1 h1:7dLaJvASGRD7X49jSCSXXHwKPm0ZN9r9kJD+p+vS7dM= -github.com/envoyproxy/protoc-gen-validate v0.4.1/go.mod h1:E+IEazqdaWv3FrnGtZIu3b9fPFMK8AzeTTrk9SfVwWs= +github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.10.0 h1:s36xzo75JdqLaaWoiEHk767eHiwo0598uUxyfiPkDsg= -github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= -github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/flosch/pongo2 v0.0.0-20200913210552-0d938eb266f3 h1:fmFk0Wt3bBxxwZnu48jqMdaOR/IZ4vdtJFuaFV8MpIE= -github.com/flosch/pongo2/v4 v4.0.0 h1:6eZe8NSNxtTTGwXgJqqXiiLEDAj7CvkwiYrZFQRW6cQ= -github.com/flosch/pongo2/v4 v4.0.0/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568 h1:BHsljHzVlRcyQhjrss6TZTdY2VfCqZPbv5k3iBFa2ZQ= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.1.2/go.mod h1:h3kq4HO9l2On+V9ed8w8ewqQEmGCSSHOgQ+2h8uzurE= -github.com/gdamore/tcell v1.3.0 h1:r35w0JBADPZCVQijYebl6YMWWtHRqVEGt7kL2eBADRM= github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= -github.com/gdamore/tcell v1.4.0 h1:vUnHwJRvcPQa3tzi+0QI4U9JINXYJlOz9yiaiPQ2wMU= -github.com/gdamore/tcell v1.4.0/go.mod h1:vxEiSDZdW3L+Uhjii9c3375IlDmR05bzxY404ZVSMo0= -github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591 h1:0WWUDZ1oxq7NxVyGo8M3KI5jbkiwNAdZFFzAdC68up4= -github.com/gdamore/tcell/v2 v2.0.1-0.20201017141208-acf90d56d591/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= -github.com/gdamore/tcell/v2 v2.1.0 h1:UnSmozHgBkQi2PGsFr+rpdXuAPRRucMegpQp3Z3kDro= -github.com/gdamore/tcell/v2 v2.1.0/go.mod h1:vSVL/GV5mCSlPC6thFP5kfOFdM9MGZcalipmpTxTgQA= -github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= +github.com/gdamore/tcell/v2 v2.5.2 h1:tKzG29kO9p2V++3oBY2W9zUjYu7IK1MENFeY/BzJSVY= +github.com/gdamore/tcell/v2 v2.5.2/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-chi/chi v1.5.2 h1:YcLIBANL4OTaAOcTdp//sskGa0yGACQMCtbnr7YEn0Q= -github.com/go-chi/chi v1.5.2/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= -github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git v1.0.0 h1:YcN9iDGDoXuIw0vHls6rINwV416HYa0EB2X+RBsyYp4= -github.com/go-git/go-git v4.7.0+incompatible h1:+W9rgGY4DOKKdX2x6HxSR7HNeTxqiKrOvKnuittYVdA= -github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc= -github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= -github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= -github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk= -github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM= -github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI= -github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265 h1:BcbKYUZo/TKPsiSh7LymK3p+TNAJJW3OfGO/21sBbiA= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20201108214237-06ea97f0c265/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= -github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1 h1:/s5zKNz0uPFCZ5hddgPdo2TK2TVrUNMn0OOX8/aZMTE= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e h1:1r7pUrabqp18hOBcwBwiTsbnFeTZHV9eER/QT5JVZxY= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -413,14 +194,11 @@ github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5 h1:F768QJ1E9tib+q5Sc8MkdJi1RxLTbRcTf8LJV56aRls= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= @@ -428,36 +206,28 @@ github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrU github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1 h1:/exdXoGamhu5ONeUJH0deniYLWYvQwW66yvlfiiKTu0= github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -468,106 +238,53 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200905233945-acf8798be1f7/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201009210932-67992a1a5a35/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201117184057-ae444373da19/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v0.0.0-20161128191214-064e2069ce9c/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= -github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0= -github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0 h1:0IKlLyQ3Hs9nDaiK5cSHAGmcQEIC8l2Ts1u6x5Dfrqg= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.0/go.mod h1:mJzapYve32yjrKlk9GbyCZHuPgZsrbyIbyKhSzOpg6s= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= -github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= -github.com/grpc-ecosystem/grpc-gateway v1.14.6 h1:8ERzHx8aj1Sc47mu9n/AksaKCSWrMchFtkdrS4BIj5o= -github.com/grpc-ecosystem/grpc-gateway v1.14.6/go.mod h1:zdiPV4Yse/1gnckTHtghG4GkDEdKCRJduHpTxT3/jcw= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/api v1.4.0 h1:jfESivXnO5uLdH650JU/6AnjRoHrLhULq0FnC3Kp9EY= -github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= -github.com/hashicorp/consul/api v1.8.1 h1:BOEQaMWoGMhmQ29fC26bi0qb7/rId9JzZP2V0Xmx7m8= -github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.4.0 h1:zBtCfKJZcJDBvSCkQJch4ulp59m1rATFLKwNo/LYY30= -github.com/hashicorp/consul/sdk v0.4.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= -github.com/hashicorp/consul/sdk v0.7.0 h1:H6R9d008jDcHPQPAqPNuydAshJ4v5/8URdFnUvK/+sc= -github.com/hashicorp/consul/sdk v0.7.0/go.mod h1:fY08Y9z5SvJqevyZNy6WWPXiG3KwBPAvlcdx16zZ0fM= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= +github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/hashicorp/consul/api v1.13.1 h1:r5cPdVFUy+pFF7nt+0ArLD9hm+E39OewJkvNdjKXcL4= +github.com/hashicorp/consul/api v1.13.1/go.mod h1:+1VcOos0TVdQFqXxphG4zmGcwQB4KVGkp1maPqnkDpE= +github.com/hashicorp/consul/sdk v0.10.0 h1:rGLEh2AWK4K0KCMvqWAz2EYxQqgciIfMagWZ0nVe5MI= +github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0 h1:d4QkX8FRTYaKaCZBoXYY8zJX2BXjWxurN/GA2tkrmZM= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.12.1 h1:99niEVkDqsEv3/jINwoOUgGE9L41LHXM4k3jTkV+DdA= -github.com/hashicorp/go-hclog v0.12.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.14.0 h1:1X+ga+2ki9aUJJaliI2isvjNLI8rNCGHFkZ1FaVpvCA= -github.com/hashicorp/go-hclog v0.14.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.15.0 h1:qMuK0wxsoW4D0ddCCYwPSTm4KQv1X1ke3WmPWZ0Mvsk= -github.com/hashicorp/go-hclog v0.15.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.2 h1:ihRI7YFwcZdiSD7SIenIhHfQH3OuDvWerAUBZbeQS3M= +github.com/hashicorp/go-hclog v1.2.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5bOTPYG5W3vf9+8= -github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE= -github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= -github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= -github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= -github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -575,65 +292,38 @@ github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/memberlist v0.2.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.2.2 h1:5+RffWKwqJ71YPu9mWsF7ZOscZmwfasdA8kbdC7AO2g= -github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hashicorp/serf v0.9.0 h1:+Zd/16AJ9lxk9RzfTDyv/TLhZ8UerqYS0/+JGCIDaa0= -github.com/hashicorp/serf v0.9.0/go.mod h1:YL0HO+FifKOW2u1ke99DGVu1zhcpZzNwrLIqBC7vbYU= -github.com/hashicorp/serf v0.9.2 h1:yJoyfZXo4Pk2p/M/viW+YLibBFiIbKoP79gu7kDAFP0= -github.com/hashicorp/serf v0.9.2/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hashicorp/serf v0.9.5 h1:EBWvyu9tcRszt3Bxp3KNssBMP1KuHWyO51lz9+786iM= -github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= -github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= -github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= +github.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA= +github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/serf v0.9.8 h1:JGklO/2Drf1QGa312EieQN3zhxQ+aJg6pG+aC3MFaVo= +github.com/hashicorp/serf v0.9.8/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= +github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.0.0 h1:pO2K/gKgKaat5LdpAhxhluX2GPQMaI3W5FUz/I/UnWk= -github.com/huandu/xstrings v1.0.0/go.mod h1:4qWG/gcEcfX4z/mBDHJ++3ReCw9ibxbsNJbcucJdbSo= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= -github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.9 h1:UauaLniWCFHWd+Jp9oCEkTBj8VO/9DKg3PV3VCNMDIg= -github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= +github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a h1:zPPuIq2jAWWPTrGt70eK/BSch+gFAGrNzecsoENgu2o= -github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a/go.mod h1:yL958EeXv8Ylng6IfnvG4oflryUi3vgA3xPs9hmII1s= -github.com/jinzhu/copier v0.2.4 h1:dT3tI+8GzU8DjJFCj9mLYtjfRtUmK7edauduQdcZCpI= -github.com/jinzhu/copier v0.2.4/go.mod h1:24xnZezI2Yqac9J61UC6/dG/k76ttpq0DdJI3QmUvro= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10 h1:Kz6Cvnvv2wGdaG/V8yMvfkmNiXq9Ya2KUv4rouJJr68= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= @@ -642,228 +332,132 @@ github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd h1:Coekwdh0v2wtGp9Gmz1Ze3eVRAWJMLokvN3QjdzCHLY= -github.com/kevinburke/ssh_config v0.0.0-20190725054713-01f96b0aa0cd/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= +github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.14.2/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.15.2 h1:3WH+AG7s2+T8o3nrM/8u2rdqUEcQhmga7smjrT41nAw= -github.com/klauspost/compress v1.15.2/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.7/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= -github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/looplab/fsm v0.1.0 h1:Qte7Zdn/5hBNbXzP7yxVU4OIFHWXBovyTT2LaBTyC20= -github.com/looplab/fsm v0.1.0/go.mod h1:m2VaOfDHxqXBBMgc26m6yUOwkFn8H2AlJDE+jd/uafI= -github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1 h1:o8x6Bd9wEjQk/8+bNzmmLb+OUvrc4syw0JUVfa10v8k= -github.com/looplab/fsm v0.1.1-0.20200515093641-7b255ef4c8a1/go.mod h1:p+IElwgCnAByqr2DWMuNbPjgMwqcHvTRZZn3dvKEke0= -github.com/looplab/fsm v0.2.0 h1:M8hf5EF4AYLcT1FNKVUX8nu7D0xfp291iGeuigSxfrw= -github.com/looplab/fsm v0.2.0/go.mod h1:p+IElwgCnAByqr2DWMuNbPjgMwqcHvTRZZn3dvKEke0= +github.com/looplab/fsm v0.3.0 h1:kIgNS3Yyud1tyxhG8kDqh853B7QqwnlWdgL3TD2s3Sw= +github.com/looplab/fsm v0.3.0/go.mod h1:PmD3fFvQEIsjMEfvZdrCDZ6y8VwKTwWNjlpEr6IKPO4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= -github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lyft/protoc-gen-star v0.5.1/go.mod h1:9toiA3cC7z5uVbODF7kEQ91Xn7XNFkVUl+SrEe+ZORU= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.4 h1:8KGKTcQQGm0Kv7vEbKFErAoAOFyyacLStRtQSeYtvkY= -github.com/magiconair/properties v1.8.4/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= +github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= +github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= -github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.8 h1:3tS41NlGYSmhhe/8fhGRzc+z3AYCw1Fe1WAyLuujKs0= github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= +github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= +github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac h1:5R0t3LzzDjy+i54gCEndmnlt6yZ7Y5GO5olBCRDceZQ= -github.com/mesos/mesos-go v0.0.0-20190717023829-56ac038085ac/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b h1:j7+1HpAFS1zy5+Q4qx1fWh90gTKwiN4QCGoY9TWyyO4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= -github.com/miekg/dns v1.0.14 h1:9jZdLNd/P4+SfEJ0TNyxYpsK8N4GtfylBLqtbYN1sbA= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= -github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= -github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= +github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= -github.com/mitchellh/copystructure v1.1.1 h1:Bp6x9R1Wn16SIz3OfeDr0b7RnCG2OB66Y7PQyC/cvq4= -github.com/mitchellh/copystructure v1.1.1/go.mod h1:EBArHfARyrSWO/+Wyr9zwEkc6XMFB9XyNgFNmRkZZU4= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= +github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= -github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.2.2 h1:dxe5oCinTXiTIcfgmZecdCzPmAJKd46KsCWc35r0TV4= -github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.3.1 h1:cCBH2gTD2K0OtLlv/Y5H01VQCqmlDxz30kS5Y5bqfLA= -github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/reflectwalk v1.0.1 h1:FVzMWA5RllMAKIdUSC8mdWo3XtwoecrH79BY70sEEpE= -github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= +github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007 h1:28i1IjGcx8AofiB4N3q5Yls55VEaitzuEPkFJEVgGkA= -github.com/mwitkow/go-proto-validators v0.0.0-20180403085117-0950a7990007/go.mod h1:m2XC9Qq0AlmmVksL6FktJCdTYyLk7V3fKyp0sl1yWQo= +github.com/mwitkow/go-proto-validators v0.3.2 h1:qRlmpTzm2pstMKKzTdvwPCF5QfBNURSlAgN/R+qbKos= +github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA7a5VarXUOUxD+oeD30w= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.4 h1:vHD/YYe1Wolo78koG299f7V/VAS08c6IpCLn+Ejf/w8= -github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0 h1:Iw5WCbBcaAAd0fpRb1c9r5YCylv4XDoCSigm1zLevwU= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.12.2 h1:Ke9m3h2Hu0wsZ45yewCqhYr3Z+emcNTuLY2nMWCkrSI= -github.com/onsi/ginkgo v1.12.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.9.0 h1:R1uwffexN6Pr340GtYRIdZmAiN4J+iw6WG4wog1DUXg= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= -github.com/osamingo/indigo v1.0.1 h1:zYzUDKDD4ihcz+8nz1HkZeKxn2Fff40UD/FuV0rXXQQ= -github.com/osamingo/indigo v1.0.1/go.mod h1:P3iMtCzPHsVZfeO/XLHVgrm/fe454OsfnDoUYn/GTjw= github.com/osamingo/indigo v1.1.0 h1:wRq0ZpnuJ4hXLeMIh4KcH+4IbUnGCUvcfipYIQPP6pg= github.com/osamingo/indigo v1.1.0/go.mod h1:KnJW/XBDP4wLWMKxEowEyBh0LALfNVSBGOqRqEAm9NM= -github.com/osteele/liquid v1.2.4 h1:ydm/FoHn/cStyN7Fpar4L/ClyRKc9rZ+Qzb+S3OMOT4= -github.com/osteele/liquid v1.2.4/go.mod h1:jhgMyQFVoV0grH2MKvpMbgxFSBezOoXUbgiwnYrKJ2c= -github.com/osteele/tuesday v1.0.3 h1:SrCmo6sWwSgnvs1bivmXLvD7Ko9+aJvvkmDjB5G4FTU= -github.com/osteele/tuesday v1.0.3/go.mod h1:pREKpE+L03UFuR+hiznj3q7j3qB1rUZ4XfKejwWFF2M= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= -github.com/pascaldekloe/name v1.0.0/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcMb0= github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= -github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-buffruneio v0.2.0/go.mod h1:JkE26KsDizTr40EUHkXVtNPvgGtbSNq5BcowyYOWdKo= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= -github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pelletier/go-toml v1.8.0 h1:Keo9qb7iRJs2voHvunFtuuYFsbWeOBh8/P9v/kVMFtw= -github.com/pelletier/go-toml v1.8.0/go.mod h1:D6yutnOGMveHEPV7VQOuvI/gXY61bv+9bAOTRnLElKs= -github.com/pelletier/go-toml v1.8.1 h1:1Nf83orprkJyknT6h7zbuEGUEjcyVlCxSUGTENmNCRM= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.14 h1:+fL8AQEZtz/ijeNnpduH0bROTu0O3NZAlPjQxGn8LwE= -github.com/pierrec/lz4/v4 v4.1.14/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= +github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= +github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= +github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= -github.com/pkg/sftp v1.10.1 h1:VasscCm72135zRysgrJDKsntdmPN+OuU3+nnHYA9wyc= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= -github.com/pkg/sftp v1.12.0 h1:/f3b24xrDhkhddlaobPe2JgBqfdt+gC/NYl0QY9IOuI= -github.com/pkg/sftp v1.12.0/go.mod h1:fUqqXB5vEgVCZ131L+9say31RAri6aF6KDViawhxKK8= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -872,205 +466,117 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= -github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0 h1:YVPodQOcK15POxhgARIvnDRVpLcuK8mglnMrWfyrw6A= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.9.0 h1:Rrch9mh17XcxvEu9D9DEpb4isxjGBtcevQjKvxPRQIU= -github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0 h1:RyRA7RzGXQZiW+tGMr7sxa85G1z0yOpM1qq5c8lNawc= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0 h1:4fgOnadei3EZvgRwxJ7RMpG1k1pOZth5Pc13tyspaKM= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8 h1:+fpWZdT24pJBiqJdAwYBjPSk+5YmQzYNPYzQsdzLkt8= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.0.11 h1:DhHlBtkHWPYi8O2y31JkK0TF+DGM+51OopZjH/Ia5qI= -github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.2.0 h1:wH4vA7pcjKuZzjF7lM8awk4fnuJO6idemZXoKnULUx4= -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/pseudomuto/protoc-gen-doc v1.3.2 h1:61vWZuxYa8D7Rn4h+2dgoTNqnluBmJya2MgbqO32z6g= -github.com/pseudomuto/protoc-gen-doc v1.3.2/go.mod h1:y5+P6n3iGrbKG+9O04V5ld71in3v/bX88wUwgt+U8EA= -github.com/pseudomuto/protoc-gen-doc v1.4.1 h1:aNTZq0dy0Pq2ag2v7bhNKFNgBBA8wMCoJSChhd7RciE= -github.com/pseudomuto/protoc-gen-doc v1.4.1/go.mod h1:exDTOVwqpp30eV/EDPFLZy3Pwr2sn6hBC1WIYH/UbIg= -github.com/pseudomuto/protokit v0.2.0 h1:hlnBDcy3YEDXH7kc9gV+NLaN0cDzhDvD1s7Y6FZ8RpM= -github.com/pseudomuto/protokit v0.2.0/go.mod h1:2PdH30hxVHsup8KpBTOXTBeMVhJZVio3Q8ViKSAXT0Q= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/rivo/tview v0.0.0-20190515161233-bd836ef13b4b/go.mod h1:+rKjP5+h9HMwWRpAfhIkkQ9KE3m3Nz5rwn7YtUpwgqk= -github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c h1:Q1oRqcTvxE0hjV0Gw4bEcYYLM0ztcuARGVSWEF2tKaI= -github.com/rivo/tview v0.0.0-20200219135020-0ba8301b415c/go.mod h1:/rBeY22VG2QprWnEqG57IBC8biVu3i0DOIjRLc9I8H0= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498 h1:4CFNy7/q7P06AsIONZzuWy7jcdqEmYQvOZ9FAFZdbls= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= +github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= +github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= +github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= -github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f h1:ITrvUKe4041A8IlJkWx+lm2pSj5QzZwpeYNfCnO5u3U= -github.com/rivo/tview v0.0.0-20200527194121-8aa2912f246f/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= -github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0 h1:WCfp+Jq9Mx156zIf9X6Frd6F19rf7wIRlm54UPxUfcU= -github.com/rivo/tview v0.0.0-20210125085121-dbc1f32bb1d0/go.mod h1:1QW7hX7RQzOqyGgx8O64bRPQBrFtPflioPPX5gFPV3A= -github.com/rivo/uniseg v0.0.0-20190513083848-b9f5b9457d44/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e h1:jWL4QylzqJQNk+iO3gkzbm433Akmn7nbRUEPrFU0SRA= +github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e/go.mod h1:/Ve2+D+tGMTMNAlGXKCIX9ZeX2InzODYHotmtKZUUVk= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rivo/uniseg v0.3.1 h1:SDPP7SHNl1L7KrEFCSJslJ/DM9DT02Nq2C61XrfHMmk= +github.com/rivo/uniseg v0.3.1/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= +github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/sanity-io/litter v1.1.0/go.mod h1:CJ0VCw2q4qKU7LaQr3n7UOSHzgEMgcGco7N/SkZQPjw= -github.com/sanity-io/litter v1.2.0 h1:DGJO0bxH/+C2EukzOSBmAlxmkhVMGqzvcx/rvySYw9M= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.4.31 h1:+ImsrkJRju9j1D9U44rvRGRlpsI9GnwD8s9WTFagNLQ= -github.com/segmentio/kafka-go v0.4.31/go.mod h1:m1lXeqJtIFYZayv0shM/tjrAFljvWLTprxBHd+3PnaU= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/segmentio/kafka-go v0.4.33 h1:XHYuEifMYFVCU9A2p1wJprd7xHQKS+Sn6xgBr11+30k= +github.com/segmentio/kafka-go v0.4.33/go.mod h1:GAjxBQJdQMB5zfNA21AhpaqOB2Mu+w3De4ni3Gbm8y0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= +github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.5.0 h1:1N5EYkVAPEywqZRJd7cwnRtCb6xJx7NH3T3WUTF980Q= -github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo= -github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= -github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/assertions v1.0.1 h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w= -github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= -github.com/smartystreets/assertions v1.1.0 h1:MkTeG1DMwsrdH7QtLXy5W+fUxWq+vmb6cLmyJ7aRtF0= -github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= -github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sony/sonyflake v1.0.0 h1:MpU6Ro7tfXwgn2l5eluf9xQvQJDROTBImNCfRXn/YeM= -github.com/sony/sonyflake v1.0.0/go.mod h1:Jv3cfhf/UFtolOTTRd3q4Nl6ENqM+KfyZ5PseKfZGF4= +github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= +github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4 h1:KPf4aWX4JGEdMICunm9A0YTFbD6OL23G14BR7cL/0wg= github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= -github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.3.4 h1:8q6vk3hthlpb2SouZcnBVKboxWQWMDNF38bwholZrJc= -github.com/spf13/afero v1.3.4/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.5.1 h1:VHu76Lk0LSP1x254maIu2bplkWpfBWI+B+6fdoZprcg= -github.com/spf13/afero v1.5.1/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.3.1 h1:nFm6S0SMdyzrzcmThSipiEubIDy8WEXKNZ0UOgiRpng= -github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v0.0.6 h1:breEStsVwemnKh2/s6gMvSdMEkwW0sK8vGStnlVBMCs= -github.com/spf13/cobra v0.0.6/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3 h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= +github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= +github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.6.2 h1:7aKfF+e8/k68gda3LOjo5RxiUqddoFxVq4BKBPrxk5E= -github.com/spf13/viper v1.6.2/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= -github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.7.1 h1:pM5oEahlgWv/WnHXpgbKz7iLIxRf65tye2Ci+XFK5sk= -github.com/spf13/viper v1.7.1/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/src-d/gcfg v1.4.0 h1:xXbNR5AlLSA315x2UO+fTSSAXCDf+Ar38/6oyGbDKQ4= -github.com/src-d/gcfg v1.4.0/go.mod h1:p/UMsR43ujA89BJY9duynAwIpvqEujIH/jFlfL7jWoI= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= +github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= +github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v0.0.0-20170130113145-4d4bfba8f1d1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.1/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= +github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc h1:yUaosFVTJwnltaHbSNC3i82I92quFs+OFPRl8kNMVwo= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200122045848-3419fae592fc/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966 h1:j6JEOq5QWFker+d7mFQYOhjTZonQ7YkLTHm56dbn+yM= -github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.1.0 h1:RZqt0yGBsps8NGvLSGW804QQqCUYYLsaOjTVHy1Ocw4= -github.com/valyala/fasttemplate v1.1.0/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70= -github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4= -github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP0E/raorCMxlFGSTBrsSlaDGf3jU/qvAE2c= +github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= +github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= +github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= +github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= +github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -1078,258 +584,165 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xlab/treeprint v1.0.0 h1:J0TkWtiuYgtdlrkkrDLISYBQ92M+X5m4LrIIMKrbDTs= -github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= +github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32 h1:5tjfNdR2ki3yYQ842+eX2sQHeiwpKJ0RnHO4IYOc4V8= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.2 h1:YjHC5TgyMmHpicTgEqDN0Q96Xo8K6tLXPnmNOHXCgs0= -github.com/yuin/goldmark v1.3.2/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg= -go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= +github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0 h1:C9hSCOW830chIVkdja34wa6Ky+IzWllkUinR+BtRZd4= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3 h1:8sGtKOrtQqkN1bp2AtX+misvLIlOmsEsNd+9NIcPEm8= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.22.6 h1:BdkrbWrzDlV9dnbzoP7sfN+dHheJ4J9JOaYxcUDL+ok= -go.opencensus.io v0.22.6/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1 h1:nYDKopTbvAPq/NrUVZwT15y2lpROBiLLyoRTbXOYWOo= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -go.uber.org/zap v1.15.0 h1:ZZCA22JRF2gQE5FoNmhmrf7jeJJ2uhqDUNRYKm8dvmM= -go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= -golang.org/x/crypto v0.0.0-20180501155221-613d6eafa307/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190506204251-e1dfcc566284/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 h1:3zb4D3T4G8jdExgVU/95+vQXfpEPiMdCaZgmGVxjNHM= -golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw= -golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY= -golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f h1:OeJjE6G4dgCY4PIXvIRQbE8+RX+uXZyGhUy/ksMGJoc= -golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= +golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190731235908-ec7cb31e5a56/go.mod h1:JhuoJpWY28nO4Vef9tZUw9qufEGTyX1+7lmHxV5q5G4= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136 h1:A1gGSx58LAGVHUUsOf7IiR0u8Xb6W51gRwfDBhkdcaw= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6 h1:QE6XYQK6naiK1EPAe1g/ILLxN5RBoH5xkJk3CqlMI/Y= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb h1:sZS6jzvbihmmQSPcU1iZSROTVMAjCXPEnd/ZCSyKsjA= -golang.org/x/exp v0.0.0-20210201131500-d352d2db2ceb/go.mod h1:I6l2HNBLBZEcrOoCpyKLdY2lHoRZ8lI4x60KMCQDft4= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6 h1:nfeHNc1nAqecKCy2FCy4HY+soOOe5sDLJ/gZLbx6GYI= -golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mobile v0.0.0-20201217150744-e6ae53a27f4f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= -golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f h1:aEcjdTsycgPqO/caTgnxfR9xwWOltP/21vtJyFztEy0= -golang.org/x/mobile v0.0.0-20210208171126-f462b3930c8f/go.mod h1:skQtrUTUwhdJvXM/2KKJzY8pDgNr9I/FOMqDVRPBUS4= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.1-0.20200828183125-ce943fd02449/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg= -golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0= golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2 h1:eDrdRpKgkcCqKZQwyZRyeFZgfqt37SL7Kv3tok06cKE= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200927032502-5d4f70055728/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201010224723-4f7140c49acb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201026091529-146b70c837a4/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11 h1:lwlPPsmjDKK0J6eG6xDWd5XPehI0R024zxjDnw3esPA= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777 h1:003p0dJM77cxMSyCPFphvZf/Y5/NXf5fzg6ufd1/Oew= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4 h1:HVyaeDAYux4pnY+D/SiwmLOR36ewZ4iGQIIrtnuCjFA= -golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 h1:UreQrH7DbFXSi9ZFox6FNT3WBooWmdANpU+IfkT1T4I= +golang.org/x/net v0.0.0-20220728211354-c7608f3a8462/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210113205817-d3ed898aa8a3/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd h1:2arJsLyTCJGek+eeptQ3z49Rqndm0f+zvvpwNIXWNIA= -golang.org/x/oauth2 v0.0.0-20210210192628-66670185b0cd/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93 h1:alLDrZkL34Y2bnGHfvC1CYBRBXCXgx8AC2vY4MRtYX4= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c h1:q3gFqPqH7NVofKo3c3yETAP//pPI+G5mvB7qqj1Y5kY= +golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190412183630-56d357773e84/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e h1:vcxGaoTs7kV8m5Np9uUNQin4BrLOthgV7252N8V+FwY= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03iWnKLEWinaScsxF2Vm2o= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a h1:DcqTD9SDLc+1P/r1EmRBwnVsrOwW+kk2vWf9n+1sGhs= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1337,189 +750,146 @@ golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191018095205-727590c5006e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200317113312-5766fd39f98d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121 h1:rITEj+UZHYC927n8GT97eC3zrpzXdb/voyeOuVKS46o= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642 h1:B6caxRw+hozq68X2MY7jEpZh/cr4/aHLv9xU8Kkadrw= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc h1:HVFDs9bKvTxP6bh1Rj9MCSo+UmafQtI8ZWDPVwVk9g4= -golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs= -golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210113181707-4bcb84eeeb78/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c h1:VwygUrnw9jn88c4u8GD3rZQbqrP/tgas88tPUbBxQrk= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da h1:b3NXsE2LusjYGGjL5bxEVZZORm/YEFFrWFjR8eFrw/c= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007 h1:gG67DSER+11cZvqIMb8S8bt0vZtiN6xWYARwirrOSfE= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6 h1:nonptSpoQ4vQjyraW20DXPAglgQfVnM9ZC6MmNLMR60= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e h1:NHvCuwuS43lGnYhten69ZWqi2QOj/CiDNcKbVqwVoew= -golang.org/x/sys v0.0.0-20220712014510-0a85c31ab51e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= +golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171 h1:EH1Deb8WZJ0xc0WK//leUHXcX9aLE5SymusoTmMZye8= -golang.org/x/term v0.0.0-20220411215600-e5f449aeb171/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= +golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0 h1:/5xXl8Y5W96D+TtHSlonuFqGHIWVuyCkGJLwGh9JJFs= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1 h1:NusfzzA6yGQ+ua51ck7E3omNUX/JuqbFSaRGqU8CcLI= -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324 h1:Hir2P/De0WpUhtrKGGjvSb2YxUgyZ7EFOSLIcSSpiwE= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190729092621-ff9f1409240a/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117012304-6edc0a871e69/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200221224223-e1da425f72fd/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200317043434-63da46f3035e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245 h1:oj6yp1cr3vAo7EXJt9jCqfIzrwvFFVD6zI6VO+qNA6s= -golang.org/x/tools v0.0.0-20200324053659-5c746ccfa245/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d h1:SR+e35rACZFBohNb4Om1ibX6N3iO0FtdbwqGSuD9dBU= -golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200727233628-55644ead90ce/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200806022845-90696ccdc692 h1:fsn47thVa7Ar/TMyXYlZgOoT7M4+kRpb+KpSAqRQx1w= -golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200817023811-d00afeaade8f/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= -golang.org/x/tools v0.1.11 h1:loJ25fNOEhSXfHrpoGj91eCUThwdNX6u24rO1xnNteY= -golang.org/x/tools v0.1.11/go.mod h1:SgwaegtQh8clINPpECJMqnxLv9I09HLqnW3RMqW0CA4= +golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0= -golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0 h1:Q3Ui3V3/CVinFWFiW39Iw0kMuVrRzYX0wN6OPFp0lTA= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= @@ -1528,41 +898,27 @@ google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/ google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0 h1:BaiDisFir8O4IJxvAabCGGkQ6yCJegNQqSVoYUNAnbk= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.31.0/go.mod h1:CL+9IBCa2WWU6gRuBWaKqGWLFFwbEUXkfeMkHLQWYWo= -google.golang.org/api v0.32.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.33.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.34.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.37.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.38.0 h1:vDyWk6eup8eQAidaZ31sNWIn8tZEL8qpbtGkBD4ytQo= -google.golang.org/api v0.38.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.39.0 h1:zHCTXf0NeDdKTgcSQpT+ZflWAqHsEp1GmdpxW09f3YM= -google.golang.org/api v0.39.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1 h1:QzqyMA1tlu6CgqCDUtU9V+ZKhLFT2dkJuANu5QaxI3I= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20181107211654-5fc9ac540362/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= @@ -1575,135 +931,98 @@ google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472 h1:XRuIAeTRoXziYGYTVer+YGxVXQBiOhZ8+SpNELP73oQ= -google.golang.org/genproto v0.0.0-20200323114720-3f67cca34472/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200711021454-869866162049/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200728010541-3dc8dca74b7b/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= -google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201203001206-6486ece9c497/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d h1:HV9Z9qMhQEsdlvxNFELgQ11RkMzO3CMkjEySjCtuLes= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119 h1:m9+RjTMas6brUP8DBxSAa/WIPFy7FIhKpvk+9Ppce8E= -google.golang.org/genproto v0.0.0-20210202153253-cf70463f6119/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea h1:N98SvVh7Hdle2lgUVFuIkf0B3u29CUakMUQa7Hwz8Wc= -google.golang.org/genproto v0.0.0-20210207032614-bba0dbe2a9ea/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9 h1:d3fKQZK+1rWQMg3xLKQbPMirUCo29I/NRdI2WarSzTg= +google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.30.0 h1:M5a8xTlYTxwMn5ZFkwhRabsygDY5G8TYLyQDBxJNAxE= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1 h1:M8spwkmx0pHrPq+uMdl22w5CvJ/Y+oAJTIs9oGoCpOE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.0.1/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d h1:vV+xpotnpsR73kzOS8o8hxDlc7Er+H5WZqOBwWcGktk= -google.golang.org/grpc/examples v0.0.0-20200826230536-d31b6710005d/go.mod h1:Lh55/1hxmVHEkOvSIQ2uj0P12QyOCUNyRwnUlSS13hw= -google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162 h1:mRuiC6mcne6n331BpxtLkEKil9jN1EziWqMOBjedtSk= -google.golang.org/grpc/examples v0.0.0-20210210183804-ad24ab52b162/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= +google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0 h1:4MY060fB1DLGMB/7MBTLnwQUY6+F09GEiz6SsrNqyzM= google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0 h1:Ejskq+SyPohKW+1uil0JJMtmHCgJPJ/qWTxr8qp+R4c= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= +google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= +google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= -gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.55.0 h1:E8yzL5unfpW3M6fz/eB7Cb5MQAYSZ7GKo4Qth+N2sgQ= -gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.57.0 h1:9unxIsFcTt4I55uWluz+UmL95q4kdJ0buvQ1ZIqVQww= -gopkg.in/ini.v1 v1.57.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/osteele/liquid.v1 v1.2.4 h1:OioNeCaVyWL1jRXzRqQ2vr4ISBbTgtnYsJeVlToLhBw= -gopkg.in/osteele/liquid.v1 v1.2.4/go.mod h1:9Bx5f04tf9SVwv3Tcx93dx3WH0EKWmE0Gjd6Dyoc5cs= -gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= -gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0 h1:ivZFOIltbce2Mo8IjzUHAFoq/IylO9WHhNOAJK+LsJg= -gopkg.in/src-d/go-git-fixtures.v3 v3.5.0/go.mod h1:dLBcvytrw/TYZsNTWCnkNF2DSIlzWYqTe3rJR56Ac7g= -gopkg.in/src-d/go-git.v4 v4.13.1 h1:SRtFyV8Kxc0UP7aCHcijOMQGPxHSmMOPrzulQWolkYE= -gopkg.in/src-d/go-git.v4 v4.13.1/go.mod h1:nx5NYcxdKxq5fpltdHnPa2Exj4Sx0EclMWZQbYDu2z8= +gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= +gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86 h1:OfFoIUYv/me30yv7XlMy4F9RJw8DEm8WQ6QG1Ph4bH0= -gopkg.in/yaml.v3 v3.0.0-20200506231410-2ff61e1afc86/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3 h1:sXmLre5bzIR6ypkjXCDI3jHPssRhc8KD/Ome589sc3U= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= -sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= From c408cba4da2050cc750c1e286c4d5aa48cc43705 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:10:20 +0200 Subject: [PATCH 1356/2352] [common] DeviceEvents can now carry Labels, including environmentId --- common/event/deviceevent.go | 30 ++++++++++++------------- common/event/event.go | 29 +++++++++++++++++++----- common/labels.go | 44 +++++++++++++++++++++++++++++++++++++ 3 files changed, 83 insertions(+), 20 deletions(-) create mode 100644 common/labels.go diff --git a/common/event/deviceevent.go b/common/event/deviceevent.go index 702faa089..2dab19aee 100644 --- a/common/event/deviceevent.go +++ b/common/event/deviceevent.go @@ -31,9 +31,9 @@ import ( type DeviceEventOrigin struct { // FIXME: replace these Mesos-tainted string wrappers with plain strings - AgentId mesos.AgentID `json:"agentId"` - ExecutorId mesos.ExecutorID `json:"executorId"` - TaskId mesos.TaskID `json:"taskId"` + AgentId mesos.AgentID `json:"agentId"` + ExecutorId mesos.ExecutorID `json:"executorId"` + TaskId mesos.TaskID `json:"taskId"` } type DeviceEvent interface { @@ -44,8 +44,8 @@ type DeviceEvent interface { type DeviceEventBase struct { eventBase - Type pb.DeviceEventType `json:"type"` - Origin DeviceEventOrigin `json:"origin"` + Type pb.DeviceEventType `json:"type"` + Origin DeviceEventOrigin `json:"origin"` } func (b *DeviceEventBase) GetOrigin() DeviceEventOrigin { @@ -68,16 +68,16 @@ func NewDeviceEvent(origin DeviceEventOrigin, t pb.DeviceEventType) (de DeviceEv de = &EndOfStream{ DeviceEventBase: DeviceEventBase{ eventBase: *newDeviceEventBase("DeviceEvent", nil), - Type: t, - Origin: origin, + Type: t, + Origin: origin, }, } case pb.DeviceEventType_BASIC_TASK_TERMINATED: de = &BasicTaskTerminated{ DeviceEventBase: DeviceEventBase{ eventBase: *newDeviceEventBase("DeviceEvent", nil), - Type: t, - Origin: origin, + Type: t, + Origin: origin, }, } case pb.DeviceEventType_NULL_DEVICE_EVENT: @@ -96,13 +96,13 @@ func (e *EndOfStream) GetName() string { type BasicTaskTerminated struct { DeviceEventBase - ExitCode int `json:"exitCode"` - Stdout string `json:"stdout"` - Stderr string `json:"stderr"` - VoluntaryTermination bool `json:"voluntaryTermination"` - FinalMesosState mesos.TaskState `json:"finalMesosState"` + ExitCode int `json:"exitCode"` + Stdout string `json:"stdout"` + Stderr string `json:"stderr"` + VoluntaryTermination bool `json:"voluntaryTermination"` + FinalMesosState mesos.TaskState `json:"finalMesosState"` } func (e *BasicTaskTerminated) GetName() string { return "BASIC_TASK_TERMINATED" -} \ No newline at end of file +} diff --git a/common/event/event.go b/common/event/event.go index 316dfccba..682a39239 100644 --- a/common/event/event.go +++ b/common/event/event.go @@ -24,29 +24,48 @@ package event -import "github.com/AliceO2Group/Control/common/utils" +import ( + "github.com/AliceO2Group/Control/common/utils" +) type Event interface { GetName() string GetTimestamp() string + GetLabels() map[string]string + SetLabels(map[string]string) } type eventBase struct { - Timestamp string `json:"timestamp"` - MessageType string `json:"_messageType"` + Timestamp string `json:"timestamp"` + MessageType string `json:"_messageType"` + Labels map[string]string `json:"labels,omitempty"` } func (e *eventBase) GetTimestamp() string { return e.Timestamp } +func (e *eventBase) GetLabels() map[string]string { + return e.Labels +} + +func (e *eventBase) SetLabels(labels map[string]string) { + if e.Labels == nil { + e.Labels = make(map[string]string) + } + for k, v := range labels { + e.Labels[k] = v + } +} + func newDeviceEventBase(messageType string, optionalTimestamp *string) (e *eventBase) { timestamp := utils.NewUnixTimestamp() if optionalTimestamp != nil { timestamp = *optionalTimestamp } return &eventBase{ - Timestamp: timestamp, + Timestamp: timestamp, MessageType: messageType, + Labels: map[string]string{}, } -} \ No newline at end of file +} diff --git a/common/labels.go b/common/labels.go new file mode 100644 index 000000000..1fe6763fc --- /dev/null +++ b/common/labels.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package common + +import "github.com/AliceO2Group/Control/common/utils/uid" + +type Labeler interface { + GetLabels() map[string]string +} + +func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID { + if labeler != nil && len(labeler.GetLabels()) > 0 { + envIdS, ok := labeler.GetLabels()["environmentId"] + if ok { + envId, err := uid.FromString(envIdS) + if err == nil { + return envId + } + } + } + return uid.NilID() +} From 969fa29a15424b9ed1b577c7a2fed35171602d32 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:11:24 +0200 Subject: [PATCH 1357/2352] [core] Even more environmentId in InfoLogger output --- core/environment/environment.go | 6 ++++-- core/environment/manager.go | 31 +++++++++++++++++++++++++------ core/task/scheduler.go | 15 +++++++++++++++ 3 files changed, 44 insertions(+), 8 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index d946e331f..6e8e60699 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -35,7 +35,6 @@ import ( "time" "github.com/AliceO2Group/Control/apricot" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" @@ -532,11 +531,13 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map log.WithField("taskIds", strings.Join(keys, ",")). WithField("successfulHooks", len(successfulHooks)). WithField("level", infologger.IL_Devel). + WithField("partition", env.Id().String()). Debugf("hook timeout timers still left: %d, next cycle", len(hookTimers)) } } log.WithField("level", infologger.IL_Devel). + WithField("partition", env.Id().String()). Debugf("hooks to trigger: %d, successful: %d", len(hooksToTrigger), len(successfulHooks)) if len(hooksToTrigger) == len(successfulHooks) { @@ -698,7 +699,8 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { if wfState == task.ERROR { err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { - log.WithField("partition", env.id).Warn("we could not transition gently to ERROR, thus forcing it.") + log.WithField("partition", env.id). + Warn("we could not transition gently to ERROR, thus forcing it.") env.setState(wfState.String()) } toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { diff --git a/core/environment/manager.go b/core/environment/manager.go index a69b2fbde..e6148efe7 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -31,6 +31,7 @@ import ( "strings" "sync" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -471,6 +472,8 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { return } + envId := common.GetEnvironmentIdFromLabelerType(evt) + switch evt.GetType() { case pb.DeviceEventType_BASIC_TASK_TERMINATED: if btt, ok := evt.(*event.BasicTaskTerminated); ok { @@ -481,6 +484,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { "stderr": btt.Stderr, "finalMesosState": btt.FinalMesosState.String(), "level": infologger.IL_Devel, + "partition": envId.String(), }). Debug("basic task terminated") @@ -504,15 +508,22 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { isHook = true env, err := envs.environment(t.GetEnvironmentId()) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + log.WithPrefix("scheduler"). + WithField("partition", t.GetEnvironmentId().String()). + WithError(err). + Error("cannot find environment for DeviceEvent") } env.NotifyEvent(evt) } } else { - log.WithPrefix("scheduler").Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") } } else { - log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") } // If the task hasn't already been killed @@ -528,12 +539,17 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { taskId := evt.GetOrigin().TaskId t := envs.taskman.GetTask(taskId.Value) if t == nil { - log.WithPrefix("scheduler").Debug("cannot find task for DeviceEvent END_OF_STREAM") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Debug("cannot find task for DeviceEvent END_OF_STREAM") return } env, err := envs.environment(t.GetEnvironmentId()) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot find environment for DeviceEvent") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot find environment for DeviceEvent") } if env.CurrentState() == "RUNNING" { t.SetSafeToStop(true) // we mark this specific task as ok to STOP @@ -541,7 +557,10 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if env.IsSafeToStop() { // but then we ask the env whether *all* of them are err = env.TryTransition(NewStopActivityTransition(envs.taskman)) if err != nil { - log.WithPrefix("scheduler").WithError(err).Error("cannot stop run after END_OF_STREAM event") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot stop run after END_OF_STREAM event") } } }() diff --git a/core/task/scheduler.go b/core/task/scheduler.go index dcd20a539..93597545e 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -287,13 +287,27 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { var incomingEvent struct { Type pb.DeviceEventType `json:"type"` Origin event.DeviceEventOrigin `json:"origin"` + Labels map[string]string `json:"labels"` } err = json.Unmarshal(data, &incomingEvent) if err != nil { return } + envId := uid.NilID() + if len(incomingEvent.Labels) > 0 { + envIdS, ok := incomingEvent.Labels["environmentId"] + if ok { + envId, err = uid.FromString(envIdS) + if err != nil { + envId = uid.NilID() + } + } + } + ev := event.NewDeviceEvent(incomingEvent.Origin, incomingEvent.Type) if ev != nil { + ev.SetLabels(incomingEvent.Labels) + err = json.Unmarshal(data, &ev) if err != nil { return @@ -304,6 +318,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { log.WithFields(logrus.Fields{ "type": incomingEvent.Type.String(), "originTask": incomingEvent.Origin.TaskId.Value, + "partition": envId.String(), }). Error("cannot handle incoming device event") } From eefb2da0535f678a54b45cbe383b6e29d632dfd1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:12:01 +0200 Subject: [PATCH 1358/2352] [executor] Split out actions.go from handlers file --- executor/actions.go | 104 +++++++++++++++++++++++++++++++++++++++++++ executor/handlers.go | 71 +---------------------------- 2 files changed, 105 insertions(+), 70 deletions(-) create mode 100644 executor/actions.go diff --git a/executor/actions.go b/executor/actions.go new file mode 100644 index 000000000..fb6a3d90b --- /dev/null +++ b/executor/actions.go @@ -0,0 +1,104 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executor + +import ( + "context" + "encoding/json" + + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/executor/executable" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/mesos/mesos-go/api/v1/lib/executor/calls" + "github.com/sirupsen/logrus" +) + +func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executable.SendStatusFunc { + return func(envId uid.ID, mesosState mesos.TaskState, message string) { + status := newStatus(envId, state, task.TaskID) + status.State = &mesosState + status.Message = utils.ProtoString(message) + state.statusCh <- status + } +} + +func makeSendDeviceEventFunc(state *internalState) executable.SendDeviceEventFunc { + return func(envId uid.ID, event event.DeviceEvent) { + jsonEvent, err := json.Marshal(event) + if err != nil { + log.WithError(err). + Warning("error marshaling event from task") + return + } + state.messageCh <- jsonEvent + } +} + +func makeSendMessageFunc(state *internalState) executable.SendMessageFunc { + return func(message []byte) { + // to send task events using state. + state.messageCh <- message + } +} + +func sendOutgoingMessage(state *internalState, message []byte) { + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(message))) +} + +func performStatusUpdate(state *internalState, status mesos.TaskStatus) { + if status.State == nil { + log.Warn("status with nil state received") + } else if *status.State == mesos.TASK_FAILED { // failed task updates are sent separately with less priority + state.activeTasksMu.Lock() + state.failedTasks[status.TaskID] = status + delete(state.activeTasks, status.TaskID) + state.activeTasksMu.Unlock() + } else { + switch *status.State { + case mesos.TASK_DROPPED: + fallthrough + case mesos.TASK_FINISHED: + fallthrough + case mesos.TASK_GONE: + fallthrough + case mesos.TASK_KILLED: + fallthrough + case mesos.TASK_LOST: + state.activeTasksMu.Lock() + delete(state.activeTasks, status.TaskID) + state.activeTasksMu.Unlock() + } + err := update(state, status) + if err != nil { // in case of failed update, we just print an error message + log.WithFields(logrus.Fields{ + "task": status.TaskID, + "state": status.State.String(), + }). + Warn("executor failed to send task status update") + } + } +} diff --git a/executor/handlers.go b/executor/handlers.go index d4167c334..553acdc8b 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018-2019 CERN and copyright holders of ALICE O². + * Copyright 2018-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -31,10 +31,8 @@ import ( "fmt" "time" - "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/executor/executable" "github.com/AliceO2Group/Control/executor/executorcmd" @@ -45,73 +43,6 @@ import ( "github.com/sirupsen/logrus" ) -func makeSendStatusUpdateFunc(state *internalState, task mesos.TaskInfo) executable.SendStatusFunc { - return func(envId uid.ID, mesosState mesos.TaskState, message string) { - status := newStatus(envId, state, task.TaskID) - status.State = &mesosState - status.Message = utils.ProtoString(message) - state.statusCh <- status - } -} - -func makeSendDeviceEventFunc(state *internalState) executable.SendDeviceEventFunc { - return func(envId uid.ID, event event.DeviceEvent) { - jsonEvent, err := json.Marshal(event) - if err != nil { - log.WithError(err). - Warning("error marshaling event from task") - return - } - state.messageCh <- jsonEvent - } -} - -func makeSendMessageFunc(state *internalState) executable.SendMessageFunc { - return func(message []byte) { - // to send task events using state. - state.messageCh <- message - } -} - -func handleOutgoingMessage(state *internalState, message []byte) { - _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(message))) -} - -func handleStatusUpdate(state *internalState, status mesos.TaskStatus) { - if status.State == nil { - log.Warn("status with nil state received") - } else if *status.State == mesos.TASK_FAILED { // failed task updates are sent separately with less priority - state.activeTasksMu.Lock() - state.failedTasks[status.TaskID] = status - delete(state.activeTasks, status.TaskID) - state.activeTasksMu.Unlock() - } else { - switch *status.State { - case mesos.TASK_DROPPED: - fallthrough - case mesos.TASK_FINISHED: - fallthrough - case mesos.TASK_GONE: - fallthrough - case mesos.TASK_KILLED: - fallthrough - case mesos.TASK_LOST: - state.activeTasksMu.Lock() - delete(state.activeTasks, status.TaskID) - state.activeTasksMu.Unlock() - } - err := update(state, status) - if err != nil { // in case of failed update, we just print an error message - log.WithFields(logrus.Fields{ - "task": status.TaskID, - "state": status.State.String(), - }). - Warn("executor failed to send task status update") - } - } - -} - // Handle incoming message event. This function is thread-safe with respect to state. func handleMessageEvent(state *internalState, data []byte) (err error) { var incoming struct { From a5bd2acf8e9ca828083fd6b0656b3aaa020553c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:14:26 +0200 Subject: [PATCH 1359/2352] [executor] Carry environment ID in DeviceEvents and output --- executor/eventloop.go | 4 ++-- executor/executable/basictaskcommon.go | 1 + executor/executable/controllabletask.go | 1 + executor/executorutil/executorutil.go | 10 ++++++---- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/executor/eventloop.go b/executor/eventloop.go index 65cdf0755..54f2d409d 100644 --- a/executor/eventloop.go +++ b/executor/eventloop.go @@ -77,9 +77,9 @@ func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) // Any error coming through here should immediately destroy the event loop and return // control to the Mesos subscription handling. case status := <-state.statusCh: - handleStatusUpdate(state, status) + performStatusUpdate(state, status) case message := <-state.messageCh: - handleOutgoingMessage(state, message) + sendOutgoingMessage(state, message) } } return err diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 2a038cb26..2227a3205 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -208,6 +208,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { btt.FinalMesosState = pendingState btt.Stderr = stderrBuf.String() btt.Stdout = stdoutBuf.String() + btt.SetLabels(map[string]string{"environmentId": t.knownEnvironmentId.String()}) t.sendDeviceEvent(t.knownEnvironmentId, btt) } }() diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 1372fb480..bef8d7085 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -446,6 +446,7 @@ func (t *ControllableTask) Launch() error { Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } + deviceEvent.SetLabels(map[string]string{"environmentId": t.knownEnvironmentId.String()}) t.sendDeviceEvent(t.knownEnvironmentId, deviceEvent) } diff --git a/executor/executorutil/executorutil.go b/executor/executorutil/executorutil.go index f2ee8a4f2..48648f6f0 100644 --- a/executor/executorutil/executorutil.go +++ b/executor/executorutil/executorutil.go @@ -41,10 +41,12 @@ type Labeler interface { func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID { envId := uid.NilID() var err error - if labeler.GetLabels() != nil && len(labeler.GetLabels().Labels) > 0 { - for _, label := range labeler.GetLabels().Labels { - if label.Key == "environmentId" && label.Value != nil { - envId, err = uid.FromString(*label.Value) + labels := labeler.GetLabels() + + if labels != nil && len(labels.GetLabels()) > 0 { + for _, label := range labels.GetLabels() { + if label.GetKey() == "environmentId" && label.GetValue() != "" { + envId, err = uid.FromString(label.GetValue()) if err != nil { envId = uid.NilID() } From f4ef8a45914f7b8aa4c780d8c4e65db1974c2a6c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:25:55 +0200 Subject: [PATCH 1360/2352] [core] Correct version of protobuf package --- core/integration/kafka/plugin.go | 2 +- executor/executor.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 7412908fc..9416bb772 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -39,10 +39,10 @@ import ( "github.com/AliceO2Group/Control/core/integration" kafkapb "github.com/AliceO2Group/Control/core/integration/kafka/protos" "github.com/AliceO2Group/Control/core/workflow/callable" - "github.com/golang/protobuf/proto" "github.com/segmentio/kafka-go" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "google.golang.org/protobuf/proto" ) var log = logger.New(logrus.StandardLogger(), "kafkaclient") diff --git a/executor/executor.go b/executor/executor.go index 959f8b487..c12574c13 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -45,7 +45,6 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/executor/executable" "github.com/AliceO2Group/Control/executor/executorutil" - "github.com/golang/protobuf/proto" "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" "github.com/mesos/mesos-go/api/v1/lib/encoding/codecs" @@ -57,6 +56,7 @@ import ( "github.com/mesos/mesos-go/api/v1/lib/httpcli/httpexec" "github.com/pborman/uuid" "github.com/sirupsen/logrus" + "google.golang.org/protobuf/proto" ) const ( From f7545df88c23bd821269dbbcaaf5db0cfbf57752 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 11:26:22 +0200 Subject: [PATCH 1361/2352] [build] Update all dependencies --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 54acb0ffc..33e7d343f 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect diff --git a/go.sum b/go.sum index d5c3bf405..b61d38878 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,8 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d h1:berCePbayn2xvvMmO6hwriVip7TrAPb4mmnbRZRM7Xs= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801084726-26c98c9e315d/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From d0139ccf1873b2d61e03069fe4b004f446777d14 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 12:00:50 +0200 Subject: [PATCH 1362/2352] [build] Bump Go compiler in GH build action --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 634eb5424..1244a3fcd 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-18.04] - go: [ '1.17' ] + go: [ '1.18.4' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From 48951dfc68d971b5e06d10f435a889d1583afbf1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 1 Aug 2022 12:08:41 +0200 Subject: [PATCH 1363/2352] [build] Bump to v0.48.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5f17e0f39..cede5ffe3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 47 +VERSION_MINOR := 48 VERSION_PATCH := 0 From d383e703ccedc9079848ee0cd388467ea381d04a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 Aug 2022 09:12:51 +0200 Subject: [PATCH 1364/2352] Revert "[core] Do not loop forever on DCS global stream bad response" This reverts commit 43a66dbf4e8481381d6847a0f5b0decdc047223e. --- core/integration/dcs/plugin.go | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index cae4ee798..c09db653e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -46,9 +46,7 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" - "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/status" ) const ( @@ -144,16 +142,7 @@ func (p *Plugin) Init(instanceId string) error { break } if err != nil { - if st, ok := status.FromError(err); ok { - if st.Code() != codes.OK { - log.WithError(err). - WithField("code", st.Code().String()). - Error("bad event from DCS service, disconnecting; fix DCS issue then restart ECS core") - break - } - } else { - log.WithError(err).Error("bad event from DCS service") - } + log.WithError(err).Error("bad event from DCS service") } log.WithField("event", ev.String()).Debug("received DCS event") } From 804e8fd018764b17d71995ed4a519af8ba147784 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 Aug 2022 09:17:56 +0200 Subject: [PATCH 1365/2352] [build] Bump to v0.48.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cede5ffe3..294a9830e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 48 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 825b9382870b7d7b6831ea9e4b43e099c640bd25 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 Aug 2022 14:34:02 +0200 Subject: [PATCH 1366/2352] [core] Do not check for gRPC client connection before plugin calls --- core/integration/dcs/plugin.go | 69 +++++++-------- core/integration/ddsched/plugin.go | 89 ++++++++++---------- core/integration/trg/plugin.go | 129 ++++++++++++++--------------- 3 files changed, 143 insertions(+), 144 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c09db653e..d1f660bf7 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -46,7 +46,6 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" ) const ( @@ -130,7 +129,9 @@ func (p *Plugin) Init(instanceId string) error { return fmt.Errorf("failed to connect to DCS service on %s", viper.GetString("dcsServiceEndpoint")) } - in := &dcspb.SubscriptionRequest{InstanceId: instanceId} + in := &dcspb.SubscriptionRequest{ + InstanceId: instanceId, + } evStream, err := p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) if err != nil { return fmt.Errorf("failed to subscribe to DCS client on %s", viper.GetString("dcsServiceEndpoint")) @@ -338,22 +339,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.dcsClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("DCS error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.dcsClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "StartOfRun"). + // Error("DCS error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var stream dcspb.Configurator_StartOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) @@ -635,22 +636,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.dcsClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). - Error("DCS error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.dcsClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "EndOfRun"). + // Error("DCS error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var stream dcspb.Configurator_EndOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index c162ac495..90e176cfa 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -44,7 +44,6 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" ) const ( @@ -257,20 +256,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.ddSchedClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("DD scheduler client connection not available, PartitionInitialize impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "PartitionInitialize"). - Error("DDsched error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.ddSchedClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("DD scheduler client connection not available, PartitionInitialize impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("partition", envId). + // WithField("call", "PartitionInitialize"). + // Error("DDsched error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var ( response *ddpb.PartitionResponse @@ -394,21 +393,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.ddSchedClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("DD scheduler client connection not available, PartitionTerminate impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("call", "PartitionTerminate"). - Error("DDsched error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.ddSchedClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("DD scheduler client connection not available, PartitionTerminate impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("partition", envId). + // WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + // WithField("call", "PartitionTerminate"). + // Error("DDsched error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var ( response *ddpb.PartitionResponse @@ -526,21 +525,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.ddSchedClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("DD scheduler client connection not available, EnsureTermination impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - WithField("call", "EnsureTermination"). - Error("DDsched error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.ddSchedClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("DD scheduler client connection not available, EnsureTermination impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("partition", envId). + // WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + // WithField("call", "EnsureTermination"). + // Error("DDsched error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var ( response *ddpb.PartitionResponse diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index f6e9d0535..ac85d717c 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -45,7 +45,6 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" - "google.golang.org/grpc/connectivity" ) const ( @@ -410,22 +409,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.trgClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("TRG client connection not available, RunLoad impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "RunLoad"). - Error("TRG error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.trgClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("TRG client connection not available, RunLoad impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("trgServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "RunLoad"). + // Error("TRG error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var response *trgpb.RunReply response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) @@ -546,22 +545,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.trgClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("TRG client connection not available, RunStart impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "RunStart"). - Error("TRG error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.trgClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("TRG client connection not available, RunStart impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("trgServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "RunStart"). + // Error("TRG error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var response *trgpb.RunReply @@ -658,22 +657,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.trgClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("TRG client connection not available, RunStop impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "RunStop"). - Error("TRG error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.trgClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("TRG client connection not available, RunStop impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("trgServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "RunStop"). + // Error("TRG error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var response *trgpb.RunReply response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) @@ -773,22 +772,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - if p.trgClient.GetConnState() != connectivity.Ready { - err = fmt.Errorf("TRG client connection not available, RunUnload impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "RunUnload"). - Error("TRG error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } + //if p.trgClient.GetConnState() != connectivity.Ready { + // err = fmt.Errorf("TRG client connection not available, RunUnload impossible") + // + // log.WithError(err). + // WithField("level", infologger.IL_Support). + // WithField("endpoint", viper.GetString("trgServiceEndpoint")). + // WithField("runNumber", runNumber64). + // WithField("partition", envId). + // WithField("call", "RunUnload"). + // Error("TRG error") + // + // call.VarStack["__call_error_reason"] = err.Error() + // call.VarStack["__call_error"] = callFailedStr + // + // return + //} var response *trgpb.RunReply response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) From 833a1c3efbc9db6be4d9de884edba855e67ce228 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 5 Aug 2022 17:11:26 +0200 Subject: [PATCH 1367/2352] [OCTRL-690] O2 End Time timestamp is correctly set in case of early run failure. --- core/environment/environment.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 6e8e60699..416cf147e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -188,6 +188,9 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { // once we make a smooth transition to "leave_RUNNING" in ControlWorkflows, this could be deleted. runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else if e.Event == "GO_ERROR" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { From 2512df48bbd76fa9395805ac662cb21a44d04bb4 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 5 Aug 2022 17:34:31 +0200 Subject: [PATCH 1368/2352] [OCTRL-690] O2 End time timestamp is only set once per run. --- core/environment/environment.go | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 416cf147e..510b561c8 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -186,11 +186,23 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } } else if e.Event == "STOP_ACTIVITY" { // once we make a smooth transition to "leave_RUNNING" in ControlWorkflows, this could be deleted. - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + if ok && endTime == "" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else { + log.WithField("partition", envId.String()). + Debug("O2 End time already set before before_STOP_ACTIVITY") + } } else if e.Event == "GO_ERROR" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + if ok && endTime == "" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else { + log.WithField("partition", envId.String()). + Debug("O2 End time already set before before_GO_ERROR") + } } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { @@ -200,8 +212,14 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { "leave_state": func(e *fsm.Event) { // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. if e.Src == "RUNNING" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + if ok && endTime == "" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else { + log.WithField("partition", envId.String()). + Debug("O2 End time already set before leave_RUNNING") + } } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) if errHooks != nil { From 670965ed3b1dfd1f91a624b07bd2b98e7749825f Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 8 Aug 2022 12:18:28 +0200 Subject: [PATCH 1369/2352] [core] O2 End and TRG End timestamps can be set as late as DESTROY if the info was not available before. --- core/integration/bookkeeping/plugin.go | 30 ++++++++++++++++---------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index fe0879121..328db22ef 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -48,6 +48,8 @@ type Plugin struct { bookkeepingClient *BookkeepingWrapper pendingRunStops map[string] /*envId*/ int64 + pendingO2Stops map[string] /*envId*/ string + pendingTrgStops map[string] /*envId*/ string } func NewPlugin(endpoint string) integration.Plugin { @@ -66,6 +68,8 @@ func NewPlugin(endpoint string) integration.Plugin { bookkeepingPort: portNumber, bookkeepingClient: nil, pendingRunStops: make(map[string]int64), + pendingO2Stops: make(map[string]string), + pendingTrgStops: make(map[string]string), } } @@ -260,6 +264,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { p.pendingRunStops[envId] = runNumber64 + p.pendingO2Stops[envId] = "" + p.pendingTrgStops[envId] = "" log.WithField("runNumber", runNumber). WithField("partition", envId). Debug("CreateRun call successful") @@ -345,15 +351,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire PDP topology description library file") } tfbMode := env.GetKV("", "tfb_dd_mode") - /* - odcTopologyFull, ok := env.Workflow().GetVars().Get("odc_topology_fullname") - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire ODC topology fullname") - } - */ lhcPeriod := env.GetKV("", "lhc_period") err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod) if err != nil { @@ -369,8 +366,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { var updatedRun string if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { - updatedRun = "STOPPED" - delete(p.pendingRunStops, envId) + if p.pendingO2Stops[envId] == "" || (trgEnabled && p.pendingTrgStops[envId] == "") { + updatedRun = "INCOMPLETE" + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + Debug("UpdateRun call: run information incomplete") + } else { + updatedRun = "STOPPED" + delete(p.pendingRunStops, envId) + delete(p.pendingO2Stops, envId) + delete(p.pendingTrgStops, envId) + } } else { updatedRun = "STARTED" } @@ -457,9 +463,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { O2StartTime := varStack["run_start_time_ms"] O2EndTime := varStack["run_end_time_ms"] + p.pendingO2Stops[envId] = O2EndTime TrgStartTime := varStack["trg_start_time_ms"] TrgEndTime := varStack["trg_end_time_ms"] + p.pendingTrgStops[envId] = TrgEndTime if _, ok := p.pendingRunStops[envId]; ok { return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) From 71db408366efe2cf7f5c8e1200509248d87a24bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Aug 2022 11:04:48 +0200 Subject: [PATCH 1370/2352] [build] Bump to v0.48.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 294a9830e..302de5483 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 48 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 886c99a9e6bff5fbb8c064fce84a4a7eadc8899b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Aug 2022 11:18:11 +0200 Subject: [PATCH 1371/2352] [core] Use connectivity.Shutdown for plugin client connection check --- core/integration/dcs/plugin.go | 65 ++++++++------- core/integration/ddsched/plugin.go | 89 ++++++++++---------- core/integration/trg/plugin.go | 129 +++++++++++++++-------------- 3 files changed, 143 insertions(+), 140 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index d1f660bf7..7cda957d7 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -46,6 +46,7 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" ) const ( @@ -339,22 +340,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.dcsClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "StartOfRun"). - // Error("DCS error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.dcsClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var stream dcspb.Configurator_StartOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) @@ -636,22 +637,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.dcsClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "EndOfRun"). - // Error("DCS error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.dcsClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var stream dcspb.Configurator_EndOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 90e176cfa..56f105897 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -44,6 +44,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" ) const ( @@ -256,20 +257,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.ddSchedClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("DD scheduler client connection not available, PartitionInitialize impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("partition", envId). - // WithField("call", "PartitionInitialize"). - // Error("DDsched error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.ddSchedClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DD scheduler client connection not available, PartitionInitialize impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var ( response *ddpb.PartitionResponse @@ -393,21 +394,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.ddSchedClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("DD scheduler client connection not available, PartitionTerminate impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("partition", envId). - // WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - // WithField("call", "PartitionTerminate"). - // Error("DDsched error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.ddSchedClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DD scheduler client connection not available, PartitionTerminate impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("call", "PartitionTerminate"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var ( response *ddpb.PartitionResponse @@ -525,21 +526,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.ddSchedClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("DD scheduler client connection not available, EnsureTermination impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("partition", envId). - // WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). - // WithField("call", "EnsureTermination"). - // Error("DDsched error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.ddSchedClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DD scheduler client connection not available, EnsureTermination impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). + WithField("call", "EnsureTermination"). + Error("DDsched error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var ( response *ddpb.PartitionResponse diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index ac85d717c..e2f9f1b5f 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -45,6 +45,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/connectivity" ) const ( @@ -409,22 +410,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.trgClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("TRG client connection not available, RunLoad impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("trgServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "RunLoad"). - // Error("TRG error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.trgClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("TRG client connection not available, RunLoad impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunLoad"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var response *trgpb.RunReply response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) @@ -545,22 +546,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.trgClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("TRG client connection not available, RunStart impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("trgServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "RunStart"). - // Error("TRG error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.trgClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("TRG client connection not available, RunStart impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunStart"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var response *trgpb.RunReply @@ -657,22 +658,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.trgClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("TRG client connection not available, RunStop impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("trgServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "RunStop"). - // Error("TRG error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.trgClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("TRG client connection not available, RunStop impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunStop"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var response *trgpb.RunReply response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) @@ -772,22 +773,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - //if p.trgClient.GetConnState() != connectivity.Ready { - // err = fmt.Errorf("TRG client connection not available, RunUnload impossible") - // - // log.WithError(err). - // WithField("level", infologger.IL_Support). - // WithField("endpoint", viper.GetString("trgServiceEndpoint")). - // WithField("runNumber", runNumber64). - // WithField("partition", envId). - // WithField("call", "RunUnload"). - // Error("TRG error") - // - // call.VarStack["__call_error_reason"] = err.Error() - // call.VarStack["__call_error"] = callFailedStr - // - // return - //} + if p.trgClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("TRG client connection not available, RunUnload impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunUnload"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } var response *trgpb.RunReply response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) From ebe6e9cbd924dea8cb2db46fd2ee38fd745f1aac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Aug 2022 11:32:51 +0200 Subject: [PATCH 1372/2352] [core] Improved output for "no resource demands for descriptor" issue --- core/task/match.go | 21 +++++++++++++++++---- core/task/scheduler.go | 13 ++++++++----- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/core/task/match.go b/core/task/match.go index b83484c23..bff2c9dfe 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -25,6 +25,9 @@ package task import ( + "fmt" + + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/AliceO2Group/Control/core/task/taskclass/port" @@ -40,26 +43,36 @@ type Wants struct { } // GetWantsForDescriptor matches between taskclass and taskmanager's classes -func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor) (r *Wants) { +func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor, envId uid.ID) (r *Wants, err error) { taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) if ok && taskClass != nil { r = &Wants{} wants := taskClass.Wants if wants.Cpu != nil { r.Cpu = *wants.Cpu + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Warnf("missing CPU resource requirement for requested task class %s", descriptor.TaskClassName) } if wants.Memory != nil { r.Memory = *wants.Memory + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Warnf("missing memory resource requirement for requested task class %s", descriptor.TaskClassName) } if wants.Ports != nil { r.StaticPorts = make(port.Ranges, len(wants.Ports)) copy(r.StaticPorts, wants.Ports) + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Warnf("missing ports resource requirement for requested task class %s", descriptor.TaskClassName) } r.InboundChannels = channel.MergeInbound(descriptor.RoleBind, taskClass.Bind) } else { - log.WithField("taskClass", descriptor.TaskClassName). - WithField("constraints", descriptor.RoleConstraints.String()). - Warnf("task class not found for descriptor") + err = fmt.Errorf("attempted to get wants for descriptor but task class %s not found in manager", descriptor.TaskClassName) } return } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 93597545e..ce08cc803 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -575,14 +575,17 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("partition", envId.String()). Debug("offer attributes satisfy constraints") - wants := state.taskman.GetWantsForDescriptor(descriptor) - if wants == nil { + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + if err != nil { log.WithPrefix("scheduler"). + WithError(err). WithField("partition", envId.String()). WithFields(logrus.Fields{ - "class": descriptor.TaskClassName, - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, }). Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") continue From f81c9f7925f7dfad3dade34b43c58addd5a49918 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Aug 2022 16:37:24 +0200 Subject: [PATCH 1373/2352] [OCTRL-683] Allow the OCClib-controlled tasks to exit on their own Two problems are solved here: - OccServer::EventStream thread would not exit when reaching down, thus making OCClib-controlled tasks never shut their server down - executor would send SIGTERM as soon as a task reported reaching DONE, thus not allowing it to exit on its own. --- core/integration/kafka/protos/kafka.proto | 2 +- executor/executable/controllabletask.go | 16 +++++++++++----- occ/occlib/OccServer.cxx | 2 +- occ/plugin/OccLiteServer.cxx | 2 +- 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/core/integration/kafka/protos/kafka.proto b/core/integration/kafka/protos/kafka.proto index 2d839f0a9..f2729f14a 100644 --- a/core/integration/kafka/protos/kafka.proto +++ b/core/integration/kafka/protos/kafka.proto @@ -19,4 +19,4 @@ message EnvInfo { string state = 4; repeated string detectors = 5; uint64 enterStateTimestamp = 6; // ms since epoch. -} +} \ No newline at end of file diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index bef8d7085..9a0baf5e4 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -49,6 +49,7 @@ import ( ) const ( + DONE_TIMEOUT = 1 * time.Second SIGTERM_TIMEOUT = 1 * time.Second SIGINT_TIMEOUT = 3 * time.Second KILL_TRANSITION_TIMEOUT = 1 * time.Second @@ -417,13 +418,13 @@ func (t *ControllableTask) Launch() error { } for { if t.rpc == nil { - log.WithField("partition", t.knownEnvironmentId.String()). + log.WithField("partition", t.knownEnvironmentId.String()).WithField("taskId", deo.TaskId.String()). WithError(err).Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { - log.WithField("partition", t.knownEnvironmentId.String()). + log.WithField("partition", t.knownEnvironmentId.String()).WithField("taskId", deo.TaskId.String()). WithError(err).Debug("event stream EOF") break } @@ -432,7 +433,7 @@ func (t *ControllableTask) Launch() error { WithField("partition", t.knownEnvironmentId.String()). WithField("errorType", reflect.TypeOf(err)). WithField("level", infologger.IL_Devel). - Warning("error receiving event from task") + Warningf("error receiving event from task %s", deo.TaskId.String()) if status.Code(err) == codes.Unavailable { break } @@ -690,15 +691,20 @@ func (t *ControllableTask) Kill() error { if reachedState == "DONE" { log.WithField("partition", t.knownEnvironmentId.String()). WithField("taskId", t.ti.TaskID.Value). - Debug("task exited correctly") + Debug("task reached DONE, will try to terminate it gently") t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED } else { // something went wrong log.WithField("partition", t.knownEnvironmentId.String()). WithField("taskId", t.ti.TaskID.Value). - Debug("task killed") + Debug("task already died or will be killed soon") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } + if reachedState == "DONE" { + log.WithField("taskId", t.ti.GetTaskID()).Debugf("waiting %.1fs before sending SIGTERM to task", DONE_TIMEOUT.Seconds()) + time.Sleep(DONE_TIMEOUT) + } + return t.doTermIntKill(pid) } diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index a179f082e..a30169d76 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -75,7 +75,7 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, }); bool isStreamOpen = true; - while (!m_destroying && isStreamOpen) { + while (!m_destroying && isStreamOpen && m_rco->getState() != t_State::done) { pb::DeviceEvent *newEvent; bool ok = eventQueue.pop(newEvent); if (!ok) { // queue empty, sleep and retry diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 5f14fc3ac..304416e1c 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -106,7 +106,7 @@ ::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, auto nopbResponse = std::get<0>(transitionOutcome); *response = nopbResponse; - OLOG(info) << "Transition response: " << response->state << "ok: " << response->ok; + OLOG(info) << "Transition response: " << response->state << " ok: " << response->ok; return grpc::Status::OK; } From 19073edd9234fff8712534cdb139052b0bfb1856 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Aug 2022 17:56:45 +0200 Subject: [PATCH 1374/2352] formatting fix --- executor/executable/controllabletask.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 9a0baf5e4..fc539860b 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -418,13 +418,15 @@ func (t *ControllableTask) Launch() error { } for { if t.rpc == nil { - log.WithField("partition", t.knownEnvironmentId.String()).WithField("taskId", deo.TaskId.String()). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("taskId", deo.TaskId.String()). WithError(err).Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { - log.WithField("partition", t.knownEnvironmentId.String()).WithField("taskId", deo.TaskId.String()). + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("taskId", deo.TaskId.String()). WithError(err).Debug("event stream EOF") break } From 9f55f6384b5e8c79f369c2437505e240ec51d568 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Aug 2022 11:27:07 +0200 Subject: [PATCH 1375/2352] [common] .gitignore update --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b1dec01c8..3c8beedac 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ tools bin wf-unprocessed* wf-processed* +*.*.old \ No newline at end of file From 9910b0cb9427cba0aa787b9c1a5fd29466321de4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 11 Aug 2022 11:30:42 +0200 Subject: [PATCH 1376/2352] [core] Warn before deployment if there are claimable or orphan tasks --- core/task/manager.go | 40 ++++++++++++++++++++++++++++++++++++++++ core/task/roster.go | 15 +++++++++++---- core/task/tasks.go | 23 ++++++++++++++++++++++- 3 files changed, 73 insertions(+), 5 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 8e6f07472..6d62fb7b7 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -312,6 +312,46 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e 4) start the tasks in tasksToRun 5) ensure that all of them reach a CONFIGURED state */ + claimableTasks := m.roster.filtered(func(task *Task) bool { + return task.IsClaimable() + }) + orphanTasks := m.roster.filtered(func(task *Task) bool { + return !task.IsLocked() && !task.IsClaimable() + }) + claimableTasksByHostname := claimableTasks.Grouped(func(task *Task) string { + return task.hostname + }) + orphanTasksByHostname := orphanTasks.Grouped(func(task *Task) string { + return task.hostname + }) + log.WithField("partition", envId.String()). + Info("beginning of task acquisition and deployment for environment") + + for hostname, tasks := range claimableTasksByHostname { + shortClassNames := make([]string, len(tasks)) + for i, t := range tasks { + if tc := t.GetTaskClass(); tc != nil { + shortClassNames[i] = tc.Identifier.Name + } else { + shortClassNames[i] = "unknown" + } + } + log.WithField("partition", envId.String()). + Infof("host %s has %d claimable tasks [%s]", hostname, len(tasks), strings.Join(shortClassNames, ", ")) + } + + for hostname, tasks := range orphanTasksByHostname { + shortClassNames := make([]string, len(tasks)) + for i, t := range tasks { + if tc := t.GetTaskClass(); tc != nil { + shortClassNames[i] = tc.Identifier.Name + } else { + shortClassNames[i] = "unknown" + } + } + log.WithField("partition", envId.String()). + Warnf("host %s has %d orphan tasks (cleanup needed) [%s]", hostname, len(tasks), strings.Join(shortClassNames, ", ")) + } tasksToRun := make(Descriptors, 0) // TODO: also filter for tasks that satisfy attributes but are of wrong class, diff --git a/core/task/roster.go b/core/task/roster.go index 301dee222..34f31592b 100644 --- a/core/task/roster.go +++ b/core/task/roster.go @@ -32,9 +32,9 @@ import ( ) type roster struct { - mu sync.RWMutex + mu sync.RWMutex tasks Tasks -} +} func (m *roster) getTaskIds() []string { m.mu.RLock() @@ -71,6 +71,13 @@ func (m *roster) filtered(filter Filter) (tasks Tasks) { return m.tasks.Filtered(filter) } +func (m *roster) grouped(grouping Grouping) (tasksMap map[string]Tasks) { + m.mu.RLock() + defer m.mu.RUnlock() + + return m.tasks.Grouped(grouping) +} + func (m *roster) getMesosCommandTargets() (receivers []controlcommands.MesosCommandTarget, err error) { m.mu.RLock() defer m.mu.RUnlock() @@ -92,7 +99,7 @@ func (m *roster) getTasks() Tasks { return m.tasks } -func(m *roster) updateTasks(tasks Tasks) { +func (m *roster) updateTasks(tasks Tasks) { m.mu.Lock() defer m.mu.Unlock() @@ -111,4 +118,4 @@ func newRoster() *roster { tasks: make(Tasks, 0), } return roster -} \ No newline at end of file +} diff --git a/core/task/tasks.go b/core/task/tasks.go index f7d821853..14c6bb57a 100644 --- a/core/task/tasks.go +++ b/core/task/tasks.go @@ -35,10 +35,17 @@ type Tasks []*Task type DeploymentMap map[*Task]*Descriptor type Filter func(*Task) bool + var Filter_NIL Filter = func(*Task) bool { return true } +type Grouping func(*Task) string + +var Grouping_NIL Grouping = func(*Task) string { + return "all" +} + // FIXME: make this structure thread-safe to fully replace big state lock in server.go func (m Tasks) GetTaskIds() []string { @@ -93,6 +100,20 @@ func (m Tasks) Filtered(filter Filter) (tasks Tasks) { return tasks } +func (m Tasks) Grouped(grouping Grouping) (tasksMap map[string]Tasks) { + if m == nil { + return + } + tasksMap = make(map[string]Tasks) + for _, task := range m { + if _, ok := tasksMap[grouping(task)]; !ok { + tasksMap[grouping(task)] = make(Tasks, 0) + } + tasksMap[grouping(task)] = append(tasksMap[grouping(task)], task) + } + return tasksMap +} + func (m Tasks) GetMesosCommandTargets() (receivers []controlcommands.MesosCommandTarget, err error) { receivers = make([]controlcommands.MesosCommandTarget, 0) for _, task := range m { @@ -117,4 +138,4 @@ func (m Tasks) BuildPropertyMaps(bindMap channel.BindMap) (propMapMap controlcom propMapMap[receiver] = taskPropMap } return -} \ No newline at end of file +} From 059b56acf2c2e96ce72b35497c83a8c7f21ec1bd Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Aug 2022 14:07:04 +0200 Subject: [PATCH 1377/2352] [OCTRL-691][core] add a before_activity_start topic in kafka --- core/integration/kafka/plugin.go | 51 ++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 9416bb772..428ec47ff 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -104,6 +104,16 @@ func (p *Plugin) ActiveRunsListTopic() string { return "aliecs.env_list.RUNNING" } +func (p *Plugin) StartActivityTopic(trigger string) string { + if strings.Contains(trigger, "before_START_ACTIVITY") { + return "aliecs.before_start_activity" + } else if strings.Contains(trigger, "after_START_ACTIVITY") { + return "aliecs.after_start_activity" + } else { + return "aliecs.start_activity" + } +} + func (p *Plugin) LoggerCallback(msg string, a ...interface{}) { log.Infof(msg, a...) } @@ -165,8 +175,10 @@ func (p *Plugin) extractStateFromTrigger(trigger string) string { return strings.TrimPrefix(trigger, "enter_") } else if strings.Contains(trigger, "leave_") { return strings.TrimPrefix(trigger, "leave_") - } else if trigger == "after_START_ACTIVITY" || trigger == "before_STOP_ACTIVITY" { + } else if strings.Contains(trigger, "after_START_ACTIVITY") || strings.Contains(trigger, "before_STOP_ACTIVITY") { return "RUNNING" + } else if strings.Contains(trigger, "before_START_ACTIVITY") || strings.Contains(trigger, "after_STOP_ACTIVITY") { + return "CONFIGURED" } else { return "UNKNOWN" } @@ -189,7 +201,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf var runNumberOpt *uint32 = nil var runTypeOpt *string = nil - if state == "RUNNING" { + if state == "RUNNING" || strings.Contains(trigger, "START_ACTIVITY") { // the following fields are relevant only in RUNNING state runNumberStr, ok := varStack["run_number"] if ok { @@ -349,6 +361,40 @@ func (p *Plugin) createLeaveStateCallback(varStack map[string]string, call strin } } +func (p *Plugin) createActivityStartCallback(varStack map[string]string, call string) func() string { + return func() (out string) { + // Retrieve and update the env info + timestamp := uint64(time.Now().UnixMilli()) + envInfo := p.newEnvStateObject(varStack, call) + + // Prepare and send new state notification + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Debug("Notifying Kafka about activity start " + envInfo.State) + stateNotification := &kafkapb.NewStateNotification{ + EnvInfo: envInfo, + Timestamp: timestamp, + } + nsnData, err := proto.Marshal(stateNotification) + if err != nil { + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Error("could not marshall a state notification: ", err) + } + + trigger, ok := varStack["__call_trigger"] + if !ok { + log.WithField("call", call). + WithField("partition", envInfo.EnvironmentId). + Error("cannot acquire trigger from varStack") + return "" + } + p.produceMessage(nsnData, p.StartActivityTopic(trigger), envInfo.EnvironmentId, call) + + return + } +} + func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, ok := data.(*callable.Call) if !ok { @@ -361,6 +407,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["PublishUpdate"] = p.createNewStateCallback(varStack, "PublishUpdate") stack["PublishEnterStateUpdate"] = p.createNewStateCallback(varStack, "PublishEnterStateUpdate") stack["PublishLeaveStateUpdate"] = p.createLeaveStateCallback(varStack, "PublishLeaveStateUpdate") + stack["PublishStartActivityUpdate"] = p.createActivityStartCallback(varStack, "PublishStartActivityUpdate") return } From bcc1c9f7ed0a17f2e551190eb4cd1aeb6f04e3d1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Aug 2022 13:51:48 +0200 Subject: [PATCH 1378/2352] [core] Kafka: Remove the deprecated PublishUpdate callback It is replaced by a more precise name 'PublishEnterStateUpdate'. The old one is not used in ControlWorkflows for a few months. --- core/integration/kafka/plugin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 428ec47ff..abb808a68 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -404,7 +404,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) // The first two are actually equal. We create both to allow to migrate to a more accurate name. - stack["PublishUpdate"] = p.createNewStateCallback(varStack, "PublishUpdate") stack["PublishEnterStateUpdate"] = p.createNewStateCallback(varStack, "PublishEnterStateUpdate") stack["PublishLeaveStateUpdate"] = p.createLeaveStateCallback(varStack, "PublishLeaveStateUpdate") stack["PublishStartActivityUpdate"] = p.createActivityStartCallback(varStack, "PublishStartActivityUpdate") From d7d3fb0083d49cb1567ff5b9905214e4d06ff59f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 Aug 2022 08:49:32 +0200 Subject: [PATCH 1379/2352] [core] Output detector field to InfoLogger --- common/labels.go | 10 +++ core/controlcommands/mesoscommand.go | 10 +++ core/environment/environment.go | 3 +- core/environment/transition_deploy.go | 11 +++ core/task/manager.go | 72 ++++++++++++++++-- core/task/scheduler.go | 105 +++++++++++++++++++++----- core/task/task.go | 15 ++++ 7 files changed, 202 insertions(+), 24 deletions(-) diff --git a/common/labels.go b/common/labels.go index 1fe6763fc..0a1381c18 100644 --- a/common/labels.go +++ b/common/labels.go @@ -42,3 +42,13 @@ func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID { } return uid.NilID() } + +func GetValueFromLabelerType(labeler Labeler, key string) string { + if labeler != nil && len(labeler.GetLabels()) > 0 { + valueStr, ok := labeler.GetLabels()[key] + if ok { + return valueStr + } + } + return "" +} diff --git a/core/controlcommands/mesoscommand.go b/core/controlcommands/mesoscommand.go index b7c1fea82..baaf23700 100644 --- a/core/controlcommands/mesoscommand.go +++ b/core/controlcommands/mesoscommand.go @@ -25,6 +25,7 @@ package controlcommands import ( + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/mesos/mesos-go/api/v1/lib" "github.com/rs/xid" @@ -37,6 +38,7 @@ const ( ) type MesosCommand interface { + common.Labeler GetName() string GetId() xid.ID GetEnvironmentId() uid.ID @@ -64,6 +66,7 @@ type MesosCommandBase struct { ResponseTimeout time.Duration `json:"timeout"` Arguments PropertyMap `json:"arguments"` TargetList []MesosCommandTarget `json:"targetList"` + Labels map[string]string `json:"labels"` argMap PropertyMapsMap `json:"-"` } @@ -106,6 +109,13 @@ func (m *MesosCommandBase) IsMultiCmd() bool { return false } +func (m *MesosCommandBase) GetLabels() map[string]string { + if m != nil { + return m.Labels + } + return map[string]string{} +} + func (m *MesosCommandBase) MakeSingleTarget(receiver MesosCommandTarget) (cmd MesosCommand) { if m == nil { return diff --git a/core/environment/environment.go b/core/environment/environment.go index 510b561c8..e463fc230 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -171,7 +171,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) // number of times the START transition has run for this env - configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults())) + configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()). + WrappedAndFlattened(gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults())) if err == nil { lhcPeriod, ok := configStack["lhc_period"] if ok { diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index e317b0233..8b199b959 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -225,11 +225,16 @@ func (t DeployTransition) do(env *Environment) (err error) { inactiveTaskRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { if roleStatus := role.GetStatus(); roleStatus != task.ACTIVE { + detector, ok := role.GetUserVars().Get("detector") + if !ok { + detector = "" + } log.WithField("state", role.GetState().String()). WithField("status", roleStatus.String()). WithField("role", role.GetPath()). WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). + WithField("detector", detector). Error("role failed to deploy within timeout") inactiveTaskRoles = append(inactiveTaskRoles, role.GetPath()) } @@ -249,9 +254,15 @@ func (t DeployTransition) do(env *Environment) (err error) { failedRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { if st := role.GetState(); st == task.ERROR { + detector, ok := role.GetUserVars().Get("detector") + if !ok { + detector = "" + } + log.WithField("state", st). WithField("role", role.GetPath()). WithField("partition", env.Id().String()). + WithField("detector", detector). Error("environment reached invalid state") failedRoles = append(failedRoles, role.GetPath()) } diff --git a/core/task/manager.go b/core/task/manager.go index 6d62fb7b7..72a7fe4e9 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -32,6 +32,7 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -41,6 +42,7 @@ import ( "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/executor/executorutil" "github.com/mesos/mesos-go/api/v1/lib/extras/store" "gopkg.in/yaml.v3" @@ -401,7 +403,17 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } else { // task not claimed yet, we do so now tasksAlreadyRunning[taskPtr] = descriptor claimed = true + detector := "" + parent := taskPtr.GetParent() + if parent != nil { + detector, ok = parent.GetUserVars().Get("detector") + if !ok { + detector = "" + } + } + log.WithField("partition", envId.String()). + WithField("detector", detector). WithField("class", descriptor.TaskClassName). WithField("task", taskPtr.className). WithField("taskHost", taskPtr.hostname). @@ -609,7 +621,9 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { if err != nil { return err } - log.WithField("map", pp.Sprint(args)).Debug("pushing configuration to tasks") + log.WithField("map", pp.Sprint(args)). + WithField("partition", envId.String()). + Debug("pushing configuration to tasks") cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, event, dest, args) _ = m.cq.Enqueue(cmd, notify) @@ -792,6 +806,23 @@ func (m *Manager) updateTaskState(taskId string, state string) { } func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { + aid := status.GetAgentID() + host := "" + detector := "" + var err error + + if aid != nil { + aci := m.AgentCache.Get(*aid) + if aci != nil { + host = aci.Hostname + detector, err = apricot.Instance().GetDetectorForHost(host) + if err != nil { + detector = "" + } + } + } + + envId := executorutil.GetEnvironmentIdFromLabelerType(status) taskId := status.GetTaskID().Value taskPtr := m.roster.getByTaskId(taskId) @@ -804,6 +835,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { WithField("level", infologger.IL_Devel). WithField("status", status.GetState().String()). WithField("reason", status.GetReason().String()). + WithField("detector", detector). + WithField("partition", envId.String()). Warn("attempted status update of task not in roster") } if ack, ok := m.ackKilledTasks.getValue(taskId); ok { @@ -830,6 +863,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { WithField("level", infologger.IL_Devel). WithField("cmd", cmdStr). WithField("controlmode", controlMode). + WithField("detector", detector). + WithField("partition", envId.String()). Debug("task active (received TASK_RUNNING event from executor)") taskPtr.status = ACTIVE if taskPtr.GetParent() != nil { @@ -919,7 +954,9 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err for _, task := range tasks.Filtered(func(task *Task) bool { return task.status == ACTIVE }) { e := m.doKillTask(task) if e != nil { - log.WithError(e).WithField("taskId", task.taskId).Error("could not kill task") + log.WithError(e). + WithField("taskId", task.taskId). + Error("could not kill task") err = errors.New("could not kill some tasks") // task should be added back to the roster m.roster.append(task) @@ -970,7 +1007,10 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { go func() { err := m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) if err != nil { - log.WithError(err).WithField("level", infologger.IL_Devel).Errorf("acquireTasks failed") + log.WithError(err). + WithField("level", infologger.IL_Devel). + WithField("partition", tm.GetEnvironmentId().String()). + Errorf("acquireTasks failed") } }() case taskop.ConfigureTasks: @@ -999,6 +1039,7 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { "message": mesosStatus.GetMessage(), "level": infologger.IL_Devel, }). + WithField("partition", tm.GetEnvironmentId().String()). Info("task inactive exception") taskIDValue := mesosStatus.GetTaskID().Value t := m.GetTask(taskIDValue) @@ -1034,10 +1075,29 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { // This function should only be called from the SIGINT/SIGTERM handler func (m *Manager) EmergencyKillTasks(tasks Tasks) { for _, t := range tasks { - killCall := calls.Kill(t.GetTaskId(), t.GetAgentId()) - err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + aidStr := t.GetAgentId() + killCall := calls.Kill(t.GetTaskId(), aidStr) + detector := "" + var err error + + if len(aidStr) > 0 { + aid := &mesos.AgentID{Value: aidStr} + aci := m.AgentCache.Get(*aid) + if aci != nil { + host := aci.Hostname + detector, err = apricot.Instance().GetDetectorForHost(host) + if err != nil { + detector = "" + } + } + } + + err = calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) if err != nil { - log.WithPrefix("termination").WithError(err).Error(fmt.Sprintf("Mesos couldn't kill task %s", t.GetTaskId())) + log.WithPrefix("termination"). + WithField("detector", detector). + WithError(err). + Error(fmt.Sprintf("Mesos couldn't kill task %s", t.GetTaskId())) } } } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index ce08cc803..be687ec45 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -37,6 +37,8 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" @@ -208,7 +210,12 @@ func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) erro } if aid != nil { fields["agent"] = aid.Value - fields["srcHost"] = state.getAgentCacheHostname(*aid) + host := state.getAgentCacheHostname(*aid) + fields["srcHost"] = host + detector, err := apricot.Instance().GetDetectorForHost(host) + if err == nil { + fields["detector"] = detector + } } if stat != nil { fields["error"] = strconv.Itoa(int(*stat)) @@ -219,10 +226,22 @@ func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) erro Error("executor failed") } else if aid != nil { // agent failed.. + fields := logrus.Fields{} + + fields["agent"] = aid.Value + host := state.getAgentCacheHostname(*aid) + fields["srcHost"] = host + detector, err := apricot.Instance().GetDetectorForHost(host) + if err == nil { + fields["detector"] = detector + } + + if stat != nil { + fields["error"] = strconv.Itoa(int(*stat)) + } log.WithPrefix("scheduler"). - WithField("agent", aid.Value). + WithFields(fields). WithField("level", infologger.IL_Support). - WithField("srcHost", state.getAgentCacheHostname(*aid)). Error("agent failed") } return nil @@ -526,12 +545,20 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han targetExecutorId.Value = offer.ExecutorIDs[0].Value } + host := offer.GetHostname() + var detector string + detector, err = apricot.Instance().GetDetectorForHost(host) + if err != nil { + detector = "" + } + log.WithPrefix("scheduler"). WithFields(logrus.Fields{ "offerId": offer.ID.Value, "resources": remainingResourcesInOffer.String(), }). WithField("partition", envId.String()). + WithField("detector", detector). Trace("processing offer") remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) @@ -548,6 +575,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", detector). Trace("state lock to process descriptors to deploy") state.Lock() @@ -555,11 +583,20 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han FOR_DESCRIPTORS: for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { descriptor := descriptorsStillToDeploy[i] + + varStackBottom := descriptor.TaskRole.GetUserVars() + + descriptorDetector, ok := varStackBottom.Get("detector") + if !ok { + descriptorDetector = "" + } + offerAttributes := constraint.Attributes(offer.Attributes) if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithFields(logrus.Fields{ "taskClass": descriptor.TaskClassName, "constraints": descriptorConstraints[descriptor], @@ -573,6 +610,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). Debug("offer attributes satisfy constraints") var wants *Wants @@ -581,6 +619,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithError(err). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithFields(logrus.Fields{ "class": descriptor.TaskClassName, "constraints": descriptor.RoleConstraints.String(), @@ -594,6 +633,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithFields(logrus.Fields{ "taskClass": descriptor.TaskClassName, "wants": *wants, @@ -645,10 +685,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if taskPtr == nil { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithField("offerId", offer.ID.Value). Error("cannot get task for offer+descriptor, this should never happen") log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). Trace("state unlock") continue } @@ -666,6 +708,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("offerId", offer.ID.Value). WithError(err). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). Error("cannot build task command") continue } @@ -730,6 +773,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han if err != nil { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithFields(logrus.Fields{ "error": err.Error(), "value": *runCommand.Value, @@ -741,6 +785,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han state.Unlock() log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). Trace("state unlock") continue } @@ -769,6 +814,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han executorResources := mesos.Resources(state.executor.Resources) log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithField("taskResources", resourcesRequest). WithField("executorResources", executorResources). Debug("creating Mesos task") @@ -787,10 +833,16 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Executor: executor, Resources: resourcesRequest, Data: jsonCommand, // this ends up in LAUNCH for the executor - Labels: &mesos.Labels{Labels: []mesos.Label{{ - Key: "environmentId", - Value: &envIdS, - }}}, + Labels: &mesos.Labels{Labels: []mesos.Label{ + { + Key: "environmentId", + Value: &envIdS, + }, + { + Key: "detector", + Value: &detector, + }, + }}, } // We must run the executor with a special LD_LIBRARY_PATH because @@ -808,6 +860,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). WithFields(logrus.Fields{ "taskId": newTaskId, "offerId": offer.ID.Value, @@ -825,6 +878,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } // end FOR_DESCRIPTORS state.Unlock() log.WithPrefix("scheduler"). + WithField("detector", detector). WithField("partition", envId.String()). Trace("state unlock") @@ -837,6 +891,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han err = calls.CallNoData(ctx, state.cli, accept) if err != nil { log.WithPrefix("scheduler"). + WithField("detector", detector). WithField("partition", envId.String()). WithField("error", err.Error()). Error("failed to launch tasks") @@ -847,6 +902,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithPrefix("scheduler"). WithField("tasks", n). WithField("partition", envId.String()). + WithField("detector", detector). WithField("level", infologger.IL_Support). WithField("offerHost", offer.Hostname). Infof("launch request sent to %s: %d tasks", offer.Hostname, n) @@ -861,6 +917,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han }). WithField("offerHost", offer.Hostname). WithField("partition", envId.String()). + WithField("detector", detector). Debug("task launch requested") } @@ -874,6 +931,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. WithField("partition", envId.String()). + WithField("detector", detector). WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers)). WithField("offersDeclined", len(offerIDsToDecline)). @@ -980,13 +1038,26 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han func (state *schedulerState) statusUpdate() events.HandlerFunc { return func(ctx context.Context, e *scheduler.Event) error { s := e.GetUpdate().GetStatus() + + fields := logrus.Fields{ + "task": s.TaskID.Value, + "state": s.GetState().String(), + "message": s.GetMessage(), + } + + aid := s.GetAgentID() + if aid != nil { + host := state.getAgentCacheHostname(*aid) + fields["srcHost"] = host + detector, err := apricot.Instance().GetDetectorForHost(host) + if err == nil { + fields["detector"] = detector + } + } + if viper.GetBool("verbose") { log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "task": s.TaskID.Value, - "state": s.GetState().String(), - "message": s.GetMessage(), - }). + WithFields(fields). Trace("task status update received") } @@ -1009,11 +1080,8 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { // log.WithPrefix("scheduler").Debug("state unlock") case mesos.TASK_RUNNING: log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "taskId": s.TaskID.GetValue(), - "state": s.GetState().String(), - "message": s.GetMessage(), - }).Trace("task status update received") + WithFields(fields). + Trace("task status update received") } taskmanMessage := NewTaskStatusMessage(s) @@ -1068,8 +1136,11 @@ func (state *schedulerState) sendCommand(ctx context.Context, command controlcom err = calls.CallNoData(ctx, state.cli, message) + detector := common.GetValueFromLabelerType(command, "detector") + log.WithPrefix("scheduler"). WithField("partition", command.GetEnvironmentId().String()). + WithField("detector", detector). WithFields(logrus.Fields{ "agentId": receiver.AgentId.Value, "executorId": receiver.ExecutorId.Value, diff --git a/core/task/task.go b/core/task/task.go index ae3add20c..c65010dc6 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -273,6 +273,11 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return } + detector, ok := varStack["detector"] + if !ok { + detector = "" + } + // We make a copy of the Defaults/Vars maps from the taskClass, this is necessary because // entries may be templated, so they may resolve to different values in each task. localDefaults := class.Defaults.Copy().Raw() @@ -285,6 +290,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). + WithField("detector", detector). Error("cannot resolve templates for task defaults") } @@ -300,6 +306,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). + WithField("detector", detector). Error("cannot resolve templates for task vars") } @@ -309,6 +316,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if err != nil { log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). + WithField("detector", detector). Error("cannot fetch task class defaults for task command info") return } @@ -339,6 +347,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). + WithField("detector", detector). Error("cannot resolve templates for task command info") } } @@ -499,6 +508,11 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand return } + detector, ok := varStack["detector"] + if !ok { + detector = "" + } + // We wrap the parent varStack around the class Defaults+Vars, ensuring // the class Defaults+Vars are overridden by anything else. classStack := gera.MakeStringMapWithMap(class.Vars.Raw()).Wrap(class.Defaults) @@ -571,6 +585,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand if err != nil { log.WithError(err). WithField("partition", t.GetParent().GetEnvironmentId().String()). + WithField("detector", detector). Error("cannot resolve templates for property map") return } From d443c3c72a23a8b8eedfe560234b9457a209e91d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 Aug 2022 08:50:14 +0200 Subject: [PATCH 1380/2352] [executor] Output detector field to InfoLogger --- executor/executable/basictask.go | 1 + executor/executable/controllabletask.go | 60 ++++++++++++++++++++++--- executor/executable/hooktask.go | 1 + executor/executable/task.go | 9 ++++ executor/executorutil/executorutil.go | 13 ++++++ executor/handlers.go | 6 +++ 6 files changed, 85 insertions(+), 5 deletions(-) diff --git a/executor/executable/basictask.go b/executor/executable/basictask.go index ae3c417aa..d2f0a8958 100644 --- a/executor/executable/basictask.go +++ b/executor/executable/basictask.go @@ -37,6 +37,7 @@ func (t *BasicTask) makeTransitionFunc() transitioner.DoTransitionFunc { // otherwise we process the hooks spec. return func(ei transitioner.EventInfo) (newState string, err error) { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("event", ei.Evt). Debug("executor basic task transitioner requesting transition") diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index fc539860b..d58c038d3 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -75,6 +75,7 @@ func (t *ControllableTask) Launch() error { "taskName": t.ti.Name, "level": infologger.IL_Devel, "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, }).Debug("executor.ControllableTask.Launch begin") launchStartTime := time.Now() @@ -87,6 +88,7 @@ func (t *ControllableTask) Launch() error { "taskName": t.ti.Name, "level": infologger.IL_Devel, "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, })) t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed @@ -98,6 +100,7 @@ func (t *ControllableTask) Launch() error { "task": t.ti.Name, "error": err, "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, }). Error(msg) @@ -109,6 +112,7 @@ func (t *ControllableTask) Launch() error { WithField("task", t.ti.Name). WithField("level", infologger.IL_Devel). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("starting task asynchronously") // We fork out into a goroutine for the actual process management. @@ -122,6 +126,7 @@ func (t *ControllableTask) Launch() error { "taskName": t.ti.Name, "level": infologger.IL_Devel, "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, }).Debug("executor.ControllableTask.Launch.async begin") // Set up pipes for controlled process @@ -141,6 +146,7 @@ func (t *ControllableTask) Launch() error { "error": err.Error(), "command": tciCommandStr, "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, }). Error("failed to run task") @@ -151,11 +157,13 @@ func (t *ControllableTask) Launch() error { log.WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("task launched") utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "cmd": t.ti.Command.GetValue(), "taskId": t.ti.TaskID.GetValue(), @@ -202,6 +210,7 @@ func (t *ControllableTask) Launch() error { } log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "controlPort": t.Tci.ControlPort, "controlMode": t.Tci.ControlMode.String(), @@ -230,6 +239,7 @@ func (t *ControllableTask) Launch() error { controlTransport, log.WithPrefix("executorcmd"). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -240,6 +250,7 @@ func (t *ControllableTask) Launch() error { if t.rpc == nil { err = errors.New("rpc client is nil") log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -257,6 +268,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), @@ -267,6 +279,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(rpcDialStartTime, "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), @@ -278,6 +291,7 @@ func (t *ControllableTask) Launch() error { elapsed := 0 * time.Second for { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -291,6 +305,7 @@ func (t *ControllableTask) Launch() error { if err != nil { log.WithError(err). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, @@ -299,6 +314,7 @@ func (t *ControllableTask) Launch() error { Info("cannot query task status") } else { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, @@ -313,6 +329,7 @@ func (t *ControllableTask) Launch() error { if reachedState == "STANDBY" && err == nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). WithField("command", tciCommandStr). @@ -333,12 +350,14 @@ func (t *ControllableTask) Launch() error { _ = stderrIn.Close() log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name).Debug("task killed") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, "task reached wrong state on startup") return } else if elapsed >= startupTimeout { err = errors.New("timeout while waiting for task startup") log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name).Error(err.Error()) t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() @@ -350,6 +369,7 @@ func (t *ControllableTask) Launch() error { return } else { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WithField("command", tciCommandStr). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) @@ -361,6 +381,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), @@ -371,6 +392,7 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(statePollingStartTime, "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), @@ -384,6 +406,7 @@ func (t *ControllableTask) Launch() error { log.WithField("task", t.ti.Name). WithError(err). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Error("cannot set up event stream from task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() @@ -397,10 +420,13 @@ func (t *ControllableTask) Launch() error { jsonEvent, err := json.Marshal(taskMessage) if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). - WithError(err).Warning("error marshaling message from task") + WithField("detector", t.knownDetector). + WithError(err). + Warning("error marshaling message from task") } else { t.sendMessage(jsonEvent) log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "command": tciCommandStr, "taskId": t.ti.TaskID.GetValue(), @@ -419,20 +445,23 @@ func (t *ControllableTask) Launch() error { for { if t.rpc == nil { log.WithField("partition", t.knownEnvironmentId.String()). - WithField("taskId", deo.TaskId.String()). - WithError(err).Debug("event stream done") + WithField("detector", t.knownDetector). + WithError(err). + Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { log.WithField("partition", t.knownEnvironmentId.String()). - WithField("taskId", deo.TaskId.String()). - WithError(err).Debug("event stream EOF") + WithField("detector", t.knownDetector). + WithError(err). + Debug("event stream EOF") break } if err != nil { log.WithError(err). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("errorType", reflect.TypeOf(err)). WithField("level", infologger.IL_Devel). Warningf("error receiving event from task %s", deo.TaskId.String()) @@ -446,6 +475,7 @@ func (t *ControllableTask) Launch() error { deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) if deviceEvent == nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } @@ -458,6 +488,7 @@ func (t *ControllableTask) Launch() error { err = taskCmd.Wait() // ^ when this unblocks, the task is done log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -468,6 +499,7 @@ func (t *ControllableTask) Launch() error { pendingState := mesos.TASK_FINISHED if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, @@ -477,6 +509,7 @@ func (t *ControllableTask) Launch() error { }). Error("task terminated with error") log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("level", infologger.IL_Support). Errorf("task terminated with error: %s %s", tciCommandStr, @@ -493,14 +526,17 @@ func (t *ControllableTask) Launch() error { if t.rpc != nil { _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("rpc client closed") t.rpc = nil log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("rpc client removed") } if errStdout != nil || errStderr != nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "errStderr": errStderr, "errStdout": errStdout, @@ -516,6 +552,7 @@ func (t *ControllableTask) Launch() error { }() log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "task": t.ti.Name, "level": infologger.IL_Devel, @@ -559,6 +596,7 @@ func (t *ControllableTask) Kill() error { WithField("taskId", t.ti.GetTaskID()). WithField("level", infologger.IL_Devel). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debug("task status queried for upcoming soft kill") // NOTE: we acquire the transitioner-dependent STANDBY equivalent state @@ -603,6 +641,7 @@ func (t *ControllableTask) Kill() error { reachedState != "ERROR" { cmd := nextTransition(reachedState) log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithFields(logrus.Fields{ "evt": cmd.Event, "src": cmd.Source, @@ -626,6 +665,7 @@ func (t *ControllableTask) Kill() error { case commitResponse = <-commitDone: case <-time.After(KILL_TRANSITION_TIMEOUT): log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Warn("teardown transition sequence timed out") @@ -636,6 +676,7 @@ func (t *ControllableTask) Kill() error { } log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("newState", commitResponse.newState). WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). @@ -643,6 +684,7 @@ func (t *ControllableTask) Kill() error { Debug("transition committed") if commitResponse.transitionError != nil || len(cmd.Event) == 0 { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(commitResponse.transitionError). WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). @@ -653,6 +695,7 @@ func (t *ControllableTask) Kill() error { } log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.TaskID.Value). WithField("level", infologger.IL_Devel). Debug("teardown transition sequence done") @@ -666,6 +709,7 @@ func (t *ControllableTask) Kill() error { // at some earlier point during the lifetime of this task. // Either way, we might or might not have the true PID. log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(err). WithField("taskId", t.ti.GetTaskID()). Warn("cannot query task status for graceful process termination") @@ -682,6 +726,7 @@ func (t *ControllableTask) Kill() error { // negative PID is all other cases in order to allow FairMQ cleanup to // run. log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(err).WithField("taskId", t.ti.GetTaskID()). Warn("task PID not known from task, using containing shell PGID") } @@ -692,11 +737,13 @@ func (t *ControllableTask) Kill() error { if reachedState == "DONE" { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("taskId", t.ti.TaskID.Value). Debug("task reached DONE, will try to terminate it gently") t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED } else { // something went wrong log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("taskId", t.ti.TaskID.Value). Debug("task already died or will be killed soon") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED @@ -714,6 +761,7 @@ func (t *ControllableTask) doKill9(pid int) error { killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(killErr). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGKILL failed") @@ -729,6 +777,7 @@ func (t *ControllableTask) doTermIntKill(pid int) error { err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(err). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGTERM failed") @@ -748,6 +797,7 @@ func (t *ControllableTask) doTermIntKill(pid int) error { killErr = syscall.Kill(pid, syscall.SIGINT) if killErr != nil { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithError(killErr). WithField("taskId", t.ti.GetTaskID()). Warning("task SIGINT failed") diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go index c8e856339..450e93e4f 100644 --- a/executor/executable/hooktask.go +++ b/executor/executable/hooktask.go @@ -36,6 +36,7 @@ func (t *HookTask) makeTransitionFunc() transitioner.DoTransitionFunc { // NOOP transition function, because hooks don't obey any transition return func(ei transitioner.EventInfo) (newState string, err error) { log.WithField("partition", t.knownEnvironmentId.String()). + WithField("partition", t.knownDetector). WithField("event", ei.Evt). Debug("executor hook task transitioner requesting transition") diff --git a/executor/executable/task.go b/executor/executable/task.go index 8642c37e8..77cac4cfa 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -76,11 +76,13 @@ type taskBase struct { sendMessage SendMessageFunc knownEnvironmentId uid.ID + knownDetector string } func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceEventFunc SendDeviceEventFunc, sendMessageFunc SendMessageFunc) Task { var commandInfo common.TaskCommandInfo envId := executorutil.GetEnvironmentIdFromLabelerType(&taskInfo) + detector := executorutil.GetValueFromLabelerType(&taskInfo, "detector") tciData := taskInfo.GetData() @@ -95,23 +97,27 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE "controlmode": commandInfo.ControlMode.String(), "level": infologger.IL_Devel, "partition": envId.String(), + "detector": detector, }). Debug("instantiating task") rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") log.WithField("level", infologger.IL_Support). WithField("partition", envId.String()). + WithField("detector", detector). Infof("launching task %s", rawCommand) } else { if err != nil { log.WithError(err). WithField("task", taskInfo.Name). WithField("partition", envId.String()). + WithField("detector", detector). Error("could not launch task") } else { log.WithError(errors.New("command data is nil")). WithField("task", taskInfo.Name). WithField("partition", envId.String()). + WithField("detector", detector). Error("could not launch task") } sendStatusFunc(envId, mesos.TASK_FAILED, "TaskInfo.Data is nil") @@ -131,6 +137,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE sendDeviceEvent: sendDeviceEventFunc, sendMessage: sendMessageFunc, knownEnvironmentId: envId, + knownDetector: detector, }, }, } @@ -144,6 +151,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE sendDeviceEvent: sendDeviceEventFunc, sendMessage: sendMessageFunc, knownEnvironmentId: envId, + knownDetector: detector, }, }, } @@ -158,6 +166,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE sendDeviceEvent: sendDeviceEventFunc, sendMessage: sendMessageFunc, knownEnvironmentId: envId, + knownDetector: detector, }, rpc: nil, } diff --git a/executor/executorutil/executorutil.go b/executor/executorutil/executorutil.go index 48648f6f0..646a98ba3 100644 --- a/executor/executorutil/executorutil.go +++ b/executor/executorutil/executorutil.go @@ -57,6 +57,19 @@ func GetEnvironmentIdFromLabelerType(labeler Labeler) uid.ID { return envId } +func GetValueFromLabelerType(labeler Labeler, key string) string { + labels := labeler.GetLabels() + + if labels != nil && len(labels.GetLabels()) > 0 { + for _, label := range labels.GetLabels() { + if label.GetKey() == key && label.GetValue() != "" { + return label.GetValue() + } + } + } + return "" +} + func GetGroupIDs(targetUser *user.User) ([]uint32, []string) { gidStrings, err := targetUser.GroupIds() if err != nil { diff --git a/executor/handlers.go b/executor/handlers.go index 553acdc8b..57ab4e052 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -241,6 +241,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { // Before we do anything else, we try to get an environment ID for log messages envId := executorutil.GetEnvironmentIdFromLabelerType(&taskInfo) + detector := executorutil.GetValueFromLabelerType(&taskInfo, "detector") log.WithFields(logrus.Fields{ "cmd": taskInfo.Command.GetValue(), @@ -249,6 +250,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { "hostname": state.agent.GetHostname(), "level": infologger.IL_Devel, "partition": envId.String(), + "detector": detector, }).Debug("executor.handleLaunchEvent begin") defer utils.TimeTrack(time.Now(), @@ -260,6 +262,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { "hostname": state.agent.GetHostname(), "level": infologger.IL_Devel, "partition": envId.String(), + "detector": detector, })) state.unackedTasks[taskInfo.TaskID] = taskInfo @@ -267,6 +270,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { jsonTask, _ := json.MarshalIndent(taskInfo, "", "\t") log.WithField("payload", fmt.Sprintf("%s", jsonTask[:])). WithField("partition", envId.String()). + WithField("detector", detector). Trace("received task to launch") myTask := executable.NewTask(taskInfo, @@ -287,6 +291,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { "hostname": state.agent.GetHostname(), "level": infologger.IL_Devel, "partition": envId.String(), + "detector": detector, }).Debug("task launching") return nil } else { @@ -299,6 +304,7 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { "hostname": state.agent.GetHostname(), "level": infologger.IL_Devel, "partition": envId.String(), + "detector": detector, }). Error("task launch failed") return err From dfb8347eddec6fd2b9ee43bade3ef66aea34bf65 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Aug 2022 17:02:03 +0200 Subject: [PATCH 1381/2352] [executor] Attach detector to task PID event --- common/event/announcetaskpidevent.go | 24 ++++++++++++------------ executor/executable/controllabletask.go | 4 +++- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/common/event/announcetaskpidevent.go b/common/event/announcetaskpidevent.go index e870484c2..e97f47b4e 100644 --- a/common/event/announcetaskpidevent.go +++ b/common/event/announcetaskpidevent.go @@ -28,30 +28,30 @@ import "github.com/AliceO2Group/Control/common/utils" type AnnounceTaskPIDEvent struct { eventBase - TaskId string `json:"taskId"` - PID int32 `json:"pid"` + TaskId string `json:"taskId"` + PID int32 `json:"pid"` } -func (tmb *AnnounceTaskPIDEvent) GetName() string { +func (e *AnnounceTaskPIDEvent) GetName() string { return "ANNOUNCE_TASK_PID" } -func (tmb *AnnounceTaskPIDEvent) GetTaskId() string { - return tmb.TaskId +func (e *AnnounceTaskPIDEvent) GetTaskId() string { + return e.TaskId } -func (tmb *AnnounceTaskPIDEvent) GetTaskPID() int { - return int(tmb.PID) +func (e *AnnounceTaskPIDEvent) GetTaskPID() int { + return int(e.PID) } -func NewAnnounceTaskPIDEvent(id string, pid int32) (tm *AnnounceTaskPIDEvent) { - tm = &AnnounceTaskPIDEvent{ +func NewAnnounceTaskPIDEvent(id string, pid int32) (e *AnnounceTaskPIDEvent) { + e = &AnnounceTaskPIDEvent{ eventBase: eventBase{ Timestamp: utils.NewUnixTimestamp(), MessageType: "AnnounceTaskPIDEvent", }, - TaskId: id, - PID: pid, + TaskId: id, + PID: pid, } - return tm + return e } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index d58c038d3..6cb5e5f42 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -417,6 +417,8 @@ func (t *ControllableTask) Launch() error { // send RUNNING t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) + taskMessage.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) + jsonEvent, err := json.Marshal(taskMessage) if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). @@ -479,7 +481,7 @@ func (t *ControllableTask) Launch() error { Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } - deviceEvent.SetLabels(map[string]string{"environmentId": t.knownEnvironmentId.String()}) + deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) t.sendDeviceEvent(t.knownEnvironmentId, deviceEvent) } From 1888833d84fe01095e029514ae9057fe677caf9c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 Aug 2022 13:05:32 +0200 Subject: [PATCH 1382/2352] [core] Make sure deployment error is forwarded + print detectors --- core/environment/manager.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index e6148efe7..56a205528 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -144,9 +144,16 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env, err := newEnvironment(envUserVars) newEnvId := uid.NilID() - if err == nil && env != nil { - newEnvId = env.Id() - } else { + if err == nil { + if env != nil { + newEnvId = env.Id() + } else { + err = errors.New("newEnvironment returned nil environment") + log.WithError(err). + Logf(logrus.FatalLevel, "environment creation failed") + } + } + if err != nil { log.WithError(err). WithField("partition", newEnvId.String()). Logf(logrus.FatalLevel, "environment creation failed") @@ -199,6 +206,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } env.GlobalDefaults.Set("detectors", detectorsStr) + log.WithFields(logrus.Fields{ + "partition": newEnvId.String(), + }).Infof("detectors in environment: %s", strings.Join(detectors, " ")) + // env.GetActiveDetectors() is valid starting now, so we can check for detector exclusion neededDetectors := env.GetActiveDetectors() for det, _ := range neededDetectors { @@ -218,6 +229,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] nil, //roles, nil), ) + if err == nil { err = env.TryTransition(NewConfigureTransition( envs.taskman), From ac03680e10680cbc8d299c4439888e3caf579908 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 Aug 2022 10:49:12 +0200 Subject: [PATCH 1383/2352] [build] Bump to v0.49.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 302de5483..65e248e4e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 48 -VERSION_PATCH := 2 +VERSION_MINOR := 49 +VERSION_PATCH := 0 From 45e590ddd9f651469b29087f71df0788acce1afc Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 4 Aug 2022 16:13:07 +0200 Subject: [PATCH 1384/2352] [OCTRL-695] AliECS Bookkeeping plugin passes the raw runtype as string for run details. --- core/integration/bookkeeping/api.go | 17 +++-------------- core/integration/bookkeeping/plugin.go | 2 +- 2 files changed, 4 insertions(+), 15 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 60538c43a..89d84079a 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -25,6 +25,7 @@ package bookkeeping import ( + "github.com/AliceO2Group/Control/common/runtype" "net/url" "path" "strconv" @@ -67,21 +68,9 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, ddFlp bool, dcs bool, epn bool, epnTopology string, detectors string) error { - var runtypeAPI sw.RunType - switch runType { - case string(sw.TECHNICAL_RunType): - runtypeAPI = sw.TECHNICAL_RunType - case string(sw.COSMICS_RunType): - runtypeAPI = sw.COSMICS_RunType - case string(sw.PHYSICS_RunType): - runtypeAPI = sw.PHYSICS_RunType - default: - // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType - runtypeAPI = sw.TECHNICAL_RunType - } +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runTypeValue runtype.RunType, ddFlp bool, dcs bool, epn bool, epnTopology string, detectors string) error { - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, ddFlp, dcs, epn, epnTopology, sw.Detectors(detectors)) + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runTypeValue.String(), ddFlp, dcs, epn, epnTopology, sw.Detectors(detectors)) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 328db22ef..e17f170c6 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -251,7 +251,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { odcTopology := env.GetKV("", "odc_topology") detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). From 0221940ce0fefa3df899b07d742bc33201dd5509 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 4 Aug 2022 16:22:18 +0200 Subject: [PATCH 1385/2352] [OCTRL-677] AliECS Bookkeeping plugin passes odc_topology_fullname to BK for run details. --- core/integration/bookkeeping/api.go | 4 ++-- core/integration/bookkeeping/plugin.go | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 89d84079a..5de61e30b 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -75,7 +75,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string, odcTopologyFullname string) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -134,7 +134,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e17f170c6..ca05f7ede 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -351,8 +351,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire PDP topology description library file") } tfbMode := env.GetKV("", "tfb_dd_mode") + + odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } + lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod) + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). From 544f6719b0bd51ba7085a8c066e3293118202e37 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 15 Aug 2022 10:38:29 +0200 Subject: [PATCH 1386/2352] [OCTRL-677] Correct the PR to match with Bookkeeping. --- core/integration/bookkeeping/api.go | 18 ++++++++++++++---- core/integration/bookkeeping/plugin.go | 9 ++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 5de61e30b..9b97f0ac1 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -25,7 +25,6 @@ package bookkeeping import ( - "github.com/AliceO2Group/Control/common/runtype" "net/url" "path" "strconv" @@ -68,9 +67,20 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runTypeValue runtype.RunType, ddFlp bool, dcs bool, epn bool, epnTopology string, detectors string) error { - - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runTypeValue.String(), ddFlp, dcs, epn, epnTopology, sw.Detectors(detectors)) +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, ddFlp bool, dcs bool, epn bool, epnTopology string, odcTopologyFullname string, detectors string) error { + var runtypeAPI sw.RunType + switch runType { + case string(sw.TECHNICAL_RunType): + runtypeAPI = sw.TECHNICAL_RunType + case string(sw.COSMICS_RunType): + runtypeAPI = sw.COSMICS_RunType + case string(sw.PHYSICS_RunType): + runtypeAPI = sw.PHYSICS_RunType + default: + // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType + runtypeAPI = sw.TECHNICAL_RunType + } + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index ca05f7ede..fea83a3eb 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -249,9 +249,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot parse EPN enabled") } odcTopology := env.GetKV("", "odc_topology") + odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, odcTopologyFullname, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). From 02afa6e69e48e0e9ed9c0461904acc58bddb4aa4 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 15 Aug 2022 10:58:19 +0200 Subject: [PATCH 1387/2352] [OCTRL-677] Correct the go.mod and go.sum files to point to Bookkeeping main. --- go.mod | 3 ++- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 33e7d343f..d994ca1c3 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -72,6 +72,7 @@ require ( ) require ( + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/armon/go-metrics v0.4.0 // indirect diff --git a/go.sum b/go.sum index b61d38878..39d018e54 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,12 @@ cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3f dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 h1:6a/sKkS2BqoHy86Q84t7i+ahZCtteiHmTZOuM6dWJBw= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From 689939896880e2995c3455a60d6120aaccf3f514 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 19 Aug 2022 16:04:30 +0200 Subject: [PATCH 1388/2352] Refactor of component configuration access layer Extended and improved configuration path resolution, it can now happen in the workflow template context at any time, with or without a full KV query Support for ANY/any as fallback paths for run type and role Extended per-role template processing sequence, it now operates on 5 stages (up from 4), and it processes the `enabled` condition before doing anything else in order to improve correctness, reliability and performance Added support for string + and + string operations in the template system for reliability A task's special varStack is now built as early as possible so task templates can use task_hostname and similar runtime values Expanded template system API and split into config/strings/dpl/util units (old calls are deprecated but still available for backwards compatibility with pre-v0.50.0 AliECS), changes include: * GetConfig -> config.Get * new functions config.Resolve/ResolvePath/ResolveWithTimestamp/ResolvePathWithTimestamp * DetectorForHost/DetectorsForHosts etc. -> inventory.DetectorForHost/DetectorsForHosts * GenerateDplSubworkflow/GenerateDplSubworkflowFromUri -> dpl.Generate/GenerateFromUri * GetRuntimeConfig -> runtime.Get, plus corresponding new function runtime.Set to push a value to the component's runtime context in Apricot/Consul * Atoi/Itoa/ToUpper etc. -> strings.Atoi/Itoa/ToUpper * ToJson/FromJson -> json.Marshal/Unmarshal * NewID -> uid.New * PrefixedOverride/Dump -> util.PrefixedOverride/Dump plus new function util.Nullable to safely wrap a value that might be --- apricot/local/service.go | 81 ++--- apricot/local/serviceutil.go | 77 ++++- apricot/protos/apricot.pb.go | 364 +++++++++++++---------- apricot/protos/apricot.proto | 32 +- apricot/protos/apricot_grpc.pb.go | 36 +++ apricot/remote/server.go | 31 ++ apricot/remote/service.go | 23 ++ common/runtype/runtype.go | 2 +- configuration/cfgbackend/consulsource.go | 10 +- configuration/componentcfg/query.go | 33 +- configuration/service.go | 1 + configuration/template/dplutil.go | 156 ++++++++++ configuration/template/fields.go | 89 ++++-- configuration/template/stack.go | 356 +++++++++------------- configuration/template/stackutil.go | 180 +++++++++++ core/task/task.go | 15 +- core/workflow/aggregatorrole.go | 39 ++- core/workflow/callrole.go | 20 +- core/workflow/includerole.go | 40 +-- core/workflow/roleutils.go | 16 +- core/workflow/taskrole.go | 28 +- 21 files changed, 1110 insertions(+), 519 deletions(-) create mode 100644 configuration/template/dplutil.go create mode 100644 configuration/template/stackutil.go diff --git a/apricot/local/service.go b/apricot/local/service.go index 52072ff52..abe9c776c 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -231,75 +231,26 @@ func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]stri //} func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { - if query == nil { + var absolutePath string + absolutePath, err = s.queryToAbsPath(query) + if err != nil { return } - - var timestamp string - - if len(query.Timestamp) == 0 { - keyPrefix := query.AbsoluteWithoutTimestamp() - if s.src.IsDir(keyPrefix) { - var keys []string - keys, err = s.src.GetKeysByPrefix(keyPrefix) - if err != nil { - return - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - return - } - } - } else { - timestamp = query.Timestamp - } - absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp - if exists, _ := s.src.Exists(absKey); exists && len(timestamp) > 0 { - payload, err = s.src.Get(absKey) - } else { - // falling back to timestampless configuration - absKey = query.AbsoluteWithoutTimestamp() - payload, err = s.src.Get(absKey) - } + payload, err = s.src.Get(absolutePath) return } func (s *Service) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) { - if query == nil { - return - } - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - var timestamp string - - if len(query.Timestamp) == 0 { - keyPrefix := query.AbsoluteWithoutTimestamp() - if cSrc.IsDir(keyPrefix) { - var keys []string - keys, err = cSrc.GetKeysByPrefix(keyPrefix) - if err != nil { - return - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - return - } - } - } else { - timestamp = query.Timestamp - } - absKey := query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp - if exists, _ := cSrc.Exists(absKey); exists && len(timestamp) > 0 { - payload, lastIndex, err = cSrc.GetWithLastIndex(absKey) - } else { - // falling back to timestampless configuration - absKey = query.AbsoluteWithoutTimestamp() - payload, lastIndex, err = cSrc.GetWithLastIndex(absKey) + var absolutePath string + absolutePath, err = s.queryToAbsPath(query) + if err != nil { + return } + payload, lastIndex, err = cSrc.GetWithLastIndex(absolutePath) } else { err = errors.New("component with last index not supported with file backend") } - return } @@ -337,7 +288,7 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, } // Add custom functions to bindings: - funcMap := template.MakeStrOperationFuncMap(varStack) + funcMap := template.MakeUtilFuncMap(varStack) for k, v := range funcMap { bindings[k] = v } @@ -346,6 +297,18 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, return } +func (s *Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { + resolved = &componentcfg.Query{} + if query == nil { + *resolved = *query + return + } + if _, ok := s.src.(*cfgbackend.ConsulSource); ok { + return s.resolveComponentQuery(query) + } + return +} + func (s *Service) RawGetRecursive(path string) (string, error) { cfgDump, err := s.src.GetRecursive(path) if err != nil { diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index 2b50f0540..de6803f0d 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -24,7 +24,53 @@ package local -import "github.com/AliceO2Group/Control/configuration/cfgbackend" +import ( + "fmt" + + "github.com/AliceO2Group/Control/configuration/cfgbackend" + "github.com/AliceO2Group/Control/configuration/componentcfg" +) + +func (s *Service) queryToAbsPath(query *componentcfg.Query) (absolutePath string, err error) { + if query == nil { + return + } + + var timestamp string + + if len(query.Timestamp) == 0 { + keyPrefix := query.AbsoluteWithoutTimestamp() + if s.src.IsDir(keyPrefix) { + var keys []string + keys, err = s.src.GetKeysByPrefix(keyPrefix) + if err != nil { + return + } + timestamp, err = componentcfg.GetLatestTimestamp(keys, query) + if err != nil { + timestamp = "" // no timestamp keys found, we'll try to fall back to timestampless + } + } + } else { + timestamp = query.Timestamp + } + absolutePath = query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp + if exists, _ := s.src.Exists(absolutePath); exists && len(timestamp) > 0 { + err = nil + return + } + + // falling back to timestampless configuration + absolutePath = query.AbsoluteWithoutTimestamp() + if exists, _ := s.src.Exists(absolutePath); exists { + err = nil + return + } + + err = fmt.Errorf("no payload at configuration path %s", absolutePath) + + return +} func (s *Service) getStringMap(path string) map[string]string { tree, err := s.src.GetRecursive(path) @@ -44,3 +90,32 @@ func (s *Service) getStringMap(path string) map[string]string { } return nil } + +func (s *Service) resolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { + resolved = &componentcfg.Query{} + *resolved = *query + if _, err = s.queryToAbsPath(resolved); err == nil { + // requested path exists, return it + return + } + + resolved = query.WithFallbackRunType() + if _, err = s.queryToAbsPath(resolved); err == nil { + // path with run type ANY exists, return it + return + } + + resolved = query.WithFallbackRoleName() + if _, err = s.queryToAbsPath(resolved); err == nil { + // path with role name "any" exists, return it + return + } + + resolved = resolved.WithFallbackRunType() + if _, err = s.queryToAbsPath(resolved); err == nil { + // path with run type ANY and role name "any" exists, return it + return + } + + return nil, fmt.Errorf("could not resolve configuration path %s", query.AbsoluteRaw()) +} diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 1a0d6e026..4756a38de 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc v3.21.1 // source: protos/apricot.proto package apricotpb @@ -48,40 +48,69 @@ const ( // of the legacy proto package is being used. const _ = proto.ProtoPackageIsVersion4 +// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go +// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. type RunType int32 const ( - RunType_NULL RunType = 0 - RunType_ANY RunType = 1 - RunType_PHYSICS RunType = 2 - RunType_TECHNICAL RunType = 3 - RunType_COSMIC RunType = 4 - RunType_PEDESTAL RunType = 5 - RunType_THRESHOLD_SCAN RunType = 6 - RunType_CALIBRATION RunType = 7 + RunType_NULL RunType = 0 + RunType_PHYSICS RunType = 1 + RunType_TECHNICAL RunType = 2 + RunType_PEDESTALS RunType = 3 + RunType_PULSER RunType = 4 + RunType_LASER RunType = 5 + RunType_CALIBRATION_ITHR_TUNING RunType = 6 + RunType_CALIBRATION_VCASN_TUNING RunType = 7 + RunType_CALIBRATION_THR_SCAN RunType = 8 + RunType_CALIBRATION_DIGITAL_SCAN RunType = 9 + RunType_CALIBRATION_ANALOG_SCAN RunType = 10 + RunType_CALIBRATION_FHR RunType = 11 + RunType_CALIBRATION_ALPIDE_SCAN RunType = 12 + RunType_CALIBRATION RunType = 200 + RunType_COSMICS RunType = 201 + RunType_SYNTHETIC RunType = 202 + RunType_ANY RunType = 300 ) // Enum value maps for RunType. var ( RunType_name = map[int32]string{ - 0: "NULL", - 1: "ANY", - 2: "PHYSICS", - 3: "TECHNICAL", - 4: "COSMIC", - 5: "PEDESTAL", - 6: "THRESHOLD_SCAN", - 7: "CALIBRATION", + 0: "NULL", + 1: "PHYSICS", + 2: "TECHNICAL", + 3: "PEDESTALS", + 4: "PULSER", + 5: "LASER", + 6: "CALIBRATION_ITHR_TUNING", + 7: "CALIBRATION_VCASN_TUNING", + 8: "CALIBRATION_THR_SCAN", + 9: "CALIBRATION_DIGITAL_SCAN", + 10: "CALIBRATION_ANALOG_SCAN", + 11: "CALIBRATION_FHR", + 12: "CALIBRATION_ALPIDE_SCAN", + 200: "CALIBRATION", + 201: "COSMICS", + 202: "SYNTHETIC", + 300: "ANY", } RunType_value = map[string]int32{ - "NULL": 0, - "ANY": 1, - "PHYSICS": 2, - "TECHNICAL": 3, - "COSMIC": 4, - "PEDESTAL": 5, - "THRESHOLD_SCAN": 6, - "CALIBRATION": 7, + "NULL": 0, + "PHYSICS": 1, + "TECHNICAL": 2, + "PEDESTALS": 3, + "PULSER": 4, + "LASER": 5, + "CALIBRATION_ITHR_TUNING": 6, + "CALIBRATION_VCASN_TUNING": 7, + "CALIBRATION_THR_SCAN": 8, + "CALIBRATION_DIGITAL_SCAN": 9, + "CALIBRATION_ANALOG_SCAN": 10, + "CALIBRATION_FHR": 11, + "CALIBRATION_ALPIDE_SCAN": 12, + "CALIBRATION": 200, + "COSMICS": 201, + "SYNTHETIC": 202, + "ANY": 300, } ) @@ -1852,120 +1881,139 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x2a, 0x77, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x43, - 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, - 0x54, 0x41, 0x4c, 0x10, 0x05, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, - 0x4c, 0x44, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x32, 0xd7, 0x0c, 0x0a, 0x07, 0x41, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, - 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, - 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, + 0x73, 0x2a, 0xe0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, + 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, + 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, + 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, + 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, + 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, + 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, + 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, + 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, + 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, + 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, + 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0b, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xc8, 0x01, 0x12, 0x0c, 0x0a, + 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0xc9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x53, + 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0xca, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x41, + 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x0d, 0x10, 0xc7, 0x01, 0x22, 0x06, 0x08, 0xcb, + 0x01, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, - 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, + 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2046,29 +2094,31 @@ var file_protos_apricot_proto_depIdxs = []int32{ 2, // 25: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery 3, // 26: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 25, // 28: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 11, // 29: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 12, // 30: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 12, // 31: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 32: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 22, // 33: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 24, // 34: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 10, // 35: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse - 8, // 36: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 22, // 37: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 27, // 38: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 29, // 39: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 40: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 41: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 20, // 42: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 43: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 20, // 44: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 45: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 46: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 47: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 26, // 48: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 29, // [29:49] is the sub-list for method output_type - 9, // [9:29] is the sub-list for method input_type + 2, // 28: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery + 25, // 29: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 11, // 30: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 31: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 32: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 33: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 22, // 34: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 24, // 35: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 36: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 37: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 22, // 38: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 27, // 39: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 29, // 40: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 41: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 42: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 20, // 43: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 44: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 20, // 45: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 46: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 47: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 48: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 2, // 49: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery + 26, // 50: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 30, // [30:51] is the sub-list for method output_type + 9, // [9:30] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index f77c1e641..93dface21 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -54,18 +54,34 @@ service Apricot { rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} rpc GetComponentConfigurationWithLastIndex(ComponentRequest) returns (ComponentResponseWithLastIndex) {} + rpc ResolveComponentQuery(ComponentQuery) returns (ComponentQuery) {} rpc ImportComponentConfiguration(ImportComponentConfigurationRequest) returns (ImportComponentConfigurationResponse) {} } +// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go +// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. enum RunType { - NULL = 0; - ANY = 1; - PHYSICS = 2; - TECHNICAL = 3; - COSMIC = 4; - PEDESTAL = 5; - THRESHOLD_SCAN = 6; - CALIBRATION = 7; + NULL = 0; + PHYSICS = 1; + TECHNICAL = 2; + PEDESTALS = 3; + PULSER = 4; + LASER = 5; + CALIBRATION_ITHR_TUNING = 6; + CALIBRATION_VCASN_TUNING = 7; + CALIBRATION_THR_SCAN = 8; + CALIBRATION_DIGITAL_SCAN = 9; + CALIBRATION_ANALOG_SCAN = 10; + CALIBRATION_FHR = 11; + CALIBRATION_ALPIDE_SCAN = 12; + reserved 13 to 199; + + CALIBRATION = 200; + COSMICS = 201; + SYNTHETIC = 202; + reserved 203 to 299; + + ANY = 300; } message Empty {} diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 739ff40c7..c395a93dd 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -40,6 +40,7 @@ type ApricotClient interface { ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) + ResolveComponentQuery(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentQuery, error) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) } @@ -222,6 +223,15 @@ func (c *apricotClient) GetComponentConfigurationWithLastIndex(ctx context.Conte return out, nil } +func (c *apricotClient) ResolveComponentQuery(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentQuery, error) { + out := new(ComponentQuery) + err := c.cc.Invoke(ctx, "/apricot.Apricot/ResolveComponentQuery", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) { out := new(ImportComponentConfigurationResponse) err := c.cc.Invoke(ctx, "/apricot.Apricot/ImportComponentConfiguration", in, out, opts...) @@ -257,6 +267,7 @@ type ApricotServer interface { ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) + ResolveComponentQuery(context.Context, *ComponentQuery) (*ComponentQuery, error) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) } @@ -321,6 +332,9 @@ func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *Co func (UnimplementedApricotServer) GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) { return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfigurationWithLastIndex not implemented") } +func (UnimplementedApricotServer) ResolveComponentQuery(context.Context, *ComponentQuery) (*ComponentQuery, error) { + return nil, status.Errorf(codes.Unimplemented, "method ResolveComponentQuery not implemented") +} func (UnimplementedApricotServer) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ImportComponentConfiguration not implemented") } @@ -678,6 +692,24 @@ func _Apricot_GetComponentConfigurationWithLastIndex_Handler(srv interface{}, ct return interceptor(ctx, in, info, handler) } +func _Apricot_ResolveComponentQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ComponentQuery) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).ResolveComponentQuery(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/ResolveComponentQuery", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).ResolveComponentQuery(ctx, req.(*ComponentQuery)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ImportComponentConfigurationRequest) if err := dec(in); err != nil { @@ -779,6 +811,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetComponentConfigurationWithLastIndex", Handler: _Apricot_GetComponentConfigurationWithLastIndex_Handler, }, + { + MethodName: "ResolveComponentQuery", + Handler: _Apricot_ResolveComponentQuery_Handler, + }, { MethodName: "ImportComponentConfiguration", Handler: _Apricot_ImportComponentConfiguration_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 763e78f88..3783cff0f 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -178,6 +178,37 @@ func (m *RpcServer) GetComponentConfigurationWithLastIndex(_ context.Context, re return &apricotpb.ComponentResponseWithLastIndex{Payload: payload, LastIndex: lastIndex}, E_OK.Err() } +func (m *RpcServer) ResolveComponentQuery(_ context.Context, request *apricotpb.ComponentQuery) (*apricotpb.ComponentQuery, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + + if request == nil { + return nil, E_BAD_INPUT + } + + query := &componentcfg.Query{ + Component: request.Component, + RunType: request.RunType, + RoleName: request.MachineRole, + EntryKey: request.Entry, + Timestamp: request.Timestamp, + } + + resolved, err := m.service.ResolveComponentQuery(query) + if err != nil { + return nil, err + } + return &apricotpb.ComponentQuery{ + Component: resolved.Component, + RunType: resolved.RunType, + MachineRole: resolved.RoleName, + Entry: resolved.EntryKey, + Timestamp: resolved.Timestamp, + }, E_OK.Err() +} + func (m *RpcServer) GetDetectorForHost(_ context.Context, request *apricotpb.HostRequest) (*apricotpb.DetectorResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index af9fe8950..f7bb925b0 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -144,6 +144,29 @@ func (c *RemoteService) getComponentConfigurationInternalWithLastIndex(query *co return response.GetPayload(), response.GetLastIndex(), nil } +func (c *RemoteService) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { + var response *apricotpb.ComponentQuery + componentQuery := &apricotpb.ComponentQuery{ + Component: query.Component, + RunType: query.RunType, + MachineRole: query.RoleName, + Entry: query.EntryKey, + Timestamp: query.Timestamp, + } + response, err = c.cli.ResolveComponentQuery(context.Background(), componentQuery, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + resolved = &componentcfg.Query{ + Component: response.Component, + RunType: response.RunType, + RoleName: response.MachineRole, + EntryKey: response.Entry, + Timestamp: response.Timestamp, + } + return resolved, nil +} + func (c *RemoteService) RawGetRecursive(path string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.RawGetRecursiveRequest{RawPath: path} diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 588f20e24..2706426a8 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -26,7 +26,7 @@ package runtype -// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go +// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and apricot.proto // NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. type RunType int diff --git a/configuration/cfgbackend/consulsource.go b/configuration/cfgbackend/consulsource.go index d21da1856..5cf8fad03 100644 --- a/configuration/cfgbackend/consulsource.go +++ b/configuration/cfgbackend/consulsource.go @@ -48,7 +48,7 @@ func NewConsulSource(uri string) (cc *ConsulSource, err error) { } cc = &ConsulSource{ uri: uri, - kv: cli.KV(), + kv: cli.KV(), } return } @@ -117,7 +117,7 @@ func (cc *ConsulSource) GetWithLastIndex(key string) (value string, lastIndex ui return } -func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { +func (cc *ConsulSource) GetKeysByPrefix(keyPrefix string) (keys []string, err error) { // An empty keyPrefix is ok by definition. // If it's non-empty, we must ensure its sanity. if len(keyPrefix) > 0 { @@ -178,12 +178,12 @@ func (cc *ConsulSource) Exists(key string) (exists bool, err error) { } func (cc *ConsulSource) IsDir(key string) (isDir bool) { - kvp, _, err := cc.kv.Get(formatKey(key), nil) + kvp, _, err := cc.kv.Get(strings.TrimSuffix(formatKey(key), "/")+"/", nil) if err != nil { return false } - isDir = kvp == nil - if kvp != nil { + isDir = kvp != nil + if isDir { isDir = strings.HasSuffix(kvp.Key, "/") } return diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 57485ef68..51516f3e6 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -32,15 +32,20 @@ import ( apricotpb "github.com/AliceO2Group/Control/apricot/protos" ) -var ( +const ( + FALLBACK_RUNTYPE = apricotpb.RunType_ANY + + FALLBACK_ROLENAME = "any" +) + +var ( // component /RUNTYPE /rolename /entry @timestamp - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) // component /RUNTYPE /rolename inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) - E_BAD_KEY = errors.New("bad component configuration key format") + E_BAD_KEY = errors.New("bad component configuration key format") ) - func IsStringValidQueryPathWithOptionalTimestamp(input string) bool { return inputFullRegex.MatchString(input) } @@ -138,6 +143,26 @@ func NewQuery(path string) (p *Query, err error) { return p, nil } +func (p *Query) WithFallbackRunType() *Query { + return &Query{ + Component: p.Component, + RunType: FALLBACK_RUNTYPE, + RoleName: p.RoleName, + EntryKey: p.EntryKey, + Timestamp: p.Timestamp, + } +} + +func (p *Query) WithFallbackRoleName() *Query { + return &Query{ + Component: p.Component, + RunType: p.RunType, + RoleName: FALLBACK_ROLENAME, + EntryKey: p.EntryKey, + Timestamp: p.Timestamp, + } +} + func (p *Query) Path() string { path := p.WithoutTimestamp() if len(p.Timestamp) > 0 { diff --git a/configuration/service.go b/configuration/service.go index c167df847..97b544b39 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -49,6 +49,7 @@ type Service interface { ListComponents() (components []string, err error) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) + ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go new file mode 100644 index 000000000..11f60acff --- /dev/null +++ b/configuration/template/dplutil.go @@ -0,0 +1,156 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package template + +import ( + "crypto/sha1" + "encoding/hex" + "fmt" + "os" + "os/exec" + "path/filepath" + "regexp" + "strconv" + "strings" + texttemplate "text/template" + + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/core/repos" +) + +// jitDplGenerate takes a resolved dplCommand as an argument, +// generates the corresponding tasks and workflow +// and returns the resolved dplWorkflow as a string +func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (dplWorkflow string) { + const nMaxExpectedQcPayloads = 2 + var metadata string + + // Match any consul URL + re := regexp.MustCompile(`consul-json://[^ |]*`) + matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) + + // Concatenate the consul LastIndex for each payload in a single string + for _, match := range matches { + // Match any key under components + keyRe := regexp.MustCompile(`components/[^']*`) + consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) + consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") + + // And query for Consul for its LastIndex + newQ, err := componentcfg.NewQuery(consulKey[1]) + _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) + if err != nil { + return fmt.Sprintf("JIT failed trying to query qc consul payload %s : "+err.Error(), + match) + } + metadata += strconv.FormatUint(lastIndex, 10) + } + + // Get the O2 & QualityControl version + o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2 o2-QualityControl") + o2VersionOut, err := o2VersionCmd.Output() + if err != nil { + log.Warn("JIT couldn't get O2 / QualityControl version: " + err.Error()) + } + + // Get the env vars necessary for JIT + jitEnvVars := varStack["jit_env_vars"] + + // Generate a hash out of the concatenation of + // 1) The full DPL command + // 2) The LastIndex of each payload + // 3) The O2 + QualityControl package versions + // 4) The JIT env vars + hash := sha1.New() + hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) + jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) + + // We now have a workflow name made out of a hash that should be unique with respect to + // 1) DPL command and + // 2) Consul payload versions + // 3) O2 + QualityControl package versions + // 4) JIT env vars + // Only generate new tasks & workflows if the files don't exist + // If they exist, hash comparison guarantees validity + if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { + log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) + return jitWorkflowName + } + + // TODO: Before executing we need to check that this is a valid dpl command + // If not, any command may be injected on the aliecs host + // since this will be run as user `aliecs` it might not pose a problem at this point + cmdString := "export " + jitEnvVars + " && " + dplCommand + " --o2-control " + jitWorkflowName + // for some reason the above concatenation may introduce new lines + cmdString = strings.ReplaceAll(cmdString, "\n", " ") + log.Trace("Resolved DPL command: " + cmdString) + dplCmd := exec.Command("bash", "-c", cmdString) + + // execute the DPL command in the repo of the workflow used + dplCmd.Dir = workflowRepo.GetCloneDir() + var dplOut []byte + dplOut, err = dplCmd.CombinedOutput() + log.Trace("DPL command out: " + string(dplOut)) + if err != nil { + return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) + } + + return jitWorkflowName +} + +func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) string { + if dplCommand == "none" { + return "" + } + + // Resolve any templates as part of the DPL command + fields := Fields{WrapPointer(&dplCommand)} + err := fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + if err != nil { + return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + } + + return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh &&"+dplCommand) +} + +func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string) string { + if dplCommandUri == "none" { + return "" + } + + dplCommand, err := workflowRepo.GetDplCommand(dplCommandUri) + if err != nil { + return fmt.Sprintf("Failed to read DPL command from %s : %s\n", dplCommandUri, err.Error()) + } + + // Resolve any templates as part of the DPL command + fields := Fields{WrapPointer(&dplCommand)} + err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + if err != nil { + return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + } + + return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand) +} diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 8f7d60b13..5cf8df413 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -28,7 +28,6 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/AliceO2Group/Control/core/repos" "io" "strings" "text/template" @@ -36,31 +35,49 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/core/repos" "github.com/antonmedv/expr" "github.com/antonmedv/expr/vm" "github.com/sirupsen/logrus" "github.com/valyala/fasttemplate" ) -const DEBUG_TEMPLATE_SYSTEM=false +const DEBUG_TEMPLATE_SYSTEM = false -var log = logger.New(logrus.StandardLogger(),"template") +var log = logger.New(logrus.StandardLogger(), "template") type Sequence map[Stage]Fields type BuildObjectStackFunc func(stage Stage) map[string]interface{} +type StageCallbackFunc func(stage Stage, err error) error // called after each stage template processing, if err != nil the sequence bails + +type RoleDisabledError error + +func NullCallback(_ Stage, err error) error { + return err +} type ConfigurationService interface { GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) + GetDetectorForHost(hostname string) (string, error) GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) (string, error) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) + GetRuntimeEntry(component string, key string) (string, error) + SetRuntimeEntry(component string, key string, value string) error } -func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { +func (sf Sequence) Execute(confSvc ConfigurationService, + parentPath string, + varStack VarStack, + buildObjectStack BuildObjectStackFunc, + stringTemplateCache map[string]template.Template, + workflowRepo repos.IRepo, + stageCallback StageCallbackFunc) (err error) { for i := 0; i < int(_STAGE_MAX); i++ { currentStage := Stage(i) @@ -87,8 +104,14 @@ func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varS }).Trace("about to process fields for stage") } err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache, workflowRepo) + err = stageCallback(currentStage, err) if err != nil { - log.WithError(err).Errorf("template processing error") + if _, isRoleDisabled := err.(RoleDisabledError); isRoleDisabled { + return + } + + log.WithError(err). + Errorf("template processing error") return } } @@ -99,20 +122,22 @@ func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varS type Fields []Field type Stage int + const ( // RESOLUTION STAGE ↓ VALUES AVAILABLE ↓ - STAGE0 Stage = iota // parent stack only + locals - STAGE1 // parent stack + defaults + locals - STAGE2 // parent stack + defaults + vars + locals - STAGE3 // parent stack + defaults + vars + uservars + locals - STAGE4 // parent stack + defaults + vars + uservars + locals + full self-object = full stack + STAGE0 Stage = iota // parent stack only (for enabled) + STAGE1 // parent stack only + locals + STAGE2 // parent stack + defaults + locals + STAGE3 // parent stack + defaults + vars + locals + STAGE4 // parent stack + defaults + vars + uservars + locals + STAGE5 // parent stack + defaults + vars + uservars + locals + full self-object = full stack _STAGE_MAX ) type VarStack struct { - Locals map[string]string + Locals map[string]string Defaults *gera.StringWrapMap - Vars *gera.StringWrapMap + Vars *gera.StringWrapMap UserVars *gera.StringWrapMap } @@ -129,6 +154,8 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri switch stage { case STAGE0: + fallthrough + case STAGE1: defaults, err = vs.Defaults.FlattenedParent() if err != nil { return @@ -141,7 +168,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri if err != nil { return } - case STAGE1: + case STAGE2: defaults, err = vs.Defaults.Flattened() if err != nil { return @@ -154,7 +181,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri if err != nil { return } - case STAGE2: + case STAGE3: defaults, err = vs.Defaults.Flattened() if err != nil { return @@ -167,8 +194,9 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri if err != nil { return } - case STAGE3: fallthrough case STAGE4: + fallthrough + case STAGE5: defaults, err = vs.Defaults.Flattened() if err != nil { return @@ -193,7 +221,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { environment := make(map[string]interface{}, len(varStack)) - strOpStack := MakeStrOperationFuncMap(varStack) + strOpStack := MakeUtilFuncMap(varStack) for k, v := range varStack { environment[k] = v } @@ -223,6 +251,25 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va pluginObjects := MakePluginObjectStack(varStack) copyMap(pluginObjects, environment) + configAccessObj := MakeConfigAccessObject(confSvc, varStack) + copyMap(configAccessObj, environment) + + // We override the "+" operator so that in situations like + // "string" + + // + "string" + // + + // we always treat as string and return a string. + environment["addNil"] = func(a, b *string) string { + first, second := "", "" + if a != nil { + first = *a + } + if b != nil { + second = *b + } + return first + second + } + for _, field := range fields { buf := new(bytes.Buffer) // FIXME: the line below implements the cache @@ -238,14 +285,18 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va } _, err = tmpl.ExecuteFunc(buf, func(w io.Writer, tag string) (i int, err error) { - var( - program *vm.Program + var ( + program *vm.Program rawOutput interface{} ) - program, err = expr.Compile(tag) + program, err = expr.Compile(tag, []expr.Option{ + expr.Env(environment), + expr.Operator("+", "addNil"), + }...) if err != nil { return } + rawOutput, err = expr.Run(program, environment) if err != nil { return diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 68d8aaf3a..84aff2eda 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2022 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -25,27 +25,21 @@ package template import ( - "crypto/sha1" - "encoding/hex" "encoding/json" "errors" "fmt" "io/ioutil" - "os" - "os/exec" - "path/filepath" - "regexp" "strconv" "strings" - texttemplate "text/template" - "time" + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration/componentcfg" + "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/repos" + "github.com/imdario/mergo" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/configuration/componentcfg" - "github.com/AliceO2Group/Control/core/integration" "github.com/sirupsen/logrus" ) @@ -55,201 +49,99 @@ type ToPtreeFunc func(string, string) string type MultiVarConfigAccessFuncs map[string]GetMultiVarConfigFunc type GetMultiVarConfigFunc func(string, string) string -func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]string) ConfigAccessFuncs { - return ConfigAccessFuncs{ - "GetConfigLegacy": func(path string) string { - defer utils.TimeTrack(time.Now(), "GetConfigLegacy", log.WithPrefix("template")) - query, err := componentcfg.NewQuery(path) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - payload, err := confSvc.GetComponentConfiguration(query) - if err != nil { - log.WithError(err). - WithField("path", query.Path()). - Warn("failed to get component configuration") - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - fields := Fields{WrapPointer(&payload)} - err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template), nil) - log.Warn(varStack) - log.Warn(payload) - return payload +func MakeConfigAccessObject(confSvc ConfigurationService, varStack map[string]string) map[string]interface{} { + obj := make(map[string]interface{}) + obj["config"] = map[string]interface{}{ + "Get": func(path string) string { + return getConfig(confSvc, varStack, path) }, - "GetConfig": func(path string) string { - defer utils.TimeTrack(time.Now(), "GetConfig", log.WithPrefix("template")) - query, err := componentcfg.NewQuery(path) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + "GetLegacy": func(path string) string { + return getConfigLegacy(confSvc, varStack, path) + }, + "Resolve": func(component string, runType string, roleName string, entryKey string) string { + rt, ok := apricotpb.RunType_value[runType] + if !ok { + rt = int32(apricotpb.RunType_NULL) } - - payload, err := confSvc.GetAndProcessComponentConfiguration(query, varStack) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + return resolveConfig(confSvc, &componentcfg.Query{ + Component: component, + RunType: apricotpb.RunType(rt), + RoleName: roleName, + EntryKey: entryKey, + Timestamp: "", + }, false) + }, + "ResolveWithTimestamp": func(component string, runType string, roleName string, entryKey string) string { + rt, ok := apricotpb.RunType_value[runType] + if !ok { + rt = int32(apricotpb.RunType_NULL) } - - log.Warn(varStack) - log.Warn(payload) - return payload + return resolveConfig(confSvc, &componentcfg.Query{ + Component: component, + RunType: apricotpb.RunType(rt), + RoleName: roleName, + EntryKey: entryKey, + Timestamp: "", + }, true) + }, + "ResolvePath": func(path string) string { + return resolveConfigPath(confSvc, path, false) }, + "ResolvePathWithTimestamp": func(path string) string { + return resolveConfigPath(confSvc, path, true) + }, + } + obj["inventory"] = map[string]interface{}{ "DetectorForHost": func(hostname string) string { - payload, err := confSvc.GetDetectorForHost(hostname) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - return payload + return detectorForHost(confSvc, hostname) }, "DetectorsForHosts": func(hosts string) string { - defer utils.TimeTrack(time.Now(), "DetectorsForHosts", log.WithPrefix("template")) - hostsSlice := make([]string, 0) - // first we convert the incoming string treated as JSON list into a []string - bytes := []byte(hosts) - err := json.Unmarshal(bytes, &hostsSlice) - if err != nil { - return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) - } - - payload, err := confSvc.GetDetectorsForHosts(hostsSlice) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - // and back to JSON list for the active detectors slice - bytes, err = json.Marshal(payload) - if err != nil { - return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) - } - outString := string(bytes) - - return outString + return detectorsForHosts(confSvc, hosts) }, "CRUCardsForHost": func(hostname string) string { - defer utils.TimeTrack(time.Now(), "CRUCardsForHost", log.WithPrefix("template")) - payload, err := confSvc.GetCRUCardsForHost(hostname) - if err != nil { - return fmt.Sprintf("[\"error: %s\"]", err.Error()) - } - return payload + return cruCardsForHost(confSvc, hostname) + }, + "EndpointsForCRUCard": func(hostname, cardSerial string) string { + return endpointsForCruCard(confSvc, hostname, cardSerial) }, } -} - -func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { - // jitDplGenerate takes a resolved dplCommand as an argument, - // generates the corresponding tasks and workflow - // and returns the resolved dplWorkflow as a string - jitDplGenerate := func(dplCommand string) (dplWorkflow string) { - const nMaxExpectedQcPayloads = 2 - var metadata string - - // Match any consul URL - re := regexp.MustCompile(`consul-json://[^ |]*`) - matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) - - // Concatenate the consul LastIndex for each payload in a single string - for _, match := range matches { - // Match any key under components - keyRe := regexp.MustCompile(`components/[^']*`) - consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) - consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") - - // And query for Consul for its LastIndex - newQ, err := componentcfg.NewQuery(consulKey[1]) - _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) - if err != nil { - return fmt.Sprintf("JIT failed trying to query qc consul payload %s : "+err.Error(), - match) - } - metadata += strconv.FormatUint(lastIndex, 10) - } - - // Get the O2 & QualityControl version - o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2 o2-QualityControl") - o2VersionOut, err := o2VersionCmd.Output() - if err != nil { - log.Warn("JIT couldn't get O2 / QualityControl version: " + err.Error()) - } - - // Get the env vars necessary for JIT - jitEnvVars := varStack["jit_env_vars"] - - // Generate a hash out of the concatenation of - // 1) The full DPL command - // 2) The LastIndex of each payload - // 3) The O2 + QualityControl package versions - // 4) The JIT env vars - hash := sha1.New() - hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) - jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) - - // We now have a workflow name made out of a hash that should be unique with respect to - // 1) DPL command and - // 2) Consul payload versions - // 3) O2 + QualityControl package versions - // 4) JIT env vars - // Only generate new tasks & workflows if the files don't exist - // If they exist, hash comparison guarantees validity - if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { - log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) - return jitWorkflowName - } - - // TODO: Before executing we need to check that this is a valid dpl command - // If not, any command may be injected on the aliecs host - // since this will be run as user `aliecs` it might not pose a problem at this point - cmdString := "export " + jitEnvVars + " && " + dplCommand + " --o2-control " + jitWorkflowName - // for some reason the above concatenation may introduce new lines - cmdString = strings.ReplaceAll(cmdString, "\n", " ") - log.Trace("Resolved DPL command: " + cmdString) - dplCmd := exec.Command("bash", "-c", cmdString) - - // execute the DPL command in the repo of the workflow used - dplCmd.Dir = workflowRepo.GetCloneDir() - var dplOut []byte - dplOut, err = dplCmd.CombinedOutput() - log.Trace("DPL command out: " + string(dplOut)) - if err != nil { - return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) - } - - return jitWorkflowName + obj["runtime"] = map[string]interface{}{ + "Get": func(component string, key string) string { + return getRuntimeConfig(confSvc, component, key) + }, + "Set": func(component string, key string, value string) string { + return setRuntimeConfig(confSvc, component, key, value) + }, } + return obj +} - return map[string]interface{}{ - "GenerateDplSubworkflow": func(dplCommand string) string { - if dplCommand == "none" { - return "" - } - - // Resolve any templates as part of the DPL command - fields := Fields{WrapPointer(&dplCommand)} - err := fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) - if err != nil { - return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) - } - - return jitDplGenerate("source /etc/profile.d/o2.sh &&" + dplCommand) +// deprecated +func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]string) ConfigAccessFuncs { + return ConfigAccessFuncs{ + "GetConfigLegacy": func(path string) string { + log.WithPrefix("template").Warn("GetConfigLegacy is deprecated, use config.GetLegacy instead") + return getConfigLegacy(confSvc, varStack, path) }, - "GenerateDplSubworkflowFromUri": func(dplCommandUri string) string { - if dplCommandUri == "none" { - return "" - } - - dplCommand, err := workflowRepo.GetDplCommand(dplCommandUri) - if err != nil { - return fmt.Sprintf("Failed to read DPL command from %s : %s\n", dplCommandUri, err.Error()) - } - - // Resolve any templates as part of the DPL command - fields := Fields{WrapPointer(&dplCommand)} - err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) - if err != nil { - return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) - } - - return jitDplGenerate("source /etc/profile.d/o2.sh && " + dplCommand) + "GetConfig": func(path string) string { + log.WithPrefix("template").Warn("GetConfig is deprecated, use config.Get instead") + return getConfig(confSvc, varStack, path) + }, + "ResolveConfigPath": func(path string) string { + log.WithPrefix("template").Warn("ResolveConfigPath is deprecated, use config.ResolvePath instead") + return resolveConfigPath(confSvc, path, false) + }, + "DetectorForHost": func(hostname string) string { + log.WithPrefix("template").Warn("DetectorForHost is deprecated, use inventory.DetectorForHost instead") + return detectorForHost(confSvc, hostname) + }, + "DetectorsForHosts": func(hosts string) string { + log.WithPrefix("template").Warn("DetectorsForHosts is deprecated, use inventory.DetectorsForHosts instead") + return detectorsForHosts(confSvc, hosts) + }, + "CRUCardsForHost": func(hostname string) string { + log.WithPrefix("template").Warn("CRUCardsForHost is deprecated, use inventory.CRUCardsForHost instead") + return cruCardsForHost(confSvc, hostname) }, } } @@ -257,22 +149,12 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str func MakeConfigAccessFuncsMultiVar(confSvc ConfigurationService, varStack map[string]string) MultiVarConfigAccessFuncs { return MultiVarConfigAccessFuncs{ "EndpointsForCRUCard": func(hostname, cardSerial string) string { - defer utils.TimeTrack(time.Now(), "EndpointsForCRUCard", log.WithPrefix("template")) - payload, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - return payload + log.WithPrefix("template").Warn("EndpointsForCRUCard is deprecated, use inventory.EndpointsForCRUCard instead") + return endpointsForCruCard(confSvc, hostname, cardSerial) }, "GetRuntimeConfig": func(component string, key string) string { - defer utils.TimeTrack(time.Now(), "GetRuntimeConfig", log.WithPrefix("template")) - - payload, err := confSvc.GetRuntimeEntry(component, key) - if err != nil { - return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) - } - - return payload + log.WithPrefix("template").Warn("GetRuntimeConfig is deprecated, use runtime.Get instead") + return getRuntimeConfig(confSvc, component, key) }, } } @@ -281,6 +163,27 @@ func MakePluginObjectStack(varStack map[string]string) map[string]interface{} { return integration.PluginsInstance().ObjectStack(varStack) } +func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { + return map[string]interface{}{ + "GenerateDplSubworkflow": func(dplCommand string) string { + log.WithPrefix("template").Warn("GenerateDplSubworkflow is deprecated, use dpl.Generate instead") + return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) + }, + "GenerateDplSubworkflowFromUri": func(dplCommandUri string) string { + log.WithPrefix("template").Warn("GenerateDplSubworkflowFromUri is deprecated, use dpl.GenerateFromUri instead") + return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) + }, + "dpl": map[string]interface{}{ + "Generate": func(dplCommand string) string { + return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) + }, + "GenerateFromUri": func(dplCommandUri string) string { + return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) + }, + }, + } +} + func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPtreeFunc { return func(payload string, syntax string) string { // This function is a no-op with respect to the payload, but it stores the payload @@ -304,8 +207,9 @@ func MakeToPtreeFunc(varStack map[string]string, propMap map[string]string) ToPt } } -func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} { - return map[string]interface{}{ +func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { + legacy := make(map[string]interface{}) + stringsMap := map[string]interface{}{ "Atoi": func(in string) (out int) { var err error out, err = strconv.Atoi(in) @@ -335,7 +239,11 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} out = strings.ToLower(in) return }, - "FromJson": func(in string) (out interface{}) { + } + _ = mergo.Merge(&legacy, stringsMap) + + jsonMap := map[string]interface{}{ + "Unmarshal": func(in string) (out interface{}) { bytes := []byte(in) err := json.Unmarshal(bytes, &out) log.WithFields(logrus.Fields{ @@ -349,7 +257,7 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} } return }, - "ToJson": func(in interface{}) (out string) { + "Marshal": func(in interface{}) (out string) { bytes, err := json.Marshal(in) if err != nil { log.WithError(err).Warn("error marshaling JSON/YAML in template system") @@ -358,9 +266,21 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} out = string(bytes) return }, - "NewID": func() (out string) { + } + jsonMap["Deserialize"] = jsonMap["Unmarshal"] + jsonMap["Serialize"] = jsonMap["Marshal"] + + legacy["FromJson"] = jsonMap["Unmarshal"] + legacy["ToJson"] = jsonMap["Marshal"] + + uidMap := map[string]interface{}{ + "New": func() (out string) { return uid.New().String() }, + } + legacy["NewID"] = uidMap["New"] + + utilMap := map[string]interface{}{ "PrefixedOverride": func(varname, prefix string) string { prefixed, prefixedOk := varStack[prefix+"_"+varname] fallback, fallbackOk := varStack[varname] @@ -390,5 +310,19 @@ func MakeStrOperationFuncMap(varStack map[string]string) map[string]interface{} } return in }, + "Nullable": func(in *string) string { + if in == nil { + return "" + } + return *in + }, } + _ = mergo.Merge(&legacy, utilMap) + + legacy["strings"] = stringsMap + legacy["json"] = jsonMap + legacy["uid"] = uidMap + legacy["util"] = utilMap + + return legacy } diff --git a/configuration/template/stackutil.go b/configuration/template/stackutil.go new file mode 100644 index 000000000..c09326684 --- /dev/null +++ b/configuration/template/stackutil.go @@ -0,0 +1,180 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package template + +import ( + "encoding/json" + "fmt" + texttemplate "text/template" + "time" + + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/configuration/componentcfg" +) + +func getConfigLegacy(confSvc ConfigurationService, varStack map[string]string, path string) string { + defer utils.TimeTrack(time.Now(), "GetConfigLegacy", log.WithPrefix("template")) + query, err := componentcfg.NewQuery(path) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + payload, err := confSvc.GetComponentConfiguration(query) + if err != nil { + log.WithError(err). + WithField("path", query.Path()). + Warn("failed to get component configuration") + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + fields := Fields{WrapPointer(&payload)} + err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template), nil) + log.Warn(varStack) + log.Warn(payload) + return payload +} + +func getConfig(confSvc ConfigurationService, varStack map[string]string, path string) string { + defer utils.TimeTrack(time.Now(), "GetConfig", log.WithPrefix("template")) + query, err := componentcfg.NewQuery(path) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + payload, err := confSvc.GetAndProcessComponentConfiguration(query, varStack) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + log.Warn(varStack) + log.Warn(payload) + return payload +} + +func resolveConfig(confSvc ConfigurationService, query *componentcfg.Query, withTimestamp bool) string { + defer utils.TimeTrack(time.Now(), "ResolveConfig", log.WithPrefix("template")) + var resolved *componentcfg.Query + resolved, err := confSvc.ResolveComponentQuery(query) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + if withTimestamp { + return resolved.Raw() + } + return resolved.WithoutTimestamp() +} + +func resolveConfigPath(confSvc ConfigurationService, path string, withTimestamp bool) string { + defer utils.TimeTrack(time.Now(), "ResolveConfigPath", log.WithPrefix("template")) + query, err := componentcfg.NewQuery(path) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + var resolved *componentcfg.Query + resolved, err = confSvc.ResolveComponentQuery(query) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + if withTimestamp { + return resolved.Raw() + } + return resolved.WithoutTimestamp() +} + +func detectorForHost(confSvc ConfigurationService, hostname string) string { + payload, err := confSvc.GetDetectorForHost(hostname) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + return payload +} + +func detectorsForHosts(confSvc ConfigurationService, hosts string) string { + defer utils.TimeTrack(time.Now(), "DetectorsForHosts", log.WithPrefix("template")) + hostsSlice := make([]string, 0) + // first we convert the incoming string treated as JSON list into a []string + bytes := []byte(hosts) + err := json.Unmarshal(bytes, &hostsSlice) + if err != nil { + return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) + } + + payload, err := confSvc.GetDetectorsForHosts(hostsSlice) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + // and back to JSON list for the active detectors slice + bytes, err = json.Marshal(payload) + if err != nil { + return fmt.Sprintf("{\"error\":\"DetectorsForHosts function: %s\"}", err.Error()) + } + outString := string(bytes) + + return outString +} + +func cruCardsForHost(confSvc ConfigurationService, hostname string) string { + defer utils.TimeTrack(time.Now(), "CRUCardsForHost", log.WithPrefix("template")) + payload, err := confSvc.GetCRUCardsForHost(hostname) + if err != nil { + return fmt.Sprintf("[\"error: %s\"]", err.Error()) + } + return payload +} + +func endpointsForCruCard(confSvc ConfigurationService, hostname string, cardSerial string) string { + defer utils.TimeTrack(time.Now(), "EndpointsForCRUCard", log.WithPrefix("template")) + payload, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + return payload +} + +func getRuntimeConfig(confSvc ConfigurationService, component string, key string) string { + defer utils.TimeTrack(time.Now(), "GetRuntimeConfig", log.WithPrefix("template")) + + payload, err := confSvc.GetRuntimeEntry(component, key) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + return payload +} + +func setRuntimeConfig(confSvc ConfigurationService, component, key, value string) string { + defer utils.TimeTrack(time.Now(), "SetRuntimeConfig", log.WithPrefix("template")) + + err := confSvc.SetRuntimeEntry(component, key, value) + if err != nil { + return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) + } + + return value +} diff --git a/core/task/task.go b/core/task/task.go index c65010dc6..3641e3616 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -278,6 +278,14 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { detector = "" } + // We first build the task-specific special values, and write them into the varStack, overwriting anything + // coming from this task's parent role. However, these values can still be overwritten by subsequent + // Defaults/Vars processing within the task template. + specialVarStack := t.buildSpecialVarStack(role) + for k, v := range specialVarStack { + varStack[k] = v + } + // We make a copy of the Defaults/Vars maps from the taskClass, this is necessary because // entries may be templated, so they may resolve to different values in each task. localDefaults := class.Defaults.Copy().Raw() @@ -321,13 +329,6 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return } - // Finally we build the task-specific special values, and write them - // into the varStack (overwriting anything). - specialVarStack := t.buildSpecialVarStack(role) - for k, v := range specialVarStack { - varStack[k] = v - } - // Prepare the fields to be subject to templating fields := append( template.Fields{ diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index b33b57a58..8f8d93879 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -105,16 +105,18 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf } templSequence := template.Sequence{ - template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), - template.STAGE1: template.WrapMapItems(r.Vars.Raw()), - template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), - template.STAGE3: template.Fields{ + template.STAGE0: template.Fields{ + template.WrapPointer(&r.Enabled), + }, + template.STAGE1: template.WrapMapItems(r.Defaults.Raw()), + template.STAGE2: template.WrapMapItems(r.Vars.Raw()), + template.STAGE3: template.WrapMapItems(r.UserVars.Raw()), + template.STAGE4: template.Fields{ template.WrapPointer(&r.Name), }, - template.STAGE4: append(append( + template.STAGE5: append(append( WrapConstraints(r.Constraints), - r.wrapBindAndConnectFields()...), - template.WrapPointer(&r.Enabled)), + r.wrapBindAndConnectFields()...)), } // TODO: push cached templates here @@ -123,9 +125,13 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf Defaults: r.Defaults, Vars: r.Vars, UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) if err != nil { - return + if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + err = nil // we don't want a disabled role to be considered an error + } else { + return + } } // After template processing we write the Locals to Vars in order to make them available to children @@ -135,13 +141,18 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf r.Enabled = strings.TrimSpace(r.Enabled) + // TREE PRUNING: we don't continue with children if this role is disabled + if !r.IsEnabled() { + r.Roles = make([]Role, 0) + } + // Process templates for child roles for _, role := range r.Roles { - role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) - if err != nil { - return - } + role.setParent(r) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } } // If any child is not Enabled after template resolution, diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index bbc1bc781..79f08b5c0 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -142,10 +142,13 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF } templSequence := template.Sequence{ - template.STAGE0: template.WrapMapItems(t.Defaults.Raw()), - template.STAGE1: template.WrapMapItems(t.Vars.Raw()), - template.STAGE2: template.WrapMapItems(t.UserVars.Raw()), - template.STAGE3: template.Fields{ + template.STAGE0: template.Fields{ + template.WrapPointer(&t.Enabled), + }, + template.STAGE1: template.WrapMapItems(t.Defaults.Raw()), + template.STAGE2: template.WrapMapItems(t.Vars.Raw()), + template.STAGE3: template.WrapMapItems(t.UserVars.Raw()), + template.STAGE4: template.Fields{ template.WrapPointer(&t.Name), template.WrapPointer(&t.FuncCall), template.WrapPointer(&t.ReturnVar), @@ -153,7 +156,7 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF template.WrapPointer(&t.Trigger), template.WrapPointer(&t.Await), }, - template.STAGE4: append(append( + template.STAGE5: append(append( WrapConstraints(t.Constraints), t.wrapBindAndConnectFields()...), template.WrapPointer(&t.Enabled)), @@ -171,9 +174,14 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, + MakeDisabledRoleCallback(t), ) if err != nil { - return + if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + err = nil // we don't want a disabled role to be considered an error + } else { + return + } } // After template processing we write the Locals to Vars in order to make them available to children diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 27d2bf2cb..32fb64142 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -41,7 +41,7 @@ import ( type includeRole struct { aggregatorRole - Include string `yaml:"include,omitempty"` + Include string `yaml:"include,omitempty"` } func (r *includeRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -53,8 +53,8 @@ func (r *includeRole) UnmarshalYAML(unmarshal func(interface{}) error) (err erro return } - type auxInclude struct{ - Include string `yaml:"include,omitempty"` + type auxInclude struct { + Include string `yaml:"include,omitempty"` } _auxInclude := auxInclude{} err = unmarshal(&_auxInclude) @@ -67,10 +67,9 @@ func (r *includeRole) UnmarshalYAML(unmarshal func(interface{}) error) (err erro roleBase: innerRoleBase, aggregator: aggregator{}, }, - Include: _auxInclude.Include, + Include: _auxInclude.Include, } - *r = role return } @@ -85,14 +84,17 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow } templSequence := template.Sequence{ - template.STAGE0: template.WrapMapItems(r.Defaults.Raw()), - template.STAGE1: template.WrapMapItems(r.Vars.Raw()), - template.STAGE2: template.WrapMapItems(r.UserVars.Raw()), - template.STAGE3: template.Fields{ + template.STAGE0: template.Fields{ + template.WrapPointer(&r.Enabled), + }, + template.STAGE1: template.WrapMapItems(r.Defaults.Raw()), + template.STAGE2: template.WrapMapItems(r.Vars.Raw()), + template.STAGE3: template.WrapMapItems(r.UserVars.Raw()), + template.STAGE4: template.Fields{ template.WrapPointer(&r.Name), template.WrapPointer(&r.Include), }, - template.STAGE4: append(append( + template.STAGE5: append(append( WrapConstraints(r.Constraints), r.wrapBindAndConnectFields()...), template.WrapPointer(&r.Enabled)), @@ -104,9 +106,13 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow Defaults: r.Defaults, Vars: r.Vars, UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) + }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) if err != nil { - return + if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + err = nil // we don't want a disabled role to be considered an error + } else { + return + } } // After template processing we write the Locals to Vars in order to make them available to children @@ -154,20 +160,20 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) } -func (r* includeRole) UpdateStatus(s task.Status) { +func (r *includeRole) UpdateStatus(s task.Status) { r.updateStatus(s) } -func (r* includeRole) UpdateState(s task.State) { +func (r *includeRole) UpdateState(s task.State) { r.updateState(s) } func (r *includeRole) copy() copyable { rCopy := includeRole{ aggregatorRole: *r.aggregatorRole.copy().(*aggregatorRole), - Include: r.Include, + Include: r.Include, } - rCopy.status = SafeStatus{status:rCopy.GetStatus()} - rCopy.state = SafeState{state:rCopy.GetState()} + rCopy.status = SafeStatus{status: rCopy.GetStatus()} + rCopy.state = SafeState{state: rCopy.GetState()} return &rCopy } diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 1d7c1c529..1a3f8a36b 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -25,6 +25,8 @@ package workflow import ( + "fmt" + "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task/constraint" ) @@ -50,7 +52,7 @@ func GetRoot(role Role) (root Role) { return nil } current := role - for ;; { + for { if parent := current.GetParentRole(); parent != nil { // if there's a parent, we go up current = parent @@ -98,3 +100,15 @@ func LeafWalk(root Role, do func(role Role)) { } } + +func MakeDisabledRoleCallback(r Role) func(stage template.Stage, err error) error { + return func(stage template.Stage, err error) error { + if stage == template.STAGE0 { // only `enabled` has been processed so far + if !r.IsEnabled() { + var rde template.RoleDisabledError = fmt.Errorf("role %s disabled", r.GetPath()) + return rde + } + } + return err + } +} diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 1519b3274..67d0d3f28 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -138,20 +138,22 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF } templSequence := template.Sequence{ - template.STAGE0: template.WrapMapItems(t.Defaults.Raw()), - template.STAGE1: template.WrapMapItems(t.Vars.Raw()), - template.STAGE2: template.WrapMapItems(t.UserVars.Raw()), - template.STAGE3: template.Fields{ + template.STAGE0: template.Fields{ + template.WrapPointer(&t.Enabled), + }, + template.STAGE1: template.WrapMapItems(t.Defaults.Raw()), + template.STAGE2: template.WrapMapItems(t.Vars.Raw()), + template.STAGE3: template.WrapMapItems(t.UserVars.Raw()), + template.STAGE4: template.Fields{ template.WrapPointer(&t.Name), template.WrapPointer(&t.LoadTaskClass), template.WrapPointer(&t.Timeout), template.WrapPointer(&t.Trigger), template.WrapPointer(&t.Await), }, - template.STAGE4: append(append( + template.STAGE5: append(append( WrapConstraints(t.Constraints), - t.wrapBindAndConnectFields()...), - template.WrapPointer(&t.Enabled)), + t.wrapBindAndConnectFields()...)), } // FIXME: push cached templates here @@ -160,9 +162,13 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF Defaults: t.Defaults, Vars: t.Vars, UserVars: t.UserVars, - }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo) + }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(t)) if err != nil { - return + if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + err = nil // we don't want a disabled role to be considered an error + } else { + return + } } // After template processing we write the Locals to Vars in order to make them available to children @@ -172,6 +178,10 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF t.Enabled = strings.TrimSpace(t.Enabled) + if !t.IsEnabled() { + return + } + t.resolveTaskClassIdentifier(workflowRepo) return From 1578a2fa19d97028e7d99abb8e3f61103bdd92d9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 22 Aug 2022 14:05:35 +0200 Subject: [PATCH 1389/2352] [build] Bump to v0.50.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 65e248e4e..cc488ef86 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 49 +VERSION_MINOR := 50 VERSION_PATCH := 0 From fa7f3c01b2b83d9cb7839abd75268a6946ada88d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Aug 2022 11:56:41 +0200 Subject: [PATCH 1390/2352] [core] Slightly improved error output --- core/environment/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 56a205528..f5fbc173c 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -194,13 +194,13 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Ensure we provide a very defaulty `detectors` variable detectors, err := the.ConfSvc().GetDetectorsForHosts(env.GetFLPs()) if err != nil { - err = fmt.Errorf("cannot load workflow template: %w", err) + err = fmt.Errorf("cannot acquire detectors in loaded workflow template: %w", err) return env.id, err } detectorsStr, err := SliceToJSONSlice(detectors) if err != nil { - err = fmt.Errorf("cannot load workflow template: %w", err) + err = fmt.Errorf("cannot process detectors in loaded workflow template: %w", err) return env.id, err } From 2107a768d0bd4ded04442e8a44de2bc5170cac92 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Aug 2022 15:37:56 +0200 Subject: [PATCH 1391/2352] [core] Correct template error handling when a role is disabled --- configuration/template/fields.go | 12 ++++++++++-- core/integration/odc/plugin.go | 4 ++++ core/workflow/aggregatorrole.go | 3 ++- core/workflow/callrole.go | 3 ++- core/workflow/includerole.go | 3 ++- core/workflow/roleutils.go | 4 +--- core/workflow/taskrole.go | 3 ++- 7 files changed, 23 insertions(+), 9 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 5cf8df413..b7f184b2c 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -27,6 +27,7 @@ package template import ( "bytes" "encoding/json" + "errors" "fmt" "io" "strings" @@ -50,7 +51,13 @@ type Sequence map[Stage]Fields type BuildObjectStackFunc func(stage Stage) map[string]interface{} type StageCallbackFunc func(stage Stage, err error) error // called after each stage template processing, if err != nil the sequence bails -type RoleDisabledError error +type RoleDisabledError struct { + RolePath string +} + +func (e *RoleDisabledError) Error() string { + return fmt.Sprintf("role %s disabled", e.RolePath) +} func NullCallback(_ Stage, err error) error { return err @@ -106,7 +113,8 @@ func (sf Sequence) Execute(confSvc ConfigurationService, err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache, workflowRepo) err = stageCallback(currentStage, err) if err != nil { - if _, isRoleDisabled := err.(RoleDisabledError); isRoleDisabled { + var roleDisabledErrorType *RoleDisabledError + if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { return } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2ccb88dbe..a2c59d623 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -377,6 +377,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter detectorsSlice, err := p.parseDetectors(pdpDetectorList) if err != nil { log.WithField("partition", envId). + WithField("detectorList", pdpDetectorList). WithField("call", "GenerateEPNWorkflowScript"). Error("cannot parse general detector list") return @@ -403,6 +404,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter detectorsSlice, err := p.parseDetectors(pdpDetectorListQc) if err != nil { log.WithField("partition", envId). + WithField("detectorList", pdpDetectorListQc). WithField("call", "GenerateEPNWorkflowScript"). Error("cannot parse general detector list") return @@ -429,6 +431,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter detectorsSlice, err := p.parseDetectors(pdpDetectorListCalib) if err != nil { log.WithField("partition", envId). + WithField("detectorList", pdpDetectorListCalib). WithField("call", "GenerateEPNWorkflowScript"). Error("cannot parse general detector list") return @@ -898,6 +901,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments["detectors"] = strings.Join(detectorsSlice, ",") } else { log.WithField("partition", envId). + WithField("detectorList", detectorsSlice). WithField("call", "Configure"). Warn("cannot parse general detector list") } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 8f8d93879..8c6d75f65 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -127,7 +127,8 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf UserVars: r.UserVars, }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) if err != nil { - if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + var roleDisabledErrorType *template.RoleDisabledError + if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 79f08b5c0..93b13ce26 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -177,7 +177,8 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF MakeDisabledRoleCallback(t), ) if err != nil { - if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + var roleDisabledErrorType *template.RoleDisabledError + if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 32fb64142..c71fb559d 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -108,7 +108,8 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow UserVars: r.UserVars, }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) if err != nil { - if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + var roleDisabledErrorType *template.RoleDisabledError + if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 1a3f8a36b..4ad27e08f 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -25,8 +25,6 @@ package workflow import ( - "fmt" - "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task/constraint" ) @@ -105,7 +103,7 @@ func MakeDisabledRoleCallback(r Role) func(stage template.Stage, err error) erro return func(stage template.Stage, err error) error { if stage == template.STAGE0 { // only `enabled` has been processed so far if !r.IsEnabled() { - var rde template.RoleDisabledError = fmt.Errorf("role %s disabled", r.GetPath()) + rde := &template.RoleDisabledError{RolePath: r.GetPath()} return rde } } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 67d0d3f28..e46297e06 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -164,7 +164,8 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF UserVars: t.UserVars, }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(t)) if err != nil { - if _, isRoleDisabled := err.(template.RoleDisabledError); isRoleDisabled { + var roleDisabledErrorType *template.RoleDisabledError + if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { err = nil // we don't want a disabled role to be considered an error } else { return From e283ced02bbcf6ace23ececd6a9c0528e4e9436a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Aug 2022 15:38:26 +0200 Subject: [PATCH 1392/2352] Allow odc.GenerateEPNTopologyFullname in the root role --- core/integration/plugin.go | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 2f3bd23c1..3c73a8045 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -36,8 +36,8 @@ import ( var log = logger.New(logrus.StandardLogger(), "integration") var ( - once sync.Once - instance Plugins + once sync.Once + instance Plugins loaderOnce sync.Once pluginLoaders map[string]func() Plugin @@ -53,14 +53,14 @@ type Plugin interface { GetData(environmentIds []uid.ID) string Init(instanceId string) error - CallStack(data interface{}) map[string]interface{} // used in hook call context + CallStack(data interface{}) map[string]interface{} // used in hook call context ObjectStack(varStack map[string]string) map[string]interface{} // all other ProcessTemplates contexts Destroy() error } type NewFunc func(endpoint string) Plugin -func RegisteredPlugins() map[string] func() Plugin { +func RegisteredPlugins() map[string]func() Plugin { return pluginLoaders } @@ -116,6 +116,14 @@ func (p Plugins) CallStack(data interface{}) (stack map[string]interface{}) { func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) + + //HACK: this is a dummy object+function to allow odc.GenerateEPNTopologyFullname in the root role + stack["odc"] = map[string]interface{}{ + "GenerateEPNTopologyFullname": func() string { + return "" + }, + } + for _, plugin := range p { s := plugin.ObjectStack(varStack) stack[plugin.GetName()] = s From e46495dce94885fe6d164681c4b3a6b5ca5a4d2c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Aug 2022 15:38:59 +0200 Subject: [PATCH 1393/2352] [build] Bump to v0.50.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cc488ef86..6e8687c3e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 50 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From dce9dc1944bb0453efb9c354d29440cf46df597d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Aug 2022 15:00:54 +0200 Subject: [PATCH 1394/2352] [core] Handle early WF failure + fail explicitly on BuildTaskCommand --- core/environment/manager.go | 5 +++-- core/task/scheduler.go | 2 +- core/task/task.go | 16 +++++++++++++--- core/workflow/aggregatorrole.go | 1 + core/workflow/callrole.go | 1 + core/workflow/includerole.go | 1 + core/workflow/taskrole.go | 1 + 7 files changed, 21 insertions(+), 6 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index f5fbc173c..f04448cf5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -254,12 +254,13 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("level", infologger.IL_Devel). Warn("environment deployment and configuration error, cleanup in progress") - err = env.TryTransition(NewGoErrorTransition( + errTxErr := env.TryTransition(NewGoErrorTransition( envs.taskman), ) - if err != nil { + if errTxErr != nil { log.WithField("partition", env.Id().String()). WithField("state", envState). + WithError(errTxErr). Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") } envTasks := env.Workflow().GetTasks() diff --git a/core/task/scheduler.go b/core/task/scheduler.go index be687ec45..16de28053 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -702,7 +702,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize - err := taskPtr.BuildTaskCommand(descriptor.TaskRole) + err = taskPtr.BuildTaskCommand(descriptor.TaskRole) if err != nil { log.WithPrefix("scheduler"). WithField("offerId", offer.ID.Value). diff --git a/core/task/task.go b/core/task/task.go index 3641e3616..215f93cf1 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -300,9 +300,17 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { WithField("partition", role.GetEnvironmentId().String()). WithField("detector", detector). Error("cannot resolve templates for task defaults") + return fmt.Errorf("cannot resolve templates for task defaults: %w", err) } varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) + if err != nil { + log.WithError(err). + WithField("partition", role.GetEnvironmentId().String()). + WithField("detector", detector). + Error("cannot fetch task class defaults for task command info") + return fmt.Errorf("cannot fetch task class defaults for task command info: %w", err) + } localVars := class.Vars.Copy().Raw() @@ -316,6 +324,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { WithField("partition", role.GetEnvironmentId().String()). WithField("detector", detector). Error("cannot resolve templates for task vars") + return fmt.Errorf("cannot resolve templates for task vars: %w", err) } // We wrap the parent varStack around the task's already processed Defaults, @@ -325,8 +334,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). WithField("detector", detector). - Error("cannot fetch task class defaults for task command info") - return + Error("cannot fetch task class vars for task command info") + return fmt.Errorf("cannot fetch task class vars for task command info: %w", err) } // Prepare the fields to be subject to templating @@ -349,7 +358,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). WithField("detector", detector). - Error("cannot resolve templates for task command info") + Error("cannot resolve templates for task command info fields") + return fmt.Errorf("cannot resolve templates for task command info fields: %w", err) } } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 8c6d75f65..fe304d56c 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -129,6 +129,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { + log.WithField("partition", r.GetEnvironmentId().String()).Info(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 93b13ce26..3d45e1deb 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -179,6 +179,7 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { + log.WithField("partition", t.GetEnvironmentId().String()).Info(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index c71fb559d..642f9d5a0 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -110,6 +110,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { + log.WithField("partition", r.GetEnvironmentId().String()).Info(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index e46297e06..ccedd029a 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -166,6 +166,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { + log.WithField("partition", t.GetEnvironmentId().String()).Info(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return From fec718e54e5e3af9723c6e89bbe8b3998c58a5d2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Aug 2022 15:19:31 +0200 Subject: [PATCH 1395/2352] [build] Bump to v0.50.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6e8687c3e..f3eb39311 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 50 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From f89b5b435ddd25cbad4b18273c9a18a971879c33 Mon Sep 17 00:00:00 2001 From: George R Date: Tue, 23 Aug 2022 11:53:04 +0200 Subject: [PATCH 1396/2352] Add more fields to Bookkeeping Plugin * pdp_workflow_parameters * pdp_beam_type * readout_cfg_uri --- core/integration/bookkeeping/api.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 9b97f0ac1..37789172d 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -85,7 +85,7 @@ func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns return err } -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string, odcTopologyFullname string) error { +func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string, odcTopologyFullname string, pdpParameters string, pdpBeam string, readoutUri string) error { var runquality sw.RunQuality switch runResult { case string(sw.GOOD_RunQuality): @@ -144,7 +144,7 @@ func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO } } - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname) + _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) return err } From a20736bc7ec931a5027547a18a54ebc85e43c96a Mon Sep 17 00:00:00 2001 From: George R Date: Tue, 23 Aug 2022 11:56:09 +0200 Subject: [PATCH 1397/2352] Update Bookkeeping plugin with new fields --- core/integration/bookkeeping/plugin.go | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index fea83a3eb..15455ad16 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -359,6 +359,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } tfbMode := env.GetKV("", "tfb_dd_mode") + pdpParameters, ok := varStack["pdp_workflow_parameters"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP workflow parameters") + } + pdpBeam, ok := varStack["pdp_beam_type"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP beam type") + } + odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") if !ok { log.WithField("runNumber", runNumber64). @@ -368,7 +383,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } lhcPeriod := env.GetKV("", "lhc_period") - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname) + readoutUri, ok := varStack["readout_cfg_uri"] + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). From 0281edc03afa2b03fd8f82e4a76397b8f7714a55 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 23 Aug 2022 12:12:58 +0200 Subject: [PATCH 1398/2352] [build] Bump BKK dependency --- go.mod | 8 ++++---- go.sum | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index d994ca1c3..7a8f82707 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -63,7 +63,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.1.0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa - golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 + golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c golang.org/x/sys v0.0.0-20220731174439-a90be440212d google.golang.org/grpc v1.48.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 @@ -72,7 +72,7 @@ require ( ) require ( - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 // indirect + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/armon/go-metrics v0.4.0 // indirect @@ -142,7 +142,7 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect - golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c // indirect + golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/tools v0.1.12 // indirect diff --git a/go.sum b/go.sum index 39d018e54..402b4573e 100644 --- a/go.sum +++ b/go.sum @@ -40,10 +40,14 @@ github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5 github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 h1:6a/sKkS2BqoHy86Q84t7i+ahZCtteiHmTZOuM6dWJBw= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 h1:EI8ugZdpBDrw+r3NBB3jTHi70ZjWtn2mw51adWp2dyk= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199 h1:DSbYnoI7cDJ13KROrxlzhJct+s2VA4F4N6kXSdN8zjc= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= @@ -706,6 +710,8 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 h1:UreQrH7DbFXSi9ZFox6FNT3WBooWmdANpU+IfkT1T4I= golang.org/x/net v0.0.0-20220728211354-c7608f3a8462/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= +golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -720,6 +726,8 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c h1:q3gFqPqH7NVofKo3c3yETAP//pPI+G5mvB7qqj1Y5kY= golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= +golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 6e9267b60187b712e7901598b356d55a4364d386 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 Aug 2022 15:54:41 +0200 Subject: [PATCH 1399/2352] [build] Point to feature branch of Bookkeeping --- go.mod | 4 ++-- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7a8f82707..c05d84716 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199 + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -72,7 +72,7 @@ require ( ) require ( - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 // indirect + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333 // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/armon/go-metrics v0.4.0 // indirect diff --git a/go.sum b/go.sum index 402b4573e..fdb233590 100644 --- a/go.sum +++ b/go.sum @@ -42,12 +42,16 @@ github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 h1:6a github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 h1:EI8ugZdpBDrw+r3NBB3jTHi70ZjWtn2mw51adWp2dyk= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333 h1:Xb/ae/d0lr9H/Tu79QU1RuZxsXnrrBFBLPKZlpi8ve4= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199 h1:DSbYnoI7cDJ13KROrxlzhJct+s2VA4F4N6kXSdN8zjc= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333 h1:Z7G29Tqh2xTUiIsbs5NrPBFl7HfLq5h6Gtx4m0Uimcg= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From 62b1579ca4bf1c3a89d861f83a3b93efa38c4619 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Aug 2022 10:45:25 +0200 Subject: [PATCH 1400/2352] [build] Point Bookkeeping dependency to main branch --- go.mod | 4 ++-- go.sum | 8 ++++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index c05d84716..6682c9f03 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333 + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -72,7 +72,7 @@ require ( ) require ( - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333 // indirect + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/armon/go-metrics v0.4.0 // indirect diff --git a/go.sum b/go.sum index fdb233590..bef6de529 100644 --- a/go.sum +++ b/go.sum @@ -44,6 +44,10 @@ github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 h1:EI github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333 h1:Xb/ae/d0lr9H/Tu79QU1RuZxsXnrrBFBLPKZlpi8ve4= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a h1:4OAFuJSznjHJMZPGZ5hOdblzPOj0SfiNNunbnHvx2zI= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa h1:mB2uiZqIAL++NeviZ04KlQpV2AhX/RA8sHlryl8dgeU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= @@ -52,6 +56,10 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db2 github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333 h1:Z7G29Tqh2xTUiIsbs5NrPBFl7HfLq5h6Gtx4m0Uimcg= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38d98a h1:h/gumFg8Jlof4d2c9Iu/pmNtGpmRc6akFaxg4IiykaY= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38d98a/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa h1:wNjl7QcKhcwawU1ikpZ80AwfFE961tI+uSW1rkWG03g= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From 40a3be1ca2d658f00fcd714735c0dc63de3f0734 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 30 Aug 2022 16:24:25 +0200 Subject: [PATCH 1401/2352] [OCTRL-701] High-level configuration files are accepted as parameter for the creation of an environment with coconut. --- coconut/cmd/environment_create.go | 20 +++++----- coconut/control/control.go | 63 +++++++++++++++++++++++++++++-- 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 941456ac2..a1801d988 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -34,9 +34,9 @@ import ( // environmentCreateCmd represents the environment list command var environmentCreateCmd = &cobra.Command{ - Use: "create", + Use: "create", Aliases: []string{"new", "c", "n"}, - Short: "create a new environment", + Short: "create a new environment", Long: fmt.Sprintf(`The environment create command requests from %s the creation of a new environment. @@ -46,21 +46,21 @@ A valid workflow template (sometimes called simply "workflow" for brevity) must Workflows and tasks are managed with a git based configuration system, so the workflow template may be provided simply by name or with repository and branch/tag/hash constraints. Examples: - * ` + "`coconut env create -w myworkflow`" + ` - loads workflow ` + "`myworkflow`" + ` from default configuration repository at HEAD of master branch - * ` + "`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow`" + ` - loads a workflow from a specific git repository, HEAD of master branch - * ` + "`coconut env create -w myworkflow@rev`" + ` - loads a workflow from default repository, on branch, tag or revision ` + "`rev`" + ` - * ` + "`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev`" + ` - loads a workflow from a specific git repository, on branch, tag or revision ` + "`rev`" + ` - -For more information on the %s workflow configuration system, see documentation for the ` + "`coconut repository`" + ` command.`, product.PRETTY_SHORTNAME, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.CreateEnvironment), + * `+"`coconut env create -w myworkflow`"+` - loads workflow `+"`myworkflow`"+` from default configuration repository at HEAD of master branch + * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow`"+` - loads a workflow from a specific git repository, HEAD of master branch + * `+"`coconut env create -w myworkflow@rev`"+` - loads a workflow from default repository, on branch, tag or revision `+"`rev`"+` + * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev`"+` - loads a workflow from a specific git repository, on branch, tag or revision `+"`rev`"+` +For more information on the %s workflow configuration system, see documentation for the `+"`coconut repository`"+` command.`, product.PRETTY_SHORTNAME, product.PRETTY_SHORTNAME), + Run: control.WrapCall(control.CreateEnvironment), } func init() { environmentCmd.AddCommand(environmentCreateCmd) + environmentCreateCmd.Flags().StringP("configuration", "c", "", "high-level configuration payload to be loaded for the new environment") + environmentCreateCmd.MarkFlagRequired("configuration") environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") - environmentCreateCmd.MarkFlagRequired("workflow-template") environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") environmentCreateCmd.Flags().BoolP("public", "p", true, "control public rights of the environment") diff --git a/coconut/control/control.go b/coconut/control/control.go index fcf88a1c9..33574c6db 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -28,6 +28,7 @@ package control import ( "context" + "encoding/json" "errors" "fmt" "io" @@ -67,6 +68,15 @@ type RunFunc func(*cobra.Command, []string) type ControlCall func(context.Context, *coconut.RpcClient, *cobra.Command, []string, io.Writer) error +type ConfigurationPayload struct { + Name string `json:"name"` + Workflow string `json:"workflow"` + Revision string `json:"revision"` + Repository string `json:"repository"` + Vars map[string]string `json:"variables"` + Detectors []string `json:"detectors"` +} + func WrapCall(call ControlCall) RunFunc { return func(cmd *cobra.Command, args []string) { endpoint := viper.GetString("endpoint") @@ -250,14 +260,49 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - wfPath, err := cmd.Flags().GetString("workflow-template") + configPayload, err := cmd.Flags().GetString("configuration") + if err != nil { + err = errors.New("cannot get configuration payload value") + return + } + if len(configPayload) == 0 { + err = errors.New("cannot create environment with empty configuration payload") + return + } + configPayloadDoc, err := os.ReadFile(configPayload) + if err != nil { + err = errors.New("cannot read configuration payload file") + return + } + payloadData := new(ConfigurationPayload) + err = json.Unmarshal(configPayloadDoc, &payloadData) if err != nil { + err = errors.New("cannot unmarshal configuration payload") return } - if len(wfPath) == 0 { - err = errors.New("cannot create empty environment") + + var wfPath string + userWfPath, err := cmd.Flags().GetString("workflow-template") + if err != nil { return } + if cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { + if len(payloadData.Workflow) > 0 { + wfPath = payloadData.Workflow + } else { + err = errors.New("empty workflow template provided") + return + } + } else if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { + wfPath = userWfPath + } else { + if len(payloadData.Workflow) > 0 { + wfPath = payloadData.Workflow + } else { + err = errors.New("no workflow template provided in config file") + return + } + } var extraVars string extraVars, err = cmd.Flags().GetString("extra-vars") @@ -271,11 +316,21 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C return } - extraVarsMap, err := utils.ParseExtraVars(extraVars) + userExtraVarsMap, err := utils.ParseExtraVars(extraVars) if err != nil { return } + extraVarsMap := make(map[string]string, 0) + for k, v := range userExtraVarsMap { + extraVarsMap[k] = v + } + for k, v := range payloadData.Vars { + if _, exists := extraVarsMap[k]; !exists { + extraVarsMap[k] = v + } + } + public, _ := cmd.Flags().GetBool("public") auto, _ := cmd.Flags().GetBool("auto") From 44ce24a81391cff95b37dce0e6f16fa4b761802e Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 31 Aug 2022 15:40:37 +0200 Subject: [PATCH 1402/2352] [OCTRL-701] Changes following PR review. --- coconut/cmd/environment_create.go | 4 +- coconut/control/control.go | 69 ++++++++++++++++++------------- 2 files changed, 44 insertions(+), 29 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index a1801d988..b92af8e8d 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -50,6 +50,8 @@ Examples: * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow`"+` - loads a workflow from a specific git repository, HEAD of master branch * `+"`coconut env create -w myworkflow@rev`"+` - loads a workflow from default repository, on branch, tag or revision `+"`rev`"+` * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev`"+` - loads a workflow from a specific git repository, on branch, tag or revision `+"`rev`"+` + * `+"`coconut env create -c /home/myrepo/myconfigfile.json`"+` + * `+"`coconut env create -c consul:///o2/runtime/COG-v1/TECHNICAL -w readout-dataflow@myBranch -e '{\"hosts\":\"[\\\"my-test-machine\\\"]\"}'`"+` For more information on the %s workflow configuration system, see documentation for the `+"`coconut repository`"+` command.`, product.PRETTY_SHORTNAME, product.PRETTY_SHORTNAME), Run: control.WrapCall(control.CreateEnvironment), @@ -59,8 +61,8 @@ func init() { environmentCmd.AddCommand(environmentCreateCmd) environmentCreateCmd.Flags().StringP("configuration", "c", "", "high-level configuration payload to be loaded for the new environment") - environmentCreateCmd.MarkFlagRequired("configuration") environmentCreateCmd.Flags().StringP("workflow-template", "w", "", "workflow to be loaded in the new environment") + environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") environmentCreateCmd.Flags().BoolP("public", "p", true, "control public rights of the environment") diff --git a/coconut/control/control.go b/coconut/control/control.go index 33574c6db..e024be217 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -265,42 +265,53 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C err = errors.New("cannot get configuration payload value") return } - if len(configPayload) == 0 { - err = errors.New("cannot create environment with empty configuration payload") - return - } - configPayloadDoc, err := os.ReadFile(configPayload) + userWfPath, err := cmd.Flags().GetString("workflow-template") if err != nil { - err = errors.New("cannot read configuration payload file") + err = errors.New("cannot get workflow template value") return } - payloadData := new(ConfigurationPayload) - err = json.Unmarshal(configPayloadDoc, &payloadData) - if err != nil { - err = errors.New("cannot unmarshal configuration payload") + if cmd.Flags().Changed("configuration") && len(configPayload) == 0 && cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { + err = errors.New("no configuration payload or workflow template provided") return } + payloadData := new(ConfigurationPayload) var wfPath string - userWfPath, err := cmd.Flags().GetString("workflow-template") - if err != nil { - return - } - if cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { - if len(payloadData.Workflow) > 0 { - wfPath = payloadData.Workflow + if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { + configPayloadDoc, err := os.ReadFile(configPayload) + if err != nil { + err = errors.New("cannot read configuration payload file") + return err + } + err = json.Unmarshal(configPayloadDoc, &payloadData) + if err != nil { + err = errors.New("cannot unmarshal configuration payload") + return err + } + + if cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { + if len(payloadData.Workflow) > 0 { + wfPath = payloadData.Workflow + } else { + err = errors.New("empty workflow template provided") + return err + } + } else if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { + wfPath = userWfPath } else { - err = errors.New("empty workflow template provided") - return + if len(payloadData.Workflow) > 0 { + wfPath = payloadData.Workflow + } else { + err = errors.New("no workflow template provided in config file") + return err + } } - } else if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { - wfPath = userWfPath } else { - if len(payloadData.Workflow) > 0 { - wfPath = payloadData.Workflow + if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { + wfPath = userWfPath } else { - err = errors.New("no workflow template provided in config file") - return + err = errors.New("empty workflow template provided") + return err } } @@ -325,9 +336,11 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C for k, v := range userExtraVarsMap { extraVarsMap[k] = v } - for k, v := range payloadData.Vars { - if _, exists := extraVarsMap[k]; !exists { - extraVarsMap[k] = v + if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { + for k, v := range payloadData.Vars { + if _, exists := extraVarsMap[k]; !exists { + extraVarsMap[k] = v + } } } From 8de6773b8680e66db4fef7e030fe0efa930c7f62 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Sep 2022 11:57:34 +0200 Subject: [PATCH 1403/2352] [build] Bump to v0.51.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index f3eb39311..8b8f1cf42 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 50 -VERSION_PATCH := 2 +VERSION_MINOR := 51 +VERSION_PATCH := 0 From de2b1056f79e65785527e67f8c9c98fd7cc6ef4e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 2 Sep 2022 16:18:36 +0200 Subject: [PATCH 1404/2352] [OCTRL-710][core] do not include newline char in JIT config queries If the config file address was put at the end of JIT command, as below: o2-qc --config json://path/to/payload then the regex would include a newline character in the matched string, which would not pass inputFullRegex when building a query. However, we would try to retrieve the configuration anyway, because there was no error check after invoking NewQuery. --- configuration/template/dplutil.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 11f60acff..ecc572fdd 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -48,7 +48,7 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo var metadata string // Match any consul URL - re := regexp.MustCompile(`consul-json://[^ |]*`) + re := regexp.MustCompile(`consul-json://[^ |\n]*`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) // Concatenate the consul LastIndex for each payload in a single string @@ -60,6 +60,9 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // And query for Consul for its LastIndex newQ, err := componentcfg.NewQuery(consulKey[1]) + if err != nil { + return fmt.Sprintf("JIT could not create a query out of path '%s'. error: %e : "+err.Error(), consulKey[1]) + } _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) if err != nil { return fmt.Sprintf("JIT failed trying to query qc consul payload %s : "+err.Error(), From c105c562a2ebaf9bc0818d153c4a4ba86a527ed6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 2 Sep 2022 16:50:22 +0200 Subject: [PATCH 1405/2352] [core] trim spaces in path before building a configuration query --- configuration/componentcfg/query.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 51516f3e6..e8cc25963 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -65,6 +65,7 @@ func NewEntriesQuery(path string) (p *EntriesQuery, err error) { RunType: apricotpb.RunType_NULL, RoleName: "", } + path = strings.TrimSpace(path) if IsStringValidEntriesQueryPath(path) { // coconut conf list component/FLAVOR/rolename params := strings.Split(path, SEPARATOR) @@ -101,6 +102,7 @@ func NewQuery(path string) (p *Query, err error) { EntryKey: "", Timestamp: "", } + path = strings.TrimSpace(path) if IsStringValidQueryPathWithOptionalTimestamp(path) { if strings.Contains(path, "@") { // coconut conf show component/FLAVOR/rolename/entry@timestamp From 18b88a1998811a5a00fb0b8e07f94c806435319a Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 2 Sep 2022 15:58:19 +0200 Subject: [PATCH 1406/2352] [OCTRL-701] Configuration files for coconut can be loaded from consul in a simpler way. --- coconut/cmd/environment_create.go | 3 ++- coconut/control/control.go | 34 +++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index b92af8e8d..76069e2c4 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -50,8 +50,9 @@ Examples: * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow`"+` - loads a workflow from a specific git repository, HEAD of master branch * `+"`coconut env create -w myworkflow@rev`"+` - loads a workflow from default repository, on branch, tag or revision `+"`rev`"+` * `+"`coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev`"+` - loads a workflow from a specific git repository, on branch, tag or revision `+"`rev`"+` - * `+"`coconut env create -c /home/myrepo/myconfigfile.json`"+` + * `+"`coconut env create -c /home/myrepo/myconfigfile.json -e '{\"hosts\":\"[\\\"my-test-machine\\\"]\"}'`"+` * `+"`coconut env create -c consul:///o2/runtime/COG-v1/TECHNICAL -w readout-dataflow@myBranch -e '{\"hosts\":\"[\\\"my-test-machine\\\"]\"}'`"+` + * `+"`coconut env create -c TECHNICAL -e '{\"hosts\":\"[\\\"my-test-machine\\\"]\"}'`"+` For more information on the %s workflow configuration system, see documentation for the `+"`coconut repository`"+` command.`, product.PRETTY_SHORTNAME, product.PRETTY_SHORTNAME), Run: control.WrapCall(control.CreateEnvironment), diff --git a/coconut/control/control.go b/coconut/control/control.go index e024be217..dfca3c217 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -31,6 +31,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/AliceO2Group/Control/apricot" "io" "os" "regexp" @@ -278,15 +279,30 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C payloadData := new(ConfigurationPayload) var wfPath string if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { - configPayloadDoc, err := os.ReadFile(configPayload) - if err != nil { - err = errors.New("cannot read configuration payload file") - return err - } - err = json.Unmarshal(configPayloadDoc, &payloadData) - if err != nil { - err = errors.New("cannot unmarshal configuration payload") - return err + if strings.HasSuffix(strings.ToLower(configPayload), ".json") { + configPayloadDoc, err := os.ReadFile(configPayload) + err = json.Unmarshal(configPayloadDoc, &payloadData) + if err != nil { + err = errors.New("cannot unmarshal local configuration payload") + return err + } + } else { + configPayloadSplit := strings.Split(configPayload, "/") + if len(configPayloadSplit) == 0 { + err = errors.New("configuration payload file is not valid") + return err + } + configPayloadUri := configPayloadSplit[len(configPayloadSplit)-1] + configPayloadDoc, err := apricot.Instance().GetRuntimeEntry("COG-v1", configPayloadUri) + if err != nil { + err = errors.New("cannot retrieve file from consul under COG-v1 component") + return err + } + err = json.Unmarshal([]byte(configPayloadDoc), &payloadData) + if err != nil { + err = errors.New("cannot unmarshal remote configuration payload") + return err + } } if cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { From 2e8372a5142b6aea8e0c3bb596712bd8bcbfe548 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 2 Sep 2022 17:51:48 +0200 Subject: [PATCH 1407/2352] [OCTRL-701] Corrected the consul path for runtime configuration files, and the error handling. --- coconut/control/control.go | 47 ++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index dfca3c217..22a4905c7 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -31,7 +31,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/AliceO2Group/Control/apricot" "io" "os" "regexp" @@ -45,6 +44,7 @@ import ( "github.com/xlab/treeprint" + "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/coconut" "github.com/AliceO2Group/Control/coconut/protos" "github.com/AliceO2Group/Control/common/logger" @@ -59,8 +59,10 @@ import ( ) const ( - CALL_TIMEOUT = 55 * time.Second - SPINNER_TICK = 100 * time.Millisecond + CALL_TIMEOUT = 55 * time.Second + SPINNER_TICK = 100 * time.Millisecond + HLCONFIG_COMPONENT_PREFIX = "COG-v1" + HLCONFIG_PATH_PREFIX = "consul://o2/runtime/" ) var log = logger.New(logrus.StandardLogger(), "coconut") @@ -263,17 +265,14 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { configPayload, err := cmd.Flags().GetString("configuration") if err != nil { - err = errors.New("cannot get configuration payload value") - return + return fmt.Errorf("cannot get configuration payload value: %w", err) } userWfPath, err := cmd.Flags().GetString("workflow-template") if err != nil { - err = errors.New("cannot get workflow template value") - return + return fmt.Errorf("cannot get workflow template value: %w", err) } if cmd.Flags().Changed("configuration") && len(configPayload) == 0 && cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { - err = errors.New("no configuration payload or workflow template provided") - return + return fmt.Errorf("no configuration payload or workflow template provided: %w", err) } payloadData := new(ConfigurationPayload) @@ -281,27 +280,24 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { if strings.HasSuffix(strings.ToLower(configPayload), ".json") { configPayloadDoc, err := os.ReadFile(configPayload) + if err != nil { + return fmt.Errorf("cannot read local configuration payload: %w", err) + } err = json.Unmarshal(configPayloadDoc, &payloadData) if err != nil { - err = errors.New("cannot unmarshal local configuration payload") - return err + return fmt.Errorf("cannot unmarshal local configuration payload: %w", err) } } else { - configPayloadSplit := strings.Split(configPayload, "/") - if len(configPayloadSplit) == 0 { - err = errors.New("configuration payload file is not valid") - return err + if strings.HasPrefix(configPayload, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) { + configPayload = strings.TrimPrefix(configPayload, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) } - configPayloadUri := configPayloadSplit[len(configPayloadSplit)-1] - configPayloadDoc, err := apricot.Instance().GetRuntimeEntry("COG-v1", configPayloadUri) + configPayloadDoc, err := apricot.Instance().GetRuntimeEntry(HLCONFIG_COMPONENT_PREFIX, configPayload) if err != nil { - err = errors.New("cannot retrieve file from consul under COG-v1 component") - return err + return fmt.Errorf("cannot retrieve file from "+HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX+": %w", err) } err = json.Unmarshal([]byte(configPayloadDoc), &payloadData) if err != nil { - err = errors.New("cannot unmarshal remote configuration payload") - return err + return fmt.Errorf("cannot unmarshal remote configuration payload: %w", err) } } @@ -309,8 +305,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if len(payloadData.Workflow) > 0 { wfPath = payloadData.Workflow } else { - err = errors.New("empty workflow template provided") - return err + return errors.New("empty workflow template provided") } } else if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { wfPath = userWfPath @@ -318,16 +313,14 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if len(payloadData.Workflow) > 0 { wfPath = payloadData.Workflow } else { - err = errors.New("no workflow template provided in config file") - return err + return errors.New("no workflow template provided in config file") } } } else { if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { wfPath = userWfPath } else { - err = errors.New("empty workflow template provided") - return err + return errors.New("empty workflow template provided") } } From 0df467004ceb7725d6d4d029af214127ae35818d Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 6 Sep 2022 09:18:57 +0200 Subject: [PATCH 1408/2352] [OCTRL-701] Make the variable names and error messages more readable. --- coconut/control/control.go | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 22a4905c7..429ef0cf7 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -263,41 +263,41 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, args []string, o io.Writer) (err error) { - configPayload, err := cmd.Flags().GetString("configuration") + configPayloadPath, err := cmd.Flags().GetString("configuration") if err != nil { - return fmt.Errorf("cannot get configuration payload value: %w", err) + return fmt.Errorf("cannot get configuration payload path value: %w", err) } userWfPath, err := cmd.Flags().GetString("workflow-template") if err != nil { - return fmt.Errorf("cannot get workflow template value: %w", err) + return fmt.Errorf("cannot get workflow template path value: %w", err) } - if cmd.Flags().Changed("configuration") && len(configPayload) == 0 && cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { - return fmt.Errorf("no configuration payload or workflow template provided: %w", err) + if cmd.Flags().Changed("configuration") && len(configPayloadPath) == 0 && cmd.Flags().Changed("workflow-template") && len(userWfPath) == 0 { + return fmt.Errorf("no configuration payload path or workflow template path provided: %w", err) } payloadData := new(ConfigurationPayload) var wfPath string - if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { - if strings.HasSuffix(strings.ToLower(configPayload), ".json") { - configPayloadDoc, err := os.ReadFile(configPayload) + if cmd.Flags().Changed("configuration") && len(configPayloadPath) > 0 { + if strings.HasSuffix(strings.ToLower(configPayloadPath), ".json") { + configPayloadDoc, err := os.ReadFile(configPayloadPath) if err != nil { - return fmt.Errorf("cannot read local configuration payload: %w", err) + return fmt.Errorf("cannot read local configuration file %v: %w", configPayloadPath, err) } err = json.Unmarshal(configPayloadDoc, &payloadData) if err != nil { - return fmt.Errorf("cannot unmarshal local configuration payload: %w", err) + return fmt.Errorf("cannot unmarshal local configuration file %v: %w", configPayloadPath, err) } } else { - if strings.HasPrefix(configPayload, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) { - configPayload = strings.TrimPrefix(configPayload, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) + if strings.HasPrefix(configPayloadPath, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) { + configPayloadPath = strings.TrimPrefix(configPayloadPath, HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX) } - configPayloadDoc, err := apricot.Instance().GetRuntimeEntry(HLCONFIG_COMPONENT_PREFIX, configPayload) + configPayloadDoc, err := apricot.Instance().GetRuntimeEntry(HLCONFIG_COMPONENT_PREFIX, configPayloadPath) if err != nil { - return fmt.Errorf("cannot retrieve file from "+HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX+": %w", err) + return fmt.Errorf("cannot retrieve file %v from "+HLCONFIG_PATH_PREFIX+HLCONFIG_COMPONENT_PREFIX+": %w", configPayloadPath, err) } err = json.Unmarshal([]byte(configPayloadDoc), &payloadData) if err != nil { - return fmt.Errorf("cannot unmarshal remote configuration payload: %w", err) + return fmt.Errorf("cannot unmarshal remote configuration payload %v: %w", configPayloadPath, err) } } @@ -305,7 +305,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if len(payloadData.Workflow) > 0 { wfPath = payloadData.Workflow } else { - return errors.New("empty workflow template provided") + return errors.New("empty workflow template in configuration payload, and empty workflow template path provided") } } else if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { wfPath = userWfPath @@ -313,14 +313,14 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C if len(payloadData.Workflow) > 0 { wfPath = payloadData.Workflow } else { - return errors.New("no workflow template provided in config file") + return errors.New("no workflow template provided in configuration payload") } } } else { if cmd.Flags().Changed("workflow-template") && len(userWfPath) > 0 { wfPath = userWfPath } else { - return errors.New("empty workflow template provided") + return errors.New("empty workflow template path provided") } } @@ -345,7 +345,7 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C for k, v := range userExtraVarsMap { extraVarsMap[k] = v } - if cmd.Flags().Changed("configuration") && len(configPayload) > 0 { + if cmd.Flags().Changed("configuration") && len(configPayloadPath) > 0 { for k, v := range payloadData.Vars { if _, exists := extraVarsMap[k]; !exists { extraVarsMap[k] = v From 24d7f49884830600e6bceee655703c6b7c8a503b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 5 Sep 2022 16:57:44 +0200 Subject: [PATCH 1409/2352] [OCTRL-685][core] Publish CCDB EOR GRP also if we fail to start a run --- core/integration/ccdb/plugin.go | 52 ++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 8654cd243..ddd255571 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "go/types" "net/url" "os/exec" "strconv" @@ -77,11 +78,17 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { return nil } - runNumber, err := strconv.ParseUint(varStack["run_number"], 10, 32) + runNumberStr, ok := varStack["run_number"] + if !ok { + log.WithField("partition", envId). + Error("cannot acquire run number for GRP object") + return nil + } + runNumber, err := strconv.ParseUint(runNumberStr, 10, 32) if err != nil { log.WithError(err). WithField("partition", envId). - Error("cannot acquire run number for Run Start") + Errorf("cannot convert run number '%s' to an integer", runNumberStr) return nil } @@ -191,7 +198,8 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } type Plugin struct { - ccdbUrl string + ccdbUrl string + existingRuns map[uint32]types.Nil // using map, because it is more convenient to add, find, delete elements than slice } func NewPlugin(endpoint string) integration.Plugin { @@ -204,7 +212,8 @@ func NewPlugin(endpoint string) integration.Plugin { } return &Plugin{ - ccdbUrl: endpoint, + ccdbUrl: endpoint, + existingRuns: make(map[uint32]types.Nil), } } @@ -314,7 +323,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing log.WithField("call", "RunStart"). WithField("partition", envId).Debug("performing CCDB interface Run Start") - err := p.uploadCurrentGRP(varStack, envId, true) + + grp := NewGRPObject(varStack) + if grp == nil { + return + } + p.existingRuns[grp.runNumber] = types.Nil{} + err := p.uploadCurrentGRP(grp, envId, true) if err != nil { log.WithField("call", "RunStop"). WithField("partition", envId).Error(err.Error()) @@ -323,19 +338,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack["RunStop"] = func() (out string) { log.WithField("call", "RunStop"). - WithField("partition", envId).Debug("performing CCDB interface Run Stop") - err := p.uploadCurrentGRP(varStack, envId, false) - if err != nil { + WithField("partition", envId).Debug("checking if a CCDB End Of Run GRP should be published") + + grp := NewGRPObject(varStack) + if grp == nil { log.WithField("call", "RunStop"). - WithField("partition", envId).Error(err.Error()) + WithField("partition", envId). + Debug("probably went to ERROR while not in RUNNING, doing nothing") + return + } + _, runExists := p.existingRuns[grp.runNumber] + if runExists { + delete(p.existingRuns, grp.runNumber) + err := p.uploadCurrentGRP(grp, envId, false) + if err != nil { + log.WithField("call", "RunStop"). + WithField("partition", envId).Error(err.Error()) + } + } else { + log.WithField("call", "RunStop"). + WithField("partition", envId). + Debugf("most likely a GRP EOR object for run %d already has been published, doing nothing", grp.runNumber) } return } return } -func (p *Plugin) uploadCurrentGRP(varStack map[string]string, envId string, refresh bool) error { - grp := NewGRPObject(varStack) +func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refresh bool) error { if grp == nil { return errors.New(fmt.Sprintf("Failed to create a GRP object")) From 0423fc3536e26eed4739370caea5ffbf1ee0b033 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 7 Sep 2022 16:38:10 +0200 Subject: [PATCH 1410/2352] [build] Bump to v0.52.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8b8f1cf42..1407b3116 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 51 +VERSION_MINOR := 52 VERSION_PATCH := 0 From 3a9967db1bd4fe1419b7c6a1ecb6e4d000a10523 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 15 Aug 2022 16:19:15 +0200 Subject: [PATCH 1411/2352] [OCTRL-695][OCTRL-702] AliECS BK plugin passes new fields to BK for Run details. --- core/integration/bookkeeping/api.go | 18 ++++-------------- core/integration/bookkeeping/plugin.go | 7 ++----- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 37789172d..215d30df4 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -25,6 +25,7 @@ package bookkeeping import ( + "github.com/AliceO2Group/Control/common/runtype" "net/url" "path" "strconv" @@ -67,20 +68,9 @@ func Instance() *BookkeepingWrapper { return instance } -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType string, ddFlp bool, dcs bool, epn bool, epnTopology string, odcTopologyFullname string, detectors string) error { - var runtypeAPI sw.RunType - switch runType { - case string(sw.TECHNICAL_RunType): - runtypeAPI = sw.TECHNICAL_RunType - case string(sw.COSMICS_RunType): - runtypeAPI = sw.COSMICS_RunType - case string(sw.PHYSICS_RunType): - runtypeAPI = sw.PHYSICS_RunType - default: - // log Runtype is %s and it is not valid overwrite with TECHNICAL_RunType - runtypeAPI = sw.TECHNICAL_RunType - } - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runtypeAPI, ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) +func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType runtype.RunType, ddFlp bool, dcs bool, epn bool, epnTopology string, odcTopologyFullname string, detectors string) error { + + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runType, ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 15455ad16..9c1851ca9 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -258,7 +258,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType().String(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, odcTopologyFullname, detectors) + err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, odcTopologyFullname, detectors) if err != nil { log.WithError(err). WithField("runNumber", runNumber). @@ -357,8 +357,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "UpdateRun"). Warning("cannot acquire PDP topology description library file") } - tfbMode := env.GetKV("", "tfb_dd_mode") - pdpParameters, ok := varStack["pdp_workflow_parameters"] if !ok { log.WithField("runNumber", runNumber64). @@ -373,7 +371,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "UpdateRun"). Warning("cannot acquire PDP beam type") } - + tfbMode := env.GetKV("", "tfb_dd_mode") odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") if !ok { log.WithField("runNumber", runNumber64). @@ -381,7 +379,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "UpdateRun"). Warning("cannot acquire ODC topology fullname") } - lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) From 34050a42691940736512e55bb7b2726c1eee448f Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 29 Aug 2022 09:28:44 +0200 Subject: [PATCH 1412/2352] [OCTRL-695] The RunType is passed as a string to Bookkeeping. --- core/integration/bookkeeping/api.go | 2 +- core/integration/bookkeeping/plugin.go | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go index 215d30df4..155b93092 100644 --- a/core/integration/bookkeeping/api.go +++ b/core/integration/bookkeeping/api.go @@ -70,7 +70,7 @@ func Instance() *BookkeepingWrapper { func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType runtype.RunType, ddFlp bool, dcs bool, epn bool, epnTopology string, odcTopologyFullname string, detectors string) error { - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runType, ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) + _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runType.String(), ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) return err } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 9c1851ca9..ed6ec8ec4 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -381,6 +381,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] + err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) if err != nil { log.WithError(err). From 5b1ec62c33f3a68312ca359d857748def82cfe2c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 21 Sep 2022 11:50:15 +0200 Subject: [PATCH 1413/2352] [OCTRL-695] Making the go.mod and go.sum files point to main branch in BK. --- go.mod | 4 ++-- go.sum | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 6682c9f03..ebc6fce2d 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 require ( github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa + github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -72,7 +72,7 @@ require ( ) require ( - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa // indirect + github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81 // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect github.com/acomagu/bufpipe v1.0.3 // indirect github.com/armon/go-metrics v0.4.0 // indirect diff --git a/go.sum b/go.sum index bef6de529..7af9755da 100644 --- a/go.sum +++ b/go.sum @@ -48,6 +48,8 @@ github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a h1:4O github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa h1:mB2uiZqIAL++NeviZ04KlQpV2AhX/RA8sHlryl8dgeU= github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81 h1:iMo7OJaBd9T/LBfsRys5UwiKNE8qh36tCTOprhNTeCs= +github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= @@ -60,6 +62,8 @@ github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38 github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38d98a/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa h1:wNjl7QcKhcwawU1ikpZ80AwfFE961tI+uSW1rkWG03g= github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81 h1:pCcBVHufYuC0YEK/pLkcqlzOGzHKK64Nx1Lm9H913vk= +github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= From 85aa359bd0f2b3ff5327d275cd02066c9dd2b76b Mon Sep 17 00:00:00 2001 From: Claire Guyot <36992869+claireguyot@users.noreply.github.com> Date: Wed, 21 Sep 2022 11:56:09 +0200 Subject: [PATCH 1414/2352] [build] Bump to v.0.53.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 1407b3116..a5e031fff 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 52 +VERSION_MINOR := 53 VERSION_PATCH := 0 From a8d8b34682f3a30f3d38f94f1937a4810916d0af Mon Sep 17 00:00:00 2001 From: dvoscek <115143333+dvoscek@users.noreply.github.com> Date: Thu, 6 Oct 2022 10:35:21 +0200 Subject: [PATCH 1415/2352] DCS proto file updated NOISE runType, [SOR|EOR]_UNAVAILABLE detectorState --- core/integration/dcs/protos/dcs.proto | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 5d7d1d9df..f09a738d0 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -218,6 +218,8 @@ enum DetectorState { EOR_FAILURE = 8; ERROR = 9; DEAD = 10; + SOR_UNAVAILABLE = 11; + EOR_UNAVAILABLE = 12; } enum RunType { @@ -234,7 +236,7 @@ enum RunType { CALIBRATION_ANALOG_SCAN = 10; CALIBRATION_FHR = 11; CALIBRATION_ALPIDE_SCAN = 12; - + NOISE = 13; } enum TriggerMode { // FIXME: unused @@ -244,4 +246,4 @@ enum TriggerMode { // FIXME: unused enum SorMode { // FIXME: unused FULL = 0; FAST = 1; -} \ No newline at end of file +} From f2b86472882c2d3cc60447c16c872ffd12808d60 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 3 Oct 2022 11:34:52 +0200 Subject: [PATCH 1416/2352] [executor] log signals when killing tasks This way we can be sure that SIGINT, SIGTERM, SIGKILL was sent by AliECS, not by a different entity. --- executor/executable/controllabletask.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6cb5e5f42..6ba94641a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -344,7 +344,10 @@ func (t *ControllableTask) Launch() error { // of this process, so we must rely on the PGID of the containing shell pid = -t.rpc.TaskCmd.Process.Pid } - + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", t.ti.Name). + Debug("sending SIGKILL (9) to task") _ = syscall.Kill(pid, syscall.SIGKILL) _ = stdoutIn.Close() _ = stderrIn.Close() @@ -760,6 +763,10 @@ func (t *ControllableTask) Kill() error { } func (t *ControllableTask) doKill9(pid int) error { + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", t.ti.GetTaskID()). + Debug("sending SIGKILL (9) to task") killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { log.WithField("partition", t.knownEnvironmentId.String()). @@ -776,6 +783,10 @@ func (t *ControllableTask) doTermIntKill(pid int) error { killErrCh := make(chan error) go func() { + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", t.ti.GetTaskID()). + Debug("sending SIGTERM (15) to task") err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). @@ -796,6 +807,10 @@ func (t *ControllableTask) doTermIntKill(pid int) error { if pidExists(pid) { // SIGINT for the "Waiting for graceful device shutdown. // Hit Ctrl-C again to abort immediately" message. + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", t.ti.GetTaskID()). + Debug("sending SIGINT (2) to task") killErr = syscall.Kill(pid, syscall.SIGINT) if killErr != nil { log.WithField("partition", t.knownEnvironmentId.String()). From 13d1ff0d208e729316107bf3818cae32e89a0513 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Oct 2022 12:09:41 +0200 Subject: [PATCH 1417/2352] [executor] do not kill what's dead --- executor/executable/controllabletask.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6ba94641a..ec58454cd 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -755,11 +755,17 @@ func (t *ControllableTask) Kill() error { } if reachedState == "DONE" { - log.WithField("taskId", t.ti.GetTaskID()).Debugf("waiting %.1fs before sending SIGTERM to task", DONE_TIMEOUT.Seconds()) + log.WithField("taskId", t.ti.GetTaskID()). + Debugf("waiting %.1fs before terminating task", DONE_TIMEOUT.Seconds()) time.Sleep(DONE_TIMEOUT) } - - return t.doTermIntKill(pid) + if pidExists(pid) { + return t.doTermIntKill(pid) + } else { + log.WithField("taskId", t.ti.GetTaskID()). + Debugf("task terminated on its own") + return nil + } } func (t *ControllableTask) doKill9(pid int) error { @@ -821,9 +827,9 @@ func (t *ControllableTask) doTermIntKill(pid int) error { } time.Sleep(SIGINT_TIMEOUT) } - if !pidExists(pid) { - return killErr - } + } + if !pidExists(pid) { + return killErr } case <-time.After(SIGTERM_TIMEOUT + SIGINT_TIMEOUT): } From 42fda96fca598edf5ebcf7decc19e6cb9b426426 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Oct 2022 12:10:09 +0200 Subject: [PATCH 1418/2352] [executor] increase the timeout for SIGTERM it is not always enough for Readout if we send SIGTERM while RUNNNING --- executor/executable/controllabletask.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index ec58454cd..2366f1c4b 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -50,7 +50,7 @@ import ( const ( DONE_TIMEOUT = 1 * time.Second - SIGTERM_TIMEOUT = 1 * time.Second + SIGTERM_TIMEOUT = 2 * time.Second SIGINT_TIMEOUT = 3 * time.Second KILL_TRANSITION_TIMEOUT = 1 * time.Second TRANSITION_TIMEOUT = 10 * time.Second From ae10130d4093056dfef5dcc321efcff773842cb0 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Oct 2022 14:03:21 +0200 Subject: [PATCH 1419/2352] [executor] increase KILL_TRANSITION_TIMEOUT to 5s As discussed with Sylvain, 1s is not enough for readout to go from RUNNING to DONE. 5s is the minimal safe value. --- executor/executable/controllabletask.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 2366f1c4b..a1995da9a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -52,7 +52,7 @@ const ( DONE_TIMEOUT = 1 * time.Second SIGTERM_TIMEOUT = 2 * time.Second SIGINT_TIMEOUT = 3 * time.Second - KILL_TRANSITION_TIMEOUT = 1 * time.Second + KILL_TRANSITION_TIMEOUT = 5 * time.Second // to be on the safe side, readout might need up to 5s to go from RUNNING to DONE TRANSITION_TIMEOUT = 10 * time.Second ) @@ -750,7 +750,7 @@ func (t *ControllableTask) Kill() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("taskId", t.ti.TaskID.Value). - Debug("task already died or will be killed soon") + Debug("task died already or will be killed soon") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } From b9524b7ffcd937bb534554deec73cb4f8d119852 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Oct 2022 14:21:15 +0200 Subject: [PATCH 1420/2352] [executor] simplify two logs into one, simplify the code --- executor/executable/controllabletask.go | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index a1995da9a..f2bf98a84 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -744,8 +744,9 @@ func (t *ControllableTask) Kill() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("taskId", t.ti.TaskID.Value). - Debug("task reached DONE, will try to terminate it gently") + Debugf("task reached DONE, will wait %.1fs before terminating it", DONE_TIMEOUT.Seconds()) t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED + time.Sleep(DONE_TIMEOUT) } else { // something went wrong log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). @@ -754,11 +755,6 @@ func (t *ControllableTask) Kill() error { t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } - if reachedState == "DONE" { - log.WithField("taskId", t.ti.GetTaskID()). - Debugf("waiting %.1fs before terminating task", DONE_TIMEOUT.Seconds()) - time.Sleep(DONE_TIMEOUT) - } if pidExists(pid) { return t.doTermIntKill(pid) } else { From c2120a6600d31bbdcc4ce6b476e32660e42fa6b3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Oct 2022 14:26:25 +0200 Subject: [PATCH 1421/2352] [core] Add NOISE to run types list --- apricot/protos/apricot.proto | 3 ++- common/runtype/runtype.go | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 93dface21..b16671e2b 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -74,7 +74,8 @@ enum RunType { CALIBRATION_ANALOG_SCAN = 10; CALIBRATION_FHR = 11; CALIBRATION_ALPIDE_SCAN = 12; - reserved 13 to 199; + NOISE = 13; + reserved 14 to 199; CALIBRATION = 200; COSMICS = 201; diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 2706426a8..10fd67bbd 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -44,9 +44,10 @@ const ( CALIBRATION_ANALOG_SCAN CALIBRATION_FHR CALIBRATION_ALPIDE_SCAN + NOISE // no correspondence with DCS: - CALIBRATION - COSMICS - SYNTHETIC + CALIBRATION = 200 + COSMICS = 201 + SYNTHETIC = 202 ) From c9cd62e8d5c99244a4c341e6ebeb333dfebf4d80 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Oct 2022 14:26:46 +0200 Subject: [PATCH 1422/2352] [core] Reformat DCS GetData output (now a map instead of array) --- core/integration/dcs/plugin.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 7cda957d7..5667d0dfb 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -107,6 +107,8 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { return "" } + outMap := make(map[string]interface{}) + partitionStates := make(map[string]string) for _, envId := range environmentIds { @@ -115,7 +117,9 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { } } - out, err := json.Marshal(partitionStates) + outMap["partitions"] = partitionStates + + out, err := json.Marshal(outMap) if err != nil { return "" } From 402892b193834661f69ce49924989933a8117ed8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 6 Oct 2022 14:43:57 +0200 Subject: [PATCH 1423/2352] [core] Fix build --- common/runtype/runtype_strings.go | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index c17aea083..5f126973b 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMICSSYNTHETIC" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANNOISE" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 209, 218} +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 196} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmicssynthetic" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scannoise" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -38,12 +38,10 @@ func _RunTypeNoOp() { _ = x[CALIBRATION_ANALOG_SCAN-(10)] _ = x[CALIBRATION_FHR-(11)] _ = x[CALIBRATION_ALPIDE_SCAN-(12)] - _ = x[CALIBRATION-(13)] - _ = x[COSMICS-(14)] - _ = x[SYNTHETIC-(15)] + _ = x[NOISE-(13)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMICS, SYNTHETIC} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, NOISE} var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeName[0:4]: NONE, @@ -72,12 +70,8 @@ var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeLowerName[153:168]: CALIBRATION_FHR, _RunTypeName[168:191]: CALIBRATION_ALPIDE_SCAN, _RunTypeLowerName[168:191]: CALIBRATION_ALPIDE_SCAN, - _RunTypeName[191:202]: CALIBRATION, - _RunTypeLowerName[191:202]: CALIBRATION, - _RunTypeName[202:209]: COSMICS, - _RunTypeLowerName[202:209]: COSMICS, - _RunTypeName[209:218]: SYNTHETIC, - _RunTypeLowerName[209:218]: SYNTHETIC, + _RunTypeName[191:196]: NOISE, + _RunTypeLowerName[191:196]: NOISE, } var _RunTypeNames = []string{ @@ -94,9 +88,7 @@ var _RunTypeNames = []string{ _RunTypeName[130:153], _RunTypeName[153:168], _RunTypeName[168:191], - _RunTypeName[191:202], - _RunTypeName[202:209], - _RunTypeName[209:218], + _RunTypeName[191:196], } // RunTypeString retrieves an enum value from the enum constants string name. From b1878d0fa24c5bce9e86b3e693005043d0f08afb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 23 Sep 2022 14:03:42 +0200 Subject: [PATCH 1424/2352] [core] Improve reporting errors during JIT template translation Now we report any problems in JIT as errors instead of smuggling them as workflow file names, which were treated as such, thus trying to opens files consisting of error messages --- configuration/template/dplutil.go | 33 +++++++++++++++---------------- configuration/template/stack.go | 8 ++++---- 2 files changed, 20 insertions(+), 21 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index ecc572fdd..8ab485a85 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -43,7 +43,7 @@ import ( // jitDplGenerate takes a resolved dplCommand as an argument, // generates the corresponding tasks and workflow // and returns the resolved dplWorkflow as a string -func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (dplWorkflow string) { +func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { const nMaxExpectedQcPayloads = 2 var metadata string @@ -61,12 +61,11 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // And query for Consul for its LastIndex newQ, err := componentcfg.NewQuery(consulKey[1]) if err != nil { - return fmt.Sprintf("JIT could not create a query out of path '%s'. error: %e : "+err.Error(), consulKey[1]) + return "", fmt.Errorf("JIT could not create a query out of path '%s'. error: %w", consulKey[1], err) } _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) if err != nil { - return fmt.Sprintf("JIT failed trying to query qc consul payload %s : "+err.Error(), - match) + return "", fmt.Errorf("JIT failed trying to query qc consul payload '%s', error: %w", match, err) } metadata += strconv.FormatUint(lastIndex, 10) } @@ -88,7 +87,7 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // 4) The JIT env vars hash := sha1.New() hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) - jitWorkflowName := "jit-" + hex.EncodeToString(hash.Sum(nil)) + jitWorkflowName = "jit-" + hex.EncodeToString(hash.Sum(nil)) // We now have a workflow name made out of a hash that should be unique with respect to // 1) DPL command and @@ -98,8 +97,8 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // Only generate new tasks & workflows if the files don't exist // If they exist, hash comparison guarantees validity if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { - log.Tracef("Workflow %s already exists, skipping DPL creation", jitWorkflowName) - return jitWorkflowName + log.Tracef("Workflow '%s' already exists, skipping DPL creation", jitWorkflowName) + return jitWorkflowName, nil } // TODO: Before executing we need to check that this is a valid dpl command @@ -117,42 +116,42 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo dplOut, err = dplCmd.CombinedOutput() log.Trace("DPL command out: " + string(dplOut)) if err != nil { - return fmt.Sprintf("Failed to run DPL command : " + err.Error() + "\nDPL command out : " + string(dplOut)) + return "", fmt.Errorf("Failed to run DPL command: %w.\n DPL command out: %s", err, string(dplOut)) } - return jitWorkflowName + return jitWorkflowName, nil } -func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) string { +func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { if dplCommand == "none" { - return "" + return "", fmt.Errorf("dplCommand is 'none'") } // Resolve any templates as part of the DPL command fields := Fields{WrapPointer(&dplCommand)} - err := fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) if err != nil { - return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh &&"+dplCommand) } -func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string) string { +func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string) (jitWorkflowName string, err error) { if dplCommandUri == "none" { - return "" + return "", fmt.Errorf("dplCommand is 'none'") } dplCommand, err := workflowRepo.GetDplCommand(dplCommandUri) if err != nil { - return fmt.Sprintf("Failed to read DPL command from %s : %s\n", dplCommandUri, err.Error()) + return "", fmt.Errorf("Failed to read DPL command from '%s': %w\n", dplCommandUri, err) } // Resolve any templates as part of the DPL command fields := Fields{WrapPointer(&dplCommand)} err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) if err != nil { - return fmt.Sprintf("JIT failed in template resolution of the dpl_command : " + err.Error()) + return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 84aff2eda..7ba2d36d3 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -165,19 +165,19 @@ func MakePluginObjectStack(varStack map[string]string) map[string]interface{} { func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { return map[string]interface{}{ - "GenerateDplSubworkflow": func(dplCommand string) string { + "GenerateDplSubworkflow": func(dplCommand string) (string, error) { log.WithPrefix("template").Warn("GenerateDplSubworkflow is deprecated, use dpl.Generate instead") return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) }, - "GenerateDplSubworkflowFromUri": func(dplCommandUri string) string { + "GenerateDplSubworkflowFromUri": func(dplCommandUri string) (string, error) { log.WithPrefix("template").Warn("GenerateDplSubworkflowFromUri is deprecated, use dpl.GenerateFromUri instead") return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) }, "dpl": map[string]interface{}{ - "Generate": func(dplCommand string) string { + "Generate": func(dplCommand string) (string, error) { return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) }, - "GenerateFromUri": func(dplCommandUri string) string { + "GenerateFromUri": func(dplCommandUri string) (string, error) { return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) }, }, From 5b003ef53827c23ceb7264fd66befcc0702f81da Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Oct 2022 16:24:02 +0200 Subject: [PATCH 1425/2352] [peanut] Fix deadlock in UI redraw --- occ/peanut/peanut.go | 45 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index dbbf91ef9..8493ea11f 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -43,13 +43,13 @@ import ( "google.golang.org/grpc" ) -var( - app *tview.Application - state string - configMap map[string]string - controlList *tview.List +var ( + app *tview.Application + state string + configMap map[string]string + controlList *tview.List configTextView *tview.TextView - rpcClient *executorcmd.RpcClient + rpcClient *executorcmd.RpcClient ) func modal(p tview.Primitive, width, height int) tview.Primitive { @@ -62,7 +62,6 @@ func modal(p tview.Primitive, width, height int) tview.Primitive { AddItem(nil, 0, 1, false) } - func transition(evt string) error { args := make([]*pb.ConfigEntry, 0) for k, v := range configMap { @@ -79,8 +78,8 @@ func transition(evt string) error { response, err := rpcClient.Transition(context.TODO(), &pb.TransitionRequest{ TransitionEvent: evt, - Arguments: args, - SrcState: state, + Arguments: args, + SrcState: state, }, grpc.EmptyCallOption{}) if err != nil { app.Stop() @@ -92,7 +91,6 @@ func transition(evt string) error { configTextView.SetTitle("runtime configuration (PUSHED)") } state = response.GetState() - app.Draw() return nil } @@ -115,7 +113,7 @@ func acquireConfigFile(configPages *tview.Pages) error { app.Draw() } - configInputFrame.AddButton("Ok", func(){ + configInputFrame.AddButton("Ok", func() { pathItem := configInputFrame.GetFormItemByLabel("path:") pathInput := pathItem.(*tview.InputField) configFilePath := pathInput.GetText() @@ -134,7 +132,7 @@ func acquireConfigFile(configPages *tview.Pages) error { func errorMessage(configPages *tview.Pages, title string, text string) { modalPage := tview.NewModal().SetText(title + "\n\nError: " + text).AddButtons([]string{"Ok"}). - SetDoneFunc(func(_ int, _ string){ + SetDoneFunc(func(_ int, _ string) { configPages.RemovePage("modal") app.SetFocus(controlList) }) @@ -193,7 +191,7 @@ func Run(cmdString string) (err error) { app = tview.NewApplication() statusBox := tview.NewBox().SetBorder(true).SetTitle("state") - configTextView = tview.NewTextView().SetChangedFunc(func(){app.Draw()}) + configTextView = tview.NewTextView().SetChangedFunc(func() { app.Draw() }) configTextView.SetBorder(true).SetTitle("runtime configuration (EMPTY)") configPages := tview.NewPages(). AddPage("configBox", configTextView, true, true) @@ -202,30 +200,26 @@ func Run(cmdString string) (err error) { AddItem("Transition CONFIGURE", "perform CONFIGURE transition", 'c', - func(){ + func() { err = transition("CONFIGURE") - app.Draw() }). AddItem("Transition RESET", "perform RESET transition", 'r', - func(){ + func() { err = transition("RESET") - app.Draw() }). AddItem("Transition START", "perform START transition", 's', - func(){ + func() { err = transition("START") - app.Draw() }). AddItem("Transition STOP", "perform STOP transition", 't', - func(){ + func() { err = transition("STOP") - app.Draw() }). //AddItem("Transition GO_ERROR", // "perform GO_ERROR transition", @@ -237,23 +231,20 @@ func Run(cmdString string) (err error) { AddItem("Transition RECOVER", "perform RECOVER transition", 'v', - func(){ + func() { err = transition("RECOVER") - app.Draw() }). AddItem("Transition EXIT", "perform EXIT transition", 'x', - func(){ + func() { err = transition("EXIT") - app.Draw() }). AddItem("Load configuration", "read runtime configuration from file", 'l', func() { err = acquireConfigFile(configPages) - app.Draw() }). AddItem("Quit", "disconnect from the process and quit peanut", @@ -307,4 +298,4 @@ func Run(cmdString string) (err error) { app.Draw() }() return app.SetRoot(flex, true).SetFocus(controlList).Run() -} \ No newline at end of file +} From c1683ca6aad02fa2bbdd92df848d275528cdda8d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 12 Oct 2022 17:00:49 +0200 Subject: [PATCH 1426/2352] [build] Bump to v0.54.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a5e031fff..cdbbfbf2d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 53 +VERSION_MINOR := 54 VERSION_PATCH := 0 From 3c2d7a99096bdc63be0cfd4f98928b191324f8ae Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 12 Oct 2022 17:20:42 +0200 Subject: [PATCH 1427/2352] [core] Reindex RunType enum to be in sync with O2 --- apricot/protos/apricot.proto | 12 +++++------- common/runtype/runtype.go | 8 +++----- common/runtype/runtype_strings.go | 28 +++++++++++++++++++-------- core/integration/dcs/protos/dcs.proto | 3 ++- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index b16671e2b..8f5cae892 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -74,13 +74,11 @@ enum RunType { CALIBRATION_ANALOG_SCAN = 10; CALIBRATION_FHR = 11; CALIBRATION_ALPIDE_SCAN = 12; - NOISE = 13; - reserved 14 to 199; - - CALIBRATION = 200; - COSMICS = 201; - SYNTHETIC = 202; - reserved 203 to 299; + CALIBRATION = 13; + COSMICS = 14; + SYNTHETIC = 15; + NOISE = 16; + reserved 17 to 299; ANY = 300; } diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 10fd67bbd..9f3504a3d 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -44,10 +44,8 @@ const ( CALIBRATION_ANALOG_SCAN CALIBRATION_FHR CALIBRATION_ALPIDE_SCAN + CALIBRATION // no correspondence with DCS + COSMICS // no correspondence with DCS + SYNTHETIC // no correspondence with DCS NOISE - - // no correspondence with DCS: - CALIBRATION = 200 - COSMICS = 201 - SYNTHETIC = 202 ) diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index 5f126973b..fe60abb40 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANNOISE" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMICSSYNTHETICNOISE" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 196} +var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 209, 218, 223} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scannoise" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmicssyntheticnoise" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -38,10 +38,13 @@ func _RunTypeNoOp() { _ = x[CALIBRATION_ANALOG_SCAN-(10)] _ = x[CALIBRATION_FHR-(11)] _ = x[CALIBRATION_ALPIDE_SCAN-(12)] - _ = x[NOISE-(13)] + _ = x[CALIBRATION-(13)] + _ = x[COSMICS-(14)] + _ = x[SYNTHETIC-(15)] + _ = x[NOISE-(16)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, NOISE} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMICS, SYNTHETIC, NOISE} var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeName[0:4]: NONE, @@ -70,8 +73,14 @@ var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeLowerName[153:168]: CALIBRATION_FHR, _RunTypeName[168:191]: CALIBRATION_ALPIDE_SCAN, _RunTypeLowerName[168:191]: CALIBRATION_ALPIDE_SCAN, - _RunTypeName[191:196]: NOISE, - _RunTypeLowerName[191:196]: NOISE, + _RunTypeName[191:202]: CALIBRATION, + _RunTypeLowerName[191:202]: CALIBRATION, + _RunTypeName[202:209]: COSMICS, + _RunTypeLowerName[202:209]: COSMICS, + _RunTypeName[209:218]: SYNTHETIC, + _RunTypeLowerName[209:218]: SYNTHETIC, + _RunTypeName[218:223]: NOISE, + _RunTypeLowerName[218:223]: NOISE, } var _RunTypeNames = []string{ @@ -88,7 +97,10 @@ var _RunTypeNames = []string{ _RunTypeName[130:153], _RunTypeName[153:168], _RunTypeName[168:191], - _RunTypeName[191:196], + _RunTypeName[191:202], + _RunTypeName[202:209], + _RunTypeName[209:218], + _RunTypeName[218:223], } // RunTypeString retrieves an enum value from the enum constants string name. diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index f09a738d0..93f69beae 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -236,7 +236,8 @@ enum RunType { CALIBRATION_ANALOG_SCAN = 10; CALIBRATION_FHR = 11; CALIBRATION_ALPIDE_SCAN = 12; - NOISE = 13; + reserved 13 to 15; // CALIBRATION, COSMICS, SYNTHETIC + NOISE = 16; } enum TriggerMode { // FIXME: unused From cb4ebcbdd91ade13515865df03d75313100f0309 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Oct 2022 10:50:31 +0200 Subject: [PATCH 1428/2352] [misc] Update all protofiles and go generate calls for new Protobuf --- apricot/apricot.go | 4 ++-- apricot/protos/apricot.proto | 2 +- coconut/cmd/environment.go | 6 +++--- coconut/cmd/repo.go | 6 +++--- core/integration/dcs/plugin.go | 2 +- core/integration/dcs/protos/dcs.proto | 2 +- core/integration/ddsched/plugin.go | 2 +- core/integration/ddsched/protos/ddsched.proto | 2 +- core/integration/kafka/plugin.go | 2 +- core/integration/kafka/protos/kafka.proto | 2 +- core/integration/odc/plugin.go | 2 +- core/integration/trg/plugin.go | 2 +- core/integration/trg/protos/ctpecs.proto | 2 +- core/protos/o2control.proto | 2 +- core/server.go | 2 +- executor/executor.go | 2 +- occ/protos/occ.proto | 2 +- 17 files changed, 22 insertions(+), 22 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 78d0d2936..da8face6c 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -37,9 +37,9 @@ import ( "github.com/spf13/viper" ) -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/apricot.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/apricot.proto -var log = logger.New(logrus.StandardLogger(),"apricot") +var log = logger.New(logrus.StandardLogger(), "apricot") func Run() (err error) { if viper.GetBool("verbose") { diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 8f5cae892..94284d4de 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package apricot; option java_package = "ch.cern.alice.o2.apricot.rpcserver"; -option go_package = "protos;apricotpb"; +option go_package = "github.com/AliceO2Group/Control/apricot/protos;apricotpb"; service Apricot { rpc NewRunNumber(Empty) returns (RunNumberResponse) {} diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index 7b7d3ae76..f3c3be882 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protos/o2control.proto package cmd @@ -35,9 +35,9 @@ import ( // environmentCmd represents the environment command var environmentCmd = &cobra.Command{ - Use: "environment", + Use: "environment", Aliases: []string{"env", "e"}, - Short: fmt.Sprintf("create, destroy and manage %s environments", product.PRETTY_SHORTNAME), + Short: fmt.Sprintf("create, destroy and manage %s environments", product.PRETTY_SHORTNAME), Long: `The environments command allows you to perform operations on environments. An environment is an instance of a data-driven workflow of tasks, along with its workflow configuration, task configuration and state. diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index 36f9b310b..318ee027d 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. protos/o2control.proto +//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protos/o2control.proto package cmd @@ -32,9 +32,9 @@ import ( // repoCmd represents the repository command var repoCmd = &cobra.Command{ - Use: "repository", + Use: "repository", Aliases: []string{"repo"}, - Short: "manage git repositories for task and workflow configuration", + Short: "manage git repositories for task and workflow configuration", Long: `The repository command performs operations on the repositories used for task and workflow configuration. A valid workflow configuration repository must contain the directories ` + "`tasks`" + ` and ` + "`workflows`" + ` in its ` + "`master`" + ` branch. diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 5667d0dfb..2d64afa83 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/dcs.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/dcs.proto package dcs diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 93f69beae..fda126520 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package dcs; option java_package = "ch.cern.alice.dcs"; -option go_package = "protos;dcspb"; +option go_package = "github.com/AliceO2Group/Control/core/integration/dcs/protos;dcspb"; ////////////////////////////////////////////////////// diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 56f105897..5f3492128 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ddsched.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ddsched.proto package ddsched diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto index 50e98c8d2..588f23390 100644 --- a/core/integration/ddsched/protos/ddsched.proto +++ b/core/integration/ddsched/protos/ddsched.proto @@ -1,5 +1,5 @@ syntax = "proto3"; -option go_package = "protos;ddpb"; +option go_package = "github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb"; // Changelog: // 2021-02-08: - Initial version diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index abb808a68..e872306b0 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. protos/kafka.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative protos/kafka.proto package kafka diff --git a/core/integration/kafka/protos/kafka.proto b/core/integration/kafka/protos/kafka.proto index f2729f14a..f3b0a0f25 100644 --- a/core/integration/kafka/protos/kafka.proto +++ b/core/integration/kafka/protos/kafka.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package kafka; -option go_package = "protos;kafka"; +option go_package = "github.com/AliceO2Group/Control/core/integration/kafka/protos;kafka"; message NewStateNotification { EnvInfo envInfo = 1; diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a2c59d623..adbf21c18 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/odc.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/odc.proto package odc diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index e2f9f1b5f..2b01479ff 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -23,7 +23,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto package trg diff --git a/core/integration/trg/protos/ctpecs.proto b/core/integration/trg/protos/ctpecs.proto index 6647f0adc..c7d7fdbf1 100644 --- a/core/integration/trg/protos/ctpecs.proto +++ b/core/integration/trg/protos/ctpecs.proto @@ -1,6 +1,6 @@ syntax = "proto3"; package ctpd; -option go_package = "protos;ctpecs"; +option go_package = "github.com/AliceO2Group/Control/core/integration/trg/protos;ctpecs"; // ctpd interface for ECS service CTPd { diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index f54cca536..2318a8acf 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package o2control; option java_package = "ch.cern.alice.o2.control.rpcserver"; -option go_package = "protos;pb"; +option go_package = "github.com/AliceO2Group/Control/core/protos;pb"; //////////////// Common event messages /////////////// diff --git a/core/server.go b/core/server.go index 2f2079031..3aca9602c 100644 --- a/core/server.go +++ b/core/server.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto package core diff --git a/executor/executor.go b/executor/executor.go index c12574c13..7e9badeae 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -25,7 +25,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../occ --go_out=. --go-grpc_out=. protos/occ.proto +//go:generate protoc -I ../occ --go_out=. --go-grpc_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protos/occ.proto // Package executor implements the O² Control executor binary. package executor diff --git a/occ/protos/occ.proto b/occ/protos/occ.proto index 20d53239b..eba3b0ff9 100644 --- a/occ/protos/occ.proto +++ b/occ/protos/occ.proto @@ -26,7 +26,7 @@ syntax = "proto3"; package occ_pb; option java_package = "ch.cern.alice.o2.control.occ"; -option go_package = "protos;pb"; +option go_package = "github.com/AliceO2Group/Control/occ/protos;pb"; ////////////////////////////////////////////////////// From 9940d178a3fe2f2c0bc60af47ad48cd6d2bdb9b9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 13 Sep 2022 13:38:19 +0200 Subject: [PATCH 1429/2352] [build] Ensure the ddsched protofile is correctly patched --- Makefile | 5 ++++- core/integration/ddsched/protos/ddsched.proto | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2c7498baa..bc4103c15 100644 --- a/Makefile +++ b/Makefile @@ -155,7 +155,10 @@ vendor: # we insert a go_package specification into the ODC protofile right # after we download it. @echo -e "\033[1;33mpatch odc.proto\033[0m" - @perl -pi -e '$$_.="option go_package = \"protos;odc\";\n" if (/^package/)' core/integration/odc/protos/odc.proto + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/odc/protos;odc\";\n" if (/^package/)' core/integration/odc/protos/odc.proto + + @echo -e "\033[1;33mpatch ddsched.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb\";\n" if (/^package/)' core/integration/ddsched/protos/ddsched.proto # vendor: tools/dep # @echo -e "\033[1;33mdep ensure\033[0m" diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto index 588f23390..90b6a4a8f 100644 --- a/core/integration/ddsched/protos/ddsched.proto +++ b/core/integration/ddsched/protos/ddsched.proto @@ -1,5 +1,4 @@ syntax = "proto3"; -option go_package = "github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb"; // Changelog: // 2021-02-08: - Initial version @@ -7,6 +6,7 @@ option go_package = "github.com/AliceO2Group/Control/core/integration/ddsched/pr package o2.DataDistribution.Control; +option go_package = "github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb"; service DataDistributionControl { From 16f5cdbc0447c2ee2a26796f288e23ea58124c6f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Oct 2022 10:57:07 +0200 Subject: [PATCH 1430/2352] [misc] Update DDsched and ODC protofiles --- core/integration/ddsched/protos/ddsched.proto | 13 +++++++++++++ core/integration/odc/protos/odc.proto | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/integration/ddsched/protos/ddsched.proto b/core/integration/ddsched/protos/ddsched.proto index 90b6a4a8f..9f627d4e1 100644 --- a/core/integration/ddsched/protos/ddsched.proto +++ b/core/integration/ddsched/protos/ddsched.proto @@ -1,3 +1,16 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \author Gvozden Nešković, Frankfurt Institute for Advanced Studies and Goethe University Frankfurt + syntax = "proto3"; // Changelog: diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 3fee54396..3455d79aa 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package odc; -option go_package = "protos;odc"; +option go_package = "github.com/AliceO2Group/Control/core/integration/odc/protos;odc"; // The ODC service definition. // For details also see https://github.com/FairRootGroup/ODC#command-mapping From 6ba78a5a4ec8ffdb74e7324d0c373fe56e5d6470 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Oct 2022 11:04:52 +0200 Subject: [PATCH 1431/2352] [build] Regenerate protobuf/gRPC code --- apricot/protos/apricot.pb.go | 53 ++++---- apricot/protos/apricot_grpc.pb.go | 4 + coconut/protos/o2control.pb.go | 43 +++--- coconut/protos/o2control_grpc.pb.go | 4 + core/integration/dcs/protos/dcs.pb.go | 127 ++++++++++-------- core/integration/dcs/protos/dcs_grpc.pb.go | 4 + core/integration/ddsched/protos/ddsched.pb.go | 17 ++- .../ddsched/protos/ddsched_grpc.pb.go | 4 + core/integration/kafka/protos/kafka.pb.go | 16 +-- core/integration/odc/protos/odc.pb.go | 17 ++- core/integration/odc/protos/odc_grpc.pb.go | 4 + core/integration/trg/protos/ctpecs.pb.go | 17 ++- core/integration/trg/protos/ctpecs_grpc.pb.go | 4 + core/protos/o2control.pb.go | 43 +++--- core/protos/o2control_grpc.pb.go | 4 + executor/protos/occ.pb.go | 17 +-- executor/protos/occ_grpc.pb.go | 4 + 17 files changed, 209 insertions(+), 173 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 4756a38de..f4643156c 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -23,14 +23,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.21.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/apricot.proto package apricotpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -44,10 +43,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go // NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. type RunType int32 @@ -66,9 +61,10 @@ const ( RunType_CALIBRATION_ANALOG_SCAN RunType = 10 RunType_CALIBRATION_FHR RunType = 11 RunType_CALIBRATION_ALPIDE_SCAN RunType = 12 - RunType_CALIBRATION RunType = 200 - RunType_COSMICS RunType = 201 - RunType_SYNTHETIC RunType = 202 + RunType_CALIBRATION RunType = 13 + RunType_COSMICS RunType = 14 + RunType_SYNTHETIC RunType = 15 + RunType_NOISE RunType = 16 RunType_ANY RunType = 300 ) @@ -88,9 +84,10 @@ var ( 10: "CALIBRATION_ANALOG_SCAN", 11: "CALIBRATION_FHR", 12: "CALIBRATION_ALPIDE_SCAN", - 200: "CALIBRATION", - 201: "COSMICS", - 202: "SYNTHETIC", + 13: "CALIBRATION", + 14: "COSMICS", + 15: "SYNTHETIC", + 16: "NOISE", 300: "ANY", } RunType_value = map[string]int32{ @@ -107,9 +104,10 @@ var ( "CALIBRATION_ANALOG_SCAN": 10, "CALIBRATION_FHR": 11, "CALIBRATION_ALPIDE_SCAN": 12, - "CALIBRATION": 200, - "COSMICS": 201, - "SYNTHETIC": 202, + "CALIBRATION": 13, + "COSMICS": 14, + "SYNTHETIC": 15, + "NOISE": 16, "ANY": 300, } ) @@ -264,6 +262,7 @@ type ComponentRequest struct { unknownFields protoimpl.UnknownFields // Types that are assignable to QueryPath: + // // *ComponentRequest_Path // *ComponentRequest_Query QueryPath isComponentRequest_QueryPath `protobuf_oneof:"queryPath"` @@ -1113,6 +1112,7 @@ type ListComponentEntriesRequest struct { unknownFields protoimpl.UnknownFields // Types that are assignable to QueryPath: + // // *ListComponentEntriesRequest_Path // *ListComponentEntriesRequest_Query QueryPath isListComponentEntriesRequest_QueryPath `protobuf_oneof:"queryPath"` @@ -1898,12 +1898,12 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, - 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x10, 0x0a, 0x0b, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xc8, 0x01, 0x12, 0x0c, 0x0a, - 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0xc9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x53, - 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0xca, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x41, - 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x0d, 0x10, 0xc7, 0x01, 0x22, 0x06, 0x08, 0xcb, - 0x01, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, + 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, + 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, + 0x45, 0x10, 0x10, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, + 0x11, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, @@ -2009,11 +2009,14 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x36, 0x0a, 0x22, 0x63, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index c395a93dd..0bf0ce99a 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index a94353b0a..259ff4d15 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -23,14 +23,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.21.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/o2control.proto package pb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -44,10 +43,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type StatusUpdate_Level int32 const ( @@ -601,9 +596,9 @@ func (x *Ev_RoleEvent) GetRolePath() string { return "" } -//////////////////////////////////////// +// ////////////////////////////////////// // Global status -//////////////////////////////////////// +// ////////////////////////////////////// type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -704,6 +699,7 @@ type StatusUpdate struct { Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` // Types that are assignable to Event: + // // *StatusUpdate_MesosHeartbeat Event isStatusUpdate_Event `protobuf_oneof:"Event"` } @@ -778,6 +774,7 @@ type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are assignable to Payload: + // // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent @@ -920,9 +917,9 @@ func (x *SubscribeRequest) GetId() string { return "" } -//////////////////////////////////////// +// ////////////////////////////////////// // Framework -//////////////////////////////////////// +// ////////////////////////////////////// type GetFrameworkInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1261,9 +1258,9 @@ func (*TeardownReply) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{13} } -//////////////////////////////////////// +// ////////////////////////////////////// // Environment -//////////////////////////////////////// +// ////////////////////////////////////// type GetEnvironmentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2343,9 +2340,9 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Environment, GET/SET properties -//////////////////////////////////////// +// ////////////////////////////////////// type SetEnvironmentPropertiesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2554,9 +2551,9 @@ func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Tasks -//////////////////////////////////////// +// ////////////////////////////////////// type ShortTaskInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3328,9 +3325,9 @@ func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Roles -//////////////////////////////////////// +// ////////////////////////////////////// type GetRolesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5438,11 +5435,13 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 5d799227e..6c38c1c0c 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/o2control.proto package pb diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index b86b64302..79a58b7bf 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -24,14 +24,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/dcs.proto package dcspb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -45,10 +44,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type EventType int32 const ( @@ -221,6 +216,8 @@ const ( DetectorState_EOR_FAILURE DetectorState = 8 DetectorState_ERROR DetectorState = 9 DetectorState_DEAD DetectorState = 10 + DetectorState_SOR_UNAVAILABLE DetectorState = 11 + DetectorState_EOR_UNAVAILABLE DetectorState = 12 ) // Enum value maps for DetectorState. @@ -237,6 +234,8 @@ var ( 8: "EOR_FAILURE", 9: "ERROR", 10: "DEAD", + 11: "SOR_UNAVAILABLE", + 12: "EOR_UNAVAILABLE", } DetectorState_value = map[string]int32{ "NULL_STATE": 0, @@ -250,6 +249,8 @@ var ( "EOR_FAILURE": 8, "ERROR": 9, "DEAD": 10, + "SOR_UNAVAILABLE": 11, + "EOR_UNAVAILABLE": 12, } ) @@ -296,6 +297,7 @@ const ( RunType_CALIBRATION_ANALOG_SCAN RunType = 10 RunType_CALIBRATION_FHR RunType = 11 RunType_CALIBRATION_ALPIDE_SCAN RunType = 12 + RunType_NOISE RunType = 16 ) // Enum value maps for RunType. @@ -314,6 +316,7 @@ var ( 10: "CALIBRATION_ANALOG_SCAN", 11: "CALIBRATION_FHR", 12: "CALIBRATION_ALPIDE_SCAN", + 16: "NOISE", } RunType_value = map[string]int32{ "NULL_RUNTYPE": 0, @@ -329,6 +332,7 @@ var ( "CALIBRATION_ANALOG_SCAN": 10, "CALIBRATION_FHR": 11, "CALIBRATION_ALPIDE_SCAN": 12, + "NOISE": 16, } ) @@ -572,16 +576,16 @@ func (x *SubscriptionRequest) GetInstanceId() string { } // The Subscribe response stream returns Event payloads: -// 1) as needed, Events of type ERROR_EVENT, TIMEOUT, etc. when something unexpected -// happens, especially outside of a SOR or EOR operation (which are already served -// by operation-specific streams) -// 2) periodically, Events of type HEARTBEAT with a full detectorMatrix to republish -// the full status of all detectors in the system -// 3) as needed, Events of type STATE_CHANGE_EVENT and similar, with a partial -// detectorMatrix that only reflects the changes in some detectors, usually when -// the internal state of a detector has changed on the DCS side in some way that -// makes a new RunType possible, or that inhibits a RunType that was previously -// possible and now isn't any more. +// 1. as needed, Events of type ERROR_EVENT, TIMEOUT, etc. when something unexpected +// happens, especially outside of a SOR or EOR operation (which are already served +// by operation-specific streams) +// 2. periodically, Events of type HEARTBEAT with a full detectorMatrix to republish +// the full status of all detectors in the system +// 3. as needed, Events of type STATE_CHANGE_EVENT and similar, with a partial +// detectorMatrix that only reflects the changes in some detectors, usually when +// the internal state of a detector has changed on the DCS side in some way that +// makes a new RunType possible, or that inhibits a RunType that was previously +// possible and now isn't any more. type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1150,7 +1154,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, - 0x10, 0x11, 0x2a, 0xb9, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x10, 0x11, 0x2a, 0xe3, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, @@ -1161,46 +1165,53 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x2a, 0x9f, - 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, - 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, - 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, - 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, - 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, - 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, - 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, - 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, - 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, - 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, - 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, - 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, - 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, - 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, - 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, - 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, - 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x21, 0x0a, 0x11, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, - 0x73, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, + 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x2a, 0xb0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, + 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, + 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, + 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, + 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, + 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, + 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, + 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, + 0x49, 0x53, 0x45, 0x10, 0x10, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, + 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, + 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, + 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 0d6491fa4..9b02b34ef 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/dcs.proto package dcspb diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 135decb8d..6eb7f703d 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/ddsched.proto // Changelog: @@ -11,7 +11,6 @@ package ddpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -25,10 +24,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type PartitionState int32 const ( @@ -436,8 +431,12 @@ var file_protos_ddsched_proto_rawDesc = []byte{ 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x2e, 0x2e, 0x6f, 0x32, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x0d, 0x5a, 0x0b, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x46, 0x5a, 0x44, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x64, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x64, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 0e2419bfb..2ee5bbfec 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/ddsched.proto package ddpb diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go index 88bd5026f..611436e98 100644 --- a/core/integration/kafka/protos/kafka.pb.go +++ b/core/integration/kafka/protos/kafka.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/kafka.proto package kafka import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type NewStateNotification struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -254,8 +249,11 @@ var file_protos_kafka_proto_rawDesc = []byte{ 0x52, 0x13, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, - 0x0e, 0x5a, 0x0c, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x5a, 0x43, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index af05335c6..7e7b12d11 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/odc.proto package odc import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - // Request status type ReplyStatus int32 @@ -1813,8 +1808,12 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0c, 0x5a, 0x0a, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, + 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 1dd372c39..90a102e92 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/odc.proto package odc diff --git a/core/integration/trg/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go index 389b0d456..fa05b1f52 100644 --- a/core/integration/trg/protos/ctpecs.pb.go +++ b/core/integration/trg/protos/ctpecs.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/ctpecs.proto package ctpecs import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - // -config, e.g. "trig\nPH_bc 100 inf" or // -key in case the config is available in Consul[key] // -"" use default configuration @@ -492,8 +487,12 @@ var file_protos_ctpecs_proto_rawDesc = []byte{ 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x0f, 0x5a, 0x0d, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x72, 0x67, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/trg/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go index 3ebdfa98e..3f0de8d15 100644 --- a/core/integration/trg/protos/ctpecs_grpc.pb.go +++ b/core/integration/trg/protos/ctpecs_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/ctpecs.proto package ctpecs diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index a94353b0a..259ff4d15 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -23,14 +23,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.21.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/o2control.proto package pb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -44,10 +43,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type StatusUpdate_Level int32 const ( @@ -601,9 +596,9 @@ func (x *Ev_RoleEvent) GetRolePath() string { return "" } -//////////////////////////////////////// +// ////////////////////////////////////// // Global status -//////////////////////////////////////// +// ////////////////////////////////////// type StatusRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -704,6 +699,7 @@ type StatusUpdate struct { Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` // Types that are assignable to Event: + // // *StatusUpdate_MesosHeartbeat Event isStatusUpdate_Event `protobuf_oneof:"Event"` } @@ -778,6 +774,7 @@ type Event struct { Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are assignable to Payload: + // // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent @@ -920,9 +917,9 @@ func (x *SubscribeRequest) GetId() string { return "" } -//////////////////////////////////////// +// ////////////////////////////////////// // Framework -//////////////////////////////////////// +// ////////////////////////////////////// type GetFrameworkInfoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1261,9 +1258,9 @@ func (*TeardownReply) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{13} } -//////////////////////////////////////// +// ////////////////////////////////////// // Environment -//////////////////////////////////////// +// ////////////////////////////////////// type GetEnvironmentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2343,9 +2340,9 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Environment, GET/SET properties -//////////////////////////////////////// +// ////////////////////////////////////// type SetEnvironmentPropertiesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2554,9 +2551,9 @@ func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Tasks -//////////////////////////////////////// +// ////////////////////////////////////// type ShortTaskInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3328,9 +3325,9 @@ func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { return nil } -//////////////////////////////////////// +// ////////////////////////////////////// // Roles -//////////////////////////////////////// +// ////////////////////////////////////// type GetRolesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5438,11 +5435,13 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x2f, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 5f36b5891..ee006c779 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 251f011c4..7eff90bb9 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -23,14 +23,13 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.17.3 +// protoc-gen-go v1.28.1 +// protoc v3.21.6 // source: protos/occ.proto package pb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -44,10 +43,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type StateChangeTrigger int32 const ( @@ -777,10 +772,12 @@ var file_protos_occ_proto_rawDesc = []byte{ 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x29, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x4d, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x09, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x6f, 0x63, 0x63, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index eafb7734d..f9e8fa494 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.6 +// source: protos/occ.proto package pb From 385581b02531ff9fbc723146a00461d2a3570f5f Mon Sep 17 00:00:00 2001 From: dvoscek <115143333+dvoscek@users.noreply.github.com> Date: Tue, 11 Oct 2022 12:20:50 +0200 Subject: [PATCH 1432/2352] DCS proto file - added AGD in Detector enum --- core/integration/dcs/protos/dcs.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index fda126520..9583dd7f6 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -204,6 +204,7 @@ enum Detector { ZDC = 15; LHC = 16; DCS = 17; + AGD = 18; } enum DetectorState { From 5b501d6cd1d6cd2ff4c3a1cf7201b4bed247ad61 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Oct 2022 16:16:36 +0200 Subject: [PATCH 1433/2352] [core] Conversion between ECS and DCS detector codes in DCS client --- core/integration/dcs/dcsutil.go | 33 +++++++++- core/integration/dcs/plugin.go | 111 +++++++++++++++++--------------- 2 files changed, 90 insertions(+), 54 deletions(-) diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go index 7df6737cb..a38e78104 100644 --- a/core/integration/dcs/dcsutil.go +++ b/core/integration/dcs/dcsutil.go @@ -25,20 +25,21 @@ package dcs import ( + "fmt" "strings" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/sirupsen/logrus" ) -func resolveDefaults(detectorArgMap map[string]string, varStack map[string]string, det dcspb.Detector, theLog *logrus.Entry) map[string]string { +func resolveDefaults(detectorArgMap map[string]string, varStack map[string]string, ecsDetector string, theLog *logrus.Entry) map[string]string { // Do we have any default expressions for defaultable values? defaultableKeys := []string{"ddl_list"} for _, key := range defaultableKeys { if defaultableValue, ok := detectorArgMap[key]; ok { if strings.TrimSpace(strings.ToLower(defaultableValue)) == "default" { // if one of the defaultable keys has value `default`... - defaultPayloadKey := strings.ToLower(det.String()) + "_default_" + key // e.g. tof_default_ddl_list + defaultPayloadKey := strings.ToLower(ecsDetector) + "_default_" + key // e.g. tof_default_ddl_list if defaultPayload, ok := varStack[defaultPayloadKey]; ok { detectorArgMap[key] = defaultPayload } else { @@ -49,3 +50,31 @@ func resolveDefaults(detectorArgMap map[string]string, varStack map[string]strin } return detectorArgMap } + +func ecsToDcsDetector(ecsDetector string) (dcspb.Detector, error) { + var err error + det := strings.ToUpper(strings.TrimSpace(ecsDetector)) + + // Special case: if TST is present, we send AGD to DCS + if det == "TST" { + det = "AGD" + } + + intDet, ok := dcspb.Detector_value[det] + if !ok { + err = fmt.Errorf("invalid DCS detector %s", det) + log.WithError(err).Error("bad DCS detector entry") + return dcspb.Detector_NULL_DETECTOR, err + } + + return dcspb.Detector(intDet), nil +} + +func dcsToEcsDetector(dcsDetector dcspb.Detector) string { + det := dcsDetector.String() + // Special case: if AGD is present, we send TST to ECS + if det == "AGD" { + det = "TST" + } + return det +} diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 2d64afa83..624a10a78 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -167,13 +167,13 @@ func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) } func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { - call, ok := data.(*callable.Call) - if !ok { + call, callOk := data.(*callable.Call) + if !callOk { return } varStack := call.VarStack - envId, ok := varStack["environment_id"] - if !ok { + envId, envOk := varStack["environment_id"] + if !envOk { log.Error("cannot acquire environment ID") return } @@ -200,7 +200,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } - detectors, err := p.parseDetectors(dcsDetectorsParam) + dcsDetectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -217,7 +217,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - Infof("performing DCS SOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + Infof("performing DCS SOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] if !ok { @@ -265,11 +265,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { in := dcspb.SorRequest{ RunType: rt, RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), } - for i, det := range detectors { - perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_dcs_sor_parameters"] - if !ok { + for i, dcsDet := range dcsDetectors { + ecsDet := dcsToEcsDetector(dcsDet) + perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] + if !okParam { log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") @@ -279,13 +280,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(perDetectorParameters) err = json.Unmarshal(bytes, &detectorArgMap) if err != nil { - err = fmt.Errorf("error processing %s DCS SOR parameter map: %w", det.String(), err) + err = fmt.Errorf("error processing %s DCS SOR parameter map: %w", ecsDet, err) log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "StartOfRun"). - WithField("detector", det.String()). + WithField("detector", ecsDet). WithField("runNumber", runNumber64). Error("DCS error") @@ -298,13 +299,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Per-detector parameters override any general dcs_sor_parameters err = mergo.Merge(&detectorArgMap, argMap) if err != nil { - err = fmt.Errorf("error processing %s DCS SOR general parameters override: %w", det.String(), err) + err = fmt.Errorf("error processing %s DCS SOR general parameters override: %w", dcsDet.String(), err) log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "StartOfRun"). - WithField("detector", det.String()). + WithField("detector", ecsDet). WithField("runNumber", runNumber64). Error("DCS error") @@ -315,14 +316,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // We parse the consolidated per-detector payload for any defaultable parameters with value "default" - detectorArgMap = resolveDefaults(detectorArgMap, varStack, det, + detectorArgMap = resolveDefaults(detectorArgMap, varStack, ecsDet, log.WithField("partition", envId). WithField("call", "StartOfRun"). - WithField("detector", det.String()). + WithField("detector", ecsDet). WithField("runNumber", runNumber64)) in.Detectors[i] = &dcspb.DetectorOperationRequest{ - Detector: det, + Detector: dcsDet, ExtraParameters: detectorArgMap, } } @@ -367,7 +368,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer cancel() detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) - for _, v := range detectors { + for _, v := range dcsDetectors { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } @@ -430,13 +431,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - logErr := fmt.Errorf("%s SOR failure event from DCS", dcsEvent.GetDetector().String()) + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s SOR failure event from DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } log.WithError(logErr). WithField("event", dcsEvent). - WithField("detector", dcsEvent.GetDetector().String()). + WithField("detector", ecsDet). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). @@ -461,10 +464,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingEORs[envId] = runNumber64 break } else { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) log.WithField("partition", envId). WithField("runNumber", runNumber64). - WithField("detector", dcsEvent.GetDetector().String()). - Debugf("DCS SOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + WithField("detector", ecsDet). + Debugf("DCS SOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) } } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { @@ -483,18 +487,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } - dcsFailedDetectors := make([]string, 0) + dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true - for _, v := range detectors { + for _, v := range dcsDetectors { if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { dcsopOk = false - dcsFailedDetectors = append(dcsFailedDetectors, v.String()) + dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) } } if dcsopOk { p.pendingEORs[envId] = runNumber64 } else { - logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedDetectors, ", ")) + logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -523,7 +527,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } - detectors, err := p.parseDetectors(dcsDetectorsParam) + dcsDetectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -540,7 +544,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("runNumber", runNumber64). - Infof("performing DCS EOR for detectors: %s", strings.Join(detectors.StringSlice(), " ")) + Infof("performing DCS EOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_eor_parameters"] if !ok { @@ -570,11 +574,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.EorRequest{ RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(detectors)), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), } - for i, det := range detectors { - perDetectorParameters, ok := varStack[strings.ToLower(det.String())+"_dcs_eor_parameters"] - if !ok { + for i, dcsDet := range dcsDetectors { + ecsDet := dcsToEcsDetector(dcsDet) + perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_eor_parameters"] + if !okParam { log.WithField("partition", envId). WithField("runNumber", runNumber64). Debug("empty DCS detectors list provided") @@ -584,13 +589,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(perDetectorParameters) err = json.Unmarshal(bytes, &detectorArgMap) if err != nil { - err = fmt.Errorf("error processing %s DCS EOR parameter map: %w", det.String(), err) + err = fmt.Errorf("error processing %s DCS EOR parameter map: %w", dcsDet.String(), err) log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "EndOfRun"). - WithField("detector", det.String()). + WithField("detector", ecsDet). WithField("runNumber", runNumber64). Error("DCS error") @@ -603,13 +608,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Per-detector parameters override any general dcs_eor_parameters err = mergo.Merge(&detectorArgMap, argMap) if err != nil { - err = fmt.Errorf("error processing %s DCS EOR general parameters override: %w", det.String(), err) + err = fmt.Errorf("error processing %s DCS EOR general parameters override: %w", dcsDet.String(), err) log.WithError(err). WithField("level", infologger.IL_Support). WithField("partition", envId). WithField("call", "EndOfRun"). - WithField("detector", det.String()). + WithField("detector", ecsDet). WithField("runNumber", runNumber64). Error("DCS error") @@ -620,7 +625,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } in.Detectors[i] = &dcspb.DetectorOperationRequest{ - Detector: det, + Detector: dcsDet, ExtraParameters: detectorArgMap, } } @@ -693,7 +698,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("DCS EndOfRun returned stream, awaiting responses (DCS cleanup will not run for this environment)") detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) - for _, v := range detectors { + for _, v := range dcsDetectors { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } @@ -734,13 +739,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { - logErr := fmt.Errorf("%s EOR failure event from DCS", dcsEvent.GetDetector().String()) + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s EOR failure event from DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } log.WithError(logErr). WithField("event", dcsEvent). - WithField("detector", dcsEvent.GetDetector().String()). + WithField("detector", ecsDet). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("runNumber", runNumber64). @@ -765,10 +772,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingEORs, envId) break } else { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) log.WithField("partition", envId). WithField("runNumber", runNumber64). WithField("detector", dcsEvent.GetDetector().String()). - Debugf("DCS EOR for %s: received status %s", dcsEvent.GetDetector().String(), dcsEvent.GetState().String()) + Debugf("DCS EOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) } } @@ -779,18 +787,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("ALIECS EOR operation : processing DCS EOR for ") } - dcsFailedDetectors := make([]string, 0) + dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true - for _, v := range detectors { + for _, v := range dcsDetectors { if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { dcsopOk = false - dcsFailedDetectors = append(dcsFailedDetectors, v.String()) + dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) } } if dcsopOk { delete(p.pendingEORs, envId) } else { - logErr := fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedDetectors, ", ")) + logErr := fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -865,15 +873,14 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors DCSDetector // Now we process the stringSlice into a slice of detector enum values detectors = make(DCSDetectors, len(detectorsSlice)) for i, det := range detectorsSlice { - intDet, ok := dcspb.Detector_value[det] - if !ok { - err = fmt.Errorf("invalid DCS detector %s", det) - log.WithError(err).Error("bad DCS detector entry") + dcsDetector := dcspb.Detector_NULL_DETECTOR + dcsDetector, err = ecsToDcsDetector(det) + if err != nil { return } // detector string correctly matched to DCS enum - detectors[i] = dcspb.Detector(intDet) + detectors[i] = dcsDetector } return } @@ -882,7 +889,7 @@ func (p *Plugin) Destroy() error { return p.dcsClient.Close() } -func (d DCSDetectors) StringSlice() (sslice []string) { +func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { if d == nil { return } @@ -892,7 +899,7 @@ func (d DCSDetectors) StringSlice() (sslice []string) { } for i, det := range d { - sslice[i] = det.String() + sslice[i] = dcsToEcsDetector(det) } return } From 05b0f0077000d69c9fd9053fa4f6b1821c0b0e53 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 14 Oct 2022 16:27:16 +0200 Subject: [PATCH 1434/2352] Bump GH actions --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 1244a3fcd..e9a209c55 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macOS-latest, ubuntu-18.04] + os: [macOS-latest, ubuntu-20.04] go: [ '1.18.4' ] steps: - uses: actions/checkout@v2 From cbea88687174378cae3186c59b50f0c3fd6fffe7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 17 Oct 2022 16:52:06 +0200 Subject: [PATCH 1435/2352] [core] Send TRG to ODC detector list if ctp_readout_enabled --- core/integration/odc/plugin.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index adbf21c18..aa8d64781 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -382,6 +382,13 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter Error("cannot parse general detector list") return } + + // Special case: if the detector list is "default" and ctp_readout_enabled==true, we include TRG + ctpReadoutEnabled := "false" + ctpReadoutEnabled, ok = varStack["ctp_readout_enabled"] + if ok && strings.ToLower(strings.TrimSpace(ctpReadoutEnabled)) == "true" { + detectorsSlice = append(detectorsSlice, "TRG") + } pdpDetectorList = strings.Join(detectorsSlice, ",") } accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", strings.TrimSpace(pdpDetectorList))) From aa36b74eec151ae329f22c398e8f46deefaf41ac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 17 Oct 2022 16:53:07 +0200 Subject: [PATCH 1436/2352] [build] Bump to v0.54.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cdbbfbf2d..925463ebd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 54 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 8f24b05c8bf59e15342f2b9b6933ec9d83716a98 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Oct 2022 14:14:58 +0200 Subject: [PATCH 1437/2352] [core] Ensure consolidated defaults/vars/userVars are sent back --- core/server.go | 43 +++++++++++++++++++++++++++-------- core/workflow/iteratorrole.go | 4 ++++ core/workflow/role.go | 1 + core/workflow/rolebase.go | 13 +++++++++++ 4 files changed, 51 insertions(+), 10 deletions(-) diff --git a/core/server.go b/core/server.go index 3aca9602c..3282c8ab6 100644 --- a/core/server.go +++ b/core/server.go @@ -209,6 +209,14 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm continue } tasks := env.Workflow().GetTasks() + var defaults, vars, userVars map[string]string + defaults, vars, userVars, err = env.Workflow().ConsolidatedVarMaps() + if err != nil { + defaults = env.GlobalDefaults.Raw() + vars = env.GlobalVars.Raw() + userVars = env.UserVars.Raw() + } + e := &pb.EnvironmentInfo{ Id: env.Id().String(), CreatedWhen: env.CreatedWhen().UnixMilli(), @@ -216,9 +224,9 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm RootRole: env.Workflow().GetName(), Description: env.Description, CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: env.GlobalDefaults.Raw(), - Vars: env.GlobalVars.Raw(), - UserVars: env.UserVars.Raw(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, NumberOfFlps: int32(len(env.GetFLPs())), NumberOfHosts: int32(len(env.GetAllHosts())), } @@ -300,6 +308,14 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme } tasks := newEnv.Workflow().GetTasks() + var defaults, vars, userVars map[string]string + defaults, vars, userVars, err = newEnv.Workflow().ConsolidatedVarMaps() + if err != nil { + defaults = newEnv.GlobalDefaults.Raw() + vars = newEnv.GlobalVars.Raw() + userVars = newEnv.UserVars.Raw() + } + ei := &pb.EnvironmentInfo{ Id: newEnv.Id().String(), CreatedWhen: newEnv.CreatedWhen().UnixMilli(), @@ -308,9 +324,9 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme RootRole: newEnv.Workflow().GetName(), Description: newEnv.Description, CurrentRunNumber: newEnv.GetCurrentRunNumber(), - Defaults: newEnv.GlobalDefaults.Raw(), - Vars: newEnv.GlobalVars.Raw(), - UserVars: newEnv.UserVars.Raw(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, NumberOfFlps: int32(len(newEnv.GetFLPs())), NumberOfHosts: int32(len(newEnv.GetAllHosts())), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), @@ -342,6 +358,13 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe } tasks := env.Workflow().GetTasks() + var defaults, vars, userVars map[string]string + defaults, vars, userVars, err = env.Workflow().ConsolidatedVarMaps() + if err != nil { + defaults = env.GlobalDefaults.Raw() + vars = env.GlobalVars.Raw() + userVars = env.UserVars.Raw() + } reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ Id: env.Id().String(), @@ -351,9 +374,9 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe RootRole: env.Workflow().GetName(), Description: env.Description, CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: env.GlobalDefaults.Raw(), - Vars: env.GlobalVars.Raw(), - UserVars: env.UserVars.Raw(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, NumberOfFlps: int32(len(env.GetFLPs())), NumberOfHosts: int32(len(env.GetAllHosts())), }, @@ -394,7 +417,7 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir td := eot.Sub(sot) if err != nil { - err := env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) + err = env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) if err != nil { log.WithField("partition", env.Id()).Warnf("could not complete requested GO_ERROR transition, forcing move to ERROR: %s", err.Error()) env.Sm.SetState("ERROR") diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 7368a06ee..854ae6202 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -227,6 +227,10 @@ func (i *iteratorRole) ConsolidatedVarStack() (varStack map[string]string, err e return nil, errors.New("iterator has no stack") } +func (r *iteratorRole) ConsolidatedVarMaps() (defaults map[string]string, vars map[string]string, userVars map[string]string, err error) { + return nil, nil, nil, nil +} + func (i *iteratorRole) GetParent() Updatable { if i == nil || i.template == nil { return nil diff --git a/core/workflow/role.go b/core/workflow/role.go index 3f796ef9b..e071faea6 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -67,6 +67,7 @@ type Role interface { IsEnabled() bool GetCurrentRunNumber() uint32 ConsolidatedVarStack() (varStack map[string]string, err error) + ConsolidatedVarMaps() (defaults, vars, userVars map[string]string, err error) GetEnvironmentId() uid.ID } diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 8ce9000ed..3d54ff5a8 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -142,6 +142,19 @@ func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error return } +func (r *roleBase) ConsolidatedVarMaps() (defaults map[string]string, vars map[string]string, userVars map[string]string, err error) { + defaults, err = r.Defaults.Flattened() + if err != nil { + return + } + vars, err = r.Vars.Flattened() + if err != nil { + return + } + userVars, err = r.UserVars.Flattened() + return +} + func (r *roleBase) makeBuildObjectStackFunc() template.BuildObjectStackFunc { return func(stage template.Stage) map[string]interface{} { type wfNode struct { From c5ab630a5fb189e9815d448cc630962ed1a36581 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Oct 2022 11:23:05 +0200 Subject: [PATCH 1438/2352] [build] Bump to v0.54.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 925463ebd..51a69a728 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 54 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 0e96dfecc1498023421e48bc01e4328f8ef93cb6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Oct 2022 14:59:23 +0200 Subject: [PATCH 1439/2352] [misc] Improve documentation of RunType enums --- apricot/protos/apricot.proto | 5 ++++- common/runtype/runtype.go | 4 +++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 94284d4de..e998424ef 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -59,7 +59,10 @@ service Apricot { } // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go -// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. +// NOTE: this run type list is replicated in AliceO2 repo in +// https://github.com/AliceO2Group/AliceO2/blob/dev/DataFormats/Parameters/include/DataFormatsParameters/ECSDataAdapters.h +// Inform Ruben when the list is updated. + enum RunType { NULL = 0; PHYSICS = 1; diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 9f3504a3d..f0db04b5e 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -27,7 +27,9 @@ package runtype // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and apricot.proto -// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. +// NOTE: this run type list is replicated in AliceO2 repo in +// https://github.com/AliceO2Group/AliceO2/blob/dev/DataFormats/Parameters/include/DataFormatsParameters/ECSDataAdapters.h +// Inform Ruben when the list is updated. type RunType int const ( From b3252bf8b51555bb435c15a242fb91b6fd015356 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Oct 2022 14:59:46 +0200 Subject: [PATCH 1440/2352] [core] CCDB client: include TRG in GRP object if ctp_readout_enabled --- core/integration/ccdb/plugin.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index ddd255571..92fcf675c 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,6 +29,13 @@ import ( "encoding/json" "errors" "fmt" + "go/types" + "net/url" + "os/exec" + "strconv" + "strings" + "time" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -36,12 +43,6 @@ import ( "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/sirupsen/logrus" "github.com/spf13/viper" - "go/types" - "net/url" - "os/exec" - "strconv" - "strings" - "time" ) var log = logger.New(logrus.StandardLogger(), "ccdbclient") @@ -164,6 +165,13 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { return nil } + // Special case: if ctp_readout_enabled, we must add TRG to the detectors list + ctpReadoutEnabled := "false" + ctpReadoutEnabled, ok = varStack["ctp_readout_enabled"] + if ok && strings.ToLower(strings.TrimSpace(ctpReadoutEnabled)) == "true" { + detectorsSlice = append(detectorsSlice, "TRG") + } + // TODO fill once we have those available var continuousReadoutDetectors []string var triggeringDetectors []string From 9ae29d55ad2f0ebb612103f4ba6a44e7e2edd50f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Oct 2022 15:00:27 +0200 Subject: [PATCH 1441/2352] [build] Bump to v0.54.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 51a69a728..d180ea4a9 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 54 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From b4110513b3cca712af3215992fd5bd24b24f66fc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Oct 2022 10:22:36 +0200 Subject: [PATCH 1442/2352] [core] Fix crash in incoming event handling --- core/environment/manager.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index f04448cf5..c9324a186 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -522,11 +522,12 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { env, err := envs.environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler"). - WithField("partition", t.GetEnvironmentId().String()). WithError(err). Error("cannot find environment for DeviceEvent") } - env.NotifyEvent(evt) + if env != nil { + env.NotifyEvent(evt) + } } } else { log.WithPrefix("scheduler"). From 7d2140311db3c21e64e1573d2aa40530e62573df Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Oct 2022 15:18:26 +0200 Subject: [PATCH 1443/2352] [core] log task name when launching, do not log unknown fields It is very hard to understand what we are launching when seeing this log: ``` launching task arguments="[]" command="" executorId="2b64uRrAZLV" offerId="32d772d9-0b53-4993-89b8-5cbba97fd25c-O5319787" shenv="nil" taskId="2bNEDDC1JkH" user="" ``` At this stage the fields arguments, command, user and shenv are not even set, so reporting them does not make sense, while we could log task name, which is very helpful to know. The log after changes looks as follows: ``` launching task executorId="2bNyeXqPrzr" name="github.com/AliceO2Group/ControlWorkflows/tasks/fairmq-shmmonitor@6431d49d86ef219fad559510e400b98a7b6ba48f?2bNyeXqQCUn" offerId="d821eca9-76fa-44c8-8d76-2cfd3d7bfa51-O1467528" taskId="2bNyeXqQCUn" ``` --- core/task/scheduler.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 16de28053..fca931011 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -862,13 +862,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, "taskId": newTaskId, "offerId": offer.ID.Value, "executorId": state.executor.ExecutorID.Value, - "command": mesosTaskInfo.Command.GetValue(), - "arguments": mesosTaskInfo.Command.GetArguments(), - "shenv": mesosTaskInfo.Command.GetEnvironment().String(), - "user": mesosTaskInfo.Command.GetUser(), }).Debug("launching task") taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State: "LAUNCHED", Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) From b7e6ba479ba2b04693061788d5e8d78eb3c84700 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 2 Nov 2022 10:49:44 +0100 Subject: [PATCH 1444/2352] [core] logging failed task should be an error, add the task name --- core/environment/manager.go | 2 +- core/task/manager.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index c9324a186..f7ae96ac5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -252,7 +252,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("partition", env.Id().String()). WithError(err). WithField("level", infologger.IL_Devel). - Warn("environment deployment and configuration error, cleanup in progress") + Error("environment deployment and configuration error, cleanup in progress") errTxErr := env.TryTransition(NewGoErrorTransition( envs.taskman), diff --git a/core/task/manager.go b/core/task/manager.go index 72a7fe4e9..4f7578d21 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -648,7 +648,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { tciValue = *tci.Value } - taskDescription = fmt.Sprintf("task '%s' on %s (id %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), v.Error()) + taskDescription = fmt.Sprintf("task '%s' on %s (id %s, name %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), task.GetName(), v.Error()) } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } From 78687ee094af1ff7395a36e7d30ce208fddef803 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 2 Nov 2022 23:19:26 +0100 Subject: [PATCH 1445/2352] [core] Protect crit section in scheduler and make more concurrent --- core/task/manager.go | 17 +- core/task/match.go | 4 +- core/task/scheduler.go | 730 +++++++++++++++++--------------- core/workflow/aggregatorrole.go | 3 +- 4 files changed, 400 insertions(+), 354 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 4f7578d21..243952812 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -30,6 +30,7 @@ import ( "fmt" "io/ioutil" "strings" + "sync" "time" "github.com/AliceO2Group/Control/apricot" @@ -74,6 +75,8 @@ type ResourceOffersDeploymentRequest struct { } type Manager struct { + deployMu sync.Mutex + ctx context.Context fidStore store.Singleton AgentCache AgentCache @@ -449,10 +452,15 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // First we ask Mesos to revive offers and block until done, then upon receiving // the offers, we ask Mesos to run the required roles - if any. + m.deployMu.Lock() + timeReviveOffers := time.Now() + timeDeployMu := time.Now() m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers <-m.reviveOffersTrg // we only continue when it's done - utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", log.WithField("tasksToRun", len(tasksToRun)).WithField("partition", envId)) + utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", + log.WithField("tasksToRun", len(tasksToRun)). + WithField("partition", envId)) m.tasksToDeploy <- ResourceOffersDeploymentRequest{ tasksToDeploy: tasksToRun, @@ -466,6 +474,13 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // reservation for that mesos-role on behalf of our scheduler roOutcome := <-m.resourceOffersDone + + utils.TimeTrack(timeDeployMu, "acquireTasks: deployment critical section", + log.WithField("tasksToRun", len(tasksToRun)). + WithField("partition", envId)) + + m.deployMu.Unlock() + deployedTasks = roOutcome.deployed undeployedDescriptors = roOutcome.undeployed diff --git a/core/task/match.go b/core/task/match.go index bff2c9dfe..3b69e1b0e 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -68,11 +68,11 @@ func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor, envId uid.ID) (r } else { log.WithPrefix("scheduler"). WithField("partition", envId.String()). - Warnf("missing ports resource requirement for requested task class %s", descriptor.TaskClassName) + Tracef("missing ports resource requirement for requested task class %s", descriptor.TaskClassName) } r.InboundChannels = channel.MergeInbound(descriptor.RoleBind, taskClass.Bind) } else { - err = fmt.Errorf("attempted to get wants for descriptor but task class %s not found in manager", descriptor.TaskClassName) + err = fmt.Errorf("task class %s not found in manager", descriptor.TaskClassName) } return } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index fca931011..b6e07a226 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -35,6 +35,7 @@ import ( "io" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/apricot" @@ -518,425 +519,454 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // We make a map[Descriptor]constraint.Constraints and for each descriptor to deploy we // fill it with the pre-computed total constraints for that Descriptor. + descriptorConstraints := state.taskman.BuildDescriptorConstraints(descriptorsStillToDeploy) + // We protect the descriptors structures with a mutex, within the scope of the current offers round + descriptorsMu := sync.Mutex{} + utils.TimeTrack(timeGotDescriptors, "resourceOffers: descriptors channel receive to constraints built", log. WithField("descriptors", len(descriptorsStillToDeploy)). WithField("partition", envId.String())) timeForOffers := time.Now() // NOTE: 1 offer per host - // FIXME: this for should be parallelized with a sync.WaitGroup - // for a likely significant multinode launch performance increase - for _, offer := range offers { - timeSingleOffer := time.Now() - var ( - remainingResourcesInOffer = mesos.Resources(offer.Resources) - taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(DeploymentMap) - targetExecutorId = mesos.ExecutorID{} - ) - - // If there are no executors provided by the offer, - // we start a new one by generating a new ID - if len(offer.ExecutorIDs) == 0 { - targetExecutorId.Value = uid.New().String() - } else { - targetExecutorId.Value = offer.ExecutorIDs[0].Value - } - host := offer.GetHostname() - var detector string - detector, err = apricot.Instance().GetDetectorForHost(host) - if err != nil { - detector = "" - } - - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - }). - WithField("partition", envId.String()). - WithField("detector", detector). - Trace("processing offer") + // Parallelized offer processing + var offerWaitGroup sync.WaitGroup + offerWaitGroup.Add(len(offers)) + + for offerIndex, offer := range offers { + go func(offerIndex int, offer *mesos.Offer) { + defer offerWaitGroup.Done() + + timeSingleOffer := time.Now() + var ( + remainingResourcesInOffer = mesos.Resources(offer.Resources) + taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) + tasksDeployedForCurrentOffer = make(DeploymentMap) + targetExecutorId = mesos.ExecutorID{} + ) + + // If there are no executors provided by the offer, + // we start a new one by generating a new ID + if len(offer.ExecutorIDs) == 0 { + targetExecutorId.Value = uid.New().String() + } else { + targetExecutorId.Value = offer.ExecutorIDs[0].Value + } - remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) + host := offer.GetHostname() + var detector string + detector, err = apricot.Instance().GetDetectorForHost(host) + if err != nil { + detector = "" + } - // avoid the expense of computing these if we can... - if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { - for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { - if resType == mesos.SCALAR { - sum, _ := name.Sum(remainingResourcesFlattened...) - state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "offerId": offer.ID.Value, + "offerHost": host, + "resources": remainingResourcesInOffer.String(), + "partition": envId.String(), + "detector": detector, + }). + Trace("processing offer") + + remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) + + // avoid the expense of computing these if we can... + if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { + for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { + if resType == mesos.SCALAR { + sum, _ := name.Sum(remainingResourcesFlattened...) + state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) + } } } - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", detector). - Trace("state lock to process descriptors to deploy") - state.Lock() + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", detector). + Trace("state lock to process descriptors to deploy") - // We iterate down over the descriptors, and we remove them as we match - FOR_DESCRIPTORS: - for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { - descriptor := descriptorsStillToDeploy[i] + timeDescriptorsSection := time.Now() + descriptorsMu.Lock() - varStackBottom := descriptor.TaskRole.GetUserVars() + // We iterate down over the descriptors, and we remove them as we match + FOR_DESCRIPTORS: + for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsStillToDeploy[i] - descriptorDetector, ok := varStackBottom.Get("detector") - if !ok { - descriptorDetector = "" - } + varStackBottom := descriptor.TaskRole.GetUserVars() - offerAttributes := constraint.Attributes(offer.Attributes) - if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "attributes": offerAttributes.String(), - }). - Trace("descriptor constraints not satisfied by offer attributes") + descriptorDetector, ok := varStackBottom.Get("detector") + if !ok { + descriptorDetector = "" } - continue - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Debug("offer attributes satisfy constraints") - var wants *Wants - wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) - if err != nil { + offerAttributes := constraint.Attributes(offer.Attributes) + if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), + }). + Trace("descriptor constraints not satisfied by offer attributes") + } + continue // next descriptor + } log.WithPrefix("scheduler"). - WithError(err). WithField("partition", envId.String()). WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "class": descriptor.TaskClassName, - "constraints": descriptor.RoleConstraints.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, - }). - Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") - continue - } - if !Resources(remainingResourcesInOffer).Satisfy(wants) { - if viper.GetBool("veryVerbose") { + Debug("offer attributes satisfy constraints") + + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + if err != nil { log.WithPrefix("scheduler"). + WithError(err). WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, }). - Warn("descriptor wants not satisfied by offer resources") + Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") + continue // next descriptor + } + if !Resources(remainingResourcesInOffer).Satisfy(wants) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Warn("descriptor wants not satisfied by offer resources") + } + continue // next descriptor } - continue - } - // Point of no return, we start subtracting resources + // Point of no return, we start subtracting resources + + bindMap := make(channel.BindMap) + for _, ch := range wants.InboundChannels { + if ch.Addressing == channel.IPC { + bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) + } else { + var availPorts mesos.Ranges + availPorts, ok = resources.Ports(remainingResourcesInOffer...) + if !ok { + continue FOR_DESCRIPTORS + } + // TODO: this can be optimized by excluding the base range outside the loop + availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) + port := availPorts.Min() + builder := resources.Build(). + Name(resources.Name("ports")). + Ranges(resources.BuildRanges().Span(port, port).Ranges) + remainingResourcesInOffer.Subtract(builder.Resource) + bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) + } - bindMap := make(channel.BindMap) - for _, ch := range wants.InboundChannels { - if ch.Addressing == channel.IPC { - bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) - } else { - availPorts, ok := resources.Ports(remainingResourcesInOffer...) - if !ok { - continue FOR_DESCRIPTORS + // global channel alias processing + if len(ch.Global) != 0 { + bindMap["::"+ch.Global] = bindMap[ch.Name] } - // TODO: this can be optimized by excluding the base range outside the loop - availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) - port := availPorts.Min() - builder := resources.Build(). - Name(resources.Name("ports")). - Ranges(resources.BuildRanges().Span(port, port).Ranges) - remainingResourcesInOffer.Subtract(builder.Resource) - bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) - } - // global channel alias processing - if len(ch.Global) != 0 { - bindMap["::"+ch.Global] = bindMap[ch.Name] } - } - agentForCache := AgentCacheInfo{ - AgentId: offer.AgentID, - Attributes: offer.Attributes, - Hostname: offer.Hostname, - } - state.taskman.AgentCache.Update(agentForCache) //thread safe - machinesUsed[offer.Hostname] = struct{}{} + agentForCache := AgentCacheInfo{ + AgentId: offer.AgentID, + Attributes: offer.Attributes, + Hostname: offer.Hostname, + } + state.taskman.AgentCache.Update(agentForCache) //thread safe + machinesUsed[offer.Hostname] = struct{}{} - taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) - if taskPtr == nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithField("offerId", offer.ID.Value). - Error("cannot get task for offer+descriptor, this should never happen") - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Trace("state unlock") - continue - } + taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) + if taskPtr == nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithField("offerId", offer.ID.Value). + Error("cannot get task for offer+descriptor, this should never happen") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Trace("state unlock") + continue // next descriptor + } - // Do not decline this offer - _, contains := offerIDsToDecline[offer.ID] - if contains { - delete(offerIDsToDecline, offer.ID) - } + // Do not decline this offer + _, contains := offerIDsToDecline[offer.ID] + if contains { + delete(offerIDsToDecline, offer.ID) + } - // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize - err = taskPtr.BuildTaskCommand(descriptor.TaskRole) - if err != nil { - log.WithPrefix("scheduler"). - WithField("offerId", offer.ID.Value). - WithError(err). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Error("cannot build task command") - continue - } - cmd := taskPtr.GetTaskCommandInfo() + // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize + err = taskPtr.BuildTaskCommand(descriptor.TaskRole) + if err != nil { + log.WithPrefix("scheduler"). + WithField("offerId", offer.ID.Value). + WithError(err). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Error("cannot build task command") + continue // next descriptor + } + cmd := taskPtr.GetTaskCommandInfo() - // Claim the control port - availPorts, ok := resources.Ports(remainingResourcesInOffer...) - if !ok { - continue FOR_DESCRIPTORS - } - // The control port range starts at 47101 - // FIXME: make the control ports cutoff configurable - availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 29999}) - controlPort := availPorts.Min() - builder := resources.Build(). - Name(resources.Name("ports")). - Ranges(resources.BuildRanges().Span(controlPort, controlPort).Ranges) - remainingResourcesInOffer.Subtract(builder.Resource) - - // Append control port to arguments - // For the control port parameter and/or environment variable, see occ/OccGlobals.h - if cmd.ControlMode != controlmode.BASIC && - cmd.ControlMode != controlmode.HOOK { - cmd.ControlPort = controlPort - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) - } + // Claim the control port + availPorts, ok := resources.Ports(remainingResourcesInOffer...) + if !ok { + continue FOR_DESCRIPTORS + } + // The control port range starts at 47101 + // FIXME: make the control ports cutoff configurable + availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 29999}) + controlPort := availPorts.Min() + builder := resources.Build(). + Name(resources.Name("ports")). + Ranges(resources.BuildRanges().Span(controlPort, controlPort).Ranges) + remainingResourcesInOffer.Subtract(builder.Resource) + + // Append control port to arguments + // For the control port parameter and/or environment variable, see occ/OccGlobals.h + if cmd.ControlMode != controlmode.BASIC && + cmd.ControlMode != controlmode.HOOK { + cmd.ControlPort = controlPort + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) + } - if cmd.ControlMode == controlmode.FAIRMQ { - cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) - } + if cmd.ControlMode == controlmode.FAIRMQ { + cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) + } - // Convenience function that scans through cmd.Env and appends the - // given key-value pair if the given variable isn't already - // provided by the user. - fillEnvDefault := func(varName string, defaultValue string) { - varIsUserProvided := false - for _, envVar := range cmd.Env { - if strings.HasPrefix(envVar, varName) { - varIsUserProvided = true - break + // Convenience function that scans through cmd.Env and appends the + // given key-value pair if the given variable isn't already + // provided by the user. + fillEnvDefault := func(varName string, defaultValue string) { + varIsUserProvided := false + for _, envVar := range cmd.Env { + if strings.HasPrefix(envVar, varName) { + varIsUserProvided = true + break + } + } + if !varIsUserProvided { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) } } - if !varIsUserProvided { - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) + + // Iterated call of the above function for the given kv-map of + // env var defaults + for varName, defaultValue := range map[string]string{ + "O2_ROLE": offer.Hostname, + "O2_SYSTEM": "FLP", + } { + fillEnvDefault(varName, defaultValue) } - } - // Iterated call of the above function for the given kv-map of - // env var defaults - for varName, defaultValue := range map[string]string{ - "O2_ROLE": offer.Hostname, - "O2_SYSTEM": "FLP", - } { - fillEnvDefault(varName, defaultValue) - } + runCommand := *cmd - runCommand := *cmd + // Serialize the actual command to be passed to the executor + var jsonCommand []byte + jsonCommand, err = json.Marshal(&runCommand) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "error": err.Error(), + "value": *runCommand.Value, + "args": runCommand.Arguments, + "shell": *runCommand.Shell, + "json": jsonCommand, + }). + Error("cannot serialize mesos.CommandInfo for executor") - // Serialize the actual command to be passed to the executor - var jsonCommand []byte - jsonCommand, err = json.Marshal(&runCommand) - if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "error": err.Error(), - "value": *runCommand.Value, - "args": runCommand.Arguments, - "shell": *runCommand.Shell, - "json": jsonCommand, - }). - Error("cannot serialize mesos.CommandInfo for executor") - state.Unlock() + continue // next descriptor + } + + // Build resources request + resourcesRequest := make(mesos.Resources, 0) + resourcesRequest.Add1(resources.NewCPUs(wants.Cpu).Resource) + resourcesRequest.Add1(resources.NewMemory(wants.Memory).Resource) + portsBuilder := resources.BuildRanges() + for _, rng := range wants.StaticPorts { + portsBuilder = portsBuilder.Span(rng.Begin, rng.End) + } + for _, endpoint := range bindMap { + // We only add the endpoint to the portsBuilder if it has a port + if tcpEndpoint, ok := endpoint.(channel.TcpEndpoint); ok { + portsBuilder = portsBuilder.Span(tcpEndpoint.Port, tcpEndpoint.Port) + } + } + portsBuilder = portsBuilder.Span(controlPort, controlPort) + + portRanges := portsBuilder.Ranges.Sort().Squash() + portsResources := resources.Build().Name(resources.Name("ports")).Ranges(portRanges) + resourcesRequest.Add1(portsResources.Resource) + + // Append executor resources to request + executorResources := mesos.Resources(state.executor.Resources) log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("detector", descriptorDetector). - Trace("state unlock") - continue - } - - // Build resources request - resourcesRequest := make(mesos.Resources, 0) - resourcesRequest.Add1(resources.NewCPUs(wants.Cpu).Resource) - resourcesRequest.Add1(resources.NewMemory(wants.Memory).Resource) - portsBuilder := resources.BuildRanges() - for _, rng := range wants.StaticPorts { - portsBuilder = portsBuilder.Span(rng.Begin, rng.End) - } - for _, endpoint := range bindMap { - // We only add the endpoint to the portsBuilder if it has a port - if tcpEndpoint, ok := endpoint.(channel.TcpEndpoint); ok { - portsBuilder = portsBuilder.Span(tcpEndpoint.Port, tcpEndpoint.Port) + WithField("taskResources", resourcesRequest). + WithField("executorResources", executorResources). + Debug("creating Mesos task") + resourcesRequest.Add(executorResources...) + + newTaskId := taskPtr.GetTaskId() + + executor := state.executor + executor.ExecutorID.Value = taskPtr.GetExecutorId() + envIdS := envId.String() + + mesosTaskInfo := mesos.TaskInfo{ + Name: taskPtr.GetName(), + TaskID: mesos.TaskID{Value: newTaskId}, + AgentID: offer.AgentID, + Executor: executor, + Resources: resourcesRequest, + Data: jsonCommand, // this ends up in LAUNCH for the executor + Labels: &mesos.Labels{Labels: []mesos.Label{ + { + Key: "environmentId", + Value: &envIdS, + }, + { + Key: "detector", + Value: &detector, + }, + }}, } - } - portsBuilder = portsBuilder.Span(controlPort, controlPort) - portRanges := portsBuilder.Ranges.Sort().Squash() - portsResources := resources.Build().Name(resources.Name("ports")).Ranges(portRanges) - resourcesRequest.Add1(portsResources.Resource) + // We must run the executor with a special LD_LIBRARY_PATH because + // its InfoLogger binding is built with GCC-Toolchain + ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") + mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} + if ok { + mesosTaskInfo.Executor.Command.Environment.Variables = + append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) + } - // Append executor resources to request - executorResources := mesos.Resources(state.executor.Resources) - log.WithPrefix("scheduler"). + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, + "taskId": newTaskId, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + }).Debug("launching task") + taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State: "LAUNCHED", Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) + + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + tasksDeployedForCurrentOffer[taskPtr] = descriptor + } // end FOR_DESCRIPTORS + descriptorsMu.Unlock() + + utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithField("taskResources", resourcesRequest). - WithField("executorResources", executorResources). - Debug("creating Mesos task") - resourcesRequest.Add(executorResources...) - - newTaskId := taskPtr.GetTaskId() - - executor := state.executor - executor.ExecutorID.Value = taskPtr.GetExecutorId() - envIdS := envId.String() - - mesosTaskInfo := mesos.TaskInfo{ - Name: taskPtr.GetName(), - TaskID: mesos.TaskID{Value: newTaskId}, - AgentID: offer.AgentID, - Executor: executor, - Resources: resourcesRequest, - Data: jsonCommand, // this ends up in LAUNCH for the executor - Labels: &mesos.Labels{Labels: []mesos.Label{ - { - Key: "environmentId", - Value: &envIdS, - }, - { - Key: "detector", - Value: &detector, - }, - }}, - } - - // We must run the executor with a special LD_LIBRARY_PATH because - // its InfoLogger binding is built with GCC-Toolchain - ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") - mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} - if ok { - mesosTaskInfo.Executor.Command.Environment.Variables = - append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) - } + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers))) + timeOfferAcceptance := time.Now() log.WithPrefix("scheduler"). + WithField("detector", detector). WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "name": mesosTaskInfo.Name, - "taskId": newTaskId, - "offerId": offer.ID.Value, - "executorId": state.executor.ExecutorID.Value, - }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State: "LAUNCHED", Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) - - taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) - descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) - tasksDeployedForCurrentOffer[taskPtr] = descriptor - } // end FOR_DESCRIPTORS - state.Unlock() - log.WithPrefix("scheduler"). - WithField("detector", detector). - WithField("partition", envId.String()). - Trace("state unlock") + Trace("state unlock") - // build ACCEPT call to launch all of the tasks we've assembled - accept := calls.Accept( - calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), - ).With(callOption) // handles refuseSeconds etc. + // build ACCEPT call to launch all of the tasks we've assembled + accept := calls.Accept( + calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), + ).With(callOption) // handles refuseSeconds etc. - // send ACCEPT call to mesos - err = calls.CallNoData(ctx, state.cli, accept) - if err != nil { - log.WithPrefix("scheduler"). - WithField("detector", detector). - WithField("partition", envId.String()). - WithField("error", err.Error()). - Error("failed to launch tasks") - // FIXME: we probably need to react to a failed ACCEPT here - } else { - if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { - tasksLaunchedThisCycle += n + // send ACCEPT call to mesos + err = calls.CallNoData(ctx, state.cli, accept) + if err != nil { log.WithPrefix("scheduler"). - WithField("tasks", n). - WithField("partition", envId.String()). WithField("detector", detector). - WithField("level", infologger.IL_Support). - WithField("offerHost", offer.Hostname). - Infof("launch request sent to %s: %d tasks", offer.Hostname, n) - for _, taskInfo := range taskInfosToLaunchForCurrentOffer { + WithField("partition", envId.String()). + WithField("error", err.Error()). + Error("failed to launch tasks") + // FIXME: we probably need to react to a failed ACCEPT here + } else { + if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { + tasksLaunchedThisCycle += n log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "executorId": taskInfo.GetExecutor().ExecutorID.Value, - "executorName": taskInfo.GetExecutor().GetName(), - "agentId": taskInfo.GetAgentID().Value, - "taskId": taskInfo.GetTaskID().Value, - "level": infologger.IL_Devel, - }). - WithField("offerHost", offer.Hostname). + WithField("tasks", n). WithField("partition", envId.String()). WithField("detector", detector). - Debug("task launch requested") - } + WithField("level", infologger.IL_Support). + WithField("offerHost", offer.Hostname). + Infof("launch request sent to %s: %d tasks", offer.Hostname, n) + for _, taskInfo := range taskInfosToLaunchForCurrentOffer { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "executorId": taskInfo.GetExecutor().ExecutorID.Value, + "executorName": taskInfo.GetExecutor().GetName(), + "agentId": taskInfo.GetAgentID().Value, + "taskId": taskInfo.GetTaskID().Value, + "level": infologger.IL_Devel, + }). + WithField("offerHost", offer.Hostname). + WithField("partition", envId.String()). + WithField("detector", detector). + Debug("task launch requested") + } - // update deployment map - for k, v := range tasksDeployedForCurrentOffer { - tasksDeployed[k] = v + // update deployment map + for k, v := range tasksDeployedForCurrentOffer { + tasksDeployed[k] = v + } + } else { + offersDeclined++ } - } else { - offersDeclined++ } - } - utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. - WithField("partition", envId.String()). - WithField("detector", detector). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers)). - WithField("offersDeclined", len(offerIDsToDecline)). - WithField("offerHost", offer.Hostname)) + utils.TimeTrack(timeOfferAcceptance, "resourceOffers: single offer acceptance section", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) + + utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) + }(offerIndex, &offer) // end for offer closure } // end for _, offer := range offers + offerWaitGroup.Wait() - utils.TimeTrack(timeForOffers, "resourceOffers: constraints built to for_offers done", log. + utils.TimeTrack(timeForOffers, "resourceOffers: constraints built to for_offers done (concurrent)", log. WithField("partition", envId.String()). WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers)). diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index fe304d56c..aaec9a918 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -129,7 +129,8 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { - log.WithField("partition", r.GetEnvironmentId().String()).Info(err.Error()) + log.WithField("partition", r.GetEnvironmentId().String()). + Trace(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return From 12a972bf4ec5903c274825e8017ba566ab038c54 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Nov 2022 14:10:58 +0100 Subject: [PATCH 1446/2352] [core] Improve scheduler debug output --- core/task/scheduler.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index b6e07a226..50cf15d15 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -571,7 +571,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "partition": envId.String(), "detector": detector, }). - Trace("processing offer") + Debug("processing offer") remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) @@ -889,12 +889,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. WithField("partition", envId.String()). + WithField("offerHost", host). WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers))) timeOfferAcceptance := time.Now() log.WithPrefix("scheduler"). + WithField("offerHost", host). WithField("detector", detector). WithField("partition", envId.String()). Trace("state unlock") @@ -911,6 +913,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("detector", detector). WithField("partition", envId.String()). WithField("error", err.Error()). + WithField("offerHost", host). Error("failed to launch tasks") // FIXME: we probably need to react to a failed ACCEPT here } else { From dd9ac0f3fa0a8dcf0b2cd99f315165da883f3d33 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Nov 2022 10:37:12 +0100 Subject: [PATCH 1447/2352] [core] Correct scope of local offer --- core/task/scheduler.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 50cf15d15..06ea043bc 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -536,10 +536,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var offerWaitGroup sync.WaitGroup offerWaitGroup.Add(len(offers)) - for offerIndex, offer := range offers { - go func(offerIndex int, offer *mesos.Offer) { + for offerIndex, _ := range offers { + go func(offerIndex int) { defer offerWaitGroup.Done() + offer := offers[offerIndex] + timeSingleOffer := time.Now() var ( remainingResourcesInOffer = mesos.Resources(offer.Resources) @@ -697,7 +699,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han state.taskman.AgentCache.Update(agentForCache) //thread safe machinesUsed[offer.Hostname] = struct{}{} - taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) + taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) if taskPtr == nil { log.WithPrefix("scheduler"). WithField("partition", envId.String()). @@ -965,7 +967,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("offers", len(offers)). WithField("offerHost", offer.Hostname)) - }(offerIndex, &offer) // end for offer closure + }(offerIndex) // end for offer closure } // end for _, offer := range offers offerWaitGroup.Wait() From 154a20eb158d5da51b01892b2b7f312891ea0b88 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Nov 2022 11:12:47 +0100 Subject: [PATCH 1448/2352] [build] Bump gRPC dependency --- go.mod | 12 ++++++------ go.sum | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index ebc6fce2d..a9c9b8c3a 100644 --- a/go.mod +++ b/go.mod @@ -63,9 +63,9 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.1.0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa - golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c - golang.org/x/sys v0.0.0-20220731174439-a90be440212d - google.golang.org/grpc v1.48.0 + golang.org/x/net v0.1.0 + golang.org/x/sys v0.1.0 + google.golang.org/grpc v1.50.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 google.golang.org/protobuf v1.28.1 gopkg.in/yaml.v3 v3.0.1 @@ -143,11 +143,11 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect - golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/term v0.1.0 // indirect + golang.org/x/text v0.4.0 // indirect golang.org/x/tools v0.1.12 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9 // indirect + google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect gopkg.in/ini.v1 v1.66.6 // indirect gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/go.sum b/go.sum index 7af9755da..6d56b90f1 100644 --- a/go.sum +++ b/go.sum @@ -728,6 +728,8 @@ golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 h1:UreQrH7DbFXSi9ZFox6FNT3WB golang.org/x/net v0.0.0-20220728211354-c7608f3a8462/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -834,6 +836,8 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -841,6 +845,8 @@ golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= +golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -850,6 +856,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -978,6 +986,8 @@ google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9 h1:d3fKQZK+1rWQMg3xLKQbPMirUCo29I/NRdI2WarSzTg= google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -998,6 +1008,8 @@ google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAG google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= +google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= +google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= From c766feb1e7332d48efcb4ab7fc7736b32178d073 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 4 Nov 2022 11:13:08 +0100 Subject: [PATCH 1449/2352] [build] Bump to v0.55.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index d180ea4a9..7c8485e36 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 54 -VERSION_PATCH := 3 +VERSION_MINOR := 55 +VERSION_PATCH := 0 From 45b377fe4fce186cdccdb3e77d03c0545ab6ecd9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Nov 2022 13:55:43 +0100 Subject: [PATCH 1450/2352] [core] Disable strict host checking in pre-deploy cleanup ssh call --- core/environment/transition_deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 8b199b959..d3fae6379 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -76,7 +76,7 @@ func (t DeployTransition) do(env *Environment) (err error) { go func(flp string) { defer wg.Done() - cmdString := "ssh root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" + cmdString := "ssh -o StrictHostKeyChecking=no root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" log.WithField("partition", env.Id().String()). Traceln("[cleanup binary] Executing: " + cmdString) cmd := exec.Command("/bin/bash", "-c", cmdString) From b1ca2480e3b6cdb3d10de0461bc2c71277cb6e3e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Nov 2022 11:59:31 +0100 Subject: [PATCH 1451/2352] [core] Enable and expand RPCserver method logging and time tracking --- common/utils/utils.go | 6 ++++++ core/server.go | 26 +++++++++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index efd3e70a2..12faa43e4 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -37,10 +37,15 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" + "github.com/spf13/viper" "gopkg.in/yaml.v3" ) func TimeTrack(start time.Time, name string, log *logrus.Entry) { + if !viper.GetBool("verbose") { + return + } + if log == nil { log = logger.New(logrus.StandardLogger(), "debug").WithPrefix("debug") } @@ -58,6 +63,7 @@ func TimeTrackFunction(start time.Time, log *logrus.Entry) { // Regex to extract just the function name (and not the module path). runtimeFunc := regexp.MustCompile(`^.*\.(.*)$`) name := runtimeFunc.ReplaceAllString(funcObj.Name(), "$1") + log = log.WithField("method", funcObj.Name()) TimeTrack(start, name, log) } diff --git a/core/server.go b/core/server.go index 3282c8ab6..c6e003547 100644 --- a/core/server.go +++ b/core/server.go @@ -32,6 +32,7 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" @@ -78,7 +79,8 @@ func (m *RpcServer) logMethod() { } log.WithPrefix("rpcserver"). WithField("method", fun.Name()). - Trace("handling RPC request") + WithField("level", infologger.IL_Devel). + Debug("handling RPC request") } // Implements interface pb.ControlServer @@ -88,6 +90,7 @@ type RpcServer struct { } func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() r := &pb.ListIntegratedServicesReply{Services: nil} @@ -136,6 +139,7 @@ func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) e } func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoRequest) (*pb.GetFrameworkInfoReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() maj, _ := strconv.ParseInt(product.VERSION_MAJOR, 10, 32) @@ -190,6 +194,7 @@ func (*RpcServer) Teardown(context.Context, *pb.TeardownRequest) (*pb.TeardownRe } func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() r := &pb.GetEnvironmentsReply{ @@ -243,6 +248,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm } func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (reply *pb.NewEnvironmentReply, err error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() // NEW_ENVIRONMENT transition // The following should @@ -339,6 +345,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme } func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (reply *pb.GetEnvironmentReply, err error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil || len(req.Id) == 0 { @@ -390,6 +397,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe } func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvironmentRequest) (*pb.ControlEnvironmentReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil || len(req.Id) == 0 { @@ -448,6 +456,7 @@ func (*RpcServer) ModifyEnvironment(context.Context, *pb.ModifyEnvironmentReques } func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvironmentRequest) (*pb.DestroyEnvironmentReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil || len(req.Id) == 0 { @@ -533,6 +542,7 @@ func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force boo } func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetActiveDetectorsReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() r := &pb.GetActiveDetectorsReply{ Detectors: make([]string, 0), @@ -545,6 +555,7 @@ func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetA } func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasksReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() tasks := m.state.taskman.GetTasks() @@ -556,6 +567,7 @@ func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasks } func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.GetTaskReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() task := m.state.taskman.GetTask(req.TaskId) @@ -606,6 +618,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge } func (m *RpcServer) CleanupTasks(cxt context.Context, req *pb.CleanupTasksRequest) (*pb.CleanupTasksReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() idsToKill := req.GetTaskIds() @@ -635,6 +648,7 @@ func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.Shor } func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb.GetRolesReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil || len(req.EnvId) == 0 { @@ -661,6 +675,7 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. } func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflowTemplatesRequest) (*pb.GetWorkflowTemplatesReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -722,6 +737,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo } func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*pb.ListReposReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -749,6 +765,7 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p } func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -773,6 +790,7 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -789,6 +807,7 @@ func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) ( } func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposRequest) (*pb.Empty, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -809,6 +828,7 @@ func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposReques } func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRequest) (*pb.Empty, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -824,6 +844,7 @@ func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRe } func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlobalDefaultRevisionRequest) (*pb.Empty, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -839,6 +860,7 @@ func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlo } func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoDefaultRevisionRequest) (*pb.SetRepoDefaultRevisionReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() if req == nil { @@ -855,6 +877,7 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD } func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() for { ch, ok := m.streams.GetChannel(req.GetId()) @@ -878,6 +901,7 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe } func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() ch := make(chan *pb.Event) m.streams.add(request.GetId(), ch) From 1cbec8f3c5ab345291c9335b4c2b5850fb3d2cc0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Nov 2022 12:09:41 +0100 Subject: [PATCH 1452/2352] [build] Bump to v0.55.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7c8485e36..8f5d6fcfd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 55 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 92c552bb84587ee3dd235c68845f861ffc1622ea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Nov 2022 17:23:46 +0100 Subject: [PATCH 1453/2352] [core] Add integrated services data to EnvironmentInfo in proto --- coconut/protos/o2control.pb.go | 1428 ++++++++++++++------------- coconut/protos/o2control_grpc.pb.go | 2 +- core/protos/o2control.pb.go | 1428 ++++++++++++++------------- core/protos/o2control.proto | 1 + core/protos/o2control_grpc.pb.go | 2 +- 5 files changed, 1453 insertions(+), 1408 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 259ff4d15..5378a2015 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.9 // source: protos/o2control.proto package pb @@ -1376,19 +1376,20 @@ type EnvironmentInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` - IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` - Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` - NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` + Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` + NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` + IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *EnvironmentInfo) Reset() { @@ -1514,6 +1515,13 @@ func (x *EnvironmentInfo) GetNumberOfHosts() int32 { return 0 } +func (x *EnvironmentInfo) GetIntegratedServicesData() map[string]string { + if x != nil { + return x.IntegratedServicesData + } + return nil +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4796,7 +4804,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xe4, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x9f, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4831,7 +4839,14 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, @@ -4842,606 +4857,611 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, - 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, - 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, + 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, + 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, + 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, + 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, - 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, - 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, - 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, - 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, + 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, + 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, + 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, + 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, + 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, + 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, - 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, - 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, - 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, - 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, - 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, + 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, + 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, + 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, + 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, + 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, + 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5457,7 +5477,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 83) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 84) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5536,17 +5556,18 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 74: o2control.EnvironmentInfo.DefaultsEntry nil, // 75: o2control.EnvironmentInfo.VarsEntry nil, // 76: o2control.EnvironmentInfo.UserVarsEntry - nil, // 77: o2control.NewEnvironmentRequest.VarsEntry - nil, // 78: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 79: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 80: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 81: o2control.TaskInfo.PropertiesEntry - nil, // 82: o2control.RoleInfo.DefaultsEntry - nil, // 83: o2control.RoleInfo.VarsEntry - nil, // 84: o2control.RoleInfo.UserVarsEntry - nil, // 85: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 86: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 87: o2control.ListIntegratedServicesReply.ServicesEntry + nil, // 77: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 78: o2control.NewEnvironmentRequest.VarsEntry + nil, // 79: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 80: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 81: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 82: o2control.TaskInfo.PropertiesEntry + nil, // 83: o2control.RoleInfo.DefaultsEntry + nil, // 84: o2control.RoleInfo.VarsEntry + nil, // 85: o2control.RoleInfo.UserVarsEntry + nil, // 86: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 87: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 88: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5561,98 +5582,99 @@ var file_protos_o2control_proto_depIdxs = []int32{ 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 77, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 78, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 53, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 51, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 79, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 80, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 41, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 40, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 49, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 40, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 46, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 48, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 48, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 47, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 81, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 40, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 40, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 53, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 82, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 83, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 84, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 85, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 53, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 86, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 57, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 87, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 56, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 73, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 19, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 53: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 54: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 55: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 71, // 59: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 42, // 60: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 44, // 61: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 50, // 62: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 52, // 63: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 55, // 64: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 65: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 66: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 67: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 68: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 69: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 70: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 71: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 72: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 71, // 73: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 74: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 75: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 76: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 82: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 83: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 84: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 43, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 45, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 51, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 54, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event - 72, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 74, // [74:99] is the sub-list for method output_type - 49, // [49:74] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 77, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 78, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 79, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 53, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 51, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 80, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 81, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 41, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 40, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 49, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 46, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 48, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 48, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 47, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 82, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 40, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 40, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 53, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 83, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 84, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 85, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 86, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 53, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 87, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 57, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 88, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 56, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 73, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 19, // 53: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 54: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 55: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 56: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 71, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 42, // 61: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 44, // 62: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 50, // 63: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 52, // 64: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 55, // 65: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 66: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 67: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 68: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 69: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 70: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 71: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 72: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 73: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 71, // 74: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 75: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 77: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 78: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 79: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 80: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 81: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 82: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 83: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 84: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 85: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 43, // 86: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 45, // 87: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 51, // 88: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 54, // 89: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 90: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 91: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 92: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 93: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 94: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 95: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 96: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 97: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 98: o2control.Control.Subscribe:output_type -> o2control.Event + 72, // 99: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 75, // [75:100] is the sub-list for method output_type + 50, // [50:75] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -6504,7 +6526,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 83, + NumMessages: 84, NumExtensions: 0, NumServices: 1, }, diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 6c38c1c0c..759ae2b9b 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.9 // source: protos/o2control.proto package pb diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 259ff4d15..5378a2015 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.9 // source: protos/o2control.proto package pb @@ -1376,19 +1376,20 @@ type EnvironmentInfo struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` - RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` - IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` - Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` - NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedWhen int64 `protobuf:"varint,2,opt,name=createdWhen,proto3" json:"createdWhen,omitempty"` // msec + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,4,rep,name=tasks,proto3" json:"tasks,omitempty"` + RootRole string `protobuf:"bytes,5,opt,name=rootRole,proto3" json:"rootRole,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,6,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Defaults map[string]string `protobuf:"bytes,7,rep,name=defaults,proto3" json:"defaults,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + UserVars map[string]string `protobuf:"bytes,9,rep,name=userVars,proto3" json:"userVars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfFlps int32 `protobuf:"varint,10,opt,name=numberOfFlps,proto3" json:"numberOfFlps,omitempty"` + IncludedDetectors []string `protobuf:"bytes,11,rep,name=includedDetectors,proto3" json:"includedDetectors,omitempty"` + Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` + NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` + IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *EnvironmentInfo) Reset() { @@ -1514,6 +1515,13 @@ func (x *EnvironmentInfo) GetNumberOfHosts() int32 { return 0 } +func (x *EnvironmentInfo) GetIntegratedServicesData() map[string]string { + if x != nil { + return x.IntegratedServicesData + } + return nil +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4796,7 +4804,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xe4, 0x05, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x9f, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4831,7 +4839,14 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, @@ -4842,606 +4857,611 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, - 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, - 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, + 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, + 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, + 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, + 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, + 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, + 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, + 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, - 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, - 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, - 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, - 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, - 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, - 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, - 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, - 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, - 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, + 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, + 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, + 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, + 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, + 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, + 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, + 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, + 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, + 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, + 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, + 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, - 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, + 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, - 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, - 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, - 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, - 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, - 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, + 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, + 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, + 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, + 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, + 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, + 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, + 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, + 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, + 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, + 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, + 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, + 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, + 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, + 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, + 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, - 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, - 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, + 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5457,7 +5477,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 83) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 84) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5536,17 +5556,18 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 74: o2control.EnvironmentInfo.DefaultsEntry nil, // 75: o2control.EnvironmentInfo.VarsEntry nil, // 76: o2control.EnvironmentInfo.UserVarsEntry - nil, // 77: o2control.NewEnvironmentRequest.VarsEntry - nil, // 78: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 79: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 80: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 81: o2control.TaskInfo.PropertiesEntry - nil, // 82: o2control.RoleInfo.DefaultsEntry - nil, // 83: o2control.RoleInfo.VarsEntry - nil, // 84: o2control.RoleInfo.UserVarsEntry - nil, // 85: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 86: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 87: o2control.ListIntegratedServicesReply.ServicesEntry + nil, // 77: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 78: o2control.NewEnvironmentRequest.VarsEntry + nil, // 79: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 80: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 81: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 82: o2control.TaskInfo.PropertiesEntry + nil, // 83: o2control.RoleInfo.DefaultsEntry + nil, // 84: o2control.RoleInfo.VarsEntry + nil, // 85: o2control.RoleInfo.UserVarsEntry + nil, // 86: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 87: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 88: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5561,98 +5582,99 @@ var file_protos_o2control_proto_depIdxs = []int32{ 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 77, // 12: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 21, // 13: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 78, // 14: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 21, // 15: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 53, // 16: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 17: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 31, // 18: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 19: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 31, // 20: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 51, // 21: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 79, // 22: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 80, // 23: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 41, // 24: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 40, // 25: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 49, // 26: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 40, // 27: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 46, // 28: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 48, // 29: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 48, // 30: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 47, // 31: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 81, // 32: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 40, // 33: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 40, // 34: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 53, // 35: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 82, // 36: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 83, // 37: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 84, // 38: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 85, // 39: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 53, // 40: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 4, // 41: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 42: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 86, // 43: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 57, // 44: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 45: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 87, // 46: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 56, // 47: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 73, // 48: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 9, // 49: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 17, // 51: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 19, // 52: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 53: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 54: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 55: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 56: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 30, // 57: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 33, // 58: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 71, // 59: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 42, // 60: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 44, // 61: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 50, // 62: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 52, // 63: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 55, // 64: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 65: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 66: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 67: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 68: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 69: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 70: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 71: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 72: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 71, // 73: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 74: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 75: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 76: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 82: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 83: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 84: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 43, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 45, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 51, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 54, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event - 72, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 74, // [74:99] is the sub-list for method output_type - 49, // [49:74] is the sub-list for method input_type - 49, // [49:49] is the sub-list for extension type_name - 49, // [49:49] is the sub-list for extension extendee - 0, // [0:49] is the sub-list for field type_name + 77, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 78, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 79, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 53, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 51, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 80, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 81, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 41, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 40, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 49, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 46, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 48, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 48, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 47, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 82, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 40, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 40, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 53, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 83, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 84, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 85, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 86, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 53, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 87, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 57, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 60, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 88, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 56, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 73, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 19, // 53: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 54: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 55: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 56: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 71, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 42, // 61: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 44, // 62: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 50, // 63: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 52, // 64: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 55, // 65: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 59, // 66: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 62, // 67: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 64, // 68: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 66, // 69: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 67, // 70: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 68, // 71: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 69, // 72: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 73: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 71, // 74: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 75: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 77: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 78: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 79: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 80: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 81: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 82: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 83: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 84: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 85: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 43, // 86: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 45, // 87: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 51, // 88: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 54, // 89: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 58, // 90: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 61, // 91: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 63, // 92: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 65, // 93: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 71, // 94: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 71, // 95: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 71, // 96: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 70, // 97: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 98: o2control.Control.Subscribe:output_type -> o2control.Event + 72, // 99: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 75, // [75:100] is the sub-list for method output_type + 50, // [50:75] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -6504,7 +6526,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 83, + NumMessages: 84, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 2318a8acf..be122a5ce 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -188,6 +188,7 @@ message EnvironmentInfo { repeated string includedDetectors = 11; string description = 12; int32 numberOfHosts = 13; + map integratedServicesData = 14; } message NewEnvironmentRequest { diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index ee006c779..94c92d0d6 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.9 // source: protos/o2control.proto package pb From b277743f7c5a0c7a5b6dd7a1c6cd55eaf9c9c5de Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Nov 2022 17:24:58 +0100 Subject: [PATCH 1454/2352] [core] Refactor GetData and implement GetEnvData in all plugins --- core/integration/bookkeeping/plugin.go | 6 ++- core/integration/ccdb/plugin.go | 6 ++- core/integration/dcs/plugin.go | 35 ++++++++++----- core/integration/ddsched/plugin.go | 59 +++++++++++++++++++++---- core/integration/kafka/plugin.go | 6 ++- core/integration/odc/plugin.go | 31 ++++++++++++- core/integration/plugin.go | 32 +++++++++++++- core/integration/testplugin/plugin.go | 16 ++++--- core/integration/trg/plugin.go | 60 ++++++++++++++++++++++++-- 9 files changed, 217 insertions(+), 34 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index ed6ec8ec4..1adaf1f47 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -89,7 +89,7 @@ func (p *Plugin) GetConnectionState() string { return "READY" } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { if p == nil || p.bookkeepingClient == nil { return "" } @@ -103,6 +103,10 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { return string(out[:]) } +func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) Init(instanceId string) error { p.bookkeepingClient = Instance() if p.bookkeepingClient == nil { diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 92fcf675c..571ec1fbf 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -241,10 +241,14 @@ func (p *Plugin) GetConnectionState() string { return "READY" } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { return "" } +func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) Init(instanceId string) error { return nil } diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 624a10a78..c666b8b6d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -102,22 +103,15 @@ func (p *Plugin) GetConnectionState() string { return p.dcsClient.conn.GetState().String() } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { if p == nil || p.dcsClient == nil { return "" } - outMap := make(map[string]interface{}) - - partitionStates := make(map[string]string) + environmentIds := environment.ManagerInstance().Ids() - for _, envId := range environmentIds { - if _, ok := p.pendingEORs[envId.String()]; ok { - partitionStates[envId.String()] = "SOR SUCCESSFUL" - } - } - - outMap["partitions"] = partitionStates + outMap := make(map[string]interface{}) + outMap["partitions"] = p.partitionStatesForEnvs(environmentIds) out, err := json.Marshal(outMap) if err != nil { @@ -126,6 +120,25 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { return string(out[:]) } +func (p *Plugin) GetEnvironmentsData(environmentIds []uid.ID) map[uid.ID]string { + if p == nil || p.dcsClient == nil { + return nil + } + + out := p.partitionStatesForEnvs(environmentIds) + return out +} + +func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]string { + out := make(map[uid.ID]string) + for _, envId := range envIds { + if _, ok := p.pendingEORs[envId.String()]; ok { + out[envId] = "SOR SUCCESSFUL" + } + } + return out +} + func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { cxt, cancel := context.WithCancel(context.Background()) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 5f3492128..69e8685a7 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/AliceO2Group/Control/core/workflow" @@ -103,14 +104,56 @@ func (p *Plugin) GetConnectionState() string { return p.ddSchedClient.conn.GetState().String() } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { if p == nil || p.ddSchedClient == nil { return "" } partitionStates := make(map[string]string) + environmentIds := environment.ManagerInstance().Ids() - for _, envId := range environmentIds { + partitionInfos := p.partitionStatesForEnvs(environmentIds) + + partitionStates = make(map[string]string) + for envId, partitionInfo := range partitionInfos { + state, ok := partitionInfo["state"] + if !ok { + continue + } + partitionStates[envId.String()] = state + } + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + if p == nil || p.ddSchedClient == nil { + return nil + } + + partitionInfos := p.partitionStatesForEnvs(envIds) + + partitionInfosOut := make(map[uid.ID]string) + + for envId, partitionInfo := range partitionInfos { + partitionInfoOut, err := json.Marshal(partitionInfo) + if err != nil { + continue + } + partitionInfosOut[envId] = string(partitionInfoOut[:]) + } + + return partitionInfosOut +} + +func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]map[string]string { + partitionStates := make(map[uid.ID]map[string]string) + + for _, envId := range envIds { in := ddpb.PartitionInfo{ PartitionId: envId.String(), EnvironmentId: envId.String(), @@ -126,14 +169,14 @@ func (p *Plugin) GetData(environmentIds []uid.ID) string { if !ok { continue } - partitionStates[envId.String()] = partitionState + partitionInfo := map[string]string{ + "state": partitionState, + "infoMessage": state.GetInfoMessage(), + } + partitionStates[envId] = partitionInfo } - out, err := json.Marshal(partitionStates) - if err != nil { - return "" - } - return string(out[:]) + return partitionStates } func (p *Plugin) Init(_ string) error { diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index e872306b0..7f7485aa4 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -88,10 +88,14 @@ func (p *Plugin) GetConnectionState() string { } } -func (p *Plugin) GetData(environmentIds []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { return "" } +func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) FSMEnterStateTopic(state string) string { return "aliecs.env_state." + state } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index aa8d64781..b7f126166 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -166,7 +166,7 @@ func (p *Plugin) queryPartitionStatus() { p.cachedStatusMu.Unlock() } -func (p *Plugin) GetData(_ []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { if p == nil || p.odcClient == nil { return "" } @@ -194,6 +194,35 @@ func (p *Plugin) GetData(_ []uid.ID) string { return string(out[:]) } +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + if p == nil || p.odcClient == nil { + return nil + } + + p.cachedStatusMu.RLock() + defer p.cachedStatusMu.RUnlock() + + if p.cachedStatus == nil { + return nil + } + + out := make(map[uid.ID]string) + for _, id := range envIds { + partitionInfo, ok := p.cachedStatus.Partitions[id] + if !ok { + continue + } + + partitionInfoOut, err := json.Marshal(partitionInfo) + if err != nil { + continue + } + out[id] = string(partitionInfoOut[:]) + } + + return out +} + func (p *Plugin) Init(_ string) error { if p.odcClient == nil { cxt, cancel := context.WithCancel(context.Background()) diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 3c73a8045..46efaceee 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -50,7 +50,8 @@ type Plugin interface { GetPrettyName() string GetEndpoint() string GetConnectionState() string - GetData(environmentIds []uid.ID) string + GetData(argv []any) string + GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string Init(instanceId string) error CallStack(data interface{}) map[string]interface{} // used in hook call context @@ -131,6 +132,35 @@ func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]inter return } +func (p Plugins) GetData(argv []any) (data map[string]string) { + data = make(map[string]string) + for _, plugin := range p { + data[plugin.GetName()] = plugin.GetData(argv) + } + return +} + +func (p Plugins) GetEnvironmentsData(envIds []uid.ID) (data map[uid.ID]map[string]string) { + data = make(map[uid.ID]map[string]string) + + // First we query each plugin for environment data of all envIds at once + pluginEnvData := make(map[ /*plugin*/ string]map[uid.ID]string) + for _, plugin := range p { + pluginEnvData[plugin.GetName()] = plugin.GetEnvironmentsData(envIds) + } + + // Then we invert the nested map to get a map of envId -> plugin -> data + for _, plugin := range p { + for envId, pluginData := range pluginEnvData[plugin.GetName()] { + if _, ok := data[envId]; !ok { + data[envId] = make(map[string]string) + } + data[envId][plugin.GetName()] = pluginData + } + } + return +} + func PluginsInstance() Plugins { once.Do(func() { instance = Plugins{} diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 148c20611..40a994252 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -37,7 +37,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(),"testplugin") +var log = logger.New(logrus.StandardLogger(), "testplugin") const ( TESTPLUGIN_GENERAL_OP_TIMEOUT = 3 * time.Second @@ -69,10 +69,14 @@ func (p *Plugin) GetConnectionState() string { return "READY" } -func (p *Plugin) GetData(_ []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { return "" } +func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) Init(_ string) error { log.Debug("Test plugin initialized") return nil @@ -110,7 +114,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) - stack["Noop"] = func() (out string) { // must formally return string even when we return nothing + stack["Noop"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("rolepath", call.GetParentRolePath()). @@ -121,7 +125,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rn := varStack["run_number"] var ( runNumber64 int64 - err error + err error ) runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { @@ -141,7 +145,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - stack["Test"] = func() (out string) { // must formally return string even when we return nothing + stack["Test"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("rolepath", call.GetParentRolePath()). @@ -152,7 +156,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rn := varStack["run_number"] var ( runNumber64 int64 - err error + err error ) runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 2b01479ff..a563c40c3 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -69,9 +69,10 @@ type Plugin struct { } type TrgStatus struct { - RunCount int `json:"runCount,omitempty"` - Lines []string `json:"lines,omitempty"` - Structured Runs `json:"structured,omitempty"` + RunCount int `json:"runCount,omitempty"` + Lines []string `json:"lines,omitempty"` + Structured Runs `json:"structured,omitempty"` + EnvMap map[uid.ID]Run `json:"envMap,omitempty"` } func NewPlugin(endpoint string) integration.Plugin { @@ -147,10 +148,39 @@ func (p *Plugin) queryRunList() { structured = make(Runs, 0) } + envMap := make(map[uid.ID]Run) + for envIdS, rn := range p.pendingRunStops { + var envId uid.ID + envId, err = uid.FromString(envIdS) + if err != nil { + continue + } + + for _, run := range structured { + if run.RunNumber == uint32(rn) { + envMap[envId] = run + } + } + } + for envIdS, rn := range p.pendingRunUnloads { + var envId uid.ID + envId, err = uid.FromString(envIdS) + if err != nil { + continue + } + + for _, run := range structured { + if run.RunNumber == uint32(rn) { + envMap[envId] = run + } + } + } + out := &TrgStatus{ RunCount: int(runReply.Rc), Lines: strings.Split(runReply.Msg, "\n"), Structured: structured, + EnvMap: envMap, } p.cachedStatusMu.Lock() @@ -158,7 +188,7 @@ func (p *Plugin) queryRunList() { p.cachedStatusMu.Unlock() } -func (p *Plugin) GetData(_ []uid.ID) string { +func (p *Plugin) GetData(_ []any) string { if p == nil || p.trgClient == nil { return "" } @@ -177,7 +207,29 @@ func (p *Plugin) GetData(_ []uid.ID) string { return "" } return string(out[:]) +} + +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + if p == nil || p.trgClient == nil { + return nil + } + + p.cachedStatusMu.RLock() + defer p.cachedStatusMu.RUnlock() + + envMap := p.cachedStatus.EnvMap + out := make(map[uid.ID]string) + for _, envId := range envIds { + if run, ok := envMap[envId]; !ok { + runOut, err := json.Marshal(run) + if err != nil { + continue + } + out[envId] = string(runOut[:]) + } + } + return out } func (p *Plugin) Init(instanceId string) error { From 3da9088a577d2734e7faa76bde50dc843e97cd72 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Nov 2022 17:25:55 +0100 Subject: [PATCH 1455/2352] [core] Include integrated services data in all EnvironmentInfo payloads --- core/server.go | 101 ++++++++++++++++++++++++++++++------------------- 1 file changed, 62 insertions(+), 39 deletions(-) diff --git a/core/server.go b/core/server.go index c6e003547..87ceb49ac 100644 --- a/core/server.go +++ b/core/server.go @@ -107,8 +107,6 @@ func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) } } - envIds := m.state.environments.Ids() - // If this plugin was loaded if plugin != nil { s = &pb.IntegratedServiceInfo{ @@ -116,7 +114,7 @@ func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) Enabled: false, Endpoint: plugin.GetEndpoint(), ConnectionState: plugin.GetConnectionState(), - Data: plugin.GetData(envIds), + Data: plugin.GetData(nil), } enabledPlugins := viper.GetStringSlice("integrationPlugins") if utils.StringSliceContains(enabledPlugins, pluginName) { @@ -201,6 +199,11 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm FrameworkId: m.state.taskman.GetFrameworkID(), Environments: make(EnvironmentInfos, 0, 0), } + + // Get plugin-provided environment data for all envs + integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData(m.state.environments.Ids()) + + // Get all environments for _, id := range m.state.environments.Ids() { env, err := m.state.environments.Environment(id) if err != nil { @@ -222,18 +225,24 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm userVars = env.UserVars.Raw() } + isEnvData, ok := integratedServicesEnvsData[id] + if !ok || isEnvData == nil { + isEnvData = make(map[string]string) + } + e := &pb.EnvironmentInfo{ - Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixMilli(), - State: env.CurrentState(), - RootRole: env.Workflow().GetName(), - Description: env.Description, - CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: defaults, - Vars: vars, - UserVars: userVars, - NumberOfFlps: int32(len(env.GetFLPs())), - NumberOfHosts: int32(len(env.GetAllHosts())), + Id: env.Id().String(), + CreatedWhen: env.CreatedWhen().UnixMilli(), + State: env.CurrentState(), + RootRole: env.Workflow().GetName(), + Description: env.Description, + CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, + NumberOfFlps: int32(len(env.GetFLPs())), + NumberOfHosts: int32(len(env.GetAllHosts())), + IntegratedServicesData: isEnvData, } if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) @@ -322,20 +331,27 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme userVars = newEnv.UserVars.Raw() } + integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData([]uid.ID{id}) + isEnvData, ok := integratedServicesEnvsData[id] + if !ok { + isEnvData = make(map[string]string) + } + ei := &pb.EnvironmentInfo{ - Id: newEnv.Id().String(), - CreatedWhen: newEnv.CreatedWhen().UnixMilli(), - State: newEnv.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: newEnv.Workflow().GetName(), - Description: newEnv.Description, - CurrentRunNumber: newEnv.GetCurrentRunNumber(), - Defaults: defaults, - Vars: vars, - UserVars: userVars, - NumberOfFlps: int32(len(newEnv.GetFLPs())), - NumberOfHosts: int32(len(newEnv.GetAllHosts())), - IncludedDetectors: newEnv.GetActiveDetectors().StringList(), + Id: newEnv.Id().String(), + CreatedWhen: newEnv.CreatedWhen().UnixMilli(), + State: newEnv.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: newEnv.Workflow().GetName(), + Description: newEnv.Description, + CurrentRunNumber: newEnv.GetCurrentRunNumber(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, + NumberOfFlps: int32(len(newEnv.GetFLPs())), + NumberOfHosts: int32(len(newEnv.GetAllHosts())), + IncludedDetectors: newEnv.GetActiveDetectors().StringList(), + IntegratedServicesData: isEnvData, } reply = &pb.NewEnvironmentReply{ Environment: ei, @@ -372,20 +388,27 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe vars = env.GlobalVars.Raw() userVars = env.UserVars.Raw() } + + integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData([]uid.ID{envId}) + isEnvData, ok := integratedServicesEnvsData[envId] + if !ok { + isEnvData = make(map[string]string) + } reply = &pb.GetEnvironmentReply{ Environment: &pb.EnvironmentInfo{ - Id: env.Id().String(), - CreatedWhen: env.CreatedWhen().UnixMilli(), - State: env.CurrentState(), - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), - RootRole: env.Workflow().GetName(), - Description: env.Description, - CurrentRunNumber: env.GetCurrentRunNumber(), - Defaults: defaults, - Vars: vars, - UserVars: userVars, - NumberOfFlps: int32(len(env.GetFLPs())), - NumberOfHosts: int32(len(env.GetAllHosts())), + Id: env.Id().String(), + CreatedWhen: env.CreatedWhen().UnixMilli(), + State: env.CurrentState(), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + RootRole: env.Workflow().GetName(), + Description: env.Description, + CurrentRunNumber: env.GetCurrentRunNumber(), + Defaults: defaults, + Vars: vars, + UserVars: userVars, + NumberOfFlps: int32(len(env.GetFLPs())), + NumberOfHosts: int32(len(env.GetAllHosts())), + IntegratedServicesData: isEnvData, }, Public: env.Public, } From 06958ff035404e50746869cde6389fd08eb81439 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 4 Nov 2022 15:52:06 +0100 Subject: [PATCH 1456/2352] [executor] do not try to recover a task in error, ask to exit instead --- executor/executable/controllabletask.go | 4 ++-- occ/occlib/OccServer.cxx | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index f2bf98a84..3cc8d9352 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -617,8 +617,8 @@ func (t *ControllableTask) Kill() error { evt = "RESET" destination = "STANDBY" case "ERROR": - evt = "RECOVER" - destination = "STANDBY" + evt = "EXIT" + destination = "DONE" case "STANDBY": evt = "EXIT" destination = "DONE" diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index a30169d76..37860bc01 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -344,6 +344,13 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: } else { newState=t_State::error; } + } else if (evt=="exit") { + err = m_rco->executeExit(); + if (!err) { + newState = t_State::done; + } else { + newState = t_State::error; + } } else { invalidEvent=1; } From c82f474525a9b793d79fb11a44bd916f692cc735 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 4 Oct 2022 09:19:11 +0200 Subject: [PATCH 1457/2352] [core] Core Bookkeeping plugin is now prepared to be gRPC based in synch. with Bookkeeping. --- Makefile | 2 +- .../integration/bookkeepinggRPC/clientgRPC.go | 133 ++ .../integration/bookkeepinggRPC/plugingRPC.go | 836 ++++++++++ .../bookkeepinggRPC/protos/bookkeeping.pb.go | 1441 +++++++++++++++++ .../bookkeepinggRPC/protos/bookkeeping.proto | 133 ++ .../protos/bookkeeping_grpc.pb.go | 323 ++++ core/integration/bookkeepinggRPC/utils.go | 57 + 7 files changed, 2924 insertions(+), 1 deletion(-) create mode 100644 core/integration/bookkeepinggRPC/clientgRPC.go create mode 100644 core/integration/bookkeepinggRPC/plugingRPC.go create mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go create mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping.proto create mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go create mode 100644 core/integration/bookkeepinggRPC/utils.go diff --git a/Makefile b/Makefile index bc4103c15..dfcd247d3 100644 --- a/Makefile +++ b/Makefile @@ -54,7 +54,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg +GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut # Use linker flags to provide version/build settings to the target diff --git a/core/integration/bookkeepinggRPC/clientgRPC.go b/core/integration/bookkeepinggRPC/clientgRPC.go new file mode 100644 index 000000000..2a5171f8b --- /dev/null +++ b/core/integration/bookkeepinggRPC/clientgRPC.go @@ -0,0 +1,133 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Claire Guyot + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeepinggRPC + +import ( + "context" + "time" + + "github.com/AliceO2Group/Control/common/logger" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeepinggRPC/protos" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/keepalive" +) + +var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") + +type RpcClient struct { + bkpb.BookkeepingControlClient + conn *grpc.ClientConn + cancel context.CancelFunc +} + +func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) *RpcClient { + log.WithFields(logrus.Fields{ + "endpoint": endpoint, + }).Debug("dialing Bookkeeping endpoint") + + dialOptions := []grpc.DialOption{ + grpc.WithInsecure(), + grpc.WithConnectParams(grpc.ConnectParams{ + Backoff: backoff.Config{ + BaseDelay: backoff.DefaultConfig.BaseDelay, + Multiplier: backoff.DefaultConfig.Multiplier, + Jitter: backoff.DefaultConfig.Jitter, + MaxDelay: 20 * time.Second, + }, + MinConnectTimeout: 10 * time.Second, + }), + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: 5 * time.Second, + Timeout: time.Second, + PermitWithoutStream: true, + }), + } + if !viper.GetBool("bookkeepingUseSystemProxy") { + dialOptions = append(dialOptions, grpc.WithNoProxy()) + } + conn, err := grpc.DialContext(cxt, + endpoint, + dialOptions..., + ) + if err != nil { + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + Errorf("cannot dial RPC endpoint") + cancel() + return nil + } + + go func() { + connState := connectivity.Idle + stateChangedNotify := make(chan bool) + notifyFunc := func(st connectivity.State) { + ok := conn.WaitForStateChange(cxt, st) + stateChangedNotify <- ok + } + go notifyFunc(connState) + + for { + select { + case ok := <-stateChangedNotify: + if !ok { + return + } + connState = conn.GetState() + log.Debugf("Bookkeeping client %s", connState.String()) + go notifyFunc(connState) + case <-time.After(2 * time.Minute): + if conn.GetState() != connectivity.Ready { + conn.ResetConnectBackoff() + } + case <-cxt.Done(): + return + } + } + }() + + client := &RpcClient{ + BookkeepingControlClient: bkpb.NewBookkeepingControlClient(conn), + conn: conn, + cancel: cancel, + } + + return client +} + +func (m *RpcClient) GetConnState() connectivity.State { + if m.conn == nil { + return connectivity.Idle + } + return m.conn.GetState() +} + +func (m *RpcClient) Close() error { + m.cancel() + return m.conn.Close() +} diff --git a/core/integration/bookkeepinggRPC/plugingRPC.go b/core/integration/bookkeepinggRPC/plugingRPC.go new file mode 100644 index 000000000..f6f5fa1f7 --- /dev/null +++ b/core/integration/bookkeepinggRPC/plugingRPC.go @@ -0,0 +1,836 @@ +/* +* === This file is part of ALICE O² === +* +* Copyright 2021 CERN and copyright holders of ALICE O². +* Author: Claire Guyot +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* In applying this license CERN does not waive the privileges and +* immunities granted to it by virtue of its status as an +* Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeepinggRPC + +import ( + "context" + "encoding/json" + "errors" + "fmt" + sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeepinggRPC/protos" + "google.golang.org/grpc" + "net/url" + "strconv" + "strings" + "time" + + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/spf13/viper" +) + +const ( + BKP_SOR_TIMEOUT = 30 * time.Second + BKP_EOR_TIMEOUT = 30 * time.Second + BKP_DEFAULT_POLLING_TIMEOUT = 30 * time.Second +) + +type Plugin struct { + bookkeepingHost string + bookkeepingPort int + + bookkeepingClient *RpcClient + + pendingRunStops map[string] /*envId*/ int64 + pendingO2Stops map[string] /*envId*/ string + pendingTrgStops map[string] /*envId*/ string +} + +func NewPlugin(endpoint string) integration.Plugin { + u, err := url.Parse(endpoint) + if err != nil { + log.WithField("endpoint", endpoint). + WithError(err). + Error("bad service endpoint") + return nil + } + + portNumber, _ := strconv.Atoi(u.Port()) + + return &Plugin{ + bookkeepingHost: u.Hostname(), + bookkeepingPort: portNumber, + bookkeepingClient: nil, + pendingRunStops: make(map[string]int64), + pendingO2Stops: make(map[string]string), + pendingTrgStops: make(map[string]string), + } +} + +func (p *Plugin) GetName() string { + return "bookkeeping" +} + +func (p *Plugin) GetPrettyName() string { + return "Bookkeeping" +} + +func (p *Plugin) GetEndpoint() string { + return viper.GetString("bookkeepingBaseUri") +} + +func (p *Plugin) GetConnectionState() string { + return "READY" +} + +func (p *Plugin) GetData(environmentIds []uid.ID) string { + if p == nil || p.bookkeepingClient == nil { + return "" + } + + partitionStates := make(map[string]string) + + out, err := json.Marshal(partitionStates) + if err != nil { + return "" + } + return string(out[:]) +} + +func (p *Plugin) Init(instanceId string) error { + if p.bookkeepingClient == nil { + cxt, cancel := context.WithCancel(context.Background()) + p.bookkeepingClient = NewClient(cxt, cancel, p.GetEndpoint()) + if p.bookkeepingClient == nil { + return fmt.Errorf("failed to connect to Bookkeeping service on %s", p.GetEndpoint()) + } + log.Debug("DD scheduler plugin initialized") + } + return nil +} + +func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { + stack = make(map[string]interface{}) + return stack +} + +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + err := errors.New("cannot acquire environment ID") + log.Error(err) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" + return + } + trigger, ok := varStack["__call_trigger"] + if !ok { + err := errors.New("cannot acquire trigger from varStack") + log.WithField("call", call). + WithField("partition", envId). + Error(err) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" + return + } + var err error + parsedEnvId, err := uid.FromString(envId) + if err != nil { + if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { + log.WithField("partition", envId). + Debug("cannot parse environment ID when DESTROY or GO_ERROR transition") + return + } + log.WithError(err). + WithField("partition", envId). + Error("cannot parse environment ID") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" + return + } + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + if err != nil { + if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { + log.WithField("partition", envId). + Debug("cannot acquire environment from parsed environment ID when DESTROY or GO_ERROR transition") + return + } + log.WithError(err). + WithField("partition", envId). + Error("cannot acquire environment from parsed environment ID") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" + return + } + + stack = make(map[string]interface{}) + // Run related Bookkeeping functions + stack["StartOfRun"] = func() (out string) { + callFailedStr := "Bookkeeping StartOfRun call failed" + + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err = strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping SOR") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, StartOfRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("Bookkeeping SOR error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + runNumber := env.GetCurrentRunNumber() + + rnString := strconv.FormatUint(uint64(runNumber), 10) + + flps := env.GetFLPs() + epns, err := strconv.ParseInt(env.GetKV("", "odc_n_epns"), 10, 0) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse number of EPNs") + } + ddEnabled, err := strconv.ParseBool(env.GetKV("", "dd_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse DD enabled") + } + dcsEnabled, err := strconv.ParseBool(env.GetKV("", "dcs_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse DCS enabled") + } + epnEnabled, err := strconv.ParseBool(env.GetKV("", "epn_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse EPN enabled") + } + odcTopology := env.GetKV("", "odc_topology") + odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } + detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") + + inRun := bkpb.CreateRunRequest{ + RunInfo: &bkpb.RunInfo{ + RunNumber: int32(runNumber64), + EnvironmentId: env.Id().String(), + }, + NumberOfDetectors: int32(len(env.GetActiveDetectors())), + NumberOfEpns: int32(epns), + NumberOfFlps: int32(len(flps)), + RunType: env.GetRunType().String(), + DdFlp: ddEnabled, + Dcs: dcsEnabled, + Epn: epnEnabled, + EpnTopology: odcTopology, + OdcTopologyFullname: odcTopologyFullname, + Detectors: detectors, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.CreateRun(ctx, &inRun, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateRun"). + Error("Bookkeeping API CreateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + p.pendingRunStops[envId] = runNumber64 + p.pendingO2Stops[envId] = "" + p.pendingTrgStops[envId] = "" + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateRun call successful") + } + + var inFlp bkpb.CreateFlpRequest + + for _, flp := range flps { + inFlp = bkpb.CreateFlpRequest{ + RunInfo: &bkpb.RunInfo{ + RunNumber: int32(runNumber64), + EnvironmentId: env.Id().String(), + }, + Name: flp, + Hostname: flp, + } + + timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateFlp", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err := p.bookkeepingClient.CreateFlp(ctx, &inFlp, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("flp", flp). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateFlp"). + Error("Bookkeeping API CreateFlp error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + } + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateFlp call done") + + inLog := bkpb.CreateLogRequest{ + RunInfo: &bkpb.RunInfo{ + RunNumber: int32(runNumber64), + EnvironmentId: env.Id().String(), + }, + Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), + Content: env.GetVarsAsString(), + ParentLogId: -1, + } + + timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateLog", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.CreateLog(ctx, &inLog, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateLog"). + Error("Bookkeeping API CreateLog error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("CreateLog call successful") + } + return + } + updateRunFunc := func(runNumber64 int64, state string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string) (out string) { + callFailedStr := "Bookkeeping UpdateRun call failed" + trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot parse TRG global run enabled") + } + trgEnabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot parse TRG enabled") + } + var trg = "" + if trgEnabled == false { + trg = "OFF" + } else { + if trgGlobalRunEnabled == false { + trg = "LTU" + } else { + trg = "CTP" + } + } + pdpConfig, ok := varStack["pdp_config_option"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP workflow configuration mode") + } + pdpTopology, ok := varStack["pdp_topology_description_library_file"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP topology description library file") + } + pdpParameters, ok := varStack["pdp_workflow_parameters"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP workflow parameters") + } + pdpBeam, ok := varStack["pdp_beam_type"] + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire PDP beam type") + } + tfbMode := env.GetKV("", "tfb_dd_mode") + odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") + if !ok { + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Warning("cannot acquire ODC topology fullname") + } + lhcPeriod := env.GetKV("", "lhc_period") + readoutUri, ok := varStack["readout_cfg_uri"] + + var runquality sw.RunQuality + switch state { + case string(sw.GOOD_RunQuality): + runquality = sw.GOOD_RunQuality + case string(sw.BAD_RunQuality): + runquality = sw.BAD_RunQuality + default: + runquality = sw.TEST_RunQuality + } + + timeO2S, err := strconv.ParseInt(timeO2Start, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeO2Start). + Warning("cannot parse O2 start time") + timeO2S = -1 + } + if timeO2Start == "" || timeO2S <= 0 { + timeO2S = -1 + } + var timeO2E int64 = -1 + if timeO2End != "" { + timeO2E, err = strconv.ParseInt(timeO2End, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeO2End). + Warning("cannot parse O2 end time") + timeO2E = -1 + } + } + if timeO2End == "" || timeO2E <= 0 { + timeO2E = -1 + } + var timeTrgS int64 = -1 + var timeTrgE int64 = -1 + if trg == "LTU" || trg == "CTP" { + timeTrgS, err = strconv.ParseInt(timeTrgStart, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeTrgStart). + Warning("cannot parse Trg start time") + timeTrgS = -1 + } + if timeTrgStart == "" || timeTrgS <= 0 { + timeTrgS = -1 + } + timeTrgE, err = strconv.ParseInt(timeTrgEnd, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeTrgEnd). + Warning("cannot parse Trg end time") + timeTrgE = -1 + } + if timeTrgEnd == "" || timeTrgE <= 0 { + timeTrgE = -1 + } + } + + inRun := bkpb.UpdateRunRequest{ + RunInfo: &bkpb.RunInfo{ + RunNumber: int32(runNumber64), + EnvironmentId: env.Id().String(), + }, + RunQuality: string(runquality), + Time_O2Start: timeO2S, + Time_O2End: timeO2E, + Time_TRGStart: timeTrgS, + Time_TRGEnd: timeTrgE, + Trigger: trigger, + PdpConfig: pdpConfig, + PdpTopology: pdpTopology, + TfbMode: tfbMode, + LhcPeriod: lhcPeriod, + OdcTopologyFullname: odcTopologyFullname, + PdpParameters: pdpParameters, + PdpBeam: pdpBeam, + ReadoutUri: readoutUri, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.UpdateRun(ctx, &inRun, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRun"). + Error("Bookkeeping API UpdateRun error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + var updatedRun string + if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { + if p.pendingO2Stops[envId] == "" || (trgEnabled && p.pendingTrgStops[envId] == "") { + updatedRun = "INCOMPLETE" + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + Debug("UpdateRun call: run information incomplete") + } else { + updatedRun = "STOPPED" + delete(p.pendingRunStops, envId) + delete(p.pendingO2Stops, envId) + delete(p.pendingTrgStops, envId) + } + } else { + updatedRun = "STARTED" + } + log.WithField("runNumber", runNumber64). + WithField("updated to", updatedRun). + WithField("partition", envId). + Debug("UpdateRun call successful") + } + return + } + stack["UpdateRunStart"] = func() (out string) { + callFailedStr := "Bookkeeping UpdateRunStart call failed" + + rn := varStack["run_number"] + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping UpdateRunStart") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStart impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRunStart"). + Error("Bookkeeping UpdateRunStart error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + O2StartTime := varStack["run_start_time_ms"] + TrgStartTime := varStack["trg_start_time_ms"] + + return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") + } + stack["UpdateRunStop"] = func() (out string) { + callFailedStr := "Bookkeeping UpdateRunStop call failed" + + rn := varStack["run_number"] + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if (strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR")) && (rn == "" || runNumber64 == 0) { + log.WithField("partition", envId). + Debug("cannot update run on stop, no run for the environment") + return + } + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Bookkeeping UpdateRunStop") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStop impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "UpdateRunStop"). + Error("Bookkeeping UpdateRunStop error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + O2StartTime := varStack["run_start_time_ms"] + O2EndTime := varStack["run_end_time_ms"] + p.pendingO2Stops[envId] = O2EndTime + + TrgStartTime := varStack["trg_start_time_ms"] + TrgEndTime := varStack["trg_end_time_ms"] + p.pendingTrgStops[envId] = TrgEndTime + + if _, ok := p.pendingRunStops[envId]; ok { + return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) + } else { + log.WithField("partition", envId). + Warning("skipping UpdateRun call, no pending run number found") + return + } + } + // Environment related Bookkeeping functions + stack["CreateEnv"] = func() (out string) { + callFailedStr := "Bookkeeping CreateEnv call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, CreateEnv impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "CreateEnv"). + Error("Bookkeeping CreateEnv error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + var statusMessage = "" + envState := env.CurrentState() + if envState == "STANDBY" || envState == "DEPLOYED" { + statusMessage = "success: the environment is in " + envState + " state after creation" + } else { + statusMessage = "error: the environment is in " + envState + " state after creation" + } + + inEnv := bkpb.CreateEnvRequest{ + EnvironmentInfo: &bkpb.EnvironmentInfo{ + EnvironmentId: env.Id().String(), + }, + CreatedAt: time.Now().UnixMilli(), + Status: envState, + StatusMessage: statusMessage, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.CreateEnvironment(ctx, &inEnv, grpc.EmptyCallOption{}) + + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("call", "CreateEnvironment"). + Error("Bookkeeping API CreateEnvironment error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("partition", envId). + Debug("CreateEnvironment call successful") + } + return + } + updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { + callFailedStr := "Bookkeeping UpdateEnv call failed" + + inEnv := bkpb.UpdateEnvRequest{ + EnvironmentInfo: &bkpb.EnvironmentInfo{ + EnvironmentId: env.Id().String(), + }, + ToredownAt: toredownAt.UnixMilli(), + Status: status, + StatusMessage: statusMessage, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.UpdateEnvironment(ctx, &inEnv, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("call", "UpdateEnvironment"). + Error("Bookkeeping API UpdateEnvironment error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("partition", envId). + WithField("state", status). + Debug("UpdateEnvironment call successful") + } + return + } + stack["UpdateEnv"] = func() (out string) { + callFailedStr := "Bookkeeping UpdateEnv call failed" + + if p.bookkeepingClient == nil { + err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnv impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "UpdateEnv"). + Error("Bookkeeping UpdateEnv error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + envState := env.CurrentState() + + if strings.Contains(trigger, "DESTROY") { + envState = "DESTROYED" + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "the environment is DESTROYED after DESTROY transition") + } + if strings.Contains(trigger, "DEPLOY") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") + } + } + if strings.Contains(trigger, "CONFIGURE") { + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") + } + } + if strings.Contains(trigger, "RESET") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") + } + } + if strings.Contains(trigger, "START_ACTIVITY") { + if envState == "RUNNING" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") + } + } + if strings.Contains(trigger, "STOP_ACTIVITY") { + if envState == "CONFIGURED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") + } + } + if strings.Contains(trigger, "EXIT") { + if envState == "DONE" { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") + } else { + return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") + } + } + if strings.Contains(trigger, "GO_ERROR") { + if envState == "ERROR" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") + } + } + if strings.Contains(trigger, "RECOVER") { + if envState == "DEPLOYED" { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") + } else { + return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") + } + } + log.WithField("partition", envId). + WithField("call", call). + Error("could not obtain transition in UpdateEnv from trigger: ", trigger) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + + return +} + +func (p *Plugin) Destroy() error { + return nil +} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go b/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go new file mode 100644 index 000000000..17d74f2b4 --- /dev/null +++ b/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go @@ -0,0 +1,1441 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/bookkeeping.proto + +package bookkeeping + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type RunInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=run_number,json=runNumber,proto3" json:"run_number,omitempty"` + EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id,omitempty"` +} + +func (x *RunInfo) Reset() { + *x = RunInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunInfo) ProtoMessage() {} + +func (x *RunInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunInfo.ProtoReflect.Descriptor instead. +func (*RunInfo) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{0} +} + +func (x *RunInfo) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *RunInfo) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +type RunResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` +} + +func (x *RunResponse) Reset() { + *x = RunResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunResponse) ProtoMessage() {} + +func (x *RunResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunResponse.ProtoReflect.Descriptor instead. +func (*RunResponse) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{1} +} + +func (x *RunResponse) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *RunResponse) GetInfoMessages() string { + if x != nil { + return x.InfoMessages + } + return "" +} + +type CreateRunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + NumberOfDetectors int32 `protobuf:"varint,2,opt,name=number_of_detectors,json=numberOfDetectors,proto3" json:"number_of_detectors,omitempty"` + NumberOfEpns int32 `protobuf:"varint,3,opt,name=number_of_epns,json=numberOfEpns,proto3" json:"number_of_epns,omitempty"` + NumberOfFlps int32 `protobuf:"varint,4,opt,name=number_of_flps,json=numberOfFlps,proto3" json:"number_of_flps,omitempty"` + RunType string `protobuf:"bytes,5,opt,name=run_type,json=runType,proto3" json:"run_type,omitempty"` + DdFlp bool `protobuf:"varint,6,opt,name=dd_flp,json=ddFlp,proto3" json:"dd_flp,omitempty"` + Dcs bool `protobuf:"varint,7,opt,name=dcs,proto3" json:"dcs,omitempty"` + Epn bool `protobuf:"varint,8,opt,name=epn,proto3" json:"epn,omitempty"` + EpnTopology string `protobuf:"bytes,9,opt,name=epn_topology,json=epnTopology,proto3" json:"epn_topology,omitempty"` + OdcTopologyFullname string `protobuf:"bytes,10,opt,name=odc_topology_fullname,json=odcTopologyFullname,proto3" json:"odc_topology_fullname,omitempty"` + Detectors string `protobuf:"bytes,11,opt,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *CreateRunRequest) Reset() { + *x = CreateRunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateRunRequest) ProtoMessage() {} + +func (x *CreateRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateRunRequest.ProtoReflect.Descriptor instead. +func (*CreateRunRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{2} +} + +func (x *CreateRunRequest) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *CreateRunRequest) GetNumberOfDetectors() int32 { + if x != nil { + return x.NumberOfDetectors + } + return 0 +} + +func (x *CreateRunRequest) GetNumberOfEpns() int32 { + if x != nil { + return x.NumberOfEpns + } + return 0 +} + +func (x *CreateRunRequest) GetNumberOfFlps() int32 { + if x != nil { + return x.NumberOfFlps + } + return 0 +} + +func (x *CreateRunRequest) GetRunType() string { + if x != nil { + return x.RunType + } + return "" +} + +func (x *CreateRunRequest) GetDdFlp() bool { + if x != nil { + return x.DdFlp + } + return false +} + +func (x *CreateRunRequest) GetDcs() bool { + if x != nil { + return x.Dcs + } + return false +} + +func (x *CreateRunRequest) GetEpn() bool { + if x != nil { + return x.Epn + } + return false +} + +func (x *CreateRunRequest) GetEpnTopology() string { + if x != nil { + return x.EpnTopology + } + return "" +} + +func (x *CreateRunRequest) GetOdcTopologyFullname() string { + if x != nil { + return x.OdcTopologyFullname + } + return "" +} + +func (x *CreateRunRequest) GetDetectors() string { + if x != nil { + return x.Detectors + } + return "" +} + +type UpdateRunRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + RunQuality string `protobuf:"bytes,2,opt,name=run_quality,json=runQuality,proto3" json:"run_quality,omitempty"` + Time_O2Start int64 `protobuf:"varint,3,opt,name=time_O2_start,json=timeO2Start,proto3" json:"time_O2_start,omitempty"` + Time_O2End int64 `protobuf:"varint,4,opt,name=time_O2_end,json=timeO2End,proto3" json:"time_O2_end,omitempty"` + Time_TRGStart int64 `protobuf:"varint,5,opt,name=time_TRG_start,json=timeTRGStart,proto3" json:"time_TRG_start,omitempty"` + Time_TRGEnd int64 `protobuf:"varint,6,opt,name=time_TRG_end,json=timeTRGEnd,proto3" json:"time_TRG_end,omitempty"` + Trigger string `protobuf:"bytes,7,opt,name=trigger,proto3" json:"trigger,omitempty"` + PdpConfig string `protobuf:"bytes,8,opt,name=pdp_config,json=pdpConfig,proto3" json:"pdp_config,omitempty"` + PdpTopology string `protobuf:"bytes,9,opt,name=pdp_topology,json=pdpTopology,proto3" json:"pdp_topology,omitempty"` + TfbMode string `protobuf:"bytes,10,opt,name=tfb_mode,json=tfbMode,proto3" json:"tfb_mode,omitempty"` + LhcPeriod string `protobuf:"bytes,11,opt,name=lhc_period,json=lhcPeriod,proto3" json:"lhc_period,omitempty"` + OdcTopologyFullname string `protobuf:"bytes,12,opt,name=odc_topology_fullname,json=odcTopologyFullname,proto3" json:"odc_topology_fullname,omitempty"` + PdpParameters string `protobuf:"bytes,13,opt,name=pdp_parameters,json=pdpParameters,proto3" json:"pdp_parameters,omitempty"` + PdpBeam string `protobuf:"bytes,14,opt,name=pdp_beam,json=pdpBeam,proto3" json:"pdp_beam,omitempty"` + ReadoutUri string `protobuf:"bytes,15,opt,name=readout_uri,json=readoutUri,proto3" json:"readout_uri,omitempty"` +} + +func (x *UpdateRunRequest) Reset() { + *x = UpdateRunRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateRunRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateRunRequest) ProtoMessage() {} + +func (x *UpdateRunRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateRunRequest.ProtoReflect.Descriptor instead. +func (*UpdateRunRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{3} +} + +func (x *UpdateRunRequest) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *UpdateRunRequest) GetRunQuality() string { + if x != nil { + return x.RunQuality + } + return "" +} + +func (x *UpdateRunRequest) GetTime_O2Start() int64 { + if x != nil { + return x.Time_O2Start + } + return 0 +} + +func (x *UpdateRunRequest) GetTime_O2End() int64 { + if x != nil { + return x.Time_O2End + } + return 0 +} + +func (x *UpdateRunRequest) GetTime_TRGStart() int64 { + if x != nil { + return x.Time_TRGStart + } + return 0 +} + +func (x *UpdateRunRequest) GetTime_TRGEnd() int64 { + if x != nil { + return x.Time_TRGEnd + } + return 0 +} + +func (x *UpdateRunRequest) GetTrigger() string { + if x != nil { + return x.Trigger + } + return "" +} + +func (x *UpdateRunRequest) GetPdpConfig() string { + if x != nil { + return x.PdpConfig + } + return "" +} + +func (x *UpdateRunRequest) GetPdpTopology() string { + if x != nil { + return x.PdpTopology + } + return "" +} + +func (x *UpdateRunRequest) GetTfbMode() string { + if x != nil { + return x.TfbMode + } + return "" +} + +func (x *UpdateRunRequest) GetLhcPeriod() string { + if x != nil { + return x.LhcPeriod + } + return "" +} + +func (x *UpdateRunRequest) GetOdcTopologyFullname() string { + if x != nil { + return x.OdcTopologyFullname + } + return "" +} + +func (x *UpdateRunRequest) GetPdpParameters() string { + if x != nil { + return x.PdpParameters + } + return "" +} + +func (x *UpdateRunRequest) GetPdpBeam() string { + if x != nil { + return x.PdpBeam + } + return "" +} + +func (x *UpdateRunRequest) GetReadoutUri() string { + if x != nil { + return x.ReadoutUri + } + return "" +} + +type LogResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` +} + +func (x *LogResponse) Reset() { + *x = LogResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogResponse) ProtoMessage() {} + +func (x *LogResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogResponse.ProtoReflect.Descriptor instead. +func (*LogResponse) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{4} +} + +func (x *LogResponse) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *LogResponse) GetInfoMessages() string { + if x != nil { + return x.InfoMessages + } + return "" +} + +type CreateLogRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` + ParentLogId int32 `protobuf:"varint,4,opt,name=parent_log_id,json=parentLogId,proto3" json:"parent_log_id,omitempty"` +} + +func (x *CreateLogRequest) Reset() { + *x = CreateLogRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateLogRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateLogRequest) ProtoMessage() {} + +func (x *CreateLogRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateLogRequest.ProtoReflect.Descriptor instead. +func (*CreateLogRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateLogRequest) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *CreateLogRequest) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *CreateLogRequest) GetContent() string { + if x != nil { + return x.Content + } + return "" +} + +func (x *CreateLogRequest) GetParentLogId() int32 { + if x != nil { + return x.ParentLogId + } + return 0 +} + +type FlpResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` +} + +func (x *FlpResponse) Reset() { + *x = FlpResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FlpResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlpResponse) ProtoMessage() {} + +func (x *FlpResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlpResponse.ProtoReflect.Descriptor instead. +func (*FlpResponse) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{6} +} + +func (x *FlpResponse) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *FlpResponse) GetInfoMessages() string { + if x != nil { + return x.InfoMessages + } + return "" +} + +type CreateFlpRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Hostname string `protobuf:"bytes,3,opt,name=hostname,proto3" json:"hostname,omitempty"` +} + +func (x *CreateFlpRequest) Reset() { + *x = CreateFlpRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateFlpRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateFlpRequest) ProtoMessage() {} + +func (x *CreateFlpRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateFlpRequest.ProtoReflect.Descriptor instead. +func (*CreateFlpRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{7} +} + +func (x *CreateFlpRequest) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *CreateFlpRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CreateFlpRequest) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +type UpdateFlpRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + NumberOfSubtimeframes int32 `protobuf:"varint,3,opt,name=number_of_subtimeframes,json=numberOfSubtimeframes,proto3" json:"number_of_subtimeframes,omitempty"` + NumberOfEquipmentBytes int32 `protobuf:"varint,4,opt,name=number_of_equipment_bytes,json=numberOfEquipmentBytes,proto3" json:"number_of_equipment_bytes,omitempty"` + NumberOfRecordingBytes int32 `protobuf:"varint,5,opt,name=number_of_recording_bytes,json=numberOfRecordingBytes,proto3" json:"number_of_recording_bytes,omitempty"` + NumberOfFairMQBytes int32 `protobuf:"varint,6,opt,name=number_of_fairMQ_bytes,json=numberOfFairMQBytes,proto3" json:"number_of_fairMQ_bytes,omitempty"` +} + +func (x *UpdateFlpRequest) Reset() { + *x = UpdateFlpRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateFlpRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateFlpRequest) ProtoMessage() {} + +func (x *UpdateFlpRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateFlpRequest.ProtoReflect.Descriptor instead. +func (*UpdateFlpRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{8} +} + +func (x *UpdateFlpRequest) GetRunInfo() *RunInfo { + if x != nil { + return x.RunInfo + } + return nil +} + +func (x *UpdateFlpRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateFlpRequest) GetNumberOfSubtimeframes() int32 { + if x != nil { + return x.NumberOfSubtimeframes + } + return 0 +} + +func (x *UpdateFlpRequest) GetNumberOfEquipmentBytes() int32 { + if x != nil { + return x.NumberOfEquipmentBytes + } + return 0 +} + +func (x *UpdateFlpRequest) GetNumberOfRecordingBytes() int32 { + if x != nil { + return x.NumberOfRecordingBytes + } + return 0 +} + +func (x *UpdateFlpRequest) GetNumberOfFairMQBytes() int32 { + if x != nil { + return x.NumberOfFairMQBytes + } + return 0 +} + +type EnvironmentInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environment_id,json=environmentId,proto3" json:"environment_id,omitempty"` +} + +func (x *EnvironmentInfo) Reset() { + *x = EnvironmentInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvironmentInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvironmentInfo) ProtoMessage() {} + +func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. +func (*EnvironmentInfo) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{9} +} + +func (x *EnvironmentInfo) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +type EnvironmentResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` + InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` +} + +func (x *EnvironmentResponse) Reset() { + *x = EnvironmentResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvironmentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvironmentResponse) ProtoMessage() {} + +func (x *EnvironmentResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnvironmentResponse.ProtoReflect.Descriptor instead. +func (*EnvironmentResponse) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{10} +} + +func (x *EnvironmentResponse) GetEnvironmentInfo() *EnvironmentInfo { + if x != nil { + return x.EnvironmentInfo + } + return nil +} + +func (x *EnvironmentResponse) GetInfoMessages() string { + if x != nil { + return x.InfoMessages + } + return "" +} + +type CreateEnvRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` + CreatedAt int64 `protobuf:"varint,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + StatusMessage string `protobuf:"bytes,4,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` +} + +func (x *CreateEnvRequest) Reset() { + *x = CreateEnvRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CreateEnvRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateEnvRequest) ProtoMessage() {} + +func (x *CreateEnvRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[11] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateEnvRequest.ProtoReflect.Descriptor instead. +func (*CreateEnvRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{11} +} + +func (x *CreateEnvRequest) GetEnvironmentInfo() *EnvironmentInfo { + if x != nil { + return x.EnvironmentInfo + } + return nil +} + +func (x *CreateEnvRequest) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *CreateEnvRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CreateEnvRequest) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +type UpdateEnvRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` + ToredownAt int64 `protobuf:"varint,2,opt,name=toredown_at,json=toredownAt,proto3" json:"toredown_at,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + StatusMessage string `protobuf:"bytes,4,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` +} + +func (x *UpdateEnvRequest) Reset() { + *x = UpdateEnvRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bookkeeping_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateEnvRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateEnvRequest) ProtoMessage() {} + +func (x *UpdateEnvRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_bookkeeping_proto_msgTypes[12] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateEnvRequest.ProtoReflect.Descriptor instead. +func (*UpdateEnvRequest) Descriptor() ([]byte, []int) { + return file_protos_bookkeeping_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateEnvRequest) GetEnvironmentInfo() *EnvironmentInfo { + if x != nil { + return x.EnvironmentInfo + } + return nil +} + +func (x *UpdateEnvRequest) GetToredownAt() int64 { + if x != nil { + return x.ToredownAt + } + return 0 +} + +func (x *UpdateEnvRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *UpdateEnvRequest) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +var File_protos_bookkeeping_proto protoreflect.FileDescriptor + +var file_protos_bookkeeping_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x4f, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x66, 0x6f, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x8a, 0x03, + 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, + 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, + 0x5f, 0x65, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, + 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x64, + 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, + 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x70, 0x6e, 0x5f, 0x74, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x64, 0x63, 0x5f, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x9d, 0x04, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x4f, 0x32, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x4f, 0x32, + 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x54, 0x52, + 0x47, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x52, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x54, 0x52, 0x47, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x52, 0x47, 0x45, 0x6e, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x64, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x64, 0x70, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x64, 0x70, 0x5f, 0x74, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x64, + 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x66, 0x62, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x66, 0x62, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x68, 0x63, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x64, 0x63, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, + 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x64, 0x70, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x70, 0x64, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, + 0x0a, 0x08, 0x70, 0x64, 0x70, 0x5f, 0x62, 0x65, 0x61, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, + 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x55, 0x72, 0x69, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x6f, + 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, + 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, + 0x97, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x0b, 0x46, 0x6c, 0x70, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x66, + 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x73, + 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, + 0x17, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x69, + 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, + 0x6f, 0x66, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x5f, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x22, 0x38, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x13, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, + 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x22, 0xb9, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbb, 0x01, 0x0a, + 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, + 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xac, 0x04, 0x0a, 0x12, 0x42, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x1d, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x12, 0x1d, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x12, 0x1d, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x11, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x56, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x14, 0x5a, 0x12, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_bookkeeping_proto_rawDescOnce sync.Once + file_protos_bookkeeping_proto_rawDescData = file_protos_bookkeeping_proto_rawDesc +) + +func file_protos_bookkeeping_proto_rawDescGZIP() []byte { + file_protos_bookkeeping_proto_rawDescOnce.Do(func() { + file_protos_bookkeeping_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_bookkeeping_proto_rawDescData) + }) + return file_protos_bookkeeping_proto_rawDescData +} + +var file_protos_bookkeeping_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_protos_bookkeeping_proto_goTypes = []interface{}{ + (*RunInfo)(nil), // 0: bookkeeping.RunInfo + (*RunResponse)(nil), // 1: bookkeeping.RunResponse + (*CreateRunRequest)(nil), // 2: bookkeeping.CreateRunRequest + (*UpdateRunRequest)(nil), // 3: bookkeeping.UpdateRunRequest + (*LogResponse)(nil), // 4: bookkeeping.LogResponse + (*CreateLogRequest)(nil), // 5: bookkeeping.CreateLogRequest + (*FlpResponse)(nil), // 6: bookkeeping.FlpResponse + (*CreateFlpRequest)(nil), // 7: bookkeeping.CreateFlpRequest + (*UpdateFlpRequest)(nil), // 8: bookkeeping.UpdateFlpRequest + (*EnvironmentInfo)(nil), // 9: bookkeeping.EnvironmentInfo + (*EnvironmentResponse)(nil), // 10: bookkeeping.EnvironmentResponse + (*CreateEnvRequest)(nil), // 11: bookkeeping.CreateEnvRequest + (*UpdateEnvRequest)(nil), // 12: bookkeeping.UpdateEnvRequest +} +var file_protos_bookkeeping_proto_depIdxs = []int32{ + 0, // 0: bookkeeping.RunResponse.run_info:type_name -> bookkeeping.RunInfo + 0, // 1: bookkeeping.CreateRunRequest.run_info:type_name -> bookkeeping.RunInfo + 0, // 2: bookkeeping.UpdateRunRequest.run_info:type_name -> bookkeeping.RunInfo + 0, // 3: bookkeeping.LogResponse.run_info:type_name -> bookkeeping.RunInfo + 0, // 4: bookkeeping.CreateLogRequest.run_info:type_name -> bookkeeping.RunInfo + 0, // 5: bookkeeping.FlpResponse.run_info:type_name -> bookkeeping.RunInfo + 0, // 6: bookkeeping.CreateFlpRequest.run_info:type_name -> bookkeeping.RunInfo + 0, // 7: bookkeeping.UpdateFlpRequest.run_info:type_name -> bookkeeping.RunInfo + 9, // 8: bookkeeping.EnvironmentResponse.environment_info:type_name -> bookkeeping.EnvironmentInfo + 9, // 9: bookkeeping.CreateEnvRequest.environment_info:type_name -> bookkeeping.EnvironmentInfo + 9, // 10: bookkeeping.UpdateEnvRequest.environment_info:type_name -> bookkeeping.EnvironmentInfo + 2, // 11: bookkeeping.BookkeepingControl.CreateRun:input_type -> bookkeeping.CreateRunRequest + 3, // 12: bookkeeping.BookkeepingControl.UpdateRun:input_type -> bookkeeping.UpdateRunRequest + 5, // 13: bookkeeping.BookkeepingControl.CreateLog:input_type -> bookkeeping.CreateLogRequest + 7, // 14: bookkeeping.BookkeepingControl.CreateFlp:input_type -> bookkeeping.CreateFlpRequest + 8, // 15: bookkeeping.BookkeepingControl.UpdateFlp:input_type -> bookkeeping.UpdateFlpRequest + 11, // 16: bookkeeping.BookkeepingControl.CreateEnvironment:input_type -> bookkeeping.CreateEnvRequest + 12, // 17: bookkeeping.BookkeepingControl.UpdateEnvironment:input_type -> bookkeeping.UpdateEnvRequest + 1, // 18: bookkeeping.BookkeepingControl.CreateRun:output_type -> bookkeeping.RunResponse + 1, // 19: bookkeeping.BookkeepingControl.UpdateRun:output_type -> bookkeeping.RunResponse + 4, // 20: bookkeeping.BookkeepingControl.CreateLog:output_type -> bookkeeping.LogResponse + 6, // 21: bookkeeping.BookkeepingControl.CreateFlp:output_type -> bookkeeping.FlpResponse + 6, // 22: bookkeeping.BookkeepingControl.UpdateFlp:output_type -> bookkeeping.FlpResponse + 10, // 23: bookkeeping.BookkeepingControl.CreateEnvironment:output_type -> bookkeeping.EnvironmentResponse + 10, // 24: bookkeeping.BookkeepingControl.UpdateEnvironment:output_type -> bookkeeping.EnvironmentResponse + 18, // [18:25] is the sub-list for method output_type + 11, // [11:18] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name +} + +func init() { file_protos_bookkeeping_proto_init() } +func file_protos_bookkeeping_proto_init() { + if File_protos_bookkeeping_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_bookkeeping_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateRunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateRunRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateLogRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FlpResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateFlpRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateFlpRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CreateEnvRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bookkeeping_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateEnvRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_bookkeeping_proto_rawDesc, + NumEnums: 0, + NumMessages: 13, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_bookkeeping_proto_goTypes, + DependencyIndexes: file_protos_bookkeeping_proto_depIdxs, + MessageInfos: file_protos_bookkeeping_proto_msgTypes, + }.Build() + File_protos_bookkeeping_proto = out.File + file_protos_bookkeeping_proto_rawDesc = nil + file_protos_bookkeeping_proto_goTypes = nil + file_protos_bookkeeping_proto_depIdxs = nil +} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping.proto b/core/integration/bookkeepinggRPC/protos/bookkeeping.proto new file mode 100644 index 000000000..bcbe3fa36 --- /dev/null +++ b/core/integration/bookkeepinggRPC/protos/bookkeeping.proto @@ -0,0 +1,133 @@ +syntax = "proto3"; +package bookkeepinggRPC; +option go_package = "protos;bookkeeping"; + +service BookkeepingControl { + // Run management requests + rpc CreateRun(CreateRunRequest) returns (RunResponse) { } + rpc UpdateRun(UpdateRunRequest) returns (RunResponse) { } + + // Log management requests + rpc CreateLog(CreateLogRequest) returns (LogResponse) { } + + // Flp management requests + rpc CreateFlp(CreateFlpRequest) returns (FlpResponse) { } + rpc UpdateFlp(UpdateFlpRequest) returns (FlpResponse) { } + + // Environment management requests + rpc CreateEnvironment(CreateEnvRequest) returns (EnvironmentResponse) { } + rpc UpdateEnvironment(UpdateEnvRequest) returns (EnvironmentResponse) { } +} + +////////////////////// +/// RUN management /// +////////////////////// + +message RunInfo { + int32 run_number = 1; + string environment_id = 2; +} + +message RunResponse { + RunInfo run_info = 1; + string info_messages = 2; +} + +message CreateRunRequest { + RunInfo run_info = 1; + int32 number_of_detectors = 2; + int32 number_of_epns = 3; + int32 number_of_flps = 4; + string run_type = 5; + bool dd_flp = 6; + bool dcs = 7; + bool epn = 8; + string epn_topology = 9; + string odc_topology_fullname = 10; + string detectors = 11; +} + +message UpdateRunRequest { + RunInfo run_info = 1; + string run_quality = 2; + int64 time_O2_start = 3; + int64 time_O2_end = 4; + int64 time_TRG_start = 5; + int64 time_TRG_end = 6; + string trigger = 7; + string pdp_config = 8; + string pdp_topology = 9; + string tfb_mode = 10; + string lhc_period = 11; + string odc_topology_fullname = 12; + string pdp_parameters = 13; + string pdp_beam = 14; + string readout_uri = 15; +} + +////////////////////// +/// LOG management /// +////////////////////// + +message LogResponse { + RunInfo run_info = 1; + string info_messages = 2; +} + +message CreateLogRequest { + RunInfo run_info = 1; + string title = 2; + string content = 3; + int32 parent_log_id = 4; +} + +////////////////////// +/// FLP management /// +////////////////////// + +message FlpResponse { + RunInfo run_info = 1; + string info_messages = 2; +} + +message CreateFlpRequest { + RunInfo run_info = 1; + string name = 2; + string hostname = 3; +} + +message UpdateFlpRequest { + RunInfo run_info = 1; + string name = 2; + int32 number_of_subtimeframes = 3; + int32 number_of_equipment_bytes = 4; + int32 number_of_recording_bytes = 5; + int32 number_of_fairMQ_bytes = 6; +} + +////////////////////// +/// Env management /// +////////////////////// + +message EnvironmentInfo { + string environment_id = 1; +} + +message EnvironmentResponse { + EnvironmentInfo environment_info = 1; + string info_messages = 2; +} + +message CreateEnvRequest { + EnvironmentInfo environment_info = 1; + int64 created_at = 2; + string status = 3; + string status_message = 4; +} + +message UpdateEnvRequest { + EnvironmentInfo environment_info = 1; + int64 toredown_at = 2; + string status = 3; + string status_message = 4; +} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go b/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go new file mode 100644 index 000000000..1295ba7ec --- /dev/null +++ b/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go @@ -0,0 +1,323 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bookkeeping + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// BookkeepingControlClient is the client API for BookkeepingControl service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type BookkeepingControlClient interface { + // Run management requests + CreateRun(ctx context.Context, in *CreateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) + UpdateRun(ctx context.Context, in *UpdateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) + // Log management requests + CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*LogResponse, error) + // Flp management requests + CreateFlp(ctx context.Context, in *CreateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) + UpdateFlp(ctx context.Context, in *UpdateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) + // Environment management requests + CreateEnvironment(ctx context.Context, in *CreateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) + UpdateEnvironment(ctx context.Context, in *UpdateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) +} + +type bookkeepingControlClient struct { + cc grpc.ClientConnInterface +} + +func NewBookkeepingControlClient(cc grpc.ClientConnInterface) BookkeepingControlClient { + return &bookkeepingControlClient{cc} +} + +func (c *bookkeepingControlClient) CreateRun(ctx context.Context, in *CreateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) { + out := new(RunResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateRun", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) UpdateRun(ctx context.Context, in *UpdateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) { + out := new(RunResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateRun", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*LogResponse, error) { + out := new(LogResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateLog", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) CreateFlp(ctx context.Context, in *CreateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) { + out := new(FlpResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateFlp", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) UpdateFlp(ctx context.Context, in *UpdateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) { + out := new(FlpResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateFlp", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) CreateEnvironment(ctx context.Context, in *CreateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) { + out := new(EnvironmentResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bookkeepingControlClient) UpdateEnvironment(ctx context.Context, in *UpdateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) { + out := new(EnvironmentResponse) + err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateEnvironment", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// BookkeepingControlServer is the server API for BookkeepingControl service. +// All implementations should embed UnimplementedBookkeepingControlServer +// for forward compatibility +type BookkeepingControlServer interface { + // Run management requests + CreateRun(context.Context, *CreateRunRequest) (*RunResponse, error) + UpdateRun(context.Context, *UpdateRunRequest) (*RunResponse, error) + // Log management requests + CreateLog(context.Context, *CreateLogRequest) (*LogResponse, error) + // Flp management requests + CreateFlp(context.Context, *CreateFlpRequest) (*FlpResponse, error) + UpdateFlp(context.Context, *UpdateFlpRequest) (*FlpResponse, error) + // Environment management requests + CreateEnvironment(context.Context, *CreateEnvRequest) (*EnvironmentResponse, error) + UpdateEnvironment(context.Context, *UpdateEnvRequest) (*EnvironmentResponse, error) +} + +// UnimplementedBookkeepingControlServer should be embedded to have forward compatible implementations. +type UnimplementedBookkeepingControlServer struct { +} + +func (UnimplementedBookkeepingControlServer) CreateRun(context.Context, *CreateRunRequest) (*RunResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateRun not implemented") +} +func (UnimplementedBookkeepingControlServer) UpdateRun(context.Context, *UpdateRunRequest) (*RunResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateRun not implemented") +} +func (UnimplementedBookkeepingControlServer) CreateLog(context.Context, *CreateLogRequest) (*LogResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateLog not implemented") +} +func (UnimplementedBookkeepingControlServer) CreateFlp(context.Context, *CreateFlpRequest) (*FlpResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateFlp not implemented") +} +func (UnimplementedBookkeepingControlServer) UpdateFlp(context.Context, *UpdateFlpRequest) (*FlpResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateFlp not implemented") +} +func (UnimplementedBookkeepingControlServer) CreateEnvironment(context.Context, *CreateEnvRequest) (*EnvironmentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateEnvironment not implemented") +} +func (UnimplementedBookkeepingControlServer) UpdateEnvironment(context.Context, *UpdateEnvRequest) (*EnvironmentResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateEnvironment not implemented") +} + +// UnsafeBookkeepingControlServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to BookkeepingControlServer will +// result in compilation errors. +type UnsafeBookkeepingControlServer interface { + mustEmbedUnimplementedBookkeepingControlServer() +} + +func RegisterBookkeepingControlServer(s grpc.ServiceRegistrar, srv BookkeepingControlServer) { + s.RegisterService(&BookkeepingControl_ServiceDesc, srv) +} + +func _BookkeepingControl_CreateRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateRunRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).CreateRun(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/CreateRun", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).CreateRun(ctx, req.(*CreateRunRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_UpdateRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateRunRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).UpdateRun(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/UpdateRun", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).UpdateRun(ctx, req.(*UpdateRunRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_CreateLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateLogRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).CreateLog(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/CreateLog", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).CreateLog(ctx, req.(*CreateLogRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_CreateFlp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateFlpRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).CreateFlp(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/CreateFlp", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).CreateFlp(ctx, req.(*CreateFlpRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_UpdateFlp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateFlpRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).UpdateFlp(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/UpdateFlp", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).UpdateFlp(ctx, req.(*UpdateFlpRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_CreateEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateEnvRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).CreateEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/CreateEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).CreateEnvironment(ctx, req.(*CreateEnvRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _BookkeepingControl_UpdateEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateEnvRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BookkeepingControlServer).UpdateEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bookkeeping.BookkeepingControl/UpdateEnvironment", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BookkeepingControlServer).UpdateEnvironment(ctx, req.(*UpdateEnvRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// BookkeepingControl_ServiceDesc is the grpc.ServiceDesc for BookkeepingControl service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var BookkeepingControl_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "bookkeeping.BookkeepingControl", + HandlerType: (*BookkeepingControlServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateRun", + Handler: _BookkeepingControl_CreateRun_Handler, + }, + { + MethodName: "UpdateRun", + Handler: _BookkeepingControl_UpdateRun_Handler, + }, + { + MethodName: "CreateLog", + Handler: _BookkeepingControl_CreateLog_Handler, + }, + { + MethodName: "CreateFlp", + Handler: _BookkeepingControl_CreateFlp_Handler, + }, + { + MethodName: "UpdateFlp", + Handler: _BookkeepingControl_UpdateFlp_Handler, + }, + { + MethodName: "CreateEnvironment", + Handler: _BookkeepingControl_CreateEnvironment_Handler, + }, + { + MethodName: "UpdateEnvironment", + Handler: _BookkeepingControl_UpdateEnvironment_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/bookkeeping.proto", +} diff --git a/core/integration/bookkeepinggRPC/utils.go b/core/integration/bookkeepinggRPC/utils.go new file mode 100644 index 000000000..9193c3e3a --- /dev/null +++ b/core/integration/bookkeepinggRPC/utils.go @@ -0,0 +1,57 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package bookkeepinggRPC + +import ( + "net/http" + + "github.com/spf13/viper" +) + +func getJWTAPIToken() (jwtToken string) { + req, err := http.NewRequest("GET", viper.GetString("bookkeepingBaseUri"), nil) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot create http GET request") + return + } + client := new(http.Client) + client.CheckRedirect = func(req *http.Request, via []*http.Request) error { + if token, ok := req.URL.Query()["token"]; ok { + log.WithField("JWT token", token[0]). + Debug("bookkeeping jwt token") + jwtToken = token[0] + } + return nil + } + + _, err = client.Do(req) + if err != nil { + log.WithField("error", err.Error()). + Error("cannot execute http request") + return + } + return +} From a6157ef225afd49ec699d82fd79eed54bbdec6d0 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 21 Oct 2022 13:31:42 +0200 Subject: [PATCH 1458/2352] [core] The AliECS Bookkeeping plugin is migrated to gRPC, matching the Bookkeeping implementation. --- Makefile | 52 +- core/integration/bookkeeping/api.go | 174 -- .../clientgRPC.go => bookkeeping/client.go} | 15 +- core/integration/bookkeeping/plugin.go | 250 ++- .../bookkeeping/protos/common.pb.go | 845 ++++++++++ .../bookkeeping/protos/common.proto | 117 ++ .../bookkeeping/protos/environment.pb.go | 424 +++++ .../bookkeeping/protos/environment.proto | 47 + .../bookkeeping/protos/environment_grpc.pb.go | 135 ++ core/integration/bookkeeping/protos/flp.pb.go | 466 ++++++ core/integration/bookkeeping/protos/flp.proto | 43 + .../bookkeeping/protos/flp_grpc.pb.go | 99 ++ core/integration/bookkeeping/protos/log.pb.go | 979 +++++++++++ core/integration/bookkeeping/protos/log.proto | 106 ++ .../bookkeeping/protos/log_grpc.pb.go | 99 ++ core/integration/bookkeeping/protos/run.pb.go | 497 ++++++ core/integration/bookkeeping/protos/run.proto | 48 + .../bookkeeping/protos/run_grpc.pb.go | 135 ++ .../integration/bookkeepinggRPC/plugingRPC.go | 836 ---------- .../bookkeepinggRPC/protos/bookkeeping.pb.go | 1441 ----------------- .../bookkeepinggRPC/protos/bookkeeping.proto | 133 -- .../protos/bookkeeping_grpc.pb.go | 323 ---- core/integration/bookkeepinggRPC/utils.go | 57 - 23 files changed, 4309 insertions(+), 3012 deletions(-) delete mode 100644 core/integration/bookkeeping/api.go rename core/integration/{bookkeepinggRPC/clientgRPC.go => bookkeeping/client.go} (89%) create mode 100644 core/integration/bookkeeping/protos/common.pb.go create mode 100644 core/integration/bookkeeping/protos/common.proto create mode 100644 core/integration/bookkeeping/protos/environment.pb.go create mode 100644 core/integration/bookkeeping/protos/environment.proto create mode 100644 core/integration/bookkeeping/protos/environment_grpc.pb.go create mode 100644 core/integration/bookkeeping/protos/flp.pb.go create mode 100644 core/integration/bookkeeping/protos/flp.proto create mode 100644 core/integration/bookkeeping/protos/flp_grpc.pb.go create mode 100644 core/integration/bookkeeping/protos/log.pb.go create mode 100644 core/integration/bookkeeping/protos/log.proto create mode 100644 core/integration/bookkeeping/protos/log_grpc.pb.go create mode 100644 core/integration/bookkeeping/protos/run.pb.go create mode 100644 core/integration/bookkeeping/protos/run.proto create mode 100644 core/integration/bookkeeping/protos/run_grpc.pb.go delete mode 100644 core/integration/bookkeepinggRPC/plugingRPC.go delete mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go delete mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping.proto delete mode 100644 core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go delete mode 100644 core/integration/bookkeepinggRPC/utils.go diff --git a/Makefile b/Makefile index dfcd247d3..61c1876a6 100644 --- a/Makefile +++ b/Makefile @@ -39,6 +39,11 @@ endif REPOPATH = github.com/AliceO2Group/Control ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/odc/grpc/odc.proto" DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master/src/DataDistControl/DataDistControl.proto" +BK_COM_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/common.proto" +BK_ENV_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/environment.proto" +BK_FLP_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/flp.proto" +BK_LOG_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/log.proto" +BK_RUN_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/run.proto" VERBOSE_1 := -v VERBOSE_2 := -v -x @@ -149,6 +154,26 @@ vendor: @mkdir -p core/integration/ddsched/protos @curl -s -L $(DD_PROTO) -o core/integration/ddsched/protos/ddsched.proto + @echo -e "\033[1;33mcurl common.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_COM_PROTO) -o core/integration/bookkeeping/protos/common.proto + + @echo -e "\033[1;33mcurl environment.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_ENV_PROTO) -o core/integration/bookkeeping/protos/environment.proto + + @echo -e "\033[1;33mcurl flp.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_FLP_PROTO) -o core/integration/bookkeeping/protos/flp.proto + + @echo -e "\033[1;33mcurl log.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_LOG_PROTO) -o core/integration/bookkeeping/protos/log.proto + + @echo -e "\033[1;33mcurl run.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_RUN_PROTO) -o core/integration/bookkeeping/protos/run.proto + # WORKAROUND: In order to avoid the following issues: # https://github.com/golang/protobuf/issues/992 # https://github.com/golang/protobuf/issues/1158 @@ -160,7 +185,32 @@ vendor: @echo -e "\033[1;33mpatch ddsched.proto\033[0m" @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb\";\n" if (/^package/)' core/integration/ddsched/protos/ddsched.proto -# vendor: tools/dep + @echo -e "\033[1;33mpatch common.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/common.proto + + @echo -e "\033[1;33mpatch environment.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/environment.proto + + @echo -e "\033[1;33mpatch flp.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/flp.proto + + @echo -e "\033[1;33mpatch log.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/log.proto + + @echo -e "\033[1;33mpatch run.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/run.proto + + @echo -e "\033[1;33mpatch environment.proto\033[0m" + @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/environment.proto + + @echo -e "\033[1;33mpatch flp.proto\033[0m" + @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/flp.proto + + @echo -e "\033[1;33mpatch log.proto\033[0m" + @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/log.proto + + @echo -e "\033[1;33mpatch run.proto\033[0m" + @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/run.proto # @echo -e "\033[1;33mdep ensure\033[0m" # @./tools/dep ensure diff --git a/core/integration/bookkeeping/api.go b/core/integration/bookkeeping/api.go deleted file mode 100644 index 155b93092..000000000 --- a/core/integration/bookkeeping/api.go +++ /dev/null @@ -1,174 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package bookkeeping - -import ( - "github.com/AliceO2Group/Control/common/runtype" - "net/url" - "path" - "strconv" - "sync" - "time" - - clientAPI "github.com/AliceO2Group/Bookkeeping/go-api-client/src" - sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" - "github.com/AliceO2Group/Control/common/logger" - "github.com/sirupsen/logrus" - "github.com/spf13/viper" -) - -// [O2-2512]: Until JWT becomes optional or provided by BK -// const jwtToken = "token" - -var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") - -type BookkeepingWrapper struct{} - -var ( - once sync.Once - // mock instance - instance *BookkeepingWrapper -) - -func Instance() *BookkeepingWrapper { - once.Do(func() { - apiUrl, err := url.Parse(viper.GetString("bookkeepingBaseUri")) - if err == nil { - apiUrl.Path = path.Join(apiUrl.Path + "api") - clientAPI.InitializeApi(apiUrl.String(), viper.GetString("bookkeepingToken")) - } else { - log.WithField("error", err.Error()). - Error("unable to parse the Bookkeeping base URL") - clientAPI.InitializeApi(path.Join(viper.GetString("bookkeepingBaseUri")+"api"), viper.GetString("bookkeepingToken")) - } - instance = &BookkeepingWrapper{} - }) - return instance -} - -func (bk *BookkeepingWrapper) CreateRun(activityId string, nDetectors int, nEpns int, nFlps int, runNumber int32, runType runtype.RunType, ddFlp bool, dcs bool, epn bool, epnTopology string, odcTopologyFullname string, detectors string) error { - - _, _, err := clientAPI.CreateRun(activityId, int32(nDetectors), int32(nEpns), int32(nFlps), runNumber, runType.String(), ddFlp, dcs, epn, epnTopology, odcTopologyFullname, sw.Detectors(detectors)) - - return err -} - -func (bk *BookkeepingWrapper) UpdateRun(runNumber int32, runResult string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string, trg string, pdpConfig string, pdpTopology string, tfbMode string, lhcPeriod string, odcTopologyFullname string, pdpParameters string, pdpBeam string, readoutUri string) error { - var runquality sw.RunQuality - switch runResult { - case string(sw.GOOD_RunQuality): - runquality = sw.GOOD_RunQuality - case string(sw.BAD_RunQuality): - runquality = sw.BAD_RunQuality - default: - runquality = sw.TEST_RunQuality - } - - timeO2S, ok := strconv.ParseInt(timeO2Start, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeO2Start). - Warning("cannot parse O2 start time") - timeO2S = -1 - } - if timeO2Start == "" || timeO2S <= 0 { - timeO2S = -1 - } - var timeO2E int64 = -1 - if timeO2End != "" { - timeO2E, ok = strconv.ParseInt(timeO2End, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeO2End). - Warning("cannot parse O2 end time") - timeO2E = -1 - } - } - if timeO2End == "" || timeO2E <= 0 { - timeO2E = -1 - } - var timeTrgS int64 = -1 - var timeTrgE int64 = -1 - if trg == "LTU" || trg == "CTP" { - timeTrgS, ok = strconv.ParseInt(timeTrgStart, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeTrgStart). - Warning("cannot parse Trg start time") - timeTrgS = -1 - } - if timeTrgStart == "" || timeTrgS <= 0 { - timeTrgS = -1 - } - timeTrgE, ok = strconv.ParseInt(timeTrgEnd, 10, 64) - if ok != nil { - log.WithField("runNumber", runNumber). - WithField("time", timeTrgEnd). - Warning("cannot parse Trg end time") - timeTrgE = -1 - } - if timeTrgEnd == "" || timeTrgE <= 0 { - timeTrgE = -1 - } - } - - _, _, err := clientAPI.UpdateRun(runNumber, runquality, timeO2S, timeO2E, timeTrgS, timeTrgE, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) - return err -} - -func (bk *BookkeepingWrapper) CreateLog(text string, title string, runNumbers string, parentLogId int32) error { - _, _, err := clientAPI.CreateLog(text, title, runNumbers, parentLogId) - return err -} - -func (bk *BookkeepingWrapper) CreateFlp(name string, hostName string, runNumber int32) error { - _, _, err := clientAPI.CreateFlp(name, hostName, runNumber) - return err -} - -func (bk *BookkeepingWrapper) UpdateFlp(name string, runNumber int32, nSubtimeframes int32, nEquipmentBytes int32, nRecordingBytes int32, nFairMQBytes int32) error { - _, _, err := clientAPI.UpdateFlp(name, runNumber, nSubtimeframes, nEquipmentBytes, nRecordingBytes, nFairMQBytes) - return err -} - -func (bk *BookkeepingWrapper) GetLogs() { - clientAPI.GetLogs() - log.Debug("GetLogs call done") -} - -func (bk *BookkeepingWrapper) GetRuns() { - clientAPI.GetRuns() - log.Debug("GetRuns call done") -} - -func (bk *BookkeepingWrapper) CreateEnvironment(envId string, createdAt time.Time, status string, statusMessage string) error { - _, _, err := clientAPI.CreateEnvironment(envId, createdAt, status, statusMessage) - return err -} - -func (bk *BookkeepingWrapper) UpdateEnvironment(envId string, toredownAt time.Time, status string, statusMessage string) error { - _, _, err := clientAPI.UpdateEnvironment(envId, toredownAt, status, statusMessage) - return err -} diff --git a/core/integration/bookkeepinggRPC/clientgRPC.go b/core/integration/bookkeeping/client.go similarity index 89% rename from core/integration/bookkeepinggRPC/clientgRPC.go rename to core/integration/bookkeeping/client.go index 2a5171f8b..732eae7fd 100644 --- a/core/integration/bookkeepinggRPC/clientgRPC.go +++ b/core/integration/bookkeeping/client.go @@ -22,14 +22,15 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package bookkeepinggRPC +package bookkeeping import ( "context" "time" "github.com/AliceO2Group/Control/common/logger" - bkpb "github.com/AliceO2Group/Control/core/integration/bookkeepinggRPC/protos" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" + //bkpb "github.com/AliceO2Group/Bookkeeping" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" @@ -41,7 +42,10 @@ import ( var log = logger.New(logrus.StandardLogger(), "bookkeepingclient") type RpcClient struct { - bkpb.BookkeepingControlClient + bkpb.EnvironmentServiceClient + bkpb.FlpServiceClient + bkpb.LogServiceClient + bkpb.RunServiceClient conn *grpc.ClientConn cancel context.CancelFunc } @@ -112,7 +116,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) }() client := &RpcClient{ - BookkeepingControlClient: bkpb.NewBookkeepingControlClient(conn), + EnvironmentServiceClient: bkpb.NewEnvironmentServiceClient(conn), + FlpServiceClient: bkpb.NewFlpServiceClient(conn), + LogServiceClient: bkpb.NewLogServiceClient(conn), + RunServiceClient: bkpb.NewRunServiceClient(conn), conn: conn, cancel: cancel, } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 1adaf1f47..f4f199c51 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1,33 +1,41 @@ /* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Claire Guyot - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. +* === This file is part of ALICE O² === +* +* Copyright 2021 CERN and copyright holders of ALICE O². +* Author: Claire Guyot +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* +* In applying this license CERN does not waive the privileges and +* immunities granted to it by virtue of its status as an +* Intergovernmental Organization or submit itself to any jurisdiction. */ +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/common.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/environment.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/flp.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/log.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/run.proto package bookkeeping import ( + "context" "encoding/json" "errors" "fmt" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" + "google.golang.org/grpc" "net/url" "strconv" "strings" @@ -41,11 +49,17 @@ import ( "github.com/spf13/viper" ) +const ( + BKP_SOR_TIMEOUT = 30 * time.Second + BKP_EOR_TIMEOUT = 30 * time.Second + BKP_DEFAULT_POLLING_TIMEOUT = 30 * time.Second +) + type Plugin struct { bookkeepingHost string bookkeepingPort int - bookkeepingClient *BookkeepingWrapper + bookkeepingClient *RpcClient pendingRunStops map[string] /*envId*/ int64 pendingO2Stops map[string] /*envId*/ string @@ -108,11 +122,14 @@ func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { } func (p *Plugin) Init(instanceId string) error { - p.bookkeepingClient = Instance() if p.bookkeepingClient == nil { - return fmt.Errorf("failed to connect to Bookkeeping service on %s", viper.GetString("bookkeepingBaseUri")) + cxt, cancel := context.WithCancel(context.Background()) + p.bookkeepingClient = NewClient(cxt, cancel, p.GetEndpoint()) + if p.bookkeepingClient == nil { + return fmt.Errorf("failed to connect to Bookkeeping service on %s", p.GetEndpoint()) + } + log.Debug("DD scheduler plugin initialized") } - log.Debug("Bookkeeping plugin initialized") return nil } @@ -262,7 +279,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - err = p.bookkeepingClient.CreateRun(env.Id().String(), len(env.GetActiveDetectors()), int(epns), len(flps), int32(runNumber), env.GetRunType(), ddEnabled, dcsEnabled, epnEnabled, odcTopology, odcTopologyFullname, detectors) + inRun := bkpb.RunCreationRequest{ + RunNumber: int32(runNumber64), + EnvironmentId: env.Id().String(), + NDetectors: int32(len(env.GetActiveDetectors())), + NEpns: int32(epns), + NFlps: int32(len(flps)), + RunType: bkpb.RunType(env.GetRunType()), + DdFlp: ddEnabled, + Dcs: dcsEnabled, + Epn: epnEnabled, + EpnTopology: odcTopology, + OdcTopologyFullName: odcTopologyFullname, + Detectors: []bkpb.Detector(detectors), + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("runNumber", runNumber). @@ -282,26 +317,51 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("CreateRun call successful") } + var inFlps = bkpb.ManyFlpsCreationRequest{ + Flps: make([]*bkpb.FlpCreationRequest, len(flps)), + } + for _, flp := range flps { - err = p.bookkeepingClient.CreateFlp(flp, flp, int32(runNumber)) - if err != nil { - log.WithError(err). - WithField("flp", flp). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "CreateFlp"). - Error("Bookkeeping API CreateFlp error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return + inFlp := &bkpb.FlpCreationRequest{ + Name: flp, + HostName: flp, + RunNumber: int32(runNumber64), } + inFlps.Flps = append(inFlps.Flps, inFlp) + } + + timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateFlp", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.FlpServiceClient.CreateMany(ctx, &inFlps, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "CreateFlp"). + Error("Bookkeeping API CreateFlp error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return } log.WithField("runNumber", runNumber). WithField("partition", envId). Debug("CreateFlp call done") - err = p.bookkeepingClient.CreateLog(env.GetVarsAsString(), fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), rnString, -1) + runNumbers := make([]int32, 0) + runNumbers = append(runNumbers, int32(runNumber64)) + inLog := bkpb.LogCreationRequest{ + RunNumbers: runNumbers, + Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), + Text: env.GetVarsAsString(), + ParentLogId: -1, + } + + timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateLog", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("runNumber", runNumber). @@ -386,7 +446,86 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] - err = p.bookkeepingClient.UpdateRun(int32(runNumber64), state, timeO2Start, timeO2End, timeTrgStart, timeTrgEnd, trg, pdpConfig, pdpTopology, tfbMode, lhcPeriod, odcTopologyFullname, pdpParameters, pdpBeam, readoutUri) + var runquality bkpb.RunQuality + switch state { + case string(bkpb.RunQuality_RUN_QUALITY_GOOD): + runquality = bkpb.RunQuality_RUN_QUALITY_GOOD + case string(bkpb.RunQuality_RUN_QUALITY_BAD): + runquality = bkpb.RunQuality_RUN_QUALITY_BAD + default: + runquality = bkpb.RunQuality_RUN_QUALITY_TEST + } + + timeO2S, err := strconv.ParseInt(timeO2Start, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeO2Start). + Warning("cannot parse O2 start time") + timeO2S = -1 + } + if timeO2Start == "" || timeO2S <= 0 { + timeO2S = -1 + } + var timeO2E int64 = -1 + if timeO2End != "" { + timeO2E, err = strconv.ParseInt(timeO2End, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeO2End). + Warning("cannot parse O2 end time") + timeO2E = -1 + } + } + if timeO2End == "" || timeO2E <= 0 { + timeO2E = -1 + } + var timeTrgS int64 = -1 + var timeTrgE int64 = -1 + if trg == "LTU" || trg == "CTP" { + timeTrgS, err = strconv.ParseInt(timeTrgStart, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeTrgStart). + Warning("cannot parse Trg start time") + timeTrgS = -1 + } + if timeTrgStart == "" || timeTrgS <= 0 { + timeTrgS = -1 + } + timeTrgE, err = strconv.ParseInt(timeTrgEnd, 10, 64) + if err != nil { + log.WithField("runNumber", runNumber64). + WithField("time", timeTrgEnd). + Warning("cannot parse Trg end time") + timeTrgE = -1 + } + if timeTrgEnd == "" || timeTrgE <= 0 { + timeTrgE = -1 + } + } + + inRun := bkpb.RunUpdateRequest{ + RunNumber: int32(runNumber64), + RunQuality: runquality, + TimeO2Start: timeO2S, + TimeO2End: timeO2E, + TimeTrgStart: timeTrgS, + TimeTrgEnd: timeTrgE, + TriggerValue: trigger, + PdpConfigOption: pdpConfig, + PdpTopologyDescriptionLibraryFile: pdpTopology, + TfbDdMode: tfbMode, + LhcPeriod: lhcPeriod, + OdcTopologyFullName: odcTopologyFullname, + PdpWorkflowParameters: pdpParameters, + PdpBeamType: pdpBeam, + ReadoutCfgUri: readoutUri, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("runNumber", runNumber64). @@ -531,12 +670,26 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + var statusMessage = "" envState := env.CurrentState() if envState == "STANDBY" || envState == "DEPLOYED" { - err = p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "success: the environment is in "+envState+" state after creation") + statusMessage = "success: the environment is in " + envState + " state after creation" } else { - err = p.bookkeepingClient.CreateEnvironment(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after creation") + statusMessage = "error: the environment is in " + envState + " state after creation" + } + + inEnv := bkpb.EnvironmentCreationRequest{ + EnvId: env.Id().String(), + CreatedAt: time.Now().UnixMilli(), + Status: envState, + StatusMessage: statusMessage, } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.EnvironmentServiceClient.Create(ctx, &inEnv, grpc.EmptyCallOption{}) + if err != nil { log.WithError(err). WithField("partition", envId). @@ -554,7 +707,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { callFailedStr := "Bookkeeping UpdateEnv call failed" - err := p.bookkeepingClient.UpdateEnvironment(envId, toredownAt, status, statusMessage) + + inEnv := bkpb.EnvironmentUpdateRequest{ + EnvId: env.Id().String(), + ToredownAt: toredownAt.UnixMilli(), + Status: status, + StatusMessage: statusMessage, + } + + timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.EnvironmentServiceClient.Update(ctx, &inEnv, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("partition", envId). diff --git a/core/integration/bookkeeping/protos/common.pb.go b/core/integration/bookkeeping/protos/common.pb.go new file mode 100644 index 000000000..a38838347 --- /dev/null +++ b/core/integration/bookkeeping/protos/common.pb.go @@ -0,0 +1,845 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/common.proto + +package bkpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type Detector int32 + +const ( + Detector_DETECTOR_NULL Detector = 0 + Detector_DETECTOR_TPC Detector = 3 + Detector_DETECTOR_TRD Detector = 4 + Detector_DETECTOR_TOF Detector = 5 + Detector_DETECTOR_HMP Detector = 6 + Detector_DETECTOR_PHS Detector = 7 + Detector_DETECTOR_CPV Detector = 8 + Detector_DETECTOR_MCH Detector = 10 + Detector_DETECTOR_ZDC Detector = 15 + Detector_DETECTOR_EMC Detector = 18 + Detector_DETECTOR_TST Detector = 19 + Detector_DETECTOR_ITS Detector = 32 + Detector_DETECTOR_FDD Detector = 33 + Detector_DETECTOR_FT0 Detector = 34 + Detector_DETECTOR_FV0 Detector = 35 + Detector_DETECTOR_MFT Detector = 36 + Detector_DETECTOR_MID Detector = 37 +) + +// Enum value maps for Detector. +var ( + Detector_name = map[int32]string{ + 0: "DETECTOR_NULL", + 3: "DETECTOR_TPC", + 4: "DETECTOR_TRD", + 5: "DETECTOR_TOF", + 6: "DETECTOR_HMP", + 7: "DETECTOR_PHS", + 8: "DETECTOR_CPV", + 10: "DETECTOR_MCH", + 15: "DETECTOR_ZDC", + 18: "DETECTOR_EMC", + 19: "DETECTOR_TST", + 32: "DETECTOR_ITS", + 33: "DETECTOR_FDD", + 34: "DETECTOR_FT0", + 35: "DETECTOR_FV0", + 36: "DETECTOR_MFT", + 37: "DETECTOR_MID", + } + Detector_value = map[string]int32{ + "DETECTOR_NULL": 0, + "DETECTOR_TPC": 3, + "DETECTOR_TRD": 4, + "DETECTOR_TOF": 5, + "DETECTOR_HMP": 6, + "DETECTOR_PHS": 7, + "DETECTOR_CPV": 8, + "DETECTOR_MCH": 10, + "DETECTOR_ZDC": 15, + "DETECTOR_EMC": 18, + "DETECTOR_TST": 19, + "DETECTOR_ITS": 32, + "DETECTOR_FDD": 33, + "DETECTOR_FT0": 34, + "DETECTOR_FV0": 35, + "DETECTOR_MFT": 36, + "DETECTOR_MID": 37, + } +) + +func (x Detector) Enum() *Detector { + p := new(Detector) + *p = x + return p +} + +func (x Detector) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Detector) Descriptor() protoreflect.EnumDescriptor { + return file_protos_common_proto_enumTypes[0].Descriptor() +} + +func (Detector) Type() protoreflect.EnumType { + return &file_protos_common_proto_enumTypes[0] +} + +func (x Detector) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Detector.Descriptor instead. +func (Detector) EnumDescriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{0} +} + +type RunQuality int32 + +const ( + RunQuality_RUN_QUALITY_NULL RunQuality = 0 + RunQuality_RUN_QUALITY_BAD RunQuality = 1 + RunQuality_RUN_QUALITY_GOOD RunQuality = 2 + RunQuality_RUN_QUALITY_TEST RunQuality = 3 +) + +// Enum value maps for RunQuality. +var ( + RunQuality_name = map[int32]string{ + 0: "RUN_QUALITY_NULL", + 1: "RUN_QUALITY_BAD", + 2: "RUN_QUALITY_GOOD", + 3: "RUN_QUALITY_TEST", + } + RunQuality_value = map[string]int32{ + "RUN_QUALITY_NULL": 0, + "RUN_QUALITY_BAD": 1, + "RUN_QUALITY_GOOD": 2, + "RUN_QUALITY_TEST": 3, + } +) + +func (x RunQuality) Enum() *RunQuality { + p := new(RunQuality) + *p = x + return p +} + +func (x RunQuality) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunQuality) Descriptor() protoreflect.EnumDescriptor { + return file_protos_common_proto_enumTypes[1].Descriptor() +} + +func (RunQuality) Type() protoreflect.EnumType { + return &file_protos_common_proto_enumTypes[1] +} + +func (x RunQuality) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunQuality.Descriptor instead. +func (RunQuality) EnumDescriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{1} +} + +type RunType int32 + +const ( + RunType_RUN_TYPE_NULL RunType = 0 + RunType_RUN_TYPE_PHYSICS RunType = 1 + RunType_RUN_TYPE_TECHNICAL RunType = 2 + RunType_RUN_TYPE_PEDESTALS RunType = 3 + RunType_RUN_TYPE_PULSER RunType = 4 + RunType_RUN_TYPE_LASER RunType = 5 + RunType_RUN_TYPE_CALIBRATION_ITHR_TUNING RunType = 6 + RunType_RUN_TYPE_CALIBRATION_VCASN_TUNING RunType = 7 + RunType_RUN_TYPE_CALIBRATION_THR_SCAN RunType = 8 + RunType_RUN_TYPE_CALIBRATION_DIGITAL_SCAN RunType = 9 + RunType_RUN_TYPE_CALIBRATION_ANALOG_SCAN RunType = 10 + RunType_RUN_TYPE_CALIBRATION_FHR RunType = 11 + RunType_RUN_TYPE_CALIBRATION_ALPIDE_SCAN RunType = 12 + RunType_RUN_TYPE_CALIBRATION RunType = 200 + RunType_RUN_TYPE_COSMICS RunType = 201 + RunType_RUN_TYPE_SYNTHETIC RunType = 202 + RunType_RUN_TYPE_ANY RunType = 300 +) + +// Enum value maps for RunType. +var ( + RunType_name = map[int32]string{ + 0: "RUN_TYPE_NULL", + 1: "RUN_TYPE_PHYSICS", + 2: "RUN_TYPE_TECHNICAL", + 3: "RUN_TYPE_PEDESTALS", + 4: "RUN_TYPE_PULSER", + 5: "RUN_TYPE_LASER", + 6: "RUN_TYPE_CALIBRATION_ITHR_TUNING", + 7: "RUN_TYPE_CALIBRATION_VCASN_TUNING", + 8: "RUN_TYPE_CALIBRATION_THR_SCAN", + 9: "RUN_TYPE_CALIBRATION_DIGITAL_SCAN", + 10: "RUN_TYPE_CALIBRATION_ANALOG_SCAN", + 11: "RUN_TYPE_CALIBRATION_FHR", + 12: "RUN_TYPE_CALIBRATION_ALPIDE_SCAN", + 200: "RUN_TYPE_CALIBRATION", + 201: "RUN_TYPE_COSMICS", + 202: "RUN_TYPE_SYNTHETIC", + 300: "RUN_TYPE_ANY", + } + RunType_value = map[string]int32{ + "RUN_TYPE_NULL": 0, + "RUN_TYPE_PHYSICS": 1, + "RUN_TYPE_TECHNICAL": 2, + "RUN_TYPE_PEDESTALS": 3, + "RUN_TYPE_PULSER": 4, + "RUN_TYPE_LASER": 5, + "RUN_TYPE_CALIBRATION_ITHR_TUNING": 6, + "RUN_TYPE_CALIBRATION_VCASN_TUNING": 7, + "RUN_TYPE_CALIBRATION_THR_SCAN": 8, + "RUN_TYPE_CALIBRATION_DIGITAL_SCAN": 9, + "RUN_TYPE_CALIBRATION_ANALOG_SCAN": 10, + "RUN_TYPE_CALIBRATION_FHR": 11, + "RUN_TYPE_CALIBRATION_ALPIDE_SCAN": 12, + "RUN_TYPE_CALIBRATION": 200, + "RUN_TYPE_COSMICS": 201, + "RUN_TYPE_SYNTHETIC": 202, + "RUN_TYPE_ANY": 300, + } +) + +func (x RunType) Enum() *RunType { + p := new(RunType) + *p = x + return p +} + +func (x RunType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_common_proto_enumTypes[2].Descriptor() +} + +func (RunType) Type() protoreflect.EnumType { + return &file_protos_common_proto_enumTypes[2] +} + +func (x RunType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunType.Descriptor instead. +func (RunType) EnumDescriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{2} +} + +type Run struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + EnvironmentId string `protobuf:"bytes,2,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + BytesReadOut int32 `protobuf:"varint,3,opt,name=bytesReadOut,proto3" json:"bytesReadOut,omitempty"` + // Unix timestamp when this entity was created + CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Id int32 `protobuf:"varint,5,opt,name=Id,proto3" json:"Id,omitempty"` + NDetectors int32 `protobuf:"varint,6,opt,name=nDetectors,proto3" json:"nDetectors,omitempty"` + NEpns int32 `protobuf:"varint,7,opt,name=nEpns,proto3" json:"nEpns,omitempty"` + NFlps int32 `protobuf:"varint,8,opt,name=nFlps,proto3" json:"nFlps,omitempty"` + NSubtimeframes int32 `protobuf:"varint,9,opt,name=nSubtimeframes,proto3" json:"nSubtimeframes,omitempty"` + // Repository hash + PdpConfigOption string `protobuf:"bytes,10,opt,name=pdpConfigOption,proto3" json:"pdpConfigOption,omitempty"` + // Library file location of the pdp topology description + PdpTopologyDescriptionLibraryFile string `protobuf:"bytes,11,opt,name=pdpTopologyDescriptionLibraryFile,proto3" json:"pdpTopologyDescriptionLibraryFile,omitempty"` + // Parameters given to the pdp workflow + PdpWorkflowParameters string `protobuf:"bytes,12,opt,name=pdpWorkflowParameters,proto3" json:"pdpWorkflowParameters,omitempty"` + // Beam type of the pdp + PdpBeamType string `protobuf:"bytes,13,opt,name=pdpBeamType,proto3" json:"pdpBeamType,omitempty"` + // Config uri of readout. + ReadoutCfgUri string `protobuf:"bytes,14,opt,name=readoutCfgUri,proto3" json:"readoutCfgUri,omitempty"` + RunQuality RunQuality `protobuf:"varint,15,opt,name=runQuality,proto3,enum=o2.bookkeeping.RunQuality" json:"runQuality,omitempty"` + RunType RunType `protobuf:"varint,16,opt,name=runType,proto3,enum=o2.bookkeeping.RunType" json:"runType,omitempty"` + TfbDdMode string `protobuf:"bytes,17,opt,name=tfbDdMode,proto3" json:"tfbDdMode,omitempty"` + TimeO2End int64 `protobuf:"varint,18,opt,name=timeO2End,proto3" json:"timeO2End,omitempty"` + TimeO2Start int64 `protobuf:"varint,19,opt,name=timeO2Start,proto3" json:"timeO2Start,omitempty"` + TimeTrgEnd int64 `protobuf:"varint,20,opt,name=timeTrgEnd,proto3" json:"timeTrgEnd,omitempty"` + TimeTrgStart int64 `protobuf:"varint,21,opt,name=timeTrgStart,proto3" json:"timeTrgStart,omitempty"` + // Trigger value + TriggerValue string `protobuf:"bytes,22,opt,name=triggerValue,proto3" json:"triggerValue,omitempty"` + // The full name or file location of the odcTopology + OdcTopologyFullName string `protobuf:"bytes,23,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` + DdFlp bool `protobuf:"varint,24,opt,name=ddFlp,proto3" json:"ddFlp,omitempty"` + Dcs bool `protobuf:"varint,25,opt,name=dcs,proto3" json:"dcs,omitempty"` + Epn bool `protobuf:"varint,26,opt,name=epn,proto3" json:"epn,omitempty"` + EpnTopology string `protobuf:"bytes,27,opt,name=epnTopology,proto3" json:"epnTopology,omitempty"` + Detectors []Detector `protobuf:"varint,28,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` + // Unix timestamp when this entity was last updated + UpdatedAt int64 `protobuf:"varint,30,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + // A string that marks the period of the lhc + LhcPeriod string `protobuf:"bytes,31,opt,name=lhcPeriod,proto3" json:"lhcPeriod,omitempty"` +} + +func (x *Run) Reset() { + *x = Run{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Run) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Run) ProtoMessage() {} + +func (x *Run) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Run.ProtoReflect.Descriptor instead. +func (*Run) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{0} +} + +func (x *Run) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *Run) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *Run) GetBytesReadOut() int32 { + if x != nil { + return x.BytesReadOut + } + return 0 +} + +func (x *Run) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Run) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Run) GetNDetectors() int32 { + if x != nil { + return x.NDetectors + } + return 0 +} + +func (x *Run) GetNEpns() int32 { + if x != nil { + return x.NEpns + } + return 0 +} + +func (x *Run) GetNFlps() int32 { + if x != nil { + return x.NFlps + } + return 0 +} + +func (x *Run) GetNSubtimeframes() int32 { + if x != nil { + return x.NSubtimeframes + } + return 0 +} + +func (x *Run) GetPdpConfigOption() string { + if x != nil { + return x.PdpConfigOption + } + return "" +} + +func (x *Run) GetPdpTopologyDescriptionLibraryFile() string { + if x != nil { + return x.PdpTopologyDescriptionLibraryFile + } + return "" +} + +func (x *Run) GetPdpWorkflowParameters() string { + if x != nil { + return x.PdpWorkflowParameters + } + return "" +} + +func (x *Run) GetPdpBeamType() string { + if x != nil { + return x.PdpBeamType + } + return "" +} + +func (x *Run) GetReadoutCfgUri() string { + if x != nil { + return x.ReadoutCfgUri + } + return "" +} + +func (x *Run) GetRunQuality() RunQuality { + if x != nil { + return x.RunQuality + } + return RunQuality_RUN_QUALITY_NULL +} + +func (x *Run) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_RUN_TYPE_NULL +} + +func (x *Run) GetTfbDdMode() string { + if x != nil { + return x.TfbDdMode + } + return "" +} + +func (x *Run) GetTimeO2End() int64 { + if x != nil { + return x.TimeO2End + } + return 0 +} + +func (x *Run) GetTimeO2Start() int64 { + if x != nil { + return x.TimeO2Start + } + return 0 +} + +func (x *Run) GetTimeTrgEnd() int64 { + if x != nil { + return x.TimeTrgEnd + } + return 0 +} + +func (x *Run) GetTimeTrgStart() int64 { + if x != nil { + return x.TimeTrgStart + } + return 0 +} + +func (x *Run) GetTriggerValue() string { + if x != nil { + return x.TriggerValue + } + return "" +} + +func (x *Run) GetOdcTopologyFullName() string { + if x != nil { + return x.OdcTopologyFullName + } + return "" +} + +func (x *Run) GetDdFlp() bool { + if x != nil { + return x.DdFlp + } + return false +} + +func (x *Run) GetDcs() bool { + if x != nil { + return x.Dcs + } + return false +} + +func (x *Run) GetEpn() bool { + if x != nil { + return x.Epn + } + return false +} + +func (x *Run) GetEpnTopology() string { + if x != nil { + return x.EpnTopology + } + return "" +} + +func (x *Run) GetDetectors() []Detector { + if x != nil { + return x.Detectors + } + return nil +} + +func (x *Run) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *Run) GetLhcPeriod() string { + if x != nil { + return x.LhcPeriod + } + return "" +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique CERN identifier of this user. + ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` + // The unique identifier of this entity. + Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + // Name of the user. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{1} +} + +func (x *User) GetExternalId() int32 { + if x != nil { + return x.ExternalId + } + return 0 +} + +func (x *User) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_protos_common_proto protoreflect.FileDescriptor + +var file_protos_common_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xbc, 0x08, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x02, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, 0x6c, + 0x70, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, + 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x4c, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x70, 0x64, + 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x34, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, + 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, + 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x12, 0x3a, 0x0a, + 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x72, + 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, + 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x69, + 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x69, + 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, + 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, + 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x65, 0x70, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x1c, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x22, 0x4a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, + 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, + 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, + 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, + 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, + 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, + 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, + 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, + 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x63, 0x0a, 0x0a, 0x52, 0x75, + 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, + 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, + 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, + 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, + 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, + 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x2a, + 0xf9, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, + 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, + 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, + 0x4c, 0x53, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, + 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, + 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, + 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, + 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x19, + 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xc8, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0xc9, 0x01, + 0x12, 0x17, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, + 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0xca, 0x01, 0x12, 0x11, 0x0a, 0x0c, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x0d, + 0x10, 0xc7, 0x01, 0x22, 0x06, 0x08, 0xcb, 0x01, 0x10, 0xab, 0x02, 0x42, 0x4a, 0x5a, 0x48, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_common_proto_rawDescOnce sync.Once + file_protos_common_proto_rawDescData = file_protos_common_proto_rawDesc +) + +func file_protos_common_proto_rawDescGZIP() []byte { + file_protos_common_proto_rawDescOnce.Do(func() { + file_protos_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_common_proto_rawDescData) + }) + return file_protos_common_proto_rawDescData +} + +var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_common_proto_goTypes = []interface{}{ + (Detector)(0), // 0: o2.bookkeeping.Detector + (RunQuality)(0), // 1: o2.bookkeeping.RunQuality + (RunType)(0), // 2: o2.bookkeeping.RunType + (*Run)(nil), // 3: o2.bookkeeping.Run + (*User)(nil), // 4: o2.bookkeeping.User +} +var file_protos_common_proto_depIdxs = []int32{ + 1, // 0: o2.bookkeeping.Run.runQuality:type_name -> o2.bookkeeping.RunQuality + 2, // 1: o2.bookkeeping.Run.runType:type_name -> o2.bookkeeping.RunType + 0, // 2: o2.bookkeeping.Run.detectors:type_name -> o2.bookkeeping.Detector + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_protos_common_proto_init() } +func file_protos_common_proto_init() { + if File_protos_common_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Run); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_common_proto_rawDesc, + NumEnums: 3, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_common_proto_goTypes, + DependencyIndexes: file_protos_common_proto_depIdxs, + EnumInfos: file_protos_common_proto_enumTypes, + MessageInfos: file_protos_common_proto_msgTypes, + }.Build() + File_protos_common_proto = out.File + file_protos_common_proto_rawDesc = nil + file_protos_common_proto_goTypes = nil + file_protos_common_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/common.proto b/core/integration/bookkeeping/protos/common.proto new file mode 100644 index 000000000..75b9b7cf4 --- /dev/null +++ b/core/integration/bookkeeping/protos/common.proto @@ -0,0 +1,117 @@ +syntax = 'proto3'; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +enum Detector { + DETECTOR_NULL = 0; + + reserved 1, 2; + DETECTOR_TPC = 3; + DETECTOR_TRD = 4; + DETECTOR_TOF = 5; + DETECTOR_HMP = 6; + DETECTOR_PHS = 7; + DETECTOR_CPV = 8; + reserved 9; + + DETECTOR_MCH = 10; + reserved 11 to 14; + + DETECTOR_ZDC = 15; + reserved 16, 17; + + DETECTOR_EMC = 18; + DETECTOR_TST = 19; + reserved 20 to 31; + + DETECTOR_ITS = 32; + DETECTOR_FDD = 33; + DETECTOR_FT0 = 34; + DETECTOR_FV0 = 35; + DETECTOR_MFT = 36; + DETECTOR_MID = 37; +} + +enum RunQuality { + RUN_QUALITY_NULL = 0; + RUN_QUALITY_BAD = 1; + RUN_QUALITY_GOOD = 2; + RUN_QUALITY_TEST = 3; +} + +enum RunType { + RUN_TYPE_NULL = 0; + RUN_TYPE_PHYSICS = 1; + RUN_TYPE_TECHNICAL = 2; + RUN_TYPE_PEDESTALS = 3; + RUN_TYPE_PULSER = 4; + RUN_TYPE_LASER = 5; + RUN_TYPE_CALIBRATION_ITHR_TUNING = 6; + RUN_TYPE_CALIBRATION_VCASN_TUNING = 7; + RUN_TYPE_CALIBRATION_THR_SCAN = 8; + RUN_TYPE_CALIBRATION_DIGITAL_SCAN = 9; + RUN_TYPE_CALIBRATION_ANALOG_SCAN = 10; + RUN_TYPE_CALIBRATION_FHR = 11; + RUN_TYPE_CALIBRATION_ALPIDE_SCAN = 12; + reserved 13 to 199; + + RUN_TYPE_CALIBRATION = 200; + RUN_TYPE_COSMICS = 201; + RUN_TYPE_SYNTHETIC = 202; + reserved 203 to 299; + + RUN_TYPE_ANY = 300; +} + +message Run { + int32 runNumber = 1; + string environmentId = 2; + int32 bytesReadOut = 3; + // Unix timestamp when this entity was created + int64 createdAt = 4; + int32 Id = 5; + int32 nDetectors = 6; + int32 nEpns = 7; + int32 nFlps = 8; + int32 nSubtimeframes = 9; + // Repository hash + string pdpConfigOption = 10; + // Library file location of the pdp topology description + string pdpTopologyDescriptionLibraryFile = 11; + // Parameters given to the pdp workflow + string pdpWorkflowParameters = 12; + // Beam type of the pdp + string pdpBeamType = 13; + // Config uri of readout. + string readoutCfgUri = 14; + RunQuality runQuality = 15; + RunType runType = 16; + string tfbDdMode = 17; + int64 timeO2End = 18; + int64 timeO2Start = 19; + int64 timeTrgEnd = 20; + int64 timeTrgStart = 21; + // Trigger value + string triggerValue = 22; + // The full name or file location of the odcTopology + string odcTopologyFullName = 23; + bool ddFlp = 24; + bool dcs = 25; + bool epn = 26; + string epnTopology = 27; + repeated Detector detectors = 28; + // Unix timestamp when this entity was last updated + int64 updatedAt = 30; + // A string that marks the period of the lhc + string lhcPeriod = 31; +} + +message User { + // The unique CERN identifier of this user. + int32 externalId = 1; + // The unique identifier of this entity. + int32 id = 2; + // Name of the user. + string name = 3; +} diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go new file mode 100644 index 000000000..3d5a0cb86 --- /dev/null +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -0,0 +1,424 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/environment.proto + +package bkpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type EnvironmentCreationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + CreatedAt int64 `protobuf:"varint,2,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + StatusMessage string `protobuf:"bytes,4,opt,name=statusMessage,proto3" json:"statusMessage,omitempty"` +} + +func (x *EnvironmentCreationRequest) Reset() { + *x = EnvironmentCreationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_environment_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvironmentCreationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvironmentCreationRequest) ProtoMessage() {} + +func (x *EnvironmentCreationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_environment_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnvironmentCreationRequest.ProtoReflect.Descriptor instead. +func (*EnvironmentCreationRequest) Descriptor() ([]byte, []int) { + return file_protos_environment_proto_rawDescGZIP(), []int{0} +} + +func (x *EnvironmentCreationRequest) GetEnvId() string { + if x != nil { + return x.EnvId + } + return "" +} + +func (x *EnvironmentCreationRequest) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *EnvironmentCreationRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *EnvironmentCreationRequest) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +type EnvironmentUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` + ToredownAt int64 `protobuf:"varint,2,opt,name=toredownAt,proto3" json:"toredownAt,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + StatusMessage string `protobuf:"bytes,4,opt,name=statusMessage,proto3" json:"statusMessage,omitempty"` +} + +func (x *EnvironmentUpdateRequest) Reset() { + *x = EnvironmentUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_environment_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EnvironmentUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnvironmentUpdateRequest) ProtoMessage() {} + +func (x *EnvironmentUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_environment_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EnvironmentUpdateRequest.ProtoReflect.Descriptor instead. +func (*EnvironmentUpdateRequest) Descriptor() ([]byte, []int) { + return file_protos_environment_proto_rawDescGZIP(), []int{1} +} + +func (x *EnvironmentUpdateRequest) GetEnvId() string { + if x != nil { + return x.EnvId + } + return "" +} + +func (x *EnvironmentUpdateRequest) GetToredownAt() int64 { + if x != nil { + return x.ToredownAt + } + return 0 +} + +func (x *EnvironmentUpdateRequest) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *EnvironmentUpdateRequest) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +type Environment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,2,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + // Unix timestamp when this entity was last updated. + UpdatedAt int64 `protobuf:"varint,3,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + // Unix timestamp when this entity was tore down. + ToredownAt int64 `protobuf:"varint,4,opt,name=toredownAt,proto3" json:"toredownAt,omitempty"` + // The status of the environment. + Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` + // A message explaining the status or the current state of the environment. + StatusMessage string `protobuf:"bytes,6,opt,name=statusMessage,proto3" json:"statusMessage,omitempty"` + // Array of minified Run objects. + Runs []*Run `protobuf:"bytes,7,rep,name=runs,proto3" json:"runs,omitempty"` +} + +func (x *Environment) Reset() { + *x = Environment{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_environment_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Environment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Environment) ProtoMessage() {} + +func (x *Environment) ProtoReflect() protoreflect.Message { + mi := &file_protos_environment_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Environment.ProtoReflect.Descriptor instead. +func (*Environment) Descriptor() ([]byte, []int) { + return file_protos_environment_proto_rawDescGZIP(), []int{2} +} + +func (x *Environment) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Environment) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Environment) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *Environment) GetToredownAt() int64 { + if x != nil { + return x.ToredownAt + } + return 0 +} + +func (x *Environment) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *Environment) GetStatusMessage() string { + if x != nil { + return x.StatusMessage + } + return "" +} + +func (x *Environment) GetRuns() []*Run { + if x != nil { + return x.Runs + } + return nil +} + +var File_protos_environment_proto protoreflect.FileDescriptor + +var file_protos_environment_proto_rawDesc = []byte{ + 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x8e, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, + 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, + 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, + 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, + 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, +} + +var ( + file_protos_environment_proto_rawDescOnce sync.Once + file_protos_environment_proto_rawDescData = file_protos_environment_proto_rawDesc +) + +func file_protos_environment_proto_rawDescGZIP() []byte { + file_protos_environment_proto_rawDescOnce.Do(func() { + file_protos_environment_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_environment_proto_rawDescData) + }) + return file_protos_environment_proto_rawDescData +} + +var file_protos_environment_proto_msgTypes = make([]protoimpl.MessageInfo, 3) +var file_protos_environment_proto_goTypes = []interface{}{ + (*EnvironmentCreationRequest)(nil), // 0: o2.bookkeeping.EnvironmentCreationRequest + (*EnvironmentUpdateRequest)(nil), // 1: o2.bookkeeping.EnvironmentUpdateRequest + (*Environment)(nil), // 2: o2.bookkeeping.Environment + (*Run)(nil), // 3: o2.bookkeeping.Run +} +var file_protos_environment_proto_depIdxs = []int32{ + 3, // 0: o2.bookkeeping.Environment.runs:type_name -> o2.bookkeeping.Run + 0, // 1: o2.bookkeeping.EnvironmentService.Create:input_type -> o2.bookkeeping.EnvironmentCreationRequest + 1, // 2: o2.bookkeeping.EnvironmentService.Update:input_type -> o2.bookkeeping.EnvironmentUpdateRequest + 2, // 3: o2.bookkeeping.EnvironmentService.Create:output_type -> o2.bookkeeping.Environment + 2, // 4: o2.bookkeeping.EnvironmentService.Update:output_type -> o2.bookkeeping.Environment + 3, // [3:5] is the sub-list for method output_type + 1, // [1:3] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_protos_environment_proto_init() } +func file_protos_environment_proto_init() { + if File_protos_environment_proto != nil { + return + } + file_protos_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_protos_environment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_environment_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EnvironmentUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_environment_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Environment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_environment_proto_rawDesc, + NumEnums: 0, + NumMessages: 3, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_environment_proto_goTypes, + DependencyIndexes: file_protos_environment_proto_depIdxs, + MessageInfos: file_protos_environment_proto_msgTypes, + }.Build() + File_protos_environment_proto = out.File + file_protos_environment_proto_rawDesc = nil + file_protos_environment_proto_goTypes = nil + file_protos_environment_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/environment.proto b/core/integration/bookkeeping/protos/environment.proto new file mode 100644 index 000000000..d1361af33 --- /dev/null +++ b/core/integration/bookkeeping/protos/environment.proto @@ -0,0 +1,47 @@ +syntax = 'proto3'; + +import "protos/common.proto"; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +// Services + +service EnvironmentService { + rpc Create(EnvironmentCreationRequest) returns (Environment); + rpc Update(EnvironmentUpdateRequest) returns (Environment); +} + +// High level messages + +message EnvironmentCreationRequest { + string envId = 1; + int64 createdAt = 2; + string status = 3; + string statusMessage = 4; +} + +message EnvironmentUpdateRequest { + string envId = 1; + int64 toredownAt = 2; + string status = 3; + string statusMessage = 4; +} + +// Low-level messages and enums + +message Environment { + string id = 1; + // Unix timestamp when this entity was created. + int64 createdAt = 2; + // Unix timestamp when this entity was last updated. + int64 updatedAt = 3; + // Unix timestamp when this entity was tore down. + int64 toredownAt = 4; + // The status of the environment. + string status = 5; + // A message explaining the status or the current state of the environment. + string statusMessage = 6; + // Array of minified Run objects. + repeated Run runs = 7; +} diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go new file mode 100644 index 000000000..88b5f97f7 --- /dev/null +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -0,0 +1,135 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bkpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// EnvironmentServiceClient is the client API for EnvironmentService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type EnvironmentServiceClient interface { + Create(ctx context.Context, in *EnvironmentCreationRequest, opts ...grpc.CallOption) (*Environment, error) + Update(ctx context.Context, in *EnvironmentUpdateRequest, opts ...grpc.CallOption) (*Environment, error) +} + +type environmentServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewEnvironmentServiceClient(cc grpc.ClientConnInterface) EnvironmentServiceClient { + return &environmentServiceClient{cc} +} + +func (c *environmentServiceClient) Create(ctx context.Context, in *EnvironmentCreationRequest, opts ...grpc.CallOption) (*Environment, error) { + out := new(Environment) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.EnvironmentService/Create", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *environmentServiceClient) Update(ctx context.Context, in *EnvironmentUpdateRequest, opts ...grpc.CallOption) (*Environment, error) { + out := new(Environment) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.EnvironmentService/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// EnvironmentServiceServer is the server API for EnvironmentService service. +// All implementations should embed UnimplementedEnvironmentServiceServer +// for forward compatibility +type EnvironmentServiceServer interface { + Create(context.Context, *EnvironmentCreationRequest) (*Environment, error) + Update(context.Context, *EnvironmentUpdateRequest) (*Environment, error) +} + +// UnimplementedEnvironmentServiceServer should be embedded to have forward compatible implementations. +type UnimplementedEnvironmentServiceServer struct { +} + +func (UnimplementedEnvironmentServiceServer) Create(context.Context, *EnvironmentCreationRequest) (*Environment, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedEnvironmentServiceServer) Update(context.Context, *EnvironmentUpdateRequest) (*Environment, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} + +// UnsafeEnvironmentServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to EnvironmentServiceServer will +// result in compilation errors. +type UnsafeEnvironmentServiceServer interface { + mustEmbedUnimplementedEnvironmentServiceServer() +} + +func RegisterEnvironmentServiceServer(s grpc.ServiceRegistrar, srv EnvironmentServiceServer) { + s.RegisterService(&EnvironmentService_ServiceDesc, srv) +} + +func _EnvironmentService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnvironmentCreationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EnvironmentServiceServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.EnvironmentService/Create", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EnvironmentServiceServer).Create(ctx, req.(*EnvironmentCreationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _EnvironmentService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(EnvironmentUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(EnvironmentServiceServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.EnvironmentService/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(EnvironmentServiceServer).Update(ctx, req.(*EnvironmentUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// EnvironmentService_ServiceDesc is the grpc.ServiceDesc for EnvironmentService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var EnvironmentService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "o2.bookkeeping.EnvironmentService", + HandlerType: (*EnvironmentServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Create", + Handler: _EnvironmentService_Create_Handler, + }, + { + MethodName: "Update", + Handler: _EnvironmentService_Update_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/environment.proto", +} diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go new file mode 100644 index 000000000..9c166dce8 --- /dev/null +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -0,0 +1,466 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/flp.proto + +package bkpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type FlpCreationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + HostName string `protobuf:"bytes,2,opt,name=hostName,proto3" json:"hostName,omitempty"` + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` +} + +func (x *FlpCreationRequest) Reset() { + *x = FlpCreationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_flp_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FlpCreationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlpCreationRequest) ProtoMessage() {} + +func (x *FlpCreationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_flp_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlpCreationRequest.ProtoReflect.Descriptor instead. +func (*FlpCreationRequest) Descriptor() ([]byte, []int) { + return file_protos_flp_proto_rawDescGZIP(), []int{0} +} + +func (x *FlpCreationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FlpCreationRequest) GetHostName() string { + if x != nil { + return x.HostName + } + return "" +} + +func (x *FlpCreationRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +type ManyFlpsCreationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Flps []*FlpCreationRequest `protobuf:"bytes,1,rep,name=flps,proto3" json:"flps,omitempty"` +} + +func (x *ManyFlpsCreationRequest) Reset() { + *x = ManyFlpsCreationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_flp_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ManyFlpsCreationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ManyFlpsCreationRequest) ProtoMessage() {} + +func (x *ManyFlpsCreationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_flp_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ManyFlpsCreationRequest.ProtoReflect.Descriptor instead. +func (*ManyFlpsCreationRequest) Descriptor() ([]byte, []int) { + return file_protos_flp_proto_rawDescGZIP(), []int{1} +} + +func (x *ManyFlpsCreationRequest) GetFlps() []*FlpCreationRequest { + if x != nil { + return x.Flps + } + return nil +} + +type FlpList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Flps []*Flp `protobuf:"bytes,1,rep,name=flps,proto3" json:"flps,omitempty"` +} + +func (x *FlpList) Reset() { + *x = FlpList{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_flp_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FlpList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FlpList) ProtoMessage() {} + +func (x *FlpList) ProtoReflect() protoreflect.Message { + mi := &file_protos_flp_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FlpList.ProtoReflect.Descriptor instead. +func (*FlpList) Descriptor() ([]byte, []int) { + return file_protos_flp_proto_rawDescGZIP(), []int{2} +} + +func (x *FlpList) GetFlps() []*Flp { + if x != nil { + return x.Flps + } + return nil +} + +type Flp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Hostname string `protobuf:"bytes,3,opt,name=hostname,proto3" json:"hostname,omitempty"` + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + // Unix timestamp when this entity was last updated. + UpdatedAt int64 `protobuf:"varint,5,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + BytesEquipmentReadOut int32 `protobuf:"varint,6,opt,name=bytesEquipmentReadOut,proto3" json:"bytesEquipmentReadOut,omitempty"` + BytesFairMQReadOut int32 `protobuf:"varint,7,opt,name=bytesFairMQReadOut,proto3" json:"bytesFairMQReadOut,omitempty"` + BytesProcessed int32 `protobuf:"varint,8,opt,name=bytesProcessed,proto3" json:"bytesProcessed,omitempty"` + BytesRecordingReadOut int32 `protobuf:"varint,9,opt,name=bytesRecordingReadOut,proto3" json:"bytesRecordingReadOut,omitempty"` + NTimeframes int32 `protobuf:"varint,10,opt,name=nTimeframes,proto3" json:"nTimeframes,omitempty"` +} + +func (x *Flp) Reset() { + *x = Flp{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_flp_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Flp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Flp) ProtoMessage() {} + +func (x *Flp) ProtoReflect() protoreflect.Message { + mi := &file_protos_flp_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Flp.ProtoReflect.Descriptor instead. +func (*Flp) Descriptor() ([]byte, []int) { + return file_protos_flp_proto_rawDescGZIP(), []int{3} +} + +func (x *Flp) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Flp) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Flp) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *Flp) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Flp) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *Flp) GetBytesEquipmentReadOut() int32 { + if x != nil { + return x.BytesEquipmentReadOut + } + return 0 +} + +func (x *Flp) GetBytesFairMQReadOut() int32 { + if x != nil { + return x.BytesFairMQReadOut + } + return 0 +} + +func (x *Flp) GetBytesProcessed() int32 { + if x != nil { + return x.BytesProcessed + } + return 0 +} + +func (x *Flp) GetBytesRecordingReadOut() int32 { + if x != nil { + return x.BytesRecordingReadOut + } + return 0 +} + +func (x *Flp) GetNTimeframes() int32 { + if x != nil { + return x.NTimeframes + } + return 0 +} + +var File_protos_flp_proto protoreflect.FileDescriptor + +var file_protos_flp_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x6c, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x22, 0x62, 0x0a, 0x12, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x17, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, + 0x70, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x36, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0x32, 0x0a, 0x07, 0x46, 0x6c, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xe7, 0x02, + 0x0a, 0x03, 0x46, 0x6c, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, + 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, + 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x5c, 0x0a, 0x0a, 0x46, 0x6c, 0x70, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, + 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, 0x70, 0x73, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, + 0x70, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_flp_proto_rawDescOnce sync.Once + file_protos_flp_proto_rawDescData = file_protos_flp_proto_rawDesc +) + +func file_protos_flp_proto_rawDescGZIP() []byte { + file_protos_flp_proto_rawDescOnce.Do(func() { + file_protos_flp_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_flp_proto_rawDescData) + }) + return file_protos_flp_proto_rawDescData +} + +var file_protos_flp_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_protos_flp_proto_goTypes = []interface{}{ + (*FlpCreationRequest)(nil), // 0: o2.bookkeeping.FlpCreationRequest + (*ManyFlpsCreationRequest)(nil), // 1: o2.bookkeeping.ManyFlpsCreationRequest + (*FlpList)(nil), // 2: o2.bookkeeping.FlpList + (*Flp)(nil), // 3: o2.bookkeeping.Flp +} +var file_protos_flp_proto_depIdxs = []int32{ + 0, // 0: o2.bookkeeping.ManyFlpsCreationRequest.flps:type_name -> o2.bookkeeping.FlpCreationRequest + 3, // 1: o2.bookkeeping.FlpList.flps:type_name -> o2.bookkeeping.Flp + 1, // 2: o2.bookkeeping.FlpService.CreateMany:input_type -> o2.bookkeeping.ManyFlpsCreationRequest + 2, // 3: o2.bookkeeping.FlpService.CreateMany:output_type -> o2.bookkeeping.FlpList + 3, // [3:4] is the sub-list for method output_type + 2, // [2:3] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_protos_flp_proto_init() } +func file_protos_flp_proto_init() { + if File_protos_flp_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_flp_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FlpCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_flp_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ManyFlpsCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_flp_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FlpList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_flp_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Flp); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_flp_proto_rawDesc, + NumEnums: 0, + NumMessages: 4, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_flp_proto_goTypes, + DependencyIndexes: file_protos_flp_proto_depIdxs, + MessageInfos: file_protos_flp_proto_msgTypes, + }.Build() + File_protos_flp_proto = out.File + file_protos_flp_proto_rawDesc = nil + file_protos_flp_proto_goTypes = nil + file_protos_flp_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/flp.proto b/core/integration/bookkeeping/protos/flp.proto new file mode 100644 index 000000000..9f67bccf6 --- /dev/null +++ b/core/integration/bookkeeping/protos/flp.proto @@ -0,0 +1,43 @@ +syntax = 'proto3'; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +// Services + +service FlpService { + rpc CreateMany(ManyFlpsCreationRequest) returns (FlpList); +} + +// High level messages + +message FlpCreationRequest { + string name = 1; + string hostName = 2; + int32 runNumber = 3; +} + +message ManyFlpsCreationRequest { + repeated FlpCreationRequest flps = 1; +} + +message FlpList { + repeated Flp flps = 1; +} + +// Low-level messages and enums + +message Flp { + int32 id = 1; + string name = 2; + string hostname = 3; + // Unix timestamp when this entity was created. + int64 createdAt = 4; + // Unix timestamp when this entity was last updated. + int64 updatedAt = 5; + int32 bytesEquipmentReadOut = 6; + int32 bytesFairMQReadOut = 7; + int32 bytesProcessed = 8; + int32 bytesRecordingReadOut = 9; + int32 nTimeframes = 10; +} diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go new file mode 100644 index 000000000..f4fc752f3 --- /dev/null +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -0,0 +1,99 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bkpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// FlpServiceClient is the client API for FlpService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type FlpServiceClient interface { + CreateMany(ctx context.Context, in *ManyFlpsCreationRequest, opts ...grpc.CallOption) (*FlpList, error) +} + +type flpServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewFlpServiceClient(cc grpc.ClientConnInterface) FlpServiceClient { + return &flpServiceClient{cc} +} + +func (c *flpServiceClient) CreateMany(ctx context.Context, in *ManyFlpsCreationRequest, opts ...grpc.CallOption) (*FlpList, error) { + out := new(FlpList) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.FlpService/CreateMany", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// FlpServiceServer is the server API for FlpService service. +// All implementations should embed UnimplementedFlpServiceServer +// for forward compatibility +type FlpServiceServer interface { + CreateMany(context.Context, *ManyFlpsCreationRequest) (*FlpList, error) +} + +// UnimplementedFlpServiceServer should be embedded to have forward compatible implementations. +type UnimplementedFlpServiceServer struct { +} + +func (UnimplementedFlpServiceServer) CreateMany(context.Context, *ManyFlpsCreationRequest) (*FlpList, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateMany not implemented") +} + +// UnsafeFlpServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to FlpServiceServer will +// result in compilation errors. +type UnsafeFlpServiceServer interface { + mustEmbedUnimplementedFlpServiceServer() +} + +func RegisterFlpServiceServer(s grpc.ServiceRegistrar, srv FlpServiceServer) { + s.RegisterService(&FlpService_ServiceDesc, srv) +} + +func _FlpService_CreateMany_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ManyFlpsCreationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FlpServiceServer).CreateMany(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.FlpService/CreateMany", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FlpServiceServer).CreateMany(ctx, req.(*ManyFlpsCreationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// FlpService_ServiceDesc is the grpc.ServiceDesc for FlpService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var FlpService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "o2.bookkeeping.FlpService", + HandlerType: (*FlpServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "CreateMany", + Handler: _FlpService_CreateMany_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/flp.proto", +} diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go new file mode 100644 index 000000000..0e127a27d --- /dev/null +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -0,0 +1,979 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/log.proto + +package bkpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type LogOrigin int32 + +const ( + LogOrigin_LOG_ORIGIN_NULL LogOrigin = 0 + LogOrigin_LOG_ORIGIN_HUMAN LogOrigin = 1 + LogOrigin_LOG_ORIGIN_PROCESS LogOrigin = 2 +) + +// Enum value maps for LogOrigin. +var ( + LogOrigin_name = map[int32]string{ + 0: "LOG_ORIGIN_NULL", + 1: "LOG_ORIGIN_HUMAN", + 2: "LOG_ORIGIN_PROCESS", + } + LogOrigin_value = map[string]int32{ + "LOG_ORIGIN_NULL": 0, + "LOG_ORIGIN_HUMAN": 1, + "LOG_ORIGIN_PROCESS": 2, + } +) + +func (x LogOrigin) Enum() *LogOrigin { + p := new(LogOrigin) + *p = x + return p +} + +func (x LogOrigin) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LogOrigin) Descriptor() protoreflect.EnumDescriptor { + return file_protos_log_proto_enumTypes[0].Descriptor() +} + +func (LogOrigin) Type() protoreflect.EnumType { + return &file_protos_log_proto_enumTypes[0] +} + +func (x LogOrigin) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LogOrigin.Descriptor instead. +func (LogOrigin) EnumDescriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{0} +} + +type LogSubtype int32 + +const ( + LogSubtype_LOG_SUBTYPE_NULL LogSubtype = 0 + LogSubtype_LOG_SUBTYPE_RUN LogSubtype = 1 + LogSubtype_LOG_SUBTYPE_SUBSYSTEM LogSubtype = 2 + LogSubtype_LOG_SUBTYPE_ANNOUNCEMENT LogSubtype = 3 + LogSubtype_LOG_SUBTYPE_INTERVENTION LogSubtype = 4 + LogSubtype_LOG_SUBTYPE_COMMENT LogSubtype = 5 +) + +// Enum value maps for LogSubtype. +var ( + LogSubtype_name = map[int32]string{ + 0: "LOG_SUBTYPE_NULL", + 1: "LOG_SUBTYPE_RUN", + 2: "LOG_SUBTYPE_SUBSYSTEM", + 3: "LOG_SUBTYPE_ANNOUNCEMENT", + 4: "LOG_SUBTYPE_INTERVENTION", + 5: "LOG_SUBTYPE_COMMENT", + } + LogSubtype_value = map[string]int32{ + "LOG_SUBTYPE_NULL": 0, + "LOG_SUBTYPE_RUN": 1, + "LOG_SUBTYPE_SUBSYSTEM": 2, + "LOG_SUBTYPE_ANNOUNCEMENT": 3, + "LOG_SUBTYPE_INTERVENTION": 4, + "LOG_SUBTYPE_COMMENT": 5, + } +) + +func (x LogSubtype) Enum() *LogSubtype { + p := new(LogSubtype) + *p = x + return p +} + +func (x LogSubtype) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (LogSubtype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_log_proto_enumTypes[1].Descriptor() +} + +func (LogSubtype) Type() protoreflect.EnumType { + return &file_protos_log_proto_enumTypes[1] +} + +func (x LogSubtype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use LogSubtype.Descriptor instead. +func (LogSubtype) EnumDescriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{1} +} + +type LogCreationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` + RunNumbers []int32 `protobuf:"varint,3,rep,packed,name=runNumbers,proto3" json:"runNumbers,omitempty"` + ParentLogId int32 `protobuf:"varint,4,opt,name=parentLogId,proto3" json:"parentLogId,omitempty"` +} + +func (x *LogCreationRequest) Reset() { + *x = LogCreationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LogCreationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LogCreationRequest) ProtoMessage() {} + +func (x *LogCreationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LogCreationRequest.ProtoReflect.Descriptor instead. +func (*LogCreationRequest) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{0} +} + +func (x *LogCreationRequest) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *LogCreationRequest) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +func (x *LogCreationRequest) GetRunNumbers() []int32 { + if x != nil { + return x.RunNumbers + } + return nil +} + +func (x *LogCreationRequest) GetParentLogId() int32 { + if x != nil { + return x.ParentLogId + } + return 0 +} + +type Attachment struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,1,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Encoding string `protobuf:"bytes,2,opt,name=encoding,proto3" json:"encoding,omitempty"` + FileName string `protobuf:"bytes,3,opt,name=fileName,proto3" json:"fileName,omitempty"` + Id int32 `protobuf:"varint,4,opt,name=id,proto3" json:"id,omitempty"` + LogId int32 `protobuf:"varint,5,opt,name=logId,proto3" json:"logId,omitempty"` + MimeType string `protobuf:"bytes,6,opt,name=mimeType,proto3" json:"mimeType,omitempty"` + OriginalName string `protobuf:"bytes,7,opt,name=originalName,proto3" json:"originalName,omitempty"` + Path string `protobuf:"bytes,8,opt,name=path,proto3" json:"path,omitempty"` + Size int32 `protobuf:"varint,9,opt,name=size,proto3" json:"size,omitempty"` + // Unix timestamp when this entity was created. + UpdatedAt int64 `protobuf:"varint,10,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` +} + +func (x *Attachment) Reset() { + *x = Attachment{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Attachment) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Attachment) ProtoMessage() {} + +func (x *Attachment) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Attachment.ProtoReflect.Descriptor instead. +func (*Attachment) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{1} +} + +func (x *Attachment) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Attachment) GetEncoding() string { + if x != nil { + return x.Encoding + } + return "" +} + +func (x *Attachment) GetFileName() string { + if x != nil { + return x.FileName + } + return "" +} + +func (x *Attachment) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Attachment) GetLogId() int32 { + if x != nil { + return x.LogId + } + return 0 +} + +func (x *Attachment) GetMimeType() string { + if x != nil { + return x.MimeType + } + return "" +} + +func (x *Attachment) GetOriginalName() string { + if x != nil { + return x.OriginalName + } + return "" +} + +func (x *Attachment) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *Attachment) GetSize() int32 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *Attachment) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +type Log struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Attachments []*Attachment `protobuf:"bytes,1,rep,name=attachments,proto3" json:"attachments,omitempty"` + Author *User `protobuf:"bytes,2,opt,name=author,proto3" json:"author,omitempty"` + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + Id int32 `protobuf:"varint,4,opt,name=id,proto3" json:"id,omitempty"` + Origin []LogOrigin `protobuf:"varint,5,rep,packed,name=origin,proto3,enum=o2.bookkeeping.LogOrigin" json:"origin,omitempty"` + ParentLogId int32 `protobuf:"varint,6,opt,name=parentLogId,proto3" json:"parentLogId,omitempty"` + Replies int32 `protobuf:"varint,7,opt,name=Replies,proto3" json:"Replies,omitempty"` + RootLogId int32 `protobuf:"varint,8,opt,name=rootLogId,proto3" json:"rootLogId,omitempty"` + // Array of minified Run objects. + Runs []*MinimalRun `protobuf:"bytes,9,rep,name=runs,proto3" json:"runs,omitempty"` + Subsystems []*Subsystem `protobuf:"bytes,10,rep,name=subsystems,proto3" json:"subsystems,omitempty"` + Subtype LogSubtype `protobuf:"varint,11,opt,name=subtype,proto3,enum=o2.bookkeeping.LogSubtype" json:"subtype,omitempty"` + Tags []*Tag `protobuf:"bytes,12,rep,name=tags,proto3" json:"tags,omitempty"` + Text string `protobuf:"bytes,14,opt,name=text,proto3" json:"text,omitempty"` + Title string `protobuf:"bytes,15,opt,name=title,proto3" json:"title,omitempty"` + // Unix timestamp when this entity was last updated. + UpdatedAt int64 `protobuf:"varint,16,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` +} + +func (x *Log) Reset() { + *x = Log{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Log) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Log) ProtoMessage() {} + +func (x *Log) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Log.ProtoReflect.Descriptor instead. +func (*Log) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{2} +} + +func (x *Log) GetAttachments() []*Attachment { + if x != nil { + return x.Attachments + } + return nil +} + +func (x *Log) GetAuthor() *User { + if x != nil { + return x.Author + } + return nil +} + +func (x *Log) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Log) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Log) GetOrigin() []LogOrigin { + if x != nil { + return x.Origin + } + return nil +} + +func (x *Log) GetParentLogId() int32 { + if x != nil { + return x.ParentLogId + } + return 0 +} + +func (x *Log) GetReplies() int32 { + if x != nil { + return x.Replies + } + return 0 +} + +func (x *Log) GetRootLogId() int32 { + if x != nil { + return x.RootLogId + } + return 0 +} + +func (x *Log) GetRuns() []*MinimalRun { + if x != nil { + return x.Runs + } + return nil +} + +func (x *Log) GetSubsystems() []*Subsystem { + if x != nil { + return x.Subsystems + } + return nil +} + +func (x *Log) GetSubtype() LogSubtype { + if x != nil { + return x.Subtype + } + return LogSubtype_LOG_SUBTYPE_NULL +} + +func (x *Log) GetTags() []*Tag { + if x != nil { + return x.Tags + } + return nil +} + +func (x *Log) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +func (x *Log) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *Log) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +type MinimalRun struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` +} + +func (x *MinimalRun) Reset() { + *x = MinimalRun{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MinimalRun) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MinimalRun) ProtoMessage() {} + +func (x *MinimalRun) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MinimalRun.ProtoReflect.Descriptor instead. +func (*MinimalRun) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{3} +} + +func (x *MinimalRun) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *MinimalRun) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +type Subsystem struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,1,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + // The label value of the subsystem. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + // Unix timestamp when this entity was last updated. + UpdatedAt int64 `protobuf:"varint,5,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` +} + +func (x *Subsystem) Reset() { + *x = Subsystem{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Subsystem) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Subsystem) ProtoMessage() {} + +func (x *Subsystem) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Subsystem.ProtoReflect.Descriptor instead. +func (*Subsystem) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{4} +} + +func (x *Subsystem) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Subsystem) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Subsystem) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Subsystem) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +type Tag struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Unix timestamp when this entity was created. + CreatedAt int64 `protobuf:"varint,1,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` + // The label value of the tag. + Text string `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"` + // The email for the tag. + Email string `protobuf:"bytes,4,opt,name=email,proto3" json:"email,omitempty"` + // All the mattermost tags for updates + Mattermost string `protobuf:"bytes,5,opt,name=mattermost,proto3" json:"mattermost,omitempty"` + // Unix timestamp when this entity was last updated. + UpdatedAt int64 `protobuf:"varint,6,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + // The last person that edited the email/mattermost fields + LastEditedName string `protobuf:"bytes,7,opt,name=lastEditedName,proto3" json:"lastEditedName,omitempty"` +} + +func (x *Tag) Reset() { + *x = Tag{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_log_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Tag) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Tag) ProtoMessage() {} + +func (x *Tag) ProtoReflect() protoreflect.Message { + mi := &file_protos_log_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Tag.ProtoReflect.Descriptor instead. +func (*Tag) Descriptor() ([]byte, []int) { + return file_protos_log_proto_rawDescGZIP(), []int{5} +} + +func (x *Tag) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Tag) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Tag) GetText() string { + if x != nil { + return x.Text + } + return "" +} + +func (x *Tag) GetEmail() string { + if x != nil { + return x.Email + } + return "" +} + +func (x *Tag) GetMattermost() string { + if x != nil { + return x.Mattermost + } + return "" +} + +func (x *Tag) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *Tag) GetLastEditedName() string { + if x != nil { + return x.LastEditedName + } + return "" +} + +var File_protos_log_proto protoreflect.FileDescriptor + +var file_protos_log_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x0a, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xbe, 0x04, 0x0a, 0x03, + 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x31, 0x0a, + 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, + 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, + 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, + 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, + 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3a, 0x0a, 0x0a, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, + 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, + 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x4e, 0x0a, 0x09, 0x4c, + 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, + 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x55, 0x4d, 0x41, + 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, + 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x0a, + 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x02, + 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1c, + 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, + 0x54, 0x45, 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, + 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, + 0x6f, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_log_proto_rawDescOnce sync.Once + file_protos_log_proto_rawDescData = file_protos_log_proto_rawDesc +) + +func file_protos_log_proto_rawDescGZIP() []byte { + file_protos_log_proto_rawDescOnce.Do(func() { + file_protos_log_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_log_proto_rawDescData) + }) + return file_protos_log_proto_rawDescData +} + +var file_protos_log_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_protos_log_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_log_proto_goTypes = []interface{}{ + (LogOrigin)(0), // 0: o2.bookkeeping.LogOrigin + (LogSubtype)(0), // 1: o2.bookkeeping.LogSubtype + (*LogCreationRequest)(nil), // 2: o2.bookkeeping.LogCreationRequest + (*Attachment)(nil), // 3: o2.bookkeeping.Attachment + (*Log)(nil), // 4: o2.bookkeeping.Log + (*MinimalRun)(nil), // 5: o2.bookkeeping.MinimalRun + (*Subsystem)(nil), // 6: o2.bookkeeping.Subsystem + (*Tag)(nil), // 7: o2.bookkeeping.Tag + (*User)(nil), // 8: o2.bookkeeping.User +} +var file_protos_log_proto_depIdxs = []int32{ + 3, // 0: o2.bookkeeping.Log.attachments:type_name -> o2.bookkeeping.Attachment + 8, // 1: o2.bookkeeping.Log.author:type_name -> o2.bookkeeping.User + 0, // 2: o2.bookkeeping.Log.origin:type_name -> o2.bookkeeping.LogOrigin + 5, // 3: o2.bookkeeping.Log.runs:type_name -> o2.bookkeeping.MinimalRun + 6, // 4: o2.bookkeeping.Log.subsystems:type_name -> o2.bookkeeping.Subsystem + 1, // 5: o2.bookkeeping.Log.subtype:type_name -> o2.bookkeeping.LogSubtype + 7, // 6: o2.bookkeeping.Log.tags:type_name -> o2.bookkeeping.Tag + 2, // 7: o2.bookkeeping.LogService.Create:input_type -> o2.bookkeeping.LogCreationRequest + 4, // 8: o2.bookkeeping.LogService.Create:output_type -> o2.bookkeeping.Log + 8, // [8:9] is the sub-list for method output_type + 7, // [7:8] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_protos_log_proto_init() } +func file_protos_log_proto_init() { + if File_protos_log_proto != nil { + return + } + file_protos_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_protos_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_log_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Attachment); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_log_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Log); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_log_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MinimalRun); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_log_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Subsystem); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_log_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Tag); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_log_proto_rawDesc, + NumEnums: 2, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_log_proto_goTypes, + DependencyIndexes: file_protos_log_proto_depIdxs, + EnumInfos: file_protos_log_proto_enumTypes, + MessageInfos: file_protos_log_proto_msgTypes, + }.Build() + File_protos_log_proto = out.File + file_protos_log_proto_rawDesc = nil + file_protos_log_proto_goTypes = nil + file_protos_log_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/log.proto b/core/integration/bookkeeping/protos/log.proto new file mode 100644 index 000000000..414099c65 --- /dev/null +++ b/core/integration/bookkeeping/protos/log.proto @@ -0,0 +1,106 @@ +syntax = 'proto3'; + +import "protos/common.proto"; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +// Services + +service LogService { + rpc Create(LogCreationRequest) returns (Log); +} + +// High level messages + +message LogCreationRequest { + string title = 1; + string text = 2; + repeated int32 runNumbers = 3; + int32 parentLogId = 4; +} + +// Low-level messages and enums + +message Attachment { + // Unix timestamp when this entity was created. + int64 createdAt = 1; + string encoding = 2; + string fileName = 3; + int32 id = 4; + int32 logId = 5; + string mimeType = 6; + string originalName = 7; + string path = 8; + int32 size = 9; + // Unix timestamp when this entity was created. + int64 updatedAt = 10; +} + +message Log { + repeated Attachment attachments = 1; + User author = 2; + // Unix timestamp when this entity was created. + int64 CreatedAt = 3; + int32 id = 4; + repeated LogOrigin origin = 5; + int32 parentLogId = 6; + int32 Replies = 7; + int32 rootLogId = 8; + // Array of minified Run objects. + repeated MinimalRun runs = 9; + repeated Subsystem subsystems = 10; + LogSubtype subtype = 11; + repeated Tag tags = 12; + string text = 14; + string title = 15; + // Unix timestamp when this entity was last updated. + int64 updatedAt = 16; +} + +enum LogOrigin { + LOG_ORIGIN_NULL = 0; + LOG_ORIGIN_HUMAN = 1; + LOG_ORIGIN_PROCESS = 2; +} + +enum LogSubtype { + LOG_SUBTYPE_NULL = 0; + LOG_SUBTYPE_RUN = 1; + LOG_SUBTYPE_SUBSYSTEM = 2; + LOG_SUBTYPE_ANNOUNCEMENT = 3; + LOG_SUBTYPE_INTERVENTION = 4; + LOG_SUBTYPE_COMMENT = 5; +} + +message MinimalRun { + int32 runNumber = 1; + int32 id = 2; +} + +message Subsystem { + // Unix timestamp when this entity was created. + int64 createdAt = 1; + int32 id = 2; + // The label value of the subsystem. + string name = 3; + // Unix timestamp when this entity was last updated. + int64 updatedAt = 5; +} + +message Tag { + // Unix timestamp when this entity was created. + int64 createdAt = 1; + int32 id = 2; + // The label value of the tag. + string text = 3; + // The email for the tag. + string email = 4; + // All the mattermost tags for updates + string mattermost = 5; + // Unix timestamp when this entity was last updated. + int64 updatedAt = 6; + // The last person that edited the email/mattermost fields + string lastEditedName = 7; + +} diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go new file mode 100644 index 000000000..5a8a4201f --- /dev/null +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -0,0 +1,99 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bkpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// LogServiceClient is the client API for LogService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type LogServiceClient interface { + Create(ctx context.Context, in *LogCreationRequest, opts ...grpc.CallOption) (*Log, error) +} + +type logServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient { + return &logServiceClient{cc} +} + +func (c *logServiceClient) Create(ctx context.Context, in *LogCreationRequest, opts ...grpc.CallOption) (*Log, error) { + out := new(Log) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.LogService/Create", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LogServiceServer is the server API for LogService service. +// All implementations should embed UnimplementedLogServiceServer +// for forward compatibility +type LogServiceServer interface { + Create(context.Context, *LogCreationRequest) (*Log, error) +} + +// UnimplementedLogServiceServer should be embedded to have forward compatible implementations. +type UnimplementedLogServiceServer struct { +} + +func (UnimplementedLogServiceServer) Create(context.Context, *LogCreationRequest) (*Log, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} + +// UnsafeLogServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to LogServiceServer will +// result in compilation errors. +type UnsafeLogServiceServer interface { + mustEmbedUnimplementedLogServiceServer() +} + +func RegisterLogServiceServer(s grpc.ServiceRegistrar, srv LogServiceServer) { + s.RegisterService(&LogService_ServiceDesc, srv) +} + +func _LogService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LogCreationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LogServiceServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.LogService/Create", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LogServiceServer).Create(ctx, req.(*LogCreationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// LogService_ServiceDesc is the grpc.ServiceDesc for LogService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var LogService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "o2.bookkeeping.LogService", + HandlerType: (*LogServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Create", + Handler: _LogService_Create_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/log.proto", +} diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go new file mode 100644 index 000000000..3266c8a74 --- /dev/null +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -0,0 +1,497 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.25.0 +// protoc v3.6.1 +// source: protos/run.proto + +package bkpb + +import ( + proto "github.com/golang/protobuf/proto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// This is a compile-time assertion that a sufficiently up-to-date version +// of the legacy proto package is being used. +const _ = proto.ProtoPackageIsVersion4 + +type RunCreationRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + NDetectors int32 `protobuf:"varint,2,opt,name=nDetectors,proto3" json:"nDetectors,omitempty"` + NEpns int32 `protobuf:"varint,3,opt,name=nEpns,proto3" json:"nEpns,omitempty"` + NFlps int32 `protobuf:"varint,4,opt,name=nFlps,proto3" json:"nFlps,omitempty"` + RunNumber int32 `protobuf:"varint,5,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + RunType RunType `protobuf:"varint,6,opt,name=runType,proto3,enum=o2.bookkeeping.RunType" json:"runType,omitempty"` + DdFlp bool `protobuf:"varint,7,opt,name=dd_flp,json=ddFlp,proto3" json:"dd_flp,omitempty"` + Dcs bool `protobuf:"varint,8,opt,name=dcs,proto3" json:"dcs,omitempty"` + Epn bool `protobuf:"varint,9,opt,name=epn,proto3" json:"epn,omitempty"` + EpnTopology string `protobuf:"bytes,10,opt,name=epnTopology,proto3" json:"epnTopology,omitempty"` + OdcTopologyFullName string `protobuf:"bytes,11,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` + Detectors []Detector `protobuf:"varint,12,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` +} + +func (x *RunCreationRequest) Reset() { + *x = RunCreationRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_run_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunCreationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunCreationRequest) ProtoMessage() {} + +func (x *RunCreationRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_run_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunCreationRequest.ProtoReflect.Descriptor instead. +func (*RunCreationRequest) Descriptor() ([]byte, []int) { + return file_protos_run_proto_rawDescGZIP(), []int{0} +} + +func (x *RunCreationRequest) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *RunCreationRequest) GetNDetectors() int32 { + if x != nil { + return x.NDetectors + } + return 0 +} + +func (x *RunCreationRequest) GetNEpns() int32 { + if x != nil { + return x.NEpns + } + return 0 +} + +func (x *RunCreationRequest) GetNFlps() int32 { + if x != nil { + return x.NFlps + } + return 0 +} + +func (x *RunCreationRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *RunCreationRequest) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_RUN_TYPE_NULL +} + +func (x *RunCreationRequest) GetDdFlp() bool { + if x != nil { + return x.DdFlp + } + return false +} + +func (x *RunCreationRequest) GetDcs() bool { + if x != nil { + return x.Dcs + } + return false +} + +func (x *RunCreationRequest) GetEpn() bool { + if x != nil { + return x.Epn + } + return false +} + +func (x *RunCreationRequest) GetEpnTopology() string { + if x != nil { + return x.EpnTopology + } + return "" +} + +func (x *RunCreationRequest) GetOdcTopologyFullName() string { + if x != nil { + return x.OdcTopologyFullName + } + return "" +} + +func (x *RunCreationRequest) GetDetectors() []Detector { + if x != nil { + return x.Detectors + } + return nil +} + +type RunUpdateRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + RunQuality RunQuality `protobuf:"varint,2,opt,name=runQuality,proto3,enum=o2.bookkeeping.RunQuality" json:"runQuality,omitempty"` + TimeO2Start int64 `protobuf:"varint,3,opt,name=timeO2Start,proto3" json:"timeO2Start,omitempty"` + TimeO2End int64 `protobuf:"varint,4,opt,name=timeO2End,proto3" json:"timeO2End,omitempty"` + TimeTrgStart int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3" json:"timeTrgStart,omitempty"` + TimeTrgEnd int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3" json:"timeTrgEnd,omitempty"` + TriggerValue string `protobuf:"bytes,7,opt,name=triggerValue,proto3" json:"triggerValue,omitempty"` + PdpConfigOption string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3" json:"pdpConfigOption,omitempty"` + PdpTopologyDescriptionLibraryFile string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3" json:"pdpTopologyDescriptionLibraryFile,omitempty"` + TfbDdMode string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3" json:"tfbDdMode,omitempty"` + LhcPeriod string `protobuf:"bytes,11,opt,name=lhcPeriod,proto3" json:"lhcPeriod,omitempty"` + OdcTopologyFullName string `protobuf:"bytes,12,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` + PdpWorkflowParameters string `protobuf:"bytes,13,opt,name=pdpWorkflowParameters,proto3" json:"pdpWorkflowParameters,omitempty"` + PdpBeamType string `protobuf:"bytes,14,opt,name=pdpBeamType,proto3" json:"pdpBeamType,omitempty"` + ReadoutCfgUri string `protobuf:"bytes,15,opt,name=readoutCfgUri,proto3" json:"readoutCfgUri,omitempty"` +} + +func (x *RunUpdateRequest) Reset() { + *x = RunUpdateRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_run_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunUpdateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunUpdateRequest) ProtoMessage() {} + +func (x *RunUpdateRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_run_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunUpdateRequest.ProtoReflect.Descriptor instead. +func (*RunUpdateRequest) Descriptor() ([]byte, []int) { + return file_protos_run_proto_rawDescGZIP(), []int{1} +} + +func (x *RunUpdateRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *RunUpdateRequest) GetRunQuality() RunQuality { + if x != nil { + return x.RunQuality + } + return RunQuality_RUN_QUALITY_NULL +} + +func (x *RunUpdateRequest) GetTimeO2Start() int64 { + if x != nil { + return x.TimeO2Start + } + return 0 +} + +func (x *RunUpdateRequest) GetTimeO2End() int64 { + if x != nil { + return x.TimeO2End + } + return 0 +} + +func (x *RunUpdateRequest) GetTimeTrgStart() int64 { + if x != nil { + return x.TimeTrgStart + } + return 0 +} + +func (x *RunUpdateRequest) GetTimeTrgEnd() int64 { + if x != nil { + return x.TimeTrgEnd + } + return 0 +} + +func (x *RunUpdateRequest) GetTriggerValue() string { + if x != nil { + return x.TriggerValue + } + return "" +} + +func (x *RunUpdateRequest) GetPdpConfigOption() string { + if x != nil { + return x.PdpConfigOption + } + return "" +} + +func (x *RunUpdateRequest) GetPdpTopologyDescriptionLibraryFile() string { + if x != nil { + return x.PdpTopologyDescriptionLibraryFile + } + return "" +} + +func (x *RunUpdateRequest) GetTfbDdMode() string { + if x != nil { + return x.TfbDdMode + } + return "" +} + +func (x *RunUpdateRequest) GetLhcPeriod() string { + if x != nil { + return x.LhcPeriod + } + return "" +} + +func (x *RunUpdateRequest) GetOdcTopologyFullName() string { + if x != nil { + return x.OdcTopologyFullName + } + return "" +} + +func (x *RunUpdateRequest) GetPdpWorkflowParameters() string { + if x != nil { + return x.PdpWorkflowParameters + } + return "" +} + +func (x *RunUpdateRequest) GetPdpBeamType() string { + if x != nil { + return x.PdpBeamType + } + return "" +} + +func (x *RunUpdateRequest) GetReadoutCfgUri() string { + if x != nil { + return x.ReadoutCfgUri + } + return "" +} + +var File_protos_run_proto protoreflect.FileDescriptor + +var file_protos_run_proto_rawDesc = []byte{ + 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, + 0x6c, 0x70, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, + 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x64, 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, + 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x30, + 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xf8, 0x04, 0x0a, 0x10, 0x52, 0x75, 0x6e, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x0a, 0x72, + 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x72, 0x75, 0x6e, + 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, + 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, + 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, + 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x21, 0x70, 0x64, 0x70, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, + 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, + 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, + 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, + 0x55, 0x72, 0x69, 0x32, 0x90, 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_run_proto_rawDescOnce sync.Once + file_protos_run_proto_rawDescData = file_protos_run_proto_rawDesc +) + +func file_protos_run_proto_rawDescGZIP() []byte { + file_protos_run_proto_rawDescOnce.Do(func() { + file_protos_run_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_run_proto_rawDescData) + }) + return file_protos_run_proto_rawDescData +} + +var file_protos_run_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_run_proto_goTypes = []interface{}{ + (*RunCreationRequest)(nil), // 0: o2.bookkeeping.RunCreationRequest + (*RunUpdateRequest)(nil), // 1: o2.bookkeeping.RunUpdateRequest + (RunType)(0), // 2: o2.bookkeeping.RunType + (Detector)(0), // 3: o2.bookkeeping.Detector + (RunQuality)(0), // 4: o2.bookkeeping.RunQuality + (*Run)(nil), // 5: o2.bookkeeping.Run +} +var file_protos_run_proto_depIdxs = []int32{ + 2, // 0: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType + 3, // 1: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector + 4, // 2: o2.bookkeeping.RunUpdateRequest.runQuality:type_name -> o2.bookkeeping.RunQuality + 0, // 3: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest + 1, // 4: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest + 5, // 5: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run + 5, // 6: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run + 5, // [5:7] is the sub-list for method output_type + 3, // [3:5] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_protos_run_proto_init() } +func file_protos_run_proto_init() { + if File_protos_run_proto != nil { + return + } + file_protos_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_protos_run_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_run_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunUpdateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_run_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_run_proto_goTypes, + DependencyIndexes: file_protos_run_proto_depIdxs, + MessageInfos: file_protos_run_proto_msgTypes, + }.Build() + File_protos_run_proto = out.File + file_protos_run_proto_rawDesc = nil + file_protos_run_proto_goTypes = nil + file_protos_run_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/run.proto b/core/integration/bookkeeping/protos/run.proto new file mode 100644 index 000000000..c0b815db0 --- /dev/null +++ b/core/integration/bookkeeping/protos/run.proto @@ -0,0 +1,48 @@ +syntax = 'proto3'; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +import "protos/common.proto"; + +// Services + +service RunService { + rpc Create(RunCreationRequest) returns (Run); + rpc Update(RunUpdateRequest) returns (Run); +} + +// High level messages + +message RunCreationRequest { + string environmentId = 1; + int32 nDetectors = 2; + int32 nEpns = 3; + int32 nFlps = 4; + int32 runNumber = 5; + RunType runType = 6; + bool dd_flp = 7; + bool dcs = 8; + bool epn = 9; + string epnTopology = 10; + string odcTopologyFullName = 11; + repeated Detector detectors = 12; +} + +message RunUpdateRequest { + int32 runNumber = 1; + RunQuality runQuality = 2; + int64 timeO2Start = 3; + int64 timeO2End = 4; + int64 timeTrgStart = 5; + int64 timeTrgEnd = 6; + string triggerValue = 7; + string pdpConfigOption = 8; + string pdpTopologyDescriptionLibraryFile = 9; + string tfbDdMode = 10; + string lhcPeriod = 11; + string odcTopologyFullName = 12; + string pdpWorkflowParameters = 13; + string pdpBeamType = 14; + string readoutCfgUri = 15; +} diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go new file mode 100644 index 000000000..845d50d4a --- /dev/null +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -0,0 +1,135 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bkpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// RunServiceClient is the client API for RunService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RunServiceClient interface { + Create(ctx context.Context, in *RunCreationRequest, opts ...grpc.CallOption) (*Run, error) + Update(ctx context.Context, in *RunUpdateRequest, opts ...grpc.CallOption) (*Run, error) +} + +type runServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewRunServiceClient(cc grpc.ClientConnInterface) RunServiceClient { + return &runServiceClient{cc} +} + +func (c *runServiceClient) Create(ctx context.Context, in *RunCreationRequest, opts ...grpc.CallOption) (*Run, error) { + out := new(Run) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Create", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *runServiceClient) Update(ctx context.Context, in *RunUpdateRequest, opts ...grpc.CallOption) (*Run, error) { + out := new(Run) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Update", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RunServiceServer is the server API for RunService service. +// All implementations should embed UnimplementedRunServiceServer +// for forward compatibility +type RunServiceServer interface { + Create(context.Context, *RunCreationRequest) (*Run, error) + Update(context.Context, *RunUpdateRequest) (*Run, error) +} + +// UnimplementedRunServiceServer should be embedded to have forward compatible implementations. +type UnimplementedRunServiceServer struct { +} + +func (UnimplementedRunServiceServer) Create(context.Context, *RunCreationRequest) (*Run, error) { + return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") +} +func (UnimplementedRunServiceServer) Update(context.Context, *RunUpdateRequest) (*Run, error) { + return nil, status.Errorf(codes.Unimplemented, "method Update not implemented") +} + +// UnsafeRunServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RunServiceServer will +// result in compilation errors. +type UnsafeRunServiceServer interface { + mustEmbedUnimplementedRunServiceServer() +} + +func RegisterRunServiceServer(s grpc.ServiceRegistrar, srv RunServiceServer) { + s.RegisterService(&RunService_ServiceDesc, srv) +} + +func _RunService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunCreationRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RunServiceServer).Create(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.RunService/Create", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RunServiceServer).Create(ctx, req.(*RunCreationRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _RunService_Update_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunUpdateRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RunServiceServer).Update(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.RunService/Update", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RunServiceServer).Update(ctx, req.(*RunUpdateRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// RunService_ServiceDesc is the grpc.ServiceDesc for RunService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RunService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "o2.bookkeeping.RunService", + HandlerType: (*RunServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Create", + Handler: _RunService_Create_Handler, + }, + { + MethodName: "Update", + Handler: _RunService_Update_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/run.proto", +} diff --git a/core/integration/bookkeepinggRPC/plugingRPC.go b/core/integration/bookkeepinggRPC/plugingRPC.go deleted file mode 100644 index f6f5fa1f7..000000000 --- a/core/integration/bookkeepinggRPC/plugingRPC.go +++ /dev/null @@ -1,836 +0,0 @@ -/* -* === This file is part of ALICE O² === -* -* Copyright 2021 CERN and copyright holders of ALICE O². -* Author: Claire Guyot -* -* This program is free software: you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation, either version 3 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program. If not, see . -* -* In applying this license CERN does not waive the privileges and -* immunities granted to it by virtue of its status as an -* Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package bookkeepinggRPC - -import ( - "context" - "encoding/json" - "errors" - "fmt" - sw "github.com/AliceO2Group/Bookkeeping/go-api-client/src/go-client-generated" - bkpb "github.com/AliceO2Group/Control/core/integration/bookkeepinggRPC/protos" - "google.golang.org/grpc" - "net/url" - "strconv" - "strings" - "time" - - "github.com/AliceO2Group/Control/common/logger/infologger" - "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/environment" - "github.com/AliceO2Group/Control/core/integration" - "github.com/AliceO2Group/Control/core/workflow/callable" - "github.com/spf13/viper" -) - -const ( - BKP_SOR_TIMEOUT = 30 * time.Second - BKP_EOR_TIMEOUT = 30 * time.Second - BKP_DEFAULT_POLLING_TIMEOUT = 30 * time.Second -) - -type Plugin struct { - bookkeepingHost string - bookkeepingPort int - - bookkeepingClient *RpcClient - - pendingRunStops map[string] /*envId*/ int64 - pendingO2Stops map[string] /*envId*/ string - pendingTrgStops map[string] /*envId*/ string -} - -func NewPlugin(endpoint string) integration.Plugin { - u, err := url.Parse(endpoint) - if err != nil { - log.WithField("endpoint", endpoint). - WithError(err). - Error("bad service endpoint") - return nil - } - - portNumber, _ := strconv.Atoi(u.Port()) - - return &Plugin{ - bookkeepingHost: u.Hostname(), - bookkeepingPort: portNumber, - bookkeepingClient: nil, - pendingRunStops: make(map[string]int64), - pendingO2Stops: make(map[string]string), - pendingTrgStops: make(map[string]string), - } -} - -func (p *Plugin) GetName() string { - return "bookkeeping" -} - -func (p *Plugin) GetPrettyName() string { - return "Bookkeeping" -} - -func (p *Plugin) GetEndpoint() string { - return viper.GetString("bookkeepingBaseUri") -} - -func (p *Plugin) GetConnectionState() string { - return "READY" -} - -func (p *Plugin) GetData(environmentIds []uid.ID) string { - if p == nil || p.bookkeepingClient == nil { - return "" - } - - partitionStates := make(map[string]string) - - out, err := json.Marshal(partitionStates) - if err != nil { - return "" - } - return string(out[:]) -} - -func (p *Plugin) Init(instanceId string) error { - if p.bookkeepingClient == nil { - cxt, cancel := context.WithCancel(context.Background()) - p.bookkeepingClient = NewClient(cxt, cancel, p.GetEndpoint()) - if p.bookkeepingClient == nil { - return fmt.Errorf("failed to connect to Bookkeeping service on %s", p.GetEndpoint()) - } - log.Debug("DD scheduler plugin initialized") - } - return nil -} - -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { - stack = make(map[string]interface{}) - return stack -} - -func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { - call, ok := data.(*callable.Call) - if !ok { - return - } - varStack := call.VarStack - envId, ok := varStack["environment_id"] - if !ok { - err := errors.New("cannot acquire environment ID") - log.Error(err) - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" - return - } - trigger, ok := varStack["__call_trigger"] - if !ok { - err := errors.New("cannot acquire trigger from varStack") - log.WithField("call", call). - WithField("partition", envId). - Error(err) - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" - return - } - var err error - parsedEnvId, err := uid.FromString(envId) - if err != nil { - if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { - log.WithField("partition", envId). - Debug("cannot parse environment ID when DESTROY or GO_ERROR transition") - return - } - log.WithError(err). - WithField("partition", envId). - Error("cannot parse environment ID") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" - return - } - envMan := environment.ManagerInstance() - env, err := envMan.Environment(parsedEnvId) - if err != nil { - if strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR") { - log.WithField("partition", envId). - Debug("cannot acquire environment from parsed environment ID when DESTROY or GO_ERROR transition") - return - } - log.WithError(err). - WithField("partition", envId). - Error("cannot acquire environment from parsed environment ID") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" - return - } - - stack = make(map[string]interface{}) - // Run related Bookkeeping functions - stack["StartOfRun"] = func() (out string) { - callFailedStr := "Bookkeeping StartOfRun call failed" - - rn := varStack["run_number"] - var runNumber64 int64 - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for Bookkeeping SOR") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, StartOfRun impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Error("Bookkeeping SOR error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - runNumber := env.GetCurrentRunNumber() - - rnString := strconv.FormatUint(uint64(runNumber), 10) - - flps := env.GetFLPs() - epns, err := strconv.ParseInt(env.GetKV("", "odc_n_epns"), 10, 0) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Warning("cannot parse number of EPNs") - } - ddEnabled, err := strconv.ParseBool(env.GetKV("", "dd_enabled")) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Warning("cannot parse DD enabled") - } - dcsEnabled, err := strconv.ParseBool(env.GetKV("", "dcs_enabled")) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Warning("cannot parse DCS enabled") - } - epnEnabled, err := strconv.ParseBool(env.GetKV("", "epn_enabled")) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). - Warning("cannot parse EPN enabled") - } - odcTopology := env.GetKV("", "odc_topology") - odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire ODC topology fullname") - } - detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") - - inRun := bkpb.CreateRunRequest{ - RunInfo: &bkpb.RunInfo{ - RunNumber: int32(runNumber64), - EnvironmentId: env.Id().String(), - }, - NumberOfDetectors: int32(len(env.GetActiveDetectors())), - NumberOfEpns: int32(epns), - NumberOfFlps: int32(len(flps)), - RunType: env.GetRunType().String(), - DdFlp: ddEnabled, - Dcs: dcsEnabled, - Epn: epnEnabled, - EpnTopology: odcTopology, - OdcTopologyFullname: odcTopologyFullname, - Detectors: detectors, - } - - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.CreateRun(ctx, &inRun, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "CreateRun"). - Error("Bookkeeping API CreateRun error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - p.pendingRunStops[envId] = runNumber64 - p.pendingO2Stops[envId] = "" - p.pendingTrgStops[envId] = "" - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("CreateRun call successful") - } - - var inFlp bkpb.CreateFlpRequest - - for _, flp := range flps { - inFlp = bkpb.CreateFlpRequest{ - RunInfo: &bkpb.RunInfo{ - RunNumber: int32(runNumber64), - EnvironmentId: env.Id().String(), - }, - Name: flp, - Hostname: flp, - } - - timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateFlp", envId) - ctx, cancel = context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err := p.bookkeepingClient.CreateFlp(ctx, &inFlp, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("flp", flp). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "CreateFlp"). - Error("Bookkeeping API CreateFlp error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } - } - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("CreateFlp call done") - - inLog := bkpb.CreateLogRequest{ - RunInfo: &bkpb.RunInfo{ - RunNumber: int32(runNumber64), - EnvironmentId: env.Id().String(), - }, - Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), - Content: env.GetVarsAsString(), - ParentLogId: -1, - } - - timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateLog", envId) - ctx, cancel = context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.CreateLog(ctx, &inLog, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "CreateLog"). - Error("Bookkeeping API CreateLog error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("CreateLog call successful") - } - return - } - updateRunFunc := func(runNumber64 int64, state string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string) (out string) { - callFailedStr := "Bookkeeping UpdateRun call failed" - trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot parse TRG global run enabled") - } - trgEnabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot parse TRG enabled") - } - var trg = "" - if trgEnabled == false { - trg = "OFF" - } else { - if trgGlobalRunEnabled == false { - trg = "LTU" - } else { - trg = "CTP" - } - } - pdpConfig, ok := varStack["pdp_config_option"] - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire PDP workflow configuration mode") - } - pdpTopology, ok := varStack["pdp_topology_description_library_file"] - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire PDP topology description library file") - } - pdpParameters, ok := varStack["pdp_workflow_parameters"] - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire PDP workflow parameters") - } - pdpBeam, ok := varStack["pdp_beam_type"] - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire PDP beam type") - } - tfbMode := env.GetKV("", "tfb_dd_mode") - odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") - if !ok { - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Warning("cannot acquire ODC topology fullname") - } - lhcPeriod := env.GetKV("", "lhc_period") - readoutUri, ok := varStack["readout_cfg_uri"] - - var runquality sw.RunQuality - switch state { - case string(sw.GOOD_RunQuality): - runquality = sw.GOOD_RunQuality - case string(sw.BAD_RunQuality): - runquality = sw.BAD_RunQuality - default: - runquality = sw.TEST_RunQuality - } - - timeO2S, err := strconv.ParseInt(timeO2Start, 10, 64) - if err != nil { - log.WithField("runNumber", runNumber64). - WithField("time", timeO2Start). - Warning("cannot parse O2 start time") - timeO2S = -1 - } - if timeO2Start == "" || timeO2S <= 0 { - timeO2S = -1 - } - var timeO2E int64 = -1 - if timeO2End != "" { - timeO2E, err = strconv.ParseInt(timeO2End, 10, 64) - if err != nil { - log.WithField("runNumber", runNumber64). - WithField("time", timeO2End). - Warning("cannot parse O2 end time") - timeO2E = -1 - } - } - if timeO2End == "" || timeO2E <= 0 { - timeO2E = -1 - } - var timeTrgS int64 = -1 - var timeTrgE int64 = -1 - if trg == "LTU" || trg == "CTP" { - timeTrgS, err = strconv.ParseInt(timeTrgStart, 10, 64) - if err != nil { - log.WithField("runNumber", runNumber64). - WithField("time", timeTrgStart). - Warning("cannot parse Trg start time") - timeTrgS = -1 - } - if timeTrgStart == "" || timeTrgS <= 0 { - timeTrgS = -1 - } - timeTrgE, err = strconv.ParseInt(timeTrgEnd, 10, 64) - if err != nil { - log.WithField("runNumber", runNumber64). - WithField("time", timeTrgEnd). - Warning("cannot parse Trg end time") - timeTrgE = -1 - } - if timeTrgEnd == "" || timeTrgE <= 0 { - timeTrgE = -1 - } - } - - inRun := bkpb.UpdateRunRequest{ - RunInfo: &bkpb.RunInfo{ - RunNumber: int32(runNumber64), - EnvironmentId: env.Id().String(), - }, - RunQuality: string(runquality), - Time_O2Start: timeO2S, - Time_O2End: timeO2E, - Time_TRGStart: timeTrgS, - Time_TRGEnd: timeTrgE, - Trigger: trigger, - PdpConfig: pdpConfig, - PdpTopology: pdpTopology, - TfbMode: tfbMode, - LhcPeriod: lhcPeriod, - OdcTopologyFullname: odcTopologyFullname, - PdpParameters: pdpParameters, - PdpBeam: pdpBeam, - ReadoutUri: readoutUri, - } - - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.UpdateRun(ctx, &inRun, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRun"). - Error("Bookkeeping API UpdateRun error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - var updatedRun string - if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { - if p.pendingO2Stops[envId] == "" || (trgEnabled && p.pendingTrgStops[envId] == "") { - updatedRun = "INCOMPLETE" - log.WithField("runNumber", runNumber64). - WithField("partition", envId). - Debug("UpdateRun call: run information incomplete") - } else { - updatedRun = "STOPPED" - delete(p.pendingRunStops, envId) - delete(p.pendingO2Stops, envId) - delete(p.pendingTrgStops, envId) - } - } else { - updatedRun = "STARTED" - } - log.WithField("runNumber", runNumber64). - WithField("updated to", updatedRun). - WithField("partition", envId). - Debug("UpdateRun call successful") - } - return - } - stack["UpdateRunStart"] = func() (out string) { - callFailedStr := "Bookkeeping UpdateRunStart call failed" - - rn := varStack["run_number"] - runNumber64, err := strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for Bookkeeping UpdateRunStart") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStart impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRunStart"). - Error("Bookkeeping UpdateRunStart error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - O2StartTime := varStack["run_start_time_ms"] - TrgStartTime := varStack["trg_start_time_ms"] - - return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") - } - stack["UpdateRunStop"] = func() (out string) { - callFailedStr := "Bookkeeping UpdateRunStop call failed" - - rn := varStack["run_number"] - runNumber64, err := strconv.ParseInt(rn, 10, 32) - if (strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR")) && (rn == "" || runNumber64 == 0) { - log.WithField("partition", envId). - Debug("cannot update run on stop, no run for the environment") - return - } - if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for Bookkeeping UpdateRunStop") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateRunStop impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). - WithField("partition", envId). - WithField("call", "UpdateRunStop"). - Error("Bookkeeping UpdateRunStop error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - O2StartTime := varStack["run_start_time_ms"] - O2EndTime := varStack["run_end_time_ms"] - p.pendingO2Stops[envId] = O2EndTime - - TrgStartTime := varStack["trg_start_time_ms"] - TrgEndTime := varStack["trg_end_time_ms"] - p.pendingTrgStops[envId] = TrgEndTime - - if _, ok := p.pendingRunStops[envId]; ok { - return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) - } else { - log.WithField("partition", envId). - Warning("skipping UpdateRun call, no pending run number found") - return - } - } - // Environment related Bookkeeping functions - stack["CreateEnv"] = func() (out string) { - callFailedStr := "Bookkeeping CreateEnv call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, CreateEnv impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "CreateEnv"). - Error("Bookkeeping CreateEnv error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - var statusMessage = "" - envState := env.CurrentState() - if envState == "STANDBY" || envState == "DEPLOYED" { - statusMessage = "success: the environment is in " + envState + " state after creation" - } else { - statusMessage = "error: the environment is in " + envState + " state after creation" - } - - inEnv := bkpb.CreateEnvRequest{ - EnvironmentInfo: &bkpb.EnvironmentInfo{ - EnvironmentId: env.Id().String(), - }, - CreatedAt: time.Now().UnixMilli(), - Status: envState, - StatusMessage: statusMessage, - } - - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.CreateEnvironment(ctx, &inEnv, grpc.EmptyCallOption{}) - - if err != nil { - log.WithError(err). - WithField("partition", envId). - WithField("call", "CreateEnvironment"). - Error("Bookkeeping API CreateEnvironment error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - log.WithField("partition", envId). - Debug("CreateEnvironment call successful") - } - return - } - updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { - callFailedStr := "Bookkeeping UpdateEnv call failed" - - inEnv := bkpb.UpdateEnvRequest{ - EnvironmentInfo: &bkpb.EnvironmentInfo{ - EnvironmentId: env.Id().String(), - }, - ToredownAt: toredownAt.UnixMilli(), - Status: status, - StatusMessage: statusMessage, - } - - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.UpdateEnvironment(ctx, &inEnv, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("partition", envId). - WithField("call", "UpdateEnvironment"). - Error("Bookkeeping API UpdateEnvironment error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - log.WithField("partition", envId). - WithField("state", status). - Debug("UpdateEnvironment call successful") - } - return - } - stack["UpdateEnv"] = func() (out string) { - callFailedStr := "Bookkeeping UpdateEnv call failed" - - if p.bookkeepingClient == nil { - err = fmt.Errorf("Bookkeeping plugin not initialized, UpdateEnv impossible") - - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("partition", envId). - WithField("call", "UpdateEnv"). - Error("Bookkeeping UpdateEnv error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - - return - } - - envState := env.CurrentState() - - if strings.Contains(trigger, "DESTROY") { - envState = "DESTROYED" - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "the environment is DESTROYED after DESTROY transition") - } - if strings.Contains(trigger, "DEPLOY") { - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") - } - } - if strings.Contains(trigger, "CONFIGURE") { - if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") - } - } - if strings.Contains(trigger, "RESET") { - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") - } - } - if strings.Contains(trigger, "START_ACTIVITY") { - if envState == "RUNNING" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") - } - } - if strings.Contains(trigger, "STOP_ACTIVITY") { - if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") - } - } - if strings.Contains(trigger, "EXIT") { - if envState == "DONE" { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") - } else { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") - } - } - if strings.Contains(trigger, "GO_ERROR") { - if envState == "ERROR" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") - } - } - if strings.Contains(trigger, "RECOVER") { - if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") - } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") - } - } - log.WithField("partition", envId). - WithField("call", call). - Error("could not obtain transition in UpdateEnv from trigger: ", trigger) - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } - - return -} - -func (p *Plugin) Destroy() error { - return nil -} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go b/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go deleted file mode 100644 index 17d74f2b4..000000000 --- a/core/integration/bookkeepinggRPC/protos/bookkeeping.pb.go +++ /dev/null @@ -1,1441 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 -// source: protos/bookkeeping.proto - -package bookkeeping - -import ( - proto "github.com/golang/protobuf/proto" - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - -type RunInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunNumber int32 `protobuf:"varint,1,opt,name=run_number,json=runNumber,proto3" json:"run_number,omitempty"` - EnvironmentId string `protobuf:"bytes,2,opt,name=environment_id,json=environmentId,proto3" json:"environment_id,omitempty"` -} - -func (x *RunInfo) Reset() { - *x = RunInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RunInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RunInfo) ProtoMessage() {} - -func (x *RunInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RunInfo.ProtoReflect.Descriptor instead. -func (*RunInfo) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{0} -} - -func (x *RunInfo) GetRunNumber() int32 { - if x != nil { - return x.RunNumber - } - return 0 -} - -func (x *RunInfo) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" -} - -type RunResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` -} - -func (x *RunResponse) Reset() { - *x = RunResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *RunResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*RunResponse) ProtoMessage() {} - -func (x *RunResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use RunResponse.ProtoReflect.Descriptor instead. -func (*RunResponse) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{1} -} - -func (x *RunResponse) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *RunResponse) GetInfoMessages() string { - if x != nil { - return x.InfoMessages - } - return "" -} - -type CreateRunRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - NumberOfDetectors int32 `protobuf:"varint,2,opt,name=number_of_detectors,json=numberOfDetectors,proto3" json:"number_of_detectors,omitempty"` - NumberOfEpns int32 `protobuf:"varint,3,opt,name=number_of_epns,json=numberOfEpns,proto3" json:"number_of_epns,omitempty"` - NumberOfFlps int32 `protobuf:"varint,4,opt,name=number_of_flps,json=numberOfFlps,proto3" json:"number_of_flps,omitempty"` - RunType string `protobuf:"bytes,5,opt,name=run_type,json=runType,proto3" json:"run_type,omitempty"` - DdFlp bool `protobuf:"varint,6,opt,name=dd_flp,json=ddFlp,proto3" json:"dd_flp,omitempty"` - Dcs bool `protobuf:"varint,7,opt,name=dcs,proto3" json:"dcs,omitempty"` - Epn bool `protobuf:"varint,8,opt,name=epn,proto3" json:"epn,omitempty"` - EpnTopology string `protobuf:"bytes,9,opt,name=epn_topology,json=epnTopology,proto3" json:"epn_topology,omitempty"` - OdcTopologyFullname string `protobuf:"bytes,10,opt,name=odc_topology_fullname,json=odcTopologyFullname,proto3" json:"odc_topology_fullname,omitempty"` - Detectors string `protobuf:"bytes,11,opt,name=detectors,proto3" json:"detectors,omitempty"` -} - -func (x *CreateRunRequest) Reset() { - *x = CreateRunRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateRunRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateRunRequest) ProtoMessage() {} - -func (x *CreateRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateRunRequest.ProtoReflect.Descriptor instead. -func (*CreateRunRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{2} -} - -func (x *CreateRunRequest) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *CreateRunRequest) GetNumberOfDetectors() int32 { - if x != nil { - return x.NumberOfDetectors - } - return 0 -} - -func (x *CreateRunRequest) GetNumberOfEpns() int32 { - if x != nil { - return x.NumberOfEpns - } - return 0 -} - -func (x *CreateRunRequest) GetNumberOfFlps() int32 { - if x != nil { - return x.NumberOfFlps - } - return 0 -} - -func (x *CreateRunRequest) GetRunType() string { - if x != nil { - return x.RunType - } - return "" -} - -func (x *CreateRunRequest) GetDdFlp() bool { - if x != nil { - return x.DdFlp - } - return false -} - -func (x *CreateRunRequest) GetDcs() bool { - if x != nil { - return x.Dcs - } - return false -} - -func (x *CreateRunRequest) GetEpn() bool { - if x != nil { - return x.Epn - } - return false -} - -func (x *CreateRunRequest) GetEpnTopology() string { - if x != nil { - return x.EpnTopology - } - return "" -} - -func (x *CreateRunRequest) GetOdcTopologyFullname() string { - if x != nil { - return x.OdcTopologyFullname - } - return "" -} - -func (x *CreateRunRequest) GetDetectors() string { - if x != nil { - return x.Detectors - } - return "" -} - -type UpdateRunRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - RunQuality string `protobuf:"bytes,2,opt,name=run_quality,json=runQuality,proto3" json:"run_quality,omitempty"` - Time_O2Start int64 `protobuf:"varint,3,opt,name=time_O2_start,json=timeO2Start,proto3" json:"time_O2_start,omitempty"` - Time_O2End int64 `protobuf:"varint,4,opt,name=time_O2_end,json=timeO2End,proto3" json:"time_O2_end,omitempty"` - Time_TRGStart int64 `protobuf:"varint,5,opt,name=time_TRG_start,json=timeTRGStart,proto3" json:"time_TRG_start,omitempty"` - Time_TRGEnd int64 `protobuf:"varint,6,opt,name=time_TRG_end,json=timeTRGEnd,proto3" json:"time_TRG_end,omitempty"` - Trigger string `protobuf:"bytes,7,opt,name=trigger,proto3" json:"trigger,omitempty"` - PdpConfig string `protobuf:"bytes,8,opt,name=pdp_config,json=pdpConfig,proto3" json:"pdp_config,omitempty"` - PdpTopology string `protobuf:"bytes,9,opt,name=pdp_topology,json=pdpTopology,proto3" json:"pdp_topology,omitempty"` - TfbMode string `protobuf:"bytes,10,opt,name=tfb_mode,json=tfbMode,proto3" json:"tfb_mode,omitempty"` - LhcPeriod string `protobuf:"bytes,11,opt,name=lhc_period,json=lhcPeriod,proto3" json:"lhc_period,omitempty"` - OdcTopologyFullname string `protobuf:"bytes,12,opt,name=odc_topology_fullname,json=odcTopologyFullname,proto3" json:"odc_topology_fullname,omitempty"` - PdpParameters string `protobuf:"bytes,13,opt,name=pdp_parameters,json=pdpParameters,proto3" json:"pdp_parameters,omitempty"` - PdpBeam string `protobuf:"bytes,14,opt,name=pdp_beam,json=pdpBeam,proto3" json:"pdp_beam,omitempty"` - ReadoutUri string `protobuf:"bytes,15,opt,name=readout_uri,json=readoutUri,proto3" json:"readout_uri,omitempty"` -} - -func (x *UpdateRunRequest) Reset() { - *x = UpdateRunRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateRunRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateRunRequest) ProtoMessage() {} - -func (x *UpdateRunRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateRunRequest.ProtoReflect.Descriptor instead. -func (*UpdateRunRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{3} -} - -func (x *UpdateRunRequest) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *UpdateRunRequest) GetRunQuality() string { - if x != nil { - return x.RunQuality - } - return "" -} - -func (x *UpdateRunRequest) GetTime_O2Start() int64 { - if x != nil { - return x.Time_O2Start - } - return 0 -} - -func (x *UpdateRunRequest) GetTime_O2End() int64 { - if x != nil { - return x.Time_O2End - } - return 0 -} - -func (x *UpdateRunRequest) GetTime_TRGStart() int64 { - if x != nil { - return x.Time_TRGStart - } - return 0 -} - -func (x *UpdateRunRequest) GetTime_TRGEnd() int64 { - if x != nil { - return x.Time_TRGEnd - } - return 0 -} - -func (x *UpdateRunRequest) GetTrigger() string { - if x != nil { - return x.Trigger - } - return "" -} - -func (x *UpdateRunRequest) GetPdpConfig() string { - if x != nil { - return x.PdpConfig - } - return "" -} - -func (x *UpdateRunRequest) GetPdpTopology() string { - if x != nil { - return x.PdpTopology - } - return "" -} - -func (x *UpdateRunRequest) GetTfbMode() string { - if x != nil { - return x.TfbMode - } - return "" -} - -func (x *UpdateRunRequest) GetLhcPeriod() string { - if x != nil { - return x.LhcPeriod - } - return "" -} - -func (x *UpdateRunRequest) GetOdcTopologyFullname() string { - if x != nil { - return x.OdcTopologyFullname - } - return "" -} - -func (x *UpdateRunRequest) GetPdpParameters() string { - if x != nil { - return x.PdpParameters - } - return "" -} - -func (x *UpdateRunRequest) GetPdpBeam() string { - if x != nil { - return x.PdpBeam - } - return "" -} - -func (x *UpdateRunRequest) GetReadoutUri() string { - if x != nil { - return x.ReadoutUri - } - return "" -} - -type LogResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` -} - -func (x *LogResponse) Reset() { - *x = LogResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LogResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LogResponse) ProtoMessage() {} - -func (x *LogResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LogResponse.ProtoReflect.Descriptor instead. -func (*LogResponse) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{4} -} - -func (x *LogResponse) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *LogResponse) GetInfoMessages() string { - if x != nil { - return x.InfoMessages - } - return "" -} - -type CreateLogRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` - Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"` - ParentLogId int32 `protobuf:"varint,4,opt,name=parent_log_id,json=parentLogId,proto3" json:"parent_log_id,omitempty"` -} - -func (x *CreateLogRequest) Reset() { - *x = CreateLogRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateLogRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateLogRequest) ProtoMessage() {} - -func (x *CreateLogRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateLogRequest.ProtoReflect.Descriptor instead. -func (*CreateLogRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{5} -} - -func (x *CreateLogRequest) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *CreateLogRequest) GetTitle() string { - if x != nil { - return x.Title - } - return "" -} - -func (x *CreateLogRequest) GetContent() string { - if x != nil { - return x.Content - } - return "" -} - -func (x *CreateLogRequest) GetParentLogId() int32 { - if x != nil { - return x.ParentLogId - } - return 0 -} - -type FlpResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` -} - -func (x *FlpResponse) Reset() { - *x = FlpResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FlpResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FlpResponse) ProtoMessage() {} - -func (x *FlpResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FlpResponse.ProtoReflect.Descriptor instead. -func (*FlpResponse) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{6} -} - -func (x *FlpResponse) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *FlpResponse) GetInfoMessages() string { - if x != nil { - return x.InfoMessages - } - return "" -} - -type CreateFlpRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Hostname string `protobuf:"bytes,3,opt,name=hostname,proto3" json:"hostname,omitempty"` -} - -func (x *CreateFlpRequest) Reset() { - *x = CreateFlpRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateFlpRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateFlpRequest) ProtoMessage() {} - -func (x *CreateFlpRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateFlpRequest.ProtoReflect.Descriptor instead. -func (*CreateFlpRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{7} -} - -func (x *CreateFlpRequest) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *CreateFlpRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *CreateFlpRequest) GetHostname() string { - if x != nil { - return x.Hostname - } - return "" -} - -type UpdateFlpRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunInfo *RunInfo `protobuf:"bytes,1,opt,name=run_info,json=runInfo,proto3" json:"run_info,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - NumberOfSubtimeframes int32 `protobuf:"varint,3,opt,name=number_of_subtimeframes,json=numberOfSubtimeframes,proto3" json:"number_of_subtimeframes,omitempty"` - NumberOfEquipmentBytes int32 `protobuf:"varint,4,opt,name=number_of_equipment_bytes,json=numberOfEquipmentBytes,proto3" json:"number_of_equipment_bytes,omitempty"` - NumberOfRecordingBytes int32 `protobuf:"varint,5,opt,name=number_of_recording_bytes,json=numberOfRecordingBytes,proto3" json:"number_of_recording_bytes,omitempty"` - NumberOfFairMQBytes int32 `protobuf:"varint,6,opt,name=number_of_fairMQ_bytes,json=numberOfFairMQBytes,proto3" json:"number_of_fairMQ_bytes,omitempty"` -} - -func (x *UpdateFlpRequest) Reset() { - *x = UpdateFlpRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateFlpRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateFlpRequest) ProtoMessage() {} - -func (x *UpdateFlpRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateFlpRequest.ProtoReflect.Descriptor instead. -func (*UpdateFlpRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{8} -} - -func (x *UpdateFlpRequest) GetRunInfo() *RunInfo { - if x != nil { - return x.RunInfo - } - return nil -} - -func (x *UpdateFlpRequest) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *UpdateFlpRequest) GetNumberOfSubtimeframes() int32 { - if x != nil { - return x.NumberOfSubtimeframes - } - return 0 -} - -func (x *UpdateFlpRequest) GetNumberOfEquipmentBytes() int32 { - if x != nil { - return x.NumberOfEquipmentBytes - } - return 0 -} - -func (x *UpdateFlpRequest) GetNumberOfRecordingBytes() int32 { - if x != nil { - return x.NumberOfRecordingBytes - } - return 0 -} - -func (x *UpdateFlpRequest) GetNumberOfFairMQBytes() int32 { - if x != nil { - return x.NumberOfFairMQBytes - } - return 0 -} - -type EnvironmentInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentId string `protobuf:"bytes,1,opt,name=environment_id,json=environmentId,proto3" json:"environment_id,omitempty"` -} - -func (x *EnvironmentInfo) Reset() { - *x = EnvironmentInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnvironmentInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnvironmentInfo) ProtoMessage() {} - -func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. -func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{9} -} - -func (x *EnvironmentInfo) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" -} - -type EnvironmentResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` - InfoMessages string `protobuf:"bytes,2,opt,name=info_messages,json=infoMessages,proto3" json:"info_messages,omitempty"` -} - -func (x *EnvironmentResponse) Reset() { - *x = EnvironmentResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *EnvironmentResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*EnvironmentResponse) ProtoMessage() {} - -func (x *EnvironmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use EnvironmentResponse.ProtoReflect.Descriptor instead. -func (*EnvironmentResponse) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{10} -} - -func (x *EnvironmentResponse) GetEnvironmentInfo() *EnvironmentInfo { - if x != nil { - return x.EnvironmentInfo - } - return nil -} - -func (x *EnvironmentResponse) GetInfoMessages() string { - if x != nil { - return x.InfoMessages - } - return "" -} - -type CreateEnvRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` - CreatedAt int64 `protobuf:"varint,2,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - StatusMessage string `protobuf:"bytes,4,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` -} - -func (x *CreateEnvRequest) Reset() { - *x = CreateEnvRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CreateEnvRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CreateEnvRequest) ProtoMessage() {} - -func (x *CreateEnvRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CreateEnvRequest.ProtoReflect.Descriptor instead. -func (*CreateEnvRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{11} -} - -func (x *CreateEnvRequest) GetEnvironmentInfo() *EnvironmentInfo { - if x != nil { - return x.EnvironmentInfo - } - return nil -} - -func (x *CreateEnvRequest) GetCreatedAt() int64 { - if x != nil { - return x.CreatedAt - } - return 0 -} - -func (x *CreateEnvRequest) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *CreateEnvRequest) GetStatusMessage() string { - if x != nil { - return x.StatusMessage - } - return "" -} - -type UpdateEnvRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentInfo *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment_info,json=environmentInfo,proto3" json:"environment_info,omitempty"` - ToredownAt int64 `protobuf:"varint,2,opt,name=toredown_at,json=toredownAt,proto3" json:"toredown_at,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - StatusMessage string `protobuf:"bytes,4,opt,name=status_message,json=statusMessage,proto3" json:"status_message,omitempty"` -} - -func (x *UpdateEnvRequest) Reset() { - *x = UpdateEnvRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_bookkeeping_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *UpdateEnvRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*UpdateEnvRequest) ProtoMessage() {} - -func (x *UpdateEnvRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_bookkeeping_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use UpdateEnvRequest.ProtoReflect.Descriptor instead. -func (*UpdateEnvRequest) Descriptor() ([]byte, []int) { - return file_protos_bookkeeping_proto_rawDescGZIP(), []int{12} -} - -func (x *UpdateEnvRequest) GetEnvironmentInfo() *EnvironmentInfo { - if x != nil { - return x.EnvironmentInfo - } - return nil -} - -func (x *UpdateEnvRequest) GetToredownAt() int64 { - if x != nil { - return x.ToredownAt - } - return 0 -} - -func (x *UpdateEnvRequest) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *UpdateEnvRequest) GetStatusMessage() string { - if x != nil { - return x.StatusMessage - } - return "" -} - -var File_protos_bookkeeping_proto protoreflect.FileDescriptor - -var file_protos_bookkeeping_proto_rawDesc = []byte{ - 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0x4f, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x0b, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x66, 0x6f, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x8a, 0x03, - 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, - 0x5f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, - 0x5f, 0x65, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x64, - 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, - 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, - 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x70, 0x6e, 0x5f, 0x74, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x64, 0x63, 0x5f, - 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x9d, 0x04, 0x0a, 0x10, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x75, 0x6e, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x12, 0x22, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x4f, 0x32, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x4f, 0x32, - 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x54, 0x52, - 0x47, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x52, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x54, 0x52, 0x47, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x52, 0x47, 0x45, 0x6e, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x64, 0x70, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x64, 0x70, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x64, 0x70, 0x5f, 0x74, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x64, - 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x66, 0x62, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x66, 0x62, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x68, 0x63, 0x5f, 0x70, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6f, 0x64, 0x63, 0x5f, 0x74, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, - 0x75, 0x6c, 0x6c, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x64, 0x70, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x64, 0x70, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x64, 0x70, 0x5f, 0x62, 0x65, 0x61, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, - 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x55, 0x72, 0x69, 0x22, 0x63, 0x0a, 0x0b, 0x4c, 0x6f, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, - 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, - 0x97, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, - 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, 0x63, 0x0a, 0x0b, 0x46, 0x6c, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x66, - 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x73, - 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x22, 0xba, 0x02, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x5f, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x07, 0x72, 0x75, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, - 0x17, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x75, 0x62, 0x74, 0x69, - 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, - 0x6f, 0x66, 0x5f, 0x65, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x4f, 0x66, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x22, 0x38, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x13, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x23, 0x0a, 0x0d, 0x69, - 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x22, 0xb9, 0x01, 0x0a, 0x10, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1d, - 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbb, 0x01, 0x0a, - 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x47, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, - 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x32, 0xac, 0x04, 0x0a, 0x12, 0x42, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x1d, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x12, 0x1d, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x46, 0x0a, 0x09, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x12, 0x1d, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x46, 0x6c, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x56, 0x0a, 0x11, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x56, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x6e, 0x76, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x14, 0x5a, 0x12, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_protos_bookkeeping_proto_rawDescOnce sync.Once - file_protos_bookkeeping_proto_rawDescData = file_protos_bookkeeping_proto_rawDesc -) - -func file_protos_bookkeeping_proto_rawDescGZIP() []byte { - file_protos_bookkeeping_proto_rawDescOnce.Do(func() { - file_protos_bookkeeping_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_bookkeeping_proto_rawDescData) - }) - return file_protos_bookkeeping_proto_rawDescData -} - -var file_protos_bookkeeping_proto_msgTypes = make([]protoimpl.MessageInfo, 13) -var file_protos_bookkeeping_proto_goTypes = []interface{}{ - (*RunInfo)(nil), // 0: bookkeeping.RunInfo - (*RunResponse)(nil), // 1: bookkeeping.RunResponse - (*CreateRunRequest)(nil), // 2: bookkeeping.CreateRunRequest - (*UpdateRunRequest)(nil), // 3: bookkeeping.UpdateRunRequest - (*LogResponse)(nil), // 4: bookkeeping.LogResponse - (*CreateLogRequest)(nil), // 5: bookkeeping.CreateLogRequest - (*FlpResponse)(nil), // 6: bookkeeping.FlpResponse - (*CreateFlpRequest)(nil), // 7: bookkeeping.CreateFlpRequest - (*UpdateFlpRequest)(nil), // 8: bookkeeping.UpdateFlpRequest - (*EnvironmentInfo)(nil), // 9: bookkeeping.EnvironmentInfo - (*EnvironmentResponse)(nil), // 10: bookkeeping.EnvironmentResponse - (*CreateEnvRequest)(nil), // 11: bookkeeping.CreateEnvRequest - (*UpdateEnvRequest)(nil), // 12: bookkeeping.UpdateEnvRequest -} -var file_protos_bookkeeping_proto_depIdxs = []int32{ - 0, // 0: bookkeeping.RunResponse.run_info:type_name -> bookkeeping.RunInfo - 0, // 1: bookkeeping.CreateRunRequest.run_info:type_name -> bookkeeping.RunInfo - 0, // 2: bookkeeping.UpdateRunRequest.run_info:type_name -> bookkeeping.RunInfo - 0, // 3: bookkeeping.LogResponse.run_info:type_name -> bookkeeping.RunInfo - 0, // 4: bookkeeping.CreateLogRequest.run_info:type_name -> bookkeeping.RunInfo - 0, // 5: bookkeeping.FlpResponse.run_info:type_name -> bookkeeping.RunInfo - 0, // 6: bookkeeping.CreateFlpRequest.run_info:type_name -> bookkeeping.RunInfo - 0, // 7: bookkeeping.UpdateFlpRequest.run_info:type_name -> bookkeeping.RunInfo - 9, // 8: bookkeeping.EnvironmentResponse.environment_info:type_name -> bookkeeping.EnvironmentInfo - 9, // 9: bookkeeping.CreateEnvRequest.environment_info:type_name -> bookkeeping.EnvironmentInfo - 9, // 10: bookkeeping.UpdateEnvRequest.environment_info:type_name -> bookkeeping.EnvironmentInfo - 2, // 11: bookkeeping.BookkeepingControl.CreateRun:input_type -> bookkeeping.CreateRunRequest - 3, // 12: bookkeeping.BookkeepingControl.UpdateRun:input_type -> bookkeeping.UpdateRunRequest - 5, // 13: bookkeeping.BookkeepingControl.CreateLog:input_type -> bookkeeping.CreateLogRequest - 7, // 14: bookkeeping.BookkeepingControl.CreateFlp:input_type -> bookkeeping.CreateFlpRequest - 8, // 15: bookkeeping.BookkeepingControl.UpdateFlp:input_type -> bookkeeping.UpdateFlpRequest - 11, // 16: bookkeeping.BookkeepingControl.CreateEnvironment:input_type -> bookkeeping.CreateEnvRequest - 12, // 17: bookkeeping.BookkeepingControl.UpdateEnvironment:input_type -> bookkeeping.UpdateEnvRequest - 1, // 18: bookkeeping.BookkeepingControl.CreateRun:output_type -> bookkeeping.RunResponse - 1, // 19: bookkeeping.BookkeepingControl.UpdateRun:output_type -> bookkeeping.RunResponse - 4, // 20: bookkeeping.BookkeepingControl.CreateLog:output_type -> bookkeeping.LogResponse - 6, // 21: bookkeeping.BookkeepingControl.CreateFlp:output_type -> bookkeeping.FlpResponse - 6, // 22: bookkeeping.BookkeepingControl.UpdateFlp:output_type -> bookkeeping.FlpResponse - 10, // 23: bookkeeping.BookkeepingControl.CreateEnvironment:output_type -> bookkeeping.EnvironmentResponse - 10, // 24: bookkeeping.BookkeepingControl.UpdateEnvironment:output_type -> bookkeeping.EnvironmentResponse - 18, // [18:25] is the sub-list for method output_type - 11, // [11:18] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name -} - -func init() { file_protos_bookkeeping_proto_init() } -func file_protos_bookkeeping_proto_init() { - if File_protos_bookkeeping_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_protos_bookkeeping_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateRunRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRunRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateLogRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlpResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateFlpRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateFlpRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvironmentInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EnvironmentResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateEnvRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_bookkeeping_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateEnvRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_protos_bookkeeping_proto_rawDesc, - NumEnums: 0, - NumMessages: 13, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_protos_bookkeeping_proto_goTypes, - DependencyIndexes: file_protos_bookkeeping_proto_depIdxs, - MessageInfos: file_protos_bookkeeping_proto_msgTypes, - }.Build() - File_protos_bookkeeping_proto = out.File - file_protos_bookkeeping_proto_rawDesc = nil - file_protos_bookkeeping_proto_goTypes = nil - file_protos_bookkeeping_proto_depIdxs = nil -} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping.proto b/core/integration/bookkeepinggRPC/protos/bookkeeping.proto deleted file mode 100644 index bcbe3fa36..000000000 --- a/core/integration/bookkeepinggRPC/protos/bookkeeping.proto +++ /dev/null @@ -1,133 +0,0 @@ -syntax = "proto3"; -package bookkeepinggRPC; -option go_package = "protos;bookkeeping"; - -service BookkeepingControl { - // Run management requests - rpc CreateRun(CreateRunRequest) returns (RunResponse) { } - rpc UpdateRun(UpdateRunRequest) returns (RunResponse) { } - - // Log management requests - rpc CreateLog(CreateLogRequest) returns (LogResponse) { } - - // Flp management requests - rpc CreateFlp(CreateFlpRequest) returns (FlpResponse) { } - rpc UpdateFlp(UpdateFlpRequest) returns (FlpResponse) { } - - // Environment management requests - rpc CreateEnvironment(CreateEnvRequest) returns (EnvironmentResponse) { } - rpc UpdateEnvironment(UpdateEnvRequest) returns (EnvironmentResponse) { } -} - -////////////////////// -/// RUN management /// -////////////////////// - -message RunInfo { - int32 run_number = 1; - string environment_id = 2; -} - -message RunResponse { - RunInfo run_info = 1; - string info_messages = 2; -} - -message CreateRunRequest { - RunInfo run_info = 1; - int32 number_of_detectors = 2; - int32 number_of_epns = 3; - int32 number_of_flps = 4; - string run_type = 5; - bool dd_flp = 6; - bool dcs = 7; - bool epn = 8; - string epn_topology = 9; - string odc_topology_fullname = 10; - string detectors = 11; -} - -message UpdateRunRequest { - RunInfo run_info = 1; - string run_quality = 2; - int64 time_O2_start = 3; - int64 time_O2_end = 4; - int64 time_TRG_start = 5; - int64 time_TRG_end = 6; - string trigger = 7; - string pdp_config = 8; - string pdp_topology = 9; - string tfb_mode = 10; - string lhc_period = 11; - string odc_topology_fullname = 12; - string pdp_parameters = 13; - string pdp_beam = 14; - string readout_uri = 15; -} - -////////////////////// -/// LOG management /// -////////////////////// - -message LogResponse { - RunInfo run_info = 1; - string info_messages = 2; -} - -message CreateLogRequest { - RunInfo run_info = 1; - string title = 2; - string content = 3; - int32 parent_log_id = 4; -} - -////////////////////// -/// FLP management /// -////////////////////// - -message FlpResponse { - RunInfo run_info = 1; - string info_messages = 2; -} - -message CreateFlpRequest { - RunInfo run_info = 1; - string name = 2; - string hostname = 3; -} - -message UpdateFlpRequest { - RunInfo run_info = 1; - string name = 2; - int32 number_of_subtimeframes = 3; - int32 number_of_equipment_bytes = 4; - int32 number_of_recording_bytes = 5; - int32 number_of_fairMQ_bytes = 6; -} - -////////////////////// -/// Env management /// -////////////////////// - -message EnvironmentInfo { - string environment_id = 1; -} - -message EnvironmentResponse { - EnvironmentInfo environment_info = 1; - string info_messages = 2; -} - -message CreateEnvRequest { - EnvironmentInfo environment_info = 1; - int64 created_at = 2; - string status = 3; - string status_message = 4; -} - -message UpdateEnvRequest { - EnvironmentInfo environment_info = 1; - int64 toredown_at = 2; - string status = 3; - string status_message = 4; -} diff --git a/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go b/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go deleted file mode 100644 index 1295ba7ec..000000000 --- a/core/integration/bookkeepinggRPC/protos/bookkeeping_grpc.pb.go +++ /dev/null @@ -1,323 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. - -package bookkeeping - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -// BookkeepingControlClient is the client API for BookkeepingControl service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type BookkeepingControlClient interface { - // Run management requests - CreateRun(ctx context.Context, in *CreateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) - UpdateRun(ctx context.Context, in *UpdateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) - // Log management requests - CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*LogResponse, error) - // Flp management requests - CreateFlp(ctx context.Context, in *CreateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) - UpdateFlp(ctx context.Context, in *UpdateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) - // Environment management requests - CreateEnvironment(ctx context.Context, in *CreateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) - UpdateEnvironment(ctx context.Context, in *UpdateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) -} - -type bookkeepingControlClient struct { - cc grpc.ClientConnInterface -} - -func NewBookkeepingControlClient(cc grpc.ClientConnInterface) BookkeepingControlClient { - return &bookkeepingControlClient{cc} -} - -func (c *bookkeepingControlClient) CreateRun(ctx context.Context, in *CreateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) { - out := new(RunResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateRun", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) UpdateRun(ctx context.Context, in *UpdateRunRequest, opts ...grpc.CallOption) (*RunResponse, error) { - out := new(RunResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateRun", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) CreateLog(ctx context.Context, in *CreateLogRequest, opts ...grpc.CallOption) (*LogResponse, error) { - out := new(LogResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateLog", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) CreateFlp(ctx context.Context, in *CreateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) { - out := new(FlpResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateFlp", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) UpdateFlp(ctx context.Context, in *UpdateFlpRequest, opts ...grpc.CallOption) (*FlpResponse, error) { - out := new(FlpResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateFlp", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) CreateEnvironment(ctx context.Context, in *CreateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) { - out := new(EnvironmentResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/CreateEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *bookkeepingControlClient) UpdateEnvironment(ctx context.Context, in *UpdateEnvRequest, opts ...grpc.CallOption) (*EnvironmentResponse, error) { - out := new(EnvironmentResponse) - err := c.cc.Invoke(ctx, "/bookkeeping.BookkeepingControl/UpdateEnvironment", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// BookkeepingControlServer is the server API for BookkeepingControl service. -// All implementations should embed UnimplementedBookkeepingControlServer -// for forward compatibility -type BookkeepingControlServer interface { - // Run management requests - CreateRun(context.Context, *CreateRunRequest) (*RunResponse, error) - UpdateRun(context.Context, *UpdateRunRequest) (*RunResponse, error) - // Log management requests - CreateLog(context.Context, *CreateLogRequest) (*LogResponse, error) - // Flp management requests - CreateFlp(context.Context, *CreateFlpRequest) (*FlpResponse, error) - UpdateFlp(context.Context, *UpdateFlpRequest) (*FlpResponse, error) - // Environment management requests - CreateEnvironment(context.Context, *CreateEnvRequest) (*EnvironmentResponse, error) - UpdateEnvironment(context.Context, *UpdateEnvRequest) (*EnvironmentResponse, error) -} - -// UnimplementedBookkeepingControlServer should be embedded to have forward compatible implementations. -type UnimplementedBookkeepingControlServer struct { -} - -func (UnimplementedBookkeepingControlServer) CreateRun(context.Context, *CreateRunRequest) (*RunResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateRun not implemented") -} -func (UnimplementedBookkeepingControlServer) UpdateRun(context.Context, *UpdateRunRequest) (*RunResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateRun not implemented") -} -func (UnimplementedBookkeepingControlServer) CreateLog(context.Context, *CreateLogRequest) (*LogResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateLog not implemented") -} -func (UnimplementedBookkeepingControlServer) CreateFlp(context.Context, *CreateFlpRequest) (*FlpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateFlp not implemented") -} -func (UnimplementedBookkeepingControlServer) UpdateFlp(context.Context, *UpdateFlpRequest) (*FlpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateFlp not implemented") -} -func (UnimplementedBookkeepingControlServer) CreateEnvironment(context.Context, *CreateEnvRequest) (*EnvironmentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateEnvironment not implemented") -} -func (UnimplementedBookkeepingControlServer) UpdateEnvironment(context.Context, *UpdateEnvRequest) (*EnvironmentResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateEnvironment not implemented") -} - -// UnsafeBookkeepingControlServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to BookkeepingControlServer will -// result in compilation errors. -type UnsafeBookkeepingControlServer interface { - mustEmbedUnimplementedBookkeepingControlServer() -} - -func RegisterBookkeepingControlServer(s grpc.ServiceRegistrar, srv BookkeepingControlServer) { - s.RegisterService(&BookkeepingControl_ServiceDesc, srv) -} - -func _BookkeepingControl_CreateRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateRunRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).CreateRun(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/CreateRun", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).CreateRun(ctx, req.(*CreateRunRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_UpdateRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateRunRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).UpdateRun(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/UpdateRun", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).UpdateRun(ctx, req.(*UpdateRunRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_CreateLog_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateLogRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).CreateLog(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/CreateLog", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).CreateLog(ctx, req.(*CreateLogRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_CreateFlp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateFlpRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).CreateFlp(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/CreateFlp", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).CreateFlp(ctx, req.(*CreateFlpRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_UpdateFlp_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateFlpRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).UpdateFlp(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/UpdateFlp", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).UpdateFlp(ctx, req.(*UpdateFlpRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_CreateEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(CreateEnvRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).CreateEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/CreateEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).CreateEnvironment(ctx, req.(*CreateEnvRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _BookkeepingControl_UpdateEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UpdateEnvRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(BookkeepingControlServer).UpdateEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/bookkeeping.BookkeepingControl/UpdateEnvironment", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(BookkeepingControlServer).UpdateEnvironment(ctx, req.(*UpdateEnvRequest)) - } - return interceptor(ctx, in, info, handler) -} - -// BookkeepingControl_ServiceDesc is the grpc.ServiceDesc for BookkeepingControl service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var BookkeepingControl_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "bookkeeping.BookkeepingControl", - HandlerType: (*BookkeepingControlServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "CreateRun", - Handler: _BookkeepingControl_CreateRun_Handler, - }, - { - MethodName: "UpdateRun", - Handler: _BookkeepingControl_UpdateRun_Handler, - }, - { - MethodName: "CreateLog", - Handler: _BookkeepingControl_CreateLog_Handler, - }, - { - MethodName: "CreateFlp", - Handler: _BookkeepingControl_CreateFlp_Handler, - }, - { - MethodName: "UpdateFlp", - Handler: _BookkeepingControl_UpdateFlp_Handler, - }, - { - MethodName: "CreateEnvironment", - Handler: _BookkeepingControl_CreateEnvironment_Handler, - }, - { - MethodName: "UpdateEnvironment", - Handler: _BookkeepingControl_UpdateEnvironment_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "protos/bookkeeping.proto", -} diff --git a/core/integration/bookkeepinggRPC/utils.go b/core/integration/bookkeepinggRPC/utils.go deleted file mode 100644 index 9193c3e3a..000000000 --- a/core/integration/bookkeepinggRPC/utils.go +++ /dev/null @@ -1,57 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package bookkeepinggRPC - -import ( - "net/http" - - "github.com/spf13/viper" -) - -func getJWTAPIToken() (jwtToken string) { - req, err := http.NewRequest("GET", viper.GetString("bookkeepingBaseUri"), nil) - if err != nil { - log.WithField("error", err.Error()). - Error("cannot create http GET request") - return - } - client := new(http.Client) - client.CheckRedirect = func(req *http.Request, via []*http.Request) error { - if token, ok := req.URL.Query()["token"]; ok { - log.WithField("JWT token", token[0]). - Debug("bookkeeping jwt token") - jwtToken = token[0] - } - return nil - } - - _, err = client.Do(req) - if err != nil { - log.WithField("error", err.Error()). - Error("cannot execute http request") - return - } - return -} From 518f533da7431c00b7e4d275587df2ad0796aabf Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 24 Oct 2022 13:43:14 +0200 Subject: [PATCH 1459/2352] [core] Detectors are correctly parsed from string to Detector enum type to match Bookkeeping proto. --- core/integration/bookkeeping/plugin.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index f4f199c51..3ef97bc10 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -277,7 +277,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "UpdateRun"). Warning("cannot acquire ODC topology fullname") } - detectors := strings.Join(env.GetActiveDetectors().StringList(), ",") + detectors := env.GetActiveDetectors().StringList() + var detectorsList = make([]bkpb.Detector, len(detectors)) + for _, name := range detectors { + detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value[name])) + } inRun := bkpb.RunCreationRequest{ RunNumber: int32(runNumber64), @@ -291,7 +295,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Epn: epnEnabled, EpnTopology: odcTopology, OdcTopologyFullName: odcTopologyFullname, - Detectors: []bkpb.Detector(detectors), + Detectors: detectorsList, } timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateRun", envId) From 77829c316a9e438833136b2d9d1975f710dbfe89 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 28 Oct 2022 20:50:14 +0200 Subject: [PATCH 1460/2352] [core] The AliECS core Bookkeeping plugin is migrated to gRPC, matching Bookkeeping. --- core/integration/bookkeeping/plugin.go | 190 ++++++------- .../bookkeeping/protos/common.pb.go | 128 ++++----- .../bookkeeping/protos/common.proto | 14 +- .../bookkeeping/protos/environment.pb.go | 163 +++++------ .../bookkeeping/protos/environment.proto | 16 +- .../bookkeeping/protos/environment_grpc.pb.go | 4 + core/integration/bookkeeping/protos/flp.pb.go | 109 ++++--- core/integration/bookkeeping/protos/flp.proto | 2 +- .../bookkeeping/protos/flp_grpc.pb.go | 4 + core/integration/bookkeeping/protos/log.pb.go | 251 +++++++++-------- core/integration/bookkeeping/protos/log.proto | 5 +- .../bookkeeping/protos/log_grpc.pb.go | 4 + core/integration/bookkeeping/protos/run.pb.go | 265 +++++++++--------- core/integration/bookkeeping/protos/run.proto | 29 +- .../bookkeeping/protos/run_grpc.pb.go | 4 + 15 files changed, 595 insertions(+), 593 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 3ef97bc10..386e49ac4 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -21,7 +21,7 @@ * immunities granted to it by virtue of its status as an * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/common.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative protos/common.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/environment.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/flp.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/log.proto @@ -50,9 +50,8 @@ import ( ) const ( - BKP_SOR_TIMEOUT = 30 * time.Second - BKP_EOR_TIMEOUT = 30 * time.Second - BKP_DEFAULT_POLLING_TIMEOUT = 30 * time.Second + BKP_RUN_TIMEOUT = 30 * time.Second + BKP_ENV_TIMEOUT = 30 * time.Second ) type Plugin struct { @@ -128,7 +127,7 @@ func (p *Plugin) Init(instanceId string) error { if p.bookkeepingClient == nil { return fmt.Errorf("failed to connect to Bookkeeping service on %s", p.GetEndpoint()) } - log.Debug("DD scheduler plugin initialized") + log.Debug("Bookkeeping plugin initialized") } return nil } @@ -224,7 +223,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). - Error("Bookkeeping SOR error") + Error("Bookkeeping plugin SOR error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -233,6 +232,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } runNumber := env.GetCurrentRunNumber() + runNumber32 := int32(runNumber64) rnString := strconv.FormatUint(uint64(runNumber), 10) @@ -278,13 +278,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("cannot acquire ODC topology fullname") } detectors := env.GetActiveDetectors().StringList() - var detectorsList = make([]bkpb.Detector, len(detectors)) + var detectorsList = make([]bkpb.Detector, 0) for _, name := range detectors { - detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value[name])) + detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value["DETECTOR_"+name])) } inRun := bkpb.RunCreationRequest{ - RunNumber: int32(runNumber64), + RunNumber: runNumber32, EnvironmentId: env.Id().String(), NDetectors: int32(len(env.GetActiveDetectors())), NEpns: int32(epns), @@ -294,11 +294,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Dcs: dcsEnabled, Epn: epnEnabled, EpnTopology: odcTopology, - OdcTopologyFullName: odcTopologyFullname, + OdcTopologyFullName: &odcTopologyFullname, Detectors: detectorsList, } - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateRun", envId) + timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) @@ -306,8 +306,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("runNumber", runNumber). WithField("partition", envId). - WithField("call", "CreateRun"). - Error("Bookkeeping API CreateRun error") + WithField("call", "RunServiceClient.Create"). + Error("Bookkeeping API RunServiceClient: Create error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -318,7 +318,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingTrgStops[envId] = "" log.WithField("runNumber", runNumber). WithField("partition", envId). - Debug("CreateRun call successful") + Debug("Bookkeeping API RunServiceClient: Create call successful") } var inFlps = bkpb.ManyFlpsCreationRequest{ @@ -329,12 +329,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { inFlp := &bkpb.FlpCreationRequest{ Name: flp, HostName: flp, - RunNumber: int32(runNumber64), + RunNumber: &runNumber32, } inFlps.Flps = append(inFlps.Flps, inFlp) } - timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateFlp", envId) + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateFlp", envId) ctx, cancel = context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.FlpServiceClient.CreateMany(ctx, &inFlps, grpc.EmptyCallOption{}) @@ -342,27 +342,28 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("runNumber", runNumber). WithField("partition", envId). - WithField("call", "CreateFlp"). - Error("Bookkeeping API CreateFlp error") + WithField("call", "FlpServiceClient.CreateMany"). + Error("Bookkeeping API FlpServiceClient: CreateMany error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr return + } else { + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("Bookkeeping API FlpServiceClient: CreateMany call successful") } - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("CreateFlp call done") runNumbers := make([]int32, 0) - runNumbers = append(runNumbers, int32(runNumber64)) + runNumbers = append(runNumbers, runNumber32) inLog := bkpb.LogCreationRequest{ RunNumbers: runNumbers, Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), Text: env.GetVarsAsString(), - ParentLogId: -1, + ParentLogId: nil, } - timeout = callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "CreateLog", envId) + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) ctx, cancel = context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) @@ -370,8 +371,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("runNumber", runNumber). WithField("partition", envId). - WithField("call", "CreateLog"). - Error("Bookkeeping API CreateLog error") + WithField("call", "LogServiceClient.Create"). + Error("Bookkeeping API LogServiceClient: Create error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -379,7 +380,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { log.WithField("runNumber", runNumber). WithField("partition", envId). - Debug("CreateLog call successful") + Debug("Bookkeeping API LogServiceClient: Create call successful") } return } @@ -450,16 +451,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] - var runquality bkpb.RunQuality - switch state { - case string(bkpb.RunQuality_RUN_QUALITY_GOOD): - runquality = bkpb.RunQuality_RUN_QUALITY_GOOD - case string(bkpb.RunQuality_RUN_QUALITY_BAD): - runquality = bkpb.RunQuality_RUN_QUALITY_BAD - default: - runquality = bkpb.RunQuality_RUN_QUALITY_TEST - } - timeO2S, err := strconv.ParseInt(timeO2Start, 10, 64) if err != nil { log.WithField("runNumber", runNumber64). @@ -510,23 +501,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { inRun := bkpb.RunUpdateRequest{ RunNumber: int32(runNumber64), - RunQuality: runquality, - TimeO2Start: timeO2S, - TimeO2End: timeO2E, - TimeTrgStart: timeTrgS, - TimeTrgEnd: timeTrgE, - TriggerValue: trigger, - PdpConfigOption: pdpConfig, - PdpTopologyDescriptionLibraryFile: pdpTopology, - TfbDdMode: tfbMode, - LhcPeriod: lhcPeriod, - OdcTopologyFullName: odcTopologyFullname, - PdpWorkflowParameters: pdpParameters, - PdpBeamType: pdpBeam, - ReadoutCfgUri: readoutUri, - } - - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + TimeO2Start: &timeO2S, + TimeO2End: &timeO2E, + TimeTrgStart: &timeTrgS, + TimeTrgEnd: &timeTrgE, + TriggerValue: &trg, + PdpConfigOption: &pdpConfig, + PdpTopologyDescriptionLibraryFile: &pdpTopology, + TfbDdMode: &tfbMode, + LhcPeriod: &lhcPeriod, + OdcTopologyFullName: &odcTopologyFullname, + PdpWorkflowParameters: &pdpParameters, + PdpBeamType: &pdpBeam, + ReadoutCfgUri: &readoutUri, + } + + timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) @@ -534,8 +524,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("runNumber", runNumber64). WithField("partition", envId). - WithField("call", "UpdateRun"). - Error("Bookkeeping API UpdateRun error") + WithField("call", "RunServiceClient.Update"). + Error("Bookkeeping API RunServiceClient: Update error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -547,7 +537,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { updatedRun = "INCOMPLETE" log.WithField("runNumber", runNumber64). WithField("partition", envId). - Debug("UpdateRun call: run information incomplete") + Debug("Bookkeeping API RunServiceClient: Update call: run information incomplete") } else { updatedRun = "STOPPED" delete(p.pendingRunStops, envId) @@ -560,7 +550,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("runNumber", runNumber64). WithField("updated to", updatedRun). WithField("partition", envId). - Debug("UpdateRun call successful") + Debug("Bookkeeping API RunServiceClient: Update call successful") } return } @@ -588,7 +578,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRunStart"). - Error("Bookkeeping UpdateRunStart error") + Error("Bookkeeping plugin UpdateRunStart error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -630,7 +620,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("runNumber", runNumber64). WithField("partition", envId). WithField("call", "UpdateRunStop"). - Error("Bookkeeping UpdateRunStop error") + Error("Bookkeeping plugin UpdateRunStop error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -666,7 +656,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("partition", envId). WithField("call", "CreateEnv"). - Error("Bookkeeping CreateEnv error") + Error("Bookkeeping plugin CreateEnv error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -674,6 +664,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + createdAt := time.Now().UnixMilli() + var statusMessage = "" envState := env.CurrentState() if envState == "STANDBY" || envState == "DEPLOYED" { @@ -683,51 +675,53 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } inEnv := bkpb.EnvironmentCreationRequest{ - EnvId: env.Id().String(), - CreatedAt: time.Now().UnixMilli(), - Status: envState, - StatusMessage: statusMessage, + Id: env.Id().String(), + CreatedAt: &createdAt, + Status: &envState, + StatusMessage: &statusMessage, } - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + timeout := callable.AcquireTimeout(BKP_ENV_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - _, err = p.bookkeepingClient.EnvironmentServiceClient.Create(ctx, &inEnv, grpc.EmptyCallOption{}) - + response, err := p.bookkeepingClient.EnvironmentServiceClient.Create(ctx, &inEnv, grpc.EmptyCallOption{}) + if response != nil { + response.StatusMessage = "response not nil" + } if err != nil { log.WithError(err). WithField("partition", envId). - WithField("call", "CreateEnvironment"). - Error("Bookkeeping API CreateEnvironment error") + WithField("call", "EnvironmentServiceClient.Create"). + Error("Bookkeeping API EnvironmentServiceClient: Create error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr return } else { log.WithField("partition", envId). - Debug("CreateEnvironment call successful") + Debug("Bookkeeping API EnvironmentServiceClient: Create call successful") } return } - updateEnvFunc := func(envId string, toredownAt time.Time, status string, statusMessage string) (out string) { + updateEnvFunc := func(envId string, toredownAt int64, status string, statusMessage string) (out string) { callFailedStr := "Bookkeeping UpdateEnv call failed" inEnv := bkpb.EnvironmentUpdateRequest{ - EnvId: env.Id().String(), - ToredownAt: toredownAt.UnixMilli(), - Status: status, - StatusMessage: statusMessage, + Id: env.Id().String(), + ToredownAt: &toredownAt, + Status: &status, + StatusMessage: &statusMessage, } - timeout := callable.AcquireTimeout(BKP_SOR_TIMEOUT, varStack, "UpdateRun", envId) + timeout := callable.AcquireTimeout(BKP_ENV_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.EnvironmentServiceClient.Update(ctx, &inEnv, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("partition", envId). - WithField("call", "UpdateEnvironment"). - Error("Bookkeeping API UpdateEnvironment error") + WithField("call", "EnvironmentServiceClient.Update"). + Error("Bookkeeping API EnvironmentServiceClient: Update error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -735,7 +729,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { log.WithField("partition", envId). WithField("state", status). - Debug("UpdateEnvironment call successful") + Debug("Bookkeeping API EnvironmentServiceClient: Update call successful") } return } @@ -750,7 +744,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("partition", envId). WithField("call", "UpdateEnv"). - Error("Bookkeeping UpdateEnv error") + Error("Bookkeeping plugin UpdateEnv error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr @@ -762,62 +756,62 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if strings.Contains(trigger, "DESTROY") { envState = "DESTROYED" - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "the environment is DESTROYED after DESTROY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "the environment is DESTROYED after DESTROY transition") } if strings.Contains(trigger, "DEPLOY") { if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after DEPLOY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in DEPLOYED state after DEPLOY transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after DEPLOY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after DEPLOY transition") } } if strings.Contains(trigger, "CONFIGURE") { if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in CONFIGURED state after CONFIGURE transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after CONFIGURE transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after CONFIGURE transition") } } if strings.Contains(trigger, "RESET") { if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RESET transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in DEPLOYED state after RESET transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RESET transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after RESET transition") } } if strings.Contains(trigger, "START_ACTIVITY") { if envState == "RUNNING" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in RUNNING state after START_ACTIVITY transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after START_ACTIVITY transition") } } if strings.Contains(trigger, "STOP_ACTIVITY") { if envState == "CONFIGURED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in CONFIGURED state after STOP_ACTIVITY transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after STOP_ACTIVITY transition") } } if strings.Contains(trigger, "EXIT") { if envState == "DONE" { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "success: the environment is in DONE state after EXIT transition") + return updateEnvFunc(env.Id().String(), time.Now().UnixMilli(), envState, "success: the environment is in DONE state after EXIT transition") } else { - return updateEnvFunc(env.Id().String(), time.Now(), envState, "error: the environment is in "+envState+" state after EXIT transition") + return updateEnvFunc(env.Id().String(), time.Now().UnixMilli(), envState, "error: the environment is in "+envState+" state after EXIT transition") } } if strings.Contains(trigger, "GO_ERROR") { if envState == "ERROR" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in ERROR state after GO_ERROR transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in ERROR state after GO_ERROR transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after GO_ERROR transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after GO_ERROR transition") } } if strings.Contains(trigger, "RECOVER") { if envState == "DEPLOYED" { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "success: the environment is in DEPLOYED state after RECOVER transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "success: the environment is in DEPLOYED state after RECOVER transition") } else { - return updateEnvFunc(env.Id().String(), time.Time{}, envState, "error: the environment is in "+envState+" state after RECOVER transition") + return updateEnvFunc(env.Id().String(), time.Time{}.UnixMilli(), envState, "error: the environment is in "+envState+" state after RECOVER transition") } } log.WithField("partition", envId). diff --git a/core/integration/bookkeeping/protos/common.pb.go b/core/integration/bookkeeping/protos/common.pb.go index a38838347..8437c92b4 100644 --- a/core/integration/bookkeeping/protos/common.pb.go +++ b/core/integration/bookkeeping/protos/common.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: protos/common.proto package bkpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type Detector int32 const ( @@ -174,7 +169,7 @@ const ( RunType_RUN_TYPE_NULL RunType = 0 RunType_RUN_TYPE_PHYSICS RunType = 1 RunType_RUN_TYPE_TECHNICAL RunType = 2 - RunType_RUN_TYPE_PEDESTALS RunType = 3 + RunType_RUN_TYPE_PEDESTAL RunType = 3 RunType_RUN_TYPE_PULSER RunType = 4 RunType_RUN_TYPE_LASER RunType = 5 RunType_RUN_TYPE_CALIBRATION_ITHR_TUNING RunType = 6 @@ -184,38 +179,38 @@ const ( RunType_RUN_TYPE_CALIBRATION_ANALOG_SCAN RunType = 10 RunType_RUN_TYPE_CALIBRATION_FHR RunType = 11 RunType_RUN_TYPE_CALIBRATION_ALPIDE_SCAN RunType = 12 - RunType_RUN_TYPE_CALIBRATION RunType = 200 - RunType_RUN_TYPE_COSMICS RunType = 201 - RunType_RUN_TYPE_SYNTHETIC RunType = 202 - RunType_RUN_TYPE_ANY RunType = 300 + RunType_RUN_TYPE_CALIBRATION RunType = 13 + RunType_RUN_TYPE_COSMICS RunType = 14 + RunType_RUN_TYPE_SYNTHETIC RunType = 15 + RunType_RUN_TYPE_NOISE RunType = 16 ) // Enum value maps for RunType. var ( RunType_name = map[int32]string{ - 0: "RUN_TYPE_NULL", - 1: "RUN_TYPE_PHYSICS", - 2: "RUN_TYPE_TECHNICAL", - 3: "RUN_TYPE_PEDESTALS", - 4: "RUN_TYPE_PULSER", - 5: "RUN_TYPE_LASER", - 6: "RUN_TYPE_CALIBRATION_ITHR_TUNING", - 7: "RUN_TYPE_CALIBRATION_VCASN_TUNING", - 8: "RUN_TYPE_CALIBRATION_THR_SCAN", - 9: "RUN_TYPE_CALIBRATION_DIGITAL_SCAN", - 10: "RUN_TYPE_CALIBRATION_ANALOG_SCAN", - 11: "RUN_TYPE_CALIBRATION_FHR", - 12: "RUN_TYPE_CALIBRATION_ALPIDE_SCAN", - 200: "RUN_TYPE_CALIBRATION", - 201: "RUN_TYPE_COSMICS", - 202: "RUN_TYPE_SYNTHETIC", - 300: "RUN_TYPE_ANY", + 0: "RUN_TYPE_NULL", + 1: "RUN_TYPE_PHYSICS", + 2: "RUN_TYPE_TECHNICAL", + 3: "RUN_TYPE_PEDESTAL", + 4: "RUN_TYPE_PULSER", + 5: "RUN_TYPE_LASER", + 6: "RUN_TYPE_CALIBRATION_ITHR_TUNING", + 7: "RUN_TYPE_CALIBRATION_VCASN_TUNING", + 8: "RUN_TYPE_CALIBRATION_THR_SCAN", + 9: "RUN_TYPE_CALIBRATION_DIGITAL_SCAN", + 10: "RUN_TYPE_CALIBRATION_ANALOG_SCAN", + 11: "RUN_TYPE_CALIBRATION_FHR", + 12: "RUN_TYPE_CALIBRATION_ALPIDE_SCAN", + 13: "RUN_TYPE_CALIBRATION", + 14: "RUN_TYPE_COSMICS", + 15: "RUN_TYPE_SYNTHETIC", + 16: "RUN_TYPE_NOISE", } RunType_value = map[string]int32{ "RUN_TYPE_NULL": 0, "RUN_TYPE_PHYSICS": 1, "RUN_TYPE_TECHNICAL": 2, - "RUN_TYPE_PEDESTALS": 3, + "RUN_TYPE_PEDESTAL": 3, "RUN_TYPE_PULSER": 4, "RUN_TYPE_LASER": 5, "RUN_TYPE_CALIBRATION_ITHR_TUNING": 6, @@ -225,10 +220,10 @@ var ( "RUN_TYPE_CALIBRATION_ANALOG_SCAN": 10, "RUN_TYPE_CALIBRATION_FHR": 11, "RUN_TYPE_CALIBRATION_ALPIDE_SCAN": 12, - "RUN_TYPE_CALIBRATION": 200, - "RUN_TYPE_COSMICS": 201, - "RUN_TYPE_SYNTHETIC": 202, - "RUN_TYPE_ANY": 300, + "RUN_TYPE_CALIBRATION": 13, + "RUN_TYPE_COSMICS": 14, + "RUN_TYPE_SYNTHETIC": 15, + "RUN_TYPE_NOISE": 16, } ) @@ -721,43 +716,42 @@ var file_protos_common_proto_rawDesc = []byte{ 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x2a, - 0xf9, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, + 0xe7, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, + 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, - 0x4c, 0x53, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, - 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, - 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, - 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, - 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x19, - 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0xc8, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0xc9, 0x01, - 0x12, 0x17, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, - 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0xca, 0x01, 0x12, 0x11, 0x0a, 0x0c, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x0d, - 0x10, 0xc7, 0x01, 0x22, 0x06, 0x08, 0xcb, 0x01, 0x10, 0xab, 0x02, 0x42, 0x4a, 0x5a, 0x48, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, + 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, + 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, + 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, + 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, + 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, + 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/common.proto b/core/integration/bookkeeping/protos/common.proto index 75b9b7cf4..a726b6ca1 100644 --- a/core/integration/bookkeeping/protos/common.proto +++ b/core/integration/bookkeeping/protos/common.proto @@ -44,7 +44,7 @@ enum RunType { RUN_TYPE_NULL = 0; RUN_TYPE_PHYSICS = 1; RUN_TYPE_TECHNICAL = 2; - RUN_TYPE_PEDESTALS = 3; + RUN_TYPE_PEDESTAL = 3; RUN_TYPE_PULSER = 4; RUN_TYPE_LASER = 5; RUN_TYPE_CALIBRATION_ITHR_TUNING = 6; @@ -54,14 +54,10 @@ enum RunType { RUN_TYPE_CALIBRATION_ANALOG_SCAN = 10; RUN_TYPE_CALIBRATION_FHR = 11; RUN_TYPE_CALIBRATION_ALPIDE_SCAN = 12; - reserved 13 to 199; - - RUN_TYPE_CALIBRATION = 200; - RUN_TYPE_COSMICS = 201; - RUN_TYPE_SYNTHETIC = 202; - reserved 203 to 299; - - RUN_TYPE_ANY = 300; + RUN_TYPE_CALIBRATION = 13; + RUN_TYPE_COSMICS = 14; + RUN_TYPE_SYNTHETIC = 15; + RUN_TYPE_NOISE = 16; } message Run { diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index 3d5a0cb86..fb2a0f3f6 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: protos/environment.proto package bkpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,19 +20,15 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type EnvironmentCreationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - CreatedAt int64 `protobuf:"varint,2,opt,name=createdAt,proto3" json:"createdAt,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - StatusMessage string `protobuf:"bytes,4,opt,name=statusMessage,proto3" json:"statusMessage,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + CreatedAt *int64 `protobuf:"varint,2,opt,name=createdAt,proto3,oneof" json:"createdAt,omitempty"` + Status *string `protobuf:"bytes,3,opt,name=status,proto3,oneof" json:"status,omitempty"` + StatusMessage *string `protobuf:"bytes,4,opt,name=statusMessage,proto3,oneof" json:"statusMessage,omitempty"` } func (x *EnvironmentCreationRequest) Reset() { @@ -68,30 +63,30 @@ func (*EnvironmentCreationRequest) Descriptor() ([]byte, []int) { return file_protos_environment_proto_rawDescGZIP(), []int{0} } -func (x *EnvironmentCreationRequest) GetEnvId() string { +func (x *EnvironmentCreationRequest) GetId() string { if x != nil { - return x.EnvId + return x.Id } return "" } func (x *EnvironmentCreationRequest) GetCreatedAt() int64 { - if x != nil { - return x.CreatedAt + if x != nil && x.CreatedAt != nil { + return *x.CreatedAt } return 0 } func (x *EnvironmentCreationRequest) GetStatus() string { - if x != nil { - return x.Status + if x != nil && x.Status != nil { + return *x.Status } return "" } func (x *EnvironmentCreationRequest) GetStatusMessage() string { - if x != nil { - return x.StatusMessage + if x != nil && x.StatusMessage != nil { + return *x.StatusMessage } return "" } @@ -101,10 +96,10 @@ type EnvironmentUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EnvId string `protobuf:"bytes,1,opt,name=envId,proto3" json:"envId,omitempty"` - ToredownAt int64 `protobuf:"varint,2,opt,name=toredownAt,proto3" json:"toredownAt,omitempty"` - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - StatusMessage string `protobuf:"bytes,4,opt,name=statusMessage,proto3" json:"statusMessage,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ToredownAt *int64 `protobuf:"varint,2,opt,name=toredownAt,proto3,oneof" json:"toredownAt,omitempty"` + Status *string `protobuf:"bytes,3,opt,name=status,proto3,oneof" json:"status,omitempty"` + StatusMessage *string `protobuf:"bytes,4,opt,name=statusMessage,proto3,oneof" json:"statusMessage,omitempty"` } func (x *EnvironmentUpdateRequest) Reset() { @@ -139,30 +134,30 @@ func (*EnvironmentUpdateRequest) Descriptor() ([]byte, []int) { return file_protos_environment_proto_rawDescGZIP(), []int{1} } -func (x *EnvironmentUpdateRequest) GetEnvId() string { +func (x *EnvironmentUpdateRequest) GetId() string { if x != nil { - return x.EnvId + return x.Id } return "" } func (x *EnvironmentUpdateRequest) GetToredownAt() int64 { - if x != nil { - return x.ToredownAt + if x != nil && x.ToredownAt != nil { + return *x.ToredownAt } return 0 } func (x *EnvironmentUpdateRequest) GetStatus() string { - if x != nil { - return x.Status + if x != nil && x.Status != nil { + return *x.Status } return "" } func (x *EnvironmentUpdateRequest) GetStatusMessage() string { - if x != nil { - return x.StatusMessage + if x != nil && x.StatusMessage != nil { + return *x.StatusMessage } return "" } @@ -275,56 +270,62 @@ var file_protos_environment_proto_rawDesc = []byte{ 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x8e, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, - 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0xc2, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, + 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x00, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, + 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, - 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, - 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, - 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, - 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, - 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, + 0x0a, 0x0b, 0x5f, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, + 0x77, 0x6e, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, + 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, + 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, + 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -403,6 +404,8 @@ func file_protos_environment_proto_init() { } } } + file_protos_environment_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_protos_environment_proto_msgTypes[1].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/core/integration/bookkeeping/protos/environment.proto b/core/integration/bookkeeping/protos/environment.proto index d1361af33..003bf6f25 100644 --- a/core/integration/bookkeeping/protos/environment.proto +++ b/core/integration/bookkeeping/protos/environment.proto @@ -15,17 +15,17 @@ service EnvironmentService { // High level messages message EnvironmentCreationRequest { - string envId = 1; - int64 createdAt = 2; - string status = 3; - string statusMessage = 4; + string id = 1; + optional int64 createdAt = 2; + optional string status = 3; + optional string statusMessage = 4; } message EnvironmentUpdateRequest { - string envId = 1; - int64 toredownAt = 2; - string status = 3; - string statusMessage = 4; + string id = 1; + optional int64 toredownAt = 2; + optional string status = 3; + optional string statusMessage = 4; } // Low-level messages and enums diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index 88b5f97f7..dce68d20c 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.9 +// source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index 9c166dce8..895123066 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: protos/flp.proto package bkpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type FlpCreationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -32,7 +27,7 @@ type FlpCreationRequest struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` HostName string `protobuf:"bytes,2,opt,name=hostName,proto3" json:"hostName,omitempty"` - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + RunNumber *int32 `protobuf:"varint,3,opt,name=runNumber,proto3,oneof" json:"runNumber,omitempty"` } func (x *FlpCreationRequest) Reset() { @@ -82,8 +77,8 @@ func (x *FlpCreationRequest) GetHostName() string { } func (x *FlpCreationRequest) GetRunNumber() int32 { - if x != nil { - return x.RunNumber + if x != nil && x.RunNumber != nil { + return *x.RunNumber } return 0 } @@ -308,55 +303,56 @@ var File_protos_flp_proto protoreflect.FileDescriptor var file_protos_flp_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x66, 0x6c, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x22, 0x62, 0x0a, 0x12, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x67, 0x22, 0x75, 0x0a, 0x12, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x17, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, - 0x70, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x36, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0x32, 0x0a, 0x07, 0x46, 0x6c, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xe7, 0x02, - 0x0a, 0x03, 0x46, 0x6c, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, - 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, - 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x5c, 0x0a, 0x0a, 0x46, 0x6c, 0x70, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, - 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, 0x70, 0x73, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, - 0x70, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x09, 0x72, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x17, 0x4d, 0x61, 0x6e, + 0x79, 0x46, 0x6c, 0x70, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0x32, 0x0a, 0x07, + 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, + 0x22, 0xe7, 0x02, 0x0a, 0x03, 0x46, 0x6c, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, + 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, + 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x79, + 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x54, 0x69, 0x6d, + 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x5c, 0x0a, 0x0a, 0x46, 0x6c, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, 0x70, 0x73, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -445,6 +441,7 @@ func file_protos_flp_proto_init() { } } } + file_protos_flp_proto_msgTypes[0].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/core/integration/bookkeeping/protos/flp.proto b/core/integration/bookkeeping/protos/flp.proto index 9f67bccf6..66fa78242 100644 --- a/core/integration/bookkeeping/protos/flp.proto +++ b/core/integration/bookkeeping/protos/flp.proto @@ -14,7 +14,7 @@ service FlpService { message FlpCreationRequest { string name = 1; string hostName = 2; - int32 runNumber = 3; + optional int32 runNumber = 3; } message ManyFlpsCreationRequest { diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index f4fc752f3..4d1157568 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.9 +// source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index 0e127a27d..e2c73dd30 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: protos/log.proto package bkpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type LogOrigin int32 const ( @@ -140,7 +135,7 @@ type LogCreationRequest struct { Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` RunNumbers []int32 `protobuf:"varint,3,rep,packed,name=runNumbers,proto3" json:"runNumbers,omitempty"` - ParentLogId int32 `protobuf:"varint,4,opt,name=parentLogId,proto3" json:"parentLogId,omitempty"` + ParentLogId *int32 `protobuf:"varint,4,opt,name=parentLogId,proto3,oneof" json:"parentLogId,omitempty"` } func (x *LogCreationRequest) Reset() { @@ -197,8 +192,8 @@ func (x *LogCreationRequest) GetRunNumbers() []int32 { } func (x *LogCreationRequest) GetParentLogId() int32 { - if x != nil { - return x.ParentLogId + if x != nil && x.ParentLogId != nil { + return *x.ParentLogId } return 0 } @@ -332,12 +327,12 @@ type Log struct { Attachments []*Attachment `protobuf:"bytes,1,rep,name=attachments,proto3" json:"attachments,omitempty"` Author *User `protobuf:"bytes,2,opt,name=author,proto3" json:"author,omitempty"` // Unix timestamp when this entity was created. - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - Id int32 `protobuf:"varint,4,opt,name=id,proto3" json:"id,omitempty"` - Origin []LogOrigin `protobuf:"varint,5,rep,packed,name=origin,proto3,enum=o2.bookkeeping.LogOrigin" json:"origin,omitempty"` - ParentLogId int32 `protobuf:"varint,6,opt,name=parentLogId,proto3" json:"parentLogId,omitempty"` - Replies int32 `protobuf:"varint,7,opt,name=Replies,proto3" json:"Replies,omitempty"` - RootLogId int32 `protobuf:"varint,8,opt,name=rootLogId,proto3" json:"rootLogId,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + Id int32 `protobuf:"varint,4,opt,name=id,proto3" json:"id,omitempty"` + Origin *LogOrigin `protobuf:"varint,5,opt,name=origin,proto3,enum=o2.bookkeeping.LogOrigin,oneof" json:"origin,omitempty"` + ParentLogId int32 `protobuf:"varint,6,opt,name=parentLogId,proto3" json:"parentLogId,omitempty"` + Replies int32 `protobuf:"varint,7,opt,name=Replies,proto3" json:"Replies,omitempty"` + RootLogId int32 `protobuf:"varint,8,opt,name=rootLogId,proto3" json:"rootLogId,omitempty"` // Array of minified Run objects. Runs []*MinimalRun `protobuf:"bytes,9,rep,name=runs,proto3" json:"runs,omitempty"` Subsystems []*Subsystem `protobuf:"bytes,10,rep,name=subsystems,proto3" json:"subsystems,omitempty"` @@ -409,11 +404,11 @@ func (x *Log) GetId() int32 { return 0 } -func (x *Log) GetOrigin() []LogOrigin { - if x != nil { - return x.Origin +func (x *Log) GetOrigin() LogOrigin { + if x != nil && x.Origin != nil { + return *x.Origin } - return nil + return LogOrigin_LOG_ORIGIN_NULL } func (x *Log) GetParentLogId() int32 { @@ -722,117 +717,119 @@ var file_protos_log_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x80, 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x43, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x0a, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xbe, 0x04, 0x0a, 0x03, - 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x31, 0x0a, - 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x19, 0x2e, - 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, - 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, - 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, - 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, - 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, - 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, - 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3a, 0x0a, 0x0a, - 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, - 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, - 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, - 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x2a, 0x4e, 0x0a, 0x09, 0x4c, - 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, - 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, - 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x55, 0x4d, 0x41, - 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, - 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x0a, - 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x02, - 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1c, - 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, - 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, - 0x45, 0x4e, 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, - 0x6f, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, + 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, + 0x8e, 0x02, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, + 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, + 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, + 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x22, 0xce, 0x04, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, + 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, + 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, + 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, + 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, + 0x67, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, + 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x04, + 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, + 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x75, + 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6b, 0x0a, + 0x09, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x03, 0x54, + 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, + 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, + 0x2a, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, + 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, + 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, + 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, + 0x2a, 0xa7, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, + 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, + 0x54, 0x45, 0x4d, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, + 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, + 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -957,6 +954,8 @@ func file_protos_log_proto_init() { } } } + file_protos_log_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_protos_log_proto_msgTypes[2].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/core/integration/bookkeeping/protos/log.proto b/core/integration/bookkeeping/protos/log.proto index 414099c65..868eb1690 100644 --- a/core/integration/bookkeeping/protos/log.proto +++ b/core/integration/bookkeeping/protos/log.proto @@ -17,7 +17,7 @@ message LogCreationRequest { string title = 1; string text = 2; repeated int32 runNumbers = 3; - int32 parentLogId = 4; + optional int32 parentLogId = 4; } // Low-level messages and enums @@ -43,7 +43,7 @@ message Log { // Unix timestamp when this entity was created. int64 CreatedAt = 3; int32 id = 4; - repeated LogOrigin origin = 5; + optional LogOrigin origin = 5; int32 parentLogId = 6; int32 Replies = 7; int32 rootLogId = 8; @@ -102,5 +102,4 @@ message Tag { int64 updatedAt = 6; // The last person that edited the email/mattermost fields string lastEditedName = 7; - } diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 5a8a4201f..3d04ae474 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.9 +// source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 3266c8a74..55f6b085e 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,13 +1,12 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.25.0 -// protoc v3.6.1 +// protoc-gen-go v1.28.1 +// protoc v3.21.9 // source: protos/run.proto package bkpb import ( - proto "github.com/golang/protobuf/proto" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -21,10 +20,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// This is a compile-time assertion that a sufficiently up-to-date version -// of the legacy proto package is being used. -const _ = proto.ProtoPackageIsVersion4 - type RunCreationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -40,7 +35,7 @@ type RunCreationRequest struct { Dcs bool `protobuf:"varint,8,opt,name=dcs,proto3" json:"dcs,omitempty"` Epn bool `protobuf:"varint,9,opt,name=epn,proto3" json:"epn,omitempty"` EpnTopology string `protobuf:"bytes,10,opt,name=epnTopology,proto3" json:"epnTopology,omitempty"` - OdcTopologyFullName string `protobuf:"bytes,11,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` + OdcTopologyFullName *string `protobuf:"bytes,11,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` Detectors []Detector `protobuf:"varint,12,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` } @@ -147,8 +142,8 @@ func (x *RunCreationRequest) GetEpnTopology() string { } func (x *RunCreationRequest) GetOdcTopologyFullName() string { - if x != nil { - return x.OdcTopologyFullName + if x != nil && x.OdcTopologyFullName != nil { + return *x.OdcTopologyFullName } return "" } @@ -165,21 +160,20 @@ type RunUpdateRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - RunQuality RunQuality `protobuf:"varint,2,opt,name=runQuality,proto3,enum=o2.bookkeeping.RunQuality" json:"runQuality,omitempty"` - TimeO2Start int64 `protobuf:"varint,3,opt,name=timeO2Start,proto3" json:"timeO2Start,omitempty"` - TimeO2End int64 `protobuf:"varint,4,opt,name=timeO2End,proto3" json:"timeO2End,omitempty"` - TimeTrgStart int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3" json:"timeTrgStart,omitempty"` - TimeTrgEnd int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3" json:"timeTrgEnd,omitempty"` - TriggerValue string `protobuf:"bytes,7,opt,name=triggerValue,proto3" json:"triggerValue,omitempty"` - PdpConfigOption string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3" json:"pdpConfigOption,omitempty"` - PdpTopologyDescriptionLibraryFile string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3" json:"pdpTopologyDescriptionLibraryFile,omitempty"` - TfbDdMode string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3" json:"tfbDdMode,omitempty"` - LhcPeriod string `protobuf:"bytes,11,opt,name=lhcPeriod,proto3" json:"lhcPeriod,omitempty"` - OdcTopologyFullName string `protobuf:"bytes,12,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` - PdpWorkflowParameters string `protobuf:"bytes,13,opt,name=pdpWorkflowParameters,proto3" json:"pdpWorkflowParameters,omitempty"` - PdpBeamType string `protobuf:"bytes,14,opt,name=pdpBeamType,proto3" json:"pdpBeamType,omitempty"` - ReadoutCfgUri string `protobuf:"bytes,15,opt,name=readoutCfgUri,proto3" json:"readoutCfgUri,omitempty"` + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + TimeO2Start *int64 `protobuf:"varint,3,opt,name=timeO2Start,proto3,oneof" json:"timeO2Start,omitempty"` + TimeO2End *int64 `protobuf:"varint,4,opt,name=timeO2End,proto3,oneof" json:"timeO2End,omitempty"` + TimeTrgStart *int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` + TimeTrgEnd *int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` + TriggerValue *string `protobuf:"bytes,7,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + PdpConfigOption *string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3,oneof" json:"pdpConfigOption,omitempty"` + PdpTopologyDescriptionLibraryFile *string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3,oneof" json:"pdpTopologyDescriptionLibraryFile,omitempty"` + TfbDdMode *string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3,oneof" json:"tfbDdMode,omitempty"` + LhcPeriod *string `protobuf:"bytes,11,opt,name=lhcPeriod,proto3,oneof" json:"lhcPeriod,omitempty"` + OdcTopologyFullName *string `protobuf:"bytes,12,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` + PdpWorkflowParameters *string `protobuf:"bytes,13,opt,name=pdpWorkflowParameters,proto3,oneof" json:"pdpWorkflowParameters,omitempty"` + PdpBeamType *string `protobuf:"bytes,14,opt,name=pdpBeamType,proto3,oneof" json:"pdpBeamType,omitempty"` + ReadoutCfgUri *string `protobuf:"bytes,15,opt,name=readoutCfgUri,proto3,oneof" json:"readoutCfgUri,omitempty"` } func (x *RunUpdateRequest) Reset() { @@ -221,100 +215,93 @@ func (x *RunUpdateRequest) GetRunNumber() int32 { return 0 } -func (x *RunUpdateRequest) GetRunQuality() RunQuality { - if x != nil { - return x.RunQuality - } - return RunQuality_RUN_QUALITY_NULL -} - func (x *RunUpdateRequest) GetTimeO2Start() int64 { - if x != nil { - return x.TimeO2Start + if x != nil && x.TimeO2Start != nil { + return *x.TimeO2Start } return 0 } func (x *RunUpdateRequest) GetTimeO2End() int64 { - if x != nil { - return x.TimeO2End + if x != nil && x.TimeO2End != nil { + return *x.TimeO2End } return 0 } func (x *RunUpdateRequest) GetTimeTrgStart() int64 { - if x != nil { - return x.TimeTrgStart + if x != nil && x.TimeTrgStart != nil { + return *x.TimeTrgStart } return 0 } func (x *RunUpdateRequest) GetTimeTrgEnd() int64 { - if x != nil { - return x.TimeTrgEnd + if x != nil && x.TimeTrgEnd != nil { + return *x.TimeTrgEnd } return 0 } func (x *RunUpdateRequest) GetTriggerValue() string { - if x != nil { - return x.TriggerValue + if x != nil && x.TriggerValue != nil { + return *x.TriggerValue } return "" } func (x *RunUpdateRequest) GetPdpConfigOption() string { - if x != nil { - return x.PdpConfigOption + if x != nil && x.PdpConfigOption != nil { + return *x.PdpConfigOption } return "" } func (x *RunUpdateRequest) GetPdpTopologyDescriptionLibraryFile() string { - if x != nil { - return x.PdpTopologyDescriptionLibraryFile + if x != nil && x.PdpTopologyDescriptionLibraryFile != nil { + return *x.PdpTopologyDescriptionLibraryFile } return "" } func (x *RunUpdateRequest) GetTfbDdMode() string { - if x != nil { - return x.TfbDdMode + if x != nil && x.TfbDdMode != nil { + return *x.TfbDdMode } return "" } func (x *RunUpdateRequest) GetLhcPeriod() string { - if x != nil { - return x.LhcPeriod + if x != nil && x.LhcPeriod != nil { + return *x.LhcPeriod } return "" } func (x *RunUpdateRequest) GetOdcTopologyFullName() string { - if x != nil { - return x.OdcTopologyFullName + if x != nil && x.OdcTopologyFullName != nil { + return *x.OdcTopologyFullName } return "" } func (x *RunUpdateRequest) GetPdpWorkflowParameters() string { - if x != nil { - return x.PdpWorkflowParameters + if x != nil && x.PdpWorkflowParameters != nil { + return *x.PdpWorkflowParameters } return "" } func (x *RunUpdateRequest) GetPdpBeamType() string { - if x != nil { - return x.PdpBeamType + if x != nil && x.PdpBeamType != nil { + return *x.PdpBeamType } return "" } func (x *RunUpdateRequest) GetReadoutCfgUri() string { - if x != nil { - return x.ReadoutCfgUri + if x != nil && x.ReadoutCfgUri != nil { + return *x.ReadoutCfgUri } return "" } @@ -325,7 +312,7 @@ var file_protos_run_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, @@ -344,68 +331,86 @@ var file_protos_run_proto_rawDesc = []byte{ 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x30, + 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xf8, 0x04, 0x0a, 0x10, 0x52, 0x75, 0x6e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x0a, 0x72, - 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x72, 0x75, 0x6e, - 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, - 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, - 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, - 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x28, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4c, 0x0a, 0x21, 0x70, 0x64, 0x70, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, - 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, - 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x6f, + 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf6, 0x06, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, + 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, + 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x21, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x01, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, + 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, + 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, + 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, + 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, + 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x08, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, + 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, - 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, - 0x55, 0x72, 0x69, 0x32, 0x90, 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, + 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x65, + 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, + 0x72, 0x69, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, + 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, + 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, + 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x32, 0x90, + 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, + 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, + 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -426,22 +431,20 @@ var file_protos_run_proto_goTypes = []interface{}{ (*RunUpdateRequest)(nil), // 1: o2.bookkeeping.RunUpdateRequest (RunType)(0), // 2: o2.bookkeeping.RunType (Detector)(0), // 3: o2.bookkeeping.Detector - (RunQuality)(0), // 4: o2.bookkeeping.RunQuality - (*Run)(nil), // 5: o2.bookkeeping.Run + (*Run)(nil), // 4: o2.bookkeeping.Run } var file_protos_run_proto_depIdxs = []int32{ 2, // 0: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType 3, // 1: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector - 4, // 2: o2.bookkeeping.RunUpdateRequest.runQuality:type_name -> o2.bookkeeping.RunQuality - 0, // 3: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest - 1, // 4: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest - 5, // 5: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run - 5, // 6: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run - 5, // [5:7] is the sub-list for method output_type - 3, // [3:5] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name + 0, // 2: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest + 1, // 3: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest + 4, // 4: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run + 4, // 5: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run + 4, // [4:6] is the sub-list for method output_type + 2, // [2:4] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_protos_run_proto_init() } @@ -476,6 +479,8 @@ func file_protos_run_proto_init() { } } } + file_protos_run_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_protos_run_proto_msgTypes[1].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/core/integration/bookkeeping/protos/run.proto b/core/integration/bookkeeping/protos/run.proto index c0b815db0..e4ec4923b 100644 --- a/core/integration/bookkeeping/protos/run.proto +++ b/core/integration/bookkeeping/protos/run.proto @@ -25,24 +25,23 @@ message RunCreationRequest { bool dcs = 8; bool epn = 9; string epnTopology = 10; - string odcTopologyFullName = 11; + optional string odcTopologyFullName = 11; repeated Detector detectors = 12; } message RunUpdateRequest { int32 runNumber = 1; - RunQuality runQuality = 2; - int64 timeO2Start = 3; - int64 timeO2End = 4; - int64 timeTrgStart = 5; - int64 timeTrgEnd = 6; - string triggerValue = 7; - string pdpConfigOption = 8; - string pdpTopologyDescriptionLibraryFile = 9; - string tfbDdMode = 10; - string lhcPeriod = 11; - string odcTopologyFullName = 12; - string pdpWorkflowParameters = 13; - string pdpBeamType = 14; - string readoutCfgUri = 15; + optional int64 timeO2Start = 3; + optional int64 timeO2End = 4; + optional int64 timeTrgStart = 5; + optional int64 timeTrgEnd = 6; + optional string triggerValue = 7; + optional string pdpConfigOption = 8; + optional string pdpTopologyDescriptionLibraryFile = 9; + optional string tfbDdMode = 10; + optional string lhcPeriod = 11; + optional string odcTopologyFullName = 12; + optional string pdpWorkflowParameters = 13; + optional string pdpBeamType = 14; + optional string readoutCfgUri = 15; } diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index 845d50d4a..6fbb5fd15 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.21.9 +// source: protos/run.proto package bkpb From aded7b6c136bb38a4bd01d2a2e897fc1b2da2a8d Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 14 Nov 2022 16:26:37 +0100 Subject: [PATCH 1461/2352] [core] BK run logs are created even if run failed to start, and run end times are set if missing when a run is stopped. --- core/integration/bookkeeping/plugin.go | 161 +++++++++++++++---------- 1 file changed, 100 insertions(+), 61 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 386e49ac4..c82f6a2fa 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -283,6 +283,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value["DETECTOR_"+name])) } + runNumbers := make([]int32, 0) + runNumbers = append(runNumbers, runNumber32) + inLog := bkpb.LogCreationRequest{ + RunNumbers: runNumbers, + Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), + Text: env.GetVarsAsString(), + ParentLogId: nil, + } + + timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber). + WithField("partition", envId). + WithField("call", "LogServiceClient.Create"). + Error("Bookkeeping API LogServiceClient: Create error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("runNumber", runNumber). + WithField("partition", envId). + Debug("Bookkeeping API LogServiceClient: Create call successful") + } + inRun := bkpb.RunCreationRequest{ RunNumber: runNumber32, EnvironmentId: env.Id().String(), @@ -298,8 +327,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detectors: detectorsList, } - timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) defer cancel() _, err = p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) if err != nil { @@ -353,38 +382,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). Debug("Bookkeeping API FlpServiceClient: CreateMany call successful") } - - runNumbers := make([]int32, 0) - runNumbers = append(runNumbers, runNumber32) - inLog := bkpb.LogCreationRequest{ - RunNumbers: runNumbers, - Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), - Text: env.GetVarsAsString(), - ParentLogId: nil, - } - - timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) - ctx, cancel = context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "LogServiceClient.Create"). - Error("Bookkeeping API LogServiceClient: Create error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("Bookkeeping API LogServiceClient: Create call successful") - } return } - updateRunFunc := func(runNumber64 int64, state string, timeO2Start string, timeO2End string, timeTrgStart string, timeTrgEnd string) (out string) { + updateRunFunc := func(runNumber64 int64, state string, timeO2StartInput string, timeO2EndInput string, timeTrgStartInput string, timeTrgEndInput string) (out string) { callFailedStr := "Bookkeeping UpdateRun call failed" trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { @@ -451,60 +451,64 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] - timeO2S, err := strconv.ParseInt(timeO2Start, 10, 64) + var timeO2StartOutput *int64 = nil + timeO2StartTemp, err := strconv.ParseInt(timeO2StartInput, 10, 64) if err != nil { log.WithField("runNumber", runNumber64). - WithField("time", timeO2Start). + WithField("time", timeO2StartInput). Warning("cannot parse O2 start time") - timeO2S = -1 + timeO2StartTemp = -1 } - if timeO2Start == "" || timeO2S <= 0 { - timeO2S = -1 + if timeO2StartInput != "" || timeO2StartTemp > 0 { + timeO2StartOutput = &timeO2StartTemp } - var timeO2E int64 = -1 - if timeO2End != "" { - timeO2E, err = strconv.ParseInt(timeO2End, 10, 64) + var timeO2EndTemp int64 = -1 + var timeO2EndOutput *int64 = nil + if timeO2EndInput != "" { + timeO2EndTemp, err = strconv.ParseInt(timeO2EndInput, 10, 64) if err != nil { log.WithField("runNumber", runNumber64). - WithField("time", timeO2End). + WithField("time", timeO2EndInput). Warning("cannot parse O2 end time") - timeO2E = -1 + timeO2EndTemp = -1 } } - if timeO2End == "" || timeO2E <= 0 { - timeO2E = -1 + if timeO2EndInput != "" || timeO2EndTemp > 0 { + timeO2EndOutput = &timeO2EndTemp } - var timeTrgS int64 = -1 - var timeTrgE int64 = -1 + var timeTrgStartTemp int64 = -1 + var timeTrgStartOutput *int64 = nil + var timeTrgEndTemp int64 = -1 + var timeTrgEndOutput *int64 = nil if trg == "LTU" || trg == "CTP" { - timeTrgS, err = strconv.ParseInt(timeTrgStart, 10, 64) + timeTrgStartTemp, err = strconv.ParseInt(timeTrgStartInput, 10, 64) if err != nil { log.WithField("runNumber", runNumber64). - WithField("time", timeTrgStart). + WithField("time", timeTrgStartInput). Warning("cannot parse Trg start time") - timeTrgS = -1 + timeTrgStartTemp = -1 } - if timeTrgStart == "" || timeTrgS <= 0 { - timeTrgS = -1 + if timeTrgStartInput != "" || timeTrgStartTemp > 0 { + timeTrgStartOutput = &timeTrgStartTemp } - timeTrgE, err = strconv.ParseInt(timeTrgEnd, 10, 64) + timeTrgEndTemp, err = strconv.ParseInt(timeTrgEndInput, 10, 64) if err != nil { log.WithField("runNumber", runNumber64). - WithField("time", timeTrgEnd). + WithField("time", timeTrgEndInput). Warning("cannot parse Trg end time") - timeTrgE = -1 + timeTrgEndTemp = -1 } - if timeTrgEnd == "" || timeTrgE <= 0 { - timeTrgE = -1 + if timeTrgEndInput != "" || timeTrgEndTemp > 0 { + timeTrgEndOutput = &timeTrgEndTemp } } inRun := bkpb.RunUpdateRequest{ RunNumber: int32(runNumber64), - TimeO2Start: &timeO2S, - TimeO2End: &timeO2E, - TimeTrgStart: &timeTrgS, - TimeTrgEnd: &timeTrgE, + TimeO2Start: timeO2StartOutput, + TimeO2End: timeO2EndOutput, + TimeTrgStart: timeTrgStartOutput, + TimeTrgEnd: timeTrgEndOutput, TriggerValue: &trg, PdpConfigOption: &pdpConfig, PdpTopologyDescriptionLibraryFile: &pdpTopology, @@ -535,9 +539,44 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { if p.pendingO2Stops[envId] == "" || (trgEnabled && p.pendingTrgStops[envId] == "") { updatedRun = "INCOMPLETE" + if p.pendingO2Stops[envId] == "" { + timeO2EndTemp = time.Now().UnixMilli() + timeO2EndOutput = &timeO2EndTemp + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 end time") + } + if trgEnabled && p.pendingTrgStops[envId] == "" { + timeTrgEndTemp = time.Now().UnixMilli() + timeTrgEndOutput = &timeO2EndTemp + log.WithField("runNumber", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing Trg end time") + } + inRun = bkpb.RunUpdateRequest{ + RunNumber: int32(runNumber64), + TimeO2End: timeO2EndOutput, + TimeTrgEnd: timeTrgEndOutput, + } log.WithField("runNumber", runNumber64). WithField("partition", envId). - Debug("Bookkeeping API RunServiceClient: Update call: run information incomplete") + Debug("Bookkeeping API RunServiceClient: Update call: completing missing run end time") + + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("runNumber", runNumber64). + WithField("partition", envId). + WithField("call", "RunServiceClient.Update"). + Error("Bookkeeping API RunServiceClient: Update error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } } else { updatedRun = "STOPPED" delete(p.pendingRunStops, envId) From 882cc2b7ccbdeae5a20d9e56b6947775885cffa3 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 15 Nov 2022 12:27:06 +0100 Subject: [PATCH 1462/2352] [core] The Makefile points to the correct BK branch. --- Makefile | 11 ++++++----- core/integration/bookkeeping/client.go | 1 - 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 61c1876a6..5a9faa1c1 100644 --- a/Makefile +++ b/Makefile @@ -39,11 +39,11 @@ endif REPOPATH = github.com/AliceO2Group/Control ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/odc/grpc/odc.proto" DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master/src/DataDistControl/DataDistControl.proto" -BK_COM_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/common.proto" -BK_ENV_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/environment.proto" -BK_FLP_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/flp.proto" -BK_LOG_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/log.proto" -BK_RUN_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/technical/O2B-677/convert-go-api-to-grpc/proto/run.proto" +BK_COM_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/common.proto" +BK_ENV_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/environment.proto" +BK_FLP_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/flp.proto" +BK_LOG_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/log.proto" +BK_RUN_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/run.proto" VERBOSE_1 := -v VERBOSE_2 := -v -x @@ -211,6 +211,7 @@ vendor: @echo -e "\033[1;33mpatch run.proto\033[0m" @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/run.proto + # @echo -e "\033[1;33mdep ensure\033[0m" # @./tools/dep ensure diff --git a/core/integration/bookkeeping/client.go b/core/integration/bookkeeping/client.go index 732eae7fd..656535392 100644 --- a/core/integration/bookkeeping/client.go +++ b/core/integration/bookkeeping/client.go @@ -30,7 +30,6 @@ import ( "github.com/AliceO2Group/Control/common/logger" bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" - //bkpb "github.com/AliceO2Group/Bookkeeping" "github.com/sirupsen/logrus" "github.com/spf13/viper" "google.golang.org/grpc" From 90403991452e2c8dfbbe85f7cdd44fba184f3d57 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 16 Nov 2022 14:43:13 +0100 Subject: [PATCH 1463/2352] [core] The run number is attached to AliECS Bookkeeping plugin messages. --- core/integration/bookkeeping/plugin.go | 156 ++++++++++++++----------- 1 file changed, 91 insertions(+), 65 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index c82f6a2fa..78f78b2c2 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -220,7 +220,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("Bookkeeping plugin SOR error") @@ -240,7 +240,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { epns, err := strconv.ParseInt(env.GetKV("", "odc_n_epns"), 10, 0) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Warning("cannot parse number of EPNs") @@ -248,7 +248,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ddEnabled, err := strconv.ParseBool(env.GetKV("", "dd_enabled")) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Warning("cannot parse DD enabled") @@ -256,7 +256,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEnabled, err := strconv.ParseBool(env.GetKV("", "dcs_enabled")) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Warning("cannot parse DCS enabled") @@ -264,7 +264,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { epnEnabled, err := strconv.ParseBool(env.GetKV("", "epn_enabled")) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Warning("cannot parse EPN enabled") @@ -272,7 +272,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { odcTopology := env.GetKV("", "odc_topology") odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire ODC topology fullname") @@ -283,35 +283,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value["DETECTOR_"+name])) } - runNumbers := make([]int32, 0) - runNumbers = append(runNumbers, runNumber32) - inLog := bkpb.LogCreationRequest{ - RunNumbers: runNumbers, - Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), - Text: env.GetVarsAsString(), - ParentLogId: nil, - } - - timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). - WithField("partition", envId). - WithField("call", "LogServiceClient.Create"). - Error("Bookkeeping API LogServiceClient: Create error") - - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - return - } else { - log.WithField("runNumber", runNumber). - WithField("partition", envId). - Debug("Bookkeeping API LogServiceClient: Create call successful") - } - inRun := bkpb.RunCreationRequest{ RunNumber: runNumber32, EnvironmentId: env.Id().String(), @@ -327,29 +298,84 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detectors: detectorsList, } - timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) - ctx, cancel = context.WithTimeout(context.Background(), timeout) + timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - _, err = p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithField("runNumber", runNumber). + _, err1 := p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) + if err1 != nil { + log.WithError(err1). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunServiceClient.Create"). Error("Bookkeeping API RunServiceClient: Create error") - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr + runNumbers := make([]int32, 0) + inLog := bkpb.LogCreationRequest{ + RunNumbers: runNumbers, + Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), + Text: env.GetVarsAsString(), + ParentLogId: nil, + } + + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err2 := p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) + if err2 != nil { + log.WithError(err2). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "LogServiceClient.Create"). + Error("Bookkeeping API LogServiceClient: Create error") + err = errors.New(err1.Error() + err2.Error()) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("run", runNumber64). + WithField("partition", envId). + Debug("Bookkeeping API LogServiceClient: Create call successful") + } return } else { p.pendingRunStops[envId] = runNumber64 p.pendingO2Stops[envId] = "" p.pendingTrgStops[envId] = "" - log.WithField("runNumber", runNumber). + log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Create call successful") } + runNumbers := make([]int32, 0) + runNumbers = append(runNumbers, runNumber32) + inLog := bkpb.LogCreationRequest{ + RunNumbers: runNumbers, + Title: fmt.Sprintf("Log for run %s and environment %s", rnString, env.Id().String()), + Text: env.GetVarsAsString(), + ParentLogId: nil, + } + + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.LogServiceClient.Create(ctx, &inLog, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "LogServiceClient.Create"). + Error("Bookkeeping API LogServiceClient: Create error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } else { + log.WithField("run", runNumber64). + WithField("partition", envId). + Debug("Bookkeeping API LogServiceClient: Create call successful") + } + var inFlps = bkpb.ManyFlpsCreationRequest{ Flps: make([]*bkpb.FlpCreationRequest, len(flps)), } @@ -369,7 +395,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { _, err = p.bookkeepingClient.FlpServiceClient.CreateMany(ctx, &inFlps, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("runNumber", runNumber). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "FlpServiceClient.CreateMany"). Error("Bookkeeping API FlpServiceClient: CreateMany error") @@ -378,7 +404,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error"] = callFailedStr return } else { - log.WithField("runNumber", runNumber). + log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API FlpServiceClient: CreateMany call successful") } @@ -389,7 +415,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot parse TRG global run enabled") @@ -397,7 +423,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { trgEnabled, err := strconv.ParseBool(env.GetKV("", "trg_enabled")) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot parse TRG enabled") @@ -414,28 +440,28 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } pdpConfig, ok := varStack["pdp_config_option"] if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire PDP workflow configuration mode") } pdpTopology, ok := varStack["pdp_topology_description_library_file"] if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire PDP topology description library file") } pdpParameters, ok := varStack["pdp_workflow_parameters"] if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire PDP workflow parameters") } pdpBeam, ok := varStack["pdp_beam_type"] if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire PDP beam type") @@ -443,7 +469,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { tfbMode := env.GetKV("", "tfb_dd_mode") odcTopologyFullname, ok := env.Workflow().GetVars().Get("odc_topology_fullname") if !ok { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRun"). Warning("cannot acquire ODC topology fullname") @@ -454,7 +480,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var timeO2StartOutput *int64 = nil timeO2StartTemp, err := strconv.ParseInt(timeO2StartInput, 10, 64) if err != nil { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("time", timeO2StartInput). Warning("cannot parse O2 start time") timeO2StartTemp = -1 @@ -467,7 +493,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if timeO2EndInput != "" { timeO2EndTemp, err = strconv.ParseInt(timeO2EndInput, 10, 64) if err != nil { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("time", timeO2EndInput). Warning("cannot parse O2 end time") timeO2EndTemp = -1 @@ -483,7 +509,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if trg == "LTU" || trg == "CTP" { timeTrgStartTemp, err = strconv.ParseInt(timeTrgStartInput, 10, 64) if err != nil { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("time", timeTrgStartInput). Warning("cannot parse Trg start time") timeTrgStartTemp = -1 @@ -493,7 +519,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeTrgEndTemp, err = strconv.ParseInt(timeTrgEndInput, 10, 64) if err != nil { - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("time", timeTrgEndInput). Warning("cannot parse Trg end time") timeTrgEndTemp = -1 @@ -526,7 +552,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunServiceClient.Update"). Error("Bookkeeping API RunServiceClient: Update error") @@ -542,14 +568,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if p.pendingO2Stops[envId] == "" { timeO2EndTemp = time.Now().UnixMilli() timeO2EndOutput = &timeO2EndTemp - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 end time") } if trgEnabled && p.pendingTrgStops[envId] == "" { timeTrgEndTemp = time.Now().UnixMilli() timeTrgEndOutput = &timeO2EndTemp - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing Trg end time") } @@ -558,7 +584,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { TimeO2End: timeO2EndOutput, TimeTrgEnd: timeTrgEndOutput, } - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Update call: completing missing run end time") @@ -568,7 +594,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunServiceClient.Update"). Error("Bookkeeping API RunServiceClient: Update error") @@ -586,7 +612,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { updatedRun = "STARTED" } - log.WithField("runNumber", runNumber64). + log.WithField("run", runNumber64). WithField("updated to", updatedRun). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Update call successful") @@ -614,7 +640,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRunStart"). Error("Bookkeeping plugin UpdateRunStart error") @@ -656,7 +682,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "UpdateRunStop"). Error("Bookkeeping plugin UpdateRunStop error") From ed69498345a6337b14c28f6afbfef402aa228000 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Nov 2022 14:12:01 +0100 Subject: [PATCH 1464/2352] [core] Amend EPN script call generator according to OCTRL-736 --- core/integration/odc/plugin.go | 74 +++++++++------------------------- 1 file changed, 18 insertions(+), 56 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index b7f126166..e9e185c61 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -301,7 +301,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter var ( pdpConfigOption, o2DPSource, tfbDDMode string pdpLibraryFile, pdpLibWorkflowName string - pdpDetectorList, pdpDetectorListQc, pdpDetectorListCalib string + pdpDetectorList, pdpDetectorExcludeListQc, pdpDetectorExcludeListCalib string pdpWorkflowParams string pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string @@ -422,59 +422,23 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", strings.TrimSpace(pdpDetectorList))) - pdpDetectorListQc, ok = varStack["pdp_detector_list_qc"] + pdpDetectorExcludeListQc, ok = varStack["pdp_detector_exclude_list_qc"] if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP workflow name in topology library file") + Error("cannot acquire QC detector exclude list in topology library file") return } - if strings.TrimSpace(pdpDetectorListQc) == "default" { - pdpDetectorListQc, ok = varStack["detectors"] - if !ok { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire general detector list from varStack") - return - } - detectorsSlice, err := p.parseDetectors(pdpDetectorListQc) - if err != nil { - log.WithField("partition", envId). - WithField("detectorList", pdpDetectorListQc). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse general detector list") - return - } - pdpDetectorListQc = strings.Join(detectorsSlice, ",") - } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_QC='%s'", strings.TrimSpace(pdpDetectorListQc))) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_EXCLUDE_QC='%s'", strings.TrimSpace(pdpDetectorExcludeListQc))) - pdpDetectorListCalib, ok = varStack["pdp_detector_list_calib"] + pdpDetectorExcludeListCalib, ok = varStack["pdp_detector_exclude_list_calib"] if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP workflow name in topology library file") + Error("cannot acquire calibration detector exclude list in topology library file") return } - if strings.TrimSpace(pdpDetectorListCalib) == "default" { - pdpDetectorListCalib, ok = varStack["detectors"] - if !ok { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire general detector list from varStack") - return - } - detectorsSlice, err := p.parseDetectors(pdpDetectorListCalib) - if err != nil { - log.WithField("partition", envId). - WithField("detectorList", pdpDetectorListCalib). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse general detector list") - return - } - pdpDetectorListCalib = strings.Join(detectorsSlice, ",") - } - accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_CALIB='%s'", strings.TrimSpace(pdpDetectorListCalib))) + accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS_EXCLUDE_CALIB='%s'", strings.TrimSpace(pdpDetectorExcludeListCalib))) pdpWorkflowParams, ok = varStack["pdp_workflow_parameters"] if !ok { @@ -602,22 +566,16 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("OVERRIDE_PDPSUITE_VERSION='%s'", pdpO2PdpSuiteVersion)) - pdpQcJsonVersion, ok = varStack["pdp_qcjson_version"] - if !ok { + // SET_QCJSON_VERSION does not come from user input or vars any more, it's instead a direct query to QC runtime + pdpQcJsonVersion, err = apricot.Instance().GetRuntimeEntry("qc", "config_hash") + if err != nil { log.WithField("partition", envId). + WithError(err). WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP QCJson version") + Error("cannot acquire PDP QCJson config_hash from QC runtime KV") return } - if strings.TrimSpace(pdpQcJsonVersion) == "default" { // if UI sends 'default', we look in Consul - pdpQcJsonVersion, ok = configStack["pdp_qcjson_version"] - if !ok { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP QCJson version default") - return - } - } + accumulator = append(accumulator, fmt.Sprintf("SET_QCJSON_VERSION='%s'", pdpQcJsonVersion)) epnStoreRawDataFraction, ok = varStack["epn_store_raw_data_fraction"] @@ -688,11 +646,15 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter out = strings.Join(accumulator, " ") // before we ship out the payload, we take the hash of the full string and prepend a last variable with the - // hash of everything else that follows + // hash of everything else that follows, except ECS_ENVIRONMENT_ID, the only variable that must stay unhashed + // see https://alice.its.cern.ch/jira/browse/OCTRL-736 hash := md5.Sum([]byte(out)) hashS := hex.EncodeToString(hash[:]) out = fmt.Sprintf("GEN_TOPO_CACHE_HASH=%s", hashS) + " " + out + // finally we prepend ECS_ENVIRONMENT_ID + out = fmt.Sprintf("ECS_ENVIRONMENT_ID=%s", envId) + " " + out + return } stack["GenerateEPNTopologyFullname"] = func() (out string) { From ade19ea08334721574afaa054b2b2382d3430ac2 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 10 Nov 2022 11:21:15 +0100 Subject: [PATCH 1465/2352] [OCTRL-718] Task and environment workflow files should get trimmed when there are leading/trailing newlines. --- core/environment/utils.go | 28 ++++++++++++++++++---------- core/task/manager.go | 10 ++++++++-- core/workflow/load.go | 10 ++++++++-- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/core/environment/utils.go b/core/environment/utils.go index 791425bfb..5b2fc684a 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -27,9 +27,11 @@ package environment import ( "bytes" "encoding/json" + "errors" "fmt" - "io/ioutil" + "os" "sort" + "strings" "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" @@ -43,14 +45,20 @@ func parseWorkflowPublicInfo(workflowExpr string) (bool, string, error) { return false, "", err } - yamlFile, err := ioutil.ReadFile(resolvedWorkflowPath) - if err != nil { + yamlFile, err := os.ReadFile(resolvedWorkflowPath) + if err != nil { return false, "", err } + if strings.HasPrefix(string(yamlFile), "\n") || strings.HasSuffix(string(yamlFile), "\n") { + yamlFile = bytes.Trim(yamlFile, "\n") + log.WithError(errors.New("leading and/or trailing newline in config file")). + Warning("worflow public info payload has leading and/or trailing newlines") + } + nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) - if err != nil { + if err != nil { return false, "", err } @@ -79,13 +87,13 @@ func SliceToJSONSlice(slice []string) (payload string, err error) { func sortMapToString(m map[string]string) string { keys := make([]string, 0, len(m)) for k := range m { - keys = append(keys, k) - } - sort.Strings(keys) + keys = append(keys, k) + } + sort.Strings(keys) b := new(bytes.Buffer) - - for _, k := range keys { + + for _, k := range keys { fmt.Fprintf(b, "%s=\"%s\"\n", k, m[k]) } return b.String() -} \ No newline at end of file +} diff --git a/core/task/manager.go b/core/task/manager.go index 243952812..776e6b31c 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -25,10 +25,11 @@ package task import ( + "bytes" "context" "errors" "fmt" - "io/ioutil" + "os" "strings" "sync" "time" @@ -201,10 +202,15 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. } taskTemplatePath := repo.GetTaskTemplatePath(taskClassFile) - yamlData, err = ioutil.ReadFile(taskTemplatePath) + yamlData, err = os.ReadFile(taskTemplatePath) if err != nil { return nil, err } + if strings.HasPrefix(string(yamlData), "\n") || strings.HasSuffix(string(yamlData), "\n") { + yamlData = bytes.Trim(yamlData, "\n") + log.WithError(errors.New("leading and/or trailing newline in config file")). + Warning("task template payload has leading and/or trailing newlines") + } taskClassStruct := taskclass.Class{} err = yaml.Unmarshal(yamlData, &taskClassStruct) if err != nil { diff --git a/core/workflow/load.go b/core/workflow/load.go index 46a106aa1..1b6f0b9e8 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -25,9 +25,9 @@ package workflow import ( + "bytes" "errors" "fmt" - "io/ioutil" "os" "strings" "time" @@ -57,11 +57,17 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user } var yamlDoc []byte - yamlDoc, err = ioutil.ReadFile(resolvedWorkflowPath) + yamlDoc, err = os.ReadFile(resolvedWorkflowPath) if err != nil { return } + if strings.HasPrefix(string(yamlDoc), "\n") || strings.HasSuffix(string(yamlDoc), "\n") { + yamlDoc = bytes.Trim(yamlDoc, "\n") + log.WithError(errors.New("leading and/or trailing newline in config file")). + Warning("worflow payload has leading and/or trailing newlines") + } + root = new(aggregatorRole) root.parent = parent err = yaml.Unmarshal(yamlDoc, root) From ab804479cb2719f1d80040c215115454a3000f9c Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 10 Nov 2022 15:35:22 +0100 Subject: [PATCH 1466/2352] [OCTRL-718] Revert wrong changes. --- apricot/local/serviceutil.go | 9 ++++++++- core/environment/utils.go | 13 ++----------- core/task/manager.go | 6 ------ core/workflow/load.go | 7 ------- 4 files changed, 10 insertions(+), 25 deletions(-) diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index de6803f0d..2e9b8736b 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -25,6 +25,7 @@ package local import ( + "errors" "fmt" "github.com/AliceO2Group/Control/configuration/cfgbackend" @@ -84,7 +85,13 @@ func (s *Service) getStringMap(path string) map[string]string { if v.Type() != cfgbackend.IT_Value { continue } - theMap[k] = v.Value() + if v.Value() == "\n" || k == "" || k == "\n" { + log.WithError(errors.New("empty newline in config file")). + WithField("path", path). + Warning("consul config file has empty lines") + } else { + theMap[k] = v.Value() + } } return theMap } diff --git a/core/environment/utils.go b/core/environment/utils.go index 5b2fc684a..5b6b6dbca 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -27,14 +27,11 @@ package environment import ( "bytes" "encoding/json" - "errors" "fmt" - "os" - "sort" - "strings" - "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" + "os" + "sort" ) func parseWorkflowPublicInfo(workflowExpr string) (bool, string, error) { @@ -50,12 +47,6 @@ func parseWorkflowPublicInfo(workflowExpr string) (bool, string, error) { return false, "", err } - if strings.HasPrefix(string(yamlFile), "\n") || strings.HasSuffix(string(yamlFile), "\n") { - yamlFile = bytes.Trim(yamlFile, "\n") - log.WithError(errors.New("leading and/or trailing newline in config file")). - Warning("worflow public info payload has leading and/or trailing newlines") - } - nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) if err != nil { diff --git a/core/task/manager.go b/core/task/manager.go index 776e6b31c..63f6f4724 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -25,7 +25,6 @@ package task import ( - "bytes" "context" "errors" "fmt" @@ -206,11 +205,6 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. if err != nil { return nil, err } - if strings.HasPrefix(string(yamlData), "\n") || strings.HasSuffix(string(yamlData), "\n") { - yamlData = bytes.Trim(yamlData, "\n") - log.WithError(errors.New("leading and/or trailing newline in config file")). - Warning("task template payload has leading and/or trailing newlines") - } taskClassStruct := taskclass.Class{} err = yaml.Unmarshal(yamlData, &taskClassStruct) if err != nil { diff --git a/core/workflow/load.go b/core/workflow/load.go index 1b6f0b9e8..2904e78a1 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -25,7 +25,6 @@ package workflow import ( - "bytes" "errors" "fmt" "os" @@ -62,12 +61,6 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user return } - if strings.HasPrefix(string(yamlDoc), "\n") || strings.HasSuffix(string(yamlDoc), "\n") { - yamlDoc = bytes.Trim(yamlDoc, "\n") - log.WithError(errors.New("leading and/or trailing newline in config file")). - Warning("worflow payload has leading and/or trailing newlines") - } - root = new(aggregatorRole) root.parent = parent err = yaml.Unmarshal(yamlDoc, root) From 31c3ad7710a8067084061dd2bb3dff3e32e590a5 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 15 Nov 2022 21:52:48 +0100 Subject: [PATCH 1467/2352] [OCTRL-718] Leading/trailing whitespaces are trimmed from Consul KV imported variables if the flag trimSpaceInVarsFromConsulKV is true. --- apricot/local/serviceutil.go | 14 +++++++++++--- core/config.go | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index 2e9b8736b..f2b3803bc 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -27,6 +27,8 @@ package local import ( "errors" "fmt" + "github.com/spf13/viper" + "strings" "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" @@ -85,10 +87,16 @@ func (s *Service) getStringMap(path string) map[string]string { if v.Type() != cfgbackend.IT_Value { continue } - if v.Value() == "\n" || k == "" || k == "\n" { - log.WithError(errors.New("empty newline in config file")). + if v.Value() != strings.TrimSpace(v.Value()) { + valueToStore := v.Value() + log.WithError(errors.New("leading or trailing space in value")). WithField("path", path). - Warning("consul config file has empty lines") + WithField("key", k). + Warning("Consul var has leading/trailing space in its value") + if viper.GetBool("trimSpaceInVarsFromConsulKV") { + valueToStore = strings.TrimSpace(v.Value()) + } + theMap[k] = valueToStore } else { theMap[k] = v.Value() } diff --git a/core/config.go b/core/config.go index da91f3633..8e61b0e09 100644 --- a/core/config.go +++ b/core/config.go @@ -115,6 +115,7 @@ func setDefaults() error { viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") + viper.SetDefault("trimSpaceInVarsFromConsulKV", true) return nil } @@ -173,6 +174,7 @@ func setFlags() error { pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") + pflag.Bool("trimSpaceInVarsFromConsulKV", viper.GetBool("trimSpaceInVarsFromConsulKV"), "When true, the variables imported from the Consul KV are trimmed if the contain whitespaces") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From 5fe0052f594cd805b0ae30eeda321c5312bb44c2 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 17 Nov 2022 09:46:18 +0100 Subject: [PATCH 1468/2352] [OCTRL-718][apricot] Consul vars are correctly trimmed if they contain whitespaces. --- apricot/config.go | 2 ++ apricot/local/serviceutil.go | 20 +++++++++++++------- core/config.go | 2 -- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/apricot/config.go b/apricot/config.go index 723cf7f01..3669a0b22 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -43,6 +43,7 @@ func setDefaults() error { viper.SetDefault("runtimeBasePath", "o2/runtime") viper.SetDefault("workingDir", "/var/lib/o2/apricot") viper.SetDefault("verbose", false) + viper.SetDefault("trimSpaceInVarsFromConsulKV", true) return nil } @@ -51,6 +52,7 @@ func setFlags() error { pflag.Int("httpListenPort", viper.GetInt("listenPort"), "Port of apricot http server") pflag.String("backendUri", viper.GetString("backendUri"), "URI of the Consul server or YAML configuration file") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") + pflag.Bool("trimSpaceInVarsFromConsulKV", viper.GetBool("trimSpaceInVarsFromConsulKV"), "When true, the variables imported from the Consul KV are trimmed if the contain whitespaces") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index f2b3803bc..fe133ca76 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -83,18 +83,24 @@ func (s *Service) getStringMap(path string) map[string]string { if tree.Type() == cfgbackend.IT_Map { responseMap := tree.Map() theMap := make(map[string]string, len(responseMap)) + trimSpaces := viper.GetBool("trimSpaceInVarsFromConsulKV") for k, v := range responseMap { if v.Type() != cfgbackend.IT_Value { continue } - if v.Value() != strings.TrimSpace(v.Value()) { + if trimmedValue := strings.TrimSpace(v.Value()); v.Value() != trimmedValue { valueToStore := v.Value() - log.WithError(errors.New("leading or trailing space in value")). - WithField("path", path). - WithField("key", k). - Warning("Consul var has leading/trailing space in its value") - if viper.GetBool("trimSpaceInVarsFromConsulKV") { - valueToStore = strings.TrimSpace(v.Value()) + if trimSpaces { + log.WithError(errors.New("leading or trailing space in value")). + WithField("path", path). + WithField("key", k). + Warning("found unsanitized string value in configuration backend, returning whitespace-trimmed string") + valueToStore = trimmedValue + } else { + log.WithError(errors.New("leading or trailing space in value")). + WithField("path", path). + WithField("key", k). + Warning("found unsanitized string value in configuration backend, returning anyway") } theMap[k] = valueToStore } else { diff --git a/core/config.go b/core/config.go index 8e61b0e09..da91f3633 100644 --- a/core/config.go +++ b/core/config.go @@ -115,7 +115,6 @@ func setDefaults() error { viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") - viper.SetDefault("trimSpaceInVarsFromConsulKV", true) return nil } @@ -174,7 +173,6 @@ func setFlags() error { pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") - pflag.Bool("trimSpaceInVarsFromConsulKV", viper.GetBool("trimSpaceInVarsFromConsulKV"), "When true, the variables imported from the Consul KV are trimmed if the contain whitespaces") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From 027847c413d59a6444114ec875f36bfd150b1a7d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 8 Nov 2022 17:09:04 +0100 Subject: [PATCH 1469/2352] [core] Bring back optional concurrency in workflow processing --- core/config.go | 4 ++ core/workflow/aggregatorrole.go | 40 ++++++++++++++-- core/workflow/iteratorrole.go | 81 +++++++++++++++++++++++++++++---- core/workflow/load.go | 9 ++++ go.mod | 2 + go.sum | 2 + 6 files changed, 125 insertions(+), 13 deletions(-) diff --git a/core/config.go b/core/config.go index da91f3633..a98ab6f02 100644 --- a/core/config.go +++ b/core/config.go @@ -115,6 +115,8 @@ func setDefaults() error { viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") + viper.SetDefault("concurrentWorkflowTemplateProcessing", true) + viper.SetDefault("concurrentIteratorRoleExpansion", true) return nil } @@ -173,6 +175,8 @@ func setFlags() error { pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") + pflag.Bool("concurrentWorkflowTemplateProcessing", viper.GetBool("concurrentWorkflowTemplateProcessing"), "Process workflow templates concurrently") + pflag.Bool("concurrentIteratorRoleExpansion", viper.GetBool("concurrentIteratorRoleExpansion"), "Expand iterator roles concurrently during workflow template processing") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index aaec9a918..00a429921 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -27,6 +27,7 @@ package workflow import ( "errors" "strings" + "sync" texttemplate "text/template" "github.com/AliceO2Group/Control/common/event" @@ -35,7 +36,9 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/the" "github.com/gobwas/glob" + "github.com/hashicorp/go-multierror" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) type aggregatorRole struct { @@ -149,13 +152,42 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf r.Roles = make([]Role, 0) } - // Process templates for child roles - for _, role := range r.Roles { - role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + // Process templates for child roles (concurrently + fallback) + concurrency := viper.GetBool("concurrentWorkflowTemplateProcessing") + + if concurrency { + var wg sync.WaitGroup + wg.Add(len(r.Roles)) + + var roleErrors *multierror.Error + + // Process templates for child roles + for roleIdx, _ := range r.Roles { + go func(roleIdx int) { + defer wg.Done() + role := r.Roles[roleIdx] + role.setParent(r) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + roleErrors = multierror.Append(roleErrors, err) + } + }(roleIdx) + } + wg.Wait() + + err = roleErrors.ErrorOrNil() // only return error if at least one error was accumulated, otherwise nil if err != nil { return } + + } else { + for _, role := range r.Roles { + role.setParent(r) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } + } } // If any child is not Enabled after template resolution, diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 854ae6202..cdd3ca352 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "sync" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" @@ -33,6 +34,8 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" "github.com/gobwas/glob" + "github.com/hashicorp/go-multierror" + "github.com/spf13/viper" ) type iteratorRole struct { @@ -157,12 +160,40 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo return } - // Process templates for child roles - for _, role := range i.Roles { - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + // Process templates for child roles (concurrently + fallback) + concurrency := viper.GetBool("concurrentWorkflowTemplateProcessing") + + if concurrency { + var wg sync.WaitGroup + wg.Add(len(i.Roles)) + + var roleErrors *multierror.Error + + // Process templates for child roles + for roleIdx, _ := range i.Roles { + go func(roleIdx int) { + defer wg.Done() + role := i.Roles[roleIdx] + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + roleErrors = multierror.Append(roleErrors, err) + } + }(roleIdx) + } + wg.Wait() + + err = roleErrors.ErrorOrNil() // only return error if at least one error was accumulated, otherwise nil if err != nil { return } + + } else { + for _, role := range i.Roles { + err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + if err != nil { + return + } + } } // If any child is not Enabled after template resolution, @@ -196,15 +227,47 @@ func (i *iteratorRole) expandTemplate() (err error) { return } - for _, localValue := range ran { - locals := make(map[string]string) - locals[i.For.GetVar()] = localValue - var newRole Role - newRole, err = i.template.generateRole(locals) + concurrency := viper.GetBool("concurrentIteratorRoleExpansion") + + if concurrency { + var wg sync.WaitGroup + wg.Add(len(ran)) + + var roleErrors *multierror.Error + roles = make([]Role, len(ran)) + + for rangeIdx, _ := range ran { + go func(rangeIdx int) { + defer wg.Done() + localValue := ran[rangeIdx] + locals := make(map[string]string) + locals[i.For.GetVar()] = localValue + var newRole Role + newRole, err = i.template.generateRole(locals) + if err != nil { + roleErrors = multierror.Append(roleErrors, err) + return + } + roles[rangeIdx] = newRole + }(rangeIdx) + } + wg.Wait() + + err = roleErrors.ErrorOrNil() // only return error if at least one error was accumulated, otherwise nil if err != nil { return } - roles = append(roles, newRole) + } else { + for _, localValue := range ran { + locals := make(map[string]string) + locals[i.For.GetVar()] = localValue + var newRole Role + newRole, err = i.template.generateRole(locals) + if err != nil { + return + } + roles = append(roles, newRole) + } } i.Roles = roles diff --git a/core/workflow/load.go b/core/workflow/load.go index 2904e78a1..eaf6b6d49 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -106,6 +106,15 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user defer f.Close() } + if !viper.GetBool("concurrentWorkflowTemplateProcessing") { + log.WithField("workflow", workflowPath). + Warn("concurrent workflow template processing is disabled, this will cause a performance hit") + } + if !viper.GetBool("concurrentIteratorRoleExpansion") { + log.WithField("workflow", workflowPath). + Warn("concurrent iterator role expansion is disabled, this will cause a performance hit") + } + err = workflow.ProcessTemplates(workflowRepo, loadSubworkflow) if err != nil { log.WithError(err).Warn("workflow loading failed: template processing error") diff --git a/go.mod b/go.mod index a9c9b8c3a..7aa1ff657 100644 --- a/go.mod +++ b/go.mod @@ -88,10 +88,12 @@ require ( github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect + github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect diff --git a/go.sum b/go.sum index 6d56b90f1..7d75ec828 100644 --- a/go.sum +++ b/go.sum @@ -298,6 +298,8 @@ github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= +github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= +github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= From b13b7b9499cd3f551fdc52992c8cc87f22c7d6fc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Nov 2022 17:11:19 +0100 Subject: [PATCH 1470/2352] [coconut] Integrated services data in coconut env show --- coconut/cmd/environment_show.go | 9 +++--- coconut/control/control.go | 9 ++++++ coconut/control/controlutil.go | 49 +++++++++++++++++++++++++++------ 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/coconut/cmd/environment_show.go b/coconut/cmd/environment_show.go index fde89ee64..d1b190781 100644 --- a/coconut/cmd/environment_show.go +++ b/coconut/cmd/environment_show.go @@ -34,13 +34,13 @@ import ( // environmentShowCmd represents the environment list command var environmentShowCmd = &cobra.Command{ - Use: "show [environment id]", + Use: "show [environment id]", Aliases: []string{"get", "s", "g"}, - Short: "show environment information", + Short: "show environment information", Long: fmt.Sprintf(`The environment show command requests from %s the details of an existing environment.`, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.ShowEnvironment), - Args: cobra.ExactArgs(1), + Run: control.WrapCall(control.ShowEnvironment), + Args: cobra.ExactArgs(1), } func init() { @@ -48,4 +48,5 @@ func init() { environmentShowCmd.Flags().BoolP("tasks", "t", false, "print a list of tasks in this environment") environmentShowCmd.Flags().BoolP("workflow", "w", false, "print the workflow tree") + environmentShowCmd.Flags().BoolP("services", "s", false, "print information on this environment from integrated services") } diff --git a/coconut/control/control.go b/coconut/control/control.go index 429ef0cf7..21b5ec2f3 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -485,6 +485,10 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com if err != nil { return } + printIntegratedServicesData, err := cmd.Flags().GetBool("services") + if err != nil { + return + } var response *pb.GetEnvironmentReply response, err = rpc.GetEnvironment(cxt, &pb.GetEnvironmentRequest{Id: args[0], ShowWorkflowTree: true}, grpc.EmptyCallOption{}) @@ -539,6 +543,11 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com fmt.Fprintf(o, "\nworkflow:\n") drawWorkflow(response.GetWorkflow(), o) } + + if printIntegratedServicesData { + fmt.Fprintf(o, "\nintegrated services:\n") + drawIntegratedServicesData(response.GetEnvironment().GetIntegratedServicesData(), o) + } return } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index e8a7b617c..a6d719b32 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -25,24 +25,27 @@ package control import ( + "encoding/json" "fmt" "io" "strconv" + "strings" "time" "github.com/AliceO2Group/Control/coconut/protos" "github.com/fatih/color" "github.com/olekukonko/tablewriter" "github.com/xlab/treeprint" + "gopkg.in/yaml.v3" ) -var( - blue = color.New(color.FgHiBlue).SprintFunc() - green = color.New(color.FgHiGreen).SprintFunc() +var ( + blue = color.New(color.FgHiBlue).SprintFunc() + green = color.New(color.FgHiGreen).SprintFunc() yellow = color.New(color.FgHiYellow).SprintFunc() - red = color.New(color.FgHiRed).SprintFunc() - grey = color.New(color.FgWhite).SprintFunc() - dark = color.New(color.FgHiBlack).SprintFunc() + red = color.New(color.FgHiRed).SprintFunc() + grey = color.New(color.FgWhite).SprintFunc() + dark = color.New(color.FgHiBlack).SprintFunc() ) func formatRunNumber(rn uint32) string { @@ -79,7 +82,6 @@ func colorGlobalState(st string) string { } } - func colorStateFromNode(node *pb.RoleInfo) string { return colorState(node.GetState()) } @@ -88,7 +90,7 @@ func buildTree(tree *treeprint.Tree, node *pb.RoleInfo, level int) { if len(node.Roles) != 0 { branch := (*tree).AddMetaBranch(colorStateFromNode(node), node.GetName()) for _, n := range node.Roles { - buildTree(&branch, n, level + 1) + buildTree(&branch, n, level+1) } } else { var nodeText string @@ -121,6 +123,37 @@ func drawWorkflow(root *pb.RoleInfo, o io.Writer) { _, _ = fmt.Fprint(o, tree.String()) } +func drawIntegratedServicesData(services map[string]string, o io.Writer) { + if len(services) == 0 { + return + } + + for serviceName, serviceData := range services { + data := strings.TrimSpace(serviceData) + if len(data) == 0 || data == "null" || data == "{}" { + continue + } + + var serviceDataMap map[string]interface{} + err := json.Unmarshal([]byte(serviceData), &serviceDataMap) + if err != nil { + _, _ = fmt.Fprintf(o, "%s: %s\n", serviceName, serviceData) + + continue + } + + dataYaml, err := yaml.Marshal(serviceDataMap) + if err != nil { + _, _ = fmt.Fprintf(o, "%s:\n%s\n", serviceName, serviceData) + } + + dataYamlLines := strings.Split(string(dataYaml), "\n") + for _, line := range dataYamlLines { + _, _ = fmt.Fprintf(o, "%s%s\n", " ", line) + } + } +} + type linePrintFunc func(t *pb.ShortTaskInfo) []string func drawTableShortTaskInfos(tasks []*pb.ShortTaskInfo, headers []string, linePrint linePrintFunc, o io.Writer) { From b78a5211cab8f86a0dc615390c65074f68317f27 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Nov 2022 09:24:55 +0100 Subject: [PATCH 1471/2352] [coconut] Suppress warning --- coconut/control/control.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 21b5ec2f3..58d289b4a 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -540,12 +540,12 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com } if printWorkflow { - fmt.Fprintf(o, "\nworkflow:\n") + _, _ = fmt.Fprintf(o, "\nworkflow:\n") drawWorkflow(response.GetWorkflow(), o) } if printIntegratedServicesData { - fmt.Fprintf(o, "\nintegrated services:\n") + _, _ = fmt.Fprintf(o, "\nintegrated services:\n") drawIntegratedServicesData(response.GetEnvironment().GetIntegratedServicesData(), o) } return From 6639926ae968352f65f5cc8a784ef59525699fdd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Nov 2022 15:03:20 +0100 Subject: [PATCH 1472/2352] [core] Concurrent WFT expansion defaults to false for now --- core/config.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/config.go b/core/config.go index a98ab6f02..f200f0635 100644 --- a/core/config.go +++ b/core/config.go @@ -115,8 +115,8 @@ func setDefaults() error { viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") - viper.SetDefault("concurrentWorkflowTemplateProcessing", true) - viper.SetDefault("concurrentIteratorRoleExpansion", true) + viper.SetDefault("concurrentWorkflowTemplateProcessing", false) + viper.SetDefault("concurrentIteratorRoleExpansion", false) return nil } From d254ce2cae8f0437993828baa496835202574101 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Fri, 12 Aug 2022 09:25:42 +0200 Subject: [PATCH 1473/2352] [OCTRL-649] First modifications for allowing non-critical tasks to go into ERROR without the system failing. --- core/environment/environment.go | 3 +++ core/environment/manager.go | 3 +++ core/environment/transition_deploy.go | 3 +++ core/task/errors.go | 5 ++-- core/task/manager.go | 37 ++++++++++++++++++--------- core/task/state.go | 5 +++- core/workflow/aggregator.go | 15 ++++++----- core/workflow/aggregatorrole.go | 3 +++ core/workflow/safestate.go | 13 +++++++--- core/workflow/taskrole.go | 5 ++++ 10 files changed, 68 insertions(+), 24 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index e463fc230..937b3ed5d 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -496,6 +496,9 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map } } + //////////////// + // CHECK HERE // + //////////////// case e := <-env.incomingEvents: if evt, ok := e.(*event.BasicTaskTerminated); ok { tid := evt.GetOrigin().TaskId.Value diff --git a/core/environment/manager.go b/core/environment/manager.go index f7ae96ac5..1b0dbe575 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -549,6 +549,9 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { return doFallthrough: fallthrough + //////////////// + // CHECK HERE // + //////////////// case pb.DeviceEventType_END_OF_STREAM: taskId := evt.GetOrigin().TaskId t := envs.taskman.GetTask(taskId.Value) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index d3fae6379..ebc9fc88a 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -169,6 +169,9 @@ func (t DeployTransition) do(env *Environment) (err error) { return*/ + //////////////// + // CHECK HERE // + //////////////// notifyStatus := make(chan task.Status) subscriptionId := uuid.NewUUID().String() env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) diff --git a/core/task/errors.go b/core/task/errors.go index f233ee6fd..49a97cda7 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -77,11 +77,12 @@ func (r GenericTasksError) Error() string { type TasksDeploymentError struct { tasksErrorBase - failedDescriptors Descriptors + failedDescriptors Descriptors + failedCriticalDescriptors Descriptors } func (r TasksDeploymentError) Error() string { - return fmt.Sprintf("deployment failed for %d tasks [%s]", len(r.failedDescriptors), r.failedDescriptors.String()) + return fmt.Sprintf("deployment failed for %d critical tasks [%s], and %d non-critical tasks [%s]", len(r.failedCriticalDescriptors), r.failedCriticalDescriptors.String(), len(r.failedDescriptors), r.failedDescriptors.String()) } type TaskAlreadyReleasedError taskErrorBase diff --git a/core/task/manager.go b/core/task/manager.go index 63f6f4724..c6f6acdcb 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -444,6 +444,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // - awaiting Task deployment in tasksToRun deploymentSuccess := true // hopefully undeployedDescriptors := make(Descriptors, 0) + undeployedCriticalDescriptors := make(Descriptors, 0) deployedTasks := make(DeploymentMap) if len(tasksToRun) > 0 { @@ -489,23 +490,34 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) if len(deployedTasks) != len(tasksToRun) { - // ↑ Not all roles could be deployed. We cannot proceed - // with running this environment, but we keep the roles - // running since they might be useful in the future. + // ↑ Not all roles could be deployed. If some were critical, + // we cannot proceed with running this environment. Either way, + // we keep the roles running since they might be useful in the future. log.WithField("partition", envId). Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) - for _, v := range undeployedDescriptors.StringSlice() { - log.WithField("partition", envId). - Errorf("task deployment failure: %s", v) - } - deploymentSuccess = false + //////////////// + // CHECK HERE // + //////////////// + for _, t := range undeployedDescriptors { + if t.TaskRole.GetTaskTraits().Critical == true { + deploymentSuccess = false + undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, t) + printname := fmt.Sprintf("%s->%s", t.TaskRole.GetPath(), t.TaskClassName) + log.WithField("partition", envId). + Errorf("critical task deployment failure: %s", printname) + } else { + printname := fmt.Sprintf("%s->%s", t.TaskRole.GetPath(), t.TaskClassName) + log.WithField("partition", envId). + Warnf("non-critical task deployment failure: %s", printname) + } + } } } if deploymentSuccess { - // ↑ means all the required processes are now running, and we - // are ready to update the envId + // ↑ means all the required critical processes are now running, + // and we are ready to update the envId for taskPtr, descriptor := range deployedTasks { taskPtr.SetParent(descriptor.TaskRole) // Ensure everything is filled out properly @@ -526,8 +538,9 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } err = TasksDeploymentError{ - tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, - failedDescriptors: undeployedDescriptors, + tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, + failedDescriptors: undeployedDescriptors, + failedCriticalDescriptors: undeployedCriticalDescriptors, } } diff --git a/core/task/state.go b/core/task/state.go index c12455517..f442e9862 100644 --- a/core/task/state.go +++ b/core/task/state.go @@ -25,6 +25,7 @@ package task type State int + const ( UNKNOWN State = iota STANDBY @@ -54,7 +55,6 @@ func (s State) String() string { return _names[s] } - func StateFromString(s string) State { for i, v := range _names { if s == v { @@ -64,6 +64,9 @@ func StateFromString(s string) State { return UNKNOWN } +//////////////// +// CHECK HERE // +//////////////// func (s State) X(other State) State { if s == other { return s diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index 4642d34ed..d0b4b766a 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -33,7 +33,7 @@ import ( ) type aggregator struct { - Roles []Role `yaml:"roles,omitempty"` + Roles []Role `yaml:"roles,omitempty"` } func (r *aggregator) copy() copyable { @@ -48,13 +48,13 @@ func (r *aggregator) copy() copyable { // Auxiliary types for unmarshaling type _unionTypeProbe struct { - For *struct{} - Task *struct{} - Roles []interface{} - Call *struct{} + For *struct{} + Task *struct{} + Roles []interface{} + Call *struct{} Include *string } -type _roleUnion struct{ +type _roleUnion struct { *iteratorRole *aggregatorRole *taskRole @@ -62,6 +62,9 @@ type _roleUnion struct{ *includeRole } +//////////////// +// CHECK HERE // +//////////////// func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { _probe := _unionTypeProbe{} unionErr = unmarshal(&_probe) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 00a429921..bb7d8f402 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -239,6 +239,9 @@ func (r *aggregatorRole) updateStatus(s task.Status) { } } +//////////////// +// CHECK HERE // +//////////////// func (r *aggregatorRole) updateState(s task.State) { if r == nil { return diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 4aa62aa16..5238ed8b3 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -25,15 +25,19 @@ package workflow import ( - "sync" "github.com/AliceO2Group/Control/core/task" + "sync" ) type SafeState struct { - mu sync.RWMutex + mu sync.RWMutex state task.State } +// ////////////// +// CHECK HERE // +// ////////////// +// Aggregate the state of multiple tasks using the "task/state.go" X function func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { state = task.INVARIANT @@ -54,6 +58,9 @@ func aggregateState(roles []Role) (state task.State) { return } +// ////////////// +// CHECK HERE // +// ////////////// func (t *SafeState) merge(s task.State, r Role) { t.mu.Lock() defer t.mu.Unlock() @@ -63,7 +70,7 @@ func (t *SafeState) merge(s task.State, r Role) { _, isTaskRole := r.(*taskRole) _, isCallRole := r.(*callRole) - if isTaskRole || isCallRole { // no aggregation, we just update + if isTaskRole || isCallRole { // no aggregation, we just update t.state = s return } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index ccedd029a..99bee5bd0 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -94,6 +94,11 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } } + //////////////// + // CHECK HERE // + //////////////// + // If the task has a "Critical" trait set to either true or false, assign it to the Task Role + // Else, the Task Role is always Critical := true if aux.Task.Critical != nil { // default for critical is always true role.Critical = *aux.Task.Critical } else { From 02df8893837a9aedef144440ac1d0de472ce96d0 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 6 Sep 2022 16:11:41 +0200 Subject: [PATCH 1474/2352] [OCTRL-649] Second iteration of implementation of non-critical tasks. --- core/environment/environment.go | 3 -- core/environment/manager.go | 31 +++++++++-- core/environment/transition_deploy.go | 3 -- core/task/errors.go | 6 +-- core/task/manager.go | 76 +++++++++++++++++++++------ core/task/state.go | 3 -- core/workflow/aggregator.go | 3 -- core/workflow/aggregatorrole.go | 3 -- core/workflow/safestate.go | 7 --- core/workflow/taskrole.go | 5 -- 10 files changed, 89 insertions(+), 51 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 937b3ed5d..e463fc230 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -496,9 +496,6 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map } } - //////////////// - // CHECK HERE // - //////////////// case e := <-env.incomingEvents: if evt, ok := e.(*event.BasicTaskTerminated); ok { tid := evt.GetOrigin().TaskId.Value diff --git a/core/environment/manager.go b/core/environment/manager.go index 1b0dbe575..d41e93587 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -79,19 +79,43 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage switch typedEvent := incomingEvent.(type) { case event.DeviceEvent: instance.handleDeviceEvent(typedEvent) + case *event.TasksReleasedEvent: // If we got a TasksReleasedEvent, it must be matched with a pending - // environment teardown. + // environment teardown if the task is critical. if thisEnvCh, ok := instance.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent close(thisEnvCh) delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + } else { + var releaseCriticalTask = false + for _, v := range typedEvent.GetTaskIds() { + if tm.GetTask(v).GetTraits().Critical == true || tm.GetTask(v).GetParent().GetTaskTraits().Critical == true { + releaseCriticalTask = true + } + } + if releaseCriticalTask { + thisEnvCh <- typedEvent + close(thisEnvCh) + delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + } } + case *event.TasksStateChangedEvent: // If we got a TasksStateChangedEvent, it must be matched with a pending - // environment transition. + // environment transition if the task is critical. if thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent + } else { + var changeCriticalTask = false + for _, v := range typedEvent.GetTaskIds() { + if tm.GetTask(v).GetTraits().Critical == true || tm.GetTask(v).GetParent().GetTaskTraits().Critical == true { + changeCriticalTask = true + } + } + if changeCriticalTask { + thisEnvCh <- typedEvent + } } default: // noop @@ -549,9 +573,6 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { return doFallthrough: fallthrough - //////////////// - // CHECK HERE // - //////////////// case pb.DeviceEventType_END_OF_STREAM: taskId := evt.GetOrigin().TaskId t := envs.taskman.GetTask(taskId.Value) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index ebc9fc88a..d3fae6379 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -169,9 +169,6 @@ func (t DeployTransition) do(env *Environment) (err error) { return*/ - //////////////// - // CHECK HERE // - //////////////// notifyStatus := make(chan task.Status) subscriptionId := uuid.NewUUID().String() env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) diff --git a/core/task/errors.go b/core/task/errors.go index 49a97cda7..a1a48f6f3 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -77,12 +77,12 @@ func (r GenericTasksError) Error() string { type TasksDeploymentError struct { tasksErrorBase - failedDescriptors Descriptors - failedCriticalDescriptors Descriptors + failedNonCriticalDescriptors Descriptors + failedCriticalDescriptors Descriptors } func (r TasksDeploymentError) Error() string { - return fmt.Sprintf("deployment failed for %d critical tasks [%s], and %d non-critical tasks [%s]", len(r.failedCriticalDescriptors), r.failedCriticalDescriptors.String(), len(r.failedDescriptors), r.failedDescriptors.String()) + return fmt.Sprintf("deployment failed for %d critical tasks [%s], and %d non-critical tasks [%s]", len(r.failedCriticalDescriptors), r.failedCriticalDescriptors.String(), len(r.failedNonCriticalDescriptors), r.failedNonCriticalDescriptors.String()) } type TaskAlreadyReleasedError taskErrorBase diff --git a/core/task/manager.go b/core/task/manager.go index c6f6acdcb..e6815d15f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -444,6 +444,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // - awaiting Task deployment in tasksToRun deploymentSuccess := true // hopefully undeployedDescriptors := make(Descriptors, 0) + undeployedNonCriticalDescriptors := make(Descriptors, 0) undeployedCriticalDescriptors := make(Descriptors, 0) deployedTasks := make(DeploymentMap) @@ -496,9 +497,6 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e log.WithField("partition", envId). Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) - //////////////// - // CHECK HERE // - //////////////// for _, t := range undeployedDescriptors { if t.TaskRole.GetTaskTraits().Critical == true { deploymentSuccess = false @@ -507,6 +505,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e log.WithField("partition", envId). Errorf("critical task deployment failure: %s", printname) } else { + undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, t) printname := fmt.Sprintf("%s->%s", t.TaskRole.GetPath(), t.TaskClassName) log.WithField("partition", envId). Warnf("non-critical task deployment failure: %s", printname) @@ -538,9 +537,9 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } err = TasksDeploymentError{ - tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, - failedDescriptors: undeployedDescriptors, - failedCriticalDescriptors: undeployedCriticalDescriptors, + tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, + failedNonCriticalDescriptors: undeployedNonCriticalDescriptors, + failedCriticalDescriptors: undeployedCriticalDescriptors, } } @@ -664,7 +663,8 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } if response.IsMultiResponse() { - taskErrors := make([]string, len(response.Errors())) + taskCriticalErrors := make([]string, 0) + taskNonCriticalErrors := make([]string, 0) i := 0 for k, v := range response.Errors() { task := m.GetTask(k.TaskId.Value) @@ -680,12 +680,20 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } - taskErrors[i] = taskDescription + if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { + taskCriticalErrors[i] = taskDescription + } else { + taskNonCriticalErrors[i] = taskDescription + } i++ } - if len(taskErrors) > 0 { - return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskErrors, "; ")) + if len(taskNonCriticalErrors) > 0 { + log.WithField("partition", envId). + Warnf("non-critical task configuration failure, errors: %s", strings.Join(taskNonCriticalErrors, "; ")) + } + if len(taskCriticalErrors) > 0 { + return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskCriticalErrors, "; ")) } return nil } else { @@ -732,13 +740,49 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s return errors.New("unknown MesosCommand error: nil response received") } - respError := response.Err() - if respError != nil { - errText := respError.Error() - if len(strings.TrimSpace(errText)) != 0 { - return errors.New(response.Err().Error()) + if response.IsMultiResponse() { + taskCriticalErrors := make([]string, 0) + taskNonCriticalErrors := make([]string, 0) + i := 0 + for k, v := range response.Errors() { + task := m.GetTask(k.TaskId.Value) + var taskDescription string + if task != nil { + tci := task.GetTaskCommandInfo() + tciValue := "unknown command" + if tci.Value != nil { + tciValue = *tci.Value + } + + taskDescription = fmt.Sprintf("task '%s' on %s (id %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), v.Error()) + } else { + taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) + } + if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { + taskCriticalErrors[i] = taskDescription + } else { + taskNonCriticalErrors[i] = taskDescription + } + i++ + } + + if len(taskNonCriticalErrors) > 0 { + log.WithField("partition", envId). + Warnf("non-critical task transition failure, errors: %s", strings.Join(taskNonCriticalErrors, "; ")) + } + if len(taskCriticalErrors) > 0 { + return fmt.Errorf("transition could not complete, errors: %s", strings.Join(taskCriticalErrors, "; ")) + } + return nil + } else { + respError := response.Err() + if respError != nil { + errText := respError.Error() + if len(strings.TrimSpace(errText)) != 0 { + return errors.New(response.Err().Error()) + } + // FIXME: improve error handling ↑ } - // FIXME: improve error handling ↑ } return nil diff --git a/core/task/state.go b/core/task/state.go index f442e9862..a4c80fc65 100644 --- a/core/task/state.go +++ b/core/task/state.go @@ -64,9 +64,6 @@ func StateFromString(s string) State { return UNKNOWN } -//////////////// -// CHECK HERE // -//////////////// func (s State) X(other State) State { if s == other { return s diff --git a/core/workflow/aggregator.go b/core/workflow/aggregator.go index d0b4b766a..def4eb46e 100644 --- a/core/workflow/aggregator.go +++ b/core/workflow/aggregator.go @@ -62,9 +62,6 @@ type _roleUnion struct { *includeRole } -//////////////// -// CHECK HERE // -//////////////// func (union *_roleUnion) UnmarshalYAML(unmarshal func(interface{}) error) (unionErr error) { _probe := _unionTypeProbe{} unionErr = unmarshal(&_probe) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index bb7d8f402..00a429921 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -239,9 +239,6 @@ func (r *aggregatorRole) updateStatus(s task.Status) { } } -//////////////// -// CHECK HERE // -//////////////// func (r *aggregatorRole) updateState(s task.State) { if r == nil { return diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 5238ed8b3..f563fccef 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -34,10 +34,6 @@ type SafeState struct { state task.State } -// ////////////// -// CHECK HERE // -// ////////////// -// Aggregate the state of multiple tasks using the "task/state.go" X function func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { state = task.INVARIANT @@ -58,9 +54,6 @@ func aggregateState(roles []Role) (state task.State) { return } -// ////////////// -// CHECK HERE // -// ////////////// func (t *SafeState) merge(s task.State, r Role) { t.mu.Lock() defer t.mu.Unlock() diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 99bee5bd0..ccedd029a 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -94,11 +94,6 @@ func (t *taskRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } } - //////////////// - // CHECK HERE // - //////////////// - // If the task has a "Critical" trait set to either true or false, assign it to the Task Role - // Else, the Task Role is always Critical := true if aux.Task.Critical != nil { // default for critical is always true role.Critical = *aux.Task.Critical } else { From 1a11c4fff9c1398f0167eb7ebd781ec646e2c4fd Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 13 Oct 2022 12:25:35 +0200 Subject: [PATCH 1475/2352] [OCTRL-649] The workflow state is updated correctly when a non-critical is in ERROR. --- core/task/manager.go | 8 ++++---- core/workflow/safestate.go | 19 +++++++++++++++---- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index e6815d15f..eb1380d06 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -681,9 +681,9 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { - taskCriticalErrors[i] = taskDescription + taskCriticalErrors = append(taskCriticalErrors, taskDescription) } else { - taskNonCriticalErrors[i] = taskDescription + taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) } i++ } @@ -759,9 +759,9 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { - taskCriticalErrors[i] = taskDescription + taskCriticalErrors = append(taskCriticalErrors, taskDescription) } else { - taskNonCriticalErrors[i] = taskDescription + taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) } i++ } diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index f563fccef..c9f363e7a 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -34,14 +34,25 @@ type SafeState struct { state task.State } -func aggregateState(roles []Role) (state task.State) { +func aggregateState(roles []Role, s task.State) (state task.State) { if len(roles) == 0 { state = task.INVARIANT return } - state = roles[0].GetState() + state = s if len(roles) > 1 { for _, c := range roles[1:] { + taskR, isTaskRole := c.(*taskRole) + callR, isCallRole := c.(*callRole) + if isTaskRole { + if !taskR.Critical { + continue + } + } else if isCallRole { + if !callR.Critical { + continue + } + } if state == task.MIXED { return } @@ -63,7 +74,7 @@ func (t *SafeState) merge(s task.State, r Role) { _, isTaskRole := r.(*taskRole) _, isCallRole := r.(*callRole) - if isTaskRole || isCallRole { // no aggregation, we just update + if isTaskRole || isCallRole { t.state = s return } @@ -77,7 +88,7 @@ func (t *SafeState) merge(s task.State, r Role) { return default: allRoles := r.GetRoles() - t.state = aggregateState(allRoles) + t.state = aggregateState(allRoles, s) } } From f698506b4a868e67130dcefad0df6e6739bf61be Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 17 Nov 2022 16:22:44 +0100 Subject: [PATCH 1476/2352] [OCTRL-649][core] Corrections after PR review. --- core/environment/manager.go | 23 +++++++++++++++------ core/task/errors.go | 2 +- core/task/manager.go | 8 ++++---- core/workflow/safestate.go | 41 +++++++++++++++++-------------------- 4 files changed, 41 insertions(+), 33 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index d41e93587..540e93757 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -82,16 +82,22 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage case *event.TasksReleasedEvent: // If we got a TasksReleasedEvent, it must be matched with a pending - // environment teardown if the task is critical. + // environment teardown. if thisEnvCh, ok := instance.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent close(thisEnvCh) delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) } else { + // If there is no pending environment teardown, it means that the released task stopped + // unexpectedly. In that case, the environment should get torn-down only if the task + // is critical. var releaseCriticalTask = false for _, v := range typedEvent.GetTaskIds() { - if tm.GetTask(v).GetTraits().Critical == true || tm.GetTask(v).GetParent().GetTaskTraits().Critical == true { - releaseCriticalTask = true + if tm.GetTask(v) != nil { + if tm.GetTask(v).GetTraits().Critical == true { + //|| tm.GetTask(v).GetParent().GetTaskTraits().Critical == true + releaseCriticalTask = true + } } } if releaseCriticalTask { @@ -103,14 +109,19 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage case *event.TasksStateChangedEvent: // If we got a TasksStateChangedEvent, it must be matched with a pending - // environment transition if the task is critical. + // environment transition. if thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { thisEnvCh <- typedEvent } else { + // If there is no pending environment transition, it means that the changed task did so + // unexpectedly. In that case, the environment should transition only if the task + // is critical. var changeCriticalTask = false for _, v := range typedEvent.GetTaskIds() { - if tm.GetTask(v).GetTraits().Critical == true || tm.GetTask(v).GetParent().GetTaskTraits().Critical == true { - changeCriticalTask = true + if tm.GetTask(v) != nil { + if tm.GetTask(v).GetTraits().Critical == true { + changeCriticalTask = true + } } } if changeCriticalTask { diff --git a/core/task/errors.go b/core/task/errors.go index a1a48f6f3..9a40fe7ee 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -82,7 +82,7 @@ type TasksDeploymentError struct { } func (r TasksDeploymentError) Error() string { - return fmt.Sprintf("deployment failed for %d critical tasks [%s], and %d non-critical tasks [%s]", len(r.failedCriticalDescriptors), r.failedCriticalDescriptors.String(), len(r.failedNonCriticalDescriptors), r.failedNonCriticalDescriptors.String()) + return fmt.Sprintf("deployment failed for %d critical tasks, and %d non-critical tasks; critical tasks: [%s]; non-critical tasks: [%s]", len(r.failedCriticalDescriptors), len(r.failedNonCriticalDescriptors), r.failedCriticalDescriptors.String(), r.failedNonCriticalDescriptors.String()) } type TaskAlreadyReleasedError taskErrorBase diff --git a/core/task/manager.go b/core/task/manager.go index eb1380d06..9835ae459 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -690,10 +690,10 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { if len(taskNonCriticalErrors) > 0 { log.WithField("partition", envId). - Warnf("non-critical task configuration failure, errors: %s", strings.Join(taskNonCriticalErrors, "; ")) + Warnf("CONFIGURE could not complete for non-critical tasks, errors: %s", strings.Join(taskNonCriticalErrors, "; ")) } if len(taskCriticalErrors) > 0 { - return fmt.Errorf("CONFIGURE could not complete, errors: %s", strings.Join(taskCriticalErrors, "; ")) + return fmt.Errorf("CONFIGURE could not complete for critical tasks, errors: %s", strings.Join(taskCriticalErrors, "; ")) } return nil } else { @@ -768,10 +768,10 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s if len(taskNonCriticalErrors) > 0 { log.WithField("partition", envId). - Warnf("non-critical task transition failure, errors: %s", strings.Join(taskNonCriticalErrors, "; ")) + Warnf("%s could not complete for non-critical tasks, errors: %s", event, strings.Join(taskNonCriticalErrors, "; ")) } if len(taskCriticalErrors) > 0 { - return fmt.Errorf("transition could not complete, errors: %s", strings.Join(taskCriticalErrors, "; ")) + return fmt.Errorf("%s could not complete for critical tasks, errors: %s", event, strings.Join(taskCriticalErrors, "; ")) } return nil } else { diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index c9f363e7a..08a6be7f7 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -34,33 +34,30 @@ type SafeState struct { state task.State } -func aggregateState(roles []Role, s task.State) (state task.State) { +func aggregateState(roles []Role) (state task.State) { + state = task.INVARIANT if len(roles) == 0 { - state = task.INVARIANT return } - state = s - if len(roles) > 1 { - for _, c := range roles[1:] { - taskR, isTaskRole := c.(*taskRole) - callR, isCallRole := c.(*callRole) - if isTaskRole { - if !taskR.Critical { - continue - } - } else if isCallRole { - if !callR.Critical { - continue - } + for _, c := range roles { + taskR, isTaskRole := c.(*taskRole) + callR, isCallRole := c.(*callRole) + if isTaskRole { + if !taskR.Critical { + continue } - if state == task.MIXED { - return + } else if isCallRole { + if !callR.Critical { + continue } - if state == task.ERROR { - return - } - state = state.X(c.GetState()) } + if state == task.MIXED { + return + } + if state == task.ERROR { + return + } + state = state.X(c.GetState()) } return } @@ -88,7 +85,7 @@ func (t *SafeState) merge(s task.State, r Role) { return default: allRoles := r.GetRoles() - t.state = aggregateState(allRoles, s) + t.state = aggregateState(allRoles) } } From 07de5b0b881bff72d26cf6669fccbf16de71f35d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Nov 2022 16:41:56 +0100 Subject: [PATCH 1477/2352] [build] Bump to v0.56.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 8f5d6fcfd..9127232f6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 55 -VERSION_PATCH := 1 +VERSION_MINOR := 56 +VERSION_PATCH := 0 From 7313a86bea39f7bb210bb870231309f6a8a61c4c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Nov 2022 14:03:25 +0100 Subject: [PATCH 1478/2352] [core] Fix crash in TRG plugin --- VERSION | 2 +- core/integration/trg/plugin.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 9127232f6..6e7e328d5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 56 -VERSION_PATCH := 0 +VERSION_PATCH := 1 diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index a563c40c3..c76de7de3 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -217,8 +217,12 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { p.cachedStatusMu.RLock() defer p.cachedStatusMu.RUnlock() - envMap := p.cachedStatus.EnvMap out := make(map[uid.ID]string) + + if p.cachedStatus == nil { + return nil + } + envMap := p.cachedStatus.EnvMap for _, envId := range envIds { if run, ok := envMap[envId]; !ok { runOut, err := json.Marshal(run) From 8d0710b5843a7a97ef5f487010ab4338650e1a00 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Nov 2022 14:19:24 +0100 Subject: [PATCH 1479/2352] [core] Remove pdp_epn_shm_recreate variable from ODC client --- core/integration/odc/plugin.go | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index e9e185c61..c490e7077 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -311,7 +311,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter accumulator []string pdpO2PdpSuiteVersion, pdpQcJsonVersion string odcNEpnsMaxFail, epnStoreRawDataFraction string - pdpEpnShmId, pdpEpnShmRecreate string + pdpEpnShmId string runType string ) accumulator = make([]string, 0) @@ -596,26 +596,6 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("SHM_MANAGER_SHMID='%s'", pdpEpnShmId)) - pdpEpnShmRecreate, ok = varStack["pdp_epn_shm_recreate"] - if !ok { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP EPN SHM recreate") - return - } - pdpEpnShmRecreateB, err := strconv.ParseBool(pdpEpnShmRecreate) - if err != nil { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse PDP EPN SHM recreate") - pdpEpnShmRecreateB = false - } - pdpEpnShmRecreateI := 0 - if pdpEpnShmRecreateB { - pdpEpnShmRecreateI = 1 - } - accumulator = append(accumulator, fmt.Sprintf("SHM_MANAGER_SHM_RECREATE=%d", pdpEpnShmRecreateI)) - runType, ok = varStack["run_type"] if !ok { log.WithField("partition", envId). From 8888d8183e59a3a5ba5017bb476ffce98c4b8e0f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Nov 2022 14:25:04 +0100 Subject: [PATCH 1480/2352] [core] Keep GEN_TOPO_WIPE_CACHE outside the MD5 cache hash --- core/integration/odc/plugin.go | 45 +++++++++++++++++----------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index c490e7077..a7ec9b334 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -508,26 +508,6 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter } accumulator = append(accumulator, fmt.Sprintf("MULTIPLICITY_FACTOR_REST=%s", strings.TrimSpace(pdpRecoProcessMultiFactor))) - pdpWipeWorkflowCache, ok = varStack["pdp_wipe_workflow_cache"] - if !ok { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire PDP workflow cache wipe option") - return - } - pdpWipeWorkflowCacheB, err := strconv.ParseBool(pdpWipeWorkflowCache) - if err != nil { - log.WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot parse PDP workflow cache wipe option") - pdpWipeWorkflowCacheB = false - } - pdpWipeWorkflowCacheI := 0 - if pdpWipeWorkflowCacheB { - pdpWipeWorkflowCacheI = 1 - } - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WIPE_CACHE=%d", pdpWipeWorkflowCacheI)) - pdpBeamType, ok = varStack["pdp_beam_type"] if !ok { log.WithField("partition", envId). @@ -625,13 +605,34 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter out = strings.Join(accumulator, " ") - // before we ship out the payload, we take the hash of the full string and prepend a last variable with the - // hash of everything else that follows, except ECS_ENVIRONMENT_ID, the only variable that must stay unhashed + // before we ship out the payload, we take the hash of the full string and prepend a few last variables with the + // hash of everything else that follows, except ECS_ENVIRONMENT_ID and GEN_TOPO_WIPE_CACHE, the only + // variables that must stay unhashed // see https://alice.its.cern.ch/jira/browse/OCTRL-736 hash := md5.Sum([]byte(out)) hashS := hex.EncodeToString(hash[:]) out = fmt.Sprintf("GEN_TOPO_CACHE_HASH=%s", hashS) + " " + out + pdpWipeWorkflowCache, ok = varStack["pdp_wipe_workflow_cache"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Warn("cannot acquire PDP workflow cache wipe option, assuming false") + pdpWipeWorkflowCache = "false" + } + pdpWipeWorkflowCacheB, err := strconv.ParseBool(pdpWipeWorkflowCache) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot parse PDP workflow cache wipe option") + pdpWipeWorkflowCacheB = false + } + pdpWipeWorkflowCacheI := 0 + if pdpWipeWorkflowCacheB { + pdpWipeWorkflowCacheI = 1 + } + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WIPE_CACHE=%d", pdpWipeWorkflowCacheI)) + // finally we prepend ECS_ENVIRONMENT_ID out = fmt.Sprintf("ECS_ENVIRONMENT_ID=%s", envId) + " " + out From 4b64cc2253a93bec899317e3d26dc96c6c2fe773 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Nov 2022 16:06:44 +0100 Subject: [PATCH 1481/2352] [core] Fix appending GEN_TOPO_WIPE_CACHE to PDP script call --- core/integration/odc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a7ec9b334..bf4a46b63 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -631,7 +631,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter if pdpWipeWorkflowCacheB { pdpWipeWorkflowCacheI = 1 } - accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_WIPE_CACHE=%d", pdpWipeWorkflowCacheI)) + out = fmt.Sprintf("GEN_TOPO_WIPE_CACHE=%d", pdpWipeWorkflowCacheI) + " " + out // finally we prepend ECS_ENVIRONMENT_ID out = fmt.Sprintf("ECS_ENVIRONMENT_ID=%s", envId) + " " + out From fef2531da194a89f9cfb1bad677d834634037bab Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 23 Nov 2022 16:08:08 +0100 Subject: [PATCH 1482/2352] [doc][core] A quick documentation is added for declaring tasks as non-critical tasks. --- docs/handbook/configuration.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 5c794a61c..553b5b71b 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -1 +1,17 @@ -# Workflow and Task Configuration \ No newline at end of file +# Workflow and Task Configuration + +## Non-critical tasks + +Any task in a workflow can be declared as non-critical. A non-critical task is a task that doesn't trigger a global environment ERROR in case of failure. The state of a non-critical task doesn't affect the environment state in any way. + +To declare a task as non-critical, a line has to be added in the corresponding workflow template. Under the task role, in the `task` section (usually after the `load` statement), the line to add is `critical: false`, like in the following example: + +```yaml +roles: + - name: "non-critical-task" + vars: + non-critical-task-var: 'var-value' + task: + load: mytask + critical: false +``` \ No newline at end of file From ac64e41b130ee370888a3ba4060ad40add9b9ccc Mon Sep 17 00:00:00 2001 From: claireguyot Date: Wed, 23 Nov 2022 16:21:39 +0100 Subject: [PATCH 1483/2352] [doc][core] Wording corrections after PR review. --- docs/handbook/configuration.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 553b5b71b..657b0a5fb 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -4,7 +4,7 @@ Any task in a workflow can be declared as non-critical. A non-critical task is a task that doesn't trigger a global environment ERROR in case of failure. The state of a non-critical task doesn't affect the environment state in any way. -To declare a task as non-critical, a line has to be added in the corresponding workflow template. Under the task role, in the `task` section (usually after the `load` statement), the line to add is `critical: false`, like in the following example: +To declare a task as non-critical, a line has to be added in the task role block within a workflow template file. Specifically, in the task section of such a task role (usually after the `load` statement), the line to add is `critical: false`, like in the following example: ```yaml roles: @@ -14,4 +14,6 @@ roles: task: load: mytask critical: false -``` \ No newline at end of file +``` + +In the absence of an explicit `critical` trait for a given task role, the assumed default value is `critical: true`. \ No newline at end of file From 80097702d53b329bb116abdac2943e0243901249 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Nov 2022 14:32:48 +0100 Subject: [PATCH 1484/2352] [core] Impose a 10s timeout on each ssh cleanup call --- core/environment/transition_deploy.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index d3fae6379..65fb94276 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -25,6 +25,7 @@ package environment import ( + "context" "errors" "fmt" "os/exec" @@ -76,10 +77,13 @@ func (t DeployTransition) do(env *Environment) (err error) { go func(flp string) { defer wg.Done() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + cmdString := "ssh -o StrictHostKeyChecking=no root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" log.WithField("partition", env.Id().String()). Traceln("[cleanup binary] Executing: " + cmdString) - cmd := exec.Command("/bin/bash", "-c", cmdString) + cmd := exec.CommandContext(ctx, "/bin/bash", "-c", cmdString) err = cmd.Run() if err != nil { log.WithField("partition", env.Id().String()). From 7f32e6ed99d6abcb815fbc550d9be7ff2d9b12b3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 25 Nov 2022 16:58:00 +0100 Subject: [PATCH 1485/2352] [core] Make task reuse optional, and disabled by default --- core/config.go | 2 + core/task/manager.go | 121 +++++++++++++++++++++++-------------------- 2 files changed, 67 insertions(+), 56 deletions(-) diff --git a/core/config.go b/core/config.go index f200f0635..26b56dc3b 100644 --- a/core/config.go +++ b/core/config.go @@ -117,6 +117,7 @@ func setDefaults() error { viper.SetDefault("kafkaEndpoint", "localhost:9092") viper.SetDefault("concurrentWorkflowTemplateProcessing", false) viper.SetDefault("concurrentIteratorRoleExpansion", false) + viper.SetDefault("reuseUnlockedTasks", false) return nil } @@ -177,6 +178,7 @@ func setFlags() error { pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") pflag.Bool("concurrentWorkflowTemplateProcessing", viper.GetBool("concurrentWorkflowTemplateProcessing"), "Process workflow templates concurrently") pflag.Bool("concurrentIteratorRoleExpansion", viper.GetBool("concurrentIteratorRoleExpansion"), "Expand iterator roles concurrently during workflow template processing") + pflag.Bool("reuseUnlockedTasks", viper.GetBool("reuseUnlockedTasks"), "Reuse unlocked active tasks when satisfying environment deployment requests") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/task/manager.go b/core/task/manager.go index 9835ae459..5512bf7a9 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -45,6 +45,7 @@ import ( "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/executor/executorutil" "github.com/mesos/mesos-go/api/v1/lib/extras/store" + "github.com/spf13/viper" "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/core/controlcommands" @@ -363,72 +364,80 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // to be torn down and mesosed. // tasksToTeardown := make([]TaskPtr, 0) tasksAlreadyRunning := make(DeploymentMap) - for _, descriptor := range taskDescriptors { - /* - For each descriptor we check m.AgentCache for agent attributes: - this allows us for each idle task in roster, get agentid and plug it in cache to get the - attributes for that host, and then we know whether - 1) a running task of the same class on that agent would qualify - 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify - */ - - // Filter function that accepts a Task if - // a) it's !Locked - // b) has className matching Descriptor - // c) its Agent's Attributes satisfy the Descriptor's Constraints - taskMatches := func(taskPtr *Task) (ok bool) { - if taskPtr != nil { - if taskPtr.IsClaimable() && taskPtr.className == descriptor.TaskClassName { - agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) - taskClass, classFound := m.classes.GetClass(descriptor.TaskClassName) - if classFound && taskClass != nil && agentInfo != nil { - targetConstraints := descriptor. - RoleConstraints.MergeParent(taskClass.Constraints) - if agentInfo.Attributes.Satisfy(targetConstraints) { - ok = true - return + + if viper.GetBool("reuseUnlockedTasks") { + for _, descriptor := range taskDescriptors { + /* + For each descriptor we check m.AgentCache for agent attributes: + this allows us for each idle task in roster, get agentid and plug it in cache to get the + attributes for that host, and then we know whether + 1) a running task of the same class on that agent would qualify + 2) TODO: given enough resources obtained by freeing tasks, that agent would qualify + */ + + // Filter function that accepts a Task if + // a) it's !Locked + // b) has className matching Descriptor + // c) its Agent's Attributes satisfy the Descriptor's Constraints + taskMatches := func(taskPtr *Task) (ok bool) { + if taskPtr != nil { + if taskPtr.IsClaimable() && taskPtr.className == descriptor.TaskClassName { + agentInfo := m.AgentCache.Get(mesos.AgentID{Value: taskPtr.agentId}) + taskClass, classFound := m.classes.GetClass(descriptor.TaskClassName) + if classFound && taskClass != nil && agentInfo != nil { + targetConstraints := descriptor. + RoleConstraints.MergeParent(taskClass.Constraints) + if agentInfo.Attributes.Satisfy(targetConstraints) { + ok = true + return + } } } } + return } - return - } - runningTasksForThisDescriptor := m.roster.filtered(taskMatches) - claimed := false - if len(runningTasksForThisDescriptor) > 0 { - // We have received a list of running, unlocked candidates to take over - // the current Descriptor. - // We now go through them, and if one of them is already claimed in - // tasksAlreadyRunning, we go to the next one until we exhaust our options. - for _, taskPtr := range runningTasksForThisDescriptor { - if _, ok := tasksAlreadyRunning[taskPtr]; ok { - continue - } else { // task not claimed yet, we do so now - tasksAlreadyRunning[taskPtr] = descriptor - claimed = true - detector := "" - parent := taskPtr.GetParent() - if parent != nil { - detector, ok = parent.GetUserVars().Get("detector") - if !ok { - detector = "" + runningTasksForThisDescriptor := m.roster.filtered(taskMatches) + claimed := false + if len(runningTasksForThisDescriptor) > 0 { + // We have received a list of running, unlocked candidates to take over + // the current Descriptor. + // We now go through them, and if one of them is already claimed in + // tasksAlreadyRunning, we go to the next one until we exhaust our options. + for _, taskPtr := range runningTasksForThisDescriptor { + if _, ok := tasksAlreadyRunning[taskPtr]; ok { + continue + } else { // task not claimed yet, we do so now + tasksAlreadyRunning[taskPtr] = descriptor + claimed = true + detector := "" + parent := taskPtr.GetParent() + if parent != nil { + detector, ok = parent.GetUserVars().Get("detector") + if !ok { + detector = "" + } } - } - log.WithField("partition", envId.String()). - WithField("detector", detector). - WithField("class", descriptor.TaskClassName). - WithField("task", taskPtr.className). - WithField("taskHost", taskPtr.hostname). - Warn("claiming existing unlocked task for incoming descriptor") - break + log.WithField("partition", envId.String()). + WithField("detector", detector). + WithField("class", descriptor.TaskClassName). + WithField("task", taskPtr.className). + WithField("taskHost", taskPtr.hostname). + Warn("claiming existing unlocked task for incoming descriptor") + break + } } } - } - if !claimed { - tasksToRun = append(tasksToRun, descriptor) + if !claimed { + // no task can be claimed for the current descriptor, we add it to the list of + // new tasks to run + tasksToRun = append(tasksToRun, descriptor) + } } + } else { + // no task reuse at all, just run tasks for all descriptors + tasksToRun = append(tasksToRun, taskDescriptors...) } // TODO: fill out tasksToTeardown in the previous loop From 5428abb12b01d7f3e255e793a71f31b09a757454 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 28 Nov 2022 13:47:17 +0100 Subject: [PATCH 1486/2352] [core] LeafWalk should also walk in include roles This fixes error messages with missing failed roles: ``` cannot create new environment: transition canceled with error: workflow deployment failed, aborting and cleaning up [failed roles: ] ``` Here it is with the fix: ``` cannot create new environment: transition canceled with error: workflow deployment failed, aborting and cleaning up [failed roles: readout-dataflow.host-piotr-ostack3.data-distribution-dpl.dpl.internal-dpl-injected-dummy-sink] ``` --- core/workflow/roleutils.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 4ad27e08f..e57d67912 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -74,6 +74,11 @@ func Walk(root Role, do func(role Role)) { for _, child := range typed.Roles { LeafWalk(child, do) } + case *includeRole: + do(typed) + for _, child := range typed.Roles { + Walk(child, do) + } case *taskRole: do(typed) case *callRole: @@ -91,6 +96,10 @@ func LeafWalk(root Role, do func(role Role)) { for _, child := range typed.Roles { LeafWalk(child, do) } + case *includeRole: + for _, child := range typed.Roles { + LeafWalk(child, do) + } case *taskRole: do(typed) case *callRole: From 8f48e459be6705007b2a5957724cc80eec081ab7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 28 Nov 2022 14:10:16 +0100 Subject: [PATCH 1487/2352] [core] workflow.Walk needs to recurse without LeafWalk --- core/workflow/roleutils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index e57d67912..288877f2d 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -72,7 +72,7 @@ func Walk(root Role, do func(role Role)) { case *iteratorRole: do(typed) for _, child := range typed.Roles { - LeafWalk(child, do) + Walk(child, do) } case *includeRole: do(typed) From 729715b8717e0112494502f2e488109712bf39c9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 24 Nov 2022 14:43:49 +0100 Subject: [PATCH 1488/2352] [executor] truncate task command in logs when it will be cut This truncates the long DPL commands to leave the part after the last pipe, which is the most crucial to understand what is running. We attempt to print the full command in "launching task" log. Also, the PR removes "cmd" field in logs where it is empty anyway. --- executor/executable/controllabletask.go | 46 +++++++++++-------------- executor/executable/hooktask.go | 2 +- executor/executable/task.go | 4 ++- executor/executorutil/executorutil.go | 19 ++++++++++ executor/handlers.go | 4 --- 5 files changed, 44 insertions(+), 31 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 3cc8d9352..92652988c 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -28,6 +28,7 @@ import ( "context" "encoding/json" "errors" + "github.com/AliceO2Group/Control/executor/executorutil" "io" "io/ioutil" "reflect" @@ -70,7 +71,6 @@ type CommitResponse struct { func (t *ControllableTask) Launch() error { log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -83,7 +83,6 @@ func (t *ControllableTask) Launch() error { defer utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch", log.WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -120,8 +119,9 @@ func (t *ControllableTask) Launch() error { // Anything in the following goroutine must not touch *internalState, except // via channels. go func() { + truncatedCmd := executorutil.TruncateCommandBeforeTheLastPipe(t.Tci.GetValue(), 500) log.WithFields(logrus.Fields{ - "cmd": t.Tci.GetValue(), + "cmd": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -135,16 +135,12 @@ func (t *ControllableTask) Launch() error { stderrIn, _ := taskCmd.StderrPipe() err = taskCmd.Start() - var tciCommandStr string - if t.Tci.Value != nil { - tciCommandStr = *t.Tci.Value - } if err != nil { log.WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err.Error(), - "command": tciCommandStr, + "command": truncatedCmd, "partition": t.knownEnvironmentId.String(), "detector": t.knownDetector, }). @@ -165,7 +161,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "cmd": t.ti.Command.GetValue(), + "cmd": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -243,7 +239,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, }, ), ) @@ -255,7 +251,7 @@ func (t *ControllableTask) Launch() error { "id": t.ti.TaskID.Value, "task": t.ti.Name, "error": err.Error(), - "command": tciCommandStr, + "command": truncatedCmd, }). Error("could not start gRPC client") @@ -270,7 +266,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "command": tciCommandStr, + "command": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -281,7 +277,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "command": tciCommandStr, + "command": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -295,7 +291,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, "elapsed": elapsed.String(), "level": infologger.IL_Devel, }). @@ -309,7 +305,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, }). Info("cannot query task status") } else { @@ -318,7 +314,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "state": response.GetState(), "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, "level": infologger.IL_Devel, }). Debug("task status queried") @@ -332,7 +328,7 @@ func (t *ControllableTask) Launch() error { WithField("detector", t.knownDetector). WithField("id", t.ti.TaskID.Value). WithField("task", t.ti.Name). - WithField("command", tciCommandStr). + WithField("command", truncatedCmd). WithField("level", infologger.IL_Devel). Debug("task running and ready for control input") break @@ -374,7 +370,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("task", t.ti.Name). - WithField("command", tciCommandStr). + WithField("command", truncatedCmd). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) time.Sleep(startupPollingInterval) elapsed += startupPollingInterval @@ -386,7 +382,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "command": tciCommandStr, + "command": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -397,7 +393,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "command": tciCommandStr, + "command": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -433,7 +429,7 @@ func (t *ControllableTask) Launch() error { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ - "command": tciCommandStr, + "command": truncatedCmd, "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, "level": infologger.IL_Devel, @@ -497,7 +493,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, "level": infologger.IL_Devel, }).Debug("task done (taskCmd.Wait unblocks), preparing final update") @@ -508,7 +504,7 @@ func (t *ControllableTask) Launch() error { WithFields(logrus.Fields{ "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, "error": err.Error(), "level": infologger.IL_Devel, }). @@ -517,7 +513,7 @@ func (t *ControllableTask) Launch() error { WithField("detector", t.knownDetector). WithField("level", infologger.IL_Support). Errorf("task terminated with error: %s %s", - tciCommandStr, + truncatedCmd, err.Error()) pendingState = mesos.TASK_FAILED } @@ -547,7 +543,7 @@ func (t *ControllableTask) Launch() error { "errStdout": errStdout, "id": t.ti.TaskID.Value, "task": t.ti.Name, - "command": tciCommandStr, + "command": truncatedCmd, "level": infologger.IL_Devel, }). Warning("failed to capture stdout or stderr of task") diff --git a/executor/executable/hooktask.go b/executor/executable/hooktask.go index 450e93e4f..c0e166e3d 100644 --- a/executor/executable/hooktask.go +++ b/executor/executable/hooktask.go @@ -36,7 +36,7 @@ func (t *HookTask) makeTransitionFunc() transitioner.DoTransitionFunc { // NOOP transition function, because hooks don't obey any transition return func(ei transitioner.EventInfo) (newState string, err error) { log.WithField("partition", t.knownEnvironmentId.String()). - WithField("partition", t.knownDetector). + WithField("detector", t.knownDetector). WithField("event", ei.Evt). Debug("executor hook task transitioner requesting transition") diff --git a/executor/executable/task.go b/executor/executable/task.go index 77cac4cfa..8ce994264 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -102,10 +102,12 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE Debug("instantiating task") rawCommand := strings.Join(append([]string{*commandInfo.Value}, commandInfo.Arguments...), " ") + // we deliberately print taskID, then command, so if the latter is too long for infologger to accept it, + // we at least have the taskID and the beginning of the command. log.WithField("level", infologger.IL_Support). WithField("partition", envId.String()). WithField("detector", detector). - Infof("launching task %s", rawCommand) + Infof("launching task %s: %s", taskInfo.TaskID.GetValue(), rawCommand) } else { if err != nil { log.WithError(err). diff --git a/executor/executorutil/executorutil.go b/executor/executorutil/executorutil.go index 646a98ba3..7b28cef29 100644 --- a/executor/executorutil/executorutil.go +++ b/executor/executorutil/executorutil.go @@ -94,3 +94,22 @@ func GetGroupIDs(targetUser *user.User) ([]uint32, []string) { } return gids, gidStrings } + +// TruncateCommandBeforeTheLastPipe +// DPL commands are often aggregated in pipes, one after another. +// In certain contexts only the piece after the last pipe actually matters, +// while the previous ones only provide awareness of the whole topology. +// The current IL does not allow us to fit messages longer than 1024 characters, +// so we end up with truncated logs anyway. +// This method attempts to keep the piece after the last '|' intact, but will trim anything before +// if the total command length is going to exceed maxLength. +func TruncateCommandBeforeTheLastPipe(cmd string, maxLength int) string { + lastPipeIdx := strings.LastIndex(cmd, "|") + const separator = " |" + if lastPipeIdx == -1 || lastPipeIdx+1 == len(cmd) || len(cmd) < maxLength { + return cmd + } else { + budgetForBeginning := maxLength - (len(cmd) - lastPipeIdx) - len(separator) + return cmd[:budgetForBeginning] + separator + cmd[lastPipeIdx+1:] + } +} diff --git a/executor/handlers.go b/executor/handlers.go index 57ab4e052..a46adc07a 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -244,7 +244,6 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { detector := executorutil.GetValueFromLabelerType(&taskInfo, "detector") log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), "taskId": taskInfo.TaskID.GetValue(), "taskName": taskInfo.Name, "hostname": state.agent.GetHostname(), @@ -256,7 +255,6 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { defer utils.TimeTrack(time.Now(), "executor.handleLaunchEvent", log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), "taskId": taskInfo.TaskID.GetValue(), "taskName": taskInfo.Name, "hostname": state.agent.GetHostname(), @@ -285,7 +283,6 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { state.activeTasks[taskInfo.TaskID] = myTask state.activeTasksMu.Unlock() log.WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), "taskId": taskInfo.TaskID.GetValue(), "taskName": taskInfo.Name, "hostname": state.agent.GetHostname(), @@ -298,7 +295,6 @@ func handleLaunchEvent(state *internalState, taskInfo mesos.TaskInfo) error { // If Launch returned non-nil error, it should already have sent back a status update log.WithError(err). WithFields(logrus.Fields{ - "cmd": taskInfo.Command.GetValue(), "taskId": taskInfo.TaskID.GetValue(), "taskName": taskInfo.Name, "hostname": state.agent.GetHostname(), From 4e4aa870330f2c7c0571fee5ffee336b817778ea Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 23 Nov 2022 16:32:56 +0100 Subject: [PATCH 1489/2352] [core] 'task inactive exception' should be an error log Sometimes this is the only message from aliecs to know which task failed. It is easy to miss when it is Info. It would be even better if it had partition id included, but did not find a way to retrieve it, it is not there even in Labels. --- core/task/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 5512bf7a9..597d66745 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1120,8 +1120,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { "message": mesosStatus.GetMessage(), "level": infologger.IL_Devel, }). - WithField("partition", tm.GetEnvironmentId().String()). - Info("task inactive exception") + WithField("partition", tm.GetEnvironmentId().String()). // fixme: this is empty! + Error("task inactive exception") taskIDValue := mesosStatus.GetTaskID().Value t := m.GetTask(taskIDValue) if t != nil && t.IsLocked() { From 6a0eb224c8fa53db80d8967ec2ca1b93f9001e0a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 29 Nov 2022 09:44:51 +0100 Subject: [PATCH 1490/2352] [apricot] Add method logging to service --- apricot/local/service.go | 62 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/apricot/local/service.go b/apricot/local/service.go index abe9c776c..472eba07e 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -32,12 +32,14 @@ import ( "net/url" "os" "path/filepath" + "runtime" "sort" "strconv" "strings" "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" @@ -97,6 +99,8 @@ func (s *Service) NewRunNumber() (runNumber uint32, err error) { // response: but not all of them! some vars will likely only get parsed at deployment time i.e. right // before pushing TaskInfos func (s *Service) GetDefaults() map[string]string { + s.logMethod() + smap := s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "defaults")) // Fill in some global constants we want to make available everywhere @@ -125,6 +129,8 @@ func (s *Service) GetDefaults() map[string]string { } func (s *Service) ListDetectors(getAll bool) (detectors []string, err error) { + s.logMethod() + keyPrefix := inventoryKeyPrefix + "detectors/" var keys []string keys, err = s.src.GetKeysByPrefix(keyPrefix) @@ -149,6 +155,8 @@ func (s *Service) ListDetectors(getAll bool) (detectors []string, err error) { } func (s *Service) GetHostInventory(detector string) (hosts []string, err error) { + s.logMethod() + var keyPrefix string if detector != "" { keyPrefix = inventoryKeyPrefix + "detectors/" + detector + "/flps/" @@ -175,6 +183,8 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) } func (s *Service) GetDetectorsInventory() (inventory map[string][]string, err error) { + s.logMethod() + inventory = map[string][]string{} detectors, err := s.ListDetectors(true) if err != nil { @@ -193,6 +203,8 @@ func (s *Service) GetDetectorsInventory() (inventory map[string][]string, err er } func (s *Service) GetVars() map[string]string { + s.logMethod() + return s.getStringMap(filepath.Join(getAliECSRuntimePrefix(), "vars")) } @@ -231,6 +243,8 @@ func (s *Service) GenerateWorkflowDescriptor(wfPath string, vars map[string]stri //} func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + s.logMethod() + var absolutePath string absolutePath, err = s.queryToAbsPath(query) if err != nil { @@ -241,6 +255,8 @@ func (s *Service) GetComponentConfiguration(query *componentcfg.Query) (payload } func (s *Service) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var absolutePath string absolutePath, err = s.queryToAbsPath(query) @@ -255,6 +271,8 @@ func (s *Service) GetComponentConfigurationWithLastIndex(query *componentcfg.Que } func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + s.logMethod() + path := query.Path() // We need to decompose the requested GetConfig path into prefix and suffix, @@ -298,6 +316,8 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, } func (s *Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { + s.logMethod() + resolved = &componentcfg.Query{} if query == nil { *resolved = *query @@ -310,6 +330,8 @@ func (s *Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *co } func (s *Service) RawGetRecursive(path string) (string, error) { + s.logMethod() + cfgDump, err := s.src.GetRecursive(path) if err != nil { log.WithError(err).Error("cannot retrieve configuration") @@ -324,6 +346,8 @@ func (s *Service) RawGetRecursive(path string) (string, error) { } func (s *Service) GetDetectorForHost(hostname string) (string, error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "detectors")) if err != nil { @@ -345,6 +369,8 @@ func (s *Service) GetDetectorForHost(hostname string) (string, error) { } func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { + s.logMethod() + detectorMap := make(map[string]struct{}) for _, host := range hosts { det, err := s.GetDetectorForHost(host) @@ -365,6 +391,8 @@ func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { } func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var cards map[string]Cards var serials []string @@ -391,6 +419,8 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { } func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var cards map[string]Cards var endpoints string @@ -411,6 +441,8 @@ func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, e } func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { return cSrc.Get(filepath.Join(getConsulRuntimePrefix(), component, key)) } else { @@ -419,6 +451,8 @@ func (s *Service) GetRuntimeEntry(component string, key string) (string, error) } func (s *Service) SetRuntimeEntry(component string, key string, value string) error { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { return cSrc.Put(filepath.Join(getConsulRuntimePrefix(), component, key), value) } else { @@ -427,6 +461,8 @@ func (s *Service) SetRuntimeEntry(component string, key string, value string) er } func (s *Service) ListRuntimeEntries(component string) ([]string, error) { + s.logMethod() + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { path := filepath.Join(getConsulRuntimePrefix(), component) keys, err := cSrc.GetKeysByPrefix(path) @@ -456,6 +492,8 @@ func (s *Service) ListRuntimeEntries(component string) ([]string, error) { } func (s *Service) ListComponents() (components []string, err error) { + s.logMethod() + keyPrefix := componentcfg.ConfigComponentsPath var keys []string keys, err = s.src.GetKeysByPrefix(keyPrefix) @@ -556,6 +594,8 @@ func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp b } func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { + s.logMethod() + keyPrefix := componentcfg.ConfigComponentsPath if query == nil { err = errors.New("bad query for ListComponentEntries") @@ -579,6 +619,8 @@ func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLat } func (s *Service) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { + s.logMethod() + if query == nil { return } @@ -621,6 +663,8 @@ func (s *Service) ListComponentEntryHistory(query *componentcfg.Query) (entries } func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { + s.logMethod() + if query == nil { return } @@ -703,3 +747,21 @@ func getConsulRuntimePrefix() string { func getAliECSRuntimePrefix() string { return getConsulRuntimePrefix() + "/aliecs" } + +func (s *Service) logMethod() { + if !viper.GetBool("verbose") { + return + } + pc, _, _, ok := runtime.Caller(1) + if !ok { + return + } + fun := runtime.FuncForPC(pc) + if fun == nil { + return + } + log.WithPrefix("rpcserver"). + WithField("method", fun.Name()). + WithField("level", infologger.IL_Devel). + Debug("handling RPC request") +} From 4d62632b10a8eac84479bca83e07c62995ad27a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Dec 2022 14:37:31 +0100 Subject: [PATCH 1491/2352] [build] Bump to v0.57.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 6e7e328d5..045435e27 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 56 -VERSION_PATCH := 1 +VERSION_MINOR := 57 +VERSION_PATCH := 0 From 45cc7373ca8dfe8443aa5aa619fbde3c2d6a5aa3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 5 Dec 2022 14:44:47 +0100 Subject: [PATCH 1492/2352] [core] Fix crash in pre-deployment cleanup error handling --- core/environment/transition_deploy.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 65fb94276..39b41cd80 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" + "github.com/hashicorp/go-multierror" "github.com/pborman/uuid" ) @@ -72,6 +73,7 @@ func (t DeployTransition) do(env *Environment) (err error) { var wg sync.WaitGroup wg.Add(len(flps)) + var scriptErrors *multierror.Error // Execute the cleanup script on all FLPs before the DEPLOY transition commences for _, flp := range flps { go func(flp string) { @@ -84,11 +86,12 @@ func (t DeployTransition) do(env *Environment) (err error) { log.WithField("partition", env.Id().String()). Traceln("[cleanup binary] Executing: " + cmdString) cmd := exec.CommandContext(ctx, "/bin/bash", "-c", cmdString) - err = cmd.Run() - if err != nil { + var localErr error + localErr = cmd.Run() + if localErr != nil { log.WithField("partition", env.Id().String()). Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) - err = nil // don't kill the env if we don't make it + scriptErrors = multierror.Append(scriptErrors, localErr) } else { log.WithField("partition", env.Id().String()). Infof("[cleanup binary] execution successful on %s\n", flp) @@ -97,6 +100,7 @@ func (t DeployTransition) do(env *Environment) (err error) { } wg.Wait() + err = scriptErrors.ErrorOrNil() } // Role tree operations go here, and afterwards we'll generally get a role tree which From 28041f6945f1eed7c9e47183254830dcfad1f750 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 5 Dec 2022 14:58:53 +0100 Subject: [PATCH 1493/2352] [core] Fix typo --- core/environment/transition_deploy.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 39b41cd80..c3ba16247 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -90,7 +90,7 @@ func (t DeployTransition) do(env *Environment) (err error) { localErr = cmd.Run() if localErr != nil { log.WithField("partition", env.Id().String()). - Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, err.Error()) + Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, localErr.Error()) scriptErrors = multierror.Append(scriptErrors, localErr) } else { log.WithField("partition", env.Id().String()). From 43050cf915b2ad04487ef03a4baaf62cc04146e7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 5 Dec 2022 16:25:03 +0100 Subject: [PATCH 1494/2352] [core] Pre-deployment cleanup failure is now a WARNING --- core/environment/transition_deploy.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index c3ba16247..ac49c4f19 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -79,7 +79,7 @@ func (t DeployTransition) do(env *Environment) (err error) { go func(flp string) { defer wg.Done() - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() cmdString := "ssh -o StrictHostKeyChecking=no root@" + flp + " \"source /etc/profile.d/o2.sh && O2_PARTITION=" + env.id.String() + " O2_FACILITY=core/shmcleaner O2_ROLE=" + flp + " /opt/o2/bin/o2-aliecs-shmcleaner\"" @@ -194,7 +194,7 @@ func (t DeployTransition) do(env *Environment) (err error) { t.taskman.MessageChannel <- taskmanMessage } if err != nil { - return + log.Warnf("pre-deployment cleanup, %s", err.Error()) } // We set all callRoles to ACTIVE right now, because there's no task activation for them. From bdeb6c1bbf3bc22f31a849c06c8029c7d992b1ab Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 25 Nov 2022 16:28:09 +0100 Subject: [PATCH 1495/2352] [OCTRL-704][core] template helpers for assigning JIT workflows per groups of FLPs --- configuration/template/dplutil.go | 12 +++++++++-- configuration/template/stack.go | 33 +++++++++++++++++++++++++++++-- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 8ab485a85..7ad80945c 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -137,14 +137,22 @@ func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]st return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh &&"+dplCommand) } -func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string) (jitWorkflowName string, err error) { +func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string, fallbackToTemplate bool) (jitWorkflowName string, err error) { if dplCommandUri == "none" { return "", fmt.Errorf("dplCommand is 'none'") } dplCommand, err := workflowRepo.GetDplCommand(dplCommandUri) if err != nil { - return "", fmt.Errorf("Failed to read DPL command from '%s': %w\n", dplCommandUri, err) + if fallbackToTemplate { + // if a file in JIT is missing, it will try to fallback to a standard workflow template in 'workflows/'. + // effectively, this allows us to have an intermediate switch workflow to select different JIT commands + // for different nodes. + log.Debugf("JIT: There is no file 'jit/%s' with a DPL command, falling back the template at 'workflows/%s'", dplCommandUri, dplCommandUri) + return dplCommandUri, nil + } else { + return "", fmt.Errorf("Failed to read DPL command from '%s': %w\n", dplCommandUri, err) + } } // Resolve any templates as part of the DPL command diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 7ba2d36d3..14f329467 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -171,14 +171,17 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str }, "GenerateDplSubworkflowFromUri": func(dplCommandUri string) (string, error) { log.WithPrefix("template").Warn("GenerateDplSubworkflowFromUri is deprecated, use dpl.GenerateFromUri instead") - return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) + return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri, false) }, "dpl": map[string]interface{}{ "Generate": func(dplCommand string) (string, error) { return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) }, "GenerateFromUri": func(dplCommandUri string) (string, error) { - return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri) + return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri, false) + }, + "GenerateFromUriOrFallbackToTemplate": func(dplCommandUri string) (string, error) { + return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri, true) }, }, } @@ -316,6 +319,32 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { } return *in }, + "HostnameWithin": func(hostname string, prefix string, idMinStr string, idMaxStr string) string { + trimmed := strings.TrimPrefix(hostname, prefix) + if hostname == trimmed { + return "false" + } + id, err := strconv.Atoi(trimmed) + if err != nil { + return "false" + } + idMin, err := strconv.Atoi(idMinStr) + if err != nil { + log.Errorf("Argument idMinStr to HostnameWithin is not a number: %s", idMinStr) + return "false" + } + idMax, err := strconv.Atoi(idMaxStr) + if err != nil { + log.Errorf("Argument idMaxStr to HostnameWithin is not a number: %s", idMaxStr) + return "false" + } + + if id <= idMax && id >= idMin { + return "true" + } else { + return "false" + } + }, } _ = mergo.Merge(&legacy, utilMap) From 250651f00dc0921a3fa601524df6f28f3042bcb4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Nov 2022 08:25:18 +0100 Subject: [PATCH 1496/2352] [core] HostnameWithin -> SuffixInRange --- configuration/template/stack.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 14f329467..fa3350dc1 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -319,9 +319,9 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { } return *in }, - "HostnameWithin": func(hostname string, prefix string, idMinStr string, idMaxStr string) string { - trimmed := strings.TrimPrefix(hostname, prefix) - if hostname == trimmed { + "SuffixInRange": func(input string, prefix string, idMinStr string, idMaxStr string) string { + trimmed := strings.TrimPrefix(input, prefix) + if input == trimmed { return "false" } id, err := strconv.Atoi(trimmed) @@ -330,12 +330,12 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { } idMin, err := strconv.Atoi(idMinStr) if err != nil { - log.Errorf("Argument idMinStr to HostnameWithin is not a number: %s", idMinStr) + log.Errorf("Argument idMinStr to SuffixInRange is not a number: %s", idMinStr) return "false" } idMax, err := strconv.Atoi(idMaxStr) if err != nil { - log.Errorf("Argument idMaxStr to HostnameWithin is not a number: %s", idMaxStr) + log.Errorf("Argument idMaxStr to SuffixInRange is not a number: %s", idMaxStr) return "false" } From 4d47848543f905d500443c00485c2c8bacbb99da Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Dec 2022 11:35:04 +0100 Subject: [PATCH 1497/2352] [executor] Manually handle buffering in task stdout logging --- common/logger/loggercopy.go | 76 +++++++++++++++++++++++++ executor/executable/controllabletask.go | 53 +++++++++++------ 2 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 common/logger/loggercopy.go diff --git a/common/logger/loggercopy.go b/common/logger/loggercopy.go new file mode 100644 index 000000000..8f8263107 --- /dev/null +++ b/common/logger/loggercopy.go @@ -0,0 +1,76 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2022 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package logger + +import ( + "bytes" + "sync" + + "github.com/sirupsen/logrus" +) + +// This file implements a workaround for https://github.com/sirupsen/logrus/issues/564 + +type SafeLogrusWriter struct { + Entry *logrus.Entry + PrintFunc func(...interface{}) + buf bytes.Buffer + mu sync.Mutex +} + +func (w *SafeLogrusWriter) Write(b []byte) (int, error) { + w.mu.Lock() + defer w.mu.Unlock() + + origLen := len(b) + for { + if len(b) == 0 { + return origLen, nil + } + i := bytes.IndexByte(b, '\n') + if i < 0 { + w.buf.Write(b) + return origLen, nil + } + + w.buf.Write(b[:i]) + w.alwaysFlush() + b = b[i+1:] + } +} + +func (w *SafeLogrusWriter) alwaysFlush() { + w.PrintFunc(w.buf.String()) + w.buf.Reset() +} + +func (w *SafeLogrusWriter) Flush() { + w.mu.Lock() + defer w.mu.Unlock() + + if w.buf.Len() != 0 { + w.alwaysFlush() + } +} diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 92652988c..fa48f0d5e 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -28,14 +28,15 @@ import ( "context" "encoding/json" "errors" - "github.com/AliceO2Group/Control/executor/executorutil" "io" - "io/ioutil" "reflect" "strings" "syscall" "time" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/executor/executorutil" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" @@ -174,34 +175,54 @@ func (t *ControllableTask) Launch() error { switch *t.Tci.Log { case "stdout": go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout"). + entry := log.WithPrefix("task-stdout"). WithField("task", t.ti.Name). - WithField("nohooks", true). - WriterLevel(logrus.DebugLevel), stdoutIn) + WithField("nohooks", true) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Debug, + } + _, errStdout = io.Copy(writer, stdoutIn) + writer.Flush() }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr"). + entry := log.WithPrefix("task-stderr"). WithField("task", t.ti.Name). - WithField("nohooks", true). - WriterLevel(logrus.WarnLevel), stderrIn) + WithField("nohooks", true) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Warn, + } + _, errStderr = io.Copy(writer, stderrIn) + writer.Flush() }() case "all": go func() { - _, errStdout = io.Copy(log.WithPrefix("task-stdout"). - WithField("task", t.ti.Name). - WriterLevel(logrus.DebugLevel), stdoutIn) + entry := log.WithPrefix("task-stdout"). + WithField("task", t.ti.Name) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Debug, + } + _, errStdout = io.Copy(writer, stdoutIn) + writer.Flush() }() go func() { - _, errStderr = io.Copy(log.WithPrefix("task-stderr"). - WithField("task", t.ti.Name). - WriterLevel(logrus.WarnLevel), stderrIn) + entry := log.WithPrefix("task-stderr"). + WithField("task", t.ti.Name) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Warn, + } + _, errStderr = io.Copy(writer, stderrIn) + writer.Flush() }() default: go func() { - _, errStdout = io.Copy(ioutil.Discard, stdoutIn) + _, errStdout = io.Copy(io.Discard, stdoutIn) }() go func() { - _, errStderr = io.Copy(ioutil.Discard, stderrIn) + _, errStderr = io.Copy(io.Discard, stderrIn) }() } From cdddbd788a5f38480ba4377d5f99e05de08eab2e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 2 Dec 2022 09:25:38 +0100 Subject: [PATCH 1498/2352] [OCTRL-709][core] pass flp id list to ccdb grp object --- core/integration/ccdb/plugin.go | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 571ec1fbf..4884e72c0 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/AliceO2Group/Control/core/environment" "go/types" "net/url" "os/exec" @@ -57,6 +58,7 @@ type GeneralRunParameters struct { triggeringDetectors []string hbfPerTf uint32 // number of HeartBeatFrames per TimeFrame lhcPeriod string + flpIdList []string } func parseDetectors(detectorsParam string) (detectors []string, err error) { @@ -71,6 +73,32 @@ func parseDetectors(detectorsParam string) (detectors []string, err error) { return detectorsSlice, nil } +func getFlpIdList(envId string) (flps []string, err error) { + parsedEnvId, err := uid.FromString(envId) + if err != nil { + return []string{}, err + } + envMan := environment.ManagerInstance() + env, err := envMan.Environment(parsedEnvId) + if err != nil { + return []string{}, err + } + flpHostnames := env.GetFLPs() + + const flpPrefix = "alio2-cr1-flp" // this way we accept only P2 setups + flpIds := make([]string, 0) + for _, flp := range flpHostnames { + if !strings.HasPrefix(flp, flpPrefix) { + continue + } + id := strings.TrimPrefix(flp, flpPrefix) + if len(id) > 0 { + flpIds = append(flpIds, id) + } + } + return flpIds, nil +} + func NewGRPObject(varStack map[string]string) *GeneralRunParameters { envId, ok := varStack["environment_id"] @@ -192,6 +220,13 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { lhcPeriod = "Unknown" } + flpIds, err := getFlpIdList(envId) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Warningf("could not parse env id, FLP list will be empty") + } + return &GeneralRunParameters{ uint32(runNumber), runType, @@ -202,6 +237,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { triggeringDetectors, uint32(hbfPerTf), lhcPeriod, + flpIds, } } @@ -314,6 +350,9 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin if len(grp.endTimeMs) > 0 { cmd += " -e " + grp.endTimeMs } + if len(grp.flpIdList) > 0 { + cmd += " -f \"" + strings.Join(grp.flpIdList, ",") + "\"" + } cmd += " --ccdb-server " + ccdbUrl return From c8f0c4d3930af51f669208918d4ca53f3f302434 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 29 Nov 2022 12:38:14 +0100 Subject: [PATCH 1499/2352] [OCTRL-744][core] The BK plugin functions GetData and GetEnvironmentsData return pending runs to be stopped. --- core/integration/bookkeeping/plugin.go | 42 +++++++++++++++++++++----- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 78f78b2c2..09e473330 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -102,22 +102,50 @@ func (p *Plugin) GetConnectionState() string { return "READY" } +func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { + if p.pendingRunStops == nil { + return nil + } + + out := make(map[uid.ID]string) + + for _, envId := range envIds { + if runStop, ok := p.pendingRunStops[envId.String()]; ok { + runOut, err := json.Marshal(runStop) + if err != nil { + continue + } + out[envId] = string(runOut[:]) + } else { + out[envId] = "No run still RUNNING" + } + } + return out +} + func (p *Plugin) GetData(_ []any) string { if p == nil || p.bookkeepingClient == nil { return "" } - partitionStates := make(map[string]string) + envIds := environment.ManagerInstance().Ids() + + outMap := make(map[string]interface{}) + outMap["pendingRunStops"] = p.pendingRunStopsForEnvs(envIds) - out, err := json.Marshal(partitionStates) + out, err := json.Marshal(outMap) if err != nil { return "" } return string(out[:]) } -func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { - return nil +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + if p == nil || p.bookkeepingClient == nil { + return nil + } + out := p.pendingRunStopsForEnvs(envIds) + return out } func (p *Plugin) Init(instanceId string) error { @@ -605,10 +633,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } else { updatedRun = "STOPPED" - delete(p.pendingRunStops, envId) - delete(p.pendingO2Stops, envId) - delete(p.pendingTrgStops, envId) } + delete(p.pendingRunStops, envId) + delete(p.pendingO2Stops, envId) + delete(p.pendingTrgStops, envId) } else { updatedRun = "STARTED" } From 78b2d4dfdf5657205dead18bd1c8a03a61bf6373 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 1 Dec 2022 16:23:36 +0100 Subject: [PATCH 1500/2352] [OCTRL-744][core] GetData and GetEnvironmentsData functions return O2 and TRG pending stop info available in the BK plugin. --- core/integration/bookkeeping/plugin.go | 96 ++++++++++++++++++++------ 1 file changed, 74 insertions(+), 22 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 09e473330..2bcd02ee5 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -61,8 +61,8 @@ type Plugin struct { bookkeepingClient *RpcClient pendingRunStops map[string] /*envId*/ int64 - pendingO2Stops map[string] /*envId*/ string - pendingTrgStops map[string] /*envId*/ string + pendingO2Stops map[string] /*envId*/ bool + pendingTrgStops map[string] /*envId*/ bool } func NewPlugin(endpoint string) integration.Plugin { @@ -81,8 +81,8 @@ func NewPlugin(endpoint string) integration.Plugin { bookkeepingPort: portNumber, bookkeepingClient: nil, pendingRunStops: make(map[string]int64), - pendingO2Stops: make(map[string]string), - pendingTrgStops: make(map[string]string), + pendingO2Stops: make(map[string]bool), + pendingTrgStops: make(map[string]bool), } } @@ -111,13 +111,37 @@ func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { for _, envId := range envIds { if runStop, ok := p.pendingRunStops[envId.String()]; ok { - runOut, err := json.Marshal(runStop) - if err != nil { - continue - } - out[envId] = string(runOut[:]) - } else { - out[envId] = "No run still RUNNING" + out[envId] = string(runStop) + } + } + return out +} + +func (p *Plugin) pendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { + if p.pendingO2Stops == nil { + return nil + } + + out := make(map[uid.ID]bool) + + for _, envId := range envIds { + if o2Stop, ok := p.pendingO2Stops[envId.String()]; ok { + out[envId] = o2Stop + } + } + return out +} + +func (p *Plugin) pendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { + if p.pendingTrgStops == nil { + return nil + } + + out := make(map[uid.ID]bool) + + for _, envId := range envIds { + if trgStop, ok := p.pendingTrgStops[envId.String()]; ok { + out[envId] = trgStop } } return out @@ -132,6 +156,8 @@ func (p *Plugin) GetData(_ []any) string { outMap := make(map[string]interface{}) outMap["pendingRunStops"] = p.pendingRunStopsForEnvs(envIds) + outMap["pendingO2Stops"] = p.pendingO2StopsForEnvs(envIds) + outMap["pendingTrgStops"] = p.pendingTrgStopsForEnvs(envIds) out, err := json.Marshal(outMap) if err != nil { @@ -144,7 +170,29 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { if p == nil || p.bookkeepingClient == nil { return nil } - out := p.pendingRunStopsForEnvs(envIds) + + inRunStopMap := p.pendingRunStopsForEnvs(envIds) + inO2StopMap := p.pendingO2StopsForEnvs(envIds) + inTrgStopMap := p.pendingTrgStopsForEnvs(envIds) + + envMap := make(map[string]interface{}) + out := make(map[uid.ID]string) + + for _, envId := range envIds { + if runStop, ok := inRunStopMap[envId]; ok { + envMap["runNumber"] = runStop + } + if o2Stop, ok := inO2StopMap[envId]; ok { + envMap["pendingO2Stop"] = o2Stop + } + if trgStop, ok := inTrgStopMap[envId]; ok { + envMap["pendingTrgStop"] = trgStop + } + outJson, err := json.Marshal(envMap) + if err == nil { + out[envId] = string(outJson[:]) + } + } return out } @@ -368,8 +416,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { p.pendingRunStops[envId] = runNumber64 - p.pendingO2Stops[envId] = "" - p.pendingTrgStops[envId] = "" + p.pendingO2Stops[envId] = true + p.pendingTrgStops[envId] = true log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Create call successful") @@ -591,16 +639,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { var updatedRun string if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { - if p.pendingO2Stops[envId] == "" || (trgEnabled && p.pendingTrgStops[envId] == "") { + defer delete(p.pendingRunStops, envId) + defer delete(p.pendingO2Stops, envId) + defer delete(p.pendingTrgStops, envId) + if p.pendingO2Stops[envId] == true || (trgEnabled && p.pendingTrgStops[envId] == true) { updatedRun = "INCOMPLETE" - if p.pendingO2Stops[envId] == "" { + if p.pendingO2Stops[envId] == true { timeO2EndTemp = time.Now().UnixMilli() timeO2EndOutput = &timeO2EndTemp log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 end time") } - if trgEnabled && p.pendingTrgStops[envId] == "" { + if trgEnabled && p.pendingTrgStops[envId] == true { timeTrgEndTemp = time.Now().UnixMilli() timeTrgEndOutput = &timeO2EndTemp log.WithField("run", runNumber64). @@ -634,9 +685,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { updatedRun = "STOPPED" } - delete(p.pendingRunStops, envId) - delete(p.pendingO2Stops, envId) - delete(p.pendingTrgStops, envId) } else { updatedRun = "STARTED" } @@ -723,11 +771,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { O2StartTime := varStack["run_start_time_ms"] O2EndTime := varStack["run_end_time_ms"] - p.pendingO2Stops[envId] = O2EndTime + if O2EndTime != "" { + p.pendingO2Stops[envId] = false + } TrgStartTime := varStack["trg_start_time_ms"] TrgEndTime := varStack["trg_end_time_ms"] - p.pendingTrgStops[envId] = TrgEndTime + if TrgEndTime != "" { + p.pendingTrgStops[envId] = false + } if _, ok := p.pendingRunStops[envId]; ok { return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) From a713c310d473f174999d5368ab8e2b4fbe395890 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 17 Nov 2022 17:26:26 +0100 Subject: [PATCH 1501/2352] [OCTRL-649][core] Aggregator role should have the correct state between MIXED and ERROR, if it has multiple children roles in those states. --- core/workflow/safestate.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 08a6be7f7..6348565aa 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -39,6 +39,7 @@ func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { return } + var rolesToCheck = make([]Role, 0) for _, c := range roles { taskR, isTaskRole := c.(*taskRole) callR, isCallRole := c.(*callRole) @@ -51,13 +52,20 @@ func aggregateState(roles []Role) (state task.State) { continue } } + state = state.X(c.GetState()) if state == task.MIXED { - return + rolesToCheck = append(rolesToCheck, c) } if state == task.ERROR { - return + rolesToCheck = append(rolesToCheck, c) } - state = state.X(c.GetState()) + } + if len(rolesToCheck) > 0 { + checkedState := state + for _, c := range rolesToCheck { + checkedState = checkedState.X(c.GetState()) + } + state = checkedState } return } From 8d9df0fbc807a3ebba364399a3356d22be5162ad Mon Sep 17 00:00:00 2001 From: claireguyot Date: Tue, 29 Nov 2022 17:13:55 +0100 Subject: [PATCH 1502/2352] [OCTRL-649][core] Correcting MIXED/ERROR logic after PR review. --- core/workflow/safestate.go | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 6348565aa..22a03098e 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -39,7 +39,7 @@ func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { return } - var rolesToCheck = make([]Role, 0) + var hasBeenInError = false for _, c := range roles { taskR, isTaskRole := c.(*taskRole) callR, isCallRole := c.(*callRole) @@ -52,20 +52,13 @@ func aggregateState(roles []Role) (state task.State) { continue } } - state = state.X(c.GetState()) - if state == task.MIXED { - rolesToCheck = append(rolesToCheck, c) - } - if state == task.ERROR { - rolesToCheck = append(rolesToCheck, c) + if c.GetState() == task.ERROR { + hasBeenInError = true } + state = state.X(c.GetState()) } - if len(rolesToCheck) > 0 { - checkedState := state - for _, c := range rolesToCheck { - checkedState = checkedState.X(c.GetState()) - } - state = checkedState + if hasBeenInError && state == task.MIXED { + state = task.ERROR } return } From 362cfd6b8404925aa0e6b5874ba96b42a7927dcf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Dec 2022 11:39:35 +0100 Subject: [PATCH 1503/2352] [build] Bump to v0.58.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 045435e27..ad1943302 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 57 +VERSION_MINOR := 58 VERSION_PATCH := 0 From 688193ff770603ffc3953e4d4195c16521831379 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Dec 2022 13:08:05 +0100 Subject: [PATCH 1504/2352] [core] Do not fail env deployment on cleanup issues --- core/environment/transition_deploy.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index ac49c4f19..f6e94abcf 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -91,7 +91,7 @@ func (t DeployTransition) do(env *Environment) (err error) { if localErr != nil { log.WithField("partition", env.Id().String()). Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, localErr.Error()) - scriptErrors = multierror.Append(scriptErrors, localErr) + scriptErrors = multierror.Append(scriptErrors, fmt.Errorf("cleanup unsuccessful on %s: %w", flp, localErr)) } else { log.WithField("partition", env.Id().String()). Infof("[cleanup binary] execution successful on %s\n", flp) @@ -195,6 +195,7 @@ func (t DeployTransition) do(env *Environment) (err error) { } if err != nil { log.Warnf("pre-deployment cleanup, %s", err.Error()) + err = nil // we don't want to fail the deployment because of pre-deploy cleanup issues } // We set all callRoles to ACTIVE right now, because there's no task activation for them. From 4c87d4b42e3be3a1a442a8452c46c387b820facb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Dec 2022 13:08:27 +0100 Subject: [PATCH 1505/2352] [build] Bump to v0.58.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ad1943302..199eb5b11 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 58 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 621c31714e8d139132efb2a6763b3b1a16f6d8fa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 15 Dec 2022 13:08:59 +0100 Subject: [PATCH 1506/2352] [core] Apricot host-detector inventory cache --- apricot/cacheproxy/service.go | 146 ++++++++++++++++++++++++++++++++++ apricot/instance.go | 21 ++++- core/config.go | 2 + 3 files changed, 167 insertions(+), 2 deletions(-) create mode 100644 apricot/cacheproxy/service.go diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go new file mode 100644 index 000000000..2b342d630 --- /dev/null +++ b/apricot/cacheproxy/service.go @@ -0,0 +1,146 @@ +package cacheproxy + +import ( + "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/componentcfg" +) + +// Implements a cache proxy Service for the configuration system. +// Only DetectorForHost/DetectorsForHosts are cached, all other calls are passed through. +type Service struct{ + base configuration.Service + cache svcCache +} + +type svcCache struct { + detectorsInventory map[string][]string + detectorForHost map[string]string +} + +func NewService(base configuration.Service) (*Service, error) { + svc := &Service{ + base: base, + cache: svcCache{ + detectorsInventory: make(map[string][]string), + detectorForHost: make(map[string]string), + }, + } + + var err error + svc.cache.detectorsInventory, err = svc.base.GetDetectorsInventory() + if err != nil { + return nil, err + } + + for det, hosts := range svc.cache.detectorsInventory { + for _, host := range hosts { + svc.cache.detectorForHost[host] = det + } + } + + return svc, nil +} + +func (s Service) GetRuntimeEntry(component string, key string) (string, error) { + return s.base.GetRuntimeEntry(component, key) +} + +func (s Service) SetRuntimeEntry(component string, key string, value string) error { + return s.base.SetRuntimeEntry(component, key, value) +} + +func (s Service) ListRuntimeEntries(component string) ([]string, error) { + return s.base.ListRuntimeEntries(component) +} + +func (s Service) NewRunNumber() (runNumber uint32, err error) { + return s.base.NewRunNumber() +} + +func (s Service) GetDefaults() map[string]string { + return s.base.GetDefaults() +} + +func (s Service) GetVars() map[string]string { + return s.base.GetVars() +} + +func (s Service) GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) { + return s.base.GetComponentConfiguration(query) +} + +func (s Service) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) { + return s.base.GetComponentConfigurationWithLastIndex(query) +} + +func (s Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) { + return s.base.GetAndProcessComponentConfiguration(query, varStack) +} + +func (s Service) ListDetectors(getAll bool) (detectors []string, err error) { + return s.base.ListDetectors(getAll) +} + +func (s Service) GetHostInventory(detector string) (hosts []string, err error) { + return s.base.GetHostInventory(detector) +} + +func (s Service) GetDetectorsInventory() (inventory map[string][]string, err error) { + return s.base.GetDetectorsInventory() +} + +func (s Service) ListComponents() (components []string, err error) { + return s.base.ListComponents() +} + +func (s Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { + return s.base.ListComponentEntries(query, showLatestTimestamp) +} + +func (s Service) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { + return s.base.ListComponentEntryHistory(query) +} + +func (s Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { + return s.base.ResolveComponentQuery(query) +} + +func (s Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { + return s.base.ImportComponentConfiguration(query, payload, newComponent, useVersioning) +} + +func (s Service) GetDetectorForHost(hostname string) (string, error) { + det, ok := s.cache.detectorForHost[hostname] + if !ok { + return s.base.GetDetectorForHost(hostname) + } + return det, nil +} + +func (s Service) GetDetectorsForHosts(hosts []string) ([]string, error) { + detectors := make(map[string]struct{}, 0) + for _, host := range hosts { + det, ok := s.cache.detectorForHost[host] + if !ok { + return s.base.GetDetectorsForHosts(hosts) + } + detectors[det] = struct{}{} + } + detList := make([]string, 0, len(detectors)) + for det, _ := range detectors { + detList = append(detList, det) + } + return detList, nil +} + +func (s Service) GetCRUCardsForHost(hostname string) (string, error) { + return s.base.GetCRUCardsForHost(hostname) +} + +func (s Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { + return s.base.GetEndpointsForCRUCard(hostname, cardSerial) +} + +func (s Service) RawGetRecursive(path string) (string, error) { + return s.base.RawGetRecursive(path) +} diff --git a/apricot/instance.go b/apricot/instance.go index a6c33797d..c406bc133 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -29,6 +29,7 @@ import ( "net/url" "sync" + "github.com/AliceO2Group/Control/apricot/cacheproxy" "github.com/AliceO2Group/Control/apricot/local" "github.com/AliceO2Group/Control/apricot/remote" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -47,6 +48,8 @@ func newService(configUri string) (configuration.Service, error) { return nil, err } + var svc configuration.Service + switch parsedUri.Scheme { case "consul": fallthrough @@ -62,7 +65,14 @@ func newService(configUri string) (configuration.Service, error) { WithField("level", infologger.IL_Support). Info("new embedded apricot instance") } - return local.NewService(configUri) + svc, err = local.NewService(configUri) + if err != nil { + return svc, err + } + if viper.GetBool("configCache") { + svc, err = cacheproxy.NewService(svc) + } + return svc, err case "apricot": if viper.GetString("component") == "apricot" { log.WithField("configUri", configUri). @@ -75,7 +85,14 @@ func newService(configUri string) (configuration.Service, error) { WithField("level", infologger.IL_Support). Info("new apricot client") } - return remote.NewService(configUri) + svc, err = remote.NewService(configUri) + if err != nil { + return svc, err + } + if viper.GetBool("configCache") { + svc, err = cacheproxy.NewService(svc) + } + return svc, err default: return nil, fmt.Errorf("invalid configuration URI scheme %s", parsedUri.Scheme) } diff --git a/core/config.go b/core/config.go index 26b56dc3b..852aa39d9 100644 --- a/core/config.go +++ b/core/config.go @@ -118,6 +118,7 @@ func setDefaults() error { viper.SetDefault("concurrentWorkflowTemplateProcessing", false) viper.SetDefault("concurrentIteratorRoleExpansion", false) viper.SetDefault("reuseUnlockedTasks", false) + viper.SetDefault("configCache", true) return nil } @@ -179,6 +180,7 @@ func setFlags() error { pflag.Bool("concurrentWorkflowTemplateProcessing", viper.GetBool("concurrentWorkflowTemplateProcessing"), "Process workflow templates concurrently") pflag.Bool("concurrentIteratorRoleExpansion", viper.GetBool("concurrentIteratorRoleExpansion"), "Expand iterator roles concurrently during workflow template processing") pflag.Bool("reuseUnlockedTasks", viper.GetBool("reuseUnlockedTasks"), "Reuse unlocked active tasks when satisfying environment deployment requests") + pflag.Bool("configCache", viper.GetBool("configCache"), "Enable cache layer between AliECS core and Apricot") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From 6087eaaed4a2ce4b6dfddf7bc18592d94204b79e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Dec 2022 12:41:12 +0100 Subject: [PATCH 1507/2352] [apricot] Notify about verbose setting --- apricot/apricot.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index da8face6c..81a36ae35 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -42,10 +42,18 @@ import ( var log = logger.New(logrus.StandardLogger(), "apricot") func Run() (err error) { + verbose := false if viper.GetBool("verbose") { logrus.SetLevel(logrus.DebugLevel) + verbose = true } - log.WithField("level", infologger.IL_Support).Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) + log.WithField("level", infologger.IL_Support). + Infof("AliECS Configuration Service (apricot v%s build %s) starting up", product.VERSION, product.BUILD) + if verbose { + log.WithField("level", infologger.IL_Support). + Infof("AliECS Configuration Service running with verbose logging") + } + s := remote.NewServer(Instance()) httpsvr := local.NewHttpService(instance) From 4fb6ba0d5851b836078acea361e71ac496f7352e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Dec 2022 12:42:00 +0100 Subject: [PATCH 1508/2352] [core] Avoid direct Apricot defaults/vars calls from ODC client --- core/environment/environment.go | 31 ++++++++++++++++++------------- core/integration/odc/plugin.go | 26 +++++++++++++++++--------- 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index e463fc230..48214d673 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -34,7 +34,6 @@ import ( "sync" "time" - "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" @@ -68,14 +67,16 @@ type Environment struct { hookHandlerF func(hooks task.Tasks) error incomingEvents chan event.DeviceEvent - GlobalDefaults gera.StringMap // From Consul - GlobalVars gera.StringMap // From Consul - UserVars gera.StringMap // From user input - stateChangedCh chan *event.TasksStateChangedEvent - unsubscribe chan struct{} - eventStream Subscription - Public bool // From workflow or user - Description string // From workflow + GlobalDefaults gera.StringMap // From Consul + GlobalVars gera.StringMap // From Consul + UserVars gera.StringMap // From user input + BaseConfigStack map[string]string // Exclusively from Consul, already flattened for performance + + stateChangedCh chan *event.TasksStateChangedEvent + unsubscribe chan struct{} + eventStream Subscription + Public bool // From workflow or user + Description string // From workflow callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap @@ -123,6 +124,12 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { ) env.GlobalVars.Set("__fmq_cleanup_count", "0") // initialize to 0 the number of START transitions + env.BaseConfigStack, err = gera.MakeStringMapWithMap(env.GlobalVars.Raw()). + WrappedAndFlattened(gera.MakeStringMapWithMap(env.GlobalDefaults.Raw())) // prepare the base config stack + if err != nil { + return nil, err + } + // We start with STANDBY, which will not be preceded with enter_STANDBY, thus we set the value here. enterStateTimeMs := strconv.FormatInt(time.Now().UnixMilli(), 10) env.UserVars.Set("enter_state_time_ms", enterStateTimeMs) @@ -171,14 +178,12 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) // number of times the START transition has run for this env - configStack, err := gera.MakeStringMapWithMap(apricot.Instance().GetVars()). - WrappedAndFlattened(gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults())) if err == nil { - lhcPeriod, ok := configStack["lhc_period"] + lhcPeriod, ok := env.BaseConfigStack["lhc_period"] if ok { env.workflow.GetVars().Set("lhc_period", lhcPeriod) } - nHbfPerTf, ok := configStack["n_hbf_per_tf"] + nHbfPerTf, ok := env.BaseConfigStack["n_hbf_per_tf"] if ok { env.workflow.GetVars().Set("n_hbf_per_tf", nHbfPerTf) } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index bf4a46b63..1cfcee7b2 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -39,9 +39,9 @@ import ( "time" "github.com/AliceO2Group/Control/apricot" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -258,17 +258,14 @@ func (p *Plugin) Init(_ string) error { } func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { - envId, ok := varStack["environment_id"] - if !ok { + envId, envIdOk := varStack["environment_id"] + if !envIdOk { log.Error("ObjectStack cannot acquire environment ID") return } - - var csErr error - configStack := apricot.Instance().GetDefaults() - configStack, csErr = gera.MakeStringMapWithMap(apricot.Instance().GetVars()).WrappedAndFlattened(gera.MakeStringMapWithMap(configStack)) - if csErr != nil { - log.Error("cannot access AliECS workflow configuration defaults") + envUid, err := uid.FromString(envId) + if err != nil { + log.Error("ObjectStack cannot parse environment ID") return } @@ -316,6 +313,17 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter ) accumulator = make([]string, 0) + envMan := environment.ManagerInstance() + myEnv, err := envMan.Environment(envUid) + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire environment reference") + return + } + configStack := myEnv.BaseConfigStack + pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { log.WithField("partition", envId). From 15ddcace8fcb8e0622b4ad31c7cd4cdeeb2ef920 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Dec 2022 14:51:06 +0100 Subject: [PATCH 1509/2352] [core] Include envId in pre-deploy cleanup failure message --- core/environment/transition_deploy.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index f6e94abcf..5f7bc4c41 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -194,7 +194,8 @@ func (t DeployTransition) do(env *Environment) (err error) { t.taskman.MessageChannel <- taskmanMessage } if err != nil { - log.Warnf("pre-deployment cleanup, %s", err.Error()) + log.WithField("partition", env.Id().String()). + Warnf("pre-deployment cleanup, %s", err.Error()) err = nil // we don't want to fail the deployment because of pre-deploy cleanup issues } From 3cb776cd935a646d3aa086f590a97fc2b67cee73 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 9 Jan 2023 12:10:01 +0100 Subject: [PATCH 1510/2352] [core] Bookkeeping plugin corrects missing SOR timestamps in case they are not set correctly. --- core/integration/bookkeeping/plugin.go | 152 +++++++++++++++++++++++-- 1 file changed, 145 insertions(+), 7 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 2bcd02ee5..7468ba91b 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -60,9 +60,11 @@ type Plugin struct { bookkeepingClient *RpcClient - pendingRunStops map[string] /*envId*/ int64 - pendingO2Stops map[string] /*envId*/ bool - pendingTrgStops map[string] /*envId*/ bool + pendingRunStops map[string] /*envId*/ int64 + pendingO2Starts map[string] /*envId*/ bool + pendingO2Stops map[string] /*envId*/ bool + pendingTrgStarts map[string] /*envId*/ bool + pendingTrgStops map[string] /*envId*/ bool } func NewPlugin(endpoint string) integration.Plugin { @@ -81,7 +83,9 @@ func NewPlugin(endpoint string) integration.Plugin { bookkeepingPort: portNumber, bookkeepingClient: nil, pendingRunStops: make(map[string]int64), + pendingO2Starts: make(map[string]bool), pendingO2Stops: make(map[string]bool), + pendingTrgStarts: make(map[string]bool), pendingTrgStops: make(map[string]bool), } } @@ -117,6 +121,21 @@ func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { return out } +func (p *Plugin) pendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + if p.pendingO2Starts == nil { + return nil + } + + out := make(map[uid.ID]bool) + + for _, envId := range envIds { + if o2Start, ok := p.pendingO2Starts[envId.String()]; ok { + out[envId] = o2Start + } + } + return out +} + func (p *Plugin) pendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingO2Stops == nil { return nil @@ -132,6 +151,21 @@ func (p *Plugin) pendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { return out } +func (p *Plugin) pendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + if p.pendingTrgStarts == nil { + return nil + } + + out := make(map[uid.ID]bool) + + for _, envId := range envIds { + if trgStart, ok := p.pendingTrgStarts[envId.String()]; ok { + out[envId] = trgStart + } + } + return out +} + func (p *Plugin) pendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingTrgStops == nil { return nil @@ -156,7 +190,9 @@ func (p *Plugin) GetData(_ []any) string { outMap := make(map[string]interface{}) outMap["pendingRunStops"] = p.pendingRunStopsForEnvs(envIds) + outMap["pendingO2Starts"] = p.pendingO2StartsForEnvs(envIds) outMap["pendingO2Stops"] = p.pendingO2StopsForEnvs(envIds) + outMap["pendingTrgStarts"] = p.pendingTrgStartsForEnvs(envIds) outMap["pendingTrgStops"] = p.pendingTrgStopsForEnvs(envIds) out, err := json.Marshal(outMap) @@ -172,7 +208,9 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { } inRunStopMap := p.pendingRunStopsForEnvs(envIds) + inO2StartMap := p.pendingO2StartsForEnvs(envIds) inO2StopMap := p.pendingO2StopsForEnvs(envIds) + inTrgStartMap := p.pendingTrgStartsForEnvs(envIds) inTrgStopMap := p.pendingTrgStopsForEnvs(envIds) envMap := make(map[string]interface{}) @@ -182,9 +220,15 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { if runStop, ok := inRunStopMap[envId]; ok { envMap["runNumber"] = runStop } + if o2Start, ok := inO2StartMap[envId]; ok { + envMap["pendingO2Start"] = o2Start + } if o2Stop, ok := inO2StopMap[envId]; ok { envMap["pendingO2Stop"] = o2Stop } + if trgStart, ok := inTrgStartMap[envId]; ok { + envMap["pendingTrgStart"] = trgStart + } if trgStop, ok := inTrgStopMap[envId]; ok { envMap["pendingTrgStop"] = trgStop } @@ -416,7 +460,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { p.pendingRunStops[envId] = runNumber64 + p.pendingO2Starts[envId] = true p.pendingO2Stops[envId] = true + p.pendingTrgStarts[envId] = true p.pendingTrgStops[envId] = true log.WithField("run", runNumber64). WithField("partition", envId). @@ -622,6 +668,42 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ReadoutCfgUri: &readoutUri, } + if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { + if timeO2StartOutput != nil && timeTrgStartOutput == nil { + inRun = bkpb.RunUpdateRequest{ + RunNumber: int32(runNumber64), + TimeO2Start: timeO2StartOutput, + TimeO2End: timeO2EndOutput, + TimeTrgEnd: timeTrgEndOutput, + TriggerValue: &trg, + PdpConfigOption: &pdpConfig, + PdpTopologyDescriptionLibraryFile: &pdpTopology, + TfbDdMode: &tfbMode, + LhcPeriod: &lhcPeriod, + OdcTopologyFullName: &odcTopologyFullname, + PdpWorkflowParameters: &pdpParameters, + PdpBeamType: &pdpBeam, + ReadoutCfgUri: &readoutUri, + } + } else if timeO2StartOutput == nil && timeTrgStartOutput != nil { + inRun = bkpb.RunUpdateRequest{ + RunNumber: int32(runNumber64), + TimeO2End: timeO2EndOutput, + TimeTrgStart: timeTrgStartOutput, + TimeTrgEnd: timeTrgEndOutput, + TriggerValue: &trg, + PdpConfigOption: &pdpConfig, + PdpTopologyDescriptionLibraryFile: &pdpTopology, + TfbDdMode: &tfbMode, + LhcPeriod: &lhcPeriod, + OdcTopologyFullName: &odcTopologyFullname, + PdpWorkflowParameters: &pdpParameters, + PdpBeamType: &pdpBeam, + ReadoutCfgUri: &readoutUri, + } + } + } + timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -643,7 +725,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer delete(p.pendingO2Stops, envId) defer delete(p.pendingTrgStops, envId) if p.pendingO2Stops[envId] == true || (trgEnabled && p.pendingTrgStops[envId] == true) { - updatedRun = "INCOMPLETE" + updatedRun = "INCOMPLETE STOP" if p.pendingO2Stops[envId] == true { timeO2EndTemp = time.Now().UnixMilli() timeO2EndOutput = &timeO2EndTemp @@ -665,7 +747,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } log.WithField("run", runNumber64). WithField("partition", envId). - Debug("Bookkeeping API RunServiceClient: Update call: completing missing run end time") + Debug("Bookkeeping API RunServiceClient: Update call: completing missing EOR timestamps") timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel = context.WithTimeout(context.Background(), timeout) @@ -685,8 +767,52 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { updatedRun = "STOPPED" } - } else { - updatedRun = "STARTED" + } else if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStart") { + defer delete(p.pendingO2Starts, envId) + defer delete(p.pendingTrgStarts, envId) + if p.pendingO2Starts[envId] == true || (trgEnabled && p.pendingTrgStarts[envId] == true) { + updatedRun = "INCOMPLETE START" + if p.pendingO2Starts[envId] == true { + timeO2StartTemp = time.Now().UnixMilli() + timeO2StartOutput = &timeO2StartTemp + log.WithField("run", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 start time") + } + if trgEnabled && p.pendingTrgStarts[envId] == true { + timeTrgStartTemp = time.Now().UnixMilli() + timeTrgStartOutput = &timeO2StartTemp + log.WithField("run", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing Trg start time") + } + inRun = bkpb.RunUpdateRequest{ + RunNumber: int32(runNumber64), + TimeO2Start: timeO2StartOutput, + TimeTrgStart: timeTrgStartOutput, + } + log.WithField("run", runNumber64). + WithField("partition", envId). + Debug("Bookkeeping API RunServiceClient: Update call: completing missing SOR timestamps") + + timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) + ctx, cancel = context.WithTimeout(context.Background(), timeout) + defer cancel() + _, err = p.bookkeepingClient.RunServiceClient.Update(ctx, &inRun, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "RunServiceClient.Update"). + Error("Bookkeeping API RunServiceClient: Update error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + } else { + updatedRun = "STARTED" + } } log.WithField("run", runNumber64). WithField("updated to", updatedRun). @@ -728,7 +854,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } O2StartTime := varStack["run_start_time_ms"] + if O2StartTime != "" { + p.pendingO2Starts[envId] = false + } TrgStartTime := varStack["trg_start_time_ms"] + if TrgStartTime != "" { + p.pendingTrgStarts[envId] = false + } return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") } @@ -770,12 +902,18 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } O2StartTime := varStack["run_start_time_ms"] + if O2StartTime != "" { + p.pendingO2Starts[envId] = false + } O2EndTime := varStack["run_end_time_ms"] if O2EndTime != "" { p.pendingO2Stops[envId] = false } TrgStartTime := varStack["trg_start_time_ms"] + if TrgStartTime != "" { + p.pendingTrgStarts[envId] = false + } TrgEndTime := varStack["trg_end_time_ms"] if TrgEndTime != "" { p.pendingTrgStops[envId] = false From 7e2c7282b6bd96b8bd3fb6aaae05943c0fa5419c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 9 Jan 2023 12:49:16 +0100 Subject: [PATCH 1511/2352] [apricot] Don't crash because of nil getStringMap --- apricot/local/serviceutil.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index fe133ca76..5af7a6fbc 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -27,9 +27,10 @@ package local import ( "errors" "fmt" - "github.com/spf13/viper" "strings" + "github.com/spf13/viper" + "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" ) @@ -78,7 +79,10 @@ func (s *Service) queryToAbsPath(query *componentcfg.Query) (absolutePath string func (s *Service) getStringMap(path string) map[string]string { tree, err := s.src.GetRecursive(path) if err != nil { - return nil + log.WithError(err). + WithField("path", path). + Warning("getStringMap from configuration backend failed, possibly rate limited") + return map[string]string{} } if tree.Type() == cfgbackend.IT_Map { responseMap := tree.Map() @@ -109,7 +113,7 @@ func (s *Service) getStringMap(path string) map[string]string { } return theMap } - return nil + return map[string]string{} } func (s *Service) resolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { From 91ed119db6c5a17015ca0ea9c59cd3bcef50cb9a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 9 Jan 2023 14:45:16 +0100 Subject: [PATCH 1512/2352] [core] Pass the env's defaults+vars from Consul to ObjectStack context --- configuration/template/dplutil.go | 4 ++-- configuration/template/fields.go | 7 ++++--- configuration/template/stack.go | 4 ++-- configuration/template/stackutil.go | 2 +- core/environment/manager.go | 8 ++++---- core/integration/bookkeeping/plugin.go | 7 ++++--- core/integration/ccdb/plugin.go | 5 +++-- core/integration/dcs/plugin.go | 2 +- core/integration/ddsched/plugin.go | 2 +- core/integration/kafka/plugin.go | 2 +- core/integration/odc/plugin.go | 27 +++++++++++--------------- core/integration/plugin.go | 8 ++++---- core/integration/testplugin/plugin.go | 2 +- core/integration/trg/plugin.go | 2 +- core/task/task.go | 8 ++++---- core/workflow/aggregatorrole.go | 27 +++++++++++++++++--------- core/workflow/callable/call.go | 2 +- core/workflow/callrole.go | 8 +++++--- core/workflow/includerole.go | 25 ++++++++++++++++-------- core/workflow/iteratorrange.go | 15 +++++++------- core/workflow/iteratorrole.go | 6 +++--- core/workflow/load.go | 4 ++-- core/workflow/role.go | 2 +- core/workflow/taskrole.go | 23 +++++++++++++++------- 24 files changed, 114 insertions(+), 88 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 7ad80945c..9714f678e 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -129,7 +129,7 @@ func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]st // Resolve any templates as part of the DPL command fields := Fields{WrapPointer(&dplCommand)} - err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + err = fields.Execute(confSvc, dplCommand, varStack, nil, nil, make(map[string]texttemplate.Template), workflowRepo) if err != nil { return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } @@ -157,7 +157,7 @@ func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[st // Resolve any templates as part of the DPL command fields := Fields{WrapPointer(&dplCommand)} - err = fields.Execute(confSvc, dplCommand, varStack, nil, make(map[string]texttemplate.Template), workflowRepo) + err = fields.Execute(confSvc, dplCommand, varStack, nil, nil, make(map[string]texttemplate.Template), workflowRepo) if err != nil { return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } diff --git a/configuration/template/fields.go b/configuration/template/fields.go index b7f184b2c..b9e0ff9e5 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -82,6 +82,7 @@ func (sf Sequence) Execute(confSvc ConfigurationService, parentPath string, varStack VarStack, buildObjectStack BuildObjectStackFunc, + baseConfigStack map[string]string, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo, stageCallback StageCallbackFunc) (err error) { @@ -110,7 +111,7 @@ func (sf Sequence) Execute(confSvc ConfigurationService, }(), }).Trace("about to process fields for stage") } - err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, stringTemplateCache, workflowRepo) + err = fields.Execute(confSvc, parentPath, stagedStack, objectStack, baseConfigStack, stringTemplateCache, workflowRepo) err = stageCallback(currentStage, err) if err != nil { var roleDisabledErrorType *RoleDisabledError @@ -227,7 +228,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri return } -func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { +func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, varStack map[string]string, objStack map[string]interface{}, baseConfigStack map[string]string, stringTemplateCache map[string]template.Template, workflowRepo repos.IRepo) (err error) { environment := make(map[string]interface{}, len(varStack)) strOpStack := MakeUtilFuncMap(varStack) for k, v := range varStack { @@ -256,7 +257,7 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va environment[k] = v } - pluginObjects := MakePluginObjectStack(varStack) + pluginObjects := MakePluginObjectStack(varStack, baseConfigStack) copyMap(pluginObjects, environment) configAccessObj := MakeConfigAccessObject(confSvc, varStack) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index fa3350dc1..bb3e18fc6 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -159,8 +159,8 @@ func MakeConfigAccessFuncsMultiVar(confSvc ConfigurationService, varStack map[st } } -func MakePluginObjectStack(varStack map[string]string) map[string]interface{} { - return integration.PluginsInstance().ObjectStack(varStack) +func MakePluginObjectStack(varStack map[string]string, baseConfigStack map[string]string) map[string]interface{} { + return integration.PluginsInstance().ObjectStack(varStack, baseConfigStack) } func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo) map[string]interface{} { diff --git a/configuration/template/stackutil.go b/configuration/template/stackutil.go index c09326684..2d3eb2a67 100644 --- a/configuration/template/stackutil.go +++ b/configuration/template/stackutil.go @@ -50,7 +50,7 @@ func getConfigLegacy(confSvc ConfigurationService, varStack map[string]string, p } fields := Fields{WrapPointer(&payload)} - err = fields.Execute(confSvc, query.Path(), varStack, nil, make(map[string]texttemplate.Template), nil) + err = fields.Execute(confSvc, query.Path(), varStack, nil, nil, make(map[string]texttemplate.Template), nil) log.Warn(varStack) log.Warn(payload) return payload diff --git a/core/environment/manager.go b/core/environment/manager.go index 540e93757..7b4dd75b3 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -219,7 +219,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } // We load the workflow (includes template processing) - env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars, env.BaseConfigStack) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) @@ -507,11 +507,11 @@ func (envs *Manager) environment(environmentId uid.ID) (env *Environment, err er return } -func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable, workflowUserVars map[string]string) (root workflow.Role, err error) { +func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable, workflowUserVars map[string]string, baseConfigStack map[string]string) (root workflow.Role, err error) { if strings.Contains(workflowPath, "://") { return nil, errors.New("workflow loading from file not implemented yet") } - return workflow.Load(workflowPath, parent, envs.taskman, workflowUserVars) + return workflow.Load(workflowPath, parent, envs.taskman, workflowUserVars, baseConfigStack) } func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { @@ -665,7 +665,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str Warn("parse workflow public info failed.") } - env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars) + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars, env.BaseConfigStack) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 7468ba91b..792b10c0a 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -34,13 +34,14 @@ import ( "encoding/json" "errors" "fmt" - bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" - "google.golang.org/grpc" "net/url" "strconv" "strings" "time" + bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" + "google.golang.org/grpc" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" @@ -252,7 +253,7 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 4884e72c0..6b1505f84 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,7 +29,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/AliceO2Group/Control/core/environment" "go/types" "net/url" "os/exec" @@ -37,6 +36,8 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -289,7 +290,7 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c666b8b6d..2090fec72 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -174,7 +174,7 @@ func (p *Plugin) Init(instanceId string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 69e8685a7..b30c0dcce 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -191,7 +191,7 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 7f7485aa4..605066a80 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -157,7 +157,7 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 1cfcee7b2..1b45ee453 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -41,7 +41,6 @@ import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils/uid" - "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -257,16 +256,21 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[string]string) (stack map[string]interface{}) { + // baseConfigStack is this environment's defaults + vars from Consul but no user input + // It is passed around this way because it cannot be acquired from envMan.GetEnv(id).BaseConfigStack, since during + // this ObjectStack call the env isn't mapped in envMan yet (we're in the middle of creating + processing it with + // ProcessTemplates in loadWorkflow). + // The only reason we need the naked defaults + vars is for the non-standard processing of the "default" keyword in + // the ODC plugin, so this is a break from design. envId, envIdOk := varStack["environment_id"] if !envIdOk { log.Error("ObjectStack cannot acquire environment ID") return } - envUid, err := uid.FromString(envId) - if err != nil { - log.Error("ObjectStack cannot parse environment ID") - return + + if baseConfigStack == nil { + baseConfigStack = make(map[string]string) } stack = make(map[string]interface{}) @@ -313,16 +317,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string) (stack map[string]inter ) accumulator = make([]string, 0) - envMan := environment.ManagerInstance() - myEnv, err := envMan.Environment(envUid) - if err != nil { - log.WithError(err). - WithField("partition", envId). - WithField("call", "GenerateEPNWorkflowScript"). - Error("cannot acquire environment reference") - return - } - configStack := myEnv.BaseConfigStack + configStack := baseConfigStack pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 46efaceee..42bd747dc 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -54,8 +54,8 @@ type Plugin interface { GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string Init(instanceId string) error - CallStack(data interface{}) map[string]interface{} // used in hook call context - ObjectStack(varStack map[string]string) map[string]interface{} // all other ProcessTemplates contexts + CallStack(data interface{}) map[string]interface{} // used in hook call context + ObjectStack(varStack map[string]string, baseConfigStack map[string]string) map[string]interface{} // all other ProcessTemplates contexts Destroy() error } @@ -115,7 +115,7 @@ func (p Plugins) CallStack(data interface{}) (stack map[string]interface{}) { return } -func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]interface{}) { +func (p Plugins) ObjectStack(varStack map[string]string, baseConfigStack map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) //HACK: this is a dummy object+function to allow odc.GenerateEPNTopologyFullname in the root role @@ -126,7 +126,7 @@ func (p Plugins) ObjectStack(varStack map[string]string) (stack map[string]inter } for _, plugin := range p { - s := plugin.ObjectStack(varStack) + s := plugin.ObjectStack(varStack, baseConfigStack) stack[plugin.GetName()] = s } return diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 40a994252..2e0928140 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -82,7 +82,7 @@ func (p *Plugin) Init(_ string) error { return nil } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index c76de7de3..676b71943 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -360,7 +360,7 @@ func (p *Plugin) reconcile() { } -func (p *Plugin) ObjectStack(_ map[string]string) (stack map[string]interface{}) { +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } diff --git a/core/task/task.go b/core/task/task.go index 215f93cf1..2c2a0bd55 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -293,7 +293,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We resolve any template expressions in Defaults defaultFields := template.WrapMapItems(localDefaults) - err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) + err = defaultFields.Execute(the.ConfSvc(), t.name, varStack, nil, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). @@ -317,7 +317,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We resolve any template expressions in Vars varFields := template.WrapMapItems(localVars) - err = varFields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) + err = varFields.Execute(the.ConfSvc(), t.name, varStack, nil, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). @@ -352,7 +352,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if cmd.Log != nil { // we only template it if it's defined fields = append(fields, template.WrapPointer(cmd.Log)) } - err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, make(map[string]texttemplate.Template), nil) + err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, nil, make(map[string]texttemplate.Template), nil) if err != nil { t.commandInfo = &common.TaskCommandInfo{} log.WithError(err). @@ -592,7 +592,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand fields := template.WrapMapItems(propMap) - err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, make(map[string]texttemplate.Template), nil) + err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { log.WithError(err). WithField("partition", t.GetParent().GetEnvironmentId().String()). diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 00a429921..ae4656f32 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -102,7 +102,7 @@ func (r *aggregatorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc, baseConfigStack map[string]string) (err error) { if r == nil { return errors.New("role tree error when processing templates") } @@ -123,12 +123,21 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf } // TODO: push cached templates here - err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ - Locals: r.Locals, - Defaults: r.Defaults, - Vars: r.Vars, - UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) + err = templSequence.Execute( + the.ConfSvc(), + r.GetPath(), + template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, + r.makeBuildObjectStackFunc(), + baseConfigStack, + make(map[string]texttemplate.Template), + workflowRepo, + MakeDisabledRoleCallback(r), + ) if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { @@ -167,7 +176,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf defer wg.Done() role := r.Roles[roleIdx] role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { roleErrors = multierror.Append(roleErrors, err) } @@ -183,7 +192,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf } else { for _, role := range r.Roles { role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { return } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 732c6747c..8bb17064a 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -130,7 +130,7 @@ func (c *Call) Call() error { objStack := integration.PluginsInstance().CallStack(c) - err = fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, make(map[string]texttemplate.Template), nil) + err = fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { return err } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 3d45e1deb..1c3105cc6 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -30,11 +30,11 @@ import ( texttemplate "text/template" "time" - "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/gobwas/glob" ) @@ -136,7 +136,7 @@ func (t *callRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc) (err error) { +func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc, baseConfigStack map[string]string) (err error) { if t == nil { return errors.New("role tree error when processing templates") } @@ -163,7 +163,8 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF } // FIXME: push cached templates here - err = templSequence.Execute(apricot.Instance(), + err = templSequence.Execute( + the.ConfSvc(), t.GetPath(), template.VarStack{ Locals: t.Locals, @@ -172,6 +173,7 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF UserVars: t.UserVars, }, t.makeBuildObjectStackFunc(), + baseConfigStack, make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(t), diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 642f9d5a0..265cc55cb 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -78,7 +78,7 @@ func (r *includeRole) MarshalYAML() (interface{}, error) { return nil, nil } -func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc, baseConfigStack map[string]string) (err error) { if r == nil { return errors.New("role tree error when processing templates") } @@ -101,12 +101,21 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow } // TODO: push cached templates here - err = templSequence.Execute(the.ConfSvc(), r.GetPath(), template.VarStack{ - Locals: r.Locals, - Defaults: r.Defaults, - Vars: r.Vars, - UserVars: r.UserVars, - }, r.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(r)) + err = templSequence.Execute( + the.ConfSvc(), + r.GetPath(), + template.VarStack{ + Locals: r.Locals, + Defaults: r.Defaults, + Vars: r.Vars, + UserVars: r.UserVars, + }, + r.makeBuildObjectStackFunc(), + baseConfigStack, + make(map[string]texttemplate.Template), + workflowRepo, + MakeDisabledRoleCallback(r), + ) if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { @@ -159,7 +168,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow r.parent = parent r.Name = name - return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow) + return r.aggregatorRole.ProcessTemplates(newWfRepo, loadSubworkflow, baseConfigStack) } func (r *includeRole) UpdateStatus(s task.Status) { diff --git a/core/workflow/iteratorrange.go b/core/workflow/iteratorrange.go index 58a6809eb..1212edfdc 100644 --- a/core/workflow/iteratorrange.go +++ b/core/workflow/iteratorrange.go @@ -40,8 +40,8 @@ type iteratorRange interface { } type iteratorRangeExpr struct { - Range string `yaml:"range"` - Var string `yaml:"var"` + Range string `yaml:"range"` + Var string `yaml:"var"` } func (f *iteratorRangeExpr) copy() copyable { @@ -58,7 +58,7 @@ func (f *iteratorRangeExpr) GetRange(varStack map[string]string) (ran []string, fields := template.Fields{ template.WrapPointer(&f.Range), } - err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), nil, make(map[string]texttemplate.Template), nil) if err != nil { return } @@ -72,11 +72,10 @@ func (f *iteratorRangeExpr) GetVar() string { return f.Var } - type iteratorRangeFor struct { - Begin string `yaml:"begin"` - End string `yaml:"end"` - Var string `yaml:"var"` + Begin string `yaml:"begin"` + End string `yaml:"end"` + Var string `yaml:"var"` } func (f *iteratorRangeFor) copy() copyable { @@ -95,7 +94,7 @@ func (f *iteratorRangeFor) GetRange(varStack map[string]string) (ran []string, e template.WrapPointer(&f.Begin), template.WrapPointer(&f.End), } - err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), make(map[string]texttemplate.Template), nil) + err = fields.Execute(the.ConfSvc(), "", varStack, make(map[string]interface{}), nil, make(map[string]texttemplate.Template), nil) if err != nil { return } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index cdd3ca352..32b472aad 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -150,7 +150,7 @@ func (i *iteratorRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) (err error) { +func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc, baseConfigStack map[string]string) (err error) { if i == nil { return errors.New("role tree error when processing templates") } @@ -174,7 +174,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo go func(roleIdx int) { defer wg.Done() role := i.Roles[roleIdx] - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { roleErrors = multierror.Append(roleErrors, err) } @@ -189,7 +189,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo } else { for _, role := range i.Roles { - err = role.ProcessTemplates(workflowRepo, loadSubworkflow) + err = role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { return } diff --git a/core/workflow/load.go b/core/workflow/load.go index eaf6b6d49..ca54b9c2f 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -44,7 +44,7 @@ import ( type LoadSubworkflowFunc func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) // FIXME: workflowPath should be of type configuration.Path, not string -func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string) (workflow Role, err error) { +func Load(workflowPath string, parent Updatable, taskManager *task.Manager, userProperties map[string]string, baseConfigStack map[string]string) (workflow Role, err error) { repoManager := the.RepoManager() var loadSubworkflow LoadSubworkflowFunc = func(workflowPathExpr string, parent Updatable) (root *aggregatorRole, workflowRepo repos.IRepo, err error) { @@ -115,7 +115,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user Warn("concurrent iterator role expansion is disabled, this will cause a performance hit") } - err = workflow.ProcessTemplates(workflowRepo, loadSubworkflow) + err = workflow.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { log.WithError(err).Warn("workflow loading failed: template processing error") return diff --git a/core/workflow/role.go b/core/workflow/role.go index e071faea6..bda831b74 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -56,7 +56,7 @@ type Role interface { GenerateTaskDescriptors() task.Descriptors getConstraints() constraint.Constraints setParent(role Updatable) - ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc) error + ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow LoadSubworkflowFunc, baseConfigStack map[string]string) error GlobFilter(g glob.Glob) []Role SetRuntimeVar(key string, value string) SetRuntimeVars(kv map[string]string) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index ccedd029a..def464125 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -132,7 +132,7 @@ func (t *taskRole) GlobFilter(g glob.Glob) (rs []Role) { return } -func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc) (err error) { +func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowFunc, baseConfigStack map[string]string) (err error) { if t == nil { return errors.New("role tree error when processing templates") } @@ -157,12 +157,21 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF } // FIXME: push cached templates here - err = templSequence.Execute(the.ConfSvc(), t.GetPath(), template.VarStack{ - Locals: t.Locals, - Defaults: t.Defaults, - Vars: t.Vars, - UserVars: t.UserVars, - }, t.makeBuildObjectStackFunc(), make(map[string]texttemplate.Template), workflowRepo, MakeDisabledRoleCallback(t)) + err = templSequence.Execute( + the.ConfSvc(), + t.GetPath(), + template.VarStack{ + Locals: t.Locals, + Defaults: t.Defaults, + Vars: t.Vars, + UserVars: t.UserVars, + }, + t.makeBuildObjectStackFunc(), + baseConfigStack, + make(map[string]texttemplate.Template), + workflowRepo, + MakeDisabledRoleCallback(t), + ) if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { From 91548cbf33943ae5156ec0ad916667a23e393cbf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 9 Jan 2023 14:53:21 +0100 Subject: [PATCH 1513/2352] [build] Bump to v0.58.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 199eb5b11..99a8ad64d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 58 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From bcddd6925b446b764d9f5c465ba3c328ef5d44fa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Jan 2023 11:39:21 +0100 Subject: [PATCH 1514/2352] [core] Do not crash when receiving update on nonexistent task --- core/task/manager.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 597d66745..d51b1c697 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -686,13 +686,14 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } taskDescription = fmt.Sprintf("task '%s' on %s (id %s, name %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), task.GetName(), v.Error()) + if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { + taskCriticalErrors = append(taskCriticalErrors, taskDescription) + } else { + taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) + } } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) - } - if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { taskCriticalErrors = append(taskCriticalErrors, taskDescription) - } else { - taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) } i++ } From f2e2542821745339170afb26546e2f7efd868f84 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Jan 2023 12:01:01 +0100 Subject: [PATCH 1515/2352] [build] Bump to v0.58.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 99a8ad64d..eac918a0f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 58 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From e23efe63186e083ec71690b67a3305dabb52765f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Jan 2023 17:02:14 +0100 Subject: [PATCH 1516/2352] [apricot] Improve GetCRUCardsForHost error reporting --- apricot/local/jsontypes.go | 2 +- apricot/local/service.go | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/apricot/local/jsontypes.go b/apricot/local/jsontypes.go index b5694b118..7133f6a99 100644 --- a/apricot/local/jsontypes.go +++ b/apricot/local/jsontypes.go @@ -24,7 +24,7 @@ package local -type Cards struct { +type Card struct { Type string `json:"type"` PciAddress string `json:"pciAddress"` Serial string `json:"serial"` diff --git a/apricot/local/service.go b/apricot/local/service.go index 472eba07e..8393c2ede 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -394,7 +394,7 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { s.logMethod() if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - var cards map[string]Cards + var cards map[string]Card var serials []string cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) if err != nil { @@ -421,14 +421,24 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { s.logMethod() + log.WithPrefix("rpcserver"). + WithField("method", "GetEndpointsForCRUCard"). + WithField("level", infologger.IL_Devel). + WithField("hostname", hostname). + WithField("cardSerial", cardSerial). + Debug("getting endpoints") + if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - var cards map[string]Cards + var cards map[string]Card var endpoints string cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) if err != nil { return "", err } - json.Unmarshal([]byte(cfgCards), &cards) + err = json.Unmarshal([]byte(cfgCards), &cards) + if err != nil { + return "", err + } for _, card := range cards { if card.Serial == cardSerial { endpoints = endpoints + card.Endpoint + " " From 88e1de33432bc080f321b9a00c406814824c48cb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Jan 2023 17:16:58 +0100 Subject: [PATCH 1517/2352] [core] Add concurrentWorkflowTemplateIteratorProcessing as separate item --- core/config.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/config.go b/core/config.go index 852aa39d9..d14156dea 100644 --- a/core/config.go +++ b/core/config.go @@ -116,6 +116,7 @@ func setDefaults() error { viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") viper.SetDefault("concurrentWorkflowTemplateProcessing", false) + viper.SetDefault("concurrentWorkflowTemplateIteratorProcessing", false) viper.SetDefault("concurrentIteratorRoleExpansion", false) viper.SetDefault("reuseUnlockedTasks", false) viper.SetDefault("configCache", true) @@ -177,7 +178,8 @@ func setFlags() error { pflag.String("fmqPluginSearchPath", viper.GetString("fmqPluginSearchPath"), "Path to the directory where the FairMQ plugins are found on controlled nodes") pflag.String("kafkaEndpoint", viper.GetString("kafkaEndpoint"), "Endpoint of the Kafka service (`host:port`)") pflag.String("bookkeepingBaseUri", viper.GetString("bookkeepingBaseUri"), "URI of the O² Bookkeeping service (`protocol://host:port`)") - pflag.Bool("concurrentWorkflowTemplateProcessing", viper.GetBool("concurrentWorkflowTemplateProcessing"), "Process workflow templates concurrently") + pflag.Bool("concurrentWorkflowTemplateProcessing", viper.GetBool("concurrentWorkflowTemplateProcessing"), "Process aggregators in workflow templates concurrently") + pflag.Bool("concurrentWorkflowTemplateIteratorProcessing", viper.GetBool("concurrentWorkflowTemplateIteratorProcessing"), "Process iterators in workflow templates concurrently") pflag.Bool("concurrentIteratorRoleExpansion", viper.GetBool("concurrentIteratorRoleExpansion"), "Expand iterator roles concurrently during workflow template processing") pflag.Bool("reuseUnlockedTasks", viper.GetBool("reuseUnlockedTasks"), "Reuse unlocked active tasks when satisfying environment deployment requests") pflag.Bool("configCache", viper.GetBool("configCache"), "Enable cache layer between AliECS core and Apricot") From 31ff07ab263b86dab39d711a040fea620a369e8e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Jan 2023 17:17:56 +0100 Subject: [PATCH 1518/2352] [core] Output unprocessed/processed wf dumps to coreWorkingDir --- core/workflow/load.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/core/workflow/load.go b/core/workflow/load.go index ca54b9c2f..1a0d227fd 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -28,6 +28,7 @@ import ( "errors" "fmt" "os" + "path/filepath" "strings" "time" @@ -98,17 +99,23 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user workflow = root + cwd := viper.GetString("coreWorkingDir") + timestamp := fmt.Sprintf("%f", float64(time.Now().UnixNano())/1e9) pp.ColoringEnabled = false if viper.GetBool("dumpWorkflows") { - f, _ := os.Create(fmt.Sprintf("wf-unprocessed-%s.json", timestamp)) + f, _ := os.Create(filepath.Join(cwd, fmt.Sprintf("wf-unprocessed-%s.json", timestamp))) _, _ = pp.Fprintln(f, workflow) defer f.Close() } if !viper.GetBool("concurrentWorkflowTemplateProcessing") { log.WithField("workflow", workflowPath). - Warn("concurrent workflow template processing is disabled, this will cause a performance hit") + Warn("concurrent workflow template aggregator processing is disabled, this will cause a performance hit") + } + if !viper.GetBool("concurrentWorkflowTemplateIteratorProcessing") { + log.WithField("workflow", workflowPath). + Warn("concurrent workflow template iterator processing is disabled, this will cause a performance hit") } if !viper.GetBool("concurrentIteratorRoleExpansion") { log.WithField("workflow", workflowPath). @@ -123,7 +130,7 @@ func Load(workflowPath string, parent Updatable, taskManager *task.Manager, user log.WithField("path", workflowPath).Debug("workflow loaded") if viper.GetBool("dumpWorkflows") { - g, _ := os.Create(fmt.Sprintf("wf-processed-%s.json", timestamp)) + g, _ := os.Create(filepath.Join(cwd, fmt.Sprintf("wf-processed-%s.json", timestamp))) _, _ = pp.Fprintln(g, workflow) defer g.Close() } From 814bd3cab7472b78f19511fd2610fa432aeae4ea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 17 Jan 2023 17:18:30 +0100 Subject: [PATCH 1519/2352] [core] Ensure iteratorTemplates are also copied during ProcessTemplates --- core/workflow/iteratorrole.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 32b472aad..1eb9a6991 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -48,6 +48,7 @@ type templateMap map[string]interface{} type roleTemplate interface { Role + copyable generateRole(localVars map[string]string) (Role, error) } @@ -161,7 +162,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo } // Process templates for child roles (concurrently + fallback) - concurrency := viper.GetBool("concurrentWorkflowTemplateProcessing") + concurrency := viper.GetBool("concurrentWorkflowTemplateIteratorProcessing") if concurrency { var wg sync.WaitGroup @@ -281,7 +282,7 @@ func (i *iteratorRole) copy() copyable { iCopy := iteratorRole{ aggregator: *i.aggregator.copy().(*aggregator), For: i.For.copy().(iteratorRange), - template: i.template, // no copy because the template stays the same + template: i.template.copy().(roleTemplate), // the template must be copied too, because it is a pointer to something that might change } return &iCopy } From 2f10bd9208319c224e1c154d056b58b0c8adaf0f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 18 Jan 2023 17:02:35 +0100 Subject: [PATCH 1520/2352] [build] Bump to v0.59.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index eac918a0f..8a8bef73a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 58 -VERSION_PATCH := 3 +VERSION_MINOR := 59 +VERSION_PATCH := 0 From 7b24296322210d9f24ae813df64cb87b82afc155 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 Jan 2023 10:28:52 +0100 Subject: [PATCH 1521/2352] [core] Prevent flood of DCS gRPC client messages if err is Unavailable --- core/integration/dcs/client.go | 23 +++++++++++------------ core/integration/dcs/plugin.go | 9 +++++++++ 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 74cc1bf15..36aab7170 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -38,12 +38,11 @@ import ( "google.golang.org/grpc/keepalive" ) -var log = logger.New(logrus.StandardLogger(),"dcsclient") - +var log = logger.New(logrus.StandardLogger(), "dcsclient") type RpcClient struct { dcspb.ConfiguratorClient - conn *grpc.ClientConn + conn *grpc.ClientConn cancel context.CancelFunc } @@ -52,10 +51,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) "endpoint": endpoint, }).Debug("dialing DCS endpoint") - dialOptions := []grpc.DialOption { + dialOptions := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithConnectParams(grpc.ConnectParams{ - Backoff: backoff.Config{ + Backoff: backoff.Config{ BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, @@ -96,27 +95,27 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) for { select { - case ok := <- stateChangedNotify: + case ok := <-stateChangedNotify: if !ok { return } connState = conn.GetState() log.Debugf("DCS client %s", connState.String()) go notifyFunc(connState) - case <- time.After(2 * time.Minute): + case <-time.After(2 * time.Minute): if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() } - case <- cxt.Done(): + case <-cxt.Done(): return } } }() - client := &RpcClient { + client := &RpcClient{ ConfiguratorClient: dcspb.NewConfiguratorClient(conn), - conn: conn, - cancel: cancel, + conn: conn, + cancel: cancel, } return client @@ -132,4 +131,4 @@ func (m *RpcClient) GetConnState() connectivity.State { func (m *RpcClient) Close() error { m.cancel() return m.conn.Close() -} \ No newline at end of file +} diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 2090fec72..c8f5a9cf1 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -47,7 +47,9 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/status" ) const ( @@ -160,8 +162,15 @@ func (p *Plugin) Init(instanceId string) error { if err == io.EOF { break } + if err != nil { log.WithError(err).Error("bad event from DCS service") + sts, ok := status.FromError(err) + if ok && sts != nil { + if sts.Code() == codes.Unavailable { + time.Sleep(1 * time.Second) + } + } } log.WithField("event", ev.String()).Debug("received DCS event") } From 35530a8c392e099573a8bb86b92812a6d27a56dc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 20 Jan 2023 10:49:41 +0100 Subject: [PATCH 1522/2352] [build] Bump to v0.59.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8a8bef73a..bbfa510e8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 59 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 2ec7f35097d694cf7ce6456a0c161bbd4a5f827e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 23 Jan 2023 10:36:22 +0100 Subject: [PATCH 1523/2352] [coconut] Increase maximum received message size --- coconut/client.go | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/coconut/client.go b/coconut/client.go index 6965172ec..acfb73196 100644 --- a/coconut/client.go +++ b/coconut/client.go @@ -26,16 +26,18 @@ package coconut import ( - "google.golang.org/grpc" - "github.com/AliceO2Group/Control/common/logger" + "context" + "github.com/AliceO2Group/Control/coconut/protos" + "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" - "context" + "google.golang.org/grpc" ) var log = logger.New(logrus.StandardLogger(), "coconut") -const GrpcMaxCallRecvSize = 50*1024*1024 +const GrpcMaxCallRecvSize = 100 * 1024 * 1024 + type internalState struct { } @@ -56,10 +58,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) state := &internalState{} - client := &RpcClient { + client := &RpcClient{ ControlClient: pb.NewControlClient(conn), - state: state, - conn: conn, + state: state, + conn: conn, } return client @@ -67,10 +69,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) type RpcClient struct { pb.ControlClient - state *internalState - conn *grpc.ClientConn + state *internalState + conn *grpc.ClientConn } func (m *RpcClient) Close() error { return m.conn.Close() -} \ No newline at end of file +} From 370270b7b995fd488e06b679322ed76e198bbcdf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 23 Jan 2023 10:46:07 +0100 Subject: [PATCH 1524/2352] [core] Make concurrent WFT processing default to true --- core/config.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/config.go b/core/config.go index d14156dea..e684809be 100644 --- a/core/config.go +++ b/core/config.go @@ -115,9 +115,9 @@ func setDefaults() error { viper.SetDefault("fmqPluginSearchPath", "$CONTROL_OCCPLUGIN_ROOT/lib/") viper.SetDefault("bookkeepingToken", "token") viper.SetDefault("kafkaEndpoint", "localhost:9092") - viper.SetDefault("concurrentWorkflowTemplateProcessing", false) - viper.SetDefault("concurrentWorkflowTemplateIteratorProcessing", false) - viper.SetDefault("concurrentIteratorRoleExpansion", false) + viper.SetDefault("concurrentWorkflowTemplateProcessing", true) + viper.SetDefault("concurrentWorkflowTemplateIteratorProcessing", true) + viper.SetDefault("concurrentIteratorRoleExpansion", true) viper.SetDefault("reuseUnlockedTasks", false) viper.SetDefault("configCache", true) return nil From 5fd00860424954e237160d2006ca7204f09d42e5 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 23 Jan 2023 17:28:24 +0100 Subject: [PATCH 1525/2352] [core] Correct missing SOR timestamps even when UpdateRunStart wasn't called. --- core/integration/bookkeeping/plugin.go | 88 +++++++++++++++++++++----- 1 file changed, 71 insertions(+), 17 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 792b10c0a..651dc18d3 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -61,11 +61,12 @@ type Plugin struct { bookkeepingClient *RpcClient - pendingRunStops map[string] /*envId*/ int64 - pendingO2Starts map[string] /*envId*/ bool - pendingO2Stops map[string] /*envId*/ bool - pendingTrgStarts map[string] /*envId*/ bool - pendingTrgStops map[string] /*envId*/ bool + missingUpdateRunStarts map[string] /*envId*/ bool + pendingRunStops map[string] /*envId*/ int64 + pendingO2Starts map[string] /*envId*/ bool + pendingO2Stops map[string] /*envId*/ bool + pendingTrgStarts map[string] /*envId*/ bool + pendingTrgStops map[string] /*envId*/ bool } func NewPlugin(endpoint string) integration.Plugin { @@ -80,14 +81,15 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - bookkeepingHost: u.Hostname(), - bookkeepingPort: portNumber, - bookkeepingClient: nil, - pendingRunStops: make(map[string]int64), - pendingO2Starts: make(map[string]bool), - pendingO2Stops: make(map[string]bool), - pendingTrgStarts: make(map[string]bool), - pendingTrgStops: make(map[string]bool), + bookkeepingHost: u.Hostname(), + bookkeepingPort: portNumber, + bookkeepingClient: nil, + missingUpdateRunStarts: make(map[string]bool), + pendingRunStops: make(map[string]int64), + pendingO2Starts: make(map[string]bool), + pendingO2Stops: make(map[string]bool), + pendingTrgStarts: make(map[string]bool), + pendingTrgStops: make(map[string]bool), } } @@ -107,6 +109,21 @@ func (p *Plugin) GetConnectionState() string { return "READY" } +func (p *Plugin) missingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + if p.missingUpdateRunStarts == nil { + return nil + } + + out := make(map[uid.ID]bool) + + for _, envId := range envIds { + if missingStart, ok := p.missingUpdateRunStarts[envId.String()]; ok { + out[envId] = missingStart + } + } + return out +} + func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { if p.pendingRunStops == nil { return nil @@ -190,6 +207,7 @@ func (p *Plugin) GetData(_ []any) string { envIds := environment.ManagerInstance().Ids() outMap := make(map[string]interface{}) + outMap["missingUpdateRunStarts"] = p.missingUpdateRunStartsForEnvs(envIds) outMap["pendingRunStops"] = p.pendingRunStopsForEnvs(envIds) outMap["pendingO2Starts"] = p.pendingO2StartsForEnvs(envIds) outMap["pendingO2Stops"] = p.pendingO2StopsForEnvs(envIds) @@ -208,6 +226,7 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return nil } + inMissingStart := p.missingUpdateRunStartsForEnvs(envIds) inRunStopMap := p.pendingRunStopsForEnvs(envIds) inO2StartMap := p.pendingO2StartsForEnvs(envIds) inO2StopMap := p.pendingO2StopsForEnvs(envIds) @@ -218,6 +237,9 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { out := make(map[uid.ID]string) for _, envId := range envIds { + if missingStart, ok := inMissingStart[envId]; ok { + envMap["missingUpdateRunStart"] = missingStart + } if runStop, ok := inRunStopMap[envId]; ok { envMap["runNumber"] = runStop } @@ -460,6 +482,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } else { + p.missingUpdateRunStarts[envId] = true p.pendingRunStops[envId] = runNumber64 p.pendingO2Starts[envId] = true p.pendingO2Stops[envId] = true @@ -640,6 +663,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if timeTrgStartInput != "" || timeTrgStartTemp > 0 { timeTrgStartOutput = &timeTrgStartTemp } + // If UpdateRunStart was not called and the Trg start time is missing, + // it is set to the O2 start time. + if p.missingUpdateRunStarts[envId] == true && trgEnabled && timeTrgStartOutput == nil { + if p.pendingO2Starts[envId] == false { + timeTrgStartOutput = timeO2StartOutput + p.pendingTrgStarts[envId] = false + log.WithField("run", runNumber64). + WithField("partition", envId). + Debug("Bookkeeping API RunServiceClient: Update call: completing missing Trg start timestamp after missing UpdateRunStart call") + } else { + log.WithField("run", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 start time after missing UpdateRunStart call") + } + } timeTrgEndTemp, err = strconv.ParseInt(timeTrgEndInput, 10, 64) if err != nil { log.WithField("run", runNumber64). @@ -669,12 +707,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ReadoutCfgUri: &readoutUri, } + // If it is an UpdateRunStop call, then SOR timestamps can be updated in the request under certain conditions if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { - if timeO2StartOutput != nil && timeTrgStartOutput == nil { + // If O2 start time is not available after UpdateRunStart was missing, + // we can't update it anymore as we have no way of knowing/approximating it. + // Else if O2 start time or Trg start time is available, we can update it safely + // because it means that even if they weren't missing during the UpdateRunStart call, + // they will be the same and can be overwritten. + if p.missingUpdateRunStarts[envId] == true && timeO2StartOutput == nil { + log.WithField("run", runNumber64). + WithField("partition", envId). + Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing SOR timestamps after missing UpdateRunStart call") + } else if timeO2StartOutput == nil && timeTrgStartOutput != nil { inRun = bkpb.RunUpdateRequest{ RunNumber: int32(runNumber64), - TimeO2Start: timeO2StartOutput, TimeO2End: timeO2EndOutput, + TimeTrgStart: timeTrgStartOutput, TimeTrgEnd: timeTrgEndOutput, TriggerValue: &trg, PdpConfigOption: &pdpConfig, @@ -686,11 +734,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { PdpBeamType: &pdpBeam, ReadoutCfgUri: &readoutUri, } - } else if timeO2StartOutput == nil && timeTrgStartOutput != nil { + } else if timeO2StartOutput != nil && timeTrgStartOutput == nil { inRun = bkpb.RunUpdateRequest{ RunNumber: int32(runNumber64), + TimeO2Start: timeO2StartOutput, TimeO2End: timeO2EndOutput, - TimeTrgStart: timeTrgStartOutput, TimeTrgEnd: timeTrgEndOutput, TriggerValue: &trg, PdpConfigOption: &pdpConfig, @@ -722,6 +770,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { var updatedRun string if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { + if p.missingUpdateRunStarts[envId] == true { + defer delete(p.pendingO2Starts, envId) + defer delete(p.pendingTrgStarts, envId) + } defer delete(p.pendingRunStops, envId) defer delete(p.pendingO2Stops, envId) defer delete(p.pendingTrgStops, envId) @@ -863,6 +915,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingTrgStarts[envId] = false } + p.missingUpdateRunStarts[envId] = false + return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") } stack["UpdateRunStop"] = func() (out string) { From e34e0586f7cc8ebe325795eceda17f16ae7c9de6 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Mon, 23 Jan 2023 17:32:08 +0100 Subject: [PATCH 1526/2352] [core] Fix to match Bookkeeping proto field changes. --- core/integration/bookkeeping/plugin.go | 2 +- core/integration/bookkeeping/protos/flp.pb.go | 10 +++++----- core/integration/bookkeeping/protos/flp.proto | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 651dc18d3..81e94c298 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -529,7 +529,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { for _, flp := range flps { inFlp := &bkpb.FlpCreationRequest{ Name: flp, - HostName: flp, + Hostname: flp, RunNumber: &runNumber32, } inFlps.Flps = append(inFlps.Flps, inFlp) diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index 895123066..46ec85a35 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -26,7 +26,7 @@ type FlpCreationRequest struct { unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - HostName string `protobuf:"bytes,2,opt,name=hostName,proto3" json:"hostName,omitempty"` + Hostname string `protobuf:"bytes,2,opt,name=hostname,proto3" json:"hostname,omitempty"` RunNumber *int32 `protobuf:"varint,3,opt,name=runNumber,proto3,oneof" json:"runNumber,omitempty"` } @@ -69,9 +69,9 @@ func (x *FlpCreationRequest) GetName() string { return "" } -func (x *FlpCreationRequest) GetHostName() string { +func (x *FlpCreationRequest) GetHostname() string { if x != nil { - return x.HostName + return x.Hostname } return "" } @@ -306,8 +306,8 @@ var file_protos_flp_proto_rawDesc = []byte{ 0x6e, 0x67, 0x22, 0x75, 0x0a, 0x12, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x51, 0x0a, 0x17, 0x4d, 0x61, 0x6e, diff --git a/core/integration/bookkeeping/protos/flp.proto b/core/integration/bookkeeping/protos/flp.proto index 66fa78242..d4077d7e9 100644 --- a/core/integration/bookkeeping/protos/flp.proto +++ b/core/integration/bookkeeping/protos/flp.proto @@ -13,7 +13,7 @@ service FlpService { message FlpCreationRequest { string name = 1; - string hostName = 2; + string hostname = 2; optional int32 runNumber = 3; } From ffbf613bd3cfcf6ffb109c5a152855f059ee01cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 26 Jan 2023 10:54:45 +0100 Subject: [PATCH 1527/2352] [core] Add CALIBRATION_PULSE_LENGTH and CALIBRATION_VRESETD run types --- apricot/protos/apricot.pb.go | 237 +++++++++++++++--------------- apricot/protos/apricot.proto | 4 +- apricot/protos/apricot_grpc.pb.go | 2 +- common/runtype/runtype.go | 2 + common/runtype/runtype_strings.go | 16 +- 5 files changed, 140 insertions(+), 121 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index f4643156c..ecd1e10eb 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.12 // source: protos/apricot.proto package apricotpb @@ -43,8 +43,6 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go -// NOTE: this run type list is replicated in AliceO2 repo in GRPECSObject.h. Inform Ruben when the list is updated. type RunType int32 const ( @@ -65,6 +63,8 @@ const ( RunType_COSMICS RunType = 14 RunType_SYNTHETIC RunType = 15 RunType_NOISE RunType = 16 + RunType_CALIBRATION_PULSE_LENGTH RunType = 17 + RunType_CALIBRATION_VRESETD RunType = 18 RunType_ANY RunType = 300 ) @@ -88,6 +88,8 @@ var ( 14: "COSMICS", 15: "SYNTHETIC", 16: "NOISE", + 17: "CALIBRATION_PULSE_LENGTH", + 18: "CALIBRATION_VRESETD", 300: "ANY", } RunType_value = map[string]int32{ @@ -108,6 +110,8 @@ var ( "COSMICS": 14, "SYNTHETIC": 15, "NOISE": 16, + "CALIBRATION_PULSE_LENGTH": 17, + "CALIBRATION_VRESETD": 18, "ANY": 300, } ) @@ -1881,7 +1885,7 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x2a, 0xe0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x73, 0x2a, 0x97, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, @@ -1902,121 +1906,124 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, - 0x45, 0x10, 0x10, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, - 0x11, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, + 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, + 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, + 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, + 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, + 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, + 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, + 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, + 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, + 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, + 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, - 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, - 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, - 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, + 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, + 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, - 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, + 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index e998424ef..a8802cc0a 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -81,7 +81,9 @@ enum RunType { COSMICS = 14; SYNTHETIC = 15; NOISE = 16; - reserved 17 to 299; + CALIBRATION_PULSE_LENGTH = 17; + CALIBRATION_VRESETD = 18; + reserved 19 to 299; ANY = 300; } diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 0bf0ce99a..4a0652610 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.12 // source: protos/apricot.proto package apricotpb diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index f0db04b5e..15ac96049 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -50,4 +50,6 @@ const ( COSMICS // no correspondence with DCS SYNTHETIC // no correspondence with DCS NOISE + CALIBRATION_PULSE_LENGTH + CALIBRATION_VRESETD ) diff --git a/common/runtype/runtype_strings.go b/common/runtype/runtype_strings.go index fe60abb40..63acb7274 100644 --- a/common/runtype/runtype_strings.go +++ b/common/runtype/runtype_strings.go @@ -8,11 +8,11 @@ import ( "strings" ) -const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMICSSYNTHETICNOISE" +const _RunTypeName = "NONEPHYSICSTECHNICALPEDESTALPULSERLASERCALIBRATION_ITHR_TUNINGCALIBRATION_VCASN_TUNINGCALIBRATION_THR_SCANCALIBRATION_DIGITAL_SCANCALIBRATION_ANALOG_SCANCALIBRATION_FHRCALIBRATION_ALPIDE_SCANCALIBRATIONCOSMICSSYNTHETICNOISECALIBRATION_PULSE_LENGTHCALIBRATION_VRESETD" -var _RunTypeIndex = [...]uint8{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 209, 218, 223} +var _RunTypeIndex = [...]uint16{0, 4, 11, 20, 28, 34, 39, 62, 86, 106, 130, 153, 168, 191, 202, 209, 218, 223, 247, 266} -const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmicssyntheticnoise" +const _RunTypeLowerName = "nonephysicstechnicalpedestalpulserlasercalibration_ithr_tuningcalibration_vcasn_tuningcalibration_thr_scancalibration_digital_scancalibration_analog_scancalibration_fhrcalibration_alpide_scancalibrationcosmicssyntheticnoisecalibration_pulse_lengthcalibration_vresetd" func (i RunType) String() string { if i < 0 || i >= RunType(len(_RunTypeIndex)-1) { @@ -42,9 +42,11 @@ func _RunTypeNoOp() { _ = x[COSMICS-(14)] _ = x[SYNTHETIC-(15)] _ = x[NOISE-(16)] + _ = x[CALIBRATION_PULSE_LENGTH-(17)] + _ = x[CALIBRATION_VRESETD-(18)] } -var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMICS, SYNTHETIC, NOISE} +var _RunTypeValues = []RunType{NONE, PHYSICS, TECHNICAL, PEDESTAL, PULSER, LASER, CALIBRATION_ITHR_TUNING, CALIBRATION_VCASN_TUNING, CALIBRATION_THR_SCAN, CALIBRATION_DIGITAL_SCAN, CALIBRATION_ANALOG_SCAN, CALIBRATION_FHR, CALIBRATION_ALPIDE_SCAN, CALIBRATION, COSMICS, SYNTHETIC, NOISE, CALIBRATION_PULSE_LENGTH, CALIBRATION_VRESETD} var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeName[0:4]: NONE, @@ -81,6 +83,10 @@ var _RunTypeNameToValueMap = map[string]RunType{ _RunTypeLowerName[209:218]: SYNTHETIC, _RunTypeName[218:223]: NOISE, _RunTypeLowerName[218:223]: NOISE, + _RunTypeName[223:247]: CALIBRATION_PULSE_LENGTH, + _RunTypeLowerName[223:247]: CALIBRATION_PULSE_LENGTH, + _RunTypeName[247:266]: CALIBRATION_VRESETD, + _RunTypeLowerName[247:266]: CALIBRATION_VRESETD, } var _RunTypeNames = []string{ @@ -101,6 +107,8 @@ var _RunTypeNames = []string{ _RunTypeName[202:209], _RunTypeName[209:218], _RunTypeName[218:223], + _RunTypeName[223:247], + _RunTypeName[247:266], } // RunTypeString retrieves an enum value from the enum constants string name. From ea9cae04e2e1e7787a35dd501e9e75cbded98ac1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 30 Jan 2023 16:52:20 +0100 Subject: [PATCH 1528/2352] [core] Fix crash when checking critical trait of unknown task --- core/task/manager.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index d51b1c697..b9395fe0d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -765,10 +765,11 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s } taskDescription = fmt.Sprintf("task '%s' on %s (id %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), v.Error()) + } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } - if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { + if task != nil && (task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true) { taskCriticalErrors = append(taskCriticalErrors, taskDescription) } else { taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) From e78ca94685825c3a9b41fcf6a0a38ffcbcd81130 Mon Sep 17 00:00:00 2001 From: claireguyot Date: Thu, 26 Jan 2023 19:01:17 +0100 Subject: [PATCH 1529/2352] [core] Add comments and explanations to the core Bookkeeping plugin. --- core/integration/bookkeeping/plugin.go | 88 +++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 81e94c298..65c3cf83c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -21,6 +21,8 @@ * immunities granted to it by virtue of its status as an * Intergovernmental Organization or submit itself to any jurisdiction. */ + +// Generate protofiles using the .protos imported from Bookkeeping in the Makefile //go:generate protoc --go_out=. --go_opt=paths=source_relative protos/common.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/environment.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/flp.proto @@ -59,8 +61,11 @@ type Plugin struct { bookkeepingHost string bookkeepingPort int + // Plugin client connecting to the Bookkeeping gRPC server bookkeepingClient *RpcClient + // Indicators linked to each ongoing environment that give some plugin-specific + // data about the status of the current run (of that environment) missingUpdateRunStarts map[string] /*envId*/ bool pendingRunStops map[string] /*envId*/ int64 pendingO2Starts map[string] /*envId*/ bool @@ -69,6 +74,9 @@ type Plugin struct { pendingTrgStops map[string] /*envId*/ bool } +/**********************************************/ +// Plugin and inherited methods Instanciation // +/**********************************************/ func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -109,6 +117,9 @@ func (p *Plugin) GetConnectionState() string { return "READY" } +/*******************************************************/ +// Utility methods for GetData and GetEnvironmentsData // +/*******************************************************/ func (p *Plugin) missingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.missingUpdateRunStarts == nil { return nil @@ -199,6 +210,11 @@ func (p *Plugin) pendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { return out } +/*******************************************/ +// GetData and GetEnvironmentsData methods // +/*******************************************/ + +// Make plugin-specific data across all instances available per data field func (p *Plugin) GetData(_ []any) string { if p == nil || p.bookkeepingClient == nil { return "" @@ -221,6 +237,7 @@ func (p *Plugin) GetData(_ []any) string { return string(out[:]) } +// Make plugin-specific data across all instances available per environment func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { if p == nil || p.bookkeepingClient == nil { return nil @@ -263,6 +280,9 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return out } +/*************************************/ +// Initialize the Bookkeeping client // +/*************************************/ func (p *Plugin) Init(instanceId string) error { if p.bookkeepingClient == nil { cxt, cancel := context.WithCancel(context.Background()) @@ -275,22 +295,35 @@ func (p *Plugin) Init(instanceId string) error { return nil } +/*************************************/ +// ObjectStack and CallStack methods // +/*************************************/ + +// ObjectStack method func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) return stack } +// CallStack method, which adds functions to the call stack that can then be called +// under certain conditions via hooks and triggers in the readout-dataflow workflow func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + + /*** Set variables that are available to all functions in the call stack ***/ call, ok := data.(*callable.Call) if !ok { return } + // The varStack is a map of variables available throughout the core and is a collection + // of Defaults, Vars and UserVars from the environment, as well as runtime variables set + // in other parts of AliECS varStack := call.VarStack envId, ok := varStack["environment_id"] if !ok { err := errors.New("cannot acquire environment ID") log.Error(err) + // These two lines are necessary to get the error out of the scope of only that function call call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = "Bookkeeping plugin Call Stack failed" return @@ -340,8 +373,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) - // Run related Bookkeeping functions + + /*****************************/ + /*** Run related functions ***/ + /*****************************/ + + // StartOfRun function that creates the run in Bookkeeping and initializes it with minimal information stack["StartOfRun"] = func() (out string) { + + /*** Get variables that are available at run creation (before START_ACTIVITY) ***/ callFailedStr := "Bookkeeping StartOfRun call failed" rn := varStack["run_number"] @@ -426,6 +466,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorsList = append(detectorsList, bkpb.Detector(bkpb.Detector_value["DETECTOR_"+name])) } + /*** Create and send creation requests to Bookkeeping server ***/ + inRun := bkpb.RunCreationRequest{ RunNumber: runNumber32, EnvironmentId: env.Id().String(), @@ -441,11 +483,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Detectors: detectorsList, } + // Send the run creation request timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() _, err1 := p.bookkeepingClient.RunServiceClient.Create(ctx, &inRun, grpc.EmptyCallOption{}) if err1 != nil { + // If the run creation request fails, we still send a log creation request log.WithError(err1). WithField("run", runNumber64). WithField("partition", envId). @@ -482,6 +526,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } else { + // If the run creation request succeeds, we set the run status indicators p.missingUpdateRunStarts[envId] = true p.pendingRunStops[envId] = runNumber64 p.pendingO2Starts[envId] = true @@ -502,6 +547,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ParentLogId: nil, } + // Send the log creation request timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateLog", envId) ctx, cancel = context.WithTimeout(context.Background(), timeout) defer cancel() @@ -535,6 +581,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { inFlps.Flps = append(inFlps.Flps, inFlp) } + // Send the flps creation request timeout = callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "CreateFlp", envId) ctx, cancel = context.WithTimeout(context.Background(), timeout) defer cancel() @@ -556,7 +603,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } + + // Update function common to UpdateRunStart and UpdateRunStop updateRunFunc := func(runNumber64 int64, state string, timeO2StartInput string, timeO2EndInput string, timeTrgStartInput string, timeTrgEndInput string) (out string) { + + /*** Get variables that are available when the update is called ***/ callFailedStr := "Bookkeeping UpdateRun call failed" trgGlobalRunEnabled, err := strconv.ParseBool(env.GetKV("", "trg_global_run_enabled")) if err != nil { @@ -623,6 +674,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { lhcPeriod := env.GetKV("", "lhc_period") readoutUri, ok := varStack["readout_cfg_uri"] + // O2 timestamps formatting var timeO2StartOutput *int64 = nil timeO2StartTemp, err := strconv.ParseInt(timeO2StartInput, 10, 64) if err != nil { @@ -648,6 +700,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if timeO2EndInput != "" || timeO2EndTemp > 0 { timeO2EndOutput = &timeO2EndTemp } + + // Trg timestamps formatting var timeTrgStartTemp int64 = -1 var timeTrgStartOutput *int64 = nil var timeTrgEndTemp int64 = -1 @@ -690,6 +744,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } + // Create the run update struct inRun := bkpb.RunUpdateRequest{ RunNumber: int32(runNumber64), TimeO2Start: timeO2StartOutput, @@ -753,6 +808,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } + // Send the run update request timeout := callable.AcquireTimeout(BKP_RUN_TIMEOUT, varStack, "UpdateRun", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -770,6 +826,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { var updatedRun string if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { + // If the update is successful and it is an UpdateRunStop call, we check if we are missing + // EOR timestamps, and if that is the case, we set them to Now() and send a new update request if p.missingUpdateRunStarts[envId] == true { defer delete(p.pendingO2Starts, envId) defer delete(p.pendingTrgStarts, envId) @@ -821,6 +879,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { updatedRun = "STOPPED" } } else if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStart") { + // If the update is successful and it is an UpdateRunStart call, we check if we are missing + // SOR timestamps, and if that is the case, we set them to Now() and send a new update request defer delete(p.pendingO2Starts, envId) defer delete(p.pendingTrgStarts, envId) if p.pendingO2Starts[envId] == true || (trgEnabled && p.pendingTrgStarts[envId] == true) { @@ -874,7 +934,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } + + // UpdateRunStart function that updates the run in Bookkeeping with all available information stack["UpdateRunStart"] = func() (out string) { + + /*** Get variables that are available at run start update (after START_ACTIVITY) ***/ callFailedStr := "Bookkeeping UpdateRunStart call failed" rn := varStack["run_number"] @@ -919,7 +983,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") } + + // UpdateRunStop function that updates the run in Bookkeeping with all available information and deletes it from the plugin stack["UpdateRunStop"] = func() (out string) { + + /*** Get variables that are available at run stop update (after STOP_ACTIVITY, GO_ERROR or DESTROY) ***/ callFailedStr := "Bookkeeping UpdateRunStop call failed" rn := varStack["run_number"] @@ -982,8 +1050,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } } - // Environment related Bookkeeping functions + + /*************************************/ + /*** Environment related functions ***/ + /*************************************/ + + // CreateEnv function that creates the environment in Bookkeeping stack["CreateEnv"] = func() (out string) { + + /*** Get variables that are available at environment creation (before DEPLOY) ***/ callFailedStr := "Bookkeeping CreateEnv call failed" if p.bookkeepingClient == nil { @@ -1012,6 +1087,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { statusMessage = "error: the environment is in " + envState + " state after creation" } + /*** Create and send environment creation request to Bookkeeping server ***/ + inEnv := bkpb.EnvironmentCreationRequest{ Id: env.Id().String(), CreatedAt: &createdAt, @@ -1041,9 +1118,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } + + // Update function for UpdateEnv updateEnvFunc := func(envId string, toredownAt int64, status string, statusMessage string) (out string) { callFailedStr := "Bookkeeping UpdateEnv call failed" + /*** Create and send environment update request to Bookkeeping server ***/ + inEnv := bkpb.EnvironmentUpdateRequest{ Id: env.Id().String(), ToredownAt: &toredownAt, @@ -1071,6 +1152,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } + + // UpdateEnv function that updates the environment in Bookkeeping with all available information stack["UpdateEnv"] = func() (out string) { callFailedStr := "Bookkeeping UpdateEnv call failed" @@ -1090,6 +1173,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + // We update the environment status depending on the current environment state machine status envState := env.CurrentState() if strings.Contains(trigger, "DESTROY") { From 193954dfbe089d27b493235d771be6ed9127a241 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 1 Feb 2023 10:38:32 +0100 Subject: [PATCH 1530/2352] [core] Add ITS run types to common.proto for bookkeeping --- core/integration/bookkeeping/protos/common.proto | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/integration/bookkeeping/protos/common.proto b/core/integration/bookkeeping/protos/common.proto index a726b6ca1..8fe7a1222 100644 --- a/core/integration/bookkeeping/protos/common.proto +++ b/core/integration/bookkeeping/protos/common.proto @@ -58,6 +58,8 @@ enum RunType { RUN_TYPE_COSMICS = 14; RUN_TYPE_SYNTHETIC = 15; RUN_TYPE_NOISE = 16; + RUN_TYPE_CALIBRATION_PULSE_LENGTH = 17; + RUN_TYPE_CALIBRATION_VRESETD = 18; } message Run { From d521df88e368099e0bd9eacf333716cb4009e8c5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 2 Feb 2023 10:24:04 +0100 Subject: [PATCH 1531/2352] [build] Bump to v0.60.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index bbfa510e8..fd8528961 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 59 -VERSION_PATCH := 1 +VERSION_MINOR := 60 +VERSION_PATCH := 0 From 81c8fab20a4172579beb7e912f148b9390e9411b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 23 Jan 2023 13:56:30 +0100 Subject: [PATCH 1532/2352] [QC-902] tune OCC log levels info becomes detail, which should be translated to IL's debug, but in contrast to FairLogger's debug, it should appear in Release builds. --- occ/plugin/OccLiteServer.cxx | 8 ++++---- occ/plugin/litestructs/JsonMessage.cxx | 6 +++--- occ/plugin/litestructs/Transition.cxx | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 304416e1c..418bfddf7 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -79,14 +79,14 @@ ::grpc::Status OccLite::Service::GetState(::grpc::ServerContext* context, (void) context; (void) request; - OLOG(info) << "Incoming GetState request: " << request->JsonMessage::Serialize(); + OLOG(detail) << "Incoming GetState request: " << request->JsonMessage::Serialize(); auto state = fair::mq::PluginServices::ToStr(m_pluginServices->GetCurrentDeviceState()); pid_t pid = getpid(); response->state = state; response->pid = pid; - OLOG(info) << "GetState response: " << response->state; + OLOG(detail) << "GetState response: " << response->state; return grpc::Status::OK; } @@ -95,7 +95,7 @@ ::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, const OccLite::nopb::TransitionRequest* request, OccLite::nopb::TransitionResponse* response) { - OLOG(info) << "Incoming Transition request: " << request->JsonMessage::Serialize(); + OLOG(detail) << "Incoming Transition request: " << request->JsonMessage::Serialize(); auto transitionOutcome = doTransition(m_pluginServices, *request); ::grpc::Status grpcStatus = std::get<1>(transitionOutcome); @@ -106,7 +106,7 @@ ::grpc::Status OccLite::Service::Transition(::grpc::ServerContext* context, auto nopbResponse = std::get<0>(transitionOutcome); *response = nopbResponse; - OLOG(info) << "Transition response: " << response->state << " ok: " << response->ok; + OLOG(detail) << "Transition response: " << response->state << " ok: " << response->ok; return grpc::Status::OK; } diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index 15c1d7d17..576c8b378 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -62,7 +62,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) auto status = byte_buffer->Dump(slices); if (!status.ok()) { - OLOG(info) << "Cannot dump JsonMessage slices, error code " << status.error_code() << " " << status.error_message() << " " << status.error_details(); + OLOG(error) << "Cannot dump JsonMessage slices, error code " << status.error_code() << " " << status.error_message() << " " << status.error_details(); return false; } @@ -74,7 +74,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); } - OLOG(info) << "Deserialized JsonMessage: " << ss.str(); + OLOG(detail) << "Deserialized JsonMessage: " << ss.str(); return Deserialize(ss.str()); } @@ -82,7 +82,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) ::grpc::ByteBuffer* OccLite::nopb::JsonMessage::SerializeToByteBuffer() const { std::string str = Serialize(); - OLOG(info) << "Serialized JsonMessage: " << str; + OLOG(detail) << "Serialized JsonMessage: " << str; // grpc::string = std::string // We build a Slice(grpc::string) and we add it to the ByteBuffer diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index e0d539bdf..f4e185670 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -56,7 +56,7 @@ bool OccLite::nopb::TransitionRequest::Deserialize(const rapidjson::Value& obj) arguments.push_back(*ce); } } - OLOG(info) << "Deserialized TransitionRequest: " << JsonMessage::Serialize(); + OLOG(detail) << "Deserialized TransitionRequest: " << JsonMessage::Serialize(); return true; } From dc7428d33e498b9565520eaf69040579d9a1bcdf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 2 Feb 2023 11:00:46 +0100 Subject: [PATCH 1533/2352] [build] Bump to v0.60.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fd8528961..04e1d9b03 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 60 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From eeefffac26b9071033c1d8c59bdf231d8a3a99c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Feb 2023 10:44:04 +0100 Subject: [PATCH 1534/2352] [core] Return smaller environment info payload in NewEnvironment error --- core/server.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/server.go b/core/server.go index 87ceb49ac..1d49ccf9e 100644 --- a/core/server.go +++ b/core/server.go @@ -293,7 +293,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Id: id.String(), CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close - UserVars: request.GetVars(), NumberOfFlps: 0, } st, _ = st.WithDetails(ei) @@ -309,7 +308,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Id: id.String(), CreatedWhen: time.Now().UnixMilli(), State: "ERROR", // not really, but close - UserVars: request.GetVars(), NumberOfFlps: 0, } st, _ = st.WithDetails(ei) @@ -329,6 +327,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme defaults = newEnv.GlobalDefaults.Raw() vars = newEnv.GlobalVars.Raw() userVars = newEnv.UserVars.Raw() + err = nil } integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData([]uid.ID{id}) From 8a10c69fcb795b34920eabdc4228ecc810cdf934 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Feb 2023 11:07:00 +0100 Subject: [PATCH 1535/2352] [build] Bump to v0.60.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 04e1d9b03..a1aac54c0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 60 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From eeef1af972a29d1f871b6bae68fbe2bd73354d01 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Feb 2023 17:10:40 +0100 Subject: [PATCH 1536/2352] [core] Limit gRPC error status messages to 90k characters --- core/server.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/server.go b/core/server.go index 1d49ccf9e..4b86293e8 100644 --- a/core/server.go +++ b/core/server.go @@ -54,6 +54,8 @@ import ( "github.com/AliceO2Group/Control/core/protos" ) +const MAX_ERROR_LENGTH = 90000 // gRPC seems to impose this limit on the status message + func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() pb.RegisterControlServer(s, &RpcServer{ @@ -288,7 +290,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme id := uid.NilID() id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) if err != nil { - st := status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()) + st := status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()[:MAX_ERROR_LENGTH]) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), @@ -303,7 +305,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme newEnv, err := m.state.environments.Environment(id) if err != nil { - st := status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()) + st := status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()[:MAX_ERROR_LENGTH]) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), From 3c09419afde19676c169964de696b002d8d05b1d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Feb 2023 17:26:44 +0100 Subject: [PATCH 1537/2352] [core] Ensure correct truncation at 85k chars --- core/server.go | 6 +++--- core/serverutil.go | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/core/server.go b/core/server.go index 4b86293e8..2b142d649 100644 --- a/core/server.go +++ b/core/server.go @@ -54,7 +54,7 @@ import ( "github.com/AliceO2Group/Control/core/protos" ) -const MAX_ERROR_LENGTH = 90000 // gRPC seems to impose this limit on the status message +const MAX_ERROR_LENGTH = 85000 // gRPC seems to impose this limit on the status message func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() @@ -290,7 +290,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme id := uid.NilID() id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) if err != nil { - st := status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()[:MAX_ERROR_LENGTH]) + st := status.Newf(codes.Internal, "cannot create new environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), @@ -305,7 +305,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme newEnv, err := m.state.environments.Environment(id) if err != nil { - st := status.Newf(codes.Internal, "cannot get newly created environment: %s", err.Error()[:MAX_ERROR_LENGTH]) + st := status.Newf(codes.Internal, "cannot get newly created environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), diff --git a/core/serverutil.go b/core/serverutil.go index e8a9e88aa..3eefb9aeb 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -27,6 +27,7 @@ package core import ( "fmt" "sync" + "unicode/utf8" "github.com/AliceO2Group/Control/core/repos" @@ -270,3 +271,15 @@ func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { } return pb.VarSpecMessage_Type(msgType) } + +func TruncateString(str string, length int) string { + if length <= 0 { + return "" + } + + if utf8.RuneCountInString(str) < length { + return str + } + + return string([]rune(str)[:length]) +} From 44159d02d31fc5c2b3858a0f5f5603b0d0bcb21b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Feb 2023 17:31:03 +0100 Subject: [PATCH 1538/2352] [build] Bump to v0.60.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a1aac54c0..da30c318e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 60 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From 2b1bb6b892669e75d871b7b225465d78f7f65f08 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Feb 2023 16:35:34 +0100 Subject: [PATCH 1539/2352] [core] Avoid shadowing "env" --- core/config.go | 38 +++++++++++++++++++------------------- core/envutil.go | 14 +++++++------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/core/config.go b/core/config.go index e684809be..fc8e2cbc8 100644 --- a/core/config.go +++ b/core/config.go @@ -59,38 +59,38 @@ func setDefaults() error { viper.SetDefault("consulBasePath", "o2/components/aliecs/ANY/any") viper.SetDefault("coreWorkingDir", "/var/lib/o2/aliecs") viper.SetDefault("defaultRepo", "github.com/AliceO2Group/ControlWorkflows/") - viper.SetDefault("executor", env("EXEC_BINARY", filepath.Join(exeDir, "o2-aliecs-executor"))) - viper.SetDefault("executorCPU", envFloat("EXEC_CPU", "0.01")) - viper.SetDefault("executorMemory", envFloat("EXEC_MEMORY", "64")) + viper.SetDefault("executor", getenv("EXEC_BINARY", filepath.Join(exeDir, "o2-aliecs-executor"))) + viper.SetDefault("executorCPU", getenvFloat("EXEC_CPU", "0.01")) + viper.SetDefault("executorMemory", getenvFloat("EXEC_MEMORY", "64")) viper.SetDefault("globalDefaultRevision", "master") viper.SetDefault("instanceName", fmt.Sprintf("%s instance", product.PRETTY_SHORTNAME)) - viper.SetDefault("mesosApiTimeout", envDuration("MESOS_CONNECT_TIMEOUT", "20s")) - viper.SetDefault("mesosAuthMode", env("AUTH_MODE", "")) + viper.SetDefault("mesosApiTimeout", getenvDuration("MESOS_CONNECT_TIMEOUT", "20s")) + viper.SetDefault("mesosAuthMode", getenv("AUTH_MODE", "")) viper.SetDefault("mesosCheckpoint", true) viper.SetDefault("mesosCompression", false) viper.SetDefault("mesosUseSystemProxy", false) - viper.SetDefault("mesosCredentials.username", env("AUTH_USER", "")) - viper.SetDefault("mesosCredentials.passwordFile", env("AUTH_PASSWORD_FILE", "")) - viper.SetDefault("mesosExecutorImage", env("EXEC_IMAGE", "")) - viper.SetDefault("mesosFailoverTimeout", envDuration("SCHEDULER_FAILOVER_TIMEOUT", "1000h")) + viper.SetDefault("mesosCredentials.username", getenv("AUTH_USER", "")) + viper.SetDefault("mesosCredentials.passwordFile", getenv("AUTH_PASSWORD_FILE", "")) + viper.SetDefault("mesosExecutorImage", getenv("EXEC_IMAGE", "")) + viper.SetDefault("mesosFailoverTimeout", getenvDuration("SCHEDULER_FAILOVER_TIMEOUT", "1000h")) viper.SetDefault("mesosFrameworkHostname", "") - viper.SetDefault("mesosFrameworkName", env("FRAMEWORK_NAME", product.NAME)) + viper.SetDefault("mesosFrameworkName", getenv("FRAMEWORK_NAME", product.NAME)) viper.SetDefault("mesosFrameworkRole", "") - viper.SetDefault("mesosFrameworkUser", env("FRAMEWORK_USER", "root")) + viper.SetDefault("mesosFrameworkUser", getenv("FRAMEWORK_USER", "root")) viper.SetDefault("mesosGpuClusterCompat", false) - viper.SetDefault("mesosJobRestartDelay", envDuration("JOB_RESTART_DELAY", "5s")) + viper.SetDefault("mesosJobRestartDelay", getenvDuration("JOB_RESTART_DELAY", "5s")) viper.SetDefault("mesosLabels", schedutil.Labels{}) - viper.SetDefault("mesosMaxRefuseSeconds", envDuration("MAX_REFUSE_SECONDS", "5s")) + viper.SetDefault("mesosMaxRefuseSeconds", getenvDuration("MAX_REFUSE_SECONDS", "5s")) viper.SetDefault("mesosPrincipal", "") - viper.SetDefault("mesosReviveBurst", envInt("REVIVE_BURST", "3")) - viper.SetDefault("mesosReviveWait", envDuration("REVIVE_WAIT", "1s")) + viper.SetDefault("mesosReviveBurst", getenvInt("REVIVE_BURST", "3")) + viper.SetDefault("mesosReviveWait", getenvDuration("REVIVE_WAIT", "1s")) viper.SetDefault("mesosResourceTypeMetrics", false) - viper.SetDefault("mesosUrl", env("MESOS_MASTER_HTTP", "http://:5050/api/v1/scheduler")) + viper.SetDefault("mesosUrl", getenv("MESOS_MASTER_HTTP", "http://:5050/api/v1/scheduler")) viper.SetDefault("mesosCredentials.username", "") viper.SetDefault("mesosCredentials.passwordFile", "") - viper.SetDefault("metrics.address", env("LIBPROCESS_IP", "127.0.0.1")) - viper.SetDefault("metrics.port", envInt("PORT0", "64009")) - viper.SetDefault("metrics.path", env("METRICS_API_PATH", "/metrics")) + viper.SetDefault("metrics.address", getenv("LIBPROCESS_IP", "127.0.0.1")) + viper.SetDefault("metrics.port", getenvInt("PORT0", "64009")) + viper.SetDefault("metrics.path", getenv("METRICS_API_PATH", "/metrics")) viper.SetDefault("reposSshKey", "") viper.SetDefault("summaryMetrics", false) viper.SetDefault("verbose", false) diff --git a/core/envutil.go b/core/envutil.go index 4b004282f..de1edd83d 100644 --- a/core/envutil.go +++ b/core/envutil.go @@ -30,31 +30,31 @@ import ( "time" ) -func env(key, defaultValue string) (value string) { +func getenv(key, defaultValue string) (value string) { if value = os.Getenv(key); value == "" { value = defaultValue } return } -func envInt(key, defaultValue string) int { - value, err := strconv.Atoi(env(key, defaultValue)) +func getenvInt(key, defaultValue string) int { + value, err := strconv.Atoi(getenv(key, defaultValue)) if err != nil { panic(err.Error()) } return value } -func envDuration(key, defaultValue string) time.Duration { - value, err := time.ParseDuration(env(key, defaultValue)) +func getenvDuration(key, defaultValue string) time.Duration { + value, err := time.ParseDuration(getenv(key, defaultValue)) if err != nil { panic(err.Error()) } return value } -func envFloat(key, defaultValue string) float64 { - value, err := strconv.ParseFloat(env(key, defaultValue), 64) +func getenvFloat(key, defaultValue string) float64 { + value, err := strconv.ParseFloat(getenv(key, defaultValue), 64) if err != nil { panic(err.Error()) } From aabdfd87421895aec75c1ef1667bac8d5b7d403a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Feb 2023 16:35:52 +0100 Subject: [PATCH 1540/2352] [core] Set max error length to 6k chars --- core/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 2b142d649..282706bd7 100644 --- a/core/server.go +++ b/core/server.go @@ -54,7 +54,7 @@ import ( "github.com/AliceO2Group/Control/core/protos" ) -const MAX_ERROR_LENGTH = 85000 // gRPC seems to impose this limit on the status message +const MAX_ERROR_LENGTH = 6000 // gRPC seems to impose this limit on the status message func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() From 40c4c43ca02bc39b7e9250b292c1867b826a951c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Feb 2023 16:57:05 +0100 Subject: [PATCH 1541/2352] [core] Print write locks in envman --- core/environment/manager.go | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 7b4dd75b3..b81befb32 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -254,10 +254,16 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } } + log.WithField("method", "CreateEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh envs.mu.Unlock() + log.WithField("method", "CreateEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write unlock") err = env.TryTransition(NewDeployTransition( envs.taskman, @@ -372,6 +378,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } } + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() // we kill all tasks that aren't cleanup hooks taskmanMessage := task.NewEnvironmentMessage(taskop.ReleaseTasks, environmentId, tasksToRelease, nil) @@ -381,6 +390,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } delete(envs.pendingStateChangeCh, environmentId) envs.mu.Unlock() + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") // We set all callRoles to INACTIVE right now, because there's no task activation for them. // This is the callRole equivalent of AcquireTasks, which only pushes updates to taskRoles. @@ -397,9 +409,16 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } pendingCh := make(chan *event.TasksReleasedEvent) + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") + envs.taskman.MessageChannel <- taskmanMessage incomingEv := <-pendingCh @@ -442,9 +461,16 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error // we remake the pending teardown channel too, because each completed TasksReleasedEvent // automatically closes it pendingCh = make(chan *event.TasksReleasedEvent) + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() envs.pendingTeardownsCh[environmentId] = pendingCh envs.mu.Unlock() + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") + envs.taskman.MessageChannel <- taskmanMessage incomingEv = <-pendingCh @@ -465,10 +491,18 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) + + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() delete(envs.m, environmentId) env.unsubscribeFromWfState() envs.mu.Unlock() + log.WithField("method", "TeardownEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") + return err } @@ -674,10 +708,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str env.Public, env.Description, _ = parseWorkflowPublicInfo(workflowPath) + log.WithField("method", "CreateAutoEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write lock") envs.mu.Lock() envs.m[env.id] = env envs.pendingStateChangeCh[env.id] = env.stateChangedCh envs.mu.Unlock() + log.WithField("method", "CreateAutoEnvironment"). + WithField("level", infologger.IL_Devel). + Debug("envman write unlock") err = env.TryTransition(NewDeployTransition( envs.taskman, From fff7e44cece86081c2c7684b870ba2501e6c7e40 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Feb 2023 16:57:32 +0100 Subject: [PATCH 1542/2352] [build] Bump to v0.60.4 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index da30c318e..537566723 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 60 -VERSION_PATCH := 3 +VERSION_PATCH := 4 From 3062e68a64b2fdb27f7f9e6f7d34e8688d1e78dd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Feb 2023 12:25:43 +0100 Subject: [PATCH 1543/2352] [core] Better error message in case of bad task file --- core/task/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index b9395fe0d..e04dcd4d6 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -228,7 +228,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. } if taskClassStruct.Identifier.Name != taskFilename { - err = errors.New("the name of the task template file and the name of the task don't match") + err = fmt.Errorf("the name of the task template file (%s) and the name of the task (%s) don't match", taskFilename, taskClassStruct.Identifier.Name) return } From 972d3cd8b95c16df3b75ac390d2af803f610210f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Feb 2023 12:31:21 +0100 Subject: [PATCH 1544/2352] [core] Ensure bad DCS events can't cause spam --- core/integration/dcs/plugin.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c8f5a9cf1..6e9041fca 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -158,18 +158,23 @@ func (p *Plugin) Init(instanceId string) error { } go func() { for { - ev, err := evStream.Recv() - if err == io.EOF { + ev, streamErr := evStream.Recv() + if streamErr == io.EOF { break } - if err != nil { - log.WithError(err).Error("bad event from DCS service") - sts, ok := status.FromError(err) + if streamErr != nil { + log.WithError(streamErr). + Error("bad event from DCS service") + sts, ok := status.FromError(streamErr) if ok && sts != nil { if sts.Code() == codes.Unavailable { time.Sleep(1 * time.Second) + } else if sts.Code() == codes.Canceled { + time.Sleep(1 * time.Second) } + } else { // DCS status can't even be decoded + time.Sleep(1 * time.Second) } } log.WithField("event", ev.String()).Debug("received DCS event") From 3f7048c132c63eb16ed2a0d1903be22376c71aca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Feb 2023 12:34:05 +0100 Subject: [PATCH 1545/2352] [build] Bump to v0.60.5 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 537566723..101179faa 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 60 -VERSION_PATCH := 4 +VERSION_PATCH := 5 From 9d9af1614901ce8a5b6766bf205824bf8ab61995 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 7 Feb 2023 15:17:33 +0100 Subject: [PATCH 1546/2352] [core] add FLP ID list and deployment type to the ODC script --- core/integration/odc/plugin.go | 58 +++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 1b45ee453..0cae615ee 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -222,6 +222,40 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return out } +func getFlpIdList(varStack map[string]string) (flps []string, err error) { + payload, ok := varStack["hosts"] + if !ok { + return []string{}, fmt.Errorf("could not retrieve FLP list (\"hosts\") from varStack") + } + + flpHostnames := make([]string, 0) + err = json.Unmarshal([]byte(payload), &flpHostnames) + if err != nil { + return []string{}, err + } + + const prodFlpPrefix = "alio2-cr1-flp" + const stagingFlpPrefix = "alio2-cr1-mvs" + + // we take only prod and staging into account + // we add S to staging IDs as requested in OCTRL-753 + flpIds := make([]string, 0) + for _, flp := range flpHostnames { + if strings.HasPrefix(flp, prodFlpPrefix) { + id := strings.TrimPrefix(flp, prodFlpPrefix) + if len(id) > 0 { + flpIds = append(flpIds, id) + } + } else if strings.HasPrefix(flp, stagingFlpPrefix) { + id := strings.TrimPrefix(flp, stagingFlpPrefix) + if len(id) > 0 { + flpIds = append(flpIds, "S"+id) + } + } + } + return flpIds, nil +} + func (p *Plugin) Init(_ string) error { if p.odcClient == nil { cxt, cancel := context.WithCancel(context.Background()) @@ -314,6 +348,8 @@ func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[str odcNEpnsMaxFail, epnStoreRawDataFraction string pdpEpnShmId string runType string + flpIds []string + deploymentType string ) accumulator = make([]string, 0) @@ -583,11 +619,31 @@ func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[str if !ok { log.WithField("partition", envId). WithField("call", "GenerateEPNWorkflowScript"). - Warn("could not get get variable run_type from environment context, using NONE") + Warn("could not get variable run_type from environment context, using NONE") runType = "NONE" } accumulator = append(accumulator, fmt.Sprintf("RUNTYPE=%s", strings.TrimSpace(runType))) + flpIds, err = getFlpIdList(varStack) + if err != nil { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + WithError(err). + Error("cannot acquire FLP ID list, it will be empty") + } + accumulator = append(accumulator, fmt.Sprintf("FLP_IDS='%s'", strings.Join(flpIds, ","))) + + deploymentType, ok = varStack["setup_name"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire setup_name, needed for GEN_TOPO_DEPLOYMENT_TYPE, using UNKNOWN") + deploymentType = "UNKNOWN" + } + // we replace spaces with underscores, since David requested no spaces in OCTRL-751 + deploymentType = strings.ReplaceAll(strings.TrimSpace(deploymentType), " ", "_") + accumulator = append(accumulator, fmt.Sprintf("GEN_TOPO_DEPLOYMENT_TYPE=%s", deploymentType)) + pdpExtraEnvVars, ok = varStack["pdp_extra_env_vars"] if !ok { log.WithField("partition", envId). From 6eca28b45c3d9179aed928b7b63c1b3b9aea52c6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Feb 2023 12:52:11 +0100 Subject: [PATCH 1547/2352] [core] Prevent crash on bad VarSpecMap --- core/server.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 282706bd7..9b41fc397 100644 --- a/core/server.go +++ b/core/server.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/repos/varsource" "github.com/spf13/viper" "google.golang.org/grpc/codes" @@ -734,7 +735,12 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo for revision, templates := range revisions { for _, template := range templates { // First we take care of overriding any WFT VarSpec defaults with Apricot vars - varSpecMap := template.VarInfo + var varSpecMap repos.VarSpecMap + if template.VarInfo != nil { + varSpecMap = template.VarInfo + } else { + varSpecMap = repos.VarSpecMap{} + } for k, v := range varSpecMap { if v.Source == varsource.WorkflowDefaults { // if this varSpec was declared as a default if apricotValue, exists := vars[k]; exists { // and a corresponding Apricot var exists From 644bb217744f8e8893888c3007efa23fdf29feb8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Feb 2023 17:06:58 +0100 Subject: [PATCH 1548/2352] [core] Better error messages from DCS in case of premature EOF --- core/integration/dcs/plugin.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 6e9041fca..40853fcf5 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -431,7 +431,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("DCS SOR event stream EOF, closed") + Debug("DCS SOR event stream was closed from the DCS side (EOF)") break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -527,6 +527,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { + if errors.Is(err, io.EOF) { + err = fmt.Errorf("DCS SOR stream unexpectedly terminated from DCS side before completion: %w", err) + } logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -739,7 +742,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). WithField("runNumber", runNumber64). - Debug("DCS EOR event stream EOF, closed") + Debug("DCS EOR event stream was closed from the DCS side (EOF)") break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -770,6 +773,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { logErr := fmt.Errorf("%s EOR failure event from DCS", ecsDet) if err != nil { + if errors.Is(err, io.EOF) { + err = fmt.Errorf("DCS EOR stream unexpectedly terminated from DCS side before completion: %w", err) + } logErr = fmt.Errorf("%v : %v", err, logErr) } log.WithError(logErr). From e5b7a26b85b73a39ecd71f589d5a7bddd55537ad Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Feb 2023 15:16:43 +0100 Subject: [PATCH 1549/2352] [executor] Delay sending TASK_RUNNING for basic + make statusCh buffered --- executor/executable/basictaskcommon.go | 3 ++- executor/executor.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 2227a3205..b7b938cda 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -31,6 +31,7 @@ import ( "io" "os/exec" "syscall" + "time" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" @@ -257,7 +258,7 @@ func (t *basicTaskBase) doLaunch(transitionFunc transitioner.DoTransitionFunc) e WithField("level", infologger.IL_Devel). Debug("basic task staged") - go t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") + time.AfterFunc(200*time.Millisecond, func() { t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") }) return nil } diff --git a/executor/executor.go b/executor/executor.go index 7e9badeae..9032cd169 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -146,7 +146,7 @@ func Run(cfg config.Config) { // The executor keeps a map of controlled tasks. activeTasks: make(map[mesos.TaskID]executable.Task), - statusCh: make(chan mesos.TaskStatus), + statusCh: make(chan mesos.TaskStatus, 1024), messageCh: make(chan []byte), } subscriber = calls.SenderWith( From 0d2125ae1ba393ddbb17ba0532a87dd7106366d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Feb 2023 15:42:49 +0100 Subject: [PATCH 1550/2352] [core] Do not crash when checking for critical trait of orphan task --- core/task/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index e04dcd4d6..ae9802576 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -769,7 +769,7 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } - if task != nil && (task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true) { + if task != nil && (task.GetTraits().Critical == true || (task.parent != nil && task.parent.GetTaskTraits().Critical == true)) { taskCriticalErrors = append(taskCriticalErrors, taskDescription) } else { taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) From 91912fc3d55d21bc381a6e560d6fe9843c71d4ad Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 13 Feb 2023 17:01:59 +0100 Subject: [PATCH 1551/2352] [build] Bump to v0.61.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 101179faa..c1b8e2516 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 60 -VERSION_PATCH := 5 +VERSION_MINOR := 61 +VERSION_PATCH := 0 From 04eceea952bb7da16be3207a9984b5a493ed7e02 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 11:22:26 +0100 Subject: [PATCH 1552/2352] [OCTRL-763][core] CCDB GRP plugin should use pdp_n_hbf_per_tf --- core/environment/environment.go | 4 ++-- core/integration/ccdb/plugin.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 48214d673..1968d51d2 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -183,9 +183,9 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { if ok { env.workflow.GetVars().Set("lhc_period", lhcPeriod) } - nHbfPerTf, ok := env.BaseConfigStack["n_hbf_per_tf"] + nHbfPerTf, ok := env.BaseConfigStack["pdp_n_hbf_per_tf"] if ok { - env.workflow.GetVars().Set("n_hbf_per_tf", nHbfPerTf) + env.workflow.GetVars().Set("pdp_n_hbf_per_tf", nHbfPerTf) } } else { log.Error("cannot access AliECS workflow configuration defaults") diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 6b1505f84..d9791eb2d 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -205,7 +205,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { var continuousReadoutDetectors []string var triggeringDetectors []string - hbfPerTf, err := strconv.ParseUint(varStack["n_hbf_per_tf"], 10, 32) + hbfPerTf, err := strconv.ParseUint(varStack["pdp_n_hbf_per_tf"], 10, 32) if err != nil { log.WithError(err). WithField("partition", envId). From 144bffad528280423b47c427e2a71605524c800c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 13:46:54 +0100 Subject: [PATCH 1553/2352] [executor] Improve cannot connect to task message --- executor/executorcmd/client.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 78da7267d..8c987fb1f 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -80,7 +80,13 @@ func NewClient( log.WithField("error", err.Error()). WithField("endpoint", endpoint). WithField("transport", controlTransportS). + WithField("level", infologger.IL_Devel). Error("gRPC client can't dial") + log.WithField("error", err.Error()). + WithField("endpoint", endpoint). + WithField("level", infologger.IL_Ops). + Error("AliECS executor could not connect to task, possible crash on startup") + cancel() if conn != nil { log.WithField("endpoint", endpoint). From 8d1332d8bed07d9ceffe57f25bf7042c980c547c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:03:40 +0100 Subject: [PATCH 1554/2352] [core] Miscellaneous logging improvements --- core/environment/transition_deploy.go | 6 ++++-- core/server.go | 2 +- core/task/scheduler.go | 12 +++++++----- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 5f7bc4c41..0846acf44 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -35,6 +35,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" @@ -90,11 +91,11 @@ func (t DeployTransition) do(env *Environment) (err error) { localErr = cmd.Run() if localErr != nil { log.WithField("partition", env.Id().String()). - Warnf("[cleanup binary] execution unsuccessful on %s : %s\n", flp, localErr.Error()) + Warnf("cleanup script failed on %s : %s\n", flp, localErr.Error()) scriptErrors = multierror.Append(scriptErrors, fmt.Errorf("cleanup unsuccessful on %s: %w", flp, localErr)) } else { log.WithField("partition", env.Id().String()). - Infof("[cleanup binary] execution successful on %s\n", flp) + Tracef("cleanup script executed successfully on %s\n", flp) } }(flp) } @@ -273,6 +274,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("role", role.GetPath()). WithField("partition", env.Id().String()). WithField("detector", detector). + WithField("level", infologger.IL_Trace). Error("environment reached invalid state") failedRoles = append(failedRoles, role.GetPath()) } diff --git a/core/server.go b/core/server.go index 9b41fc397..3a33b5795 100644 --- a/core/server.go +++ b/core/server.go @@ -82,7 +82,7 @@ func (m *RpcServer) logMethod() { } log.WithPrefix("rpcserver"). WithField("method", fun.Name()). - WithField("level", infologger.IL_Devel). + WithField("level", infologger.IL_Trace). Debug("handling RPC request") } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 06ea043bc..1a3e17452 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -1055,11 +1055,13 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("detectors", strings.Join(detectorsForHosts, " ")). Debugf("offers cycle complete, %d tasks launched for %d detectors", tasksLaunchedThisCycle, len(detectorsForHosts)) } - utils.TimeTrack(timeBeforeDecline, "resourceOffers: decline-notify-return", log. - WithField("partition", envId.String()). - WithField("tasksLaunched", tasksLaunchedThisCycle). - WithField("level", infologger.IL_Devel). - WithField("offersDeclined", offersDeclined)) + if viper.GetBool("veryVerbose") { + utils.TimeTrack(timeBeforeDecline, "resourceOffers: decline-notify-return", log. + WithField("partition", envId.String()). + WithField("tasksLaunched", tasksLaunchedThisCycle). + WithField("level", infologger.IL_Devel). + WithField("offersDeclined", offersDeclined)) + } return nil } From 1bd767523a63ec58895b92d3ce5b267f32706ef1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:03:58 +0100 Subject: [PATCH 1555/2352] [core] Quieter logging from ProcessTemplates --- core/workflow/callrole.go | 2 +- core/workflow/includerole.go | 2 +- core/workflow/taskrole.go | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 1c3105cc6..8519cec17 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -181,7 +181,7 @@ func (t *callRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { - log.WithField("partition", t.GetEnvironmentId().String()).Info(err.Error()) + log.WithField("partition", t.GetEnvironmentId().String()).Trace(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 265cc55cb..c7707d690 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -119,7 +119,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { - log.WithField("partition", r.GetEnvironmentId().String()).Info(err.Error()) + log.WithField("partition", r.GetEnvironmentId().String()).Trace(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index def464125..b7b449a01 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -175,7 +175,7 @@ func (t *taskRole) ProcessTemplates(workflowRepo repos.IRepo, _ LoadSubworkflowF if err != nil { var roleDisabledErrorType *template.RoleDisabledError if isRoleDisabled := errors.As(err, &roleDisabledErrorType); isRoleDisabled { - log.WithField("partition", t.GetEnvironmentId().String()).Info(err.Error()) + log.WithField("partition", t.GetEnvironmentId().String()).Trace(err.Error()) err = nil // we don't want a disabled role to be considered an error } else { return From abf98e2c6b94dade51638a73ad0e746e2ca14966 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:04:29 +0100 Subject: [PATCH 1556/2352] [executor] Logging improvements --- executor/executable/task.go | 1 + executor/executorcmd/client.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/executor/executable/task.go b/executor/executable/task.go index 8ce994264..c24cd70b6 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -107,6 +107,7 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE log.WithField("level", infologger.IL_Support). WithField("partition", envId.String()). WithField("detector", detector). + WithField("level", infologger.IL_Devel). Infof("launching task %s: %s", taskInfo.TaskID.GetValue(), rawCommand) } else { if err != nil { diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 8c987fb1f..5b6e38a6a 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -80,7 +80,7 @@ func NewClient( log.WithField("error", err.Error()). WithField("endpoint", endpoint). WithField("transport", controlTransportS). - WithField("level", infologger.IL_Devel). + WithField("level", infologger.IL_Trace). Error("gRPC client can't dial") log.WithField("error", err.Error()). WithField("endpoint", endpoint). From 8e2de618d9527a975ede862aa4b117c3e726ae0b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:23:52 +0100 Subject: [PATCH 1557/2352] [core] Improve DDscheduler client debug output --- core/integration/ddsched/plugin.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index b30c0dcce..09d7545cb 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -655,6 +655,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("endpoint", viper.GetString("ddSchedulerEndpoint")). WithField("partition", envId). WithField("partition_state", response.PartitionState). + WithField("level", infologger.IL_Support). Warn("DD scheduler partition still active, performing PartitionTerminate") response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) From 2a0e6d4f57541314d12b1a99d1cee78b1161b49f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:24:11 +0100 Subject: [PATCH 1558/2352] [core] Improve Bookkeeping client debug output --- core/integration/bookkeeping/plugin.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 65c3cf83c..de1c2af3e 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1042,11 +1042,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingTrgStops[envId] = false } - if _, ok := p.pendingRunStops[envId]; ok { + if _, ok = p.pendingRunStops[envId]; ok { return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) } else { log.WithField("partition", envId). - Warning("skipping UpdateRun call, no pending run number found") + WithField("level", infologger.IL_Devel). + Debug("skipping UpdateRun call, no pending run number found") return } } From 3171a236007ef5da2f0c76cb61ec78c7a22a4a1f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:25:05 +0100 Subject: [PATCH 1559/2352] [core] Improve environment transitions log output --- core/environment/environment.go | 34 ++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 1968d51d2..8514e5d99 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -67,16 +67,16 @@ type Environment struct { hookHandlerF func(hooks task.Tasks) error incomingEvents chan event.DeviceEvent - GlobalDefaults gera.StringMap // From Consul - GlobalVars gera.StringMap // From Consul - UserVars gera.StringMap // From user input + GlobalDefaults gera.StringMap // From Consul + GlobalVars gera.StringMap // From Consul + UserVars gera.StringMap // From user input BaseConfigStack map[string]string // Exclusively from Consul, already flattened for performance - stateChangedCh chan *event.TasksStateChangedEvent - unsubscribe chan struct{} - eventStream Subscription - Public bool // From workflow or user - Description string // From workflow + stateChangedCh chan *event.TasksStateChangedEvent + unsubscribe chan struct{} + eventStream Subscription + Public bool // From workflow or user + Description string // From workflow callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap @@ -210,6 +210,20 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { Debug("O2 End time already set before before_GO_ERROR") } } + + if rn := env.GetCurrentRunNumber(); rn != 0 { + log.WithField("partition", envId). + WithField("run", rn). + Infof("%s transition starting", + e.Event, + ) + } else { + log.WithField("partition", envId). + Infof("%s transition starting", + e.Event, + ) + } + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) if errHooks != nil { e.Cancel(errHooks) @@ -727,7 +741,9 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { log.WithField("partition", env.id). - Warn("we could not transition gently to ERROR, thus forcing it.") + WithError(err). + WithField("level", infologger.IL_Devel). + Warn("could not transition gently to ERROR, forcing it") env.setState(wfState.String()) } toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { From cce710d995e0ebce6349a3f43c89bd48c16b7566 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 13:58:27 +0100 Subject: [PATCH 1560/2352] [core] Change "runNumber" log field to "run", understood by IL --- core/integration/ccdb/plugin.go | 2 +- core/integration/dcs/plugin.go | 76 +++++++++++++-------------- core/integration/testplugin/plugin.go | 4 +- core/integration/trg/plugin.go | 72 ++++++++++++------------- 4 files changed, 77 insertions(+), 77 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index d9791eb2d..32e87fb43 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -216,7 +216,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { lhcPeriod, ok := varStack["lhc_period"] if !ok { log.WithField("partition", envId). - WithField("runNumber", runNumber). + WithField("run", runNumber). Debug("CCDB interface could not retrieve 'lhc_period', putting 'Unknown'.") lhcPeriod = "Unknown" } diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 40853fcf5..ed11df27d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -222,7 +222,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -243,7 +243,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Infof("performing DCS SOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] @@ -299,7 +299,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] if !okParam { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } @@ -314,7 +314,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "StartOfRun"). WithField("detector", ecsDet). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -333,7 +333,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "StartOfRun"). WithField("detector", ecsDet). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -347,7 +347,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "StartOfRun"). WithField("detector", ecsDet). - WithField("runNumber", runNumber64)) + WithField("run", runNumber64)) in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, @@ -361,7 +361,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -378,7 +378,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -409,7 +409,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -430,14 +430,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("DCS SOR event stream was closed from the DCS side (EOF)") break // no more data } if errors.Is(err, context.DeadlineExceeded) { log.WithError(err). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS SOR timed out") err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) @@ -446,13 +446,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Warn("bad DCS SOR event received, any future DCS events are ignored") break } if dcsEvent == nil { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Warn("nil DCS SOR event received, skipping to next DCS event") continue } @@ -469,7 +469,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -486,14 +486,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("DCS SOR completed successfully") p.pendingEORs[envId] = runNumber64 break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("detector", ecsDet). Debugf("DCS SOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) } @@ -502,13 +502,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Support). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Info("ALIECS SOR operation : completed DCS SOR for ") } else { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Devel). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Info("ALIECS SOR operation : processing DCS SOR for ") } @@ -536,7 +536,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -552,7 +552,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -573,7 +573,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Infof("performing DCS EOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_eor_parameters"] @@ -611,7 +611,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_eor_parameters"] if !okParam { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } @@ -626,7 +626,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "EndOfRun"). WithField("detector", ecsDet). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -645,7 +645,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("call", "EndOfRun"). WithField("detector", ecsDet). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -666,7 +666,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -682,7 +682,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -708,7 +708,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -722,7 +722,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Debug("DCS EndOfRun returned stream, awaiting responses (DCS cleanup will not run for this environment)") @@ -741,14 +741,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("DCS EOR event stream was closed from the DCS side (EOF)") break // no more data } if errors.Is(err, context.DeadlineExceeded) { log.WithError(err). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS EOR timed out") err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) @@ -757,13 +757,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { // stream termination in case of general error log.WithError(err). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Warn("bad DCS EOR event received, any future DCS events are ignored") break } if dcsEvent == nil { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Warn("nil DCS EOR event received, skipping to next DCS event") continue } @@ -783,7 +783,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -800,14 +800,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("DCS EOR completed successfully") delete(p.pendingEORs, envId) break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("detector", dcsEvent.GetDetector().String()). Debugf("DCS EOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) } @@ -816,7 +816,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Devel). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Info("ALIECS EOR operation : processing DCS EOR for ") } @@ -839,7 +839,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -878,7 +878,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - log.WithField("runNumber", runNumber). + log.WithField("run", runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("call", "Cleanup"). diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 2e0928140..0ab2ab4ba 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -138,7 +138,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("rolepath", call.GetParentRolePath()). WithField("trigger", call.GetTraits().Trigger). WithField("await", call.GetTraits().Await). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Infof("executed testplugin.Noop call in %s", timeout) time.Sleep(timeout) @@ -169,7 +169,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("rolepath", call.GetParentRolePath()). WithField("trigger", call.GetTraits().Trigger). WithField("await", call.GetTraits().Await). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Infof("executed testplugin.Test call in %s", timeout) time.Sleep(timeout) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 676b71943..9e28eb7dc 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -321,7 +321,7 @@ func (p *Plugin) reconcile() { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", trgRun.RunNumber). + WithField("run", trgRun.RunNumber). WithField("call", "RunStop"). Error("TRG error") } else { @@ -330,7 +330,7 @@ func (p *Plugin) reconcile() { } else { log.WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", trgRun.RunNumber). + WithField("run", trgRun.RunNumber). Info("TRG STANDALONE reconciliation complete") } } @@ -343,13 +343,13 @@ func (p *Plugin) reconcile() { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", trgRun.RunNumber). + WithField("run", trgRun.RunNumber). WithField("call", "RunUnload"). Error("TRG error") } else { log.WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", trgRun.RunNumber). + WithField("run", trgRun.RunNumber). Info("TRG GLOBAL reconciliation complete") } } @@ -414,7 +414,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { // "" -all required must be ready log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("empty TRG detectors list provided") trgDetectorsParam = "" } @@ -438,7 +438,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { // we do not load any run cause it is standalone log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("not a TRG Global Run, continuing with TRG Run Start") return @@ -455,7 +455,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -472,7 +472,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -489,7 +489,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -507,7 +507,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -522,7 +522,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // runLoad successful, we cache the run number for eventual cleanup p.pendingRunUnloads[envId] = runNumber64 log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Info("ALIECS SOR Operation : TRG RunLoad success") return @@ -551,7 +551,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { // "" it is a global run log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("Detector for host is not available, starting global run") trgDetectorsParam = "" } @@ -563,7 +563,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -592,7 +592,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -608,7 +608,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -626,7 +626,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -643,7 +643,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -658,7 +658,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // runStart successful, we cache the run number for eventual cleanup p.pendingRunStops[envId] = runNumber64 log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("TRG RunStart success") trgStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) @@ -675,7 +675,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !ok { // "" it is a global run log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("Detector for host is not available, stoping global run") trgDetectorsParam = "" } @@ -704,7 +704,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -720,7 +720,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -737,7 +737,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -754,7 +754,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -769,7 +769,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // RunStop successful, we pop the run number from the cache delete(p.pendingRunStops, envId) log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("TRG RunStop success") trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) @@ -778,7 +778,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) } else { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("trgEndTime", trgEndTime). Debug("could not get parentRole and set TRG end time") } @@ -800,7 +800,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // if global run then unload if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Debug("not a TRG Global Run, skipping TRG Run Unload") return } @@ -819,7 +819,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -835,7 +835,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -852,7 +852,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -869,7 +869,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -884,14 +884,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // RunUnload successful, we pop the run number from the cache delete(p.pendingRunUnloads, envId) log.WithField("partition", envId). - WithField("runNumber", runNumber64). + WithField("run", runNumber64). Info("ALICECS EOR operation : TRG RunUnload success") return } stack["RunStop"] = func() (out string) { log.WithField("partition", envId). - //WithField("runNumber", runNumber64). + //WithField("run", runNumber64). Info("ALIECS EOR operation : performing TRG Run Stop ") rn := varStack["run_number"] @@ -908,7 +908,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack["RunUnload"] = func() (out string) { log.WithField("partition", envId). - //WithField("runNumber", runNumber64). + //WithField("run", runNumber64). Info("ALIECS EOR operation : performing TRG Run Unload ") rn := varStack["run_number"] @@ -935,7 +935,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // runStop if found pending runNumberStop, ok := p.pendingRunStops[envId] if ok { - log.WithField("runNumber", runNumberStop). + log.WithField("run", runNumberStop). WithField("partition", envId). WithField("level", infologger.IL_Devel). Debug("pending TRG Stop found, performing cleanup") @@ -949,7 +949,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) } else { log.WithField("partition", envId). - WithField("runNumber", runNumberStop). + WithField("run", runNumberStop). WithField("trgEndTime", trgEndTime). Debug("could not get parentRole and set TRG end time") } @@ -962,7 +962,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // runUnload if found pending runNumberUnload, ok := p.pendingRunUnloads[envId] if ok { - log.WithField("runNumber", runNumberUnload). + log.WithField("run", runNumberUnload). WithField("partition", envId). WithField("level", infologger.IL_Devel). Debug("pending TRG Unload found, performing cleanup") From 3aad2c4c4f10ee2e470f9749e740faa6a00223ea Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 14:01:31 +0100 Subject: [PATCH 1561/2352] [core] Remove "variable deploy_timeout not provided" log message --- core/environment/transition_deploy.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 0846acf44..7b042a12e 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -327,9 +327,6 @@ func acquireDeploymentTimeout(wf workflow.Role) time.Duration { } else { deploymentTimeout = timeout } - } else { - log.WithField("partition", envId). - Warnf("variable deploy_timeout not provided, defaulting to %s", deploymentTimeout.String()) } } return deploymentTimeout From e38e47c7e037a7522a095d582a60aa2026bd907c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 14:21:12 +0100 Subject: [PATCH 1562/2352] [core] adjust level and severity of logs in Kafka plugin --- core/integration/kafka/plugin.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 605066a80..e42118657 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -29,6 +29,7 @@ package kafka import ( "context" "encoding/json" + "github.com/AliceO2Group/Control/common/logger/infologger" "net/url" "strconv" "strings" @@ -119,11 +120,13 @@ func (p *Plugin) StartActivityTopic(trigger string) string { } func (p *Plugin) LoggerCallback(msg string, a ...interface{}) { - log.Infof(msg, a...) + log.WithField("level", infologger.IL_Devel). + Debugf(msg, a...) } func (p *Plugin) ErrorLoggerCallback(msg string, a ...interface{}) { - log.Errorf(msg, a...) + log.WithField("level", infologger.IL_Support). + Errorf(msg, a...) } func (p *Plugin) Init(_ string) error { @@ -141,6 +144,7 @@ func (p *Plugin) Init(_ string) error { p.envsInRunning = make(map[string]*kafkapb.EnvInfo) log.WithField("call", call). + WithField("level", infologger.IL_Support). Info("successfully created a kafka producer with broker '" + p.endpoint + "'") // Prepare and send active run list (expected to be empty during init) @@ -151,7 +155,9 @@ func (p *Plugin) Init(_ string) error { } arlData, err := proto.Marshal(activeRunsList) if err != nil { - log.WithField("call", call).Error("could not marshall an active runs list: ", err) + log.WithField("call", call). + WithField("level", infologger.IL_Support). + Error("could not marshall an active runs list: ", err) } p.produceMessage(arlData, p.ActiveRunsListTopic(), "", "Init") return nil @@ -198,6 +204,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf trigger, ok := varStack["__call_trigger"] if !ok { log.WithField("call", call).WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot acquire trigger from varStack") return nil } @@ -226,6 +233,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf if !ok { log.WithField("call", call). WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot acquire enter_state_time_ms") return nil } @@ -234,6 +242,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf log.WithError(err). WithField("call", call). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("cannot convert enter_state_time_ms (%s) to an unsigned integer", enterStateTimeMsStr) return nil } @@ -242,6 +251,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf if !ok { log.WithField("call", call). WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot acquire general detector list from varStack") return nil } @@ -249,6 +259,7 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf if err != nil { log.WithField("call", call). WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot parse general detector list") return nil } @@ -282,6 +293,7 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { func (p *Plugin) produceMessage(message []byte, topic string, envId string, call string) { log.WithField("call", call). WithField("partition", envId). + WithField("level", infologger.IL_Support). Debugf("producing a new kafka message on topic %s", topic) err := p.kafkaWriter.WriteMessages(context.Background(), kafka.Message{ @@ -293,6 +305,7 @@ func (p *Plugin) produceMessage(message []byte, topic string, envId string, call log.WithField("call", call). WithField("partition", envId). WithField("topic", topic). + WithField("level", infologger.IL_Support). Errorf("Kafka message delivery failed: %s", err.Error()) } } @@ -307,6 +320,7 @@ func (p *Plugin) createNewStateCallback(varStack map[string]string, call string) // Prepare and send new state notification log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Devel). Debug("Notifying Kafka that the environment is entering the state " + envInfo.State) newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, @@ -316,12 +330,14 @@ func (p *Plugin) createNewStateCallback(varStack map[string]string, call string) if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Support). Error("could not marshall a new state notification: ", err) } p.produceMessage(nsnData, p.FSMEnterStateTopic(envInfo.State), envInfo.EnvironmentId, call) log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Devel). Debug("Notifying Kafka about the new list of environments in RUNNING") // Prepare and send active run list activeRunsList := &kafkapb.ActiveRunsList{ @@ -332,6 +348,7 @@ func (p *Plugin) createNewStateCallback(varStack map[string]string, call string) if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Support). Error("could not marshall an active runs list: ", err) } p.produceMessage(arlData, p.ActiveRunsListTopic(), envInfo.EnvironmentId, call) @@ -348,6 +365,7 @@ func (p *Plugin) createLeaveStateCallback(varStack map[string]string, call strin // Prepare and send new state notification log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Devel). Debug("Notifying Kafka that the environment is leaving the state " + envInfo.State) newStateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, @@ -357,6 +375,7 @@ func (p *Plugin) createLeaveStateCallback(varStack map[string]string, call strin if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Support). Error("could not marshall a new state notification: ", err) } p.produceMessage(nsnData, p.FSMLeaveStateTopic(envInfo.State), envInfo.EnvironmentId, call) @@ -374,6 +393,7 @@ func (p *Plugin) createActivityStartCallback(varStack map[string]string, call st // Prepare and send new state notification log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Devel). Debug("Notifying Kafka about activity start " + envInfo.State) stateNotification := &kafkapb.NewStateNotification{ EnvInfo: envInfo, @@ -383,6 +403,7 @@ func (p *Plugin) createActivityStartCallback(varStack map[string]string, call st if err != nil { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Support). Error("could not marshall a state notification: ", err) } @@ -390,6 +411,7 @@ func (p *Plugin) createActivityStartCallback(varStack map[string]string, call st if !ok { log.WithField("call", call). WithField("partition", envInfo.EnvironmentId). + WithField("level", infologger.IL_Support). Error("cannot acquire trigger from varStack") return "" } From 9effb707ae351e7101e3690e5e9f8eee3654a69a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 14:34:05 +0100 Subject: [PATCH 1563/2352] [core] adjust level and severity of CCDB plugin logs --- core/integration/ccdb/plugin.go | 50 +++++++++++++++++++++++++-------- 1 file changed, 39 insertions(+), 11 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 32e87fb43..6344adea0 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" "go/types" "net/url" "os/exec" @@ -104,13 +105,15 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + log.WithField("level", infologger.IL_Support). + Error("cannot acquire environment ID") return nil } runNumberStr, ok := varStack["run_number"] if !ok { - log.WithField("partition", envId). + log.WithField("level", infologger.IL_Support). + WithField("partition", envId). Error("cannot acquire run number for GRP object") return nil } @@ -118,6 +121,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if err != nil { log.WithError(err). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("cannot convert run number '%s' to an integer", runNumberStr) return nil } @@ -140,10 +144,12 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if strings.Contains(runTypeStr, "SYNTHETIC") { log.WithField("partition", envId). WithField("runType", runTypeStr). + WithField("level", infologger.IL_Support). Infof("overriding run start time in the GRP object to %s for SYNTHETIC run", pdpOverrideRunStartTime) } else { log.WithField("partition", envId). WithField("runType", runTypeStr). + WithField("level", infologger.IL_Support). Warnf("overriding run start time to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) } if len(endTime) > 0 { @@ -152,23 +158,27 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if err != nil { log.WithError(err). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("could not parse run startTime: %s", startTime) } pdpOverrideRunStartTimeNumber, err := strconv.ParseUint(pdpOverrideRunStartTime, 10, 64) if err != nil { log.WithError(err). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("could not parse pdpOverrideRunStartTimeNumber: %s", pdpOverrideRunStartTime) } endTimeNumber, err := strconv.ParseUint(endTime, 10, 64) if err != nil { log.WithError(err). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("could not parse run endTime: %s", endTime) } if endTimeNumber <= startTimeNumber { log.WithError(err). WithField("partition", envId). + WithField("level", infologger.IL_Support). Errorf("endTimeNumber (%d) is smaller or equal to startTimeNumber (%d)", endTimeNumber, startTimeNumber) } @@ -179,17 +189,20 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } else if strings.Contains(runTypeStr, "SYNTHETIC") { log.WithField("partition", envId). WithField("runType", runTypeStr). + WithField("level", infologger.IL_Ops). Warnf("requested SYNTHETIC run but run start time override not provided") } detectorsStr, ok := varStack["detectors"] if !ok { log.WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot acquire general detector list from varStack") } detectorsSlice, err := parseDetectors(detectorsStr) if err != nil { log.WithField("partition", envId). + WithField("level", infologger.IL_Support). Error("cannot parse general detector list") return nil } @@ -209,7 +222,8 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if err != nil { log.WithError(err). WithField("partition", envId). - Error("cannot acquire run number for Run Start") + WithField("level", infologger.IL_Support). + Error("cannot acquire pdp_n_hbf_per_tf") return nil } @@ -217,6 +231,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if !ok { log.WithField("partition", envId). WithField("run", runNumber). + WithField("level", infologger.IL_Support). Debug("CCDB interface could not retrieve 'lhc_period', putting 'Unknown'.") lhcPeriod = "Unknown" } @@ -224,6 +239,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { flpIds, err := getFlpIdList(envId) if err != nil { log.WithField("partition", envId). + WithField("level", infologger.IL_Support). WithError(err). Warningf("could not parse env id, FLP list will be empty") } @@ -252,7 +268,7 @@ func NewPlugin(endpoint string) integration.Plugin { if err != nil { log.WithField("endpoint", endpoint). WithError(err). - Error("bad service endpoint") + Error("Bad CCDB endpoint, General Run Parameters objects will not be uploaded!") return nil } @@ -367,14 +383,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack envId, ok := varStack["environment_id"] if !ok { - log.Error("cannot acquire environment ID") + log.WithField("level", infologger.IL_Support). + Error("cannot acquire environment ID") return } stack = make(map[string]interface{}) stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing log.WithField("call", "RunStart"). - WithField("partition", envId).Debug("performing CCDB interface Run Start") + WithField("partition", envId). + WithField("level", infologger.IL_Support). + Debug("performing CCDB interface Run Start") grp := NewGRPObject(varStack) if grp == nil { @@ -384,18 +403,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err := p.uploadCurrentGRP(grp, envId, true) if err != nil { log.WithField("call", "RunStop"). + WithField("level", infologger.IL_Support). WithField("partition", envId).Error(err.Error()) } return } stack["RunStop"] = func() (out string) { log.WithField("call", "RunStop"). + WithField("level", infologger.IL_Devel). WithField("partition", envId).Debug("checking if a CCDB End Of Run GRP should be published") grp := NewGRPObject(varStack) if grp == nil { log.WithField("call", "RunStop"). WithField("partition", envId). + WithField("level", infologger.IL_Devel). Debug("probably went to ERROR while not in RUNNING, doing nothing") return } @@ -405,11 +427,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err := p.uploadCurrentGRP(grp, envId, false) if err != nil { log.WithField("call", "RunStop"). + WithField("level", infologger.IL_Support). WithField("partition", envId).Error(err.Error()) } } else { log.WithField("call", "RunStop"). WithField("partition", envId). + WithField("level", infologger.IL_Devel). Debugf("most likely a GRP EOR object for run %d already has been published, doing nothing", grp.runNumber) } return @@ -422,15 +446,18 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre if grp == nil { return errors.New(fmt.Sprintf("Failed to create a GRP object")) } - log.WithField("partition", envId).Debug( - fmt.Sprintf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debugf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", grp.runNumber, grp.runType.String(), grp.startTimeMs, grp.endTimeMs, grp.hbfPerTf, grp.lhcPeriod, - strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ","))) + strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ",")) cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl, refresh) if err != nil { return errors.New(fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error())) } - log.WithField("partition", envId).Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) const timeoutSeconds = 10 ctx, cancel := context.WithTimeout(context.Background(), timeoutSeconds*time.Second) @@ -440,7 +467,8 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre // execute the DPL command in the repo of the workflow used cmd.Dir = "/tmp" cmdOut, err := cmd.CombinedOutput() - log.Debug("CCDB GRP upload command out: " + string(cmdOut)) + log.WithField("level", infologger.IL_Support). + Debug("CCDB GRP upload command out: " + string(cmdOut)) if ctx.Err() == context.DeadlineExceeded { return errors.New(fmt.Sprintf("The command to upload GRP to CCDB timed out (" + strconv.Itoa(timeoutSeconds) + "s).")) } From 0447213cca5be60c76d0d077fb950a5c75ed44e2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 15:28:12 +0100 Subject: [PATCH 1564/2352] [core] Fix message capitalization --- core/integration/ccdb/plugin.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 6344adea0..922de8741 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -29,7 +29,6 @@ import ( "encoding/json" "errors" "fmt" - "github.com/AliceO2Group/Control/common/logger/infologger" "go/types" "net/url" "os/exec" @@ -37,6 +36,8 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/common/logger" @@ -268,7 +269,7 @@ func NewPlugin(endpoint string) integration.Plugin { if err != nil { log.WithField("endpoint", endpoint). WithError(err). - Error("Bad CCDB endpoint, General Run Parameters objects will not be uploaded!") + Error("bad CCDB endpoint, General Run Parameters objects will not be uploaded!") return nil } From 7d11ca161cd95fd9424d8c761224c9c78042a93f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Feb 2023 16:42:59 +0100 Subject: [PATCH 1565/2352] [core] Add run number field to CCDB plugin logs --- core/integration/ccdb/plugin.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 922de8741..b049256ca 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -123,6 +123,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("run", runNumberStr). Errorf("cannot convert run number '%s' to an integer", runNumberStr) return nil } @@ -146,11 +147,13 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { log.WithField("partition", envId). WithField("runType", runTypeStr). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Infof("overriding run start time in the GRP object to %s for SYNTHETIC run", pdpOverrideRunStartTime) } else { log.WithField("partition", envId). WithField("runType", runTypeStr). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Warnf("overriding run start time to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) } if len(endTime) > 0 { @@ -160,6 +163,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Errorf("could not parse run startTime: %s", startTime) } pdpOverrideRunStartTimeNumber, err := strconv.ParseUint(pdpOverrideRunStartTime, 10, 64) @@ -167,6 +171,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Errorf("could not parse pdpOverrideRunStartTimeNumber: %s", pdpOverrideRunStartTime) } endTimeNumber, err := strconv.ParseUint(endTime, 10, 64) @@ -174,12 +179,14 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Errorf("could not parse run endTime: %s", endTime) } if endTimeNumber <= startTimeNumber { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("run", runNumber). Errorf("endTimeNumber (%d) is smaller or equal to startTimeNumber (%d)", endTimeNumber, startTimeNumber) } @@ -190,6 +197,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } else if strings.Contains(runTypeStr, "SYNTHETIC") { log.WithField("partition", envId). WithField("runType", runTypeStr). + WithField("run", runNumber). WithField("level", infologger.IL_Ops). Warnf("requested SYNTHETIC run but run start time override not provided") } @@ -197,12 +205,14 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { detectorsStr, ok := varStack["detectors"] if !ok { log.WithField("partition", envId). + WithField("run", runNumber). WithField("level", infologger.IL_Support). Error("cannot acquire general detector list from varStack") } detectorsSlice, err := parseDetectors(detectorsStr) if err != nil { log.WithField("partition", envId). + WithField("run", runNumber). WithField("level", infologger.IL_Support). Error("cannot parse general detector list") return nil @@ -223,6 +233,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if err != nil { log.WithError(err). WithField("partition", envId). + WithField("run", runNumber). WithField("level", infologger.IL_Support). Error("cannot acquire pdp_n_hbf_per_tf") return nil @@ -240,6 +251,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { flpIds, err := getFlpIdList(envId) if err != nil { log.WithField("partition", envId). + WithField("run", runNumber). WithField("level", infologger.IL_Support). WithError(err). Warningf("could not parse env id, FLP list will be empty") @@ -404,6 +416,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err := p.uploadCurrentGRP(grp, envId, true) if err != nil { log.WithField("call", "RunStop"). + WithField("run", grp.runNumber). WithField("level", infologger.IL_Support). WithField("partition", envId).Error(err.Error()) } @@ -417,6 +430,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { grp := NewGRPObject(varStack) if grp == nil { log.WithField("call", "RunStop"). + WithField("run", grp.runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). Debug("probably went to ERROR while not in RUNNING, doing nothing") @@ -428,11 +442,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err := p.uploadCurrentGRP(grp, envId, false) if err != nil { log.WithField("call", "RunStop"). + WithField("run", grp.runNumber). WithField("level", infologger.IL_Support). WithField("partition", envId).Error(err.Error()) } } else { log.WithField("call", "RunStop"). + WithField("run", grp.runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). Debugf("most likely a GRP EOR object for run %d already has been published, doing nothing", grp.runNumber) @@ -448,6 +464,7 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre return errors.New(fmt.Sprintf("Failed to create a GRP object")) } log.WithField("partition", envId). + WithField("run", grp.runNumber). WithField("level", infologger.IL_Devel). Debugf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", grp.runNumber, grp.runType.String(), grp.startTimeMs, grp.endTimeMs, grp.hbfPerTf, grp.lhcPeriod, @@ -457,6 +474,7 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre return errors.New(fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error())) } log.WithField("partition", envId). + WithField("run", grp.runNumber). WithField("level", infologger.IL_Devel). Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) @@ -469,6 +487,7 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre cmd.Dir = "/tmp" cmdOut, err := cmd.CombinedOutput() log.WithField("level", infologger.IL_Support). + WithField("run", grp.runNumber). Debug("CCDB GRP upload command out: " + string(cmdOut)) if ctx.Err() == context.DeadlineExceeded { return errors.New(fmt.Sprintf("The command to upload GRP to CCDB timed out (" + strconv.Itoa(timeoutSeconds) + "s).")) From 27ccc755594c35779d8a0892bf3481418fafe640 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 16:46:59 +0100 Subject: [PATCH 1566/2352] [core] Adjust executor log output levels --- executor/executable/basictaskcommon.go | 10 +++++++++- executor/executable/controllabletask.go | 25 ++++++++++++++++++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index b7b938cda..b2b3a2207 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -80,12 +80,16 @@ func (t *basicTaskBase) startBasicTask() (err error) { switch *t.Tci.Log { case "stdout": stdoutLog := log.WithPrefix("task-stdout"). + WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WithField("nohooks", true). WriterLevel(logrus.TraceLevel) stderrLog := log.WithPrefix("task-stderr"). + WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WithField("nohooks", true). WriterLevel(logrus.TraceLevel) @@ -96,11 +100,15 @@ func (t *basicTaskBase) startBasicTask() (err error) { case "all": stdoutLog := log.WithPrefix("task-stdout"). + WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) stderrLog := log.WithPrefix("task-stderr"). + WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) @@ -163,7 +171,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { }). Error("task terminated with error") log.WithField("partition", t.knownEnvironmentId.String()). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). Errorf("task terminated with error: %s %s", tciCommandStr, err.Error()) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index fa48f0d5e..6d756a485 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -176,10 +176,13 @@ func (t *ControllableTask) Launch() error { case "stdout": go func() { entry := log.WithPrefix("task-stdout"). + WithField("level", infologger.IL_Support). + WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WithField("nohooks", true) writer := &logger.SafeLogrusWriter{ - Entry: entry, + Entry: entry, PrintFunc: entry.Debug, } _, errStdout = io.Copy(writer, stdoutIn) @@ -187,10 +190,13 @@ func (t *ControllableTask) Launch() error { }() go func() { entry := log.WithPrefix("task-stderr"). + WithField("level", infologger.IL_Support). + WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name). WithField("nohooks", true) writer := &logger.SafeLogrusWriter{ - Entry: entry, + Entry: entry, PrintFunc: entry.Warn, } _, errStderr = io.Copy(writer, stderrIn) @@ -199,9 +205,12 @@ func (t *ControllableTask) Launch() error { case "all": go func() { entry := log.WithPrefix("task-stdout"). + WithField("level", infologger.IL_Support). + WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name) writer := &logger.SafeLogrusWriter{ - Entry: entry, + Entry: entry, PrintFunc: entry.Debug, } _, errStdout = io.Copy(writer, stdoutIn) @@ -209,9 +218,12 @@ func (t *ControllableTask) Launch() error { }() go func() { entry := log.WithPrefix("task-stderr"). + WithField("level", infologger.IL_Support). + WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). WithField("task", t.ti.Name) writer := &logger.SafeLogrusWriter{ - Entry: entry, + Entry: entry, PrintFunc: entry.Warn, } _, errStderr = io.Copy(writer, stderrIn) @@ -274,6 +286,7 @@ func (t *ControllableTask) Launch() error { "error": err.Error(), "command": truncatedCmd, }). + WithField("level", infologger.IL_Devel). Error("could not start gRPC client") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) @@ -532,7 +545,7 @@ func (t *ControllableTask) Launch() error { Error("task terminated with error") log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). Errorf("task terminated with error: %s %s", truncatedCmd, err.Error()) @@ -776,6 +789,8 @@ func (t *ControllableTask) Kill() error { return t.doTermIntKill(pid) } else { log.WithField("taskId", t.ti.GetTaskID()). + WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). Debugf("task terminated on its own") return nil } From 0918c43983e7045f1ef9367fd424e02cc6205150 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 16:47:32 +0100 Subject: [PATCH 1567/2352] [core] Adjust log levels in DCS plugin output --- core/integration/dcs/plugin.go | 36 +++++++++++++++++----------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index ed11df27d..e3ab69ac6 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -230,7 +230,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "StartOfRun"). Error("DCS error") @@ -260,7 +260,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing DCS SOR parameters: %w", err) log.WithError(err). WithField("partition", envId). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("call", "StartOfRun"). Error("DCS error") @@ -310,7 +310,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing %s DCS SOR parameter map: %w", ecsDet, err) log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "StartOfRun"). WithField("detector", ecsDet). @@ -329,7 +329,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing %s DCS SOR general parameters override: %w", dcsDet.String(), err) log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "StartOfRun"). WithField("detector", ecsDet). @@ -359,7 +359,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("DCS plugin not initialized, StartOfRun impossible") log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -376,7 +376,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("DCS client connection not available, StartOfRun impossible") log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -407,7 +407,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stream, err = p.dcsClient.StartOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -467,7 +467,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("event", dcsEvent). WithField("detector", ecsDet). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -534,7 +534,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } log.WithError(logErr). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -560,7 +560,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectors, err := p.parseDetectors(dcsDetectorsParam) if err != nil { log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -590,7 +590,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing DCS EOR parameters: %w", err) log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "EndOfRun"). Error("DCS error") @@ -622,7 +622,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing %s DCS EOR parameter map: %w", dcsDet.String(), err) log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "EndOfRun"). WithField("detector", ecsDet). @@ -641,7 +641,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("error processing %s DCS EOR general parameters override: %w", dcsDet.String(), err) log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("partition", envId). WithField("call", "EndOfRun"). WithField("detector", ecsDet). @@ -664,7 +664,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("DCS plugin not initialized, EndOfRun impossible") log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -680,7 +680,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { err = fmt.Errorf("DCS client connection not available, EndOfRun impossible") log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -706,7 +706,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stream, err = p.dcsClient.EndOfRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -781,7 +781,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("event", dcsEvent). WithField("detector", ecsDet). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). @@ -837,7 +837,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } log.WithError(logErr). - WithField("level", infologger.IL_Support). + WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithField("run", runNumber64). WithField("partition", envId). From 4bcfb3c25727708c10fee53cbb305af3f09bc4d1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 14 Feb 2023 16:47:50 +0100 Subject: [PATCH 1568/2352] [core] Improve ops-level log messages --- core/server.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/core/server.go b/core/server.go index 3a33b5795..4ce08bd47 100644 --- a/core/server.go +++ b/core/server.go @@ -506,7 +506,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if req.AllowInRunningState && env.CurrentState() == "RUNNING" { err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) if err != nil { - log.Warn("could not perform STOP transition for environment teardown, forcing") + log.WithField("partition", env.Id().String()). + Warn("could not perform STOP transition for environment teardown, forcing") return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } } @@ -522,7 +523,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } if !canDestroy { - log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) + log.WithField("partition", env.Id().String()). + Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } @@ -539,6 +541,10 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force bool, keepTasks bool) (*pb.DestroyEnvironmentReply, error) { + log.WithField("partition", env.Id().String()). + WithField("level", infologger.IL_Ops). + Info("DESTROY starting") + err := m.state.environments.TeardownEnvironment(env.Id(), force) if err != nil { if !force { From af50103c2e79e859d13968242bcce117a546c0a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Feb 2023 17:20:48 +0100 Subject: [PATCH 1569/2352] [build] Bump AliECS to v0.62.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c1b8e2516..6ff42cce0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 61 +VERSION_MINOR := 62 VERSION_PATCH := 0 From 73f23b9d7e12b844d40f3418f3e7b95933ee0102 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Feb 2023 15:29:28 +0100 Subject: [PATCH 1570/2352] [core] Pull updated ODC protofile --- core/integration/odc/protos/odc.proto | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 3455d79aa..561d23769 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -69,9 +69,10 @@ message GeneralReply { Error error = 3; // If status is ERROR than this field contains error description otherwise it's empty int32 exectime = 4; // Request execution time in ms string partitionid = 5; // Partition ID from ECS - uint64 runnr = 8; // Run number from ECS (optional) string sessionid = 6; // DDS session ID string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. + uint64 runnr = 8; // Run number from ECS (optional) + repeated string hosts = 9; // Where applicable, provides a list of used hosts (Submit/Run requests) } // Device information From 46f8ba2a7c11348bea810fb948de016eebc09256 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Feb 2023 15:29:50 +0100 Subject: [PATCH 1571/2352] [core] Bump dependencies --- go.mod | 8 ++++---- go.sum | 8 ++++++++ 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 7aa1ff657..fe3947592 100644 --- a/go.mod +++ b/go.mod @@ -63,8 +63,8 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.1.0 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa - golang.org/x/net v0.1.0 - golang.org/x/sys v0.1.0 + golang.org/x/net v0.7.0 + golang.org/x/sys v0.5.0 google.golang.org/grpc v1.50.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 google.golang.org/protobuf v1.28.1 @@ -145,8 +145,8 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect - golang.org/x/term v0.1.0 // indirect - golang.org/x/text v0.4.0 // indirect + golang.org/x/term v0.5.0 // indirect + golang.org/x/text v0.7.0 // indirect golang.org/x/tools v0.1.12 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect diff --git a/go.sum b/go.sum index 7d75ec828..bb484c5a1 100644 --- a/go.sum +++ b/go.sum @@ -732,6 +732,8 @@ golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6 golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -840,6 +842,8 @@ golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsi golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -849,6 +853,8 @@ golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH4 golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -860,6 +866,8 @@ golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 871a13c7fe30c666bb904ffc38ce0962861afba8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Feb 2023 16:25:35 +0100 Subject: [PATCH 1572/2352] [core] Regenerate ODC protofile --- core/integration/odc/protos/odc.pb.go | 417 +++++++++++++------------- 1 file changed, 213 insertions(+), 204 deletions(-) diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 7e7b12d11..008472e18 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -187,9 +187,10 @@ type GeneralReply struct { Error *Error `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` // If status is ERROR than this field contains error description otherwise it's empty Exectime int32 `protobuf:"varint,4,opt,name=exectime,proto3" json:"exectime,omitempty"` // Request execution time in ms Partitionid string `protobuf:"bytes,5,opt,name=partitionid,proto3" json:"partitionid,omitempty"` // Partition ID from ECS - Runnr uint64 `protobuf:"varint,8,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS (optional) Sessionid string `protobuf:"bytes,6,opt,name=sessionid,proto3" json:"sessionid,omitempty"` // DDS session ID State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. + Runnr uint64 `protobuf:"varint,8,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS (optional) + Hosts []string `protobuf:"bytes,9,rep,name=hosts,proto3" json:"hosts,omitempty"` // Where applicable, provides a list of used hosts (Submit/Run requests) } func (x *GeneralReply) Reset() { @@ -259,13 +260,6 @@ func (x *GeneralReply) GetPartitionid() string { return "" } -func (x *GeneralReply) GetRunnr() uint64 { - if x != nil { - return x.Runnr - } - return 0 -} - func (x *GeneralReply) GetSessionid() string { if x != nil { return x.Sessionid @@ -280,6 +274,20 @@ func (x *GeneralReply) GetState() string { return "" } +func (x *GeneralReply) GetRunnr() uint64 { + if x != nil { + return x.Runnr + } + return 0 +} + +func (x *GeneralReply) GetHosts() []string { + if x != nil { + return x.Hosts + } + return nil +} + // Device information // Runtime task ID and path are the same as in DDS. // To get task details use DDS Topology API. @@ -1596,7 +1604,7 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, @@ -1607,213 +1615,214 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x70, 0x0a, - 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, - 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, - 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, - 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x6e, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, + 0x73, 0x74, 0x73, 0x22, 0x70, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0xe2, 0x01, 0x0a, 0x0a, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, - 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, - 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, - 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, + 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, + 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, + 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, + 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, - 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, + 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, + 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x22, 0xe2, 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, + 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, + 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, + 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, - 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, - 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, - 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, - 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, + 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, + 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, + 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, + 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, - 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, - 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, - 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, - 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, + 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, - 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( From bf17c9da021212d28da71a7219de6cd5ef3e63b0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 20 Feb 2023 16:33:31 +0100 Subject: [PATCH 1573/2352] [core] Prevent crash --- core/task/manager.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index ae9802576..3b2722c50 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -769,7 +769,9 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } - if task != nil && (task.GetTraits().Critical == true || (task.parent != nil && task.parent.GetTaskTraits().Critical == true)) { + if task != nil && task.GetTraits().Critical { + taskCriticalErrors = append(taskCriticalErrors, taskDescription) + } else if task != nil && task.parent != nil && task.parent.GetTaskTraits().Critical { taskCriticalErrors = append(taskCriticalErrors, taskDescription) } else { taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) From 0670383cf7affa217460fc2d968a35a4570f6672 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Feb 2023 09:31:34 +0100 Subject: [PATCH 1574/2352] [core] Reconnect to DCS Subscribe stream if dropped --- core/integration/dcs/plugin.go | 46 +++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index e3ab69ac6..936c2cb04 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -47,9 +47,7 @@ import ( "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" - "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" - "google.golang.org/grpc/status" ) const ( @@ -154,30 +152,38 @@ func (p *Plugin) Init(instanceId string) error { } evStream, err := p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) if err != nil { - return fmt.Errorf("failed to subscribe to DCS client on %s", viper.GetString("dcsServiceEndpoint")) + return fmt.Errorf("failed to subscribe to DCS gateway on %s", viper.GetString("dcsServiceEndpoint")) } go func() { for { - ev, streamErr := evStream.Recv() - if streamErr == io.EOF { - break - } + for { + if evStream == nil { + break + } + ev, streamErr := evStream.Recv() + if streamErr == io.EOF { + log.Info("unexpected EOF from DCS service") + break + } - if streamErr != nil { - log.WithError(streamErr). - Error("bad event from DCS service") - sts, ok := status.FromError(streamErr) - if ok && sts != nil { - if sts.Code() == codes.Unavailable { - time.Sleep(1 * time.Second) - } else if sts.Code() == codes.Canceled { - time.Sleep(1 * time.Second) - } - } else { // DCS status can't even be decoded - time.Sleep(1 * time.Second) + if streamErr != nil { + log.WithError(streamErr). + Error("stream error or bad event from DCS service, dropping stream") + break } + log.WithField("event", ev.String()).Debug("received DCS event") + } + + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Info("DCS stream closed, attempting reconnect") + + evStream, err = p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithError(err). + Warnf("failed to resubscribe to DCS service, possible network issue or DCS gateway malfunction") + time.Sleep(1 * time.Second) } - log.WithField("event", ev.String()).Debug("received DCS event") } }() } From 28dc229ebe4cba8f400ddcf9e915569d5ae14d03 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Feb 2023 15:56:28 +0100 Subject: [PATCH 1575/2352] [core] Increase DCS rate limit --- core/integration/dcs/plugin.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 936c2cb04..999c8162b 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -169,6 +169,7 @@ func (p *Plugin) Init(instanceId string) error { if streamErr != nil { log.WithError(streamErr). Error("stream error or bad event from DCS service, dropping stream") + time.Sleep(3 * time.Second) break } log.WithField("event", ev.String()).Debug("received DCS event") @@ -182,7 +183,7 @@ func (p *Plugin) Init(instanceId string) error { log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). WithError(err). Warnf("failed to resubscribe to DCS service, possible network issue or DCS gateway malfunction") - time.Sleep(1 * time.Second) + time.Sleep(3 * time.Second) } } }() From ea7e836d3d302b767fb7edad540138126eca1954 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Feb 2023 16:15:47 +0100 Subject: [PATCH 1576/2352] [core] Better log output from DCS client --- core/integration/dcs/plugin.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 999c8162b..69adbf438 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -152,7 +152,7 @@ func (p *Plugin) Init(instanceId string) error { } evStream, err := p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) if err != nil { - return fmt.Errorf("failed to subscribe to DCS gateway on %s", viper.GetString("dcsServiceEndpoint")) + return fmt.Errorf("failed to subscribe to DCS service on %s, possible network issue or DCS gateway malfunction", viper.GetString("dcsServiceEndpoint")) } go func() { for { @@ -162,7 +162,7 @@ func (p *Plugin) Init(instanceId string) error { } ev, streamErr := evStream.Recv() if streamErr == io.EOF { - log.Info("unexpected EOF from DCS service") + log.Info("unexpected EOF from DCS service, possible DCS gateway malfunction") break } @@ -176,7 +176,7 @@ func (p *Plugin) Init(instanceId string) error { } log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Info("DCS stream closed, attempting reconnect") + Info("DCS stream dropped, attempting reconnect") evStream, err = p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) if err != nil { @@ -184,6 +184,10 @@ func (p *Plugin) Init(instanceId string) error { WithError(err). Warnf("failed to resubscribe to DCS service, possible network issue or DCS gateway malfunction") time.Sleep(3 * time.Second) + } else { + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("level", infologger.IL_Support). + Info("successfully resubscribed to DCS service") } } }() From 4ca99ae50a244d585f0efb7d455be4a1817fdb8f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Feb 2023 15:17:11 +0100 Subject: [PATCH 1577/2352] [core] Support separate stdout/stderr settings in task templates --- common/cmdinfo.go | 56 +++++++++++++++++++++++++++++++++-------------- core/task/task.go | 34 ++++++++++++++++++++-------- 2 files changed, 64 insertions(+), 26 deletions(-) diff --git a/common/cmdinfo.go b/common/cmdinfo.go index dcbf6ddba..0c19f9977 100644 --- a/common/cmdinfo.go +++ b/common/cmdinfo.go @@ -26,18 +26,21 @@ package common import ( "strings" -) + "github.com/AliceO2Group/Control/common/logger/infologger" + log "github.com/sirupsen/logrus" +) type LogTaskOutput int type CommandInfo struct { - Env []string `json:"env,omitempty" yaml:"env,omitempty"` - Shell *bool `json:"shell,omitempty" yaml:"shell,omitempty"` - Value *string `json:"value,omitempty" yaml:"value,omitempty"` - User *string `json:"user,omitempty" yaml:"user,omitempty"` - Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` - Log *string `json:"log,omitempty" yaml:"log,omitempty"` + Env []string `json:"env,omitempty" yaml:"env,omitempty"` + Shell *bool `json:"shell,omitempty" yaml:"shell,omitempty"` + Value *string `json:"value,omitempty" yaml:"value,omitempty"` + User *string `json:"user,omitempty" yaml:"user,omitempty"` + Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` + Stdout *string `json:"stdout,omitempty" yaml:"stdout,omitempty"` + Stderr *string `json:"stderr,omitempty" yaml:"stderr,omitempty"` } func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -48,6 +51,8 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro User *string `json:"user,omitempty" yaml:"user,omitempty"` Arguments []string `json:"arguments,omitempty" yaml:"arguments,omitempty"` Log *string `json:"log,omitempty" yaml:"log,omitempty"` + Stdout *string `json:"stdout,omitempty" yaml:"stdout,omitempty"` + Stderr *string `json:"stderr,omitempty" yaml:"stderr,omitempty"` } aux := _commandInfo{} err = unmarshal(&aux) @@ -63,7 +68,16 @@ func (m *CommandInfo) UnmarshalYAML(unmarshal func(interface{}) error) (err erro m.Value = aux.Value m.Arguments = aux.Arguments m.User = aux.User - m.Log = aux.Log + m.Stdout = aux.Stdout + m.Stderr = aux.Stderr + + // the stdout field used to be called log + if aux.Log != nil && aux.Stdout == nil { + log.WithField("command", m.Value). + WithField("level", infologger.IL_Devel). + Warn("the 'log' field in the task template is deprecated, please use 'stdout' and 'stderr' instead") + m.Stdout = aux.Log + } return } @@ -76,7 +90,8 @@ func (m *CommandInfo) Copy() *CommandInfo { Value: new(string), User: new(string), Arguments: append([]string{}, m.Arguments...), - Log: m.Log, + Stdout: m.Stdout, + Stderr: m.Stderr, } if m.Shell != nil { *cmd.Shell = *m.Shell @@ -112,19 +127,23 @@ func (m *CommandInfo) Equals(other *CommandInfo) (response bool) { } } if !((m.Value == nil && other.Value == nil) || - *m.Value == *other.Value) { + *m.Value == *other.Value) { return false } if !((m.User == nil && other.User == nil) || - *m.User == *other.User) { + *m.User == *other.User) { return false } if !((m.Shell == nil && other.Shell == nil) || *m.Shell == *other.Shell) { return false } - if !((m.Log == nil && other.Log == nil) || - *m.Log == *other.Log) { + if !((m.Stdout == nil && other.Stdout == nil) || + *m.Stdout == *other.Stdout) { + return false + } + if !((m.Stderr == nil && other.Stderr == nil) || + *m.Stderr == *other.Stderr) { return false } return @@ -148,14 +167,17 @@ func (m *CommandInfo) UpdateFrom(n *CommandInfo) { if n.User != nil { *m.User = *n.User } - if n.Log != nil { - *m.Log = *n.Log + if n.Stdout != nil { + *m.Stdout = *n.Stdout + } + if n.Stderr != nil { + *m.Stderr = *n.Stderr } } const defaultCommandInfoShell = false -func (m *CommandInfo) GetEnv () []string { +func (m *CommandInfo) GetEnv() []string { if m != nil { return m.Env } @@ -188,4 +210,4 @@ func (m *CommandInfo) GetUser() string { return *m.User } return "" -} \ No newline at end of file +} diff --git a/core/task/task.go b/core/task/task.go index 2c2a0bd55..57c6b907a 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -349,8 +349,11 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { template.WrapSliceItems(cmd.Arguments)..., )..., ) - if cmd.Log != nil { // we only template it if it's defined - fields = append(fields, template.WrapPointer(cmd.Log)) + if cmd.Stdout != nil { // we only template it if it's defined + fields = append(fields, template.WrapPointer(cmd.Stdout)) + } + if cmd.Stderr != nil { // we only template it if it's defined + fields = append(fields, template.WrapPointer(cmd.Stderr)) } err = fields.Execute(the.ConfSvc(), t.name, varStack, nil, nil, make(map[string]texttemplate.Template), nil) if err != nil { @@ -384,17 +387,30 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { cmd.Timeout, err = time.ParseDuration(traits.Timeout) } - if cmd.Log != nil { - *cmd.Log = strings.TrimSpace(strings.ToLower(*cmd.Log)) - if !utils.StringSliceContains([]string{"stdout", "all", "none"}, *cmd.Log) { - err = fmt.Errorf("bad log forwarding expression %s, allowed values: %s", - *cmd.Log, "none, stdout, all") + if cmd.Stdout != nil { + *cmd.Stdout = strings.TrimSpace(strings.ToLower(*cmd.Stdout)) + if !utils.StringSliceContains([]string{"stdout", "all", "none"}, *cmd.Stdout) { + err = fmt.Errorf("bad stdout forwarding expression %s, allowed values: %s", + *cmd.Stdout, "none, stdout, all") + t.commandInfo = &common.TaskCommandInfo{} + return + } + } else { // stdout not defined + none := "none" + cmd.Stdout = &none + } + + if cmd.Stderr != nil { + *cmd.Stderr = strings.TrimSpace(strings.ToLower(*cmd.Stderr)) + if !utils.StringSliceContains([]string{"stdout", "all", "none"}, *cmd.Stderr) { + err = fmt.Errorf("bad stderr forwarding expression %s, allowed values: %s", + *cmd.Stderr, "none, stdout, all") t.commandInfo = &common.TaskCommandInfo{} return } - } else { // log not defined + } else { // stderr not defined none := "none" - cmd.Log = &none + cmd.Stderr = &none } t.commandInfo = cmd From 55d8ed43a25a1b227f671ccdc686b8c23a8450fa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 Feb 2023 15:17:47 +0100 Subject: [PATCH 1578/2352] [executor] Support separate stdout/stderr settings in all tasks --- executor/executable/basictaskcommon.go | 40 ++++++++++++++++------- executor/executable/controllabletask.go | 43 ++++++++++++++++--------- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index b2b3a2207..3302779e7 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -73,11 +73,16 @@ func (t *basicTaskBase) startBasicTask() (err error) { var stdoutBuf, stderrBuf bytes.Buffer var stdout, stderr io.Writer - if t.Tci.Log == nil { + if t.Tci.Stdout == nil { none := "none" - t.Tci.Log = &none + t.Tci.Stdout = &none } - switch *t.Tci.Log { + if t.Tci.Stderr == nil { + none := "none" + t.Tci.Stderr = &none + } + + switch *t.Tci.Stdout { case "stdout": stdoutLog := log.WithPrefix("task-stdout"). WithField("level", infologger.IL_Support). @@ -86,25 +91,38 @@ func (t *basicTaskBase) startBasicTask() (err error) { WithField("task", t.ti.Name). WithField("nohooks", true). WriterLevel(logrus.TraceLevel) - stderrLog := log.WithPrefix("task-stderr"). + + // Each of these multiwriters will push incoming lines to a buffer as well as the logger + stdout = io.MultiWriter(stdoutLog, &stdoutBuf) + + case "all": + stdoutLog := log.WithPrefix("task-stdout"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("task", t.ti.Name). - WithField("nohooks", true). WriterLevel(logrus.TraceLevel) - - // Each of these multiwriters will push incoming lines to a buffer as well as the logger stdout = io.MultiWriter(stdoutLog, &stdoutBuf) - stderr = io.MultiWriter(stderrLog, &stderrBuf) - case "all": - stdoutLog := log.WithPrefix("task-stdout"). + default: + // Nothing goes to the log, we go straight to the buffer + stdout = &stdoutBuf + } + + switch *t.Tci.Stderr { + case "stdout": + stderrLog := log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("task", t.ti.Name). + WithField("nohooks", true). WriterLevel(logrus.TraceLevel) + + // Each of these multiwriters will push incoming lines to a buffer as well as the logger + stderr = io.MultiWriter(stderrLog, &stderrBuf) + + case "all": stderrLog := log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). @@ -112,12 +130,10 @@ func (t *basicTaskBase) startBasicTask() (err error) { WithField("task", t.ti.Name). WriterLevel(logrus.TraceLevel) - stdout = io.MultiWriter(stdoutLog, &stdoutBuf) stderr = io.MultiWriter(stderrLog, &stderrBuf) default: // Nothing goes to the log, we go straight to the buffer - stdout = &stdoutBuf stderr = &stderrBuf } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6d756a485..8753df2dc 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -168,11 +168,16 @@ func (t *ControllableTask) Launch() error { "level": infologger.IL_Devel, })) - if t.Tci.Log == nil { + if t.Tci.Stdout == nil { none := "none" - t.Tci.Log = &none + t.Tci.Stdout = &none } - switch *t.Tci.Log { + if t.Tci.Stderr == nil { + none := "none" + t.Tci.Stderr = &none + } + + switch *t.Tci.Stdout { case "stdout": go func() { entry := log.WithPrefix("task-stdout"). @@ -188,34 +193,43 @@ func (t *ControllableTask) Launch() error { _, errStdout = io.Copy(writer, stdoutIn) writer.Flush() }() + case "all": go func() { - entry := log.WithPrefix("task-stderr"). + entry := log.WithPrefix("task-stdout"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). - WithField("task", t.ti.Name). - WithField("nohooks", true) + WithField("task", t.ti.Name) writer := &logger.SafeLogrusWriter{ Entry: entry, - PrintFunc: entry.Warn, + PrintFunc: entry.Debug, } - _, errStderr = io.Copy(writer, stderrIn) + _, errStdout = io.Copy(writer, stdoutIn) writer.Flush() }() - case "all": + default: go func() { - entry := log.WithPrefix("task-stdout"). + _, errStdout = io.Copy(io.Discard, stdoutIn) + }() + } + + switch *t.Tci.Stderr { + case "stdout": + go func() { + entry := log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). - WithField("task", t.ti.Name) + WithField("task", t.ti.Name). + WithField("nohooks", true) writer := &logger.SafeLogrusWriter{ Entry: entry, - PrintFunc: entry.Debug, + PrintFunc: entry.Warn, } - _, errStdout = io.Copy(writer, stdoutIn) + _, errStderr = io.Copy(writer, stderrIn) writer.Flush() }() + case "all": go func() { entry := log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). @@ -230,9 +244,6 @@ func (t *ControllableTask) Launch() error { writer.Flush() }() default: - go func() { - _, errStdout = io.Copy(io.Discard, stdoutIn) - }() go func() { _, errStderr = io.Copy(io.Discard, stderrIn) }() From ae656ef7696a981cc2bb6982eee6a1d14d48475e Mon Sep 17 00:00:00 2001 From: David Rohr Date: Wed, 22 Feb 2023 14:34:04 +0100 Subject: [PATCH 1579/2352] RunNumber is 32bit, not 64 --- occ/occlib/OccServer.cxx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 37860bc01..1b5b61fbe 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -237,7 +237,7 @@ t_State OccServer::processStateTransition(const std::string& event, const boost: std::string evt = boost::algorithm::to_lower_copy(event); - printf("[OCC] Object: %s - processing event %s in state %s with run number %lu.\n", + printf("[OCC] Object: %s - processing event %s in state %s with run number %u.\n", m_rco->getName().c_str(), evt.c_str(), getStringFromState(currentState).c_str(), From a76cc33b9ebc7a0853604a937c930fddbd4bcbde Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 20 Feb 2023 17:14:50 +0100 Subject: [PATCH 1580/2352] [OCTRL-683][executor] ERROR should not be the last state Since we aim to transition from ERROR to DONE, we cannot stop the loop when we reach ERROR. KILL_TRANSITION_TIMEOUT should protect us from being stuck in ERROR forever (in case we fail to get to DONE). --- executor/executable/controllabletask.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8753df2dc..179ae8fcf 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -683,8 +683,7 @@ func (t *ControllableTask) Kill() error { return } - for reachedState != "DONE" && - reachedState != "ERROR" { + for reachedState != "DONE" { cmd := nextTransition(reachedState) log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). From ea8fc7fa503ca3cf5443527bf491a177837d6acd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 23 Feb 2023 09:33:21 +0100 Subject: [PATCH 1581/2352] [build] Bump to v0.63.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6ff42cce0..cd4ed0523 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 62 +VERSION_MINOR := 63 VERSION_PATCH := 0 From 97e4abe7b46adbca2b6201c335a4756e6d5b0b57 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 23 Feb 2023 12:57:09 +0100 Subject: [PATCH 1582/2352] [OCTRL-720][core] pass trigger start and stop to GRP --- core/integration/ccdb/plugin.go | 54 +++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index b049256ca..c36a20eaf 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -54,8 +54,10 @@ var log = logger.New(logrus.StandardLogger(), "ccdbclient") type GeneralRunParameters struct { runNumber uint32 runType runtype.RunType - startTimeMs string // we keep it as string, to avoid converting back and forth from time.Time - endTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + runStartTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + runEndTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + trgStartTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + trgEndTimeMs string // we keep it as string, to avoid converting back and forth from time.Time detectors []string continuousReadoutDetectors []string triggeringDetectors []string @@ -137,8 +139,8 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } } - startTime := varStack["run_start_time_ms"] - endTime := varStack["run_end_time_ms"] + runStartTime := varStack["run_start_time_ms"] + runEndTime := varStack["run_end_time_ms"] // use the fake run start time if available pdpOverrideRunStartTime, ok := varStack["pdp_override_run_start_time"] @@ -156,15 +158,15 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { WithField("run", runNumber). Warnf("overriding run start time to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) } - if len(endTime) > 0 { + if len(runEndTime) > 0 { // calculate eor time as pdp_override_run_start_time + real run duration - startTimeNumber, err := strconv.ParseUint(startTime, 10, 64) + startTimeNumber, err := strconv.ParseUint(runStartTime, 10, 64) if err != nil { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("run", runNumber). - Errorf("could not parse run startTime: %s", startTime) + Errorf("could not parse runStartTime: %s", runStartTime) } pdpOverrideRunStartTimeNumber, err := strconv.ParseUint(pdpOverrideRunStartTime, 10, 64) if err != nil { @@ -174,13 +176,13 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { WithField("run", runNumber). Errorf("could not parse pdpOverrideRunStartTimeNumber: %s", pdpOverrideRunStartTime) } - endTimeNumber, err := strconv.ParseUint(endTime, 10, 64) + endTimeNumber, err := strconv.ParseUint(runEndTime, 10, 64) if err != nil { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("run", runNumber). - Errorf("could not parse run endTime: %s", endTime) + Errorf("could not parse runEndTime: %s", runEndTime) } if endTimeNumber <= startTimeNumber { log.WithError(err). @@ -191,9 +193,9 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } runDuration := endTimeNumber - startTimeNumber - endTime = strconv.FormatUint(pdpOverrideRunStartTimeNumber+runDuration, 10) + runEndTime = strconv.FormatUint(pdpOverrideRunStartTimeNumber+runDuration, 10) } - startTime = pdpOverrideRunStartTime + runStartTime = pdpOverrideRunStartTime } else if strings.Contains(runTypeStr, "SYNTHETIC") { log.WithField("partition", envId). WithField("runType", runTypeStr). @@ -202,6 +204,12 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { Warnf("requested SYNTHETIC run but run start time override not provided") } + // as indicated by Ruben in OCTRL-720, these two are not needed online, + // so it is OK the GRP is sent before the trigger start at SOR (thus without trigger start and stop), + // but we should send these at EOR. + trgStartTime := varStack["trg_start_time_ms"] + trgEndTime := varStack["trg_end_time_ms"] + detectorsStr, ok := varStack["detectors"] if !ok { log.WithField("partition", envId). @@ -260,8 +268,10 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { return &GeneralRunParameters{ uint32(runNumber), runType, - startTime, - endTime, + runStartTime, + runEndTime, + trgStartTime, + trgEndTime, detectorsSlice, continuousReadoutDetectors, triggeringDetectors, @@ -374,11 +384,17 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin if len(grp.triggeringDetectors) != 0 { cmd += " -g \"" + strings.Join(grp.triggeringDetectors, ",") + "\"" } - if len(grp.startTimeMs) > 0 { - cmd += " -s " + grp.startTimeMs + if len(grp.runStartTimeMs) > 0 { + cmd += " -s " + grp.runStartTimeMs + } + if len(grp.runEndTimeMs) > 0 { + cmd += " -e " + grp.runEndTimeMs + } + if len(grp.trgStartTimeMs) > 0 { + cmd += " --start-time-ctp " + grp.trgStartTimeMs } - if len(grp.endTimeMs) > 0 { - cmd += " -e " + grp.endTimeMs + if len(grp.trgEndTimeMs) > 0 { + cmd += " --end-time-ctp " + grp.trgEndTimeMs } if len(grp.flpIdList) > 0 { cmd += " -f \"" + strings.Join(grp.flpIdList, ",") + "\"" @@ -466,8 +482,8 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre log.WithField("partition", envId). WithField("run", grp.runNumber). WithField("level", infologger.IL_Devel). - Debugf("GRP: %d, %s, %s, %s, %d, %s, %s, %s, %s", - grp.runNumber, grp.runType.String(), grp.startTimeMs, grp.endTimeMs, grp.hbfPerTf, grp.lhcPeriod, + Debugf("GRP: %d, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s", + grp.runNumber, grp.runType.String(), grp.runStartTimeMs, grp.runEndTimeMs, grp.trgStartTimeMs, grp.trgEndTimeMs, grp.hbfPerTf, grp.lhcPeriod, strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ",")) cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl, refresh) if err != nil { From 22cdba114701227166177bc7f08cee8fc6fe2287 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 28 Feb 2023 14:36:01 +0100 Subject: [PATCH 1583/2352] [OCTRL-734][core] Add the plugin error reasons in the GUI messages --- core/workflow/callable/call.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 8bb17064a..9e26963ce 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -140,6 +140,9 @@ func (c *Call) Call() error { // if __call_error was written into the VarStack we treat it as an error exit from the call if errMsg, ok := c.VarStack["__call_error"]; ok && len(errMsg) > 0 { + if errReason, ok := c.VarStack["__call_error_reason"]; ok && len(errReason) > 0 { + errMsg += ". REASON: " + errReason + } return errors.New(errMsg) } From cfd7512612132c1965bb40758ae6e0e0a5850f42 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 3 Mar 2023 14:45:07 +0100 Subject: [PATCH 1584/2352] [doc] update the SM diagram and document SM callbacks --- docs/handbook/AliECS-envsm.png | Bin 419355 -> 0 bytes docs/handbook/AliECS-envsm.svg | 4 ++++ docs/handbook/overview.md | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) delete mode 100644 docs/handbook/AliECS-envsm.png create mode 100644 docs/handbook/AliECS-envsm.svg diff --git a/docs/handbook/AliECS-envsm.png b/docs/handbook/AliECS-envsm.png deleted file mode 100644 index f96ccb6e3f630e20b9211d2c4e38acf5ca2d32a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 419355 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

d02H=M;WiRGifu=4J%wPMtuw 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 bkmxKcT(O?FUV^6o4g6>w(bdROxA^Jb0c!k- diff --git a/docs/handbook/AliECS-envsm.svg b/docs/handbook/AliECS-envsm.svg new file mode 100644 index 000000000..e185c8205 --- /dev/null +++ b/docs/handbook/AliECS-envsm.svg @@ -0,0 +1,4 @@ + + + +
DEPLOY
DEPLOY
GO_ERROR
GO_ERROR
STANDBY
STANDBY
CONFIGURE
CONFIGURE
GO_ERROR
GO_ERROR
DEPLOYED
DEPLOYED
EXIT
EXIT
CONFIGURED
CONFIGURED
GO_ERROR
GO_ERROR
RUNNING
RUNNING
RECOVER
RECOVER
ERROR
ERROR
START_ACTIVITY
START_ACTIVITY
STOP_ACTIVITY
STOP_ACTIVITY
RESET
RESET
DONE
DONE
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index beff23a28..3f0d7f229 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -37,6 +37,20 @@ Thus, when we discuss the state machine of an AliECS-controlled process, we usua ## State machines The main state machine of AliECS is the environment state machine, which represents the collective state of all the tasks involved in a given data processing activity. -![](AliECS-envsm.png) -While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](https://alice-flp-suite.docs.cern.ch/aliecs/occ/) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. \ No newline at end of file +![](AliECS-envsm.svg) + +While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](https://alice-flp-suite.docs.cern.ch/aliecs/occ/) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. + +## State machine callbacks + +The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). +This is the order of callback execution upon a state transition: +1. `before_` - called before event named `` +2. `before_event` - called before all events +3. `leave_` - called before leaving `` +4. `leave_state` - called before leaving all states +5. `enter_`, `` - called after entering `` +6. `enter_state` - called after entering all states +7. `after_`, `` - called after event named `` +8. `after_event` - called after all events \ No newline at end of file From b6eb70c3f133e1cfde7ffdbd384099845409b6d4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Mar 2023 12:31:35 +0200 Subject: [PATCH 1585/2352] [core] Prevent crash on bad traits in configureTasks --- core/task/manager.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 3b2722c50..a7e6c0349 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -686,14 +686,16 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } taskDescription = fmt.Sprintf("task '%s' on %s (id %s, name %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), task.GetName(), v.Error()) - if task.GetTraits().Critical == true || task.parent.GetTaskTraits().Critical == true { - taskCriticalErrors = append(taskCriticalErrors, taskDescription) - } else { - taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) - } + } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) + } + if task != nil && task.GetTraits().Critical { taskCriticalErrors = append(taskCriticalErrors, taskDescription) + } else if task != nil && task.parent != nil && task.parent.GetTaskTraits().Critical { + taskCriticalErrors = append(taskCriticalErrors, taskDescription) + } else { + taskNonCriticalErrors = append(taskNonCriticalErrors, taskDescription) } i++ } From fd5cfba84e0441c74c65c5bfc4fe526d6252306d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Mar 2023 14:35:12 +0200 Subject: [PATCH 1586/2352] [build] Bump to v0.63.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cd4ed0523..c983e0dbb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 63 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From bf578bf65fb9b4d1024a9aaecb0485fd5b5f5d07 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Mar 2023 10:40:16 +0100 Subject: [PATCH 1587/2352] [OCTRL-770][core] set run end time after trg end time --- core/environment/environment.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 8514e5d99..ea8cfaad2 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -191,7 +191,6 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { log.Error("cannot access AliECS workflow configuration defaults") } } else if e.Event == "STOP_ACTIVITY" { - // once we make a smooth transition to "leave_RUNNING" in ControlWorkflows, this could be deleted. endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) @@ -230,17 +229,6 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } }, "leave_state": func(e *fsm.Event) { - // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. - if e.Src == "RUNNING" { - endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") - if ok && endTime == "" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) - } else { - log.WithField("partition", envId.String()). - Debug("O2 End time already set before leave_RUNNING") - } - } errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) if errHooks != nil { e.Cancel(errHooks) From 875c1dce4999c186c0fafaf0ea6d7bc4b785498a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 15 Mar 2023 14:37:43 +0100 Subject: [PATCH 1588/2352] [core] set EOR time also before DESTROY --- core/environment/manager.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index b81befb32..d8de5eaf5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -27,10 +27,6 @@ package environment import ( "errors" "fmt" - "strconv" - "strings" - "sync" - "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" @@ -44,6 +40,10 @@ import ( "github.com/AliceO2Group/Control/core/workflow" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" + "strconv" + "strings" + "sync" + "time" ) type Manager struct { @@ -351,6 +351,17 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error }).Error(fmt.Errorf("could not handle hooks for the trigger leave_%s, error: %w", env.CurrentState(), err)) } + if env.CurrentState() == "RUNNING" { + endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + if ok && endTime == "" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else { + log.WithField("partition", environmentId.String()). + Debug("O2 End time already set before DESTROY") + } + } + tasksToRelease := env.Workflow().GetTasks() // we gather all DESTROY/after_DESTROY hooks, as these require special treatment From 4ea06ebdac00e852523e6fabb293eab2e5227ec0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Mar 2023 14:40:04 +0200 Subject: [PATCH 1589/2352] [build] That's v0.64.1 actually --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c983e0dbb..954cd0753 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 63 +VERSION_MINOR := 64 VERSION_PATCH := 1 From 94988f0a8a5602d715e43cb2286e2bb4c8369815 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 31 Mar 2023 12:01:19 +0200 Subject: [PATCH 1590/2352] [core] Do not write back to varSpecMap coming from repos backend --- core/server.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/server.go b/core/server.go index 4ce08bd47..be24774cc 100644 --- a/core/server.go +++ b/core/server.go @@ -39,6 +39,7 @@ import ( "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/repos/varsource" + "github.com/jinzhu/copier" "github.com/spf13/viper" "google.golang.org/grpc/codes" "google.golang.org/grpc/reflection" @@ -741,12 +742,11 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo for revision, templates := range revisions { for _, template := range templates { // First we take care of overriding any WFT VarSpec defaults with Apricot vars - var varSpecMap repos.VarSpecMap + varSpecMap := make(repos.VarSpecMap) if template.VarInfo != nil { - varSpecMap = template.VarInfo - } else { - varSpecMap = repos.VarSpecMap{} + _ = copier.Copy(&varSpecMap, template.VarInfo) } + for k, v := range varSpecMap { if v.Source == varsource.WorkflowDefaults { // if this varSpec was declared as a default if apricotValue, exists := vars[k]; exists { // and a corresponding Apricot var exists From 0ceffa5883c153eeae3109f7944fa2de1c6d6691 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Apr 2023 17:13:39 +0200 Subject: [PATCH 1591/2352] [core] Update run types enum in Bookkeeping client --- .../bookkeeping/protos/common.pb.go | 27 +++++++++++++------ .../bookkeeping/protos/environment.pb.go | 2 +- .../bookkeeping/protos/environment_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/flp.pb.go | 2 +- .../bookkeeping/protos/flp_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/log.pb.go | 2 +- .../bookkeeping/protos/log_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/run.pb.go | 2 +- .../bookkeeping/protos/run_grpc.pb.go | 2 +- 9 files changed, 27 insertions(+), 16 deletions(-) diff --git a/core/integration/bookkeeping/protos/common.pb.go b/core/integration/bookkeeping/protos/common.pb.go index 8437c92b4..95aa6f8a1 100644 --- a/core/integration/bookkeeping/protos/common.pb.go +++ b/core/integration/bookkeeping/protos/common.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/common.proto package bkpb @@ -183,6 +183,8 @@ const ( RunType_RUN_TYPE_COSMICS RunType = 14 RunType_RUN_TYPE_SYNTHETIC RunType = 15 RunType_RUN_TYPE_NOISE RunType = 16 + RunType_RUN_TYPE_CALIBRATION_PULSE_LENGTH RunType = 17 + RunType_RUN_TYPE_CALIBRATION_VRESETD RunType = 18 ) // Enum value maps for RunType. @@ -205,6 +207,8 @@ var ( 14: "RUN_TYPE_COSMICS", 15: "RUN_TYPE_SYNTHETIC", 16: "RUN_TYPE_NOISE", + 17: "RUN_TYPE_CALIBRATION_PULSE_LENGTH", + 18: "RUN_TYPE_CALIBRATION_VRESETD", } RunType_value = map[string]int32{ "RUN_TYPE_NULL": 0, @@ -224,6 +228,8 @@ var ( "RUN_TYPE_COSMICS": 14, "RUN_TYPE_SYNTHETIC": 15, "RUN_TYPE_NOISE": 16, + "RUN_TYPE_CALIBRATION_PULSE_LENGTH": 17, + "RUN_TYPE_CALIBRATION_VRESETD": 18, } ) @@ -716,7 +722,7 @@ var file_protos_common_proto_rawDesc = []byte{ 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x2a, - 0xe7, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, + 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, @@ -746,12 +752,17 @@ var file_protos_common_proto_rawDesc = []byte{ 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, + 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, + 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index fb2a0f3f6..1cfd33666 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index dce68d20c..d9c1700f6 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index 46ec85a35..e2672ac7a 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index 4d1157568..42ec2d071 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index e2c73dd30..dc5adee1a 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 3d04ae474..7261a6527 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 55f6b085e..6fe183012 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/run.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index 6fbb5fd15..e7ea403c2 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/run.proto package bkpb From a5dc1f19521ea6a128df842de325e32ffbea0c4c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Apr 2023 17:14:09 +0200 Subject: [PATCH 1592/2352] [core] Regenerate DCS protofile (AGD detector) --- core/integration/dcs/protos/dcs.pb.go | 125 +++++++++++---------- core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- 2 files changed, 65 insertions(+), 62 deletions(-) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 79a58b7bf..9aedc2df2 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.12 // source: protos/dcs.proto package dcspb @@ -129,6 +129,7 @@ const ( Detector_ZDC Detector = 15 Detector_LHC Detector = 16 Detector_DCS Detector = 17 + Detector_AGD Detector = 18 ) // Enum value maps for Detector. @@ -152,6 +153,7 @@ var ( 15: "ZDC", 16: "LHC", 17: "DCS", + 18: "AGD", } Detector_value = map[string]int32{ "NULL_DETECTOR": 0, @@ -172,6 +174,7 @@ var ( "ZDC": 15, "LHC": 16, "DCS": 17, + "AGD": 18, } ) @@ -1142,7 +1145,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x0b, 0x0a, 0x07, - 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xb6, 0x01, 0x0a, 0x08, 0x44, 0x65, + 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, @@ -1154,65 +1157,65 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, - 0x10, 0x11, 0x2a, 0xe3, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, - 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, - 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, - 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, - 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x2a, 0xb0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, - 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, - 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, - 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, - 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, - 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, - 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, - 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, - 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, - 0x49, 0x53, 0x45, 0x10, 0x10, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, - 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, - 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, - 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, - 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, - 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xe3, 0x01, 0x0a, 0x0d, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, + 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, + 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, + 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, + 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, + 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, + 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, + 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, + 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, + 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, + 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x0c, 0x2a, 0xb0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, + 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, + 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, + 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, + 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, + 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, + 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, + 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, + 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, + 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x22, 0x04, + 0x08, 0x0d, 0x10, 0x0f, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, + 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, + 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, + 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, + 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, + 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 9b02b34ef..71b685526 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.12 // source: protos/dcs.proto package dcspb From 936b35249ccc84d741bea032d27828819c7ae12c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Apr 2023 10:58:03 +0200 Subject: [PATCH 1593/2352] [core] Inform user if offer includes multiple executors --- core/task/scheduler.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 1a3e17452..d28ea6c5c 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -554,8 +554,19 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // we start a new one by generating a new ID if len(offer.ExecutorIDs) == 0 { targetExecutorId.Value = uid.New().String() + log.WithField("executorId", targetExecutorId.Value). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Devel). + Info("received offer without executor ID, will start new executor if accepted") } else { targetExecutorId.Value = offer.ExecutorIDs[0].Value + if len(offer.ExecutorIDs) > 1 { + log.WithField("executorId", targetExecutorId.Value). + WithField("executorIds", offer.ExecutorIDs). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Devel). + Warn("received offer with more than one executor ID, will use first one") + } } host := offer.GetHostname() From c433d4fe7e0d1324ce3e34f05ecf627f1edeca50 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Apr 2023 10:58:51 +0200 Subject: [PATCH 1594/2352] [executor] Do not cause executor disconnect on unprocessable MESSAGE --- executor/executor.go | 5 +++-- executor/handlers.go | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/executor/executor.go b/executor/executor.go index 9032cd169..fa16cb148 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -271,9 +271,10 @@ func buildEventHandler(state *internalState) events.Handler { Trace("received message data") err := handleMessageEvent(state, e.Message.Data) if err != nil { - log.WithField("error", err.Error()).Debug("MESSAGE handler error") + log.WithField("error", err.Error()). + Debug("incoming MESSAGE handler error") } - return err + return nil // failed message handler (e.g. no such task) shouldn't cause an executor disconnect }, executor.Event_SHUTDOWN: func(_ context.Context, e *executor.Event) error { log.WithField("event", e.Type.String()).Trace("handling event") diff --git a/executor/handlers.go b/executor/handlers.go index a46adc07a..d1b5114ab 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -116,7 +116,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { response.ErrorString = err.Error() } - data, marshalError := json.Marshal(response) + jsonData, marshalError := json.Marshal(response) if marshalError != nil { if response.Err() != nil { log.WithFields(logrus.Fields{ @@ -137,7 +137,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { return } - _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(jsonData))) if response.Err() != nil { log.WithFields(logrus.Fields{ "commandName": response.GetCommandName(), @@ -191,7 +191,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { response := activeTask.Transition(cmd) - data, marshalError := json.Marshal(response) + jsonData, marshalError := json.Marshal(response) if marshalError != nil { if response.Err() != nil { log.WithFields(logrus.Fields{ @@ -212,7 +212,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { return } - _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(data))) + _, _ = state.cli.Send(context.TODO(), calls.NonStreaming(calls.Message(jsonData))) if response.Err() != nil { log.WithFields(logrus.Fields{ "commandName": response.GetCommandName(), From a8468197e4f511a42880f7fb101b48368317090a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Apr 2023 13:57:19 +0200 Subject: [PATCH 1595/2352] [build] Bump to v0.64.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 954cd0753..4dba8ab73 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 64 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From d801fedc90d70b4acc28a5305cdf60bbe51ae796 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Apr 2023 17:29:31 +0200 Subject: [PATCH 1596/2352] [core] Treat undeployable task separately from plain inactive --- core/environment/transition_deploy.go | 54 +++++++++++++++++++++++++-- core/task/errors.go | 6 ++- core/task/manager.go | 45 ++++++++++++++++------ core/task/scheduler.go | 28 +++++++++++++- core/task/status.go | 15 ++++++-- 5 files changed, 128 insertions(+), 20 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 7b042a12e..db524bc91 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -228,14 +228,55 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). Debug("workflow status change") if wfStatus == task.ACTIVE { + break WORKFLOW_ACTIVE_LOOP + } else if wfStatus == task.UNDEPLOYABLE { + err = errors.New("workflow is undeployable") + undeployableTaskRoles := make([]string, 0) + workflow.LeafWalk(wf, func(role workflow.Role) { + if roleStatus := role.GetStatus(); roleStatus == task.UNDEPLOYABLE { + detector, ok := role.GetUserVars().Get("detector") + if !ok { + detector = "" + } + log.WithField("state", role.GetState().String()). + WithField("status", roleStatus.String()). + WithField("role", role.GetPath()). + WithField("partition", env.Id().String()). + WithField("timeout", deploymentTimeout). + WithField("detector", detector). + Error("role failed to deploy within timeout") + undeployableTaskRoles = append(undeployableTaskRoles, role.GetPath()) + } + }) + + sort.Strings(undeployableTaskRoles) + inactiveTaskRolesS := strings.Join(undeployableTaskRoles, ", ") + + err = fmt.Errorf("workflow deployment failed (one or more roles undeployable), aborting and cleaning up [undeployable roles: %s]", inactiveTaskRolesS) + break WORKFLOW_ACTIVE_LOOP } continue + case <-time.After(deploymentTimeout): wfStatus = wf.GetStatus() inactiveTaskRoles := make([]string, 0) + undeployableTaskRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { - if roleStatus := role.GetStatus(); roleStatus != task.ACTIVE { + if roleStatus := role.GetStatus(); roleStatus == task.UNDEPLOYABLE { + detector, ok := role.GetUserVars().Get("detector") + if !ok { + detector = "" + } + log.WithField("state", role.GetState().String()). + WithField("status", roleStatus.String()). + WithField("role", role.GetPath()). + WithField("partition", env.Id().String()). + WithField("timeout", deploymentTimeout). + WithField("detector", detector). + Error("role failed to deploy within timeout") + undeployableTaskRoles = append(undeployableTaskRoles, role.GetPath()) + } else if roleStatus != task.ACTIVE { detector, ok := role.GetUserVars().Get("detector") if !ok { detector = "" @@ -252,9 +293,16 @@ func (t DeployTransition) do(env *Environment) (err error) { }) sort.Strings(inactiveTaskRoles) + sort.Strings(undeployableTaskRoles) inactiveTaskRolesS := strings.Join(inactiveTaskRoles, ", ") - - err = fmt.Errorf("workflow deployment timed out (%s), aborting and cleaning up [inactive roles: %s]", deploymentTimeout.String(), inactiveTaskRolesS) + undeployableTaskRolesS := strings.Join(undeployableTaskRoles, ", ") + + err = fmt.Errorf("workflow deployment timed out (%s), aborting and cleaning up [%d undeployable roles: %s; %d inactive roles: %s]", + deploymentTimeout.String(), + len(undeployableTaskRoles), + undeployableTaskRolesS, + len(inactiveTaskRoles), + inactiveTaskRolesS) break WORKFLOW_ACTIVE_LOOP // This is needed for when the workflow fails during the STAGING state(mesos status),mesos responds with the `REASON_COMMAND_EXECUTOR_FAILED`, // By listening to workflow state ERROR we can break the loop before reaching the timeout (1m30s), we can trigger the cleanup faster diff --git a/core/task/errors.go b/core/task/errors.go index 9a40fe7ee..10bc5ea6e 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -77,8 +77,10 @@ func (r GenericTasksError) Error() string { type TasksDeploymentError struct { tasksErrorBase - failedNonCriticalDescriptors Descriptors - failedCriticalDescriptors Descriptors + failedNonCriticalDescriptors Descriptors + failedCriticalDescriptors Descriptors + undeployableNonCriticalDescriptors Descriptors + undeployableCriticalDescriptors Descriptors } func (r TasksDeploymentError) Error() string { diff --git a/core/task/manager.go b/core/task/manager.go index a7e6c0349..dfea08895 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -66,8 +66,9 @@ const ( const TaskMan_QUEUE = 32768 type ResourceOffersOutcome struct { - deployed DeploymentMap - undeployed Descriptors + deployed DeploymentMap + undeployed Descriptors + undeployable Descriptors } type ResourceOffersDeploymentRequest struct { @@ -453,8 +454,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // - awaiting Task deployment in tasksToRun deploymentSuccess := true // hopefully undeployedDescriptors := make(Descriptors, 0) + undeployableDescriptors := make(Descriptors, 0) undeployedNonCriticalDescriptors := make(Descriptors, 0) undeployedCriticalDescriptors := make(Descriptors, 0) + undeployableNonCriticalDescriptors := make(Descriptors, 0) + undeployableCriticalDescriptors := make(Descriptors, 0) deployedTasks := make(DeploymentMap) if len(tasksToRun) > 0 { @@ -494,6 +498,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e deployedTasks = roOutcome.deployed undeployedDescriptors = roOutcome.undeployed + undeployableDescriptors = roOutcome.undeployable log.WithField("tasks", deployedTasks). WithField("partition", envId). @@ -506,20 +511,36 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e log.WithField("partition", envId). Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) - for _, t := range undeployedDescriptors { - if t.TaskRole.GetTaskTraits().Critical == true { + for _, desc := range undeployedDescriptors { + if desc.TaskRole.GetTaskTraits().Critical == true { deploymentSuccess = false - undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, t) - printname := fmt.Sprintf("%s->%s", t.TaskRole.GetPath(), t.TaskClassName) + undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) log.WithField("partition", envId). Errorf("critical task deployment failure: %s", printname) } else { - undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, t) - printname := fmt.Sprintf("%s->%s", t.TaskRole.GetPath(), t.TaskClassName) + undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) log.WithField("partition", envId). Warnf("non-critical task deployment failure: %s", printname) } } + + for _, desc := range undeployableDescriptors { + if desc.TaskRole.GetTaskTraits().Critical == true { + deploymentSuccess = false + undeployableCriticalDescriptors = append(undeployableCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Errorf("critical task deployment impossible: %s", printname) + go desc.TaskRole.UpdateStatus(UNDEPLOYABLE) + } else { + undeployableNonCriticalDescriptors = append(undeployableNonCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Warnf("non-critical task deployment impossible: %s", printname) + } + } } } @@ -546,9 +567,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } err = TasksDeploymentError{ - tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, - failedNonCriticalDescriptors: undeployedNonCriticalDescriptors, - failedCriticalDescriptors: undeployedCriticalDescriptors, + tasksErrorBase: tasksErrorBase{taskIds: deployedTaskIds}, + failedNonCriticalDescriptors: undeployedNonCriticalDescriptors, + failedCriticalDescriptors: undeployedCriticalDescriptors, + undeployableNonCriticalDescriptors: undeployableNonCriticalDescriptors, + undeployableCriticalDescriptors: undeployableCriticalDescriptors, } } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index d28ea6c5c..086a825e2 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -501,6 +501,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han tasksDeployed := make(DeploymentMap) + // list of descriptors that we find impossible to deploy due to wants/constraints + descriptorsUndeployable := make(Descriptors, 0) + if len(descriptorsStillToDeploy) > 0 { // 3 ways to make decisions // * FLP1, FLP2, ... , EPN1, EPN2, ... o2-roles as mesos attributes of an agent @@ -640,6 +643,18 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("detector", descriptorDetector). Debug("offer attributes satisfy constraints") + // We write down the fact that one of the attributes matched is machine_id, therefore this task + // is bound to this and only this offer/machine + machineIdMatched := false + for _, constr := range descriptorConstraints[descriptor] { // for each constraint for this descriptor + if constr.Attribute == "machine_id" { + // enough to know that the machine_id attribute is required for this descriptor, + // because we're already in the "attributes matched" case + machineIdMatched = true + break + } + } + var wants *Wants wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) if err != nil { @@ -671,6 +686,17 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han }). Warn("descriptor wants not satisfied by offer resources") } + + // Special case for machine_id attribute matching: if the machine_id was matched to the + // offer/machine but this offer doesn't satisfy resource wants, we bail early + if machineIdMatched { + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + + break FOR_DESCRIPTORS + } + continue // next descriptor } @@ -1020,7 +1046,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // Notify listeners... select { - case state.resourceOffersDone <- ResourceOffersOutcome{tasksDeployed, descriptorsStillToDeploy}: + case state.resourceOffersDone <- ResourceOffersOutcome{tasksDeployed, descriptorsStillToDeploy, descriptorsUndeployable}: log.WithPrefix("scheduler"). WithField("tasksDeployed", len(tasksDeployed)). WithField("partition", envId.String()). diff --git a/core/task/status.go b/core/task/status.go index f1c63cf91..5a015ca57 100644 --- a/core/task/status.go +++ b/core/task/status.go @@ -24,14 +24,16 @@ package task - type Status uint8 + const ( UNDEFINED = iota INACTIVE PARTIAL ACTIVE + UNDEPLOYABLE ) + var ( STATUS_PRODUCT = map[Status]map[Status]Status{ UNDEFINED: { @@ -58,6 +60,13 @@ var ( PARTIAL: PARTIAL, ACTIVE: ACTIVE, }, + UNDEPLOYABLE: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEPLOYABLE, + PARTIAL: UNDEPLOYABLE, + ACTIVE: UNDEPLOYABLE, + UNDEPLOYABLE: UNDEPLOYABLE, + }, } ) @@ -67,8 +76,9 @@ func (s Status) String() string { "INACTIVE", "PARTIAL", "ACTIVE", + "UNDEPLOYABLE", } - if s > ACTIVE { + if s > UNDEPLOYABLE { return "UNDEFINED" } return names[s] @@ -77,4 +87,3 @@ func (s Status) String() string { func (s Status) X(other Status) Status { return STATUS_PRODUCT[s][other] } - From 417868e20dc5d26ba91623d66f1d5f69a7391981 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Apr 2023 11:56:56 +0200 Subject: [PATCH 1597/2352] [executor] Log end of life --- cmd/o2-aliecs-executor/main.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cmd/o2-aliecs-executor/main.go b/cmd/o2-aliecs-executor/main.go index 2c6a26410..a45ed9188 100644 --- a/cmd/o2-aliecs-executor/main.go +++ b/cmd/o2-aliecs-executor/main.go @@ -27,10 +27,10 @@ package main import ( "os" - "github.com/AliceO2Group/Control/common/logger/infologger" - "github.com/mesos/mesos-go/api/v1/lib/executor/config" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/executor" + "github.com/mesos/mesos-go/api/v1/lib/executor/config" "github.com/sirupsen/logrus" ) @@ -44,7 +44,6 @@ func init() { var log = logger.New(logrus.StandardLogger(), "executor") - // Entry point, reads configuration from environment variables. func main() { logrus.SetLevel(logrus.DebugLevel) @@ -55,5 +54,6 @@ func main() { } log.WithField("configuration", cfg).Debug("configuration loaded") executor.Run(cfg) + log.WithField("executorId", cfg.ExecutorID).Info("executor exiting") os.Exit(0) } From d45968070a0d283f46238fe0e05952fbbd851b5a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Apr 2023 17:16:57 +0200 Subject: [PATCH 1598/2352] [core] Complete product operation for UNDEPLOYABLE status --- core/task/status.go | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/core/task/status.go b/core/task/status.go index 5a015ca57..3bfb35353 100644 --- a/core/task/status.go +++ b/core/task/status.go @@ -37,28 +37,32 @@ const ( var ( STATUS_PRODUCT = map[Status]map[Status]Status{ UNDEFINED: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEFINED, - PARTIAL: UNDEFINED, - ACTIVE: UNDEFINED, + UNDEFINED: UNDEFINED, + INACTIVE: UNDEFINED, + PARTIAL: UNDEFINED, + ACTIVE: UNDEFINED, + UNDEPLOYABLE: UNDEFINED, }, INACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: INACTIVE, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, }, PARTIAL: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, }, ACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: ACTIVE, + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, }, UNDEPLOYABLE: { UNDEFINED: UNDEFINED, From 51299f244926a99e519ec8ffc797c206fc3c76fd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Apr 2023 17:17:48 +0200 Subject: [PATCH 1599/2352] [core] Incoming offers preprocessing for early failure --- core/task/scheduler.go | 1075 ++++++++++++++++++++++++---------------- 1 file changed, 646 insertions(+), 429 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 086a825e2..f172c026b 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -525,490 +525,483 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han descriptorConstraints := state.taskman.BuildDescriptorConstraints(descriptorsStillToDeploy) - // We protect the descriptors structures with a mutex, within the scope of the current offers round - descriptorsMu := sync.Mutex{} - utils.TimeTrack(timeGotDescriptors, "resourceOffers: descriptors channel receive to constraints built", log. WithField("descriptors", len(descriptorsStillToDeploy)). WithField("partition", envId.String())) - timeForOffers := time.Now() - - // NOTE: 1 offer per host - - // Parallelized offer processing - var offerWaitGroup sync.WaitGroup - offerWaitGroup.Add(len(offers)) - - for offerIndex, _ := range offers { - go func(offerIndex int) { - defer offerWaitGroup.Done() - - offer := offers[offerIndex] - - timeSingleOffer := time.Now() - var ( - remainingResourcesInOffer = mesos.Resources(offer.Resources) - taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(DeploymentMap) - targetExecutorId = mesos.ExecutorID{} - ) - - // If there are no executors provided by the offer, - // we start a new one by generating a new ID - if len(offer.ExecutorIDs) == 0 { - targetExecutorId.Value = uid.New().String() - log.WithField("executorId", targetExecutorId.Value). - WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Devel). - Info("received offer without executor ID, will start new executor if accepted") - } else { - targetExecutorId.Value = offer.ExecutorIDs[0].Value - if len(offer.ExecutorIDs) > 1 { - log.WithField("executorId", targetExecutorId.Value). - WithField("executorIds", offer.ExecutorIDs). - WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Devel). - Warn("received offer with more than one executor ID, will use first one") - } + timePreProcessing := time.Now() + + // Pre-processing: for each descriptorConstraint, if it includes a machine_id, means the descriptor can only + // match a single offer. If such a descriptorConstraint is unsatisfiable, we should bail out early without + // even trying to match it to an offer. + + // Here's where we accumulate descriptors that we know can only be matched to a single offer, provided the + // offer can satisfy constraints, which we don't know yet. + offerDescriptorsPrematchToDeploy := make(map[mesos.OfferID]Descriptors) + + // Each offer *must* have a machine_id, otherwise the O² system instance is broken at install time + offersByMachineId := make(map[string]mesos.Offer) + for _, offer := range offers { + machineIdAttr := "" + for _, attr := range offer.Attributes { + if attr.GetName() == "machine_id" { + machineIdAttr = attr.GetText().GetValue() + break } + } + if machineIdAttr != "" { + offersByMachineId[machineIdAttr] = offer + } + } - host := offer.GetHostname() - var detector string - detector, err = apricot.Instance().GetDetectorForHost(host) - if err != nil { - detector = "" + for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsStillToDeploy[i] + requiredMachineId := "" + for _, descriptorConstraint := range descriptorConstraints[descriptor] { + if descriptorConstraint.Attribute == "machine_id" { + requiredMachineId = descriptorConstraint.Value + break } - - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "offerId": offer.ID.Value, - "offerHost": host, - "resources": remainingResourcesInOffer.String(), - "partition": envId.String(), - "detector": detector, - }). - Debug("processing offer") - - remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) - - // avoid the expense of computing these if we can... - if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { - for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { - if resType == mesos.SCALAR { - sum, _ := name.Sum(remainingResourcesFlattened...) - state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) - } + } + if requiredMachineId != "" { + // We have a constraint on the machine_id, so we need to find an offer that matches it. + // If we don't find any, we can bail out early. + offer, found := offersByMachineId[requiredMachineId] + if found { + // We found an offer that matches the machine_id constraint, so we can add the descriptor to the + // pre-match list. It doesn't mean the offer can be accepted straight away, but it means that if + // the descriptor has any hope of being deployed, it will only be on this offer, provided other + // constraints and resources are satisfied. + if offerDescriptorsPrematchToDeploy[offer.ID] == nil { + offerDescriptorsPrematchToDeploy[offer.ID] = make(Descriptors, 0) } + offerDescriptorsPrematchToDeploy[offer.ID] = append(offerDescriptorsPrematchToDeploy[offer.ID], descriptor) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + } else { + // We have a constraint on the machine_id, but we didn't find any offer that matches it. + // We can bail out early. + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + log.WithField("partition", envId.String()). + WithField("descriptor", descriptor.TaskClassName). + Errorf("no resource offer for required host %s, deployment will be aborted", requiredMachineId) } + } + } + + utils.TimeTrack(timePreProcessing, "resourceOffers: constraints built to offers pre-processing done", log. + WithField("descriptors", len(descriptorsStillToDeploy)). + WithField("partition", envId.String())) + timeForOffers := time.Now() - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", detector). - Trace("state lock to process descriptors to deploy") + // We protect the descriptors structures with a mutex, within the scope of the current offers round, because + // concurrent stuff starts to happen here. + descriptorsMu := sync.Mutex{} - timeDescriptorsSection := time.Now() - descriptorsMu.Lock() + if len(descriptorsUndeployable) == 0 { // we still have hope to deploy something - // We iterate down over the descriptors, and we remove them as we match - FOR_DESCRIPTORS: - for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { - descriptor := descriptorsStillToDeploy[i] + // Parallelized offer processing, exhaustive search for each offer + var offerWaitGroup sync.WaitGroup + offerWaitGroup.Add(len(offers)) - varStackBottom := descriptor.TaskRole.GetUserVars() + for offerIndex, _ := range offers { + go func(offerIndex int) { + defer offerWaitGroup.Done() - descriptorDetector, ok := varStackBottom.Get("detector") - if !ok { - descriptorDetector = "" - } + offer := offers[offerIndex] - offerAttributes := constraint.Attributes(offer.Attributes) - if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "attributes": offerAttributes.String(), - }). - Trace("descriptor constraints not satisfied by offer attributes") - } - continue // next descriptor - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Debug("offer attributes satisfy constraints") - - // We write down the fact that one of the attributes matched is machine_id, therefore this task - // is bound to this and only this offer/machine - machineIdMatched := false - for _, constr := range descriptorConstraints[descriptor] { // for each constraint for this descriptor - if constr.Attribute == "machine_id" { - // enough to know that the machine_id attribute is required for this descriptor, - // because we're already in the "attributes matched" case - machineIdMatched = true - break + timeSingleOffer := time.Now() + var ( + remainingResourcesInOffer = mesos.Resources(offer.Resources) + taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) + tasksDeployedForCurrentOffer = make(DeploymentMap) + targetExecutorId = mesos.ExecutorID{} + ) + + // If there are no executors provided by the offer, + // we start a new one by generating a new ID + if len(offer.ExecutorIDs) == 0 { + targetExecutorId.Value = uid.New().String() + log.WithField("executorId", targetExecutorId.Value). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Devel). + Info("received offer without executor ID, will start new executor if accepted") + } else { + targetExecutorId.Value = offer.ExecutorIDs[0].Value + if len(offer.ExecutorIDs) == 1 { + log.WithField("executorId", targetExecutorId.Value). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Devel). + Warn("received offer with one executor ID, will use existing executor") + } else if len(offer.ExecutorIDs) > 1 { + log.WithField("executorId", targetExecutorId.Value). + WithField("executorIds", offer.ExecutorIDs). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Devel). + Warn("received offer with more than one executor ID, will use first one") } } - var wants *Wants - wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + host := offer.GetHostname() + var detector string + detector, err = apricot.Instance().GetDetectorForHost(host) if err != nil { - log.WithPrefix("scheduler"). - WithError(err). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "class": descriptor.TaskClassName, - "constraints": descriptor.RoleConstraints.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, - }). - Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") - continue // next descriptor + detector = "" } - if !Resources(remainingResourcesInOffer).Satisfy(wants) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, - }). - Warn("descriptor wants not satisfied by offer resources") + + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "offerId": offer.ID.Value, + "offerHost": host, + "resources": remainingResourcesInOffer.String(), + "partition": envId.String(), + "detector": detector, + }). + Debug("processing offer") + + remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) + + // avoid the expense of computing these if we can... + if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { + for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { + if resType == mesos.SCALAR { + sum, _ := name.Sum(remainingResourcesFlattened...) + state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) + } } + } - // Special case for machine_id attribute matching: if the machine_id was matched to the - // offer/machine but this offer doesn't satisfy resource wants, we bail early - if machineIdMatched { - // we know this descriptor will never be satisfiable, no point in continuing - descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) - descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", detector). + Trace("state lock to process descriptors to deploy") - break FOR_DESCRIPTORS - } + timeDescriptorsSection := time.Now() + descriptorsMu.Lock() - continue // next descriptor - } + descriptorsPrematchToDeploy, prematchedDescriptorsExistForThisOffer := offerDescriptorsPrematchToDeploy[offer.ID] + if prematchedDescriptorsExistForThisOffer { + FOR_PREMATCH_DESCRIPTORS: + for i := len(descriptorsPrematchToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsPrematchToDeploy[i] - // Point of no return, we start subtracting resources + varStackBottom := descriptor.TaskRole.GetUserVars() - bindMap := make(channel.BindMap) - for _, ch := range wants.InboundChannels { - if ch.Addressing == channel.IPC { - bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) - } else { - var availPorts mesos.Ranges - availPorts, ok = resources.Ports(remainingResourcesInOffer...) + descriptorDetector, ok := varStackBottom.Get("detector") if !ok { - continue FOR_DESCRIPTORS + descriptorDetector = "" } - // TODO: this can be optimized by excluding the base range outside the loop - availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) - port := availPorts.Min() - builder := resources.Build(). - Name(resources.Name("ports")). - Ranges(resources.BuildRanges().Span(port, port).Ranges) - remainingResourcesInOffer.Subtract(builder.Resource) - bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) - } - // global channel alias processing - if len(ch.Global) != 0 { - bindMap["::"+ch.Global] = bindMap[ch.Name] - } - } + offerAttributes := constraint.Attributes(offer.Attributes) + if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), + }). + Trace("descriptor constraints not satisfied by pre-matched offer attributes, descriptor undeployable") + } + + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + + break FOR_PREMATCH_DESCRIPTORS + } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Debug("pre-matched offer attributes satisfy constraints") + + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + if err != nil { + log.WithPrefix("scheduler"). + WithError(err). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Error("invalid task class: no task class or no resource demands for pre-matched descriptor, WILL NOT BE DEPLOYED") + + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + + break FOR_PREMATCH_DESCRIPTORS + } + if !Resources(remainingResourcesInOffer).Satisfy(wants) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Warn("descriptor wants not satisfied by pre-matched offer resources") + } + + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + + break FOR_PREMATCH_DESCRIPTORS + } - agentForCache := AgentCacheInfo{ - AgentId: offer.AgentID, - Attributes: offer.Attributes, - Hostname: offer.Hostname, - } - state.taskman.AgentCache.Update(agentForCache) //thread safe - machinesUsed[offer.Hostname] = struct{}{} + // Point of no return, we start subtracting resources + taskPtr, mesosTaskInfo := makeTaskForMesosResources( + state, + &offer, + descriptor, + wants, + remainingResourcesInOffer, + machinesUsed, + targetExecutorId, + envId, + descriptorDetector, + offerIDsToDecline, + ) + if taskPtr == nil || mesosTaskInfo == nil { + break FOR_PREMATCH_DESCRIPTORS + } - taskPtr := state.taskman.newTaskForMesosOffer(&offer, descriptor, bindMap, targetExecutorId) - if taskPtr == nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithField("offerId", offer.ID.Value). - Error("cannot get task for offer+descriptor, this should never happen") - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Trace("state unlock") - continue // next descriptor - } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, + "taskId": mesosTaskInfo.TaskID.Value, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + }).Debug("launching task") + + taskPtr.SendEvent(&event.TaskEvent{ + Name: taskPtr.GetName(), + TaskID: mesosTaskInfo.TaskID.Value, + State: "LAUNCHED", + Hostname: taskPtr.hostname, + ClassName: taskPtr.GetClassName(), + }) + + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + tasksDeployedForCurrentOffer[taskPtr] = descriptor - // Do not decline this offer - _, contains := offerIDsToDecline[offer.ID] - if contains { - delete(offerIDsToDecline, offer.ID) - } + } + } // end FOR_PREMATCH_DESCRIPTORS - // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize - err = taskPtr.BuildTaskCommand(descriptor.TaskRole) - if err != nil { - log.WithPrefix("scheduler"). - WithField("offerId", offer.ID.Value). - WithError(err). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Error("cannot build task command") - continue // next descriptor - } - cmd := taskPtr.GetTaskCommandInfo() + if len(descriptorsUndeployable) == 0 { // still hope of deploying something - // Claim the control port - availPorts, ok := resources.Ports(remainingResourcesInOffer...) - if !ok { - continue FOR_DESCRIPTORS - } - // The control port range starts at 47101 - // FIXME: make the control ports cutoff configurable - availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 29999}) - controlPort := availPorts.Min() - builder := resources.Build(). - Name(resources.Name("ports")). - Ranges(resources.BuildRanges().Span(controlPort, controlPort).Ranges) - remainingResourcesInOffer.Subtract(builder.Resource) - - // Append control port to arguments - // For the control port parameter and/or environment variable, see occ/OccGlobals.h - if cmd.ControlMode != controlmode.BASIC && - cmd.ControlMode != controlmode.HOOK { - cmd.ControlPort = controlPort - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) - } + // We iterate down over the descriptors, and we remove them as we match + FOR_DESCRIPTORS: + for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsStillToDeploy[i] - if cmd.ControlMode == controlmode.FAIRMQ { - cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) - } + varStackBottom := descriptor.TaskRole.GetUserVars() - // Convenience function that scans through cmd.Env and appends the - // given key-value pair if the given variable isn't already - // provided by the user. - fillEnvDefault := func(varName string, defaultValue string) { - varIsUserProvided := false - for _, envVar := range cmd.Env { - if strings.HasPrefix(envVar, varName) { - varIsUserProvided = true - break + descriptorDetector, ok := varStackBottom.Get("detector") + if !ok { + descriptorDetector = "" } - } - if !varIsUserProvided { - cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) - } - } - // Iterated call of the above function for the given kv-map of - // env var defaults - for varName, defaultValue := range map[string]string{ - "O2_ROLE": offer.Hostname, - "O2_SYSTEM": "FLP", - } { - fillEnvDefault(varName, defaultValue) - } + offerAttributes := constraint.Attributes(offer.Attributes) + if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), + }). + Trace("descriptor constraints not satisfied by offer attributes") + } + continue FOR_DESCRIPTORS // next descriptor + } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Debug("offer attributes satisfy constraints") + + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + if err != nil { + log.WithPrefix("scheduler"). + WithError(err). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") + continue FOR_DESCRIPTORS // next descriptor + } + if !Resources(remainingResourcesInOffer).Satisfy(wants) { + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Warn("descriptor wants not satisfied by offer resources") + } + continue FOR_DESCRIPTORS // next descriptor + } - runCommand := *cmd + // Point of no return, we start subtracting resources + taskPtr, mesosTaskInfo := makeTaskForMesosResources( + state, + &offer, + descriptor, + wants, + remainingResourcesInOffer, + machinesUsed, + targetExecutorId, + envId, + descriptorDetector, + offerIDsToDecline, + ) + if taskPtr == nil || mesosTaskInfo == nil { + continue FOR_DESCRIPTORS // next descriptor + } - // Serialize the actual command to be passed to the executor - var jsonCommand []byte - jsonCommand, err = json.Marshal(&runCommand) - if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "error": err.Error(), - "value": *runCommand.Value, - "args": runCommand.Arguments, - "shell": *runCommand.Shell, - "json": jsonCommand, - }). - Error("cannot serialize mesos.CommandInfo for executor") - - continue // next descriptor - } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, + "taskId": mesosTaskInfo.TaskID.Value, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + }).Debug("launching task") + + taskPtr.SendEvent(&event.TaskEvent{ + Name: taskPtr.GetName(), + TaskID: mesosTaskInfo.TaskID.Value, + State: "LAUNCHED", + Hostname: taskPtr.hostname, + ClassName: taskPtr.GetClassName(), + }) + + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + tasksDeployedForCurrentOffer[taskPtr] = descriptor - // Build resources request - resourcesRequest := make(mesos.Resources, 0) - resourcesRequest.Add1(resources.NewCPUs(wants.Cpu).Resource) - resourcesRequest.Add1(resources.NewMemory(wants.Memory).Resource) - portsBuilder := resources.BuildRanges() - for _, rng := range wants.StaticPorts { - portsBuilder = portsBuilder.Span(rng.Begin, rng.End) - } - for _, endpoint := range bindMap { - // We only add the endpoint to the portsBuilder if it has a port - if tcpEndpoint, ok := endpoint.(channel.TcpEndpoint); ok { - portsBuilder = portsBuilder.Span(tcpEndpoint.Port, tcpEndpoint.Port) - } + } // end FOR_DESCRIPTORS } - portsBuilder = portsBuilder.Span(controlPort, controlPort) + descriptorsMu.Unlock() - portRanges := portsBuilder.Ranges.Sort().Squash() - portsResources := resources.Build().Name(resources.Name("ports")).Ranges(portRanges) - resourcesRequest.Add1(portsResources.Resource) - - // Append executor resources to request - executorResources := mesos.Resources(state.executor.Resources) - log.WithPrefix("scheduler"). + utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithField("taskResources", resourcesRequest). - WithField("executorResources", executorResources). - Debug("creating Mesos task") - resourcesRequest.Add(executorResources...) - - newTaskId := taskPtr.GetTaskId() - - executor := state.executor - executor.ExecutorID.Value = taskPtr.GetExecutorId() - envIdS := envId.String() - - mesosTaskInfo := mesos.TaskInfo{ - Name: taskPtr.GetName(), - TaskID: mesos.TaskID{Value: newTaskId}, - AgentID: offer.AgentID, - Executor: executor, - Resources: resourcesRequest, - Data: jsonCommand, // this ends up in LAUNCH for the executor - Labels: &mesos.Labels{Labels: []mesos.Label{ - { - Key: "environmentId", - Value: &envIdS, - }, - { - Key: "detector", - Value: &detector, - }, - }}, - } - - // We must run the executor with a special LD_LIBRARY_PATH because - // its InfoLogger binding is built with GCC-Toolchain - ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") - mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} - if ok { - mesosTaskInfo.Executor.Command.Environment.Variables = - append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) - } + WithField("offerHost", host). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers))) + timeOfferAcceptance := time.Now() log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "name": mesosTaskInfo.Name, - "taskId": newTaskId, - "offerId": offer.ID.Value, - "executorId": state.executor.ExecutorID.Value, - }).Debug("launching task") - taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: newTaskId, State: "LAUNCHED", Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) - - taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, mesosTaskInfo) - descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) - tasksDeployedForCurrentOffer[taskPtr] = descriptor - } // end FOR_DESCRIPTORS - descriptorsMu.Unlock() - - utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. - WithField("partition", envId.String()). - WithField("offerHost", host). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers))) - timeOfferAcceptance := time.Now() - - log.WithPrefix("scheduler"). - WithField("offerHost", host). - WithField("detector", detector). - WithField("partition", envId.String()). - Trace("state unlock") - - // build ACCEPT call to launch all of the tasks we've assembled - accept := calls.Accept( - calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), - ).With(callOption) // handles refuseSeconds etc. - - // send ACCEPT call to mesos - err = calls.CallNoData(ctx, state.cli, accept) - if err != nil { - log.WithPrefix("scheduler"). + WithField("offerHost", host). WithField("detector", detector). WithField("partition", envId.String()). - WithField("error", err.Error()). - WithField("offerHost", host). - Error("failed to launch tasks") - // FIXME: we probably need to react to a failed ACCEPT here - } else { - if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { - tasksLaunchedThisCycle += n + Trace("state unlock") + + // build ACCEPT call to launch all of the tasks we've assembled + accept := calls.Accept( + calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), + ).With(callOption) // handles refuseSeconds etc. + + // send ACCEPT call to mesos + err = calls.CallNoData(ctx, state.cli, accept) + if err != nil { log.WithPrefix("scheduler"). - WithField("tasks", n). - WithField("partition", envId.String()). WithField("detector", detector). - WithField("level", infologger.IL_Support). - WithField("offerHost", offer.Hostname). - Infof("launch request sent to %s: %d tasks", offer.Hostname, n) - for _, taskInfo := range taskInfosToLaunchForCurrentOffer { + WithField("partition", envId.String()). + WithField("error", err.Error()). + WithField("offerHost", host). + Error("failed to launch tasks") + // FIXME: we probably need to react to a failed ACCEPT here + } else { + if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { + tasksLaunchedThisCycle += n log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "executorId": taskInfo.GetExecutor().ExecutorID.Value, - "executorName": taskInfo.GetExecutor().GetName(), - "agentId": taskInfo.GetAgentID().Value, - "taskId": taskInfo.GetTaskID().Value, - "level": infologger.IL_Devel, - }). - WithField("offerHost", offer.Hostname). + WithField("tasks", n). WithField("partition", envId.String()). WithField("detector", detector). - Debug("task launch requested") - } + WithField("level", infologger.IL_Support). + WithField("offerHost", offer.Hostname). + Infof("launch request sent to %s: %d tasks", offer.Hostname, n) + for _, taskInfo := range taskInfosToLaunchForCurrentOffer { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "executorId": taskInfo.GetExecutor().ExecutorID.Value, + "executorName": taskInfo.GetExecutor().GetName(), + "agentId": taskInfo.GetAgentID().Value, + "taskId": taskInfo.GetTaskID().Value, + "level": infologger.IL_Devel, + }). + WithField("offerHost", offer.Hostname). + WithField("partition", envId.String()). + WithField("detector", detector). + Debug("task launch requested") + } - // update deployment map - for k, v := range tasksDeployedForCurrentOffer { - tasksDeployed[k] = v + // update deployment map + for k, v := range tasksDeployedForCurrentOffer { + tasksDeployed[k] = v + } + } else { + offersDeclined++ } - } else { - offersDeclined++ } - } - utils.TimeTrack(timeOfferAcceptance, "resourceOffers: single offer acceptance section", log. - WithField("partition", envId.String()). - WithField("detector", detector). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers)). - WithField("offerHost", offer.Hostname)) - - utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. - WithField("partition", envId.String()). - WithField("detector", detector). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers)). - WithField("offerHost", offer.Hostname)) - - }(offerIndex) // end for offer closure - } // end for _, offer := range offers - offerWaitGroup.Wait() - - utils.TimeTrack(timeForOffers, "resourceOffers: constraints built to for_offers done (concurrent)", log. + utils.TimeTrack(timeOfferAcceptance, "resourceOffers: single offer acceptance section", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) + + utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) + + }(offerIndex) // end for offer closure + } // end for _, offer := range offers + offerWaitGroup.Wait() + + } + + utils.TimeTrack(timeForOffers, "resourceOffers: pre-processing done to for_offers done (concurrent)", log. WithField("partition", envId.String()). WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers)). @@ -1303,3 +1296,227 @@ func logCalls(messages map[scheduler.Call_Type]string) callrules.Rule { return ch(ctx, c, r, err) } } + +func makeTaskForMesosResources( + state *schedulerState, + offer *mesos.Offer, + descriptor *Descriptor, + wants *Wants, + remainingResourcesInOffer mesos.Resources, + machinesUsed map[string]struct{}, + targetExecutorId mesos.ExecutorID, + envId uid.ID, + descriptorDetector string, + offerIDsToDecline map[mesos.OfferID]struct{}, +) (*Task, *mesos.TaskInfo) { + + bindMap := make(channel.BindMap) + for _, ch := range wants.InboundChannels { + if ch.Addressing == channel.IPC { + bindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) + } else { + var availPorts mesos.Ranges + var ok bool + availPorts, ok = resources.Ports(remainingResourcesInOffer...) + if !ok { + return nil, nil + } + // TODO: this can be optimized by excluding the base range outside the loop + availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 8999}) + port := availPorts.Min() + builder := resources.Build(). + Name(resources.Name("ports")). + Ranges(resources.BuildRanges().Span(port, port).Ranges) + remainingResourcesInOffer.Subtract(builder.Resource) + bindMap[ch.Name] = channel.NewBoundTcpEndpoint(port, ch.Transport) + } + + // global channel alias processing + if len(ch.Global) != 0 { + bindMap["::"+ch.Global] = bindMap[ch.Name] + } + } + + agentForCache := AgentCacheInfo{ + AgentId: offer.AgentID, + Attributes: offer.Attributes, + Hostname: offer.Hostname, + } + state.taskman.AgentCache.Update(agentForCache) //thread safe + machinesUsed[offer.Hostname] = struct{}{} + + taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) + if taskPtr == nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithField("offerId", offer.ID.Value). + Error("cannot get task for offer+descriptor, this should never happen") + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Trace("state unlock") + return nil, nil + } + + // Do not decline this offer + _, contains := offerIDsToDecline[offer.ID] + if contains { + delete(offerIDsToDecline, offer.ID) + } + + // Build the O² process to run as a mesos.CommandInfo, which we'll then JSON-serialize + err := taskPtr.BuildTaskCommand(descriptor.TaskRole) + if err != nil { + log.WithPrefix("scheduler"). + WithField("offerId", offer.ID.Value). + WithError(err). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Error("cannot build task command") + return nil, nil + } + cmd := taskPtr.GetTaskCommandInfo() + + // Claim the control port + availPorts, ok := resources.Ports(remainingResourcesInOffer...) + if !ok { + return nil, nil + } + // The control port range starts at 47101 + // FIXME: make the control ports cutoff configurable + availPorts = availPorts.Remove(mesos.Value_Range{Begin: 0, End: 29999}) + controlPort := availPorts.Min() + builder := resources.Build(). + Name(resources.Name("ports")). + Ranges(resources.BuildRanges().Span(controlPort, controlPort).Ranges) + remainingResourcesInOffer.Subtract(builder.Resource) + + // Append control port to arguments + // For the control port parameter and/or environment variable, see occ/OccGlobals.h + if cmd.ControlMode != controlmode.BASIC && + cmd.ControlMode != controlmode.HOOK { + cmd.ControlPort = controlPort + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) + } + + if cmd.ControlMode == controlmode.FAIRMQ { + cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) + } + + // Convenience function that scans through cmd.Env and appends the + // given key-value pair if the given variable isn't already + // provided by the user. + fillEnvDefault := func(varName string, defaultValue string) { + varIsUserProvided := false + for _, envVar := range cmd.Env { + if strings.HasPrefix(envVar, varName) { + varIsUserProvided = true + break + } + } + if !varIsUserProvided { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) + } + } + + // Iterated call of the above function for the given kv-map of + // env var defaults + for varName, defaultValue := range map[string]string{ + "O2_ROLE": offer.Hostname, + "O2_SYSTEM": "FLP", + } { + fillEnvDefault(varName, defaultValue) + } + + runCommand := *cmd + + // Serialize the actual command to be passed to the executor + var jsonCommand []byte + jsonCommand, err = json.Marshal(&runCommand) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "error": err.Error(), + "value": *runCommand.Value, + "args": runCommand.Arguments, + "shell": *runCommand.Shell, + "json": jsonCommand, + }). + Error("cannot serialize mesos.CommandInfo for executor") + + return nil, nil + } + + // Build resources request + resourcesRequest := make(mesos.Resources, 0) + resourcesRequest.Add1(resources.NewCPUs(wants.Cpu).Resource) + resourcesRequest.Add1(resources.NewMemory(wants.Memory).Resource) + portsBuilder := resources.BuildRanges() + for _, rng := range wants.StaticPorts { + portsBuilder = portsBuilder.Span(rng.Begin, rng.End) + } + for _, endpoint := range bindMap { + // We only add the endpoint to the portsBuilder if it has a port + if tcpEndpoint, endpointOk := endpoint.(channel.TcpEndpoint); endpointOk { + portsBuilder = portsBuilder.Span(tcpEndpoint.Port, tcpEndpoint.Port) + } + } + portsBuilder = portsBuilder.Span(controlPort, controlPort) + + portRanges := portsBuilder.Ranges.Sort().Squash() + portsResources := resources.Build().Name(resources.Name("ports")).Ranges(portRanges) + resourcesRequest.Add1(portsResources.Resource) + + // Append executor resources to request + executorResources := mesos.Resources(state.executor.Resources) + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithField("taskResources", resourcesRequest). + WithField("executorResources", executorResources). + Debug("creating Mesos task") + resourcesRequest.Add(executorResources...) + + newTaskId := taskPtr.GetTaskId() + + executor := state.executor + executor.ExecutorID.Value = taskPtr.GetExecutorId() + envIdS := envId.String() + + mesosTaskInfo := mesos.TaskInfo{ + Name: taskPtr.GetName(), + TaskID: mesos.TaskID{Value: newTaskId}, + AgentID: offer.AgentID, + Executor: executor, + Resources: resourcesRequest, + Data: jsonCommand, // this ends up in LAUNCH for the executor + Labels: &mesos.Labels{Labels: []mesos.Label{ + { + Key: "environmentId", + Value: &envIdS, + }, + { + Key: "detector", + Value: &descriptorDetector, + }, + }}, + } + + // We must run the executor with a special LD_LIBRARY_PATH because + // its InfoLogger binding is built with GCC-Toolchain + ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") + mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} + if ok { + mesosTaskInfo.Executor.Command.Environment.Variables = + append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) + } + + return taskPtr, &mesosTaskInfo +} From 4fbd3fbcd5b914b50517107a9ee34213d632b206 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Apr 2023 18:29:52 +0200 Subject: [PATCH 1600/2352] [build] Bump to v0.65.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4dba8ab73..94db200ea 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 64 -VERSION_PATCH := 2 +VERSION_MINOR := 65 +VERSION_PATCH := 0 From 4b8edba91ef42287ad7f9f1f5d65d8df8ae3a00a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 24 Apr 2023 15:59:19 +0200 Subject: [PATCH 1601/2352] [executor] Notify InfoLogger on task END_OF_STREAM event --- executor/executable/controllabletask.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 179ae8fcf..0e87e8125 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -524,6 +524,17 @@ func (t *ControllableTask) Launch() error { WithField("detector", t.knownDetector). Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break + } else { + if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { + taskId := deo.TaskId.Value + + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", taskId). + WithField("taskName", t.ti.Name). + WithField("taskPid", t.knownPid). + Debug("END_OF_STREAM DeviceEvent received - notifying environment") + } } deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) From 4eaaac2e71eb61174143f7f1c9441744dd287797 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 24 Apr 2023 16:27:30 +0200 Subject: [PATCH 1602/2352] [core] Perform cleanup right before environment deployment --- core/environment/manager.go | 42 ++++++++++++++++++++++++++++++++----- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index d8de5eaf5..b738ce34a 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -27,6 +27,11 @@ package environment import ( "errors" "fmt" + "strconv" + "strings" + "sync" + "time" + "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" @@ -40,10 +45,6 @@ import ( "github.com/AliceO2Group/Control/core/workflow" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" - "strconv" - "strings" - "sync" - "time" ) type Manager struct { @@ -177,7 +178,31 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } } - env, err := newEnvironment(envUserVars) + cleanedUpTasks, runningTasks, err := envs.taskman.Cleanup() + if err != nil { + log.WithError(err). + Warnf("pre-deployment cleanup failed, continuing anyway") + err = nil + } else { + cleanedUpTaskIds, runningTaskIds := make([]string, 0), make([]string, 0) + for _, t := range cleanedUpTasks { + cleanedUpTaskIds = append(cleanedUpTaskIds, fmt.Sprintf("%s.%s#%s", t.GetHostname(), t.GetClassName(), t.GetTaskId())) + } + for _, t := range runningTasks { + runningTaskIds = append(runningTaskIds, fmt.Sprintf("%s.%s#%s", t.GetHostname(), t.GetClassName(), t.GetTaskId())) + } + log.WithField("tasksCleanedUp", strings.Join(cleanedUpTaskIds, ", ")). + WithField("level", infologger.IL_Devel). + Debug("tasks cleaned up during pre-deployment cleanup") + log.WithField("tasksStillRunning", strings.Join(runningTaskIds, ", ")). + WithField("level", infologger.IL_Devel). + Debug("tasks still running after pre-deployment cleanup") + log.WithField("level", infologger.IL_Ops). + Infof("pre-deployment cleanup completed (%d tasks cleaned up, %d tasks still running)", len(cleanedUpTasks), len(runningTasks)) + } + + var env *Environment + env, err = newEnvironment(envUserVars) newEnvId := uid.NilID() if err == nil { if env != nil { @@ -635,6 +660,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if t == nil { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("taskId", taskId.Value). Debug("cannot find task for DeviceEvent END_OF_STREAM") return } @@ -642,9 +668,15 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if err != nil { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("taskId", taskId.Value). WithError(err). Error("cannot find environment for DeviceEvent") } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + WithField("envState", env.CurrentState()). + Debug("received END_OF_STREAM event from task, trying to stop the run") if env.CurrentState() == "RUNNING" { t.SetSafeToStop(true) // we mark this specific task as ok to STOP go func() { From fd9de4e67617d9caae97876d3da329ce8973458a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 25 Apr 2023 13:46:25 +0200 Subject: [PATCH 1603/2352] [build] Bump to v0.65.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 94db200ea..6d32c1069 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 65 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 7c52513b4bd9275998edf04741f67e0be5fb12ed Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 2 May 2023 10:07:46 +0200 Subject: [PATCH 1604/2352] [core] Prevent rare crash in resourceOffers tasksDeployed access --- core/task/scheduler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index f172c026b..c03f9723b 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -500,6 +500,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } tasksDeployed := make(DeploymentMap) + tasksDeployedMutex := sync.Mutex{} // list of descriptors that we find impossible to deploy due to wants/constraints descriptorsUndeployable := make(Descriptors, 0) @@ -971,10 +972,12 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han Debug("task launch requested") } + tasksDeployedMutex.Lock() // update deployment map for k, v := range tasksDeployedForCurrentOffer { tasksDeployed[k] = v } + tasksDeployedMutex.Unlock() } else { offersDeclined++ } From e0ec392992aea586d615b304adf33fcc85c12f92 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 3 May 2023 11:58:56 +0200 Subject: [PATCH 1605/2352] [core] Bail early if a critical error occurs in a transition step --- core/environment/environment.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index ea8cfaad2..9bccb96fd 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -391,13 +391,26 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err // PHASE 4: collect any errors + thereAreCriticalErrors := false // We merge hook call errors and hook task errors into a single map for // critical trait processing for hook, err := range callErrors { allErrors[hook] = err + if hook.GetTraits().Critical { + thereAreCriticalErrors = true + } } for hook, err := range taskErrors { allErrors[hook] = err + if hook.GetTraits().Critical { + thereAreCriticalErrors = true + } + } + + if thereAreCriticalErrors { + break + // if at least one critical error occurred, we stop processing hooks for the current trigger beyond the + // current weight step } } From 9a5792105b996d5f79a0408c9d6f41b2a599a0ec Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 May 2023 09:37:08 +0200 Subject: [PATCH 1606/2352] [core] Prevent crash in Kafka plugin concurrent map access --- core/integration/kafka/plugin.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index e42118657..7cd1b230b 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -29,12 +29,14 @@ package kafka import ( "context" "encoding/json" - "github.com/AliceO2Group/Control/common/logger/infologger" "net/url" "strconv" "strings" + "sync" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" @@ -49,9 +51,10 @@ import ( var log = logger.New(logrus.StandardLogger(), "kafkaclient") type Plugin struct { - endpoint string - kafkaWriter *kafka.Writer - envsInRunning map[string]*kafkapb.EnvInfo // env id is the key + endpoint string + kafkaWriter *kafka.Writer + envsInRunning map[string]*kafkapb.EnvInfo // env id is the key + envsInRunningMutex sync.RWMutex } func NewPlugin(endpoint string) integration.Plugin { @@ -275,6 +278,8 @@ func (p *Plugin) newEnvStateObject(varStack map[string]string, call string) *kaf } func (p *Plugin) UpdateRunningEnvList(envInfo *kafkapb.EnvInfo) { + p.envsInRunningMutex.Lock() + defer p.envsInRunningMutex.Unlock() if envInfo.State == "RUNNING" { p.envsInRunning[envInfo.EnvironmentId] = envInfo } else { @@ -284,6 +289,8 @@ func (p *Plugin) UpdateRunningEnvList(envInfo *kafkapb.EnvInfo) { func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { var array []*kafkapb.EnvInfo + p.envsInRunningMutex.RLock() + defer p.envsInRunningMutex.RUnlock() for _, v := range p.envsInRunning { array = append(array, v) } From 57c6c0d3273ffa28db0c05a9c268281862ea5e2c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 May 2023 10:38:20 +0200 Subject: [PATCH 1607/2352] [core] Add pdp_epn_shm_sizes param to ODC plugin --- core/integration/odc/plugin.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 0cae615ee..2cbbf6ffe 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -340,7 +340,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[str pdpWorkflowParams string pdpRawDecoderMultiFactor, pdpCtfEncoderMultiFactor, pdpRecoProcessMultiFactor string pdpWipeWorkflowCache, pdpBeamType, pdpNHbfPerTf string - pdpExtraEnvVars, pdpGeneratorScriptPath string + pdpExtraEnvVars, pdpEpnShmSizes, pdpGeneratorScriptPath string odcNEpns string ok bool accumulator []string @@ -653,6 +653,15 @@ func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[str } accumulator = append(accumulator, strings.TrimSpace(pdpExtraEnvVars)) + pdpEpnShmSizes, ok = varStack["pdp_epn_shm_sizes"] + if !ok { + log.WithField("partition", envId). + WithField("call", "GenerateEPNWorkflowScript"). + Error("cannot acquire PDP EPN SHM sizes") + return + } + accumulator = append(accumulator, strings.TrimSpace(pdpEpnShmSizes)) + pdpGeneratorScriptPath, ok = varStack["pdp_generator_script_path"] if !ok { log.WithField("partition", envId). From dcbdd5446145d34e2a97dc082f5e8e38dbb25324 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 May 2023 10:50:39 +0200 Subject: [PATCH 1608/2352] [apricot] PEDESTALS is now PEDESTAL --- apricot/protos/apricot.pb.go | 274 +++++++++++++++++------------------ apricot/protos/apricot.proto | 2 +- 2 files changed, 138 insertions(+), 138 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index ecd1e10eb..58720276c 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -49,7 +49,7 @@ const ( RunType_NULL RunType = 0 RunType_PHYSICS RunType = 1 RunType_TECHNICAL RunType = 2 - RunType_PEDESTALS RunType = 3 + RunType_PEDESTAL RunType = 3 RunType_PULSER RunType = 4 RunType_LASER RunType = 5 RunType_CALIBRATION_ITHR_TUNING RunType = 6 @@ -74,7 +74,7 @@ var ( 0: "NULL", 1: "PHYSICS", 2: "TECHNICAL", - 3: "PEDESTALS", + 3: "PEDESTAL", 4: "PULSER", 5: "LASER", 6: "CALIBRATION_ITHR_TUNING", @@ -96,7 +96,7 @@ var ( "NULL": 0, "PHYSICS": 1, "TECHNICAL": 2, - "PEDESTALS": 3, + "PEDESTAL": 3, "PULSER": 4, "LASER": 5, "CALIBRATION_ITHR_TUNING": 6, @@ -1885,145 +1885,145 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x2a, 0x97, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, + 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, - 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, - 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, - 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, - 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, - 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, - 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, - 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, - 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, - 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, - 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, - 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, - 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, - 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, - 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, - 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, + 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, + 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, + 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, + 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, + 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, + 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, + 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, + 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, + 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, + 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, + 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, + 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, - 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, - 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, + 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, + 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, - 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, - 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, - 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, - 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, - 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, - 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, + 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, + 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, + 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index a8802cc0a..dc8f40fc8 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -67,7 +67,7 @@ enum RunType { NULL = 0; PHYSICS = 1; TECHNICAL = 2; - PEDESTALS = 3; + PEDESTAL = 3; PULSER = 4; LASER = 5; CALIBRATION_ITHR_TUNING = 6; From 6d2877ba5aeb6f5f3d0fe5572fb52ed7af7aa0a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 4 May 2023 10:54:01 +0200 Subject: [PATCH 1609/2352] [build] Bump to v0.66.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 6d32c1069..f41098055 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 65 -VERSION_PATCH := 1 +VERSION_MINOR := 66 +VERSION_PATCH := 0 From 902a821975e94239d4056c9a20ea53e5f2bdade5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 5 May 2023 20:53:56 +0200 Subject: [PATCH 1610/2352] [occ] Push TASK_INTERNAL_ERROR event --- occ/occlib/OccServer.cxx | 5 +++++ occ/plugin/litestructs/EventStream.h | 3 ++- occ/protos/occ.proto | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 1b5b61fbe..25ca1f1c8 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -441,6 +441,11 @@ void OccServer::runChecker() int err = m_rco->iterateCheck(); if (err) { updateState(t_State::error); + // the above publishes a state change event to the StateStream, but we also push an exception event on the + // EventStream because the transition was initiated by the task + auto taskErrorEvent = new pb::DeviceEvent; + taskErrorEvent->set_type(pb::TASK_INTERNAL_ERROR); + pushEvent(taskErrorEvent); } m_mu.unlock(); diff --git a/occ/plugin/litestructs/EventStream.h b/occ/plugin/litestructs/EventStream.h index 59e10e575..1d3e19c74 100644 --- a/occ/plugin/litestructs/EventStream.h +++ b/occ/plugin/litestructs/EventStream.h @@ -48,7 +48,8 @@ struct EventStreamRequest : public JsonMessage enum DeviceEventType : unsigned { NULL_DEVICE_EVENT = 0, END_OF_STREAM = 1, - BASIC_TASK_TERMINATED = 2 + BASIC_TASK_TERMINATED = 2, + TASK_INTERNAL_ERROR = 3 }; struct DeviceEvent : public JsonMessage diff --git a/occ/protos/occ.proto b/occ/protos/occ.proto index eba3b0ff9..2b0fbc09a 100644 --- a/occ/protos/occ.proto +++ b/occ/protos/occ.proto @@ -54,6 +54,7 @@ enum DeviceEventType { NULL_DEVICE_EVENT = 0; END_OF_STREAM = 1; BASIC_TASK_TERMINATED = 2; + TASK_INTERNAL_ERROR = 3; } message StateStreamRequest {} From cc0cadc8014bb315618d86f4d1c2957443456b08 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 May 2023 15:31:09 +0200 Subject: [PATCH 1611/2352] [executor] Support TASK_INTERNAL_ERROR event --- executor/executable/controllabletask.go | 11 ++++- executor/protos/occ.pb.go | 55 ++++++++++++++----------- executor/protos/occ_grpc.pb.go | 2 +- 3 files changed, 40 insertions(+), 28 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 0e87e8125..8c4754a25 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -525,15 +525,22 @@ func (t *ControllableTask) Launch() error { Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } else { - if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { - taskId := deo.TaskId.Value + taskId := deo.TaskId.Value + if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithField("taskId", taskId). WithField("taskName", t.ti.Name). WithField("taskPid", t.knownPid). Debug("END_OF_STREAM DeviceEvent received - notifying environment") + } else if ev.GetType() == pb.DeviceEventType_TASK_INTERNAL_ERROR { + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("taskId", taskId). + WithField("taskName", t.ti.Name). + WithField("taskPid", t.knownPid). + Warningf("task %s transitioned to ERROR on its own - notifying environment", deo.TaskId.String()) } } deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index 7eff90bb9..af1f237cc 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.12 // source: protos/occ.proto package pb @@ -144,6 +144,7 @@ const ( DeviceEventType_NULL_DEVICE_EVENT DeviceEventType = 0 DeviceEventType_END_OF_STREAM DeviceEventType = 1 DeviceEventType_BASIC_TASK_TERMINATED DeviceEventType = 2 + DeviceEventType_TASK_INTERNAL_ERROR DeviceEventType = 3 ) // Enum value maps for DeviceEventType. @@ -152,11 +153,13 @@ var ( 0: "NULL_DEVICE_EVENT", 1: "END_OF_STREAM", 2: "BASIC_TASK_TERMINATED", + 3: "TASK_INTERNAL_ERROR", } DeviceEventType_value = map[string]int32{ "NULL_DEVICE_EVENT": 0, "END_OF_STREAM": 1, "BASIC_TASK_TERMINATED": 2, + "TASK_INTERNAL_ERROR": 3, } ) @@ -749,35 +752,37 @@ var file_protos_occ_proto_rawDesc = []byte{ 0x53, 0x74, 0x61, 0x74, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4d, 0x45, 0x44, 0x49, 0x41, 0x54, - 0x45, 0x10, 0x01, 0x2a, 0x56, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x45, 0x10, 0x01, 0x2a, 0x6f, 0x0a, 0x0f, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4e, 0x44, 0x5f, 0x4f, 0x46, 0x5f, 0x53, 0x54, 0x52, 0x45, 0x41, 0x4d, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x41, 0x53, 0x49, 0x43, 0x5f, 0x54, 0x41, 0x53, 0x4b, 0x5f, 0x54, - 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x32, 0x99, 0x02, 0x0a, 0x03, - 0x4f, 0x63, 0x63, 0x12, 0x47, 0x0a, 0x0b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x0b, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, - 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x45, 0x52, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x54, + 0x41, 0x53, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x03, 0x32, 0x99, 0x02, 0x0a, 0x03, 0x4f, 0x63, 0x63, 0x12, 0x47, 0x0a, 0x0b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, + 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6f, 0x63, 0x63, - 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x4d, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x6f, 0x63, 0x63, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x47, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1a, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x6f, 0x63, 0x63, + 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0a, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x6f, 0x63, 0x63, + 0x5f, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x63, 0x63, 0x5f, 0x70, 0x62, 0x2e, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x42, 0x4d, 0x0a, 0x1c, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x6f, 0x63, 0x63, + 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, + 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2f, 0x6f, 0x63, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index f9e8fa494..162ad4479 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.12 // source: protos/occ.proto package pb From 8f5de79a91a53f891b62a27346d0df3e2648b0d3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 May 2023 15:47:39 +0200 Subject: [PATCH 1612/2352] [core] React to TASK_INTERNAL_ERROR with STOP_ACTIVITY attempt --- core/environment/manager.go | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index b738ce34a..fa3eea5f3 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -691,6 +691,45 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } }() } + + case pb.DeviceEventType_TASK_INTERNAL_ERROR: + // a task has already internally transitioned to ERROR state + taskId := evt.GetOrigin().TaskId + t := envs.taskman.GetTask(taskId.Value) + if t == nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + Debug("cannot find task for DeviceEvent TASK_INTERNAL_ERROR") + return + } + env, err := envs.environment(t.GetEnvironmentId()) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + WithError(err). + Error("cannot find environment for DeviceEvent") + } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + WithField("taskRole", t.GetParentRolePath()). + WithField("envState", env.CurrentState()). + Debug("received TASK_INTERNAL_ERROR event from task, trying to stop the run") + if env.CurrentState() == "RUNNING" { + go func() { + t.GetParent().UpdateState(task.ERROR) + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot stop run after END_OF_STREAM event") + } + }() + } + } } From 30ca2f56f8752e7a975cef48ceab7e01a598193d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 May 2023 12:01:25 +0200 Subject: [PATCH 1613/2352] [core] Build TaskInternalError event --- common/event/deviceevent.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/common/event/deviceevent.go b/common/event/deviceevent.go index 2dab19aee..a496745ae 100644 --- a/common/event/deviceevent.go +++ b/common/event/deviceevent.go @@ -80,6 +80,14 @@ func NewDeviceEvent(origin DeviceEventOrigin, t pb.DeviceEventType) (de DeviceEv Origin: origin, }, } + case pb.DeviceEventType_TASK_INTERNAL_ERROR: + de = &TaskInternalError{ + DeviceEventBase: DeviceEventBase{ + eventBase: *newDeviceEventBase("DeviceEvent", nil), + Type: t, + Origin: origin, + }, + } case pb.DeviceEventType_NULL_DEVICE_EVENT: de = nil } @@ -106,3 +114,11 @@ type BasicTaskTerminated struct { func (e *BasicTaskTerminated) GetName() string { return "BASIC_TASK_TERMINATED" } + +type TaskInternalError struct { + DeviceEventBase +} + +func (e *TaskInternalError) GetName() string { + return "TASK_INTERNAL_ERROR" +} From fc21f36d553e45c00d19c0d089ee48a03e047b41 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 May 2023 15:07:56 +0200 Subject: [PATCH 1614/2352] [occ] Only emit task internal error event once --- occ/occlib/OccServer.cxx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 25ca1f1c8..fd0208a0e 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -439,8 +439,10 @@ void OccServer::runChecker() // execute periodic check, in any state int err = m_rco->iterateCheck(); - if (err) { + // if there's an error but the SM hasn't been moved to t_State::error yet + if (err && (m_rco->getState() != t_State::error)) { updateState(t_State::error); + // the above publishes a state change event to the StateStream, but we also push an exception event on the // EventStream because the transition was initiated by the task auto taskErrorEvent = new pb::DeviceEvent; From ae9790ee14fa849d7c8a94405734d6cc39c8a2bb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 15 May 2023 15:25:36 +0200 Subject: [PATCH 1615/2352] [build] Bump to v0.67.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f41098055..9f31dda45 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 66 +VERSION_MINOR := 67 VERSION_PATCH := 0 From 3ea8b630a1665e68d0b72bc52e056c26d2030386 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 17 May 2023 11:49:33 +0200 Subject: [PATCH 1616/2352] [core] do not complain when ccdb plugin cannot get a run number Now it is perfectly legal to not be able to acquire a run number, since the plugin is called also at GO_ERROR and DESTROY, which might not necessarily happen while in RUNNING. --- core/integration/ccdb/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index c36a20eaf..97cbd5638 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -117,7 +117,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { if !ok { log.WithField("level", infologger.IL_Support). WithField("partition", envId). - Error("cannot acquire run number for GRP object") + Debug("cannot acquire run number for GRP object") return nil } runNumber, err := strconv.ParseUint(runNumberStr, 10, 32) From 199f07cf129561150e4a08a0c1adfcea2d9514d9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 19 May 2023 15:01:14 +0200 Subject: [PATCH 1617/2352] [core] Increase CONFIGURE transition timeout to 120s --- core/task/manager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/task/manager.go b/core/task/manager.go index dfea08895..d59602f7e 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -685,6 +685,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { Debug("pushing configuration to tasks") cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, event, dest, args) + cmd.ResponseTimeout = 120 * time.Second // The default timeout is 90 seconds, but we need more time for the tasks to configure _ = m.cq.Enqueue(cmd, notify) response := <-notify From 9caaa6e51d649cedc55965f836996ccf628100a1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 25 May 2023 09:58:33 +0200 Subject: [PATCH 1618/2352] [build] Bump to v0.67.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9f31dda45..2d19af9fa 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 67 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 4bf31608a6f8938895827eaaee5b312a307aca91 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 May 2023 12:54:14 +0200 Subject: [PATCH 1619/2352] [core] Fix crash caused by map contention in Bookkeeping plugin --- core/integration/bookkeeping/plugin.go | 63 ++++++++++++++++---------- 1 file changed, 39 insertions(+), 24 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index de1c2af3e..65571195f 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -39,6 +39,7 @@ import ( "net/url" "strconv" "strings" + "sync" "time" bkpb "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos" @@ -66,12 +67,13 @@ type Plugin struct { // Indicators linked to each ongoing environment that give some plugin-specific // data about the status of the current run (of that environment) - missingUpdateRunStarts map[string] /*envId*/ bool - pendingRunStops map[string] /*envId*/ int64 - pendingO2Starts map[string] /*envId*/ bool - pendingO2Stops map[string] /*envId*/ bool - pendingTrgStarts map[string] /*envId*/ bool - pendingTrgStops map[string] /*envId*/ bool + missingUpdateRunStarts map[string] /*envId*/ bool + missingUpdateRunStartsMu sync.Mutex + pendingRunStops map[string] /*envId*/ int64 + pendingO2Starts map[string] /*envId*/ bool + pendingO2Stops map[string] /*envId*/ bool + pendingTrgStarts map[string] /*envId*/ bool + pendingTrgStops map[string] /*envId*/ bool } /**********************************************/ @@ -120,7 +122,10 @@ func (p *Plugin) GetConnectionState() string { /*******************************************************/ // Utility methods for GetData and GetEnvironmentsData // /*******************************************************/ -func (p *Plugin) missingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { +func (p *Plugin) getMissingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + p.missingUpdateRunStartsMu.Lock() + defer p.missingUpdateRunStartsMu.Unlock() + if p.missingUpdateRunStarts == nil { return nil } @@ -135,7 +140,7 @@ func (p *Plugin) missingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bool return out } -func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { +func (p *Plugin) getPendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { if p.pendingRunStops == nil { return nil } @@ -150,7 +155,7 @@ func (p *Plugin) pendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { return out } -func (p *Plugin) pendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { +func (p *Plugin) getPendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingO2Starts == nil { return nil } @@ -165,7 +170,7 @@ func (p *Plugin) pendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { return out } -func (p *Plugin) pendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { +func (p *Plugin) getPendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingO2Stops == nil { return nil } @@ -180,7 +185,7 @@ func (p *Plugin) pendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { return out } -func (p *Plugin) pendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { +func (p *Plugin) getPendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingTrgStarts == nil { return nil } @@ -195,7 +200,7 @@ func (p *Plugin) pendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { return out } -func (p *Plugin) pendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { +func (p *Plugin) getPendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { if p.pendingTrgStops == nil { return nil } @@ -223,12 +228,12 @@ func (p *Plugin) GetData(_ []any) string { envIds := environment.ManagerInstance().Ids() outMap := make(map[string]interface{}) - outMap["missingUpdateRunStarts"] = p.missingUpdateRunStartsForEnvs(envIds) - outMap["pendingRunStops"] = p.pendingRunStopsForEnvs(envIds) - outMap["pendingO2Starts"] = p.pendingO2StartsForEnvs(envIds) - outMap["pendingO2Stops"] = p.pendingO2StopsForEnvs(envIds) - outMap["pendingTrgStarts"] = p.pendingTrgStartsForEnvs(envIds) - outMap["pendingTrgStops"] = p.pendingTrgStopsForEnvs(envIds) + outMap["missingUpdateRunStarts"] = p.getMissingUpdateRunStartsForEnvs(envIds) + outMap["pendingRunStops"] = p.getPendingRunStopsForEnvs(envIds) + outMap["pendingO2Starts"] = p.getPendingO2StartsForEnvs(envIds) + outMap["pendingO2Stops"] = p.getPendingO2StopsForEnvs(envIds) + outMap["pendingTrgStarts"] = p.getPendingTrgStartsForEnvs(envIds) + outMap["pendingTrgStops"] = p.getPendingTrgStopsForEnvs(envIds) out, err := json.Marshal(outMap) if err != nil { @@ -243,12 +248,12 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return nil } - inMissingStart := p.missingUpdateRunStartsForEnvs(envIds) - inRunStopMap := p.pendingRunStopsForEnvs(envIds) - inO2StartMap := p.pendingO2StartsForEnvs(envIds) - inO2StopMap := p.pendingO2StopsForEnvs(envIds) - inTrgStartMap := p.pendingTrgStartsForEnvs(envIds) - inTrgStopMap := p.pendingTrgStopsForEnvs(envIds) + inMissingStart := p.getMissingUpdateRunStartsForEnvs(envIds) + inRunStopMap := p.getPendingRunStopsForEnvs(envIds) + inO2StartMap := p.getPendingO2StartsForEnvs(envIds) + inO2StopMap := p.getPendingO2StopsForEnvs(envIds) + inTrgStartMap := p.getPendingTrgStartsForEnvs(envIds) + inTrgStopMap := p.getPendingTrgStopsForEnvs(envIds) envMap := make(map[string]interface{}) out := make(map[uid.ID]string) @@ -527,7 +532,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else { // If the run creation request succeeds, we set the run status indicators + p.missingUpdateRunStartsMu.Lock() p.missingUpdateRunStarts[envId] = true + p.missingUpdateRunStartsMu.Unlock() p.pendingRunStops[envId] = runNumber64 p.pendingO2Starts[envId] = true p.pendingO2Stops[envId] = true @@ -719,6 +726,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // If UpdateRunStart was not called and the Trg start time is missing, // it is set to the O2 start time. + p.missingUpdateRunStartsMu.Lock() if p.missingUpdateRunStarts[envId] == true && trgEnabled && timeTrgStartOutput == nil { if p.pendingO2Starts[envId] == false { timeTrgStartOutput = timeO2StartOutput @@ -732,6 +740,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 start time after missing UpdateRunStart call") } } + p.missingUpdateRunStartsMu.Unlock() timeTrgEndTemp, err = strconv.ParseInt(timeTrgEndInput, 10, 64) if err != nil { log.WithField("run", runNumber64). @@ -769,6 +778,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Else if O2 start time or Trg start time is available, we can update it safely // because it means that even if they weren't missing during the UpdateRunStart call, // they will be the same and can be overwritten. + p.missingUpdateRunStartsMu.Lock() if p.missingUpdateRunStarts[envId] == true && timeO2StartOutput == nil { log.WithField("run", runNumber64). WithField("partition", envId). @@ -806,6 +816,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ReadoutCfgUri: &readoutUri, } } + p.missingUpdateRunStartsMu.Unlock() } // Send the run update request @@ -828,10 +839,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStop") { // If the update is successful and it is an UpdateRunStop call, we check if we are missing // EOR timestamps, and if that is the case, we set them to Now() and send a new update request + p.missingUpdateRunStartsMu.Lock() if p.missingUpdateRunStarts[envId] == true { defer delete(p.pendingO2Starts, envId) defer delete(p.pendingTrgStarts, envId) } + p.missingUpdateRunStartsMu.Unlock() defer delete(p.pendingRunStops, envId) defer delete(p.pendingO2Stops, envId) defer delete(p.pendingTrgStops, envId) @@ -979,7 +992,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingTrgStarts[envId] = false } + p.missingUpdateRunStartsMu.Lock() p.missingUpdateRunStarts[envId] = false + p.missingUpdateRunStartsMu.Unlock() return updateRunFunc(runNumber64, "test", O2StartTime, "", TrgStartTime, "") } From 59aab4ff71d7ec9e625ce9d652c681b58e154b13 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Wed, 31 May 2023 10:02:16 +0200 Subject: [PATCH 1620/2352] Compile with FairMQ 1.5.x --- occ/util/Logger.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/occ/util/Logger.h b/occ/util/Logger.h index 8710ffd9f..5e2afe309 100644 --- a/occ/util/Logger.h +++ b/occ/util/Logger.h @@ -25,7 +25,11 @@ #ifndef OCCPLUGIN_LOGGER_H #define OCCPLUGIN_LOGGER_H +#if __has_include() +#include +#else #include +#endif #define OLOG(X) LOG(X) << "[OCC] " From b4d0aced114e606d306b5e7ece419beffa8e4468 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Wed, 31 May 2023 15:57:40 +0200 Subject: [PATCH 1621/2352] [docs] Add state machine callback documentation --- docs/handbook/overview.md | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index 3f0d7f229..b23288f48 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -53,4 +53,35 @@ This is the order of callback execution upon a state transition: 5. `enter_`, `` - called after entering `` 6. `enter_state` - called after entering all states 7. `after_`, `` - called after event named `` -8. `after_event` - called after all events \ No newline at end of file +8. `after_event` - called after all events + +Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. + +## Workflow hook calls + +The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. +* `func` - mandatory, it parses as an `antonmedv/expr` expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). +* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. +* `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. +* `timeout` - optional, Go `time.Duration` expression, the maximum time `func` will be granted to complete before its context is invalidated. +* `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. + +Consider the following example: +``` +# Trigger and await are different: any number of other operations may happen concurrently in between. Regardless of when in time the call actually finishes, its result isn't collected until the environment state machine reaches `after_RESET+0`. The state machine will only block if it reaches `after_RESET+0` and the call isn't done yet (completed or timed out). + - name: reset + call: + func: odc.Reset() + trigger: before_RESET + await: after_RESET + timeout: "{{ odc_reset_timeout }}" + critical: true +# Trigger and await are the same (the await expression could be omitted here): the call must begin and end within the `after_RESET+100` step. If the workflow template defines no other calls straddling `after_RESET+100` then this call is fully serialized with respect to the state machine and its execution blocks everything else. + - name: part-term + call: + func: odc.PartitionTerminate() + trigger: after_RESET+100 + await: after_RESET+100 + timeout: "{{ odc_partitionterminate_timeout }}" + critical: true +``` From 1ba7bd979d4a2f45e28ee44b3d12001dc6106e76 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 2 Jun 2023 16:59:53 +0200 Subject: [PATCH 1622/2352] Update docs/handbook/overview.md Co-authored-by: Piotr Konopka --- docs/handbook/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index b23288f48..2506f95df 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -60,7 +60,7 @@ Callback execution is further refined with integer indexes, with the syntax `±i ## Workflow hook calls The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. -* `func` - mandatory, it parses as an `antonmedv/expr` expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). +* `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). * `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. * `timeout` - optional, Go `time.Duration` expression, the maximum time `func` will be granted to complete before its context is invalidated. From 73ad044acaa49d09dcc60be2ef0dc4b22045bdc9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 2 Jun 2023 17:03:04 +0200 Subject: [PATCH 1623/2352] [docs] Call timeout expression default value --- docs/handbook/overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index 2506f95df..7a4b79e4c 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -63,7 +63,7 @@ The state machine callback moments are exposed to the AliECS workflow template i * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). * `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. -* `timeout` - optional, Go `time.Duration` expression, the maximum time `func` will be granted to complete before its context is invalidated. +* `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time `func` will be granted to complete before its context is invalidated. * `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. Consider the following example: From 71f1922ffc4fbe7744069d9a399bce5929d535e8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 19 May 2023 17:29:27 +0200 Subject: [PATCH 1624/2352] [core] Support Mesos task resource limits specification for task classes --- core/task/match.go | 24 +++++++++++++++++++ core/task/scheduler.go | 17 ++++++++++++++ core/task/taskclass/class.go | 45 ++++++++++++++++++++++++++++++++++-- 3 files changed, 84 insertions(+), 2 deletions(-) diff --git a/core/task/match.go b/core/task/match.go index 3b69e1b0e..ebf7bb9a1 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -42,6 +42,30 @@ type Wants struct { InboundChannels []channel.Inbound } +type Limits struct { + Cpu float64 + Memory float64 +} + +func (m *Manager) GetLimitsForDescriptor(descriptor *Descriptor, envId uid.ID) (l *Limits) { + taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) + if ok && taskClass != nil { + l = &Limits{} + limits := taskClass.Limits + if limits.Cpu != nil { + l.Cpu = *limits.Cpu + } + if limits.Memory != nil { + l.Memory = *limits.Memory + } + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Warnf("missing task class %s", descriptor.TaskClassName) + } + return +} + // GetWantsForDescriptor matches between taskclass and taskmanager's classes func (m *Manager) GetWantsForDescriptor(descriptor *Descriptor, envId uid.ID) (r *Wants, err error) { taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index c03f9723b..5622e2763 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -763,12 +763,16 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han break FOR_PREMATCH_DESCRIPTORS } + var limits *Limits + limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) + // Point of no return, we start subtracting resources taskPtr, mesosTaskInfo := makeTaskForMesosResources( state, &offer, descriptor, wants, + limits, remainingResourcesInOffer, machinesUsed, targetExecutorId, @@ -875,12 +879,16 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han continue FOR_DESCRIPTORS // next descriptor } + var limits *Limits + limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) + // Point of no return, we start subtracting resources taskPtr, mesosTaskInfo := makeTaskForMesosResources( state, &offer, descriptor, wants, + limits, remainingResourcesInOffer, machinesUsed, targetExecutorId, @@ -1305,6 +1313,7 @@ func makeTaskForMesosResources( offer *mesos.Offer, descriptor *Descriptor, wants *Wants, + limits *Limits, remainingResourcesInOffer mesos.Resources, machinesUsed map[string]struct{}, targetExecutorId mesos.ExecutorID, @@ -1506,6 +1515,14 @@ func makeTaskForMesosResources( Value: &descriptorDetector, }, }}, + Limits: map[string]mesos.Value_Scalar{}, + } + + if limits != nil && limits.Cpu > 0 { + mesosTaskInfo.Limits["cpus"] = *resources.NewCPUs(limits.Cpu).Resource.Scalar + } + if limits != nil && limits.Memory > 0 { + mesosTaskInfo.Limits["mem"] = *resources.NewMemory(limits.Memory).Resource.Scalar } // We must run the executor with a special LD_LIBRARY_PATH because diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index 11298923d..1dc11a9ef 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -42,8 +42,9 @@ import ( var log = logger.New(logrus.StandardLogger(), "taskclass") // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but -// the following information is enough to run the task even with no environment or -// role Class. +// +// the following information is enough to run the task even with no environment or +// role Class. type Class struct { Identifier Id `yaml:"name"` Defaults gera.StringMap `yaml:"defaults"` @@ -53,6 +54,7 @@ type Class struct { } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` + Limits *ResourceLimits `yaml:"limits"` Bind []channel.Inbound `yaml:"bind"` Properties gera.StringMap `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` @@ -71,6 +73,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } `yaml:"control"` Command *common.CommandInfo `yaml:"command"` Wants ResourceWants `yaml:"wants"` + Limits *ResourceLimits `yaml:"limits"` Bind []channel.Inbound `yaml:"bind"` Properties map[string]string `yaml:"properties"` Constraints []constraint.Constraint `yaml:"constraints"` @@ -97,6 +100,7 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { Control: aux.Control, Command: aux.Command, Wants: aux.Wants, + Limits: aux.Limits, Bind: aux.Bind, Properties: gera.MakeStringMapWithMap(aux.Properties), Constraints: aux.Constraints, @@ -116,6 +120,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { Mode string `yaml:"mode"` } `yaml:"control"` Wants ResourceWants `yaml:"wants"` + Limits *ResourceLimits `yaml:"limits,omitempty"` Bind []channel.Inbound `yaml:"bind,omitempty"` Properties map[string]string `yaml:"properties,omitempty"` Constraints []constraint.Constraint `yaml:"constraints,omitempty"` @@ -128,6 +133,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { Vars: c.Vars.Raw(), Properties: c.Properties.Raw(), Wants: c.Wants, + Limits: c.Limits, Bind: c.Bind, Constraints: c.Constraints, Command: c.Command, @@ -204,6 +210,41 @@ func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err e return } +type ResourceLimits struct { + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` +} + +func (rw *ResourceLimits) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _resourceLimits struct { + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + } + aux := _resourceLimits{} + err = unmarshal(&aux) + if err != nil { + return + } + + if aux.Cpu != nil { + var cpuCount float64 + cpuCount, err = strconv.ParseFloat(*aux.Cpu, 64) + if err != nil { + return + } + rw.Cpu = &cpuCount + } + if aux.Memory != nil { + var memCount float64 + memCount, err = strconv.ParseFloat(*aux.Memory, 64) + if err != nil { + return + } + rw.Memory = &memCount + } + return +} + func (c *Class) Equals(other *Class) (response bool) { if c == nil || other == nil { return false From 0ee1e2428c94479cf52790317e1d3a3e4476904c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 24 May 2023 16:01:23 +0200 Subject: [PATCH 1625/2352] [core] Prevent crash in incomplete limits --- core/task/match.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/core/task/match.go b/core/task/match.go index ebf7bb9a1..78d7d361d 100644 --- a/core/task/match.go +++ b/core/task/match.go @@ -51,12 +51,13 @@ func (m *Manager) GetLimitsForDescriptor(descriptor *Descriptor, envId uid.ID) ( taskClass, ok := m.classes.GetClass(descriptor.TaskClassName) if ok && taskClass != nil { l = &Limits{} - limits := taskClass.Limits - if limits.Cpu != nil { - l.Cpu = *limits.Cpu - } - if limits.Memory != nil { - l.Memory = *limits.Memory + if limits := taskClass.Limits; limits != nil { + if limits.Cpu != nil { + l.Cpu = *limits.Cpu + } + if limits.Memory != nil { + l.Memory = *limits.Memory + } } } else { log.WithPrefix("scheduler"). From 3dbe129f3cc64b262e8ef325583d6d77b8f3da3e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 31 May 2023 12:52:46 +0200 Subject: [PATCH 1626/2352] [core] Print limits to IL --- core/task/scheduler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 5622e2763..eaaa96aff 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -792,6 +792,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "taskId": mesosTaskInfo.TaskID.Value, "offerId": offer.ID.Value, "executorId": state.executor.ExecutorID.Value, + "limits": mesosTaskInfo.Limits, }).Debug("launching task") taskPtr.SendEvent(&event.TaskEvent{ @@ -908,6 +909,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han "taskId": mesosTaskInfo.TaskID.Value, "offerId": offer.ID.Value, "executorId": state.executor.ExecutorID.Value, + "limits": mesosTaskInfo.Limits, }).Debug("launching task") taskPtr.SendEvent(&event.TaskEvent{ @@ -1489,6 +1491,7 @@ func makeTaskForMesosResources( WithField("detector", descriptorDetector). WithField("taskResources", resourcesRequest). WithField("executorResources", executorResources). + WithField("limits", limits). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) From aa3a384439c64af3ae5c4052c0c90c6d765acc1b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 5 Jun 2023 17:32:04 +0200 Subject: [PATCH 1627/2352] [core] Avoid triggering dead or inactive hooks on teardown --- core/environment/manager.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index fa3eea5f3..aca91d0b2 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -482,6 +482,14 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error // calls done, we start the task hooks... cleanupTaskHooks := hooksForWeight.FilterTasks() + + // ...but only if their parent role is still ACTIVE (i.e. not killed or executor failed) + cleanupTaskHooks = cleanupTaskHooks.Filtered(func(t *task.Task) bool { + if pr, prOk := t.GetParentRole().(workflow.Role); prOk { + return pr.GetStatus() == task.ACTIVE + } + return false + }) err = envs.taskman.TriggerHooks(environmentId, cleanupTaskHooks) if err != nil { log.WithField("partition", environmentId.String()). From 51dc3af4c5b1e29de112c8f940bc07bc340c0af8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 5 Jun 2023 17:33:08 +0200 Subject: [PATCH 1628/2352] [core] Proceed with task kill even if some cannot be killed --- core/task/manager.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index d59602f7e..a449a2971 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1004,7 +1004,7 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // Kill a specific list of tasks. // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { - toKill := m.roster.filtered(func(t *Task) bool { + taskCanBeKilledFilter := func(t *Task) bool { if t.IsLocked() { return false } @@ -1014,11 +1014,15 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } } return false - }) + } + + // TODO: use grouping instead of 2 passes of filtering for performance + toKill := m.roster.filtered(taskCanBeKilledFilter) + unkillable := m.roster.filtered(func(t *Task) bool { return !taskCanBeKilledFilter(t) }) if len(toKill) < len(taskIds) { - err = TaskNotFoundError{} - return + log.WithField("taskIds", strings.Join(unkillable.GetTaskIds(), ", ")). + Debugf("some tasks cannot be physically killed (already dead?), will instead only be removed from roster") } for _, id := range toKill.GetTaskIds() { From 3d5681db80e38d1009ea027dd0f61c274ab8c980 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 6 Jun 2023 17:25:04 +0200 Subject: [PATCH 1629/2352] [core] Explicit handling of executor/agent failed events --- common/event/agentexecutorfailedevent.go | 67 ++++++++++++++++++++++++ core/environment/manager.go | 36 +++++++++++++ core/task/manager.go | 54 ++++++++++++++++++- core/task/scheduler.go | 2 + 4 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 common/event/agentexecutorfailedevent.go diff --git a/common/event/agentexecutorfailedevent.go b/common/event/agentexecutorfailedevent.go new file mode 100644 index 000000000..6888ec8f7 --- /dev/null +++ b/common/event/agentexecutorfailedevent.go @@ -0,0 +1,67 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import mesos "github.com/mesos/mesos-go/api/v1/lib" + +type ExecutorFailedEvent struct { + eventBase + ExecutorId mesos.ExecutorID `json:"executorId"` +} + +func NewExecutorFailedEvent(executorId *mesos.ExecutorID) *ExecutorFailedEvent { + return &ExecutorFailedEvent{ + eventBase: *newDeviceEventBase("ExecutorFailedEvent", nil), + ExecutorId: *executorId, + } +} + +func (e *ExecutorFailedEvent) GetName() string { + return e.ExecutorId.GetValue() +} + +func (e *ExecutorFailedEvent) GetId() mesos.ExecutorID { + return e.ExecutorId +} + +type AgentFailedEvent struct { + eventBase + AgentId mesos.AgentID `json:"agentId"` +} + +func NewAgentFailedEvent(agentId *mesos.AgentID) *AgentFailedEvent { + return &AgentFailedEvent{ + eventBase: *newDeviceEventBase("AgentFailedEvent", nil), + AgentId: *agentId, + } +} + +func (e *AgentFailedEvent) GetName() string { + return e.AgentId.GetValue() +} + +func (e *AgentFailedEvent) GetId() mesos.AgentID { + return e.AgentId +} diff --git a/core/environment/manager.go b/core/environment/manager.go index aca91d0b2..9a9c7ba68 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -81,6 +81,42 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage case event.DeviceEvent: instance.handleDeviceEvent(typedEvent) + case *event.ExecutorFailedEvent: + envIdsAffected := tm.HandleExecutorFailed(typedEvent) + for envId := range envIdsAffected { + env, err := instance.environment(envId) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("executorId", typedEvent.GetId().Value). + WithError(err). + Error("cannot find environment for incoming executor failed event") + } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("executorId", typedEvent.GetId().Value). + WithField("envState", env.CurrentState()). + Debug("received executor failed event") + } + + case *event.AgentFailedEvent: + envIdsAffected := tm.HandleAgentFailed(typedEvent) + for envId := range envIdsAffected { + env, err := instance.environment(envId) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("agentId", typedEvent.GetId().Value). + WithError(err). + Error("cannot find environment for incoming executor failed event") + } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("agentId", typedEvent.GetId().Value). + WithField("envState", env.CurrentState()). + Debug("received executor failed event") + } + case *event.TasksReleasedEvent: // If we got a TasksReleasedEvent, it must be matched with a pending // environment teardown. diff --git a/core/task/manager.go b/core/task/manager.go index a449a2971..2114615e5 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -101,8 +101,7 @@ type Manager struct { ackKilledTasks *safeAcks } -func NewManager(shutdown func(), - internalEventCh chan<- event.Event) (taskman *Manager, err error) { +func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *Manager, err error) { // TODO(jdef) how to track/handle timeout errors that occur for SUBSCRIBE calls? we should // probably tolerate X number of subsequent subscribe failures before bailing. we'll need // to track the lastCallAttempted along with subsequentSubscribeTimeouts. @@ -982,6 +981,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { taskPtr.GetParent().UpdateStatus(ACTIVE) } case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + taskPtr.status = INACTIVE if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateStatus(INACTIVE) @@ -1187,6 +1187,56 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { return nil } +func (m *Manager) HandleExecutorFailed(e *event.ExecutorFailedEvent) map[uid.ID]struct{} { + // returns the set of environment ids affected by the failed executor + if len(e.ExecutorId.Value) == 0 { + return nil + } + + tasksForFailedExecutor := m.roster.filtered(func(t *Task) bool { + return t.executorId == e.ExecutorId.Value + }) + + envIdsForExecutor := make(map[uid.ID]struct{}) + + for _, t := range tasksForFailedExecutor { + envIdsForExecutor[t.GetEnvironmentId()] = struct{}{} + t.executorId = "" // causes IsLocked() to become false for sure + thisTask := t + go func() { + m.updateTaskState(thisTask.taskId, "ERROR") + thisTask.status = INACTIVE + thisTask.GetParent().UpdateStatus(INACTIVE) + }() + } + return envIdsForExecutor +} + +func (m *Manager) HandleAgentFailed(e *event.AgentFailedEvent) map[uid.ID]struct{} { + // returns the set of environment ids affected by the failed executor + if len(e.AgentId.Value) == 0 { + return nil + } + + tasksForFailedExecutor := m.roster.filtered(func(t *Task) bool { + return t.agentId == e.AgentId.Value + }) + + envIdsForExecutor := make(map[uid.ID]struct{}) + + for _, t := range tasksForFailedExecutor { + envIdsForExecutor[t.GetEnvironmentId()] = struct{}{} + t.agentId = "" // causes IsLocked() to become false for sure + thisTask := t + go func() { + m.updateTaskState(thisTask.taskId, "ERROR") + thisTask.status = INACTIVE + thisTask.GetParent().UpdateStatus(INACTIVE) + }() + } + return envIdsForExecutor +} + // This function should only be called from the SIGINT/SIGTERM handler func (m *Manager) EmergencyKillTasks(tasks Tasks) { for _, t := range tasks { diff --git a/core/task/scheduler.go b/core/task/scheduler.go index eaaa96aff..00431c617 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -225,6 +225,7 @@ func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) erro WithFields(fields). WithField("level", infologger.IL_Support). Error("executor failed") + state.taskman.internalEventCh <- event.NewExecutorFailedEvent(eid) } else if aid != nil { // agent failed.. fields := logrus.Fields{} @@ -244,6 +245,7 @@ func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) erro WithFields(fields). WithField("level", infologger.IL_Support). Error("agent failed") + state.taskman.internalEventCh <- event.NewAgentFailedEvent(aid) } return nil } From 6d454792d718652bc6b79f6c9056586062e1d6f9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 6 Jun 2023 17:26:29 +0200 Subject: [PATCH 1630/2352] [core] Only perform a STOP transition for ACTIVE tasks --- core/environment/transition_stopactivity.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 4db7aaf99..6242ccaf4 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -55,7 +56,12 @@ func (t StopActivityTransition) do(env *Environment) (err error) { Info("stopping run") taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), + env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { + if pr, ok := t.GetParentRole().(workflow.Role); ok { + return pr.GetStatus() == task.ACTIVE + } + return false + }), task.RUNNING.String(), task.STOP.String(), task.CONFIGURED.String(), From 5e5d083908dfae4e51a16bf1b84273d372be1621 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 6 Jun 2023 17:26:50 +0200 Subject: [PATCH 1631/2352] [core] Wait for 500ms for ERROR states to settle before GO_ERROR/STOP --- core/environment/environment.go | 55 +++++++++++++++++++-------------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 9bccb96fd..e9f8142a9 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -734,36 +734,43 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { wfState := wf.GetState() if wfState != task.ERROR { + handlingError := false WORKFLOW_STATE_LOOP: for { select { case wfState = <-notify: if wfState == task.ERROR { - err := env.TryTransition(NewGoErrorTransition(taskman)) - if err != nil { - log.WithField("partition", env.id). - WithError(err). - WithField("level", infologger.IL_Devel). - Warn("could not transition gently to ERROR, forcing it") - env.setState(wfState.String()) + if !handlingError { + handlingError = true + + time.AfterFunc(500*time.Millisecond, func() { // wait 0.5s for any other tasks to go to ERROR/INACTIVE + err := env.TryTransition(NewGoErrorTransition(taskman)) + if err != nil { + log.WithField("partition", env.id). + WithError(err). + WithField("level", infologger.IL_Devel). + Warn("could not transition gently to ERROR, forcing it") + env.setState(wfState.String()) + } + toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { + t.SetSafeToStop(true) + return t.IsSafeToStop() + }) + if len(toStop) > 0 { + taskmanMessage := task.NewTransitionTaskMessage( + toStop, + task.RUNNING.String(), + task.STOP.String(), + task.CONFIGURED.String(), + nil, + env.Id(), + ) + taskman.MessageChannel <- taskmanMessage + <-env.stateChangedCh + } + }) + break WORKFLOW_STATE_LOOP } - toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { - t.SetSafeToStop(true) - return t.IsSafeToStop() - }) - if len(toStop) > 0 { - taskmanMessage := task.NewTransitionTaskMessage( - toStop, - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), - nil, - env.Id(), - ) - taskman.MessageChannel <- taskmanMessage - <-env.stateChangedCh - } - break WORKFLOW_STATE_LOOP } if wfState == task.DONE { break WORKFLOW_STATE_LOOP From 2312f39b8be5246bb8c2fbceb8ef5c4a529c3f41 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 7 Jun 2023 14:17:39 +0200 Subject: [PATCH 1632/2352] [build] Bump to v0.68.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2d19af9fa..ba711da05 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 67 -VERSION_PATCH := 1 +VERSION_MINOR := 68 +VERSION_PATCH := 0 From 64abe7561288f2393b3c76ac95e5653b652387cc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Jun 2023 13:30:08 +0200 Subject: [PATCH 1633/2352] [core] Explicitly default to infinite cpu/mem resource limits --- core/task/scheduler.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 00431c617..e90d7dcf8 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -33,6 +33,7 @@ import ( "errors" "fmt" "io" + "math" "strconv" "strings" "sync" @@ -1525,9 +1526,13 @@ func makeTaskForMesosResources( if limits != nil && limits.Cpu > 0 { mesosTaskInfo.Limits["cpus"] = *resources.NewCPUs(limits.Cpu).Resource.Scalar + } else { + mesosTaskInfo.Limits["cpus"] = mesos.Value_Scalar{Value: math.Inf(1)} // magic value for infinity } if limits != nil && limits.Memory > 0 { mesosTaskInfo.Limits["mem"] = *resources.NewMemory(limits.Memory).Resource.Scalar + } else { + mesosTaskInfo.Limits["mem"] = mesos.Value_Scalar{Value: math.Inf(1)} // magic value for infinity } // We must run the executor with a special LD_LIBRARY_PATH because From 5cacf5dd9d395ffaaff0ce04557579a52fc7f86d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 9 Jun 2023 13:48:08 +0200 Subject: [PATCH 1634/2352] [build] Bump to v0.68.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ba711da05..fd654893b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 68 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 6c38fd7b499194774906abd124501fb21344510e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Jun 2023 17:18:46 +0200 Subject: [PATCH 1635/2352] [core] Don't crash if task has no parent --- core/task/manager.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index 2114615e5..89491206c 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1231,7 +1231,9 @@ func (m *Manager) HandleAgentFailed(e *event.AgentFailedEvent) map[uid.ID]struct go func() { m.updateTaskState(thisTask.taskId, "ERROR") thisTask.status = INACTIVE - thisTask.GetParent().UpdateStatus(INACTIVE) + if taskParent := thisTask.GetParent(); taskParent != nil { + taskParent.UpdateStatus(INACTIVE) + } }() } return envIdsForExecutor From e5b3d5de813243da6947ff2c9178f4bf1ecbefa3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 May 2023 12:15:32 +0200 Subject: [PATCH 1636/2352] [core] Update DCS protofile --- core/integration/dcs/protos/dcs.proto | 33 +++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 9583dd7f6..960b8ce97 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -73,10 +73,10 @@ message DetectorInfo { DetectorState state = 2;// state of this detector at the time of response generation string timestamp = 3; // time when the detector state is as declared repeated RunType allowedRunTypes = 4; // a list of run types that are currently - // possible with the given detector, taking into - // account all low-level information; - // for example, at a given moment TECHNICAL - // runs might be possible but not PHYSICS + // possible with the given detector, taking into + // account all low-level information; + // for example, at a given moment TECHNICAL + // runs might be possible but not PHYSICS } ////////////////////////////////////////////////////// @@ -101,13 +101,13 @@ message SubscriptionRequest { message Event { EventType eventtype = 1; // type of event being published by the DCS service repeated DetectorInfo detectorMatrix = 2; // detector-specific status payloads (optional depending - // on event type) + // on event type) map extraParameters = 3; // general key-value map just in case string timestamp = 4; // this corresponds to the moment where this Event-answer - // was valid from the source + // was valid from the source string message = 5; // optional user-facing error message, if the DCS wants to - // report an ECS-related error status (e.g. the reason for - // a failed SOR) to the user + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user } ////////////////////////////////////////////////////// @@ -142,14 +142,14 @@ message EorRequest { message RunEvent { EventType eventtype = 1; // type of event being published by the DCS service Detector detector = 2; // if detector==DCS, the update is a pre-closure summary - // of the current operation + // of the current operation DetectorState state = 3; // aggregate state for all detectors involved in current - // SOR/EOR operation + // SOR/EOR operation map extraParameters = 4; string timestamp = 5; string message = 6; // optional user-facing error message, if the DCS wants to - // report an ECS-related error status (e.g. the reason for - // a failed SOR) to the user + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user } ////////////////////////////////////////////////////// @@ -167,7 +167,7 @@ message StatusRequest { // payloads. message StatusReply { repeated DetectorInfo detectorMatrix = 1; // an exhaustive list of DetectorInfos - // one for each detector + // one for each detector } ////////////////////////////////////////////////////// @@ -238,7 +238,12 @@ enum RunType { CALIBRATION_FHR = 11; CALIBRATION_ALPIDE_SCAN = 12; reserved 13 to 15; // CALIBRATION, COSMICS, SYNTHETIC - NOISE = 16; + NOISE = 16; + CALIBRATION_PULSE_LENGTH = 17; + CALIBRATION_VRESETD = 18; + reserved 19 to 299; + + ANY = 300; } enum TriggerMode { // FIXME: unused From 9966e23a1fa44a9ef6f2ff9ebec47ffb045af7fd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 May 2023 15:02:30 +0200 Subject: [PATCH 1637/2352] [core] PrepareForRun request in DCS protofile --- core/integration/dcs/protos/dcs.proto | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 960b8ce97..52ab8dd7e 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -36,10 +36,22 @@ service Configurator { // it. Multiple concurrent stream subscriptions are allowed. rpc Subscribe (SubscriptionRequest) returns (stream Event) {} - // Single SOR request for a data taking session, with per-detector parameters. + // Single PFR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the PFR operation. Upon PFR completion (DetectorState.RUN_OK), the server + // closes the stream. + rpc PrepareForRun (PfrRequest) returns (stream RunEvent) {} + + // Single SOR request for a data taking session, with run number. // Returns an event stream which returns subsequent intermediate states within // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server // closes the stream. + // If the DetectorOperationRequest or run type parameters are the same as the + // last PrepareForRun request (no matter how far back in time) and the DCS + // state hasn't changed, the SOR operations should be fast. Otherwise, the SOR + // also implicitly includes any number of PrepareForRun operations as needed, + // this can take a while but should not change the overall behavior reported + // to ECS. rpc StartOfRun (SorRequest) returns (stream RunEvent) {} // Single EOR request for a data taking session, with per-detector parameters. @@ -122,6 +134,13 @@ message DetectorOperationRequest { // may include ddl_list or cluster_sum (the latter only for MCH) } +// A PfrRequest encapsulates a list of detector-specific request payloads, +// plus a common runType any future runs. +message PfrRequest { + repeated DetectorOperationRequest detectors = 1; + RunType runType = 2; // default: NULL_RUNTYPE, should probably never be sent +} + // A SorRequest encapsulates a list of detector-specific request payloads, // plus a common runType and a runNumber for the run about to start. message SorRequest { From 5d6150e16427c0efe3c0d245372f0a566b3551fe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 24 May 2023 16:06:11 +0200 Subject: [PATCH 1638/2352] [core] Update DCS protofile --- core/integration/dcs/protos/dcs.proto | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 52ab8dd7e..a38b54525 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -139,6 +139,7 @@ message DetectorOperationRequest { message PfrRequest { repeated DetectorOperationRequest detectors = 1; RunType runType = 2; // default: NULL_RUNTYPE, should probably never be sent + string partitionId = 3; // unique id for a pfr request } // A SorRequest encapsulates a list of detector-specific request payloads, @@ -202,6 +203,7 @@ enum EventType { SOR_EVENT = 20; EOR_EVENT = 30; TIMEOUT = 40; + PFR_EVENT = 50; } enum Detector { @@ -240,6 +242,7 @@ enum DetectorState { DEAD = 10; SOR_UNAVAILABLE = 11; EOR_UNAVAILABLE = 12; + PREPARING = 13; } enum RunType { @@ -263,6 +266,7 @@ enum RunType { reserved 19 to 299; ANY = 300; + } enum TriggerMode { // FIXME: unused From 1d483c77e56b5bae10237a410da85c30a2407f6b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 24 May 2023 16:18:05 +0200 Subject: [PATCH 1639/2352] [build] Support fetching dcs.proto in make vendor --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 5a9faa1c1..469750600 100644 --- a/Makefile +++ b/Makefile @@ -37,6 +37,7 @@ CGO_LDFLAGS=CGO_LDFLAGS="$(ROOT_DIR)/vendor/infoLoggerForGo/infoLoggerForGo.a -s BUILD_FLAGS=$(CGO_LDFLAGS) $(BUILD_ENV_FLAGS) endif REPOPATH = github.com/AliceO2Group/Control +DCS_PROTO="https://gitlab.cern.ch/api/v4/projects/137621/repository/files/proto%2Fdcs.proto/raw?ref=master" ODC_PROTO="https://raw.githubusercontent.com/FairRootGroup/ODC/master/odc/grpc/odc.proto" DD_PROTO="https://raw.githubusercontent.com/AliceO2Group/DataDistribution/master/src/DataDistControl/DataDistControl.proto" BK_COM_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/common.proto" @@ -145,6 +146,11 @@ vendor: @echo -e "\033[1;33mgo mod vendor\033[0m" @go mod vendor +# curl --header "PRIVATE-TOKEN: " "https://gitlab.example.com/api/v4/projects/13083/repository/files/scripts%2Frun.sh/raw?ref=master" + @echo -e "\033[1;33mcurl dcs.proto\033[0m" + @mkdir -p core/integration/dcs/protos + @curl --header "PRIVATE-TOKEN: glpat-z-r8s2Mfte8GBpLn7vcE" -s -L $(DCS_PROTO) -o core/integration/dcs/protos/dcs.proto + # FIXME: these two protofiles should be committed in order to be available offline @echo -e "\033[1;33mcurl odc.proto\033[0m" @mkdir -p core/integration/odc/protos From 8e9af4d2610088960f7e4a6abd86dd0a44dcb952 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 14 Jun 2023 15:52:52 +0200 Subject: [PATCH 1640/2352] [core] Implement DCS PrepareForRun operation --- core/integration/dcs/plugin.go | 323 +++++++++++++- core/integration/dcs/protos/dcs.pb.go | 491 +++++++++++++-------- core/integration/dcs/protos/dcs.proto | 27 +- core/integration/dcs/protos/dcs_grpc.pb.go | 91 +++- 4 files changed, 727 insertions(+), 205 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 69adbf438..69d834f7f 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -212,11 +212,325 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { varStack := call.VarStack envId, envOk := varStack["environment_id"] if !envOk { - log.Error("cannot acquire environment ID") + log.WithField("call", "PrepareForRun"). + Error("cannot acquire environment ID") return } stack = make(map[string]interface{}) + stack["PrepareForRun"] = func() (out string) { // must formally return string even when we return nothing + var err error + callFailedStr := "DCS PrepareForRun call failed" + + dcsDetectorsParam, ok := varStack["dcs_detectors"] + if !ok { + log.WithField("partition", envId). + WithField("call", "PrepareForRun"). + Debug("empty DCS detectors list provided") + dcsDetectorsParam = "[\"NULL_DETECTOR\"]" + } + + dcsDetectors, err := p.parseDetectors(dcsDetectorsParam) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) + + parameters, ok := varStack["dcs_sor_parameters"] + if !ok { + log.WithField("partition", envId). + WithField("call", "PrepareForRun"). + Debug("no DCS SOR parameters set") + parameters = "{}" + } + + argMap := make(map[string]string) + bytes := []byte(parameters) + err = json.Unmarshal(bytes, &argMap) + if err != nil { + err = fmt.Errorf("error processing DCS SOR parameters: %w", err) + log.WithError(err). + WithField("partition", envId). + WithField("level", infologger.IL_Ops). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + rt := dcspb.RunType_TECHNICAL + runTypeS, ok := varStack["run_type"] + if ok { + // a detector is defined in the var stack + // so we convert from the provided string to the correct enum value in common/runtype + intRt, err := runtype.RunTypeString(runTypeS) + if err == nil { + if intRt == runtype.COSMICS { + // special case for COSMICS runs: there is no DCS run type for it, so we send PHYSICS + rt = dcspb.RunType_PHYSICS + } else { + // the runType was correctly matched to the common/runtype enum, but since the DCS enum is + // kept compatible, we can directly convert the runtype.RunType to a dcspb.RunType enum value + rt = dcspb.RunType(intRt) + } + } + } + + // Preparing the per-detector request payload + in := dcspb.PfrRequest{ + RunType: rt, + PartitionId: envId, + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + } + for i, dcsDet := range dcsDetectors { + ecsDet := dcsToEcsDetector(dcsDet) + perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] + if !okParam { + log.WithField("partition", envId). + WithField("call", "PrepareForRun"). + Debug("empty DCS detectors list provided") + perDetectorParameters = "{}" + } + detectorArgMap := make(map[string]string) + bytes = []byte(perDetectorParameters) + err = json.Unmarshal(bytes, &detectorArgMap) + if err != nil { + err = fmt.Errorf("error processing %s DCS SOR parameter map: %w", ecsDet, err) + + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + WithField("detector", ecsDet). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + // Per-detector parameters override any general dcs_sor_parameters + err = mergo.Merge(&detectorArgMap, argMap) + if err != nil { + err = fmt.Errorf("error processing %s DCS SOR general parameters override: %w", dcsDet.String(), err) + + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + WithField("detector", ecsDet). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + // We parse the consolidated per-detector payload for any defaultable parameters with value "default" + detectorArgMap = resolveDefaults(detectorArgMap, varStack, ecsDet, + log.WithField("partition", envId). + WithField("call", "PrepareForRun"). + WithField("detector", ecsDet)) + + in.Detectors[i] = &dcspb.DetectorOperationRequest{ + Detector: dcsDet, + ExtraParameters: detectorArgMap, + } + } + + if p.dcsClient == nil { + err = fmt.Errorf("DCS plugin not initialized, PrepareForRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if p.dcsClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("DCS client connection not available, PrepareForRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + var stream dcspb.Configurator_StartOfRunClient + timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "PFR", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) + for _, v := range dcsDetectors { + detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE + } + + // Point of no return + // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via + // the response stream. + // Regardless of DCS SOR success or failure, once the StartOfRun call returns, an EndOfRun **must** be enqueued + // for later, either during STOP_ACTIVITY or cleanup. + stream, err = p.dcsClient.PrepareForRun(ctx, &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + var dcsEvent *dcspb.RunEvent + for { + if ctx.Err() != nil { + err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) + break + } + dcsEvent, err = stream.Recv() + if errors.Is(err, io.EOF) { // correct stream termination + log.WithField("partition", envId). + Debug("DCS PFR event stream was closed from the DCS side (EOF)") + break // no more data + } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("partition", envId). + WithField("timeout", timeout.String()). + Debug("DCS PFR timed out") + err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) + break + } + if err != nil { // stream termination in case of general error + log.WithError(err). + WithField("partition", envId). + Warn("bad DCS PFR event received, any future DCS events are ignored") + break + } + if dcsEvent == nil { + log.WithField("partition", envId). + Warn("nil DCS PFR event received, skipping to next DCS event") + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s PFR failure event from DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Support). + Debug("DCS PFR completed successfully") + break + } else { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + log.WithField("partition", envId). + WithField("detector", ecsDet). + Debugf("DCS PFR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) + } + } + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Support). + Info("ALIECS PFR operation : completed DCS PFR for ") + } else { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Info("ALIECS PFR operation : processing DCS PFR for ") + } + + } + + dcsFailedEcsDetectors := make([]string, 0) + dcsopOk := true + for _, v := range dcsDetectors { + if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { + dcsopOk = false + dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) + } + } + if !dcsopOk { + logErr := fmt.Errorf("PFR failed for %s", strings.Join(dcsFailedEcsDetectors, ", ")) + if err != nil { + if errors.Is(err, io.EOF) { + err = fmt.Errorf("DCS PFR stream unexpectedly terminated from DCS side before completion: %w", err) + } + logErr = fmt.Errorf("%v : %v", err, logErr) + } + + log.WithError(logErr). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + } + return + + } stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing var err error callFailedStr := "DCS StartOfRun call failed" @@ -226,6 +540,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { log.WithField("partition", envId). + WithField("call", "StartOfRun"). WithError(err). Error("cannot acquire run number for DCS SOR") } @@ -233,6 +548,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { log.WithField("partition", envId). + WithField("call", "StartOfRun"). WithField("run", runNumber64). Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" @@ -260,6 +576,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parameters, ok := varStack["dcs_sor_parameters"] if !ok { log.WithField("partition", envId). + WithField("call", "StartOfRun"). Debug("no DCS SOR parameters set") parameters = "{}" } @@ -311,6 +628,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !okParam { log.WithField("partition", envId). WithField("run", runNumber64). + WithField("call", "StartOfRun"). Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } @@ -498,6 +816,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("run", runNumber64). + WithField("level", infologger.IL_Support). Debug("DCS SOR completed successfully") p.pendingEORs[envId] = runNumber64 break @@ -532,6 +851,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsopOk = false dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) } + } if dcsopOk { p.pendingEORs[envId] = runNumber64 @@ -812,6 +1132,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("run", runNumber64). + WithField("level", infologger.IL_Support). Debug("DCS EOR completed successfully") delete(p.pendingEORs, envId) break diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 9aedc2df2..a88897fba 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -55,6 +55,7 @@ const ( EventType_SOR_EVENT EventType = 20 EventType_EOR_EVENT EventType = 30 EventType_TIMEOUT EventType = 40 + EventType_PFR_EVENT EventType = 50 ) // Enum value maps for EventType. @@ -68,6 +69,7 @@ var ( 20: "SOR_EVENT", 30: "EOR_EVENT", 40: "TIMEOUT", + 50: "PFR_EVENT", } EventType_value = map[string]int32{ "NULL_EVENT": 0, @@ -78,6 +80,7 @@ var ( "SOR_EVENT": 20, "EOR_EVENT": 30, "TIMEOUT": 40, + "PFR_EVENT": 50, } ) @@ -221,6 +224,7 @@ const ( DetectorState_DEAD DetectorState = 10 DetectorState_SOR_UNAVAILABLE DetectorState = 11 DetectorState_EOR_UNAVAILABLE DetectorState = 12 + DetectorState_PREPARING DetectorState = 13 ) // Enum value maps for DetectorState. @@ -239,6 +243,7 @@ var ( 10: "DEAD", 11: "SOR_UNAVAILABLE", 12: "EOR_UNAVAILABLE", + 13: "PREPARING", } DetectorState_value = map[string]int32{ "NULL_STATE": 0, @@ -254,6 +259,7 @@ var ( "DEAD": 10, "SOR_UNAVAILABLE": 11, "EOR_UNAVAILABLE": 12, + "PREPARING": 13, } ) @@ -301,25 +307,31 @@ const ( RunType_CALIBRATION_FHR RunType = 11 RunType_CALIBRATION_ALPIDE_SCAN RunType = 12 RunType_NOISE RunType = 16 + RunType_CALIBRATION_PULSE_LENGTH RunType = 17 + RunType_CALIBRATION_VRESETD RunType = 18 + RunType_ANY RunType = 300 ) // Enum value maps for RunType. var ( RunType_name = map[int32]string{ - 0: "NULL_RUNTYPE", - 1: "PHYSICS", - 2: "TECHNICAL", - 3: "PEDESTALS", - 4: "PULSER", - 5: "LASER", - 6: "CALIBRATION_ITHR_TUNING", - 7: "CALIBRATION_VCASN_TUNING", - 8: "CALIBRATION_THR_SCAN", - 9: "CALIBRATION_DIGITAL_SCAN", - 10: "CALIBRATION_ANALOG_SCAN", - 11: "CALIBRATION_FHR", - 12: "CALIBRATION_ALPIDE_SCAN", - 16: "NOISE", + 0: "NULL_RUNTYPE", + 1: "PHYSICS", + 2: "TECHNICAL", + 3: "PEDESTALS", + 4: "PULSER", + 5: "LASER", + 6: "CALIBRATION_ITHR_TUNING", + 7: "CALIBRATION_VCASN_TUNING", + 8: "CALIBRATION_THR_SCAN", + 9: "CALIBRATION_DIGITAL_SCAN", + 10: "CALIBRATION_ANALOG_SCAN", + 11: "CALIBRATION_FHR", + 12: "CALIBRATION_ALPIDE_SCAN", + 16: "NOISE", + 17: "CALIBRATION_PULSE_LENGTH", + 18: "CALIBRATION_VRESETD", + 300: "ANY", } RunType_value = map[string]int32{ "NULL_RUNTYPE": 0, @@ -336,6 +348,9 @@ var ( "CALIBRATION_FHR": 11, "CALIBRATION_ALPIDE_SCAN": 12, "NOISE": 16, + "CALIBRATION_PULSE_LENGTH": 17, + "CALIBRATION_VRESETD": 18, + "ANY": 300, } ) @@ -727,6 +742,71 @@ func (x *DetectorOperationRequest) GetExtraParameters() map[string]string { return nil } +// A PfrRequest encapsulates a list of detector-specific request payloads, +// plus a common runType any future runs. +type PfrRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent + PartitionId string `protobuf:"bytes,3,opt,name=partitionId,proto3" json:"partitionId,omitempty"` // unique id for a pfr request +} + +func (x *PfrRequest) Reset() { + *x = PfrRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_dcs_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PfrRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PfrRequest) ProtoMessage() {} + +func (x *PfrRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_dcs_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PfrRequest.ProtoReflect.Descriptor instead. +func (*PfrRequest) Descriptor() ([]byte, []int) { + return file_protos_dcs_proto_rawDescGZIP(), []int{4} +} + +func (x *PfrRequest) GetDetectors() []*DetectorOperationRequest { + if x != nil { + return x.Detectors + } + return nil +} + +func (x *PfrRequest) GetRunType() RunType { + if x != nil { + return x.RunType + } + return RunType_NULL_RUNTYPE +} + +func (x *PfrRequest) GetPartitionId() string { + if x != nil { + return x.PartitionId + } + return "" +} + // A SorRequest encapsulates a list of detector-specific request payloads, // plus a common runType and a runNumber for the run about to start. type SorRequest struct { @@ -742,7 +822,7 @@ type SorRequest struct { func (x *SorRequest) Reset() { *x = SorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[4] + mi := &file_protos_dcs_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -755,7 +835,7 @@ func (x *SorRequest) String() string { func (*SorRequest) ProtoMessage() {} func (x *SorRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[4] + mi := &file_protos_dcs_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -768,7 +848,7 @@ func (x *SorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SorRequest.ProtoReflect.Descriptor instead. func (*SorRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{4} + return file_protos_dcs_proto_rawDescGZIP(), []int{5} } func (x *SorRequest) GetDetectors() []*DetectorOperationRequest { @@ -806,7 +886,7 @@ type EorRequest struct { func (x *EorRequest) Reset() { *x = EorRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[5] + mi := &file_protos_dcs_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -819,7 +899,7 @@ func (x *EorRequest) String() string { func (*EorRequest) ProtoMessage() {} func (x *EorRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[5] + mi := &file_protos_dcs_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -832,7 +912,7 @@ func (x *EorRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EorRequest.ProtoReflect.Descriptor instead. func (*EorRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{5} + return file_protos_dcs_proto_rawDescGZIP(), []int{6} } func (x *EorRequest) GetDetectors() []*DetectorOperationRequest { @@ -869,7 +949,7 @@ type RunEvent struct { func (x *RunEvent) Reset() { *x = RunEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[6] + mi := &file_protos_dcs_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -882,7 +962,7 @@ func (x *RunEvent) String() string { func (*RunEvent) ProtoMessage() {} func (x *RunEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[6] + mi := &file_protos_dcs_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -895,7 +975,7 @@ func (x *RunEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use RunEvent.ProtoReflect.Descriptor instead. func (*RunEvent) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{6} + return file_protos_dcs_proto_rawDescGZIP(), []int{7} } func (x *RunEvent) GetEventtype() EventType { @@ -952,7 +1032,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[7] + mi := &file_protos_dcs_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -965,7 +1045,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[7] + mi := &file_protos_dcs_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -978,7 +1058,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{7} + return file_protos_dcs_proto_rawDescGZIP(), []int{8} } func (x *StatusRequest) GetDetector() []Detector { @@ -1001,7 +1081,7 @@ type StatusReply struct { func (x *StatusReply) Reset() { *x = StatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_dcs_proto_msgTypes[8] + mi := &file_protos_dcs_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +1094,7 @@ func (x *StatusReply) String() string { func (*StatusReply) ProtoMessage() {} func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_dcs_proto_msgTypes[8] + mi := &file_protos_dcs_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +1107,7 @@ func (x *StatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_dcs_proto_rawDescGZIP(), []int{8} + return file_protos_dcs_proto_rawDescGZIP(), []int{9} } func (x *StatusReply) GetDetectorMatrix() []*DetectorInfo { @@ -1090,132 +1170,152 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8f, - 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, + 0x01, 0x0a, 0x0a, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, - 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, - 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, - 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, - 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0x8d, 0x01, 0x0a, 0x09, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, - 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, - 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, - 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, - 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, - 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, - 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x0b, 0x0a, 0x07, - 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, - 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, - 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, - 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, - 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, - 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, - 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, - 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, - 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, - 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, - 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xe3, 0x01, 0x0a, 0x0d, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, - 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, - 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, - 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, - 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, - 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, - 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, - 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, - 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, - 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, - 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, - 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, - 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, - 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x0c, 0x2a, 0xb0, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, - 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, - 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, - 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, - 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, - 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, - 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, - 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, - 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, - 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x22, 0x04, - 0x08, 0x0d, 0x10, 0x0f, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, - 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, - 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, - 0x01, 0x32, 0xdc, 0x01, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, - 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, - 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, - 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, - 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, + 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, + 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, + 0x9c, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, + 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, + 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, + 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, + 0x10, 0x1e, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, + 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, + 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, + 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, + 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, + 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, + 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, + 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, + 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, + 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, + 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, + 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, + 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, + 0x2a, 0xf2, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, + 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, + 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, + 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, + 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, + 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, + 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, + 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, + 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, + 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, + 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, + 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, + 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, + 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, + 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, + 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, + 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, + 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, + 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, + 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, + 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, + 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, + 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, + 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, + 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, + 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -1231,7 +1331,7 @@ func file_protos_dcs_proto_rawDescGZIP() []byte { } var file_protos_dcs_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_protos_dcs_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_protos_dcs_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_protos_dcs_proto_goTypes = []interface{}{ (EventType)(0), // 0: dcs.EventType (Detector)(0), // 1: dcs.Detector @@ -1243,14 +1343,15 @@ var file_protos_dcs_proto_goTypes = []interface{}{ (*SubscriptionRequest)(nil), // 7: dcs.SubscriptionRequest (*Event)(nil), // 8: dcs.Event (*DetectorOperationRequest)(nil), // 9: dcs.DetectorOperationRequest - (*SorRequest)(nil), // 10: dcs.SorRequest - (*EorRequest)(nil), // 11: dcs.EorRequest - (*RunEvent)(nil), // 12: dcs.RunEvent - (*StatusRequest)(nil), // 13: dcs.StatusRequest - (*StatusReply)(nil), // 14: dcs.StatusReply - nil, // 15: dcs.Event.ExtraParametersEntry - nil, // 16: dcs.DetectorOperationRequest.ExtraParametersEntry - nil, // 17: dcs.RunEvent.ExtraParametersEntry + (*PfrRequest)(nil), // 10: dcs.PfrRequest + (*SorRequest)(nil), // 11: dcs.SorRequest + (*EorRequest)(nil), // 12: dcs.EorRequest + (*RunEvent)(nil), // 13: dcs.RunEvent + (*StatusRequest)(nil), // 14: dcs.StatusRequest + (*StatusReply)(nil), // 15: dcs.StatusReply + nil, // 16: dcs.Event.ExtraParametersEntry + nil, // 17: dcs.DetectorOperationRequest.ExtraParametersEntry + nil, // 18: dcs.RunEvent.ExtraParametersEntry } var file_protos_dcs_proto_depIdxs = []int32{ 1, // 0: dcs.DetectorInfo.detector:type_name -> dcs.Detector @@ -1258,31 +1359,35 @@ var file_protos_dcs_proto_depIdxs = []int32{ 3, // 2: dcs.DetectorInfo.allowedRunTypes:type_name -> dcs.RunType 0, // 3: dcs.Event.eventtype:type_name -> dcs.EventType 6, // 4: dcs.Event.detectorMatrix:type_name -> dcs.DetectorInfo - 15, // 5: dcs.Event.extraParameters:type_name -> dcs.Event.ExtraParametersEntry + 16, // 5: dcs.Event.extraParameters:type_name -> dcs.Event.ExtraParametersEntry 1, // 6: dcs.DetectorOperationRequest.detector:type_name -> dcs.Detector - 16, // 7: dcs.DetectorOperationRequest.extraParameters:type_name -> dcs.DetectorOperationRequest.ExtraParametersEntry - 9, // 8: dcs.SorRequest.detectors:type_name -> dcs.DetectorOperationRequest - 3, // 9: dcs.SorRequest.runType:type_name -> dcs.RunType - 9, // 10: dcs.EorRequest.detectors:type_name -> dcs.DetectorOperationRequest - 0, // 11: dcs.RunEvent.eventtype:type_name -> dcs.EventType - 1, // 12: dcs.RunEvent.detector:type_name -> dcs.Detector - 2, // 13: dcs.RunEvent.state:type_name -> dcs.DetectorState - 17, // 14: dcs.RunEvent.extraParameters:type_name -> dcs.RunEvent.ExtraParametersEntry - 1, // 15: dcs.StatusRequest.detector:type_name -> dcs.Detector - 6, // 16: dcs.StatusReply.detectorMatrix:type_name -> dcs.DetectorInfo - 7, // 17: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest - 10, // 18: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest - 11, // 19: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest - 13, // 20: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest - 8, // 21: dcs.Configurator.Subscribe:output_type -> dcs.Event - 12, // 22: dcs.Configurator.StartOfRun:output_type -> dcs.RunEvent - 12, // 23: dcs.Configurator.EndOfRun:output_type -> dcs.RunEvent - 14, // 24: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply - 21, // [21:25] is the sub-list for method output_type - 17, // [17:21] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 17, // 7: dcs.DetectorOperationRequest.extraParameters:type_name -> dcs.DetectorOperationRequest.ExtraParametersEntry + 9, // 8: dcs.PfrRequest.detectors:type_name -> dcs.DetectorOperationRequest + 3, // 9: dcs.PfrRequest.runType:type_name -> dcs.RunType + 9, // 10: dcs.SorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 3, // 11: dcs.SorRequest.runType:type_name -> dcs.RunType + 9, // 12: dcs.EorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 0, // 13: dcs.RunEvent.eventtype:type_name -> dcs.EventType + 1, // 14: dcs.RunEvent.detector:type_name -> dcs.Detector + 2, // 15: dcs.RunEvent.state:type_name -> dcs.DetectorState + 18, // 16: dcs.RunEvent.extraParameters:type_name -> dcs.RunEvent.ExtraParametersEntry + 1, // 17: dcs.StatusRequest.detector:type_name -> dcs.Detector + 6, // 18: dcs.StatusReply.detectorMatrix:type_name -> dcs.DetectorInfo + 7, // 19: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest + 10, // 20: dcs.Configurator.PrepareForRun:input_type -> dcs.PfrRequest + 11, // 21: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest + 12, // 22: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest + 14, // 23: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest + 8, // 24: dcs.Configurator.Subscribe:output_type -> dcs.Event + 13, // 25: dcs.Configurator.PrepareForRun:output_type -> dcs.RunEvent + 13, // 26: dcs.Configurator.StartOfRun:output_type -> dcs.RunEvent + 13, // 27: dcs.Configurator.EndOfRun:output_type -> dcs.RunEvent + 15, // 28: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_protos_dcs_proto_init() } @@ -1340,7 +1445,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SorRequest); i { + switch v := v.(*PfrRequest); i { case 0: return &v.state case 1: @@ -1352,7 +1457,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EorRequest); i { + switch v := v.(*SorRequest); i { case 0: return &v.state case 1: @@ -1364,7 +1469,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunEvent); i { + switch v := v.(*EorRequest); i { case 0: return &v.state case 1: @@ -1376,7 +1481,7 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { + switch v := v.(*RunEvent); i { case 0: return &v.state case 1: @@ -1388,6 +1493,18 @@ func file_protos_dcs_proto_init() { } } file_protos_dcs_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_dcs_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusReply); i { case 0: return &v.state @@ -1406,7 +1523,7 @@ func file_protos_dcs_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_dcs_proto_rawDesc, NumEnums: 6, - NumMessages: 12, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index a38b54525..c3c0a9b99 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -85,10 +85,10 @@ message DetectorInfo { DetectorState state = 2;// state of this detector at the time of response generation string timestamp = 3; // time when the detector state is as declared repeated RunType allowedRunTypes = 4; // a list of run types that are currently - // possible with the given detector, taking into - // account all low-level information; - // for example, at a given moment TECHNICAL - // runs might be possible but not PHYSICS + // possible with the given detector, taking into + // account all low-level information; + // for example, at a given moment TECHNICAL + // runs might be possible but not PHYSICS } ////////////////////////////////////////////////////// @@ -113,13 +113,13 @@ message SubscriptionRequest { message Event { EventType eventtype = 1; // type of event being published by the DCS service repeated DetectorInfo detectorMatrix = 2; // detector-specific status payloads (optional depending - // on event type) + // on event type) map extraParameters = 3; // general key-value map just in case string timestamp = 4; // this corresponds to the moment where this Event-answer - // was valid from the source + // was valid from the source string message = 5; // optional user-facing error message, if the DCS wants to - // report an ECS-related error status (e.g. the reason for - // a failed SOR) to the user + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user } ////////////////////////////////////////////////////// @@ -162,14 +162,14 @@ message EorRequest { message RunEvent { EventType eventtype = 1; // type of event being published by the DCS service Detector detector = 2; // if detector==DCS, the update is a pre-closure summary - // of the current operation + // of the current operation DetectorState state = 3; // aggregate state for all detectors involved in current - // SOR/EOR operation + // SOR/EOR operation map extraParameters = 4; string timestamp = 5; string message = 6; // optional user-facing error message, if the DCS wants to - // report an ECS-related error status (e.g. the reason for - // a failed SOR) to the user + // report an ECS-related error status (e.g. the reason for + // a failed SOR) to the user } ////////////////////////////////////////////////////// @@ -187,7 +187,7 @@ message StatusRequest { // payloads. message StatusReply { repeated DetectorInfo detectorMatrix = 1; // an exhaustive list of DetectorInfos - // one for each detector + // one for each detector } ////////////////////////////////////////////////////// @@ -277,3 +277,4 @@ enum SorMode { // FIXME: unused FULL = 0; FAST = 1; } + diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 71b685526..b15aa3f6d 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -26,10 +26,21 @@ type ConfiguratorClient interface { // the DCS service. The server stops serving the stream when the client closes // it. Multiple concurrent stream subscriptions are allowed. Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) - // Single SOR request for a data taking session, with per-detector parameters. + // Single PFR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the PFR operation. Upon PFR completion (DetectorState.RUN_OK), the server + // closes the stream. + PrepareForRun(ctx context.Context, in *PfrRequest, opts ...grpc.CallOption) (Configurator_PrepareForRunClient, error) + // Single SOR request for a data taking session, with run number. // Returns an event stream which returns subsequent intermediate states within // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server // closes the stream. + // If the DetectorOperationRequest or run type parameters are the same as the + // last PrepareForRun request (no matter how far back in time) and the DCS + // state hasn't changed, the SOR operations should be fast. Otherwise, the SOR + // also implicitly includes any number of PrepareForRun operations as needed, + // this can take a while but should not change the overall behavior reported + // to ECS. StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) // Single EOR request for a data taking session, with per-detector parameters. // Returns an event stream which returns subsequent intermediate states within @@ -83,8 +94,40 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { return m, nil } +func (c *configuratorClient) PrepareForRun(ctx context.Context, in *PfrRequest, opts ...grpc.CallOption) (Configurator_PrepareForRunClient, error) { + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/PrepareForRun", opts...) + if err != nil { + return nil, err + } + x := &configuratorPrepareForRunClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Configurator_PrepareForRunClient interface { + Recv() (*RunEvent, error) + grpc.ClientStream +} + +type configuratorPrepareForRunClient struct { + grpc.ClientStream +} + +func (x *configuratorPrepareForRunClient) Recv() (*RunEvent, error) { + m := new(RunEvent) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/StartOfRun", opts...) if err != nil { return nil, err } @@ -116,7 +159,7 @@ func (x *configuratorStartOfRunClient) Recv() (*RunEvent, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/EndOfRun", opts...) if err != nil { return nil, err } @@ -164,10 +207,21 @@ type ConfiguratorServer interface { // the DCS service. The server stops serving the stream when the client closes // it. Multiple concurrent stream subscriptions are allowed. Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error - // Single SOR request for a data taking session, with per-detector parameters. + // Single PFR request for a data taking session, with per-detector parameters. + // Returns an event stream which returns subsequent intermediate states within + // the PFR operation. Upon PFR completion (DetectorState.RUN_OK), the server + // closes the stream. + PrepareForRun(*PfrRequest, Configurator_PrepareForRunServer) error + // Single SOR request for a data taking session, with run number. // Returns an event stream which returns subsequent intermediate states within // the SOR operation. Upon SOR completion (DetectorState.RUN_OK), the server // closes the stream. + // If the DetectorOperationRequest or run type parameters are the same as the + // last PrepareForRun request (no matter how far back in time) and the DCS + // state hasn't changed, the SOR operations should be fast. Otherwise, the SOR + // also implicitly includes any number of PrepareForRun operations as needed, + // this can take a while but should not change the overall behavior reported + // to ECS. StartOfRun(*SorRequest, Configurator_StartOfRunServer) error // Single EOR request for a data taking session, with per-detector parameters. // Returns an event stream which returns subsequent intermediate states within @@ -188,6 +242,9 @@ type UnimplementedConfiguratorServer struct { func (UnimplementedConfiguratorServer) Subscribe(*SubscriptionRequest, Configurator_SubscribeServer) error { return status.Errorf(codes.Unimplemented, "method Subscribe not implemented") } +func (UnimplementedConfiguratorServer) PrepareForRun(*PfrRequest, Configurator_PrepareForRunServer) error { + return status.Errorf(codes.Unimplemented, "method PrepareForRun not implemented") +} func (UnimplementedConfiguratorServer) StartOfRun(*SorRequest, Configurator_StartOfRunServer) error { return status.Errorf(codes.Unimplemented, "method StartOfRun not implemented") } @@ -230,6 +287,27 @@ func (x *configuratorSubscribeServer) Send(m *Event) error { return x.ServerStream.SendMsg(m) } +func _Configurator_PrepareForRun_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(PfrRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ConfiguratorServer).PrepareForRun(m, &configuratorPrepareForRunServer{stream}) +} + +type Configurator_PrepareForRunServer interface { + Send(*RunEvent) error + grpc.ServerStream +} + +type configuratorPrepareForRunServer struct { + grpc.ServerStream +} + +func (x *configuratorPrepareForRunServer) Send(m *RunEvent) error { + return x.ServerStream.SendMsg(m) +} + func _Configurator_StartOfRun_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(SorRequest) if err := stream.RecvMsg(m); err != nil { @@ -308,6 +386,11 @@ var Configurator_ServiceDesc = grpc.ServiceDesc{ Handler: _Configurator_Subscribe_Handler, ServerStreams: true, }, + { + StreamName: "PrepareForRun", + Handler: _Configurator_PrepareForRun_Handler, + ServerStreams: true, + }, { StreamName: "StartOfRun", Handler: _Configurator_StartOfRun_Handler, From 769ab99698ad86b260ae5d0b1febab875e7b3447 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 15 Jun 2023 16:21:06 +0200 Subject: [PATCH 1641/2352] [core] Enhance "creating Mesos task" message --- core/task/scheduler.go | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index e90d7dcf8..525c232fb 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -688,9 +688,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han for i := len(descriptorsPrematchToDeploy) - 1; i >= 0; i-- { descriptor := descriptorsPrematchToDeploy[i] - varStackBottom := descriptor.TaskRole.GetUserVars() - - descriptorDetector, ok := varStackBottom.Get("detector") + descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") if !ok { descriptorDetector = "" } @@ -820,9 +818,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { descriptor := descriptorsStillToDeploy[i] - varStackBottom := descriptor.TaskRole.GetUserVars() - - descriptorDetector, ok := varStackBottom.Get("detector") + descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") if !ok { descriptorDetector = "" } @@ -1490,11 +1486,28 @@ func makeTaskForMesosResources( // Append executor resources to request executorResources := mesos.Resources(state.executor.Resources) log.WithPrefix("scheduler"). + WithField("taskRole", taskPtr.GetParent().GetPath()). + WithField("targetHost", offer.Hostname). WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithField("taskResources", resourcesRequest). WithField("executorResources", executorResources). WithField("limits", limits). + WithField("controlPort", controlPort). + WithField("inboundChannels", func() string { + accu := make([]string, len(wants.InboundChannels)) + for i := 0; i < len(wants.InboundChannels); i++ { + channel := wants.InboundChannels[i] + accu[i] = channel.Name + if len(channel.Global) > 0 { + accu[i] += fmt.Sprintf(" (global: %s)", channel.Global) + } + if endpoint, ok := bindMap[channel.Name]; ok { + accu[i] += fmt.Sprintf(" -> %s", endpoint.GetAddress()) + } + } + return strings.Join(accu, ", ") + }()). Debug("creating Mesos task") resourcesRequest.Add(executorResources...) From 4c05410ba0fe916f7cf2c87e0850f8896f6dba0c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 15 Jun 2023 16:25:59 +0200 Subject: [PATCH 1642/2352] [build] Bump to v0.69.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index fd654893b..140ebfe51 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 68 -VERSION_PATCH := 1 +VERSION_MINOR := 69 +VERSION_PATCH := 0 From fda285dd5a8699cc40366346fed1967fa517dbe9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Jun 2023 15:50:08 +0200 Subject: [PATCH 1643/2352] [core] Cache run number for bookkeeping cleanup use --- core/environment/environment.go | 1 + core/integration/bookkeeping/plugin.go | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index e9f8142a9..a8db35aff 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -293,6 +293,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { } else if e.Event == "STOP_ACTIVITY" { // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. + env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) env.currentRunNumber = 0 env.workflow.GetVars().Del("run_number") env.workflow.GetVars().Del("runNumber") diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 65571195f..5237466f2 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1006,6 +1006,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "Bookkeeping UpdateRunStop call failed" rn := varStack["run_number"] + if len(rn) == 0 { + rn = varStack["last_run_number"] + log.WithField("partition", envId). + WithField(infologger.Run, rn). + Debug("run number no longer set, using last known run number for Bookkeeping UpdateRunStop") + } runNumber64, err := strconv.ParseInt(rn, 10, 32) if (strings.Contains(trigger, "DESTROY") || strings.Contains(trigger, "GO_ERROR")) && (rn == "" || runNumber64 == 0) { log.WithField("partition", envId). From 6e29cd45b68c2f0fd4bc5bb868d4883d96417564 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Jun 2023 15:50:35 +0200 Subject: [PATCH 1644/2352] [build] Bump to v0.69.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 140ebfe51..2ebb15eeb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 69 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 54ac1915c3d477fea40b2709241f4e14b490244e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Wed, 21 Jun 2023 12:56:37 +0200 Subject: [PATCH 1645/2352] Update docs on workflow/task configuration --- docs/handbook/configuration.md | 69 +++++++++++++++++++++++++++++++++- docs/handbook/overview.md | 44 ---------------------- 2 files changed, 67 insertions(+), 46 deletions(-) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 657b0a5fb..d07cba16d 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -1,4 +1,4 @@ -# Workflow and Task Configuration +# Workflow Configuration ## Non-critical tasks @@ -16,4 +16,69 @@ roles: critical: false ``` -In the absence of an explicit `critical` trait for a given task role, the assumed default value is `critical: true`. \ No newline at end of file +In the absence of an explicit `critical` trait for a given task role, the assumed default value is `critical: true`. + +## State machine callbacks + +The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). +This is the order of callback execution upon a state transition: +1. `before_` - called before event named `` +2. `before_event` - called before all events +3. `leave_` - called before leaving `` +4. `leave_state` - called before leaving all states +5. `enter_`, `` - called after entering `` +6. `enter_state` - called after entering all states +7. `after_`, `` - called after event named `` +8. `after_event` - called after all events + +Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. + +## Workflow hook calls + +The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. +* `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). +* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. +* `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. +* `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time `func` will be granted to complete before its context is invalidated. +* `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. + +Consider the following example: +``` +# Trigger and await are different: any number of other operations may happen concurrently in between. Regardless of when in time the call actually finishes, its result isn't collected until the environment state machine reaches `after_RESET+0`. The state machine will only block if it reaches `after_RESET+0` and the call isn't done yet (completed or timed out). + - name: reset + call: + func: odc.Reset() + trigger: before_RESET + await: after_RESET + timeout: "{{ odc_reset_timeout }}" + critical: true +# Trigger and await are the same (the await expression could be omitted here): the call must begin and end within the `after_RESET+100` step. If the workflow template defines no other calls straddling `after_RESET+100` then this call is fully serialized with respect to the state machine and its execution blocks everything else. + - name: part-term + call: + func: odc.PartitionTerminate() + trigger: after_RESET+100 + await: after_RESET+100 + timeout: "{{ odc_partitionterminate_timeout }}" + critical: true +``` + +# Task Configuration + +## Resource wants and limits + +All task templates allow two top-level blocks with identical syntax: `wants` and `limits`. They are used to specify respectively the minimum claimed resources that the task will request from Mesos, and the maximum resource allowance which, if exceeded, will result in the task being killed. + +Of these two blocks, `wants` is mandatory, and the absence of a `limits` block assumes unlimited resource usage is allowed for tasks generated from this template. + +Resource types currently supported are `cpu` and `memory`. Both are of type `float`, and they represent respectively the number (or fraction) of CPU cores, and the amount of memory (including physical and swap) always expressed in MB (see example of a task template file below). + +``` +name: readout +wants: + cpu: 0.15 # 15% of one CPU core + memory: 128 # 128 MB +limits: + memory: 8192 # 8 GB, all tasks on this machine will be killed if exceeded; cpu unlimited +defaults: + (...) +``` \ No newline at end of file diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index 7a4b79e4c..2d3bcb481 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -41,47 +41,3 @@ The main state machine of AliECS is the environment state machine, which represe ![](AliECS-envsm.svg) While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](https://alice-flp-suite.docs.cern.ch/aliecs/occ/) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. - -## State machine callbacks - -The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). -This is the order of callback execution upon a state transition: -1. `before_` - called before event named `` -2. `before_event` - called before all events -3. `leave_` - called before leaving `` -4. `leave_state` - called before leaving all states -5. `enter_`, `` - called after entering `` -6. `enter_state` - called after entering all states -7. `after_`, `` - called after event named `` -8. `after_event` - called after all events - -Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. - -## Workflow hook calls - -The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. -* `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). -* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. -* `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. -* `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time `func` will be granted to complete before its context is invalidated. -* `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. - -Consider the following example: -``` -# Trigger and await are different: any number of other operations may happen concurrently in between. Regardless of when in time the call actually finishes, its result isn't collected until the environment state machine reaches `after_RESET+0`. The state machine will only block if it reaches `after_RESET+0` and the call isn't done yet (completed or timed out). - - name: reset - call: - func: odc.Reset() - trigger: before_RESET - await: after_RESET - timeout: "{{ odc_reset_timeout }}" - critical: true -# Trigger and await are the same (the await expression could be omitted here): the call must begin and end within the `after_RESET+100` step. If the workflow template defines no other calls straddling `after_RESET+100` then this call is fully serialized with respect to the state machine and its execution blocks everything else. - - name: part-term - call: - func: odc.PartitionTerminate() - trigger: after_RESET+100 - await: after_RESET+100 - timeout: "{{ odc_partitionterminate_timeout }}" - critical: true -``` From 82d6cc3c70e6b52bc9fdb26e5509426049327349 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 26 Jun 2023 09:05:21 +0200 Subject: [PATCH 1646/2352] [O2-2818][core] Disable autoBind in FairMQ This makes FairMQ produce an error when failing to bind a port instead of selecting a random one in the range 22000-23000, which is useless in our case. Probably not related to OCTRL-773, but should fix O2-2818, where we obliviously run a QC proxy which could not bind a port due to a leftover task on the same machine. --- core/task/channel/inbound.go | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 5cd7ee268..8afc6cf6c 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -152,19 +152,20 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm prefix := strings.Join([]string{chans, chName, "0"}, ".") chanProps := controlcommands.PropertyMap{ - "address": address, - "method": "bind", - "rateLogging": inbound.RateLogging, - "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), + "address": address, + "method": "bind", + "autoBind": "false", + "rateLogging": inbound.RateLogging, + "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(inbound.SndBufSize), + "sndBufSize": strconv.Itoa(inbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": inbound.Type.String(), + "transport": transport.String(), + "type": inbound.Type.String(), } for k, v := range chanProps { - pm[prefix + "." + k] = v + pm[prefix+"."+k] = v } return } From 2449e8640c4dcce10b337233d17d93e87471b7db Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 14 Jun 2023 17:30:36 +0200 Subject: [PATCH 1647/2352] [OCTRL-791] Allow to fetch LHC fill info from BK, propagate to varStack --- core/integration/bookkeeping/client.go | 2 + core/integration/bookkeeping/plugin.go | 163 +++++- .../bookkeeping/protos/common.pb.go | 294 ++++++++--- .../bookkeeping/protos/common.proto | 13 + .../bookkeeping/protos/environment.pb.go | 4 +- .../bookkeeping/protos/environment_grpc.pb.go | 4 - core/integration/bookkeeping/protos/flp.pb.go | 4 +- .../bookkeeping/protos/flp_grpc.pb.go | 4 - .../bookkeeping/protos/lhcFill.pb.go | 215 ++++++++ .../bookkeeping/protos/lhcFill.proto | 23 + .../bookkeeping/protos/lhcFill_grpc.pb.go | 99 ++++ core/integration/bookkeeping/protos/log.pb.go | 4 +- .../bookkeeping/protos/log_grpc.pb.go | 4 - core/integration/bookkeeping/protos/run.pb.go | 472 +++++++++++++----- core/integration/bookkeeping/protos/run.proto | 23 + .../bookkeeping/protos/run_grpc.pb.go | 40 +- go.mod | 2 +- go.sum | 2 + 18 files changed, 1138 insertions(+), 234 deletions(-) create mode 100644 core/integration/bookkeeping/protos/lhcFill.pb.go create mode 100644 core/integration/bookkeeping/protos/lhcFill.proto create mode 100644 core/integration/bookkeeping/protos/lhcFill_grpc.pb.go diff --git a/core/integration/bookkeeping/client.go b/core/integration/bookkeeping/client.go index 656535392..6cc155912 100644 --- a/core/integration/bookkeeping/client.go +++ b/core/integration/bookkeeping/client.go @@ -45,6 +45,7 @@ type RpcClient struct { bkpb.FlpServiceClient bkpb.LogServiceClient bkpb.RunServiceClient + bkpb.LhcFillServiceClient conn *grpc.ClientConn cancel context.CancelFunc } @@ -119,6 +120,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) FlpServiceClient: bkpb.NewFlpServiceClient(conn), LogServiceClient: bkpb.NewLogServiceClient(conn), RunServiceClient: bkpb.NewRunServiceClient(conn), + LhcFillServiceClient: bkpb.NewLhcFillServiceClient(conn), conn: conn, cancel: cancel, } diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 5237466f2..0451bdff5 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -28,6 +28,7 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/flp.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/log.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/run.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/lhcFill.proto package bookkeeping @@ -54,8 +55,9 @@ import ( ) const ( - BKP_RUN_TIMEOUT = 30 * time.Second - BKP_ENV_TIMEOUT = 30 * time.Second + BKP_RUN_TIMEOUT = 30 * time.Second + BKP_ENV_TIMEOUT = 30 * time.Second + BKP_FILL_TIMEOUT = 30 * time.Second ) type Plugin struct { @@ -1267,6 +1269,163 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + /*************************************/ + /******** Fill info functions ********/ + /*************************************/ + + fetchLHCInfoForRun := func(runNumber int32) (out *bkpb.LHCFill, err error) { + runFetchRequest := bkpb.RunFetchRequest{RunNumber: runNumber} + + timeout := callable.AcquireTimeout(BKP_FILL_TIMEOUT, varStack, "RetrieveFillInfo", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Debugf("requesting BK the run info for run %d", runNumber) + runWithRelations, err := p.bookkeepingClient.RunServiceClient.Get(ctx, &runFetchRequest, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + lhcFill := runWithRelations.GetLhcFill() + if lhcFill == nil { + return nil, fmt.Errorf("lhcFill for run %d is nil", runNumber) + } + return lhcFill, nil + } + + fetchLatestLHCInfo := func() (out *bkpb.LHCFill, err error) { + lhcFillFetchRequest := bkpb.LastLhcFillFetchRequest{} + + timeout := callable.AcquireTimeout(BKP_FILL_TIMEOUT, varStack, "RetrieveFillInfo", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Debug("requesting BK the latest LHC fill info") + LhcFillWithRelations, err := p.bookkeepingClient.LhcFillServiceClient.GetLast(ctx, &lhcFillFetchRequest, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + lhcFill := LhcFillWithRelations.GetLhcFill() + if lhcFill == nil { + return nil, fmt.Errorf("lhcFill is nil") + } + return lhcFill, nil + } + + propagateLHCInfoToVarStack := func(lhcInfo *bkpb.LHCFill, varStack map[string]string) { + call.VarStack["fill_info_fill_number"] = string(lhcInfo.FillNumber) + call.VarStack["fill_info_filling_scheme"] = lhcInfo.FillingSchemeName + call.VarStack["fill_info_beam_type"] = lhcInfo.BeamType + if lhcInfo.StableBeamStart != nil { + call.VarStack["fill_info_stable_beam_start_ms"] = strconv.FormatInt(*lhcInfo.StableBeamStart, 10) + } + if lhcInfo.StableBeamEnd != nil { + call.VarStack["fill_info_stable_beam_end_ms"] = strconv.FormatInt(*lhcInfo.StableBeamEnd, 10) + } + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Infof("successfully updated the LHC Fill info (number %d, scheme %s, beam type %s)", + lhcInfo.FillNumber, lhcInfo.FillingSchemeName, lhcInfo.BeamType) + } + deleteLHCInfoInVarStack := func(varStack map[string]string) { + delete(call.VarStack, "fill_info_fill_number") + delete(call.VarStack, "fill_info_filling_scheme") + delete(call.VarStack, "fill_info_beam_type") + delete(call.VarStack, "fill_info_stable_beam_start_ms") + delete(call.VarStack, "fill_info_stable_beam_end_ms") + } + + stack["RetrieveFillInfo"] = func() (out string) { + callFailedStr := "Bookkeeping RetrieveFillInfo call failed" + if p.bookkeepingClient == nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "RetrieveFillInfo"). + Error("bookkeeping plugin RetrieveFillInfo error") + call.VarStack["__call_error_reason"] = "bookkeeping plugin not initialized, RetrieveFillInfo impossible" + call.VarStack["__call_error"] = callFailedStr + return + } + + // First, we try to get fill info associated to a run. + // At the time of writing, it is not correctly associated for SYNTHETIC runs, + // but it might be in the future. + // Only if there is no fill info associated with a run (e.g. because we ask BK too early during SOR), + // we ask for the latest LHC fill and will use if the end time of stable beams is not set. + rn := varStack["run_number"] + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + WithError(err). + Info("cannot acquire run number for Bookkeeping fill info fetch, perhaps we are not in RUNNING") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else { + lhcFill, err := fetchLHCInfoForRun(int32(runNumber64)) + if err != nil { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Infof("could not get LHC fill info associated to run %d, will try to get the latest fill. Details: %s", runNumber64, err.Error()) + } else { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Infof("received a reply about fill info associated to run %d, filling", runNumber64) + propagateLHCInfoToVarStack(lhcFill, varStack) + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Infof("successfully updated the LHC Fill info for run %d (number %d, scheme %s, beam type %s)", + runNumber64, lhcFill.FillNumber, lhcFill.FillingSchemeName, lhcFill.BeamType) + return + } + } + + lhcFill, err := fetchLatestLHCInfo() + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("partition", envId). + WithField("call", "RetrieveFillInfo"). + Error("bookkeeping plugin RetrieveFillInfo error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } else if lhcFill.StableBeamEnd == nil || *lhcFill.StableBeamEnd != 0 { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Debug("received a reply about fill info, filling the var stack") + propagateLHCInfoToVarStack(lhcFill, varStack) + } else { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Debug("received a reply about fill info, but the stable beam end is in the past, will not read the fill info and will delete any existing") + deleteLHCInfoInVarStack(varStack) + } + return + } + return } diff --git a/core/integration/bookkeeping/protos/common.pb.go b/core/integration/bookkeeping/protos/common.pb.go index 95aa6f8a1..18b86c8db 100644 --- a/core/integration/bookkeeping/protos/common.pb.go +++ b/core/integration/bookkeeping/protos/common.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.15.8 // source: protos/common.proto package bkpb @@ -118,6 +118,7 @@ const ( RunQuality_RUN_QUALITY_BAD RunQuality = 1 RunQuality_RUN_QUALITY_GOOD RunQuality = 2 RunQuality_RUN_QUALITY_TEST RunQuality = 3 + RunQuality_RUN_QUALITY_NONE RunQuality = 4 ) // Enum value maps for RunQuality. @@ -127,12 +128,14 @@ var ( 1: "RUN_QUALITY_BAD", 2: "RUN_QUALITY_GOOD", 3: "RUN_QUALITY_TEST", + 4: "RUN_QUALITY_NONE", } RunQuality_value = map[string]int32{ "RUN_QUALITY_NULL": 0, "RUN_QUALITY_BAD": 1, "RUN_QUALITY_GOOD": 2, "RUN_QUALITY_TEST": 3, + "RUN_QUALITY_NONE": 4, } ) @@ -549,6 +552,96 @@ func (x *Run) GetLhcPeriod() string { return "" } +type LHCFill struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FillNumber int32 `protobuf:"varint,1,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` + // Timestamp of the start of the stable beam (if it applies) + StableBeamStart *int64 `protobuf:"varint,2,opt,name=stableBeamStart,proto3,oneof" json:"stableBeamStart,omitempty"` + // Timestamp of the end of the stable beam (if it applies) + StableBeamEnd *int64 `protobuf:"varint,3,opt,name=stableBeamEnd,proto3,oneof" json:"stableBeamEnd,omitempty"` + // Duration of the stable beam (if it applies) + StableBeamDuration *int64 `protobuf:"varint,4,opt,name=stableBeamDuration,proto3,oneof" json:"stableBeamDuration,omitempty"` + BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` + FillingSchemeName string `protobuf:"bytes,6,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` +} + +func (x *LHCFill) Reset() { + *x = LHCFill{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LHCFill) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LHCFill) ProtoMessage() {} + +func (x *LHCFill) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LHCFill.ProtoReflect.Descriptor instead. +func (*LHCFill) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{1} +} + +func (x *LHCFill) GetFillNumber() int32 { + if x != nil { + return x.FillNumber + } + return 0 +} + +func (x *LHCFill) GetStableBeamStart() int64 { + if x != nil && x.StableBeamStart != nil { + return *x.StableBeamStart + } + return 0 +} + +func (x *LHCFill) GetStableBeamEnd() int64 { + if x != nil && x.StableBeamEnd != nil { + return *x.StableBeamEnd + } + return 0 +} + +func (x *LHCFill) GetStableBeamDuration() int64 { + if x != nil && x.StableBeamDuration != nil { + return *x.StableBeamDuration + } + return 0 +} + +func (x *LHCFill) GetBeamType() string { + if x != nil { + return x.BeamType + } + return "" +} + +func (x *LHCFill) GetFillingSchemeName() string { + if x != nil { + return x.FillingSchemeName + } + return "" +} + type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -565,7 +658,7 @@ type User struct { func (x *User) Reset() { *x = User{} if protoimpl.UnsafeEnabled { - mi := &file_protos_common_proto_msgTypes[1] + mi := &file_protos_common_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -578,7 +671,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_protos_common_proto_msgTypes[1] + mi := &file_protos_common_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -591,7 +684,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{1} + return file_protos_common_proto_rawDescGZIP(), []int{2} } func (x *User) GetExternalId() int32 { @@ -688,81 +781,102 @@ var file_protos_common_proto_rawDesc = []byte{ 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x22, 0x4a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, - 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, - 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, - 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, - 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, - 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, - 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, - 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, - 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x63, 0x0a, 0x0a, 0x52, 0x75, - 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, - 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, - 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, - 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, - 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, - 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x2a, - 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, - 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, - 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, - 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, - 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, - 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, - 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, - 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, - 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, - 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, - 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, - 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, - 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, - 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, - 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x69, 0x6f, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x2d, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x12, 0x73, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, + 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, + 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x10, 0x0a, + 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x42, + 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, + 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, + 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, + 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, + 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, + 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, + 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, + 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, + 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, + 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, + 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, + 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, + 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x2a, 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, + 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, + 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, + 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, + 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, + 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, + 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, + 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, + 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, + 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, + 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, + 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, + 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -778,13 +892,14 @@ func file_protos_common_proto_rawDescGZIP() []byte { } var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_protos_common_proto_goTypes = []interface{}{ (Detector)(0), // 0: o2.bookkeeping.Detector (RunQuality)(0), // 1: o2.bookkeeping.RunQuality (RunType)(0), // 2: o2.bookkeeping.RunType (*Run)(nil), // 3: o2.bookkeeping.Run - (*User)(nil), // 4: o2.bookkeeping.User + (*LHCFill)(nil), // 4: o2.bookkeeping.LHCFill + (*User)(nil), // 5: o2.bookkeeping.User } var file_protos_common_proto_depIdxs = []int32{ 1, // 0: o2.bookkeeping.Run.runQuality:type_name -> o2.bookkeeping.RunQuality @@ -816,6 +931,18 @@ func file_protos_common_proto_init() { } } file_protos_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LHCFill); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*User); i { case 0: return &v.state @@ -828,13 +955,14 @@ func file_protos_common_proto_init() { } } } + file_protos_common_proto_msgTypes[1].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_common_proto_rawDesc, NumEnums: 3, - NumMessages: 2, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, diff --git a/core/integration/bookkeeping/protos/common.proto b/core/integration/bookkeeping/protos/common.proto index 8fe7a1222..9413c5733 100644 --- a/core/integration/bookkeeping/protos/common.proto +++ b/core/integration/bookkeeping/protos/common.proto @@ -38,6 +38,7 @@ enum RunQuality { RUN_QUALITY_BAD = 1; RUN_QUALITY_GOOD = 2; RUN_QUALITY_TEST = 3; + RUN_QUALITY_NONE = 4; } enum RunType { @@ -105,6 +106,18 @@ message Run { string lhcPeriod = 31; } +message LHCFill { + int32 fillNumber = 1; + // Timestamp of the start of the stable beam (if it applies) + optional int64 stableBeamStart = 2; + // Timestamp of the end of the stable beam (if it applies) + optional int64 stableBeamEnd = 3; + // Duration of the stable beam (if it applies) + optional int64 stableBeamDuration = 4; + string beamType = 5; + string fillingSchemeName = 6; +} + message User { // The unique CERN identifier of this user. int32 externalId = 1; diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index 1cfd33666..ce9933c96 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.15.8 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index d9c1700f6..88b5f97f7 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 -// source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index e2672ac7a..d598f0aa8 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.15.8 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index 42ec2d071..f4fc752f3 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 -// source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill.pb.go b/core/integration/bookkeeping/protos/lhcFill.pb.go new file mode 100644 index 000000000..4bc2ab559 --- /dev/null +++ b/core/integration/bookkeeping/protos/lhcFill.pb.go @@ -0,0 +1,215 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.1 +// protoc v3.15.8 +// source: protos/lhcFill.proto + +package bkpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type LastLhcFillFetchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *LastLhcFillFetchRequest) Reset() { + *x = LastLhcFillFetchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_lhcFill_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LastLhcFillFetchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LastLhcFillFetchRequest) ProtoMessage() {} + +func (x *LastLhcFillFetchRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_lhcFill_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LastLhcFillFetchRequest.ProtoReflect.Descriptor instead. +func (*LastLhcFillFetchRequest) Descriptor() ([]byte, []int) { + return file_protos_lhcFill_proto_rawDescGZIP(), []int{0} +} + +type LhcFillWithRelations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LhcFill *LHCFill `protobuf:"bytes,1,opt,name=lhcFill,proto3" json:"lhcFill,omitempty"` // For now we do not include relations to LHC fill +} + +func (x *LhcFillWithRelations) Reset() { + *x = LhcFillWithRelations{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_lhcFill_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LhcFillWithRelations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LhcFillWithRelations) ProtoMessage() {} + +func (x *LhcFillWithRelations) ProtoReflect() protoreflect.Message { + mi := &file_protos_lhcFill_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LhcFillWithRelations.ProtoReflect.Descriptor instead. +func (*LhcFillWithRelations) Descriptor() ([]byte, []int) { + return file_protos_lhcFill_proto_rawDescGZIP(), []int{1} +} + +func (x *LhcFillWithRelations) GetLhcFill() *LHCFill { + if x != nil { + return x.LhcFill + } + return nil +} + +var File_protos_lhcFill_proto protoreflect.FileDescriptor + +var file_protos_lhcFill_proto_rawDesc = []byte{ + 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x4c, + 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, + 0x6c, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, + 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x52, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, + 0x6c, 0x32, 0x6a, 0x0a, 0x0e, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x12, 0x27, + 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, + 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x4a, 0x5a, + 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_protos_lhcFill_proto_rawDescOnce sync.Once + file_protos_lhcFill_proto_rawDescData = file_protos_lhcFill_proto_rawDesc +) + +func file_protos_lhcFill_proto_rawDescGZIP() []byte { + file_protos_lhcFill_proto_rawDescOnce.Do(func() { + file_protos_lhcFill_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_lhcFill_proto_rawDescData) + }) + return file_protos_lhcFill_proto_rawDescData +} + +var file_protos_lhcFill_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_lhcFill_proto_goTypes = []interface{}{ + (*LastLhcFillFetchRequest)(nil), // 0: o2.bookkeeping.LastLhcFillFetchRequest + (*LhcFillWithRelations)(nil), // 1: o2.bookkeeping.LhcFillWithRelations + (*LHCFill)(nil), // 2: o2.bookkeeping.LHCFill +} +var file_protos_lhcFill_proto_depIdxs = []int32{ + 2, // 0: o2.bookkeeping.LhcFillWithRelations.lhcFill:type_name -> o2.bookkeeping.LHCFill + 0, // 1: o2.bookkeeping.LhcFillService.GetLast:input_type -> o2.bookkeeping.LastLhcFillFetchRequest + 1, // 2: o2.bookkeeping.LhcFillService.GetLast:output_type -> o2.bookkeeping.LhcFillWithRelations + 2, // [2:3] is the sub-list for method output_type + 1, // [1:2] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_protos_lhcFill_proto_init() } +func file_protos_lhcFill_proto_init() { + if File_protos_lhcFill_proto != nil { + return + } + file_protos_common_proto_init() + if !protoimpl.UnsafeEnabled { + file_protos_lhcFill_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LastLhcFillFetchRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_lhcFill_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LhcFillWithRelations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_lhcFill_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_protos_lhcFill_proto_goTypes, + DependencyIndexes: file_protos_lhcFill_proto_depIdxs, + MessageInfos: file_protos_lhcFill_proto_msgTypes, + }.Build() + File_protos_lhcFill_proto = out.File + file_protos_lhcFill_proto_rawDesc = nil + file_protos_lhcFill_proto_goTypes = nil + file_protos_lhcFill_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/lhcFill.proto b/core/integration/bookkeeping/protos/lhcFill.proto new file mode 100644 index 000000000..0b97e48c9 --- /dev/null +++ b/core/integration/bookkeeping/protos/lhcFill.proto @@ -0,0 +1,23 @@ +syntax = 'proto3'; + +package o2.bookkeeping; +option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; + +import 'protos/common.proto'; + +// Services + +service LhcFillService { + rpc GetLast(LastLhcFillFetchRequest) returns (LhcFillWithRelations); +} + +// High level messages + +message LastLhcFillFetchRequest { + // For now, request is empty +} + +message LhcFillWithRelations { + LHCFill lhcFill = 1; + // For now we do not include relations to LHC fill +} diff --git a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go new file mode 100644 index 000000000..307ee051c --- /dev/null +++ b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go @@ -0,0 +1,99 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. + +package bkpb + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +// LhcFillServiceClient is the client API for LhcFillService service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type LhcFillServiceClient interface { + GetLast(ctx context.Context, in *LastLhcFillFetchRequest, opts ...grpc.CallOption) (*LhcFillWithRelations, error) +} + +type lhcFillServiceClient struct { + cc grpc.ClientConnInterface +} + +func NewLhcFillServiceClient(cc grpc.ClientConnInterface) LhcFillServiceClient { + return &lhcFillServiceClient{cc} +} + +func (c *lhcFillServiceClient) GetLast(ctx context.Context, in *LastLhcFillFetchRequest, opts ...grpc.CallOption) (*LhcFillWithRelations, error) { + out := new(LhcFillWithRelations) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.LhcFillService/GetLast", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// LhcFillServiceServer is the server API for LhcFillService service. +// All implementations should embed UnimplementedLhcFillServiceServer +// for forward compatibility +type LhcFillServiceServer interface { + GetLast(context.Context, *LastLhcFillFetchRequest) (*LhcFillWithRelations, error) +} + +// UnimplementedLhcFillServiceServer should be embedded to have forward compatible implementations. +type UnimplementedLhcFillServiceServer struct { +} + +func (UnimplementedLhcFillServiceServer) GetLast(context.Context, *LastLhcFillFetchRequest) (*LhcFillWithRelations, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLast not implemented") +} + +// UnsafeLhcFillServiceServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to LhcFillServiceServer will +// result in compilation errors. +type UnsafeLhcFillServiceServer interface { + mustEmbedUnimplementedLhcFillServiceServer() +} + +func RegisterLhcFillServiceServer(s grpc.ServiceRegistrar, srv LhcFillServiceServer) { + s.RegisterService(&LhcFillService_ServiceDesc, srv) +} + +func _LhcFillService_GetLast_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LastLhcFillFetchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LhcFillServiceServer).GetLast(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.LhcFillService/GetLast", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LhcFillServiceServer).GetLast(ctx, req.(*LastLhcFillFetchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +// LhcFillService_ServiceDesc is the grpc.ServiceDesc for LhcFillService service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var LhcFillService_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "o2.bookkeeping.LhcFillService", + HandlerType: (*LhcFillServiceServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetLast", + Handler: _LhcFillService_GetLast_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "protos/lhcFill.proto", +} diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index dc5adee1a..65d6ca66a 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.15.8 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 7261a6527..5a8a4201f 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 -// source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 6fe183012..4731ce7c5 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.27.1 +// protoc v3.15.8 // source: protos/run.proto package bkpb @@ -20,6 +20,167 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type RunRelations int32 + +const ( + // IGNORED - Here to comply with proto specification + RunRelations_RUN_RELATIONS_NULL RunRelations = 0 + // Include the LHC fill related to the run + RunRelations_RUN_RELATIONS_LHC_FILL RunRelations = 1 +) + +// Enum value maps for RunRelations. +var ( + RunRelations_name = map[int32]string{ + 0: "RUN_RELATIONS_NULL", + 1: "RUN_RELATIONS_LHC_FILL", + } + RunRelations_value = map[string]int32{ + "RUN_RELATIONS_NULL": 0, + "RUN_RELATIONS_LHC_FILL": 1, + } +) + +func (x RunRelations) Enum() *RunRelations { + p := new(RunRelations) + *p = x + return p +} + +func (x RunRelations) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunRelations) Descriptor() protoreflect.EnumDescriptor { + return file_protos_run_proto_enumTypes[0].Descriptor() +} + +func (RunRelations) Type() protoreflect.EnumType { + return &file_protos_run_proto_enumTypes[0] +} + +func (x RunRelations) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunRelations.Descriptor instead. +func (RunRelations) EnumDescriptor() ([]byte, []int) { + return file_protos_run_proto_rawDescGZIP(), []int{0} +} + +type RunFetchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + // Specify the list of relations to fetch alongside the run + // For example if this contains RUN_RELATIONS_LHC_FILL then the returned RunWithRelation will have a populated + // lhcFill, else it will not be defined + Relations []RunRelations `protobuf:"varint,2,rep,packed,name=relations,proto3,enum=o2.bookkeeping.RunRelations" json:"relations,omitempty"` +} + +func (x *RunFetchRequest) Reset() { + *x = RunFetchRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_run_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunFetchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunFetchRequest) ProtoMessage() {} + +func (x *RunFetchRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_run_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunFetchRequest.ProtoReflect.Descriptor instead. +func (*RunFetchRequest) Descriptor() ([]byte, []int) { + return file_protos_run_proto_rawDescGZIP(), []int{0} +} + +func (x *RunFetchRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *RunFetchRequest) GetRelations() []RunRelations { + if x != nil { + return x.Relations + } + return nil +} + +type RunWithRelations struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Run *Run `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + LhcFill *LHCFill `protobuf:"bytes,2,opt,name=lhcFill,proto3,oneof" json:"lhcFill,omitempty"` +} + +func (x *RunWithRelations) Reset() { + *x = RunWithRelations{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_run_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunWithRelations) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunWithRelations) ProtoMessage() {} + +func (x *RunWithRelations) ProtoReflect() protoreflect.Message { + mi := &file_protos_run_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunWithRelations.ProtoReflect.Descriptor instead. +func (*RunWithRelations) Descriptor() ([]byte, []int) { + return file_protos_run_proto_rawDescGZIP(), []int{1} +} + +func (x *RunWithRelations) GetRun() *Run { + if x != nil { + return x.Run + } + return nil +} + +func (x *RunWithRelations) GetLhcFill() *LHCFill { + if x != nil { + return x.LhcFill + } + return nil +} + type RunCreationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -42,7 +203,7 @@ type RunCreationRequest struct { func (x *RunCreationRequest) Reset() { *x = RunCreationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_run_proto_msgTypes[0] + mi := &file_protos_run_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -55,7 +216,7 @@ func (x *RunCreationRequest) String() string { func (*RunCreationRequest) ProtoMessage() {} func (x *RunCreationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_run_proto_msgTypes[0] + mi := &file_protos_run_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -68,7 +229,7 @@ func (x *RunCreationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunCreationRequest.ProtoReflect.Descriptor instead. func (*RunCreationRequest) Descriptor() ([]byte, []int) { - return file_protos_run_proto_rawDescGZIP(), []int{0} + return file_protos_run_proto_rawDescGZIP(), []int{2} } func (x *RunCreationRequest) GetEnvironmentId() string { @@ -179,7 +340,7 @@ type RunUpdateRequest struct { func (x *RunUpdateRequest) Reset() { *x = RunUpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_run_proto_msgTypes[1] + mi := &file_protos_run_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -192,7 +353,7 @@ func (x *RunUpdateRequest) String() string { func (*RunUpdateRequest) ProtoMessage() {} func (x *RunUpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_run_proto_msgTypes[1] + mi := &file_protos_run_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -205,7 +366,7 @@ func (x *RunUpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunUpdateRequest.ProtoReflect.Descriptor instead. func (*RunUpdateRequest) Descriptor() ([]byte, []int) { - return file_protos_run_proto_rawDescGZIP(), []int{1} + return file_protos_run_proto_rawDescGZIP(), []int{3} } func (x *RunUpdateRequest) GetRunNumber() int32 { @@ -312,105 +473,128 @@ var file_protos_run_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbb, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, - 0x6c, 0x70, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, - 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x15, 0x0a, 0x06, 0x64, 0x64, 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, - 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x35, - 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x6f, - 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x16, 0x0a, - 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xf6, 0x06, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x46, 0x65, + 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, - 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, - 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x21, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x01, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x88, - 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, - 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x05, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, - 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, - 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, - 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, - 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x08, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, - 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, - 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x65, - 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, - 0x72, 0x69, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, - 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, - 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, - 0x0a, 0x0a, 0x5f, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, - 0x5f, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, - 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, - 0x5f, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, - 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x32, 0x90, - 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, - 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, + 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7d, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, + 0x36, 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x6c, 0x68, 0x63, + 0x46, 0x69, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6c, 0x68, 0x63, 0x46, + 0x69, 0x6c, 0x6c, 0x22, 0xbb, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, - 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, - 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, - 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, + 0x06, 0x64, 0x64, 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, + 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, + 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, + 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, + 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0xf6, 0x06, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x69, 0x6d, + 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, + 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, + 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, + 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, + 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x74, 0x66, + 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, + 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, + 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, + 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x13, 0x6f, 0x64, + 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, + 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, + 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, + 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x42, + 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, + 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, + 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x2a, 0x42, 0x0a, 0x0c, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, + 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, + 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x53, 0x5f, 0x4c, 0x48, 0x43, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, 0x32, 0xda, + 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, + 0x03, 0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -425,26 +609,36 @@ func file_protos_run_proto_rawDescGZIP() []byte { return file_protos_run_proto_rawDescData } -var file_protos_run_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_run_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_run_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_protos_run_proto_goTypes = []interface{}{ - (*RunCreationRequest)(nil), // 0: o2.bookkeeping.RunCreationRequest - (*RunUpdateRequest)(nil), // 1: o2.bookkeeping.RunUpdateRequest - (RunType)(0), // 2: o2.bookkeeping.RunType - (Detector)(0), // 3: o2.bookkeeping.Detector - (*Run)(nil), // 4: o2.bookkeeping.Run + (RunRelations)(0), // 0: o2.bookkeeping.RunRelations + (*RunFetchRequest)(nil), // 1: o2.bookkeeping.RunFetchRequest + (*RunWithRelations)(nil), // 2: o2.bookkeeping.RunWithRelations + (*RunCreationRequest)(nil), // 3: o2.bookkeeping.RunCreationRequest + (*RunUpdateRequest)(nil), // 4: o2.bookkeeping.RunUpdateRequest + (*Run)(nil), // 5: o2.bookkeeping.Run + (*LHCFill)(nil), // 6: o2.bookkeeping.LHCFill + (RunType)(0), // 7: o2.bookkeeping.RunType + (Detector)(0), // 8: o2.bookkeeping.Detector } var file_protos_run_proto_depIdxs = []int32{ - 2, // 0: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType - 3, // 1: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector - 0, // 2: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest - 1, // 3: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest - 4, // 4: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run - 4, // 5: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run - 4, // [4:6] is the sub-list for method output_type - 2, // [2:4] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name + 0, // 0: o2.bookkeeping.RunFetchRequest.relations:type_name -> o2.bookkeeping.RunRelations + 5, // 1: o2.bookkeeping.RunWithRelations.run:type_name -> o2.bookkeeping.Run + 6, // 2: o2.bookkeeping.RunWithRelations.lhcFill:type_name -> o2.bookkeeping.LHCFill + 7, // 3: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType + 8, // 4: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector + 1, // 5: o2.bookkeeping.RunService.Get:input_type -> o2.bookkeeping.RunFetchRequest + 3, // 6: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest + 4, // 7: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest + 2, // 8: o2.bookkeeping.RunService.Get:output_type -> o2.bookkeeping.RunWithRelations + 5, // 9: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run + 5, // 10: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run + 8, // [8:11] is the sub-list for method output_type + 5, // [5:8] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name } func init() { file_protos_run_proto_init() } @@ -455,7 +649,7 @@ func file_protos_run_proto_init() { file_protos_common_proto_init() if !protoimpl.UnsafeEnabled { file_protos_run_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunCreationRequest); i { + switch v := v.(*RunFetchRequest); i { case 0: return &v.state case 1: @@ -467,6 +661,30 @@ func file_protos_run_proto_init() { } } file_protos_run_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunWithRelations); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_run_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunCreationRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_run_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RunUpdateRequest); i { case 0: return &v.state @@ -479,20 +697,22 @@ func file_protos_run_proto_init() { } } } - file_protos_run_proto_msgTypes[0].OneofWrappers = []interface{}{} file_protos_run_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_protos_run_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_protos_run_proto_msgTypes[3].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_run_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, + NumEnums: 1, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, GoTypes: file_protos_run_proto_goTypes, DependencyIndexes: file_protos_run_proto_depIdxs, + EnumInfos: file_protos_run_proto_enumTypes, MessageInfos: file_protos_run_proto_msgTypes, }.Build() File_protos_run_proto = out.File diff --git a/core/integration/bookkeeping/protos/run.proto b/core/integration/bookkeeping/protos/run.proto index e4ec4923b..1e752935f 100644 --- a/core/integration/bookkeeping/protos/run.proto +++ b/core/integration/bookkeeping/protos/run.proto @@ -8,12 +8,26 @@ import "protos/common.proto"; // Services service RunService { + rpc Get(RunFetchRequest) returns (RunWithRelations); rpc Create(RunCreationRequest) returns (Run); rpc Update(RunUpdateRequest) returns (Run); } // High level messages +message RunFetchRequest { + int32 runNumber = 1; + // Specify the list of relations to fetch alongside the run + // For example if this contains RUN_RELATIONS_LHC_FILL then the returned RunWithRelation will have a populated + // lhcFill, else it will not be defined + repeated RunRelations relations = 2; +} + +message RunWithRelations { + Run run = 1; + optional LHCFill lhcFill = 2; +} + message RunCreationRequest { string environmentId = 1; int32 nDetectors = 2; @@ -45,3 +59,12 @@ message RunUpdateRequest { optional string pdpBeamType = 14; optional string readoutCfgUri = 15; } + +// Enums + +enum RunRelations { + // IGNORED - Here to comply with proto specification + RUN_RELATIONS_NULL = 0; + // Include the LHC fill related to the run + RUN_RELATIONS_LHC_FILL = 1; +} \ No newline at end of file diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index e7ea403c2..264b1aaa3 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,8 +1,4 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 -// source: protos/run.proto package bkpb @@ -22,6 +18,7 @@ const _ = grpc.SupportPackageIsVersion7 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type RunServiceClient interface { + Get(ctx context.Context, in *RunFetchRequest, opts ...grpc.CallOption) (*RunWithRelations, error) Create(ctx context.Context, in *RunCreationRequest, opts ...grpc.CallOption) (*Run, error) Update(ctx context.Context, in *RunUpdateRequest, opts ...grpc.CallOption) (*Run, error) } @@ -34,6 +31,15 @@ func NewRunServiceClient(cc grpc.ClientConnInterface) RunServiceClient { return &runServiceClient{cc} } +func (c *runServiceClient) Get(ctx context.Context, in *RunFetchRequest, opts ...grpc.CallOption) (*RunWithRelations, error) { + out := new(RunWithRelations) + err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Get", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *runServiceClient) Create(ctx context.Context, in *RunCreationRequest, opts ...grpc.CallOption) (*Run, error) { out := new(Run) err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Create", in, out, opts...) @@ -56,6 +62,7 @@ func (c *runServiceClient) Update(ctx context.Context, in *RunUpdateRequest, opt // All implementations should embed UnimplementedRunServiceServer // for forward compatibility type RunServiceServer interface { + Get(context.Context, *RunFetchRequest) (*RunWithRelations, error) Create(context.Context, *RunCreationRequest) (*Run, error) Update(context.Context, *RunUpdateRequest) (*Run, error) } @@ -64,6 +71,9 @@ type RunServiceServer interface { type UnimplementedRunServiceServer struct { } +func (UnimplementedRunServiceServer) Get(context.Context, *RunFetchRequest) (*RunWithRelations, error) { + return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") +} func (UnimplementedRunServiceServer) Create(context.Context, *RunCreationRequest) (*Run, error) { return nil, status.Errorf(codes.Unimplemented, "method Create not implemented") } @@ -82,6 +92,24 @@ func RegisterRunServiceServer(s grpc.ServiceRegistrar, srv RunServiceServer) { s.RegisterService(&RunService_ServiceDesc, srv) } +func _RunService_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunFetchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RunServiceServer).Get(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/o2.bookkeeping.RunService/Get", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RunServiceServer).Get(ctx, req.(*RunFetchRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _RunService_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RunCreationRequest) if err := dec(in); err != nil { @@ -125,6 +153,10 @@ var RunService_ServiceDesc = grpc.ServiceDesc{ ServiceName: "o2.bookkeeping.RunService", HandlerType: (*RunServiceServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "Get", + Handler: _RunService_Get_Handler, + }, { MethodName: "Create", Handler: _RunService_Create_Handler, diff --git a/go.mod b/go.mod index fe3947592..684c230f5 100644 --- a/go.mod +++ b/go.mod @@ -66,7 +66,7 @@ require ( golang.org/x/net v0.7.0 golang.org/x/sys v0.5.0 google.golang.org/grpc v1.50.1 - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.28.1 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index bb484c5a1..a3592e45d 100644 --- a/go.sum +++ b/go.sum @@ -1022,6 +1022,8 @@ google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= From 7e7e58ade48059c0a0bc80ea4760e95664dda426 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 26 Jun 2023 09:22:40 +0200 Subject: [PATCH 1648/2352] Download lhcFill.proto from BK in the Makefile --- Makefile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Makefile b/Makefile index 469750600..4e3f96df7 100644 --- a/Makefile +++ b/Makefile @@ -45,6 +45,7 @@ BK_ENV_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/pr BK_FLP_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/flp.proto" BK_LOG_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/log.proto" BK_RUN_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/run.proto" +BK_LHCFILL_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/main/proto/lhcFill.proto" VERBOSE_1 := -v VERBOSE_2 := -v -x @@ -180,6 +181,10 @@ vendor: @mkdir -p core/integration/bookkeeping/protos @curl -s -L $(BK_RUN_PROTO) -o core/integration/bookkeeping/protos/run.proto + @echo -e "\033[1;33mcurl lhcFill.proto\033[0m" + @mkdir -p core/integration/bookkeeping/protos + @curl -s -L $(BK_LHCFILL_PROTO) -o core/integration/bookkeeping/protos/lhcFill.proto + # WORKAROUND: In order to avoid the following issues: # https://github.com/golang/protobuf/issues/992 # https://github.com/golang/protobuf/issues/1158 From ffcd960e3581d39867c8eabe75e8f596e5fd1465 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 26 Jun 2023 09:31:52 +0200 Subject: [PATCH 1649/2352] [core] use the parent role to propagate lhc info to the whole env --- core/integration/bookkeeping/plugin.go | 38 +++++++++++++++++++------- 1 file changed, 28 insertions(+), 10 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 0451bdff5..e2dd07390 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1318,14 +1318,23 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } propagateLHCInfoToVarStack := func(lhcInfo *bkpb.LHCFill, varStack map[string]string) { - call.VarStack["fill_info_fill_number"] = string(lhcInfo.FillNumber) - call.VarStack["fill_info_filling_scheme"] = lhcInfo.FillingSchemeName - call.VarStack["fill_info_beam_type"] = lhcInfo.BeamType + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Errorf("could not access the parent role when trying to propagate the LHC fill info") + return + } + parentRole.SetGlobalRuntimeVar("fill_info_fill_number", string(lhcInfo.FillNumber)) + parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", lhcInfo.FillingSchemeName) + parentRole.SetGlobalRuntimeVar("fill_info_beam_type", lhcInfo.BeamType) if lhcInfo.StableBeamStart != nil { - call.VarStack["fill_info_stable_beam_start_ms"] = strconv.FormatInt(*lhcInfo.StableBeamStart, 10) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(*lhcInfo.StableBeamStart, 10)) } if lhcInfo.StableBeamEnd != nil { - call.VarStack["fill_info_stable_beam_end_ms"] = strconv.FormatInt(*lhcInfo.StableBeamEnd, 10) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(*lhcInfo.StableBeamEnd, 10)) } log.WithField("partition", envId). WithField("level", infologger.IL_Devel). @@ -1335,11 +1344,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { lhcInfo.FillNumber, lhcInfo.FillingSchemeName, lhcInfo.BeamType) } deleteLHCInfoInVarStack := func(varStack map[string]string) { - delete(call.VarStack, "fill_info_fill_number") - delete(call.VarStack, "fill_info_filling_scheme") - delete(call.VarStack, "fill_info_beam_type") - delete(call.VarStack, "fill_info_stable_beam_start_ms") - delete(call.VarStack, "fill_info_stable_beam_end_ms") + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("endpoint", viper.GetString("bookkeepingBaseUri")). + WithField("call", "RetrieveFillInfo"). + Errorf("could not access the parent role when trying to clean up LHC fill info") + return + } + parentRole.DeleteGlobalRuntimeVar("fill_info_fill_number") + parentRole.DeleteGlobalRuntimeVar("fill_info_filling_scheme") + parentRole.DeleteGlobalRuntimeVar("fill_info_beam_type") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") } stack["RetrieveFillInfo"] = func() (out string) { From f11ef3b2d6c4e4316736a0f99143367afdb51524 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 26 Jun 2023 14:03:25 +0200 Subject: [PATCH 1650/2352] [occ] Push properties before FairMQ RUN and STOP transitions --- occ/plugin/OccFMQCommon.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index b8cff317d..a9bafea5e 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -147,8 +147,9 @@ std::tuple doTransition(fair: try { auto evt = fair::mq::PluginServices::ToDeviceStateTransition(event); - // Run number must be pushed immediately before RUN transition - if (evt == fair::mq::PluginServices::DeviceStateTransition::Run) { + // RUN and STOP support arguments, pushed as properties right before performing the transition + if (evt == fair::mq::PluginServices::DeviceStateTransition::Run || + evt == fair::mq::PluginServices::DeviceStateTransition::Stop) { try { for (auto const& entry : arguments) { m_pluginServices->SetProperty(entry.key, entry.value); From fbc4717014b4f917da51c56b45fcc3fb87060e1c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 26 Jun 2023 15:09:27 +0200 Subject: [PATCH 1651/2352] [core] Push LHC fill info, O2 start/end, run type, LHC period to tasks --- core/environment/transition_startactivity.go | 17 +++++++++++++++++ core/environment/transition_stopactivity.go | 11 ++++++++++- go.mod | 1 + go.sum | 1 + 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index be4bf822f..d244e5218 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" + "github.com/iancoleman/strcase" ) func NewStartActivityTransition(taskman *task.Manager) Transition { @@ -73,6 +74,22 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "cleanup": strconv.Itoa(cleanupCount), } + // If bookkeeping is enabled and has fetched the LHC fill info, we can acquire it here + for _, key := range []string{ + "fill_info_fill_number", + "fill_info_filling_scheme", + "fill_info_beam_type", + "fill_info_stable_beam_start_ms", + "fill_info_stable_beam_end_ms", + "run_type", + "run_start_time_ms", + "lhc_period", + } { + if value, ok := env.GlobalVars.Get(key); ok { + args[strcase.ToLowerCamel(key)] = value + } + } + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks(), task.CONFIGURED.String(), diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 6242ccaf4..c56b3913e 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -29,8 +29,10 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" + "github.com/iancoleman/strcase" ) func NewStopActivityTransition(taskman *task.Manager) Transition { @@ -55,6 +57,13 @@ func (t StopActivityTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). Info("stopping run") + args := controlcommands.PropertyMap{} + + // Propagate run end time to all tasks + if value, ok := env.GlobalVars.Get("run_end_time_ms"); ok { + args[strcase.ToLowerCamel("run_end_time_ms")] = value + } + taskmanMessage := task.NewTransitionTaskMessage( env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { if pr, ok := t.GetParentRole().(workflow.Role); ok { @@ -65,7 +74,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { task.RUNNING.String(), task.STOP.String(), task.CONFIGURED.String(), - nil, + args, env.Id(), ) t.taskman.MessageChannel <- taskmanMessage diff --git a/go.mod b/go.mod index 684c230f5..82e0f5593 100644 --- a/go.mod +++ b/go.mod @@ -101,6 +101,7 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/serf v0.9.8 // indirect github.com/huandu/xstrings v1.3.2 // indirect + github.com/iancoleman/strcase v0.2.0 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect diff --git a/go.sum b/go.sum index a3592e45d..91f14ac0b 100644 --- a/go.sum +++ b/go.sum @@ -329,6 +329,7 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4Dvx github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= From 131dd50e1a2a0521be4500a5cb75b444588d11b0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 26 Jun 2023 15:20:34 +0200 Subject: [PATCH 1652/2352] [build] Bump to v0.70.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2ebb15eeb..f62e5da8c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 69 -VERSION_PATCH := 1 +VERSION_MINOR := 70 +VERSION_PATCH := 0 From b447a50170f264a9e2152fd9b72dca789821cbe4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 27 Jun 2023 10:33:02 +0200 Subject: [PATCH 1653/2352] [O2-2818][core] another go at disabling the autoBind --- core/task/channel/inbound.go | 2 +- occ/plugin/OccFMQCommon.cxx | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index 8afc6cf6c..f2b95e908 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -154,7 +154,7 @@ func (inbound *Inbound) buildFMQMap(address string, transport TransportType) (pm chanProps := controlcommands.PropertyMap{ "address": address, "method": "bind", - "autoBind": "false", + "autoBind": "0", "rateLogging": inbound.RateLogging, "rcvBufSize": strconv.Itoa(inbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index a9bafea5e..e55df5d3c 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -88,7 +88,8 @@ std::tuple doTransition(fair: "sndBufSize", "linger", "rcvKernelSize", - "sndKernelSize" + "sndKernelSize", + "autoBind" }; for (auto it = arguments.cbegin(); it != arguments.cend(); ++it) { std::string key = it->key; From 63f13c3b0d87443f8b6a27d745beba678aae5ed3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Jun 2023 10:34:36 +0200 Subject: [PATCH 1654/2352] [build] Bump to v0.70.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f62e5da8c..29b42eb1b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 70 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 41f3ddd9a7c54f99db53afa4988a0dd3af6da881 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Jun 2023 12:24:51 +0200 Subject: [PATCH 1655/2352] [occ] Special case autoBind to be pushed as bool --- occ/plugin/OccFMQCommon.cxx | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index e55df5d3c..5e3f6d15f 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -100,8 +100,14 @@ std::tuple doTransition(fair: boost::split(split, key, std::bind(std::equal_to<>(), '.', std::placeholders::_1)); if (std::find(intKeys.begin(), intKeys.end(), split.back()) != intKeys.end()) { auto intValue = std::stoi(value); - m_pluginServices->SetProperty(key, intValue); - OLOG(debug) << "SetProperty(chan int) called " << key << ":" << intValue; + if (boost::ends_with(key, "autoBind")) { + auto boolValue = static_cast(intValue); + m_pluginServices->SetProperty(key, boolValue); + OLOG(debug) << "SetProperty(chan bool) called " << key << ":" << intValue; + } else { + m_pluginServices->SetProperty(key, intValue); + OLOG(debug) << "SetProperty(chan int) called " << key << ":" << intValue; + } } else { m_pluginServices->SetProperty(key, value); OLOG(debug) << "SetProperty(chan string) called " << key << ":" << value; From dacc95d0cc5566f275a1430fb26390db15aea43c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 27 Jun 2023 12:28:24 +0200 Subject: [PATCH 1656/2352] [build] Bump to v0.70.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 29b42eb1b..afac38821 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 70 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 711fab0fff051564e0c13ee143e744517c3d45aa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jun 2023 13:20:17 +0200 Subject: [PATCH 1657/2352] [core] Fix crash --- core/task/scheduler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 525c232fb..6532ba6dc 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -950,9 +950,9 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han err = calls.CallNoData(ctx, state.cli, accept) if err != nil { log.WithPrefix("scheduler"). + WithError(err). WithField("detector", detector). WithField("partition", envId.String()). - WithField("error", err.Error()). WithField("offerHost", host). Error("failed to launch tasks") // FIXME: we probably need to react to a failed ACCEPT here From 089b47ae4aa916321653c74d730e9f3f30ec8ac8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Jun 2023 14:44:53 +0200 Subject: [PATCH 1658/2352] [core] Pull ODC protofile --- core/integration/odc/protos/odc.proto | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 561d23769..1dcda93e3 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -159,6 +159,7 @@ message RunRequest { string script = 6; // Shell commands to be executed by ODC in order to generate content of the XML DDS topology string plugin = 3; // Name of the resource plugin registered in odc-server string resources = 4; // Resource description + bool extractTopoResources = 9; // extract required resources from the topology file only (plugin & resources fields are ignored) } // Update request From c92c09c286a4a1a6b9c2bca2539332ea38ed845a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Jun 2023 14:46:49 +0200 Subject: [PATCH 1659/2352] [core] Regenerate ODC proto --- core/integration/odc/protos/odc.pb.go | 239 +++++++++++---------- core/integration/odc/protos/odc_grpc.pb.go | 2 +- 2 files changed, 126 insertions(+), 115 deletions(-) diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 008472e18..01d947117 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.12 // source: protos/odc.proto package odc @@ -925,11 +925,12 @@ type RunRequest struct { Runnr uint64 `protobuf:"varint,7,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS Timeout uint32 `protobuf:"varint,8,opt,name=timeout,proto3" json:"timeout,omitempty"` // Request timeout in sec. If not set or 0 than default is used. // Either `topology`, `content` or `script` has to be set. If all or none is set then an error is returned. - Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to the XML DDS topology file - Content string `protobuf:"bytes,5,opt,name=content,proto3" json:"content,omitempty"` // Content of the XML DDS topology - Script string `protobuf:"bytes,6,opt,name=script,proto3" json:"script,omitempty"` // Shell commands to be executed by ODC in order to generate content of the XML DDS topology - Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server - Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description + Topology string `protobuf:"bytes,2,opt,name=topology,proto3" json:"topology,omitempty"` // Filepath to the XML DDS topology file + Content string `protobuf:"bytes,5,opt,name=content,proto3" json:"content,omitempty"` // Content of the XML DDS topology + Script string `protobuf:"bytes,6,opt,name=script,proto3" json:"script,omitempty"` // Shell commands to be executed by ODC in order to generate content of the XML DDS topology + Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` // Name of the resource plugin registered in odc-server + Resources string `protobuf:"bytes,4,opt,name=resources,proto3" json:"resources,omitempty"` // Resource description + ExtractTopoResources bool `protobuf:"varint,9,opt,name=extractTopoResources,proto3" json:"extractTopoResources,omitempty"` // extract required resources from the topology file only (plugin & resources fields are ignored) } func (x *RunRequest) Reset() { @@ -1020,6 +1021,13 @@ func (x *RunRequest) GetResources() string { return "" } +func (x *RunRequest) GetExtractTopoResources() bool { + if x != nil { + return x.ExtractTopoResources + } + return false +} + // Update request type UpdateRequest struct { state protoimpl.MessageState @@ -1697,7 +1705,7 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x22, 0xe2, 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x96, 0x02, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, @@ -1711,118 +1719,121 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, - 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, - 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, - 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, - 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x54, 0x6f, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x6f, 0x70, 0x6f, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, + 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, + 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, - 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, - 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, - 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, + 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, + 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, + 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, + 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, + 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, + 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, + 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, + 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 90a102e92..4dc314147 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.12 // source: protos/odc.proto package odc From ee6883aa0a1380165a792a69a0fa3f76463f744f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 30 Jun 2023 17:31:31 +0200 Subject: [PATCH 1660/2352] [core] Query ODC for detailed partition information --- core/integration/odc/plugin.go | 86 +++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 7 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2cbbf6ffe..978afe82a 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -81,8 +81,21 @@ type OdcStatus struct { } type OdcPartitionInfo struct { - RunNumber uint32 - State string + PartitionId uid.ID + RunNumber uint32 + State string + DdsSessionId string + DdsSessionStatus string + Devices []OdcDevice + Hosts []string +} + +type OdcDevice struct { + TaskId uint64 + State string + Path string + Ignored bool + Host string } func NewPlugin(endpoint string) integration.Plugin { @@ -148,16 +161,75 @@ func (p *Plugin) queryPartitionStatus() { Error: statusRep.Error, Partitions: make(map[uid.ID]OdcPartitionInfo), } - for _, v := range statusRep.Partitions { + + odcPartInfoSlice := make([]*OdcPartitionInfo, len(statusRep.Partitions)) + + // concurrent request for the detailed state of each partition + var wg sync.WaitGroup + + for idx, odcPartSt := range statusRep.Partitions { + if odcPartSt == nil { + continue + } var id uid.ID - id, err = uid.FromString(v.Partitionid) + id, err = uid.FromString(odcPartSt.Partitionid) if err != nil { continue } - response.Partitions[id] = OdcPartitionInfo{ - RunNumber: uint32(v.Runnr), - State: v.State, + odcPartInfoSlice[idx] = &OdcPartitionInfo{ + PartitionId: id, + RunNumber: uint32(odcPartSt.Runnr), + State: odcPartSt.State, + DdsSessionId: odcPartSt.Sessionid, + DdsSessionStatus: odcPartSt.Status.String(), + } + + go func(idx int, partId uid.ID) { + wg.Add(1) + defer wg.Done() + + ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) + defer cancel() + + odcPartStateRep, err := p.odcClient.GetState(ctx, &odc.StateRequest{ + Partitionid: partId.String(), + Detailed: true, + }, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("level", infologger.IL_Support). + WithField("call", "GetState"). + WithError(err).Error("ODC error") + return + } + if odcPartStateRep == nil || odcPartStateRep.Reply == nil { + log.WithField("level", infologger.IL_Support). + WithField("call", "GetState"). + WithError(fmt.Errorf("ODC GetState response is nil")).Error("ODC error") + return + } + + odcPartInfoSlice[idx].Hosts = odcPartStateRep.Reply.Hosts + odcPartInfoSlice[idx].Devices = make([]OdcDevice, len(odcPartStateRep.Devices)) + for i, device := range odcPartStateRep.Devices { + odcPartInfoSlice[idx].Devices[i] = OdcDevice{ + TaskId: device.Id, + State: device.State, + Path: device.Path, + Ignored: device.Ignored, + Host: device.Host, + } + } + + }(idx, id) + } + wg.Wait() + + for _, odcPartSt := range odcPartInfoSlice { + if odcPartSt.PartitionId.IsNil() { + // The partition wasn't found in the ODC response + continue } + response.Partitions[odcPartSt.PartitionId] = *odcPartSt } p.cachedStatusMu.Lock() From 889a53f11291f32319c4f5520a6941cbe5c64531 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jul 2023 16:05:22 +0200 Subject: [PATCH 1661/2352] [core] Ensure correct JSON output for odc.GetEnvironmentData --- core/integration/odc/plugin.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 978afe82a..20a646669 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/integration" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" @@ -81,21 +82,21 @@ type OdcStatus struct { } type OdcPartitionInfo struct { - PartitionId uid.ID - RunNumber uint32 - State string - DdsSessionId string - DdsSessionStatus string - Devices []OdcDevice - Hosts []string + PartitionId uid.ID `json:"-"` + RunNumber uint32 `json:"runNumber"` + State string `json:"state"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + Devices []OdcDevice `json:"devices"` + Hosts []string `json:"hosts"` } type OdcDevice struct { - TaskId uint64 - State string - Path string - Ignored bool - Host string + TaskId uint64 `json:"taskId"` + State string `json:"state"` + Path string `json:"path"` + Ignored bool `json:"ignored"` + Host string `json:"host"` } func NewPlugin(endpoint string) integration.Plugin { @@ -136,6 +137,7 @@ func (p *Plugin) GetConnectionState() string { } func (p *Plugin) queryPartitionStatus() { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) defer cancel() From 746960551b04cfa70c62b16344bb0d8dea91073b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Jul 2023 15:38:36 +0200 Subject: [PATCH 1662/2352] [core] Output ODC task id as string --- core/integration/odc/plugin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 20a646669..605f0f498 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -92,7 +92,7 @@ type OdcPartitionInfo struct { } type OdcDevice struct { - TaskId uint64 `json:"taskId"` + TaskId string `json:"taskId"` State string `json:"state"` Path string `json:"path"` Ignored bool `json:"ignored"` @@ -214,7 +214,7 @@ func (p *Plugin) queryPartitionStatus() { odcPartInfoSlice[idx].Devices = make([]OdcDevice, len(odcPartStateRep.Devices)) for i, device := range odcPartStateRep.Devices { odcPartInfoSlice[idx].Devices[i] = OdcDevice{ - TaskId: device.Id, + TaskId: strconv.FormatUint(device.Id, 10), State: device.State, Path: device.Path, Ignored: device.Ignored, From 9f4448b648260fc1f8bc08fc0ddb0aac2a354eab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Jul 2023 17:10:23 +0200 Subject: [PATCH 1663/2352] [core] Make sure to output ODC details --- core/integration/odc/plugin.go | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 605f0f498..52b5294bc 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -178,6 +178,9 @@ func (p *Plugin) queryPartitionStatus() { if err != nil { continue } + + wg.Add(1) + odcPartInfoSlice[idx] = &OdcPartitionInfo{ PartitionId: id, RunNumber: uint32(odcPartSt.Runnr), @@ -185,9 +188,9 @@ func (p *Plugin) queryPartitionStatus() { DdsSessionId: odcPartSt.Sessionid, DdsSessionStatus: odcPartSt.Status.String(), } + i := idx go func(idx int, partId uid.ID) { - wg.Add(1) defer wg.Done() ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) @@ -200,12 +203,14 @@ func (p *Plugin) queryPartitionStatus() { if err != nil { log.WithField("level", infologger.IL_Support). WithField("call", "GetState"). + WithField("partition", partId.String()). WithError(err).Error("ODC error") return } if odcPartStateRep == nil || odcPartStateRep.Reply == nil { log.WithField("level", infologger.IL_Support). WithField("call", "GetState"). + WithField("partition", partId.String()). WithError(fmt.Errorf("ODC GetState response is nil")).Error("ODC error") return } @@ -221,8 +226,7 @@ func (p *Plugin) queryPartitionStatus() { Host: device.Host, } } - - }(idx, id) + }(i, id) } wg.Wait() From 3d8446c688c62e683cdf1dd385ad7790ce15c62c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 11 Jul 2023 17:26:32 +0200 Subject: [PATCH 1664/2352] [core] Fix NumberOfHosts and implement NumberOfTasks --- coconut/protos/o2control.pb.go | 1194 ++++++++++++++------------- coconut/protos/o2control_grpc.pb.go | 2 +- core/environment/environment.go | 15 +- core/protos/o2control.pb.go | 1194 ++++++++++++++------------- core/protos/o2control.proto | 1 + core/protos/o2control_grpc.pb.go | 2 +- core/server.go | 1 + 7 files changed, 1220 insertions(+), 1189 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 5378a2015..e7834b9cb 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/o2control.proto package pb @@ -1390,6 +1390,7 @@ type EnvironmentInfo struct { Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1522,6 +1523,13 @@ func (x *EnvironmentInfo) GetIntegratedServicesData() map[string]string { return nil } +func (x *EnvironmentInfo) GetNumberOfTasks() int32 { + if x != nil { + return x.NumberOfTasks + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4804,7 +4812,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x9f, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xc5, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4846,622 +4854,624 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, - 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, - 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, - 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, - 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, - 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, - 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, - 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, - 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, - 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, - 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, - 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, - 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, + 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, - 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, - 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, - 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, - 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, - 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, - 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, - 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, + 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, + 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, + 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, + 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, + 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, + 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, + 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, + 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, - 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 759ae2b9b..a959303f2 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/o2control.proto package pb diff --git a/core/environment/environment.go b/core/environment/environment.go index a8db35aff..a00b645e3 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -29,6 +29,7 @@ package environment import ( "errors" "fmt" + "sort" "strconv" "strings" "sync" @@ -883,10 +884,18 @@ func (env *Environment) GetAllHosts() []string { } tasks := env.workflow.GetTasks() - out := make([]string, len(tasks)) - for i, t := range tasks { - out[i] = t.GetHostname() + hostSet := make(map[string]struct{}) + for _, t := range tasks { + hostSet[t.GetHostname()] = struct{}{} + } + + out := make([]string, len(hostSet)) + i := 0 + for hostname, _ := range hostSet { + out[i] = hostname + i++ } + sort.Strings(out) return out } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 5378a2015..e7834b9cb 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.9 +// protoc v3.21.12 // source: protos/o2control.proto package pb @@ -1390,6 +1390,7 @@ type EnvironmentInfo struct { Description string `protobuf:"bytes,12,opt,name=description,proto3" json:"description,omitempty"` NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1522,6 +1523,13 @@ func (x *EnvironmentInfo) GetIntegratedServicesData() map[string]string { return nil } +func (x *EnvironmentInfo) GetNumberOfTasks() int32 { + if x != nil { + return x.NumberOfTasks + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4804,7 +4812,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0x9f, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xc5, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4846,622 +4854,624 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, - 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, - 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, - 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, - 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, - 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, - 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, - 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, - 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, - 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, - 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, - 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, - 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, - 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, - 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, - 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, - 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, - 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, - 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, - 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, - 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, - 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, - 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, - 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, - 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, + 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, - 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, + 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, + 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, + 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, + 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, + 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, + 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, + 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, + 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, + 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, - 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, - 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, - 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, - 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, - 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, - 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, - 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, - 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, - 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, - 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, - 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, - 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, + 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, + 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, - 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, - 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, + 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, + 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, + 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, + 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, + 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, + 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, + 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, + 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, + 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, + 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, - 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, + 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, - 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, - 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index be122a5ce..c204a32c0 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -189,6 +189,7 @@ message EnvironmentInfo { string description = 12; int32 numberOfHosts = 13; map integratedServicesData = 14; + int32 numberOfTasks = 15; } message NewEnvironmentRequest { diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 94c92d0d6..1964f19f5 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.9 +// - protoc v3.21.12 // source: protos/o2control.proto package pb diff --git a/core/server.go b/core/server.go index be24774cc..f7b2d7f51 100644 --- a/core/server.go +++ b/core/server.go @@ -246,6 +246,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm UserVars: userVars, NumberOfFlps: int32(len(env.GetFLPs())), NumberOfHosts: int32(len(env.GetAllHosts())), + NumberOfTasks: int32(len(tasks)), IntegratedServicesData: isEnvData, } if request.GetShowTaskInfos() { From 9668cec64b95834c92ba4bda4acd726a5f3e7af4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jun 2023 14:03:32 +0200 Subject: [PATCH 1665/2352] [core] Update CTP protofile and convert CRLF->LF --- core/integration/trg/protos/ctpecs.proto | 133 ++++++++++++----------- 1 file changed, 70 insertions(+), 63 deletions(-) diff --git a/core/integration/trg/protos/ctpecs.proto b/core/integration/trg/protos/ctpecs.proto index c7d7fdbf1..d1d8500a0 100644 --- a/core/integration/trg/protos/ctpecs.proto +++ b/core/integration/trg/protos/ctpecs.proto @@ -1,63 +1,70 @@ -syntax = "proto3"; -package ctpd; -option go_package = "github.com/AliceO2Group/Control/core/integration/trg/protos;ctpecs"; - -// ctpd interface for ECS -service CTPd { - // global run: - rpc RunLoad (RunLoadRequest) returns (RunReply) {} - rpc RunUnload (RunStopRequest) returns (RunReply) {} - // stdalone and global runs: - rpc RunStart (RunStartRequest) returns (RunReply) {} - rpc RunStatus (RunStatusRequest) returns (RunReply) {} - rpc RunList (Empty) returns (RunReply) {} - rpc RunStop (RunStopRequest) returns (RunReply) {} - rpc RunConfig (RunStopRequest) returns (RunReply) {} -} -//import "ctpecs_m.proto"; -// global runs only: -message RunLoadRequest { - uint32 runn = 1; // run number - string config = 2; - // -config, i.e. the content of partname.pd - // -partname -the content is in ctp config dir partname.pd - // -key in case the config is available in Consul[key] - string detectors= 3; // available detectors, "" -all required must be ready -} -// global + stdalone runs (common for ctpd/ltud): -message RunStartRequest { - uint32 runn = 1; // run number - string config = 2; - // -config, e.g. "trig\nPH_bc 100 inf" or - // -key in case the config is available in Consul[key] - // -"" use default configuration - // - // Optional parameters follows, overriding parameters in config string - // for the begining let's agree on three parameters : - enum Mode { - NULL = 0; // use default (from config) - TRIG = 1; - CONT = 2; - } - Mode mode = 3; - string ph_bc = 4; // BC-downscaled rate of physics triggers - string ph_rnd = 5; // rate of physics triggers generated randomly - // ph_ ...: "": use default (from config) - // N : number of BCs between 2 triggers - // 2.3khz rate of triggers: 2.3 khz - string detector = 6; // detector has to be given for stdalone runs, "" for global run -} -message RunStatusRequest { - uint32 runn = 1; -} -message Empty {} -message RunStopRequest { - uint32 runn = 1; - string detector = 2; // only for stdalone runs (forced stop) -} -message RunReply { - int32 rc = 1; // 0: ok - // RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist - string msg = 2; // response (usually "" when rc is 0) -} - +syntax = "proto3"; +package ctpd; +option go_package = "github.com/AliceO2Group/Control/core/integration/trg/protos;ctpecs"; + +// ctpd interface for ECS +service CTPd { + // global run: + rpc PrepareForRun (RunPrepareRequest) returns (RunReply) {} + rpc RunLoad (RunLoadRequest) returns (RunReply) {} + rpc RunUnload (RunStopRequest) returns (RunReply) {} + // stdalone and global runs: + rpc RunStart (RunStartRequest) returns (RunReply) {} + rpc RunStatus (RunStatusRequest) returns (RunReply) {} + rpc RunList (Empty) returns (RunReply) {} // runs <1000 not shown + rpc RunStop (RunStopRequest) returns (RunReply) {} + rpc RunConfig (RunStopRequest) returns (RunReply) {} + rpc RunCleanup (Empty) returns (RunReply) {} + rpc TPCReset (Empty) returns (RunReply) {} +} +//import "ctpecs_m.proto"; +// global runs only: +message RunPrepareRequest { + string runtype = 1; + string detectors= 2; // as in RunLoadRequest +} +message RunLoadRequest { + uint32 runn = 1; // run number + string config = 2; + // -config, i.e. the content of partname.pd + // -partname -the content is in ctp config dir partname.pd + // -key in case the config is available in Consul[key] + string detectors= 3; // available detectors, "" -all required must be ready +} +// global + stdalone runs (common for ctpd/ltud): +message RunStartRequest { + uint32 runn = 1; // run number + string config = 2; + // -config, e.g. "trig\nPH_bc 100 inf" or + // -key in case the config is available in Consul[key] + // -"" use default configuration + // + // Optional parameters follows, overriding parameters in config string + // for the begining let's agree on three parameters : + enum Mode { + NULL = 0; // use default (from config) + TRIG = 1; + CONT = 2; + } + Mode mode = 3; + string ph_bc = 4; // BC-downscaled rate of physics triggers + string ph_rnd = 5; // rate of physics triggers generated randomly + // ph_ ...: "": use default (from config) + // N : number of BCs between 2 triggers + // 2.3khz rate of triggers: 2.3 khz + string detector = 6; // detector has to be given for stdalone runs, "" for global run +} +message RunStatusRequest { + uint32 runn = 1; +} +message Empty {} +message RunStopRequest { + uint32 runn = 1; + string detector = 2; // only for stdalone runs (forced stop) +} +message RunReply { + int32 rc = 1; // 0: ok + // RunStatus rc: 0:active/running 1:paused 2:loaded 3:does not exist + string msg = 2; // response (usually "" when rc is 0) +} + From a5e4d9837ddd003b8f7fd1020af5aab1b9c4f94f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jun 2023 14:04:44 +0200 Subject: [PATCH 1666/2352] [core] Regenerate CTP proto --- core/integration/trg/protos/ctpecs.pb.go | 313 +++++++++++------- core/integration/trg/protos/ctpecs_grpc.pb.go | 110 +++++- 2 files changed, 310 insertions(+), 113 deletions(-) diff --git a/core/integration/trg/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go index fa05b1f52..c583179b0 100644 --- a/core/integration/trg/protos/ctpecs.pb.go +++ b/core/integration/trg/protos/ctpecs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc v3.21.12 // source: protos/ctpecs.proto package ctpecs @@ -72,11 +72,66 @@ func (x RunStartRequest_Mode) Number() protoreflect.EnumNumber { // Deprecated: Use RunStartRequest_Mode.Descriptor instead. func (RunStartRequest_Mode) EnumDescriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{1, 0} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{2, 0} } -//import "ctpecs_m.proto"; +// import "ctpecs_m.proto"; // global runs only: +type RunPrepareRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Runtype string `protobuf:"bytes,1,opt,name=runtype,proto3" json:"runtype,omitempty"` + Detectors string `protobuf:"bytes,2,opt,name=detectors,proto3" json:"detectors,omitempty"` // as in RunLoadRequest +} + +func (x *RunPrepareRequest) Reset() { + *x = RunPrepareRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctpecs_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RunPrepareRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RunPrepareRequest) ProtoMessage() {} + +func (x *RunPrepareRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctpecs_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RunPrepareRequest.ProtoReflect.Descriptor instead. +func (*RunPrepareRequest) Descriptor() ([]byte, []int) { + return file_protos_ctpecs_proto_rawDescGZIP(), []int{0} +} + +func (x *RunPrepareRequest) GetRuntype() string { + if x != nil { + return x.Runtype + } + return "" +} + +func (x *RunPrepareRequest) GetDetectors() string { + if x != nil { + return x.Detectors + } + return "" +} + type RunLoadRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -93,7 +148,7 @@ type RunLoadRequest struct { func (x *RunLoadRequest) Reset() { *x = RunLoadRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[0] + mi := &file_protos_ctpecs_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -106,7 +161,7 @@ func (x *RunLoadRequest) String() string { func (*RunLoadRequest) ProtoMessage() {} func (x *RunLoadRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[0] + mi := &file_protos_ctpecs_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -119,7 +174,7 @@ func (x *RunLoadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunLoadRequest.ProtoReflect.Descriptor instead. func (*RunLoadRequest) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{0} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{1} } func (x *RunLoadRequest) GetRunn() uint32 { @@ -155,15 +210,16 @@ type RunStartRequest struct { PhBc string `protobuf:"bytes,4,opt,name=ph_bc,json=phBc,proto3" json:"ph_bc,omitempty"` // BC-downscaled rate of physics triggers PhRnd string `protobuf:"bytes,5,opt,name=ph_rnd,json=phRnd,proto3" json:"ph_rnd,omitempty"` // rate of physics triggers generated randomly // ph_ ...: "": use default (from config) - // N : number of BCs between 2 triggers - // 2.3khz rate of triggers: 2.3 khz + // + // N : number of BCs between 2 triggers + // 2.3khz rate of triggers: 2.3 khz Detector string `protobuf:"bytes,6,opt,name=detector,proto3" json:"detector,omitempty"` // detector has to be given for stdalone runs, "" for global run } func (x *RunStartRequest) Reset() { *x = RunStartRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[1] + mi := &file_protos_ctpecs_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -176,7 +232,7 @@ func (x *RunStartRequest) String() string { func (*RunStartRequest) ProtoMessage() {} func (x *RunStartRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[1] + mi := &file_protos_ctpecs_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -189,7 +245,7 @@ func (x *RunStartRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStartRequest.ProtoReflect.Descriptor instead. func (*RunStartRequest) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{1} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{2} } func (x *RunStartRequest) GetRunn() uint32 { @@ -245,7 +301,7 @@ type RunStatusRequest struct { func (x *RunStatusRequest) Reset() { *x = RunStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[2] + mi := &file_protos_ctpecs_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -258,7 +314,7 @@ func (x *RunStatusRequest) String() string { func (*RunStatusRequest) ProtoMessage() {} func (x *RunStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[2] + mi := &file_protos_ctpecs_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -271,7 +327,7 @@ func (x *RunStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStatusRequest.ProtoReflect.Descriptor instead. func (*RunStatusRequest) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{2} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{3} } func (x *RunStatusRequest) GetRunn() uint32 { @@ -290,7 +346,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[3] + mi := &file_protos_ctpecs_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -303,7 +359,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[3] + mi := &file_protos_ctpecs_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -316,7 +372,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{3} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{4} } type RunStopRequest struct { @@ -331,7 +387,7 @@ type RunStopRequest struct { func (x *RunStopRequest) Reset() { *x = RunStopRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[4] + mi := &file_protos_ctpecs_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -344,7 +400,7 @@ func (x *RunStopRequest) String() string { func (*RunStopRequest) ProtoMessage() {} func (x *RunStopRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[4] + mi := &file_protos_ctpecs_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -357,7 +413,7 @@ func (x *RunStopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStopRequest.ProtoReflect.Descriptor instead. func (*RunStopRequest) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{4} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{5} } func (x *RunStopRequest) GetRunn() uint32 { @@ -387,7 +443,7 @@ type RunReply struct { func (x *RunReply) Reset() { *x = RunReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_ctpecs_proto_msgTypes[5] + mi := &file_protos_ctpecs_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -400,7 +456,7 @@ func (x *RunReply) String() string { func (*RunReply) ProtoMessage() {} func (x *RunReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_ctpecs_proto_msgTypes[5] + mi := &file_protos_ctpecs_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -413,7 +469,7 @@ func (x *RunReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RunReply.ProtoReflect.Descriptor instead. func (*RunReply) Descriptor() ([]byte, []int) { - return file_protos_ctpecs_proto_rawDescGZIP(), []int{5} + return file_protos_ctpecs_proto_rawDescGZIP(), []int{6} } func (x *RunReply) GetRc() int32 { @@ -434,65 +490,79 @@ var File_protos_ctpecs_proto protoreflect.FileDescriptor var file_protos_ctpecs_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x74, 0x70, 0x64, 0x22, 0x5a, 0x0a, 0x0e, 0x52, - 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, - 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, - 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, - 0x70, 0x68, 0x5f, 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, - 0x52, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, - 0x24, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, - 0x4f, 0x4e, 0x54, 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, - 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x02, 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0xec, 0x02, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, - 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, - 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x12, 0x15, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, - 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x63, 0x74, 0x70, 0x64, - 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x28, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0b, - 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, - 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x74, 0x70, 0x64, 0x22, 0x4b, 0x0a, 0x11, 0x52, + 0x75, 0x6e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x4c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, + 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x68, 0x5f, + 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x52, 0x6e, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x24, 0x0a, 0x04, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x4e, 0x54, + 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x72, + 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6d, 0x73, 0x67, 0x32, 0x80, 0x04, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, 0x3a, 0x0a, 0x0d, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, + 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, + 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x4c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, + 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, + 0x75, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, - 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, + 0x12, 0x33, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x15, 0x2e, 0x63, + 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x72, 0x67, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x16, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x28, 0x0a, 0x07, + 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, + 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, + 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x12, 0x0b, 0x2e, 0x63, + 0x74, 0x70, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, + 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x08, 0x54, + 0x50, 0x43, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x72, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -508,37 +578,44 @@ func file_protos_ctpecs_proto_rawDescGZIP() []byte { } var file_protos_ctpecs_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_ctpecs_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_ctpecs_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_protos_ctpecs_proto_goTypes = []interface{}{ (RunStartRequest_Mode)(0), // 0: ctpd.RunStartRequest.Mode - (*RunLoadRequest)(nil), // 1: ctpd.RunLoadRequest - (*RunStartRequest)(nil), // 2: ctpd.RunStartRequest - (*RunStatusRequest)(nil), // 3: ctpd.RunStatusRequest - (*Empty)(nil), // 4: ctpd.Empty - (*RunStopRequest)(nil), // 5: ctpd.RunStopRequest - (*RunReply)(nil), // 6: ctpd.RunReply + (*RunPrepareRequest)(nil), // 1: ctpd.RunPrepareRequest + (*RunLoadRequest)(nil), // 2: ctpd.RunLoadRequest + (*RunStartRequest)(nil), // 3: ctpd.RunStartRequest + (*RunStatusRequest)(nil), // 4: ctpd.RunStatusRequest + (*Empty)(nil), // 5: ctpd.Empty + (*RunStopRequest)(nil), // 6: ctpd.RunStopRequest + (*RunReply)(nil), // 7: ctpd.RunReply } var file_protos_ctpecs_proto_depIdxs = []int32{ - 0, // 0: ctpd.RunStartRequest.mode:type_name -> ctpd.RunStartRequest.Mode - 1, // 1: ctpd.CTPd.RunLoad:input_type -> ctpd.RunLoadRequest - 5, // 2: ctpd.CTPd.RunUnload:input_type -> ctpd.RunStopRequest - 2, // 3: ctpd.CTPd.RunStart:input_type -> ctpd.RunStartRequest - 3, // 4: ctpd.CTPd.RunStatus:input_type -> ctpd.RunStatusRequest - 4, // 5: ctpd.CTPd.RunList:input_type -> ctpd.Empty - 5, // 6: ctpd.CTPd.RunStop:input_type -> ctpd.RunStopRequest - 5, // 7: ctpd.CTPd.RunConfig:input_type -> ctpd.RunStopRequest - 6, // 8: ctpd.CTPd.RunLoad:output_type -> ctpd.RunReply - 6, // 9: ctpd.CTPd.RunUnload:output_type -> ctpd.RunReply - 6, // 10: ctpd.CTPd.RunStart:output_type -> ctpd.RunReply - 6, // 11: ctpd.CTPd.RunStatus:output_type -> ctpd.RunReply - 6, // 12: ctpd.CTPd.RunList:output_type -> ctpd.RunReply - 6, // 13: ctpd.CTPd.RunStop:output_type -> ctpd.RunReply - 6, // 14: ctpd.CTPd.RunConfig:output_type -> ctpd.RunReply - 8, // [8:15] is the sub-list for method output_type - 1, // [1:8] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 0, // 0: ctpd.RunStartRequest.mode:type_name -> ctpd.RunStartRequest.Mode + 1, // 1: ctpd.CTPd.PrepareForRun:input_type -> ctpd.RunPrepareRequest + 2, // 2: ctpd.CTPd.RunLoad:input_type -> ctpd.RunLoadRequest + 6, // 3: ctpd.CTPd.RunUnload:input_type -> ctpd.RunStopRequest + 3, // 4: ctpd.CTPd.RunStart:input_type -> ctpd.RunStartRequest + 4, // 5: ctpd.CTPd.RunStatus:input_type -> ctpd.RunStatusRequest + 5, // 6: ctpd.CTPd.RunList:input_type -> ctpd.Empty + 6, // 7: ctpd.CTPd.RunStop:input_type -> ctpd.RunStopRequest + 6, // 8: ctpd.CTPd.RunConfig:input_type -> ctpd.RunStopRequest + 5, // 9: ctpd.CTPd.RunCleanup:input_type -> ctpd.Empty + 5, // 10: ctpd.CTPd.TPCReset:input_type -> ctpd.Empty + 7, // 11: ctpd.CTPd.PrepareForRun:output_type -> ctpd.RunReply + 7, // 12: ctpd.CTPd.RunLoad:output_type -> ctpd.RunReply + 7, // 13: ctpd.CTPd.RunUnload:output_type -> ctpd.RunReply + 7, // 14: ctpd.CTPd.RunStart:output_type -> ctpd.RunReply + 7, // 15: ctpd.CTPd.RunStatus:output_type -> ctpd.RunReply + 7, // 16: ctpd.CTPd.RunList:output_type -> ctpd.RunReply + 7, // 17: ctpd.CTPd.RunStop:output_type -> ctpd.RunReply + 7, // 18: ctpd.CTPd.RunConfig:output_type -> ctpd.RunReply + 7, // 19: ctpd.CTPd.RunCleanup:output_type -> ctpd.RunReply + 7, // 20: ctpd.CTPd.TPCReset:output_type -> ctpd.RunReply + 11, // [11:21] is the sub-list for method output_type + 1, // [1:11] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_protos_ctpecs_proto_init() } @@ -548,7 +625,7 @@ func file_protos_ctpecs_proto_init() { } if !protoimpl.UnsafeEnabled { file_protos_ctpecs_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunLoadRequest); i { + switch v := v.(*RunPrepareRequest); i { case 0: return &v.state case 1: @@ -560,7 +637,7 @@ func file_protos_ctpecs_proto_init() { } } file_protos_ctpecs_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStartRequest); i { + switch v := v.(*RunLoadRequest); i { case 0: return &v.state case 1: @@ -572,7 +649,7 @@ func file_protos_ctpecs_proto_init() { } } file_protos_ctpecs_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStatusRequest); i { + switch v := v.(*RunStartRequest); i { case 0: return &v.state case 1: @@ -584,7 +661,7 @@ func file_protos_ctpecs_proto_init() { } } file_protos_ctpecs_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*RunStatusRequest); i { case 0: return &v.state case 1: @@ -596,7 +673,7 @@ func file_protos_ctpecs_proto_init() { } } file_protos_ctpecs_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStopRequest); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -608,6 +685,18 @@ func file_protos_ctpecs_proto_init() { } } file_protos_ctpecs_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RunStopRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctpecs_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RunReply); i { case 0: return &v.state @@ -626,7 +715,7 @@ func file_protos_ctpecs_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_ctpecs_proto_rawDesc, NumEnums: 1, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/trg/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go index 3f0de8d15..d603f977e 100644 --- a/core/integration/trg/protos/ctpecs_grpc.pb.go +++ b/core/integration/trg/protos/ctpecs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc v3.21.12 // source: protos/ctpecs.proto package ctpecs @@ -23,6 +23,7 @@ const _ = grpc.SupportPackageIsVersion7 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type CTPdClient interface { // global run: + PrepareForRun(ctx context.Context, in *RunPrepareRequest, opts ...grpc.CallOption) (*RunReply, error) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) RunUnload(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) // stdalone and global runs: @@ -31,6 +32,8 @@ type CTPdClient interface { RunList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) RunStop(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) RunConfig(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) + RunCleanup(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) + TPCReset(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) } type cTPdClient struct { @@ -41,6 +44,15 @@ func NewCTPdClient(cc grpc.ClientConnInterface) CTPdClient { return &cTPdClient{cc} } +func (c *cTPdClient) PrepareForRun(ctx context.Context, in *RunPrepareRequest, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/PrepareForRun", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunLoad", in, out, opts...) @@ -104,11 +116,30 @@ func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ... return out, nil } +func (c *cTPdClient) RunCleanup(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunCleanup", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *cTPdClient) TPCReset(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { + out := new(RunReply) + err := c.cc.Invoke(ctx, "/ctpd.CTPd/TPCReset", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // CTPdServer is the server API for CTPd service. // All implementations should embed UnimplementedCTPdServer // for forward compatibility type CTPdServer interface { // global run: + PrepareForRun(context.Context, *RunPrepareRequest) (*RunReply, error) RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) RunUnload(context.Context, *RunStopRequest) (*RunReply, error) // stdalone and global runs: @@ -117,12 +148,17 @@ type CTPdServer interface { RunList(context.Context, *Empty) (*RunReply, error) RunStop(context.Context, *RunStopRequest) (*RunReply, error) RunConfig(context.Context, *RunStopRequest) (*RunReply, error) + RunCleanup(context.Context, *Empty) (*RunReply, error) + TPCReset(context.Context, *Empty) (*RunReply, error) } // UnimplementedCTPdServer should be embedded to have forward compatible implementations. type UnimplementedCTPdServer struct { } +func (UnimplementedCTPdServer) PrepareForRun(context.Context, *RunPrepareRequest) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method PrepareForRun not implemented") +} func (UnimplementedCTPdServer) RunLoad(context.Context, *RunLoadRequest) (*RunReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RunLoad not implemented") } @@ -144,6 +180,12 @@ func (UnimplementedCTPdServer) RunStop(context.Context, *RunStopRequest) (*RunRe func (UnimplementedCTPdServer) RunConfig(context.Context, *RunStopRequest) (*RunReply, error) { return nil, status.Errorf(codes.Unimplemented, "method RunConfig not implemented") } +func (UnimplementedCTPdServer) RunCleanup(context.Context, *Empty) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method RunCleanup not implemented") +} +func (UnimplementedCTPdServer) TPCReset(context.Context, *Empty) (*RunReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method TPCReset not implemented") +} // UnsafeCTPdServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to CTPdServer will @@ -156,6 +198,24 @@ func RegisterCTPdServer(s grpc.ServiceRegistrar, srv CTPdServer) { s.RegisterService(&CTPd_ServiceDesc, srv) } +func _CTPd_PrepareForRun_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RunPrepareRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).PrepareForRun(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ctpd.CTPd/PrepareForRun", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).PrepareForRun(ctx, req.(*RunPrepareRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _CTPd_RunLoad_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RunLoadRequest) if err := dec(in); err != nil { @@ -282,6 +342,42 @@ func _CTPd_RunConfig_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _CTPd_RunCleanup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).RunCleanup(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ctpd.CTPd/RunCleanup", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).RunCleanup(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _CTPd_TPCReset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CTPdServer).TPCReset(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/ctpd.CTPd/TPCReset", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CTPdServer).TPCReset(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + // CTPd_ServiceDesc is the grpc.ServiceDesc for CTPd service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -289,6 +385,10 @@ var CTPd_ServiceDesc = grpc.ServiceDesc{ ServiceName: "ctpd.CTPd", HandlerType: (*CTPdServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "PrepareForRun", + Handler: _CTPd_PrepareForRun_Handler, + }, { MethodName: "RunLoad", Handler: _CTPd_RunLoad_Handler, @@ -317,6 +417,14 @@ var CTPd_ServiceDesc = grpc.ServiceDesc{ MethodName: "RunConfig", Handler: _CTPd_RunConfig_Handler, }, + { + MethodName: "RunCleanup", + Handler: _CTPd_RunCleanup_Handler, + }, + { + MethodName: "TPCReset", + Handler: _CTPd_TPCReset_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/ctpecs.proto", From 6216ec49760109310421584d9f733a735376d38d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Jun 2023 15:04:50 +0200 Subject: [PATCH 1667/2352] [core] Implement CTP PrepareForRun call --- core/integration/trg/plugin.go | 110 +++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 9e28eb7dc..0a4f61411 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -378,6 +378,116 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack = make(map[string]interface{}) + stack["PrepareForRun"] = func() (out string) { // must formally return string even when we return nothing + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + Info("ALIECS SOR operation : performing TRG PrepareForRun Request") + + runType, ok := varStack["run_type"] + if !ok { + log.WithField("partition", envId). + Debug("no run type set") + runType = "NONE" + } + + trgDetectorsParam, ok := varStack["trg_detectors"] + if !ok { + // "" -all required must be ready + log.WithField("partition", envId). + Debug("empty TRG detectors list provided") + trgDetectorsParam = "" + } + + callFailedStr := "TRG PrepareForRun call failed" + + detectors, err := p.parseDetectors(trgDetectorsParam) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("TRG error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + in := trgpb.RunPrepareRequest{ + Runtype: runType, + Detectors: detectors, + } + if p.trgClient == nil { + err = fmt.Errorf("TRG plugin not initialized, PrepareForRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if p.trgClient.GetConnState() == connectivity.Shutdown { + err = fmt.Errorf("TRG client connection not available, PrepareForRun impossible") + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + var response *trgpb.RunReply + response, err = p.trgClient.PrepareForRun(context.Background(), &in, grpc.EmptyCallOption{}) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if response != nil { + if response.Rc != 0 { + err = fmt.Errorf("response code %d from TRG: %s", response.Rc, response.Msg) + + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("endpoint", viper.GetString("trgServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("TRG error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + } + + log.WithField("partition", envId). + Info("ALIECS SOR Operation : TRG PrepareForRun success") + + return + } // global runs only stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). From 66f4db8338964ac945fc2263e95e4f9fb464049f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Jul 2023 14:34:50 +0200 Subject: [PATCH 1668/2352] [core] Log output consistency --- core/integration/trg/plugin.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 0a4f61411..ac06b1673 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -769,7 +769,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.pendingRunStops[envId] = runNumber64 log.WithField("partition", envId). WithField("run", runNumber64). - Debug("TRG RunStart success") + Info("TRG RunStart success") trgStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) @@ -880,7 +880,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { delete(p.pendingRunStops, envId) log.WithField("partition", envId). WithField("run", runNumber64). - Debug("TRG RunStop success") + Info("TRG RunStop success") trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) From 433dfa0be8705af5d94d7aa65aca7b7bef63057f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Jul 2023 15:36:25 +0200 Subject: [PATCH 1669/2352] [build] Bump to v0.71.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index afac38821..4f671ac57 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 70 -VERSION_PATCH := 2 +VERSION_MINOR := 71 +VERSION_PATCH := 0 From dd9274d51463bd2f7a13b7403a363b2e6e636eeb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 15:38:55 +0200 Subject: [PATCH 1670/2352] [build] Relocate shmcleaner script --- Makefile | 8 ++++---- cmd/o2-aliecs-shmcleaner => o2-aliecs-shmcleaner | 0 2 files changed, 4 insertions(+), 4 deletions(-) rename cmd/o2-aliecs-shmcleaner => o2-aliecs-shmcleaner (100%) diff --git a/Makefile b/Makefile index 4e3f96df7..49de4f154 100644 --- a/Makefile +++ b/Makefile @@ -96,8 +96,8 @@ $(WHAT): # special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script @if [ $@ == "o2-aliecs-executor" ]; then \ - echo -e "\033[1;33mcopy\033[0m ./cmd/o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m./bin/o2-aliecs-shmcleaner\033[0m"; \ - cp cmd/o2-aliecs-shmcleaner bin/o2-aliecs-shmcleaner; \ + echo -e "\033[1;33mcopy\033[0m ./o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m./bin/o2-aliecs-shmcleaner\033[0m"; \ + cp o2-aliecs-shmcleaner bin/o2-aliecs-shmcleaner; \ chmod +x bin/o2-aliecs-shmcleaner; \ fi; \ @@ -109,8 +109,8 @@ $(INSTALL_WHAT): # special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script @if [ $@ == "install_o2-aliecs-executor" ]; then \ - echo -e "\033[1;33minstall\033[0m ./cmd/o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/o2-aliecs-shmcleaner\033[0m"; \ - cp cmd/o2-aliecs-shmcleaner $${GOPATH}/bin/o2-aliecs-shmcleaner; \ + echo -e "\033[1;33minstall\033[0m ./o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/o2-aliecs-shmcleaner\033[0m"; \ + cp o2-aliecs-shmcleaner $${GOPATH}/bin/o2-aliecs-shmcleaner; \ chmod +x $${GOPATH}/bin/o2-aliecs-shmcleaner; \ fi; \ diff --git a/cmd/o2-aliecs-shmcleaner b/o2-aliecs-shmcleaner similarity index 100% rename from cmd/o2-aliecs-shmcleaner rename to o2-aliecs-shmcleaner From 612b4201d472daafe68406dde2580ffb3e065968 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 15:51:50 +0200 Subject: [PATCH 1671/2352] [build] Point to where the tests actually are --- Makefile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 49de4f154..119115f85 100644 --- a/Makefile +++ b/Makefile @@ -63,6 +63,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut +TEST_DIRS := ./configuration/cfgbackend ./core/repos # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product @@ -124,10 +125,10 @@ endif done test: - $(BUILD_FLAGS) go test -v --race $(SRC_DIRS) -ginkgo.progress + $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.progress debugtest: - $(BUILD_FLAGS) go test -v --race $(SRC_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress + $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress vet: go vet $(SRC_DIRS) From 78da4a35c97a9c01170bcc2be525a34d15afbf77 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 16:24:08 +0200 Subject: [PATCH 1672/2352] [build] Treat separately execution of Go tests vs. Ginkgo tests --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 119115f85..97c3f01f9 100644 --- a/Makefile +++ b/Makefile @@ -63,7 +63,8 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./configuration/cfgbackend ./core/repos +TEST_DIRS := ./configuration/cfgbackend +GO_TEST_DIRS := ./core/repos # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product @@ -126,9 +127,11 @@ endif test: $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.progress + $(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) debugtest: $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress + $(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) vet: go vet $(SRC_DIRS) From b36421201471ae570a54eb584beec9597d4e75d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 16:25:13 +0200 Subject: [PATCH 1673/2352] [core] Ensure the Repo structure always answers with a correct protocol --- core/repos/repo.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/repos/repo.go b/core/repos/repo.go index 9c20ce3e3..55608de98 100644 --- a/core/repos/repo.go +++ b/core/repos/repo.go @@ -26,9 +26,6 @@ package repos import ( "errors" - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/gobwas/glob" "io/ioutil" "net/url" "os" @@ -37,6 +34,10 @@ import ( "path/filepath" "regexp" "strings" + + "github.com/go-git/go-git/v5" + "github.com/go-git/go-git/v5/plumbing" + "github.com/gobwas/glob" ) type iRepo interface { @@ -86,6 +87,7 @@ type Repo struct { Default bool Revisions []string ReposPath string + Protocol string } const jitScriptsDir = "jit" @@ -193,6 +195,7 @@ func NewRepo(repoPath string, defaultRevision string, reposPath string) (string, Revision: revision, DefaultRevision: defaultRevision, ReposPath: reposPath, + Protocol: protocol, } return protocol, newRepo, nil @@ -471,7 +474,7 @@ func (r *Repo) getHostingSite() string { } func (r *Repo) GetProtocol() string { - return "na" + return r.Protocol } func (r *Repo) getPath() string { From cc70d5d34cf8729b3008c38d69abdd766d54cb2f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 16:25:59 +0200 Subject: [PATCH 1674/2352] [core] Fix repo system tests --- core/repos/httpsrepo_test.go | 21 +++++++++++---------- core/repos/localrepo_test.go | 9 +++++---- core/repos/repo_test.go | 15 ++++++++------- core/repos/sshrepo_test.go | 11 ++++++----- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/core/repos/httpsrepo_test.go b/core/repos/httpsrepo_test.go index 88cd1cc2d..f655ce5e9 100644 --- a/core/repos/httpsrepo_test.go +++ b/core/repos/httpsrepo_test.go @@ -38,18 +38,19 @@ var httpTs = ts{ DefaultRevision: "main", RepoPath: "github.com/AliceO2Group/ControlWorkflows", RepoPathDotGit: "github.com/AliceO2Group/ControlWorkflows.git", + ReposPath: "/var/lib/o2/aliecs/repos", } func TestNewRepoInvalidUrl(t *testing.T) { repoPathInvalid := "site.com/path" - _, err := NewRepo(repoPathInvalid, "") + _, _, err := NewRepo(repoPathInvalid, "", httpTs.ReposPath) if err == nil { t.Errorf("NewRepo() should fail if repo URL (non-file) can't be sliced into at least 3 parts") } } func TestNewRepoDotGit(t *testing.T) { - repo, err := NewRepo(httpTs.RepoPathDotGit, "") + _, repo, err := NewRepo(httpTs.RepoPathDotGit, "", httpTs.ReposPath) if err != nil { t.Errorf("NewRepo() shouldn't fail with valid inputs") return @@ -64,7 +65,7 @@ func TestNewRepoWithRevision(t *testing.T) { revision := "dummy-revision" repoPath := httpTs.RepoPath + "@" + revision - repo, err := NewRepo(repoPath, httpTs.DefaultRevision) + _, repo, err := NewRepo(repoPath, httpTs.DefaultRevision, httpTs.ReposPath) if err != nil { t.Errorf("Creating a new valid repo shouldn't error out") return @@ -89,7 +90,7 @@ func TestNewRepoWithInvalidRevision(t *testing.T) { revision := "dummy-revision" repoPath := httpTs.RepoPath + "@" + revision + "@" + revision - _, err := NewRepo(repoPath, httpTs.DefaultRevision) + _, _, err := NewRepo(repoPath, httpTs.DefaultRevision, httpTs.ReposPath) if err == nil { t.Errorf("Creating a new repo with an invalid revision should error out") return @@ -97,7 +98,7 @@ func TestNewRepoWithInvalidRevision(t *testing.T) { } func TestNewRepoHttps(t *testing.T) { - repo, err := NewRepo(httpTs.RepoPath, httpTs.DefaultRevision) + _, repo, err := NewRepo(httpTs.RepoPath, httpTs.DefaultRevision, httpTs.ReposPath) if err != nil { t.Errorf("Creating a new valid repo shouldn't error out") return @@ -134,7 +135,7 @@ func TestNewRepoHttps(t *testing.T) { } func TestGetUriHttps(t *testing.T) { - repo, _ := NewRepo(httpTs.RepoPath, "") + _, repo, _ := NewRepo(httpTs.RepoPath, "", httpTs.ReposPath) expectedUri := "https://" + httpTs.HostingSite + "/" + httpTs.Path + "/" + httpTs.RepoName + ".git" if repo.getUri() != expectedUri { @@ -143,7 +144,7 @@ func TestGetUriHttps(t *testing.T) { } func TestGetUriHttpsWithDotGit(t *testing.T) { - repo, _ := NewRepo(httpTs.RepoPathDotGit, "") + _, repo, _ := NewRepo(httpTs.RepoPathDotGit, "", httpTs.ReposPath) u, _ := url.Parse(httpTs.Protocol + "://") u.Path = path.Join(u.Path, httpTs.HostingSite, @@ -158,7 +159,7 @@ func TestGetUriHttpsWithDotGit(t *testing.T) { } func TestGetIdentifierHttps(t *testing.T) { - repo, _ := NewRepo(httpTs.RepoPath, "") + _, repo, _ := NewRepo(httpTs.RepoPath, "", httpTs.ReposPath) expectedIdentifier := path.Join(httpTs.HostingSite, httpTs.Path, httpTs.RepoName) if repo.GetIdentifier() != expectedIdentifier { @@ -167,10 +168,10 @@ func TestGetIdentifierHttps(t *testing.T) { } func TestGetIdentifierHttpsDotGit(t *testing.T) { - repo, _ := NewRepo(httpTs.RepoPathDotGit, "") + _, repo, _ := NewRepo(httpTs.RepoPathDotGit, "", httpTs.ReposPath) expectedIdentifier := path.Join(httpTs.HostingSite, httpTs.Path, httpTs.RepoName) if repo.GetIdentifier() != expectedIdentifier { t.Errorf("Got identifier %s instead of %s", repo.GetIdentifier(), expectedIdentifier) } -} \ No newline at end of file +} diff --git a/core/repos/localrepo_test.go b/core/repos/localrepo_test.go index 1d9829e3c..0ad643170 100644 --- a/core/repos/localrepo_test.go +++ b/core/repos/localrepo_test.go @@ -38,10 +38,11 @@ var localTs = ts{ DefaultRevision: "local", RepoPath: "/home/user/git/ControlWorkflows", RepoPathDotGit: "/home/user/git/ControlWorkflows.git", + ReposPath: "/var/lib/o2/aliecs/repos", } func TestNewRepoLocal(t *testing.T) { - repo, err := NewRepo(localTs.RepoPath, localTs.DefaultRevision) + _, repo, err := NewRepo(localTs.RepoPath, localTs.DefaultRevision, httpTs.ReposPath) if err != nil { t.Errorf("Creating a new valid repo shouldn't error out") return @@ -78,7 +79,7 @@ func TestNewRepoLocal(t *testing.T) { } func TestGetIdentifierLocal(t *testing.T) { - repo, _ := NewRepo(localTs.RepoPath, "") + _, repo, _ := NewRepo(localTs.RepoPath, "", httpTs.ReposPath) expectedIdentifier := localTs.Path + "/" + localTs.RepoName if repo.GetIdentifier() != expectedIdentifier { @@ -87,7 +88,7 @@ func TestGetIdentifierLocal(t *testing.T) { } func TestGetUriLocal(t *testing.T) { - repo, _ := NewRepo(localTs.RepoPath, "") + _, repo, _ := NewRepo(localTs.RepoPath, "", httpTs.ReposPath) u, _ := url.Parse(localTs.Protocol + "://") u.Path = path.Join(u.Path, localTs.HostingSite, @@ -98,4 +99,4 @@ func TestGetUriLocal(t *testing.T) { if repo.getUri() != expectedUri { t.Errorf("Got %s URI instead of %s", repo.getUri(), expectedUri) } -} \ No newline at end of file +} diff --git a/core/repos/repo_test.go b/core/repos/repo_test.go index 1acfb5642..5636a4339 100644 --- a/core/repos/repo_test.go +++ b/core/repos/repo_test.go @@ -26,11 +26,12 @@ package repos // ts is a helper testing struct for the repos package type ts struct { - Protocol string - HostingSite string - Path string - RepoName string + Protocol string + HostingSite string + Path string + RepoName string DefaultRevision string - RepoPath string - RepoPathDotGit string -} \ No newline at end of file + RepoPath string + RepoPathDotGit string + ReposPath string +} diff --git a/core/repos/sshrepo_test.go b/core/repos/sshrepo_test.go index 72749ec62..0213da3da 100644 --- a/core/repos/sshrepo_test.go +++ b/core/repos/sshrepo_test.go @@ -38,11 +38,12 @@ var sshTs = ts{ DefaultRevision: "main", RepoPath: "git-server:/opt/git/ControlWorkflows", RepoPathDotGit: "git-server:/opt/git/ControlWorkflows.git", + ReposPath: "/var/lib/o2/aliecs/repos", } func TestGetUriSsh(t *testing.T) { - repo, _ := NewRepo(sshTs.RepoPath, "") - u, _ := url.Parse(sshTs.Protocol + "://git@" + sshTs.HostingSite) + _, repo, _ := NewRepo(sshTs.RepoPath, "", httpTs.ReposPath) + u, _ := url.Parse(sshTs.Protocol + "://" + sshTs.HostingSite) u.Path = path.Join(u.Path, sshTs.Path, sshTs.RepoName) @@ -54,7 +55,7 @@ func TestGetUriSsh(t *testing.T) { } func TestGetIdentifierSsh(t *testing.T) { - repo, _ := NewRepo(sshTs.RepoPath, "") + _, repo, _ := NewRepo(sshTs.RepoPath, "", httpTs.ReposPath) expectedIdentifier := path.Join(sshTs.HostingSite, sshTs.Path, sshTs.RepoName) if repo.GetIdentifier() != expectedIdentifier { @@ -63,7 +64,7 @@ func TestGetIdentifierSsh(t *testing.T) { } func TestNewRepoSsh(t *testing.T) { - repo, err := NewRepo(sshTs.RepoPath, sshTs.DefaultRevision) + _, repo, err := NewRepo(sshTs.RepoPath, sshTs.DefaultRevision, httpTs.ReposPath) if err != nil { t.Errorf("Creating a new valid repo shouldn't error out") return @@ -97,4 +98,4 @@ func TestNewRepoSsh(t *testing.T) { if repo.getRevision() != repo.GetDefaultRevision() { t.Errorf("Repo's revision should fall back to default revision, when latter specified. Got %s instead of %s", repo.getRevision(), repo.GetDefaultRevision()) } -} \ No newline at end of file +} From d07fe5bf25044210d7035e696963ae645117e31b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 17:09:45 +0200 Subject: [PATCH 1675/2352] [build] Improve make test and make debugtest output --- Makefile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 97c3f01f9..f164fcd03 100644 --- a/Makefile +++ b/Makefile @@ -126,12 +126,18 @@ endif done test: - $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.progress - $(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) + @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.progress + + @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) debugtest: - $(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress - $(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) + @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress + + @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) vet: go vet $(SRC_DIRS) From eea82c7ecc4202da5e16976cd9833f28d70b93e0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 17:13:52 +0200 Subject: [PATCH 1676/2352] [build] Update Ginkgo/Gomega testing framework --- .../cfgbackend/configuration_suite_test.go | 5 ++-- configuration/cfgbackend/source_test.go | 4 +-- go.mod | 27 +++++++++++------- go.sum | 28 +++++++++++++++++++ 4 files changed, 50 insertions(+), 14 deletions(-) diff --git a/configuration/cfgbackend/configuration_suite_test.go b/configuration/cfgbackend/configuration_suite_test.go index fdbb2984f..55bcc0eea 100644 --- a/configuration/cfgbackend/configuration_suite_test.go +++ b/configuration/cfgbackend/configuration_suite_test.go @@ -6,11 +6,12 @@ import ( "os" "testing" - . "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) var tmpDir *string + const configFile = "configuration_test.yaml" func TestConfiguration(t *testing.T) { @@ -29,7 +30,7 @@ var _ = BeforeSuite(func() { Expect(err).NotTo(HaveOccurred()) defer from.Close() - to, err := os.OpenFile(*tmpDir+ "/" +configFile, os.O_RDWR|os.O_CREATE, 0666) + to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) Expect(err).NotTo(HaveOccurred()) defer to.Close() diff --git a/configuration/cfgbackend/source_test.go b/configuration/cfgbackend/source_test.go index e98c24e97..5321b977c 100644 --- a/configuration/cfgbackend/source_test.go +++ b/configuration/cfgbackend/source_test.go @@ -2,7 +2,7 @@ package cfgbackend_test import ( "github.com/AliceO2Group/Control/configuration/cfgbackend" - . "github.com/onsi/ginkgo" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "gopkg.in/yaml.v3" ) @@ -128,7 +128,7 @@ var _ = Describe("Source", func() { }) }) - Context("to add a new subtree or value", func(){ + Context("to add a new subtree or value", func() { It("should correctly push a single value", func() { Expect(c.Exists("o2/control/tasks[0]/bind[1]/newSingleValue")).To(BeFalse()) putErr := c.Put("o2/control/tasks[0]/bind[1]/newSingleValue", "foobar") diff --git a/go.mod b/go.mod index 82e0f5593..67cd2d953 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/gdamore/tcell/v2 v2.5.2 github.com/go-git/go-git/v5 v5.4.2 github.com/gobwas/glob v0.2.3 - github.com/golang/protobuf v1.5.2 + github.com/golang/protobuf v1.5.3 github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/hashicorp/consul/api v1.13.1 @@ -44,8 +44,6 @@ require ( github.com/mitchellh/go-homedir v1.1.0 github.com/naoina/toml v0.1.1 github.com/olekukonko/tablewriter v0.0.5 - github.com/onsi/ginkgo v1.15.0 - github.com/onsi/gomega v1.10.5 github.com/osamingo/indigo v1.1.0 github.com/pborman/uuid v1.2.1 github.com/prometheus/client_golang v1.12.2 @@ -62,15 +60,20 @@ require ( github.com/valyala/fasttemplate v1.2.1 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.1.0 - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa - golang.org/x/net v0.7.0 - golang.org/x/sys v0.5.0 + golang.org/x/crypto v0.11.0 + golang.org/x/net v0.12.0 + golang.org/x/sys v0.10.0 google.golang.org/grpc v1.50.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.28.1 gopkg.in/yaml.v3 v3.0.1 ) +require ( + github.com/onsi/ginkgo/v2 v2.11.0 + github.com/onsi/gomega v1.27.8 +) + require ( github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81 // indirect github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect @@ -87,7 +90,11 @@ require ( github.com/gliderlabs/ssh v0.3.0 // indirect github.com/go-git/gcfg v1.5.0 // indirect github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.2.2 // indirect @@ -144,11 +151,11 @@ require ( github.com/xanzy/ssh-agent v0.3.1 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect + golang.org/x/mod v0.12.0 // indirect golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect - golang.org/x/term v0.5.0 // indirect - golang.org/x/text v0.7.0 // indirect - golang.org/x/tools v0.1.12 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + golang.org/x/tools v0.11.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect gopkg.in/ini.v1 v1.66.6 // indirect diff --git a/go.sum b/go.sum index 91f14ac0b..743770e62 100644 --- a/go.sum +++ b/go.sum @@ -200,7 +200,11 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -235,6 +239,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -251,6 +257,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -265,6 +273,8 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -458,10 +468,14 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= +github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= +github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= +github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= +github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= github.com/osamingo/indigo v1.1.0 h1:wRq0ZpnuJ4hXLeMIh4KcH+4IbUnGCUvcfipYIQPP6pg= @@ -643,6 +657,8 @@ golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -681,6 +697,8 @@ golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -735,6 +753,8 @@ golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -845,6 +865,8 @@ golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -856,6 +878,8 @@ golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -869,6 +893,8 @@ golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -927,6 +953,8 @@ golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b2362a0302da09a30dea3def1341f4470c7508f3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 14 Jul 2023 17:14:17 +0200 Subject: [PATCH 1677/2352] [build] Use new instead of deprecated ginkgo params --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index f164fcd03..99a891664 100644 --- a/Makefile +++ b/Makefile @@ -127,14 +127,14 @@ endif test: @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.progress + @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.show-node-events @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) debugtest: @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.progress + @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.show-node-events @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) From 941cdccc2f4cd47dcf0d199776fb1ce28ce9283f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 17 Jul 2023 13:51:20 +0200 Subject: [PATCH 1678/2352] [build] Update all dependencies --- go.mod | 141 +++++++-------- go.sum | 544 +++++++++++++++++++-------------------------------------- 2 files changed, 248 insertions(+), 437 deletions(-) diff --git a/go.mod b/go.mod index 67cd2d953..2b2be5a1d 100644 --- a/go.mod +++ b/go.mod @@ -17,151 +17,144 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 // tview should be version 0ba8301b415c otherwise peanut will deadlock require ( - github.com/AlecAivazis/survey/v2 v2.3.5 - github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81 + github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/antonmedv/expr v1.9.0 - github.com/briandowns/spinner v1.19.0 + github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/antonmedv/expr v1.12.6 + github.com/briandowns/spinner v1.23.0 github.com/denisbrodbeck/machineid v1.0.1 - github.com/dmarkham/enumer v1.5.5 - github.com/fatih/color v1.13.0 + github.com/dmarkham/enumer v1.5.8 + github.com/fatih/color v1.15.0 github.com/flosch/pongo2/v4 v4.0.2 - github.com/gdamore/tcell/v2 v2.5.2 - github.com/go-git/go-git/v5 v5.4.2 + github.com/gdamore/tcell/v2 v2.6.0 + github.com/go-git/go-git/v5 v5.7.0 github.com/gobwas/glob v0.2.3 - github.com/golang/protobuf v1.5.3 + github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 - github.com/hashicorp/consul/api v1.13.1 - github.com/imdario/mergo v0.3.13 + github.com/hashicorp/consul/api v1.22.0 + github.com/imdario/mergo v0.3.16 github.com/jinzhu/copier v0.3.5 github.com/k0kubun/pp v3.0.1+incompatible - github.com/looplab/fsm v0.3.0 + github.com/looplab/fsm v1.0.1 github.com/mesos/mesos-go v0.0.11 github.com/mitchellh/go-homedir v1.1.0 github.com/naoina/toml v0.1.1 github.com/olekukonko/tablewriter v0.0.5 - github.com/osamingo/indigo v1.1.0 + github.com/osamingo/indigo v1.1.1 github.com/pborman/uuid v1.2.1 - github.com/prometheus/client_golang v1.12.2 + github.com/prometheus/client_golang v1.16.0 github.com/pseudomuto/protoc-gen-doc v1.5.1 - github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e - github.com/rs/xid v1.4.0 + github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf + github.com/rs/xid v1.5.0 github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/kafka-go v0.4.33 - github.com/sirupsen/logrus v1.9.0 - github.com/spf13/cobra v1.5.0 + github.com/segmentio/kafka-go v0.4.42 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.12.0 - github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 - github.com/valyala/fasttemplate v1.2.1 + github.com/spf13/viper v1.16.0 + github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a + github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 - github.com/xlab/treeprint v1.1.0 + github.com/xlab/treeprint v1.2.0 golang.org/x/crypto v0.11.0 golang.org/x/net v0.12.0 golang.org/x/sys v0.10.0 - google.golang.org/grpc v1.50.1 + google.golang.org/grpc v1.56.2 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.28.1 + google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v3 v3.0.1 ) require ( + github.com/hashicorp/go-multierror v1.1.1 + github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 github.com/onsi/gomega v1.27.8 ) require ( - github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf // indirect - github.com/acomagu/bufpipe v1.0.3 // indirect - github.com/armon/go-metrics v0.4.0 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb // indirect + github.com/acomagu/bufpipe v1.0.4 // indirect + github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.1.2 // indirect - github.com/cloudflare/circl v1.2.0 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cloudflare/circl v1.3.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/envoyproxy/protoc-gen-validate v0.6.7 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect - github.com/gliderlabs/ssh v0.3.0 // indirect - github.com/go-git/gcfg v1.5.0 // indirect - github.com/go-git/go-billy/v5 v5.3.1 // indirect + github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect + github.com/go-git/go-billy/v5 v5.4.1 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect - github.com/hashicorp/errwrap v1.0.0 // indirect + github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.2.2 // indirect + github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v0.5.5 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.2 // indirect - github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/hcl v1.0.0 // indirect - github.com/hashicorp/serf v0.9.8 // indirect - github.com/huandu/xstrings v1.3.2 // indirect - github.com/iancoleman/strcase v0.2.0 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/hashicorp/serf v0.10.1 // indirect + github.com/huandu/xstrings v1.4.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.15.9 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/magiconair/properties v1.8.6 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect + github.com/magiconair/properties v1.8.7 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect github.com/mwitkow/go-proto-validators v0.3.2 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect - github.com/nxadm/tail v1.4.8 // indirect github.com/osamingo/base58 v1.0.0 // indirect github.com/pascaldekloe/name v1.0.1 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.2 // indirect - github.com/pierrec/lz4/v4 v4.1.15 // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_model v0.2.0 // indirect - github.com/prometheus/common v0.37.0 // indirect - github.com/prometheus/procfs v0.8.0 // indirect + github.com/prometheus/client_model v0.4.0 // indirect + github.com/prometheus/common v0.44.0 // indirect + github.com/prometheus/procfs v0.11.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect - github.com/rivo/uniseg v0.3.1 // indirect - github.com/sergi/go-diff v1.2.0 // indirect - github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4 // indirect - github.com/spf13/afero v1.9.2 // indirect - github.com/spf13/cast v1.5.0 // indirect + github.com/rivo/uniseg v0.4.4 // indirect + github.com/sergi/go-diff v1.3.1 // indirect + github.com/skeema/knownhosts v1.2.0 // indirect + github.com/sony/sonyflake v1.1.0 // indirect + github.com/spf13/afero v1.9.5 // indirect + github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.4.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect - github.com/xanzy/ssh-agent v0.3.1 // indirect + github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect + golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect golang.org/x/mod v0.12.0 // indirect - golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 // indirect golang.org/x/term v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect golang.org/x/tools v0.11.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c // indirect - gopkg.in/ini.v1 v1.66.6 // indirect - gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect + google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect ) replace github.com/codahale/hdrhistogram => github.com/HdrHistogram/hdrhistogram-go v1.0.1 diff --git a/go.sum b/go.sum index 743770e62..5f5857d9b 100644 --- a/go.sum +++ b/go.sum @@ -36,37 +36,10 @@ cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RX cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AlecAivazis/survey/v2 v2.3.5 h1:A8cYupsAZkjaUmhtTYv3sSqc7LO5mp1XDfqe5E/9wRQ= -github.com/AlecAivazis/survey/v2 v2.3.5/go.mod h1:4AuI9b7RjAR+G7v9+C4YSlX/YL3K3cWNXgWXOhllqvI= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585 h1:6a/sKkS2BqoHy86Q84t7i+ahZCtteiHmTZOuM6dWJBw= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220815084933-efc7e8535585/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199 h1:EI8ugZdpBDrw+r3NBB3jTHi70ZjWtn2mw51adWp2dyk= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220822072833-fc401db25199/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333 h1:Xb/ae/d0lr9H/Tu79QU1RuZxsXnrrBFBLPKZlpi8ve4= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220823123025-9dd12daec333/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a h1:4OAFuJSznjHJMZPGZ5hOdblzPOj0SfiNNunbnHvx2zI= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220825085310-64376c38d98a/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa h1:mB2uiZqIAL++NeviZ04KlQpV2AhX/RA8sHlryl8dgeU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220826084101-63b3fa3f3aaa/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81 h1:iMo7OJaBd9T/LBfsRys5UwiKNE8qh36tCTOprhNTeCs= -github.com/AliceO2Group/Bookkeeping v0.17.13-0.20220921090341-85645ac18c81/go.mod h1:Ig2ePkJuGnTF9NH+f8f1h5A8yGIuWowPHBlpQHn/0NU= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9 h1:EFT2gDt8/WmdigDJvy9b/WzRJWt1WdULVQOsLC8eXKQ= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220801093408-62dca87baca9/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585 h1:dGVFnSz3hmp+qNFBDFQRyJZgTIu4BVGInfYYE6jA1E4= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220815084933-efc7e8535585/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199 h1:DSbYnoI7cDJ13KROrxlzhJct+s2VA4F4N6kXSdN8zjc= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220822072833-fc401db25199/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333 h1:Z7G29Tqh2xTUiIsbs5NrPBFl7HfLq5h6Gtx4m0Uimcg= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220823123025-9dd12daec333/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38d98a h1:h/gumFg8Jlof4d2c9Iu/pmNtGpmRc6akFaxg4IiykaY= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220825085310-64376c38d98a/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa h1:wNjl7QcKhcwawU1ikpZ80AwfFE961tI+uSW1rkWG03g= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220826084101-63b3fa3f3aaa/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81 h1:pCcBVHufYuC0YEK/pLkcqlzOGzHKK64Nx1Lm9H913vk= -github.com/AliceO2Group/Bookkeeping/go-api-client v0.0.0-20220921090341-85645ac18c81/go.mod h1:w64yucnc/ncO+KGk26OY4Uhy+Vf/WAbU85ZfunlN7XM= +github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= +github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= @@ -74,79 +47,65 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.5.0/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= +github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= +github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= -github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf h1:aFFtnGZ6/2Qlvx80yxA2fFSYDQWTFjtKozQKB36A3/A= -github.com/ProtonMail/go-crypto v0.0.0-20220730123233-d6ffb7692adf/go.mod h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8= -github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= -github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= +github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb h1:RU+Ff2vE68zFQSoBqlb/LChFztEWWJ9EZ8LU4gA3ubU= +github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= +github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= -github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/antonmedv/expr v1.9.0 h1:j4HI3NHEdgDnN9p6oI6Ndr0G5QryMY0FNxT4ONrFDGU= -github.com/antonmedv/expr v1.9.0/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= +github.com/antonmedv/expr v1.12.6 h1:qtgMHOFissxhePwokx0xB9eqS6PUy0SbhDRPD67PInA= +github.com/antonmedv/expr v1.12.6/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= -github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= +github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= +github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/briandowns/spinner v1.19.0 h1:s8aq38H+Qju89yhp89b4iIiMzMm8YN3p6vGpwyh/a8E= -github.com/briandowns/spinner v1.19.0/go.mod h1:mQak9GHqbspjC/5iUx3qMlIho8xBS/ppAL/hX5SmPJU= -github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/bwesterb/go-ristretto v1.2.1/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= +github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= +github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= -github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= -github.com/cloudflare/circl v1.2.0 h1:NheeISPSUcYftKlfrLuOo4T62FkmD4t4jviLfFFYaec= -github.com/cloudflare/circl v1.2.0/go.mod h1:Ch2UgYr6ti2KTtlejELlROl0YIYj7SLjAC8M+INXlMk= +github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= +github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dmarkham/enumer v1.5.5 h1:LpOGL3PQTPOM87rgowZEf7Z5EmkgnKqUtS92Vo+vqzs= -github.com/dmarkham/enumer v1.5.5/go.mod h1:qHwULwuCxYFAFM5KCkpF1U/U0BF5sNQKLccvUzKNY2w= -github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= +github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= +github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= +github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -154,52 +113,38 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8= -github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= -github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell v1.3.0/go.mod h1:Hjvr+Ofd+gLglo7RYKxxnzCBmev3BzsS67MebKS4zMM= -github.com/gdamore/tcell/v2 v2.4.1-0.20210905002822-f057f0a857a1/go.mod h1:Az6Jt+M5idSED2YPGtwnfJV0kXohgdCBPmHGSYc1r04= -github.com/gdamore/tcell/v2 v2.5.2 h1:tKzG29kO9p2V++3oBY2W9zUjYu7IK1MENFeY/BzJSVY= -github.com/gdamore/tcell/v2 v2.5.2/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/gliderlabs/ssh v0.3.0 h1:7GcKy4erEljCE/QeQ2jTVpu+3f3zkpZOxOJjFYkMqYU= -github.com/gliderlabs/ssh v0.3.0/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= -github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= -github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= -github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= -github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= -github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= -github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= -github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= +github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= +github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= +github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= +github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= +github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= +github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= +github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -215,6 +160,8 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= +github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -237,13 +184,11 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -254,9 +199,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= -github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -285,28 +227,23 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hashicorp/consul/api v1.13.1 h1:r5cPdVFUy+pFF7nt+0ArLD9hm+E39OewJkvNdjKXcL4= -github.com/hashicorp/consul/api v1.13.1/go.mod h1:+1VcOos0TVdQFqXxphG4zmGcwQB4KVGkp1maPqnkDpE= -github.com/hashicorp/consul/sdk v0.10.0 h1:rGLEh2AWK4K0KCMvqWAz2EYxQqgciIfMagWZ0nVe5MI= -github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= -github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA= +github.com/hashicorp/consul/api v1.22.0 h1:ydEvDooB/A0c/xpsBd8GSt7P2/zYPBui4KrNip0xGjE= +github.com/hashicorp/consul/api v1.22.0/go.mod h1:zHpYgZ7TeYqS6zaszjwSt128OwESRpnhU9aGa6ue3Eg= +github.com/hashicorp/consul/sdk v0.14.0 h1:Hly+BMNMssVzoWddbBnBFi3W+Fzytvm0haSkihhj3GU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= +github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= +github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v1.2.2 h1:ihRI7YFwcZdiSD7SIenIhHfQH3OuDvWerAUBZbeQS3M= -github.com/hashicorp/go-hclog v1.2.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= +github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= -github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g4TbElacI= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= @@ -315,12 +252,11 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= -github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= @@ -329,78 +265,63 @@ github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= -github.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA= -github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= -github.com/hashicorp/serf v0.9.8 h1:JGklO/2Drf1QGa312EieQN3zhxQ+aJg6pG+aC3MFaVo= -github.com/hashicorp/serf v0.9.8/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= +github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= +github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huandu/xstrings v1.3.2 h1:L18LIDzqlW6xN2rEkpdV8+oL/IXWJ1APd+vsdYy4Wdw= -github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= -github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= +github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= +github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= +github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= -github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= -github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.15.7/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/looplab/fsm v0.3.0 h1:kIgNS3Yyud1tyxhG8kDqh853B7QqwnlWdgL3TD2s3Sw= -github.com/looplab/fsm v0.3.0/go.mod h1:PmD3fFvQEIsjMEfvZdrCDZ6y8VwKTwWNjlpEr6IKPO4= -github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= -github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/looplab/fsm v1.0.1 h1:OEW0ORrIx095N/6lgoGkFkotqH6s7vaFPsgjLAaF5QU= +github.com/looplab/fsm v1.0.1/go.mod h1:PmD3fFvQEIsjMEfvZdrCDZ6y8VwKTwWNjlpEr6IKPO4= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -408,22 +329,23 @@ github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVc github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.8/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -432,15 +354,12 @@ github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyex github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41 h1:WMszZWJG0XmzbK9FEmzH2TVcqYzFesusSIB41b8KHxY= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -449,9 +368,7 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.3.2 h1:qRlmpTzm2pstMKKzTdvwPCF5QfBNURSlAgN/R+qbKos= github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA7a5VarXUOUxD+oeD30w= github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= @@ -459,27 +376,16 @@ github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= -github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= -github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= -github.com/osamingo/indigo v1.1.0 h1:wRq0ZpnuJ4hXLeMIh4KcH+4IbUnGCUvcfipYIQPP6pg= -github.com/osamingo/indigo v1.1.0/go.mod h1:KnJW/XBDP4wLWMKxEowEyBh0LALfNVSBGOqRqEAm9NM= +github.com/osamingo/indigo v1.1.1 h1:tjPwqwZIq6pqUzfMxCKQeSaFRW0MzLrdT3lszGqYSpg= +github.com/osamingo/indigo v1.1.1/go.mod h1:+Ez17SDiXYBSHxbtUWfpLPEE+6zd49DInEhuFZ1B1Vc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -487,21 +393,20 @@ github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcM github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= -github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= -github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= +github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= @@ -509,87 +414,72 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BU github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= -github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34= -github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= -github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.37.0 h1:ccBbHCgIiT9uSoFY0vX8H3zsNR5eLt17/RQLUvn8pXE= -github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.8.0 h1:ODq8ZFEaYeCaZOJlZZdJA2AbQR98dSHSM1KW/You5mo= -github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= +github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/rivo/tview v0.0.0-20200219210816-cd38d7432498/go.mod h1:6lkG1x+13OShEf0EaOCaTQYyB7d5nSbb181KtjlS+84= -github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e h1:jWL4QylzqJQNk+iO3gkzbm433Akmn7nbRUEPrFU0SRA= -github.com/rivo/tview v0.0.0-20220731115447-9d32d269593e/go.mod h1:/Ve2+D+tGMTMNAlGXKCIX9ZeX2InzODYHotmtKZUUVk= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf h1:IchpMMtnfvzg7T3je672bP1nKWz1M4tW3kMZT6CbgoM= +github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.3.1 h1:SDPP7SHNl1L7KrEFCSJslJ/DM9DT02Nq2C61XrfHMmk= -github.com/rivo/uniseg v0.3.1/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= +github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= -github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.4.33 h1:XHYuEifMYFVCU9A2p1wJprd7xHQKS+Sn6xgBr11+30k= -github.com/segmentio/kafka-go v0.4.33/go.mod h1:GAjxBQJdQMB5zfNA21AhpaqOB2Mu+w3De4ni3Gbm8y0= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= +github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= +github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4 h1:KPf4aWX4JGEdMICunm9A0YTFbD6OL23G14BR7cL/0wg= -github.com/sony/sonyflake v1.0.1-0.20200827011719-848d664ceea4/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= -github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= +github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= +github.com/sony/sonyflake v1.1.0 h1:wnrEcL3aOkWmPlhScLEGAXKkLAIslnBteNUq4Bw6MM4= +github.com/sony/sonyflake v1.1.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= +github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= +github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= +github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= +github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v0.0.0-20161117074351-18a02ba4a312/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -598,26 +488,26 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= -github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= -github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295 h1:ml99EPrwDrFA7mQI6x6VmwXtTdHmMdoWVA8V3cGFTdk= -github.com/teo/logrus-prefixed-formatter v0.0.0-20171201112440-d4c78d981295/go.mod h1:/vIYPUgiUUmQHJW3z/k2aypVl+lBCplSCe6+NTwkmVc= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= +github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a/go.mod h1:76q+dZ4qOCuYrqwoUUjVCuAXF1TXB4jc98eaZFo6Yh0= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg= -github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE= -github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= -github.com/xanzy/ssh-agent v0.3.1 h1:AmzO1SSWxw73zxFZPRwaMN1MohDw8UyHnmuxyceTEGo= -github.com/xanzy/ssh-agent v0.3.1/go.mod h1:QIE4lCeL7nkC25x+yA3LBIYfwCc1TFziCtG7cBAac6w= -github.com/xdg/scram v1.0.5 h1:TuS0RFmt5Is5qm9Tm2SoD89OPqe4IRiFtyFY4iwWXsw= -github.com/xdg/scram v1.0.5/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.3 h1:cmL5Enob4W83ti/ZHuZLuKD/xqJfus4fVPwE+/BDm+4= -github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= +github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= @@ -625,38 +515,32 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHo github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xlab/treeprint v1.1.0 h1:G/1DjNkPpfZCFt9CSh6b5/nY4VimlbHF3Rh4obvtzDk= -github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -669,6 +553,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= +golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -682,7 +568,6 @@ golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRu golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -693,15 +578,12 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 h1:6zppjxzCulZykYSLyVDYbneBfbaBIQPYMevg0bEwv2s= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -725,34 +607,22 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220706163947-c90051bbdb60/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220728211354-c7608f3a8462 h1:UreQrH7DbFXSi9ZFox6FNT3WBooWmdANpU+IfkT1T4I= -golang.org/x/net v0.0.0-20220728211354-c7608f3a8462/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c h1:JVAXQ10yGGVbSyoer5VILysz6YKjdNT2bsvlayjqhes= -golang.org/x/net v0.0.0-20220822230855-b0a4917ee28c/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -764,13 +634,6 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c h1:q3gFqPqH7NVofKo3c3yETAP//pPI+G5mvB7qqj1Y5kY= -golang.org/x/oauth2 v0.0.0-20220722155238-128564f6959c/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094 h1:2o1E+E8TpNLklK9nHiPiK1uzIYrIHt+cQx3ynCwq9V8= -golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -782,10 +645,12 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -796,20 +661,13 @@ golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -823,61 +681,40 @@ golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210309074719-68d13333faf2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220315194320-039c03cc5b86/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220422013727-9388b58f7150/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220731174439-a90be440212d h1:Sv5ogFZatcgIMMtBSTTAgMYsicp25MXBubjXNDKwm80= -golang.org/x/sys v0.0.0-20220731174439-a90be440212d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210503060354-a79de5458b56/go.mod h1:tfny5GFUkzUvx4ps4ajbZsCe5lw1metzhBm9T3x7oIY= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -887,12 +724,11 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -945,14 +781,12 @@ golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12 h1:VveCTK38A2rkS8ZqFY25HIDFscX5X9OoEhJd3quQmXU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -984,7 +818,6 @@ google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1009,7 +842,6 @@ google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1023,10 +855,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9 h1:d3fKQZK+1rWQMg3xLKQbPMirUCo29I/NRdI2WarSzTg= -google.golang.org/genproto v0.0.0-20220728213248-dd149ef739b9/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c h1:QgY/XxIAIeccR+Ca/rDdKubLIU9rcJ3xfy1DC/Wd2Oo= -google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= +google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= +google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1040,17 +874,11 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w= -google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= -google.golang.org/grpc v1.50.1 h1:DS/BukOZWp8s6p4Dt/tOaJaTQyPyOoCcrjroHuCeLzY= -google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0 h1:TLkBREm4nIsEcexnCjgQd5GQWaHcqMzwQV0TX9pq8S0= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.2.0/go.mod h1:DNq5QpG7LJqD2AamLZ7zvKE0DEpVl2BSEVjFycAAjRY= +google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= +google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1065,36 +893,26 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= From f322c589826252e7e8a69067393d9b32f9b88c76 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 17 Jul 2023 13:51:49 +0200 Subject: [PATCH 1679/2352] [core] Adapt to current looplab/fsm package --- core/environment/environment.go | 11 ++++++----- core/task/scheduler.go | 2 +- core/task/schedulerstate.go | 16 ++++++++-------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index a00b645e3..a0c227b6e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -27,6 +27,7 @@ package environment import ( + "context" "errors" "fmt" "sort" @@ -148,7 +149,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { {Name: "RECOVER", Src: []string{"ERROR"}, Dst: "DEPLOYED"}, }, fsm.Callbacks{ - "before_event": func(e *fsm.Event) { + "before_event": func(_ context.Context, e *fsm.Event) { // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially @@ -229,7 +230,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { e.Cancel(errHooks) } }, - "leave_state": func(e *fsm.Event) { + "leave_state": func(_ context.Context, e *fsm.Event) { errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) if errHooks != nil { e.Cancel(errHooks) @@ -238,7 +239,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { env.handlerFunc()(e) }, - "enter_state": func(e *fsm.Event) { + "enter_state": func(_ context.Context, e *fsm.Event) { enterStateTimeMs := strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("enter_state_time_ms", enterStateTimeMs) @@ -255,7 +256,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { "partition": envId, }).Debug("environment.sm entering state") }, - "after_event": func(e *fsm.Event) { + "after_event": func(_ context.Context, e *fsm.Event) { errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) if errHooks != nil { e.Cancel(errHooks) @@ -613,7 +614,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { if err != nil { return } - err = env.Sm.Event(t.eventName(), t) + err = env.Sm.Event(context.Background(), t.eventName(), t) return } diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 6532ba6dc..3ade292f1 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -92,7 +92,7 @@ func runSchedulerController(ctx context.Context, switch { case receivedEvent == scheduler.Event_SUBSCRIBED: if state.sm.Is("INITIAL") { - state.sm.Event("CONNECT") + state.sm.Event(context.Background(), "CONNECT") } } } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index b2fb6e016..dd3d8bf43 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -143,34 +143,34 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( {Name: "EXIT", Src: []string{"CONNECTED"}, Dst: "FINAL"}, }, fsm.Callbacks{ - "before_event": func(e *fsm.Event) { + "before_event": func(_ context.Context, e *fsm.Event) { log.WithFields(logrus.Fields{ "event": e.Event, "src": e.Src, "dst": e.Dst, }).Debug("state.sm starting transition") }, - "enter_state": func(e *fsm.Event) { + "enter_state": func(_ context.Context, e *fsm.Event) { log.WithFields(logrus.Fields{ "event": e.Event, "src": e.Src, "dst": e.Dst, }).Debug("state.sm entering state") }, - "leave_CONNECTED": func(e *fsm.Event) { + "leave_CONNECTED": func(_ context.Context, e *fsm.Event) { log.Debug("leave_CONNECTED") }, - "before_NEW_ENVIRONMENT": func(e *fsm.Event) { + "before_NEW_ENVIRONMENT": func(_ context.Context, e *fsm.Event) { log.Debug("before_NEW_ENVIRONMENT") e.Async() //transition frozen until the corresponding fsm.Transition call }, - "enter_CONNECTED": func(e *fsm.Event) { + "enter_CONNECTED": func(_ context.Context, e *fsm.Event) { log.Debug("enter_CONNECTED") log.WithField("level", infologger.IL_Support). Info("scheduler connected") }, - "after_NEW_ENVIRONMENT": func(e *fsm.Event) { + "after_NEW_ENVIRONMENT": func(_ context.Context, e *fsm.Event) { log.Debug("after_NEW_ENVIRONMENT") }, }, @@ -206,10 +206,10 @@ func (state *schedulerState) Start(ctx context.Context) { if state.err != nil { err = state.err log.WithField("error", err.Error()).Debug("scheduler quit with error, main state machine GO_ERROR") - state.sm.Event("GO_ERROR", err) //TODO: use error information in GO_ERROR + state.sm.Event(context.Background(), "GO_ERROR", err) //TODO: use error information in GO_ERROR } else { log.Debug("scheduler quit, no errors") - state.sm.Event("EXIT") + state.sm.Event(context.Background(), "EXIT") } }() } From 25aaafa664b0c97f1331d25e43f4e6d95e1fd6e3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 18 Jul 2023 13:00:03 +0200 Subject: [PATCH 1680/2352] [OCTRL-802][core] no fill info if the last fill had no stable beams --- core/integration/bookkeeping/plugin.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e2dd07390..a8c47949c 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1426,7 +1426,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("bookkeeping plugin RetrieveFillInfo error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - } else if lhcFill.StableBeamEnd == nil || *lhcFill.StableBeamEnd != 0 { + } else if (lhcFill.StableBeamStart != nil && *lhcFill.StableBeamStart != 0) && (lhcFill.StableBeamEnd == nil || *lhcFill.StableBeamEnd == 0) { + // we enter here only if stable beams started and are not over (stable beams start exists && stable beams end does not exist) log.WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). @@ -1438,7 +1439,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Devel). WithField("endpoint", viper.GetString("bookkeepingBaseUri")). WithField("call", "RetrieveFillInfo"). - Debug("received a reply about fill info, but the stable beam end is in the past, will not read the fill info and will delete any existing") + Debug("received a reply about fill info, but the latest fill is over or stable beams are not started yet, will not read the fill info and will delete any existing") deleteLHCInfoInVarStack(varStack) } return From 077f9eec30f5187991b63e1f258a28ff4080c149 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Jul 2023 11:57:01 +0200 Subject: [PATCH 1681/2352] [core] Enable RPC call logging in non-verbose operation --- core/server.go | 51 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/core/server.go b/core/server.go index f7b2d7f51..d539fe1df 100644 --- a/core/server.go +++ b/core/server.go @@ -70,9 +70,27 @@ func NewServer(state *globalState) *grpc.Server { } func (m *RpcServer) logMethod() { - if !viper.GetBool("verbose") { + //if !viper.GetBool("verbose") { + // return + //} + pc, _, _, ok := runtime.Caller(1) + if !ok { return } + fun := runtime.FuncForPC(pc) + if fun == nil { + return + } + log.WithPrefix("rpcserver"). + WithField("method", fun.Name()). + WithField("level", infologger.IL_Support). + Info("handling RPC request") +} + +func (m *RpcServer) logMethodHandled() { + //if !viper.GetBool("verbose") { + // return + //} pc, _, _, ok := runtime.Caller(1) if !ok { return @@ -83,8 +101,8 @@ func (m *RpcServer) logMethod() { } log.WithPrefix("rpcserver"). WithField("method", fun.Name()). - WithField("level", infologger.IL_Trace). - Debug("handling RPC request") + WithField("level", infologger.IL_Support). + Info("handling RPC request DONE") } // Implements interface pb.ControlServer @@ -96,6 +114,7 @@ type RpcServer struct { func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() r := &pb.ListIntegratedServicesReply{Services: nil} @@ -143,6 +162,7 @@ func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) e func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoRequest) (*pb.GetFrameworkInfoReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() maj, _ := strconv.ParseInt(product.VERSION_MAJOR, 10, 32) min, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) @@ -198,6 +218,7 @@ func (*RpcServer) Teardown(context.Context, *pb.TeardownRequest) (*pb.TeardownRe func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironmentsRequest) (*pb.GetEnvironmentsReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() r := &pb.GetEnvironmentsReply{ FrameworkId: m.state.taskman.GetFrameworkID(), @@ -264,6 +285,8 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (reply *pb.NewEnvironmentReply, err error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() + // NEW_ENVIRONMENT transition // The following should // 1) Create a new value of type Environment struct @@ -367,6 +390,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRequest) (reply *pb.GetEnvironmentReply, err error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -426,6 +450,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvironmentRequest) (*pb.ControlEnvironmentReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -485,6 +510,7 @@ func (*RpcServer) ModifyEnvironment(context.Context, *pb.ModifyEnvironmentReques func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvironmentRequest) (*pb.DestroyEnvironmentReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil || len(req.Id) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -577,6 +603,8 @@ func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force boo func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetActiveDetectorsReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() + r := &pb.GetActiveDetectorsReply{ Detectors: make([]string, 0), } @@ -590,6 +618,7 @@ func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetA func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasksReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() tasks := m.state.taskman.GetTasks() r := &pb.GetTasksReply{ @@ -602,6 +631,7 @@ func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasks func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.GetTaskReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() task := m.state.taskman.GetTask(req.TaskId) if task == nil { @@ -653,6 +683,8 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge func (m *RpcServer) CleanupTasks(cxt context.Context, req *pb.CleanupTasksRequest) (*pb.CleanupTasksReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() + idsToKill := req.GetTaskIds() killed, running, err := m.doCleanupTasks(idsToKill) @@ -683,6 +715,7 @@ func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.Shor func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb.GetRolesReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil || len(req.EnvId) == 0 { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -710,6 +743,7 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflowTemplatesRequest) (*pb.GetWorkflowTemplatesReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -776,6 +810,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*pb.ListReposReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -804,6 +839,7 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -829,6 +865,7 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -846,6 +883,7 @@ func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) ( func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposRequest) (*pb.Empty, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -867,6 +905,7 @@ func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposReques func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRequest) (*pb.Empty, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -883,6 +922,7 @@ func (m *RpcServer) SetDefaultRepo(cxt context.Context, req *pb.SetDefaultRepoRe func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlobalDefaultRevisionRequest) (*pb.Empty, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -899,6 +939,7 @@ func (m *RpcServer) SetGlobalDefaultRevision(cxt context.Context, req *pb.SetGlo func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoDefaultRevisionRequest) (*pb.SetRepoDefaultRevisionReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() if req == nil { return nil, status.New(codes.InvalidArgument, "received nil request").Err() @@ -916,6 +957,8 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() + for { ch, ok := m.streams.GetChannel(req.GetId()) if !ok { @@ -940,6 +983,8 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoEnvironmentRequest) (*pb.NewAutoEnvironmentReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() + defer m.logMethodHandled() + ch := make(chan *pb.Event) m.streams.add(request.GetId(), ch) sub := environment.SubscribeToStream(ch) From 85545510c5c9a164243ccf31ebc350c3033c18d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Jul 2023 16:26:20 +0200 Subject: [PATCH 1682/2352] [build] Add grpc health package and bump dependencies --- go.mod | 8 ++++---- go.sum | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index 2b2be5a1d..086086c00 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( ) require ( - github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -150,9 +150,9 @@ require ( golang.org/x/term v0.10.0 // indirect golang.org/x/text v0.11.0 // indirect golang.org/x/tools v0.11.0 // indirect - google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 // indirect + google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect ) diff --git a/go.sum b/go.sum index 5f5857d9b..1e76fcb5c 100644 --- a/go.sum +++ b/go.sum @@ -52,8 +52,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb h1:RU+Ff2vE68zFQSoBqlb/LChFztEWWJ9EZ8LU4gA3ubU= -github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs= +github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -855,12 +855,12 @@ google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98 h1:Z0hjGZePRE0ZBWotvtrwxFNrNE9CUAGtplaDK5NNI/g= -google.golang.org/genproto v0.0.0-20230711160842-782d3b101e98/go.mod h1:S7mY02OqCJTD0E1OiQy1F72PWFB4bZJ87cAtLPYgDR0= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98 h1:FmF5cCW94Ij59cfpoLiwTgodWmm60eEV0CjlsVg2fuw= -google.golang.org/genproto/googleapis/api v0.0.0-20230711160842-782d3b101e98/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98 h1:bVf09lpb+OJbByTj913DRJioFFAjf/ZGxEz7MajTp2U= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= +google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw= +google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753/go.mod h1:iqkVr8IRpZ53gx1dEnWlCUIEwDWqWARWrbzpasaTNYM= +google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE= +google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= From eecef92abac5ac2f0afd08fdd462d91c25c92fd9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 19 Jul 2023 16:27:21 +0200 Subject: [PATCH 1683/2352] [core] Add basic grpc health check to core and Apricot --- apricot/remote/server.go | 3 +++ core/server.go | 3 +++ 2 files changed, 6 insertions(+) diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 3783cff0f..2bc155f03 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -37,6 +37,8 @@ import ( "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/codes" + "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" ) @@ -55,6 +57,7 @@ type RpcServer struct { func NewServer(service configuration.Service) *grpc.Server { s := grpc.NewServer() + grpc_health_v1.RegisterHealthServer(s, health.NewServer()) apricotpb.RegisterApricotServer(s, &RpcServer{ service: service, }) diff --git a/core/server.go b/core/server.go index d539fe1df..b29fc1ba9 100644 --- a/core/server.go +++ b/core/server.go @@ -42,6 +42,8 @@ import ( "github.com/jinzhu/copier" "github.com/spf13/viper" "google.golang.org/grpc/codes" + "google.golang.org/grpc/health" + "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" @@ -60,6 +62,7 @@ const MAX_ERROR_LENGTH = 6000 // gRPC seems to impose this limit on the status m func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() + grpc_health_v1.RegisterHealthServer(s, health.NewServer()) pb.RegisterControlServer(s, &RpcServer{ state: state, streams: newSafeStreamsMap(), From afcc48be0d8659ba247555fe1e97ba87d300b986 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 20 Jul 2023 12:36:05 +0200 Subject: [PATCH 1684/2352] [build] Bump to v0.72.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4f671ac57..cf0d43f6c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 71 +VERSION_MINOR := 72 VERSION_PATCH := 0 From ed1e1f4a56e5ad0c79d34804945f76f7510d53ee Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 18 Jul 2023 10:56:23 +0200 Subject: [PATCH 1685/2352] [core] Prevent nil pointer dereference in CCDB client --- core/integration/ccdb/plugin.go | 1 - 1 file changed, 1 deletion(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 97cbd5638..30fef1ab2 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -446,7 +446,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { grp := NewGRPObject(varStack) if grp == nil { log.WithField("call", "RunStop"). - WithField("run", grp.runNumber). WithField("partition", envId). WithField("level", infologger.IL_Devel). Debug("probably went to ERROR while not in RUNNING, doing nothing") From c7e96669e573b9693f8a1922ee358f4407edf381 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Jul 2023 11:12:26 +0200 Subject: [PATCH 1686/2352] [core] Include payload size for GetEnvironment integrated services data --- core/server.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/server.go b/core/server.go index b29fc1ba9..a6a9861cb 100644 --- a/core/server.go +++ b/core/server.go @@ -27,6 +27,7 @@ package core import ( + "encoding/json" "runtime" "sort" "strconv" @@ -447,6 +448,13 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe reply.Workflow = workflowToRoleTree(env.Workflow()) } reply.Environment.IncludedDetectors = env.GetActiveDetectors().StringList() + + jsonISData, err := json.Marshal(isEnvData) + log.WithPrefix("rpcserver"). + WithField("method", "GetEnvironment"). + WithField("level", infologger.IL_Support). + WithField("intServPayloadSize", len(jsonISData)). + Infof("returning payload incl. integrated services data for %d services", len(isEnvData)) return } From 3cc538bde296f76680fb96e8dfe0ea36e6dabd9b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Jul 2023 11:13:00 +0200 Subject: [PATCH 1687/2352] [build] Bump to v0.73.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cf0d43f6c..d0fc71526 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 72 +VERSION_MINOR := 73 VERSION_PATCH := 0 From bc1aa0345dfc9889b460446733c1cb09fbb96688 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 2 Aug 2023 16:52:10 +0200 Subject: [PATCH 1688/2352] [core] Add currentTransition field to o2control.proto + regenerate --- coconut/protos/o2control.pb.go | 1207 ++++++++++++++++---------------- core/protos/o2control.pb.go | 1207 ++++++++++++++++---------------- core/protos/o2control.proto | 1 + 3 files changed, 1219 insertions(+), 1196 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index e7834b9cb..39726c66e 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -1391,6 +1391,7 @@ type EnvironmentInfo struct { NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` + CurrentTransition string `protobuf:"bytes,16,opt,name=currentTransition,proto3" json:"currentTransition,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1530,6 +1531,13 @@ func (x *EnvironmentInfo) GetNumberOfTasks() int32 { return 0 } +func (x *EnvironmentInfo) GetCurrentTransition() string { + if x != nil { + return x.CurrentTransition + } + return "" +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4812,7 +4820,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xc5, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xf3, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4856,622 +4864,625 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, + 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, + 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, + 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, + 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, + 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, + 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, - 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, + 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, + 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, + 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, - 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, - 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, - 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, - 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, - 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, + 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, + 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, + 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, + 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, + 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, - 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, - 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, - 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, - 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index e7834b9cb..39726c66e 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -1391,6 +1391,7 @@ type EnvironmentInfo struct { NumberOfHosts int32 `protobuf:"varint,13,opt,name=numberOfHosts,proto3" json:"numberOfHosts,omitempty"` IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` + CurrentTransition string `protobuf:"bytes,16,opt,name=currentTransition,proto3" json:"currentTransition,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1530,6 +1531,13 @@ func (x *EnvironmentInfo) GetNumberOfTasks() int32 { return 0 } +func (x *EnvironmentInfo) GetCurrentTransition() string { + if x != nil { + return x.CurrentTransition + } + return "" +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4812,7 +4820,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xc5, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xf3, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4856,622 +4864,625 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, + 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, + 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, + 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, + 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, + 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, + 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, + 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, + 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, + 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, + 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, + 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, + 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, - 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, + 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, + 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, + 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, + 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, + 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, + 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, + 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, + 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, + 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, + 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, + 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, + 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, - 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, - 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, - 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, - 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, - 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, - 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, - 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, - 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, - 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, + 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, + 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, + 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, + 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, - 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, - 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, - 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, - 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, + 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, + 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, + 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, + 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, + 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, + 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, + 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, + 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, + 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, + 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, - 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, - 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, + 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, + 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, - 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, - 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, - 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, - 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, - 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, - 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, - 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index c204a32c0..3eaf8e9b2 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -190,6 +190,7 @@ message EnvironmentInfo { int32 numberOfHosts = 13; map integratedServicesData = 14; int32 numberOfTasks = 15; + string currentTransition = 16; } message NewEnvironmentRequest { From cca0a374c9539193a8648569f421e429e395d167 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 2 Aug 2023 16:53:48 +0200 Subject: [PATCH 1689/2352] [core] Fill and return currentTransition field --- core/environment/environment.go | 13 +++++++++++++ core/server.go | 3 +++ 2 files changed, 16 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index a0c227b6e..a6b32038a 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -81,6 +81,7 @@ type Environment struct { Description string // From workflow callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap + currentTransition string autoStopTimer *time.Timer } @@ -150,6 +151,7 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }, fsm.Callbacks{ "before_event": func(_ context.Context, e *fsm.Event) { + env.currentTransition = e.Event // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially @@ -257,6 +259,8 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { }).Debug("environment.sm entering state") }, "after_event": func(_ context.Context, e *fsm.Event) { + defer func() { env.currentTransition = "" }() + errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) if errHooks != nil { e.Cancel(errHooks) @@ -677,6 +681,15 @@ func (env *Environment) CurrentState() string { return env.Sm.Current() } +func (env *Environment) CurrentTransition() string { + if env == nil { + return "" + } + env.Mu.RLock() + defer env.Mu.RUnlock() + return env.currentTransition +} + func (env *Environment) IsSafeToStop() bool { tasks := env.Workflow().GetTasks() for _, t := range tasks { diff --git a/core/server.go b/core/server.go index a6a9861cb..72cf774c4 100644 --- a/core/server.go +++ b/core/server.go @@ -273,6 +273,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm NumberOfHosts: int32(len(env.GetAllHosts())), NumberOfTasks: int32(len(tasks)), IntegratedServicesData: isEnvData, + CurrentTransition: env.CurrentTransition(), } if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) @@ -383,6 +384,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme NumberOfHosts: int32(len(newEnv.GetAllHosts())), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), IntegratedServicesData: isEnvData, + CurrentTransition: newEnv.CurrentTransition(), } reply = &pb.NewEnvironmentReply{ Environment: ei, @@ -441,6 +443,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe NumberOfFlps: int32(len(env.GetFLPs())), NumberOfHosts: int32(len(env.GetAllHosts())), IntegratedServicesData: isEnvData, + CurrentTransition: env.CurrentTransition(), }, Public: env.Public, } From b16f37e22af7798886f8d00edaaffd258be4db8d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 2 Aug 2023 16:54:08 +0200 Subject: [PATCH 1690/2352] [coconut] Show transition field for env if not empty --- coconut/control/control.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index 58d289b4a..b6b735275 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -511,6 +511,9 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com _, _ = fmt.Fprintf(o, "description: %s\n", env.GetDescription()) _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) + if currentTransition := env.GetCurrentTransition(); len(currentTransition) != 0 { + _, _ = fmt.Fprintf(o, "transition: %s\n", currentTransition) + } _, _ = fmt.Fprintf(o, "public: %t\n", response.Public) _, _ = fmt.Fprintf(o, "run number: %s\n", rnString) _, _ = fmt.Fprintf(o, "number of FLPs: %s\n", formatNumber(env.GetNumberOfFlps())) From 5cedd175d43ad0639f871f58700583706ad44291 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 3 Aug 2023 11:27:55 +0200 Subject: [PATCH 1691/2352] [build] Bump AliECS to v0.74.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d0fc71526..0287b7b1a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 73 +VERSION_MINOR := 74 VERSION_PATCH := 0 From 73788ca0f2a492301ff8bcd00c8bb2491328c52e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Aug 2023 17:18:13 +0200 Subject: [PATCH 1692/2352] [core] New event type IntegratedServiceEvent --- common/event/integratedserviceevent.go | 42 ++++++++++++++++++++ core/integration/odc/event/odcevent.go | 54 ++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 common/event/integratedserviceevent.go create mode 100644 core/integration/odc/event/odcevent.go diff --git a/common/event/integratedserviceevent.go b/common/event/integratedserviceevent.go new file mode 100644 index 000000000..f236d5e58 --- /dev/null +++ b/common/event/integratedserviceevent.go @@ -0,0 +1,42 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +type IntegratedServiceEvent interface { + Event + GetServiceName() string +} + +type IntegratedServiceEventBase struct { + eventBase + ServiceName string `json:"serviceName"` +} + +func (b *IntegratedServiceEventBase) GetServiceName() string { + if b == nil { + return "" + } + return b.ServiceName +} diff --git a/core/integration/odc/event/odcevent.go b/core/integration/odc/event/odcevent.go new file mode 100644 index 000000000..0b65205ac --- /dev/null +++ b/core/integration/odc/event/odcevent.go @@ -0,0 +1,54 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/utils/uid" +) + +type OdcPartitionStateChangeEvent struct { + event.IntegratedServiceEventBase + EnvironmentId uid.ID `json:"serviceName"` + State string `json:"state"` +} + +func (e *OdcPartitionStateChangeEvent) GetName() string { + return "ODC_PARTITION_STATE_CHANGE_EVENT" +} + +func (e *OdcPartitionStateChangeEvent) GetEnvironmentId() uid.ID { + if e == nil { + return "" + } + return e.EnvironmentId +} + +func (e *OdcPartitionStateChangeEvent) GetState() string { + if e == nil { + return "" + } + return e.State +} From 33516e5afbcf038b1361712da0e14fad07d5c7ef Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Aug 2023 17:21:10 +0200 Subject: [PATCH 1693/2352] [core] ODC client notifies envMan on every state change --- core/integration/odc/plugin.go | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 52b5294bc..fc781698e 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -39,10 +39,13 @@ import ( "time" "github.com/AliceO2Group/Control/apricot" + common_event "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/odc/event" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" @@ -85,6 +88,7 @@ type OdcPartitionInfo struct { PartitionId uid.ID `json:"-"` RunNumber uint32 `json:"runNumber"` State string `json:"state"` + previousState string `json:"-"` // used for state change detection DdsSessionId string `json:"ddsSessionId"` DdsSessionStatus string `json:"ddsSessionStatus"` Devices []OdcDevice `json:"devices"` @@ -239,6 +243,33 @@ func (p *Plugin) queryPartitionStatus() { } p.cachedStatusMu.Lock() + // env state change detection + if p.cachedStatus != nil && p.cachedStatus.Status == odc.ReplyStatus_SUCCESS { + for id, partitionInfo := range response.Partitions { + if existingPartition, ok := p.cachedStatus.Partitions[id]; ok && (existingPartition.State != partitionInfo.State) { + log.WithField("level", infologger.IL_Support). + WithField("partition", id.String()). + WithField("oldState", existingPartition.State). + WithField("state", partitionInfo.State). + Info("ODC Partition state changed") + envMan := environment.ManagerInstance() + if envMan != nil { + go envMan.NotifyIntegratedServiceEvent(&event.OdcPartitionStateChangeEvent{ + IntegratedServiceEventBase: common_event.IntegratedServiceEventBase{ServiceName: "ODC"}, + EnvironmentId: id, + State: partitionInfo.State, + }) + } else { + log.WithField("level", infologger.IL_Support). + WithField("partition", id.String()). + WithField("oldState", existingPartition.State). + WithField("state", partitionInfo.State). + Warn("could not notify environment manager of ODC partition state change event") + } + } + } + } + p.cachedStatus = response p.cachedStatusMu.Unlock() } From b1c1bb95825199279e313a10a1668c301898a534 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Aug 2023 17:21:31 +0200 Subject: [PATCH 1694/2352] [core] React to ODC state change during RUNNING with STOP->CONFIGURED --- core/environment/manager.go | 125 +++++++++++++++++++++++++----------- 1 file changed, 87 insertions(+), 38 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 9a9c7ba68..6e738b2e2 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -39,6 +39,7 @@ import ( "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + event2 "github.com/AliceO2Group/Control/core/integration/odc/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" @@ -51,7 +52,7 @@ type Manager struct { mu sync.RWMutex m map[uid.ID]*Environment taskman *task.Manager - incomingEventCh <-chan event.Event + incomingEventCh chan event.Event pendingTeardownsCh map[uid.ID]chan *event.TasksReleasedEvent pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent } @@ -64,7 +65,7 @@ func ManagerInstance() *Manager { return instance } -func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manager { +func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager { instance = &Manager{ m: make(map[uid.ID]*Environment), taskman: tm, @@ -81,6 +82,9 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage case event.DeviceEvent: instance.handleDeviceEvent(typedEvent) + case event.IntegratedServiceEvent: + instance.handleIntegratedServiceEvent(typedEvent) + case *event.ExecutorFailedEvent: envIdsAffected := tm.HandleExecutorFailed(typedEvent) for envId := range envIdsAffected { @@ -174,6 +178,10 @@ func NewEnvManager(tm *task.Manager, incomingEventCh <-chan event.Event) *Manage return instance } +func (envs *Manager) NotifyIntegratedServiceEvent(event event.IntegratedServiceEvent) { + envs.incomingEventCh <- event +} + func (envs *Manager) GetActiveDetectors() system.IDMap { envs.mu.RLock() defer envs.mu.RUnlock() @@ -628,6 +636,45 @@ func (envs *Manager) loadWorkflow(workflowPath string, parent workflow.Updatable return workflow.Load(workflowPath, parent, envs.taskman, workflowUserVars, baseConfigStack) } +func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEvent) { + if evt == nil { + log.Error("cannot handle null IntegratedServiceEvent") + return + } + + // for now we only handle ODC events + if evt.GetServiceName() == "ODC" { + if odcEvent, ok := evt.(*event2.OdcPartitionStateChangeEvent); ok && odcEvent.GetState() == "ERROR" { + envId := odcEvent.GetEnvironmentId() + env, err := envs.environment(envId) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("odcState", odcEvent.GetState()). + WithError(err). + Error("cannot find environment for OdcPartitionStateChangeEvent") + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("odcState", odcEvent.GetState()). + WithField("envState", env.CurrentState()). + Debug("received ODC_PARTITION_STATE_CHANGE event from ODC, trying to stop the run") + if env.CurrentState() == "RUNNING" { + go func() { + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot stop run after ODC_PARTITION_STATE_CHANGE ERROR event") + } + }() + } + } + } + } +} + func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { if evt == nil { log.Error("cannot handle null DeviceEvent") @@ -715,25 +762,26 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { WithField("taskId", taskId.Value). WithError(err). Error("cannot find environment for DeviceEvent") - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("taskId", taskId.Value). - WithField("envState", env.CurrentState()). - Debug("received END_OF_STREAM event from task, trying to stop the run") - if env.CurrentState() == "RUNNING" { - t.SetSafeToStop(true) // we mark this specific task as ok to STOP - go func() { - if env.IsSafeToStop() { // but then we ask the env whether *all* of them are - err = env.TryTransition(NewStopActivityTransition(envs.taskman)) - if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithError(err). - Error("cannot stop run after END_OF_STREAM event") + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + WithField("envState", env.CurrentState()). + Debug("received END_OF_STREAM event from task, trying to stop the run") + if env.CurrentState() == "RUNNING" { + t.SetSafeToStop(true) // we mark this specific task as ok to STOP + go func() { + if env.IsSafeToStop() { // but then we ask the env whether *all* of them are + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot stop run after END_OF_STREAM event") + } } - } - }() + }() + } } case pb.DeviceEventType_TASK_INTERNAL_ERROR: @@ -754,24 +802,25 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { WithField("taskId", taskId.Value). WithError(err). Error("cannot find environment for DeviceEvent") - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("taskId", taskId.Value). - WithField("taskRole", t.GetParentRolePath()). - WithField("envState", env.CurrentState()). - Debug("received TASK_INTERNAL_ERROR event from task, trying to stop the run") - if env.CurrentState() == "RUNNING" { - go func() { - t.GetParent().UpdateState(task.ERROR) - err = env.TryTransition(NewStopActivityTransition(envs.taskman)) - if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithError(err). - Error("cannot stop run after END_OF_STREAM event") - } - }() + } else { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("taskId", taskId.Value). + WithField("taskRole", t.GetParentRolePath()). + WithField("envState", env.CurrentState()). + Debug("received TASK_INTERNAL_ERROR event from task, trying to stop the run") + if env.CurrentState() == "RUNNING" { + go func() { + t.GetParent().UpdateState(task.ERROR) + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("cannot stop run after END_OF_STREAM event") + } + }() + } } } From c4a0ebc9036a9abdcc737eb6c87e8a1b389ed997 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Aug 2023 13:52:49 +0200 Subject: [PATCH 1695/2352] [build] Bump AliECS to v0.75.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0287b7b1a..fc6ace1bf 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 74 +VERSION_MINOR := 75 VERSION_PATCH := 0 From 1abc89cb6f88c48aac0d063fed72c5ff9e51fa73 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Aug 2023 10:46:11 +0200 Subject: [PATCH 1696/2352] [core] Pull fill info from varstack of root role of env --- core/environment/transition_startactivity.go | 32 ++++++++++++-------- core/environment/transition_stopactivity.go | 12 ++++++-- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index d244e5218..8b24592c0 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -74,19 +74,25 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "cleanup": strconv.Itoa(cleanupCount), } - // If bookkeeping is enabled and has fetched the LHC fill info, we can acquire it here - for _, key := range []string{ - "fill_info_fill_number", - "fill_info_filling_scheme", - "fill_info_beam_type", - "fill_info_stable_beam_start_ms", - "fill_info_stable_beam_end_ms", - "run_type", - "run_start_time_ms", - "lhc_period", - } { - if value, ok := env.GlobalVars.Get(key); ok { - args[strcase.ToLowerCamel(key)] = value + // Get a handle to the consolidated var stack of the root role of the env's workflow + if wf := env.Workflow(); wf != nil { + if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { + + // If bookkeeping is enabled and has fetched the LHC fill info, we can acquire it here + for _, key := range []string{ + "fill_info_fill_number", + "fill_info_filling_scheme", + "fill_info_beam_type", + "fill_info_stable_beam_start_ms", + "fill_info_stable_beam_end_ms", + "run_type", + "run_start_time_ms", + "lhc_period", + } { + if value, ok := cvs[key]; ok { + args[strcase.ToLowerCamel(key)] = value + } + } } } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index c56b3913e..22d14d674 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -59,9 +59,15 @@ func (t StopActivityTransition) do(env *Environment) (err error) { args := controlcommands.PropertyMap{} - // Propagate run end time to all tasks - if value, ok := env.GlobalVars.Get("run_end_time_ms"); ok { - args[strcase.ToLowerCamel("run_end_time_ms")] = value + // Get a handle to the consolidated var stack of the root role of the env's workflow + if wf := env.Workflow(); wf != nil { + if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { + + // Propagate run end time to all tasks + if value, ok := cvs["run_end_time_ms"]; ok { + args[strcase.ToLowerCamel("run_end_time_ms")] = value + } + } } taskmanMessage := task.NewTransitionTaskMessage( From a3b4ddcba0b55c983f591fdc9694387e999e7acf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Aug 2023 11:15:46 +0200 Subject: [PATCH 1697/2352] [core] Add support for odc_extract_topology_resources flag --- core/integration/odc/handlers.go | 37 ++++++++++++++---- core/integration/odc/plugin.go | 64 +++++++++++++++++++++----------- 2 files changed, 73 insertions(+), 28 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index fe480673e..980a5ea00 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -28,6 +28,7 @@ import ( "context" "errors" "fmt" + "strconv" "strings" "sync" "time" @@ -570,7 +571,10 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu defer log.Trace("END handleRun") // RUN request, includes INITIALIZE+SUBMIT+ACTIVATE - var topology, script, plugin, resources string + var ( + topology, script, plugin, resources, extractTopoResourcesS string + extractTopoResources bool + ) exists := false topology, exists = arguments["topology"] @@ -581,20 +585,39 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu if !isManualXml && (!exists || len(script) == 0) { return errors.New("empty script received") } + extractTopoResourcesS, exists = arguments["extractTopoResources"] + if exists && len(extractTopoResourcesS) > 0 { + var err error + extractTopoResources, err = strconv.ParseBool(extractTopoResourcesS) + if err != nil { + return errors.New("invalid extractTopoResources value received") + } + } + + // absence of plugin and resources is only a problem if we don't extract resources from topology plugin, exists = arguments["plugin"] - if !exists || len(plugin) == 0 { + if !extractTopoResources && (!exists || len(plugin) == 0) { return errors.New("empty plugin received") } resources, exists = arguments["resources"] - if !exists || len(resources) == 0 { + if !extractTopoResources && (!exists || len(resources) == 0) { return errors.New("empty resources received") } - runRequest := &odcpb.RunRequest{ - Partitionid: envId, - Plugin: plugin, - Resources: resources, + var runRequest *odcpb.RunRequest + if extractTopoResources { + runRequest = &odcpb.RunRequest{ + Partitionid: envId, + ExtractTopoResources: extractTopoResources, + } + } else { + runRequest = &odcpb.RunRequest{ + Partitionid: envId, + Plugin: plugin, + Resources: resources, + } } + // We ask this ODC call to complete within our own DEADLINE, minus 1 second ctxDeadline, ok := ctx.Deadline() if ok { diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index fc781698e..980b723a1 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -911,11 +911,26 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var ( pdpConfigOption, script, topology, plugin, resources string + extractTopoResources bool ) ok := false isManualXml := false callFailedStr := "EPN PartitionInitialize call failed" + extractTopoResourcesS, extractTopoResourcesSok := varStack["odc_extract_topology_resources"] + if extractTopoResourcesSok && extractTopoResourcesS != "" { // if set and true, plugin and resources are not to be included in requests + extractTopoResources, err = strconv.ParseBool(extractTopoResourcesS) + if err != nil { + msg := "cannot parse odc_extract_topology_resources" + log.WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + } + pdpConfigOption, ok = varStack["pdp_config_option"] if !ok { msg := "cannot acquire PDP workflow configuration mode" @@ -966,26 +981,32 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - plugin, ok = varStack["odc_plugin"] - if !ok { - msg := "cannot acquire ODC RMS plugin declaration" - log.WithField("partition", envId). - WithField("call", "PartitionInitialize"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } + if !extractTopoResources { + plugin, ok = varStack["odc_plugin"] + if !ok { + msg := "cannot acquire ODC RMS plugin declaration" + log.WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } - resources, ok = varStack["odc_resources"] - if !ok { - msg := "cannot acquire ODC resources declaration" + resources, ok = varStack["odc_resources"] + if !ok { + msg := "cannot acquire ODC resources declaration" + log.WithField("partition", envId). + WithField("call", "PartitionInitialize"). + Error(msg) + call.VarStack["__call_error_reason"] = msg + call.VarStack["__call_error"] = callFailedStr + return + } + } else { log.WithField("partition", envId). WithField("call", "PartitionInitialize"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return + Info("odc_extract_topology_resources is set to true, plugin and resources will not be included in the ODC Run request") } timeout := callable.AcquireTimeout(ODC_PARTITIONINITIALIZE_TIMEOUT, varStack, "PartitionInitialize", envId) @@ -994,10 +1015,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer cancel() err = handleRun(ctx, p.odcClient, isManualXml, map[string]string{ - "topology": topology, - "script": script, - "plugin": plugin, - "resources": resources, + "topology": topology, + "script": script, + "plugin": plugin, + "resources": resources, + "extractTopoResources": strconv.FormatBool(extractTopoResources), }, paddingTimeout, envId) if err != nil { From e483f69e887baab29b482fae21bd711e3a563dd6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Aug 2023 11:42:56 +0200 Subject: [PATCH 1698/2352] [core] Prevent crash on missing partition id --- core/integration/odc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 980b723a1..f4bf999b9 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -235,7 +235,7 @@ func (p *Plugin) queryPartitionStatus() { wg.Wait() for _, odcPartSt := range odcPartInfoSlice { - if odcPartSt.PartitionId.IsNil() { + if odcPartSt == nil || odcPartSt.PartitionId.IsNil() { // The partition wasn't found in the ODC response continue } From 67b5571e9aa72c3ae7a01dc8f50b9b694cf1e6b2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 11 Aug 2023 12:23:12 +0200 Subject: [PATCH 1699/2352] [build] Bump to v0.76.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fc6ace1bf..c2d4e0366 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 75 +VERSION_MINOR := 76 VERSION_PATCH := 0 From f39ce6b6c3e4d3a524e3984e6c78d9c5bb7c88b1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Aug 2023 10:07:04 +0200 Subject: [PATCH 1700/2352] [core] Increase ODC call recv message size to 16MiB (was 4) --- core/integration/odc/client.go | 28 ++++++++++++++-------------- core/integration/odc/plugin.go | 1 + 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go index c50202b87..333ef0904 100644 --- a/core/integration/odc/client.go +++ b/core/integration/odc/client.go @@ -38,12 +38,11 @@ import ( "google.golang.org/grpc/keepalive" ) -var log = logger.New(logrus.StandardLogger(),"odcclient") - +var log = logger.New(logrus.StandardLogger(), "odcclient") type RpcClient struct { odcpb.ODCClient - conn *grpc.ClientConn + conn *grpc.ClientConn cancel context.CancelFunc } @@ -52,10 +51,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) "endpoint": endpoint, }).Debug("dialing ODC endpoint") - dialOptions := []grpc.DialOption { + dialOptions := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithConnectParams(grpc.ConnectParams{ - Backoff: backoff.Config{ + Backoff: backoff.Config{ BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, @@ -68,14 +67,15 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ODC_MAX_INBOUND_MESSAGE_SIZE)), } if !viper.GetBool("odcUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) } conn, err := grpc.DialContext(cxt, - endpoint, - dialOptions..., - ) + endpoint, + dialOptions..., + ) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). @@ -95,26 +95,26 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) for { select { - case ok := <- stateChangedNotify: + case ok := <-stateChangedNotify: if !ok { return } connState = conn.GetState() log.Debugf("ODC client %s", connState.String()) go notifyFunc(connState) - case <- time.After(2 * time.Minute): + case <-time.After(2 * time.Minute): if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() } - case <- cxt.Done(): + case <-cxt.Done(): return } } }() - client := &RpcClient { + client := &RpcClient{ ODCClient: odcpb.NewODCClient(conn), - conn: conn, + conn: conn, } return client @@ -130,4 +130,4 @@ func (m *RpcClient) GetConnState() connectivity.State { func (m *RpcClient) Close() error { m.cancel() return m.conn.Close() -} \ No newline at end of file +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index f4bf999b9..3fae4191e 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -64,6 +64,7 @@ const ( ODC_PADDING_TIMEOUT = 3 * time.Second ODC_STATUS_TIMEOUT = 3 * time.Second ODC_POLLING_INTERVAL = 3 * time.Second + ODC_MAX_INBOUND_MESSAGE_SIZE = 16 * 1024 * 1024 // 16 MiB ) type Plugin struct { From 38c45e26c23caa55a59b76c1ce6b68beaa1e1c7f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 15 Aug 2023 10:07:42 +0200 Subject: [PATCH 1701/2352] [build] Bump to v0.76.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c2d4e0366..bc1c57d33 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 76 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 4d12b1d6d7bfbae835ac35cb15eeee7e341217a9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Aug 2023 10:56:29 +0200 Subject: [PATCH 1702/2352] [core] Move server rpc logging to Debug severity --- core/server.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/server.go b/core/server.go index 72cf774c4..8bf636a10 100644 --- a/core/server.go +++ b/core/server.go @@ -88,7 +88,7 @@ func (m *RpcServer) logMethod() { log.WithPrefix("rpcserver"). WithField("method", fun.Name()). WithField("level", infologger.IL_Support). - Info("handling RPC request") + Debug("handling RPC request") } func (m *RpcServer) logMethodHandled() { @@ -106,7 +106,7 @@ func (m *RpcServer) logMethodHandled() { log.WithPrefix("rpcserver"). WithField("method", fun.Name()). WithField("level", infologger.IL_Support). - Info("handling RPC request DONE") + Debug("handling RPC request DONE") } // Implements interface pb.ControlServer From abbf12b362d8ceb1e6adebbd269e1756499dc241 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Aug 2023 16:27:23 +0200 Subject: [PATCH 1703/2352] [core] GO_ERROR if ODC is in ERROR --- core/environment/manager.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 6e738b2e2..344abf595 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -668,6 +668,17 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve WithError(err). Error("cannot stop run after ODC_PARTITION_STATE_CHANGE ERROR event") } + + if env.CurrentState() != "ERROR" { + err = env.TryTransition(NewGoErrorTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithError(err). + Error("environment GO_ERROR transition failed after ODC_PARTITION_STATE_CHANGE ERROR event") + } + env.setState("ERROR") + } }() } } From 846183e231724e1b250a42774d639cbdd8caf4e7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 16 Aug 2023 16:28:17 +0200 Subject: [PATCH 1704/2352] [build] Bump to v0.77.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index bc1c57d33..f0fac10ef 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 76 -VERSION_PATCH := 1 +VERSION_MINOR := 77 +VERSION_PATCH := 0 From fa8b6530a56fcb195adbf81488ee1463cd5194a4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 13:04:39 +0200 Subject: [PATCH 1705/2352] [core] Refactor taskclass package --- core/task/taskclass/class.go | 185 +++----------------------- core/task/taskclass/classes.go | 97 ++++++++++++++ core/task/taskclass/resourcelimits.go | 62 +++++++++ core/task/taskclass/resourcewants.go | 76 +++++++++++ 4 files changed, 251 insertions(+), 169 deletions(-) create mode 100644 core/task/taskclass/classes.go create mode 100644 core/task/taskclass/resourcelimits.go create mode 100644 core/task/taskclass/resourcewants.go diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index 1dc11a9ef..d7cdf95db 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2018 CERN and copyright holders of ALICE O². + * Copyright 2018-2023 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -26,8 +26,6 @@ package taskclass import ( "fmt" - "strconv" - "sync" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" @@ -35,12 +33,26 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" - "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/sirupsen/logrus" ) var log = logger.New(logrus.StandardLogger(), "taskclass") +type Id struct { + RepoIdentifier string + Hash string + Name string +} + +func (tcID Id) String() string { + return fmt.Sprintf("%s/tasks/%s@%s", tcID.RepoIdentifier, tcID.Name, tcID.Hash) +} + +func (tcID *Id) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + err = unmarshal(&tcID.Name) + return +} + // ↓ We need the roles tree to know *where* to run it and how to *configure* it, but // // the following information is enough to run the task even with no environment or @@ -150,101 +162,6 @@ func (c *Class) MarshalYAML() (interface{}, error) { return aux, nil } -type Id struct { - RepoIdentifier string - Hash string - Name string -} - -func (tcID Id) String() string { - return fmt.Sprintf("%s/tasks/%s@%s", tcID.RepoIdentifier, tcID.Name, tcID.Hash) -} - -func (tcID *Id) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - err = unmarshal(&tcID.Name) - return -} - -type ResourceWants struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` - Ports port.Ranges `yaml:"ports,omitempty"` -} - -func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - type _resourceWants struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - Ports *string `yaml:"ports"` - } - aux := _resourceWants{} - err = unmarshal(&aux) - if err != nil { - return - } - - if aux.Cpu != nil { - var cpuCount float64 - cpuCount, err = strconv.ParseFloat(*aux.Cpu, 64) - if err != nil { - return - } - rw.Cpu = &cpuCount - } - if aux.Memory != nil { - var memCount float64 - memCount, err = strconv.ParseFloat(*aux.Memory, 64) - if err != nil { - return - } - rw.Memory = &memCount - } - if aux.Ports != nil { - var ranges port.Ranges - ranges, err = port.RangesFromExpression(*aux.Ports) - if err != nil { - return - } - rw.Ports = ranges - } - return -} - -type ResourceLimits struct { - Cpu *float64 `yaml:"cpu"` - Memory *float64 `yaml:"memory"` -} - -func (rw *ResourceLimits) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { - type _resourceLimits struct { - Cpu *string `yaml:"cpu"` - Memory *string `yaml:"memory"` - } - aux := _resourceLimits{} - err = unmarshal(&aux) - if err != nil { - return - } - - if aux.Cpu != nil { - var cpuCount float64 - cpuCount, err = strconv.ParseFloat(*aux.Cpu, 64) - if err != nil { - return - } - rw.Cpu = &cpuCount - } - if aux.Memory != nil { - var memCount float64 - memCount, err = strconv.ParseFloat(*aux.Memory, 64) - if err != nil { - return - } - rw.Memory = &memCount - } - return -} - func (c *Class) Equals(other *Class) (response bool) { if c == nil || other == nil { return false @@ -255,73 +172,3 @@ func (c *Class) Equals(other *Class) (response bool) { c.Wants.Ports.Equals(other.Wants.Ports) return } - -type Classes struct { - mu sync.RWMutex - classMap map[string]*Class -} - -func (c *Classes) Do(f func(classMap *map[string]*Class) error) error { - c.mu.Lock() - defer c.mu.Unlock() - return f(&c.classMap) -} - -func (c *Classes) Foreach(do func(string, *Class) bool) { - c.mu.Lock() - defer c.mu.Unlock() - - for taskClassIdentifier, classPtr := range c.classMap { - ok := do(taskClassIdentifier, classPtr) - if !ok { - return - } - } -} - -func (c *Classes) getMap() map[string]*Class { - c.mu.RLock() - defer c.mu.RUnlock() - - return c.classMap -} - -func (c *Classes) DeleteKey(key string) { - c.mu.Lock() - defer c.mu.Unlock() - - delete(c.classMap, key) -} - -func (c *Classes) DeleteKeys(keys []string) { - c.mu.Lock() - defer c.mu.Unlock() - - for _, k := range keys { - delete(c.classMap, k) - } -} - -func (c *Classes) UpdateClass(key string, class *Class) { - c.mu.Lock() - defer c.mu.Unlock() - if _, ok := c.classMap[key]; ok { //contains - *c.classMap[key] = *class // update - } else { - c.classMap[key] = class // else add class as new entry - } -} - -func (c *Classes) GetClass(key string) (class *Class, ok bool) { - c.mu.RLock() - defer c.mu.RUnlock() - - class, ok = c.classMap[key] - return -} - -func NewClasses() *Classes { - return &Classes{ - classMap: make(map[string]*Class), - } -} diff --git a/core/task/taskclass/classes.go b/core/task/taskclass/classes.go new file mode 100644 index 000000000..17e148748 --- /dev/null +++ b/core/task/taskclass/classes.go @@ -0,0 +1,97 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package taskclass + +import "sync" + +type Classes struct { + mu sync.RWMutex + classMap map[string]*Class +} + +func (c *Classes) Do(f func(classMap *map[string]*Class) error) error { + c.mu.Lock() + defer c.mu.Unlock() + return f(&c.classMap) +} + +func (c *Classes) Foreach(do func(string, *Class) bool) { + c.mu.Lock() + defer c.mu.Unlock() + + for taskClassIdentifier, classPtr := range c.classMap { + ok := do(taskClassIdentifier, classPtr) + if !ok { + return + } + } +} + +func (c *Classes) getMap() map[string]*Class { + c.mu.RLock() + defer c.mu.RUnlock() + + return c.classMap +} + +func (c *Classes) DeleteKey(key string) { + c.mu.Lock() + defer c.mu.Unlock() + + delete(c.classMap, key) +} + +func (c *Classes) DeleteKeys(keys []string) { + c.mu.Lock() + defer c.mu.Unlock() + + for _, k := range keys { + delete(c.classMap, k) + } +} + +func (c *Classes) UpdateClass(key string, class *Class) { + c.mu.Lock() + defer c.mu.Unlock() + if _, ok := c.classMap[key]; ok { //contains + *c.classMap[key] = *class // update + } else { + c.classMap[key] = class // else add class as new entry + } +} + +func (c *Classes) GetClass(key string) (class *Class, ok bool) { + c.mu.RLock() + defer c.mu.RUnlock() + + class, ok = c.classMap[key] + return +} + +func NewClasses() *Classes { + return &Classes{ + classMap: make(map[string]*Class), + } +} diff --git a/core/task/taskclass/resourcelimits.go b/core/task/taskclass/resourcelimits.go new file mode 100644 index 000000000..5b62f84f2 --- /dev/null +++ b/core/task/taskclass/resourcelimits.go @@ -0,0 +1,62 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package taskclass + +import "strconv" + +type ResourceLimits struct { + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` +} + +func (rw *ResourceLimits) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _resourceLimits struct { + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + } + aux := _resourceLimits{} + err = unmarshal(&aux) + if err != nil { + return + } + + if aux.Cpu != nil { + var cpuCount float64 + cpuCount, err = strconv.ParseFloat(*aux.Cpu, 64) + if err != nil { + return + } + rw.Cpu = &cpuCount + } + if aux.Memory != nil { + var memCount float64 + memCount, err = strconv.ParseFloat(*aux.Memory, 64) + if err != nil { + return + } + rw.Memory = &memCount + } + return +} diff --git a/core/task/taskclass/resourcewants.go b/core/task/taskclass/resourcewants.go new file mode 100644 index 000000000..967f4894e --- /dev/null +++ b/core/task/taskclass/resourcewants.go @@ -0,0 +1,76 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package taskclass + +import ( + "strconv" + + "github.com/AliceO2Group/Control/core/task/taskclass/port" +) + +type ResourceWants struct { + Cpu *float64 `yaml:"cpu"` + Memory *float64 `yaml:"memory"` + Ports port.Ranges `yaml:"ports,omitempty"` +} + +func (rw *ResourceWants) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { + type _resourceWants struct { + Cpu *string `yaml:"cpu"` + Memory *string `yaml:"memory"` + Ports *string `yaml:"ports"` + } + aux := _resourceWants{} + err = unmarshal(&aux) + if err != nil { + return + } + + if aux.Cpu != nil { + var cpuCount float64 + cpuCount, err = strconv.ParseFloat(*aux.Cpu, 64) + if err != nil { + return + } + rw.Cpu = &cpuCount + } + if aux.Memory != nil { + var memCount float64 + memCount, err = strconv.ParseFloat(*aux.Memory, 64) + if err != nil { + return + } + rw.Memory = &memCount + } + if aux.Ports != nil { + var ranges port.Ranges + ranges, err = port.RangesFromExpression(*aux.Ports) + if err != nil { + return + } + rw.Ports = ranges + } + return +} From ddcc14619f0a2e61669adfd3ef3941f10f2c88cd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 13:05:23 +0200 Subject: [PATCH 1706/2352] [core] Ensure task class refresh cannot happen concurrently w/ matching --- core/task/manager.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index 89491206c..bffb68ca2 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -286,9 +286,21 @@ func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused } func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { + log.WithField("taskClassesRequired", len(taskClassesRequired)). + Debug("waiting to refresh task classes") + defer utils.TimeTrackFunction(time.Now(), log.WithField("taskClassesRequired", len(taskClassesRequired))) + + m.deployMu.Lock() + defer m.deployMu.Unlock() + + log.WithField("taskClassesRequired", len(taskClassesRequired)). + Debug("cleaning up inactive task classes") m.removeInactiveClasses() + log.WithField("taskClassesRequired", len(taskClassesRequired)). + Debug("loading required task classes") + var taskClassList []*taskclass.Class taskClassList, err = getTaskClassList(taskClassesRequired) if err != nil { From 02774f1934ee3a9ea5515e04e2a1947560435ac5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 16:51:56 +0200 Subject: [PATCH 1707/2352] [core] 7 day eviction policy for task class cache --- core/config.go | 3 +++ core/task/manager.go | 12 ++++++++++- core/task/taskclass/class.go | 39 ++++++++++++++++++---------------- core/task/taskclass/classes.go | 9 ++++++-- 4 files changed, 42 insertions(+), 21 deletions(-) diff --git a/core/config.go b/core/config.go index fc8e2cbc8..0f674b3b6 100644 --- a/core/config.go +++ b/core/config.go @@ -33,6 +33,7 @@ import ( "os/user" "path/filepath" "strings" + "time" "github.com/AliceO2Group/Control/apricot" apricotpb "github.com/AliceO2Group/Control/apricot/protos" @@ -120,6 +121,7 @@ func setDefaults() error { viper.SetDefault("concurrentIteratorRoleExpansion", true) viper.SetDefault("reuseUnlockedTasks", false) viper.SetDefault("configCache", true) + viper.SetDefault("taskClassCacheTTL", 7*24*time.Hour) return nil } @@ -183,6 +185,7 @@ func setFlags() error { pflag.Bool("concurrentIteratorRoleExpansion", viper.GetBool("concurrentIteratorRoleExpansion"), "Expand iterator roles concurrently during workflow template processing") pflag.Bool("reuseUnlockedTasks", viper.GetBool("reuseUnlockedTasks"), "Reuse unlocked active tasks when satisfying environment deployment requests") pflag.Bool("configCache", viper.GetBool("configCache"), "Enable cache layer between AliECS core and Apricot") + pflag.Duration("taskClassCacheTTL", viper.GetDuration("taskClassCacheTTL"), "TTL for task class cache entries") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/task/manager.go b/core/task/manager.go index bffb68ca2..be7d2ff2b 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -251,8 +251,18 @@ func (m *Manager) removeInactiveClasses() { _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { keys := make([]string, 0) + taskClassCacheTTL := viper.GetDuration("taskClassCacheTTL") + // push keys of classes that don't appear in roster any more into a slice - for taskClassIdentifier := range *classMap { + for taskClassIdentifier, class := range *classMap { + if class == nil { + // don't really know what to do with a valid TCI but nil class + continue + } + if time.Since(class.UpdatedTimestamp) < taskClassCacheTTL { + // class is still fresh, skip + continue + } if len(m.roster.filteredForClass(taskClassIdentifier)) == 0 { keys = append(keys, taskClassIdentifier) } diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index d7cdf95db..f07f5182a 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -26,6 +26,7 @@ package taskclass import ( "fmt" + "time" "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" @@ -64,13 +65,14 @@ type Class struct { Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` - Command *common.CommandInfo `yaml:"command"` - Wants ResourceWants `yaml:"wants"` - Limits *ResourceLimits `yaml:"limits"` - Bind []channel.Inbound `yaml:"bind"` - Properties gera.StringMap `yaml:"properties"` - Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` + Command *common.CommandInfo `yaml:"command"` + Wants ResourceWants `yaml:"wants"` + Limits *ResourceLimits `yaml:"limits"` + Bind []channel.Inbound `yaml:"bind"` + Properties gera.StringMap `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` + UpdatedTimestamp time.Time `yaml:"-"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { @@ -106,17 +108,18 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } *c = Class{ - Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Vars: gera.MakeStringMapWithMap(aux.Vars), - Control: aux.Control, - Command: aux.Command, - Wants: aux.Wants, - Limits: aux.Limits, - Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), - Constraints: aux.Constraints, - Connect: aux.Connect, + Identifier: aux.Identifier, + Defaults: gera.MakeStringMapWithMap(aux.Defaults), + Vars: gera.MakeStringMapWithMap(aux.Vars), + Control: aux.Control, + Command: aux.Command, + Wants: aux.Wants, + Limits: aux.Limits, + Bind: aux.Bind, + Properties: gera.MakeStringMapWithMap(aux.Properties), + Constraints: aux.Constraints, + Connect: aux.Connect, + UpdatedTimestamp: time.Now(), } } return diff --git a/core/task/taskclass/classes.go b/core/task/taskclass/classes.go index 17e148748..8a784386d 100644 --- a/core/task/taskclass/classes.go +++ b/core/task/taskclass/classes.go @@ -24,7 +24,10 @@ package taskclass -import "sync" +import ( + "sync" + "time" +) type Classes struct { mu sync.RWMutex @@ -75,7 +78,9 @@ func (c *Classes) DeleteKeys(keys []string) { func (c *Classes) UpdateClass(key string, class *Class) { c.mu.Lock() defer c.mu.Unlock() - if _, ok := c.classMap[key]; ok { //contains + + class.UpdatedTimestamp = time.Now() // used for invalidating stale classcache entries + if _, ok := c.classMap[key]; ok { //contains *c.classMap[key] = *class // update } else { c.classMap[key] = class // else add class as new entry From 7244c6b94dbb1190aa3796753cd31fac633deeae Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 16:56:32 +0200 Subject: [PATCH 1708/2352] [build] Bump to v0.78.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f0fac10ef..a2bcde72c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 77 +VERSION_MINOR := 78 VERSION_PATCH := 0 From f563c8cb50f8426e1e6007b75d6a3222d86540c4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 17:27:22 +0200 Subject: [PATCH 1709/2352] [docs] Update coconut documentation --- coconut/doc/coconut.md | 6 ++-- coconut/doc/coconut_about.md | 6 ++-- coconut/doc/coconut_configuration.md | 6 ++-- coconut/doc/coconut_configuration_dump.md | 6 ++-- coconut/doc/coconut_configuration_history.md | 6 ++-- coconut/doc/coconut_configuration_import.md | 6 ++-- coconut/doc/coconut_configuration_list.md | 6 ++-- coconut/doc/coconut_configuration_show.md | 6 ++-- coconut/doc/coconut_environment.md | 6 ++-- coconut/doc/coconut_environment_control.md | 6 ++-- coconut/doc/coconut_environment_create.md | 11 +++++-- coconut/doc/coconut_environment_destroy.md | 6 ++-- coconut/doc/coconut_environment_list.md | 9 +++--- coconut/doc/coconut_environment_show.md | 7 ++-- coconut/doc/coconut_info.md | 6 ++-- coconut/doc/coconut_repository.md | 19 +++++++---- coconut/doc/coconut_repository_add.md | 32 +++++++++++++++---- .../coconut_repository_default-revision.md | 21 ++++++------ coconut/doc/coconut_repository_default.md | 15 ++++++--- coconut/doc/coconut_repository_list.md | 6 ++-- coconut/doc/coconut_repository_refresh.md | 16 +++++++--- coconut/doc/coconut_repository_remove.md | 16 +++++++--- coconut/doc/coconut_role.md | 6 ++-- coconut/doc/coconut_role_query.md | 6 ++-- coconut/doc/coconut_task.md | 6 ++-- coconut/doc/coconut_task_clean.md | 6 ++-- coconut/doc/coconut_task_list.md | 6 ++-- coconut/doc/coconut_template.md | 6 ++-- coconut/doc/coconut_template_list.md | 7 ++-- 29 files changed, 163 insertions(+), 104 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 0fe71417f..2d19d4b2c 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -13,11 +13,11 @@ For more information on the available commands, see the individual documentation ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") -h, --help help for coconut - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +32,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 7d64ccf6c..9aee6a5ea 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -20,10 +20,10 @@ coconut about [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 492ee23c6..3f8d501ff 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -17,10 +17,10 @@ configuration store. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -33,4 +33,4 @@ configuration store. * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 0152ede26..5bc9439c4 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -25,10 +25,10 @@ coconut configuration dump [key] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -36,4 +36,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md index 43ef6b7c8..55d155ab1 100644 --- a/coconut/doc/coconut_configuration_history.md +++ b/coconut/doc/coconut_configuration_history.md @@ -31,10 +31,10 @@ coconut conf history /// ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -42,4 +42,4 @@ coconut conf history /// * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index b8f969ccd..c3c0e3eef 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -41,10 +41,10 @@ coconut conf import --no-versioning --new-compon ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -52,4 +52,4 @@ coconut conf import --no-versioning --new-compon * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index d2fdde926..a74b6ae9a 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -31,10 +31,10 @@ coconut conf list -t ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -42,4 +42,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 9af0ae7c6..39c947135 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -39,10 +39,10 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -50,4 +50,4 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 85be2041a..75b10f3f6 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -37,10 +37,10 @@ For more information on the behavior of coconut environments, see the subcommand ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -53,4 +53,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index 80e8c74fc..f9eaef1cd 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -30,10 +30,10 @@ coconut environment control [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -41,4 +41,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 07d163eb6..1b09b860f 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -17,6 +17,9 @@ Examples: * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow` - loads a workflow from a specific git repository, HEAD of master branch * `coconut env create -w myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow@rev` - loads a workflow from a specific git repository, on branch, tag or revision `rev` + * `coconut env create -c /home/myrepo/myconfigfile.json -e '{"hosts":"[\"my-test-machine\"]"}'` + * `coconut env create -c consul:///o2/runtime/COG-v1/TECHNICAL -w readout-dataflow@myBranch -e '{"hosts":"[\"my-test-machine\"]"}'` + * `coconut env create -c TECHNICAL -e '{"hosts":"[\"my-test-machine\"]"}'` For more information on the AliECS workflow configuration system, see documentation for the `coconut repository` command. @@ -28,8 +31,10 @@ coconut environment create [flags] ``` -a, --auto create an autorun environment + -c, --configuration string high-level configuration payload to be loaded for the new environment -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` -h, --help help for create + -p, --public control public rights of the environment (default true) -w, --workflow-template string workflow to be loaded in the new environment ``` @@ -37,10 +42,10 @@ coconut environment create [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -48,4 +53,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 2da544e2f..637f4e216 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -27,10 +27,10 @@ coconut environment destroy [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -38,4 +38,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index c6151722d..276860074 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -14,17 +14,18 @@ coconut environment list [flags] ### Options ``` - -h, --help help for list + -h, --help help for list + -s, --show-all print public and non-public environments ``` ### Options inherited from parent commands ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +33,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index 168af95c4..edb0f4a63 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -15,6 +15,7 @@ coconut environment show [environment id] [flags] ``` -h, --help help for show + -s, --services print information on this environment from integrated services -t, --tasks print a list of tasks in this environment -w, --workflow print the workflow tree ``` @@ -23,10 +24,10 @@ coconut environment show [environment id] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -34,4 +35,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index 7677ebf7c..ed26fa8fa 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -21,10 +21,10 @@ coconut info [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +32,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index c339b93df..bac7482c2 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -8,11 +8,18 @@ The repository command performs operations on the repositories used for task and A valid workflow configuration repository must contain the directories `tasks` and `workflows` in its `master` branch. -When referencing a repository, the clone method should never be prepended. Examples of valid repository identifiers: +When referencing a repository, the clone method should never be prepended. Supported repo backends and their expected format are: +- https: [hostname]/[repo_path] +- ssh: [hostname]:[repo_path] +- local [repo_path] (local repo entries are ephemeral and will not survive a core restart) + +Examples of valid repository identifiers: ``` -github.com/AliceO2Group/ControlWorkflows -gitlab.cern.ch/tmrnjava/AliECS_conf/ +github.com/AliceO2Group/ControlWorkflows (https) +gitlab.cern.ch/tmrnjava/AliECS_conf/ (https) +alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows (ssh) +/home/flp/git/ControlWorkflows (local filesystem - (*entry does not survive a core restart*)) ``` By default, all short task and workflow names are assumed to be in the default repository (see `coconut repo list` command). @@ -41,10 +48,10 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -58,4 +65,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index e65b6a31d..77c9ae586 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -5,32 +5,50 @@ add a new git repository ### Synopsis The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration. -The `https://` prefix and `.git` suffix should always be omitted. +The default revision of the repository may be explicitly specified by passing the flag `--default-revision` . In any case, +the ensuing list is followed until a valid revision has been identified: + +- explicitly set default revision (optional) +- global default revision +- `master` +- `main` + +Exhaustion of the aforementioned list results in a repo add failure. + +`coconut repo add` can be called with +1) a repository identifier +2) a repository identifier coupled with the `--default-revision` flag (see examples below) + +The protocol prefix should always be omitted. ``` -coconut repository add [flags] +coconut repository add [flags] ``` ### Examples ``` -coconut repo add github.com/AliceO2Group/ControlWorkflows + * `coconut repo add github.com/AliceO2Group/ControlWorkflows` + * `coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev` + * `coconut repo add alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows --default-revision custom-rev` + * `coconut repo add /home/flp/git/ControlWorkflows` ``` ### Options ``` - -h, --help help for add + -d, --default-revision string default revision for repository to add + -h, --help help for add ``` ### Options inherited from parent commands ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -38,4 +56,4 @@ coconut repo add github.com/AliceO2Group/ControlWorkflows * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index 50bf47400..ee97f30b0 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -4,17 +4,20 @@ set default global and per-repository revision ### Synopsis -The repository default-revision command sets the global default repository revision. +The repository default-revision command sets the global default repository revision.' To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by `coconut repo list`. -Examples: -* `coconut repo default-revision basic-tasks` Sets `basic-tasks`as the global default-revision -* `coconut repo default-revision 0 master` Sets `master`as the default-revision for repo with index 0 -* `coconut repo default-revision 2 vs-sftb` Sets `vs-sftb`as the default-revision for repo with index 2 +``` +coconut repository default-revision [flags] +``` + +### Examples ``` -coconut repository default-revision [flags] + * `coconut repo default-revision basic-tasks` Sets `basic-tasks`as the global default-revision + * `coconut repo default-revision 0 master` Sets `master`as the default-revision for repo with index 0 + * `coconut repo default-revision 2 vs-sftb` Sets `vs-sftb`as the default-revision for repo with index 2 ``` ### Options @@ -27,10 +30,10 @@ coconut repository default-revision [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -38,4 +41,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_default.md b/coconut/doc/coconut_repository_default.md index 28768fe59..cf4362bf9 100644 --- a/coconut/doc/coconut_repository_default.md +++ b/coconut/doc/coconut_repository_default.md @@ -5,9 +5,16 @@ set a git repository as default ### Synopsis The repository default command sets a git repository as the default repository for incoming workflow deployment requests. +A repository is referenced through its repo id, as reported by `coconut repo list`. ``` -coconut repository default [flags] +coconut repository default [flags] +``` + +### Examples + +``` + * `coconut repo default 2` ``` ### Options @@ -20,10 +27,10 @@ coconut repository default [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +38,4 @@ coconut repository default [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 5b0fb956f..5c27d39af 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -20,10 +20,10 @@ coconut repository list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 9d3424cb9..978b47fd0 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -5,9 +5,17 @@ refresh git repositories ### Synopsis The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date. +It can optionally be supplied with a repo id, to only refresh a specific repo. Repo ids are reported by `coconut repo list`. ``` -coconut repository refresh [flags] +coconut repository refresh [repo id] [flags] +``` + +### Examples + +``` + * `coconut repo refresh` + * `coconut repo refresh 1` ``` ### Options @@ -20,10 +28,10 @@ coconut repository refresh [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +39,4 @@ coconut repository refresh [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 881c1a4ca..74fa8b176 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -5,9 +5,17 @@ remove a git repository ### Synopsis The repository remove command removes a git repository from the catalogue of workflow configuration sources. +A repository is referenced by its repo id, as reported by`coconut repo list` ``` -coconut repository remove [flags] +coconut repository remove [flags] +``` + +### Examples + +``` + * `coconut repo remove 1` + * `coconut repo del 2` ``` ### Options @@ -20,10 +28,10 @@ coconut repository remove [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +39,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index 16c97dbae..f06453a11 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -17,10 +17,10 @@ display information on active roles. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +29,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 3a248d0c8..504cb016b 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -20,10 +20,10 @@ coconut role query [environment id] [query path] [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -31,4 +31,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index 9e09b8c01..fc6e0d854 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -17,10 +17,10 @@ manage active tasks. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -30,4 +30,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 29ab4782a..936c2bd8a 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -22,10 +22,10 @@ coconut task clean [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -33,4 +33,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 4b4e7763e..8b6d6d467 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -21,10 +21,10 @@ coconut task list [flags] ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -32,4 +32,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index e030f60f6..6057fba51 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -17,10 +17,10 @@ display information on available workflow templates. ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -29,4 +29,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index a3e1a60dc..4d6c98428 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -39,16 +39,17 @@ coconut template list [flags] -h, --help help for list -r, --repository string repositories to list templates from -i, --revision string revisions (branches/tags) to list templates from + -d, --show-description show the description of each template ``` ### Options inherited from parent commands ``` --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "consul://127.0.0.1:8500") + --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nospinner disable animations in output --nocolor disable colors in output + --nospinner disable animations in output -v, --verbose show verbose output for debug purposes ``` @@ -56,4 +57,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 14-Jun-2021 +###### Auto generated by spf13/cobra on 17-Aug-2023 From e4ee516009cea84fff02db98c326af7c21a52bc9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Aug 2023 17:28:17 +0200 Subject: [PATCH 1710/2352] [docs] Update apidocs --- docs/apidocs_aliecs.md | 674 ++++++++++++++++++++++++++-------------- docs/apidocs_apricot.md | 407 ++++++++++++++++++++---- docs/apidocs_occ.md | 79 ++--- 3 files changed, 830 insertions(+), 330 deletions(-) diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 694347cf5..6edc6a02d 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -3,102 +3,112 @@ ## Table of Contents -- [o2control.proto](#o2control.proto) - - [AddRepoReply](#o2control.AddRepoReply) - - [AddRepoRequest](#o2control.AddRepoRequest) - - [ChannelInfo](#o2control.ChannelInfo) - - [CleanupTasksReply](#o2control.CleanupTasksReply) - - [CleanupTasksRequest](#o2control.CleanupTasksRequest) - - [CommandInfo](#o2control.CommandInfo) - - [ControlEnvironmentReply](#o2control.ControlEnvironmentReply) - - [ControlEnvironmentRequest](#o2control.ControlEnvironmentRequest) - - [DestroyEnvironmentReply](#o2control.DestroyEnvironmentReply) - - [DestroyEnvironmentRequest](#o2control.DestroyEnvironmentRequest) - - [Empty](#o2control.Empty) - - [EnvironmentInfo](#o2control.EnvironmentInfo) - - [EnvironmentInfo.DefaultsEntry](#o2control.EnvironmentInfo.DefaultsEntry) - - [EnvironmentInfo.UserVarsEntry](#o2control.EnvironmentInfo.UserVarsEntry) - - [EnvironmentInfo.VarsEntry](#o2control.EnvironmentInfo.VarsEntry) - - [EnvironmentOperation](#o2control.EnvironmentOperation) - - [Ev_EnvironmentEvent](#o2control.Ev_EnvironmentEvent) - - [Ev_RoleEvent](#o2control.Ev_RoleEvent) - - [Ev_TaskEvent](#o2control.Ev_TaskEvent) - - [Event](#o2control.Event) - - [Event_MesosHeartbeat](#o2control.Event_MesosHeartbeat) - - [GetEnvironmentPropertiesReply](#o2control.GetEnvironmentPropertiesReply) - - [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control.GetEnvironmentPropertiesReply.PropertiesEntry) - - [GetEnvironmentPropertiesRequest](#o2control.GetEnvironmentPropertiesRequest) - - [GetEnvironmentReply](#o2control.GetEnvironmentReply) - - [GetEnvironmentRequest](#o2control.GetEnvironmentRequest) - - [GetEnvironmentsReply](#o2control.GetEnvironmentsReply) - - [GetEnvironmentsRequest](#o2control.GetEnvironmentsRequest) - - [GetFrameworkInfoReply](#o2control.GetFrameworkInfoReply) - - [GetFrameworkInfoRequest](#o2control.GetFrameworkInfoRequest) - - [GetRolesReply](#o2control.GetRolesReply) - - [GetRolesRequest](#o2control.GetRolesRequest) - - [GetTaskReply](#o2control.GetTaskReply) - - [GetTaskRequest](#o2control.GetTaskRequest) - - [GetTasksReply](#o2control.GetTasksReply) - - [GetTasksRequest](#o2control.GetTasksRequest) - - [GetWorkflowTemplatesReply](#o2control.GetWorkflowTemplatesReply) - - [GetWorkflowTemplatesRequest](#o2control.GetWorkflowTemplatesRequest) - - [ListReposReply](#o2control.ListReposReply) - - [ListReposRequest](#o2control.ListReposRequest) - - [ModifyEnvironmentReply](#o2control.ModifyEnvironmentReply) - - [ModifyEnvironmentRequest](#o2control.ModifyEnvironmentRequest) - - [NewAutoEnvironmentReply](#o2control.NewAutoEnvironmentReply) - - [NewAutoEnvironmentRequest](#o2control.NewAutoEnvironmentRequest) - - [NewAutoEnvironmentRequest.VarsEntry](#o2control.NewAutoEnvironmentRequest.VarsEntry) - - [NewEnvironmentReply](#o2control.NewEnvironmentReply) - - [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) - - [NewEnvironmentRequest.VarsEntry](#o2control.NewEnvironmentRequest.VarsEntry) - - [RefreshReposRequest](#o2control.RefreshReposRequest) - - [RemoveRepoReply](#o2control.RemoveRepoReply) - - [RemoveRepoRequest](#o2control.RemoveRepoRequest) - - [RepoInfo](#o2control.RepoInfo) - - [RoleInfo](#o2control.RoleInfo) - - [RoleInfo.DefaultsEntry](#o2control.RoleInfo.DefaultsEntry) - - [RoleInfo.UserVarsEntry](#o2control.RoleInfo.UserVarsEntry) - - [RoleInfo.VarsEntry](#o2control.RoleInfo.VarsEntry) - - [SetDefaultRepoRequest](#o2control.SetDefaultRepoRequest) - - [SetEnvironmentPropertiesReply](#o2control.SetEnvironmentPropertiesReply) - - [SetEnvironmentPropertiesRequest](#o2control.SetEnvironmentPropertiesRequest) - - [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control.SetEnvironmentPropertiesRequest.PropertiesEntry) - - [SetGlobalDefaultRevisionRequest](#o2control.SetGlobalDefaultRevisionRequest) - - [SetRepoDefaultRevisionReply](#o2control.SetRepoDefaultRevisionReply) - - [SetRepoDefaultRevisionRequest](#o2control.SetRepoDefaultRevisionRequest) - - [ShortTaskInfo](#o2control.ShortTaskInfo) - - [StatusReply](#o2control.StatusReply) - - [StatusRequest](#o2control.StatusRequest) - - [StatusUpdate](#o2control.StatusUpdate) - - [SubscribeRequest](#o2control.SubscribeRequest) - - [TaskClassInfo](#o2control.TaskClassInfo) - - [TaskDeploymentInfo](#o2control.TaskDeploymentInfo) - - [TaskInfo](#o2control.TaskInfo) - - [TaskInfo.PropertiesEntry](#o2control.TaskInfo.PropertiesEntry) - - [TeardownReply](#o2control.TeardownReply) - - [TeardownRequest](#o2control.TeardownRequest) - - [Version](#o2control.Version) - - [WorkflowTemplateInfo](#o2control.WorkflowTemplateInfo) +- [o2control.proto](#o2control-proto) + - [AddRepoReply](#o2control-AddRepoReply) + - [AddRepoRequest](#o2control-AddRepoRequest) + - [ChannelInfo](#o2control-ChannelInfo) + - [CleanupTasksReply](#o2control-CleanupTasksReply) + - [CleanupTasksRequest](#o2control-CleanupTasksRequest) + - [CommandInfo](#o2control-CommandInfo) + - [ControlEnvironmentReply](#o2control-ControlEnvironmentReply) + - [ControlEnvironmentRequest](#o2control-ControlEnvironmentRequest) + - [DestroyEnvironmentReply](#o2control-DestroyEnvironmentReply) + - [DestroyEnvironmentRequest](#o2control-DestroyEnvironmentRequest) + - [Empty](#o2control-Empty) + - [EnvironmentInfo](#o2control-EnvironmentInfo) + - [EnvironmentInfo.DefaultsEntry](#o2control-EnvironmentInfo-DefaultsEntry) + - [EnvironmentInfo.IntegratedServicesDataEntry](#o2control-EnvironmentInfo-IntegratedServicesDataEntry) + - [EnvironmentInfo.UserVarsEntry](#o2control-EnvironmentInfo-UserVarsEntry) + - [EnvironmentInfo.VarsEntry](#o2control-EnvironmentInfo-VarsEntry) + - [EnvironmentOperation](#o2control-EnvironmentOperation) + - [Ev_EnvironmentEvent](#o2control-Ev_EnvironmentEvent) + - [Ev_RoleEvent](#o2control-Ev_RoleEvent) + - [Ev_TaskEvent](#o2control-Ev_TaskEvent) + - [Event](#o2control-Event) + - [Event_MesosHeartbeat](#o2control-Event_MesosHeartbeat) + - [GetActiveDetectorsReply](#o2control-GetActiveDetectorsReply) + - [GetEnvironmentPropertiesReply](#o2control-GetEnvironmentPropertiesReply) + - [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control-GetEnvironmentPropertiesReply-PropertiesEntry) + - [GetEnvironmentPropertiesRequest](#o2control-GetEnvironmentPropertiesRequest) + - [GetEnvironmentReply](#o2control-GetEnvironmentReply) + - [GetEnvironmentRequest](#o2control-GetEnvironmentRequest) + - [GetEnvironmentsReply](#o2control-GetEnvironmentsReply) + - [GetEnvironmentsRequest](#o2control-GetEnvironmentsRequest) + - [GetFrameworkInfoReply](#o2control-GetFrameworkInfoReply) + - [GetFrameworkInfoRequest](#o2control-GetFrameworkInfoRequest) + - [GetRolesReply](#o2control-GetRolesReply) + - [GetRolesRequest](#o2control-GetRolesRequest) + - [GetTaskReply](#o2control-GetTaskReply) + - [GetTaskRequest](#o2control-GetTaskRequest) + - [GetTasksReply](#o2control-GetTasksReply) + - [GetTasksRequest](#o2control-GetTasksRequest) + - [GetWorkflowTemplatesReply](#o2control-GetWorkflowTemplatesReply) + - [GetWorkflowTemplatesRequest](#o2control-GetWorkflowTemplatesRequest) + - [IntegratedServiceInfo](#o2control-IntegratedServiceInfo) + - [ListIntegratedServicesReply](#o2control-ListIntegratedServicesReply) + - [ListIntegratedServicesReply.ServicesEntry](#o2control-ListIntegratedServicesReply-ServicesEntry) + - [ListReposReply](#o2control-ListReposReply) + - [ListReposRequest](#o2control-ListReposRequest) + - [ModifyEnvironmentReply](#o2control-ModifyEnvironmentReply) + - [ModifyEnvironmentRequest](#o2control-ModifyEnvironmentRequest) + - [NewAutoEnvironmentReply](#o2control-NewAutoEnvironmentReply) + - [NewAutoEnvironmentRequest](#o2control-NewAutoEnvironmentRequest) + - [NewAutoEnvironmentRequest.VarsEntry](#o2control-NewAutoEnvironmentRequest-VarsEntry) + - [NewEnvironmentReply](#o2control-NewEnvironmentReply) + - [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) + - [NewEnvironmentRequest.VarsEntry](#o2control-NewEnvironmentRequest-VarsEntry) + - [RefreshReposRequest](#o2control-RefreshReposRequest) + - [RemoveRepoReply](#o2control-RemoveRepoReply) + - [RemoveRepoRequest](#o2control-RemoveRepoRequest) + - [RepoInfo](#o2control-RepoInfo) + - [RoleInfo](#o2control-RoleInfo) + - [RoleInfo.ConsolidatedStackEntry](#o2control-RoleInfo-ConsolidatedStackEntry) + - [RoleInfo.DefaultsEntry](#o2control-RoleInfo-DefaultsEntry) + - [RoleInfo.UserVarsEntry](#o2control-RoleInfo-UserVarsEntry) + - [RoleInfo.VarsEntry](#o2control-RoleInfo-VarsEntry) + - [SetDefaultRepoRequest](#o2control-SetDefaultRepoRequest) + - [SetEnvironmentPropertiesReply](#o2control-SetEnvironmentPropertiesReply) + - [SetEnvironmentPropertiesRequest](#o2control-SetEnvironmentPropertiesRequest) + - [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control-SetEnvironmentPropertiesRequest-PropertiesEntry) + - [SetGlobalDefaultRevisionRequest](#o2control-SetGlobalDefaultRevisionRequest) + - [SetRepoDefaultRevisionReply](#o2control-SetRepoDefaultRevisionReply) + - [SetRepoDefaultRevisionRequest](#o2control-SetRepoDefaultRevisionRequest) + - [ShortTaskInfo](#o2control-ShortTaskInfo) + - [StatusReply](#o2control-StatusReply) + - [StatusRequest](#o2control-StatusRequest) + - [StatusUpdate](#o2control-StatusUpdate) + - [SubscribeRequest](#o2control-SubscribeRequest) + - [TaskClassInfo](#o2control-TaskClassInfo) + - [TaskDeploymentInfo](#o2control-TaskDeploymentInfo) + - [TaskInfo](#o2control-TaskInfo) + - [TaskInfo.PropertiesEntry](#o2control-TaskInfo-PropertiesEntry) + - [TeardownReply](#o2control-TeardownReply) + - [TeardownRequest](#o2control-TeardownRequest) + - [VarSpecMessage](#o2control-VarSpecMessage) + - [Version](#o2control-Version) + - [WorkflowTemplateInfo](#o2control-WorkflowTemplateInfo) + - [WorkflowTemplateInfo.VarSpecMapEntry](#o2control-WorkflowTemplateInfo-VarSpecMapEntry) - - [ControlEnvironmentRequest.Optype](#o2control.ControlEnvironmentRequest.Optype) - - [EnvironmentOperation.Optype](#o2control.EnvironmentOperation.Optype) - - [StatusUpdate.Level](#o2control.StatusUpdate.Level) + - [ControlEnvironmentRequest.Optype](#o2control-ControlEnvironmentRequest-Optype) + - [EnvironmentOperation.Optype](#o2control-EnvironmentOperation-Optype) + - [StatusUpdate.Level](#o2control-StatusUpdate-Level) + - [VarSpecMessage.Type](#o2control-VarSpecMessage-Type) + - [VarSpecMessage.UiWidget](#o2control-VarSpecMessage-UiWidget) - - [Control](#o2control.Control) + - [Control](#o2control-Control) - [Scalar Value Types](#scalar-value-types) - +

Top

## o2control.proto - + ### AddRepoReply @@ -114,7 +124,7 @@ - + ### AddRepoRequest @@ -130,7 +140,7 @@ - + ### ChannelInfo @@ -147,7 +157,7 @@ - + ### CleanupTasksReply @@ -155,15 +165,15 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| killedTasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | -| runningTasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | +| killedTasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | +| runningTasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | - + ### CleanupTasksRequest @@ -178,7 +188,7 @@ - + ### CommandInfo @@ -197,7 +207,7 @@ - + ### ControlEnvironmentReply @@ -208,13 +218,16 @@ | id | [string](#string) | | | | state | [string](#string) | | | | currentRunNumber | [uint32](#uint32) | | | +| startOfTransition | [int64](#int64) | | All times are in milliseconds | +| endOfTransition | [int64](#int64) | | | +| transitionDuration | [int64](#int64) | | | - + ### ControlEnvironmentRequest @@ -223,14 +236,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | -| type | [ControlEnvironmentRequest.Optype](#o2control.ControlEnvironmentRequest.Optype) | | | +| type | [ControlEnvironmentRequest.Optype](#o2control-ControlEnvironmentRequest-Optype) | | | - + ### DestroyEnvironmentReply @@ -238,14 +251,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| cleanupTasksReply | [CleanupTasksReply](#o2control.CleanupTasksReply) | | | +| cleanupTasksReply | [CleanupTasksReply](#o2control-CleanupTasksReply) | | | - + ### DestroyEnvironmentRequest @@ -263,7 +276,7 @@ - + ### Empty @@ -273,7 +286,7 @@ - + ### EnvironmentInfo @@ -282,21 +295,28 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | -| createdWhen | [string](#string) | | | +| createdWhen | [int64](#int64) | | msec | | state | [string](#string) | | | -| tasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | +| tasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | | rootRole | [string](#string) | | | | currentRunNumber | [uint32](#uint32) | | | -| defaults | [EnvironmentInfo.DefaultsEntry](#o2control.EnvironmentInfo.DefaultsEntry) | repeated | | -| vars | [EnvironmentInfo.VarsEntry](#o2control.EnvironmentInfo.VarsEntry) | repeated | | -| userVars | [EnvironmentInfo.UserVarsEntry](#o2control.EnvironmentInfo.UserVarsEntry) | repeated | | +| defaults | [EnvironmentInfo.DefaultsEntry](#o2control-EnvironmentInfo-DefaultsEntry) | repeated | | +| vars | [EnvironmentInfo.VarsEntry](#o2control-EnvironmentInfo-VarsEntry) | repeated | | +| userVars | [EnvironmentInfo.UserVarsEntry](#o2control-EnvironmentInfo-UserVarsEntry) | repeated | | +| numberOfFlps | [int32](#int32) | | | +| includedDetectors | [string](#string) | repeated | | +| description | [string](#string) | | | +| numberOfHosts | [int32](#int32) | | | +| integratedServicesData | [EnvironmentInfo.IntegratedServicesDataEntry](#o2control-EnvironmentInfo-IntegratedServicesDataEntry) | repeated | | +| numberOfTasks | [int32](#int32) | | | +| currentTransition | [string](#string) | | | - + ### EnvironmentInfo.DefaultsEntry @@ -312,7 +332,23 @@ - + + +### EnvironmentInfo.IntegratedServicesDataEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + ### EnvironmentInfo.UserVarsEntry @@ -328,7 +364,7 @@ - + ### EnvironmentInfo.VarsEntry @@ -344,7 +380,7 @@ - + ### EnvironmentOperation @@ -352,7 +388,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | [EnvironmentOperation.Optype](#o2control.EnvironmentOperation.Optype) | | | +| type | [EnvironmentOperation.Optype](#o2control-EnvironmentOperation-Optype) | | | | roleName | [string](#string) | | | @@ -360,7 +396,7 @@ - + ### Ev_EnvironmentEvent @@ -379,7 +415,7 @@ - + ### Ev_RoleEvent @@ -397,7 +433,7 @@ - + ### Ev_TaskEvent @@ -417,7 +453,7 @@ - + ### Event @@ -426,16 +462,16 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | timestamp | [string](#string) | | | -| environmentEvent | [Ev_EnvironmentEvent](#o2control.Ev_EnvironmentEvent) | | | -| taskEvent | [Ev_TaskEvent](#o2control.Ev_TaskEvent) | | | -| roleEvent | [Ev_RoleEvent](#o2control.Ev_RoleEvent) | | | +| environmentEvent | [Ev_EnvironmentEvent](#o2control-Ev_EnvironmentEvent) | | | +| taskEvent | [Ev_TaskEvent](#o2control-Ev_TaskEvent) | | | +| roleEvent | [Ev_RoleEvent](#o2control-Ev_RoleEvent) | | | - + ### Event_MesosHeartbeat @@ -445,7 +481,22 @@ - + + +### GetActiveDetectorsReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| detectors | [string](#string) | repeated | | + + + + + + + ### GetEnvironmentPropertiesReply @@ -453,14 +504,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| properties | [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control.GetEnvironmentPropertiesReply.PropertiesEntry) | repeated | | +| properties | [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control-GetEnvironmentPropertiesReply-PropertiesEntry) | repeated | | - + ### GetEnvironmentPropertiesReply.PropertiesEntry @@ -476,7 +527,7 @@ - + ### GetEnvironmentPropertiesRequest @@ -493,7 +544,7 @@ - + ### GetEnvironmentReply @@ -501,15 +552,16 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | -| workflow | [RoleInfo](#o2control.RoleInfo) | | | +| environment | [EnvironmentInfo](#o2control-EnvironmentInfo) | | | +| workflow | [RoleInfo](#o2control-RoleInfo) | | | +| public | [bool](#bool) | | | - + ### GetEnvironmentRequest @@ -518,13 +570,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | +| showWorkflowTree | [bool](#bool) | | | - + ### GetEnvironmentsReply @@ -533,25 +586,31 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | frameworkId | [string](#string) | | | -| environments | [EnvironmentInfo](#o2control.EnvironmentInfo) | repeated | | +| environments | [EnvironmentInfo](#o2control-EnvironmentInfo) | repeated | | - + ### GetEnvironmentsRequest Environment ////////////////////////////////////// +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| showAll | [bool](#bool) | | | +| showTaskInfos | [bool](#bool) | | | + + - + ### GetFrameworkInfoReply @@ -565,14 +624,18 @@ Environment | state | [string](#string) | | | | hostsCount | [int32](#int32) | | | | instanceName | [string](#string) | | | -| version | [Version](#o2control.Version) | | | +| version | [Version](#o2control-Version) | | | +| configurationEndpoint | [string](#string) | | | +| detectorsInInstance | [string](#string) | repeated | | +| activeDetectors | [string](#string) | repeated | | +| availableDetectors | [string](#string) | repeated | | - + ### GetFrameworkInfoRequest Framework @@ -583,7 +646,7 @@ Framework - + ### GetRolesReply @@ -591,14 +654,14 @@ Framework | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| roles | [RoleInfo](#o2control.RoleInfo) | repeated | | +| roles | [RoleInfo](#o2control-RoleInfo) | repeated | | - + ### GetRolesRequest Roles @@ -615,7 +678,7 @@ Roles - + ### GetTaskReply @@ -623,14 +686,14 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| task | [TaskInfo](#o2control.TaskInfo) | | | +| task | [TaskInfo](#o2control-TaskInfo) | | | - + ### GetTaskRequest @@ -645,7 +708,7 @@ Roles - + ### GetTasksReply @@ -653,14 +716,14 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| tasks | [ShortTaskInfo](#o2control.ShortTaskInfo) | repeated | | +| tasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | - + ### GetTasksRequest @@ -670,7 +733,7 @@ Roles - + ### GetWorkflowTemplatesReply @@ -678,14 +741,14 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| workflowTemplates | [WorkflowTemplateInfo](#o2control.WorkflowTemplateInfo) | repeated | | +| workflowTemplates | [WorkflowTemplateInfo](#o2control-WorkflowTemplateInfo) | repeated | | - + ### GetWorkflowTemplatesRequest @@ -697,13 +760,64 @@ Roles | revisionPattern | [string](#string) | | | | allBranches | [bool](#bool) | | | | allTags | [bool](#bool) | | | +| allWorkflows | [bool](#bool) | | | + + + + +### IntegratedServiceInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | user-visible service name, e.g. "DD scheduler" | +| enabled | [bool](#bool) | | | +| endpoint | [string](#string) | | | +| connectionState | [string](#string) | | allowed values: READY, CONNECTING, TRANSIENT_FAILURE, IDLE, SHUTDOWN | +| data | [string](#string) | | always a JSON payload with a map<string, string> inside. | + + + + + + + + +### ListIntegratedServicesReply + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| services | [ListIntegratedServicesReply.ServicesEntry](#o2control-ListIntegratedServicesReply-ServicesEntry) | repeated | keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead | + + + + + + + + +### ListIntegratedServicesReply.ServicesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [IntegratedServiceInfo](#o2control-IntegratedServiceInfo) | | | + - + + + + ### ListReposReply @@ -711,7 +825,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| repos | [RepoInfo](#o2control.RepoInfo) | repeated | | +| repos | [RepoInfo](#o2control-RepoInfo) | repeated | | | globalDefaultRevision | [string](#string) | | | @@ -719,17 +833,22 @@ Roles - + ### ListReposRequest +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| getRevisions | [bool](#bool) | | | + - + + ### ModifyEnvironmentReply @@ -737,7 +856,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| failedOperations | [EnvironmentOperation](#o2control.EnvironmentOperation) | repeated | | +| failedOperations | [EnvironmentOperation](#o2control-EnvironmentOperation) | repeated | | | id | [string](#string) | | | | state | [string](#string) | | | @@ -746,7 +865,7 @@ Roles - + ### ModifyEnvironmentRequest @@ -755,7 +874,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | -| operations | [EnvironmentOperation](#o2control.EnvironmentOperation) | repeated | | +| operations | [EnvironmentOperation](#o2control-EnvironmentOperation) | repeated | | | reconfigureAll | [bool](#bool) | | | @@ -763,7 +882,7 @@ Roles - + ### NewAutoEnvironmentReply @@ -773,7 +892,7 @@ Roles - + ### NewAutoEnvironmentRequest @@ -782,7 +901,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | workflowTemplate | [string](#string) | | | -| vars | [NewAutoEnvironmentRequest.VarsEntry](#o2control.NewAutoEnvironmentRequest.VarsEntry) | repeated | | +| vars | [NewAutoEnvironmentRequest.VarsEntry](#o2control-NewAutoEnvironmentRequest-VarsEntry) | repeated | | | id | [string](#string) | | | @@ -790,7 +909,7 @@ Roles - + ### NewAutoEnvironmentRequest.VarsEntry @@ -806,7 +925,7 @@ Roles - + ### NewEnvironmentReply @@ -814,14 +933,15 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| environment | [EnvironmentInfo](#o2control.EnvironmentInfo) | | | +| environment | [EnvironmentInfo](#o2control-EnvironmentInfo) | | | +| public | [bool](#bool) | | | - + ### NewEnvironmentRequest @@ -830,14 +950,15 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | workflowTemplate | [string](#string) | | | -| vars | [NewEnvironmentRequest.VarsEntry](#o2control.NewEnvironmentRequest.VarsEntry) | repeated | | +| vars | [NewEnvironmentRequest.VarsEntry](#o2control-NewEnvironmentRequest-VarsEntry) | repeated | | +| public | [bool](#bool) | | | - + ### NewEnvironmentRequest.VarsEntry @@ -853,7 +974,7 @@ Roles - + ### RefreshReposRequest @@ -868,7 +989,7 @@ Roles - + ### RemoveRepoReply @@ -883,7 +1004,7 @@ Roles - + ### RemoveRepoRequest @@ -898,7 +1019,7 @@ Roles - + ### RepoInfo @@ -909,13 +1030,14 @@ Roles | name | [string](#string) | | | | default | [bool](#bool) | | | | defaultRevision | [string](#string) | | | +| revisions | [string](#string) | repeated | | - + ### RoleInfo @@ -928,17 +1050,35 @@ Roles | state | [string](#string) | | | | fullPath | [string](#string) | | | | taskIds | [string](#string) | repeated | | -| roles | [RoleInfo](#o2control.RoleInfo) | repeated | | -| defaults | [RoleInfo.DefaultsEntry](#o2control.RoleInfo.DefaultsEntry) | repeated | | -| vars | [RoleInfo.VarsEntry](#o2control.RoleInfo.VarsEntry) | repeated | | -| userVars | [RoleInfo.UserVarsEntry](#o2control.RoleInfo.UserVarsEntry) | repeated | | +| roles | [RoleInfo](#o2control-RoleInfo) | repeated | | +| defaults | [RoleInfo.DefaultsEntry](#o2control-RoleInfo-DefaultsEntry) | repeated | | +| vars | [RoleInfo.VarsEntry](#o2control-RoleInfo-VarsEntry) | repeated | | +| userVars | [RoleInfo.UserVarsEntry](#o2control-RoleInfo-UserVarsEntry) | repeated | | +| consolidatedStack | [RoleInfo.ConsolidatedStackEntry](#o2control-RoleInfo-ConsolidatedStackEntry) | repeated | | +| description | [string](#string) | | | + + + + + + + + +### RoleInfo.ConsolidatedStackEntry + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | - + + ### RoleInfo.DefaultsEntry @@ -954,7 +1094,7 @@ Roles - + ### RoleInfo.UserVarsEntry @@ -970,7 +1110,7 @@ Roles - + ### RoleInfo.VarsEntry @@ -986,7 +1126,7 @@ Roles - + ### SetDefaultRepoRequest @@ -1001,7 +1141,7 @@ Roles - + ### SetEnvironmentPropertiesReply @@ -1011,7 +1151,7 @@ Roles - + ### SetEnvironmentPropertiesRequest Environment, GET/SET properties @@ -1021,14 +1161,14 @@ Environment, GET/SET properties | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | -| properties | [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control.SetEnvironmentPropertiesRequest.PropertiesEntry) | repeated | If properties == nil, the core sets nothing and reply ok | +| properties | [SetEnvironmentPropertiesRequest.PropertiesEntry](#o2control-SetEnvironmentPropertiesRequest-PropertiesEntry) | repeated | If properties == nil, the core sets nothing and reply ok | - + ### SetEnvironmentPropertiesRequest.PropertiesEntry @@ -1044,7 +1184,7 @@ Environment, GET/SET properties - + ### SetGlobalDefaultRevisionRequest @@ -1059,7 +1199,7 @@ Environment, GET/SET properties - + ### SetRepoDefaultRevisionReply @@ -1074,7 +1214,7 @@ Environment, GET/SET properties - + ### SetRepoDefaultRevisionRequest @@ -1090,7 +1230,7 @@ Environment, GET/SET properties - + ### ShortTaskInfo Tasks @@ -1105,16 +1245,17 @@ Tasks | status | [string](#string) | | | | state | [string](#string) | | | | className | [string](#string) | | | -| deploymentInfo | [TaskDeploymentInfo](#o2control.TaskDeploymentInfo) | | | +| deploymentInfo | [TaskDeploymentInfo](#o2control-TaskDeploymentInfo) | | | | pid | [string](#string) | | | | sandboxStdout | [string](#string) | | | +| claimable | [bool](#bool) | | | - + ### StatusReply @@ -1123,14 +1264,14 @@ Tasks | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | state | [string](#string) | | | -| statusUpdates | [StatusUpdate](#o2control.StatusUpdate) | repeated | | +| statusUpdates | [StatusUpdate](#o2control-StatusUpdate) | repeated | | - + ### StatusRequest Global status @@ -1141,7 +1282,7 @@ Global status - + ### StatusUpdate @@ -1149,15 +1290,15 @@ Global status | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| level | [StatusUpdate.Level](#o2control.StatusUpdate.Level) | | | -| mesosHeartbeat | [Event_MesosHeartbeat](#o2control.Event_MesosHeartbeat) | | TODO add other events here and in events.proto | +| level | [StatusUpdate.Level](#o2control-StatusUpdate-Level) | | | +| mesosHeartbeat | [Event_MesosHeartbeat](#o2control-Event_MesosHeartbeat) | | TODO add other events here and in events.proto | - + ### SubscribeRequest @@ -1172,7 +1313,7 @@ Global status - + ### TaskClassInfo @@ -1188,7 +1329,7 @@ Global status - + ### TaskDeploymentInfo @@ -1206,7 +1347,7 @@ Global status - + ### TaskInfo @@ -1214,21 +1355,21 @@ Global status | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| shortInfo | [ShortTaskInfo](#o2control.ShortTaskInfo) | | | -| classInfo | [TaskClassInfo](#o2control.TaskClassInfo) | | | -| inboundChannels | [ChannelInfo](#o2control.ChannelInfo) | repeated | | -| outboundChannels | [ChannelInfo](#o2control.ChannelInfo) | repeated | | -| commandInfo | [CommandInfo](#o2control.CommandInfo) | | | +| shortInfo | [ShortTaskInfo](#o2control-ShortTaskInfo) | | | +| classInfo | [TaskClassInfo](#o2control-TaskClassInfo) | | | +| inboundChannels | [ChannelInfo](#o2control-ChannelInfo) | repeated | | +| outboundChannels | [ChannelInfo](#o2control-ChannelInfo) | repeated | | +| commandInfo | [CommandInfo](#o2control-CommandInfo) | | | | taskPath | [string](#string) | | | | envId | [string](#string) | | | -| properties | [TaskInfo.PropertiesEntry](#o2control.TaskInfo.PropertiesEntry) | repeated | | +| properties | [TaskInfo.PropertiesEntry](#o2control-TaskInfo-PropertiesEntry) | repeated | | - + ### TaskInfo.PropertiesEntry @@ -1244,7 +1385,7 @@ Global status - + ### TeardownReply @@ -1254,7 +1395,7 @@ Global status - + ### TeardownRequest Not implemented yet @@ -1269,7 +1410,31 @@ Not implemented yet - + + +### VarSpecMessage + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| defaultValue | [string](#string) | | | +| type | [VarSpecMessage.Type](#o2control-VarSpecMessage-Type) | | | +| label | [string](#string) | | | +| description | [string](#string) | | | +| widget | [VarSpecMessage.UiWidget](#o2control-VarSpecMessage-UiWidget) | | | +| panel | [string](#string) | | hint for the UI on where to put or group the given variable input | +| allowedValues | [string](#string) | repeated | list of offered values from which to choose (only for some UiWidgets) | +| index | [int32](#int32) | | | +| visibleIf | [string](#string) | | JS expression that evaluates to bool | +| enabledIf | [string](#string) | | JS expression that evaluates to bool | + + + + + + + ### Version @@ -1289,7 +1454,7 @@ Not implemented yet - + ### WorkflowTemplateInfo @@ -1300,6 +1465,24 @@ Not implemented yet | repo | [string](#string) | | | | template | [string](#string) | | | | revision | [string](#string) | | | +| varSpecMap | [WorkflowTemplateInfo.VarSpecMapEntry](#o2control-WorkflowTemplateInfo-VarSpecMapEntry) | repeated | | +| description | [string](#string) | | | + + + + + + + + +### WorkflowTemplateInfo.VarSpecMapEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [VarSpecMessage](#o2control-VarSpecMessage) | | | @@ -1308,7 +1491,7 @@ Not implemented yet - + ### ControlEnvironmentRequest.Optype @@ -1321,10 +1504,11 @@ Not implemented yet | CONFIGURE | 3 | | | RESET | 4 | | | GO_ERROR | 5 | | +| DEPLOY | 6 | | - + ### EnvironmentOperation.Optype @@ -1337,7 +1521,7 @@ Not implemented yet - + ### StatusUpdate.Level @@ -1350,41 +1534,75 @@ Not implemented yet | ERROR | 3 | | + + + +### VarSpecMessage.Type + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| string | 0 | | +| number | 1 | | +| bool | 2 | | +| list | 3 | | +| map | 4 | | + + + + + +### VarSpecMessage.UiWidget + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| editBox | 0 | plain string input line, can accept types number (like a spinBox) and string | +| slider | 1 | input widget exclusively for numbers, range allowedValues[0]-[1] | +| listBox | 2 | displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed | +| dropDownBox | 3 | | +| comboBox | 4 | | +| radioButtonBox | 5 | | +| checkBox | 6 | | + + - + ### Control | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| TrackStatus | [StatusRequest](#o2control.StatusRequest) | [StatusReply](#o2control.StatusReply) stream | | -| GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control.GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control.GetFrameworkInfoReply) | | -| Teardown | [TeardownRequest](#o2control.TeardownRequest) | [TeardownReply](#o2control.TeardownReply) | | -| GetEnvironments | [GetEnvironmentsRequest](#o2control.GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control.GetEnvironmentsReply) | | -| NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control.NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control.NewAutoEnvironmentReply) | | -| NewEnvironment | [NewEnvironmentRequest](#o2control.NewEnvironmentRequest) | [NewEnvironmentReply](#o2control.NewEnvironmentReply) | | -| GetEnvironment | [GetEnvironmentRequest](#o2control.GetEnvironmentRequest) | [GetEnvironmentReply](#o2control.GetEnvironmentReply) | | -| ControlEnvironment | [ControlEnvironmentRequest](#o2control.ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control.ControlEnvironmentReply) | | -| ModifyEnvironment | [ModifyEnvironmentRequest](#o2control.ModifyEnvironmentRequest) | [ModifyEnvironmentReply](#o2control.ModifyEnvironmentReply) | | -| DestroyEnvironment | [DestroyEnvironmentRequest](#o2control.DestroyEnvironmentRequest) | [DestroyEnvironmentReply](#o2control.DestroyEnvironmentReply) | | -| GetTasks | [GetTasksRequest](#o2control.GetTasksRequest) | [GetTasksReply](#o2control.GetTasksReply) | | -| GetTask | [GetTaskRequest](#o2control.GetTaskRequest) | [GetTaskReply](#o2control.GetTaskReply) | | -| CleanupTasks | [CleanupTasksRequest](#o2control.CleanupTasksRequest) | [CleanupTasksReply](#o2control.CleanupTasksReply) | | -| GetRoles | [GetRolesRequest](#o2control.GetRolesRequest) | [GetRolesReply](#o2control.GetRolesReply) | | -| GetWorkflowTemplates | [GetWorkflowTemplatesRequest](#o2control.GetWorkflowTemplatesRequest) | [GetWorkflowTemplatesReply](#o2control.GetWorkflowTemplatesReply) | | -| ListRepos | [ListReposRequest](#o2control.ListReposRequest) | [ListReposReply](#o2control.ListReposReply) | | -| AddRepo | [AddRepoRequest](#o2control.AddRepoRequest) | [AddRepoReply](#o2control.AddRepoReply) | | -| RemoveRepo | [RemoveRepoRequest](#o2control.RemoveRepoRequest) | [RemoveRepoReply](#o2control.RemoveRepoReply) | | -| RefreshRepos | [RefreshReposRequest](#o2control.RefreshReposRequest) | [Empty](#o2control.Empty) | | -| SetDefaultRepo | [SetDefaultRepoRequest](#o2control.SetDefaultRepoRequest) | [Empty](#o2control.Empty) | | -| SetGlobalDefaultRevision | [SetGlobalDefaultRevisionRequest](#o2control.SetGlobalDefaultRevisionRequest) | [Empty](#o2control.Empty) | | -| SetRepoDefaultRevision | [SetRepoDefaultRevisionRequest](#o2control.SetRepoDefaultRevisionRequest) | [SetRepoDefaultRevisionReply](#o2control.SetRepoDefaultRevisionReply) | | -| Subscribe | [SubscribeRequest](#o2control.SubscribeRequest) | [Event](#o2control.Event) stream | | +| TrackStatus | [StatusRequest](#o2control-StatusRequest) | [StatusReply](#o2control-StatusReply) stream | | +| GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control-GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control-GetFrameworkInfoReply) | | +| Teardown | [TeardownRequest](#o2control-TeardownRequest) | [TeardownReply](#o2control-TeardownReply) | | +| GetEnvironments | [GetEnvironmentsRequest](#o2control-GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control-GetEnvironmentsReply) | | +| NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control-NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control-NewAutoEnvironmentReply) | | +| NewEnvironment | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | | +| GetEnvironment | [GetEnvironmentRequest](#o2control-GetEnvironmentRequest) | [GetEnvironmentReply](#o2control-GetEnvironmentReply) | | +| ControlEnvironment | [ControlEnvironmentRequest](#o2control-ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control-ControlEnvironmentReply) | | +| ModifyEnvironment | [ModifyEnvironmentRequest](#o2control-ModifyEnvironmentRequest) | [ModifyEnvironmentReply](#o2control-ModifyEnvironmentReply) | | +| DestroyEnvironment | [DestroyEnvironmentRequest](#o2control-DestroyEnvironmentRequest) | [DestroyEnvironmentReply](#o2control-DestroyEnvironmentReply) | | +| GetActiveDetectors | [Empty](#o2control-Empty) | [GetActiveDetectorsReply](#o2control-GetActiveDetectorsReply) | | +| GetTasks | [GetTasksRequest](#o2control-GetTasksRequest) | [GetTasksReply](#o2control-GetTasksReply) | | +| GetTask | [GetTaskRequest](#o2control-GetTaskRequest) | [GetTaskReply](#o2control-GetTaskReply) | | +| CleanupTasks | [CleanupTasksRequest](#o2control-CleanupTasksRequest) | [CleanupTasksReply](#o2control-CleanupTasksReply) | | +| GetRoles | [GetRolesRequest](#o2control-GetRolesRequest) | [GetRolesReply](#o2control-GetRolesReply) | | +| GetWorkflowTemplates | [GetWorkflowTemplatesRequest](#o2control-GetWorkflowTemplatesRequest) | [GetWorkflowTemplatesReply](#o2control-GetWorkflowTemplatesReply) | | +| ListRepos | [ListReposRequest](#o2control-ListReposRequest) | [ListReposReply](#o2control-ListReposReply) | | +| AddRepo | [AddRepoRequest](#o2control-AddRepoRequest) | [AddRepoReply](#o2control-AddRepoReply) | | +| RemoveRepo | [RemoveRepoRequest](#o2control-RemoveRepoRequest) | [RemoveRepoReply](#o2control-RemoveRepoReply) | | +| RefreshRepos | [RefreshReposRequest](#o2control-RefreshReposRequest) | [Empty](#o2control-Empty) | | +| SetDefaultRepo | [SetDefaultRepoRequest](#o2control-SetDefaultRepoRequest) | [Empty](#o2control-Empty) | | +| SetGlobalDefaultRevision | [SetGlobalDefaultRevisionRequest](#o2control-SetGlobalDefaultRevisionRequest) | [Empty](#o2control-Empty) | | +| SetRepoDefaultRevision | [SetRepoDefaultRevisionRequest](#o2control-SetRepoDefaultRevisionRequest) | [SetRepoDefaultRevisionReply](#o2control-SetRepoDefaultRevisionReply) | | +| Subscribe | [SubscribeRequest](#o2control-SubscribeRequest) | [Event](#o2control-Event) stream | | +| GetIntegratedServices | [Empty](#o2control-Empty) | [ListIntegratedServicesReply](#o2control-ListIntegratedServicesReply) | | diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index e493d9f04..9c16d3da9 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -3,40 +3,102 @@ ## Table of Contents -- [apricot.proto](#apricot.proto) - - [ComponentEntriesQuery](#apricot.ComponentEntriesQuery) - - [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) - - [ComponentQuery](#apricot.ComponentQuery) - - [ComponentRequest](#apricot.ComponentRequest) - - [ComponentRequest.VarStackEntry](#apricot.ComponentRequest.VarStackEntry) - - [ComponentResponse](#apricot.ComponentResponse) - - [Empty](#apricot.Empty) - - [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) - - [ImportComponentConfigurationRequest](#apricot.ImportComponentConfigurationRequest) - - [ImportComponentConfigurationResponse](#apricot.ImportComponentConfigurationResponse) - - [ListComponentEntriesRequest](#apricot.ListComponentEntriesRequest) - - [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) - - [RunNumberResponse](#apricot.RunNumberResponse) - - [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) - - [StringMap](#apricot.StringMap) - - [StringMap.StringMapEntry](#apricot.StringMap.StringMapEntry) +- [apricot.proto](#apricot-proto) + - [CRUCardEndpointResponse](#apricot-CRUCardEndpointResponse) + - [CRUCardsResponse](#apricot-CRUCardsResponse) + - [CardRequest](#apricot-CardRequest) + - [ComponentEntriesQuery](#apricot-ComponentEntriesQuery) + - [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) + - [ComponentQuery](#apricot-ComponentQuery) + - [ComponentRequest](#apricot-ComponentRequest) + - [ComponentRequest.VarStackEntry](#apricot-ComponentRequest-VarStackEntry) + - [ComponentResponse](#apricot-ComponentResponse) + - [ComponentResponseWithLastIndex](#apricot-ComponentResponseWithLastIndex) + - [DetectorEntriesResponse](#apricot-DetectorEntriesResponse) + - [DetectorEntriesResponse.DetectorEntriesEntry](#apricot-DetectorEntriesResponse-DetectorEntriesEntry) + - [DetectorInventoryResponse](#apricot-DetectorInventoryResponse) + - [DetectorResponse](#apricot-DetectorResponse) + - [DetectorsRequest](#apricot-DetectorsRequest) + - [DetectorsResponse](#apricot-DetectorsResponse) + - [Empty](#apricot-Empty) + - [GetEntryRequest](#apricot-GetEntryRequest) + - [GetRuntimeEntryRequest](#apricot-GetRuntimeEntryRequest) + - [HostEntriesResponse](#apricot-HostEntriesResponse) + - [HostGetRequest](#apricot-HostGetRequest) + - [HostRequest](#apricot-HostRequest) + - [HostsRequest](#apricot-HostsRequest) + - [ImportComponentConfigurationRequest](#apricot-ImportComponentConfigurationRequest) + - [ImportComponentConfigurationResponse](#apricot-ImportComponentConfigurationResponse) + - [ListComponentEntriesRequest](#apricot-ListComponentEntriesRequest) + - [ListRuntimeEntriesRequest](#apricot-ListRuntimeEntriesRequest) + - [RawGetRecursiveRequest](#apricot-RawGetRecursiveRequest) + - [RunNumberResponse](#apricot-RunNumberResponse) + - [SetRuntimeEntryRequest](#apricot-SetRuntimeEntryRequest) + - [StringMap](#apricot-StringMap) + - [StringMap.StringMapEntry](#apricot-StringMap-StringMapEntry) - - [RunType](#apricot.RunType) + - [RunType](#apricot-RunType) - - [Apricot](#apricot.Apricot) + - [Apricot](#apricot-Apricot) - [Scalar Value Types](#scalar-value-types) - +

Top

## apricot.proto - + + +### CRUCardEndpointResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| endpoints | [string](#string) | | | + + + + + + + + +### CRUCardsResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| cards | [string](#string) | | | + + + + + + + + +### CardRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hostname | [string](#string) | | | +| cardSerial | [string](#string) | | | + + + + + + + ### ComponentEntriesQuery @@ -45,7 +107,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | component | [string](#string) | | | -| runType | [RunType](#apricot.RunType) | | | +| runType | [RunType](#apricot-RunType) | | | | machineRole | [string](#string) | | | @@ -53,7 +115,7 @@ - + ### ComponentEntriesResponse @@ -68,7 +130,7 @@ - + ### ComponentQuery @@ -77,7 +139,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | component | [string](#string) | | | -| runType | [RunType](#apricot.RunType) | | | +| runType | [RunType](#apricot-RunType) | | | | machineRole | [string](#string) | | | | entry | [string](#string) | | | | timestamp | [string](#string) | | | @@ -87,7 +149,7 @@ - + ### ComponentRequest @@ -96,16 +158,16 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | path | [string](#string) | | | -| query | [ComponentQuery](#apricot.ComponentQuery) | | | +| query | [ComponentQuery](#apricot-ComponentQuery) | | | | processTemplate | [bool](#bool) | | | -| varStack | [ComponentRequest.VarStackEntry](#apricot.ComponentRequest.VarStackEntry) | repeated | | +| varStack | [ComponentRequest.VarStackEntry](#apricot-ComponentRequest-VarStackEntry) | repeated | | - + ### ComponentRequest.VarStackEntry @@ -121,7 +183,7 @@ - + ### ComponentResponse @@ -136,7 +198,114 @@ - + + +### ComponentResponseWithLastIndex + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| payload | [string](#string) | | | +| lastIndex | [uint64](#uint64) | | | + + + + + + + + +### DetectorEntriesResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| detectorEntries | [DetectorEntriesResponse.DetectorEntriesEntry](#apricot-DetectorEntriesResponse-DetectorEntriesEntry) | repeated | | + + + + + + + + +### DetectorEntriesResponse.DetectorEntriesEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [DetectorInventoryResponse](#apricot-DetectorInventoryResponse) | | | + + + + + + + + +### DetectorInventoryResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| flps | [string](#string) | repeated | | + + + + + + + + +### DetectorResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| payload | [string](#string) | | | + + + + + + + + +### DetectorsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| getAll | [bool](#bool) | | if false(default) restricts "private" detectors (e.g. TRG) | + + + + + + + + +### DetectorsResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| detectors | [string](#string) | repeated | | + + + + + + + ### Empty @@ -146,7 +315,22 @@ - + + +### GetEntryRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | + + + + + + + ### GetRuntimeEntryRequest @@ -162,7 +346,67 @@ - + + +### HostEntriesResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hosts | [string](#string) | repeated | | + + + + + + + + +### HostGetRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| detector | [string](#string) | | | + + + + + + + + +### HostRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hostname | [string](#string) | | | + + + + + + + + +### HostsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hosts | [string](#string) | repeated | | + + + + + + + ### ImportComponentConfigurationRequest @@ -170,7 +414,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| query | [ComponentQuery](#apricot.ComponentQuery) | | | +| query | [ComponentQuery](#apricot-ComponentQuery) | | | | payload | [string](#string) | | | | newComponent | [bool](#bool) | | | | useVersioning | [bool](#bool) | | | @@ -180,7 +424,7 @@ - + ### ImportComponentConfigurationResponse @@ -197,7 +441,7 @@ - + ### ListComponentEntriesRequest @@ -206,7 +450,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | path | [string](#string) | | | -| query | [ComponentEntriesQuery](#apricot.ComponentEntriesQuery) | | | +| query | [ComponentEntriesQuery](#apricot-ComponentEntriesQuery) | | | | includeTimestamps | [bool](#bool) | | | @@ -214,7 +458,22 @@ - + + +### ListRuntimeEntriesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | + + + + + + + ### RawGetRecursiveRequest @@ -229,7 +488,7 @@ - + ### RunNumberResponse @@ -244,7 +503,7 @@ - + ### SetRuntimeEntryRequest @@ -261,7 +520,7 @@ - + ### StringMap @@ -269,14 +528,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| stringMap | [StringMap.StringMapEntry](#apricot.StringMap.StringMapEntry) | repeated | | +| stringMap | [StringMap.StringMapEntry](#apricot-StringMap-StringMapEntry) | repeated | | - + ### StringMap.StringMapEntry @@ -294,7 +553,7 @@ - + ### RunType @@ -302,13 +561,25 @@ | Name | Number | Description | | ---- | ------ | ----------- | | NULL | 0 | | -| ANY | 1 | | -| PHYSICS | 2 | | -| TECHNICAL | 3 | | -| COSMIC | 4 | | -| PEDESTAL | 5 | | -| THRESHOLD_SCAN | 6 | | -| CALIBRATION | 7 | | +| PHYSICS | 1 | | +| TECHNICAL | 2 | | +| PEDESTAL | 3 | | +| PULSER | 4 | | +| LASER | 5 | | +| CALIBRATION_ITHR_TUNING | 6 | | +| CALIBRATION_VCASN_TUNING | 7 | | +| CALIBRATION_THR_SCAN | 8 | | +| CALIBRATION_DIGITAL_SCAN | 9 | | +| CALIBRATION_ANALOG_SCAN | 10 | | +| CALIBRATION_FHR | 11 | | +| CALIBRATION_ALPIDE_SCAN | 12 | | +| CALIBRATION | 13 | | +| COSMICS | 14 | | +| SYNTHETIC | 15 | | +| NOISE | 16 | | +| CALIBRATION_PULSE_LENGTH | 17 | | +| CALIBRATION_VRESETD | 18 | | +| ANY | 300 | | @@ -316,24 +587,34 @@ - + ### Apricot | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| NewRunNumber | [Empty](#apricot.Empty) | [RunNumberResponse](#apricot.RunNumberResponse) | | -| GetDefaults | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | -| GetVars | [Empty](#apricot.Empty) | [StringMap](#apricot.StringMap) | | -| RawGetRecursive | [RawGetRecursiveRequest](#apricot.RawGetRecursiveRequest) | [ComponentResponse](#apricot.ComponentResponse) | | -| GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot.GetRuntimeEntryRequest) | [ComponentResponse](#apricot.ComponentResponse) | | -| SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot.SetRuntimeEntryRequest) | [Empty](#apricot.Empty) | | -| ListComponents | [Empty](#apricot.Empty) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | -| ListComponentEntries | [ListComponentEntriesRequest](#apricot.ListComponentEntriesRequest) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | -| ListComponentEntryHistory | [ComponentQuery](#apricot.ComponentQuery) | [ComponentEntriesResponse](#apricot.ComponentEntriesResponse) | | -| GetComponentConfiguration | [ComponentRequest](#apricot.ComponentRequest) | [ComponentResponse](#apricot.ComponentResponse) | | -| ImportComponentConfiguration | [ImportComponentConfigurationRequest](#apricot.ImportComponentConfigurationRequest) | [ImportComponentConfigurationResponse](#apricot.ImportComponentConfigurationResponse) | | +| NewRunNumber | [Empty](#apricot-Empty) | [RunNumberResponse](#apricot-RunNumberResponse) | | +| GetDefaults | [Empty](#apricot-Empty) | [StringMap](#apricot-StringMap) | | +| GetVars | [Empty](#apricot-Empty) | [StringMap](#apricot-StringMap) | | +| RawGetRecursive | [RawGetRecursiveRequest](#apricot-RawGetRecursiveRequest) | [ComponentResponse](#apricot-ComponentResponse) | | +| ListDetectors | [DetectorsRequest](#apricot-DetectorsRequest) | [DetectorsResponse](#apricot-DetectorsResponse) | Detectors and host inventories | +| GetHostInventory | [HostGetRequest](#apricot-HostGetRequest) | [HostEntriesResponse](#apricot-HostEntriesResponse) | | +| GetDetectorsInventory | [Empty](#apricot-Empty) | [DetectorEntriesResponse](#apricot-DetectorEntriesResponse) | | +| GetDetectorForHost | [HostRequest](#apricot-HostRequest) | [DetectorResponse](#apricot-DetectorResponse) | | +| GetDetectorsForHosts | [HostsRequest](#apricot-HostsRequest) | [DetectorsResponse](#apricot-DetectorsResponse) | | +| GetCRUCardsForHost | [HostRequest](#apricot-HostRequest) | [CRUCardsResponse](#apricot-CRUCardsResponse) | | +| GetEndpointsForCRUCard | [CardRequest](#apricot-CardRequest) | [CRUCardEndpointResponse](#apricot-CRUCardEndpointResponse) | | +| GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot-GetRuntimeEntryRequest) | [ComponentResponse](#apricot-ComponentResponse) | Runtime KV calls | +| SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot-SetRuntimeEntryRequest) | [Empty](#apricot-Empty) | | +| ListRuntimeEntries | [ListRuntimeEntriesRequest](#apricot-ListRuntimeEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | +| ListComponents | [Empty](#apricot-Empty) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | Component configuration calls | +| ListComponentEntries | [ListComponentEntriesRequest](#apricot-ListComponentEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | +| ListComponentEntryHistory | [ComponentQuery](#apricot-ComponentQuery) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | +| GetComponentConfiguration | [ComponentRequest](#apricot-ComponentRequest) | [ComponentResponse](#apricot-ComponentResponse) | | +| GetComponentConfigurationWithLastIndex | [ComponentRequest](#apricot-ComponentRequest) | [ComponentResponseWithLastIndex](#apricot-ComponentResponseWithLastIndex) | | +| ResolveComponentQuery | [ComponentQuery](#apricot-ComponentQuery) | [ComponentQuery](#apricot-ComponentQuery) | | +| ImportComponentConfiguration | [ImportComponentConfigurationRequest](#apricot-ImportComponentConfigurationRequest) | [ImportComponentConfigurationResponse](#apricot-ImportComponentConfigurationResponse) | | diff --git a/docs/apidocs_occ.md b/docs/apidocs_occ.md index 7c9ad0c51..d9a5fc461 100644 --- a/docs/apidocs_occ.md +++ b/docs/apidocs_occ.md @@ -3,36 +3,36 @@ ## Table of Contents -- [occ.proto](#occ.proto) - - [ConfigEntry](#occ_pb.ConfigEntry) - - [DeviceEvent](#occ_pb.DeviceEvent) - - [EventStreamReply](#occ_pb.EventStreamReply) - - [EventStreamRequest](#occ_pb.EventStreamRequest) - - [GetStateReply](#occ_pb.GetStateReply) - - [GetStateRequest](#occ_pb.GetStateRequest) - - [StateStreamReply](#occ_pb.StateStreamReply) - - [StateStreamRequest](#occ_pb.StateStreamRequest) - - [TransitionReply](#occ_pb.TransitionReply) - - [TransitionRequest](#occ_pb.TransitionRequest) +- [occ.proto](#occ-proto) + - [ConfigEntry](#occ_pb-ConfigEntry) + - [DeviceEvent](#occ_pb-DeviceEvent) + - [EventStreamReply](#occ_pb-EventStreamReply) + - [EventStreamRequest](#occ_pb-EventStreamRequest) + - [GetStateReply](#occ_pb-GetStateReply) + - [GetStateRequest](#occ_pb-GetStateRequest) + - [StateStreamReply](#occ_pb-StateStreamReply) + - [StateStreamRequest](#occ_pb-StateStreamRequest) + - [TransitionReply](#occ_pb-TransitionReply) + - [TransitionRequest](#occ_pb-TransitionRequest) - - [DeviceEventType](#occ_pb.DeviceEventType) - - [StateChangeTrigger](#occ_pb.StateChangeTrigger) - - [StateType](#occ_pb.StateType) + - [DeviceEventType](#occ_pb-DeviceEventType) + - [StateChangeTrigger](#occ_pb-StateChangeTrigger) + - [StateType](#occ_pb-StateType) - - [Occ](#occ_pb.Occ) + - [Occ](#occ_pb-Occ) - [Scalar Value Types](#scalar-value-types) - +

Top

## occ.proto - + ### ConfigEntry @@ -48,7 +48,7 @@ - + ### DeviceEvent @@ -56,14 +56,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | [DeviceEventType](#occ_pb.DeviceEventType) | | | +| type | [DeviceEventType](#occ_pb-DeviceEventType) | | | - + ### EventStreamReply @@ -71,14 +71,14 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| event | [DeviceEvent](#occ_pb.DeviceEvent) | | | +| event | [DeviceEvent](#occ_pb-DeviceEvent) | | | - + ### EventStreamRequest @@ -88,7 +88,7 @@ - + ### GetStateReply @@ -104,7 +104,7 @@ - + ### GetStateRequest @@ -114,7 +114,7 @@ - + ### StateStreamReply @@ -122,7 +122,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| type | [StateType](#occ_pb.StateType) | | | +| type | [StateType](#occ_pb-StateType) | | | | state | [string](#string) | | | @@ -130,7 +130,7 @@ - + ### StateStreamRequest @@ -140,7 +140,7 @@ - + ### TransitionReply @@ -148,7 +148,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| trigger | [StateChangeTrigger](#occ_pb.StateChangeTrigger) | | | +| trigger | [StateChangeTrigger](#occ_pb-StateChangeTrigger) | | | | state | [string](#string) | | | | transitionEvent | [string](#string) | | | | ok | [bool](#bool) | | | @@ -158,7 +158,7 @@ - + ### TransitionRequest @@ -168,7 +168,7 @@ | ----- | ---- | ----- | ----------- | | srcState | [string](#string) | | | | transitionEvent | [string](#string) | | | -| arguments | [ConfigEntry](#occ_pb.ConfigEntry) | repeated | | +| arguments | [ConfigEntry](#occ_pb-ConfigEntry) | repeated | | @@ -177,7 +177,7 @@ - + ### DeviceEventType @@ -187,10 +187,11 @@ | NULL_DEVICE_EVENT | 0 | | | END_OF_STREAM | 1 | | | BASIC_TASK_TERMINATED | 2 | | +| TASK_INTERNAL_ERROR | 3 | | - + ### StateChangeTrigger @@ -203,7 +204,7 @@ - + ### StateType @@ -219,17 +220,17 @@ - + ### Occ | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| EventStream | [EventStreamRequest](#occ_pb.EventStreamRequest) | [EventStreamReply](#occ_pb.EventStreamReply) stream | We have to have a notification stream because the FairMQDevice might transition on its own for whatever reason. | -| StateStream | [StateStreamRequest](#occ_pb.StateStreamRequest) | [StateStreamReply](#occ_pb.StateStreamReply) stream | | -| GetState | [GetStateRequest](#occ_pb.GetStateRequest) | [GetStateReply](#occ_pb.GetStateReply) | | -| Transition | [TransitionRequest](#occ_pb.TransitionRequest) | [TransitionReply](#occ_pb.TransitionReply) | | +| EventStream | [EventStreamRequest](#occ_pb-EventStreamRequest) | [EventStreamReply](#occ_pb-EventStreamReply) stream | We have to have a notification stream because the FairMQDevice might transition on its own for whatever reason. | +| StateStream | [StateStreamRequest](#occ_pb-StateStreamRequest) | [StateStreamReply](#occ_pb-StateStreamReply) stream | | +| GetState | [GetStateRequest](#occ_pb-GetStateRequest) | [GetStateReply](#occ_pb-GetStateReply) | | +| Transition | [TransitionRequest](#occ_pb-TransitionRequest) | [TransitionReply](#occ_pb-TransitionReply) | | From 0609c2fc59bab9682d3c8e49f942a2354f073bd3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Aug 2023 16:16:20 +0200 Subject: [PATCH 1711/2352] [core] Implement GetEnvironmentsShortData for all plugins --- core/integration/bookkeeping/plugin.go | 4 ++++ core/integration/ccdb/plugin.go | 4 ++++ core/integration/dcs/plugin.go | 4 ++++ core/integration/ddsched/plugin.go | 4 ++++ core/integration/kafka/plugin.go | 4 ++++ core/integration/odc/plugin.go | 31 ++++++++++++++++++++++++++ core/integration/plugin.go | 22 ++++++++++++++++++ core/integration/testplugin/plugin.go | 4 ++++ core/integration/trg/plugin.go | 4 ++++ 9 files changed, 81 insertions(+) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index a8c47949c..afa6541af 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -287,6 +287,10 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return out } +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + return p.GetEnvironmentsData(envIds) +} + /*************************************/ // Initialize the Bookkeeping client // /*************************************/ diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 30fef1ab2..06322b946 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -325,6 +325,10 @@ func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { return nil } +func (p *Plugin) GetEnvironmentsShortData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) Init(instanceId string) error { return nil } diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 69d834f7f..b73a10de9 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -129,6 +129,10 @@ func (p *Plugin) GetEnvironmentsData(environmentIds []uid.ID) map[uid.ID]string return out } +func (p *Plugin) GetEnvironmentsShortData(environmentIds []uid.ID) map[uid.ID]string { + return p.GetEnvironmentsData(environmentIds) +} + func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]string { out := make(map[uid.ID]string) for _, envId := range envIds { diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 09d7545cb..2510172f4 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -150,6 +150,10 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return partitionInfosOut } +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + return p.GetEnvironmentsData(envIds) +} + func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]map[string]string { partitionStates := make(map[uid.ID]map[string]string) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 7cd1b230b..8a0e1bb33 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -100,6 +100,10 @@ func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { return nil } +func (p *Plugin) GetEnvironmentsShortData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) FSMEnterStateTopic(state string) string { return "aliecs.env_state." + state } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 3fae4191e..2f38cf5d8 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -332,6 +332,37 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return out } +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + if p == nil || p.odcClient == nil { + return nil + } + + p.cachedStatusMu.RLock() + defer p.cachedStatusMu.RUnlock() + + if p.cachedStatus == nil { + return nil + } + + out := make(map[uid.ID]string) + for _, id := range envIds { + partitionInfo, ok := p.cachedStatus.Partitions[id] + if !ok { + continue + } + + partitionInfo.Devices = nil // don't return the full devices payload + + partitionInfoOut, err := json.Marshal(partitionInfo) + if err != nil { + continue + } + out[id] = string(partitionInfoOut[:]) + } + + return out +} + func getFlpIdList(varStack map[string]string) (flps []string, err error) { payload, ok := varStack["hosts"] if !ok { diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 42bd747dc..faced79b7 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -52,6 +52,7 @@ type Plugin interface { GetConnectionState() string GetData(argv []any) string GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string + GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string Init(instanceId string) error CallStack(data interface{}) map[string]interface{} // used in hook call context @@ -161,6 +162,27 @@ func (p Plugins) GetEnvironmentsData(envIds []uid.ID) (data map[uid.ID]map[strin return } +func (p Plugins) GetEnvironmentsShortData(envIds []uid.ID) (data map[uid.ID]map[string]string) { + data = make(map[uid.ID]map[string]string) + + // First we query each plugin for environment data of all envIds at once + pluginEnvData := make(map[ /*plugin*/ string]map[uid.ID]string) + for _, plugin := range p { + pluginEnvData[plugin.GetName()] = plugin.GetEnvironmentsShortData(envIds) + } + + // Then we invert the nested map to get a map of envId -> plugin -> data + for _, plugin := range p { + for envId, pluginData := range pluginEnvData[plugin.GetName()] { + if _, ok := data[envId]; !ok { + data[envId] = make(map[string]string) + } + data[envId][plugin.GetName()] = pluginData + } + } + return +} + func PluginsInstance() Plugins { once.Do(func() { instance = Plugins{} diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 0ab2ab4ba..3a8fb71f2 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -77,6 +77,10 @@ func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { return nil } +func (p *Plugin) GetEnvironmentsShortData(_ []uid.ID) map[uid.ID]string { + return nil +} + func (p *Plugin) Init(_ string) error { log.Debug("Test plugin initialized") return nil diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index ac06b1673..a7bdd4343 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -236,6 +236,10 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { return out } +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + return p.GetEnvironmentsData(envIds) +} + func (p *Plugin) Init(instanceId string) error { if p.trgClient == nil { callTimeout := TRG_DIAL_TIMEOUT From 7cf0bf8756ad8fa197d67b7774f3c7d70db9200f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Aug 2023 16:16:33 +0200 Subject: [PATCH 1712/2352] [core] Only return short data in GetEnvironments to keep response small --- core/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 8bf636a10..118ce9288 100644 --- a/core/server.go +++ b/core/server.go @@ -230,7 +230,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm } // Get plugin-provided environment data for all envs - integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData(m.state.environments.Ids()) + integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsShortData(m.state.environments.Ids()) // Get all environments for _, id := range m.state.environments.Ids() { From 7c9011ed32a2e57f325da48d7362b2c6ee80ea27 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Aug 2023 16:36:04 +0200 Subject: [PATCH 1713/2352] [build] Bump to v0.79.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a2bcde72c..027689e3d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 78 +VERSION_MINOR := 79 VERSION_PATCH := 0 From ac9507f6d0fa2ea890a2fa8784df041bf1b1f750 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 31 Aug 2023 10:53:36 +0200 Subject: [PATCH 1714/2352] [core] Print a fatal message to IL if ODC went to error --- core/environment/manager.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 344abf595..e8b26af27 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -661,6 +661,10 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve Debug("received ODC_PARTITION_STATE_CHANGE event from ODC, trying to stop the run") if env.CurrentState() == "RUNNING" { go func() { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Log(logrus.FatalLevel, "ODC partition state changed to ERROR, the current run will be stopped") + err = env.TryTransition(NewStopActivityTransition(envs.taskman)) if err != nil { log.WithPrefix("scheduler"). From 671e11ed808a2a900ba0beceefc242918e535658 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 31 Aug 2023 15:51:46 +0200 Subject: [PATCH 1715/2352] [core] Declare current transition DESTROY if tearing down env --- core/environment/manager.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index e8b26af27..a820287ff 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -413,6 +413,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } + env.currentTransition = "DESTROY" + err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) if err != nil { log.WithFields(logrus.Fields{ From e6171dba951ae086bacb03d3c8fabf9c428fd073 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Sep 2023 11:43:57 +0200 Subject: [PATCH 1716/2352] [core] Add active/inactive task counts to proto --- coconut/protos/o2control.pb.go | 1227 ++++++++++++++------------- coconut/protos/o2control_grpc.pb.go | 2 +- core/protos/o2control.pb.go | 1227 ++++++++++++++------------- core/protos/o2control.proto | 2 + core/protos/o2control_grpc.pb.go | 2 +- 5 files changed, 1254 insertions(+), 1206 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 39726c66e..8ab791262 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc v4.23.4 // source: protos/o2control.proto package pb @@ -1392,6 +1392,8 @@ type EnvironmentInfo struct { IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` CurrentTransition string `protobuf:"bytes,16,opt,name=currentTransition,proto3" json:"currentTransition,omitempty"` + NumberOfActiveTasks int32 `protobuf:"varint,17,opt,name=numberOfActiveTasks,proto3" json:"numberOfActiveTasks,omitempty"` + NumberOfInactiveTasks int32 `protobuf:"varint,18,opt,name=numberOfInactiveTasks,proto3" json:"numberOfInactiveTasks,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1538,6 +1540,20 @@ func (x *EnvironmentInfo) GetCurrentTransition() string { return "" } +func (x *EnvironmentInfo) GetNumberOfActiveTasks() int32 { + if x != nil { + return x.NumberOfActiveTasks + } + return 0 +} + +func (x *EnvironmentInfo) GetNumberOfInactiveTasks() int32 { + if x != nil { + return x.NumberOfInactiveTasks + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4820,7 +4836,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xf3, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4867,622 +4883,629 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, + 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, - 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, - 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, + 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, + 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, + 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, - 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, - 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, - 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, - 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, + 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, + 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, + 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, + 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, - 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, - 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, - 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, + 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, + 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, - 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, - 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, - 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, - 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, - 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, - 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, + 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, + 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, + 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, + 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, + 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, + 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, + 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, + 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, + 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, + 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, + 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, + 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, + 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index a959303f2..0ece9cea9 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc v4.23.4 // source: protos/o2control.proto package pb diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 39726c66e..8ab791262 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc v4.23.4 // source: protos/o2control.proto package pb @@ -1392,6 +1392,8 @@ type EnvironmentInfo struct { IntegratedServicesData map[string]string `protobuf:"bytes,14,rep,name=integratedServicesData,proto3" json:"integratedServicesData,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` NumberOfTasks int32 `protobuf:"varint,15,opt,name=numberOfTasks,proto3" json:"numberOfTasks,omitempty"` CurrentTransition string `protobuf:"bytes,16,opt,name=currentTransition,proto3" json:"currentTransition,omitempty"` + NumberOfActiveTasks int32 `protobuf:"varint,17,opt,name=numberOfActiveTasks,proto3" json:"numberOfActiveTasks,omitempty"` + NumberOfInactiveTasks int32 `protobuf:"varint,18,opt,name=numberOfInactiveTasks,proto3" json:"numberOfInactiveTasks,omitempty"` } func (x *EnvironmentInfo) Reset() { @@ -1538,6 +1540,20 @@ func (x *EnvironmentInfo) GetCurrentTransition() string { return "" } +func (x *EnvironmentInfo) GetNumberOfActiveTasks() int32 { + if x != nil { + return x.NumberOfActiveTasks + } + return 0 +} + +func (x *EnvironmentInfo) GetNumberOfInactiveTasks() int32 { + if x != nil { + return x.NumberOfInactiveTasks + } + return 0 +} + type NewEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4820,7 +4836,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xf3, 0x07, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, @@ -4867,622 +4883,629 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, + 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, - 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, - 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, + 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, + 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, + 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, + 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, + 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, - 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, - 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, - 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, - 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, - 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, - 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, - 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, - 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, - 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, - 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, - 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, - 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, - 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, - 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, - 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, - 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, - 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, + 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, + 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, + 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, + 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, + 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, + 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, + 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, - 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, - 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, - 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, - 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, - 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, - 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, - 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, - 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, - 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, + 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, + 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, + 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, - 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, - 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, - 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, - 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, - 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, - 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, - 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, - 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, - 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, - 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, - 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, - 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, - 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, - 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, - 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, - 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, - 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, - 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, + 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, - 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, + 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, + 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, + 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, + 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, + 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, + 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, + 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, + 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, + 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, + 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, + 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, + 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, + 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, - 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, + 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, + 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, + 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, + 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, + 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, + 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, + 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 3eaf8e9b2..b575da220 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -191,6 +191,8 @@ message EnvironmentInfo { map integratedServicesData = 14; int32 numberOfTasks = 15; string currentTransition = 16; + int32 numberOfActiveTasks = 17; + int32 numberOfInactiveTasks = 18; } message NewEnvironmentRequest { diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 1964f19f5..884a14e1a 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc v4.23.4 // source: protos/o2control.proto package pb From ecd3c8157a43d182a0b96bd8738a08561e633b7f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Sep 2023 11:46:55 +0200 Subject: [PATCH 1717/2352] [core] Return number of active/inactive tasks in env requests --- core/server.go | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/core/server.go b/core/server.go index 118ce9288..8af39d1e6 100644 --- a/core/server.go +++ b/core/server.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/repos/varsource" + "github.com/AliceO2Group/Control/core/workflow" "github.com/jinzhu/copier" "github.com/spf13/viper" "google.golang.org/grpc/codes" @@ -274,6 +275,26 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm NumberOfTasks: int32(len(tasks)), IntegratedServicesData: isEnvData, CurrentTransition: env.CurrentTransition(), + NumberOfActiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return false + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() == task.ACTIVE + } + return false + }))), + NumberOfInactiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return true // if task has no parent, we treat it as inactive + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() != task.ACTIVE + } + return false + }))), } if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) @@ -385,6 +406,26 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme IncludedDetectors: newEnv.GetActiveDetectors().StringList(), IntegratedServicesData: isEnvData, CurrentTransition: newEnv.CurrentTransition(), + NumberOfActiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return false + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() == task.ACTIVE + } + return false + }))), + NumberOfInactiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return true // if task has no parent, we treat it as inactive + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() != task.ACTIVE + } + return false + }))), } reply = &pb.NewEnvironmentReply{ Environment: ei, @@ -444,6 +485,26 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe NumberOfHosts: int32(len(env.GetAllHosts())), IntegratedServicesData: isEnvData, CurrentTransition: env.CurrentTransition(), + NumberOfActiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return false + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() == task.ACTIVE + } + return false + }))), + NumberOfInactiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { + parent := t.GetParentRole() + if parent == nil { + return true // if task has no parent, we treat it as inactive + } + if parentRole, ok := parent.(workflow.Role); ok { + return parentRole.GetStatus() != task.ACTIVE + } + return false + }))), }, Public: env.Public, } From fb2e8912bb12ba1b7568247ae8d26f1ff2168622 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Sep 2023 11:49:02 +0200 Subject: [PATCH 1718/2352] [coconut] Display number of active/inactive/total tasks in env --- coconut/control/control.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/coconut/control/control.go b/coconut/control/control.go index b6b735275..5dc0768c7 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -434,6 +434,9 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C _, _ = fmt.Fprintf(o, "description: %s\n", env.GetDescription()) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) _, _ = fmt.Fprintf(o, "public: %v\n", response.Public) + _, _ = fmt.Fprintf(o, "tasks active: %v\n", env.GetNumberOfActiveTasks()) + _, _ = fmt.Fprintf(o, "tasks inactive: %v\n", env.GetNumberOfInactiveTasks()) + _, _ = fmt.Fprintf(o, "tasks total: %v\n", env.GetNumberOfTasks()) var ( defaultsStr = stringMapToString(env.Defaults, "\t") From 7983231deed722122d4b7b06c99a89a1686f5d9e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Sep 2023 11:55:39 +0200 Subject: [PATCH 1719/2352] [build] Bump to v0.80.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 027689e3d..426849055 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 79 +VERSION_MINOR := 80 VERSION_PATCH := 0 From a3381bac932c192fdb692c8d7a73985e7de657d4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 4 Sep 2023 17:26:53 +0200 Subject: [PATCH 1720/2352] [core] Fix counters and string building issue in TasksDeploymentError --- core/task/errors.go | 42 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/core/task/errors.go b/core/task/errors.go index 10bc5ea6e..c813b889c 100644 --- a/core/task/errors.go +++ b/core/task/errors.go @@ -84,7 +84,47 @@ type TasksDeploymentError struct { } func (r TasksDeploymentError) Error() string { - return fmt.Sprintf("deployment failed for %d critical tasks, and %d non-critical tasks; critical tasks: [%s]; non-critical tasks: [%s]", len(r.failedCriticalDescriptors), len(r.failedNonCriticalDescriptors), r.failedCriticalDescriptors.String(), r.failedNonCriticalDescriptors.String()) + failedCritCount := len(r.failedCriticalDescriptors) + failedNonCritCount := len(r.failedNonCriticalDescriptors) + undepCritCount := len(r.undeployableCriticalDescriptors) + undepNonCritCount := len(r.undeployableNonCriticalDescriptors) + + failedCritStr := fmt.Sprintf("%d failed [%s]", failedCritCount, r.failedCriticalDescriptors.String()) + undepCritStr := fmt.Sprintf("%d undeployable [%s]", undepCritCount, r.undeployableCriticalDescriptors.String()) + + failedNonCritStr := fmt.Sprintf("%d failed [%s]", failedNonCritCount, r.failedNonCriticalDescriptors.String()) + undepNonCritStr := fmt.Sprintf("%d undeployable [%s]", undepNonCritCount, r.undeployableNonCriticalDescriptors.String()) + + if failedCritCount == 0 { + failedCritStr = "0 failed" + } + if undepCritCount == 0 { + undepCritStr = "0 undeployable" + } + + if failedNonCritCount == 0 { + failedNonCritStr = "0 failed" + } + if undepNonCritCount == 0 { + undepNonCritStr = "0 undeployable" + } + + critStr := fmt.Sprintf("%s, %s", failedCritStr, undepCritStr) + nonCritStr := fmt.Sprintf("%s, %s", failedNonCritStr, undepNonCritStr) + + totalCritCount := failedCritCount + undepCritCount + totalNonCritCount := failedNonCritCount + undepNonCritCount + + total := totalCritCount + totalNonCritCount + + return fmt.Sprintf( + "deployment failed for %d tasks: %d critical (%s), %d non-critical (%s)", + total, + totalCritCount, + critStr, + totalNonCritCount, + nonCritStr, + ) } type TaskAlreadyReleasedError taskErrorBase From c31631524d9d347fe6f4475acb7f30787608e7b5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 5 Sep 2023 17:11:35 +0200 Subject: [PATCH 1721/2352] [build] Bump to v0.81.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 426849055..18035d6c8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 80 +VERSION_MINOR := 81 VERSION_PATCH := 0 From cb780fa9afde8705ef18e3201eb30b62330eb846 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Oct 2023 09:27:46 +0200 Subject: [PATCH 1722/2352] [core] Fix crash in executor/agent failed handler in task manager --- core/task/manager.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index be7d2ff2b..bf43bfabd 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1228,7 +1228,10 @@ func (m *Manager) HandleExecutorFailed(e *event.ExecutorFailedEvent) map[uid.ID] go func() { m.updateTaskState(thisTask.taskId, "ERROR") thisTask.status = INACTIVE - thisTask.GetParent().UpdateStatus(INACTIVE) + taskParent := thisTask.GetParent() + if taskParent != nil { + thisTask.GetParent().UpdateStatus(INACTIVE) + } }() } return envIdsForExecutor From 0755858a19e60fff9d61ab3cae9614af787c16ea Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Oct 2023 09:49:06 +0200 Subject: [PATCH 1723/2352] [build] Bump to v0.81.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 18035d6c8..a2144ccc7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 81 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From d44aceae5d984cd69e3a044110573c9b4aa4d39c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 Oct 2023 12:07:53 +0200 Subject: [PATCH 1724/2352] [executor] Prevent crash on nil RPC connection --- executor/executorcmd/client.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 5b6e38a6a..ae400c501 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -127,7 +127,10 @@ type RpcClient struct { } func (r *RpcClient) Close() error { - return r.conn.Close() + if r != nil && r.conn != nil { + return r.conn.Close() + } + return nil } func (r *RpcClient) FromDeviceState(state string) string { From 58352296a42cc167cf77fcabea838789e2590036 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 Oct 2023 12:08:38 +0200 Subject: [PATCH 1725/2352] [executor] Prevent crash on bad incoming message --- executor/handlers.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/executor/handlers.go b/executor/handlers.go index d1b5114ab..4ad30f269 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -180,11 +180,17 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { var cmd *executorcmd.ExecutorCommand_Transition cmd, err = activeTask.UnmarshalTransition(data) if err != nil { - log.WithFields(logrus.Fields{ - "name": cmd.Name, - "message": string(data[:]), - "error": err.Error(), - }). + fields := logrus.Fields{ + "error": err.Error(), + } + if cmd != nil { + fields["name"] = cmd.Name + } + if len(data) > 0 { + fields["message"] = string(data[:]) + } + + log.WithFields(fields). Error("cannot unmarshal incoming MESSAGE") return } From 09f433feb7e3e8c1e5c00acdf02e612bb61b0188 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 6 Oct 2023 12:09:13 +0200 Subject: [PATCH 1726/2352] [build] Bump to v0.81.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a2144ccc7..261eec913 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 81 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 20db518a70f43cb1dbba1656f74515e2b466d203 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Oct 2023 13:02:14 +0200 Subject: [PATCH 1727/2352] [executor] Keep executor alive even with no tasks --- executor/eventloop.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/executor/eventloop.go b/executor/eventloop.go index 54f2d409d..3c19ed251 100644 --- a/executor/eventloop.go +++ b/executor/eventloop.go @@ -100,7 +100,8 @@ func sendFailedTasks(state *internalState) { delete(state.failedTasks, taskID) // If there aren't any failed and active tasks, we request to shutdown the executor. if len(state.failedTasks) == 0 && len(state.activeTasks) == 0 { - state.shouldQuit = true + //Originally state.shouldQuit = true but we want to keep the executor running + log.WithField("executorId", state.executor.ExecutorID).Info("task failure notified, no tasks present on executor") } } } From b65b93c8fae9457ab74eb25f53c5eb621c25529e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Oct 2023 13:03:08 +0200 Subject: [PATCH 1728/2352] [build] Bump to v0.82.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 261eec913..7387dd427 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 81 -VERSION_PATCH := 2 +VERSION_MINOR := 82 +VERSION_PATCH := 0 From 8dbba2c7a064321e8da09a849c6afbb45000e3fd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Oct 2023 09:29:09 +0200 Subject: [PATCH 1729/2352] [core] Double max inbound ODC message size to 32MB --- core/integration/odc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2f38cf5d8..a787b14f2 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -64,7 +64,7 @@ const ( ODC_PADDING_TIMEOUT = 3 * time.Second ODC_STATUS_TIMEOUT = 3 * time.Second ODC_POLLING_INTERVAL = 3 * time.Second - ODC_MAX_INBOUND_MESSAGE_SIZE = 16 * 1024 * 1024 // 16 MiB + ODC_MAX_INBOUND_MESSAGE_SIZE = 32 * 1024 * 1024 // 16 MiB ) type Plugin struct { From ca12009bffdc8e3c88aab9e4f69ea221dc7a311b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 13 Oct 2023 09:29:53 +0200 Subject: [PATCH 1730/2352] [build] Bump to v0.82.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7387dd427..34007459f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 82 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 151c3f380ba70c4ba853a27804275f16824dbab8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Oct 2023 15:40:33 +0200 Subject: [PATCH 1731/2352] [common] Protect stringmap operations with rwmutex --- common/gera/stringmap.go | 41 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 89359c70a..17d7752cb 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -25,6 +25,8 @@ package gera import ( + "sync" + "github.com/imdario/mergo" "gopkg.in/yaml.v3" ) @@ -46,8 +48,9 @@ type StringMap interface { FlattenedParent() (map[string]string, error) WrappedAndFlattened(m StringMap) (map[string]string, error) - Raw() map[string]string + Raw() map[string]string Copy() StringMap + RawCopy() map[string]string } func MakeStringMap() *StringWrapMap { @@ -92,6 +95,7 @@ func MakeStringMapWithMapCopy(fromMap map[string]string) *StringWrapMap { type StringWrapMap struct { theMap map[string]string parent StringMap + mu sync.RWMutex } func (w *StringWrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { @@ -170,6 +174,10 @@ func (w *StringWrapMap) Get(key string) (value string, ok bool) { if w == nil || w.theMap == nil { return "", false } + + w.mu.RLock() + defer w.mu.RUnlock() + if val, ok := w.theMap[key]; ok { return val, true } @@ -183,6 +191,10 @@ func (w *StringWrapMap) Set(key string, value string) (ok bool) { if w == nil || w.theMap == nil { return false } + + w.mu.Lock() + defer w.mu.Unlock() + w.theMap[key] = value return true } @@ -191,6 +203,10 @@ func (w *StringWrapMap) Del(key string) (ok bool) { if w == nil || w.theMap == nil { return false } + + w.mu.Lock() + defer w.mu.Unlock() + if _, exists := w.theMap[key]; exists { delete(w.theMap, key) } @@ -218,6 +234,9 @@ func (w *StringWrapMap) Flattened() (map[string]string, error) { return nil, nil } + w.mu.RLock() + defer w.mu.RUnlock() + out := make(map[string]string) for k, v := range w.theMap { out[k] = v @@ -252,10 +271,15 @@ func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, err return nil, nil } + w.mu.RLock() + out := make(map[string]string) for k, v := range w.theMap { out[k] = v } + + w.mu.RUnlock() + if m == nil { return out, nil } @@ -269,7 +293,7 @@ func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, err return out, err } -func (w *StringWrapMap) Raw() map[string]string { +func (w *StringWrapMap) Raw() map[string]string { // allows unmutexed access to map, can be unsafe! if w == nil { return nil } @@ -280,12 +304,23 @@ func (w *StringWrapMap) Copy() StringMap { if w == nil { return nil } + + w.mu.RLock() + defer w.mu.RUnlock() + newMap := &StringWrapMap{ theMap: make(map[string]string, len(w.theMap)), parent: w.parent, } - for k,v := range w.theMap { + for k, v := range w.theMap { newMap.theMap[k] = v } return newMap } + +func (w *StringWrapMap) RawCopy() map[string]string { // always safe + if w == nil { + return nil + } + return w.Copy().Raw() +} From 9a9758c7875120a35634726a8eb7e967ccc59d24 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Oct 2023 15:41:25 +0200 Subject: [PATCH 1732/2352] [core] Restrict raw access to stringmap underlying structure --- core/server.go | 19 ++++++++++--------- core/serverutil.go | 6 +++--- core/task/task.go | 4 ++-- core/task/taskclass/class.go | 6 +++--- core/workflow/rolebase.go | 4 ++-- 5 files changed, 20 insertions(+), 19 deletions(-) diff --git a/core/server.go b/core/server.go index 8af39d1e6..c69eaad90 100644 --- a/core/server.go +++ b/core/server.go @@ -250,9 +250,10 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm var defaults, vars, userVars map[string]string defaults, vars, userVars, err = env.Workflow().ConsolidatedVarMaps() if err != nil { - defaults = env.GlobalDefaults.Raw() - vars = env.GlobalVars.Raw() - userVars = env.UserVars.Raw() + // take raw of copy, not raw of original because the actual varstack is mutex protected + defaults = env.GlobalDefaults.RawCopy() + vars = env.GlobalVars.RawCopy() + userVars = env.UserVars.RawCopy() } isEnvData, ok := integratedServicesEnvsData[id] @@ -378,9 +379,9 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme var defaults, vars, userVars map[string]string defaults, vars, userVars, err = newEnv.Workflow().ConsolidatedVarMaps() if err != nil { - defaults = newEnv.GlobalDefaults.Raw() - vars = newEnv.GlobalVars.Raw() - userVars = newEnv.UserVars.Raw() + defaults = newEnv.GlobalDefaults.RawCopy() + vars = newEnv.GlobalVars.RawCopy() + userVars = newEnv.UserVars.RawCopy() err = nil } @@ -459,9 +460,9 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe var defaults, vars, userVars map[string]string defaults, vars, userVars, err = env.Workflow().ConsolidatedVarMaps() if err != nil { - defaults = env.GlobalDefaults.Raw() - vars = env.GlobalVars.Raw() - userVars = env.UserVars.Raw() + defaults = env.GlobalDefaults.RawCopy() + vars = env.GlobalVars.RawCopy() + userVars = env.UserVars.RawCopy() } integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsData([]uid.ID{envId}) diff --git a/core/serverutil.go b/core/serverutil.go index 3eefb9aeb..e1647400f 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -182,9 +182,9 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { FullPath: root.GetPath(), TaskIds: tasksToTaskIds(root.GetTasks()), Roles: childRoleInfos, - Defaults: root.GetDefaults().Raw(), - Vars: root.GetVars().Raw(), - UserVars: root.GetUserVars().Raw(), + Defaults: root.GetDefaults().RawCopy(), + Vars: root.GetVars().RawCopy(), + UserVars: root.GetUserVars().RawCopy(), ConsolidatedStack: consolidatedVarStack, } return diff --git a/core/task/task.go b/core/task/task.go index 57c6b907a..7e328cf62 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -288,7 +288,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We make a copy of the Defaults/Vars maps from the taskClass, this is necessary because // entries may be templated, so they may resolve to different values in each task. - localDefaults := class.Defaults.Copy().Raw() + localDefaults := class.Defaults.RawCopy() // We resolve any template expressions in Defaults defaultFields := template.WrapMapItems(localDefaults) @@ -312,7 +312,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return fmt.Errorf("cannot fetch task class defaults for task command info: %w", err) } - localVars := class.Vars.Copy().Raw() + localVars := class.Vars.RawCopy() // We resolve any template expressions in Vars varFields := template.WrapMapItems(localVars) diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index f07f5182a..234ac06a6 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -144,9 +144,9 @@ func (c *Class) MarshalYAML() (interface{}, error) { aux := _class{ Name: c.Identifier.Name, - Defaults: c.Defaults.Raw(), - Vars: c.Vars.Raw(), - Properties: c.Properties.Raw(), + Defaults: c.Defaults.RawCopy(), + Vars: c.Vars.RawCopy(), + Properties: c.Properties.RawCopy(), Wants: c.Wants, Limits: c.Limits, Bind: c.Bind, diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 3d54ff5a8..b7e40452d 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -261,10 +261,10 @@ func (r *roleBase) MarshalYAML() (interface{}, error) { aux["constraints"] = r.Constraints } if r.Defaults.Raw() != nil { - aux["defaults"] = r.Defaults.Raw() + aux["defaults"] = r.Defaults.RawCopy() } if r.Vars.Raw() != nil { - aux["vars"] = r.Vars.Raw() + aux["vars"] = r.Vars.RawCopy() } if r.Bind != nil { aux["bind"] = r.Bind From 897ff907d067b1be3305a8cb36ab7a38bc75239e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 16 Oct 2023 15:46:23 +0200 Subject: [PATCH 1733/2352] [build] Bump to v0.82.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 34007459f..e6029b36e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 82 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 601396aeb72739136dc48961fe85480a4fba452e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 Nov 2023 16:47:09 +0100 Subject: [PATCH 1734/2352] [core] Only call ODC Shutdown is Run was previously called for this env --- core/integration/odc/plugin.go | 14 ++++++++++++++ core/workflow/callable/call.go | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a787b14f2..8a2bffcbf 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1041,6 +1041,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("odc_extract_topology_resources is set to true, plugin and resources will not be included in the ODC Run request") } + // right before making the call, we try to write it to the env's KV + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar("__odc_partitioninitialize_called", "true") + } + timeout := callable.AcquireTimeout(ODC_PARTITIONINITIALIZE_TIMEOUT, varStack, "PartitionInitialize", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -1184,6 +1190,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["PartitionTerminate"] = func() (out string) { // ODC Terminate + Shutdown + _, isPartitionInitializeCalled := varStack["__odc_partitioninitialize_called"] + if !isPartitionInitializeCalled { + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("call", "PartitionTerminate"). + Warn("PartitionInitialize was not called, skipping PartitionTerminate") + return + } timeout := callable.AcquireTimeout(ODC_PARTITIONTERMINATE_TIMEOUT, varStack, "PartitionTerminate", envId) callFailedStr := "EPN PartitionTerminate call failed" diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 9e26963ce..d30a40479 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -118,7 +118,7 @@ func (c *Call) Call() error { if err != nil { log.WithField("trigger", c.Traits.Trigger). WithField("partition", c.parentRole.GetEnvironmentId().String()). - Debug("could not instanciate varStack") + Debug("could not instantiate varStack") } c.VarStack["environment_id"] = c.parentRole.GetEnvironmentId().String() c.VarStack["__call_func"] = c.Func From a51363a7e3a04127e08c898a9f0cfd290332c3c3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Nov 2023 16:33:46 +0100 Subject: [PATCH 1735/2352] [core] Update DCS proto interface --- core/integration/dcs/protos/dcs.pb.go | 195 ++++++++++++--------- core/integration/dcs/protos/dcs.proto | 7 +- core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- 3 files changed, 115 insertions(+), 89 deletions(-) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index a88897fba..485b7e55d 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc v4.24.2 // source: protos/dcs.proto package dcspb @@ -54,7 +54,7 @@ const ( EventType_ACK_EVENT EventType = 4 EventType_SOR_EVENT EventType = 20 EventType_EOR_EVENT EventType = 30 - EventType_TIMEOUT EventType = 40 + EventType_EVENT_TIMEOUT EventType = 40 EventType_PFR_EVENT EventType = 50 ) @@ -68,7 +68,7 @@ var ( 4: "ACK_EVENT", 20: "SOR_EVENT", 30: "EOR_EVENT", - 40: "TIMEOUT", + 40: "EVENT_TIMEOUT", 50: "PFR_EVENT", } EventType_value = map[string]int32{ @@ -79,7 +79,7 @@ var ( "ACK_EVENT": 4, "SOR_EVENT": 20, "EOR_EVENT": 30, - "TIMEOUT": 40, + "EVENT_TIMEOUT": 40, "PFR_EVENT": 50, } ) @@ -225,6 +225,11 @@ const ( DetectorState_SOR_UNAVAILABLE DetectorState = 11 DetectorState_EOR_UNAVAILABLE DetectorState = 12 DetectorState_PREPARING DetectorState = 13 + DetectorState_SOR_AVAILABLE DetectorState = 14 + DetectorState_EOR_AVAILABLE DetectorState = 15 + DetectorState_PFR_AVAILABLE DetectorState = 16 + DetectorState_PFR_UNAVAILABLE DetectorState = 17 + DetectorState_TIMEOUT DetectorState = 18 ) // Enum value maps for DetectorState. @@ -244,6 +249,11 @@ var ( 11: "SOR_UNAVAILABLE", 12: "EOR_UNAVAILABLE", 13: "PREPARING", + 14: "SOR_AVAILABLE", + 15: "EOR_AVAILABLE", + 16: "PFR_AVAILABLE", + 17: "PFR_UNAVAILABLE", + 18: "TIMEOUT", } DetectorState_value = map[string]int32{ "NULL_STATE": 0, @@ -260,6 +270,11 @@ var ( "SOR_UNAVAILABLE": 11, "EOR_UNAVAILABLE": 12, "PREPARING": 13, + "SOR_AVAILABLE": 14, + "EOR_AVAILABLE": 15, + "PFR_AVAILABLE": 16, + "PFR_UNAVAILABLE": 17, + "TIMEOUT": 18, } ) @@ -1226,7 +1241,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, - 0x9c, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, + 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, @@ -1234,88 +1249,94 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x10, 0x1e, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, - 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, - 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, - 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, - 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, - 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, - 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, - 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, - 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, - 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, - 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, - 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, - 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, - 0x2a, 0xf2, 0x01, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, - 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, - 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, - 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, - 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, - 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, - 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, - 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, - 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, - 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, - 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, - 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, - 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, - 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, - 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, - 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, - 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, - 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, - 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, - 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, - 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, - 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, - 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, - 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, - 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, - 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, - 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, - 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, - 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x10, 0x1e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, + 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, + 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, + 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, + 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, + 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, + 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, + 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, + 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, + 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, + 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, + 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, + 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, + 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, + 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, + 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, + 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, + 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, + 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, + 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, + 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, + 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, + 0x0a, 0x0d, 0x45, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, + 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, + 0x45, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, + 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, + 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, + 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, + 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, + 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, + 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, + 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, + 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, + 0x59, 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, + 0x02, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, + 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, + 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, + 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, + 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, + 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, + 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, + 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, + 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index c3c0a9b99..84925ca30 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -202,7 +202,7 @@ enum EventType { ACK_EVENT = 4; SOR_EVENT = 20; EOR_EVENT = 30; - TIMEOUT = 40; + EVENT_TIMEOUT = 40; PFR_EVENT = 50; } @@ -243,6 +243,11 @@ enum DetectorState { SOR_UNAVAILABLE = 11; EOR_UNAVAILABLE = 12; PREPARING = 13; + SOR_AVAILABLE = 14; + EOR_AVAILABLE = 15; + PFR_AVAILABLE = 16; + PFR_UNAVAILABLE = 17; + TIMEOUT = 18; } enum RunType { diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index b15aa3f6d..1c8db1419 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc v4.24.2 // source: protos/dcs.proto package dcspb From fd7d48efeb72e60d0f6cb268a2665d89ff203d19 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 9 Nov 2023 16:34:14 +0100 Subject: [PATCH 1736/2352] [core] React to DCS detector TIMEOUT state --- core/integration/dcs/plugin.go | 74 ++++++++++++++++++++++++++++++++-- 1 file changed, 71 insertions(+), 3 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index b73a10de9..e624a1e9d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -456,7 +456,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s PFR failure event from DCS", ecsDet) + logErr := fmt.Errorf("%s PFR failure reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s PFR timeout reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -793,7 +815,30 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s SOR failure event from DCS", ecsDet) + logErr := fmt.Errorf("%s SOR failure reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s SOR timeout reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -1106,7 +1151,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s EOR failure event from DCS", ecsDet) + logErr := fmt.Errorf("%s EOR failure reported by DCS", ecsDet) if err != nil { if errors.Is(err, io.EOF) { err = fmt.Errorf("DCS EOR stream unexpectedly terminated from DCS side before completion: %w", err) @@ -1129,6 +1174,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s EOR timeout reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "EndOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { From 3e8163ffc98fe3298c767c8612c2e25ad643f938 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Nov 2023 11:50:48 +0100 Subject: [PATCH 1737/2352] [core] Expose DCS last known detector state matrix to GUI --- core/integration/dcs/plugin.go | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index e624a1e9d..8d8219429 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -61,6 +61,8 @@ type Plugin struct { dcsClient *RpcClient pendingEORs map[string] /*envId*/ int64 + + detectorMatrix []*dcspb.DetectorInfo } type DCSDetectors []dcspb.Detector @@ -77,10 +79,11 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) return &Plugin{ - dcsHost: u.Hostname(), - dcsPort: portNumber, - dcsClient: nil, - pendingEORs: make(map[string]int64), + dcsHost: u.Hostname(), + dcsPort: portNumber, + dcsClient: nil, + pendingEORs: make(map[string]int64), + detectorMatrix: make([]*dcspb.DetectorInfo, 0), } } @@ -113,6 +116,8 @@ func (p *Plugin) GetData(_ []any) string { outMap := make(map[string]interface{}) outMap["partitions"] = p.partitionStatesForEnvs(environmentIds) + outMap["detectors"] = p.detectorMatrix + out, err := json.Marshal(outMap) if err != nil { return "" @@ -176,7 +181,25 @@ func (p *Plugin) Init(instanceId string) error { time.Sleep(3 * time.Second) break } - log.WithField("event", ev.String()).Debug("received DCS event") + + if ev != nil && ev.Eventtype == dcspb.EventType_HEARTBEAT { + log.Trace("received DCS heartbeat event") + if dm := ev.GetDetectorMatrix(); len(dm) > 0 { + p.detectorMatrix = dm + } + continue + } + + if ev != nil && ev.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { + log.Trace("received DCS state change event") + if dm := ev.GetDetectorMatrix(); len(dm) > 0 { + p.detectorMatrix = dm + } + continue + } + + log.WithField("event", ev.String()). + Debug("received DCS event") } log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). From 9a20ea91ca2ce7e1bdc0e1cb60dc5e306a219470 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Nov 2023 13:37:44 +0100 Subject: [PATCH 1738/2352] [occ] Try to make plugin unsubscribe from FairMQ at right time --- occ/plugin/OccFMQCommon.cxx | 5 ++++- occ/plugin/OccLiteServer.cxx | 6 +++++- occ/plugin/OccPluginServer.cxx | 12 ++++++++++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index 5e3f6d15f..ea457a950 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -148,7 +148,9 @@ std::tuple doTransition(fair: m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ - m_pluginServices->UnsubscribeFromDeviceStateChange(id); + if ( !newStates.empty() && newStates.back() != "EXITING") { + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + } }); try { @@ -220,6 +222,7 @@ std::tuple doTransition(fair: } if (newStates.back() == "EXITING") { + m_pluginServices->UnsubscribeFromDeviceStateChange(id); m_pluginServices->ReleaseDeviceControl(FMQ_CONTROLLER_NAME); OLOG(debug) << "releasing device control"; } diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 418bfddf7..11a0bdb9e 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -122,10 +122,12 @@ OccLite::Service::EventStream(::grpc::ServerContext* context, const OccLite::nop std::mutex writer_mu; std::condition_variable finished; std::mutex finished_mu; + std::string last_known_state; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); + last_known_state = state; OLOG(debug) << "[EventStream] new state: " << state; @@ -147,7 +149,9 @@ OccLite::Service::EventStream(::grpc::ServerContext* context, const OccLite::nop m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ - m_pluginServices->UnsubscribeFromDeviceStateChange(id); + if (last_known_state == "EXITING") { + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + } }); { diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 11b8c03d0..998146626 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -58,10 +58,12 @@ OccPluginServer::EventStream(grpc::ServerContext* context, std::mutex writer_mu; std::condition_variable finished; std::mutex finished_mu; + std::string last_known_state; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); + last_known_state = state OLOG(debug) << "[EventStream] new state: " << state; @@ -83,7 +85,9 @@ OccPluginServer::EventStream(grpc::ServerContext* context, m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ - m_pluginServices->UnsubscribeFromDeviceStateChange(id); + if (last_known_state == "EXITING") { + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + } }); { @@ -106,10 +110,12 @@ OccPluginServer::StateStream(grpc::ServerContext* context, std::mutex writer_mu; std::condition_variable finished; std::mutex finished_mu; + std::string last_known_state; auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); + last_known_state = state pb::StateType sType = isIntermediateFMQState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; pb::StateStreamReply response; @@ -132,7 +138,9 @@ OccPluginServer::StateStream(grpc::ServerContext* context, m_pluginServices->SubscribeToDeviceStateChange(id, onDeviceStateChange); DEFER({ - m_pluginServices->UnsubscribeFromDeviceStateChange(id); + if (last_known_state == "EXITING") { + m_pluginServices->UnsubscribeFromDeviceStateChange(id); + } }); { From 07a0bfced6e76d0470c0276e808d8335e703f5e3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Nov 2023 13:49:33 +0100 Subject: [PATCH 1739/2352] [build] Bump to v0.83.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index e6029b36e..7d6a72d07 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 82 -VERSION_PATCH := 2 +VERSION_MINOR := 83 +VERSION_PATCH := 0 From c7fac441a183978fa4385ed5234ec8eb4032fc74 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Nov 2023 14:58:52 +0100 Subject: [PATCH 1740/2352] [occ] Fix broken build --- occ/plugin/OccPluginServer.cxx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 998146626..3f96a0c2a 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -63,7 +63,7 @@ OccPluginServer::EventStream(grpc::ServerContext* context, auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - last_known_state = state + last_known_state = state; OLOG(debug) << "[EventStream] new state: " << state; @@ -115,7 +115,7 @@ OccPluginServer::StateStream(grpc::ServerContext* context, auto onDeviceStateChange = [&](fair::mq::PluginServices::DeviceState reachedState) { std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); - last_known_state = state + last_known_state = state; pb::StateType sType = isIntermediateFMQState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; pb::StateStreamReply response; From ab0918ea10c0dd674894b7f2bfd22bf96a7aab49 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 10 Nov 2023 15:04:09 +0100 Subject: [PATCH 1741/2352] [build] Bump to v0.83.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7d6a72d07..de53272bb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 83 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From c9a851d2a7b113ac6ea4af6ceb9558a6b4649ba8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Nov 2023 14:10:26 +0100 Subject: [PATCH 1742/2352] [core] Prevent DCS PFR and SOR if ops are declared unavailable by DCS --- core/integration/dcs/dcsutil.go | 2 +- core/integration/dcs/plugin.go | 94 ++++++++++++++++++++++++++------ core/integration/dcs/structs.go | 97 +++++++++++++++++++++++++++++++++ 3 files changed, 174 insertions(+), 19 deletions(-) create mode 100644 core/integration/dcs/structs.go diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go index a38e78104..764e41016 100644 --- a/core/integration/dcs/dcsutil.go +++ b/core/integration/dcs/dcsutil.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2022 CERN and copyright holders of ALICE O². + * Copyright 2022-2023 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 8d8219429..609b23ad6 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2021-2023 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -35,6 +35,7 @@ import ( "net/url" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -62,11 +63,14 @@ type Plugin struct { dcsClient *RpcClient pendingEORs map[string] /*envId*/ int64 - detectorMatrix []*dcspb.DetectorInfo + detectorMatrix []*dcspb.DetectorInfo + detectorMatrixMu sync.RWMutex } type DCSDetectors []dcspb.Detector +type DCSDetectorStatesMap map[dcspb.Detector]dcspb.DetectorState + func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -78,13 +82,14 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) - return &Plugin{ + newPlugin := &Plugin{ dcsHost: u.Hostname(), dcsPort: portNumber, dcsClient: nil, pendingEORs: make(map[string]int64), detectorMatrix: make([]*dcspb.DetectorInfo, 0), } + return newPlugin } func (p *Plugin) GetName() string { @@ -116,7 +121,9 @@ func (p *Plugin) GetData(_ []any) string { outMap := make(map[string]interface{}) outMap["partitions"] = p.partitionStatesForEnvs(environmentIds) + p.detectorMatrixMu.RLock() outMap["detectors"] = p.detectorMatrix + p.detectorMatrixMu.RUnlock() out, err := json.Marshal(outMap) if err != nil { @@ -185,7 +192,9 @@ func (p *Plugin) Init(instanceId string) error { if ev != nil && ev.Eventtype == dcspb.EventType_HEARTBEAT { log.Trace("received DCS heartbeat event") if dm := ev.GetDetectorMatrix(); len(dm) > 0 { + p.detectorMatrixMu.Lock() p.detectorMatrix = dm + p.detectorMatrixMu.Unlock() } continue } @@ -193,7 +202,9 @@ func (p *Plugin) Init(instanceId string) error { if ev != nil && ev.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { log.Trace("received DCS state change event") if dm := ev.GetDetectorMatrix(); len(dm) > 0 { + p.detectorMatrixMu.Lock() p.detectorMatrix = dm + p.detectorMatrixMu.Unlock() } continue } @@ -231,6 +242,28 @@ func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack ma return stack } +func (p *Plugin) getDetectorsStates(dcsDetectors DCSDetectors) DCSDetectorStatesMap { + p.detectorMatrixMu.RLock() + defer p.detectorMatrixMu.RUnlock() + + detectorStatesMap := make(DCSDetectorStatesMap) + + for _, dcsDet := range dcsDetectors { + if dcsDet == dcspb.Detector_DCS { + continue + } + detectorStatesMap[dcsDet] = dcspb.DetectorState_NULL_STATE + + for _, detInfo := range p.detectorMatrix { + if detInfo.Detector == dcsDet { + detectorStatesMap[dcsDet] = detInfo.State + } + } + } + + return detectorStatesMap +} + func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call, callOk := data.(*callable.Call) if !callOk { @@ -271,6 +304,26 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + knownDetectorStates := p.getDetectorsStates(dcsDetectors) + isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + if !isCompatibleWithOperation { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } else if isCompatibleWithOperation && err != nil { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Warnf("cannot determine PFR readiness: %s", err.Error()) + } + log.WithField("partition", envId). WithField("level", infologger.IL_Ops). Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) @@ -617,6 +670,26 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + knownDetectorStates := p.getDetectorsStates(dcsDetectors) + isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + if !isCompatibleWithOperation { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } else if isCompatibleWithOperation && err != nil { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warnf("cannot determine SOR readiness: %s", err.Error()) + } + log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("run", runNumber64). @@ -1348,18 +1421,3 @@ func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors DCSDetector func (p *Plugin) Destroy() error { return p.dcsClient.Close() } - -func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { - if d == nil { - return - } - sslice = make([]string, len(d)) - if len(d) == 0 { - return - } - - for i, det := range d { - sslice[i] = dcsToEcsDetector(det) - } - return -} diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go new file mode 100644 index 000000000..938d6e2d0 --- /dev/null +++ b/core/integration/dcs/structs.go @@ -0,0 +1,97 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021-2023 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package dcs + +import ( + "fmt" + "strings" + + dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" +) + +func (detectors DCSDetectors) ToStringSlice() []string { + ret := make([]string, len(detectors)) + + for i, det := range detectors { + ret[i] = det.String() + } + return ret +} + +func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { + if d == nil { + return + } + sslice = make([]string, len(d)) + if len(d) == 0 { + return + } + + for i, det := range d { + sslice[i] = dcsToEcsDetector(det) + } + return +} + +func (dsm DCSDetectorStatesMap) makeDetectorsByStateMap() map[dcspb.DetectorState]DCSDetectors { + detectorsByState := make(map[dcspb.DetectorState]DCSDetectors) + for det, detState := range dsm { + if _, ok := detectorsByState[detState]; !ok { + detectorsByState[detState] = make([]dcspb.Detector, 0) + } + detectorsByState[detState] = append(detectorsByState[detState], det) + } + return detectorsByState +} + +// Returns true if the provided detectors are either all in conditionState or in NULL_STATE +func (dsm DCSDetectorStatesMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (bool, error) { + detectorsByState := dsm.makeDetectorsByStateMap() + + detectorsInConditionState, thereAreDetectorsInConditionState := detectorsByState[conditionState] + detectorsInNullState, thereAreDetectorsInNullState := detectorsByState[dcspb.DetectorState_NULL_STATE] + + if thereAreDetectorsInConditionState && (len(detectorsInConditionState) == len(dsm)) { + // all detectors are in conditionState + return true, nil + } else if thereAreDetectorsInConditionState && thereAreDetectorsInNullState && (len(detectorsInConditionState)+len(detectorsInNullState) == len(dsm)) { + // all detectors are either in conditionState or in NULL_STATE + return true, fmt.Errorf("detectors %s are in NULL_STATE", strings.Join(detectorsByState[dcspb.DetectorState_NULL_STATE].ToStringSlice(), ", ")) + } else if thereAreDetectorsInNullState && (len(detectorsInNullState) == len(dsm)) { + // all detectors are in NULL_STATE + return true, fmt.Errorf("all detectors are in NULL_STATE") + } else { + // there are detectors in other states incompatible with conditionState + reportByState := make([]string, 0) + for state, detectors := range detectorsByState { + if state == conditionState { + continue + } + reportByState = append(reportByState, + fmt.Sprintf("%s in %s", strings.Join(detectors.ToStringSlice(), ", "), state.String())) + } + return false, fmt.Errorf("detectors are in incompatible states: %v", strings.Join(reportByState, "; ")) + } +} From 988327812767a17050c5cf8c1d6bb47901009786 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 15 Nov 2023 14:13:25 +0100 Subject: [PATCH 1743/2352] [core] React to PFR/SOR UNAVAILABLE reported by DCS on response stream --- core/integration/dcs/plugin.go | 45 ++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 609b23ad6..da39da033 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -551,6 +551,28 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + if dcsEvent.GetState() == dcspb.DetectorState_PFR_UNAVAILABLE { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s PFR unavailable reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) @@ -931,6 +953,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + if dcsEvent.GetState() == dcspb.DetectorState_SOR_UNAVAILABLE { + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + logErr := fmt.Errorf("%s SOR unavailable reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + return + } + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) From 020b5519e7c89506472be8692b093bbc2964e0a5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Nov 2023 10:12:09 +0100 Subject: [PATCH 1744/2352] [core] Minor consistency fix --- core/integration/dcs/structs.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index 938d6e2d0..c79a2ab34 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -31,13 +31,19 @@ import ( dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" ) -func (detectors DCSDetectors) ToStringSlice() []string { - ret := make([]string, len(detectors)) +func (d DCSDetectors) ToStringSlice() (sslice []string) { + if d == nil { + return + } + sslice = make([]string, len(d)) + if len(d) == 0 { + return + } - for i, det := range detectors { - ret[i] = det.String() + for i, det := range d { + sslice[i] = det.String() } - return ret + return } func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { From 317683381cc0f647f514f6a3f8f32b81e0e277d8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Nov 2023 11:05:21 +0100 Subject: [PATCH 1745/2352] [core] Update CTP proto interface --- core/integration/trg/protos/ctpecs.pb.go | 149 ++++++++++-------- core/integration/trg/protos/ctpecs.proto | 1 + core/integration/trg/protos/ctpecs_grpc.pb.go | 2 +- 3 files changed, 82 insertions(+), 70 deletions(-) diff --git a/core/integration/trg/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go index c583179b0..d175f1d27 100644 --- a/core/integration/trg/protos/ctpecs.pb.go +++ b/core/integration/trg/protos/ctpecs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc v4.24.2 // source: protos/ctpecs.proto package ctpecs @@ -142,7 +142,8 @@ type RunLoadRequest struct { // -config, i.e. the content of partname.pd // -partname -the content is in ctp config dir partname.pd // -key in case the config is available in Consul[key] - Detectors string `protobuf:"bytes,3,opt,name=detectors,proto3" json:"detectors,omitempty"` // available detectors, "" -all required must be ready + Detectors string `protobuf:"bytes,3,opt,name=detectors,proto3" json:"detectors,omitempty"` // available detectors, "" -all required must be ready + CtpReadoutIncluded bool `protobuf:"varint,4,opt,name=ctp_readout_included,json=ctpReadoutIncluded,proto3" json:"ctp_readout_included,omitempty"` // true: ctp readout included in the run } func (x *RunLoadRequest) Reset() { @@ -198,6 +199,13 @@ func (x *RunLoadRequest) GetDetectors() string { return "" } +func (x *RunLoadRequest) GetCtpReadoutIncluded() bool { + if x != nil { + return x.CtpReadoutIncluded + } + return false +} + // global + stdalone runs (common for ctpd/ltud): type RunStartRequest struct { state protoimpl.MessageState @@ -495,74 +503,77 @@ var file_protos_ctpecs_proto_rawDesc = []byte{ 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x5a, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x4c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, - 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, - 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x22, 0xdb, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x68, 0x5f, - 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x52, 0x6e, 0x64, - 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x24, 0x0a, 0x04, - 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f, 0x4e, 0x54, - 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x72, - 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6d, 0x73, 0x67, 0x32, 0x80, 0x04, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, 0x3a, 0x0a, 0x0d, - 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, - 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x52, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x8c, 0x01, 0x0a, 0x0e, 0x52, 0x75, 0x6e, + 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x74, 0x70, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x6f, 0x75, 0x74, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, 0x74, 0x70, 0x52, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x22, 0xdb, 0x01, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, + 0x75, 0x6e, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2e, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x13, 0x0a, 0x05, 0x70, 0x68, 0x5f, 0x62, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x68, 0x42, 0x63, 0x12, 0x15, 0x0a, 0x06, + 0x70, 0x68, 0x5f, 0x72, 0x6e, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x68, + 0x52, 0x6e, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, + 0x24, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x49, 0x47, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x43, + 0x4f, 0x4e, 0x54, 0x10, 0x02, 0x22, 0x26, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x40, 0x0a, 0x0e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2c, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x72, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x72, 0x63, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x32, 0x80, 0x04, 0x0a, 0x04, 0x43, 0x54, 0x50, 0x64, 0x12, + 0x3a, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, + 0x12, 0x17, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, + 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, + 0x75, 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, + 0x6e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, + 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, + 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, + 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, + 0x15, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, - 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x4c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, - 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, - 0x75, 0x6e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, - 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, - 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x33, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x15, 0x2e, 0x63, - 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x16, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, - 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x28, 0x0a, 0x07, - 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, - 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, 0x52, 0x75, 0x6e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, - 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, - 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, - 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x12, 0x0b, 0x2e, 0x63, - 0x74, 0x70, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, - 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x08, 0x54, - 0x50, 0x43, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x72, 0x67, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, + 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x28, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x07, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x09, + 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x64, + 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x2b, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x12, + 0x0b, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, + 0x74, 0x70, 0x64, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x29, + 0x0a, 0x08, 0x54, 0x50, 0x43, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x0b, 0x2e, 0x63, 0x74, 0x70, + 0x64, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x74, 0x70, 0x64, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x44, 0x5a, 0x42, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x74, 0x72, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, 0x65, 0x63, 0x73, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/trg/protos/ctpecs.proto b/core/integration/trg/protos/ctpecs.proto index d1d8500a0..90a65c7a8 100644 --- a/core/integration/trg/protos/ctpecs.proto +++ b/core/integration/trg/protos/ctpecs.proto @@ -30,6 +30,7 @@ message RunLoadRequest { // -partname -the content is in ctp config dir partname.pd // -key in case the config is available in Consul[key] string detectors= 3; // available detectors, "" -all required must be ready + bool ctp_readout_included = 4; // true: ctp readout included in the run } // global + stdalone runs (common for ctpd/ltud): message RunStartRequest { diff --git a/core/integration/trg/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go index d603f977e..9376919dc 100644 --- a/core/integration/trg/protos/ctpecs_grpc.pb.go +++ b/core/integration/trg/protos/ctpecs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc v4.24.2 // source: protos/ctpecs.proto package ctpecs From ed8fcd95ce23207282208d1303a31610ff3853c1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Nov 2023 11:06:12 +0100 Subject: [PATCH 1746/2352] [core] Add support for ctp_readout_enabled forwarding to CTP service --- core/integration/trg/plugin.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index a7bdd4343..3cb13c864 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -558,10 +558,24 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + ctpReadoutIncluded := false + ctpReadoutIncludedStr, ok := varStack["ctp_readout_enabled"] + if ok { + ctpReadoutIncluded, err = strconv.ParseBool(ctpReadoutIncludedStr) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "RunLoad"). + Warn("could not parse ctp_readout_enabled value") + } + } + in := trgpb.RunLoadRequest{ - Runn: uint32(runNumber64), - Detectors: detectors, - Config: globalConfig, + Runn: uint32(runNumber64), + Detectors: detectors, + Config: globalConfig, + CtpReadoutIncluded: ctpReadoutIncluded, } if p.trgClient == nil { err = fmt.Errorf("TRG plugin not initialized, RunLoad impossible") From ba7eec2b5e81fd58630f4dac02b2cd8c003b1e45 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Nov 2023 11:23:52 +0100 Subject: [PATCH 1747/2352] [build] Bump AliECS to v0.84.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index de53272bb..5a1f19e20 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 -VERSION_MINOR := 83 -VERSION_PATCH := 1 +VERSION_MINOR := 84 +VERSION_PATCH := 0 From f3b329ae41e6ba269b1a9d772e886005b115b43a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Nov 2023 10:00:49 +0100 Subject: [PATCH 1748/2352] [core] DCS actually uses SOR_AVAILABLE to mean PFR_AVAILABLE --- core/integration/dcs/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index da39da033..9d06e0ff1 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -305,7 +305,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } knownDetectorStates := p.getDetectorsStates(dcsDetectors) - isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) if !isCompatibleWithOperation { log.WithError(err). WithField("level", infologger.IL_Ops). From 5cab192a9a709d0631d4e6e858cac9158b00a979 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 21 Nov 2023 10:01:21 +0100 Subject: [PATCH 1749/2352] [build] Bump to v0.84.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5a1f19e20..4858e78ae 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 0 VERSION_MINOR := 84 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 9c27fbe417f6be969e936335821580c0f37ed580 Mon Sep 17 00:00:00 2001 From: wiechula <11199190+wiechula@users.noreply.github.com> Date: Wed, 29 Nov 2023 10:24:43 +0100 Subject: [PATCH 1750/2352] Add missing include for newer compilers --- occ/occlib/RuntimeControlledObject.h | 1 + 1 file changed, 1 insertion(+) diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index c898667ca..3002606da 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -26,6 +26,7 @@ #ifndef OCC_RUNTIMECONTROLLEDOBJECT_H #define OCC_RUNTIMECONTROLLEDOBJECT_H +#include #include "OccState.h" #include "occ_export.h" From 65f0b668a7a5c808b94cac6e1c1f9249de3da221 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 8 Nov 2023 16:01:01 +0100 Subject: [PATCH 1751/2352] [apricot] Implement component configuration access in HTTP API --- apricot/local/servicehttp.go | 381 +++++++++++++++++++++++++++++++++-- 1 file changed, 368 insertions(+), 13 deletions(-) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 427775ba4..c94d969c0 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -1,8 +1,9 @@ /* * === This file is part of ALICE O² === * - * Copyright 2019-2021 CERN and copyright holders of ALICE O². + * Copyright 2019-2023 CERN and copyright holders of ALICE O². * Author: Claire Guyot + * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -28,11 +29,15 @@ import ( "encoding/json" "fmt" "net/http" + "sort" "strconv" + "strings" "time" + apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/configuration" + "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/gorilla/mux" "github.com/spf13/viper" ) @@ -41,6 +46,323 @@ type HttpService struct { svc configuration.Service } +func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Request) { + queryArgs := r.URL.Query() + format := queryArgs.Get("format") + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + w.WriteHeader(http.StatusOK) + + components, err := httpsvc.svc.ListComponents() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + out, _ := json.MarshalIndent(err, "", "\t") + _, _ = fmt.Fprintln(w, string(out)) + return + } + + sort.Strings(components) + + response, err := json.MarshalIndent(components, "", "\t") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + out, _ := json.MarshalIndent(err, "", "\t") + _, _ = fmt.Fprintln(w, string(out)) + return + } + _, _ = fmt.Fprintln(w, string(response)) + return + + case "text": + fallthrough + default: + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + + components, err := httpsvc.svc.ListComponents() + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + _, _ = fmt.Fprintln(w, err) + return + } + + sort.Strings(components) + + response := strings.Join(components, "\n") + _, _ = fmt.Fprintln(w, string(response)) + } +} + +func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *http.Request) { + // GET /components/{component} returns all, raw is ignored + // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all + // runtype = {runtype} rolename = {rolename}, raw excludes ANY runtype and any rolename, if false returns all + + queryParams := mux.Vars(r) + component, hasComponent := queryParams["component"] + if !hasComponent { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "component name not provided") + return + } + + runtypeS, hasRuntype := queryParams["runtype"] + + runType := apricotpb.RunType_NULL + if hasRuntype { + runtypeS = strings.ToUpper(runtypeS) + runTypeInt, isRunTypeValid := apricotpb.RunType_value[runtypeS] + if !isRunTypeValid { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "runtype not valid") + return + } else { + runType = apricotpb.RunType(runTypeInt) + } + } + + rolename, hasRolename := queryParams["rolename"] + + queryArgs := r.URL.Query() + rawS := queryArgs.Get("raw") + raw, err := strconv.ParseBool(rawS) + if err != nil { + raw = false + } + + entries, err := httpsvc.svc.ListComponentEntries(&componentcfg.EntriesQuery{ + Component: component, + RunType: runType, + RoleName: rolename, + }, false) + + filterPrefixes := make(map[string]struct{}) + if hasRuntype { + if hasRolename { // we filter for runtype and rolename, and if !raw, also combos with ANY and any + filterPrefixes[runtypeS+"/"+rolename] = struct{}{} + if !raw { + filterPrefixes["ANY"+"/"+rolename] = struct{}{} + filterPrefixes[runtypeS+"/any"] = struct{}{} + filterPrefixes["ANY/any"] = struct{}{} + } + } else { // no rolename provided, we only filter for runtype and ANY if !raw + filterPrefixes[runtypeS] = struct{}{} + if !raw { + filterPrefixes["ANY"] = struct{}{} + } + } + } + + filteredEntries := make([]string, 0) + if hasRuntype { // if there's any filtering to do + for _, entry := range entries { + for filterPrefix, _ := range filterPrefixes { + if strings.HasPrefix(entry, filterPrefix) { + filteredEntries = append(filteredEntries, entry) + } + } + } + } else { // no filtering, return all entries + filteredEntries = entries + } + + format := queryArgs.Get("format") + + switch format { + case "json": + w.Header().Set("Content-Type", "application/json") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + out, _ := json.MarshalIndent(err, "", "\t") + _, _ = fmt.Fprintln(w, string(out)) + return + } + + w.WriteHeader(http.StatusOK) + + sort.Strings(filteredEntries) + + response, err := json.MarshalIndent(filteredEntries, "", "\t") + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + out, _ := json.MarshalIndent(err, "", "\t") + _, _ = fmt.Fprintln(w, string(out)) + return + } + _, _ = fmt.Fprintln(w, string(response)) + return + + case "text": + fallthrough + default: + w.Header().Set("Content-Type", "text/plain") + + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + _, _ = fmt.Fprintln(w, err) + return + } + + w.WriteHeader(http.StatusOK) + + sort.Strings(filteredEntries) + + response := strings.Join(filteredEntries, "\n") + _, _ = fmt.Fprintln(w, string(response)) + } +} + +func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *http.Request) { + // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path + // like {component}/{runtype}/{rolename}/{entry} + + queryParams := mux.Vars(r) + component, hasComponent := queryParams["component"] + if !hasComponent { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "component name not provided") + return + } + + runtypeS, hasRuntype := queryParams["runtype"] + runType := apricotpb.RunType_NULL + if hasRuntype { + runtypeS = strings.ToUpper(runtypeS) + runTypeInt, isRunTypeValid := apricotpb.RunType_value[runtypeS] + if !isRunTypeValid { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "runtype not valid") + return + } else { + runType = apricotpb.RunType(runTypeInt) + } + } else { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "runtype not provided") + return + } + + rolename, hasRolename := queryParams["rolename"] + if !hasRolename { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "rolename not provided") + return + } + + entry, hasEntry := queryParams["entry"] + if !hasEntry { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "entry not provided") + return + } + + resolved, err := httpsvc.svc.ResolveComponentQuery(&componentcfg.Query{ + Component: component, + RunType: runType, + RoleName: rolename, + EntryKey: entry, + Timestamp: "", + }) + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + _, _ = fmt.Fprintln(w, err) + return + } + + resolvedStr := resolved.Path() + + w.WriteHeader(http.StatusOK) + _, _ = fmt.Fprintln(w, resolvedStr) +} + +func (httpsvc *HttpService) ApiGetComponentConfiguration(w http.ResponseWriter, r *http.Request) { + // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload + // that may be processed or not depending on process=true or false + + queryParams := mux.Vars(r) + component, hasComponent := queryParams["component"] + if !hasComponent { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "component name not provided") + return + } + + runtypeS, hasRuntype := queryParams["runtype"] + runType := apricotpb.RunType_NULL + if hasRuntype { + runtypeS = strings.ToUpper(runtypeS) + runTypeInt, isRunTypeValid := apricotpb.RunType_value[runtypeS] + if !isRunTypeValid { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "runtype not valid") + return + } else { + runType = apricotpb.RunType(runTypeInt) + } + } else { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "runtype not provided") + return + } + + rolename, hasRolename := queryParams["rolename"] + if !hasRolename { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "rolename not provided") + return + } + + entry, hasEntry := queryParams["entry"] + if !hasEntry { + w.WriteHeader(http.StatusBadRequest) + _, _ = fmt.Fprintln(w, "entry not provided") + return + } + + queryArgs := r.URL.Query() + processS := queryArgs.Get("process") + process, err := strconv.ParseBool(processS) + if err != nil { + process = false + } + if queryArgs.Has("process") { + queryArgs.Del("process") + } + + varStack := make(map[string]string) + for k, v := range queryArgs { + if len(v) > 0 { + varStack[k] = v[0] + } + } + + var payload string + if process { + payload, err = httpsvc.svc.GetAndProcessComponentConfiguration(&componentcfg.Query{ + Component: component, + RunType: runType, + RoleName: rolename, + EntryKey: entry, + }, varStack) + } else { + payload, err = httpsvc.svc.GetComponentConfiguration(&componentcfg.Query{ + Component: component, + RunType: runType, + RoleName: rolename, + EntryKey: entry, + }) + } + if err != nil { + w.WriteHeader(http.StatusInternalServerError) + _, _ = fmt.Fprintln(w, err) + return + } + + w.WriteHeader(http.StatusOK) + _, _ = fmt.Fprintln(w, payload) +} + func (httpsvc *HttpService) ApiGetFlps(w http.ResponseWriter, r *http.Request) { httpsvc.ApiGetHostInventory(w, r, "") } @@ -128,18 +450,51 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { WriteTimeout: 15 * time.Second, ReadTimeout: 15 * time.Second, } - apiFlps := router.PathPrefix("/inventory/flps").Subrouter() - apiFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiDetectors := router.PathPrefix("/inventory/detectors").Subrouter() - apiDetectors.HandleFunc("", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - apiDetectors.HandleFunc("/", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - apiDetectors.HandleFunc("/{format}", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - apiDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() - apiDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + + // component configuration API + + // GET /components + apiComponents := router.PathPrefix("/components").Subrouter() + apiComponents.HandleFunc("", httpsvc.ApiListComponents).Methods(http.MethodGet) + apiComponents.HandleFunc("/", httpsvc.ApiListComponents).Methods(http.MethodGet) + + // GET /components/{component} + apiComponentsEntries := router.PathPrefix("/components/{component}").Subrouter() + // GET /components/{component} returns all, raw is ignored + apiComponentsEntries.HandleFunc("", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all + apiComponentsEntries.HandleFunc("/{runtype}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/{runtype}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + // runtype = {runtype} rolename = {rolename}, raw excludes ANY runtype and any rolename, if false returns all + apiComponentsEntries.HandleFunc("/{runtype}/{rolename}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/{runtype}/{rolename}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + + apiComponentQuery := router.PathPrefix("/components/{component}/{runtype}/{rolename}/{entry}").Subrouter() + // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path + // like {component}/{runtype}/{rolename}/{entry} + apiComponentQuery.HandleFunc("/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) + // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload + // that may be processed or not depending on process=true or false + apiComponentQuery.HandleFunc("", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) + apiComponentQuery.HandleFunc("/", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) + + // inventory API + + apiInventoryFlps := router.PathPrefix("/inventory/flps").Subrouter() + apiInventoryFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiInventoryFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiInventoryFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) + + apiInventoryDetectors := router.PathPrefix("/inventory/detectors").Subrouter() + apiInventoryDetectors.HandleFunc("", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiInventoryDetectors.HandleFunc("/", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiInventoryDetectors.HandleFunc("/{format}", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + + apiInventoryDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() + apiInventoryDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiInventoryDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiInventoryDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) // async-start of http Service and capture error go func() { From 65ac1f2beaa073850e23150a26597426ac0a7ba2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 10:54:26 +0100 Subject: [PATCH 1752/2352] [apricot] Update pongo2 to v6 --- apricot/local/service.go | 2 +- go.mod | 2 +- go.sum | 5 ++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 8393c2ede..e38848db1 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -43,7 +43,7 @@ import ( "github.com/AliceO2Group/Control/configuration/cfgbackend" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" - "github.com/flosch/pongo2/v4" + "github.com/flosch/pongo2/v6" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) diff --git a/go.mod b/go.mod index 086086c00..15983d038 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,6 @@ require ( github.com/denisbrodbeck/machineid v1.0.1 github.com/dmarkham/enumer v1.5.8 github.com/fatih/color v1.15.0 - github.com/flosch/pongo2/v4 v4.0.2 github.com/gdamore/tcell/v2 v2.6.0 github.com/go-git/go-git/v5 v5.7.0 github.com/gobwas/glob v0.2.3 @@ -69,6 +68,7 @@ require ( ) require ( + github.com/flosch/pongo2/v6 v6.0.0 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 diff --git a/go.sum b/go.sum index 1e76fcb5c..362f7b291 100644 --- a/go.sum +++ b/go.sum @@ -121,8 +121,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= -github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= -github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= +github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= +github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= @@ -899,7 +899,6 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= From b178aad599855fbccb2e41ff93e6e9475ed7b5f3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 11:20:42 +0100 Subject: [PATCH 1753/2352] [apricot] Use pongo2 template cache, one per component/rt/role directory --- apricot/local/service.go | 39 +++++++++++++++++++++++++++++++++------ 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index e38848db1..312a11d07 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -36,6 +36,7 @@ import ( "sort" "strconv" "strings" + "sync" "time" "github.com/AliceO2Group/Control/common/logger" @@ -54,6 +55,9 @@ const inventoryKeyPrefix = "o2/hardware/" type Service struct { src cfgbackend.Source + + templateSets map[string]*pongo2.TemplateSet + templateSetsMu sync.Mutex } func NewService(uri string) (svc *Service, err error) { @@ -288,13 +292,16 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, shortPath = path[indexOfLastSeparator+1:] } - // We declare a TemplateSet, with a custom TemplateLoader. - // Our ConsulTemplateLoader takes control of the FromFile code path - // in pongo2, effectively adding support for Consul as file-like - // backend. - tplSet := pongo2.NewSet("", template.NewConsulTemplateLoader(s, basePath)) + // We get a TemplateSet, with a custom TemplateLoader. Depending on past events, a template set for this base path + // might already exist in the service's template set cache map. We will then use the cache of this template set to + // speed up future requests. + // In order for resolution of short paths to work (i.e. entry name within a component/runtype/rolename directory), + // we need to build one templateSet+templateLoader per base path. + // Our ConsulTemplateLoader takes control of the FromFile code path in pongo2, effectively adding support for + // Consul as file-like backend. + tplSet := s.templateSetForBasePath(basePath) var tpl *pongo2.Template - tpl, err = tplSet.FromFile(shortPath) + tpl, err = tplSet.FromCache(shortPath) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()), err @@ -775,3 +782,23 @@ func (s *Service) logMethod() { WithField("level", infologger.IL_Devel). Debug("handling RPC request") } + +func (s *Service) templateSetForBasePath(basePath string) *pongo2.TemplateSet { + s.templateSetsMu.Lock() + defer s.templateSetsMu.Unlock() + if s.templateSets == nil { + s.templateSets = make(map[string]*pongo2.TemplateSet) + } + if _, ok := s.templateSets[basePath]; !ok { + s.templateSets[basePath] = pongo2.NewSet(basePath, template.NewConsulTemplateLoader(s, basePath)) + } + return s.templateSets[basePath] +} + +func (s *Service) invalidateTemplateSetCache() { + s.templateSetsMu.Lock() + defer s.templateSetsMu.Unlock() + + // In principle we could also foreach templateSet call ClearCache(), but this is quicker and has the same effect + s.templateSets = make(map[string]*pongo2.TemplateSet) +} From 01214b0363b5c0b52467fd468b505c286849f5cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 12:44:41 +0100 Subject: [PATCH 1754/2352] [apricot] Implement component config template cache invalidation --- apricot/cacheproxy/service.go | 12 ++- apricot/local/service.go | 2 +- apricot/local/servicehttp.go | 142 ++++++++++++++++-------------- apricot/protos/apricot.pb.go | 70 ++++++++------- apricot/protos/apricot.proto | 1 + apricot/protos/apricot_grpc.pb.go | 38 +++++++- apricot/remote/server.go | 9 ++ apricot/remote/service.go | 4 + configuration/service.go | 1 + 9 files changed, 174 insertions(+), 105 deletions(-) diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index 2b342d630..d89ab10ec 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -7,14 +7,14 @@ import ( // Implements a cache proxy Service for the configuration system. // Only DetectorForHost/DetectorsForHosts are cached, all other calls are passed through. -type Service struct{ - base configuration.Service +type Service struct { + base configuration.Service cache svcCache } type svcCache struct { detectorsInventory map[string][]string - detectorForHost map[string]string + detectorForHost map[string]string } func NewService(base configuration.Service) (*Service, error) { @@ -22,7 +22,7 @@ func NewService(base configuration.Service) (*Service, error) { base: base, cache: svcCache{ detectorsInventory: make(map[string][]string), - detectorForHost: make(map[string]string), + detectorForHost: make(map[string]string), }, } @@ -144,3 +144,7 @@ func (s Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, er func (s Service) RawGetRecursive(path string) (string, error) { return s.base.RawGetRecursive(path) } + +func (s Service) InvalidateComponentTemplateCache() { + s.base.InvalidateComponentTemplateCache() +} diff --git a/apricot/local/service.go b/apricot/local/service.go index 312a11d07..ed8484dc7 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -795,7 +795,7 @@ func (s *Service) templateSetForBasePath(basePath string) *pongo2.TemplateSet { return s.templateSets[basePath] } -func (s *Service) invalidateTemplateSetCache() { +func (s *Service) InvalidateComponentTemplateCache() { s.templateSetsMu.Lock() defer s.templateSetsMu.Unlock() diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index c94d969c0..8f19131e7 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -46,6 +46,75 @@ type HttpService struct { svc configuration.Service } +func NewHttpService(service configuration.Service) (svr *http.Server) { + router := mux.NewRouter() + httpsvc := &HttpService{ + svc: service, + } + httpsvr := &http.Server{ + Handler: router, + Addr: ":" + strconv.Itoa(viper.GetInt("httpListenPort")), + WriteTimeout: 15 * time.Second, + ReadTimeout: 15 * time.Second, + } + + // component configuration API + + // GET /components + apiComponents := router.PathPrefix("/components").Subrouter() + apiComponents.HandleFunc("", httpsvc.ApiListComponents).Methods(http.MethodGet) + apiComponents.HandleFunc("/", httpsvc.ApiListComponents).Methods(http.MethodGet) + // POST /components/_invalidate_cache + apiComponents.HandleFunc("/_invalidate_cache", httpsvc.ApiInvalidateCache).Methods(http.MethodPost) + + // GET /components/{component} + apiComponentsEntries := router.PathPrefix("/components/{component}").Subrouter() + // GET /components/{component} returns all, raw is ignored + apiComponentsEntries.HandleFunc("", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all + apiComponentsEntries.HandleFunc("/{runtype}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/{runtype}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + // runtype = {runtype} rolename = {rolename}, raw excludes ANY runtype and any rolename, if false returns all + apiComponentsEntries.HandleFunc("/{runtype}/{rolename}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + apiComponentsEntries.HandleFunc("/{runtype}/{rolename}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) + + apiComponentQuery := router.PathPrefix("/components/{component}/{runtype}/{rolename}/{entry}").Subrouter() + // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path + // like {component}/{runtype}/{rolename}/{entry} + apiComponentQuery.HandleFunc("/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) + // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload + // that may be processed or not depending on process=true or false + apiComponentQuery.HandleFunc("", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) + apiComponentQuery.HandleFunc("/", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) + + // inventory API + + apiInventoryFlps := router.PathPrefix("/inventory/flps").Subrouter() + apiInventoryFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiInventoryFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) + apiInventoryFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) + + apiInventoryDetectors := router.PathPrefix("/inventory/detectors").Subrouter() + apiInventoryDetectors.HandleFunc("", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiInventoryDetectors.HandleFunc("/", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + apiInventoryDetectors.HandleFunc("/{format}", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) + + apiInventoryDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() + apiInventoryDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiInventoryDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + apiInventoryDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + + // async-start of http Service and capture error + go func() { + err := httpsvr.ListenAndServe() + if err != nil { + log.WithError(err).Error("HTTP service returned error") + } + }() + return httpsvr +} + func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Request) { queryArgs := r.URL.Query() format := queryArgs.Get("format") @@ -94,6 +163,12 @@ func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Req } } +func (httpsvc *HttpService) ApiInvalidateCache(w http.ResponseWriter, r *http.Request) { + httpsvc.svc.InvalidateComponentTemplateCache() + w.WriteHeader(http.StatusOK) + _, _ = fmt.Fprintln(w, "OK") +} + func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *http.Request) { // GET /components/{component} returns all, raw is ignored // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all @@ -438,70 +513,3 @@ func (httpsvc *HttpService) ApiPrintClusterInformation(w http.ResponseWriter, r } } } - -func NewHttpService(service configuration.Service) (svr *http.Server) { - router := mux.NewRouter() - httpsvc := &HttpService{ - svc: service, - } - httpsvr := &http.Server{ - Handler: router, - Addr: ":" + strconv.Itoa(viper.GetInt("httpListenPort")), - WriteTimeout: 15 * time.Second, - ReadTimeout: 15 * time.Second, - } - - // component configuration API - - // GET /components - apiComponents := router.PathPrefix("/components").Subrouter() - apiComponents.HandleFunc("", httpsvc.ApiListComponents).Methods(http.MethodGet) - apiComponents.HandleFunc("/", httpsvc.ApiListComponents).Methods(http.MethodGet) - - // GET /components/{component} - apiComponentsEntries := router.PathPrefix("/components/{component}").Subrouter() - // GET /components/{component} returns all, raw is ignored - apiComponentsEntries.HandleFunc("", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - apiComponentsEntries.HandleFunc("/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all - apiComponentsEntries.HandleFunc("/{runtype}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - apiComponentsEntries.HandleFunc("/{runtype}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - // runtype = {runtype} rolename = {rolename}, raw excludes ANY runtype and any rolename, if false returns all - apiComponentsEntries.HandleFunc("/{runtype}/{rolename}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - apiComponentsEntries.HandleFunc("/{runtype}/{rolename}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - - apiComponentQuery := router.PathPrefix("/components/{component}/{runtype}/{rolename}/{entry}").Subrouter() - // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path - // like {component}/{runtype}/{rolename}/{entry} - apiComponentQuery.HandleFunc("/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) - // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload - // that may be processed or not depending on process=true or false - apiComponentQuery.HandleFunc("", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) - apiComponentQuery.HandleFunc("/", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) - - // inventory API - - apiInventoryFlps := router.PathPrefix("/inventory/flps").Subrouter() - apiInventoryFlps.HandleFunc("", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiInventoryFlps.HandleFunc("/", httpsvc.ApiGetFlps).Methods(http.MethodGet) - apiInventoryFlps.HandleFunc("/{format}", httpsvc.ApiGetFlps).Methods(http.MethodGet) - - apiInventoryDetectors := router.PathPrefix("/inventory/detectors").Subrouter() - apiInventoryDetectors.HandleFunc("", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - apiInventoryDetectors.HandleFunc("/", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - apiInventoryDetectors.HandleFunc("/{format}", httpsvc.ApiGetDetectorsInventory).Methods(http.MethodGet) - - apiInventoryDetectorFlps := router.PathPrefix("/inventory/detectors/{detector}/flps").Subrouter() - apiInventoryDetectorFlps.HandleFunc("", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiInventoryDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - apiInventoryDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) - - // async-start of http Service and capture error - go func() { - err := httpsvr.ListenAndServe() - if err != nil { - log.WithError(err).Error("HTTP service returned error") - } - }() - return httpsvr -} diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 58720276c..dc86586c7 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc v4.24.2 // source: protos/apricot.proto package apricotpb @@ -1910,7 +1910,7 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, - 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xa4, 0x0d, 0x0a, 0x07, 0x41, + 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xea, 0x0d, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, @@ -2017,13 +2017,17 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, - 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, - 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2106,29 +2110,31 @@ var file_protos_apricot_proto_depIdxs = []int32{ 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest 2, // 28: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery 25, // 29: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 11, // 30: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 12, // 31: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 12, // 32: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 33: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 22, // 34: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 24, // 35: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 10, // 36: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse - 8, // 37: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 22, // 38: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 27, // 39: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 29, // 40: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 41: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 42: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 20, // 43: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 44: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 20, // 45: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 46: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 47: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 48: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 2, // 49: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery - 26, // 50: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 30, // [30:51] is the sub-list for method output_type - 9, // [9:30] is the sub-list for method input_type + 1, // 30: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty + 11, // 31: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 32: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 33: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 34: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 22, // 35: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 24, // 36: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 37: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 38: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 22, // 39: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 27, // 40: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 29, // 41: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 42: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 43: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 20, // 44: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 45: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 20, // 46: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 20, // 47: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 48: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 49: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 2, // 50: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery + 26, // 51: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 1, // 52: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty + 31, // [31:53] is the sub-list for method output_type + 9, // [9:31] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index dc8f40fc8..6b37f8fe0 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -56,6 +56,7 @@ service Apricot { rpc GetComponentConfigurationWithLastIndex(ComponentRequest) returns (ComponentResponseWithLastIndex) {} rpc ResolveComponentQuery(ComponentQuery) returns (ComponentQuery) {} rpc ImportComponentConfiguration(ImportComponentConfigurationRequest) returns (ImportComponentConfigurationResponse) {} + rpc InvalidateComponentTemplateCache(Empty) returns (Empty) {} } // NOTE: make sure the enum values include and match those in RunType in dcs.pb.go and runtype.go diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 4a0652610..0e06a91a1 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc v4.24.2 // source: protos/apricot.proto package apricotpb @@ -46,6 +46,7 @@ type ApricotClient interface { GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) ResolveComponentQuery(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentQuery, error) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) + InvalidateComponentTemplateCache(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) } type apricotClient struct { @@ -245,6 +246,15 @@ func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *Im return out, nil } +func (c *apricotClient) InvalidateComponentTemplateCache(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/apricot.Apricot/InvalidateComponentTemplateCache", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ApricotServer is the server API for Apricot service. // All implementations should embed UnimplementedApricotServer // for forward compatibility @@ -273,6 +283,7 @@ type ApricotServer interface { GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) ResolveComponentQuery(context.Context, *ComponentQuery) (*ComponentQuery, error) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) + InvalidateComponentTemplateCache(context.Context, *Empty) (*Empty, error) } // UnimplementedApricotServer should be embedded to have forward compatible implementations. @@ -342,6 +353,9 @@ func (UnimplementedApricotServer) ResolveComponentQuery(context.Context, *Compon func (UnimplementedApricotServer) ImportComponentConfiguration(context.Context, *ImportComponentConfigurationRequest) (*ImportComponentConfigurationResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ImportComponentConfiguration not implemented") } +func (UnimplementedApricotServer) InvalidateComponentTemplateCache(context.Context, *Empty) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method InvalidateComponentTemplateCache not implemented") +} // UnsafeApricotServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ApricotServer will @@ -732,6 +746,24 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. return interceptor(ctx, in, info, handler) } +func _Apricot_InvalidateComponentTemplateCache_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).InvalidateComponentTemplateCache(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/apricot.Apricot/InvalidateComponentTemplateCache", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).InvalidateComponentTemplateCache(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + // Apricot_ServiceDesc is the grpc.ServiceDesc for Apricot service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -823,6 +855,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "ImportComponentConfiguration", Handler: _Apricot_ImportComponentConfiguration_Handler, }, + { + MethodName: "InvalidateComponentTemplateCache", + Handler: _Apricot_InvalidateComponentTemplateCache_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/apricot.proto", diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 2bc155f03..45ae0cb56 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -488,6 +488,15 @@ func (m *RpcServer) ImportComponentConfiguration(_ context.Context, request *apr return response, nil } +func (m *RpcServer) InvalidateComponentTemplateCache(_ context.Context, _ *apricotpb.Empty) (*apricotpb.Empty, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + m.service.InvalidateComponentTemplateCache() + return &apricotpb.Empty{}, nil +} + func (m *RpcServer) logMethod() { if !viper.GetBool("verbose") { return diff --git a/apricot/remote/service.go b/apricot/remote/service.go index f7bb925b0..e00c15e4d 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -368,3 +368,7 @@ func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, newTimestamp = response.NewTimestamp return } + +func (c *RemoteService) InvalidateComponentTemplateCache() { + _, _ = c.cli.InvalidateComponentTemplateCache(context.Background(), &apricotpb.Empty{}, grpc.EmptyCallOption{}) +} diff --git a/configuration/service.go b/configuration/service.go index 97b544b39..1e78d8cff 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -39,6 +39,7 @@ type Service interface { NewRunNumber() (runNumber uint32, err error) GetDefaults() map[string]string GetVars() map[string]string + InvalidateComponentTemplateCache() GetComponentConfiguration(query *componentcfg.Query) (payload string, err error) GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) From 1f02297ff614ac3eb2037c3f3159648b2ef9da2d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 14:05:29 +0100 Subject: [PATCH 1755/2352] [build] Add Swaggo tool for generating Apricot HTTP docs --- common/tools/tools.go | 12 +++++++----- go.mod | 13 +++++++++++++ go.sum | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+), 5 deletions(-) diff --git a/common/tools/tools.go b/common/tools/tools.go index 390f9e117..c2319f088 100644 --- a/common/tools/tools.go +++ b/common/tools/tools.go @@ -1,3 +1,6 @@ +//go:build tools +// +build tools + /* * === This file is part of ALICE O² === * @@ -22,10 +25,6 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ - -// +build tools - - package tools import ( @@ -37,4 +36,7 @@ import ( // enumer _ "github.com/dmarkham/enumer" -) \ No newline at end of file + + // swaggo + _ "github.com/swaggo/swag/cmd/swag" +) diff --git a/go.mod b/go.mod index 15983d038..7301613e6 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,10 @@ require ( ) require ( + github.com/KyleBanks/depth v1.2.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/acomagu/bufpipe v1.0.4 // indirect github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -90,6 +93,10 @@ require ( github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.4.1 // indirect github.com/go-logr/logr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.19.15 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -106,6 +113,7 @@ require ( github.com/huandu/xstrings v1.4.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect + github.com/josharian/intern v1.0.0 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect @@ -113,6 +121,7 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect + github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect @@ -141,6 +150,8 @@ require ( github.com/spf13/cast v1.5.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect + github.com/swaggo/swag v1.16.2 // indirect + github.com/urfave/cli/v2 v2.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect @@ -155,6 +166,8 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect ) replace github.com/codahale/hdrhistogram => github.com/HdrHistogram/hdrhistogram-go v1.0.1 diff --git a/go.sum b/go.sum index 362f7b291..a658ba056 100644 --- a/go.sum +++ b/go.sum @@ -41,6 +41,8 @@ github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1r github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= +github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= @@ -54,6 +56,10 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs= github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -93,6 +99,7 @@ github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUK github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= @@ -147,6 +154,16 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= +github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= +github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= +github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= +github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= +github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -285,6 +302,8 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -322,6 +341,10 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= +github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -445,6 +468,7 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -454,6 +478,7 @@ github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -493,9 +518,13 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= +github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a/go.mod h1:76q+dZ4qOCuYrqwoUUjVCuAXF1TXB4jc98eaZFo6Yh0= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= @@ -617,6 +646,7 @@ golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= @@ -692,6 +722,7 @@ golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -899,6 +930,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= @@ -908,10 +940,13 @@ gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -924,3 +959,5 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From b95123c375f924b6cef28e0d400a92341f3eb941 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 14:26:35 +0100 Subject: [PATCH 1756/2352] [build] Update dependencies --- common/gera/map.go | 4 +- common/gera/stringmap.go | 2 +- configuration/template/stack.go | 2 +- core/integration/dcs/plugin.go | 2 +- core/task/channel/inbound.go | 18 +- core/task/channel/outbound.go | 38 +- go.mod | 108 +++--- go.sum | 600 +++++++------------------------- 8 files changed, 210 insertions(+), 564 deletions(-) diff --git a/common/gera/map.go b/common/gera/map.go index 5eb0a9727..c3ecfaf3c 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -29,7 +29,7 @@ package gera import ( - "github.com/imdario/mergo" + "dario.cat/mergo" ) type Map interface { @@ -215,4 +215,4 @@ func (w *WrapMap) Raw() map[string]interface{} { return nil } return w.theMap -} \ No newline at end of file +} diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 17d7752cb..13dd1163f 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -27,7 +27,7 @@ package gera import ( "sync" - "github.com/imdario/mergo" + "dario.cat/mergo" "gopkg.in/yaml.v3" ) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index bb3e18fc6..c33d8ba39 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -32,11 +32,11 @@ import ( "strconv" "strings" + "dario.cat/mergo" apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/repos" - "github.com/imdario/mergo" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 9d06e0ff1..c9859c277 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -38,6 +38,7 @@ import ( "sync" "time" + "dario.cat/mergo" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -45,7 +46,6 @@ import ( "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/AliceO2Group/Control/core/workflow/callable" - "github.com/imdario/mergo" "github.com/spf13/viper" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" diff --git a/core/task/channel/inbound.go b/core/task/channel/inbound.go index f2b95e908..964678289 100644 --- a/core/task/channel/inbound.go +++ b/core/task/channel/inbound.go @@ -29,22 +29,22 @@ import ( "strconv" "strings" + "dario.cat/mergo" "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/imdario/mergo" ) type Inbound struct { Channel - Global string `yaml:"global"` - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Global string `yaml:"global"` + Addressing AddressFormat `yaml:"addressing"` //default: tcp // Addressing is ignored if Target not empty, because it means the WFT/TT is // setting a static TCP or IPC bind address. } func (inbound *Inbound) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { aux := struct { - Global string `yaml:"global"` - Addressing AddressFormat `yaml:"addressing"` //default: tcp + Global string `yaml:"global"` + Addressing AddressFormat `yaml:"addressing"` //default: tcp }{} err = unmarshal(&aux) if err != nil { @@ -105,7 +105,7 @@ chans.data1.0.sndKernelSize = 0 chans.data1.0.transport = default [provided] chans.data1.0.type = push [provided] chans.data1.numSockets = 1 - */ +*/ func (inbound *Inbound) ToFMQMap(bindMap BindMap) (pm controlcommands.PropertyMap, err error) { if inbound == nil { @@ -177,7 +177,7 @@ func MergeInbound(hp, lp []Inbound) (channels []Inbound) { for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { _ = mergo.Merge(&pCh, v) updated = true break @@ -187,6 +187,6 @@ func MergeInbound(hp, lp []Inbound) (channels []Inbound) { channels = append(channels, v) } } - + return -} \ No newline at end of file +} diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index df61ff3bf..a9855df0d 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -29,8 +29,8 @@ import ( "strconv" "strings" + "dario.cat/mergo" "github.com/AliceO2Group/Control/core/controlcommands" - "github.com/imdario/mergo" "github.com/sirupsen/logrus" ) @@ -136,43 +136,43 @@ func (outbound *Outbound) buildFMQMap(address string, transport TransportType) ( pm[strings.Join([]string{chans, chName, "numSockets"}, ".")] = "1" prefix := strings.Join([]string{chans, chName, "0"}, ".") - chanProps := controlcommands.PropertyMap { - "address": address, - "method": "connect", - "rateLogging": outbound.RateLogging, - "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), + chanProps := controlcommands.PropertyMap{ + "address": address, + "method": "connect", + "rateLogging": outbound.RateLogging, + "rcvBufSize": strconv.Itoa(outbound.RcvBufSize), "rcvKernelSize": "0", //NOTE: hardcoded - "sndBufSize": strconv.Itoa(outbound.SndBufSize), + "sndBufSize": strconv.Itoa(outbound.SndBufSize), "sndKernelSize": "0", //NOTE: hardcoded - "transport": transport.String(), - "type": outbound.Type.String(), + "transport": transport.String(), + "type": outbound.Type.String(), } if (transport != outbound.Transport) && (outbound.Transport != DEFAULT) { log.WithFields(logrus.Fields{ - "address": address, - "oubound": outbound.Name, - "actualInboundTransport": transport, - "outboundTransport": outbound.Transport, - }). + "address": address, + "oubound": outbound.Name, + "actualInboundTransport": transport, + "outboundTransport": outbound.Transport, + }). Warn("channel transport mismatch, fix workflow template") } for k, v := range chanProps { - pm[prefix + "." + k] = v + pm[prefix+"."+k] = v } return } -func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { +func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { channels = make([]Outbound, len(hp)) copy(channels, hp) for _, v := range lp { updated := false for _, pCh := range channels { - if v.Name == pCh.Name { + if v.Name == pCh.Name { mergo.Merge(&pCh, v) updated = true break @@ -182,6 +182,6 @@ func MergeOutbound(hp,lp []Outbound) (channels []Outbound) { channels = append(channels, v) } } - + return -} \ No newline at end of file +} diff --git a/go.mod b/go.mod index 7301613e6..60d113343 100644 --- a/go.mod +++ b/go.mod @@ -16,26 +16,29 @@ replace github.com/coreos/bbolt => go.etcd.io/bbolt v1.3.6 // Issue: https://github.com/rivo/tview/issues/416 // tview should be version 0ba8301b415c otherwise peanut will deadlock +replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.16 + +replace github.com/armon/go-metrics => github.com/hashicorp/go-metrics v0.5.3 + require ( github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/antonmedv/expr v1.12.6 + github.com/antonmedv/expr v1.15.5 github.com/briandowns/spinner v1.23.0 github.com/denisbrodbeck/machineid v1.0.1 github.com/dmarkham/enumer v1.5.8 - github.com/fatih/color v1.15.0 + github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.6.0 - github.com/go-git/go-git/v5 v5.7.0 + github.com/go-git/go-git/v5 v5.10.1 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.3.0 - github.com/gorilla/mux v1.8.0 - github.com/hashicorp/consul/api v1.22.0 - github.com/imdario/mergo v0.3.16 - github.com/jinzhu/copier v0.3.5 + github.com/google/uuid v1.4.0 + github.com/gorilla/mux v1.8.1 + github.com/hashicorp/consul/api v1.26.1 + github.com/jinzhu/copier v0.4.0 github.com/k0kubun/pp v3.0.1+incompatible github.com/looplab/fsm v1.0.1 github.com/mesos/mesos-go v0.0.11 @@ -44,54 +47,56 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/osamingo/indigo v1.1.1 github.com/pborman/uuid v1.2.1 - github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/client_golang v1.17.0 github.com/pseudomuto/protoc-gen-doc v1.5.1 - github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf + github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6 github.com/rs/xid v1.5.0 github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/kafka-go v0.4.42 + github.com/segmentio/kafka-go v0.4.46 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.7.0 + github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.16.0 + github.com/spf13/viper v1.17.0 github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.11.0 - golang.org/x/net v0.12.0 - golang.org/x/sys v0.10.0 - google.golang.org/grpc v1.56.2 + golang.org/x/crypto v0.16.0 + golang.org/x/net v0.19.0 + golang.org/x/sys v0.15.0 + google.golang.org/grpc v1.59.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.31.0 gopkg.in/yaml.v3 v3.0.1 ) require ( + dario.cat/mergo v1.0.0 github.com/flosch/pongo2/v6 v6.0.0 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 - github.com/onsi/gomega v1.27.8 + github.com/onsi/gomega v1.27.10 + github.com/swaggo/swag v1.16.2 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 // indirect + github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect - github.com/acomagu/bufpipe v1.0.4 // indirect - github.com/armon/go-metrics v0.4.1 // indirect + github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cloudflare/circl v1.3.3 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect + github.com/cloudflare/circl v1.3.6 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gdamore/encoding v1.0.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.4.1 // indirect + github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-openapi/jsonpointer v0.19.5 // indirect github.com/go-openapi/jsonreference v0.19.6 // indirect @@ -100,32 +105,33 @@ require ( github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/go-cmp v0.5.9 // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/huandu/xstrings v1.4.0 // indirect + github.com/imdario/mergo v0.3.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.3 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -134,36 +140,38 @@ require ( github.com/naoina/go-stringutil v0.1.0 // indirect github.com/osamingo/base58 v1.0.0 // indirect github.com/pascaldekloe/name v1.0.1 // indirect - github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/pelletier/go-toml/v2 v2.1.0 // indirect github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.44.0 // indirect - github.com/prometheus/procfs v0.11.0 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect - github.com/skeema/knownhosts v1.2.0 // indirect - github.com/sony/sonyflake v1.1.0 // indirect - github.com/spf13/afero v1.9.5 // indirect - github.com/spf13/cast v1.5.1 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/swaggo/swag v1.16.2 // indirect + github.com/skeema/knownhosts v1.2.1 // indirect + github.com/sony/sonyflake v1.2.0 // indirect + github.com/sourcegraph/conc v0.3.0 // indirect + github.com/spf13/afero v1.11.0 // indirect + github.com/spf13/cast v1.6.0 // indirect + github.com/subosito/gotenv v1.6.0 // indirect github.com/urfave/cli/v2 v2.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect - golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 // indirect - golang.org/x/mod v0.12.0 // indirect - golang.org/x/term v0.10.0 // indirect - golang.org/x/text v0.11.0 // indirect - golang.org/x/tools v0.11.0 // indirect - google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 // indirect + go.uber.org/multierr v1.11.0 // indirect + golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/term v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect + golang.org/x/tools v0.16.0 // indirect + google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index a658ba056..e899e2abc 100644 --- a/go.sum +++ b/go.sum @@ -1,45 +1,8 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= +dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= @@ -54,25 +17,20 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95 h1:KLq8BE0KwCL+mmXnjLWEAOYO+2l2AE4YMmqG1ZpZHBs= -github.com/ProtonMail/go-crypto v0.0.0-20230717121422-5aa5874ade95/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= +github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ= -github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/antonmedv/expr v1.12.6 h1:qtgMHOFissxhePwokx0xB9eqS6PUy0SbhDRPD67PInA= -github.com/antonmedv/expr v1.12.6/go.mod h1:FPC8iWArxls7axbVLsW+kpg1mz29A1b2M6jt+hZfDkU= +github.com/antonmedv/expr v1.15.5 h1:y0Iz3cEwmpRz5/r3w4qQR0MfIqJGdGM1zbhD/v0G5Vg= +github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA= -github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= @@ -84,27 +42,22 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg= +github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= +github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= +github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -112,27 +65,21 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= -github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= +github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= @@ -140,14 +87,11 @@ github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5 github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4= -github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8= -github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE= -github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= +github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git/v5 v5.10.1 h1:tu8/D8i+TWxgKpzQ3Vc43e+kkhXqtsZCKI/egajKnxk= +github.com/go-git/go-git/v5 v5.10.1/go.mod h1:uEuHjxkHap8kAl//V5F/nNWwqIYtP/402ddd05mp0wg= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -173,80 +117,32 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/hashicorp/consul/api v1.22.0 h1:ydEvDooB/A0c/xpsBd8GSt7P2/zYPBui4KrNip0xGjE= -github.com/hashicorp/consul/api v1.22.0/go.mod h1:zHpYgZ7TeYqS6zaszjwSt128OwESRpnhU9aGa6ue3Eg= -github.com/hashicorp/consul/sdk v0.14.0 h1:Hly+BMNMssVzoWddbBnBFi3W+Fzytvm0haSkihhj3GU= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= +github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= +github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= +github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= +github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -258,6 +154,8 @@ github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVH github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYSucoNE= +github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= @@ -275,9 +173,8 @@ github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/b github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= -github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= @@ -292,22 +189,18 @@ github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= -github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= -github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= +github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= +github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= @@ -321,13 +214,11 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= +github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -345,8 +236,6 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= -github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -361,14 +250,15 @@ github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOA github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -403,8 +293,8 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.8 h1:gegWiwZjBsf2DgiSbf5hpokZ98JVDMcWkUiigk6/KXc= -github.com/onsi/gomega v1.27.8/go.mod h1:2J8vzI/s+2shY9XHRApDkdgPo1TKT7P2u6fXeJKFnNQ= +github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= +github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= github.com/osamingo/indigo v1.1.1 h1:tjPwqwZIq6pqUzfMxCKQeSaFRW0MzLrdT3lszGqYSpg= @@ -416,8 +306,8 @@ github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcM github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= +github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= @@ -427,7 +317,6 @@ github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= @@ -437,45 +326,47 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BU github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.11.0 h1:5EAgkfkMl659uZPbe9AS2N68a7Cc1TJbPEuGzFuRbyk= -github.com/prometheus/procfs v0.11.0/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf h1:IchpMMtnfvzg7T3je672bP1nKWz1M4tW3kMZT6CbgoM= -github.com/rivo/tview v0.0.0-20230621164836-6cc0565babaf/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6 h1:7UMY2qN9VlcY+x9jlhpYe5Bf1zrdhvmfZyLMk2u65BM= +github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= +github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= +github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= +github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.4.42 h1:qffhBZCz4WcWyNuHEclHjIMLs2slp6mZO8px+5W5tfU= -github.com/segmentio/kafka-go v0.4.42/go.mod h1:d0g15xPMqoUookug0OU75DhGZxXwCFxSLeJ4uphwJzg= +github.com/segmentio/kafka-go v0.4.46 h1:Sx8/kvtY+/G8nM0roTNnFezSJj3bT2sW0Xy/YY3CgBI= +github.com/segmentio/kafka-go v0.4.46/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -484,22 +375,22 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.0 h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM= -github.com/skeema/knownhosts v1.2.0/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo= -github.com/sony/sonyflake v1.1.0 h1:wnrEcL3aOkWmPlhScLEGAXKkLAIslnBteNUq4Bw6MM4= -github.com/sony/sonyflake v1.1.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= -github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM= -github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= +github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= +github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= +github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= +github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= +github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= +github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= +github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= +github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -508,7 +399,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -516,8 +406,8 @@ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1F github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= +github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= +github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= @@ -546,104 +436,38 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= -golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1 h1:MGwJjxBy0HJshjDNfLsYO8xppfqWlA5ZT9OhtUUhTNw= -golang.org/x/exp v0.0.0-20230713183714-613f0c0eb8a1/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= -golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= +golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= @@ -651,80 +475,40 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= -golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -734,194 +518,60 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= -golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= -golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= -golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= -golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753 h1:+VoAg+OKmWaommL56xmZSE2sUK8A7m6SUO7X89F2tbw= -google.golang.org/genproto v0.0.0-20230717213848-3f92550aa753/go.mod h1:iqkVr8IRpZ53gx1dEnWlCUIEwDWqWARWrbzpasaTNYM= -google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753 h1:lCbbUxUDD+DiXx9Q6F/ttL0aAu7N2pz8XnmMm8ZW4NE= -google.golang.org/genproto/googleapis/api v0.0.0-20230717213848-3f92550aa753/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753 h1:XUODHrpzJEUeWmVo/jfNTLj0YyVveOo28oE6vkFbkO4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230717213848-3f92550aa753/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.56.2 h1:fVRFRnXvU+x6C4IlHZewvJOVHoOv1TUuQyoRsYnB4bI= -google.golang.org/grpc v1.56.2/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= +google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= +google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= +google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= @@ -932,8 +582,6 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -949,15 +597,5 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= From 151e5dbf37ba92615a2505e509c193329086026b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 Nov 2023 15:36:38 +0100 Subject: [PATCH 1757/2352] [apricot] Correct documentation path --- apricot/{doc => docs}/apricot.md | 0 apricot/{doc => docs}/apricot_http_service.md | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename apricot/{doc => docs}/apricot.md (100%) rename apricot/{doc => docs}/apricot_http_service.md (100%) diff --git a/apricot/doc/apricot.md b/apricot/docs/apricot.md similarity index 100% rename from apricot/doc/apricot.md rename to apricot/docs/apricot.md diff --git a/apricot/doc/apricot_http_service.md b/apricot/docs/apricot_http_service.md similarity index 100% rename from apricot/doc/apricot_http_service.md rename to apricot/docs/apricot_http_service.md From b3be9f74b1ab882cde94086b5736f8e5ec37ff52 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:32:50 +0100 Subject: [PATCH 1758/2352] [docs] Add swaggo to Makefile --- Makefile | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 99a891664..a5d1a909b 100644 --- a/Makefile +++ b/Makefile @@ -250,16 +250,23 @@ tools/protoc: @export GOBIN="$(ROOT_DIR)/tools" && cat common/tools/tools.go | grep _ | awk -F'"' '{print $$2}' | xargs -tI % go install -mod=readonly % -docs: doc +docs: docs/coconut docs/grpc docs/swaggo -doc: +docs/coconut: @echo -e "generating coconut documentation \033[1;33m==>\033[0m \033[1;34m./coconut/doc\033[0m" @cd coconut/doc && go run . && cd ../.. + +docs/grpc: @echo -e "generating gRPC API documentation \033[1;33m==>\033[0m \033[1;34m./docs\033[0m" @cd apricot/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_apricot.md "apricot.proto" @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_aliecs.md "o2control.proto" @cd occ/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_occ.md "occ.proto" +docs/swaggo: + @echo -e "generating REST API documentation \033[1;33m==>\033[0m \033[1;34m./apricot/docs\033[0m" + @tools/swag fmt -d apricot + @tools/swag init -o apricot/docs -d apricot/local,apricot,cmd/o2-apricot -g servicehttp.go + help: @echo "available make variables:" @echo " V - Build verbosity {0,1,2}." From a742e264490766e5d915e937e0a906182ce24700 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:33:11 +0100 Subject: [PATCH 1759/2352] [docs] Update Apricot HTTP API intro --- apricot/docs/apricot_http_service.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/apricot/docs/apricot_http_service.md b/apricot/docs/apricot_http_service.md index a649de72e..8c5bdb723 100644 --- a/apricot/docs/apricot_http_service.md +++ b/apricot/docs/apricot_http_service.md @@ -1,10 +1,10 @@ ## apricot HTTP service -Web server component that implements the Trivial Configuration Endpoint (Apricot TCE). +Web server component that implements the REST Configuration Endpoint (Apricot RCE). -It serves JSON and/or plain text structures in order to make essential cluster information available to scripts and other consumers for which the gRPC interface is impractical. +It serves JSON and/or plain text structures in order to make essential cluster information and component configuration available to scripts and other consumers for which the gRPC interface is impractical. -It is strictly **read-only** and only ever responds to `GET`. +It is strictly **read-only** and only ever responds to `GET` (except for the special purpose `POST` call `/components/_invalidate_cache`, called only by Consul). ### Configuration @@ -12,6 +12,8 @@ To use this feature, the `o2-apricot` running machine has to communicate with Co ### Usage and options +The default port is `32188`. + To retrieve the information needed regarding FLPs, use the following urls in a web browser or with `curl` or `wget`. To retrieve as plain text: @@ -22,6 +24,13 @@ To retrieve as JSON: * `http:///inventory/flps/json` * `http:///inventory/detectors//flps/json` +To retrieve a component configuration payload, use the following urls in a web browser or with `curl` or `wget`. + +* `http:///components////?process=true` - with template processing +* `http:///components////?process=false` - without template processing, returns the entry verbatim + +The full API documentation is available at `http:///docs/` wherever your Apricot instance is running. This documentation interface also allows to perform API calls directly from the browser. + ### Examples * With `curl`: `curl http://localhost:32188/inventory/flps` From 50aed4ee404cb54bd00a708ede1b6f0d0ddfa4d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:33:55 +0100 Subject: [PATCH 1760/2352] [docs] Update gRPC APIdocs for AliECS and Apricot --- docs/apidocs_aliecs.md | 2 ++ docs/apidocs_apricot.md | 1 + 2 files changed, 3 insertions(+) diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 6edc6a02d..6284356c2 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -310,6 +310,8 @@ | integratedServicesData | [EnvironmentInfo.IntegratedServicesDataEntry](#o2control-EnvironmentInfo-IntegratedServicesDataEntry) | repeated | | | numberOfTasks | [int32](#int32) | | | | currentTransition | [string](#string) | | | +| numberOfActiveTasks | [int32](#int32) | | | +| numberOfInactiveTasks | [int32](#int32) | | | diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index 9c16d3da9..1ab6fa571 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -615,6 +615,7 @@ | GetComponentConfigurationWithLastIndex | [ComponentRequest](#apricot-ComponentRequest) | [ComponentResponseWithLastIndex](#apricot-ComponentResponseWithLastIndex) | | | ResolveComponentQuery | [ComponentQuery](#apricot-ComponentQuery) | [ComponentQuery](#apricot-ComponentQuery) | | | ImportComponentConfiguration | [ImportComponentConfigurationRequest](#apricot-ImportComponentConfigurationRequest) | [ImportComponentConfigurationResponse](#apricot-ImportComponentConfigurationResponse) | | +| InvalidateComponentTemplateCache | [Empty](#apricot-Empty) | [Empty](#apricot-Empty) | | From 46fbe5a31b9f158256b14eda810fc14d6aea5bb6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:34:29 +0100 Subject: [PATCH 1761/2352] [build] Add swaggo http and update dependencies --- go.mod | 14 +++++++------- go.sum | 33 ++++++++++++++++++++------------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 60d113343..99e1e50cb 100644 --- a/go.mod +++ b/go.mod @@ -77,14 +77,13 @@ require ( github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 github.com/onsi/gomega v1.27.10 + github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.2 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect - github.com/PuerkitoBio/purell v1.1.1 // indirect - github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect @@ -98,10 +97,10 @@ require ( github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-logr/logr v1.2.4 // indirect - github.com/go-openapi/jsonpointer v0.19.5 // indirect - github.com/go-openapi/jsonreference v0.19.6 // indirect - github.com/go-openapi/spec v0.20.4 // indirect - github.com/go-openapi/swag v0.19.15 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/spec v0.20.9 // indirect + github.com/go-openapi/swag v0.22.4 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -127,7 +126,7 @@ require ( github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.6 // indirect + github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect @@ -158,6 +157,7 @@ require ( github.com/spf13/afero v1.11.0 // indirect github.com/spf13/cast v1.6.0 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/swaggo/files/v2 v2.0.0 // indirect github.com/urfave/cli/v2 v2.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect diff --git a/go.sum b/go.sum index e899e2abc..dc21f1e39 100644 --- a/go.sum +++ b/go.sum @@ -19,10 +19,6 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -99,15 +95,20 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs= -github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns= -github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M= -github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= +github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -219,6 +220,7 @@ github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6K github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -234,8 +236,9 @@ github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0V github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -404,10 +407,15 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= +github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= +github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= +github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSyIKC9OBg= +github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= @@ -470,7 +478,6 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= -golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= @@ -507,7 +514,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -582,6 +588,7 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= From 5dfd9e29bd72a47e3acf9bea2816b45505c3a7b9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:35:06 +0100 Subject: [PATCH 1762/2352] [docs] Add Apricot documentation to mkdocs.yml --- mkdocs.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 98626aa68..2cc3d7822 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -7,7 +7,12 @@ nav: - Basic Concepts: handbook/concepts.md - Configuration: - Workflow Configuration: handbook/configuration.md - - Component Configuration: handbook/appconfiguration.md + - Apricot Usage: './apricot/docs/apricot.md' + - Apricot HTTP API: './apricot/docs/apricot_api.md' + - gRPC APIs: + - AliECS gRPC API: apidocs_aliecs.md + - Apricot gRPC API: apidocs_apricot.md + - OCC gRPC API (Protobuf based): apidocs_occ.md - Workflow Variables: '../controlworkflows/README.md' - 'Command Reference': - coconut: From 2ed12cd814dbc976c02b27d6da0b0219092882af Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:35:50 +0100 Subject: [PATCH 1763/2352] [apricot] Add http-swaggo inline documentation to Apricot HTTP API --- apricot/local/servicehttp.go | 109 +++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 8f19131e7..a43fab28e 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -34,18 +34,31 @@ import ( "strings" "time" + _ "github.com/AliceO2Group/Control/apricot/docs" apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/gorilla/mux" "github.com/spf13/viper" + httpSwagger "github.com/swaggo/http-swagger/v2" ) type HttpService struct { svc configuration.Service } +// @title O² Apricot REST API +// @version 1.0 +// @description REST API for ALICE O² Apricot configuration service + +// @contact.name O² FLP support +// @contact.url https://alice-flp.docs.cern.ch/ +// @contact.email alice-o2-flp-support@cern.ch + +// @externalDocs.description AliECS handbook +// @externalDocs.url https://alice-flp.docs.cern.ch/aliecs/handbook/ + func NewHttpService(service configuration.Service) (svr *http.Server) { router := mux.NewRouter() httpsvc := &HttpService{ @@ -58,6 +71,9 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { ReadTimeout: 15 * time.Second, } + // documentation endpoint + _ = router.PathPrefix("/docs/").Handler(httpSwagger.WrapHandler) + // component configuration API // GET /components @@ -115,6 +131,17 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { return httpsvr } +// ApiListComponents lists configuration components +// +// @Summary List Apricot-managed configuration components +// @Description Returns a list of all configuration components managed by Apricot +// @Tags component configuration +// @Produce json +// @Produce plain +// @Param format query string false "Output format, json or text" Enums(json, text) Default(text) +// @Success 200 {array} string "List of components, either as JSON array or comma-separated plain text" +// @Failure 500 {string} string "Internal server error" +// @Router /components [get] func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Request) { queryArgs := r.URL.Query() format := queryArgs.Get("format") @@ -163,12 +190,38 @@ func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Req } } +// ApiInvalidateCache clears the component template cache +// +// @Summary Clear cache of Apricot-managed configuration component templates +// @Description Invalidates all cached templates for all configuration components managed by Apricot +// @Tags component configuration +// @Produce plain +// @Success 200 +// @Router /components/_invalidate_cache [post] func (httpsvc *HttpService) ApiInvalidateCache(w http.ResponseWriter, r *http.Request) { httpsvc.svc.InvalidateComponentTemplateCache() w.WriteHeader(http.StatusOK) _, _ = fmt.Fprintln(w, "OK") } +// ApiListComponentEntries lists all entries for a given configuration component +// +// @Summary Lists all entries for an Apricot-managed configuration component +// @Description Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include "ANY"/"any" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under "ANY" and "any" paths corresponding to fallback values valid for all run types or role names. +// @Tags component configuration +// @Produce json +// @Produce plain +// @Param format query string false "Output format, json or text" Enums(json, text) Default(text) +// @Param raw query boolean false "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any" Default(false) +// @Param component path string true "Configuration component" +// @Param runtype path string false "O² Run type, must be capitalized" Default(ANY) +// @Param rolename path string false "Role name" Default(any) +// @Success 200 {array} string "List of entries, either as JSON array or comma-separated plain text" +// @Failure 400 {string} string "Bad request, if the run type is invalid" +// @Failure 500 {string} string "Internal server error" +// @Router /components/{component} [get] +// @Router /components/{component}/{runtype} [get] +// @Router /components/{component}/{runtype}/{rolename} [get] func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *http.Request) { // GET /components/{component} returns all, raw is ignored // runtype = {runtype} rolename = any, raw excludes ANY runtype, if false returns all @@ -288,6 +341,20 @@ func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *ht } } +// ApiResolveComponentQuery resolves a query for a given component, run type, role name and entry key +// +// @Summary Resolves a query for a given component, run type, role name and entry key +// @Description Returns a resolved path for a given component, run type, role name and entry key. The path points to an actual existing entry in Consul, resolving ANY run type and any rolename wildcards. +// @Tags component configuration +// @Produce plain +// @Param component path string true "Configuration component" +// @Param runtype path string true "O² Run type, must be capitalized" +// @Param rolename path string true "Role name" +// @Param entry path string true "Entry key" +// @Success 200 {string} string "Resolved path for the queried entry" +// @Failure 400 {string} string "Bad request, if a parameter is invalid" +// @Failure 500 {string} string "Internal server error" +// @Router /components/{component}/{runtype}/{rolename}/{entry}/resolve [get] func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *http.Request) { // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path // like {component}/{runtype}/{rolename}/{entry} @@ -351,6 +418,21 @@ func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *h _, _ = fmt.Fprintln(w, resolvedStr) } +// ApiGetComponentConfiguration returns the processed configuration payload for a given component, run type, role name and entry key +// +// @Summary Returns a configuration payload for a given component, run type, role name and entry key +// @Description The provided component, run type, role name and entry key are used to query the configuration service for a configuration entry, which is then processed in the O² Apricot template system to produce the final payload, and returned as string.. +// @Tags component configuration +// @Produce plain +// @Param process query boolean false "If true, template processing is performed to produce the final payload; if false, the entry is returned verbatim. In the true case, any number of additional string key-value pairs may be passed as query parameters (e.g. ?process=true&mykey1=myvalue1&mykey2=myvalue2), which are then fed into the template system as variables that affect configuration payload generation" Default(false) +// @Param component path string true "Configuration component" +// @Param runtype path string true "O² Run type, must be capitalized" +// @Param rolename path string true "Role name" +// @Param entry path string true "Entry key" +// @Success 200 {string} string "Configuration payload for the queried entry, either processed or verbatim depending on the process flag" +// @Failure 400 {string} string "Bad request, if a parameter is invalid" +// @Failure 500 {string} string "Internal server error" +// @Router /components/{component}/{runtype}/{rolename}/{entry} [get] func (httpsvc *HttpService) ApiGetComponentConfiguration(w http.ResponseWriter, r *http.Request) { // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload // that may be processed or not depending on process=true or false @@ -438,10 +520,28 @@ func (httpsvc *HttpService) ApiGetComponentConfiguration(w http.ResponseWriter, _, _ = fmt.Fprintln(w, payload) } +// ApiGetFlps returns the list of FLPs in the cluster known to Apricot +// +// @Summary Returns the list of FLPs in the cluster known to Apricot +// @Description Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs, newline-separated or JSON depending on the format parameter +// @Tags cluster inventory +// @Param format path string false "Output format, json or text" Enums(json, text) Default(text) +// @Produce plain +// @Success 200 {string} string "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter" +// @Router /inventory/flps/{format} [get] func (httpsvc *HttpService) ApiGetFlps(w http.ResponseWriter, r *http.Request) { httpsvc.ApiGetHostInventory(w, r, "") } +// ApiGetDetectorFlps returns the list of FLPs in the cluster that serve a given detector +// +// @Summary Returns the list of FLPs in the cluster that serve a given detector +// @Description Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs and serving the given detector, newline-separated or JSON depending on the format parameter +// @Tags cluster inventory +// @Param format path string false "Output format, json or text" Enums(json, text) Default(text) +// @Produce plain +// @Success 200 {string} string "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter" +// @Router /inventory/detectors/{detector}/flps/{format} [get] func (httpsvc *HttpService) ApiGetDetectorFlps(w http.ResponseWriter, r *http.Request) { queryParam := mux.Vars(r) detector := queryParam["detector"] @@ -461,6 +561,15 @@ func (httpsvc *HttpService) ApiGetHostInventory(w http.ResponseWriter, r *http.R httpsvc.ApiPrintClusterInformation(w, r, hosts, nil) } +// ApiGetDetectorsInventory returns the list of detectors belonging to the installed instance known to Apricot +// +// @Summary Returns the list of detectors belonging to the installed instance known to Apricot +// @Description Returns the list of all detectors known to Apricot that belong to the installed instance, newline-separated or JSON depending on the format parameter +// @Tags cluster inventory +// @Param format path string false "Output format, json or text" Enums(json, text) Default(text) +// @Produce plain +// @Success 200 {string} string "List of detectors in the instance known to Apricot, newline-separated or JSON depending on the format parameter" +// @Router /inventory/detectors/{format} [get] func (httpsvc *HttpService) ApiGetDetectorsInventory(w http.ResponseWriter, r *http.Request) { inventory, err := httpsvc.svc.GetDetectorsInventory() if err != nil { From 2f93408338b83a58a526454d933a11ab8cbf1a17 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 Nov 2023 17:36:52 +0100 Subject: [PATCH 1764/2352] [build] Commit swaggo-generated Apricot HTTP API docs --- apricot/docs/docs.go | 545 ++++++++++++++++++++++++++++++++++++++ apricot/docs/swagger.json | 519 ++++++++++++++++++++++++++++++++++++ apricot/docs/swagger.yaml | 409 ++++++++++++++++++++++++++++ 3 files changed, 1473 insertions(+) create mode 100644 apricot/docs/docs.go create mode 100644 apricot/docs/swagger.json create mode 100644 apricot/docs/swagger.yaml diff --git a/apricot/docs/docs.go b/apricot/docs/docs.go new file mode 100644 index 000000000..66d99957e --- /dev/null +++ b/apricot/docs/docs.go @@ -0,0 +1,545 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "contact": { + "name": "O² FLP support", + "url": "https://alice-flp.docs.cern.ch/", + "email": "alice-o2-flp-support@cern.ch" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/components": { + "get": { + "description": "Returns a list of all configuration components managed by Apricot", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "List Apricot-managed configuration components", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of components, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/_invalidate_cache": { + "post": { + "description": "Invalidates all cached templates for all configuration components managed by Apricot", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Clear cache of Apricot-managed configuration component templates", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/components/{component}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "ANY", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "ANY", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path" + }, + { + "type": "string", + "default": "any", + "description": "Role name", + "name": "rolename", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}/{entry}": { + "get": { + "description": "The provided component, run type, role name and entry key are used to query the configuration service for a configuration entry, which is then processed in the O² Apricot template system to produce the final payload, and returned as string..", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Returns a configuration payload for a given component, run type, role name and entry key", + "parameters": [ + { + "type": "boolean", + "default": false, + "description": "If true, template processing is performed to produce the final payload; if false, the entry is returned verbatim. In the true case, any number of additional string key-value pairs may be passed as query parameters (e.g. ?process=true\u0026mykey1=myvalue1\u0026mykey2=myvalue2), which are then fed into the template system as variables that affect configuration payload generation", + "name": "process", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Role name", + "name": "rolename", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Entry key", + "name": "entry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Configuration payload for the queried entry, either processed or verbatim depending on the process flag", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request, if a parameter is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}/{entry}/resolve": { + "get": { + "description": "Returns a resolved path for a given component, run type, role name and entry key. The path points to an actual existing entry in Consul, resolving ANY run type and any rolename wildcards.", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Resolves a query for a given component, run type, role name and entry key", + "parameters": [ + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Role name", + "name": "rolename", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Entry key", + "name": "entry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Resolved path for the queried entry", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request, if a parameter is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/detectors/{detector}/flps/{format}": { + "get": { + "description": "Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs and serving the given detector, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of FLPs in the cluster that serve a given detector", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/detectors/{format}": { + "get": { + "description": "Returns the list of all detectors known to Apricot that belong to the installed instance, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of detectors belonging to the installed instance known to Apricot", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of detectors in the instance known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/flps/{format}": { + "get": { + "description": "Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of FLPs in the cluster known to Apricot", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + } + }, + "externalDocs": { + "description": "AliECS handbook", + "url": "https://alice-flp.docs.cern.ch/aliecs/handbook/" + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "", + BasePath: "", + Schemes: []string{}, + Title: "O² Apricot REST API", + Description: "REST API for ALICE O² Apricot configuration service", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/apricot/docs/swagger.json b/apricot/docs/swagger.json new file mode 100644 index 000000000..df4d73e81 --- /dev/null +++ b/apricot/docs/swagger.json @@ -0,0 +1,519 @@ +{ + "swagger": "2.0", + "info": { + "description": "REST API for ALICE O² Apricot configuration service", + "title": "O² Apricot REST API", + "contact": { + "name": "O² FLP support", + "url": "https://alice-flp.docs.cern.ch/", + "email": "alice-o2-flp-support@cern.ch" + }, + "version": "1.0" + }, + "paths": { + "/components": { + "get": { + "description": "Returns a list of all configuration components managed by Apricot", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "List Apricot-managed configuration components", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + } + ], + "responses": { + "200": { + "description": "List of components, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/_invalidate_cache": { + "post": { + "description": "Invalidates all cached templates for all configuration components managed by Apricot", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Clear cache of Apricot-managed configuration component templates", + "responses": { + "200": { + "description": "OK" + } + } + } + }, + "/components/{component}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "ANY", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}": { + "get": { + "description": "Returns a list of all entries belonging to a given configuration component corresponding to the given query. The component must be provided. If the run type is not provided, entries for all run types are returned. If the role name is not provided, entries for all role names are returned. If the raw flag is true, AApricot will not attempt to include \"ANY\"/\"any\" run types or role names, and will return only the entries stored under the provided Consul path. If the raw flag is false, Apricot will include all entries for the given component, run type and role name, including entries stored under \"ANY\" and \"any\" paths corresponding to fallback values valid for all run types or role names.", + "produces": [ + "application/json", + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Lists all entries for an Apricot-managed configuration component", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "query" + }, + { + "type": "boolean", + "default": false, + "description": "If true, the query returns strictly Consul paths without catching all run types or role names with ANY/any", + "name": "raw", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "default": "ANY", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path" + }, + { + "type": "string", + "default": "any", + "description": "Role name", + "name": "rolename", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of entries, either as JSON array or comma-separated plain text", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "400": { + "description": "Bad request, if the run type is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}/{entry}": { + "get": { + "description": "The provided component, run type, role name and entry key are used to query the configuration service for a configuration entry, which is then processed in the O² Apricot template system to produce the final payload, and returned as string..", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Returns a configuration payload for a given component, run type, role name and entry key", + "parameters": [ + { + "type": "boolean", + "default": false, + "description": "If true, template processing is performed to produce the final payload; if false, the entry is returned verbatim. In the true case, any number of additional string key-value pairs may be passed as query parameters (e.g. ?process=true\u0026mykey1=myvalue1\u0026mykey2=myvalue2), which are then fed into the template system as variables that affect configuration payload generation", + "name": "process", + "in": "query" + }, + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Role name", + "name": "rolename", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Entry key", + "name": "entry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Configuration payload for the queried entry, either processed or verbatim depending on the process flag", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request, if a parameter is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/components/{component}/{runtype}/{rolename}/{entry}/resolve": { + "get": { + "description": "Returns a resolved path for a given component, run type, role name and entry key. The path points to an actual existing entry in Consul, resolving ANY run type and any rolename wildcards.", + "produces": [ + "text/plain" + ], + "tags": [ + "component configuration" + ], + "summary": "Resolves a query for a given component, run type, role name and entry key", + "parameters": [ + { + "type": "string", + "description": "Configuration component", + "name": "component", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "O² Run type, must be capitalized", + "name": "runtype", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Role name", + "name": "rolename", + "in": "path", + "required": true + }, + { + "type": "string", + "description": "Entry key", + "name": "entry", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "Resolved path for the queried entry", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Bad request, if a parameter is invalid", + "schema": { + "type": "string" + } + }, + "500": { + "description": "Internal server error", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/detectors/{detector}/flps/{format}": { + "get": { + "description": "Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs and serving the given detector, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of FLPs in the cluster that serve a given detector", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/detectors/{format}": { + "get": { + "description": "Returns the list of all detectors known to Apricot that belong to the installed instance, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of detectors belonging to the installed instance known to Apricot", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of detectors in the instance known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + }, + "/inventory/flps/{format}": { + "get": { + "description": "Returns the list of all Apricot-managed hosts in the cluster that are known to be FLPs, newline-separated or JSON depending on the format parameter", + "produces": [ + "text/plain" + ], + "tags": [ + "cluster inventory" + ], + "summary": "Returns the list of FLPs in the cluster known to Apricot", + "parameters": [ + { + "enum": [ + "json", + "text" + ], + "type": "string", + "default": "text", + "description": "Output format, json or text", + "name": "format", + "in": "path" + } + ], + "responses": { + "200": { + "description": "List of FLPs in the cluster known to Apricot, newline-separated or JSON depending on the format parameter", + "schema": { + "type": "string" + } + } + } + } + } + }, + "externalDocs": { + "description": "AliECS handbook", + "url": "https://alice-flp.docs.cern.ch/aliecs/handbook/" + } +} \ No newline at end of file diff --git a/apricot/docs/swagger.yaml b/apricot/docs/swagger.yaml new file mode 100644 index 000000000..1e353123e --- /dev/null +++ b/apricot/docs/swagger.yaml @@ -0,0 +1,409 @@ +externalDocs: + description: AliECS handbook + url: https://alice-flp.docs.cern.ch/aliecs/handbook/ +info: + contact: + email: alice-o2-flp-support@cern.ch + name: O² FLP support + url: https://alice-flp.docs.cern.ch/ + description: REST API for ALICE O² Apricot configuration service + title: O² Apricot REST API + version: "1.0" +paths: + /components: + get: + description: Returns a list of all configuration components managed by Apricot + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: query + name: format + type: string + produces: + - application/json + - text/plain + responses: + "200": + description: List of components, either as JSON array or comma-separated + plain text + schema: + items: + type: string + type: array + "500": + description: Internal server error + schema: + type: string + summary: List Apricot-managed configuration components + tags: + - component configuration + /components/_invalidate_cache: + post: + description: Invalidates all cached templates for all configuration components + managed by Apricot + produces: + - text/plain + responses: + "200": + description: OK + summary: Clear cache of Apricot-managed configuration component templates + tags: + - component configuration + /components/{component}: + get: + description: Returns a list of all entries belonging to a given configuration + component corresponding to the given query. The component must be provided. + If the run type is not provided, entries for all run types are returned. If + the role name is not provided, entries for all role names are returned. If + the raw flag is true, AApricot will not attempt to include "ANY"/"any" run + types or role names, and will return only the entries stored under the provided + Consul path. If the raw flag is false, Apricot will include all entries for + the given component, run type and role name, including entries stored under + "ANY" and "any" paths corresponding to fallback values valid for all run types + or role names. + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: query + name: format + type: string + - default: false + description: If true, the query returns strictly Consul paths without catching + all run types or role names with ANY/any + in: query + name: raw + type: boolean + - description: Configuration component + in: path + name: component + required: true + type: string + produces: + - application/json + - text/plain + responses: + "200": + description: List of entries, either as JSON array or comma-separated plain + text + schema: + items: + type: string + type: array + "400": + description: Bad request, if the run type is invalid + schema: + type: string + "500": + description: Internal server error + schema: + type: string + summary: Lists all entries for an Apricot-managed configuration component + tags: + - component configuration + /components/{component}/{runtype}: + get: + description: Returns a list of all entries belonging to a given configuration + component corresponding to the given query. The component must be provided. + If the run type is not provided, entries for all run types are returned. If + the role name is not provided, entries for all role names are returned. If + the raw flag is true, AApricot will not attempt to include "ANY"/"any" run + types or role names, and will return only the entries stored under the provided + Consul path. If the raw flag is false, Apricot will include all entries for + the given component, run type and role name, including entries stored under + "ANY" and "any" paths corresponding to fallback values valid for all run types + or role names. + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: query + name: format + type: string + - default: false + description: If true, the query returns strictly Consul paths without catching + all run types or role names with ANY/any + in: query + name: raw + type: boolean + - description: Configuration component + in: path + name: component + required: true + type: string + - default: ANY + description: O² Run type, must be capitalized + in: path + name: runtype + type: string + produces: + - application/json + - text/plain + responses: + "200": + description: List of entries, either as JSON array or comma-separated plain + text + schema: + items: + type: string + type: array + "400": + description: Bad request, if the run type is invalid + schema: + type: string + "500": + description: Internal server error + schema: + type: string + summary: Lists all entries for an Apricot-managed configuration component + tags: + - component configuration + /components/{component}/{runtype}/{rolename}: + get: + description: Returns a list of all entries belonging to a given configuration + component corresponding to the given query. The component must be provided. + If the run type is not provided, entries for all run types are returned. If + the role name is not provided, entries for all role names are returned. If + the raw flag is true, AApricot will not attempt to include "ANY"/"any" run + types or role names, and will return only the entries stored under the provided + Consul path. If the raw flag is false, Apricot will include all entries for + the given component, run type and role name, including entries stored under + "ANY" and "any" paths corresponding to fallback values valid for all run types + or role names. + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: query + name: format + type: string + - default: false + description: If true, the query returns strictly Consul paths without catching + all run types or role names with ANY/any + in: query + name: raw + type: boolean + - description: Configuration component + in: path + name: component + required: true + type: string + - default: ANY + description: O² Run type, must be capitalized + in: path + name: runtype + type: string + - default: any + description: Role name + in: path + name: rolename + type: string + produces: + - application/json + - text/plain + responses: + "200": + description: List of entries, either as JSON array or comma-separated plain + text + schema: + items: + type: string + type: array + "400": + description: Bad request, if the run type is invalid + schema: + type: string + "500": + description: Internal server error + schema: + type: string + summary: Lists all entries for an Apricot-managed configuration component + tags: + - component configuration + /components/{component}/{runtype}/{rolename}/{entry}: + get: + description: The provided component, run type, role name and entry key are used + to query the configuration service for a configuration entry, which is then + processed in the O² Apricot template system to produce the final payload, + and returned as string.. + parameters: + - default: false + description: If true, template processing is performed to produce the final + payload; if false, the entry is returned verbatim. In the true case, any + number of additional string key-value pairs may be passed as query parameters + (e.g. ?process=true&mykey1=myvalue1&mykey2=myvalue2), which are then fed + into the template system as variables that affect configuration payload + generation + in: query + name: process + type: boolean + - description: Configuration component + in: path + name: component + required: true + type: string + - description: O² Run type, must be capitalized + in: path + name: runtype + required: true + type: string + - description: Role name + in: path + name: rolename + required: true + type: string + - description: Entry key + in: path + name: entry + required: true + type: string + produces: + - text/plain + responses: + "200": + description: Configuration payload for the queried entry, either processed + or verbatim depending on the process flag + schema: + type: string + "400": + description: Bad request, if a parameter is invalid + schema: + type: string + "500": + description: Internal server error + schema: + type: string + summary: Returns a configuration payload for a given component, run type, role + name and entry key + tags: + - component configuration + /components/{component}/{runtype}/{rolename}/{entry}/resolve: + get: + description: Returns a resolved path for a given component, run type, role name + and entry key. The path points to an actual existing entry in Consul, resolving + ANY run type and any rolename wildcards. + parameters: + - description: Configuration component + in: path + name: component + required: true + type: string + - description: O² Run type, must be capitalized + in: path + name: runtype + required: true + type: string + - description: Role name + in: path + name: rolename + required: true + type: string + - description: Entry key + in: path + name: entry + required: true + type: string + produces: + - text/plain + responses: + "200": + description: Resolved path for the queried entry + schema: + type: string + "400": + description: Bad request, if a parameter is invalid + schema: + type: string + "500": + description: Internal server error + schema: + type: string + summary: Resolves a query for a given component, run type, role name and entry + key + tags: + - component configuration + /inventory/detectors/{detector}/flps/{format}: + get: + description: Returns the list of all Apricot-managed hosts in the cluster that + are known to be FLPs and serving the given detector, newline-separated or + JSON depending on the format parameter + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: path + name: format + type: string + produces: + - text/plain + responses: + "200": + description: List of FLPs in the cluster known to Apricot, newline-separated + or JSON depending on the format parameter + schema: + type: string + summary: Returns the list of FLPs in the cluster that serve a given detector + tags: + - cluster inventory + /inventory/detectors/{format}: + get: + description: Returns the list of all detectors known to Apricot that belong + to the installed instance, newline-separated or JSON depending on the format + parameter + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: path + name: format + type: string + produces: + - text/plain + responses: + "200": + description: List of detectors in the instance known to Apricot, newline-separated + or JSON depending on the format parameter + schema: + type: string + summary: Returns the list of detectors belonging to the installed instance known + to Apricot + tags: + - cluster inventory + /inventory/flps/{format}: + get: + description: Returns the list of all Apricot-managed hosts in the cluster that + are known to be FLPs, newline-separated or JSON depending on the format parameter + parameters: + - default: text + description: Output format, json or text + enum: + - json + - text + in: path + name: format + type: string + produces: + - text/plain + responses: + "200": + description: List of FLPs in the cluster known to Apricot, newline-separated + or JSON depending on the format parameter + schema: + type: string + summary: Returns the list of FLPs in the cluster known to Apricot + tags: + - cluster inventory +swagger: "2.0" From f7377ffbac650e18dade13df51f342e2221870f1 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 10:53:31 +0100 Subject: [PATCH 1765/2352] [docs] Fix mkdocs pointer to Apricot HTTP API and improve docs --- apricot/docs/apricot_http_service.md | 8 +++++++- mkdocs.yml | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/apricot/docs/apricot_http_service.md b/apricot/docs/apricot_http_service.md index 8c5bdb723..ccd6950f9 100644 --- a/apricot/docs/apricot_http_service.md +++ b/apricot/docs/apricot_http_service.md @@ -30,8 +30,14 @@ To retrieve a component configuration payload, use the following urls in a web b * `http:///components////?process=false` - without template processing, returns the entry verbatim The full API documentation is available at `http:///docs/` wherever your Apricot instance is running. This documentation interface also allows to perform API calls directly from the browser. +Besides configuration retrieval, the API also includes calls for browsing the configuration tree and resolving payload paths to actual entries according to the `ANY/any` mechanism. ### Examples * With `curl`: `curl http://localhost:32188/inventory/flps` -* With `wget`: `wget http://localhost:32188/inventory/detectors/TST/flps/json -O ~/downloads/test` \ No newline at end of file +* With `wget`: `wget http://localhost:32188/inventory/detectors/TST/flps/json -O ~/downloads/test` + +Getting a template-processed configuration payload for a component (entry `tpc-full-qcmn` for component `qc`, with `list_of_detectors` and `run_type` passed as template variables): + +* In a browser: `http://localhost:32188/components/qc/ANY/any/tpc-full-qcmn?process=true&list_of_detectors=tpc,its&run_type=PHYSICS` +* With `curl`: `curl http://127.0.0.1:32188/components/qc/ANY/any/tpc-full-qcmn\?process\=true\&list_of_detectors\=tpc,its\&run_type\=PHYSICS` \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 2cc3d7822..61383c35b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -8,7 +8,7 @@ nav: - Configuration: - Workflow Configuration: handbook/configuration.md - Apricot Usage: './apricot/docs/apricot.md' - - Apricot HTTP API: './apricot/docs/apricot_api.md' + - Apricot HTTP API: './apricot/docs/apricot_http_service.md' - gRPC APIs: - AliECS gRPC API: apidocs_aliecs.md - Apricot gRPC API: apidocs_apricot.md From 2e039141d2f1f314d3275d1155cb07ad108de315 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 10:59:44 +0100 Subject: [PATCH 1766/2352] [build] Bump Go in GH workflow --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index e9a209c55..b187f3654 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-20.04] - go: [ '1.18.4' ] + go: [ '1.21.5' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From d010a452db17a40eeff675c67a94650ec8eeedc5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 12:43:11 +0100 Subject: [PATCH 1767/2352] [build] Bump to v1.0.0 --- VERSION | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/VERSION b/VERSION index 4858e78ae..19155254c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax -VERSION_MAJOR := 0 -VERSION_MINOR := 84 -VERSION_PATCH := 1 +VERSION_MAJOR := 1 +VERSION_MINOR := 0 +VERSION_PATCH := 0 From a933c0da9ba27f54da9d519c68ebeafc51bdc066 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 15:28:07 +0100 Subject: [PATCH 1768/2352] [docs] Improve Apricot HTTP documentation --- apricot/docs/apricot-apidocs-screenshot.png | Bin 0 -> 216769 bytes apricot/docs/apricot_http_service.md | 18 +++++++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) create mode 100644 apricot/docs/apricot-apidocs-screenshot.png diff --git a/apricot/docs/apricot-apidocs-screenshot.png b/apricot/docs/apricot-apidocs-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..43194d572a07e6e75d2eac4294fdbaa4620504e5 GIT binary patch literal 216769 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�H@eY?Jm6!JwBAf9&`|D%1r-nyc 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

AnzJ&8-P2RN=IFvY%7W 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]b)J9&8u8Lv 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/inventory/flps` or `http:///inventory/flps/text` -* `http:///inventory/detectors//flps` or `http:///inventory/detectors//flps/text` +* `http://:/inventory/flps` or `http://:/inventory/flps/text` +* `http://:/inventory/detectors//flps` or `http://:/inventory/detectors//flps/text` To retrieve as JSON: -* `http:///inventory/flps/json` -* `http:///inventory/detectors//flps/json` +* `http://:/inventory/flps/json` +* `http://:/inventory/detectors//flps/json` To retrieve a component configuration payload, use the following urls in a web browser or with `curl` or `wget`. -* `http:///components////?process=true` - with template processing -* `http:///components////?process=false` - without template processing, returns the entry verbatim +* `http://:/components////?process=true` - with template processing +* `http://:/components////?process=false` - without template processing, returns the entry verbatim -The full API documentation is available at `http:///docs/` wherever your Apricot instance is running. This documentation interface also allows to perform API calls directly from the browser. +The full API documentation is available at `http://:/docs/` wherever your Apricot instance is running. It looks like this: + +![Apricot API documentation screenshot](apricot-apidocs-screenshot.png) + +This documentation interface also allows to perform API calls directly from the browser. Besides configuration retrieval, the API also includes calls for browsing the configuration tree and resolving payload paths to actual entries according to the `ANY/any` mechanism. ### Examples From 6d3f8cb96047cbca916ca8e39f6863ac4451af39 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 15:48:58 +0100 Subject: [PATCH 1769/2352] [docs] Make it look right in Mkdocs --- apricot/docs/apricot_http_service.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apricot/docs/apricot_http_service.md b/apricot/docs/apricot_http_service.md index a9a0cc010..15dd91a97 100644 --- a/apricot/docs/apricot_http_service.md +++ b/apricot/docs/apricot_http_service.md @@ -17,10 +17,12 @@ The default port is `32188`. To retrieve the information needed regarding FLPs, use the following urls in a web browser or with `curl` or `wget`. To retrieve as plain text: + * `http://:/inventory/flps` or `http://:/inventory/flps/text` * `http://:/inventory/detectors//flps` or `http://:/inventory/detectors//flps/text` To retrieve as JSON: + * `http://:/inventory/flps/json` * `http://:/inventory/detectors//flps/json` From b9fff20e536ac36639da75451bb77335bc1b7e53 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 16:04:51 +0100 Subject: [PATCH 1770/2352] [build] Check for minimum Go version 1.20 --- Makefile | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index a5d1a909b..2c7276580 100644 --- a/Makefile +++ b/Makefile @@ -28,6 +28,13 @@ BUILD := `git rev-parse --short HEAD` ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +MINIMUM_SUPPORTED_GO_MAJOR_VERSION = 1 +MINIMUM_SUPPORTED_GO_MINOR_VERSION = 20 + +GO_MAJOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1) +GO_MINOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2) +GO_VERSION_VALIDATION_ERR_MSG = Go version $(GO_MAJOR_VERSION).$(GO_MINOR_VERSION) is not supported, please update to at least $(MINIMUM_SUPPORTED_GO_MAJOR_VERSION).$(MINIMUM_SUPPORTED_GO_MINOR_VERSION) + HOST_GOOS=$(shell go env GOOS) HOST_GOARCH=$(shell go env GOARCH) CGO_LDFLAGS= @@ -82,6 +89,17 @@ build: $(WHAT) all: vendor generate build +validate-go-version: ## Validates the installed version of go against AliECS minimum requirement. + @if [ $(GO_MAJOR_VERSION) -gt $(MINIMUM_SUPPORTED_GO_MAJOR_VERSION) ]; then \ + exit 0 ;\ + elif [ $(GO_MAJOR_VERSION) -lt $(MINIMUM_SUPPORTED_GO_MAJOR_VERSION) ]; then \ + echo '$(GO_VERSION_VALIDATION_ERR_MSG)';\ + exit 1; \ + elif [ $(GO_MINOR_VERSION) -lt $(MINIMUM_SUPPORTED_GO_MINOR_VERSION) ] ; then \ + echo '$(GO_VERSION_VALIDATION_ERR_MSG)';\ + exit 1; \ + fi + install: $(INSTALL_WHAT) # @for w in $(WHAT); do \ # FLAGS="WHAT_$${w}_BUILD_FLAGS"; \ @@ -90,7 +108,7 @@ install: $(INSTALL_WHAT) # $(WHAT_$${w}_BUILD_FLAGS) go install $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$$w; \ # done -$(WHAT): +$(WHAT): validate-go-version # @echo -e "WHAT_$@_BUILD_FLAGS $(WHAT_$@_BUILD_FLAGS)" @echo -e "\033[1;33mgo build -mod=vendor\033[0m ./cmd/$@ \033[1;33m==>\033[0m \033[1;34m./bin/$@\033[0m" # @echo ${PWD} @@ -103,7 +121,7 @@ $(WHAT): chmod +x bin/o2-aliecs-shmcleaner; \ fi; \ -$(INSTALL_WHAT): +$(INSTALL_WHAT): validate-go-version # @echo -e "WHAT_$(@:install_%=%)_BUILD_FLAGS $(WHAT_$(@:install_%=%)_BUILD_FLAGS)" @echo -e "\033[1;33mgo install -mod=vendor\033[0m ./cmd/$(@:install_%=%) \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/$(@:install_%=%)\033[0m" # @echo ${PWD} @@ -153,7 +171,7 @@ cleanall: @rm -rf bin tools vendor @echo -e "clean done: \033[1;34mbin tools vendor\033[0m" -vendor: +vendor: validate-go-version @echo -e "\033[1;33mgo mod vendor\033[0m" @go mod vendor From a6fd06e835ecfc95a1c14e46c880300f3b31cf1b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 7 Dec 2023 16:06:14 +0100 Subject: [PATCH 1771/2352] [build] Report go executable path if version insufficient --- Makefile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 2c7276580..cc035079c 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,8 @@ MINIMUM_SUPPORTED_GO_MINOR_VERSION = 20 GO_MAJOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1) GO_MINOR_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f2) -GO_VERSION_VALIDATION_ERR_MSG = Go version $(GO_MAJOR_VERSION).$(GO_MINOR_VERSION) is not supported, please update to at least $(MINIMUM_SUPPORTED_GO_MAJOR_VERSION).$(MINIMUM_SUPPORTED_GO_MINOR_VERSION) +WHICH_GO = $(shell which go) +GO_VERSION_VALIDATION_ERR_MSG = Go version $(GO_MAJOR_VERSION).$(GO_MINOR_VERSION) at $(WHICH_GO) is not supported, please update to at least $(MINIMUM_SUPPORTED_GO_MAJOR_VERSION).$(MINIMUM_SUPPORTED_GO_MINOR_VERSION) HOST_GOOS=$(shell go env GOOS) HOST_GOARCH=$(shell go env GOARCH) From 71877ced5360ad15bbce1979e04e39991a20632a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 8 Dec 2023 10:58:55 +0100 Subject: [PATCH 1772/2352] [build] Make sure cgo is disabled --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index cc035079c..306c10a66 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # === This file is part of ALICE O² === # -# Copyright 2017-2020 CERN and copyright holders of ALICE O². +# Copyright 2017-2023 CERN and copyright holders of ALICE O². # Author: Teo Mrnjavac # # Partially derived from Torus Makefile @@ -84,6 +84,9 @@ GOPATH := $(shell go env GOPATH) GOPROTOCPATH=$(ROOT_DIR)/tools/protoc-gen-go HAS_PROTOC := $(shell command -v $(GOPROTOCPATH) 2> /dev/null) +.EXPORT_ALL_VARIABLES: +CGO_ENABLED = 0 + .PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs build: $(WHAT) From 51b69c6a2cb33b638d5ec4d796b887a60b815220 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 8 Dec 2023 11:10:08 +0100 Subject: [PATCH 1773/2352] [build] Bump to v1.0.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 19155254c..42d08b8d0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 0 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 9caa8909824d94b9785ff5b3fee1ec8c48d5f98a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Dec 2023 16:43:28 +0100 Subject: [PATCH 1774/2352] [apricot] Improve log output --- apricot/apricot.go | 4 ++-- apricot/local/servicehttp.go | 7 +++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/apricot/apricot.go b/apricot/apricot.go index 81a36ae35..f4c33898d 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -54,10 +54,10 @@ func Run() (err error) { Infof("AliECS Configuration Service running with verbose logging") } - s := remote.NewServer(Instance()) httpsvr := local.NewHttpService(instance) signals(s, httpsvr) // handle UNIX signals + var lis net.Listener lis, err = net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("listenPort"))) if err != nil { @@ -69,7 +69,7 @@ func Run() (err error) { log.WithField("port", viper.GetInt("listenPort")). WithField("level", infologger.IL_Support). - Info("service started") + Info("gRPC service started") if err = s.Serve(lis); err != nil { log.WithField("error", err).Fatal("gRPC server failed to serve") } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index a43fab28e..8b208e300 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -36,6 +36,7 @@ import ( _ "github.com/AliceO2Group/Control/apricot/docs" apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/configuration" "github.com/AliceO2Group/Control/configuration/componentcfg" @@ -123,6 +124,10 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { // async-start of http Service and capture error go func() { + log.WithField("port", viper.GetInt("httpListenPort")). + WithField("level", infologger.IL_Support). + Info("HTTP service started") + err := httpsvr.ListenAndServe() if err != nil { log.WithError(err).Error("HTTP service returned error") @@ -199,6 +204,8 @@ func (httpsvc *HttpService) ApiListComponents(w http.ResponseWriter, r *http.Req // @Success 200 // @Router /components/_invalidate_cache [post] func (httpsvc *HttpService) ApiInvalidateCache(w http.ResponseWriter, r *http.Request) { + log.WithField("level", infologger.IL_Support). + Debug("invalidating component template cache") httpsvc.svc.InvalidateComponentTemplateCache() w.WriteHeader(http.StatusOK) _, _ = fmt.Fprintln(w, "OK") From 0a5e009bb892792769dbc876549556b2c0c71fd4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Dec 2023 16:44:02 +0100 Subject: [PATCH 1775/2352] [executor] Delay acquiring executor PID for IL --- cmd/o2-aliecs-executor/main.go | 2 ++ common/logger/infologger/directhook.go | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/cmd/o2-aliecs-executor/main.go b/cmd/o2-aliecs-executor/main.go index a45ed9188..556e0b994 100644 --- a/cmd/o2-aliecs-executor/main.go +++ b/cmd/o2-aliecs-executor/main.go @@ -25,6 +25,7 @@ package main import ( + "fmt" "os" "github.com/AliceO2Group/Control/common/logger" @@ -47,6 +48,7 @@ var log = logger.New(logrus.StandardLogger(), "executor") // Entry point, reads configuration from environment variables. func main() { logrus.SetLevel(logrus.DebugLevel) + infologger.Pid = fmt.Sprintf("%d", os.Getpid()) cfg, err := config.FromEnv() if err != nil { diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index b51f04039..c3ead8e27 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -44,7 +44,7 @@ const INFOLOGGER_MAX_MESSAGE_SIZE = 1024 var ( hostname string - pid string + Pid string username string ) @@ -52,7 +52,7 @@ var lineBreaksRe = regexp.MustCompile(`\r?\n`) func init() { var err error - pid = fmt.Sprintf("%d", os.Getpid()) + Pid = fmt.Sprintf("%d", os.Getpid()) unixUser, _ := user.Current() if unixUser != nil { @@ -113,10 +113,10 @@ func (s *sender) Send(fields map[string]string) error { } type DirectHook struct { - il *sender - system string - facility string - role string + il *sender + system string + facility string + role string } func paddedAbstractSocket(name string) string { @@ -147,10 +147,10 @@ func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, e return nil, fmt.Errorf("cannot instantiate InfoLogger hook on socket %s", socketPath) } return &DirectHook{ - il: sender, - system: defaultSystem, - facility: defaultFacility, - role: hostname, + il: sender, + system: defaultSystem, + facility: defaultFacility, + role: hostname, }, nil } @@ -187,7 +187,7 @@ func (h *DirectHook) Fire(e *logrus.Entry) error { } payload["timestamp"] = utils.NewUnixTimestamp() payload["hostname"] = hostname - payload["pid"] = pid + payload["pid"] = Pid payload["username"] = username if e.HasCaller() { From 3da3af0d4e456c52d6f05f8864208048775fb76b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Dec 2023 16:44:51 +0100 Subject: [PATCH 1776/2352] [executor] Add executorId in critical log messages --- core/task/scheduler.go | 7 ++++--- executor/executable/task.go | 6 ++++-- executor/executor.go | 22 ++++++++++++++++------ executor/handlers.go | 2 ++ 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 3ade292f1..a736fe4c2 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -627,20 +627,20 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han targetExecutorId.Value = uid.New().String() log.WithField("executorId", targetExecutorId.Value). WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Devel). + WithField("level", infologger.IL_Support). Info("received offer without executor ID, will start new executor if accepted") } else { targetExecutorId.Value = offer.ExecutorIDs[0].Value if len(offer.ExecutorIDs) == 1 { log.WithField("executorId", targetExecutorId.Value). WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Devel). + WithField("level", infologger.IL_Support). Warn("received offer with one executor ID, will use existing executor") } else if len(offer.ExecutorIDs) > 1 { log.WithField("executorId", targetExecutorId.Value). WithField("executorIds", offer.ExecutorIDs). WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Devel). + WithField("level", infologger.IL_Support). Warn("received offer with more than one executor ID, will use first one") } } @@ -965,6 +965,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("detector", detector). WithField("level", infologger.IL_Support). WithField("offerHost", offer.Hostname). + WithField("executorId", targetExecutorId.Value). Infof("launch request sent to %s: %d tasks", offer.Hostname, n) for _, taskInfo := range taskInfosToLaunchForCurrentOffer { log.WithPrefix("scheduler"). diff --git a/executor/executable/task.go b/executor/executable/task.go index c24cd70b6..337be37fd 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -107,8 +107,10 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE log.WithField("level", infologger.IL_Support). WithField("partition", envId.String()). WithField("detector", detector). - WithField("level", infologger.IL_Devel). - Infof("launching task %s: %s", taskInfo.TaskID.GetValue(), rawCommand) + Infof("launching task %s on executorId %s: %s", + taskInfo.TaskID.GetValue(), + taskInfo.GetExecutor().GetExecutorID().Value, + rawCommand) } else { if err != nil { log.WithError(err). diff --git a/executor/executor.go b/executor/executor.go index fa16cb148..3ba4989a5 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -168,7 +168,8 @@ func Run(cfg config.Config) { // tasks and updates are empty. subscribe := calls.Subscribe(unacknowledgedTasks(state), unacknowledgedUpdates(state)) - log.Debug("subscribing to agent for events") + log.WithField("executorId", state.executor.GetExecutorID().Value). + Debug("subscribing to agent for events") // ↓ empty context ↓ we get a plain RequestFunc from the executor.Call value resp, err := subscriber.Send(context.TODO(), calls.NonStreaming(subscribe)) if resp != nil { @@ -176,35 +177,44 @@ func Run(cfg config.Config) { } if err == nil { log.WithField("level", infologger.IL_Support). + WithField("executorId", state.executor.GetExecutorID().Value). Info("executor subscribed, ready to receive events") // We're officially connected, start decoding events err = eventLoop(state, resp, handler) // If we're out of the eventLoop, means a disconnect happened, willingly or not. disconnected = time.Now() - log.Debug("event loop finished") + log.WithField("level", infologger.IL_Support). + WithField("executorId", state.executor.GetExecutorID().Value). + Info("event loop finished") } if err != nil && err != io.EOF { log.WithField("error", err). + WithField("executorId", state.executor.GetExecutorID().Value). Error("executor disconnected with error") } else { - log.Info("executor disconnected") + log.WithField("executorId", state.executor.GetExecutorID().Value). + Info("executor disconnected") } }() if state.shouldQuit { - log.Info("gracefully shutting down on request") + log.WithField("executorId", state.executor.GetExecutorID().Value). + Info("gracefully shutting down on request") return } // The purpose of checkpointing is to handle recovery when mesos-agent exits. if !cfg.Checkpoint { - log.Info("gracefully exiting because framework checkpointing is not enabled") + log.WithField("executorId", state.executor.GetExecutorID().Value). + Info("gracefully exiting because framework checkpointing is not enabled") return } if time.Now().Sub(disconnected) > cfg.RecoveryTimeout { log.WithField("timeout", cfg.RecoveryTimeout). + WithField("executorId", state.executor.GetExecutorID().Value). Error("failed to re-establish subscription with agent within recovery timeout, aborting") return } - log.Debug("waiting for reconnect timeout") + log.WithField("executorId", state.executor.GetExecutorID().Value). + Debug("waiting for reconnect timeout") <-shouldReconnect // wait for some amount of time before retrying subscription } } diff --git a/executor/handlers.go b/executor/handlers.go index 4ad30f269..8f5c16ac3 100644 --- a/executor/handlers.go +++ b/executor/handlers.go @@ -80,6 +80,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "message": string(data[:]), "error": err.Error(), }). + WithField("executorId", state.executor.GetExecutorID().Value). Error("no task for incoming MESSAGE") return } @@ -168,6 +169,7 @@ func handleMessageEvent(state *internalState, data []byte) (err error) { "message": string(data[:]), "error": err.Error(), }). + WithField("executorId", state.executor.GetExecutorID().Value). Error("no task for incoming MESSAGE") return } From d620b7193904ba51075bed6017ea8fbe61e00e13 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Dec 2023 11:03:26 +0100 Subject: [PATCH 1777/2352] [build] Bump to v1.1.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 42d08b8d0..4a8299c88 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 0 -VERSION_PATCH := 1 +VERSION_MINOR := 1 +VERSION_PATCH := 0 From 4ae05521b56498ad4114b010efa8da68bf194aac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Jan 2024 13:31:43 +0100 Subject: [PATCH 1778/2352] [core] Pull changes in DCS protofile --- core/integration/dcs/protos/dcs.pb.go | 473 +++++++++++---------- core/integration/dcs/protos/dcs.proto | 2 + core/integration/dcs/protos/dcs_grpc.pb.go | 48 ++- 3 files changed, 293 insertions(+), 230 deletions(-) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 485b7e55d..ee8fa693b 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -24,8 +24,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.24.2 +// protoc-gen-go v1.31.0 +// protoc v4.25.1 // source: protos/dcs.proto package dcspb @@ -499,6 +499,12 @@ type DetectorInfo struct { State DetectorState `protobuf:"varint,2,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` // state of this detector at the time of response generation Timestamp string `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // time when the detector state is as declared AllowedRunTypes []RunType `protobuf:"varint,4,rep,packed,name=allowedRunTypes,proto3,enum=dcs.RunType" json:"allowedRunTypes,omitempty"` // a list of run types that are currently + // possible with the given detector, taking into + // account all low-level information; + // for example, at a given moment TECHNICAL + // runs might be possible but not PHYSICS + PfrAvailability DetectorState `protobuf:"varint,5,opt,name=pfrAvailability,proto3,enum=dcs.DetectorState" json:"pfrAvailability,omitempty"` // availability of this detector for PFR at the time of response generation + SorAvailability DetectorState `protobuf:"varint,6,opt,name=sorAvailability,proto3,enum=dcs.DetectorState" json:"sorAvailability,omitempty"` // availability of this detector for SOR at the time of response generation } func (x *DetectorInfo) Reset() { @@ -561,6 +567,20 @@ func (x *DetectorInfo) GetAllowedRunTypes() []RunType { return nil } +func (x *DetectorInfo) GetPfrAvailability() DetectorState { + if x != nil { + return x.PfrAvailability + } + return DetectorState_NULL_STATE +} + +func (x *DetectorInfo) GetSorAvailability() DetectorState { + if x != nil { + return x.SorAvailability + } + return DetectorState_NULL_STATE +} + type SubscriptionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1136,7 +1156,7 @@ var File_protos_dcs_proto protoreflect.FileDescriptor var file_protos_dcs_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x64, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x03, 0x64, 0x63, 0x73, 0x22, 0xb9, 0x01, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, + 0x74, 0x6f, 0x12, 0x03, 0x64, 0x63, 0x73, 0x22, 0xb5, 0x02, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, @@ -1148,195 +1168,202 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x52, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x73, 0x22, 0x35, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xb7, 0x02, 0x0a, 0x05, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, - 0x74, 0x72, 0x69, 0x78, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x49, 0x0a, - 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe7, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x70, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x0f, 0x70, 0x66, 0x72, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x0f, 0x70, 0x66, 0x72, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x3c, 0x0a, 0x0f, 0x73, 0x6f, 0x72, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0f, + 0x73, 0x6f, 0x72, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, + 0x35, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xb7, 0x02, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x39, + 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x49, 0x0a, 0x0f, 0x65, 0x78, 0x74, + 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x0a, 0x14, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xe7, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x72, + 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, 0x01, 0x0a, 0x0a, 0x50, + 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5c, 0x0a, 0x0f, - 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, - 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x93, - 0x01, 0x0a, 0x0a, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x26, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x0c, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, - 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, - 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, - 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, - 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, - 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, - 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, - 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, - 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, - 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, - 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, - 0x10, 0x1e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, - 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, - 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, - 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, - 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, - 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, - 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, - 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, - 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, - 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, - 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, - 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, - 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, - 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, - 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, - 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, - 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, - 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, - 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, - 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, - 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, - 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, - 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, - 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, - 0x0a, 0x0d, 0x45, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, - 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, - 0x45, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, - 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, - 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, - 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, - 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, - 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, - 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, - 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, - 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, - 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, - 0x59, 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, - 0x02, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, - 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, - 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, - 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, - 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, - 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, - 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, - 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, - 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, - 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x07, + 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0c, 0x2e, + 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x08, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x22, 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0xa2, 0x01, 0x0a, 0x09, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, + 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, + 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, + 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, + 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, + 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, + 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, + 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, + 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, + 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, + 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, + 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, + 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, + 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, + 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, + 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, + 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, + 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, + 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, + 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, + 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, + 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, + 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, + 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, + 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, + 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, + 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, + 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, + 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, + 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, + 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, + 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, + 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, + 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, + 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, + 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1378,37 +1405,39 @@ var file_protos_dcs_proto_depIdxs = []int32{ 1, // 0: dcs.DetectorInfo.detector:type_name -> dcs.Detector 2, // 1: dcs.DetectorInfo.state:type_name -> dcs.DetectorState 3, // 2: dcs.DetectorInfo.allowedRunTypes:type_name -> dcs.RunType - 0, // 3: dcs.Event.eventtype:type_name -> dcs.EventType - 6, // 4: dcs.Event.detectorMatrix:type_name -> dcs.DetectorInfo - 16, // 5: dcs.Event.extraParameters:type_name -> dcs.Event.ExtraParametersEntry - 1, // 6: dcs.DetectorOperationRequest.detector:type_name -> dcs.Detector - 17, // 7: dcs.DetectorOperationRequest.extraParameters:type_name -> dcs.DetectorOperationRequest.ExtraParametersEntry - 9, // 8: dcs.PfrRequest.detectors:type_name -> dcs.DetectorOperationRequest - 3, // 9: dcs.PfrRequest.runType:type_name -> dcs.RunType - 9, // 10: dcs.SorRequest.detectors:type_name -> dcs.DetectorOperationRequest - 3, // 11: dcs.SorRequest.runType:type_name -> dcs.RunType - 9, // 12: dcs.EorRequest.detectors:type_name -> dcs.DetectorOperationRequest - 0, // 13: dcs.RunEvent.eventtype:type_name -> dcs.EventType - 1, // 14: dcs.RunEvent.detector:type_name -> dcs.Detector - 2, // 15: dcs.RunEvent.state:type_name -> dcs.DetectorState - 18, // 16: dcs.RunEvent.extraParameters:type_name -> dcs.RunEvent.ExtraParametersEntry - 1, // 17: dcs.StatusRequest.detector:type_name -> dcs.Detector - 6, // 18: dcs.StatusReply.detectorMatrix:type_name -> dcs.DetectorInfo - 7, // 19: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest - 10, // 20: dcs.Configurator.PrepareForRun:input_type -> dcs.PfrRequest - 11, // 21: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest - 12, // 22: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest - 14, // 23: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest - 8, // 24: dcs.Configurator.Subscribe:output_type -> dcs.Event - 13, // 25: dcs.Configurator.PrepareForRun:output_type -> dcs.RunEvent - 13, // 26: dcs.Configurator.StartOfRun:output_type -> dcs.RunEvent - 13, // 27: dcs.Configurator.EndOfRun:output_type -> dcs.RunEvent - 15, // 28: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply - 24, // [24:29] is the sub-list for method output_type - 19, // [19:24] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 2, // 3: dcs.DetectorInfo.pfrAvailability:type_name -> dcs.DetectorState + 2, // 4: dcs.DetectorInfo.sorAvailability:type_name -> dcs.DetectorState + 0, // 5: dcs.Event.eventtype:type_name -> dcs.EventType + 6, // 6: dcs.Event.detectorMatrix:type_name -> dcs.DetectorInfo + 16, // 7: dcs.Event.extraParameters:type_name -> dcs.Event.ExtraParametersEntry + 1, // 8: dcs.DetectorOperationRequest.detector:type_name -> dcs.Detector + 17, // 9: dcs.DetectorOperationRequest.extraParameters:type_name -> dcs.DetectorOperationRequest.ExtraParametersEntry + 9, // 10: dcs.PfrRequest.detectors:type_name -> dcs.DetectorOperationRequest + 3, // 11: dcs.PfrRequest.runType:type_name -> dcs.RunType + 9, // 12: dcs.SorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 3, // 13: dcs.SorRequest.runType:type_name -> dcs.RunType + 9, // 14: dcs.EorRequest.detectors:type_name -> dcs.DetectorOperationRequest + 0, // 15: dcs.RunEvent.eventtype:type_name -> dcs.EventType + 1, // 16: dcs.RunEvent.detector:type_name -> dcs.Detector + 2, // 17: dcs.RunEvent.state:type_name -> dcs.DetectorState + 18, // 18: dcs.RunEvent.extraParameters:type_name -> dcs.RunEvent.ExtraParametersEntry + 1, // 19: dcs.StatusRequest.detector:type_name -> dcs.Detector + 6, // 20: dcs.StatusReply.detectorMatrix:type_name -> dcs.DetectorInfo + 7, // 21: dcs.Configurator.Subscribe:input_type -> dcs.SubscriptionRequest + 10, // 22: dcs.Configurator.PrepareForRun:input_type -> dcs.PfrRequest + 11, // 23: dcs.Configurator.StartOfRun:input_type -> dcs.SorRequest + 12, // 24: dcs.Configurator.EndOfRun:input_type -> dcs.EorRequest + 14, // 25: dcs.Configurator.GetStatus:input_type -> dcs.StatusRequest + 8, // 26: dcs.Configurator.Subscribe:output_type -> dcs.Event + 13, // 27: dcs.Configurator.PrepareForRun:output_type -> dcs.RunEvent + 13, // 28: dcs.Configurator.StartOfRun:output_type -> dcs.RunEvent + 13, // 29: dcs.Configurator.EndOfRun:output_type -> dcs.RunEvent + 15, // 30: dcs.Configurator.GetStatus:output_type -> dcs.StatusReply + 26, // [26:31] is the sub-list for method output_type + 21, // [21:26] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_protos_dcs_proto_init() } diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 84925ca30..e99308e24 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -89,6 +89,8 @@ message DetectorInfo { // account all low-level information; // for example, at a given moment TECHNICAL // runs might be possible but not PHYSICS + DetectorState pfrAvailability = 5; // availability of this detector for PFR at the time of response generation + DetectorState sorAvailability = 6; // availability of this detector for SOR at the time of response generation } ////////////////////////////////////////////////////// diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 1c8db1419..b6a7ab51a 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -1,7 +1,31 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2020-2021 CERN and copyright holders of ALICE O². +// Authors: Teo Mrnjavac +// Ombretta Pinazza +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v4.24.2 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.1 // source: protos/dcs.proto package dcspb @@ -18,6 +42,14 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Configurator_Subscribe_FullMethodName = "/dcs.Configurator/Subscribe" + Configurator_PrepareForRun_FullMethodName = "/dcs.Configurator/PrepareForRun" + Configurator_StartOfRun_FullMethodName = "/dcs.Configurator/StartOfRun" + Configurator_EndOfRun_FullMethodName = "/dcs.Configurator/EndOfRun" + Configurator_GetStatus_FullMethodName = "/dcs.Configurator/GetStatus" +) + // ConfiguratorClient is the client API for Configurator service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -63,7 +95,7 @@ func NewConfiguratorClient(cc grpc.ClientConnInterface) ConfiguratorClient { } func (c *configuratorClient) Subscribe(ctx context.Context, in *SubscriptionRequest, opts ...grpc.CallOption) (Configurator_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], "/dcs.Configurator/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[0], Configurator_Subscribe_FullMethodName, opts...) if err != nil { return nil, err } @@ -95,7 +127,7 @@ func (x *configuratorSubscribeClient) Recv() (*Event, error) { } func (c *configuratorClient) PrepareForRun(ctx context.Context, in *PfrRequest, opts ...grpc.CallOption) (Configurator_PrepareForRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], "/dcs.Configurator/PrepareForRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[1], Configurator_PrepareForRun_FullMethodName, opts...) if err != nil { return nil, err } @@ -127,7 +159,7 @@ func (x *configuratorPrepareForRunClient) Recv() (*RunEvent, error) { } func (c *configuratorClient) StartOfRun(ctx context.Context, in *SorRequest, opts ...grpc.CallOption) (Configurator_StartOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], "/dcs.Configurator/StartOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[2], Configurator_StartOfRun_FullMethodName, opts...) if err != nil { return nil, err } @@ -159,7 +191,7 @@ func (x *configuratorStartOfRunClient) Recv() (*RunEvent, error) { } func (c *configuratorClient) EndOfRun(ctx context.Context, in *EorRequest, opts ...grpc.CallOption) (Configurator_EndOfRunClient, error) { - stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], "/dcs.Configurator/EndOfRun", opts...) + stream, err := c.cc.NewStream(ctx, &Configurator_ServiceDesc.Streams[3], Configurator_EndOfRun_FullMethodName, opts...) if err != nil { return nil, err } @@ -192,7 +224,7 @@ func (x *configuratorEndOfRunClient) Recv() (*RunEvent, error) { func (c *configuratorClient) GetStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { out := new(StatusReply) - err := c.cc.Invoke(ctx, "/dcs.Configurator/GetStatus", in, out, opts...) + err := c.cc.Invoke(ctx, Configurator_GetStatus_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -360,7 +392,7 @@ func _Configurator_GetStatus_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/dcs.Configurator/GetStatus", + FullMethod: Configurator_GetStatus_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ConfiguratorServer).GetStatus(ctx, req.(*StatusRequest)) From 7d484d77f103a2d5f5565059baa9d02a9bc7e2a8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Jan 2024 14:47:57 +0100 Subject: [PATCH 1779/2352] [core] DCS client now uses operation availability values from DCS --- core/integration/dcs/plugin.go | 105 +++++++++++++++++++++++--------- core/integration/dcs/structs.go | 12 +++- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index c9859c277..db31ed4fc 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -63,13 +63,15 @@ type Plugin struct { dcsClient *RpcClient pendingEORs map[string] /*envId*/ int64 - detectorMatrix []*dcspb.DetectorInfo - detectorMatrixMu sync.RWMutex + detectorMap DCSDetectorInfoMap + detectorMapMu sync.RWMutex } type DCSDetectors []dcspb.Detector -type DCSDetectorStatesMap map[dcspb.Detector]dcspb.DetectorState +type DCSDetectorOpAvailabilityMap map[dcspb.Detector]dcspb.DetectorState + +type DCSDetectorInfoMap map[dcspb.Detector]*dcspb.DetectorInfo func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) @@ -83,11 +85,11 @@ func NewPlugin(endpoint string) integration.Plugin { portNumber, _ := strconv.Atoi(u.Port()) newPlugin := &Plugin{ - dcsHost: u.Hostname(), - dcsPort: portNumber, - dcsClient: nil, - pendingEORs: make(map[string]int64), - detectorMatrix: make([]*dcspb.DetectorInfo, 0), + dcsHost: u.Hostname(), + dcsPort: portNumber, + dcsClient: nil, + pendingEORs: make(map[string]int64), + detectorMap: make(DCSDetectorInfoMap), } return newPlugin } @@ -121,9 +123,9 @@ func (p *Plugin) GetData(_ []any) string { outMap := make(map[string]interface{}) outMap["partitions"] = p.partitionStatesForEnvs(environmentIds) - p.detectorMatrixMu.RLock() - outMap["detectors"] = p.detectorMatrix - p.detectorMatrixMu.RUnlock() + p.detectorMapMu.RLock() + outMap["detectors"] = p.detectorMap.ToEcsDetectors() + p.detectorMapMu.RUnlock() out, err := json.Marshal(outMap) if err != nil { @@ -155,6 +157,37 @@ func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]string { return out } +func (p *Plugin) updateLastKnownDetectorStates(detectorMatrix []*dcspb.DetectorInfo) { + p.detectorMapMu.Lock() + defer p.detectorMapMu.Unlock() + + for _, detInfo := range detectorMatrix { + dcsDet := detInfo.GetDetector() + if _, ok := p.detectorMap[dcsDet]; !ok { + p.detectorMap[dcsDet] = detInfo + } else { + if detInfo.State != dcspb.DetectorState_NULL_STATE { + p.detectorMap[dcsDet].State = detInfo.State + } + } + } +} + +func (p *Plugin) updateDetectorOpAvailabilities(detectorMatrix []*dcspb.DetectorInfo) { + p.detectorMapMu.Lock() + defer p.detectorMapMu.Unlock() + + for _, detInfo := range detectorMatrix { + dcsDet := detInfo.GetDetector() + if _, ok := p.detectorMap[dcsDet]; !ok { + p.detectorMap[dcsDet] = detInfo + } else { + p.detectorMap[dcsDet].PfrAvailability = detInfo.PfrAvailability + p.detectorMap[dcsDet].SorAvailability = detInfo.SorAvailability + } + } +} + func (p *Plugin) Init(instanceId string) error { if p.dcsClient == nil { cxt, cancel := context.WithCancel(context.Background()) @@ -192,9 +225,7 @@ func (p *Plugin) Init(instanceId string) error { if ev != nil && ev.Eventtype == dcspb.EventType_HEARTBEAT { log.Trace("received DCS heartbeat event") if dm := ev.GetDetectorMatrix(); len(dm) > 0 { - p.detectorMatrixMu.Lock() - p.detectorMatrix = dm - p.detectorMatrixMu.Unlock() + p.updateDetectorOpAvailabilities(dm) } continue } @@ -202,9 +233,7 @@ func (p *Plugin) Init(instanceId string) error { if ev != nil && ev.Eventtype == dcspb.EventType_STATE_CHANGE_EVENT { log.Trace("received DCS state change event") if dm := ev.GetDetectorMatrix(); len(dm) > 0 { - p.detectorMatrixMu.Lock() - p.detectorMatrix = dm - p.detectorMatrixMu.Unlock() + p.updateLastKnownDetectorStates(dm) } continue } @@ -242,26 +271,44 @@ func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack ma return stack } -func (p *Plugin) getDetectorsStates(dcsDetectors DCSDetectors) DCSDetectorStatesMap { - p.detectorMatrixMu.RLock() - defer p.detectorMatrixMu.RUnlock() +func (p *Plugin) getDetectorsPfrAvailability(dcsDetectors DCSDetectors) DCSDetectorOpAvailabilityMap { + p.detectorMapMu.RLock() + defer p.detectorMapMu.RUnlock() - detectorStatesMap := make(DCSDetectorStatesMap) + availabilityMap := make(DCSDetectorOpAvailabilityMap) for _, dcsDet := range dcsDetectors { if dcsDet == dcspb.Detector_DCS { continue } - detectorStatesMap[dcsDet] = dcspb.DetectorState_NULL_STATE + availabilityMap[dcsDet] = dcspb.DetectorState_NULL_STATE - for _, detInfo := range p.detectorMatrix { - if detInfo.Detector == dcsDet { - detectorStatesMap[dcsDet] = detInfo.State - } + if _, contains := p.detectorMap[dcsDet]; contains { + availabilityMap[dcsDet] = p.detectorMap[dcsDet].PfrAvailability + } + } + + return availabilityMap +} + +func (p *Plugin) getDetectorsSorAvailability(dcsDetectors DCSDetectors) DCSDetectorOpAvailabilityMap { + p.detectorMapMu.RLock() + defer p.detectorMapMu.RUnlock() + + availabilityMap := make(DCSDetectorOpAvailabilityMap) + + for _, dcsDet := range dcsDetectors { + if dcsDet == dcspb.Detector_DCS { + continue + } + availabilityMap[dcsDet] = dcspb.DetectorState_NULL_STATE + + if _, contains := p.detectorMap[dcsDet]; contains { + availabilityMap[dcsDet] = p.detectorMap[dcsDet].SorAvailability } } - return detectorStatesMap + return availabilityMap } func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { @@ -304,7 +351,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - knownDetectorStates := p.getDetectorsStates(dcsDetectors) + knownDetectorStates := p.getDetectorsPfrAvailability(dcsDetectors) isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) if !isCompatibleWithOperation { log.WithError(err). @@ -692,7 +739,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - knownDetectorStates := p.getDetectorsStates(dcsDetectors) + knownDetectorStates := p.getDetectorsSorAvailability(dcsDetectors) isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) if !isCompatibleWithOperation { log.WithError(err). diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index c79a2ab34..c8610d8bc 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -61,7 +61,7 @@ func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { return } -func (dsm DCSDetectorStatesMap) makeDetectorsByStateMap() map[dcspb.DetectorState]DCSDetectors { +func (dsm DCSDetectorOpAvailabilityMap) makeDetectorsByStateMap() map[dcspb.DetectorState]DCSDetectors { detectorsByState := make(map[dcspb.DetectorState]DCSDetectors) for det, detState := range dsm { if _, ok := detectorsByState[detState]; !ok { @@ -73,7 +73,7 @@ func (dsm DCSDetectorStatesMap) makeDetectorsByStateMap() map[dcspb.DetectorStat } // Returns true if the provided detectors are either all in conditionState or in NULL_STATE -func (dsm DCSDetectorStatesMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (bool, error) { +func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (bool, error) { detectorsByState := dsm.makeDetectorsByStateMap() detectorsInConditionState, thereAreDetectorsInConditionState := detectorsByState[conditionState] @@ -101,3 +101,11 @@ func (dsm DCSDetectorStatesMap) compatibleWithDCSOperation(conditionState dcspb. return false, fmt.Errorf("detectors are in incompatible states: %v", strings.Join(reportByState, "; ")) } } + +func (m DCSDetectorInfoMap) ToEcsDetectors() map[string]*dcspb.DetectorInfo { + out := make(map[string]*dcspb.DetectorInfo) + for k, v := range m { + out[dcsToEcsDetector(k)] = v + } + return out +} From a4aa3a45aecd28b0f31f25324cba60fcdd33a0fe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 18 Jan 2024 10:47:12 +0100 Subject: [PATCH 1780/2352] [core] Reformat DCS client data output --- core/integration/dcs/plugin.go | 57 ++++++++++++++++++++++++++++----- core/integration/dcs/structs.go | 45 ++++++++++++++++++++++++-- 2 files changed, 91 insertions(+), 11 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index db31ed4fc..6362dfedf 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -54,6 +54,7 @@ import ( const ( DCS_DIAL_TIMEOUT = 2 * time.Hour DCS_GENERAL_OP_TIMEOUT = 45 * time.Second + DCS_TIME_FORMAT = "2006-01-02 15:04:05.000" ) type Plugin struct { @@ -73,6 +74,8 @@ type DCSDetectorOpAvailabilityMap map[dcspb.Detector]dcspb.DetectorState type DCSDetectorInfoMap map[dcspb.Detector]*dcspb.DetectorInfo +type ECSDetectorInfoMap map[string]ECSDetectorInfo + func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -121,7 +124,7 @@ func (p *Plugin) GetData(_ []any) string { environmentIds := environment.ManagerInstance().Ids() outMap := make(map[string]interface{}) - outMap["partitions"] = p.partitionStatesForEnvs(environmentIds) + outMap["partitions"] = p.pendingEorsForEnvs(environmentIds) p.detectorMapMu.RLock() outMap["detectors"] = p.detectorMap.ToEcsDetectors() @@ -139,20 +142,50 @@ func (p *Plugin) GetEnvironmentsData(environmentIds []uid.ID) map[uid.ID]string return nil } - out := p.partitionStatesForEnvs(environmentIds) + envMan := environment.ManagerInstance() + pendingEors := p.pendingEorsForEnvs(environmentIds) + + out := make(map[uid.ID]string) + + detectorMap := p.detectorMap.ToEcsDetectors() + for _, envId := range environmentIds { + env, err := envMan.Environment(envId) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("DCS client cannot acquire environment") + continue + } + + includedDetectors := env.GetActiveDetectors().StringList() + includedDetectorsMap := detectorMap.Filtered(includedDetectors) + + pi := PartitionInfo{ + Detectors: includedDetectorsMap, + } + if pendingEorStatus, pendingEorExists := pendingEors[envId]; pendingEorExists { + pi.SorSuccessful = pendingEorStatus + } + + marshalled, err := json.Marshal(pi) + if err != nil { + continue + } + out[envId] = string(marshalled[:]) + } + return out } func (p *Plugin) GetEnvironmentsShortData(environmentIds []uid.ID) map[uid.ID]string { - return p.GetEnvironmentsData(environmentIds) + return nil } -func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]string { - out := make(map[uid.ID]string) +func (p *Plugin) pendingEorsForEnvs(envIds []uid.ID) map[uid.ID]bool { + out := make(map[uid.ID]bool) for _, envId := range envIds { - if _, ok := p.pendingEORs[envId.String()]; ok { - out[envId] = "SOR SUCCESSFUL" - } + _, pendingEorExists := p.pendingEORs[envId.String()] + out[envId] = pendingEorExists } return out } @@ -168,6 +201,10 @@ func (p *Plugin) updateLastKnownDetectorStates(detectorMatrix []*dcspb.DetectorI } else { if detInfo.State != dcspb.DetectorState_NULL_STATE { p.detectorMap[dcsDet].State = detInfo.State + timestamp, err := time.Parse(DCS_TIME_FORMAT, detInfo.Timestamp) + if err == nil { + p.detectorMap[dcsDet].Timestamp = fmt.Sprintf("%d", timestamp.UnixMilli()) + } } } } @@ -184,6 +221,10 @@ func (p *Plugin) updateDetectorOpAvailabilities(detectorMatrix []*dcspb.Detector } else { p.detectorMap[dcsDet].PfrAvailability = detInfo.PfrAvailability p.detectorMap[dcsDet].SorAvailability = detInfo.SorAvailability + timestamp, err := time.Parse(DCS_TIME_FORMAT, detInfo.Timestamp) + if err == nil { + p.detectorMap[dcsDet].Timestamp = fmt.Sprintf("%d", timestamp.UnixMilli()) + } } } } diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index c8610d8bc..324cb98d5 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -31,6 +31,19 @@ import ( dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" ) +type PartitionInfo struct { + SorSuccessful bool + Detectors ECSDetectorInfoMap +} + +type ECSDetectorInfo struct { + State string + Timestamp string + AllowedRunTypes []string + PfrAvailability string + SorAvailability string +} + func (d DCSDetectors) ToStringSlice() (sslice []string) { if d == nil { return @@ -102,10 +115,36 @@ func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionStat } } -func (m DCSDetectorInfoMap) ToEcsDetectors() map[string]*dcspb.DetectorInfo { - out := make(map[string]*dcspb.DetectorInfo) +func fromDcsDetectorInfo(d *dcspb.DetectorInfo) ECSDetectorInfo { + return ECSDetectorInfo{ + State: d.GetState().String(), + Timestamp: d.GetTimestamp(), + AllowedRunTypes: func(rts []dcspb.RunType) []string { + out := make([]string, len(rts)) + for i, rt := range rts { + out[i] = rt.String() + } + return out + }(d.GetAllowedRunTypes()), + PfrAvailability: d.GetPfrAvailability().String(), + SorAvailability: d.GetSorAvailability().String(), + } +} + +func (m DCSDetectorInfoMap) ToEcsDetectors() ECSDetectorInfoMap { + out := make(map[string]ECSDetectorInfo) for k, v := range m { - out[dcsToEcsDetector(k)] = v + out[dcsToEcsDetector(k)] = fromDcsDetectorInfo(v) + } + return out +} + +func (m ECSDetectorInfoMap) Filtered(detectorList []string) ECSDetectorInfoMap { + out := make(ECSDetectorInfoMap) + for _, det := range detectorList { + if _, ok := m[det]; ok { + out[det] = m[det] + } } return out } From 00d3dc3ea70097fe577fc9ab85a9fb1a4adc5dae Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 18 Jan 2024 13:05:10 +0100 Subject: [PATCH 1781/2352] [build] Bump to v1.2.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4a8299c88..db464360d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 1 +VERSION_MINOR := 2 VERSION_PATCH := 0 From 2f8a5cdd46943c596184e22f684ea8fee914e762 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Jan 2024 17:00:24 +0100 Subject: [PATCH 1782/2352] [core] Use PFR-specific values for DCS PFR op availability --- core/integration/dcs/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 6362dfedf..bca929a6d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -393,7 +393,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } knownDetectorStates := p.getDetectorsPfrAvailability(dcsDetectors) - isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) if !isCompatibleWithOperation { log.WithError(err). WithField("level", infologger.IL_Ops). From c5fdca8e25f6f724231d15e34bb1bde7b2c267ab Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Jan 2024 17:01:03 +0100 Subject: [PATCH 1783/2352] [build] Bump to v1.2.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index db464360d..2073a9189 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 2 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 93b6c98a77d36c3e58e6dfde216745c316e7d256 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 6 Feb 2024 12:43:26 +0100 Subject: [PATCH 1784/2352] [core] Fix DCS op availability check + unit test --- Makefile | 18 +-- core/integration/dcs/structs.go | 6 +- core/integration/dcs/structs_test.go | 195 +++++++++++++++++++++++++++ 3 files changed, 209 insertions(+), 10 deletions(-) create mode 100644 core/integration/dcs/structs_test.go diff --git a/Makefile b/Makefile index 306c10a66..6ea903dc5 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut TEST_DIRS := ./configuration/cfgbackend -GO_TEST_DIRS := ./core/repos +GO_TEST_DIRS := ./core/repos ./core/integration/dcs # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product @@ -148,18 +148,18 @@ endif done test: - @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.show-node-events + @echo -e "[Ginkgo] \033[1;33mgo test -v\033[0m $(TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v $(TEST_DIRS) -ginkgo.show-node-events - @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) + @echo -e "\n[gotest] \033[1;33mgo test -v\033[0m $(GO_TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v $(GO_TEST_DIRS) debugtest: - @echo -e "[Ginkgo] \033[1;33mgo test -v --race\033[0m $(TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.show-node-events + @echo -e "[Ginkgo] \033[1;33mgo test -v\033[0m $(TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.show-node-events - @echo -e "\n[gotest] \033[1;33mgo test -v --race\033[0m $(GO_TEST_DIRS)\033[0m" - @$(BUILD_FLAGS) go test -v --race $(GO_TEST_DIRS) + @echo -e "\n[gotest] \033[1;33mgo test -v\033[0m $(GO_TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -v $(GO_TEST_DIRS) vet: go vet $(SRC_DIRS) diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index 324cb98d5..849c7b480 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021-2023 CERN and copyright holders of ALICE O². + * Copyright 2021-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -89,6 +89,10 @@ func (dsm DCSDetectorOpAvailabilityMap) makeDetectorsByStateMap() map[dcspb.Dete func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (bool, error) { detectorsByState := dsm.makeDetectorsByStateMap() + if len(detectorsByState) == 0 { + return true, fmt.Errorf("no detectors provided") + } + detectorsInConditionState, thereAreDetectorsInConditionState := detectorsByState[conditionState] detectorsInNullState, thereAreDetectorsInNullState := detectorsByState[dcspb.DetectorState_NULL_STATE] diff --git a/core/integration/dcs/structs_test.go b/core/integration/dcs/structs_test.go new file mode 100644 index 000000000..3843d7121 --- /dev/null +++ b/core/integration/dcs/structs_test.go @@ -0,0 +1,195 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package dcs + +import ( + "testing" + + dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" +) + +func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { + type args struct { + conditionState dcspb.DetectorState + } + tests := []struct { + name string + dsm DCSDetectorOpAvailabilityMap + args args + want bool + wantErr bool + }{ + { + name: "condition=PFR_AVAILABLE/states=[]", + dsm: map[dcspb.Detector]dcspb.DetectorState{}, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: true, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=NULL", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: true, + wantErr: true, + }, + { + name: "condition=SOR_AVAILABLE/states=NULL", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, + }, + args: args{conditionState: dcspb.DetectorState_SOR_AVAILABLE}, + want: true, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=NULL,PFR_UNAVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_UNAVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: false, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=NULL,PFR_AVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: true, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=NULL,PFR_AVAILABLE,PFR_UNAVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_UNAVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: false, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_UNAVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: false, + wantErr: true, + }, + { + name: "condition=SOR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_UNAVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_SOR_AVAILABLE}, + want: false, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE,DEAD,ERROR,RUN_INHIBIT", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_DEAD, + dcspb.Detector_FT0: dcspb.DetectorState_ERROR, + dcspb.Detector_MID: dcspb.DetectorState_RUN_INHIBIT, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_UNAVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: false, + wantErr: true, + }, + { + name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_AVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_PFR_AVAILABLE}, + want: true, + wantErr: false, + }, + { + name: "condition=SOR_AVAILABLE/states=PFR_AVAILABLE", + dsm: map[dcspb.Detector]dcspb.DetectorState{ + dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_HMP: dcspb.DetectorState_PFR_AVAILABLE, + }, + args: args{conditionState: dcspb.DetectorState_SOR_AVAILABLE}, + want: false, + wantErr: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.dsm.compatibleWithDCSOperation(tt.args.conditionState) + if (err != nil) != tt.wantErr { + t.Errorf("compatibleWithDCSOperation() error = %v, wantErr %v", err, tt.wantErr) + return + } else if (err != nil) == tt.wantErr { + t.Logf("compatibleWithDCSOperation() error = %v, wantErr %v", err, tt.wantErr) + } + + if got != tt.want { + if err != nil { + t.Errorf("compatibleWithDCSOperation() got = %v, want %v, error = %s", got, tt.want, err.Error()) + } else { + t.Errorf("compatibleWithDCSOperation() got = %v, want %v", got, tt.want) + } + } + }) + } +} From 7783be0ad5ab942684d34d489795b0220c88a667 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 6 Feb 2024 14:43:13 +0100 Subject: [PATCH 1785/2352] [core] Ensure the DCS client gets op availability on STATE_CHANGE_EVENT --- core/integration/dcs/plugin.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index bca929a6d..a6a1578c9 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -199,6 +199,16 @@ func (p *Plugin) updateLastKnownDetectorStates(detectorMatrix []*dcspb.DetectorI if _, ok := p.detectorMap[dcsDet]; !ok { p.detectorMap[dcsDet] = detInfo } else { + // If we're getting a PFR or SOR availability information within the State field of an incoming STATE_CHANGE_EVENT, + // before processing it as any other state change, we need to update the availability fields + if detInfo.State == dcspb.DetectorState_PFR_AVAILABLE || detInfo.State == dcspb.DetectorState_PFR_UNAVAILABLE { + p.detectorMap[dcsDet].PfrAvailability = detInfo.State + } + if detInfo.State == dcspb.DetectorState_SOR_AVAILABLE || detInfo.State == dcspb.DetectorState_SOR_UNAVAILABLE { + p.detectorMap[dcsDet].SorAvailability = detInfo.State + } + + // if we're getting a STATE_CHANGE event with any non-null state if detInfo.State != dcspb.DetectorState_NULL_STATE { p.detectorMap[dcsDet].State = detInfo.State timestamp, err := time.Parse(DCS_TIME_FORMAT, detInfo.Timestamp) From 4875f847fd32e4dc0801fcd0fb55b9016a685455 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 8 Feb 2024 12:14:15 +0100 Subject: [PATCH 1786/2352] [build] Bump to v1.3.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2073a9189..f8ae4a74e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 2 -VERSION_PATCH := 1 +VERSION_MINOR := 3 +VERSION_PATCH := 0 From 101f12dc1e6de1b9e501cff6dfe1002a5257d4e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 13 Feb 2024 13:22:47 +0100 Subject: [PATCH 1787/2352] [apricot] implementation of GetRuntimeEntries rpc call --- apricot/cacheproxy/service.go | 4 + apricot/config.go | 1 + apricot/local/service.go | 21 + apricot/protos/apricot.pb.go | 719 ++++++++++++++++-------------- apricot/protos/apricot.proto | 7 +- apricot/protos/apricot_grpc.pb.go | 177 ++++++-- apricot/remote/server.go | 16 + apricot/remote/service.go | 12 + configuration/service.go | 1 + 9 files changed, 587 insertions(+), 371 deletions(-) diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index d89ab10ec..fcc72fbe0 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -49,6 +49,10 @@ func (s Service) SetRuntimeEntry(component string, key string, value string) err return s.base.SetRuntimeEntry(component, key, value) } +func (s Service) GetRuntimeEntries(component string) (map[string]string, error) { + return s.base.GetRuntimeEntries(component) +} + func (s Service) ListRuntimeEntries(component string) ([]string, error) { return s.base.ListRuntimeEntries(component) } diff --git a/apricot/config.go b/apricot/config.go index 3669a0b22..f6f3c9456 100644 --- a/apricot/config.go +++ b/apricot/config.go @@ -53,6 +53,7 @@ func setFlags() error { pflag.String("backendUri", viper.GetString("backendUri"), "URI of the Consul server or YAML configuration file") pflag.Bool("verbose", viper.GetBool("verbose"), "Verbose logging") pflag.Bool("trimSpaceInVarsFromConsulKV", viper.GetBool("trimSpaceInVarsFromConsulKV"), "When true, the variables imported from the Consul KV are trimmed if the contain whitespaces") + pflag.String("workingDir", viper.GetString("workingDir"), "Working directory for apricot") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/apricot/local/service.go b/apricot/local/service.go index ed8484dc7..749e3ec6a 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -45,6 +45,7 @@ import ( "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/configuration/template" "github.com/flosch/pongo2/v6" + "github.com/hashicorp/go-multierror" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -477,6 +478,26 @@ func (s *Service) SetRuntimeEntry(component string, key string, value string) er } } +func (s *Service) GetRuntimeEntries(component string) (map[string]string, error) { + s.logMethod() + + if keys, err := s.ListRuntimeEntries(component); err == nil { + var keysErrors *multierror.Error + entries := make(map[string]string) + for _, key := range keys { + if entry, err := s.GetRuntimeEntry(component, key); err == nil { + entries[key] = entry + } else { + keysErrors = multierror.Append(keysErrors, err) + } + } + return entries, keysErrors.ErrorOrNil() + } else { + return nil, err + } + +} + func (s *Service) ListRuntimeEntries(component string) ([]string, error) { s.logMethod() diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index dc86586c7..e53252a04 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.24.2 +// protoc-gen-go v1.31.0 +// protoc v4.25.1 // source: protos/apricot.proto package apricotpb @@ -1000,6 +1000,53 @@ func (x *GetEntryRequest) GetKey() string { return "" } +type GetRuntimeEntriesRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Component string `protobuf:"bytes,1,opt,name=component,proto3" json:"component,omitempty"` +} + +func (x *GetRuntimeEntriesRequest) Reset() { + *x = GetRuntimeEntriesRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetRuntimeEntriesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetRuntimeEntriesRequest) ProtoMessage() {} + +func (x *GetRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetRuntimeEntriesRequest.ProtoReflect.Descriptor instead. +func (*GetRuntimeEntriesRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{16} +} + +func (x *GetRuntimeEntriesRequest) GetComponent() string { + if x != nil { + return x.Component + } + return "" +} + type ListRuntimeEntriesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1011,7 +1058,7 @@ type ListRuntimeEntriesRequest struct { func (x *ListRuntimeEntriesRequest) Reset() { *x = ListRuntimeEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1024,7 +1071,7 @@ func (x *ListRuntimeEntriesRequest) String() string { func (*ListRuntimeEntriesRequest) ProtoMessage() {} func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[16] + mi := &file_protos_apricot_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1037,7 +1084,7 @@ func (x *ListRuntimeEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRuntimeEntriesRequest.ProtoReflect.Descriptor instead. func (*ListRuntimeEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{16} + return file_protos_apricot_proto_rawDescGZIP(), []int{17} } func (x *ListRuntimeEntriesRequest) GetComponent() string { @@ -1060,7 +1107,7 @@ type ComponentEntriesQuery struct { func (x *ComponentEntriesQuery) Reset() { *x = ComponentEntriesQuery{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1073,7 +1120,7 @@ func (x *ComponentEntriesQuery) String() string { func (*ComponentEntriesQuery) ProtoMessage() {} func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[17] + mi := &file_protos_apricot_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1086,7 +1133,7 @@ func (x *ComponentEntriesQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesQuery.ProtoReflect.Descriptor instead. func (*ComponentEntriesQuery) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{17} + return file_protos_apricot_proto_rawDescGZIP(), []int{18} } func (x *ComponentEntriesQuery) GetComponent() string { @@ -1126,7 +1173,7 @@ type ListComponentEntriesRequest struct { func (x *ListComponentEntriesRequest) Reset() { *x = ListComponentEntriesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1139,7 +1186,7 @@ func (x *ListComponentEntriesRequest) String() string { func (*ListComponentEntriesRequest) ProtoMessage() {} func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[18] + mi := &file_protos_apricot_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1152,7 +1199,7 @@ func (x *ListComponentEntriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListComponentEntriesRequest.ProtoReflect.Descriptor instead. func (*ListComponentEntriesRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{18} + return file_protos_apricot_proto_rawDescGZIP(), []int{19} } func (m *ListComponentEntriesRequest) GetQueryPath() isListComponentEntriesRequest_QueryPath { @@ -1210,7 +1257,7 @@ type ComponentEntriesResponse struct { func (x *ComponentEntriesResponse) Reset() { *x = ComponentEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1223,7 +1270,7 @@ func (x *ComponentEntriesResponse) String() string { func (*ComponentEntriesResponse) ProtoMessage() {} func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[19] + mi := &file_protos_apricot_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1236,7 +1283,7 @@ func (x *ComponentEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ComponentEntriesResponse.ProtoReflect.Descriptor instead. func (*ComponentEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{19} + return file_protos_apricot_proto_rawDescGZIP(), []int{20} } func (x *ComponentEntriesResponse) GetPayload() []string { @@ -1257,7 +1304,7 @@ type DetectorsRequest struct { func (x *DetectorsRequest) Reset() { *x = DetectorsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1270,7 +1317,7 @@ func (x *DetectorsRequest) String() string { func (*DetectorsRequest) ProtoMessage() {} func (x *DetectorsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[20] + mi := &file_protos_apricot_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1283,7 +1330,7 @@ func (x *DetectorsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsRequest.ProtoReflect.Descriptor instead. func (*DetectorsRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{20} + return file_protos_apricot_proto_rawDescGZIP(), []int{21} } func (x *DetectorsRequest) GetGetAll() bool { @@ -1304,7 +1351,7 @@ type DetectorsResponse struct { func (x *DetectorsResponse) Reset() { *x = DetectorsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1317,7 +1364,7 @@ func (x *DetectorsResponse) String() string { func (*DetectorsResponse) ProtoMessage() {} func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[21] + mi := &file_protos_apricot_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1330,7 +1377,7 @@ func (x *DetectorsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DetectorsResponse.ProtoReflect.Descriptor instead. func (*DetectorsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{21} + return file_protos_apricot_proto_rawDescGZIP(), []int{22} } func (x *DetectorsResponse) GetDetectors() []string { @@ -1351,7 +1398,7 @@ type HostGetRequest struct { func (x *HostGetRequest) Reset() { *x = HostGetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1364,7 +1411,7 @@ func (x *HostGetRequest) String() string { func (*HostGetRequest) ProtoMessage() {} func (x *HostGetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[22] + mi := &file_protos_apricot_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1377,7 +1424,7 @@ func (x *HostGetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HostGetRequest.ProtoReflect.Descriptor instead. func (*HostGetRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{22} + return file_protos_apricot_proto_rawDescGZIP(), []int{23} } func (x *HostGetRequest) GetDetector() string { @@ -1398,7 +1445,7 @@ type HostEntriesResponse struct { func (x *HostEntriesResponse) Reset() { *x = HostEntriesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1411,7 +1458,7 @@ func (x *HostEntriesResponse) String() string { func (*HostEntriesResponse) ProtoMessage() {} func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[23] + mi := &file_protos_apricot_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1424,7 +1471,7 @@ func (x *HostEntriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use HostEntriesResponse.ProtoReflect.Descriptor instead. func (*HostEntriesResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{23} + return file_protos_apricot_proto_rawDescGZIP(), []int{24} } func (x *HostEntriesResponse) GetHosts() []string { @@ -1448,7 +1495,7 @@ type ImportComponentConfigurationRequest struct { func (x *ImportComponentConfigurationRequest) Reset() { *x = ImportComponentConfigurationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1461,7 +1508,7 @@ func (x *ImportComponentConfigurationRequest) String() string { func (*ImportComponentConfigurationRequest) ProtoMessage() {} func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[24] + mi := &file_protos_apricot_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1474,7 +1521,7 @@ func (x *ImportComponentConfigurationRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ImportComponentConfigurationRequest.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{24} + return file_protos_apricot_proto_rawDescGZIP(), []int{25} } func (x *ImportComponentConfigurationRequest) GetQuery() *ComponentQuery { @@ -1518,7 +1565,7 @@ type ImportComponentConfigurationResponse struct { func (x *ImportComponentConfigurationResponse) Reset() { *x = ImportComponentConfigurationResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1531,7 +1578,7 @@ func (x *ImportComponentConfigurationResponse) String() string { func (*ImportComponentConfigurationResponse) ProtoMessage() {} func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[25] + mi := &file_protos_apricot_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1544,7 +1591,7 @@ func (x *ImportComponentConfigurationResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ImportComponentConfigurationResponse.ProtoReflect.Descriptor instead. func (*ImportComponentConfigurationResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{25} + return file_protos_apricot_proto_rawDescGZIP(), []int{26} } func (x *ImportComponentConfigurationResponse) GetExistingComponentUpdated() bool { @@ -1579,7 +1626,7 @@ type CRUCardsResponse struct { func (x *CRUCardsResponse) Reset() { *x = CRUCardsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[26] + mi := &file_protos_apricot_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1592,7 +1639,7 @@ func (x *CRUCardsResponse) String() string { func (*CRUCardsResponse) ProtoMessage() {} func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[26] + mi := &file_protos_apricot_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1605,7 +1652,7 @@ func (x *CRUCardsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardsResponse.ProtoReflect.Descriptor instead. func (*CRUCardsResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{26} + return file_protos_apricot_proto_rawDescGZIP(), []int{27} } func (x *CRUCardsResponse) GetCards() string { @@ -1627,7 +1674,7 @@ type CardRequest struct { func (x *CardRequest) Reset() { *x = CardRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[27] + mi := &file_protos_apricot_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1640,7 +1687,7 @@ func (x *CardRequest) String() string { func (*CardRequest) ProtoMessage() {} func (x *CardRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[27] + mi := &file_protos_apricot_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1653,7 +1700,7 @@ func (x *CardRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CardRequest.ProtoReflect.Descriptor instead. func (*CardRequest) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{27} + return file_protos_apricot_proto_rawDescGZIP(), []int{28} } func (x *CardRequest) GetHostname() string { @@ -1681,7 +1728,7 @@ type CRUCardEndpointResponse struct { func (x *CRUCardEndpointResponse) Reset() { *x = CRUCardEndpointResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protos_apricot_proto_msgTypes[28] + mi := &file_protos_apricot_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1694,7 +1741,7 @@ func (x *CRUCardEndpointResponse) String() string { func (*CRUCardEndpointResponse) ProtoMessage() {} func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { - mi := &file_protos_apricot_proto_msgTypes[28] + mi := &file_protos_apricot_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1707,7 +1754,7 @@ func (x *CRUCardEndpointResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CRUCardEndpointResponse.ProtoReflect.Descriptor instead. func (*CRUCardEndpointResponse) Descriptor() ([]byte, []int) { - return file_protos_apricot_proto_rawDescGZIP(), []int{28} + return file_protos_apricot_proto_rawDescGZIP(), []int{29} } func (x *CRUCardEndpointResponse) GetEndpoints() string { @@ -1813,221 +1860,230 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x22, 0x39, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, - 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, - 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, - 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, - 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, - 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, - 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, - 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, - 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, - 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, - 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, - 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, - 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, - 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, - 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, - 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, - 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, - 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, - 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, - 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, - 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, - 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, - 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, - 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, - 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xea, 0x0d, 0x0a, 0x07, 0x41, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, - 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, - 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, + 0x79, 0x22, 0x38, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x39, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, + 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, + 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, + 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, + 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, + 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, + 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, + 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, + 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, + 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, + 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, + 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, + 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, + 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, + 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, + 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, + 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, + 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, + 0x13, 0x10, 0xab, 0x02, 0x32, 0xb8, 0x0e, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, + 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, + 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, - 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, - 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, + 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, + 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, - 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, + 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, + 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, + 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, + 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, + 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, + 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, + 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, + 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2043,7 +2099,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 32) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 33) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -2062,79 +2118,82 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*GetRuntimeEntryRequest)(nil), // 14: apricot.GetRuntimeEntryRequest (*SetRuntimeEntryRequest)(nil), // 15: apricot.SetRuntimeEntryRequest (*GetEntryRequest)(nil), // 16: apricot.GetEntryRequest - (*ListRuntimeEntriesRequest)(nil), // 17: apricot.ListRuntimeEntriesRequest - (*ComponentEntriesQuery)(nil), // 18: apricot.ComponentEntriesQuery - (*ListComponentEntriesRequest)(nil), // 19: apricot.ListComponentEntriesRequest - (*ComponentEntriesResponse)(nil), // 20: apricot.ComponentEntriesResponse - (*DetectorsRequest)(nil), // 21: apricot.DetectorsRequest - (*DetectorsResponse)(nil), // 22: apricot.DetectorsResponse - (*HostGetRequest)(nil), // 23: apricot.HostGetRequest - (*HostEntriesResponse)(nil), // 24: apricot.HostEntriesResponse - (*ImportComponentConfigurationRequest)(nil), // 25: apricot.ImportComponentConfigurationRequest - (*ImportComponentConfigurationResponse)(nil), // 26: apricot.ImportComponentConfigurationResponse - (*CRUCardsResponse)(nil), // 27: apricot.CRUCardsResponse - (*CardRequest)(nil), // 28: apricot.CardRequest - (*CRUCardEndpointResponse)(nil), // 29: apricot.CRUCardEndpointResponse - nil, // 30: apricot.ComponentRequest.VarStackEntry - nil, // 31: apricot.DetectorEntriesResponse.DetectorEntriesEntry - nil, // 32: apricot.StringMap.StringMapEntry + (*GetRuntimeEntriesRequest)(nil), // 17: apricot.GetRuntimeEntriesRequest + (*ListRuntimeEntriesRequest)(nil), // 18: apricot.ListRuntimeEntriesRequest + (*ComponentEntriesQuery)(nil), // 19: apricot.ComponentEntriesQuery + (*ListComponentEntriesRequest)(nil), // 20: apricot.ListComponentEntriesRequest + (*ComponentEntriesResponse)(nil), // 21: apricot.ComponentEntriesResponse + (*DetectorsRequest)(nil), // 22: apricot.DetectorsRequest + (*DetectorsResponse)(nil), // 23: apricot.DetectorsResponse + (*HostGetRequest)(nil), // 24: apricot.HostGetRequest + (*HostEntriesResponse)(nil), // 25: apricot.HostEntriesResponse + (*ImportComponentConfigurationRequest)(nil), // 26: apricot.ImportComponentConfigurationRequest + (*ImportComponentConfigurationResponse)(nil), // 27: apricot.ImportComponentConfigurationResponse + (*CRUCardsResponse)(nil), // 28: apricot.CRUCardsResponse + (*CardRequest)(nil), // 29: apricot.CardRequest + (*CRUCardEndpointResponse)(nil), // 30: apricot.CRUCardEndpointResponse + nil, // 31: apricot.ComponentRequest.VarStackEntry + nil, // 32: apricot.DetectorEntriesResponse.DetectorEntriesEntry + nil, // 33: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 30, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 31, // 3: apricot.DetectorEntriesResponse.detectorEntries:type_name -> apricot.DetectorEntriesResponse.DetectorEntriesEntry - 32, // 4: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 31, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 32, // 3: apricot.DetectorEntriesResponse.detectorEntries:type_name -> apricot.DetectorEntriesResponse.DetectorEntriesEntry + 33, // 4: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 5: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType - 18, // 6: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery + 19, // 6: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 7: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery 9, // 8: apricot.DetectorEntriesResponse.DetectorEntriesEntry.value:type_name -> apricot.DetectorInventoryResponse 1, // 9: apricot.Apricot.NewRunNumber:input_type -> apricot.Empty 1, // 10: apricot.Apricot.GetDefaults:input_type -> apricot.Empty 1, // 11: apricot.Apricot.GetVars:input_type -> apricot.Empty 13, // 12: apricot.Apricot.RawGetRecursive:input_type -> apricot.RawGetRecursiveRequest - 21, // 13: apricot.Apricot.ListDetectors:input_type -> apricot.DetectorsRequest - 23, // 14: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest + 22, // 13: apricot.Apricot.ListDetectors:input_type -> apricot.DetectorsRequest + 24, // 14: apricot.Apricot.GetHostInventory:input_type -> apricot.HostGetRequest 1, // 15: apricot.Apricot.GetDetectorsInventory:input_type -> apricot.Empty 6, // 16: apricot.Apricot.GetDetectorForHost:input_type -> apricot.HostRequest 7, // 17: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest 6, // 18: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest - 28, // 19: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest + 29, // 19: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest 14, // 20: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest 15, // 21: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 17, // 22: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 1, // 23: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 19, // 24: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 25: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 26: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 2, // 28: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery - 25, // 29: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 1, // 30: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty - 11, // 31: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 12, // 32: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 12, // 33: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 34: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 22, // 35: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 24, // 36: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 10, // 37: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse - 8, // 38: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 22, // 39: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 27, // 40: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 29, // 41: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 42: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 43: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 20, // 44: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 45: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 20, // 46: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 20, // 47: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 48: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 49: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 2, // 50: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery - 26, // 51: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 1, // 52: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty - 31, // [31:53] is the sub-list for method output_type - 9, // [9:31] is the sub-list for method input_type + 17, // 22: apricot.Apricot.GetRuntimeEntries:input_type -> apricot.GetRuntimeEntriesRequest + 18, // 23: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 1, // 24: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 20, // 25: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 2, // 26: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery + 3, // 27: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 3, // 28: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest + 2, // 29: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery + 26, // 30: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 1, // 31: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty + 11, // 32: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 33: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 34: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 35: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 23, // 36: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 25, // 37: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 38: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 39: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 23, // 40: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 28, // 41: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 30, // 42: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 43: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 44: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 12, // 45: apricot.Apricot.GetRuntimeEntries:output_type -> apricot.StringMap + 21, // 46: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 21, // 47: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 21, // 48: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 21, // 49: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse + 4, // 50: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 51: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 2, // 52: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery + 27, // 53: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 1, // 54: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty + 32, // [32:55] is the sub-list for method output_type + 9, // [9:32] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name @@ -2339,7 +2398,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRuntimeEntriesRequest); i { + switch v := v.(*GetRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -2351,7 +2410,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesQuery); i { + switch v := v.(*ListRuntimeEntriesRequest); i { case 0: return &v.state case 1: @@ -2363,7 +2422,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListComponentEntriesRequest); i { + switch v := v.(*ComponentEntriesQuery); i { case 0: return &v.state case 1: @@ -2375,7 +2434,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ComponentEntriesResponse); i { + switch v := v.(*ListComponentEntriesRequest); i { case 0: return &v.state case 1: @@ -2387,7 +2446,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsRequest); i { + switch v := v.(*ComponentEntriesResponse); i { case 0: return &v.state case 1: @@ -2399,7 +2458,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DetectorsResponse); i { + switch v := v.(*DetectorsRequest); i { case 0: return &v.state case 1: @@ -2411,7 +2470,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostGetRequest); i { + switch v := v.(*DetectorsResponse); i { case 0: return &v.state case 1: @@ -2423,7 +2482,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HostEntriesResponse); i { + switch v := v.(*HostGetRequest); i { case 0: return &v.state case 1: @@ -2435,7 +2494,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationRequest); i { + switch v := v.(*HostEntriesResponse); i { case 0: return &v.state case 1: @@ -2447,7 +2506,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImportComponentConfigurationResponse); i { + switch v := v.(*ImportComponentConfigurationRequest); i { case 0: return &v.state case 1: @@ -2459,7 +2518,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CRUCardsResponse); i { + switch v := v.(*ImportComponentConfigurationResponse); i { case 0: return &v.state case 1: @@ -2471,7 +2530,7 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CardRequest); i { + switch v := v.(*CRUCardsResponse); i { case 0: return &v.state case 1: @@ -2483,6 +2542,18 @@ func file_protos_apricot_proto_init() { } } file_protos_apricot_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CardRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CRUCardEndpointResponse); i { case 0: return &v.state @@ -2499,7 +2570,7 @@ func file_protos_apricot_proto_init() { (*ComponentRequest_Path)(nil), (*ComponentRequest_Query)(nil), } - file_protos_apricot_proto_msgTypes[18].OneofWrappers = []interface{}{ + file_protos_apricot_proto_msgTypes[19].OneofWrappers = []interface{}{ (*ListComponentEntriesRequest_Path)(nil), (*ListComponentEntriesRequest_Query)(nil), } @@ -2509,7 +2580,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 32, + NumMessages: 33, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 6b37f8fe0..e02d226f2 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -46,6 +46,7 @@ service Apricot { // Runtime KV calls rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} rpc SetRuntimeEntry(SetRuntimeEntryRequest) returns (Empty) {} + rpc GetRuntimeEntries(GetRuntimeEntriesRequest) returns (StringMap) {} rpc ListRuntimeEntries(ListRuntimeEntriesRequest) returns (ComponentEntriesResponse) {} // Component configuration calls @@ -163,6 +164,10 @@ message GetEntryRequest { string key = 1; } +message GetRuntimeEntriesRequest { + string component = 1; +} + message ListRuntimeEntriesRequest { string component = 1; } @@ -225,4 +230,4 @@ message CardRequest { message CRUCardEndpointResponse { string endpoints = 1; -} \ No newline at end of file +} diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 0e06a91a1..15252494a 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -1,7 +1,30 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2020-2021 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v4.24.2 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.1 // source: protos/apricot.proto package apricotpb @@ -18,6 +41,32 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Apricot_NewRunNumber_FullMethodName = "/apricot.Apricot/NewRunNumber" + Apricot_GetDefaults_FullMethodName = "/apricot.Apricot/GetDefaults" + Apricot_GetVars_FullMethodName = "/apricot.Apricot/GetVars" + Apricot_RawGetRecursive_FullMethodName = "/apricot.Apricot/RawGetRecursive" + Apricot_ListDetectors_FullMethodName = "/apricot.Apricot/ListDetectors" + Apricot_GetHostInventory_FullMethodName = "/apricot.Apricot/GetHostInventory" + Apricot_GetDetectorsInventory_FullMethodName = "/apricot.Apricot/GetDetectorsInventory" + Apricot_GetDetectorForHost_FullMethodName = "/apricot.Apricot/GetDetectorForHost" + Apricot_GetDetectorsForHosts_FullMethodName = "/apricot.Apricot/GetDetectorsForHosts" + Apricot_GetCRUCardsForHost_FullMethodName = "/apricot.Apricot/GetCRUCardsForHost" + Apricot_GetEndpointsForCRUCard_FullMethodName = "/apricot.Apricot/GetEndpointsForCRUCard" + Apricot_GetRuntimeEntry_FullMethodName = "/apricot.Apricot/GetRuntimeEntry" + Apricot_SetRuntimeEntry_FullMethodName = "/apricot.Apricot/SetRuntimeEntry" + Apricot_GetRuntimeEntries_FullMethodName = "/apricot.Apricot/GetRuntimeEntries" + Apricot_ListRuntimeEntries_FullMethodName = "/apricot.Apricot/ListRuntimeEntries" + Apricot_ListComponents_FullMethodName = "/apricot.Apricot/ListComponents" + Apricot_ListComponentEntries_FullMethodName = "/apricot.Apricot/ListComponentEntries" + Apricot_ListComponentEntryHistory_FullMethodName = "/apricot.Apricot/ListComponentEntryHistory" + Apricot_GetComponentConfiguration_FullMethodName = "/apricot.Apricot/GetComponentConfiguration" + Apricot_GetComponentConfigurationWithLastIndex_FullMethodName = "/apricot.Apricot/GetComponentConfigurationWithLastIndex" + Apricot_ResolveComponentQuery_FullMethodName = "/apricot.Apricot/ResolveComponentQuery" + Apricot_ImportComponentConfiguration_FullMethodName = "/apricot.Apricot/ImportComponentConfiguration" + Apricot_InvalidateComponentTemplateCache_FullMethodName = "/apricot.Apricot/InvalidateComponentTemplateCache" +) + // ApricotClient is the client API for Apricot service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -37,6 +86,7 @@ type ApricotClient interface { // Runtime KV calls GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) + GetRuntimeEntries(ctx context.Context, in *GetRuntimeEntriesRequest, opts ...grpc.CallOption) (*StringMap, error) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) // Component configuration calls ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) @@ -59,7 +109,7 @@ func NewApricotClient(cc grpc.ClientConnInterface) ApricotClient { func (c *apricotClient) NewRunNumber(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunNumberResponse, error) { out := new(RunNumberResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/NewRunNumber", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_NewRunNumber_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -68,7 +118,7 @@ func (c *apricotClient) NewRunNumber(ctx context.Context, in *Empty, opts ...grp func (c *apricotClient) GetDefaults(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { out := new(StringMap) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDefaults", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetDefaults_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -77,7 +127,7 @@ func (c *apricotClient) GetDefaults(ctx context.Context, in *Empty, opts ...grpc func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*StringMap, error) { out := new(StringMap) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetVars", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetVars_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -86,7 +136,7 @@ func (c *apricotClient) GetVars(ctx context.Context, in *Empty, opts ...grpc.Cal func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursiveRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/RawGetRecursive", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_RawGetRecursive_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -95,7 +145,7 @@ func (c *apricotClient) RawGetRecursive(ctx context.Context, in *RawGetRecursive func (c *apricotClient) ListDetectors(ctx context.Context, in *DetectorsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) { out := new(DetectorsResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ListDetectors", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ListDetectors_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -104,7 +154,7 @@ func (c *apricotClient) ListDetectors(ctx context.Context, in *DetectorsRequest, func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest, opts ...grpc.CallOption) (*HostEntriesResponse, error) { out := new(HostEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetHostInventory", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetHostInventory_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -113,7 +163,7 @@ func (c *apricotClient) GetHostInventory(ctx context.Context, in *HostGetRequest func (c *apricotClient) GetDetectorsInventory(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*DetectorEntriesResponse, error) { out := new(DetectorEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorsInventory", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetDetectorsInventory_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -122,7 +172,7 @@ func (c *apricotClient) GetDetectorsInventory(ctx context.Context, in *Empty, op func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*DetectorResponse, error) { out := new(DetectorResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorForHost", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetDetectorForHost_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -131,7 +181,7 @@ func (c *apricotClient) GetDetectorForHost(ctx context.Context, in *HostRequest, func (c *apricotClient) GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) { out := new(DetectorsResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetDetectorsForHosts", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetDetectorsForHosts_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -140,7 +190,7 @@ func (c *apricotClient) GetDetectorsForHosts(ctx context.Context, in *HostsReque func (c *apricotClient) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) { out := new(CRUCardsResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetCRUCardsForHost", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetCRUCardsForHost_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -149,7 +199,7 @@ func (c *apricotClient) GetCRUCardsForHost(ctx context.Context, in *HostRequest, func (c *apricotClient) GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) { out := new(CRUCardEndpointResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetEndpointsForCRUCard", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetEndpointsForCRUCard_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -158,7 +208,7 @@ func (c *apricotClient) GetEndpointsForCRUCard(ctx context.Context, in *CardRequ func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetRuntimeEntry", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetRuntimeEntry_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -167,7 +217,16 @@ func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntry func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/apricot.Apricot/SetRuntimeEntry", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_SetRuntimeEntry_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetRuntimeEntries(ctx context.Context, in *GetRuntimeEntriesRequest, opts ...grpc.CallOption) (*StringMap, error) { + out := new(StringMap) + err := c.cc.Invoke(ctx, Apricot_GetRuntimeEntries_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -176,7 +235,7 @@ func (c *apricotClient) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntry func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ListRuntimeEntries", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ListRuntimeEntries_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -185,7 +244,7 @@ func (c *apricotClient) ListRuntimeEntries(ctx context.Context, in *ListRuntimeE func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponents", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ListComponents_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -194,7 +253,7 @@ func (c *apricotClient) ListComponents(ctx context.Context, in *Empty, opts ...g func (c *apricotClient) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponentEntries", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ListComponentEntries_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -203,7 +262,7 @@ func (c *apricotClient) ListComponentEntries(ctx context.Context, in *ListCompon func (c *apricotClient) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { out := new(ComponentEntriesResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ListComponentEntryHistory", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ListComponentEntryHistory_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -212,7 +271,7 @@ func (c *apricotClient) ListComponentEntryHistory(ctx context.Context, in *Compo func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfiguration", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetComponentConfiguration_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -221,7 +280,7 @@ func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *Compo func (c *apricotClient) GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) { out := new(ComponentResponseWithLastIndex) - err := c.cc.Invoke(ctx, "/apricot.Apricot/GetComponentConfigurationWithLastIndex", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_GetComponentConfigurationWithLastIndex_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -230,7 +289,7 @@ func (c *apricotClient) GetComponentConfigurationWithLastIndex(ctx context.Conte func (c *apricotClient) ResolveComponentQuery(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentQuery, error) { out := new(ComponentQuery) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ResolveComponentQuery", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ResolveComponentQuery_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -239,7 +298,7 @@ func (c *apricotClient) ResolveComponentQuery(ctx context.Context, in *Component func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *ImportComponentConfigurationRequest, opts ...grpc.CallOption) (*ImportComponentConfigurationResponse, error) { out := new(ImportComponentConfigurationResponse) - err := c.cc.Invoke(ctx, "/apricot.Apricot/ImportComponentConfiguration", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_ImportComponentConfiguration_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -248,7 +307,7 @@ func (c *apricotClient) ImportComponentConfiguration(ctx context.Context, in *Im func (c *apricotClient) InvalidateComponentTemplateCache(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/apricot.Apricot/InvalidateComponentTemplateCache", in, out, opts...) + err := c.cc.Invoke(ctx, Apricot_InvalidateComponentTemplateCache_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -274,6 +333,7 @@ type ApricotServer interface { // Runtime KV calls GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) + GetRuntimeEntries(context.Context, *GetRuntimeEntriesRequest) (*StringMap, error) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) // Component configuration calls ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) @@ -329,6 +389,9 @@ func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEn func (UnimplementedApricotServer) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SetRuntimeEntry not implemented") } +func (UnimplementedApricotServer) GetRuntimeEntries(context.Context, *GetRuntimeEntriesRequest) (*StringMap, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntries not implemented") +} func (UnimplementedApricotServer) ListRuntimeEntries(context.Context, *ListRuntimeEntriesRequest) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListRuntimeEntries not implemented") } @@ -378,7 +441,7 @@ func _Apricot_NewRunNumber_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/NewRunNumber", + FullMethod: Apricot_NewRunNumber_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).NewRunNumber(ctx, req.(*Empty)) @@ -396,7 +459,7 @@ func _Apricot_GetDefaults_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetDefaults", + FullMethod: Apricot_GetDefaults_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetDefaults(ctx, req.(*Empty)) @@ -414,7 +477,7 @@ func _Apricot_GetVars_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetVars", + FullMethod: Apricot_GetVars_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetVars(ctx, req.(*Empty)) @@ -432,7 +495,7 @@ func _Apricot_RawGetRecursive_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/RawGetRecursive", + FullMethod: Apricot_RawGetRecursive_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).RawGetRecursive(ctx, req.(*RawGetRecursiveRequest)) @@ -450,7 +513,7 @@ func _Apricot_ListDetectors_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ListDetectors", + FullMethod: Apricot_ListDetectors_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ListDetectors(ctx, req.(*DetectorsRequest)) @@ -468,7 +531,7 @@ func _Apricot_GetHostInventory_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetHostInventory", + FullMethod: Apricot_GetHostInventory_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetHostInventory(ctx, req.(*HostGetRequest)) @@ -486,7 +549,7 @@ func _Apricot_GetDetectorsInventory_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetDetectorsInventory", + FullMethod: Apricot_GetDetectorsInventory_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetDetectorsInventory(ctx, req.(*Empty)) @@ -504,7 +567,7 @@ func _Apricot_GetDetectorForHost_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetDetectorForHost", + FullMethod: Apricot_GetDetectorForHost_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetDetectorForHost(ctx, req.(*HostRequest)) @@ -522,7 +585,7 @@ func _Apricot_GetDetectorsForHosts_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetDetectorsForHosts", + FullMethod: Apricot_GetDetectorsForHosts_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetDetectorsForHosts(ctx, req.(*HostsRequest)) @@ -540,7 +603,7 @@ func _Apricot_GetCRUCardsForHost_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetCRUCardsForHost", + FullMethod: Apricot_GetCRUCardsForHost_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetCRUCardsForHost(ctx, req.(*HostRequest)) @@ -558,7 +621,7 @@ func _Apricot_GetEndpointsForCRUCard_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetEndpointsForCRUCard", + FullMethod: Apricot_GetEndpointsForCRUCard_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetEndpointsForCRUCard(ctx, req.(*CardRequest)) @@ -576,7 +639,7 @@ func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetRuntimeEntry", + FullMethod: Apricot_GetRuntimeEntry_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetRuntimeEntry(ctx, req.(*GetRuntimeEntryRequest)) @@ -594,7 +657,7 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/SetRuntimeEntry", + FullMethod: Apricot_SetRuntimeEntry_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).SetRuntimeEntry(ctx, req.(*SetRuntimeEntryRequest)) @@ -602,6 +665,24 @@ func _Apricot_SetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Apricot_GetRuntimeEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetRuntimeEntriesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetRuntimeEntries(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Apricot_GetRuntimeEntries_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetRuntimeEntries(ctx, req.(*GetRuntimeEntriesRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ListRuntimeEntriesRequest) if err := dec(in); err != nil { @@ -612,7 +693,7 @@ func _Apricot_ListRuntimeEntries_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ListRuntimeEntries", + FullMethod: Apricot_ListRuntimeEntries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ListRuntimeEntries(ctx, req.(*ListRuntimeEntriesRequest)) @@ -630,7 +711,7 @@ func _Apricot_ListComponents_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ListComponents", + FullMethod: Apricot_ListComponents_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ListComponents(ctx, req.(*Empty)) @@ -648,7 +729,7 @@ func _Apricot_ListComponentEntries_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ListComponentEntries", + FullMethod: Apricot_ListComponentEntries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ListComponentEntries(ctx, req.(*ListComponentEntriesRequest)) @@ -666,7 +747,7 @@ func _Apricot_ListComponentEntryHistory_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ListComponentEntryHistory", + FullMethod: Apricot_ListComponentEntryHistory_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ListComponentEntryHistory(ctx, req.(*ComponentQuery)) @@ -684,7 +765,7 @@ func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetComponentConfiguration", + FullMethod: Apricot_GetComponentConfiguration_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetComponentConfiguration(ctx, req.(*ComponentRequest)) @@ -702,7 +783,7 @@ func _Apricot_GetComponentConfigurationWithLastIndex_Handler(srv interface{}, ct } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/GetComponentConfigurationWithLastIndex", + FullMethod: Apricot_GetComponentConfigurationWithLastIndex_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).GetComponentConfigurationWithLastIndex(ctx, req.(*ComponentRequest)) @@ -720,7 +801,7 @@ func _Apricot_ResolveComponentQuery_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ResolveComponentQuery", + FullMethod: Apricot_ResolveComponentQuery_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ResolveComponentQuery(ctx, req.(*ComponentQuery)) @@ -738,7 +819,7 @@ func _Apricot_ImportComponentConfiguration_Handler(srv interface{}, ctx context. } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/ImportComponentConfiguration", + FullMethod: Apricot_ImportComponentConfiguration_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).ImportComponentConfiguration(ctx, req.(*ImportComponentConfigurationRequest)) @@ -756,7 +837,7 @@ func _Apricot_InvalidateComponentTemplateCache_Handler(srv interface{}, ctx cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/apricot.Apricot/InvalidateComponentTemplateCache", + FullMethod: Apricot_InvalidateComponentTemplateCache_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ApricotServer).InvalidateComponentTemplateCache(ctx, req.(*Empty)) @@ -823,6 +904,10 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "SetRuntimeEntry", Handler: _Apricot_SetRuntimeEntry_Handler, }, + { + MethodName: "GetRuntimeEntries", + Handler: _Apricot_GetRuntimeEntries_Handler, + }, { MethodName: "ListRuntimeEntries", Handler: _Apricot_ListRuntimeEntries_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 45ae0cb56..e7b980e7f 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -308,6 +308,22 @@ func (m *RpcServer) SetRuntimeEntry(_ context.Context, request *apricotpb.SetRun return &apricotpb.Empty{}, E_OK.Err() } +func (m *RpcServer) GetRuntimeEntries(_ context.Context, request *apricotpb.GetRuntimeEntriesRequest) (*apricotpb.StringMap, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + entries, err := m.service.GetRuntimeEntries(request.Component) + if err != nil { + return nil, err + } + return &apricotpb.StringMap{StringMap: entries}, E_OK.Err() +} + func (m *RpcServer) ListRuntimeEntries(_ context.Context, request *apricotpb.ListRuntimeEntriesRequest) (*apricotpb.ComponentEntriesResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index e00c15e4d..c56679c11 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -254,6 +254,18 @@ func (c *RemoteService) SetRuntimeEntry(component string, key string, value stri return nil } +func (c *RemoteService) GetRuntimeEntries(component string) (payload map[string]string, err error) { + request := &apricotpb.GetRuntimeEntriesRequest{ + Component: component, + } + var response *apricotpb.StringMap + response, err = c.cli.GetRuntimeEntries(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetStringMap(), nil +} + func (c *RemoteService) ListRuntimeEntries(component string) (payload []string, err error) { request := &apricotpb.ListRuntimeEntriesRequest{ Component: component, diff --git a/configuration/service.go b/configuration/service.go index 1e78d8cff..a74f0da00 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -30,6 +30,7 @@ import ( type RuntimeService interface { GetRuntimeEntry(component string, key string) (string, error) + GetRuntimeEntries(component string) (map[string]string, error) SetRuntimeEntry(component string, key string, value string) error ListRuntimeEntries(component string) ([]string, error) } From 0994e68d13bf0ef03b2f01894aedfcacc804afc5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 19 Feb 2024 09:55:26 +0100 Subject: [PATCH 1788/2352] Enable trace logs when core is run with --veryVerbose The already existing infrastructure can map logrus' TraceLevel to InfoLogger's Debug severity and Trace level. Also, Trace logs are enabled only if the core is ran with --veryVerbose, however, they are not propagated to InfoLogger. This commit enables the propagation of Trace logs to InfoLogger. I expect the impact to be minimal, as we run with --veryVerbose only when really needed and mostly in development setups. It is not aimed to be the default mode to operate with. This commit should have no effect on the logs from executor, as it is always ran with Debug level. --- common/logger/infologger/directhook.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index c3ead8e27..456015321 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -171,7 +171,7 @@ func (h *DirectHook) Levels() []logrus.Level { logrus.WarnLevel, logrus.InfoLevel, logrus.DebugLevel, - // logrus.TraceLevel, + logrus.TraceLevel, } } From 1783f5cce16f21cbe33aae585d65e25aaa7c6496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 20 Feb 2024 15:00:41 +0100 Subject: [PATCH 1789/2352] [core] implemented GetAvailableDetectors --- coconut/protos/o2control.pb.go | 1423 ++++++++++++++------------- coconut/protos/o2control_grpc.pb.go | 188 +++- core/protos/o2control.pb.go | 1423 ++++++++++++++------------- core/protos/o2control.proto | 7 +- core/protos/o2control_grpc.pb.go | 188 +++- core/server.go | 56 +- 6 files changed, 1818 insertions(+), 1467 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 8ab791262..d091ff4d4 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.23.4 +// protoc-gen-go v1.31.0 +// protoc v4.25.1 // source: protos/o2control.proto package pb @@ -263,7 +263,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{52, 0} } type VarSpecMessage_Type int32 @@ -318,7 +318,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{52, 1} } type Event_MesosHeartbeat struct { @@ -2380,6 +2380,53 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } +type GetAvailableDetectorsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *GetAvailableDetectorsReply) Reset() { + *x = GetAvailableDetectorsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAvailableDetectorsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAvailableDetectorsReply) ProtoMessage() {} + +func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAvailableDetectorsReply.ProtoReflect.Descriptor instead. +func (*GetAvailableDetectorsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} +} + +func (x *GetAvailableDetectorsReply) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + // ////////////////////////////////////// // Environment, GET/SET properties // ////////////////////////////////////// @@ -2397,7 +2444,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2410,7 +2457,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2423,7 +2470,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2449,7 +2496,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2462,7 +2509,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2475,7 +2522,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } type GetEnvironmentPropertiesRequest struct { @@ -2494,7 +2541,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2507,7 +2554,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,7 +2567,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2555,7 +2602,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2568,7 +2615,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2581,7 +2628,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2614,7 +2661,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2627,7 +2674,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2640,7 +2687,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *ShortTaskInfo) GetName() string { @@ -2727,7 +2774,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2740,7 +2787,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2753,7 +2800,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2793,7 +2840,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2806,7 +2853,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2819,7 +2866,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } type GetTasksReply struct { @@ -2833,7 +2880,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2846,7 +2893,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2859,7 +2906,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2880,7 +2927,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2893,7 +2940,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2906,7 +2953,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetTaskRequest) GetTaskId() string { @@ -2927,7 +2974,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2987,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,7 +3000,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2975,7 +3022,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2988,7 +3035,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3001,7 +3048,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *TaskClassInfo) GetName() string { @@ -3033,7 +3080,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3046,7 +3093,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3059,7 +3106,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *CommandInfo) GetEnv() []string { @@ -3110,7 +3157,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3123,7 +3170,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3136,7 +3183,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *ChannelInfo) GetName() string { @@ -3178,7 +3225,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3191,7 +3238,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3204,7 +3251,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3274,7 +3321,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3334,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3347,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3322,7 +3369,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3335,7 +3382,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3348,7 +3395,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3380,7 +3427,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3393,7 +3440,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3406,7 +3453,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *GetRolesRequest) GetEnvId() string { @@ -3444,7 +3491,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3457,7 +3504,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3470,7 +3517,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *RoleInfo) GetName() string { @@ -3561,7 +3608,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3574,7 +3621,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3587,7 +3634,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3612,7 +3659,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3625,7 +3672,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3638,7 +3685,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3696,7 +3743,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3709,7 +3756,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3722,7 +3769,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3810,7 +3857,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3823,7 +3870,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3836,7 +3883,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3885,7 +3932,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3898,7 +3945,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3911,7 +3958,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3932,7 +3979,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3945,7 +3992,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3958,7 +4005,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3982,7 +4029,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3995,7 +4042,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4008,7 +4055,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *RepoInfo) GetName() string { @@ -4051,7 +4098,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4064,7 +4111,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4077,7 +4124,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -4106,7 +4153,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4119,7 +4166,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4132,7 +4179,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *AddRepoRequest) GetName() string { @@ -4161,7 +4208,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4174,7 +4221,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4187,7 +4234,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4215,7 +4262,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4228,7 +4275,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4241,7 +4288,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4262,7 +4309,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4275,7 +4322,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4288,7 +4335,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4309,7 +4356,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +4369,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +4382,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4356,7 +4403,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +4416,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4382,7 +4429,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4403,7 +4450,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4416,7 +4463,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4429,7 +4476,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4451,7 +4498,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4464,7 +4511,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4477,7 +4524,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4505,7 +4552,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4518,7 +4565,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4531,7 +4578,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4550,7 +4597,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4563,7 +4610,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4576,7 +4623,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } type ListIntegratedServicesReply struct { @@ -4590,7 +4637,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4603,7 +4650,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4616,7 +4663,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{68} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4641,7 +4688,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4654,7 +4701,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4667,7 +4714,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{69} } func (x *IntegratedServiceInfo) GetName() string { @@ -5033,404 +5080,413 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, - 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, - 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, - 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, - 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, - 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, - 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, - 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, - 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, - 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, - 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, - 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, - 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, - 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, - 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, - 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, - 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, - 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, - 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, - 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, + 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, - 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, - 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, - 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, - 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, + 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, + 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, + 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, + 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, + 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, + 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, + 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, + 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, + 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, + 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, + 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd6, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -5521,7 +5577,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5559,59 +5615,60 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply - (*SetEnvironmentPropertiesRequest)(nil), // 36: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 37: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 38: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 39: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 40: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 41: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 42: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 43: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 44: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 45: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 46: o2control.TaskClassInfo - (*CommandInfo)(nil), // 47: o2control.CommandInfo - (*ChannelInfo)(nil), // 48: o2control.ChannelInfo - (*TaskInfo)(nil), // 49: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 50: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 51: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 52: o2control.GetRolesRequest - (*RoleInfo)(nil), // 53: o2control.RoleInfo - (*GetRolesReply)(nil), // 54: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 55: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 56: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 59: o2control.ListReposRequest - (*RepoInfo)(nil), // 60: o2control.RepoInfo - (*ListReposReply)(nil), // 61: o2control.ListReposReply - (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 63: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 71: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 72: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 73: o2control.IntegratedServiceInfo - nil, // 74: o2control.EnvironmentInfo.DefaultsEntry - nil, // 75: o2control.EnvironmentInfo.VarsEntry - nil, // 76: o2control.EnvironmentInfo.UserVarsEntry - nil, // 77: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 78: o2control.NewEnvironmentRequest.VarsEntry - nil, // 79: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 80: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 81: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 82: o2control.TaskInfo.PropertiesEntry - nil, // 83: o2control.RoleInfo.DefaultsEntry - nil, // 84: o2control.RoleInfo.VarsEntry - nil, // 85: o2control.RoleInfo.UserVarsEntry - nil, // 86: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 87: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 88: o2control.ListIntegratedServicesReply.ServicesEntry + (*GetAvailableDetectorsReply)(nil), // 36: o2control.GetAvailableDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 44: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 46: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo + (*CommandInfo)(nil), // 48: o2control.CommandInfo + (*ChannelInfo)(nil), // 49: o2control.ChannelInfo + (*TaskInfo)(nil), // 50: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest + (*RoleInfo)(nil), // 54: o2control.RoleInfo + (*GetRolesReply)(nil), // 55: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 57: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 58: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 59: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 60: o2control.ListReposRequest + (*RepoInfo)(nil), // 61: o2control.RepoInfo + (*ListReposReply)(nil), // 62: o2control.ListReposReply + (*AddRepoRequest)(nil), // 63: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 64: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 65: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 66: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 67: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 68: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 69: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 70: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 71: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 72: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 73: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 74: o2control.IntegratedServiceInfo + nil, // 75: o2control.EnvironmentInfo.DefaultsEntry + nil, // 76: o2control.EnvironmentInfo.VarsEntry + nil, // 77: o2control.EnvironmentInfo.UserVarsEntry + nil, // 78: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 79: o2control.NewEnvironmentRequest.VarsEntry + nil, // 80: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 81: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 82: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 83: o2control.TaskInfo.PropertiesEntry + nil, // 84: o2control.RoleInfo.DefaultsEntry + nil, // 85: o2control.RoleInfo.VarsEntry + nil, // 86: o2control.RoleInfo.UserVarsEntry + nil, // 87: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 88: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 89: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5622,48 +5679,48 @@ var file_protos_o2control_proto_depIdxs = []int32{ 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 40, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 77, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 78, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 41, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 75, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 76, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 77, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 78, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 79, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 79, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 80, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 53, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 54, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 51, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 80, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 81, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 41, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 40, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 49, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 40, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 46, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 48, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 48, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 47, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 82, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 40, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 40, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 53, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 83, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 84, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 85, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 86, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 53, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 52, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 81, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 82, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 41, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 50, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 41, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 47, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 49, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 49, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 48, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 83, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 41, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 41, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 54, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 84, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 85, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 86, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 87, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 54, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 87, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 57, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 88, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 56, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 73, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 88, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 58, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 61, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest @@ -5674,48 +5731,50 @@ var file_protos_o2control_proto_depIdxs = []int32{ 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 71, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 42, // 61: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 44, // 62: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 50, // 63: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 52, // 64: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 55, // 65: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 66: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 67: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 68: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 69: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 70: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 71: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 72: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 73: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 71, // 74: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 75: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 77: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 78: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 79: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 80: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 81: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 82: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 83: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 84: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 85: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 43, // 86: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 45, // 87: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 51, // 88: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 54, // 89: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 90: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 91: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 92: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 93: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 94: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 95: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 96: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 97: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 98: o2control.Control.Subscribe:output_type -> o2control.Event - 72, // 99: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 75, // [75:100] is the sub-list for method output_type - 50, // [50:75] is the sub-list for method input_type + 72, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 72, // 61: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 43, // 62: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 63: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 64: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 65: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 66: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 60, // 67: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 63, // 68: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 65, // 69: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 67, // 70: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 68, // 71: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 69, // 72: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 70, // 73: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 74: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 72, // 75: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 76: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 77: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 78: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 79: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 80: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 81: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 82: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 83: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 84: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 85: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 86: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 36, // 87: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 44, // 88: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 89: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 90: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 91: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 59, // 92: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 62, // 93: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 64, // 94: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 66, // 95: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 72, // 96: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 72, // 97: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 72, // 98: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 71, // 99: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 100: o2control.Control.Subscribe:output_type -> o2control.Event + 73, // 101: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 76, // [76:102] is the sub-list for method output_type + 50, // [50:76] is the sub-list for method input_type 50, // [50:50] is the sub-list for extension type_name 50, // [50:50] is the sub-list for extension extendee 0, // [0:50] is the sub-list for field type_name @@ -6100,7 +6159,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesRequest); i { + switch v := v.(*GetAvailableDetectorsReply); i { case 0: return &v.state case 1: @@ -6112,7 +6171,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesReply); i { + switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -6124,7 +6183,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesRequest); i { + switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -6136,7 +6195,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesReply); i { + switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -6148,7 +6207,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShortTaskInfo); i { + switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -6160,7 +6219,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskDeploymentInfo); i { + switch v := v.(*ShortTaskInfo); i { case 0: return &v.state case 1: @@ -6172,7 +6231,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksRequest); i { + switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state case 1: @@ -6184,7 +6243,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksReply); i { + switch v := v.(*GetTasksRequest); i { case 0: return &v.state case 1: @@ -6196,7 +6255,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskRequest); i { + switch v := v.(*GetTasksReply); i { case 0: return &v.state case 1: @@ -6208,7 +6267,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskReply); i { + switch v := v.(*GetTaskRequest); i { case 0: return &v.state case 1: @@ -6220,7 +6279,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { + switch v := v.(*GetTaskReply); i { case 0: return &v.state case 1: @@ -6232,7 +6291,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandInfo); i { + switch v := v.(*TaskClassInfo); i { case 0: return &v.state case 1: @@ -6244,7 +6303,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelInfo); i { + switch v := v.(*CommandInfo); i { case 0: return &v.state case 1: @@ -6256,7 +6315,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskInfo); i { + switch v := v.(*ChannelInfo); i { case 0: return &v.state case 1: @@ -6268,7 +6327,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksRequest); i { + switch v := v.(*TaskInfo); i { case 0: return &v.state case 1: @@ -6280,7 +6339,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksReply); i { + switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state case 1: @@ -6292,7 +6351,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesRequest); i { + switch v := v.(*CleanupTasksReply); i { case 0: return &v.state case 1: @@ -6304,7 +6363,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInfo); i { + switch v := v.(*GetRolesRequest); i { case 0: return &v.state case 1: @@ -6316,7 +6375,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesReply); i { + switch v := v.(*RoleInfo); i { case 0: return &v.state case 1: @@ -6328,7 +6387,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesRequest); i { + switch v := v.(*GetRolesReply); i { case 0: return &v.state case 1: @@ -6340,7 +6399,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VarSpecMessage); i { + switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -6352,7 +6411,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -6364,7 +6423,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -6376,7 +6435,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -6388,7 +6447,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -6400,7 +6459,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -6412,7 +6471,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -6424,7 +6483,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -6436,7 +6495,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -6448,7 +6507,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -6460,7 +6519,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -6472,7 +6531,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -6484,7 +6543,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -6496,7 +6555,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6508,7 +6567,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6520,7 +6579,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -6532,7 +6591,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -6544,6 +6603,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6570,7 +6641,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 84, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 0ece9cea9..e3bca95b1 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -1,7 +1,30 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v4.23.4 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.1 // source: protos/o2control.proto package pb @@ -18,6 +41,35 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" + Control_GetFrameworkInfo_FullMethodName = "/o2control.Control/GetFrameworkInfo" + Control_Teardown_FullMethodName = "/o2control.Control/Teardown" + Control_GetEnvironments_FullMethodName = "/o2control.Control/GetEnvironments" + Control_NewAutoEnvironment_FullMethodName = "/o2control.Control/NewAutoEnvironment" + Control_NewEnvironment_FullMethodName = "/o2control.Control/NewEnvironment" + Control_GetEnvironment_FullMethodName = "/o2control.Control/GetEnvironment" + Control_ControlEnvironment_FullMethodName = "/o2control.Control/ControlEnvironment" + Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" + Control_DestroyEnvironment_FullMethodName = "/o2control.Control/DestroyEnvironment" + Control_GetActiveDetectors_FullMethodName = "/o2control.Control/GetActiveDetectors" + Control_GetAvailableDetectors_FullMethodName = "/o2control.Control/GetAvailableDetectors" + Control_GetTasks_FullMethodName = "/o2control.Control/GetTasks" + Control_GetTask_FullMethodName = "/o2control.Control/GetTask" + Control_CleanupTasks_FullMethodName = "/o2control.Control/CleanupTasks" + Control_GetRoles_FullMethodName = "/o2control.Control/GetRoles" + Control_GetWorkflowTemplates_FullMethodName = "/o2control.Control/GetWorkflowTemplates" + Control_ListRepos_FullMethodName = "/o2control.Control/ListRepos" + Control_AddRepo_FullMethodName = "/o2control.Control/AddRepo" + Control_RemoveRepo_FullMethodName = "/o2control.Control/RemoveRepo" + Control_RefreshRepos_FullMethodName = "/o2control.Control/RefreshRepos" + Control_SetDefaultRepo_FullMethodName = "/o2control.Control/SetDefaultRepo" + Control_SetGlobalDefaultRevision_FullMethodName = "/o2control.Control/SetGlobalDefaultRevision" + Control_SetRepoDefaultRevision_FullMethodName = "/o2control.Control/SetRepoDefaultRevision" + Control_Subscribe_FullMethodName = "/o2control.Control/Subscribe" + Control_GetIntegratedServices_FullMethodName = "/o2control.Control/GetIntegratedServices" +) + // ControlClient is the client API for Control service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -33,6 +85,7 @@ type ControlClient interface { ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) + GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -58,7 +111,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_TrackStatus_FullMethodName, opts...) if err != nil { return nil, err } @@ -91,7 +144,7 @@ func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetFrameworkInfo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -100,7 +153,7 @@ func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkIn func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -109,7 +162,7 @@ func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetEnvironments_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -118,7 +171,7 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_NewAutoEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -127,7 +180,7 @@ func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvir func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_NewEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -136,7 +189,7 @@ func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRe func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -145,7 +198,7 @@ func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRe func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ControlEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -154,7 +207,7 @@ func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvir func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -163,7 +216,7 @@ func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnviron func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_DestroyEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -172,7 +225,16 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) { out := new(GetActiveDetectorsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetActiveDetectors", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetActiveDetectors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) { + out := new(GetAvailableDetectorsReply) + err := c.cc.Invoke(ctx, Control_GetAvailableDetectors_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -181,7 +243,7 @@ func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -190,7 +252,7 @@ func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetTask_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -199,7 +261,7 @@ func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts .. func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + err := c.cc.Invoke(ctx, Control_CleanupTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -208,7 +270,7 @@ func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksReques func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetRoles_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -217,7 +279,7 @@ func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetWorkflowTemplates_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -226,7 +288,7 @@ func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflo func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ListRepos_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -235,7 +297,7 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_AddRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -244,7 +306,7 @@ func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts .. func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_RemoveRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -253,7 +315,7 @@ func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, o func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + err := c.cc.Invoke(ctx, Control_RefreshRepos_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -262,7 +324,7 @@ func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposReques func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetDefaultRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -271,7 +333,7 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetGlobalDefaultRevision_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -280,7 +342,7 @@ func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlo func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetRepoDefaultRevision_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -288,7 +350,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_Subscribe_FullMethodName, opts...) if err != nil { return nil, err } @@ -321,7 +383,7 @@ func (x *controlSubscribeClient) Recv() (*Event, error) { func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) { out := new(ListIntegratedServicesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetIntegratedServices", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetIntegratedServices_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -343,6 +405,7 @@ type ControlServer interface { ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) + GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -397,6 +460,9 @@ func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEn func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetActiveDetectors not implemented") } +func (UnimplementedControlServer) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAvailableDetectors not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -483,7 +549,7 @@ func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", + FullMethod: Control_GetFrameworkInfo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) @@ -501,7 +567,7 @@ func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/Teardown", + FullMethod: Control_Teardown_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) @@ -519,7 +585,7 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", + FullMethod: Control_GetEnvironments_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) @@ -537,7 +603,7 @@ func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", + FullMethod: Control_NewAutoEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) @@ -555,7 +621,7 @@ func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", + FullMethod: Control_NewEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) @@ -573,7 +639,7 @@ func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", + FullMethod: Control_GetEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) @@ -591,7 +657,7 @@ func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", + FullMethod: Control_ControlEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) @@ -609,7 +675,7 @@ func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", + FullMethod: Control_ModifyEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) @@ -627,7 +693,7 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", + FullMethod: Control_DestroyEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) @@ -645,7 +711,7 @@ func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetActiveDetectors", + FullMethod: Control_GetActiveDetectors_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetActiveDetectors(ctx, req.(*Empty)) @@ -653,6 +719,24 @@ func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Control_GetAvailableDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetAvailableDetectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_GetAvailableDetectors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetAvailableDetectors(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -663,7 +747,7 @@ func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTasks", + FullMethod: Control_GetTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) @@ -681,7 +765,7 @@ func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTask", + FullMethod: Control_GetTask_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) @@ -699,7 +783,7 @@ func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", + FullMethod: Control_CleanupTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) @@ -717,7 +801,7 @@ func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetRoles", + FullMethod: Control_GetRoles_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) @@ -735,7 +819,7 @@ func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", + FullMethod: Control_GetWorkflowTemplates_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) @@ -753,7 +837,7 @@ func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ListRepos", + FullMethod: Control_ListRepos_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) @@ -771,7 +855,7 @@ func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/AddRepo", + FullMethod: Control_AddRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) @@ -789,7 +873,7 @@ func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", + FullMethod: Control_RemoveRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) @@ -807,7 +891,7 @@ func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", + FullMethod: Control_RefreshRepos_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) @@ -825,7 +909,7 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", + FullMethod: Control_SetDefaultRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) @@ -843,7 +927,7 @@ func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + FullMethod: Control_SetGlobalDefaultRevision_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) @@ -861,7 +945,7 @@ func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", + FullMethod: Control_SetRepoDefaultRevision_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) @@ -900,7 +984,7 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetIntegratedServices", + FullMethod: Control_GetIntegratedServices_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetIntegratedServices(ctx, req.(*Empty)) @@ -955,6 +1039,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetActiveDetectors", Handler: _Control_GetActiveDetectors_Handler, }, + { + MethodName: "GetAvailableDetectors", + Handler: _Control_GetAvailableDetectors_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 8ab791262..d091ff4d4 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.23.4 +// protoc-gen-go v1.31.0 +// protoc v4.25.1 // source: protos/o2control.proto package pb @@ -263,7 +263,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{52, 0} } type VarSpecMessage_Type int32 @@ -318,7 +318,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{52, 1} } type Event_MesosHeartbeat struct { @@ -2380,6 +2380,53 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } +type GetAvailableDetectorsReply struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` +} + +func (x *GetAvailableDetectorsReply) Reset() { + *x = GetAvailableDetectorsReply{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_o2control_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetAvailableDetectorsReply) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAvailableDetectorsReply) ProtoMessage() {} + +func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { + mi := &file_protos_o2control_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAvailableDetectorsReply.ProtoReflect.Descriptor instead. +func (*GetAvailableDetectorsReply) Descriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{31} +} + +func (x *GetAvailableDetectorsReply) GetDetectors() []string { + if x != nil { + return x.Detectors + } + return nil +} + // ////////////////////////////////////// // Environment, GET/SET properties // ////////////////////////////////////// @@ -2397,7 +2444,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2410,7 +2457,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2423,7 +2470,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2449,7 +2496,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2462,7 +2509,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2475,7 +2522,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } type GetEnvironmentPropertiesRequest struct { @@ -2494,7 +2541,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2507,7 +2554,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2520,7 +2567,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2555,7 +2602,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2568,7 +2615,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2581,7 +2628,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2614,7 +2661,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2627,7 +2674,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2640,7 +2687,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *ShortTaskInfo) GetName() string { @@ -2727,7 +2774,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2740,7 +2787,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2753,7 +2800,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2793,7 +2840,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2806,7 +2853,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2819,7 +2866,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } type GetTasksReply struct { @@ -2833,7 +2880,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2846,7 +2893,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2859,7 +2906,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2880,7 +2927,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2893,7 +2940,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2906,7 +2953,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetTaskRequest) GetTaskId() string { @@ -2927,7 +2974,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2987,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,7 +3000,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -2975,7 +3022,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2988,7 +3035,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3001,7 +3048,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *TaskClassInfo) GetName() string { @@ -3033,7 +3080,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3046,7 +3093,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3059,7 +3106,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *CommandInfo) GetEnv() []string { @@ -3110,7 +3157,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3123,7 +3170,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3136,7 +3183,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *ChannelInfo) GetName() string { @@ -3178,7 +3225,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3191,7 +3238,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3204,7 +3251,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3274,7 +3321,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3287,7 +3334,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3300,7 +3347,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3322,7 +3369,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3335,7 +3382,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3348,7 +3395,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3380,7 +3427,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3393,7 +3440,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3406,7 +3453,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *GetRolesRequest) GetEnvId() string { @@ -3444,7 +3491,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3457,7 +3504,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3470,7 +3517,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *RoleInfo) GetName() string { @@ -3561,7 +3608,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3574,7 +3621,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3587,7 +3634,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3612,7 +3659,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3625,7 +3672,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3638,7 +3685,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3696,7 +3743,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3709,7 +3756,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3722,7 +3769,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3810,7 +3857,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3823,7 +3870,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3836,7 +3883,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3885,7 +3932,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3898,7 +3945,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3911,7 +3958,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3932,7 +3979,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3945,7 +3992,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3958,7 +4005,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3982,7 +4029,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3995,7 +4042,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4008,7 +4055,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *RepoInfo) GetName() string { @@ -4051,7 +4098,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4064,7 +4111,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4077,7 +4124,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -4106,7 +4153,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4119,7 +4166,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4132,7 +4179,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *AddRepoRequest) GetName() string { @@ -4161,7 +4208,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4174,7 +4221,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4187,7 +4234,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4215,7 +4262,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4228,7 +4275,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4241,7 +4288,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4262,7 +4309,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4275,7 +4322,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4288,7 +4335,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4309,7 +4356,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +4369,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +4382,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{62} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4356,7 +4403,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +4416,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4382,7 +4429,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{63} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4403,7 +4450,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4416,7 +4463,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4429,7 +4476,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{64} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4451,7 +4498,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4464,7 +4511,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4477,7 +4524,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{65} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4505,7 +4552,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4518,7 +4565,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4531,7 +4578,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{66} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4550,7 +4597,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4563,7 +4610,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4576,7 +4623,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{67} } type ListIntegratedServicesReply struct { @@ -4590,7 +4637,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4603,7 +4650,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4616,7 +4663,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{68} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4641,7 +4688,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4654,7 +4701,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4667,7 +4714,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{69} } func (x *IntegratedServiceInfo) GetName() string { @@ -5033,404 +5080,413 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, - 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, - 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, - 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, - 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, - 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, - 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, - 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, - 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, - 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, - 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, - 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, - 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, - 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, - 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, - 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, - 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, - 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, + 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, + 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, + 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, + 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, + 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, - 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, - 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, - 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, - 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, - 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, - 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, - 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, - 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, - 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, - 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, - 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, - 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, - 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, - 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, - 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, + 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, - 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, - 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, - 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, - 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, - 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x32, 0x82, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, - 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, + 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, + 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, + 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, + 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, + 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, + 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, + 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, + 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, + 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, + 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, + 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, + 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, + 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, + 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, + 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, + 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd6, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, - 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, + 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -5521,7 +5577,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 84) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 85) var file_protos_o2control_proto_goTypes = []interface{}{ (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype @@ -5559,59 +5615,60 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply - (*SetEnvironmentPropertiesRequest)(nil), // 36: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 37: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 38: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 39: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 40: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 41: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 42: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 43: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 44: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 45: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 46: o2control.TaskClassInfo - (*CommandInfo)(nil), // 47: o2control.CommandInfo - (*ChannelInfo)(nil), // 48: o2control.ChannelInfo - (*TaskInfo)(nil), // 49: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 50: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 51: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 52: o2control.GetRolesRequest - (*RoleInfo)(nil), // 53: o2control.RoleInfo - (*GetRolesReply)(nil), // 54: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 55: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 56: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 57: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 58: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 59: o2control.ListReposRequest - (*RepoInfo)(nil), // 60: o2control.RepoInfo - (*ListReposReply)(nil), // 61: o2control.ListReposReply - (*AddRepoRequest)(nil), // 62: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 63: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 64: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 65: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 66: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 67: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 68: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 69: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 70: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 71: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 72: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 73: o2control.IntegratedServiceInfo - nil, // 74: o2control.EnvironmentInfo.DefaultsEntry - nil, // 75: o2control.EnvironmentInfo.VarsEntry - nil, // 76: o2control.EnvironmentInfo.UserVarsEntry - nil, // 77: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 78: o2control.NewEnvironmentRequest.VarsEntry - nil, // 79: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 80: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 81: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 82: o2control.TaskInfo.PropertiesEntry - nil, // 83: o2control.RoleInfo.DefaultsEntry - nil, // 84: o2control.RoleInfo.VarsEntry - nil, // 85: o2control.RoleInfo.UserVarsEntry - nil, // 86: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 87: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 88: o2control.ListIntegratedServicesReply.ServicesEntry + (*GetAvailableDetectorsReply)(nil), // 36: o2control.GetAvailableDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 44: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 46: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo + (*CommandInfo)(nil), // 48: o2control.CommandInfo + (*ChannelInfo)(nil), // 49: o2control.ChannelInfo + (*TaskInfo)(nil), // 50: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest + (*RoleInfo)(nil), // 54: o2control.RoleInfo + (*GetRolesReply)(nil), // 55: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 57: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 58: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 59: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 60: o2control.ListReposRequest + (*RepoInfo)(nil), // 61: o2control.RepoInfo + (*ListReposReply)(nil), // 62: o2control.ListReposReply + (*AddRepoRequest)(nil), // 63: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 64: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 65: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 66: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 67: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 68: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 69: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 70: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 71: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 72: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 73: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 74: o2control.IntegratedServiceInfo + nil, // 75: o2control.EnvironmentInfo.DefaultsEntry + nil, // 76: o2control.EnvironmentInfo.VarsEntry + nil, // 77: o2control.EnvironmentInfo.UserVarsEntry + nil, // 78: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 79: o2control.NewEnvironmentRequest.VarsEntry + nil, // 80: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 81: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 82: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 83: o2control.TaskInfo.PropertiesEntry + nil, // 84: o2control.RoleInfo.DefaultsEntry + nil, // 85: o2control.RoleInfo.VarsEntry + nil, // 86: o2control.RoleInfo.UserVarsEntry + nil, // 87: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 88: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 89: o2control.ListIntegratedServicesReply.ServicesEntry } var file_protos_o2control_proto_depIdxs = []int32{ 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate @@ -5622,48 +5679,48 @@ var file_protos_o2control_proto_depIdxs = []int32{ 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 40, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 74, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 75, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 76, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 77, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 78, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 41, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 75, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 76, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 77, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 78, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 79, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 79, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 80, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 53, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 54, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 51, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 80, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 81, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 41, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 40, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 49, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 40, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 46, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 48, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 48, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 47, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 82, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 40, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 40, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 53, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 83, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 84, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 85, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 86, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 53, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 52, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 81, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 82, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 41, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 50, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 41, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 47, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 49, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 49, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 48, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 83, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 41, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 41, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 54, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 84, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 85, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 86, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 87, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 54, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 87, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 57, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 60, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 88, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 56, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 73, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 88, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 58, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 61, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest @@ -5674,48 +5731,50 @@ var file_protos_o2control_proto_depIdxs = []int32{ 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 71, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 42, // 61: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 44, // 62: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 50, // 63: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 52, // 64: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 55, // 65: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 59, // 66: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 62, // 67: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 64, // 68: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 66, // 69: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 67, // 70: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 68, // 71: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 69, // 72: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 73: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 71, // 74: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 75: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 77: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 78: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 79: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 80: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 81: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 82: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 83: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 84: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 85: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 43, // 86: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 45, // 87: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 51, // 88: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 54, // 89: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 58, // 90: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 61, // 91: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 63, // 92: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 65, // 93: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 71, // 94: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 71, // 95: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 71, // 96: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 70, // 97: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 98: o2control.Control.Subscribe:output_type -> o2control.Event - 72, // 99: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 75, // [75:100] is the sub-list for method output_type - 50, // [50:75] is the sub-list for method input_type + 72, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 72, // 61: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 43, // 62: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 63: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 64: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 65: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 66: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 60, // 67: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 63, // 68: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 65, // 69: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 67, // 70: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 68, // 71: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 69, // 72: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 70, // 73: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 74: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 72, // 75: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 10, // 76: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 16, // 77: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 18, // 78: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 20, // 79: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 80: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 81: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 82: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 83: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 32, // 84: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 34, // 85: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 86: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 36, // 87: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 44, // 88: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 89: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 90: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 91: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 59, // 92: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 62, // 93: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 64, // 94: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 66, // 95: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 72, // 96: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 72, // 97: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 72, // 98: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 71, // 99: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 100: o2control.Control.Subscribe:output_type -> o2control.Event + 73, // 101: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 76, // [76:102] is the sub-list for method output_type + 50, // [50:76] is the sub-list for method input_type 50, // [50:50] is the sub-list for extension type_name 50, // [50:50] is the sub-list for extension extendee 0, // [0:50] is the sub-list for field type_name @@ -6100,7 +6159,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesRequest); i { + switch v := v.(*GetAvailableDetectorsReply); i { case 0: return &v.state case 1: @@ -6112,7 +6171,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetEnvironmentPropertiesReply); i { + switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -6124,7 +6183,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesRequest); i { + switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -6136,7 +6195,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetEnvironmentPropertiesReply); i { + switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state case 1: @@ -6148,7 +6207,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShortTaskInfo); i { + switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state case 1: @@ -6160,7 +6219,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskDeploymentInfo); i { + switch v := v.(*ShortTaskInfo); i { case 0: return &v.state case 1: @@ -6172,7 +6231,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksRequest); i { + switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state case 1: @@ -6184,7 +6243,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTasksReply); i { + switch v := v.(*GetTasksRequest); i { case 0: return &v.state case 1: @@ -6196,7 +6255,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskRequest); i { + switch v := v.(*GetTasksReply); i { case 0: return &v.state case 1: @@ -6208,7 +6267,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetTaskReply); i { + switch v := v.(*GetTaskRequest); i { case 0: return &v.state case 1: @@ -6220,7 +6279,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { + switch v := v.(*GetTaskReply); i { case 0: return &v.state case 1: @@ -6232,7 +6291,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CommandInfo); i { + switch v := v.(*TaskClassInfo); i { case 0: return &v.state case 1: @@ -6244,7 +6303,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChannelInfo); i { + switch v := v.(*CommandInfo); i { case 0: return &v.state case 1: @@ -6256,7 +6315,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskInfo); i { + switch v := v.(*ChannelInfo); i { case 0: return &v.state case 1: @@ -6268,7 +6327,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksRequest); i { + switch v := v.(*TaskInfo); i { case 0: return &v.state case 1: @@ -6280,7 +6339,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CleanupTasksReply); i { + switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state case 1: @@ -6292,7 +6351,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesRequest); i { + switch v := v.(*CleanupTasksReply); i { case 0: return &v.state case 1: @@ -6304,7 +6363,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RoleInfo); i { + switch v := v.(*GetRolesRequest); i { case 0: return &v.state case 1: @@ -6316,7 +6375,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRolesReply); i { + switch v := v.(*RoleInfo); i { case 0: return &v.state case 1: @@ -6328,7 +6387,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesRequest); i { + switch v := v.(*GetRolesReply); i { case 0: return &v.state case 1: @@ -6340,7 +6399,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VarSpecMessage); i { + switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state case 1: @@ -6352,7 +6411,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WorkflowTemplateInfo); i { + switch v := v.(*VarSpecMessage); i { case 0: return &v.state case 1: @@ -6364,7 +6423,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetWorkflowTemplatesReply); i { + switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state case 1: @@ -6376,7 +6435,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposRequest); i { + switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state case 1: @@ -6388,7 +6447,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepoInfo); i { + switch v := v.(*ListReposRequest); i { case 0: return &v.state case 1: @@ -6400,7 +6459,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListReposReply); i { + switch v := v.(*RepoInfo); i { case 0: return &v.state case 1: @@ -6412,7 +6471,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoRequest); i { + switch v := v.(*ListReposReply); i { case 0: return &v.state case 1: @@ -6424,7 +6483,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddRepoReply); i { + switch v := v.(*AddRepoRequest); i { case 0: return &v.state case 1: @@ -6436,7 +6495,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoRequest); i { + switch v := v.(*AddRepoReply); i { case 0: return &v.state case 1: @@ -6448,7 +6507,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveRepoReply); i { + switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state case 1: @@ -6460,7 +6519,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RefreshReposRequest); i { + switch v := v.(*RemoveRepoReply); i { case 0: return &v.state case 1: @@ -6472,7 +6531,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetDefaultRepoRequest); i { + switch v := v.(*RefreshReposRequest); i { case 0: return &v.state case 1: @@ -6484,7 +6543,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetGlobalDefaultRevisionRequest); i { + switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state case 1: @@ -6496,7 +6555,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionRequest); i { + switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6508,7 +6567,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetRepoDefaultRevisionReply); i { + switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state case 1: @@ -6520,7 +6579,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { + switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state case 1: @@ -6532,7 +6591,7 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListIntegratedServicesReply); i { + switch v := v.(*Empty); i { case 0: return &v.state case 1: @@ -6544,6 +6603,18 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListIntegratedServicesReply); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_o2control_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6570,7 +6641,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 5, - NumMessages: 84, + NumMessages: 85, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index b575da220..03c280f8e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -73,6 +73,7 @@ service Control { rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} rpc DestroyEnvironment (DestroyEnvironmentRequest) returns (DestroyEnvironmentReply) {} rpc GetActiveDetectors (Empty) returns (GetActiveDetectorsReply) {} + rpc GetAvailableDetectors (Empty) returns (GetAvailableDetectorsReply) {} // rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} // rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} @@ -280,6 +281,10 @@ message GetActiveDetectorsReply { repeated string detectors = 1; } +message GetAvailableDetectorsReply { + repeated string detectors = 1; +} + //////////////////////////////////////// // Environment, GET/SET properties //////////////////////////////////////// @@ -522,4 +527,4 @@ message IntegratedServiceInfo { string endpoint = 3; string connectionState = 4; // allowed values: READY, CONNECTING, TRANSIENT_FAILURE, IDLE, SHUTDOWN string data = 5; // always a JSON payload with a map inside. -} \ No newline at end of file +} diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 884a14e1a..faa355ec7 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -1,7 +1,30 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v4.23.4 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.1 // source: protos/o2control.proto package pb @@ -18,6 +41,35 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" + Control_GetFrameworkInfo_FullMethodName = "/o2control.Control/GetFrameworkInfo" + Control_Teardown_FullMethodName = "/o2control.Control/Teardown" + Control_GetEnvironments_FullMethodName = "/o2control.Control/GetEnvironments" + Control_NewAutoEnvironment_FullMethodName = "/o2control.Control/NewAutoEnvironment" + Control_NewEnvironment_FullMethodName = "/o2control.Control/NewEnvironment" + Control_GetEnvironment_FullMethodName = "/o2control.Control/GetEnvironment" + Control_ControlEnvironment_FullMethodName = "/o2control.Control/ControlEnvironment" + Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" + Control_DestroyEnvironment_FullMethodName = "/o2control.Control/DestroyEnvironment" + Control_GetActiveDetectors_FullMethodName = "/o2control.Control/GetActiveDetectors" + Control_GetAvailableDetectors_FullMethodName = "/o2control.Control/GetAvailableDetectors" + Control_GetTasks_FullMethodName = "/o2control.Control/GetTasks" + Control_GetTask_FullMethodName = "/o2control.Control/GetTask" + Control_CleanupTasks_FullMethodName = "/o2control.Control/CleanupTasks" + Control_GetRoles_FullMethodName = "/o2control.Control/GetRoles" + Control_GetWorkflowTemplates_FullMethodName = "/o2control.Control/GetWorkflowTemplates" + Control_ListRepos_FullMethodName = "/o2control.Control/ListRepos" + Control_AddRepo_FullMethodName = "/o2control.Control/AddRepo" + Control_RemoveRepo_FullMethodName = "/o2control.Control/RemoveRepo" + Control_RefreshRepos_FullMethodName = "/o2control.Control/RefreshRepos" + Control_SetDefaultRepo_FullMethodName = "/o2control.Control/SetDefaultRepo" + Control_SetGlobalDefaultRevision_FullMethodName = "/o2control.Control/SetGlobalDefaultRevision" + Control_SetRepoDefaultRevision_FullMethodName = "/o2control.Control/SetRepoDefaultRevision" + Control_Subscribe_FullMethodName = "/o2control.Control/Subscribe" + Control_GetIntegratedServices_FullMethodName = "/o2control.Control/GetIntegratedServices" +) + // ControlClient is the client API for Control service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -33,6 +85,7 @@ type ControlClient interface { ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) + GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -58,7 +111,7 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { } func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], "/o2control.Control/TrackStatus", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_TrackStatus_FullMethodName, opts...) if err != nil { return nil, err } @@ -91,7 +144,7 @@ func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { out := new(GetFrameworkInfoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetFrameworkInfo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetFrameworkInfo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -100,7 +153,7 @@ func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkIn func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { out := new(TeardownReply) - err := c.cc.Invoke(ctx, "/o2control.Control/Teardown", in, out, opts...) + err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -109,7 +162,7 @@ func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { out := new(GetEnvironmentsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironments", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetEnvironments_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -118,7 +171,7 @@ func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironments func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) { out := new(NewAutoEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewAutoEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_NewAutoEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -127,7 +180,7 @@ func (c *controlClient) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvir func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { out := new(NewEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/NewEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_NewEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -136,7 +189,7 @@ func (c *controlClient) NewEnvironment(ctx context.Context, in *NewEnvironmentRe func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) { out := new(GetEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -145,7 +198,7 @@ func (c *controlClient) GetEnvironment(ctx context.Context, in *GetEnvironmentRe func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) { out := new(ControlEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ControlEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ControlEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -154,7 +207,7 @@ func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvir func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ModifyEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -163,7 +216,7 @@ func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnviron func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { out := new(DestroyEnvironmentReply) - err := c.cc.Invoke(ctx, "/o2control.Control/DestroyEnvironment", in, out, opts...) + err := c.cc.Invoke(ctx, Control_DestroyEnvironment_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -172,7 +225,16 @@ func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvir func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) { out := new(GetActiveDetectorsReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetActiveDetectors", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetActiveDetectors_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) { + out := new(GetAvailableDetectorsReply) + err := c.cc.Invoke(ctx, Control_GetAvailableDetectors_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -181,7 +243,7 @@ func (c *controlClient) GetActiveDetectors(ctx context.Context, in *Empty, opts func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTasks", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -190,7 +252,7 @@ func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) { out := new(GetTaskReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetTask", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetTask_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -199,7 +261,7 @@ func (c *controlClient) GetTask(ctx context.Context, in *GetTaskRequest, opts .. func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) { out := new(CleanupTasksReply) - err := c.cc.Invoke(ctx, "/o2control.Control/CleanupTasks", in, out, opts...) + err := c.cc.Invoke(ctx, Control_CleanupTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -208,7 +270,7 @@ func (c *controlClient) CleanupTasks(ctx context.Context, in *CleanupTasksReques func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts ...grpc.CallOption) (*GetRolesReply, error) { out := new(GetRolesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetRoles", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetRoles_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -217,7 +279,7 @@ func (c *controlClient) GetRoles(ctx context.Context, in *GetRolesRequest, opts func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflowTemplatesRequest, opts ...grpc.CallOption) (*GetWorkflowTemplatesReply, error) { out := new(GetWorkflowTemplatesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetWorkflowTemplates", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetWorkflowTemplates_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -226,7 +288,7 @@ func (c *controlClient) GetWorkflowTemplates(ctx context.Context, in *GetWorkflo func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opts ...grpc.CallOption) (*ListReposReply, error) { out := new(ListReposReply) - err := c.cc.Invoke(ctx, "/o2control.Control/ListRepos", in, out, opts...) + err := c.cc.Invoke(ctx, Control_ListRepos_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -235,7 +297,7 @@ func (c *controlClient) ListRepos(ctx context.Context, in *ListReposRequest, opt func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts ...grpc.CallOption) (*AddRepoReply, error) { out := new(AddRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/AddRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_AddRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -244,7 +306,7 @@ func (c *controlClient) AddRepo(ctx context.Context, in *AddRepoRequest, opts .. func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, opts ...grpc.CallOption) (*RemoveRepoReply, error) { out := new(RemoveRepoReply) - err := c.cc.Invoke(ctx, "/o2control.Control/RemoveRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_RemoveRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -253,7 +315,7 @@ func (c *controlClient) RemoveRepo(ctx context.Context, in *RemoveRepoRequest, o func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/RefreshRepos", in, out, opts...) + err := c.cc.Invoke(ctx, Control_RefreshRepos_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -262,7 +324,7 @@ func (c *controlClient) RefreshRepos(ctx context.Context, in *RefreshReposReques func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetDefaultRepo", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetDefaultRepo_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -271,7 +333,7 @@ func (c *controlClient) SetDefaultRepo(ctx context.Context, in *SetDefaultRepoRe func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlobalDefaultRevisionRequest, opts ...grpc.CallOption) (*Empty, error) { out := new(Empty) - err := c.cc.Invoke(ctx, "/o2control.Control/SetGlobalDefaultRevision", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetGlobalDefaultRevision_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -280,7 +342,7 @@ func (c *controlClient) SetGlobalDefaultRevision(ctx context.Context, in *SetGlo func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) { out := new(SetRepoDefaultRevisionReply) - err := c.cc.Invoke(ctx, "/o2control.Control/SetRepoDefaultRevision", in, out, opts...) + err := c.cc.Invoke(ctx, Control_SetRepoDefaultRevision_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -288,7 +350,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], "/o2control.Control/Subscribe", opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_Subscribe_FullMethodName, opts...) if err != nil { return nil, err } @@ -321,7 +383,7 @@ func (x *controlSubscribeClient) Recv() (*Event, error) { func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) { out := new(ListIntegratedServicesReply) - err := c.cc.Invoke(ctx, "/o2control.Control/GetIntegratedServices", in, out, opts...) + err := c.cc.Invoke(ctx, Control_GetIntegratedServices_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -343,6 +405,7 @@ type ControlServer interface { ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) + GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -396,6 +459,9 @@ func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEn func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetActiveDetectors not implemented") } +func (UnimplementedControlServer) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAvailableDetectors not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -481,7 +547,7 @@ func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetFrameworkInfo", + FullMethod: Control_GetFrameworkInfo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetFrameworkInfo(ctx, req.(*GetFrameworkInfoRequest)) @@ -499,7 +565,7 @@ func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/Teardown", + FullMethod: Control_Teardown_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) @@ -517,7 +583,7 @@ func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetEnvironments", + FullMethod: Control_GetEnvironments_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetEnvironments(ctx, req.(*GetEnvironmentsRequest)) @@ -535,7 +601,7 @@ func _Control_NewAutoEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/NewAutoEnvironment", + FullMethod: Control_NewAutoEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).NewAutoEnvironment(ctx, req.(*NewAutoEnvironmentRequest)) @@ -553,7 +619,7 @@ func _Control_NewEnvironment_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/NewEnvironment", + FullMethod: Control_NewEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).NewEnvironment(ctx, req.(*NewEnvironmentRequest)) @@ -571,7 +637,7 @@ func _Control_GetEnvironment_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetEnvironment", + FullMethod: Control_GetEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetEnvironment(ctx, req.(*GetEnvironmentRequest)) @@ -589,7 +655,7 @@ func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ControlEnvironment", + FullMethod: Control_ControlEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ControlEnvironment(ctx, req.(*ControlEnvironmentRequest)) @@ -607,7 +673,7 @@ func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ModifyEnvironment", + FullMethod: Control_ModifyEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) @@ -625,7 +691,7 @@ func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/DestroyEnvironment", + FullMethod: Control_DestroyEnvironment_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).DestroyEnvironment(ctx, req.(*DestroyEnvironmentRequest)) @@ -643,7 +709,7 @@ func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetActiveDetectors", + FullMethod: Control_GetActiveDetectors_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetActiveDetectors(ctx, req.(*Empty)) @@ -651,6 +717,24 @@ func _Control_GetActiveDetectors_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Control_GetAvailableDetectors_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).GetAvailableDetectors(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_GetAvailableDetectors_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).GetAvailableDetectors(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -661,7 +745,7 @@ func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTasks", + FullMethod: Control_GetTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetTasks(ctx, req.(*GetTasksRequest)) @@ -679,7 +763,7 @@ func _Control_GetTask_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetTask", + FullMethod: Control_GetTask_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetTask(ctx, req.(*GetTaskRequest)) @@ -697,7 +781,7 @@ func _Control_CleanupTasks_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/CleanupTasks", + FullMethod: Control_CleanupTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).CleanupTasks(ctx, req.(*CleanupTasksRequest)) @@ -715,7 +799,7 @@ func _Control_GetRoles_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetRoles", + FullMethod: Control_GetRoles_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetRoles(ctx, req.(*GetRolesRequest)) @@ -733,7 +817,7 @@ func _Control_GetWorkflowTemplates_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetWorkflowTemplates", + FullMethod: Control_GetWorkflowTemplates_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetWorkflowTemplates(ctx, req.(*GetWorkflowTemplatesRequest)) @@ -751,7 +835,7 @@ func _Control_ListRepos_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/ListRepos", + FullMethod: Control_ListRepos_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).ListRepos(ctx, req.(*ListReposRequest)) @@ -769,7 +853,7 @@ func _Control_AddRepo_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/AddRepo", + FullMethod: Control_AddRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).AddRepo(ctx, req.(*AddRepoRequest)) @@ -787,7 +871,7 @@ func _Control_RemoveRepo_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/RemoveRepo", + FullMethod: Control_RemoveRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).RemoveRepo(ctx, req.(*RemoveRepoRequest)) @@ -805,7 +889,7 @@ func _Control_RefreshRepos_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/RefreshRepos", + FullMethod: Control_RefreshRepos_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).RefreshRepos(ctx, req.(*RefreshReposRequest)) @@ -823,7 +907,7 @@ func _Control_SetDefaultRepo_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetDefaultRepo", + FullMethod: Control_SetDefaultRepo_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetDefaultRepo(ctx, req.(*SetDefaultRepoRequest)) @@ -841,7 +925,7 @@ func _Control_SetGlobalDefaultRevision_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetGlobalDefaultRevision", + FullMethod: Control_SetGlobalDefaultRevision_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetGlobalDefaultRevision(ctx, req.(*SetGlobalDefaultRevisionRequest)) @@ -859,7 +943,7 @@ func _Control_SetRepoDefaultRevision_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/SetRepoDefaultRevision", + FullMethod: Control_SetRepoDefaultRevision_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).SetRepoDefaultRevision(ctx, req.(*SetRepoDefaultRevisionRequest)) @@ -898,7 +982,7 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2control.Control/GetIntegratedServices", + FullMethod: Control_GetIntegratedServices_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ControlServer).GetIntegratedServices(ctx, req.(*Empty)) @@ -953,6 +1037,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetActiveDetectors", Handler: _Control_GetActiveDetectors_Handler, }, + { + MethodName: "GetAvailableDetectors", + Handler: _Control_GetAvailableDetectors_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, diff --git a/core/server.go b/core/server.go index c69eaad90..fbc2e617a 100644 --- a/core/server.go +++ b/core/server.go @@ -173,21 +173,12 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques min, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) - cs := the.ConfSvc() - allDetectors, err := cs.ListDetectors(true) + availableDetectors, activeDetectors, allDetectors, err := m.listDetectors() + if err != nil { allDetectors = []string{"NIL"} - } - activeDetectorsMap := m.state.environments.GetActiveDetectors() - availableDetectors := make([]string, 0) - for _, det := range allDetectors { - detId, err := system.IDString(det) - if err != nil { - continue - } - if _, contains := activeDetectorsMap[detId]; !contains { - availableDetectors = append(availableDetectors, det) - } + availableDetectors = []string{} + activeDetectors = []string{} } r := &pb.GetFrameworkInfoReply{ @@ -207,7 +198,7 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques }, ConfigurationEndpoint: viper.GetString("configServiceUri"), DetectorsInInstance: allDetectors, - ActiveDetectors: activeDetectorsMap.StringList(), + ActiveDetectors: activeDetectors, AvailableDetectors: availableDetectors, } return r, nil @@ -691,6 +682,43 @@ func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetA return r, nil } +// return string lists of available, active and all detectors +func (m *RpcServer) listDetectors() ([]string, []string, []string, error) { + cs := the.ConfSvc() + allDetectors, err := cs.ListDetectors(true) + if err != nil { + return nil, nil, nil, err + } + activeDetectorsMap := m.state.environments.GetActiveDetectors() + availableDetectors := make([]string, 0) + for _, det := range allDetectors { + detId, err := system.IDString(det) + if err != nil { + continue + } + if _, contains := activeDetectorsMap[detId]; !contains { + availableDetectors = append(availableDetectors, det) + } + } + + return availableDetectors, activeDetectorsMap.StringList(), allDetectors, nil +} + +func (m *RpcServer) GetAvailableDetectors(_ context.Context, _ *pb.Empty) (*pb.GetAvailableDetectorsReply, error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) + m.logMethod() + defer m.logMethodHandled() + + if availableDetectors, _, _, err := m.listDetectors(); err != nil { + return nil, err + } else { + r := &pb.GetAvailableDetectorsReply{ + Detectors: availableDetectors, + } + return r, nil + } +} + func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasksReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() From 3fca423baafc1a799f588f316b4a03927d4220b9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Mar 2024 11:16:41 +0100 Subject: [PATCH 1790/2352] [core] Ensure the CTP readout FLP is included in BK call if enabled --- core/integration/bookkeeping/plugin.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index afa6541af..4f752fe7f 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -431,6 +431,24 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rnString := strconv.FormatUint(uint64(runNumber), 10) flps := env.GetFLPs() + + // The enabled status of CTP Readout and its FLP is governed by the variable ctp_readout_enabled, so it requires + // special treatment to be included in the list of FLPs + ctpReadoutEnabled, err := strconv.ParseBool(env.GetKV("", "ctp_readout_enabled")) + if err != nil { + log.WithError(err). + WithField("run", runNumber64). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warning("cannot parse CTP readout enabled") + } + if ctpReadoutEnabled { + ctpReadoutFlp := env.GetKV("", "ctp_readout_host") + if len(ctpReadoutFlp) > 0 { + flps = append(flps, ctpReadoutFlp) + } + } + epns, err := strconv.ParseInt(env.GetKV("", "odc_n_epns"), 10, 0) if err != nil { log.WithError(err). From be955dc147643785658d63760a6df7e2bfc1a047 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Fri, 1 Mar 2024 13:06:13 +0100 Subject: [PATCH 1791/2352] [core] Improve wording in warning message Co-authored-by: Piotr Konopka --- core/integration/bookkeeping/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 4f752fe7f..e6d465028 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -440,7 +440,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). WithField("partition", envId). WithField("call", "StartOfRun"). - Warning("cannot parse CTP readout enabled") + Warning("cannot parse ctp_readout_enabled") } if ctpReadoutEnabled { ctpReadoutFlp := env.GetKV("", "ctp_readout_host") From 13e0556cde079bf3ccf5a2b94e0164be2effc5a4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Mar 2024 16:56:36 +0100 Subject: [PATCH 1792/2352] [core] Make event timestamps UnixMilli --- core/protos/protoutils.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/protos/protoutils.go b/core/protos/protoutils.go index 0a6541e51..02f13520f 100644 --- a/core/protos/protoutils.go +++ b/core/protos/protoutils.go @@ -22,16 +22,16 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ - package pb import ( + "fmt" "time" ) func WrapEvent(ce isEvent_Payload) *Event { return &Event{ - Timestamp:time.Now().Format(time.RFC3339), - Payload: ce, + Timestamp: fmt.Sprintf("%d", time.Now().UnixMilli()), + Payload: ce, } } From 78894d72d1d60bc8d33e3104dd7ff0cada71c094 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Mar 2024 14:51:04 +0100 Subject: [PATCH 1793/2352] [core] Add support for dcs_pfr/sor_grace_period variables --- core/integration/dcs/plugin.go | 100 ++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 2 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index a6a1578c9..a3ab4a8ee 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -402,8 +402,54 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + // We acquire a grace period during which we hope that DCS will become compatible with the operation. + // During this period we'll keep checking our internal state for op compatibility as reported by DCS at 1Hz, + // and if we don't get a compatible state within the grace period, we declare the operation failed. + pfrGracePeriod := time.Duration(0) + pfrGracePeriodS, ok := varStack["dcs_pfr_grace_period"] + if ok { + pfrGracePeriod, err = time.ParseDuration(pfrGracePeriodS) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Warnf("cannot parse DCS PFR grace period, assuming 0 seconds") + } + } else { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Info("DCS PFR grace period not set, defaulting to 0 seconds") + } + + pfrGraceTimeout := time.Now().Add(pfrGracePeriod) + isCompatibleWithOperation := false + knownDetectorStates := p.getDetectorsPfrAvailability(dcsDetectors) - isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + + for { + if isCompatibleWithOperation { + break + } else { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + WithField("grace_period", pfrGracePeriod.String()). + WithField("remaining_grace_period", pfrGraceTimeout.Sub(time.Now()).String()). + Infof("waiting for DCS operation readiness: %s", err.Error()) + time.Sleep(1 * time.Second) + } + + if time.Now().Before(pfrGraceTimeout) { + knownDetectorStates = p.getDetectorsPfrAvailability(dcsDetectors) + isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + } else { + break + } + } + if !isCompatibleWithOperation { log.WithError(err). WithField("level", infologger.IL_Ops). @@ -422,6 +468,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine PFR readiness: %s", err.Error()) } + // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation + log.WithField("partition", envId). WithField("level", infologger.IL_Ops). Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) @@ -790,8 +838,54 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + // We acquire a grace period during which we hope that DCS will become compatible with the operation. + // During this period we'll keep checking our internal state for op compatibility as reported by DCS at 1Hz, + // and if we don't get a compatible state within the grace period, we declare the operation failed. + sorGracePeriod := time.Duration(0) + sorGracePeriodS, ok := varStack["dcs_sor_grace_period"] + if ok { + sorGracePeriod, err = time.ParseDuration(sorGracePeriodS) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Warnf("cannot parse DCS SOR grace period, assuming 0 seconds") + } + } else { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "StartOfRun"). + Info("DCS SOR grace period not set, defaulting to 0 seconds") + } + + sorGraceTimeout := time.Now().Add(sorGracePeriod) + isCompatibleWithOperation := false + knownDetectorStates := p.getDetectorsSorAvailability(dcsDetectors) - isCompatibleWithOperation, err := knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + + for { + if isCompatibleWithOperation { + break + } else { + log.WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "StartOfRun"). + WithField("grace_period", sorGracePeriod.String()). + WithField("remaining_grace_period", sorGraceTimeout.Sub(time.Now()).String()). + Infof("waiting for DCS operation readiness: %s", err.Error()) + time.Sleep(1 * time.Second) + } + + if time.Now().Before(sorGraceTimeout) { + knownDetectorStates = p.getDetectorsSorAvailability(dcsDetectors) + isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + } else { + break + } + } + if !isCompatibleWithOperation { log.WithError(err). WithField("level", infologger.IL_Ops). @@ -810,6 +904,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine SOR readiness: %s", err.Error()) } + // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation + log.WithField("partition", envId). WithField("level", infologger.IL_Ops). WithField("run", runNumber64). From 4af5139e318e4eabb0d86060eab881ce1167ae97 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 1 Mar 2024 17:20:54 +0100 Subject: [PATCH 1794/2352] [core] Ensure AutoEnv SOR failure goes to ERROR --- core/environment/manager.go | 39 +++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index a820287ff..a04176243 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -937,6 +937,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str log.WithField("partition", env.Id().String()). WithField("state", envState). Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") + } envTasks := env.Workflow().GetTasks() @@ -973,7 +974,45 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str err = env.TryTransition(trans) if err != nil { + envState := env.CurrentState() + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + + log.WithField("state", envState). + WithField("environment", env.Id().String()). + WithError(err). + Warn("environment start activity failed, cleanup in progress") + + err = env.TryTransition(NewGoErrorTransition( + envs.taskman), + ) + if err != nil { + log.WithField("partition", env.Id().String()). + WithField("state", envState). + Debug("could not transition to ERROR after failed start activity, cleanup in progress") + + env.setState("ERROR") + } + + envTasks := env.Workflow().GetTasks() + // TeardownEnvironment manages the envs.mu internally + err = envs.TeardownEnvironment(env.Id(), true /*force*/) + if err != nil { + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + } + + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + "level": infologger.IL_Support, + "partition": env.Id().String(), + }).Info("environment start activity failed, tasks were cleaned up") + + log.WithField("partition", env.Id().String()).Info("environment teardown complete") return } From f91e25d9eec18fcc3df81c618dd347596c6be0cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 4 Mar 2024 14:46:04 +0100 Subject: [PATCH 1795/2352] [build] Bump to v1.4.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f8ae4a74e..6c63fccf3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 3 +VERSION_MINOR := 4 VERSION_PATCH := 0 From 8f5cb3987f4d48736e5039a836ca86b29e5e8ec9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 4 Mar 2024 17:21:47 +0100 Subject: [PATCH 1796/2352] [core] Make Bookkeeping client thread-safe --- core/integration/bookkeeping/plugin.go | 139 +++++++++++++++++++++---- 1 file changed, 117 insertions(+), 22 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index e6d465028..7b58bd7cb 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1,8 +1,9 @@ /* * === This file is part of ALICE O² === * -* Copyright 2021 CERN and copyright holders of ALICE O². +* Copyright 2021-2024 CERN and copyright holders of ALICE O². * Author: Claire Guyot +* Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -72,10 +73,15 @@ type Plugin struct { missingUpdateRunStarts map[string] /*envId*/ bool missingUpdateRunStartsMu sync.Mutex pendingRunStops map[string] /*envId*/ int64 + pendingRunStopsMu sync.Mutex pendingO2Starts map[string] /*envId*/ bool + pendingO2StartsMu sync.Mutex pendingO2Stops map[string] /*envId*/ bool + pendingO2StopsMu sync.Mutex pendingTrgStarts map[string] /*envId*/ bool + pendingTrgStartsMu sync.Mutex pendingTrgStops map[string] /*envId*/ bool + pendingTrgStopsMu sync.Mutex } /**********************************************/ @@ -143,6 +149,9 @@ func (p *Plugin) getMissingUpdateRunStartsForEnvs(envIds []uid.ID) map[uid.ID]bo } func (p *Plugin) getPendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { + p.pendingRunStopsMu.Lock() + defer p.pendingRunStopsMu.Unlock() + if p.pendingRunStops == nil { return nil } @@ -158,6 +167,9 @@ func (p *Plugin) getPendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { } func (p *Plugin) getPendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + p.pendingO2StartsMu.Lock() + defer p.pendingO2StartsMu.Unlock() + if p.pendingO2Starts == nil { return nil } @@ -173,6 +185,9 @@ func (p *Plugin) getPendingO2StartsForEnvs(envIds []uid.ID) map[uid.ID]bool { } func (p *Plugin) getPendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { + p.pendingO2StopsMu.Lock() + defer p.pendingO2StopsMu.Unlock() + if p.pendingO2Stops == nil { return nil } @@ -188,6 +203,9 @@ func (p *Plugin) getPendingO2StopsForEnvs(envIds []uid.ID) map[uid.ID]bool { } func (p *Plugin) getPendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { + p.pendingTrgStartsMu.Lock() + defer p.pendingTrgStartsMu.Unlock() + if p.pendingTrgStarts == nil { return nil } @@ -203,6 +221,9 @@ func (p *Plugin) getPendingTrgStartsForEnvs(envIds []uid.ID) map[uid.ID]bool { } func (p *Plugin) getPendingTrgStopsForEnvs(envIds []uid.ID) map[uid.ID]bool { + p.pendingTrgStopsMu.Lock() + defer p.pendingTrgStopsMu.Unlock() + if p.pendingTrgStops == nil { return nil } @@ -559,11 +580,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { p.missingUpdateRunStartsMu.Lock() p.missingUpdateRunStarts[envId] = true p.missingUpdateRunStartsMu.Unlock() + p.pendingRunStopsMu.Lock() p.pendingRunStops[envId] = runNumber64 + p.pendingRunStopsMu.Unlock() + p.pendingO2StartsMu.Lock() p.pendingO2Starts[envId] = true + p.pendingO2StartsMu.Unlock() + p.pendingO2StopsMu.Lock() p.pendingO2Stops[envId] = true + p.pendingO2StopsMu.Unlock() + p.pendingTrgStartsMu.Lock() p.pendingTrgStarts[envId] = true + p.pendingTrgStartsMu.Unlock() + p.pendingTrgStopsMu.Lock() p.pendingTrgStops[envId] = true + p.pendingTrgStopsMu.Unlock() log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Create call successful") @@ -751,10 +782,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // If UpdateRunStart was not called and the Trg start time is missing, // it is set to the O2 start time. p.missingUpdateRunStartsMu.Lock() - if p.missingUpdateRunStarts[envId] == true && trgEnabled && timeTrgStartOutput == nil { - if p.pendingO2Starts[envId] == false { + currentMissingUpdateRunStarts := p.missingUpdateRunStarts[envId] + p.missingUpdateRunStartsMu.Unlock() + if currentMissingUpdateRunStarts == true && trgEnabled && timeTrgStartOutput == nil { + p.pendingO2StartsMu.Lock() + currentPendingO2Starts := p.pendingO2Starts[envId] + p.pendingO2StartsMu.Unlock() + if currentPendingO2Starts == false { timeTrgStartOutput = timeO2StartOutput + p.pendingTrgStartsMu.Lock() p.pendingTrgStarts[envId] = false + p.pendingTrgStartsMu.Unlock() log.WithField("run", runNumber64). WithField("partition", envId). Debug("Bookkeeping API RunServiceClient: Update call: completing missing Trg start timestamp after missing UpdateRunStart call") @@ -764,7 +802,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 start time after missing UpdateRunStart call") } } - p.missingUpdateRunStartsMu.Unlock() timeTrgEndTemp, err = strconv.ParseInt(timeTrgEndInput, 10, 64) if err != nil { log.WithField("run", runNumber64). @@ -803,7 +840,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // because it means that even if they weren't missing during the UpdateRunStart call, // they will be the same and can be overwritten. p.missingUpdateRunStartsMu.Lock() - if p.missingUpdateRunStarts[envId] == true && timeO2StartOutput == nil { + currentMissingUpdateRunStarts := p.missingUpdateRunStarts[envId] + p.missingUpdateRunStartsMu.Unlock() + if currentMissingUpdateRunStarts == true && timeO2StartOutput == nil { log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing SOR timestamps after missing UpdateRunStart call") @@ -840,7 +879,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ReadoutCfgUri: &readoutUri, } } - p.missingUpdateRunStartsMu.Unlock() } // Send the run update request @@ -864,24 +902,52 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // If the update is successful and it is an UpdateRunStop call, we check if we are missing // EOR timestamps, and if that is the case, we set them to Now() and send a new update request p.missingUpdateRunStartsMu.Lock() - if p.missingUpdateRunStarts[envId] == true { - defer delete(p.pendingO2Starts, envId) - defer delete(p.pendingTrgStarts, envId) - } + currentMissingUpdateRunStarts := p.missingUpdateRunStarts[envId] p.missingUpdateRunStartsMu.Unlock() - defer delete(p.pendingRunStops, envId) - defer delete(p.pendingO2Stops, envId) - defer delete(p.pendingTrgStops, envId) - if p.pendingO2Stops[envId] == true || (trgEnabled && p.pendingTrgStops[envId] == true) { + if currentMissingUpdateRunStarts == true { + defer func() { + p.pendingO2StartsMu.Lock() + delete(p.pendingO2Starts, envId) + p.pendingO2StartsMu.Unlock() + }() + defer func() { + p.pendingTrgStartsMu.Lock() + delete(p.pendingTrgStarts, envId) + p.pendingTrgStartsMu.Unlock() + }() + } + defer func() { + p.pendingRunStopsMu.Lock() + delete(p.pendingRunStops, envId) + p.pendingRunStopsMu.Unlock() + }() + defer func() { + p.pendingO2StopsMu.Lock() + delete(p.pendingO2Stops, envId) + p.pendingO2StopsMu.Unlock() + }() + defer func() { + p.pendingTrgStopsMu.Lock() + delete(p.pendingTrgStops, envId) + p.pendingTrgStopsMu.Unlock() + }() + + p.pendingO2StopsMu.Lock() + currentPendingO2Stops := p.pendingO2Stops[envId] + p.pendingO2StopsMu.Unlock() + p.pendingTrgStopsMu.Lock() + currentPendingTrgStops := p.pendingTrgStops[envId] + p.pendingTrgStopsMu.Unlock() + if currentPendingO2Stops == true || (trgEnabled && currentPendingTrgStops == true) { updatedRun = "INCOMPLETE STOP" - if p.pendingO2Stops[envId] == true { + if currentPendingO2Stops == true { timeO2EndTemp = time.Now().UnixMilli() timeO2EndOutput = &timeO2EndTemp log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 end time") } - if trgEnabled && p.pendingTrgStops[envId] == true { + if trgEnabled && currentPendingTrgStops == true { timeTrgEndTemp = time.Now().UnixMilli() timeTrgEndOutput = &timeO2EndTemp log.WithField("run", runNumber64). @@ -918,18 +984,32 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else if function, ok := varStack["__call_func"]; ok && strings.Contains(function, "UpdateRunStart") { // If the update is successful and it is an UpdateRunStart call, we check if we are missing // SOR timestamps, and if that is the case, we set them to Now() and send a new update request - defer delete(p.pendingO2Starts, envId) - defer delete(p.pendingTrgStarts, envId) - if p.pendingO2Starts[envId] == true || (trgEnabled && p.pendingTrgStarts[envId] == true) { + defer func() { + p.pendingO2StartsMu.Lock() + delete(p.pendingO2Starts, envId) + p.pendingO2StartsMu.Unlock() + }() + defer func() { + p.pendingTrgStartsMu.Lock() + delete(p.pendingTrgStarts, envId) + p.pendingTrgStartsMu.Unlock() + }() + p.pendingO2StartsMu.Lock() + currentPendingO2Starts := p.pendingO2Starts[envId] + p.pendingO2StartsMu.Unlock() + p.pendingTrgStartsMu.Lock() + currentPendingTrgStarts := p.pendingTrgStarts[envId] + p.pendingTrgStartsMu.Unlock() + if currentPendingO2Starts == true || (trgEnabled && currentPendingTrgStarts == true) { updatedRun = "INCOMPLETE START" - if p.pendingO2Starts[envId] == true { + if currentPendingO2Starts == true { timeO2StartTemp = time.Now().UnixMilli() timeO2StartOutput = &timeO2StartTemp log.WithField("run", runNumber64). WithField("partition", envId). Warning("Bookkeeping API RunServiceClient: Update call: run information incomplete, missing O2 start time") } - if trgEnabled && p.pendingTrgStarts[envId] == true { + if trgEnabled && currentPendingTrgStarts == true { timeTrgStartTemp = time.Now().UnixMilli() timeTrgStartOutput = &timeO2StartTemp log.WithField("run", runNumber64). @@ -1009,11 +1089,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { O2StartTime := varStack["run_start_time_ms"] if O2StartTime != "" { + p.pendingO2StartsMu.Lock() p.pendingO2Starts[envId] = false + p.pendingO2StartsMu.Unlock() } TrgStartTime := varStack["trg_start_time_ms"] if TrgStartTime != "" { + p.pendingTrgStartsMu.Lock() p.pendingTrgStarts[envId] = false + p.pendingTrgStartsMu.Unlock() } p.missingUpdateRunStartsMu.Lock() @@ -1071,23 +1155,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { O2StartTime := varStack["run_start_time_ms"] if O2StartTime != "" { + p.pendingO2StartsMu.Lock() p.pendingO2Starts[envId] = false + p.pendingO2StartsMu.Unlock() } O2EndTime := varStack["run_end_time_ms"] if O2EndTime != "" { + p.pendingO2StopsMu.Lock() p.pendingO2Stops[envId] = false + p.pendingO2StopsMu.Unlock() } TrgStartTime := varStack["trg_start_time_ms"] if TrgStartTime != "" { + p.pendingTrgStartsMu.Lock() p.pendingTrgStarts[envId] = false + p.pendingTrgStartsMu.Unlock() } TrgEndTime := varStack["trg_end_time_ms"] if TrgEndTime != "" { + p.pendingTrgStopsMu.Lock() p.pendingTrgStops[envId] = false + p.pendingTrgStopsMu.Unlock() } - if _, ok = p.pendingRunStops[envId]; ok { + p.pendingRunStopsMu.Lock() + _, hasPendingRunStops := p.pendingRunStops[envId] + p.pendingRunStopsMu.Unlock() + if hasPendingRunStops { return updateRunFunc(runNumber64, "test", O2StartTime, O2EndTime, TrgStartTime, TrgEndTime) } else { log.WithField("partition", envId). From c24398fca7ca56e5bc129e0787862b30764f13b0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 6 Mar 2024 16:04:40 +0100 Subject: [PATCH 1797/2352] [core] Ensure auto-transitioning environments always end --- core/environment/manager.go | 80 +++++++++++++++---------------------- 1 file changed, 32 insertions(+), 48 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index a04176243..02c31e514 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -922,22 +922,22 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str ) } - if err != nil { + goErrorKillDestroy := func(op string) { envState := env.CurrentState() env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) log.WithField("state", envState). WithField("environment", env.Id().String()). WithError(err). - Warn("environment deployment and configuration failed, cleanup in progress") + Warnf("auto-transitioning environment failed %s, cleanup in progress", op) - err = env.TryTransition(NewGoErrorTransition( + err := env.TryTransition(NewGoErrorTransition( envs.taskman), ) if err != nil { log.WithField("partition", env.Id().String()). WithField("state", envState). - Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") - + Debug("could not transition failed auto-transitioning environment to ERROR, cleanup in progress") + env.setState("ERROR") } envTasks := env.Workflow().GetTasks() @@ -957,8 +957,13 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "level": infologger.IL_Support, "partition": env.Id().String(), }). - Info("environment deployment failed, tasks were cleaned up") + Infof("auto-environment failed at %s, tasks were cleaned up", op) log.WithField("partition", env.Id().String()).Info("environment teardown complete") + } + + if err != nil { + goErrorKillDestroy("transition CONFIGURE") + return } @@ -969,66 +974,40 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str trans := NewStartActivityTransition(envs.taskman) if trans == nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + goErrorKillDestroy("transition START_ACTIVITY") + return } err = env.TryTransition(trans) if err != nil { - envState := env.CurrentState() - - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - - log.WithField("state", envState). - WithField("environment", env.Id().String()). - WithError(err). - Warn("environment start activity failed, cleanup in progress") - - err = env.TryTransition(NewGoErrorTransition( - envs.taskman), - ) - if err != nil { - log.WithField("partition", env.Id().String()). - WithField("state", envState). - Debug("could not transition to ERROR after failed start activity, cleanup in progress") - - env.setState("ERROR") - } - - envTasks := env.Workflow().GetTasks() - // TeardownEnvironment manages the envs.mu internally - err = envs.TeardownEnvironment(env.Id(), true /*force*/) - if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) - } - - killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) - if rlsErr != nil { - log.WithError(rlsErr).Warn("task teardown error") - } - log.WithFields(logrus.Fields{ - "killedCount": len(killedTasks), - "lastEnvState": envState, - "level": infologger.IL_Support, - "partition": env.Id().String(), - }).Info("environment start activity failed, tasks were cleaned up") - - log.WithField("partition", env.Id().String()).Info("environment teardown complete") + goErrorKillDestroy("transition START_ACTIVITY") return } for { + // we know we performed START_ACTIVITY, so we poll at 1Hz for the run to finish + time.Sleep(1 * time.Second) + + if env == nil { + // must've died during the loop + return + } + envState := env.CurrentState() switch envState { case "CONFIGURED": // RUN finished so we can reset and delete the environment - err := env.TryTransition(NewResetTransition(envs.taskman)) + err = env.TryTransition(NewResetTransition(envs.taskman)) if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + goErrorKillDestroy("transition RESET") return } err = envs.TeardownEnvironment(env.id, false) if err != nil { env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + goErrorKillDestroy("teardown") return } tasksForEnv := env.Workflow().GetTasks().GetTaskIds() @@ -1039,11 +1018,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } return case "ERROR": + fallthrough + case "STANDBY": + fallthrough + case "DEPLOYED": + goErrorKillDestroy("transition STOP_ACTIVITY") return case "MIXED": - return + continue case "": - return + continue } } } From 4db08d1989e643ce9e7758fd4b5a6759e49acbb4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 5 Mar 2024 15:05:18 +0100 Subject: [PATCH 1798/2352] [core] Make task manager eventStream thread safe --- core/environment/environment.go | 8 ++- core/environment/eventStream.go | 94 +++++++++++++++++---------------- 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index a6b32038a..41a365027 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -987,7 +987,13 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t log.WithField("partition", env.id). WithField("run", env.currentRunNumber). Errorf("Scheduled auto stop transition failed: %s, Transitioning into ERROR", err.Error()) - _ = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) + err = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) + if err != nil { + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Errorf("Forced transition to ERROR failed: %s", err.Error()) + env.setState("ERROR") + } return } } diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index 1f45677e5..3051ea736 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -22,14 +22,13 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ - package environment import ( "sync" - - pb "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/common/event" + pb "github.com/AliceO2Group/Control/core/protos" ) type Subscription interface { @@ -40,40 +39,45 @@ type Subscription interface { } type eventStream struct { - stream chan *pb.Event + stream chan *pb.Event + mu sync.Mutex } func SubscribeToStream(ch chan *pb.Event) Subscription { return &eventSub{ - feed: &eventStream{ + feed: &eventStream{ stream: ch, }, - err: make(chan error), - } + err: make(chan error), + } } func (e *eventStream) send(data *pb.Event) { + e.mu.Lock() + defer e.mu.Unlock() if e.stream != nil { e.stream <- data } } func (e *eventStream) closeStream() { + e.mu.Lock() + defer e.mu.Unlock() close(e.stream) e.stream = nil } type eventSub struct { - feed *eventStream - once sync.Once - err chan error + feed *eventStream + once sync.Once + err chan error } func (s *eventSub) Unsubscribe() { - s.once.Do(func() { + s.once.Do(func() { s.feed.closeStream() - close(s.err) - }) + close(s.err) + }) } func (s *eventSub) GetFeed() chan *pb.Event { @@ -85,38 +89,38 @@ func (s *eventSub) Send(ev event.Event) { switch typedEvent := ev.(type) { case *event.RoleEvent: - re := pb.Event_RoleEvent{ - RoleEvent: &pb.Ev_RoleEvent{ - Name: typedEvent.GetName(), - State: typedEvent.GetState(), - Status: typedEvent.GetStatus(), - RolePath: typedEvent.GetRolePath(), - }, - } - data = pb.WrapEvent(&re) + re := pb.Event_RoleEvent{ + RoleEvent: &pb.Ev_RoleEvent{ + Name: typedEvent.GetName(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + RolePath: typedEvent.GetRolePath(), + }, + } + data = pb.WrapEvent(&re) case *event.TaskEvent: - re := pb.Event_TaskEvent{ - TaskEvent: &pb.Ev_TaskEvent{ - Name: typedEvent.GetName(), - Taskid: typedEvent.GetTaskID(), - State: typedEvent.GetState(), - Status: typedEvent.GetStatus(), - Hostname: typedEvent.GetHostname(), - ClassName: typedEvent.GetClassName(), - }, - } - data = pb.WrapEvent(&re) + re := pb.Event_TaskEvent{ + TaskEvent: &pb.Ev_TaskEvent{ + Name: typedEvent.GetName(), + Taskid: typedEvent.GetTaskID(), + State: typedEvent.GetState(), + Status: typedEvent.GetStatus(), + Hostname: typedEvent.GetHostname(), + ClassName: typedEvent.GetClassName(), + }, + } + data = pb.WrapEvent(&re) case *event.EnvironmentEvent: - re := pb.Event_EnvironmentEvent{ - EnvironmentEvent: &pb.Ev_EnvironmentEvent{ - EnvironmentId: typedEvent.GetName(), - State: typedEvent.GetState(), - CurrentRunNumber: typedEvent.GetRun(), - Error: typedEvent.GetError(), - Message: typedEvent.GetMessage(), - }, - } - data = pb.WrapEvent(&re) + re := pb.Event_EnvironmentEvent{ + EnvironmentEvent: &pb.Ev_EnvironmentEvent{ + EnvironmentId: typedEvent.GetName(), + State: typedEvent.GetState(), + CurrentRunNumber: typedEvent.GetRun(), + Error: typedEvent.GetError(), + Message: typedEvent.GetMessage(), + }, + } + data = pb.WrapEvent(&re) default: // noop } @@ -124,5 +128,5 @@ func (s *eventSub) Send(ev event.Event) { } func (s *eventSub) Err() <-chan error { - return s.err -} \ No newline at end of file + return s.err +} From 981cc042d8ba174afae901f6048f34207208e45b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 11 Mar 2024 10:16:20 +0100 Subject: [PATCH 1799/2352] [build] Bump to v1.5.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 6c63fccf3..863e8e546 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 4 +VERSION_MINOR := 5 VERSION_PATCH := 0 From 6a93cc00b00128ab3fdc1592cac28b3e04af3dd5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 11 Mar 2024 15:09:32 +0100 Subject: [PATCH 1800/2352] [core] hash processed config payloads from apricot during JIT update checks This commit makes the JIT template generation support both consul-json and apricot backends of the O2 Configuration library. Also, instead of the LastIndex, we use the processed configuration payload in the hash sum which is used to detect any relevant changes in the DPL workflows. --- configuration/template/dplutil.go | 36 +++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 9714f678e..e3ca62943 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -32,7 +32,6 @@ import ( "os/exec" "path/filepath" "regexp" - "strconv" "strings" texttemplate "text/template" @@ -45,29 +44,31 @@ import ( // and returns the resolved dplWorkflow as a string func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { const nMaxExpectedQcPayloads = 2 - var metadata string + var payloads []string // Match any consul URL - re := regexp.MustCompile(`consul-json://[^ |\n]*`) + re := regexp.MustCompile(`(consul-json|apricot)://[^ |\n]*`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) + matches = append(matches) - // Concatenate the consul LastIndex for each payload in a single string + // Gather all the processed configuration payloads from apricot for _, match := range matches { // Match any key under components keyRe := regexp.MustCompile(`components/[^']*`) consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") - // And query for Consul for its LastIndex + // And query Apricot for the configuration payload newQ, err := componentcfg.NewQuery(consulKey[1]) if err != nil { return "", fmt.Errorf("JIT could not create a query out of path '%s'. error: %w", consulKey[1], err) } - _, lastIndex, err := confSvc.GetComponentConfigurationWithLastIndex(newQ) + payload, err := confSvc.GetComponentConfiguration(newQ) + if err != nil { - return "", fmt.Errorf("JIT failed trying to query qc consul payload '%s', error: %w", match, err) + return "", fmt.Errorf("JIT failed trying to query QC payload '%s', error: %w", match, err) } - metadata += strconv.FormatUint(lastIndex, 10) + payloads = append(payloads, payload) } // Get the O2 & QualityControl version @@ -80,20 +81,23 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // Get the env vars necessary for JIT jitEnvVars := varStack["jit_env_vars"] - // Generate a hash out of the concatenation of + // Generate a hash out of // 1) The full DPL command - // 2) The LastIndex of each payload - // 3) The O2 + QualityControl package versions - // 4) The JIT env vars + // 2) The O2 + QualityControl package versions + // 3) The JIT env vars + // 4) The returned configuration payloads (as separate Write calls to avoid copies of large strings) hash := sha1.New() - hash.Write([]byte(dplCommand + metadata + string(o2VersionOut) + jitEnvVars)) + hash.Write([]byte(dplCommand + string(o2VersionOut) + jitEnvVars)) + for _, payload := range payloads { + hash.Write([]byte(payload)) + } jitWorkflowName = "jit-" + hex.EncodeToString(hash.Sum(nil)) // We now have a workflow name made out of a hash that should be unique with respect to // 1) DPL command and - // 2) Consul payload versions - // 3) O2 + QualityControl package versions - // 4) JIT env vars + // 2) O2 + QualityControl package versions + // 3) JIT env vars + // 4) Configuration payloads returned by Apricot // Only generate new tasks & workflows if the files don't exist // If they exist, hash comparison guarantees validity if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { From 1d630359dbc896118737c60d732eabaf8de0b20d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:57:43 +0000 Subject: [PATCH 1801/2352] Bump google.golang.org/protobuf from 1.31.0 to 1.33.0 Bumps google.golang.org/protobuf from 1.31.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 99e1e50cb..30648fba1 100644 --- a/go.mod +++ b/go.mod @@ -66,7 +66,7 @@ require ( golang.org/x/sys v0.15.0 google.golang.org/grpc v1.59.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.31.0 + google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v3 v3.0.1 ) diff --git a/go.sum b/go.sum index dc21f1e39..b20df2cf1 100644 --- a/go.sum +++ b/go.sum @@ -580,8 +580,8 @@ google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c5062e3ad397d38e82bb7a427b8042bb1ee098cf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Mar 2024 14:05:07 +0100 Subject: [PATCH 1802/2352] [core] Improve auto-transitioning environment events to GUI --- core/environment/manager.go | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 02c31e514..f3d8cc3f0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -924,7 +924,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str goErrorKillDestroy := func(op string) { envState := env.CurrentState() - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: fmt.Sprintf("environment is in %s, handling ERROR", envState), EnvironmentID: env.Id().String(), Error: err}) log.WithField("state", envState). WithField("environment", env.Id().String()). WithError(err). @@ -937,6 +937,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str log.WithField("partition", env.Id().String()). WithField("state", envState). Debug("could not transition failed auto-transitioning environment to ERROR, cleanup in progress") + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "transition ERROR failed, forcing", EnvironmentID: env.Id().String(), Error: err}) env.setState("ERROR") } @@ -944,7 +945,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // TeardownEnvironment manages the envs.mu internally err = envs.TeardownEnvironment(env.Id(), true /*force*/) if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "force teardown failed, handling", EnvironmentID: env.Id().String(), Error: err}) } killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) @@ -959,6 +960,8 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str }). Infof("auto-environment failed at %s, tasks were cleaned up", op) log.WithField("partition", env.Id().String()).Info("environment teardown complete") + + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", EnvironmentID: env.Id().String()}) } if err != nil { @@ -973,7 +976,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // now we have the environment we should transition to start trans := NewStartActivityTransition(envs.taskman) if trans == nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err, Message: "transition START_ACTIVITY failed, handling"}) goErrorKillDestroy("transition START_ACTIVITY") return @@ -1000,22 +1003,24 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // RUN finished so we can reset and delete the environment err = env.TryTransition(NewResetTransition(envs.taskman)) if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "transition RESET failed, handling", EnvironmentID: env.Id().String(), Error: err}) goErrorKillDestroy("transition RESET") return } err = envs.TeardownEnvironment(env.id, false) if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "teardown failed, handling", EnvironmentID: env.Id().String(), Error: err}) goErrorKillDestroy("teardown") return } tasksForEnv := env.Workflow().GetTasks().GetTaskIds() _, _, err = envs.taskman.KillTasks(tasksForEnv) if err != nil { - env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "task kill failed, handling", EnvironmentID: env.Id().String(), Error: err}) return } + + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", EnvironmentID: env.Id().String()}) return case "ERROR": fallthrough From 6396fa8216dcfd07b3e55bfa4e9b7d67873b6cc4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 11:51:56 +0100 Subject: [PATCH 1803/2352] [build] Bump to v1.6.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 863e8e546..30f4efede 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 5 +VERSION_MINOR := 6 VERSION_PATCH := 0 From 7de4a9bb5044296a86e170a78eceffbbcf60ed4f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 14 Mar 2024 14:43:59 +0100 Subject: [PATCH 1804/2352] [core] Unit tests for Query and EntriesQuery --- Makefile | 2 +- configuration/componentcfg/query_test.go | 202 +++++++++++++++++++++++ 2 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 configuration/componentcfg/query_test.go diff --git a/Makefile b/Makefile index 6ea903dc5..1575f65c1 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./configuration/cfgbackend +TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg GO_TEST_DIRS := ./core/repos ./core/integration/dcs # Use linker flags to provide version/build settings to the target diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go new file mode 100644 index 000000000..65c4c4416 --- /dev/null +++ b/configuration/componentcfg/query_test.go @@ -0,0 +1,202 @@ +package componentcfg_test + +import ( + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration/componentcfg" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("query", func() { + Describe("Component configuration query", func() { + var ( + q *componentcfg.Query + err error + ) + + When("creating a new query with the full path and timestamp", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/PHYSICS/pp/ctp-raw-qc@1234") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("should return the path correctly", func() { + Expect(q.Path()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc@1234")) + }) + It("should return the raw query correctly", func() { + Expect(q.Raw()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc/1234")) + }) + It("should return the query without the timestamp correctly", func() { + Expect(q.WithoutTimestamp()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) + }) + It("should return the absolute raw query correctly", func() { + Expect(q.AbsoluteRaw()).To(Equal(componentcfg.ConfigComponentsPath + "qc/PHYSICS/pp/ctp-raw-qc/1234")) + }) + It("should return the query without the timestamp correctly", func() { + Expect(q.AbsoluteWithoutTimestamp()).To(Equal(componentcfg.ConfigComponentsPath + "qc/PHYSICS/pp/ctp-raw-qc")) + }) + It("should be able to generalize to a query for any run type", func() { + Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc@1234")) + }) + It("should be able to generalize to a query for any role name", func() { + Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc@1234")) + }) + }) + + When("creating a new query with the full path but no timestamp", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/PHYSICS/pp/ctp-raw-qc") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("should return the path correctly", func() { + Expect(q.Path()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) + }) + It("should return the raw query correctly", func() { + Expect(q.Raw()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) + }) + It("should return the query without the timestamp correctly", func() { + Expect(q.WithoutTimestamp()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) + }) + }) + + When("creating a new query with all the supported types of characters", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("aAzZ09-_/ANY/aAzZ09-_/aAzZ09-_") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + }) + + Describe("dealing with incorrectly formatted queries", func() { + When("query is empty", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("query has not enough / separators", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/ANY/any") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("query has an empty token", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/ANY//ctp-raw-qc") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("query has a timestamp separator, but the timestamp itself is missing", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/ANY/any/ctp-raw-qc@") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + // I don't know whether we are expected to support it or not, but the current behaviour is that we don't, + // even though one can write a key with a space to consul + When("query has a space in the entry key", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/ANY/any/ctp qc") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("run type uses lower case letters", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/physics/any/ctp-raw-qc") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("run type is unknown", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/FOO/any/ctp-raw-qc") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + }) + }) + + Describe("Component configuration entries query", func() { + var ( + q *componentcfg.EntriesQuery + err error + ) + + When("creating a new valid query", func() { + BeforeEach(func() { + q, err = componentcfg.NewEntriesQuery("qc/PHYSICS/pp") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("should have parsed the component correctly", func() { + Expect(q.Component).To(Equal("qc")) + }) + It("should have parsed the run type correctly", func() { + Expect(q.RunType).To(Equal(apricotpb.RunType_PHYSICS)) + }) + It("should have parsed the role name correctly", func() { + Expect(q.RoleName).To(Equal("pp")) + }) + }) + + When("creating a new query with all the supported types of characters", func() { + BeforeEach(func() { + q, err = componentcfg.NewEntriesQuery("aAzZ09-_/ANY/aAzZ09-_") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + }) + + Describe("dealing with incorrectly formatted queries", func() { + When("query is empty", func() { + BeforeEach(func() { + q, err = componentcfg.NewEntriesQuery("") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("query has not enough / separators", func() { + BeforeEach(func() { + q, err = componentcfg.NewEntriesQuery("qc/ANY") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("query has an empty token", func() { + BeforeEach(func() { + q, err = componentcfg.NewEntriesQuery("qc/ANY/") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + }) + }) +}) + +func TestQuery(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Query Suite") +} From 9a109645e15945d65b39ea216c317916e73c3471 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 15 Mar 2024 16:39:45 +0100 Subject: [PATCH 1805/2352] [core] support query parameters in apricot URIs in JIT --- configuration/componentcfg/query.go | 49 ++++++++++++++++++++++- configuration/componentcfg/query_test.go | 51 ++++++++++++++++++++++++ configuration/template/dplutil.go | 23 +++++++++-- 3 files changed, 117 insertions(+), 6 deletions(-) diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index e8cc25963..173660a60 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -26,7 +26,9 @@ package componentcfg import ( "errors" + "net/url" "regexp" + "strconv" "strings" apricotpb "github.com/AliceO2Group/Control/apricot/protos" @@ -42,8 +44,9 @@ var ( // component /RUNTYPE /rolename /entry @timestamp inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) // component /RUNTYPE /rolename - inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) - E_BAD_KEY = errors.New("bad component configuration key format") + inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) + inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)*$`) + E_BAD_KEY = errors.New("bad component configuration key format") ) func IsStringValidQueryPathWithOptionalTimestamp(input string) bool { @@ -52,6 +55,9 @@ func IsStringValidQueryPathWithOptionalTimestamp(input string) bool { func IsStringValidEntriesQueryPath(input string) bool { return inputEntriesRegex.MatchString(input) } +func IsStringValidQueryParameters(input string) bool { + return inputParametersRegex.MatchString(input) +} type EntriesQuery struct { Component string @@ -192,3 +198,42 @@ func (p *Query) AbsoluteRaw() string { func (p *Query) AbsoluteWithoutTimestamp() string { return ConfigComponentsPath + p.WithoutTimestamp() } + +type QueryParameters struct { + ProcessTemplates bool + VarStack map[string]string +} + +func NewQueryParameters(parameters string) (p *QueryParameters, err error) { + p = &QueryParameters{ + ProcessTemplates: false, + VarStack: make(map[string]string), + } + parameters = strings.TrimSpace(parameters) + + if !IsStringValidQueryParameters(parameters) { + err = E_BAD_KEY + return + } + keyValues, err := url.ParseQuery(parameters) + if err != nil { + return + } + // in our case, we support just one value per key, thus we map the returned keyValues accordingly + for key, values := range keyValues { + if len(values) != 1 { + err = E_BAD_KEY + return + } + if key == "process" { + p.ProcessTemplates, err = strconv.ParseBool(values[0]) + if err != nil { + return + } + } else { + p.VarStack[key] = values[0] + } + } + + return p, nil +} diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go index 65c4c4416..d273f60cd 100644 --- a/configuration/componentcfg/query_test.go +++ b/configuration/componentcfg/query_test.go @@ -194,6 +194,57 @@ var _ = Describe("query", func() { }) }) }) + + Describe("Component configuration query parameters", func() { + var ( + q *componentcfg.QueryParameters + err error + ) + + When("creating new valid query parameters", func() { + BeforeEach(func() { + q, err = componentcfg.NewQueryParameters("process=true&a=aaa&b=123&C_D3=C,C,C") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("should have parsed the process variable correctly", func() { + Expect(q.ProcessTemplates).To(BeTrue()) + }) + It("should have parsed the var stack correctly", func() { + Expect(q.VarStack["a"]).To(Equal("aaa")) + Expect(q.VarStack["b"]).To(Equal("123")) + Expect(q.VarStack["C_D3"]).To(Equal("C,C,C")) + }) + }) + + Describe("dealing with incorrectly formatted query parameters", func() { + When("query parameters are empty", func() { + BeforeEach(func() { + q, err = componentcfg.NewQueryParameters("") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("a key has empty value", func() { + BeforeEach(func() { + q, err = componentcfg.NewQueryParameters("process=") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + When("there are two identical keys", func() { + BeforeEach(func() { + q, err = componentcfg.NewQueryParameters("a=33&a=34") + }) + It("should return an error", func() { + Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + }) + }) + }) + }) }) func TestQuery(t *testing.T) { diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index e3ca62943..1943bfa0f 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -47,7 +47,7 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo var payloads []string // Match any consul URL - re := regexp.MustCompile(`(consul-json|apricot)://[^ |\n]*`) + re := regexp.MustCompile(`(consul-json|apricot)://[^ |"\n]*`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) matches = append(matches) @@ -57,13 +57,28 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo keyRe := regexp.MustCompile(`components/[^']*`) consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") + // split between the query and its parameters if there are any + consulKeyTokens := strings.Split(consulKey[1], "?") - // And query Apricot for the configuration payload - newQ, err := componentcfg.NewQuery(consulKey[1]) + // Query Apricot for the configuration payload + query, err := componentcfg.NewQuery(consulKeyTokens[0]) if err != nil { return "", fmt.Errorf("JIT could not create a query out of path '%s'. error: %w", consulKey[1], err) } - payload, err := confSvc.GetComponentConfiguration(newQ) + // parse parameters if they are present + queryParams := &componentcfg.QueryParameters{ProcessTemplates: false, VarStack: nil} + if len(consulKeyTokens) == 2 { + queryParams, err = componentcfg.NewQueryParameters(consulKeyTokens[1]) + if err != nil { + return "", fmt.Errorf("JIT could not parse query parameters of path '%s', error: %w", consulKey[1], err) + } + } + var payload string + if queryParams.ProcessTemplates { + payload, err = confSvc.GetAndProcessComponentConfiguration(query, queryParams.VarStack) + } else { + payload, err = confSvc.GetComponentConfiguration(query) + } if err != nil { return "", fmt.Errorf("JIT failed trying to query QC payload '%s', error: %w", match, err) From 021d957743cb67ec8ed33ddf0b39f2d5b2290959 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 14 Mar 2024 14:50:42 +0100 Subject: [PATCH 1806/2352] Enable tests in CI --- .github/workflows/control.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index b187f3654..c8893ee26 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -21,3 +21,4 @@ jobs: go-version: ${{matrix.go}} - run: (make vendor) - run: (make) + - run: (make test) From 222070d4dfdcfd0fd204a44729dcac7c9d0e4467 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:44:48 +0000 Subject: [PATCH 1807/2352] Bump golang.org/x/crypto from 0.16.0 to 0.17.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.16.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.16.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 30648fba1..d7533ce7b 100644 --- a/go.mod +++ b/go.mod @@ -61,7 +61,7 @@ require ( github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.16.0 + golang.org/x/crypto v0.17.0 golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 google.golang.org/grpc v1.59.0 diff --git a/go.sum b/go.sum index b20df2cf1..66b6b656f 100644 --- a/go.sum +++ b/go.sum @@ -459,8 +459,8 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= From 02d1c8d420a0ea6833ccc88bcc95631ba8d29402 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:44:48 +0000 Subject: [PATCH 1808/2352] Bump github.com/cloudflare/circl from 1.3.6 to 1.3.7 Bumps [github.com/cloudflare/circl](https://github.com/cloudflare/circl) from 1.3.6 to 1.3.7. - [Release notes](https://github.com/cloudflare/circl/releases) - [Commits](https://github.com/cloudflare/circl/compare/v1.3.6...v1.3.7) --- updated-dependencies: - dependency-name: github.com/cloudflare/circl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d7533ce7b..33478986c 100644 --- a/go.mod +++ b/go.mod @@ -87,7 +87,7 @@ require ( github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cloudflare/circl v1.3.6 // indirect + github.com/cloudflare/circl v1.3.7 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect diff --git a/go.sum b/go.sum index 66b6b656f..d5913d584 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= -github.com/cloudflare/circl v1.3.6 h1:/xbKIqSHbZXHwkhbrhrt2YOHIwYJlXH94E3tI/gDlUg= -github.com/cloudflare/circl v1.3.6/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= +github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= +github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= From 87f64035b8a048a28b8d1355651d92770e485f33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 10:45:18 +0000 Subject: [PATCH 1809/2352] Bump github.com/go-git/go-git/v5 from 5.10.1 to 5.11.0 Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.10.1 to 5.11.0. - [Release notes](https://github.com/go-git/go-git/releases) - [Commits](https://github.com/go-git/go-git/compare/v5.10.1...v5.11.0) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 33478986c..d472b979c 100644 --- a/go.mod +++ b/go.mod @@ -32,7 +32,7 @@ require ( github.com/dmarkham/enumer v1.5.8 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.6.0 - github.com/go-git/go-git/v5 v5.10.1 + github.com/go-git/go-git/v5 v5.11.0 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.3 // indirect github.com/google/uuid v1.4.0 diff --git a/go.sum b/go.sum index d5913d584..f592c61c9 100644 --- a/go.sum +++ b/go.sum @@ -86,8 +86,8 @@ github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmS github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git/v5 v5.10.1 h1:tu8/D8i+TWxgKpzQ3Vc43e+kkhXqtsZCKI/egajKnxk= -github.com/go-git/go-git/v5 v5.10.1/go.mod h1:uEuHjxkHap8kAl//V5F/nNWwqIYtP/402ddd05mp0wg= +github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= +github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= From e2d7c9ba511e074749ddb16b60e26f8a4f45dbf7 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 20 Mar 2024 12:36:07 +0100 Subject: [PATCH 1810/2352] [core] approve json-like arrays as apricot query parameters --- configuration/componentcfg/query.go | 2 +- configuration/componentcfg/query_test.go | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 173660a60..66970424d 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -45,7 +45,7 @@ var ( inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) // component /RUNTYPE /rolename inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) - inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)*$`) + inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)*$`) E_BAD_KEY = errors.New("bad component configuration key format") ) diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go index d273f60cd..e11fe30e9 100644 --- a/configuration/componentcfg/query_test.go +++ b/configuration/componentcfg/query_test.go @@ -203,7 +203,7 @@ var _ = Describe("query", func() { When("creating new valid query parameters", func() { BeforeEach(func() { - q, err = componentcfg.NewQueryParameters("process=true&a=aaa&b=123&C_D3=C,C,C") + q, err = componentcfg.NewQueryParameters("process=true&a=aaa&b=123&C_D3=C,C,C&detectors=[\"MCH\",\"MID\"]") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -215,6 +215,7 @@ var _ = Describe("query", func() { Expect(q.VarStack["a"]).To(Equal("aaa")) Expect(q.VarStack["b"]).To(Equal("123")) Expect(q.VarStack["C_D3"]).To(Equal("C,C,C")) + Expect(q.VarStack["detectors"]).To(Equal("[\"MCH\",\"MID\"]")) }) }) From cf351351b7315666cb1f2a539fa0a492c205a19b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Mar 2024 14:24:22 +0100 Subject: [PATCH 1811/2352] [core] test task.State, demonstrate a possible bug --- Makefile | 2 +- core/task/state_test.go | 88 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 core/task/state_test.go diff --git a/Makefile b/Makefile index 1575f65c1..b1d871394 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg +TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow GO_TEST_DIRS := ./core/repos ./core/integration/dcs # Use linker flags to provide version/build settings to the target diff --git a/core/task/state_test.go b/core/task/state_test.go new file mode 100644 index 000000000..11a9f35cd --- /dev/null +++ b/core/task/state_test.go @@ -0,0 +1,88 @@ +package task_test + +import ( + "github.com/AliceO2Group/Control/core/task" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("task state", func() { + Describe("enumerated state to string conversion", func() { + When("a State is one of the variant states", func() { + It("should be converted literally", func() { + Expect(task.CONFIGURED.String()).To(Equal("CONFIGURED")) + }) + }) + When("a State is invariant", func() { + It("should be converted to UNKNOWN", func() { + Expect(task.INVARIANT.String()).To(Equal("UNKNOWN")) + }) + }) + }) + + Describe("string state to enum conversion", func() { + When("a State is one of the variant states", func() { + It("should be converted literally", func() { + Expect(task.StateFromString("CONFIGURED")).To(Equal(task.CONFIGURED)) + }) + }) + When("a State is wrong", func() { + It("should be converted to UNKNOWN", func() { + Expect(task.StateFromString("NEVADA")).To(Equal(task.UNKNOWN)) + }) + }) + }) + + Describe("state multiplication", func() { + When("the states are equal", func() { + It("returns the same state", func() { + Expect(task.UNKNOWN.X(task.UNKNOWN)).To(Equal(task.UNKNOWN)) + Expect(task.RUNNING.X(task.RUNNING)).To(Equal(task.RUNNING)) + Expect(task.INVARIANT.X(task.INVARIANT)).To(Equal(task.INVARIANT)) + }) + }) + + When("one of the states is ERROR", func() { + It("returns ERROR", func() { + Expect(task.ERROR.X(task.UNKNOWN)).To(Equal(task.ERROR)) + Expect(task.ERROR.X(task.RUNNING)).To(Equal(task.ERROR)) + Expect(task.ERROR.X(task.INVARIANT)).To(Equal(task.ERROR)) + + Expect(task.UNKNOWN.X(task.ERROR)).To(Equal(task.ERROR)) // FIXME: this fails + Expect(task.RUNNING.X(task.ERROR)).To(Equal(task.ERROR)) // FIXME: this fails + Expect(task.INVARIANT.X(task.ERROR)).To(Equal(task.ERROR)) + }) + }) + + When("One of the states is INVARIANT", func() { + It("returns the non-invariant state", func() { + Expect(task.INVARIANT.X(task.UNKNOWN)).To(Equal(task.UNKNOWN)) + Expect(task.INVARIANT.X(task.RUNNING)).To(Equal(task.RUNNING)) + Expect(task.UNKNOWN.X(task.INVARIANT)).To(Equal(task.UNKNOWN)) + Expect(task.RUNNING.X(task.INVARIANT)).To(Equal(task.RUNNING)) + Expect(task.DONE.X(task.INVARIANT)).To(Equal(task.DONE)) + Expect(task.MIXED.X(task.INVARIANT)).To(Equal(task.MIXED)) + Expect(task.ERROR.X(task.INVARIANT)).To(Equal(task.ERROR)) + }) + }) + + When("If both states are INVARIANT", func() { + It("returns the INVARIANT state", func() { + Expect(task.INVARIANT.X(task.INVARIANT)).To(Equal(task.INVARIANT)) + }) + }) + + When("The states are different", func() { + It("returns MIXED", func() { + Expect(task.UNKNOWN.X(task.STANDBY)).To(Equal(task.MIXED)) + Expect(task.RUNNING.X(task.CONFIGURED)).To(Equal(task.MIXED)) + }) + }) + }) +}) + +func TestState(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "State Test Suite") +} From 1b9b1cd322fa75bf44c1dc62baf0f564325be9a7 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Mar 2024 16:30:02 +0100 Subject: [PATCH 1812/2352] [core] assure commutativity of State in case of ERROR state --- core/task/state.go | 2 +- core/task/state_test.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/core/task/state.go b/core/task/state.go index a4c80fc65..cdf5e8215 100644 --- a/core/task/state.go +++ b/core/task/state.go @@ -68,7 +68,7 @@ func (s State) X(other State) State { if s == other { return s } - if s == ERROR { + if s == ERROR || other == ERROR { return ERROR } if s != other { diff --git a/core/task/state_test.go b/core/task/state_test.go index 11a9f35cd..c7e1cfcaf 100644 --- a/core/task/state_test.go +++ b/core/task/state_test.go @@ -49,8 +49,8 @@ var _ = Describe("task state", func() { Expect(task.ERROR.X(task.RUNNING)).To(Equal(task.ERROR)) Expect(task.ERROR.X(task.INVARIANT)).To(Equal(task.ERROR)) - Expect(task.UNKNOWN.X(task.ERROR)).To(Equal(task.ERROR)) // FIXME: this fails - Expect(task.RUNNING.X(task.ERROR)).To(Equal(task.ERROR)) // FIXME: this fails + Expect(task.UNKNOWN.X(task.ERROR)).To(Equal(task.ERROR)) + Expect(task.RUNNING.X(task.ERROR)).To(Equal(task.ERROR)) Expect(task.INVARIANT.X(task.ERROR)).To(Equal(task.ERROR)) }) }) From 68e81ed01c372f421ef1323bb620f3f0956f3cd2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Sep 2022 10:44:38 +0200 Subject: [PATCH 1813/2352] [core] Refactor serverutil in preparation for eventstream --- core/server.go | 14 +++++----- core/serverutil.go | 35 ------------------------ core/streamutil.go | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+), 42 deletions(-) create mode 100644 core/streamutil.go diff --git a/core/server.go b/core/server.go index fbc2e617a..edd337460 100644 --- a/core/server.go +++ b/core/server.go @@ -66,8 +66,8 @@ func NewServer(state *globalState) *grpc.Server { s := grpc.NewServer() grpc_health_v1.RegisterHealthServer(s, health.NewServer()) pb.RegisterControlServer(s, &RpcServer{ - state: state, - streams: newSafeStreamsMap(), + state: state, + envStreams: newSafeStreamsMap(), }) // Register reflection service on gRPC server. reflection.Register(s) @@ -112,8 +112,8 @@ func (m *RpcServer) logMethodHandled() { // Implements interface pb.ControlServer type RpcServer struct { - state *globalState - streams SafeStreamsMap + state *globalState + envStreams SafeStreamsMap } func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { @@ -1064,14 +1064,14 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe defer m.logMethodHandled() for { - ch, ok := m.streams.GetChannel(req.GetId()) + ch, ok := m.envStreams.GetChannel(req.GetId()) if !ok { continue } select { case event, ok := <-ch: if !ok { - m.streams.delete(req.GetId()) + m.envStreams.delete(req.GetId()) return nil } err := srv.Send(event) @@ -1090,7 +1090,7 @@ func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoE defer m.logMethodHandled() ch := make(chan *pb.Event) - m.streams.add(request.GetId(), ch) + m.envStreams.add(request.GetId(), ch) sub := environment.SubscribeToStream(ch) go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) r := &pb.NewAutoEnvironmentReply{} diff --git a/core/serverutil.go b/core/serverutil.go index e1647400f..1606056ee 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,7 +26,6 @@ package core import ( "fmt" - "sync" "unicode/utf8" "github.com/AliceO2Group/Control/core/repos" @@ -190,40 +189,6 @@ func workflowToRoleTree(root workflow.Role) (ri *pb.RoleInfo) { return } -// SafeStreamsMap is a safe map where the key is usually a -// subscriptionID received from the grpc call and as a value -// a channel where get events from the environment -// and we stream them to the grpc client. -type SafeStreamsMap struct { - mu sync.RWMutex - streams map[string]chan *pb.Event -} - -func (s *SafeStreamsMap) add(id string, ch chan *pb.Event) { - s.mu.Lock() - s.streams[id] = ch - s.mu.Unlock() -} - -func (s *SafeStreamsMap) delete(id string) { - s.mu.Lock() - delete(s.streams, id) - s.mu.Unlock() -} - -func (s *SafeStreamsMap) GetChannel(id string) (ch chan *pb.Event, ok bool) { - s.mu.RLock() - defer s.mu.RUnlock() - ch, ok = s.streams[id] - return -} - -func newSafeStreamsMap() SafeStreamsMap { - return SafeStreamsMap{ - streams: make(map[string]chan *pb.Event), - } -} - func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*pb.VarSpecMessage { ret := make(map[string]*pb.VarSpecMessage) var vsm *pb.VarSpecMessage diff --git a/core/streamutil.go b/core/streamutil.go new file mode 100644 index 000000000..02cff8c86 --- /dev/null +++ b/core/streamutil.go @@ -0,0 +1,66 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2022 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package core + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/core/protos" +) + +// SafeStreamsMap is a safe map where the key is usually a +// subscriptionID received from the grpc call and as a value +// a channel where get events from the environment +// and we stream them to the grpc client. +type SafeStreamsMap struct { + mu sync.RWMutex + streams map[string]chan *pb.Event +} + +func (s *SafeStreamsMap) add(id string, ch chan *pb.Event) { + s.mu.Lock() + s.streams[id] = ch + s.mu.Unlock() +} + +func (s *SafeStreamsMap) delete(id string) { + s.mu.Lock() + delete(s.streams, id) + s.mu.Unlock() +} + +func (s *SafeStreamsMap) GetChannel(id string) (ch chan *pb.Event, ok bool) { + s.mu.RLock() + defer s.mu.RUnlock() + ch, ok = s.streams[id] + return +} + +func newSafeStreamsMap() SafeStreamsMap { + return SafeStreamsMap{ + streams: make(map[string]chan *pb.Event), + } +} From f0eeb970d9faf901575c61de9cb08a819114468e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 15 Feb 2024 12:01:39 +0100 Subject: [PATCH 1814/2352] [core] Events protofile --- common/protos/events.proto | 67 +++++++++++++++++++++++++++++++++++++ core/protos/o2control.proto | 13 ++++--- 2 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 common/protos/events.proto diff --git a/common/protos/events.proto b/common/protos/events.proto new file mode 100644 index 000000000..04ce4fbe9 --- /dev/null +++ b/common/protos/events.proto @@ -0,0 +1,67 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +syntax = "proto3"; + +package events; +option java_package = "ch.cern.alice.o2.control.events"; +option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; + +//////////////// Common event messages /////////////// + +message Event_MesosHeartbeat { +} + +message Ev_EnvironmentEvent { + string environmentId = 1; + string state = 2; + uint32 currentRunNumber = 3; + string error = 4; + string message = 5; +} + +message Ev_TaskEvent { + string name = 1; + string taskid = 2; + string state = 3; + string status = 4; + string hostname = 5; + string className = 6; +} + +message Ev_RoleEvent { + string name = 1; + string status = 2; + string state = 3; + string rolePath = 4; +} + +message Event { + string timestamp = 1; + oneof Payload { + Ev_EnvironmentEvent environmentEvent = 2; + Ev_TaskEvent taskEvent = 3; + Ev_RoleEvent roleEvent = 4; + } +} diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 03c280f8e..52a730b01 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -60,17 +60,13 @@ message Ev_RoleEvent { ////////////////////////////////////////////////////// service Control { - rpc TrackStatus (StatusRequest) returns (stream StatusReply) {} - rpc GetFrameworkInfo (GetFrameworkInfoRequest) returns (GetFrameworkInfoReply) {} - rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} rpc NewAutoEnvironment (NewAutoEnvironmentRequest) returns (NewAutoEnvironmentReply) {} rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} - rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} rpc DestroyEnvironment (DestroyEnvironmentRequest) returns (DestroyEnvironmentReply) {} rpc GetActiveDetectors (Empty) returns (GetActiveDetectorsReply) {} rpc GetAvailableDetectors (Empty) returns (GetAvailableDetectorsReply) {} @@ -93,9 +89,14 @@ service Control { rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (SetRepoDefaultRevisionReply) {} - rpc Subscribe(SubscribeRequest) returns (stream Event); + rpc Subscribe(SubscribeRequest) returns (stream Event) {} rpc GetIntegratedServices(Empty) returns (ListIntegratedServicesReply) {} + + // Reserved and not implemented: + rpc TrackStatus (StatusRequest) returns (stream StatusReply) {} + rpc Teardown (TeardownRequest) returns (TeardownReply) {} + rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} } //////////////////////////////////////// @@ -132,6 +133,8 @@ message Event { message SubscribeRequest{ string id = 1; } + + //////////////////////////////////////// // Framework //////////////////////////////////////// From a72162a559c54a5332813564f8b3ca3df2f14dc6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 15 Feb 2024 15:45:33 +0100 Subject: [PATCH 1815/2352] [core] Additional events --- Makefile | 3 +- coconut/cmd/environment.go | 2 +- coconut/cmd/repo.go | 2 - coconut/protos/o2control.pb.go | 380 +++++++------- common/doc.go | 2 + common/protos/events.pb.go | 710 ++++++++++++++++++++++++++ common/protos/events.proto | 14 +- {core => common}/protos/protoutils.go | 0 core/protos/o2control.pb.go | 380 +++++++------- core/protos/o2control_grpc.pb.go | 278 +++++----- core/server.go | 2 +- 11 files changed, 1245 insertions(+), 528 deletions(-) create mode 100644 common/protos/events.pb.go rename {core => common}/protos/protoutils.go (100%) diff --git a/Makefile b/Makefile index b1d871394..94d42e265 100644 --- a/Makefile +++ b/Makefile @@ -68,8 +68,7 @@ WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) - -GENERATE_DIRS := ./apricot ./coconut/cmd ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping +GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow GO_TEST_DIRS := ./core/repos ./core/integration/dcs diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index f3c3be882..62f9dd3d9 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protos/o2control.proto +//go:generate protoc -I=../../core -I=../../common --go_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto package cmd diff --git a/coconut/cmd/repo.go b/coconut/cmd/repo.go index 318ee027d..fc79990ca 100644 --- a/coconut/cmd/repo.go +++ b/coconut/cmd/repo.go @@ -22,8 +22,6 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I ../../core --go_out=.. --go-grpc_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative protos/o2control.proto - package cmd import ( diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index d091ff4d4..c13fe8fe6 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -5421,147 +5421,147 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd6, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd8, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, - 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, - 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5721,58 +5721,58 @@ var file_protos_o2control_proto_depIdxs = []int32{ 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 19, // 53: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 54: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 55: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 56: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 72, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 72, // 61: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 43, // 62: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 63: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 64: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 65: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 66: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 60, // 67: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 63, // 68: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 65, // 69: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 67, // 70: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 68, // 71: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 69, // 72: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 70, // 73: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 74: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 72, // 75: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 76: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 77: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 78: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 79: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 80: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 81: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 82: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 83: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 84: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 85: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 86: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 36, // 87: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 44, // 88: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 89: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 90: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 91: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 59, // 92: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 62, // 93: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 64, // 94: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 66, // 95: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 72, // 96: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 72, // 97: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 72, // 98: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 71, // 99: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 100: o2control.Control.Subscribe:output_type -> o2control.Event - 73, // 101: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 19, // 51: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 52: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 33, // 56: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 72, // 57: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 72, // 58: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 43, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 60, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 63, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 65, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 67, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 68, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 69, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 70, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 72, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 9, // 73: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 17, // 74: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 30, // 75: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 83: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 36, // 84: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 44, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 59, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 62, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 64, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 66, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 72, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 72, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 72, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 71, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event + 73, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 10, // 99: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 18, // 100: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 32, // 101: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply 76, // [76:102] is the sub-list for method output_type 50, // [50:76] is the sub-list for method input_type 50, // [50:50] is the sub-list for extension type_name diff --git a/common/doc.go b/common/doc.go index ca4c77169..d1d6f80be 100644 --- a/common/doc.go +++ b/common/doc.go @@ -25,3 +25,5 @@ // Package common serves as a catch-all package for sharing types // between O² Control components. package common + +//go:generate protoc -I=./ --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/events.proto diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go new file mode 100644 index 000000000..4fbe78de0 --- /dev/null +++ b/common/protos/events.pb.go @@ -0,0 +1,710 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2024 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.25.1 +// source: protos/events.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Ev_MetaEvent_MesosHeartbeat struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Ev_MetaEvent_MesosHeartbeat) Reset() { + *x = Ev_MetaEvent_MesosHeartbeat{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_MetaEvent_MesosHeartbeat) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_MetaEvent_MesosHeartbeat) ProtoMessage() {} + +func (x *Ev_MetaEvent_MesosHeartbeat) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_MetaEvent_MesosHeartbeat.ProtoReflect.Descriptor instead. +func (*Ev_MetaEvent_MesosHeartbeat) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{0} +} + +type Ev_MetaEvent_FrameworkFailure struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *Ev_MetaEvent_FrameworkFailure) Reset() { + *x = Ev_MetaEvent_FrameworkFailure{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_MetaEvent_FrameworkFailure) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_MetaEvent_FrameworkFailure) ProtoMessage() {} + +func (x *Ev_MetaEvent_FrameworkFailure) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_MetaEvent_FrameworkFailure.ProtoReflect.Descriptor instead. +func (*Ev_MetaEvent_FrameworkFailure) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{1} +} + +func (x *Ev_MetaEvent_FrameworkFailure) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type Ev_EnvironmentEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *Ev_EnvironmentEvent) Reset() { + *x = Ev_EnvironmentEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_EnvironmentEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_EnvironmentEvent) ProtoMessage() {} + +func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. +func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{2} +} + +func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *Ev_EnvironmentEvent) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { + if x != nil { + return x.CurrentRunNumber + } + return 0 +} + +func (x *Ev_EnvironmentEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *Ev_EnvironmentEvent) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +type Ev_TaskEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` +} + +func (x *Ev_TaskEvent) Reset() { + *x = Ev_TaskEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_TaskEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_TaskEvent) ProtoMessage() {} + +func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. +func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{3} +} + +func (x *Ev_TaskEvent) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Ev_TaskEvent) GetTaskid() string { + if x != nil { + return x.Taskid + } + return "" +} + +func (x *Ev_TaskEvent) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Ev_TaskEvent) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *Ev_TaskEvent) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *Ev_TaskEvent) GetClassName() string { + if x != nil { + return x.ClassName + } + return "" +} + +type Ev_RoleEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` +} + +func (x *Ev_RoleEvent) Reset() { + *x = Ev_RoleEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_RoleEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_RoleEvent) ProtoMessage() {} + +func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. +func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{4} +} + +func (x *Ev_RoleEvent) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Ev_RoleEvent) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *Ev_RoleEvent) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Ev_RoleEvent) GetRolePath() string { + if x != nil { + return x.RolePath + } + return "" +} + +type Event struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Types that are assignable to Payload: + // + // *Event_EnvironmentEvent + // *Event_TaskEvent + // *Event_RoleEvent + // *Event_FrameworkFailureEvent + // *Event_MesosHeartbeatEvent + Payload isEvent_Payload `protobuf_oneof:"Payload"` +} + +func (x *Event) Reset() { + *x = Event{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Event) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Event) ProtoMessage() {} + +func (x *Event) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Event.ProtoReflect.Descriptor instead. +func (*Event) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{5} +} + +func (x *Event) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (m *Event) GetPayload() isEvent_Payload { + if m != nil { + return m.Payload + } + return nil +} + +func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { + if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { + return x.EnvironmentEvent + } + return nil +} + +func (x *Event) GetTaskEvent() *Ev_TaskEvent { + if x, ok := x.GetPayload().(*Event_TaskEvent); ok { + return x.TaskEvent + } + return nil +} + +func (x *Event) GetRoleEvent() *Ev_RoleEvent { + if x, ok := x.GetPayload().(*Event_RoleEvent); ok { + return x.RoleEvent + } + return nil +} + +func (x *Event) GetFrameworkFailureEvent() *Ev_MetaEvent_FrameworkFailure { + if x, ok := x.GetPayload().(*Event_FrameworkFailureEvent); ok { + return x.FrameworkFailureEvent + } + return nil +} + +func (x *Event) GetMesosHeartbeatEvent() *Ev_MetaEvent_MesosHeartbeat { + if x, ok := x.GetPayload().(*Event_MesosHeartbeatEvent); ok { + return x.MesosHeartbeatEvent + } + return nil +} + +type isEvent_Payload interface { + isEvent_Payload() +} + +type Event_EnvironmentEvent struct { + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` +} + +type Event_TaskEvent struct { + TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` +} + +type Event_RoleEvent struct { + RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` +} + +type Event_FrameworkFailureEvent struct { + FrameworkFailureEvent *Ev_MetaEvent_FrameworkFailure `protobuf:"bytes,5,opt,name=frameworkFailureEvent,proto3,oneof"` +} + +type Event_MesosHeartbeatEvent struct { + MesosHeartbeatEvent *Ev_MetaEvent_MesosHeartbeat `protobuf:"bytes,6,opt,name=mesosHeartbeatEvent,proto3,oneof"` +} + +func (*Event_EnvironmentEvent) isEvent_Payload() {} + +func (*Event_TaskEvent) isEvent_Payload() {} + +func (*Event_RoleEvent) isEvent_Payload() {} + +func (*Event_FrameworkFailureEvent) isEvent_Payload() {} + +func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} + +var File_protos_events_proto protoreflect.FileDescriptor + +var file_protos_events_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, + 0x1b, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, + 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x39, 0x0a, 0x1d, + 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, + 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6c, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9f, 0x03, 0x0a, 0x05, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x15, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, + 0x00, 0x52, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, + 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, + 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, + 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, + 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, + 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_events_proto_rawDescOnce sync.Once + file_protos_events_proto_rawDescData = file_protos_events_proto_rawDesc +) + +func file_protos_events_proto_rawDescGZIP() []byte { + file_protos_events_proto_rawDescOnce.Do(func() { + file_protos_events_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_events_proto_rawDescData) + }) + return file_protos_events_proto_rawDescData +} + +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_events_proto_goTypes = []interface{}{ + (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat + (*Ev_MetaEvent_FrameworkFailure)(nil), // 1: events.Ev_MetaEvent_FrameworkFailure + (*Ev_EnvironmentEvent)(nil), // 2: events.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 3: events.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 4: events.Ev_RoleEvent + (*Event)(nil), // 5: events.Event +} +var file_protos_events_proto_depIdxs = []int32{ + 2, // 0: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 3, // 1: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 4, // 2: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 1, // 3: events.Event.frameworkFailureEvent:type_name -> events.Ev_MetaEvent_FrameworkFailure + 0, // 4: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 5, // [5:5] is the sub-list for method output_type + 5, // [5:5] is the sub-list for method input_type + 5, // [5:5] is the sub-list for extension type_name + 5, // [5:5] is the sub-list for extension extendee + 0, // [0:5] is the sub-list for field type_name +} + +func init() { file_protos_events_proto_init() } +func file_protos_events_proto_init() { + if File_protos_events_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_MetaEvent_MesosHeartbeat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_MetaEvent_FrameworkFailure); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_EnvironmentEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_TaskEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RoleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Event); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_events_proto_msgTypes[5].OneofWrappers = []interface{}{ + (*Event_EnvironmentEvent)(nil), + (*Event_TaskEvent)(nil), + (*Event_RoleEvent)(nil), + (*Event_FrameworkFailureEvent)(nil), + (*Event_MesosHeartbeatEvent)(nil), + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_events_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_events_proto_goTypes, + DependencyIndexes: file_protos_events_proto_depIdxs, + MessageInfos: file_protos_events_proto_msgTypes, + }.Build() + File_protos_events_proto = out.File + file_protos_events_proto_rawDesc = nil + file_protos_events_proto_goTypes = nil + file_protos_events_proto_depIdxs = nil +} diff --git a/common/protos/events.proto b/common/protos/events.proto index 04ce4fbe9..2c3358088 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -30,7 +30,11 @@ option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; //////////////// Common event messages /////////////// -message Event_MesosHeartbeat { +message Ev_MetaEvent_MesosHeartbeat { +} + +message Ev_MetaEvent_FrameworkFailure { + string message = 1; } message Ev_EnvironmentEvent { @@ -60,8 +64,10 @@ message Ev_RoleEvent { message Event { string timestamp = 1; oneof Payload { - Ev_EnvironmentEvent environmentEvent = 2; - Ev_TaskEvent taskEvent = 3; - Ev_RoleEvent roleEvent = 4; + Ev_EnvironmentEvent environmentEvent = 2; + Ev_TaskEvent taskEvent = 3; + Ev_RoleEvent roleEvent = 4; + Ev_MetaEvent_FrameworkFailure frameworkFailureEvent = 5; + Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 6; } } diff --git a/core/protos/protoutils.go b/common/protos/protoutils.go similarity index 100% rename from core/protos/protoutils.go rename to common/protos/protoutils.go diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index d091ff4d4..c13fe8fe6 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -5421,147 +5421,147 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd6, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, - 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5a, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd8, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, + 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, - 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, - 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, - 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x53, 0x75, + 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5721,58 +5721,58 @@ var file_protos_o2control_proto_depIdxs = []int32{ 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 9, // 50: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 14, // 51: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 17, // 52: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 19, // 53: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 54: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 55: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 56: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 57: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 30, // 58: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 33, // 59: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 72, // 60: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 72, // 61: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 43, // 62: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 63: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 64: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 65: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 66: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 60, // 67: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 63, // 68: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 65, // 69: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 67, // 70: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 68, // 71: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 69, // 72: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 70, // 73: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 74: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 72, // 75: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 10, // 76: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 16, // 77: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 18, // 78: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 20, // 79: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 80: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 81: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 82: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 83: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 32, // 84: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 34, // 85: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 86: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 36, // 87: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 44, // 88: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 89: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 90: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 91: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 59, // 92: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 62, // 93: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 64, // 94: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 66, // 95: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 72, // 96: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 72, // 97: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 72, // 98: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 71, // 99: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 100: o2control.Control.Subscribe:output_type -> o2control.Event - 73, // 101: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 19, // 51: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 24, // 52: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 22, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 26, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 28, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 33, // 56: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 72, // 57: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 72, // 58: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 43, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 45, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 51, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 53, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 56, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 60, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 63, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 65, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 67, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 68, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 69, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 70, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 72, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 9, // 73: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest + 17, // 74: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 30, // 75: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 35, // 83: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 36, // 84: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 44, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 46, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 52, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 55, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 59, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 62, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 64, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 66, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 72, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 72, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 72, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 71, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event + 73, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 10, // 99: o2control.Control.TrackStatus:output_type -> o2control.StatusReply + 18, // 100: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 32, // 101: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply 76, // [76:102] is the sub-list for method output_type 50, // [50:76] is the sub-list for method input_type 50, // [50:50] is the sub-list for extension type_name diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index faa355ec7..12ce81f1a 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -42,15 +42,12 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" Control_GetFrameworkInfo_FullMethodName = "/o2control.Control/GetFrameworkInfo" - Control_Teardown_FullMethodName = "/o2control.Control/Teardown" Control_GetEnvironments_FullMethodName = "/o2control.Control/GetEnvironments" Control_NewAutoEnvironment_FullMethodName = "/o2control.Control/NewAutoEnvironment" Control_NewEnvironment_FullMethodName = "/o2control.Control/NewEnvironment" Control_GetEnvironment_FullMethodName = "/o2control.Control/GetEnvironment" Control_ControlEnvironment_FullMethodName = "/o2control.Control/ControlEnvironment" - Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" Control_DestroyEnvironment_FullMethodName = "/o2control.Control/DestroyEnvironment" Control_GetActiveDetectors_FullMethodName = "/o2control.Control/GetActiveDetectors" Control_GetAvailableDetectors_FullMethodName = "/o2control.Control/GetAvailableDetectors" @@ -68,21 +65,21 @@ const ( Control_SetRepoDefaultRevision_FullMethodName = "/o2control.Control/SetRepoDefaultRevision" Control_Subscribe_FullMethodName = "/o2control.Control/Subscribe" Control_GetIntegratedServices_FullMethodName = "/o2control.Control/GetIntegratedServices" + Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" + Control_Teardown_FullMethodName = "/o2control.Control/Teardown" + Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" ) // ControlClient is the client API for Control service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) @@ -100,6 +97,10 @@ type ControlClient interface { SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) + // Reserved and not implemented: + TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) } type controlClient struct { @@ -110,38 +111,6 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { return &controlClient{cc} } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_TrackStatus_FullMethodName, opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type controlTrackStatusClient struct { - grpc.ClientStream -} - -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { out := new(GetFrameworkInfoReply) err := c.cc.Invoke(ctx, Control_GetFrameworkInfo_FullMethodName, in, out, opts...) @@ -151,15 +120,6 @@ func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkIn return out, nil } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { out := new(GetEnvironmentsReply) err := c.cc.Invoke(ctx, Control_GetEnvironments_FullMethodName, in, out, opts...) @@ -205,15 +165,6 @@ func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvir return out, nil } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { out := new(DestroyEnvironmentReply) err := c.cc.Invoke(ctx, Control_DestroyEnvironment_FullMethodName, in, out, opts...) @@ -350,7 +301,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_Subscribe_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_Subscribe_FullMethodName, opts...) if err != nil { return nil, err } @@ -390,19 +341,66 @@ func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, op return out, nil } +func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_TrackStatus_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &controlTrackStatusClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Control_TrackStatusClient interface { + Recv() (*StatusReply, error) + grpc.ClientStream +} + +type controlTrackStatusClient struct { + grpc.ClientStream +} + +func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { + m := new(StatusReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. // All implementations should embed UnimplementedControlServer // for forward compatibility type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) @@ -420,21 +418,19 @@ type ControlServer interface { SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) Subscribe(*SubscribeRequest, Control_SubscribeServer) error GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) + // Reserved and not implemented: + TrackStatus(*StatusRequest, Control_TrackStatusServer) error + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) } // UnimplementedControlServer should be embedded to have forward compatible implementations. type UnimplementedControlServer struct { } -func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} func (UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") } -func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } @@ -450,9 +446,6 @@ func (UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmen func (UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") } -func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } @@ -504,6 +497,15 @@ func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_Subscribe func (UnimplementedControlServer) GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetIntegratedServices not implemented") } +func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { + return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") +} +func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} // UnsafeControlServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ControlServer will @@ -516,27 +518,6 @@ func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { s.RegisterService(&Control_ServiceDesc, srv) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetFrameworkInfoRequest) if err := dec(in); err != nil { @@ -555,24 +536,6 @@ func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Control_Teardown_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetEnvironmentsRequest) if err := dec(in); err != nil { @@ -663,24 +626,6 @@ func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Control_ModifyEnvironment_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DestroyEnvironmentRequest) if err := dec(in); err != nil { @@ -990,6 +935,63 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StatusRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) +} + +type Control_TrackStatusServer interface { + Send(*StatusReply) error + grpc.ServerStream +} + +type controlTrackStatusServer struct { + grpc.ServerStream +} + +func (x *controlTrackStatusServer) Send(m *StatusReply) error { + return x.ServerStream.SendMsg(m) +} + +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_Teardown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_ModifyEnvironment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Control_ServiceDesc is the grpc.ServiceDesc for Control service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1001,10 +1003,6 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFrameworkInfo", Handler: _Control_GetFrameworkInfo_Handler, }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, { MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, @@ -1025,10 +1023,6 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "ControlEnvironment", Handler: _Control_ControlEnvironment_Handler, }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, { MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, @@ -1093,16 +1087,24 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetIntegratedServices", Handler: _Control_GetIntegratedServices_Handler, }, + { + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, + }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, }, Streams: []grpc.StreamDesc{ { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, + StreamName: "Subscribe", + Handler: _Control_Subscribe_Handler, ServerStreams: true, }, { - StreamName: "Subscribe", - Handler: _Control_Subscribe_Handler, + StreamName: "TrackStatus", + Handler: _Control_TrackStatus_Handler, ServerStreams: true, }, }, diff --git a/core/server.go b/core/server.go index edd337460..376f4eb95 100644 --- a/core/server.go +++ b/core/server.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto +//go:generate protoc -I=./ -I=../common/ --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto package core From efb45cc9482258b657c03db6211bea77b2ee4f57 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Feb 2023 14:40:08 +0100 Subject: [PATCH 1816/2352] [core] Update events.proto+o2control.proto with NewEnvironmentAsync --- common/protos/events.proto | 4 +++- core/protos/o2control.proto | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/common/protos/events.proto b/common/protos/events.proto index 2c3358088..cc9fc3fb2 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -43,6 +43,8 @@ message Ev_EnvironmentEvent { uint32 currentRunNumber = 3; string error = 4; string message = 5; + string transition = 6; + string transitionStep = 7; } message Ev_TaskEvent { @@ -62,7 +64,7 @@ message Ev_RoleEvent { } message Event { - string timestamp = 1; + int64 timestamp = 1; oneof Payload { Ev_EnvironmentEvent environmentEvent = 2; Ev_TaskEvent taskEvent = 3; diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 52a730b01..6b17a3ac7 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -71,6 +71,8 @@ service Control { rpc GetActiveDetectors (Empty) returns (GetActiveDetectorsReply) {} rpc GetAvailableDetectors (Empty) returns (GetAvailableDetectorsReply) {} + rpc NewEnvironmentAsync (NewEnvironmentRequest) returns (NewEnvironmentReply) {} + // rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} // rpc GetEnvironmentProperties (GetEnvironmentPropertiesRequest) returns (GetEnvironmentPropertiesReply) {} From 3d35bbe93deb818abaac9bf06ac41afde484d282 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Feb 2024 14:38:21 +0100 Subject: [PATCH 1817/2352] [common] Use events.proto in o2control.proto --- coconut/protos/o2control.pb.go | 3311 ++++++++++++------------------ common/protos/events.pb.go | 129 +- common/protos/protoutils.go | 3 +- core/environment/eventStream.go | 2 +- core/protos/o2control.pb.go | 3311 ++++++++++++------------------ core/protos/o2control.proto | 65 +- core/protos/o2control_grpc.pb.go | 112 +- 7 files changed, 2666 insertions(+), 4267 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index c13fe8fe6..5b01e7a4e 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -30,6 +30,7 @@ package pb import ( + protos "github.com/AliceO2Group/Control/common/protos" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -43,57 +44,19 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type StatusUpdate_Level int32 +// Symbols defined in public import of protos/events.proto. -const ( - StatusUpdate_DEBUG StatusUpdate_Level = 0 - StatusUpdate_INFO StatusUpdate_Level = 1 - StatusUpdate_WARNING StatusUpdate_Level = 2 - StatusUpdate_ERROR StatusUpdate_Level = 3 -) - -// Enum value maps for StatusUpdate_Level. -var ( - StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", - } - StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, - } -) - -func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { - p := new(StatusUpdate_Level) - *p = x - return p -} - -func (x StatusUpdate_Level) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[0].Descriptor() -} - -func (StatusUpdate_Level) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[0] -} - -func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StatusUpdate_Level.Descriptor instead. -func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} -} +type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat +type Ev_MetaEvent_FrameworkFailure = protos.Ev_MetaEvent_FrameworkFailure +type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent +type Ev_TaskEvent = protos.Ev_TaskEvent +type Ev_RoleEvent = protos.Ev_RoleEvent +type Event = protos.Event +type Event_EnvironmentEvent = protos.Event_EnvironmentEvent +type Event_TaskEvent = protos.Event_TaskEvent +type Event_RoleEvent = protos.Event_RoleEvent +type Event_FrameworkFailureEvent = protos.Event_FrameworkFailureEvent +type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type ControlEnvironmentRequest_Optype int32 @@ -140,11 +103,11 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[1].Descriptor() + return file_protos_o2control_proto_enumTypes[0].Descriptor() } func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[1] + return &file_protos_o2control_proto_enumTypes[0] } func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { @@ -153,7 +116,7 @@ func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{15, 0} } type EnvironmentOperation_Optype int32 @@ -173,702 +136,153 @@ var ( } EnvironmentOperation_Optype_value = map[string]int32{ "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, - } -) - -func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { - p := new(EnvironmentOperation_Optype) - *p = x - return p -} - -func (x EnvironmentOperation_Optype) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[2].Descriptor() -} - -func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[2] -} - -func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. -func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} -} - -type VarSpecMessage_UiWidget int32 - -const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed - VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 - VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 - VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 - VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 -) - -// Enum value maps for VarSpecMessage_UiWidget. -var ( - VarSpecMessage_UiWidget_name = map[int32]string{ - 0: "editBox", - 1: "slider", - 2: "listBox", - 3: "dropDownBox", - 4: "comboBox", - 5: "radioButtonBox", - 6: "checkBox", - } - VarSpecMessage_UiWidget_value = map[string]int32{ - "editBox": 0, - "slider": 1, - "listBox": 2, - "dropDownBox": 3, - "comboBox": 4, - "radioButtonBox": 5, - "checkBox": 6, - } -) - -func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { - p := new(VarSpecMessage_UiWidget) - *p = x - return p -} - -func (x VarSpecMessage_UiWidget) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[3].Descriptor() -} - -func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[3] -} - -func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. -func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52, 0} -} - -type VarSpecMessage_Type int32 - -const ( - VarSpecMessage_string VarSpecMessage_Type = 0 - VarSpecMessage_number VarSpecMessage_Type = 1 - VarSpecMessage_bool VarSpecMessage_Type = 2 - VarSpecMessage_list VarSpecMessage_Type = 3 - VarSpecMessage_map VarSpecMessage_Type = 4 -) - -// Enum value maps for VarSpecMessage_Type. -var ( - VarSpecMessage_Type_name = map[int32]string{ - 0: "string", - 1: "number", - 2: "bool", - 3: "list", - 4: "map", - } - VarSpecMessage_Type_value = map[string]int32{ - "string": 0, - "number": 1, - "bool": 2, - "list": 3, - "map": 4, - } -) - -func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { - p := new(VarSpecMessage_Type) - *p = x - return p -} - -func (x VarSpecMessage_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[4].Descriptor() -} - -func (VarSpecMessage_Type) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[4] -} - -func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use VarSpecMessage_Type.Descriptor instead. -func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52, 1} -} - -type Event_MesosHeartbeat struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Event_MesosHeartbeat) Reset() { - *x = Event_MesosHeartbeat{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Event_MesosHeartbeat) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Event_MesosHeartbeat) ProtoMessage() {} - -func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{0} -} - -type Ev_EnvironmentEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *Ev_EnvironmentEvent) Reset() { - *x = Ev_EnvironmentEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentEvent) ProtoMessage() {} - -func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{1} -} - -func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if x != nil { - return x.CurrentRunNumber - } - return 0 -} - -func (x *Ev_EnvironmentEvent) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type Ev_TaskEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` -} - -func (x *Ev_TaskEvent) Reset() { - *x = Ev_TaskEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskEvent) ProtoMessage() {} - -func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{2} -} - -func (x *Ev_TaskEvent) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Ev_TaskEvent) GetTaskid() string { - if x != nil { - return x.Taskid - } - return "" -} - -func (x *Ev_TaskEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_TaskEvent) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *Ev_TaskEvent) GetHostname() string { - if x != nil { - return x.Hostname - } - return "" -} - -func (x *Ev_TaskEvent) GetClassName() string { - if x != nil { - return x.ClassName - } - return "" -} - -type Ev_RoleEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` -} - -func (x *Ev_RoleEvent) Reset() { - *x = Ev_RoleEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_RoleEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_RoleEvent) ProtoMessage() {} - -func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{3} -} - -func (x *Ev_RoleEvent) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Ev_RoleEvent) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *Ev_RoleEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_RoleEvent) GetRolePath() string { - if x != nil { - return x.RolePath - } - return "" -} - -// ////////////////////////////////////// -// Global status -// ////////////////////////////////////// -type StatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StatusRequest) Reset() { - *x = StatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusRequest) ProtoMessage() {} - -func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. -func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{4} -} - -type StatusReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` -} - -func (x *StatusReply) Reset() { - *x = StatusReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusReply) ProtoMessage() {} - -func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. -func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{5} -} - -func (x *StatusReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { - if x != nil { - return x.StatusUpdates - } - return nil -} - -type StatusUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are assignable to Event: - // - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` -} - -func (x *StatusUpdate) Reset() { - *x = StatusUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, } -} - -func (x *StatusUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusUpdate) ProtoMessage() {} +) -func (x *StatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } -// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6} +func (x EnvironmentOperation_Optype) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *StatusUpdate) GetLevel() StatusUpdate_Level { - if x != nil { - return x.Level - } - return StatusUpdate_DEBUG +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() } -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { - if m != nil { - return m.Event - } - return nil +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] } -func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -type isStatusUpdate_Event interface { - isStatusUpdate_Event() +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. +func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18, 0} } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto -} +type VarSpecMessage_UiWidget int32 -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +const ( + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 + VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 +) -type Event struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// Enum value maps for VarSpecMessage_UiWidget. +var ( + VarSpecMessage_UiWidget_name = map[int32]string{ + 0: "editBox", + 1: "slider", + 2: "listBox", + 3: "dropDownBox", + 4: "comboBox", + 5: "radioButtonBox", + 6: "checkBox", + } + VarSpecMessage_UiWidget_value = map[string]int32{ + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + "radioButtonBox": 5, + "checkBox": 6, + } +) - Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are assignable to Payload: - // - // *Event_EnvironmentEvent - // *Event_TaskEvent - // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` +func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { + p := new(VarSpecMessage_UiWidget) + *p = x + return p } -func (x *Event) Reset() { - *x = Event{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x VarSpecMessage_UiWidget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *Event) String() string { - return protoimpl.X.MessageStringOf(x) +func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() } -func (*Event) ProtoMessage() {} - -func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) +func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] } -// Deprecated: Use Event.ProtoReflect.Descriptor instead. -func (*Event) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{7} +func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -func (x *Event) GetTimestamp() string { - if x != nil { - return x.Timestamp - } - return "" +// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. +func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44, 0} } -func (m *Event) GetPayload() isEvent_Payload { - if m != nil { - return m.Payload - } - return nil -} +type VarSpecMessage_Type int32 -func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { - return x.EnvironmentEvent - } - return nil -} +const ( + VarSpecMessage_string VarSpecMessage_Type = 0 + VarSpecMessage_number VarSpecMessage_Type = 1 + VarSpecMessage_bool VarSpecMessage_Type = 2 + VarSpecMessage_list VarSpecMessage_Type = 3 + VarSpecMessage_map VarSpecMessage_Type = 4 +) -func (x *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := x.GetPayload().(*Event_TaskEvent); ok { - return x.TaskEvent +// Enum value maps for VarSpecMessage_Type. +var ( + VarSpecMessage_Type_name = map[int32]string{ + 0: "string", + 1: "number", + 2: "bool", + 3: "list", + 4: "map", } - return nil -} - -func (x *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := x.GetPayload().(*Event_RoleEvent); ok { - return x.RoleEvent + VarSpecMessage_Type_value = map[string]int32{ + "string": 0, + "number": 1, + "bool": 2, + "list": 3, + "map": 4, } - return nil -} +) -type isEvent_Payload interface { - isEvent_Payload() +func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { + p := new(VarSpecMessage_Type) + *p = x + return p } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` +func (x VarSpecMessage_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` +func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[3].Descriptor() } -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` +func (VarSpecMessage_Type) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[3] } -func (*Event_EnvironmentEvent) isEvent_Payload() {} - -func (*Event_TaskEvent) isEvent_Payload() {} +func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} -func (*Event_RoleEvent) isEvent_Payload() {} +// Deprecated: Use VarSpecMessage_Type.Descriptor instead. +func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44, 1} +} type SubscribeRequest struct { state protoimpl.MessageState @@ -881,7 +295,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[8] + mi := &file_protos_o2control_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -894,7 +308,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[8] + mi := &file_protos_o2control_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -907,7 +321,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{8} + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } func (x *SubscribeRequest) GetId() string { @@ -929,7 +343,7 @@ type GetFrameworkInfoRequest struct { func (x *GetFrameworkInfoRequest) Reset() { *x = GetFrameworkInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[9] + mi := &file_protos_o2control_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -942,7 +356,7 @@ func (x *GetFrameworkInfoRequest) String() string { func (*GetFrameworkInfoRequest) ProtoMessage() {} func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[9] + mi := &file_protos_o2control_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -955,7 +369,7 @@ func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{9} + return file_protos_o2control_proto_rawDescGZIP(), []int{1} } type Version struct { @@ -974,7 +388,7 @@ type Version struct { func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -987,7 +401,7 @@ func (x *Version) String() string { func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1000,7 +414,7 @@ func (x *Version) ProtoReflect() protoreflect.Message { // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{10} + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } func (x *Version) GetMajor() int32 { @@ -1066,7 +480,7 @@ type GetFrameworkInfoReply struct { func (x *GetFrameworkInfoReply) Reset() { *x = GetFrameworkInfoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +493,7 @@ func (x *GetFrameworkInfoReply) String() string { func (*GetFrameworkInfoReply) ProtoMessage() {} func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +506,7 @@ func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{11} + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } func (x *GetFrameworkInfoReply) GetFrameworkId() string { @@ -1184,7 +598,7 @@ type TeardownRequest struct { func (x *TeardownRequest) Reset() { *x = TeardownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1197,7 +611,7 @@ func (x *TeardownRequest) String() string { func (*TeardownRequest) ProtoMessage() {} func (x *TeardownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1210,7 +624,7 @@ func (x *TeardownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. func (*TeardownRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12} + return file_protos_o2control_proto_rawDescGZIP(), []int{4} } func (x *TeardownRequest) GetReason() string { @@ -1229,7 +643,7 @@ type TeardownReply struct { func (x *TeardownReply) Reset() { *x = TeardownReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1242,7 +656,7 @@ func (x *TeardownReply) String() string { func (*TeardownReply) ProtoMessage() {} func (x *TeardownReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1255,7 +669,7 @@ func (x *TeardownReply) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. func (*TeardownReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{13} + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } // ////////////////////////////////////// @@ -1273,7 +687,7 @@ type GetEnvironmentsRequest struct { func (x *GetEnvironmentsRequest) Reset() { *x = GetEnvironmentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1286,7 +700,7 @@ func (x *GetEnvironmentsRequest) String() string { func (*GetEnvironmentsRequest) ProtoMessage() {} func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1299,7 +713,7 @@ func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{14} + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } func (x *GetEnvironmentsRequest) GetShowAll() bool { @@ -1328,7 +742,7 @@ type GetEnvironmentsReply struct { func (x *GetEnvironmentsReply) Reset() { *x = GetEnvironmentsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1341,7 +755,7 @@ func (x *GetEnvironmentsReply) String() string { func (*GetEnvironmentsReply) ProtoMessage() {} func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1354,7 +768,7 @@ func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{15} + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } func (x *GetEnvironmentsReply) GetFrameworkId() string { @@ -1399,7 +813,7 @@ type EnvironmentInfo struct { func (x *EnvironmentInfo) Reset() { *x = EnvironmentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1412,7 +826,7 @@ func (x *EnvironmentInfo) String() string { func (*EnvironmentInfo) ProtoMessage() {} func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1425,7 +839,7 @@ func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{16} + return file_protos_o2control_proto_rawDescGZIP(), []int{8} } func (x *EnvironmentInfo) GetId() string { @@ -1567,7 +981,7 @@ type NewEnvironmentRequest struct { func (x *NewEnvironmentRequest) Reset() { *x = NewEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1580,7 +994,7 @@ func (x *NewEnvironmentRequest) String() string { func (*NewEnvironmentRequest) ProtoMessage() {} func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1593,7 +1007,7 @@ func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{17} + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { @@ -1629,7 +1043,7 @@ type NewEnvironmentReply struct { func (x *NewEnvironmentReply) Reset() { *x = NewEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1642,7 +1056,7 @@ func (x *NewEnvironmentReply) String() string { func (*NewEnvironmentReply) ProtoMessage() {} func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1655,7 +1069,7 @@ func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{18} + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1685,7 +1099,7 @@ type NewAutoEnvironmentRequest struct { func (x *NewAutoEnvironmentRequest) Reset() { *x = NewAutoEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1112,7 @@ func (x *NewAutoEnvironmentRequest) String() string { func (*NewAutoEnvironmentRequest) ProtoMessage() {} func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1125,7 @@ func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{19} + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { @@ -1744,7 +1158,7 @@ type NewAutoEnvironmentReply struct { func (x *NewAutoEnvironmentReply) Reset() { *x = NewAutoEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1757,7 +1171,7 @@ func (x *NewAutoEnvironmentReply) String() string { func (*NewAutoEnvironmentReply) ProtoMessage() {} func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1770,7 +1184,7 @@ func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{20} + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } type GetEnvironmentRequest struct { @@ -1785,7 +1199,7 @@ type GetEnvironmentRequest struct { func (x *GetEnvironmentRequest) Reset() { *x = GetEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1212,7 @@ func (x *GetEnvironmentRequest) String() string { func (*GetEnvironmentRequest) ProtoMessage() {} func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1225,7 @@ func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{21} + return file_protos_o2control_proto_rawDescGZIP(), []int{13} } func (x *GetEnvironmentRequest) GetId() string { @@ -1841,7 +1255,7 @@ type GetEnvironmentReply struct { func (x *GetEnvironmentReply) Reset() { *x = GetEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1854,7 +1268,7 @@ func (x *GetEnvironmentReply) String() string { func (*GetEnvironmentReply) ProtoMessage() {} func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1867,7 +1281,7 @@ func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{22} + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1903,7 +1317,7 @@ type ControlEnvironmentRequest struct { func (x *ControlEnvironmentRequest) Reset() { *x = ControlEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1916,7 +1330,7 @@ func (x *ControlEnvironmentRequest) String() string { func (*ControlEnvironmentRequest) ProtoMessage() {} func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1929,7 +1343,7 @@ func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23} + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } func (x *ControlEnvironmentRequest) GetId() string { @@ -1963,7 +1377,7 @@ type ControlEnvironmentReply struct { func (x *ControlEnvironmentReply) Reset() { *x = ControlEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1976,7 +1390,7 @@ func (x *ControlEnvironmentReply) String() string { func (*ControlEnvironmentReply) ProtoMessage() {} func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1989,7 +1403,7 @@ func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{24} + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } func (x *ControlEnvironmentReply) GetId() string { @@ -2047,7 +1461,7 @@ type ModifyEnvironmentRequest struct { func (x *ModifyEnvironmentRequest) Reset() { *x = ModifyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2060,7 +1474,7 @@ func (x *ModifyEnvironmentRequest) String() string { func (*ModifyEnvironmentRequest) ProtoMessage() {} func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2073,7 +1487,7 @@ func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{25} + return file_protos_o2control_proto_rawDescGZIP(), []int{17} } func (x *ModifyEnvironmentRequest) GetId() string { @@ -2109,7 +1523,7 @@ type EnvironmentOperation struct { func (x *EnvironmentOperation) Reset() { *x = EnvironmentOperation{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2122,7 +1536,7 @@ func (x *EnvironmentOperation) String() string { func (*EnvironmentOperation) ProtoMessage() {} func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2135,7 +1549,7 @@ func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26} + return file_protos_o2control_proto_rawDescGZIP(), []int{18} } func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { @@ -2165,7 +1579,7 @@ type ModifyEnvironmentReply struct { func (x *ModifyEnvironmentReply) Reset() { *x = ModifyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2178,7 +1592,7 @@ func (x *ModifyEnvironmentReply) String() string { func (*ModifyEnvironmentReply) ProtoMessage() {} func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2191,7 +1605,7 @@ func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27} + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { @@ -2229,7 +1643,7 @@ type DestroyEnvironmentRequest struct { func (x *DestroyEnvironmentRequest) Reset() { *x = DestroyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2242,7 +1656,7 @@ func (x *DestroyEnvironmentRequest) String() string { func (*DestroyEnvironmentRequest) ProtoMessage() {} func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2255,7 +1669,7 @@ func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{28} + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } func (x *DestroyEnvironmentRequest) GetId() string { @@ -2297,7 +1711,7 @@ type DestroyEnvironmentReply struct { func (x *DestroyEnvironmentReply) Reset() { *x = DestroyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2310,7 +1724,7 @@ func (x *DestroyEnvironmentReply) String() string { func (*DestroyEnvironmentReply) ProtoMessage() {} func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2323,7 +1737,7 @@ func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{29} + return file_protos_o2control_proto_rawDescGZIP(), []int{21} } func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { @@ -2344,7 +1758,7 @@ type GetActiveDetectorsReply struct { func (x *GetActiveDetectorsReply) Reset() { *x = GetActiveDetectorsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2357,7 +1771,7 @@ func (x *GetActiveDetectorsReply) String() string { func (*GetActiveDetectorsReply) ProtoMessage() {} func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2370,7 +1784,7 @@ func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetActiveDetectorsReply.ProtoReflect.Descriptor instead. func (*GetActiveDetectorsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } func (x *GetActiveDetectorsReply) GetDetectors() []string { @@ -2391,7 +1805,7 @@ type GetAvailableDetectorsReply struct { func (x *GetAvailableDetectorsReply) Reset() { *x = GetAvailableDetectorsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2404,7 +1818,7 @@ func (x *GetAvailableDetectorsReply) String() string { func (*GetAvailableDetectorsReply) ProtoMessage() {} func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2417,7 +1831,7 @@ func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAvailableDetectorsReply.ProtoReflect.Descriptor instead. func (*GetAvailableDetectorsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } func (x *GetAvailableDetectorsReply) GetDetectors() []string { @@ -2444,7 +1858,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2457,7 +1871,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2470,7 +1884,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2496,7 +1910,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2509,7 +1923,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2522,7 +1936,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } type GetEnvironmentPropertiesRequest struct { @@ -2541,7 +1955,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2554,7 +1968,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2567,7 +1981,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2602,7 +2016,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2615,7 +2029,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2628,7 +2042,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2661,7 +2075,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2674,7 +2088,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2687,7 +2101,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{28} } func (x *ShortTaskInfo) GetName() string { @@ -2774,7 +2188,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2787,7 +2201,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2800,7 +2214,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2840,7 +2254,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2267,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2280,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{30} } type GetTasksReply struct { @@ -2880,7 +2294,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2893,7 +2307,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2906,7 +2320,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2927,7 +2341,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2354,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,7 +2367,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *GetTaskRequest) GetTaskId() string { @@ -2974,7 +2388,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2987,7 +2401,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3000,7 +2414,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -3022,7 +2436,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3035,7 +2449,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3048,7 +2462,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *TaskClassInfo) GetName() string { @@ -3080,7 +2494,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3093,7 +2507,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3106,7 +2520,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *CommandInfo) GetEnv() []string { @@ -3157,7 +2571,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3170,7 +2584,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3183,7 +2597,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *ChannelInfo) GetName() string { @@ -3225,7 +2639,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3238,7 +2652,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3251,7 +2665,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3321,7 +2735,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3334,7 +2748,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3347,7 +2761,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3369,7 +2783,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3382,7 +2796,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3395,7 +2809,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3427,7 +2841,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3440,7 +2854,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3453,7 +2867,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetRolesRequest) GetEnvId() string { @@ -3491,7 +2905,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3504,7 +2918,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3517,7 +2931,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *RoleInfo) GetName() string { @@ -3608,7 +3022,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3621,7 +3035,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3634,7 +3048,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3659,7 +3073,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3672,7 +3086,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3685,7 +3099,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3743,7 +3157,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3756,7 +3170,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3769,7 +3183,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3857,7 +3271,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3870,7 +3284,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3883,7 +3297,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3932,7 +3346,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3945,7 +3359,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3958,7 +3372,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3979,7 +3393,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3992,7 +3406,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4005,7 +3419,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -4029,7 +3443,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +3456,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +3469,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *RepoInfo) GetName() string { @@ -4098,7 +3512,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4111,7 +3525,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4124,7 +3538,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -4153,7 +3567,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4166,7 +3580,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4179,7 +3593,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *AddRepoRequest) GetName() string { @@ -4208,7 +3622,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4221,7 +3635,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4234,7 +3648,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4262,7 +3676,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4275,7 +3689,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4288,7 +3702,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4309,7 +3723,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +3736,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +3749,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4356,7 +3770,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +3783,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4382,7 +3796,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4403,7 +3817,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4416,7 +3830,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4429,7 +3843,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4450,7 +3864,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +3877,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4476,7 +3890,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4498,7 +3912,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +3925,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +3938,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4552,7 +3966,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4565,7 +3979,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4578,7 +3992,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4597,7 +4011,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4610,7 +4024,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4623,7 +4037,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } type ListIntegratedServicesReply struct { @@ -4637,7 +4051,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4650,7 +4064,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4663,7 +4077,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4688,7 +4102,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[69] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4701,7 +4115,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[69] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4714,7 +4128,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{69} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *IntegratedServiceInfo) GetName() string { @@ -4757,811 +4171,748 @@ var File_protos_o2control_proto protoreflect.FileDescriptor var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, - 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, - 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, - 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, - 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, - 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, 0x0a, 0x15, + 0x72, 0x6f, 0x6c, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, - 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x34, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, + 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, + 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, - 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, - 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, - 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, - 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, - 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, - 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, - 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, - 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, - 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, - 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, - 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, - 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, + 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, - 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, + 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, + 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, + 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, + 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, + 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, - 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, - 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, - 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, - 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, - 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, - 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, - 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, - 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, + 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, + 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, + 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, + 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, + 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, - 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, - 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd8, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, + 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, + 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, + 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, + 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, + 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5576,208 +4927,194 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { return file_protos_o2control_proto_rawDescData } -var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_protos_o2control_proto_goTypes = []interface{}{ - (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level - (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype - (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype - (VarSpecMessage_UiWidget)(0), // 3: o2control.VarSpecMessage.UiWidget - (VarSpecMessage_Type)(0), // 4: o2control.VarSpecMessage.Type - (*Event_MesosHeartbeat)(nil), // 5: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentEvent)(nil), // 6: o2control.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 7: o2control.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 8: o2control.Ev_RoleEvent - (*StatusRequest)(nil), // 9: o2control.StatusRequest - (*StatusReply)(nil), // 10: o2control.StatusReply - (*StatusUpdate)(nil), // 11: o2control.StatusUpdate - (*Event)(nil), // 12: o2control.Event - (*SubscribeRequest)(nil), // 13: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 14: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 15: o2control.Version - (*GetFrameworkInfoReply)(nil), // 16: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 17: o2control.TeardownRequest - (*TeardownReply)(nil), // 18: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 19: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 20: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 21: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 22: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 23: o2control.NewEnvironmentReply - (*NewAutoEnvironmentRequest)(nil), // 24: o2control.NewAutoEnvironmentRequest - (*NewAutoEnvironmentReply)(nil), // 25: o2control.NewAutoEnvironmentReply - (*GetEnvironmentRequest)(nil), // 26: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 27: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 28: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 29: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 30: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 31: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply - (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply - (*GetAvailableDetectorsReply)(nil), // 36: o2control.GetAvailableDetectorsReply - (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 44: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 46: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo - (*CommandInfo)(nil), // 48: o2control.CommandInfo - (*ChannelInfo)(nil), // 49: o2control.ChannelInfo - (*TaskInfo)(nil), // 50: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest - (*RoleInfo)(nil), // 54: o2control.RoleInfo - (*GetRolesReply)(nil), // 55: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 57: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 58: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 59: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 60: o2control.ListReposRequest - (*RepoInfo)(nil), // 61: o2control.RepoInfo - (*ListReposReply)(nil), // 62: o2control.ListReposReply - (*AddRepoRequest)(nil), // 63: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 64: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 65: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 66: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 67: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 68: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 69: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 70: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 71: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 72: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 73: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 74: o2control.IntegratedServiceInfo - nil, // 75: o2control.EnvironmentInfo.DefaultsEntry - nil, // 76: o2control.EnvironmentInfo.VarsEntry - nil, // 77: o2control.EnvironmentInfo.UserVarsEntry - nil, // 78: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 79: o2control.NewEnvironmentRequest.VarsEntry - nil, // 80: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 81: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 82: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 83: o2control.TaskInfo.PropertiesEntry - nil, // 84: o2control.RoleInfo.DefaultsEntry - nil, // 85: o2control.RoleInfo.VarsEntry - nil, // 86: o2control.RoleInfo.UserVarsEntry - nil, // 87: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 88: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 89: o2control.ListIntegratedServicesReply.ServicesEntry + (ControlEnvironmentRequest_Optype)(0), // 0: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 1: o2control.EnvironmentOperation.Optype + (VarSpecMessage_UiWidget)(0), // 2: o2control.VarSpecMessage.UiWidget + (VarSpecMessage_Type)(0), // 3: o2control.VarSpecMessage.Type + (*SubscribeRequest)(nil), // 4: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 5: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 6: o2control.Version + (*GetFrameworkInfoReply)(nil), // 7: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 8: o2control.TeardownRequest + (*TeardownReply)(nil), // 9: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 10: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 11: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 12: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 13: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 14: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 15: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 16: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 17: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 18: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 19: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 20: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 21: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 22: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 23: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 24: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 25: o2control.DestroyEnvironmentReply + (*GetActiveDetectorsReply)(nil), // 26: o2control.GetActiveDetectorsReply + (*GetAvailableDetectorsReply)(nil), // 27: o2control.GetAvailableDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 28: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 29: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 30: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 31: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 32: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 33: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 34: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 35: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 36: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 37: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 38: o2control.TaskClassInfo + (*CommandInfo)(nil), // 39: o2control.CommandInfo + (*ChannelInfo)(nil), // 40: o2control.ChannelInfo + (*TaskInfo)(nil), // 41: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 42: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 43: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 44: o2control.GetRolesRequest + (*RoleInfo)(nil), // 45: o2control.RoleInfo + (*GetRolesReply)(nil), // 46: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 47: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 48: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 49: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 50: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 51: o2control.ListReposRequest + (*RepoInfo)(nil), // 52: o2control.RepoInfo + (*ListReposReply)(nil), // 53: o2control.ListReposReply + (*AddRepoRequest)(nil), // 54: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 55: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 56: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 57: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 58: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 59: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 60: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 61: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 62: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 63: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 64: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 65: o2control.IntegratedServiceInfo + nil, // 66: o2control.EnvironmentInfo.DefaultsEntry + nil, // 67: o2control.EnvironmentInfo.VarsEntry + nil, // 68: o2control.EnvironmentInfo.UserVarsEntry + nil, // 69: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 70: o2control.NewEnvironmentRequest.VarsEntry + nil, // 71: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 72: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 73: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 74: o2control.TaskInfo.PropertiesEntry + nil, // 75: o2control.RoleInfo.DefaultsEntry + nil, // 76: o2control.RoleInfo.VarsEntry + nil, // 77: o2control.RoleInfo.UserVarsEntry + nil, // 78: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 79: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 80: o2control.ListIntegratedServicesReply.ServicesEntry + (*protos.Event)(nil), // 81: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ - 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate - 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 5, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 6, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent - 7, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent - 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent - 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 41, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 75, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 76, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 77, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 78, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 79, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 80, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 54, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 52, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 81, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 82, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 42, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 41, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 50, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 41, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 47, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 49, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 49, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 48, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 83, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 41, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 41, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 54, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 84, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 85, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 86, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 87, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 54, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 88, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 58, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 61, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 19, // 51: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 52: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 33, // 56: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 72, // 57: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 72, // 58: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 43, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 60, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 63, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 65, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 67, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 68, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 69, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 70, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 72, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 9, // 73: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 17, // 74: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 30, // 75: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 83: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 36, // 84: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 44, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 59, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 62, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 64, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 66, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 72, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 72, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 72, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 71, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event - 73, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 10, // 99: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 18, // 100: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 32, // 101: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 76, // [76:102] is the sub-list for method output_type - 50, // [50:76] is the sub-list for method input_type - 50, // [50:50] is the sub-list for extension type_name - 50, // [50:50] is the sub-list for extension extendee - 0, // [0:50] is the sub-list for field type_name + 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 12, // 1: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 32, // 2: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 66, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 67, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 68, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 69, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 70, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 71, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 45, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 43, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 72, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 73, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 41, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 38, // 23: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 40, // 24: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 40, // 25: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 39, // 26: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 74, // 27: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 28: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 29: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 45, // 30: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 75, // 31: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 76, // 32: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 77, // 33: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 78, // 34: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 45, // 35: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 36: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 37: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 79, // 38: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 49, // 39: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 52, // 40: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 80, // 41: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 48, // 42: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 65, // 43: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 50: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 63, // 51: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 63, // 52: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 53: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 54: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 55: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 42, // 56: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 44, // 57: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 47, // 58: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 51, // 59: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 54, // 60: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 56, // 61: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 58, // 62: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 59, // 63: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 60, // 64: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 61, // 65: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 66: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 63, // 67: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 68: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 69: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 71: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 72: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 73: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 74: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 75: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 76: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 77: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 78: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 79: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 43, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 46, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 50, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 53, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 55, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 57, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 63, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 63, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 63, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 62, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 81, // 92: o2control.Control.Subscribe:output_type -> events.Event + 64, // 93: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 94: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 95: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 70, // [70:96] is the sub-list for method output_type + 44, // [44:70] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5787,102 +5124,6 @@ func file_protos_o2control_proto_init() { } if !protoimpl.UnsafeEnabled { file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event_MesosHeartbeat); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_RoleEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribeRequest); i { case 0: return &v.state @@ -5894,7 +5135,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFrameworkInfoRequest); i { case 0: return &v.state @@ -5906,7 +5147,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Version); i { case 0: return &v.state @@ -5918,7 +5159,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFrameworkInfoReply); i { case 0: return &v.state @@ -5930,7 +5171,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeardownRequest); i { case 0: return &v.state @@ -5942,7 +5183,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeardownReply); i { case 0: return &v.state @@ -5954,7 +5195,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentsRequest); i { case 0: return &v.state @@ -5966,7 +5207,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentsReply); i { case 0: return &v.state @@ -5978,7 +5219,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentInfo); i { case 0: return &v.state @@ -5990,7 +5231,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewEnvironmentRequest); i { case 0: return &v.state @@ -6002,7 +5243,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewEnvironmentReply); i { case 0: return &v.state @@ -6014,7 +5255,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewAutoEnvironmentRequest); i { case 0: return &v.state @@ -6026,7 +5267,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewAutoEnvironmentReply); i { case 0: return &v.state @@ -6038,7 +5279,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentRequest); i { case 0: return &v.state @@ -6050,7 +5291,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentReply); i { case 0: return &v.state @@ -6062,7 +5303,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentRequest); i { case 0: return &v.state @@ -6074,7 +5315,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentReply); i { case 0: return &v.state @@ -6086,7 +5327,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentRequest); i { case 0: return &v.state @@ -6098,7 +5339,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentOperation); i { case 0: return &v.state @@ -6110,7 +5351,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentReply); i { case 0: return &v.state @@ -6122,7 +5363,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentRequest); i { case 0: return &v.state @@ -6134,7 +5375,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentReply); i { case 0: return &v.state @@ -6146,7 +5387,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetActiveDetectorsReply); i { case 0: return &v.state @@ -6158,7 +5399,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAvailableDetectorsReply); i { case 0: return &v.state @@ -6170,7 +5411,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -6182,7 +5423,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -6194,7 +5435,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -6206,7 +5447,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -6218,7 +5459,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortTaskInfo); i { case 0: return &v.state @@ -6230,7 +5471,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state @@ -6242,7 +5483,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksRequest); i { case 0: return &v.state @@ -6254,7 +5495,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksReply); i { case 0: return &v.state @@ -6266,7 +5507,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskRequest); i { case 0: return &v.state @@ -6278,7 +5519,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskReply); i { case 0: return &v.state @@ -6290,7 +5531,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskClassInfo); i { case 0: return &v.state @@ -6302,7 +5543,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -6314,7 +5555,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -6326,7 +5567,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -6338,7 +5579,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -6350,7 +5591,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -6362,7 +5603,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -6374,7 +5615,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -6386,7 +5627,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -6398,7 +5639,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -6410,7 +5651,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VarSpecMessage); i { case 0: return &v.state @@ -6422,7 +5663,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -6434,7 +5675,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -6446,7 +5687,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -6458,7 +5699,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -6470,7 +5711,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -6482,7 +5723,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -6494,7 +5735,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -6506,7 +5747,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -6518,7 +5759,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -6530,7 +5771,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -6542,7 +5783,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -6554,7 +5795,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -6566,7 +5807,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -6578,7 +5819,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -6590,7 +5831,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -6602,7 +5843,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListIntegratedServicesReply); i { case 0: return &v.state @@ -6614,7 +5855,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6627,21 +5868,13 @@ func file_protos_o2control_proto_init() { } } } - file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), - } - file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, - NumEnums: 5, - NumMessages: 85, + NumEnums: 4, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 4fbe78de0..a28945630 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -138,6 +138,8 @@ type Ev_EnvironmentEvent struct { CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` + Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` + TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` } func (x *Ev_EnvironmentEvent) Reset() { @@ -207,6 +209,20 @@ func (x *Ev_EnvironmentEvent) GetMessage() string { return "" } +func (x *Ev_EnvironmentEvent) GetTransition() string { + if x != nil { + return x.Transition + } + return "" +} + +func (x *Ev_EnvironmentEvent) GetTransitionStep() string { + if x != nil { + return x.TransitionStep + } + return "" +} + type Ev_TaskEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -370,7 +386,7 @@ type Event struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // Types that are assignable to Payload: // // *Event_EnvironmentEvent @@ -413,11 +429,11 @@ func (*Event) Descriptor() ([]byte, []int) { return file_protos_events_proto_rawDescGZIP(), []int{5} } -func (x *Event) GetTimestamp() string { +func (x *Event) GetTimestamp() int64 { if x != nil { return x.Timestamp } - return "" + return 0 } func (m *Event) GetPayload() isEvent_Payload { @@ -506,7 +522,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, @@ -517,56 +533,61 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, - 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6c, 0x0a, 0x0c, - 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9f, 0x03, 0x0a, 0x05, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, - 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, - 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5d, 0x0a, 0x15, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, - 0x00, 0x52, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, - 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, - 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, - 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, - 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, - 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, - 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, - 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, + 0xa2, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x9f, 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, + 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x5d, 0x0a, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, + 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, + 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/common/protos/protoutils.go b/common/protos/protoutils.go index 02f13520f..e0a009de5 100644 --- a/common/protos/protoutils.go +++ b/common/protos/protoutils.go @@ -25,13 +25,12 @@ package pb import ( - "fmt" "time" ) func WrapEvent(ce isEvent_Payload) *Event { return &Event{ - Timestamp: fmt.Sprintf("%d", time.Now().UnixMilli()), + Timestamp: time.Now().UnixMilli(), Payload: ce, } } diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index 3051ea736..a23cdcaa7 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -28,7 +28,7 @@ import ( "sync" "github.com/AliceO2Group/Control/common/event" - pb "github.com/AliceO2Group/Control/core/protos" + pb "github.com/AliceO2Group/Control/common/protos" ) type Subscription interface { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index c13fe8fe6..5b01e7a4e 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -30,6 +30,7 @@ package pb import ( + protos "github.com/AliceO2Group/Control/common/protos" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" reflect "reflect" @@ -43,57 +44,19 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -type StatusUpdate_Level int32 +// Symbols defined in public import of protos/events.proto. -const ( - StatusUpdate_DEBUG StatusUpdate_Level = 0 - StatusUpdate_INFO StatusUpdate_Level = 1 - StatusUpdate_WARNING StatusUpdate_Level = 2 - StatusUpdate_ERROR StatusUpdate_Level = 3 -) - -// Enum value maps for StatusUpdate_Level. -var ( - StatusUpdate_Level_name = map[int32]string{ - 0: "DEBUG", - 1: "INFO", - 2: "WARNING", - 3: "ERROR", - } - StatusUpdate_Level_value = map[string]int32{ - "DEBUG": 0, - "INFO": 1, - "WARNING": 2, - "ERROR": 3, - } -) - -func (x StatusUpdate_Level) Enum() *StatusUpdate_Level { - p := new(StatusUpdate_Level) - *p = x - return p -} - -func (x StatusUpdate_Level) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (StatusUpdate_Level) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[0].Descriptor() -} - -func (StatusUpdate_Level) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[0] -} - -func (x StatusUpdate_Level) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use StatusUpdate_Level.Descriptor instead. -func (StatusUpdate_Level) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6, 0} -} +type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat +type Ev_MetaEvent_FrameworkFailure = protos.Ev_MetaEvent_FrameworkFailure +type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent +type Ev_TaskEvent = protos.Ev_TaskEvent +type Ev_RoleEvent = protos.Ev_RoleEvent +type Event = protos.Event +type Event_EnvironmentEvent = protos.Event_EnvironmentEvent +type Event_TaskEvent = protos.Event_TaskEvent +type Event_RoleEvent = protos.Event_RoleEvent +type Event_FrameworkFailureEvent = protos.Event_FrameworkFailureEvent +type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type ControlEnvironmentRequest_Optype int32 @@ -140,11 +103,11 @@ func (x ControlEnvironmentRequest_Optype) String() string { } func (ControlEnvironmentRequest_Optype) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[1].Descriptor() + return file_protos_o2control_proto_enumTypes[0].Descriptor() } func (ControlEnvironmentRequest_Optype) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[1] + return &file_protos_o2control_proto_enumTypes[0] } func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { @@ -153,7 +116,7 @@ func (x ControlEnvironmentRequest_Optype) Number() protoreflect.EnumNumber { // Deprecated: Use ControlEnvironmentRequest_Optype.Descriptor instead. func (ControlEnvironmentRequest_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{15, 0} } type EnvironmentOperation_Optype int32 @@ -173,702 +136,153 @@ var ( } EnvironmentOperation_Optype_value = map[string]int32{ "NOOP": 0, - "REMOVE_ROLE": 3, - "ADD_ROLE": 4, - } -) - -func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { - p := new(EnvironmentOperation_Optype) - *p = x - return p -} - -func (x EnvironmentOperation_Optype) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[2].Descriptor() -} - -func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[2] -} - -func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. -func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26, 0} -} - -type VarSpecMessage_UiWidget int32 - -const ( - VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string - VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] - VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed - VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 - VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 - VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 - VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 -) - -// Enum value maps for VarSpecMessage_UiWidget. -var ( - VarSpecMessage_UiWidget_name = map[int32]string{ - 0: "editBox", - 1: "slider", - 2: "listBox", - 3: "dropDownBox", - 4: "comboBox", - 5: "radioButtonBox", - 6: "checkBox", - } - VarSpecMessage_UiWidget_value = map[string]int32{ - "editBox": 0, - "slider": 1, - "listBox": 2, - "dropDownBox": 3, - "comboBox": 4, - "radioButtonBox": 5, - "checkBox": 6, - } -) - -func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { - p := new(VarSpecMessage_UiWidget) - *p = x - return p -} - -func (x VarSpecMessage_UiWidget) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[3].Descriptor() -} - -func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[3] -} - -func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. -func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52, 0} -} - -type VarSpecMessage_Type int32 - -const ( - VarSpecMessage_string VarSpecMessage_Type = 0 - VarSpecMessage_number VarSpecMessage_Type = 1 - VarSpecMessage_bool VarSpecMessage_Type = 2 - VarSpecMessage_list VarSpecMessage_Type = 3 - VarSpecMessage_map VarSpecMessage_Type = 4 -) - -// Enum value maps for VarSpecMessage_Type. -var ( - VarSpecMessage_Type_name = map[int32]string{ - 0: "string", - 1: "number", - 2: "bool", - 3: "list", - 4: "map", - } - VarSpecMessage_Type_value = map[string]int32{ - "string": 0, - "number": 1, - "bool": 2, - "list": 3, - "map": 4, - } -) - -func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { - p := new(VarSpecMessage_Type) - *p = x - return p -} - -func (x VarSpecMessage_Type) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { - return file_protos_o2control_proto_enumTypes[4].Descriptor() -} - -func (VarSpecMessage_Type) Type() protoreflect.EnumType { - return &file_protos_o2control_proto_enumTypes[4] -} - -func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use VarSpecMessage_Type.Descriptor instead. -func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52, 1} -} - -type Event_MesosHeartbeat struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Event_MesosHeartbeat) Reset() { - *x = Event_MesosHeartbeat{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Event_MesosHeartbeat) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Event_MesosHeartbeat) ProtoMessage() {} - -func (x *Event_MesosHeartbeat) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Event_MesosHeartbeat.ProtoReflect.Descriptor instead. -func (*Event_MesosHeartbeat) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{0} -} - -type Ev_EnvironmentEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` -} - -func (x *Ev_EnvironmentEvent) Reset() { - *x = Ev_EnvironmentEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_EnvironmentEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_EnvironmentEvent) ProtoMessage() {} - -func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. -func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{1} -} - -func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { - if x != nil { - return x.CurrentRunNumber - } - return 0 -} - -func (x *Ev_EnvironmentEvent) GetError() string { - if x != nil { - return x.Error - } - return "" -} - -func (x *Ev_EnvironmentEvent) GetMessage() string { - if x != nil { - return x.Message - } - return "" -} - -type Ev_TaskEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` -} - -func (x *Ev_TaskEvent) Reset() { - *x = Ev_TaskEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_TaskEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_TaskEvent) ProtoMessage() {} - -func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. -func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{2} -} - -func (x *Ev_TaskEvent) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Ev_TaskEvent) GetTaskid() string { - if x != nil { - return x.Taskid - } - return "" -} - -func (x *Ev_TaskEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_TaskEvent) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *Ev_TaskEvent) GetHostname() string { - if x != nil { - return x.Hostname - } - return "" -} - -func (x *Ev_TaskEvent) GetClassName() string { - if x != nil { - return x.ClassName - } - return "" -} - -type Ev_RoleEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` -} - -func (x *Ev_RoleEvent) Reset() { - *x = Ev_RoleEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Ev_RoleEvent) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Ev_RoleEvent) ProtoMessage() {} - -func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. -func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{3} -} - -func (x *Ev_RoleEvent) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Ev_RoleEvent) GetStatus() string { - if x != nil { - return x.Status - } - return "" -} - -func (x *Ev_RoleEvent) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *Ev_RoleEvent) GetRolePath() string { - if x != nil { - return x.RolePath - } - return "" -} - -// ////////////////////////////////////// -// Global status -// ////////////////////////////////////// -type StatusRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *StatusRequest) Reset() { - *x = StatusRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusRequest) ProtoMessage() {} - -func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. -func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{4} -} - -type StatusReply struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - State string `protobuf:"bytes,1,opt,name=state,proto3" json:"state,omitempty"` - StatusUpdates []*StatusUpdate `protobuf:"bytes,2,rep,name=statusUpdates,proto3" json:"statusUpdates,omitempty"` -} - -func (x *StatusReply) Reset() { - *x = StatusReply{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *StatusReply) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusReply) ProtoMessage() {} - -func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. -func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{5} -} - -func (x *StatusReply) GetState() string { - if x != nil { - return x.State - } - return "" -} - -func (x *StatusReply) GetStatusUpdates() []*StatusUpdate { - if x != nil { - return x.StatusUpdates - } - return nil -} - -type StatusUpdate struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Level StatusUpdate_Level `protobuf:"varint,1,opt,name=level,proto3,enum=o2control.StatusUpdate_Level" json:"level,omitempty"` - // Types that are assignable to Event: - // - // *StatusUpdate_MesosHeartbeat - Event isStatusUpdate_Event `protobuf_oneof:"Event"` -} - -func (x *StatusUpdate) Reset() { - *x = StatusUpdate{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + "REMOVE_ROLE": 3, + "ADD_ROLE": 4, } -} - -func (x *StatusUpdate) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*StatusUpdate) ProtoMessage() {} +) -func (x *StatusUpdate) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) +func (x EnvironmentOperation_Optype) Enum() *EnvironmentOperation_Optype { + p := new(EnvironmentOperation_Optype) + *p = x + return p } -// Deprecated: Use StatusUpdate.ProtoReflect.Descriptor instead. -func (*StatusUpdate) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{6} +func (x EnvironmentOperation_Optype) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *StatusUpdate) GetLevel() StatusUpdate_Level { - if x != nil { - return x.Level - } - return StatusUpdate_DEBUG +func (EnvironmentOperation_Optype) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[1].Descriptor() } -func (m *StatusUpdate) GetEvent() isStatusUpdate_Event { - if m != nil { - return m.Event - } - return nil +func (EnvironmentOperation_Optype) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[1] } -func (x *StatusUpdate) GetMesosHeartbeat() *Event_MesosHeartbeat { - if x, ok := x.GetEvent().(*StatusUpdate_MesosHeartbeat); ok { - return x.MesosHeartbeat - } - return nil +func (x EnvironmentOperation_Optype) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -type isStatusUpdate_Event interface { - isStatusUpdate_Event() +// Deprecated: Use EnvironmentOperation_Optype.Descriptor instead. +func (EnvironmentOperation_Optype) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{18, 0} } -type StatusUpdate_MesosHeartbeat struct { - MesosHeartbeat *Event_MesosHeartbeat `protobuf:"bytes,2,opt,name=mesosHeartbeat,proto3,oneof"` //TODO add other events here and in events.proto -} +type VarSpecMessage_UiWidget int32 -func (*StatusUpdate_MesosHeartbeat) isStatusUpdate_Event() {} +const ( + VarSpecMessage_editBox VarSpecMessage_UiWidget = 0 // plain string input line, can accept types number (like a spinBox) and string + VarSpecMessage_slider VarSpecMessage_UiWidget = 1 // input widget exclusively for numbers, range allowedValues[0]-[1] + VarSpecMessage_listBox VarSpecMessage_UiWidget = 2 // displays a list of items, can accept types number, string or list; if number/string ==> single selection, otherwise multiple selection allowed + VarSpecMessage_dropDownBox VarSpecMessage_UiWidget = 3 + VarSpecMessage_comboBox VarSpecMessage_UiWidget = 4 + VarSpecMessage_radioButtonBox VarSpecMessage_UiWidget = 5 + VarSpecMessage_checkBox VarSpecMessage_UiWidget = 6 +) -type Event struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// Enum value maps for VarSpecMessage_UiWidget. +var ( + VarSpecMessage_UiWidget_name = map[int32]string{ + 0: "editBox", + 1: "slider", + 2: "listBox", + 3: "dropDownBox", + 4: "comboBox", + 5: "radioButtonBox", + 6: "checkBox", + } + VarSpecMessage_UiWidget_value = map[string]int32{ + "editBox": 0, + "slider": 1, + "listBox": 2, + "dropDownBox": 3, + "comboBox": 4, + "radioButtonBox": 5, + "checkBox": 6, + } +) - Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - // Types that are assignable to Payload: - // - // *Event_EnvironmentEvent - // *Event_TaskEvent - // *Event_RoleEvent - Payload isEvent_Payload `protobuf_oneof:"Payload"` +func (x VarSpecMessage_UiWidget) Enum() *VarSpecMessage_UiWidget { + p := new(VarSpecMessage_UiWidget) + *p = x + return p } -func (x *Event) Reset() { - *x = Event{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x VarSpecMessage_UiWidget) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -func (x *Event) String() string { - return protoimpl.X.MessageStringOf(x) +func (VarSpecMessage_UiWidget) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[2].Descriptor() } -func (*Event) ProtoMessage() {} - -func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) +func (VarSpecMessage_UiWidget) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[2] } -// Deprecated: Use Event.ProtoReflect.Descriptor instead. -func (*Event) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{7} +func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) } -func (x *Event) GetTimestamp() string { - if x != nil { - return x.Timestamp - } - return "" +// Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. +func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44, 0} } -func (m *Event) GetPayload() isEvent_Payload { - if m != nil { - return m.Payload - } - return nil -} +type VarSpecMessage_Type int32 -func (x *Event) GetEnvironmentEvent() *Ev_EnvironmentEvent { - if x, ok := x.GetPayload().(*Event_EnvironmentEvent); ok { - return x.EnvironmentEvent - } - return nil -} +const ( + VarSpecMessage_string VarSpecMessage_Type = 0 + VarSpecMessage_number VarSpecMessage_Type = 1 + VarSpecMessage_bool VarSpecMessage_Type = 2 + VarSpecMessage_list VarSpecMessage_Type = 3 + VarSpecMessage_map VarSpecMessage_Type = 4 +) -func (x *Event) GetTaskEvent() *Ev_TaskEvent { - if x, ok := x.GetPayload().(*Event_TaskEvent); ok { - return x.TaskEvent +// Enum value maps for VarSpecMessage_Type. +var ( + VarSpecMessage_Type_name = map[int32]string{ + 0: "string", + 1: "number", + 2: "bool", + 3: "list", + 4: "map", } - return nil -} - -func (x *Event) GetRoleEvent() *Ev_RoleEvent { - if x, ok := x.GetPayload().(*Event_RoleEvent); ok { - return x.RoleEvent + VarSpecMessage_Type_value = map[string]int32{ + "string": 0, + "number": 1, + "bool": 2, + "list": 3, + "map": 4, } - return nil -} +) -type isEvent_Payload interface { - isEvent_Payload() +func (x VarSpecMessage_Type) Enum() *VarSpecMessage_Type { + p := new(VarSpecMessage_Type) + *p = x + return p } -type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` +func (x VarSpecMessage_Type) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) } -type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` +func (VarSpecMessage_Type) Descriptor() protoreflect.EnumDescriptor { + return file_protos_o2control_proto_enumTypes[3].Descriptor() } -type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` +func (VarSpecMessage_Type) Type() protoreflect.EnumType { + return &file_protos_o2control_proto_enumTypes[3] } -func (*Event_EnvironmentEvent) isEvent_Payload() {} - -func (*Event_TaskEvent) isEvent_Payload() {} +func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} -func (*Event_RoleEvent) isEvent_Payload() {} +// Deprecated: Use VarSpecMessage_Type.Descriptor instead. +func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { + return file_protos_o2control_proto_rawDescGZIP(), []int{44, 1} +} type SubscribeRequest struct { state protoimpl.MessageState @@ -881,7 +295,7 @@ type SubscribeRequest struct { func (x *SubscribeRequest) Reset() { *x = SubscribeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[8] + mi := &file_protos_o2control_proto_msgTypes[0] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -894,7 +308,7 @@ func (x *SubscribeRequest) String() string { func (*SubscribeRequest) ProtoMessage() {} func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[8] + mi := &file_protos_o2control_proto_msgTypes[0] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -907,7 +321,7 @@ func (x *SubscribeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeRequest.ProtoReflect.Descriptor instead. func (*SubscribeRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{8} + return file_protos_o2control_proto_rawDescGZIP(), []int{0} } func (x *SubscribeRequest) GetId() string { @@ -929,7 +343,7 @@ type GetFrameworkInfoRequest struct { func (x *GetFrameworkInfoRequest) Reset() { *x = GetFrameworkInfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[9] + mi := &file_protos_o2control_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -942,7 +356,7 @@ func (x *GetFrameworkInfoRequest) String() string { func (*GetFrameworkInfoRequest) ProtoMessage() {} func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[9] + mi := &file_protos_o2control_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -955,7 +369,7 @@ func (x *GetFrameworkInfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoRequest.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{9} + return file_protos_o2control_proto_rawDescGZIP(), []int{1} } type Version struct { @@ -974,7 +388,7 @@ type Version struct { func (x *Version) Reset() { *x = Version{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -987,7 +401,7 @@ func (x *Version) String() string { func (*Version) ProtoMessage() {} func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[10] + mi := &file_protos_o2control_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1000,7 +414,7 @@ func (x *Version) ProtoReflect() protoreflect.Message { // Deprecated: Use Version.ProtoReflect.Descriptor instead. func (*Version) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{10} + return file_protos_o2control_proto_rawDescGZIP(), []int{2} } func (x *Version) GetMajor() int32 { @@ -1066,7 +480,7 @@ type GetFrameworkInfoReply struct { func (x *GetFrameworkInfoReply) Reset() { *x = GetFrameworkInfoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1079,7 +493,7 @@ func (x *GetFrameworkInfoReply) String() string { func (*GetFrameworkInfoReply) ProtoMessage() {} func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[11] + mi := &file_protos_o2control_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1092,7 +506,7 @@ func (x *GetFrameworkInfoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetFrameworkInfoReply.ProtoReflect.Descriptor instead. func (*GetFrameworkInfoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{11} + return file_protos_o2control_proto_rawDescGZIP(), []int{3} } func (x *GetFrameworkInfoReply) GetFrameworkId() string { @@ -1184,7 +598,7 @@ type TeardownRequest struct { func (x *TeardownRequest) Reset() { *x = TeardownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1197,7 +611,7 @@ func (x *TeardownRequest) String() string { func (*TeardownRequest) ProtoMessage() {} func (x *TeardownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[12] + mi := &file_protos_o2control_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1210,7 +624,7 @@ func (x *TeardownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownRequest.ProtoReflect.Descriptor instead. func (*TeardownRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{12} + return file_protos_o2control_proto_rawDescGZIP(), []int{4} } func (x *TeardownRequest) GetReason() string { @@ -1229,7 +643,7 @@ type TeardownReply struct { func (x *TeardownReply) Reset() { *x = TeardownReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1242,7 +656,7 @@ func (x *TeardownReply) String() string { func (*TeardownReply) ProtoMessage() {} func (x *TeardownReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[13] + mi := &file_protos_o2control_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1255,7 +669,7 @@ func (x *TeardownReply) ProtoReflect() protoreflect.Message { // Deprecated: Use TeardownReply.ProtoReflect.Descriptor instead. func (*TeardownReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{13} + return file_protos_o2control_proto_rawDescGZIP(), []int{5} } // ////////////////////////////////////// @@ -1273,7 +687,7 @@ type GetEnvironmentsRequest struct { func (x *GetEnvironmentsRequest) Reset() { *x = GetEnvironmentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1286,7 +700,7 @@ func (x *GetEnvironmentsRequest) String() string { func (*GetEnvironmentsRequest) ProtoMessage() {} func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[14] + mi := &file_protos_o2control_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1299,7 +713,7 @@ func (x *GetEnvironmentsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentsRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{14} + return file_protos_o2control_proto_rawDescGZIP(), []int{6} } func (x *GetEnvironmentsRequest) GetShowAll() bool { @@ -1328,7 +742,7 @@ type GetEnvironmentsReply struct { func (x *GetEnvironmentsReply) Reset() { *x = GetEnvironmentsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1341,7 +755,7 @@ func (x *GetEnvironmentsReply) String() string { func (*GetEnvironmentsReply) ProtoMessage() {} func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[15] + mi := &file_protos_o2control_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1354,7 +768,7 @@ func (x *GetEnvironmentsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentsReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{15} + return file_protos_o2control_proto_rawDescGZIP(), []int{7} } func (x *GetEnvironmentsReply) GetFrameworkId() string { @@ -1399,7 +813,7 @@ type EnvironmentInfo struct { func (x *EnvironmentInfo) Reset() { *x = EnvironmentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1412,7 +826,7 @@ func (x *EnvironmentInfo) String() string { func (*EnvironmentInfo) ProtoMessage() {} func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[16] + mi := &file_protos_o2control_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1425,7 +839,7 @@ func (x *EnvironmentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentInfo.ProtoReflect.Descriptor instead. func (*EnvironmentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{16} + return file_protos_o2control_proto_rawDescGZIP(), []int{8} } func (x *EnvironmentInfo) GetId() string { @@ -1567,7 +981,7 @@ type NewEnvironmentRequest struct { func (x *NewEnvironmentRequest) Reset() { *x = NewEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1580,7 +994,7 @@ func (x *NewEnvironmentRequest) String() string { func (*NewEnvironmentRequest) ProtoMessage() {} func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[17] + mi := &file_protos_o2control_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1593,7 +1007,7 @@ func (x *NewEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewEnvironmentRequest.ProtoReflect.Descriptor instead. func (*NewEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{17} + return file_protos_o2control_proto_rawDescGZIP(), []int{9} } func (x *NewEnvironmentRequest) GetWorkflowTemplate() string { @@ -1629,7 +1043,7 @@ type NewEnvironmentReply struct { func (x *NewEnvironmentReply) Reset() { *x = NewEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1642,7 +1056,7 @@ func (x *NewEnvironmentReply) String() string { func (*NewEnvironmentReply) ProtoMessage() {} func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[18] + mi := &file_protos_o2control_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1655,7 +1069,7 @@ func (x *NewEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use NewEnvironmentReply.ProtoReflect.Descriptor instead. func (*NewEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{18} + return file_protos_o2control_proto_rawDescGZIP(), []int{10} } func (x *NewEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1685,7 +1099,7 @@ type NewAutoEnvironmentRequest struct { func (x *NewAutoEnvironmentRequest) Reset() { *x = NewAutoEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1112,7 @@ func (x *NewAutoEnvironmentRequest) String() string { func (*NewAutoEnvironmentRequest) ProtoMessage() {} func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[19] + mi := &file_protos_o2control_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1125,7 @@ func (x *NewAutoEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewAutoEnvironmentRequest.ProtoReflect.Descriptor instead. func (*NewAutoEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{19} + return file_protos_o2control_proto_rawDescGZIP(), []int{11} } func (x *NewAutoEnvironmentRequest) GetWorkflowTemplate() string { @@ -1744,7 +1158,7 @@ type NewAutoEnvironmentReply struct { func (x *NewAutoEnvironmentReply) Reset() { *x = NewAutoEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1757,7 +1171,7 @@ func (x *NewAutoEnvironmentReply) String() string { func (*NewAutoEnvironmentReply) ProtoMessage() {} func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[20] + mi := &file_protos_o2control_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1770,7 +1184,7 @@ func (x *NewAutoEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use NewAutoEnvironmentReply.ProtoReflect.Descriptor instead. func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{20} + return file_protos_o2control_proto_rawDescGZIP(), []int{12} } type GetEnvironmentRequest struct { @@ -1785,7 +1199,7 @@ type GetEnvironmentRequest struct { func (x *GetEnvironmentRequest) Reset() { *x = GetEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1798,7 +1212,7 @@ func (x *GetEnvironmentRequest) String() string { func (*GetEnvironmentRequest) ProtoMessage() {} func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[21] + mi := &file_protos_o2control_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1811,7 +1225,7 @@ func (x *GetEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{21} + return file_protos_o2control_proto_rawDescGZIP(), []int{13} } func (x *GetEnvironmentRequest) GetId() string { @@ -1841,7 +1255,7 @@ type GetEnvironmentReply struct { func (x *GetEnvironmentReply) Reset() { *x = GetEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1854,7 +1268,7 @@ func (x *GetEnvironmentReply) String() string { func (*GetEnvironmentReply) ProtoMessage() {} func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[22] + mi := &file_protos_o2control_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1867,7 +1281,7 @@ func (x *GetEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{22} + return file_protos_o2control_proto_rawDescGZIP(), []int{14} } func (x *GetEnvironmentReply) GetEnvironment() *EnvironmentInfo { @@ -1903,7 +1317,7 @@ type ControlEnvironmentRequest struct { func (x *ControlEnvironmentRequest) Reset() { *x = ControlEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1916,7 +1330,7 @@ func (x *ControlEnvironmentRequest) String() string { func (*ControlEnvironmentRequest) ProtoMessage() {} func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[23] + mi := &file_protos_o2control_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1929,7 +1343,7 @@ func (x *ControlEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ControlEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{23} + return file_protos_o2control_proto_rawDescGZIP(), []int{15} } func (x *ControlEnvironmentRequest) GetId() string { @@ -1963,7 +1377,7 @@ type ControlEnvironmentReply struct { func (x *ControlEnvironmentReply) Reset() { *x = ControlEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1976,7 +1390,7 @@ func (x *ControlEnvironmentReply) String() string { func (*ControlEnvironmentReply) ProtoMessage() {} func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[24] + mi := &file_protos_o2control_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1989,7 +1403,7 @@ func (x *ControlEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlEnvironmentReply.ProtoReflect.Descriptor instead. func (*ControlEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{24} + return file_protos_o2control_proto_rawDescGZIP(), []int{16} } func (x *ControlEnvironmentReply) GetId() string { @@ -2047,7 +1461,7 @@ type ModifyEnvironmentRequest struct { func (x *ModifyEnvironmentRequest) Reset() { *x = ModifyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2060,7 +1474,7 @@ func (x *ModifyEnvironmentRequest) String() string { func (*ModifyEnvironmentRequest) ProtoMessage() {} func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[25] + mi := &file_protos_o2control_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2073,7 +1487,7 @@ func (x *ModifyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{25} + return file_protos_o2control_proto_rawDescGZIP(), []int{17} } func (x *ModifyEnvironmentRequest) GetId() string { @@ -2109,7 +1523,7 @@ type EnvironmentOperation struct { func (x *EnvironmentOperation) Reset() { *x = EnvironmentOperation{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2122,7 +1536,7 @@ func (x *EnvironmentOperation) String() string { func (*EnvironmentOperation) ProtoMessage() {} func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[26] + mi := &file_protos_o2control_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2135,7 +1549,7 @@ func (x *EnvironmentOperation) ProtoReflect() protoreflect.Message { // Deprecated: Use EnvironmentOperation.ProtoReflect.Descriptor instead. func (*EnvironmentOperation) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{26} + return file_protos_o2control_proto_rawDescGZIP(), []int{18} } func (x *EnvironmentOperation) GetType() EnvironmentOperation_Optype { @@ -2165,7 +1579,7 @@ type ModifyEnvironmentReply struct { func (x *ModifyEnvironmentReply) Reset() { *x = ModifyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2178,7 +1592,7 @@ func (x *ModifyEnvironmentReply) String() string { func (*ModifyEnvironmentReply) ProtoMessage() {} func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[27] + mi := &file_protos_o2control_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2191,7 +1605,7 @@ func (x *ModifyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ModifyEnvironmentReply.ProtoReflect.Descriptor instead. func (*ModifyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{27} + return file_protos_o2control_proto_rawDescGZIP(), []int{19} } func (x *ModifyEnvironmentReply) GetFailedOperations() []*EnvironmentOperation { @@ -2229,7 +1643,7 @@ type DestroyEnvironmentRequest struct { func (x *DestroyEnvironmentRequest) Reset() { *x = DestroyEnvironmentRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2242,7 +1656,7 @@ func (x *DestroyEnvironmentRequest) String() string { func (*DestroyEnvironmentRequest) ProtoMessage() {} func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[28] + mi := &file_protos_o2control_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2255,7 +1669,7 @@ func (x *DestroyEnvironmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentRequest.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{28} + return file_protos_o2control_proto_rawDescGZIP(), []int{20} } func (x *DestroyEnvironmentRequest) GetId() string { @@ -2297,7 +1711,7 @@ type DestroyEnvironmentReply struct { func (x *DestroyEnvironmentReply) Reset() { *x = DestroyEnvironmentReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2310,7 +1724,7 @@ func (x *DestroyEnvironmentReply) String() string { func (*DestroyEnvironmentReply) ProtoMessage() {} func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[29] + mi := &file_protos_o2control_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2323,7 +1737,7 @@ func (x *DestroyEnvironmentReply) ProtoReflect() protoreflect.Message { // Deprecated: Use DestroyEnvironmentReply.ProtoReflect.Descriptor instead. func (*DestroyEnvironmentReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{29} + return file_protos_o2control_proto_rawDescGZIP(), []int{21} } func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { @@ -2344,7 +1758,7 @@ type GetActiveDetectorsReply struct { func (x *GetActiveDetectorsReply) Reset() { *x = GetActiveDetectorsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2357,7 +1771,7 @@ func (x *GetActiveDetectorsReply) String() string { func (*GetActiveDetectorsReply) ProtoMessage() {} func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[30] + mi := &file_protos_o2control_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2370,7 +1784,7 @@ func (x *GetActiveDetectorsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetActiveDetectorsReply.ProtoReflect.Descriptor instead. func (*GetActiveDetectorsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{30} + return file_protos_o2control_proto_rawDescGZIP(), []int{22} } func (x *GetActiveDetectorsReply) GetDetectors() []string { @@ -2391,7 +1805,7 @@ type GetAvailableDetectorsReply struct { func (x *GetAvailableDetectorsReply) Reset() { *x = GetAvailableDetectorsReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2404,7 +1818,7 @@ func (x *GetAvailableDetectorsReply) String() string { func (*GetAvailableDetectorsReply) ProtoMessage() {} func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[31] + mi := &file_protos_o2control_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2417,7 +1831,7 @@ func (x *GetAvailableDetectorsReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetAvailableDetectorsReply.ProtoReflect.Descriptor instead. func (*GetAvailableDetectorsReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{31} + return file_protos_o2control_proto_rawDescGZIP(), []int{23} } func (x *GetAvailableDetectorsReply) GetDetectors() []string { @@ -2444,7 +1858,7 @@ type SetEnvironmentPropertiesRequest struct { func (x *SetEnvironmentPropertiesRequest) Reset() { *x = SetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2457,7 +1871,7 @@ func (x *SetEnvironmentPropertiesRequest) String() string { func (*SetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[32] + mi := &file_protos_o2control_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2470,7 +1884,7 @@ func (x *SetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{32} + return file_protos_o2control_proto_rawDescGZIP(), []int{24} } func (x *SetEnvironmentPropertiesRequest) GetId() string { @@ -2496,7 +1910,7 @@ type SetEnvironmentPropertiesReply struct { func (x *SetEnvironmentPropertiesReply) Reset() { *x = SetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2509,7 +1923,7 @@ func (x *SetEnvironmentPropertiesReply) String() string { func (*SetEnvironmentPropertiesReply) ProtoMessage() {} func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[33] + mi := &file_protos_o2control_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2522,7 +1936,7 @@ func (x *SetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*SetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{33} + return file_protos_o2control_proto_rawDescGZIP(), []int{25} } type GetEnvironmentPropertiesRequest struct { @@ -2541,7 +1955,7 @@ type GetEnvironmentPropertiesRequest struct { func (x *GetEnvironmentPropertiesRequest) Reset() { *x = GetEnvironmentPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2554,7 +1968,7 @@ func (x *GetEnvironmentPropertiesRequest) String() string { func (*GetEnvironmentPropertiesRequest) ProtoMessage() {} func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] + mi := &file_protos_o2control_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2567,7 +1981,7 @@ func (x *GetEnvironmentPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesRequest.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} + return file_protos_o2control_proto_rawDescGZIP(), []int{26} } func (x *GetEnvironmentPropertiesRequest) GetId() string { @@ -2602,7 +2016,7 @@ type GetEnvironmentPropertiesReply struct { func (x *GetEnvironmentPropertiesReply) Reset() { *x = GetEnvironmentPropertiesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2615,7 +2029,7 @@ func (x *GetEnvironmentPropertiesReply) String() string { func (*GetEnvironmentPropertiesReply) ProtoMessage() {} func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2628,7 +2042,7 @@ func (x *GetEnvironmentPropertiesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnvironmentPropertiesReply.ProtoReflect.Descriptor instead. func (*GetEnvironmentPropertiesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{27} } func (x *GetEnvironmentPropertiesReply) GetProperties() map[string]string { @@ -2661,7 +2075,7 @@ type ShortTaskInfo struct { func (x *ShortTaskInfo) Reset() { *x = ShortTaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2674,7 +2088,7 @@ func (x *ShortTaskInfo) String() string { func (*ShortTaskInfo) ProtoMessage() {} func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2687,7 +2101,7 @@ func (x *ShortTaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ShortTaskInfo.ProtoReflect.Descriptor instead. func (*ShortTaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{28} } func (x *ShortTaskInfo) GetName() string { @@ -2774,7 +2188,7 @@ type TaskDeploymentInfo struct { func (x *TaskDeploymentInfo) Reset() { *x = TaskDeploymentInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2787,7 +2201,7 @@ func (x *TaskDeploymentInfo) String() string { func (*TaskDeploymentInfo) ProtoMessage() {} func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2800,7 +2214,7 @@ func (x *TaskDeploymentInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskDeploymentInfo.ProtoReflect.Descriptor instead. func (*TaskDeploymentInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{29} } func (x *TaskDeploymentInfo) GetHostname() string { @@ -2840,7 +2254,7 @@ type GetTasksRequest struct { func (x *GetTasksRequest) Reset() { *x = GetTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2267,7 @@ func (x *GetTasksRequest) String() string { func (*GetTasksRequest) ProtoMessage() {} func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2280,7 @@ func (x *GetTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksRequest.ProtoReflect.Descriptor instead. func (*GetTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{30} } type GetTasksReply struct { @@ -2880,7 +2294,7 @@ type GetTasksReply struct { func (x *GetTasksReply) Reset() { *x = GetTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2893,7 +2307,7 @@ func (x *GetTasksReply) String() string { func (*GetTasksReply) ProtoMessage() {} func (x *GetTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2906,7 +2320,7 @@ func (x *GetTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTasksReply.ProtoReflect.Descriptor instead. func (*GetTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{31} } func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { @@ -2927,7 +2341,7 @@ type GetTaskRequest struct { func (x *GetTaskRequest) Reset() { *x = GetTaskRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2940,7 +2354,7 @@ func (x *GetTaskRequest) String() string { func (*GetTaskRequest) ProtoMessage() {} func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2953,7 +2367,7 @@ func (x *GetTaskRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskRequest.ProtoReflect.Descriptor instead. func (*GetTaskRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{32} } func (x *GetTaskRequest) GetTaskId() string { @@ -2974,7 +2388,7 @@ type GetTaskReply struct { func (x *GetTaskReply) Reset() { *x = GetTaskReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2987,7 +2401,7 @@ func (x *GetTaskReply) String() string { func (*GetTaskReply) ProtoMessage() {} func (x *GetTaskReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3000,7 +2414,7 @@ func (x *GetTaskReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetTaskReply.ProtoReflect.Descriptor instead. func (*GetTaskReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{33} } func (x *GetTaskReply) GetTask() *TaskInfo { @@ -3022,7 +2436,7 @@ type TaskClassInfo struct { func (x *TaskClassInfo) Reset() { *x = TaskClassInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3035,7 +2449,7 @@ func (x *TaskClassInfo) String() string { func (*TaskClassInfo) ProtoMessage() {} func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3048,7 +2462,7 @@ func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *TaskClassInfo) GetName() string { @@ -3080,7 +2494,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3093,7 +2507,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3106,7 +2520,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *CommandInfo) GetEnv() []string { @@ -3157,7 +2571,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3170,7 +2584,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3183,7 +2597,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *ChannelInfo) GetName() string { @@ -3225,7 +2639,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3238,7 +2652,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3251,7 +2665,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -3321,7 +2735,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3334,7 +2748,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3347,7 +2761,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -3369,7 +2783,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3382,7 +2796,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3395,7 +2809,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -3427,7 +2841,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3440,7 +2854,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3453,7 +2867,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *GetRolesRequest) GetEnvId() string { @@ -3491,7 +2905,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3504,7 +2918,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3517,7 +2931,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *RoleInfo) GetName() string { @@ -3608,7 +3022,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3621,7 +3035,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3634,7 +3048,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3659,7 +3073,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3672,7 +3086,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3685,7 +3099,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3743,7 +3157,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3756,7 +3170,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3769,7 +3183,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3857,7 +3271,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3870,7 +3284,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3883,7 +3297,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3932,7 +3346,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3945,7 +3359,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3958,7 +3372,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3979,7 +3393,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3992,7 +3406,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4005,7 +3419,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -4029,7 +3443,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4042,7 +3456,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4055,7 +3469,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *RepoInfo) GetName() string { @@ -4098,7 +3512,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4111,7 +3525,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4124,7 +3538,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -4153,7 +3567,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4166,7 +3580,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4179,7 +3593,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *AddRepoRequest) GetName() string { @@ -4208,7 +3622,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4221,7 +3635,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4234,7 +3648,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -4262,7 +3676,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4275,7 +3689,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4288,7 +3702,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -4309,7 +3723,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +3736,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +3749,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -4356,7 +3770,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4369,7 +3783,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[62] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4382,7 +3796,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{62} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -4403,7 +3817,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4416,7 +3830,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[63] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4429,7 +3843,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{63} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -4450,7 +3864,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +3877,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[64] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4476,7 +3890,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{64} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -4498,7 +3912,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4511,7 +3925,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[65] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4524,7 +3938,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{65} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -4552,7 +3966,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4565,7 +3979,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[66] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4578,7 +3992,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{66} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4597,7 +4011,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4610,7 +4024,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[67] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4623,7 +4037,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{67} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } type ListIntegratedServicesReply struct { @@ -4637,7 +4051,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4650,7 +4064,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[68] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4663,7 +4077,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{68} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4688,7 +4102,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[69] + mi := &file_protos_o2control_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4701,7 +4115,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[69] + mi := &file_protos_o2control_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4714,7 +4128,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{69} + return file_protos_o2control_proto_rawDescGZIP(), []int{61} } func (x *IntegratedServiceInfo) GetName() string { @@ -4757,811 +4171,748 @@ var File_protos_o2control_proto protoreflect.FileDescriptor var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x16, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x09, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x22, 0x16, 0x0a, 0x14, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0xad, 0x01, 0x0a, 0x13, - 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0c, - 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x0f, - 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x62, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x49, 0x0a, 0x0e, 0x6d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x22, 0x34, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, - 0x05, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, - 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, - 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0xf0, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x4c, 0x0a, 0x10, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x74, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x37, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x61, - 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, 0x0a, 0x15, + 0x72, 0x6f, 0x6c, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x10, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x19, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x68, - 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x69, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, - 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, - 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, - 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, - 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, - 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, - 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa3, 0x01, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x6a, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x70, 0x61, 0x74, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x61, 0x73, 0x6b, 0x73, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2c, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x34, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x49, 0x6e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x13, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, + 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, + 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, - 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, + 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, - 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, - 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, - 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd4, 0x01, - 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, - 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, - 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, - 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, - 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, - 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, - 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, - 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, + 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, - 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, - 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, - 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, - 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, - 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, - 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, - 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, - 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, - 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, - 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, + 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, - 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, - 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, - 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, + 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, + 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, + 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, + 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, + 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, + 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, + 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, + 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, + 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, + 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, + 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, + 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, + 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, + 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, + 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, + 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, + 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, + 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, - 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, - 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, - 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, - 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, - 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, - 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, - 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, - 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, - 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, + 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, + 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, + 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, + 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, + 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, + 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, + 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, + 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, + 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, + 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, + 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, + 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, + 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, - 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, - 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, - 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, - 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xd8, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, - 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, + 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, + 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, + 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, + 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, + 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, + 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, + 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, + 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, - 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, + 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x43, 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, + 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, + 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5576,208 +4927,194 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { return file_protos_o2control_proto_rawDescData } -var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 85) +var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 4) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) var file_protos_o2control_proto_goTypes = []interface{}{ - (StatusUpdate_Level)(0), // 0: o2control.StatusUpdate.Level - (ControlEnvironmentRequest_Optype)(0), // 1: o2control.ControlEnvironmentRequest.Optype - (EnvironmentOperation_Optype)(0), // 2: o2control.EnvironmentOperation.Optype - (VarSpecMessage_UiWidget)(0), // 3: o2control.VarSpecMessage.UiWidget - (VarSpecMessage_Type)(0), // 4: o2control.VarSpecMessage.Type - (*Event_MesosHeartbeat)(nil), // 5: o2control.Event_MesosHeartbeat - (*Ev_EnvironmentEvent)(nil), // 6: o2control.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 7: o2control.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 8: o2control.Ev_RoleEvent - (*StatusRequest)(nil), // 9: o2control.StatusRequest - (*StatusReply)(nil), // 10: o2control.StatusReply - (*StatusUpdate)(nil), // 11: o2control.StatusUpdate - (*Event)(nil), // 12: o2control.Event - (*SubscribeRequest)(nil), // 13: o2control.SubscribeRequest - (*GetFrameworkInfoRequest)(nil), // 14: o2control.GetFrameworkInfoRequest - (*Version)(nil), // 15: o2control.Version - (*GetFrameworkInfoReply)(nil), // 16: o2control.GetFrameworkInfoReply - (*TeardownRequest)(nil), // 17: o2control.TeardownRequest - (*TeardownReply)(nil), // 18: o2control.TeardownReply - (*GetEnvironmentsRequest)(nil), // 19: o2control.GetEnvironmentsRequest - (*GetEnvironmentsReply)(nil), // 20: o2control.GetEnvironmentsReply - (*EnvironmentInfo)(nil), // 21: o2control.EnvironmentInfo - (*NewEnvironmentRequest)(nil), // 22: o2control.NewEnvironmentRequest - (*NewEnvironmentReply)(nil), // 23: o2control.NewEnvironmentReply - (*NewAutoEnvironmentRequest)(nil), // 24: o2control.NewAutoEnvironmentRequest - (*NewAutoEnvironmentReply)(nil), // 25: o2control.NewAutoEnvironmentReply - (*GetEnvironmentRequest)(nil), // 26: o2control.GetEnvironmentRequest - (*GetEnvironmentReply)(nil), // 27: o2control.GetEnvironmentReply - (*ControlEnvironmentRequest)(nil), // 28: o2control.ControlEnvironmentRequest - (*ControlEnvironmentReply)(nil), // 29: o2control.ControlEnvironmentReply - (*ModifyEnvironmentRequest)(nil), // 30: o2control.ModifyEnvironmentRequest - (*EnvironmentOperation)(nil), // 31: o2control.EnvironmentOperation - (*ModifyEnvironmentReply)(nil), // 32: o2control.ModifyEnvironmentReply - (*DestroyEnvironmentRequest)(nil), // 33: o2control.DestroyEnvironmentRequest - (*DestroyEnvironmentReply)(nil), // 34: o2control.DestroyEnvironmentReply - (*GetActiveDetectorsReply)(nil), // 35: o2control.GetActiveDetectorsReply - (*GetAvailableDetectorsReply)(nil), // 36: o2control.GetAvailableDetectorsReply - (*SetEnvironmentPropertiesRequest)(nil), // 37: o2control.SetEnvironmentPropertiesRequest - (*SetEnvironmentPropertiesReply)(nil), // 38: o2control.SetEnvironmentPropertiesReply - (*GetEnvironmentPropertiesRequest)(nil), // 39: o2control.GetEnvironmentPropertiesRequest - (*GetEnvironmentPropertiesReply)(nil), // 40: o2control.GetEnvironmentPropertiesReply - (*ShortTaskInfo)(nil), // 41: o2control.ShortTaskInfo - (*TaskDeploymentInfo)(nil), // 42: o2control.TaskDeploymentInfo - (*GetTasksRequest)(nil), // 43: o2control.GetTasksRequest - (*GetTasksReply)(nil), // 44: o2control.GetTasksReply - (*GetTaskRequest)(nil), // 45: o2control.GetTaskRequest - (*GetTaskReply)(nil), // 46: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 47: o2control.TaskClassInfo - (*CommandInfo)(nil), // 48: o2control.CommandInfo - (*ChannelInfo)(nil), // 49: o2control.ChannelInfo - (*TaskInfo)(nil), // 50: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 51: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 52: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 53: o2control.GetRolesRequest - (*RoleInfo)(nil), // 54: o2control.RoleInfo - (*GetRolesReply)(nil), // 55: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 56: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 57: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 58: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 59: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 60: o2control.ListReposRequest - (*RepoInfo)(nil), // 61: o2control.RepoInfo - (*ListReposReply)(nil), // 62: o2control.ListReposReply - (*AddRepoRequest)(nil), // 63: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 64: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 65: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 66: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 67: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 68: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 69: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 70: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 71: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 72: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 73: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 74: o2control.IntegratedServiceInfo - nil, // 75: o2control.EnvironmentInfo.DefaultsEntry - nil, // 76: o2control.EnvironmentInfo.VarsEntry - nil, // 77: o2control.EnvironmentInfo.UserVarsEntry - nil, // 78: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 79: o2control.NewEnvironmentRequest.VarsEntry - nil, // 80: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 81: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 82: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 83: o2control.TaskInfo.PropertiesEntry - nil, // 84: o2control.RoleInfo.DefaultsEntry - nil, // 85: o2control.RoleInfo.VarsEntry - nil, // 86: o2control.RoleInfo.UserVarsEntry - nil, // 87: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 88: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 89: o2control.ListIntegratedServicesReply.ServicesEntry + (ControlEnvironmentRequest_Optype)(0), // 0: o2control.ControlEnvironmentRequest.Optype + (EnvironmentOperation_Optype)(0), // 1: o2control.EnvironmentOperation.Optype + (VarSpecMessage_UiWidget)(0), // 2: o2control.VarSpecMessage.UiWidget + (VarSpecMessage_Type)(0), // 3: o2control.VarSpecMessage.Type + (*SubscribeRequest)(nil), // 4: o2control.SubscribeRequest + (*GetFrameworkInfoRequest)(nil), // 5: o2control.GetFrameworkInfoRequest + (*Version)(nil), // 6: o2control.Version + (*GetFrameworkInfoReply)(nil), // 7: o2control.GetFrameworkInfoReply + (*TeardownRequest)(nil), // 8: o2control.TeardownRequest + (*TeardownReply)(nil), // 9: o2control.TeardownReply + (*GetEnvironmentsRequest)(nil), // 10: o2control.GetEnvironmentsRequest + (*GetEnvironmentsReply)(nil), // 11: o2control.GetEnvironmentsReply + (*EnvironmentInfo)(nil), // 12: o2control.EnvironmentInfo + (*NewEnvironmentRequest)(nil), // 13: o2control.NewEnvironmentRequest + (*NewEnvironmentReply)(nil), // 14: o2control.NewEnvironmentReply + (*NewAutoEnvironmentRequest)(nil), // 15: o2control.NewAutoEnvironmentRequest + (*NewAutoEnvironmentReply)(nil), // 16: o2control.NewAutoEnvironmentReply + (*GetEnvironmentRequest)(nil), // 17: o2control.GetEnvironmentRequest + (*GetEnvironmentReply)(nil), // 18: o2control.GetEnvironmentReply + (*ControlEnvironmentRequest)(nil), // 19: o2control.ControlEnvironmentRequest + (*ControlEnvironmentReply)(nil), // 20: o2control.ControlEnvironmentReply + (*ModifyEnvironmentRequest)(nil), // 21: o2control.ModifyEnvironmentRequest + (*EnvironmentOperation)(nil), // 22: o2control.EnvironmentOperation + (*ModifyEnvironmentReply)(nil), // 23: o2control.ModifyEnvironmentReply + (*DestroyEnvironmentRequest)(nil), // 24: o2control.DestroyEnvironmentRequest + (*DestroyEnvironmentReply)(nil), // 25: o2control.DestroyEnvironmentReply + (*GetActiveDetectorsReply)(nil), // 26: o2control.GetActiveDetectorsReply + (*GetAvailableDetectorsReply)(nil), // 27: o2control.GetAvailableDetectorsReply + (*SetEnvironmentPropertiesRequest)(nil), // 28: o2control.SetEnvironmentPropertiesRequest + (*SetEnvironmentPropertiesReply)(nil), // 29: o2control.SetEnvironmentPropertiesReply + (*GetEnvironmentPropertiesRequest)(nil), // 30: o2control.GetEnvironmentPropertiesRequest + (*GetEnvironmentPropertiesReply)(nil), // 31: o2control.GetEnvironmentPropertiesReply + (*ShortTaskInfo)(nil), // 32: o2control.ShortTaskInfo + (*TaskDeploymentInfo)(nil), // 33: o2control.TaskDeploymentInfo + (*GetTasksRequest)(nil), // 34: o2control.GetTasksRequest + (*GetTasksReply)(nil), // 35: o2control.GetTasksReply + (*GetTaskRequest)(nil), // 36: o2control.GetTaskRequest + (*GetTaskReply)(nil), // 37: o2control.GetTaskReply + (*TaskClassInfo)(nil), // 38: o2control.TaskClassInfo + (*CommandInfo)(nil), // 39: o2control.CommandInfo + (*ChannelInfo)(nil), // 40: o2control.ChannelInfo + (*TaskInfo)(nil), // 41: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 42: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 43: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 44: o2control.GetRolesRequest + (*RoleInfo)(nil), // 45: o2control.RoleInfo + (*GetRolesReply)(nil), // 46: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 47: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 48: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 49: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 50: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 51: o2control.ListReposRequest + (*RepoInfo)(nil), // 52: o2control.RepoInfo + (*ListReposReply)(nil), // 53: o2control.ListReposReply + (*AddRepoRequest)(nil), // 54: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 55: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 56: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 57: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 58: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 59: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 60: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 61: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 62: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 63: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 64: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 65: o2control.IntegratedServiceInfo + nil, // 66: o2control.EnvironmentInfo.DefaultsEntry + nil, // 67: o2control.EnvironmentInfo.VarsEntry + nil, // 68: o2control.EnvironmentInfo.UserVarsEntry + nil, // 69: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 70: o2control.NewEnvironmentRequest.VarsEntry + nil, // 71: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 72: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 73: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 74: o2control.TaskInfo.PropertiesEntry + nil, // 75: o2control.RoleInfo.DefaultsEntry + nil, // 76: o2control.RoleInfo.VarsEntry + nil, // 77: o2control.RoleInfo.UserVarsEntry + nil, // 78: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 79: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 80: o2control.ListIntegratedServicesReply.ServicesEntry + (*protos.Event)(nil), // 81: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ - 11, // 0: o2control.StatusReply.statusUpdates:type_name -> o2control.StatusUpdate - 0, // 1: o2control.StatusUpdate.level:type_name -> o2control.StatusUpdate.Level - 5, // 2: o2control.StatusUpdate.mesosHeartbeat:type_name -> o2control.Event_MesosHeartbeat - 6, // 3: o2control.Event.environmentEvent:type_name -> o2control.Ev_EnvironmentEvent - 7, // 4: o2control.Event.taskEvent:type_name -> o2control.Ev_TaskEvent - 8, // 5: o2control.Event.roleEvent:type_name -> o2control.Ev_RoleEvent - 15, // 6: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version - 21, // 7: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo - 41, // 8: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 75, // 9: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 76, // 10: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 77, // 11: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 78, // 12: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 79, // 13: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 21, // 14: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 80, // 15: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 21, // 16: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 54, // 17: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 1, // 18: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 31, // 19: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 2, // 20: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 31, // 21: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 52, // 22: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 81, // 23: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 82, // 24: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 42, // 25: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 41, // 26: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 50, // 27: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 41, // 28: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 47, // 29: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 49, // 30: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 49, // 31: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 48, // 32: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 83, // 33: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 41, // 34: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 41, // 35: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 54, // 36: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 84, // 37: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 85, // 38: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 86, // 39: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 87, // 40: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 54, // 41: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 4, // 42: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 3, // 43: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 88, // 44: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 58, // 45: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 61, // 46: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 89, // 47: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 57, // 48: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 74, // 49: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 14, // 50: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 19, // 51: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 24, // 52: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 22, // 53: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 26, // 54: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 28, // 55: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 33, // 56: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 72, // 57: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 72, // 58: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 43, // 59: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 45, // 60: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 51, // 61: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 53, // 62: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 56, // 63: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 60, // 64: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 63, // 65: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 65, // 66: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 67, // 67: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 68, // 68: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 69, // 69: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 70, // 70: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 13, // 71: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 72, // 72: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 9, // 73: o2control.Control.TrackStatus:input_type -> o2control.StatusRequest - 17, // 74: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 30, // 75: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 16, // 76: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 20, // 77: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 25, // 78: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 23, // 79: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 27, // 80: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 29, // 81: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 34, // 82: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 35, // 83: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 36, // 84: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 44, // 85: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 46, // 86: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 52, // 87: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 55, // 88: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 59, // 89: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 62, // 90: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 64, // 91: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 66, // 92: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 72, // 93: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 72, // 94: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 72, // 95: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 71, // 96: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 12, // 97: o2control.Control.Subscribe:output_type -> o2control.Event - 73, // 98: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 10, // 99: o2control.Control.TrackStatus:output_type -> o2control.StatusReply - 18, // 100: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 32, // 101: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 76, // [76:102] is the sub-list for method output_type - 50, // [50:76] is the sub-list for method input_type - 50, // [50:50] is the sub-list for extension type_name - 50, // [50:50] is the sub-list for extension extendee - 0, // [0:50] is the sub-list for field type_name + 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version + 12, // 1: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo + 32, // 2: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo + 66, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 67, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 68, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 69, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 70, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 71, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 45, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 43, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 72, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 73, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 41, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 38, // 23: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo + 40, // 24: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 40, // 25: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 39, // 26: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 74, // 27: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 28: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 29: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 45, // 30: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 75, // 31: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 76, // 32: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 77, // 33: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 78, // 34: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 45, // 35: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 36: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 37: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 79, // 38: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 49, // 39: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 52, // 40: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 80, // 41: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 48, // 42: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 65, // 43: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 50: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 63, // 51: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 63, // 52: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 53: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 54: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 55: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 42, // 56: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 44, // 57: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 47, // 58: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 51, // 59: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 54, // 60: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 56, // 61: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 58, // 62: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 59, // 63: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 60, // 64: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 61, // 65: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 66: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 63, // 67: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 68: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 69: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 71: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 72: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 73: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 74: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 75: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 76: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 77: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 78: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 79: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 43, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 46, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 50, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 53, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 55, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 57, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 63, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 63, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 63, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 62, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 81, // 92: o2control.Control.Subscribe:output_type -> events.Event + 64, // 93: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 94: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 95: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 70, // [70:96] is the sub-list for method output_type + 44, // [44:70] is the sub-list for method input_type + 44, // [44:44] is the sub-list for extension type_name + 44, // [44:44] is the sub-list for extension extendee + 0, // [0:44] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5787,102 +5124,6 @@ func file_protos_o2control_proto_init() { } if !protoimpl.UnsafeEnabled { file_protos_o2control_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event_MesosHeartbeat); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_RoleEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusReply); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusUpdate); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SubscribeRequest); i { case 0: return &v.state @@ -5894,7 +5135,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFrameworkInfoRequest); i { case 0: return &v.state @@ -5906,7 +5147,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Version); i { case 0: return &v.state @@ -5918,7 +5159,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetFrameworkInfoReply); i { case 0: return &v.state @@ -5930,7 +5171,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeardownRequest); i { case 0: return &v.state @@ -5942,7 +5183,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TeardownReply); i { case 0: return &v.state @@ -5954,7 +5195,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentsRequest); i { case 0: return &v.state @@ -5966,7 +5207,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentsReply); i { case 0: return &v.state @@ -5978,7 +5219,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentInfo); i { case 0: return &v.state @@ -5990,7 +5231,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewEnvironmentRequest); i { case 0: return &v.state @@ -6002,7 +5243,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewEnvironmentReply); i { case 0: return &v.state @@ -6014,7 +5255,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewAutoEnvironmentRequest); i { case 0: return &v.state @@ -6026,7 +5267,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NewAutoEnvironmentReply); i { case 0: return &v.state @@ -6038,7 +5279,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentRequest); i { case 0: return &v.state @@ -6050,7 +5291,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentReply); i { case 0: return &v.state @@ -6062,7 +5303,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentRequest); i { case 0: return &v.state @@ -6074,7 +5315,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ControlEnvironmentReply); i { case 0: return &v.state @@ -6086,7 +5327,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentRequest); i { case 0: return &v.state @@ -6098,7 +5339,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentOperation); i { case 0: return &v.state @@ -6110,7 +5351,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ModifyEnvironmentReply); i { case 0: return &v.state @@ -6122,7 +5363,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentRequest); i { case 0: return &v.state @@ -6134,7 +5375,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DestroyEnvironmentReply); i { case 0: return &v.state @@ -6146,7 +5387,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetActiveDetectorsReply); i { case 0: return &v.state @@ -6158,7 +5399,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetAvailableDetectorsReply); i { case 0: return &v.state @@ -6170,7 +5411,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -6182,7 +5423,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -6194,7 +5435,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesRequest); i { case 0: return &v.state @@ -6206,7 +5447,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetEnvironmentPropertiesReply); i { case 0: return &v.state @@ -6218,7 +5459,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShortTaskInfo); i { case 0: return &v.state @@ -6230,7 +5471,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskDeploymentInfo); i { case 0: return &v.state @@ -6242,7 +5483,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksRequest); i { case 0: return &v.state @@ -6254,7 +5495,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTasksReply); i { case 0: return &v.state @@ -6266,7 +5507,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskRequest); i { case 0: return &v.state @@ -6278,7 +5519,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetTaskReply); i { case 0: return &v.state @@ -6290,7 +5531,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskClassInfo); i { case 0: return &v.state @@ -6302,7 +5543,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -6314,7 +5555,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -6326,7 +5567,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -6338,7 +5579,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -6350,7 +5591,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -6362,7 +5603,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -6374,7 +5615,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -6386,7 +5627,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -6398,7 +5639,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -6410,7 +5651,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VarSpecMessage); i { case 0: return &v.state @@ -6422,7 +5663,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -6434,7 +5675,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -6446,7 +5687,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -6458,7 +5699,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -6470,7 +5711,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -6482,7 +5723,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -6494,7 +5735,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -6506,7 +5747,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -6518,7 +5759,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -6530,7 +5771,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -6542,7 +5783,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -6554,7 +5795,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -6566,7 +5807,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -6578,7 +5819,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -6590,7 +5831,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -6602,7 +5843,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListIntegratedServicesReply); i { case 0: return &v.state @@ -6614,7 +5855,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -6627,21 +5868,13 @@ func file_protos_o2control_proto_init() { } } } - file_protos_o2control_proto_msgTypes[6].OneofWrappers = []interface{}{ - (*StatusUpdate_MesosHeartbeat)(nil), - } - file_protos_o2control_proto_msgTypes[7].OneofWrappers = []interface{}{ - (*Event_EnvironmentEvent)(nil), - (*Event_TaskEvent)(nil), - (*Event_RoleEvent)(nil), - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, - NumEnums: 5, - NumMessages: 85, + NumEnums: 4, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 6b17a3ac7..8d085ed88 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -28,36 +28,7 @@ package o2control; option java_package = "ch.cern.alice.o2.control.rpcserver"; option go_package = "github.com/AliceO2Group/Control/core/protos;pb"; -//////////////// Common event messages /////////////// - -message Event_MesosHeartbeat { -} - -message Ev_EnvironmentEvent { - string environmentId = 1; - string state = 2; - uint32 currentRunNumber = 3; - string error = 4; - string message = 5; -} - -message Ev_TaskEvent { - string name = 1; - string taskid = 2; - string state = 3; - string status = 4; - string hostname = 5; - string className = 6; -} - -message Ev_RoleEvent { - string name = 1; - string status = 2; - string state = 3; - string rolePath = 4; -} - -////////////////////////////////////////////////////// +import public "protos/events.proto"; service Control { rpc GetFrameworkInfo (GetFrameworkInfoRequest) returns (GetFrameworkInfoReply) {} @@ -91,47 +62,15 @@ service Control { rpc SetDefaultRepo(SetDefaultRepoRequest) returns (Empty) {} rpc SetGlobalDefaultRevision(SetGlobalDefaultRevisionRequest) returns (Empty) {} rpc SetRepoDefaultRevision(SetRepoDefaultRevisionRequest) returns (SetRepoDefaultRevisionReply) {} - rpc Subscribe(SubscribeRequest) returns (stream Event) {} + rpc Subscribe(SubscribeRequest) returns (stream events.Event) {} rpc GetIntegratedServices(Empty) returns (ListIntegratedServicesReply) {} // Reserved and not implemented: - rpc TrackStatus (StatusRequest) returns (stream StatusReply) {} rpc Teardown (TeardownRequest) returns (TeardownReply) {} rpc ModifyEnvironment (ModifyEnvironmentRequest) returns (ModifyEnvironmentReply) {} } -//////////////////////////////////////// -// Global status -//////////////////////////////////////// -message StatusRequest {} -message StatusReply { - string state = 1; - repeated StatusUpdate statusUpdates = 2; -} -message StatusUpdate { - enum Level { - DEBUG = 0; - INFO = 1; - WARNING = 2; - ERROR = 3; - } - Level level = 1; - oneof Event { - Event_MesosHeartbeat mesosHeartbeat = 2; - //TODO add other events here and in events.proto - } -} - -message Event { - string timestamp = 1; - oneof Payload { - Ev_EnvironmentEvent environmentEvent = 2; - Ev_TaskEvent taskEvent = 3; - Ev_RoleEvent roleEvent = 4; - } -} - message SubscribeRequest{ string id = 1; } diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 12ce81f1a..d702dab58 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -31,6 +31,7 @@ package pb import ( context "context" + protos "github.com/AliceO2Group/Control/common/protos" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -51,6 +52,7 @@ const ( Control_DestroyEnvironment_FullMethodName = "/o2control.Control/DestroyEnvironment" Control_GetActiveDetectors_FullMethodName = "/o2control.Control/GetActiveDetectors" Control_GetAvailableDetectors_FullMethodName = "/o2control.Control/GetAvailableDetectors" + Control_NewEnvironmentAsync_FullMethodName = "/o2control.Control/NewEnvironmentAsync" Control_GetTasks_FullMethodName = "/o2control.Control/GetTasks" Control_GetTask_FullMethodName = "/o2control.Control/GetTask" Control_CleanupTasks_FullMethodName = "/o2control.Control/CleanupTasks" @@ -65,7 +67,6 @@ const ( Control_SetRepoDefaultRevision_FullMethodName = "/o2control.Control/SetRepoDefaultRevision" Control_Subscribe_FullMethodName = "/o2control.Control/Subscribe" Control_GetIntegratedServices_FullMethodName = "/o2control.Control/GetIntegratedServices" - Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" Control_Teardown_FullMethodName = "/o2control.Control/Teardown" Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" ) @@ -83,6 +84,7 @@ type ControlClient interface { DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) + NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -98,7 +100,6 @@ type ControlClient interface { Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) // Reserved and not implemented: - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) } @@ -192,6 +193,15 @@ func (c *controlClient) GetAvailableDetectors(ctx context.Context, in *Empty, op return out, nil } +func (c *controlClient) NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, Control_NewEnvironmentAsync_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, Control_GetTasks_FullMethodName, in, out, opts...) @@ -316,7 +326,7 @@ func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opt } type Control_SubscribeClient interface { - Recv() (*Event, error) + Recv() (*protos.Event, error) grpc.ClientStream } @@ -324,8 +334,8 @@ type controlSubscribeClient struct { grpc.ClientStream } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) +func (x *controlSubscribeClient) Recv() (*protos.Event, error) { + m := new(protos.Event) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } @@ -341,38 +351,6 @@ func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, op return out, nil } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_TrackStatus_FullMethodName, opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type controlTrackStatusClient struct { - grpc.ClientStream -} - -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { out := new(TeardownReply) err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) @@ -404,6 +382,7 @@ type ControlServer interface { DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) + NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -419,7 +398,6 @@ type ControlServer interface { Subscribe(*SubscribeRequest, Control_SubscribeServer) error GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) // Reserved and not implemented: - TrackStatus(*StatusRequest, Control_TrackStatusServer) error Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) } @@ -455,6 +433,9 @@ func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (* func (UnimplementedControlServer) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAvailableDetectors not implemented") } +func (UnimplementedControlServer) NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironmentAsync not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -497,9 +478,6 @@ func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_Subscribe func (UnimplementedControlServer) GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetIntegratedServices not implemented") } -func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") } @@ -680,6 +658,24 @@ func _Control_GetAvailableDetectors_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _Control_NewEnvironmentAsync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewEnvironmentAsync(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_NewEnvironmentAsync_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironmentAsync(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -905,7 +901,7 @@ func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error } type Control_SubscribeServer interface { - Send(*Event) error + Send(*protos.Event) error grpc.ServerStream } @@ -913,7 +909,7 @@ type controlSubscribeServer struct { grpc.ServerStream } -func (x *controlSubscribeServer) Send(m *Event) error { +func (x *controlSubscribeServer) Send(m *protos.Event) error { return x.ServerStream.SendMsg(m) } @@ -935,27 +931,6 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(TeardownRequest) if err := dec(in); err != nil { @@ -1035,6 +1010,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAvailableDetectors", Handler: _Control_GetAvailableDetectors_Handler, }, + { + MethodName: "NewEnvironmentAsync", + Handler: _Control_NewEnvironmentAsync_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -1102,11 +1081,6 @@ var Control_ServiceDesc = grpc.ServiceDesc{ Handler: _Control_Subscribe_Handler, ServerStreams: true, }, - { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, - }, }, Metadata: "protos/o2control.proto", } From 5f7be750b23aa2a2a0dc92134c2fdf6ca327254e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Feb 2024 16:26:26 +0100 Subject: [PATCH 1818/2352] [coconut] Fix Protobuf generator call --- coconut/cmd/environment.go | 2 +- coconut/protos/o2control_grpc.pb.go | 270 +++++++++++++--------------- 2 files changed, 123 insertions(+), 149 deletions(-) diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index 62f9dd3d9..f6dcc1f58 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -//go:generate protoc -I=../../core -I=../../common --go_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/o2control.proto +//go:generate protoc -I=../../core -I=../../common --go_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:.. protos/o2control.proto package cmd diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index e3bca95b1..d702dab58 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -31,6 +31,7 @@ package pb import ( context "context" + protos "github.com/AliceO2Group/Control/common/protos" grpc "google.golang.org/grpc" codes "google.golang.org/grpc/codes" status "google.golang.org/grpc/status" @@ -42,18 +43,16 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Control_TrackStatus_FullMethodName = "/o2control.Control/TrackStatus" Control_GetFrameworkInfo_FullMethodName = "/o2control.Control/GetFrameworkInfo" - Control_Teardown_FullMethodName = "/o2control.Control/Teardown" Control_GetEnvironments_FullMethodName = "/o2control.Control/GetEnvironments" Control_NewAutoEnvironment_FullMethodName = "/o2control.Control/NewAutoEnvironment" Control_NewEnvironment_FullMethodName = "/o2control.Control/NewEnvironment" Control_GetEnvironment_FullMethodName = "/o2control.Control/GetEnvironment" Control_ControlEnvironment_FullMethodName = "/o2control.Control/ControlEnvironment" - Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" Control_DestroyEnvironment_FullMethodName = "/o2control.Control/DestroyEnvironment" Control_GetActiveDetectors_FullMethodName = "/o2control.Control/GetActiveDetectors" Control_GetAvailableDetectors_FullMethodName = "/o2control.Control/GetAvailableDetectors" + Control_NewEnvironmentAsync_FullMethodName = "/o2control.Control/NewEnvironmentAsync" Control_GetTasks_FullMethodName = "/o2control.Control/GetTasks" Control_GetTask_FullMethodName = "/o2control.Control/GetTask" Control_CleanupTasks_FullMethodName = "/o2control.Control/CleanupTasks" @@ -68,24 +67,24 @@ const ( Control_SetRepoDefaultRevision_FullMethodName = "/o2control.Control/SetRepoDefaultRevision" Control_Subscribe_FullMethodName = "/o2control.Control/Subscribe" Control_GetIntegratedServices_FullMethodName = "/o2control.Control/GetIntegratedServices" + Control_Teardown_FullMethodName = "/o2control.Control/Teardown" + Control_ModifyEnvironment_FullMethodName = "/o2control.Control/ModifyEnvironment" ) // ControlClient is the client API for Control service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type ControlClient interface { - TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) - Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) - ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) + NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) CleanupTasks(ctx context.Context, in *CleanupTasksRequest, opts ...grpc.CallOption) (*CleanupTasksReply, error) @@ -100,6 +99,9 @@ type ControlClient interface { SetRepoDefaultRevision(ctx context.Context, in *SetRepoDefaultRevisionRequest, opts ...grpc.CallOption) (*SetRepoDefaultRevisionReply, error) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) GetIntegratedServices(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListIntegratedServicesReply, error) + // Reserved and not implemented: + Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) + ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) } type controlClient struct { @@ -110,38 +112,6 @@ func NewControlClient(cc grpc.ClientConnInterface) ControlClient { return &controlClient{cc} } -func (c *controlClient) TrackStatus(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (Control_TrackStatusClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_TrackStatus_FullMethodName, opts...) - if err != nil { - return nil, err - } - x := &controlTrackStatusClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } - return x, nil -} - -type Control_TrackStatusClient interface { - Recv() (*StatusReply, error) - grpc.ClientStream -} - -type controlTrackStatusClient struct { - grpc.ClientStream -} - -func (x *controlTrackStatusClient) Recv() (*StatusReply, error) { - m := new(StatusReply) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} - func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) { out := new(GetFrameworkInfoReply) err := c.cc.Invoke(ctx, Control_GetFrameworkInfo_FullMethodName, in, out, opts...) @@ -151,15 +121,6 @@ func (c *controlClient) GetFrameworkInfo(ctx context.Context, in *GetFrameworkIn return out, nil } -func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { - out := new(TeardownReply) - err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) { out := new(GetEnvironmentsReply) err := c.cc.Invoke(ctx, Control_GetEnvironments_FullMethodName, in, out, opts...) @@ -205,15 +166,6 @@ func (c *controlClient) ControlEnvironment(ctx context.Context, in *ControlEnvir return out, nil } -func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { - out := new(ModifyEnvironmentReply) - err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *controlClient) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) { out := new(DestroyEnvironmentReply) err := c.cc.Invoke(ctx, Control_DestroyEnvironment_FullMethodName, in, out, opts...) @@ -241,6 +193,15 @@ func (c *controlClient) GetAvailableDetectors(ctx context.Context, in *Empty, op return out, nil } +func (c *controlClient) NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) { + out := new(NewEnvironmentReply) + err := c.cc.Invoke(ctx, Control_NewEnvironmentAsync_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *controlClient) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) { out := new(GetTasksReply) err := c.cc.Invoke(ctx, Control_GetTasks_FullMethodName, in, out, opts...) @@ -350,7 +311,7 @@ func (c *controlClient) SetRepoDefaultRevision(ctx context.Context, in *SetRepoD } func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (Control_SubscribeClient, error) { - stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[1], Control_Subscribe_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &Control_ServiceDesc.Streams[0], Control_Subscribe_FullMethodName, opts...) if err != nil { return nil, err } @@ -365,7 +326,7 @@ func (c *controlClient) Subscribe(ctx context.Context, in *SubscribeRequest, opt } type Control_SubscribeClient interface { - Recv() (*Event, error) + Recv() (*protos.Event, error) grpc.ClientStream } @@ -373,8 +334,8 @@ type controlSubscribeClient struct { grpc.ClientStream } -func (x *controlSubscribeClient) Recv() (*Event, error) { - m := new(Event) +func (x *controlSubscribeClient) Recv() (*protos.Event, error) { + m := new(protos.Event) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } @@ -390,22 +351,38 @@ func (c *controlClient) GetIntegratedServices(ctx context.Context, in *Empty, op return out, nil } +func (c *controlClient) Teardown(ctx context.Context, in *TeardownRequest, opts ...grpc.CallOption) (*TeardownReply, error) { + out := new(TeardownReply) + err := c.cc.Invoke(ctx, Control_Teardown_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnvironmentRequest, opts ...grpc.CallOption) (*ModifyEnvironmentReply, error) { + out := new(ModifyEnvironmentReply) + err := c.cc.Invoke(ctx, Control_ModifyEnvironment_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // ControlServer is the server API for Control service. -// All implementations must embed UnimplementedControlServer +// All implementations should embed UnimplementedControlServer // for forward compatibility type ControlServer interface { - TrackStatus(*StatusRequest, Control_TrackStatusServer) error GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) - Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) - ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) + NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) CleanupTasks(context.Context, *CleanupTasksRequest) (*CleanupTasksReply, error) @@ -420,22 +397,18 @@ type ControlServer interface { SetRepoDefaultRevision(context.Context, *SetRepoDefaultRevisionRequest) (*SetRepoDefaultRevisionReply, error) Subscribe(*SubscribeRequest, Control_SubscribeServer) error GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) - mustEmbedUnimplementedControlServer() + // Reserved and not implemented: + Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) + ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) } -// UnimplementedControlServer must be embedded to have forward compatible implementations. +// UnimplementedControlServer should be embedded to have forward compatible implementations. type UnimplementedControlServer struct { } -func (UnimplementedControlServer) TrackStatus(*StatusRequest, Control_TrackStatusServer) error { - return status.Errorf(codes.Unimplemented, "method TrackStatus not implemented") -} func (UnimplementedControlServer) GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetFrameworkInfo not implemented") } -func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") -} func (UnimplementedControlServer) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEnvironments not implemented") } @@ -451,9 +424,6 @@ func (UnimplementedControlServer) GetEnvironment(context.Context, *GetEnvironmen func (UnimplementedControlServer) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method ControlEnvironment not implemented") } -func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { - return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") -} func (UnimplementedControlServer) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) { return nil, status.Errorf(codes.Unimplemented, "method DestroyEnvironment not implemented") } @@ -463,6 +433,9 @@ func (UnimplementedControlServer) GetActiveDetectors(context.Context, *Empty) (* func (UnimplementedControlServer) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetAvailableDetectors not implemented") } +func (UnimplementedControlServer) NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method NewEnvironmentAsync not implemented") +} func (UnimplementedControlServer) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetTasks not implemented") } @@ -505,7 +478,12 @@ func (UnimplementedControlServer) Subscribe(*SubscribeRequest, Control_Subscribe func (UnimplementedControlServer) GetIntegratedServices(context.Context, *Empty) (*ListIntegratedServicesReply, error) { return nil, status.Errorf(codes.Unimplemented, "method GetIntegratedServices not implemented") } -func (UnimplementedControlServer) mustEmbedUnimplementedControlServer() {} +func (UnimplementedControlServer) Teardown(context.Context, *TeardownRequest) (*TeardownReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method Teardown not implemented") +} +func (UnimplementedControlServer) ModifyEnvironment(context.Context, *ModifyEnvironmentRequest) (*ModifyEnvironmentReply, error) { + return nil, status.Errorf(codes.Unimplemented, "method ModifyEnvironment not implemented") +} // UnsafeControlServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to ControlServer will @@ -518,27 +496,6 @@ func RegisterControlServer(s grpc.ServiceRegistrar, srv ControlServer) { s.RegisterService(&Control_ServiceDesc, srv) } -func _Control_TrackStatus_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(StatusRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(ControlServer).TrackStatus(m, &controlTrackStatusServer{stream}) -} - -type Control_TrackStatusServer interface { - Send(*StatusReply) error - grpc.ServerStream -} - -type controlTrackStatusServer struct { - grpc.ServerStream -} - -func (x *controlTrackStatusServer) Send(m *StatusReply) error { - return x.ServerStream.SendMsg(m) -} - func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetFrameworkInfoRequest) if err := dec(in); err != nil { @@ -557,24 +514,6 @@ func _Control_GetFrameworkInfo_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(TeardownRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).Teardown(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Control_Teardown_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_GetEnvironments_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetEnvironmentsRequest) if err := dec(in); err != nil { @@ -665,24 +604,6 @@ func _Control_ControlEnvironment_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } -func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ModifyEnvironmentRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ControlServer).ModifyEnvironment(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Control_ModifyEnvironment_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _Control_DestroyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(DestroyEnvironmentRequest) if err := dec(in); err != nil { @@ -737,6 +658,24 @@ func _Control_GetAvailableDetectors_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _Control_NewEnvironmentAsync_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(NewEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).NewEnvironmentAsync(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_NewEnvironmentAsync_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).NewEnvironmentAsync(ctx, req.(*NewEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Control_GetTasks_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetTasksRequest) if err := dec(in); err != nil { @@ -962,7 +901,7 @@ func _Control_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error } type Control_SubscribeServer interface { - Send(*Event) error + Send(*protos.Event) error grpc.ServerStream } @@ -970,7 +909,7 @@ type controlSubscribeServer struct { grpc.ServerStream } -func (x *controlSubscribeServer) Send(m *Event) error { +func (x *controlSubscribeServer) Send(m *protos.Event) error { return x.ServerStream.SendMsg(m) } @@ -992,6 +931,42 @@ func _Control_GetIntegratedServices_Handler(srv interface{}, ctx context.Context return interceptor(ctx, in, info, handler) } +func _Control_Teardown_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TeardownRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).Teardown(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_Teardown_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).Teardown(ctx, req.(*TeardownRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Control_ModifyEnvironment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ModifyEnvironmentRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ControlServer).ModifyEnvironment(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Control_ModifyEnvironment_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ControlServer).ModifyEnvironment(ctx, req.(*ModifyEnvironmentRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Control_ServiceDesc is the grpc.ServiceDesc for Control service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -1003,10 +978,6 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetFrameworkInfo", Handler: _Control_GetFrameworkInfo_Handler, }, - { - MethodName: "Teardown", - Handler: _Control_Teardown_Handler, - }, { MethodName: "GetEnvironments", Handler: _Control_GetEnvironments_Handler, @@ -1027,10 +998,6 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "ControlEnvironment", Handler: _Control_ControlEnvironment_Handler, }, - { - MethodName: "ModifyEnvironment", - Handler: _Control_ModifyEnvironment_Handler, - }, { MethodName: "DestroyEnvironment", Handler: _Control_DestroyEnvironment_Handler, @@ -1043,6 +1010,10 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetAvailableDetectors", Handler: _Control_GetAvailableDetectors_Handler, }, + { + MethodName: "NewEnvironmentAsync", + Handler: _Control_NewEnvironmentAsync_Handler, + }, { MethodName: "GetTasks", Handler: _Control_GetTasks_Handler, @@ -1095,13 +1066,16 @@ var Control_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetIntegratedServices", Handler: _Control_GetIntegratedServices_Handler, }, - }, - Streams: []grpc.StreamDesc{ { - StreamName: "TrackStatus", - Handler: _Control_TrackStatus_Handler, - ServerStreams: true, + MethodName: "Teardown", + Handler: _Control_Teardown_Handler, }, + { + MethodName: "ModifyEnvironment", + Handler: _Control_ModifyEnvironment_Handler, + }, + }, + Streams: []grpc.StreamDesc{ { StreamName: "Subscribe", Handler: _Control_Subscribe_Handler, From 5436b3d16996516f1a244e401351e3e23d061dde Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 23 Feb 2024 14:18:43 +0100 Subject: [PATCH 1819/2352] [core] Kafka wrapper --- common/event/topic/topic.go | 51 +++++++++++++++++++++++++ common/event/writer.go | 75 +++++++++++++++++++++++++++++++++++++ core/config.go | 2 + core/the/eventwriter.go | 38 +++++++++++++++++++ 4 files changed, 166 insertions(+) create mode 100644 common/event/topic/topic.go create mode 100644 common/event/writer.go create mode 100644 core/the/eventwriter.go diff --git a/common/event/topic/topic.go b/common/event/topic/topic.go new file mode 100644 index 000000000..d44b1f83c --- /dev/null +++ b/common/event/topic/topic.go @@ -0,0 +1,51 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package topic + +type Topic string + +const ( + Separator = "." // used to separate topic segments + Root Topic = "aliecs" + Event Topic = Root + Separator + "event" + + Ev_Env Topic = Event + Separator + "environment" + Ev_Env_EnterState Topic = Ev_Env + Separator + "enter_state" + Ev_Env_LeaveState Topic = Ev_Env + Separator + "leave_state" + Ev_Env_BeforeEv Topic = Ev_Env + Separator + "before_event" + Ev_Env_AfterEv Topic = Ev_Env + Separator + "after_event" + + Ev_Role Topic = Event + Separator + "role" + + Ev_Task = Event + Separator + "task" + Ev_Task_Lifecycle = Ev_Task + Separator + "lifecycle" + Ev_Task_StateChange = Ev_Task + Separator + "state_change" + + Ev_IntegratedService = Event + Separator + "integrated_service" + + Ev_Meta = Event + Separator + "meta" + Ev_Meta_Framework = Ev_Meta + Separator + "framework" + Ev_Meta_Mesos = Ev_Meta + Separator + "mesos" +) diff --git a/common/event/writer.go b/common/event/writer.go new file mode 100644 index 000000000..16d88cb64 --- /dev/null +++ b/common/event/writer.go @@ -0,0 +1,75 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "context" + + "github.com/AliceO2Group/Control/common/event/topic" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" + "github.com/segmentio/kafka-go" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" + "google.golang.org/protobuf/proto" +) + +var log = logger.New(logrus.StandardLogger(), "event") + +type Writer struct { + *kafka.Writer +} + +func NewWriterWithTopic(topic topic.Topic) *Writer { + return &Writer{ + Writer: &kafka.Writer{ + Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), + Topic: string(topic), + Balancer: &kafka.LeastBytes{}, + }, + } +} + +func (w *Writer) WriteEvent(e *pb.Event) { + data, err := proto.Marshal(e) + if err != nil { + log.WithField("topic", w.Topic). + WithField("event", e). + WithError(err). + Error("failed to marshal event") + } + + err = w.WriteMessages(context.Background(), kafka.Message{ + Value: data, + }) + + if err != nil { + log.WithField("topic", w.Topic). + WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Kafka message delivery failed: %s", err.Error()) + } +} diff --git a/core/config.go b/core/config.go index 0f674b3b6..98e7c1ce6 100644 --- a/core/config.go +++ b/core/config.go @@ -122,6 +122,7 @@ func setDefaults() error { viper.SetDefault("reuseUnlockedTasks", false) viper.SetDefault("configCache", true) viper.SetDefault("taskClassCacheTTL", 7*24*time.Hour) + viper.SetDefault("kafkaEndpoints", []string{"localhost:9092"}) return nil } @@ -186,6 +187,7 @@ func setFlags() error { pflag.Bool("reuseUnlockedTasks", viper.GetBool("reuseUnlockedTasks"), "Reuse unlocked active tasks when satisfying environment deployment requests") pflag.Bool("configCache", viper.GetBool("configCache"), "Enable cache layer between AliECS core and Apricot") pflag.Duration("taskClassCacheTTL", viper.GetDuration("taskClassCacheTTL"), "TTL for task class cache entries") + pflag.StringSlice("kafkaEndpoints", viper.GetStringSlice("kafkaEndpoints"), "List of Kafka endpoints to connect to (default: localhost:9092)") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/the/eventwriter.go b/core/the/eventwriter.go new file mode 100644 index 000000000..9946b498d --- /dev/null +++ b/core/the/eventwriter.go @@ -0,0 +1,38 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2019-2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package the + +import ( + "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" +) + +func EventWriter() *event.Writer { + return EventWriterWithTopic("") +} + +func EventWriterWithTopic(topic topic.Topic) *event.Writer { + return event.NewWriterWithTopic(topic) +} From 131b2fc6f635735da9170a2c5b94a3925df3d313 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Feb 2024 14:22:41 +0100 Subject: [PATCH 1820/2352] [core] Emit environment events --- coconut/protos/o2control.pb.go | 6 +- common/event/topic/topic.go | 22 +-- common/event/writer.go | 58 +++++- common/protos/events.pb.go | 331 ++++++++++++++++++++------------ common/protos/events.proto | 12 +- common/runtype/runtype.go | 2 + core/core.go | 12 +- core/environment/environment.go | 196 ++++++++++++++++++- core/environment/manager.go | 63 ++++-- core/protos/o2control.pb.go | 6 +- core/server.go | 77 ++++++-- core/the/eventwriter.go | 2 +- 12 files changed, 596 insertions(+), 191 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 5b01e7a4e..3cf7cfa85 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -47,7 +47,8 @@ const ( // Symbols defined in public import of protos/events.proto. type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat -type Ev_MetaEvent_FrameworkFailure = protos.Ev_MetaEvent_FrameworkFailure +type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart +type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_RoleEvent = protos.Ev_RoleEvent @@ -55,8 +56,9 @@ type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent -type Event_FrameworkFailureEvent = protos.Event_FrameworkFailureEvent +type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent +type Event_CoreStartEvent = protos.Event_CoreStartEvent type ControlEnvironmentRequest_Optype int32 diff --git a/common/event/topic/topic.go b/common/event/topic/topic.go index d44b1f83c..e026b7974 100644 --- a/common/event/topic/topic.go +++ b/common/event/topic/topic.go @@ -29,23 +29,13 @@ type Topic string const ( Separator = "." // used to separate topic segments Root Topic = "aliecs" - Event Topic = Root + Separator + "event" - Ev_Env Topic = Event + Separator + "environment" - Ev_Env_EnterState Topic = Ev_Env + Separator + "enter_state" - Ev_Env_LeaveState Topic = Ev_Env + Separator + "leave_state" - Ev_Env_BeforeEv Topic = Ev_Env + Separator + "before_event" - Ev_Env_AfterEv Topic = Ev_Env + Separator + "after_event" + Run Topic = Root + Separator + "run" + Environment Topic = Root + Separator + "environment" + Role Topic = Root + Separator + "role" + Task Topic = Root + Separator + "task" - Ev_Role Topic = Event + Separator + "role" + Core Topic = Root + Separator + "core" - Ev_Task = Event + Separator + "task" - Ev_Task_Lifecycle = Ev_Task + Separator + "lifecycle" - Ev_Task_StateChange = Ev_Task + Separator + "state_change" - - Ev_IntegratedService = Event + Separator + "integrated_service" - - Ev_Meta = Event + Separator + "meta" - Ev_Meta_Framework = Ev_Meta + Separator + "framework" - Ev_Meta_Mesos = Ev_Meta + Separator + "mesos" + IntegratedService Topic = Root + Separator + "integrated_service" ) diff --git a/common/event/writer.go b/common/event/writer.go index 16d88cb64..87196e792 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -26,6 +26,8 @@ package event import ( "context" + "fmt" + "time" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" @@ -53,13 +55,53 @@ func NewWriterWithTopic(topic topic.Topic) *Writer { } } -func (w *Writer) WriteEvent(e *pb.Event) { +func (w *Writer) WriteEvent(e interface{}) { + var err error + switch e := e.(type) { + case *pb.Ev_MetaEvent_CoreStart: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, + }) + case *pb.Ev_MetaEvent_MesosHeartbeat: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, + }) + case *pb.Ev_MetaEvent_FrameworkEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, + }) + case *pb.Ev_TaskEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_TaskEvent{TaskEvent: e}, + }) + case *pb.Ev_RoleEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_RoleEvent{RoleEvent: e}, + }) + case *pb.Ev_EnvironmentEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, + }) + default: + err = fmt.Errorf("unsupported event type") + } + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Error(err.Error()) + } +} + +func (w *Writer) doWriteEvent(e *pb.Event) error { data, err := proto.Marshal(e) if err != nil { - log.WithField("topic", w.Topic). - WithField("event", e). - WithError(err). - Error("failed to marshal event") + return fmt.Errorf("failed to marshal event: %w", err) } err = w.WriteMessages(context.Background(), kafka.Message{ @@ -67,9 +109,7 @@ func (w *Writer) WriteEvent(e *pb.Event) { }) if err != nil { - log.WithField("topic", w.Topic). - WithField("event", e). - WithField("level", infologger.IL_Support). - Errorf("Kafka message delivery failed: %s", err.Error()) + return fmt.Errorf("failed to write event: %w", err) } + return nil } diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index a28945630..c6e672ee9 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -81,16 +81,16 @@ func (*Ev_MetaEvent_MesosHeartbeat) Descriptor() ([]byte, []int) { return file_protos_events_proto_rawDescGZIP(), []int{0} } -type Ev_MetaEvent_FrameworkFailure struct { +type Ev_MetaEvent_CoreStart struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Message string `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` } -func (x *Ev_MetaEvent_FrameworkFailure) Reset() { - *x = Ev_MetaEvent_FrameworkFailure{} +func (x *Ev_MetaEvent_CoreStart) Reset() { + *x = Ev_MetaEvent_CoreStart{} if protoimpl.UnsafeEnabled { mi := &file_protos_events_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -98,13 +98,13 @@ func (x *Ev_MetaEvent_FrameworkFailure) Reset() { } } -func (x *Ev_MetaEvent_FrameworkFailure) String() string { +func (x *Ev_MetaEvent_CoreStart) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Ev_MetaEvent_FrameworkFailure) ProtoMessage() {} +func (*Ev_MetaEvent_CoreStart) ProtoMessage() {} -func (x *Ev_MetaEvent_FrameworkFailure) ProtoReflect() protoreflect.Message { +func (x *Ev_MetaEvent_CoreStart) ProtoReflect() protoreflect.Message { mi := &file_protos_events_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -116,12 +116,67 @@ func (x *Ev_MetaEvent_FrameworkFailure) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Ev_MetaEvent_FrameworkFailure.ProtoReflect.Descriptor instead. -func (*Ev_MetaEvent_FrameworkFailure) Descriptor() ([]byte, []int) { +// Deprecated: Use Ev_MetaEvent_CoreStart.ProtoReflect.Descriptor instead. +func (*Ev_MetaEvent_CoreStart) Descriptor() ([]byte, []int) { return file_protos_events_proto_rawDescGZIP(), []int{1} } -func (x *Ev_MetaEvent_FrameworkFailure) GetMessage() string { +func (x *Ev_MetaEvent_CoreStart) GetFrameworkId() string { + if x != nil { + return x.FrameworkId + } + return "" +} + +type Ev_MetaEvent_FrameworkEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *Ev_MetaEvent_FrameworkEvent) Reset() { + *x = Ev_MetaEvent_FrameworkEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_MetaEvent_FrameworkEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_MetaEvent_FrameworkEvent) ProtoMessage() {} + +func (x *Ev_MetaEvent_FrameworkEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_MetaEvent_FrameworkEvent.ProtoReflect.Descriptor instead. +func (*Ev_MetaEvent_FrameworkEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{2} +} + +func (x *Ev_MetaEvent_FrameworkEvent) GetFrameworkId() string { + if x != nil { + return x.FrameworkId + } + return "" +} + +func (x *Ev_MetaEvent_FrameworkEvent) GetMessage() string { if x != nil { return x.Message } @@ -145,7 +200,7 @@ type Ev_EnvironmentEvent struct { func (x *Ev_EnvironmentEvent) Reset() { *x = Ev_EnvironmentEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[2] + mi := &file_protos_events_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -158,7 +213,7 @@ func (x *Ev_EnvironmentEvent) String() string { func (*Ev_EnvironmentEvent) ProtoMessage() {} func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[2] + mi := &file_protos_events_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -171,7 +226,7 @@ func (x *Ev_EnvironmentEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use Ev_EnvironmentEvent.ProtoReflect.Descriptor instead. func (*Ev_EnvironmentEvent) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{2} + return file_protos_events_proto_rawDescGZIP(), []int{3} } func (x *Ev_EnvironmentEvent) GetEnvironmentId() string { @@ -239,7 +294,7 @@ type Ev_TaskEvent struct { func (x *Ev_TaskEvent) Reset() { *x = Ev_TaskEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[3] + mi := &file_protos_events_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -252,7 +307,7 @@ func (x *Ev_TaskEvent) String() string { func (*Ev_TaskEvent) ProtoMessage() {} func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[3] + mi := &file_protos_events_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -265,7 +320,7 @@ func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{3} + return file_protos_events_proto_rawDescGZIP(), []int{4} } func (x *Ev_TaskEvent) GetName() string { @@ -324,7 +379,7 @@ type Ev_RoleEvent struct { func (x *Ev_RoleEvent) Reset() { *x = Ev_RoleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[4] + mi := &file_protos_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -337,7 +392,7 @@ func (x *Ev_RoleEvent) String() string { func (*Ev_RoleEvent) ProtoMessage() {} func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[4] + mi := &file_protos_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -350,7 +405,7 @@ func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{4} + return file_protos_events_proto_rawDescGZIP(), []int{5} } func (x *Ev_RoleEvent) GetName() string { @@ -392,15 +447,16 @@ type Event struct { // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent - // *Event_FrameworkFailureEvent + // *Event_FrameworkEvent // *Event_MesosHeartbeatEvent + // *Event_CoreStartEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[5] + mi := &file_protos_events_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -413,7 +469,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[5] + mi := &file_protos_events_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -426,7 +482,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{5} + return file_protos_events_proto_rawDescGZIP(), []int{6} } func (x *Event) GetTimestamp() int64 { @@ -464,9 +520,9 @@ func (x *Event) GetRoleEvent() *Ev_RoleEvent { return nil } -func (x *Event) GetFrameworkFailureEvent() *Ev_MetaEvent_FrameworkFailure { - if x, ok := x.GetPayload().(*Event_FrameworkFailureEvent); ok { - return x.FrameworkFailureEvent +func (x *Event) GetFrameworkEvent() *Ev_MetaEvent_FrameworkEvent { + if x, ok := x.GetPayload().(*Event_FrameworkEvent); ok { + return x.FrameworkEvent } return nil } @@ -478,6 +534,13 @@ func (x *Event) GetMesosHeartbeatEvent() *Ev_MetaEvent_MesosHeartbeat { return nil } +func (x *Event) GetCoreStartEvent() *Ev_MetaEvent_CoreStart { + if x, ok := x.GetPayload().(*Event_CoreStartEvent); ok { + return x.CoreStartEvent + } + return nil +} + type isEvent_Payload interface { isEvent_Payload() } @@ -494,100 +557,115 @@ type Event_RoleEvent struct { RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` } -type Event_FrameworkFailureEvent struct { - FrameworkFailureEvent *Ev_MetaEvent_FrameworkFailure `protobuf:"bytes,5,opt,name=frameworkFailureEvent,proto3,oneof"` +type Event_FrameworkEvent struct { + FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,5,opt,name=frameworkEvent,proto3,oneof"` } type Event_MesosHeartbeatEvent struct { MesosHeartbeatEvent *Ev_MetaEvent_MesosHeartbeat `protobuf:"bytes,6,opt,name=mesosHeartbeatEvent,proto3,oneof"` } +type Event_CoreStartEvent struct { + CoreStartEvent *Ev_MetaEvent_CoreStart `protobuf:"bytes,7,opt,name=coreStartEvent,proto3,oneof"` +} + func (*Event_EnvironmentEvent) isEvent_Payload() {} func (*Event_TaskEvent) isEvent_Payload() {} func (*Event_RoleEvent) isEvent_Payload() {} -func (*Event_FrameworkFailureEvent) isEvent_Payload() {} +func (*Event_FrameworkEvent) isEvent_Payload() {} func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} +func (*Event_CoreStartEvent) isEvent_Payload() {} + var File_protos_events_proto protoreflect.FileDescriptor var file_protos_events_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, - 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x39, 0x0a, 0x1d, - 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, - 0xa2, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x3a, 0x0a, 0x16, + 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1b, 0x45, 0x76, 0x5f, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x22, 0x9f, 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, - 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x5d, 0x0a, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, - 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, - 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x48, 0x00, 0x52, 0x15, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xd9, + 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, + 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, + 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, + 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, + 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, - 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, - 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, + 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, + 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -602,26 +680,28 @@ func file_protos_events_proto_rawDescGZIP() []byte { return file_protos_events_proto_rawDescData } -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_protos_events_proto_goTypes = []interface{}{ - (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat - (*Ev_MetaEvent_FrameworkFailure)(nil), // 1: events.Ev_MetaEvent_FrameworkFailure - (*Ev_EnvironmentEvent)(nil), // 2: events.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 3: events.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 4: events.Ev_RoleEvent - (*Event)(nil), // 5: events.Event + (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat + (*Ev_MetaEvent_CoreStart)(nil), // 1: events.Ev_MetaEvent_CoreStart + (*Ev_MetaEvent_FrameworkEvent)(nil), // 2: events.Ev_MetaEvent_FrameworkEvent + (*Ev_EnvironmentEvent)(nil), // 3: events.Ev_EnvironmentEvent + (*Ev_TaskEvent)(nil), // 4: events.Ev_TaskEvent + (*Ev_RoleEvent)(nil), // 5: events.Ev_RoleEvent + (*Event)(nil), // 6: events.Event } var file_protos_events_proto_depIdxs = []int32{ - 2, // 0: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 3, // 1: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 4, // 2: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 1, // 3: events.Event.frameworkFailureEvent:type_name -> events.Ev_MetaEvent_FrameworkFailure + 3, // 0: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 4, // 1: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 5, // 2: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 2, // 3: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent 0, // 4: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 5, // [5:5] is the sub-list for method output_type - 5, // [5:5] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 1, // 5: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 6, // [6:6] is the sub-list for method output_type + 6, // [6:6] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -643,7 +723,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_MetaEvent_FrameworkFailure); i { + switch v := v.(*Ev_MetaEvent_CoreStart); i { case 0: return &v.state case 1: @@ -655,7 +735,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_EnvironmentEvent); i { + switch v := v.(*Ev_MetaEvent_FrameworkEvent); i { case 0: return &v.state case 1: @@ -667,7 +747,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskEvent); i { + switch v := v.(*Ev_EnvironmentEvent); i { case 0: return &v.state case 1: @@ -679,7 +759,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_RoleEvent); i { + switch v := v.(*Ev_TaskEvent); i { case 0: return &v.state case 1: @@ -691,6 +771,18 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RoleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -703,12 +795,13 @@ func file_protos_events_proto_init() { } } } - file_protos_events_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_protos_events_proto_msgTypes[6].OneofWrappers = []interface{}{ (*Event_EnvironmentEvent)(nil), (*Event_TaskEvent)(nil), (*Event_RoleEvent)(nil), - (*Event_FrameworkFailureEvent)(nil), + (*Event_FrameworkEvent)(nil), (*Event_MesosHeartbeatEvent)(nil), + (*Event_CoreStartEvent)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -716,7 +809,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index cc9fc3fb2..1996acb75 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -33,8 +33,13 @@ option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; message Ev_MetaEvent_MesosHeartbeat { } -message Ev_MetaEvent_FrameworkFailure { - string message = 1; +message Ev_MetaEvent_CoreStart { + string frameworkId = 1; +} + +message Ev_MetaEvent_FrameworkEvent { + string frameworkId = 1; + string message = 2; } message Ev_EnvironmentEvent { @@ -69,7 +74,8 @@ message Event { Ev_EnvironmentEvent environmentEvent = 2; Ev_TaskEvent taskEvent = 3; Ev_RoleEvent roleEvent = 4; - Ev_MetaEvent_FrameworkFailure frameworkFailureEvent = 5; + Ev_MetaEvent_FrameworkEvent frameworkEvent = 5; Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 6; + Ev_MetaEvent_CoreStart coreStartEvent = 7; } } diff --git a/common/runtype/runtype.go b/common/runtype/runtype.go index 15ac96049..419684faa 100644 --- a/common/runtype/runtype.go +++ b/common/runtype/runtype.go @@ -30,6 +30,8 @@ package runtype // NOTE: this run type list is replicated in AliceO2 repo in // https://github.com/AliceO2Group/AliceO2/blob/dev/DataFormats/Parameters/include/DataFormatsParameters/ECSDataAdapters.h // Inform Ruben when the list is updated. +// NOTE: this run type list is replicated in Bookkeeping upstream, common.proto +// Inform George/Martin when the list is updated. type RunType int const ( diff --git a/core/core.go b/core/core.go index 26e9d55d7..d52d4f340 100644 --- a/core/core.go +++ b/core/core.go @@ -31,6 +31,7 @@ import ( "syscall" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/common/logger" @@ -40,7 +41,7 @@ import ( "github.com/spf13/viper" ) -var log = logger.New(logrus.StandardLogger(),"core") +var log = logger.New(logrus.StandardLogger(), "core") const fileLimitWant = 65536 const fileLimitMin = 8192 @@ -72,7 +73,7 @@ func Run() error { return err } - // Set up channel to receive Unix Signals. + // Set up channel to receive Unix Signals signals(state) // Raise soft file limit @@ -90,6 +91,11 @@ func Run() error { state.taskman.Start(ctx) + // First message to Kafka + the.EventWriter().WriteEvent(&pb.Ev_MetaEvent_CoreStart{ + FrameworkId: state.taskman.GetFrameworkID(), + }) + // Plugins need to start after taskman is running, because taskman provides the FID integration.PluginsInstance().InitAll(state.taskman.GetFrameworkID()) @@ -99,7 +105,7 @@ func Run() error { WithField("port", viper.GetInt("controlPort")). Fatal("net.Listener failed to listen") } - if err := s.Serve(lis); err != nil { + if err = s.Serve(lis); err != nil { log.WithField("error", err).Fatal("GRPC server failed to serve") } diff --git a/core/environment/environment.go b/core/environment/environment.go index 41a365027..6e5e79101 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -37,9 +37,11 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" @@ -95,8 +97,8 @@ func (env *Environment) NotifyEvent(e event.DeviceEvent) { } } -func newEnvironment(userVars map[string]string) (env *Environment, err error) { - envId := uid.New() +func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, err error) { + envId := newId env = &Environment{ id: envId, workflow: nil, @@ -152,6 +154,17 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { fsm.Callbacks{ "before_event": func(_ context.Context, e *fsm.Event) { env.currentTransition = e.Event + trigger := fmt.Sprintf("before_%s", e.Event) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.GetCurrentRunNumber(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + }) + // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially @@ -227,27 +240,135 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { ) } - errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("before_%s", e.Event)) + errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) } + + errorMsg := "" + if e.Err != nil { + errorMsg = e.Err.Error() + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + }) }, "leave_state": func(_ context.Context, e *fsm.Event) { - errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("leave_%s", e.Src)) + trigger := fmt.Sprintf("leave_%s", e.Src) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + }) + + // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. + if e.Src == "RUNNING" { + endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + if ok && endTime == "" { + runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + } else { + log.WithField("partition", envId.String()). + Debug("O2 End time already set before leave_RUNNING") + } + } + errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) + } + + errorMsg := "" + if e.Err != nil { + errorMsg = e.Err.Error() + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + }) + + if e.Err != nil { return } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Message: "transition step starting", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + }) + env.handlerFunc()(e) + + if e.Err != nil { + errorMsg = e.Err.Error() + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + }) + }, "enter_state": func(_ context.Context, e *fsm.Event) { - enterStateTimeMs := strconv.FormatInt(time.Now().UnixMilli(), 10) + trigger := fmt.Sprintf("enter_%s", e.Dst) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + }) + + enterStateTimeMs = strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("enter_state_time_ms", enterStateTimeMs) - errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("enter_%s", e.Dst)) + errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) + } + + errorMsg := "" + if e.Err != nil { + errorMsg = e.Err.Error() + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + }) + + if e.Err != nil { return } @@ -261,7 +382,18 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { "after_event": func(_ context.Context, e *fsm.Event) { defer func() { env.currentTransition = "" }() - errHooks := env.handleHooks(env.Workflow(), fmt.Sprintf("after_%s", e.Event)) + trigger := fmt.Sprintf("after_%s", e.Event) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + }) + + errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) } @@ -306,6 +438,21 @@ func newEnvironment(userVars map[string]string) (env *Environment, err error) { // Ensure the auto stop timer is stopped (important for stop transitions NOT triggered by the timer itself) env.invalidateAutoStopTransition() } + + errorMsg := "" + if e.Err != nil { + errorMsg = e.Err.Error() + } + // publish transition step complete event + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + }) }, }, ) @@ -614,11 +761,46 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map } func (env *Environment) TryTransition(t Transition) (err error) { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Message: "transition starting", + Transition: t.eventName(), + }) + err = t.check() if err != nil { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition impossible", + Transition: t.eventName(), + }) return } err = env.Sm.Event(context.Background(), t.eventName(), t) + + if err != nil { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition error", + Transition: t.eventName(), + }) + } else { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + CurrentRunNumber: env.currentRunNumber, + Message: "transition completed successfully", + Transition: t.eventName(), + }) + } return } diff --git a/core/environment/manager.go b/core/environment/manager.go index f3d8cc3f0..c47599874 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -35,7 +35,9 @@ import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + evpb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" @@ -199,12 +201,20 @@ func (envs *Manager) GetActiveDetectors() system.IDMap { return response } -func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string) (uid.ID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string, public bool, newId uid.ID) (uid.ID, error) { // Before we load the workflow, we get the list of currently active detectors. This query must be performed before // loading the workflow in order to compare the currently used detectors with the detectors required by the newly // created environment. alreadyActiveDetectors := envs.GetActiveDetectors() + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "instantiating", + }) + // userVar identifiers come in 2 forms: // environment user var: "someKey" // workflow user var: "path.to.some.role:someKey" @@ -246,31 +256,44 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } var env *Environment - env, err = newEnvironment(envUserVars) - newEnvId := uid.NilID() + env, err = newEnvironment(envUserVars, newId) + if public { + env.Public = true + } + + gotEnvId := uid.NilID() if err == nil { if env != nil { - newEnvId = env.Id() + gotEnvId = env.Id() } else { err = errors.New("newEnvironment returned nil environment") log.WithError(err). + WithField("partition", newId.String()). Logf(logrus.FatalLevel, "environment creation failed") } } if err != nil { log.WithError(err). - WithField("partition", newEnvId.String()). + WithField("partition", gotEnvId.String()). Logf(logrus.FatalLevel, "environment creation failed") - return newEnvId, err + return gotEnvId, err } log.WithFields(logrus.Fields{ "workflow": workflowPath, - "partition": newEnvId.String(), + "partition": gotEnvId.String(), }).Info("creating new environment") + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "running hooks", + }) + env.hookHandlerF = func(hooks task.Tasks) error { - return envs.taskman.TriggerHooks(newEnvId, hooks) + return envs.taskman.TriggerHooks(gotEnvId, hooks) } // Ensure the environment_id is available to all @@ -284,9 +307,17 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("partition", env.Id().String()). WithError(err). Warn("parse workflow public info failed.") - return newEnvId, fmt.Errorf("workflow public info parsing failed: %w", err) + return gotEnvId, fmt.Errorf("workflow public info parsing failed: %w", err) } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "CREATE", + Message: "loading workflow", + }) + // We load the workflow (includes template processing) env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars, env.BaseConfigStack) if err != nil { @@ -311,7 +342,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] env.GlobalDefaults.Set("detectors", detectorsStr) log.WithFields(logrus.Fields{ - "partition": newEnvId.String(), + "partition": gotEnvId.String(), }).Infof("detectors in environment: %s", strings.Join(detectors, " ")) // env.GetActiveDetectors() is valid starting now, so we can check for detector exclusion @@ -323,6 +354,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: env.CurrentState(), + Transition: "CREATE", + TransitionStep: "after_CREATE", + Message: "workflow loaded", + }) + log.WithField("method", "CreateEnvironment"). WithField("level", infologger.IL_Devel). Debug("envman write lock") @@ -844,7 +883,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } // FIXME: this function should be deduplicated with CreateEnvironment so detector resource matching works correctly -func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, sub Subscription) { +func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, newId uid.ID, sub Subscription) { envUserVars := make(map[string]string) workflowUserVars := make(map[string]string) @@ -856,7 +895,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } } - env, err := newEnvironment(envUserVars) + env, err := newEnvironment(envUserVars, newId) newEnvId := uid.NilID() if err == nil && env != nil { newEnvId = env.Id() diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 5b01e7a4e..3cf7cfa85 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -47,7 +47,8 @@ const ( // Symbols defined in public import of protos/events.proto. type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat -type Ev_MetaEvent_FrameworkFailure = protos.Ev_MetaEvent_FrameworkFailure +type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart +type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_RoleEvent = protos.Ev_RoleEvent @@ -55,8 +56,9 @@ type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent -type Event_FrameworkFailureEvent = protos.Event_FrameworkFailureEvent +type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent +type Event_CoreStartEvent = protos.Event_CoreStartEvent type ControlEnvironmentRequest_Optype int32 diff --git a/core/server.go b/core/server.go index 376f4eb95..0b63741f4 100644 --- a/core/server.go +++ b/core/server.go @@ -33,7 +33,9 @@ import ( "strconv" "time" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + evpb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" @@ -156,14 +158,6 @@ func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) return r, nil } -func (*RpcServer) TrackStatus(*pb.StatusRequest, pb.Control_TrackStatusServer) error { - log.WithPrefix("rpcserver"). - WithField("method", "TrackStatus"). - Debug("implement me") - - return status.New(codes.Unimplemented, "not implemented").Err() -} - func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoRequest) (*pb.GetFrameworkInfoReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() @@ -300,6 +294,58 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm return r, nil } +func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEnvironmentRequest, id uid.ID) { + var err error + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id) + if err != nil { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: id.String(), + State: "ERROR", + Error: "cannot create new environment", + Message: err.Error(), + }) + return + } + + newEnv, err := m.state.environments.Environment(id) + if err != nil { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: id.String(), + State: "ERROR", + Error: "cannot get newly created environment", + Message: err.Error(), + }) + return + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: id.String(), + State: newEnv.CurrentState(), + }) + return +} + +func (m *RpcServer) NewEnvironmentAsync(cxt context.Context, request *pb.NewEnvironmentRequest) (reply *pb.NewEnvironmentReply, err error) { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) + m.logMethod() + + // Create new Environment instance with some roles, we get back a UUID + id := uid.New() + + go m.doNewEnvironmentAsync(cxt, request, id) + + ei := &pb.EnvironmentInfo{ + Id: id.String(), + State: "PENDING", + UserVars: request.GetVars(), + } + reply = &pb.NewEnvironmentReply{ + Environment: ei, + Public: request.GetPublic(), + } + return +} + func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironmentRequest) (reply *pb.NewEnvironmentReply, err error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() @@ -331,8 +377,8 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme reply = &pb.NewEnvironmentReply{Public: request.Public} // Create new Environment instance with some roles, we get back a UUID - id := uid.NilID() - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars()) + id := uid.New() + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id) if err != nil { st := status.Newf(codes.Internal, "cannot create new environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ @@ -362,10 +408,6 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme return } - if request.Public { - newEnv.Public = request.Public - } - tasks := newEnv.Workflow().GetTasks() var defaults, vars, userVars map[string]string defaults, vars, userVars, err = newEnv.Workflow().ConsolidatedVarMaps() @@ -1064,8 +1106,8 @@ func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_Subscribe defer m.logMethodHandled() for { - ch, ok := m.envStreams.GetChannel(req.GetId()) - if !ok { + ch, chOk := m.envStreams.GetChannel(req.GetId()) + if !chOk { continue } select { @@ -1092,7 +1134,8 @@ func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoE ch := make(chan *pb.Event) m.envStreams.add(request.GetId(), ch) sub := environment.SubscribeToStream(ch) - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), sub) + id := uid.New() + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), id, sub) r := &pb.NewAutoEnvironmentReply{} return r, nil } diff --git a/core/the/eventwriter.go b/core/the/eventwriter.go index 9946b498d..8c66950d2 100644 --- a/core/the/eventwriter.go +++ b/core/the/eventwriter.go @@ -30,7 +30,7 @@ import ( ) func EventWriter() *event.Writer { - return EventWriterWithTopic("") + return EventWriterWithTopic(topic.Root) } func EventWriterWithTopic(topic topic.Topic) *event.Writer { From 70056c0c3500dafd7ab5aa504d98be160e5abae0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Feb 2023 14:58:30 +0100 Subject: [PATCH 1821/2352] [coconut] Add asynchronous mode (-y) to coconut env create command --- coconut/cmd/environment_create.go | 1 + 1 file changed, 1 insertion(+) diff --git a/coconut/cmd/environment_create.go b/coconut/cmd/environment_create.go index 76069e2c4..5cdce95bf 100644 --- a/coconut/cmd/environment_create.go +++ b/coconut/cmd/environment_create.go @@ -66,6 +66,7 @@ func init() { environmentCreateCmd.Flags().BoolP("auto", "a", false, "create an autorun environment") environmentCreateCmd.Flags().BoolP("public", "p", true, "control public rights of the environment") + environmentCreateCmd.Flags().BoolP("asynchronous", "y", false, "use asynchronous mode for environment creation") environmentCreateCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") } From 3e3b30198d4e47c715a0ca9887c54fc52f2f65c9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Feb 2024 14:47:37 +0100 Subject: [PATCH 1822/2352] [coconut] Implement coconut env create -y --- coconut/control/control.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 5dc0768c7..3bc78d291 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -420,8 +420,14 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C // TODO: add support for setting visibility here OCTRL-178 // TODO: add support for acquiring bot config here OCTRL-177 + asynchronous, _ := cmd.Flags().GetBool("asynchronous") + var response *pb.NewEnvironmentReply - response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) + if asynchronous { + response, err = rpc.NewEnvironmentAsync(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) + } else { + response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) + } if err != nil { return } From d02485cb9d6daa1d1756465a01e11fe7bd286d99 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Feb 2023 16:44:16 +0100 Subject: [PATCH 1823/2352] [core] Add task traits and CallEvent to events.proto --- common/protos/events.proto | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/common/protos/events.proto b/common/protos/events.proto index 1996acb75..11bade7b2 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -52,6 +52,13 @@ message Ev_EnvironmentEvent { string transitionStep = 7; } +message Traits { + string trigger = 1; + string await = 2; + string timeout = 3; + bool critical = 4; +} + message Ev_TaskEvent { string name = 1; string taskid = 2; @@ -59,6 +66,16 @@ message Ev_TaskEvent { string status = 4; string hostname = 5; string className = 6; + Traits traits = 7; +} + +message Ev_CallEvent { + string func = 1; + string status = 2; + string return = 3; + Traits traits = 4; + string output = 5; + string error = 6; } message Ev_RoleEvent { From b8b11e9396918b6312d857729427da251bca353c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Feb 2024 15:00:55 +0100 Subject: [PATCH 1824/2352] [common] Add CallEvent --- coconut/protos/o2control.pb.go | 3 + common/event/writer.go | 5 + common/protos/events.pb.go | 402 ++++++++++++++++++++++++++------- common/protos/events.proto | 17 +- core/protos/o2control.pb.go | 3 + 5 files changed, 340 insertions(+), 90 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 3cf7cfa85..b7f7160f8 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -50,12 +50,15 @@ type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent +type Traits = protos.Traits type Ev_TaskEvent = protos.Ev_TaskEvent +type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent +type Event_CallEvent = protos.Event_CallEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent diff --git a/common/event/writer.go b/common/event/writer.go index 87196e792..a101a6d1f 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -88,6 +88,11 @@ func (w *Writer) WriteEvent(e interface{}) { Timestamp: time.Now().UnixMilli(), Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, }) + case *pb.Ev_CallEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: time.Now().UnixMilli(), + Payload: &pb.Event_CallEvent{CallEvent: e}, + }) default: err = fmt.Errorf("unsupported event type") } diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index c6e672ee9..5e5bc6798 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -278,23 +278,95 @@ func (x *Ev_EnvironmentEvent) GetTransitionStep() string { return "" } +type Traits struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Trigger string `protobuf:"bytes,1,opt,name=trigger,proto3" json:"trigger,omitempty"` + Await string `protobuf:"bytes,2,opt,name=await,proto3" json:"await,omitempty"` + Timeout string `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` + Critical bool `protobuf:"varint,4,opt,name=critical,proto3" json:"critical,omitempty"` +} + +func (x *Traits) Reset() { + *x = Traits{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Traits) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Traits) ProtoMessage() {} + +func (x *Traits) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Traits.ProtoReflect.Descriptor instead. +func (*Traits) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{4} +} + +func (x *Traits) GetTrigger() string { + if x != nil { + return x.Trigger + } + return "" +} + +func (x *Traits) GetAwait() string { + if x != nil { + return x.Await + } + return "" +} + +func (x *Traits) GetTimeout() string { + if x != nil { + return x.Timeout + } + return "" +} + +func (x *Traits) GetCritical() bool { + if x != nil { + return x.Critical + } + return false +} + type Ev_TaskEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` } func (x *Ev_TaskEvent) Reset() { *x = Ev_TaskEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[4] + mi := &file_protos_events_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -307,7 +379,7 @@ func (x *Ev_TaskEvent) String() string { func (*Ev_TaskEvent) ProtoMessage() {} func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[4] + mi := &file_protos_events_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -320,7 +392,7 @@ func (x *Ev_TaskEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use Ev_TaskEvent.ProtoReflect.Descriptor instead. func (*Ev_TaskEvent) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{4} + return file_protos_events_proto_rawDescGZIP(), []int{5} } func (x *Ev_TaskEvent) GetName() string { @@ -365,6 +437,100 @@ func (x *Ev_TaskEvent) GetClassName() string { return "" } +func (x *Ev_TaskEvent) GetTraits() *Traits { + if x != nil { + return x.Traits + } + return nil +} + +type Ev_CallEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` + Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` + Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` +} + +func (x *Ev_CallEvent) Reset() { + *x = Ev_CallEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_CallEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_CallEvent) ProtoMessage() {} + +func (x *Ev_CallEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_CallEvent.ProtoReflect.Descriptor instead. +func (*Ev_CallEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{6} +} + +func (x *Ev_CallEvent) GetFunc() string { + if x != nil { + return x.Func + } + return "" +} + +func (x *Ev_CallEvent) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *Ev_CallEvent) GetReturn() string { + if x != nil { + return x.Return + } + return "" +} + +func (x *Ev_CallEvent) GetTraits() *Traits { + if x != nil { + return x.Traits + } + return nil +} + +func (x *Ev_CallEvent) GetOutput() string { + if x != nil { + return x.Output + } + return "" +} + +func (x *Ev_CallEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + type Ev_RoleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -379,7 +545,7 @@ type Ev_RoleEvent struct { func (x *Ev_RoleEvent) Reset() { *x = Ev_RoleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[5] + mi := &file_protos_events_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -392,7 +558,7 @@ func (x *Ev_RoleEvent) String() string { func (*Ev_RoleEvent) ProtoMessage() {} func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[5] + mi := &file_protos_events_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -405,7 +571,7 @@ func (x *Ev_RoleEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use Ev_RoleEvent.ProtoReflect.Descriptor instead. func (*Ev_RoleEvent) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{5} + return file_protos_events_proto_rawDescGZIP(), []int{7} } func (x *Ev_RoleEvent) GetName() string { @@ -447,6 +613,7 @@ type Event struct { // *Event_EnvironmentEvent // *Event_TaskEvent // *Event_RoleEvent + // *Event_CallEvent // *Event_FrameworkEvent // *Event_MesosHeartbeatEvent // *Event_CoreStartEvent @@ -456,7 +623,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[6] + mi := &file_protos_events_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -469,7 +636,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[6] + mi := &file_protos_events_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -482,7 +649,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{6} + return file_protos_events_proto_rawDescGZIP(), []int{8} } func (x *Event) GetTimestamp() int64 { @@ -520,6 +687,13 @@ func (x *Event) GetRoleEvent() *Ev_RoleEvent { return nil } +func (x *Event) GetCallEvent() *Ev_CallEvent { + if x, ok := x.GetPayload().(*Event_CallEvent); ok { + return x.CallEvent + } + return nil +} + func (x *Event) GetFrameworkEvent() *Ev_MetaEvent_FrameworkEvent { if x, ok := x.GetPayload().(*Event_FrameworkEvent); ok { return x.FrameworkEvent @@ -546,27 +720,31 @@ type isEvent_Payload interface { } type Event_EnvironmentEvent struct { - EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,2,opt,name=environmentEvent,proto3,oneof"` + EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,11,opt,name=environmentEvent,proto3,oneof"` } type Event_TaskEvent struct { - TaskEvent *Ev_TaskEvent `protobuf:"bytes,3,opt,name=taskEvent,proto3,oneof"` + TaskEvent *Ev_TaskEvent `protobuf:"bytes,12,opt,name=taskEvent,proto3,oneof"` } type Event_RoleEvent struct { - RoleEvent *Ev_RoleEvent `protobuf:"bytes,4,opt,name=roleEvent,proto3,oneof"` + RoleEvent *Ev_RoleEvent `protobuf:"bytes,13,opt,name=roleEvent,proto3,oneof"` +} + +type Event_CallEvent struct { + CallEvent *Ev_CallEvent `protobuf:"bytes,14,opt,name=callEvent,proto3,oneof"` } type Event_FrameworkEvent struct { - FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,5,opt,name=frameworkEvent,proto3,oneof"` + FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,101,opt,name=frameworkEvent,proto3,oneof"` } type Event_MesosHeartbeatEvent struct { - MesosHeartbeatEvent *Ev_MetaEvent_MesosHeartbeat `protobuf:"bytes,6,opt,name=mesosHeartbeatEvent,proto3,oneof"` + MesosHeartbeatEvent *Ev_MetaEvent_MesosHeartbeat `protobuf:"bytes,102,opt,name=mesosHeartbeatEvent,proto3,oneof"` } type Event_CoreStartEvent struct { - CoreStartEvent *Ev_MetaEvent_CoreStart `protobuf:"bytes,7,opt,name=coreStartEvent,proto3,oneof"` + CoreStartEvent *Ev_MetaEvent_CoreStart `protobuf:"bytes,103,opt,name=coreStartEvent,proto3,oneof"` } func (*Event_EnvironmentEvent) isEvent_Payload() {} @@ -575,6 +753,8 @@ func (*Event_TaskEvent) isEvent_Payload() {} func (*Event_RoleEvent) isEvent_Payload() {} +func (*Event_CallEvent) isEvent_Payload() {} + func (*Event_FrameworkEvent) isEvent_Payload() {} func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} @@ -612,7 +792,14 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, 0xa2, 0x01, 0x0a, 0x0c, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, 0x6e, 0x0a, 0x06, 0x54, + 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xca, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -623,49 +810,66 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0xd9, - 0x03, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, - 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, - 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, - 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, - 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, - 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, - 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, + 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, + 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, + 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, + 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, + 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x22, 0x9b, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, + 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, + 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, + 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x65, 0x42, + 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -680,28 +884,33 @@ func file_protos_events_proto_rawDescGZIP() []byte { return file_protos_events_proto_rawDescData } -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 9) var file_protos_events_proto_goTypes = []interface{}{ (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat (*Ev_MetaEvent_CoreStart)(nil), // 1: events.Ev_MetaEvent_CoreStart (*Ev_MetaEvent_FrameworkEvent)(nil), // 2: events.Ev_MetaEvent_FrameworkEvent (*Ev_EnvironmentEvent)(nil), // 3: events.Ev_EnvironmentEvent - (*Ev_TaskEvent)(nil), // 4: events.Ev_TaskEvent - (*Ev_RoleEvent)(nil), // 5: events.Ev_RoleEvent - (*Event)(nil), // 6: events.Event + (*Traits)(nil), // 4: events.Traits + (*Ev_TaskEvent)(nil), // 5: events.Ev_TaskEvent + (*Ev_CallEvent)(nil), // 6: events.Ev_CallEvent + (*Ev_RoleEvent)(nil), // 7: events.Ev_RoleEvent + (*Event)(nil), // 8: events.Event } var file_protos_events_proto_depIdxs = []int32{ - 3, // 0: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 4, // 1: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 5, // 2: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 2, // 3: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 0, // 4: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 1, // 5: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 4, // 0: events.Ev_TaskEvent.traits:type_name -> events.Traits + 4, // 1: events.Ev_CallEvent.traits:type_name -> events.Traits + 3, // 2: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 5, // 3: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 7, // 4: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 6, // 5: events.Event.callEvent:type_name -> events.Ev_CallEvent + 2, // 6: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 0, // 7: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 1, // 8: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 9, // [9:9] is the sub-list for method output_type + 9, // [9:9] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -759,7 +968,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_TaskEvent); i { + switch v := v.(*Traits); i { case 0: return &v.state case 1: @@ -771,7 +980,7 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Ev_RoleEvent); i { + switch v := v.(*Ev_TaskEvent); i { case 0: return &v.state case 1: @@ -783,6 +992,30 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_CallEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RoleEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -795,10 +1028,11 @@ func file_protos_events_proto_init() { } } } - file_protos_events_proto_msgTypes[6].OneofWrappers = []interface{}{ + file_protos_events_proto_msgTypes[8].OneofWrappers = []interface{}{ (*Event_EnvironmentEvent)(nil), (*Event_TaskEvent)(nil), (*Event_RoleEvent)(nil), + (*Event_CallEvent)(nil), (*Event_FrameworkEvent)(nil), (*Event_MesosHeartbeatEvent)(nil), (*Event_CoreStartEvent)(nil), @@ -809,7 +1043,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 9, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index 11bade7b2..99a99b720 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -87,12 +87,17 @@ message Ev_RoleEvent { message Event { int64 timestamp = 1; + reserved 2 to 10; + reserved 15 to 100; + oneof Payload { - Ev_EnvironmentEvent environmentEvent = 2; - Ev_TaskEvent taskEvent = 3; - Ev_RoleEvent roleEvent = 4; - Ev_MetaEvent_FrameworkEvent frameworkEvent = 5; - Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 6; - Ev_MetaEvent_CoreStart coreStartEvent = 7; + Ev_EnvironmentEvent environmentEvent = 11; + Ev_TaskEvent taskEvent = 12; + Ev_RoleEvent roleEvent = 13; + Ev_CallEvent callEvent = 14; + + Ev_MetaEvent_FrameworkEvent frameworkEvent = 101; + Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 102; + Ev_MetaEvent_CoreStart coreStartEvent = 103; } } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 3cf7cfa85..b7f7160f8 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -50,12 +50,15 @@ type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent type Ev_EnvironmentEvent = protos.Ev_EnvironmentEvent +type Traits = protos.Traits type Ev_TaskEvent = protos.Ev_TaskEvent +type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent +type Event_CallEvent = protos.Event_CallEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent From 26730e7d82cae364d4015512004d90f696234699 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 16 Feb 2023 16:46:01 +0100 Subject: [PATCH 1825/2352] [core] Emit call events to inform on plugin calls --- core/workflow/callable/call.go | 63 +++++++++++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index d30a40479..daf8f0757 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -33,12 +33,15 @@ import ( "time" "github.com/AliceO2Group/Control/apricot" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + evpb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/the" "github.com/sirupsen/logrus" ) @@ -107,6 +110,19 @@ func (c *Call) Call() error { WithField("partition", c.parentRole.GetEnvironmentId().String()). WithField("level", infologger.IL_Devel). Debugf("calling hook function %s", c.Func) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + Func: c.Func, + Status: "STARTED", + Return: c.Return, + Traits: &evpb.Traits{ + Trigger: c.Traits.Trigger, + Await: c.Traits.Await, + Timeout: c.Traits.Timeout, + Critical: c.Traits.Critical, + }, + }) + output := "{{" + c.Func + "}}" returnVar := c.Return fields := template.Fields{ @@ -130,8 +146,25 @@ func (c *Call) Call() error { objStack := integration.PluginsInstance().CallStack(c) + var errMsg string err = fields.Execute(apricot.Instance(), c.GetName(), c.VarStack, objStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { + errMsg = err.Error() + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + Func: c.Func, + Status: "ERROR", + Return: c.Return, + Traits: &evpb.Traits{ + Trigger: c.Traits.Trigger, + Await: c.Traits.Await, + Timeout: c.Traits.Timeout, + Critical: c.Traits.Critical, + }, + Output: output, + Error: errMsg, + }) + return err } if len(returnVar) > 0 { @@ -139,13 +172,41 @@ func (c *Call) Call() error { } // if __call_error was written into the VarStack we treat it as an error exit from the call - if errMsg, ok := c.VarStack["__call_error"]; ok && len(errMsg) > 0 { + var ok bool + if errMsg, ok = c.VarStack["__call_error"]; ok && len(errMsg) > 0 { if errReason, ok := c.VarStack["__call_error_reason"]; ok && len(errReason) > 0 { errMsg += ". REASON: " + errReason } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + Func: c.Func, + Status: "ERROR", + Return: c.Return, + Traits: &evpb.Traits{ + Trigger: c.Traits.Trigger, + Await: c.Traits.Await, + Timeout: c.Traits.Timeout, + Critical: c.Traits.Critical, + }, + Output: output, + Error: errMsg, + }) + return errors.New(errMsg) } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + Func: c.Func, + Status: "DONE", + Return: c.Return, + Traits: &evpb.Traits{ + Trigger: c.Traits.Trigger, + Await: c.Traits.Await, + Timeout: c.Traits.Timeout, + Critical: c.Traits.Critical, + }, + Output: output, + }) + return nil } From f9ae33203ca29cb16b86009a911a536254c47ccd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Feb 2024 15:44:35 +0100 Subject: [PATCH 1826/2352] [core] Send EnvId with TaskEvents --- common/protos/events.pb.go | 124 ++++++++++++++++++++----------------- common/protos/events.proto | 1 + core/task/task.go | 22 +++++++ 3 files changed, 90 insertions(+), 57 deletions(-) diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 5e5bc6798..954662a57 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -361,6 +361,7 @@ type Ev_TaskEvent struct { Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` + Envid string `protobuf:"bytes,8,opt,name=envid,proto3" json:"envid,omitempty"` } func (x *Ev_TaskEvent) Reset() { @@ -444,6 +445,13 @@ func (x *Ev_TaskEvent) GetTraits() *Traits { return nil } +func (x *Ev_TaskEvent) GetEnvid() string { + if x != nil { + return x.Envid + } + return "" +} + type Ev_CallEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -799,7 +807,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xca, 0x01, 0x0a, 0x0c, + 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xe0, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -812,64 +820,66 @@ var file_protos_events_proto_rawDesc = []byte{ 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, - 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, - 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, - 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, + 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x69, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x69, 0x64, 0x22, 0xa8, + 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, + 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, + 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, + 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, - 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, - 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x22, 0x9b, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9b, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, + 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, - 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, - 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x65, 0x42, - 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, + 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, + 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, + 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, + 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, + 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, + 0x04, 0x08, 0x0f, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/common/protos/events.proto b/common/protos/events.proto index 99a99b720..6c5366dec 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -67,6 +67,7 @@ message Ev_TaskEvent { string hostname = 5; string className = 6; Traits traits = 7; + string envid = 8; } message Ev_CallEvent { diff --git a/core/task/task.go b/core/task/task.go index 7e328cf62..b58015632 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -41,8 +41,10 @@ import ( "github.com/AliceO2Group/Control/common" "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" + evpb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" @@ -497,9 +499,29 @@ func (t *Task) SendEvent(ev event.Event) { t.mu.RLock() defer t.mu.RUnlock() + busEvent := &evpb.Ev_TaskEvent{ + Name: t.name, + Taskid: t.taskId, + State: t.state.String(), + Status: t.status.String(), + Hostname: t.hostname, + ClassName: t.className, + } + if t.parent == nil { + the.EventWriterWithTopic(topic.Task).WriteEvent(busEvent) return } + + busEvent.Envid = t.parent.GetEnvironmentId().String() + + taskEvent, ok := ev.(*event.TaskEvent) + if ok { + busEvent.State = taskEvent.State + busEvent.Status = taskEvent.Status + } + the.EventWriterWithTopic(topic.Task).WriteEvent(busEvent) + t.parent.SendEvent(ev) } From 3ec3231138d0776b8522d63c91d49221aeaee2f9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Mar 2024 14:18:48 +0100 Subject: [PATCH 1827/2352] [core] Rename busEvent in task.go --- core/task/task.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index b58015632..1ef4b895a 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -499,7 +499,7 @@ func (t *Task) SendEvent(ev event.Event) { t.mu.RLock() defer t.mu.RUnlock() - busEvent := &evpb.Ev_TaskEvent{ + outgoingEvent := &evpb.Ev_TaskEvent{ Name: t.name, Taskid: t.taskId, State: t.state.String(), @@ -509,18 +509,18 @@ func (t *Task) SendEvent(ev event.Event) { } if t.parent == nil { - the.EventWriterWithTopic(topic.Task).WriteEvent(busEvent) + the.EventWriterWithTopic(topic.Task).WriteEvent(outgoingEvent) return } - busEvent.Envid = t.parent.GetEnvironmentId().String() + outgoingEvent.Envid = t.parent.GetEnvironmentId().String() taskEvent, ok := ev.(*event.TaskEvent) if ok { - busEvent.State = taskEvent.State - busEvent.Status = taskEvent.Status + outgoingEvent.State = taskEvent.State + outgoingEvent.Status = taskEvent.Status } - the.EventWriterWithTopic(topic.Task).WriteEvent(busEvent) + the.EventWriterWithTopic(topic.Task).WriteEvent(outgoingEvent) t.parent.SendEvent(ev) } From b6a686a976866bc4acf95f7b59ae2a85e09b324d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 8 Mar 2024 16:00:38 +0100 Subject: [PATCH 1828/2352] [core] Add IntegratedServiceEvent and rename Envid field --- coconut/protos/o2control.pb.go | 2 + common/event/writer.go | 1 + common/protos/events.pb.go | 263 +++++++++++++++++++++++++-------- common/protos/events.proto | 14 +- core/protos/o2control.pb.go | 2 + core/task/task.go | 2 +- 6 files changed, 217 insertions(+), 67 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index b7f7160f8..e96f95850 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -54,11 +54,13 @@ type Traits = protos.Traits type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent +type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent type Event_CallEvent = protos.Event_CallEvent +type Event_IntegratedServiceEvent = protos.Event_IntegratedServiceEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent diff --git a/common/event/writer.go b/common/event/writer.go index a101a6d1f..df3ad0353 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -93,6 +93,7 @@ func (w *Writer) WriteEvent(e interface{}) { Timestamp: time.Now().UnixMilli(), Payload: &pb.Event_CallEvent{CallEvent: e}, }) + default: err = fmt.Errorf("unsupported event type") } diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 954662a57..9ef4a9e84 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -354,14 +354,14 @@ type Ev_TaskEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` - Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` - Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` - Envid string `protobuf:"bytes,8,opt,name=envid,proto3" json:"envid,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` + EnvironmentId string `protobuf:"bytes,8,opt,name=environmentId,proto3" json:"environmentId,omitempty"` } func (x *Ev_TaskEvent) Reset() { @@ -445,9 +445,9 @@ func (x *Ev_TaskEvent) GetTraits() *Traits { return nil } -func (x *Ev_TaskEvent) GetEnvid() string { +func (x *Ev_TaskEvent) GetEnvironmentId() string { if x != nil { - return x.Envid + return x.EnvironmentId } return "" } @@ -544,10 +544,11 @@ type Ev_RoleEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` + EnvironmentId string `protobuf:"bytes,5,opt,name=environmentId,proto3" json:"environmentId,omitempty"` } func (x *Ev_RoleEvent) Reset() { @@ -610,6 +611,92 @@ func (x *Ev_RoleEvent) GetRolePath() string { return "" } +func (x *Ev_RoleEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +type Ev_IntegratedServiceEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + Call string `protobuf:"bytes,3,opt,name=call,proto3" json:"call,omitempty"` + EnvironmentId string `protobuf:"bytes,4,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + Payload string `protobuf:"bytes,6,opt,name=payload,proto3" json:"payload,omitempty"` +} + +func (x *Ev_IntegratedServiceEvent) Reset() { + *x = Ev_IntegratedServiceEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_IntegratedServiceEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_IntegratedServiceEvent) ProtoMessage() {} + +func (x *Ev_IntegratedServiceEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_IntegratedServiceEvent.ProtoReflect.Descriptor instead. +func (*Ev_IntegratedServiceEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{8} +} + +func (x *Ev_IntegratedServiceEvent) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Ev_IntegratedServiceEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *Ev_IntegratedServiceEvent) GetCall() string { + if x != nil { + return x.Call + } + return "" +} + +func (x *Ev_IntegratedServiceEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *Ev_IntegratedServiceEvent) GetPayload() string { + if x != nil { + return x.Payload + } + return "" +} + type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -622,6 +709,7 @@ type Event struct { // *Event_TaskEvent // *Event_RoleEvent // *Event_CallEvent + // *Event_IntegratedServiceEvent // *Event_FrameworkEvent // *Event_MesosHeartbeatEvent // *Event_CoreStartEvent @@ -631,7 +719,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[8] + mi := &file_protos_events_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -644,7 +732,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[8] + mi := &file_protos_events_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -657,7 +745,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{8} + return file_protos_events_proto_rawDescGZIP(), []int{9} } func (x *Event) GetTimestamp() int64 { @@ -702,6 +790,13 @@ func (x *Event) GetCallEvent() *Ev_CallEvent { return nil } +func (x *Event) GetIntegratedServiceEvent() *Ev_IntegratedServiceEvent { + if x, ok := x.GetPayload().(*Event_IntegratedServiceEvent); ok { + return x.IntegratedServiceEvent + } + return nil +} + func (x *Event) GetFrameworkEvent() *Ev_MetaEvent_FrameworkEvent { if x, ok := x.GetPayload().(*Event_FrameworkEvent); ok { return x.FrameworkEvent @@ -743,6 +838,10 @@ type Event_CallEvent struct { CallEvent *Ev_CallEvent `protobuf:"bytes,14,opt,name=callEvent,proto3,oneof"` } +type Event_IntegratedServiceEvent struct { + IntegratedServiceEvent *Ev_IntegratedServiceEvent `protobuf:"bytes,15,opt,name=integratedServiceEvent,proto3,oneof"` +} + type Event_FrameworkEvent struct { FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,101,opt,name=frameworkEvent,proto3,oneof"` } @@ -763,6 +862,8 @@ func (*Event_RoleEvent) isEvent_Payload() {} func (*Event_CallEvent) isEvent_Payload() {} +func (*Event_IntegratedServiceEvent) isEvent_Payload() {} + func (*Event_FrameworkEvent) isEvent_Payload() {} func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} @@ -807,7 +908,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xe0, 0x01, 0x0a, 0x0c, + 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xf0, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -820,8 +921,9 @@ var file_protos_events_proto_rawDesc = []byte{ 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, - 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x69, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x69, 0x64, 0x22, 0xa8, + 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, @@ -832,31 +934,49 @@ var file_protos_events_proto_rawDesc = []byte{ 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6c, 0x0a, 0x0c, 0x45, 0x76, 0x5f, - 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x22, 0x9b, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, - 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, + 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x99, + 0x01, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, 0x05, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, @@ -873,7 +993,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, - 0x04, 0x08, 0x0f, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x04, 0x08, 0x10, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, @@ -894,7 +1014,7 @@ func file_protos_events_proto_rawDescGZIP() []byte { return file_protos_events_proto_rawDescData } -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 9) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_protos_events_proto_goTypes = []interface{}{ (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat (*Ev_MetaEvent_CoreStart)(nil), // 1: events.Ev_MetaEvent_CoreStart @@ -904,23 +1024,25 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Ev_TaskEvent)(nil), // 5: events.Ev_TaskEvent (*Ev_CallEvent)(nil), // 6: events.Ev_CallEvent (*Ev_RoleEvent)(nil), // 7: events.Ev_RoleEvent - (*Event)(nil), // 8: events.Event + (*Ev_IntegratedServiceEvent)(nil), // 8: events.Ev_IntegratedServiceEvent + (*Event)(nil), // 9: events.Event } var file_protos_events_proto_depIdxs = []int32{ - 4, // 0: events.Ev_TaskEvent.traits:type_name -> events.Traits - 4, // 1: events.Ev_CallEvent.traits:type_name -> events.Traits - 3, // 2: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 5, // 3: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 7, // 4: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 6, // 5: events.Event.callEvent:type_name -> events.Ev_CallEvent - 2, // 6: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 0, // 7: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 1, // 8: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 4, // 0: events.Ev_TaskEvent.traits:type_name -> events.Traits + 4, // 1: events.Ev_CallEvent.traits:type_name -> events.Traits + 3, // 2: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 5, // 3: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 7, // 4: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 6, // 5: events.Event.callEvent:type_name -> events.Ev_CallEvent + 8, // 6: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 2, // 7: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 0, // 8: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 1, // 9: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1026,6 +1148,18 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_IntegratedServiceEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -1038,11 +1172,12 @@ func file_protos_events_proto_init() { } } } - file_protos_events_proto_msgTypes[8].OneofWrappers = []interface{}{ + file_protos_events_proto_msgTypes[9].OneofWrappers = []interface{}{ (*Event_EnvironmentEvent)(nil), (*Event_TaskEvent)(nil), (*Event_RoleEvent)(nil), (*Event_CallEvent)(nil), + (*Event_IntegratedServiceEvent)(nil), (*Event_FrameworkEvent)(nil), (*Event_MesosHeartbeatEvent)(nil), (*Event_CoreStartEvent)(nil), @@ -1053,7 +1188,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 0, - NumMessages: 9, + NumMessages: 10, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index 6c5366dec..5201fe8a8 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -67,7 +67,7 @@ message Ev_TaskEvent { string hostname = 5; string className = 6; Traits traits = 7; - string envid = 8; + string environmentId = 8; } message Ev_CallEvent { @@ -84,18 +84,28 @@ message Ev_RoleEvent { string status = 2; string state = 3; string rolePath = 4; + string environmentId = 5; +} + +message Ev_IntegratedServiceEvent { + string name = 1; + string error = 2; + string call = 3; + string environmentId = 4; + string payload = 6; } message Event { int64 timestamp = 1; reserved 2 to 10; - reserved 15 to 100; + reserved 16 to 100; oneof Payload { Ev_EnvironmentEvent environmentEvent = 11; Ev_TaskEvent taskEvent = 12; Ev_RoleEvent roleEvent = 13; Ev_CallEvent callEvent = 14; + Ev_IntegratedServiceEvent integratedServiceEvent = 15; Ev_MetaEvent_FrameworkEvent frameworkEvent = 101; Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 102; diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index b7f7160f8..e96f95850 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -54,11 +54,13 @@ type Traits = protos.Traits type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent +type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent type Event_CallEvent = protos.Event_CallEvent +type Event_IntegratedServiceEvent = protos.Event_IntegratedServiceEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent diff --git a/core/task/task.go b/core/task/task.go index 1ef4b895a..682ea56d9 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -513,7 +513,7 @@ func (t *Task) SendEvent(ev event.Event) { return } - outgoingEvent.Envid = t.parent.GetEnvironmentId().String() + outgoingEvent.EnvironmentId = t.parent.GetEnvironmentId().String() taskEvent, ok := ev.(*event.TaskEvent) if ok { From fc487c0b7327d4d95d60d21075e0b85d585f89d7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 13 Mar 2024 14:25:54 +0100 Subject: [PATCH 1829/2352] [core] Push env vars on workflow load --- common/protos/events.pb.go | 263 +++++++++++++++++++----------------- common/protos/events.proto | 1 + core/environment/manager.go | 2 + 3 files changed, 143 insertions(+), 123 deletions(-) diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 9ef4a9e84..924d308d0 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -188,13 +188,14 @@ type Ev_EnvironmentEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` - Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` - TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` + Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` + TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` + Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Ev_EnvironmentEvent) Reset() { @@ -278,6 +279,13 @@ func (x *Ev_EnvironmentEvent) GetTransitionStep() string { return "" } +func (x *Ev_EnvironmentEvent) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + type Traits struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -886,7 +894,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0xf5, 0x01, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x61, 0x67, 0x65, 0x22, 0xe9, 0x02, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, @@ -901,105 +909,112 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x22, 0x6e, 0x0a, 0x06, 0x54, - 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0xf0, 0x01, 0x0a, 0x0c, - 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, - 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa8, - 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, - 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, - 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, - 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x99, - 0x01, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, 0x05, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, - 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, - 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, - 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, - 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, - 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, - 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x39, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6e, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, + 0xf0, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, + 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x92, 0x01, + 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, + 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x24, + 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, + 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, - 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, - 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, - 0x04, 0x08, 0x10, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, - 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1014,7 +1029,7 @@ func file_protos_events_proto_rawDescGZIP() []byte { return file_protos_events_proto_rawDescData } -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_protos_events_proto_goTypes = []interface{}{ (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat (*Ev_MetaEvent_CoreStart)(nil), // 1: events.Ev_MetaEvent_CoreStart @@ -1026,23 +1041,25 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Ev_RoleEvent)(nil), // 7: events.Ev_RoleEvent (*Ev_IntegratedServiceEvent)(nil), // 8: events.Ev_IntegratedServiceEvent (*Event)(nil), // 9: events.Event + nil, // 10: events.Ev_EnvironmentEvent.VarsEntry } var file_protos_events_proto_depIdxs = []int32{ - 4, // 0: events.Ev_TaskEvent.traits:type_name -> events.Traits - 4, // 1: events.Ev_CallEvent.traits:type_name -> events.Traits - 3, // 2: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 5, // 3: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 7, // 4: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 6, // 5: events.Event.callEvent:type_name -> events.Ev_CallEvent - 8, // 6: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 2, // 7: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 0, // 8: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 1, // 9: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 10, // [10:10] is the sub-list for method output_type - 10, // [10:10] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 10, // 0: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry + 4, // 1: events.Ev_TaskEvent.traits:type_name -> events.Traits + 4, // 2: events.Ev_CallEvent.traits:type_name -> events.Traits + 3, // 3: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 5, // 4: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 7, // 5: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 6, // 6: events.Event.callEvent:type_name -> events.Ev_CallEvent + 8, // 7: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 2, // 8: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 0, // 9: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 1, // 10: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 11, // [11:11] is the sub-list for method output_type + 11, // [11:11] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1188,7 +1205,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 11, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index 5201fe8a8..773a468c8 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -50,6 +50,7 @@ message Ev_EnvironmentEvent { string message = 5; string transition = 6; string transitionStep = 7; + map vars = 8; } message Traits { diff --git a/core/environment/manager.go b/core/environment/manager.go index c47599874..9dbfeb92d 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -354,12 +354,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } } + cvs, _ := env.Workflow().ConsolidatedVarStack() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: newId.String(), State: env.CurrentState(), Transition: "CREATE", TransitionStep: "after_CREATE", Message: "workflow loaded", + Vars: cvs, // we push the full var stack of the root role in the workflow loaded event }) log.WithField("method", "CreateEnvironment"). From 59021bf4562cbeeb4a3f9f9983ebaf84f69deff8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 14:42:38 +0100 Subject: [PATCH 1830/2352] [common] Allow event creation with specific timestamp --- common/event/writer.go | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index df3ad0353..72b2ad2d4 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -56,41 +56,45 @@ func NewWriterWithTopic(topic topic.Topic) *Writer { } func (w *Writer) WriteEvent(e interface{}) { + w.WriteEventWithTimestamp(e, time.Now()) +} + +func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { var err error switch e := e.(type) { case *pb.Ev_MetaEvent_CoreStart: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, }) case *pb.Ev_MetaEvent_MesosHeartbeat: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, }) case *pb.Ev_MetaEvent_FrameworkEvent: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, }) case *pb.Ev_TaskEvent: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_TaskEvent{TaskEvent: e}, }) case *pb.Ev_RoleEvent: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_RoleEvent{RoleEvent: e}, }) case *pb.Ev_EnvironmentEvent: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, }) case *pb.Ev_CallEvent: err = w.doWriteEvent(&pb.Event{ - Timestamp: time.Now().UnixMilli(), + Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_CallEvent{CallEvent: e}, }) From 85b80224ba3489831a68db21acf2d23043f2fb65 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 14:44:05 +0100 Subject: [PATCH 1831/2352] [common] Various additions to events in events.proto --- coconut/protos/o2control.pb.go | 12 + common/protos/events.pb.go | 418 ++++++++++++++++++++++----------- common/protos/events.proto | 25 +- core/protos/o2control.pb.go | 12 + 4 files changed, 322 insertions(+), 145 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index e96f95850..db47b3960 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -46,6 +46,18 @@ const ( // Symbols defined in public import of protos/events.proto. +type OpStatus = protos.OpStatus + +const OpStatus_NULL = protos.OpStatus_NULL +const OpStatus_STARTED = protos.OpStatus_STARTED +const OpStatus_ONGOING = protos.OpStatus_ONGOING +const OpStatus_DONE_OK = protos.OpStatus_DONE_OK +const OpStatus_DONE_ERROR = protos.OpStatus_DONE_ERROR +const OpStatus_DONE_TIMEOUT = protos.OpStatus_DONE_TIMEOUT + +var OpStatus_name = protos.OpStatus_name +var OpStatus_value = protos.OpStatus_value + type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 924d308d0..3845c4057 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -43,6 +43,64 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type OpStatus int32 + +const ( + OpStatus_NULL OpStatus = 0 + OpStatus_STARTED OpStatus = 1 + OpStatus_ONGOING OpStatus = 2 + OpStatus_DONE_OK OpStatus = 3 + OpStatus_DONE_ERROR OpStatus = 4 + OpStatus_DONE_TIMEOUT OpStatus = 5 +) + +// Enum value maps for OpStatus. +var ( + OpStatus_name = map[int32]string{ + 0: "NULL", + 1: "STARTED", + 2: "ONGOING", + 3: "DONE_OK", + 4: "DONE_ERROR", + 5: "DONE_TIMEOUT", + } + OpStatus_value = map[string]int32{ + "NULL": 0, + "STARTED": 1, + "ONGOING": 2, + "DONE_OK": 3, + "DONE_ERROR": 4, + "DONE_TIMEOUT": 5, + } +) + +func (x OpStatus) Enum() *OpStatus { + p := new(OpStatus) + *p = x + return p +} + +func (x OpStatus) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (OpStatus) Descriptor() protoreflect.EnumDescriptor { + return file_protos_events_proto_enumTypes[0].Descriptor() +} + +func (OpStatus) Type() protoreflect.EnumType { + return &file_protos_events_proto_enumTypes[0] +} + +func (x OpStatus) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use OpStatus.Descriptor instead. +func (OpStatus) EnumDescriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{0} +} + type Ev_MetaEvent_MesosHeartbeat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -195,7 +253,8 @@ type Ev_EnvironmentEvent struct { Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` - Vars map[string]string `protobuf:"bytes,8,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + TransitionStatus OpStatus `protobuf:"varint,8,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` + Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Ev_EnvironmentEvent) Reset() { @@ -279,6 +338,13 @@ func (x *Ev_EnvironmentEvent) GetTransitionStep() string { return "" } +func (x *Ev_EnvironmentEvent) GetTransitionStatus() OpStatus { + if x != nil { + return x.TransitionStatus + } + return OpStatus_NULL +} + func (x *Ev_EnvironmentEvent) GetVars() map[string]string { if x != nil { return x.Vars @@ -370,6 +436,7 @@ type Ev_TaskEvent struct { ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` EnvironmentId string `protobuf:"bytes,8,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + Path string `protobuf:"bytes,9,opt,name=path,proto3" json:"path,omitempty"` } func (x *Ev_TaskEvent) Reset() { @@ -460,17 +527,25 @@ func (x *Ev_TaskEvent) GetEnvironmentId() string { return "" } +func (x *Ev_TaskEvent) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + type Ev_CallEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` - Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` - Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` - Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` + CallStatus OpStatus `protobuf:"varint,2,opt,name=callStatus,proto3,enum=events.OpStatus" json:"callStatus,omitempty"` + Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` + Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` + Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + Path string `protobuf:"bytes,7,opt,name=path,proto3" json:"path,omitempty"` } func (x *Ev_CallEvent) Reset() { @@ -512,11 +587,11 @@ func (x *Ev_CallEvent) GetFunc() string { return "" } -func (x *Ev_CallEvent) GetStatus() string { +func (x *Ev_CallEvent) GetCallStatus() OpStatus { if x != nil { - return x.Status + return x.CallStatus } - return "" + return OpStatus_NULL } func (x *Ev_CallEvent) GetReturn() string { @@ -547,6 +622,13 @@ func (x *Ev_CallEvent) GetError() string { return "" } +func (x *Ev_CallEvent) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + type Ev_RoleEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -631,11 +713,14 @@ type Ev_IntegratedServiceEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - Call string `protobuf:"bytes,3,opt,name=call,proto3" json:"call,omitempty"` - EnvironmentId string `protobuf:"bytes,4,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - Payload string `protobuf:"bytes,6,opt,name=payload,proto3" json:"payload,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + OperationName string `protobuf:"bytes,3,opt,name=operationName,proto3" json:"operationName,omitempty"` + OperationStatus OpStatus `protobuf:"varint,4,opt,name=operationStatus,proto3,enum=events.OpStatus" json:"operationStatus,omitempty"` + OperationStep string `protobuf:"bytes,5,opt,name=operationStep,proto3" json:"operationStep,omitempty"` + OperationStepStatus OpStatus `protobuf:"varint,6,opt,name=operationStepStatus,proto3,enum=events.OpStatus" json:"operationStepStatus,omitempty"` + EnvironmentId string `protobuf:"bytes,7,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + Payload string `protobuf:"bytes,8,opt,name=payload,proto3" json:"payload,omitempty"` } func (x *Ev_IntegratedServiceEvent) Reset() { @@ -684,13 +769,34 @@ func (x *Ev_IntegratedServiceEvent) GetError() string { return "" } -func (x *Ev_IntegratedServiceEvent) GetCall() string { +func (x *Ev_IntegratedServiceEvent) GetOperationName() string { + if x != nil { + return x.OperationName + } + return "" +} + +func (x *Ev_IntegratedServiceEvent) GetOperationStatus() OpStatus { if x != nil { - return x.Call + return x.OperationStatus + } + return OpStatus_NULL +} + +func (x *Ev_IntegratedServiceEvent) GetOperationStep() string { + if x != nil { + return x.OperationStep } return "" } +func (x *Ev_IntegratedServiceEvent) GetOperationStepStatus() OpStatus { + if x != nil { + return x.OperationStepStatus + } + return OpStatus_NULL +} + func (x *Ev_IntegratedServiceEvent) GetEnvironmentId() string { if x != nil { return x.EnvironmentId @@ -894,7 +1000,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0xe9, 0x02, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x61, 0x67, 0x65, 0x22, 0xa7, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, @@ -909,47 +1015,55 @@ var file_protos_events_proto_rawDesc = []byte{ 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x39, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6e, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, - 0xf0, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, - 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x92, 0x01, + 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x3c, 0x0a, 0x10, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6e, 0x0a, + 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x02, + 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, + 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, + 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, @@ -959,62 +1073,79 @@ var file_protos_events_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x61, - 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x63, 0x61, 0x6c, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, - 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, - 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, - 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, - 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, + 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, + 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, + 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, + 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, + 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, + 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, + 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1029,37 +1160,43 @@ func file_protos_events_proto_rawDescGZIP() []byte { return file_protos_events_proto_rawDescData } +var file_protos_events_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 11) var file_protos_events_proto_goTypes = []interface{}{ - (*Ev_MetaEvent_MesosHeartbeat)(nil), // 0: events.Ev_MetaEvent_MesosHeartbeat - (*Ev_MetaEvent_CoreStart)(nil), // 1: events.Ev_MetaEvent_CoreStart - (*Ev_MetaEvent_FrameworkEvent)(nil), // 2: events.Ev_MetaEvent_FrameworkEvent - (*Ev_EnvironmentEvent)(nil), // 3: events.Ev_EnvironmentEvent - (*Traits)(nil), // 4: events.Traits - (*Ev_TaskEvent)(nil), // 5: events.Ev_TaskEvent - (*Ev_CallEvent)(nil), // 6: events.Ev_CallEvent - (*Ev_RoleEvent)(nil), // 7: events.Ev_RoleEvent - (*Ev_IntegratedServiceEvent)(nil), // 8: events.Ev_IntegratedServiceEvent - (*Event)(nil), // 9: events.Event - nil, // 10: events.Ev_EnvironmentEvent.VarsEntry + (OpStatus)(0), // 0: events.OpStatus + (*Ev_MetaEvent_MesosHeartbeat)(nil), // 1: events.Ev_MetaEvent_MesosHeartbeat + (*Ev_MetaEvent_CoreStart)(nil), // 2: events.Ev_MetaEvent_CoreStart + (*Ev_MetaEvent_FrameworkEvent)(nil), // 3: events.Ev_MetaEvent_FrameworkEvent + (*Ev_EnvironmentEvent)(nil), // 4: events.Ev_EnvironmentEvent + (*Traits)(nil), // 5: events.Traits + (*Ev_TaskEvent)(nil), // 6: events.Ev_TaskEvent + (*Ev_CallEvent)(nil), // 7: events.Ev_CallEvent + (*Ev_RoleEvent)(nil), // 8: events.Ev_RoleEvent + (*Ev_IntegratedServiceEvent)(nil), // 9: events.Ev_IntegratedServiceEvent + (*Event)(nil), // 10: events.Event + nil, // 11: events.Ev_EnvironmentEvent.VarsEntry } var file_protos_events_proto_depIdxs = []int32{ - 10, // 0: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry - 4, // 1: events.Ev_TaskEvent.traits:type_name -> events.Traits - 4, // 2: events.Ev_CallEvent.traits:type_name -> events.Traits - 3, // 3: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 5, // 4: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 7, // 5: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 6, // 6: events.Event.callEvent:type_name -> events.Ev_CallEvent - 8, // 7: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 2, // 8: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 0, // 9: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 1, // 10: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 11, // [11:11] is the sub-list for method output_type - 11, // [11:11] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus + 11, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry + 5, // 2: events.Ev_TaskEvent.traits:type_name -> events.Traits + 0, // 3: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus + 5, // 4: events.Ev_CallEvent.traits:type_name -> events.Traits + 0, // 5: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus + 0, // 6: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus + 4, // 7: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 8: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 9: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 10: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 11: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 3, // 12: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 13: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 14: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 15, // [15:15] is the sub-list for method output_type + 15, // [15:15] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1204,13 +1341,14 @@ func file_protos_events_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, - NumEnums: 0, + NumEnums: 1, NumMessages: 11, NumExtensions: 0, NumServices: 0, }, GoTypes: file_protos_events_proto_goTypes, DependencyIndexes: file_protos_events_proto_depIdxs, + EnumInfos: file_protos_events_proto_enumTypes, MessageInfos: file_protos_events_proto_msgTypes, }.Build() File_protos_events_proto = out.File diff --git a/common/protos/events.proto b/common/protos/events.proto index 773a468c8..edea2e072 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -30,6 +30,15 @@ option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; //////////////// Common event messages /////////////// +enum OpStatus { + NULL = 0; + STARTED = 1; + ONGOING = 2; + DONE_OK = 3; + DONE_ERROR = 4; + DONE_TIMEOUT = 5; +} + message Ev_MetaEvent_MesosHeartbeat { } @@ -50,7 +59,8 @@ message Ev_EnvironmentEvent { string message = 5; string transition = 6; string transitionStep = 7; - map vars = 8; + OpStatus transitionStatus = 8; + map vars = 9; } message Traits { @@ -69,15 +79,17 @@ message Ev_TaskEvent { string className = 6; Traits traits = 7; string environmentId = 8; + string path = 9; } message Ev_CallEvent { string func = 1; - string status = 2; + OpStatus callStatus = 2; string return = 3; Traits traits = 4; string output = 5; string error = 6; + string path = 7; } message Ev_RoleEvent { @@ -91,9 +103,12 @@ message Ev_RoleEvent { message Ev_IntegratedServiceEvent { string name = 1; string error = 2; - string call = 3; - string environmentId = 4; - string payload = 6; + string operationName = 3; + OpStatus operationStatus = 4; + string operationStep = 5; + OpStatus operationStepStatus = 6; + string environmentId = 7; + string payload = 8; } message Event { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index e96f95850..db47b3960 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -46,6 +46,18 @@ const ( // Symbols defined in public import of protos/events.proto. +type OpStatus = protos.OpStatus + +const OpStatus_NULL = protos.OpStatus_NULL +const OpStatus_STARTED = protos.OpStatus_STARTED +const OpStatus_ONGOING = protos.OpStatus_ONGOING +const OpStatus_DONE_OK = protos.OpStatus_DONE_OK +const OpStatus_DONE_ERROR = protos.OpStatus_DONE_ERROR +const OpStatus_DONE_TIMEOUT = protos.OpStatus_DONE_TIMEOUT + +var OpStatus_name = protos.OpStatus_name +var OpStatus_value = protos.OpStatus_value + type Ev_MetaEvent_MesosHeartbeat = protos.Ev_MetaEvent_MesosHeartbeat type Ev_MetaEvent_CoreStart = protos.Ev_MetaEvent_CoreStart type Ev_MetaEvent_FrameworkEvent = protos.Ev_MetaEvent_FrameworkEvent From 0bdb9dbe1c0e114dff639b96a2b180d9cfd2b1b2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 14:49:31 +0100 Subject: [PATCH 1832/2352] [build] Bump dependencies --- configuration/template/fields.go | 4 +- go.mod | 83 ++++++------- go.sum | 204 +++++++++++++++---------------- 3 files changed, 145 insertions(+), 146 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index b9e0ff9e5..5bda7967b 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -37,8 +37,8 @@ import ( "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/AliceO2Group/Control/core/repos" - "github.com/antonmedv/expr" - "github.com/antonmedv/expr/vm" + "github.com/expr-lang/expr" + "github.com/expr-lang/expr/vm" "github.com/sirupsen/logrus" "github.com/valyala/fasttemplate" ) diff --git a/go.mod b/go.mod index d472b979c..983052f18 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/AliceO2Group/Control -go 1.18 +go 1.21 + +toolchain go1.21.4 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt @@ -26,18 +28,17 @@ require ( github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/antonmedv/expr v1.15.5 github.com/briandowns/spinner v1.23.0 github.com/denisbrodbeck/machineid v1.0.1 github.com/dmarkham/enumer v1.5.8 github.com/fatih/color v1.16.0 - github.com/gdamore/tcell/v2 v2.6.0 + github.com/gdamore/tcell/v2 v2.7.4 github.com/go-git/go-git/v5 v5.11.0 github.com/gobwas/glob v0.2.3 - github.com/golang/protobuf v1.5.3 // indirect - github.com/google/uuid v1.4.0 + github.com/golang/protobuf v1.5.4 // indirect + github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 - github.com/hashicorp/consul/api v1.26.1 + github.com/hashicorp/consul/api v1.28.2 github.com/jinzhu/copier v0.4.0 github.com/k0kubun/pp v3.0.1+incompatible github.com/looplab/fsm v1.0.1 @@ -47,24 +48,24 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/osamingo/indigo v1.1.1 github.com/pborman/uuid v1.2.1 - github.com/prometheus/client_golang v1.17.0 + github.com/prometheus/client_golang v1.19.0 github.com/pseudomuto/protoc-gen-doc v1.5.1 - github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6 + github.com/rivo/tview v0.0.0-20240307173318-e804876934a1 github.com/rs/xid v1.5.0 github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/segmentio/kafka-go v0.4.46 + github.com/segmentio/kafka-go v0.4.47 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 - github.com/spf13/viper v1.17.0 + github.com/spf13/viper v1.18.2 github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.17.0 - golang.org/x/net v0.19.0 - golang.org/x/sys v0.15.0 - google.golang.org/grpc v1.59.0 + golang.org/x/crypto v0.21.0 + golang.org/x/net v0.22.0 + golang.org/x/sys v0.18.0 + google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.33.0 gopkg.in/yaml.v3 v3.0.1 @@ -72,35 +73,36 @@ require ( require ( dario.cat/mergo v1.0.0 + github.com/expr-lang/expr v1.16.1 github.com/flosch/pongo2/v6 v6.0.0 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 github.com/onsi/gomega v1.27.10 github.com/swaggo/http-swagger/v2 v2.0.2 - github.com/swaggo/swag v1.16.2 + github.com/swaggo/swag v1.16.3 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c // indirect + github.com/ProtonMail/go-crypto v1.0.0 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cyphar/filepath-securejoin v0.2.4 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.2 // indirect + github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect - github.com/gdamore/encoding v1.0.0 // indirect + github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.5.0 // indirect github.com/go-logr/logr v1.2.4 // indirect - github.com/go-openapi/jsonpointer v0.20.0 // indirect - github.com/go-openapi/jsonreference v0.20.2 // indirect - github.com/go-openapi/spec v0.20.9 // indirect - github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-openapi/jsonpointer v0.21.0 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/spec v0.21.0 // indirect + github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -108,7 +110,7 @@ require ( github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect - github.com/hashicorp/go-hclog v1.5.0 // indirect + github.com/hashicorp/go-hclog v1.6.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect @@ -122,7 +124,7 @@ require ( github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.3 // indirect + github.com/klauspost/compress v1.17.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -130,7 +132,6 @@ require ( github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -139,19 +140,19 @@ require ( github.com/naoina/go-stringutil v0.1.0 // indirect github.com/osamingo/base58 v1.0.0 // indirect github.com/pascaldekloe/name v1.0.1 // indirect - github.com/pelletier/go-toml/v2 v2.1.0 // indirect - github.com/pierrec/lz4/v4 v4.1.18 // indirect + github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_model v0.5.0 // indirect - github.com/prometheus/common v0.45.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/client_model v0.6.0 // indirect + github.com/prometheus/common v0.50.0 // indirect + github.com/prometheus/procfs v0.13.0 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/sagikazarmark/locafero v0.3.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sergi/go-diff v1.3.1 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect + github.com/skeema/knownhosts v1.2.2 // indirect github.com/sony/sonyflake v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -164,14 +165,14 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect - golang.org/x/mod v0.14.0 // indirect - golang.org/x/term v0.15.0 // indirect + golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 // indirect + golang.org/x/mod v0.16.0 // indirect + golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.16.0 // indirect - google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + golang.org/x/tools v0.19.0 // indirect + google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index f592c61c9..e54b2fd5f 100644 --- a/go.sum +++ b/go.sum @@ -17,19 +17,19 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c h1:kMFnB0vCcX7IL/m9Y5LO+KQYv+t1CQOiFe6+SV2J7bE= -github.com/ProtonMail/go-crypto v0.0.0-20230923063757-afb1ddc0824c/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= +github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= -github.com/antonmedv/expr v1.15.5 h1:y0Iz3cEwmpRz5/r3w4qQR0MfIqJGdGM1zbhD/v0G5Vg= -github.com/antonmedv/expr v1.15.5/go.mod h1:0E/6TxnOlRNp81GMzX9QfDPAmHo2Phg00y4JUv1ihsE= +github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -47,9 +47,9 @@ github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUK github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= @@ -57,15 +57,19 @@ github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxG github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= +github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= -github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= +github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/expr-lang/expr v1.16.1 h1:Na8CUcMdyGbnNpShY7kzcHCU7WqxuL+hnxgHZ4vaz/A= +github.com/expr-lang/expr v1.16.1/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= @@ -74,18 +78,22 @@ github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4Nij github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= -github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= -github.com/gdamore/tcell/v2 v2.6.0 h1:OKbluoP9VYmJwZwq/iLb4BxwKcwGthaa1YNBJIyCySg= -github.com/gdamore/tcell/v2 v2.6.0/go.mod h1:be9omFATkdr0D9qewWW3d+MEvl5dha+Etb5y65J2H8Y= +github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= +github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= +github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU= +github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= +github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= +github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -94,21 +102,14 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= -github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= -github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= -github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= -github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= -github.com/go-openapi/spec v0.20.9 h1:xnlYNQAwKd2VQRRfwTEI0DcK+2cbuvI/0c7jx3gA8/8= -github.com/go-openapi/spec v0.20.9/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= -github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= -github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= +github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= +github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= +github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= +github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= @@ -123,35 +124,35 @@ github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4er github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= +github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/hashicorp/consul/api v1.26.1 h1:5oSXOO5fboPZeW5SN+TdGFP/BILDgBm19OrPZ/pICIM= -github.com/hashicorp/consul/api v1.26.1/go.mod h1:B4sQTeaSO16NtynqrAdwOlahJ7IUDZM9cj2420xYL8A= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= +github.com/hashicorp/consul/api v1.28.2 h1:mXfkRHrpHN4YY3RqL09nXU1eHKLNiuAN4kHvDQ16k/8= +github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= +github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= +github.com/hashicorp/consul/sdk v0.16.0/go.mod h1:7pxqqhqoaPqnBnzXD1StKed62LqJeClzVsUEy85Zr0A= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.2 h1:NOtoftovWkDheyUM/8JW3QMiXyxJK3uHRK7wV04nD2I= +github.com/hashicorp/go-hclog v1.6.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= @@ -159,6 +160,7 @@ github.com/hashicorp/go-metrics v0.5.3 h1:M5uADWMOGCTUNU1YuC4hfknOeHNaX54LDm4oYS github.com/hashicorp/go-metrics v0.5.3/go.mod h1:KEjodfebIOuBYSAe/bHTm+HChmKSxAOXPBieMLYozDE= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= +github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -168,11 +170,14 @@ github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5O github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= github.com/hashicorp/go-sockaddr v1.0.2 h1:ztczhD1jLxIRjVejw8gFomI1BQZOe2WoVOu0SyteCQc= +github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= @@ -215,13 +220,13 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.3 h1:qkRjuerhUU1EmXLYGkSH6EZL+vPSxIrYjLNAK4slzwA= -github.com/klauspost/compress v1.17.3/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= +github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -234,9 +239,6 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -256,12 +258,9 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= -github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= @@ -291,7 +290,6 @@ github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hz github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= @@ -309,11 +307,11 @@ github.com/pascaldekloe/name v1.0.1 h1:9lnXOHeqeHHnWLbKfH6X98+4+ETVqFqxN09UXSjcM github.com/pascaldekloe/name v1.0.1/go.mod h1:Z//MfYJnH4jVpQ9wkclwu2I2MkHmXTlT9wR5UZScttM= github.com/pborman/uuid v1.2.1 h1:+ZZIw58t/ozdjRaXh/3awHfmWRbzYxJoAdNJxe/3pvw= github.com/pborman/uuid v1.2.1/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= -github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= -github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= +github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= -github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= +github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -322,6 +320,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= @@ -329,47 +328,48 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BU github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= -github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= +github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= -github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= +github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= +github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= github.com/pseudomuto/protokit v0.2.1/go.mod h1:gt7N5Rz2flBzYafvaxyIxMZC0TTF5jDZfRnw25hAAyo= -github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6 h1:7UMY2qN9VlcY+x9jlhpYe5Bf1zrdhvmfZyLMk2u65BM= -github.com/rivo/tview v0.0.0-20231126152417-33a1d271f2b6/go.mod h1:nVwGv4MP47T0jvlk7KuTTjjuSmrGO4JF0iaiNt4bufE= +github.com/rivo/tview v0.0.0-20240307173318-e804876934a1 h1:bWLHTRekAy497pE7+nXSuzXwwFHI0XauRzz6roUvY+s= +github.com/rivo/tview v0.0.0-20240307173318-e804876934a1/go.mod h1:02iFIz7K/A9jGCvrizLPvoqr4cEIx7q54RH5Qudkrss= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/sagikazarmark/locafero v0.3.0 h1:zT7VEGWC2DTflmccN/5T1etyKvxSxpHsjb9cJvm4SvQ= -github.com/sagikazarmark/locafero v0.3.0/go.mod h1:w+v7UsPNFwzF1cHuOajOOzoq4U7v/ig1mpRjqV+Bu1U= +github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= +github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= -github.com/segmentio/kafka-go v0.4.46 h1:Sx8/kvtY+/G8nM0roTNnFezSJj3bT2sW0Xy/YY3CgBI= -github.com/segmentio/kafka-go v0.4.46/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= +github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= +github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -378,8 +378,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= +github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -392,8 +392,8 @@ github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.17.0 h1:I5txKw7MJasPL/BrfkbA0Jyo/oELqVmux4pR/UxOMfI= -github.com/spf13/viper v1.17.0/go.mod h1:BmMMMLQXSbcHK6KAOiFLz0l5JHrU89OdIRHvsk0+yVI= +github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= +github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -407,17 +407,17 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= github.com/swaggo/files/v2 v2.0.0/go.mod h1:24kk2Y9NYEJ5lHuCra6iVwkMjIekMCaFq/0JQj66kyM= github.com/swaggo/http-swagger/v2 v2.0.2 h1:FKCdLsl+sFCx60KFsyM0rDarwiUSZ8DqbfSyIKC9OBg= github.com/swaggo/http-swagger/v2 v2.0.2/go.mod h1:r7/GBkAWIfK6E/OLnE8fXnviHiDeAHmgIyooa4xm3AQ= -github.com/swaggo/swag v1.16.2 h1:28Pp+8DkQoV+HLzLx8RGJZXNGKbFqnuvSbAAtoxiY04= -github.com/swaggo/swag v1.16.2/go.mod h1:6YzXnDcpr0767iOejs318CwYkCQqyGer6BizOg03f+E= +github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= +github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a/go.mod h1:76q+dZ4qOCuYrqwoUUjVCuAXF1TXB4jc98eaZFo6Yh0= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= @@ -459,16 +459,16 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= -golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 h1:6R2FC06FonbXQ8pK11/PDFY6N6LWlf9KlzibaCapmqc= +golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= +golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -485,8 +485,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= +golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -495,7 +495,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -530,8 +531,9 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -539,8 +541,9 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= -golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= +golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -562,31 +565,27 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= -golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= +golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= +golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f/go.mod h1:nWSwAFPb+qfNJXsoeO3Io7zf4tMSfN8EA8RlDA04GhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= +google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= +google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= +google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= @@ -601,7 +600,6 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= From 3faab7f1de3296c15cbcdf04e6d837ba1ffcb670 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 15:58:09 +0100 Subject: [PATCH 1833/2352] [core] Include parent role path in task events --- core/task/task.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/task/task.go b/core/task/task.go index 682ea56d9..fe06b7b48 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -158,6 +158,9 @@ func (t *Task) GetParentRole() interface{} { func (t *Task) GetParentRolePath() string { t.mu.RLock() defer t.mu.RUnlock() + if t.parent == nil { + return "" + } return t.parent.GetPath() } @@ -506,6 +509,7 @@ func (t *Task) SendEvent(ev event.Event) { Status: t.status.String(), Hostname: t.hostname, ClassName: t.className, + Path: t.GetParentRolePath(), } if t.parent == nil { From 954be0e8b613a7eb455176c2ba1e82a8c6fb595e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 15:59:08 +0100 Subject: [PATCH 1834/2352] [core] Improve call information in CallEvents --- core/workflow/callable/call.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index daf8f0757..900f690bb 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -112,9 +112,10 @@ func (c *Call) Call() error { Debugf("calling hook function %s", c.Func) the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ - Func: c.Func, - Status: "STARTED", - Return: c.Return, + Path: c.GetParentRolePath(), + Func: c.Func, + CallStatus: evpb.OpStatus_STARTED, + Return: c.Return, Traits: &evpb.Traits{ Trigger: c.Traits.Trigger, Await: c.Traits.Await, @@ -152,9 +153,10 @@ func (c *Call) Call() error { errMsg = err.Error() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ - Func: c.Func, - Status: "ERROR", - Return: c.Return, + Path: c.GetParentRolePath(), + Func: c.Func, + CallStatus: evpb.OpStatus_DONE_ERROR, + Return: c.Return, Traits: &evpb.Traits{ Trigger: c.Traits.Trigger, Await: c.Traits.Await, @@ -178,9 +180,10 @@ func (c *Call) Call() error { errMsg += ". REASON: " + errReason } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ - Func: c.Func, - Status: "ERROR", - Return: c.Return, + Path: c.GetParentRolePath(), + Func: c.Func, + CallStatus: evpb.OpStatus_DONE_ERROR, + Return: c.Return, Traits: &evpb.Traits{ Trigger: c.Traits.Trigger, Await: c.Traits.Await, @@ -195,9 +198,10 @@ func (c *Call) Call() error { } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ - Func: c.Func, - Status: "DONE", - Return: c.Return, + Path: c.GetParentRolePath(), + Func: c.Func, + CallStatus: evpb.OpStatus_DONE_OK, + Return: c.Return, Traits: &evpb.Traits{ Trigger: c.Traits.Trigger, Await: c.Traits.Await, From 44309500a5ad02a0702e869cd6f31e9c1cce0779 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 16:00:53 +0100 Subject: [PATCH 1835/2352] [core] Emit IntegratedServiceEvents from DCS --- core/integration/dcs/plugin.go | 642 +++++++++++++++++++++++++++++++- core/integration/dcs/structs.go | 8 + 2 files changed, 638 insertions(+), 12 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index a3ab4a8ee..74c630107 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -39,14 +39,19 @@ import ( "time" "dario.cat/mergo" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" + "github.com/jinzhu/copier" "github.com/spf13/viper" + "golang.org/x/exp/maps" "google.golang.org/grpc" "google.golang.org/grpc/connectivity" ) @@ -55,6 +60,7 @@ const ( DCS_DIAL_TIMEOUT = 2 * time.Hour DCS_GENERAL_OP_TIMEOUT = 45 * time.Second DCS_TIME_FORMAT = "2006-01-02 15:04:05.000" + TOPIC = topic.IntegratedService + topic.Separator + "dcs" ) type Plugin struct { @@ -224,11 +230,23 @@ func (p *Plugin) updateDetectorOpAvailabilities(detectorMatrix []*dcspb.Detector p.detectorMapMu.Lock() defer p.detectorMapMu.Unlock() + pfrAvailabilityChangedDetectors := map[dcspb.Detector]struct{}{} + sorAvailabilityChangedDetectors := map[dcspb.Detector]struct{}{} + for _, detInfo := range detectorMatrix { dcsDet := detInfo.GetDetector() if _, ok := p.detectorMap[dcsDet]; !ok { + pfrAvailabilityChangedDetectors[dcsDet] = struct{}{} + sorAvailabilityChangedDetectors[dcsDet] = struct{}{} + p.detectorMap[dcsDet] = detInfo } else { + if p.detectorMap[dcsDet].PfrAvailability != detInfo.PfrAvailability { + pfrAvailabilityChangedDetectors[dcsDet] = struct{}{} + } + if p.detectorMap[dcsDet].SorAvailability != detInfo.SorAvailability { + sorAvailabilityChangedDetectors[dcsDet] = struct{}{} + } p.detectorMap[dcsDet].PfrAvailability = detInfo.PfrAvailability p.detectorMap[dcsDet].SorAvailability = detInfo.SorAvailability timestamp, err := time.Parse(DCS_TIME_FORMAT, detInfo.Timestamp) @@ -237,6 +255,21 @@ func (p *Plugin) updateDetectorOpAvailabilities(detectorMatrix []*dcspb.Detector } } } + + // build payload for event + payload := map[string]interface{}{ + "detectors": p.detectorMap.ToEcsDetectors(), + "changed": map[string]interface{}{ + "pfrAvailability": DCSDetectors(maps.Keys(pfrAvailabilityChangedDetectors)).EcsDetectorsSlice(), + "sorAvailability": DCSDetectors(maps.Keys(sorAvailabilityChangedDetectors)).EcsDetectorsSlice(), + }, + } + + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: "dcs.updateDetectorOpAvailabilities", + Payload: string(payloadJson[:]), + }) } func (p *Plugin) Init(instanceId string) error { @@ -423,6 +456,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("DCS PFR grace period not set, defaulting to 0 seconds") } + payload := map[string]interface{}{ + "detectors": dcsDetectors.ToStringSlice(), + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + pfrGraceTimeout := time.Now().Add(pfrGracePeriod) isCompatibleWithOperation := false @@ -460,6 +508,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } else if isCompatibleWithOperation && err != nil { log.WithField("level", infologger.IL_Ops). @@ -468,6 +527,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine PFR readiness: %s", err.Error()) } + payload["detectorsReadiness"] = knownDetectorStates.ToStringMap() + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation log.WithField("partition", envId). @@ -623,6 +695,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // Point of no return // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via // the response stream. @@ -640,6 +722,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } @@ -647,12 +740,37 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { for { if ctx.Err() != nil { err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination + logMsg := "DCS PFR event stream was closed from the DCS side (EOF)" log.WithField("partition", envId). - Debug("DCS PFR event stream was closed from the DCS side (EOF)") + Debug(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -661,12 +779,37 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("timeout", timeout.String()). Debug("DCS PFR timed out") err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } if err != nil { // stream termination in case of general error + logMsg := "bad DCS PFR event received, any future DCS events are ignored" log.WithError(err). WithField("partition", envId). - Warn("bad DCS PFR event received, any future DCS events are ignored") + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break } if dcsEvent == nil { @@ -694,6 +837,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -716,6 +873,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -738,6 +909,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -749,12 +934,45 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("level", infologger.IL_Support). Debug("DCS PFR completed successfully") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) log.WithField("partition", envId). WithField("detector", ecsDet). Debugf("DCS PFR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { @@ -779,7 +997,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) } } - if !dcsopOk { + if dcsopOk { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + } else { logErr := fmt.Errorf("PFR failed for %s", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { if errors.Is(err, io.EOF) { @@ -797,6 +1025,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + + payload["failedDetectors"] = dcsFailedEcsDetectors + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) } return @@ -859,6 +1100,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("DCS SOR grace period not set, defaulting to 0 seconds") } + payload := map[string]interface{}{ + "detectors": dcsDetectors.ToStringSlice(), + "runNumber": runNumber64, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + sorGraceTimeout := time.Now().Add(sorGracePeriod) isCompatibleWithOperation := false @@ -896,6 +1153,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } else if isCompatibleWithOperation && err != nil { log.WithField("level", infologger.IL_Ops). @@ -904,6 +1172,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine SOR readiness: %s", err.Error()) } + payload["detectorsReadiness"] = knownDetectorStates.ToStringMap() + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation log.WithField("partition", envId). @@ -1066,6 +1347,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // Point of no return // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via // the response stream. @@ -1084,6 +1375,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later @@ -1092,13 +1394,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { for { if ctx.Err() != nil { err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination + logMsg := "DCS SOR event stream was closed from the DCS side (EOF)" log.WithField("partition", envId). WithField("run", runNumber64). - Debug("DCS SOR event stream was closed from the DCS side (EOF)") + Debug(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1108,13 +1435,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("timeout", timeout.String()). Debug("DCS SOR timed out") err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } if err != nil { // stream termination in case of general error + logMsg := "bad DCS SOR event received, any future DCS events are ignored" log.WithError(err). WithField("partition", envId). WithField("run", runNumber64). - Warn("bad DCS SOR event received, any future DCS events are ignored") + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break } if dcsEvent == nil { @@ -1144,6 +1496,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -1167,6 +1533,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -1190,6 +1570,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -1203,6 +1597,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). Debug("DCS SOR completed successfully") p.pendingEORs[envId] = runNumber64 + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) @@ -1210,6 +1620,23 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). WithField("detector", ecsDet). Debugf("DCS SOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { @@ -1239,6 +1666,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsopOk { p.pendingEORs[envId] = runNumber64 + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) } else { logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { @@ -1258,6 +1695,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + + payload["failedDetectors"] = dcsFailedEcsDetectors + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) } return } @@ -1413,6 +1863,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + payload := map[string]interface{}{ + "detectors": dcsDetectors.ToStringSlice(), + "runNumber": runNumber64, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // Point of no return // The gRPC call below is expected to return immediately, with any actual responses arriving subsequently via // the response stream. @@ -1431,6 +1897,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } delete(p.pendingEORs, envId) // make sure this EOR never runs again @@ -1451,13 +1928,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { for { if ctx.Err() != nil { err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination + logMsg := "DCS EOR event stream was closed from the DCS side (EOF)" log.WithField("partition", envId). WithField("run", runNumber64). - Debug("DCS EOR event stream was closed from the DCS side (EOF)") + Debug(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1467,13 +1969,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("timeout", timeout.String()). Debug("DCS EOR timed out") err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } if err != nil { // stream termination in case of general error + logMsg := "bad DCS EOR event received, any future DCS events are ignored" log.WithError(err). WithField("partition", envId). WithField("run", runNumber64). - Warn("bad DCS EOR event received, any future DCS events are ignored") + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + break } if dcsEvent == nil { @@ -1506,6 +2033,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -1529,6 +2070,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logErr.Error(), + }) + return } @@ -1542,6 +2097,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). Debug("DCS EOR completed successfully") delete(p.pendingEORs, envId) + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) @@ -1549,14 +2120,38 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). WithField("detector", dcsEvent.GetDetector().String()). Debugf("DCS EOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) } } - log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("level", infologger.IL_Devel). - WithField("run", runNumber64). - Info("ALIECS EOR operation : processing DCS EOR for ") + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("run", runNumber64). + Info("ALIECS EOR operation : completed DCS EOR for ") + } else { + log.WithField("event", dcsEvent). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + WithField("run", runNumber64). + Info("ALIECS EOR operation : processing DCS EOR for ") + } } dcsFailedEcsDetectors := make([]string, 0) @@ -1569,6 +2164,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsopOk { delete(p.pendingEORs, envId) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) } else { logErr := fmt.Errorf("EOR failed for %s, DCS EOR will NOT run again for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { @@ -1585,6 +2190,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = logErr.Error() call.VarStack["__call_error"] = callFailedStr + + payload["failedDetectors"] = dcsFailedEcsDetectors + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DCS call", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) } return } diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index 849c7b480..474ef4f60 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -74,6 +74,14 @@ func (d DCSDetectors) EcsDetectorsSlice() (sslice []string) { return } +func (dsm DCSDetectorOpAvailabilityMap) ToStringMap() (sm map[string]string) { + sm = make(map[string]string) + for det, detState := range dsm { + sm[det.String()] = detState.String() + } + return +} + func (dsm DCSDetectorOpAvailabilityMap) makeDetectorsByStateMap() map[dcspb.DetectorState]DCSDetectors { detectorsByState := make(map[dcspb.DetectorState]DCSDetectors) for det, detState := range dsm { From b5a803f0c3dfe98bff9fa43c21282dd04cc388a6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 16:37:53 +0100 Subject: [PATCH 1836/2352] [core] Make sure we always output ECS detector codes, not DCS ones --- core/integration/dcs/plugin.go | 10 +++++----- core/integration/dcs/structs.go | 8 ++++++++ 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 74c630107..aa19c0795 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -457,7 +457,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payload := map[string]interface{}{ - "detectors": dcsDetectors.ToStringSlice(), + "detectors": dcsDetectors.EcsDetectorsSlice(), } payloadJson, _ := json.Marshal(payload) @@ -527,7 +527,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine PFR readiness: %s", err.Error()) } - payload["detectorsReadiness"] = knownDetectorStates.ToStringMap() + payload["detectorsReadiness"] = knownDetectorStates.EcsDetectorsMap() payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ @@ -1101,7 +1101,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payload := map[string]interface{}{ - "detectors": dcsDetectors.ToStringSlice(), + "detectors": dcsDetectors.EcsDetectorsSlice(), "runNumber": runNumber64, } payloadJson, _ := json.Marshal(payload) @@ -1172,7 +1172,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warnf("cannot determine SOR readiness: %s", err.Error()) } - payload["detectorsReadiness"] = knownDetectorStates.ToStringMap() + payload["detectorsReadiness"] = knownDetectorStates.EcsDetectorsMap() payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ @@ -1864,7 +1864,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer cancel() payload := map[string]interface{}{ - "detectors": dcsDetectors.ToStringSlice(), + "detectors": dcsDetectors.EcsDetectorsSlice(), "runNumber": runNumber64, } payloadJson, _ := json.Marshal(payload) diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index 474ef4f60..5a98d68a3 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -82,6 +82,14 @@ func (dsm DCSDetectorOpAvailabilityMap) ToStringMap() (sm map[string]string) { return } +func (dsm DCSDetectorOpAvailabilityMap) EcsDetectorsMap() (sm map[string]string) { + sm = make(map[string]string) + for det, detState := range dsm { + sm[dcsToEcsDetector(det)] = detState.String() + } + return +} + func (dsm DCSDetectorOpAvailabilityMap) makeDetectorsByStateMap() map[dcspb.DetectorState]DCSDetectors { detectorsByState := make(map[dcspb.DetectorState]DCSDetectors) for det, detState := range dsm { From b105528291616a7f38f5ae2fee3a2ecbff2ff8c6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 14 Mar 2024 17:02:28 +0100 Subject: [PATCH 1837/2352] [core] Don't forget to include error in DCS ERROR events --- core/integration/dcs/plugin.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index aa19c0795..fc9f964a9 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1037,6 +1037,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), + Error: logErr.Error(), }) } return @@ -1707,6 +1708,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), + Error: logErr.Error(), }) } return @@ -2202,6 +2204,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), + Error: logErr.Error(), }) } return From a95d746e6a43917d01379a36322a964e38f42910 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Mar 2024 16:24:42 +0100 Subject: [PATCH 1838/2352] [core] Better DCS event descriptions --- core/integration/dcs/plugin.go | 76 +++++++++++++++++----------------- 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index fc9f964a9..4dd0a92d1 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -699,7 +699,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_STARTED, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -726,7 +726,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -745,7 +745,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -764,7 +764,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -784,7 +784,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -803,7 +803,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -844,7 +844,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -880,7 +880,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -916,7 +916,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -944,7 +944,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -967,7 +967,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -1002,7 +1002,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_OK, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1033,7 +1033,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1352,7 +1352,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_STARTED, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1380,7 +1380,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1400,7 +1400,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1420,7 +1420,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1441,7 +1441,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1461,7 +1461,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1504,7 +1504,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1541,7 +1541,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1578,7 +1578,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1608,7 +1608,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -1632,7 +1632,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -1672,7 +1672,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_OK, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1704,7 +1704,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1875,7 +1875,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_STARTED, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1903,7 +1903,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1935,7 +1935,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1955,7 +1955,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1976,7 +1976,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -1996,7 +1996,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -2042,7 +2042,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -2079,7 +2079,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -2109,7 +2109,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -2133,7 +2133,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_ONGOING, EnvironmentId: envId, Payload: string(detPayloadJson[:]), @@ -2171,7 +2171,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_OK, EnvironmentId: envId, Payload: string(payloadJson[:]), @@ -2200,7 +2200,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "perform DCS call", + OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, Payload: string(payloadJson[:]), From 751bb2c40ed904092886335e930ee6f701cb0c47 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Mar 2024 16:25:06 +0100 Subject: [PATCH 1839/2352] [core] Emit ddscheduler events --- core/integration/ddsched/plugin.go | 404 ++++++++++++++++++++++++++++- 1 file changed, 401 insertions(+), 3 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 2510172f4..ed170e1fb 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -36,11 +36,14 @@ import ( "strings" "time" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" @@ -53,6 +56,7 @@ const ( DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second DDSCHED_DEFAULT_POLLING_TIMEOUT = 30 * time.Second + TOPIC = topic.IntegratedService + topic.Separator + "ddsched" ) type Plugin struct { @@ -325,6 +329,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(DDSCHED_INITIALIZE_TIMEOUT, varStack, "Initialize", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + + payload := map[string]interface{}{ + "ddschedRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform DD scheduler call: PartitionInitialize", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + response, err = p.ddSchedClient.PartitionInitialize(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -337,6 +356,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionInitialize", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } if response.PartitionState != ddpb.PartitionState_PARTITION_CONFIGURING && @@ -353,9 +383,48 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionInitialize", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DD scheduler call: PartitionInitialize", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + + payload = map[string]interface{}{ + "lastKnownState": response.PartitionState.String(), + } + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) @@ -373,10 +442,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { continue } - switch response.PartitionState { + switch lastKnownState := response.PartitionState; lastKnownState { case ddpb.PartitionState_PARTITION_CONFIGURING: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + time.Sleep(100 * time.Millisecond) case ddpb.PartitionState_PARTITION_CONFIGURED: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + break PARTITION_STATE_POLLING default: err = fmt.Errorf("PartitionInitialize landed on unexpected state %s (expected: PARTITION_CONFIGURED)", response.PartitionState.String()) @@ -391,6 +484,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break PARTITION_STATE_POLLING } @@ -408,6 +514,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = response.PartitionState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } } @@ -463,6 +582,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + + payload := map[string]interface{}{ + "ddschedRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -475,6 +609,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } @@ -492,9 +637,48 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + + payload = map[string]interface{}{ + "lastKnownState": response.PartitionState.String(), + } + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) @@ -512,10 +696,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { continue } - switch response.PartitionState { + switch lastKnownState := response.PartitionState; lastKnownState { case ddpb.PartitionState_PARTITION_TERMINATING: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + time.Sleep(100 * time.Millisecond) case ddpb.PartitionState_PARTITION_TERMINATED: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + break PARTITION_STATE_POLLING default: err = fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) @@ -530,6 +738,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break PARTITION_STATE_POLLING } if ctx.Err() != nil { @@ -546,6 +767,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = response.PartitionState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } } @@ -600,6 +834,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "check DD partition status", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + }) + response, err = p.ddSchedClient.PartitionStatus(ctx, &infoReq, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -612,6 +856,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "check DD partition status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Error: err.Error(), + }) + return } @@ -628,6 +882,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "check DD partition status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Error: err.Error(), + }) + return } @@ -643,9 +907,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("partition_state", response.PartitionState). Trace("DD scheduler session cleanup not needed") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "check DD partition status", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + }) + return } + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "check DD partition status", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Error: "partition still exists, cleanup needed", + }) + // No guarantee that the DDsched partition is in an obedient state or able // to perform control commands, but if it's CONFIGURED we should be able // call PartitionTerminate @@ -662,6 +946,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). Warn("DD scheduler partition still active, performing PartitionTerminate") + payload := map[string]interface{}{ + "ddschedRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + response, err = p.ddSchedClient.PartitionTerminate(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -674,6 +972,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } if response.PartitionState != ddpb.PartitionState_PARTITION_TERMINATING && @@ -690,9 +999,48 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } + payload["ddschedResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DD scheduler call: PartitionTerminate", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + + payload = map[string]interface{}{ + "lastKnownState": response.PartitionState.String(), + } + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + PARTITION_STATE_POLLING: for ctx.Err() == nil { response, err = p.ddSchedClient.PartitionStatus(ctx, in.PartitionInfo, grpc.EmptyCallOption{}) @@ -710,10 +1058,34 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { continue } - switch response.PartitionState { + switch lastKnownState := response.PartitionState; lastKnownState { case ddpb.PartitionState_PARTITION_TERMINATING: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + time.Sleep(100 * time.Millisecond) case ddpb.PartitionState_PARTITION_TERMINATED: + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + break PARTITION_STATE_POLLING default: err = fmt.Errorf("PartitionTerminate landed on unexpected state %s (expected: PARTITION_TERMINATED)", response.PartitionState.String()) @@ -728,6 +1100,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = lastKnownState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break PARTITION_STATE_POLLING } if ctx.Err() != nil { @@ -744,6 +1129,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["lastKnownState"] = response.PartitionState.String() + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStep: "poll for DD partition state", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + break } } From de7b876c2959e605a4d2f63e384686833f7f868b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Mar 2024 16:26:48 +0100 Subject: [PATCH 1840/2352] [core] Remove legacy ODC handlers --- core/integration/odc/handlers.go | 150 ------------------------------- core/integration/odc/plugin.go | 125 +------------------------- 2 files changed, 3 insertions(+), 272 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 980a5ea00..199889f33 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -278,29 +278,6 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return nil } -func handleResetLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) - if err != nil { - return printGrpcError(err) - } - - err = doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) - if err != nil { - return printGrpcError(err) - } - - err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) - if err != nil { - return printGrpcError(err) - } - return nil -} - func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { @@ -771,133 +748,6 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return err } -func handleConfigureLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, isManualXml bool, topology string, script string, plugin string, resources string, paddingTimeout time.Duration, envId string) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - - var err error = nil - - // SetProperties before CONFIGURE - setPropertiesRequest := &odcpb.SetPropertiesRequest{ - Partitionid: envId, - Path: "", - Properties: make([]*odcpb.Property, len(arguments)), - } - // We ask this ODC call to complete within our own DEADLINE, minus 1 second - ctxDeadline, ok := ctx.Deadline() - if ok { - setPropertiesRequest.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) - } - - // Extract relevant parameters from Arguments payload - // and build payload for SetProperty+Configure - i := 0 - for k, v := range arguments { - setPropertiesRequest.Properties[i] = &odcpb.Property{ - Key: k, - Value: v, - } - i++ - } - - log.WithField("partition", envId).Debugf("preparing call odc.Run") - - err = handleRun(ctx, odcClient, isManualXml, map[string]string{ - "topology": topology, - "script": script, - "plugin": plugin, - "resources": resources, - }, - paddingTimeout, - envId) - if err != nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.Run with ERROR") - return printGrpcError(err) - } - log.WithField("partition", envId).Debugf("finished call odc.Run with SUCCESS") - - log.WithField("partition", envId).Debugf("preparing call odc.SetProperties") - - var setPropertiesResponse *odcpb.GeneralReply - setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) - if err != nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties with ERROR") - return printGrpcError(err) - } - - if setPropertiesResponse == nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") - - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := setPropertiesResponse.GetError(); odcErr != nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR in response payload") - - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, bad status in response payload") - - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - - log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") - - log.WithFields(logrus.Fields{ - "odcMsg": setPropertiesResponse.Msg, - "odcStatus": setPropertiesResponse.Status.String(), - "odcExectime": setPropertiesResponse.Exectime, - "partition": setPropertiesResponse.Partitionid, - "odcSessionid": setPropertiesResponse.Sessionid, - }). - Debug("call to ODC complete: odc.SetProperties") - - // CONFIGURE - configureRequest := &odcpb.ConfigureRequest{ - Request: &odcpb.StateRequest{ - Partitionid: envId, - Path: "", - Detailed: false, - }, - } - // We ask this ODC call to complete within our own DEADLINE, minus 1 second - ctxDeadline, ok = ctx.Deadline() - if ok { - configureRequest.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) - } - - var configureResponse *odcpb.StateReply - configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) - if err != nil { - return printGrpcError(err) - } - - if configureResponse == nil || configureResponse.Reply == nil { - // We got a nil response with nil error, this should never happen - return errors.New("nil response error") - } - - if odcErr := configureResponse.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - } - if replyStatus := configureResponse.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } - log.WithFields(logrus.Fields{ - "odcMsg": configureResponse.Reply.Msg, - "odcStatus": configureResponse.Reply.Status.String(), - "odcExectime": configureResponse.Reply.Exectime, - "partition": configureResponse.Reply.Partitionid, - "odcSessionid": configureResponse.Reply.Sessionid, - }). - Debug("call to ODC complete: odc.Configure") - return err -} - func printGrpcError(err error) error { grpcStatus, ok := status.FromError(err) if ok { diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 8a2bffcbf..0cfc5992e 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/apricot" common_event "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" @@ -65,6 +66,7 @@ const ( ODC_STATUS_TIMEOUT = 3 * time.Second ODC_POLLING_INTERVAL = 3 * time.Second ODC_MAX_INBOUND_MESSAGE_SIZE = 32 * 1024 * 1024 // 16 MiB + TOPIC = topic.IntegratedService + topic.Separator + "odc" ) type Plugin struct { @@ -253,6 +255,7 @@ func (p *Plugin) queryPartitionStatus() { WithField("oldState", existingPartition.State). WithField("state", partitionInfo.State). Info("ODC Partition state changed") + envMan := environment.ManagerInstance() if envMan != nil { go envMan.NotifyIntegratedServiceEvent(&event.OdcPartitionStateChangeEvent{ @@ -1357,128 +1360,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } - stack["ConfigureLegacy"] = func() (out string) { - // ODC Run + SetProperties + Configure - - var ( - pdpConfigOption, script, topology, plugin, resources string - ) - ok := false - isManualXml := false - callFailedStr := "EPN ConfigureLegacy call failed" - - pdpConfigOption, ok = varStack["pdp_config_option"] - if !ok { - msg := "cannot acquire PDP workflow configuration mode" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - switch pdpConfigOption { - case "Repository hash": - fallthrough - case "Repository path": - script, ok = varStack["odc_script"] - if !ok { - msg := "cannot acquire ODC script, make sure GenerateEPNWorkflowScript is called and its " + - "output is written to odc_script" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - - case "Manual XML": - topology, ok = varStack["odc_topology"] - if !ok { - msg := "cannot acquire ODC topology" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - isManualXml = true - - default: - msg := "cannot acquire valid PDP workflow configuration mode value" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - WithField("value", pdpConfigOption). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - - plugin, ok = varStack["odc_plugin"] - if !ok { - msg := "cannot acquire ODC RMS plugin declaration" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - - resources, ok = varStack["odc_resources"] - if !ok { - msg := "cannot acquire ODC resources declaration" - log.WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - Error(msg) - call.VarStack["__call_error_reason"] = msg - call.VarStack["__call_error"] = callFailedStr - return - } - - timeout := callable.AcquireTimeout(ODC_CONFIGURE_TIMEOUT, varStack, "Configure", envId) - - arguments := make(map[string]string) - arguments["environment_id"] = envId - - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - err := handleConfigureLegacy(ctx, p.odcClient, arguments, isManualXml, topology, script, plugin, resources, paddingTimeout, envId) - if err != nil { - log.WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "ConfigureLegacy"). - WithError(err).Error("ODC error") - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - } - - return - } - stack["ResetLegacy"] = func() (out string) { - // ODC Reset + Terminate + Shutdown - - timeout := callable.AcquireTimeout(ODC_RESET_TIMEOUT, varStack, "Reset", envId) - - callFailedStr := "EPN ResetLegacy call failed" - - ctx, cancel := context.WithTimeout(context.Background(), timeout) - defer cancel() - err := handleResetLegacy(ctx, p.odcClient, nil, paddingTimeout, envId) - if err != nil { - log.WithError(err). - WithField("level", infologger.IL_Support). - WithField("partition", envId). - WithField("call", "ResetLegacy"). - Error("ODC error") - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr - } - return - } stack["EnsureCleanupLegacy"] = func() (out string) { // ODC Reset + Terminate + Shutdown for current env From 2ac21b98636d48ce69062b2531e5913b44e55258 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Mar 2024 17:33:07 +0100 Subject: [PATCH 1841/2352] [core] Emit ODC events --- core/integration/dcs/plugin.go | 2 +- core/integration/ddsched/plugin.go | 2 +- core/integration/odc/handlers.go | 955 +++++++++++++++++++++++++++-- core/integration/odc/plugin.go | 33 +- 4 files changed, 921 insertions(+), 71 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 4dd0a92d1..ebfe3195f 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021-2023 CERN and copyright holders of ALICE O². + * Copyright 2021-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index ed170e1fb..5a4e04515 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021 CERN and copyright holders of ALICE O². + * Copyright 2021-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 199889f33..b2a65d270 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020-2022 CERN and copyright holders of ALICE O². + * Copyright 2020-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -26,6 +26,7 @@ package odc import ( "context" + "encoding/json" "errors" "fmt" "strconv" @@ -34,10 +35,13 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration/odc/odcutils" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" + "github.com/AliceO2Group/Control/core/the" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/status" @@ -91,7 +95,7 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st return odcutils.StateForOdcState(newState), err } -func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64) error { +func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) var err error = nil @@ -125,23 +129,114 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string i++ } + payload := map[string]interface{}{ + "odcRequest": &setPropertiesRequest, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var setPropertiesResponse *odcpb.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if setPropertiesResponse == nil { + err = fmt.Errorf("nil response error") + log.WithField("partition", envId).WithError(err). + Debugf("finished call odc.SetProperties, ERROR nil response") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := setPropertiesResponse.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + log.WithField("partition", envId). + WithError(err). + Debugf("finished call odc.SetProperties, ERROR in response payload") + + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + log.WithField("partition", envId). + WithError(err). + Debugf("finished call odc.SetProperties, bad status in response payload") + + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithField("partition", envId). WithFields(logrus.Fields{ "odcMsg": setPropertiesResponse.Msg, @@ -167,22 +262,103 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } + payload = map[string]interface{}{ + "odcRequest": &req, + } + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if rep == nil || rep.Reply == nil { + err = fmt.Errorf("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Start", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithField("partition", envId). WithFields(logrus.Fields{ "odcMsg": rep.Reply.Msg, @@ -195,7 +371,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return err } -func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64) error { +func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) req := &odcpb.StopRequest{ Request: &odcpb.StateRequest{ @@ -218,22 +394,103 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] return errors.New("cannot proceed with empty environment id") } + payload := map[string]interface{}{ + "odcRequest": &req, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if rep == nil || rep.Reply == nil { + err = fmt.Errorf("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Stop", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithField("partition", envId). WithFields(logrus.Fields{ "odcMsg": rep.Reply.Msg, @@ -246,31 +503,31 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } -func handlePartitionTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handlePartitionTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } - err := doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) + err := doTerminate(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { return printGrpcError(err) } - err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { return printGrpcError(err) } return nil } -func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") } - err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) + err := doReset(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { return printGrpcError(err) } @@ -278,7 +535,7 @@ func handleReset(ctx context.Context, odcClient *RpcClient, arguments map[string return nil } -func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -286,7 +543,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma // This function tries to perform the regular teardown sequence. // Since Shutdown is supposed to work in any state, we don't bail on error. - err := doReset(ctx, odcClient, arguments, paddingTimeout, envId) + err := doReset(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -294,7 +551,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma Warn("ODC Reset call failed") } - err = doTerminate(ctx, odcClient, arguments, paddingTimeout, envId) + err = doTerminate(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -302,7 +559,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma Warn("ODC Terminate call failed") } - err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId) + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, envId, call) if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -312,7 +569,7 @@ func handleCleanupLegacy(ctx context.Context, odcClient *RpcClient, arguments ma return nil // We clobber the error because nothing can be done for a failed cleanup } -func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { log.WithField("partition", envId). Debug("handleCleanup starting") defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) @@ -323,22 +580,101 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri var err error = nil var rep *odcpb.StatusReply + payload := map[string]interface{}{ + "odcRequest": &req, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + rep, err = odcClient.Status(ctx, req, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if rep == nil || rep.GetStatus() == odcpb.ReplyStatus_UNKNOWN { + err = fmt.Errorf("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := rep.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) } if replyStatus := rep.GetStatus(); replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform ODC call: Status", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithField("partition", envId). WithFields(logrus.Fields{ "odcCall": "Status", @@ -394,7 +730,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri for odcPartitionId, _ := range partitionsToClean { go func(odcPartitionId string) { defer wg.Done() - err = doShutdown(ctx, odcClient, arguments, paddingTimeout, odcPartitionId) // FIXME make this parallel + err = doShutdown(ctx, odcClient, arguments, paddingTimeout, odcPartitionId, call) // FIXME make this parallel if err != nil { log.WithError(printGrpcError(err)). WithField("level", infologger.IL_Devel). @@ -405,10 +741,29 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri } wg.Wait() + if len(partitionsToClean) == 0 { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "no cleanup necessary", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + }) + } else { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC calls for all known partitions: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + }) + } return nil // We clobber the error because nothing can be done for a failed cleanup } -func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { // RESET req := &odcpb.ResetRequest{ Request: &odcpb.StateRequest{ @@ -426,22 +781,103 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str var err error = nil var rep *odcpb.StateReply + payload := map[string]interface{}{ + "odcRequest": &req, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + rep, err = odcClient.Reset(ctx, req, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if rep == nil || rep.Reply == nil { // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + err = errors.New("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Reset", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithFields(logrus.Fields{ "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), @@ -453,7 +889,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str return err } -func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { // TERMINATE req := &odcpb.TerminateRequest{ Request: &odcpb.StateRequest{ @@ -471,22 +907,103 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string var err error = nil var rep *odcpb.StateReply + payload := map[string]interface{}{ + "odcRequest": &req, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + rep, err = odcClient.Terminate(ctx, req, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if rep == nil || rep.Reply == nil { // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + err = errors.New("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if odcErr := rep.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &rep + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Terminate", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithFields(logrus.Fields{ "odcMsg": rep.Reply.Msg, "odcStatus": rep.Reply.Status.String(), @@ -498,7 +1015,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string return err } -func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { // SHUTDOWN shutdownRequest := &odcpb.ShutdownRequest{ Partitionid: envId, @@ -511,22 +1028,104 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] var err error = nil var shutdownResponse *odcpb.GeneralReply + + payload := map[string]interface{}{ + "odcRequest": &shutdownRequest, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if shutdownResponse == nil { // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + err = errors.New("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if odcErr := shutdownResponse.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &shutdownResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := shutdownResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &shutdownResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &shutdownResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Shutdown", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithFields(logrus.Fields{ "odcMsg": shutdownResponse.Msg, "odcStatus": shutdownResponse.Status.String(), @@ -538,7 +1137,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } -func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -610,20 +1209,76 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu var err error = nil var runResponse *odcpb.GeneralReply + payload := map[string]interface{}{ + "odcRequest": &runRequest, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: Run", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Run", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if runResponse == nil { + errMsg := "nil response error" + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Run", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return errors.New(errMsg) } if odcErr := runResponse.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) } if replyStatus := runResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { + payload["odcResponse"] = &runResponse + payloadJson, _ = json.Marshal(payload) + + errMsg := "" + if err != nil { + errMsg = err.Error() + } + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Run", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: errMsg, + }) + return fmt.Errorf("status %s from ODC with error %w", replyStatus.String(), err) } log.WithFields(logrus.Fields{ @@ -634,10 +1289,24 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu "odcSessionid": runResponse.Sessionid, }). Debug("call to ODC complete: odc.Run") + + payload["odcResponse"] = &runResponse + payloadJson, _ = json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Run", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + return err } -func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string) error { +func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) if envId == "" { return errors.New("cannot proceed with empty environment id") @@ -670,33 +1339,120 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st log.WithField("partition", envId).Debugf("preparing call odc.SetProperties") + payload := map[string]interface{}{ + "odcRequest": &setPropertiesRequest, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var setPropertiesResponse *odcpb.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties with ERROR") + log.WithField("partition", envId). + WithError(err). + Debugf("finished call odc.SetProperties with ERROR") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if setPropertiesResponse == nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR nil response") + err = fmt.Errorf("nil response error") + log.WithField("partition", envId).WithError(err). + Debugf("finished call odc.SetProperties, ERROR nil response") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := setPropertiesResponse.GetError(); odcErr != nil { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, ERROR in response payload") + log.WithField("partition", envId). + WithError(err). + Debugf("finished call odc.SetProperties, ERROR in response payload") + + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := setPropertiesResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - log.WithField("partition", envId).WithError(err).Debugf("finished call odc.SetProperties, bad status in response payload") + log.WithField("partition", envId). + WithError(err). + Debugf("finished call odc.SetProperties, bad status in response payload") - return fmt.Errorf("status %s from ODC", replyStatus.String()) + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } log.WithField("partition", envId).Debugf("finished call odc.SetProperties with SUCCESS") + payload["odcResponse"] = &setPropertiesResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform ODC call: SetProperties", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithFields(logrus.Fields{ "odcMsg": setPropertiesResponse.Msg, "odcStatus": setPropertiesResponse.Status.String(), @@ -720,23 +1476,104 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st configureRequest.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } + payload = map[string]interface{}{ + "odcRequest": &configureRequest, + } + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var configureResponse *odcpb.StateReply configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) if err != nil { + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return printGrpcError(err) } if configureResponse == nil || configureResponse.Reply == nil { + err = fmt.Errorf("nil response error") + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + // We got a nil response with nil error, this should never happen - return errors.New("nil response error") + return err } if odcErr := configureResponse.Reply.GetError(); odcErr != nil { - return fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + + payload["odcResponse"] = &configureResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err } if replyStatus := configureResponse.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { - return fmt.Errorf("status %s from ODC", replyStatus.String()) - } + err = fmt.Errorf("status %s from ODC", replyStatus.String()) + + payload["odcResponse"] = &configureResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return err + } + + payload["odcResponse"] = &configureResponse + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform ODC call: Configure", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithFields(logrus.Fields{ "odcMsg": configureResponse.Reply.Msg, "odcStatus": configureResponse.Reply.Status.String(), diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 0cfc5992e..65ff86c34 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021-2022 CERN and copyright holders of ALICE O². + * Copyright 2021-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -42,12 +42,14 @@ import ( common_event "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/integration/odc/event" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" @@ -256,6 +258,17 @@ func (p *Plugin) queryPartitionStatus() { WithField("state", partitionInfo.State). Info("ODC Partition state changed") + payload := map[string]interface{}{ + "odcStatus": &response, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: "odc.queryPartitionStatus", + EnvironmentId: id.String(), + Payload: string(payloadJson[:]), + }) + envMan := environment.ManagerInstance() if envMan != nil { go envMan.NotifyIntegratedServiceEvent(&event.OdcPartitionStateChangeEvent{ @@ -1062,7 +1075,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "resources": resources, "extractTopoResources": strconv.FormatBool(extractTopoResources), }, - paddingTimeout, envId) + paddingTimeout, envId, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1156,7 +1169,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId) + err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId, call) if err != nil { log.WithField("level", infologger.IL_Support). WithField("partition", envId). @@ -1178,7 +1191,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleReset(ctx, p.odcClient, nil, paddingTimeout, envId) + err := handleReset(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1207,7 +1220,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handlePartitionTerminate(ctx, p.odcClient, nil, paddingTimeout, envId) + err := handlePartitionTerminate(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1267,7 +1280,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err = handleStart(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64) + err = handleStart(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1306,7 +1319,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err = handleStop(ctx, p.odcClient, nil, paddingTimeout, envId, runNumberu64) + err = handleStop(ctx, p.odcClient, nil, paddingTimeout, envId, runNumberu64, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1327,7 +1340,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, envId) + err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1348,7 +1361,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, "") + err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, "", call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1369,7 +1382,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err := handleCleanupLegacy(ctx, p.odcClient, nil, paddingTimeout, envId) + err := handleCleanupLegacy(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). From 16111c701440dc68b1a9f44407d8ab9dd46b7504 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 18 Mar 2024 17:15:31 +0100 Subject: [PATCH 1842/2352] [core] Emit TRG events --- core/integration/trg/plugin.go | 274 ++++++++++++++++++++++++++++++++- 1 file changed, 268 insertions(+), 6 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 3cb13c864..763a4386c 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -37,11 +37,14 @@ import ( "sync" "time" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" trgpb "github.com/AliceO2Group/Control/core/integration/trg/protos" + "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" "google.golang.org/grpc" @@ -52,6 +55,7 @@ const ( TRG_DIAL_TIMEOUT = 2 * time.Second TRG_POLLING_INTERVAL = 3 * time.Second TRG_RECONCILIATION_TIMEOUT = 5 * time.Second + TOPIC = topic.IntegratedService + topic.Separator + "trg" ) type Plugin struct { @@ -453,6 +457,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + payload := map[string]interface{}{ + "trgRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform TRG call: PrepareForRun", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var response *trgpb.RunReply response, err = p.trgClient.PrepareForRun(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { @@ -466,6 +485,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } @@ -483,10 +513,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } } + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform TRG call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + log.WithField("partition", envId). Info("ALIECS SOR Operation : TRG PrepareForRun success") @@ -611,6 +666,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + payload := map[string]interface{}{ + "trgRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform TRG call: RunLoad", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var response *trgpb.RunReply response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { @@ -625,6 +695,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunLoad", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } @@ -643,10 +724,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunLoad", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } } + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform TRG call: RunLoad", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // runLoad successful, we cache the run number for eventual cleanup p.pendingRunUnloads[envId] = runNumber64 log.WithField("partition", envId). @@ -747,8 +853,22 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var response *trgpb.RunReply + payload := map[string]interface{}{ + "trgRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform TRG call: RunStart", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var response *trgpb.RunReply response, err = p.trgClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). @@ -762,6 +882,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunStart", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } if response != nil { @@ -779,20 +910,47 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunStart", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } } + trgStartTime := time.Now() + + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform TRG call: RunStart", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }, trgStartTime) + // runStart successful, we cache the run number for eventual cleanup p.pendingRunStops[envId] = runNumber64 log.WithField("partition", envId). WithField("run", runNumber64). Info("TRG RunStart success") - trgStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + trgStartTimeS := strconv.FormatInt(trgStartTime.UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { - parentRole.SetGlobalRuntimeVar("trg_start_time_ms", trgStartTime) + parentRole.SetGlobalRuntimeVar("trg_start_time_ms", trgStartTimeS) parentRole.DeleteGlobalRuntimeVar("trg_end_time_ms") } @@ -859,6 +1017,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + payload := map[string]interface{}{ + "trgRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform TRG call: RunStop", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var response *trgpb.RunReply response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { @@ -873,6 +1046,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunStop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } if response != nil { @@ -890,24 +1074,51 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunStop", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } } + trgEndTime := time.Now() + + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform TRG call: RunStop", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }, trgEndTime) + // RunStop successful, we pop the run number from the cache delete(p.pendingRunStops, envId) log.WithField("partition", envId). WithField("run", runNumber64). Info("TRG RunStop success") - trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + trgEndTimeS := strconv.FormatInt(trgEndTime.UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { - parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTimeS) } else { log.WithField("partition", envId). WithField("run", runNumber64). - WithField("trgEndTime", trgEndTime). + WithField("trgEndTime", trgEndTimeS). Debug("could not get parentRole and set TRG end time") } @@ -974,6 +1185,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + payload := map[string]interface{}{ + "trgRequest": &in, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_STARTED, + OperationStep: "perform TRG call: RunUnload", + OperationStepStatus: pb.OpStatus_STARTED, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + var response *trgpb.RunReply response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) if err != nil { @@ -988,6 +1214,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunUnload", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } if response != nil { @@ -1005,10 +1242,35 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "perform TRG call: RunUnload", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + return } } + payload["trgResponse"] = &response + payloadJson, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_OK, + OperationStep: "perform TRG call: RunUnload", + OperationStepStatus: pb.OpStatus_DONE_OK, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + }) + // RunUnload successful, we pop the run number from the cache delete(p.pendingRunUnloads, envId) log.WithField("partition", envId). From 316cc217a5d3daa942c96a312a9697736034842d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Mar 2024 13:36:00 +0100 Subject: [PATCH 1843/2352] [common] Enable AllowAutoTopicCreation in Kafka client --- common/event/writer.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 72b2ad2d4..34b600b18 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -48,9 +48,10 @@ type Writer struct { func NewWriterWithTopic(topic topic.Topic) *Writer { return &Writer{ Writer: &kafka.Writer{ - Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), - Topic: string(topic), - Balancer: &kafka.LeastBytes{}, + Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), + Topic: string(topic), + Balancer: &kafka.LeastBytes{}, + AllowAutoTopicCreation: true, }, } } @@ -102,6 +103,7 @@ func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { err = fmt.Errorf("unsupported event type") } if err != nil { + log.WithField("event", e). WithField("level", infologger.IL_Support). Error(err.Error()) From c925e35ed1057997a530a0969a2c6c4b739305f9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Mar 2024 13:36:27 +0100 Subject: [PATCH 1844/2352] [core] Correct Kafka topic --- core/core.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/core.go b/core/core.go index d52d4f340..bd3e689cd 100644 --- a/core/core.go +++ b/core/core.go @@ -30,6 +30,7 @@ import ( "net" "syscall" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/the" @@ -92,7 +93,7 @@ func Run() error { state.taskman.Start(ctx) // First message to Kafka - the.EventWriter().WriteEvent(&pb.Ev_MetaEvent_CoreStart{ + the.EventWriterWithTopic(topic.Core).WriteEvent(&pb.Ev_MetaEvent_CoreStart{ FrameworkId: state.taskman.GetFrameworkID(), }) From f45705e5a133414abdb2f776547d641ea90dd7f5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Mar 2024 13:36:43 +0100 Subject: [PATCH 1845/2352] [build] Generate fdset file for decoding Kafka messages with pq --- Makefile | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 94d42e265..0fa0370ae 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,7 @@ HAS_PROTOC := $(shell command -v $(GOPROTOCPATH) 2> /dev/null) .EXPORT_ALL_VARIABLES: CGO_ENABLED = 0 -.PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs +.PHONY: build all install generate test debugtest vet fmt clean cleanall help $(WHAT) tools vendor doc docs fdset build: $(WHAT) @@ -273,6 +273,15 @@ tools/protoc: docs: docs/coconut docs/grpc docs/swaggo +fdset: + @echo -e "building fdset files \033[1;33m==>\033[0m \033[1;34m./common/protos\033[0m" + + @mkdir -p fdset + @cd common/protos && protoc -o events.fdset events.proto && cd ../.. + @mv common/protos/events.fdset fdset + + @echo -e "to consume with \033[1;33mhttps://github.com/sevagh/pq\033[0m: FDSET_PATH=./fdset pq kafka aliecs.environment --brokers kafka-broker-hostname:9092 --beginning --msgtype events.Event" + docs/coconut: @echo -e "generating coconut documentation \033[1;33m==>\033[0m \033[1;34m./coconut/doc\033[0m" @cd coconut/doc && go run . && cd ../.. From 3cec8da41f5f18489f4b2927935fc8fed52b1035 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 19 Mar 2024 17:05:51 +0100 Subject: [PATCH 1846/2352] [core] Emit call events to aliecs.call topic and include envId --- common/event/topic/topic.go | 1 + common/protos/events.pb.go | 193 +++++++++++++++++---------------- common/protos/events.proto | 3 +- core/workflow/callable/call.go | 16 ++- 4 files changed, 115 insertions(+), 98 deletions(-) diff --git a/common/event/topic/topic.go b/common/event/topic/topic.go index e026b7974..5acfcf867 100644 --- a/common/event/topic/topic.go +++ b/common/event/topic/topic.go @@ -34,6 +34,7 @@ const ( Environment Topic = Root + Separator + "environment" Role Topic = Root + Separator + "role" Task Topic = Root + Separator + "task" + Call Topic = Root + Separator + "call" Core Topic = Root + Separator + "core" diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 3845c4057..42cb4b0f3 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -539,13 +539,14 @@ type Ev_CallEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` - CallStatus OpStatus `protobuf:"varint,2,opt,name=callStatus,proto3,enum=events.OpStatus" json:"callStatus,omitempty"` - Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` - Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` - Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` - Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` - Path string `protobuf:"bytes,7,opt,name=path,proto3" json:"path,omitempty"` + Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` + CallStatus OpStatus `protobuf:"varint,2,opt,name=callStatus,proto3,enum=events.OpStatus" json:"callStatus,omitempty"` + Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` + Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` + Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + EnvironmentId string `protobuf:"bytes,7,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + Path string `protobuf:"bytes,8,opt,name=path,proto3" json:"path,omitempty"` } func (x *Ev_CallEvent) Reset() { @@ -622,6 +623,13 @@ func (x *Ev_CallEvent) GetError() string { return "" } +func (x *Ev_CallEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + func (x *Ev_CallEvent) GetPath() string { if x != nil { return x.Path @@ -1050,7 +1058,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x22, 0xd6, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, + 0x70, 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, @@ -1062,90 +1070,93 @@ var file_protos_events_proto_rawDesc = []byte{ 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, - 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, - 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, - 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, - 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, - 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, - 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, - 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, - 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, - 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, - 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, - 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, + 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, + 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, + 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, + 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, + 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, + 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, + 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, + 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, + 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, + 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, + 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/common/protos/events.proto b/common/protos/events.proto index edea2e072..ee2ebb123 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -89,7 +89,8 @@ message Ev_CallEvent { Traits traits = 4; string output = 5; string error = 6; - string path = 7; + string environmentId = 7; + string path = 8; } message Ev_RoleEvent { diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 900f690bb..afc21d0bd 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -111,7 +111,7 @@ func (c *Call) Call() error { WithField("level", infologger.IL_Devel). Debugf("calling hook function %s", c.Func) - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ Path: c.GetParentRolePath(), Func: c.Func, CallStatus: evpb.OpStatus_STARTED, @@ -122,6 +122,7 @@ func (c *Call) Call() error { Timeout: c.Traits.Timeout, Critical: c.Traits.Critical, }, + EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) output := "{{" + c.Func + "}}" @@ -163,8 +164,9 @@ func (c *Call) Call() error { Timeout: c.Traits.Timeout, Critical: c.Traits.Critical, }, - Output: output, - Error: errMsg, + Output: output, + Error: errMsg, + EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) return err @@ -190,8 +192,9 @@ func (c *Call) Call() error { Timeout: c.Traits.Timeout, Critical: c.Traits.Critical, }, - Output: output, - Error: errMsg, + Output: output, + Error: errMsg, + EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) return errors.New(errMsg) @@ -208,7 +211,8 @@ func (c *Call) Call() error { Timeout: c.Traits.Timeout, Critical: c.Traits.Critical, }, - Output: output, + Output: output, + EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) return nil From b27cab8a592b4e36e87eb6ddb58a6c5c791d933a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 20 Mar 2024 14:23:36 +0100 Subject: [PATCH 1847/2352] [core] Enable IntegratedServiceEvents --- common/event/writer.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/common/event/writer.go b/common/event/writer.go index 34b600b18..e91fbebc3 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -98,6 +98,11 @@ func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_CallEvent{CallEvent: e}, }) + case *pb.Ev_IntegratedServiceEvent: + err = w.doWriteEvent(&pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, + }) default: err = fmt.Errorf("unsupported event type") From 377c7dfdda0035dffd9fd6e5f9d550606c01f868 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 20 Mar 2024 15:37:31 +0100 Subject: [PATCH 1848/2352] [core] Pass IntegratedServiceEvents by ref --- core/integration/dcs/plugin.go | 90 ++++++++++----------- core/integration/ddsched/plugin.go | 64 +++++++-------- core/integration/odc/handlers.go | 122 ++++++++++++++--------------- core/integration/odc/plugin.go | 2 +- core/integration/trg/plugin.go | 40 +++++----- 5 files changed, 159 insertions(+), 159 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index ebfe3195f..500fae2a8 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -266,7 +266,7 @@ func (p *Plugin) updateDetectorOpAvailabilities(detectorMatrix []*dcspb.Detector } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: "dcs.updateDetectorOpAvailabilities", Payload: string(payloadJson[:]), }) @@ -461,7 +461,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -508,7 +508,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -530,7 +530,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detectorsReadiness"] = knownDetectorStates.EcsDetectorsMap() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -695,7 +695,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -722,7 +722,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -741,7 +741,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if ctx.Err() != nil { err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -760,7 +760,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -780,7 +780,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("DCS PFR timed out") err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -799,7 +799,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). Warn(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -840,7 +840,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -876,7 +876,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -912,7 +912,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, @@ -940,7 +940,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -963,7 +963,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -998,7 +998,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } if dcsopOk { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1029,7 +1029,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["failedDetectors"] = dcsFailedEcsDetectors payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1107,7 +1107,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1154,7 +1154,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1176,7 +1176,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detectorsReadiness"] = knownDetectorStates.EcsDetectorsMap() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1348,7 +1348,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1376,7 +1376,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1396,7 +1396,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if ctx.Err() != nil { err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1416,7 +1416,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1437,7 +1437,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("DCS SOR timed out") err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1457,7 +1457,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Warn(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1500,7 +1500,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1537,7 +1537,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1574,7 +1574,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, @@ -1604,7 +1604,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1628,7 +1628,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1668,7 +1668,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsopOk { p.pendingEORs[envId] = runNumber64 - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1700,7 +1700,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["failedDetectors"] = dcsFailedEcsDetectors payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1871,7 +1871,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1899,7 +1899,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1931,7 +1931,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if ctx.Err() != nil { err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1951,7 +1951,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1972,7 +1972,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("DCS EOR timed out") err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1992,7 +1992,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Warn(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -2038,7 +2038,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -2075,7 +2075,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, @@ -2105,7 +2105,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -2129,7 +2129,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -2167,7 +2167,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsopOk { delete(p.pendingEORs, envId) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -2196,7 +2196,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["failedDetectors"] = dcsFailedEcsDetectors payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 5a4e04515..e440fa91a 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -334,7 +334,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "ddschedRequest": &in, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -356,7 +356,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -385,7 +385,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -401,7 +401,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -415,7 +415,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "lastKnownState": response.PartitionState.String(), } payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -446,7 +446,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_CONFIGURING: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -460,7 +460,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_CONFIGURED: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -486,7 +486,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -516,7 +516,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = response.PartitionState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, @@ -587,7 +587,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "ddschedRequest": &in, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -609,7 +609,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -639,7 +639,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -655,7 +655,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -669,7 +669,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "lastKnownState": response.PartitionState.String(), } payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -700,7 +700,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_TERMINATING: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -714,7 +714,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_TERMINATED: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -740,7 +740,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -769,7 +769,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = response.PartitionState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, @@ -835,7 +835,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -856,7 +856,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -882,7 +882,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -908,7 +908,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition_state", response.PartitionState). Trace("DD scheduler session cleanup not needed") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -920,7 +920,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -950,7 +950,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "ddschedRequest": &in, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -972,7 +972,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1001,7 +1001,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1017,7 +1017,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["ddschedResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1031,7 +1031,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { "lastKnownState": response.PartitionState.String(), } payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1062,7 +1062,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_TERMINATING: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1076,7 +1076,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { case ddpb.PartitionState_PARTITION_TERMINATED: payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1102,7 +1102,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = lastKnownState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1131,7 +1131,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["lastKnownState"] = response.PartitionState.String() payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_TIMEOUT, diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index b2a65d270..488f9019b 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -133,7 +133,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string "odcRequest": &setPropertiesRequest, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -146,7 +146,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string var setPropertiesResponse *odcpb.GeneralReply setPropertiesResponse, err = odcClient.SetProperties(ctx, setPropertiesRequest, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -165,7 +165,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string log.WithField("partition", envId).WithError(err). Debugf("finished call odc.SetProperties, ERROR nil response") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -189,7 +189,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -211,7 +211,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -227,7 +227,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -266,7 +266,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string "odcRequest": &req, } payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -278,7 +278,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string rep, err = odcClient.Start(ctx, req, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -295,7 +295,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string if rep == nil || rep.Reply == nil { err = fmt.Errorf("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -315,7 +315,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -333,7 +333,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -349,7 +349,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -398,7 +398,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] "odcRequest": &req, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -410,7 +410,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] rep, err = odcClient.Stop(ctx, req, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -427,7 +427,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] if rep == nil || rep.Reply == nil { err = fmt.Errorf("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -447,7 +447,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -465,7 +465,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -481,7 +481,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -584,7 +584,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri "odcRequest": &req, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -596,7 +596,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri rep, err = odcClient.Status(ctx, req, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -613,7 +613,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri if rep == nil || rep.GetStatus() == odcpb.ReplyStatus_UNKNOWN { err = fmt.Errorf("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -633,7 +633,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -649,7 +649,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -665,7 +665,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -742,7 +742,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri wg.Wait() if len(partitionsToClean) == 0 { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -751,7 +751,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri EnvironmentId: envId, }) } else { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -785,7 +785,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str "odcRequest": &req, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -797,7 +797,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str rep, err = odcClient.Reset(ctx, req, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -815,7 +815,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str // We got a nil response with nil error, this should never happen err = errors.New("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -834,7 +834,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -852,7 +852,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -868,7 +868,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -911,7 +911,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string "odcRequest": &req, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -923,7 +923,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string rep, err = odcClient.Terminate(ctx, req, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -941,7 +941,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string // We got a nil response with nil error, this should never happen err = errors.New("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -960,7 +960,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -978,7 +978,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -994,7 +994,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1033,7 +1033,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] "odcRequest": &shutdownRequest, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1045,7 +1045,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] shutdownResponse, err = odcClient.Shutdown(ctx, shutdownRequest, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1063,7 +1063,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] // We got a nil response with nil error, this should never happen err = errors.New("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1082,7 +1082,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &shutdownResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1100,7 +1100,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &shutdownResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1116,7 +1116,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] payload["odcResponse"] = &shutdownResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1213,7 +1213,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu "odcRequest": &runRequest, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1225,7 +1225,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu runResponse, err = odcClient.Run(ctx, runRequest, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1242,7 +1242,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu if runResponse == nil { errMsg := "nil response error" - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1268,7 +1268,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu if err != nil { errMsg = err.Error() } - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1293,7 +1293,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu payload["odcResponse"] = &runResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1343,7 +1343,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st "odcRequest": &setPropertiesRequest, } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1360,7 +1360,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st WithError(err). Debugf("finished call odc.SetProperties with ERROR") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1379,7 +1379,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st log.WithField("partition", envId).WithError(err). Debugf("finished call odc.SetProperties, ERROR nil response") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1403,7 +1403,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1425,7 +1425,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1443,7 +1443,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1480,7 +1480,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st "odcRequest": &configureRequest, } payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_ONGOING, @@ -1493,7 +1493,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st var configureResponse *odcpb.StateReply configureResponse, err = odcClient.Configure(ctx, configureRequest, grpc.EmptyCallOption{}) if err != nil { - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1510,7 +1510,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st if configureResponse == nil || configureResponse.Reply == nil { err = fmt.Errorf("nil response error") - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1530,7 +1530,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &configureResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1548,7 +1548,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &configureResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1564,7 +1564,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st payload["odcResponse"] = &configureResponse payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 65ff86c34..8bda15acc 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -263,7 +263,7 @@ func (p *Plugin) queryPartitionStatus() { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: "odc.queryPartitionStatus", EnvironmentId: id.String(), Payload: string(payloadJson[:]), diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 763a4386c..d636ec557 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -462,7 +462,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -485,7 +485,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -515,7 +515,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -532,7 +532,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -671,7 +671,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -695,7 +695,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -726,7 +726,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -743,7 +743,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -858,7 +858,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -882,7 +882,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -912,7 +912,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -931,7 +931,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1022,7 +1022,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1046,7 +1046,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1076,7 +1076,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1095,7 +1095,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEventWithTimestamp(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, @@ -1190,7 +1190,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } payloadJson, _ := json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_STARTED, @@ -1214,7 +1214,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1244,7 +1244,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_ERROR, @@ -1261,7 +1261,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["trgResponse"] = &response payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(pb.Ev_IntegratedServiceEvent{ + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, OperationStatus: pb.OpStatus_DONE_OK, From 87a8a6a9081119dcb61793454bc0ca8af2b2a36d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Mar 2024 12:01:10 +0100 Subject: [PATCH 1849/2352] [core] Write to Kafka asynchronously --- common/event/writer.go | 109 ++++++++++++++++++++++------------------- 1 file changed, 59 insertions(+), 50 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index e91fbebc3..faf4a76d4 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -61,58 +61,67 @@ func (w *Writer) WriteEvent(e interface{}) { } func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { - var err error - switch e := e.(type) { - case *pb.Ev_MetaEvent_CoreStart: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, - }) - case *pb.Ev_MetaEvent_MesosHeartbeat: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, - }) - case *pb.Ev_MetaEvent_FrameworkEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, - }) - case *pb.Ev_TaskEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_TaskEvent{TaskEvent: e}, - }) - case *pb.Ev_RoleEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_RoleEvent{RoleEvent: e}, - }) - case *pb.Ev_EnvironmentEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, - }) - case *pb.Ev_CallEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_CallEvent{CallEvent: e}, - }) - case *pb.Ev_IntegratedServiceEvent: - err = w.doWriteEvent(&pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, - }) + go func() { + var ( + err error + wrappedEvent *pb.Event + ) - default: - err = fmt.Errorf("unsupported event type") - } - if err != nil { + switch e := e.(type) { + case *pb.Ev_MetaEvent_CoreStart: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, + } + case *pb.Ev_MetaEvent_MesosHeartbeat: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, + } + case *pb.Ev_MetaEvent_FrameworkEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, + } + case *pb.Ev_TaskEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_TaskEvent{TaskEvent: e}, + } + case *pb.Ev_RoleEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_RoleEvent{RoleEvent: e}, + } + case *pb.Ev_EnvironmentEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, + } + case *pb.Ev_CallEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_CallEvent{CallEvent: e}, + } + case *pb.Ev_IntegratedServiceEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, + } + } - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Error(err.Error()) - } + if wrappedEvent == nil { + err = fmt.Errorf("unsupported event type") + } else { + err = w.doWriteEvent(wrappedEvent) + } + + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Error(err.Error()) + } + }() } func (w *Writer) doWriteEvent(e *pb.Event) error { From 523a33e2e5db41c215597873d0711b15b541191a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Mar 2024 14:12:05 +0100 Subject: [PATCH 1850/2352] [core] Nullify odc Devices list before emitting events --- core/integration/odc/handlers.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 488f9019b..6f8862163 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -310,6 +310,9 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return err } + // We nullify rep.Devices because the payload is too large to be included in the outgoing event + rep.Devices = nil + if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -442,6 +445,9 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } + // We nullify rep.Devices because the payload is too large to be included in the outgoing event + rep.Devices = nil + if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -829,6 +835,9 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str return err } + // We nullify rep.Devices because the payload is too large to be included in the outgoing event + rep.Devices = nil + if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -955,6 +964,9 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string return err } + // We nullify rep.Devices because the payload is too large to be included in the outgoing event + rep.Devices = nil + if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -1525,6 +1537,9 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return err } + // We nullify configureResponse.Devices because the payload is too large to be included in the outgoing event + configureResponse.Devices = nil + if odcErr := configureResponse.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) From e9a7e895c03ac5edda3c5505bd646b55185417f8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Mar 2024 15:01:08 +0100 Subject: [PATCH 1851/2352] [core] Trim down ODC events some more --- core/integration/odc/handlers.go | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 6f8862163..9555d0ed2 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -180,6 +180,9 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return err } + // We nullify setPropertiesResponse.Hosts because the payload is too large to be included in the outgoing event + setPropertiesResponse.Hosts = nil + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { log.WithField("partition", envId). WithError(err). @@ -310,8 +313,9 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string return err } - // We nullify rep.Devices because the payload is too large to be included in the outgoing event + // We nullify rep.Devices and rep.Reply.Hosts because the payload is too large to be included in the outgoing event rep.Devices = nil + rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -445,8 +449,9 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } - // We nullify rep.Devices because the payload is too large to be included in the outgoing event + // We nullify rep.Devices and rep.Reply.Hosts because the payload is too large to be included in the outgoing event rep.Devices = nil + rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -835,8 +840,9 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str return err } - // We nullify rep.Devices because the payload is too large to be included in the outgoing event + // We nullify rep.Devices and rep.Reply.Hosts because the payload is too large to be included in the outgoing event rep.Devices = nil + rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -964,8 +970,9 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string return err } - // We nullify rep.Devices because the payload is too large to be included in the outgoing event + // We nullify rep.Devices and rep.Reply.Hosts because the payload is too large to be included in the outgoing event rep.Devices = nil + rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -1089,6 +1096,9 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] return err } + // We nullify rep.Hosts because the payload is too large to be included in the outgoing event + shutdownResponse.Hosts = nil + if odcErr := shutdownResponse.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) @@ -1269,6 +1279,9 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu return errors.New(errMsg) } + // We nullify runResponse.Hosts because the payload is too large to be included in the outgoing event + runResponse.Hosts = nil + if odcErr := runResponse.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) } @@ -1406,6 +1419,9 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return err } + // We nullify setPropertiesResponse.Hosts because the payload is too large to be included in the outgoing event + setPropertiesResponse.Hosts = nil + if odcErr := setPropertiesResponse.GetError(); odcErr != nil { log.WithField("partition", envId). WithError(err). @@ -1537,8 +1553,9 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st return err } - // We nullify configureResponse.Devices because the payload is too large to be included in the outgoing event + // We nullify configureResponse.Devices and configureResponse.Reply.Hosts because the payload is too large to be included in the outgoing event configureResponse.Devices = nil + configureResponse.Reply.Hosts = nil if odcErr := configureResponse.Reply.GetError(); odcErr != nil { err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) From 48d92f66266469f05122f26265f6bc19b785a323 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 21 Mar 2024 16:37:57 +0100 Subject: [PATCH 1852/2352] [core] Publish ODC partition state changes --- core/integration/odc/plugin.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 8bda15acc..5fd148fdd 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -259,12 +259,16 @@ func (p *Plugin) queryPartitionStatus() { Info("ODC Partition state changed") payload := map[string]interface{}{ - "odcStatus": &response, + "oldState": existingPartition.State, + "newState": partitionInfo.State, + "partitionId": partitionInfo.PartitionId.String(), + "ddsSessionId": partitionInfo.DdsSessionId, + "ddsSessionStatus": partitionInfo.DdsSessionStatus, } payloadJson, _ := json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: "odc.queryPartitionStatus", + Name: "odc.partitionStateChanged", EnvironmentId: id.String(), Payload: string(payloadJson[:]), }) From 3b2c74ed5398553f1a58c9c6cb5b7dd5d315ec55 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Mar 2024 11:30:41 +0100 Subject: [PATCH 1853/2352] [core] Document events.proto and change currentRunNumber field --- common/protos/events.pb.go | 343 ++++++++++++++++---------------- common/protos/events.proto | 52 ++--- core/environment/environment.go | 174 ++++++++-------- core/environment/eventStream.go | 10 +- 4 files changed, 289 insertions(+), 290 deletions(-) diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 42cb4b0f3..1babe9d66 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -248,13 +248,13 @@ type Ev_EnvironmentEvent struct { EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - CurrentRunNumber uint32 `protobuf:"varint,3,opt,name=currentRunNumber,proto3" json:"currentRunNumber,omitempty"` + RunNumber uint32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` // only when the environment is in the running state Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // any additional message concerning the current state or transition Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` TransitionStatus OpStatus `protobuf:"varint,8,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` - Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // consolidated environment variables at the root role of the environment } func (x *Ev_EnvironmentEvent) Reset() { @@ -303,9 +303,9 @@ func (x *Ev_EnvironmentEvent) GetState() string { return "" } -func (x *Ev_EnvironmentEvent) GetCurrentRunNumber() uint32 { +func (x *Ev_EnvironmentEvent) GetRunNumber() uint32 { if x != nil { - return x.CurrentRunNumber + return x.RunNumber } return 0 } @@ -428,15 +428,15 @@ type Ev_TaskEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // task name, based on the name of the task class + Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` // task id, unique + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // state machine state for this task + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // active/inactive etc. Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` - ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` + ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` // name of the task class from which this task was spawned Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` EnvironmentId string `protobuf:"bytes,8,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - Path string `protobuf:"bytes,9,opt,name=path,proto3" json:"path,omitempty"` + Path string `protobuf:"bytes,9,opt,name=path,proto3" json:"path,omitempty"` // path to the parent taskRole of this task within the environment } func (x *Ev_TaskEvent) Reset() { @@ -539,14 +539,14 @@ type Ev_CallEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` - CallStatus OpStatus `protobuf:"varint,2,opt,name=callStatus,proto3,enum=events.OpStatus" json:"callStatus,omitempty"` - Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` + Func string `protobuf:"bytes,1,opt,name=func,proto3" json:"func,omitempty"` // name of the function being called, within the workflow template context + CallStatus OpStatus `protobuf:"varint,2,opt,name=callStatus,proto3,enum=events.OpStatus" json:"callStatus,omitempty"` // progress or success/failure state of the call + Return string `protobuf:"bytes,3,opt,name=return,proto3" json:"return,omitempty"` // return value of the function Traits *Traits `protobuf:"bytes,4,opt,name=traits,proto3" json:"traits,omitempty"` - Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` - Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` + Output string `protobuf:"bytes,5,opt,name=output,proto3" json:"output,omitempty"` // any additional output of the function + Error string `protobuf:"bytes,6,opt,name=error,proto3" json:"error,omitempty"` // error value, if returned EnvironmentId string `protobuf:"bytes,7,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - Path string `protobuf:"bytes,8,opt,name=path,proto3" json:"path,omitempty"` + Path string `protobuf:"bytes,8,opt,name=path,proto3" json:"path,omitempty"` // path to the parent callRole of this call within the environment } func (x *Ev_CallEvent) Reset() { @@ -642,10 +642,10 @@ type Ev_RoleEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // role name + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // active/inactive etc., derived from the state of child tasks, calls or other roles + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // state machine state for this role + RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` // path to this role within the environment EnvironmentId string `protobuf:"bytes,5,opt,name=environmentId,proto3" json:"environmentId,omitempty"` } @@ -721,14 +721,14 @@ type Ev_IntegratedServiceEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - OperationName string `protobuf:"bytes,3,opt,name=operationName,proto3" json:"operationName,omitempty"` - OperationStatus OpStatus `protobuf:"varint,4,opt,name=operationStatus,proto3,enum=events.OpStatus" json:"operationStatus,omitempty"` - OperationStep string `protobuf:"bytes,5,opt,name=operationStep,proto3" json:"operationStep,omitempty"` - OperationStepStatus OpStatus `protobuf:"varint,6,opt,name=operationStepStatus,proto3,enum=events.OpStatus" json:"operationStepStatus,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // name of the context, usually the path of the callRole that calls a given integrated service function e.g. readout-dataflow.dd-scheduler.terminate + Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` // error message, if any + OperationName string `protobuf:"bytes,3,opt,name=operationName,proto3" json:"operationName,omitempty"` // name of the operation, usually the name of the integrated service function being called e.g. ddsched.PartitionTerminate()" + OperationStatus OpStatus `protobuf:"varint,4,opt,name=operationStatus,proto3,enum=events.OpStatus" json:"operationStatus,omitempty"` // progress or success/failure state of the operation + OperationStep string `protobuf:"bytes,5,opt,name=operationStep,proto3" json:"operationStep,omitempty"` // if the operation has substeps, this is the name of the current substep, like an API call or polling phase + OperationStepStatus OpStatus `protobuf:"varint,6,opt,name=operationStepStatus,proto3,enum=events.OpStatus" json:"operationStepStatus,omitempty"` // progress or success/failure state of the current substep EnvironmentId string `protobuf:"bytes,7,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - Payload string `protobuf:"bytes,8,opt,name=payload,proto3" json:"payload,omitempty"` + Payload string `protobuf:"bytes,8,opt,name=payload,proto3" json:"payload,omitempty"` // any additional payload, depending on the integrated service; there is no schema, it can even be the raw return structure of a remote API call } func (x *Ev_IntegratedServiceEvent) Reset() { @@ -1008,155 +1008,154 @@ var file_protos_events_proto_rawDesc = []byte{ 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0xa7, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x61, 0x67, 0x65, 0x22, 0x99, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x3c, 0x0a, 0x10, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6e, 0x0a, - 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x02, - 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, - 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, - 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, - 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x3c, 0x0a, + 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x6e, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, + 0x84, 0x02, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, + 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, 0x04, 0x0a, - 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, - 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, - 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, - 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, - 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, - 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, - 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, - 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, - 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, - 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, - 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, - 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, + 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, + 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, + 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, + 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, + 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, + 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, + 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, + 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/protos/events.proto b/common/protos/events.proto index ee2ebb123..8be3e4f4f 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -54,13 +54,13 @@ message Ev_MetaEvent_FrameworkEvent { message Ev_EnvironmentEvent { string environmentId = 1; string state = 2; - uint32 currentRunNumber = 3; + uint32 runNumber = 3; // only when the environment is in the running state string error = 4; - string message = 5; + string message = 5; // any additional message concerning the current state or transition string transition = 6; string transitionStep = 7; OpStatus transitionStatus = 8; - map vars = 9; + map vars = 9; // consolidated environment variables at the root role of the environment } message Traits { @@ -71,45 +71,45 @@ message Traits { } message Ev_TaskEvent { - string name = 1; - string taskid = 2; - string state = 3; - string status = 4; + string name = 1; // task name, based on the name of the task class + string taskid = 2; // task id, unique + string state = 3; // state machine state for this task + string status = 4; // active/inactive etc. string hostname = 5; - string className = 6; + string className = 6; // name of the task class from which this task was spawned Traits traits = 7; string environmentId = 8; - string path = 9; + string path = 9; // path to the parent taskRole of this task within the environment } message Ev_CallEvent { - string func = 1; - OpStatus callStatus = 2; - string return = 3; + string func = 1; // name of the function being called, within the workflow template context + OpStatus callStatus = 2; // progress or success/failure state of the call + string return = 3; // return value of the function Traits traits = 4; - string output = 5; - string error = 6; + string output = 5; // any additional output of the function + string error = 6; // error value, if returned string environmentId = 7; - string path = 8; + string path = 8; // path to the parent callRole of this call within the environment } message Ev_RoleEvent { - string name = 1; - string status = 2; - string state = 3; - string rolePath = 4; + string name = 1; // role name + string status = 2; // active/inactive etc., derived from the state of child tasks, calls or other roles + string state = 3; // state machine state for this role + string rolePath = 4; // path to this role within the environment string environmentId = 5; } message Ev_IntegratedServiceEvent { - string name = 1; - string error = 2; - string operationName = 3; - OpStatus operationStatus = 4; - string operationStep = 5; - OpStatus operationStepStatus = 6; + string name = 1; // name of the context, usually the path of the callRole that calls a given integrated service function e.g. readout-dataflow.dd-scheduler.terminate + string error = 2; // error message, if any + string operationName = 3; // name of the operation, usually the name of the integrated service function being called e.g. ddsched.PartitionTerminate()" + OpStatus operationStatus = 4; // progress or success/failure state of the operation + string operationStep = 5; // if the operation has substeps, this is the name of the current substep, like an API call or polling phase + OpStatus operationStepStatus = 6; // progress or success/failure state of the current substep string environmentId = 7; - string payload = 8; + string payload = 8; // any additional payload, depending on the integrated service; there is no schema, it can even be the raw return structure of a remote API call } message Event { diff --git a/core/environment/environment.go b/core/environment/environment.go index 6e5e79101..95e41722b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -157,12 +157,12 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("before_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.GetCurrentRunNumber(), - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", }) // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. @@ -251,25 +251,25 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, }) }, "leave_state": func(_ context.Context, e *fsm.Event) { trigger := fmt.Sprintf("leave_%s", e.Src) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", }) // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. @@ -294,13 +294,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, }) if e.Err != nil { @@ -308,12 +308,12 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Message: "transition step starting", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition step starting", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), }) env.handlerFunc()(e) @@ -323,13 +323,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), }) }, @@ -337,12 +337,12 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("enter_%s", e.Dst) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", }) enterStateTimeMs = strconv.FormatInt(time.Now().UnixMilli(), 10) @@ -359,13 +359,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, }) if e.Err != nil { @@ -385,12 +385,12 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("after_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", }) errHooks := env.handleHooks(env.Workflow(), trigger) @@ -445,13 +445,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } // publish transition step complete event the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, }) }, }, @@ -762,22 +762,22 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map func (env *Environment) TryTransition(t Transition) (err error) { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Message: "transition starting", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition starting", + Transition: t.eventName(), }) err = t.check() if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition impossible", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition impossible", + Transition: t.eventName(), }) return } @@ -785,20 +785,20 @@ func (env *Environment) TryTransition(t Transition) (err error) { if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition error", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition error", + Transition: t.eventName(), }) } else { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - CurrentRunNumber: env.currentRunNumber, - Message: "transition completed successfully", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition completed successfully", + Transition: t.eventName(), }) } return diff --git a/core/environment/eventStream.go b/core/environment/eventStream.go index a23cdcaa7..d1075ec25 100644 --- a/core/environment/eventStream.go +++ b/core/environment/eventStream.go @@ -113,11 +113,11 @@ func (s *eventSub) Send(ev event.Event) { case *event.EnvironmentEvent: re := pb.Event_EnvironmentEvent{ EnvironmentEvent: &pb.Ev_EnvironmentEvent{ - EnvironmentId: typedEvent.GetName(), - State: typedEvent.GetState(), - CurrentRunNumber: typedEvent.GetRun(), - Error: typedEvent.GetError(), - Message: typedEvent.GetMessage(), + EnvironmentId: typedEvent.GetName(), + State: typedEvent.GetState(), + RunNumber: typedEvent.GetRun(), + Error: typedEvent.GetError(), + Message: typedEvent.GetMessage(), }, } data = pb.WrapEvent(&re) From 864153b56d3e014911ddc9365deb469341b5909e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Mar 2024 11:32:52 +0100 Subject: [PATCH 1854/2352] [core] Document currently unused topics --- common/event/topic/topic.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/event/topic/topic.go b/common/event/topic/topic.go index 5acfcf867..ae2e2d262 100644 --- a/common/event/topic/topic.go +++ b/common/event/topic/topic.go @@ -30,9 +30,9 @@ const ( Separator = "." // used to separate topic segments Root Topic = "aliecs" - Run Topic = Root + Separator + "run" + Run Topic = Root + Separator + "run" // currently unused, intended for detailed run information e.g. SOR, SOEOR, EOEOR Environment Topic = Root + Separator + "environment" - Role Topic = Root + Separator + "role" + Role Topic = Root + Separator + "role" // currently unused, intended for role state change events Task Topic = Root + Separator + "task" Call Topic = Root + Separator + "call" From 8ec60616c5c5e553e3c9d084ccf950663a8979ac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Mar 2024 11:54:50 +0100 Subject: [PATCH 1855/2352] [docs] Document Kafka producer functionality --- docs/kafka.md | 63 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 57 insertions(+), 6 deletions(-) diff --git a/docs/kafka.md b/docs/kafka.md index 8329d509a..0f59f9c0e 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -1,9 +1,60 @@ -# Kafka plugin +# Kafka producer functionality in AliECS + +## Kafka producer functionality in AliECS core + +As of 2024 the AliECS core integrates Kafka producer functionality independent of the plugin, with the goal of all consumers eventually migrating to this new interface. + +### Making sure that AliECS sends messages + +To enable the plugin, one should make sure that the following points are fullfiled. +* The consul instance includes coordinates to the list of kafka brokers. + Navigate to `o2/components/aliecs/ANY/any/settings` and make sure the following key value pairs are there: + ``` + kafkaEndpoints: + - "my-kafka-broker-1:9092" + - "my-kafka-broker-2:9092" + - "my-kafka-broker-3:9092" + ``` + Please restart the AliECS core if you modify this file. + +No further AliECS configuration is necessary. + +AliECS will create the necessary topics if they don't exist yet, in this case the very first message will be lost. +Once the topics exist, no further messages can be lost and no action is necessary. + +### Currently available topics + +See [events.proto](../common/protos/events.proto) for the protobuf definitions of the messages. + +* `aliecs.core` - core events that don't concern a specific environment or task +* `aliecs.environment` - events that concern an environment, e.g. environment state changes +* `aliecs.task` - events emitted by a task, e.g. task state changes +* `aliecs.call` - events emitted before and after the execution of a call +* `aliecs.integrated_service.dcs` - events emitted by the DCS integrated service +* `aliecs.integrated_service.ddsched` - events emitted by the DDSched integrated service +* `aliecs.integrated_service.odc` - events emitted by the ODC integrated service +* `aliecs.integrated_service.trg` - events emitted by the TRG integrated service + +### Decoding the messages + +Messages are encoded with protobuf, with the aforementioned [events.proto](../common/protos/events.proto) file defining the schema. +Integraed service messages include a payload portion that is usually JSON-encoded, and has no predefined schema. + +To generate the precompiled protobuf interface, run `make fdset`. +You can then consume the messages from a given topic using [https://github.com/sevagh/pq](https://github.com/sevagh/pq): +``` +$ FDSET_PATH=./fdset pq kafka aliecs.environment --brokers kafka-broker-hostname:9092 --msgtype events.Event +``` + +Adjust the topic name, fdset path, and broker endpoint as necessary, and append `--beginning` to consume past messages from the beginning of the topic. + + +## Legacy events: Kafka plugin The Kafka plugin in AliECS publishes updates messages about new states of environments and lists of environments in the RUNNING state. The messages are encoded with protobuf. -## Making sure that AliECS sends messages +### Making sure that AliECS sends messages To enable the plugin, one should make sure that the following points are fullfiled. * The consul instance includes coordinates to your kafka broker and enables the plugin. @@ -17,7 +68,7 @@ To enable the plugin, one should make sure that the following points are fullfil * Plugin is enabled for the new environments. Make sure that there is a `true` value set in the consul instance at the path `o2/runtime/aliecs/vars/kafka_enabled`. Alternatively, one can put `kafka_enabled : true` in the Advanced configuration panel in the AliECS GUI. -## Currently available topics +### Currently available topics As for today, AliECS publishes on the following types of topics: @@ -25,11 +76,11 @@ As for today, AliECS publishes on the following types of topics: * `aliecs.env_leave_state.` where `state` can be `STANDBY`, `DEPLOYED`, `CONFIGURED`, `RUNNING`, `ERROR`. For each topic, AliECS publishes a `NewStateNotification` message when any environment is about to leave the corresponding state. * `aliecs.env_list.` where `state` is only `RUNNING`. Each time there is an environment state change, AliECS publishes an `ActiveRunsList` message which contains a list of all environments which are currently in `RUNNING` state. -## Decoding the messages +### Decoding the messages Messages are encoded with protobuf. Please use [this](../core/integration/kafka/protos/kafka.proto) proto file to generate code which deserializes the messages. -## Getting Start of Run and End of Run notifications +### Getting Start of Run and End of Run notifications To get SOR and EOR notifications, please subscribe to the two corresponding topics: * `aliecs.env_state.RUNNING` for Start of Run @@ -37,7 +88,7 @@ To get SOR and EOR notifications, please subscribe to the two corresponding topi Both will provide `NewStateNotification` messages encoded with protobuf. Please note that the EOR message will still contain the RUNNING state, because it is sent just before the transition starts. -## Using Kafka debug tools +### Using Kafka debug tools One can use some Kafka command line tools to verify that a given setup works correctly. One should make sure to have Kafka installed on the machine used to run the tools. From 4d8ff1813c9765c8775f72d4ae58bee2017dac7b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 22 Mar 2024 12:02:56 +0100 Subject: [PATCH 1856/2352] [core] OCTRL-846 report done roles to parent roles This makes DONE roles (e.g. killed with SIGTERM) correctly report through mesos that they are DONE. This commit does _not_ make the environment state go to ERROR if the task off-the-rails is critical, it will be done as a part of the same ticket, but different commit. --- core/task/manager.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/core/task/manager.go b/core/task/manager.go index bf43bfabd..881214787 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1165,6 +1165,19 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { mesosState := mesosStatus.GetState() switch mesosState { case mesos.TASK_FINISHED: + log.WithPrefix("taskman"). + WithFields(logrus.Fields{ + "taskId": mesosStatus.GetTaskID().Value, + "state": mesosState.String(), + "reason": mesosStatus.GetReason().String(), + "source": mesosStatus.GetSource().String(), + "message": mesosStatus.GetMessage(), + "level": infologger.IL_Devel, + }). + WithField("partition", tm.GetEnvironmentId().String()). // fixme: this is empty! + Info("task finished") + taskIDValue := mesosStatus.GetTaskID().Value + m.updateTaskState(taskIDValue, "DONE") m.tasksFinished++ case mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: log.WithPrefix("taskman"). From f4da87a56b253c85100b21f71ca3ea9761b71d9b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 22 Mar 2024 12:23:16 +0100 Subject: [PATCH 1857/2352] [build] Bump to v1.7.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 30f4efede..525c5a27a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 6 +VERSION_MINOR := 7 VERSION_PATCH := 0 From c41ab1fa902215fca7272d665902ead2035710b8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 22 Mar 2024 14:42:41 +0100 Subject: [PATCH 1858/2352] [core][executor] more details in logs related to handling roles --- core/workflow/aggregatorrole.go | 5 ++++- core/workflow/callrole.go | 12 +++++++++--- core/workflow/taskrole.go | 12 +++++++++--- executor/executable/controllabletask.go | 18 ++++++++++++++++-- 4 files changed, 38 insertions(+), 9 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index ae4656f32..72217f199 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -238,6 +238,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { "child status": s.String(), "aggregator status": r.status.get().String(), "aggregator role": r.Name, + "partition": r.GetEnvironmentId().String(), }). Trace("aggregator role about to merge incoming child status") r.status.merge(s, r) @@ -252,8 +253,10 @@ func (r *aggregatorRole) updateState(s task.State) { if r == nil { return } - log.WithField("role", r.Name).WithField("state", s.String()).Trace("updating state") r.state.merge(s, r) + log.WithField("role", r.Name). + WithField("partition", r.GetEnvironmentId().String()). + Tracef("updated state to %s upon input state %s", r.state.get().String(), s.String()) r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 8519cec17..ab95d7fe5 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -208,7 +208,9 @@ func (t *callRole) UpdateState(s task.State) { func (t *callRole) updateStatus(s task.Status) { if t.parent == nil { - log.WithField("status", s.String()).Error("cannot update status with nil parent") + log.WithField("status", s.String()). + WithField("partition", t.GetEnvironmentId().String()). + Error("cannot update status with nil parent") } t.status.merge(s, t) t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) @@ -217,10 +219,14 @@ func (t *callRole) updateStatus(s task.Status) { func (t *callRole) updateState(s task.State) { if t.parent == nil { - log.WithField("state", s.String()).Error("cannot update state with nil parent") + log.WithField("state", s.String()). + WithField("partition", t.GetEnvironmentId().String()). + Error("cannot update state with nil parent") } - log.WithField("role", t.Name).WithField("state", s.String()).Trace("updating state") t.state.merge(s, t) + log.WithField("role", t.Name). + WithField("partition", t.GetEnvironmentId().String()). + Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index b7b449a01..42cf0c566 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -212,7 +212,9 @@ func (t *taskRole) UpdateState(s task.State) { func (t *taskRole) updateStatus(s task.Status) { if t.parent == nil { - log.WithField("status", s.String()).Error("cannot update status with nil parent") + log.WithField("status", s.String()). + WithField("partition", t.GetEnvironmentId().String()). + Error("cannot update status with nil parent") } t.status.merge(s, t) t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) @@ -221,10 +223,14 @@ func (t *taskRole) updateStatus(s task.Status) { func (t *taskRole) updateState(s task.State) { if t.parent == nil { - log.WithField("state", s.String()).Error("cannot update state with nil parent") + log.WithField("state", s.String()). + WithField("partition", t.GetEnvironmentId().String()). + Error("cannot update state with nil parent") } - log.WithField("role", t.Name).WithField("state", s.String()).Trace("updating state") t.state.merge(s, t) + log.WithField("role", t.Name). + WithField("partition", t.GetEnvironmentId().String()). + Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) t.parent.updateState(s) } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 8c4754a25..861ee1337 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -467,8 +467,10 @@ func (t *ControllableTask) Launch() error { if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", t.ti.TaskID.GetValue()). + WithField("taskName", t.ti.Name). WithError(err). - Warning("error marshaling message from task") + Warning("error marshaling message") } else { t.sendMessage(jsonEvent) log.WithField("partition", t.knownEnvironmentId.String()). @@ -492,6 +494,8 @@ func (t *ControllableTask) Launch() error { if t.rpc == nil { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", deo.TaskId.GetValue()). + WithField("taskName", t.ti.Name). WithError(err). Debug("event stream done") break @@ -500,6 +504,8 @@ func (t *ControllableTask) Launch() error { if err == io.EOF { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", deo.TaskId.GetValue()). + WithField("taskName", t.ti.Name). WithError(err). Debug("event stream EOF") break @@ -510,7 +516,9 @@ func (t *ControllableTask) Launch() error { WithField("detector", t.knownDetector). WithField("errorType", reflect.TypeOf(err)). WithField("level", infologger.IL_Devel). - Warningf("error receiving event from task %s", deo.TaskId.String()) + WithField("taskId", deo.TaskId.GetValue()). + WithField("taskName", t.ti.Name). + Warning("error receiving event") if status.Code(err) == codes.Unavailable { break } @@ -522,6 +530,8 @@ func (t *ControllableTask) Launch() error { if deviceEvent == nil { log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", deo.TaskId.GetValue()). + WithField("taskName", t.ti.Name). Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } else { @@ -591,10 +601,14 @@ func (t *ControllableTask) Launch() error { _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", t.ti.TaskID.GetValue()). + WithField("taskName", t.ti.Name). Debug("rpc client closed") t.rpc = nil log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). + WithField("taskId", t.ti.TaskID.GetValue()). + WithField("taskName", t.ti.Name). Debug("rpc client removed") } From 0fefbb302ab646c1361c8f2a43faa41a7d82ce76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 22 Mar 2024 18:30:05 +0100 Subject: [PATCH 1859/2352] [core] tasks no longer update state to their parents if they are not critical --- core/workflow/callrole.go | 5 ++++- core/workflow/taskrole.go | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index ab95d7fe5..ef13a44e8 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -228,7 +228,10 @@ func (t *callRole) updateState(s task.State) { WithField("partition", t.GetEnvironmentId().String()). Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) - t.parent.updateState(s) + + if t.Critical == true || s != task.ERROR { + t.parent.updateState(s) + } } func (t *callRole) copy() copyable { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 42cf0c566..fb2c4cc1f 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -232,7 +232,10 @@ func (t *taskRole) updateState(s task.State) { WithField("partition", t.GetEnvironmentId().String()). Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) - t.parent.updateState(s) + + if t.Critical == true || s != task.ERROR { + t.parent.updateState(s) + } } func (t *taskRole) SetTask(taskPtr *task.Task) { From 6a1ae07208bd47b8da122016ffda1b6415fb863a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Mar 2024 18:58:51 +0100 Subject: [PATCH 1860/2352] [core] add safestate unit test, demonstrate two bugs --- core/workflow/safestate_test.go | 158 ++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 core/workflow/safestate_test.go diff --git a/core/workflow/safestate_test.go b/core/workflow/safestate_test.go new file mode 100644 index 000000000..a0080afb6 --- /dev/null +++ b/core/workflow/safestate_test.go @@ -0,0 +1,158 @@ +package workflow + +import ( + "github.com/AliceO2Group/Control/core/task" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("safe state", func() { + Describe("merging states", func() { + When("the state we are updating belongs to a role which is a leaf in the tree", func() { + It("should be overwritten", func() { + cr := &callRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + cr.state.merge(task.RUNNING, cr) + Expect(cr.GetState()).To(Equal(task.RUNNING)) + + tr := &taskRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + tr.state.merge(task.RUNNING, tr) + Expect(tr.GetState()).To(Equal(task.RUNNING)) + }) + }) + When("the state is healthy and is merged with ERROR state", func() { + It("should become ERROR", func() { + ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}} + ar.state.merge(task.ERROR, ar) + Expect(ar.GetState()).To(Equal(task.ERROR)) + }) + }) + When("the state is MIXED and is merged with ERROR state", func() { + It("should become ERROR", func() { + ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.MIXED}}} + ar.state.merge(task.ERROR, ar) + Expect(ar.GetState()).To(Equal(task.ERROR)) + }) + }) + When("the role has at least two sub-roles, the state is ERROR and is merged with MIXED state", func() { + It("should stay ERROR", func() { + // because if we have two sub-roles A and B, where A is in ERROR and B enters MIXED, + // it should not invalidate the ERROR state. + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.MIXED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.MIXED, ar) + Expect(ar.GetState()).To(Equal(task.ERROR)) // FIXME: this fails + }) + }) + When("the role has one sub-role, the state is ERROR and is merged with MIXED state", func() { + It("should become MIXED", func() { + subroles := make([]Role, 1) + subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.MIXED}}} + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.MIXED, ar) + Expect(ar.GetState()).To(Equal(task.MIXED)) + }) + }) + When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state", func() { + It("move to the corresponding healthy state", func() { + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.CONFIGURED, ar) + Expect(ar.GetState()).To(Equal(task.CONFIGURED)) + }) + }) + When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state, but other sub-role stays in ERROR", func() { + It("should stay in ERROR", func() { + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.STANDBY, ar) + Expect(ar.GetState()).To(Equal(task.ERROR)) + }) + }) + When("the role has at least two sub-roles, the state is healthy and one of non-critical sub-roles enters ERROR", func() { + It("should remain in the same state", func() { + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.ERROR, ar) + Expect(ar.GetState()).To(Equal(task.CONFIGURED)) // fixme: this fails + }) + }) + When("the role has at least two sub-roles, the state is healthy and one of critical sub-roles enters a different state than the other", func() { + It("should enter MIXED", func() { + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.RUNNING}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.DONE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.RUNNING}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.DONE, ar) + Expect(ar.GetState()).To(Equal(task.MIXED)) + }) + }) + }) +}) + +func TestSafeState(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Safe State Test Suite") +} From 479eb5b9fa9f2d3e02ef7a0ab92c44f81144cec6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 22 Mar 2024 11:57:37 +0100 Subject: [PATCH 1861/2352] [core] a MIXED subrole state shouldn't always invalidate the parents' ERROR It should only if all subroles stopped being in ERROR --- core/workflow/safestate.go | 2 +- core/workflow/safestate_test.go | 38 +++++++++++++++++++++++++++++---- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 22a03098e..a3284fbdb 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -78,7 +78,7 @@ func (t *SafeState) merge(s task.State, r Role) { } switch { - case s == task.MIXED: + case s == task.MIXED && t.state != task.ERROR: t.state = task.MIXED return case s == task.ERROR: diff --git a/core/workflow/safestate_test.go b/core/workflow/safestate_test.go index a0080afb6..f80e43daa 100644 --- a/core/workflow/safestate_test.go +++ b/core/workflow/safestate_test.go @@ -49,16 +49,15 @@ var _ = Describe("safe state", func() { roleBase: roleBase{state: SafeState{state: task.ERROR}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } - subroles[1] = &taskRole{ + subroles[1] = &aggregatorRole{ roleBase: roleBase{state: SafeState{state: task.MIXED}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } ar := &aggregatorRole{ roleBase: roleBase{state: SafeState{state: task.ERROR}}, aggregator: aggregator{subroles}, } ar.state.merge(task.MIXED, ar) - Expect(ar.GetState()).To(Equal(task.ERROR)) // FIXME: this fails + Expect(ar.GetState()).To(Equal(task.ERROR)) }) }) When("the role has one sub-role, the state is ERROR and is merged with MIXED state", func() { @@ -73,8 +72,20 @@ var _ = Describe("safe state", func() { Expect(ar.GetState()).To(Equal(task.MIXED)) }) }) + When("the role has one sub-role, the state is ERROR and is merged with a healthy state", func() { + It("should return to the healthy state", func() { + subroles := make([]Role, 1) + subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}} + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.CONFIGURED, ar) + Expect(ar.GetState()).To(Equal(task.CONFIGURED)) + }) + }) When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state", func() { - It("move to the corresponding healthy state", func() { + It("should move to the corresponding healthy state", func() { subroles := make([]Role, 2) subroles[0] = &taskRole{ roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, @@ -92,6 +103,25 @@ var _ = Describe("safe state", func() { Expect(ar.GetState()).To(Equal(task.CONFIGURED)) }) }) + When("the role has at least two sub-roles in MIXED, the state is ERROR and is merged with MIXED state", func() { + It("should move to MIXED", func() { + subroles := make([]Role, 2) + subroles[0] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.MIXED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + subroles[1] = &taskRole{ + roleBase: roleBase{state: SafeState{state: task.MIXED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + ar := &aggregatorRole{ + roleBase: roleBase{state: SafeState{state: task.ERROR}}, + aggregator: aggregator{subroles}, + } + ar.state.merge(task.MIXED, ar) + Expect(ar.GetState()).To(Equal(task.MIXED)) + }) + }) When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state, but other sub-role stays in ERROR", func() { It("should stay in ERROR", func() { subroles := make([]Role, 2) From ad9a4afe78886579b9996c2b07d30bb851ba128c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 22 Mar 2024 14:51:02 +0100 Subject: [PATCH 1862/2352] [core] remove the test case in safestate_test.go regarding non-critical tasks most probably non-critical tasks should not try to update the state of their parent role, thus this test case does not make sense. --- core/task/state_test.go | 2 +- core/workflow/safestate_test.go | 19 ------------------- 2 files changed, 1 insertion(+), 20 deletions(-) diff --git a/core/task/state_test.go b/core/task/state_test.go index c7e1cfcaf..345375dd4 100644 --- a/core/task/state_test.go +++ b/core/task/state_test.go @@ -73,7 +73,7 @@ var _ = Describe("task state", func() { }) }) - When("The states are different", func() { + When("The states are concrete, but different", func() { It("returns MIXED", func() { Expect(task.UNKNOWN.X(task.STANDBY)).To(Equal(task.MIXED)) Expect(task.RUNNING.X(task.CONFIGURED)).To(Equal(task.MIXED)) diff --git a/core/workflow/safestate_test.go b/core/workflow/safestate_test.go index f80e43daa..a28feaea1 100644 --- a/core/workflow/safestate_test.go +++ b/core/workflow/safestate_test.go @@ -141,25 +141,6 @@ var _ = Describe("safe state", func() { Expect(ar.GetState()).To(Equal(task.ERROR)) }) }) - When("the role has at least two sub-roles, the state is healthy and one of non-critical sub-roles enters ERROR", func() { - It("should remain in the same state", func() { - subroles := make([]Role, 2) - subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - } - subroles[1] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - } - ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, - aggregator: aggregator{subroles}, - } - ar.state.merge(task.ERROR, ar) - Expect(ar.GetState()).To(Equal(task.CONFIGURED)) // fixme: this fails - }) - }) When("the role has at least two sub-roles, the state is healthy and one of critical sub-roles enters a different state than the other", func() { It("should enter MIXED", func() { subroles := make([]Role, 2) From e779661d89c81f69f8bb99411b936f98221ebfc9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 Mar 2024 13:19:45 +0100 Subject: [PATCH 1863/2352] [build] Bump to v1.7.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 525c5a27a..26652dd5b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 7 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From ca5a29f0326f3f67adcdca607ef06dc12f4e12be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 25 Mar 2024 18:52:55 +0100 Subject: [PATCH 1864/2352] [occ] switched to cmake functions officially provided by libproto --- occ/CMakeLists.txt | 97 ++------------------------------------- occ/protos/CMakeLists.txt | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+), 94 deletions(-) create mode 100644 occ/protos/CMakeLists.txt diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 99a72b211..cf2c38294 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -200,94 +200,8 @@ endif() ### ### Protobuf + gRPC ### -set(PROTOFILES - protos/occ.proto) - -# NOTE: we want the files to end up in a subdirectory "protos" in the build dir, -# but the Protobuf and gRPC generator functions don't support custom output -# directories. -# As a workaround, we rewrite CMAKE_CURRENT_BINARY_DIR for Protobuf/gRPC -# and then restore it to its real CMake-managed value. -file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/protos) -set(CMAKE_CURRENT_BINARY_DIR_OLD ${CMAKE_CURRENT_BINARY_DIR} ) -set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/protos) - -# Protobuf+gRPC generator wrapper -function(PROTOBUF_GENERATE_GRPC_CPP SRCS HDRS) - if (NOT ARGN) - message(SEND_ERROR "Error: PROTOBUF_GENERATE_GRPC_CPP() called without any proto files") - return() - endif () - - if (PROTOBUF_GENERATE_CPP_APPEND_PATH) # This variable is common for all types of output. - # Create an include path for each file specified - foreach (FIL ${ARGN}) - get_filename_component(ABS_FIL ${FIL} ABSOLUTE) - get_filename_component(ABS_PATH ${ABS_FIL} PATH) - list(FIND _protobuf_include_path ${ABS_PATH} _contains_already) - if (${_contains_already} EQUAL -1) - list(APPEND _protobuf_include_path -I ${ABS_PATH}) - endif () - endforeach () - else () - set(_protobuf_include_path -I ${CMAKE_CURRENT_SOURCE_DIR}) - endif () - - if (DEFINED PROTOBUF_IMPORT_DIRS) - foreach (DIR ${PROTOBUF_IMPORT_DIRS}) - get_filename_component(ABS_PATH ${DIR} ABSOLUTE) - list(FIND _protobuf_include_path ${ABS_PATH} _contains_already) - if (${_contains_already} EQUAL -1) - list(APPEND _protobuf_include_path -I ${ABS_PATH}) - endif () - endforeach () - endif () - set(${SRCS}) - set(${HDRS}) - foreach (FIL ${ARGN}) - get_filename_component(ABS_FIL ${FIL} ABSOLUTE) - get_filename_component(FIL_WE ${FIL} NAME_WE) - - list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc") - list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h") - list(APPEND ${SRCS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.grpc.pb.cc") - list(APPEND ${HDRS} "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.grpc.pb.h") - - # protoc cpp generator - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.cc" - "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.pb.h" - COMMAND protobuf::protoc - ARGS --cpp_out ${CMAKE_CURRENT_BINARY_DIR} ${_protobuf_include_path} ${ABS_FIL} - DEPENDS ${ABS_FIL} - COMMENT "Running C++ protocol buffer compiler on ${FIL}" - VERBATIM) - - if(APPLE) - set(libenv DYLD_LIBRARY_PATH=$:$) - endif() - # protoc grpc cpp generator - add_custom_command( - OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.grpc.pb.cc" - "${CMAKE_CURRENT_BINARY_DIR}/${FIL_WE}.grpc.pb.h" - COMMAND ${libenv} $ - ARGS --grpc_out=${CMAKE_CURRENT_BINARY_DIR} - --plugin=protoc-gen-grpc=${gRPC_CPP_PLUGIN_EXECUTABLE} - ${_protobuf_include_path} ${ABS_FIL} - DEPENDS ${ABS_FIL} protobuf::protoc - COMMENT "Running gRPC C++ protocol buffer compiler on ${FIL}" - VERBATIM) - endforeach () - - set_source_files_properties(${${SRCS}} ${${HDRS}} PROPERTIES GENERATED TRUE) - set(${SRCS} ${${SRCS}} PARENT_SCOPE) - set(${HDRS} ${${HDRS}} PARENT_SCOPE) -endfunction() - -protobuf_generate_grpc_cpp(GRPC_SOURCES GRPC_HEADERS ${PROTOFILES}) - -set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR_OLD}) +add_subdirectory(protos) ### ### Build target OCCLIBRARY @@ -332,12 +246,9 @@ if (UNIX AND NOT APPLE) "LINKER:--no-as-needed") endif() - target_link_libraries(${OCCLIBRARY} PUBLIC - gRPC::grpc++ - gRPC::grpc++_reflection - protobuf::libprotobuf + Occ-proto Boost::program_options) generate_export_header(${OCCLIBRARY}) @@ -430,9 +341,7 @@ add_library(${OCCPLUGIN} SHARED target_link_libraries(${OCCPLUGIN} PUBLIC FairMQ::FairMQ - gRPC::grpc++ - gRPC::grpc++_reflection - protobuf::libprotobuf + Occ-proto Boost::program_options) target_include_directories(${OCCPLUGIN} diff --git a/occ/protos/CMakeLists.txt b/occ/protos/CMakeLists.txt new file mode 100644 index 000000000..6ecea3e58 --- /dev/null +++ b/occ/protos/CMakeLists.txt @@ -0,0 +1,47 @@ +# === This file is part of ALICE O² === +# +# Copyright 2024 CERN and copyright holders of ALICE O². +# Author: Michal Tichak +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# +# In applying this license CERN does not waive the privileges and +# immunities granted to it by virtue of its status as an +# Intergovernmental Organization or submit itself to any jurisdiction. + +set(PROTO_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/protos") +set(PROTO_IMPORT_DIR "${CMAKE_CURRENT_LIST_DIR}") + +add_library(Occ-proto OBJECT "${CMAKE_CURRENT_LIST_DIR}/occ.proto") +target_link_libraries(Occ-proto PUBLIC + protobuf::libprotobuf + gRPC::grpc++ + gRPC::grpc++_reflection +) +target_include_directories(Occ-proto PUBLIC "$") + +protobuf_generate( + TARGET Occ-proto + IMPORT_DIRS ${PROTO_IMPORT_DIR} + PROTOC_OUT_DIR "${PROTO_GENERATED_DIR}") + +protobuf_generate( + TARGET Occ-proto + LANGUAGE grpc + GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc + PLUGIN "protoc-gen-grpc=\$" + IMPORT_DIRS ${PROTO_IMPORT_DIRS} + PROTOC_OUT_DIR "${PROTO_GENERATED_DIR}") + +install(TARGETS Occ-proto EXPORT OccTargets) From 90c1e1310ef081b9716bf478b528f8916d18aee7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Mar 2024 15:54:01 +0100 Subject: [PATCH 1865/2352] [build] Bump to v1.7.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 26652dd5b..3dd2d622a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 7 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 8a0b1ea39667337034e700dee86507bc70e9d8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 26 Mar 2024 17:03:13 +0100 Subject: [PATCH 1866/2352] [occ] make directory for protofiles --- occ/protos/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/occ/protos/CMakeLists.txt b/occ/protos/CMakeLists.txt index 6ecea3e58..554abbdfa 100644 --- a/occ/protos/CMakeLists.txt +++ b/occ/protos/CMakeLists.txt @@ -23,6 +23,9 @@ set(PROTO_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/protos") set(PROTO_IMPORT_DIR "${CMAKE_CURRENT_LIST_DIR}") +# this is not necessary for `ninja`, but required for `make` +file(MAKE_DIRECTORY ${PROTO_GENERATED_DIR}) + add_library(Occ-proto OBJECT "${CMAKE_CURRENT_LIST_DIR}/occ.proto") target_link_libraries(Occ-proto PUBLIC protobuf::libprotobuf From 1ad50946102be486144ee490380a94932726ed17 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Mar 2024 17:13:31 +0100 Subject: [PATCH 1867/2352] [build] Bump to v1.7.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 3dd2d622a..d7c839af3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 7 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From b51ea026d373e45f8bde5f2abf6f66bfc1ec9b5e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 27 Mar 2024 10:48:01 +0100 Subject: [PATCH 1868/2352] [core] non-critical roles should never update parents state This commit aligns the behaviour of taskrole and callrole with regards to updating parent's state. Specifically, any state change is not propagated up, not only non-ERROR change. This is consistent with core/workflow/safestage.go:aggregateState function, where non-critical roles have no influence on aggregated states regardless of their states. --- core/workflow/callrole.go | 2 +- core/workflow/taskrole.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index ef13a44e8..745ef291d 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -229,7 +229,7 @@ func (t *callRole) updateState(s task.State) { Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) - if t.Critical == true || s != task.ERROR { + if t.Critical == true { t.parent.updateState(s) } } diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index fb2c4cc1f..6e3cb1dba 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -233,7 +233,7 @@ func (t *taskRole) updateState(s task.State) { Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) - if t.Critical == true || s != task.ERROR { + if t.Critical == true { t.parent.updateState(s) } } From c042a52488bdfeb26e469b91477fde46c32e5826 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 27 Mar 2024 12:06:55 +0100 Subject: [PATCH 1869/2352] [core] test state propagation across role trees One helper function was needed to link children to their parents in the tree without much boiler-plate. Also, there can be one RunSpecs invocation per test package, thus I created one main test suite file for the workflow package, while the specific tests are picked up by this one. --- core/workflow/role_test.go | 204 ++++++++++++++++++++++++++++++++ core/workflow/roleutils.go | 14 +++ core/workflow/safestate_test.go | 6 - core/workflow/workflow_test.go | 12 ++ 4 files changed, 230 insertions(+), 6 deletions(-) create mode 100644 core/workflow/role_test.go create mode 100644 core/workflow/workflow_test.go diff --git a/core/workflow/role_test.go b/core/workflow/role_test.go new file mode 100644 index 000000000..ea2d575f6 --- /dev/null +++ b/core/workflow/role_test.go @@ -0,0 +1,204 @@ +package workflow + +import ( + "github.com/AliceO2Group/Control/core/task" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func complexRoleTree() (root Role, leaves map[string]Role) { + defaultState := task.RUNNING + call1 := &callRole{ + roleBase: roleBase{Name: "call1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}} + task1 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + agg1task_noncritical := &taskRole{ + roleBase: roleBase{Name: "agg1task_noncritical", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: false}} + agg1task_critical := &taskRole{ + roleBase: roleBase{Name: "agg1task_critical", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + agg2task_noncritical := &taskRole{ + roleBase: roleBase{Name: "agg2task_noncritical", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: false}} + + root = &aggregatorRole{ + roleBase{Name: "root", state: SafeState{state: defaultState}}, + aggregator{ + Roles: []Role{ + call1, + task1, + &includeRole{ + aggregatorRole: aggregatorRole{ + roleBase{Name: "agg1", state: SafeState{state: defaultState}}, + aggregator{ + Roles: []Role{ + agg1task_noncritical, + agg1task_critical, + }, + }, + }, + }, + &aggregatorRole{ + roleBase{Name: "agg2", state: SafeState{state: task.INVARIANT}}, + aggregator{ + Roles: []Role{agg2task_noncritical}, + }, + }, + }, + }, + } + + LinkChildrenToParents(root) + + // helper map for easy leaf access + leaves = make(map[string]Role) + leaves["call1"] = call1 + leaves["task1"] = task1 + leaves["agg1task_noncritical"] = agg1task_noncritical + leaves["agg1task_critical"] = agg1task_critical + leaves["agg2task_noncritical"] = agg2task_noncritical + return +} + +var _ = Describe("role", func() { + Describe("state propagation across roles", func() { + const defaultState = task.RUNNING + const otherHealthyState = task.CONFIGURED + + Context("simple aggregator role", func() { + var root Role + When("aggregator role has one critical task and the it changes to a different state", func() { + It("should make the parent role transition to that state", func() { + task1 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + root = &aggregatorRole{ + roleBase{Name: "agg1", state: SafeState{state: defaultState}}, + aggregator{ + Roles: []Role{task1}, + }, + } + LinkChildrenToParents(root) + task1.UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(otherHealthyState)) + }) + }) + When("aggregator role has one non-critical task and the it changes to a different state", func() { + It("should make the parent role state stay in INVARIANT", func() { + task1 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: false}, + } + // the aggregator role is expected to be in INVARIANT, because there are no critical roles inside, + // thus nothing to affect the state of the role + root = &aggregatorRole{ + roleBase{Name: "agg1", state: SafeState{state: task.INVARIANT}}, + aggregator{ + Roles: []Role{task1}, + }, + } + LinkChildrenToParents(root) + task1.UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(task.INVARIANT)) + }) + }) + When("one of critical tasks in an aggregator role changes to a different state", func() { + // this could be changed by the requirements described in the ticket OCTRL-846 + It("should make the parent role transition to MIXED", func() { + task1 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + task2 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + root = &aggregatorRole{ + roleBase{Name: "agg1", state: SafeState{state: defaultState}}, + aggregator{ + Roles: []Role{task1, task2}, + }, + } + LinkChildrenToParents(root) + task1.UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(task.MIXED)) + }) + }) + When("a non-critical task in an aggregator role (with another critical task) changes to a different state", func() { + It("should not influence parent's state", func() { + task1 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: false}, + } + task2 := &taskRole{ + roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, + Traits: task.Traits{Critical: true}, + } + root = &aggregatorRole{ + roleBase{Name: "agg1", state: SafeState{state: defaultState}}, + aggregator{ + Roles: []Role{task1, task2}, + }, + } + LinkChildrenToParents(root) + task1.UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(defaultState)) + }) + }) + }) + + Context("complex role tree", func() { + var root Role + var leaves map[string]Role + BeforeEach(func() { + root, leaves = complexRoleTree() + }) + When("one of the critical tasks moves to a different state than the rest", func() { + It("should make the root role report MIXED", func() { + leaves["agg1task_critical"].(*taskRole).UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(task.MIXED)) + }) + }) + When("one of the critical tasks moves to ERROR", func() { + It("should make the root role report ERROR", func() { + leaves["agg1task_critical"].(*taskRole).UpdateState(task.ERROR) + Expect(root.GetState()).To(Equal(task.ERROR)) + }) + }) + When("one of the non-critical tasks, which is aggregated with a critical task, moves to a different healthy state than the rest", func() { + It("should not influence the root role state", func() { + leaves["agg1task_noncritical"].(*taskRole).UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(defaultState)) + }) + }) + When("one of the non-critical tasks, which is alone in an aggregator role, moves to a different healthy state than the rest", func() { + It("should not influence the root role state", func() { + leaves["agg2task_noncritical"].(*taskRole).UpdateState(otherHealthyState) + Expect(root.GetState()).To(Equal(defaultState)) + }) + }) + When("one of the non-critical tasks moves to ERROR", func() { + It("should not influence the root role state", func() { + leaves["agg1task_noncritical"].(*taskRole).UpdateState(task.ERROR) + Expect(root.GetState()).To(Equal(defaultState)) + }) + }) + When("all critical tasks transition to another healthy state", func() { + It("should move the root role state to the new healthy state", func() { + for _, leaf := range leaves { + if typedLeaf, ok := leaf.(Updatable); ok { + typedLeaf.updateState(otherHealthyState) + } + } + Expect(root.GetState()).To(Equal(otherHealthyState)) + }) + }) + }) + }) +}) diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 288877f2d..560d33905 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -105,7 +105,21 @@ func LeafWalk(root Role, do func(role Role)) { case *callRole: do(typed) } +} + +// LinkChildrenToParents walks through the role tree and sets the correct parent for each child +func LinkChildrenToParents(root Role) { + var setParents func(role Role, parent Role) + setParents = func(role Role, parent Role) { + if typedParent, ok := parent.(Updatable); ok { + role.setParent(typedParent) + } + for _, child := range role.GetRoles() { + setParents(child, role) + } + } + setParents(root, nil) } func MakeDisabledRoleCallback(r Role) func(stage template.Stage, err error) error { diff --git a/core/workflow/safestate_test.go b/core/workflow/safestate_test.go index a28feaea1..7357332a5 100644 --- a/core/workflow/safestate_test.go +++ b/core/workflow/safestate_test.go @@ -4,7 +4,6 @@ import ( "github.com/AliceO2Group/Control/core/task" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "testing" ) var _ = Describe("safe state", func() { @@ -162,8 +161,3 @@ var _ = Describe("safe state", func() { }) }) }) - -func TestSafeState(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Safe State Test Suite") -} diff --git a/core/workflow/workflow_test.go b/core/workflow/workflow_test.go new file mode 100644 index 000000000..f370b01cf --- /dev/null +++ b/core/workflow/workflow_test.go @@ -0,0 +1,12 @@ +package workflow + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +func TestCoreWorkflow(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Core Workflow Test Suite") +} From 1dd0b012e05893c9784964a54bf28837b62a4f05 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 27 Mar 2024 12:31:34 +0100 Subject: [PATCH 1870/2352] [core] remove obsolete workaround to make ERROR state always win As far as I understand, this was an attempt at fixing the cases when ERROR state is overriden by MIXED, which was fixed in https://github.com/AliceO2Group/Control/pull/535 and https://github.com/AliceO2Group/Control/pull/536 directly in the state arithmetics code. I don't think this is needed anymore and happy tests seem to confirm it. --- core/workflow/safestate.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index a3284fbdb..03cb0fa25 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -39,7 +39,6 @@ func aggregateState(roles []Role) (state task.State) { if len(roles) == 0 { return } - var hasBeenInError = false for _, c := range roles { taskR, isTaskRole := c.(*taskRole) callR, isCallRole := c.(*callRole) @@ -52,14 +51,8 @@ func aggregateState(roles []Role) (state task.State) { continue } } - if c.GetState() == task.ERROR { - hasBeenInError = true - } state = state.X(c.GetState()) } - if hasBeenInError && state == task.MIXED { - state = task.ERROR - } return } From b1676d972a05638141211973240f3f254987f9f7 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Mar 2024 11:22:57 +0100 Subject: [PATCH 1871/2352] [core] Emit role events to aliecs.role topic --- core/workflow/aggregatorrole.go | 22 ++++++++++++++++++++++ core/workflow/callrole.go | 23 +++++++++++++++++++++++ core/workflow/taskrole.go | 23 +++++++++++++++++++++++ 3 files changed, 68 insertions(+) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 72217f199..418f4a66b 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -31,6 +31,8 @@ import ( texttemplate "text/template" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -234,6 +236,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { if r == nil { return } + oldStatus := r.status.get() log.WithFields(logrus.Fields{ "child status": s.String(), "aggregator status": r.status.get().String(), @@ -243,6 +246,15 @@ func (r *aggregatorRole) updateStatus(s task.Status) { Trace("aggregator role about to merge incoming child status") r.status.merge(s, r) log.WithField("new status", r.status.get()).Trace("status merged") + + if oldStatus != r.status.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: r.Name, + Status: r.status.get().String(), + RolePath: r.GetPath(), + EnvironmentId: r.GetEnvironmentId().String(), + }) + } r.SendEvent(&event.RoleEvent{Name: r.Name, Status: r.status.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateStatus(r.status.get()) @@ -253,10 +265,20 @@ func (r *aggregatorRole) updateState(s task.State) { if r == nil { return } + oldState := r.state.get() r.state.merge(s, r) log.WithField("role", r.Name). WithField("partition", r.GetEnvironmentId().String()). Tracef("updated state to %s upon input state %s", r.state.get().String(), s.String()) + + if oldState != r.state.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: r.Name, + State: r.state.get().String(), + RolePath: r.GetPath(), + EnvironmentId: r.GetEnvironmentId().String(), + }) + } r.SendEvent(&event.RoleEvent{Name: r.Name, State: r.state.get().String(), RolePath: r.GetPath()}) if r.parent != nil { r.parent.updateState(r.state.get()) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 745ef291d..4070fb7f5 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -31,6 +31,8 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -207,17 +209,29 @@ func (t *callRole) UpdateState(s task.State) { } func (t *callRole) updateStatus(s task.Status) { + oldStatus := t.status.get() if t.parent == nil { log.WithField("status", s.String()). WithField("partition", t.GetEnvironmentId().String()). Error("cannot update status with nil parent") } t.status.merge(s, t) + + if oldStatus != t.status.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: t.Name, + Status: t.status.get().String(), + RolePath: t.GetPath(), + EnvironmentId: t.GetEnvironmentId().String(), + }) + } t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) + t.parent.updateStatus(s) } func (t *callRole) updateState(s task.State) { + oldState := t.state.get() if t.parent == nil { log.WithField("state", s.String()). WithField("partition", t.GetEnvironmentId().String()). @@ -227,6 +241,15 @@ func (t *callRole) updateState(s task.State) { log.WithField("role", t.Name). WithField("partition", t.GetEnvironmentId().String()). Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) + + if oldState != t.state.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: t.Name, + State: t.state.get().String(), + RolePath: t.GetPath(), + EnvironmentId: t.GetEnvironmentId().String(), + }) + } t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) if t.Critical == true { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 6e3cb1dba..ceac8687f 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -31,6 +31,8 @@ import ( "time" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" @@ -211,17 +213,29 @@ func (t *taskRole) UpdateState(s task.State) { } func (t *taskRole) updateStatus(s task.Status) { + oldStatus := t.status.get() if t.parent == nil { log.WithField("status", s.String()). WithField("partition", t.GetEnvironmentId().String()). Error("cannot update status with nil parent") } t.status.merge(s, t) + + if oldStatus != t.status.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: t.Name, + Status: t.status.get().String(), + RolePath: t.GetPath(), + EnvironmentId: t.GetEnvironmentId().String(), + }) + } t.SendEvent(&event.RoleEvent{Name: t.Name, Status: t.status.get().String(), RolePath: t.GetPath()}) + t.parent.updateStatus(s) } func (t *taskRole) updateState(s task.State) { + oldState := t.state.get() if t.parent == nil { log.WithField("state", s.String()). WithField("partition", t.GetEnvironmentId().String()). @@ -231,6 +245,15 @@ func (t *taskRole) updateState(s task.State) { log.WithField("role", t.Name). WithField("partition", t.GetEnvironmentId().String()). Tracef("updated state to %s upon input state %s", t.state.get().String(), s.String()) + + if oldState != t.state.get() { + the.EventWriterWithTopic(topic.Role).WriteEvent(&pb.Ev_RoleEvent{ + Name: t.Name, + State: t.state.get().String(), + RolePath: t.GetPath(), + EnvironmentId: t.GetEnvironmentId().String(), + }) + } t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) if t.Critical == true { From 9cd8ea556818df63f7d8bd5cafe49348e03dc926 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 28 Mar 2024 14:31:45 +0100 Subject: [PATCH 1872/2352] [build] Bump to v1.8.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index d7c839af3..64444b13b 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 7 -VERSION_PATCH := 3 +VERSION_MINOR := 8 +VERSION_PATCH := 0 From 88bf61c86c8e1c0152528a06eac00c48f2b46c53 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 28 Mar 2024 11:54:01 +0100 Subject: [PATCH 1873/2352] OCTRL-851 [core] do not attempt to transition inactive tasks --- core/environment/transition_configure.go | 7 ++++--- core/environment/transition_reset.go | 15 ++++++++------- core/environment/transition_startactivity.go | 3 ++- core/environment/transition_stopactivity.go | 7 +------ core/workflow/roleutils.go | 12 ++++++++++++ 5 files changed, 27 insertions(+), 17 deletions(-) diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index e64b985f1..ee4229fb2 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" @@ -52,11 +53,11 @@ func (t ConfigureTransition) do(env *Environment) (err error) { wf := env.Workflow() - tasks := wf.GetTasks() + activeTasks := workflow.GetActiveTasks(wf) - if len(tasks) != 0 { + if len(activeTasks) != 0 { // err = t.taskman.ConfigureTasks(env.Id().Array(), tasks) - taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id(), tasks, nil) + taskmanMessage := task.NewEnvironmentMessage(taskop.ConfigureTasks, env.Id(), activeTasks, nil) t.taskman.MessageChannel <- taskmanMessage } incomingEv := <-env.stateChangedCh diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index 8aed45c4f..a1f8a0c54 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -28,6 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow" ) func NewResetTransition(taskman *task.Manager) Transition { @@ -49,13 +50,13 @@ func (t ResetTransition) do(env *Environment) (err error) { } taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), - task.CONFIGURED.String(), - task.RESET.String(), - task.STANDBY.String(), - nil, - env.Id(), - ) + workflow.GetActiveTasks(env.Workflow()), + task.CONFIGURED.String(), + task.RESET.String(), + task.STANDBY.String(), + nil, + env.Id(), + ) t.taskman.MessageChannel <- taskmanMessage incomingEv := <-env.stateChangedCh diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 8b24592c0..382612ca6 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/core/workflow" "strconv" "github.com/AliceO2Group/Control/common/event" @@ -97,7 +98,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { } taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks(), + workflow.GetActiveTasks(env.Workflow()), task.CONFIGURED.String(), task.START.String(), task.RUNNING.String(), diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 22d14d674..a93a12ed3 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -71,12 +71,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { } taskmanMessage := task.NewTransitionTaskMessage( - env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { - if pr, ok := t.GetParentRole().(workflow.Role); ok { - return pr.GetStatus() == task.ACTIVE - } - return false - }), + workflow.GetActiveTasks(env.Workflow()), task.RUNNING.String(), task.STOP.String(), task.CONFIGURED.String(), diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 560d33905..6abb6f20e 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -26,6 +26,7 @@ package workflow import ( "github.com/AliceO2Group/Control/configuration/template" + "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" ) @@ -133,3 +134,14 @@ func MakeDisabledRoleCallback(r Role) func(stage template.Stage, err error) erro return err } } + +func GetActiveTasks(r Role) task.Tasks { + return r.GetTasks().Filtered(func(t *task.Task) bool { + // the parent role of a task is taskRole, thus we are in fact accessing the status of the task. + // t.status is private to the task package, thus we cannot access it directly. + if pr, ok := t.GetParentRole().(Role); ok { + return pr.GetStatus() == task.ACTIVE + } + return false + }) +} From c9532b31a66bc5c734462d8185c230a5d0f83569 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 3 Apr 2024 08:50:47 +0200 Subject: [PATCH 1874/2352] Bump to v1.8.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 64444b13b..b34efb8e5 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 8 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 0f367c7b850b7178e13e015f30f83e2a5a5ae2ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 4 Apr 2024 12:29:11 +0200 Subject: [PATCH 1875/2352] added coverage step to makefile --- .gitignore | 3 ++- Makefile | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3c8beedac..26c35b577 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,5 @@ tools bin wf-unprocessed* wf-processed* -*.*.old \ No newline at end of file +*.*.old +coverage_results diff --git a/Makefile b/Makefile index 0fa0370ae..4bf009fcc 100644 --- a/Makefile +++ b/Makefile @@ -73,6 +73,10 @@ SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configurati TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow GO_TEST_DIRS := ./core/repos ./core/integration/dcs +coverage:COVERAGE_PREFIX := ./coverage_results +coverage:GOTEST_COVERAGE_FILE := $(COVERAGE_PREFIX)/gotest.out +coverage:GOTEST_COVERAGE_FILE_HTML := $(COVERAGE_PREFIX)/gotest.html + # Use linker flags to provide version/build settings to the target PROD :=-X=$(REPOPATH)/common/product EXTLDFLAGS :="-static" @@ -153,6 +157,15 @@ test: @echo -e "\n[gotest] \033[1;33mgo test -v\033[0m $(GO_TEST_DIRS)\033[0m" @$(BUILD_FLAGS) go test -v $(GO_TEST_DIRS) +coverage: + mkdir -p $(COVERAGE_PREFIX) + + # -ginkgo.show-node-events is not necessary for coverage as it only increases verbosity of logs + @echo -e "\n[gotest] \033[1;33mgo test -coverprofile=$(GOTEST_COVERAGE_FILE) -v\033[0m $(TEST_DIRS) $(GO_TEST_DIRS)\033[0m" + @$(BUILD_FLAGS) go test -coverprofile=$(GOTEST_COVERAGE_FILE) -v $(TEST_DIRS) $(GO_TEST_DIRS) + @echo -e "\n[gotest] \033[1;33mgo tool cover -html=$(GOTEST_COVERAGE_FILE) -o $(GOTEST_COVERAGE_FILE_HTML)\033[0m" + @go tool cover -html=$(GOTEST_COVERAGE_FILE) -o $(GOTEST_COVERAGE_FILE_HTML) + debugtest: @echo -e "[Ginkgo] \033[1;33mgo test -v\033[0m $(TEST_DIRS)\033[0m" @$(BUILD_FLAGS) go test -v $(TEST_DIRS) -ginkgo.v -ginkgo.trace -ginkgo.show-node-events From c421c5cc247e5bf98d93dde5db43226b0a08f5d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 10 Apr 2024 20:30:27 +0200 Subject: [PATCH 1876/2352] [core] keeping created kafka writers in global object --- common/event/writer.go | 4 ++++ core/core.go | 1 + core/the/eventwriter.go | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index faf4a76d4..799e88470 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -56,6 +56,10 @@ func NewWriterWithTopic(topic topic.Topic) *Writer { } } +func (w *Writer) Close() { + w.Close() +} + func (w *Writer) WriteEvent(e interface{}) { w.WriteEventWithTimestamp(e, time.Now()) } diff --git a/core/core.go b/core/core.go index bd3e689cd..e0db7224e 100644 --- a/core/core.go +++ b/core/core.go @@ -112,6 +112,7 @@ func Run() error { // Ensure all workflow plugins are destroyed before core teardown integration.PluginsInstance().DestroyAll() + the.ClearEventWriters() return err } diff --git a/core/the/eventwriter.go b/core/the/eventwriter.go index 8c66950d2..bedc27cdd 100644 --- a/core/the/eventwriter.go +++ b/core/the/eventwriter.go @@ -25,14 +25,47 @@ package the import ( + "sync" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" + "github.com/AliceO2Group/Control/common/logger" + "github.com/sirupsen/logrus" +) + +var ( + writers = make(map[topic.Topic]*event.Writer) + mu sync.Mutex + log = logger.New(logrus.StandardLogger(), "core") ) +func createOrGetWriter(topic topic.Topic) *event.Writer { + mu.Lock() + defer mu.Unlock() + + if writer, ok := writers[topic]; ok { + return writer + } + + writers[topic] = event.NewWriterWithTopic(topic) + return writers[topic] +} + func EventWriter() *event.Writer { - return EventWriterWithTopic(topic.Root) + return createOrGetWriter(topic.Root) } func EventWriterWithTopic(topic topic.Topic) *event.Writer { - return event.NewWriterWithTopic(topic) + return createOrGetWriter(topic) +} + +func ClearEventWriters() { + mu.Lock() + defer mu.Unlock() + + log.Logf(logrus.InfoLevel, "Clearing %d kafka producers", len(writers)) + for _, writer := range writers { + writer.Close() + } + clear(writers) } From 4bb693bb3b592abfa7695646e6618acc2ed015e6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 11 Apr 2024 13:49:56 +0200 Subject: [PATCH 1877/2352] Bump to v1.8.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b34efb8e5..381ec6a01 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 8 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 85b76e4f7d2e85c48ee24d36546b14e8d37372d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 26 Apr 2024 13:29:22 +0200 Subject: [PATCH 1878/2352] golang bump to 1.22 --- go.mod | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 983052f18..03a91c2bb 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/AliceO2Group/Control -go 1.21 +go 1.22 -toolchain go1.21.4 +toolchain go1.22.2 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt From 14adf0a3011b05b3f4fd88453f2b6c9fdc2ee208 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 26 Apr 2024 13:39:40 +0200 Subject: [PATCH 1879/2352] Bump to v1.8.3 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 381ec6a01..97caba07a 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 8 -VERSION_PATCH := 2 +VERSION_PATCH := 3 From 90ef93fbd486051c76e68803165d83433e808e1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 24 Apr 2024 17:54:24 +0200 Subject: [PATCH 1880/2352] [core] fixed race condition for getTasks in roster.go --- core/task/roster.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/task/roster.go b/core/task/roster.go index 34f31592b..59d8c3b37 100644 --- a/core/task/roster.go +++ b/core/task/roster.go @@ -96,7 +96,10 @@ func (m *roster) getTasks() Tasks { m.mu.RLock() defer m.mu.RUnlock() - return m.tasks + tasks:= make(Tasks, len(m.tasks)) + copy(tasks, m.tasks) + + return tasks } func (m *roster) updateTasks(tasks Tasks) { From a6ae130033831f800f88053f9d1c9e4862efda9c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 24 Apr 2024 16:02:19 +0200 Subject: [PATCH 1881/2352] add a test for GetTasks and GetRoles --- core/workflow/role_test.go | 58 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 3 deletions(-) diff --git a/core/workflow/role_test.go b/core/workflow/role_test.go index ea2d575f6..f90f5d2a3 100644 --- a/core/workflow/role_test.go +++ b/core/workflow/role_test.go @@ -14,17 +14,20 @@ func complexRoleTree() (root Role, leaves map[string]Role) { task1 := &taskRole{ roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: true}, + Task: &task.Task{}, } agg1task_noncritical := &taskRole{ roleBase: roleBase{Name: "agg1task_noncritical", state: SafeState{state: defaultState}}, - Traits: task.Traits{Critical: false}} + Traits: task.Traits{Critical: false}, + Task: nil} agg1task_critical := &taskRole{ roleBase: roleBase{Name: "agg1task_critical", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: true}, - } + Task: &task.Task{}} agg2task_noncritical := &taskRole{ roleBase: roleBase{Name: "agg2task_noncritical", state: SafeState{state: defaultState}}, - Traits: task.Traits{Critical: false}} + Traits: task.Traits{Critical: false}, + Task: &task.Task{}} root = &aggregatorRole{ roleBase{Name: "root", state: SafeState{state: defaultState}}, @@ -201,4 +204,53 @@ var _ = Describe("role", func() { }) }) }) + + Describe("GetRoles", func() { + When("getting the slice with roles of a complex tree", func() { + var root Role + BeforeEach(func() { + root, _ = complexRoleTree() + }) + + It("should provide the expected role slice", func() { + roles := root.GetRoles() + roleExistsInSlice := func(roles []Role, roleName string) bool { + for _, r := range roles { + if r.GetName() == roleName { + return true + } + } + return false + } + + // we expect that all roles within an aggregator role appear as if they were listed in the parent level + // but aggregator in an aggregator should appear as an aggregator, while the include role is transparent. + // FIXME: is the above really correct? + Expect(len(roles)).To(Equal(4)) + Expect(roleExistsInSlice(roles, "call1")) + Expect(roleExistsInSlice(roles, "task1")) + Expect(roleExistsInSlice(roles, "agg1")) + Expect(roleExistsInSlice(roles, "agg2")) + }) + }) + }) + + Describe("GetTasks", func() { + + When("getting the slice with roles for a complex tree", func() { + var root Role + BeforeEach(func() { + root, _ = complexRoleTree() + }) + It("should provide the expected tasks slice", func() { + tasks := root.GetTasks() + Expect(len(tasks)).To(Equal(3)) // there are 4 tasks in the tree, but is nil, thus 3 + for _, task := range tasks { + Expect(task).NotTo(BeNil()) + } + // fixme: task.Task has private fields and only task.newTaskForMesosOffer sets them at the moment, + // thus i am not able to verify if the correct contents are preserved + }) + }) + }) }) From 14db901a53addc254e0794c3f1bff8c64e766777 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 11 Apr 2024 15:54:07 +0200 Subject: [PATCH 1882/2352] [doc] update the release documentation --- docs/development.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/docs/development.md b/docs/development.md index 6883f4fa9..bfccde00a 100644 --- a/docs/development.md +++ b/docs/development.md @@ -9,13 +9,11 @@ Bugs go to [JIRA](https://alice.its.cern.ch/jira/browse/OCTRL). ## Release Procedure 1. Update documentation if necessary. -2. Bump `VERSION` file, commit. +2. Bump `VERSION` file, commit, push (or pull request). 3. Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. 4. Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. 5. Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. -6. Go to your local clone of `alice-o2-flp-suite-documentation`, descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). +6. Go to your local clone of [`alice-flp/documentation`](https://gitlab.cern.ch/alice-flp/documentation), descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). 7. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). 8. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). 9. Submit pull request with the above to `alisw/alidist`. -10. Go to [Jenkins](https://alijenkins.cern.ch/job/BuildRPM). Accept the certificate warning and find a previous build of `Control` or `O2Suite`. Pick it, and rebuild either `Control` or both, always with `DEFAULTS` set to `o2-dataflow` and `ALIDIST_SLUG` set to `alisw/alidist@aliecs-bump`. -11. Go to your local copy of `system-configuration`, open file `ansible/roles/basevars/vars/main.yml`. Bump what's relevant, commit, push, merge request. \ No newline at end of file From 33a64836b7b57e1bade3c4df3c73b39d9774810f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 13:23:36 +0000 Subject: [PATCH 1883/2352] Bump golang.org/x/net from 0.22.0 to 0.23.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.22.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.22.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 03a91c2bb..a35135cde 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 golang.org/x/crypto v0.21.0 - golang.org/x/net v0.22.0 + golang.org/x/net v0.23.0 golang.org/x/sys v0.18.0 google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 @@ -81,6 +81,7 @@ require ( github.com/onsi/gomega v1.27.10 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.3 + golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 ) require ( @@ -165,7 +166,6 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 // indirect golang.org/x/mod v0.16.0 // indirect golang.org/x/term v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/go.sum b/go.sum index e54b2fd5f..684c6447f 100644 --- a/go.sum +++ b/go.sum @@ -485,8 +485,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 7392f3d0421c9b35de5d8a24035143cd6c5b581f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 29 Apr 2024 12:26:49 +0200 Subject: [PATCH 1884/2352] [core] race condition fix in aggregator.role --- core/workflow/aggregatorrole.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 418f4a66b..576263d36 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -178,7 +178,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf defer wg.Done() role := r.Roles[roleIdx] role.setParent(r) - err = role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) + err := role.ProcessTemplates(workflowRepo, loadSubworkflow, baseConfigStack) if err != nil { roleErrors = multierror.Append(roleErrors, err) } From bb721ed0276860ec2fdc19e223ff6eb351aa1342 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 22 Apr 2024 14:39:33 +0200 Subject: [PATCH 1885/2352] [core] Added missing mutex around eventStream in environment --- core/environment/environment.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 95e41722b..fcddf89d6 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -122,6 +122,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, func() gera.StringMap { return env.GlobalVars }, func() gera.StringMap { return env.UserVars }, func(ev event.Event) { + env.Mu.Lock() + defer env.Mu.Unlock() if env.eventStream != nil { env.eventStream.Send(ev) } From c1d7619f31d59d3eb77ed38a7377a95dbc413524 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 29 Apr 2024 10:00:01 +0200 Subject: [PATCH 1886/2352] [core] inform, not warn if there is one executor on a node --- core/task/scheduler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index a736fe4c2..832187edc 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -635,7 +635,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han log.WithField("executorId", targetExecutorId.Value). WithField("offerHost", offer.GetHostname()). WithField("level", infologger.IL_Support). - Warn("received offer with one executor ID, will use existing executor") + Info("received offer with one executor ID, will use existing executor") } else if len(offer.ExecutorIDs) > 1 { log.WithField("executorId", targetExecutorId.Value). WithField("executorIds", offer.ExecutorIDs). From 6e72bea87d5900a4157b131b6f9ba1e1e6c4d3a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 29 Apr 2024 14:04:54 +0200 Subject: [PATCH 1887/2352] [core] OCTRL-886 correctly use mutex in environment/manager.go --- core/environment/manager.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 9dbfeb92d..bff7ce4a1 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -126,10 +126,19 @@ func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager case *event.TasksReleasedEvent: // If we got a TasksReleasedEvent, it must be matched with a pending // environment teardown. - if thisEnvCh, ok := instance.pendingTeardownsCh[typedEvent.GetEnvironmentId()]; ok { + + instance.mu.RLock() + thisEnvCh, ok := instance.pendingTeardownsCh[typedEvent.GetEnvironmentId()] + instance.mu.RUnlock() + + if ok { thisEnvCh <- typedEvent + + instance.mu.Lock() close(thisEnvCh) delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + instance.mu.Unlock() + } else { // If there is no pending environment teardown, it means that the released task stopped // unexpectedly. In that case, the environment should get torn-down only if the task @@ -145,15 +154,21 @@ func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager } if releaseCriticalTask { thisEnvCh <- typedEvent + + instance.mu.Lock() close(thisEnvCh) delete(instance.pendingTeardownsCh, typedEvent.GetEnvironmentId()) + instance.mu.Unlock() } } case *event.TasksStateChangedEvent: // If we got a TasksStateChangedEvent, it must be matched with a pending // environment transition. - if thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()]; ok { + instance.mu.RLock() + thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()] + instance.mu.RUnlock() + if ok { thisEnvCh <- typedEvent } else { // If there is no pending environment transition, it means that the changed task did so @@ -627,9 +642,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error WithField("level", infologger.IL_Devel). Debug("envman write lock") envs.mu.Lock() + defer envs.mu.Unlock() delete(envs.m, environmentId) env.unsubscribeFromWfState() - envs.mu.Unlock() log.WithField("method", "TeardownEnvironment"). WithField("level", infologger.IL_Devel). Debug("envman write lock") @@ -665,6 +680,8 @@ func (envs *Manager) environment(environmentId uid.ID) (env *Environment, err er if len(environmentId) == 0 { // invalid id return nil, fmt.Errorf("invalid id: %s", environmentId) } + envs.mu.RLock() + defer envs.mu.RUnlock() env, ok := envs.m[environmentId] if !ok { err = errors.New(fmt.Sprintf("no environment with id %s", environmentId)) From ede577b03f97a124d415975c1c93fe013b588b9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 29 Apr 2024 16:16:29 +0200 Subject: [PATCH 1888/2352] [core] OCTRL-889 proper usage of mutex in environment.go --- core/environment/environment.go | 10 +++++++++- core/environment/manager.go | 2 ++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index fcddf89d6..4af1f0a66 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -155,7 +155,11 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, }, fsm.Callbacks{ "before_event": func(_ context.Context, e *fsm.Event) { + + env.Mu.Lock() env.currentTransition = e.Event + env.Mu.Unlock() + trigger := fmt.Sprintf("before_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ @@ -382,7 +386,11 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, }).Debug("environment.sm entering state") }, "after_event": func(_ context.Context, e *fsm.Event) { - defer func() { env.currentTransition = "" }() + defer func() { + env.Mu.Lock() + env.currentTransition = "" + env.Mu.Unlock() + }() trigger := fmt.Sprintf("after_%s", e.Event) diff --git a/core/environment/manager.go b/core/environment/manager.go index bff7ce4a1..9778dbc39 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -469,7 +469,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } + env.Mu.Lock() env.currentTransition = "DESTROY" + env.Mu.Unlock() err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) if err != nil { From 58c8fafda240f04ad98125856ce8929db4c06637 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 30 Apr 2024 12:20:50 +0200 Subject: [PATCH 1889/2352] [build] Bump to v1.9.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 97caba07a..cc358556e 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 8 -VERSION_PATCH := 3 +VERSION_MINOR := 9 +VERSION_PATCH := 0 From 7d06fd506261ba0bf50b64d37d172e7ead5acbfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 30 Apr 2024 16:01:49 +0200 Subject: [PATCH 1890/2352] added racedetector target to Makefile to enable -race build --- Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Makefile b/Makefile index 4bf009fcc..a66cab55a 100644 --- a/Makefile +++ b/Makefile @@ -94,6 +94,12 @@ CGO_ENABLED = 0 build: $(WHAT) +racedetector: validate-go-version + @for target in $(WHAT); do \ + echo -e "\033[1;33mCGO_ENABLED=1 go build -race -mod=vendor\033[0m ./cmd/$$target \033[1;33m==>\033[0m \033[1;34m./bin/$$target\033[0m"; \ + $(WHAT_$$target_BUILD_FLAGS) CGO_ENABLED=1 go build -race -mod=vendor $(VERBOSE_$(V)) -o bin/$$target $(LDFLAGS) ./cmd/$$target; \ + done + all: vendor generate build validate-go-version: ## Validates the installed version of go against AliECS minimum requirement. From 8a9460c795ecd37909c06372807f99121b231e0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 6 May 2024 17:56:19 +0200 Subject: [PATCH 1891/2352] [core] added internal non mutexed method getParentRolePath to task.go --- core/task/task.go | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index fe06b7b48..d3d45dcc2 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -155,15 +155,19 @@ func (t *Task) GetParentRole() interface{} { return t.parent } -func (t *Task) GetParentRolePath() string { - t.mu.RLock() - defer t.mu.RUnlock() +func (t *Task) getParentRolePath() string { if t.parent == nil { return "" } return t.parent.GetPath() } +func (t *Task) GetParentRolePath() string { + t.mu.RLock() + defer t.mu.RUnlock() + return t.getParentRolePath() +} + func (t *Task) IsLocked() bool { t.mu.RLock() defer t.mu.RUnlock() @@ -509,7 +513,7 @@ func (t *Task) SendEvent(ev event.Event) { Status: t.status.String(), Hostname: t.hostname, ClassName: t.className, - Path: t.GetParentRolePath(), + Path: t.getParentRolePath(), } if t.parent == nil { From 40b2b92a3cef1e92f85ec3f358c9de9a43b3c922 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 6 May 2024 13:36:29 +0200 Subject: [PATCH 1892/2352] [core] added the ability to turn off kafka sending --- common/event/writer.go | 42 +++++++++++++++++++++++++------- core/config.go | 2 ++ core/integration/kafka/plugin.go | 6 +++++ core/the/eventwriter.go | 15 ++++++++---- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 799e88470..1283fa993 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -41,12 +41,24 @@ import ( var log = logger.New(logrus.StandardLogger(), "event") -type Writer struct { +type Writer interface { + WriteEvent(e interface{}) + WriteEventWithTimestamp(e interface{}, timestamp time.Time) + Close() +} + +type DummyWriter struct{} + +func (*DummyWriter) WriteEvent(interface{}) {} +func (*DummyWriter) WriteEventWithTimestamp(interface{}, time.Time) {} +func (*DummyWriter) Close() {} + +type KafkaWriter struct { *kafka.Writer } -func NewWriterWithTopic(topic topic.Topic) *Writer { - return &Writer{ +func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { + return &KafkaWriter{ Writer: &kafka.Writer{ Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), Topic: string(topic), @@ -56,15 +68,23 @@ func NewWriterWithTopic(topic topic.Topic) *Writer { } } -func (w *Writer) Close() { - w.Close() +func (w *KafkaWriter) Close() { + if w != nil { + w.Close() + } } -func (w *Writer) WriteEvent(e interface{}) { - w.WriteEventWithTimestamp(e, time.Now()) +func (w *KafkaWriter) WriteEvent(e interface{}) { + if w != nil { + w.WriteEventWithTimestamp(e, time.Now()) + } } -func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { +func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { + if w == nil { + return + } + go func() { var ( err error @@ -128,7 +148,11 @@ func (w *Writer) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { }() } -func (w *Writer) doWriteEvent(e *pb.Event) error { +func (w *KafkaWriter) doWriteEvent(e *pb.Event) error { + if w == nil { + return nil + } + data, err := proto.Marshal(e) if err != nil { return fmt.Errorf("failed to marshal event: %w", err) diff --git a/core/config.go b/core/config.go index 98e7c1ce6..c2676435c 100644 --- a/core/config.go +++ b/core/config.go @@ -123,6 +123,7 @@ func setDefaults() error { viper.SetDefault("configCache", true) viper.SetDefault("taskClassCacheTTL", 7*24*time.Hour) viper.SetDefault("kafkaEndpoints", []string{"localhost:9092"}) + viper.SetDefault("enableKafka", true) return nil } @@ -188,6 +189,7 @@ func setFlags() error { pflag.Bool("configCache", viper.GetBool("configCache"), "Enable cache layer between AliECS core and Apricot") pflag.Duration("taskClassCacheTTL", viper.GetDuration("taskClassCacheTTL"), "TTL for task class cache entries") pflag.StringSlice("kafkaEndpoints", viper.GetStringSlice("kafkaEndpoints"), "List of Kafka endpoints to connect to (default: localhost:9092)") + pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 8a0e1bb33..29f96f548 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -29,6 +29,7 @@ package kafka import ( "context" "encoding/json" + "errors" "net/url" "strconv" "strings" @@ -137,6 +138,11 @@ func (p *Plugin) ErrorLoggerCallback(msg string, a ...interface{}) { } func (p *Plugin) Init(_ string) error { + if !viper.GetBool("enableKafka") { + log.WithField("level", infologger.IL_Support).Error("trying to initialize kafka plugin, when enableKafka flag was set as false") + return errors.New("Cannot init kafka plugin while \"enableKafka\" flags is true") + } + const call = "Init" var err error diff --git a/core/the/eventwriter.go b/core/the/eventwriter.go index bedc27cdd..064f025fc 100644 --- a/core/the/eventwriter.go +++ b/core/the/eventwriter.go @@ -31,31 +31,36 @@ import ( "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) var ( - writers = make(map[topic.Topic]*event.Writer) + writers = make(map[topic.Topic]event.Writer) mu sync.Mutex log = logger.New(logrus.StandardLogger(), "core") ) -func createOrGetWriter(topic topic.Topic) *event.Writer { +func createOrGetWriter(topic topic.Topic) event.Writer { mu.Lock() defer mu.Unlock() if writer, ok := writers[topic]; ok { return writer } + if viper.GetBool("enableKafka") { + writers[topic] = event.NewWriterWithTopic(topic) + } else { + writers[topic] = &event.DummyWriter{} + } - writers[topic] = event.NewWriterWithTopic(topic) return writers[topic] } -func EventWriter() *event.Writer { +func EventWriter() event.Writer { return createOrGetWriter(topic.Root) } -func EventWriterWithTopic(topic topic.Topic) *event.Writer { +func EventWriterWithTopic(topic topic.Topic) event.Writer { return createOrGetWriter(topic) } From 9a4172c493c28d288cc70b0cace218a544ea0c5b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 May 2024 09:19:09 +0200 Subject: [PATCH 1893/2352] [build] Bump to v1.9.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cc358556e..b13a05d88 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 9 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 422898d78bedbe360f80e2d2bcaece7b825aca7c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Tue, 7 May 2024 11:30:50 +0200 Subject: [PATCH 1894/2352] Update configuration.md --- docs/handbook/configuration.md | 42 +++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index d07cba16d..c2b3a86a2 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -64,6 +64,46 @@ Consider the following example: # Task Configuration +## Variables pushed to controlled tasks + +FairMQ and non-FairMQ tasks may receive configuration values from a variety of sources, both from their own user code (for example by querying Apricot with or without the O² Configuration library) as well as via AliECS. + +Variables whose availability to tasks is handled in some way by AliECS include + + * variables pushed via the JIT mechanism to DPL devices + * variables delivered to tasks explicitly via task templates. + +The latter can be + * sourced from Apricot with a query from the task template iself (e.g. `config.Get`), or + * sourced from the variables available to the current AliECS environment, as defined in the workflow template (e.g. readout-dataflow.yaml) + +Depending on the specification in the task template (`command.env`, `command.arguments` or `properties`), the push to the given task can happen + * as system environment variables on task startup, + * as command line parameters on task startup, or + * as (FairMQ) key-values during `CONFIGURE`. + +In addition to the above, which varies depending on the configuration of the environment itself as well as on the configuration of the system as a whole, some special values are pushed by AliECS itself during `START_ACTIVITY`: + + * `runNumber` + * `fill_info_fill_number` + * `fill_info_filling_scheme` + * `fill_info_beam_type` + * `fill_info_stable_beam_start_ms` + * `fill_info_stable_beam_end_ms` + * `run_type` + * `run_start_time_ms` + * `lhc_period` + * `fillInfoFillNumber` + * `fillInfoFillingScheme` + * `fillInfoBeamType` + * `fillInfoStableBeamStartMs` + * `fillInfoStableBeamEndMs` + * `runType` + * `runStartTimeMs` + * `lhcPeriod` + +FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` transition via `SetProperty` calls. + ## Resource wants and limits All task templates allow two top-level blocks with identical syntax: `wants` and `limits`. They are used to specify respectively the minimum claimed resources that the task will request from Mesos, and the maximum resource allowance which, if exceeded, will result in the task being killed. @@ -81,4 +121,4 @@ limits: memory: 8192 # 8 GB, all tasks on this machine will be killed if exceeded; cpu unlimited defaults: (...) -``` \ No newline at end of file +``` From ed029313dd28f313d23504967ab2b13bb7035f19 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 May 2024 11:12:43 +0200 Subject: [PATCH 1895/2352] [core] Push all AliECS-provided run parameters as snake_case+camelCase --- core/environment/transition_startactivity.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 382612ca6..853518f6e 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -26,9 +26,10 @@ package environment import ( "errors" - "github.com/AliceO2Group/Control/core/workflow" "strconv" + "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" @@ -91,7 +92,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "lhc_period", } { if value, ok := cvs[key]; ok { + // we push the above parameters with both camelCase and snake_case identifiers for convenience args[strcase.ToLowerCamel(key)] = value + args[key] = value } } } From beae454bc1a660ac9f131a7fd17e51f5077afa72 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 7 May 2024 11:39:55 +0200 Subject: [PATCH 1896/2352] [build] Bump to v1.9.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index b13a05d88..71525dcf7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 9 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 23d55cc30fca255feac050694fdc6f15160ebdec Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 26 Apr 2024 16:21:29 +0200 Subject: [PATCH 1897/2352] [common] OCTRL-805 allow to group entries in subfolders --- apricot/local/servicehttp.go | 12 +++++ configuration/componentcfg/query.go | 56 ++++++++++-------------- configuration/componentcfg/query_test.go | 27 ++++++++++++ 3 files changed, 62 insertions(+), 33 deletions(-) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 8b208e300..21d6bdd2b 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -100,10 +100,12 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path // like {component}/{runtype}/{rolename}/{entry} apiComponentQuery.HandleFunc("/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) + apiComponentQuery.HandleFunc("/{subentry}/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload // that may be processed or not depending on process=true or false apiComponentQuery.HandleFunc("", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) apiComponentQuery.HandleFunc("/", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) + apiComponentQuery.HandleFunc("/{subentry}", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) // inventory API @@ -406,6 +408,11 @@ func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *h return } + subentry, hasSubentry := queryParams["subentry"] + if hasSubentry { + entry = entry + "/" + subentry + } + resolved, err := httpsvc.svc.ResolveComponentQuery(&componentcfg.Query{ Component: component, RunType: runType, @@ -484,6 +491,11 @@ func (httpsvc *HttpService) ApiGetComponentConfiguration(w http.ResponseWriter, return } + subentry, hasSubentry := queryParams["subentry"] + if hasSubentry { + entry = entry + "/" + subentry + } + queryArgs := r.URL.Query() processS := queryArgs.Get("process") process, err := strconv.ParseBool(processS) diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 66970424d..12f67e1ee 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -42,7 +42,7 @@ const ( var ( // component /RUNTYPE /rolename /entry @timestamp - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\@[0-9]+)?$`) + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_/]+){1}(\@[0-9]+)?$`) // component /RUNTYPE /rolename inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)*$`) @@ -110,39 +110,29 @@ func NewQuery(path string) (p *Query, err error) { } path = strings.TrimSpace(path) if IsStringValidQueryPathWithOptionalTimestamp(path) { - if strings.Contains(path, "@") { - // coconut conf show component/FLAVOR/rolename/entry@timestamp - arg := strings.Replace(path, "@", SEPARATOR, 1) - params := strings.Split(arg, SEPARATOR) - p.Component = params[0] - // Convert FLAVOR to pb-provided enum - typedFlavor, ok := apricotpb.RunType_value[params[1]] - if !ok { - err = E_BAD_KEY - return - } - p.RunType = apricotpb.RunType(typedFlavor) - p.RoleName = params[2] - p.EntryKey = params[3] - p.Timestamp = params[4] - } else if strings.Contains(path, SEPARATOR) { - // coconut conf show component/FLAVOR/rolename/entry - params := strings.Split(path, SEPARATOR) - p.Component = params[0] - // Convert FLAVOR to pb-provided enum - typedFlavor, ok := apricotpb.RunType_value[params[1]] - if !ok { - err = E_BAD_KEY - return - } - p.RunType = apricotpb.RunType(typedFlavor) - p.RoleName = params[2] - p.EntryKey = params[3] - // and if we received a raw path (with / instead of @ before timestamp): - if len(params) > 4 && len(params[4]) > 0 { - p.Timestamp = params[4] - } + + matches := inputFullRegex.FindAllStringSubmatch(path, -1) + + if len(matches) != 1 { + err = E_BAD_KEY + return + } + captureGroups := matches[0][1:] // the first element is the full query, we don't need it + if len(captureGroups) < 4 && len(captureGroups) > 5 { + err = E_BAD_KEY + return + } + p.Component = captureGroups[0] + // Convert FLAVOR to pb-provided enum + typedFlavor, ok := apricotpb.RunType_value[strings.TrimPrefix(captureGroups[1], "/")] + if !ok { + err = E_BAD_KEY + return } + p.RunType = apricotpb.RunType(typedFlavor) + p.RoleName = strings.TrimPrefix(captureGroups[2], "/") + p.EntryKey = strings.TrimPrefix(captureGroups[3], "/") + p.Timestamp = strings.TrimPrefix(captureGroups[4], "@") } else { err = E_BAD_KEY return diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go index e11fe30e9..e1ce73adf 100644 --- a/configuration/componentcfg/query_test.go +++ b/configuration/componentcfg/query_test.go @@ -43,6 +43,21 @@ var _ = Describe("query", func() { It("should be able to generalize to a query for any role name", func() { Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc@1234")) }) + It("should recognize the RunType correctly", func() { + Expect(q.RunType.String()).To(Equal("PHYSICS")) + }) + It("should recognize the RoleName correctly", func() { + Expect(q.RoleName).To(Equal("pp")) + }) + It("should recognize the Component correctly", func() { + Expect(q.Component).To(Equal("qc")) + }) + It("should recognize the EntryKey correctly", func() { + Expect(q.EntryKey).To(Equal("ctp-raw-qc")) + }) + It("should recognize the Timestamp correctly", func() { + Expect(q.Timestamp).To(Equal("1234")) + }) }) When("creating a new query with the full path but no timestamp", func() { @@ -72,6 +87,18 @@ var _ = Describe("query", func() { }) }) + When("creating a new query with entry having a subdirectory", func() { + BeforeEach(func() { + q, err = componentcfg.NewQuery("qc/ANY/any/tpc/clusters") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("the entry should be correctly recognized", func() { + Expect(q.EntryKey).To(Equal("tpc/clusters")) + }) + }) + Describe("dealing with incorrectly formatted queries", func() { When("query is empty", func() { BeforeEach(func() { From 6bdc82706ba814afd4d28d88603a15333599bb2c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 May 2024 17:26:22 +0200 Subject: [PATCH 1898/2352] [common] get rid of the concept of versioning and timestamps since the selected backend does not support it anyway --- apricot/cacheproxy/service.go | 12 +- apricot/local/service.go | 153 +---- apricot/local/servicehttp.go | 3 +- apricot/local/serviceutil.go | 27 +- apricot/protos/apricot.pb.go | 687 +++++++++---------- apricot/protos/apricot.proto | 5 - apricot/protos/apricot_grpc.pb.go | 39 +- apricot/remote/server.go | 36 +- apricot/remote/service.go | 36 +- coconut/cmd/configuration_history.go | 49 -- coconut/cmd/configuration_import.go | 21 +- coconut/configuration/configuration.go | 82 +-- coconut/configuration/configurationutil.go | 95 +-- coconut/doc/coconut_configuration_history.md | 45 -- coconut/doc/coconut_configuration_import.md | 5 +- coconut/doc/coconut_configuration_show.md | 6 +- configuration/cfgbackend/yamlsource.go | 12 +- configuration/componentcfg/componentcfg.go | 55 +- configuration/componentcfg/query.go | 33 +- configuration/componentcfg/query_test.go | 122 ++-- configuration/service.go | 6 +- configuration/template/stack.go | 23 +- configuration/template/stackutil.go | 14 +- core/config.go | 1 - docs/apidocs_apricot.md | 5 - 25 files changed, 475 insertions(+), 1097 deletions(-) delete mode 100644 coconut/cmd/configuration_history.go delete mode 100644 coconut/doc/coconut_configuration_history.md diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index fcc72fbe0..b0c55a608 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -97,20 +97,16 @@ func (s Service) ListComponents() (components []string, err error) { return s.base.ListComponents() } -func (s Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { - return s.base.ListComponentEntries(query, showLatestTimestamp) -} - -func (s Service) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { - return s.base.ListComponentEntryHistory(query) +func (s Service) ListComponentEntries(query *componentcfg.EntriesQuery) (entries []string, err error) { + return s.base.ListComponentEntries(query) } func (s Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) { return s.base.ResolveComponentQuery(query) } -func (s Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { - return s.base.ImportComponentConfiguration(query, payload, newComponent, useVersioning) +func (s Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool) (existingComponentUpdated bool, existingEntryUpdated bool, err error) { + return s.base.ImportComponentConfiguration(query, payload, newComponent) } func (s Service) GetDetectorForHost(hostname string) (string, error) { diff --git a/apricot/local/service.go b/apricot/local/service.go index 749e3ec6a..ccdc592b4 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -28,17 +28,6 @@ import ( "encoding/json" "errors" "fmt" - "io/ioutil" - "net/url" - "os" - "path/filepath" - "runtime" - "sort" - "strconv" - "strings" - "sync" - "time" - "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/configuration/cfgbackend" @@ -48,6 +37,15 @@ import ( "github.com/hashicorp/go-multierror" "github.com/sirupsen/logrus" "github.com/spf13/viper" + "io/ioutil" + "net/url" + "os" + "path/filepath" + "runtime" + "sort" + "strconv" + "strings" + "sync" ) var log = logger.New(logrus.StandardLogger(), "confsys") @@ -281,8 +279,7 @@ func (s *Service) GetAndProcessComponentConfiguration(query *componentcfg.Query, path := query.Path() // We need to decompose the requested GetConfig path into prefix and suffix, - // with the last / as separator (any timestamp if present stays part of the - // suffix). + // with the last / as separator. // This is done to allow internal references between template snippets // within the same Consul directory. indexOfLastSeparator := strings.LastIndex(path, "/") @@ -560,78 +557,38 @@ func (s *Service) ListComponents() (components []string, err error) { return } -func formatComponentEntriesList(keys []string, keyPrefix string, showTimestamp bool) ([]string, error) { +func formatComponentEntriesList(keys []string, keyPrefix string) ([]string, error) { if len(keys) == 0 { return []string{}, errors.New("no keys found") } var components sort.StringSlice - // map of key to timestamp - componentsSet := make(map[string]string) - for _, key := range keys { // The input is assumed to be absolute paths, so we must trim the prefix. // The prefix includes the component name, e.g. o2/components/readout componentsFullName := strings.TrimPrefix(key, keyPrefix) componentParts := strings.Split(componentsFullName, "/") - var componentTimestamp string - // The component name is already stripped as part of the keyPrefix. - // len(ANY/any/entry[/timestamp]) is 4, therefore ↓ + // len(ANY/any/entry) is 3, therefore ↓ + // TODO: support sub entries here!!! if len(componentParts) == 3 { - // 1st acceptable case: single untimestamped entry + // 1st acceptable case: single entry if len(componentParts[len(componentParts)-1]) == 0 { // means this is a folder key with trailing slash "ANY/any/" continue } - - componentTimestamp = "" // we're sure this path cannot contain a timestamp - componentsSet[componentsFullName] = "" - } else if len(componentParts) == 4 { - // A 5-len componentParts could be a timestamped entry, or a folder - // in the latter case, the final component is an empty string, because - // the full path has a trailing slash. - // For this reason, we have 2 cases: showTimestamp=true or false - // If false, we only need to pick 5-len folders (in addition to 4-len - // entries). - // If true, we must pick all true 5-len entries in order to compare them - // & pick the newest (in addition to, as usual, 4-len ones). - componentTimestamp = componentParts[len(componentParts)-1] - componentsFullName = strings.TrimSuffix(componentsFullName, componentcfg.SEPARATOR+componentTimestamp) - if !showTimestamp { - componentsSet[componentsFullName] = "" - } else { - // if we *do* need to compare timestamps to find the latest - if len(componentTimestamp) == 0 { // means this is a folder key with trailing slash "component/ANY/any/entry/" - continue - } - if strings.Compare(componentsSet[componentsFullName], componentTimestamp) < 0 { - componentsSet[componentsFullName] = componentTimestamp - } - } + components = append(components, componentsFullName) } else { continue } } - for entryKey, entryTimestamp := range componentsSet { - if showTimestamp { - if len(entryTimestamp) == 0 { - components = append(components, entryKey) - } else { - components = append(components, entryKey+"@"+entryTimestamp) - } - } else { - components = append(components, entryKey) - } - } - sort.Sort(components) return components, nil } -func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { +func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery) (entries []string, err error) { s.logMethod() keyPrefix := componentcfg.ConfigComponentsPath @@ -648,59 +605,15 @@ func (s *Service) ListComponentEntries(query *componentcfg.EntriesQuery, showLat return } - entries, err = formatComponentEntriesList(keys, keyPrefix, showLatestTimestamp) - if err != nil { - return - } - - return -} - -func (s *Service) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { - s.logMethod() - - if query == nil { - return - } - - fullKeyToQuery := query.AbsoluteWithoutTimestamp() - var keys sort.StringSlice - keys, err = s.src.GetKeysByPrefix(fullKeyToQuery) + entries, err = formatComponentEntriesList(keys, keyPrefix) if err != nil { return } - if len(keys) == 0 { - err = errors.New("empty data returned from configuration backend") - return - } - - if len(query.EntryKey) == 0 { - err = errors.New("history requested for empty entry name") - return - } - - // We trim the prefix + component - keyPrefix := componentcfg.ConfigComponentsPath + query.Component + componentcfg.SEPARATOR - for i := 0; i < len(keys); i++ { - trimmed := strings.TrimPrefix(keys[i], keyPrefix) - componentParts := strings.Split(trimmed, componentcfg.SEPARATOR) - if len(componentParts) != 4 { - // bad key! - continue - } - keys[i] = componentParts[0] + componentcfg.SEPARATOR + - componentParts[1] + componentcfg.SEPARATOR + - componentParts[2] + "@" + - componentParts[3] - } - - sort.Sort(sort.Reverse(keys)) - entries = keys return } -func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { +func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool) (existingComponentUpdated bool, existingEntryUpdated bool, err error) { s.logMethod() if query == nil { @@ -737,34 +650,7 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa entryExists = entriesMap[query.EntryKey] } - // Temporary workaround to allow no-versioning - var latestTimestamp string - latestTimestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - return - } - - if entryExists { - if (latestTimestamp != "0" && latestTimestamp != "") && !useVersioning { - // If a timestamp already exists in the entry specified by the user, than it cannot be used - err = errors.New("Specified entry: '" + query.EntryKey + "' already contains versioned items. Please " + - "specify a different entry name") - return - } - if (latestTimestamp == "0" || latestTimestamp == "") && useVersioning { - // If a timestamp does not exist for specified entry but user wants versioning than an error is thrown - err = errors.New("Specified entry: '" + query.EntryKey + "' already contains un-versioned items. Please " + - "specify a different entry name") - return - } - } - - timestamp := time.Now().Unix() - fullKey := query.AbsoluteWithoutTimestamp() - - if useVersioning { - fullKey += componentcfg.SEPARATOR + strconv.FormatInt(timestamp, 10) - } + fullKey := query.AbsoluteRaw() err = s.src.Put(fullKey, payload) if err != nil { @@ -773,7 +659,6 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa existingComponentUpdated = componentExist existingEntryUpdated = entryExists - newTimestamp = timestamp return } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 21d6bdd2b..19ad68059 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -272,7 +272,7 @@ func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *ht Component: component, RunType: runType, RoleName: rolename, - }, false) + }) filterPrefixes := make(map[string]struct{}) if hasRuntype { @@ -418,7 +418,6 @@ func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *h RunType: runType, RoleName: rolename, EntryKey: entry, - Timestamp: "", }) if err != nil { w.WriteHeader(http.StatusInternalServerError) diff --git a/apricot/local/serviceutil.go b/apricot/local/serviceutil.go index 5af7a6fbc..2a743e22c 100644 --- a/apricot/local/serviceutil.go +++ b/apricot/local/serviceutil.go @@ -40,32 +40,7 @@ func (s *Service) queryToAbsPath(query *componentcfg.Query) (absolutePath string return } - var timestamp string - - if len(query.Timestamp) == 0 { - keyPrefix := query.AbsoluteWithoutTimestamp() - if s.src.IsDir(keyPrefix) { - var keys []string - keys, err = s.src.GetKeysByPrefix(keyPrefix) - if err != nil { - return - } - timestamp, err = componentcfg.GetLatestTimestamp(keys, query) - if err != nil { - timestamp = "" // no timestamp keys found, we'll try to fall back to timestampless - } - } - } else { - timestamp = query.Timestamp - } - absolutePath = query.AbsoluteWithoutTimestamp() + componentcfg.SEPARATOR + timestamp - if exists, _ := s.src.Exists(absolutePath); exists && len(timestamp) > 0 { - err = nil - return - } - - // falling back to timestampless configuration - absolutePath = query.AbsoluteWithoutTimestamp() + absolutePath = query.AbsoluteRaw() if exists, _ := s.src.Exists(absolutePath); exists { err = nil return diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index e53252a04..69136026b 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc-gen-go v1.33.0 +// protoc v3.15.8 // source: protos/apricot.proto package apricotpb @@ -190,7 +190,6 @@ type ComponentQuery struct { RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=apricot.RunType" json:"runType,omitempty"` MachineRole string `protobuf:"bytes,3,opt,name=machineRole,proto3" json:"machineRole,omitempty"` Entry string `protobuf:"bytes,4,opt,name=entry,proto3" json:"entry,omitempty"` - Timestamp string `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ComponentQuery) Reset() { @@ -253,13 +252,6 @@ func (x *ComponentQuery) GetEntry() string { return "" } -func (x *ComponentQuery) GetTimestamp() string { - if x != nil { - return x.Timestamp - } - return "" -} - type ComponentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1166,8 +1158,7 @@ type ListComponentEntriesRequest struct { // // *ListComponentEntriesRequest_Path // *ListComponentEntriesRequest_Query - QueryPath isListComponentEntriesRequest_QueryPath `protobuf_oneof:"queryPath"` - IncludeTimestamps bool `protobuf:"varint,3,opt,name=includeTimestamps,proto3" json:"includeTimestamps,omitempty"` + QueryPath isListComponentEntriesRequest_QueryPath `protobuf_oneof:"queryPath"` } func (x *ListComponentEntriesRequest) Reset() { @@ -1223,13 +1214,6 @@ func (x *ListComponentEntriesRequest) GetQuery() *ComponentEntriesQuery { return nil } -func (x *ListComponentEntriesRequest) GetIncludeTimestamps() bool { - if x != nil { - return x.IncludeTimestamps - } - return false -} - type isListComponentEntriesRequest_QueryPath interface { isListComponentEntriesRequest_QueryPath() } @@ -1486,10 +1470,9 @@ type ImportComponentConfigurationRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Query *ComponentQuery `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` - Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` - NewComponent bool `protobuf:"varint,3,opt,name=newComponent,proto3" json:"newComponent,omitempty"` - UseVersioning bool `protobuf:"varint,4,opt,name=useVersioning,proto3" json:"useVersioning,omitempty"` + Query *ComponentQuery `protobuf:"bytes,1,opt,name=query,proto3" json:"query,omitempty"` + Payload string `protobuf:"bytes,2,opt,name=payload,proto3" json:"payload,omitempty"` + NewComponent bool `protobuf:"varint,3,opt,name=newComponent,proto3" json:"newComponent,omitempty"` } func (x *ImportComponentConfigurationRequest) Reset() { @@ -1545,21 +1528,13 @@ func (x *ImportComponentConfigurationRequest) GetNewComponent() bool { return false } -func (x *ImportComponentConfigurationRequest) GetUseVersioning() bool { - if x != nil { - return x.UseVersioning - } - return false -} - type ImportComponentConfigurationResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ExistingComponentUpdated bool `protobuf:"varint,1,opt,name=existingComponentUpdated,proto3" json:"existingComponentUpdated,omitempty"` - ExistingEntryUpdated bool `protobuf:"varint,2,opt,name=existingEntryUpdated,proto3" json:"existingEntryUpdated,omitempty"` - NewTimestamp int64 `protobuf:"varint,3,opt,name=newTimestamp,proto3" json:"newTimestamp,omitempty"` + ExistingComponentUpdated bool `protobuf:"varint,1,opt,name=existingComponentUpdated,proto3" json:"existingComponentUpdated,omitempty"` + ExistingEntryUpdated bool `protobuf:"varint,2,opt,name=existingEntryUpdated,proto3" json:"existingEntryUpdated,omitempty"` } func (x *ImportComponentConfigurationResponse) Reset() { @@ -1608,13 +1583,6 @@ func (x *ImportComponentConfigurationResponse) GetExistingEntryUpdated() bool { return false } -func (x *ImportComponentConfigurationResponse) GetNewTimestamp() int64 { - if x != nil { - return x.NewTimestamp - } - return 0 -} - type CRUCardsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1769,7 +1737,7 @@ var File_protos_apricot_proto protoreflect.FileDescriptor var file_protos_apricot_proto_rawDesc = []byte{ 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x22, - 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xb0, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x92, 0x01, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, @@ -1778,312 +1746,297 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x92, 0x02, 0x0a, 0x10, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x22, 0x92, 0x02, + 0x0a, 0x10, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2f, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x43, 0x0a, 0x08, 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x76, 0x61, - 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x56, 0x61, 0x72, 0x53, 0x74, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, - 0x22, 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, - 0x58, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6c, - 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x29, 0x0a, 0x0b, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x2c, 0x0a, 0x10, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x0a, 0x19, 0x44, 0x65, 0x74, 0x65, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x76, 0x61, 0x72, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x1a, 0x3b, 0x0a, 0x0d, 0x56, 0x61, 0x72, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, + 0x74, 0x68, 0x22, 0x2d, 0x0a, 0x11, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, + 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x22, 0x58, 0x0a, 0x1e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x29, 0x0a, 0x0b, 0x48, + 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, + 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x2c, 0x0a, 0x10, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2f, 0x0a, 0x19, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x17, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x66, 0x0a, 0x14, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xe2, 0x01, 0x0a, 0x17, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x66, 0x0a, 0x14, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x38, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x31, - 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x12, - 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, - 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x32, - 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, 0x77, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, 0x50, 0x61, - 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x16, - 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x31, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x09, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, + 0x61, 0x70, 0x1a, 0x3c, 0x0a, 0x0e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x22, 0x38, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x39, 0x0a, 0x19, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x32, 0x0a, 0x16, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x61, + 0x77, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x61, 0x77, + 0x50, 0x61, 0x74, 0x68, 0x22, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x5e, + 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x2a, - 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0xa6, 0x01, 0x0a, - 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2a, 0x0a, 0x10, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, 0x11, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x0a, 0x0e, 0x48, 0x6f, - 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, 0x6f, 0x73, 0x74, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, - 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2d, 0x0a, - 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6e, 0x65, - 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, - 0x22, 0xba, 0x01, 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, - 0x73, 0x74, 0x69, 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x6e, 0x65, 0x77, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, - 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, - 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, - 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, - 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, - 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, - 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, - 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, - 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, - 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, - 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, - 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, - 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, - 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, - 0x13, 0x10, 0xab, 0x02, 0x32, 0xb8, 0x0e, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, - 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, - 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, - 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, - 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, - 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, - 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x23, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x22, 0x38, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x39, 0x0a, + 0x19, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x15, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x12, 0x2a, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x10, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x22, 0x78, + 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x0b, 0x0a, 0x09, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x74, 0x68, 0x22, 0x34, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x2a, + 0x0a, 0x10, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x22, 0x31, 0x0a, 0x11, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x2c, 0x0a, + 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x2b, 0x0a, 0x13, 0x48, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x23, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2d, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x6e, 0x65, 0x77, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x22, 0x96, 0x01, + 0x0a, 0x24, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x14, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x22, 0x28, 0x0a, 0x10, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x61, + 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x63, 0x61, 0x72, 0x64, 0x73, + 0x22, 0x49, 0x0a, 0x0b, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, + 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x37, 0x0a, 0x17, 0x43, + 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, + 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, + 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, + 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, + 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, + 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, + 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, + 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, + 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, + 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, + 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, + 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, + 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, + 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, + 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xdd, 0x0d, + 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, + 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, + 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x70, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, + 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, + 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c, + 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, - 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, - 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, - 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, - 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, - 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, - 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, + 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, + 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, - 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x5e, 0x0a, + 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, + 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2163,37 +2116,35 @@ var file_protos_apricot_proto_depIdxs = []int32{ 18, // 23: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest 1, // 24: apricot.Apricot.ListComponents:input_type -> apricot.Empty 20, // 25: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 2, // 26: apricot.Apricot.ListComponentEntryHistory:input_type -> apricot.ComponentQuery - 3, // 27: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 3, // 28: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 2, // 29: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery - 26, // 30: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 1, // 31: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty - 11, // 32: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 12, // 33: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 12, // 34: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 35: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 23, // 36: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 25, // 37: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 10, // 38: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse - 8, // 39: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 23, // 40: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 28, // 41: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 30, // 42: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 43: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 44: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 12, // 45: apricot.Apricot.GetRuntimeEntries:output_type -> apricot.StringMap - 21, // 46: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 21, // 47: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 21, // 48: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 21, // 49: apricot.Apricot.ListComponentEntryHistory:output_type -> apricot.ComponentEntriesResponse - 4, // 50: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 51: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 2, // 52: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery - 27, // 53: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 1, // 54: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty - 32, // [32:55] is the sub-list for method output_type - 9, // [9:32] is the sub-list for method input_type + 3, // 26: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest + 2, // 28: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery + 26, // 29: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 1, // 30: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty + 11, // 31: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 32: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 33: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 34: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 23, // 35: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 25, // 36: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 37: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 38: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 23, // 39: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 28, // 40: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 30, // 41: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 4, // 42: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 43: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 12, // 44: apricot.Apricot.GetRuntimeEntries:output_type -> apricot.StringMap + 21, // 45: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 21, // 46: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 21, // 47: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 4, // 48: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 49: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 2, // 50: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery + 27, // 51: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 1, // 52: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty + 31, // [31:53] is the sub-list for method output_type + 9, // [9:31] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index e02d226f2..61d727e23 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -52,7 +52,6 @@ service Apricot { // Component configuration calls rpc ListComponents(Empty) returns (ComponentEntriesResponse) {} rpc ListComponentEntries(ListComponentEntriesRequest) returns (ComponentEntriesResponse) {} - rpc ListComponentEntryHistory(ComponentQuery) returns (ComponentEntriesResponse) {} rpc GetComponentConfiguration(ComponentRequest) returns (ComponentResponse) {} rpc GetComponentConfigurationWithLastIndex(ComponentRequest) returns (ComponentResponseWithLastIndex) {} rpc ResolveComponentQuery(ComponentQuery) returns (ComponentQuery) {} @@ -97,7 +96,6 @@ message ComponentQuery { RunType runType = 2; string machineRole = 3; string entry = 4; - string timestamp = 5; } message ComponentRequest { @@ -183,7 +181,6 @@ message ListComponentEntriesRequest { string path = 1; ComponentEntriesQuery query = 2; } - bool includeTimestamps = 3; } message ComponentEntriesResponse { @@ -210,13 +207,11 @@ message ImportComponentConfigurationRequest { ComponentQuery query = 1; string payload = 2; bool newComponent = 3; - bool useVersioning = 4; } message ImportComponentConfigurationResponse { bool existingComponentUpdated = 1; bool existingEntryUpdated = 2; - int64 newTimestamp = 3; } message CRUCardsResponse { diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 15252494a..e3e5f7206 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v3.15.8 // source: protos/apricot.proto package apricotpb @@ -59,7 +59,6 @@ const ( Apricot_ListRuntimeEntries_FullMethodName = "/apricot.Apricot/ListRuntimeEntries" Apricot_ListComponents_FullMethodName = "/apricot.Apricot/ListComponents" Apricot_ListComponentEntries_FullMethodName = "/apricot.Apricot/ListComponentEntries" - Apricot_ListComponentEntryHistory_FullMethodName = "/apricot.Apricot/ListComponentEntryHistory" Apricot_GetComponentConfiguration_FullMethodName = "/apricot.Apricot/GetComponentConfiguration" Apricot_GetComponentConfigurationWithLastIndex_FullMethodName = "/apricot.Apricot/GetComponentConfigurationWithLastIndex" Apricot_ResolveComponentQuery_FullMethodName = "/apricot.Apricot/ResolveComponentQuery" @@ -91,7 +90,6 @@ type ApricotClient interface { // Component configuration calls ListComponents(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) ListComponentEntries(ctx context.Context, in *ListComponentEntriesRequest, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) - ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) GetComponentConfigurationWithLastIndex(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponseWithLastIndex, error) ResolveComponentQuery(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentQuery, error) @@ -260,15 +258,6 @@ func (c *apricotClient) ListComponentEntries(ctx context.Context, in *ListCompon return out, nil } -func (c *apricotClient) ListComponentEntryHistory(ctx context.Context, in *ComponentQuery, opts ...grpc.CallOption) (*ComponentEntriesResponse, error) { - out := new(ComponentEntriesResponse) - err := c.cc.Invoke(ctx, Apricot_ListComponentEntryHistory_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *apricotClient) GetComponentConfiguration(ctx context.Context, in *ComponentRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, Apricot_GetComponentConfiguration_FullMethodName, in, out, opts...) @@ -338,7 +327,6 @@ type ApricotServer interface { // Component configuration calls ListComponents(context.Context, *Empty) (*ComponentEntriesResponse, error) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) - ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) GetComponentConfigurationWithLastIndex(context.Context, *ComponentRequest) (*ComponentResponseWithLastIndex, error) ResolveComponentQuery(context.Context, *ComponentQuery) (*ComponentQuery, error) @@ -401,9 +389,6 @@ func (UnimplementedApricotServer) ListComponents(context.Context, *Empty) (*Comp func (UnimplementedApricotServer) ListComponentEntries(context.Context, *ListComponentEntriesRequest) (*ComponentEntriesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListComponentEntries not implemented") } -func (UnimplementedApricotServer) ListComponentEntryHistory(context.Context, *ComponentQuery) (*ComponentEntriesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListComponentEntryHistory not implemented") -} func (UnimplementedApricotServer) GetComponentConfiguration(context.Context, *ComponentRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetComponentConfiguration not implemented") } @@ -737,24 +722,6 @@ func _Apricot_ListComponentEntries_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } -func _Apricot_ListComponentEntryHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ComponentQuery) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(ApricotServer).ListComponentEntryHistory(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Apricot_ListComponentEntryHistory_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(ApricotServer).ListComponentEntryHistory(ctx, req.(*ComponentQuery)) - } - return interceptor(ctx, in, info, handler) -} - func _Apricot_GetComponentConfiguration_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ComponentRequest) if err := dec(in); err != nil { @@ -920,10 +887,6 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListComponentEntries", Handler: _Apricot_ListComponentEntries_Handler, }, - { - MethodName: "ListComponentEntryHistory", - Handler: _Apricot_ListComponentEntryHistory_Handler, - }, { MethodName: "GetComponentConfiguration", Handler: _Apricot_GetComponentConfiguration_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index e7b980e7f..35d5c844a 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -116,7 +116,6 @@ func (m *RpcServer) GetComponentConfiguration(_ context.Context, request *aprico RunType: reqQuery.RunType, RoleName: reqQuery.MachineRole, EntryKey: reqQuery.Entry, - Timestamp: reqQuery.Timestamp, } } else { return nil, E_BAD_INPUT @@ -159,7 +158,6 @@ func (m *RpcServer) GetComponentConfigurationWithLastIndex(_ context.Context, re RunType: reqQuery.RunType, RoleName: reqQuery.MachineRole, EntryKey: reqQuery.Entry, - Timestamp: reqQuery.Timestamp, } } else { return nil, E_BAD_INPUT @@ -196,7 +194,6 @@ func (m *RpcServer) ResolveComponentQuery(_ context.Context, request *apricotpb. RunType: request.RunType, RoleName: request.MachineRole, EntryKey: request.Entry, - Timestamp: request.Timestamp, } resolved, err := m.service.ResolveComponentQuery(query) @@ -208,7 +205,6 @@ func (m *RpcServer) ResolveComponentQuery(_ context.Context, request *apricotpb. RunType: resolved.RunType, MachineRole: resolved.RoleName, Entry: resolved.EntryKey, - Timestamp: resolved.Timestamp, }, E_OK.Err() } @@ -440,33 +436,7 @@ func (m *RpcServer) ListComponentEntries(_ context.Context, request *apricotpb.L return nil, E_BAD_INPUT } - entries, err := m.service.ListComponentEntries(query, request.IncludeTimestamps) - if err != nil { - return nil, err - } - response := &apricotpb.ComponentEntriesResponse{Payload: entries} - return response, nil -} - -func (m *RpcServer) ListComponentEntryHistory(_ context.Context, query *apricotpb.ComponentQuery) (*apricotpb.ComponentEntriesResponse, error) { - if m == nil || m.service == nil { - return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE - } - m.logMethod() - - if query == nil { - return nil, E_BAD_INPUT - } - - cQuery := &componentcfg.Query{ - Component: query.Component, - RunType: query.RunType, - RoleName: query.MachineRole, - EntryKey: query.Entry, - Timestamp: "", - } - - entries, err := m.service.ListComponentEntryHistory(cQuery) + entries, err := m.service.ListComponentEntries(query) if err != nil { return nil, err } @@ -489,17 +459,15 @@ func (m *RpcServer) ImportComponentConfiguration(_ context.Context, request *apr RunType: request.Query.RunType, RoleName: request.Query.MachineRole, EntryKey: request.Query.Entry, - Timestamp: request.Query.Timestamp, } - existingComponentUpdated, existingEntryUpdated, newTimestamp, err := m.service.ImportComponentConfiguration(pushQuery, request.Payload, request.NewComponent, request.UseVersioning) + existingComponentUpdated, existingEntryUpdated, err := m.service.ImportComponentConfiguration(pushQuery, request.Payload, request.NewComponent) if err != nil { return nil, err } response := &apricotpb.ImportComponentConfigurationResponse{ ExistingComponentUpdated: existingComponentUpdated, ExistingEntryUpdated: existingEntryUpdated, - NewTimestamp: newTimestamp, } return response, nil } diff --git a/apricot/remote/service.go b/apricot/remote/service.go index c56679c11..3bfb2662c 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -109,7 +109,6 @@ func (c *RemoteService) getComponentConfigurationInternal(query *componentcfg.Qu RunType: query.RunType, MachineRole: query.RoleName, Entry: query.EntryKey, - Timestamp: query.Timestamp, } request := &apricotpb.ComponentRequest{ QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, @@ -130,7 +129,6 @@ func (c *RemoteService) getComponentConfigurationInternalWithLastIndex(query *co RunType: query.RunType, MachineRole: query.RoleName, Entry: query.EntryKey, - Timestamp: query.Timestamp, } request := &apricotpb.ComponentRequest{ QueryPath: &apricotpb.ComponentRequest_Query{Query: componentQuery}, @@ -151,7 +149,6 @@ func (c *RemoteService) ResolveComponentQuery(query *componentcfg.Query) (resolv RunType: query.RunType, MachineRole: query.RoleName, Entry: query.EntryKey, - Timestamp: query.Timestamp, } response, err = c.cli.ResolveComponentQuery(context.Background(), componentQuery, grpc.EmptyCallOption{}) if err != nil { @@ -162,7 +159,6 @@ func (c *RemoteService) ResolveComponentQuery(query *componentcfg.Query) (resolv RunType: response.RunType, RoleName: response.MachineRole, EntryKey: response.Entry, - Timestamp: response.Timestamp, } return resolved, nil } @@ -317,7 +313,7 @@ func (c *RemoteService) ListComponents() (components []string, err error) { return } -func (c *RemoteService) ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) { +func (c *RemoteService) ListComponentEntries(query *componentcfg.EntriesQuery) (entries []string, err error) { var response *apricotpb.ComponentEntriesResponse entriesQuery := &apricotpb.ComponentEntriesQuery{ Component: query.Component, @@ -325,8 +321,7 @@ func (c *RemoteService) ListComponentEntries(query *componentcfg.EntriesQuery, s MachineRole: query.RoleName, } request := &apricotpb.ListComponentEntriesRequest{ - QueryPath: &apricotpb.ListComponentEntriesRequest_Query{Query: entriesQuery}, - IncludeTimestamps: showLatestTimestamp, + QueryPath: &apricotpb.ListComponentEntriesRequest_Query{Query: entriesQuery}, } response, err = c.cli.ListComponentEntries(context.Background(), request, grpc.EmptyCallOption{}) @@ -337,25 +332,7 @@ func (c *RemoteService) ListComponentEntries(query *componentcfg.EntriesQuery, s return } -func (c *RemoteService) ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) { - var response *apricotpb.ComponentEntriesResponse - request := &apricotpb.ComponentQuery{ - Component: query.Component, - RunType: query.RunType, - MachineRole: query.RoleName, - Entry: query.EntryKey, - Timestamp: "", - } - - response, err = c.cli.ListComponentEntryHistory(context.Background(), request, grpc.EmptyCallOption{}) - if err != nil { - return - } - entries = response.GetPayload() - return -} - -func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) { +func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool) (existingComponentUpdated bool, existingEntryUpdated bool, err error) { var response *apricotpb.ImportComponentConfigurationResponse request := &apricotpb.ImportComponentConfigurationRequest{ Query: &apricotpb.ComponentQuery{ @@ -363,11 +340,9 @@ func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, RunType: query.RunType, MachineRole: query.RoleName, Entry: query.EntryKey, - Timestamp: query.Timestamp, }, - Payload: payload, - NewComponent: newComponent, - UseVersioning: useVersioning, + Payload: payload, + NewComponent: newComponent, } response, err = c.cli.ImportComponentConfiguration(context.Background(), request, grpc.EmptyCallOption{}) @@ -377,7 +352,6 @@ func (c *RemoteService) ImportComponentConfiguration(query *componentcfg.Query, existingComponentUpdated = response.ExistingComponentUpdated existingEntryUpdated = response.ExistingEntryUpdated - newTimestamp = response.NewTimestamp return } diff --git a/coconut/cmd/configuration_history.go b/coconut/cmd/configuration_history.go deleted file mode 100644 index 325383f22..000000000 --- a/coconut/cmd/configuration_history.go +++ /dev/null @@ -1,49 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2019 CERN and copyright holders of ALICE O². - * Author: George Raduta - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "github.com/AliceO2Group/Control/coconut/configuration" - "github.com/spf13/cobra" -) - -var configurationHistoryCmd = &cobra.Command{ - Use: "history ", - Aliases: []string{"h"}, - Example: `coconut conf history -coconut conf history ///`, - Short: "List all existing entries with timestamps of a specified component in Consul", - Long: `The configuration history command returns all timestamps for a specified component -and entry`, - Run: configuration.WrapCall(configuration.History), - Args: cobra.RangeArgs(1, 2), -} - -func init() { - configurationCmd.AddCommand(configurationHistoryCmd) - configurationHistoryCmd.Flags().StringP("output", "o", "yaml", "output format for the returned entries (yaml/json)") - configurationHistoryCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") - configurationHistoryCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") -} diff --git a/coconut/cmd/configuration_import.go b/coconut/cmd/configuration_import.go index 6a42d3fb4..3f9c49250 100644 --- a/coconut/cmd/configuration_import.go +++ b/coconut/cmd/configuration_import.go @@ -30,30 +30,29 @@ import ( ) var configurationImportCmd = &cobra.Command{ - Use: "import ", + Use: "import ", Aliases: []string{"i", "imp"}, Example: `coconut conf import coconut conf import /// coconut conf import --new-component coconut conf import /// --format=json coconut conf import .json -coconut conf import --no-versioning -coconut conf import --no-versioning --new-component +coconut conf import +coconut conf import --new-component `, Short: "Import a configuration file for the specified component and entry", Long: `The configuration import command generates a timestamp and saves -the configuration file to Consul under the // path. +the configuration file to Consul under the / path. Supported configuration file types are JSON, YAML, TOML and INI, and their file extensions are recognized automatically.`, - Run: configuration.WrapCall(configuration.Import), - Args: cobra.RangeArgs(2, 3), + Run: configuration.WrapCall(configuration.Import), + Args: cobra.RangeArgs(2, 3), } func init() { configurationCmd.AddCommand(configurationImportCmd) - configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") - configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") - configurationImportCmd.Flags().Bool("no-versioning", false, "create an unversioned configuration entry (no timestamps are stored)") - configurationImportCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") - configurationImportCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") + configurationImportCmd.Flags().BoolP("new-component", "n", false, "create a new configuration component while importing entry") + configurationImportCmd.Flags().StringP("format", "f", "", "force a specific configuration file type, overriding any file extension") + configurationImportCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") + configurationImportCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") } diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 637fc5796..548e0b52b 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -32,7 +32,6 @@ import ( "fmt" "io" "os" - "strconv" "strings" "time" @@ -84,7 +83,7 @@ func WrapCall(call CallFunc) RunFunc { // redirect stdout to null, the only way to output is stdout := os.Stdout - os.Stdout,_ = os.Open(os.DevNull) + os.Stdout, _ = os.Open(os.DevNull) err, code := call(apricotServiceInstance, cmd, args, &out) os.Stdout = stdout s.Stop() @@ -93,13 +92,13 @@ func WrapCall(call CallFunc) RunFunc { if err != nil { log.WithPrefix(cmd.Use). WithError(err). - Fatal( "command finished with error") + Fatal("command finished with error") os.Exit(code) } } } -func Dump(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { +func Dump(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) != 1 { err = errors.New(fmt.Sprintf("accepts 1 arg(s), received %d", len(args))) return err, EC_INVALID_ARGS @@ -142,22 +141,17 @@ func Dump(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri } // coconut conf list -func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - useTimestamp := false +func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { if len(args) > 1 { - return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))) , EC_INVALID_ARGS + return errors.New(fmt.Sprintf("command requires maximum 1 arg but received %d", len(args))), EC_INVALID_ARGS } - // we have 0 or 1 args (+ optionally timestamp) - useTimestamp, err = cmd.Flags().GetBool("timestamp") + // we have 0 or 1 args if err != nil { return err, EC_INVALID_ARGS } if len(args) == 0 { // 0 args: conf list - if useTimestamp { - return errors.New("to use flag `-t / --timestamp` please provide component name"), EC_INVALID_ARGS - } components, _ := svc.ListComponents() output, err := formatListOutput(cmd, components) if err != nil { @@ -176,7 +170,7 @@ func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri Component: args[0], RunType: apricotpb.RunType_NULL, RoleName: "", - }, useTimestamp) + }) output, err := formatListOutput(cmd, components) if err != nil { @@ -187,26 +181,26 @@ func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri } // coconut conf show -func Show(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func Show(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { // Allowed inputs: // # len(args) == 1: - // coconut conf show component/RUNTYPE/role/entry[@timestamp] + // coconut conf show component/RUNTYPE/role/entry // # len(args) == 2: - // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] + // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] // # ↑ if runtype/role is empty, we default to ANY/any // # if it's e.g. SOME_RUNTYPE/some_role we just build the path for now; // # TODO: advanced query expressions come later var query *componentcfg.Query - query, err = queryFromFlags(cmd, args, true /* allow timestamp in query */) + query, err = queryFromFlags(cmd, args) if err != nil { return err, EC_INVALID_ARGS } // At this point we know what to query, thanks to a // componentcfg.Query that can be fed to configuration.Instance(). - var( + var ( cfgPayload string - simulate bool + simulate bool ) simulate, err = cmd.Flags().GetBool("simulate") if err != nil { @@ -240,7 +234,7 @@ func Show(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri if err != nil { return err, EC_CONNECTION_ERROR } - if cfgPayload == "" { + if cfgPayload == "" { return errors.New(EC_EMPTY_DATA_MSG), EC_EMPTY_DATA } @@ -249,38 +243,11 @@ func Show(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri return nil, EC_ZERO } -func History(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { - var query *componentcfg.Query - query, err = queryFromFlags(cmd, args, false) - if err != nil { - return err, EC_INVALID_ARGS - } - - var entries []string - entries, err = svc.ListComponentEntryHistory(query) - if err != nil { - return err, EC_CONNECTION_ERROR - } - - var output []byte - output, err = formatListOutput(cmd, entries) - if err != nil { - return err, EC_LOGIC_ERROR - } - _, _ = fmt.Fprintln(o, string(output)) - - return nil, 0 -} - -func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer)(err error, code int) { +func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.Writer) (err error, code int) { useNewComponent, err := cmd.Flags().GetBool("new-component") if err != nil { return err, EC_INVALID_ARGS } - useNoVersion, err := cmd.Flags().GetBool("no-versioning") - if err != nil { - return err, EC_INVALID_ARGS - } useExtension, err := cmd.Flags().GetString("format") if err != nil { return err, EC_INVALID_ARGS @@ -289,7 +256,7 @@ func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.W var pushQuery *componentcfg.Query // The last argument is always assumed to be the input file, so we must exclude it queryArgs := args[:len(args)-1] // we can do this because it's known that len(args)>0 - pushQuery, err = queryFromFlags(cmd, queryArgs, false /* no timestamps in a push query*/) + pushQuery, err = queryFromFlags(cmd, queryArgs) if err != nil { return err, EC_INVALID_ARGS } @@ -301,10 +268,10 @@ func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.W extension = fileParts[len(fileParts)-1] } - if !isFileExtensionValid(extension) && useExtension == "" { + if !isFileExtensionValid(extension) && useExtension == "" { return errors.New("supported file extensions: JSON, YAML, INI or TOML." + - " To force a specific configuration format, see flag --format/-f" ), EC_INVALID_ARGS - } else if useExtension != "" { + " To force a specific configuration format, see flag --format/-f"), EC_INVALID_ARGS + } else if useExtension != "" { extension = strings.ToUpper(useExtension) } @@ -315,19 +282,15 @@ func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.W } var existingComponentUpdated, existingEntryUpdated bool - var newTimestamp int64 - existingComponentUpdated, existingEntryUpdated, newTimestamp, err = svc.ImportComponentConfiguration(pushQuery, string(payload), useNewComponent, !useNoVersion) + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(pushQuery, string(payload), useNewComponent) if err != nil { return err, EC_LOGIC_ERROR } - toPrintKey := red(pushQuery.Component) + componentcfg.SEPARATOR + + toPrintKey := red(pushQuery.Component) + componentcfg.SEPARATOR + blue(pushQuery.RunType) + componentcfg.SEPARATOR + red(pushQuery.RoleName) + componentcfg.SEPARATOR + blue(pushQuery.EntryKey) - if !useNoVersion { - toPrintKey += "@" + strconv.FormatInt(newTimestamp, 10) - } userMsg := "" if !existingComponentUpdated { @@ -336,7 +299,7 @@ func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.W if !existingEntryUpdated { userMsg += "New entry created: " + blue(pushQuery.EntryKey) + "\n" } else { - userMsg += "Entry updated: " + blue(pushQuery.EntryKey) + "\n" + userMsg += "Entry updated: " + blue(pushQuery.EntryKey) + "\n" } userMsg += "Configuration imported: " + toPrintKey @@ -344,4 +307,3 @@ func Import(svc configuration.Service, cmd *cobra.Command, args []string, o io.W _, _ = fmt.Fprintln(o, userMsg) return nil, 0 } - diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index f243c74f5..675625199 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -30,72 +30,46 @@ import ( "encoding/json" "errors" "fmt" - "io" - "io/ioutil" - "os" - "regexp" - "strings" - "time" - apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/configuration/componentcfg" "github.com/fatih/color" - "github.com/olekukonko/tablewriter" "github.com/spf13/cobra" "gopkg.in/yaml.v3" + "io/ioutil" + "os" + "regexp" + "strings" ) -var( +var ( blue = color.New(color.FgHiBlue).SprintFunc() - red = color.New(color.FgHiRed).SprintFunc() + red = color.New(color.FgHiRed).SprintFunc() // component /RUNTYPE /rolename /entry inputComponentEntryRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) ) // Utility function to create a componentcfg.Query from combos of args and flags -func queryFromFlags(cmd *cobra.Command, args []string, allowTimestampInQuery bool) (query *componentcfg.Query, err error) { - var timestamp string - - if len(args) < 1 || len(args) > 2 { +func queryFromFlags(cmd *cobra.Command, args []string) (query *componentcfg.Query, err error) { + if len(args) < 1 || len(args) > 2 { err = errors.New(fmt.Sprintf("accepts 1 or 2 arg(s), but received %d", len(args))) return } - if allowTimestampInQuery { - timestamp, err = cmd.Flags().GetString("timestamp") - if err != nil { - return - } - } - switch len(args) { - case 1: // coconut conf show component/RUNTYPE/role/entry[@timestamp] - if componentcfg.IsStringValidQueryPathWithOptionalTimestamp(args[0]) { - if strings.Contains(args[0], "@") { - // coconut conf show c/R/r/e@timestamp - if timestamp != "" { - err = errors.New("flag `-t / --timestamp` must not be provided when using format ///@") - return - } + case 1: // coconut conf show component/RUNTYPE/role/entry + if componentcfg.IsStringValidQueryPath(args[0]) { + if strings.Contains(args[0], "/") { + // coconut conf show c/R/r/e query, err = componentcfg.NewQuery(args[0]) if err != nil { return } - } else if strings.Contains(args[0], "/") { - // coconut conf show c/R/r/e [-t timestamp] # no timestamp, optionally as flag - query, err = componentcfg.NewQuery(args[0]) - if err != nil { - return - } - if timestamp != "" { - query.Timestamp = timestamp - } } } else { err = errors.New("please provide entry name") return } - case 2: // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] + case 2: // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] var runTypeS, machineRole string var runType apricotpb.RunType runTypeS, err = cmd.Flags().GetString("runtype") @@ -103,7 +77,7 @@ func queryFromFlags(cmd *cobra.Command, args []string, allowTimestampInQuery boo return } if len(runTypeS) == 0 { - runType = apricotpb.RunType_ANY // default value for empty runType input + runType = apricotpb.RunType_ANY // default value for empty runType input } else { runTypeI, ok := apricotpb.RunType_value[runTypeS] if !ok { @@ -129,44 +103,13 @@ func queryFromFlags(cmd *cobra.Command, args []string, allowTimestampInQuery boo RunType: runType, RoleName: machineRole, EntryKey: args[1], - Timestamp: timestamp, // could have been passed as -t or left empty, either is ok } } } return } - -func drawTableHistoryConfigs(headers []string, history []string, max int, o io.Writer) { - table := tablewriter.NewWriter(o) - if len(headers) > 0 { - table.SetHeader(headers) - } - table.SetBorder(false) - table.SetColMinWidth(0, max) - - for _, value := range history { - p, err := componentcfg.NewQuery(value) - if err != nil { - continue - } - prettyTimestamp, err := componentcfg.GetTimestampInFormat(p.Timestamp, time.RFC822) - if err != nil { - prettyTimestamp = p.Timestamp - } - if prettyTimestamp == "" { - prettyTimestamp = red("unversioned") - } - configName := red(p.Component) + componentcfg.SEPARATOR + - blue(p.RunType) + componentcfg.SEPARATOR + - red(p.RoleName) + componentcfg.SEPARATOR + - blue(p.EntryKey) + "@" + p.Timestamp - table.Append([]string{configName, prettyTimestamp}) - } - table.Render() -} - -func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, err error) { +func formatListOutput(cmd *cobra.Command, output []string) (parsedOutput []byte, err error) { format, err := cmd.Flags().GetString("output") if err != nil { return @@ -185,17 +128,17 @@ func formatListOutput( cmd *cobra.Command, output []string)(parsedOutput []byte, return parsedOutput, nil } -func getMaxLenOfKey(keys []string) (maxLen int){ +func getMaxLenOfKey(keys []string) (maxLen int) { maxLen = 0 for _, value := range keys { - if len(value) - len(componentcfg.ConfigComponentsPath) >= maxLen { + if len(value)-len(componentcfg.ConfigComponentsPath) >= maxLen { maxLen = len(value) - len(componentcfg.ConfigComponentsPath) } } return } -func getFileContent(filePath string)(fileContent []byte, err error) { +func getFileContent(filePath string) (fileContent []byte, err error) { file, err := os.Open(filePath) if err != nil { return @@ -209,7 +152,7 @@ func getFileContent(filePath string)(fileContent []byte, err error) { return fileContentByte, nil } -func isFileExtensionValid(extension string) bool{ +func isFileExtensionValid(extension string) bool { extension = strings.ToUpper(extension) return extension == "JSON" || extension == "YAML" || extension == "YML" || extension == "INI" || extension == "TOML" } diff --git a/coconut/doc/coconut_configuration_history.md b/coconut/doc/coconut_configuration_history.md deleted file mode 100644 index 55d155ab1..000000000 --- a/coconut/doc/coconut_configuration_history.md +++ /dev/null @@ -1,45 +0,0 @@ -## coconut configuration history - -List all existing entries with timestamps of a specified component in Consul - -### Synopsis - -The configuration history command returns all timestamps for a specified component -and entry - -``` -coconut configuration history [flags] -``` - -### Examples - -``` -coconut conf history -coconut conf history /// -``` - -### Options - -``` - -h, --help help for history - -o, --output string output format for the returned entries (yaml/json) (default "yaml") - -l, --role string request configuration for this O² machine role - -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) -``` - -### Options inherited from parent commands - -``` - --config string optional configuration file for coconut (default $HOME/.config/coconut/settings.yaml) - --config_endpoint string configuration endpoint used by AliECS core as PROTO://HOST:PORT (default "apricot://127.0.0.1:32101") - --endpoint string AliECS core endpoint as HOST:PORT (default "127.0.0.1:32102") - --nocolor disable colors in output - --nospinner disable animations in output - -v, --verbose show verbose output for debug purposes -``` - -### SEE ALSO - -* [coconut configuration](coconut_configuration.md) - view or modify O² configuration - -###### Auto generated by spf13/cobra on 17-Aug-2023 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index c3c0e3eef..dcfc7b6ef 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -21,8 +21,8 @@ coconut conf import /// coconut conf import --new-component coconut conf import /// --format=json coconut conf import .json -coconut conf import --no-versioning -coconut conf import --no-versioning --new-component +coconut conf import +coconut conf import --new-component ``` @@ -32,7 +32,6 @@ coconut conf import --no-versioning --new-compon -f, --format string force a specific configuration file type, overriding any file extension -h, --help help for import -n, --new-component create a new configuration component while importing entry - --no-versioning create an unversioned configuration entry (no timestamps are stored) -l, --role string request configuration for this O² machine role -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) ``` diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 39c947135..2230e2ef5 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -6,7 +6,6 @@ Show configuration for the component and entry specified The configuration show command returns the most recent configuration revision for the specified component and entry. -It can also return a specific revision, requested with the --timestamp/-t flag ``` coconut configuration show [flags] @@ -18,9 +17,7 @@ coconut configuration show [flags] coconut conf show coconut conf show -t coconut conf show /// -coconut conf show /// -t -coconut conf show ///@ -coconut conf show -r -l -t ' +coconut conf show -r -l ' coconut conf show -s -e '{"key1": "value1", "key2": "value2"}' ``` @@ -32,7 +29,6 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" -l, --role string request configuration for this O² machine role -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) -s, --simulate simulate runtime template processing on the configuration payload - -t, --timestamp string request configuration for this timestamp ``` ### Options inherited from parent commands diff --git a/configuration/cfgbackend/yamlsource.go b/configuration/cfgbackend/yamlsource.go index 25cf93630..422d05a32 100644 --- a/configuration/cfgbackend/yamlsource.go +++ b/configuration/cfgbackend/yamlsource.go @@ -42,7 +42,7 @@ type YamlSource struct { func newYamlSource(uri string) (yc *YamlSource, err error) { yc = &YamlSource{ - uri: uri, + uri: uri, data: nil, } err = yc.refresh() @@ -150,7 +150,7 @@ func (yc *YamlSource) Get(key string) (value string, err error) { return } -func (yc *YamlSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error) { +func (yc *YamlSource) GetKeysByPrefix(keyPrefix string) (keys []string, err error) { var recursive Item recursive, err = yc.GetRecursive(keyPrefix) if err != nil { @@ -168,7 +168,6 @@ func (yc *YamlSource) GetKeysByPrefix(keyPrefix string)(keys []string, err error return } - func (yc *YamlSource) IsDir(key string) (isDir bool) { recursive, err := yc.GetRecursive(key) if err != nil { @@ -177,7 +176,6 @@ func (yc *YamlSource) IsDir(key string) (isDir bool) { return recursive.Type() == IT_Map } - func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { err = yc.refresh() if err != nil { @@ -279,7 +277,7 @@ func (yc *YamlSource) Put(key string, value string) (err error) { } } - if i == len(keysPath) - 1 { + if i == len(keysPath)-1 { if arrayIndex > -1 { if currentMap[currentKey] == nil || currentMap[currentKey].Type() != IT_Array { err = errors.New(fmt.Sprintf("found nil at key %s but array was expected", key)) @@ -349,7 +347,7 @@ func (yc *YamlSource) PutRecursive(key string, value Item) (err error) { } } - if i == len(keysPath) - 1 { + if i == len(keysPath)-1 { if arrayIndex > -1 { if currentMap[currentKey] == nil || currentMap[currentKey].Type() != IT_Array { err = errors.New(fmt.Sprintf("found nil at key %s but array was expected", key)) @@ -442,7 +440,7 @@ func (yc *YamlSource) Exists(key string) (exists bool, err error) { return } else { it := currentMap[currentKey] - if i == len(keysPath) - 1 { // last iteration, so we should have a string for this key + if i == len(keysPath)-1 { // last iteration, so we should have a string for this key if arrayIndex > -1 { exists = it.Array()[arrayIndex] != nil } diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index f1d69a2d4..ee5656fbc 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -26,83 +26,44 @@ package componentcfg import ( - "errors" - "strconv" - "strings" - "time" - apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "strings" ) const ( ConfigComponentsPath = "o2/components/" ) -const( - SEPARATOR = "/" +const ( + SEPARATOR = "/" SEPARATOR_RUNE = '/' ) - // Checks whether the input string is a valid Consul path element on its own func IsInputSingleValidWord(input string) bool { return !strings.Contains(input, "/") && !strings.Contains(input, "@") } -// Method to parse a timestamp in the specified format -func GetTimestampInFormat(timestamp string, timeFormat string)(string, error){ - timeStampAsInt, err := strconv.ParseInt(timestamp, 10, 64) - if err != nil { - return "", errors.New("unable to identify timestamp") - } - tm := time.Unix(timeStampAsInt, 0) - return tm.Format(timeFormat), nil -} - -// Method to return the latest timestamp for a specified component & entry -// If no keys were passed an error and code exit 3 will be returned -func GetLatestTimestamp(keys []string, p *Query)(timestamp string, err error) { - keyPrefix := p.AbsoluteWithoutTimestamp() - if len(keys) == 0 { - err = errors.New("no keys found") - return "", err - } - - var maxTimeStamp uint64 - for _, key := range keys { - componentTimestamp, err := strconv.ParseUint(strings.TrimPrefix(key, keyPrefix + "/"), 10, 64) - if err == nil { - if componentTimestamp > maxTimeStamp { - maxTimeStamp = componentTimestamp - } - } - } - if maxTimeStamp == 0 { - return "", nil - } - return strconv.FormatUint(maxTimeStamp, 10), nil -} - // keys must be a slice containing all the full keys in /o2/components func GetComponentsMapFromKeysList(keys []string) map[string]bool { var componentsMap = make(map[string]bool) - for _,value := range keys { + for _, value := range keys { value := strings.TrimPrefix(value, ConfigComponentsPath) - component := strings.Split(value, "/" )[0] + component := strings.Split(value, "/")[0] componentsMap[component] = true } return componentsMap } -func GetEntriesMapOfComponentFromKeysList(component string, runtype apricotpb.RunType, rolename string, keys []string) map[string]bool { +func GetEntriesMapOfComponentFromKeysList(component string, runtype apricotpb.RunType, rolename string, keys []string) map[string]bool { var entriesMap = make(map[string]bool) runtypeString, ok := apricotpb.RunType_name[int32(runtype)] if !ok { runtypeString = "ANY" // this should never happen } - for _,value := range keys { + for _, value := range keys { value := strings.TrimPrefix(value, ConfigComponentsPath) - parts := strings.Split(value, "/" ) + parts := strings.Split(value, "/") if parts[0] == component && parts[1] == runtypeString && parts[2] == rolename { diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 12f67e1ee..1135e8fa2 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -41,15 +41,15 @@ const ( ) var ( - // component /RUNTYPE /rolename /entry @timestamp - inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_/]+){1}(\@[0-9]+)?$`) + // component /RUNTYPE /rolename /entry + inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_/]+){1}$`) // component /RUNTYPE /rolename inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)*$`) E_BAD_KEY = errors.New("bad component configuration key format") ) -func IsStringValidQueryPathWithOptionalTimestamp(input string) bool { +func IsStringValidQueryPath(input string) bool { return inputFullRegex.MatchString(input) } func IsStringValidEntriesQueryPath(input string) bool { @@ -97,7 +97,6 @@ type Query struct { RunType apricotpb.RunType RoleName string EntryKey string - Timestamp string } func NewQuery(path string) (p *Query, err error) { @@ -106,10 +105,9 @@ func NewQuery(path string) (p *Query, err error) { RunType: apricotpb.RunType_NULL, RoleName: "", EntryKey: "", - Timestamp: "", } path = strings.TrimSpace(path) - if IsStringValidQueryPathWithOptionalTimestamp(path) { + if IsStringValidQueryPath(path) { matches := inputFullRegex.FindAllStringSubmatch(path, -1) @@ -118,7 +116,7 @@ func NewQuery(path string) (p *Query, err error) { return } captureGroups := matches[0][1:] // the first element is the full query, we don't need it - if len(captureGroups) < 4 && len(captureGroups) > 5 { + if len(captureGroups) != 4 { err = E_BAD_KEY return } @@ -132,7 +130,6 @@ func NewQuery(path string) (p *Query, err error) { p.RunType = apricotpb.RunType(typedFlavor) p.RoleName = strings.TrimPrefix(captureGroups[2], "/") p.EntryKey = strings.TrimPrefix(captureGroups[3], "/") - p.Timestamp = strings.TrimPrefix(captureGroups[4], "@") } else { err = E_BAD_KEY return @@ -147,7 +144,6 @@ func (p *Query) WithFallbackRunType() *Query { RunType: FALLBACK_RUNTYPE, RoleName: p.RoleName, EntryKey: p.EntryKey, - Timestamp: p.Timestamp, } } @@ -157,27 +153,14 @@ func (p *Query) WithFallbackRoleName() *Query { RunType: p.RunType, RoleName: FALLBACK_ROLENAME, EntryKey: p.EntryKey, - Timestamp: p.Timestamp, } } func (p *Query) Path() string { - path := p.WithoutTimestamp() - if len(p.Timestamp) > 0 { - return path + "@" + p.Timestamp - } - return path + return p.Component + SEPARATOR + apricotpb.RunType_name[int32(p.RunType)] + SEPARATOR + p.RoleName + SEPARATOR + p.EntryKey } func (p *Query) Raw() string { - path := p.WithoutTimestamp() - if len(p.Timestamp) > 0 { - return path + SEPARATOR + p.Timestamp - } - return path -} - -func (p *Query) WithoutTimestamp() string { return p.Component + SEPARATOR + apricotpb.RunType_name[int32(p.RunType)] + SEPARATOR + p.RoleName + SEPARATOR + p.EntryKey } @@ -185,10 +168,6 @@ func (p *Query) AbsoluteRaw() string { return ConfigComponentsPath + p.Raw() } -func (p *Query) AbsoluteWithoutTimestamp() string { - return ConfigComponentsPath + p.WithoutTimestamp() -} - type QueryParameters struct { ProcessTemplates bool VarStack map[string]string diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go index e1ce73adf..9faa3dbad 100644 --- a/configuration/componentcfg/query_test.go +++ b/configuration/componentcfg/query_test.go @@ -1,47 +1,39 @@ -package componentcfg_test +package componentcfg import ( apricotpb "github.com/AliceO2Group/Control/apricot/protos" - "github.com/AliceO2Group/Control/configuration/componentcfg" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "testing" ) var _ = Describe("query", func() { Describe("Component configuration query", func() { var ( - q *componentcfg.Query + q *Query err error ) - When("creating a new query with the full path and timestamp", func() { + When("creating a new query with the full path", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/PHYSICS/pp/ctp-raw-qc@1234") + q, err = NewQuery("qc/PHYSICS/pp/ctp-raw-qc") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) }) It("should return the path correctly", func() { - Expect(q.Path()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc@1234")) + Expect(q.Path()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) }) It("should return the raw query correctly", func() { - Expect(q.Raw()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc/1234")) - }) - It("should return the query without the timestamp correctly", func() { - Expect(q.WithoutTimestamp()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) + Expect(q.Raw()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) }) It("should return the absolute raw query correctly", func() { - Expect(q.AbsoluteRaw()).To(Equal(componentcfg.ConfigComponentsPath + "qc/PHYSICS/pp/ctp-raw-qc/1234")) - }) - It("should return the query without the timestamp correctly", func() { - Expect(q.AbsoluteWithoutTimestamp()).To(Equal(componentcfg.ConfigComponentsPath + "qc/PHYSICS/pp/ctp-raw-qc")) + Expect(q.AbsoluteRaw()).To(Equal(ConfigComponentsPath + "qc/PHYSICS/pp/ctp-raw-qc")) }) It("should be able to generalize to a query for any run type", func() { - Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc@1234")) + Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc")) }) It("should be able to generalize to a query for any role name", func() { - Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc@1234")) + Expect(q.WithFallbackRunType().Path()).To(Equal("qc/ANY/pp/ctp-raw-qc")) }) It("should recognize the RunType correctly", func() { Expect(q.RunType.String()).To(Equal("PHYSICS")) @@ -55,32 +47,11 @@ var _ = Describe("query", func() { It("should recognize the EntryKey correctly", func() { Expect(q.EntryKey).To(Equal("ctp-raw-qc")) }) - It("should recognize the Timestamp correctly", func() { - Expect(q.Timestamp).To(Equal("1234")) - }) - }) - - When("creating a new query with the full path but no timestamp", func() { - BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/PHYSICS/pp/ctp-raw-qc") - }) - It("should be parsed without reporting errors", func() { - Expect(err).To(BeNil()) - }) - It("should return the path correctly", func() { - Expect(q.Path()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) - }) - It("should return the raw query correctly", func() { - Expect(q.Raw()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) - }) - It("should return the query without the timestamp correctly", func() { - Expect(q.WithoutTimestamp()).To(Equal("qc/PHYSICS/pp/ctp-raw-qc")) - }) }) When("creating a new query with all the supported types of characters", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("aAzZ09-_/ANY/aAzZ09-_/aAzZ09-_") + q, err = NewQuery("aAzZ09-_/ANY/aAzZ09-_/aAzZ09-_") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -89,7 +60,7 @@ var _ = Describe("query", func() { When("creating a new query with entry having a subdirectory", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/ANY/any/tpc/clusters") + q, err = NewQuery("qc/ANY/any/tpc/clusters") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -102,60 +73,52 @@ var _ = Describe("query", func() { Describe("dealing with incorrectly formatted queries", func() { When("query is empty", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("") + q, err = NewQuery("") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("query has not enough / separators", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/ANY/any") + q, err = NewQuery("qc/ANY/any") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("query has an empty token", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/ANY//ctp-raw-qc") + q, err = NewQuery("qc/ANY//ctp-raw-qc") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) - }) - }) - When("query has a timestamp separator, but the timestamp itself is missing", func() { - BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/ANY/any/ctp-raw-qc@") - }) - It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) // I don't know whether we are expected to support it or not, but the current behaviour is that we don't, // even though one can write a key with a space to consul When("query has a space in the entry key", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/ANY/any/ctp qc") + q, err = NewQuery("qc/ANY/any/ctp qc") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("run type uses lower case letters", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/physics/any/ctp-raw-qc") + q, err = NewQuery("qc/physics/any/ctp-raw-qc") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("run type is unknown", func() { BeforeEach(func() { - q, err = componentcfg.NewQuery("qc/FOO/any/ctp-raw-qc") + q, err = NewQuery("qc/FOO/any/ctp-raw-qc") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) }) @@ -163,13 +126,13 @@ var _ = Describe("query", func() { Describe("Component configuration entries query", func() { var ( - q *componentcfg.EntriesQuery + q *EntriesQuery err error ) When("creating a new valid query", func() { BeforeEach(func() { - q, err = componentcfg.NewEntriesQuery("qc/PHYSICS/pp") + q, err = NewEntriesQuery("qc/PHYSICS/pp") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -187,7 +150,7 @@ var _ = Describe("query", func() { When("creating a new query with all the supported types of characters", func() { BeforeEach(func() { - q, err = componentcfg.NewEntriesQuery("aAzZ09-_/ANY/aAzZ09-_") + q, err = NewEntriesQuery("aAzZ09-_/ANY/aAzZ09-_") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -197,26 +160,26 @@ var _ = Describe("query", func() { Describe("dealing with incorrectly formatted queries", func() { When("query is empty", func() { BeforeEach(func() { - q, err = componentcfg.NewEntriesQuery("") + q, err = NewEntriesQuery("") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("query has not enough / separators", func() { BeforeEach(func() { - q, err = componentcfg.NewEntriesQuery("qc/ANY") + q, err = NewEntriesQuery("qc/ANY") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("query has an empty token", func() { BeforeEach(func() { - q, err = componentcfg.NewEntriesQuery("qc/ANY/") + q, err = NewEntriesQuery("qc/ANY/") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) }) @@ -224,13 +187,13 @@ var _ = Describe("query", func() { Describe("Component configuration query parameters", func() { var ( - q *componentcfg.QueryParameters + q *QueryParameters err error ) When("creating new valid query parameters", func() { BeforeEach(func() { - q, err = componentcfg.NewQueryParameters("process=true&a=aaa&b=123&C_D3=C,C,C&detectors=[\"MCH\",\"MID\"]") + q, err = NewQueryParameters("process=true&a=aaa&b=123&C_D3=C,C,C&detectors=[\"MCH\",\"MID\"]") }) It("should be parsed without reporting errors", func() { Expect(err).To(BeNil()) @@ -249,33 +212,28 @@ var _ = Describe("query", func() { Describe("dealing with incorrectly formatted query parameters", func() { When("query parameters are empty", func() { BeforeEach(func() { - q, err = componentcfg.NewQueryParameters("") + q, err = NewQueryParameters("") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("a key has empty value", func() { BeforeEach(func() { - q, err = componentcfg.NewQueryParameters("process=") + q, err = NewQueryParameters("process=") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) When("there are two identical keys", func() { BeforeEach(func() { - q, err = componentcfg.NewQueryParameters("a=33&a=34") + q, err = NewQueryParameters("a=33&a=34") }) It("should return an error", func() { - Expect(err).To(MatchError(componentcfg.E_BAD_KEY)) + Expect(err).To(MatchError(E_BAD_KEY)) }) }) }) }) }) - -func TestQuery(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Query Suite") -} diff --git a/configuration/service.go b/configuration/service.go index a74f0da00..bfd6d6e09 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -45,15 +45,15 @@ type Service interface { GetComponentConfigurationWithLastIndex(query *componentcfg.Query) (payload string, lastIndex uint64, err error) GetAndProcessComponentConfiguration(query *componentcfg.Query, varStack map[string]string) (payload string, err error) + // getAll == false should skip TRG in the list ListDetectors(getAll bool) (detectors []string, err error) GetHostInventory(detector string) (hosts []string, err error) GetDetectorsInventory() (inventory map[string][]string, err error) ListComponents() (components []string, err error) - ListComponentEntries(query *componentcfg.EntriesQuery, showLatestTimestamp bool) (entries []string, err error) - ListComponentEntryHistory(query *componentcfg.Query) (entries []string, err error) + ListComponentEntries(query *componentcfg.EntriesQuery) (entries []string, err error) ResolveComponentQuery(query *componentcfg.Query) (resolved *componentcfg.Query, err error) - ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool, useVersioning bool) (existingComponentUpdated bool, existingEntryUpdated bool, newTimestamp int64, err error) + ImportComponentConfiguration(query *componentcfg.Query, payload string, newComponent bool) (existingComponentUpdated bool, existingEntryUpdated bool, err error) GetDetectorForHost(hostname string) (string, error) GetDetectorsForHosts(hosts []string) ([]string, error) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index c33d8ba39..df025ea99 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -68,27 +68,10 @@ func MakeConfigAccessObject(confSvc ConfigurationService, varStack map[string]st RunType: apricotpb.RunType(rt), RoleName: roleName, EntryKey: entryKey, - Timestamp: "", - }, false) - }, - "ResolveWithTimestamp": func(component string, runType string, roleName string, entryKey string) string { - rt, ok := apricotpb.RunType_value[runType] - if !ok { - rt = int32(apricotpb.RunType_NULL) - } - return resolveConfig(confSvc, &componentcfg.Query{ - Component: component, - RunType: apricotpb.RunType(rt), - RoleName: roleName, - EntryKey: entryKey, - Timestamp: "", - }, true) + }) }, "ResolvePath": func(path string) string { - return resolveConfigPath(confSvc, path, false) - }, - "ResolvePathWithTimestamp": func(path string) string { - return resolveConfigPath(confSvc, path, true) + return resolveConfigPath(confSvc, path) }, } obj["inventory"] = map[string]interface{}{ @@ -129,7 +112,7 @@ func MakeConfigAccessFuncs(confSvc ConfigurationService, varStack map[string]str }, "ResolveConfigPath": func(path string) string { log.WithPrefix("template").Warn("ResolveConfigPath is deprecated, use config.ResolvePath instead") - return resolveConfigPath(confSvc, path, false) + return resolveConfigPath(confSvc, path) }, "DetectorForHost": func(hostname string) string { log.WithPrefix("template").Warn("DetectorForHost is deprecated, use inventory.DetectorForHost instead") diff --git a/configuration/template/stackutil.go b/configuration/template/stackutil.go index 2d3eb2a67..1e58fb69c 100644 --- a/configuration/template/stackutil.go +++ b/configuration/template/stackutil.go @@ -73,7 +73,7 @@ func getConfig(confSvc ConfigurationService, varStack map[string]string, path st return payload } -func resolveConfig(confSvc ConfigurationService, query *componentcfg.Query, withTimestamp bool) string { +func resolveConfig(confSvc ConfigurationService, query *componentcfg.Query) string { defer utils.TimeTrack(time.Now(), "ResolveConfig", log.WithPrefix("template")) var resolved *componentcfg.Query resolved, err := confSvc.ResolveComponentQuery(query) @@ -81,13 +81,10 @@ func resolveConfig(confSvc ConfigurationService, query *componentcfg.Query, with return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } - if withTimestamp { - return resolved.Raw() - } - return resolved.WithoutTimestamp() + return resolved.Raw() } -func resolveConfigPath(confSvc ConfigurationService, path string, withTimestamp bool) string { +func resolveConfigPath(confSvc ConfigurationService, path string) string { defer utils.TimeTrack(time.Now(), "ResolveConfigPath", log.WithPrefix("template")) query, err := componentcfg.NewQuery(path) if err != nil { @@ -100,10 +97,7 @@ func resolveConfigPath(confSvc ConfigurationService, path string, withTimestamp return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } - if withTimestamp { - return resolved.Raw() - } - return resolved.WithoutTimestamp() + return resolved.Raw() } func detectorForHost(confSvc ConfigurationService, hostname string) string { diff --git a/core/config.go b/core/config.go index c2676435c..12d7a2b3d 100644 --- a/core/config.go +++ b/core/config.go @@ -242,7 +242,6 @@ func parseCoreConfig() error { RunType: apricotpb.RunType_ANY, RoleName: "any", EntryKey: viper.GetString("coreConfigEntry"), // defaults to "settings" - Timestamp: "", }) if err != nil { return errors.New(viper.GetString("configServiceUri") + ": could not acquire core configuration (possibly bad configServiceUri, expecting apricot://*, consul://* or file://*)") diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index 1ab6fa571..8e2f8585a 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -142,7 +142,6 @@ | runType | [RunType](#apricot-RunType) | | | | machineRole | [string](#string) | | | | entry | [string](#string) | | | -| timestamp | [string](#string) | | | @@ -417,7 +416,6 @@ | query | [ComponentQuery](#apricot-ComponentQuery) | | | | payload | [string](#string) | | | | newComponent | [bool](#bool) | | | -| useVersioning | [bool](#bool) | | | @@ -434,7 +432,6 @@ | ----- | ---- | ----- | ----------- | | existingComponentUpdated | [bool](#bool) | | | | existingEntryUpdated | [bool](#bool) | | | -| newTimestamp | [int64](#int64) | | | @@ -451,7 +448,6 @@ | ----- | ---- | ----- | ----------- | | path | [string](#string) | | | | query | [ComponentEntriesQuery](#apricot-ComponentEntriesQuery) | | | -| includeTimestamps | [bool](#bool) | | | @@ -610,7 +606,6 @@ | ListRuntimeEntries | [ListRuntimeEntriesRequest](#apricot-ListRuntimeEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | | ListComponents | [Empty](#apricot-Empty) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | Component configuration calls | | ListComponentEntries | [ListComponentEntriesRequest](#apricot-ListComponentEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | -| ListComponentEntryHistory | [ComponentQuery](#apricot-ComponentQuery) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | | GetComponentConfiguration | [ComponentRequest](#apricot-ComponentRequest) | [ComponentResponse](#apricot-ComponentResponse) | | | GetComponentConfigurationWithLastIndex | [ComponentRequest](#apricot-ComponentRequest) | [ComponentResponseWithLastIndex](#apricot-ComponentResponseWithLastIndex) | | | ResolveComponentQuery | [ComponentQuery](#apricot-ComponentQuery) | [ComponentQuery](#apricot-ComponentQuery) | | From d8af67a1e88926a78112f198b70b5990311c0ca1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 May 2024 17:27:57 +0200 Subject: [PATCH 1899/2352] [common] add multiple unit tests concerning configuration, include fixes --- Makefile | 2 +- apricot/local/local_test.go | 45 ++ apricot/local/service.go | 14 +- apricot/local/service_test.go | 477 ++++++++++++++++++ apricot/local/service_test.yaml | 53 ++ coconut/configuration/configuration.go | 2 +- coconut/configuration/configurationutil.go | 4 +- configuration/cfgbackend/source.go | 3 +- configuration/cfgbackend/source_test.go | 16 + configuration/cfgbackend/yamlsource.go | 31 +- configuration/componentcfg/componentcfg.go | 21 +- .../componentcfg/componentcfg_test.go | 152 ++++++ 12 files changed, 798 insertions(+), 22 deletions(-) create mode 100644 apricot/local/local_test.go create mode 100644 apricot/local/service_test.go create mode 100644 apricot/local/service_test.yaml create mode 100644 configuration/componentcfg/componentcfg_test.go diff --git a/Makefile b/Makefile index a66cab55a..158b98724 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/apricot/local/local_test.go b/apricot/local/local_test.go new file mode 100644 index 000000000..d99999f11 --- /dev/null +++ b/apricot/local/local_test.go @@ -0,0 +1,45 @@ +package local + +import ( + "github.com/spf13/viper" + "io" + "os" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var tmpDir *string + +const configFile = "service_test.yaml" + +func TestLocal(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Local Apricot Service Suite") +} + +var _ = BeforeSuite(func() { + var err error + tmpDir = new(string) + *tmpDir, err = os.MkdirTemp("", "o2control-local-service") + Expect(err).NotTo(HaveOccurred()) + + // copy config file + from, err := os.Open("./" + configFile) + Expect(err).NotTo(HaveOccurred()) + defer from.Close() + + to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) + Expect(err).NotTo(HaveOccurred()) + defer to.Close() + + _, err = io.Copy(to, from) + Expect(err).NotTo(HaveOccurred()) + + viper.Set("coreWorkingDir", tmpDir) // used by NewRunNumber with YAML backend +}) + +var _ = AfterSuite(func() { + os.RemoveAll(*tmpDir) +}) diff --git a/apricot/local/service.go b/apricot/local/service.go index ccdc592b4..537ea553b 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -127,7 +127,7 @@ func (s *Service) GetDefaults() map[string]string { Warn("cannot parse global configuration endpoint") } smap["framework_id"], _ = s.GetRuntimeEntry("aliecs", "mesos_fid") - smap["core_hostname"], _ = os.Hostname() + smap["core_hostname"], _ = os.Hostname() // fixme: this might not be correct if apricot sits elsewhere than the core return smap } @@ -328,9 +328,7 @@ func (s *Service) ResolveComponentQuery(query *componentcfg.Query) (resolved *co *resolved = *query return } - if _, ok := s.src.(*cfgbackend.ConsulSource); ok { - return s.resolveComponentQuery(query) - } + resolved, err = s.resolveComponentQuery(query) return } @@ -571,11 +569,10 @@ func formatComponentEntriesList(keys []string, keyPrefix string) ([]string, erro componentParts := strings.Split(componentsFullName, "/") // The component name is already stripped as part of the keyPrefix. - // len(ANY/any/entry) is 3, therefore ↓ - // TODO: support sub entries here!!! - if len(componentParts) == 3 { + // len(ANY/any/entry) is least 3, therefore ↓ + if len(componentParts) >= 3 { // 1st acceptable case: single entry - if len(componentParts[len(componentParts)-1]) == 0 { // means this is a folder key with trailing slash "ANY/any/" + if len(componentParts[len(componentParts)-1]) == 0 { // means this is a folder key with trailing slash e.g. "ANY/any/" continue } components = append(components, componentsFullName) @@ -621,6 +618,7 @@ func (s *Service) ImportComponentConfiguration(query *componentcfg.Query, payloa } var keys []string + // fixme: it looks like an overkill to get all the keys in config tree just to obtain a list of components in o2/components keys, err = s.src.GetKeysByPrefix("") if err != nil { return diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go new file mode 100644 index 000000000..08cb64a62 --- /dev/null +++ b/apricot/local/service_test.go @@ -0,0 +1,477 @@ +package local + +import ( + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + "github.com/AliceO2Group/Control/configuration/cfgbackend" + "github.com/AliceO2Group/Control/configuration/componentcfg" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +// TODO: +// - with little effort this could be generalized to test also cacheproxy.service +// - with some more effort, we should also test the same with consul backend, since we break the abstraction layer +// in a few functions in service.go + +var _ = Describe("local service", func() { + + var ( + svc *Service + err error + ) + + Context("with YAML file backend", func() { + BeforeEach(func() { + svc, err = NewService("file://" + *tmpDir + "/" + configFile) + Expect(err).NotTo(HaveOccurred()) + }) + + It("should be of type *YamlSource", func() { + _, ok := svc.src.(*cfgbackend.YamlSource) + Expect(ok).To(Equal(true)) + }) + + Describe("creating a new run number", func() { + When("the run number does not exist yet", func() { + It("should return number 1", func() { + Expect(svc.NewRunNumber()).To(Equal(uint32(1))) + }) + It("should return number 2 after number 1", func() { + Expect(svc.NewRunNumber()).To(Equal(uint32(2))) + }) + }) + }) + + Describe("getting defaults", func() { + var defaults map[string]string + BeforeEach(func() { + defaults = svc.GetDefaults() + }) + When("the defaults are retrieved", func() { + It("should contain the elements from the test YAML file at o2/runtime/aliecs/defaults", func() { + Expect(defaults).To(HaveKeyWithValue("key1", "value1")) + }) + It("should contain some prefilled key-values regardless of the information in the configuration backend", func() { + Expect(defaults).To(HaveKey("core_hostname")) + }) + }) + }) + + Describe("getting vars", func() { + var vars map[string]string + BeforeEach(func() { + vars = svc.GetVars() + }) + When("the vars are retrieved", func() { + It("should contain the elements from the test YAML file at o2/runtime/aliecs/vars", func() { + Expect(vars).To(HaveKeyWithValue("key2", "value2")) + }) + }) + }) + + Describe("getting the list of detectors", func() { + var detectors []string + When("the full detector list is retrieved (incl. detector-like subsystems)", func() { + BeforeEach(func() { + detectors, err = svc.ListDetectors(true) + }) + It("should contain the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(detectors).To(ContainElements("ABC", "DEF", "TRG", "XYZ")) + }) + }) + When("the pure detector list is retrieved", func() { + BeforeEach(func() { + detectors, err = svc.ListDetectors(false) + }) + It("should contain the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(detectors).To(ContainElements("ABC", "DEF", "XYZ")) + }) + }) + }) + + Describe("getting the list of hosts", func() { + var hosts []string + When("the list of hosts is retrieved for all detectors", func() { + BeforeEach(func() { + hosts, err = svc.GetHostInventory("") + }) + It("should contain all the hosts for all the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(hosts).To(ContainElements("flp001", "flp002", "flp003", "flp100")) + }) + }) + When("the list of hosts is retrieved for a valid detector", func() { + BeforeEach(func() { + hosts, err = svc.GetHostInventory("ABC") + }) + It("should contain all the hosts for the ABC detector in the test YAML file at o2/hardware/detectors", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(hosts).To(ContainElements("flp001")) + }) + }) + When("the list of hosts is retrieved for a non-existent detector", func() { + BeforeEach(func() { + hosts, err = svc.GetHostInventory("NOPE") + }) + It("should produce an error", func() { + Expect(err).To(HaveOccurred()) + }) + }) + When("the list of hosts is retrieved for an existing detector with no FLPs assigned", func() { + BeforeEach(func() { + hosts, err = svc.GetHostInventory("XYZ") + }) + It("should return an empty list", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(hosts).To(BeEmpty()) + }) + }) + }) + + Describe("getting the detectors FLP inventory", func() { + var inventory map[string][]string + When("the inventory is retrieved", func() { + BeforeEach(func() { + inventory, err = svc.GetDetectorsInventory() + }) + It("should contain all the hosts for all the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(err).NotTo(HaveOccurred()) + Expect(inventory).To(HaveKey("ABC")) + Expect(inventory["ABC"]).To(ContainElements("flp001")) + Expect(inventory).To(HaveKey("DEF")) + Expect(inventory["DEF"]).To(ContainElements("flp002", "flp003")) + Expect(inventory).To(HaveKey("TRG")) + Expect(inventory["TRG"]).To(ContainElements("flp100")) + Expect(inventory).To(HaveKey("XYZ")) + Expect(inventory["XYZ"]).To(BeEmpty()) + }) + }) + }) + + Describe("getting component configuration", func() { + var ( + payload string + query *componentcfg.Query + err error + ) + When("requesting an entry for a concrete run type and a concrete role", func() { + It("should return the payload for the concrete run type and role", func() { + query, err = componentcfg.NewQuery("qc/PHYSICS/role1/entry1") + Expect(err).NotTo(HaveOccurred()) + payload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("entry1 config PHYSICS role1")) + }) + }) + When("requesting an entry for ANY run type and any role", func() { + It("should return the payload for ANY/any", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry1") + Expect(err).NotTo(HaveOccurred()) + payload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("entry1 config ANY any")) + }) + }) + When("requesting an entry in a subfolder", func() { + It("should return the expected payload", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/sub/entry12") + Expect(err).NotTo(HaveOccurred()) + payload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("world")) + }) + }) + }) + + Describe("getting component configuration with last index", func() { + var ( + query *componentcfg.Query + err error + ) + When("a payload is retrieved", func() { + It("should return an error, because file backend does not support last index", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry1") + Expect(err).NotTo(HaveOccurred()) + _, _, err = svc.GetComponentConfigurationWithLastIndex(query) + Expect(err).To(HaveOccurred()) + }) + }) + }) + + Describe("getting and processing component configuration", func() { + var ( + payload string + query *componentcfg.Query + err error + ) + When("requesting an entry which requires including another entry and inserting a variable", func() { + It("should return the processed payload", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry10") + Expect(err).NotTo(HaveOccurred()) + varStack := make(map[string]string) + varStack["var1"] = "hello" + payload, err = svc.GetAndProcessComponentConfiguration(query, varStack) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("hello world")) + }) + }) + When("requesting an entry which requires including another entry in a different node", func() { + It("should return the processed payload", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry12") + Expect(err).NotTo(HaveOccurred()) + varStack := make(map[string]string) + payload, err = svc.GetAndProcessComponentConfiguration(query, varStack) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("hello world")) + }) + }) + When("requesting an entry which is in a subfolder", func() { + It("should return the processed payload", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/sub/entry12") + Expect(err).NotTo(HaveOccurred()) + varStack := make(map[string]string) + payload, err = svc.GetAndProcessComponentConfiguration(query, varStack) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("world")) + }) + }) + }) + + Describe("resolving a query", func() { + var ( + query *componentcfg.Query + resolved *componentcfg.Query + err error + ) + + When("resolving an ANY/any query which may match an ANY/any and a concrete one in the configuration tree", func() { + It("should resolve to ANY/any query", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry1") + Expect(err).NotTo(HaveOccurred()) + resolved, err = svc.ResolveComponentQuery(query) + Expect(err).NotTo(HaveOccurred()) + Expect(resolved.RunType).To(Equal(apricotpb.RunType_ANY)) + Expect(resolved.RoleName).To(Equal("any")) + }) + }) + When("resolving an ANY/any query while there is only PHYSICS/role1 entry in the configuration tree", func() { + It("should fail to resolve", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry2") + Expect(err).NotTo(HaveOccurred()) + _, err = svc.ResolveComponentQuery(query) + Expect(err).To(HaveOccurred()) + }) + }) + When("resolving a concrete PHYSICS/role1 query which may match an ANY/any and that concrete one in the configuration tree", func() { + It("should resolve to PHYSICS/role1 query", func() { + query, err = componentcfg.NewQuery("qc/PHYSICS/role1/entry1") + Expect(err).NotTo(HaveOccurred()) + resolved, err = svc.ResolveComponentQuery(query) + Expect(err).NotTo(HaveOccurred()) + Expect(resolved.RunType).To(Equal(apricotpb.RunType_PHYSICS)) + Expect(resolved.RoleName).To(Equal("role1")) + }) + }) + When("resolving a concrete PHYSICS/role1 query while there is ANY/any entry in the configuration tree", func() { + It("should resolve to ANY/any query", func() { + query, err = componentcfg.NewQuery("qc/PHYSICS/role1/entry11") + Expect(err).NotTo(HaveOccurred()) + resolved, err = svc.ResolveComponentQuery(query) + Expect(err).NotTo(HaveOccurred()) + Expect(resolved.RunType).To(Equal(apricotpb.RunType_ANY)) + Expect(resolved.RoleName).To(Equal("any")) + }) + }) + When("resolving a query to an entry in a subfolder", func() { + It("should resolve it correctly", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/sub/entry12") + Expect(err).NotTo(HaveOccurred()) + resolved, err = svc.ResolveComponentQuery(query) + Expect(err).NotTo(HaveOccurred()) + Expect(resolved.RunType).To(Equal(apricotpb.RunType_ANY)) + Expect(resolved.RoleName).To(Equal("any")) + Expect(resolved.EntryKey).To(Equal("sub/entry12")) + }) + }) + }) + + Describe("getting raw json payload of everything under a node", func() { + var ( + payload string + err error + ) + When("retrieving a raw json payload", func() { + It("should return a json with correct content and formatting", func() { + payload, err = svc.RawGetRecursive("o2/components/qc/TECHNICAL") + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("{\n\t\"any\": {\n\t\t\"entry\": \"config\"\n\t}\n}")) + }) + }) + }) + + Describe("importing component configuration", func() { + var ( + importedPayload string + retrievedPayload string + existingComponentUpdated bool + existingEntryUpdated bool + query *componentcfg.Query + err error + ) + When("we import a new configuration payload for a new component", func() { + It("should be correctly stored", func() { + query, err = componentcfg.NewQuery("reco/ANY/any/entry2") + Expect(err).NotTo(HaveOccurred()) + importedPayload = "hello" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, true) + Expect(err).NotTo(HaveOccurred()) + Expect(existingComponentUpdated).To(BeFalse()) + Expect(existingEntryUpdated).To(BeFalse()) + retrievedPayload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(retrievedPayload).To(Equal(importedPayload)) + }) + }) + When("we import a new configuration payload for a new component, but we do not set the newComponent flag", func() { + It("should produce an error", func() { + query, err = componentcfg.NewQuery("gpu/ANY/any/entry2") + Expect(err).NotTo(HaveOccurred()) + importedPayload = "hello" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, false) + Expect(err).To(HaveOccurred()) + }) + }) + When("we import a new configuration entry for an existing component", func() { + It("should be correctly stored", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry3") + Expect(err).NotTo(HaveOccurred()) + importedPayload = "hello" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, false) + Expect(err).NotTo(HaveOccurred()) + Expect(existingComponentUpdated).To(BeTrue()) + Expect(existingEntryUpdated).To(BeFalse()) + retrievedPayload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(retrievedPayload).To(Equal(importedPayload)) + }) + }) + When("we import a new payload to an existing entry for an existing component", func() { + It("should be correctly stored", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry4") + Expect(err).NotTo(HaveOccurred()) + importedPayload = "hello" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, false) + Expect(err).NotTo(HaveOccurred()) + + importedPayload = "hello2" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, false) + Expect(err).NotTo(HaveOccurred()) + Expect(existingComponentUpdated).To(BeTrue()) + Expect(existingEntryUpdated).To(BeTrue()) + retrievedPayload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(retrievedPayload).To(Equal(importedPayload)) + }) + }) + When("we import a new payload to a new entry which should go to a non-existing subfolder", func() { + It("should be correctly stored", func() { + query, err = componentcfg.NewQuery("qc/PHYSICS/role1/sub/entry2") + Expect(err).NotTo(HaveOccurred()) + importedPayload = "sub hello" + existingComponentUpdated, existingEntryUpdated, err = svc.ImportComponentConfiguration(query, importedPayload, false) + Expect(err).NotTo(HaveOccurred()) + Expect(svc.src.Exists("o2/components/qc/PHYSICS/role1/sub/entry2")).To(BeTrue()) + + retrievedPayload, err = svc.GetComponentConfiguration(query) + Expect(err).NotTo(HaveOccurred()) + Expect(retrievedPayload).To(Equal(importedPayload)) + }) + }) + + }) + + // TODO: + // GetDetectorForHost (currently not supporting yaml backend) + // GetDetectorsForHosts (currently not supporting yaml backend) + // GetCRUCardsForHost (currently not supporting yaml backend) + // GetEndpointsForCRUCard (currently not supporting yaml backend) + // GetRuntimeEntry (currently not supporting yaml backend) + // SetRuntimeEntry (currently not supporting yaml backend) + // GetRuntimeEntries (currently not supporting yaml backend) + // ListRuntimeEntries (currently not supporting yaml backend) + // as far as i can tell, all of those could rather easily support yaml backend and share the code paths with + // the consul backend, thus allow us to test them well without requiring a consul instance + + Describe("listing components", func() { + var ( + components []string + err error + ) + When("the list of components is retrieved", func() { + It("should have the expected components", func() { + components, err = svc.ListComponents() + Expect(err).NotTo(HaveOccurred()) + Expect(components).To(ContainElements("qc")) + // there might be also 'readout' in components, but it is put by another Describe node, + // so i would not treat it as guaranteed to be there. + }) + }) + }) + + Describe("listing component entries", func() { + var ( + query *componentcfg.EntriesQuery + entries []string + err error + ) + When("the list of entries for a component is retrieved", func() { + // fixme: the tested function does not perform run type and role name matching, it just takes + // everything under the provided component. i'm not sure if this is correct. + It("should have the expected entries listed in the test yaml file", func() { + query, err = componentcfg.NewEntriesQuery("qc/ANY/any") + entries, err = svc.ListComponentEntries(query) + Expect(err).NotTo(HaveOccurred()) + Expect(entries).To(ContainElements( + "ANY/any/entry1", + "ANY/any/entry10", + "ANY/any/entry11", + "ANY/any/entry12", + "ANY/any/sub/entry12", + "ANY/role1/entry1", + "PHYSICS/role1/entry1", + "PHYSICS/role1/entry2", + "TECHNICAL/any/entry", + )) + // there might be also a few other elements which are added in different Describe nodes, + // which we do not look for, as they are not guaranteed to be there. + }) + }) + }) + + Describe("invalidating template cache", func() { + var ( + payload string + query *componentcfg.Query + err error + ) + When("requesting an entry after having invalidated cache", func() { + It("should provide a valid entry", func() { + query, err = componentcfg.NewQuery("qc/ANY/any/entry10") + Expect(err).NotTo(HaveOccurred()) + varStack := make(map[string]string) + varStack["var1"] = "hello" + payload, err = svc.GetAndProcessComponentConfiguration(query, varStack) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("hello world")) + + svc.InvalidateComponentTemplateCache() + payload, err = svc.GetAndProcessComponentConfiguration(query, varStack) + Expect(err).NotTo(HaveOccurred()) + Expect(payload).To(Equal("hello world")) + }) + }) + }) + }) +}) diff --git a/apricot/local/service_test.yaml b/apricot/local/service_test.yaml new file mode 100644 index 000000000..2039aeb99 --- /dev/null +++ b/apricot/local/service_test.yaml @@ -0,0 +1,53 @@ +o2: + components: + qc: + TECHNICAL: + any: + entry: "config" + PHYSICS: + role1: + entry1: "entry1 config PHYSICS role1" + entry2: "entry2 config PHYSICS role1" + ANY: + role1: + entry1: "entry1 config ANY role1" + any: + entry1: "entry1 config ANY any" + entry10: "{{ var1 }} {% include \"entry11\" %}" + entry11: "world" + entry12: "hello {% include \"sub/entry12\" %}" + sub: + entry12: "world" + runtime: + aliecs: + defaults: + key1: value1 + vars: + key2: value2 + hardware: + detectors: + ABC: + flps: + flp001: + cards: "{ \"key\" : \"value\" }" + DEF: + flps: + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + TRG: + flps: + flp100: + cards: "{ \"key\" : \"value\" }" + XYZ: + flps: {} + flps: + flp001: + cards: "{ \"key\" : \"value\" }" + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + flp100: + cards: "{ \"key\" : \"value\" }" \ No newline at end of file diff --git a/coconut/configuration/configuration.go b/coconut/configuration/configuration.go index 548e0b52b..74cc3d6e7 100644 --- a/coconut/configuration/configuration.go +++ b/coconut/configuration/configuration.go @@ -162,7 +162,7 @@ func List(svc configuration.Service, cmd *cobra.Command, args []string, o io.Wri } // 1 arg: conf list - if !componentcfg.IsInputSingleValidWord(args[0]) { + if !componentcfg.IsInputValidComponentName(args[0]) { return errors.New(EC_INVALID_ARGS_MSG), EC_INVALID_ARGS } diff --git a/coconut/configuration/configurationutil.go b/coconut/configuration/configurationutil.go index 675625199..fefd20a53 100644 --- a/coconut/configuration/configurationutil.go +++ b/coconut/configuration/configurationutil.go @@ -69,7 +69,7 @@ func queryFromFlags(cmd *cobra.Command, args []string) (query *componentcfg.Quer err = errors.New("please provide entry name") return } - case 2: // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] [--timestamp] + case 2: // coconut conf show component entry [--runtype RUNTYPE_EXPR] [--role role_expr] var runTypeS, machineRole string var runType apricotpb.RunType runTypeS, err = cmd.Flags().GetString("runtype") @@ -94,7 +94,7 @@ func queryFromFlags(cmd *cobra.Command, args []string) (query *componentcfg.Quer machineRole = "any" // default value for empty machine role input } - if !componentcfg.IsInputSingleValidWord(args[0]) || !componentcfg.IsInputSingleValidWord(args[1]) { + if !componentcfg.IsInputValidComponentName(args[0]) || !componentcfg.IsInputValidEntryName(args[1]) { err = errors.New(EC_INVALID_ARGS_MSG) return } else { diff --git a/configuration/cfgbackend/source.go b/configuration/cfgbackend/source.go index b9bac1eea..394d572f8 100644 --- a/configuration/cfgbackend/source.go +++ b/configuration/cfgbackend/source.go @@ -32,9 +32,10 @@ import ( "strings" ) +// Read-Only Source type ROSource interface { Get(string) (string, error) - GetKeysByPrefix(string)([]string, error) + GetKeysByPrefix(string) ([]string, error) GetRecursive(string) (Item, error) GetRecursiveYaml(string) ([]byte, error) Exists(string) (bool, error) diff --git a/configuration/cfgbackend/source_test.go b/configuration/cfgbackend/source_test.go index 5321b977c..cd40ae75f 100644 --- a/configuration/cfgbackend/source_test.go +++ b/configuration/cfgbackend/source_test.go @@ -105,6 +105,22 @@ var _ = Describe("Source", func() { Expect(marshErr).NotTo(HaveOccurred()) Expect(c.GetRecursiveYaml("o2/control/tasks[1]")).To(Equal(marshalled)) }) + + It("should correctly get all keys with the provided prefix", func() { + Expect(c.GetKeysByPrefix("o2/control/globals")).To( + SatisfyAll( + HaveLen(9), + ContainElements( + "o2/control/globals/o2_install_path", + "o2/control/globals/config_basedir", + "o2/control/globals/control/", + "o2/control/globals/control/fairmq/", + "o2/control/globals/control/fairmq/plugin_args", + "o2/control/globals/control/fairmq/control_port_args", + "o2/control/globals/control/direct/", + "o2/control/globals/control/direct/control_port_args", + "o2/control/globals/modulepath"))) + }) }) Context("to check the existence of a key", func() { diff --git a/configuration/cfgbackend/yamlsource.go b/configuration/cfgbackend/yamlsource.go index 422d05a32..a4d9b11eb 100644 --- a/configuration/cfgbackend/yamlsource.go +++ b/configuration/cfgbackend/yamlsource.go @@ -162,9 +162,25 @@ func (yc *YamlSource) GetKeysByPrefix(keyPrefix string) (keys []string, err erro err = errors.New("cannot get keys of non-map type") return } - for k := range recursive.Map() { - keys = append(keys, k) + + // we collect all the keys recursively and mark nodes with "/" at the end, just as the consul backend does + var collectKeys func(Item, string) + collectKeys = func(item Item, path string) { + if item.Type() == IT_Map { + for k, v := range item.Map() { + newPath := yamlFormatKey(path) + "/" + k + // i'm not sure what to do with arrays, but the consul backend does not support them anyway + if v.Type() == IT_Map { + keys = append(keys, newPath+"/") + } else { + keys = append(keys, newPath) + } + collectKeys(v, newPath) + } + } } + collectKeys(recursive, keyPrefix) + return } @@ -182,6 +198,11 @@ func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { return } requestKey := yamlFormatKey(key) + if len(requestKey) == 0 { + // we request the root + value = yc.data + return + } keysPath := strings.Split(requestKey, "/") currentMap := yc.data for i, k := range keysPath { @@ -198,7 +219,7 @@ func (yc *YamlSource) GetRecursive(key string) (value Item, err error) { } } if currentMap[currentKey] == nil { - err = errors.New(fmt.Sprintf("no value for key %s", key)) + err = errors.New(fmt.Sprintf("no value for key '%s'", key)) return } else { it := currentMap[currentKey] @@ -467,8 +488,8 @@ func (yc *YamlSource) Exists(key string) (exists bool, err error) { } func yamlFormatKey(key string) (consulKey string) { - // Trim leading slashes - consulKey = strings.TrimLeft(key, "/") + // Trim leading and trailing slashes + consulKey = strings.Trim(key, "/") return } diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index ee5656fbc..ca7065e7c 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -39,18 +39,28 @@ const ( SEPARATOR_RUNE = '/' ) -// Checks whether the input string is a valid Consul path element on its own -func IsInputSingleValidWord(input string) bool { - return !strings.Contains(input, "/") && !strings.Contains(input, "@") +// Checks whether the input string is a valid component name +func IsInputValidComponentName(input string) bool { + return !strings.Contains(input, "/") +} + +// Checks whether the input string is a valid entry name +func IsInputValidEntryName(input string) bool { + return !strings.HasSuffix(input, "resolve") } // keys must be a slice containing all the full keys in /o2/components func GetComponentsMapFromKeysList(keys []string) map[string]bool { var componentsMap = make(map[string]bool) for _, value := range keys { + if !strings.HasPrefix(value, ConfigComponentsPath) { + continue + } value := strings.TrimPrefix(value, ConfigComponentsPath) component := strings.Split(value, "/")[0] - componentsMap[component] = true + if len(component) > 0 { + componentsMap[component] = true + } } return componentsMap } @@ -64,6 +74,9 @@ func GetEntriesMapOfComponentFromKeysList(component string, runtype apricotpb.Ru for _, value := range keys { value := strings.TrimPrefix(value, ConfigComponentsPath) parts := strings.Split(value, "/") + if len(parts) < 4 { + continue + } if parts[0] == component && parts[1] == runtypeString && parts[2] == rolename { diff --git a/configuration/componentcfg/componentcfg_test.go b/configuration/componentcfg/componentcfg_test.go new file mode 100644 index 000000000..28a400aac --- /dev/null +++ b/configuration/componentcfg/componentcfg_test.go @@ -0,0 +1,152 @@ +package componentcfg + +import ( + apricotpb "github.com/AliceO2Group/Control/apricot/protos" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("Component configuration helpers", func() { + Describe("IsInputValidComponentName", func() { + When("a component does not have '/' characters", func() { + It("should be considered as a valid component name", func() { + Expect(IsInputValidComponentName("aZ0+@")).To(BeTrue()) + }) + }) + When("a component has a '/' character", func() { + It("should be considered as an invalid component name", func() { + Expect(IsInputValidComponentName("foo/bar")).To(BeFalse()) + }) + }) + }) + + Describe("IsInputValidEntryName", func() { + When("an entry does not have '/resolve' string at the end", func() { + It("should be considered as a valid component name", func() { + Expect(IsInputValidEntryName("aZ0+@")).To(BeTrue()) + }) + }) + When("an entry has a '/resolve' string at the end", func() { + It("should be considered as an invalid entry name", func() { + Expect(IsInputValidComponentName("foo/resolve")).To(BeFalse()) + }) + }) + When("an entry consists of directories, i.e. it has '/' characters", func() { + It("should be considered as a valid entry name", func() { + Expect(IsInputValidComponentName("foo/bar")).To(BeFalse()) + }) + }) + }) + + Describe("GetComponentsMapFromKeysList", func() { + When("given a list of keys with valid component names", func() { + It("should return a map with the component names as keys", func() { + keys := []string{ + "o2/components/component1/key1", + "o2/components/component1/key2", + "o2/components/component2/key1", + } + expected := map[string]bool{ + "component1": true, + "component2": true, + } + Expect(GetComponentsMapFromKeysList(keys)).To(Equal(expected)) + }) + }) + + When("given a list of keys with empty component names", func() { + It("should return an empty map", func() { + keys := []string{ + "o2/components//key1", + "o2/components/", + } + expected := map[string]bool{} + Expect(GetComponentsMapFromKeysList(keys)).To(Equal(expected)) + }) + }) + + When("given an empty list of keys", func() { + It("should return an empty map", func() { + keys := []string{} + expected := map[string]bool{} + Expect(GetComponentsMapFromKeysList(keys)).To(Equal(expected)) + }) + }) + + When("given a list of keys which are not in o2/components", func() { + It("should return an empty map", func() { + keys := []string{ + "o2/hardware/key", + } + expected := map[string]bool{} + Expect(GetComponentsMapFromKeysList(keys)).To(Equal(expected)) + }) + }) + }) + + Describe("GetEntriesMapOfComponentFromKeysList", func() { + var ( + component = "qc" + runtype = apricotpb.RunType_PHYSICS // Assume 1 is a valid RunType + rolename = "testRole" + keys = []string{ + "o2/components/qc/PHYSICS/testRole/entry1", + "o2/components/qc/PHYSICS/testRole/entry2", + "o2/components/qc/PHYSICS/testRole/entry3", + } + ) + // fixme: it seems that this function does not support the "any" role any "ANY" run type. should this be fixed? + + When("keys list contains valid entries for the given component, runtype, and rolename", func() { + It("should return a map with the entries matching the provided component", func() { + expectedMap := map[string]bool{ + "entry1": true, + "entry2": true, + "entry3": true, + } + result := GetEntriesMapOfComponentFromKeysList(component, runtype, rolename, keys) + Expect(result).To(Equal(expectedMap)) + }) + }) + + When("keys list contains entries for a different component", func() { + It("should not include those entries in the map", func() { + keysWithDifferentComponent := append(keys, "o2/components/readout/PHYSICS/testRole/entry5") + result := GetEntriesMapOfComponentFromKeysList(component, runtype, rolename, keysWithDifferentComponent) + Expect(result).ToNot(HaveKey("entry5")) + }) + }) + + When("keys list contains entries for a different runtype", func() { + It("should not include those entries in the map", func() { + keysWithDifferentRuntype := append(keys, "o2/components/qc/TECHNICAL/testRole/entry6") + result := GetEntriesMapOfComponentFromKeysList(component, runtype, rolename, keysWithDifferentRuntype) + Expect(result).ToNot(HaveKey("entry6")) + }) + }) + + When("keys list contains entries for a different rolename", func() { + It("should not include those entries in the map", func() { + keysWithDifferentRolename := append(keys, "o2/components/qc/PHYSICS/differentRole/entry7") + result := GetEntriesMapOfComponentFromKeysList(component, runtype, rolename, keysWithDifferentRolename) + Expect(result).ToNot(HaveKey("entry7")) + }) + }) + + When("keys list contains an entry with an unexpected format", func() { + It("should gracefully ignore malformed entries", func() { + malformedKeys := append(keys, "o2/components/qc/PHYSICS/testRole") + result := GetEntriesMapOfComponentFromKeysList(component, runtype, rolename, malformedKeys) + Expect(result).ToNot(HaveKey("")) + }) + // fixme: undefined behaviour: + // "o2/components/qc/PHYSICS/testRole//" will return a key "", is this correct? + }) + }) +}) + +func TestComponentCfg(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Component Configuration Test Suite") +} From 2454f63e84fd351bd59c51f83cbe54eebb04c0bc Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 16 May 2024 17:19:16 +0200 Subject: [PATCH 1900/2352] [apricot] allow for arbitrary number of entry subfolders in HTTP service --- apricot/local/servicehttp.go | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 19ad68059..bb80243e5 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -96,16 +96,14 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { apiComponentsEntries.HandleFunc("/{runtype}/{rolename}", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) apiComponentsEntries.HandleFunc("/{runtype}/{rolename}/", httpsvc.ApiListComponentEntries).Methods(http.MethodGet) - apiComponentQuery := router.PathPrefix("/components/{component}/{runtype}/{rolename}/{entry}").Subrouter() - // GET /components/{component}/{runtype}/{rolename}/{entry}/resolve, assumes this is not a raw path, returns a raw path - // like {component}/{runtype}/{rolename}/{entry} + apiComponentQuery := router.PathPrefix("/components/{component}/{runtype}/{rolename}/{remainder:.*}").Subrouter() + // GET /components/{component}/{runtype}/{rolename}/{remainder:.*} with '/resolve' within the remainder, + // assumes this is not a raw path, returns a raw path like {component}/{runtype}/{rolename}/{entry} apiComponentQuery.HandleFunc("/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) - apiComponentQuery.HandleFunc("/{subentry}/resolve", httpsvc.ApiResolveComponentQuery).Methods(http.MethodGet) - // GET /components/{component}/{runtype}/{rolename}/{entry}, accepts raw or non-raw path, returns payload + // GET /components/{component}/{runtype}/{rolename}/{remainder:.*}, accepts raw or non-raw path, returns payload // that may be processed or not depending on process=true or false apiComponentQuery.HandleFunc("", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) apiComponentQuery.HandleFunc("/", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) - apiComponentQuery.HandleFunc("/{subentry}", httpsvc.ApiGetComponentConfiguration).Methods(http.MethodGet) // inventory API @@ -401,17 +399,13 @@ func (httpsvc *HttpService) ApiResolveComponentQuery(w http.ResponseWriter, r *h return } - entry, hasEntry := queryParams["entry"] + entry, hasEntry := queryParams["remainder"] if !hasEntry { w.WriteHeader(http.StatusBadRequest) _, _ = fmt.Fprintln(w, "entry not provided") return } - - subentry, hasSubentry := queryParams["subentry"] - if hasSubentry { - entry = entry + "/" + subentry - } + entry = strings.TrimSuffix(entry, "/resolve") resolved, err := httpsvc.svc.ResolveComponentQuery(&componentcfg.Query{ Component: component, @@ -483,17 +477,13 @@ func (httpsvc *HttpService) ApiGetComponentConfiguration(w http.ResponseWriter, return } - entry, hasEntry := queryParams["entry"] + entry, hasEntry := queryParams["remainder"] if !hasEntry { w.WriteHeader(http.StatusBadRequest) _, _ = fmt.Fprintln(w, "entry not provided") return } - - subentry, hasSubentry := queryParams["subentry"] - if hasSubentry { - entry = entry + "/" + subentry - } + entry = strings.TrimSuffix(entry, "/") queryArgs := r.URL.Query() processS := queryArgs.Get("process") From 2315b92658f85987370606dddae7a18dc3e83d62 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 17 May 2024 16:16:49 +0200 Subject: [PATCH 1901/2352] [apricot] test the HTTP handler for Apricot A minor refactoring included in order to be able to create the HTTP handler/router without creating a server. --- apricot/local/local_test.go | 24 +- apricot/local/service_test.go | 2 +- apricot/local/servicehttp.go | 33 ++- apricot/local/servicehttp_test.go | 402 ++++++++++++++++++++++++++++ apricot/local/servicehttp_test.yaml | 54 ++++ 5 files changed, 490 insertions(+), 25 deletions(-) create mode 100644 apricot/local/servicehttp_test.go create mode 100644 apricot/local/servicehttp_test.yaml diff --git a/apricot/local/local_test.go b/apricot/local/local_test.go index d99999f11..ea48c3a4d 100644 --- a/apricot/local/local_test.go +++ b/apricot/local/local_test.go @@ -12,7 +12,8 @@ import ( var tmpDir *string -const configFile = "service_test.yaml" +const serviceConfigFile = "service_test.yaml" +const serviceHTTPConfigFile = "servicehttp_test.yaml" func TestLocal(t *testing.T) { RegisterFailHandler(Fail) @@ -25,17 +26,20 @@ var _ = BeforeSuite(func() { *tmpDir, err = os.MkdirTemp("", "o2control-local-service") Expect(err).NotTo(HaveOccurred()) - // copy config file - from, err := os.Open("./" + configFile) - Expect(err).NotTo(HaveOccurred()) - defer from.Close() + // copy config files + configFiles := []string{serviceConfigFile, serviceHTTPConfigFile} + for _, configFile := range configFiles { + from, err := os.Open("./" + configFile) + Expect(err).NotTo(HaveOccurred()) + defer from.Close() - to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) - Expect(err).NotTo(HaveOccurred()) - defer to.Close() + to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) + Expect(err).NotTo(HaveOccurred()) + defer to.Close() - _, err = io.Copy(to, from) - Expect(err).NotTo(HaveOccurred()) + _, err = io.Copy(to, from) + Expect(err).NotTo(HaveOccurred()) + } viper.Set("coreWorkingDir", tmpDir) // used by NewRunNumber with YAML backend }) diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go index 08cb64a62..0cf86a89e 100644 --- a/apricot/local/service_test.go +++ b/apricot/local/service_test.go @@ -22,7 +22,7 @@ var _ = Describe("local service", func() { Context("with YAML file backend", func() { BeforeEach(func() { - svc, err = NewService("file://" + *tmpDir + "/" + configFile) + svc, err = NewService("file://" + *tmpDir + "/" + serviceConfigFile) Expect(err).NotTo(HaveOccurred()) }) diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index bb80243e5..ffcd58081 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -57,21 +57,10 @@ type HttpService struct { // @contact.url https://alice-flp.docs.cern.ch/ // @contact.email alice-o2-flp-support@cern.ch -// @externalDocs.description AliECS handbook -// @externalDocs.url https://alice-flp.docs.cern.ch/aliecs/handbook/ - -func NewHttpService(service configuration.Service) (svr *http.Server) { +// @externalDocs.description AliECS handbook +// @externalDocs.url https://alice-flp.docs.cern.ch/aliecs/handbook/ +func newHandlerForHttpService(httpsvc *HttpService) *mux.Router { router := mux.NewRouter() - httpsvc := &HttpService{ - svc: service, - } - httpsvr := &http.Server{ - Handler: router, - Addr: ":" + strconv.Itoa(viper.GetInt("httpListenPort")), - WriteTimeout: 15 * time.Second, - ReadTimeout: 15 * time.Second, - } - // documentation endpoint _ = router.PathPrefix("/docs/").Handler(httpSwagger.WrapHandler) @@ -122,6 +111,22 @@ func NewHttpService(service configuration.Service) (svr *http.Server) { apiInventoryDetectorFlps.HandleFunc("/", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) apiInventoryDetectorFlps.HandleFunc("/{format}", httpsvc.ApiGetDetectorFlps).Methods(http.MethodGet) + return router +} + +func NewHttpService(service configuration.Service) (svr *http.Server) { + httpsvc := &HttpService{ + svc: service, + } + handler := newHandlerForHttpService(httpsvc) + + httpsvr := &http.Server{ + Handler: handler, + Addr: ":" + strconv.Itoa(viper.GetInt("httpListenPort")), + WriteTimeout: 15 * time.Second, + ReadTimeout: 15 * time.Second, + } + // async-start of http Service and capture error go func() { log.WithField("port", viper.GetInt("httpListenPort")). diff --git a/apricot/local/servicehttp_test.go b/apricot/local/servicehttp_test.go new file mode 100644 index 000000000..14a6533b3 --- /dev/null +++ b/apricot/local/servicehttp_test.go @@ -0,0 +1,402 @@ +package local + +import ( + "encoding/json" + "github.com/gorilla/mux" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "net/http" + "net/http/httptest" +) + +var _ = Describe("HTTP apricot service", func() { + + // We test the handler directly to avoid any issues with finding a free port, waiting until the server responds, + // freeing the socket/port, concurrency of the executed tests. This way we can test just the API. + var ( + httpSvc *HttpService + handler *mux.Router + recorder *httptest.ResponseRecorder + err error + ) + + Context("with YAML file backend", func() { + BeforeEach(func() { + svc, err := NewService("file://" + *tmpDir + "/" + serviceHTTPConfigFile) + Expect(err).NotTo(HaveOccurred()) + httpSvc = &HttpService{svc} + handler = newHandlerForHttpService(httpSvc) + recorder = httptest.NewRecorder() + }) + + Describe("getting the list of hosts", func() { + Context("expecting JSON output", func() { + When("the list of hosts is retrieved for all detectors", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/flps/json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for all the detectors listed in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + var hosts []string + err = json.NewDecoder(recorder.Body).Decode(&hosts) + Expect(err).NotTo(HaveOccurred()) + + Expect(hosts).To(HaveLen(4)) + Expect(hosts).To(ContainElements("flp001", "flp002", "flp003", "flp100")) + }) + }) + When("the list of hosts is retrieved for a valid detector", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/ITS/flps/json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for the ITS detector in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + var hosts []string + err = json.NewDecoder(recorder.Body).Decode(&hosts) + Expect(err).NotTo(HaveOccurred()) + Expect(hosts).To(ContainElements("flp001")) + }) + }) + When("the list of hosts is retrieved for a detector which is not present in the config store", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/TPC/flps/json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + // Perhaps that's OK, but this behaviour is different from the local/service, which returns an error + // in such case. + It("should return an empty list", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + var hosts []string + err = json.NewDecoder(recorder.Body).Decode(&hosts) + Expect(hosts).To(BeEmpty()) + }) + }) + When("the list of hosts is retrieved for an existing detector with no FLPs assigned", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/MID/flps/json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return an empty list", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + var hosts []string + err = json.NewDecoder(recorder.Body).Decode(&hosts) + Expect(hosts).To(BeEmpty()) + }) + }) + }) + Context("expecting plain text output", func() { + When("the list of hosts is retrieved for all detectors", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/flps", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for all the detectors listed in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + // order is not guaranteed + Expect(recorder.Body.String()).To(ContainSubstring("flp100")) + Expect(recorder.Body.String()).To(ContainSubstring("flp001")) + Expect(recorder.Body.String()).To(ContainSubstring("flp002")) + Expect(recorder.Body.String()).To(ContainSubstring("flp003")) + }) + }) + When("the list of hosts is retrieved for a valid detector", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/ITS/flps", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for the ITS detector in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("flp001\n")) + }) + }) + }) + }) + Describe("getting the detectors FLP inventory", func() { + Context("expecting JSON output", func() { + var inventory map[string][]string + When("the inventory is retrieved", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for all the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + err = json.NewDecoder(recorder.Body).Decode(&inventory) + + Expect(err).NotTo(HaveOccurred()) + Expect(inventory).To(HaveKey("ITS")) + Expect(inventory["ITS"]).To(ContainElements("flp001")) + Expect(inventory).To(HaveKey("HMP")) + Expect(inventory["HMP"]).To(ContainElements("flp002", "flp003")) + Expect(inventory).To(HaveKey("TRG")) + Expect(inventory["TRG"]).To(ContainElements("flp100")) + Expect(inventory).To(HaveKey("MID")) + Expect(inventory["MID"]).To(BeEmpty()) + }) + }) + }) + Context("expecting plain text output", func() { + When("the inventory is retrieved", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/inventory/detectors/text", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should contain all the hosts for all the detectors in the test YAML file at o2/hardware/detectors", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(ContainSubstring("ITS\n\tflp001")) + Expect(recorder.Body.String()).To(ContainSubstring("TRG\n\tflp100")) + Expect(recorder.Body.String()).To(ContainSubstring("MID\n")) + Expect(recorder.Body.String()).To(ContainSubstring("HMP\n")) // flps can be in any order, we won't test it + }) + }) + }) + }) + + Describe("getting component configuration", func() { + // fixme: compared to the raw local/service, the HTTP service adds a newline character. + // probably not an issue, but still an inconsistency to be aware of. + When("requesting an entry for a concrete run type and a concrete role", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/PHYSICS/role1/entry1", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the payload for the concrete run type and role", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("entry1 config PHYSICS role1\n")) + }) + }) + When("requesting an entry for ANY run type and any role", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/entry1", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the payload for ANY/any", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("entry1 config ANY any\n")) + }) + }) + When("requesting an entry for ANY run type and any role with '/' at the end of the query", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/entry1/", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the payload for ANY/any", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("entry1 config ANY any\n")) + }) + }) + When("requesting an entry in a subfolder", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/sub/entry12", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the expected payload", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("world\n")) + }) + }) + }) + + Describe("getting and processing component configuration", func() { + When("requesting an entry which requires including another entry and inserting a variable", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/entry10?process=true&var1=hello", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the processed payload", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("hello world\n")) + }) + }) + When("requesting an entry which requires including another entry in a different node", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/entry12?process=true", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the processed payload", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("hello world\n")) + }) + }) + When("requesting an entry which is in a subfolder", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/sub/entry12?process=true", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return the processed payload", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("world\n")) + }) + }) + }) + Describe("resolving a query", func() { + // fixme: compared to the raw local/service, the HTTP service adds a newline character. + // probably not an issue, but still an inconsistency to be aware of. + When("resolving an ANY/any query", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/entry1/resolve", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should resolve to ANY/any query", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("qc/ANY/any/entry1\n")) + }) + }) + When("resolving a concrete PHYSICS/role1 query while there is ANY/any entry in the configuration tree", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/PHYSICS/role1/entry11/resolve", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should resolve to ANY/any query", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("qc/ANY/any/entry11\n")) + }) + }) + When("resolving a query to an entry in a subfolder", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/sub/entry12/resolve", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should resolve it correctly", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("qc/ANY/any/sub/entry12\n")) + }) + }) + }) + + Describe("listing all entries for a component/runtype/rolename", func() { + Context("expecting plain text output", func() { + When("listing all entries (without '/' at the end)", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return text list with the entries, one per line", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal( + "ANY/any/entry1\n" + + "ANY/any/entry10\n" + + "ANY/any/entry11\n" + + "ANY/any/entry12\n" + + "ANY/any/sub/entry12\n")) + }) + }) + When("listing all entries (with '/' at the end)", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any/", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return text list with the entries, one per line", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal( + "ANY/any/entry1\n" + + "ANY/any/entry10\n" + + "ANY/any/entry11\n" + + "ANY/any/entry12\n" + + "ANY/any/sub/entry12\n")) + }) + }) + }) + Context("expecting json output", func() { + When("listing all entries", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components/qc/ANY/any?format=json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should return text list with the entries, one per line", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + var hosts []string + err = json.NewDecoder(recorder.Body).Decode(&hosts) + Expect(hosts).To(ContainElements("ANY/any/entry1", "ANY/any/entry10", "ANY/any/entry11", "ANY/any/entry12", "ANY/any/sub/entry12")) + }) + }) + }) + }) + + Describe("listing components", func() { + Context("with text/plain format", func() { + When("the list of components is retrieved", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components?format=text/plain", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should have the expected components", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("qc\n")) + }) + }) + }) + Context("with json format", func() { + When("the list of components is retrieved", func() { + BeforeEach(func() { + req, err := http.NewRequest("GET", "/components?format=json", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + }) + It("should have the expected components", func() { + Expect(recorder.Code).To(Equal(http.StatusOK)) + + var components []string + err = json.NewDecoder(recorder.Body).Decode(&components) + Expect(err).NotTo(HaveOccurred()) + Expect(components).To(HaveLen(1)) + Expect(components).To(ContainElements("qc")) + }) + }) + }) + }) + + Describe("invalidating template cache", func() { + When("requesting an entry after having invalidated cache", func() { + It("should provide a valid entry", func() { + req, err := http.NewRequest("GET", "/components/qc/PHYSICS/role1/entry1", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("entry1 config PHYSICS role1\n")) + + recorder = httptest.NewRecorder() + req, err = http.NewRequest("POST", "/components/_invalidate_cache", nil) + handler.ServeHTTP(recorder, req) + Expect(recorder.Code).To(Equal(http.StatusOK)) + + recorder = httptest.NewRecorder() + req, err = http.NewRequest("GET", "/components/qc/PHYSICS/role1/entry1", nil) + Expect(err).NotTo(HaveOccurred()) + handler.ServeHTTP(recorder, req) + Expect(recorder.Code).To(Equal(http.StatusOK)) + Expect(recorder.Body.String()).To(Equal("entry1 config PHYSICS role1\n")) + }) + }) + }) + }) +}) diff --git a/apricot/local/servicehttp_test.yaml b/apricot/local/servicehttp_test.yaml new file mode 100644 index 000000000..f84eb30a3 --- /dev/null +++ b/apricot/local/servicehttp_test.yaml @@ -0,0 +1,54 @@ +o2: + components: + qc: + TECHNICAL: + any: + entryA: "config" + entryB: "config" + PHYSICS: + role1: + entry1: "entry1 config PHYSICS role1" + entry2: "entry2 config PHYSICS role1" + ANY: + role1: + entry1: "entry1 config ANY role1" + any: + entry1: "entry1 config ANY any" + entry10: "{{ var1 }} {% include \"entry11\" %}" + entry11: "world" + entry12: "hello {% include \"sub/entry12\" %}" + sub: + entry12: "world" + runtime: + aliecs: + defaults: + key1: value1 + vars: + key2: value2 + hardware: + detectors: + ITS: + flps: + flp001: + cards: "{ \"key\" : \"value\" }" + HMP: + flps: + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + TRG: + flps: + flp100: + cards: "{ \"key\" : \"value\" }" + MID: + flps: {} + flps: + flp001: + cards: "{ \"key\" : \"value\" }" + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + flp100: + cards: "{ \"key\" : \"value\" }" \ No newline at end of file From c29c5ce085b8957f891b57e53bf22ddd6662d77b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 May 2024 09:59:18 +0200 Subject: [PATCH 1902/2352] [build] Bump to v1.10.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 71525dcf7..790d64746 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 9 -VERSION_PATCH := 2 +VERSION_MINOR := 10 +VERSION_PATCH := 0 From c32f70b09e8b06c35fa14e86b280ed8ec870ab7c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 22 May 2024 17:00:47 +0200 Subject: [PATCH 1903/2352] OCTRL-888 [occ] If we see FairMQ's ERROR state, we should exit FairMQ considers ERROR state as a final state and expects any plugins to exit in such case. This is of course in contradiction to our concept of the ERROR state, which we envisage to RECOVER from. This being said, since FairMQ tries to exit anyway in such cases and we do not plan to work on recovery soon, I think the best is to respect the current status quo. This fixes OCTRL-888, allowing the DPL tasks to exit upon seeing an exception and propagating it to FairMQ. --- occ/plugin/OccLiteServer.cxx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/occ/plugin/OccLiteServer.cxx b/occ/plugin/OccLiteServer.cxx index 11a0bdb9e..5bbef1ee7 100644 --- a/occ/plugin/OccLiteServer.cxx +++ b/occ/plugin/OccLiteServer.cxx @@ -130,8 +130,9 @@ OccLite::Service::EventStream(::grpc::ServerContext* context, const OccLite::nop last_known_state = state; OLOG(debug) << "[EventStream] new state: " << state; - - if (state == "EXITING") { + // for FairMQ, EXITING and ERROR are both final states and plugins are expected to quit at this point + // see octrl-888 for more details + if (state == "EXITING" || state == "ERROR") { std::unique_lock finished_lk(finished_mu); auto nilEvent = new nopb::DeviceEvent; From 67cda982e0da3cc294df8b32f6bdf9c6bb4af7a3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 May 2024 15:48:34 +0200 Subject: [PATCH 1904/2352] [core] Emit run SOSOR/EOSOR/SOEOR/EOEOR events to aliecs.run topic --- coconut/protos/o2control.pb.go | 4 +- coconut/protos/o2control_grpc.pb.go | 2 +- common/event/writer.go | 5 + common/protos/events.pb.go | 299 +++++++++++++++++------ common/protos/events.proto | 13 +- core/environment/environment.go | 93 ++++++- core/environment/transition_configure.go | 5 +- core/protos/o2control.pb.go | 4 +- core/protos/o2control_grpc.pb.go | 2 +- 9 files changed, 339 insertions(+), 88 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index db47b3960..cb9d015be 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v4.25.3 // source: protos/o2control.proto package pb @@ -67,12 +67,14 @@ type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent +type Ev_RunEvent = protos.Ev_RunEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent type Event_CallEvent = protos.Event_CallEvent type Event_IntegratedServiceEvent = protos.Event_IntegratedServiceEvent +type Event_RunEvent = protos.Event_RunEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index d702dab58..e3430de84 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v4.25.3 // source: protos/o2control.proto package pb diff --git a/common/event/writer.go b/common/event/writer.go index 1283fa993..386a530c0 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -132,6 +132,11 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time Timestamp: timestamp.UnixMilli(), Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, } + case *pb.Ev_RunEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + Payload: &pb.Event_RunEvent{RunEvent: e}, + } } if wrappedEvent == nil { diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 1babe9d66..0e416d0cc 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v4.25.3 // source: protos/events.proto package pb @@ -819,6 +819,101 @@ func (x *Ev_IntegratedServiceEvent) GetPayload() string { return "" } +type Ev_RunEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + RunNumber uint32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Transition string `protobuf:"bytes,5,opt,name=transition,proto3" json:"transition,omitempty"` + TransitionStatus OpStatus `protobuf:"varint,6,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` + Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Ev_RunEvent) Reset() { + *x = Ev_RunEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_RunEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_RunEvent) ProtoMessage() {} + +func (x *Ev_RunEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_RunEvent.ProtoReflect.Descriptor instead. +func (*Ev_RunEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{9} +} + +func (x *Ev_RunEvent) GetEnvironmentId() string { + if x != nil { + return x.EnvironmentId + } + return "" +} + +func (x *Ev_RunEvent) GetRunNumber() uint32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *Ev_RunEvent) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Ev_RunEvent) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *Ev_RunEvent) GetTransition() string { + if x != nil { + return x.Transition + } + return "" +} + +func (x *Ev_RunEvent) GetTransitionStatus() OpStatus { + if x != nil { + return x.TransitionStatus + } + return OpStatus_NULL +} + +func (x *Ev_RunEvent) GetVars() map[string]string { + if x != nil { + return x.Vars + } + return nil +} + type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -832,6 +927,7 @@ type Event struct { // *Event_RoleEvent // *Event_CallEvent // *Event_IntegratedServiceEvent + // *Event_RunEvent // *Event_FrameworkEvent // *Event_MesosHeartbeatEvent // *Event_CoreStartEvent @@ -841,7 +937,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[9] + mi := &file_protos_events_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -854,7 +950,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[9] + mi := &file_protos_events_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -867,7 +963,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{9} + return file_protos_events_proto_rawDescGZIP(), []int{10} } func (x *Event) GetTimestamp() int64 { @@ -919,6 +1015,13 @@ func (x *Event) GetIntegratedServiceEvent() *Ev_IntegratedServiceEvent { return nil } +func (x *Event) GetRunEvent() *Ev_RunEvent { + if x, ok := x.GetPayload().(*Event_RunEvent); ok { + return x.RunEvent + } + return nil +} + func (x *Event) GetFrameworkEvent() *Ev_MetaEvent_FrameworkEvent { if x, ok := x.GetPayload().(*Event_FrameworkEvent); ok { return x.FrameworkEvent @@ -964,6 +1067,10 @@ type Event_IntegratedServiceEvent struct { IntegratedServiceEvent *Ev_IntegratedServiceEvent `protobuf:"bytes,15,opt,name=integratedServiceEvent,proto3,oneof"` } +type Event_RunEvent struct { + RunEvent *Ev_RunEvent `protobuf:"bytes,16,opt,name=runEvent,proto3,oneof"` +} + type Event_FrameworkEvent struct { FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,101,opt,name=frameworkEvent,proto3,oneof"` } @@ -986,6 +1093,8 @@ func (*Event_CallEvent) isEvent_Payload() {} func (*Event_IntegratedServiceEvent) isEvent_Payload() {} +func (*Event_RunEvent) isEvent_Payload() {} + func (*Event_FrameworkEvent) isEvent_Payload() {} func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} @@ -1103,59 +1212,83 @@ var file_protos_events_proto_rawDesc = []byte{ 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xf8, - 0x04, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc7, + 0x02, 0x0a, 0x0b, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, + 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, + 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, + 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, + 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, + 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x05, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, + 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, - 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, - 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, + 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, - 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, - 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, - 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, - 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, - 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, - 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x75, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, + 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, + 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, + 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, + 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, + 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, + 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, + 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, + 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, + 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, + 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1171,7 +1304,7 @@ func file_protos_events_proto_rawDescGZIP() []byte { } var file_protos_events_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 11) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_protos_events_proto_goTypes = []interface{}{ (OpStatus)(0), // 0: events.OpStatus (*Ev_MetaEvent_MesosHeartbeat)(nil), // 1: events.Ev_MetaEvent_MesosHeartbeat @@ -1183,30 +1316,35 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Ev_CallEvent)(nil), // 7: events.Ev_CallEvent (*Ev_RoleEvent)(nil), // 8: events.Ev_RoleEvent (*Ev_IntegratedServiceEvent)(nil), // 9: events.Ev_IntegratedServiceEvent - (*Event)(nil), // 10: events.Event - nil, // 11: events.Ev_EnvironmentEvent.VarsEntry + (*Ev_RunEvent)(nil), // 10: events.Ev_RunEvent + (*Event)(nil), // 11: events.Event + nil, // 12: events.Ev_EnvironmentEvent.VarsEntry + nil, // 13: events.Ev_RunEvent.VarsEntry } var file_protos_events_proto_depIdxs = []int32{ 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus - 11, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry + 12, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry 5, // 2: events.Ev_TaskEvent.traits:type_name -> events.Traits 0, // 3: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus 5, // 4: events.Ev_CallEvent.traits:type_name -> events.Traits 0, // 5: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus 0, // 6: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus - 4, // 7: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 6, // 8: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 8, // 9: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 7, // 10: events.Event.callEvent:type_name -> events.Ev_CallEvent - 9, // 11: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 3, // 12: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 1, // 13: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 2, // 14: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 15, // [15:15] is the sub-list for method output_type - 15, // [15:15] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 0, // 7: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus + 13, // 8: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry + 4, // 9: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 10: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 11: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 12: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 13: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 10, // 14: events.Event.runEvent:type_name -> events.Ev_RunEvent + 3, // 15: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 16: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 17: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1324,6 +1462,18 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_RunEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -1336,12 +1486,13 @@ func file_protos_events_proto_init() { } } } - file_protos_events_proto_msgTypes[9].OneofWrappers = []interface{}{ + file_protos_events_proto_msgTypes[10].OneofWrappers = []interface{}{ (*Event_EnvironmentEvent)(nil), (*Event_TaskEvent)(nil), (*Event_RoleEvent)(nil), (*Event_CallEvent)(nil), (*Event_IntegratedServiceEvent)(nil), + (*Event_RunEvent)(nil), (*Event_FrameworkEvent)(nil), (*Event_MesosHeartbeatEvent)(nil), (*Event_CoreStartEvent)(nil), @@ -1352,7 +1503,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 1, - NumMessages: 11, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index 8be3e4f4f..38270e8bf 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -112,10 +112,20 @@ message Ev_IntegratedServiceEvent { string payload = 8; // any additional payload, depending on the integrated service; there is no schema, it can even be the raw return structure of a remote API call } +message Ev_RunEvent { + string environmentId = 1; + uint32 runNumber = 2; + string state = 3; + string error = 4; + string transition = 5; + OpStatus transitionStatus = 6; + map vars = 7; +} + message Event { int64 timestamp = 1; reserved 2 to 10; - reserved 16 to 100; + reserved 17 to 100; oneof Payload { Ev_EnvironmentEvent environmentEvent = 11; @@ -123,6 +133,7 @@ message Event { Ev_RoleEvent roleEvent = 13; Ev_CallEvent callEvent = 14; Ev_IntegratedServiceEvent integratedServiceEvent = 15; + Ev_RunEvent runEvent = 16; Ev_MetaEvent_FrameworkEvent frameworkEvent = 101; Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 102; diff --git a/core/environment/environment.go b/core/environment/environment.go index 4af1f0a66..0c63aaa27 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -186,9 +186,20 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.workflow.GetVars().Set("run_number", rnString) env.workflow.GetVars().Set("runNumber", rnString) - runStartTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_start_time_ms", runStartTime) - env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous EOR + runStartTime := time.Now() + runStartTimeS := strconv.FormatInt(runStartTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_start_time_ms", runStartTimeS) + env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous SOEOR + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: runNumber, + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_STARTED, + Vars: nil, + }, runStartTime) cleanupCount := 0 cleanupCountS, ok := env.GlobalVars.Get("__fmq_cleanup_count") @@ -216,8 +227,21 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } else if e.Event == "STOP_ACTIVITY" { endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + runEndTime := time.Now() + runEndTimeS := strconv.FormatInt(runEndTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeS) + env.workflow.SetRuntimeVar("run_start_time_ms", "") // we delete previous SOSOR + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_STARTED, + Vars: nil, + }, runEndTime) + } else { log.WithField("partition", envId.String()). Debug("O2 End time already set before before_STOP_ACTIVITY") @@ -225,8 +249,21 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } else if e.Event == "GO_ERROR" { endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + runEndTime := time.Now() + runEndTimeS := strconv.FormatInt(runEndTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeS) + env.workflow.SetRuntimeVar("run_start_time_ms", "") // we delete previous SOSOR + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_STARTED, + Vars: nil, + }, runEndTime) + } else { log.WithField("partition", envId.String()). Debug("O2 End time already set before before_GO_ERROR") @@ -439,7 +476,49 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Infof("auto stop transition scheduled, expected execution at %s", expected) } + runStartCompletionTime := time.Now() + runStartCompletionTimeS := strconv.FormatInt(runStartCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_start_completion_time_ms", runStartCompletionTimeS) + env.workflow.SetRuntimeVar("run_end_completion_time_ms", "") // we delete previous EOEOR + + runEvent := &pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_DONE_OK, + Vars: nil, + } + if e.Err != nil { + runEvent.Error = e.Err.Error() + runEvent.TransitionStatus = pb.OpStatus_DONE_ERROR + } + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(runEvent, runStartCompletionTime) + } else if e.Event == "STOP_ACTIVITY" { + runEndCompletionTime := time.Now() + runEndCompletionTimeS := strconv.FormatInt(runEndCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_completion_time_ms", runEndCompletionTimeS) + env.workflow.SetRuntimeVar("run_start_completion_time_ms", "") // we delete previous EOSOR + + runEvent := &pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_DONE_OK, + Vars: nil, + } + if e.Err != nil { + runEvent.Error = e.Err.Error() + runEvent.TransitionStatus = pb.OpStatus_DONE_ERROR + } + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(runEvent, runEndCompletionTime) + // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) env.currentRunNumber = 0 diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index ee4229fb2..aab902bb2 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -26,6 +26,7 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/common/event" @@ -36,7 +37,7 @@ import ( func NewConfigureTransition(taskman *task.Manager) Transition { return &ConfigureTransition{ baseTransition: baseTransition{ - name: "CONFIGURE", + name: "CONFIGURE", taskman: taskman, }, } @@ -62,7 +63,7 @@ func (t ConfigureTransition) do(env *Environment) (err error) { } incomingEv := <-env.stateChangedCh // If some tasks failed to transition - if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { return tasksStateErrors } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index db47b3960..cb9d015be 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v4.25.3 // source: protos/o2control.proto package pb @@ -67,12 +67,14 @@ type Ev_TaskEvent = protos.Ev_TaskEvent type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent +type Ev_RunEvent = protos.Ev_RunEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent type Event_RoleEvent = protos.Event_RoleEvent type Event_CallEvent = protos.Event_CallEvent type Event_IntegratedServiceEvent = protos.Event_IntegratedServiceEvent +type Event_RunEvent = protos.Event_RunEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index d702dab58..e3430de84 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v4.25.3 // source: protos/o2control.proto package pb From 06dcf41b672110d4243f4f823a7ec18af394bbce Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 May 2024 16:29:06 +0200 Subject: [PATCH 1905/2352] [core] Ensure SOEOR/EOEOR events are pushed in case of kill --- core/environment/manager.go | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 9778dbc39..517027f87 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -483,12 +483,43 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error if env.CurrentState() == "RUNNING" { endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { - runEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTime) + runEndTime := time.Now() + runEndTimeS := strconv.FormatInt(runEndTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeS) + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&evpb.Ev_RunEvent{ + EnvironmentId: environmentId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: "TEARDOWN", + TransitionStatus: evpb.OpStatus_STARTED, + Vars: nil, + }, runEndTime) } else { log.WithField("partition", environmentId.String()). Debug("O2 End time already set before DESTROY") } + + endCompletionTime, ok := env.workflow.GetUserVars().Get("run_end_completion_time_ms") + if ok && endCompletionTime == "" { + runEndCompletionTime := time.Now() + runEndCompletionTimeS := strconv.FormatInt(runEndCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_completion_time_ms", runEndCompletionTimeS) + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&evpb.Ev_RunEvent{ + EnvironmentId: environmentId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: "TEARDOWN", + TransitionStatus: evpb.OpStatus_STARTED, + Vars: nil, + }, runEndCompletionTime) + } else { + log.WithField("partition", environmentId.String()). + Debug("O2 End Completion time already set before DESTROY") + } } tasksToRelease := env.Workflow().GetTasks() From 026ed69e967b23d3357f16f40644544ff3ad88cb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 May 2024 16:29:49 +0200 Subject: [PATCH 1906/2352] [core] Push run_end_time_ms at EOR both camelCase and snake_case --- core/environment/transition_stopactivity.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index a93a12ed3..beac1de34 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -66,6 +66,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { // Propagate run end time to all tasks if value, ok := cvs["run_end_time_ms"]; ok { args[strcase.ToLowerCamel("run_end_time_ms")] = value + args["run_end_time_ms"] = value } } } From b17750dff8230d2a26b08f5ee40b34bb140b85d9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 22 May 2024 16:30:25 +0200 Subject: [PATCH 1907/2352] [core] Clear all old run timestamps on SOSOR --- core/environment/environment.go | 4 +++- core/environment/transition_startactivity.go | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 0c63aaa27..ac661dc4b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -189,7 +189,9 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, runStartTime := time.Now() runStartTimeS := strconv.FormatInt(runStartTime.UnixMilli(), 10) env.workflow.SetRuntimeVar("run_start_time_ms", runStartTimeS) - env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous SOEOR + env.workflow.SetRuntimeVar("run_start_completion_time_ms", "") // we delete previous EOSOR + env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous SOEOR + env.workflow.SetRuntimeVar("run_end_completion_time_ms", "") // we delete previous EOEOR the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ EnvironmentId: envId.String(), diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 853518f6e..cd9d6a52b 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -89,6 +89,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "fill_info_stable_beam_end_ms", "run_type", "run_start_time_ms", + "run_end_time_ms", // included to ensure that a cleared SOEOR timestamp is propagated to all tasks during START-STOP-START "lhc_period", } { if value, ok := cvs[key]; ok { From f1aa939b037d594e96d54ce4a0df78ad48fc4cc4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 23 May 2024 10:53:41 +0200 Subject: [PATCH 1908/2352] [core] Clarify timestamp variables naming --- core/environment/environment.go | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index ac661dc4b..997a44576 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -187,8 +187,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.workflow.GetVars().Set("runNumber", rnString) runStartTime := time.Now() - runStartTimeS := strconv.FormatInt(runStartTime.UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_start_time_ms", runStartTimeS) + runStartTimeStr := strconv.FormatInt(runStartTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_start_time_ms", runStartTimeStr) env.workflow.SetRuntimeVar("run_start_completion_time_ms", "") // we delete previous EOSOR env.workflow.SetRuntimeVar("run_end_time_ms", "") // we delete previous SOEOR env.workflow.SetRuntimeVar("run_end_completion_time_ms", "") // we delete previous EOEOR @@ -230,9 +230,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { runEndTime := time.Now() - runEndTimeS := strconv.FormatInt(runEndTime.UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeS) - env.workflow.SetRuntimeVar("run_start_time_ms", "") // we delete previous SOSOR + runEndTimeStr := strconv.FormatInt(runEndTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeStr) the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ EnvironmentId: envId.String(), @@ -252,9 +251,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") if ok && endTime == "" { runEndTime := time.Now() - runEndTimeS := strconv.FormatInt(runEndTime.UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeS) - env.workflow.SetRuntimeVar("run_start_time_ms", "") // we delete previous SOSOR + runEndTimeStr := strconv.FormatInt(runEndTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_time_ms", runEndTimeStr) the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ EnvironmentId: envId.String(), @@ -479,9 +477,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } runStartCompletionTime := time.Now() - runStartCompletionTimeS := strconv.FormatInt(runStartCompletionTime.UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_start_completion_time_ms", runStartCompletionTimeS) - env.workflow.SetRuntimeVar("run_end_completion_time_ms", "") // we delete previous EOEOR + runStartCompletionTimeStr := strconv.FormatInt(runStartCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_start_completion_time_ms", runStartCompletionTimeStr) runEvent := &pb.Ev_RunEvent{ EnvironmentId: envId.String(), @@ -501,9 +498,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } else if e.Event == "STOP_ACTIVITY" { runEndCompletionTime := time.Now() - runEndCompletionTimeS := strconv.FormatInt(runEndCompletionTime.UnixMilli(), 10) - env.workflow.SetRuntimeVar("run_end_completion_time_ms", runEndCompletionTimeS) - env.workflow.SetRuntimeVar("run_start_completion_time_ms", "") // we delete previous EOSOR + runEndCompletionTimeStr := strconv.FormatInt(runEndCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_completion_time_ms", runEndCompletionTimeStr) runEvent := &pb.Ev_RunEvent{ EnvironmentId: envId.String(), From e6c087a8a522ad0974ff56d32a87e3403d649dd6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 23 May 2024 11:22:09 +0200 Subject: [PATCH 1909/2352] [build] Bump to v1.11.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 790d64746..5a25c261d 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 10 +VERSION_MINOR := 11 VERSION_PATCH := 0 From 8f0d0ad0a5993ebf3f4cf3cd906072849ec71b12 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 27 May 2024 16:07:25 +0200 Subject: [PATCH 1910/2352] [core] Emit environment events for Teardown and AutoEnv --- coconut/protos/o2control.pb.go | 1195 ++++++++++++++++---------------- core/environment/manager.go | 167 ++++- core/protos/o2control.pb.go | 1195 ++++++++++++++++---------------- core/protos/o2control.proto | 1 + core/server.go | 4 +- 5 files changed, 1375 insertions(+), 1187 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index cb9d015be..18374af8f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -997,6 +997,7 @@ type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` + AutoTransition bool `protobuf:"varint,4,opt,name=autoTransition,proto3" json:"autoTransition,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1052,6 +1053,13 @@ func (x *NewEnvironmentRequest) GetPublic() bool { return false } +func (x *NewEnvironmentRequest) GetAutoTransition() bool { + if x != nil { + return x.AutoTransition + } + return false +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4324,7 +4332,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0xfc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, @@ -4333,607 +4341,610 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, - 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, - 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, - 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, - 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, - 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, + 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, - 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, - 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, - 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, + 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, + 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, + 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, + 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, + 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, + 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, + 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, + 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, + 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, + 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, - 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, - 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, - 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, - 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, - 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, - 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, - 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, - 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, - 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, - 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, - 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, - 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, - 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, + 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, + 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/environment/manager.go b/core/environment/manager.go index 517027f87..e6b4ea089 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -216,7 +216,7 @@ func (envs *Manager) GetActiveDetectors() system.IDMap { return response } -func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string, public bool, newId uid.ID) (uid.ID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string, public bool, newId uid.ID, autoTransition bool) (uid.ID, error) { // Before we load the workflow, we get the list of currently active detectors. This query must be performed before // loading the workflow in order to compare the currently used detectors with the detectors required by the newly // created environment. @@ -406,6 +406,111 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // CONFIGURE transition successful! env.subscribeToWfState(envs.taskman) + if autoTransition { + // We now return the configured environment from CreateEnvironment, but if autoTransition is set to true + // then the auto-transitioner starts here. + // Sequence: + // * CONFIGURED×START_ACTIVITY→RUNNING + // * wait for RUNNING to finish as required by tasks (RUNNING×STOP_ACTIVITY→CONFIGURED) + // * safe DESTROY path + go func() { + defer env.unsubscribeFromWfState() + + goErrorKillDestroy := func(op string) { + envState := env.CurrentState() + log.WithField("state", envState). + WithField("environment", env.Id().String()). + WithError(err). + Warnf("auto-transitioning environment failed %s, cleanup in progress", op) + + err := env.TryTransition(NewGoErrorTransition( + envs.taskman), + ) + if err != nil { + log.WithField("partition", env.Id().String()). + WithField("state", envState). + Debug("could not transition failed auto-transitioning environment to ERROR, cleanup in progress") + env.setState("ERROR") + } + + envTasks := env.Workflow().GetTasks() + // TeardownEnvironment manages the envs.mu internally + _ = envs.TeardownEnvironment(env.Id(), true /*force*/) + + killedTasks, _, rlsErr := envs.taskman.KillTasks(envTasks.GetTaskIds()) + if rlsErr != nil { + log.WithError(rlsErr).Warn("task teardown error") + } + log.WithFields(logrus.Fields{ + "killedCount": len(killedTasks), + "lastEnvState": envState, + "level": infologger.IL_Support, + "partition": env.Id().String(), + }). + Infof("auto-environment failed at %s, tasks were cleaned up", op) + log.WithField("partition", env.Id().String()).Info("environment teardown complete") + } + + // now we have the environment we should transition to start + trans := NewStartActivityTransition(envs.taskman) + if trans == nil { + goErrorKillDestroy("transition START_ACTIVITY") + return + } + + err = env.TryTransition(trans) + if err != nil { + goErrorKillDestroy("transition START_ACTIVITY") + return + } + + for { + // we know we performed START_ACTIVITY, so we poll at 1Hz for the run to finish + time.Sleep(1 * time.Second) + + if env == nil { + // must've died during the loop + return + } + + envState := env.CurrentState() + switch envState { + case "CONFIGURED": + // RUN finished so we can reset and delete the environment + err = env.TryTransition(NewResetTransition(envs.taskman)) + if err != nil { + goErrorKillDestroy("transition RESET") + return + } + + err = envs.TeardownEnvironment(env.id, false) + if err != nil { + goErrorKillDestroy("teardown") + return + } + tasksForEnv := env.Workflow().GetTasks().GetTaskIds() + _, _, err = envs.taskman.KillTasks(tasksForEnv) + if err != nil { + return + } + + return + case "ERROR": + fallthrough + case "STANDBY": + fallthrough + case "DEPLOYED": + goErrorKillDestroy("transition STOP_ACTIVITY") + return + case "MIXED": + continue + case "": + continue + } + } + }() + } + return env.id, err } @@ -469,10 +574,26 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "before_DESTROY", + Message: "workflow teardown started", + }) + env.Mu.Lock() env.currentTransition = "DESTROY" env.Mu.Unlock() + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "leave_" + env.CurrentState(), + Message: "workflow teardown ongoing", + }) + err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) if err != nil { log.WithFields(logrus.Fields{ @@ -549,6 +670,14 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "DESTROY", + Message: "releasing tasks", + }) + log.WithField("method", "TeardownEnvironment"). WithField("level", infologger.IL_Devel). Debug("envman write lock") @@ -606,9 +735,27 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } err = fmt.Errorf("%d tasks failed to release for environment %s", len(taskReleaseErrors), environmentId) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + }) + return err } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "running DESTROY hooks", + }) + // we trigger all cleanup hooks, first calls, then tasks immediately after for _, weight := range allWeights { hooksForWeight, ok := hooksMapForDestroy[weight] @@ -666,6 +813,16 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } err = fmt.Errorf("%d tasks failed to release for environment %s", len(taskReleaseErrors), environmentId) + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + }) + return err } @@ -682,6 +839,14 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error WithField("level", infologger.IL_Devel). Debug("envman write lock") + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown complete", + }) + return err } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index cb9d015be..18374af8f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -997,6 +997,7 @@ type NewEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` + AutoTransition bool `protobuf:"varint,4,opt,name=autoTransition,proto3" json:"autoTransition,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1052,6 +1053,13 @@ func (x *NewEnvironmentRequest) GetPublic() bool { return false } +func (x *NewEnvironmentRequest) GetAutoTransition() bool { + if x != nil { + return x.AutoTransition + } + return false +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4324,7 +4332,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd4, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0xfc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, @@ -4333,607 +4341,610 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x1a, 0x37, 0x0a, - 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, - 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, - 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, - 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, - 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, - 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, - 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, - 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, + 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, - 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, - 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, - 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, - 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, - 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, - 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, - 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, - 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, - 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, - 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, - 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, - 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, - 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, + 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, + 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, + 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, + 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, + 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, + 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, + 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, + 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, + 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, + 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, + 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, + 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, + 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, + 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, + 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, + 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, + 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, + 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, + 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, + 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, + 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, - 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, - 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, - 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, + 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, + 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, + 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, + 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, + 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, + 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, + 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, + 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, + 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, + 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, + 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, + 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, - 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, + 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, + 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, + 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, + 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, + 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, + 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, + 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, + 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, + 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, + 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, - 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, - 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, - 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, - 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, - 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, - 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, - 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, - 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, - 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, - 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, - 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, - 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, - 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, - 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, - 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, + 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, + 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, - 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, - 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, - 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, - 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, + 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, - 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, + 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, + 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, + 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, + 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, - 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, - 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, - 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 8d085ed88..c626530c0 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -144,6 +144,7 @@ message NewEnvironmentRequest { string workflowTemplate = 1; map vars = 2; bool public = 3; + bool autoTransition = 4; } message NewEnvironmentReply { EnvironmentInfo environment = 1; diff --git a/core/server.go b/core/server.go index 0b63741f4..55343e8d3 100644 --- a/core/server.go +++ b/core/server.go @@ -296,7 +296,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEnvironmentRequest, id uid.ID) { var err error - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id) + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id, request.GetAutoTransition()) if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: id.String(), @@ -378,7 +378,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme // Create new Environment instance with some roles, we get back a UUID id := uid.New() - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id) + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id, request.GetAutoTransition()) if err != nil { st := status.Newf(codes.Internal, "cannot create new environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ From 1ae0fc5fbb836c0d357423a2f049e5919e4c3f24 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 23 May 2024 17:00:51 +0200 Subject: [PATCH 1911/2352] OCTRL-893 [core] always log why the environment goes into ERROR A bunch of easy improvements to better know why an environment goes into error: - whenever a task goes to error, it is logged - whenever we create a new error transition, we log what led us to it --- core/environment/environment.go | 3 +++ core/server.go | 4 ++++ core/workflow/callrole.go | 8 ++++++++ core/workflow/taskrole.go | 8 ++++++++ 4 files changed, 23 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 997a44576..25127d596 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1029,6 +1029,9 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { handlingError = true time.AfterFunc(500*time.Millisecond, func() { // wait 0.5s for any other tasks to go to ERROR/INACTIVE + log.WithField("partition", env.id). + WithField("level", infologger.IL_Ops). + Warn("one of the critical tasks went into ERROR state, transitioning the environment into ERROR") err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { log.WithField("partition", env.id). diff --git a/core/server.go b/core/server.go index 55343e8d3..786cf6d27 100644 --- a/core/server.go +++ b/core/server.go @@ -586,6 +586,10 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir td := eot.Sub(sot) if err != nil { + log.WithField("partition", env.Id()). + WithField("level", infologger.IL_Ops). + WithError(err). + Errorf("transition '%s' failed, transitioning into ERROR.", req.GetType().String()) err = env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) if err != nil { log.WithField("partition", env.Id()).Warnf("could not complete requested GO_ERROR transition, forcing move to ERROR: %s", err.Error()) diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 4070fb7f5..f5af8d4f8 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/logger/infologger" "strings" texttemplate "text/template" "time" @@ -249,6 +250,13 @@ func (t *callRole) updateState(s task.State) { RolePath: t.GetPath(), EnvironmentId: t.GetEnvironmentId().String(), }) + if t.state.get() == task.ERROR { + log.WithField("partition", t.GetEnvironmentId().String()). + WithField("level", infologger.IL_Support). + WithField("role", t.Name). + WithField("critical", t.Critical). + Error("call went into ERROR") + } } t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index ceac8687f..b007d938e 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/logger/infologger" "strings" texttemplate "text/template" "time" @@ -253,6 +254,13 @@ func (t *taskRole) updateState(s task.State) { RolePath: t.GetPath(), EnvironmentId: t.GetEnvironmentId().String(), }) + if t.state.get() == task.ERROR { + log.WithField("partition", t.GetEnvironmentId().String()). + WithField("level", infologger.IL_Support). + WithField("role", t.Name). + WithField("critical", t.Critical). + Error("task went into ERROR") + } } t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) From 9c7f0b03e440d1ddaf6cfa3879649bf9b9a72504 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 24 May 2024 10:50:50 +0200 Subject: [PATCH 1912/2352] OCTRL-894 [core] a FINISHED/DONE task should have INACTIVE status --- core/task/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index 881214787..fbe527773 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1002,7 +1002,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateStatus(ACTIVE) } - case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR: + case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR, mesos.TASK_FINISHED: taskPtr.status = INACTIVE if taskPtr.GetParent() != nil { From 3574f87f1b9115b78837a2f06b31e2c1fa315a70 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 28 May 2024 17:28:09 +0200 Subject: [PATCH 1913/2352] [core] Remove TaskClassInfo and add critical trait to ShortTaskInfo --- coconut/protos/o2control.pb.go | 1405 +++++++++++++++----------------- core/protos/o2control.pb.go | 1405 +++++++++++++++----------------- core/protos/o2control.proto | 7 +- core/server.go | 6 +- core/serverutil.go | 1 + 5 files changed, 1334 insertions(+), 1490 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 18374af8f..8c846cff1 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -247,7 +247,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{43, 0} } type VarSpecMessage_Type int32 @@ -302,7 +302,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{43, 1} } type SubscribeRequest struct { @@ -2099,6 +2099,7 @@ type ShortTaskInfo struct { Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` Claimable bool `protobuf:"varint,10,opt,name=claimable,proto3" json:"claimable,omitempty"` + Critical bool `protobuf:"varint,11,opt,name=critical,proto3" json:"critical,omitempty"` } func (x *ShortTaskInfo) Reset() { @@ -2203,6 +2204,13 @@ func (x *ShortTaskInfo) GetClaimable() bool { return false } +func (x *ShortTaskInfo) GetCritical() bool { + if x != nil { + return x.Critical + } + return false +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2453,61 +2461,6 @@ func (x *GetTaskReply) GetTask() *TaskInfo { return nil } -type TaskClassInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` -} - -func (x *TaskClassInfo) Reset() { - *x = TaskClassInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TaskClassInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TaskClassInfo) ProtoMessage() {} - -func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} -} - -func (x *TaskClassInfo) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *TaskClassInfo) GetControlMode() string { - if x != nil { - return x.ControlMode - } - return "" -} - type CommandInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2523,7 +2476,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2536,7 +2489,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2549,7 +2502,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *CommandInfo) GetEnv() []string { @@ -2600,7 +2553,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2613,7 +2566,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2626,7 +2579,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *ChannelInfo) GetName() string { @@ -2656,7 +2609,6 @@ type TaskInfo struct { unknownFields protoimpl.UnknownFields ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` @@ -2668,7 +2620,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2681,7 +2633,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2694,7 +2646,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -2704,13 +2656,6 @@ func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { return nil } -func (x *TaskInfo) GetClassInfo() *TaskClassInfo { - if x != nil { - return x.ClassInfo - } - return nil -} - func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { if x != nil { return x.InboundChannels @@ -2764,7 +2709,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2777,7 +2722,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2790,7 +2735,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -2812,7 +2757,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2825,7 +2770,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2838,7 +2783,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -2870,7 +2815,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2883,7 +2828,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2896,7 +2841,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetRolesRequest) GetEnvId() string { @@ -2934,7 +2879,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2947,7 +2892,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2960,7 +2905,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *RoleInfo) GetName() string { @@ -3051,7 +2996,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3064,7 +3009,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3077,7 +3022,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3102,7 +3047,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3115,7 +3060,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3128,7 +3073,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3186,7 +3131,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3199,7 +3144,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3212,7 +3157,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3300,7 +3245,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3313,7 +3258,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3326,7 +3271,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3375,7 +3320,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3388,7 +3333,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3401,7 +3346,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3422,7 +3367,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3435,7 +3380,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3448,7 +3393,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3472,7 +3417,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3485,7 +3430,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3498,7 +3443,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *RepoInfo) GetName() string { @@ -3541,7 +3486,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3554,7 +3499,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3567,7 +3512,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3596,7 +3541,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3609,7 +3554,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3622,7 +3567,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *AddRepoRequest) GetName() string { @@ -3651,7 +3596,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3664,7 +3609,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3677,7 +3622,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3705,7 +3650,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3718,7 +3663,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3731,7 +3676,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3752,7 +3697,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3765,7 +3710,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3778,7 +3723,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3799,7 +3744,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3812,7 +3757,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3825,7 +3770,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -3846,7 +3791,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3859,7 +3804,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3872,7 +3817,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -3893,7 +3838,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3906,7 +3851,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3919,7 +3864,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -3941,7 +3886,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3954,7 +3899,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3967,7 +3912,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -3995,7 +3940,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4008,7 +3953,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4021,7 +3966,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4040,7 +3985,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4053,7 +3998,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,7 +4011,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } type ListIntegratedServicesReply struct { @@ -4080,7 +4025,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4093,7 +4038,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4106,7 +4051,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4131,7 +4076,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4144,7 +4089,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4157,7 +4102,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *IntegratedServiceInfo) GetName() string { @@ -4499,7 +4444,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, @@ -4519,432 +4464,426 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, - 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, - 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, - 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, - 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, - 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, + 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, + 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, + 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, + 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, + 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, + 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, - 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, - 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4960,7 +4899,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_protos_o2control_proto_goTypes = []interface{}{ (ControlEnvironmentRequest_Optype)(0), // 0: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 1: o2control.EnvironmentOperation.Optype @@ -5000,153 +4939,151 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*GetTasksReply)(nil), // 35: o2control.GetTasksReply (*GetTaskRequest)(nil), // 36: o2control.GetTaskRequest (*GetTaskReply)(nil), // 37: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 38: o2control.TaskClassInfo - (*CommandInfo)(nil), // 39: o2control.CommandInfo - (*ChannelInfo)(nil), // 40: o2control.ChannelInfo - (*TaskInfo)(nil), // 41: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 42: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 43: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 44: o2control.GetRolesRequest - (*RoleInfo)(nil), // 45: o2control.RoleInfo - (*GetRolesReply)(nil), // 46: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 47: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 48: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 49: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 50: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 51: o2control.ListReposRequest - (*RepoInfo)(nil), // 52: o2control.RepoInfo - (*ListReposReply)(nil), // 53: o2control.ListReposReply - (*AddRepoRequest)(nil), // 54: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 55: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 56: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 57: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 58: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 59: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 60: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 61: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 62: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 63: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 64: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 65: o2control.IntegratedServiceInfo - nil, // 66: o2control.EnvironmentInfo.DefaultsEntry - nil, // 67: o2control.EnvironmentInfo.VarsEntry - nil, // 68: o2control.EnvironmentInfo.UserVarsEntry - nil, // 69: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 70: o2control.NewEnvironmentRequest.VarsEntry - nil, // 71: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 72: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 73: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 74: o2control.TaskInfo.PropertiesEntry - nil, // 75: o2control.RoleInfo.DefaultsEntry - nil, // 76: o2control.RoleInfo.VarsEntry - nil, // 77: o2control.RoleInfo.UserVarsEntry - nil, // 78: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 79: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 80: o2control.ListIntegratedServicesReply.ServicesEntry - (*protos.Event)(nil), // 81: events.Event + (*CommandInfo)(nil), // 38: o2control.CommandInfo + (*ChannelInfo)(nil), // 39: o2control.ChannelInfo + (*TaskInfo)(nil), // 40: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 41: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 42: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 43: o2control.GetRolesRequest + (*RoleInfo)(nil), // 44: o2control.RoleInfo + (*GetRolesReply)(nil), // 45: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 46: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 47: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 48: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 49: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 50: o2control.ListReposRequest + (*RepoInfo)(nil), // 51: o2control.RepoInfo + (*ListReposReply)(nil), // 52: o2control.ListReposReply + (*AddRepoRequest)(nil), // 53: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 54: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 55: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 56: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 57: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 58: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 59: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 60: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 61: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 62: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 63: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 64: o2control.IntegratedServiceInfo + nil, // 65: o2control.EnvironmentInfo.DefaultsEntry + nil, // 66: o2control.EnvironmentInfo.VarsEntry + nil, // 67: o2control.EnvironmentInfo.UserVarsEntry + nil, // 68: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 69: o2control.NewEnvironmentRequest.VarsEntry + nil, // 70: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 71: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 72: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 73: o2control.TaskInfo.PropertiesEntry + nil, // 74: o2control.RoleInfo.DefaultsEntry + nil, // 75: o2control.RoleInfo.VarsEntry + nil, // 76: o2control.RoleInfo.UserVarsEntry + nil, // 77: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 78: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 79: o2control.ListIntegratedServicesReply.ServicesEntry + (*protos.Event)(nil), // 80: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 12, // 1: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo 32, // 2: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 66, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 67, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 68, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 69, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 70, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 65, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 66, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 67, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 68, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 69, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 71, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 70, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 45, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 44, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 43, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 72, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 73, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 71, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 72, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 41, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 38, // 23: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 40, // 24: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 40, // 25: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 39, // 26: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 74, // 27: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 32, // 28: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 32, // 29: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 45, // 30: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 75, // 31: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 76, // 32: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 77, // 33: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 78, // 34: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 45, // 35: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 3, // 36: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 2, // 37: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 79, // 38: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 49, // 39: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 52, // 40: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 80, // 41: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 48, // 42: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 65, // 43: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 5, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 10, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 15, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 13, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 17, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 19, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 24, // 50: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 63, // 51: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 63, // 52: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 13, // 53: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest - 34, // 54: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 36, // 55: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 42, // 56: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 44, // 57: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 47, // 58: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 51, // 59: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 54, // 60: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 56, // 61: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 58, // 62: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 59, // 63: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 60, // 64: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 61, // 65: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 4, // 66: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 63, // 67: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 68: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 21, // 69: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 7, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 11, // 71: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 16, // 72: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 14, // 73: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 18, // 74: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 20, // 75: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 25, // 76: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 26, // 77: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 27, // 78: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 14, // 79: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply - 35, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 37, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 43, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 46, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 50, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 53, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 55, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 57, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 63, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 63, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 63, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 62, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 81, // 92: o2control.Control.Subscribe:output_type -> events.Event - 64, // 93: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 9, // 94: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 23, // 95: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 70, // [70:96] is the sub-list for method output_type - 44, // [44:70] is the sub-list for method input_type - 44, // [44:44] is the sub-list for extension type_name - 44, // [44:44] is the sub-list for extension extendee - 0, // [0:44] is the sub-list for field type_name + 39, // 23: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 39, // 24: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 38, // 25: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 73, // 26: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 27: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 28: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 44, // 29: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 74, // 30: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 75, // 31: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 76, // 32: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 77, // 33: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 44, // 34: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 35: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 36: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 78, // 37: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 48, // 38: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 51, // 39: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 79, // 40: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 47, // 41: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 64, // 42: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 44: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 45: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 46: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 47: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 48: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 49: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 62, // 50: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 62, // 51: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 52: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 41, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 43, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 46, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 50, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 53, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 55, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 57, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 58, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 59, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 60, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 62, // 66: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 67: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 68: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 69: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 70: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 71: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 72: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 73: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 74: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 76: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 77: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 78: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 42, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 45, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 49, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 52, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 54, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 56, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 62, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 62, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 62, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 61, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 80, // 91: o2control.Control.Subscribe:output_type -> events.Event + 63, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 93: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 94: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 69, // [69:95] is the sub-list for method output_type + 43, // [43:69] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5564,18 +5501,6 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -5587,7 +5512,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -5599,7 +5524,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -5611,7 +5536,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -5623,7 +5548,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -5635,7 +5560,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -5647,7 +5572,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -5659,7 +5584,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -5671,7 +5596,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -5683,7 +5608,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VarSpecMessage); i { case 0: return &v.state @@ -5695,7 +5620,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -5707,7 +5632,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -5719,7 +5644,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -5731,7 +5656,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -5743,7 +5668,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -5755,7 +5680,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -5767,7 +5692,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -5779,7 +5704,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -5791,7 +5716,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -5803,7 +5728,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -5815,7 +5740,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -5827,7 +5752,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -5839,7 +5764,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -5851,7 +5776,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -5863,7 +5788,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -5875,7 +5800,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListIntegratedServicesReply); i { case 0: return &v.state @@ -5887,7 +5812,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -5906,7 +5831,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 4, - NumMessages: 77, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 18374af8f..8c846cff1 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -247,7 +247,7 @@ func (x VarSpecMessage_UiWidget) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_UiWidget.Descriptor instead. func (VarSpecMessage_UiWidget) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44, 0} + return file_protos_o2control_proto_rawDescGZIP(), []int{43, 0} } type VarSpecMessage_Type int32 @@ -302,7 +302,7 @@ func (x VarSpecMessage_Type) Number() protoreflect.EnumNumber { // Deprecated: Use VarSpecMessage_Type.Descriptor instead. func (VarSpecMessage_Type) EnumDescriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44, 1} + return file_protos_o2control_proto_rawDescGZIP(), []int{43, 1} } type SubscribeRequest struct { @@ -2099,6 +2099,7 @@ type ShortTaskInfo struct { Pid string `protobuf:"bytes,8,opt,name=pid,proto3" json:"pid,omitempty"` SandboxStdout string `protobuf:"bytes,9,opt,name=sandboxStdout,proto3" json:"sandboxStdout,omitempty"` Claimable bool `protobuf:"varint,10,opt,name=claimable,proto3" json:"claimable,omitempty"` + Critical bool `protobuf:"varint,11,opt,name=critical,proto3" json:"critical,omitempty"` } func (x *ShortTaskInfo) Reset() { @@ -2203,6 +2204,13 @@ func (x *ShortTaskInfo) GetClaimable() bool { return false } +func (x *ShortTaskInfo) GetCritical() bool { + if x != nil { + return x.Critical + } + return false +} + type TaskDeploymentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2453,61 +2461,6 @@ func (x *GetTaskReply) GetTask() *TaskInfo { return nil } -type TaskClassInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - ControlMode string `protobuf:"bytes,2,opt,name=controlMode,proto3" json:"controlMode,omitempty"` -} - -func (x *TaskClassInfo) Reset() { - *x = TaskClassInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *TaskClassInfo) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*TaskClassInfo) ProtoMessage() {} - -func (x *TaskClassInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use TaskClassInfo.ProtoReflect.Descriptor instead. -func (*TaskClassInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{34} -} - -func (x *TaskClassInfo) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *TaskClassInfo) GetControlMode() string { - if x != nil { - return x.ControlMode - } - return "" -} - type CommandInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2523,7 +2476,7 @@ type CommandInfo struct { func (x *CommandInfo) Reset() { *x = CommandInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2536,7 +2489,7 @@ func (x *CommandInfo) String() string { func (*CommandInfo) ProtoMessage() {} func (x *CommandInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[35] + mi := &file_protos_o2control_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2549,7 +2502,7 @@ func (x *CommandInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CommandInfo.ProtoReflect.Descriptor instead. func (*CommandInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{35} + return file_protos_o2control_proto_rawDescGZIP(), []int{34} } func (x *CommandInfo) GetEnv() []string { @@ -2600,7 +2553,7 @@ type ChannelInfo struct { func (x *ChannelInfo) Reset() { *x = ChannelInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2613,7 +2566,7 @@ func (x *ChannelInfo) String() string { func (*ChannelInfo) ProtoMessage() {} func (x *ChannelInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[36] + mi := &file_protos_o2control_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2626,7 +2579,7 @@ func (x *ChannelInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ChannelInfo.ProtoReflect.Descriptor instead. func (*ChannelInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{36} + return file_protos_o2control_proto_rawDescGZIP(), []int{35} } func (x *ChannelInfo) GetName() string { @@ -2656,7 +2609,6 @@ type TaskInfo struct { unknownFields protoimpl.UnknownFields ShortInfo *ShortTaskInfo `protobuf:"bytes,1,opt,name=shortInfo,proto3" json:"shortInfo,omitempty"` - ClassInfo *TaskClassInfo `protobuf:"bytes,2,opt,name=classInfo,proto3" json:"classInfo,omitempty"` InboundChannels []*ChannelInfo `protobuf:"bytes,3,rep,name=inboundChannels,proto3" json:"inboundChannels,omitempty"` OutboundChannels []*ChannelInfo `protobuf:"bytes,4,rep,name=outboundChannels,proto3" json:"outboundChannels,omitempty"` CommandInfo *CommandInfo `protobuf:"bytes,5,opt,name=commandInfo,proto3" json:"commandInfo,omitempty"` @@ -2668,7 +2620,7 @@ type TaskInfo struct { func (x *TaskInfo) Reset() { *x = TaskInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2681,7 +2633,7 @@ func (x *TaskInfo) String() string { func (*TaskInfo) ProtoMessage() {} func (x *TaskInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[37] + mi := &file_protos_o2control_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2694,7 +2646,7 @@ func (x *TaskInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use TaskInfo.ProtoReflect.Descriptor instead. func (*TaskInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{37} + return file_protos_o2control_proto_rawDescGZIP(), []int{36} } func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { @@ -2704,13 +2656,6 @@ func (x *TaskInfo) GetShortInfo() *ShortTaskInfo { return nil } -func (x *TaskInfo) GetClassInfo() *TaskClassInfo { - if x != nil { - return x.ClassInfo - } - return nil -} - func (x *TaskInfo) GetInboundChannels() []*ChannelInfo { if x != nil { return x.InboundChannels @@ -2764,7 +2709,7 @@ type CleanupTasksRequest struct { func (x *CleanupTasksRequest) Reset() { *x = CleanupTasksRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2777,7 +2722,7 @@ func (x *CleanupTasksRequest) String() string { func (*CleanupTasksRequest) ProtoMessage() {} func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[38] + mi := &file_protos_o2control_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2790,7 +2735,7 @@ func (x *CleanupTasksRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksRequest.ProtoReflect.Descriptor instead. func (*CleanupTasksRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{38} + return file_protos_o2control_proto_rawDescGZIP(), []int{37} } func (x *CleanupTasksRequest) GetTaskIds() []string { @@ -2812,7 +2757,7 @@ type CleanupTasksReply struct { func (x *CleanupTasksReply) Reset() { *x = CleanupTasksReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2825,7 +2770,7 @@ func (x *CleanupTasksReply) String() string { func (*CleanupTasksReply) ProtoMessage() {} func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[39] + mi := &file_protos_o2control_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2838,7 +2783,7 @@ func (x *CleanupTasksReply) ProtoReflect() protoreflect.Message { // Deprecated: Use CleanupTasksReply.ProtoReflect.Descriptor instead. func (*CleanupTasksReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{39} + return file_protos_o2control_proto_rawDescGZIP(), []int{38} } func (x *CleanupTasksReply) GetKilledTasks() []*ShortTaskInfo { @@ -2870,7 +2815,7 @@ type GetRolesRequest struct { func (x *GetRolesRequest) Reset() { *x = GetRolesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2883,7 +2828,7 @@ func (x *GetRolesRequest) String() string { func (*GetRolesRequest) ProtoMessage() {} func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[40] + mi := &file_protos_o2control_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2896,7 +2841,7 @@ func (x *GetRolesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesRequest.ProtoReflect.Descriptor instead. func (*GetRolesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{40} + return file_protos_o2control_proto_rawDescGZIP(), []int{39} } func (x *GetRolesRequest) GetEnvId() string { @@ -2934,7 +2879,7 @@ type RoleInfo struct { func (x *RoleInfo) Reset() { *x = RoleInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2947,7 +2892,7 @@ func (x *RoleInfo) String() string { func (*RoleInfo) ProtoMessage() {} func (x *RoleInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[41] + mi := &file_protos_o2control_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2960,7 +2905,7 @@ func (x *RoleInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RoleInfo.ProtoReflect.Descriptor instead. func (*RoleInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{41} + return file_protos_o2control_proto_rawDescGZIP(), []int{40} } func (x *RoleInfo) GetName() string { @@ -3051,7 +2996,7 @@ type GetRolesReply struct { func (x *GetRolesReply) Reset() { *x = GetRolesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3064,7 +3009,7 @@ func (x *GetRolesReply) String() string { func (*GetRolesReply) ProtoMessage() {} func (x *GetRolesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[42] + mi := &file_protos_o2control_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3077,7 +3022,7 @@ func (x *GetRolesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRolesReply.ProtoReflect.Descriptor instead. func (*GetRolesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{42} + return file_protos_o2control_proto_rawDescGZIP(), []int{41} } func (x *GetRolesReply) GetRoles() []*RoleInfo { @@ -3102,7 +3047,7 @@ type GetWorkflowTemplatesRequest struct { func (x *GetWorkflowTemplatesRequest) Reset() { *x = GetWorkflowTemplatesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3115,7 +3060,7 @@ func (x *GetWorkflowTemplatesRequest) String() string { func (*GetWorkflowTemplatesRequest) ProtoMessage() {} func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[43] + mi := &file_protos_o2control_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3128,7 +3073,7 @@ func (x *GetWorkflowTemplatesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesRequest.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{43} + return file_protos_o2control_proto_rawDescGZIP(), []int{42} } func (x *GetWorkflowTemplatesRequest) GetRepoPattern() string { @@ -3186,7 +3131,7 @@ type VarSpecMessage struct { func (x *VarSpecMessage) Reset() { *x = VarSpecMessage{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3199,7 +3144,7 @@ func (x *VarSpecMessage) String() string { func (*VarSpecMessage) ProtoMessage() {} func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[44] + mi := &file_protos_o2control_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3212,7 +3157,7 @@ func (x *VarSpecMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use VarSpecMessage.ProtoReflect.Descriptor instead. func (*VarSpecMessage) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{44} + return file_protos_o2control_proto_rawDescGZIP(), []int{43} } func (x *VarSpecMessage) GetDefaultValue() string { @@ -3300,7 +3245,7 @@ type WorkflowTemplateInfo struct { func (x *WorkflowTemplateInfo) Reset() { *x = WorkflowTemplateInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3313,7 +3258,7 @@ func (x *WorkflowTemplateInfo) String() string { func (*WorkflowTemplateInfo) ProtoMessage() {} func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[45] + mi := &file_protos_o2control_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3326,7 +3271,7 @@ func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{45} + return file_protos_o2control_proto_rawDescGZIP(), []int{44} } func (x *WorkflowTemplateInfo) GetRepo() string { @@ -3375,7 +3320,7 @@ type GetWorkflowTemplatesReply struct { func (x *GetWorkflowTemplatesReply) Reset() { *x = GetWorkflowTemplatesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3388,7 +3333,7 @@ func (x *GetWorkflowTemplatesReply) String() string { func (*GetWorkflowTemplatesReply) ProtoMessage() {} func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[46] + mi := &file_protos_o2control_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3401,7 +3346,7 @@ func (x *GetWorkflowTemplatesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWorkflowTemplatesReply.ProtoReflect.Descriptor instead. func (*GetWorkflowTemplatesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{46} + return file_protos_o2control_proto_rawDescGZIP(), []int{45} } func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateInfo { @@ -3422,7 +3367,7 @@ type ListReposRequest struct { func (x *ListReposRequest) Reset() { *x = ListReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3435,7 +3380,7 @@ func (x *ListReposRequest) String() string { func (*ListReposRequest) ProtoMessage() {} func (x *ListReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[47] + mi := &file_protos_o2control_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3448,7 +3393,7 @@ func (x *ListReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposRequest.ProtoReflect.Descriptor instead. func (*ListReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{47} + return file_protos_o2control_proto_rawDescGZIP(), []int{46} } func (x *ListReposRequest) GetGetRevisions() bool { @@ -3472,7 +3417,7 @@ type RepoInfo struct { func (x *RepoInfo) Reset() { *x = RepoInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3485,7 +3430,7 @@ func (x *RepoInfo) String() string { func (*RepoInfo) ProtoMessage() {} func (x *RepoInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[48] + mi := &file_protos_o2control_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3498,7 +3443,7 @@ func (x *RepoInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use RepoInfo.ProtoReflect.Descriptor instead. func (*RepoInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{48} + return file_protos_o2control_proto_rawDescGZIP(), []int{47} } func (x *RepoInfo) GetName() string { @@ -3541,7 +3486,7 @@ type ListReposReply struct { func (x *ListReposReply) Reset() { *x = ListReposReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3554,7 +3499,7 @@ func (x *ListReposReply) String() string { func (*ListReposReply) ProtoMessage() {} func (x *ListReposReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[49] + mi := &file_protos_o2control_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3567,7 +3512,7 @@ func (x *ListReposReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListReposReply.ProtoReflect.Descriptor instead. func (*ListReposReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{49} + return file_protos_o2control_proto_rawDescGZIP(), []int{48} } func (x *ListReposReply) GetRepos() []*RepoInfo { @@ -3596,7 +3541,7 @@ type AddRepoRequest struct { func (x *AddRepoRequest) Reset() { *x = AddRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3609,7 +3554,7 @@ func (x *AddRepoRequest) String() string { func (*AddRepoRequest) ProtoMessage() {} func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[50] + mi := &file_protos_o2control_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3622,7 +3567,7 @@ func (x *AddRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoRequest.ProtoReflect.Descriptor instead. func (*AddRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{50} + return file_protos_o2control_proto_rawDescGZIP(), []int{49} } func (x *AddRepoRequest) GetName() string { @@ -3651,7 +3596,7 @@ type AddRepoReply struct { func (x *AddRepoReply) Reset() { *x = AddRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3664,7 +3609,7 @@ func (x *AddRepoReply) String() string { func (*AddRepoReply) ProtoMessage() {} func (x *AddRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[51] + mi := &file_protos_o2control_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3677,7 +3622,7 @@ func (x *AddRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use AddRepoReply.ProtoReflect.Descriptor instead. func (*AddRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{51} + return file_protos_o2control_proto_rawDescGZIP(), []int{50} } func (x *AddRepoReply) GetNewDefaultRevision() string { @@ -3705,7 +3650,7 @@ type RemoveRepoRequest struct { func (x *RemoveRepoRequest) Reset() { *x = RemoveRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3718,7 +3663,7 @@ func (x *RemoveRepoRequest) String() string { func (*RemoveRepoRequest) ProtoMessage() {} func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[52] + mi := &file_protos_o2control_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3731,7 +3676,7 @@ func (x *RemoveRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoRequest.ProtoReflect.Descriptor instead. func (*RemoveRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{52} + return file_protos_o2control_proto_rawDescGZIP(), []int{51} } func (x *RemoveRepoRequest) GetIndex() int32 { @@ -3752,7 +3697,7 @@ type RemoveRepoReply struct { func (x *RemoveRepoReply) Reset() { *x = RemoveRepoReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3765,7 +3710,7 @@ func (x *RemoveRepoReply) String() string { func (*RemoveRepoReply) ProtoMessage() {} func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[53] + mi := &file_protos_o2control_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3778,7 +3723,7 @@ func (x *RemoveRepoReply) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveRepoReply.ProtoReflect.Descriptor instead. func (*RemoveRepoReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{53} + return file_protos_o2control_proto_rawDescGZIP(), []int{52} } func (x *RemoveRepoReply) GetNewDefaultRepo() string { @@ -3799,7 +3744,7 @@ type RefreshReposRequest struct { func (x *RefreshReposRequest) Reset() { *x = RefreshReposRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3812,7 +3757,7 @@ func (x *RefreshReposRequest) String() string { func (*RefreshReposRequest) ProtoMessage() {} func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[54] + mi := &file_protos_o2control_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3825,7 +3770,7 @@ func (x *RefreshReposRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RefreshReposRequest.ProtoReflect.Descriptor instead. func (*RefreshReposRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{54} + return file_protos_o2control_proto_rawDescGZIP(), []int{53} } func (x *RefreshReposRequest) GetIndex() int32 { @@ -3846,7 +3791,7 @@ type SetDefaultRepoRequest struct { func (x *SetDefaultRepoRequest) Reset() { *x = SetDefaultRepoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3859,7 +3804,7 @@ func (x *SetDefaultRepoRequest) String() string { func (*SetDefaultRepoRequest) ProtoMessage() {} func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[55] + mi := &file_protos_o2control_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3872,7 +3817,7 @@ func (x *SetDefaultRepoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetDefaultRepoRequest.ProtoReflect.Descriptor instead. func (*SetDefaultRepoRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{55} + return file_protos_o2control_proto_rawDescGZIP(), []int{54} } func (x *SetDefaultRepoRequest) GetIndex() int32 { @@ -3893,7 +3838,7 @@ type SetGlobalDefaultRevisionRequest struct { func (x *SetGlobalDefaultRevisionRequest) Reset() { *x = SetGlobalDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3906,7 +3851,7 @@ func (x *SetGlobalDefaultRevisionRequest) String() string { func (*SetGlobalDefaultRevisionRequest) ProtoMessage() {} func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[56] + mi := &file_protos_o2control_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3919,7 +3864,7 @@ func (x *SetGlobalDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetGlobalDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetGlobalDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{56} + return file_protos_o2control_proto_rawDescGZIP(), []int{55} } func (x *SetGlobalDefaultRevisionRequest) GetRevision() string { @@ -3941,7 +3886,7 @@ type SetRepoDefaultRevisionRequest struct { func (x *SetRepoDefaultRevisionRequest) Reset() { *x = SetRepoDefaultRevisionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3954,7 +3899,7 @@ func (x *SetRepoDefaultRevisionRequest) String() string { func (*SetRepoDefaultRevisionRequest) ProtoMessage() {} func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[57] + mi := &file_protos_o2control_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3967,7 +3912,7 @@ func (x *SetRepoDefaultRevisionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionRequest.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionRequest) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{57} + return file_protos_o2control_proto_rawDescGZIP(), []int{56} } func (x *SetRepoDefaultRevisionRequest) GetIndex() int32 { @@ -3995,7 +3940,7 @@ type SetRepoDefaultRevisionReply struct { func (x *SetRepoDefaultRevisionReply) Reset() { *x = SetRepoDefaultRevisionReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4008,7 +3953,7 @@ func (x *SetRepoDefaultRevisionReply) String() string { func (*SetRepoDefaultRevisionReply) ProtoMessage() {} func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[58] + mi := &file_protos_o2control_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4021,7 +3966,7 @@ func (x *SetRepoDefaultRevisionReply) ProtoReflect() protoreflect.Message { // Deprecated: Use SetRepoDefaultRevisionReply.ProtoReflect.Descriptor instead. func (*SetRepoDefaultRevisionReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{58} + return file_protos_o2control_proto_rawDescGZIP(), []int{57} } func (x *SetRepoDefaultRevisionReply) GetInfo() string { @@ -4040,7 +3985,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4053,7 +3998,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[59] + mi := &file_protos_o2control_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4066,7 +4011,7 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{59} + return file_protos_o2control_proto_rawDescGZIP(), []int{58} } type ListIntegratedServicesReply struct { @@ -4080,7 +4025,7 @@ type ListIntegratedServicesReply struct { func (x *ListIntegratedServicesReply) Reset() { *x = ListIntegratedServicesReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4093,7 +4038,7 @@ func (x *ListIntegratedServicesReply) String() string { func (*ListIntegratedServicesReply) ProtoMessage() {} func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[60] + mi := &file_protos_o2control_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4106,7 +4051,7 @@ func (x *ListIntegratedServicesReply) ProtoReflect() protoreflect.Message { // Deprecated: Use ListIntegratedServicesReply.ProtoReflect.Descriptor instead. func (*ListIntegratedServicesReply) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{60} + return file_protos_o2control_proto_rawDescGZIP(), []int{59} } func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServiceInfo { @@ -4131,7 +4076,7 @@ type IntegratedServiceInfo struct { func (x *IntegratedServiceInfo) Reset() { *x = IntegratedServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4144,7 +4089,7 @@ func (x *IntegratedServiceInfo) String() string { func (*IntegratedServiceInfo) ProtoMessage() {} func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_protos_o2control_proto_msgTypes[61] + mi := &file_protos_o2control_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4157,7 +4102,7 @@ func (x *IntegratedServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use IntegratedServiceInfo.ProtoReflect.Descriptor instead. func (*IntegratedServiceInfo) Descriptor() ([]byte, []int) { - return file_protos_o2control_proto_rawDescGZIP(), []int{61} + return file_protos_o2control_proto_rawDescGZIP(), []int{60} } func (x *IntegratedServiceInfo) GetName() string { @@ -4499,7 +4444,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x02, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, @@ -4519,432 +4464,426 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x22, 0x84, 0x01, 0x0a, - 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, - 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, - 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x22, 0x37, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x45, 0x0a, 0x0d, 0x54, 0x61, - 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, - 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, - 0xf0, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, - 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, - 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, - 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, - 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, - 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, + 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, + 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, + 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, + 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, + 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, + 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, + 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, + 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, - 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, - 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, + 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, + 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, + 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, + 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, + 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, - 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, - 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, - 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, - 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, - 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, - 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, - 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, - 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, - 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, + 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, + 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, + 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, + 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, + 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, + 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, + 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, + 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, + 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, + 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, + 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, + 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, + 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, + 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, + 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, + 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, + 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, + 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, + 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, + 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, + 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, - 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, - 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, + 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, - 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, - 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, - 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, - 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, - 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, - 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, - 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, - 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, - 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, - 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, + 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, + 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, + 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, + 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, + 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, + 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, + 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, + 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, + 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4960,7 +4899,7 @@ func file_protos_o2control_proto_rawDescGZIP() []byte { } var file_protos_o2control_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_protos_o2control_proto_msgTypes = make([]protoimpl.MessageInfo, 76) var file_protos_o2control_proto_goTypes = []interface{}{ (ControlEnvironmentRequest_Optype)(0), // 0: o2control.ControlEnvironmentRequest.Optype (EnvironmentOperation_Optype)(0), // 1: o2control.EnvironmentOperation.Optype @@ -5000,153 +4939,151 @@ var file_protos_o2control_proto_goTypes = []interface{}{ (*GetTasksReply)(nil), // 35: o2control.GetTasksReply (*GetTaskRequest)(nil), // 36: o2control.GetTaskRequest (*GetTaskReply)(nil), // 37: o2control.GetTaskReply - (*TaskClassInfo)(nil), // 38: o2control.TaskClassInfo - (*CommandInfo)(nil), // 39: o2control.CommandInfo - (*ChannelInfo)(nil), // 40: o2control.ChannelInfo - (*TaskInfo)(nil), // 41: o2control.TaskInfo - (*CleanupTasksRequest)(nil), // 42: o2control.CleanupTasksRequest - (*CleanupTasksReply)(nil), // 43: o2control.CleanupTasksReply - (*GetRolesRequest)(nil), // 44: o2control.GetRolesRequest - (*RoleInfo)(nil), // 45: o2control.RoleInfo - (*GetRolesReply)(nil), // 46: o2control.GetRolesReply - (*GetWorkflowTemplatesRequest)(nil), // 47: o2control.GetWorkflowTemplatesRequest - (*VarSpecMessage)(nil), // 48: o2control.VarSpecMessage - (*WorkflowTemplateInfo)(nil), // 49: o2control.WorkflowTemplateInfo - (*GetWorkflowTemplatesReply)(nil), // 50: o2control.GetWorkflowTemplatesReply - (*ListReposRequest)(nil), // 51: o2control.ListReposRequest - (*RepoInfo)(nil), // 52: o2control.RepoInfo - (*ListReposReply)(nil), // 53: o2control.ListReposReply - (*AddRepoRequest)(nil), // 54: o2control.AddRepoRequest - (*AddRepoReply)(nil), // 55: o2control.AddRepoReply - (*RemoveRepoRequest)(nil), // 56: o2control.RemoveRepoRequest - (*RemoveRepoReply)(nil), // 57: o2control.RemoveRepoReply - (*RefreshReposRequest)(nil), // 58: o2control.RefreshReposRequest - (*SetDefaultRepoRequest)(nil), // 59: o2control.SetDefaultRepoRequest - (*SetGlobalDefaultRevisionRequest)(nil), // 60: o2control.SetGlobalDefaultRevisionRequest - (*SetRepoDefaultRevisionRequest)(nil), // 61: o2control.SetRepoDefaultRevisionRequest - (*SetRepoDefaultRevisionReply)(nil), // 62: o2control.SetRepoDefaultRevisionReply - (*Empty)(nil), // 63: o2control.Empty - (*ListIntegratedServicesReply)(nil), // 64: o2control.ListIntegratedServicesReply - (*IntegratedServiceInfo)(nil), // 65: o2control.IntegratedServiceInfo - nil, // 66: o2control.EnvironmentInfo.DefaultsEntry - nil, // 67: o2control.EnvironmentInfo.VarsEntry - nil, // 68: o2control.EnvironmentInfo.UserVarsEntry - nil, // 69: o2control.EnvironmentInfo.IntegratedServicesDataEntry - nil, // 70: o2control.NewEnvironmentRequest.VarsEntry - nil, // 71: o2control.NewAutoEnvironmentRequest.VarsEntry - nil, // 72: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - nil, // 73: o2control.GetEnvironmentPropertiesReply.PropertiesEntry - nil, // 74: o2control.TaskInfo.PropertiesEntry - nil, // 75: o2control.RoleInfo.DefaultsEntry - nil, // 76: o2control.RoleInfo.VarsEntry - nil, // 77: o2control.RoleInfo.UserVarsEntry - nil, // 78: o2control.RoleInfo.ConsolidatedStackEntry - nil, // 79: o2control.WorkflowTemplateInfo.VarSpecMapEntry - nil, // 80: o2control.ListIntegratedServicesReply.ServicesEntry - (*protos.Event)(nil), // 81: events.Event + (*CommandInfo)(nil), // 38: o2control.CommandInfo + (*ChannelInfo)(nil), // 39: o2control.ChannelInfo + (*TaskInfo)(nil), // 40: o2control.TaskInfo + (*CleanupTasksRequest)(nil), // 41: o2control.CleanupTasksRequest + (*CleanupTasksReply)(nil), // 42: o2control.CleanupTasksReply + (*GetRolesRequest)(nil), // 43: o2control.GetRolesRequest + (*RoleInfo)(nil), // 44: o2control.RoleInfo + (*GetRolesReply)(nil), // 45: o2control.GetRolesReply + (*GetWorkflowTemplatesRequest)(nil), // 46: o2control.GetWorkflowTemplatesRequest + (*VarSpecMessage)(nil), // 47: o2control.VarSpecMessage + (*WorkflowTemplateInfo)(nil), // 48: o2control.WorkflowTemplateInfo + (*GetWorkflowTemplatesReply)(nil), // 49: o2control.GetWorkflowTemplatesReply + (*ListReposRequest)(nil), // 50: o2control.ListReposRequest + (*RepoInfo)(nil), // 51: o2control.RepoInfo + (*ListReposReply)(nil), // 52: o2control.ListReposReply + (*AddRepoRequest)(nil), // 53: o2control.AddRepoRequest + (*AddRepoReply)(nil), // 54: o2control.AddRepoReply + (*RemoveRepoRequest)(nil), // 55: o2control.RemoveRepoRequest + (*RemoveRepoReply)(nil), // 56: o2control.RemoveRepoReply + (*RefreshReposRequest)(nil), // 57: o2control.RefreshReposRequest + (*SetDefaultRepoRequest)(nil), // 58: o2control.SetDefaultRepoRequest + (*SetGlobalDefaultRevisionRequest)(nil), // 59: o2control.SetGlobalDefaultRevisionRequest + (*SetRepoDefaultRevisionRequest)(nil), // 60: o2control.SetRepoDefaultRevisionRequest + (*SetRepoDefaultRevisionReply)(nil), // 61: o2control.SetRepoDefaultRevisionReply + (*Empty)(nil), // 62: o2control.Empty + (*ListIntegratedServicesReply)(nil), // 63: o2control.ListIntegratedServicesReply + (*IntegratedServiceInfo)(nil), // 64: o2control.IntegratedServiceInfo + nil, // 65: o2control.EnvironmentInfo.DefaultsEntry + nil, // 66: o2control.EnvironmentInfo.VarsEntry + nil, // 67: o2control.EnvironmentInfo.UserVarsEntry + nil, // 68: o2control.EnvironmentInfo.IntegratedServicesDataEntry + nil, // 69: o2control.NewEnvironmentRequest.VarsEntry + nil, // 70: o2control.NewAutoEnvironmentRequest.VarsEntry + nil, // 71: o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + nil, // 72: o2control.GetEnvironmentPropertiesReply.PropertiesEntry + nil, // 73: o2control.TaskInfo.PropertiesEntry + nil, // 74: o2control.RoleInfo.DefaultsEntry + nil, // 75: o2control.RoleInfo.VarsEntry + nil, // 76: o2control.RoleInfo.UserVarsEntry + nil, // 77: o2control.RoleInfo.ConsolidatedStackEntry + nil, // 78: o2control.WorkflowTemplateInfo.VarSpecMapEntry + nil, // 79: o2control.ListIntegratedServicesReply.ServicesEntry + (*protos.Event)(nil), // 80: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version 12, // 1: o2control.GetEnvironmentsReply.environments:type_name -> o2control.EnvironmentInfo 32, // 2: o2control.EnvironmentInfo.tasks:type_name -> o2control.ShortTaskInfo - 66, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry - 67, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry - 68, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry - 69, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry - 70, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry + 65, // 3: o2control.EnvironmentInfo.defaults:type_name -> o2control.EnvironmentInfo.DefaultsEntry + 66, // 4: o2control.EnvironmentInfo.vars:type_name -> o2control.EnvironmentInfo.VarsEntry + 67, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry + 68, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry + 69, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 71, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 70, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 45, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 44, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 43, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 72, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 73, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 42, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 71, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 72, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 41, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 40, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 38, // 23: o2control.TaskInfo.classInfo:type_name -> o2control.TaskClassInfo - 40, // 24: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 40, // 25: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 39, // 26: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 74, // 27: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 32, // 28: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 32, // 29: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 45, // 30: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 75, // 31: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 76, // 32: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 77, // 33: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 78, // 34: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 45, // 35: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 3, // 36: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 2, // 37: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 79, // 38: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 49, // 39: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 52, // 40: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 80, // 41: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 48, // 42: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 65, // 43: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 5, // 44: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 10, // 45: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 15, // 46: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 13, // 47: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 17, // 48: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 19, // 49: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 24, // 50: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 63, // 51: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 63, // 52: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 13, // 53: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest - 34, // 54: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 36, // 55: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 42, // 56: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 44, // 57: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 47, // 58: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 51, // 59: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 54, // 60: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 56, // 61: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 58, // 62: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 59, // 63: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 60, // 64: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 61, // 65: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 4, // 66: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 63, // 67: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 68: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 21, // 69: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 7, // 70: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 11, // 71: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 16, // 72: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 14, // 73: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 18, // 74: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 20, // 75: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 25, // 76: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 26, // 77: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 27, // 78: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 14, // 79: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply - 35, // 80: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 37, // 81: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 43, // 82: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 46, // 83: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 50, // 84: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 53, // 85: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 55, // 86: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 57, // 87: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 63, // 88: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 63, // 89: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 63, // 90: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 62, // 91: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 81, // 92: o2control.Control.Subscribe:output_type -> events.Event - 64, // 93: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 9, // 94: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 23, // 95: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 70, // [70:96] is the sub-list for method output_type - 44, // [44:70] is the sub-list for method input_type - 44, // [44:44] is the sub-list for extension type_name - 44, // [44:44] is the sub-list for extension extendee - 0, // [0:44] is the sub-list for field type_name + 39, // 23: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 39, // 24: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 38, // 25: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 73, // 26: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 27: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 28: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 44, // 29: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 74, // 30: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 75, // 31: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 76, // 32: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 77, // 33: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 44, // 34: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 35: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 36: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 78, // 37: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 48, // 38: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 51, // 39: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 79, // 40: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 47, // 41: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 64, // 42: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 44: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 45: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 46: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 47: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 48: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 49: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 62, // 50: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 62, // 51: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 52: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 41, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 43, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 46, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 50, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 53, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 55, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 57, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 58, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 59, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 60, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 62, // 66: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 67: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 68: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 69: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 70: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 71: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 72: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 73: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 74: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 76: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 77: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 78: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 42, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 45, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 49, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 52, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 54, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 56, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 62, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 62, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 62, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 61, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 80, // 91: o2control.Control.Subscribe:output_type -> events.Event + 63, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 93: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 94: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 69, // [69:95] is the sub-list for method output_type + 43, // [43:69] is the sub-list for method input_type + 43, // [43:43] is the sub-list for extension type_name + 43, // [43:43] is the sub-list for extension extendee + 0, // [0:43] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } @@ -5564,18 +5501,6 @@ func file_protos_o2control_proto_init() { } } file_protos_o2control_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TaskClassInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CommandInfo); i { case 0: return &v.state @@ -5587,7 +5512,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ChannelInfo); i { case 0: return &v.state @@ -5599,7 +5524,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TaskInfo); i { case 0: return &v.state @@ -5611,7 +5536,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksRequest); i { case 0: return &v.state @@ -5623,7 +5548,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CleanupTasksReply); i { case 0: return &v.state @@ -5635,7 +5560,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesRequest); i { case 0: return &v.state @@ -5647,7 +5572,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoleInfo); i { case 0: return &v.state @@ -5659,7 +5584,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetRolesReply); i { case 0: return &v.state @@ -5671,7 +5596,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesRequest); i { case 0: return &v.state @@ -5683,7 +5608,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*VarSpecMessage); i { case 0: return &v.state @@ -5695,7 +5620,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WorkflowTemplateInfo); i { case 0: return &v.state @@ -5707,7 +5632,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetWorkflowTemplatesReply); i { case 0: return &v.state @@ -5719,7 +5644,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposRequest); i { case 0: return &v.state @@ -5731,7 +5656,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RepoInfo); i { case 0: return &v.state @@ -5743,7 +5668,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListReposReply); i { case 0: return &v.state @@ -5755,7 +5680,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoRequest); i { case 0: return &v.state @@ -5767,7 +5692,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AddRepoReply); i { case 0: return &v.state @@ -5779,7 +5704,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoRequest); i { case 0: return &v.state @@ -5791,7 +5716,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RemoveRepoReply); i { case 0: return &v.state @@ -5803,7 +5728,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RefreshReposRequest); i { case 0: return &v.state @@ -5815,7 +5740,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetDefaultRepoRequest); i { case 0: return &v.state @@ -5827,7 +5752,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetGlobalDefaultRevisionRequest); i { case 0: return &v.state @@ -5839,7 +5764,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionRequest); i { case 0: return &v.state @@ -5851,7 +5776,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetRepoDefaultRevisionReply); i { case 0: return &v.state @@ -5863,7 +5788,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Empty); i { case 0: return &v.state @@ -5875,7 +5800,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListIntegratedServicesReply); i { case 0: return &v.state @@ -5887,7 +5812,7 @@ func file_protos_o2control_proto_init() { return nil } } - file_protos_o2control_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_protos_o2control_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IntegratedServiceInfo); i { case 0: return &v.state @@ -5906,7 +5831,7 @@ func file_protos_o2control_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_o2control_proto_rawDesc, NumEnums: 4, - NumMessages: 77, + NumMessages: 76, NumExtensions: 0, NumServices: 1, }, diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index c626530c0..f301241d0 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -268,6 +268,7 @@ message ShortTaskInfo { string pid = 8; string sandboxStdout = 9; bool claimable = 10; + bool critical = 11; } message TaskDeploymentInfo { string hostname = 1; @@ -287,10 +288,6 @@ message GetTaskReply { TaskInfo task = 1; } -message TaskClassInfo { - string name = 1; - string controlMode = 2; -} message CommandInfo { repeated string env = 1; bool shell = 2; @@ -305,7 +302,7 @@ message ChannelInfo { } message TaskInfo { ShortTaskInfo shortInfo = 1; - TaskClassInfo classInfo = 2; + reserved 2; repeated ChannelInfo inboundChannels = 3; repeated ChannelInfo outboundChannels = 4; CommandInfo commandInfo = 5; diff --git a/core/server.go b/core/server.go index 786cf6d27..9322509f2 100644 --- a/core/server.go +++ b/core/server.go @@ -814,11 +814,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge rep := &pb.GetTaskReply{ Task: &pb.TaskInfo{ - ShortInfo: taskToShortTaskInfo(task, m.state.taskman), - ClassInfo: &pb.TaskClassInfo{ - Name: task.GetClassName(), - ControlMode: task.GetControlMode().String(), - }, + ShortInfo: taskToShortTaskInfo(task, m.state.taskman), InboundChannels: inboundChannelsToPbChannels(inbound), OutboundChannels: outboundChannelsToPbChannels(outbound), CommandInfo: commandInfoToPbCommandInfo(commandInfo), diff --git a/core/serverutil.go b/core/serverutil.go index 1606056ee..1dee85726 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -132,6 +132,7 @@ func taskToShortTaskInfo(t *task.Task, taskman *task.Manager) (sti *pb.ShortTask }, Pid: t.GetTaskPID(), SandboxStdout: sandboxStdoutUri, + Critical: t.GetTraits().Critical, } parentRole, ok := t.GetParentRole().(workflow.Role) if ok && parentRole != nil { From c3c160a1e1797a4bb1f3ba196d6c2f25f9933cfa Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 29 May 2024 16:21:02 +0200 Subject: [PATCH 1914/2352] [core] Push CallEvents to aliecs.call topic --- core/workflow/callable/call.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index afc21d0bd..35971cca5 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -153,7 +153,7 @@ func (c *Call) Call() error { if err != nil { errMsg = err.Error() - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ Path: c.GetParentRolePath(), Func: c.Func, CallStatus: evpb.OpStatus_DONE_ERROR, @@ -181,7 +181,7 @@ func (c *Call) Call() error { if errReason, ok := c.VarStack["__call_error_reason"]; ok && len(errReason) > 0 { errMsg += ". REASON: " + errReason } - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ Path: c.GetParentRolePath(), Func: c.Func, CallStatus: evpb.OpStatus_DONE_ERROR, @@ -200,7 +200,7 @@ func (c *Call) Call() error { return errors.New(errMsg) } - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_CallEvent{ + the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ Path: c.GetParentRolePath(), Func: c.Func, CallStatus: evpb.OpStatus_DONE_OK, From bc874518401c520e723be02e27106f8d9472bc6a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 29 May 2024 16:13:36 +0200 Subject: [PATCH 1915/2352] [coconut] Show critical trait of tasks in table --- coconut/control/control.go | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 3bc78d291..8e82b93d3 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -540,12 +540,18 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com if printTasks { _, _ = fmt.Fprintln(o, "") drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "status", "state"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "crit", "status", "state"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), t.GetClassName(), t.GetDeploymentInfo().GetHostname(), + func() string { + if t.GetCritical() { + return "YES" + } + return "NO" + }(), t.GetStatus(), colorState(t.GetState())} }, o) @@ -734,7 +740,7 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a fmt.Fprintln(o, "no tasks running") } else { drawTableShortTaskInfos(tasks, - []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "claimable", "status", "state", "PID"}, + []string{fmt.Sprintf("task id (%d)", len(tasks)), "class name", "hostname", "locked", "claimable", "crit", "status", "state", "PID"}, func(t *pb.ShortTaskInfo) []string { return []string{ t.GetTaskId(), @@ -742,6 +748,12 @@ func GetTasks(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, a t.GetDeploymentInfo().GetHostname(), strconv.FormatBool(t.GetLocked()), strconv.FormatBool(t.GetClaimable()), + func() string { + if t.GetCritical() { + return "YES" + } + return "NO" + }(), t.GetStatus(), colorState(t.GetState()), t.GetPid(), From f8395f7b5a2ceddfa337db80c663f7791bccfbe9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 29 May 2024 16:14:16 +0200 Subject: [PATCH 1916/2352] [core] Track role criticality and return actual critical trait of tasks --- core/serverutil.go | 2 +- core/workflow/aggregatorrole.go | 11 +++++++++++ core/workflow/callrole.go | 10 +++++++++- core/workflow/iteratorrole.go | 11 +++++++++++ core/workflow/role.go | 1 + core/workflow/taskrole.go | 10 +++++++++- 6 files changed, 42 insertions(+), 3 deletions(-) diff --git a/core/serverutil.go b/core/serverutil.go index 1dee85726..81c63829f 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -132,12 +132,12 @@ func taskToShortTaskInfo(t *task.Task, taskman *task.Manager) (sti *pb.ShortTask }, Pid: t.GetTaskPID(), SandboxStdout: sandboxStdoutUri, - Critical: t.GetTraits().Critical, } parentRole, ok := t.GetParentRole().(workflow.Role) if ok && parentRole != nil { sti.Status = parentRole.GetStatus().String() sti.State = parentRole.GetState().String() + sti.Critical = parentRole.IsCritical() } return } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 576263d36..78a94d330 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -214,6 +214,17 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf return } +func (r *aggregatorRole) IsCritical() bool { + if r == nil { + return false + } + critical := false + for _, role := range r.Roles { + critical = critical || role.IsCritical() + } + return critical +} + func (r *aggregatorRole) copy() copyable { rCopy := aggregatorRole{ roleBase: *r.roleBase.copy().(*roleBase), diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index f5af8d4f8..342fbffdc 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -26,11 +26,12 @@ package workflow import ( "errors" - "github.com/AliceO2Group/Control/common/logger/infologger" "strings" texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" pb "github.com/AliceO2Group/Control/common/protos" @@ -337,6 +338,13 @@ func (*callRole) GetRoles() []Role { return nil } +func (t *callRole) IsCritical() bool { + if t == nil { + return false + } + return t.Critical +} + func (t *callRole) setParent(role Updatable) { t.parent = role t.Defaults.Wrap(role.GetDefaults()) diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 1eb9a6991..ea1e55abd 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -430,3 +430,14 @@ func (i *iteratorRole) GetEnvironmentId() uid.ID { } return i.GetParent().GetEnvironmentId() } + +func (i *iteratorRole) IsCritical() bool { + if i == nil { + return false + } + critical := false + for _, role := range i.Roles { + critical = critical || role.IsCritical() + } + return critical +} diff --git a/core/workflow/role.go b/core/workflow/role.go index bda831b74..8bde99c3e 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -69,6 +69,7 @@ type Role interface { ConsolidatedVarStack() (varStack map[string]string, err error) ConsolidatedVarMaps() (defaults, vars, userVars map[string]string, err error) GetEnvironmentId() uid.ID + IsCritical() bool } type PublicUpdatable interface { diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index b007d938e..9ab45dc6d 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -26,11 +26,12 @@ package workflow import ( "errors" - "github.com/AliceO2Group/Control/common/logger/infologger" "strings" texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" pb "github.com/AliceO2Group/Control/common/protos" @@ -383,6 +384,13 @@ func (*taskRole) GetRoles() []Role { return nil } +func (t *taskRole) IsCritical() bool { + if t == nil { + return false + } + return t.Critical +} + //FIXME: figure out if nested doTransition calls are even desirable // Intead of this stuff, we could have a similar method which does not perform a transition, // but just builds the mesoscommand_transition and sends it. From adfbdb693a2ef5d836ac4b16d962406b84903a12 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 30 May 2024 10:01:44 +0200 Subject: [PATCH 1917/2352] [core] Task must return traits for non-basic tasks --- core/task/task.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index d3d45dcc2..226cf54ce 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -242,7 +242,7 @@ func (t *Task) GetControlMode() controlmode.ControlMode { func (t *Task) GetTraits() Traits { if class := t.GetTaskClass(); class != nil { - if class.Control.Mode == controlmode.BASIC && t.GetParent() != nil { + if t.GetParent() != nil { return t.GetParent().GetTaskTraits() } } From 378f2874a12350ee6a2e8b9c07017785f37311ac Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 30 May 2024 11:13:31 +0200 Subject: [PATCH 1918/2352] OCTRL-870 [core] Handle escaped config URIs in DPL commands correctly --- Makefile | 2 +- configuration/componentcfg/query.go | 2 +- configuration/componentcfg/query_test.go | 13 ++++ configuration/template/dplutil.go | 43 ++++++++--- configuration/template/dplutil_test.go | 95 ++++++++++++++++++++++++ configuration/template/template_test.go | 12 +++ 6 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 configuration/template/dplutil_test.go create mode 100644 configuration/template/template_test.go diff --git a/Makefile b/Makefile index 158b98724..f0d0241d6 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./core/task ./core/workflow +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task ./core/workflow GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 1135e8fa2..95cab34af 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -45,7 +45,7 @@ var ( inputFullRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_/]+){1}$`) // component /RUNTYPE /rolename inputEntriesRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+)(\/[A-Z0-9-_]+){1}(\/[a-z-A-Z0-9-_]+){1}$`) - inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)*$`) + inputParametersRegex = regexp.MustCompile(`^([a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)(&[a-zA-Z0-9-_]+=[a-zA-Z0-9-_,"\[\]]+)*$`) E_BAD_KEY = errors.New("bad component configuration key format") ) diff --git a/configuration/componentcfg/query_test.go b/configuration/componentcfg/query_test.go index 9faa3dbad..a83212722 100644 --- a/configuration/componentcfg/query_test.go +++ b/configuration/componentcfg/query_test.go @@ -208,6 +208,19 @@ var _ = Describe("query", func() { Expect(q.VarStack["detectors"]).To(Equal("[\"MCH\",\"MID\"]")) }) }) + When("the query parameters has an escaped first value", func() { + // we test this case because for technical reasons, the regex has one matching group for the first kv + // and another matching group for the rest + BeforeEach(func() { + q, err = NewQueryParameters("detectors=[\"MCH\",\"MID\"]") + }) + It("should be parsed without reporting errors", func() { + Expect(err).To(BeNil()) + }) + It("should have parsed the var stack correctly", func() { + Expect(q.VarStack["detectors"]).To(Equal("[\"MCH\",\"MID\"]")) + }) + }) Describe("dealing with incorrectly formatted query parameters", func() { When("query parameters are empty", func() { diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 1943bfa0f..acf994b6e 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -39,23 +39,46 @@ import ( "github.com/AliceO2Group/Control/core/repos" ) +// extractConfigURIs looks for configuration URIs in the provided DPL commands and extracts them +// tt supports escaped arguments with quotes and will return trimmed URIs +func extractConfigURIs(dplCommand string) (uris []string) { + const nMaxExpectedQcPayloads = 2 + // Match any consul/apricot URI + // it would be the easiest to use a backreference in the regex, but regexp does not support those: + // (['"]?)((consul-json|apricot)://[^ |\n]*)(\1) + re := regexp.MustCompile(`['"]?(consul-json|apricot)://[^ |\n]*`) + matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) + + for _, match := range matches { + uri := match[0] + + if len(uri) < 1 { + // I don't even know how this could happen, but it won't hurt to check... + log.Errorf("seen an empty config URI regex match for DPL command '%s'", dplCommand) + continue + } + + if (uri[0] == '\'' || uri[0] == '"') && uri[0] == uri[len(uri)-1] { + uri = strings.Trim(uri, "\"'") + } + uris = append(uris, uri) + } + + return uris +} + // jitDplGenerate takes a resolved dplCommand as an argument, // generates the corresponding tasks and workflow // and returns the resolved dplWorkflow as a string func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { - const nMaxExpectedQcPayloads = 2 var payloads []string - // Match any consul URL - re := regexp.MustCompile(`(consul-json|apricot)://[^ |"\n]*`) - matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) - matches = append(matches) + configURIs := extractConfigURIs(dplCommand) // Gather all the processed configuration payloads from apricot - for _, match := range matches { - // Match any key under components - keyRe := regexp.MustCompile(`components/[^']*`) - consulKeyMatch := keyRe.FindAllStringSubmatch(match[0], 1) + for _, uri := range configURIs { + keyRe := regexp.MustCompile(`components/.*`) + consulKeyMatch := keyRe.FindAllStringSubmatch(uri, 1) consulKey := strings.SplitAfter(consulKeyMatch[0][0], "components/") // split between the query and its parameters if there are any consulKeyTokens := strings.Split(consulKey[1], "?") @@ -81,7 +104,7 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo } if err != nil { - return "", fmt.Errorf("JIT failed trying to query QC payload '%s', error: %w", match, err) + return "", fmt.Errorf("JIT failed trying to query QC payload '%s', error: %w", uri, err) } payloads = append(payloads, payload) } diff --git a/configuration/template/dplutil_test.go b/configuration/template/dplutil_test.go new file mode 100644 index 000000000..0ab4f833a --- /dev/null +++ b/configuration/template/dplutil_test.go @@ -0,0 +1,95 @@ +package template + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("DPL utilities", func() { + Describe("extracting config URIs from DPL commands", func() { + var uris []string + When("the command does not have a config URI", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --arg val") + }) + It("should return an empty slice", func() { + Expect(uris).To(HaveLen(0)) + }) + }) + When("the URI is the last argument", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw")) + }) + }) + When("there is a pipe adjacent to the URI", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw| another-exe") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw")) + }) + }) + When("there is a space after the URI", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw --run-faster") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw")) + }) + }) + When("the URI had a single quote at the end which is used to write a value for a variable", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a='b' --run-faster") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a='b'")) + }) + }) + When("the URI had a double quote at the end which is used to write a value for a variable", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=\"b\" --run-faster") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=\"b\"")) + }) + }) + When("the URI is escaped with single quotes", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config 'apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=[\"b\"]' --run-faster") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=[\"b\"]")) + }) + }) + When("the URI is escaped and a pipe is just after", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config 'apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=[\"b\"]'| another-exe") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(1)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw?a=[\"b\"]")) + }) + }) + When("there are two URIs", func() { + BeforeEach(func() { + uris = extractConfigURIs( + "myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw" + + " | another-exe --config consul-json://host.cern.ch:12345/components/qc/ANY/any/tcp-raw") + }) + It("should return correctly parsed URIs", func() { + Expect(uris).To(HaveLen(2)) + Expect(uris[0]).To(Equal("apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw")) + Expect(uris[1]).To(Equal("consul-json://host.cern.ch:12345/components/qc/ANY/any/tcp-raw")) + }) + }) + }) +}) diff --git a/configuration/template/template_test.go b/configuration/template/template_test.go new file mode 100644 index 000000000..110c8a464 --- /dev/null +++ b/configuration/template/template_test.go @@ -0,0 +1,12 @@ +package template + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +func TestTemplate(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Component Configuration Test Suite") +} From 77b694f048499660177ae6ffee5ad821513c84d1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 30 May 2024 16:55:42 +0200 Subject: [PATCH 1919/2352] OCTRL-901 Document the order of actions performed during SOR and EOR --- docs/handbook/operation_order.md | 110 +++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 docs/handbook/operation_order.md diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md new file mode 100644 index 000000000..008109dce --- /dev/null +++ b/docs/handbook/operation_order.md @@ -0,0 +1,110 @@ +# Environment operation order + +This chapter attempts to document the order of important operations done during environment transitions. +Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [core/environment/environment.go](core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. +Also, please report to the ECS developers any inaccuracies. + +[State Machine Callbacks](docs/handbook/configuration.md#State-machine-callbacks) documents the order of callbacks that can be associated with state machine transitions. + +## START_ACTIVITY (Start Of Run) + +This is the order of actions happening at a healthy start of run. + +### before_START_ACTIVITY + +- `"run_number"` is set. +- `"run_start_time_ms"` is set using the current time. It is considered as the SOR and SOSOR timestamps. +- `before_START_ACTIVITY` hooks are executed: + - `trg.PrepareForRun()` at `-200` + - `trg.RunLoad()`, `bookkeeping.StartOfRun()` at `-100` + - `bookkeeping.RetrieveFillInfo()` at `-99` + - `kafka.PublishStartActivityUpdate()` at `-50` + - `dcs.StartOfRun()`, `odc.Start()` (does not need to return now), `ccdb.RunStart()` at `0` + +### before_event + +- `before_event` hooks are executed + +### leave_CONFIGURED + +- `leave_CONFIGURED` hooks are executed + - `kafka.PublishLeaveStateUpdate()` at `0` + +### leave_state + +- `leave_state` hooks are executed + +### Transition START_ACTIVITY + +- Fill Info previously retrieved by the BKP plugin is read from the variable stack and put into transition message to tasks +- Tasks are transitioned to `RUNNING` +- If everything succeeds up to this point, we report that the run has started + +### enter_RUNNING + +- `enter_RUNNING` hooks are executed + - `o2-roc-ctp-emulator` for all ROC CTP emulator endpoints, `kafka.PublishEnterStateUpdate()` at `0` + +### enter_state + +- `enter_state` hooks are executed + +### after_START_ACTIVITY +- `"run_start_completion_time_ms"` is set using current time. It is considered as the EOSOR timestamp. +- `after_START_ACTIVITY` hooks are executed: + - `trg.RunStart()` at `0` + - waiting until `odc.Start()` executed at `before_START_ACTIVITY` completes at `0` + - `bookkeeping.UpdateRunStart()`, `bookkeeping.UpdateEnv()` at `+100` + +### after_event + +- `after_event` hooks are executed + +## STOP_ACTIVITY (End Of Run) + +This is the order of actions happening at a healthy end of run. + +### before_STOP_ACTIVITY + +- `"run_end_time_ms"` is set using the current time. It is considered as the EOR and SOEOR timestamps. +- `before_STOP_ACTIVITY` hooks are executed: + - `trg.RunStop()`, `odc.Stop()` (does not need to return now) at `0` + +### before_event + +- `before_event` hooks are executed + +### leave_RUNNING + +- `leave_RUNNING` hooks are executed + - `kafka.PublishLeaveStateUpdate()` at `0` + +### leave_state + +- `leave_state` hooks are executed + +### Transition STOP_ACTIVITY + +- Tasks are transitioned to `STOP` +- If everything succeeds up to this point, we consider that the run has stopped + +### enter_CONFIGURED + +- `enter_CONFIGURED` hooks are executed + - `kafka.PublishEnterStateUpdate()` at `0` + +### enter_state + +- `enter_state` hooks are executed + +### after_STOP_ACTIVITY +- `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. +- `after_STOP_ACTIVITY` hooks are executed: + - `trg.RunUnload()` at `-100` + - `ccdb.RunStop()`, `dcs.EndOfRun()` at `0` + - waiting until `odc.Stop()()` executed at `before_STOP_ACTIVITY` completes at `0` + - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` + +### after_event + +- `after_event` hooks are executed \ No newline at end of file From 70d31602212902eefeb6a497e6543af3a52a144a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 31 May 2024 11:16:16 +0200 Subject: [PATCH 1920/2352] fix links --- docs/handbook/operation_order.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 008109dce..f7ab93d2f 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -1,10 +1,10 @@ # Environment operation order This chapter attempts to document the order of important operations done during environment transitions. -Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [core/environment/environment.go](core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. +Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [core/environment/environment.go](https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. Also, please report to the ECS developers any inaccuracies. -[State Machine Callbacks](docs/handbook/configuration.md#State-machine-callbacks) documents the order of callbacks that can be associated with state machine transitions. +[State Machine Callbacks](configuration.md#State-machine-callbacks) documents the order of callbacks that can be associated with state machine transitions. ## START_ACTIVITY (Start Of Run) From 2451cb7538a2e40f0c11824417c75eee8420c024 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 31 May 2024 11:38:48 +0200 Subject: [PATCH 1921/2352] remove generic targets in the operation order doc, since they are not supported --- docs/handbook/operation_order.md | 34 +------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index f7ab93d2f..95ce3f852 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -21,19 +21,11 @@ This is the order of actions happening at a healthy start of run. - `kafka.PublishStartActivityUpdate()` at `-50` - `dcs.StartOfRun()`, `odc.Start()` (does not need to return now), `ccdb.RunStart()` at `0` -### before_event - -- `before_event` hooks are executed - ### leave_CONFIGURED - `leave_CONFIGURED` hooks are executed - `kafka.PublishLeaveStateUpdate()` at `0` -### leave_state - -- `leave_state` hooks are executed - ### Transition START_ACTIVITY - Fill Info previously retrieved by the BKP plugin is read from the variable stack and put into transition message to tasks @@ -45,10 +37,6 @@ This is the order of actions happening at a healthy start of run. - `enter_RUNNING` hooks are executed - `o2-roc-ctp-emulator` for all ROC CTP emulator endpoints, `kafka.PublishEnterStateUpdate()` at `0` -### enter_state - -- `enter_state` hooks are executed - ### after_START_ACTIVITY - `"run_start_completion_time_ms"` is set using current time. It is considered as the EOSOR timestamp. - `after_START_ACTIVITY` hooks are executed: @@ -56,10 +44,6 @@ This is the order of actions happening at a healthy start of run. - waiting until `odc.Start()` executed at `before_START_ACTIVITY` completes at `0` - `bookkeeping.UpdateRunStart()`, `bookkeeping.UpdateEnv()` at `+100` -### after_event - -- `after_event` hooks are executed - ## STOP_ACTIVITY (End Of Run) This is the order of actions happening at a healthy end of run. @@ -70,19 +54,11 @@ This is the order of actions happening at a healthy end of run. - `before_STOP_ACTIVITY` hooks are executed: - `trg.RunStop()`, `odc.Stop()` (does not need to return now) at `0` -### before_event - -- `before_event` hooks are executed - ### leave_RUNNING - `leave_RUNNING` hooks are executed - `kafka.PublishLeaveStateUpdate()` at `0` -### leave_state - -- `leave_state` hooks are executed - ### Transition STOP_ACTIVITY - Tasks are transitioned to `STOP` @@ -93,18 +69,10 @@ This is the order of actions happening at a healthy end of run. - `enter_CONFIGURED` hooks are executed - `kafka.PublishEnterStateUpdate()` at `0` -### enter_state - -- `enter_state` hooks are executed - ### after_STOP_ACTIVITY - `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. - `after_STOP_ACTIVITY` hooks are executed: - `trg.RunUnload()` at `-100` - `ccdb.RunStop()`, `dcs.EndOfRun()` at `0` - waiting until `odc.Stop()()` executed at `before_STOP_ACTIVITY` completes at `0` - - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` - -### after_event - -- `after_event` hooks are executed \ No newline at end of file + - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file From 27c81975b5fd38f668b9b57bf364f3abf77de96d Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 31 May 2024 11:41:19 +0200 Subject: [PATCH 1922/2352] fix detail --- docs/handbook/operation_order.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 95ce3f852..23a8f79e3 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -61,7 +61,7 @@ This is the order of actions happening at a healthy end of run. ### Transition STOP_ACTIVITY -- Tasks are transitioned to `STOP` +- Tasks are transitioned to `CONFIGURED` - If everything succeeds up to this point, we consider that the run has stopped ### enter_CONFIGURED From 90977c6f392c09d72207dba1fecad79814151734 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 31 May 2024 11:42:06 +0200 Subject: [PATCH 1923/2352] spurrious brackets --- docs/handbook/operation_order.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 23a8f79e3..77b2bc5d2 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -74,5 +74,5 @@ This is the order of actions happening at a healthy end of run. - `after_STOP_ACTIVITY` hooks are executed: - `trg.RunUnload()` at `-100` - `ccdb.RunStop()`, `dcs.EndOfRun()` at `0` - - waiting until `odc.Stop()()` executed at `before_STOP_ACTIVITY` completes at `0` + - waiting until `odc.Stop()` executed at `before_STOP_ACTIVITY` completes at `0` - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file From f894c3c8b1b7597fed5bc6281d0b195bc7e088cd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 31 May 2024 16:16:15 +0200 Subject: [PATCH 1924/2352] [occ] Fix deserialization of ConfigEntry with empty value --- occ/plugin/litestructs/Transition.cxx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/occ/plugin/litestructs/Transition.cxx b/occ/plugin/litestructs/Transition.cxx index f4e185670..56419329c 100644 --- a/occ/plugin/litestructs/Transition.cxx +++ b/occ/plugin/litestructs/Transition.cxx @@ -92,11 +92,14 @@ bool OccLite::nopb::ConfigEntry::Serialize(rapidjson::Writer Date: Tue, 4 Jun 2024 12:10:54 +0200 Subject: [PATCH 1925/2352] [core] log the failed JIT workflow and detector, push DPL out only to IL As experienced by Uli last night, there was no indication in the message seen in the ECS GUI about which particular workflow failed and which detector does it belong to. This adds this information and removes DPL command output from that message and sends it to Infologger (saying it can be found there). --- configuration/template/dplutil.go | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index acf994b6e..752a8e010 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -156,9 +156,12 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo dplCmd.Dir = workflowRepo.GetCloneDir() var dplOut []byte dplOut, err = dplCmd.CombinedOutput() - log.Trace("DPL command out: " + string(dplOut)) if err != nil { - return "", fmt.Errorf("Failed to run DPL command: %w.\n DPL command out: %s", err, string(dplOut)) + log.Errorf("failed to run DPL command due to error '%s'", err.Error()) + log.Errorf("failed DPL command output: %s", string(dplOut)) + return "", fmt.Errorf("failed to run DPL command due to error '%w'. See FLP Infologger for DPL command output", err) + } else { + log.Trace("DPL command out: " + string(dplOut)) } return jitWorkflowName, nil @@ -204,5 +207,10 @@ func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[st return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } - return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand) + jitWorkflowName, err = jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand) + if err != nil { + detector := varStack["detector"] + return "", fmt.Errorf("for JIT workflow '%s' and detector '%s': %w", dplCommandUri, detector, err) + } + return } From bcc48dad75218a692ff9a2ab5f2b027ce70f3559 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Jun 2024 10:45:33 +0200 Subject: [PATCH 1926/2352] [core] demote message about replying to GetEnvironment call --- core/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 9322509f2..571719108 100644 --- a/core/server.go +++ b/core/server.go @@ -552,7 +552,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe WithField("method", "GetEnvironment"). WithField("level", infologger.IL_Support). WithField("intServPayloadSize", len(jsonISData)). - Infof("returning payload incl. integrated services data for %d services", len(isEnvData)) + Tracef("returning payload incl. integrated services data for %d services", len(isEnvData)) return } From e91c6e4027a431de8753162702234ea29a753309 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 31 May 2024 17:20:16 +0200 Subject: [PATCH 1927/2352] [core] Convert ODC device and env states to ECS and publish --- core/integration/odc/event/odcevent.go | 1 + core/integration/odc/fairmq/fairmq.go | 80 +++++++++++++ core/integration/odc/plugin.go | 156 +++++++++++++++++-------- 3 files changed, 188 insertions(+), 49 deletions(-) create mode 100644 core/integration/odc/fairmq/fairmq.go diff --git a/core/integration/odc/event/odcevent.go b/core/integration/odc/event/odcevent.go index 0b65205ac..b2176c838 100644 --- a/core/integration/odc/event/odcevent.go +++ b/core/integration/odc/event/odcevent.go @@ -33,6 +33,7 @@ type OdcPartitionStateChangeEvent struct { event.IntegratedServiceEventBase EnvironmentId uid.ID `json:"serviceName"` State string `json:"state"` + EcsState string `json:"ecsState"` } func (e *OdcPartitionStateChangeEvent) GetName() string { diff --git a/core/integration/odc/fairmq/fairmq.go b/core/integration/odc/fairmq/fairmq.go new file mode 100644 index 000000000..88903730d --- /dev/null +++ b/core/integration/odc/fairmq/fairmq.go @@ -0,0 +1,80 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package fairmq + +var ( + fairMqStateMap map[string]string +) + +func init() { + // see https://github.com/FairRootGroup/FairMQ/blob/master/docs/images/device_states.svg + fairMqStateMap = map[string]string{ + "IDLE": "STANDBY", + "READY": "CONFIGURED", + "RUNNING": "RUNNING", + "ERROR": "ERROR", + "EXITING": "DONE", + + "INITIALIZING DEVICE": "STANDBY", + "INITIALIZED": "STANDBY", + "BINDING": "STANDBY", + "BOUND": "STANDBY", + "CONNECTING": "STANDBY", + "DEVICE READY CONFIGURING": "STANDBY", // needs special case + "INITIALIZING TASK": "STANDBY", + + "RESETTING TASK": "CONFIGURED", + "DEVICE READY RESETTING": "CONFIGURED", // needs special case + "RESETTING DEVICE": "CONFIGURED", + } +} + +func toEcsState(fairMqState string) string { + if newEcsState, has := fairMqStateMap[fairMqState]; has { + return newEcsState + } + return "UNKNOWN" +} + +func ToEcsState(fairMqState, previousFairMqState string) string { + odcStateToConvert := fairMqState + // special case for DEVICE READY + if odcStateToConvert == "DEVICE READY" { + if previousFairMqState == "CONNECTING" || + previousFairMqState == "BOUND" || + previousFairMqState == "BINDING" || + previousFairMqState == "INITIALIZED" || + previousFairMqState == "INITIALIZING DEVICE" || + previousFairMqState == "IDLE" { + odcStateToConvert += " CONFIGURING" + } else if previousFairMqState == "RESETTING TASK" || + previousFairMqState == "READY" { + odcStateToConvert += " RESETTING" + } else { + return "UNKNOWN" + } + } + return toEcsState(odcStateToConvert) +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 5fd148fdd..157e3b03b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -48,6 +48,7 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" "github.com/AliceO2Group/Control/core/integration/odc/event" + "github.com/AliceO2Group/Control/core/integration/odc/fairmq" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -90,22 +91,23 @@ type OdcStatus struct { } type OdcPartitionInfo struct { - PartitionId uid.ID `json:"-"` - RunNumber uint32 `json:"runNumber"` - State string `json:"state"` - previousState string `json:"-"` // used for state change detection - DdsSessionId string `json:"ddsSessionId"` - DdsSessionStatus string `json:"ddsSessionStatus"` - Devices []OdcDevice `json:"devices"` - Hosts []string `json:"hosts"` + PartitionId uid.ID `json:"-"` + RunNumber uint32 `json:"runNumber"` + State string `json:"state"` + EcsState string `json:"ecsState"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + Devices map[uint64]OdcDevice `json:"devices"` + Hosts []string `json:"hosts"` } type OdcDevice struct { - TaskId string `json:"taskId"` - State string `json:"state"` - Path string `json:"path"` - Ignored bool `json:"ignored"` - Host string `json:"host"` + TaskId string `json:"taskId"` + State string `json:"state"` + EcsState string `json:"ecsState"` + Path string `json:"path"` + Ignored bool `json:"ignored"` + Host string `json:"host"` } func NewPlugin(endpoint string) integration.Plugin { @@ -225,9 +227,9 @@ func (p *Plugin) queryPartitionStatus() { } odcPartInfoSlice[idx].Hosts = odcPartStateRep.Reply.Hosts - odcPartInfoSlice[idx].Devices = make([]OdcDevice, len(odcPartStateRep.Devices)) - for i, device := range odcPartStateRep.Devices { - odcPartInfoSlice[idx].Devices[i] = OdcDevice{ + odcPartInfoSlice[idx].Devices = make(map[uint64]OdcDevice, len(odcPartStateRep.Devices)) + for _, device := range odcPartStateRep.Devices { + odcPartInfoSlice[idx].Devices[device.Id] = OdcDevice{ TaskId: strconv.FormatUint(device.Id, 10), State: device.State, Path: device.Path, @@ -248,44 +250,97 @@ func (p *Plugin) queryPartitionStatus() { } p.cachedStatusMu.Lock() - // env state change detection + + // state change detection if p.cachedStatus != nil && p.cachedStatus.Status == odc.ReplyStatus_SUCCESS { for id, partitionInfo := range response.Partitions { - if existingPartition, ok := p.cachedStatus.Partitions[id]; ok && (existingPartition.State != partitionInfo.State) { - log.WithField("level", infologger.IL_Support). - WithField("partition", id.String()). - WithField("oldState", existingPartition.State). - WithField("state", partitionInfo.State). - Info("ODC Partition state changed") - - payload := map[string]interface{}{ - "oldState": existingPartition.State, - "newState": partitionInfo.State, - "partitionId": partitionInfo.PartitionId.String(), - "ddsSessionId": partitionInfo.DdsSessionId, - "ddsSessionStatus": partitionInfo.DdsSessionStatus, - } - payloadJson, _ := json.Marshal(payload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: "odc.partitionStateChanged", - EnvironmentId: id.String(), - Payload: string(payloadJson[:]), - }) - - envMan := environment.ManagerInstance() - if envMan != nil { - go envMan.NotifyIntegratedServiceEvent(&event.OdcPartitionStateChangeEvent{ - IntegratedServiceEventBase: common_event.IntegratedServiceEventBase{ServiceName: "ODC"}, - EnvironmentId: id, - State: partitionInfo.State, + + // do we have the given partition on record already? if not, no state change detection is possible + if existingPartition, ok := p.cachedStatus.Partitions[id]; ok { + + // detection of device state change + event publication + for deviceId, device := range partitionInfo.Devices { + oldDevice, hasDevice := existingPartition.Devices[deviceId] + + oldState := "" // we presume the task didn't exist before + + // if a device with this ID is already known to us from before + if hasDevice { + // if device state has changed + if oldDevice.State != device.State { + // if the state has changed, we take note of the previous state + oldState = oldDevice.State + } else { + // if the state hasn't changed, we bail + continue + } + } + + device.EcsState = fairmq.ToEcsState(device.State, oldState) + + // since the odc-state of the task has changed, we must publish the event + payload := map[string]interface{}{ + "oldState": oldState, + "newState": device.State, + "ecsState": device.EcsState, + "taskId": device.TaskId, + "path": device.Path, + "ignored": device.Ignored, + "host": device.Host, + "partitionId": partitionInfo.PartitionId.String(), + "ddsSessionId": partitionInfo.DdsSessionId, + "ddsSessionStatus": partitionInfo.DdsSessionStatus, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: "odc.deviceStateChanged", + EnvironmentId: id.String(), + Payload: string(payloadJson[:]), }) - } else { + } + + // detection of env (ODC partition) state change + event publication + if existingPartition.State != partitionInfo.State { log.WithField("level", infologger.IL_Support). WithField("partition", id.String()). WithField("oldState", existingPartition.State). WithField("state", partitionInfo.State). - Warn("could not notify environment manager of ODC partition state change event") + Info("ODC Partition state changed") + + partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.State) + + payload := map[string]interface{}{ + "oldState": existingPartition.State, + "newState": partitionInfo.State, + "ecsState": partitionInfo.EcsState, + "partitionId": partitionInfo.PartitionId.String(), + "ddsSessionId": partitionInfo.DdsSessionId, + "ddsSessionStatus": partitionInfo.DdsSessionStatus, + } + payloadJson, _ := json.Marshal(payload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: "odc.partitionStateChanged", + EnvironmentId: id.String(), + Payload: string(payloadJson[:]), + }) + + envMan := environment.ManagerInstance() + if envMan != nil { + go envMan.NotifyIntegratedServiceEvent(&event.OdcPartitionStateChangeEvent{ + IntegratedServiceEventBase: common_event.IntegratedServiceEventBase{ServiceName: "ODC"}, + EnvironmentId: id, + State: partitionInfo.State, + EcsState: partitionInfo.EcsState, + }) + } else { + log.WithField("level", infologger.IL_Support). + WithField("partition", id.String()). + WithField("oldState", existingPartition.State). + WithField("state", partitionInfo.State). + Warn("could not notify environment manager of ODC partition state change event") + } } } } @@ -307,11 +362,14 @@ func (p *Plugin) GetData(_ []any) string { return "" } - partitionStates := make(map[string]string) + partitionStates := make(map[string]map[string]string) if r.Status == odc.ReplyStatus_SUCCESS { for id, partitionInfo := range r.Partitions { - partitionStates[id.String()] = partitionInfo.State + partitionStates[id.String()] = map[string]string{ + "state": partitionInfo.State, + "ecsState": partitionInfo.EcsState, + } } } p.cachedStatusMu.RUnlock() From 6161c3b0075c62ad8946481b21dcc69b10b86cd8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 11:16:54 +0200 Subject: [PATCH 1928/2352] [core] Move state and transition into their own sm package --- core/environment/environment.go | 15 ++-- core/environment/manager.go | 3 +- core/environment/transition_deploy.go | 7 +- core/environment/transition_reset.go | 10 ++- core/environment/transition_startactivity.go | 7 +- core/environment/transition_stopactivity.go | 7 +- core/task/manager.go | 9 +- core/task/{ => sm}/machine.go | 18 ++-- core/task/{ => sm}/state.go | 2 +- core/task/state_test.go | 51 +++++------ core/task/task.go | 11 +-- core/workflow/aggregatorrole.go | 3 +- core/workflow/callrole.go | 11 +-- core/workflow/includerole.go | 3 +- core/workflow/iteratorrole.go | 3 +- core/workflow/parentadapter.go | 36 ++++---- core/workflow/role.go | 7 +- core/workflow/role_test.go | 23 ++--- core/workflow/rolebase.go | 7 +- core/workflow/safestate.go | 23 ++--- core/workflow/safestate_test.go | 91 ++++++++++---------- core/workflow/taskrole.go | 9 +- 22 files changed, 189 insertions(+), 167 deletions(-) rename core/task/{ => sm}/machine.go (83%) rename core/task/{ => sm}/state.go (99%) diff --git a/core/environment/environment.go b/core/environment/environment.go index 25127d596..86148c9c1 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -47,6 +47,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/core/workflow/callable" @@ -1011,20 +1012,20 @@ func (env *Environment) setState(state string) { func (env *Environment) subscribeToWfState(taskman *task.Manager) { go func() { wf := env.Workflow() - notify := make(chan task.State) + notify := make(chan sm.State) subscriptionId := uuid.NewUUID().String() env.wfAdapter.SubscribeToStateChange(subscriptionId, notify) defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) env.unsubscribe = make(chan struct{}) wfState := wf.GetState() - if wfState != task.ERROR { + if wfState != sm.ERROR { handlingError := false WORKFLOW_STATE_LOOP: for { select { case wfState = <-notify: - if wfState == task.ERROR { + if wfState == sm.ERROR { if !handlingError { handlingError = true @@ -1047,9 +1048,9 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { if len(toStop) > 0 { taskmanMessage := task.NewTransitionTaskMessage( toStop, - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), + sm.RUNNING.String(), + sm.STOP.String(), + sm.CONFIGURED.String(), nil, env.Id(), ) @@ -1060,7 +1061,7 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { break WORKFLOW_STATE_LOOP } } - if wfState == task.DONE { + if wfState == sm.DONE { break WORKFLOW_STATE_LOOP } case <-env.unsubscribe: diff --git a/core/environment/manager.go b/core/environment/manager.go index e6b4ea089..8554b44f5 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -43,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" event2 "github.com/AliceO2Group/Control/core/integration/odc/event" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow" @@ -1084,7 +1085,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { Debug("received TASK_INTERNAL_ERROR event from task, trying to stop the run") if env.CurrentState() == "RUNNING" { go func() { - t.GetParent().UpdateState(task.ERROR) + t.GetParent().UpdateState(sm.ERROR) err = env.TryTransition(NewStopActivityTransition(envs.taskman)) if err != nil { log.WithPrefix("scheduler"). diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index db524bc91..3267ad08c 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/workflow" "github.com/hashicorp/go-multierror" @@ -184,7 +185,7 @@ func (t DeployTransition) do(env *Environment) (err error) { defer env.wfAdapter.UnsubscribeFromStatusChange(subscriptionId) // listen to workflow State changes - notifyState := make(chan task.State) + notifyState := make(chan sm.State) env.wfAdapter.SubscribeToStateChange(subscriptionId, notifyState) defer env.wfAdapter.UnsubscribeFromStateChange(subscriptionId) @@ -309,10 +310,10 @@ func (t DeployTransition) do(env *Environment) (err error) { // in the CreateEnvironment (environment/manager.go) and the lock in the `envman` is reserved for a sorter period, which allows operations like // `environment list` to be done almost immediately after mesos informs with TASK_FAILED. case wfState := <-notifyState: - if wfState == task.ERROR { + if wfState == sm.ERROR { failedRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { - if st := role.GetState(); st == task.ERROR { + if st := role.GetState(); st == sm.ERROR { detector, ok := role.GetUserVars().Get("detector") if !ok { detector = "" diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index a1f8a0c54..fd9642dfa 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -26,8 +26,10 @@ package environment import ( "errors" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" ) @@ -51,9 +53,9 @@ func (t ResetTransition) do(env *Environment) (err error) { taskmanMessage := task.NewTransitionTaskMessage( workflow.GetActiveTasks(env.Workflow()), - task.CONFIGURED.String(), - task.RESET.String(), - task.STANDBY.String(), + sm.CONFIGURED.String(), + sm.RESET.String(), + sm.STANDBY.String(), nil, env.Id(), ) @@ -61,7 +63,7 @@ func (t ResetTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition - if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { return tasksStateErrors } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index cd9d6a52b..a7a4b9054 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -28,6 +28,7 @@ import ( "errors" "strconv" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/common/event" @@ -103,9 +104,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { taskmanMessage := task.NewTransitionTaskMessage( workflow.GetActiveTasks(env.Workflow()), - task.CONFIGURED.String(), - task.START.String(), - task.RUNNING.String(), + sm.CONFIGURED.String(), + sm.START.String(), + sm.RUNNING.String(), args, env.Id(), ) diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index beac1de34..bbf733eca 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -31,6 +31,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" "github.com/iancoleman/strcase" ) @@ -73,9 +74,9 @@ func (t StopActivityTransition) do(env *Environment) (err error) { taskmanMessage := task.NewTransitionTaskMessage( workflow.GetActiveTasks(env.Workflow()), - task.RUNNING.String(), - task.STOP.String(), - task.CONFIGURED.String(), + sm.RUNNING.String(), + sm.STOP.String(), + sm.CONFIGURED.String(), args, env.Id(), ) diff --git a/core/task/manager.go b/core/task/manager.go index fbe527773..3cd99c933 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/repos" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/AliceO2Group/Control/core/the" @@ -169,7 +170,7 @@ func (m *Manager) newTaskForMesosOffer( executorId: executorId.Value, GetTaskClass: nil, localBindMap: nil, - state: STANDBY, + state: sm.STANDBY, status: INACTIVE, } t.GetTaskClass = func() *taskclass.Class { @@ -693,9 +694,9 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). Debug("generated inbound bindMap for environment configuration") - src := STANDBY.String() + src := sm.STANDBY.String() event := "CONFIGURE" - dest := CONFIGURED.String() + dest := sm.CONFIGURED.String() args := make(controlcommands.PropertyMapsMap) args, err = tasks.BuildPropertyMaps(bindMap) if err != nil { @@ -928,7 +929,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { return } - st := StateFromString(state) + st := sm.StateFromString(state) taskPtr.state = st taskPtr.safeToStop = false taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) diff --git a/core/task/machine.go b/core/task/sm/machine.go similarity index 83% rename from core/task/machine.go rename to core/task/sm/machine.go index 66c01120e..7287714ef 100644 --- a/core/task/machine.go +++ b/core/task/sm/machine.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package task +package sm type Transition struct { Evt Event @@ -32,15 +32,17 @@ type Transition struct { } type Event string + const ( - CONFIGURE = Event("CONFIGURE") - RESET = Event("RESET") - START = Event("START") - STOP = Event("STOP") - EXIT = Event("EXIT") - GO_ERROR = Event("GO_ERROR") - RECOVER = Event("RECOVER") + CONFIGURE = Event("CONFIGURE") + RESET = Event("RESET") + START = Event("START") + STOP = Event("STOP") + EXIT = Event("EXIT") + GO_ERROR = Event("GO_ERROR") + RECOVER = Event("RECOVER") ) + func (e Event) String() string { return string(e) } diff --git a/core/task/state.go b/core/task/sm/state.go similarity index 99% rename from core/task/state.go rename to core/task/sm/state.go index cdf5e8215..4d13fa288 100644 --- a/core/task/state.go +++ b/core/task/sm/state.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package task +package sm type State int diff --git a/core/task/state_test.go b/core/task/state_test.go index 345375dd4..01d81135c 100644 --- a/core/task/state_test.go +++ b/core/task/state_test.go @@ -1,22 +1,23 @@ package task_test import ( - "github.com/AliceO2Group/Control/core/task" + "testing" + + "github.com/AliceO2Group/Control/core/task/sm" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" - "testing" ) var _ = Describe("task state", func() { Describe("enumerated state to string conversion", func() { When("a State is one of the variant states", func() { It("should be converted literally", func() { - Expect(task.CONFIGURED.String()).To(Equal("CONFIGURED")) + Expect(sm.CONFIGURED.String()).To(Equal("CONFIGURED")) }) }) When("a State is invariant", func() { It("should be converted to UNKNOWN", func() { - Expect(task.INVARIANT.String()).To(Equal("UNKNOWN")) + Expect(sm.INVARIANT.String()).To(Equal("UNKNOWN")) }) }) }) @@ -24,12 +25,12 @@ var _ = Describe("task state", func() { Describe("string state to enum conversion", func() { When("a State is one of the variant states", func() { It("should be converted literally", func() { - Expect(task.StateFromString("CONFIGURED")).To(Equal(task.CONFIGURED)) + Expect(sm.StateFromString("CONFIGURED")).To(Equal(sm.CONFIGURED)) }) }) When("a State is wrong", func() { It("should be converted to UNKNOWN", func() { - Expect(task.StateFromString("NEVADA")).To(Equal(task.UNKNOWN)) + Expect(sm.StateFromString("NEVADA")).To(Equal(sm.UNKNOWN)) }) }) }) @@ -37,46 +38,46 @@ var _ = Describe("task state", func() { Describe("state multiplication", func() { When("the states are equal", func() { It("returns the same state", func() { - Expect(task.UNKNOWN.X(task.UNKNOWN)).To(Equal(task.UNKNOWN)) - Expect(task.RUNNING.X(task.RUNNING)).To(Equal(task.RUNNING)) - Expect(task.INVARIANT.X(task.INVARIANT)).To(Equal(task.INVARIANT)) + Expect(sm.UNKNOWN.X(sm.UNKNOWN)).To(Equal(sm.UNKNOWN)) + Expect(sm.RUNNING.X(sm.RUNNING)).To(Equal(sm.RUNNING)) + Expect(sm.INVARIANT.X(sm.INVARIANT)).To(Equal(sm.INVARIANT)) }) }) When("one of the states is ERROR", func() { It("returns ERROR", func() { - Expect(task.ERROR.X(task.UNKNOWN)).To(Equal(task.ERROR)) - Expect(task.ERROR.X(task.RUNNING)).To(Equal(task.ERROR)) - Expect(task.ERROR.X(task.INVARIANT)).To(Equal(task.ERROR)) + Expect(sm.ERROR.X(sm.UNKNOWN)).To(Equal(sm.ERROR)) + Expect(sm.ERROR.X(sm.RUNNING)).To(Equal(sm.ERROR)) + Expect(sm.ERROR.X(sm.INVARIANT)).To(Equal(sm.ERROR)) - Expect(task.UNKNOWN.X(task.ERROR)).To(Equal(task.ERROR)) - Expect(task.RUNNING.X(task.ERROR)).To(Equal(task.ERROR)) - Expect(task.INVARIANT.X(task.ERROR)).To(Equal(task.ERROR)) + Expect(sm.UNKNOWN.X(sm.ERROR)).To(Equal(sm.ERROR)) + Expect(sm.RUNNING.X(sm.ERROR)).To(Equal(sm.ERROR)) + Expect(sm.INVARIANT.X(sm.ERROR)).To(Equal(sm.ERROR)) }) }) When("One of the states is INVARIANT", func() { It("returns the non-invariant state", func() { - Expect(task.INVARIANT.X(task.UNKNOWN)).To(Equal(task.UNKNOWN)) - Expect(task.INVARIANT.X(task.RUNNING)).To(Equal(task.RUNNING)) - Expect(task.UNKNOWN.X(task.INVARIANT)).To(Equal(task.UNKNOWN)) - Expect(task.RUNNING.X(task.INVARIANT)).To(Equal(task.RUNNING)) - Expect(task.DONE.X(task.INVARIANT)).To(Equal(task.DONE)) - Expect(task.MIXED.X(task.INVARIANT)).To(Equal(task.MIXED)) - Expect(task.ERROR.X(task.INVARIANT)).To(Equal(task.ERROR)) + Expect(sm.INVARIANT.X(sm.UNKNOWN)).To(Equal(sm.UNKNOWN)) + Expect(sm.INVARIANT.X(sm.RUNNING)).To(Equal(sm.RUNNING)) + Expect(sm.UNKNOWN.X(sm.INVARIANT)).To(Equal(sm.UNKNOWN)) + Expect(sm.RUNNING.X(sm.INVARIANT)).To(Equal(sm.RUNNING)) + Expect(sm.DONE.X(sm.INVARIANT)).To(Equal(sm.DONE)) + Expect(sm.MIXED.X(sm.INVARIANT)).To(Equal(sm.MIXED)) + Expect(sm.ERROR.X(sm.INVARIANT)).To(Equal(sm.ERROR)) }) }) When("If both states are INVARIANT", func() { It("returns the INVARIANT state", func() { - Expect(task.INVARIANT.X(task.INVARIANT)).To(Equal(task.INVARIANT)) + Expect(sm.INVARIANT.X(sm.INVARIANT)).To(Equal(sm.INVARIANT)) }) }) When("The states are concrete, but different", func() { It("returns MIXED", func() { - Expect(task.UNKNOWN.X(task.STANDBY)).To(Equal(task.MIXED)) - Expect(task.RUNNING.X(task.CONFIGURED)).To(Equal(task.MIXED)) + Expect(sm.UNKNOWN.X(sm.STANDBY)).To(Equal(sm.MIXED)) + Expect(sm.RUNNING.X(sm.CONFIGURED)).To(Equal(sm.MIXED)) }) }) }) diff --git a/core/task/task.go b/core/task/task.go index 226cf54ce..146b1b89c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -50,6 +50,7 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/AliceO2Group/Control/core/the" @@ -62,7 +63,7 @@ var log = logger.New(logrus.StandardLogger(), "task") type parentRole interface { UpdateStatus(Status) - UpdateState(State) + UpdateState(sm.State) GetPath() string GetTaskClass() string GetTaskTraits() Traits @@ -121,7 +122,7 @@ type Task struct { localBindMap channel.BindMap status Status - state State + state sm.State safeToStop bool properties gera.StringMap @@ -137,9 +138,9 @@ func (t *Task) IsSafeToStop() bool { t.mu.RLock() defer t.mu.RUnlock() if t.GetControlMode() != controlmode.BASIC { - return t.state == RUNNING + return t.state == sm.RUNNING } - return t.state == RUNNING && t.safeToStop + return t.state == sm.RUNNING && t.safeToStop } func (t *Task) SetSafeToStop(done bool) { @@ -186,7 +187,7 @@ func (t *Task) isLocked() bool { func (t *Task) IsClaimable() bool { t.mu.RLock() defer t.mu.RUnlock() - return !t.isLocked() && t.status == ACTIVE && t.state == STANDBY + return !t.isLocked() && t.status == ACTIVE && t.state == sm.STANDBY } func (t *Task) GetName() string { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 78a94d330..4446e5dcc 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/the" "github.com/gobwas/glob" "github.com/hashicorp/go-multierror" @@ -272,7 +273,7 @@ func (r *aggregatorRole) updateStatus(s task.Status) { } } -func (r *aggregatorRole) updateState(s task.State) { +func (r *aggregatorRole) updateState(s sm.State) { if r == nil { return } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 342fbffdc..ddbb06c19 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -31,6 +31,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" @@ -206,7 +207,7 @@ func (t *callRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t *callRole) UpdateState(s task.State) { +func (t *callRole) UpdateState(s sm.State) { t.updateState(s) } @@ -232,7 +233,7 @@ func (t *callRole) updateStatus(s task.Status) { t.parent.updateStatus(s) } -func (t *callRole) updateState(s task.State) { +func (t *callRole) updateState(s sm.State) { oldState := t.state.get() if t.parent == nil { log.WithField("state", s.String()). @@ -251,7 +252,7 @@ func (t *callRole) updateState(s task.State) { RolePath: t.GetPath(), EnvironmentId: t.GetEnvironmentId().String(), }) - if t.state.get() == task.ERROR { + if t.state.get() == sm.ERROR { log.WithField("partition", t.GetEnvironmentId().String()). WithField("level", infologger.IL_Support). WithField("role", t.Name). @@ -291,7 +292,7 @@ func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMa return make(callable.HooksMap) } - defer t.updateState(task.INVARIANT) + defer t.updateState(sm.INVARIANT) // If a trigger is defined for this role && // If the input trigger is empty OR a positive match... @@ -307,7 +308,7 @@ func (t *callRole) GetHooksMapForTrigger(trigger string) (hooks callable.HooksMa } func (t *callRole) GetAllHooks() callable.Hooks { - defer t.updateState(task.INVARIANT) + defer t.updateState(sm.INVARIANT) // If a trigger is defined for this role if len(t.Trigger) > 0 { diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index c7707d690..3e9f4717e 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -32,6 +32,7 @@ import ( "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/the" ) @@ -175,7 +176,7 @@ func (r *includeRole) UpdateStatus(s task.Status) { r.updateStatus(s) } -func (r *includeRole) UpdateState(s task.State) { +func (r *includeRole) UpdateState(s sm.State) { r.updateState(s) } diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index ea1e55abd..3f3f51151 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/gobwas/glob" "github.com/hashicorp/go-multierror" "github.com/spf13/viper" @@ -334,7 +335,7 @@ func (i *iteratorRole) GetStatus() task.Status { panic("implement me") } -func (i *iteratorRole) GetState() task.State { +func (i *iteratorRole) GetState() sm.State { panic("implement me") } diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 92bcbad79..1ffe5c3b9 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -27,11 +27,12 @@ package workflow import ( "sync" - "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/sm" ) type GetEnvIdFunc func() uid.ID @@ -43,16 +44,16 @@ type GetStringMapFunc func() gera.StringMap type SendEvents func(event.Event) type ParentAdapter struct { - mu sync.Mutex - getEnvIdFunc GetEnvIdFunc + mu sync.Mutex + getEnvIdFunc GetEnvIdFunc getCurrentRunNumberFunc GetCurrentRunNumberFunc getDefaultsFunc GetStringMapFunc - getVarsFunc GetStringMapFunc + getVarsFunc GetStringMapFunc getUserVarsFunc GetStringMapFunc - SendEvents SendEvents + SendEvents SendEvents - stateSubscriptions map[string]chan task.State + stateSubscriptions map[string]chan sm.State statusSubscriptions map[string]chan task.Status } @@ -63,18 +64,18 @@ func NewParentAdapter(getEnvId GetEnvIdFunc, getUserVars GetStringMapFunc, SendEvents SendEvents) *ParentAdapter { return &ParentAdapter{ - getEnvIdFunc: getEnvId, + getEnvIdFunc: getEnvId, getCurrentRunNumberFunc: getCurrentRunNumber, - getDefaultsFunc: getDefaults, - getVarsFunc: getVars, - getUserVarsFunc: getUserVars, - SendEvents: SendEvents, - stateSubscriptions: make(map[string]chan task.State), - statusSubscriptions: make(map[string]chan task.Status, 0), + getDefaultsFunc: getDefaults, + getVarsFunc: getVars, + getUserVarsFunc: getUserVars, + SendEvents: SendEvents, + stateSubscriptions: make(map[string]chan sm.State), + statusSubscriptions: make(map[string]chan task.Status, 0), } } -func (p *ParentAdapter) SubscribeToStateChange(subscriptionId string, c chan task.State) { +func (p *ParentAdapter) SubscribeToStateChange(subscriptionId string, c chan sm.State) { p.mu.Lock() defer p.mu.Unlock() p.stateSubscriptions[subscriptionId] = c @@ -98,7 +99,7 @@ func (p *ParentAdapter) UnsubscribeFromStatusChange(subscriptionId string) { delete(p.statusSubscriptions, subscriptionId) } -func (p *ParentAdapter) updateState(s task.State) { +func (p *ParentAdapter) updateState(s sm.State) { p.mu.Lock() defer p.mu.Unlock() for _, ch := range p.stateSubscriptions { @@ -124,7 +125,6 @@ func (p *ParentAdapter) GetParent() Updatable { return nil } - func (p *ParentAdapter) GetEnvironmentId() uid.ID { return p.getEnvIdFunc() } @@ -154,9 +154,9 @@ func (*ParentAdapter) CollectInboundChannels() []channel.Inbound { } func (p *ParentAdapter) SendEvent(ev event.Event) { - p.SendEvents(ev) + p.SendEvents(ev) } func (p *ParentAdapter) GetCurrentRunNumber() uint32 { return p.getCurrentRunNumberFunc() -} \ No newline at end of file +} diff --git a/core/workflow/role.go b/core/workflow/role.go index 8bde99c3e..6f85a0951 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/constraint" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/gobwas/glob" ) @@ -50,7 +51,7 @@ type Role interface { GetPath() string GetName() string GetStatus() task.Status - GetState() task.State + GetState() sm.State GetTasks() task.Tasks GetTaskClasses() []string GenerateTaskDescriptors() task.Descriptors @@ -74,14 +75,14 @@ type Role interface { type PublicUpdatable interface { UpdateStatus(s task.Status) - UpdateState(s task.State) + UpdateState(s sm.State) } type Updatable interface { VarNode GetParent() Updatable updateStatus(s task.Status) - updateState(s task.State) //string? + updateState(s sm.State) //string? GetEnvironmentId() uid.ID GetPath() string CollectOutboundChannels() []channel.Outbound diff --git a/core/workflow/role_test.go b/core/workflow/role_test.go index f90f5d2a3..3deaf6674 100644 --- a/core/workflow/role_test.go +++ b/core/workflow/role_test.go @@ -2,12 +2,13 @@ package workflow import ( "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) func complexRoleTree() (root Role, leaves map[string]Role) { - defaultState := task.RUNNING + defaultState := sm.RUNNING call1 := &callRole{ roleBase: roleBase{Name: "call1", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: true}} @@ -47,7 +48,7 @@ func complexRoleTree() (root Role, leaves map[string]Role) { }, }, &aggregatorRole{ - roleBase{Name: "agg2", state: SafeState{state: task.INVARIANT}}, + roleBase{Name: "agg2", state: SafeState{state: sm.INVARIANT}}, aggregator{ Roles: []Role{agg2task_noncritical}, }, @@ -70,8 +71,8 @@ func complexRoleTree() (root Role, leaves map[string]Role) { var _ = Describe("role", func() { Describe("state propagation across roles", func() { - const defaultState = task.RUNNING - const otherHealthyState = task.CONFIGURED + const defaultState = sm.RUNNING + const otherHealthyState = sm.CONFIGURED Context("simple aggregator role", func() { var root Role @@ -101,14 +102,14 @@ var _ = Describe("role", func() { // the aggregator role is expected to be in INVARIANT, because there are no critical roles inside, // thus nothing to affect the state of the role root = &aggregatorRole{ - roleBase{Name: "agg1", state: SafeState{state: task.INVARIANT}}, + roleBase{Name: "agg1", state: SafeState{state: sm.INVARIANT}}, aggregator{ Roles: []Role{task1}, }, } LinkChildrenToParents(root) task1.UpdateState(otherHealthyState) - Expect(root.GetState()).To(Equal(task.INVARIANT)) + Expect(root.GetState()).To(Equal(sm.INVARIANT)) }) }) When("one of critical tasks in an aggregator role changes to a different state", func() { @@ -130,7 +131,7 @@ var _ = Describe("role", func() { } LinkChildrenToParents(root) task1.UpdateState(otherHealthyState) - Expect(root.GetState()).To(Equal(task.MIXED)) + Expect(root.GetState()).To(Equal(sm.MIXED)) }) }) When("a non-critical task in an aggregator role (with another critical task) changes to a different state", func() { @@ -165,13 +166,13 @@ var _ = Describe("role", func() { When("one of the critical tasks moves to a different state than the rest", func() { It("should make the root role report MIXED", func() { leaves["agg1task_critical"].(*taskRole).UpdateState(otherHealthyState) - Expect(root.GetState()).To(Equal(task.MIXED)) + Expect(root.GetState()).To(Equal(sm.MIXED)) }) }) When("one of the critical tasks moves to ERROR", func() { It("should make the root role report ERROR", func() { - leaves["agg1task_critical"].(*taskRole).UpdateState(task.ERROR) - Expect(root.GetState()).To(Equal(task.ERROR)) + leaves["agg1task_critical"].(*taskRole).UpdateState(sm.ERROR) + Expect(root.GetState()).To(Equal(sm.ERROR)) }) }) When("one of the non-critical tasks, which is aggregated with a critical task, moves to a different healthy state than the rest", func() { @@ -188,7 +189,7 @@ var _ = Describe("role", func() { }) When("one of the non-critical tasks moves to ERROR", func() { It("should not influence the root role state", func() { - leaves["agg1task_noncritical"].(*taskRole).UpdateState(task.ERROR) + leaves["agg1task_noncritical"].(*taskRole).UpdateState(sm.ERROR) Expect(root.GetState()).To(Equal(defaultState)) }) }) diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index b7e40452d..87951cc24 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -34,6 +34,7 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/configuration/template" "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/sirupsen/logrus" "github.com/AliceO2Group/Control/core/task" @@ -231,7 +232,7 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) UserVars: nil, Locals: make(map[string]string), status: SafeStatus{status: task.INACTIVE}, - state: SafeState{state: task.STANDBY}, + state: SafeState{state: sm.STANDBY}, Enabled: "true", } err = unmarshal(&role) @@ -435,9 +436,9 @@ func (r *roleBase) GetStatus() task.Status { return r.status.get() } -func (r *roleBase) GetState() task.State { +func (r *roleBase) GetState() sm.State { if r == nil { - return task.UNKNOWN + return sm.UNKNOWN } return r.state.get() } diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 03cb0fa25..86c4f1197 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -25,17 +25,18 @@ package workflow import ( - "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" + "sync" ) type SafeState struct { mu sync.RWMutex - state task.State + state sm.State } -func aggregateState(roles []Role) (state task.State) { - state = task.INVARIANT +func aggregateState(roles []Role) (s sm.State) { + s = sm.INVARIANT if len(roles) == 0 { return } @@ -51,12 +52,12 @@ func aggregateState(roles []Role) (state task.State) { continue } } - state = state.X(c.GetState()) + s = s.X(c.GetState()) } return } -func (t *SafeState) merge(s task.State, r Role) { +func (t *SafeState) merge(s sm.State, r Role) { t.mu.Lock() defer t.mu.Unlock() if t.state == s { @@ -71,11 +72,11 @@ func (t *SafeState) merge(s task.State, r Role) { } switch { - case s == task.MIXED && t.state != task.ERROR: - t.state = task.MIXED + case s == sm.MIXED && t.state != sm.ERROR: + t.state = sm.MIXED return - case s == task.ERROR: - t.state = task.ERROR + case s == sm.ERROR: + t.state = sm.ERROR return default: allRoles := r.GetRoles() @@ -83,7 +84,7 @@ func (t *SafeState) merge(s task.State, r Role) { } } -func (t *SafeState) get() task.State { +func (t *SafeState) get() sm.State { t.mu.RLock() defer t.mu.RUnlock() return t.state diff --git a/core/workflow/safestate_test.go b/core/workflow/safestate_test.go index 7357332a5..22ccd4061 100644 --- a/core/workflow/safestate_test.go +++ b/core/workflow/safestate_test.go @@ -2,6 +2,7 @@ package workflow import ( "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -11,32 +12,32 @@ var _ = Describe("safe state", func() { When("the state we are updating belongs to a role which is a leaf in the tree", func() { It("should be overwritten", func() { cr := &callRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } - cr.state.merge(task.RUNNING, cr) - Expect(cr.GetState()).To(Equal(task.RUNNING)) + cr.state.merge(sm.RUNNING, cr) + Expect(cr.GetState()).To(Equal(sm.RUNNING)) tr := &taskRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } - tr.state.merge(task.RUNNING, tr) - Expect(tr.GetState()).To(Equal(task.RUNNING)) + tr.state.merge(sm.RUNNING, tr) + Expect(tr.GetState()).To(Equal(sm.RUNNING)) }) }) When("the state is healthy and is merged with ERROR state", func() { It("should become ERROR", func() { - ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}} - ar.state.merge(task.ERROR, ar) - Expect(ar.GetState()).To(Equal(task.ERROR)) + ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}} + ar.state.merge(sm.ERROR, ar) + Expect(ar.GetState()).To(Equal(sm.ERROR)) }) }) When("the state is MIXED and is merged with ERROR state", func() { It("should become ERROR", func() { - ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.MIXED}}} - ar.state.merge(task.ERROR, ar) - Expect(ar.GetState()).To(Equal(task.ERROR)) + ar := &aggregatorRole{roleBase: roleBase{state: SafeState{state: sm.MIXED}}} + ar.state.merge(sm.ERROR, ar) + Expect(ar.GetState()).To(Equal(sm.ERROR)) }) }) When("the role has at least two sub-roles, the state is ERROR and is merged with MIXED state", func() { @@ -45,118 +46,118 @@ var _ = Describe("safe state", func() { // it should not invalidate the ERROR state. subroles := make([]Role, 2) subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } subroles[1] = &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.MIXED}}, + roleBase: roleBase{state: SafeState{state: sm.MIXED}}, } ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.MIXED, ar) - Expect(ar.GetState()).To(Equal(task.ERROR)) + ar.state.merge(sm.MIXED, ar) + Expect(ar.GetState()).To(Equal(sm.ERROR)) }) }) When("the role has one sub-role, the state is ERROR and is merged with MIXED state", func() { It("should become MIXED", func() { subroles := make([]Role, 1) - subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.MIXED}}} + subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: sm.MIXED}}} ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.MIXED, ar) - Expect(ar.GetState()).To(Equal(task.MIXED)) + ar.state.merge(sm.MIXED, ar) + Expect(ar.GetState()).To(Equal(sm.MIXED)) }) }) When("the role has one sub-role, the state is ERROR and is merged with a healthy state", func() { It("should return to the healthy state", func() { subroles := make([]Role, 1) - subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}} + subroles[0] = &aggregatorRole{roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}} ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.CONFIGURED, ar) - Expect(ar.GetState()).To(Equal(task.CONFIGURED)) + ar.state.merge(sm.CONFIGURED, ar) + Expect(ar.GetState()).To(Equal(sm.CONFIGURED)) }) }) When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state", func() { It("should move to the corresponding healthy state", func() { subroles := make([]Role, 2) subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } subroles[1] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.CONFIGURED, ar) - Expect(ar.GetState()).To(Equal(task.CONFIGURED)) + ar.state.merge(sm.CONFIGURED, ar) + Expect(ar.GetState()).To(Equal(sm.CONFIGURED)) }) }) When("the role has at least two sub-roles in MIXED, the state is ERROR and is merged with MIXED state", func() { It("should move to MIXED", func() { subroles := make([]Role, 2) subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.MIXED}}, + roleBase: roleBase{state: SafeState{state: sm.MIXED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } subroles[1] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.MIXED}}, + roleBase: roleBase{state: SafeState{state: sm.MIXED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.MIXED, ar) - Expect(ar.GetState()).To(Equal(task.MIXED)) + ar.state.merge(sm.MIXED, ar) + Expect(ar.GetState()).To(Equal(sm.MIXED)) }) }) When("the role has at least two sub-roles, state is ERROR and is merged with a healthy state, but other sub-role stays in ERROR", func() { It("should stay in ERROR", func() { subroles := make([]Role, 2) subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } subroles[1] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.CONFIGURED}}, + roleBase: roleBase{state: SafeState{state: sm.CONFIGURED}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.ERROR}}, + roleBase: roleBase{state: SafeState{state: sm.ERROR}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.STANDBY, ar) - Expect(ar.GetState()).To(Equal(task.ERROR)) + ar.state.merge(sm.STANDBY, ar) + Expect(ar.GetState()).To(Equal(sm.ERROR)) }) }) When("the role has at least two sub-roles, the state is healthy and one of critical sub-roles enters a different state than the other", func() { It("should enter MIXED", func() { subroles := make([]Role, 2) subroles[0] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.RUNNING}}, + roleBase: roleBase{state: SafeState{state: sm.RUNNING}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } subroles[1] = &taskRole{ - roleBase: roleBase{state: SafeState{state: task.DONE}}, + roleBase: roleBase{state: SafeState{state: sm.DONE}}, Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, } ar := &aggregatorRole{ - roleBase: roleBase{state: SafeState{state: task.RUNNING}}, + roleBase: roleBase{state: SafeState{state: sm.RUNNING}}, aggregator: aggregator{subroles}, } - ar.state.merge(task.DONE, ar) - Expect(ar.GetState()).To(Equal(task.MIXED)) + ar.state.merge(sm.DONE, ar) + Expect(ar.GetState()).To(Equal(sm.MIXED)) }) }) }) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index 9ab45dc6d..bbeaf3e38 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -31,6 +31,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" @@ -210,7 +211,7 @@ func (t *taskRole) UpdateStatus(s task.Status) { t.updateStatus(s) } -func (t *taskRole) UpdateState(s task.State) { +func (t *taskRole) UpdateState(s sm.State) { t.updateState(s) } @@ -236,7 +237,7 @@ func (t *taskRole) updateStatus(s task.Status) { t.parent.updateStatus(s) } -func (t *taskRole) updateState(s task.State) { +func (t *taskRole) updateState(s sm.State) { oldState := t.state.get() if t.parent == nil { log.WithField("state", s.String()). @@ -255,7 +256,7 @@ func (t *taskRole) updateState(s task.State) { RolePath: t.GetPath(), EnvironmentId: t.GetEnvironmentId().String(), }) - if t.state.get() == task.ERROR { + if t.state.get() == sm.ERROR { log.WithField("partition", t.GetEnvironmentId().String()). WithField("level", infologger.IL_Support). WithField("role", t.Name). @@ -283,7 +284,7 @@ func (t *taskRole) copy() copyable { Traits: t.Traits, } rCopy.status = SafeStatus{status: task.INACTIVE} - rCopy.state = SafeState{state: task.STANDBY} + rCopy.state = SafeState{state: sm.STANDBY} return &rCopy } From 255a154ff114f5b59cffebeeb484ce8ecbe5db31 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 11:17:43 +0200 Subject: [PATCH 1929/2352] [core] Account for unlikely ODC state "OK" --- core/integration/odc/fairmq/fairmq.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/core/integration/odc/fairmq/fairmq.go b/core/integration/odc/fairmq/fairmq.go index 88903730d..96ca4b654 100644 --- a/core/integration/odc/fairmq/fairmq.go +++ b/core/integration/odc/fairmq/fairmq.go @@ -24,6 +24,8 @@ package fairmq +import "github.com/AliceO2Group/Control/core/task/sm" + var ( fairMqStateMap map[string]string ) @@ -48,6 +50,8 @@ func init() { "RESETTING TASK": "CONFIGURED", "DEVICE READY RESETTING": "CONFIGURED", // needs special case "RESETTING DEVICE": "CONFIGURED", + + "OK": "UNKNOWN", // should never happen } } @@ -78,3 +82,7 @@ func ToEcsState(fairMqState, previousFairMqState string) string { } return toEcsState(odcStateToConvert) } + +func ToECSState(fairMqState string, previousEcsState sm.State) string { + return "OK" +} From 5b01544802b12891704ac19f7a4af5a88c5aaa26 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 11:18:59 +0200 Subject: [PATCH 1930/2352] [core] Consistent variable naming --- core/integration/odc/plugin.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 157e3b03b..645b4842a 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -260,16 +260,16 @@ func (p *Plugin) queryPartitionStatus() { // detection of device state change + event publication for deviceId, device := range partitionInfo.Devices { - oldDevice, hasDevice := existingPartition.Devices[deviceId] + existingDevice, hasDevice := existingPartition.Devices[deviceId] oldState := "" // we presume the task didn't exist before // if a device with this ID is already known to us from before if hasDevice { // if device state has changed - if oldDevice.State != device.State { + if existingDevice.State != device.State { // if the state has changed, we take note of the previous state - oldState = oldDevice.State + oldState = existingDevice.State } else { // if the state hasn't changed, we bail continue From a68ec060ab37bd2fce9f6c760ab0a1f6bc76b6fe Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 13:58:11 +0200 Subject: [PATCH 1931/2352] [core] New ODC-ECS state mapping, based on previous ECS state --- core/integration/odc/fairmq/fairmq.go | 68 ++++++++++----------------- core/integration/odc/plugin.go | 33 +++++++------ 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/core/integration/odc/fairmq/fairmq.go b/core/integration/odc/fairmq/fairmq.go index 96ca4b654..b5177937a 100644 --- a/core/integration/odc/fairmq/fairmq.go +++ b/core/integration/odc/fairmq/fairmq.go @@ -27,62 +27,42 @@ package fairmq import "github.com/AliceO2Group/Control/core/task/sm" var ( - fairMqStateMap map[string]string + fairMqStateMap map[string]sm.State ) func init() { // see https://github.com/FairRootGroup/FairMQ/blob/master/docs/images/device_states.svg - fairMqStateMap = map[string]string{ - "IDLE": "STANDBY", - "READY": "CONFIGURED", - "RUNNING": "RUNNING", - "ERROR": "ERROR", - "EXITING": "DONE", + fairMqStateMap = map[string]sm.State{ + "IDLE": sm.STANDBY, + "READY": sm.CONFIGURED, + "RUNNING": sm.RUNNING, + "ERROR": sm.ERROR, + "EXITING": sm.DONE, - "INITIALIZING DEVICE": "STANDBY", - "INITIALIZED": "STANDBY", - "BINDING": "STANDBY", - "BOUND": "STANDBY", - "CONNECTING": "STANDBY", - "DEVICE READY CONFIGURING": "STANDBY", // needs special case - "INITIALIZING TASK": "STANDBY", - - "RESETTING TASK": "CONFIGURED", - "DEVICE READY RESETTING": "CONFIGURED", // needs special case - "RESETTING DEVICE": "CONFIGURED", - - "OK": "UNKNOWN", // should never happen + "INITIALIZING DEVICE": sm.INVARIANT, + "INITIALIZED": sm.INVARIANT, + "BINDING": sm.INVARIANT, + "BOUND": sm.INVARIANT, + "CONNECTING": sm.INVARIANT, + "DEVICE READY": sm.INVARIANT, + "INITIALIZING TASK": sm.INVARIANT, + "RESETTING TASK": sm.INVARIANT, + "RESETTING DEVICE": sm.INVARIANT, + "OK": sm.INVARIANT, } } -func toEcsState(fairMqState string) string { +func toEcsState(fairMqState string) sm.State { if newEcsState, has := fairMqStateMap[fairMqState]; has { return newEcsState } - return "UNKNOWN" + return sm.UNKNOWN } -func ToEcsState(fairMqState, previousFairMqState string) string { - odcStateToConvert := fairMqState - // special case for DEVICE READY - if odcStateToConvert == "DEVICE READY" { - if previousFairMqState == "CONNECTING" || - previousFairMqState == "BOUND" || - previousFairMqState == "BINDING" || - previousFairMqState == "INITIALIZED" || - previousFairMqState == "INITIALIZING DEVICE" || - previousFairMqState == "IDLE" { - odcStateToConvert += " CONFIGURING" - } else if previousFairMqState == "RESETTING TASK" || - previousFairMqState == "READY" { - odcStateToConvert += " RESETTING" - } else { - return "UNKNOWN" - } +func ToEcsState(fairMqState string, previousEcsState sm.State) sm.State { + if ecsState := toEcsState(fairMqState); ecsState != sm.INVARIANT { + return ecsState + } else { + return previousEcsState } - return toEcsState(odcStateToConvert) -} - -func ToECSState(fairMqState string, previousEcsState sm.State) string { - return "OK" } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 645b4842a..9d62335c7 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -50,6 +50,7 @@ import ( "github.com/AliceO2Group/Control/core/integration/odc/event" "github.com/AliceO2Group/Control/core/integration/odc/fairmq" odc "github.com/AliceO2Group/Control/core/integration/odc/protos" + "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/the" "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/spf13/viper" @@ -94,7 +95,7 @@ type OdcPartitionInfo struct { PartitionId uid.ID `json:"-"` RunNumber uint32 `json:"runNumber"` State string `json:"state"` - EcsState string `json:"ecsState"` + EcsState sm.State `json:"ecsState"` DdsSessionId string `json:"ddsSessionId"` DdsSessionStatus string `json:"ddsSessionStatus"` Devices map[uint64]OdcDevice `json:"devices"` @@ -102,12 +103,12 @@ type OdcPartitionInfo struct { } type OdcDevice struct { - TaskId string `json:"taskId"` - State string `json:"state"` - EcsState string `json:"ecsState"` - Path string `json:"path"` - Ignored bool `json:"ignored"` - Host string `json:"host"` + TaskId string `json:"taskId"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + Path string `json:"path"` + Ignored bool `json:"ignored"` + Host string `json:"host"` } func NewPlugin(endpoint string) integration.Plugin { @@ -262,26 +263,25 @@ func (p *Plugin) queryPartitionStatus() { for deviceId, device := range partitionInfo.Devices { existingDevice, hasDevice := existingPartition.Devices[deviceId] - oldState := "" // we presume the task didn't exist before + oldEcsState := sm.UNKNOWN // we presume the task didn't exist before // if a device with this ID is already known to us from before if hasDevice { // if device state has changed if existingDevice.State != device.State { // if the state has changed, we take note of the previous state - oldState = existingDevice.State + oldEcsState = existingDevice.EcsState } else { // if the state hasn't changed, we bail continue } } - device.EcsState = fairmq.ToEcsState(device.State, oldState) + device.EcsState = fairmq.ToEcsState(device.State, oldEcsState) // since the odc-state of the task has changed, we must publish the event payload := map[string]interface{}{ - "oldState": oldState, - "newState": device.State, + "state": device.State, "ecsState": device.EcsState, "taskId": device.TaskId, "path": device.Path, @@ -308,11 +308,10 @@ func (p *Plugin) queryPartitionStatus() { WithField("state", partitionInfo.State). Info("ODC Partition state changed") - partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.State) + partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.EcsState) payload := map[string]interface{}{ - "oldState": existingPartition.State, - "newState": partitionInfo.State, + "state": partitionInfo.State, "ecsState": partitionInfo.EcsState, "partitionId": partitionInfo.PartitionId.String(), "ddsSessionId": partitionInfo.DdsSessionId, @@ -332,7 +331,7 @@ func (p *Plugin) queryPartitionStatus() { IntegratedServiceEventBase: common_event.IntegratedServiceEventBase{ServiceName: "ODC"}, EnvironmentId: id, State: partitionInfo.State, - EcsState: partitionInfo.EcsState, + EcsState: partitionInfo.EcsState.String(), }) } else { log.WithField("level", infologger.IL_Support). @@ -368,7 +367,7 @@ func (p *Plugin) GetData(_ []any) string { for id, partitionInfo := range r.Partitions { partitionStates[id.String()] = map[string]string{ "state": partitionInfo.State, - "ecsState": partitionInfo.EcsState, + "ecsState": partitionInfo.EcsState.String(), } } } From a5281ae2f30d3a53abc6c5c2a9100b10ed0e4ae0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 13:58:35 +0200 Subject: [PATCH 1932/2352] [core] Test ODC-ECS state mapping --- Makefile | 2 +- core/integration/odc/fairmq/fairmq_test.go | 246 +++++++++++++++++++++ 2 files changed, 247 insertions(+), 1 deletion(-) create mode 100644 core/integration/odc/fairmq/fairmq_test.go diff --git a/Makefile b/Makefile index f0d0241d6..446450e77 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task ./core/workflow +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task ./core/workflow ./core/integration/odc/fairmq GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/core/integration/odc/fairmq/fairmq_test.go b/core/integration/odc/fairmq/fairmq_test.go new file mode 100644 index 000000000..a61ce26b5 --- /dev/null +++ b/core/integration/odc/fairmq/fairmq_test.go @@ -0,0 +1,246 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package fairmq + +import ( + "testing" + + "github.com/AliceO2Group/Control/core/task/sm" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("fairmq", func() { + Describe("ODC to AliECS state mapping", func() { + var ( + ecsState sm.State + ) + When("transitioning ODC partition in sync with ECS environment", func() { + BeforeEach(func() { + ecsState = sm.UNKNOWN + }) + It("should correctly report ECS states for an ordinary environment lifecycle", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING TASK", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("RUNNING", ecsState) + Expect(ecsState).To(Equal(sm.RUNNING)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("RUNNING", ecsState) // start-stop-start + Expect(ecsState).To(Equal(sm.RUNNING)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("RESETTING TASK", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState := ToEcsState("RESETTING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that goes to ERROR during CONNECTING", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("ERROR", ecsState) + Expect(ecsState).To(Equal(sm.ERROR)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that goes to ERROR during READY", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING TASK", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("ERROR", ecsState) + Expect(ecsState).To(Equal(sm.ERROR)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that goes to ERROR during RUNNING", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING TASK", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("RUNNING", ecsState) + Expect(ecsState).To(Equal(sm.RUNNING)) + ecsState = ToEcsState("ERROR", ecsState) + Expect(ecsState).To(Equal(sm.ERROR)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that unexpectedly resets at INITIALIZED", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState := ToEcsState("RESETTING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that unexpectedly resets at DEVICE READY", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState := ToEcsState("RESETTING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that resets at READY without going to RUNNING", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BINDING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("BOUND", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("CONNECTING", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING TASK", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("RESETTING TASK", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("DEVICE READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState := ToEcsState("RESETTING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("EXITING", ecsState) + Expect(ecsState).To(Equal(sm.DONE)) + }) + It("should correctly report ECS states for an environment lifecycle that sends invalid states", func() { + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("OK", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("INITIALIZED", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("", ecsState) + Expect(ecsState).To(Equal(sm.UNKNOWN)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) + ecsState = ToEcsState("ROLLING", ecsState) + Expect(ecsState).To(Equal(sm.UNKNOWN)) + ecsState = ToEcsState("OK", ecsState) + Expect(ecsState).To(Equal(sm.UNKNOWN)) + ecsState = ToEcsState("IDLE", ecsState) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("MIXED", ecsState) + Expect(ecsState).To(Equal(sm.UNKNOWN)) + }) + + }) + }) +}) + +func TestState(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "ODC state mapping test suite") +} From e0a272ca1a716e9b5841d37360ef6c686728b144 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 14:02:30 +0200 Subject: [PATCH 1933/2352] [core] Move task state test to sm package --- Makefile | 2 +- core/task/sm/state_test.go | 88 +++++++++++++++++++++++++++++++++++++ core/task/state_test.go | 89 -------------------------------------- 3 files changed, 89 insertions(+), 90 deletions(-) create mode 100644 core/task/sm/state_test.go delete mode 100644 core/task/state_test.go diff --git a/Makefile b/Makefile index 446450e77..092a055e9 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task ./core/workflow ./core/integration/odc/fairmq +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/core/task/sm/state_test.go b/core/task/sm/state_test.go new file mode 100644 index 000000000..6e84b4131 --- /dev/null +++ b/core/task/sm/state_test.go @@ -0,0 +1,88 @@ +package sm + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("task state", func() { + Describe("enumerated state to string conversion", func() { + When("a State is one of the variant states", func() { + It("should be converted literally", func() { + Expect(CONFIGURED.String()).To(Equal("CONFIGURED")) + }) + }) + When("a State is invariant", func() { + It("should be converted to UNKNOWN", func() { + Expect(INVARIANT.String()).To(Equal("UNKNOWN")) + }) + }) + }) + + Describe("string state to enum conversion", func() { + When("a State is one of the variant states", func() { + It("should be converted literally", func() { + Expect(StateFromString("CONFIGURED")).To(Equal(CONFIGURED)) + }) + }) + When("a State is wrong", func() { + It("should be converted to UNKNOWN", func() { + Expect(StateFromString("NEVADA")).To(Equal(UNKNOWN)) + }) + }) + }) + + Describe("state multiplication", func() { + When("the states are equal", func() { + It("returns the same state", func() { + Expect(UNKNOWN.X(UNKNOWN)).To(Equal(UNKNOWN)) + Expect(RUNNING.X(RUNNING)).To(Equal(RUNNING)) + Expect(INVARIANT.X(INVARIANT)).To(Equal(INVARIANT)) + }) + }) + + When("one of the states is ERROR", func() { + It("returns ERROR", func() { + Expect(ERROR.X(UNKNOWN)).To(Equal(ERROR)) + Expect(ERROR.X(RUNNING)).To(Equal(ERROR)) + Expect(ERROR.X(INVARIANT)).To(Equal(ERROR)) + + Expect(UNKNOWN.X(ERROR)).To(Equal(ERROR)) + Expect(RUNNING.X(ERROR)).To(Equal(ERROR)) + Expect(INVARIANT.X(ERROR)).To(Equal(ERROR)) + }) + }) + + When("One of the states is INVARIANT", func() { + It("returns the non-invariant state", func() { + Expect(INVARIANT.X(UNKNOWN)).To(Equal(UNKNOWN)) + Expect(INVARIANT.X(RUNNING)).To(Equal(RUNNING)) + Expect(UNKNOWN.X(INVARIANT)).To(Equal(UNKNOWN)) + Expect(RUNNING.X(INVARIANT)).To(Equal(RUNNING)) + Expect(DONE.X(INVARIANT)).To(Equal(DONE)) + Expect(MIXED.X(INVARIANT)).To(Equal(MIXED)) + Expect(ERROR.X(INVARIANT)).To(Equal(ERROR)) + }) + }) + + When("If both states are INVARIANT", func() { + It("returns the INVARIANT state", func() { + Expect(INVARIANT.X(INVARIANT)).To(Equal(INVARIANT)) + }) + }) + + When("The states are concrete, but different", func() { + It("returns MIXED", func() { + Expect(UNKNOWN.X(STANDBY)).To(Equal(MIXED)) + Expect(RUNNING.X(CONFIGURED)).To(Equal(MIXED)) + }) + }) + }) +}) + +func TestState(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "State Test Suite") +} diff --git a/core/task/state_test.go b/core/task/state_test.go deleted file mode 100644 index 01d81135c..000000000 --- a/core/task/state_test.go +++ /dev/null @@ -1,89 +0,0 @@ -package task_test - -import ( - "testing" - - "github.com/AliceO2Group/Control/core/task/sm" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("task state", func() { - Describe("enumerated state to string conversion", func() { - When("a State is one of the variant states", func() { - It("should be converted literally", func() { - Expect(sm.CONFIGURED.String()).To(Equal("CONFIGURED")) - }) - }) - When("a State is invariant", func() { - It("should be converted to UNKNOWN", func() { - Expect(sm.INVARIANT.String()).To(Equal("UNKNOWN")) - }) - }) - }) - - Describe("string state to enum conversion", func() { - When("a State is one of the variant states", func() { - It("should be converted literally", func() { - Expect(sm.StateFromString("CONFIGURED")).To(Equal(sm.CONFIGURED)) - }) - }) - When("a State is wrong", func() { - It("should be converted to UNKNOWN", func() { - Expect(sm.StateFromString("NEVADA")).To(Equal(sm.UNKNOWN)) - }) - }) - }) - - Describe("state multiplication", func() { - When("the states are equal", func() { - It("returns the same state", func() { - Expect(sm.UNKNOWN.X(sm.UNKNOWN)).To(Equal(sm.UNKNOWN)) - Expect(sm.RUNNING.X(sm.RUNNING)).To(Equal(sm.RUNNING)) - Expect(sm.INVARIANT.X(sm.INVARIANT)).To(Equal(sm.INVARIANT)) - }) - }) - - When("one of the states is ERROR", func() { - It("returns ERROR", func() { - Expect(sm.ERROR.X(sm.UNKNOWN)).To(Equal(sm.ERROR)) - Expect(sm.ERROR.X(sm.RUNNING)).To(Equal(sm.ERROR)) - Expect(sm.ERROR.X(sm.INVARIANT)).To(Equal(sm.ERROR)) - - Expect(sm.UNKNOWN.X(sm.ERROR)).To(Equal(sm.ERROR)) - Expect(sm.RUNNING.X(sm.ERROR)).To(Equal(sm.ERROR)) - Expect(sm.INVARIANT.X(sm.ERROR)).To(Equal(sm.ERROR)) - }) - }) - - When("One of the states is INVARIANT", func() { - It("returns the non-invariant state", func() { - Expect(sm.INVARIANT.X(sm.UNKNOWN)).To(Equal(sm.UNKNOWN)) - Expect(sm.INVARIANT.X(sm.RUNNING)).To(Equal(sm.RUNNING)) - Expect(sm.UNKNOWN.X(sm.INVARIANT)).To(Equal(sm.UNKNOWN)) - Expect(sm.RUNNING.X(sm.INVARIANT)).To(Equal(sm.RUNNING)) - Expect(sm.DONE.X(sm.INVARIANT)).To(Equal(sm.DONE)) - Expect(sm.MIXED.X(sm.INVARIANT)).To(Equal(sm.MIXED)) - Expect(sm.ERROR.X(sm.INVARIANT)).To(Equal(sm.ERROR)) - }) - }) - - When("If both states are INVARIANT", func() { - It("returns the INVARIANT state", func() { - Expect(sm.INVARIANT.X(sm.INVARIANT)).To(Equal(sm.INVARIANT)) - }) - }) - - When("The states are concrete, but different", func() { - It("returns MIXED", func() { - Expect(sm.UNKNOWN.X(sm.STANDBY)).To(Equal(sm.MIXED)) - Expect(sm.RUNNING.X(sm.CONFIGURED)).To(Equal(sm.MIXED)) - }) - }) - }) -}) - -func TestState(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "State Test Suite") -} From 5dac777e09cf8dee39344a8895b38d16becdc892 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 3 Jun 2024 14:11:37 +0200 Subject: [PATCH 1934/2352] [core] Strong typing for ODC event payloads --- common/utils/uid/uid.go | 11 +++++-- core/integration/odc/plugin.go | 53 ++++++++++++++++++++++++---------- core/task/sm/state.go | 6 ++++ 3 files changed, 51 insertions(+), 19 deletions(-) diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go index 70936fe18..95aa79ee9 100644 --- a/common/utils/uid/uid.go +++ b/common/utils/uid/uid.go @@ -26,6 +26,7 @@ package uid import ( "encoding/binary" + "encoding/json" "time" "github.com/AliceO2Group/Control/common/logger" @@ -37,12 +38,12 @@ import ( ) type ID string + var ( - log = logger.New(logrus.StandardLogger(),"utils") + log = logger.New(logrus.StandardLogger(), "utils") uidGen *indigo.Generator ) - func init() { // In order to correctly seed ID generation and ensure that all generated IDs // are reasonably unique to a given machine, we need to provide a uint16 @@ -76,7 +77,7 @@ func init() { uidGen = indigo.New( nil, indigo.StartTime(time.Unix(1257894000, 0)), // Go epoch - indigo.MachineID(func() (uint16, error){return machineId, nil}), + indigo.MachineID(func() (uint16, error) { return machineId, nil }), ) } @@ -108,3 +109,7 @@ func New() ID { } return ID(id) } + +func (u ID) MarshalJSON() ([]byte, error) { + return json.Marshal(u.String()) +} diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 9d62335c7..2affdff6a 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -111,6 +111,26 @@ type OdcDevice struct { Host string `json:"host"` } +type partitionStateChangedEventPayload struct { + PartitionId uid.ID `json:"partitionId"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` +} + +type deviceStateChangedEventPayload struct { + PartitionId uid.ID `json:"partitionId"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + TaskId string `json:"taskId"` + Path string `json:"path"` + Ignored bool `json:"ignored"` + Host string `json:"host"` +} + func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -280,16 +300,16 @@ func (p *Plugin) queryPartitionStatus() { device.EcsState = fairmq.ToEcsState(device.State, oldEcsState) // since the odc-state of the task has changed, we must publish the event - payload := map[string]interface{}{ - "state": device.State, - "ecsState": device.EcsState, - "taskId": device.TaskId, - "path": device.Path, - "ignored": device.Ignored, - "host": device.Host, - "partitionId": partitionInfo.PartitionId.String(), - "ddsSessionId": partitionInfo.DdsSessionId, - "ddsSessionStatus": partitionInfo.DdsSessionStatus, + payload := deviceStateChangedEventPayload{ + PartitionId: partitionInfo.PartitionId, + DdsSessionId: partitionInfo.DdsSessionId, + DdsSessionStatus: partitionInfo.DdsSessionStatus, + State: device.State, + EcsState: device.EcsState, + TaskId: device.TaskId, + Path: device.Path, + Ignored: device.Ignored, + Host: device.Host, } payloadJson, _ := json.Marshal(payload) @@ -310,13 +330,14 @@ func (p *Plugin) queryPartitionStatus() { partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.EcsState) - payload := map[string]interface{}{ - "state": partitionInfo.State, - "ecsState": partitionInfo.EcsState, - "partitionId": partitionInfo.PartitionId.String(), - "ddsSessionId": partitionInfo.DdsSessionId, - "ddsSessionStatus": partitionInfo.DdsSessionStatus, + payload := partitionStateChangedEventPayload{ + PartitionId: partitionInfo.PartitionId, + DdsSessionId: partitionInfo.DdsSessionId, + DdsSessionStatus: partitionInfo.DdsSessionStatus, + State: partitionInfo.State, + EcsState: partitionInfo.EcsState, } + payloadJson, _ := json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ diff --git a/core/task/sm/state.go b/core/task/sm/state.go index 4d13fa288..ba719f33d 100644 --- a/core/task/sm/state.go +++ b/core/task/sm/state.go @@ -24,6 +24,8 @@ package sm +import "encoding/json" + type State int const ( @@ -81,3 +83,7 @@ func (s State) X(other State) State { } return MIXED } + +func (s State) MarshalJSON() ([]byte, error) { + return json.Marshal(s.String()) +} From 53f70f166989118337b72547dbda84c858d530bd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 11:02:37 +0200 Subject: [PATCH 1935/2352] [core] Send ODC device IDs as string for JS compatibility --- core/integration/odc/plugin.go | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 2affdff6a..efbf01599 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -91,15 +91,21 @@ type OdcStatus struct { Error *odc.Error } +type OdcDeviceId uint64 + +func (o OdcDeviceId) MarshalJSON() ([]byte, error) { + return json.Marshal(strconv.FormatUint(uint64(o), 10)) +} + type OdcPartitionInfo struct { - PartitionId uid.ID `json:"-"` - RunNumber uint32 `json:"runNumber"` - State string `json:"state"` - EcsState sm.State `json:"ecsState"` - DdsSessionId string `json:"ddsSessionId"` - DdsSessionStatus string `json:"ddsSessionStatus"` - Devices map[uint64]OdcDevice `json:"devices"` - Hosts []string `json:"hosts"` + PartitionId uid.ID `json:"-"` + RunNumber uint32 `json:"runNumber"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + Devices map[OdcDeviceId]OdcDevice `json:"devices"` + Hosts []string `json:"hosts"` } type OdcDevice struct { @@ -248,9 +254,9 @@ func (p *Plugin) queryPartitionStatus() { } odcPartInfoSlice[idx].Hosts = odcPartStateRep.Reply.Hosts - odcPartInfoSlice[idx].Devices = make(map[uint64]OdcDevice, len(odcPartStateRep.Devices)) + odcPartInfoSlice[idx].Devices = make(map[OdcDeviceId]OdcDevice, len(odcPartStateRep.Devices)) for _, device := range odcPartStateRep.Devices { - odcPartInfoSlice[idx].Devices[device.Id] = OdcDevice{ + odcPartInfoSlice[idx].Devices[OdcDeviceId(device.Id)] = OdcDevice{ TaskId: strconv.FormatUint(device.Id, 10), State: device.State, Path: device.Path, From 852890c712fd480b5d94159b47f96d843416c00e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 11:11:50 +0200 Subject: [PATCH 1936/2352] [core] Account for ODC state MIXED as INVARIANT --- core/integration/odc/fairmq/fairmq.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/odc/fairmq/fairmq.go b/core/integration/odc/fairmq/fairmq.go index b5177937a..42a5a10ce 100644 --- a/core/integration/odc/fairmq/fairmq.go +++ b/core/integration/odc/fairmq/fairmq.go @@ -49,6 +49,7 @@ func init() { "RESETTING TASK": sm.INVARIANT, "RESETTING DEVICE": sm.INVARIANT, "OK": sm.INVARIANT, + "MIXED": sm.INVARIANT, } } From 92c9973fbfa65f31695023887c8051e8d661c02d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 12:21:56 +0200 Subject: [PATCH 1937/2352] [core] Fix test --- core/integration/odc/fairmq/fairmq_test.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/fairmq/fairmq_test.go b/core/integration/odc/fairmq/fairmq_test.go index a61ce26b5..771f92b60 100644 --- a/core/integration/odc/fairmq/fairmq_test.go +++ b/core/integration/odc/fairmq/fairmq_test.go @@ -233,7 +233,9 @@ var _ = Describe("fairmq", func() { ecsState = ToEcsState("IDLE", ecsState) Expect(ecsState).To(Equal(sm.STANDBY)) ecsState = ToEcsState("MIXED", ecsState) - Expect(ecsState).To(Equal(sm.UNKNOWN)) + Expect(ecsState).To(Equal(sm.STANDBY)) + ecsState = ToEcsState("READY", ecsState) + Expect(ecsState).To(Equal(sm.CONFIGURED)) }) }) From 8752b95bded6b581966d66aa91b58628385b1c54 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 14:50:18 +0200 Subject: [PATCH 1938/2352] [core] Make test more similar to real world behaviour --- core/integration/odc/fairmq/fairmq.go | 4 +++- core/integration/odc/fairmq/fairmq_test.go | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/integration/odc/fairmq/fairmq.go b/core/integration/odc/fairmq/fairmq.go index 42a5a10ce..52b747e39 100644 --- a/core/integration/odc/fairmq/fairmq.go +++ b/core/integration/odc/fairmq/fairmq.go @@ -24,7 +24,9 @@ package fairmq -import "github.com/AliceO2Group/Control/core/task/sm" +import ( + "github.com/AliceO2Group/Control/core/task/sm" +) var ( fairMqStateMap map[string]sm.State diff --git a/core/integration/odc/fairmq/fairmq_test.go b/core/integration/odc/fairmq/fairmq_test.go index 771f92b60..2e6856308 100644 --- a/core/integration/odc/fairmq/fairmq_test.go +++ b/core/integration/odc/fairmq/fairmq_test.go @@ -42,6 +42,8 @@ var _ = Describe("fairmq", func() { ecsState = sm.UNKNOWN }) It("should correctly report ECS states for an ordinary environment lifecycle", func() { + ecsState = ToEcsState("UNKNOWN", ecsState) + Expect(ecsState).To(Equal(sm.UNKNOWN)) ecsState = ToEcsState("IDLE", ecsState) Expect(ecsState).To(Equal(sm.STANDBY)) ecsState = ToEcsState("INITIALIZING DEVICE", ecsState) From 7dfa17d1227413b931acc37c81d855764ef79d17 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 14:50:35 +0200 Subject: [PATCH 1939/2352] [core] Fix issue with ECS state reverting to UNKNOWN --- core/integration/odc/plugin.go | 38 +++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index efbf01599..b1fd1fee0 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -85,7 +85,7 @@ type Plugin struct { } type OdcStatus struct { - Partitions map[uid.ID]OdcPartitionInfo + Partitions map[uid.ID]*OdcPartitionInfo Status odc.ReplyStatus Message string Error *odc.Error @@ -98,14 +98,14 @@ func (o OdcDeviceId) MarshalJSON() ([]byte, error) { } type OdcPartitionInfo struct { - PartitionId uid.ID `json:"-"` - RunNumber uint32 `json:"runNumber"` - State string `json:"state"` - EcsState sm.State `json:"ecsState"` - DdsSessionId string `json:"ddsSessionId"` - DdsSessionStatus string `json:"ddsSessionStatus"` - Devices map[OdcDeviceId]OdcDevice `json:"devices"` - Hosts []string `json:"hosts"` + PartitionId uid.ID `json:"-"` + RunNumber uint32 `json:"runNumber"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + Devices map[OdcDeviceId]*OdcDevice `json:"devices"` + Hosts []string `json:"hosts"` } type OdcDevice struct { @@ -199,7 +199,7 @@ func (p *Plugin) queryPartitionStatus() { Status: statusRep.Status, Message: statusRep.Msg, Error: statusRep.Error, - Partitions: make(map[uid.ID]OdcPartitionInfo), + Partitions: make(map[uid.ID]*OdcPartitionInfo), } odcPartInfoSlice := make([]*OdcPartitionInfo, len(statusRep.Partitions)) @@ -254,9 +254,9 @@ func (p *Plugin) queryPartitionStatus() { } odcPartInfoSlice[idx].Hosts = odcPartStateRep.Reply.Hosts - odcPartInfoSlice[idx].Devices = make(map[OdcDeviceId]OdcDevice, len(odcPartStateRep.Devices)) + odcPartInfoSlice[idx].Devices = make(map[OdcDeviceId]*OdcDevice, len(odcPartStateRep.Devices)) for _, device := range odcPartStateRep.Devices { - odcPartInfoSlice[idx].Devices[OdcDeviceId(device.Id)] = OdcDevice{ + odcPartInfoSlice[idx].Devices[OdcDeviceId(device.Id)] = &OdcDevice{ TaskId: strconv.FormatUint(device.Id, 10), State: device.State, Path: device.Path, @@ -273,7 +273,7 @@ func (p *Plugin) queryPartitionStatus() { // The partition wasn't found in the ODC response continue } - response.Partitions[odcPartSt.PartitionId] = *odcPartSt + response.Partitions[odcPartSt.PartitionId] = odcPartSt } p.cachedStatusMu.Lock() @@ -281,7 +281,6 @@ func (p *Plugin) queryPartitionStatus() { // state change detection if p.cachedStatus != nil && p.cachedStatus.Status == odc.ReplyStatus_SUCCESS { for id, partitionInfo := range response.Partitions { - // do we have the given partition on record already? if not, no state change detection is possible if existingPartition, ok := p.cachedStatus.Partitions[id]; ok { @@ -298,7 +297,8 @@ func (p *Plugin) queryPartitionStatus() { // if the state has changed, we take note of the previous state oldEcsState = existingDevice.EcsState } else { - // if the state hasn't changed, we bail + // if the state hasn't changed, we set the old ECS state and bail + device.EcsState = existingDevice.EcsState continue } } @@ -328,14 +328,16 @@ func (p *Plugin) queryPartitionStatus() { // detection of env (ODC partition) state change + event publication if existingPartition.State != partitionInfo.State { + partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.EcsState) + log.WithField("level", infologger.IL_Support). WithField("partition", id.String()). WithField("oldState", existingPartition.State). + WithField("oldEcsState", existingPartition.EcsState). + WithField("ecsState", partitionInfo.EcsState). WithField("state", partitionInfo.State). Info("ODC Partition state changed") - partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.EcsState) - payload := partitionStateChangedEventPayload{ PartitionId: partitionInfo.PartitionId, DdsSessionId: partitionInfo.DdsSessionId, @@ -367,6 +369,8 @@ func (p *Plugin) queryPartitionStatus() { WithField("state", partitionInfo.State). Warn("could not notify environment manager of ODC partition state change event") } + } else { + partitionInfo.EcsState = existingPartition.EcsState } } } From 2e548c79ae78580b67f422da90787634903581df Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 15:32:28 +0200 Subject: [PATCH 1940/2352] [core] Ensure we don't overwrite the devices now that it's a pointer --- core/integration/odc/plugin.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index b1fd1fee0..a881f4b36 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -459,9 +459,18 @@ func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { continue } - partitionInfo.Devices = nil // don't return the full devices payload - - partitionInfoOut, err := json.Marshal(partitionInfo) + // return everything except the devices + partitionInfoPayload := &OdcPartitionInfo{ + PartitionId: partitionInfo.PartitionId, + RunNumber: partitionInfo.RunNumber, + State: partitionInfo.State, + EcsState: partitionInfo.EcsState, + DdsSessionId: partitionInfo.DdsSessionId, + DdsSessionStatus: partitionInfo.DdsSessionStatus, + Hosts: partitionInfo.Hosts, + } + + partitionInfoOut, err := json.Marshal(partitionInfoPayload) if err != nil { continue } From 3dfd8aae3532f94e9ad185fd9f7e50be8578b0ac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 4 Jun 2024 16:52:12 +0200 Subject: [PATCH 1941/2352] [build] Bump to v1.12.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5a25c261d..51dc08407 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 11 +VERSION_MINOR := 12 VERSION_PATCH := 0 From da4bffc873277432f81b4d65a21b04b46c74e4bc Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 7 Jun 2024 14:27:45 +0200 Subject: [PATCH 1942/2352] [core] Set state to DONE in last autoEnv event - stopgap until Kafka switch --- core/environment/manager.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 8554b44f5..b149deb8e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1218,7 +1218,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str Infof("auto-environment failed at %s, tasks were cleaned up", op) log.WithField("partition", env.Id().String()).Info("environment teardown complete") - env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", EnvironmentID: env.Id().String()}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", State: "DONE", EnvironmentID: env.Id().String()}) } if err != nil { @@ -1277,7 +1277,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", EnvironmentID: env.Id().String()}) + env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "environment teardown complete", State: "DONE", EnvironmentID: env.Id().String()}) return case "ERROR": fallthrough From 7189e9fbac78ab909bfe0bd9bbfed0a9d94da427 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Wed, 26 Jun 2024 09:50:57 +0200 Subject: [PATCH 1943/2352] Update kafka.md --- docs/kafka.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/kafka.md b/docs/kafka.md index 0f59f9c0e..53d3bd56d 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -34,6 +34,7 @@ See [events.proto](../common/protos/events.proto) for the protobuf definitions o * `aliecs.integrated_service.ddsched` - events emitted by the DDSched integrated service * `aliecs.integrated_service.odc` - events emitted by the ODC integrated service * `aliecs.integrated_service.trg` - events emitted by the TRG integrated service +* `aliecs.run` - events that concern a run (start/end of SOR and EOR operations, and related errors) ### Decoding the messages From 1e83c517a22e5c4d27199f8dac9301e6d18a97cd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 26 Jun 2024 11:13:22 +0200 Subject: [PATCH 1944/2352] [core] Limit ODC error string length --- common/utils/utils.go | 13 +++++++++++++ core/integration/odc/handlers.go | 24 +++++++++++++----------- core/server.go | 4 ++-- core/serverutil.go | 13 ------------- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/common/utils/utils.go b/common/utils/utils.go index 12faa43e4..7a0435cee 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -34,6 +34,7 @@ import ( "runtime" "strings" "time" + "unicode/utf8" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" @@ -166,3 +167,15 @@ func ParseExtraVars(extraVars string) (extraVarsMap map[string]string, err error } return } + +func TruncateString(str string, length int) string { + if length <= 0 { + return "" + } + + if utf8.RuneCountInString(str) < length { + return str + } + + return string([]rune(str)[:length]) +} diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 9555d0ed2..6b7260da1 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -47,6 +47,8 @@ import ( "google.golang.org/grpc/status" ) +const ODC_ERROR_MAX_LENGTH = 250 + func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (string, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) req := &odcpb.StateRequest{ @@ -78,7 +80,7 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st newState = rep.Reply.State if odcErr := rep.Reply.GetError(); odcErr != nil { - return newState, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + return newState, fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) } if replyStatus := rep.Reply.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { return newState, fmt.Errorf("status %s from ODC", replyStatus.String()) @@ -188,7 +190,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string WithError(err). Debugf("finished call odc.SetProperties, ERROR in response payload") - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) @@ -318,7 +320,7 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) @@ -454,7 +456,7 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) @@ -640,7 +642,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri } if odcErr := rep.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) @@ -845,7 +847,7 @@ func doReset(ctx context.Context, odcClient *RpcClient, arguments map[string]str rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) @@ -975,7 +977,7 @@ func doTerminate(ctx context.Context, odcClient *RpcClient, arguments map[string rep.Reply.Hosts = nil if odcErr := rep.Reply.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &rep payloadJson, _ = json.Marshal(payload) @@ -1100,7 +1102,7 @@ func doShutdown(ctx context.Context, odcClient *RpcClient, arguments map[string] shutdownResponse.Hosts = nil if odcErr := shutdownResponse.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &shutdownResponse payloadJson, _ = json.Marshal(payload) @@ -1283,7 +1285,7 @@ func handleRun(ctx context.Context, odcClient *RpcClient, isManualXml bool, argu runResponse.Hosts = nil if odcErr := runResponse.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) } if replyStatus := runResponse.Status; replyStatus != odcpb.ReplyStatus_SUCCESS { payload["odcResponse"] = &runResponse @@ -1427,7 +1429,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st WithError(err). Debugf("finished call odc.SetProperties, ERROR in response payload") - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &setPropertiesResponse payloadJson, _ = json.Marshal(payload) @@ -1558,7 +1560,7 @@ func handleConfigure(ctx context.Context, odcClient *RpcClient, arguments map[st configureResponse.Reply.Hosts = nil if odcErr := configureResponse.Reply.GetError(); odcErr != nil { - err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), odcErr.GetMsg()) + err = fmt.Errorf("code %d from ODC: %s", odcErr.GetCode(), utils.TruncateString(odcErr.GetMsg(), ODC_ERROR_MAX_LENGTH)) payload["odcResponse"] = &configureResponse payloadJson, _ = json.Marshal(payload) diff --git a/core/server.go b/core/server.go index 571719108..18b144b76 100644 --- a/core/server.go +++ b/core/server.go @@ -380,7 +380,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme id := uid.New() id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id, request.GetAutoTransition()) if err != nil { - st := status.Newf(codes.Internal, "cannot create new environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) + st := status.Newf(codes.Internal, "cannot create new environment: %s", utils.TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), @@ -395,7 +395,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme newEnv, err := m.state.environments.Environment(id) if err != nil { - st := status.Newf(codes.Internal, "cannot get newly created environment: %s", TruncateString(err.Error(), MAX_ERROR_LENGTH)) + st := status.Newf(codes.Internal, "cannot get newly created environment: %s", utils.TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ Id: id.String(), CreatedWhen: time.Now().UnixMilli(), diff --git a/core/serverutil.go b/core/serverutil.go index 81c63829f..fd9ed49ea 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -26,7 +26,6 @@ package core import ( "fmt" - "unicode/utf8" "github.com/AliceO2Group/Control/core/repos" @@ -237,15 +236,3 @@ func convertVarTypeStringToEnum(varType string) pb.VarSpecMessage_Type { } return pb.VarSpecMessage_Type(msgType) } - -func TruncateString(str string, length int) string { - if length <= 0 { - return "" - } - - if utf8.RuneCountInString(str) < length { - return str - } - - return string([]rune(str)[:length]) -} From 459a823a9764b7a7a097a39112039aa37631f5c1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 26 Jun 2024 09:37:59 +0200 Subject: [PATCH 1945/2352] test the plugin system ...building towards a test for hooks --- Makefile | 2 +- core/integration/plugin.go | 8 + core/integration/plugin_test.go | 229 ++++++++++++++++++++++++++ core/integration/testplugin/plugin.go | 19 ++- 4 files changed, 252 insertions(+), 6 deletions(-) create mode 100644 core/integration/plugin_test.go diff --git a/Makefile b/Makefile index 092a055e9..0766d7f7f 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/core/integration/plugin.go b/core/integration/plugin.go index faced79b7..2b4f73444 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -211,3 +211,11 @@ func PluginsInstance() Plugins { }) return instance } + +// Reset resets the plugin system for testing purposes. +func Reset() { + once = sync.Once{} + instance = Plugins{} + loaderOnce = sync.Once{} + pluginLoaders = make(map[string]func() Plugin) +} diff --git a/core/integration/plugin_test.go b/core/integration/plugin_test.go new file mode 100644 index 000000000..d5ed637e9 --- /dev/null +++ b/core/integration/plugin_test.go @@ -0,0 +1,229 @@ +package integration_test + +import ( + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/testplugin" + "github.com/AliceO2Group/Control/core/workflow/callable" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/spf13/viper" + "testing" +) + +var _ = Describe("plugin framework", Ordered, func() { + + BeforeEach(func() { + // Reset the integration package state before each test + integration.Reset() + viper.Reset() + }) + + var _ = Describe("Plugin Registration", Ordered, func() { + It("should register a plugin correctly", func() { + // ... even if we register it multiple times + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + + registeredPlugins := integration.RegisteredPlugins() + Expect(registeredPlugins).To(HaveLen(1)) + Expect(registeredPlugins).To(HaveKey("testplugin")) + + pluginLoader := registeredPlugins["testplugin"] + Expect(pluginLoader).ToNot(BeNil()) + }) + }) + + var _ = Describe("Loading Plugins", Ordered, func() { + BeforeEach(func() { + // Reset the integration package state before each test + integration.Reset() + viper.Reset() + }) + It("should load a plugin correctly", func() { + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + viper.Set("testPluginEndpoint", "http://example.com") + viper.Set("integrationPlugins", []string{"testplugin"}) + plugins := integration.PluginsInstance() + Expect(plugins).To(HaveLen(1)) + Expect(plugins[0].GetName()).To(Equal("testplugin")) + }) + It("should fail to load a plugin if endpoint is not set", func() { + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + viper.Set("integrationPlugins", []string{"testplugin"}) + plugins := integration.PluginsInstance() + Expect(plugins).To(BeEmpty()) + }) + It("should not load a plugin which is not registered", func() { + viper.Set("testPluginEndpoint", "http://example.com") + viper.Set("integrationPlugins", []string{"testplugin"}) + plugins := integration.PluginsInstance() + Expect(plugins).To(BeEmpty()) + }) + It("should not load a plugin which is not in the list of integration plugins", func() { + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + viper.Set("testPluginEndpoint", "http://example.com") + viper.Set("integrationPlugins", []string{}) + plugins := integration.PluginsInstance() + Expect(plugins).To(BeEmpty()) + }) + }) + + Describe("Plugin Getters", Ordered, func() { + var pluginInstance integration.Plugin + + BeforeEach(func() { + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + + registeredPlugins := integration.RegisteredPlugins() + pluginLoader := registeredPlugins["testplugin"] + + // Simulate setting the endpoint in Viper + viper.Set("testPluginEndpoint", "http://example.com") + pluginInstance = pluginLoader() + }) + + It("should return the correct name", func() { + Expect(pluginInstance.GetName()).To(Equal("testplugin")) + }) + + It("should return the correct pretty name", func() { + Expect(pluginInstance.GetPrettyName()).To(Equal("Test plugin")) + }) + + It("should return the correct connection state", func() { + Expect(pluginInstance.GetConnectionState()).To(Equal("READY")) + }) + It("should set and get the endpoint correctly", func() { + Expect(pluginInstance.GetEndpoint()).To(Equal("http://example.com")) + }) + + It("should return the correct data", func() { + Expect(pluginInstance.GetData(nil)).To(Equal("test_data")) + }) + + It("should return the correct environments data", func() { + envId, _ := uid.FromString("2oDvieFrVTi") + envData := pluginInstance.GetEnvironmentsData([]uid.ID{envId}) + Expect(envData).To(HaveLen(1)) + Expect(envData).To(HaveKeyWithValue(envId, "test_data_2oDvieFrVTi")) + }) + + It("should return the correct environments short data", func() { + envId, _ := uid.FromString("2oDvieFrVTi") + envData := pluginInstance.GetEnvironmentsShortData([]uid.ID{envId}) + Expect(envData).To(HaveLen(1)) + Expect(envData).To(HaveKeyWithValue(envId, "test_short_data_2oDvieFrVTi")) + }) + }) + + Describe("Global Plugin Getters", Ordered, func() { + var plugins integration.Plugins + + BeforeEach(func() { + integration.Reset() + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + viper.Reset() + viper.Set("integrationPlugins", []string{"testplugin"}) + viper.Set("testPluginEndpoint", "http://example.com") + plugins = integration.PluginsInstance() + }) + It("should return the data returned by the plugin", func() { + data := plugins.GetData(nil) + Expect(data).To(HaveLen(1)) + Expect(data).To(HaveKeyWithValue("testplugin", "test_data")) + }) + + It("should return the env data returned by the plugin", func() { + envId, _ := uid.FromString("2oDvieFrVTi") + envData := plugins.GetEnvironmentsData([]uid.ID{envId}) + Expect(envData).To(HaveLen(1)) + Expect(envData).To(HaveKey(envId)) + envDataTestPlugin := envData[envId] + Expect(envDataTestPlugin).To(HaveLen(1)) + Expect(envDataTestPlugin).To(HaveKeyWithValue("testplugin", "test_data_2oDvieFrVTi")) + }) + + It("should return the short env data returned by the plugin", func() { + envId, _ := uid.FromString("2oDvieFrVTi") + envData := plugins.GetEnvironmentsShortData([]uid.ID{envId}) + Expect(envData).To(HaveLen(1)) + Expect(envData).To(HaveKey(envId)) + envDataTestPlugin := envData[envId] + Expect(envDataTestPlugin).To(HaveLen(1)) + Expect(envDataTestPlugin).To(HaveKeyWithValue("testplugin", "test_short_data_2oDvieFrVTi")) + }) + }) + + Describe("InitAll and DestroyAll", Ordered, func() { + var plugins integration.Plugins + + BeforeEach(func() { + viper.Set("integrationPlugins", []string{"testplugin"}) + viper.Set("testPluginEndpoint", "http://example.com") + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + plugins = integration.PluginsInstance() + }) + + It("should initialize and destroy all plugins correctly", func() { + plugins.InitAll("instance_id") + plugins.DestroyAll() + }) + }) + + Describe("Call Stack", Ordered, func() { + var plugins integration.Plugins + + BeforeEach(func() { + viper.Reset() + viper.Set("integrationPlugins", []string{"testplugin"}) + viper.Set("testPluginEndpoint", "http://example.com") + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + plugins = integration.PluginsInstance() + }) + + It("should create a call stack for all registered plugins", func() { + call := &callable.Call{ + VarStack: map[string]string{ + "environment_id": "2oDvieFrVTi", + }, + } + + callStack := plugins.CallStack(call) + + Expect(callStack).To(HaveLen(1)) + Expect(callStack).To(HaveKey("testplugin")) + + testPluginCallStack := callStack["testplugin"] + Expect(testPluginCallStack).To(HaveKey("Noop")) + Expect(testPluginCallStack).To(HaveKey("Test")) + }) + }) + + Describe("Object Stack", Ordered, func() { + var plugins integration.Plugins + + BeforeEach(func() { + viper.Reset() + viper.Set("integrationPlugins", []string{"testplugin"}) + viper.Set("testPluginEndpoint", "http://example.com") + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + plugins = integration.PluginsInstance() + }) + + It("should create an object stack for all registered plugins", func() { + objectStack := plugins.ObjectStack(nil, nil) + + Expect(objectStack).To(HaveLen(2)) + Expect(objectStack).To(HaveKey("odc")) + Expect(objectStack).To(HaveKey("testplugin")) + testPluginObjectStack := objectStack["testplugin"] + Expect(testPluginObjectStack).To(HaveKeyWithValue("test", "test_data")) + }) + }) +}) + +func TestCoreIntegration(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Core Integration Test Suite") +} diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 3a8fb71f2..a79bdce49 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -70,15 +70,23 @@ func (p *Plugin) GetConnectionState() string { } func (p *Plugin) GetData(_ []any) string { - return "" + return "test_data" } -func (p *Plugin) GetEnvironmentsData(_ []uid.ID) map[uid.ID]string { - return nil +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + envData := make(map[uid.ID]string) + for _, envId := range envIds { + envData[envId] = "test_data_" + envId.String() + } + return envData } -func (p *Plugin) GetEnvironmentsShortData(_ []uid.ID) map[uid.ID]string { - return nil +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + envData := make(map[uid.ID]string) + for _, envId := range envIds { + envData[envId] = "test_short_data_" + envId.String() + } + return envData } func (p *Plugin) Init(_ string) error { @@ -88,6 +96,7 @@ func (p *Plugin) Init(_ string) error { func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) + stack["test"] = "test_data" return stack } From dd30081d18e6db94571f066a6044ae3e86f68e00 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 27 Jun 2024 16:42:28 +0200 Subject: [PATCH 1946/2352] [core] Improve handling of Mesos resource offers This commit addresses an issue with timing between a Mesos REVIVE call and its corresponding OFFERS event. Specifically: * The channel that pipes incoming deployment requests into the OFFERS handler is now buffered. * We retry an unsatisfiable task deployment 3 times before giving up. * The deployment request is now passed as a pointer. * The response from the OFFERS handler to task.Manager.acquireTasks now goes through its own channel, one per request. * The deployment request is now enqueued immediately *before* a REVIVE, as opposed to after, in order to prevent a race with Mesos. --- core/task/manager.go | 179 +++++++++++++++++++----------------- core/task/scheduler.go | 32 +++++-- core/task/schedulerstate.go | 16 ++-- 3 files changed, 127 insertions(+), 100 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 3cd99c933..4e01ef7f5 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -75,6 +75,7 @@ type ResourceOffersOutcome struct { type ResourceOffersDeploymentRequest struct { tasksToDeploy Descriptors envId uid.ID + outcomeCh chan ResourceOffersOutcome } type Manager struct { @@ -88,8 +89,7 @@ type Manager struct { classes *taskclass.Classes roster *roster - resourceOffersDone <-chan ResourceOffersOutcome - tasksToDeploy chan<- ResourceOffersDeploymentRequest + tasksToDeploy chan<- *ResourceOffersDeploymentRequest reviveOffersTrg chan struct{} cq *controlcommands.CommandQueue @@ -132,18 +132,17 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M roster: newRoster(), internalEventCh: internalEventCh, } - schedulerState, err := NewScheduler(taskman, fidStore, shutdown) + schedState, err := NewScheduler(taskman, fidStore, shutdown) if err != nil { return nil, err } - taskman.schedulerState = schedulerState + taskman.schedulerState = schedState taskman.cq = taskman.schedulerState.commandqueue - taskman.resourceOffersDone = taskman.schedulerState.resourceOffersDone taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg taskman.ackKilledTasks = newAcks() - schedulerState.setupCli() + schedState.setupCli() return } @@ -491,93 +490,107 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e m.deployMu.Lock() - timeReviveOffers := time.Now() - timeDeployMu := time.Now() - m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers - <-m.reviveOffersTrg // we only continue when it's done - utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", - log.WithField("tasksToRun", len(tasksToRun)). - WithField("partition", envId)) + DEPLOYMENT_ATTEMPTS_LOOP: + for attemptCount := 0; attemptCount < MAX_ATTEMPTS_PER_DEPLOY_REQUEST; attemptCount++ { + // We loop through the deployment attempts until we either succeed or + // reach the maximum number of attempts. In the happy case, we should only + // need to try once. A retry should only be necessary if the Mesos master + // has not been able to provide the resources we need in the offers round + // immediately after reviving. + // We also keep track of the number of attempts made in the request object + // so that the scheduler can decide whether to retry or not. + // The request object is used to pass the tasks to deploy and the outcome + // channel to the deployment routine. + + outcomeCh := make(chan ResourceOffersOutcome) + m.tasksToDeploy <- &ResourceOffersDeploymentRequest{ + tasksToDeploy: tasksToRun, + envId: envId, + outcomeCh: outcomeCh, + } // buffered channel, does not block - m.tasksToDeploy <- ResourceOffersDeploymentRequest{ - tasksToDeploy: tasksToRun, - envId: envId, - } // blocks until received - - log.WithField("partition", envId). - Debugf("scheduler has received request to deploy %d tasks", len(tasksToRun)) - - // IDEA: a flps mesos-role assigned to all mesos agents on flp hosts, and then a static - // reservation for that mesos-role on behalf of our scheduler - - roOutcome := <-m.resourceOffersDone - - utils.TimeTrack(timeDeployMu, "acquireTasks: deployment critical section", - log.WithField("tasksToRun", len(tasksToRun)). - WithField("partition", envId)) - - m.deployMu.Unlock() - - deployedTasks = roOutcome.deployed - undeployedDescriptors = roOutcome.undeployed - undeployableDescriptors = roOutcome.undeployable - - log.WithField("tasks", deployedTasks). - WithField("partition", envId). - Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) - - if len(deployedTasks) != len(tasksToRun) { - // ↑ Not all roles could be deployed. If some were critical, - // we cannot proceed with running this environment. Either way, - // we keep the roles running since they might be useful in the future. log.WithField("partition", envId). - Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) - - for _, desc := range undeployedDescriptors { - if desc.TaskRole.GetTaskTraits().Critical == true { - deploymentSuccess = false - undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Errorf("critical task deployment failure: %s", printname) - } else { - undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Warnf("non-critical task deployment failure: %s", printname) + Debugf("scheduler has been sent request to deploy %d tasks", len(tasksToRun)) + + timeReviveOffers := time.Now() + timeDeployMu := time.Now() + m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers + <-m.reviveOffersTrg // we only continue when it's done + utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", + log.WithField("tasksToRun", len(tasksToRun)). + WithField("partition", envId)) + + roOutcome := <-outcomeCh // blocks until a verdict from resourceOffers comes in + + utils.TimeTrack(timeDeployMu, "acquireTasks: deployment critical section", + log.WithField("tasksToRun", len(tasksToRun)). + WithField("partition", envId)) + + deployedTasks = roOutcome.deployed + undeployedDescriptors = roOutcome.undeployed + undeployableDescriptors = roOutcome.undeployable + + log.WithField("tasks", deployedTasks). + WithField("partition", envId). + Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) + + if len(deployedTasks) != len(tasksToRun) { + // ↑ Not all roles could be deployed. If some were critical, + // we cannot proceed with running this environment. Either way, + // we keep the roles running since they might be useful in the future. + log.WithField("partition", envId). + Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + + for _, desc := range undeployedDescriptors { + if desc.TaskRole.GetTaskTraits().Critical == true { + deploymentSuccess = false + undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Errorf("critical task deployment failure: %s", printname) + } else { + undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Warnf("non-critical task deployment failure: %s", printname) + } } - } - for _, desc := range undeployableDescriptors { - if desc.TaskRole.GetTaskTraits().Critical == true { - deploymentSuccess = false - undeployableCriticalDescriptors = append(undeployableCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Errorf("critical task deployment impossible: %s", printname) - go desc.TaskRole.UpdateStatus(UNDEPLOYABLE) - } else { - undeployableNonCriticalDescriptors = append(undeployableNonCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Warnf("non-critical task deployment impossible: %s", printname) + for _, desc := range undeployableDescriptors { + if desc.TaskRole.GetTaskTraits().Critical == true { + deploymentSuccess = false + undeployableCriticalDescriptors = append(undeployableCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Errorf("critical task deployment impossible: %s", printname) + go desc.TaskRole.UpdateStatus(UNDEPLOYABLE) + } else { + undeployableNonCriticalDescriptors = append(undeployableNonCriticalDescriptors, desc) + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + log.WithField("partition", envId). + Warnf("non-critical task deployment impossible: %s", printname) + } } } - } - } - if deploymentSuccess { - // ↑ means all the required critical processes are now running, - // and we are ready to update the envId - for taskPtr, descriptor := range deployedTasks { - taskPtr.SetParent(descriptor.TaskRole) - // Ensure everything is filled out properly - if !taskPtr.IsLocked() { - log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") - deploymentSuccess = false + if deploymentSuccess { + // ↑ means all the required critical processes are now running, + // and we are ready to update the envId + for taskPtr, descriptor := range deployedTasks { + taskPtr.SetParent(descriptor.TaskRole) + // Ensure everything is filled out properly + if !taskPtr.IsLocked() { + log.WithField("task", taskPtr.taskId).Warning("cannot lock newly deployed task") + deploymentSuccess = false + } + } + break DEPLOYMENT_ATTEMPTS_LOOP } } } + + m.deployMu.Unlock() + if !deploymentSuccess { // While all the required roles are running, for some reason we // can't lock some of them, so we must roll back and keep them diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 832187edc..a126eb684 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -463,8 +463,14 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var descriptorsStillToDeploy Descriptors envId := uid.NilID() + var deploymentRequestPayload *ResourceOffersDeploymentRequest + + // receive deployment request from channel, if any select { - case deploymentRequestPayload := <-state.tasksToDeploy: + case deploymentRequestPayload = <-state.tasksToDeploy: + if deploymentRequestPayload == nil { + break + } descriptorsStillToDeploy = deploymentRequestPayload.tasksToDeploy envId = deploymentRequestPayload.envId @@ -1051,17 +1057,23 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } // Notify listeners... - select { - case state.resourceOffersDone <- ResourceOffersOutcome{tasksDeployed, descriptorsStillToDeploy, descriptorsUndeployable}: - log.WithPrefix("scheduler"). - WithField("tasksDeployed", len(tasksDeployed)). - WithField("partition", envId.String()). - Trace("notified listeners on resourceOffers done") - default: - if viper.GetBool("veryVerbose") { + if deploymentRequestPayload != nil { + select { + case deploymentRequestPayload.outcomeCh <- ResourceOffersOutcome{ + deployed: tasksDeployed, + undeployed: descriptorsStillToDeploy, + undeployable: descriptorsUndeployable, + }: log.WithPrefix("scheduler"). + WithField("tasksDeployed", len(tasksDeployed)). WithField("partition", envId.String()). - Trace("no listeners notified") + Trace("notified listeners on resourceOffers done") + default: + if viper.GetBool("veryVerbose") { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + Trace("no listeners notified") + } } } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index dd3d8bf43..e35d5d1e3 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -47,6 +47,11 @@ import ( "github.com/spf13/viper" ) +const ( + MAX_CONCURRENT_DEPLOY_REQUESTS = 100 + MAX_ATTEMPTS_PER_DEPLOY_REQUEST = 3 +) + type schedulerState struct { sync.RWMutex @@ -59,10 +64,9 @@ type schedulerState struct { err error // not used in multiple goroutines: - executor *mesos.ExecutorInfo - reviveTokens <-chan struct{} - resourceOffersDone chan ResourceOffersOutcome - tasksToDeploy chan ResourceOffersDeploymentRequest + executor *mesos.ExecutorInfo + reviveTokens <-chan struct{} + tasksToDeploy chan *ResourceOffersDeploymentRequest reviveOffersTrg chan struct{} random *rand.Rand @@ -100,8 +104,7 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( return nil, err } - resourceOffersDone := make(chan ResourceOffersOutcome) - tasksToDeploy := make(chan ResourceOffersDeploymentRequest) + tasksToDeploy := make(chan *ResourceOffersDeploymentRequest, MAX_CONCURRENT_DEPLOY_REQUESTS) reviveOffersTrg := make(chan struct{}) @@ -113,7 +116,6 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( viper.GetDuration("mesosReviveWait"), viper.GetDuration("mesosReviveWait"), nil), - resourceOffersDone: resourceOffersDone, tasksToDeploy: tasksToDeploy, reviveOffersTrg: reviveOffersTrg, wantsTaskResources: mesos.Resources{}, From d59e65ebd291cd0b481ffed249d4f5bb5bc642b0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 28 Jun 2024 13:40:58 +0200 Subject: [PATCH 1947/2352] [build] Bump to v1.13.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 51dc08407..29b807f73 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 12 +VERSION_MINOR := 13 VERSION_PATCH := 0 From e556b5addf22da9c668371608b01a2b0fddd56bf Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Jun 2024 17:08:11 +0200 Subject: [PATCH 1948/2352] [core] test environment's FSM, handling hooks and fix discovered issues The fixes being: - set run_end_completion_time_ms also at the end of GO_ERROR transition - document that the ECS does not abort the call execution upon timeout, merely passes the parameter to the call - avoid a crash if the FSM.Event() is called without providing a Transition --- Makefile | 2 +- core/environment/environment.go | 25 ++ core/environment/environment_test.go | 56 ++++ core/environment/environment_test.yaml | 13 + core/environment/fsm_test.go | 120 ++++++++ core/environment/hooks_test.go | 400 +++++++++++++++++++++++++ core/environment/transition.go | 7 +- core/integration/testplugin/plugin.go | 81 +++-- core/workflow/aggregatorrole.go | 13 + core/workflow/callrole.go | 15 + docs/handbook/configuration.md | 2 +- 11 files changed, 711 insertions(+), 23 deletions(-) create mode 100644 core/environment/environment_test.go create mode 100644 core/environment/environment_test.yaml create mode 100644 core/environment/fsm_test.go create mode 100644 core/environment/hooks_test.go diff --git a/Makefile b/Makefile index 0766d7f7f..2f1699132 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration +TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/core/environment/environment.go b/core/environment/environment.go index 86148c9c1..e30c93a3d 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -525,6 +525,27 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.workflow.GetVars().Del("runNumber") // Ensure the auto stop timer is stopped (important for stop transitions NOT triggered by the timer itself) env.invalidateAutoStopTransition() + } else if e.Event == "GO_ERROR" { + endCompletionTime, ok := env.workflow.GetUserVars().Get("run_end_completion_time_ms") + if ok && endCompletionTime == "" { + runEndCompletionTime := time.Now() + runEndCompletionTimeStr := strconv.FormatInt(runEndCompletionTime.UnixMilli(), 10) + env.workflow.SetRuntimeVar("run_end_completion_time_ms", runEndCompletionTimeStr) + + the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(&pb.Ev_RunEvent{ + EnvironmentId: envId.String(), + RunNumber: env.GetCurrentRunNumber(), + State: env.Sm.Current(), + Error: "", + Transition: e.Event, + TransitionStatus: pb.OpStatus_DONE_OK, + Vars: nil, + }, runEndCompletionTime) + + } else { + log.WithField("partition", envId.String()). + Debug("O2 End Completion time already set before after_GO_ERROR") + } } errorMsg := "" @@ -907,6 +928,10 @@ func (env *Environment) handlerFunc() func(e *fsm.Event) { "partition": env.id.String(), }).Debug("environment.sm starting transition") + if len(e.Args) == 0 { + e.Cancel(errors.New("transition missing in FSM event")) + return + } transition, ok := e.Args[0].(Transition) if !ok { e.Cancel(errors.New("transition wrapping error")) diff --git a/core/environment/environment_test.go b/core/environment/environment_test.go new file mode 100644 index 000000000..0d1b150e9 --- /dev/null +++ b/core/environment/environment_test.go @@ -0,0 +1,56 @@ +package environment + +import ( + "github.com/AliceO2Group/Control/core/integration" + "github.com/AliceO2Group/Control/core/integration/testplugin" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/spf13/viper" + "io" + "os" + "testing" +) + +const envTestConfig = "environment_test.yaml" + +var tmpDir *string + +var _ = BeforeSuite(func() { + var err error + tmpDir = new(string) + *tmpDir, err = os.MkdirTemp("", "o2control-core-environment") + Expect(err).NotTo(HaveOccurred()) + + // copy config files + configFiles := []string{envTestConfig} + for _, configFile := range configFiles { + from, err := os.Open("./" + configFile) + Expect(err).NotTo(HaveOccurred()) + defer from.Close() + + to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) + Expect(err).NotTo(HaveOccurred()) + defer to.Close() + + _, err = io.Copy(to, from) + Expect(err).NotTo(HaveOccurred()) + } + + viper.Set("coreWorkingDir", tmpDir) // used by NewRunNumber with YAML backend + + integration.Reset() + integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) + viper.Reset() + viper.Set("integrationPlugins", []string{"testplugin"}) + viper.Set("testPluginEndpoint", "http://example.com") + viper.Set("config_endpoint", "file://"+*tmpDir+"/"+envTestConfig) +}) + +func TestCoreEnvironment(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Core Environment Test Suite") +} + +var _ = AfterSuite(func() { + os.RemoveAll(*tmpDir) +}) diff --git a/core/environment/environment_test.yaml b/core/environment/environment_test.yaml new file mode 100644 index 000000000..e37e5e39d --- /dev/null +++ b/core/environment/environment_test.yaml @@ -0,0 +1,13 @@ +# the contents of this file are not really used, but we need an apricot instance for environment test package, which needs a non-empty file +o2: + components: + qc: + TECHNICAL: + any: + entry: "config" + runtime: + aliecs: + defaults: + key1: value1 + vars: + key2: value2 \ No newline at end of file diff --git a/core/environment/fsm_test.go b/core/environment/fsm_test.go new file mode 100644 index 000000000..2fa50757e --- /dev/null +++ b/core/environment/fsm_test.go @@ -0,0 +1,120 @@ +package environment + +import ( + "github.com/AliceO2Group/Control/common/utils/uid" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("allowed states and transitions in the environment FSM", func() { + var env *Environment + BeforeEach(func() { + envId, err := uid.FromString("2oDvieFrVTi") + Expect(err).NotTo(HaveOccurred()) + + env, err = newEnvironment(nil, envId) + Expect(err).NotTo(HaveOccurred()) + Expect(env).NotTo(BeNil()) + }) + When("FSM is created", func() { + It("should be in STANDBY", func() { + Expect(env.Sm.Current()).To(Equal("STANDBY")) + }) + }) + When("FSM is in STANDBY", func() { + It("should allow for DEPLOY, GO_ERROR and EXIT transitions", func() { + env.Sm.SetState("STANDBY") + Expect(env.Sm.Can("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Can("GO_ERROR")).To(BeTrue()) + Expect(env.Sm.Can("EXIT")).To(BeTrue()) + }) + It("should not allow for other transitions", func() { + env.Sm.SetState("STANDBY") + Expect(env.Sm.Cannot("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Cannot("RESET")).To(BeTrue()) + Expect(env.Sm.Cannot("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("RECOVER")).To(BeTrue()) + }) + }) + When("FSM is in DEPLOYED", func() { + It("should allow for CONFIGURED, GO_ERROR and EXIT transitions", func() { + env.Sm.SetState("DEPLOYED") + Expect(env.Sm.Can("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Can("GO_ERROR")).To(BeTrue()) + Expect(env.Sm.Can("EXIT")).To(BeTrue()) + }) + It("should not allow for other transitions", func() { + env.Sm.SetState("DEPLOYED") + Expect(env.Sm.Cannot("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Cannot("RESET")).To(BeTrue()) + Expect(env.Sm.Cannot("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("RECOVER")).To(BeTrue()) + }) + }) + When("FSM is in CONFIGURED", func() { + It("should allow for START_ACTIVITY, RESET, GO_ERROR and EXIT transitions", func() { + env.Sm.SetState("CONFIGURED") + Expect(env.Sm.Can("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Can("RESET")).To(BeTrue()) + Expect(env.Sm.Can("GO_ERROR")).To(BeTrue()) + Expect(env.Sm.Can("EXIT")).To(BeTrue()) + }) + It("should not allow for other transitions", func() { + env.Sm.SetState("CONFIGURED") + Expect(env.Sm.Cannot("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Cannot("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Cannot("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("RECOVER")).To(BeTrue()) + }) + }) + When("FSM is in RUNNING", func() { + It("should allow for STOP_ACTIVITY and GO_ERROR transitions", func() { + env.Sm.SetState("RUNNING") + Expect(env.Sm.Can("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Can("GO_ERROR")).To(BeTrue()) + }) + It("should not allow for other transitions", func() { + env.Sm.SetState("RUNNING") + Expect(env.Sm.Cannot("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Cannot("RESET")).To(BeTrue()) + Expect(env.Sm.Cannot("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Cannot("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("RECOVER")).To(BeTrue()) + Expect(env.Sm.Cannot("EXIT")).To(BeTrue()) + }) + }) + When("FSM is in ERROR", func() { + It("should allow for RECOVER transition", func() { + env.Sm.SetState("ERROR") + Expect(env.Sm.Can("RECOVER")).To(BeTrue()) + // We do not include EXIT as possible transition, since anyway we kill tasks not caring about the FSM. + // There is no known issue which could forbid us from that. + // TEARDOWN and DESTROY are the artificial transitions which correspond to that. + }) + It("should not allow for other transitions", func() { + env.Sm.SetState("ERROR") + Expect(env.Sm.Cannot("GO_ERROR")).To(BeTrue()) + Expect(env.Sm.Cannot("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Cannot("RESET")).To(BeTrue()) + Expect(env.Sm.Cannot("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Cannot("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("EXIT")).To(BeTrue()) + }) + }) + When("FSM is in DONE", func() { + It("should not allow for any transitions", func() { + env.Sm.SetState("DONE") + Expect(env.Sm.Cannot("GO_ERROR")).To(BeTrue()) + Expect(env.Sm.Cannot("DEPLOY")).To(BeTrue()) + Expect(env.Sm.Cannot("RESET")).To(BeTrue()) + Expect(env.Sm.Cannot("CONFIGURE")).To(BeTrue()) + Expect(env.Sm.Cannot("START_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("STOP_ACTIVITY")).To(BeTrue()) + Expect(env.Sm.Cannot("RECOVER")).To(BeTrue()) + Expect(env.Sm.Cannot("EXIT")).To(BeTrue()) + }) + }) +}) diff --git a/core/environment/hooks_test.go b/core/environment/hooks_test.go new file mode 100644 index 000000000..8c20cacc4 --- /dev/null +++ b/core/environment/hooks_test.go @@ -0,0 +1,400 @@ +package environment + +import ( + "context" + "fmt" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/workflow" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +type DummyTransition struct { + baseTransition + fail bool +} + +func NewDummyTransition(transition string, fail bool) Transition { + return &DummyTransition{ + baseTransition: baseTransition{ + name: transition, + taskman: nil, + }, + fail: fail, + } +} + +func (t DummyTransition) do(env *Environment) (err error) { + if t.fail { + return fmt.Errorf("transition successfully failed") + } + return nil +} + +var _ = Describe("calling hooks on FSM events", func() { + var env *Environment + BeforeEach(func() { + envId, err := uid.FromString("2oDvieFrVTi") + Expect(err).NotTo(HaveOccurred()) + + env, err = newEnvironment(map[string]string{}, envId) + Expect(err).NotTo(HaveOccurred()) + Expect(env).NotTo(BeNil()) + }) + + It("should execute the requested plugin call without errors", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "before_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).NotTo(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + + It("should return an error if a critical hook fails", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "before_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + env.workflow.GetUserVars().Set("testplugin_fail", "true") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).To(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + + It("should not return an error if an non-critical hook fails", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: false, Await: "before_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + env.workflow.GetUserVars().Set("testplugin_fail", "true") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).NotTo(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + + It("should execute a hook with await statement different than the trigger, but within the same transition", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "after_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).NotTo(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + + It("should execute a hook with await statement at a different transition than the trigger", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "before_RESET"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "RESET", NewDummyTransition("RESET", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + + It("should not execute a hook that should happen after a successful transition, but the transition fails", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "after_CONFIGURE", Timeout: "5s", Critical: true, Await: "after_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", true)) + Expect(err).To(HaveOccurred()) + + _, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeFalse()) + }) + + Context("activity-related timestamps", func() { + It("should set run_start_time_ms before before_START_ACTIVITY hooks", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_START_ACTIVITY"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("seen_run_start_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + _, ok = env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + Expect(ok).To(BeFalse()) + }) + It("should set run_start_completion_time_ms after after_START_ACTIVITY hooks", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call1", + task.Traits{Trigger: "after_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_START_ACTIVITY"}, + "testplugin.TimestampObserver()", + ""), + workflow.NewCallRole( + "call2", + task.Traits{Trigger: "before_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_STOP_ACTIVITY"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + + Expect(err).NotTo(HaveOccurred()) + _, ok := env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + Expect(ok).To(BeFalse()) + + err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) + + Expect(err).NotTo(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + It("should set run_end_time_ms before before_STOP_ACTIVITY hooks", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call1", + task.Traits{Trigger: "before_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_STOP_ACTIVITY"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + Expect(ok).To(BeFalse()) + }) + It("should set run_end_completion_time_ms after after_STOP_ACTIVITY hooks", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call1", + task.Traits{Trigger: "after_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_STOP_ACTIVITY"}, + "testplugin.TimestampObserver()", + ""), + workflow.NewCallRole( + "call2", + task.Traits{Trigger: "before_RESET", Timeout: "5s", Critical: true, Await: "before_RESET"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + Expect(ok).To(BeFalse()) + + err = env.Sm.Event(context.Background(), "RESET", NewDummyTransition("RESET", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + }) + It("should clear timestamps from previous runs and set run_start_time_ms again before before_START_ACTIVITY hooks", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "before_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_START_ACTIVITY"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + + env.workflow.GetUserVars().Del("seen_run_start_time_ms") + env.workflow.GetUserVars().Del("seen_run_start_completion_time_ms") + env.workflow.GetUserVars().Del("seen_run_end_time_ms") + env.workflow.GetUserVars().Del("seen_run_end_completion_time_ms") + err = env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("seen_run_start_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + _, ok = env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + Expect(ok).To(BeFalse()) + _, ok = env.workflow.GetUserVars().Get("seen_run_end_time_ms") + Expect(ok).To(BeFalse()) + _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + Expect(ok).To(BeFalse()) + }) + When("START_ACTIVITY transition fails", func() { + It("should set SOSOR timestamp, while the subsequent GO_ERROR transition should set SOEOR and EOEOR (but NOT EOSOR)", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", true)) + Expect(err).To(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("run_start_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + v, ok = env.workflow.GetUserVars().Get("run_start_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(BeEmpty()) + + err = env.Sm.Event(context.Background(), "GO_ERROR", NewDummyTransition("GO_ERROR", false)) + Expect(err).NotTo(HaveOccurred()) + v, ok = env.workflow.GetUserVars().Get("run_start_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(BeEmpty()) + v, ok = env.workflow.GetUserVars().Get("run_end_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + v, ok = env.workflow.GetUserVars().Get("run_end_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + }) + }) + When("STOP_ACTIVITY transition fails", func() { + It("should set SOEOR timestamp, while EOEOR should be set by subsequent GO_ERROR transition", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", true)) + Expect(err).To(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("run_end_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + v, ok = env.workflow.GetUserVars().Get("run_end_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(BeEmpty()) + + err = env.Sm.Event(context.Background(), "GO_ERROR", NewDummyTransition("GO_ERROR", false)) + Expect(err).NotTo(HaveOccurred()) + v, ok = env.workflow.GetUserVars().Get("run_end_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + }) + }) + When("environment goes to ERROR while in RUNNING", func() { + It("should set both run end timestamps", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call1", + task.Traits{Trigger: "leave_RUNNING", Timeout: "5s", Critical: true, Await: "leave_RUNNING"}, + "testplugin.TimestampObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("CONFIGURED") + + err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) + Expect(err).NotTo(HaveOccurred()) + err = env.Sm.Event(context.Background(), "GO_ERROR", NewDummyTransition("GO_ERROR", false)) + Expect(err).NotTo(HaveOccurred()) + + v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + Expect(ok).To(BeFalse()) + v, ok = env.workflow.GetUserVars().Get("run_end_completion_time_ms") + Expect(ok).To(BeTrue()) + Expect(v).NotTo(BeEmpty()) + }) + }) + }) + + It("should allow to arrange multiple calls in order", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call3", + task.Traits{Trigger: "before_CONFIGURE+50", Timeout: "5s", Critical: true, Await: "before_CONFIGURE+50"}, + "testplugin.CallOrderObserver()", + ""), + workflow.NewCallRole( + "call2", + task.Traits{Trigger: "before_CONFIGURE+0", Timeout: "5s", Critical: true, Await: "before_CONFIGURE+0"}, + "testplugin.CallOrderObserver()", + ""), + workflow.NewCallRole( + "call1", + task.Traits{Trigger: "before_CONFIGURE-50", Timeout: "5s", Critical: true, Await: "before_CONFIGURE-50"}, + "testplugin.CallOrderObserver()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).NotTo(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("call_history") // set by testplugin.CallOrderObserver + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("root.call1,root.call2,root.call3")) + }) +}) diff --git a/core/environment/transition.go b/core/environment/transition.go index 947195c29..a821e3dfa 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -22,7 +22,6 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ - package environment import ( @@ -61,13 +60,13 @@ func MakeTransition(taskman *task.Manager, optype pb.ControlEnvironmentRequest_O } type baseTransition struct { - taskman *task.Manager - name string + taskman *task.Manager + name string } func (t baseTransition) check() (err error) { if t.taskman == nil { - err = errors.New("cannot configure environment with nil roleman") + err = errors.New("cannot transition environment with nil taskman") } return } diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index a79bdce49..bad1b69bd 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -126,6 +126,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { doFail = false } + doHangS, ok := varStack["testplugin_hang"] + if !ok { + doHangS = "false" + } + doHang, convErr := strconv.ParseBool(doHangS) + if convErr != nil { + doHang = false + } + stack = make(map[string]interface{}) stack["Noop"] = func() (out string) { // must formally return string even when we return nothing log.WithField("partition", envId). @@ -166,30 +175,68 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("await", call.GetTraits().Await). Infof("executing testplugin.Test call: %s", message) - rn := varStack["run_number"] - var ( - runNumber64 int64 - err error - ) - runNumber64, err = strconv.ParseInt(rn, 10, 32) - if err != nil { - runNumber64 = 0 + rolePath, ok := varStack["__call_rolepath"] + if !ok { + call.VarStack["__call_error"] = "could not get __call_rolepath" } - timeout := callable.AcquireTimeout(TESTPLUGIN_GENERAL_OP_TIMEOUT, varStack, "Test", envId) - defer log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("rolepath", call.GetParentRolePath()). - WithField("trigger", call.GetTraits().Trigger). - WithField("await", call.GetTraits().Await). - WithField("run", runNumber64). - Infof("executed testplugin.Test call in %s", timeout) + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar(rolePath+"_called", "true") + } - time.Sleep(timeout) if doFail { call.VarStack["__call_error"] = "error triggered in testplugin.Test call" } + if doHang { + for { + time.Sleep(time.Second) + } + } + + return + } + stack["TimestampObserver"] = func() (out string) { + rolePath, ok := varStack["__call_rolepath"] + if !ok { + call.VarStack["__call_error"] = "could not get __call_rolepath" + } + + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar(rolePath+"_called", "true") + } else { + call.VarStack["__call_error"] = "could not get parent role" + return + } + + // check presence of the four expected run-related timestamps + for _, key := range []string{"run_start_time_ms", "run_start_completion_time_ms", "run_end_time_ms", "run_end_completion_time_ms"} { + value, ok := varStack[key] + if ok && len(value) > 0 && value != "0" { + parentRole.SetGlobalRuntimeVar("seen_"+key, "true") + } + } + return + } + stack["CallOrderObserver"] = func() (out string) { + rolePath, ok := varStack["__call_rolepath"] + if !ok { + call.VarStack["__call_error"] = "could not get __call_rolepath" + } + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if !ok { + call.VarStack["__call_error"] = "could not get parent role" + return + } + + callHistory, _ := varStack["call_history"] + if len(callHistory) == 0 { + parentRole.SetGlobalRuntimeVar("call_history", rolePath) + } else { + parentRole.SetGlobalRuntimeVar("call_history", callHistory+","+rolePath) + } return } diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 4446e5dcc..f3d287205 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/gera" "strings" "sync" texttemplate "text/template" @@ -49,6 +50,18 @@ type aggregatorRole struct { aggregator } +func NewAggregatorRole(name string, roles []Role) (r Role) { + return &aggregatorRole{ + roleBase: roleBase{ + Name: name, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), + }, + aggregator: aggregator{Roles: roles}, + } +} + func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // NOTE: see NOTE in roleBase.UnmarshalYAML diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index ddbb06c19..8d7b67c48 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -26,6 +26,7 @@ package workflow import ( "errors" + "github.com/AliceO2Group/Control/common/gera" "strings" texttemplate "text/template" "time" @@ -51,6 +52,20 @@ type callRole struct { ReturnVar string `yaml:"-,omitempty"` } +func NewCallRole(name string, traits task.Traits, funcCall string, returnVar string) (r Role) { + return &callRole{ + roleBase: roleBase{ + Name: name, + Defaults: gera.MakeStringMap(), + Vars: gera.MakeStringMap(), + UserVars: gera.MakeStringMap(), + }, + Traits: traits, + FuncCall: funcCall, + ReturnVar: returnVar, + } +} + func (t *callRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { aux := struct { Call struct { diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index c2b3a86a2..baabe2ea1 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -39,7 +39,7 @@ The state machine callback moments are exposed to the AliECS workflow template i * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). * `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. -* `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time `func` will be granted to complete before its context is invalidated. +* `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time that `func` should take. The value is provided to the plugin via `varStack["__call_timeout"]` and the plugin should implement a timeout mechanism. The ECS will not abort the call upon reaching the timeout value! * `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. Consider the following example: From e996a9033ff147738bdd05a2f82eb132a937d647 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:14:03 +0200 Subject: [PATCH 1949/2352] [docs] Update information on AliECS production deployment --- docs/running.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/running.md b/docs/running.md index 2be658ccc..25021825f 100644 --- a/docs/running.md +++ b/docs/running.md @@ -27,3 +27,15 @@ http://centosvmtest:5050/api/v1/scheduler ``` See [Using `coconut`](./coconut/README.md) for instructions on the O² Control core command line interface. + +# Running AliECS in production + +The AliECS core runs as a systemd service in the O²/FLP cluster at Point 2. + +## Health checks + +There is a checker script that polls AliECS for its status (`coconut env list`). + +1) The checker script (checkAliECScore available in GL) now makes 3 attempts with 10 seconds timeout. +2) All failed attempts are recorded in the aliecs local file /tmp/checkAliECScore.out +3) The ILG message is issued at the third consecutive failure. From 6f9c094937294611518478dd9bead6227c9c9bcb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Wed, 3 Jul 2024 11:24:29 +0200 Subject: [PATCH 1950/2352] [docs] Mention usage of cron in checker script --- docs/running.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/running.md b/docs/running.md index 25021825f..840c89aab 100644 --- a/docs/running.md +++ b/docs/running.md @@ -36,6 +36,6 @@ The AliECS core runs as a systemd service in the O²/FLP cluster at Point 2. There is a checker script that polls AliECS for its status (`coconut env list`). -1) The checker script (checkAliECScore available in GL) now makes 3 attempts with 10 seconds timeout. +1) The checker script runs via cron (checkAliECScore available in GL) and makes 3 attempts with 10 seconds timeout. 2) All failed attempts are recorded in the aliecs local file /tmp/checkAliECScore.out 3) The ILG message is issued at the third consecutive failure. From 1351c2590f0d035a0a7e4051c6b6972303b0f1e2 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 5 Jul 2024 14:55:12 +0200 Subject: [PATCH 1951/2352] [occ] avoid a leak in JsonMessage::Deserialize --- occ/plugin/litestructs/JsonMessage.cxx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index 576c8b378..1249c71dc 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -63,6 +63,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) if (!status.ok()) { OLOG(error) << "Cannot dump JsonMessage slices, error code " << status.error_code() << " " << status.error_message() << " " << status.error_details(); + delete slices; return false; } @@ -75,7 +76,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) } OLOG(detail) << "Deserialized JsonMessage: " << ss.str(); - + delete slices; return Deserialize(ss.str()); } From 4413c663710c6229f3970585a57e961bba74fd47 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 8 Jul 2024 09:23:13 +0200 Subject: [PATCH 1952/2352] [core] OCTRL-891 propagate pdp_beam_type and pdp sor override to tasks pdp_beam_type and pdp_override_run_start_time are propagated to tasks during SOR, so during SYNTHETIC runs they can know the right beam type and start of run correlated with the timing of synthetic data. --- core/environment/transition_startactivity.go | 2 ++ docs/handbook/configuration.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index a7a4b9054..f81ae825f 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -92,6 +92,8 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "run_start_time_ms", "run_end_time_ms", // included to ensure that a cleared SOEOR timestamp is propagated to all tasks during START-STOP-START "lhc_period", + "pdp_beam_type", + "pdp_override_run_start_time", } { if value, ok := cvs[key]; ok { // we push the above parameters with both camelCase and snake_case identifiers for convenience diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index baabe2ea1..a3a2a89ca 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -101,6 +101,8 @@ In addition to the above, which varies depending on the configuration of the env * `runType` * `runStartTimeMs` * `lhcPeriod` + * `pdp_beam_type` + * `pdp_override_run_start_time` FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` transition via `SetProperty` calls. From ac23091af7f2a0e59013ce3211a85466eacb1f51 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Jul 2024 10:33:00 +0200 Subject: [PATCH 1953/2352] [core] Useless lock is useless --- core/environment/manager.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index b149deb8e..63440b667 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -870,8 +870,6 @@ func (envs *Manager) Ids() (keys []uid.ID) { } func (envs *Manager) Environment(environmentId uid.ID) (env *Environment, err error) { - envs.mu.RLock() - defer envs.mu.RUnlock() return envs.environment(environmentId) } From 32f4cb22c80ad1063b9e015b82e042b2414f44e2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 9 Jul 2024 11:03:23 +0200 Subject: [PATCH 1954/2352] [core] Publish correct state when tasks_ is done --- core/environment/environment.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index e30c93a3d..4c186dfee 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -368,7 +368,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ EnvironmentId: env.id.String(), - State: env.Sm.Current(), + State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned RunNumber: env.currentRunNumber, Error: errorMsg, Message: "transition step finished", From efc02fda7200988cfeddf956211595ba6ea58ec5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 10 Jul 2024 14:28:01 +0200 Subject: [PATCH 1955/2352] [build] Bump to v1.14.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 29b807f73..67d3ac1d3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 13 +VERSION_MINOR := 14 VERSION_PATCH := 0 From 4dd591c4a4cf43aa007f6cc24e9de8dd4cd7ee8a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 Jul 2024 10:59:43 +0200 Subject: [PATCH 1956/2352] [core] New protofile common.proto + User type + regenerate proto --- coconut/protos/o2control.pb.go | 261 ++++++++++++-------- common/doc.go | 1 + common/protos/common.pb.go | 193 +++++++++++++++ common/protos/common.proto | 41 ++++ common/protos/events.pb.go | 434 ++++++++++++++++++--------------- common/protos/events.proto | 4 + core/protos/o2control.pb.go | 261 ++++++++++++-------- core/protos/o2control.proto | 4 + 8 files changed, 784 insertions(+), 415 deletions(-) create mode 100644 common/protos/common.pb.go create mode 100644 common/protos/common.proto diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 8c846cff1..dbd2b96e6 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -998,6 +998,7 @@ type NewEnvironmentRequest struct { Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` AutoTransition bool `protobuf:"varint,4,opt,name=autoTransition,proto3" json:"autoTransition,omitempty"` + RequestUser *protos.User `protobuf:"bytes,5,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1060,6 +1061,13 @@ func (x *NewEnvironmentRequest) GetAutoTransition() bool { return false } +func (x *NewEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1123,6 +1131,7 @@ type NewAutoEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + RequestUser *protos.User `protobuf:"bytes,4,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *NewAutoEnvironmentRequest) Reset() { @@ -1178,6 +1187,13 @@ func (x *NewAutoEnvironmentRequest) GetId() string { return "" } +func (x *NewAutoEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1339,8 +1355,9 @@ type ControlEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + RequestUser *protos.User `protobuf:"bytes,3,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *ControlEnvironmentRequest) Reset() { @@ -1389,6 +1406,13 @@ func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { return ControlEnvironmentRequest_NOOP } +func (x *ControlEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type ControlEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1663,10 +1687,11 @@ type DestroyEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` + RequestUser *protos.User `protobuf:"bytes,5,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *DestroyEnvironmentRequest) Reset() { @@ -1729,6 +1754,13 @@ func (x *DestroyEnvironmentRequest) GetForce() bool { return false } +func (x *DestroyEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type DestroyEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4277,7 +4309,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xfc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, @@ -4289,7 +4321,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, @@ -4299,7 +4334,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, @@ -4309,7 +4344,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, @@ -4330,13 +4368,16 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x63, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, @@ -4387,7 +4428,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, @@ -4397,7 +4438,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, @@ -4981,7 +5025,8 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 77: o2control.RoleInfo.ConsolidatedStackEntry nil, // 78: o2control.WorkflowTemplateInfo.VarSpecMapEntry nil, // 79: o2control.ListIntegratedServicesReply.ServicesEntry - (*protos.Event)(nil), // 80: events.Event + (*protos.User)(nil), // 80: common.User + (*protos.Event)(nil), // 81: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version @@ -4992,98 +5037,102 @@ var file_protos_o2control_proto_depIdxs = []int32{ 67, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry 68, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry 69, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 70, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 44, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 42, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 71, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 72, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 40, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 39, // 23: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 39, // 24: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 38, // 25: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 73, // 26: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 32, // 27: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 32, // 28: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 44, // 29: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 74, // 30: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 75, // 31: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 76, // 32: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 77, // 33: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 44, // 34: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 3, // 35: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 2, // 36: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 78, // 37: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 48, // 38: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 51, // 39: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 79, // 40: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 47, // 41: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 64, // 42: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 5, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 10, // 44: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 15, // 45: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 13, // 46: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 17, // 47: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 19, // 48: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 24, // 49: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 62, // 50: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 62, // 51: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 13, // 52: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest - 34, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 36, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 41, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 43, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 46, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 50, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 53, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 55, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 57, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 58, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 59, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 60, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 4, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 62, // 66: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 67: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 21, // 68: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 7, // 69: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 11, // 70: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 16, // 71: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 14, // 72: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 18, // 73: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 20, // 74: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 25, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 26, // 76: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 27, // 77: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 14, // 78: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply - 35, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 37, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 42, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 45, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 49, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 52, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 54, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 56, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 62, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 62, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 62, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 61, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 80, // 91: o2control.Control.Subscribe:output_type -> events.Event - 63, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 9, // 93: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 23, // 94: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 69, // [69:95] is the sub-list for method output_type - 43, // [43:69] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 80, // 8: o2control.NewEnvironmentRequest.requestUser:type_name -> common.User + 12, // 9: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 70, // 10: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 80, // 11: o2control.NewAutoEnvironmentRequest.requestUser:type_name -> common.User + 12, // 12: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 44, // 13: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 0, // 14: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 80, // 15: o2control.ControlEnvironmentRequest.requestUser:type_name -> common.User + 22, // 16: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 1, // 17: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 22, // 18: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 80, // 19: o2control.DestroyEnvironmentRequest.requestUser:type_name -> common.User + 42, // 20: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 71, // 21: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 72, // 22: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 33, // 23: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 32, // 24: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 40, // 25: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 32, // 26: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 39, // 27: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 39, // 28: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 38, // 29: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 73, // 30: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 31: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 32: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 44, // 33: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 74, // 34: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 75, // 35: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 76, // 36: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 77, // 37: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 44, // 38: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 39: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 40: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 78, // 41: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 48, // 42: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 51, // 43: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 79, // 44: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 47, // 45: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 64, // 46: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 47: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 53: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 62, // 54: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 62, // 55: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 56: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 57: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 58: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 41, // 59: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 43, // 60: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 46, // 61: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 50, // 62: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 53, // 63: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 55, // 64: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 57, // 65: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 58, // 66: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 59, // 67: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 60, // 68: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 69: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 62, // 70: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 71: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 72: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 73: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 75: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 76: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 77: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 78: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 80: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 81: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 82: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 42, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 45, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 49, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 52, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 54, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 56, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 62, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 62, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 62, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 61, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 81, // 95: o2control.Control.Subscribe:output_type -> events.Event + 63, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 97: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 98: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 73, // [73:99] is the sub-list for method output_type + 47, // [47:73] is the sub-list for method input_type + 47, // [47:47] is the sub-list for extension type_name + 47, // [47:47] is the sub-list for extension extendee + 0, // [0:47] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } diff --git a/common/doc.go b/common/doc.go index d1d6f80be..1e46b6324 100644 --- a/common/doc.go +++ b/common/doc.go @@ -27,3 +27,4 @@ package common //go:generate protoc -I=./ --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/events.proto +//go:generate protoc -I=./ --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/common.proto diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go new file mode 100644 index 000000000..eccc0da73 --- /dev/null +++ b/common/protos/common.pb.go @@ -0,0 +1,193 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2024 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.25.3 +// source: protos/common.proto + +package pb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique CERN identifier of this user. + ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` + // The unique identifier of this entity. + Id *int32 `protobuf:"varint,2,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Name of the user. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{0} +} + +func (x *User) GetExternalId() int32 { + if x != nil { + return x.ExternalId + } + return 0 +} + +func (x *User) GetId() int32 { + if x != nil && x.Id != nil { + return *x.Id + } + return 0 +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +var File_protos_common_proto protoreflect.FileDescriptor + +var file_protos_common_proto_rawDesc = []byte{ + 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x56, 0x0a, + 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, + 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, + 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, +} + +var ( + file_protos_common_proto_rawDescOnce sync.Once + file_protos_common_proto_rawDescData = file_protos_common_proto_rawDesc +) + +func file_protos_common_proto_rawDescGZIP() []byte { + file_protos_common_proto_rawDescOnce.Do(func() { + file_protos_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_common_proto_rawDescData) + }) + return file_protos_common_proto_rawDescData +} + +var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_protos_common_proto_goTypes = []interface{}{ + (*User)(nil), // 0: common.User +} +var file_protos_common_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_protos_common_proto_init() } +func file_protos_common_proto_init() { + if File_protos_common_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_common_proto_msgTypes[0].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_common_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_common_proto_goTypes, + DependencyIndexes: file_protos_common_proto_depIdxs, + MessageInfos: file_protos_common_proto_msgTypes, + }.Build() + File_protos_common_proto = out.File + file_protos_common_proto_rawDesc = nil + file_protos_common_proto_goTypes = nil + file_protos_common_proto_depIdxs = nil +} diff --git a/common/protos/common.proto b/common/protos/common.proto new file mode 100644 index 000000000..45e2fd992 --- /dev/null +++ b/common/protos/common.proto @@ -0,0 +1,41 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + + +syntax = "proto3"; + +package common; +option java_package = "ch.cern.alice.o2.control.common"; +option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; + +//////////////// Common types /////////////// + +message User { + // The unique CERN identifier of this user. + int32 externalId = 1; + // The unique identifier of this entity. + optional int32 id = 2; + // Name of the user. + string name = 3; +} diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 0e416d0cc..2d7f2eb24 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -255,6 +255,7 @@ type Ev_EnvironmentEvent struct { TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` TransitionStatus OpStatus `protobuf:"varint,8,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // consolidated environment variables at the root role of the environment + LastRequestUser *User `protobuf:"bytes,10,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` } func (x *Ev_EnvironmentEvent) Reset() { @@ -352,6 +353,13 @@ func (x *Ev_EnvironmentEvent) GetVars() map[string]string { return nil } +func (x *Ev_EnvironmentEvent) GetLastRequestUser() *User { + if x != nil { + return x.LastRequestUser + } + return nil +} + type Traits struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -831,6 +839,7 @@ type Ev_RunEvent struct { Transition string `protobuf:"bytes,5,opt,name=transition,proto3" json:"transition,omitempty"` TransitionStatus OpStatus `protobuf:"varint,6,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + LastRequestUser *User `protobuf:"bytes,8,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` } func (x *Ev_RunEvent) Reset() { @@ -914,6 +923,13 @@ func (x *Ev_RunEvent) GetVars() map[string]string { return nil } +func (x *Ev_RunEvent) GetLastRequestUser() *User { + if x != nil { + return x.LastRequestUser + } + return nil +} + type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1105,190 +1121,198 @@ var File_protos_events_proto protoreflect.FileDescriptor var file_protos_events_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1d, 0x0a, - 0x1b, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, - 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x22, 0x3a, 0x0a, 0x16, - 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, - 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, - 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x59, 0x0a, 0x1b, 0x45, 0x76, 0x5f, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x99, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x3c, 0x0a, - 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x6e, 0x0a, 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, - 0x84, 0x02, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, - 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, - 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, - 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, - 0x72, 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x13, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x22, 0x1d, 0x0a, 0x1b, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, + 0x74, 0x22, 0x3a, 0x0a, 0x16, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x22, 0x59, 0x0a, + 0x1b, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd1, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x65, 0x70, 0x12, 0x3c, 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x39, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6e, 0x0a, 0x06, + 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x02, 0x0a, + 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, + 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, + 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, + 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, + 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, - 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, - 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc7, - 0x02, 0x0a, 0x0b, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, - 0x76, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, - 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x1a, - 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x05, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, - 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, - 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, - 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x75, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, - 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, - 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, - 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, - 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, - 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x0b, - 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, - 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, - 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, - 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xff, 0x02, 0x0a, 0x0b, + 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x10, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x0f, + 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x05, + 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, + 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x31, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, + 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, + 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, + 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, + 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, + 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, + 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, + 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, + 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, + 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, + 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1320,31 +1344,34 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Event)(nil), // 11: events.Event nil, // 12: events.Ev_EnvironmentEvent.VarsEntry nil, // 13: events.Ev_RunEvent.VarsEntry + (*User)(nil), // 14: common.User } var file_protos_events_proto_depIdxs = []int32{ 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus 12, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry - 5, // 2: events.Ev_TaskEvent.traits:type_name -> events.Traits - 0, // 3: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus - 5, // 4: events.Ev_CallEvent.traits:type_name -> events.Traits - 0, // 5: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus - 0, // 6: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus - 0, // 7: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus - 13, // 8: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry - 4, // 9: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 6, // 10: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 8, // 11: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 7, // 12: events.Event.callEvent:type_name -> events.Ev_CallEvent - 9, // 13: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 10, // 14: events.Event.runEvent:type_name -> events.Ev_RunEvent - 3, // 15: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 1, // 16: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 2, // 17: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 18, // [18:18] is the sub-list for method output_type - 18, // [18:18] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 14, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User + 5, // 3: events.Ev_TaskEvent.traits:type_name -> events.Traits + 0, // 4: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus + 5, // 5: events.Ev_CallEvent.traits:type_name -> events.Traits + 0, // 6: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus + 0, // 7: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus + 0, // 8: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus + 13, // 9: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry + 14, // 10: events.Ev_RunEvent.lastRequestUser:type_name -> common.User + 4, // 11: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 12: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 13: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 14: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 15: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 10, // 16: events.Event.runEvent:type_name -> events.Ev_RunEvent + 3, // 17: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 18: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 19: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 20, // [20:20] is the sub-list for method output_type + 20, // [20:20] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1352,6 +1379,7 @@ func file_protos_events_proto_init() { if File_protos_events_proto != nil { return } + file_protos_common_proto_init() if !protoimpl.UnsafeEnabled { file_protos_events_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Ev_MetaEvent_MesosHeartbeat); i { diff --git a/common/protos/events.proto b/common/protos/events.proto index 38270e8bf..478d8b6e0 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -28,6 +28,8 @@ package events; option java_package = "ch.cern.alice.o2.control.events"; option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; +import public "protos/common.proto"; + //////////////// Common event messages /////////////// enum OpStatus { @@ -61,6 +63,7 @@ message Ev_EnvironmentEvent { string transitionStep = 7; OpStatus transitionStatus = 8; map vars = 9; // consolidated environment variables at the root role of the environment + common.User lastRequestUser = 10; } message Traits { @@ -120,6 +123,7 @@ message Ev_RunEvent { string transition = 5; OpStatus transitionStatus = 6; map vars = 7; + common.User lastRequestUser = 8; } message Event { diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 8c846cff1..dbd2b96e6 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -998,6 +998,7 @@ type NewEnvironmentRequest struct { Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` AutoTransition bool `protobuf:"varint,4,opt,name=autoTransition,proto3" json:"autoTransition,omitempty"` + RequestUser *protos.User `protobuf:"bytes,5,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *NewEnvironmentRequest) Reset() { @@ -1060,6 +1061,13 @@ func (x *NewEnvironmentRequest) GetAutoTransition() bool { return false } +func (x *NewEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type NewEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1123,6 +1131,7 @@ type NewAutoEnvironmentRequest struct { WorkflowTemplate string `protobuf:"bytes,1,opt,name=workflowTemplate,proto3" json:"workflowTemplate,omitempty"` Vars map[string]string `protobuf:"bytes,2,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` + RequestUser *protos.User `protobuf:"bytes,4,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *NewAutoEnvironmentRequest) Reset() { @@ -1178,6 +1187,13 @@ func (x *NewAutoEnvironmentRequest) GetId() string { return "" } +func (x *NewAutoEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1339,8 +1355,9 @@ type ControlEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Type ControlEnvironmentRequest_Optype `protobuf:"varint,2,opt,name=type,proto3,enum=o2control.ControlEnvironmentRequest_Optype" json:"type,omitempty"` + RequestUser *protos.User `protobuf:"bytes,3,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *ControlEnvironmentRequest) Reset() { @@ -1389,6 +1406,13 @@ func (x *ControlEnvironmentRequest) GetType() ControlEnvironmentRequest_Optype { return ControlEnvironmentRequest_NOOP } +func (x *ControlEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type ControlEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1663,10 +1687,11 @@ type DestroyEnvironmentRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` - AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` - Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + KeepTasks bool `protobuf:"varint,2,opt,name=keepTasks,proto3" json:"keepTasks,omitempty"` + AllowInRunningState bool `protobuf:"varint,3,opt,name=allowInRunningState,proto3" json:"allowInRunningState,omitempty"` + Force bool `protobuf:"varint,4,opt,name=force,proto3" json:"force,omitempty"` + RequestUser *protos.User `protobuf:"bytes,5,opt,name=requestUser,proto3" json:"requestUser,omitempty"` } func (x *DestroyEnvironmentRequest) Reset() { @@ -1729,6 +1754,13 @@ func (x *DestroyEnvironmentRequest) GetForce() bool { return false } +func (x *DestroyEnvironmentRequest) GetRequestUser() *protos.User { + if x != nil { + return x.RequestUser + } + return nil +} + type DestroyEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4277,7 +4309,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xfc, 0x01, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, @@ -4289,7 +4321,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, @@ -4299,7 +4334,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0xd4, 0x01, 0x0a, 0x19, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, @@ -4309,7 +4344,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, @@ -4330,13 +4368,16 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0xdb, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, + 0x63, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, @@ -4387,7 +4428,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x91, 0x01, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, @@ -4397,7 +4438,10 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, @@ -4981,7 +5025,8 @@ var file_protos_o2control_proto_goTypes = []interface{}{ nil, // 77: o2control.RoleInfo.ConsolidatedStackEntry nil, // 78: o2control.WorkflowTemplateInfo.VarSpecMapEntry nil, // 79: o2control.ListIntegratedServicesReply.ServicesEntry - (*protos.Event)(nil), // 80: events.Event + (*protos.User)(nil), // 80: common.User + (*protos.Event)(nil), // 81: events.Event } var file_protos_o2control_proto_depIdxs = []int32{ 6, // 0: o2control.GetFrameworkInfoReply.version:type_name -> o2control.Version @@ -4992,98 +5037,102 @@ var file_protos_o2control_proto_depIdxs = []int32{ 67, // 5: o2control.EnvironmentInfo.userVars:type_name -> o2control.EnvironmentInfo.UserVarsEntry 68, // 6: o2control.EnvironmentInfo.integratedServicesData:type_name -> o2control.EnvironmentInfo.IntegratedServicesDataEntry 69, // 7: o2control.NewEnvironmentRequest.vars:type_name -> o2control.NewEnvironmentRequest.VarsEntry - 12, // 8: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 70, // 9: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry - 12, // 10: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo - 44, // 11: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo - 0, // 12: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype - 22, // 13: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation - 1, // 14: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype - 22, // 15: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation - 42, // 16: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply - 71, // 17: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry - 72, // 18: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry - 33, // 19: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo - 32, // 20: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo - 40, // 21: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo - 32, // 22: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo - 39, // 23: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo - 39, // 24: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo - 38, // 25: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo - 73, // 26: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry - 32, // 27: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo - 32, // 28: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo - 44, // 29: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo - 74, // 30: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry - 75, // 31: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry - 76, // 32: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry - 77, // 33: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry - 44, // 34: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo - 3, // 35: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type - 2, // 36: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget - 78, // 37: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry - 48, // 38: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo - 51, // 39: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo - 79, // 40: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry - 47, // 41: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage - 64, // 42: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo - 5, // 43: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest - 10, // 44: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest - 15, // 45: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest - 13, // 46: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest - 17, // 47: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest - 19, // 48: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest - 24, // 49: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest - 62, // 50: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty - 62, // 51: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty - 13, // 52: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest - 34, // 53: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest - 36, // 54: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest - 41, // 55: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest - 43, // 56: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest - 46, // 57: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest - 50, // 58: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest - 53, // 59: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest - 55, // 60: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest - 57, // 61: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest - 58, // 62: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest - 59, // 63: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest - 60, // 64: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest - 4, // 65: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest - 62, // 66: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty - 8, // 67: o2control.Control.Teardown:input_type -> o2control.TeardownRequest - 21, // 68: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest - 7, // 69: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply - 11, // 70: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply - 16, // 71: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply - 14, // 72: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply - 18, // 73: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply - 20, // 74: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply - 25, // 75: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply - 26, // 76: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply - 27, // 77: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply - 14, // 78: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply - 35, // 79: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply - 37, // 80: o2control.Control.GetTask:output_type -> o2control.GetTaskReply - 42, // 81: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply - 45, // 82: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply - 49, // 83: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply - 52, // 84: o2control.Control.ListRepos:output_type -> o2control.ListReposReply - 54, // 85: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply - 56, // 86: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply - 62, // 87: o2control.Control.RefreshRepos:output_type -> o2control.Empty - 62, // 88: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty - 62, // 89: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty - 61, // 90: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply - 80, // 91: o2control.Control.Subscribe:output_type -> events.Event - 63, // 92: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply - 9, // 93: o2control.Control.Teardown:output_type -> o2control.TeardownReply - 23, // 94: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply - 69, // [69:95] is the sub-list for method output_type - 43, // [43:69] is the sub-list for method input_type - 43, // [43:43] is the sub-list for extension type_name - 43, // [43:43] is the sub-list for extension extendee - 0, // [0:43] is the sub-list for field type_name + 80, // 8: o2control.NewEnvironmentRequest.requestUser:type_name -> common.User + 12, // 9: o2control.NewEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 70, // 10: o2control.NewAutoEnvironmentRequest.vars:type_name -> o2control.NewAutoEnvironmentRequest.VarsEntry + 80, // 11: o2control.NewAutoEnvironmentRequest.requestUser:type_name -> common.User + 12, // 12: o2control.GetEnvironmentReply.environment:type_name -> o2control.EnvironmentInfo + 44, // 13: o2control.GetEnvironmentReply.workflow:type_name -> o2control.RoleInfo + 0, // 14: o2control.ControlEnvironmentRequest.type:type_name -> o2control.ControlEnvironmentRequest.Optype + 80, // 15: o2control.ControlEnvironmentRequest.requestUser:type_name -> common.User + 22, // 16: o2control.ModifyEnvironmentRequest.operations:type_name -> o2control.EnvironmentOperation + 1, // 17: o2control.EnvironmentOperation.type:type_name -> o2control.EnvironmentOperation.Optype + 22, // 18: o2control.ModifyEnvironmentReply.failedOperations:type_name -> o2control.EnvironmentOperation + 80, // 19: o2control.DestroyEnvironmentRequest.requestUser:type_name -> common.User + 42, // 20: o2control.DestroyEnvironmentReply.cleanupTasksReply:type_name -> o2control.CleanupTasksReply + 71, // 21: o2control.SetEnvironmentPropertiesRequest.properties:type_name -> o2control.SetEnvironmentPropertiesRequest.PropertiesEntry + 72, // 22: o2control.GetEnvironmentPropertiesReply.properties:type_name -> o2control.GetEnvironmentPropertiesReply.PropertiesEntry + 33, // 23: o2control.ShortTaskInfo.deploymentInfo:type_name -> o2control.TaskDeploymentInfo + 32, // 24: o2control.GetTasksReply.tasks:type_name -> o2control.ShortTaskInfo + 40, // 25: o2control.GetTaskReply.task:type_name -> o2control.TaskInfo + 32, // 26: o2control.TaskInfo.shortInfo:type_name -> o2control.ShortTaskInfo + 39, // 27: o2control.TaskInfo.inboundChannels:type_name -> o2control.ChannelInfo + 39, // 28: o2control.TaskInfo.outboundChannels:type_name -> o2control.ChannelInfo + 38, // 29: o2control.TaskInfo.commandInfo:type_name -> o2control.CommandInfo + 73, // 30: o2control.TaskInfo.properties:type_name -> o2control.TaskInfo.PropertiesEntry + 32, // 31: o2control.CleanupTasksReply.killedTasks:type_name -> o2control.ShortTaskInfo + 32, // 32: o2control.CleanupTasksReply.runningTasks:type_name -> o2control.ShortTaskInfo + 44, // 33: o2control.RoleInfo.roles:type_name -> o2control.RoleInfo + 74, // 34: o2control.RoleInfo.defaults:type_name -> o2control.RoleInfo.DefaultsEntry + 75, // 35: o2control.RoleInfo.vars:type_name -> o2control.RoleInfo.VarsEntry + 76, // 36: o2control.RoleInfo.userVars:type_name -> o2control.RoleInfo.UserVarsEntry + 77, // 37: o2control.RoleInfo.consolidatedStack:type_name -> o2control.RoleInfo.ConsolidatedStackEntry + 44, // 38: o2control.GetRolesReply.roles:type_name -> o2control.RoleInfo + 3, // 39: o2control.VarSpecMessage.type:type_name -> o2control.VarSpecMessage.Type + 2, // 40: o2control.VarSpecMessage.widget:type_name -> o2control.VarSpecMessage.UiWidget + 78, // 41: o2control.WorkflowTemplateInfo.varSpecMap:type_name -> o2control.WorkflowTemplateInfo.VarSpecMapEntry + 48, // 42: o2control.GetWorkflowTemplatesReply.workflowTemplates:type_name -> o2control.WorkflowTemplateInfo + 51, // 43: o2control.ListReposReply.repos:type_name -> o2control.RepoInfo + 79, // 44: o2control.ListIntegratedServicesReply.services:type_name -> o2control.ListIntegratedServicesReply.ServicesEntry + 47, // 45: o2control.WorkflowTemplateInfo.VarSpecMapEntry.value:type_name -> o2control.VarSpecMessage + 64, // 46: o2control.ListIntegratedServicesReply.ServicesEntry.value:type_name -> o2control.IntegratedServiceInfo + 5, // 47: o2control.Control.GetFrameworkInfo:input_type -> o2control.GetFrameworkInfoRequest + 10, // 48: o2control.Control.GetEnvironments:input_type -> o2control.GetEnvironmentsRequest + 15, // 49: o2control.Control.NewAutoEnvironment:input_type -> o2control.NewAutoEnvironmentRequest + 13, // 50: o2control.Control.NewEnvironment:input_type -> o2control.NewEnvironmentRequest + 17, // 51: o2control.Control.GetEnvironment:input_type -> o2control.GetEnvironmentRequest + 19, // 52: o2control.Control.ControlEnvironment:input_type -> o2control.ControlEnvironmentRequest + 24, // 53: o2control.Control.DestroyEnvironment:input_type -> o2control.DestroyEnvironmentRequest + 62, // 54: o2control.Control.GetActiveDetectors:input_type -> o2control.Empty + 62, // 55: o2control.Control.GetAvailableDetectors:input_type -> o2control.Empty + 13, // 56: o2control.Control.NewEnvironmentAsync:input_type -> o2control.NewEnvironmentRequest + 34, // 57: o2control.Control.GetTasks:input_type -> o2control.GetTasksRequest + 36, // 58: o2control.Control.GetTask:input_type -> o2control.GetTaskRequest + 41, // 59: o2control.Control.CleanupTasks:input_type -> o2control.CleanupTasksRequest + 43, // 60: o2control.Control.GetRoles:input_type -> o2control.GetRolesRequest + 46, // 61: o2control.Control.GetWorkflowTemplates:input_type -> o2control.GetWorkflowTemplatesRequest + 50, // 62: o2control.Control.ListRepos:input_type -> o2control.ListReposRequest + 53, // 63: o2control.Control.AddRepo:input_type -> o2control.AddRepoRequest + 55, // 64: o2control.Control.RemoveRepo:input_type -> o2control.RemoveRepoRequest + 57, // 65: o2control.Control.RefreshRepos:input_type -> o2control.RefreshReposRequest + 58, // 66: o2control.Control.SetDefaultRepo:input_type -> o2control.SetDefaultRepoRequest + 59, // 67: o2control.Control.SetGlobalDefaultRevision:input_type -> o2control.SetGlobalDefaultRevisionRequest + 60, // 68: o2control.Control.SetRepoDefaultRevision:input_type -> o2control.SetRepoDefaultRevisionRequest + 4, // 69: o2control.Control.Subscribe:input_type -> o2control.SubscribeRequest + 62, // 70: o2control.Control.GetIntegratedServices:input_type -> o2control.Empty + 8, // 71: o2control.Control.Teardown:input_type -> o2control.TeardownRequest + 21, // 72: o2control.Control.ModifyEnvironment:input_type -> o2control.ModifyEnvironmentRequest + 7, // 73: o2control.Control.GetFrameworkInfo:output_type -> o2control.GetFrameworkInfoReply + 11, // 74: o2control.Control.GetEnvironments:output_type -> o2control.GetEnvironmentsReply + 16, // 75: o2control.Control.NewAutoEnvironment:output_type -> o2control.NewAutoEnvironmentReply + 14, // 76: o2control.Control.NewEnvironment:output_type -> o2control.NewEnvironmentReply + 18, // 77: o2control.Control.GetEnvironment:output_type -> o2control.GetEnvironmentReply + 20, // 78: o2control.Control.ControlEnvironment:output_type -> o2control.ControlEnvironmentReply + 25, // 79: o2control.Control.DestroyEnvironment:output_type -> o2control.DestroyEnvironmentReply + 26, // 80: o2control.Control.GetActiveDetectors:output_type -> o2control.GetActiveDetectorsReply + 27, // 81: o2control.Control.GetAvailableDetectors:output_type -> o2control.GetAvailableDetectorsReply + 14, // 82: o2control.Control.NewEnvironmentAsync:output_type -> o2control.NewEnvironmentReply + 35, // 83: o2control.Control.GetTasks:output_type -> o2control.GetTasksReply + 37, // 84: o2control.Control.GetTask:output_type -> o2control.GetTaskReply + 42, // 85: o2control.Control.CleanupTasks:output_type -> o2control.CleanupTasksReply + 45, // 86: o2control.Control.GetRoles:output_type -> o2control.GetRolesReply + 49, // 87: o2control.Control.GetWorkflowTemplates:output_type -> o2control.GetWorkflowTemplatesReply + 52, // 88: o2control.Control.ListRepos:output_type -> o2control.ListReposReply + 54, // 89: o2control.Control.AddRepo:output_type -> o2control.AddRepoReply + 56, // 90: o2control.Control.RemoveRepo:output_type -> o2control.RemoveRepoReply + 62, // 91: o2control.Control.RefreshRepos:output_type -> o2control.Empty + 62, // 92: o2control.Control.SetDefaultRepo:output_type -> o2control.Empty + 62, // 93: o2control.Control.SetGlobalDefaultRevision:output_type -> o2control.Empty + 61, // 94: o2control.Control.SetRepoDefaultRevision:output_type -> o2control.SetRepoDefaultRevisionReply + 81, // 95: o2control.Control.Subscribe:output_type -> events.Event + 63, // 96: o2control.Control.GetIntegratedServices:output_type -> o2control.ListIntegratedServicesReply + 9, // 97: o2control.Control.Teardown:output_type -> o2control.TeardownReply + 23, // 98: o2control.Control.ModifyEnvironment:output_type -> o2control.ModifyEnvironmentReply + 73, // [73:99] is the sub-list for method output_type + 47, // [47:73] is the sub-list for method input_type + 47, // [47:47] is the sub-list for extension type_name + 47, // [47:47] is the sub-list for extension extendee + 0, // [0:47] is the sub-list for field type_name } func init() { file_protos_o2control_proto_init() } diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index f301241d0..ee9bd974e 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -145,6 +145,7 @@ message NewEnvironmentRequest { map vars = 2; bool public = 3; bool autoTransition = 4; + common.User requestUser = 5; } message NewEnvironmentReply { EnvironmentInfo environment = 1; @@ -154,6 +155,7 @@ message NewAutoEnvironmentRequest { string workflowTemplate = 1; map vars = 2; string id = 3; + common.User requestUser = 4; } message NewAutoEnvironmentReply { @@ -181,6 +183,7 @@ message ControlEnvironmentRequest { DEPLOY = 6; } Optype type = 2; + common.User requestUser = 3; } message ControlEnvironmentReply { string id = 1; @@ -217,6 +220,7 @@ message DestroyEnvironmentRequest { bool keepTasks = 2; bool allowInRunningState = 3; bool force = 4; + common.User requestUser = 5; } message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; From e045f524247beb106550498fe0c06aa11f2ffa85 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 Jul 2024 11:41:25 +0200 Subject: [PATCH 1957/2352] [core] Include last known request user in all env and run events --- core/environment/environment.go | 217 +++++++++++++++++++------------- core/environment/manager.go | 134 +++++++++++--------- core/server.go | 46 +++++-- 3 files changed, 240 insertions(+), 157 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 4c186dfee..3f815893a 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -28,6 +28,7 @@ package environment import ( "context" + "encoding/json" "errors" "fmt" "sort" @@ -164,12 +165,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("before_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.GetCurrentRunNumber(), - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), }) // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. @@ -202,6 +204,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), }, runStartTime) cleanupCount := 0 @@ -242,6 +245,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), }, runEndTime) } else { @@ -263,6 +267,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), }, runEndTime) } else { @@ -295,25 +300,27 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), }) }, "leave_state": func(_ context.Context, e *fsm.Event) { trigger := fmt.Sprintf("leave_%s", e.Src) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), }) // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. @@ -338,13 +345,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), }) if e.Err != nil { @@ -352,12 +360,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition step starting", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition step starting", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + LastRequestUser: env.GetLastRequestUser(), }) env.handlerFunc()(e) @@ -367,13 +376,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + EnvironmentId: env.id.String(), + State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + LastRequestUser: env.GetLastRequestUser(), }) }, @@ -381,12 +391,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("enter_%s", e.Dst) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), }) enterStateTimeMs = strconv.FormatInt(time.Now().UnixMilli(), 10) @@ -403,13 +414,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), }) if e.Err != nil { @@ -433,12 +445,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("after_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), }) errHooks := env.handleHooks(env.Workflow(), trigger) @@ -489,6 +502,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), } if e.Err != nil { runEvent.Error = e.Err.Error() @@ -510,6 +524,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), } if e.Err != nil { runEvent.Error = e.Err.Error() @@ -540,6 +555,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, Vars: nil, + LastRequestUser: env.GetLastRequestUser(), }, runEndCompletionTime) } else { @@ -554,13 +570,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } // publish transition step complete event the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), }) }, }, @@ -871,22 +888,24 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map func (env *Environment) TryTransition(t Transition) (err error) { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition starting", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition starting", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), }) err = t.check() if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition impossible", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition impossible", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), }) return } @@ -894,20 +913,22 @@ func (env *Environment) TryTransition(t Transition) (err error) { if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition error", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition error", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), }) } else { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition completed successfully", - Transition: t.eventName(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition completed successfully", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), }) } return @@ -985,6 +1006,28 @@ func (env *Environment) CurrentTransition() string { return env.currentTransition } +func (env *Environment) SetLastRequestUser(lastRequestUser *pb.User) { + if env == nil { + return + } + lastRequestUserJ, err := json.Marshal(lastRequestUser) + if err == nil { + env.UserVars.Set("last_request_user", string(lastRequestUserJ[:])) + } +} + +func (env *Environment) GetLastRequestUser() *pb.User { + if env == nil { + return nil + } + lastRequestUser := &pb.User{} + lastRequestUserJ, ok := env.UserVars.Get("last_request_user") + if ok { + _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) + } + return lastRequestUser +} + func (env *Environment) IsSafeToStop() bool { tasks := env.Workflow().GetTasks() for _, t := range tasks { diff --git a/core/environment/manager.go b/core/environment/manager.go index 63440b667..0e67e4af2 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -25,6 +25,7 @@ package environment import ( + "encoding/json" "errors" "fmt" "strconv" @@ -223,12 +224,19 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // created environment. alreadyActiveDetectors := envs.GetActiveDetectors() + lastRequestUser := &evpb.User{} + lastRequestUserJ, ok := userVars["last_request_user"] + if ok { + _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) + } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "instantiating", + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "instantiating", + LastRequestUser: lastRequestUser, }) // userVar identifiers come in 2 forms: @@ -301,11 +309,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }).Info("creating new environment") the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "running hooks", + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "running hooks", + LastRequestUser: lastRequestUser, }) env.hookHandlerF = func(hooks task.Tasks) error { @@ -327,11 +336,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "CREATE", - Message: "loading workflow", + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "CREATE", + Message: "loading workflow", + LastRequestUser: lastRequestUser, }) // We load the workflow (includes template processing) @@ -372,12 +382,13 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] cvs, _ := env.Workflow().ConsolidatedVarStack() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: env.CurrentState(), - Transition: "CREATE", - TransitionStep: "after_CREATE", - Message: "workflow loaded", - Vars: cvs, // we push the full var stack of the root role in the workflow loaded event + EnvironmentId: newId.String(), + State: env.CurrentState(), + Transition: "CREATE", + TransitionStep: "after_CREATE", + Message: "workflow loaded", + Vars: cvs, // we push the full var stack of the root role in the workflow loaded event + LastRequestUser: lastRequestUser, }) log.WithField("method", "CreateEnvironment"). @@ -576,11 +587,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "before_DESTROY", - Message: "workflow teardown started", + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "before_DESTROY", + Message: "workflow teardown started", + LastRequestUser: env.GetLastRequestUser(), }) env.Mu.Lock() @@ -588,11 +600,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error env.Mu.Unlock() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "leave_" + env.CurrentState(), - Message: "workflow teardown ongoing", + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "leave_" + env.CurrentState(), + Message: "workflow teardown ongoing", + LastRequestUser: env.GetLastRequestUser(), }) err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) @@ -672,11 +685,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "DESTROY", - Message: "releasing tasks", + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "DESTROY", + Message: "releasing tasks", + LastRequestUser: env.GetLastRequestUser(), }) log.WithField("method", "TeardownEnvironment"). @@ -738,23 +752,25 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown finished with error", - Error: err.Error(), + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + LastRequestUser: env.GetLastRequestUser(), }) return err } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "running DESTROY hooks", + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "running DESTROY hooks", + LastRequestUser: env.GetLastRequestUser(), }) // we trigger all cleanup hooks, first calls, then tasks immediately after @@ -816,12 +832,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown finished with error", - Error: err.Error(), + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + LastRequestUser: env.GetLastRequestUser(), }) return err @@ -841,11 +858,12 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error Debug("envman write lock") the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown complete", + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown complete", + LastRequestUser: env.GetLastRequestUser(), }) return err diff --git a/core/server.go b/core/server.go index 18b144b76..3ff3bd9af 100644 --- a/core/server.go +++ b/core/server.go @@ -296,13 +296,21 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEnvironmentRequest, id uid.ID) { var err error - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id, request.GetAutoTransition()) + userVars := request.GetVars() + if len(userVars) == 0 { + userVars = make(map[string]string) + } + // we store the last known request user in the environment + lastRequestUserJ, _ := json.Marshal(request.RequestUser) + userVars["last_request_user"] = string(lastRequestUserJ[:]) + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), userVars, request.GetPublic(), id, request.GetAutoTransition()) if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: id.String(), - State: "ERROR", - Error: "cannot create new environment", - Message: err.Error(), + EnvironmentId: id.String(), + State: "ERROR", + Error: "cannot create new environment", + Message: err.Error(), + LastRequestUser: request.RequestUser, }) return } @@ -310,17 +318,19 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEn newEnv, err := m.state.environments.Environment(id) if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: id.String(), - State: "ERROR", - Error: "cannot get newly created environment", - Message: err.Error(), + EnvironmentId: id.String(), + State: "ERROR", + Error: "cannot get newly created environment", + Message: err.Error(), + LastRequestUser: request.RequestUser, }) return } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: id.String(), - State: newEnv.CurrentState(), + EnvironmentId: id.String(), + State: newEnv.CurrentState(), + LastRequestUser: request.RequestUser, }) return } @@ -376,9 +386,17 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme reply = &pb.NewEnvironmentReply{Public: request.Public} + inputUserVars := request.GetVars() + if len(inputUserVars) == 0 { + inputUserVars = make(map[string]string) + } + // we store the last known request user in the environment + lastRequestUserJ, _ := json.Marshal(request.RequestUser) + inputUserVars["last_request_user"] = string(lastRequestUserJ[:]) + // Create new Environment instance with some roles, we get back a UUID id := uid.New() - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), request.GetVars(), request.GetPublic(), id, request.GetAutoTransition()) + id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), inputUserVars, request.GetPublic(), id, request.GetAutoTransition()) if err != nil { st := status.Newf(codes.Internal, "cannot create new environment: %s", utils.TruncateString(err.Error(), MAX_ERROR_LENGTH)) ei := &pb.EnvironmentInfo{ @@ -575,6 +593,8 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } + env.SetLastRequestUser(req.RequestUser) + trans := environment.MakeTransition(m.state.taskman, req.Type) if trans == nil { return nil, status.Newf(codes.InvalidArgument, "cannot prepare invalid transition %s", req.GetType().String()).Err() @@ -639,6 +659,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() } + env.SetLastRequestUser(req.RequestUser) + // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. if req.Force { return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) From 22a875ab0199c997b97ba71e0b96edb5546975e3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 12 Jul 2024 11:41:53 +0200 Subject: [PATCH 1958/2352] [coconut] Include user@host in relevant coconut requests --- coconut/control/control.go | 45 ++++++++++++++++++++++++++++++---- coconut/control/controlutil.go | 19 ++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index 8e82b93d3..01a18b49a 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -40,6 +40,7 @@ import ( "text/template" "time" + commonpb "github.com/AliceO2Group/Control/common/protos" "github.com/fatih/color" "github.com/xlab/treeprint" @@ -365,7 +366,13 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C WithError(err). Fatal("command finished with error") } - _, err = rpc.NewAutoEnvironment(cxt, &pb.NewAutoEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Id: id}, grpc.EmptyCallOption{}) + _, err = rpc.NewAutoEnvironment(cxt, &pb.NewAutoEnvironmentRequest{ + WorkflowTemplate: wfPath, + Vars: extraVarsMap, + Id: id, + RequestUser: &commonpb.User{ + Name: getUserAndHost(), + }}, grpc.EmptyCallOption{}) if err != nil { return err } @@ -424,9 +431,23 @@ func CreateEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.C var response *pb.NewEnvironmentReply if asynchronous { - response, err = rpc.NewEnvironmentAsync(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) + response, err = rpc.NewEnvironmentAsync(cxt, &pb.NewEnvironmentRequest{ + WorkflowTemplate: wfPath, + Vars: extraVarsMap, + Public: public, + RequestUser: &commonpb.User{ + Name: getUserAndHost(), + }, + }, grpc.EmptyCallOption{}) } else { - response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{WorkflowTemplate: wfPath, Vars: extraVarsMap, Public: public}, grpc.EmptyCallOption{}) + response, err = rpc.NewEnvironment(cxt, &pb.NewEnvironmentRequest{ + WorkflowTemplate: wfPath, + Vars: extraVarsMap, + Public: public, + RequestUser: &commonpb.User{ + Name: getUserAndHost(), + }, + }, grpc.EmptyCallOption{}) } if err != nil { return @@ -588,7 +609,13 @@ func ControlEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. } var response *pb.ControlEnvironmentReply - response, err = rpc.ControlEnvironment(cxt, &pb.ControlEnvironmentRequest{Id: args[0], Type: pb.ControlEnvironmentRequest_Optype(pb.ControlEnvironmentRequest_Optype_value[event])}, grpc.EmptyCallOption{}) + response, err = rpc.ControlEnvironment(cxt, &pb.ControlEnvironmentRequest{ + Id: args[0], + Type: pb.ControlEnvironmentRequest_Optype(pb.ControlEnvironmentRequest_Optype_value[event]), + RequestUser: &commonpb.User{ + Name: getUserAndHost(), + }, + }, grpc.EmptyCallOption{}) if err != nil { return } @@ -717,7 +744,15 @@ func DestroyEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra. keepTasks = false } - _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{Id: envId, KeepTasks: keepTasks, AllowInRunningState: allowInRunningState, Force: force}, grpc.EmptyCallOption{}) + _, err = rpc.DestroyEnvironment(cxt, &pb.DestroyEnvironmentRequest{ + Id: envId, + KeepTasks: keepTasks, + AllowInRunningState: allowInRunningState, + Force: force, + RequestUser: &commonpb.User{ + Name: getUserAndHost(), + }, + }, grpc.EmptyCallOption{}) if err != nil { return } diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index a6d719b32..7f6642e0b 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -28,6 +28,8 @@ import ( "encoding/json" "fmt" "io" + "os" + "os/user" "strconv" "strings" "time" @@ -191,3 +193,20 @@ func formatNumber(numberOfMachines int32) string { } return nMString } + +func getUserAndHost() string { + userName := "unknown" + hostName := "unknown" + + currentUser, err := user.Current() + if err == nil { + userName = currentUser.Username + } + + currentHost, err := os.Hostname() + if err == nil { + hostName = currentHost + } + + return fmt.Sprintf("%s@%s", userName, hostName) +} From 1758bc614c27571079085e93410df1785c5e7b28 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 8 Jul 2024 11:21:24 +0200 Subject: [PATCH 1959/2352] [core] document and test when transition can be cancelled --- core/environment/environment.go | 2 + core/environment/hooks_test.go | 65 ++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 3f815893a..aa8024e95 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -405,6 +405,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { + // at enter_ it will not cancel the transition but only set the error e.Cancel(errHooks) } @@ -456,6 +457,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, errHooks := env.handleHooks(env.Workflow(), trigger) if errHooks != nil { + // at after_ it will not cancel the transition but only set the error e.Cancel(errHooks) } diff --git a/core/environment/hooks_test.go b/core/environment/hooks_test.go index 8c20cacc4..140772238 100644 --- a/core/environment/hooks_test.go +++ b/core/environment/hooks_test.go @@ -61,7 +61,7 @@ var _ = Describe("calling hooks on FSM events", func() { Expect(v).To(Equal("true")) }) - It("should return an error if a critical hook fails", func() { + It("should return an error and cancel transition if a critical hook fails at before_", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( "call", @@ -78,6 +78,69 @@ var _ = Describe("calling hooks on FSM events", func() { v, ok := env.workflow.GetUserVars().Get("root.call_called") Expect(ok).To(BeTrue()) Expect(v).To(Equal("true")) + Expect(env.Sm.Current()).To(Equal("DEPLOYED")) + }) + + It("should return an error and cancel transition if a critical hook fails at leave_", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "leave_DEPLOYED", Timeout: "5s", Critical: true, Await: "leave_DEPLOYED"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + env.workflow.GetUserVars().Set("testplugin_fail", "true") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).To(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + Expect(env.Sm.Current()).To(Equal("DEPLOYED")) + }) + + It("should return an error, but NOT cancel the transition if a critical hook fails at enter_", func() { + // ...because we cannot cancel transition that is already done. + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "enter_CONFIGURED", Timeout: "5s", Critical: true, Await: "enter_CONFIGURED"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + env.workflow.GetUserVars().Set("testplugin_fail", "true") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).To(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + Expect(env.Sm.Current()).To(Equal("CONFIGURED")) + }) + + It("should return an error, but NOT cancel the transition if a critical hook fails at after_", func() { + // ...because we cannot cancel transition that is already done. + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call", + task.Traits{Trigger: "after_CONFIGURE", Timeout: "5s", Critical: true, Await: "after_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + env.workflow.GetUserVars().Set("testplugin_fail", "true") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", false)) + + Expect(err).To(HaveOccurred()) + v, ok := env.workflow.GetUserVars().Get("root.call_called") + Expect(ok).To(BeTrue()) + Expect(v).To(Equal("true")) + Expect(env.Sm.Current()).To(Equal("CONFIGURED")) }) It("should not return an error if an non-critical hook fails", func() { From 4833f4270aea5016816b2d607eddc07beb2b9fe6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 8 Jul 2024 14:53:19 +0200 Subject: [PATCH 1960/2352] OCTRL-902 [core] Set run timestamps before executing triggers with weight 0 --- core/environment/environment.go | 80 +++++++++++++++++++++--- core/environment/hooks_test.go | 87 +++++++++++++-------------- core/environment/manager.go | 2 +- core/integration/testplugin/plugin.go | 2 +- docs/handbook/operation_order.md | 37 +++++++----- 5 files changed, 138 insertions(+), 70 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index aa8024e95..5f0634560 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -174,6 +174,22 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, LastRequestUser: env.GetLastRequestUser(), }) + // first, we execute hooks which should be executed before an event officially starts + errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) + if errHooks != nil { + e.Cancel(errHooks) + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Error: errHooks.Error(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step finished", + }) + return + } + // If the event is START_ACTIVITY, we set up and update variables relevant to plugins early on. // This used to be done inside the transition_startactivity, but then the new RN isn't available to the // before_START_ACTIVITY hooks. By setting it up here, we ensure the run number is available especially @@ -289,7 +305,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, ) } - errHooks := env.handleHooks(env.Workflow(), trigger) + errHooks = env.handleHooksWithPositiveWeights(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) } @@ -323,6 +339,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, LastRequestUser: env.GetLastRequestUser(), }) + errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) + // fixme: in principle we should not need it anymore, since both STOP_ACTIVITY and GO_ERROR set EOR // We might leave RUNNING not only through STOP_ACTIVITY. In such cases we also need a run stop time. if e.Src == "RUNNING" { endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") @@ -334,7 +352,21 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Debug("O2 End time already set before leave_RUNNING") } } - errHooks := env.handleHooks(env.Workflow(), trigger) + if errHooks != nil { + e.Cancel(errHooks) + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Error: errHooks.Error(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step finished", + }) + return + } + + errHooks = env.handleHooksWithPositiveWeights(env.Workflow(), trigger) if errHooks != nil { e.Cancel(errHooks) } @@ -385,7 +417,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, TransitionStep: fmt.Sprintf("tasks_%s", e.Event), LastRequestUser: env.GetLastRequestUser(), }) - }, "enter_state": func(_ context.Context, e *fsm.Event) { trigger := fmt.Sprintf("enter_%s", e.Dst) @@ -400,10 +431,12 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, LastRequestUser: env.GetLastRequestUser(), }) + errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) + enterStateTimeMs = strconv.FormatInt(time.Now().UnixMilli(), 10) env.workflow.SetRuntimeVar("enter_state_time_ms", enterStateTimeMs) - errHooks := env.handleHooks(env.Workflow(), trigger) + errHooks = errors.Join(errHooks, env.handleHooksWithPositiveWeights(env.Workflow(), trigger)) if errHooks != nil { // at enter_ it will not cancel the transition but only set the error e.Cancel(errHooks) @@ -455,7 +488,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, LastRequestUser: env.GetLastRequestUser(), }) - errHooks := env.handleHooks(env.Workflow(), trigger) + errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) if errHooks != nil { // at after_ it will not cancel the transition but only set the error e.Cancel(errHooks) @@ -566,6 +599,11 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } } + errHooks = errors.Join(errHooks, env.handleHooksWithPositiveWeights(env.Workflow(), trigger)) + if errHooks != nil { + e.Cancel(errHooks) + } + errorMsg := "" if e.Err != nil { errorMsg = e.Err.Error() @@ -587,9 +625,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, return } -func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err error) { - log.WithField("partition", env.id).Debugf("begin handling hooks for trigger %s", trigger) - defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) +func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weightPredicate func(callable.HookWeight) bool) (err error) { // Starting point: get all hooks to be started for the current trigger hooksMapForTrigger := workflow.GetHooksMapForTrigger(trigger) @@ -604,13 +640,20 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err } allWeights := allWeightsSet.GetWeights() + filteredWeights := make([]callable.HookWeight, 0) + for _, weight := range allWeights { + if weightPredicate(weight) { + filteredWeights = append(filteredWeights, weight) + } + } + // Prepare structures to accumulate errors allErrors := make(map[callable.Hook]error) criticalFailures := make([]error, 0) // FOR EACH weight within the current state machine trigger moment // 4 phases: start calls, await calls, execute task hooks, error handling - for _, weight := range allWeights { + for _, weight := range filteredWeights { hooksForWeight, thereAreHooksToStartForTheCurrentTriggerAndWeight := hooksMapForTrigger[weight] // PHASE 1: start asynchronously any call hooks and add them to the pending await map @@ -732,6 +775,25 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string) (err return nil } +func (env *Environment) handleAllHooks(workflow workflow.Role, trigger string) (err error) { + log.WithField("partition", env.id).Debugf("begin handling hooks for trigger %s", trigger) + defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) + return env.handleHooks(workflow, trigger, func(w callable.HookWeight) bool { return true }) +} + +func (env *Environment) handleHooksWithNegativeWeights(workflow workflow.Role, trigger string) (err error) { + log.WithField("partition", env.id).Debugf("begin handling hooks with negative weights for trigger %s", trigger) + defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks with negative weights for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) + return env.handleHooks(workflow, trigger, func(w callable.HookWeight) bool { return w < 0 }) +} + +// "positive" include 0 +func (env *Environment) handleHooksWithPositiveWeights(workflow workflow.Role, trigger string) (err error) { + log.WithField("partition", env.id).Debugf("begin handling hooks with positive weights for trigger %s", trigger) + defer utils.TimeTrack(time.Now(), fmt.Sprintf("finished handling hooks with positive weights for trigger %s", trigger), log.WithPrefix("env").WithField("partition", env.id)) + return env.handleHooks(workflow, trigger, func(w callable.HookWeight) bool { return w >= 0 }) +} + // runTasksAsHooks returns a map of failed hook tasks and their respective error values. // The returned map includes both critical and non-critical failures, and it's up to the caller // to further filter as needed. diff --git a/core/environment/hooks_test.go b/core/environment/hooks_test.go index 140772238..5fab31e8a 100644 --- a/core/environment/hooks_test.go +++ b/core/environment/hooks_test.go @@ -218,10 +218,15 @@ var _ = Describe("calling hooks on FSM events", func() { }) Context("activity-related timestamps", func() { - It("should set run_start_time_ms before before_START_ACTIVITY hooks", func() { + It("should set run_start_time_ms just after before_START_ACTIVITY<0 hooks are executed", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( - "call", + "call1", + task.Traits{Trigger: "before_START_ACTIVITY-1", Timeout: "5s", Critical: true, Await: "before_START_ACTIVITY-1"}, + "testplugin.TimestampObserver()", + ""), + workflow.NewCallRole( + "call2", task.Traits{Trigger: "before_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_START_ACTIVITY"}, "testplugin.TimestampObserver()", "")}) @@ -231,44 +236,45 @@ var _ = Describe("calling hooks on FSM events", func() { err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_start_time_ms") + _, ok := env.workflow.GetUserVars().Get("root.call1_saw_run_start_time_ms") + Expect(ok).To(BeFalse()) + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_start_time_ms") Expect(ok).To(BeTrue()) - Expect(v).To(Equal("true")) - _, ok = env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_start_completion_time_ms") Expect(ok).To(BeFalse()) }) - It("should set run_start_completion_time_ms after after_START_ACTIVITY hooks", func() { + It("should set run_start_completion_time_ms just after after_START_ACTIVITY<0 hooks are executed", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( "call1", - task.Traits{Trigger: "after_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_START_ACTIVITY"}, + task.Traits{Trigger: "after_START_ACTIVITY-1", Timeout: "5s", Critical: true, Await: "after_START_ACTIVITY-1"}, "testplugin.TimestampObserver()", ""), workflow.NewCallRole( "call2", - task.Traits{Trigger: "before_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_STOP_ACTIVITY"}, + task.Traits{Trigger: "after_START_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_START_ACTIVITY"}, "testplugin.TimestampObserver()", "")}) workflow.LinkChildrenToParents(env.workflow) env.Sm.SetState("CONFIGURED") err := env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) - Expect(err).NotTo(HaveOccurred()) - _, ok := env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") - Expect(ok).To(BeFalse()) - - err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) - Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + _, ok := env.workflow.GetUserVars().Get("root.call1_saw_run_start_completion_time_ms") + Expect(ok).To(BeFalse()) + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_start_completion_time_ms") Expect(ok).To(BeTrue()) - Expect(v).To(Equal("true")) }) - It("should set run_end_time_ms before before_STOP_ACTIVITY hooks", func() { + It("should set run_end_time_ms just after before_STOP_ACTIVITY<0 hooks are executed", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( "call1", + task.Traits{Trigger: "before_STOP_ACTIVITY-1", Timeout: "5s", Critical: true, Await: "before_STOP_ACTIVITY-1"}, + "testplugin.TimestampObserver()", + ""), + workflow.NewCallRole( + "call2", task.Traits{Trigger: "before_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "before_STOP_ACTIVITY"}, "testplugin.TimestampObserver()", "")}) @@ -280,22 +286,23 @@ var _ = Describe("calling hooks on FSM events", func() { err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") + _, ok := env.workflow.GetUserVars().Get("root.call1_saw_run_end_time_ms") + Expect(ok).To(BeFalse()) + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_end_time_ms") Expect(ok).To(BeTrue()) - Expect(v).To(Equal("true")) - _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_end_completion_time_ms") Expect(ok).To(BeFalse()) }) - It("should set run_end_completion_time_ms after after_STOP_ACTIVITY hooks", func() { + It("should set run_end_completion_time_ms just before after_STOP_ACTIVITY<0 hooks are executed", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( "call1", - task.Traits{Trigger: "after_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_STOP_ACTIVITY"}, + task.Traits{Trigger: "after_STOP_ACTIVITY-1", Timeout: "5s", Critical: true, Await: "after_STOP_ACTIVITY-1"}, "testplugin.TimestampObserver()", ""), workflow.NewCallRole( "call2", - task.Traits{Trigger: "before_RESET", Timeout: "5s", Critical: true, Await: "before_RESET"}, + task.Traits{Trigger: "after_STOP_ACTIVITY", Timeout: "5s", Critical: true, Await: "after_STOP_ACTIVITY"}, "testplugin.TimestampObserver()", "")}) workflow.LinkChildrenToParents(env.workflow) @@ -306,18 +313,10 @@ var _ = Describe("calling hooks on FSM events", func() { err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") - Expect(ok).To(BeTrue()) - Expect(v).To(Equal("true")) - _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + _, ok := env.workflow.GetUserVars().Get("root.call1_saw_run_end_completion_time_ms") Expect(ok).To(BeFalse()) - - err = env.Sm.Event(context.Background(), "RESET", NewDummyTransition("RESET", false)) - Expect(err).NotTo(HaveOccurred()) - - v, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call2_saw_run_end_completion_time_ms") Expect(ok).To(BeTrue()) - Expect(v).To(Equal("true")) }) It("should clear timestamps from previous runs and set run_start_time_ms again before before_START_ACTIVITY hooks", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ @@ -334,21 +333,21 @@ var _ = Describe("calling hooks on FSM events", func() { err = env.Sm.Event(context.Background(), "STOP_ACTIVITY", NewDummyTransition("STOP_ACTIVITY", false)) Expect(err).NotTo(HaveOccurred()) - env.workflow.GetUserVars().Del("seen_run_start_time_ms") - env.workflow.GetUserVars().Del("seen_run_start_completion_time_ms") - env.workflow.GetUserVars().Del("seen_run_end_time_ms") - env.workflow.GetUserVars().Del("seen_run_end_completion_time_ms") + env.workflow.GetUserVars().Del("root.call_saw_run_start_time_ms") + env.workflow.GetUserVars().Del("root.call_saw_run_start_completion_time_ms") + env.workflow.GetUserVars().Del("root.call_saw_run_end_time_ms") + env.workflow.GetUserVars().Del("root.call_saw_run_end_completion_time_ms") err = env.Sm.Event(context.Background(), "START_ACTIVITY", NewDummyTransition("START_ACTIVITY", false)) Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_start_time_ms") + v, ok := env.workflow.GetUserVars().Get("root.call_saw_run_start_time_ms") Expect(ok).To(BeTrue()) Expect(v).To(Equal("true")) - _, ok = env.workflow.GetUserVars().Get("seen_run_start_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call_saw_run_start_completion_time_ms") Expect(ok).To(BeFalse()) - _, ok = env.workflow.GetUserVars().Get("seen_run_end_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call_saw_run_end_time_ms") Expect(ok).To(BeFalse()) - _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call_saw_run_end_completion_time_ms") Expect(ok).To(BeFalse()) }) When("START_ACTIVITY transition fails", func() { @@ -409,7 +408,7 @@ var _ = Describe("calling hooks on FSM events", func() { It("should set both run end timestamps", func() { env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ workflow.NewCallRole( - "call1", + "call", task.Traits{Trigger: "leave_RUNNING", Timeout: "5s", Critical: true, Await: "leave_RUNNING"}, "testplugin.TimestampObserver()", "")}) @@ -421,10 +420,10 @@ var _ = Describe("calling hooks on FSM events", func() { err = env.Sm.Event(context.Background(), "GO_ERROR", NewDummyTransition("GO_ERROR", false)) Expect(err).NotTo(HaveOccurred()) - v, ok := env.workflow.GetUserVars().Get("seen_run_end_time_ms") + v, ok := env.workflow.GetUserVars().Get("root.call_saw_run_end_time_ms") Expect(ok).To(BeTrue()) Expect(v).To(Equal("true")) - _, ok = env.workflow.GetUserVars().Get("seen_run_end_completion_time_ms") + _, ok = env.workflow.GetUserVars().Get("root.call_saw_run_end_completion_time_ms") Expect(ok).To(BeFalse()) v, ok = env.workflow.GetUserVars().Get("run_end_completion_time_ms") Expect(ok).To(BeTrue()) diff --git a/core/environment/manager.go b/core/environment/manager.go index 0e67e4af2..8640864db 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -608,7 +608,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error LastRequestUser: env.GetLastRequestUser(), }) - err = env.handleHooks(env.Workflow(), "leave_"+env.CurrentState()) + err = env.handleAllHooks(env.Workflow(), "leave_"+env.CurrentState()) if err != nil { log.WithFields(logrus.Fields{ "partition": environmentId.String(), diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index bad1b69bd..19d96e810 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -215,7 +215,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { for _, key := range []string{"run_start_time_ms", "run_start_completion_time_ms", "run_end_time_ms", "run_end_completion_time_ms"} { value, ok := varStack[key] if ok && len(value) > 0 && value != "0" { - parentRole.SetGlobalRuntimeVar("seen_"+key, "true") + parentRole.SetGlobalRuntimeVar(rolePath+"_saw_"+key, "true") } } return diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 77b2bc5d2..296e702a0 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -12,18 +12,19 @@ This is the order of actions happening at a healthy start of run. ### before_START_ACTIVITY +- `before_START_ACTIVITY` hooks with negative weights are executed: + - `trg.PrepareForRun()` at `-200` - `"run_number"` is set. - `"run_start_time_ms"` is set using the current time. It is considered as the SOR and SOSOR timestamps. -- `before_START_ACTIVITY` hooks are executed: - - `trg.PrepareForRun()` at `-200` - - `trg.RunLoad()`, `bookkeeping.StartOfRun()` at `-100` - - `bookkeeping.RetrieveFillInfo()` at `-99` - - `kafka.PublishStartActivityUpdate()` at `-50` - - `dcs.StartOfRun()`, `odc.Start()` (does not need to return now), `ccdb.RunStart()` at `0` +- `before_START_ACTIVITY` hooks with positive weights (incl. 0) are executed: + - `trg.RunLoad()`, `bookkeeping.StartOfRun()` at `10` + - `bookkeeping.RetrieveFillInfo()` at `11` + - `kafka.PublishStartActivityUpdate()` at `50` + - `dcs.StartOfRun()`, `odc.Start()` (does not need to return now), `ccdb.RunStart()` at `100` ### leave_CONFIGURED -- `leave_CONFIGURED` hooks are executed +- `leave_CONFIGURED` hooks are executed: - `kafka.PublishLeaveStateUpdate()` at `0` ### Transition START_ACTIVITY @@ -38,10 +39,12 @@ This is the order of actions happening at a healthy start of run. - `o2-roc-ctp-emulator` for all ROC CTP emulator endpoints, `kafka.PublishEnterStateUpdate()` at `0` ### after_START_ACTIVITY + +- `after_START_ACTIVITY` hooks with negative weights are executed + - `trg.RunStart()` at `-10` + - waiting until `odc.Start()` executed at `before_START_ACTIVITY+100` completes at `-10` - `"run_start_completion_time_ms"` is set using current time. It is considered as the EOSOR timestamp. -- `after_START_ACTIVITY` hooks are executed: - - `trg.RunStart()` at `0` - - waiting until `odc.Start()` executed at `before_START_ACTIVITY` completes at `0` +- `after_START_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `bookkeeping.UpdateRunStart()`, `bookkeeping.UpdateEnv()` at `+100` ## STOP_ACTIVITY (End Of Run) @@ -50,8 +53,9 @@ This is the order of actions happening at a healthy end of run. ### before_STOP_ACTIVITY +- `before_STOP_ACTIVITY` hooks with negative weights are executed - `"run_end_time_ms"` is set using the current time. It is considered as the EOR and SOEOR timestamps. -- `before_STOP_ACTIVITY` hooks are executed: +- `before_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `trg.RunStop()`, `odc.Stop()` (does not need to return now) at `0` ### leave_RUNNING @@ -70,9 +74,12 @@ This is the order of actions happening at a healthy end of run. - `kafka.PublishEnterStateUpdate()` at `0` ### after_STOP_ACTIVITY -- `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. -- `after_STOP_ACTIVITY` hooks are executed: + +- `after_STOP_ACTIVITY` hooks with negative weights are executed: - `trg.RunUnload()` at `-100` - - `ccdb.RunStop()`, `dcs.EndOfRun()` at `0` - - waiting until `odc.Stop()` executed at `before_STOP_ACTIVITY` completes at `0` + - `dcs.EndOfRun()` at `-50` + - waiting until `odc.Stop()` executed at `before_STOP_ACTIVITY` completes at `-50` +- `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. +- `after_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: + - `ccdb.RunStop()` at `0` - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file From 7eeb30bc75a676e99173af67d5b6f694606c4920 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 15 Jul 2024 12:39:29 +0200 Subject: [PATCH 1961/2352] [core] delete run_number only after all STOP_ACTIVITY hooks are called --- core/environment/environment.go | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 5f0634560..d6764520a 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -568,11 +568,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, the.EventWriterWithTopic(topic.Run).WriteEventWithTimestamp(runEvent, runEndCompletionTime) - // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. - env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) - env.currentRunNumber = 0 - env.workflow.GetVars().Del("run_number") - env.workflow.GetVars().Del("runNumber") // Ensure the auto stop timer is stopped (important for stop transitions NOT triggered by the timer itself) env.invalidateAutoStopTransition() } else if e.Event == "GO_ERROR" { @@ -608,6 +603,15 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, if e.Err != nil { errorMsg = e.Err.Error() } + + if e.Event == "STOP_ACTIVITY" { + // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. + env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) + env.currentRunNumber = 0 + env.workflow.GetVars().Del("run_number") + env.workflow.GetVars().Del("runNumber") + } + // publish transition step complete event the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ EnvironmentId: env.id.String(), From a88daa0bf2aebbafb53651c47853bf06fcce3bad Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Jul 2024 15:10:43 +0200 Subject: [PATCH 1962/2352] OCTRL-899 [core] use SOSOR and EOEOR as run duration for GRP ECS object Ruben and Chiara need the O2 run duration in GRP ECS objects to be the narrowest timespan which includes CTP start and stop. Also start of run time should be ready available when the tasks are started. Because of these two reasons, we should use SOSOR and EOEOR as the timestamps in GRP ECS object. --- core/integration/ccdb/plugin.go | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 06322b946..fe18f4eb3 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -55,7 +55,7 @@ type GeneralRunParameters struct { runNumber uint32 runType runtype.RunType runStartTimeMs string // we keep it as string, to avoid converting back and forth from time.Time - runEndTimeMs string // we keep it as string, to avoid converting back and forth from time.Time + runEndCompletionTimeMs string // we keep it as string, to avoid converting back and forth from time.Time trgStartTimeMs string // we keep it as string, to avoid converting back and forth from time.Time trgEndTimeMs string // we keep it as string, to avoid converting back and forth from time.Time detectors []string @@ -140,7 +140,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } runStartTime := varStack["run_start_time_ms"] - runEndTime := varStack["run_end_time_ms"] + runEndCompletionTime := varStack["run_end_completion_time_ms"] // use the fake run start time if available pdpOverrideRunStartTime, ok := varStack["pdp_override_run_start_time"] @@ -158,7 +158,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { WithField("run", runNumber). Warnf("overriding run start time to %s for non-SYNTHETIC run", pdpOverrideRunStartTime) } - if len(runEndTime) > 0 { + if len(runEndCompletionTime) > 0 { // calculate eor time as pdp_override_run_start_time + real run duration startTimeNumber, err := strconv.ParseUint(runStartTime, 10, 64) if err != nil { @@ -176,13 +176,13 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { WithField("run", runNumber). Errorf("could not parse pdpOverrideRunStartTimeNumber: %s", pdpOverrideRunStartTime) } - endTimeNumber, err := strconv.ParseUint(runEndTime, 10, 64) + endTimeNumber, err := strconv.ParseUint(runEndCompletionTime, 10, 64) if err != nil { log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("run", runNumber). - Errorf("could not parse runEndTime: %s", runEndTime) + Errorf("could not parse runEndCompletionTime: %s", runEndCompletionTime) } if endTimeNumber <= startTimeNumber { log.WithError(err). @@ -193,7 +193,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { } runDuration := endTimeNumber - startTimeNumber - runEndTime = strconv.FormatUint(pdpOverrideRunStartTimeNumber+runDuration, 10) + runEndCompletionTime = strconv.FormatUint(pdpOverrideRunStartTimeNumber+runDuration, 10) } runStartTime = pdpOverrideRunStartTime } else if strings.Contains(runTypeStr, "SYNTHETIC") { @@ -269,7 +269,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { uint32(runNumber), runType, runStartTime, - runEndTime, + runEndCompletionTime, trgStartTime, trgEndTime, detectorsSlice, @@ -391,8 +391,8 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin if len(grp.runStartTimeMs) > 0 { cmd += " -s " + grp.runStartTimeMs } - if len(grp.runEndTimeMs) > 0 { - cmd += " -e " + grp.runEndTimeMs + if len(grp.runEndCompletionTimeMs) > 0 { + cmd += " -e " + grp.runEndCompletionTimeMs } if len(grp.trgStartTimeMs) > 0 { cmd += " --start-time-ctp " + grp.trgStartTimeMs @@ -486,7 +486,7 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre WithField("run", grp.runNumber). WithField("level", infologger.IL_Devel). Debugf("GRP: %d, %s, %s, %s, %s, %s, %d, %s, %s, %s, %s", - grp.runNumber, grp.runType.String(), grp.runStartTimeMs, grp.runEndTimeMs, grp.trgStartTimeMs, grp.trgEndTimeMs, grp.hbfPerTf, grp.lhcPeriod, + grp.runNumber, grp.runType.String(), grp.runStartTimeMs, grp.runEndCompletionTimeMs, grp.trgStartTimeMs, grp.trgEndTimeMs, grp.hbfPerTf, grp.lhcPeriod, strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ",")) cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl, refresh) if err != nil { From c1e65e0553c694c258a62e13998fe574b9d7a453 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 16 Jul 2024 14:34:59 +0200 Subject: [PATCH 1963/2352] [build] Avoid protobuf namespace clash --- Makefile | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 2f1699132..35eb49e2a 100644 --- a/Makefile +++ b/Makefile @@ -211,9 +211,9 @@ vendor: validate-go-version @mkdir -p core/integration/ddsched/protos @curl -s -L $(DD_PROTO) -o core/integration/ddsched/protos/ddsched.proto - @echo -e "\033[1;33mcurl common.proto\033[0m" + @echo -e "\033[1;33mcurl bkcommon.proto\033[0m" @mkdir -p core/integration/bookkeeping/protos - @curl -s -L $(BK_COM_PROTO) -o core/integration/bookkeeping/protos/common.proto + @curl -s -L $(BK_COM_PROTO) -o core/integration/bookkeeping/protos/bkcommon.proto @echo -e "\033[1;33mcurl environment.proto\033[0m" @mkdir -p core/integration/bookkeeping/protos @@ -247,7 +247,7 @@ vendor: validate-go-version @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/ddsched/protos;ddpb\";\n" if (/^package/)' core/integration/ddsched/protos/ddsched.proto @echo -e "\033[1;33mpatch common.proto\033[0m" - @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/common.proto + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/bkcommon.proto @echo -e "\033[1;33mpatch environment.proto\033[0m" @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/environment.proto @@ -261,17 +261,23 @@ vendor: validate-go-version @echo -e "\033[1;33mpatch run.proto\033[0m" @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/run.proto + @echo -e "\033[1;33mpatch lhcFill.proto\033[0m" + @perl -pi -e '$$_.="option go_package = \"github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb\";\n" if (/^package/)' core/integration/bookkeeping/protos/lhcFill.proto + @echo -e "\033[1;33mpatch environment.proto\033[0m" - @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/environment.proto + @perl -pi -e 's/.*/import \"protos\/bkcommon\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/environment.proto @echo -e "\033[1;33mpatch flp.proto\033[0m" - @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/flp.proto + @perl -pi -e 's/.*/import \"protos\/bkcommon\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/flp.proto @echo -e "\033[1;33mpatch log.proto\033[0m" - @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/log.proto + @perl -pi -e 's/.*/import \"protos\/bkcommon\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/log.proto @echo -e "\033[1;33mpatch run.proto\033[0m" - @perl -pi -e 's/.*/import \"protos\/common\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/run.proto + @perl -pi -e 's/.*/import \"protos\/bkcommon\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/run.proto + + @echo -e "\033[1;33mpatch lhcFill.proto\033[0m" + @perl -pi -e 's/.*/import \"protos\/bkcommon\.proto\";/ if (/^import/)' core/integration/bookkeeping/protos/lhcFill.proto # @echo -e "\033[1;33mdep ensure\033[0m" # @./tools/dep ensure From d9a555a90f2845291567755b35d3844ceaef9bd0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 16 Jul 2024 14:46:10 +0200 Subject: [PATCH 1964/2352] [core] Pull and patch Bookkeeping protofiles --- .../protos/{common.proto => bkcommon.proto} | 65 ++++++++++++------- .../bookkeeping/protos/environment.proto | 4 +- core/integration/bookkeeping/protos/flp.proto | 20 ++++-- .../bookkeeping/protos/lhcFill.proto | 2 +- core/integration/bookkeeping/protos/log.proto | 4 +- core/integration/bookkeeping/protos/run.proto | 11 +++- 6 files changed, 70 insertions(+), 36 deletions(-) rename core/integration/bookkeeping/protos/{common.proto => bkcommon.proto} (66%) diff --git a/core/integration/bookkeeping/protos/common.proto b/core/integration/bookkeeping/protos/bkcommon.proto similarity index 66% rename from core/integration/bookkeeping/protos/common.proto rename to core/integration/bookkeeping/protos/bkcommon.proto index 9413c5733..7b522b938 100644 --- a/core/integration/bookkeeping/protos/common.proto +++ b/core/integration/bookkeeping/protos/bkcommon.proto @@ -65,45 +65,45 @@ enum RunType { message Run { int32 runNumber = 1; - string environmentId = 2; - int32 bytesReadOut = 3; + optional string environmentId = 2; + optional int32 bytesReadOut = 3; // Unix timestamp when this entity was created int64 createdAt = 4; int32 Id = 5; - int32 nDetectors = 6; - int32 nEpns = 7; - int32 nFlps = 8; - int32 nSubtimeframes = 9; + optional int32 nDetectors = 6; + optional int32 nEpns = 7; + optional int32 nFlps = 8; + optional int32 nSubtimeframes = 9; // Repository hash - string pdpConfigOption = 10; + optional string pdpConfigOption = 10; // Library file location of the pdp topology description - string pdpTopologyDescriptionLibraryFile = 11; + optional string pdpTopologyDescriptionLibraryFile = 11; // Parameters given to the pdp workflow - string pdpWorkflowParameters = 12; + optional string pdpWorkflowParameters = 12; // Beam type of the pdp - string pdpBeamType = 13; + optional string pdpBeamType = 13; // Config uri of readout. - string readoutCfgUri = 14; + optional string readoutCfgUri = 14; RunQuality runQuality = 15; - RunType runType = 16; - string tfbDdMode = 17; - int64 timeO2End = 18; - int64 timeO2Start = 19; - int64 timeTrgEnd = 20; - int64 timeTrgStart = 21; + optional RunType runType = 16; + optional string tfbDdMode = 17; + optional int64 timeO2End = 18; + optional int64 timeO2Start = 19; + optional int64 timeTrgEnd = 20; + optional int64 timeTrgStart = 21; // Trigger value - string triggerValue = 22; + optional string triggerValue = 22; // The full name or file location of the odcTopology - string odcTopologyFullName = 23; - bool ddFlp = 24; - bool dcs = 25; - bool epn = 26; - string epnTopology = 27; + optional string odcTopologyFullName = 23; + optional bool ddFlp = 24; + optional bool dcs = 25; + optional bool epn = 26; + optional string epnTopology = 27; repeated Detector detectors = 28; // Unix timestamp when this entity was last updated int64 updatedAt = 30; // A string that marks the period of the lhc - string lhcPeriod = 31; + optional string lhcPeriod = 31; } message LHCFill { @@ -122,7 +122,22 @@ message User { // The unique CERN identifier of this user. int32 externalId = 1; // The unique identifier of this entity. - int32 id = 2; + optional int32 id = 2; // Name of the user. string name = 3; } + +// End of run reason +message EorReason { + // The unique identifier + optional int32 id = 1; + // Category of the eor (as described in reason_types table) + string category = 2; + // Title of the eor (as described in reason_types table) + string title = 3; + optional string description = 4; +} + +// Generic empty message when services return no data +message Empty { +} diff --git a/core/integration/bookkeeping/protos/environment.proto b/core/integration/bookkeeping/protos/environment.proto index 003bf6f25..187f05640 100644 --- a/core/integration/bookkeeping/protos/environment.proto +++ b/core/integration/bookkeeping/protos/environment.proto @@ -1,6 +1,6 @@ syntax = 'proto3'; -import "protos/common.proto"; +import "protos/bkcommon.proto"; package o2.bookkeeping; option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; @@ -16,9 +16,9 @@ service EnvironmentService { message EnvironmentCreationRequest { string id = 1; - optional int64 createdAt = 2; optional string status = 3; optional string statusMessage = 4; + string rawConfiguration = 5; } message EnvironmentUpdateRequest { diff --git a/core/integration/bookkeeping/protos/flp.proto b/core/integration/bookkeeping/protos/flp.proto index d4077d7e9..8a7309a27 100644 --- a/core/integration/bookkeeping/protos/flp.proto +++ b/core/integration/bookkeeping/protos/flp.proto @@ -7,6 +7,7 @@ option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeepin service FlpService { rpc CreateMany(ManyFlpsCreationRequest) returns (FlpList); + rpc UpdateCounters(UpdateCountersRequest) returns (Flp); } // High level messages @@ -21,6 +22,15 @@ message ManyFlpsCreationRequest { repeated FlpCreationRequest flps = 1; } +message UpdateCountersRequest { + string flpName = 1; + int32 runNumber = 2; + uint64 nSubTimeframes = 3; + uint64 nEquipmentBytes = 4; + uint64 nRecordingBytes = 5; + uint64 nFairMQBytes = 6; +} + message FlpList { repeated Flp flps = 1; } @@ -35,9 +45,9 @@ message Flp { int64 createdAt = 4; // Unix timestamp when this entity was last updated. int64 updatedAt = 5; - int32 bytesEquipmentReadOut = 6; - int32 bytesFairMQReadOut = 7; - int32 bytesProcessed = 8; - int32 bytesRecordingReadOut = 9; - int32 nTimeframes = 10; + uint64 bytesEquipmentReadOut = 6; + uint64 bytesFairMQReadOut = 7; + uint64 bytesProcessed = 8; + uint64 bytesRecordingReadOut = 9; + uint64 nTimeframes = 10; } diff --git a/core/integration/bookkeeping/protos/lhcFill.proto b/core/integration/bookkeeping/protos/lhcFill.proto index 0b97e48c9..b64435f4b 100644 --- a/core/integration/bookkeeping/protos/lhcFill.proto +++ b/core/integration/bookkeeping/protos/lhcFill.proto @@ -3,7 +3,7 @@ syntax = 'proto3'; package o2.bookkeeping; option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; -import 'protos/common.proto'; +import "protos/bkcommon.proto"; // Services diff --git a/core/integration/bookkeeping/protos/log.proto b/core/integration/bookkeeping/protos/log.proto index 868eb1690..583dd5562 100644 --- a/core/integration/bookkeeping/protos/log.proto +++ b/core/integration/bookkeeping/protos/log.proto @@ -1,6 +1,6 @@ syntax = 'proto3'; -import "protos/common.proto"; +import "protos/bkcommon.proto"; package o2.bookkeeping; option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; @@ -102,4 +102,6 @@ message Tag { int64 updatedAt = 6; // The last person that edited the email/mattermost fields string lastEditedName = 7; + // The description of the tag + optional string description = 8; } diff --git a/core/integration/bookkeeping/protos/run.proto b/core/integration/bookkeeping/protos/run.proto index 1e752935f..072beed7e 100644 --- a/core/integration/bookkeeping/protos/run.proto +++ b/core/integration/bookkeeping/protos/run.proto @@ -3,7 +3,7 @@ syntax = 'proto3'; package o2.bookkeeping; option go_package = "github.com/AliceO2Group/Control/core/integration/bookkeeping/protos;bkpb"; -import "protos/common.proto"; +import "protos/bkcommon.proto"; // Services @@ -41,6 +41,9 @@ message RunCreationRequest { string epnTopology = 10; optional string odcTopologyFullName = 11; repeated Detector detectors = 12; + // Optional users that stopped or started the run (can also be undefined) + optional User userO2Start = 13; + optional User userO2Stop = 14; } message RunUpdateRequest { @@ -58,6 +61,10 @@ message RunUpdateRequest { optional string pdpWorkflowParameters = 13; optional string pdpBeamType = 14; optional string readoutCfgUri = 15; + repeated EorReason eorReasons = 16; + // Optional users that stopped or started the run (can also be undefined) + optional User userO2Start = 17; + optional User userO2Stop = 18; } // Enums @@ -67,4 +74,4 @@ enum RunRelations { RUN_RELATIONS_NULL = 0; // Include the LHC fill related to the run RUN_RELATIONS_LHC_FILL = 1; -} \ No newline at end of file +} From f1e4ccd2462b026d167a3ce2919754a55ba49e5f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 16 Jul 2024 15:17:02 +0200 Subject: [PATCH 1965/2352] [core] Regenerate Bookkeeping proto code --- .../bookkeeping/protos/bkcommon.pb.go | 1164 +++++++++++++++++ .../bookkeeping/protos/common.pb.go | 978 -------------- .../bookkeeping/protos/environment.pb.go | 142 +- .../bookkeeping/protos/environment_grpc.pb.go | 17 +- core/integration/bookkeeping/protos/flp.pb.go | 254 +++- .../bookkeeping/protos/flp_grpc.pb.go | 49 +- .../bookkeeping/protos/lhcFill.pb.go | 48 +- .../bookkeeping/protos/lhcFill_grpc.pb.go | 12 +- core/integration/bookkeeping/protos/log.pb.go | 248 ++-- .../bookkeeping/protos/log_grpc.pb.go | 12 +- core/integration/bookkeeping/protos/run.pb.go | 384 +++--- .../bookkeeping/protos/run_grpc.pb.go | 22 +- 12 files changed, 1902 insertions(+), 1428 deletions(-) create mode 100644 core/integration/bookkeeping/protos/bkcommon.pb.go delete mode 100644 core/integration/bookkeeping/protos/common.pb.go diff --git a/core/integration/bookkeeping/protos/bkcommon.pb.go b/core/integration/bookkeeping/protos/bkcommon.pb.go new file mode 100644 index 000000000..fa8bea6f4 --- /dev/null +++ b/core/integration/bookkeeping/protos/bkcommon.pb.go @@ -0,0 +1,1164 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v4.25.3 +// source: protos/bkcommon.proto + +package bkpb + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Detector int32 + +const ( + Detector_DETECTOR_NULL Detector = 0 + Detector_DETECTOR_TPC Detector = 3 + Detector_DETECTOR_TRD Detector = 4 + Detector_DETECTOR_TOF Detector = 5 + Detector_DETECTOR_HMP Detector = 6 + Detector_DETECTOR_PHS Detector = 7 + Detector_DETECTOR_CPV Detector = 8 + Detector_DETECTOR_MCH Detector = 10 + Detector_DETECTOR_ZDC Detector = 15 + Detector_DETECTOR_EMC Detector = 18 + Detector_DETECTOR_TST Detector = 19 + Detector_DETECTOR_ITS Detector = 32 + Detector_DETECTOR_FDD Detector = 33 + Detector_DETECTOR_FT0 Detector = 34 + Detector_DETECTOR_FV0 Detector = 35 + Detector_DETECTOR_MFT Detector = 36 + Detector_DETECTOR_MID Detector = 37 +) + +// Enum value maps for Detector. +var ( + Detector_name = map[int32]string{ + 0: "DETECTOR_NULL", + 3: "DETECTOR_TPC", + 4: "DETECTOR_TRD", + 5: "DETECTOR_TOF", + 6: "DETECTOR_HMP", + 7: "DETECTOR_PHS", + 8: "DETECTOR_CPV", + 10: "DETECTOR_MCH", + 15: "DETECTOR_ZDC", + 18: "DETECTOR_EMC", + 19: "DETECTOR_TST", + 32: "DETECTOR_ITS", + 33: "DETECTOR_FDD", + 34: "DETECTOR_FT0", + 35: "DETECTOR_FV0", + 36: "DETECTOR_MFT", + 37: "DETECTOR_MID", + } + Detector_value = map[string]int32{ + "DETECTOR_NULL": 0, + "DETECTOR_TPC": 3, + "DETECTOR_TRD": 4, + "DETECTOR_TOF": 5, + "DETECTOR_HMP": 6, + "DETECTOR_PHS": 7, + "DETECTOR_CPV": 8, + "DETECTOR_MCH": 10, + "DETECTOR_ZDC": 15, + "DETECTOR_EMC": 18, + "DETECTOR_TST": 19, + "DETECTOR_ITS": 32, + "DETECTOR_FDD": 33, + "DETECTOR_FT0": 34, + "DETECTOR_FV0": 35, + "DETECTOR_MFT": 36, + "DETECTOR_MID": 37, + } +) + +func (x Detector) Enum() *Detector { + p := new(Detector) + *p = x + return p +} + +func (x Detector) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Detector) Descriptor() protoreflect.EnumDescriptor { + return file_protos_bkcommon_proto_enumTypes[0].Descriptor() +} + +func (Detector) Type() protoreflect.EnumType { + return &file_protos_bkcommon_proto_enumTypes[0] +} + +func (x Detector) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Detector.Descriptor instead. +func (Detector) EnumDescriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{0} +} + +type RunQuality int32 + +const ( + RunQuality_RUN_QUALITY_NULL RunQuality = 0 + RunQuality_RUN_QUALITY_BAD RunQuality = 1 + RunQuality_RUN_QUALITY_GOOD RunQuality = 2 + RunQuality_RUN_QUALITY_TEST RunQuality = 3 + RunQuality_RUN_QUALITY_NONE RunQuality = 4 +) + +// Enum value maps for RunQuality. +var ( + RunQuality_name = map[int32]string{ + 0: "RUN_QUALITY_NULL", + 1: "RUN_QUALITY_BAD", + 2: "RUN_QUALITY_GOOD", + 3: "RUN_QUALITY_TEST", + 4: "RUN_QUALITY_NONE", + } + RunQuality_value = map[string]int32{ + "RUN_QUALITY_NULL": 0, + "RUN_QUALITY_BAD": 1, + "RUN_QUALITY_GOOD": 2, + "RUN_QUALITY_TEST": 3, + "RUN_QUALITY_NONE": 4, + } +) + +func (x RunQuality) Enum() *RunQuality { + p := new(RunQuality) + *p = x + return p +} + +func (x RunQuality) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunQuality) Descriptor() protoreflect.EnumDescriptor { + return file_protos_bkcommon_proto_enumTypes[1].Descriptor() +} + +func (RunQuality) Type() protoreflect.EnumType { + return &file_protos_bkcommon_proto_enumTypes[1] +} + +func (x RunQuality) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunQuality.Descriptor instead. +func (RunQuality) EnumDescriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{1} +} + +type RunType int32 + +const ( + RunType_RUN_TYPE_NULL RunType = 0 + RunType_RUN_TYPE_PHYSICS RunType = 1 + RunType_RUN_TYPE_TECHNICAL RunType = 2 + RunType_RUN_TYPE_PEDESTAL RunType = 3 + RunType_RUN_TYPE_PULSER RunType = 4 + RunType_RUN_TYPE_LASER RunType = 5 + RunType_RUN_TYPE_CALIBRATION_ITHR_TUNING RunType = 6 + RunType_RUN_TYPE_CALIBRATION_VCASN_TUNING RunType = 7 + RunType_RUN_TYPE_CALIBRATION_THR_SCAN RunType = 8 + RunType_RUN_TYPE_CALIBRATION_DIGITAL_SCAN RunType = 9 + RunType_RUN_TYPE_CALIBRATION_ANALOG_SCAN RunType = 10 + RunType_RUN_TYPE_CALIBRATION_FHR RunType = 11 + RunType_RUN_TYPE_CALIBRATION_ALPIDE_SCAN RunType = 12 + RunType_RUN_TYPE_CALIBRATION RunType = 13 + RunType_RUN_TYPE_COSMICS RunType = 14 + RunType_RUN_TYPE_SYNTHETIC RunType = 15 + RunType_RUN_TYPE_NOISE RunType = 16 + RunType_RUN_TYPE_CALIBRATION_PULSE_LENGTH RunType = 17 + RunType_RUN_TYPE_CALIBRATION_VRESETD RunType = 18 +) + +// Enum value maps for RunType. +var ( + RunType_name = map[int32]string{ + 0: "RUN_TYPE_NULL", + 1: "RUN_TYPE_PHYSICS", + 2: "RUN_TYPE_TECHNICAL", + 3: "RUN_TYPE_PEDESTAL", + 4: "RUN_TYPE_PULSER", + 5: "RUN_TYPE_LASER", + 6: "RUN_TYPE_CALIBRATION_ITHR_TUNING", + 7: "RUN_TYPE_CALIBRATION_VCASN_TUNING", + 8: "RUN_TYPE_CALIBRATION_THR_SCAN", + 9: "RUN_TYPE_CALIBRATION_DIGITAL_SCAN", + 10: "RUN_TYPE_CALIBRATION_ANALOG_SCAN", + 11: "RUN_TYPE_CALIBRATION_FHR", + 12: "RUN_TYPE_CALIBRATION_ALPIDE_SCAN", + 13: "RUN_TYPE_CALIBRATION", + 14: "RUN_TYPE_COSMICS", + 15: "RUN_TYPE_SYNTHETIC", + 16: "RUN_TYPE_NOISE", + 17: "RUN_TYPE_CALIBRATION_PULSE_LENGTH", + 18: "RUN_TYPE_CALIBRATION_VRESETD", + } + RunType_value = map[string]int32{ + "RUN_TYPE_NULL": 0, + "RUN_TYPE_PHYSICS": 1, + "RUN_TYPE_TECHNICAL": 2, + "RUN_TYPE_PEDESTAL": 3, + "RUN_TYPE_PULSER": 4, + "RUN_TYPE_LASER": 5, + "RUN_TYPE_CALIBRATION_ITHR_TUNING": 6, + "RUN_TYPE_CALIBRATION_VCASN_TUNING": 7, + "RUN_TYPE_CALIBRATION_THR_SCAN": 8, + "RUN_TYPE_CALIBRATION_DIGITAL_SCAN": 9, + "RUN_TYPE_CALIBRATION_ANALOG_SCAN": 10, + "RUN_TYPE_CALIBRATION_FHR": 11, + "RUN_TYPE_CALIBRATION_ALPIDE_SCAN": 12, + "RUN_TYPE_CALIBRATION": 13, + "RUN_TYPE_COSMICS": 14, + "RUN_TYPE_SYNTHETIC": 15, + "RUN_TYPE_NOISE": 16, + "RUN_TYPE_CALIBRATION_PULSE_LENGTH": 17, + "RUN_TYPE_CALIBRATION_VRESETD": 18, + } +) + +func (x RunType) Enum() *RunType { + p := new(RunType) + *p = x + return p +} + +func (x RunType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RunType) Descriptor() protoreflect.EnumDescriptor { + return file_protos_bkcommon_proto_enumTypes[2].Descriptor() +} + +func (RunType) Type() protoreflect.EnumType { + return &file_protos_bkcommon_proto_enumTypes[2] +} + +func (x RunType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RunType.Descriptor instead. +func (RunType) EnumDescriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{2} +} + +type Run struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + EnvironmentId *string `protobuf:"bytes,2,opt,name=environmentId,proto3,oneof" json:"environmentId,omitempty"` + BytesReadOut *int32 `protobuf:"varint,3,opt,name=bytesReadOut,proto3,oneof" json:"bytesReadOut,omitempty"` + // Unix timestamp when this entity was created + CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"` + Id int32 `protobuf:"varint,5,opt,name=Id,proto3" json:"Id,omitempty"` + NDetectors *int32 `protobuf:"varint,6,opt,name=nDetectors,proto3,oneof" json:"nDetectors,omitempty"` + NEpns *int32 `protobuf:"varint,7,opt,name=nEpns,proto3,oneof" json:"nEpns,omitempty"` + NFlps *int32 `protobuf:"varint,8,opt,name=nFlps,proto3,oneof" json:"nFlps,omitempty"` + NSubtimeframes *int32 `protobuf:"varint,9,opt,name=nSubtimeframes,proto3,oneof" json:"nSubtimeframes,omitempty"` + // Repository hash + PdpConfigOption *string `protobuf:"bytes,10,opt,name=pdpConfigOption,proto3,oneof" json:"pdpConfigOption,omitempty"` + // Library file location of the pdp topology description + PdpTopologyDescriptionLibraryFile *string `protobuf:"bytes,11,opt,name=pdpTopologyDescriptionLibraryFile,proto3,oneof" json:"pdpTopologyDescriptionLibraryFile,omitempty"` + // Parameters given to the pdp workflow + PdpWorkflowParameters *string `protobuf:"bytes,12,opt,name=pdpWorkflowParameters,proto3,oneof" json:"pdpWorkflowParameters,omitempty"` + // Beam type of the pdp + PdpBeamType *string `protobuf:"bytes,13,opt,name=pdpBeamType,proto3,oneof" json:"pdpBeamType,omitempty"` + // Config uri of readout. + ReadoutCfgUri *string `protobuf:"bytes,14,opt,name=readoutCfgUri,proto3,oneof" json:"readoutCfgUri,omitempty"` + RunQuality RunQuality `protobuf:"varint,15,opt,name=runQuality,proto3,enum=o2.bookkeeping.RunQuality" json:"runQuality,omitempty"` + RunType *RunType `protobuf:"varint,16,opt,name=runType,proto3,enum=o2.bookkeeping.RunType,oneof" json:"runType,omitempty"` + TfbDdMode *string `protobuf:"bytes,17,opt,name=tfbDdMode,proto3,oneof" json:"tfbDdMode,omitempty"` + TimeO2End *int64 `protobuf:"varint,18,opt,name=timeO2End,proto3,oneof" json:"timeO2End,omitempty"` + TimeO2Start *int64 `protobuf:"varint,19,opt,name=timeO2Start,proto3,oneof" json:"timeO2Start,omitempty"` + TimeTrgEnd *int64 `protobuf:"varint,20,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` + TimeTrgStart *int64 `protobuf:"varint,21,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` + // Trigger value + TriggerValue *string `protobuf:"bytes,22,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + // The full name or file location of the odcTopology + OdcTopologyFullName *string `protobuf:"bytes,23,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` + DdFlp *bool `protobuf:"varint,24,opt,name=ddFlp,proto3,oneof" json:"ddFlp,omitempty"` + Dcs *bool `protobuf:"varint,25,opt,name=dcs,proto3,oneof" json:"dcs,omitempty"` + Epn *bool `protobuf:"varint,26,opt,name=epn,proto3,oneof" json:"epn,omitempty"` + EpnTopology *string `protobuf:"bytes,27,opt,name=epnTopology,proto3,oneof" json:"epnTopology,omitempty"` + Detectors []Detector `protobuf:"varint,28,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` + // Unix timestamp when this entity was last updated + UpdatedAt int64 `protobuf:"varint,30,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + // A string that marks the period of the lhc + LhcPeriod *string `protobuf:"bytes,31,opt,name=lhcPeriod,proto3,oneof" json:"lhcPeriod,omitempty"` +} + +func (x *Run) Reset() { + *x = Run{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bkcommon_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Run) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Run) ProtoMessage() {} + +func (x *Run) ProtoReflect() protoreflect.Message { + mi := &file_protos_bkcommon_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Run.ProtoReflect.Descriptor instead. +func (*Run) Descriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{0} +} + +func (x *Run) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *Run) GetEnvironmentId() string { + if x != nil && x.EnvironmentId != nil { + return *x.EnvironmentId + } + return "" +} + +func (x *Run) GetBytesReadOut() int32 { + if x != nil && x.BytesReadOut != nil { + return *x.BytesReadOut + } + return 0 +} + +func (x *Run) GetCreatedAt() int64 { + if x != nil { + return x.CreatedAt + } + return 0 +} + +func (x *Run) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Run) GetNDetectors() int32 { + if x != nil && x.NDetectors != nil { + return *x.NDetectors + } + return 0 +} + +func (x *Run) GetNEpns() int32 { + if x != nil && x.NEpns != nil { + return *x.NEpns + } + return 0 +} + +func (x *Run) GetNFlps() int32 { + if x != nil && x.NFlps != nil { + return *x.NFlps + } + return 0 +} + +func (x *Run) GetNSubtimeframes() int32 { + if x != nil && x.NSubtimeframes != nil { + return *x.NSubtimeframes + } + return 0 +} + +func (x *Run) GetPdpConfigOption() string { + if x != nil && x.PdpConfigOption != nil { + return *x.PdpConfigOption + } + return "" +} + +func (x *Run) GetPdpTopologyDescriptionLibraryFile() string { + if x != nil && x.PdpTopologyDescriptionLibraryFile != nil { + return *x.PdpTopologyDescriptionLibraryFile + } + return "" +} + +func (x *Run) GetPdpWorkflowParameters() string { + if x != nil && x.PdpWorkflowParameters != nil { + return *x.PdpWorkflowParameters + } + return "" +} + +func (x *Run) GetPdpBeamType() string { + if x != nil && x.PdpBeamType != nil { + return *x.PdpBeamType + } + return "" +} + +func (x *Run) GetReadoutCfgUri() string { + if x != nil && x.ReadoutCfgUri != nil { + return *x.ReadoutCfgUri + } + return "" +} + +func (x *Run) GetRunQuality() RunQuality { + if x != nil { + return x.RunQuality + } + return RunQuality_RUN_QUALITY_NULL +} + +func (x *Run) GetRunType() RunType { + if x != nil && x.RunType != nil { + return *x.RunType + } + return RunType_RUN_TYPE_NULL +} + +func (x *Run) GetTfbDdMode() string { + if x != nil && x.TfbDdMode != nil { + return *x.TfbDdMode + } + return "" +} + +func (x *Run) GetTimeO2End() int64 { + if x != nil && x.TimeO2End != nil { + return *x.TimeO2End + } + return 0 +} + +func (x *Run) GetTimeO2Start() int64 { + if x != nil && x.TimeO2Start != nil { + return *x.TimeO2Start + } + return 0 +} + +func (x *Run) GetTimeTrgEnd() int64 { + if x != nil && x.TimeTrgEnd != nil { + return *x.TimeTrgEnd + } + return 0 +} + +func (x *Run) GetTimeTrgStart() int64 { + if x != nil && x.TimeTrgStart != nil { + return *x.TimeTrgStart + } + return 0 +} + +func (x *Run) GetTriggerValue() string { + if x != nil && x.TriggerValue != nil { + return *x.TriggerValue + } + return "" +} + +func (x *Run) GetOdcTopologyFullName() string { + if x != nil && x.OdcTopologyFullName != nil { + return *x.OdcTopologyFullName + } + return "" +} + +func (x *Run) GetDdFlp() bool { + if x != nil && x.DdFlp != nil { + return *x.DdFlp + } + return false +} + +func (x *Run) GetDcs() bool { + if x != nil && x.Dcs != nil { + return *x.Dcs + } + return false +} + +func (x *Run) GetEpn() bool { + if x != nil && x.Epn != nil { + return *x.Epn + } + return false +} + +func (x *Run) GetEpnTopology() string { + if x != nil && x.EpnTopology != nil { + return *x.EpnTopology + } + return "" +} + +func (x *Run) GetDetectors() []Detector { + if x != nil { + return x.Detectors + } + return nil +} + +func (x *Run) GetUpdatedAt() int64 { + if x != nil { + return x.UpdatedAt + } + return 0 +} + +func (x *Run) GetLhcPeriod() string { + if x != nil && x.LhcPeriod != nil { + return *x.LhcPeriod + } + return "" +} + +type LHCFill struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FillNumber int32 `protobuf:"varint,1,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` + // Timestamp of the start of the stable beam (if it applies) + StableBeamStart *int64 `protobuf:"varint,2,opt,name=stableBeamStart,proto3,oneof" json:"stableBeamStart,omitempty"` + // Timestamp of the end of the stable beam (if it applies) + StableBeamEnd *int64 `protobuf:"varint,3,opt,name=stableBeamEnd,proto3,oneof" json:"stableBeamEnd,omitempty"` + // Duration of the stable beam (if it applies) + StableBeamDuration *int64 `protobuf:"varint,4,opt,name=stableBeamDuration,proto3,oneof" json:"stableBeamDuration,omitempty"` + BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` + FillingSchemeName string `protobuf:"bytes,6,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` +} + +func (x *LHCFill) Reset() { + *x = LHCFill{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bkcommon_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LHCFill) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LHCFill) ProtoMessage() {} + +func (x *LHCFill) ProtoReflect() protoreflect.Message { + mi := &file_protos_bkcommon_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LHCFill.ProtoReflect.Descriptor instead. +func (*LHCFill) Descriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{1} +} + +func (x *LHCFill) GetFillNumber() int32 { + if x != nil { + return x.FillNumber + } + return 0 +} + +func (x *LHCFill) GetStableBeamStart() int64 { + if x != nil && x.StableBeamStart != nil { + return *x.StableBeamStart + } + return 0 +} + +func (x *LHCFill) GetStableBeamEnd() int64 { + if x != nil && x.StableBeamEnd != nil { + return *x.StableBeamEnd + } + return 0 +} + +func (x *LHCFill) GetStableBeamDuration() int64 { + if x != nil && x.StableBeamDuration != nil { + return *x.StableBeamDuration + } + return 0 +} + +func (x *LHCFill) GetBeamType() string { + if x != nil { + return x.BeamType + } + return "" +} + +func (x *LHCFill) GetFillingSchemeName() string { + if x != nil { + return x.FillingSchemeName + } + return "" +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique CERN identifier of this user. + ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` + // The unique identifier of this entity. + Id *int32 `protobuf:"varint,2,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Name of the user. + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bkcommon_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_protos_bkcommon_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetExternalId() int32 { + if x != nil { + return x.ExternalId + } + return 0 +} + +func (x *User) GetId() int32 { + if x != nil && x.Id != nil { + return *x.Id + } + return 0 +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +// End of run reason +type EorReason struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The unique identifier + Id *int32 `protobuf:"varint,1,opt,name=id,proto3,oneof" json:"id,omitempty"` + // Category of the eor (as described in reason_types table) + Category string `protobuf:"bytes,2,opt,name=category,proto3" json:"category,omitempty"` + // Title of the eor (as described in reason_types table) + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Description *string `protobuf:"bytes,4,opt,name=description,proto3,oneof" json:"description,omitempty"` +} + +func (x *EorReason) Reset() { + *x = EorReason{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bkcommon_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *EorReason) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EorReason) ProtoMessage() {} + +func (x *EorReason) ProtoReflect() protoreflect.Message { + mi := &file_protos_bkcommon_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use EorReason.ProtoReflect.Descriptor instead. +func (*EorReason) Descriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{3} +} + +func (x *EorReason) GetId() int32 { + if x != nil && x.Id != nil { + return *x.Id + } + return 0 +} + +func (x *EorReason) GetCategory() string { + if x != nil { + return x.Category + } + return "" +} + +func (x *EorReason) GetTitle() string { + if x != nil { + return x.Title + } + return "" +} + +func (x *EorReason) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + +// Generic empty message when services return no data +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_bkcommon_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_protos_bkcommon_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_protos_bkcommon_proto_rawDescGZIP(), []int{4} +} + +var File_protos_bkcommon_proto protoreflect.FileDescriptor + +var file_protos_bkcommon_proto_rawDesc = []byte{ + 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xbc, 0x0c, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x29, 0x0a, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x19, 0x0a, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x48, 0x04, + 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x6e, 0x53, + 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x05, 0x48, 0x05, 0x52, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x06, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x07, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x0b, 0x70, 0x64, 0x70, + 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, + 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x0a, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, + 0x55, 0x72, 0x69, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x51, + 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x12, 0x36, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x48, 0x0b, 0x52, 0x07, + 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, + 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, + 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x0d, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x03, 0x48, 0x0e, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, + 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x48, 0x0f, 0x52, 0x0a, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, + 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x10, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x48, 0x11, 0x52, 0x0c, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x35, + 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x12, 0x52, 0x13, 0x6f, + 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x18, 0x18, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x13, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x88, 0x01, 0x01, + 0x12, 0x15, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x48, 0x14, 0x52, + 0x03, 0x64, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x1a, + 0x20, 0x01, 0x28, 0x08, 0x48, 0x15, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x16, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6c, + 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x17, + 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x42, 0x10, + 0x0a, 0x0e, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, + 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, + 0x46, 0x6c, 0x70, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, + 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, + 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, + 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, + 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x42, 0x0a, 0x0a, + 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x66, + 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, + 0x67, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x63, 0x73, + 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x70, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x70, 0x6e, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, + 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, + 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x12, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, + 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, + 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, + 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, + 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, + 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, + 0x22, 0x90, 0x01, 0x0a, 0x09, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x13, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, + 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2a, 0xe7, 0x02, 0x0a, + 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, + 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, + 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, + 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, + 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, + 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, + 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, + 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, + 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, + 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, + 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, + 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, + 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, + 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, + 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, + 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x04, 0x2a, 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, + 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, + 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, + 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, + 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, + 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, + 0x4e, 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, + 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, + 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, + 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, + 0x18, 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, + 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, + 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, + 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, + 0x54, 0x44, 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_bkcommon_proto_rawDescOnce sync.Once + file_protos_bkcommon_proto_rawDescData = file_protos_bkcommon_proto_rawDesc +) + +func file_protos_bkcommon_proto_rawDescGZIP() []byte { + file_protos_bkcommon_proto_rawDescOnce.Do(func() { + file_protos_bkcommon_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_bkcommon_proto_rawDescData) + }) + return file_protos_bkcommon_proto_rawDescData +} + +var file_protos_bkcommon_proto_enumTypes = make([]protoimpl.EnumInfo, 3) +var file_protos_bkcommon_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_protos_bkcommon_proto_goTypes = []interface{}{ + (Detector)(0), // 0: o2.bookkeeping.Detector + (RunQuality)(0), // 1: o2.bookkeeping.RunQuality + (RunType)(0), // 2: o2.bookkeeping.RunType + (*Run)(nil), // 3: o2.bookkeeping.Run + (*LHCFill)(nil), // 4: o2.bookkeeping.LHCFill + (*User)(nil), // 5: o2.bookkeeping.User + (*EorReason)(nil), // 6: o2.bookkeeping.EorReason + (*Empty)(nil), // 7: o2.bookkeeping.Empty +} +var file_protos_bkcommon_proto_depIdxs = []int32{ + 1, // 0: o2.bookkeeping.Run.runQuality:type_name -> o2.bookkeeping.RunQuality + 2, // 1: o2.bookkeeping.Run.runType:type_name -> o2.bookkeeping.RunType + 0, // 2: o2.bookkeeping.Run.detectors:type_name -> o2.bookkeeping.Detector + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_protos_bkcommon_proto_init() } +func file_protos_bkcommon_proto_init() { + if File_protos_bkcommon_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_bkcommon_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Run); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bkcommon_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LHCFill); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bkcommon_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bkcommon_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*EorReason); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_bkcommon_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + file_protos_bkcommon_proto_msgTypes[0].OneofWrappers = []interface{}{} + file_protos_bkcommon_proto_msgTypes[1].OneofWrappers = []interface{}{} + file_protos_bkcommon_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_protos_bkcommon_proto_msgTypes[3].OneofWrappers = []interface{}{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_bkcommon_proto_rawDesc, + NumEnums: 3, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_bkcommon_proto_goTypes, + DependencyIndexes: file_protos_bkcommon_proto_depIdxs, + EnumInfos: file_protos_bkcommon_proto_enumTypes, + MessageInfos: file_protos_bkcommon_proto_msgTypes, + }.Build() + File_protos_bkcommon_proto = out.File + file_protos_bkcommon_proto_rawDesc = nil + file_protos_bkcommon_proto_goTypes = nil + file_protos_bkcommon_proto_depIdxs = nil +} diff --git a/core/integration/bookkeeping/protos/common.pb.go b/core/integration/bookkeeping/protos/common.pb.go deleted file mode 100644 index 18b86c8db..000000000 --- a/core/integration/bookkeeping/protos/common.pb.go +++ /dev/null @@ -1,978 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 -// source: protos/common.proto - -package bkpb - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type Detector int32 - -const ( - Detector_DETECTOR_NULL Detector = 0 - Detector_DETECTOR_TPC Detector = 3 - Detector_DETECTOR_TRD Detector = 4 - Detector_DETECTOR_TOF Detector = 5 - Detector_DETECTOR_HMP Detector = 6 - Detector_DETECTOR_PHS Detector = 7 - Detector_DETECTOR_CPV Detector = 8 - Detector_DETECTOR_MCH Detector = 10 - Detector_DETECTOR_ZDC Detector = 15 - Detector_DETECTOR_EMC Detector = 18 - Detector_DETECTOR_TST Detector = 19 - Detector_DETECTOR_ITS Detector = 32 - Detector_DETECTOR_FDD Detector = 33 - Detector_DETECTOR_FT0 Detector = 34 - Detector_DETECTOR_FV0 Detector = 35 - Detector_DETECTOR_MFT Detector = 36 - Detector_DETECTOR_MID Detector = 37 -) - -// Enum value maps for Detector. -var ( - Detector_name = map[int32]string{ - 0: "DETECTOR_NULL", - 3: "DETECTOR_TPC", - 4: "DETECTOR_TRD", - 5: "DETECTOR_TOF", - 6: "DETECTOR_HMP", - 7: "DETECTOR_PHS", - 8: "DETECTOR_CPV", - 10: "DETECTOR_MCH", - 15: "DETECTOR_ZDC", - 18: "DETECTOR_EMC", - 19: "DETECTOR_TST", - 32: "DETECTOR_ITS", - 33: "DETECTOR_FDD", - 34: "DETECTOR_FT0", - 35: "DETECTOR_FV0", - 36: "DETECTOR_MFT", - 37: "DETECTOR_MID", - } - Detector_value = map[string]int32{ - "DETECTOR_NULL": 0, - "DETECTOR_TPC": 3, - "DETECTOR_TRD": 4, - "DETECTOR_TOF": 5, - "DETECTOR_HMP": 6, - "DETECTOR_PHS": 7, - "DETECTOR_CPV": 8, - "DETECTOR_MCH": 10, - "DETECTOR_ZDC": 15, - "DETECTOR_EMC": 18, - "DETECTOR_TST": 19, - "DETECTOR_ITS": 32, - "DETECTOR_FDD": 33, - "DETECTOR_FT0": 34, - "DETECTOR_FV0": 35, - "DETECTOR_MFT": 36, - "DETECTOR_MID": 37, - } -) - -func (x Detector) Enum() *Detector { - p := new(Detector) - *p = x - return p -} - -func (x Detector) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (Detector) Descriptor() protoreflect.EnumDescriptor { - return file_protos_common_proto_enumTypes[0].Descriptor() -} - -func (Detector) Type() protoreflect.EnumType { - return &file_protos_common_proto_enumTypes[0] -} - -func (x Detector) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use Detector.Descriptor instead. -func (Detector) EnumDescriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{0} -} - -type RunQuality int32 - -const ( - RunQuality_RUN_QUALITY_NULL RunQuality = 0 - RunQuality_RUN_QUALITY_BAD RunQuality = 1 - RunQuality_RUN_QUALITY_GOOD RunQuality = 2 - RunQuality_RUN_QUALITY_TEST RunQuality = 3 - RunQuality_RUN_QUALITY_NONE RunQuality = 4 -) - -// Enum value maps for RunQuality. -var ( - RunQuality_name = map[int32]string{ - 0: "RUN_QUALITY_NULL", - 1: "RUN_QUALITY_BAD", - 2: "RUN_QUALITY_GOOD", - 3: "RUN_QUALITY_TEST", - 4: "RUN_QUALITY_NONE", - } - RunQuality_value = map[string]int32{ - "RUN_QUALITY_NULL": 0, - "RUN_QUALITY_BAD": 1, - "RUN_QUALITY_GOOD": 2, - "RUN_QUALITY_TEST": 3, - "RUN_QUALITY_NONE": 4, - } -) - -func (x RunQuality) Enum() *RunQuality { - p := new(RunQuality) - *p = x - return p -} - -func (x RunQuality) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RunQuality) Descriptor() protoreflect.EnumDescriptor { - return file_protos_common_proto_enumTypes[1].Descriptor() -} - -func (RunQuality) Type() protoreflect.EnumType { - return &file_protos_common_proto_enumTypes[1] -} - -func (x RunQuality) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use RunQuality.Descriptor instead. -func (RunQuality) EnumDescriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{1} -} - -type RunType int32 - -const ( - RunType_RUN_TYPE_NULL RunType = 0 - RunType_RUN_TYPE_PHYSICS RunType = 1 - RunType_RUN_TYPE_TECHNICAL RunType = 2 - RunType_RUN_TYPE_PEDESTAL RunType = 3 - RunType_RUN_TYPE_PULSER RunType = 4 - RunType_RUN_TYPE_LASER RunType = 5 - RunType_RUN_TYPE_CALIBRATION_ITHR_TUNING RunType = 6 - RunType_RUN_TYPE_CALIBRATION_VCASN_TUNING RunType = 7 - RunType_RUN_TYPE_CALIBRATION_THR_SCAN RunType = 8 - RunType_RUN_TYPE_CALIBRATION_DIGITAL_SCAN RunType = 9 - RunType_RUN_TYPE_CALIBRATION_ANALOG_SCAN RunType = 10 - RunType_RUN_TYPE_CALIBRATION_FHR RunType = 11 - RunType_RUN_TYPE_CALIBRATION_ALPIDE_SCAN RunType = 12 - RunType_RUN_TYPE_CALIBRATION RunType = 13 - RunType_RUN_TYPE_COSMICS RunType = 14 - RunType_RUN_TYPE_SYNTHETIC RunType = 15 - RunType_RUN_TYPE_NOISE RunType = 16 - RunType_RUN_TYPE_CALIBRATION_PULSE_LENGTH RunType = 17 - RunType_RUN_TYPE_CALIBRATION_VRESETD RunType = 18 -) - -// Enum value maps for RunType. -var ( - RunType_name = map[int32]string{ - 0: "RUN_TYPE_NULL", - 1: "RUN_TYPE_PHYSICS", - 2: "RUN_TYPE_TECHNICAL", - 3: "RUN_TYPE_PEDESTAL", - 4: "RUN_TYPE_PULSER", - 5: "RUN_TYPE_LASER", - 6: "RUN_TYPE_CALIBRATION_ITHR_TUNING", - 7: "RUN_TYPE_CALIBRATION_VCASN_TUNING", - 8: "RUN_TYPE_CALIBRATION_THR_SCAN", - 9: "RUN_TYPE_CALIBRATION_DIGITAL_SCAN", - 10: "RUN_TYPE_CALIBRATION_ANALOG_SCAN", - 11: "RUN_TYPE_CALIBRATION_FHR", - 12: "RUN_TYPE_CALIBRATION_ALPIDE_SCAN", - 13: "RUN_TYPE_CALIBRATION", - 14: "RUN_TYPE_COSMICS", - 15: "RUN_TYPE_SYNTHETIC", - 16: "RUN_TYPE_NOISE", - 17: "RUN_TYPE_CALIBRATION_PULSE_LENGTH", - 18: "RUN_TYPE_CALIBRATION_VRESETD", - } - RunType_value = map[string]int32{ - "RUN_TYPE_NULL": 0, - "RUN_TYPE_PHYSICS": 1, - "RUN_TYPE_TECHNICAL": 2, - "RUN_TYPE_PEDESTAL": 3, - "RUN_TYPE_PULSER": 4, - "RUN_TYPE_LASER": 5, - "RUN_TYPE_CALIBRATION_ITHR_TUNING": 6, - "RUN_TYPE_CALIBRATION_VCASN_TUNING": 7, - "RUN_TYPE_CALIBRATION_THR_SCAN": 8, - "RUN_TYPE_CALIBRATION_DIGITAL_SCAN": 9, - "RUN_TYPE_CALIBRATION_ANALOG_SCAN": 10, - "RUN_TYPE_CALIBRATION_FHR": 11, - "RUN_TYPE_CALIBRATION_ALPIDE_SCAN": 12, - "RUN_TYPE_CALIBRATION": 13, - "RUN_TYPE_COSMICS": 14, - "RUN_TYPE_SYNTHETIC": 15, - "RUN_TYPE_NOISE": 16, - "RUN_TYPE_CALIBRATION_PULSE_LENGTH": 17, - "RUN_TYPE_CALIBRATION_VRESETD": 18, - } -) - -func (x RunType) Enum() *RunType { - p := new(RunType) - *p = x - return p -} - -func (x RunType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (RunType) Descriptor() protoreflect.EnumDescriptor { - return file_protos_common_proto_enumTypes[2].Descriptor() -} - -func (RunType) Type() protoreflect.EnumType { - return &file_protos_common_proto_enumTypes[2] -} - -func (x RunType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use RunType.Descriptor instead. -func (RunType) EnumDescriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{2} -} - -type Run struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - EnvironmentId string `protobuf:"bytes,2,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - BytesReadOut int32 `protobuf:"varint,3,opt,name=bytesReadOut,proto3" json:"bytesReadOut,omitempty"` - // Unix timestamp when this entity was created - CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"` - Id int32 `protobuf:"varint,5,opt,name=Id,proto3" json:"Id,omitempty"` - NDetectors int32 `protobuf:"varint,6,opt,name=nDetectors,proto3" json:"nDetectors,omitempty"` - NEpns int32 `protobuf:"varint,7,opt,name=nEpns,proto3" json:"nEpns,omitempty"` - NFlps int32 `protobuf:"varint,8,opt,name=nFlps,proto3" json:"nFlps,omitempty"` - NSubtimeframes int32 `protobuf:"varint,9,opt,name=nSubtimeframes,proto3" json:"nSubtimeframes,omitempty"` - // Repository hash - PdpConfigOption string `protobuf:"bytes,10,opt,name=pdpConfigOption,proto3" json:"pdpConfigOption,omitempty"` - // Library file location of the pdp topology description - PdpTopologyDescriptionLibraryFile string `protobuf:"bytes,11,opt,name=pdpTopologyDescriptionLibraryFile,proto3" json:"pdpTopologyDescriptionLibraryFile,omitempty"` - // Parameters given to the pdp workflow - PdpWorkflowParameters string `protobuf:"bytes,12,opt,name=pdpWorkflowParameters,proto3" json:"pdpWorkflowParameters,omitempty"` - // Beam type of the pdp - PdpBeamType string `protobuf:"bytes,13,opt,name=pdpBeamType,proto3" json:"pdpBeamType,omitempty"` - // Config uri of readout. - ReadoutCfgUri string `protobuf:"bytes,14,opt,name=readoutCfgUri,proto3" json:"readoutCfgUri,omitempty"` - RunQuality RunQuality `protobuf:"varint,15,opt,name=runQuality,proto3,enum=o2.bookkeeping.RunQuality" json:"runQuality,omitempty"` - RunType RunType `protobuf:"varint,16,opt,name=runType,proto3,enum=o2.bookkeeping.RunType" json:"runType,omitempty"` - TfbDdMode string `protobuf:"bytes,17,opt,name=tfbDdMode,proto3" json:"tfbDdMode,omitempty"` - TimeO2End int64 `protobuf:"varint,18,opt,name=timeO2End,proto3" json:"timeO2End,omitempty"` - TimeO2Start int64 `protobuf:"varint,19,opt,name=timeO2Start,proto3" json:"timeO2Start,omitempty"` - TimeTrgEnd int64 `protobuf:"varint,20,opt,name=timeTrgEnd,proto3" json:"timeTrgEnd,omitempty"` - TimeTrgStart int64 `protobuf:"varint,21,opt,name=timeTrgStart,proto3" json:"timeTrgStart,omitempty"` - // Trigger value - TriggerValue string `protobuf:"bytes,22,opt,name=triggerValue,proto3" json:"triggerValue,omitempty"` - // The full name or file location of the odcTopology - OdcTopologyFullName string `protobuf:"bytes,23,opt,name=odcTopologyFullName,proto3" json:"odcTopologyFullName,omitempty"` - DdFlp bool `protobuf:"varint,24,opt,name=ddFlp,proto3" json:"ddFlp,omitempty"` - Dcs bool `protobuf:"varint,25,opt,name=dcs,proto3" json:"dcs,omitempty"` - Epn bool `protobuf:"varint,26,opt,name=epn,proto3" json:"epn,omitempty"` - EpnTopology string `protobuf:"bytes,27,opt,name=epnTopology,proto3" json:"epnTopology,omitempty"` - Detectors []Detector `protobuf:"varint,28,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` - // Unix timestamp when this entity was last updated - UpdatedAt int64 `protobuf:"varint,30,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` - // A string that marks the period of the lhc - LhcPeriod string `protobuf:"bytes,31,opt,name=lhcPeriod,proto3" json:"lhcPeriod,omitempty"` -} - -func (x *Run) Reset() { - *x = Run{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_common_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Run) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Run) ProtoMessage() {} - -func (x *Run) ProtoReflect() protoreflect.Message { - mi := &file_protos_common_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Run.ProtoReflect.Descriptor instead. -func (*Run) Descriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{0} -} - -func (x *Run) GetRunNumber() int32 { - if x != nil { - return x.RunNumber - } - return 0 -} - -func (x *Run) GetEnvironmentId() string { - if x != nil { - return x.EnvironmentId - } - return "" -} - -func (x *Run) GetBytesReadOut() int32 { - if x != nil { - return x.BytesReadOut - } - return 0 -} - -func (x *Run) GetCreatedAt() int64 { - if x != nil { - return x.CreatedAt - } - return 0 -} - -func (x *Run) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *Run) GetNDetectors() int32 { - if x != nil { - return x.NDetectors - } - return 0 -} - -func (x *Run) GetNEpns() int32 { - if x != nil { - return x.NEpns - } - return 0 -} - -func (x *Run) GetNFlps() int32 { - if x != nil { - return x.NFlps - } - return 0 -} - -func (x *Run) GetNSubtimeframes() int32 { - if x != nil { - return x.NSubtimeframes - } - return 0 -} - -func (x *Run) GetPdpConfigOption() string { - if x != nil { - return x.PdpConfigOption - } - return "" -} - -func (x *Run) GetPdpTopologyDescriptionLibraryFile() string { - if x != nil { - return x.PdpTopologyDescriptionLibraryFile - } - return "" -} - -func (x *Run) GetPdpWorkflowParameters() string { - if x != nil { - return x.PdpWorkflowParameters - } - return "" -} - -func (x *Run) GetPdpBeamType() string { - if x != nil { - return x.PdpBeamType - } - return "" -} - -func (x *Run) GetReadoutCfgUri() string { - if x != nil { - return x.ReadoutCfgUri - } - return "" -} - -func (x *Run) GetRunQuality() RunQuality { - if x != nil { - return x.RunQuality - } - return RunQuality_RUN_QUALITY_NULL -} - -func (x *Run) GetRunType() RunType { - if x != nil { - return x.RunType - } - return RunType_RUN_TYPE_NULL -} - -func (x *Run) GetTfbDdMode() string { - if x != nil { - return x.TfbDdMode - } - return "" -} - -func (x *Run) GetTimeO2End() int64 { - if x != nil { - return x.TimeO2End - } - return 0 -} - -func (x *Run) GetTimeO2Start() int64 { - if x != nil { - return x.TimeO2Start - } - return 0 -} - -func (x *Run) GetTimeTrgEnd() int64 { - if x != nil { - return x.TimeTrgEnd - } - return 0 -} - -func (x *Run) GetTimeTrgStart() int64 { - if x != nil { - return x.TimeTrgStart - } - return 0 -} - -func (x *Run) GetTriggerValue() string { - if x != nil { - return x.TriggerValue - } - return "" -} - -func (x *Run) GetOdcTopologyFullName() string { - if x != nil { - return x.OdcTopologyFullName - } - return "" -} - -func (x *Run) GetDdFlp() bool { - if x != nil { - return x.DdFlp - } - return false -} - -func (x *Run) GetDcs() bool { - if x != nil { - return x.Dcs - } - return false -} - -func (x *Run) GetEpn() bool { - if x != nil { - return x.Epn - } - return false -} - -func (x *Run) GetEpnTopology() string { - if x != nil { - return x.EpnTopology - } - return "" -} - -func (x *Run) GetDetectors() []Detector { - if x != nil { - return x.Detectors - } - return nil -} - -func (x *Run) GetUpdatedAt() int64 { - if x != nil { - return x.UpdatedAt - } - return 0 -} - -func (x *Run) GetLhcPeriod() string { - if x != nil { - return x.LhcPeriod - } - return "" -} - -type LHCFill struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - FillNumber int32 `protobuf:"varint,1,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` - // Timestamp of the start of the stable beam (if it applies) - StableBeamStart *int64 `protobuf:"varint,2,opt,name=stableBeamStart,proto3,oneof" json:"stableBeamStart,omitempty"` - // Timestamp of the end of the stable beam (if it applies) - StableBeamEnd *int64 `protobuf:"varint,3,opt,name=stableBeamEnd,proto3,oneof" json:"stableBeamEnd,omitempty"` - // Duration of the stable beam (if it applies) - StableBeamDuration *int64 `protobuf:"varint,4,opt,name=stableBeamDuration,proto3,oneof" json:"stableBeamDuration,omitempty"` - BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` - FillingSchemeName string `protobuf:"bytes,6,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` -} - -func (x *LHCFill) Reset() { - *x = LHCFill{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_common_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *LHCFill) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*LHCFill) ProtoMessage() {} - -func (x *LHCFill) ProtoReflect() protoreflect.Message { - mi := &file_protos_common_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use LHCFill.ProtoReflect.Descriptor instead. -func (*LHCFill) Descriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{1} -} - -func (x *LHCFill) GetFillNumber() int32 { - if x != nil { - return x.FillNumber - } - return 0 -} - -func (x *LHCFill) GetStableBeamStart() int64 { - if x != nil && x.StableBeamStart != nil { - return *x.StableBeamStart - } - return 0 -} - -func (x *LHCFill) GetStableBeamEnd() int64 { - if x != nil && x.StableBeamEnd != nil { - return *x.StableBeamEnd - } - return 0 -} - -func (x *LHCFill) GetStableBeamDuration() int64 { - if x != nil && x.StableBeamDuration != nil { - return *x.StableBeamDuration - } - return 0 -} - -func (x *LHCFill) GetBeamType() string { - if x != nil { - return x.BeamType - } - return "" -} - -func (x *LHCFill) GetFillingSchemeName() string { - if x != nil { - return x.FillingSchemeName - } - return "" -} - -type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // The unique CERN identifier of this user. - ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` - // The unique identifier of this entity. - Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` - // Name of the user. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` -} - -func (x *User) Reset() { - *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_common_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *User) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*User) ProtoMessage() {} - -func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_protos_common_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use User.ProtoReflect.Descriptor instead. -func (*User) Descriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{2} -} - -func (x *User) GetExternalId() int32 { - if x != nil { - return x.ExternalId - } - return 0 -} - -func (x *User) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *User) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -var File_protos_common_proto protoreflect.FileDescriptor - -var file_protos_common_proto_rawDesc = []byte{ - 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xbc, 0x08, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x02, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, 0x6c, - 0x70, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x12, - 0x26, 0x0a, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, - 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x4c, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, - 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x21, 0x70, 0x64, - 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x34, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, - 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, - 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, - 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x12, 0x3a, 0x0a, - 0x0a, 0x72, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0a, 0x72, - 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, - 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, - 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x69, - 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x69, - 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x16, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, - 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, - 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x70, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x1c, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, - 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x2d, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x73, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x12, 0x73, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, - 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, - 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x10, 0x0a, - 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x42, - 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, - 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, - 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, - 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, - 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, - 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, - 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, - 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, - 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, - 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, - 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, - 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, - 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, - 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x2a, 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, - 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, - 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, - 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, - 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, - 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, - 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, - 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, - 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, - 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, - 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, - 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, - 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, - 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_protos_common_proto_rawDescOnce sync.Once - file_protos_common_proto_rawDescData = file_protos_common_proto_rawDesc -) - -func file_protos_common_proto_rawDescGZIP() []byte { - file_protos_common_proto_rawDescOnce.Do(func() { - file_protos_common_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_common_proto_rawDescData) - }) - return file_protos_common_proto_rawDescData -} - -var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) -var file_protos_common_proto_goTypes = []interface{}{ - (Detector)(0), // 0: o2.bookkeeping.Detector - (RunQuality)(0), // 1: o2.bookkeeping.RunQuality - (RunType)(0), // 2: o2.bookkeeping.RunType - (*Run)(nil), // 3: o2.bookkeeping.Run - (*LHCFill)(nil), // 4: o2.bookkeeping.LHCFill - (*User)(nil), // 5: o2.bookkeeping.User -} -var file_protos_common_proto_depIdxs = []int32{ - 1, // 0: o2.bookkeeping.Run.runQuality:type_name -> o2.bookkeeping.RunQuality - 2, // 1: o2.bookkeeping.Run.runType:type_name -> o2.bookkeeping.RunType - 0, // 2: o2.bookkeeping.Run.detectors:type_name -> o2.bookkeeping.Detector - 3, // [3:3] is the sub-list for method output_type - 3, // [3:3] is the sub-list for method input_type - 3, // [3:3] is the sub-list for extension type_name - 3, // [3:3] is the sub-list for extension extendee - 0, // [0:3] is the sub-list for field type_name -} - -func init() { file_protos_common_proto_init() } -func file_protos_common_proto_init() { - if File_protos_common_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_protos_common_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Run); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LHCFill); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_protos_common_proto_msgTypes[1].OneofWrappers = []interface{}{} - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_protos_common_proto_rawDesc, - NumEnums: 3, - NumMessages: 3, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_protos_common_proto_goTypes, - DependencyIndexes: file_protos_common_proto_depIdxs, - EnumInfos: file_protos_common_proto_enumTypes, - MessageInfos: file_protos_common_proto_msgTypes, - }.Build() - File_protos_common_proto = out.File - file_protos_common_proto_rawDesc = nil - file_protos_common_proto_goTypes = nil - file_protos_common_proto_depIdxs = nil -} diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index ce9933c96..f23a902f5 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 +// protoc-gen-go v1.31.0 +// protoc v4.25.3 // source: protos/environment.proto package bkpb @@ -25,10 +25,10 @@ type EnvironmentCreationRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - CreatedAt *int64 `protobuf:"varint,2,opt,name=createdAt,proto3,oneof" json:"createdAt,omitempty"` - Status *string `protobuf:"bytes,3,opt,name=status,proto3,oneof" json:"status,omitempty"` - StatusMessage *string `protobuf:"bytes,4,opt,name=statusMessage,proto3,oneof" json:"statusMessage,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Status *string `protobuf:"bytes,3,opt,name=status,proto3,oneof" json:"status,omitempty"` + StatusMessage *string `protobuf:"bytes,4,opt,name=statusMessage,proto3,oneof" json:"statusMessage,omitempty"` + RawConfiguration string `protobuf:"bytes,5,opt,name=rawConfiguration,proto3" json:"rawConfiguration,omitempty"` } func (x *EnvironmentCreationRequest) Reset() { @@ -70,13 +70,6 @@ func (x *EnvironmentCreationRequest) GetId() string { return "" } -func (x *EnvironmentCreationRequest) GetCreatedAt() int64 { - if x != nil && x.CreatedAt != nil { - return *x.CreatedAt - } - return 0 -} - func (x *EnvironmentCreationRequest) GetStatus() string { if x != nil && x.Status != nil { return *x.Status @@ -91,6 +84,13 @@ func (x *EnvironmentCreationRequest) GetStatusMessage() string { return "" } +func (x *EnvironmentCreationRequest) GetRawConfiguration() string { + if x != nil { + return x.RawConfiguration + } + return "" +} + type EnvironmentUpdateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -268,64 +268,64 @@ var File_protos_environment_proto protoreflect.FileDescriptor var file_protos_environment_proto_rawDesc = []byte{ 0x0a, 0x18, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, - 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0xc2, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x21, - 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x48, 0x00, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, - 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, - 0x6e, 0x41, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, - 0x0a, 0x0b, 0x5f, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x42, 0x09, 0x0a, - 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, - 0x77, 0x6e, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, - 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, - 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, - 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, - 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x15, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2f, 0x62, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0xbd, 0x01, 0x0a, 0x1a, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, + 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x72, 0x61, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, + 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, + 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, 0x0a, 0x12, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x28, + 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -365,7 +365,7 @@ func file_protos_environment_proto_init() { if File_protos_environment_proto != nil { return } - file_protos_common_proto_init() + file_protos_bkcommon_proto_init() if !protoimpl.UnsafeEnabled { file_protos_environment_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*EnvironmentCreationRequest); i { diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index 88b5f97f7..278891624 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.3 +// source: protos/environment.proto package bkpb @@ -14,6 +18,11 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + EnvironmentService_Create_FullMethodName = "/o2.bookkeeping.EnvironmentService/Create" + EnvironmentService_Update_FullMethodName = "/o2.bookkeeping.EnvironmentService/Update" +) + // EnvironmentServiceClient is the client API for EnvironmentService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -32,7 +41,7 @@ func NewEnvironmentServiceClient(cc grpc.ClientConnInterface) EnvironmentService func (c *environmentServiceClient) Create(ctx context.Context, in *EnvironmentCreationRequest, opts ...grpc.CallOption) (*Environment, error) { out := new(Environment) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.EnvironmentService/Create", in, out, opts...) + err := c.cc.Invoke(ctx, EnvironmentService_Create_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -41,7 +50,7 @@ func (c *environmentServiceClient) Create(ctx context.Context, in *EnvironmentCr func (c *environmentServiceClient) Update(ctx context.Context, in *EnvironmentUpdateRequest, opts ...grpc.CallOption) (*Environment, error) { out := new(Environment) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.EnvironmentService/Update", in, out, opts...) + err := c.cc.Invoke(ctx, EnvironmentService_Update_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -88,7 +97,7 @@ func _EnvironmentService_Create_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.EnvironmentService/Create", + FullMethod: EnvironmentService_Create_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(EnvironmentServiceServer).Create(ctx, req.(*EnvironmentCreationRequest)) @@ -106,7 +115,7 @@ func _EnvironmentService_Update_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.EnvironmentService/Update", + FullMethod: EnvironmentService_Update_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(EnvironmentServiceServer).Update(ctx, req.(*EnvironmentUpdateRequest)) diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index d598f0aa8..ee7cdb6ff 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 +// protoc-gen-go v1.31.0 +// protoc v4.25.3 // source: protos/flp.proto package bkpb @@ -130,6 +130,93 @@ func (x *ManyFlpsCreationRequest) GetFlps() []*FlpCreationRequest { return nil } +type UpdateCountersRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FlpName string `protobuf:"bytes,1,opt,name=flpName,proto3" json:"flpName,omitempty"` + RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + NSubTimeframes uint64 `protobuf:"varint,3,opt,name=nSubTimeframes,proto3" json:"nSubTimeframes,omitempty"` + NEquipmentBytes uint64 `protobuf:"varint,4,opt,name=nEquipmentBytes,proto3" json:"nEquipmentBytes,omitempty"` + NRecordingBytes uint64 `protobuf:"varint,5,opt,name=nRecordingBytes,proto3" json:"nRecordingBytes,omitempty"` + NFairMQBytes uint64 `protobuf:"varint,6,opt,name=nFairMQBytes,proto3" json:"nFairMQBytes,omitempty"` +} + +func (x *UpdateCountersRequest) Reset() { + *x = UpdateCountersRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_flp_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UpdateCountersRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateCountersRequest) ProtoMessage() {} + +func (x *UpdateCountersRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_flp_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateCountersRequest.ProtoReflect.Descriptor instead. +func (*UpdateCountersRequest) Descriptor() ([]byte, []int) { + return file_protos_flp_proto_rawDescGZIP(), []int{2} +} + +func (x *UpdateCountersRequest) GetFlpName() string { + if x != nil { + return x.FlpName + } + return "" +} + +func (x *UpdateCountersRequest) GetRunNumber() int32 { + if x != nil { + return x.RunNumber + } + return 0 +} + +func (x *UpdateCountersRequest) GetNSubTimeframes() uint64 { + if x != nil { + return x.NSubTimeframes + } + return 0 +} + +func (x *UpdateCountersRequest) GetNEquipmentBytes() uint64 { + if x != nil { + return x.NEquipmentBytes + } + return 0 +} + +func (x *UpdateCountersRequest) GetNRecordingBytes() uint64 { + if x != nil { + return x.NRecordingBytes + } + return 0 +} + +func (x *UpdateCountersRequest) GetNFairMQBytes() uint64 { + if x != nil { + return x.NFairMQBytes + } + return 0 +} + type FlpList struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -141,7 +228,7 @@ type FlpList struct { func (x *FlpList) Reset() { *x = FlpList{} if protoimpl.UnsafeEnabled { - mi := &file_protos_flp_proto_msgTypes[2] + mi := &file_protos_flp_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -154,7 +241,7 @@ func (x *FlpList) String() string { func (*FlpList) ProtoMessage() {} func (x *FlpList) ProtoReflect() protoreflect.Message { - mi := &file_protos_flp_proto_msgTypes[2] + mi := &file_protos_flp_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -167,7 +254,7 @@ func (x *FlpList) ProtoReflect() protoreflect.Message { // Deprecated: Use FlpList.ProtoReflect.Descriptor instead. func (*FlpList) Descriptor() ([]byte, []int) { - return file_protos_flp_proto_rawDescGZIP(), []int{2} + return file_protos_flp_proto_rawDescGZIP(), []int{3} } func (x *FlpList) GetFlps() []*Flp { @@ -188,18 +275,18 @@ type Flp struct { // Unix timestamp when this entity was created. CreatedAt int64 `protobuf:"varint,4,opt,name=createdAt,proto3" json:"createdAt,omitempty"` // Unix timestamp when this entity was last updated. - UpdatedAt int64 `protobuf:"varint,5,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` - BytesEquipmentReadOut int32 `protobuf:"varint,6,opt,name=bytesEquipmentReadOut,proto3" json:"bytesEquipmentReadOut,omitempty"` - BytesFairMQReadOut int32 `protobuf:"varint,7,opt,name=bytesFairMQReadOut,proto3" json:"bytesFairMQReadOut,omitempty"` - BytesProcessed int32 `protobuf:"varint,8,opt,name=bytesProcessed,proto3" json:"bytesProcessed,omitempty"` - BytesRecordingReadOut int32 `protobuf:"varint,9,opt,name=bytesRecordingReadOut,proto3" json:"bytesRecordingReadOut,omitempty"` - NTimeframes int32 `protobuf:"varint,10,opt,name=nTimeframes,proto3" json:"nTimeframes,omitempty"` + UpdatedAt int64 `protobuf:"varint,5,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` + BytesEquipmentReadOut uint64 `protobuf:"varint,6,opt,name=bytesEquipmentReadOut,proto3" json:"bytesEquipmentReadOut,omitempty"` + BytesFairMQReadOut uint64 `protobuf:"varint,7,opt,name=bytesFairMQReadOut,proto3" json:"bytesFairMQReadOut,omitempty"` + BytesProcessed uint64 `protobuf:"varint,8,opt,name=bytesProcessed,proto3" json:"bytesProcessed,omitempty"` + BytesRecordingReadOut uint64 `protobuf:"varint,9,opt,name=bytesRecordingReadOut,proto3" json:"bytesRecordingReadOut,omitempty"` + NTimeframes uint64 `protobuf:"varint,10,opt,name=nTimeframes,proto3" json:"nTimeframes,omitempty"` } func (x *Flp) Reset() { *x = Flp{} if protoimpl.UnsafeEnabled { - mi := &file_protos_flp_proto_msgTypes[3] + mi := &file_protos_flp_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -212,7 +299,7 @@ func (x *Flp) String() string { func (*Flp) ProtoMessage() {} func (x *Flp) ProtoReflect() protoreflect.Message { - mi := &file_protos_flp_proto_msgTypes[3] + mi := &file_protos_flp_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -225,7 +312,7 @@ func (x *Flp) ProtoReflect() protoreflect.Message { // Deprecated: Use Flp.ProtoReflect.Descriptor instead. func (*Flp) Descriptor() ([]byte, []int) { - return file_protos_flp_proto_rawDescGZIP(), []int{3} + return file_protos_flp_proto_rawDescGZIP(), []int{4} } func (x *Flp) GetId() int32 { @@ -263,35 +350,35 @@ func (x *Flp) GetUpdatedAt() int64 { return 0 } -func (x *Flp) GetBytesEquipmentReadOut() int32 { +func (x *Flp) GetBytesEquipmentReadOut() uint64 { if x != nil { return x.BytesEquipmentReadOut } return 0 } -func (x *Flp) GetBytesFairMQReadOut() int32 { +func (x *Flp) GetBytesFairMQReadOut() uint64 { if x != nil { return x.BytesFairMQReadOut } return 0 } -func (x *Flp) GetBytesProcessed() int32 { +func (x *Flp) GetBytesProcessed() uint64 { if x != nil { return x.BytesProcessed } return 0 } -func (x *Flp) GetBytesRecordingReadOut() int32 { +func (x *Flp) GetBytesRecordingReadOut() uint64 { if x != nil { return x.BytesRecordingReadOut } return 0 } -func (x *Flp) GetNTimeframes() int32 { +func (x *Flp) GetNTimeframes() uint64 { if x != nil { return x.NTimeframes } @@ -315,44 +402,64 @@ var file_protos_flp_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x12, 0x36, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0x32, 0x0a, 0x07, - 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, - 0x22, 0xe7, 0x02, 0x0a, 0x03, 0x46, 0x6c, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, - 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, - 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x54, 0x69, 0x6d, - 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, - 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x32, 0x5c, 0x0a, 0x0a, 0x46, 0x6c, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x79, 0x46, 0x6c, 0x70, 0x73, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, - 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, - 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x04, 0x66, 0x6c, 0x70, 0x73, 0x22, 0xef, 0x01, 0x0a, + 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x6c, 0x70, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x66, 0x6c, 0x70, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x26, + 0x0a, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x53, 0x75, 0x62, 0x54, 0x69, 0x6d, 0x65, + 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x45, 0x71, 0x75, 0x69, 0x70, + 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0f, 0x6e, 0x45, 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x12, 0x28, 0x0a, 0x0f, 0x6e, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6e, 0x52, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x69, 0x6e, 0x67, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x46, + 0x61, 0x69, 0x72, 0x4d, 0x51, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0c, 0x6e, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x42, 0x79, 0x74, 0x65, 0x73, 0x22, 0x32, + 0x0a, 0x07, 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x66, 0x6c, 0x70, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x52, 0x04, 0x66, 0x6c, + 0x70, 0x73, 0x22, 0xe7, 0x02, 0x0a, 0x03, 0x46, 0x6c, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, + 0x71, 0x75, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x45, 0x71, 0x75, 0x69, + 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x2e, 0x0a, 0x12, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, + 0x75, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x62, 0x79, 0x74, 0x65, 0x73, 0x46, + 0x61, 0x69, 0x72, 0x4d, 0x51, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x62, 0x79, 0x74, 0x65, 0x73, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x12, 0x34, 0x0a, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x15, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0b, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x32, 0xaa, 0x01, 0x0a, + 0x0a, 0x46, 0x6c, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x79, 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x61, 0x6e, 0x79, 0x46, + 0x6c, 0x70, 0x73, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x4c, 0x0a, 0x0e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x12, 0x25, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x46, 0x6c, 0x70, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, + 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -367,20 +474,23 @@ func file_protos_flp_proto_rawDescGZIP() []byte { return file_protos_flp_proto_rawDescData } -var file_protos_flp_proto_msgTypes = make([]protoimpl.MessageInfo, 4) +var file_protos_flp_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_protos_flp_proto_goTypes = []interface{}{ (*FlpCreationRequest)(nil), // 0: o2.bookkeeping.FlpCreationRequest (*ManyFlpsCreationRequest)(nil), // 1: o2.bookkeeping.ManyFlpsCreationRequest - (*FlpList)(nil), // 2: o2.bookkeeping.FlpList - (*Flp)(nil), // 3: o2.bookkeeping.Flp + (*UpdateCountersRequest)(nil), // 2: o2.bookkeeping.UpdateCountersRequest + (*FlpList)(nil), // 3: o2.bookkeeping.FlpList + (*Flp)(nil), // 4: o2.bookkeeping.Flp } var file_protos_flp_proto_depIdxs = []int32{ 0, // 0: o2.bookkeeping.ManyFlpsCreationRequest.flps:type_name -> o2.bookkeeping.FlpCreationRequest - 3, // 1: o2.bookkeeping.FlpList.flps:type_name -> o2.bookkeeping.Flp + 4, // 1: o2.bookkeeping.FlpList.flps:type_name -> o2.bookkeeping.Flp 1, // 2: o2.bookkeeping.FlpService.CreateMany:input_type -> o2.bookkeeping.ManyFlpsCreationRequest - 2, // 3: o2.bookkeeping.FlpService.CreateMany:output_type -> o2.bookkeeping.FlpList - 3, // [3:4] is the sub-list for method output_type - 2, // [2:3] is the sub-list for method input_type + 2, // 3: o2.bookkeeping.FlpService.UpdateCounters:input_type -> o2.bookkeeping.UpdateCountersRequest + 3, // 4: o2.bookkeeping.FlpService.CreateMany:output_type -> o2.bookkeeping.FlpList + 4, // 5: o2.bookkeeping.FlpService.UpdateCounters:output_type -> o2.bookkeeping.Flp + 4, // [4:6] is the sub-list for method output_type + 2, // [2:4] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -417,7 +527,7 @@ func file_protos_flp_proto_init() { } } file_protos_flp_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FlpList); i { + switch v := v.(*UpdateCountersRequest); i { case 0: return &v.state case 1: @@ -429,6 +539,18 @@ func file_protos_flp_proto_init() { } } file_protos_flp_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FlpList); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_flp_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Flp); i { case 0: return &v.state @@ -448,7 +570,7 @@ func file_protos_flp_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_flp_proto_rawDesc, NumEnums: 0, - NumMessages: 4, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index f4fc752f3..0f72d7660 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.3 +// source: protos/flp.proto package bkpb @@ -14,11 +18,17 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + FlpService_CreateMany_FullMethodName = "/o2.bookkeeping.FlpService/CreateMany" + FlpService_UpdateCounters_FullMethodName = "/o2.bookkeeping.FlpService/UpdateCounters" +) + // FlpServiceClient is the client API for FlpService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type FlpServiceClient interface { CreateMany(ctx context.Context, in *ManyFlpsCreationRequest, opts ...grpc.CallOption) (*FlpList, error) + UpdateCounters(ctx context.Context, in *UpdateCountersRequest, opts ...grpc.CallOption) (*Flp, error) } type flpServiceClient struct { @@ -31,7 +41,16 @@ func NewFlpServiceClient(cc grpc.ClientConnInterface) FlpServiceClient { func (c *flpServiceClient) CreateMany(ctx context.Context, in *ManyFlpsCreationRequest, opts ...grpc.CallOption) (*FlpList, error) { out := new(FlpList) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.FlpService/CreateMany", in, out, opts...) + err := c.cc.Invoke(ctx, FlpService_CreateMany_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *flpServiceClient) UpdateCounters(ctx context.Context, in *UpdateCountersRequest, opts ...grpc.CallOption) (*Flp, error) { + out := new(Flp) + err := c.cc.Invoke(ctx, FlpService_UpdateCounters_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -43,6 +62,7 @@ func (c *flpServiceClient) CreateMany(ctx context.Context, in *ManyFlpsCreationR // for forward compatibility type FlpServiceServer interface { CreateMany(context.Context, *ManyFlpsCreationRequest) (*FlpList, error) + UpdateCounters(context.Context, *UpdateCountersRequest) (*Flp, error) } // UnimplementedFlpServiceServer should be embedded to have forward compatible implementations. @@ -52,6 +72,9 @@ type UnimplementedFlpServiceServer struct { func (UnimplementedFlpServiceServer) CreateMany(context.Context, *ManyFlpsCreationRequest) (*FlpList, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateMany not implemented") } +func (UnimplementedFlpServiceServer) UpdateCounters(context.Context, *UpdateCountersRequest) (*Flp, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateCounters not implemented") +} // UnsafeFlpServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to FlpServiceServer will @@ -74,7 +97,7 @@ func _FlpService_CreateMany_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.FlpService/CreateMany", + FullMethod: FlpService_CreateMany_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(FlpServiceServer).CreateMany(ctx, req.(*ManyFlpsCreationRequest)) @@ -82,6 +105,24 @@ func _FlpService_CreateMany_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _FlpService_UpdateCounters_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateCountersRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(FlpServiceServer).UpdateCounters(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: FlpService_UpdateCounters_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(FlpServiceServer).UpdateCounters(ctx, req.(*UpdateCountersRequest)) + } + return interceptor(ctx, in, info, handler) +} + // FlpService_ServiceDesc is the grpc.ServiceDesc for FlpService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -93,6 +134,10 @@ var FlpService_ServiceDesc = grpc.ServiceDesc{ MethodName: "CreateMany", Handler: _FlpService_CreateMany_Handler, }, + { + MethodName: "UpdateCounters", + Handler: _FlpService_UpdateCounters_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "protos/flp.proto", diff --git a/core/integration/bookkeeping/protos/lhcFill.pb.go b/core/integration/bookkeeping/protos/lhcFill.pb.go index 4bc2ab559..a1cb14d9d 100644 --- a/core/integration/bookkeeping/protos/lhcFill.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 +// protoc-gen-go v1.31.0 +// protoc v4.25.3 // source: protos/lhcFill.proto package bkpb @@ -110,27 +110,27 @@ var File_protos_lhcFill_proto protoreflect.FileDescriptor var file_protos_lhcFill_proto_rawDesc = []byte{ 0x0a, 0x14, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x4c, - 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, - 0x6c, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x31, - 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x52, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, - 0x6c, 0x32, 0x6a, 0x0a, 0x0e, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, 0x12, 0x27, - 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, 0x63, 0x68, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, - 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, - 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x4a, 0x5a, - 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, - 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x1a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, + 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x19, 0x0a, + 0x17, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, 0x63, + 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x49, 0x0a, 0x14, 0x4c, 0x68, 0x63, 0x46, + 0x69, 0x6c, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x31, 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x52, 0x07, 0x6c, 0x68, 0x63, 0x46, + 0x69, 0x6c, 0x6c, 0x32, 0x6a, 0x0a, 0x0e, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x58, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4c, 0x61, 0x73, 0x74, + 0x12, 0x27, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x4c, 0x61, 0x73, 0x74, 0x4c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x46, 0x65, 0x74, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x2e, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x68, 0x63, 0x46, 0x69, + 0x6c, 0x6c, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, + 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -167,7 +167,7 @@ func file_protos_lhcFill_proto_init() { if File_protos_lhcFill_proto != nil { return } - file_protos_common_proto_init() + file_protos_bkcommon_proto_init() if !protoimpl.UnsafeEnabled { file_protos_lhcFill_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LastLhcFillFetchRequest); i { diff --git a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go index 307ee051c..cf2ad508e 100644 --- a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.3 +// source: protos/lhcFill.proto package bkpb @@ -14,6 +18,10 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + LhcFillService_GetLast_FullMethodName = "/o2.bookkeeping.LhcFillService/GetLast" +) + // LhcFillServiceClient is the client API for LhcFillService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -31,7 +39,7 @@ func NewLhcFillServiceClient(cc grpc.ClientConnInterface) LhcFillServiceClient { func (c *lhcFillServiceClient) GetLast(ctx context.Context, in *LastLhcFillFetchRequest, opts ...grpc.CallOption) (*LhcFillWithRelations, error) { out := new(LhcFillWithRelations) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.LhcFillService/GetLast", in, out, opts...) + err := c.cc.Invoke(ctx, LhcFillService_GetLast_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -74,7 +82,7 @@ func _LhcFillService_GetLast_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.LhcFillService/GetLast", + FullMethod: LhcFillService_GetLast_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(LhcFillServiceServer).GetLast(ctx, req.(*LastLhcFillFetchRequest)) diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index 65d6ca66a..fc8090806 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 +// protoc-gen-go v1.31.0 +// protoc v4.25.3 // source: protos/log.proto package bkpb @@ -628,6 +628,8 @@ type Tag struct { UpdatedAt int64 `protobuf:"varint,6,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` // The last person that edited the email/mattermost fields LastEditedName string `protobuf:"bytes,7,opt,name=lastEditedName,proto3" json:"lastEditedName,omitempty"` + // The description of the tag + Description *string `protobuf:"bytes,8,opt,name=description,proto3,oneof" json:"description,omitempty"` } func (x *Tag) Reset() { @@ -711,125 +713,136 @@ func (x *Tag) GetLastEditedName() string { return "" } +func (x *Tag) GetDescription() string { + if x != nil && x.Description != nil { + return *x.Description + } + return "" +} + var File_protos_log_proto protoreflect.FileDescriptor var file_protos_log_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x6c, 0x6f, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x88, 0x01, 0x01, 0x42, - 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x22, - 0x8e, 0x02, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, - 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x69, - 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0xce, 0x04, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, - 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x00, 0x52, - 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, 0x6f, - 0x67, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x4c, - 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x04, - 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x12, - 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x75, - 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, - 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x6b, 0x0a, - 0x09, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xc3, 0x01, 0x0a, 0x03, 0x54, - 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, - 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, - 0x2a, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, - 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, - 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, - 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, - 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, - 0x2a, 0xa7, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, - 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, - 0x54, 0x45, 0x4d, 0x10, 0x02, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, - 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, - 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x67, 0x1a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6b, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x4c, 0x6f, + 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x75, + 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0a, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, + 0x64, 0x22, 0x8e, 0x02, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x6d, 0x69, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x22, 0xce, 0x04, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x06, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, + 0x00, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, + 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x6f, + 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, + 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x75, 0x62, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x52, 0x07, + 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, + 0x6b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfa, 0x01, 0x0a, + 0x03, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, + 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, + 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x67, + 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, + 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, + 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, + 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, + 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, + 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, + 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, + 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, + 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x02, 0x12, 0x1c, + 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, + 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, + 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, + 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, + 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -879,7 +892,7 @@ func file_protos_log_proto_init() { if File_protos_log_proto != nil { return } - file_protos_common_proto_init() + file_protos_bkcommon_proto_init() if !protoimpl.UnsafeEnabled { file_protos_log_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*LogCreationRequest); i { @@ -956,6 +969,7 @@ func file_protos_log_proto_init() { } file_protos_log_proto_msgTypes[0].OneofWrappers = []interface{}{} file_protos_log_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_protos_log_proto_msgTypes[5].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 5a8a4201f..112673309 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.3 +// source: protos/log.proto package bkpb @@ -14,6 +18,10 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + LogService_Create_FullMethodName = "/o2.bookkeeping.LogService/Create" +) + // LogServiceClient is the client API for LogService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -31,7 +39,7 @@ func NewLogServiceClient(cc grpc.ClientConnInterface) LogServiceClient { func (c *logServiceClient) Create(ctx context.Context, in *LogCreationRequest, opts ...grpc.CallOption) (*Log, error) { out := new(Log) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.LogService/Create", in, out, opts...) + err := c.cc.Invoke(ctx, LogService_Create_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -74,7 +82,7 @@ func _LogService_Create_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.LogService/Create", + FullMethod: LogService_Create_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(LogServiceServer).Create(ctx, req.(*LogCreationRequest)) diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 4731ce7c5..ab0a07e7e 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.15.8 +// protoc-gen-go v1.31.0 +// protoc v4.25.3 // source: protos/run.proto package bkpb @@ -198,6 +198,9 @@ type RunCreationRequest struct { EpnTopology string `protobuf:"bytes,10,opt,name=epnTopology,proto3" json:"epnTopology,omitempty"` OdcTopologyFullName *string `protobuf:"bytes,11,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` Detectors []Detector `protobuf:"varint,12,rep,packed,name=detectors,proto3,enum=o2.bookkeeping.Detector" json:"detectors,omitempty"` + // Optional users that stopped or started the run (can also be undefined) + UserO2Start *User `protobuf:"bytes,13,opt,name=userO2Start,proto3,oneof" json:"userO2Start,omitempty"` + UserO2Stop *User `protobuf:"bytes,14,opt,name=userO2Stop,proto3,oneof" json:"userO2Stop,omitempty"` } func (x *RunCreationRequest) Reset() { @@ -316,25 +319,43 @@ func (x *RunCreationRequest) GetDetectors() []Detector { return nil } +func (x *RunCreationRequest) GetUserO2Start() *User { + if x != nil { + return x.UserO2Start + } + return nil +} + +func (x *RunCreationRequest) GetUserO2Stop() *User { + if x != nil { + return x.UserO2Stop + } + return nil +} + type RunUpdateRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - TimeO2Start *int64 `protobuf:"varint,3,opt,name=timeO2Start,proto3,oneof" json:"timeO2Start,omitempty"` - TimeO2End *int64 `protobuf:"varint,4,opt,name=timeO2End,proto3,oneof" json:"timeO2End,omitempty"` - TimeTrgStart *int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` - TimeTrgEnd *int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` - TriggerValue *string `protobuf:"bytes,7,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` - PdpConfigOption *string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3,oneof" json:"pdpConfigOption,omitempty"` - PdpTopologyDescriptionLibraryFile *string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3,oneof" json:"pdpTopologyDescriptionLibraryFile,omitempty"` - TfbDdMode *string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3,oneof" json:"tfbDdMode,omitempty"` - LhcPeriod *string `protobuf:"bytes,11,opt,name=lhcPeriod,proto3,oneof" json:"lhcPeriod,omitempty"` - OdcTopologyFullName *string `protobuf:"bytes,12,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` - PdpWorkflowParameters *string `protobuf:"bytes,13,opt,name=pdpWorkflowParameters,proto3,oneof" json:"pdpWorkflowParameters,omitempty"` - PdpBeamType *string `protobuf:"bytes,14,opt,name=pdpBeamType,proto3,oneof" json:"pdpBeamType,omitempty"` - ReadoutCfgUri *string `protobuf:"bytes,15,opt,name=readoutCfgUri,proto3,oneof" json:"readoutCfgUri,omitempty"` + RunNumber int32 `protobuf:"varint,1,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + TimeO2Start *int64 `protobuf:"varint,3,opt,name=timeO2Start,proto3,oneof" json:"timeO2Start,omitempty"` + TimeO2End *int64 `protobuf:"varint,4,opt,name=timeO2End,proto3,oneof" json:"timeO2End,omitempty"` + TimeTrgStart *int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` + TimeTrgEnd *int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` + TriggerValue *string `protobuf:"bytes,7,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + PdpConfigOption *string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3,oneof" json:"pdpConfigOption,omitempty"` + PdpTopologyDescriptionLibraryFile *string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3,oneof" json:"pdpTopologyDescriptionLibraryFile,omitempty"` + TfbDdMode *string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3,oneof" json:"tfbDdMode,omitempty"` + LhcPeriod *string `protobuf:"bytes,11,opt,name=lhcPeriod,proto3,oneof" json:"lhcPeriod,omitempty"` + OdcTopologyFullName *string `protobuf:"bytes,12,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` + PdpWorkflowParameters *string `protobuf:"bytes,13,opt,name=pdpWorkflowParameters,proto3,oneof" json:"pdpWorkflowParameters,omitempty"` + PdpBeamType *string `protobuf:"bytes,14,opt,name=pdpBeamType,proto3,oneof" json:"pdpBeamType,omitempty"` + ReadoutCfgUri *string `protobuf:"bytes,15,opt,name=readoutCfgUri,proto3,oneof" json:"readoutCfgUri,omitempty"` + EorReasons []*EorReason `protobuf:"bytes,16,rep,name=eorReasons,proto3" json:"eorReasons,omitempty"` + // Optional users that stopped or started the run (can also be undefined) + UserO2Start *User `protobuf:"bytes,17,opt,name=userO2Start,proto3,oneof" json:"userO2Start,omitempty"` + UserO2Stop *User `protobuf:"bytes,18,opt,name=userO2Stop,proto3,oneof" json:"userO2Stop,omitempty"` } func (x *RunUpdateRequest) Reset() { @@ -467,134 +488,178 @@ func (x *RunUpdateRequest) GetReadoutCfgUri() string { return "" } +func (x *RunUpdateRequest) GetEorReasons() []*EorReason { + if x != nil { + return x.EorReasons + } + return nil +} + +func (x *RunUpdateRequest) GetUserO2Start() *User { + if x != nil { + return x.UserO2Start + } + return nil +} + +func (x *RunUpdateRequest) GetUserO2Stop() *User { + if x != nil { + return x.UserO2Stop + } + return nil +} + var File_protos_run_proto protoreflect.FileDescriptor var file_protos_run_proto_rawDesc = []byte{ 0x0a, 0x10, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x72, 0x75, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x1a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0f, 0x52, 0x75, 0x6e, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, - 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, - 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6f, 0x32, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7d, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, - 0x36, 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x6c, 0x68, 0x63, - 0x46, 0x69, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6c, 0x68, 0x63, 0x46, - 0x69, 0x6c, 0x6c, 0x22, 0xbb, 0x03, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x75, - 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6f, 0x32, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x15, 0x0a, - 0x06, 0x64, 0x64, 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, - 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, - 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, - 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, - 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, - 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, - 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0xf6, 0x06, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x69, 0x6d, - 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, - 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, - 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x0a, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, - 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, - 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, - 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, - 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x74, 0x66, - 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, - 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, - 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, - 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x13, 0x6f, 0x64, - 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, - 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, - 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x88, 0x01, - 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, - 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, - 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, - 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x18, - 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, - 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, - 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x2a, 0x42, 0x0a, 0x0c, 0x52, 0x75, - 0x6e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, - 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, - 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x53, 0x5f, 0x4c, 0x48, 0x43, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, 0x32, 0xda, - 0x01, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, - 0x03, 0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x67, 0x1a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6b, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x6b, 0x0a, 0x0f, 0x52, 0x75, 0x6e, + 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3a, 0x0a, 0x09, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7d, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, + 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x25, 0x0a, 0x03, 0x72, 0x75, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x03, 0x72, 0x75, + 0x6e, 0x12, 0x36, 0x0a, 0x07, 0x6c, 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, + 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x48, 0x00, 0x52, 0x07, 0x6c, + 0x68, 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6c, 0x68, + 0x63, 0x46, 0x69, 0x6c, 0x6c, 0x22, 0xd2, 0x04, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x46, 0x6c, 0x70, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x31, 0x0a, 0x07, + 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, + 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x15, 0x0a, 0x06, 0x64, 0x64, 0x5f, 0x66, 0x6c, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x64, 0x63, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x70, + 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x35, 0x0a, 0x13, + 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x13, 0x6f, 0x64, 0x63, + 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x75, + 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x01, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, + 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x48, 0x02, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, + 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, + 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x22, 0xc8, 0x08, 0x0a, 0x10, 0x52, + 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, + 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x4f, + 0x32, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, + 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, + 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x23, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, + 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, + 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, + 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, + 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, + 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, + 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, + 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, + 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x29, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, + 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x6f, + 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, + 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x6f, 0x72, 0x52, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x48, 0x0d, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, + 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x0e, 0x52, 0x0a, + 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, + 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0c, 0x0a, + 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x12, 0x0a, 0x10, + 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x66, 0x62, 0x44, 0x64, + 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, + 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, + 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x4f, + 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x4f, + 0x32, 0x53, 0x74, 0x6f, 0x70, 0x2a, 0x42, 0x0a, 0x0c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x1a, 0x0a, + 0x16, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4c, + 0x48, 0x43, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, 0x32, 0xda, 0x01, 0x0a, 0x0a, 0x52, 0x75, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, + 0x1f, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, + 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, + 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -621,24 +686,31 @@ var file_protos_run_proto_goTypes = []interface{}{ (*LHCFill)(nil), // 6: o2.bookkeeping.LHCFill (RunType)(0), // 7: o2.bookkeeping.RunType (Detector)(0), // 8: o2.bookkeeping.Detector + (*User)(nil), // 9: o2.bookkeeping.User + (*EorReason)(nil), // 10: o2.bookkeeping.EorReason } var file_protos_run_proto_depIdxs = []int32{ - 0, // 0: o2.bookkeeping.RunFetchRequest.relations:type_name -> o2.bookkeeping.RunRelations - 5, // 1: o2.bookkeeping.RunWithRelations.run:type_name -> o2.bookkeeping.Run - 6, // 2: o2.bookkeeping.RunWithRelations.lhcFill:type_name -> o2.bookkeeping.LHCFill - 7, // 3: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType - 8, // 4: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector - 1, // 5: o2.bookkeeping.RunService.Get:input_type -> o2.bookkeeping.RunFetchRequest - 3, // 6: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest - 4, // 7: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest - 2, // 8: o2.bookkeeping.RunService.Get:output_type -> o2.bookkeeping.RunWithRelations - 5, // 9: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run - 5, // 10: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run - 8, // [8:11] is the sub-list for method output_type - 5, // [5:8] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 0, // 0: o2.bookkeeping.RunFetchRequest.relations:type_name -> o2.bookkeeping.RunRelations + 5, // 1: o2.bookkeeping.RunWithRelations.run:type_name -> o2.bookkeeping.Run + 6, // 2: o2.bookkeeping.RunWithRelations.lhcFill:type_name -> o2.bookkeeping.LHCFill + 7, // 3: o2.bookkeeping.RunCreationRequest.runType:type_name -> o2.bookkeeping.RunType + 8, // 4: o2.bookkeeping.RunCreationRequest.detectors:type_name -> o2.bookkeeping.Detector + 9, // 5: o2.bookkeeping.RunCreationRequest.userO2Start:type_name -> o2.bookkeeping.User + 9, // 6: o2.bookkeeping.RunCreationRequest.userO2Stop:type_name -> o2.bookkeeping.User + 10, // 7: o2.bookkeeping.RunUpdateRequest.eorReasons:type_name -> o2.bookkeeping.EorReason + 9, // 8: o2.bookkeeping.RunUpdateRequest.userO2Start:type_name -> o2.bookkeeping.User + 9, // 9: o2.bookkeeping.RunUpdateRequest.userO2Stop:type_name -> o2.bookkeeping.User + 1, // 10: o2.bookkeeping.RunService.Get:input_type -> o2.bookkeeping.RunFetchRequest + 3, // 11: o2.bookkeeping.RunService.Create:input_type -> o2.bookkeeping.RunCreationRequest + 4, // 12: o2.bookkeeping.RunService.Update:input_type -> o2.bookkeeping.RunUpdateRequest + 2, // 13: o2.bookkeeping.RunService.Get:output_type -> o2.bookkeeping.RunWithRelations + 5, // 14: o2.bookkeeping.RunService.Create:output_type -> o2.bookkeeping.Run + 5, // 15: o2.bookkeeping.RunService.Update:output_type -> o2.bookkeeping.Run + 13, // [13:16] is the sub-list for method output_type + 10, // [10:13] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_protos_run_proto_init() } @@ -646,7 +718,7 @@ func file_protos_run_proto_init() { if File_protos_run_proto != nil { return } - file_protos_common_proto_init() + file_protos_bkcommon_proto_init() if !protoimpl.UnsafeEnabled { file_protos_run_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RunFetchRequest); i { diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index 264b1aaa3..b184acf19 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v4.25.3 +// source: protos/run.proto package bkpb @@ -14,6 +18,12 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + RunService_Get_FullMethodName = "/o2.bookkeeping.RunService/Get" + RunService_Create_FullMethodName = "/o2.bookkeeping.RunService/Create" + RunService_Update_FullMethodName = "/o2.bookkeeping.RunService/Update" +) + // RunServiceClient is the client API for RunService service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -33,7 +43,7 @@ func NewRunServiceClient(cc grpc.ClientConnInterface) RunServiceClient { func (c *runServiceClient) Get(ctx context.Context, in *RunFetchRequest, opts ...grpc.CallOption) (*RunWithRelations, error) { out := new(RunWithRelations) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Get", in, out, opts...) + err := c.cc.Invoke(ctx, RunService_Get_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -42,7 +52,7 @@ func (c *runServiceClient) Get(ctx context.Context, in *RunFetchRequest, opts .. func (c *runServiceClient) Create(ctx context.Context, in *RunCreationRequest, opts ...grpc.CallOption) (*Run, error) { out := new(Run) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Create", in, out, opts...) + err := c.cc.Invoke(ctx, RunService_Create_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -51,7 +61,7 @@ func (c *runServiceClient) Create(ctx context.Context, in *RunCreationRequest, o func (c *runServiceClient) Update(ctx context.Context, in *RunUpdateRequest, opts ...grpc.CallOption) (*Run, error) { out := new(Run) - err := c.cc.Invoke(ctx, "/o2.bookkeeping.RunService/Update", in, out, opts...) + err := c.cc.Invoke(ctx, RunService_Update_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -102,7 +112,7 @@ func _RunService_Get_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.RunService/Get", + FullMethod: RunService_Get_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RunServiceServer).Get(ctx, req.(*RunFetchRequest)) @@ -120,7 +130,7 @@ func _RunService_Create_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.RunService/Create", + FullMethod: RunService_Create_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RunServiceServer).Create(ctx, req.(*RunCreationRequest)) @@ -138,7 +148,7 @@ func _RunService_Update_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.bookkeeping.RunService/Update", + FullMethod: RunService_Update_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(RunServiceServer).Update(ctx, req.(*RunUpdateRequest)) From bcd2c1af3d6ab5366687c9822760d9ac08061470 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 16 Jul 2024 15:17:42 +0200 Subject: [PATCH 1966/2352] [core] Update Bookkeeping client for latest proto --- core/integration/bookkeeping/plugin.go | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 7b58bd7cb..ac8625208 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -24,7 +24,7 @@ */ // Generate protofiles using the .protos imported from Bookkeeping in the Makefile -//go:generate protoc --go_out=. --go_opt=paths=source_relative protos/common.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative protos/bkcommon.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/environment.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/flp.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/log.proto @@ -1218,8 +1218,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - createdAt := time.Now().UnixMilli() - var statusMessage = "" envState := env.CurrentState() if envState == "STANDBY" || envState == "DEPLOYED" { @@ -1232,7 +1230,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { inEnv := bkpb.EnvironmentCreationRequest{ Id: env.Id().String(), - CreatedAt: &createdAt, Status: &envState, StatusMessage: &statusMessage, } From d83667f7000082ef315edd5c614239f0e70eb849 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Jul 2024 13:24:30 +0200 Subject: [PATCH 1967/2352] [docs] Add documentation on DCS op behaviour --- docs/handbook/operation_order.md | 114 ++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 1 deletion(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 296e702a0..b4fe3f567 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -82,4 +82,116 @@ This is the order of actions happening at a healthy end of run. - `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. - `after_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `ccdb.RunStop()` at `0` - - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file + - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` + +# Integrated service operations + +## DCS + +### DCS operations + +The DCS integration plugin exposes to the workflow template (WFT) context the +following operations. Their associated transitions in this table refer +to the [readout-dataflow](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) workflow template. + +| **DCS operation** | **WFT call** | **Call timing** | **Critical** | **Contingent on detector state** | +|-----------------------|---------------------|---------------------------|--------------|----------------------------------| +| Prepare For Run (PFR) | `dcs.PrepareForRun` | during `CONFIGURE` | `false` | yes | +| Start Of Run (SOR) | `dcs.StartOfRun` | early in `START_ACTIVITY` | `true` | yes | +| End Of Run (EOR) | `dcs.EndOfRun` | late in `STOP_ACTIVITY` | `true` | no | + +The DCS integration plugin subscribes to the [DCS service](https://github.com/AliceO2Group/Control/blob/master/core/integration/dcs/protos/dcs.proto) and continually +receives information on operation-state compatibility for all +detectors. +When a given environment reaches a DCS call, the relevant DCS operation +will be called only if the DCS service reports that all detectors in that +environment are compatible with this operation, except EOR, which is +always called. + +### DCS PrepareForRun behaviour + +Unlike SOR and EOR, which are mandatory if `dcs_enabled` is set to `true`, +an impossibility to run PFR or a PFR failure will not prevent the +environment from transitioning forward. + +#### DCS PFR incompatibility + +When `dcs.PrepareForRun` is called, if at least one detector is in a +state that is incompatible with PFR as reported by the DCS service, +a grace period of 10 seconds is given for the detector(s) to become +compatible with PFR, with 1Hz polling frequency. As soon as all +detectors become compatible with PFR, the PFR operation is requested +to the DCS service. + +If the grace period ends and at least one detector +included in the environment is still incompatible with PFR, the PFR +operation **will not run for any detector**. + +However, the environment +can still transition forward towards the `RUNNING` state, and any DCS +activities that would have taken place in PFR will instead happen +during SOR. Only at that point, if at least one detector is not +compatible with SOR (or if it is but SOR fails), will the environment +declare a failure. + +#### DCS PFR failure + +When `dcs.PrepareForRun` is called, if all detectors are compatible +with PFR as reported by the DCS service (or become compatible during +the grace period), the PFR operation is immediately requested to the +DCS service. + +If this operation fails for one or more detectors, the +`dcs.PrepareForRun` call as a whole is considered to have failed, +but since it is non-critical the environment may still reach the +`CONFIGURED` state and transition forward towards `RUNNING`. + +As in the case of an impossibility to run PFR, any DCS activities that +would have taken place in PFR will instead be done during SOR. + +### DCS StartOfRun behaviour + +The SOR operation is mandatory if `dcs_enabled` is set to `true` +(AliECS GUI "DCS" switched on). + +#### DCS SOR incompatibility + +When `dcs.StartOfRun` is called, if at least one detector is in a +state that is incompatible with SOR as reported by the DCS service, +or if after a grace period of 10 seconds at least one detector is +still incompatible with SOR, the SOR operation **will not run for any +detector**. + +The environment will then declare a **failure**, the +`START_ACTIVITY` transition will be blocked and the environment +will move to `ERROR`. + +#### DCS SOR failure + +When `dcs.StartOfRun` is called, if all detectors are compatible +with SOR as reported by the DCS service (or become compatible during +the grace period), the SOR operation is immediately requested to the +DCS service. + +If this operation fails for one or more detectors, the +`dcs.StartOfRun` call as a whole is considered to have failed. + +The environment will then declare a **failure**, the +`START_ACTIVITY` transition will be blocked and the environment +will move to `ERROR` + +### DCS EndOfRun behaviour + +The EOR operation is mandatory if `dcs_enabled` is set to `true` +(AliECS GUI "DCS" switched on). However, unlike with PFR and SOR, there +is **no check for compatibility** with the EOR operation. The EOR +request will always be sent to the DCS service during `STOP_ACTIVITY`. + +#### DCS EOR failure + +If this operation fails for one or more detectors, the +`dcs.EndOfRun` call as a whole is considered to have failed. + +The environment will then declare a **failure**, the +`STOP_ACTIVITY` transition will be blocked and the environment +will move to `ERROR`. \ No newline at end of file From ba1f64340f1e0a84f805f92e29cadb1ef4913163 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 17 Jul 2024 13:37:06 +0200 Subject: [PATCH 1968/2352] =?UTF-8?q?[executor]=20Chmod=20sandbox=20direct?= =?UTF-8?q?ory=20750=E2=86=92755=20so=20task=20can=20read=20it?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- executor/executor.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/executor/executor.go b/executor/executor.go index 3ba4989a5..c570a95fc 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -161,6 +161,9 @@ func Run(cfg config.Config) { handler = buildEventHandler(state) ) + // Chmod executor directory from 750 to 755 because of OCTRL-766 + _ = syscall.Chmod(cfg.Directory, 0755) + // Main loop for (re)subscription. Once we're subscribed, we jump into the event loop for handling the agent. for { func() { From 03a502242b3650d42d4558c96498b07ffb06f47d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 17 Jul 2024 09:47:32 +0200 Subject: [PATCH 1969/2352] added logging filters for IL --- cmd/o2-aliecs-core/main.go | 9 +++--- cmd/o2-aliecs-executor/main.go | 2 +- cmd/o2-apricot/main.go | 15 ++++----- common/logger/infologger/directhook.go | 43 ++++++++++++++++++-------- core/config.go | 2 ++ 5 files changed, 46 insertions(+), 25 deletions(-) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index df1f90e49..e19eadec8 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -87,10 +87,6 @@ func init() { ForceFormatting: true, }) log.SetOutput(os.Stdout) - ilHook, err := infologger.NewDirectHook("ECS", "core") - if err == nil { - log.AddHook(ilHook) - } } func main() { @@ -98,6 +94,11 @@ func main() { log.Fatal(err) } + ilHook, err := infologger.NewDirectHook("ECS", "core", nil) + if err == nil { + log.AddHook(ilHook) + } + if err := core.Run(); err != nil { log.Fatal(err) } diff --git a/cmd/o2-aliecs-executor/main.go b/cmd/o2-aliecs-executor/main.go index 556e0b994..5bcda4de5 100644 --- a/cmd/o2-aliecs-executor/main.go +++ b/cmd/o2-aliecs-executor/main.go @@ -37,7 +37,7 @@ import ( func init() { logrus.SetOutput(os.Stdout) - ilHook, err := infologger.NewDirectHook("ECS", "executor") + ilHook, err := infologger.NewDirectHook("ECS", "executor", logrus.AllLevels) if err == nil { logrus.AddHook(ilHook) } diff --git a/cmd/o2-apricot/main.go b/cmd/o2-apricot/main.go index 38d8e5267..5bba3f759 100644 --- a/cmd/o2-apricot/main.go +++ b/cmd/o2-apricot/main.go @@ -35,19 +35,15 @@ import ( func init() { log.SetFormatter(&prefixed.TextFormatter{ - FullTimestamp: true, - SpacePadding: 20, - PrefixPadding: 12, + FullTimestamp: true, + SpacePadding: 20, + PrefixPadding: 12, // Needed for colored stdout/stderr in GoLand, IntelliJ, etc. ForceColors: true, ForceFormatting: true, }) log.SetOutput(os.Stdout) - ilHook, err := infologger.NewDirectHook("ECS", "apricot") - if err == nil { - log.AddHook(ilHook) - } } func main() { @@ -55,6 +51,11 @@ func main() { log.Fatal(err) } + ilHook, err := infologger.NewDirectHook("ECS", "apricot", nil) + if err == nil { + log.AddHook(ilHook) + } + if err := apricot.Run(); err != nil { log.Fatal(err) } diff --git a/common/logger/infologger/directhook.go b/common/logger/infologger/directhook.go index 456015321..6f78e2473 100644 --- a/common/logger/infologger/directhook.go +++ b/common/logger/infologger/directhook.go @@ -38,6 +38,7 @@ import ( "github.com/AliceO2Group/Control/common/utils" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) const INFOLOGGER_MAX_MESSAGE_SIZE = 1024 @@ -46,8 +47,26 @@ var ( hostname string Pid string username string + + logILInfoLevel = []logrus.Level{ + logrus.PanicLevel, + logrus.FatalLevel, + logrus.ErrorLevel, + logrus.WarnLevel, + logrus.InfoLevel, + } + logILAllLevel = logrus.AllLevels + currentIlLevel = logILInfoLevel ) +func setCurrentILLevelFromViper() { + if viper.GetBool("logAllIL") { + currentIlLevel = logILAllLevel + } else { + currentIlLevel = logILInfoLevel + } +} + var lineBreaksRe = regexp.MustCompile(`\r?\n`) func init() { @@ -140,7 +159,14 @@ func guessSocketPath() string { } } -func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, error) { +func NewDirectHook(defaultSystem string, defaultFacility string, levelsToLog []logrus.Level) (*DirectHook, error) { + + if levelsToLog == nil { + setCurrentILLevelFromViper() + } else { + currentIlLevel = levelsToLog + } + socketPath := guessSocketPath() sender := newSender(socketPath) if sender == nil { @@ -154,8 +180,8 @@ func NewDirectHook(defaultSystem string, defaultFacility string) (*DirectHook, e }, nil } -func NewDirectHookWithRole(defaultSystem string, defaultFacility string, defaultRole string) (*DirectHook, error) { - dh, err := NewDirectHook(defaultSystem, defaultFacility) +func NewDirectHookWithRole(defaultSystem string, defaultFacility string, defaultRole string, levelsToLog []logrus.Level) (*DirectHook, error) { + dh, err := NewDirectHook(defaultSystem, defaultFacility, levelsToLog) if dh != nil { dh.role = defaultRole } @@ -163,16 +189,7 @@ func NewDirectHookWithRole(defaultSystem string, defaultFacility string, default } func (h *DirectHook) Levels() []logrus.Level { - // Everything except Trace - return []logrus.Level{ - logrus.PanicLevel, - logrus.FatalLevel, - logrus.ErrorLevel, - logrus.WarnLevel, - logrus.InfoLevel, - logrus.DebugLevel, - logrus.TraceLevel, - } + return currentIlLevel } func (h *DirectHook) Fire(e *logrus.Entry) error { diff --git a/core/config.go b/core/config.go index 12d7a2b3d..f6418e94d 100644 --- a/core/config.go +++ b/core/config.go @@ -124,6 +124,7 @@ func setDefaults() error { viper.SetDefault("taskClassCacheTTL", 7*24*time.Hour) viper.SetDefault("kafkaEndpoints", []string{"localhost:9092"}) viper.SetDefault("enableKafka", true) + viper.SetDefault("logAllIL", false) return nil } @@ -190,6 +191,7 @@ func setFlags() error { pflag.Duration("taskClassCacheTTL", viper.GetDuration("taskClassCacheTTL"), "TTL for task class cache entries") pflag.StringSlice("kafkaEndpoints", viper.GetStringSlice("kafkaEndpoints"), "List of Kafka endpoints to connect to (default: localhost:9092)") pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") + pflag.Bool("logAllIL", viper.GetBool("logAllIL"), "Send all the logs into IL, including Debug and Trace messages") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) From 7b18e5012da0a931021f4858f717952697e52fdf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 18 Jul 2024 09:35:46 +0200 Subject: [PATCH 1970/2352] [core] Set proto User.externalId to explicit presence --- common/protos/common.pb.go | 33 +++++++++++++++++---------------- common/protos/common.proto | 2 +- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index eccc0da73..8f86d94d5 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -49,7 +49,7 @@ type User struct { unknownFields protoimpl.UnknownFields // The unique CERN identifier of this user. - ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` + ExternalId *int32 `protobuf:"varint,1,opt,name=externalId,proto3,oneof" json:"externalId,omitempty"` // The unique identifier of this entity. Id *int32 `protobuf:"varint,2,opt,name=id,proto3,oneof" json:"id,omitempty"` // Name of the user. @@ -89,8 +89,8 @@ func (*User) Descriptor() ([]byte, []int) { } func (x *User) GetExternalId() int32 { - if x != nil { - return x.ExternalId + if x != nil && x.ExternalId != nil { + return *x.ExternalId } return 0 } @@ -113,19 +113,20 @@ var File_protos_common_proto protoreflect.FileDescriptor var file_protos_common_proto_rawDesc = []byte{ 0x0a, 0x13, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x56, 0x0a, - 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, - 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, - 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, + 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/protos/common.proto b/common/protos/common.proto index 45e2fd992..635c7b71d 100644 --- a/common/protos/common.proto +++ b/common/protos/common.proto @@ -33,7 +33,7 @@ option go_package = "github.com/AliceO2Group/Control/common/protos;pb"; message User { // The unique CERN identifier of this user. - int32 externalId = 1; + optional int32 externalId = 1; // The unique identifier of this entity. optional int32 id = 2; // Name of the user. From 6cfc91ff55777648234f6425a94a5938f244820e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 18 Jul 2024 10:55:23 +0200 Subject: [PATCH 1971/2352] [build] Bump to v1.15.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 67d3ac1d3..9ba69ac7f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 14 +VERSION_MINOR := 15 VERSION_PATCH := 0 From 75999d7fe4012db7e51fc033855dff70eb5bc0c4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 22 Jul 2024 12:22:07 +0200 Subject: [PATCH 1972/2352] [core] Fix missing env ID in a teardown log --- core/server.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/server.go b/core/server.go index 3ff3bd9af..c80659c70 100644 --- a/core/server.go +++ b/core/server.go @@ -695,7 +695,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if env.CurrentState() == "CONFIGURED" { err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_RESET)) if err != nil { - log.Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) + log.WithField("partition", env.Id().String()). + Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) } } From bf6af3b865b71825243339d7a5b36d81f183b37b Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 26 Jul 2024 15:34:55 +0200 Subject: [PATCH 1973/2352] [core] Make StfB/StfS-to-FLP maps local for each request --- core/integration/ddsched/plugin.go | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index e440fa91a..17f16db07 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -63,9 +63,6 @@ type Plugin struct { ddSchedulerHost string ddSchedulerPort int - stfbHostIdMap map[string]string //map[task_id]ib_hostname - stfsHostIdMap map[string]string - ddSchedClient *RpcClient } @@ -83,8 +80,6 @@ func NewPlugin(endpoint string) integration.Plugin { return &Plugin{ ddSchedulerHost: u.Hostname(), ddSchedulerPort: portNumber, - stfbHostIdMap: nil, - stfsHostIdMap: nil, ddSchedClient: nil, } } @@ -242,8 +237,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } root := workflow.GetRoot(parentRole) - p.stfbHostIdMap = make(map[string]string) - p.stfsHostIdMap = make(map[string]string) + stfbHostIdMap := make(map[string]string) + stfsHostIdMap := make(map[string]string) workflow.LeafWalk(root, func(role workflow.Role) { roleVS, err := role.ConsolidatedVarStack() @@ -262,9 +257,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ddDiscoveryStfsId, ddDiscoveryStfsIdOk = roleVS["dd_discovery_stfs_id"] if ddDiscoveryIbHostnameOk { if ddDiscoveryStfsIdOk { - p.stfsHostIdMap[ddDiscoveryStfsId] = ddDiscoveryIbHostname + stfsHostIdMap[ddDiscoveryStfsId] = ddDiscoveryIbHostname } else if ddDiscoveryStfbIdOk { - p.stfbHostIdMap[ddDiscoveryStfbId] = ddDiscoveryIbHostname + stfbHostIdMap[ddDiscoveryStfbId] = ddDiscoveryIbHostname } else { return } @@ -288,8 +283,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { EnvironmentId: envId, PartitionId: envId, }, - StfbHostIdMap: p.stfbHostIdMap, - StfsHostIdMap: p.stfsHostIdMap, + StfbHostIdMap: stfbHostIdMap, + StfsHostIdMap: stfsHostIdMap, PartitionParams: partitionParams, } From 48ea72a3a9407ee0bdc7b3ba8598191d7d65e7c3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 30 Jul 2024 15:29:49 +0200 Subject: [PATCH 1974/2352] [core] OCTRL-911 Transitions should not be performed concurrently --- core/environment/environment.go | 24 +++++++++++++++++++----- core/environment/manager.go | 7 +++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index d6764520a..d3290b88b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -63,6 +63,7 @@ var log = logger.New(logrus.StandardLogger(), "env") type Environment struct { Mu sync.RWMutex once sync.Once + transitionMutex sync.RWMutex Sm *fsm.FSM name string id uid.ID @@ -955,6 +956,13 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map } func (env *Environment) TryTransition(t Transition) (err error) { + if !env.transitionMutex.TryLock() { + log.WithField("partition", env.id.String()). + Warnf("environment transition attempt delayed: transition '%s' in progress. waiting for completion or failure", env.currentTransition) + env.transitionMutex.Lock() + } + defer env.transitionMutex.Unlock() + the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ EnvironmentId: env.id.String(), State: env.Sm.Current(), @@ -1171,11 +1179,17 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { Warn("one of the critical tasks went into ERROR state, transitioning the environment into ERROR") err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { - log.WithField("partition", env.id). - WithError(err). - WithField("level", infologger.IL_Devel). - Warn("could not transition gently to ERROR, forcing it") - env.setState(wfState.String()) + if env.Sm.Current() == "ERROR" { + log.WithField("partition", env.id). + WithField("level", infologger.IL_Devel). + Info("skipped requested transition to ERROR: environment already in ERROR state") + } else { + log.WithField("partition", env.id). + WithError(err). + WithField("level", infologger.IL_Devel). + Warn("could not transition gently to ERROR, forcing it") + env.setState(wfState.String()) + } } toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { t.SetSafeToStop(true) diff --git a/core/environment/manager.go b/core/environment/manager.go index 8640864db..42b139d51 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -582,6 +582,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } + if !env.transitionMutex.TryLock() { + log.WithField("partition", environmentId.String()). + Warnf("environment teardown attempt delayed: transition '%s' in progress. waiting for completion or failure", env.currentTransition) + env.transitionMutex.Lock() + } + defer env.transitionMutex.Unlock() + if env.CurrentState() != "STANDBY" && env.CurrentState() != "DEPLOYED" && !force { return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } From 025a3ed3a643f2485da7a6696ec3de734178e6fe Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 31 Jul 2024 14:15:38 +0200 Subject: [PATCH 1975/2352] [core] OCTRL-911 do not teardown an environment in DONE This is a fix to avoid running a second teardown attempt after a successful one. This could have happened if the 2nd teardown request was received while the 1st teardown attempt would be still ongoing. In principle https://github.com/AliceO2Group/Control/pull/600 was already enough to avoid concurrency issues and I could not make the core misbehave with it, but this commit attempts to make the behaviour somewhat more correct. I hesitated to set the state as DONE if TeardownEnvironment returns earlier with an error, since this does not remove given environment from the list of enviroments, thus technically it is still available for more teardown attempts. On another hand, this contradicts the already published kafka events, which advertize the env state as DONE even when it ends with error and the state is not set anyway. --- core/environment/manager.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 42b139d51..fa537e46d 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -589,6 +589,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } defer env.transitionMutex.Unlock() + if env.CurrentState() == "DONE" { + return errors.New("attempting to teardown an environment which is already in DONE, doing nothing") + } if env.CurrentState() != "STANDBY" && env.CurrentState() != "DEPLOYED" && !force { return errors.New(fmt.Sprintf("cannot teardown environment in state %s", env.CurrentState())) } @@ -851,6 +854,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } + env.setState("DONE") env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Message: "teardown complete", State: "DONE"}) log.WithField("method", "TeardownEnvironment"). From e1014168bfc83d8e267e3e6f20c9b58cebac63e0 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 1 Aug 2024 12:23:07 +0200 Subject: [PATCH 1976/2352] [build] Bump to v1.16.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 9ba69ac7f..8d7be7416 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 15 +VERSION_MINOR := 16 VERSION_PATCH := 0 From 865db660fee55a155b1b37115382581fd419388a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 2 Aug 2024 10:58:28 +0200 Subject: [PATCH 1977/2352] [core] OCTRL-912 Cancel calls pending await upon environment destruction This addressed the problem of having stuck calls waiting for something to receive from c.await which outlive the parent environments. This may happen if awaited trigger never occurs after it has been started, e.g. if trigger is before_START_ACTIVITY and await is after_START_ACTIVITY, but the environments fails to transition to RUNNING. --- core/environment/environment.go | 1 + core/environment/hooks_test.go | 32 ++++++++++++++++++++++++++++++++ core/environment/manager.go | 18 ++++++++++++++++++ core/workflow/callable/call.go | 21 +++++++++++++++++++-- 4 files changed, 70 insertions(+), 2 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index d3290b88b..1362bc999 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -706,6 +706,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weig // respected. callErrors = pendingCalls.AwaitAll() + delete(env.callsPendingAwait[trigger], weight) } } diff --git a/core/environment/hooks_test.go b/core/environment/hooks_test.go index 5fab31e8a..b4d70131e 100644 --- a/core/environment/hooks_test.go +++ b/core/environment/hooks_test.go @@ -6,6 +6,7 @@ import ( "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/workflow" + "github.com/AliceO2Group/Control/core/workflow/callable" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -459,4 +460,35 @@ var _ = Describe("calling hooks on FSM events", func() { Expect(ok).To(BeTrue()) Expect(v).To(Equal("root.call1,root.call2,root.call3")) }) + + It("should allow to cancel hooks in case that await trigger never happens", func() { + env.workflow = workflow.NewAggregatorRole("root", []workflow.Role{ + workflow.NewCallRole( + "call1", // this call should return immediately and should not be accessible later + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "before_CONFIGURE"}, + "testplugin.Test()", + ""), + workflow.NewCallRole( + "call2", // this call should not return, but should be cancelled later + task.Traits{Trigger: "before_CONFIGURE", Timeout: "5s", Critical: true, Await: "after_CONFIGURE"}, + "testplugin.Test()", + "")}) + workflow.LinkChildrenToParents(env.workflow) + env.Sm.SetState("DEPLOYED") + + err := env.Sm.Event(context.Background(), "CONFIGURE", NewDummyTransition("CONFIGURE", true)) + Expect(err).To(HaveOccurred()) + + callMapForAwait := env.callsPendingAwait + Expect(callMapForAwait).To(HaveKey("after_CONFIGURE")) + callsForWeight := callMapForAwait["after_CONFIGURE"] + Expect(callsForWeight).To(HaveKey(callable.HookWeight(0))) + calls := callsForWeight[0] + Expect(calls).To(HaveLen(1)) + Expect(calls[0]).NotTo(BeNil()) + // the first cancel attempt should return "true" to say it was successful + Expect(calls[0].Cancel()).To(BeTrue()) + // the subsequent cancel attempts should return "false", because the call was already cancelled + Expect(calls[0].Cancel()).To(BeFalse()) + }) }) diff --git a/core/environment/manager.go b/core/environment/manager.go index fa537e46d..7d3fc7b3f 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -811,6 +811,8 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } } + envs.cancelCallsPendingAwait(env) + // we remake the pending teardown channel too, because each completed TasksReleasedEvent // automatically closes it pendingCh = make(chan *event.TasksReleasedEvent) @@ -880,6 +882,22 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error return err } +func (envs *Manager) cancelCallsPendingAwait(env *Environment) { + // unblock all calls which are stuck waiting for an await trigger which never happened + if env == nil { + return + } + for _, callMapForAwait := range env.callsPendingAwait { + for _, callsForWeight := range callMapForAwait { + for _, call := range callsForWeight { + if call != nil { + call.Cancel() + } + } + } + } +} + /*func (envs *Manager) Configuration(environmentId uuid.UUID) EnvironmentCfg { envs.mu.RLock() defer envs.mu.RUnlock() diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 35971cca5..7b1282da2 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -25,6 +25,7 @@ package callable import ( + "context" "errors" "fmt" "strconv" @@ -54,7 +55,8 @@ type Call struct { Traits task.Traits parentRole ParentRole - await chan error + await chan error + awaitCancel context.CancelFunc } type Calls []*Call @@ -220,11 +222,17 @@ func (c *Call) Call() error { func (c *Call) Start() { c.await = make(chan error) + ctx, cancel := context.WithCancel(context.Background()) + c.awaitCancel = cancel go func() { callId := fmt.Sprintf("hook:%s:%s", c.GetTraits().Trigger, c.GetName()) log.Debugf("%s started", callId) defer utils.TimeTrack(time.Now(), callId, log.WithPrefix("callable")) - c.await <- c.Call() + select { + case c.await <- c.Call(): + case <-ctx.Done(): + log.Debugf("%s cancelled", callId) + } close(c.await) }() } @@ -234,6 +242,15 @@ func (c *Call) Await() error { return <-c.await } +func (c *Call) Cancel() bool { + if c.awaitCancel != nil { + c.awaitCancel() + c.awaitCancel = nil + return true + } + return false +} + func (c *Call) GetParentRole() interface{} { return c.parentRole } From 3477ab0231199a1d6c93de268bda109188036ae3 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 20 Aug 2024 12:59:18 +0200 Subject: [PATCH 1978/2352] [build] Bump to v1.16.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8d7be7416..46ca65c03 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 16 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From e9913549ee9a2815b5bf73a2ebfa71e957e57508 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac <126364+teo@users.noreply.github.com> Date: Mon, 26 Aug 2024 14:15:30 +0200 Subject: [PATCH 1979/2352] Update documentation index --- mkdocs.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 61383c35b..edcf58f51 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -5,14 +5,16 @@ nav: - Introduction: handbook/index.md - Overview: handbook/overview.md - Basic Concepts: handbook/concepts.md + - Environment Operation Order: handbook/operation_order.md - Configuration: - Workflow Configuration: handbook/configuration.md - Apricot Usage: './apricot/docs/apricot.md' - Apricot HTTP API: './apricot/docs/apricot_http_service.md' - - gRPC APIs: + - Interfaces: - AliECS gRPC API: apidocs_aliecs.md - Apricot gRPC API: apidocs_apricot.md - OCC gRPC API (Protobuf based): apidocs_occ.md + - Kafka: kafka.md - Workflow Variables: '../controlworkflows/README.md' - 'Command Reference': - coconut: From 1efc69105bfd36edcc26b944b9546788de4547a2 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Aug 2024 15:03:44 +0200 Subject: [PATCH 1980/2352] [common] Upgrade hierarchical KV store to Go generics + unit tests --- common/gera/map.go | 196 ++++++++++--- common/gera/map_test.go | 589 +++++++++++++++++++++++++++++++++++++++ common/gera/stringmap.go | 28 +- go.mod | 2 +- go.sum | 2 + 5 files changed, 763 insertions(+), 54 deletions(-) create mode 100644 common/gera/map_test.go diff --git a/common/gera/map.go b/common/gera/map.go index c3ecfaf3c..1d07903b8 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2020 CERN and copyright holders of ALICE O². + * Copyright 2020-2024 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -29,44 +29,65 @@ package gera import ( + "sync" + "dario.cat/mergo" ) -type Map interface { - Wrap(m Map) Map +type Map[K comparable, V any] interface { + Wrap(m Map[K, V]) Map[K, V] IsHierarchyRoot() bool - HierarchyContains(m Map) bool - Unwrap() Map + HierarchyContains(m Map[K, V]) bool + Unwrap() Map[K, V] - Has(key string) bool + Has(key K) bool Len() int - Get(key string) (interface{}, bool) - Set(key string, value interface{}) bool + Get(key K) (V, bool) + Set(key K, value V) bool + Del(key K) bool - Flattened() (map[string]interface{}, error) - WrappedAndFlattened(m Map) (map[string]interface{}, error) + Flattened() (map[K]V, error) + FlattenedParent() (map[K]V, error) + WrappedAndFlattened(m Map[K, V]) (map[K]V, error) - Raw() map[string]interface{} + Raw() map[K]V + Copy() Map[K, V] + RawCopy() map[K]V } -func MakeMap() Map { - return &WrapMap{ - theMap: make(map[string]interface{}), +func MakeMap[K comparable, V any]() *WrapMap[K, V] { + return &WrapMap[K, V]{ + theMap: make(map[K]V), parent: nil, } } -func MakeMapWithMap(fromMap map[string]interface{}) Map { - myMap := &WrapMap{ +func MakeMapWithMap[K comparable, V any](fromMap map[K]V) *WrapMap[K, V] { + myMap := &WrapMap[K, V]{ theMap: fromMap, parent: nil, } return myMap } -func MakeMapWithMapCopy(fromMap map[string]interface{}) Map { - newBackingMap := make(map[string]interface{}) +func FlattenStack[K comparable, V any](maps ...Map[K, V]) (flattened map[K]V, err error) { + flattenedMap := MakeMap[K, V]() + for _, oneMap := range maps { + var localFlattened map[K]V + localFlattened, err = oneMap.Flattened() + if err != nil { + return + } + flattenedMap = MakeMapWithMap(localFlattened).Wrap(flattenedMap).(*WrapMap[K, V]) + } + + flattened, err = flattenedMap.Flattened() + return +} + +func MakeMapWithMapCopy[K comparable, V any](fromMap map[K]V) *WrapMap[K, V] { + newBackingMap := make(map[K]V) for k, v := range fromMap { newBackingMap[k] = v } @@ -74,16 +95,35 @@ func MakeMapWithMapCopy(fromMap map[string]interface{}) Map { return MakeMapWithMap(newBackingMap) } -type WrapMap struct { - theMap map[string]interface{} - parent Map +type WrapMap[K comparable, V any] struct { + theMap map[K]V + parent Map[K, V] + + unmarshalYAML func(w Map[K, V], unmarshal func(interface{}) error) error + marshalYAML func(w Map[K, V]) (interface{}, error) + + mu sync.RWMutex +} + +func (w *WrapMap[K, V]) WithUnmarshalYAML(unmarshalYAML func(w Map[K, V], unmarshal func(interface{}) error) error) *WrapMap[K, V] { + w.unmarshalYAML = unmarshalYAML + return w +} + +func (w *WrapMap[K, V]) WithMarshalYAML(marshalYAML func(w Map[K, V]) (interface{}, error)) *WrapMap[K, V] { + w.marshalYAML = marshalYAML + return w } -func (w *WrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { - m := make(map[string]interface{}) +func (w *WrapMap[K, V]) UnmarshalYAML(unmarshal func(interface{}) error) error { + if w.unmarshalYAML != nil { + return w.unmarshalYAML(w, unmarshal) + } + + m := make(map[K]V) err := unmarshal(&m) if err == nil { - *w = WrapMap{ + *w = WrapMap[K, V]{ theMap: m, parent: nil, } @@ -91,17 +131,28 @@ func (w *WrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { return err } -func (w *WrapMap) IsHierarchyRoot() bool { +func (w *WrapMap[K, V]) MarshalYAML() (interface{}, error) { + if w.marshalYAML != nil { + return w.marshalYAML(w) + } + + return w.theMap, nil +} + +func (w *WrapMap[K, V]) IsHierarchyRoot() bool { if w == nil || w.parent != nil { return false } return true } -func (w *WrapMap) HierarchyContains(m Map) bool { +func (w *WrapMap[K, V]) HierarchyContains(m Map[K, V]) bool { if w == nil || w.parent == nil { return false } + if w == m { + return true + } if w.parent == m { return true } @@ -110,7 +161,7 @@ func (w *WrapMap) HierarchyContains(m Map) bool { // Wraps this map around the gera.Map m, which becomes the new parent. // Returns a pointer to the composite map (i.e. to itself in its new state). -func (w *WrapMap) Wrap(m Map) Map { +func (w *WrapMap[K, V]) Wrap(m Map[K, V]) Map[K, V] { if w == nil { return nil } @@ -120,7 +171,7 @@ func (w *WrapMap) Wrap(m Map) Map { // Unwraps this map from its parent. // Returns a pointer to the former parent which was just unwrapped. -func (w *WrapMap) Unwrap() Map { +func (w *WrapMap[K, V]) Unwrap() Map[K, V] { if w == nil { return nil } @@ -129,33 +180,55 @@ func (w *WrapMap) Unwrap() Map { return p } -func (w *WrapMap) Get(key string) (value interface{}, ok bool) { +func (w *WrapMap[K, V]) Get(key K) (value V, ok bool) { if w == nil || w.theMap == nil { - return nil, false + return value, false } + + w.mu.RLock() + defer w.mu.RUnlock() + if val, ok := w.theMap[key]; ok { return val, true } if w.parent != nil { return w.parent.Get(key) } - return nil, false + return value, false } -func (w *WrapMap) Set(key string, value interface{}) (ok bool) { +func (w *WrapMap[K, V]) Set(key K, value V) (ok bool) { if w == nil || w.theMap == nil { return false } + + w.mu.Lock() + defer w.mu.Unlock() + w.theMap[key] = value return true } -func (w *WrapMap) Has(key string) bool { +func (w *WrapMap[K, V]) Del(key K) (ok bool) { + if w == nil || w.theMap == nil { + return false + } + + w.mu.Lock() + defer w.mu.Unlock() + + if _, exists := w.theMap[key]; exists { + delete(w.theMap, key) + } + return true +} + +func (w *WrapMap[K, V]) Has(key K) bool { _, ok := w.Get(key) return ok } -func (w *WrapMap) Len() int { +func (w *WrapMap[K, V]) Len() int { if w == nil || w.theMap == nil { return 0 } @@ -166,12 +239,15 @@ func (w *WrapMap) Len() int { return len(flattened) } -func (w *WrapMap) Flattened() (map[string]interface{}, error) { +func (w *WrapMap[K, V]) Flattened() (map[K]V, error) { if w == nil { return nil, nil } - out := make(map[string]interface{}) + w.mu.RLock() + defer w.mu.RUnlock() + + out := make(map[K]V) for k, v := range w.theMap { out[k] = v } @@ -188,15 +264,32 @@ func (w *WrapMap) Flattened() (map[string]interface{}, error) { return out, err } -func (w *WrapMap) WrappedAndFlattened(m Map) (map[string]interface{}, error) { +func (w *WrapMap[K, V]) FlattenedParent() (map[K]V, error) { + if w == nil { + return nil, nil + } + + if w.parent == nil { + return make(map[K]V), nil + } + + return w.parent.Flattened() +} + +func (w *WrapMap[K, V]) WrappedAndFlattened(m Map[K, V]) (map[K]V, error) { if w == nil { return nil, nil } - out := make(map[string]interface{}) + w.mu.RLock() + + out := make(map[K]V) for k, v := range w.theMap { out[k] = v } + + w.mu.RUnlock() + if m == nil { return out, nil } @@ -210,9 +303,34 @@ func (w *WrapMap) WrappedAndFlattened(m Map) (map[string]interface{}, error) { return out, err } -func (w *WrapMap) Raw() map[string]interface{} { +func (w *WrapMap[K, V]) Raw() map[K]V { // allows unmutexed access to map, can be unsafe! if w == nil { return nil } return w.theMap } + +func (w *WrapMap[K, V]) Copy() Map[K, V] { + if w == nil { + return nil + } + + w.mu.RLock() + defer w.mu.RUnlock() + + newMap := &WrapMap[K, V]{ + theMap: make(map[K]V, len(w.theMap)), + parent: w.parent, + } + for k, v := range w.theMap { + newMap.theMap[k] = v + } + return newMap +} + +func (w *WrapMap[K, V]) RawCopy() map[K]V { // always safe + if w == nil { + return nil + } + return w.Copy().Raw() +} diff --git a/common/gera/map_test.go b/common/gera/map_test.go new file mode 100644 index 000000000..9c14e2478 --- /dev/null +++ b/common/gera/map_test.go @@ -0,0 +1,589 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020-2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package gera + +import ( + "maps" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "gopkg.in/yaml.v3" +) + +var _ = Describe("hierarchical key-value store", func() { + const ( + testPayloadDefaultsYAML1 = ` +############################### +# General Configuration Panel +############################### +dcs_enabled: !public + value: "false" + type: bool + label: "DCS" + description: "Enable/disable DCS SOR/EOR commands" + widget: checkBox + panel: General_Configuration + index: 0 +dd_enabled: !public + value: "true" + type: bool + label: "Data Distribution (FLP)" + description: "Enable/disable Data Distribution components running on FLPs (StfBuilder and StfSender)" + widget: checkBox + panel: General_Configuration + index: 1 +pdp_workflow_parameters: !public + value: "QC,CALIB,GPU,CTF,EVENT_DISPLAY" + type: string + label: "Workflow parameters" + description: "Comma-separated list of workflow parameters. Valid parameters are: QC,CALIB,GPU,CTF,EVENT_DISPLAY." + widget: editBox + panel: "EPNs_Workflows" + index: 603 +user: flp +extra_env_vars: "" +` + testPayloadVarsYAML1 = ` +auto_stop_enabled: "{{ auto_stop_timeout != 'none' }}" +ddsched_enabled: "{{ epn_enabled == 'true' && dd_enabled == 'true' }}" +odc_enabled: "{{ epn_enabled }}" +odc_topology_fullname: '{{ epn_enabled == "true" ? odc.GenerateEPNTopologyFullname() : "" }}' +` + testPayloadUserVarsYAML1 = ` +ccdb_enabled: "true" +ccdb_host: "" +dd_enabled: "false" +pdp_workflow_parameters: "" +` + testPayloadDefaultsYAML2 = ` +detector: "" +dpl_workflow: "{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}" +dpl_command: "{{ util.PrefixedOverride( 'dpl_command', 'ctp' ) }}" +stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" +it: "{{ ctp_readout_host }}" +user: "epn" +` + testPayloadVarsYAML2 = ` +detector: "{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}" +# dpl_workflow is set to ctp_dpl_workflow +dpl_workflow: "{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}" +dpl_command: "" +stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" +` + ) + + var ( + stringMap *WrapMap[string, string] + err error + ) + + customUnmarshalYAML := func(w Map[string, string], unmarshal func(interface{}) error) error { + nodes := make(map[string]yaml.Node) + err := unmarshal(&nodes) + if err == nil { + m := make(map[string]string) + for k, v := range nodes { + if v.Kind == yaml.ScalarNode { + m[k] = v.Value + } else if v.Kind == yaml.MappingNode && v.Tag == "!public" { + type auxType struct { + Value string + } + var aux auxType + err = v.Decode(&aux) + if err != nil { + continue + } + m[k] = aux.Value + } + } + + wPtr := w.(*WrapMap[string, string]) + *wPtr = WrapMap[string, string]{ + theMap: m, + parent: nil, + } + } else { + wPtr := w.(*WrapMap[string, string]) + *wPtr = WrapMap[string, string]{ + theMap: make(map[string]string), + parent: nil, + } + } + return err + } + + stringMap = MakeMap[string, string]() + + When("unmarshaling a YAML document into an empty Map", func() { + BeforeEach(func() { + stringMap = MakeMap[string, string]() + Expect(stringMap).NotTo(BeNil()) + }) + It("should unmarshal correctly with the default unmarshaler if the YAML document is a flat key-value map", func() { + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(stringMap).NotTo(BeNil()) + value, ok := stringMap.Get("odc_enabled") + Expect(value).To(BeEmpty()) + Expect(ok).NotTo(BeTrue()) + value, ok = stringMap.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + value, ok = stringMap.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + }) + It("should fail to unmarshal with the default unmarshaler if the YAML document is a tree with YAML tags", func() { + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML1), stringMap) + Expect(err).To(HaveOccurred()) + }) + It("should unmarshal correctly with a custom unmarshaler if the YAML document is a flat key-value map", func() { + stringMap = stringMap.WithUnmarshalYAML(customUnmarshalYAML) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(stringMap).NotTo(BeNil()) + value, ok := stringMap.Get("odc_enabled") + Expect(value).To(BeEmpty()) + Expect(ok).NotTo(BeTrue()) + value, ok = stringMap.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + value, ok = stringMap.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + }) + It("should unmarshal correctly with a custom unmarshaler if the YAML document is a tree with YAML tags", func() { + stringMap = stringMap.WithUnmarshalYAML(customUnmarshalYAML) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML1), stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(stringMap).NotTo(BeNil()) + value, ok := stringMap.Get("odc_enabled") + Expect(value).To(BeEmpty()) + Expect(ok).NotTo(BeTrue()) + value, ok = stringMap.Get("dcs_enabled") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("false")) + value, ok = stringMap.Get("dd_enabled") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("true")) + }) + }) + When("marshaling into a YAML document from a Map", func() { + BeforeEach(func() { + stringMap = MakeMap[string, string]() + Expect(stringMap).NotTo(BeNil()) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(stringMap).NotTo(BeNil()) + }) + + It("should marshal correctly", func() { + marshaledYAML, err := yaml.Marshal(stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(marshaledYAML).NotTo(BeEmpty()) + + reUnmarshaledMap := make(map[string]string) + err = yaml.Unmarshal(marshaledYAML, &reUnmarshaledMap) + Expect(err).NotTo(HaveOccurred()) + Expect(reUnmarshaledMap).NotTo(BeEmpty()) + + unmarshaledTestPayloadDefaultsYAML2 := make(map[string]string) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), &unmarshaledTestPayloadDefaultsYAML2) + Expect(err).NotTo(HaveOccurred()) + Expect(unmarshaledTestPayloadDefaultsYAML2).NotTo(BeEmpty()) + Expect(maps.Equal(reUnmarshaledMap, unmarshaledTestPayloadDefaultsYAML2)).To(BeTrue()) + }) + }) + When("accessing the structure's underlying map", func() { + BeforeEach(func() { + stringMap = MakeMap[string, string]() + Expect(stringMap).NotTo(BeNil()) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), stringMap) + Expect(err).NotTo(HaveOccurred()) + Expect(stringMap).NotTo(BeNil()) + }) + + It("should correctly return a reference to the raw map", func() { + rawMap := stringMap.Raw() + Expect(rawMap).NotTo(BeNil()) + Expect(len(rawMap)).To(Equal(6)) + value, ok := rawMap["odc_enabled"] + Expect(ok).NotTo(BeTrue()) + value, ok = rawMap["detector"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + value, ok = rawMap["dpl_workflow"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + value2, ok := stringMap.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value2).To(Equal(value)) + rawMap["detector"] = "test" + value, ok = stringMap.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("test")) + }) + + It("should correctly return a copy of the whole structure", func() { + copy := stringMap.Copy() + Expect(copy).NotTo(BeNil()) + Expect(copy == stringMap).NotTo(BeTrue()) + Expect(copy).To(Equal(stringMap)) + Expect(copy.Raw()).To(Equal(stringMap.Raw())) + Expect(copy.Len()).To(Equal(stringMap.Len())) + copy.Set("detector", "test") + Expect(copy).NotTo(Equal(stringMap)) + Expect(copy.Raw()).NotTo(Equal(stringMap.Raw())) + Expect(copy.Len()).To(Equal(stringMap.Len())) + copy.Set("detector2", "test2") + Expect(copy.Len()).To(Equal(stringMap.Len() + 1)) + }) + + It("should correctly return a copy of the underlying map", func() { + rawCopy := stringMap.RawCopy() + Expect(rawCopy).NotTo(BeNil()) + Expect(len(rawCopy)).To(Equal(6)) + rawCopy["detector"] = "test" + value, ok := stringMap.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + }) + }) + When("wrapping and unwrapping maps", func() { + + defaults1 := MakeMap[string, string]() + Expect(defaults1).NotTo(BeNil()) + + defaults1 = defaults1.WithUnmarshalYAML(customUnmarshalYAML) + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML1), defaults1) + Expect(err).NotTo(HaveOccurred()) + Expect(defaults1).NotTo(BeNil()) + + defaults2 := MakeMap[string, string]() + Expect(defaults2).NotTo(BeNil()) + + err = yaml.Unmarshal([]byte(testPayloadDefaultsYAML2), defaults2) + Expect(err).NotTo(HaveOccurred()) + Expect(defaults2).NotTo(BeNil()) + + vars1 := MakeMap[string, string]() + Expect(vars1).NotTo(BeNil()) + + err = yaml.Unmarshal([]byte(testPayloadVarsYAML1), vars1) + Expect(err).NotTo(HaveOccurred()) + Expect(vars1).NotTo(BeNil()) + + vars2 := MakeMap[string, string]() + Expect(vars2).NotTo(BeNil()) + + err = yaml.Unmarshal([]byte(testPayloadVarsYAML2), vars2) + Expect(err).NotTo(HaveOccurred()) + Expect(vars2).NotTo(BeNil()) + + userVars1 := MakeMap[string, string]() + Expect(userVars1).NotTo(BeNil()) + + err = yaml.Unmarshal([]byte(testPayloadUserVarsYAML1), userVars1) + Expect(err).NotTo(HaveOccurred()) + Expect(userVars1).NotTo(BeNil()) + + var wrappedDefaults, wrappedVars, wrappedUserVars, wrappedAll Map[string, string] + + It("should wrap correctly", func() { + wrappedDefaults = defaults2.Wrap(defaults1) + Expect(wrappedDefaults).NotTo(BeNil()) + Expect(wrappedDefaults).To(Equal(defaults2)) + + wrappedVars = vars2.Wrap(vars1) + Expect(wrappedVars).NotTo(BeNil()) + Expect(wrappedVars).To(Equal(vars2)) + + wrappedUserVars = userVars1 + }) + + It("should unwrap correctly", func() { + unwrapped := vars2.Unwrap() + Expect(unwrapped).NotTo(BeNil()) + Expect(unwrapped).To(Equal(vars1)) + + rewrapped := vars2.Wrap(vars1) + Expect(rewrapped).NotTo(BeNil()) + }) + + var flattenedDefaults, flattenedVars, flattenedUserVars, flattenedAll map[string]string + + It("should flatten correctly", func() { + flattenedDefaults, err = wrappedDefaults.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedVars, err = wrappedVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedUserVars, err = wrappedUserVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + }) + + It("should wrap correctly from previously flattened maps", func() { + wrappedAll = MakeMapWithMap(flattenedUserVars).Wrap(MakeMapWithMap(flattenedVars).Wrap(MakeMapWithMap(flattenedDefaults))) + Expect(wrappedAll).NotTo(BeNil()) + flattenedAll, err = wrappedAll.Flattened() + Expect(err).NotTo(HaveOccurred()) + }) + + It("should flatten stack correctly", func() { + flattenedStack, err := FlattenStack(wrappedDefaults, wrappedVars, wrappedUserVars) + Expect(err).NotTo(HaveOccurred()) + Expect(flattenedAll).To(Equal(flattenedStack)) + }) + + It("should flatten parent correctly", func() { + flattenedParent, err := wrappedAll.FlattenedParent() + Expect(err).NotTo(HaveOccurred()) + + wrappedParents := MakeMapWithMap(flattenedVars).Wrap(MakeMapWithMap(flattenedDefaults)) + flattenedWrappedParents, err := wrappedParents.Flattened() + Expect(flattenedParent).To(Equal(flattenedWrappedParents)) + }) + + It("should wrap and flatten correctly", func() { + flattenedParent, err := wrappedAll.FlattenedParent() + Expect(err).NotTo(HaveOccurred()) + + wrappedAndFlattenedParents, err := MakeMapWithMap(flattenedVars).WrappedAndFlattened(MakeMapWithMap(flattenedDefaults)) + Expect(err).NotTo(HaveOccurred()) + + Expect(wrappedAndFlattenedParents).To(Equal(flattenedParent)) + }) + + It("should correctly look into its hierarchy", func() { + ok := wrappedDefaults.HierarchyContains(defaults1) + Expect(ok).To(BeTrue()) + + ok = wrappedDefaults.HierarchyContains(defaults2) + Expect(ok).To(BeTrue()) + + ok = wrappedDefaults.HierarchyContains(vars1) + Expect(ok).NotTo(BeTrue()) + + ok = wrappedDefaults.IsHierarchyRoot() + Expect(ok).To(BeFalse()) + + ok = defaults2.IsHierarchyRoot() + Expect(ok).To(BeFalse()) + + ok = defaults1.IsHierarchyRoot() + Expect(ok).To(BeTrue()) + + ok = userVars1.IsHierarchyRoot() + Expect(ok).To(BeTrue()) + }) + + It("should correctly perform KV Has operation", func() { + // Has + Expect(wrappedAll.Has("odc_enabled")).To(BeTrue()) + Expect(wrappedAll.Has("ccdb_host")).To(BeTrue()) + Expect(wrappedAll.Has("detector")).To(BeTrue()) + Expect(wrappedAll.Has("it")).To(BeTrue()) + Expect(wrappedAll.Has("pdp_workflow_parameters")).To(BeTrue()) + Expect(wrappedAll.Has("invalid_key")).To(BeFalse()) + Expect(wrappedAll.Has("")).To(BeFalse()) + }) + + It("should correctly perform KV Len operation", func() { + Expect(defaults1.Len()).To(Equal(5)) + Expect(len(defaults2.Raw())).To(Equal(6)) + Expect(defaults2.Len()).To(Equal(10)) + Expect(wrappedVars.Len()).To(Equal(8)) + Expect(wrappedAll.Len()).To(Equal(16)) + }) + + It("should correctly perform KV Get operations", func() { + // Get + value, ok := wrappedAll.Get("odc_enabled") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ epn_enabled }}")) + + value, ok = wrappedAll.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}")) + + value, ok = wrappedAll.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + + value, ok = wrappedAll.Get("ccdb_enabled") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("true")) + + value, ok = wrappedAll.Get("ccdb_host") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + + value, ok = defaults1.Get("it") + Expect(ok).To(BeFalse()) + Expect(value).To(BeEmpty()) + + value, ok = defaults1.Get("pdp_workflow_parameters") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("QC,CALIB,GPU,CTF,EVENT_DISPLAY")) + + value, ok = wrappedAll.Get("pdp_workflow_parameters") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + }) + + It("should correctly perform KV Set operations", func() { + // Set + ok := userVars1.Set("detector", "") + Expect(ok).To(BeTrue()) + + ok = userVars1.Set("dpl_workflow", "someValue") + Expect(ok).To(BeTrue()) + + ok = defaults2.Set("user", "someone") + Expect(ok).To(BeTrue()) + + ok = defaults2.Set("dpl_command", "someCommand") + Expect(ok).To(BeTrue()) + + // We need to reflatten after setting new values + flattenedDefaults, err = wrappedDefaults.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedVars, err = wrappedVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedUserVars, err = wrappedUserVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + + wrappedAll = MakeMapWithMap(flattenedUserVars).Wrap(MakeMapWithMap(flattenedVars).Wrap(MakeMapWithMap(flattenedDefaults))) + + value, ok := wrappedAll.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(BeEmpty()) + + value, ok = wrappedAll.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("someValue")) + + value, ok = wrappedAll.Get("user") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("someone")) + + value, ok = wrappedAll.Get("dpl_command") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + + flattenedStack, err := FlattenStack(wrappedDefaults, wrappedVars, wrappedUserVars) + Expect(err).NotTo(HaveOccurred()) + + // ouch!!! this is a bug in the original code + value, ok = flattenedStack["detector"] + Expect(ok).To(BeTrue()) + Expect(value).To(BeEmpty()) + + value, ok = flattenedStack["dpl_workflow"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("someValue")) + + value, ok = flattenedStack["user"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("someone")) + + value, ok = flattenedStack["dpl_command"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + }) + + It("should correctly perform KV Del operations", func() { + // Del + ok := userVars1.Del("detector") + Expect(ok).To(BeTrue()) + + ok = userVars1.Del("dpl_workflow") + Expect(ok).To(BeTrue()) + + ok = defaults2.Del("user") + Expect(ok).To(BeTrue()) + + ok = defaults2.Del("dpl_command") + Expect(ok).To(BeTrue()) + + // We need to reflatten after deleting values + flattenedDefaults, err = wrappedDefaults.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedVars, err = wrappedVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + + flattenedUserVars, err = wrappedUserVars.Flattened() + Expect(err).NotTo(HaveOccurred()) + + wrappedAll = MakeMapWithMap(flattenedUserVars).Wrap(MakeMapWithMap(flattenedVars).Wrap(MakeMapWithMap(flattenedDefaults))) + + value, ok := wrappedAll.Get("detector") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}")) + + value, ok = wrappedAll.Get("dpl_workflow") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + + value, ok = wrappedAll.Get("user") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("flp")) + + value, ok = wrappedAll.Get("dpl_command") + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + + flattenedStack, err := FlattenStack(wrappedDefaults, wrappedVars, wrappedUserVars) + Expect(err).NotTo(HaveOccurred()) + + value, ok = flattenedStack["detector"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}")) + + value, ok = flattenedStack["dpl_workflow"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + + value, ok = flattenedStack["user"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("flp")) + + value, ok = flattenedStack["dpl_command"] + Expect(ok).To(BeTrue()) + Expect(value).To(Equal("")) + }) + }) +}) + +func TestMap(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Hierarchical Map Test Suite") +} diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go index 13dd1163f..a770c82c6 100644 --- a/common/gera/stringmap.go +++ b/common/gera/stringmap.go @@ -68,20 +68,20 @@ func MakeStringMapWithMap(fromMap map[string]string) *StringWrapMap { return myMap } -func FlattenStack(stringMaps ...StringMap) (flattened map[string]string, err error) { - flattenedSM := MakeStringMap() - for _, stringMap := range stringMaps { - var localFlattened map[string]string - localFlattened, err = stringMap.Flattened() - if err != nil { - return - } - flattenedSM = MakeStringMapWithMap(localFlattened).Wrap(flattenedSM).(*StringWrapMap) - } - - flattened, err = flattenedSM.Flattened() - return -} +//func FlattenStack(stringMaps ...StringMap) (flattened map[string]string, err error) { +// flattenedSM := MakeStringMap() +// for _, stringMap := range stringMaps { +// var localFlattened map[string]string +// localFlattened, err = stringMap.Flattened() +// if err != nil { +// return +// } +// flattenedSM = MakeStringMapWithMap(localFlattened).Wrap(flattenedSM).(*StringWrapMap) +// } +// +// flattened, err = flattenedSM.Flattened() +// return +//} func MakeStringMapWithMapCopy(fromMap map[string]string) *StringWrapMap { newBackingMap := make(map[string]string) diff --git a/go.mod b/go.mod index a35135cde..032b7b9b0 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( ) require ( - dario.cat/mergo v1.0.0 + dario.cat/mergo v1.0.1 github.com/expr-lang/expr v1.16.1 github.com/flosch/pongo2/v6 v6.0.0 github.com/hashicorp/go-multierror v1.1.1 diff --git a/go.sum b/go.sum index 684c6447f..0b3d3fd05 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,7 @@ dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= +dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= +dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= From 70a685145782cc999c09dd720f02003567d415de Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Aug 2024 15:32:41 +0200 Subject: [PATCH 1981/2352] [core] Use gera.Map[string, string] instead of gera.StringMap --- configuration/template/fields.go | 8 ++++---- core/environment/environment.go | 24 ++++++++++++------------ core/task/manager.go | 2 +- core/task/task.go | 16 ++++++++-------- core/task/taskclass/class.go | 30 +++++++++++++++--------------- core/workflow/aggregatorrole.go | 9 +++++---- core/workflow/callrole.go | 9 +++++---- core/workflow/includerole.go | 2 +- core/workflow/iteratorrole.go | 6 +++--- core/workflow/load.go | 2 +- core/workflow/parentadapter.go | 8 ++++---- core/workflow/role.go | 6 +++--- core/workflow/rolebase.go | 32 ++++++++++++++++---------------- walnut/converter/converter.go | 4 ++-- 14 files changed, 80 insertions(+), 78 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 5bda7967b..169b8369d 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -145,9 +145,9 @@ const ( type VarStack struct { Locals map[string]string - Defaults *gera.StringWrapMap - Vars *gera.StringWrapMap - UserVars *gera.StringWrapMap + Defaults *gera.WrapMap[string, string] + Vars *gera.WrapMap[string, string] + UserVars *gera.WrapMap[string, string] } func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]string, err error) { @@ -220,7 +220,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri } } - consolidated := gera.MakeStringMapWithMap(vs.Locals).Wrap(gera.MakeStringMapWithMap(userVars).Wrap(gera.MakeStringMapWithMap(vars).Wrap(gera.MakeStringMapWithMap(defaults)))) + consolidated := gera.MakeMapWithMap(vs.Locals).Wrap(gera.MakeMapWithMap(userVars).Wrap(gera.MakeMapWithMap(vars).Wrap(gera.MakeMapWithMap(defaults)))) consolidatedStack, err = consolidated.Flattened() if err != nil { return diff --git a/core/environment/environment.go b/core/environment/environment.go index 1362bc999..01a4116eb 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -74,10 +74,10 @@ type Environment struct { hookHandlerF func(hooks task.Tasks) error incomingEvents chan event.DeviceEvent - GlobalDefaults gera.StringMap // From Consul - GlobalVars gera.StringMap // From Consul - UserVars gera.StringMap // From user input - BaseConfigStack map[string]string // Exclusively from Consul, already flattened for performance + GlobalDefaults gera.Map[string, string] // From Consul + GlobalVars gera.Map[string, string] // From Consul + UserVars gera.Map[string, string] // From user input + BaseConfigStack map[string]string // Exclusively from Consul, already flattened for performance stateChangedCh chan *event.TasksStateChangedEvent unsubscribe chan struct{} @@ -109,9 +109,9 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, incomingEvents: make(chan event.DeviceEvent), // Every Environment instantiation performs a ConfSvc query for defaults and vars // these key-values stay frozen throughout the lifetime of the environment - GlobalDefaults: gera.MakeStringMapWithMap(the.ConfSvc().GetDefaults()), - GlobalVars: gera.MakeStringMapWithMap(the.ConfSvc().GetVars()), - UserVars: gera.MakeStringMapWithMap(userVars), + GlobalDefaults: gera.MakeMapWithMap(the.ConfSvc().GetDefaults()), + GlobalVars: gera.MakeMapWithMap(the.ConfSvc().GetVars()), + UserVars: gera.MakeMapWithMap(userVars), stateChangedCh: make(chan *event.TasksStateChangedEvent), callsPendingAwait: make(map[string]callable.CallsMap), @@ -121,9 +121,9 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.wfAdapter = workflow.NewParentAdapter( func() uid.ID { return env.Id() }, func() uint32 { return env.GetCurrentRunNumber() }, - func() gera.StringMap { return env.GlobalDefaults }, - func() gera.StringMap { return env.GlobalVars }, - func() gera.StringMap { return env.UserVars }, + func() gera.Map[string, string] { return env.GlobalDefaults }, + func() gera.Map[string, string] { return env.GlobalVars }, + func() gera.Map[string, string] { return env.UserVars }, func(ev event.Event) { env.Mu.Lock() defer env.Mu.Unlock() @@ -134,8 +134,8 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, ) env.GlobalVars.Set("__fmq_cleanup_count", "0") // initialize to 0 the number of START transitions - env.BaseConfigStack, err = gera.MakeStringMapWithMap(env.GlobalVars.Raw()). - WrappedAndFlattened(gera.MakeStringMapWithMap(env.GlobalDefaults.Raw())) // prepare the base config stack + env.BaseConfigStack, err = gera.MakeMapWithMap(env.GlobalVars.Raw()). + WrappedAndFlattened(gera.MakeMapWithMap(env.GlobalDefaults.Raw())) // prepare the base config stack if err != nil { return nil, err } diff --git a/core/task/manager.go b/core/task/manager.go index 4e01ef7f5..6bf956e7f 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -165,7 +165,7 @@ func (m *Manager) newTaskForMesosOffer( agentId: offer.AgentID.Value, offerId: offer.ID.Value, taskId: newId, - properties: gera.MakeStringMap().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), + properties: gera.MakeMap[string, string]().Wrap(m.GetTaskClass(descriptor.TaskClassName).Properties), executorId: executorId.Value, GetTaskClass: nil, localBindMap: nil, diff --git a/core/task/task.go b/core/task/task.go index 146b1b89c..89032ca2c 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -70,9 +70,9 @@ type parentRole interface { SetTask(*Task) GetEnvironmentId() uid.ID CollectOutboundChannels() []channel.Outbound - GetDefaults() gera.StringMap - GetVars() gera.StringMap - GetUserVars() gera.StringMap + GetDefaults() gera.Map[string, string] + GetVars() gera.Map[string, string] + GetUserVars() gera.Map[string, string] ConsolidatedVarStack() (varStack map[string]string, err error) CollectInboundChannels() []channel.Inbound SendEvent(event.Event) @@ -125,7 +125,7 @@ type Task struct { state sm.State safeToStop bool - properties gera.StringMap + properties gera.Map[string, string] GetTaskClass func() *taskclass.Class // ↑ to be filled in by NewTaskForMesosOffer in Manager @@ -313,7 +313,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { return fmt.Errorf("cannot resolve templates for task defaults: %w", err) } - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localDefaults)) + varStack, err = gera.MakeMapWithMap(varStack).WrappedAndFlattened(gera.MakeMapWithMap(localDefaults)) if err != nil { log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). @@ -339,7 +339,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // We wrap the parent varStack around the task's already processed Defaults, // ensuring that any taskclass Defaults are overridden by anything else. - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(gera.MakeStringMapWithMap(localVars)) + varStack, err = gera.MakeMapWithMap(varStack).WrappedAndFlattened(gera.MakeMapWithMap(localVars)) if err != nil { log.WithError(err). WithField("partition", role.GetEnvironmentId().String()). @@ -573,12 +573,12 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // We wrap the parent varStack around the class Defaults+Vars, ensuring // the class Defaults+Vars are overridden by anything else. - classStack := gera.MakeStringMapWithMap(class.Vars.Raw()).Wrap(class.Defaults) + classStack := gera.MakeMapWithMap(class.Vars.Raw()).Wrap(class.Defaults) if err != nil { err = fmt.Errorf("cannot fetch task class defaults for property map: %w", err) return } - varStack, err = gera.MakeStringMapWithMap(varStack).WrappedAndFlattened(classStack) + varStack, err = gera.MakeMapWithMap(varStack).WrappedAndFlattened(classStack) if err != nil { err = fmt.Errorf("cannot fetch task class vars for property map: %w", err) return diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index 234ac06a6..902741c6c 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -59,25 +59,25 @@ func (tcID *Id) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // the following information is enough to run the task even with no environment or // role Class. type Class struct { - Identifier Id `yaml:"name"` - Defaults gera.StringMap `yaml:"defaults"` - Vars gera.StringMap `yaml:"vars"` + Identifier Id `yaml:"name"` + Defaults gera.Map[string, string] `yaml:"defaults"` + Vars gera.Map[string, string] `yaml:"vars"` Control struct { Mode controlmode.ControlMode `yaml:"mode"` } `yaml:"control"` - Command *common.CommandInfo `yaml:"command"` - Wants ResourceWants `yaml:"wants"` - Limits *ResourceLimits `yaml:"limits"` - Bind []channel.Inbound `yaml:"bind"` - Properties gera.StringMap `yaml:"properties"` - Constraints []constraint.Constraint `yaml:"constraints"` - Connect []channel.Outbound `yaml:"connect"` - UpdatedTimestamp time.Time `yaml:"-"` + Command *common.CommandInfo `yaml:"command"` + Wants ResourceWants `yaml:"wants"` + Limits *ResourceLimits `yaml:"limits"` + Bind []channel.Inbound `yaml:"bind"` + Properties gera.Map[string, string] `yaml:"properties"` + Constraints []constraint.Constraint `yaml:"constraints"` + Connect []channel.Outbound `yaml:"connect"` + UpdatedTimestamp time.Time `yaml:"-"` } func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // We need to make a fake type to unmarshal into because - // gera.StringMap is an interface + // gera.Map is an interface type _class struct { Identifier Id `yaml:"name"` Defaults map[string]string `yaml:"defaults"` @@ -109,14 +109,14 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } *c = Class{ Identifier: aux.Identifier, - Defaults: gera.MakeStringMapWithMap(aux.Defaults), - Vars: gera.MakeStringMapWithMap(aux.Vars), + Defaults: gera.MakeMapWithMap(aux.Defaults), + Vars: gera.MakeMapWithMap(aux.Vars), Control: aux.Control, Command: aux.Command, Wants: aux.Wants, Limits: aux.Limits, Bind: aux.Bind, - Properties: gera.MakeStringMapWithMap(aux.Properties), + Properties: gera.MakeMapWithMap(aux.Properties), Constraints: aux.Constraints, Connect: aux.Connect, UpdatedTimestamp: time.Now(), diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index f3d287205..97c034bce 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -26,11 +26,12 @@ package workflow import ( "errors" - "github.com/AliceO2Group/Control/common/gera" "strings" "sync" texttemplate "text/template" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/event/topic" pb "github.com/AliceO2Group/Control/common/protos" @@ -54,9 +55,9 @@ func NewAggregatorRole(name string, roles []Role) (r Role) { return &aggregatorRole{ roleBase: roleBase{ Name: name, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), + Defaults: gera.MakeMap[string, string](), + Vars: gera.MakeMap[string, string](), + UserVars: gera.MakeMap[string, string](), }, aggregator: aggregator{Roles: roles}, } diff --git a/core/workflow/callrole.go b/core/workflow/callrole.go index 8d7b67c48..3ee99a88c 100644 --- a/core/workflow/callrole.go +++ b/core/workflow/callrole.go @@ -26,11 +26,12 @@ package workflow import ( "errors" - "github.com/AliceO2Group/Control/common/gera" "strings" texttemplate "text/template" "time" + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/task/sm" @@ -56,9 +57,9 @@ func NewCallRole(name string, traits task.Traits, funcCall string, returnVar str return &callRole{ roleBase: roleBase{ Name: name, - Defaults: gera.MakeStringMap(), - Vars: gera.MakeStringMap(), - UserVars: gera.MakeStringMap(), + Defaults: gera.MakeMap[string, string](), + Vars: gera.MakeMap[string, string](), + UserVars: gera.MakeMap[string, string](), }, Traits: traits, FuncCall: funcCall, diff --git a/core/workflow/includerole.go b/core/workflow/includerole.go index 3e9f4717e..88371531f 100644 --- a/core/workflow/includerole.go +++ b/core/workflow/includerole.go @@ -160,7 +160,7 @@ func (r *includeRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflow } // By now the subworkflow is loaded and reparented to this includeRole. This reparenting is - // needed to ensure the correct gera.StringMap hierarchies, but now that we replace the + // needed to ensure the correct gera.Map hierarchies, but now that we replace the // composed aggregatorRole with the newly loaded one, we must also fix the reparenting and // ensure the loaded name doesn't overwrite the original name of the includeRole. parent := r.parent diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 3f3f51151..5a5384921 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -363,21 +363,21 @@ func (i *iteratorRole) getConstraints() (cts constraint.Constraints) { return } -func (i *iteratorRole) GetDefaults() gera.StringMap { +func (i *iteratorRole) GetDefaults() gera.Map[string, string] { if i == nil { return nil } return i.template.GetDefaults() } -func (i *iteratorRole) GetVars() gera.StringMap { +func (i *iteratorRole) GetVars() gera.Map[string, string] { if i == nil { return nil } return i.template.GetVars() } -func (i *iteratorRole) GetUserVars() gera.StringMap { +func (i *iteratorRole) GetUserVars() gera.Map[string, string] { if i == nil { return nil } diff --git a/core/workflow/load.go b/core/workflow/load.go index 1a0d227fd..f75c0126f 100644 --- a/core/workflow/load.go +++ b/core/workflow/load.go @@ -149,7 +149,7 @@ func LoadDPL(tasks []*taskclass.Class, rootRoleName string, extraVarsMap map[str root := new(aggregatorRole) root.roleBase.Name = rootRoleName - root.roleBase.Vars = gera.MakeStringMapWithMap(extraVarsMap) + root.roleBase.Vars = gera.MakeMapWithMap(extraVarsMap) for _, taskItem := range tasks { SingleTaskRole := taskRole{ diff --git a/core/workflow/parentadapter.go b/core/workflow/parentadapter.go index 1ffe5c3b9..6fbf58d8c 100644 --- a/core/workflow/parentadapter.go +++ b/core/workflow/parentadapter.go @@ -39,7 +39,7 @@ type GetEnvIdFunc func() uid.ID type GetCurrentRunNumberFunc func() uint32 -type GetStringMapFunc func() gera.StringMap +type GetStringMapFunc func() gera.Map[string, string] type SendEvents func(event.Event) @@ -137,15 +137,15 @@ func (*ParentAdapter) CollectOutboundChannels() []channel.Outbound { return make([]channel.Outbound, 0) } -func (p *ParentAdapter) GetDefaults() gera.StringMap { +func (p *ParentAdapter) GetDefaults() gera.Map[string, string] { return p.getDefaultsFunc() } -func (p *ParentAdapter) GetVars() gera.StringMap { +func (p *ParentAdapter) GetVars() gera.Map[string, string] { return p.getVarsFunc() } -func (p *ParentAdapter) GetUserVars() gera.StringMap { +func (p *ParentAdapter) GetUserVars() gera.Map[string, string] { return p.getUserVarsFunc() } diff --git a/core/workflow/role.go b/core/workflow/role.go index 6f85a0951..d33f68d2a 100644 --- a/core/workflow/role.go +++ b/core/workflow/role.go @@ -92,9 +92,9 @@ type Updatable interface { } type VarNode interface { - GetDefaults() gera.StringMap - GetVars() gera.StringMap - GetUserVars() gera.StringMap + GetDefaults() gera.Map[string, string] + GetVars() gera.Map[string, string] + GetUserVars() gera.Map[string, string] } type copyable interface { diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 87951cc24..e53c92dc1 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -56,12 +56,12 @@ type roleBase struct { status SafeStatus state SafeState - Defaults *gera.StringWrapMap `yaml:"defaults,omitempty"` - Vars *gera.StringWrapMap `yaml:"vars,omitempty"` - UserVars *gera.StringWrapMap `yaml:"-"` - Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role - Bind []channel.Inbound `yaml:"bind,omitempty"` - Enabled string `yaml:"enabled,omitempty"` + Defaults *gera.WrapMap[string, string] `yaml:"defaults,omitempty"` + Vars *gera.WrapMap[string, string] `yaml:"vars,omitempty"` + UserVars *gera.WrapMap[string, string] `yaml:"-"` + Locals map[string]string `yaml:"-"` // only used for passing iterator from template to new role + Bind []channel.Inbound `yaml:"bind,omitempty"` + Enabled string `yaml:"enabled,omitempty"` } func (r *roleBase) IsEnabled() bool { @@ -135,7 +135,7 @@ func (r *roleBase) ConsolidatedVarStack() (varStack map[string]string, err error if err != nil { return } - consolidated := gera.MakeStringMapWithMap(userVars).Wrap(gera.MakeStringMapWithMap(vars).Wrap(gera.MakeStringMapWithMap(defaults))) + consolidated := gera.MakeMapWithMap(userVars).Wrap(gera.MakeMapWithMap(vars).Wrap(gera.MakeMapWithMap(defaults))) varStack, err = consolidated.Flattened() if err != nil { return @@ -238,13 +238,13 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) err = unmarshal(&role) if err == nil { if role.Defaults == nil { - role.Defaults = gera.MakeStringMap() + role.Defaults = gera.MakeMap[string, string]() } if role.Vars == nil { - role.Vars = gera.MakeStringMap() + role.Vars = gera.MakeMap[string, string]() } if role.UserVars == nil { - role.UserVars = gera.MakeStringMap() + role.UserVars = gera.MakeMap[string, string]() } *r = roleBase(role) } @@ -317,9 +317,9 @@ func (r *roleBase) copy() copyable { rCopy := roleBase{ Name: r.Name, parent: r.parent, - Defaults: r.Defaults.Copy().(*gera.StringWrapMap), - Vars: r.Vars.Copy().(*gera.StringWrapMap), - UserVars: r.UserVars.Copy().(*gera.StringWrapMap), + Defaults: r.Defaults.Copy().(*gera.WrapMap[string, string]), + Vars: r.Vars.Copy().(*gera.WrapMap[string, string]), + UserVars: r.UserVars.Copy().(*gera.WrapMap[string, string]), Locals: make(map[string]string), Connect: make([]channel.Outbound, len(r.Connect)), Constraints: make(constraint.Constraints, len(r.Constraints)), @@ -465,21 +465,21 @@ func (r *roleBase) getConstraints() (cts constraint.Constraints) { return } -func (r *roleBase) GetDefaults() gera.StringMap { +func (r *roleBase) GetDefaults() gera.Map[string, string] { if r == nil { return nil } return r.Defaults } -func (r *roleBase) GetVars() gera.StringMap { +func (r *roleBase) GetVars() gera.Map[string, string] { if r == nil { return nil } return r.Vars } -func (r *roleBase) GetUserVars() gera.StringMap { +func (r *roleBase) GetUserVars() gera.Map[string, string] { if r == nil { return nil } diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go index 655791ef6..0c3bf75a8 100644 --- a/walnut/converter/converter.go +++ b/walnut/converter/converter.go @@ -91,7 +91,7 @@ func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string Memory: createFloat(128), Ports: port.Ranges{}, // begin - end OR range }, - Properties: gera.MakeStringMapWithMap(map[string]string{ + Properties: gera.MakeMapWithMap(map[string]string{ "severity": "trace", "color": "false", }), @@ -159,7 +159,7 @@ func GenerateTaskTemplate(extractedTasks []*taskclass.Class, outputDir string, d _ = os.MkdirAll(path, os.ModePerm) for _, SingleTask := range extractedTasks { - SingleTask.Defaults = gera.MakeStringMapWithMap(defaults) + SingleTask.Defaults = gera.MakeMapWithMap(defaults) SingleTask.Command.User = createString("{{ user }}") YAMLData, err := yaml.Marshal(&SingleTask) From 52cbc1dc3271e3fb4f9da24bddcdfec60d7fe847 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Aug 2024 15:34:43 +0200 Subject: [PATCH 1982/2352] [core] Remove gera.StringMap --- common/gera/stringmap.go | 326 --------------------------------------- 1 file changed, 326 deletions(-) delete mode 100644 common/gera/stringmap.go diff --git a/common/gera/stringmap.go b/common/gera/stringmap.go deleted file mode 100644 index a770c82c6..000000000 --- a/common/gera/stringmap.go +++ /dev/null @@ -1,326 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package gera - -import ( - "sync" - - "dario.cat/mergo" - "gopkg.in/yaml.v3" -) - -type StringMap interface { - Wrap(m StringMap) StringMap - IsHierarchyRoot() bool - HierarchyContains(m StringMap) bool - Unwrap() StringMap - - Has(key string) bool - Len() int - - Get(key string) (string, bool) - Set(key string, value string) bool - Del(key string) bool - - Flattened() (map[string]string, error) - FlattenedParent() (map[string]string, error) - WrappedAndFlattened(m StringMap) (map[string]string, error) - - Raw() map[string]string - Copy() StringMap - RawCopy() map[string]string -} - -func MakeStringMap() *StringWrapMap { - return &StringWrapMap{ - theMap: make(map[string]string), - parent: nil, - } -} - -func MakeStringMapWithMap(fromMap map[string]string) *StringWrapMap { - myMap := &StringWrapMap{ - theMap: fromMap, - parent: nil, - } - return myMap -} - -//func FlattenStack(stringMaps ...StringMap) (flattened map[string]string, err error) { -// flattenedSM := MakeStringMap() -// for _, stringMap := range stringMaps { -// var localFlattened map[string]string -// localFlattened, err = stringMap.Flattened() -// if err != nil { -// return -// } -// flattenedSM = MakeStringMapWithMap(localFlattened).Wrap(flattenedSM).(*StringWrapMap) -// } -// -// flattened, err = flattenedSM.Flattened() -// return -//} - -func MakeStringMapWithMapCopy(fromMap map[string]string) *StringWrapMap { - newBackingMap := make(map[string]string) - for k, v := range fromMap { - newBackingMap[k] = v - } - - return MakeStringMapWithMap(newBackingMap) -} - -type StringWrapMap struct { - theMap map[string]string - parent StringMap - mu sync.RWMutex -} - -func (w *StringWrapMap) UnmarshalYAML(unmarshal func(interface{}) error) error { - nodes := make(map[string]yaml.Node) - err := unmarshal(&nodes) - if err == nil { - m := make(map[string]string) - for k, v := range nodes { - if v.Kind == yaml.ScalarNode { - m[k] = v.Value - } else if v.Kind == yaml.MappingNode && v.Tag == "!public" { - type auxType struct { - Value string - } - var aux auxType - err = v.Decode(&aux) - if err != nil { - continue - } - m[k] = aux.Value - } - } - - *w = StringWrapMap{ - theMap: m, - parent: nil, - } - } else { - *w = StringWrapMap{ - theMap: make(map[string]string), - parent: nil, - } - } - return err -} - -func (w *StringWrapMap) IsHierarchyRoot() bool { - if w == nil || w.parent != nil { - return false - } - return true -} - -func (w *StringWrapMap) HierarchyContains(m StringMap) bool { - if w == nil || w.parent == nil { - return false - } - if w.parent == m { - return true - } - return w.parent.HierarchyContains(m) -} - -// Wraps this map around the gera.Map m, which becomes the new parent. -// Returns a pointer to the composite map (i.e. to itself in its new state). -func (w *StringWrapMap) Wrap(m StringMap) StringMap { - if w == nil { - return nil - } - w.parent = m - return w -} - -// Unwraps this map from its parent. -// Returns a pointer to the former parent which was just unwrapped. -func (w *StringWrapMap) Unwrap() StringMap { - if w == nil { - return nil - } - p := w.parent - w.parent = nil - return p -} - -func (w *StringWrapMap) Get(key string) (value string, ok bool) { - if w == nil || w.theMap == nil { - return "", false - } - - w.mu.RLock() - defer w.mu.RUnlock() - - if val, ok := w.theMap[key]; ok { - return val, true - } - if w.parent != nil { - return w.parent.Get(key) - } - return "", false -} - -func (w *StringWrapMap) Set(key string, value string) (ok bool) { - if w == nil || w.theMap == nil { - return false - } - - w.mu.Lock() - defer w.mu.Unlock() - - w.theMap[key] = value - return true -} - -func (w *StringWrapMap) Del(key string) (ok bool) { - if w == nil || w.theMap == nil { - return false - } - - w.mu.Lock() - defer w.mu.Unlock() - - if _, exists := w.theMap[key]; exists { - delete(w.theMap, key) - } - return true -} - -func (w *StringWrapMap) Has(key string) bool { - _, ok := w.Get(key) - return ok -} - -func (w *StringWrapMap) Len() int { - if w == nil || w.theMap == nil { - return 0 - } - flattened, err := w.Flattened() - if err != nil { - return 0 - } - return len(flattened) -} - -func (w *StringWrapMap) Flattened() (map[string]string, error) { - if w == nil { - return nil, nil - } - - w.mu.RLock() - defer w.mu.RUnlock() - - out := make(map[string]string) - for k, v := range w.theMap { - out[k] = v - } - if w.parent == nil { - return out, nil - } - - flattenedParent, err := w.parent.Flattened() - if err != nil { - return out, err - } - - err = mergo.Merge(&out, flattenedParent) - return out, err -} - -func (w *StringWrapMap) FlattenedParent() (map[string]string, error) { - if w == nil { - return nil, nil - } - - if w.parent == nil { - return make(map[string]string), nil - } - - return w.parent.Flattened() -} - -func (w *StringWrapMap) WrappedAndFlattened(m StringMap) (map[string]string, error) { - if w == nil { - return nil, nil - } - - w.mu.RLock() - - out := make(map[string]string) - for k, v := range w.theMap { - out[k] = v - } - - w.mu.RUnlock() - - if m == nil { - return out, nil - } - - flattenedM, err := m.Flattened() - if err != nil { - return out, err - } - - err = mergo.Merge(&out, flattenedM) - return out, err -} - -func (w *StringWrapMap) Raw() map[string]string { // allows unmutexed access to map, can be unsafe! - if w == nil { - return nil - } - return w.theMap -} - -func (w *StringWrapMap) Copy() StringMap { - if w == nil { - return nil - } - - w.mu.RLock() - defer w.mu.RUnlock() - - newMap := &StringWrapMap{ - theMap: make(map[string]string, len(w.theMap)), - parent: w.parent, - } - for k, v := range w.theMap { - newMap.theMap[k] = v - } - return newMap -} - -func (w *StringWrapMap) RawCopy() map[string]string { // always safe - if w == nil { - return nil - } - return w.Copy().Raw() -} From bbdbda426381c8c89f09bc86689ae9baf7ecf996 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 21 Aug 2024 15:37:19 +0200 Subject: [PATCH 1983/2352] [build] Add gera to test dirs in Makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 35eb49e2a..a5480de20 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment +TEST_DIRS := ./apricot/local ./common/gera ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results From 0364c585df43a545c6535730ad79b439fc121a91 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Aug 2024 12:46:36 +0200 Subject: [PATCH 1984/2352] [common] Improve hierarchical KV store test cases --- common/gera/map_test.go | 81 ++++++++++++++++++++++++++++++----------- 1 file changed, 59 insertions(+), 22 deletions(-) diff --git a/common/gera/map_test.go b/common/gera/map_test.go index 9c14e2478..dea808ee9 100644 --- a/common/gera/map_test.go +++ b/common/gera/map_test.go @@ -65,18 +65,6 @@ pdp_workflow_parameters: !public index: 603 user: flp extra_env_vars: "" -` - testPayloadVarsYAML1 = ` -auto_stop_enabled: "{{ auto_stop_timeout != 'none' }}" -ddsched_enabled: "{{ epn_enabled == 'true' && dd_enabled == 'true' }}" -odc_enabled: "{{ epn_enabled }}" -odc_topology_fullname: '{{ epn_enabled == "true" ? odc.GenerateEPNTopologyFullname() : "" }}' -` - testPayloadUserVarsYAML1 = ` -ccdb_enabled: "true" -ccdb_host: "" -dd_enabled: "false" -pdp_workflow_parameters: "" ` testPayloadDefaultsYAML2 = ` detector: "" @@ -85,13 +73,25 @@ dpl_command: "{{ util.PrefixedOverride( 'dpl_command', 'ctp' ) }}" stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" it: "{{ ctp_readout_host }}" user: "epn" +` + testPayloadVarsYAML1 = ` +auto_stop_enabled: "{{ auto_stop_timeout != 'none' }}" +ddsched_enabled: "{{ epn_enabled == 'true' && dd_enabled == 'true' }}" +odc_enabled: "{{ epn_enabled }}" +odc_topology_fullname: '{{ epn_enabled == "true" ? odc.GenerateEPNTopologyFullname() : "" }}' ` testPayloadVarsYAML2 = ` detector: "{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}" # dpl_workflow is set to ctp_dpl_workflow -dpl_workflow: "{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}" +dpl_workflow: "12345" dpl_command: "" stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" +` + testPayloadUserVarsYAML1 = ` +ccdb_enabled: "true" +ccdb_host: "" +dd_enabled: "false" +pdp_workflow_parameters: "" ` ) @@ -330,8 +330,8 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" Expect(unwrapped).NotTo(BeNil()) Expect(unwrapped).To(Equal(vars1)) - rewrapped := vars2.Wrap(vars1) - Expect(rewrapped).NotTo(BeNil()) + wrappedVars = vars2.Wrap(vars1) + Expect(wrappedVars).NotTo(BeNil()) }) var flattenedDefaults, flattenedVars, flattenedUserVars, flattenedAll map[string]string @@ -339,9 +339,31 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" It("should flatten correctly", func() { flattenedDefaults, err = wrappedDefaults.Flattened() Expect(err).NotTo(HaveOccurred()) + Expect(flattenedDefaults).To(Equal(map[string]string{ + "detector": "", + "dpl_workflow": "{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}", + "dpl_command": "{{ util.PrefixedOverride( 'dpl_command', 'ctp' ) }}", + "stfs_shm_segment_size": "{{ ctp_stfs_shm_segment_size }}", + "it": "{{ ctp_readout_host }}", + "dcs_enabled": "false", + "dd_enabled": "true", + "pdp_workflow_parameters": "QC,CALIB,GPU,CTF,EVENT_DISPLAY", + "user": "epn", + "extra_env_vars": "", + })) flattenedVars, err = wrappedVars.Flattened() Expect(err).NotTo(HaveOccurred()) + Expect(flattenedVars).To(Equal(map[string]string{ + "detector": "{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}", + "dpl_workflow": "12345", + "dpl_command": "", + "stfs_shm_segment_size": "{{ ctp_stfs_shm_segment_size }}", + "auto_stop_enabled": "{{ auto_stop_timeout != 'none' }}", + "ddsched_enabled": "{{ epn_enabled == 'true' && dd_enabled == 'true' }}", + "odc_enabled": "{{ epn_enabled }}", + "odc_topology_fullname": "{{ epn_enabled == \"true\" ? odc.GenerateEPNTopologyFullname() : \"\" }}", + })) flattenedUserVars, err = wrappedUserVars.Flattened() Expect(err).NotTo(HaveOccurred()) @@ -352,6 +374,25 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" Expect(wrappedAll).NotTo(BeNil()) flattenedAll, err = wrappedAll.Flattened() Expect(err).NotTo(HaveOccurred()) + + Expect(flattenedAll).To(Equal(map[string]string{ + "detector": "{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}", + "dpl_workflow": "12345", + "dpl_command": "", + "stfs_shm_segment_size": "{{ ctp_stfs_shm_segment_size }}", + "it": "{{ ctp_readout_host }}", + "auto_stop_enabled": "{{ auto_stop_timeout != 'none' }}", + "ddsched_enabled": "{{ epn_enabled == 'true' && dd_enabled == 'true' }}", + "odc_enabled": "{{ epn_enabled }}", + "odc_topology_fullname": "{{ epn_enabled == \"true\" ? odc.GenerateEPNTopologyFullname() : \"\" }}", + "dcs_enabled": "false", + "dd_enabled": "false", + "pdp_workflow_parameters": "", + "user": "epn", + "extra_env_vars": "", + "ccdb_enabled": "true", + "ccdb_host": "", + })) }) It("should flatten stack correctly", func() { @@ -403,7 +444,6 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" }) It("should correctly perform KV Has operation", func() { - // Has Expect(wrappedAll.Has("odc_enabled")).To(BeTrue()) Expect(wrappedAll.Has("ccdb_host")).To(BeTrue()) Expect(wrappedAll.Has("detector")).To(BeTrue()) @@ -422,7 +462,6 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" }) It("should correctly perform KV Get operations", func() { - // Get value, ok := wrappedAll.Get("odc_enabled") Expect(ok).To(BeTrue()) Expect(value).To(Equal("{{ epn_enabled }}")) @@ -433,7 +472,7 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" value, ok = wrappedAll.Get("dpl_workflow") Expect(ok).To(BeTrue()) - Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + Expect(value).To(Equal("12345")) value, ok = wrappedAll.Get("ccdb_enabled") Expect(ok).To(BeTrue()) @@ -457,7 +496,6 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" }) It("should correctly perform KV Set operations", func() { - // Set ok := userVars1.Set("detector", "") Expect(ok).To(BeTrue()) @@ -520,7 +558,6 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" }) It("should correctly perform KV Del operations", func() { - // Del ok := userVars1.Del("detector") Expect(ok).To(BeTrue()) @@ -551,7 +588,7 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" value, ok = wrappedAll.Get("dpl_workflow") Expect(ok).To(BeTrue()) - Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + Expect(value).To(Equal("12345")) value, ok = wrappedAll.Get("user") Expect(ok).To(BeTrue()) @@ -570,7 +607,7 @@ stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" value, ok = flattenedStack["dpl_workflow"] Expect(ok).To(BeTrue()) - Expect(value).To(Equal("{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}")) + Expect(value).To(Equal("12345")) value, ok = flattenedStack["user"] Expect(ok).To(BeTrue()) From d5fbf3ebe449aa81d2c8c5da292b0474a861656a Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Aug 2024 12:47:17 +0200 Subject: [PATCH 1985/2352] [core] Use custom unmarshaler in gera.Map[string, string] instances --- core/workflow/aggregatorrole.go | 6 ++++- core/workflow/rolebase.go | 46 ++++++++++++++++++++++++--------- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 97c034bce..f1ae9d7cd 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -66,7 +66,11 @@ func NewAggregatorRole(name string, roles []Role) (r Role) { func (r *aggregatorRole) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // NOTE: see NOTE in roleBase.UnmarshalYAML - innerRoleBase := roleBase{} + innerRoleBase := roleBase{ + Defaults: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), + Vars: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), + UserVars: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), + } err = unmarshal(&innerRoleBase) if err != nil { return diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index e53c92dc1..2b5dcc427 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task/sm" "github.com/sirupsen/logrus" + "gopkg.in/yaml.v3" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/constraint" @@ -64,6 +65,36 @@ type roleBase struct { Enabled string `yaml:"enabled,omitempty"` } +func kvStoreUnmarshalYAMLWithTags(w gera.Map[string, string], unmarshal func(interface{}) error) error { + nodes := make(map[string]yaml.Node) + err := unmarshal(&nodes) + if err == nil { + m := make(map[string]string) + for k, v := range nodes { + if v.Kind == yaml.ScalarNode { + m[k] = v.Value + } else if v.Kind == yaml.MappingNode && v.Tag == "!public" { + type auxType struct { + Value string + } + var aux auxType + err = v.Decode(&aux) + if err != nil { + continue + } + m[k] = aux.Value + } + } + + wPtr := w.(*gera.WrapMap[string, string]) + *wPtr = *gera.MakeMapWithMap(m) + } else { + wPtr := w.(*gera.WrapMap[string, string]) + *wPtr = *gera.MakeMap[string, string]() + } + return err +} + func (r *roleBase) IsEnabled() bool { // Only valid after ProcessTemplates trimmed := strings.ToLower(strings.TrimSpace(r.Enabled)) @@ -227,9 +258,9 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) // recurse back to this function forever type _roleBase roleBase role := _roleBase{ - Defaults: nil, - Vars: nil, - UserVars: nil, + Defaults: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), + Vars: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), + UserVars: gera.MakeMap[string, string]().WithUnmarshalYAML(kvStoreUnmarshalYAMLWithTags), Locals: make(map[string]string), status: SafeStatus{status: task.INACTIVE}, state: SafeState{state: sm.STANDBY}, @@ -237,15 +268,6 @@ func (r *roleBase) UnmarshalYAML(unmarshal func(interface{}) error) (err error) } err = unmarshal(&role) if err == nil { - if role.Defaults == nil { - role.Defaults = gera.MakeMap[string, string]() - } - if role.Vars == nil { - role.Vars = gera.MakeMap[string, string]() - } - if role.UserVars == nil { - role.UserVars = gera.MakeMap[string, string]() - } *r = roleBase(role) } return From b68946a7eb610d4911fc60cb0a1b088ba8b6d899 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 22 Aug 2024 12:48:57 +0200 Subject: [PATCH 1986/2352] [common] Fix override with empty value issue OCTRL-916 --- common/gera/map.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/common/gera/map.go b/common/gera/map.go index 1d07903b8..5ef482da9 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -247,21 +247,21 @@ func (w *WrapMap[K, V]) Flattened() (map[K]V, error) { w.mu.RLock() defer w.mu.RUnlock() - out := make(map[K]V) + thisMapCopy := make(map[K]V) for k, v := range w.theMap { - out[k] = v + thisMapCopy[k] = v } if w.parent == nil { - return out, nil + return thisMapCopy, nil } flattenedParent, err := w.parent.Flattened() if err != nil { - return out, err + return thisMapCopy, err } - err = mergo.Merge(&out, flattenedParent) - return out, err + err = mergo.Merge(&flattenedParent, thisMapCopy, mergo.WithOverride) + return flattenedParent, err } func (w *WrapMap[K, V]) FlattenedParent() (map[K]V, error) { @@ -283,24 +283,24 @@ func (w *WrapMap[K, V]) WrappedAndFlattened(m Map[K, V]) (map[K]V, error) { w.mu.RLock() - out := make(map[K]V) + thisMapCopy := make(map[K]V) for k, v := range w.theMap { - out[k] = v + thisMapCopy[k] = v } w.mu.RUnlock() if m == nil { - return out, nil + return thisMapCopy, nil } flattenedM, err := m.Flattened() if err != nil { - return out, err + return thisMapCopy, err } - err = mergo.Merge(&out, flattenedM) - return out, err + err = mergo.Merge(&flattenedM, thisMapCopy, mergo.WithOverride) + return flattenedM, err } func (w *WrapMap[K, V]) Raw() map[K]V { // allows unmutexed access to map, can be unsafe! From e5a60516758d450b7a255b662798ba6b1e5e96c8 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 23 Aug 2024 16:21:46 +0200 Subject: [PATCH 1987/2352] [core] Add comments on gera and defaults/vars/userVars mechanism --- common/gera/map.go | 4 ++++ core/workflow/rolebase.go | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/common/gera/map.go b/common/gera/map.go index 5ef482da9..1cb7d3661 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -26,6 +26,10 @@ // // A gera.Map uses a map[string]interface{} as backing store, and it can wrap other gera.Map instances. // Values in child maps override any value provided by a gera.Map that's wrapped in the hierarchy. +// +// The name is reminiscent of hiera, as in hierarchical, but it was deemed desirable to avoid future confusion with the +// Hiera KV store used by Puppet, a different product altogether, so instead of the ancient Greek root, "gera" comes +// from the Italian root instead where "hi" becomes a soft "g". package gera import ( diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 2b5dcc427..4b8308de1 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -57,6 +57,19 @@ type roleBase struct { status SafeStatus state SafeState + // Defaults, Vars and UserVars are used to store each role's variables. + // Defaults are the lowest priority, Vars are the second highest, and UserVars are the highest. + // + // These use the gera.Map type, which is a wrapper around a map[string]string that provides hierarchical KV store + // semantics. + // The gera.Map logic allows us to ensure that defaults are overridden by vars, and vars by userVars throughout the + // workflow tree, and at the same time that defaults/vars/userVars set in a child role override the relevant values + // set in its parent role. + // The way we do this is by ensuring parent-child (Wrap) relationships between all the Default members in the + // workflow tree, all the Vars members, and all the UserVars members, and then whenever we need to figure out what's + // the consolidated KV map seen from the point of view of a given role, we Flatten each of these three, and then + // Wrap and re-Flatten between the flattened defaults, vars and userVars (see ConsolidatedVarStack). This results in + // a single map, generatable from the POV of any role within the tree. Defaults *gera.WrapMap[string, string] `yaml:"defaults,omitempty"` Vars *gera.WrapMap[string, string] `yaml:"vars,omitempty"` UserVars *gera.WrapMap[string, string] `yaml:"-"` @@ -65,6 +78,8 @@ type roleBase struct { Enabled string `yaml:"enabled,omitempty"` } +// Needed for the yaml package to correctly unmarshal into gera.Map[string, string] those Defaults and Vars entries from +// a workflow template, that have a !public tag to include input widget metadata. func kvStoreUnmarshalYAMLWithTags(w gera.Map[string, string], unmarshal func(interface{}) error) error { nodes := make(map[string]yaml.Node) err := unmarshal(&nodes) From bd0915b8d7d260e4afc6f18a6d4dc3d1e60a06bd Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Aug 2024 13:47:45 +0200 Subject: [PATCH 1988/2352] =?UTF-8?q?[core]=20Test=20kvStoreUnmarshalYAMLW?= =?UTF-8?q?ithTags=20and=20YAML=E2=86=92workflow=20unmarshal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/workflow/role_test.go | 263 +++++++++++++++++++++++++++++++++++++ 1 file changed, 263 insertions(+) diff --git a/core/workflow/role_test.go b/core/workflow/role_test.go index 3deaf6674..af6f4f722 100644 --- a/core/workflow/role_test.go +++ b/core/workflow/role_test.go @@ -5,6 +5,7 @@ import ( "github.com/AliceO2Group/Control/core/task/sm" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "gopkg.in/yaml.v3" ) func complexRoleTree() (root Role, leaves map[string]Role) { @@ -254,4 +255,266 @@ var _ = Describe("role", func() { }) }) }) + + Describe("unmarshaling a YAML workflow template into a tree of roles", func() { + Context("when the YAML template is a simple tree with a single task", func() { + const yamlTemplate = ` +name: root_role +description: description of the root role +defaults: + default1: "true" + default2: value of default2 + default3: false +vars: + var1: "{{ default2 != 'none' }}" + var2: "{{ default1 == 'true' && default3 == 'true' }}" + var3: value of var3 +roles: + - name: "first_role" + enabled: "{{ default1 == 'true' }}" + vars: + var3: "{{ default2 }}" + constraints: + - attribute: some_attribute + value: "{{ default2 }}" + roles: + - name: 'first_subrole' + vars: + var4: '{{default1 == "true" ? var3 : "value of var4"}}' + task: + load: name_of_task1 + - name: "second_subrole" + enabled: 'false' + roles: + - name: "first_subsubrole" + connect: + - name: connection_name + type: pull + target: "{{ Up(2).Path }}.first_subrole:connection_name" + rateLogging: "{{ default1 }}" + task: + load: name_of_task2 + - name: "second_role" + call: + func: testplugin.Noop() + trigger: CONFIGURE + timeout: 1s + critical: false +` + role := new(aggregatorRole) + + It("should unmarshal successfully", func() { + err := yaml.Unmarshal([]byte(yamlTemplate), role) + Expect(err).NotTo(HaveOccurred()) + }) + It("should create a tree with a task role and a call role", func() { + Expect(role.GetName()).To(Equal("root_role")) + Expect(role.GetRoles()).To(HaveLen(2)) + + Expect(role.GetRoles()[0].GetName()).To(Equal("first_role")) + Expect(role.GetRoles()[0]).To(BeAssignableToTypeOf(&aggregatorRole{})) + Expect(role.GetRoles()[0]).NotTo(BeAssignableToTypeOf(&callRole{})) + Expect(role.GetRoles()[0].GetRoles()).To(HaveLen(2)) + + Expect(role.GetRoles()[0].GetRoles()[0].GetName()).To(Equal("first_subrole")) + Expect(role.GetRoles()[0].GetRoles()[0]).To(BeAssignableToTypeOf(&taskRole{})) + + Expect(role.GetRoles()[0].GetRoles()[1].GetName()).To(Equal("second_subrole")) + Expect(role.GetRoles()[0].GetRoles()[1]).To(BeAssignableToTypeOf(&aggregatorRole{})) + Expect(role.GetRoles()[0].GetRoles()[1].GetRoles()).To(HaveLen(1)) + + Expect(role.GetRoles()[0].GetRoles()[1].GetRoles()[0].GetName()).To(Equal("first_subsubrole")) + Expect(role.GetRoles()[0].GetRoles()[1].GetRoles()[0]).To(BeAssignableToTypeOf(&taskRole{})) + + Expect(role.GetRoles()[1].GetName()).To(Equal("second_role")) + Expect(role.GetRoles()[1]).To(BeAssignableToTypeOf(&callRole{})) + Expect(role.GetRoles()[1]).NotTo(BeAssignableToTypeOf(&taskRole{})) + }) + It("should set the variables correctly", func() { + Expect(role.GetDefaults().Raw()).To(HaveLen(3)) + Expect(role.GetRoles()[0].GetRoles()[0].GetVars().Raw()).To(HaveLen(1)) + Expect(role.GetRoles()[0].GetRoles()[1].GetVars().Raw()).To(HaveLen(0)) + Expect(role.GetRoles()[0].GetRoles()[0].ConsolidatedVarStack()).To(HaveLen(7)) + Expect(role.GetRoles()[0].GetRoles()[1].ConsolidatedVarStack()).To(HaveLen(6)) + Expect(role.GetRoles()[0].GetRoles()[0].GetVars().Raw()["var4"]).To(Equal("{{default1 == \"true\" ? var3 : \"value of var4\"}}")) + }) + }) + + Context("when the YAML template resembles readout-dataflow", func() { + const yamlTemplate = ` +name: !public readout-dataflow +description: !public "Main workflow template for ALICE data taking" +defaults: + ############################### + # General Configuration Panel + ############################### + dcs_enabled: !public + value: "false" + type: bool + label: "DCS" + description: "Enable/disable DCS SOR/EOR commands" + widget: checkBox + panel: General_Configuration + index: 0 + dd_enabled: !public + value: "true" + type: bool + label: "Data Distribution (FLP)" + description: "Enable/disable Data Distribution components running on FLPs (StfBuilder and StfSender)" + widget: checkBox + panel: General_Configuration + index: 1 + hosts: '["host1", "host2"]' +vars: + auto_stop_enabled: "{{ auto_stop_timeout != 'none' }}" + ddsched_enabled: "{{ epn_enabled == 'true' && dd_enabled == 'true' }}" +roles: + ########################### + # Start of CTP Readout role + ########################### + - name: "readout-ctp" + enabled: "{{ ctp_readout_enabled == 'true' }}" + vars: + detector: "{{ctp_readout_enabled == 'true' ? inventory.DetectorForHost( ctp_readout_host ) : \"\" }}" + readout_cfg_uri_standalone: "consul-ini://{{ consul_endpoint }}/o2/components/{{config.ResolvePath('readout/' + run_type + '/any/readout-standalone-' + ctp_readout_host)}}" + readout_cfg_uri_stfb: "consul-ini://{{ consul_endpoint }}/o2/components/{{config.Resolve('readout', run_type, 'any', 'readout-stfb-' + ctp_readout_host)}}" + dd_discovery_ib_hostname: "{{ ctp_readout_host }}-ib" # MUST be defined for all stfb and stfs + # dpl_workflow is set to ctp_dpl_workflow + dpl_workflow: "{{ util.PrefixedOverride( 'dpl_workflow', 'ctp' ) }}" + dpl_command: "{{ util.PrefixedOverride( 'dpl_command', 'ctp' ) }}" + stfs_shm_segment_size: "{{ ctp_stfs_shm_segment_size }}" + it: "{{ ctp_readout_host }}" + constraints: + - attribute: machine_id + value: "{{ ctp_readout_host }}" + roles: + - name: "readout" + vars: + readout_cfg_uri: '{{dd_enabled == "true" ? readout_cfg_uri_stfb : readout_cfg_uri_standalone}}' + task: + load: readout-ctp + - name: "data-distribution" + enabled: "{{dd_enabled == 'true' && (qcdd_enabled == 'false' && minimal_dpl_enabled == 'false' && dpl_workflow == 'none' && dpl_command == 'none')}}" + roles: + # stfb-standalone not supported on CTP machine + # if ctp_readout_enabled, we also assume stfb_standalone is false + - name: "stfb" + vars: + dd_discovery_stfb_id: stfb-{{ ctp_readout_host }}-{{ uid.New() }} # must be defined for all stfb roles + connect: + - name: readout + type: pull + target: "{{ Up(2).Path }}.readout:readout" + rateLogging: "{{ fmq_rate_logging }}" + task: + load: stfbuilder-senderoutput + - name: host-{{ it }} + for: + range: "{{ hosts }}" + var: it + vars: + detector: "{{ inventory.DetectorForHost( it ) }}" + readout_cfg_uri_standalone: "consul-ini://{{ consul_endpoint }}/o2/components/{{config.ResolvePath('readout/' + run_type + '/any/readout-standalone-' + it)}}" + readout_cfg_uri_stfb: "consul-ini://{{ consul_endpoint }}/o2/components/{{config.Resolve('readout', run_type, 'any', 'readout-stfb-' + it)}}" + dd_discovery_ib_hostname: "{{ it }}-ib" # MUST be defined for all stfb and stfs + # dpl_workflow is set to _dpl_workflow if such an override exists + dpl_workflow: "{{ util.PrefixedOverride( 'dpl_workflow', strings.ToLower( inventory.DetectorForHost( it ) ) ) }}" + dpl_command: "{{ util.PrefixedOverride( 'dpl_command', strings.ToLower( inventory.DetectorForHost( it ) ) ) }}" + constraints: + - attribute: machine_id + value: "{{ it }}" + roles: + - name: "readout" + vars: + readout_cfg_uri: '{{dd_enabled == "true" ? readout_cfg_uri_stfb : readout_cfg_uri_standalone}}' + task: + load: readout + - name: dcs + enabled: "{{dcs_enabled == 'true'}}" + defaults: + ############################### + # DCS Panel + ############################### + dcs_detectors: "{{ detectors }}" + dcs_sor_parameters: !public + value: "{}" + type: string + label: "Global SOR parameters" + description: "additional parameters for the DCS SOR" + widget: editBox + panel: DCS + index: 2 + visibleif: $$dcs_enabled === "true" + dcs_eor_parameters: !public + value: "{}" + type: string + label: "Global EOR parameters" + description: "additional parameters for the DCS EOR" + widget: editBox + panel: DCS + index: 3 + visibleif: $$dcs_enabled === "true" + roles: + - name: pfr + call: + func: dcs.PrepareForRun() + trigger: before_CONFIGURE + await: after_CONFIGURE + timeout: "{{ dcs_pfr_timeout }}" + critical: false + - name: sor + call: + func: dcs.StartOfRun() + trigger: before_START_ACTIVITY + timeout: "{{ dcs_sor_timeout }}" + critical: true +` + role := new(aggregatorRole) + + It("should unmarshal successfully", func() { + err := yaml.Unmarshal([]byte(yamlTemplate), role) + Expect(err).NotTo(HaveOccurred()) + }) + + It("should create a complex tree correctly", func() { + Expect(role.GetName()).To(Equal("readout-dataflow")) + Expect(role.GetRoles()).To(HaveLen(2)) // GetRoles excludes iterator roles + Expect(role.Roles).To(HaveLen(3)) + Expect(role.GetRoles()[0].GetName()).To(Equal("readout-ctp")) + + Expect(role.Roles[1].GetName()).To(Equal("host-{{ it }}")) + Expect(role.Roles[1]).To(BeAssignableToTypeOf(&iteratorRole{})) + + Expect(role.GetRoles()[1]).To(BeAssignableToTypeOf(&aggregatorRole{})) + Expect(role.GetRoles()[1].GetRoles()).To(HaveLen(2)) + Expect(role.GetRoles()[1].GetRoles()[0]).To(BeAssignableToTypeOf(&callRole{})) + }) + + It("should set the variables correctly", func() { + Expect(role.GetDefaults().Raw()).To(HaveLen(3)) + Expect(role.GetRoles()[0].GetVars().Raw()).To(HaveLen(8)) + Expect(role.Roles[1].GetVars().Raw()).To(HaveLen(6)) + Expect(role.GetRoles()[1].GetVars().Raw()).To(HaveLen(0)) + + // CTP subtree + cvs, err := role.GetRoles()[0].GetRoles()[1].GetRoles()[0].ConsolidatedVarStack() + Expect(err).NotTo(HaveOccurred()) + Expect(cvs).To(HaveLen(14)) + + Expect(cvs["dd_enabled"]).To(Equal("true")) + Expect(cvs["readout_cfg_uri_stfb"]).To(Equal("consul-ini://{{ consul_endpoint }}/o2/components/{{config.Resolve('readout', run_type, 'any', 'readout-stfb-' + ctp_readout_host)}}")) + Expect(cvs["dd_discovery_ib_hostname"]).To(Equal("{{ ctp_readout_host }}-ib")) + Expect(cvs["ddsched_enabled"]).To(Equal("{{ epn_enabled == 'true' && dd_enabled == 'true' }}")) + + // DCS subtree + cvs, err = role.GetRoles()[1].GetRoles()[0].ConsolidatedVarStack() + Expect(err).NotTo(HaveOccurred()) + Expect(cvs).To(HaveLen(8)) + + Expect(cvs["dcs_enabled"]).To(Equal("false")) + Expect(cvs["dcs_detectors"]).To(Equal("{{ detectors }}")) + Expect(cvs["dcs_sor_parameters"]).To(Equal("{}")) + }) + }) + }) }) From a1f3ba9952cce5ae55033fdc2a51f7376bb68eed Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 29 Aug 2024 14:00:24 +0200 Subject: [PATCH 1989/2352] [build] Bump to v1.17.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 46ca65c03..fbb8723c4 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 16 -VERSION_PATCH := 1 +VERSION_MINOR := 17 +VERSION_PATCH := 0 From ddfd32d98fb027a63b9d6bc1459b38674cafe4bf Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Sep 2024 16:45:23 +0200 Subject: [PATCH 1990/2352] [core] Add IsTruthy/IsFalsy to template system API --- configuration/template/stack.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index df025ea99..9219dd73f 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -29,6 +29,7 @@ import ( "errors" "fmt" "io/ioutil" + "slices" "strconv" "strings" @@ -225,6 +226,16 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { out = strings.ToLower(in) return }, + "IsTruthy": func(in string) (out bool) { + toLower := strings.TrimSpace(strings.ToLower(in)) + out = slices.Contains([]string{"true", "yes", "y", "1", "on", "ok"}, toLower) + return + }, + "IsFalsy": func(in string) (out bool) { + toLower := strings.TrimSpace(strings.ToLower(in)) + out = len(toLower) == 0 || slices.Contains([]string{"false", "no", "n", "0", "off", "none"}, toLower) + return + }, } _ = mergo.Merge(&legacy, stringsMap) @@ -292,7 +303,7 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { "Dump": func(in, filepath string) string { err := ioutil.WriteFile(filepath, []byte(in), 0644) if err != nil { - log.WithError(err).Warn("could dump variable to file") + log.WithError(err).Warn("could not dump variable to file") } return in }, From d0fc313f2911c868b9e66012ccfaac0c3d82c20d Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Sep 2024 16:46:11 +0200 Subject: [PATCH 1991/2352] [docs] Document AliECS workflow/task template language --- docs/handbook/configuration.md | 361 ++++++++++++++++++++++++++++++++- 1 file changed, 356 insertions(+), 5 deletions(-) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index a3a2a89ca..5168e4a90 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -1,10 +1,159 @@ # Workflow Configuration -## Non-critical tasks +## The AliECS workflow template language +The AliECS workflow template language is a YAML-based language that allows +the user to define the structure of a data taking and processing activity. +The language is used to define the tasks that are part of the activity, +the data flow relationships between them, the behaviour of integrated services +with respect to the data taking state machine, and the conditions that +trigger these integrated service actions. +The language is designed to be human-readable and easy to understand, +while still being powerful enough to express complex workflows. -Any task in a workflow can be declared as non-critical. A non-critical task is a task that doesn't trigger a global environment ERROR in case of failure. The state of a non-critical task doesn't affect the environment state in any way. +To instantiate a data taking activity, or environment, two kinds of files +are needed: +* workflow templates +* task templates -To declare a task as non-critical, a line has to be added in the task role block within a workflow template file. Specifically, in the task section of such a task role (usually after the `load` statement), the line to add is `critical: false`, like in the following example: +Both kinds of files can be places in a git repository (by convention, +they must be places in their own directories named `workflows` and +`tasks` respectively), and AliECS can pull them directly from there. +This allows for version control and collaboration on the workflow +and task definitions. + +See [the ControlWorkflows repository](https://github.com/AliceO2Group/ControlWorkflows/) +for examples of workflow and task templates and their structure. +Also see [its README](https://github.com/AliceO2Group/ControlWorkflows/blob/master/README.md) +for information on specific variables and their meaning, as well as for +the DPL subworkflow loading system. + +## Workflow template structure + +A workflow template is a YAML file that contains a tree structure whose nodes +are called roles. This structure can be deeply nested, and each role can have +a set of variables that define its behaviour and that of its child roles. + +The root of the tree is the root role, which is the top level role in the +workflow template. + +All roles have a mandatory `name` attribute. The root role also has a +`description`. + +There are five kinds of roles in a workflow template: + +- Task roles: These roles represent tasks that are part of the workflow. +They must contain a `task` attribute. +- Call roles: These roles represent calls to integrated services. +They must contain a `call` attribute. +- Aggregator roles: These roles represent aggregations of other roles. +They must contain a `roles` attribute. +- Iterator roles: These roles expand into multiple instances based on +an iterator expression. +They must contain a `for` attribute, as well as a `roles` attribute. +Additionally, their `name` must be parametrized with the iterator variable +specified in the `for` block. +- Include roles: These roles include another workflow template as subtree. +They must contain an `include` attribute. + +Task, call and include roles may only appear as leaves in the tree, +while aggregator and iterator roles may not be leaves, and instead act as +containers of child roles. + +All roles may have an `enabled` attribute, which is a boolean that +determines whether the role is enabled or not. If a role is not enabled, +it is excluded from the workflow along with its children. + +All roles may also have `defaults` and `vars` attributes. Both `defaults` +and `vars` are key-value maps. The `defaults` map is used to set default +values, and values in `vars` override any `defaults` with the same key. +Values set in `defaults` also act as defaults for child roles, and +values set in `vars` also act as vars for child roles. +User-provided parameters further override anything set in `defaults` or +`vars`. + +All roles may have one or more `constraints` expressions, which restrict +the deployment of the role (or it child roles) to nodes that satisfy the +constraints. The constraints are specified as a list of expressions that +evaluate to true or false. The expressions are evaluated against the Mesos +attributes set on the nodes in the cluster. + +### Task roles + +Task roles represent tasks that are part of the workflow. They must contain +a `task` attribute, which contains a key that maps to a task template (i.e. +a distinct YAML file that defines how to run that specific task). + +There are two kinds of task roles: data flow task roles and hook task roles. + +Data flow task roles represent tasks that are part of the data flow of the +workflow. They usually contain attributes such as `bind` and `connect` that +define the data flow relationships between tasks. Besides `load`, which +references a task template, and `critical`, which determines whether the +task is critical to the data taking activity, they do not contain other +attributes under the `task` key. + +```yaml +- name: "stfb" + enabled: "{{stfb_standalone == 'false'}}" + vars: + dd_discovery_stfb_id: stfb-{{ it }}-{{ uid.New() }} + connect: + - name: readout + type: pull + target: "{{ Up(2).Path }}.readout:readout" + rateLogging: "{{ fmq_rate_logging }}" + bind: + - name: dpl-chan + type: push + rateLogging: "{{ fmq_rate_logging }}" + transport: shmem + addressing: ipc + sndBufSize: "4" + global: "readout-proxy-{{ it }}" + task: + load: stfbuilder +``` + +Hook task roles represent tasks that are not part of the data flow, but +instead are called at specific points in the environment state machine. +They have a well-defined moment when they must start and finish (with +respect to the environment state machine), and they are generally not +long-running tasks. Like data flow task roles, they may be `critical`. +They do not contain `bind` or `connect` attributes, and their `task` +attribute, besides `load`, contains additional attributes that define +the timing of the task. `trigger` is the moment when the task must start, +and `timeout` is the maximum time the task is allowed to run. Optionally, +`await` may be specified in addition to `trigger`, in which case the task +must finish by `await`. If `await` is not specified, it defaults to the +value of `trigger`, i.e. the task must start and finish within the same +state machine moment. + +For more information on the values of `trigger` and `await`, see below. + +```yaml +- name: fairmq-shmcleanup + enabled: "{{fmq_initial_shm_cleanup_enabled == 'true'}}" + vars: + shell_command: "source /etc/profile.d/o2.sh && O2_PARTITION={{environment_id}} O2_ROLE={{it}} o2-aliecs-shmcleaner" + user: root + task: + load: "shell-command" + trigger: before_DEPLOY + timeout: "{{ fmq_initial_shm_cleanup_timeout }}" + critical: false +``` + +#### Non-critical tasks + +Any task in a workflow can be declared as non-critical. A non-critical +task is a task that doesn't trigger a global environment ERROR in case +of failure. The state of a non-critical task doesn't affect the +environment state in any way. + +To declare a task as non-critical, a line has to be added in the task +role block within a workflow template file. Specifically, in the task +section of such a task role (usually after the `load` statement), the +line to add is `critical: false`, like in the following example: ```yaml roles: @@ -18,7 +167,7 @@ roles: In the absence of an explicit `critical` trait for a given task role, the assumed default value is `critical: true`. -## State machine callbacks +#### State machine callbacks moments The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). This is the order of callback execution upon a state transition: @@ -33,7 +182,33 @@ This is the order of callback execution upon a state transition: Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. -## Workflow hook calls +### Call roles + +Call roles represent calls to integrated services. They must contain a `call` +attribute, which contains a key that maps to an integration plugin function, +i.e. an API call that is made to an integrated service. + +The `call` map must contain a `func` key, which references the function to be +called. The functions available depend on which integration plugins are +loaded into the AliECS instance. +Like hook task roles, call roles have a well-defined moment when they must start +and finish (with respect to the environment state machine), and they are generally +not long-running operations. + +```yaml +- name: "reset" + call: + func: odc.Reset() + trigger: before_RESET + await: after_RESET + timeout: "{{ odc_reset_timeout }}" + critical: true +``` + +See [readout-dataflow](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) +for examples of call roles that reference a variety of integration plugins. + +#### Workflow hook call structure The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). @@ -62,8 +237,184 @@ Consider the following example: critical: true ``` +### Aggregator roles + +Aggregator roles represent aggregations of other roles. They must contain a +`roles` attribute, which is a list of child roles. + +For the purposes of the state machine, they represent their children, and +any `defaults` or `vars` set on an aggregator role are passed down to its +children (which may in turn override them). + +```yaml +- name: "readout" + vars: + readout_var: 'this value will be overridden by the 1st child role' + roles: + - name: "readout" + vars: + readout_var: 'var-value' + task: + load: readout + - name: "stfb" + vars: + stfb_var: 'var-value' + task: + load: stfbuilder +``` + +### Iterator roles + +Iterator roles expand into multiple instances based on an iterator expression. +They must contain a `for` attribute, which is an expression that evaluates to +a list of values. The `name` attribute must be parametrized with the iterator +variable specified in the `for` block. + +```yaml +- name: host-{{ it }} + for: + range: "{{ hosts }}" + var: it + constraints: + - attribute: machine_id + value: "{{ it }}" + roles: + - name: "readout" + task: + load: readout +``` + +### Include roles + +Include roles include another workflow template as subtree. They must contain +an `include` attribute, which is the path to the workflow template file to +include. + +```yaml +- name: dpl + enabled: "{{ qcdd_enabled == 'true' }}" + include: qc-daq +``` + +### Template expressions + +The AliECS workflow template language supports expressions in the form of +`{{ expression }}`. These expressions are evaluated by the AliECS core +when the workflow is instantiated, and the result is used in place of the +expression. + +See [`antonmedv/expr`](https://github.com/antonmedv/expr) for the full +documentation on the expression syntax. + +AliECS extends the syntax with +additional functions and variables that are available in the context of +the workflow template evaluation. + +#### Configuration access functions + +* `config.Get(path string) string` - Returns the template-processed configuration payload at the given Apricot path. +* `config.Resolve(component string, runType string, roleName string, entryKey string) string` - Returns the resolved path to a configuration entry for the given component, run type, role name, and entry key. +* `config.ResolvePath(path string) string` - Returns the resolved path to a configuration entry for the given path. + +#### Inventory access functions + +* `inventory.DetectorForHost(hostname string) string` - Returns the detector name for the specified host. +* `inventory.DetectorsForHosts(hosts string) string` - Returns a JSON-format list of detector names for the specified list of hosts (also expected to be JSON-format). +* `inventory.CRUCardsForHost(hostname string) string` - Returns a JSON-format list of CRUs for the specified host. +* `inventory.EndpointsForCRUCard(hostname string, cardSerial string) string` - Returns a JSON-format list of endpoints for the specified CRU card. + +#### Runtime KV map access functions + +* `runtime.Get(component string, key string) string` - Returns from Apricot the value of the key in the runtime KV map of the specified component. +* `runtime.Set(component string, key string, value string) string` - Sets in Apricot the value of the key into the runtime KV map of the specified component. + +#### DPL subworkflow just-in-time generator functions + +* `dpl.Generate` +* `dpl.GenerateFromUri` +* `dpl.GenerateFromUriOrFallbackToTemplate` + +#### String functions + +* `strings.Atoi`, `strings.Itoa`, `strings.TrimQuotes`, `strings.TrimSpace`, `strings.ToUpper`, `strings.ToLower` - See the [Go strings package](https://golang.org/pkg/strings/) for more information. +* `strings.IsTruthy(in string) bool` - Used in condition evaluation. Returns `true` if the string is one of `"true"`, `"yes"`, `"y"`, `"1"`, `"on"`, `"ok"`, otherwise `false`. +* `strings.IsFalsy(in string) bool` - Used in condition evaluation. Returns `true` if the string is empty, or one of `"false"`, `"no"`, `"n"`, `"0"`, `"off"`, `"none"`, otherwise `false`. + +#### JSON manipulation functions + +* `json.Unmarshal(in string) object` (with alias `json.Deserialize`) - Unmarshals a JSON string into an object. +* `json.Marshal(in object) string` (with alias `json.Serialize`) - Marshals an object into a JSON string. + +#### UID generation function + +* `uid.New() string` - Returns a new unique identifier string, same format as AliECS environment IDs. + +#### General utility functions + +* `util.PrefixedOverride(varname string, prefix string) string` - Looks in the current variables stack for a variable with key `varname`, as well as for a variable with key `prefix_varname`. If the latter exists, it returns its value, otherwise it returns the value of `varname` as fallback. If neither exist, it returns `""`. Note that this function may return either the empty string or other falsy values such as `"none"`, so `strings.IsFalsy` should be used to check the output if used in a condition. +* `util.Dump(in string, filepath string) string` - Dumps the input string to a file at the specified path. Returns the string itself. +* `util.SuffixInRange(input string, prefix string, idMinStr string, idMaxStr string) string` + # Task Configuration +## Task template structure + +A task template is a YAML file that describes the configuration of a task, +down to the command line arguments and environment variables that are passed +to the task on startup. + +These parameters and variables can be static, or they can be dynamic, pulled +from the GUI, the AliECS `vars` and `defaults` defined in the workflow template, +or from the O² Configuration defaults (in order of importance, from less to more +"defaulty"). + +A task template must contain a `name` attribute, which is the name of the task, +that is then referenced by a task role in a workflow template. + +Task templates can define non-data flow tasks, in which case they only specify +the command to run (for the most part), or they can be data flow tasks, in which +case they also specify the available inbound connections with a `bind` statement. + +Data flow tasks can also specify additional parameters in a `properties` map, +which are set during the `CONFIGURE` transition (via the FairMQ plugin interface +or via the OCC library, depending on the task control mechanism). + +```yaml +name: readout +defaults: + readout_cfg_uri: "consul-ini://{{ consul_endpoint }}/o2/components/readout/ANY/any/readout-standalone-{{ task_hostname }}" + user: flp + log_task_stdout: none + log_task_stderr: none + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && + o2-readout-exe + _plain_cmdline: "{{ o2_install_path }}/bin/o2-readout-exe" +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "{{ fmq_rate_logging }}" + addressing: ipc + transport: shmem +properties: {} +command: + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + env: + - O2_DETECTOR={{ detector }} + - O2_PARTITION={{ environment_id }} + user: "{{ user }}" + arguments: + - "{{ readout_cfg_uri }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" +``` + ## Variables pushed to controlled tasks FairMQ and non-FairMQ tasks may receive configuration values from a variety of sources, both from their own user code (for example by querying Apricot with or without the O² Configuration library) as well as via AliECS. From 157f3b389b73f11db222e1bf18fd2a118c458f5f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 2 Sep 2024 13:54:19 +0200 Subject: [PATCH 1992/2352] [core] Emit environment events from CreateAutoEnvironment --- core/environment/manager.go | 44 +++++++++++++++++++++++++++++++++++++ core/server.go | 11 +++++++++- 2 files changed, 54 insertions(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 7d3fc7b3f..950629c1e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1158,6 +1158,21 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } } + lastRequestUser := &evpb.User{} + lastRequestUserJ, ok := userVars["last_request_user"] + if ok { + _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) + } + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "instantiating", + LastRequestUser: lastRequestUser, + }) + env, err := newEnvironment(envUserVars, newId) newEnvId := uid.NilID() if err == nil && env != nil { @@ -1173,6 +1188,15 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "partition": newEnvId.String(), }).Info("creating new automatic environment") + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "running hooks", + LastRequestUser: lastRequestUser, + }) + env.addSubscription(sub) defer env.closeStream() @@ -1193,6 +1217,15 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str Warn("parse workflow public info failed.") } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "CREATE", + Message: "loading workflow", + LastRequestUser: lastRequestUser, + }) + env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars, env.BaseConfigStack) if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) @@ -1202,6 +1235,17 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str env.Public, env.Description, _ = parseWorkflowPublicInfo(workflowPath) + cvs, _ := env.Workflow().ConsolidatedVarStack() + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: env.CurrentState(), + Transition: "CREATE", + TransitionStep: "after_CREATE", + Message: "workflow loaded", + Vars: cvs, // we push the full var stack of the root role in the workflow loaded event + LastRequestUser: lastRequestUser, + }) + log.WithField("method", "CreateAutoEnvironment"). WithField("level", infologger.IL_Devel). Debug("envman write lock") diff --git a/core/server.go b/core/server.go index c80659c70..880b6b142 100644 --- a/core/server.go +++ b/core/server.go @@ -1158,7 +1158,16 @@ func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoE m.envStreams.add(request.GetId(), ch) sub := environment.SubscribeToStream(ch) id := uid.New() - go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), request.GetVars(), id, sub) + + inputUserVars := request.GetVars() + if len(inputUserVars) == 0 { + inputUserVars = make(map[string]string) + } + // we store the last known request user in the environment + lastRequestUserJ, _ := json.Marshal(request.RequestUser) + inputUserVars["last_request_user"] = string(lastRequestUserJ[:]) + + go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), inputUserVars, id, sub) r := &pb.NewAutoEnvironmentReply{} return r, nil } From 89b91fee5731f59b74c2e531ccf2b824b49dfbce Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 3 Sep 2024 16:03:47 +0200 Subject: [PATCH 1993/2352] [build] Bump to v1.18.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fbb8723c4..21185a2d7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 17 +VERSION_MINOR := 18 VERSION_PATCH := 0 From 89386ba26e4071c4a0942402535a6c6b7d45e786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 6 Sep 2024 16:17:39 +0200 Subject: [PATCH 1994/2352] Added locking of AgentCache for Count function --- core/task/agentcache.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/task/agentcache.go b/core/task/agentcache.go index a248c0db8..3a7820e27 100644 --- a/core/task/agentcache.go +++ b/core/task/agentcache.go @@ -75,5 +75,7 @@ func (ac *AgentCache) Count() (count int) { if ac == nil || ac.store == nil { return 0 } + ac.mu.RLock() + defer ac.mu.RUnlock() return len(ac.store) -} \ No newline at end of file +} From 5ff7ecc46b1970e3277abc53ce75cc167105d9ae Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 18 Sep 2024 11:33:45 +0200 Subject: [PATCH 1995/2352] [core] OCTRL-921 Add env ID to DCS SOR and EOR requests --- core/integration/dcs/plugin.go | 12 +- core/integration/dcs/protos/dcs.pb.go | 299 +++++++++++---------- core/integration/dcs/protos/dcs.proto | 3 + core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- 4 files changed, 171 insertions(+), 145 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 500fae2a8..50ad05268 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1238,9 +1238,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.SorRequest{ - RunType: rt, - RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + RunType: rt, + RunNumber: int32(runNumber64), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + PartitionId: envId, } for i, dcsDet := range dcsDetectors { ecsDet := dcsToEcsDetector(dcsDet) @@ -1770,8 +1771,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.EorRequest{ - RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + RunNumber: int32(runNumber64), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + PartitionId: envId, } for i, dcsDet := range dcsDetectors { ecsDet := dcsToEcsDetector(dcsDet) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index ee8fa693b..d3c0c78f1 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v5.26.1 // source: protos/dcs.proto package dcspb @@ -849,9 +849,10 @@ type SorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + PartitionId string `protobuf:"bytes,4,opt,name=partitionId,proto3" json:"partitionId,omitempty"` } func (x *SorRequest) Reset() { @@ -907,6 +908,13 @@ func (x *SorRequest) GetRunNumber() int32 { return 0 } +func (x *SorRequest) GetPartitionId() string { + if x != nil { + return x.PartitionId + } + return "" +} + // An EorRequest encapsulates a list of detector-specific request payloads, // plus a runNumber to identify the run being stopped. type EorRequest struct { @@ -914,8 +922,9 @@ type EorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + PartitionId string `protobuf:"bytes,4,opt,name=partitionId,proto3" json:"partitionId,omitempty"` } func (x *EorRequest) Reset() { @@ -964,6 +973,13 @@ func (x *EorRequest) GetRunNumber() int32 { return 0 } +func (x *EorRequest) GetPartitionId() string { + if x != nil { + return x.PartitionId + } + return "" +} + // A stream of Event objects is returned by SOR and EOR calls. // Most fields are optional and filled as needed, depending on the type of request. type RunEvent struct { @@ -1223,7 +1239,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0xb1, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -1232,138 +1248,143 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x08, - 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, - 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x22, 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, - 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0xa2, 0x01, 0x0a, 0x09, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, - 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, - 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, - 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, - 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, - 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, - 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, - 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, - 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, - 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, - 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, - 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, - 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, - 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, - 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, - 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, - 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, - 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, - 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, - 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, - 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, - 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, - 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, - 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, - 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, - 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, - 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, - 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, - 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, - 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, - 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, - 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, - 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, - 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, - 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, - 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, - 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, - 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, - 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, - 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, - 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, - 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, + 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x0a, 0x14, + 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x48, 0x0a, 0x0b, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, + 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, + 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, + 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, + 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, + 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, 0x0d, 0x0a, 0x09, + 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, 0x01, 0x0a, 0x08, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, + 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, + 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, + 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, + 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, + 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, + 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, + 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, + 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, + 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, + 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xcd, 0x02, + 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, + 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, + 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, + 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, + 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, + 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, + 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, + 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, + 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, + 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, + 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, + 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, + 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x46, 0x52, 0x5f, + 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x50, + 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x11, + 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x2a, 0xf8, 0x02, + 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, + 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, + 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, + 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, + 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, + 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, + 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, + 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, + 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, + 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, + 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, + 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, + 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, + 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, + 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, + 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, + 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, + 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, + 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, + 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, + 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, + 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, + 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, + 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, + 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, + 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index e99308e24..91d1a207d 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -150,6 +150,7 @@ message SorRequest { repeated DetectorOperationRequest detectors = 1; RunType runType = 2; // default: NULL_RUNTYPE, should probably never be sent int32 runNumber = 3; + string partitionId = 4; } // An EorRequest encapsulates a list of detector-specific request payloads, @@ -157,6 +158,8 @@ message SorRequest { message EorRequest { repeated DetectorOperationRequest detectors = 1; int32 runNumber = 2; + reserved 3; + string partitionId = 4; } // A stream of Event objects is returned by SOR and EOR calls. diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index b6a7ab51a..7619406c4 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v5.26.1 // source: protos/dcs.proto package dcspb From 528e27aa75f0385126c4148e62101b45b671bf5b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 18 Sep 2024 16:59:24 +0200 Subject: [PATCH 1996/2352] Revert "[core] OCTRL-921 Add env ID to DCS SOR and EOR requests" This reverts commit 5ff7ecc46b1970e3277abc53ce75cc167105d9ae. --- core/integration/dcs/plugin.go | 12 +- core/integration/dcs/protos/dcs.pb.go | 299 ++++++++++----------- core/integration/dcs/protos/dcs.proto | 3 - core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- 4 files changed, 145 insertions(+), 171 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 50ad05268..500fae2a8 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1238,10 +1238,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.SorRequest{ - RunType: rt, - RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), - PartitionId: envId, + RunType: rt, + RunNumber: int32(runNumber64), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), } for i, dcsDet := range dcsDetectors { ecsDet := dcsToEcsDetector(dcsDet) @@ -1771,9 +1770,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // Preparing the per-detector request payload in := dcspb.EorRequest{ - RunNumber: int32(runNumber64), - Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), - PartitionId: envId, + RunNumber: int32(runNumber64), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), } for i, dcsDet := range dcsDetectors { ecsDet := dcsToEcsDetector(dcsDet) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index d3c0c78f1..ee8fa693b 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v5.26.1 +// protoc v4.25.1 // source: protos/dcs.proto package dcspb @@ -849,10 +849,9 @@ type SorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent - RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - PartitionId string `protobuf:"bytes,4,opt,name=partitionId,proto3" json:"partitionId,omitempty"` + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunType RunType `protobuf:"varint,2,opt,name=runType,proto3,enum=dcs.RunType" json:"runType,omitempty"` // default: NULL_RUNTYPE, should probably never be sent + RunNumber int32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` } func (x *SorRequest) Reset() { @@ -908,13 +907,6 @@ func (x *SorRequest) GetRunNumber() int32 { return 0 } -func (x *SorRequest) GetPartitionId() string { - if x != nil { - return x.PartitionId - } - return "" -} - // An EorRequest encapsulates a list of detector-specific request payloads, // plus a runNumber to identify the run being stopped. type EorRequest struct { @@ -922,9 +914,8 @@ type EorRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - PartitionId string `protobuf:"bytes,4,opt,name=partitionId,proto3" json:"partitionId,omitempty"` + Detectors []*DetectorOperationRequest `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + RunNumber int32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` } func (x *EorRequest) Reset() { @@ -973,13 +964,6 @@ func (x *EorRequest) GetRunNumber() int32 { return 0 } -func (x *EorRequest) GetPartitionId() string { - if x != nil { - return x.PartitionId - } - return "" -} - // A stream of Event objects is returned by SOR and EOR calls. // Most fields are optional and filled as needed, depending on the type of request. type RunEvent struct { @@ -1239,7 +1223,7 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0xb1, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -1248,143 +1232,138 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0xd7, 0x02, 0x0a, 0x08, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x74, 0x79, 0x70, - 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x28, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x64, 0x63, - 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, - 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x42, 0x0a, 0x14, - 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x22, 0x48, 0x0a, 0x0b, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x64, - 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0xa2, 0x01, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, 0x52, 0x54, 0x42, 0x45, 0x41, - 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, - 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, 0x0d, 0x0a, 0x09, 0x45, 0x4f, - 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, - 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, 0x0d, 0x0a, 0x09, - 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, 0x2a, 0xbf, 0x01, 0x0a, 0x08, - 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, - 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x43, - 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, - 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, - 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, - 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, - 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, - 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, 0x53, 0x10, 0x0b, 0x12, 0x07, - 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, 0x10, 0x0d, - 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, 0x5a, 0x44, 0x43, - 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, 0x0a, 0x03, 0x44, - 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, 0x2a, 0xcd, 0x02, - 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, - 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, - 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, - 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, - 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, - 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, - 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, - 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, - 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, - 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, - 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, - 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x46, 0x52, 0x5f, - 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x50, - 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x11, - 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x2a, 0xf8, 0x02, - 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, - 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, - 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, - 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, - 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, - 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, - 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, - 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, - 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, - 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, - 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, - 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, - 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, - 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, - 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, - 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, - 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, - 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, - 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, - 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, - 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, - 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, - 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, - 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, - 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, - 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x22, 0x67, 0x0a, 0x0a, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3b, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xd7, 0x02, 0x0a, 0x08, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x09, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x64, 0x63, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x74, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x4c, 0x0a, 0x0f, 0x65, + 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x1a, 0x42, 0x0a, 0x14, 0x45, 0x78, 0x74, 0x72, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x22, 0x48, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, + 0x69, 0x78, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2a, 0xa2, 0x01, 0x0a, 0x09, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, + 0x4c, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x41, + 0x52, 0x54, 0x42, 0x45, 0x41, 0x54, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x02, + 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x43, 0x4b, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, + 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x14, 0x12, + 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, + 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, + 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, + 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, + 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, + 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, + 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, + 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, + 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, + 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, + 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, + 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, + 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, + 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, + 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, + 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, + 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, + 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, + 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, + 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, + 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, + 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, + 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, + 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, + 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, + 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, + 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, + 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, + 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, + 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, + 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, + 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, + 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, + 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, + 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, + 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, + 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, + 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, + 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, + 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index 91d1a207d..e99308e24 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -150,7 +150,6 @@ message SorRequest { repeated DetectorOperationRequest detectors = 1; RunType runType = 2; // default: NULL_RUNTYPE, should probably never be sent int32 runNumber = 3; - string partitionId = 4; } // An EorRequest encapsulates a list of detector-specific request payloads, @@ -158,8 +157,6 @@ message SorRequest { message EorRequest { repeated DetectorOperationRequest detectors = 1; int32 runNumber = 2; - reserved 3; - string partitionId = 4; } // A stream of Event objects is returned by SOR and EOR calls. diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 7619406c4..b6a7ab51a 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v4.25.1 // source: protos/dcs.proto package dcspb From 0a11513b43d18321c4dcbc32bc814e8f4d2bdeb3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 12 Sep 2024 09:19:33 +0200 Subject: [PATCH 1997/2352] [core] improve a few logs - "environment" is changed to "partition", so IL recognizes it correctly - we log the name of the attempted transition if it is delayed due to other transition already taking place - we log when we resume a delayed transition or teardown. - we log what was the state attempted to be updated when the task is not in roster --- core/environment/environment.go | 5 ++++- core/environment/manager.go | 9 ++++++--- core/task/manager.go | 1 + 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 01a4116eb..f568e0f30 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -959,8 +959,11 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map func (env *Environment) TryTransition(t Transition) (err error) { if !env.transitionMutex.TryLock() { log.WithField("partition", env.id.String()). - Warnf("environment transition attempt delayed: transition '%s' in progress. waiting for completion or failure", env.currentTransition) + Warnf("environment transition '%s' attempt delayed: transition '%s' in progress. waiting for completion or failure", t.eventName(), env.currentTransition) env.transitionMutex.Lock() + log.WithField("level", infologger.IL_Support). + WithField("partition", env.id.String()). + Infof("environment transition '%s' attempt resumed", t.eventName()) } defer env.transitionMutex.Unlock() diff --git a/core/environment/manager.go b/core/environment/manager.go index 950629c1e..f4ead298c 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -431,7 +431,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] goErrorKillDestroy := func(op string) { envState := env.CurrentState() log.WithField("state", envState). - WithField("environment", env.Id().String()). + WithField("partition", env.Id().String()). WithError(err). Warnf("auto-transitioning environment failed %s, cleanup in progress", op) @@ -586,6 +586,9 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error log.WithField("partition", environmentId.String()). Warnf("environment teardown attempt delayed: transition '%s' in progress. waiting for completion or failure", env.currentTransition) env.transitionMutex.Lock() + log.WithField("level", infologger.IL_Support). + WithField("partition", environmentId.String()). + Infof("environment teardown attempt resumed") } defer env.transitionMutex.Unlock() @@ -1212,7 +1215,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) if err != nil { log.WithField("public info", env.Public). - WithField("environment", env.Id().String()). + WithField("partition", env.Id().String()). WithError(err). Warn("parse workflow public info failed.") } @@ -1272,7 +1275,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envState := env.CurrentState() env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: fmt.Sprintf("environment is in %s, handling ERROR", envState), EnvironmentID: env.Id().String(), Error: err}) log.WithField("state", envState). - WithField("environment", env.Id().String()). + WithField("partition", env.Id().String()). WithError(err). Warnf("auto-transitioning environment failed %s, cleanup in progress", op) diff --git a/core/task/manager.go b/core/task/manager.go index 6bf956e7f..587f6f7f8 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -938,6 +938,7 @@ func (m *Manager) updateTaskState(taskId string, state string) { taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). + WithField("state", state). Warn("attempted state update of task not in roster") return } From e20e0f68b14456ad4af6cad97f8a70f20f629785 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 12 Sep 2024 09:50:34 +0200 Subject: [PATCH 1998/2352] OCTRL-920 [core] invalidating auto-stop lets the goroutine exit The goroutine for performing would never exit in case that the auto-stop would be invalidated. Consequently, it would be stuck indefinitely, surpassing the environment's lifetime. I don't think this was causing any trouble except of just leaking goroutines and obfuscating the state of the application. We also invalidate the auto-stop in case of going to ERROR, so we do not trigger a spurious transition attempt when it's pointless to do so. --- core/environment/environment.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index f568e0f30..551714279 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -88,7 +88,8 @@ type Environment struct { callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap currentTransition string - autoStopTimer *time.Timer + autoStopTimer *time.Timer + autoStopCancelFcn context.CancelFunc } func (env *Environment) NotifyEvent(e event.DeviceEvent) { @@ -593,6 +594,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, log.WithField("partition", envId.String()). Debug("O2 End Completion time already set before after_GO_ERROR") } + env.invalidateAutoStopTransition() } errHooks = errors.Join(errHooks, env.handleHooksWithPositiveWeights(env.Workflow(), trigger)) @@ -1403,6 +1405,8 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t } env.autoStopTimer = time.NewTimer(autoStopDuration) + ctx, cancel := context.WithCancel(context.Background()) + env.autoStopCancelFcn = cancel go func() { select { case <-env.autoStopTimer.C: @@ -1423,6 +1427,10 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t } return } + case <-ctx.Done(): + log.WithField("partition", env.id). + WithField("run", env.currentRunNumber). + Debugf("Scheduled auto stop transition was cancelled") } }() @@ -1437,7 +1445,10 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t func (env *Environment) invalidateAutoStopTransition() { // Only try to stop an initialized timer - if env.autoStopTimer != nil { - env.autoStopTimer.Stop() + if env.autoStopTimer == nil { + return + } + if env.autoStopTimer.Stop() && env.autoStopCancelFcn != nil { + env.autoStopCancelFcn() } } From a5b0ccf32fb1343673b9d0144b5589b3fe8df5d6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 13 Sep 2024 12:07:27 +0200 Subject: [PATCH 1999/2352] [core] OCTRL-920 safer concurrency in KillTasks Parallel attempts to kill tasks were found to be the primary cause for stuck auto-environments. In particular, it was due to channels in ackKilledTasks (and handling them) not expecting multiple listeners, so either one of the two kill acknowledgments would be stuck waiting for the acknowledgment to be received, or the other side, waiting for acknowledgment would never get it. It would cause KillTasks to be stuck indefinitely, which blocks the main auto-environment code-path. --- core/task/manager.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 587f6f7f8..95b10a262 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -100,6 +100,7 @@ type Manager struct { schedulerState *schedulerState internalEventCh chan<- event.Event ackKilledTasks *safeAcks + killTasksMu sync.Mutex // to avoid races when attempting to kill the same tasks in different goroutines } func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *Manager, err error) { @@ -1042,7 +1043,7 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { taskCanBeKilledFilter := func(t *Task) bool { - if t.IsLocked() { + if t.IsLocked() || m.ackKilledTasks.contains(t.taskId) { return false } for _, id := range taskIds { @@ -1053,13 +1054,18 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err return false } + if !m.killTasksMu.TryLock() { + log.WithField("level", infologger.IL_Support).Warnf("Scheduling killing tasks was delayed until another goroutine finishes doing so") + m.killTasksMu.Lock() + log.WithField("level", infologger.IL_Support).Infof("Scheduling killing tasks is resumed") + } // TODO: use grouping instead of 2 passes of filtering for performance toKill := m.roster.filtered(taskCanBeKilledFilter) - unkillable := m.roster.filtered(func(t *Task) bool { return !taskCanBeKilledFilter(t) }) if len(toKill) < len(taskIds) { + unkillable := m.roster.filtered(func(t *Task) bool { return !taskCanBeKilledFilter(t) }) log.WithField("taskIds", strings.Join(unkillable.GetTaskIds(), ", ")). - Debugf("some tasks cannot be physically killed (already dead?), will instead only be removed from roster") + Debugf("some tasks cannot be physically killed (already dead or being killed in another goroutine?), will instead only be removed from roster") } for _, id := range toKill.GetTaskIds() { @@ -1067,6 +1073,8 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } killed, running, err = m.doKillTasks(toKill) + m.killTasksMu.Unlock() + for _, id := range killed.GetTaskIds() { ack, ok := m.ackKilledTasks.getValue(id) if ok { @@ -1088,6 +1096,7 @@ func (m *Manager) doKillTasks(tasks Tasks) (killed Tasks, running Tasks, err err inactiveTasks := tasks.Filtered(func(task *Task) bool { return task.status != ACTIVE }) + // Remove from the roster the tasks which are also in the inactiveTasks list to delete m.roster.updateTasks(m.roster.filtered(func(task *Task) bool { return !inactiveTasks.Contains(func(t *Task) bool { From 898916205e3d153a3435549e1b2153b2ce38ca0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 18 Sep 2024 17:00:46 +0200 Subject: [PATCH 2000/2352] creating copy of ExecutorInfo for each mesos offer so there is not race condition --- core/task/scheduler.go | 2 +- core/task/schedulerstate.go | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index a126eb684..190f66e66 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -1526,7 +1526,7 @@ func makeTaskForMesosResources( newTaskId := taskPtr.GetTaskId() - executor := state.executor + executor := state.CopyExecutor() executor.ExecutorID.Value = taskPtr.GetExecutorId() envIdS := envId.String() diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index e35d5d1e3..992f67c02 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -94,7 +94,6 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( viper.GetFloat64("executorMemory")), viper.GetDuration("mesosJobRestartDelay"), ) - if err != nil { return nil, err } @@ -161,11 +160,10 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( }, "leave_CONNECTED": func(_ context.Context, e *fsm.Event) { log.Debug("leave_CONNECTED") - }, "before_NEW_ENVIRONMENT": func(_ context.Context, e *fsm.Event) { log.Debug("before_NEW_ENVIRONMENT") - e.Async() //transition frozen until the corresponding fsm.Transition call + e.Async() // transition frozen until the corresponding fsm.Transition call }, "enter_CONNECTED": func(_ context.Context, e *fsm.Event) { log.Debug("enter_CONNECTED") @@ -208,10 +206,25 @@ func (state *schedulerState) Start(ctx context.Context) { if state.err != nil { err = state.err log.WithField("error", err.Error()).Debug("scheduler quit with error, main state machine GO_ERROR") - state.sm.Event(context.Background(), "GO_ERROR", err) //TODO: use error information in GO_ERROR + state.sm.Event(context.Background(), "GO_ERROR", err) // TODO: use error information in GO_ERROR } else { log.Debug("scheduler quit, no errors") state.sm.Event(context.Background(), "EXIT") } }() } + +func (state *schedulerState) CopyExecutor() *mesos.ExecutorInfo { + executorInfoCopy := &mesos.ExecutorInfo{} + + marshaled, err := state.executor.Marshal() + if err != nil { + return nil + } + + err = executorInfoCopy.Unmarshal(marshaled) + if err != nil { + return nil + } + return executorInfoCopy +} From 09ec975dab094b0c13c279b6da581ee14920d32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 18 Sep 2024 21:19:24 +0200 Subject: [PATCH 2001/2352] amend! creating copy of ExecutorInfo for each mesos offer so there is not race condition creating copy of ExecutorInfo for each mesos offer so there is not race condition --- core/task/scheduler.go | 2 +- core/task/schedulerstate.go | 16 +++------------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 190f66e66..eeb2103f1 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -1526,7 +1526,7 @@ func makeTaskForMesosResources( newTaskId := taskPtr.GetTaskId() - executor := state.CopyExecutor() + executor := state.CopyExecutorInfo() executor.ExecutorID.Value = taskPtr.GetExecutorId() envIdS := envId.String() diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 992f67c02..9d783b36b 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/schedutil" + "github.com/gogo/protobuf/proto" "github.com/looplab/fsm" mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/mesos/mesos-go/api/v1/lib/backoff" @@ -214,17 +215,6 @@ func (state *schedulerState) Start(ctx context.Context) { }() } -func (state *schedulerState) CopyExecutor() *mesos.ExecutorInfo { - executorInfoCopy := &mesos.ExecutorInfo{} - - marshaled, err := state.executor.Marshal() - if err != nil { - return nil - } - - err = executorInfoCopy.Unmarshal(marshaled) - if err != nil { - return nil - } - return executorInfoCopy +func (state *schedulerState) CopyExecutorInfo() *mesos.ExecutorInfo { + return proto.Clone(state.executor).(*mesos.ExecutorInfo) } From fad9033fa1f80550b4fd1c1eff9ef67e02f2dc38 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 19 Sep 2024 11:15:11 +0200 Subject: [PATCH 2002/2352] [build] Bump to v1.19.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 21185a2d7..c8f51c922 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 18 +VERSION_MINOR := 19 VERSION_PATCH := 0 From cca1feca065ae2f89ff81591ef32f4c0b0a6b8e6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 20 Sep 2024 10:44:45 +0200 Subject: [PATCH 2003/2352] [configuration] Use process templates in JIT by default when using apricot OCTRL-925 --- configuration/componentcfg/query.go | 2 +- configuration/template/dplutil.go | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/configuration/componentcfg/query.go b/configuration/componentcfg/query.go index 95cab34af..a6d8e2333 100644 --- a/configuration/componentcfg/query.go +++ b/configuration/componentcfg/query.go @@ -175,7 +175,7 @@ type QueryParameters struct { func NewQueryParameters(parameters string) (p *QueryParameters, err error) { p = &QueryParameters{ - ProcessTemplates: false, + ProcessTemplates: true, VarStack: make(map[string]string), } parameters = strings.TrimSpace(parameters) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 752a8e010..54a07101b 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -88,8 +88,14 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo if err != nil { return "", fmt.Errorf("JIT could not create a query out of path '%s'. error: %w", consulKey[1], err) } - // parse parameters if they are present + queryParams := &componentcfg.QueryParameters{ProcessTemplates: false, VarStack: nil} + // Configuration library adds "process=true" if apricot backend is used and "process" is missing, + // thus using apricot backend with no parameters always implies an expectation to process templates. + if strings.HasPrefix(uri, "apricot") { + queryParams.ProcessTemplates = true + } + // parse parameters if they are present if len(consulKeyTokens) == 2 { queryParams, err = componentcfg.NewQueryParameters(consulKeyTokens[1]) if err != nil { From 8832cd879298f6959ae4a82d14c23e3be278919b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 20 Sep 2024 11:18:15 +0200 Subject: [PATCH 2004/2352] [core] improve logging in JIT More user-friendly logs, include env id in the fields, be explicit about generating or reusing the templates. --- configuration/template/dplutil.go | 41 +++++++++++++++++++++++-------- configuration/template/stack.go | 4 +-- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index 54a07101b..efdf4ef5b 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -28,6 +28,7 @@ import ( "crypto/sha1" "encoding/hex" "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" "os" "os/exec" "path/filepath" @@ -70,7 +71,9 @@ func extractConfigURIs(dplCommand string) (uris []string) { // jitDplGenerate takes a resolved dplCommand as an argument, // generates the corresponding tasks and workflow // and returns the resolved dplWorkflow as a string -func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { +func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string, userWfName string) (jitWorkflowName string, err error) { + envId, _ := varStack["environment_id"] + var payloads []string configURIs := extractConfigURIs(dplCommand) @@ -119,7 +122,9 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo o2VersionCmd := exec.Command("bash", "-c", "rpm -qa o2-O2 o2-QualityControl") o2VersionOut, err := o2VersionCmd.Output() if err != nil { - log.Warn("JIT couldn't get O2 / QualityControl version: " + err.Error()) + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + Warn("JIT couldn't get O2 / QualityControl version: " + err.Error()) } // Get the env vars necessary for JIT @@ -145,9 +150,16 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo // Only generate new tasks & workflows if the files don't exist // If they exist, hash comparison guarantees validity if _, err = os.Stat(filepath.Join(workflowRepo.GetCloneDir(), "workflows", jitWorkflowName+".yaml")); err == nil { - log.Tracef("Workflow '%s' already exists, skipping DPL creation", jitWorkflowName) + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("hash", jitWorkflowName). + Infof("Reusing JIT workflow templates for '%s'", userWfName) return jitWorkflowName, nil } + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("hash", jitWorkflowName). + Infof("Generating JIT workflow templates for '%s'", userWfName) // TODO: Before executing we need to check that this is a valid dpl command // If not, any command may be injected on the aliecs host @@ -163,17 +175,23 @@ func jitDplGenerate(confSvc ConfigurationService, varStack map[string]string, wo var dplOut []byte dplOut, err = dplCmd.CombinedOutput() if err != nil { - log.Errorf("failed to run DPL command due to error '%s'", err.Error()) - log.Errorf("failed DPL command output: %s", string(dplOut)) + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + Errorf("failed to run DPL command due to error '%s'", err.Error()) + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + Errorf("failed DPL command output: %s", string(dplOut)) return "", fmt.Errorf("failed to run DPL command due to error '%w'. See FLP Infologger for DPL command output", err) } else { - log.Trace("DPL command out: " + string(dplOut)) + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + Trace("DPL command out: " + string(dplOut)) } return jitWorkflowName, nil } -func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string) (jitWorkflowName string, err error) { +func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommand string, userWfName string) (jitWorkflowName string, err error) { if dplCommand == "none" { return "", fmt.Errorf("dplCommand is 'none'") } @@ -185,7 +203,7 @@ func generateDplSubworkflow(confSvc ConfigurationService, varStack map[string]st return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } - return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh &&"+dplCommand) + return jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh &&"+dplCommand, userWfName) } func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[string]string, workflowRepo repos.IRepo, dplCommandUri string, fallbackToTemplate bool) (jitWorkflowName string, err error) { @@ -199,7 +217,10 @@ func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[st // if a file in JIT is missing, it will try to fallback to a standard workflow template in 'workflows/'. // effectively, this allows us to have an intermediate switch workflow to select different JIT commands // for different nodes. - log.Debugf("JIT: There is no file 'jit/%s' with a DPL command, falling back the template at 'workflows/%s'", dplCommandUri, dplCommandUri) + envId, _ := varStack["environment_id"] + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + Debugf("JIT: There is no file 'jit/%s' with a DPL command, falling back the template at 'workflows/%s'", dplCommandUri, dplCommandUri) return dplCommandUri, nil } else { return "", fmt.Errorf("Failed to read DPL command from '%s': %w\n", dplCommandUri, err) @@ -213,7 +234,7 @@ func generateDplSubworkflowFromUri(confSvc ConfigurationService, varStack map[st return "", fmt.Errorf("JIT failed in template resolution of the dpl_command: %w", err) } - jitWorkflowName, err = jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand) + jitWorkflowName, err = jitDplGenerate(confSvc, varStack, workflowRepo, "source /etc/profile.d/o2.sh && "+dplCommand, dplCommandUri) if err != nil { detector := varStack["detector"] return "", fmt.Errorf("for JIT workflow '%s' and detector '%s': %w", dplCommandUri, detector, err) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index 9219dd73f..fbbf3a02e 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -151,7 +151,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str return map[string]interface{}{ "GenerateDplSubworkflow": func(dplCommand string) (string, error) { log.WithPrefix("template").Warn("GenerateDplSubworkflow is deprecated, use dpl.Generate instead") - return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) + return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand, "unknown") }, "GenerateDplSubworkflowFromUri": func(dplCommandUri string) (string, error) { log.WithPrefix("template").Warn("GenerateDplSubworkflowFromUri is deprecated, use dpl.GenerateFromUri instead") @@ -159,7 +159,7 @@ func MakeConfigAndRepoAccessFuncs(confSvc ConfigurationService, varStack map[str }, "dpl": map[string]interface{}{ "Generate": func(dplCommand string) (string, error) { - return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand) + return generateDplSubworkflow(confSvc, varStack, workflowRepo, dplCommand, "unknown") }, "GenerateFromUri": func(dplCommandUri string) (string, error) { return generateDplSubworkflowFromUri(confSvc, varStack, workflowRepo, dplCommandUri, false) From 5ec5d9f1ed0f1fbfad9d3afcfa894b257c2f457a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 20 Sep 2024 11:34:53 +0200 Subject: [PATCH 2005/2352] [build] Bump to v1.19.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index c8f51c922..670b87aae 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 19 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From c0e21337eb117636dd1e5e9d41b2e076d4e785f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 20 Sep 2024 15:40:07 +0200 Subject: [PATCH 2006/2352] removing kafka event in DCS plugin for EOF received from DCS --- core/integration/dcs/plugin.go | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 500fae2a8..5a35a3079 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1041,7 +1041,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) } return - } stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing var err error @@ -1416,17 +1415,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1663,7 +1651,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsopOk = false dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) } - } if dcsopOk { p.pendingEORs[envId] = runNumber64 From 69b64e5319dfde987561e3a405bb7e4772e3ae23 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 23 Sep 2024 14:02:56 +0200 Subject: [PATCH 2007/2352] [build] Bump to v1.19.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 670b87aae..4f773bf99 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 19 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From ed1bbff28f0442f4be509f88fda53fc3d8ba6769 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 25 Sep 2024 14:49:41 +0200 Subject: [PATCH 2008/2352] Added kafka message to DCS for any detector change for any detector --- core/integration/dcs/plugin.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 5a35a3079..025841335 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -985,6 +985,24 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("level", infologger.IL_Devel). Info("ALIECS PFR operation : processing DCS PFR for ") + + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) } } From 70a6a17ba91a0fcbd44007800ea6d53162e5ac79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 25 Sep 2024 15:23:00 +0200 Subject: [PATCH 2009/2352] added string representation of dcsEvent state to DCS --- core/integration/dcs/plugin.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 025841335..cc958901f 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -960,6 +960,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) From 1e73afaff494a14986494b08169a376d300c42ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 26 Sep 2024 11:23:06 +0200 Subject: [PATCH 2010/2352] Added missing kafka messages to DCS for SOR and EOR --- core/integration/dcs/plugin.go | 40 ++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index cc958901f..524fd220d 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1632,6 +1632,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) @@ -1659,6 +1660,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Devel). WithField("run", runNumber64). Info("ALIECS SOR operation : processing DCS SOR for ") + + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } } @@ -2132,6 +2152,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayload["dcsEvent"] = dcsEvent detPayloadJson, _ := json.Marshal(detPayload) @@ -2159,6 +2180,25 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Devel). WithField("run", runNumber64). Info("ALIECS EOR operation : processing DCS EOR for ") + + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } } From 4768984ce16a9ce4fb7dd42183572f1c9b988d9e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 26 Sep 2024 11:27:52 +0200 Subject: [PATCH 2011/2352] [build] Bump to v1.20.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4f773bf99..34928178f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 19 -VERSION_PATCH := 2 +VERSION_MINOR := 20 +VERSION_PATCH := 0 From e3ddd9d5f67d99c86f67afb74070d6a88c01594c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 30 Sep 2024 14:03:34 +0200 Subject: [PATCH 2012/2352] removed DCS EOF kafka message in PFR and EOR --- core/integration/dcs/plugin.go | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 524fd220d..4f9ea3fba 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -760,17 +760,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1977,17 +1966,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("run", runNumber64). Debug(logMsg) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - break // no more data } if errors.Is(err, context.DeadlineExceeded) { From bc36b97a6655ee606bdccd076fd1f55a151e51a9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 4 Oct 2024 15:26:37 +0200 Subject: [PATCH 2013/2352] [apricot] add mock source for configuration for easier mocking in tests --- apricot/instance.go | 13 +++-- configuration/cfgbackend/mocksource.go | 68 ++++++++++++++++++++++++++ configuration/cfgbackend/source.go | 3 ++ core/environment/environment_test.go | 34 +------------ core/environment/environment_test.yaml | 13 ----- 5 files changed, 81 insertions(+), 50 deletions(-) create mode 100644 configuration/cfgbackend/mocksource.go delete mode 100644 core/environment/environment_test.yaml diff --git a/apricot/instance.go b/apricot/instance.go index c406bc133..b143a0251 100644 --- a/apricot/instance.go +++ b/apricot/instance.go @@ -93,6 +93,12 @@ func newService(configUri string) (configuration.Service, error) { svc, err = cacheproxy.NewService(svc) } return svc, err + case "mock": + svc, err = local.NewService(configUri) + if err != nil { + return svc, err + } + return svc, err default: return nil, fmt.Errorf("invalid configuration URI scheme %s", parsedUri.Scheme) } @@ -100,13 +106,13 @@ func newService(configUri string) (configuration.Service, error) { func Instance() configuration.Service { once.Do(func() { - var( - err error + var ( + err error configUri string ) if viper.IsSet("config_endpoint") { //coconut configUri = viper.GetString("config_endpoint") - } else if viper.IsSet("configServiceUri"){ //core + } else if viper.IsSet("configServiceUri") { //core configUri = viper.GetString("configServiceUri") } else { //apricot configUri = viper.GetString("backendUri") @@ -118,4 +124,3 @@ func Instance() configuration.Service { }) return instance } - diff --git a/configuration/cfgbackend/mocksource.go b/configuration/cfgbackend/mocksource.go new file mode 100644 index 000000000..1e6ea648e --- /dev/null +++ b/configuration/cfgbackend/mocksource.go @@ -0,0 +1,68 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package cfgbackend + +// MockSource is a minimal mock implementation of the Source interface +type MockSource struct{} + +func NewMockSource() (*MockSource, error) { + return &MockSource{}, nil +} + +func (m *MockSource) Get(key string) (string, error) { + return "", nil +} + +func (m *MockSource) GetKeysByPrefix(prefix string) ([]string, error) { + return []string{}, nil +} + +func (m *MockSource) GetRecursive(key string) (Item, error) { + return make(Map), nil +} + +func (m *MockSource) GetRecursiveYaml(key string) ([]byte, error) { + return []byte{}, nil +} + +func (m *MockSource) Exists(key string) (bool, error) { + return false, nil +} + +func (m *MockSource) IsDir(key string) bool { + return false +} + +func (m *MockSource) Put(key, value string) error { + return nil +} + +func (m *MockSource) PutRecursive(key string, item Item) error { + return nil +} + +func (m *MockSource) PutRecursiveYaml(key string, data []byte) error { + return nil +} diff --git a/configuration/cfgbackend/source.go b/configuration/cfgbackend/source.go index 394d572f8..d53cd4584 100644 --- a/configuration/cfgbackend/source.go +++ b/configuration/cfgbackend/source.go @@ -57,6 +57,9 @@ func NewSource(uri string) (configuration Source, err error) { (strings.HasSuffix(uri, ".yaml") || strings.HasSuffix(uri, ".json")) { configuration, err = newYamlSource(uri) return + } else if strings.HasPrefix(uri, "mock://") { + configuration, err = NewMockSource() + return } err = errors.New("bad URI for configuration source") diff --git a/core/environment/environment_test.go b/core/environment/environment_test.go index 0d1b150e9..0badb9d4f 100644 --- a/core/environment/environment_test.go +++ b/core/environment/environment_test.go @@ -6,51 +6,19 @@ import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" "github.com/spf13/viper" - "io" - "os" "testing" ) -const envTestConfig = "environment_test.yaml" - -var tmpDir *string - var _ = BeforeSuite(func() { - var err error - tmpDir = new(string) - *tmpDir, err = os.MkdirTemp("", "o2control-core-environment") - Expect(err).NotTo(HaveOccurred()) - - // copy config files - configFiles := []string{envTestConfig} - for _, configFile := range configFiles { - from, err := os.Open("./" + configFile) - Expect(err).NotTo(HaveOccurred()) - defer from.Close() - - to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) - Expect(err).NotTo(HaveOccurred()) - defer to.Close() - - _, err = io.Copy(to, from) - Expect(err).NotTo(HaveOccurred()) - } - - viper.Set("coreWorkingDir", tmpDir) // used by NewRunNumber with YAML backend - integration.Reset() integration.RegisterPlugin("testplugin", "testPluginEndpoint", testplugin.NewPlugin) viper.Reset() viper.Set("integrationPlugins", []string{"testplugin"}) viper.Set("testPluginEndpoint", "http://example.com") - viper.Set("config_endpoint", "file://"+*tmpDir+"/"+envTestConfig) + viper.Set("config_endpoint", "mock://") }) func TestCoreEnvironment(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Core Environment Test Suite") } - -var _ = AfterSuite(func() { - os.RemoveAll(*tmpDir) -}) diff --git a/core/environment/environment_test.yaml b/core/environment/environment_test.yaml deleted file mode 100644 index e37e5e39d..000000000 --- a/core/environment/environment_test.yaml +++ /dev/null @@ -1,13 +0,0 @@ -# the contents of this file are not really used, but we need an apricot instance for environment test package, which needs a non-empty file -o2: - components: - qc: - TECHNICAL: - any: - entry: "config" - runtime: - aliecs: - defaults: - key1: value1 - vars: - key2: value2 \ No newline at end of file From 214ccb21893abec4fa368b40446c57c3c1138511 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 4 Oct 2024 15:28:04 +0200 Subject: [PATCH 2014/2352] [core] disable empty aggregator roles ...to avoid failed environment deployments due to missing status update --- core/workflow/aggregatorrole.go | 5 ++ core/workflow/aggregatorrole_test.go | 72 ++++++++++++++++++++++++++++ core/workflow/workflow_test.go | 5 ++ 3 files changed, 82 insertions(+) create mode 100644 core/workflow/aggregatorrole_test.go diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index f1ae9d7cd..9fa89d71a 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -230,6 +230,11 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf } r.Roles = enabledRoles + // If there are no roles in the aggregator role, it has no use and should be disabled + if len(r.Roles) == 0 { + r.Enabled = "false" + } + return } diff --git a/core/workflow/aggregatorrole_test.go b/core/workflow/aggregatorrole_test.go new file mode 100644 index 000000000..3f3e1ff39 --- /dev/null +++ b/core/workflow/aggregatorrole_test.go @@ -0,0 +1,72 @@ +package workflow + +import ( + "github.com/AliceO2Group/Control/core/repos" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("aggregator role", func() { + var _ = Describe("processing templates", func() { + var root Role + var repo repos.Repo + var configStack map[string]string + + BeforeEach(func() { + _, repo, _ = repos.NewRepo("/home/user/git/ControlWorkflows", "", "/var/lib/o2/aliecs/repos") + configStack = make(map[string]string) + }) + + When("an aggregator role is empty", func() { + BeforeEach(func() { + root = &aggregatorRole{ + roleBase{Name: "root", Enabled: "true"}, + aggregator{Roles: []Role{}}, + } + }) + It("should disable itself", func() { + Expect(root.IsEnabled()).To(BeTrue()) + err := root.ProcessTemplates(&repo, nil, configStack) + Expect(err).NotTo(HaveOccurred()) + Expect(root.IsEnabled()).To(BeFalse()) + }) + }) + + When("an aggregator role has only disabled sub-roles", func() { + BeforeEach(func() { + root = &aggregatorRole{ + roleBase{Name: "root", Enabled: "true"}, + aggregator{ + Roles: []Role{&taskRole{roleBase: roleBase{Name: "task1", Enabled: "false"}}}, + }, + } + }) + It("remove the disabled roles and disable itself", func() { + Expect(root.IsEnabled()).To(BeTrue()) + err := root.ProcessTemplates(&repo, nil, configStack) + Expect(err).NotTo(HaveOccurred()) + Expect(root.IsEnabled()).To(BeFalse()) + Expect(root.GetRoles()).Should(BeEmpty()) + }) + }) + + When("an aggregator role has an enabled role", func() { + BeforeEach(func() { + root = &aggregatorRole{ + roleBase{Name: "root", Enabled: "true"}, + aggregator{ + Roles: []Role{&taskRole{roleBase: roleBase{Name: "task1", Enabled: "true"}}}, + }, + } + }) + It("should be enabled", func() { + Expect(root.IsEnabled()).To(BeTrue()) + err := root.ProcessTemplates(&repo, nil, configStack) + Expect(err).NotTo(HaveOccurred()) + Expect(root.IsEnabled()).To(BeTrue()) + Expect(root.GetRoles()).ShouldNot(BeEmpty()) + }) + }) + }) + +}) diff --git a/core/workflow/workflow_test.go b/core/workflow/workflow_test.go index f370b01cf..07ce5d69c 100644 --- a/core/workflow/workflow_test.go +++ b/core/workflow/workflow_test.go @@ -3,9 +3,14 @@ package workflow import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/spf13/viper" "testing" ) +var _ = BeforeSuite(func() { + viper.Set("config_endpoint", "mock://") +}) + func TestCoreWorkflow(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Core Workflow Test Suite") From cb879586a1b6c2f51d4afedde19e55a4aeacf660 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Sep 2024 12:29:21 +0200 Subject: [PATCH 2015/2352] [common] Add nanosecond timestamp + workflow info to environment events --- common/protos/common.pb.go | 111 ++++++++++- common/protos/common.proto | 7 + common/protos/events.pb.go | 396 ++++++++++++++++++++----------------- common/protos/events.proto | 4 +- 4 files changed, 322 insertions(+), 196 deletions(-) diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index 8f86d94d5..da2413f6f 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -109,6 +109,77 @@ func (x *User) GetName() string { return "" } +type WorkflowTemplateInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"` + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` + Public bool `protobuf:"varint,4,opt,name=public,proto3" json:"public,omitempty"` // whether the environment is public or not +} + +func (x *WorkflowTemplateInfo) Reset() { + *x = WorkflowTemplateInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WorkflowTemplateInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WorkflowTemplateInfo) ProtoMessage() {} + +func (x *WorkflowTemplateInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use WorkflowTemplateInfo.ProtoReflect.Descriptor instead. +func (*WorkflowTemplateInfo) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{1} +} + +func (x *WorkflowTemplateInfo) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *WorkflowTemplateInfo) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *WorkflowTemplateInfo) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *WorkflowTemplateInfo) GetPublic() bool { + if x != nil { + return x.Public + } + return false +} + var File_protos_common_proto protoreflect.FileDescriptor var file_protos_common_proto_rawDesc = []byte{ @@ -120,13 +191,20 @@ var file_protos_common_proto_rawDesc = []byte{ 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, - 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x22, 0x78, 0x0a, 0x14, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -141,9 +219,10 @@ func file_protos_common_proto_rawDescGZIP() []byte { return file_protos_common_proto_rawDescData } -var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) var file_protos_common_proto_goTypes = []interface{}{ - (*User)(nil), // 0: common.User + (*User)(nil), // 0: common.User + (*WorkflowTemplateInfo)(nil), // 1: common.WorkflowTemplateInfo } var file_protos_common_proto_depIdxs = []int32{ 0, // [0:0] is the sub-list for method output_type @@ -171,6 +250,18 @@ func file_protos_common_proto_init() { return nil } } + file_protos_common_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*WorkflowTemplateInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_common_proto_msgTypes[0].OneofWrappers = []interface{}{} type x struct{} @@ -179,7 +270,7 @@ func file_protos_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_common_proto_rawDesc, NumEnums: 0, - NumMessages: 1, + NumMessages: 2, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/common.proto b/common/protos/common.proto index 635c7b71d..435790e40 100644 --- a/common/protos/common.proto +++ b/common/protos/common.proto @@ -39,3 +39,10 @@ message User { // Name of the user. string name = 3; } + +message WorkflowTemplateInfo { + string name = 1; + string description = 2; + string path = 3; + bool public = 4; // whether the environment is public or not +} \ No newline at end of file diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 2d7f2eb24..a3654453e 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -246,16 +246,17 @@ type Ev_EnvironmentEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` - RunNumber uint32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` // only when the environment is in the running state - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // any additional message concerning the current state or transition - Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` - TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` - TransitionStatus OpStatus `protobuf:"varint,8,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` - Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // consolidated environment variables at the root role of the environment - LastRequestUser *User `protobuf:"bytes,10,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + RunNumber uint32 `protobuf:"varint,3,opt,name=runNumber,proto3" json:"runNumber,omitempty"` // only when the environment is in the running state + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Message string `protobuf:"bytes,5,opt,name=message,proto3" json:"message,omitempty"` // any additional message concerning the current state or transition + Transition string `protobuf:"bytes,6,opt,name=transition,proto3" json:"transition,omitempty"` + TransitionStep string `protobuf:"bytes,7,opt,name=transitionStep,proto3" json:"transitionStep,omitempty"` + TransitionStatus OpStatus `protobuf:"varint,8,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` + Vars map[string]string `protobuf:"bytes,9,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // consolidated environment variables at the root role of the environment + LastRequestUser *User `protobuf:"bytes,10,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` + WorkflowTemplateInfo *WorkflowTemplateInfo `protobuf:"bytes,11,opt,name=workflowTemplateInfo,proto3" json:"workflowTemplateInfo,omitempty"` } func (x *Ev_EnvironmentEvent) Reset() { @@ -360,6 +361,13 @@ func (x *Ev_EnvironmentEvent) GetLastRequestUser() *User { return nil } +func (x *Ev_EnvironmentEvent) GetWorkflowTemplateInfo() *WorkflowTemplateInfo { + if x != nil { + return x.WorkflowTemplateInfo + } + return nil +} + type Traits struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -935,7 +943,8 @@ type Event struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + TimestampNano int64 `protobuf:"varint,2,opt,name=timestampNano,proto3" json:"timestampNano,omitempty"` // Types that are assignable to Payload: // // *Event_EnvironmentEvent @@ -989,6 +998,13 @@ func (x *Event) GetTimestamp() int64 { return 0 } +func (x *Event) GetTimestampNano() int64 { + if x != nil { + return x.TimestampNano + } + return 0 +} + func (m *Event) GetPayload() isEvent_Payload { if m != nil { return m.Payload @@ -1134,7 +1150,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xd1, 0x03, 0x0a, 0x13, 0x45, 0x76, 0x5f, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xa3, 0x04, 0x0a, 0x13, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, @@ -1160,159 +1176,167 @@ var file_protos_events_proto_rawDesc = []byte{ 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6e, 0x0a, 0x06, - 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x02, 0x0a, - 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x74, - 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, 0x6c, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, - 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, 0x69, - 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, 0x5f, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, - 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xff, 0x02, 0x0a, 0x0b, - 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x73, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x14, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6e, + 0x0a, 0x06, 0x54, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x61, 0x77, 0x61, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, + 0x02, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, 0x61, + 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x10, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xab, 0x05, - 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, - 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, - 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, - 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x31, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xfc, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x75, 0x6e, 0x63, 0x12, 0x30, 0x0a, 0x0a, 0x63, 0x61, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x0a, 0x63, 0x61, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x12, 0x26, 0x0a, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x54, 0x72, + 0x61, 0x69, 0x74, 0x73, 0x52, 0x06, 0x74, 0x72, 0x61, 0x69, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xd1, 0x02, 0x0a, 0x19, 0x45, 0x76, + 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x65, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x12, 0x42, 0x0a, 0x13, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x13, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x65, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xff, 0x02, + 0x0a, 0x0b, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1e, 0x0a, + 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, + 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x36, + 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd1, 0x05, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x49, 0x0a, + 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, + 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, + 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, + 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, + 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, + 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, - 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, - 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, - 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, - 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, - 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, - 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, - 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, + 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0b, 0x4a, 0x04, 0x08, + 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, + 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, + 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, + 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, + 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( @@ -1345,33 +1369,35 @@ var file_protos_events_proto_goTypes = []interface{}{ nil, // 12: events.Ev_EnvironmentEvent.VarsEntry nil, // 13: events.Ev_RunEvent.VarsEntry (*User)(nil), // 14: common.User + (*WorkflowTemplateInfo)(nil), // 15: common.WorkflowTemplateInfo } var file_protos_events_proto_depIdxs = []int32{ 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus 12, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry 14, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User - 5, // 3: events.Ev_TaskEvent.traits:type_name -> events.Traits - 0, // 4: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus - 5, // 5: events.Ev_CallEvent.traits:type_name -> events.Traits - 0, // 6: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus - 0, // 7: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus - 0, // 8: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus - 13, // 9: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry - 14, // 10: events.Ev_RunEvent.lastRequestUser:type_name -> common.User - 4, // 11: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 6, // 12: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 8, // 13: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 7, // 14: events.Event.callEvent:type_name -> events.Ev_CallEvent - 9, // 15: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 10, // 16: events.Event.runEvent:type_name -> events.Ev_RunEvent - 3, // 17: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 1, // 18: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 2, // 19: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 20, // [20:20] is the sub-list for method output_type - 20, // [20:20] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 15, // 3: events.Ev_EnvironmentEvent.workflowTemplateInfo:type_name -> common.WorkflowTemplateInfo + 5, // 4: events.Ev_TaskEvent.traits:type_name -> events.Traits + 0, // 5: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus + 5, // 6: events.Ev_CallEvent.traits:type_name -> events.Traits + 0, // 7: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus + 0, // 8: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus + 0, // 9: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus + 13, // 10: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry + 14, // 11: events.Ev_RunEvent.lastRequestUser:type_name -> common.User + 4, // 12: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 13: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 14: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 15: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 16: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 10, // 17: events.Event.runEvent:type_name -> events.Ev_RunEvent + 3, // 18: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 19: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 20: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 21, // [21:21] is the sub-list for method output_type + 21, // [21:21] is the sub-list for method input_type + 21, // [21:21] is the sub-list for extension type_name + 21, // [21:21] is the sub-list for extension extendee + 0, // [0:21] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } diff --git a/common/protos/events.proto b/common/protos/events.proto index 478d8b6e0..cc6940a18 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -64,6 +64,7 @@ message Ev_EnvironmentEvent { OpStatus transitionStatus = 8; map vars = 9; // consolidated environment variables at the root role of the environment common.User lastRequestUser = 10; + common.WorkflowTemplateInfo workflowTemplateInfo = 11; } message Traits { @@ -128,7 +129,8 @@ message Ev_RunEvent { message Event { int64 timestamp = 1; - reserved 2 to 10; + int64 timestampNano = 2; + reserved 3 to 10; reserved 17 to 100; oneof Payload { From 023332684b533382a0a91cfbfbb373dc61b12e4f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Sep 2024 12:30:12 +0200 Subject: [PATCH 2016/2352] [common] Include nanosecond timestamp in all Kafka events --- common/event/writer.go | 45 +++++++++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 386a530c0..9e329af49 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -94,48 +94,57 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time switch e := e.(type) { case *pb.Ev_MetaEvent_CoreStart: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, } case *pb.Ev_MetaEvent_MesosHeartbeat: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, } case *pb.Ev_MetaEvent_FrameworkEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, } case *pb.Ev_TaskEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_TaskEvent{TaskEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_TaskEvent{TaskEvent: e}, } case *pb.Ev_RoleEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_RoleEvent{RoleEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_RoleEvent{RoleEvent: e}, } case *pb.Ev_EnvironmentEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, } case *pb.Ev_CallEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_CallEvent{CallEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_CallEvent{CallEvent: e}, } case *pb.Ev_IntegratedServiceEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, } case *pb.Ev_RunEvent: wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - Payload: &pb.Event_RunEvent{RunEvent: e}, + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_RunEvent{RunEvent: e}, } } From 5b4d80280c9b2854558969a4d6b63f37958081a6 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 4 Sep 2024 12:31:13 +0200 Subject: [PATCH 2017/2352] [core] Include workflow template info (incl public) in all env events --- core/environment/environment.go | 261 ++++++++++++++++++-------------- core/environment/manager.go | 248 +++++++++++++++++------------- core/environment/utils.go | 23 ++- core/server.go | 15 +- 4 files changed, 316 insertions(+), 231 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 551714279..f55b109b0 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -84,6 +84,7 @@ type Environment struct { eventStream Subscription Public bool // From workflow or user Description string // From workflow + WorkflowPath string // From workflow load callsPendingAwait map[string] /*await expression, trigger only*/ callable.CallsMap currentTransition string @@ -167,13 +168,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("before_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.GetCurrentRunNumber(), - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) // first, we execute hooks which should be executed before an event officially starts @@ -181,13 +183,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, if errHooks != nil { e.Cancel(errHooks) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.GetCurrentRunNumber(), - Error: errHooks.Error(), - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step finished", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Error: errHooks.Error(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step finished", + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return } @@ -318,27 +321,29 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) }, "leave_state": func(_ context.Context, e *fsm.Event) { trigger := fmt.Sprintf("leave_%s", e.Src) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) @@ -357,13 +362,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, if errHooks != nil { e.Cancel(errHooks) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.GetCurrentRunNumber(), - Error: errHooks.Error(), - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step finished", + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Error: errHooks.Error(), + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step finished", + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return } @@ -379,14 +385,15 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) if e.Err != nil { @@ -394,13 +401,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition step starting", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition step starting", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) env.handlerFunc()(e) @@ -410,27 +418,29 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: fmt.Sprintf("tasks_%s", e.Event), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) }, "enter_state": func(_ context.Context, e *fsm.Event) { trigger := fmt.Sprintf("enter_%s", e.Dst) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) @@ -450,14 +460,15 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) if e.Err != nil { @@ -481,13 +492,14 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, trigger := fmt.Sprintf("after_%s", e.Event) the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Transition: e.Event, - TransitionStep: trigger, - Message: "transition step starting", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Transition: e.Event, + TransitionStep: trigger, + Message: "transition step starting", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) errHooks := env.handleHooksWithNegativeWeights(env.Workflow(), trigger) @@ -617,14 +629,15 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, // publish transition step complete event the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: errorMsg, - Message: "transition step finished", - Transition: e.Event, - TransitionStep: trigger, - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: errorMsg, + Message: "transition step finished", + Transition: e.Event, + TransitionStep: trigger, + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) }, }, @@ -970,24 +983,26 @@ func (env *Environment) TryTransition(t Transition) (err error) { defer env.transitionMutex.Unlock() the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition starting", - Transition: t.eventName(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition starting", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) err = t.check() if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition impossible", - Transition: t.eventName(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition impossible", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return } @@ -995,22 +1010,24 @@ func (env *Environment) TryTransition(t Transition) (err error) { if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Error: err.Error(), - Message: "transition error", - Transition: t.eventName(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Error: err.Error(), + Message: "transition error", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) } else { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ - EnvironmentId: env.id.String(), - State: env.Sm.Current(), - RunNumber: env.currentRunNumber, - Message: "transition completed successfully", - Transition: t.eventName(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: env.id.String(), + State: env.Sm.Current(), + RunNumber: env.currentRunNumber, + Message: "transition completed successfully", + Transition: t.eventName(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) } return @@ -1387,6 +1404,20 @@ func (env *Environment) GetVarsAsString() string { return sortMapToString(varStack) } +func (env *Environment) GetWorkflowInfo() *pb.WorkflowTemplateInfo { + if env == nil || env.workflow == nil { + return &pb.WorkflowTemplateInfo{} + } + + out := &pb.WorkflowTemplateInfo{ + Name: env.name, + Description: env.Description, + Path: env.WorkflowPath, + Public: env.Public, + } + return out +} + // return true if the auto stop transition has been scheduled, false otherwise // if true, the expected stop time is also returned func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected time.Time) { diff --git a/core/environment/manager.go b/core/environment/manager.go index f4ead298c..a20b9b4e2 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -230,6 +230,17 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) } + // in case of err==nil, env will be false unless user + // set it to True which will be overwritten in server.go + workflowPublicInfo, err := parseWorkflowPublicInfo(workflowPath) + if err != nil { + log.WithField("public info", public). + WithField("workflow path", workflowPath). + WithError(err). + Warn("parse workflow public info failed.") + return newId, fmt.Errorf("workflow public info parsing failed: %w", err) + } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: newId.String(), State: "PENDING", @@ -237,6 +248,12 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] TransitionStep: "before_CREATE", Message: "instantiating", LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Path: workflowPath, + Public: workflowPublicInfo.IsPublic, + Name: workflowPublicInfo.Name, + Description: workflowPublicInfo.Description, + }, }) // userVar identifiers come in 2 forms: @@ -296,7 +313,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] Logf(logrus.FatalLevel, "environment creation failed") } } - if err != nil { + if err != nil || env == nil { + if env == nil { + err = errors.New("newEnvironment returned nil environment") + } log.WithError(err). WithField("partition", gotEnvId.String()). Logf(logrus.FatalLevel, "environment creation failed") @@ -308,13 +328,19 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] "partition": gotEnvId.String(), }).Info("creating new environment") + env.Public = workflowPublicInfo.IsPublic + env.name = workflowPublicInfo.Name + env.Description = workflowPublicInfo.Description + env.WorkflowPath = workflowPath + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "running hooks", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "running hooks", + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) env.hookHandlerF = func(hooks task.Tasks) error { @@ -324,24 +350,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // Ensure the environment_id is available to all env.UserVars.Set("environment_id", env.id.String()) - // in case of err==nil, env will be false unless user - // set it to True which will be overwritten in server.go - env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) - if err != nil { - log.WithField("public info", env.Public). - WithField("partition", env.Id().String()). - WithError(err). - Warn("parse workflow public info failed.") - return gotEnvId, fmt.Errorf("workflow public info parsing failed: %w", err) - } - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "CREATE", - Message: "loading workflow", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "CREATE", + Message: "loading workflow", + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) // We load the workflow (includes template processing) @@ -382,13 +398,14 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] cvs, _ := env.Workflow().ConsolidatedVarStack() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: env.CurrentState(), - Transition: "CREATE", - TransitionStep: "after_CREATE", - Message: "workflow loaded", - Vars: cvs, // we push the full var stack of the root role in the workflow loaded event - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: env.CurrentState(), + Transition: "CREATE", + TransitionStep: "after_CREATE", + Message: "workflow loaded", + Vars: cvs, // we push the full var stack of the root role in the workflow loaded event + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) log.WithField("method", "CreateEnvironment"). @@ -600,12 +617,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "before_DESTROY", - Message: "workflow teardown started", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "before_DESTROY", + Message: "workflow teardown started", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) env.Mu.Lock() @@ -613,12 +631,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error env.Mu.Unlock() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "leave_" + env.CurrentState(), - Message: "workflow teardown ongoing", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "leave_" + env.CurrentState(), + Message: "workflow teardown ongoing", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) err = env.handleAllHooks(env.Workflow(), "leave_"+env.CurrentState()) @@ -698,12 +717,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "DESTROY", - Message: "releasing tasks", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "DESTROY", + Message: "releasing tasks", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) log.WithField("method", "TeardownEnvironment"). @@ -765,25 +785,27 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown finished with error", - Error: err.Error(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return err } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: env.CurrentState(), - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "running DESTROY hooks", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: env.CurrentState(), + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "running DESTROY hooks", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) // we trigger all cleanup hooks, first calls, then tasks immediately after @@ -847,13 +869,14 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error len(taskReleaseErrors), environmentId) the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown finished with error", - Error: err.Error(), - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown finished with error", + Error: err.Error(), + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return err @@ -874,12 +897,13 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error Debug("envman write lock") the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: environmentId.String(), - State: "DONE", - Transition: "DESTROY", - TransitionStep: "after_DESTROY", - Message: "environment teardown complete", - LastRequestUser: env.GetLastRequestUser(), + EnvironmentId: environmentId.String(), + State: "DONE", + Transition: "DESTROY", + TransitionStep: "after_DESTROY", + Message: "environment teardown complete", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) return err @@ -1167,6 +1191,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) } + // in case of err==nil, env will be false unless user + // set it to True which will be overwritten in server.go + workflowPublicInfo, err := parseWorkflowPublicInfo(workflowPath) + if err != nil { + log.WithField("public info", workflowPublicInfo.IsPublic). + WithField("environment", newId.String()). + WithError(err). + Warn("parse workflow public info failed.") + } + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: newId.String(), State: "PENDING", @@ -1174,6 +1208,12 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str TransitionStep: "before_CREATE", Message: "instantiating", LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Path: workflowPath, + Public: workflowPublicInfo.IsPublic, + Name: workflowPublicInfo.Name, + Description: workflowPublicInfo.Description, + }, }) env, err := newEnvironment(envUserVars, newId) @@ -1191,13 +1231,19 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str "partition": newEnvId.String(), }).Info("creating new automatic environment") + env.Public = workflowPublicInfo.IsPublic + env.name = workflowPublicInfo.Name + env.Description = workflowPublicInfo.Description + env.WorkflowPath = workflowPath + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "running hooks", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + Message: "running hooks", + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) env.addSubscription(sub) @@ -1210,23 +1256,14 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str // Ensure the environment_id is available to all env.UserVars.Set("environment_id", env.id.String()) - // in case of err==nil, env will be false unless user - // set it to True which will be overwriten in server.go - env.Public, env.Description, err = parseWorkflowPublicInfo(workflowPath) - if err != nil { - log.WithField("public info", env.Public). - WithField("partition", env.Id().String()). - WithError(err). - Warn("parse workflow public info failed.") - } - the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "CREATE", - Message: "loading workflow", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "CREATE", + Message: "loading workflow", + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) env.workflow, err = envs.loadWorkflow(workflowPath, env.wfAdapter, workflowUserVars, env.BaseConfigStack) @@ -1236,17 +1273,16 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str return } - env.Public, env.Description, _ = parseWorkflowPublicInfo(workflowPath) - cvs, _ := env.Workflow().ConsolidatedVarStack() the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: env.CurrentState(), - Transition: "CREATE", - TransitionStep: "after_CREATE", - Message: "workflow loaded", - Vars: cvs, // we push the full var stack of the root role in the workflow loaded event - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: env.CurrentState(), + Transition: "CREATE", + TransitionStep: "after_CREATE", + Message: "workflow loaded", + Vars: cvs, // we push the full var stack of the root role in the workflow loaded event + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: env.GetWorkflowInfo(), }) log.WithField("method", "CreateAutoEnvironment"). diff --git a/core/environment/utils.go b/core/environment/utils.go index 5b6b6dbca..3270f24ce 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -28,38 +28,47 @@ import ( "bytes" "encoding/json" "fmt" - "github.com/AliceO2Group/Control/core/the" - "gopkg.in/yaml.v3" "os" "sort" + + "github.com/AliceO2Group/Control/core/the" + "gopkg.in/yaml.v3" ) -func parseWorkflowPublicInfo(workflowExpr string) (bool, string, error) { +type WorkflowPublicInfo struct { + IsPublic bool + Name string + Description string +} + +func parseWorkflowPublicInfo(workflowExpr string) (WorkflowPublicInfo, error) { repoManager := the.RepoManager() resolvedWorkflowPath, _, err := repoManager.GetWorkflow(workflowExpr) //Will fail if repo unknown if err != nil { - return false, "", err + return WorkflowPublicInfo{}, err } yamlFile, err := os.ReadFile(resolvedWorkflowPath) if err != nil { - return false, "", err + return WorkflowPublicInfo{}, err } nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) if err != nil { - return false, "", err + return WorkflowPublicInfo{}, err } + name := nodes["name"].Value + description := "" isPublic := nodes["name"].Tag == "!public" if nodes["description"].Tag == "!public" { description = nodes["description"].Value } - return isPublic, description, nil + return WorkflowPublicInfo{IsPublic: isPublic, Name: name, Description: description}, nil } func JSONSliceToSlice(payload string) (slice []string, err error) { diff --git a/core/server.go b/core/server.go index 880b6b142..6cfa3bce3 100644 --- a/core/server.go +++ b/core/server.go @@ -311,6 +311,10 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEn Error: "cannot create new environment", Message: err.Error(), LastRequestUser: request.RequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Public: request.GetPublic(), + Path: request.GetWorkflowTemplate(), + }, }) return } @@ -323,14 +327,19 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEn Error: "cannot get newly created environment", Message: err.Error(), LastRequestUser: request.RequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Public: request.GetPublic(), + Path: request.GetWorkflowTemplate(), + }, }) return } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: id.String(), - State: newEnv.CurrentState(), - LastRequestUser: request.RequestUser, + EnvironmentId: id.String(), + State: newEnv.CurrentState(), + LastRequestUser: request.RequestUser, + WorkflowTemplateInfo: newEnv.GetWorkflowInfo(), }) return } From d542b3b67f63ea26a13a5ff3d88826f7de311ec4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Oct 2024 12:28:08 +0200 Subject: [PATCH 2018/2352] [core] Include detector in DCS event messages to IL --- core/integration/dcs/plugin.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 4f9ea3fba..7ad8e4ad3 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -969,11 +969,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Support). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS PFR operation : completed DCS PFR for ") } else { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Devel). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS PFR operation : processing DCS PFR for ") ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) @@ -1642,12 +1644,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("run", runNumber64). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS SOR operation : completed DCS SOR for ") } else { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("run", runNumber64). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS SOR operation : processing DCS SOR for ") ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) @@ -2151,12 +2155,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("run", runNumber64). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : completed DCS EOR for ") } else { log.WithField("event", dcsEvent). WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("run", runNumber64). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : processing DCS EOR for ") ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) From bbe4d0f04b949f96c228a5de9a46ca8d9c6e8581 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 9 Oct 2024 17:26:59 +0200 Subject: [PATCH 2019/2352] [core] Include state in DCS op failure events --- core/integration/dcs/plugin.go | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 7ad8e4ad3..5a9898d3b 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -828,6 +828,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -864,6 +865,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -900,6 +902,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -927,6 +930,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["dcsEvent"] = dcsEvent + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayloadJson, _ := json.Marshal(detPayload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ @@ -1497,6 +1501,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -1534,6 +1539,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -1571,6 +1577,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -1600,6 +1607,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["dcsEvent"] = dcsEvent + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayloadJson, _ := json.Marshal(detPayload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ @@ -2045,6 +2053,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -2082,6 +2091,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { payload["detector"] = ecsDet payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] payloadJson, _ = json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), @@ -2111,6 +2121,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] detPayloadJson, _ := json.Marshal(detPayload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ From 4099fadc18680cc065cf7f48a6338743c22ab23f Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Oct 2024 11:11:11 +0200 Subject: [PATCH 2020/2352] [build] Ensure fdset files are built correctly --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index a5480de20..d3c46427d 100644 --- a/Makefile +++ b/Makefile @@ -302,7 +302,7 @@ fdset: @echo -e "building fdset files \033[1;33m==>\033[0m \033[1;34m./common/protos\033[0m" @mkdir -p fdset - @cd common/protos && protoc -o events.fdset events.proto && cd ../.. + @cd common/protos && protoc -I.. -I. -o events.fdset events.proto && cd ../.. @mv common/protos/events.fdset fdset @echo -e "to consume with \033[1;33mhttps://github.com/sevagh/pq\033[0m: FDSET_PATH=./fdset pq kafka aliecs.environment --brokers kafka-broker-hostname:9092 --beginning --msgtype events.Event" From d7ccd5b25eda32abfac91c6494fb635d62722203 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 10 Oct 2024 14:54:28 +0200 Subject: [PATCH 2021/2352] [build] Bump to v1.21.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 34928178f..4817ada28 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 20 +VERSION_MINOR := 21 VERSION_PATCH := 0 From e99d4195bb234bc0c7c2d078b5ff6a684d9012dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 16 Oct 2024 15:29:15 +0200 Subject: [PATCH 2022/2352] use two channel to communicate mesos REVIVE --- core/task/manager.go | 34 +++++++++++++++------------------- core/task/scheduler.go | 32 +++++++++++++++----------------- core/task/schedulerstate.go | 10 +++++----- 3 files changed, 35 insertions(+), 41 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 95b10a262..3ff33f457 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -91,8 +91,9 @@ type Manager struct { tasksToDeploy chan<- *ResourceOffersDeploymentRequest - reviveOffersTrg chan struct{} - cq *controlcommands.CommandQueue + reviveOffersTrg chan struct{} + reviveOffersDone chan struct{} + cq *controlcommands.CommandQueue tasksLaunched int tasksFinished int @@ -141,6 +142,7 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.cq = taskman.schedulerState.commandqueue taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg + taskman.reviveOffersDone = taskman.schedulerState.reviveOffersDone taskman.ackKilledTasks = newAcks() schedState.setupCli() @@ -156,7 +158,8 @@ func (m *Manager) newTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, localBindMap channel.BindMap, - executorId mesos.ExecutorID) (t *Task) { + executorId mesos.ExecutorID, +) (t *Task) { newId := uid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), @@ -197,8 +200,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. if err != nil { return } - repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] //get IRepo pointer from RepoManager - if repo == nil { //should never end up here + repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] // get IRepo pointer from RepoManager + if repo == nil { // should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } @@ -223,7 +226,6 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. taskInfo := strings.Split(taskPath, "/tasks/") if len(taskInfo) == 1 { taskFilename = taskInfo[0] - } else { taskFilename = taskInfo[1] } @@ -280,7 +282,7 @@ func (m *Manager) removeInactiveClasses() { return } -func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused +func (m *Manager) RemoveReposClasses(repoPath string) { // Currently unused utils.EnsureTrailingSlash(&repoPath) _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { @@ -327,7 +329,6 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { } func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { - /* Here's what's gonna happen: 1) check if any tasks are already in Roster, whether they are already locked @@ -516,7 +517,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e timeReviveOffers := time.Now() timeDeployMu := time.Now() m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers - <-m.reviveOffersTrg // we only continue when it's done + <-m.reviveOffersDone // we only continue when it's done utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", log.WithField("tasksToRun", len(tasksToRun)). WithField("partition", envId)) @@ -597,7 +598,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // can't lock some of them, so we must roll back and keep them // unlocked in the roster. var deployedTaskIds []string - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } @@ -612,11 +613,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } // Finally, we write to the roster. Point of no return! - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { m.roster.append(taskPtr) } if deploymentSuccess { - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { @@ -629,7 +630,6 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { - taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -686,7 +686,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { taskPath := task.GetParentRolePath() for inbChName, endpoint := range task.GetLocalBindMap() { var bindMapKey string - if strings.HasPrefix(inbChName, "::") { //global channel alias + if strings.HasPrefix(inbChName, "::") { // global channel alias bindMapKey = inbChName // deduplication @@ -785,7 +785,6 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() - if err != nil { return err } @@ -870,7 +869,6 @@ func (m *Manager) TriggerHooks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() - if err != nil { return err } @@ -935,7 +933,6 @@ func (m *Manager) GetTask(id string) *Task { } func (m *Manager) updateTaskState(taskId string, state string) { - taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). @@ -989,7 +986,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { } if ack, ok := m.ackKilledTasks.getValue(taskId); ok { ack <- struct{}{} - //close(ack) // It can even be left open? + // close(ack) // It can even be left open? } return @@ -1030,7 +1027,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { // Kill all tasks outside an environment (all unlocked tasks) func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { - toKill := m.roster.filtered(func(t *Task) bool { return !t.IsLocked() }) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index eeb2103f1..389b4b810 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -84,7 +84,8 @@ var schedEventsCh = make(chan scheduler.Event_Type) func runSchedulerController(ctx context.Context, state *schedulerState, - fidStore store.Singleton) error { + fidStore store.Singleton, +) error { // Set up communication from controller to state machine. go func() { for { @@ -103,7 +104,7 @@ func runSchedulerController(ctx context.Context, for { <-state.reviveOffersTrg doReviveOffers(ctx, state) - state.reviveOffersTrg <- struct{}{} + state.reviveOffersDone <- struct{}{} } }() @@ -272,7 +273,6 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // only one entry in the list, we signal back to commandqueue // otherwise, we log and ignore. return func(ctx context.Context, e *scheduler.Event) (err error) { - mesosMessage := e.GetMessage() if mesosMessage == nil { err = errors.New("message handler got bad MESSAGE") @@ -336,7 +336,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { return } state.taskman.internalEventCh <- ev - //state.handleDeviceEvent(ev) + // state.handleDeviceEvent(ev) } else { log.WithFields(logrus.Fields{ "type": incomingEvent.Type.String(), @@ -437,7 +437,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han timeResourceOffersCall := time.Now() var ( offers = e.GetOffers().GetOffers() - callOption = calls.RefuseSeconds(time.Second) //calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) + callOption = calls.RefuseSeconds(time.Second) // calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) tasksLaunchedThisCycle = 0 offersDeclined = 0 ) @@ -613,7 +613,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var offerWaitGroup sync.WaitGroup offerWaitGroup.Add(len(offers)) - for offerIndex, _ := range offers { + for offerIndex := range offers { go func(offerIndex int) { defer offerWaitGroup.Done() @@ -1013,7 +1013,6 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers)). WithField("offerHost", offer.Hostname)) - }(offerIndex) // end for offer closure } // end for _, offer := range offers offerWaitGroup.Wait() @@ -1094,7 +1093,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han machinesUsedSlice := func(machines map[string]struct{}) []string { // StringSet to StringSlice out := make([]string, len(machines)) i := 0 - for k, _ := range machines { + for k := range machines { out[i] = k i++ } @@ -1184,6 +1183,7 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { // have set through ACCEPT or DECLINE calls, in the hope that Mesos then sends us new resource offers. // This should generally run when we have received a TASK_FINISHED for some tasks, and we have more // tasks to run. + func (state *schedulerState) tryReviveOffers(ctx context.Context) { // limit the rate at which we request offer revival select { @@ -1274,7 +1274,7 @@ func logAllEvents() eventrules.Rule { } } offerIds := make([]string, len(off)) - for i, _ := range off { + for i := range off { offerIds[i] = off[i].GetID().Value } fields["offerIds"] = strings.Join(offerIds, ",") @@ -1335,7 +1335,6 @@ func makeTaskForMesosResources( descriptorDetector string, offerIDsToDecline map[mesos.OfferID]struct{}, ) (*Task, *mesos.TaskInfo) { - bindMap := make(channel.BindMap) for _, ch := range wants.InboundChannels { if ch.Addressing == channel.IPC { @@ -1368,7 +1367,7 @@ func makeTaskForMesosResources( Attributes: offer.Attributes, Hostname: offer.Hostname, } - state.taskman.AgentCache.Update(agentForCache) //thread safe + state.taskman.AgentCache.Update(agentForCache) // thread safe machinesUsed[offer.Hostname] = struct{}{} taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) @@ -1566,12 +1565,11 @@ func makeTaskForMesosResources( ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} if ok { - mesosTaskInfo.Executor.Command.Environment.Variables = - append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) + mesosTaskInfo.Executor.Command.Environment.Variables = append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) } return taskPtr, &mesosTaskInfo diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 9d783b36b..635480b64 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -69,8 +69,9 @@ type schedulerState struct { reviveTokens <-chan struct{} tasksToDeploy chan *ResourceOffersDeploymentRequest - reviveOffersTrg chan struct{} - random *rand.Rand + reviveOffersTrg chan struct{} + reviveOffersDone chan struct{} + random *rand.Rand // shouldn't change at runtime, so thread safe: role string @@ -106,8 +107,6 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( tasksToDeploy := make(chan *ResourceOffersDeploymentRequest, MAX_CONCURRENT_DEPLOY_REQUESTS) - reviveOffersTrg := make(chan struct{}) - state := &schedulerState{ taskman: taskman, fidStore: fidStore, @@ -117,7 +116,8 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( viper.GetDuration("mesosReviveWait"), nil), tasksToDeploy: tasksToDeploy, - reviveOffersTrg: reviveOffersTrg, + reviveOffersTrg: make(chan struct{}), + reviveOffersDone: make(chan struct{}), wantsTaskResources: mesos.Resources{}, executor: executorInfo, metricsAPI: metricsAPI, From e619a77f89b23186d15efb71774bc440d2359871 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 17 Oct 2024 12:11:31 +0200 Subject: [PATCH 2023/2352] [build] Bump to v1.21.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4817ada28..1a9839086 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 21 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 153a87cc1252591ad154b5c8a78cdc908b2e1bfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Sun, 20 Oct 2024 11:02:33 +0200 Subject: [PATCH 2024/2352] Revert "use two channel to communicate mesos REVIVE" This reverts commit e99d4195bb234bc0c7c2d078b5ff6a684d9012dd. --- core/task/manager.go | 34 +++++++++++++++++++--------------- core/task/scheduler.go | 32 +++++++++++++++++--------------- core/task/schedulerstate.go | 10 +++++----- 3 files changed, 41 insertions(+), 35 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 3ff33f457..95b10a262 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -91,9 +91,8 @@ type Manager struct { tasksToDeploy chan<- *ResourceOffersDeploymentRequest - reviveOffersTrg chan struct{} - reviveOffersDone chan struct{} - cq *controlcommands.CommandQueue + reviveOffersTrg chan struct{} + cq *controlcommands.CommandQueue tasksLaunched int tasksFinished int @@ -142,7 +141,6 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.cq = taskman.schedulerState.commandqueue taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - taskman.reviveOffersDone = taskman.schedulerState.reviveOffersDone taskman.ackKilledTasks = newAcks() schedState.setupCli() @@ -158,8 +156,7 @@ func (m *Manager) newTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, localBindMap channel.BindMap, - executorId mesos.ExecutorID, -) (t *Task) { + executorId mesos.ExecutorID) (t *Task) { newId := uid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), @@ -200,8 +197,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. if err != nil { return } - repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] // get IRepo pointer from RepoManager - if repo == nil { // should never end up here + repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] //get IRepo pointer from RepoManager + if repo == nil { //should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } @@ -226,6 +223,7 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. taskInfo := strings.Split(taskPath, "/tasks/") if len(taskInfo) == 1 { taskFilename = taskInfo[0] + } else { taskFilename = taskInfo[1] } @@ -282,7 +280,7 @@ func (m *Manager) removeInactiveClasses() { return } -func (m *Manager) RemoveReposClasses(repoPath string) { // Currently unused +func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused utils.EnsureTrailingSlash(&repoPath) _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { @@ -329,6 +327,7 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { } func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { + /* Here's what's gonna happen: 1) check if any tasks are already in Roster, whether they are already locked @@ -517,7 +516,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e timeReviveOffers := time.Now() timeDeployMu := time.Now() m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers - <-m.reviveOffersDone // we only continue when it's done + <-m.reviveOffersTrg // we only continue when it's done utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", log.WithField("tasksToRun", len(tasksToRun)). WithField("partition", envId)) @@ -598,7 +597,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // can't lock some of them, so we must roll back and keep them // unlocked in the roster. var deployedTaskIds []string - for taskPtr := range deployedTasks { + for taskPtr, _ := range deployedTasks { taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } @@ -613,11 +612,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } // Finally, we write to the roster. Point of no return! - for taskPtr := range deployedTasks { + for taskPtr, _ := range deployedTasks { m.roster.append(taskPtr) } if deploymentSuccess { - for taskPtr := range deployedTasks { + for taskPtr, _ := range deployedTasks { taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { @@ -630,6 +629,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { + taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -686,7 +686,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { taskPath := task.GetParentRolePath() for inbChName, endpoint := range task.GetLocalBindMap() { var bindMapKey string - if strings.HasPrefix(inbChName, "::") { // global channel alias + if strings.HasPrefix(inbChName, "::") { //global channel alias bindMapKey = inbChName // deduplication @@ -785,6 +785,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() + if err != nil { return err } @@ -869,6 +870,7 @@ func (m *Manager) TriggerHooks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() + if err != nil { return err } @@ -933,6 +935,7 @@ func (m *Manager) GetTask(id string) *Task { } func (m *Manager) updateTaskState(taskId string, state string) { + taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). @@ -986,7 +989,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { } if ack, ok := m.ackKilledTasks.getValue(taskId); ok { ack <- struct{}{} - // close(ack) // It can even be left open? + //close(ack) // It can even be left open? } return @@ -1027,6 +1030,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { // Kill all tasks outside an environment (all unlocked tasks) func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { + toKill := m.roster.filtered(func(t *Task) bool { return !t.IsLocked() }) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 389b4b810..eeb2103f1 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -84,8 +84,7 @@ var schedEventsCh = make(chan scheduler.Event_Type) func runSchedulerController(ctx context.Context, state *schedulerState, - fidStore store.Singleton, -) error { + fidStore store.Singleton) error { // Set up communication from controller to state machine. go func() { for { @@ -104,7 +103,7 @@ func runSchedulerController(ctx context.Context, for { <-state.reviveOffersTrg doReviveOffers(ctx, state) - state.reviveOffersDone <- struct{}{} + state.reviveOffersTrg <- struct{}{} } }() @@ -273,6 +272,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // only one entry in the list, we signal back to commandqueue // otherwise, we log and ignore. return func(ctx context.Context, e *scheduler.Event) (err error) { + mesosMessage := e.GetMessage() if mesosMessage == nil { err = errors.New("message handler got bad MESSAGE") @@ -336,7 +336,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { return } state.taskman.internalEventCh <- ev - // state.handleDeviceEvent(ev) + //state.handleDeviceEvent(ev) } else { log.WithFields(logrus.Fields{ "type": incomingEvent.Type.String(), @@ -437,7 +437,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han timeResourceOffersCall := time.Now() var ( offers = e.GetOffers().GetOffers() - callOption = calls.RefuseSeconds(time.Second) // calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) + callOption = calls.RefuseSeconds(time.Second) //calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) tasksLaunchedThisCycle = 0 offersDeclined = 0 ) @@ -613,7 +613,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var offerWaitGroup sync.WaitGroup offerWaitGroup.Add(len(offers)) - for offerIndex := range offers { + for offerIndex, _ := range offers { go func(offerIndex int) { defer offerWaitGroup.Done() @@ -1013,6 +1013,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). WithField("offers", len(offers)). WithField("offerHost", offer.Hostname)) + }(offerIndex) // end for offer closure } // end for _, offer := range offers offerWaitGroup.Wait() @@ -1093,7 +1094,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han machinesUsedSlice := func(machines map[string]struct{}) []string { // StringSet to StringSlice out := make([]string, len(machines)) i := 0 - for k := range machines { + for k, _ := range machines { out[i] = k i++ } @@ -1183,7 +1184,6 @@ func (state *schedulerState) statusUpdate() events.HandlerFunc { // have set through ACCEPT or DECLINE calls, in the hope that Mesos then sends us new resource offers. // This should generally run when we have received a TASK_FINISHED for some tasks, and we have more // tasks to run. - func (state *schedulerState) tryReviveOffers(ctx context.Context) { // limit the rate at which we request offer revival select { @@ -1274,7 +1274,7 @@ func logAllEvents() eventrules.Rule { } } offerIds := make([]string, len(off)) - for i := range off { + for i, _ := range off { offerIds[i] = off[i].GetID().Value } fields["offerIds"] = strings.Join(offerIds, ",") @@ -1335,6 +1335,7 @@ func makeTaskForMesosResources( descriptorDetector string, offerIDsToDecline map[mesos.OfferID]struct{}, ) (*Task, *mesos.TaskInfo) { + bindMap := make(channel.BindMap) for _, ch := range wants.InboundChannels { if ch.Addressing == channel.IPC { @@ -1367,7 +1368,7 @@ func makeTaskForMesosResources( Attributes: offer.Attributes, Hostname: offer.Hostname, } - state.taskman.AgentCache.Update(agentForCache) // thread safe + state.taskman.AgentCache.Update(agentForCache) //thread safe machinesUsed[offer.Hostname] = struct{}{} taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) @@ -1565,11 +1566,12 @@ func makeTaskForMesosResources( ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} if ok { - mesosTaskInfo.Executor.Command.Environment.Variables = append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) + mesosTaskInfo.Executor.Command.Environment.Variables = + append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) } return taskPtr, &mesosTaskInfo diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 635480b64..9d783b36b 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -69,9 +69,8 @@ type schedulerState struct { reviveTokens <-chan struct{} tasksToDeploy chan *ResourceOffersDeploymentRequest - reviveOffersTrg chan struct{} - reviveOffersDone chan struct{} - random *rand.Rand + reviveOffersTrg chan struct{} + random *rand.Rand // shouldn't change at runtime, so thread safe: role string @@ -107,6 +106,8 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( tasksToDeploy := make(chan *ResourceOffersDeploymentRequest, MAX_CONCURRENT_DEPLOY_REQUESTS) + reviveOffersTrg := make(chan struct{}) + state := &schedulerState{ taskman: taskman, fidStore: fidStore, @@ -116,8 +117,7 @@ func NewScheduler(taskman *Manager, fidStore store.Singleton, shutdown func()) ( viper.GetDuration("mesosReviveWait"), nil), tasksToDeploy: tasksToDeploy, - reviveOffersTrg: make(chan struct{}), - reviveOffersDone: make(chan struct{}), + reviveOffersTrg: reviveOffersTrg, wantsTaskResources: mesos.Resources{}, executor: executorInfo, metricsAPI: metricsAPI, From 0da8604e5d75271ae71db7b29b05280bb16b9238 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 21 Oct 2024 15:33:18 +0200 Subject: [PATCH 2025/2352] fix error handling in case of no resources error --- core/environment/transition_deploy.go | 4 +- core/task/manager.go | 58 +++++++++++++++++++-------- core/task/schedulerstate.go | 5 ++- 3 files changed, 46 insertions(+), 21 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 3267ad08c..cfe84fcb9 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -275,7 +275,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). WithField("detector", detector). - Error("role failed to deploy within timeout") + Error("role failed to deploy because of timeout") undeployableTaskRoles = append(undeployableTaskRoles, role.GetPath()) } else if roleStatus != task.ACTIVE { detector, ok := role.GetUserVars().Get("detector") @@ -288,7 +288,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). WithField("detector", detector). - Error("role failed to deploy within timeout") + Error("role failed to deploy because of timeout") inactiveTaskRoles = append(inactiveTaskRoles, role.GetPath()) } }) diff --git a/core/task/manager.go b/core/task/manager.go index 95b10a262..654d8f98c 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -326,6 +326,14 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { return } +// prefix will be prepended before name of descriptor +func logDescriptors(prefix string, logFunc func(format string, args ...interface{}), descriptos Descriptors) { + for _, desc := range descriptos { + printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) + logFunc("%s%s", prefix, printname) + } +} + func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { /* @@ -341,6 +349,10 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e 4) start the tasks in tasksToRun 5) ensure that all of them reach a CONFIGURED state */ + + // TODO: switch to this logger with envId everywhere + logWithId := log.WithField("partition", envId) + claimableTasks := m.roster.filtered(func(task *Task) bool { return task.IsClaimable() }) @@ -503,6 +515,17 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // The request object is used to pass the tasks to deploy and the outcome // channel to the deployment routine. + // reset all variable before try + deploymentSuccess = true + undeployedDescriptors = make(Descriptors, 0) + undeployableDescriptors = make(Descriptors, 0) + undeployedNonCriticalDescriptors = make(Descriptors, 0) + undeployedCriticalDescriptors = make(Descriptors, 0) + undeployableNonCriticalDescriptors = make(Descriptors, 0) + undeployableCriticalDescriptors = make(Descriptors, 0) + + deployedTasks = make(DeploymentMap) + outcomeCh := make(chan ResourceOffersOutcome) m.tasksToDeploy <- &ResourceOffersDeploymentRequest{ tasksToDeploy: tasksToRun, @@ -531,29 +554,21 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e undeployedDescriptors = roOutcome.undeployed undeployableDescriptors = roOutcome.undeployable - log.WithField("tasks", deployedTasks). - WithField("partition", envId). + logWithId.WithField("tasks", deployedTasks). Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) if len(deployedTasks) != len(tasksToRun) { // ↑ Not all roles could be deployed. If some were critical, // we cannot proceed with running this environment. Either way, // we keep the roles running since they might be useful in the future. - log.WithField("partition", envId). - Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + logWithId.Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) for _, desc := range undeployedDescriptors { if desc.TaskRole.GetTaskTraits().Critical == true { deploymentSuccess = false undeployedCriticalDescriptors = append(undeployedCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Errorf("critical task deployment failure: %s", printname) } else { undeployedNonCriticalDescriptors = append(undeployedNonCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Warnf("non-critical task deployment failure: %s", printname) } } @@ -561,15 +576,8 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e if desc.TaskRole.GetTaskTraits().Critical == true { deploymentSuccess = false undeployableCriticalDescriptors = append(undeployableCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Errorf("critical task deployment impossible: %s", printname) - go desc.TaskRole.UpdateStatus(UNDEPLOYABLE) } else { undeployableNonCriticalDescriptors = append(undeployableNonCriticalDescriptors, desc) - printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) - log.WithField("partition", envId). - Warnf("non-critical task deployment impossible: %s", printname) } } } @@ -587,6 +595,22 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } break DEPLOYMENT_ATTEMPTS_LOOP } + + log.WithField("partition", envId).Errorf("Deployment failed %d/%d attempts. Check messages in IL to figure out why. Retrying...", attemptCount+1, MAX_ATTEMPTS_PER_DEPLOY_REQUEST) + time.Sleep(time.Second * SLEEP_LENGTH_BETWEEN_PER_DEPLOY_REQUESTS) + } + } + + logDescriptors("critical task deployment impossible: ", logWithId.Errorf, undeployableCriticalDescriptors) + logDescriptors("critical task deployment failure: ", logWithId.Errorf, undeployedCriticalDescriptors) + + logDescriptors("non-critical task deployment failure: ", logWithId.Warningf, undeployedNonCriticalDescriptors) + logDescriptors("non-critical task deployment impossible: ", logWithId.Warningf, undeployableNonCriticalDescriptors) + + // After retries notify environment about failed critical tasks + for _, desc := range undeployableDescriptors { + if desc.TaskRole.GetTaskTraits().Critical == true { + desc.TaskRole.UpdateStatus(UNDEPLOYABLE) } } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 9d783b36b..e85e01ee1 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -49,8 +49,9 @@ import ( ) const ( - MAX_CONCURRENT_DEPLOY_REQUESTS = 100 - MAX_ATTEMPTS_PER_DEPLOY_REQUEST = 3 + MAX_CONCURRENT_DEPLOY_REQUESTS = 100 + MAX_ATTEMPTS_PER_DEPLOY_REQUEST = 3 + SLEEP_LENGTH_BETWEEN_PER_DEPLOY_REQUESTS = 1 // in seconds ) type schedulerState struct { From c6df054ac24d0a6fcd3245b363ed5ea9b4b5d28d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 22 Oct 2024 10:30:01 +0200 Subject: [PATCH 2026/2352] fixup! fix error handling in case of no resources error --- core/task/manager.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 654d8f98c..07396c958 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -326,9 +326,9 @@ func (m *Manager) RefreshClasses(taskClassesRequired []string) (err error) { return } -// prefix will be prepended before name of descriptor -func logDescriptors(prefix string, logFunc func(format string, args ...interface{}), descriptos Descriptors) { - for _, desc := range descriptos { +// prefix will be prepended before name of descriptor when printing name of each descriptor +func logDescriptors(prefix string, logFunc func(format string, args ...interface{}), descriptors Descriptors) { + for _, desc := range descriptors { printname := fmt.Sprintf("%s->%s", desc.TaskRole.GetPath(), desc.TaskClassName) logFunc("%s%s", prefix, printname) } From b14ce6b5ee7e60d28770644e0370dcaa97d597c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 18 Oct 2024 19:05:01 +0200 Subject: [PATCH 2027/2352] [core] ddsched plugin gRPC calls have timeout by default --- core/config.go | 2 + core/integration/ddsched/client.go | 31 ++++++------ core/integration/rpctimeoutinterceptor.go | 58 +++++++++++++++++++++++ 3 files changed, 76 insertions(+), 15 deletions(-) create mode 100644 core/integration/rpctimeoutinterceptor.go diff --git a/core/config.go b/core/config.go index f6418e94d..325bdae13 100644 --- a/core/config.go +++ b/core/config.go @@ -102,6 +102,7 @@ func setDefaults() error { viper.SetDefault("ccdbEndpoint", "http://ccdb-test.cern.ch:8080") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) + viper.SetDefault("ddSchedulergRPCTimeout", "5s") viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("trgServiceEndpoint", "//127.0.0.1:50060") @@ -170,6 +171,7 @@ func setFlags() error { pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") pflag.Bool("dcsServiceUseSystemProxy", viper.GetBool("dcsServiceUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") + pflag.Duration("ddSchedulergRPCTimeout", viper.GetDuration("ddSchedulergRPCTimeout"), "Timeout for gRPC calls in ddshed plugin") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("trgServiceEndpoint", viper.GetString("trgServiceEndpoint"), "Endpoint of the TRG gRPC service (`host:port`)") pflag.String("trgPollingInterval", viper.GetString("trgPollingInterval"), "How often to query the TRG gRPC service for run status (default: 3s)") diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index fde723750..7ae201029 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -38,12 +39,11 @@ import ( "google.golang.org/grpc/keepalive" ) -var log = logger.New(logrus.StandardLogger(),"ddschedclient") - +var log = logger.New(logrus.StandardLogger(), "ddschedclient") type RpcClient struct { ddpb.DataDistributionControlClient - conn *grpc.ClientConn + conn *grpc.ClientConn cancel context.CancelFunc } @@ -52,10 +52,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) "endpoint": endpoint, }).Debug("dialing DD scheduler endpoint") - dialOptions := []grpc.DialOption { + dialOptions := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithConnectParams(grpc.ConnectParams{ - Backoff: backoff.Config{ + Backoff: backoff.Config{ BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, @@ -68,14 +68,15 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), + grpc.WithUnaryInterceptor(integration.UnaryTimeoutInterceptor(viper.GetDuration("ddSchedulergRPCTimeout"), "ddsched gRPC call failed")), } if !viper.GetBool("ddSchedulerUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) } conn, err := grpc.DialContext(cxt, - endpoint, - dialOptions..., - ) + endpoint, + dialOptions..., + ) if err != nil { log.WithField("error", err.Error()). WithField("endpoint", endpoint). @@ -95,27 +96,27 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) for { select { - case ok := <- stateChangedNotify: + case ok := <-stateChangedNotify: if !ok { return } connState = conn.GetState() log.Debugf("DD scheduler client %s", connState.String()) go notifyFunc(connState) - case <- time.After(2 * time.Minute): + case <-time.After(2 * time.Minute): if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() } - case <- cxt.Done(): + case <-cxt.Done(): return } } }() - client := &RpcClient { + client := &RpcClient{ DataDistributionControlClient: ddpb.NewDataDistributionControlClient(conn), - conn: conn, - cancel: cancel, + conn: conn, + cancel: cancel, } return client @@ -131,4 +132,4 @@ func (m *RpcClient) GetConnState() connectivity.State { func (m *RpcClient) Close() error { m.cancel() return m.conn.Close() -} \ No newline at end of file +} diff --git a/core/integration/rpctimeoutinterceptor.go b/core/integration/rpctimeoutinterceptor.go new file mode 100644 index 000000000..636faaf6e --- /dev/null +++ b/core/integration/rpctimeoutinterceptor.go @@ -0,0 +1,58 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2021 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package integration + +import ( + "context" + "errors" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +func UnaryTimeoutInterceptor(timeout time.Duration, cause string) grpc.UnaryClientInterceptor { + return func( + ctx context.Context, + method string, + req, reply interface{}, + connection *grpc.ClientConn, + invoker grpc.UnaryInvoker, + opts ...grpc.CallOption, + ) error { + // Create a context with a timeout + ctx, cancel := context.WithTimeoutCause(ctx, timeout, errors.New(cause)) + defer cancel() // Ensure the context is canceled after the call + + // Invoke the RPC call with the new context + err := invoker(ctx, method, req, reply, connection, opts...) + if err != nil { + st, _ := status.FromError(err) + // Handle error, maybe logging or processing the error status + return st.Err() + } + return nil + } +} From d5d479d4b2f945d5356d716dc967091b74cf8ed4 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Oct 2024 12:27:21 +0200 Subject: [PATCH 2028/2352] [build] Bump to v1.22.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 1a9839086..469ac8191 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 21 -VERSION_PATCH := 1 +VERSION_MINOR := 22 +VERSION_PATCH := 0 From 4b0cd42feaff0dfcb3246e575385e3a67bbcf834 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Oct 2024 15:58:12 +0200 Subject: [PATCH 2029/2352] [core] Pull fresh Bookkeeping protofiles --- core/integration/bookkeeping/protos/bkcommon.proto | 8 ++++---- .../integration/bookkeeping/protos/environment.proto | 3 --- core/integration/bookkeeping/protos/log.proto | 12 ------------ 3 files changed, 4 insertions(+), 19 deletions(-) diff --git a/core/integration/bookkeeping/protos/bkcommon.proto b/core/integration/bookkeeping/protos/bkcommon.proto index 7b522b938..d213022af 100644 --- a/core/integration/bookkeeping/protos/bkcommon.proto +++ b/core/integration/bookkeeping/protos/bkcommon.proto @@ -109,18 +109,18 @@ message Run { message LHCFill { int32 fillNumber = 1; // Timestamp of the start of the stable beam (if it applies) - optional int64 stableBeamStart = 2; + optional int64 stableBeamsStart = 7; // Timestamp of the end of the stable beam (if it applies) - optional int64 stableBeamEnd = 3; + optional int64 stableBeamsEnd = 8; // Duration of the stable beam (if it applies) - optional int64 stableBeamDuration = 4; + optional int64 stableBeamsDuration = 9; string beamType = 5; string fillingSchemeName = 6; } message User { // The unique CERN identifier of this user. - int32 externalId = 1; + optional int32 externalId = 1; // The unique identifier of this entity. optional int32 id = 2; // Name of the user. diff --git a/core/integration/bookkeeping/protos/environment.proto b/core/integration/bookkeeping/protos/environment.proto index 187f05640..137850931 100644 --- a/core/integration/bookkeeping/protos/environment.proto +++ b/core/integration/bookkeeping/protos/environment.proto @@ -23,7 +23,6 @@ message EnvironmentCreationRequest { message EnvironmentUpdateRequest { string id = 1; - optional int64 toredownAt = 2; optional string status = 3; optional string statusMessage = 4; } @@ -36,8 +35,6 @@ message Environment { int64 createdAt = 2; // Unix timestamp when this entity was last updated. int64 updatedAt = 3; - // Unix timestamp when this entity was tore down. - int64 toredownAt = 4; // The status of the environment. string status = 5; // A message explaining the status or the current state of the environment. diff --git a/core/integration/bookkeeping/protos/log.proto b/core/integration/bookkeeping/protos/log.proto index 583dd5562..d61235b7d 100644 --- a/core/integration/bookkeeping/protos/log.proto +++ b/core/integration/bookkeeping/protos/log.proto @@ -49,7 +49,6 @@ message Log { int32 rootLogId = 8; // Array of minified Run objects. repeated MinimalRun runs = 9; - repeated Subsystem subsystems = 10; LogSubtype subtype = 11; repeated Tag tags = 12; string text = 14; @@ -67,7 +66,6 @@ enum LogOrigin { enum LogSubtype { LOG_SUBTYPE_NULL = 0; LOG_SUBTYPE_RUN = 1; - LOG_SUBTYPE_SUBSYSTEM = 2; LOG_SUBTYPE_ANNOUNCEMENT = 3; LOG_SUBTYPE_INTERVENTION = 4; LOG_SUBTYPE_COMMENT = 5; @@ -78,16 +76,6 @@ message MinimalRun { int32 id = 2; } -message Subsystem { - // Unix timestamp when this entity was created. - int64 createdAt = 1; - int32 id = 2; - // The label value of the subsystem. - string name = 3; - // Unix timestamp when this entity was last updated. - int64 updatedAt = 5; -} - message Tag { // Unix timestamp when this entity was created. int64 createdAt = 1; From 098ea732595b155f6d21b6733e389bab727b4291 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Oct 2024 16:00:22 +0200 Subject: [PATCH 2030/2352] [core] Regenerate Bookkeeping protofiles --- .../bookkeeping/protos/bkcommon.pb.go | 244 ++++++++-------- .../bookkeeping/protos/environment.pb.go | 98 +++---- .../bookkeeping/protos/environment_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/flp.pb.go | 2 +- .../bookkeeping/protos/flp_grpc.pb.go | 2 +- .../bookkeeping/protos/lhcFill.pb.go | 2 +- .../bookkeeping/protos/lhcFill_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/log.pb.go | 269 +++++------------- .../bookkeeping/protos/log_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/run.pb.go | 2 +- .../bookkeeping/protos/run_grpc.pb.go | 2 +- 11 files changed, 248 insertions(+), 379 deletions(-) diff --git a/core/integration/bookkeeping/protos/bkcommon.pb.go b/core/integration/bookkeeping/protos/bkcommon.pb.go index fa8bea6f4..c7f13d4b8 100644 --- a/core/integration/bookkeeping/protos/bkcommon.pb.go +++ b/core/integration/bookkeeping/protos/bkcommon.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/bkcommon.proto package bkpb @@ -559,13 +559,13 @@ type LHCFill struct { FillNumber int32 `protobuf:"varint,1,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` // Timestamp of the start of the stable beam (if it applies) - StableBeamStart *int64 `protobuf:"varint,2,opt,name=stableBeamStart,proto3,oneof" json:"stableBeamStart,omitempty"` + StableBeamsStart *int64 `protobuf:"varint,7,opt,name=stableBeamsStart,proto3,oneof" json:"stableBeamsStart,omitempty"` // Timestamp of the end of the stable beam (if it applies) - StableBeamEnd *int64 `protobuf:"varint,3,opt,name=stableBeamEnd,proto3,oneof" json:"stableBeamEnd,omitempty"` + StableBeamsEnd *int64 `protobuf:"varint,8,opt,name=stableBeamsEnd,proto3,oneof" json:"stableBeamsEnd,omitempty"` // Duration of the stable beam (if it applies) - StableBeamDuration *int64 `protobuf:"varint,4,opt,name=stableBeamDuration,proto3,oneof" json:"stableBeamDuration,omitempty"` - BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` - FillingSchemeName string `protobuf:"bytes,6,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` + StableBeamsDuration *int64 `protobuf:"varint,9,opt,name=stableBeamsDuration,proto3,oneof" json:"stableBeamsDuration,omitempty"` + BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` + FillingSchemeName string `protobuf:"bytes,6,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` } func (x *LHCFill) Reset() { @@ -607,23 +607,23 @@ func (x *LHCFill) GetFillNumber() int32 { return 0 } -func (x *LHCFill) GetStableBeamStart() int64 { - if x != nil && x.StableBeamStart != nil { - return *x.StableBeamStart +func (x *LHCFill) GetStableBeamsStart() int64 { + if x != nil && x.StableBeamsStart != nil { + return *x.StableBeamsStart } return 0 } -func (x *LHCFill) GetStableBeamEnd() int64 { - if x != nil && x.StableBeamEnd != nil { - return *x.StableBeamEnd +func (x *LHCFill) GetStableBeamsEnd() int64 { + if x != nil && x.StableBeamsEnd != nil { + return *x.StableBeamsEnd } return 0 } -func (x *LHCFill) GetStableBeamDuration() int64 { - if x != nil && x.StableBeamDuration != nil { - return *x.StableBeamDuration +func (x *LHCFill) GetStableBeamsDuration() int64 { + if x != nil && x.StableBeamsDuration != nil { + return *x.StableBeamsDuration } return 0 } @@ -648,7 +648,7 @@ type User struct { unknownFields protoimpl.UnknownFields // The unique CERN identifier of this user. - ExternalId int32 `protobuf:"varint,1,opt,name=externalId,proto3" json:"externalId,omitempty"` + ExternalId *int32 `protobuf:"varint,1,opt,name=externalId,proto3,oneof" json:"externalId,omitempty"` // The unique identifier of this entity. Id *int32 `protobuf:"varint,2,opt,name=id,proto3,oneof" json:"id,omitempty"` // Name of the user. @@ -688,8 +688,8 @@ func (*User) Descriptor() ([]byte, []int) { } func (x *User) GetExternalId() int32 { - if x != nil { - return x.ExternalId + if x != nil && x.ExternalId != nil { + return *x.ExternalId } return 0 } @@ -927,113 +927,115 @@ var file_protos_bkcommon_proto_rawDesc = []byte{ 0x0a, 0x06, 0x5f, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x70, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xbf, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xc8, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x0f, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, - 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, - 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x33, 0x0a, 0x12, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, 0x12, 0x73, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, - 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, - 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x12, 0x0a, 0x10, 0x5f, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, - 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x45, 0x6e, - 0x64, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x56, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, - 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, - 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, - 0x22, 0x90, 0x01, 0x0a, 0x09, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x13, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, - 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2a, 0xe7, 0x02, 0x0a, - 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, - 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, - 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, - 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, - 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, - 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, - 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, - 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, - 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, - 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, - 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, - 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, - 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, - 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, - 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, - 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, - 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, - 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x04, 0x2a, 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, - 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, - 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, - 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, - 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, - 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, - 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, - 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, - 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, + 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x10, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, + 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0e, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x35, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, + 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, + 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x6a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0a, 0x65, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x13, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, + 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x22, 0x90, 0x01, + 0x0a, 0x09, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, + 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, + 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, + 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, + 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, + 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, + 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, + 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, + 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, + 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, + 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, + 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, + 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, + 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, + 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, + 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, + 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, + 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, + 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, + 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, + 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, + 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x2a, 0xb0, + 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, + 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, + 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, + 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, - 0x18, 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, - 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, - 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, + 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, + 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, + 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, + 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, - 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, - 0x54, 0x44, 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, + 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, + 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, + 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, 0x14, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, + 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, + 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, + 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index f23a902f5..aa2c31c5d 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/environment.proto package bkpb @@ -97,7 +97,6 @@ type EnvironmentUpdateRequest struct { unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - ToredownAt *int64 `protobuf:"varint,2,opt,name=toredownAt,proto3,oneof" json:"toredownAt,omitempty"` Status *string `protobuf:"bytes,3,opt,name=status,proto3,oneof" json:"status,omitempty"` StatusMessage *string `protobuf:"bytes,4,opt,name=statusMessage,proto3,oneof" json:"statusMessage,omitempty"` } @@ -141,13 +140,6 @@ func (x *EnvironmentUpdateRequest) GetId() string { return "" } -func (x *EnvironmentUpdateRequest) GetToredownAt() int64 { - if x != nil && x.ToredownAt != nil { - return *x.ToredownAt - } - return 0 -} - func (x *EnvironmentUpdateRequest) GetStatus() string { if x != nil && x.Status != nil { return *x.Status @@ -172,8 +164,6 @@ type Environment struct { CreatedAt int64 `protobuf:"varint,2,opt,name=createdAt,proto3" json:"createdAt,omitempty"` // Unix timestamp when this entity was last updated. UpdatedAt int64 `protobuf:"varint,3,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` - // Unix timestamp when this entity was tore down. - ToredownAt int64 `protobuf:"varint,4,opt,name=toredownAt,proto3" json:"toredownAt,omitempty"` // The status of the environment. Status string `protobuf:"bytes,5,opt,name=status,proto3" json:"status,omitempty"` // A message explaining the status or the current state of the environment. @@ -235,13 +225,6 @@ func (x *Environment) GetUpdatedAt() int64 { return 0 } -func (x *Environment) GetToredownAt() int64 { - if x != nil { - return x.ToredownAt - } - return 0 -} - func (x *Environment) GetStatus() string { if x != nil { return x.Status @@ -282,50 +265,45 @@ var file_protos_environment_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x10, 0x72, 0x61, 0x77, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x23, - 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x48, 0x00, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, - 0x12, 0x29, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xe0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, 0x6e, 0x41, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x6f, 0x77, - 0x6e, 0x41, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x27, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, 0x0a, 0x12, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x51, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x32, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1b, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0xc0, 0x01, 0x0a, 0x0b, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, + 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, + 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x32, 0xb8, 0x01, 0x0a, 0x12, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x51, 0x0a, + 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, - 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, - 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x4f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index 278891624..393fc5c2e 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.28.2 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index ee7cdb6ff..750a3608d 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index 0f72d7660..40f5f3e19 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.28.2 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill.pb.go b/core/integration/bookkeeping/protos/lhcFill.pb.go index a1cb14d9d..795321ac6 100644 --- a/core/integration/bookkeeping/protos/lhcFill.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go index cf2ad508e..5cfbe2c78 100644 --- a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.28.2 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index fc8090806..da160cd66 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/log.proto package bkpb @@ -74,7 +74,6 @@ type LogSubtype int32 const ( LogSubtype_LOG_SUBTYPE_NULL LogSubtype = 0 LogSubtype_LOG_SUBTYPE_RUN LogSubtype = 1 - LogSubtype_LOG_SUBTYPE_SUBSYSTEM LogSubtype = 2 LogSubtype_LOG_SUBTYPE_ANNOUNCEMENT LogSubtype = 3 LogSubtype_LOG_SUBTYPE_INTERVENTION LogSubtype = 4 LogSubtype_LOG_SUBTYPE_COMMENT LogSubtype = 5 @@ -85,7 +84,6 @@ var ( LogSubtype_name = map[int32]string{ 0: "LOG_SUBTYPE_NULL", 1: "LOG_SUBTYPE_RUN", - 2: "LOG_SUBTYPE_SUBSYSTEM", 3: "LOG_SUBTYPE_ANNOUNCEMENT", 4: "LOG_SUBTYPE_INTERVENTION", 5: "LOG_SUBTYPE_COMMENT", @@ -93,7 +91,6 @@ var ( LogSubtype_value = map[string]int32{ "LOG_SUBTYPE_NULL": 0, "LOG_SUBTYPE_RUN": 1, - "LOG_SUBTYPE_SUBSYSTEM": 2, "LOG_SUBTYPE_ANNOUNCEMENT": 3, "LOG_SUBTYPE_INTERVENTION": 4, "LOG_SUBTYPE_COMMENT": 5, @@ -334,12 +331,11 @@ type Log struct { Replies int32 `protobuf:"varint,7,opt,name=Replies,proto3" json:"Replies,omitempty"` RootLogId int32 `protobuf:"varint,8,opt,name=rootLogId,proto3" json:"rootLogId,omitempty"` // Array of minified Run objects. - Runs []*MinimalRun `protobuf:"bytes,9,rep,name=runs,proto3" json:"runs,omitempty"` - Subsystems []*Subsystem `protobuf:"bytes,10,rep,name=subsystems,proto3" json:"subsystems,omitempty"` - Subtype LogSubtype `protobuf:"varint,11,opt,name=subtype,proto3,enum=o2.bookkeeping.LogSubtype" json:"subtype,omitempty"` - Tags []*Tag `protobuf:"bytes,12,rep,name=tags,proto3" json:"tags,omitempty"` - Text string `protobuf:"bytes,14,opt,name=text,proto3" json:"text,omitempty"` - Title string `protobuf:"bytes,15,opt,name=title,proto3" json:"title,omitempty"` + Runs []*MinimalRun `protobuf:"bytes,9,rep,name=runs,proto3" json:"runs,omitempty"` + Subtype LogSubtype `protobuf:"varint,11,opt,name=subtype,proto3,enum=o2.bookkeeping.LogSubtype" json:"subtype,omitempty"` + Tags []*Tag `protobuf:"bytes,12,rep,name=tags,proto3" json:"tags,omitempty"` + Text string `protobuf:"bytes,14,opt,name=text,proto3" json:"text,omitempty"` + Title string `protobuf:"bytes,15,opt,name=title,proto3" json:"title,omitempty"` // Unix timestamp when this entity was last updated. UpdatedAt int64 `protobuf:"varint,16,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` } @@ -439,13 +435,6 @@ func (x *Log) GetRuns() []*MinimalRun { return nil } -func (x *Log) GetSubsystems() []*Subsystem { - if x != nil { - return x.Subsystems - } - return nil -} - func (x *Log) GetSubtype() LogSubtype { if x != nil { return x.Subtype @@ -536,80 +525,6 @@ func (x *MinimalRun) GetId() int32 { return 0 } -type Subsystem struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Unix timestamp when this entity was created. - CreatedAt int64 `protobuf:"varint,1,opt,name=createdAt,proto3" json:"createdAt,omitempty"` - Id int32 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"` - // The label value of the subsystem. - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - // Unix timestamp when this entity was last updated. - UpdatedAt int64 `protobuf:"varint,5,opt,name=updatedAt,proto3" json:"updatedAt,omitempty"` -} - -func (x *Subsystem) Reset() { - *x = Subsystem{} - if protoimpl.UnsafeEnabled { - mi := &file_protos_log_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Subsystem) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Subsystem) ProtoMessage() {} - -func (x *Subsystem) ProtoReflect() protoreflect.Message { - mi := &file_protos_log_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Subsystem.ProtoReflect.Descriptor instead. -func (*Subsystem) Descriptor() ([]byte, []int) { - return file_protos_log_proto_rawDescGZIP(), []int{4} -} - -func (x *Subsystem) GetCreatedAt() int64 { - if x != nil { - return x.CreatedAt - } - return 0 -} - -func (x *Subsystem) GetId() int32 { - if x != nil { - return x.Id - } - return 0 -} - -func (x *Subsystem) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Subsystem) GetUpdatedAt() int64 { - if x != nil { - return x.UpdatedAt - } - return 0 -} - type Tag struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -635,7 +550,7 @@ type Tag struct { func (x *Tag) Reset() { *x = Tag{} if protoimpl.UnsafeEnabled { - mi := &file_protos_log_proto_msgTypes[5] + mi := &file_protos_log_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -648,7 +563,7 @@ func (x *Tag) String() string { func (*Tag) ProtoMessage() {} func (x *Tag) ProtoReflect() protoreflect.Message { - mi := &file_protos_log_proto_msgTypes[5] + mi := &file_protos_log_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -661,7 +576,7 @@ func (x *Tag) ProtoReflect() protoreflect.Message { // Deprecated: Use Tag.ProtoReflect.Descriptor instead. func (*Tag) Descriptor() ([]byte, []int) { - return file_protos_log_proto_rawDescGZIP(), []int{5} + return file_protos_log_proto_rawDescGZIP(), []int{4} } func (x *Tag) GetCreatedAt() int64 { @@ -753,7 +668,7 @@ var file_protos_log_proto_rawDesc = []byte{ 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x22, 0xce, 0x04, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, + 0x41, 0x74, 0x22, 0x93, 0x04, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x3c, 0x0a, 0x0b, 0x61, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b, 0x61, 0x74, 0x74, @@ -775,74 +690,62 @@ var file_protos_log_proto_rawDesc = []byte{ 0x74, 0x4c, 0x6f, 0x67, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, - 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x0a, 0x73, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, - 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, - 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x52, 0x07, - 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x75, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, - 0x6b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x1c, 0x0a, 0x09, + 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, + 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, + 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x2e, + 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x61, 0x67, 0x52, + 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, + 0x6c, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x4d, 0x69, 0x6e, 0x69, + 0x6d, 0x61, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x22, 0xfa, 0x01, 0x0a, 0x03, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0xfa, 0x01, 0x0a, - 0x03, 0x54, 0x61, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, - 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x67, - 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, - 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, - 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, - 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, 0x02, 0x2a, 0xa7, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, - 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, - 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, - 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, - 0x4e, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x10, 0x02, 0x12, 0x1c, - 0x0a, 0x18, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, - 0x4e, 0x4f, 0x55, 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, - 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, - 0x52, 0x56, 0x45, 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, - 0x54, 0x10, 0x05, 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, - 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x4c, 0x6f, 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, - 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6d, 0x6f, + 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6d, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, + 0x45, 0x64, 0x69, 0x74, 0x65, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, + 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x2a, 0x4e, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x13, + 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x4e, 0x55, 0x4c, + 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, + 0x4e, 0x5f, 0x48, 0x55, 0x4d, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x4c, 0x4f, 0x47, + 0x5f, 0x4f, 0x52, 0x49, 0x47, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x43, 0x45, 0x53, 0x53, 0x10, + 0x02, 0x2a, 0x8c, 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x10, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x55, + 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x55, 0x4e, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4c, + 0x4f, 0x47, 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x4e, 0x4e, 0x4f, 0x55, + 0x4e, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x1c, 0x0a, 0x18, 0x4c, 0x4f, 0x47, + 0x5f, 0x53, 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x45, + 0x4e, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x47, 0x5f, 0x53, + 0x55, 0x42, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, + 0x32, 0x4f, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x41, + 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, + 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, + 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x4c, 0x6f, + 0x67, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -858,7 +761,7 @@ func file_protos_log_proto_rawDescGZIP() []byte { } var file_protos_log_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_protos_log_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_protos_log_proto_msgTypes = make([]protoimpl.MessageInfo, 5) var file_protos_log_proto_goTypes = []interface{}{ (LogOrigin)(0), // 0: o2.bookkeeping.LogOrigin (LogSubtype)(0), // 1: o2.bookkeeping.LogSubtype @@ -866,25 +769,23 @@ var file_protos_log_proto_goTypes = []interface{}{ (*Attachment)(nil), // 3: o2.bookkeeping.Attachment (*Log)(nil), // 4: o2.bookkeeping.Log (*MinimalRun)(nil), // 5: o2.bookkeeping.MinimalRun - (*Subsystem)(nil), // 6: o2.bookkeeping.Subsystem - (*Tag)(nil), // 7: o2.bookkeeping.Tag - (*User)(nil), // 8: o2.bookkeeping.User + (*Tag)(nil), // 6: o2.bookkeeping.Tag + (*User)(nil), // 7: o2.bookkeeping.User } var file_protos_log_proto_depIdxs = []int32{ 3, // 0: o2.bookkeeping.Log.attachments:type_name -> o2.bookkeeping.Attachment - 8, // 1: o2.bookkeeping.Log.author:type_name -> o2.bookkeeping.User + 7, // 1: o2.bookkeeping.Log.author:type_name -> o2.bookkeeping.User 0, // 2: o2.bookkeeping.Log.origin:type_name -> o2.bookkeeping.LogOrigin 5, // 3: o2.bookkeeping.Log.runs:type_name -> o2.bookkeeping.MinimalRun - 6, // 4: o2.bookkeeping.Log.subsystems:type_name -> o2.bookkeeping.Subsystem - 1, // 5: o2.bookkeeping.Log.subtype:type_name -> o2.bookkeeping.LogSubtype - 7, // 6: o2.bookkeeping.Log.tags:type_name -> o2.bookkeeping.Tag - 2, // 7: o2.bookkeeping.LogService.Create:input_type -> o2.bookkeeping.LogCreationRequest - 4, // 8: o2.bookkeeping.LogService.Create:output_type -> o2.bookkeeping.Log - 8, // [8:9] is the sub-list for method output_type - 7, // [7:8] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 1, // 4: o2.bookkeeping.Log.subtype:type_name -> o2.bookkeeping.LogSubtype + 6, // 5: o2.bookkeeping.Log.tags:type_name -> o2.bookkeeping.Tag + 2, // 6: o2.bookkeeping.LogService.Create:input_type -> o2.bookkeeping.LogCreationRequest + 4, // 7: o2.bookkeeping.LogService.Create:output_type -> o2.bookkeeping.Log + 7, // [7:8] is the sub-list for method output_type + 6, // [6:7] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_protos_log_proto_init() } @@ -943,18 +844,6 @@ func file_protos_log_proto_init() { } } file_protos_log_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Subsystem); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_protos_log_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Tag); i { case 0: return &v.state @@ -969,14 +858,14 @@ func file_protos_log_proto_init() { } file_protos_log_proto_msgTypes[0].OneofWrappers = []interface{}{} file_protos_log_proto_msgTypes[2].OneofWrappers = []interface{}{} - file_protos_log_proto_msgTypes[5].OneofWrappers = []interface{}{} + file_protos_log_proto_msgTypes[4].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_log_proto_rawDesc, NumEnums: 2, - NumMessages: 6, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 112673309..4926be8b2 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.28.2 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index ab0a07e7e..932832a6a 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc v5.28.2 // source: protos/run.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index b184acf19..57735ad17 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.28.2 // source: protos/run.proto package bkpb From f4727e3cb837a31e27a9da6582cccca4f852e68c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 22 Oct 2024 16:03:31 +0200 Subject: [PATCH 2031/2352] [core] Adapt to new Bookkeeping lhcInfo parameter names --- core/integration/bookkeeping/plugin.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index ac8625208..aaa0ecfda 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1265,7 +1265,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { inEnv := bkpb.EnvironmentUpdateRequest{ Id: env.Id().String(), - ToredownAt: &toredownAt, Status: &status, StatusMessage: &statusMessage, } @@ -1444,11 +1443,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole.SetGlobalRuntimeVar("fill_info_fill_number", string(lhcInfo.FillNumber)) parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", lhcInfo.FillingSchemeName) parentRole.SetGlobalRuntimeVar("fill_info_beam_type", lhcInfo.BeamType) - if lhcInfo.StableBeamStart != nil { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(*lhcInfo.StableBeamStart, 10)) + if lhcInfo.StableBeamsStart != nil { + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(*lhcInfo.StableBeamsStart, 10)) } - if lhcInfo.StableBeamEnd != nil { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(*lhcInfo.StableBeamEnd, 10)) + if lhcInfo.StableBeamsEnd != nil { + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(*lhcInfo.StableBeamsEnd, 10)) } log.WithField("partition", envId). WithField("level", infologger.IL_Devel). @@ -1540,7 +1539,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("bookkeeping plugin RetrieveFillInfo error") call.VarStack["__call_error_reason"] = err.Error() call.VarStack["__call_error"] = callFailedStr - } else if (lhcFill.StableBeamStart != nil && *lhcFill.StableBeamStart != 0) && (lhcFill.StableBeamEnd == nil || *lhcFill.StableBeamEnd == 0) { + } else if (lhcFill.StableBeamsStart != nil && *lhcFill.StableBeamsStart != 0) && (lhcFill.StableBeamsEnd == nil || *lhcFill.StableBeamsEnd == 0) { // we enter here only if stable beams started and are not over (stable beams start exists && stable beams end does not exist) log.WithField("partition", envId). WithField("level", infologger.IL_Devel). From 1f6608b8701f987eca40baee49db59669052b737 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Oct 2024 11:31:15 +0200 Subject: [PATCH 2032/2352] [build] Bump to v1.22.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 469ac8191..4936c27ec 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 22 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 0d1616e8bfdf8fe3403e834fde8834d92b732105 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Oct 2024 13:42:39 +0200 Subject: [PATCH 2033/2352] [core] Increase default DD scheduler gRPC timeout --- core/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/config.go b/core/config.go index 325bdae13..0b569eb2d 100644 --- a/core/config.go +++ b/core/config.go @@ -102,7 +102,7 @@ func setDefaults() error { viper.SetDefault("ccdbEndpoint", "http://ccdb-test.cern.ch:8080") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) - viper.SetDefault("ddSchedulergRPCTimeout", "5s") + viper.SetDefault("ddSchedulergRPCTimeout", "30s") viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("trgServiceEndpoint", "//127.0.0.1:50060") From cd8b9c416a6fdf9c1b67c44ff07fdf42c0bd440c Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Oct 2024 15:22:18 +0200 Subject: [PATCH 2034/2352] [core] Make new ddsched timeout only apply to GetData status calls --- core/config.go | 4 ++-- core/integration/ddsched/client.go | 2 -- core/integration/ddsched/plugin.go | 13 +++++++------ 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/core/config.go b/core/config.go index 0b569eb2d..e181174f2 100644 --- a/core/config.go +++ b/core/config.go @@ -102,7 +102,7 @@ func setDefaults() error { viper.SetDefault("ccdbEndpoint", "http://ccdb-test.cern.ch:8080") viper.SetDefault("dcsServiceEndpoint", "//127.0.0.1:50051") viper.SetDefault("dcsServiceUseSystemProxy", false) - viper.SetDefault("ddSchedulergRPCTimeout", "30s") + viper.SetDefault("ddSchedulerStatusTimeout", "30s") viper.SetDefault("ddSchedulerEndpoint", "//127.0.0.1:50052") viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("trgServiceEndpoint", "//127.0.0.1:50060") @@ -171,7 +171,7 @@ func setFlags() error { pflag.String("dcsServiceEndpoint", viper.GetString("dcsServiceEndpoint"), "Endpoint of the DCS gRPC service (`host:port`)") pflag.Bool("dcsServiceUseSystemProxy", viper.GetBool("dcsServiceUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("ddSchedulerEndpoint", viper.GetString("ddSchedulerEndpoint"), "Endpoint of the DD scheduler gRPC service (`host:port`)") - pflag.Duration("ddSchedulergRPCTimeout", viper.GetDuration("ddSchedulergRPCTimeout"), "Timeout for gRPC calls in ddshed plugin") + pflag.Duration("ddSchedulerStatusTimeout", viper.GetDuration("ddSchedulerStatusTimeout"), "Timeout for status calls in ddshed plugin") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("trgServiceEndpoint", viper.GetString("trgServiceEndpoint"), "Endpoint of the TRG gRPC service (`host:port`)") pflag.String("trgPollingInterval", viper.GetString("trgPollingInterval"), "How often to query the TRG gRPC service for run status (default: 3s)") diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 7ae201029..565d3c488 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -29,7 +29,6 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/core/integration" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -68,7 +67,6 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), - grpc.WithUnaryInterceptor(integration.UnaryTimeoutInterceptor(viper.GetDuration("ddSchedulergRPCTimeout"), "ddsched gRPC call failed")), } if !viper.GetBool("ddSchedulerUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 17f16db07..ce3f88f3c 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -52,11 +52,10 @@ import ( ) const ( - DDSCHED_DIAL_TIMEOUT = 2 * time.Second - DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second - DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second - DDSCHED_DEFAULT_POLLING_TIMEOUT = 30 * time.Second - TOPIC = topic.IntegratedService + topic.Separator + "ddsched" + DDSCHED_DIAL_TIMEOUT = 2 * time.Second + DDSCHED_INITIALIZE_TIMEOUT = 30 * time.Second + DDSCHED_TERMINATE_TIMEOUT = 30 * time.Second + TOPIC = topic.IntegratedService + topic.Separator + "ddsched" ) type Plugin struct { @@ -161,7 +160,9 @@ func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]map[string]s PartitionId: envId.String(), EnvironmentId: envId.String(), } - state, err := p.ddSchedClient.PartitionStatus(context.Background(), &in, grpc.EmptyCallOption{}) + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("ddschedStatusTimeout")) + state, err := p.ddSchedClient.PartitionStatus(ctx, &in, grpc.EmptyCallOption{}) + cancel() if err != nil { continue } From 24a8e720f1eb23296eae79c1e444ea49a798f473 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Oct 2024 15:59:23 +0200 Subject: [PATCH 2035/2352] [core] Remove RPC interceptor --- core/integration/rpctimeoutinterceptor.go | 58 ----------------------- 1 file changed, 58 deletions(-) delete mode 100644 core/integration/rpctimeoutinterceptor.go diff --git a/core/integration/rpctimeoutinterceptor.go b/core/integration/rpctimeoutinterceptor.go deleted file mode 100644 index 636faaf6e..000000000 --- a/core/integration/rpctimeoutinterceptor.go +++ /dev/null @@ -1,58 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2021 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package integration - -import ( - "context" - "errors" - "time" - - "google.golang.org/grpc" - "google.golang.org/grpc/status" -) - -func UnaryTimeoutInterceptor(timeout time.Duration, cause string) grpc.UnaryClientInterceptor { - return func( - ctx context.Context, - method string, - req, reply interface{}, - connection *grpc.ClientConn, - invoker grpc.UnaryInvoker, - opts ...grpc.CallOption, - ) error { - // Create a context with a timeout - ctx, cancel := context.WithTimeoutCause(ctx, timeout, errors.New(cause)) - defer cancel() // Ensure the context is canceled after the call - - // Invoke the RPC call with the new context - err := invoker(ctx, method, req, reply, connection, opts...) - if err != nil { - st, _ := status.FromError(err) - // Handle error, maybe logging or processing the error status - return st.Err() - } - return nil - } -} From 4dfed9513805d9816ff761313f92f78e42483cd9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 23 Oct 2024 16:14:34 +0200 Subject: [PATCH 2036/2352] [core] Ensure TRG timeouts are obeyed + add polling timeout --- core/config.go | 6 ++- core/integration/trg/plugin.go | 77 +++++++++++++++++++++++----------- 2 files changed, 58 insertions(+), 25 deletions(-) diff --git a/core/config.go b/core/config.go index e181174f2..a6a891f0f 100644 --- a/core/config.go +++ b/core/config.go @@ -107,6 +107,8 @@ func setDefaults() error { viper.SetDefault("ddSchedulerUseSystemProxy", false) viper.SetDefault("trgServiceEndpoint", "//127.0.0.1:50060") viper.SetDefault("trgPollingInterval", "3s") + viper.SetDefault("trgPollingTimeout", "3s") + viper.SetDefault("trgReconciliationTimeout", "5s") viper.SetDefault("odcEndpoint", "//127.0.0.1:50053") viper.SetDefault("odcPollingInterval", "3s") viper.SetDefault("odcUseSystemProxy", false) @@ -174,7 +176,9 @@ func setFlags() error { pflag.Duration("ddSchedulerStatusTimeout", viper.GetDuration("ddSchedulerStatusTimeout"), "Timeout for status calls in ddshed plugin") pflag.Bool("ddSchedulerUseSystemProxy", viper.GetBool("ddSchedulerUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") pflag.String("trgServiceEndpoint", viper.GetString("trgServiceEndpoint"), "Endpoint of the TRG gRPC service (`host:port`)") - pflag.String("trgPollingInterval", viper.GetString("trgPollingInterval"), "How often to query the TRG gRPC service for run status (default: 3s)") + pflag.Duration("trgPollingInterval", viper.GetDuration("trgPollingInterval"), "How often to query the TRG gRPC service for run status (default: 3s)") + pflag.Duration("trgPollingTimeout", viper.GetDuration("trgPollingTimeout"), "Timeout for the query to the TRG gRPC service for run status (default: 3s)") + pflag.Duration("trgReconciliationTimeout", viper.GetDuration("trgReconciliationTimeout"), "Timeout for reconciliation requests to the TRG gRPC service (default: 5s)") pflag.String("odcEndpoint", viper.GetString("odcEndpoint"), "Endpoint of the ODC gRPC service (`host:port`)") pflag.String("odcPollingInterval", viper.GetString("odcPollingInterval"), "How often to query the ODC gRPC service for partition status (default: 3s)") pflag.Bool("odcUseSystemProxy", viper.GetBool("odcUseSystemProxy"), "When true the https_proxy, http_proxy and no_proxy environment variables are obeyed") diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index d636ec557..7983378f6 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -52,10 +52,14 @@ import ( ) const ( - TRG_DIAL_TIMEOUT = 2 * time.Second - TRG_POLLING_INTERVAL = 3 * time.Second - TRG_RECONCILIATION_TIMEOUT = 5 * time.Second - TOPIC = topic.IntegratedService + topic.Separator + "trg" + TRG_DIAL_TIMEOUT = 2 * time.Second + TRG_PFR_TIMEOUT = 5 * time.Second + TRG_LOAD_TIMEOUT = 5 * time.Second + TRG_START_TIMEOUT = 5 * time.Second + TRG_STOP_TIMEOUT = 5 * time.Second + TRG_UNLOAD_TIMEOUT = 5 * time.Second + TRG_CLEANUP_TIMEOUT = 5 * time.Second + TOPIC = topic.IntegratedService + topic.Separator + "trg" ) type Plugin struct { @@ -119,7 +123,10 @@ func (p *Plugin) GetConnectionState() string { } func (p *Plugin) queryRunList() { - runReply, err := p.trgClient.RunList(context.Background(), &trgpb.Empty{}, grpc.EmptyCallOption{}) + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgPollingTimeout")) + defer cancel() + + runReply, err := p.trgClient.RunList(ctx, &trgpb.Empty{}, grpc.EmptyCallOption{}) if err != nil { err = fmt.Errorf("error querying TRG service at %s: %w", viper.GetString("trgServiceEndpoint"), err) log.WithError(err). @@ -260,12 +267,7 @@ func (p *Plugin) Init(instanceId string) error { var ctx context.Context ctx, p.cachedStatusCancelFunc = context.WithCancel(context.Background()) - trgPollingIntervalStr := viper.GetString("trgPollingInterval") - trgPollingInterval, err := time.ParseDuration(trgPollingIntervalStr) - if err != nil { - trgPollingInterval = TRG_POLLING_INTERVAL - log.Debugf("TRG plugin cannot acquire polling interval, defaulting to %s", TRG_POLLING_INTERVAL.String()) - } + trgPollingInterval := viper.GetDuration("trgPollingInterval") // polling go func() { @@ -321,8 +323,10 @@ func (p *Plugin) reconcile() { } }*/ - ctx, _ := context.WithTimeout(context.Background(), TRG_RECONCILIATION_TIMEOUT) + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgReconciliationTimeout")) _, err := p.trgClient.RunStop(ctx, &in, grpc.EmptyCallOption{}) + cancel() + // TODO: Response's RC should also be checked here if err != nil { err = fmt.Errorf("TRG reconciliation failure: %w", err) @@ -344,8 +348,9 @@ func (p *Plugin) reconcile() { } } if trgRun.State == CTP_LOADED && trgRun.Cardinality == CTP_GLOBAL { - ctx, _ := context.WithTimeout(context.Background(), TRG_RECONCILIATION_TIMEOUT) + ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgReconciliationTimeout")) _, err := p.trgClient.RunUnload(ctx, &in, grpc.EmptyCallOption{}) + cancel() if err != nil { err = fmt.Errorf("TRG reconciliation failure: %w", err) log.WithError(err). @@ -457,6 +462,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + timeout := callable.AcquireTimeout(TRG_PFR_TIMEOUT, varStack, "PrepareForRun", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + payload := map[string]interface{}{ "trgRequest": &in, } @@ -473,7 +482,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) var response *trgpb.RunReply - response, err = p.trgClient.PrepareForRun(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.PrepareForRun(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -666,6 +675,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + timeout := callable.AcquireTimeout(TRG_LOAD_TIMEOUT, varStack, "RunLoad", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + payload := map[string]interface{}{ "trgRequest": &in, } @@ -682,7 +695,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) var response *trgpb.RunReply - response, err = p.trgClient.RunLoad(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.RunLoad(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -853,6 +866,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + timeout := callable.AcquireTimeout(TRG_START_TIMEOUT, varStack, "RunStart", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + payload := map[string]interface{}{ "trgRequest": &in, } @@ -869,7 +886,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) var response *trgpb.RunReply - response, err = p.trgClient.RunStart(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.RunStart(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -956,7 +973,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - runStopFunc := func(runNumber64 int64) (out string) { + runStopFunc := func(ctx context.Context, runNumber64 int64) (out string) { trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" it is a global run @@ -1033,7 +1050,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) var response *trgpb.RunReply - response, err = p.trgClient.RunStop(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.RunStop(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1124,7 +1141,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - runUnloadFunc := func(runNumber64 int64) (out string) { + runUnloadFunc := func(ctx context.Context, runNumber64 int64) (out string) { trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { @@ -1201,7 +1218,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) var response *trgpb.RunReply - response, err = p.trgClient.RunUnload(context.Background(), &in, grpc.EmptyCallOption{}) + response, err = p.trgClient.RunUnload(ctx, &in, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). @@ -1294,7 +1311,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for TRG Run Stop") } - return runStopFunc(runNumber64) + timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "RunStop", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + return runStopFunc(ctx, runNumber64) } stack["RunUnload"] = func() (out string) { log.WithField("partition", envId). @@ -1311,7 +1332,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for TRG Run Unload") } - return runUnloadFunc(runNumber64) + timeout := callable.AcquireTimeout(TRG_UNLOAD_TIMEOUT, varStack, "RunUnload", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + return runUnloadFunc(ctx, runNumber64) } stack["Cleanup"] = func() (out string) { envId, ok := varStack["environment_id"] @@ -1322,6 +1347,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + timeout := callable.AcquireTimeout(TRG_CLEANUP_TIMEOUT, varStack, "Cleanup", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + // runStop if found pending runNumberStop, ok := p.pendingRunStops[envId] if ok { @@ -1331,7 +1360,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("pending TRG Stop found, performing cleanup") delete(p.pendingRunStops, envId) - _ = runStopFunc(runNumberStop) + _ = runStopFunc(ctx, runNumberStop) trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) @@ -1358,7 +1387,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Debug("pending TRG Unload found, performing cleanup") delete(p.pendingRunUnloads, envId) - _ = runUnloadFunc(runNumberUnload) + _ = runUnloadFunc(ctx, runNumberUnload) } else { log.WithField("partition", envId). WithField("level", infologger.IL_Devel). From ddb067b142f28a886ff599762cb5e41a0ebcdecb Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 24 Oct 2024 10:39:45 +0200 Subject: [PATCH 2037/2352] [build] Bump to v1.23.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 4936c27ec..0f16c2116 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 22 -VERSION_PATCH := 1 +VERSION_MINOR := 23 +VERSION_PATCH := 0 From 18adda2a81309839b23168b000ccf547b9f1e970 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 28 Oct 2024 15:13:37 +0100 Subject: [PATCH 2038/2352] moved logs connected to unknown undeployable to Devel --- core/environment/transition_deploy.go | 3 ++ core/task/manager.go | 50 ++++++++++++--------------- core/task/scheduler.go | 1 + 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index cfe84fcb9..652b53257 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -245,6 +245,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). WithField("detector", detector). + WithField("level", infologger.IL_Devel). Error("role failed to deploy within timeout") undeployableTaskRoles = append(undeployableTaskRoles, role.GetPath()) } @@ -275,6 +276,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). WithField("detector", detector). + WithField("level", infologger.IL_Devel). Error("role failed to deploy because of timeout") undeployableTaskRoles = append(undeployableTaskRoles, role.GetPath()) } else if roleStatus != task.ACTIVE { @@ -288,6 +290,7 @@ func (t DeployTransition) do(env *Environment) (err error) { WithField("partition", env.Id().String()). WithField("timeout", deploymentTimeout). WithField("detector", detector). + WithField("level", infologger.IL_Devel). Error("role failed to deploy because of timeout") inactiveTaskRoles = append(inactiveTaskRoles, role.GetPath()) } diff --git a/core/task/manager.go b/core/task/manager.go index 07396c958..9193ecbb0 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -156,7 +156,8 @@ func (m *Manager) newTaskForMesosOffer( offer *mesos.Offer, descriptor *Descriptor, localBindMap channel.BindMap, - executorId mesos.ExecutorID) (t *Task) { + executorId mesos.ExecutorID, +) (t *Task) { newId := uid.New().String() t = &Task{ name: fmt.Sprintf("%s#%s", descriptor.TaskClassName, newId), @@ -197,8 +198,8 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. if err != nil { return } - repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] //get IRepo pointer from RepoManager - if repo == nil { //should never end up here + repo := repoManager.GetAllRepos()[tempRepo.GetIdentifier()] // get IRepo pointer from RepoManager + if repo == nil { // should never end up here return nil, errors.New("getTaskClassList: repo not found for " + taskClass) } @@ -223,7 +224,6 @@ func getTaskClassList(taskClassesRequired []string) (taskClassList []*taskclass. taskInfo := strings.Split(taskPath, "/tasks/") if len(taskInfo) == 1 { taskFilename = taskInfo[0] - } else { taskFilename = taskInfo[1] } @@ -280,7 +280,7 @@ func (m *Manager) removeInactiveClasses() { return } -func (m *Manager) RemoveReposClasses(repoPath string) { //Currently unused +func (m *Manager) RemoveReposClasses(repoPath string) { // Currently unused utils.EnsureTrailingSlash(&repoPath) _ = m.classes.Do(func(classMap *map[string]*taskclass.Class) error { @@ -335,7 +335,6 @@ func logDescriptors(prefix string, logFunc func(format string, args ...interface } func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err error) { - /* Here's what's gonna happen: 1) check if any tasks are already in Roster, whether they are already locked @@ -561,7 +560,8 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // ↑ Not all roles could be deployed. If some were critical, // we cannot proceed with running this environment. Either way, // we keep the roles running since they might be useful in the future. - logWithId.Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + logWithId.WithField("level", infologger.IL_Devel). + Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) for _, desc := range undeployedDescriptors { if desc.TaskRole.GetTaskTraits().Critical == true { @@ -596,16 +596,21 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e break DEPLOYMENT_ATTEMPTS_LOOP } - log.WithField("partition", envId).Errorf("Deployment failed %d/%d attempts. Check messages in IL to figure out why. Retrying...", attemptCount+1, MAX_ATTEMPTS_PER_DEPLOY_REQUEST) + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Errorf("Deployment failed %d/%d attempts. Check messages in IL to figure out why. Retrying...", attemptCount+1, MAX_ATTEMPTS_PER_DEPLOY_REQUEST) time.Sleep(time.Second * SLEEP_LENGTH_BETWEEN_PER_DEPLOY_REQUESTS) } } - logDescriptors("critical task deployment impossible: ", logWithId.Errorf, undeployableCriticalDescriptors) - logDescriptors("critical task deployment failure: ", logWithId.Errorf, undeployedCriticalDescriptors) + { + logWithIdDev := logWithId.WithField("level", infologger.IL_Devel) + logDescriptors("critical task deployment impossible: ", logWithIdDev.Errorf, undeployableCriticalDescriptors) + logDescriptors("critical task deployment failure: ", logWithIdDev.Errorf, undeployedCriticalDescriptors) - logDescriptors("non-critical task deployment failure: ", logWithId.Warningf, undeployedNonCriticalDescriptors) - logDescriptors("non-critical task deployment impossible: ", logWithId.Warningf, undeployableNonCriticalDescriptors) + logDescriptors("non-critical task deployment failure: ", logWithIdDev.Warningf, undeployedNonCriticalDescriptors) + logDescriptors("non-critical task deployment impossible: ", logWithIdDev.Warningf, undeployableNonCriticalDescriptors) + } // After retries notify environment about failed critical tasks for _, desc := range undeployableDescriptors { @@ -617,11 +622,8 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e m.deployMu.Unlock() if !deploymentSuccess { - // While all the required roles are running, for some reason we - // can't lock some of them, so we must roll back and keep them - // unlocked in the roster. var deployedTaskIds []string - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } @@ -636,11 +638,11 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } // Finally, we write to the roster. Point of no return! - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { m.roster.append(taskPtr) } if deploymentSuccess { - for taskPtr, _ := range deployedTasks { + for taskPtr := range deployedTasks { taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { @@ -653,7 +655,6 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { - taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -710,7 +711,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { taskPath := task.GetParentRolePath() for inbChName, endpoint := range task.GetLocalBindMap() { var bindMapKey string - if strings.HasPrefix(inbChName, "::") { //global channel alias + if strings.HasPrefix(inbChName, "::") { // global channel alias bindMapKey = inbChName // deduplication @@ -809,7 +810,6 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() - if err != nil { return err } @@ -894,7 +894,6 @@ func (m *Manager) TriggerHooks(envId uid.ID, tasks Tasks) error { notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() - if err != nil { return err } @@ -959,7 +958,6 @@ func (m *Manager) GetTask(id string) *Task { } func (m *Manager) updateTaskState(taskId string, state string) { - taskPtr := m.roster.getByTaskId(taskId) if taskPtr == nil { log.WithField("taskId", taskId). @@ -1013,7 +1011,7 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { } if ack, ok := m.ackKilledTasks.getValue(taskId); ok { ack <- struct{}{} - //close(ack) // It can even be left open? + // close(ack) // It can even be left open? } return @@ -1054,7 +1052,6 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { // Kill all tasks outside an environment (all unlocked tasks) func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { - toKill := m.roster.filtered(func(t *Task) bool { return !t.IsLocked() }) @@ -1193,9 +1190,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { err := m.acquireTasks(tm.GetEnvironmentId(), tm.GetDescriptors()) if err != nil { log.WithError(err). - WithField("level", infologger.IL_Devel). WithField("partition", tm.GetEnvironmentId().String()). - Errorf("acquireTasks failed") + Errorf("Failed task creation and Mesos resources allocation during the deployment of the environment. For more details check Devel logs in Info Logger.") } }() case taskop.ConfigureTasks: diff --git a/core/task/scheduler.go b/core/task/scheduler.go index eeb2103f1..825f54d55 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -592,6 +592,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han descriptorsUndeployable = append(descriptorsUndeployable, descriptor) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) log.WithField("partition", envId.String()). + WithField("level", infologger.IL_Devel). WithField("descriptor", descriptor.TaskClassName). Errorf("no resource offer for required host %s, deployment will be aborted", requiredMachineId) } From ebf112ad70e4ffa08cea3689ea585144b12ff680 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 31 Oct 2024 12:19:07 +0100 Subject: [PATCH 2039/2352] [build] Bump to v1.23.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 0f16c2116..4645cfbbb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 23 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 8bf8da1359e6c646609fb8899c4ff4d0dd6c57f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 30 Oct 2024 14:19:39 +0100 Subject: [PATCH 2040/2352] format everything with gofmt -s -w . --- apricot/cacheproxy/service.go | 2 +- apricot/local/service.go | 4 +- apricot/local/servicehttp.go | 2 +- apricot/remote/client.go | 3 +- cmd/coconut/main.go | 14 +- cmd/walnut/main.go | 1 - coconut/app/constants.go | 2 +- coconut/cmd/about.go | 25 ++-- coconut/cmd/configuration.go | 4 +- coconut/cmd/configuration_dump.go | 8 +- coconut/cmd/configuration_list.go | 8 +- coconut/cmd/configuration_show.go | 12 +- coconut/cmd/environment_control.go | 8 +- coconut/cmd/environment_destroy.go | 8 +- coconut/cmd/environment_list.go | 6 +- coconut/cmd/environment_modify.go | 10 +- coconut/cmd/info.go | 8 +- coconut/cmd/repo_add.go | 11 +- coconut/cmd/repo_default.go | 7 +- coconut/cmd/repo_default_revision.go | 5 +- coconut/cmd/repo_list.go | 8 +- coconut/cmd/repo_refresh.go | 11 +- coconut/cmd/repo_remove.go | 9 +- coconut/cmd/role.go | 4 +- coconut/cmd/role_query.go | 12 +- coconut/cmd/task.go | 4 +- coconut/cmd/task_clean.go | 10 +- coconut/cmd/task_list.go | 8 +- coconut/cmd/template.go | 4 +- coconut/control/control.go | 2 +- coconut/doc/generate.go | 5 +- common/cmdinfo.go | 4 +- common/controlmode/controlmode.go | 2 +- common/event/environmentevents.go | 4 +- common/event/roleevent.go | 2 +- common/event/taskevents.go | 12 +- common/event/tasksreleasedevent.go | 6 +- common/event/taskstatechangedevent.go | 8 +- common/logger/infologger/fields.go | 28 ++-- common/logger/infologger/hook.go | 3 +- common/logger/infologger/protocols.go | 10 +- common/logger/infologger/utils.go | 8 +- common/logger/loggercopy.go | 6 +- common/product/constants.go | 17 ++- common/system/systemid.go | 7 +- common/taskcmdinfo.go | 2 +- configuration/cfgbackend/configurationmap.go | 8 +- configuration/template/fieldwrappers.go | 4 +- configuration/template/loader.go | 2 +- core/controlcommands/command.go | 6 +- core/controlcommands/multiresponse.go | 8 +- core/environment/environment.go | 8 +- core/environment/manager.go | 4 +- core/globalstate.go | 3 +- core/integration/odc/handlers.go | 4 +- core/integration/odc/odcutils/state.go | 12 +- core/integration/trg/client.go | 19 ++- core/integration/trg/trgutil.go | 2 +- core/repos/repomanager.go | 22 ++-- core/repos/reposervice.go | 23 ++-- core/repos/repoutils.go | 31 +++-- core/repos/varsource/varsource.go | 1 + core/server.go | 2 +- core/servertypes.go | 1 + core/signals.go | 15 +-- core/task/agentcache.go | 10 +- core/task/channel/channel.go | 29 +++-- core/task/channel/endpoint.go | 25 ++-- core/task/channel/transport.go | 2 + core/task/constraint/constraints.go | 16 ++- core/task/coreevent.go | 47 ++++--- core/task/roster.go | 2 +- core/task/safeacks.go | 17 ++- core/task/scheduler.go | 6 +- core/task/schedutil/credentials.go | 1 - core/task/schedutil/forever.go | 2 +- core/task/schedutil/mesosutil.go | 7 +- core/task/taskclass/port/range.go | 2 +- core/task/taskop/messagetype.go | 4 +- core/workflow/aggregatorrole.go | 2 +- core/workflow/aggregatortemplate.go | 9 +- core/workflow/callable/maps.go | 4 +- core/workflow/calltemplate.go | 4 +- core/workflow/graft.go | 122 +++++++++--------- core/workflow/includetemplate.go | 4 +- core/workflow/iteratorrole.go | 4 +- core/workflow/rolebase.go | 4 +- core/workflow/roleutils.go | 2 +- core/workflow/tasktemplate.go | 4 +- executor/executable/pid_util.go | 4 +- executor/executorcmd/nopb/jsoncodec.go | 2 +- executor/executorcmd/nopb/occclient.go | 9 +- executor/executorcmd/nopb/test/main.go | 16 +-- executor/executorcmd/transitioner/direct.go | 2 +- executor/executorcmd/transitioner/fairmq.go | 17 +-- .../executorcmd/transitioner/fairmq/states.go | 4 +- .../transitioner/fairmq/transitions.go | 4 +- .../executorcmd/transitioner/transitioner.go | 11 +- occ/peanut/flatten/flatten.go | 3 +- walnut/converter/converter_test.go | 4 +- walnut/converter/testvalues.go | 16 +-- walnut/includeschemata.go | 8 +- walnut/schemata/schemata.go | 6 +- 103 files changed, 485 insertions(+), 469 deletions(-) diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index b0c55a608..99cfd4bdc 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -127,7 +127,7 @@ func (s Service) GetDetectorsForHosts(hosts []string) ([]string, error) { detectors[det] = struct{}{} } detList := make([]string, 0, len(detectors)) - for det, _ := range detectors { + for det := range detectors { detList = append(detList, det) } return detList, nil diff --git a/apricot/local/service.go b/apricot/local/service.go index 537ea553b..11af8add2 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -385,7 +385,7 @@ func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { detectorSlice := make([]string, len(detectorMap)) i := 0 - for k, _ := range detectorMap { + for k := range detectorMap { detectorSlice[i] = k i++ } @@ -548,7 +548,7 @@ func (s *Service) ListComponents() (components []string, err error) { } components = make([]string, len(componentSet)) i := 0 - for component, _ := range componentSet { + for component := range componentSet { components[i] = component i++ } diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index ffcd58081..50e66995b 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -297,7 +297,7 @@ func (httpsvc *HttpService) ApiListComponentEntries(w http.ResponseWriter, r *ht filteredEntries := make([]string, 0) if hasRuntype { // if there's any filtering to do for _, entry := range entries { - for filterPrefix, _ := range filterPrefixes { + for filterPrefix := range filterPrefixes { if strings.HasPrefix(entry, filterPrefix) { filteredEntries = append(filteredEntries, entry) } diff --git a/apricot/remote/client.go b/apricot/remote/client.go index 1bc56cf85..6ded1cfbb 100644 --- a/apricot/remote/client.go +++ b/apricot/remote/client.go @@ -48,9 +48,8 @@ func newRpcClient(cxt context.Context, cancel context.CancelFunc, endpoint strin client := &rpcClient{ ApricotClient: apricotpb.NewApricotClient(conn), - conn: conn, + conn: conn, } return client } - diff --git a/cmd/coconut/main.go b/cmd/coconut/main.go index 5d37d112f..e3a66aa7b 100644 --- a/cmd/coconut/main.go +++ b/cmd/coconut/main.go @@ -24,18 +24,18 @@ package main -import( +import ( "github.com/AliceO2Group/Control/coconut/cmd" - "github.com/teo/logrus-prefixed-formatter" log "github.com/sirupsen/logrus" + "github.com/teo/logrus-prefixed-formatter" ) func init() { log.SetFormatter(&prefixed.TextFormatter{ - DisableTimestamp:true, - FullTimestamp: true, - SpacePadding: 20, - PrefixPadding: 12, + DisableTimestamp: true, + FullTimestamp: true, + SpacePadding: 20, + PrefixPadding: 12, // Needed for colored stdout/stderr in GoLand, IntelliJ, etc. ForceColors: true, @@ -45,4 +45,4 @@ func init() { func main() { cmd.Execute() -} \ No newline at end of file +} diff --git a/cmd/walnut/main.go b/cmd/walnut/main.go index f013878d9..5c41f873b 100644 --- a/cmd/walnut/main.go +++ b/cmd/walnut/main.go @@ -25,7 +25,6 @@ // Package walnut implements the O² Workflow Administration and Linting Utility. package main - import "github.com/AliceO2Group/Control/walnut/cmd" func main() { diff --git a/coconut/app/constants.go b/coconut/app/constants.go index 89a56c547..e66f78d47 100644 --- a/coconut/app/constants.go +++ b/coconut/app/constants.go @@ -28,4 +28,4 @@ const ( NAME = "coconut" PRETTY_SHORTNAME = "coconut" PRETTY_FULLNAME = "O² Control and Configuration Utility" -) \ No newline at end of file +) diff --git a/coconut/cmd/about.go b/coconut/cmd/about.go index 6519b4fc5..02b9f1298 100644 --- a/coconut/cmd/about.go +++ b/coconut/cmd/about.go @@ -25,20 +25,20 @@ package cmd import ( + "fmt" "github.com/AliceO2Group/Control/coconut/app" + "github.com/fatih/color" "github.com/spf13/cobra" - "fmt" "github.com/spf13/viper" - "github.com/fatih/color" "time" ) // aboutCmd represents the about command var aboutCmd = &cobra.Command{ - Use: "about", + Use: "about", Aliases: []string{}, - Short: fmt.Sprintf("about %s", app.NAME), - Long: `The about command shows some basic information on this utility.`, + Short: fmt.Sprintf("about %s", app.NAME), + Long: `The about command shows some basic information on this utility.`, Run: func(*cobra.Command, []string) { color.Set(color.FgHiWhite) fmt.Print(app.PRETTY_SHORTNAME + " *** ") @@ -52,15 +52,20 @@ endpoint: %s config_endpoint: %s `, color.HiGreenString(viper.GetString("version")), - color.HiGreenString(func() string {if len(viper.ConfigFileUsed()) > 0 { return viper.ConfigFileUsed() }; return "builtin"}()), + color.HiGreenString(func() string { + if len(viper.ConfigFileUsed()) > 0 { + return viper.ConfigFileUsed() + } + return "builtin" + }()), color.HiGreenString(viper.GetString("endpoint")), color.HiGreenString(viper.GetString("config_endpoint"))) color.Set(color.FgHiBlue) - fmt.Printf("\nCopyright 2017-%d CERN and the copyright holders of ALICE O².\n" + - "This program is free software: you can redistribute it and/or modify \n" + - "it under the terms of the GNU General Public License as published by \n" + - "the Free Software Foundation, either version 3 of the License, or \n" + + fmt.Printf("\nCopyright 2017-%d CERN and the copyright holders of ALICE O².\n"+ + "This program is free software: you can redistribute it and/or modify \n"+ + "it under the terms of the GNU General Public License as published by \n"+ + "the Free Software Foundation, either version 3 of the License, or \n"+ "(at your option) any later version.\n", time.Now().Year()) color.Unset() diff --git a/coconut/cmd/configuration.go b/coconut/cmd/configuration.go index 39bfde7a3..2f1455323 100644 --- a/coconut/cmd/configuration.go +++ b/coconut/cmd/configuration.go @@ -30,9 +30,9 @@ import ( // configurationCmd represents the configuration command var configurationCmd = &cobra.Command{ - Use: "configuration", + Use: "configuration", Aliases: []string{"config", "conf", "c"}, - Short: "view or modify O² configuration", + Short: "view or modify O² configuration", Long: `The configuration command allows you to perform operations on the O² configuration store.`, } diff --git a/coconut/cmd/configuration_dump.go b/coconut/cmd/configuration_dump.go index c2268ab09..86d93d5a1 100644 --- a/coconut/cmd/configuration_dump.go +++ b/coconut/cmd/configuration_dump.go @@ -31,16 +31,16 @@ import ( // configurationDumpCmd represents the configuration list command var configurationDumpCmd = &cobra.Command{ - Use: "dump [key]", + Use: "dump [key]", Aliases: []string{"d"}, - Short: "dump configuration subtree", + Short: "dump configuration subtree", Long: `The configuration dump command requests from O² Configuration a subtree of key-values, and dumps it to standard output in the specified format. This command has full read access to the O² Configuration store and performs a raw query with no additional processing or access control semantics.`, - Run: configuration.WrapCall(configuration.Dump), - Args: cobra.ExactArgs(1), + Run: configuration.WrapCall(configuration.Dump), + Args: cobra.ExactArgs(1), } func init() { diff --git a/coconut/cmd/configuration_list.go b/coconut/cmd/configuration_list.go index 95de8dcb2..0a116da4f 100644 --- a/coconut/cmd/configuration_list.go +++ b/coconut/cmd/configuration_list.go @@ -30,7 +30,7 @@ import ( ) var configurationListCmd = &cobra.Command{ - Use: "list [component]", + Use: "list [component]", Aliases: []string{"l", "ls"}, Example: `coconut conf list coconut conf list @@ -38,12 +38,12 @@ coconut conf list -t`, Short: "List all existing O² components in Consul", Long: `The configuration list command requests all components from O² Configuration as a list and displays it on the standard output`, - Run: configuration.WrapCall(configuration.List), - Args: cobra.MaximumNArgs(1), + Run: configuration.WrapCall(configuration.List), + Args: cobra.MaximumNArgs(1), } func init() { configurationCmd.AddCommand(configurationListCmd) configurationListCmd.Flags().StringP("output", "o", "yaml", "output format for the configuration list (yaml/json)") - configurationListCmd.Flags().BoolP("timestamp", "t", false, "display latest timestamp entries for the requested component") + configurationListCmd.Flags().BoolP("timestamp", "t", false, "display latest timestamp entries for the requested component") } diff --git a/coconut/cmd/configuration_show.go b/coconut/cmd/configuration_show.go index 465811868..712d55ba2 100644 --- a/coconut/cmd/configuration_show.go +++ b/coconut/cmd/configuration_show.go @@ -30,7 +30,7 @@ import ( ) var configurationShowCmd = &cobra.Command{ - Use: "show ", + Use: "show ", Aliases: []string{"s"}, Example: `coconut conf show coconut conf show -t @@ -43,15 +43,15 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" Long: `The configuration show command returns the most recent configuration revision for the specified component and entry. It can also return a specific revision, requested with the --timestamp/-t flag`, - Run: configuration.WrapCall(configuration.Show), - Args: cobra.RangeArgs(0, 3), + Run: configuration.WrapCall(configuration.Show), + Args: cobra.RangeArgs(0, 3), } func init() { configurationCmd.AddCommand(configurationShowCmd) - configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") - configurationShowCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") - configurationShowCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") + configurationShowCmd.Flags().StringP("timestamp", "t", "", "request configuration for this timestamp") + configurationShowCmd.Flags().StringP("runtype", "r", "", "request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.)") + configurationShowCmd.Flags().StringP("role", "l", "", "request configuration for this O² machine role") configurationShowCmd.Flags().BoolP("simulate", "s", false, "simulate runtime template processing on the configuration payload") // The following only applies if simulate is set: configurationShowCmd.Flags().StringP("extra-vars", "e", "", "values passed using key=value CSV or JSON syntax, interpreted as strings `key1=val1,key2=val2` or `{\"key1\": \"value1\", \"key2\": \"value2\"}`") diff --git a/coconut/cmd/environment_control.go b/coconut/cmd/environment_control.go index 995209306..8b08c2a7f 100644 --- a/coconut/cmd/environment_control.go +++ b/coconut/cmd/environment_control.go @@ -31,9 +31,9 @@ import ( // environmentControlCmd represents the environment list command var environmentControlCmd = &cobra.Command{ - Use: "control [environment id]", + Use: "control [environment id]", Aliases: []string{"ctl", "ct", "t"}, - Short: "control the state machine of an environment", + Short: "control the state machine of an environment", Long: `The environment control command triggers an event in the state machine of an existing O² environment. The event, if valid, starts a transition. The reached state is returned. @@ -44,8 +44,8 @@ Valid events: START_ACTIVITY STOP_ACTIVITY Not all events are available in all states.`, - Run: control.WrapCall(control.ControlEnvironment), - Args: cobra.ExactArgs(1), + Run: control.WrapCall(control.ControlEnvironment), + Args: cobra.ExactArgs(1), } func init() { diff --git a/coconut/cmd/environment_destroy.go b/coconut/cmd/environment_destroy.go index 457595d4a..ff06c4f78 100644 --- a/coconut/cmd/environment_destroy.go +++ b/coconut/cmd/environment_destroy.go @@ -34,16 +34,16 @@ import ( // environmentDestroyCmd represents the environment list command var environmentDestroyCmd = &cobra.Command{ - Use: "destroy [environment id]", + Use: "destroy [environment id]", Aliases: []string{"des", "d"}, - Short: "destroy an environment", + Short: "destroy an environment", Long: fmt.Sprintf(`The environment destroy command instructs %s to teardown an existing O² environment. The environment must be in the CONFIGURED or STANDBY state. By default, all active tasks are killed unless the keep-tasks flag is passed, in which case all tasks are left idle.`, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.DestroyEnvironment), - Args: cobra.ExactArgs(1), + Run: control.WrapCall(control.DestroyEnvironment), + Args: cobra.ExactArgs(1), } func init() { diff --git a/coconut/cmd/environment_list.go b/coconut/cmd/environment_list.go index 67250635c..8f8c179e5 100644 --- a/coconut/cmd/environment_list.go +++ b/coconut/cmd/environment_list.go @@ -31,12 +31,12 @@ import ( // environmentListCmd represents the environment list command var environmentListCmd = &cobra.Command{ - Use: "list", + Use: "list", Aliases: []string{"ls", "l"}, - Short: "list environments", + Short: "list environments", Long: `The environment list command shows a list of currently active environments. This includes environments in any state.`, - Run: control.WrapCall(control.GetEnvironments), + Run: control.WrapCall(control.GetEnvironments), } func init() { diff --git a/coconut/cmd/environment_modify.go b/coconut/cmd/environment_modify.go index c05e64952..89dc2173e 100644 --- a/coconut/cmd/environment_modify.go +++ b/coconut/cmd/environment_modify.go @@ -25,19 +25,19 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // environmentModifyCmd represents the environment list command var environmentModifyCmd = &cobra.Command{ - Use: "modify [environment id]", + Use: "modify [environment id]", Aliases: []string{"mod", "m"}, - Short: "modify an environment", + Short: "modify an environment", Long: `The environment modify command changes the roles workflow of an existing O² environment.`, - Run: control.WrapCall(control.ModifyEnvironment), - Args: cobra.ExactArgs(1), + Run: control.WrapCall(control.ModifyEnvironment), + Args: cobra.ExactArgs(1), } func init() { diff --git a/coconut/cmd/info.go b/coconut/cmd/info.go index 86d254c1a..3a06fddbb 100644 --- a/coconut/cmd/info.go +++ b/coconut/cmd/info.go @@ -27,19 +27,19 @@ package cmd import ( "fmt" + "github.com/AliceO2Group/Control/coconut/control" "github.com/AliceO2Group/Control/common/product" "github.com/spf13/cobra" - "github.com/AliceO2Group/Control/coconut/control" ) // infoCmd represents the info command var infoCmd = &cobra.Command{ - Use: "info", + Use: "info", Aliases: []string{}, - Short: fmt.Sprintf("get information on the %s core instance", product.PRETTY_SHORTNAME), + Short: fmt.Sprintf("get information on the %s core instance", product.PRETTY_SHORTNAME), Long: fmt.Sprintf(`The info command queries the running instance of %s core and displays some general information.`, product.PRETTY_SHORTNAME), - Run: control.WrapCall(control.GetInfo), + Run: control.WrapCall(control.GetInfo), } func init() { diff --git a/coconut/cmd/repo_add.go b/coconut/cmd/repo_add.go index daffbdfb9..3083bb3b9 100644 --- a/coconut/cmd/repo_add.go +++ b/coconut/cmd/repo_add.go @@ -31,9 +31,9 @@ import ( // repoAddCmd represents the repo add command var repoAddCmd = &cobra.Command{ - Use: "add ", + Use: "add ", Aliases: []string{"new", "a"}, - Short: "add a new git repository", + Short: "add a new git repository", Long: `The repository add command adds a git repository to the catalogue of repositories used for task and workflow configuration. The default revision of the repository may be explicitly specified by passing the flag ` + "`--default-revision`" + ` . In any case, the ensuing list is followed until a valid revision has been identified: @@ -45,13 +45,12 @@ the ensuing list is followed until a valid revision has been identified: Exhaustion of the aforementioned list results in a repo add failure. -` + "`coconut repo add`" + ` can be called with +` + "`coconut repo add`" + ` can be called with 1) a repository identifier 2) a repository identifier coupled with the ` + "`--default-revision`" + ` flag (see examples below) The protocol prefix should always be omitted.`, - Example: - ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows`" + ` + Example: ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows`" + ` * ` + "`coconut repo add github.com/AliceO2Group/ControlWorkflows --default-revision custom-rev`" + ` * ` + "`coconut repo add alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows --default-revision custom-rev`" + ` * ` + "`coconut repo add /home/flp/git/ControlWorkflows`", @@ -63,4 +62,4 @@ func init() { repoCmd.AddCommand(repoAddCmd) repoAddCmd.Flags().StringP("default-revision", "d", "", "default revision for repository to add") -} \ No newline at end of file +} diff --git a/coconut/cmd/repo_default.go b/coconut/cmd/repo_default.go index 71361911b..f9eb40ecc 100644 --- a/coconut/cmd/repo_default.go +++ b/coconut/cmd/repo_default.go @@ -35,10 +35,9 @@ var repoDefaultCmd = &cobra.Command{ Short: "set a git repository as default", Long: `The repository default command sets a git repository as the default repository for incoming workflow deployment requests. A repository is referenced through its repo id, as reported by ` + "`coconut repo list`.", - Example: -` * ` + "`coconut repo default 2`", - Run: control.WrapCall(control.SetDefaultRepo), - Args: cobra.ExactArgs(1), + Example: ` * ` + "`coconut repo default 2`", + Run: control.WrapCall(control.SetDefaultRepo), + Args: cobra.ExactArgs(1), } func init() { diff --git a/coconut/cmd/repo_default_revision.go b/coconut/cmd/repo_default_revision.go index a9a580a74..0067ba46c 100644 --- a/coconut/cmd/repo_default_revision.go +++ b/coconut/cmd/repo_default_revision.go @@ -36,11 +36,10 @@ var repoDefaultRevisionCmd = &cobra.Command{ Long: `The repository default-revision command sets the global default repository revision.' To set a per repository default revision, the default revision specified needs to be preceded by the repository index (not its name), as is reported by ` + "`coconut repo list`.", - Example: -` * ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision + Example: ` * ` + "`coconut repo default-revision basic-tasks`" + ` Sets ` + "`basic-tasks`" + `as the global default-revision * ` + "`coconut repo default-revision 0 master`" + ` Sets ` + "`master`" + `as the default-revision for repo with index 0 * ` + "`coconut repo default-revision 2 vs-sftb`" + ` Sets ` + "`vs-sftb`" + `as the default-revision for repo with index 2`, - Run: control.WrapCall(control.SetDefaultRevision), + Run: control.WrapCall(control.SetDefaultRevision), Args: cobra.RangeArgs(1, 2), } diff --git a/coconut/cmd/repo_list.go b/coconut/cmd/repo_list.go index 7bf9d5a3d..eecdea2b6 100644 --- a/coconut/cmd/repo_list.go +++ b/coconut/cmd/repo_list.go @@ -31,11 +31,11 @@ import ( // repoListCmd represents the repo list command var repoListCmd = &cobra.Command{ - Use: "list", + Use: "list", Aliases: []string{"l"}, - Short: "list git repositories", - Long: "The repostory list command lists available git repositories to be used for task and workflow configuration.", - Run: control.WrapCall(control.ListRepos), + Short: "list git repositories", + Long: "The repostory list command lists available git repositories to be used for task and workflow configuration.", + Run: control.WrapCall(control.ListRepos), } func init() { diff --git a/coconut/cmd/repo_refresh.go b/coconut/cmd/repo_refresh.go index 071f58e02..ee86cd0c6 100644 --- a/coconut/cmd/repo_refresh.go +++ b/coconut/cmd/repo_refresh.go @@ -31,18 +31,17 @@ import ( // repoListCmd represents the repo list command var repoRefreshCmd = &cobra.Command{ - Use: "refresh [repo id]", + Use: "refresh [repo id]", Aliases: []string{"update", "u"}, - Short: "refresh git repositories", + Short: "refresh git repositories", Long: `The repository refresh command makes sure all git repositories used for task and workflow configuration are up to date. It can optionally be supplied with a repo id, to only refresh a specific repo. Repo ids are reported by ` + "`coconut repo list`.", - Example: -` * ` + "`coconut repo refresh`" + ` + Example: ` * ` + "`coconut repo refresh`" + ` * ` + "`coconut repo refresh 1`", - Run: control.WrapCall(control.RefreshRepos), + Run: control.WrapCall(control.RefreshRepos), Args: cobra.MaximumNArgs(1), } func init() { repoCmd.AddCommand(repoRefreshCmd) -} \ No newline at end of file +} diff --git a/coconut/cmd/repo_remove.go b/coconut/cmd/repo_remove.go index ec8cb1bd5..b2cbdb90f 100644 --- a/coconut/cmd/repo_remove.go +++ b/coconut/cmd/repo_remove.go @@ -31,15 +31,14 @@ import ( // repoRemoveCmd represents the repo remove command var repoRemoveCmd = &cobra.Command{ - Use: "remove ", + Use: "remove ", Aliases: []string{"r", "delete", "del", "d"}, - Short: "remove a git repository", + Short: "remove a git repository", Long: `The repository remove command removes a git repository from the catalogue of workflow configuration sources. A repository is referenced by its repo id, as reported by` + "`coconut repo list`", - Example: -` * ` + "`coconut repo remove 1`" + ` + Example: ` * ` + "`coconut repo remove 1`" + ` * ` + "`coconut repo del 2`", - Run: control.WrapCall(control.RemoveRepo), + Run: control.WrapCall(control.RemoveRepo), Args: cobra.ExactArgs(1), } diff --git a/coconut/cmd/role.go b/coconut/cmd/role.go index 091232087..1455a1a40 100644 --- a/coconut/cmd/role.go +++ b/coconut/cmd/role.go @@ -33,9 +33,9 @@ import ( // roleCmd represents the role command var roleCmd = &cobra.Command{ - Use: "role", + Use: "role", Aliases: []string{"r"}, - Short: "query roles in an environment", + Short: "query roles in an environment", Long: fmt.Sprintf(`The role command queries the running instance of %s to display information on active roles.`, product.PRETTY_SHORTNAME), } diff --git a/coconut/cmd/role_query.go b/coconut/cmd/role_query.go index 6b0ea35a1..9270772f6 100644 --- a/coconut/cmd/role_query.go +++ b/coconut/cmd/role_query.go @@ -25,18 +25,18 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // roleQueryCmd represents the role list command var roleQueryCmd = &cobra.Command{ - Use: "query [environment id] [query path]", + Use: "query [environment id] [query path]", Aliases: []string{"query", "q"}, - Short: "query O² roles", - Long: `The role query command returns one or more role trees.`, - Run: control.WrapCall(control.QueryRoles), - Args: cobra.ExactArgs(2), + Short: "query O² roles", + Long: `The role query command returns one or more role trees.`, + Run: control.WrapCall(control.QueryRoles), + Args: cobra.ExactArgs(2), } func init() { diff --git a/coconut/cmd/task.go b/coconut/cmd/task.go index a2695146e..d858ec39e 100644 --- a/coconut/cmd/task.go +++ b/coconut/cmd/task.go @@ -33,9 +33,9 @@ import ( // taskCmd represents the task command var taskCmd = &cobra.Command{ - Use: "task", + Use: "task", Aliases: []string{"t"}, - Short: "manage active tasks", + Short: "manage active tasks", Long: fmt.Sprintf(`The task command interacts with the running instance of %s to manage active tasks.`, product.PRETTY_SHORTNAME), } diff --git a/coconut/cmd/task_clean.go b/coconut/cmd/task_clean.go index 20fada4e7..d0fa8b21f 100644 --- a/coconut/cmd/task_clean.go +++ b/coconut/cmd/task_clean.go @@ -25,20 +25,20 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // taskCleanCmd represents the task clean command var taskCleanCmd = &cobra.Command{ - Use: "clean", + Use: "clean", Aliases: []string{"clean", "cleanup", "cl"}, - Short: "clean up idle O² tasks", + Short: "clean up idle O² tasks", Long: `The task clean command removes all tasks that aren't currently associated with an environment. This includes AliECS tasks in any state. Alternatively, a list of task IDs to remove can be passed as a space-separated sequence of parameters.`, - Run: control.WrapCall(control.CleanTasks), - Args: cobra.ArbitraryArgs, + Run: control.WrapCall(control.CleanTasks), + Args: cobra.ArbitraryArgs, } func init() { diff --git a/coconut/cmd/task_list.go b/coconut/cmd/task_list.go index fdaeb0f65..7a5ad4a4d 100644 --- a/coconut/cmd/task_list.go +++ b/coconut/cmd/task_list.go @@ -25,18 +25,18 @@ package cmd import ( - "github.com/spf13/cobra" "github.com/AliceO2Group/Control/coconut/control" + "github.com/spf13/cobra" ) // taskListCmd represents the task list command var taskListCmd = &cobra.Command{ - Use: "list", + Use: "list", Aliases: []string{"list", "ls", "l"}, - Short: "list O² tasks", + Short: "list O² tasks", Long: `The task list command shows a list of currently active tasks. This includes AliECS tasks in any state.`, - Run: control.WrapCall(control.GetTasks), + Run: control.WrapCall(control.GetTasks), } func init() { diff --git a/coconut/cmd/template.go b/coconut/cmd/template.go index c81c1b11e..d4723a835 100644 --- a/coconut/cmd/template.go +++ b/coconut/cmd/template.go @@ -32,9 +32,9 @@ import ( // templateCmd represents the template command var templateCmd = &cobra.Command{ - Use: "template", + Use: "template", Aliases: []string{"templ"}, - Short: "query available workflow templates in configuration repositories", + Short: "query available workflow templates in configuration repositories", Long: fmt.Sprintf(`The template command interacts with the workflow configuration system to display information on available workflow templates.`), } diff --git a/coconut/control/control.go b/coconut/control/control.go index 01a18b49a..bc0983a8b 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -184,7 +184,7 @@ func GetInfo(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Command, ar sortedSvcIds := make([]string, len(services)) i := 0 - for svcId, _ := range services { + for svcId := range services { sortedSvcIds[i] = svcId i++ } diff --git a/coconut/doc/generate.go b/coconut/doc/generate.go index 4c336cef9..48af65ff3 100644 --- a/coconut/doc/generate.go +++ b/coconut/doc/generate.go @@ -24,13 +24,12 @@ package main - import ( "github.com/AliceO2Group/Control/coconut/app" + "github.com/AliceO2Group/Control/coconut/cmd" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" "github.com/spf13/cobra/doc" - "github.com/AliceO2Group/Control/coconut/cmd" ) var log = logger.New(logrus.StandardLogger(), app.NAME) @@ -41,4 +40,4 @@ func main() { if err != nil { log.Fatal(err) } -} \ No newline at end of file +} diff --git a/common/cmdinfo.go b/common/cmdinfo.go index 0c19f9977..7fe890aa2 100644 --- a/common/cmdinfo.go +++ b/common/cmdinfo.go @@ -116,12 +116,12 @@ func (m *CommandInfo) Equals(other *CommandInfo) (response bool) { return false } - for i, _ := range m.Env { + for i := range m.Env { if m.Env[i] != other.Env[i] { return false } } - for i, _ := range m.Arguments { + for i := range m.Arguments { if m.Arguments[i] != other.Arguments[i] { return false } diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index 075db220e..6d6dc8fdb 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -34,7 +34,7 @@ import ( type ControlMode int -const( +const ( DIRECT ControlMode = iota FAIRMQ BASIC diff --git a/common/event/environmentevents.go b/common/event/environmentevents.go index eee78b554..e60ab4492 100644 --- a/common/event/environmentevents.go +++ b/common/event/environmentevents.go @@ -52,6 +52,6 @@ func (e *EnvironmentEvent) GetError() string { return e.Error.Error() } -func(e *EnvironmentEvent) GetMessage() string { +func (e *EnvironmentEvent) GetMessage() string { return e.Message -} \ No newline at end of file +} diff --git a/common/event/roleevent.go b/common/event/roleevent.go index cdd907b40..451086bc5 100644 --- a/common/event/roleevent.go +++ b/common/event/roleevent.go @@ -46,4 +46,4 @@ func (r *RoleEvent) GetState() string { func (r *RoleEvent) GetRolePath() string { return r.RolePath -} \ No newline at end of file +} diff --git a/common/event/taskevents.go b/common/event/taskevents.go index 94c533dc7..2ed1e7780 100644 --- a/common/event/taskevents.go +++ b/common/event/taskevents.go @@ -26,11 +26,11 @@ package event type TaskEvent struct { eventBase - Name string - TaskID string - Status string - State string - Hostname string + Name string + TaskID string + Status string + State string + Hostname string ClassName string } @@ -56,4 +56,4 @@ func (r *TaskEvent) GetHostname() string { func (r *TaskEvent) GetClassName() string { return r.ClassName -} \ No newline at end of file +} diff --git a/common/event/tasksreleasedevent.go b/common/event/tasksreleasedevent.go index 635fdc755..b35cd524a 100644 --- a/common/event/tasksreleasedevent.go +++ b/common/event/tasksreleasedevent.go @@ -31,9 +31,9 @@ import ( type TasksReleasedEvent struct { eventBase - EnvironmentId uid.ID `json:"environmentId"` - TaskIdsReleased []string `json:"taskIdsReleased"` - TaskReleaseErrors map[string]error `json:"taskReleaseErrors"` + EnvironmentId uid.ID `json:"environmentId"` + TaskIdsReleased []string `json:"taskIdsReleased"` + TaskReleaseErrors map[string]error `json:"taskReleaseErrors"` } func (tr *TasksReleasedEvent) GetName() string { diff --git a/common/event/taskstatechangedevent.go b/common/event/taskstatechangedevent.go index f316bb6b0..1f757d996 100644 --- a/common/event/taskstatechangedevent.go +++ b/common/event/taskstatechangedevent.go @@ -31,9 +31,9 @@ import ( type TasksStateChangedEvent struct { eventBase - EnvironmentId uid.ID `json:"environmentId"` - TaskIdsStateChanged []string `json:"taskIdsStatesChanged"` - TaskStateChangedErr error `json:"taskStateChangedErr"` + EnvironmentId uid.ID `json:"environmentId"` + TaskIdsStateChanged []string `json:"taskIdsStatesChanged"` + TaskStateChangedErr error `json:"taskStateChangedErr"` } func (tr *TasksStateChangedEvent) GetName() string { @@ -67,7 +67,7 @@ func NewTasksStateChangedEvent(envId uid.ID, taskIdsChangeState []string, taskSt Timestamp: utils.NewUnixTimestamp(), MessageType: "TasksStateEvent", }, - EnvironmentId: envId, + EnvironmentId: envId, TaskIdsStateChanged: taskIdsChangeState, TaskStateChangedErr: taskStateChangedErr, } diff --git a/common/logger/infologger/fields.go b/common/logger/infologger/fields.go index 23646851d..89a9be669 100644 --- a/common/logger/infologger/fields.go +++ b/common/logger/infologger/fields.go @@ -28,24 +28,24 @@ package infologger // (Severity), Level, ErrorCode, SourceFile, SourceLine, // Facility, Role, System, Detector, Partition, Run -const( - Level = "level" +const ( + Level = "level" ErrorCode = "errcode" - Facility = "facility" - Role = "rolename" - System = "system" - Detector = "detector" + Facility = "facility" + Role = "rolename" + System = "system" + Detector = "detector" Partition = "partition" - Run = "run" + Run = "run" ) var Fields = map[string]bool{ - Level: true, + Level: true, ErrorCode: true, - Facility: true, - Role: true, - System: true, - Detector: true, + Facility: true, + Role: true, + System: true, + Detector: true, Partition: true, - Run: true, -} \ No newline at end of file + Run: true, +} diff --git a/common/logger/infologger/hook.go b/common/logger/infologger/hook.go index 2d343e6ae..d4791e812 100644 --- a/common/logger/infologger/hook.go +++ b/common/logger/infologger/hook.go @@ -23,6 +23,7 @@ */ package infologger + /* import ( "fmt" @@ -130,4 +131,4 @@ func (h *Hook) Fire(e *logrus.Entry) error { } return nil } -*/ \ No newline at end of file +*/ diff --git a/common/logger/infologger/protocols.go b/common/logger/infologger/protocols.go index c66949ce5..cf640f4a6 100644 --- a/common/logger/infologger/protocols.go +++ b/common/logger/infologger/protocols.go @@ -25,19 +25,21 @@ package infologger type protoVersion string -const( + +const ( v14 = protoVersion("1.4") v13 = protoVersion("1.3") ) type fieldType string -const( + +const ( ft_String = fieldType("String") ft_Number = fieldType("Number") ) type fieldSpec struct { - name string + name string ftype fieldType } @@ -81,4 +83,4 @@ var protocols = map[protoVersion]*protoSpec{ {name: "errsource", ftype: ft_String}, {name: "message", ftype: ft_String}, }, -} \ No newline at end of file +} diff --git a/common/logger/infologger/utils.go b/common/logger/infologger/utils.go index 5257c74de..0f135bf32 100644 --- a/common/logger/infologger/utils.go +++ b/common/logger/infologger/utils.go @@ -27,10 +27,10 @@ package infologger import "github.com/sirupsen/logrus" const ( - IL_Ops = 1 + IL_Ops = 1 IL_Support = 6 - IL_Devel = 11 - IL_Trace = 21 + IL_Devel = 11 + IL_Trace = 21 ) // Severity/priority constants: @@ -94,4 +94,4 @@ func buildFineFacility(baseFacility string, data logrus.Fields) string { return baseFacility + "/" + prefix.(string) } return baseFacility -} \ No newline at end of file +} diff --git a/common/logger/loggercopy.go b/common/logger/loggercopy.go index 8f8263107..b1db78c8a 100644 --- a/common/logger/loggercopy.go +++ b/common/logger/loggercopy.go @@ -34,10 +34,10 @@ import ( // This file implements a workaround for https://github.com/sirupsen/logrus/issues/564 type SafeLogrusWriter struct { - Entry *logrus.Entry + Entry *logrus.Entry PrintFunc func(...interface{}) - buf bytes.Buffer - mu sync.Mutex + buf bytes.Buffer + mu sync.Mutex } func (w *SafeLogrusWriter) Write(b []byte) (int, error) { diff --git a/common/product/constants.go b/common/product/constants.go index 0bbd29f2b..6f3c1f345 100644 --- a/common/product/constants.go +++ b/common/product/constants.go @@ -85,7 +85,6 @@ func fillBuildFromGit(localRepoPath string) { BUILD = h.String()[:7] } - func init() { // If the core was built with go build directly instead of make. if VERSION_MAJOR == "0" && @@ -103,16 +102,16 @@ func init() { fillBuildFromGit(basePath) } - VERSION = strings.Join([]string{VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH}, ".") - VERSION_SHORT = VERSION - VERSION_BUILD = strings.Join([]string{VERSION, BUILD}, "-") + VERSION = strings.Join([]string{VERSION_MAJOR, VERSION_MINOR, VERSION_PATCH}, ".") + VERSION_SHORT = VERSION + VERSION_BUILD = strings.Join([]string{VERSION, BUILD}, "-") } var ( // Acquired from -ldflags="-X=..." in Makefile - VERSION_MAJOR = "0" - VERSION_MINOR = "0" - VERSION_PATCH = "0" - BUILD = "" + VERSION_MAJOR = "0" + VERSION_MINOR = "0" + VERSION_PATCH = "0" + BUILD = "" ) var ( @@ -122,4 +121,4 @@ var ( VERSION string VERSION_SHORT string VERSION_BUILD string -) \ No newline at end of file +) diff --git a/common/system/systemid.go b/common/system/systemid.go index 810d980d6..c25c3b927 100644 --- a/common/system/systemid.go +++ b/common/system/systemid.go @@ -36,7 +36,7 @@ type IDMap map[ID]struct{} func (m IDMap) StringList() []string { list := make([]string, len(m)) i := 0 - for k, _ := range m { + for k := range m { list[i] = k.String() i++ } @@ -45,6 +45,7 @@ func (m IDMap) StringList() []string { } type ID int + const ( // 1 // 2 @@ -72,7 +73,7 @@ const ( DCS ID = 38 FOC ID = 39 - FIT ID = 254 // non-standard mapping: FT0 + FV0 = FIT + FIT ID = 254 // non-standard mapping: FT0 + FV0 = FIT NIL ID = 255 ) @@ -81,4 +82,4 @@ const ( FLP ID = -1 EPN ID = -2 PDP ID = -3 -) \ No newline at end of file +) diff --git a/common/taskcmdinfo.go b/common/taskcmdinfo.go index e31b3fb23..af2e269a1 100644 --- a/common/taskcmdinfo.go +++ b/common/taskcmdinfo.go @@ -36,5 +36,5 @@ type TaskCommandInfo struct { ControlMode controlmode.ControlMode `json:"controlMode"` // Only applies to hooks and basic tasks - Timeout time.Duration `json:"timeout,omitempty"` + Timeout time.Duration `json:"timeout,omitempty"` } diff --git a/configuration/cfgbackend/configurationmap.go b/configuration/cfgbackend/configurationmap.go index 186978e3d..304312a52 100644 --- a/configuration/cfgbackend/configurationmap.go +++ b/configuration/cfgbackend/configurationmap.go @@ -32,13 +32,13 @@ import ( ) type ItemType int + const ( IT_Value ItemType = iota IT_Map IT_Array ) - type Item interface { Type() ItemType Value() string @@ -46,9 +46,9 @@ type Item interface { Array() Array DeepCopy() Item } -type Map map[string]Item -type Array []Item -type String string +type Map map[string]Item +type Array []Item +type String string func (m Map) Type() ItemType { return IT_Map diff --git a/configuration/template/fieldwrappers.go b/configuration/template/fieldwrappers.go index d213b1973..8e8fff4af 100644 --- a/configuration/template/fieldwrappers.go +++ b/configuration/template/fieldwrappers.go @@ -69,7 +69,7 @@ func WrapGeneric(getterF GetterFunc, setterF SetterFunc) Field { func WrapMapItems(items map[string]string) Fields { fields := make(Fields, 0) - for k, _ := range items { + for k := range items { key := k // we need a local copy for the Getter/Setter closures fields = append(fields, &GenericWrapper{ Getter: func() string { @@ -85,7 +85,7 @@ func WrapMapItems(items map[string]string) Fields { func WrapSliceItems(items []string) Fields { fields := make(Fields, 0) - for i, _ := range items { + for i := range items { index := i // we need a local copy for the Getter/Setter closures fields = append(fields, &GenericWrapper{ Getter: func() string { diff --git a/configuration/template/loader.go b/configuration/template/loader.go index 8a82aeca5..e6c4ea75a 100644 --- a/configuration/template/loader.go +++ b/configuration/template/loader.go @@ -41,7 +41,7 @@ type ConsulTemplateLoader struct { func NewConsulTemplateLoader(confSvc ConfigurationService, basePath string) *ConsulTemplateLoader { return &ConsulTemplateLoader{ basePath: basePath, - confSvc: confSvc, + confSvc: confSvc, } } diff --git a/core/controlcommands/command.go b/core/controlcommands/command.go index 1698dc63b..4c782e25b 100644 --- a/core/controlcommands/command.go +++ b/core/controlcommands/command.go @@ -29,8 +29,8 @@ package controlcommands type Command interface { - Name() string - Args() map[string]interface{} + Name() string + Args() map[string]interface{} IsMultiCmd() bool - IsMutator() bool + IsMutator() bool } diff --git a/core/controlcommands/multiresponse.go b/core/controlcommands/multiresponse.go index c4db76ba3..c6615f043 100644 --- a/core/controlcommands/multiresponse.go +++ b/core/controlcommands/multiresponse.go @@ -33,7 +33,7 @@ import ( type MesosCommandMultiResponse struct { MesosCommandResponseBase - responses map[MesosCommandTarget]MesosCommandResponse + responses map[MesosCommandTarget]MesosCommandResponse } func (m *MesosCommandMultiResponse) GetResponses() map[MesosCommandTarget]MesosCommandResponse { @@ -51,7 +51,7 @@ func (m *MesosCommandMultiResponse) GetResponseSenders() []MesosCommandTarget { if m != nil { senders := make([]MesosCommandTarget, len(m.responses)) i := 0 - for k, _ := range m.responses { + for k := range m.responses { senders[i] = k i++ } @@ -108,6 +108,6 @@ func consolidateResponses(command MesosCommand, responses map[MesosCommandTarget } return &MesosCommandMultiResponse{ MesosCommandResponseBase: *NewMesosCommandResponse(command, nil), - responses: responses, + responses: responses, } -} \ No newline at end of file +} diff --git a/core/environment/environment.go b/core/environment/environment.go index f55b109b0..9a06d121b 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -652,10 +652,10 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weig callsMapForAwait := env.callsPendingAwait[trigger] allWeightsSet := make(callable.HooksMap) - for k, _ := range hooksMapForTrigger { + for k := range hooksMapForTrigger { allWeightsSet[k] = callable.Hooks{} } - for k, _ := range callsMapForAwait { + for k := range callsMapForAwait { allWeightsSet[k] = callable.Hooks{} } allWeights := allWeightsSet.GetWeights() @@ -932,7 +932,7 @@ func (env *Environment) runTasksAsHooks(hooksToTrigger task.Tasks) (errorMap map break } else { keys := make([]string, 0) - for k, _ := range hookTimers { + for k := range hookTimers { keys = append(keys, k) } log.WithField("taskIds", strings.Join(keys, ",")). @@ -1351,7 +1351,7 @@ func (env *Environment) GetAllHosts() []string { out := make([]string, len(hostSet)) i := 0 - for hostname, _ := range hostSet { + for hostname := range hostSet { out[i] = hostname i++ } diff --git a/core/environment/manager.go b/core/environment/manager.go index a20b9b4e2..b5c1f8b5e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -211,7 +211,7 @@ func (envs *Manager) GetActiveDetectors() system.IDMap { continue } envDetectors := env.GetActiveDetectors() - for det, _ := range envDetectors { + for det := range envDetectors { response[det] = struct{}{} } } @@ -389,7 +389,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] // env.GetActiveDetectors() is valid starting now, so we can check for detector exclusion neededDetectors := env.GetActiveDetectors() - for det, _ := range neededDetectors { + for det := range neededDetectors { if _, contains := alreadyActiveDetectors[det]; contains { // required detector det is already active in some other environment return env.id, fmt.Errorf("detector %s is already in use", det.String()) diff --git a/core/globalstate.go b/core/globalstate.go index 61a6c0b61..d8fd256be 100644 --- a/core/globalstate.go +++ b/core/globalstate.go @@ -68,10 +68,9 @@ func newGlobalState(shutdown func()) (*globalState, error) { type globalState struct { sync.RWMutex - shutdown func() + shutdown func() // uses locks, so thread safe environments *environment.Manager taskman *task.Manager - } diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 6b7260da1..85869c1d0 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -729,7 +729,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri partitionsToCleanStr := make([]string, len(partitionsToClean)) i := 0 - for k, _ := range partitionsToClean { + for k := range partitionsToClean { partitionsToCleanStr[i] = k i++ } @@ -740,7 +740,7 @@ func handleCleanup(ctx context.Context, odcClient *RpcClient, arguments map[stri wg.Add(len(partitionsToClean)) // Then the actual cleanup calls begin, in parallel... - for odcPartitionId, _ := range partitionsToClean { + for odcPartitionId := range partitionsToClean { go func(odcPartitionId string) { defer wg.Done() err = doShutdown(ctx, odcClient, arguments, paddingTimeout, odcPartitionId, call) // FIXME make this parallel diff --git a/core/integration/odc/odcutils/state.go b/core/integration/odc/odcutils/state.go index a47c8e9c0..8d340a6e1 100644 --- a/core/integration/odc/odcutils/state.go +++ b/core/integration/odc/odcutils/state.go @@ -26,15 +26,15 @@ package odcutils import "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" -var( +var ( stateMap = map[string]string{ - "STANDBY": fairmq.IDLE, + "STANDBY": fairmq.IDLE, "CONFIGURED": fairmq.READY, - "RUNNING": fairmq.RUNNING, - "ERROR": fairmq.ERROR, - "DONE": fairmq.EXITING, + "RUNNING": fairmq.RUNNING, + "ERROR": fairmq.ERROR, + "DONE": fairmq.EXITING, } - invStateMap = func() (inv map[string]string) { // invert stateMap + invStateMap = func() (inv map[string]string) { // invert stateMap inv = make(map[string]string, len(stateMap)) for k, v := range stateMap { inv[v] = k diff --git a/core/integration/trg/client.go b/core/integration/trg/client.go index 4b9293dde..92652903f 100644 --- a/core/integration/trg/client.go +++ b/core/integration/trg/client.go @@ -38,8 +38,7 @@ import ( "google.golang.org/grpc/keepalive" ) -var log = logger.New(logrus.StandardLogger(),"trgclient") - +var log = logger.New(logrus.StandardLogger(), "trgclient") type RpcClient struct { trgecspb.CTPdClient @@ -51,10 +50,10 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) "endpoint": endpoint, }).Debug("dialing TRG endpoint") - dialOptions := []grpc.DialOption { + dialOptions := []grpc.DialOption{ grpc.WithInsecure(), grpc.WithConnectParams(grpc.ConnectParams{ - Backoff: backoff.Config{ + Backoff: backoff.Config{ BaseDelay: backoff.DefaultConfig.BaseDelay, Multiplier: backoff.DefaultConfig.Multiplier, Jitter: backoff.DefaultConfig.Jitter, @@ -94,26 +93,26 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) for { select { - case ok := <- stateChangedNotify: + case ok := <-stateChangedNotify: if !ok { return } connState = conn.GetState() log.Debugf("TRG client %s", connState.String()) go notifyFunc(connState) - case <- time.After(2 * time.Minute): + case <-time.After(2 * time.Minute): if conn.GetState() != connectivity.Ready { conn.ResetConnectBackoff() } - case <- cxt.Done(): + case <-cxt.Done(): return } } }() - client := &RpcClient { + client := &RpcClient{ CTPdClient: trgecspb.NewCTPdClient(conn), - conn: conn, + conn: conn, } return client @@ -128,4 +127,4 @@ func (m *RpcClient) GetConnState() connectivity.State { func (m *RpcClient) Close() error { return m.conn.Close() -} \ No newline at end of file +} diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index 5bc9785f2..dca8b9a3f 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -37,7 +37,7 @@ type Run struct { RunNumber uint32 State State Detectors []system.ID - Skip bool + Skip bool } type Runs []Run diff --git a/core/repos/repomanager.go b/core/repos/repomanager.go index cd36931d4..afed8ccb3 100644 --- a/core/repos/repomanager.go +++ b/core/repos/repomanager.go @@ -52,10 +52,10 @@ const ( refRemotePrefix = refPrefix + "remotes/origin/" ) -var log = logger.New(logrus.StandardLogger(),"repos") +var log = logger.New(logrus.StandardLogger(), "repos") var ( - once sync.Once + once sync.Once instance *RepoManager ) @@ -135,7 +135,7 @@ func initializeRepos(service configuration.Service) *RepoManager { return &rm } -func (manager *RepoManager) discoverRepos() (repos []string, err error){ +func (manager *RepoManager) discoverRepos() (repos []string, err error) { var hostingSites []string hostingSites, err = filepath.Glob(filepath.Join(manager.rService.GetReposPath(), "*")) @@ -154,7 +154,9 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ for _, hostingSite := range hostingSites { // Get rid of invalid paths - if !isValidPath(hostingSite) { continue } + if !isValidPath(hostingSite) { + continue + } // find .git dir // everything above is "path", dir containing ".git" is repo @@ -164,7 +166,7 @@ func (manager *RepoManager) discoverRepos() (repos []string, err error){ // i.e. don't include repos path // don't include trailing "/.git" repos = append(repos, strings.TrimPrefix(strings.TrimSuffix(path, "/.git"), - manager.rService.GetReposPath() + "/")) + manager.rService.GetReposPath()+"/")) } return nil @@ -337,7 +339,7 @@ func (manager *RepoManager) AddRepo(repoPath string, defaultRevision string) (st return "", false, err } - return repo.GetDefaultRevision(), repo.GetDefaultRevision()== manager.defaultRevision, nil + return repo.GetDefaultRevision(), repo.GetDefaultRevision() == manager.defaultRevision, nil } func cleanCloneParentDirs(parentDirs []string) error { @@ -385,7 +387,7 @@ func (manager *RepoManager) getRepos(repoPattern string) (repoList map[string]iR func (manager *RepoManager) getRepoByIndex(index int) (iRepo, error) { keys := manager.GetOrderedRepolistKeys() - if len(keys) - 1 >= index { // Verify that index is not out of bounds + if len(keys)-1 >= index { // Verify that index is not out of bounds return manager.repoList[keys[index]], nil } else { return nil, errors.New("getRepoByIndex: repo not found for index :" + strconv.Itoa(index)) @@ -471,7 +473,7 @@ func (manager *RepoManager) RefreshRepoByIndex(index int) error { return repo.refresh() } -func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowPath string, workflowRepo IRepo, err error) { +func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowPath string, workflowRepo IRepo, err error) { manager.mutex.Lock() defer manager.mutex.Unlock() @@ -491,7 +493,7 @@ func (manager *RepoManager) GetWorkflow(workflowPath string) (resolvedWorkflowP wfRepo = manager.defaultRepo workflowFile = workflowInfo[0] } else if len(workflowInfo) == 2 { // Repo specified - try to find it - wfRepo= manager.repoList[workflowInfo[0]] + wfRepo = manager.repoList[workflowInfo[0]] if wfRepo == nil { err = errors.New("Workflow comes from an unknown repo") return @@ -617,7 +619,7 @@ func (manager *RepoManager) EnsureReposPresent(taskClassesRequired []string) (er } // Make sure that the relevant repos are present and checked out on the expected revision - for _, repo := range reposRequired { + for _, repo := range reposRequired { existingRepo, ok := manager.repoList[repo.GetIdentifier()] if !ok { _, _, err = manager.AddRepo(repo.GetIdentifier(), repo.GetDefaultRevision()) diff --git a/core/repos/reposervice.go b/core/repos/reposervice.go index 12e5701b7..91e3f7d2c 100644 --- a/core/repos/reposervice.go +++ b/core/repos/reposervice.go @@ -21,10 +21,10 @@ func (s *RepoService) GetReposPath() string { func (s *RepoService) NewDefaultRepo(defaultRepo string) error { if s.Svc != nil { - return s.Svc.SetRuntimeEntry("aliecs","default_repo", defaultRepo) + return s.Svc.SetRuntimeEntry("aliecs", "default_repo", defaultRepo) } else { data := []byte(defaultRepo) - return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_repo"), data, 0644) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(), "default_repo"), data, 0644) } } @@ -33,7 +33,7 @@ func (s *RepoService) GetDefaultRepo() (defaultRepo string, err error) { return s.Svc.GetRuntimeEntry("aliecs", "default_repo") } else { var defaultRepoData []byte - defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_repo")) + defaultRepoData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(), "default_repo")) if err != nil { return } @@ -44,19 +44,19 @@ func (s *RepoService) GetDefaultRepo() (defaultRepo string, err error) { func (s *RepoService) NewDefaultRevision(defaultRevision string) error { if s.Svc != nil { - return s.Svc.SetRuntimeEntry("aliecs","default_revision", defaultRevision) + return s.Svc.SetRuntimeEntry("aliecs", "default_revision", defaultRevision) } else { data := []byte(defaultRevision) - return ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revision"), data, 0644) + return ioutil.WriteFile(filepath.Join(s.GetReposPath(), "default_revision"), data, 0644) } } func (s *RepoService) GetDefaultRevision() (defaultRevision string, err error) { if s.Svc != nil { - return s.Svc.GetRuntimeEntry("aliecs","default_revision") + return s.Svc.GetRuntimeEntry("aliecs", "default_revision") } else { var defaultRevisionData []byte - defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revision")) + defaultRevisionData, err = ioutil.ReadFile(filepath.Join(s.GetReposPath(), "default_revision")) if err != nil { return } @@ -68,7 +68,7 @@ func (s *RepoService) GetDefaultRevision() (defaultRevision string, err error) { func (s *RepoService) GetRepoDefaultRevisions() (map[string]string, error) { var defaultRevisions map[string]string if s.Svc != nil { - data, err := s.Svc.GetRuntimeEntry("aliecs","default_revisions") + data, err := s.Svc.GetRuntimeEntry("aliecs", "default_revisions") if err != nil { return nil, err } @@ -77,7 +77,7 @@ func (s *RepoService) GetRepoDefaultRevisions() (map[string]string, error) { return nil, err } } else { - defaultRevisionData, err := ioutil.ReadFile(filepath.Join(s.GetReposPath(),"default_revisions.json")) + defaultRevisionData, err := ioutil.ReadFile(filepath.Join(s.GetReposPath(), "default_revisions.json")) if err != nil { return nil, err } @@ -93,10 +93,9 @@ func (s *RepoService) SetRepoDefaultRevisions(defaultRevisions map[string]string } if s.Svc != nil { - err = s.Svc.SetRuntimeEntry("aliecs","default_revisions", string(data)) + err = s.Svc.SetRuntimeEntry("aliecs", "default_revisions", string(data)) } else { - err = ioutil.WriteFile(filepath.Join(s.GetReposPath(),"default_revisions.json"), data, 0644) + err = ioutil.WriteFile(filepath.Join(s.GetReposPath(), "default_revisions.json"), data, 0644) } return err } - diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index b23ddff49..948e69604 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -35,11 +35,15 @@ import ( func ParseWorkflowPublicVariableInfo(fileName string) (bool, string, VarSpecMap, error) { yamlFile, err := ioutil.ReadFile(fileName) - if err != nil { return false, "", nil, err } + if err != nil { + return false, "", nil, err + } nodes := make(map[string]yaml.Node) err = yaml.Unmarshal(yamlFile, &nodes) - if err != nil { return false, "", nil, err } + if err != nil { + return false, "", nil, err + } isPublic := nodes["name"].Tag == "!public" @@ -50,7 +54,7 @@ func ParseWorkflowPublicVariableInfo(fileName string) (bool, string, VarSpecMap, workflowVarInfo := make(VarSpecMap) for k, v := range nodes { - if err = parseYamlPublicVars(&AuxNode{k, &v }, &workflowVarInfo); err != nil { + if err = parseYamlPublicVars(&AuxNode{k, &v}, &workflowVarInfo); err != nil { return false, "", nil, err } } @@ -79,7 +83,7 @@ type VarSpec struct { // AuxNode Use an auxiliary node struct that also carries its parent Name type AuxNode struct { parentName string - node *yaml.Node + node *yaml.Node } func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { @@ -94,7 +98,9 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { if node.Kind == yaml.SequenceNode { // If it's a sequence node, continue searching for a map within it for _, v := range node.Content { err := parseYamlPublicVars(&AuxNode{"", v}, workflowVarInfo) - if err != nil { return err} + if err != nil { + return err + } } } else if node.Kind == yaml.MappingNode { // If it's a mapping node, iterate through it // We do this decoding to have a sane key -> node map @@ -102,7 +108,9 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { // with the first one holding the Name and the second one holding the tag m := make(map[string]yaml.Node) err := node.Decode(&m) - if err != nil { return err } + if err != nil { + return err + } parentName := auxNode.parentName // Search within the node contents for a "!public" mapping node, @@ -112,7 +120,10 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { if (parentName == "defaults" || parentName == "vars") && v.Kind == yaml.MappingNode && v.Tag == "!public" { err = v.Decode(&varSpec) - if err != nil { fmt.Println(err); continue } + if err != nil { + fmt.Println(err) + continue + } // If the key already exists we have come upon a duplicate! if _, exists := (*workflowVarInfo)[k]; exists { @@ -129,9 +140,11 @@ func parseYamlPublicVars(auxNode *AuxNode, workflowVarInfo *VarSpecMap) error { (*workflowVarInfo)[k] = varSpec } else { err = parseYamlPublicVars(&AuxNode{k, &v}, workflowVarInfo) - if err != nil { return err } + if err != nil { + return err + } } } } return nil -} \ No newline at end of file +} diff --git a/core/repos/varsource/varsource.go b/core/repos/varsource/varsource.go index f5740008a..a7e3b85c1 100644 --- a/core/repos/varsource/varsource.go +++ b/core/repos/varsource/varsource.go @@ -25,6 +25,7 @@ package varsource type Source int + const ( WorkflowDefaults Source = iota WorkflowVars diff --git a/core/server.go b/core/server.go index 6cfa3bce3..b2eeb072a 100644 --- a/core/server.go +++ b/core/server.go @@ -127,7 +127,7 @@ func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) services := make(map[string]*pb.IntegratedServiceInfo) - for pluginName, _ := range integration.RegisteredPlugins() { + for pluginName := range integration.RegisteredPlugins() { s := &pb.IntegratedServiceInfo{} var plugin integration.Plugin for _, p := range integration.PluginsInstance() { diff --git a/core/servertypes.go b/core/servertypes.go index 203db70f1..675f93934 100644 --- a/core/servertypes.go +++ b/core/servertypes.go @@ -29,6 +29,7 @@ import ( ) type EnvironmentInfos []*pb.EnvironmentInfo + func (infos EnvironmentInfos) Len() int { return len(infos) } diff --git a/core/signals.go b/core/signals.go index 3775135e8..5a4f67c5c 100644 --- a/core/signals.go +++ b/core/signals.go @@ -33,18 +33,17 @@ import ( "github.com/AliceO2Group/Control/core/environment" ) - - + func signals(state *globalState) { - - // Create channel to receive unix signals + + // Create channel to receive unix signals signal_chan := make(chan os.Signal, 1) - + //Register channel to receive SIGINT and SIGTERM signals signal.Notify(signal_chan, syscall.SIGINT, syscall.SIGTERM) - + // Goroutine executes a blocking receive for signals go func() { s := <-signal_chan @@ -54,9 +53,9 @@ func signals(state *globalState) { time.Sleep(2 * time.Second) switch s { case syscall.SIGINT: - os.Exit(130) // 128+2 + os.Exit(130) // 128+2 case syscall.SIGTERM: - os.Exit(143) // 128+15 + os.Exit(143) // 128+15 } }() } diff --git a/core/task/agentcache.go b/core/task/agentcache.go index 3a7820e27..57af48b67 100644 --- a/core/task/agentcache.go +++ b/core/task/agentcache.go @@ -25,17 +25,17 @@ package task import ( + "github.com/AliceO2Group/Control/core/task/constraint" "github.com/mesos/mesos-go/api/v1/lib" "sync" - "github.com/AliceO2Group/Control/core/task/constraint" ) type AgentCache struct { - mu sync.RWMutex + mu sync.RWMutex store map[mesos.AgentID]AgentCacheInfo } -type AgentCacheInfo struct{ +type AgentCacheInfo struct { AgentId mesos.AgentID Attributes constraint.Attributes Hostname string @@ -75,7 +75,7 @@ func (ac *AgentCache) Count() (count int) { if ac == nil || ac.store == nil { return 0 } - ac.mu.RLock() - defer ac.mu.RUnlock() + ac.mu.RLock() + defer ac.mu.RUnlock() return len(ac.store) } diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index 167906d80..1e05e5123 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -36,13 +36,13 @@ import ( var log = logger.New(logrus.StandardLogger(), "channel") type Channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize int `yaml:"sndBufSize"` - RcvBufSize int `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` //actually an int but we allow templating - Transport TransportType `yaml:"transport"` //default: default - Target string `yaml:"target"` //default: empty + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize int `yaml:"sndBufSize"` + RcvBufSize int `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` //actually an int but we allow templating + Transport TransportType `yaml:"transport"` //default: default + Target string `yaml:"target"` //default: empty // allowed values for `target` field: // outbound channel (mandatory!): ->outbound.go // tcp://host:port @@ -57,13 +57,13 @@ type Channel struct { func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _channel struct { - Name string `yaml:"name"` - Type ChannelType `yaml:"type"` - SndBufSize string `yaml:"sndBufSize"` - RcvBufSize string `yaml:"rcvBufSize"` - RateLogging string `yaml:"rateLogging"` - Transport TransportType `yaml:"transport"` - Target string `yaml:"target"` + Name string `yaml:"name"` + Type ChannelType `yaml:"type"` + SndBufSize string `yaml:"sndBufSize"` + RcvBufSize string `yaml:"rcvBufSize"` + RateLogging string `yaml:"rateLogging"` + Transport TransportType `yaml:"transport"` + Target string `yaml:"target"` } aux := _channel{} err = unmarshal(&aux) @@ -105,6 +105,7 @@ func (c *Channel) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { // push/pull/pub/sub/spub/xsub/pair/req/rep/dealer/router // Do we need to support them all? type ChannelType string + const ( PUSH = ChannelType("push") PULL = ChannelType("pull") diff --git a/core/task/channel/endpoint.go b/core/task/channel/endpoint.go index cc90c05ff..75c27993f 100644 --- a/core/task/channel/endpoint.go +++ b/core/task/channel/endpoint.go @@ -36,7 +36,6 @@ const ipcPathFormat = "/tmp/o2ipc-%s" type BindMap map[string]Endpoint - type Endpoint interface { GetAddressFormat() AddressFormat GetAddress() string @@ -68,38 +67,37 @@ func EndpointEquals(e Endpoint, f Endpoint) bool { func NewTcpEndpoint(host string, port uint64, transport TransportType) Endpoint { return TcpEndpoint{ - Host: host, - Port: port, + Host: host, + Port: port, Transport: transport, } } func NewBoundTcpEndpoint(port uint64, transport TransportType) Endpoint { return TcpEndpoint{ - Host: "*", - Port: port, + Host: "*", + Port: port, Transport: transport, } } func NewIpcEndpoint(path string, transport TransportType) Endpoint { return IpcEndpoint{ - Path: strings.TrimPrefix(path, "ipc://"), + Path: strings.TrimPrefix(path, "ipc://"), Transport: transport, } } func NewBoundIpcEndpoint(transport TransportType) Endpoint { return IpcEndpoint{ - Path: fmt.Sprintf(ipcPathFormat, xid.New().String()), + Path: fmt.Sprintf(ipcPathFormat, xid.New().String()), Transport: transport, } } - type TcpEndpoint struct { - Host string - Port uint64 + Host string + Port uint64 Transport TransportType } @@ -134,9 +132,8 @@ func (t TcpEndpoint) ToBoundEndpoint() Endpoint { } } - type IpcEndpoint struct { - Path string + Path string Transport TransportType } @@ -154,14 +151,14 @@ func (t IpcEndpoint) GetTransport() TransportType { func (t IpcEndpoint) ToTargetEndpoint(_ string) Endpoint { return IpcEndpoint{ - Path: t.Path, + Path: t.Path, Transport: t.Transport, } } func (t IpcEndpoint) ToBoundEndpoint() Endpoint { return IpcEndpoint{ - Path: t.Path, + Path: t.Path, Transport: t.Transport, } } diff --git a/core/task/channel/transport.go b/core/task/channel/transport.go index 98d6eefe4..0ba83db22 100644 --- a/core/task/channel/transport.go +++ b/core/task/channel/transport.go @@ -30,6 +30,7 @@ import ( ) type TransportType string + const ( DEFAULT = TransportType("default") ZEROMQ = TransportType("zeromq") @@ -57,6 +58,7 @@ func (tr *TransportType) UnmarshalText(b []byte) error { } type AddressFormat string + const ( TCP = AddressFormat("tcp") IPC = AddressFormat("ipc") diff --git a/core/task/constraint/constraints.go b/core/task/constraint/constraints.go index 5b0cbc683..3cfac6ca6 100644 --- a/core/task/constraint/constraints.go +++ b/core/task/constraint/constraints.go @@ -36,22 +36,26 @@ import ( "github.com/sirupsen/logrus" ) -/* TODO: +/* + TODO: + type Operator func(attribute string, value string) bool func Equals(attribute string, value string) bool { -}*/ -var log = logger.New(logrus.StandardLogger(),"constraints") +} +*/ +var log = logger.New(logrus.StandardLogger(), "constraints") type Constraint struct { - Attribute string `yaml:"attribute"` - Value string `yaml:"value"` + Attribute string `yaml:"attribute"` + Value string `yaml:"value"` // TODO: unmarshal this ↓ - Operator Operator + Operator Operator } type Operator int8 + const ( Equals Operator = 0 ) diff --git a/core/task/coreevent.go b/core/task/coreevent.go index 71934468a..6eb2efc61 100644 --- a/core/task/coreevent.go +++ b/core/task/coreevent.go @@ -22,19 +22,18 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package task +package task import ( + "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/taskop" "github.com/mesos/mesos-go/api/v1/lib" - "github.com/AliceO2Group/Control/common/utils/uid" - ) type TaskmanMessage struct { MessageType taskop.MessageType `json:"_messageType"` - + environmentMessage transitionTasksMessage updateTaskMessage @@ -62,7 +61,7 @@ type environmentMessage struct { func (em *environmentMessage) GetEnvironmentId() (envid uid.ID) { if em == nil { - return + return } return em.envId } @@ -98,18 +97,18 @@ func (em *environmentMessage) GetError() string { func NewEnvironmentMessage(mt taskop.MessageType, envId uid.ID, tasks Tasks, desc Descriptors) (t *TaskmanMessage) { t = newTaskmanMessage(mt) t.environmentMessage = environmentMessage{ - envId: envId, - tasks: tasks, - descriptors: desc, + envId: envId, + tasks: tasks, + descriptors: desc, } return t } type transitionTasksMessage struct { - src string - event string - dest string - commonArgs controlcommands.PropertyMap + src string + event string + dest string + commonArgs controlcommands.PropertyMap } func (trm *transitionTasksMessage) GetSource() string { @@ -140,26 +139,26 @@ func (trm *transitionTasksMessage) GetArguments() controlcommands.PropertyMap { return trm.commonArgs } -func NewTransitionTaskMessage(tasks Tasks, src,transitionEvent,dest string, cargs controlcommands.PropertyMap, envID uid.ID) (t *TaskmanMessage) { +func NewTransitionTaskMessage(tasks Tasks, src, transitionEvent, dest string, cargs controlcommands.PropertyMap, envID uid.ID) (t *TaskmanMessage) { t = newTaskmanMessage(taskop.TransitionTasks) t.transitionTasksMessage = transitionTasksMessage{ - src: src, - event: transitionEvent, - dest: dest, + src: src, + event: transitionEvent, + dest: dest, commonArgs: cargs, } t.environmentMessage = environmentMessage{ - tasks: tasks, - envId: envID, + tasks: tasks, + envId: envID, runNumber: cargs["runNumber"], } return t } type updateTaskMessage struct { - taskId string - state string - status mesos.TaskStatus + taskId string + state string + status mesos.TaskStatus } func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { @@ -170,11 +169,11 @@ func NewTaskStatusMessage(mesosStatus mesos.TaskStatus) (t *TaskmanMessage) { return t } -func NewTaskStateMessage(taskid,state string) (t *TaskmanMessage) { +func NewTaskStateMessage(taskid, state string) (t *TaskmanMessage) { t = newTaskmanMessage(taskop.TaskStateMessage) t.updateTaskMessage = updateTaskMessage{ taskId: taskid, - state: state, + state: state, } return t -} \ No newline at end of file +} diff --git a/core/task/roster.go b/core/task/roster.go index 59d8c3b37..c342c9592 100644 --- a/core/task/roster.go +++ b/core/task/roster.go @@ -96,7 +96,7 @@ func (m *roster) getTasks() Tasks { m.mu.RLock() defer m.mu.RUnlock() - tasks:= make(Tasks, len(m.tasks)) + tasks := make(Tasks, len(m.tasks)) copy(tasks, m.tasks) return tasks diff --git a/core/task/safeacks.go b/core/task/safeacks.go index b6ca867c6..5ae6c6c12 100644 --- a/core/task/safeacks.go +++ b/core/task/safeacks.go @@ -31,12 +31,12 @@ import ( // safeAcks is a thread safe map where key is a string usually a taskID // and the value is a channel of empty struct. It is being used // when we want to acknowledge that an action happened to the task -// such as task KILLED. At the moment we utilize -// safeAcks to acknowledge that all the requested tasks +// such as task KILLED. At the moment we utilize +// safeAcks to acknowledge that all the requested tasks // where killed by mesos (task/manager.go). type safeAcks struct { - mu sync.RWMutex - acks map[string]chan struct{} + mu sync.RWMutex + acks map[string]chan struct{} } func (a *safeAcks) getMap() map[string]chan struct{} { @@ -58,15 +58,14 @@ func (a *safeAcks) contains(key string) bool { defer a.mu.RUnlock() _, ok := a.acks[key] - + return ok } - func (a *safeAcks) addAckChannel(key string) { a.mu.Lock() defer a.mu.Unlock() - + a.acks[key] = make(chan struct{}) } @@ -75,11 +74,11 @@ func (a *safeAcks) getValue(key string) (ch chan struct{}, ok bool) { defer a.mu.Unlock() ch, ok = a.acks[key] - return + return } func newAcks() *safeAcks { return &safeAcks{ acks: make(map[string]chan struct{}), } -} \ No newline at end of file +} diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 825f54d55..53e548737 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -614,7 +614,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var offerWaitGroup sync.WaitGroup offerWaitGroup.Add(len(offers)) - for offerIndex, _ := range offers { + for offerIndex := range offers { go func(offerIndex int) { defer offerWaitGroup.Done() @@ -1095,7 +1095,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han machinesUsedSlice := func(machines map[string]struct{}) []string { // StringSet to StringSlice out := make([]string, len(machines)) i := 0 - for k, _ := range machines { + for k := range machines { out[i] = k i++ } @@ -1275,7 +1275,7 @@ func logAllEvents() eventrules.Rule { } } offerIds := make([]string, len(off)) - for i, _ := range off { + for i := range off { offerIds[i] = off[i].GetID().Value } fields["offerIds"] = strings.Join(offerIds, ",") diff --git a/core/task/schedutil/credentials.go b/core/task/schedutil/credentials.go index f2d034125..7b74b76f3 100644 --- a/core/task/schedutil/credentials.go +++ b/core/task/schedutil/credentials.go @@ -32,7 +32,6 @@ import ( "os" ) - func LoadCredentials(username string, password string) (result credentials, err error) { result = credentials{username, password} if result.password != "" { diff --git a/core/task/schedutil/forever.go b/core/task/schedutil/forever.go index 5fb0b8ddc..0e3169eb1 100644 --- a/core/task/schedutil/forever.go +++ b/core/task/schedutil/forever.go @@ -40,7 +40,7 @@ func Forever(name string, jobRestartDelay time.Duration, counter xmetrics.Counte err := f() if err != nil { log.WithFields(logrus.Fields{ - "name": name, + "name": name, "error": err.Error(), }).Error("job exited with error") } else { diff --git a/core/task/schedutil/mesosutil.go b/core/task/schedutil/mesosutil.go index 56913067e..a6bff6201 100644 --- a/core/task/schedutil/mesosutil.go +++ b/core/task/schedutil/mesosutil.go @@ -50,7 +50,7 @@ import ( const AuthModeBasic = "basic" -var log = logger.New(logrus.StandardLogger(),"scheduler") +var log = logger.New(logrus.StandardLogger(), "scheduler") func PrepareExecutorInfo( execBinary, execImage string, @@ -84,8 +84,8 @@ func PrepareExecutorInfo( _, executorCmd := filepath.Split(execBinary) var ( - executorUris = []mesos.CommandInfo_URI{} - executorCommand = fmt.Sprintf("./%s", executorCmd) + executorUris = []mesos.CommandInfo_URI{} + executorCommand = fmt.Sprintf("./%s", executorCmd) ) executorUris = append(executorUris, mesos.CommandInfo_URI{Value: execBinary, Executable: proto.Bool(true)}) @@ -113,7 +113,6 @@ func BuildWantsExecutorResources(executorCPU float64, executorMemory float64) (r return } - type credentials struct { username string password string diff --git a/core/task/taskclass/port/range.go b/core/task/taskclass/port/range.go index 9072b2b14..895ba97ae 100644 --- a/core/task/taskclass/port/range.go +++ b/core/task/taskclass/port/range.go @@ -68,7 +68,7 @@ func (this Ranges) Equals(other Ranges) (response bool) { } response = true - for i, _ := range this { + for i := range this { if this[i].Begin == other[i].Begin && this[i].End == other[i].End { continue } diff --git a/core/task/taskop/messagetype.go b/core/task/taskop/messagetype.go index cf8548e49..92e97da06 100644 --- a/core/task/taskop/messagetype.go +++ b/core/task/taskop/messagetype.go @@ -32,7 +32,7 @@ import ( type MessageType int -const( +const ( AcquireTasks MessageType = iota ConfigureTasks TransitionTasks @@ -44,7 +44,7 @@ const( ) func (mt MessageType) String() string { - return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks","TaskStatusMessage","TaskStateMessage","Error"}[mt] + return [...]string{"AcquireTasks", "ConfigureTasks", "TransitionTasks", "MesosEvent", "ReleaseTasks", "KillTasks", "TaskStatusMessage", "TaskStateMessage", "Error"}[mt] } func (mt *MessageType) UnmarshalJSON(b []byte) error { diff --git a/core/workflow/aggregatorrole.go b/core/workflow/aggregatorrole.go index 9fa89d71a..df677432b 100644 --- a/core/workflow/aggregatorrole.go +++ b/core/workflow/aggregatorrole.go @@ -192,7 +192,7 @@ func (r *aggregatorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkf var roleErrors *multierror.Error // Process templates for child roles - for roleIdx, _ := range r.Roles { + for roleIdx := range r.Roles { go func(roleIdx int) { defer wg.Done() role := r.Roles[roleIdx] diff --git a/core/workflow/aggregatortemplate.go b/core/workflow/aggregatortemplate.go index 8c582a63a..29bb39dae 100644 --- a/core/workflow/aggregatortemplate.go +++ b/core/workflow/aggregatortemplate.go @@ -25,10 +25,10 @@ package workflow import ( - "github.com/jinzhu/copier" "errors" + "github.com/jinzhu/copier" "text/template" - ) +) type aggregatorTemplate struct { aggregatorRole @@ -44,7 +44,6 @@ func (at *aggregatorTemplate) copy() copyable { return &rCopy } - func (at *aggregatorTemplate) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { type _aggregatorTemplate aggregatorTemplate aux := _aggregatorTemplate{} @@ -70,7 +69,7 @@ func (at *aggregatorTemplate) UnmarshalYAML(unmarshal func(interface{}) error) ( } aux.stringTemplates[str] = *tempTmpl } - */ + */ *at = aggregatorTemplate(aux) return @@ -97,4 +96,4 @@ func (at *aggregatorTemplate) generateRole(localVars map[string]string) (c Role, c = &ar return -} \ No newline at end of file +} diff --git a/core/workflow/callable/maps.go b/core/workflow/callable/maps.go index 694480086..48503f804 100644 --- a/core/workflow/callable/maps.go +++ b/core/workflow/callable/maps.go @@ -33,7 +33,7 @@ type HookWeight int func (m HooksMap) GetWeights() []HookWeight { weights := make([]int, len(m)) i := 0 - for k, _ := range m { + for k := range m { weights[i] = int(k) i++ } @@ -48,7 +48,7 @@ func (m HooksMap) GetWeights() []HookWeight { func (m CallsMap) GetWeights() []HookWeight { weights := make([]int, len(m)) i := 0 - for k, _ := range m { + for k := range m { weights[i] = int(k) i++ } diff --git a/core/workflow/calltemplate.go b/core/workflow/calltemplate.go index 24cb03fc7..fba4625c1 100644 --- a/core/workflow/calltemplate.go +++ b/core/workflow/calltemplate.go @@ -25,9 +25,9 @@ package workflow import ( - "text/template" "errors" "github.com/jinzhu/copier" + "text/template" ) type callTemplate struct { @@ -86,4 +86,4 @@ func (tt *callTemplate) generateRole(localVars map[string]string) (c Role, err e c = &tr return -} \ No newline at end of file +} diff --git a/core/workflow/graft.go b/core/workflow/graft.go index 4a1cd9b8c..d66b24fc6 100644 --- a/core/workflow/graft.go +++ b/core/workflow/graft.go @@ -25,84 +25,84 @@ package workflow import ( - "fmt" - "gopkg.in/yaml.v3" - "strings" + "fmt" + "gopkg.in/yaml.v3" + "strings" ) // Graft takes a root node, a path to a role in root, byte array with an existing role and appends this // role asa child of the role in root where the path specifies. -func Graft(root *yaml.Node, path string, toAdd []byte, graftedName string) (out []byte, err error) { - var parent *yaml.Node - for _, step := range strings.Split(path, PATH_SEPARATOR) { - _ = iterateNode(root, &parent, step) - } - if parent == nil { - return nil, fmt.Errorf("specified path not found") - } +func Graft(root *yaml.Node, path string, toAdd []byte, graftedName string) (out []byte, err error) { + var parent *yaml.Node + for _, step := range strings.Split(path, PATH_SEPARATOR) { + _ = iterateNode(root, &parent, step) + } + if parent == nil { + return nil, fmt.Errorf("specified path not found") + } - err = appendRole(parent, toAdd) - if err != nil { - return nil, err - } + err = appendRole(parent, toAdd) + if err != nil { + return nil, err + } - if graftedName != "" { - nameNode := iterateNode(root, &parent, "name") - for index, node := range parent.Content { - // Search for the name node and change the Value field for the subsequent node - if node == nameNode { - parent.Content[index+1].Value = graftedName - break - } - } - } + if graftedName != "" { + nameNode := iterateNode(root, &parent, "name") + for index, node := range parent.Content { + // Search for the name node and change the Value field for the subsequent node + if node == nameNode { + parent.Content[index+1].Value = graftedName + break + } + } + } - out, err = yaml.Marshal(root) - if err != nil{ - return nil, err - } + out, err = yaml.Marshal(root) + if err != nil { + return nil, err + } - return out, nil + return out, nil } // When passed a node, iterate through each node of its node.Content array. If found, return that node. // If not found, call iterateNode on the current node's node.Content array. The goal of this function is to get // the parent node of where the search string is found. -func iterateNode(node *yaml.Node, parent **yaml.Node,identifier string) (found *yaml.Node) { - for _, n := range node.Content { - if n.Value == identifier { - return n - } - if len(n.Content) > 0 { - if n.Tag == "!!map" { - *parent = n - } - acNode := iterateNode(n, parent, identifier) - if acNode != nil { - return acNode - } - } - } - return nil +func iterateNode(node *yaml.Node, parent **yaml.Node, identifier string) (found *yaml.Node) { + for _, n := range node.Content { + if n.Value == identifier { + return n + } + if len(n.Content) > 0 { + if n.Tag == "!!map" { + *parent = n + } + acNode := iterateNode(n, parent, identifier) + if acNode != nil { + return acNode + } + } + } + return nil } // appendRole checks if the yaml.Node passed has a "roles" field. If it exists, the toAdd yaml.Node will // be appended. If not, appendRole will error out. func appendRole(parent *yaml.Node, toAdd []byte) (err error) { - var childRole yaml.Node - err = yaml.Unmarshal(toAdd, &childRole) - var auxParent *yaml.Node // dummy value to run iterateNode successfully + var childRole yaml.Node + err = yaml.Unmarshal(toAdd, &childRole) + var auxParent *yaml.Node // dummy value to run iterateNode successfully - if iterateNode(parent, &auxParent, "roles") != nil { - for i, v := range parent.Content { - if v.Value == "roles" { - // If a !!str yaml.Node with value "roles" found, append toAdd to the next yaml.Node's Content - parent.Content[i + 1].Content = append(parent.Content[i + 1].Content, childRole.Content[0]) - } - } - } else { - // error out if current yaml.Node does not have a "roles" field - return fmt.Errorf("specified node does not have a 'roles' field") - } - return + if iterateNode(parent, &auxParent, "roles") != nil { + for i, v := range parent.Content { + if v.Value == "roles" { + // If a !!str yaml.Node with value "roles" found, append toAdd to the next yaml.Node's Content + parent.Content[i+1].Content = append(parent.Content[i+1].Content, childRole.Content[0]) + } + } + } else { + // error out if current yaml.Node does not have a "roles" field + return fmt.Errorf("specified node does not have a 'roles' field") + } + return } diff --git a/core/workflow/includetemplate.go b/core/workflow/includetemplate.go index 55e644c98..e9cd07a81 100644 --- a/core/workflow/includetemplate.go +++ b/core/workflow/includetemplate.go @@ -25,9 +25,9 @@ package workflow import ( - "text/template" "errors" "github.com/jinzhu/copier" + "text/template" ) type includeTemplate struct { @@ -86,4 +86,4 @@ func (tt *includeTemplate) generateRole(localVars map[string]string) (c Role, er c = &tr return -} \ No newline at end of file +} diff --git a/core/workflow/iteratorrole.go b/core/workflow/iteratorrole.go index 5a5384921..f1c9a6ac7 100644 --- a/core/workflow/iteratorrole.go +++ b/core/workflow/iteratorrole.go @@ -172,7 +172,7 @@ func (i *iteratorRole) ProcessTemplates(workflowRepo repos.IRepo, loadSubworkflo var roleErrors *multierror.Error // Process templates for child roles - for roleIdx, _ := range i.Roles { + for roleIdx := range i.Roles { go func(roleIdx int) { defer wg.Done() role := i.Roles[roleIdx] @@ -238,7 +238,7 @@ func (i *iteratorRole) expandTemplate() (err error) { var roleErrors *multierror.Error roles = make([]Role, len(ran)) - for rangeIdx, _ := range ran { + for rangeIdx := range ran { go func(rangeIdx int) { defer wg.Done() localValue := ran[rangeIdx] diff --git a/core/workflow/rolebase.go b/core/workflow/rolebase.go index 4b8308de1..84481408d 100644 --- a/core/workflow/rolebase.go +++ b/core/workflow/rolebase.go @@ -318,7 +318,7 @@ func (r *roleBase) wrapBindAndConnectFields() template.Fields { fields := make(template.Fields, len(r.Connect)) // first we populate the connect fields, because we know we'll have 1 fields entry // for each connect block - for i, _ := range r.Connect { + for i := range r.Connect { index := i // always keep a local copy for the getter/setter closures fields[index] = template.WrapGeneric( func() string { @@ -331,7 +331,7 @@ func (r *roleBase) wrapBindAndConnectFields() template.Fields { } // then we add any Global channel alias declarations for bind fields, we don't know // how many in advance because not all bind blocks have Global aliases - for i, _ := range r.Bind { + for i := range r.Bind { index := i // always keep a local copy for the getter/setter closures if len(r.Bind[index].Global) == 0 { continue diff --git a/core/workflow/roleutils.go b/core/workflow/roleutils.go index 6abb6f20e..3d1ef93f8 100644 --- a/core/workflow/roleutils.go +++ b/core/workflow/roleutils.go @@ -32,7 +32,7 @@ import ( func WrapConstraints(items constraint.Constraints) template.Fields { fields := make(template.Fields, 0) - for i, _ := range items { + for i := range items { index := i // we need a local copy for the getter/setter closures fields = append(fields, &template.GenericWrapper{ Getter: func() string { diff --git a/core/workflow/tasktemplate.go b/core/workflow/tasktemplate.go index 5fdeced84..ce100bbcb 100644 --- a/core/workflow/tasktemplate.go +++ b/core/workflow/tasktemplate.go @@ -25,9 +25,9 @@ package workflow import ( - "text/template" "errors" "github.com/jinzhu/copier" + "text/template" ) type taskTemplate struct { @@ -86,4 +86,4 @@ func (tt *taskTemplate) generateRole(localVars map[string]string) (c Role, err e c = &tr return -} \ No newline at end of file +} diff --git a/executor/executable/pid_util.go b/executor/executable/pid_util.go index bf0605881..611faa88a 100644 --- a/executor/executable/pid_util.go +++ b/executor/executable/pid_util.go @@ -30,7 +30,7 @@ import ( ) // pidExists will check if a pid process is running -func pidExists(pid int) (bool) { +func pidExists(pid int) bool { if pid == 0 { return false } else if pid < 0 { @@ -60,4 +60,4 @@ func pidExists(pid int) (bool) { return true } return false -} \ No newline at end of file +} diff --git a/executor/executorcmd/nopb/jsoncodec.go b/executor/executorcmd/nopb/jsoncodec.go index 62576b7eb..a6abbff16 100644 --- a/executor/executorcmd/nopb/jsoncodec.go +++ b/executor/executorcmd/nopb/jsoncodec.go @@ -35,7 +35,7 @@ func init() { } // Satisfies interface grpc.encoding.Codec -type JsonCodec struct {} +type JsonCodec struct{} func (*JsonCodec) Marshal(v interface{}) ([]byte, error) { return json.Marshal(v) diff --git a/executor/executorcmd/nopb/occclient.go b/executor/executorcmd/nopb/occclient.go index d85755210..5efe87502 100644 --- a/executor/executorcmd/nopb/occclient.go +++ b/executor/executorcmd/nopb/occclient.go @@ -26,6 +26,7 @@ func NewOccClient(cc *grpc.ClientConn) OccClient { type occEventStreamClient struct { grpc.ClientStream } + func (x *occEventStreamClient) Recv() (*pb.EventStreamReply, error) { m := new(pb.EventStreamReply) if err := x.ClientStream.RecvMsg(m); err != nil { @@ -38,11 +39,11 @@ func (c *occClient) EventStream(ctx context.Context, in *pb.EventStreamRequest, opts = append(opts, []grpc.CallOption{ grpc.CallContentSubtype("json"), - }... + }..., ) streamDesc := grpc.StreamDesc{ StreamName: "EventStream", - Handler: nil, + Handler: nil, ServerStreams: true, ClientStreams: false, } @@ -69,7 +70,7 @@ func (c *occClient) GetState(ctx context.Context, in *pb.GetStateRequest, opts . opts = append(opts, []grpc.CallOption{ grpc.CallContentSubtype("json"), - }... + }..., ) err := c.cc.Invoke(ctx, "GetState", in, &out, opts...) if err != nil { @@ -83,7 +84,7 @@ func (c *occClient) Transition(ctx context.Context, in *pb.TransitionRequest, op opts = append(opts, []grpc.CallOption{ grpc.CallContentSubtype("json"), - }... + }..., ) err := c.cc.Invoke(ctx, "Transition", in, &out, opts...) if err != nil { diff --git a/executor/executorcmd/nopb/test/main.go b/executor/executorcmd/nopb/test/main.go index 757417aa2..ae5e3171f 100644 --- a/executor/executorcmd/nopb/test/main.go +++ b/executor/executorcmd/nopb/test/main.go @@ -44,17 +44,17 @@ func main() { targetPort, _ := strconv.Atoi(targetPortS) fmt.Printf("target port: %d", targetPort) - c := executorcmd.NewClient( - uint64(targetPort), - controlmode.FAIRMQ, - executorcmd.JsonTransport, - log.WithField("id", "")) - if c == nil { - fmt.Println("client is nil") + c := executorcmd.NewClient( + uint64(targetPort), + controlmode.FAIRMQ, + executorcmd.JsonTransport, + log.WithField("id", "")) + if c == nil { + fmt.Println("client is nil") } for i := 0; i < 10; i++ { - time.Sleep(100*time.Millisecond) + time.Sleep(100 * time.Millisecond) gsr, err := c.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { diff --git a/executor/executorcmd/transitioner/direct.go b/executor/executorcmd/transitioner/direct.go index 72961f47a..5d1d7c9a1 100644 --- a/executor/executorcmd/transitioner/direct.go +++ b/executor/executorcmd/transitioner/direct.go @@ -38,4 +38,4 @@ func (cm *Direct) Commit(evt string, src string, dst string, args map[string]str func (cm *Direct) FromDeviceState(state string) string { return state -} \ No newline at end of file +} diff --git a/executor/executorcmd/transitioner/fairmq.go b/executor/executorcmd/transitioner/fairmq.go index bfaab5dc9..8b521f7a3 100644 --- a/executor/executorcmd/transitioner/fairmq.go +++ b/executor/executorcmd/transitioner/fairmq.go @@ -29,22 +29,22 @@ import "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq type FairMQ struct { DoTransition DoTransitionFunc - stateMap map[string]string + stateMap map[string]string invStateMap map[string]string } func NewFairMQTransitioner(transitionFunc DoTransitionFunc) *FairMQ { stateMap := map[string]string{ - "STANDBY": fairmq.IDLE, + "STANDBY": fairmq.IDLE, "CONFIGURED": fairmq.READY, - "RUNNING": fairmq.RUNNING, - "ERROR": fairmq.ERROR, - "DONE": fairmq.EXITING, + "RUNNING": fairmq.RUNNING, + "ERROR": fairmq.ERROR, + "DONE": fairmq.EXITING, } return &FairMQ{ DoTransition: transitionFunc, - stateMap: stateMap, - invStateMap: func() (inv map[string]string) { // invert stateMap + stateMap: stateMap, + invStateMap: func() (inv map[string]string) { // invert stateMap inv = make(map[string]string, len(stateMap)) for k, v := range stateMap { inv[v] = k @@ -63,7 +63,8 @@ func (cm *FairMQ) Commit(evt string, src string, dst string, args map[string]str case "STOP": finalState, err = cm.DoTransition(EventInfo{fairmq.EvtSTOP, cm.fmqStateForState(src), cm.fmqStateForState(dst), args}) finalState = cm.stateForFmqState(finalState) - case "RECOVER": fallthrough + case "RECOVER": + fallthrough case "GO_ERROR": log.WithField("event", evt).Error("transition not implemented yet") finalState = src diff --git a/executor/executorcmd/transitioner/fairmq/states.go b/executor/executorcmd/transitioner/fairmq/states.go index b755e7492..402601662 100644 --- a/executor/executorcmd/transitioner/fairmq/states.go +++ b/executor/executorcmd/transitioner/fairmq/states.go @@ -24,7 +24,7 @@ package fairmq -const( +const ( OK = "OK" ERROR = "ERROR" IDLE = "IDLE" @@ -35,4 +35,4 @@ const( READY = "READY" RUNNING = "RUNNING" EXITING = "EXITING" -) \ No newline at end of file +) diff --git a/executor/executorcmd/transitioner/fairmq/transitions.go b/executor/executorcmd/transitioner/fairmq/transitions.go index 5c6982d18..d64c5ca11 100644 --- a/executor/executorcmd/transitioner/fairmq/transitions.go +++ b/executor/executorcmd/transitioner/fairmq/transitions.go @@ -24,7 +24,7 @@ package fairmq -const( +const ( EvtAUTO = "Auto" EvtINIT_DEVICE = "INIT DEVICE" EvtCOMPLETE_INIT = "COMPLETE INIT" @@ -36,4 +36,4 @@ const( EvtRESET_TASK = "RESET TASK" EvtRESET_DEVICE = "RESET DEVICE" EvtEND = "END" -) \ No newline at end of file +) diff --git a/executor/executorcmd/transitioner/transitioner.go b/executor/executorcmd/transitioner/transitioner.go index 458a8075d..a909eae41 100644 --- a/executor/executorcmd/transitioner/transitioner.go +++ b/executor/executorcmd/transitioner/transitioner.go @@ -29,9 +29,9 @@ package transitioner import ( + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/logger" "github.com/sirupsen/logrus" - "github.com/AliceO2Group/Control/common/controlmode" ) var log = logger.New(logrus.StandardLogger(), "executorcontrol") @@ -52,9 +52,12 @@ func NewTransitioner(cm controlmode.ControlMode, transitionFunc DoTransitionFunc switch cm { case controlmode.FAIRMQ: return NewFairMQTransitioner(transitionFunc) - case controlmode.BASIC: fallthrough - case controlmode.HOOK: fallthrough - case controlmode.DIRECT: fallthrough + case controlmode.BASIC: + fallthrough + case controlmode.HOOK: + fallthrough + case controlmode.DIRECT: + fallthrough default: return NewDirectTransitioner(transitionFunc) } diff --git a/occ/peanut/flatten/flatten.go b/occ/peanut/flatten/flatten.go index 72b2bad1e..09db104a1 100644 --- a/occ/peanut/flatten/flatten.go +++ b/occ/peanut/flatten/flatten.go @@ -89,7 +89,6 @@ SOFTWARE. // // "c[f]": "g", // // "z": 1.4567, // // } -// package flatten import ( @@ -215,4 +214,4 @@ func enkey(top bool, prefix, subkey string, style SeparatorStyle) string { } return key -} \ No newline at end of file +} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go index c16f2ed94..c32ae0add 100644 --- a/walnut/converter/converter_test.go +++ b/walnut/converter/converter_test.go @@ -102,13 +102,13 @@ func TestGraft(t *testing.T) { f2, _ := ioutil.ReadFile("dump.yaml") result, err := workflow.Graft(&root, "readout.host-{{ it }}", f2, "small") - if err != nil{ + if err != nil { t.Error(err) } wd, _ := os.Getwd() err = ioutil.WriteFile(filepath.Join(wd, "test", "grafted.yaml"), result, 0644) - if err != nil{ + if err != nil { t.Error(err) } }) diff --git a/walnut/converter/testvalues.go b/walnut/converter/testvalues.go index 028bb1562..70b178609 100644 --- a/walnut/converter/testvalues.go +++ b/walnut/converter/testvalues.go @@ -24,12 +24,12 @@ package converter -var defaults = map[string]string { +var defaults = map[string]string{ "qc_config_uri": "json:///etc/flp.d/qc/readout.json", - "user": "test-user-1", + "user": "test-user-1", } -var extraVars = map[string]string { +var extraVars = map[string]string{ "readout_cfg_uri": "file:/home/flp/readout_stfb_emu.cfg", } @@ -39,7 +39,7 @@ var TestDump = Dump{ Name: "producer-0", Inputs: []io{}, Outputs: []io{ - io{ + { Binding: "out", Origin: "TST", Description: "RAWDATA", @@ -106,25 +106,25 @@ var TestDump = Dump{ "dpl-dump.json", }, WorkflowOptions: []options{ - options{ + { Name: "config-path", Type: "4", DefaultValue: "", Help: "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling.", }, - options{ + { Name: "no-data-sampling", Type: "5", DefaultValue: "0", Help: "Skips data sampling, connects directly the task to the producer.", }, - options{ + { Name: "readers", Type: "1", DefaultValue: "1", Help: "number of parallel readers to use", }, - options{ + { Name: "pipeline", Type: "4", DefaultValue: "", diff --git a/walnut/includeschemata.go b/walnut/includeschemata.go index 655f2f4c0..b5843ace0 100644 --- a/walnut/includeschemata.go +++ b/walnut/includeschemata.go @@ -24,14 +24,14 @@ package main -// Generate latest schemas from .json files +// Generate latest schemas from .json files //go:generate go run includeschemata.go import ( "io" "io/ioutil" - "path/filepath" "os" + "path/filepath" "strings" ) @@ -46,7 +46,7 @@ func main() { return } - out, err := os.Create(filepath.Join(schemasPath,"schemata.go")) + out, err := os.Create(filepath.Join(schemasPath, "schemata.go")) if err != nil { return } @@ -55,7 +55,7 @@ func main() { for _, f := range fs { if strings.HasSuffix(f.Name(), ".json") { out.Write([]byte(strings.TrimSuffix(f.Name(), ".json") + " = `\n")) - f, _ := os.Open(filepath.Join(schemasPath,f.Name())) + f, _ := os.Open(filepath.Join(schemasPath, f.Name())) io.Copy(out, f) out.Write([]byte("`\n")) } diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go index 31334c440..1e6c96aea 100644 --- a/walnut/schemata/schemata.go +++ b/walnut/schemata/schemata.go @@ -1,7 +1,7 @@ -package schemata +package schemata const ( -Task = ` + Task = ` { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://github.com/obviyus/Controlss/walnut/schemata/Task.json", @@ -189,7 +189,7 @@ Task = ` } } ` -Workflow = ` + Workflow = ` { "$schema": "http://json-schema.org/draft-07/schema#", "$id": "https://github.com/obviyus/Control/walnut/schemata/Workflow.json", From b77cc0a5154cc06d3bdd907df03fb96a3d021f50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 15 Nov 2024 17:18:34 +0100 Subject: [PATCH 2041/2352] [core] removed wrong code in environment/manager.go TasksStateChangedEvent --- core/environment/manager.go | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index b5c1f8b5e..1c9f6783d 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -170,23 +170,9 @@ func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager instance.mu.RLock() thisEnvCh, ok := instance.pendingStateChangeCh[typedEvent.GetEnvironmentId()] instance.mu.RUnlock() + // If environment is not in state transition message is being propagated through task/manager if ok { thisEnvCh <- typedEvent - } else { - // If there is no pending environment transition, it means that the changed task did so - // unexpectedly. In that case, the environment should transition only if the task - // is critical. - var changeCriticalTask = false - for _, v := range typedEvent.GetTaskIds() { - if tm.GetTask(v) != nil { - if tm.GetTask(v).GetTraits().Critical == true { - changeCriticalTask = true - } - } - } - if changeCriticalTask { - thisEnvCh <- typedEvent - } } default: // noop From 1dfb714fb2e34f9cdfa1fe152778aeca4bf86e49 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 15 Nov 2024 17:22:29 +0100 Subject: [PATCH 2042/2352] [build] Bump to v1.23.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 4645cfbbb..87f44620f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 23 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 3f4a6f7c5f303be0d1b443c56c99b6eca9767a08 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 20 Nov 2024 11:44:54 +0100 Subject: [PATCH 2043/2352] [core] avoid stuck updateTaskStatus due to mulitple mesos updates The issue described in OCTRL-953 occurs when we schedule kill of a task and while waiting for an acknowledgment, we receive two mesos updates: ``` [2024-11-11T12:14:02+01:00] TRACE scheduler: task status update received detector=TRG message= srcHost=alio2-cr1-flp163 state=TASK_FAILED task=2qwA9EYEgnY [2024-11-11T12:14:02+01:00] TRACE scheduler: task status update received detector=TRG message=Reconciliation: Task is unknown to the agent srcHost=alio2-cr1-flp163 state=TASK_LOST task=2qwA9EYEgnY ``` Which then trigger the discussed ack. Since it's inclear to me whether we can surely ignore TASK_LOST and trust that we will always receive either TASK_FAILED or TASK_FINISHED, I went for the approach of improving safeAcks to produce an error when subsequent acks are sent instead of blocking some goroutines. --- Makefile | 2 +- common/utils/safeacks/safeacks.go | 124 +++++++++++++++++++++++++ common/utils/safeacks/safeacks_test.go | 118 +++++++++++++++++++++++ core/task/manager.go | 33 ++++--- core/task/safeacks.go | 84 ----------------- 5 files changed, 264 insertions(+), 97 deletions(-) create mode 100644 common/utils/safeacks/safeacks.go create mode 100644 common/utils/safeacks/safeacks_test.go delete mode 100644 core/task/safeacks.go diff --git a/Makefile b/Makefile index d3c46427d..e349e8260 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./common/gera ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment +TEST_DIRS := ./apricot/local ./common/gera ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/common/utils/safeacks/safeacks.go b/common/utils/safeacks/safeacks.go new file mode 100644 index 000000000..bace3f235 --- /dev/null +++ b/common/utils/safeacks/safeacks.go @@ -0,0 +1,124 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2020 CERN and copyright holders of ALICE O². + * Author: Miltiadis Alexis + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package safeacks + +import ( + "fmt" + "sync" +) + +// SafeAcks is a thread safe structure which allows to handle acknowledgment exchanges +// with N senders and one receiver. The first sender succeeds, then an error is returned for the subsequent ones. +// This way, subsequent senders are not stuck sending an acknowledgment when nothing expects it anymore. +// The signaling design is inspired by point 2 in https://go101.org/article/channel-closing.html +// SafeAcks can be used to acknowledge that an action happened to the task such as task KILLED. +// At the moment we utilize SafeAcks to acknowledge that all the requested tasks were killed by mesos (task/manager.go). +type SafeAcks struct { + mu sync.RWMutex + acks map[string]ackChannels +} + +type ackChannels struct { + // the channel to send the ack to + ack chan struct{} + // the channel to close when acks are no longer expected + stop chan struct{} +} + +func (a *SafeAcks) deleteKey(key string) { + a.mu.Lock() + defer a.mu.Unlock() + + delete(a.acks, key) +} + +func (a *SafeAcks) ExpectsAck(key string) bool { + a.mu.RLock() + defer a.mu.RUnlock() + + _, ok := a.acks[key] + + return ok +} + +func (a *SafeAcks) RegisterAck(key string) error { + a.mu.Lock() + defer a.mu.Unlock() + + if _, hasKey := a.acks[key]; hasKey { + return fmt.Errorf("an acknowledgment was already registered for key '%s'", key) + } + + a.acks[key] = ackChannels{make(chan struct{}), make(chan struct{})} + return nil +} + +func (a *SafeAcks) getValue(key string) (ackChannels ackChannels, ok bool) { + a.mu.Lock() + defer a.mu.Unlock() + + ackChannels, ok = a.acks[key] + return +} + +// TrySendAck checks if an acknowledgment is expected and if it is, it blocks until it is received. +// If an acknowledgment is not expected at the moment of the call (or already was received), nil is returned. +// If more than one goroutine attempts to send an acknowledgment before it is received, all but one goroutines will +// receive an error. +func (a *SafeAcks) TrySendAck(key string) error { + channels, ok := a.getValue(key) + if !ok { + // fixme: perhaps we should return an error also here, but returning nil preserves the original behaviour + // of safeAcks before the refactoring. Perhaps the rest of the code assumes it's ok to blindly try sending + // an ack "just in case", so I would not change it lightly. + return nil + } + + select { + case <-channels.stop: + return fmt.Errorf("an acknowledgment has been already received for key '%s'", key) + case channels.ack <- struct{}{}: + return nil + } +} + +// TryReceiveAck blocks until an acknowledgment is received and then returns true. +// It will return false if an acknowledgment for a given key is not expected. +func (a *SafeAcks) TryReceiveAck(key string) bool { + channels, ok := a.getValue(key) + if !ok { + return false + } + <-channels.ack + close(channels.stop) + a.deleteKey(key) + return true +} + +func NewAcks() *SafeAcks { + return &SafeAcks{ + acks: make(map[string]ackChannels), + } +} diff --git a/common/utils/safeacks/safeacks_test.go b/common/utils/safeacks/safeacks_test.go new file mode 100644 index 000000000..6a5103c2d --- /dev/null +++ b/common/utils/safeacks/safeacks_test.go @@ -0,0 +1,118 @@ +package safeacks + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "sync" + "testing" + "time" +) + +var _ = Describe("SafeAcks", func() { + var sa *SafeAcks + + BeforeEach(func() { + sa = NewAcks() + }) + + Describe("RegisterAck", func() { + It("should register a new ack", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + Expect(sa.ExpectsAck("test")).To(BeTrue()) + }, SpecTimeout(5*time.Second)) + + It("should return error when an ack is already registered", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + Expect(sa.ExpectsAck("test")).To(BeTrue()) + + err = sa.RegisterAck("test") + Expect(err).To(HaveOccurred()) + + Expect(sa.ExpectsAck("test")).To(BeTrue()) + }, SpecTimeout(5*time.Second)) + }) + // TODO add timeout for this test + Describe("TrySendAck and TryReceiveAck", func() { + It("should return nil for non-existent key", func(ctx SpecContext) { + err := sa.TrySendAck("nonexistent") + Expect(err).To(BeNil()) + }, SpecTimeout(5*time.Second)) + + It("should send ack successfully", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + + var wg sync.WaitGroup + wg.Add(1) + + go func() { + defer wg.Done() + err := sa.TrySendAck("test") + Expect(err).To(BeNil()) + }() + Expect(sa.TryReceiveAck("test")).To(BeTrue()) + + wg.Wait() + }, SpecTimeout(5*time.Second)) + + It("should return error when ack was already sent once", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + + result1 := make(chan error) + result2 := make(chan error) + go func() { + result1 <- sa.TrySendAck("test") + }() + + go func() { + result2 <- sa.TrySendAck("test") + }() + + // I really don't like relying on a sleep call to test this, but I see no other way... + // The goal is to have both `TrySendAck` blocked at channel send before invoking TryReceiveAck. + // Hopefully 1 second is enough to avoid having a shaky test. + time.Sleep(1000 * time.Millisecond) + + ok := sa.TryReceiveAck("test") + Expect(ok).To(BeTrue()) + + oneErrorHaveOccured := (<-result1 != nil) != (<-result2 != nil) + Expect(oneErrorHaveOccured).To(BeTrue()) + }, SpecTimeout(5*time.Second)) + }) + + Describe("ExpectsAck", func() { + It("should return false for non-existent key", func(ctx SpecContext) { + Expect(sa.ExpectsAck("nonexistent")).To(BeFalse()) + }, SpecTimeout(5*time.Second)) + + It("should return true for registered key", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + Expect(sa.ExpectsAck("test")).To(BeTrue()) + }, SpecTimeout(5*time.Second)) + + It("should not be permanently blocked by another call", func(ctx SpecContext) { + err := sa.RegisterAck("test") + Expect(err).NotTo(HaveOccurred()) + go func() { + sa.TryReceiveAck("test") + }() + + // I really don't like relying on a sleep call to test this, but I see no other way... + // The goal is to have `TryReceiveAck` blocked at channel receive before invoking ExpectsAck. + // Hopefully 1 second is enough to avoid having a shaky test. + time.Sleep(1000 * time.Millisecond) + + Expect(sa.ExpectsAck("test")).To(BeTrue()) + }, SpecTimeout(5*time.Second)) + }) +}) + +func TestSafeAcks(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Component SafeAcks Test Suite") +} diff --git a/core/task/manager.go b/core/task/manager.go index 9193ecbb0..640fe6484 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -28,6 +28,7 @@ import ( "context" "errors" "fmt" + "github.com/AliceO2Group/Control/common/utils/safeacks" "os" "strings" "sync" @@ -99,7 +100,7 @@ type Manager struct { schedulerState *schedulerState internalEventCh chan<- event.Event - ackKilledTasks *safeAcks + ackKilledTasks *safeacks.SafeAcks killTasksMu sync.Mutex // to avoid races when attempting to kill the same tasks in different goroutines } @@ -141,7 +142,7 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.cq = taskman.schedulerState.commandqueue taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg - taskman.ackKilledTasks = newAcks() + taskman.ackKilledTasks = safeacks.NewAcks() schedState.setupCli() @@ -1009,11 +1010,17 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { WithField("partition", envId.String()). Warn("attempted status update of task not in roster") } - if ack, ok := m.ackKilledTasks.getValue(taskId); ok { - ack <- struct{}{} - // close(ack) // It can even be left open? + err := m.ackKilledTasks.TrySendAck(taskId) + if err != nil { + log.WithField("taskId", taskId). + WithField("mesosStatus", status.GetState().String()). + WithField("level", infologger.IL_Devel). + WithField("status", status.GetState().String()). + WithField("reason", status.GetReason().String()). + WithField("detector", detector). + WithField("partition", envId.String()). + Warnf("%s", err) } - return } @@ -1064,7 +1071,7 @@ func (m *Manager) Cleanup() (killed Tasks, running Tasks, err error) { // If the task list includes locked tasks, TaskNotFoundError is returned. func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err error) { taskCanBeKilledFilter := func(t *Task) bool { - if t.IsLocked() || m.ackKilledTasks.contains(t.taskId) { + if t.IsLocked() || m.ackKilledTasks.ExpectsAck(t.taskId) { return false } for _, id := range taskIds { @@ -1090,17 +1097,19 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } for _, id := range toKill.GetTaskIds() { - m.ackKilledTasks.addAckChannel(id) + err := m.ackKilledTasks.RegisterAck(id) + if err != nil { + log.WithField("level", infologger.IL_Devel).Warnf("failed to register ack for task '%s': %s", id, err) + } } killed, running, err = m.doKillTasks(toKill) m.killTasksMu.Unlock() for _, id := range killed.GetTaskIds() { - ack, ok := m.ackKilledTasks.getValue(id) - if ok { - <-ack - m.ackKilledTasks.deleteKey(id) + ok := m.ackKilledTasks.TryReceiveAck(id) + if !ok { + log.WithField("level", infologger.IL_Devel).Warnf("ack for task '%s' was never registered or was already received", id) } } return diff --git a/core/task/safeacks.go b/core/task/safeacks.go deleted file mode 100644 index 5ae6c6c12..000000000 --- a/core/task/safeacks.go +++ /dev/null @@ -1,84 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Miltiadis Alexis - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package task - -import ( - "sync" -) - -// safeAcks is a thread safe map where key is a string usually a taskID -// and the value is a channel of empty struct. It is being used -// when we want to acknowledge that an action happened to the task -// such as task KILLED. At the moment we utilize -// safeAcks to acknowledge that all the requested tasks -// where killed by mesos (task/manager.go). -type safeAcks struct { - mu sync.RWMutex - acks map[string]chan struct{} -} - -func (a *safeAcks) getMap() map[string]chan struct{} { - a.mu.RLock() - defer a.mu.RUnlock() - - return a.acks -} - -func (a *safeAcks) deleteKey(key string) { - a.mu.Lock() - defer a.mu.Unlock() - - delete(a.acks, key) -} - -func (a *safeAcks) contains(key string) bool { - a.mu.RLock() - defer a.mu.RUnlock() - - _, ok := a.acks[key] - - return ok -} - -func (a *safeAcks) addAckChannel(key string) { - a.mu.Lock() - defer a.mu.Unlock() - - a.acks[key] = make(chan struct{}) -} - -func (a *safeAcks) getValue(key string) (ch chan struct{}, ok bool) { - a.mu.Lock() - defer a.mu.Unlock() - - ch, ok = a.acks[key] - return -} - -func newAcks() *safeAcks { - return &safeAcks{ - acks: make(map[string]chan struct{}), - } -} From acfe0c8f6413574efe941ee58056934a7667dcca Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 30 Oct 2024 12:12:07 +0100 Subject: [PATCH 2044/2352] [core] Pass to FairMQ tasks abstract namespace endpoint paths O2-5457 OCTRL-946 --- core/task/channel/endpoint.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/task/channel/endpoint.go b/core/task/channel/endpoint.go index 75c27993f..70b258fc1 100644 --- a/core/task/channel/endpoint.go +++ b/core/task/channel/endpoint.go @@ -32,7 +32,7 @@ import ( "github.com/rs/xid" ) -const ipcPathFormat = "/tmp/o2ipc-%s" +const IPC_PATH_FORMAT = "@o2ipc-%s" type BindMap map[string]Endpoint @@ -90,7 +90,7 @@ func NewIpcEndpoint(path string, transport TransportType) Endpoint { func NewBoundIpcEndpoint(transport TransportType) Endpoint { return IpcEndpoint{ - Path: fmt.Sprintf(ipcPathFormat, xid.New().String()), + Path: fmt.Sprintf(IPC_PATH_FORMAT, xid.New().String()), Transport: transport, } } From 2d35bd2addccf63c51fbb08dd9f326467a9d9c72 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 25 Nov 2024 13:09:29 +0100 Subject: [PATCH 2045/2352] [build] Bump to v1.24.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 87f44620f..2e6f6d5d6 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 23 -VERSION_PATCH := 2 +VERSION_MINOR := 24 +VERSION_PATCH := 0 From aeec6021bd0e0aca3e642cea087a6e93050c3773 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Tue, 26 Nov 2024 11:29:56 +0100 Subject: [PATCH 2046/2352] [coconut] Improve role query command documentation --- coconut/cmd/role_query.go | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/coconut/cmd/role_query.go b/coconut/cmd/role_query.go index 9270772f6..59f7f63e9 100644 --- a/coconut/cmd/role_query.go +++ b/coconut/cmd/role_query.go @@ -34,9 +34,26 @@ var roleQueryCmd = &cobra.Command{ Use: "query [environment id] [query path]", Aliases: []string{"query", "q"}, Short: "query O² roles", - Long: `The role query command returns one or more role trees.`, - Run: control.WrapCall(control.QueryRoles), - Args: cobra.ExactArgs(2), + Long: `The role query command returns one or more role subtrees within a given environment. + +It allows the user to inspect the environment's workflow at runtime, after template processing operations, including +iterator expansion, just-in-time subworkflow inclusion, and variable substitution, have taken place. + +For the target role or roles, it also prints the locally defined variables, as well as the consolidated variable +stack from the point of view of that role. + +The role query command accepts two arguments: the environment ID and the query path. The query path is a dot-separated +walk through the role tree of the given environment, starting from the root role. Wildcard expressions are allowed, as +per https://github.com/gobwas/glob syntax. + +Examples: + * ` + "`coconut role query 2rE9AV3m1HL readout-dataflow`" + ` - queries the role ` + "`readout-dataflow`" + ` in environment ` + "`2rE9AV3m1HL`" + `, prints the full tree, along with the variables defined in the root role + * ` + "`coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102`" + ` - queries the role ` + "`readout-dataflow.host-aido2-bld4-lab102`" + `, prints the subtree of that role, along with the variables defined in it + * ` + "`coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102.data-distribution.stfs`" + ` - queries the role at the given path, it is a task role so there is no subtree, prints the variables defined in that role + * ` + "`coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab*`" + ` - queries the roles matching the given glob expression, prints all the subtrees and variables + * ` + "`coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab*.data-distribution.*`" + ` - queries the task roles matching the given glob expression, prints all the variables`, + Run: control.WrapCall(control.QueryRoles), + Args: cobra.ExactArgs(2), } func init() { From e908044fa2509b0165cc9a727f9682c68849b64e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Nov 2024 13:01:19 +0100 Subject: [PATCH 2047/2352] [build] Fix protoc call for o2control.proto docs generation --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index e349e8260..4fcb0f8f0 100644 --- a/Makefile +++ b/Makefile @@ -314,7 +314,7 @@ docs/coconut: docs/grpc: @echo -e "generating gRPC API documentation \033[1;33m==>\033[0m \033[1;34m./docs\033[0m" @cd apricot/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_apricot.md "apricot.proto" - @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_aliecs.md "o2control.proto" + @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc -I=. -I=../../common --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_aliecs.md "o2control.proto" @cd occ/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_occ.md "occ.proto" docs/swaggo: From 17f6d56eafaeb3eb5d6268b40f833d52cf292647 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Nov 2024 13:04:03 +0100 Subject: [PATCH 2048/2352] [build] Regenerate apidocs --- coconut/doc/coconut.md | 2 +- coconut/doc/coconut_about.md | 2 +- coconut/doc/coconut_configuration.md | 3 +- coconut/doc/coconut_configuration_dump.md | 2 +- coconut/doc/coconut_configuration_import.md | 6 +- coconut/doc/coconut_configuration_list.md | 2 +- coconut/doc/coconut_configuration_show.md | 8 +- coconut/doc/coconut_environment.md | 2 +- coconut/doc/coconut_environment_control.md | 2 +- coconut/doc/coconut_environment_create.md | 3 +- coconut/doc/coconut_environment_destroy.md | 2 +- coconut/doc/coconut_environment_list.md | 2 +- coconut/doc/coconut_environment_show.md | 2 +- coconut/doc/coconut_info.md | 2 +- coconut/doc/coconut_repository.md | 2 +- coconut/doc/coconut_repository_add.md | 2 +- .../coconut_repository_default-revision.md | 2 +- coconut/doc/coconut_repository_default.md | 2 +- coconut/doc/coconut_repository_list.md | 2 +- coconut/doc/coconut_repository_refresh.md | 2 +- coconut/doc/coconut_repository_remove.md | 2 +- coconut/doc/coconut_role.md | 2 +- coconut/doc/coconut_role_query.md | 21 +- coconut/doc/coconut_task.md | 2 +- coconut/doc/coconut_task_clean.md | 2 +- coconut/doc/coconut_task_list.md | 2 +- coconut/doc/coconut_template.md | 2 +- coconut/doc/coconut_template_list.md | 2 +- docs/apidocs_aliecs.md | 180 ++---------------- docs/apidocs_apricot.md | 17 ++ 30 files changed, 88 insertions(+), 196 deletions(-) diff --git a/coconut/doc/coconut.md b/coconut/doc/coconut.md index 2d19d4b2c..697d659a9 100644 --- a/coconut/doc/coconut.md +++ b/coconut/doc/coconut.md @@ -32,4 +32,4 @@ For more information on the available commands, see the individual documentation * [coconut task](coconut_task.md) - manage active tasks * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_about.md b/coconut/doc/coconut_about.md index 9aee6a5ea..8c0730d53 100644 --- a/coconut/doc/coconut_about.md +++ b/coconut/doc/coconut_about.md @@ -31,4 +31,4 @@ coconut about [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_configuration.md b/coconut/doc/coconut_configuration.md index 3f8d501ff..133d4db44 100644 --- a/coconut/doc/coconut_configuration.md +++ b/coconut/doc/coconut_configuration.md @@ -28,9 +28,8 @@ configuration store. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut configuration dump](coconut_configuration_dump.md) - dump configuration subtree -* [coconut configuration history](coconut_configuration_history.md) - List all existing entries with timestamps of a specified component in Consul * [coconut configuration import](coconut_configuration_import.md) - Import a configuration file for the specified component and entry * [coconut configuration list](coconut_configuration_list.md) - List all existing O² components in Consul * [coconut configuration show](coconut_configuration_show.md) - Show configuration for the component and entry specified -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_configuration_dump.md b/coconut/doc/coconut_configuration_dump.md index 5bc9439c4..d49696b8c 100644 --- a/coconut/doc/coconut_configuration_dump.md +++ b/coconut/doc/coconut_configuration_dump.md @@ -36,4 +36,4 @@ coconut configuration dump [key] [flags] * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_configuration_import.md b/coconut/doc/coconut_configuration_import.md index dcfc7b6ef..c811015c2 100644 --- a/coconut/doc/coconut_configuration_import.md +++ b/coconut/doc/coconut_configuration_import.md @@ -5,7 +5,7 @@ Import a configuration file for the specified component and entry ### Synopsis The configuration import command generates a timestamp and saves -the configuration file to Consul under the // path. +the configuration file to Consul under the / path. Supported configuration file types are JSON, YAML, TOML and INI, and their file extensions are recognized automatically. @@ -21,7 +21,7 @@ coconut conf import /// coconut conf import --new-component coconut conf import /// --format=json coconut conf import .json -coconut conf import +coconut conf import coconut conf import --new-component ``` @@ -51,4 +51,4 @@ coconut conf import --new-component * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_configuration_list.md b/coconut/doc/coconut_configuration_list.md index a74b6ae9a..65c1d6feb 100644 --- a/coconut/doc/coconut_configuration_list.md +++ b/coconut/doc/coconut_configuration_list.md @@ -42,4 +42,4 @@ coconut conf list -t * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_configuration_show.md b/coconut/doc/coconut_configuration_show.md index 2230e2ef5..0776f4cbb 100644 --- a/coconut/doc/coconut_configuration_show.md +++ b/coconut/doc/coconut_configuration_show.md @@ -6,6 +6,7 @@ Show configuration for the component and entry specified The configuration show command returns the most recent configuration revision for the specified component and entry. +It can also return a specific revision, requested with the --timestamp/-t flag ``` coconut configuration show [flags] @@ -17,7 +18,9 @@ coconut configuration show [flags] coconut conf show coconut conf show -t coconut conf show /// -coconut conf show -r -l ' +coconut conf show /// -t +coconut conf show ///@ +coconut conf show -r -l -t ' coconut conf show -s -e '{"key1": "value1", "key2": "value2"}' ``` @@ -29,6 +32,7 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" -l, --role string request configuration for this O² machine role -r, --runtype string request configuration for this run type (e.g. PHYSICS, TECHNICAL, etc.) -s, --simulate simulate runtime template processing on the configuration payload + -t, --timestamp string request configuration for this timestamp ``` ### Options inherited from parent commands @@ -46,4 +50,4 @@ coconut conf show -s -e '{"key1": "value1", "key2": "value2" * [coconut configuration](coconut_configuration.md) - view or modify O² configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment.md b/coconut/doc/coconut_environment.md index 75b10f3f6..e1575dd80 100644 --- a/coconut/doc/coconut_environment.md +++ b/coconut/doc/coconut_environment.md @@ -53,4 +53,4 @@ For more information on the behavior of coconut environments, see the subcommand * [coconut environment list](coconut_environment_list.md) - list environments * [coconut environment show](coconut_environment_show.md) - show environment information -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment_control.md b/coconut/doc/coconut_environment_control.md index f9eaef1cd..57417d5a7 100644 --- a/coconut/doc/coconut_environment_control.md +++ b/coconut/doc/coconut_environment_control.md @@ -41,4 +41,4 @@ coconut environment control [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index 1b09b860f..ce39b7349 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -30,6 +30,7 @@ coconut environment create [flags] ### Options ``` + -y, --asynchronous use asynchronous mode for environment creation -a, --auto create an autorun environment -c, --configuration string high-level configuration payload to be loaded for the new environment -e, --extra-vars key1=val1,key2=val2 values passed using key=value CSV or JSON syntax, interpreted as strings key1=val1,key2=val2 or `{"key1": "value1", "key2": "value2"}` @@ -53,4 +54,4 @@ coconut environment create [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment_destroy.md b/coconut/doc/coconut_environment_destroy.md index 637f4e216..c0747e824 100644 --- a/coconut/doc/coconut_environment_destroy.md +++ b/coconut/doc/coconut_environment_destroy.md @@ -38,4 +38,4 @@ coconut environment destroy [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment_list.md b/coconut/doc/coconut_environment_list.md index 276860074..17a5da988 100644 --- a/coconut/doc/coconut_environment_list.md +++ b/coconut/doc/coconut_environment_list.md @@ -33,4 +33,4 @@ coconut environment list [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_environment_show.md b/coconut/doc/coconut_environment_show.md index edb0f4a63..d33f8e4c8 100644 --- a/coconut/doc/coconut_environment_show.md +++ b/coconut/doc/coconut_environment_show.md @@ -35,4 +35,4 @@ coconut environment show [environment id] [flags] * [coconut environment](coconut_environment.md) - create, destroy and manage AliECS environments -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_info.md b/coconut/doc/coconut_info.md index ed26fa8fa..0f45e3d5e 100644 --- a/coconut/doc/coconut_info.md +++ b/coconut/doc/coconut_info.md @@ -32,4 +32,4 @@ coconut info [flags] * [coconut](coconut.md) - O² Control and Configuration Utility -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index bac7482c2..32156d56d 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -65,4 +65,4 @@ Make sure to run `coconut repo refresh` if you make changes to a configuration r * [coconut repository refresh](coconut_repository_refresh.md) - refresh git repositories * [coconut repository remove](coconut_repository_remove.md) - remove a git repository -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 77c9ae586..90db22e45 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -56,4 +56,4 @@ coconut repository add [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository_default-revision.md b/coconut/doc/coconut_repository_default-revision.md index ee97f30b0..0a934c080 100644 --- a/coconut/doc/coconut_repository_default-revision.md +++ b/coconut/doc/coconut_repository_default-revision.md @@ -41,4 +41,4 @@ coconut repository default-revision [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository_list.md b/coconut/doc/coconut_repository_list.md index 5c27d39af..4878ac9b8 100644 --- a/coconut/doc/coconut_repository_list.md +++ b/coconut/doc/coconut_repository_list.md @@ -31,4 +31,4 @@ coconut repository list [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository_refresh.md b/coconut/doc/coconut_repository_refresh.md index 978b47fd0..a6486cbb4 100644 --- a/coconut/doc/coconut_repository_refresh.md +++ b/coconut/doc/coconut_repository_refresh.md @@ -39,4 +39,4 @@ coconut repository refresh [repo id] [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_repository_remove.md b/coconut/doc/coconut_repository_remove.md index 74fa8b176..f69c18429 100644 --- a/coconut/doc/coconut_repository_remove.md +++ b/coconut/doc/coconut_repository_remove.md @@ -39,4 +39,4 @@ coconut repository remove [flags] * [coconut repository](coconut_repository.md) - manage git repositories for task and workflow configuration -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_role.md b/coconut/doc/coconut_role.md index f06453a11..160374748 100644 --- a/coconut/doc/coconut_role.md +++ b/coconut/doc/coconut_role.md @@ -29,4 +29,4 @@ display information on active roles. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut role query](coconut_role_query.md) - query O² roles -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 504cb016b..6d5626791 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -4,7 +4,24 @@ query O² roles ### Synopsis -The role query command returns one or more role trees. +The role query command returns one or more role subtrees within a given environment. + +It allows the user to inspect the environment's workflow at runtime, after template processing operations, including +iterator expansion, just-in-time subworkflow inclusion, and variable substitution, have taken place. + +For the target role or roles, it also prints the locally defined variables, as well as the consolidated variable +stack from the point of view of that role. + +The role query command accepts two arguments: the environment ID and the query path. The query path is a dot-separated +walk through the role tree of the given environment, starting from the root role. Wildcard expressions are allowed, as +per https://github.com/gobwas/glob syntax. + +Examples: + * `coconut role query 2rE9AV3m1HL readout-dataflow` - queries the role `readout-dataflow` in environment `2rE9AV3m1HL`, prints the full tree, along with the variables defined in the root role + * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102` - queries the role `readout-dataflow.host-aido2-bld4-lab102`, prints the subtree of that role, along with the variables defined in it + * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102.data-distribution.stfs` - queries the role at the given path, it is a task role so there is no subtree, prints the variables defined in that role + * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab*` - queries the roles matching the given glob expression, prints all the subtrees and variables + * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab*.data-distribution.*` - queries the task roles matching the given glob expression, prints all the variables ``` coconut role query [environment id] [query path] [flags] @@ -31,4 +48,4 @@ coconut role query [environment id] [query path] [flags] * [coconut role](coconut_role.md) - query roles in an environment -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_task.md b/coconut/doc/coconut_task.md index fc6e0d854..f5261acb9 100644 --- a/coconut/doc/coconut_task.md +++ b/coconut/doc/coconut_task.md @@ -30,4 +30,4 @@ manage active tasks. * [coconut task clean](coconut_task_clean.md) - clean up idle O² tasks * [coconut task list](coconut_task_list.md) - list O² tasks -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_task_clean.md b/coconut/doc/coconut_task_clean.md index 936c2bd8a..531754489 100644 --- a/coconut/doc/coconut_task_clean.md +++ b/coconut/doc/coconut_task_clean.md @@ -33,4 +33,4 @@ coconut task clean [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_task_list.md b/coconut/doc/coconut_task_list.md index 8b6d6d467..65cbad070 100644 --- a/coconut/doc/coconut_task_list.md +++ b/coconut/doc/coconut_task_list.md @@ -32,4 +32,4 @@ coconut task list [flags] * [coconut task](coconut_task.md) - manage active tasks -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_template.md b/coconut/doc/coconut_template.md index 6057fba51..efdcb6aa1 100644 --- a/coconut/doc/coconut_template.md +++ b/coconut/doc/coconut_template.md @@ -29,4 +29,4 @@ display information on available workflow templates. * [coconut](coconut.md) - O² Control and Configuration Utility * [coconut template list](coconut_template_list.md) - list available workflow templates -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 4d6c98428..47853a119 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -57,4 +57,4 @@ coconut template list [flags] * [coconut template](coconut_template.md) - query available workflow templates in configuration repositories -###### Auto generated by spf13/cobra on 17-Aug-2023 +###### Auto generated by spf13/cobra on 27-Nov-2024 diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 6284356c2..82ff39c3d 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -21,12 +21,8 @@ - [EnvironmentInfo.UserVarsEntry](#o2control-EnvironmentInfo-UserVarsEntry) - [EnvironmentInfo.VarsEntry](#o2control-EnvironmentInfo-VarsEntry) - [EnvironmentOperation](#o2control-EnvironmentOperation) - - [Ev_EnvironmentEvent](#o2control-Ev_EnvironmentEvent) - - [Ev_RoleEvent](#o2control-Ev_RoleEvent) - - [Ev_TaskEvent](#o2control-Ev_TaskEvent) - - [Event](#o2control-Event) - - [Event_MesosHeartbeat](#o2control-Event_MesosHeartbeat) - [GetActiveDetectorsReply](#o2control-GetActiveDetectorsReply) + - [GetAvailableDetectorsReply](#o2control-GetAvailableDetectorsReply) - [GetEnvironmentPropertiesReply](#o2control-GetEnvironmentPropertiesReply) - [GetEnvironmentPropertiesReply.PropertiesEntry](#o2control-GetEnvironmentPropertiesReply-PropertiesEntry) - [GetEnvironmentPropertiesRequest](#o2control-GetEnvironmentPropertiesRequest) @@ -74,11 +70,7 @@ - [SetRepoDefaultRevisionReply](#o2control-SetRepoDefaultRevisionReply) - [SetRepoDefaultRevisionRequest](#o2control-SetRepoDefaultRevisionRequest) - [ShortTaskInfo](#o2control-ShortTaskInfo) - - [StatusReply](#o2control-StatusReply) - - [StatusRequest](#o2control-StatusRequest) - - [StatusUpdate](#o2control-StatusUpdate) - [SubscribeRequest](#o2control-SubscribeRequest) - - [TaskClassInfo](#o2control-TaskClassInfo) - [TaskDeploymentInfo](#o2control-TaskDeploymentInfo) - [TaskInfo](#o2control-TaskInfo) - [TaskInfo.PropertiesEntry](#o2control-TaskInfo-PropertiesEntry) @@ -91,7 +83,6 @@ - [ControlEnvironmentRequest.Optype](#o2control-ControlEnvironmentRequest-Optype) - [EnvironmentOperation.Optype](#o2control-EnvironmentOperation-Optype) - - [StatusUpdate.Level](#o2control-StatusUpdate-Level) - [VarSpecMessage.Type](#o2control-VarSpecMessage-Type) - [VarSpecMessage.UiWidget](#o2control-VarSpecMessage-UiWidget) @@ -237,6 +228,7 @@ | ----- | ---- | ----- | ----------- | | id | [string](#string) | | | | type | [ControlEnvironmentRequest.Optype](#o2control-ControlEnvironmentRequest-Optype) | | | +| requestUser | [common.User](#common-User) | | | @@ -270,6 +262,7 @@ | keepTasks | [bool](#bool) | | | | allowInRunningState | [bool](#bool) | | | | force | [bool](#bool) | | | +| requestUser | [common.User](#common-User) | | | @@ -398,94 +391,24 @@ - - -### Ev_EnvironmentEvent - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| environmentId | [string](#string) | | | -| state | [string](#string) | | | -| currentRunNumber | [uint32](#uint32) | | | -| error | [string](#string) | | | -| message | [string](#string) | | | - - - - - - - - -### Ev_RoleEvent - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| status | [string](#string) | | | -| state | [string](#string) | | | -| rolePath | [string](#string) | | | - - - - - - - + -### Ev_TaskEvent +### GetActiveDetectorsReply | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| taskid | [string](#string) | | | -| state | [string](#string) | | | -| status | [string](#string) | | | -| hostname | [string](#string) | | | -| className | [string](#string) | | | +| detectors | [string](#string) | repeated | | - + -### Event - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| timestamp | [string](#string) | | | -| environmentEvent | [Ev_EnvironmentEvent](#o2control-Ev_EnvironmentEvent) | | | -| taskEvent | [Ev_TaskEvent](#o2control-Ev_TaskEvent) | | | -| roleEvent | [Ev_RoleEvent](#o2control-Ev_RoleEvent) | | | - - - - - - - - -### Event_MesosHeartbeat - - - - - - - - - -### GetActiveDetectorsReply +### GetAvailableDetectorsReply @@ -905,6 +828,7 @@ Roles | workflowTemplate | [string](#string) | | | | vars | [NewAutoEnvironmentRequest.VarsEntry](#o2control-NewAutoEnvironmentRequest-VarsEntry) | repeated | | | id | [string](#string) | | | +| requestUser | [common.User](#common-User) | | | @@ -954,6 +878,8 @@ Roles | workflowTemplate | [string](#string) | | | | vars | [NewEnvironmentRequest.VarsEntry](#o2control-NewEnvironmentRequest-VarsEntry) | repeated | | | public | [bool](#bool) | | | +| autoTransition | [bool](#bool) | | | +| requestUser | [common.User](#common-User) | | | @@ -1251,49 +1177,7 @@ Tasks | pid | [string](#string) | | | | sandboxStdout | [string](#string) | | | | claimable | [bool](#bool) | | | - - - - - - - - -### StatusReply - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| state | [string](#string) | | | -| statusUpdates | [StatusUpdate](#o2control-StatusUpdate) | repeated | | - - - - - - - - -### StatusRequest -Global status -////////////////////////////////////// - - - - - - - - -### StatusUpdate - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| level | [StatusUpdate.Level](#o2control-StatusUpdate-Level) | | | -| mesosHeartbeat | [Event_MesosHeartbeat](#o2control-Event_MesosHeartbeat) | | TODO add other events here and in events.proto | +| critical | [bool](#bool) | | | @@ -1315,22 +1199,6 @@ Global status - - -### TaskClassInfo - - - -| Field | Type | Label | Description | -| ----- | ---- | ----- | ----------- | -| name | [string](#string) | | | -| controlMode | [string](#string) | | | - - - - - - ### TaskDeploymentInfo @@ -1358,7 +1226,6 @@ Global status | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | shortInfo | [ShortTaskInfo](#o2control-ShortTaskInfo) | | | -| classInfo | [TaskClassInfo](#o2control-TaskClassInfo) | | | | inboundChannels | [ChannelInfo](#o2control-ChannelInfo) | repeated | | | outboundChannels | [ChannelInfo](#o2control-ChannelInfo) | repeated | | | commandInfo | [CommandInfo](#o2control-CommandInfo) | | | @@ -1523,20 +1390,6 @@ Not implemented yet - - -### StatusUpdate.Level - - -| Name | Number | Description | -| ---- | ------ | ----------- | -| DEBUG | 0 | | -| INFO | 1 | | -| WARNING | 2 | | -| ERROR | 3 | | - - - ### VarSpecMessage.Type @@ -1580,17 +1433,16 @@ Not implemented yet | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| -| TrackStatus | [StatusRequest](#o2control-StatusRequest) | [StatusReply](#o2control-StatusReply) stream | | | GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control-GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control-GetFrameworkInfoReply) | | -| Teardown | [TeardownRequest](#o2control-TeardownRequest) | [TeardownReply](#o2control-TeardownReply) | | | GetEnvironments | [GetEnvironmentsRequest](#o2control-GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control-GetEnvironmentsReply) | | | NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control-NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control-NewAutoEnvironmentReply) | | | NewEnvironment | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | | | GetEnvironment | [GetEnvironmentRequest](#o2control-GetEnvironmentRequest) | [GetEnvironmentReply](#o2control-GetEnvironmentReply) | | | ControlEnvironment | [ControlEnvironmentRequest](#o2control-ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control-ControlEnvironmentReply) | | -| ModifyEnvironment | [ModifyEnvironmentRequest](#o2control-ModifyEnvironmentRequest) | [ModifyEnvironmentReply](#o2control-ModifyEnvironmentReply) | | | DestroyEnvironment | [DestroyEnvironmentRequest](#o2control-DestroyEnvironmentRequest) | [DestroyEnvironmentReply](#o2control-DestroyEnvironmentReply) | | | GetActiveDetectors | [Empty](#o2control-Empty) | [GetActiveDetectorsReply](#o2control-GetActiveDetectorsReply) | | +| GetAvailableDetectors | [Empty](#o2control-Empty) | [GetAvailableDetectorsReply](#o2control-GetAvailableDetectorsReply) | | +| NewEnvironmentAsync | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | | | GetTasks | [GetTasksRequest](#o2control-GetTasksRequest) | [GetTasksReply](#o2control-GetTasksReply) | | | GetTask | [GetTaskRequest](#o2control-GetTaskRequest) | [GetTaskReply](#o2control-GetTaskReply) | | | CleanupTasks | [CleanupTasksRequest](#o2control-CleanupTasksRequest) | [CleanupTasksReply](#o2control-CleanupTasksReply) | | @@ -1603,8 +1455,10 @@ Not implemented yet | SetDefaultRepo | [SetDefaultRepoRequest](#o2control-SetDefaultRepoRequest) | [Empty](#o2control-Empty) | | | SetGlobalDefaultRevision | [SetGlobalDefaultRevisionRequest](#o2control-SetGlobalDefaultRevisionRequest) | [Empty](#o2control-Empty) | | | SetRepoDefaultRevision | [SetRepoDefaultRevisionRequest](#o2control-SetRepoDefaultRevisionRequest) | [SetRepoDefaultRevisionReply](#o2control-SetRepoDefaultRevisionReply) | | -| Subscribe | [SubscribeRequest](#o2control-SubscribeRequest) | [Event](#o2control-Event) stream | | +| Subscribe | [SubscribeRequest](#o2control-SubscribeRequest) | [.events.Event](#events-Event) stream | | | GetIntegratedServices | [Empty](#o2control-Empty) | [ListIntegratedServicesReply](#o2control-ListIntegratedServicesReply) | | +| Teardown | [TeardownRequest](#o2control-TeardownRequest) | [TeardownReply](#o2control-TeardownReply) | Reserved and not implemented: | +| ModifyEnvironment | [ModifyEnvironmentRequest](#o2control-ModifyEnvironmentRequest) | [ModifyEnvironmentReply](#o2control-ModifyEnvironmentReply) | | diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index 8e2f8585a..88a120245 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -22,6 +22,7 @@ - [DetectorsResponse](#apricot-DetectorsResponse) - [Empty](#apricot-Empty) - [GetEntryRequest](#apricot-GetEntryRequest) + - [GetRuntimeEntriesRequest](#apricot-GetRuntimeEntriesRequest) - [GetRuntimeEntryRequest](#apricot-GetRuntimeEntryRequest) - [HostEntriesResponse](#apricot-HostEntriesResponse) - [HostGetRequest](#apricot-HostGetRequest) @@ -329,6 +330,21 @@ + + +### GetRuntimeEntriesRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| component | [string](#string) | | | + + + + + + ### GetRuntimeEntryRequest @@ -603,6 +619,7 @@ | GetEndpointsForCRUCard | [CardRequest](#apricot-CardRequest) | [CRUCardEndpointResponse](#apricot-CRUCardEndpointResponse) | | | GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot-GetRuntimeEntryRequest) | [ComponentResponse](#apricot-ComponentResponse) | Runtime KV calls | | SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot-SetRuntimeEntryRequest) | [Empty](#apricot-Empty) | | +| GetRuntimeEntries | [GetRuntimeEntriesRequest](#apricot-GetRuntimeEntriesRequest) | [StringMap](#apricot-StringMap) | | | ListRuntimeEntries | [ListRuntimeEntriesRequest](#apricot-ListRuntimeEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | | ListComponents | [Empty](#apricot-Empty) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | Component configuration calls | | ListComponentEntries | [ListComponentEntriesRequest](#apricot-ListComponentEntriesRequest) | [ComponentEntriesResponse](#apricot-ComponentEntriesResponse) | | From 4451613a85eaa003ac2efc3f8452cc47a81c02ac Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 27 Nov 2024 14:43:24 +0100 Subject: [PATCH 2049/2352] [core] Report to Kafka source state if transition failed --- core/environment/environment.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 9a06d121b..eca6cd8e4 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -413,13 +413,15 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.handlerFunc()(e) + eventState := e.Dst // we set the destination state here instead of the current for the event write, if the tasks have transitioned if e.Err != nil { errorMsg = e.Err.Error() + eventState = e.Src } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ EnvironmentId: env.id.String(), - State: e.Dst, // exceptionally we take the destination state here instead of the current, because the tasks have transitioned + State: eventState, RunNumber: env.currentRunNumber, Error: errorMsg, Message: "transition step finished", From 9b967cc6be0be718741193c7a37b5f438a90c054 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 26 Nov 2024 14:24:37 +0100 Subject: [PATCH 2050/2352] OCTRL-949 [core] Improve reaction to controlled nodes becoming unreachable Includes: - fixed copy-paste logs "received executor failed" -> "received agent failed" - added an operator log in case of connection issues to a mesos slave - allowed to re-register agent and executor IDs for a Task once they come back (they are removed when an Agent/Executor failure is received). Effectively, this allows an environment to be torn down correctly, fixing at least some of the leftover task issues (OCTRL-611). - added documentation about configuring the node-down timeout --- core/environment/manager.go | 4 ++-- core/task/manager.go | 7 +++++++ core/task/scheduler.go | 3 +++ docs/handbook/appconfiguration.md | 13 ++++++++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 1c9f6783d..ced832149 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -116,13 +116,13 @@ func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager WithField("partition", envId.String()). WithField("agentId", typedEvent.GetId().Value). WithError(err). - Error("cannot find environment for incoming executor failed event") + Error("cannot find environment for incoming agent failed event") } log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("agentId", typedEvent.GetId().Value). WithField("envState", env.CurrentState()). - Debug("received executor failed event") + Debug("received agent failed event") } case *event.TasksReleasedEvent: diff --git a/core/task/manager.go b/core/task/manager.go index 640fe6484..83139c69a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1047,6 +1047,13 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { if taskPtr.GetParent() != nil { taskPtr.GetParent().UpdateStatus(ACTIVE) } + if status.GetAgentID() != nil { + taskPtr.agentId = status.GetAgentID().GetValue() + } + if status.GetExecutorID() != nil { + taskPtr.executorId = status.GetExecutorID().GetValue() + } + case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR, mesos.TASK_FINISHED: taskPtr.status = INACTIVE diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 53e548737..aeea651f5 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -246,6 +246,9 @@ func (state *schedulerState) failure(_ context.Context, e *scheduler.Event) erro WithFields(fields). WithField("level", infologger.IL_Support). Error("agent failed") + log.WithField("level", infologger.IL_Ops). + WithField("detector", detector). + Errorf("possible connectivity issues with host '%s'", host) state.taskman.internalEventCh <- event.NewAgentFailedEvent(aid) } return nil diff --git a/docs/handbook/appconfiguration.md b/docs/handbook/appconfiguration.md index 88250ac3f..5b5892771 100644 --- a/docs/handbook/appconfiguration.md +++ b/docs/handbook/appconfiguration.md @@ -1 +1,12 @@ -# Component Configuration \ No newline at end of file +# Component Configuration + +## Connectivity to controlled nodes + +ECS relies on Mesos to know the state of the controlled nodes. +Thus, losing connection to a Mesos slave can be treated as a node being down or unresponsive. +In case a Mesos slave is lost, tasks belonging to it are set to ERROR state and treated as INACTIVE. +Then, the environment is transitioned to ERROR. + +Mesos slave health check can be configured with `MESOS_MAX_AGENT_PING_TIMEOUTS` (`--max_agent_ping_timeouts`) and `MESOS_AGENT_PING_TIMEOUT` (`--agent_ping_timeout`) parameters for Mesos. +Effectively, the factor of the two parameters is the time needed to consider a slave/agent as lost. +Please refer to Mesos documentation for more details. \ No newline at end of file From 54994ff0d3e45d7f36925261e7944a497c33f485 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Dec 2024 12:18:12 +0100 Subject: [PATCH 2051/2352] [core] Handle gRPC code DeadlineExceeded in DCS client --- core/integration/dcs/plugin.go | 213 +++++++++++++++++++++++++-------- 1 file changed, 166 insertions(+), 47 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 5a9898d3b..ee951dca6 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -53,7 +53,9 @@ import ( "github.com/spf13/viper" "golang.org/x/exp/maps" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/status" ) const ( @@ -782,22 +784,59 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } - if err != nil { // stream termination in case of general error - logMsg := "bad DCS PFR event received, any future DCS events are ignored" - log.WithError(err). - WithField("partition", envId). - Warn(logMsg) + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("partition", envId). + WithField("timeout", timeout.String()). + Debug("DCS PFR timed out") + err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS PFR event received, any future DCS events are ignored" + log.WithError(err). + WithField("partition", envId). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + WithField("partition", envId). + Error("DCS PFR call error") + err = fmt.Errorf("DCS PFR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + } break } @@ -1452,23 +1491,63 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } - if err != nil { // stream termination in case of general error - logMsg := "bad DCS SOR event received, any future DCS events are ignored" - log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). - Warn(logMsg) + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + WithField("timeout", timeout.String()). + Debug("DCS SOR timed out") + err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS SOR event received, any future DCS events are ignored" + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + Debug("DCS SOR call error") + err = fmt.Errorf("DCS SOR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + } break } @@ -2001,23 +2080,63 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } - if err != nil { // stream termination in case of general error - logMsg := "bad DCS EOR event received, any future DCS events are ignored" - log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). - Warn(logMsg) + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + WithField("timeout", timeout.String()). + Debug("DCS EOR timed out") + err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS EOR event received, any future DCS events are ignored" + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + WithField("partition", envId). + WithField("run", runNumber64). + Debug("DCS EOR call error") + err = fmt.Errorf("DCS EOR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + } break } From de4d866ab9a0844dcabf236ad8fc73a8121cfda5 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 5 Dec 2024 13:27:59 +0100 Subject: [PATCH 2052/2352] [build] Bump to v1.25.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2e6f6d5d6..ea1a1c3a7 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 24 +VERSION_MINOR := 25 VERSION_PATCH := 0 From 50cf2cdf01e55120921d6d189daf82aba92603eb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 10 Dec 2024 12:39:29 +0100 Subject: [PATCH 2053/2352] [occ] do not call iterateCheck when in ERROR There is no point in asking the controlled task for a health check if it's still in ERROR. The task can go to healthy state by requesting a recover transition, which gives a success or failure as a return value. OCTRL-958 --- occ/occlib/OccServer.cxx | 24 +++++++++++++----------- occ/occlib/RuntimeControlledObject.h | 4 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index fd0208a0e..6947624c2 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -437,17 +437,19 @@ void OccServer::runChecker() } } - // execute periodic check, in any state - int err = m_rco->iterateCheck(); - // if there's an error but the SM hasn't been moved to t_State::error yet - if (err && (m_rco->getState() != t_State::error)) { - updateState(t_State::error); - - // the above publishes a state change event to the StateStream, but we also push an exception event on the - // EventStream because the transition was initiated by the task - auto taskErrorEvent = new pb::DeviceEvent; - taskErrorEvent->set_type(pb::TASK_INTERNAL_ERROR); - pushEvent(taskErrorEvent); + // execute periodic check, in any state except ERROR + if (m_rco->getState() != t_State::error) { + int err = m_rco->iterateCheck(); + // if there's an error but the SM hasn't been moved to t_State::error yet + if (err) { + updateState(t_State::error); + + // the above publishes a state change event to the StateStream, but we also push an exception event on the + // EventStream because the transition was initiated by the task + auto taskErrorEvent = new pb::DeviceEvent; + taskErrorEvent->set_type(pb::TASK_INTERNAL_ERROR); + pushEvent(taskErrorEvent); + } } m_mu.unlock(); diff --git a/occ/occlib/RuntimeControlledObject.h b/occ/occlib/RuntimeControlledObject.h index 3002606da..977063832 100644 --- a/occ/occlib/RuntimeControlledObject.h +++ b/occ/occlib/RuntimeControlledObject.h @@ -268,12 +268,12 @@ class OCC_EXPORT RuntimeControlledObject { virtual int iterateRunning(); /** - * Perform periodic checks during every state. + * Perform periodic checks during every state except ERROR. * * @return 0 if the check completed successfully and the machine can stay in the current state, * or any other value to immediately trigger a transition to the error state. * - * This function is called continuously by OccServer::runChecker in any state, including + * This function is called continuously by OccServer::runChecker in any state except ERROR, including * t_State::running. Its purpose is for the implementer to report an unusual condition in * order to trigger a transition to t_State::error. */ From 27baac2b1325008a796844bd31424f91fe801e83 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Mon, 9 Dec 2024 11:46:38 +0100 Subject: [PATCH 2054/2352] [build] Fix make fdset command to include common.proto --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4fcb0f8f0..7fc8aa7ea 100644 --- a/Makefile +++ b/Makefile @@ -302,8 +302,8 @@ fdset: @echo -e "building fdset files \033[1;33m==>\033[0m \033[1;34m./common/protos\033[0m" @mkdir -p fdset - @cd common/protos && protoc -I.. -I. -o events.fdset events.proto && cd ../.. - @mv common/protos/events.fdset fdset + @cd common/protos && protoc -I.. -I. -o common.fdset common.proto && protoc -I.. -I. -o events.fdset events.proto && cd ../.. + @mv common/protos/*.fdset fdset @echo -e "to consume with \033[1;33mhttps://github.com/sevagh/pq\033[0m: FDSET_PATH=./fdset pq kafka aliecs.environment --brokers kafka-broker-hostname:9092 --beginning --msgtype events.Event" From 6f64bf3773e3fc70c3c379e9e175ad6109c09738 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 11 Dec 2024 14:44:47 +0100 Subject: [PATCH 2055/2352] [core] Add json.Sort function to workflow template context --- configuration/template/stack.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/configuration/template/stack.go b/configuration/template/stack.go index fbbf3a02e..2ba94b6e4 100644 --- a/configuration/template/stack.go +++ b/configuration/template/stack.go @@ -263,6 +263,20 @@ func MakeUtilFuncMap(varStack map[string]string) map[string]interface{} { out = string(bytes) return }, + "Sort": func(in interface{}) (out interface{}) { + switch inSlice := in.(type) { + case []interface{}: + stringSlice := make([]string, len(inSlice)) + for idx, item := range inSlice { + stringSlice[idx] = fmt.Sprintf("%v", item) + } + slices.Sort(stringSlice) + out = stringSlice + default: + out = in + } + return + }, } jsonMap["Deserialize"] = jsonMap["Unmarshal"] jsonMap["Serialize"] = jsonMap["Marshal"] From caa0979a9466902936d955dec60ff6f53bdd0928 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 11 Dec 2024 14:45:13 +0100 Subject: [PATCH 2056/2352] [core] Sort detector list before including in ODC payload --- core/integration/odc/plugin.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a881f4b36..ea3a7a28b 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -33,6 +33,7 @@ import ( "encoding/json" "fmt" "net/url" + "slices" "strconv" "strings" "sync" @@ -715,6 +716,7 @@ func (p *Plugin) ObjectStack(varStack map[string]string, baseConfigStack map[str if ok && strings.ToLower(strings.TrimSpace(ctpReadoutEnabled)) == "true" { detectorsSlice = append(detectorsSlice, "TRG") } + slices.Sort(detectorsSlice) pdpDetectorList = strings.Join(detectorsSlice, ",") } accumulator = append(accumulator, fmt.Sprintf("WORKFLOW_DETECTORS='%s'", strings.TrimSpace(pdpDetectorList))) @@ -1231,6 +1233,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if ok { detectorsSlice, err := p.parseDetectors(detectorListS) if err == nil { + slices.Sort(detectorsSlice) arguments["detectors"] = strings.Join(detectorsSlice, ",") } else { log.WithField("partition", envId). From 893cf1d117a9a6740c66ce4c94c207f828069163 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 9 Dec 2024 17:53:43 +0100 Subject: [PATCH 2057/2352] [core] Adding http metrics endpoint --- Makefile | 2 +- common/ecsmetrics/metric.go | 14 ++ common/ecsmetrics/metrics.go | 73 ++++++++++ common/monitoring/metric.go | 27 ++++ common/monitoring/monitoring.go | 125 ++++++++++++++++++ common/monitoring/monitoring_test.go | 190 +++++++++++++++++++++++++++ core/config.go | 4 + core/core.go | 53 +++++++- 8 files changed, 485 insertions(+), 3 deletions(-) create mode 100644 common/ecsmetrics/metric.go create mode 100644 common/ecsmetrics/metrics.go create mode 100644 common/monitoring/metric.go create mode 100644 common/monitoring/monitoring.go create mode 100644 common/monitoring/monitoring_test.go diff --git a/Makefile b/Makefile index 7fc8aa7ea..458f5c4e6 100644 --- a/Makefile +++ b/Makefile @@ -71,7 +71,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut TEST_DIRS := ./apricot/local ./common/gera ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment -GO_TEST_DIRS := ./core/repos ./core/integration/dcs +GO_TEST_DIRS := ./core/repos ./core/integration/dcs ./common/monitoring coverage:COVERAGE_PREFIX := ./coverage_results coverage:GOTEST_COVERAGE_FILE := $(COVERAGE_PREFIX)/gotest.out diff --git a/common/ecsmetrics/metric.go b/common/ecsmetrics/metric.go new file mode 100644 index 000000000..fda30f87c --- /dev/null +++ b/common/ecsmetrics/metric.go @@ -0,0 +1,14 @@ +package ecsmetrics + +import ( + "time" + + "github.com/AliceO2Group/Control/common/monitoring" +) + +func NewMetric(name string) monitoring.Metric { + timestamp := time.Now() + metric := monitoring.Metric{Name: name, Timestamp: timestamp.UnixMilli()} + metric.AddTag("subsystem", "ECS") + return metric +} diff --git a/common/ecsmetrics/metrics.go b/common/ecsmetrics/metrics.go new file mode 100644 index 000000000..f9d5f0184 --- /dev/null +++ b/common/ecsmetrics/metrics.go @@ -0,0 +1,73 @@ +package ecsmetrics + +import ( + internalmetrics "runtime/metrics" + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" + "github.com/sirupsen/logrus" +) + +var ( + endRequestChannel chan struct{} + log = logger.New(logrus.StandardLogger(), "ecsmetrics") +) + +func gather() monitoring.Metric { + samples := []internalmetrics.Sample{ + {Name: "/gc/cycles/total:gc-cycles"}, + {Name: "/memory/classes/other:bytes"}, + {Name: "/memory/classes/total:bytes"}, + {Name: "/sched/goroutines:goroutines"}, + {Name: "/sync/mutex/wait/total:seconds"}, + {Name: "/memory/classes/other:bytes"}, + {Name: "/memory/classes/total:bytes"}, + {Name: "/memory/classes/heap/free:bytes"}, + {Name: "/memory/classes/heap/objects:bytes"}, + {Name: "/memory/classes/heap/released:bytes"}, + {Name: "/memory/classes/heap/stacks:bytes"}, + {Name: "/memory/classes/heap/unused:bytes"}, + } + + // Collect metrics data + internalmetrics.Read(samples) + + metric := NewMetric("golangruntimemetrics") + + for _, sample := range samples { + switch sample.Value.Kind() { + case internalmetrics.KindUint64: + metric.AddValue(sample.Name, sample.Value.Uint64()) + case internalmetrics.KindFloat64: + metric.AddValue(sample.Name, sample.Value.Float64()) + case internalmetrics.KindFloat64Histogram: + log.Warning("Error: Histogram is not supported yet for metric [%s]", sample.Name) + continue + default: + log.Warning("Unsupported kind %v for metric %s\n", sample.Value.Kind(), sample.Name) + continue + } + } + return metric +} + +func StartGolangMetrics(period time.Duration) { + go func() { + for { + select { + case <-endRequestChannel: + endRequestChannel <- struct{}{} + return + default: + monitoring.Send(gather()) + time.Sleep(period) + } + } + }() +} + +func StopGolangMetrics() { + endRequestChannel <- struct{}{} + <-endRequestChannel +} diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go new file mode 100644 index 000000000..891733233 --- /dev/null +++ b/common/monitoring/metric.go @@ -0,0 +1,27 @@ +package monitoring + +type ( + TagsType map[string]any + ValuesType map[string]any +) + +type Metric struct { + Name string `json:"name"` + Values ValuesType `json:"values"` + Tags TagsType `json:"tags,omitempty"` + Timestamp int64 `json:"timestamp"` +} + +func (metric *Metric) AddTag(tagName string, value any) { + if metric.Tags == nil { + metric.Tags = make(TagsType) + } + metric.Tags[tagName] = value +} + +func (metric *Metric) AddValue(valueName string, value any) { + if metric.Values == nil { + metric.Values = make(ValuesType) + } + metric.Values[valueName] = value +} diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go new file mode 100644 index 000000000..a6eae11b9 --- /dev/null +++ b/common/monitoring/monitoring.go @@ -0,0 +1,125 @@ +package monitoring + +import ( + "context" + "encoding/json" + "fmt" + "net/http" + "time" + + "github.com/AliceO2Group/Control/common/logger" + "github.com/sirupsen/logrus" +) + +var ( + server *http.Server + metricsLimit int = 1000000 + metrics []Metric + // channel that is used to request end of metrics server, it sends notification when server ended. + // It needs to be read!!! + endChannel chan struct{} + + // channel used to send metrics into the event loop + metricsChannel chan Metric + + // channel for sending notifications to event loop that new http Request to report metrics arrived + metricsRequestChannel chan struct{} + + // channel used to send metrics to be reported by http request from event loop + metricsToRequest chan []Metric + + Log = logger.New(logrus.StandardLogger(), "metrics") +) + +func initChannels(messageBufferSize int) { + endChannel = make(chan struct{}) + metricsRequestChannel = make(chan struct{}) + metricsChannel = make(chan Metric, 100) + metricsToRequest = make(chan []Metric) + metricsLimit = messageBufferSize +} + +func closeChannels() { + close(endChannel) + close(metricsRequestChannel) + close(metricsChannel) + close(metricsToRequest) +} + +func eventLoop() { + for { + select { + case <-metricsRequestChannel: + shallowCopyMetrics := metrics + metrics = make([]Metric, 0) + metricsToRequest <- shallowCopyMetrics + + case metric := <-metricsChannel: + if len(metrics) < metricsLimit { + metrics = append(metrics, metric) + } else { + Log.Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") + } + + case <-endChannel: + endChannel <- struct{}{} + return + } + } +} + +func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + metricsRequestChannel <- struct{}{} + metricsToConvert := <-metricsToRequest + if metricsToConvert == nil { + metricsToConvert = make([]Metric, 0) + } + json.NewEncoder(w).Encode(metricsToConvert) +} + +func Send(metric Metric) { + metricsChannel <- metric +} + +func handleFunc(endpointName string) { + // recover is here to correctly allow multiple Starts and Stops of server + defer func() { + recover() + }() + + http.HandleFunc(endpointName, exportMetricsAndReset) +} + +// \param port port where the scraping endpoint will be created +// \param endpointName name of the endpoint, which must start with a slash eg. "/internalmetrics" +// \param messageBufferSize size of buffer for messages where messages are kept between scraping request. +// +// If we attempt send more messages than the size of the buffer, these overflowing messages will be ignored and warning will be logged. +func Start(port uint16, endpointName string, messageBufferSize int) error { + if server != nil { + return nil + } + + initChannels(messageBufferSize) + + go eventLoop() + + server := &http.Server{Addr: fmt.Sprintf(":%d", port)} + handleFunc(endpointName) + return server.ListenAndServe() +} + +func Stop() { + if server == nil { + return + } + + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + server.Shutdown(ctx) + + endChannel <- struct{}{} + <-endChannel + server = nil +} diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go new file mode 100644 index 000000000..4d3a3d958 --- /dev/null +++ b/common/monitoring/monitoring_test.go @@ -0,0 +1,190 @@ +package monitoring + +import ( + "encoding/json" + "fmt" + "net/http" + "testing" + "time" +) + +func TestSimpleStartStop(t *testing.T) { + go Start(1234, "/random", 100) + time.Sleep(time.Millisecond * 100) + Stop() +} + +func TestStartMultipleStop(t *testing.T) { + go Start(1234, "/random", 100) + time.Sleep(time.Millisecond * 100) + Stop() + Stop() +} + +func cleaningUpAfterTest() { + endChannel <- struct{}{} + <-endChannel + closeChannels() + metrics = make([]Metric, 0) +} + +func initTest() { + initChannels(100) + // we need metrics channel to block so we don't end to quickly + metricsChannel = make(chan Metric, 0) + go eventLoop() +} + +// decorator function that properly inits and cleans after higher level test of Monitoring package +func testFunction(t *testing.T, testToRun func(*testing.T)) { + initTest() + testToRun(t) + cleaningUpAfterTest() +} + +func TestSendingSingleMetric(t *testing.T) { + testFunction(t, func(t *testing.T) { + metric := Metric{Name: "test"} + Send(metric) + if len(metrics) != 1 { + t.Error("wrong number of metrics, should be 1") + } + + if metrics[0].Name != "test" { + t.Errorf("Got wrong name %s in stored metric", metrics[0].Name) + } + }) +} + +func TestExportingMetrics(t *testing.T) { + testFunction(t, func(t *testing.T) { + metric := Metric{Name: "test"} + Send(metric) + + metricsRequestChannel <- struct{}{} + metrics := <-metricsToRequest + + if len(metrics) != 1 { + t.Errorf("Got wrong amount of metrics %d, expected 1", len(metrics)) + } + + if metrics[0].Name != "test" { + t.Errorf("Got wrong name of metric %s, expected test", metrics[0].Name) + } + }) +} + +func TestBufferLimit(t *testing.T) { + testFunction(t, func(t *testing.T) { + metricsLimit = 1 + metric := Metric{Name: "test"} + metric.Timestamp = 10 + metric.AddTag("tag1", 42) + metric.AddValue("value1", 11) + Send(metric) + + if len(metrics) != 1 { + t.Errorf("Metrics length is %d, but should be 1 after sending first metric", len(metrics)) + } + + Send(metric) + time.Sleep(100 * time.Millisecond) + + if len(metrics) != 1 { + t.Errorf("Metrics length is %d, but should be 1 after sending second metric", len(metrics)) + } + }) +} + +func TestHttpRun(t *testing.T) { + go Start(12345, "/metrics", 10) + defer Stop() + + time.Sleep(time.Second) + + metric := Metric{Name: "test"} + metric.Timestamp = 10 + metric.AddTag("tag1", 42) + metric.AddValue("value1", 11) + Send(metric) + + response, err := http.Get("http://localhost:12345/metrics") + if err != nil { + t.Fatalf("Failed to GET metrics at port 12345: %v", err) + } + decoder := json.NewDecoder(response.Body) + var receivedMetrics []Metric + if err = decoder.Decode(&receivedMetrics); err != nil { + t.Fatalf("Failed to decoded Metric: %v", err) + } + + receivedMetric := receivedMetrics[0] + + if receivedMetric.Name != "test" { + t.Errorf("Got wrong name of metric %s, expected test", receivedMetric.Name) + } + + if receivedMetric.Timestamp != 10 { + t.Errorf("Got wrong timestamp of metric %d, expected 10", receivedMetric.Timestamp) + } + + if len(receivedMetric.Tags) != 1 { + t.Errorf("Got wrong number of tags %d, expected 1", len(receivedMetric.Tags)) + } + + if receivedMetric.Tags["tag1"].(float64) != 42 { + t.Error("Failed to retreive tags: tag1 with value 42") + } + + if len(receivedMetric.Values) != 1 { + t.Errorf("Got wrong number of values %d, expected 1", len(receivedMetric.Values)) + } + + if receivedMetric.Values["value1"].(float64) != 11 { + t.Error("Failed to retreive tags: value1 with value 11") + } +} + +// This benchmark cannot be run for too long as it will fill whole RAM even with +// results: +// goos: linux +// goarch: amd64 +// pkg: github.com/AliceO2Group/Control/common/monitoring +// cpu: 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz +// BenchmarkSendingMetrics-16 +// +// 123365481 192.6 ns/op +// PASS +// ok github.com/AliceO2Group/Control/common/monitoring 44.686s +func BenchmarkSendingMetrics(b *testing.B) { + Start(12345, "/metrics", 100) + + // this goroutine keeps clearing results so RAM does not exhausted + go func() { + for { + select { + case <-endChannel: + endChannel <- struct{}{} + break + default: + if len(metrics) >= 10000000 { + metricsRequestChannel <- struct{}{} + <-metricsToRequest + } + } + time.Sleep(100 * time.Millisecond) + } + }() + + defer Stop() + + metric := Metric{Name: "testname", Timestamp: 12345} + metric.AddValue("value", 42) + metric.AddTag("tag", 40) + + for i := 0; i < b.N; i++ { + Send(metric) + } + + fmt.Println("") +} diff --git a/core/config.go b/core/config.go index a6a891f0f..e772f6945 100644 --- a/core/config.go +++ b/core/config.go @@ -128,6 +128,8 @@ func setDefaults() error { viper.SetDefault("kafkaEndpoints", []string{"localhost:9092"}) viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) + viper.SetDefault("metricsEndpoint", "8086/metrics") + viper.SetDefault("metricsBufferSize", 10000) return nil } @@ -198,6 +200,8 @@ func setFlags() error { pflag.StringSlice("kafkaEndpoints", viper.GetStringSlice("kafkaEndpoints"), "List of Kafka endpoints to connect to (default: localhost:9092)") pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") pflag.Bool("logAllIL", viper.GetBool("logAllIL"), "Send all the logs into IL, including Debug and Trace messages") + pflag.String("metricsEndpoint", viper.GetString("metricsEndpoint"), "Http endpoint from which metrics can be scraped: [port/endpoint]") + pflag.Int("metricsBufferSize", viper.GetInt("metricsBufferSize"), "Limit for how many metrics can be stored in buffer in between scraping requests") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/core.go b/core/core.go index e0db7224e..903585084 100644 --- a/core/core.go +++ b/core/core.go @@ -26,12 +26,19 @@ package core import ( "context" + "errors" "fmt" "net" + "net/http" + "regexp" + "strconv" "syscall" + "time" + "github.com/AliceO2Group/Control/common/ecsmetrics" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/the" @@ -44,8 +51,45 @@ import ( var log = logger.New(logrus.StandardLogger(), "core") -const fileLimitWant = 65536 -const fileLimitMin = 8192 +const ( + fileLimitWant = 65536 + fileLimitMin = 8192 +) + +func parseMetricsEndpoint(metricsEndpoint string) (error, uint16, string) { + pattern := `(^[0-9]{4,5})\/([a-zA-Z]+)` + re := regexp.MustCompile(pattern) + matches := re.FindStringSubmatch(metricsEndpoint) + + if matches != nil { + port, err := strconv.ParseUint(matches[1], 10, 16) + if err != nil { + return err, 0, "" + } + return nil, uint16(port), matches[2] + } else { + return errors.New("Failed to parse metrics endpoint: %s"), 0, "" + } +} + +func runMetrics() { + log.Info("Starting run metrics") + metricsEndpoint := viper.GetString("metricsEndpoint") + err, port, endpoint := parseMetricsEndpoint(metricsEndpoint) + if err != nil { + log.WithField("error", err).Error("Failed to parse metrics endpoint") + return + } + + go func() { + if err := monitoring.Start(port, fmt.Sprintf("/%s", endpoint), viper.GetInt("metricsBufferSize")); err != nil && err != http.ErrServerClosed { + ecsmetrics.StopGolangMetrics() + log.Errorf("failed to run metrics on port %d and endpoint: %s") + } + }() + + ecsmetrics.StartGolangMetrics(10 * time.Second) +} // Run is the entry point for this scheduler. // TODO: refactor Config to reflect our specific requirements @@ -99,6 +143,11 @@ func Run() error { // Plugins need to start after taskman is running, because taskman provides the FID integration.PluginsInstance().InitAll(state.taskman.GetFrameworkID()) + runMetrics() + defer ecsmetrics.StopGolangMetrics() + defer monitoring.Stop() + + log.Infof("Everything initiated Listening on control port: %d", viper.GetInt("controlPort")) lis, err := net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("controlPort"))) if err != nil { From d6a022e46bf5c94f9183cde575df44429f372d2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 12 Dec 2024 11:51:52 +0100 Subject: [PATCH 2058/2352] fixup! [core] Adding http metrics endpoint --- core/core.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/core.go b/core/core.go index 903585084..d1c708cc3 100644 --- a/core/core.go +++ b/core/core.go @@ -147,7 +147,7 @@ func Run() error { defer ecsmetrics.StopGolangMetrics() defer monitoring.Stop() - log.Infof("Everything initiated Listening on control port: %d", viper.GetInt("controlPort")) + log.WithField("level", infologger.IL_Devel).Infof("Everything initiated and listening on control port: %d", viper.GetInt("controlPort")) lis, err := net.Listen("tcp", fmt.Sprintf(":%d", viper.GetInt("controlPort"))) if err != nil { From 2887fe0e82d665a5c6d1863ad7becf519cf47327 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 11 Dec 2024 23:49:54 +0000 Subject: [PATCH 2059/2352] Bump golang.org/x/crypto from 0.21.0 to 0.31.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.21.0 to 0.31.0. - [Commits](https://github.com/golang/crypto/compare/v0.21.0...v0.31.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 17 +++++++++-------- go.sum | 33 ++++++++++++++++----------------- 2 files changed, 25 insertions(+), 25 deletions(-) diff --git a/go.mod b/go.mod index 032b7b9b0..952d4b846 100644 --- a/go.mod +++ b/go.mod @@ -62,9 +62,9 @@ require ( github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.21.0 - golang.org/x/net v0.23.0 - golang.org/x/sys v0.18.0 + golang.org/x/crypto v0.31.0 + golang.org/x/net v0.25.0 + golang.org/x/sys v0.28.0 google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.33.0 @@ -75,6 +75,7 @@ require ( dario.cat/mergo v1.0.1 github.com/expr-lang/expr v1.16.1 github.com/flosch/pongo2/v6 v6.0.0 + github.com/gogo/protobuf v1.3.2 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 github.com/onsi/ginkgo/v2 v2.11.0 @@ -105,7 +106,6 @@ require ( github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect - github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect @@ -166,10 +166,11 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/term v0.18.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.10.0 // indirect + golang.org/x/term v0.27.0 // indirect + golang.org/x/text v0.21.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect diff --git a/go.sum b/go.sum index 0b3d3fd05..d1d9e032d 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,3 @@ -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= @@ -461,16 +459,16 @@ golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 h1:6R2FC06FonbXQ8pK11/PDFY6N6LWlf9KlzibaCapmqc= golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -487,8 +485,8 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -497,8 +495,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -534,8 +532,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= @@ -544,8 +542,8 @@ golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -557,8 +555,9 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -567,8 +566,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 9b05d4bf7fe6e8b41e73a5ced1dff539b371c0c9 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 12 Dec 2024 11:56:16 +0100 Subject: [PATCH 2060/2352] [build] Bump to v1.26.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ea1a1c3a7..a923312b2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 25 +VERSION_MINOR := 26 VERSION_PATCH := 0 From 6a5ce939b1bf4b3017b4acb7c2f22a72003819d9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 12 Dec 2024 15:35:32 +0100 Subject: [PATCH 2061/2352] OCTRL-951 [core][executor] improve reporting error transition I rearranged two logs correlated to task going to ERROR, with one producing easily-digestible message for an operator. --- core/workflow/taskrole.go | 15 ++++++++++----- executor/executable/controllabletask.go | 3 ++- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index bbeaf3e38..fabfde9dc 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -257,11 +257,16 @@ func (t *taskRole) updateState(s sm.State) { EnvironmentId: t.GetEnvironmentId().String(), }) if t.state.get() == sm.ERROR { - log.WithField("partition", t.GetEnvironmentId().String()). - WithField("level", infologger.IL_Support). - WithField("role", t.Name). - WithField("critical", t.Critical). - Error("task went into ERROR") + if t.Critical { + log.WithField("partition", t.GetEnvironmentId().String()). + WithField("level", infologger.IL_Ops). + Errorf("critical task '%s' on host '%s' went into ERROR, the environment will stop or tear down", t.Name, t.Task.GetHostname()) + } else { + log.WithField("partition", t.GetEnvironmentId().String()). + WithField("level", infologger.IL_Ops). + Errorf("non-critical task '%s' on host '%s' went into ERROR, but the environment might continue", t.Name, t.Task.GetHostname()) + } + } } t.SendEvent(&event.RoleEvent{Name: t.Name, State: t.state.get().String(), RolePath: t.GetPath()}) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 861ee1337..a4cf5b34b 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -550,7 +550,8 @@ func (t *ControllableTask) Launch() error { WithField("taskId", taskId). WithField("taskName", t.ti.Name). WithField("taskPid", t.knownPid). - Warningf("task %s transitioned to ERROR on its own - notifying environment", deo.TaskId.String()) + WithField("level", infologger.IL_Support). + Warningf("task transitioned to ERROR on its own - notifying environment") } } deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) From eea914943ebbb9730f83b584b181cef8345b5f6c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 12 Dec 2024 15:37:11 +0100 Subject: [PATCH 2062/2352] OCTRL-900 [core] demote getConfig warnings containing debug information --- configuration/template/stackutil.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/configuration/template/stackutil.go b/configuration/template/stackutil.go index 1e58fb69c..44ce4a29a 100644 --- a/configuration/template/stackutil.go +++ b/configuration/template/stackutil.go @@ -27,6 +27,7 @@ package template import ( "encoding/json" "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" texttemplate "text/template" "time" @@ -51,8 +52,8 @@ func getConfigLegacy(confSvc ConfigurationService, varStack map[string]string, p fields := Fields{WrapPointer(&payload)} err = fields.Execute(confSvc, query.Path(), varStack, nil, nil, make(map[string]texttemplate.Template), nil) - log.Warn(varStack) - log.Warn(payload) + log.WithField("level", infologger.IL_Devel).Debug(varStack) + log.WithField("level", infologger.IL_Devel).Debug(payload) return payload } @@ -68,8 +69,8 @@ func getConfig(confSvc ConfigurationService, varStack map[string]string, path st return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } - log.Warn(varStack) - log.Warn(payload) + log.WithField("level", infologger.IL_Devel).Debug(varStack) + log.WithField("level", infologger.IL_Devel).Debug(payload) return payload } From 6a2250bfd4ff33d95c9d3008dc7b89b7781fce42 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 12 Dec 2024 18:32:52 +0100 Subject: [PATCH 2063/2352] OCTRL-759 [core] clearer deployment failure logs for OPS - shortened one phrase and demoted the log to support, as a similar log is always produced for OPS anyway - removed redundant prefix "deployment error", which IMHO does not add anything to error message which follows (e.g "deployment error error=workflow deployment failed..." becomes "workflow deployment failed...") --- core/environment/transition_deploy.go | 4 ++-- core/task/manager.go | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 652b53257..ed7e6e455 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -342,9 +342,9 @@ func (t DeployTransition) do(env *Environment) (err error) { } if err != nil { - log.WithError(err). + log.WithField("level", infologger.IL_Ops). WithField("partition", env.Id().String()). - Error("deployment error") + Error(err) return } diff --git a/core/task/manager.go b/core/task/manager.go index 83139c69a..d04964f2a 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1207,7 +1207,8 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { if err != nil { log.WithError(err). WithField("partition", tm.GetEnvironmentId().String()). - Errorf("Failed task creation and Mesos resources allocation during the deployment of the environment. For more details check Devel logs in Info Logger.") + WithField("level", infologger.IL_Support). + Errorf("failed task creation and Mesos resources allocation during the deployment of the environment. More details in Devel logs.") } }() case taskop.ConfigureTasks: From 8eaa8f8bed521ca84bfcc86186fdb984ca69b108 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 13 Dec 2024 08:53:09 +0100 Subject: [PATCH 2064/2352] [core] protect from accessing nil t.Task --- core/workflow/taskrole.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/workflow/taskrole.go b/core/workflow/taskrole.go index fabfde9dc..3b294b2a4 100644 --- a/core/workflow/taskrole.go +++ b/core/workflow/taskrole.go @@ -257,14 +257,18 @@ func (t *taskRole) updateState(s sm.State) { EnvironmentId: t.GetEnvironmentId().String(), }) if t.state.get() == sm.ERROR { + host := "unknown" + if t.Task != nil { + host = t.Task.GetHostname() + } if t.Critical { log.WithField("partition", t.GetEnvironmentId().String()). WithField("level", infologger.IL_Ops). - Errorf("critical task '%s' on host '%s' went into ERROR, the environment will stop or tear down", t.Name, t.Task.GetHostname()) + Errorf("critical task '%s' on host '%s' went into ERROR, the environment will stop or tear down", t.Name, host) } else { log.WithField("partition", t.GetEnvironmentId().String()). WithField("level", infologger.IL_Ops). - Errorf("non-critical task '%s' on host '%s' went into ERROR, but the environment might continue", t.Name, t.Task.GetHostname()) + Errorf("non-critical task '%s' on host '%s' went into ERROR, but the environment might continue", t.Name, host) } } From c46119c77ec5c01ff8a058aa231faefa9fc7310f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 9 Jan 2025 11:06:03 +0100 Subject: [PATCH 2065/2352] Update operation_order.md with trg.RunStop change According to the change in https://github.com/AliceO2Group/ControlWorkflows/pull/670 --- docs/handbook/operation_order.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index b4fe3f567..4a861897d 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -54,9 +54,10 @@ This is the order of actions happening at a healthy end of run. ### before_STOP_ACTIVITY - `before_STOP_ACTIVITY` hooks with negative weights are executed + - `trg.RunStop()` at `-10` - `"run_end_time_ms"` is set using the current time. It is considered as the EOR and SOEOR timestamps. - `before_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - - `trg.RunStop()`, `odc.Stop()` (does not need to return now) at `0` + - `odc.Stop()` (does not need to return now) at `0` ### leave_RUNNING @@ -194,4 +195,4 @@ If this operation fails for one or more detectors, the The environment will then declare a **failure**, the `STOP_ACTIVITY` transition will be blocked and the environment -will move to `ERROR`. \ No newline at end of file +will move to `ERROR`. From 3830420dc7573878cb9ace5d7fe9d7a915c3a5fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 13 Jan 2025 19:57:39 +0100 Subject: [PATCH 2066/2352] [core] fixing and refactoring monitoring Fixed race condition which results in golang metrics reporting being stuck by adding check to monitoring.Send function. Other refactoring and documentation --- common/ecsmetrics/metrics.go | 10 +++- common/monitoring/monitoring.go | 56 ++++++++++++------ common/monitoring/monitoring_test.go | 86 +++++++++++++++++----------- core/config.go | 2 +- core/core.go | 4 +- 5 files changed, 101 insertions(+), 57 deletions(-) diff --git a/common/ecsmetrics/metrics.go b/common/ecsmetrics/metrics.go index f9d5f0184..066fdf0d2 100644 --- a/common/ecsmetrics/metrics.go +++ b/common/ecsmetrics/metrics.go @@ -5,6 +5,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/monitoring" "github.com/sirupsen/logrus" ) @@ -30,7 +31,6 @@ func gather() monitoring.Metric { {Name: "/memory/classes/heap/unused:bytes"}, } - // Collect metrics data internalmetrics.Read(samples) metric := NewMetric("golangruntimemetrics") @@ -42,10 +42,10 @@ func gather() monitoring.Metric { case internalmetrics.KindFloat64: metric.AddValue(sample.Name, sample.Value.Float64()) case internalmetrics.KindFloat64Histogram: - log.Warning("Error: Histogram is not supported yet for metric [%s]", sample.Name) + log.WithField("level", infologger.IL_Devel).Warningf("Error: Histogram is not supported yet for metric [%s]", sample.Name) continue default: - log.Warning("Unsupported kind %v for metric %s\n", sample.Value.Kind(), sample.Name) + log.WithField("level", infologger.IL_Devel).Warningf("Unsupported kind %v for metric %s\n", sample.Value.Kind(), sample.Name) continue } } @@ -53,13 +53,17 @@ func gather() monitoring.Metric { } func StartGolangMetrics(period time.Duration) { + log.WithField("level", infologger.IL_Devel).Info("Starting golang metrics reporting") go func() { + log.Debug("Starting golang metrics goroutine") for { select { case <-endRequestChannel: + log.Debug("ending golang metrics") endRequestChannel <- struct{}{} return default: + log.Debug("sending golang metrics") monitoring.Send(gather()) time.Sleep(period) } diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index a6eae11b9..be788f7de 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -22,47 +22,58 @@ var ( // channel used to send metrics into the event loop metricsChannel chan Metric - // channel for sending notifications to event loop that new http Request to report metrics arrived - metricsRequestChannel chan struct{} + // channel for sending requests to reset actual metrics slice and send it back to caller via metricsExportedToRequest + metricsRequestedChannel chan struct{} // channel used to send metrics to be reported by http request from event loop - metricsToRequest chan []Metric + metricsExportedToRequest chan []Metric - Log = logger.New(logrus.StandardLogger(), "metrics") + log = logger.New(logrus.StandardLogger(), "metrics") ) func initChannels(messageBufferSize int) { endChannel = make(chan struct{}) - metricsRequestChannel = make(chan struct{}) + metricsRequestedChannel = make(chan struct{}) + // 100 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if + // multiple goroutines want to send metrics without blocking each other metricsChannel = make(chan Metric, 100) - metricsToRequest = make(chan []Metric) + metricsExportedToRequest = make(chan []Metric) metricsLimit = messageBufferSize } func closeChannels() { close(endChannel) - close(metricsRequestChannel) + close(metricsRequestedChannel) close(metricsChannel) - close(metricsToRequest) + close(metricsExportedToRequest) } +// this eventLoop is the main part that processes all metrics send to the package +// 3 events can happen: +// 1. metricsChannel receives message from Send() method. We just add the new metric to metrics slice +// 2. metricsRequestChannel receives request to dump and request existing metrics. We send shallow copy of existing +// metrics to requestor (via metricsExportedToRequest channel) while resetting current metrics slice +// 3. receive request to stop monitoring via endChannel. We send confirmation through endChannel to notify caller +// that eventLoop stopped func eventLoop() { for { select { - case <-metricsRequestChannel: + case <-metricsRequestedChannel: shallowCopyMetrics := metrics metrics = make([]Metric, 0) - metricsToRequest <- shallowCopyMetrics + metricsExportedToRequest <- shallowCopyMetrics case metric := <-metricsChannel: if len(metrics) < metricsLimit { metrics = append(metrics, metric) } else { - Log.Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") + log.Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") } case <-endChannel: - endChannel <- struct{}{} + defer func() { + endChannel <- struct{}{} + }() return } } @@ -70,8 +81,8 @@ func eventLoop() { func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") - metricsRequestChannel <- struct{}{} - metricsToConvert := <-metricsToRequest + metricsRequestedChannel <- struct{}{} + metricsToConvert := <-metricsExportedToRequest if metricsToConvert == nil { metricsToConvert = make([]Metric, 0) } @@ -79,7 +90,9 @@ func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { } func Send(metric Metric) { - metricsChannel <- metric + if IsRunning() { + metricsChannel <- metric + } } func handleFunc(endpointName string) { @@ -96,8 +109,8 @@ func handleFunc(endpointName string) { // \param messageBufferSize size of buffer for messages where messages are kept between scraping request. // // If we attempt send more messages than the size of the buffer, these overflowing messages will be ignored and warning will be logged. -func Start(port uint16, endpointName string, messageBufferSize int) error { - if server != nil { +func Run(port uint16, endpointName string, messageBufferSize int) error { + if IsRunning() { return nil } @@ -105,13 +118,13 @@ func Start(port uint16, endpointName string, messageBufferSize int) error { go eventLoop() - server := &http.Server{Addr: fmt.Sprintf(":%d", port)} + server = &http.Server{Addr: fmt.Sprintf(":%d", port)} handleFunc(endpointName) return server.ListenAndServe() } func Stop() { - if server == nil { + if !IsRunning() { return } @@ -122,4 +135,9 @@ func Stop() { endChannel <- struct{}{} <-endChannel server = nil + metrics = nil +} + +func IsRunning() bool { + return server != nil } diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index 4d3a3d958..7b707c3e1 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -8,36 +8,61 @@ import ( "time" ) +// blocks until either IsRunning() returns true or timeout is triggered +func isRunningWithTimeout(t *testing.T, timeout time.Duration) { + timeoutChan := time.After(timeout) + for !IsRunning() { + select { + case <-timeoutChan: + t.Errorf("Monitoring is not running even after %v", timeout) + return + + default: + time.Sleep(10 * time.Millisecond) + } + } +} + +// block until either length of metrics is the same as \requiredMessages or timeout is triggered +func hasNumberOfMetrics(t *testing.T, timeout time.Duration, requiredMessages int) { + timeoutChan := time.After(timeout) + for len(metrics) != requiredMessages { + select { + case <-timeoutChan: + t.Errorf("Timeout %v triggered when waiting for %v messages, got %v", timeout, requiredMessages, len(metrics)) + return + + default: + time.Sleep(10 * time.Millisecond) + } + } +} + func TestSimpleStartStop(t *testing.T) { - go Start(1234, "/random", 100) - time.Sleep(time.Millisecond * 100) + go Run(1234, "/random", 100) + isRunningWithTimeout(t, time.Second) Stop() } func TestStartMultipleStop(t *testing.T) { - go Start(1234, "/random", 100) - time.Sleep(time.Millisecond * 100) + go Run(1234, "/random", 100) + isRunningWithTimeout(t, time.Second) Stop() Stop() } func cleaningUpAfterTest() { - endChannel <- struct{}{} - <-endChannel - closeChannels() - metrics = make([]Metric, 0) + Stop() } func initTest() { - initChannels(100) - // we need metrics channel to block so we don't end to quickly - metricsChannel = make(chan Metric, 0) - go eventLoop() + go Run(12345, "notimportant", 100) } // decorator function that properly inits and cleans after higher level test of Monitoring package func testFunction(t *testing.T, testToRun func(*testing.T)) { initTest() + isRunningWithTimeout(t, time.Second) testToRun(t) cleaningUpAfterTest() } @@ -46,9 +71,7 @@ func TestSendingSingleMetric(t *testing.T) { testFunction(t, func(t *testing.T) { metric := Metric{Name: "test"} Send(metric) - if len(metrics) != 1 { - t.Error("wrong number of metrics, should be 1") - } + hasNumberOfMetrics(t, time.Second, 1) if metrics[0].Name != "test" { t.Errorf("Got wrong name %s in stored metric", metrics[0].Name) @@ -60,16 +83,17 @@ func TestExportingMetrics(t *testing.T) { testFunction(t, func(t *testing.T) { metric := Metric{Name: "test"} Send(metric) + hasNumberOfMetrics(t, time.Second, 1) - metricsRequestChannel <- struct{}{} - metrics := <-metricsToRequest + metricsRequestedChannel <- struct{}{} + metricsToExport := <-metricsExportedToRequest - if len(metrics) != 1 { - t.Errorf("Got wrong amount of metrics %d, expected 1", len(metrics)) + if len(metricsToExport) != 1 { + t.Errorf("Got wrong amount of metrics %d, expected 1", len(metricsToExport)) } - if metrics[0].Name != "test" { - t.Errorf("Got wrong name of metric %s, expected test", metrics[0].Name) + if metricsToExport[0].Name != "test" { + t.Errorf("Got wrong name of metric %s, expected test", metricsToExport[0].Name) } }) } @@ -81,11 +105,9 @@ func TestBufferLimit(t *testing.T) { metric.Timestamp = 10 metric.AddTag("tag1", 42) metric.AddValue("value1", 11) - Send(metric) - if len(metrics) != 1 { - t.Errorf("Metrics length is %d, but should be 1 after sending first metric", len(metrics)) - } + Send(metric) + hasNumberOfMetrics(t, time.Second, 1) Send(metric) time.Sleep(100 * time.Millisecond) @@ -97,10 +119,10 @@ func TestBufferLimit(t *testing.T) { } func TestHttpRun(t *testing.T) { - go Start(12345, "/metrics", 10) + go Run(9876, "/metrics", 10) defer Stop() - time.Sleep(time.Second) + isRunningWithTimeout(t, time.Second) metric := Metric{Name: "test"} metric.Timestamp = 10 @@ -108,9 +130,9 @@ func TestHttpRun(t *testing.T) { metric.AddValue("value1", 11) Send(metric) - response, err := http.Get("http://localhost:12345/metrics") + response, err := http.Get("http://localhost:9876/metrics") if err != nil { - t.Fatalf("Failed to GET metrics at port 12345: %v", err) + t.Fatalf("Failed to GET metrics at port 9876: %v", err) } decoder := json.NewDecoder(response.Body) var receivedMetrics []Metric @@ -157,7 +179,7 @@ func TestHttpRun(t *testing.T) { // PASS // ok github.com/AliceO2Group/Control/common/monitoring 44.686s func BenchmarkSendingMetrics(b *testing.B) { - Start(12345, "/metrics", 100) + Run(12345, "/metrics", 100) // this goroutine keeps clearing results so RAM does not exhausted go func() { @@ -168,8 +190,8 @@ func BenchmarkSendingMetrics(b *testing.B) { break default: if len(metrics) >= 10000000 { - metricsRequestChannel <- struct{}{} - <-metricsToRequest + metricsRequestedChannel <- struct{}{} + <-metricsExportedToRequest } } time.Sleep(100 * time.Millisecond) diff --git a/core/config.go b/core/config.go index e772f6945..9b48de8bb 100644 --- a/core/config.go +++ b/core/config.go @@ -128,7 +128,7 @@ func setDefaults() error { viper.SetDefault("kafkaEndpoints", []string{"localhost:9092"}) viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) - viper.SetDefault("metricsEndpoint", "8086/metrics") + viper.SetDefault("metricsEndpoint", "8088/ecsmetrics") viper.SetDefault("metricsBufferSize", 10000) return nil } diff --git a/core/core.go b/core/core.go index d1c708cc3..ade418040 100644 --- a/core/core.go +++ b/core/core.go @@ -73,7 +73,6 @@ func parseMetricsEndpoint(metricsEndpoint string) (error, uint16, string) { } func runMetrics() { - log.Info("Starting run metrics") metricsEndpoint := viper.GetString("metricsEndpoint") err, port, endpoint := parseMetricsEndpoint(metricsEndpoint) if err != nil { @@ -82,7 +81,8 @@ func runMetrics() { } go func() { - if err := monitoring.Start(port, fmt.Sprintf("/%s", endpoint), viper.GetInt("metricsBufferSize")); err != nil && err != http.ErrServerClosed { + log.Infof("Starting to listen on endpoint %s:%d for metrics", endpoint, port) + if err := monitoring.Run(port, fmt.Sprintf("/%s", endpoint), viper.GetInt("metricsBufferSize")); err != nil && err != http.ErrServerClosed { ecsmetrics.StopGolangMetrics() log.Errorf("failed to run metrics on port %d and endpoint: %s") } From 0a82858f4f5145a97cea8d65273c87f66599d98b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 15 Jan 2025 10:45:23 +0100 Subject: [PATCH 2067/2352] [core] improvements in error reporting during env deployment and configuration - "task '/opt/o2/bin/o2-readout-exe' on alio2-cr1-mvs11 (id 2sBwA3Z8yWU, name alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows/tasks/readout@12b11ac4bb652e1835e3e94806a688c951691d5f#2sBwA3Z8yWU) failed with error..." displayed by COG becomes "task 'readout' on alio2-cr1-mvs11 (id 2sBwA3Z8yWU) failed with error...". I believe the removed information is not useful for typical operators. Details can be always found in logs. - "MesosCommand MesosCommand_Transition timed out for task 2sBwYFZ82wn" becomes "MesosCommand_Transition timed out for task 2sBwYFZ82wn" because by convention, all MesosCommands have "MesosCommand" in their names. - If a transition request times out, more accurate error is reported in COG. "nil response" becomes "CONFIGURE could not complete for critical tasks, errors: task 'readout' on alio2-cr1-mvs11 (id 2sBwA3Z8yWU) failed with error: MesosCommand_Transition timed out for task 2sBwA3Z8yWU". - In case a task transition times out, any other errors which happened at the same time (e.g. a task crashed during transition) are not omitted anymore in COG. - "nil response" in task/manager.go becomes "no response from Mesos to CONFIGURE transition request within 120s timeout", but it will not be typically printed for tasks timing out during a transition. - "nil response" in commandqueue.go becomes "did not receive neither response nor error for MesosCommand_Transition" One could consider further simplification of some of these messages, but perhaps let's see how this goes. --- core/controlcommands/commandqueue.go | 10 +++++++--- core/controlcommands/mesoscommandservent.go | 2 +- core/task/manager.go | 11 ++--------- core/task/task.go | 1 + 4 files changed, 11 insertions(+), 13 deletions(-) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index d14933ff7..0c769dec4 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -101,7 +101,7 @@ func (m *CommandQueue) Start() { } if err == nil && response == nil { log.WithField("partition", entry.cmd.GetEnvironmentId().String()). - Error("nil response") + Errorf("did not receive neither response nor error for %s", entry.cmd.GetName()) } entry.callback <- response @@ -198,6 +198,11 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon // Wait for goroutines to finish for i := 0; i < len(command.targets()); i++ { respSemaphore := <-semaphore + // for the sake of better error propagation, we treat a lack of response as a response with error, + // even though it's not technically the same. it can be surely done better, but it would require a larger refactoring. + if respSemaphore.err != nil && respSemaphore.response == nil { + respSemaphore.response = NewMesosCommandResponse(command, respSemaphore.err) + } responses[respSemaphore.receiver] = respSemaphore.response if respSemaphore.err != nil { sendErrorList = append(sendErrorList, respSemaphore.err) @@ -215,12 +220,11 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon } return }(), "\n")) - return } response = consolidateResponses(command, responses) log.WithField("partition", command.GetEnvironmentId().String()). Debug("responses consolidated, CommandQueue commit done") - return response, nil + return response, err } diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index 52708043c..2185eea2e 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -144,7 +144,7 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes // By the time we get here, ProcessResponse should have already added a Response to the // pending call, and removed it from servent.pending. case <-time.After(cmd.GetResponseTimeout()): - call.Error = fmt.Errorf("MesosCommand %s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) + call.Error = fmt.Errorf("%s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) log.WithPrefix("servent"). WithField("partition", cmd.GetEnvironmentId().String()). diff --git a/core/task/manager.go b/core/task/manager.go index d04964f2a..dcff998b2 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -754,7 +754,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { close(notify) if response == nil { - return errors.New("nil response") + return fmt.Errorf("no response from Mesos to CONFIGURE transition request within %ds timeout", int(cmd.ResponseTimeout.Seconds())) } if response.IsMultiResponse() { @@ -765,14 +765,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { task := m.GetTask(k.TaskId.Value) var taskDescription string if task != nil { - tci := task.GetTaskCommandInfo() - tciValue := "unknown command" - if tci.Value != nil { - tciValue = *tci.Value - } - - taskDescription = fmt.Sprintf("task '%s' on %s (id %s, name %s) failed with error: %s", tciValue, task.GetHostname(), task.GetTaskId(), task.GetName(), v.Error()) - + taskDescription = fmt.Sprintf("task '%s' on %s (id %s) failed with error: %s", task.GetParent().GetName(), task.GetHostname(), task.GetTaskId(), v.Error()) } else { taskDescription = fmt.Sprintf("unknown task (id %s) failed with error: %s", k.TaskId.Value, v.Error()) } diff --git a/core/task/task.go b/core/task/task.go index 89032ca2c..825dcfc6a 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -76,6 +76,7 @@ type parentRole interface { ConsolidatedVarStack() (varStack map[string]string, err error) CollectInboundChannels() []channel.Inbound SendEvent(event.Event) + GetName() string } type Traits struct { From b52f3978f85df40b9e27594b0a8b53a2641ba137 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 10 Jan 2025 14:56:08 +0100 Subject: [PATCH 2068/2352] [core] do not warn about tasks not in roster when it's expected When scheduling a task kill, we remove it from roster. Thus, when we receive a task state DONE update, there is typically nothing to warn about. OCTRL-940 --- core/task/manager.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/task/manager.go b/core/task/manager.go index dcff998b2..6e65a1cfe 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -953,9 +953,10 @@ func (m *Manager) GetTask(id string) *Task { func (m *Manager) updateTaskState(taskId string, state string) { taskPtr := m.roster.getByTaskId(taskId) - if taskPtr == nil { + if taskPtr == nil && state != "DONE" { log.WithField("taskId", taskId). WithField("state", state). + WithField(infologger.Level, infologger.IL_Support). Warn("attempted state update of task not in roster") return } From 0fe8c3f1c8c7c125991db653ade4f0dcb7997948 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 13 Jan 2025 16:56:06 +0100 Subject: [PATCH 2069/2352] [core] propagate pdp_beam_type as FairMQ property to ODC tasks needed by QC tasks OCTRL-976 --- core/integration/odc/plugin.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index ea3a7a28b..3d3aafb6d 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1229,6 +1229,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warn("could not get get variable force_run_as_raw from environment context") } + pdpBeamType, ok := varStack["pdp_beam_type"] + if ok { + arguments["pdp_beam_type"] = pdpBeamType + } else { + log.WithField("partition", envId). + WithField("call", "Configure"). + Warn("could not get get variable pdp_beam_type from environment context") + } + detectorListS, ok := varStack["detectors"] if ok { detectorsSlice, err := p.parseDetectors(detectorListS) From a69977632271eee899fc2f870c3446fc662c93f7 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 24 Jan 2025 17:18:18 +0100 Subject: [PATCH 2070/2352] [core] fix nil task access Fixes nil access issue introduced by myself in https://github.com/AliceO2Group/Control/pull/647 --- core/task/manager.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 6e65a1cfe..de705fe2e 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -953,11 +953,13 @@ func (m *Manager) GetTask(id string) *Task { func (m *Manager) updateTaskState(taskId string, state string) { taskPtr := m.roster.getByTaskId(taskId) - if taskPtr == nil && state != "DONE" { - log.WithField("taskId", taskId). - WithField("state", state). - WithField(infologger.Level, infologger.IL_Support). - Warn("attempted state update of task not in roster") + if taskPtr == nil { + if state != "DONE" { + log.WithField("taskId", taskId). + WithField("state", state). + WithField(infologger.Level, infologger.IL_Support). + Warn("attempted state update of task not in roster") + } return } From 51268539db002bfc154d429d36b837d09394f6e8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 24 Jan 2025 17:15:48 +0100 Subject: [PATCH 2071/2352] [core][executor] fine-tuning operator logs A bunch of OPS logs was moved to SUPPORT or DEVEL, while some of the OPS logs were made simpler. OCTRL-978 --- Makefile | 2 +- common/utils/utils.go | 28 ++++++++++++++++++++ core/environment/environment.go | 2 +- core/environment/manager.go | 14 +++++++++- core/environment/transition_startactivity.go | 2 ++ core/environment/transition_stopactivity.go | 6 +++++ core/integration/odc/plugin.go | 2 ++ executor/executable/basictaskcommon.go | 22 ++++++++------- executor/executable/controllabletask.go | 13 +++++---- 9 files changed, 71 insertions(+), 20 deletions(-) diff --git a/Makefile b/Makefile index 458f5c4e6..c8385ae66 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./common/gera ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment +TEST_DIRS := ./apricot/local ./common/gera ./common/utils ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs ./common/monitoring coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/common/utils/utils.go b/common/utils/utils.go index 7a0435cee..c4702ea72 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -179,3 +179,31 @@ func TruncateString(str string, length int) string { return string([]rune(str)[:length]) } + +var taskClassNameRgx = regexp.MustCompile(`(?:.*/)?([^/@]+)@`) // Captures the segment between the last '/' and '@' + +// ExtractTaskClassName extracts the task class name from the provided task name string +// For example, we extract "readout" from the following string: +// "alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows/tasks/readout@12b11ac4bb652e1835e3e94806a688c951691d5f#2sP21PjpfCQ" +func ExtractTaskClassName(taskName string) (string, error) { + + matches := taskClassNameRgx.FindStringSubmatch(taskName) + if len(matches) < 2 { + return "", fmt.Errorf("failed to extract task class name from '%s'", taskName) + } + + return matches[1], nil +} + +// TrimJitPrefix removes the JIT prefix from task class names. +// For example, "jit-ad6f2b64b7502198430d7d7f93f15bf94c088cab-qc-pp-TPC-CalibQC_long" becomes "qc-pp-TPC-CalibQC_long". +// If input does not contain a JIT prefix, it is returned as it is. +func TrimJitPrefix(taskClassName string) string { + if strings.HasPrefix(taskClassName, "jit-") { + parts := strings.SplitN(taskClassName, "-", 3) + if len(parts) > 2 { + return parts[2] + } + } + return taskClassName +} diff --git a/core/environment/environment.go b/core/environment/environment.go index eca6cd8e4..68dc56498 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1201,7 +1201,7 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { time.AfterFunc(500*time.Millisecond, func() { // wait 0.5s for any other tasks to go to ERROR/INACTIVE log.WithField("partition", env.id). WithField("level", infologger.IL_Ops). - Warn("one of the critical tasks went into ERROR state, transitioning the environment into ERROR") + Error("one of the critical tasks went into ERROR state, transitioning the environment into ERROR") err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { if env.Sm.Current() == "ERROR" { diff --git a/core/environment/manager.go b/core/environment/manager.go index ced832149..3a928e179 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -892,6 +892,10 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error WorkflowTemplateInfo: env.GetWorkflowInfo(), }) + log.WithFields(logrus.Fields{ + "partition": environmentId.String(), + infologger.Level: infologger.IL_Ops, + }).Info("environment teardown complete") return err } @@ -935,7 +939,7 @@ func (envs *Manager) Environment(environmentId uid.ID) (env *Environment, err er func (envs *Manager) environment(environmentId uid.ID) (env *Environment, err error) { if len(environmentId) == 0 { // invalid id - return nil, fmt.Errorf("invalid id: %s", environmentId) + return nil, fmt.Errorf("empty env ID") } envs.mu.RLock() defer envs.mu.RUnlock() @@ -1050,6 +1054,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { env, err := envs.environment(t.GetEnvironmentId()) if err != nil { log.WithPrefix("scheduler"). + WithField(infologger.Level, infologger.IL_Devel). WithError(err). Error("cannot find environment for DeviceEvent") } @@ -1060,11 +1065,13 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } else { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField(infologger.Level, infologger.IL_Devel). Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") } } else { log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField(infologger.Level, infologger.IL_Devel). Debug("cannot find task for DeviceEvent BASIC_TASK_TERMINATED") } @@ -1084,6 +1091,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("taskId", taskId.Value). + WithField(infologger.Level, infologger.IL_Devel). Debug("cannot find task for DeviceEvent END_OF_STREAM") return } @@ -1092,12 +1100,14 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("taskId", taskId.Value). + WithField(infologger.Level, infologger.IL_Devel). WithError(err). Error("cannot find environment for DeviceEvent") } else { log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("taskId", taskId.Value). + WithField("role", t.GetParent().GetName()). WithField("envState", env.CurrentState()). Debug("received END_OF_STREAM event from task, trying to stop the run") if env.CurrentState() == "RUNNING" { @@ -1132,6 +1142,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("taskId", taskId.Value). + WithField(infologger.Level, infologger.IL_Devel). WithError(err). Error("cannot find environment for DeviceEvent") } else { @@ -1140,6 +1151,7 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { WithField("taskId", taskId.Value). WithField("taskRole", t.GetParentRolePath()). WithField("envState", env.CurrentState()). + WithField(infologger.Level, infologger.IL_Support). Debug("received TASK_INTERNAL_ERROR event from task, trying to stop the run") if env.CurrentState() == "RUNNING" { go func() { diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index f81ae825f..2af850a3f 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -60,6 +60,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, runNumber). WithField("partition", env.Id().String()). + WithField(infologger.Level, infologger.IL_Support). Info("starting new run") cleanupCount := 0 @@ -123,6 +124,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber). WithField("partition", env.Id().String()). + WithField(infologger.Level, infologger.IL_Support). Info("run started") env.sendEnvironmentEvent(&event.EnvironmentEvent{ EnvironmentID: env.Id().String(), diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index bbf733eca..1533c68fe 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -56,6 +56,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { log.WithField(infologger.Run, env.currentRunNumber). WithField("partition", env.Id().String()). + WithField(infologger.Level, infologger.IL_Support). Info("stopping run") args := controlcommands.PropertyMap{} @@ -89,5 +90,10 @@ func (t StopActivityTransition) do(env *Environment) (err error) { } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) + log.WithField(infologger.Run, env.currentRunNumber). + WithField("partition", env.Id().String()). + WithField(infologger.Level, infologger.IL_Support). + Info("run stopped") + return } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 3d3aafb6d..55b0a22ad 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1157,6 +1157,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { log.WithField("partition", envId). WithField("call", "PartitionInitialize"). + WithField(infologger.Level, infologger.IL_Support). Info("odc_extract_topology_resources is set to true, plugin and resources will not be included in the ODC Run request") } @@ -1264,6 +1265,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("partition", envId). WithField("call", "Configure"). WithField("runType", runType). + WithField(infologger.Level, infologger.IL_Support). Infof("overriding run start time (orbit-reset-time) to %s for SYNTHETIC run", pdpOverrideRunStartTime) } else { log.WithField("partition", envId). diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 3302779e7..166270962 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -28,6 +28,7 @@ import ( "bytes" "encoding/json" "errors" + "github.com/AliceO2Group/Control/common/utils" "io" "os/exec" "syscall" @@ -178,19 +179,20 @@ func (t *basicTaskBase) startBasicTask() (err error) { } if err != nil { + taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("level", infologger.IL_Ops). + Errorf("task '%s' terminated with error: %s", taskClassName, err.Error()) log.WithField("partition", t.knownEnvironmentId.String()). WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "level": infologger.IL_Devel, + "id": t.ti.TaskID.Value, + "task": t.ti.Name, + "command": tciCommandStr, + "error": err.Error(), + "level": infologger.IL_Devel, }). - Error("task terminated with error") - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("level", infologger.IL_Ops). - Errorf("task terminated with error: %s %s", - tciCommandStr, - err.Error()) + Error("task terminated with error (details)") pendingState = mesos.TASK_FAILED } diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index a4cf5b34b..e45256bdc 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -573,6 +573,11 @@ func (t *ControllableTask) Launch() error { pendingState := mesos.TASK_FINISHED if err != nil { + taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) + log.WithField("partition", t.knownEnvironmentId.String()). + WithField("detector", t.knownDetector). + WithField("level", infologger.IL_Ops). + Errorf("task '%s' terminated with error: %s", utils.TrimJitPrefix(taskClassName), err.Error()) log.WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). WithFields(logrus.Fields{ @@ -582,13 +587,7 @@ func (t *ControllableTask) Launch() error { "error": err.Error(), "level": infologger.IL_Devel, }). - Error("task terminated with error") - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("level", infologger.IL_Ops). - Errorf("task terminated with error: %s %s", - truncatedCmd, - err.Error()) + Error("task terminated with error (details):") pendingState = mesos.TASK_FAILED } From 61259bb356e7acce4164cf8db56afa60c631227e Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Thu, 13 Feb 2025 12:55:13 +0100 Subject: [PATCH 2072/2352] [build] Bump to v1.27.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index a923312b2..7acfdee23 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 26 +VERSION_MINOR := 27 VERSION_PATCH := 0 From 56e07f5ff8db060cfe7c6b499f5eec02d27f6732 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Fri, 21 Feb 2025 16:30:41 +0100 Subject: [PATCH 2073/2352] [core] Support partial DCS PFR if some detectors not ready for PFR --- core/integration/dcs/plugin.go | 81 ++++++++++++++++------------ core/integration/dcs/structs.go | 23 +++++--- core/integration/dcs/structs_test.go | 2 +- 3 files changed, 65 insertions(+), 41 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index ee951dca6..122ecb886 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021-2024 CERN and copyright holders of ALICE O². + * Copyright 2021-2025 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -33,6 +33,7 @@ import ( "fmt" "io" "net/url" + "sort" "strconv" "strings" "sync" @@ -438,8 +439,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // We acquire a grace period during which we hope that DCS will become compatible with the operation. - // During this period we'll keep checking our internal state for op compatibility as reported by DCS at 1Hz, - // and if we don't get a compatible state within the grace period, we declare the operation failed. + // During this period we'll keep checking our internal state for op compatibility as reported by DCS + // at 1Hz, and if we don't get a compatible state for all included detectors within the grace period, + // we go ahead with a partial PFR. pfrGracePeriod := time.Duration(0) pfrGracePeriodS, ok := varStack["dcs_pfr_grace_period"] if ok { @@ -476,8 +478,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { pfrGraceTimeout := time.Now().Add(pfrGracePeriod) isCompatibleWithOperation := false + var dcsDetectorsCompatibleWithPfr, dcsDetectorsIncompatibleWithPfr DCSDetectors + knownDetectorStates := p.getDetectorsPfrAvailability(dcsDetectors) - isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + isCompatibleWithOperation, dcsDetectorsCompatibleWithPfr, dcsDetectorsIncompatibleWithPfr, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) for { if isCompatibleWithOperation { @@ -494,34 +498,39 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if time.Now().Before(pfrGraceTimeout) { knownDetectorStates = p.getDetectorsPfrAvailability(dcsDetectors) - isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) + isCompatibleWithOperation, dcsDetectorsCompatibleWithPfr, dcsDetectorsIncompatibleWithPfr, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_PFR_AVAILABLE) } else { break } } - if !isCompatibleWithOperation { - log.WithError(err). - WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). - Error("DCS error") + ecsDetectorsIncompatibleWithPfr := dcsDetectorsIncompatibleWithPfr.EcsDetectorsSlice() + sort.Strings(ecsDetectorsIncompatibleWithPfr) - call.VarStack["__call_error_reason"] = err.Error() - call.VarStack["__call_error"] = callFailedStr + if !isCompatibleWithOperation { // some detectors are not ready for PFR + if len(dcsDetectorsCompatibleWithPfr) == 0 { // if actually none are ready, we bail + log.WithError(err). + WithField("level", infologger.IL_Ops). + WithField("partition", envId). + WithField("call", "PrepareForRun"). + Error("DCS error") - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, - OperationStep: "acquire detectors availability", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr - return + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStep: "acquire detectors availability", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJson[:]), + Error: err.Error(), + }) + + return + } } else if isCompatibleWithOperation && err != nil { log.WithField("level", infologger.IL_Ops). WithField("partition", envId). @@ -542,11 +551,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Payload: string(payloadJson[:]), }) - // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation + // By now the DCS must be in a compatible state for at least some detectors, so we proceed + // with gathering params for the operation + if len(ecsDetectorsIncompatibleWithPfr) > 0 { + log.WithField("partition", envId). + WithField("level", infologger.IL_Ops). + Warnf("skipping DCS PFR for detectors: %s - a detector state compatible with PFR was not reached within %s", strings.Join(ecsDetectorsIncompatibleWithPfr, " "), pfrGracePeriod) + } log.WithField("partition", envId). WithField("level", infologger.IL_Ops). - Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) + Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectorsCompatibleWithPfr.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] if !ok { @@ -560,7 +575,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { bytes := []byte(parameters) err = json.Unmarshal(bytes, &argMap) if err != nil { - err = fmt.Errorf("error processing DCS SOR parameters: %w", err) + err = fmt.Errorf("error processing DCS PFR parameters: %w", err) log.WithError(err). WithField("partition", envId). WithField("level", infologger.IL_Ops). @@ -595,9 +610,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { in := dcspb.PfrRequest{ RunType: rt, PartitionId: envId, - Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectors)), + Detectors: make([]*dcspb.DetectorOperationRequest, len(dcsDetectorsCompatibleWithPfr)), } - for i, dcsDet := range dcsDetectors { + for i, dcsDet := range dcsDetectorsCompatibleWithPfr { ecsDet := dcsToEcsDetector(dcsDet) perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] if !okParam { @@ -693,7 +708,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { defer cancel() detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) - for _, v := range dcsDetectors { + for _, v := range dcsDetectorsCompatibleWithPfr { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } @@ -1044,7 +1059,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true - for _, v := range dcsDetectors { + for _, v := range dcsDetectorsCompatibleWithPfr { if detectorStatusMap[v] != dcspb.DetectorState_RUN_OK { dcsopOk = false dcsFailedEcsDetectors = append(dcsFailedEcsDetectors, dcsToEcsDetector(v)) @@ -1173,7 +1188,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { isCompatibleWithOperation := false knownDetectorStates := p.getDetectorsSorAvailability(dcsDetectors) - isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + isCompatibleWithOperation, _, _, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) for { if isCompatibleWithOperation { @@ -1190,7 +1205,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if time.Now().Before(sorGraceTimeout) { knownDetectorStates = p.getDetectorsSorAvailability(dcsDetectors) - isCompatibleWithOperation, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) + isCompatibleWithOperation, _, _, err = knownDetectorStates.compatibleWithDCSOperation(dcspb.DetectorState_SOR_AVAILABLE) } else { break } diff --git a/core/integration/dcs/structs.go b/core/integration/dcs/structs.go index 5a98d68a3..6455168f8 100644 --- a/core/integration/dcs/structs.go +++ b/core/integration/dcs/structs.go @@ -1,7 +1,7 @@ /* * === This file is part of ALICE O² === * - * Copyright 2021-2024 CERN and copyright holders of ALICE O². + * Copyright 2021-2025 CERN and copyright holders of ALICE O². * Author: Teo Mrnjavac * * This program is free software: you can redistribute it and/or modify @@ -102,11 +102,11 @@ func (dsm DCSDetectorOpAvailabilityMap) makeDetectorsByStateMap() map[dcspb.Dete } // Returns true if the provided detectors are either all in conditionState or in NULL_STATE -func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (bool, error) { +func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionState dcspb.DetectorState) (isCompatible bool, detectorsCompatible DCSDetectors, detectorsIncompatible DCSDetectors, err error) { detectorsByState := dsm.makeDetectorsByStateMap() if len(detectorsByState) == 0 { - return true, fmt.Errorf("no detectors provided") + return true, make(DCSDetectors, 0), make(DCSDetectors, 0), fmt.Errorf("no detectors provided") } detectorsInConditionState, thereAreDetectorsInConditionState := detectorsByState[conditionState] @@ -114,24 +114,33 @@ func (dsm DCSDetectorOpAvailabilityMap) compatibleWithDCSOperation(conditionStat if thereAreDetectorsInConditionState && (len(detectorsInConditionState) == len(dsm)) { // all detectors are in conditionState - return true, nil + return true, detectorsInConditionState, make(DCSDetectors, 0), nil } else if thereAreDetectorsInConditionState && thereAreDetectorsInNullState && (len(detectorsInConditionState)+len(detectorsInNullState) == len(dsm)) { // all detectors are either in conditionState or in NULL_STATE - return true, fmt.Errorf("detectors %s are in NULL_STATE", strings.Join(detectorsByState[dcspb.DetectorState_NULL_STATE].ToStringSlice(), ", ")) + detectorsCompatible = append(detectorsInConditionState, detectorsInNullState...) + return true, detectorsCompatible, make(DCSDetectors, 0), fmt.Errorf("detectors %s are in NULL_STATE", strings.Join(detectorsByState[dcspb.DetectorState_NULL_STATE].ToStringSlice(), ", ")) } else if thereAreDetectorsInNullState && (len(detectorsInNullState) == len(dsm)) { // all detectors are in NULL_STATE - return true, fmt.Errorf("all detectors are in NULL_STATE") + return true, detectorsInNullState, make(DCSDetectors, 0), fmt.Errorf("all detectors are in NULL_STATE") } else { // there are detectors in other states incompatible with conditionState reportByState := make([]string, 0) + detectorsCompatible = make(DCSDetectors, 0) + detectorsIncompatible = make(DCSDetectors, 0) for state, detectors := range detectorsByState { if state == conditionState { + detectorsCompatible = append(detectorsCompatible, detectors...) continue } + if state == dcspb.DetectorState_NULL_STATE { + detectorsCompatible = append(detectorsCompatible, detectors...) + } else { + detectorsIncompatible = append(detectorsIncompatible, detectors...) + } reportByState = append(reportByState, fmt.Sprintf("%s in %s", strings.Join(detectors.ToStringSlice(), ", "), state.String())) } - return false, fmt.Errorf("detectors are in incompatible states: %v", strings.Join(reportByState, "; ")) + return false, detectorsCompatible, detectorsIncompatible, fmt.Errorf("detectors are in incompatible states: %v", strings.Join(reportByState, "; ")) } } diff --git a/core/integration/dcs/structs_test.go b/core/integration/dcs/structs_test.go index 3843d7121..066160b22 100644 --- a/core/integration/dcs/structs_test.go +++ b/core/integration/dcs/structs_test.go @@ -175,7 +175,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := tt.dsm.compatibleWithDCSOperation(tt.args.conditionState) + got, _, _, err := tt.dsm.compatibleWithDCSOperation(tt.args.conditionState) if (err != nil) != tt.wantErr { t.Errorf("compatibleWithDCSOperation() error = %v, wantErr %v", err, tt.wantErr) return From c3bf6a2c3bc7e6f21066e11c8308e2204bdaaaf9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 24 Feb 2025 14:44:59 +0100 Subject: [PATCH 2074/2352] [apricot] consequently return Go data structures in Service This aligns methods offered by Service to return []string instead of JSON string or space-separated values in a string, making it easier to handle internally. Translation to any particular format, be it JSON, is performed by the API code. --- apricot/cacheproxy/service.go | 4 ++-- apricot/local/service.go | 24 ++++++++++-------------- apricot/remote/server.go | 13 +++++++++++-- apricot/remote/service.go | 22 ++++++++++++++++------ configuration/service.go | 4 ++-- configuration/template/fields.go | 4 ++-- configuration/template/stackutil.go | 13 +++++++++---- 7 files changed, 52 insertions(+), 32 deletions(-) diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index 99cfd4bdc..2d471e6da 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -133,11 +133,11 @@ func (s Service) GetDetectorsForHosts(hosts []string) ([]string, error) { return detList, nil } -func (s Service) GetCRUCardsForHost(hostname string) (string, error) { +func (s Service) GetCRUCardsForHost(hostname string) ([]string, error) { return s.base.GetCRUCardsForHost(hostname) } -func (s Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { +func (s Service) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) { return s.base.GetEndpointsForCRUCard(hostname, cardSerial) } diff --git a/apricot/local/service.go b/apricot/local/service.go index 11af8add2..5e1d8d89f 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -393,7 +393,7 @@ func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { return detectorSlice, nil } -func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { +func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { s.logMethod() if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { @@ -401,7 +401,7 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { var serials []string cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) if err != nil { - return "", err + return nil, err } json.Unmarshal([]byte(cfgCards), &cards) unique := make(map[string]bool) @@ -411,17 +411,13 @@ func (s *Service) GetCRUCardsForHost(hostname string) (string, error) { serials = append(serials, card.Serial) } } - bytes, err := json.Marshal(serials) - if err != nil { - return "", err - } - return string(bytes), nil + return serials, nil } else { - return "", errors.New("runtime KV not supported with file backend") + return nil, errors.New("runtime KV not supported with file backend") } } -func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) { +func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) { s.logMethod() log.WithPrefix("rpcserver"). @@ -433,23 +429,23 @@ func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) (string, e if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { var cards map[string]Card - var endpoints string + var endpoints []string cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) if err != nil { - return "", err + return nil, err } err = json.Unmarshal([]byte(cfgCards), &cards) if err != nil { - return "", err + return nil, err } for _, card := range cards { if card.Serial == cardSerial { - endpoints = endpoints + card.Endpoint + " " + endpoints = append(endpoints, card.Endpoint) } } return endpoints, nil } else { - return "", errors.New("runtime KV not supported with file backend") + return nil, errors.New("runtime KV not supported with file backend") } } diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 35d5c844a..0936d83bf 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -27,7 +27,9 @@ package remote import ( "context" + "encoding/json" "runtime" + "strings" apricotpb "github.com/AliceO2Group/Control/apricot/protos" "github.com/AliceO2Group/Control/common/logger" @@ -253,7 +255,12 @@ func (m *RpcServer) GetCRUCardsForHost(_ context.Context, request *apricotpb.Hos if err != nil { return nil, err } - return &apricotpb.CRUCardsResponse{Cards: cards}, E_OK.Err() + cardsJson, err := json.Marshal(cards) + if err != nil { + return nil, err + } + + return &apricotpb.CRUCardsResponse{Cards: string(cardsJson)}, E_OK.Err() } func (m *RpcServer) GetEndpointsForCRUCard(_ context.Context, request *apricotpb.CardRequest) (*apricotpb.CRUCardEndpointResponse, error) { @@ -269,7 +276,9 @@ func (m *RpcServer) GetEndpointsForCRUCard(_ context.Context, request *apricotpb if err != nil { return nil, err } - return &apricotpb.CRUCardEndpointResponse{Endpoints: endpoints}, E_OK.Err() + endpointsSpaceSeparated := strings.Join(endpoints, " ") + + return &apricotpb.CRUCardEndpointResponse{Endpoints: endpointsSpaceSeparated}, E_OK.Err() } func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 3bfb2662c..1c6c42b0e 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -26,9 +26,11 @@ package remote import ( "context" + "encoding/json" "errors" "fmt" "net/url" + "strings" "time" apricotpb "github.com/AliceO2Group/Control/apricot/protos" @@ -199,19 +201,25 @@ func (c *RemoteService) GetDetectorsForHosts(hosts []string) (payload []string, } -func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards string, err error) { +func (c *RemoteService) GetCRUCardsForHost(hostname string) (cards []string, err error) { var response *apricotpb.CRUCardsResponse request := &apricotpb.HostRequest{ Hostname: hostname, } response, err = c.cli.GetCRUCardsForHost(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { - return "", err + return nil, err + } + cardsStr := response.GetCards() + err = json.Unmarshal([]byte(cardsStr), &cards) + if err != nil { + return nil, err } - return response.GetCards(), nil + + return cards, nil } -func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (cards string, err error) { +func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (endpoints []string, err error) { var response *apricotpb.CRUCardEndpointResponse request := &apricotpb.CardRequest{ Hostname: hostname, @@ -219,9 +227,11 @@ func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (car } response, err = c.cli.GetEndpointsForCRUCard(context.Background(), request, grpc.EmptyCallOption{}) if err != nil { - return "", err + return nil, err } - return response.GetEndpoints(), nil + endpointsStr := response.GetEndpoints() + endpoints = strings.Split(endpointsStr, " ") + return endpoints, nil } func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { diff --git a/configuration/service.go b/configuration/service.go index bfd6d6e09..0c3bfa0df 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -57,8 +57,8 @@ type Service interface { GetDetectorForHost(hostname string) (string, error) GetDetectorsForHosts(hosts []string) ([]string, error) - GetCRUCardsForHost(hostname string) (string, error) - GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) + GetCRUCardsForHost(hostname string) ([]string, error) + GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) RawGetRecursive(path string) (string, error) } diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 169b8369d..a10a99c30 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -71,8 +71,8 @@ type ConfigurationService interface { GetDetectorForHost(hostname string) (string, error) GetDetectorsForHosts(hosts []string) ([]string, error) - GetCRUCardsForHost(hostname string) (string, error) - GetEndpointsForCRUCard(hostname, cardSerial string) (string, error) + GetCRUCardsForHost(hostname string) ([]string, error) + GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) GetRuntimeEntry(component string, key string) (string, error) SetRuntimeEntry(component string, key string, value string) error diff --git a/configuration/template/stackutil.go b/configuration/template/stackutil.go index 44ce4a29a..ced41e5f0 100644 --- a/configuration/template/stackutil.go +++ b/configuration/template/stackutil.go @@ -28,6 +28,7 @@ import ( "encoding/json" "fmt" "github.com/AliceO2Group/Control/common/logger/infologger" + "strings" texttemplate "text/template" "time" @@ -136,20 +137,24 @@ func detectorsForHosts(confSvc ConfigurationService, hosts string) string { func cruCardsForHost(confSvc ConfigurationService, hostname string) string { defer utils.TimeTrack(time.Now(), "CRUCardsForHost", log.WithPrefix("template")) - payload, err := confSvc.GetCRUCardsForHost(hostname) + cards, err := confSvc.GetCRUCardsForHost(hostname) if err != nil { return fmt.Sprintf("[\"error: %s\"]", err.Error()) } - return payload + cardsJson, err := json.Marshal(cards) + if err != nil { + return fmt.Sprintf("[\"error: %s\"]", err.Error()) + } + return string(cardsJson) } func endpointsForCruCard(confSvc ConfigurationService, hostname string, cardSerial string) string { defer utils.TimeTrack(time.Now(), "EndpointsForCRUCard", log.WithPrefix("template")) - payload, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) + endpoints, err := confSvc.GetEndpointsForCRUCard(hostname, cardSerial) if err != nil { return fmt.Sprintf("{\"error\":\"%s\"}", err.Error()) } - return payload + return strings.Join(endpoints, " ") } func getRuntimeConfig(confSvc ConfigurationService, component string, key string) string { From 34b1916df0bb8a334af2bc71731a6ae864f85451 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 24 Feb 2025 15:39:25 +0100 Subject: [PATCH 2075/2352] [apricot] YAML backend support for GetHost/CRU/Endpoint methods + tests --- apricot/local/service.go | 88 +++++++++++++----------------- apricot/local/service_test.go | 95 +++++++++++++++++++++++++++++++-- apricot/local/service_test.yaml | 7 ++- 3 files changed, 135 insertions(+), 55 deletions(-) diff --git a/apricot/local/service.go b/apricot/local/service.go index 5e1d8d89f..28c108f36 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -351,24 +351,20 @@ func (s *Service) RawGetRecursive(path string) (string, error) { func (s *Service) GetDetectorForHost(hostname string) (string, error) { s.logMethod() - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - keys, err := cSrc.GetKeysByPrefix(filepath.Join("o2/hardware", "detectors")) - if err != nil { - return "", err - } - for _, key := range keys { - // key example: o2/hardware/detectors/TST/flps/some-hostname/ - splitKey := strings.Split(key, "/") - if len(splitKey) == 7 { - if splitKey[5] == hostname { - return splitKey[3], nil - } + keys, err := s.src.GetKeysByPrefix(filepath.Join("o2/hardware", "detectors")) + if err != nil { + return "", err + } + for _, key := range keys { + // key example: o2/hardware/detectors/TST/flps/some-hostname/ + splitKey := strings.Split(key, "/") + if len(splitKey) == 7 { + if splitKey[5] == hostname { + return splitKey[3], nil } } - return "", fmt.Errorf("detector not found for host %s", hostname) - } else { - return "", errors.New("runtime KV not supported with file backend") } + return "", fmt.Errorf("detector not found for host %s", hostname) } func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { @@ -396,25 +392,21 @@ func (s *Service) GetDetectorsForHosts(hosts []string) ([]string, error) { func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { s.logMethod() - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - var cards map[string]Card - var serials []string - cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) - if err != nil { - return nil, err - } - json.Unmarshal([]byte(cfgCards), &cards) - unique := make(map[string]bool) - for _, card := range cards { - if _, value := unique[card.Serial]; !value { - unique[card.Serial] = true - serials = append(serials, card.Serial) - } + var cards map[string]Card + var serials []string + cfgCards, err := s.src.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) + if err != nil { + return nil, err + } + json.Unmarshal([]byte(cfgCards), &cards) + unique := make(map[string]bool) + for _, card := range cards { + if _, value := unique[card.Serial]; !value { + unique[card.Serial] = true + serials = append(serials, card.Serial) } - return serials, nil - } else { - return nil, errors.New("runtime KV not supported with file backend") } + return serials, nil } func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) { @@ -427,26 +419,22 @@ func (s *Service) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, WithField("cardSerial", cardSerial). Debug("getting endpoints") - if cSrc, ok := s.src.(*cfgbackend.ConsulSource); ok { - var cards map[string]Card - var endpoints []string - cfgCards, err := cSrc.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) - if err != nil { - return nil, err - } - err = json.Unmarshal([]byte(cfgCards), &cards) - if err != nil { - return nil, err - } - for _, card := range cards { - if card.Serial == cardSerial { - endpoints = append(endpoints, card.Endpoint) - } + var cards map[string]Card + var endpoints []string + cfgCards, err := s.src.Get(filepath.Join("o2/hardware", "flps", hostname, "cards")) + if err != nil { + return nil, err + } + err = json.Unmarshal([]byte(cfgCards), &cards) + if err != nil { + return nil, err + } + for _, card := range cards { + if card.Serial == cardSerial { + endpoints = append(endpoints, card.Endpoint) } - return endpoints, nil - } else { - return nil, errors.New("runtime KV not supported with file backend") } + return endpoints, nil } func (s *Service) GetRuntimeEntry(component string, key string) (string, error) { diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go index 0cf86a89e..3e9a6fa5b 100644 --- a/apricot/local/service_test.go +++ b/apricot/local/service_test.go @@ -392,11 +392,98 @@ var _ = Describe("local service", func() { }) + Describe("getting detector for host", func() { + var ( + detector string + err error + ) + When("retrieving the detector for a host", func() { + It("should return the correct detector", func() { + detector, err = svc.GetDetectorForHost("flp001") + Expect(err).NotTo(HaveOccurred()) + Expect(detector).To(Equal("ABC")) + }) + }) + When("retrieving the detector for a non-existing host", func() { + It("should produce an error", func() { + detector, err = svc.GetDetectorForHost("NOPE") + Expect(err).To(HaveOccurred()) + }) + }) + }) + Describe("getting detectors for hosts", func() { + var ( + detectors []string + err error + ) + When("retrieving the detectors for a list of hosts", func() { + It("should return the correct detectors", func() { + detectors, err = svc.GetDetectorsForHosts([]string{"flp001", "flp002"}) + Expect(err).NotTo(HaveOccurred()) + Expect(detectors).To(ContainElements("ABC", "DEF")) + }) + }) + When("retrieving the detectors for a non-existing host", func() { + It("should produce an error", func() { + detectors, err = svc.GetDetectorsForHosts([]string{"NOPE"}) + Expect(err).To(HaveOccurred()) + }) + }) + When("retrieving the detectors for a list of hosts with a non-existing host", func() { + It("should produce an error", func() { + detectors, err = svc.GetDetectorsForHosts([]string{"flp001", "NOPE"}) + Expect(err).To(HaveOccurred()) + }) + }) + }) + Describe("getting CRU cards for a host", func() { + var ( + cards []string + err error + ) + When("retrieving the CRU cards for a host", func() { + It("should return the correct CRU cards", func() { + cards, err = svc.GetCRUCardsForHost("flp001") + Expect(err).NotTo(HaveOccurred()) + Expect(cards).To(ContainElements("0228", "0229")) + }) + }) + When("retrieving the CRU cards for a non-existing host", func() { + It("should produce an error", func() { + cards, err = svc.GetCRUCardsForHost("NOPE") + Expect(err).To(HaveOccurred()) + }) + }) + }) + Describe("getting endpoints for a CRU card", func() { + var ( + endpoints []string + err error + ) + When("retrieving the endpoints for a CRU card", func() { + It("should return the correct endpoints", func() { + endpoints, err = svc.GetEndpointsForCRUCard("flp001", "0228") + Expect(err).NotTo(HaveOccurred()) + Expect(endpoints).To(ContainElements("0", "1")) + }) + }) + When("retrieving the endpoints for a non-existing host", func() { + It("should produce an error", func() { + endpoints, err = svc.GetEndpointsForCRUCard("NOPE", "0228") + Expect(err).To(HaveOccurred()) + }) + }) + When("retrieving the endpoints for a non-existing CRU card", func() { + // fixme: probably incorrect behaviour, but I don't want to risk breaking something + It("should not return an empty slice", func() { + endpoints, err = svc.GetEndpointsForCRUCard("flp001", "NOPE") + Expect(endpoints).To(BeEmpty()) + Expect(err).NotTo(HaveOccurred()) + }) + }) + }) + // TODO: - // GetDetectorForHost (currently not supporting yaml backend) - // GetDetectorsForHosts (currently not supporting yaml backend) - // GetCRUCardsForHost (currently not supporting yaml backend) - // GetEndpointsForCRUCard (currently not supporting yaml backend) // GetRuntimeEntry (currently not supporting yaml backend) // SetRuntimeEntry (currently not supporting yaml backend) // GetRuntimeEntries (currently not supporting yaml backend) diff --git a/apricot/local/service_test.yaml b/apricot/local/service_test.yaml index 2039aeb99..cca28db8e 100644 --- a/apricot/local/service_test.yaml +++ b/apricot/local/service_test.yaml @@ -44,7 +44,12 @@ o2: flps: {} flps: flp001: - cards: "{ \"key\" : \"value\" }" + cards: "{ + \"0\": {\"serial\": \"0228\", \"endpoint\": \"0\"}, + \"1\": {\"serial\": \"0229\", \"endpoint\": \"0\"}, + \"2\": {\"serial\": \"0228\", \"endpoint\": \"1\"}, + \"3\": {\"serial\": \"0229\", \"endpoint\": \"1\"} + }" flp002: cards: "{ \"key\" : \"value\" }" flp003: From c71657a2f3835ef5a380975422a99c8087759e6d Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 24 Feb 2025 15:53:56 +0100 Subject: [PATCH 2076/2352] [configuration] extend template test package, incl. utility and inventory functions --- common/gera/map.go | 3 + configuration/template/dplutil.go | 2 +- configuration/template/dplutil_test.go | 8 + configuration/template/fieldwrappers.go | 19 ++ configuration/template/fieldwrappers_test.go | 78 +++++++ configuration/template/stack_test.go | 216 +++++++++++++++++++ configuration/template/stack_test.yaml | 58 +++++ configuration/template/template_test.go | 34 ++- core/workflow/aggregatorrole_test.go | 17 +- 9 files changed, 425 insertions(+), 10 deletions(-) create mode 100644 configuration/template/fieldwrappers_test.go create mode 100644 configuration/template/stack_test.go create mode 100644 configuration/template/stack_test.yaml diff --git a/common/gera/map.go b/common/gera/map.go index 1cb7d3661..10084265a 100644 --- a/common/gera/map.go +++ b/common/gera/map.go @@ -51,7 +51,10 @@ type Map[K comparable, V any] interface { Set(key K, value V) bool Del(key K) bool + // Flattened should return a flat representation of the tree in the root direction, + // where children kv pairs overwrite parent kv pairs. Flattened() (map[K]V, error) + // FlattenedParent should return a flat representation of the tree in the root direction, FlattenedParent() (map[K]V, error) WrappedAndFlattened(m Map[K, V]) (map[K]V, error) diff --git a/configuration/template/dplutil.go b/configuration/template/dplutil.go index efdf4ef5b..e6bd0ceec 100644 --- a/configuration/template/dplutil.go +++ b/configuration/template/dplutil.go @@ -47,7 +47,7 @@ func extractConfigURIs(dplCommand string) (uris []string) { // Match any consul/apricot URI // it would be the easiest to use a backreference in the regex, but regexp does not support those: // (['"]?)((consul-json|apricot)://[^ |\n]*)(\1) - re := regexp.MustCompile(`['"]?(consul-json|apricot)://[^ |\n]*`) + re := regexp.MustCompile(`['"]?(consul-json|apricot)://[^ |\n]+`) matches := re.FindAllStringSubmatch(dplCommand, nMaxExpectedQcPayloads) for _, match := range matches { diff --git a/configuration/template/dplutil_test.go b/configuration/template/dplutil_test.go index 0ab4f833a..47511dc59 100644 --- a/configuration/template/dplutil_test.go +++ b/configuration/template/dplutil_test.go @@ -16,6 +16,14 @@ var _ = Describe("DPL utilities", func() { Expect(uris).To(HaveLen(0)) }) }) + When("URI is not complete", func() { + BeforeEach(func() { + uris = extractConfigURIs("myexe --config apricot://") + }) + It("should return an empty slice", func() { + Expect(uris).To(HaveLen(0)) + }) + }) When("the URI is the last argument", func() { BeforeEach(func() { uris = extractConfigURIs("myexe --config apricot://host.cern.ch:12345/components/qc/ANY/any/ctp-raw") diff --git a/configuration/template/fieldwrappers.go b/configuration/template/fieldwrappers.go index 8e8fff4af..3b79c9574 100644 --- a/configuration/template/fieldwrappers.go +++ b/configuration/template/fieldwrappers.go @@ -67,6 +67,15 @@ func WrapGeneric(getterF GetterFunc, setterF SetterFunc) Field { } } +// WrapMapItems creates a slice of Fields from a map of string key-value pairs. +// It wraps each map item in a GenericWrapper, allowing for dynamic access and +// modification of the original map's values through the Fields interface. +// +// Parameters: +// - items: A map[string]string to be wrapped +// +// Returns: +// - Fields: A slice of Field interfaces, each corresponding to a map item func WrapMapItems(items map[string]string) Fields { fields := make(Fields, 0) for k := range items { @@ -83,6 +92,16 @@ func WrapMapItems(items map[string]string) Fields { return fields } +// WrapSliceItems creates a slice of Fields from a slice of strings. +// It wraps each string item in a GenericWrapper, allowing for dynamic +// access and modification of the original slice's elements through +// the Fields interface. +// +// Parameters: +// - items: A []string to be wrapped +// +// Returns: +// - Fields: A slice of Field interfaces, each corresponding to a slice item func WrapSliceItems(items []string) Fields { fields := make(Fields, 0) for i := range items { diff --git a/configuration/template/fieldwrappers_test.go b/configuration/template/fieldwrappers_test.go new file mode 100644 index 000000000..ed20b7d0d --- /dev/null +++ b/configuration/template/fieldwrappers_test.go @@ -0,0 +1,78 @@ +package template_test + +import ( + "github.com/AliceO2Group/Control/configuration/template" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("Field Wrappers", func() { + Describe("PointerWrapper", func() { + It("should get and set values correctly", func() { + value := "test" + pw := template.WrapPointer(&value) + + Expect(pw.Get()).To(Equal("test")) + + pw.Set("new value") + Expect(value).To(Equal("new value")) + }) + }) + + Describe("GenericWrapper", func() { + It("should get and set values correctly", func() { + value := "test" + gw := template.WrapGeneric( + func() string { return value }, + func(v string) { value = v }, + ) + + Expect(gw.Get()).To(Equal("test")) + + gw.Set("new value") + Expect(value).To(Equal("new value")) + }) + }) + + Describe("WrapMapItems", func() { + It("should wrap map items correctly", func() { + items := map[string]string{ + "key1": "value1", + "key2": "value2", + } + fields := template.WrapMapItems(items) + + Expect(fields).To(HaveLen(2)) + + for _, field := range fields { + initialValue := field.Get() + field.Set("new " + initialValue) + } + + expectedItems := map[string]string{ + "key1": "new value1", + "key2": "new value2", + } + + Expect(items).To(Equal(expectedItems)) + }) + }) + + Describe("WrapSliceItems", func() { + It("should wrap slice items correctly", func() { + items := []string{"item1", "item2", "item3"} + fields := template.WrapSliceItems(items) + + Expect(fields).To(HaveLen(3)) + + for i, field := range fields { + Expect(field.Get()).To(Equal(items[i])) + field.Set("new " + items[i]) + } + + expectedItems := []string{"new item1", "new item2", "new item3"} + + Expect(items).To(Equal(expectedItems)) + }) + }) +}) diff --git a/configuration/template/stack_test.go b/configuration/template/stack_test.go new file mode 100644 index 000000000..8348f4fe5 --- /dev/null +++ b/configuration/template/stack_test.go @@ -0,0 +1,216 @@ +package template_test + +import ( + "encoding/json" + "github.com/AliceO2Group/Control/apricot/local" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "strings" + + "github.com/AliceO2Group/Control/configuration/template" +) + +var _ = Describe("Template function stack", func() { + + Describe("utility functions", func() { + var utilFuncMap map[string]interface{} + + BeforeEach(func() { + varStack := map[string]string{ + "test_var": "test_value", + "prefix_var": "prefixed_value", + "fallback_var": "fallback_value", + "prefixed_none_fallback_var": "none", + } + utilFuncMap = template.MakeUtilFuncMap(varStack) + }) + + Context("strings functions", func() { + It("should validate inputs and convert string to int", func() { + atoiFunc := utilFuncMap["Atoi"].(func(string) int) + + result := atoiFunc("123") + Expect(result).To(Equal(123)) + // we only produce an error log if unexpected input appears + result = atoiFunc("abc") + Expect(result).To(Equal(0)) + result = atoiFunc("") + Expect(result).To(Equal(0)) + }) + + It("should validate inputs and convert int to string", func() { + itoaFunc := utilFuncMap["Itoa"].(func(int) string) + + Expect(itoaFunc(123)).To(Equal("123")) + Expect(itoaFunc(0)).To(Equal("0")) + Expect(itoaFunc(-456)).To(Equal("-456")) + }) + + It("should trim quotes", func() { + trimQuotesFunc := utilFuncMap["TrimQuotes"].(func(string) string) + + Expect(trimQuotesFunc("\"test\"")).To(Equal("test")) + // Fixme: should it support also single quotes? + //Expect(trimQuotesFunc("'test'")).To(Equal("test")) + + Expect(trimQuotesFunc("test")).To(Equal("test")) + Expect(trimQuotesFunc("")).To(Equal("")) + Expect(trimQuotesFunc("\"test")).To(Equal("test")) + Expect(trimQuotesFunc("test\"")).To(Equal("test")) + }) + + It("should trim spaces", func() { + trimSpaceFunc := utilFuncMap["TrimSpace"].(func(string) string) + + Expect(trimSpaceFunc(" test ")).To(Equal("test")) + Expect(trimSpaceFunc("test")).To(Equal("test")) + Expect(trimSpaceFunc("test test ")).To(Equal("test test")) + }) + + It("should convert to upper case", func() { + toUpperFunc := utilFuncMap["ToUpper"].(func(string) string) + Expect(toUpperFunc("test")).To(Equal("TEST")) + Expect(toUpperFunc("Test")).To(Equal("TEST")) + Expect(toUpperFunc("1")).To(Equal("1")) + }) + + It("should convert to lower case", func() { + toLowerFunc := utilFuncMap["ToLower"].(func(string) string) + Expect(toLowerFunc("TEST")).To(Equal("test")) + Expect(toLowerFunc("Test")).To(Equal("test")) + Expect(toLowerFunc("1")).To(Equal("1")) + }) + + It("should check if a string is truthy", func() { + isTruthyFunc := utilFuncMap["IsTruthy"].(func(string) bool) + + Expect(isTruthyFunc("true")).To(BeTrue()) + Expect(isTruthyFunc("TRUE")).To(BeTrue()) + Expect(isTruthyFunc("yes")).To(BeTrue()) + Expect(isTruthyFunc("y")).To(BeTrue()) + Expect(isTruthyFunc("1")).To(BeTrue()) + Expect(isTruthyFunc("on")).To(BeTrue()) + Expect(isTruthyFunc("ok")).To(BeTrue()) + + Expect(isTruthyFunc("false")).To(BeFalse()) + Expect(isTruthyFunc("")).To(BeFalse()) + Expect(isTruthyFunc("0")).To(BeFalse()) + Expect(isTruthyFunc("truthy")).To(BeFalse()) + }) + + It("should check if a string is falsy", func() { + isFalsyFunc := utilFuncMap["IsFalsy"].(func(string) bool) + Expect(isFalsyFunc("false")).To(BeTrue()) + Expect(isFalsyFunc("FALSE")).To(BeTrue()) + Expect(isFalsyFunc("no")).To(BeTrue()) + Expect(isFalsyFunc("n")).To(BeTrue()) + Expect(isFalsyFunc("0")).To(BeTrue()) + Expect(isFalsyFunc("off")).To(BeTrue()) + Expect(isFalsyFunc("none")).To(BeTrue()) + Expect(isFalsyFunc("")).To(BeTrue()) + + Expect(isFalsyFunc("true")).To(BeFalse()) + Expect(isFalsyFunc("1")).To(BeFalse()) + }) + }) + + Context("json functions", func() { + It("should unmarshal JSON", func() { + unmarshalFunc := utilFuncMap["json"].(map[string]interface{})["Unmarshal"].(func(string) interface{}) + result := unmarshalFunc(`{"key": "value"}`) + Expect(result).To(HaveKeyWithValue("key", "value")) + }) + + It("should marshal to JSON", func() { + marshalFunc := utilFuncMap["json"].(map[string]interface{})["Marshal"].(func(interface{}) string) + input := map[string]string{"key": "value"} + result := marshalFunc(input) + Expect(result).To(MatchJSON(`{"key": "value"}`)) + }) + }) + + Context("uid functions", func() { + It("should generate a new UID", func() { + newFunc := utilFuncMap["uid"].(map[string]interface{})["New"].(func() string) + uid1 := newFunc() + uid2 := newFunc() + Expect(uid1).NotTo(Equal(uid2)) + }) + }) + + Context("util functions", func() { + It("should handle prefixed override", func() { + prefixedOverrideFunc := utilFuncMap["util"].(map[string]interface{})["PrefixedOverride"].(func(string, string) string) + Expect(prefixedOverrideFunc("var", "prefix")).To(Equal("prefixed_value")) + Expect(prefixedOverrideFunc("fallback_var", "nonexistent_prefix")).To(Equal("fallback_value")) + Expect(prefixedOverrideFunc("fallback_var", "prefixed_none")).To(Equal("fallback_value")) + Expect(prefixedOverrideFunc("nonexistent_fallback_var", "prefix")).To(Equal("")) + }) + + It("should handle nullable strings", func() { + nullableFunc := utilFuncMap["util"].(map[string]interface{})["Nullable"].(func(*string) string) + var nilString *string + Expect(nullableFunc(nilString)).To(Equal("")) + + nonNilString := "test" + Expect(nullableFunc(&nonNilString)).To(Equal("test")) + }) + + It("should check if suffix is in range", func() { + suffixInRangeFunc := utilFuncMap["util"].(map[string]interface{})["SuffixInRange"].(func(string, string, string, string) string) + Expect(suffixInRangeFunc("test5", "test", "1", "10")).To(Equal("true")) + Expect(suffixInRangeFunc("test15", "test", "1", "10")).To(Equal("false")) + // no prefix + Expect(suffixInRangeFunc("other5", "test", "1", "10")).To(Equal("false")) + // no suffix + Expect(suffixInRangeFunc("test", "test", "1", "10")).To(Equal("false")) + // range arguments are not numbers + Expect(suffixInRangeFunc("test", "test", "a", "10")).To(Equal("false")) + Expect(suffixInRangeFunc("test", "test", "1", "b")).To(Equal("false")) + }) + }) + }) + + Describe("inventory functions", func() { + var ( + svc *local.Service + configAccessObject map[string]interface{} + err error + ) + BeforeEach(func() { + svc, err = local.NewService("file://" + *tmpDir + "/" + serviceConfigFile) + Expect(err).NotTo(HaveOccurred()) + + varStack := map[string]string{} + configAccessObject = template.MakeConfigAccessObject(svc, varStack) + }) + + It("should get detector for host", func() { + getDetectorFunc := configAccessObject["inventory"].(map[string]interface{})["DetectorForHost"].(func(string) string) + Expect(getDetectorFunc("flp001")).To(Equal("ABC")) + Expect(getDetectorFunc("NOPE")).To(ContainSubstring("error")) + }) + It("should get detectors for a list of hosts", func() { + getDetectorsFunc := configAccessObject["inventory"].(map[string]interface{})["DetectorsForHosts"].(func(string) string) + Expect(getDetectorsFunc("[ \"flp001\", \"flp002\" ]")).To(Equal("[\"ABC\",\"DEF\"]")) + Expect(getDetectorsFunc("[ \"flp001\", \"NOPE\" ]")).To(ContainSubstring("error")) + Expect(getDetectorsFunc("[ \"NOPE\" ]")).To(ContainSubstring("error")) + Expect(getDetectorsFunc("flp001")).To(ContainSubstring("error")) + }) + It("should get CRU cards for host", func() { + getCruCardsFunc := configAccessObject["inventory"].(map[string]interface{})["CRUCardsForHost"].(func(string) string) + var result []string + err := json.Unmarshal([]byte(getCruCardsFunc("flp001")), &result) + Expect(err).NotTo(HaveOccurred()) + Expect(result).To(ConsistOf("0228", "0229")) + Expect(getCruCardsFunc("NOPE")).To(ContainSubstring("error")) + }) + It("should get endpoints for CRU card", func() { + getEndpointsFunc := configAccessObject["inventory"].(map[string]interface{})["EndpointsForCRUCard"].(func(string, string) string) + endpoints := strings.Split(getEndpointsFunc("flp001", "0228"), " ") + Expect(endpoints).To(ConsistOf("0", "1")) + // fixme: probably incorrect behaviour, but I don't want to risk breaking something + Expect(getEndpointsFunc("flp001", "NOPE")).To(BeEmpty()) + }) + }) +}) diff --git a/configuration/template/stack_test.yaml b/configuration/template/stack_test.yaml new file mode 100644 index 000000000..cca28db8e --- /dev/null +++ b/configuration/template/stack_test.yaml @@ -0,0 +1,58 @@ +o2: + components: + qc: + TECHNICAL: + any: + entry: "config" + PHYSICS: + role1: + entry1: "entry1 config PHYSICS role1" + entry2: "entry2 config PHYSICS role1" + ANY: + role1: + entry1: "entry1 config ANY role1" + any: + entry1: "entry1 config ANY any" + entry10: "{{ var1 }} {% include \"entry11\" %}" + entry11: "world" + entry12: "hello {% include \"sub/entry12\" %}" + sub: + entry12: "world" + runtime: + aliecs: + defaults: + key1: value1 + vars: + key2: value2 + hardware: + detectors: + ABC: + flps: + flp001: + cards: "{ \"key\" : \"value\" }" + DEF: + flps: + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + TRG: + flps: + flp100: + cards: "{ \"key\" : \"value\" }" + XYZ: + flps: {} + flps: + flp001: + cards: "{ + \"0\": {\"serial\": \"0228\", \"endpoint\": \"0\"}, + \"1\": {\"serial\": \"0229\", \"endpoint\": \"0\"}, + \"2\": {\"serial\": \"0228\", \"endpoint\": \"1\"}, + \"3\": {\"serial\": \"0229\", \"endpoint\": \"1\"} + }" + flp002: + cards: "{ \"key\" : \"value\" }" + flp003: + cards: "{ \"key\" : \"value\" }" + flp100: + cards: "{ \"key\" : \"value\" }" \ No newline at end of file diff --git a/configuration/template/template_test.go b/configuration/template/template_test.go index 110c8a464..91b90c458 100644 --- a/configuration/template/template_test.go +++ b/configuration/template/template_test.go @@ -1,12 +1,44 @@ -package template +package template_test import ( . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "io" + "os" "testing" ) +var tmpDir *string + +const serviceConfigFile = "stack_test.yaml" + func TestTemplate(t *testing.T) { RegisterFailHandler(Fail) RunSpecs(t, "Component Configuration Test Suite") } + +var _ = BeforeSuite(func() { + var err error + tmpDir = new(string) + *tmpDir, err = os.MkdirTemp("", "o2control-local-service") + Expect(err).NotTo(HaveOccurred()) + + // copy config files + configFiles := []string{serviceConfigFile} + for _, configFile := range configFiles { + from, err := os.Open("./" + configFile) + Expect(err).NotTo(HaveOccurred()) + defer from.Close() + + to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) + Expect(err).NotTo(HaveOccurred()) + defer to.Close() + + _, err = io.Copy(to, from) + Expect(err).NotTo(HaveOccurred()) + } +}) + +var _ = AfterSuite(func() { + os.RemoveAll(*tmpDir) +}) diff --git a/core/workflow/aggregatorrole_test.go b/core/workflow/aggregatorrole_test.go index 3f3e1ff39..f01f7cf38 100644 --- a/core/workflow/aggregatorrole_test.go +++ b/core/workflow/aggregatorrole_test.go @@ -7,15 +7,16 @@ import ( ) var _ = Describe("aggregator role", func() { - var _ = Describe("processing templates", func() { - var root Role - var repo repos.Repo - var configStack map[string]string + var root Role + var repo repos.Repo + var configStack map[string]string - BeforeEach(func() { - _, repo, _ = repos.NewRepo("/home/user/git/ControlWorkflows", "", "/var/lib/o2/aliecs/repos") - configStack = make(map[string]string) - }) + BeforeEach(func() { + _, repo, _ = repos.NewRepo("/home/user/git/ControlWorkflows", "", "/var/lib/o2/aliecs/repos") + configStack = make(map[string]string) + }) + + var _ = Describe("processing templates", func() { When("an aggregator role is empty", func() { BeforeEach(func() { From 3dbbd65c8afd6808172730e375f77cfcf7298a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 26 Feb 2025 19:07:00 +0100 Subject: [PATCH 2077/2352] [core] add Rows field to the VarStack variables --- coconut/protos/o2control.pb.go | 521 ++++++++++++++-------------- coconut/protos/o2control_grpc.pb.go | 2 +- common/gera/map_test.go | 2 +- core/protos/o2control.pb.go | 521 ++++++++++++++-------------- core/protos/o2control.proto | 1 + core/protos/o2control_grpc.pb.go | 2 +- core/repos/repoutils.go | 1 + core/serverutil.go | 3 +- core/workflow/role_test.go | 14 +- 9 files changed, 546 insertions(+), 521 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index dbd2b96e6..a88fe1b2f 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc-gen-go v1.33.0 +// protoc v5.29.2 // source: protos/o2control.proto package pb @@ -3158,6 +3158,7 @@ type VarSpecMessage struct { Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool EnabledIf string `protobuf:"bytes,10,opt,name=enabledIf,proto3" json:"enabledIf,omitempty"` // JS expression that evaluates to bool + Rows uint32 `protobuf:"varint,11,opt,name=rows,proto3" json:"rows,omitempty"` // this field is used only if widget == editBox } func (x *VarSpecMessage) Reset() { @@ -3262,6 +3263,13 @@ func (x *VarSpecMessage) GetEnabledIf() string { return "" } +func (x *VarSpecMessage) GetRows() uint32 { + if x != nil { + return x.Rows + } + return 0 +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4649,7 +4657,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, @@ -4672,262 +4680,263 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, - 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, - 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, - 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, + 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, + 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index e3430de84..942f75d1e 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.29.2 // source: protos/o2control.proto package pb diff --git a/common/gera/map_test.go b/common/gera/map_test.go index dea808ee9..8434fa1b6 100644 --- a/common/gera/map_test.go +++ b/common/gera/map_test.go @@ -63,6 +63,7 @@ pdp_workflow_parameters: !public widget: editBox panel: "EPNs_Workflows" index: 603 + rows: 10 user: flp extra_env_vars: "" ` @@ -274,7 +275,6 @@ pdp_workflow_parameters: "" }) }) When("wrapping and unwrapping maps", func() { - defaults1 := MakeMap[string, string]() Expect(defaults1).NotTo(BeNil()) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index dbd2b96e6..a88fe1b2f 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc-gen-go v1.33.0 +// protoc v5.29.2 // source: protos/o2control.proto package pb @@ -3158,6 +3158,7 @@ type VarSpecMessage struct { Index int32 `protobuf:"varint,8,opt,name=index,proto3" json:"index,omitempty"` VisibleIf string `protobuf:"bytes,9,opt,name=visibleIf,proto3" json:"visibleIf,omitempty"` // JS expression that evaluates to bool EnabledIf string `protobuf:"bytes,10,opt,name=enabledIf,proto3" json:"enabledIf,omitempty"` // JS expression that evaluates to bool + Rows uint32 `protobuf:"varint,11,opt,name=rows,proto3" json:"rows,omitempty"` // this field is used only if widget == editBox } func (x *VarSpecMessage) Reset() { @@ -3262,6 +3263,13 @@ func (x *VarSpecMessage) GetEnabledIf() string { return "" } +func (x *VarSpecMessage) GetRows() uint32 { + if x != nil { + return x.Rows + } + return 0 +} + type WorkflowTemplateInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4649,7 +4657,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0x9a, 0x04, 0x0a, 0x0e, 0x56, 0x61, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, @@ -4672,262 +4680,263 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, - 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, - 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, - 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, - 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, - 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, - 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, - 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, - 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, - 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, - 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, - 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x22, 0x2b, 0x0a, 0x13, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, 0x0a, 0x1b, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, + 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, + 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, + 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, + 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, + 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, + 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, + 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, - 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, - 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, - 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, - 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, - 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, - 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, + 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, + 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, + 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, + 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, + 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, - 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, - 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, - 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, - 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, - 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, - 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, - 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, + 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, + 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, + 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, + 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index ee9bd974e..9969b74dc 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -386,6 +386,7 @@ message VarSpecMessage { int32 index = 8; string visibleIf = 9; // JS expression that evaluates to bool string enabledIf = 10; // JS expression that evaluates to bool + uint32 rows = 11; // this field is used only if widget == editBox } message WorkflowTemplateInfo { diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index e3430de84..942f75d1e 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.3 +// - protoc v5.29.2 // source: protos/o2control.proto package pb diff --git a/core/repos/repoutils.go b/core/repos/repoutils.go index 948e69604..71039c72e 100644 --- a/core/repos/repoutils.go +++ b/core/repos/repoutils.go @@ -76,6 +76,7 @@ type VarSpec struct { Panel string `yaml:"panel" ` AllowedValues []string `yaml:"values"` Index int32 `yaml:"index"` + Rows uint32 `yaml:"rows"` VisibleIf string `yaml:"visibleif"` EnabledIf string `yaml:"enabledif"` } diff --git a/core/serverutil.go b/core/serverutil.go index fd9ed49ea..3dbd081ed 100644 --- a/core/serverutil.go +++ b/core/serverutil.go @@ -30,7 +30,7 @@ import ( "github.com/AliceO2Group/Control/core/repos" "github.com/AliceO2Group/Control/common" - "github.com/AliceO2Group/Control/core/protos" + pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task/channel" "github.com/AliceO2Group/Control/core/task" @@ -204,6 +204,7 @@ func VarSpecMapToPbVarSpecMap(varSpecMap map[string]repos.VarSpec) map[string]*p Index: v.Index, VisibleIf: v.VisibleIf, EnabledIf: v.EnabledIf, + Rows: v.Rows, } ret[k] = vsm } diff --git a/core/workflow/role_test.go b/core/workflow/role_test.go index af6f4f722..31dcba7d4 100644 --- a/core/workflow/role_test.go +++ b/core/workflow/role_test.go @@ -12,7 +12,8 @@ func complexRoleTree() (root Role, leaves map[string]Role) { defaultState := sm.RUNNING call1 := &callRole{ roleBase: roleBase{Name: "call1", state: SafeState{state: defaultState}}, - Traits: task.Traits{Critical: true}} + Traits: task.Traits{Critical: true}, + } task1 := &taskRole{ roleBase: roleBase{Name: "task1", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: true}, @@ -21,15 +22,18 @@ func complexRoleTree() (root Role, leaves map[string]Role) { agg1task_noncritical := &taskRole{ roleBase: roleBase{Name: "agg1task_noncritical", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: false}, - Task: nil} + Task: nil, + } agg1task_critical := &taskRole{ roleBase: roleBase{Name: "agg1task_critical", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: true}, - Task: &task.Task{}} + Task: &task.Task{}, + } agg2task_noncritical := &taskRole{ roleBase: roleBase{Name: "agg2task_noncritical", state: SafeState{state: defaultState}}, Traits: task.Traits{Critical: false}, - Task: &task.Task{}} + Task: &task.Task{}, + } root = &aggregatorRole{ roleBase{Name: "root", state: SafeState{state: defaultState}}, @@ -238,7 +242,6 @@ var _ = Describe("role", func() { }) Describe("GetTasks", func() { - When("getting the slice with roles for a complex tree", func() { var root Role BeforeEach(func() { @@ -445,6 +448,7 @@ roles: panel: DCS index: 2 visibleif: $$dcs_enabled === "true" + rows: 5 dcs_eor_parameters: !public value: "{}" type: string From 3a5ee34c17e808edcdc09240a19cafc2e5ad5dcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 25 Feb 2025 17:44:26 +0100 Subject: [PATCH 2078/2352] [core] changes to distribution of kafka messages to partitions - added environment id as a key to messages containing environment id field - changed Balancer from LeastBytes to Hash which makes kafka-go puts messages with same key to the same partition, fixing ordering problems --- common/event/writer.go | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 9e329af49..49bb0d3cd 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -62,7 +62,7 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { Writer: &kafka.Writer{ Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), Topic: string(topic), - Balancer: &kafka.LeastBytes{}, + Balancer: &kafka.Hash{}, AllowAutoTopicCreation: true, }, } @@ -80,6 +80,18 @@ func (w *KafkaWriter) WriteEvent(e interface{}) { } } +type HasEnvID interface { + GetEnvironmentId() string +} + +func extractAndConvertEnvID[T HasEnvID](object T) []byte { + envID := []byte(object.GetEnvironmentId()) + if len(envID) > 0 { + return envID + } + return nil +} + func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { if w == nil { return @@ -89,6 +101,7 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time var ( err error wrappedEvent *pb.Event + key []byte = nil ) switch e := e.(type) { @@ -111,36 +124,42 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, } case *pb.Ev_TaskEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), Payload: &pb.Event_TaskEvent{TaskEvent: e}, } case *pb.Ev_RoleEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), Payload: &pb.Event_RoleEvent{RoleEvent: e}, } case *pb.Ev_EnvironmentEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, } case *pb.Ev_CallEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), Payload: &pb.Event_CallEvent{CallEvent: e}, } case *pb.Ev_IntegratedServiceEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, } case *pb.Ev_RunEvent: + key = extractAndConvertEnvID(e) wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), @@ -151,7 +170,7 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time if wrappedEvent == nil { err = fmt.Errorf("unsupported event type") } else { - err = w.doWriteEvent(wrappedEvent) + err = w.doWriteEvent(key, wrappedEvent) } if err != nil { @@ -162,7 +181,7 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time }() } -func (w *KafkaWriter) doWriteEvent(e *pb.Event) error { +func (w *KafkaWriter) doWriteEvent(key []byte, e *pb.Event) error { if w == nil { return nil } @@ -172,10 +191,15 @@ func (w *KafkaWriter) doWriteEvent(e *pb.Event) error { return fmt.Errorf("failed to marshal event: %w", err) } - err = w.WriteMessages(context.Background(), kafka.Message{ + message := kafka.Message{ Value: data, - }) + } + + if key != nil { + message.Key = key + } + err = w.WriteMessages(context.Background(), message) if err != nil { return fmt.Errorf("failed to write event: %w", err) } From 0cffa069ea615b10ace518824af1f72b1d4f108f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 4 Mar 2025 10:41:17 +0100 Subject: [PATCH 2079/2352] [core] use Taskid for kafka task events instead of Environmentid --- common/event/writer.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/event/writer.go b/common/event/writer.go index 49bb0d3cd..a6444b105 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -124,7 +124,10 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, } case *pb.Ev_TaskEvent: - key = extractAndConvertEnvID(e) + key = []byte(e.Taskid) + if len(key) == 0 { + key = nil + } wrappedEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), TimestampNano: timestamp.UnixNano(), From dc69c45ff83188c86260dced8ac6981af285b2c2 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 26 Feb 2025 11:29:02 +0100 Subject: [PATCH 2080/2352] [apricot] Support for retrieving linkIDs by CRU endpoint and by detector OCTRL-980 Not yet used by the DCS plugin to send enabled linkIDs for selected detectors, that will come next. --- apricot/cacheproxy/service.go | 8 + apricot/local/service.go | 110 +++++ apricot/local/service_test.go | 75 ++++ apricot/local/service_test.yaml | 137 ++++++ apricot/protos/apricot.pb.go | 674 ++++++++++++++++++++++-------- apricot/protos/apricot.proto | 22 + apricot/protos/apricot_grpc.pb.go | 76 +++- apricot/remote/server.go | 40 ++ apricot/remote/service.go | 25 ++ configuration/service.go | 2 + 10 files changed, 985 insertions(+), 184 deletions(-) diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index 2d471e6da..05ea7aa94 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -141,6 +141,14 @@ func (s Service) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, return s.base.GetEndpointsForCRUCard(hostname, cardSerial) } +func (s Service) GetLinkIDsForCRUEndpoint(host string, cruId string, endpoint string, onlyEnabled bool) (ids []string, err error) { + return s.base.GetLinkIDsForCRUEndpoint(host, cruId, endpoint, onlyEnabled) +} + +func (s Service) GetAliasedLinkIDsForDetector(detector string, onlyEnabled bool) ([]string, error) { + return s.base.GetAliasedLinkIDsForDetector(detector, onlyEnabled) +} + func (s Service) RawGetRecursive(path string) (string, error) { return s.base.RawGetRecursive(path) } diff --git a/apricot/local/service.go b/apricot/local/service.go index 28c108f36..0fe042dd2 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -41,6 +41,7 @@ import ( "net/url" "os" "path/filepath" + "regexp" "runtime" "sort" "strconv" @@ -51,6 +52,7 @@ import ( var log = logger.New(logrus.StandardLogger(), "confsys") const inventoryKeyPrefix = "o2/hardware/" +const readoutCardKeyPrefix = "o2/components/readoutcard/" type Service struct { src cfgbackend.Source @@ -185,6 +187,114 @@ func (s *Service) GetHostInventory(detector string) (hosts []string, err error) return hosts, err } +func (s *Service) GetLinkIDsForCRUEndpoint(host string, cruId string, endpoint string, onlyEnabled bool) (ids []string, err error) { + + cfgPath := readoutCardKeyPrefix + host + "/cru/" + cruId + "/" + endpoint + + readoutCardConfig, err := s.src.Get(cfgPath) + if err != nil { + return nil, err + } + + var data map[string]map[string]interface{} + if err := json.Unmarshal([]byte(readoutCardConfig), &data); err != nil { + return nil, err + } + + linkPattern := regexp.MustCompile(`^link(\d+)$`) + + var linkIDs []string + for key, value := range data { + matches := linkPattern.FindStringSubmatch(key) + if matches == nil { + continue + } + linkEnabled, ok := value["enabled"].(string) + if !ok { + // this implies that "enabled" key should be always there, even if we want both enabled and disabled links + continue + } + if linkEnabled == "true" || onlyEnabled == false { + linkIDs = append(linkIDs, matches[1]) + } + } + + return linkIDs, nil +} + +type Aliases struct { + Flp struct { + Alias string `json:"alias"` + } `json:"flp"` + Cards map[string]struct { + Alias string `json:"alias"` + Links map[string]struct { + Alias string `json:"alias"` + } `json:"links"` + } `json:"cards"` +} + +func (s *Service) getAliasesForHost(detector, host string) (Aliases, error) { + aliasesPath := inventoryKeyPrefix + "detectors/" + detector + "/flps/" + host + "/aliases" + aliasesFile, err := s.src.Get(aliasesPath) + if err != nil { + return Aliases{}, err + } + + var aliases Aliases + if err := json.Unmarshal([]byte(aliasesFile), &aliases); err != nil { + return Aliases{}, err + } + return aliases, nil +} + +func (s *Service) GetAliasedLinkIDsForDetector(detector string, onlyEnabled bool) (aliasedLinkIds []string, err error) { + s.logMethod() + + hosts, err := s.GetHostInventory(detector) + if err != nil { + return nil, err + } + + for _, host := range hosts { + aliases, err := s.getAliasesForHost(detector, host) + if err != nil { + return nil, err + } + + crus, err := s.GetCRUCardsForHost(host) + if err != nil { + return nil, err + } + for _, cru := range crus { + endpoints, err := s.GetEndpointsForCRUCard(host, cru) + if err != nil { + return nil, err + } + for _, endpoint := range endpoints { + linkIDs, err := s.GetLinkIDsForCRUEndpoint(host, cru, endpoint, onlyEnabled) + if err != nil { + return nil, err + } + + aliasesForCruEndpoint, ok := aliases.Cards[cru+":"+endpoint] + if !ok { + return nil, fmt.Errorf("aliases for cru endpoint %s:%s not found", cru, endpoint) + } + for _, linkID := range linkIDs { + linkIdAlias, ok := aliasesForCruEndpoint.Links[linkID] + if !ok { + return nil, fmt.Errorf("alias for link %s in cru endpoint %s:%s not found", linkID, cru, endpoint) + } + aliasedLinkIds = append(aliasedLinkIds, linkIdAlias.Alias) + } + } + } + } + sort.Strings(aliasedLinkIds) + return aliasedLinkIds, nil +} + func (s *Service) GetDetectorsInventory() (inventory map[string][]string, err error) { s.logMethod() diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go index 3e9a6fa5b..9f892e740 100644 --- a/apricot/local/service_test.go +++ b/apricot/local/service_test.go @@ -482,6 +482,81 @@ var _ = Describe("local service", func() { }) }) }) + Describe("getting link IDs for a CRU card endpoint", func() { + var ( + linkIDs []string + err error + ) + When("retrieving the link IDs for a CRU card endpoint", func() { + It("should return the correct link IDs", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("flp001", "0228", "0", false) + Expect(err).NotTo(HaveOccurred()) + Expect(linkIDs).To(ContainElements("0", "1", "2", "10")) + }) + It("should return the correct enabled link IDs", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("flp001", "0228", "0", true) + Expect(err).NotTo(HaveOccurred()) + Expect(linkIDs).To(ContainElements("0", "2")) + }) + }) + When("retrieving the link IDs for a non-existing host", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("NOPE", "0228", "0", true) + Expect(err).To(HaveOccurred()) + }) + }) + When("retrieving the link IDs for a non-existing CRU card", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("flp001", "NOPE", "0", true) + Expect(err).To(HaveOccurred()) + }) + }) + When("retrieving the link IDs for a non-existing endpoint", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("flp001", "0228", "NOPE", true) + Expect(err).To(HaveOccurred()) + }) + }) + When("trying to retrieve the link IDs for an FLP belonging to a CRORC detector", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetLinkIDsForCRUEndpoint("flp146", "0110", "0", true) + Expect(err).To(HaveOccurred()) + }) + }) + }) + + Describe("getting aliased link IDs for a detector", func() { + var ( + linkIDs []string + err error + ) + When("retrieving the link IDs for a detector", func() { + It("should return the correct link IDs", func() { + linkIDs, err = svc.GetAliasedLinkIDsForDetector("ABC", false) + Expect(err).NotTo(HaveOccurred()) + Expect(linkIDs).To(Equal([]string{"01", "123", "400", "58", "59", "600", "62", "63", "a-b_c=d", "string"})) + }) + }) + When("retrieving the active link IDs for a detector", func() { + It("should return the correct link IDs", func() { + linkIDs, err = svc.GetAliasedLinkIDsForDetector("ABC", true) + Expect(err).NotTo(HaveOccurred()) + Expect(linkIDs).To(Equal([]string{"01", "400", "58", "600", "string"})) + }) + }) + When("retrieving the link IDs for a non-existing detector", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetAliasedLinkIDsForDetector("NOPE", false) + Expect(err).To(HaveOccurred()) + }) + }) + When("retrieving the link IDs for a detector without readoutcard config", func() { + It("should produce an error", func() { + linkIDs, err = svc.GetAliasedLinkIDsForDetector("DEF", false) + Expect(err).To(HaveOccurred()) + }) + }) + }) // TODO: // GetRuntimeEntry (currently not supporting yaml backend) diff --git a/apricot/local/service_test.yaml b/apricot/local/service_test.yaml index cca28db8e..07047525a 100644 --- a/apricot/local/service_test.yaml +++ b/apricot/local/service_test.yaml @@ -18,6 +18,105 @@ o2: entry12: "hello {% include \"sub/entry12\" %}" sub: entry12: "world" + readoutcard: + flp001: + cru: + "0228": + "0": '{ + "cru": { + "key" : "value" + }, + "links": { + "enabled": "false", + "gbtMux": "TTC", + "feeId": "0x2" + }, + "link0": { + "enabled": "true", + "gbtMux": "ttc", + "feeId": "0x680" + }, + "link1": { + "enabled": "false", + "gbtMux": "ttc", + "feeId": "0x681" + }, + "link2": { + "enabled": "true", + "gbtMux": "ttc", + "feeId": "0x682" + }, + "link10": { + "enabled": "false", + "gbtMux": "ttc", + "feeId": "0x683" + } + }' + "1": '{ + "cru": { + "key" : "value" + }, + "links": { + "enabled": "false", + "gbtMux": "TTC", + "feeId": "0x2" + }, + "link0": { + "enabled": "true", + "gbtMux": "ttc", + "feeId": "0x6c0" + }, + "link1": { + "enabled": "false", + "gbtMux": "ttc", + "feeId": "0x6c1" + }, + "link2": { + "enabled": "false", + "gbtMux": "ttc", + "feeId": "0x6c2" + }, + "link3": { + "enabled": "false", + "gbtMux": "ttc", + "feeId": "0x6c3" + } + }' + "0229": + "0": '{ + "cru": { + "key" : "value" + }, + "links": { + "enabled": "true", + "gbtMux": "TTC", + "feeId": "0x2" + }, + "link0": { + "enabled": "true", + "gbtMux": "ttc", + "feeId": "0x680" + } + }' + "1": '{ + "cru": { + "key" : "value" + }, + "links": { + "enabled": "true", + "gbtMux": "TTC", + "feeId": "0x2" + }, + "link0": { + "enabled": "true", + "gbtMux": "ttc", + "feeId": "0x6c0" + } + }' + flp146: + crorc: + "0110": + "0": "{}" runtime: aliecs: defaults: @@ -30,6 +129,44 @@ o2: flps: flp001: cards: "{ \"key\" : \"value\" }" + aliases: ' + { + "flp": { + "alias": "SM 0-1-2-3-4-14-15-16-17" + }, + "cards": { + "0228:0": { + "alias": "SM 14-15-16-17 A-Side", + "links": { + "10": {"alias": "a-b_c=d"}, + "2": {"alias": "string"}, + "1": {"alias": "123"}, + "0": {"alias": "01"} + } + }, + "0228:1": { + "alias": "SM 14-15-16-17 C-Side", + "links": { + "0": {"alias": "58"}, + "1": {"alias": "59"}, + "2": {"alias": "62"}, + "3": {"alias": "63"} + } + }, + "0229:0": { + "alias": "SM 0-1-2-3-4 A-Side", + "links": { + "0": {"alias": "400"} + } + }, + "0229:1": { + "alias": "SM 0-1-2-3-4 C-Side", + "links": { + "0": {"alias": "600"} + } + } + } + }' DEF: flps: flp002: diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 69136026b..e60821d40 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.33.0 -// protoc v3.15.8 +// protoc v3.12.4 // source: protos/apricot.proto package apricotpb @@ -1732,6 +1732,226 @@ func (x *CRUCardEndpointResponse) GetEndpoints() string { return "" } +type LinkIDsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Hostname string `protobuf:"bytes,1,opt,name=hostname,proto3" json:"hostname,omitempty"` + CardSerial string `protobuf:"bytes,2,opt,name=cardSerial,proto3" json:"cardSerial,omitempty"` + Endpoint string `protobuf:"bytes,3,opt,name=endpoint,proto3" json:"endpoint,omitempty"` + OnlyEnabled bool `protobuf:"varint,4,opt,name=onlyEnabled,proto3" json:"onlyEnabled,omitempty"` +} + +func (x *LinkIDsRequest) Reset() { + *x = LinkIDsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinkIDsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinkIDsRequest) ProtoMessage() {} + +func (x *LinkIDsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[30] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinkIDsRequest.ProtoReflect.Descriptor instead. +func (*LinkIDsRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{30} +} + +func (x *LinkIDsRequest) GetHostname() string { + if x != nil { + return x.Hostname + } + return "" +} + +func (x *LinkIDsRequest) GetCardSerial() string { + if x != nil { + return x.CardSerial + } + return "" +} + +func (x *LinkIDsRequest) GetEndpoint() string { + if x != nil { + return x.Endpoint + } + return "" +} + +func (x *LinkIDsRequest) GetOnlyEnabled() bool { + if x != nil { + return x.OnlyEnabled + } + return false +} + +type LinkIDsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + LinkIDs []string `protobuf:"bytes,1,rep,name=linkIDs,proto3" json:"linkIDs,omitempty"` +} + +func (x *LinkIDsResponse) Reset() { + *x = LinkIDsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *LinkIDsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LinkIDsResponse) ProtoMessage() {} + +func (x *LinkIDsResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[31] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LinkIDsResponse.ProtoReflect.Descriptor instead. +func (*LinkIDsResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{31} +} + +func (x *LinkIDsResponse) GetLinkIDs() []string { + if x != nil { + return x.LinkIDs + } + return nil +} + +type AliasedLinkIDsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector string `protobuf:"bytes,1,opt,name=detector,proto3" json:"detector,omitempty"` + OnlyEnabled bool `protobuf:"varint,2,opt,name=onlyEnabled,proto3" json:"onlyEnabled,omitempty"` +} + +func (x *AliasedLinkIDsRequest) Reset() { + *x = AliasedLinkIDsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AliasedLinkIDsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AliasedLinkIDsRequest) ProtoMessage() {} + +func (x *AliasedLinkIDsRequest) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[32] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AliasedLinkIDsRequest.ProtoReflect.Descriptor instead. +func (*AliasedLinkIDsRequest) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{32} +} + +func (x *AliasedLinkIDsRequest) GetDetector() string { + if x != nil { + return x.Detector + } + return "" +} + +func (x *AliasedLinkIDsRequest) GetOnlyEnabled() bool { + if x != nil { + return x.OnlyEnabled + } + return false +} + +type AliasedLinkIDsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AliasedLinkIDs []string `protobuf:"bytes,1,rep,name=aliasedLinkIDs,proto3" json:"aliasedLinkIDs,omitempty"` +} + +func (x *AliasedLinkIDsResponse) Reset() { + *x = AliasedLinkIDsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_apricot_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AliasedLinkIDsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AliasedLinkIDsResponse) ProtoMessage() {} + +func (x *AliasedLinkIDsResponse) ProtoReflect() protoreflect.Message { + mi := &file_protos_apricot_proto_msgTypes[33] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AliasedLinkIDsResponse.ProtoReflect.Descriptor instead. +func (*AliasedLinkIDsResponse) Descriptor() ([]byte, []int) { + return file_protos_apricot_proto_rawDescGZIP(), []int{33} +} + +func (x *AliasedLinkIDsResponse) GetAliasedLinkIDs() []string { + if x != nil { + return x.AliasedLinkIDs + } + return nil +} + var File_protos_apricot_proto protoreflect.FileDescriptor var file_protos_apricot_proto_rawDesc = []byte{ @@ -1894,149 +2114,181 @@ var file_protos_apricot_proto_rawDesc = []byte{ 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x64, 0x70, 0x6f, - 0x69, 0x6e, 0x74, 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, - 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, - 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, - 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, - 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, - 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, - 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, - 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, - 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, - 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, - 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x0f, 0x0a, - 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0b, - 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, - 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, - 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, - 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x32, 0xdd, 0x0d, - 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x4e, 0x65, 0x77, - 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x2f, 0x0a, 0x07, - 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, - 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x50, 0x0a, - 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, - 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, 0x77, 0x47, 0x65, - 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x69, 0x6e, 0x74, 0x73, 0x22, 0x8a, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x61, 0x72, 0x64, 0x53, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x22, 0x2b, 0x0a, 0x0f, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x22, 0x55, + 0x0a, 0x15, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6f, 0x6e, 0x6c, 0x79, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x40, 0x0a, 0x16, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, + 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, + 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x2a, 0x96, 0x03, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, + 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x50, 0x45, 0x44, + 0x45, 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, + 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, + 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, + 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, + 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, + 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, + 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, + 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, + 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, + 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, + 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x0d, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x0d, + 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, + 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, + 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, + 0x32, 0x91, 0x0f, 0x0a, 0x07, 0x41, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x0c, + 0x4e, 0x65, 0x77, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x0e, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x33, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, + 0x2f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x56, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, + 0x12, 0x50, 0x0a, 0x0f, 0x52, 0x61, 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, + 0x69, 0x76, 0x65, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x52, 0x61, + 0x77, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x75, 0x72, 0x73, 0x69, 0x76, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, + 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, + 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x4b, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, + 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, + 0x47, 0x65, 0x74, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, + 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, + 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4f, 0x0a, 0x18, 0x47, 0x65, 0x74, + 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x45, 0x6e, 0x64, + 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, + 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, + 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x1c, 0x47, 0x65, + 0x74, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, 0x49, 0x44, 0x73, 0x46, + 0x6f, 0x72, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1e, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, + 0x49, 0x44, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x41, 0x6c, 0x69, 0x61, 0x73, 0x65, 0x64, 0x4c, 0x69, 0x6e, 0x6b, + 0x49, 0x44, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x48, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x17, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x47, 0x65, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, - 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x14, - 0x47, 0x65, 0x74, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x48, - 0x6f, 0x73, 0x74, 0x73, 0x12, 0x15, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x46, 0x6f, 0x72, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x14, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x52, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, - 0x74, 0x73, 0x46, 0x6f, 0x72, 0x43, 0x52, 0x55, 0x43, 0x61, 0x72, 0x64, 0x12, 0x14, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x52, 0x55, - 0x43, 0x61, 0x72, 0x64, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, - 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, - 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, - 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x70, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, + 0x44, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x1f, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x70, 0x72, + 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x70, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x45, + 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, - 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, - 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, - 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, - 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, - 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, - 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, - 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, 0x0a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x0e, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x61, 0x70, - 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x42, 0x5e, 0x0a, - 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, - 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x14, 0x4c, 0x69, 0x73, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x2e, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x6e, 0x0a, 0x26, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x2e, 0x61, + 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, + 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x57, 0x69, 0x74, 0x68, 0x4c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x15, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x17, 0x2e, 0x61, 0x70, + 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x1a, 0x17, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x00, 0x12, + 0x7d, 0x0a, 0x1c, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x2c, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, + 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x44, + 0x0a, 0x20, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x12, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x42, 0x5e, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, + 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x61, 0x70, 0x72, 0x69, 0x63, 0x6f, 0x74, + 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x38, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x61, 0x70, 0x72, 0x69, + 0x63, 0x6f, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x61, 0x70, 0x72, 0x69, 0x63, + 0x6f, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2052,7 +2304,7 @@ func file_protos_apricot_proto_rawDescGZIP() []byte { } var file_protos_apricot_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 33) +var file_protos_apricot_proto_msgTypes = make([]protoimpl.MessageInfo, 37) var file_protos_apricot_proto_goTypes = []interface{}{ (RunType)(0), // 0: apricot.RunType (*Empty)(nil), // 1: apricot.Empty @@ -2085,16 +2337,20 @@ var file_protos_apricot_proto_goTypes = []interface{}{ (*CRUCardsResponse)(nil), // 28: apricot.CRUCardsResponse (*CardRequest)(nil), // 29: apricot.CardRequest (*CRUCardEndpointResponse)(nil), // 30: apricot.CRUCardEndpointResponse - nil, // 31: apricot.ComponentRequest.VarStackEntry - nil, // 32: apricot.DetectorEntriesResponse.DetectorEntriesEntry - nil, // 33: apricot.StringMap.StringMapEntry + (*LinkIDsRequest)(nil), // 31: apricot.LinkIDsRequest + (*LinkIDsResponse)(nil), // 32: apricot.LinkIDsResponse + (*AliasedLinkIDsRequest)(nil), // 33: apricot.AliasedLinkIDsRequest + (*AliasedLinkIDsResponse)(nil), // 34: apricot.AliasedLinkIDsResponse + nil, // 35: apricot.ComponentRequest.VarStackEntry + nil, // 36: apricot.DetectorEntriesResponse.DetectorEntriesEntry + nil, // 37: apricot.StringMap.StringMapEntry } var file_protos_apricot_proto_depIdxs = []int32{ 0, // 0: apricot.ComponentQuery.runType:type_name -> apricot.RunType 2, // 1: apricot.ComponentRequest.query:type_name -> apricot.ComponentQuery - 31, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry - 32, // 3: apricot.DetectorEntriesResponse.detectorEntries:type_name -> apricot.DetectorEntriesResponse.DetectorEntriesEntry - 33, // 4: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry + 35, // 2: apricot.ComponentRequest.varStack:type_name -> apricot.ComponentRequest.VarStackEntry + 36, // 3: apricot.DetectorEntriesResponse.detectorEntries:type_name -> apricot.DetectorEntriesResponse.DetectorEntriesEntry + 37, // 4: apricot.StringMap.stringMap:type_name -> apricot.StringMap.StringMapEntry 0, // 5: apricot.ComponentEntriesQuery.runType:type_name -> apricot.RunType 19, // 6: apricot.ListComponentEntriesRequest.query:type_name -> apricot.ComponentEntriesQuery 2, // 7: apricot.ImportComponentConfigurationRequest.query:type_name -> apricot.ComponentQuery @@ -2110,41 +2366,45 @@ var file_protos_apricot_proto_depIdxs = []int32{ 7, // 17: apricot.Apricot.GetDetectorsForHosts:input_type -> apricot.HostsRequest 6, // 18: apricot.Apricot.GetCRUCardsForHost:input_type -> apricot.HostRequest 29, // 19: apricot.Apricot.GetEndpointsForCRUCard:input_type -> apricot.CardRequest - 14, // 20: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest - 15, // 21: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest - 17, // 22: apricot.Apricot.GetRuntimeEntries:input_type -> apricot.GetRuntimeEntriesRequest - 18, // 23: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest - 1, // 24: apricot.Apricot.ListComponents:input_type -> apricot.Empty - 20, // 25: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest - 3, // 26: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest - 3, // 27: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest - 2, // 28: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery - 26, // 29: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest - 1, // 30: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty - 11, // 31: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse - 12, // 32: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap - 12, // 33: apricot.Apricot.GetVars:output_type -> apricot.StringMap - 4, // 34: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse - 23, // 35: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse - 25, // 36: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse - 10, // 37: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse - 8, // 38: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse - 23, // 39: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse - 28, // 40: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse - 30, // 41: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse - 4, // 42: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse - 1, // 43: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty - 12, // 44: apricot.Apricot.GetRuntimeEntries:output_type -> apricot.StringMap - 21, // 45: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse - 21, // 46: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse - 21, // 47: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse - 4, // 48: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse - 5, // 49: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex - 2, // 50: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery - 27, // 51: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse - 1, // 52: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty - 31, // [31:53] is the sub-list for method output_type - 9, // [9:31] is the sub-list for method input_type + 31, // 20: apricot.Apricot.GetLinkIDsForCRUEndpoint:input_type -> apricot.LinkIDsRequest + 33, // 21: apricot.Apricot.GetAliasedLinkIDsForDetector:input_type -> apricot.AliasedLinkIDsRequest + 14, // 22: apricot.Apricot.GetRuntimeEntry:input_type -> apricot.GetRuntimeEntryRequest + 15, // 23: apricot.Apricot.SetRuntimeEntry:input_type -> apricot.SetRuntimeEntryRequest + 17, // 24: apricot.Apricot.GetRuntimeEntries:input_type -> apricot.GetRuntimeEntriesRequest + 18, // 25: apricot.Apricot.ListRuntimeEntries:input_type -> apricot.ListRuntimeEntriesRequest + 1, // 26: apricot.Apricot.ListComponents:input_type -> apricot.Empty + 20, // 27: apricot.Apricot.ListComponentEntries:input_type -> apricot.ListComponentEntriesRequest + 3, // 28: apricot.Apricot.GetComponentConfiguration:input_type -> apricot.ComponentRequest + 3, // 29: apricot.Apricot.GetComponentConfigurationWithLastIndex:input_type -> apricot.ComponentRequest + 2, // 30: apricot.Apricot.ResolveComponentQuery:input_type -> apricot.ComponentQuery + 26, // 31: apricot.Apricot.ImportComponentConfiguration:input_type -> apricot.ImportComponentConfigurationRequest + 1, // 32: apricot.Apricot.InvalidateComponentTemplateCache:input_type -> apricot.Empty + 11, // 33: apricot.Apricot.NewRunNumber:output_type -> apricot.RunNumberResponse + 12, // 34: apricot.Apricot.GetDefaults:output_type -> apricot.StringMap + 12, // 35: apricot.Apricot.GetVars:output_type -> apricot.StringMap + 4, // 36: apricot.Apricot.RawGetRecursive:output_type -> apricot.ComponentResponse + 23, // 37: apricot.Apricot.ListDetectors:output_type -> apricot.DetectorsResponse + 25, // 38: apricot.Apricot.GetHostInventory:output_type -> apricot.HostEntriesResponse + 10, // 39: apricot.Apricot.GetDetectorsInventory:output_type -> apricot.DetectorEntriesResponse + 8, // 40: apricot.Apricot.GetDetectorForHost:output_type -> apricot.DetectorResponse + 23, // 41: apricot.Apricot.GetDetectorsForHosts:output_type -> apricot.DetectorsResponse + 28, // 42: apricot.Apricot.GetCRUCardsForHost:output_type -> apricot.CRUCardsResponse + 30, // 43: apricot.Apricot.GetEndpointsForCRUCard:output_type -> apricot.CRUCardEndpointResponse + 32, // 44: apricot.Apricot.GetLinkIDsForCRUEndpoint:output_type -> apricot.LinkIDsResponse + 34, // 45: apricot.Apricot.GetAliasedLinkIDsForDetector:output_type -> apricot.AliasedLinkIDsResponse + 4, // 46: apricot.Apricot.GetRuntimeEntry:output_type -> apricot.ComponentResponse + 1, // 47: apricot.Apricot.SetRuntimeEntry:output_type -> apricot.Empty + 12, // 48: apricot.Apricot.GetRuntimeEntries:output_type -> apricot.StringMap + 21, // 49: apricot.Apricot.ListRuntimeEntries:output_type -> apricot.ComponentEntriesResponse + 21, // 50: apricot.Apricot.ListComponents:output_type -> apricot.ComponentEntriesResponse + 21, // 51: apricot.Apricot.ListComponentEntries:output_type -> apricot.ComponentEntriesResponse + 4, // 52: apricot.Apricot.GetComponentConfiguration:output_type -> apricot.ComponentResponse + 5, // 53: apricot.Apricot.GetComponentConfigurationWithLastIndex:output_type -> apricot.ComponentResponseWithLastIndex + 2, // 54: apricot.Apricot.ResolveComponentQuery:output_type -> apricot.ComponentQuery + 27, // 55: apricot.Apricot.ImportComponentConfiguration:output_type -> apricot.ImportComponentConfigurationResponse + 1, // 56: apricot.Apricot.InvalidateComponentTemplateCache:output_type -> apricot.Empty + 33, // [33:57] is the sub-list for method output_type + 9, // [9:33] is the sub-list for method input_type 9, // [9:9] is the sub-list for extension type_name 9, // [9:9] is the sub-list for extension extendee 0, // [0:9] is the sub-list for field type_name @@ -2516,6 +2776,54 @@ func file_protos_apricot_proto_init() { return nil } } + file_protos_apricot_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkIDsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LinkIDsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AliasedLinkIDsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_apricot_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AliasedLinkIDsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_apricot_proto_msgTypes[2].OneofWrappers = []interface{}{ (*ComponentRequest_Path)(nil), @@ -2531,7 +2839,7 @@ func file_protos_apricot_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_apricot_proto_rawDesc, NumEnums: 1, - NumMessages: 33, + NumMessages: 37, NumExtensions: 0, NumServices: 1, }, diff --git a/apricot/protos/apricot.proto b/apricot/protos/apricot.proto index 61d727e23..d9729e79b 100644 --- a/apricot/protos/apricot.proto +++ b/apricot/protos/apricot.proto @@ -42,6 +42,8 @@ service Apricot { rpc GetDetectorsForHosts(HostsRequest) returns (DetectorsResponse) {} rpc GetCRUCardsForHost(HostRequest) returns (CRUCardsResponse) {} rpc GetEndpointsForCRUCard(CardRequest) returns (CRUCardEndpointResponse) {} + rpc GetLinkIDsForCRUEndpoint(LinkIDsRequest) returns (LinkIDsResponse) {} + rpc GetAliasedLinkIDsForDetector(AliasedLinkIDsRequest) returns (AliasedLinkIDsResponse) {} // Runtime KV calls rpc GetRuntimeEntry(GetRuntimeEntryRequest) returns (ComponentResponse) {} @@ -226,3 +228,23 @@ message CardRequest { message CRUCardEndpointResponse { string endpoints = 1; } + +message LinkIDsRequest { + string hostname = 1; + string cardSerial = 2; + string endpoint = 3; + bool onlyEnabled = 4; +} + +message LinkIDsResponse { + repeated string linkIDs = 1; +} + +message AliasedLinkIDsRequest { + string detector = 1; + bool onlyEnabled = 2; +} + +message AliasedLinkIDsResponse { + repeated string aliasedLinkIDs = 1; +} \ No newline at end of file diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index e3e5f7206..25f695a15 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v3.15.8 +// - protoc v3.12.4 // source: protos/apricot.proto package apricotpb @@ -53,6 +53,8 @@ const ( Apricot_GetDetectorsForHosts_FullMethodName = "/apricot.Apricot/GetDetectorsForHosts" Apricot_GetCRUCardsForHost_FullMethodName = "/apricot.Apricot/GetCRUCardsForHost" Apricot_GetEndpointsForCRUCard_FullMethodName = "/apricot.Apricot/GetEndpointsForCRUCard" + Apricot_GetLinkIDsForCRUEndpoint_FullMethodName = "/apricot.Apricot/GetLinkIDsForCRUEndpoint" + Apricot_GetAliasedLinkIDsForDetector_FullMethodName = "/apricot.Apricot/GetAliasedLinkIDsForDetector" Apricot_GetRuntimeEntry_FullMethodName = "/apricot.Apricot/GetRuntimeEntry" Apricot_SetRuntimeEntry_FullMethodName = "/apricot.Apricot/SetRuntimeEntry" Apricot_GetRuntimeEntries_FullMethodName = "/apricot.Apricot/GetRuntimeEntries" @@ -82,6 +84,8 @@ type ApricotClient interface { GetDetectorsForHosts(ctx context.Context, in *HostsRequest, opts ...grpc.CallOption) (*DetectorsResponse, error) GetCRUCardsForHost(ctx context.Context, in *HostRequest, opts ...grpc.CallOption) (*CRUCardsResponse, error) GetEndpointsForCRUCard(ctx context.Context, in *CardRequest, opts ...grpc.CallOption) (*CRUCardEndpointResponse, error) + GetLinkIDsForCRUEndpoint(ctx context.Context, in *LinkIDsRequest, opts ...grpc.CallOption) (*LinkIDsResponse, error) + GetAliasedLinkIDsForDetector(ctx context.Context, in *AliasedLinkIDsRequest, opts ...grpc.CallOption) (*AliasedLinkIDsResponse, error) // Runtime KV calls GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) SetRuntimeEntry(ctx context.Context, in *SetRuntimeEntryRequest, opts ...grpc.CallOption) (*Empty, error) @@ -204,6 +208,24 @@ func (c *apricotClient) GetEndpointsForCRUCard(ctx context.Context, in *CardRequ return out, nil } +func (c *apricotClient) GetLinkIDsForCRUEndpoint(ctx context.Context, in *LinkIDsRequest, opts ...grpc.CallOption) (*LinkIDsResponse, error) { + out := new(LinkIDsResponse) + err := c.cc.Invoke(ctx, Apricot_GetLinkIDsForCRUEndpoint_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *apricotClient) GetAliasedLinkIDsForDetector(ctx context.Context, in *AliasedLinkIDsRequest, opts ...grpc.CallOption) (*AliasedLinkIDsResponse, error) { + out := new(AliasedLinkIDsResponse) + err := c.cc.Invoke(ctx, Apricot_GetAliasedLinkIDsForDetector_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *apricotClient) GetRuntimeEntry(ctx context.Context, in *GetRuntimeEntryRequest, opts ...grpc.CallOption) (*ComponentResponse, error) { out := new(ComponentResponse) err := c.cc.Invoke(ctx, Apricot_GetRuntimeEntry_FullMethodName, in, out, opts...) @@ -319,6 +341,8 @@ type ApricotServer interface { GetDetectorsForHosts(context.Context, *HostsRequest) (*DetectorsResponse, error) GetCRUCardsForHost(context.Context, *HostRequest) (*CRUCardsResponse, error) GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) + GetLinkIDsForCRUEndpoint(context.Context, *LinkIDsRequest) (*LinkIDsResponse, error) + GetAliasedLinkIDsForDetector(context.Context, *AliasedLinkIDsRequest) (*AliasedLinkIDsResponse, error) // Runtime KV calls GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) SetRuntimeEntry(context.Context, *SetRuntimeEntryRequest) (*Empty, error) @@ -371,6 +395,12 @@ func (UnimplementedApricotServer) GetCRUCardsForHost(context.Context, *HostReque func (UnimplementedApricotServer) GetEndpointsForCRUCard(context.Context, *CardRequest) (*CRUCardEndpointResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetEndpointsForCRUCard not implemented") } +func (UnimplementedApricotServer) GetLinkIDsForCRUEndpoint(context.Context, *LinkIDsRequest) (*LinkIDsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLinkIDsForCRUEndpoint not implemented") +} +func (UnimplementedApricotServer) GetAliasedLinkIDsForDetector(context.Context, *AliasedLinkIDsRequest) (*AliasedLinkIDsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAliasedLinkIDsForDetector not implemented") +} func (UnimplementedApricotServer) GetRuntimeEntry(context.Context, *GetRuntimeEntryRequest) (*ComponentResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetRuntimeEntry not implemented") } @@ -614,6 +644,42 @@ func _Apricot_GetEndpointsForCRUCard_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Apricot_GetLinkIDsForCRUEndpoint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LinkIDsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetLinkIDsForCRUEndpoint(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Apricot_GetLinkIDsForCRUEndpoint_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetLinkIDsForCRUEndpoint(ctx, req.(*LinkIDsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _Apricot_GetAliasedLinkIDsForDetector_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AliasedLinkIDsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(ApricotServer).GetAliasedLinkIDsForDetector(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Apricot_GetAliasedLinkIDsForDetector_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(ApricotServer).GetAliasedLinkIDsForDetector(ctx, req.(*AliasedLinkIDsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Apricot_GetRuntimeEntry_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetRuntimeEntryRequest) if err := dec(in); err != nil { @@ -863,6 +929,14 @@ var Apricot_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetEndpointsForCRUCard", Handler: _Apricot_GetEndpointsForCRUCard_Handler, }, + { + MethodName: "GetLinkIDsForCRUEndpoint", + Handler: _Apricot_GetLinkIDsForCRUEndpoint_Handler, + }, + { + MethodName: "GetAliasedLinkIDsForDetector", + Handler: _Apricot_GetAliasedLinkIDsForDetector_Handler, + }, { MethodName: "GetRuntimeEntry", Handler: _Apricot_GetRuntimeEntry_Handler, diff --git a/apricot/remote/server.go b/apricot/remote/server.go index 0936d83bf..53baffc91 100644 --- a/apricot/remote/server.go +++ b/apricot/remote/server.go @@ -281,6 +281,46 @@ func (m *RpcServer) GetEndpointsForCRUCard(_ context.Context, request *apricotpb return &apricotpb.CRUCardEndpointResponse{Endpoints: endpointsSpaceSeparated}, E_OK.Err() } +func (m *RpcServer) GetLinkIDsForCRUEndpoint(_ context.Context, request *apricotpb.LinkIDsRequest) (*apricotpb.LinkIDsResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + linkIDs, err := m.service.GetLinkIDsForCRUEndpoint( + request.GetHostname(), + request.GetCardSerial(), + request.GetEndpoint(), + request.GetOnlyEnabled(), + ) + if err != nil { + return nil, err + } + return &apricotpb.LinkIDsResponse{LinkIDs: linkIDs}, E_OK.Err() +} + +func (m *RpcServer) GetAliasedLinkIDsForDetector(_ context.Context, request *apricotpb.AliasedLinkIDsRequest) (*apricotpb.AliasedLinkIDsResponse, error) { + if m == nil || m.service == nil { + return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE + } + m.logMethod() + if request == nil { + return nil, E_BAD_INPUT + } + + aliasedLinkIDs, err := m.service.GetAliasedLinkIDsForDetector( + request.GetDetector(), + request.GetOnlyEnabled(), + ) + if err != nil { + return nil, err + } + return &apricotpb.AliasedLinkIDsResponse{AliasedLinkIDs: aliasedLinkIDs}, E_OK.Err() +} + func (m *RpcServer) GetRuntimeEntry(_ context.Context, request *apricotpb.GetRuntimeEntryRequest) (*apricotpb.ComponentResponse, error) { if m == nil || m.service == nil { return nil, E_CONFIGURATION_BACKEND_UNAVAILABLE diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 1c6c42b0e..974e604e3 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -234,6 +234,31 @@ func (c *RemoteService) GetEndpointsForCRUCard(hostname, cardSerial string) (end return endpoints, nil } +func (c *RemoteService) GetLinkIDsForCRUEndpoint(hostname, cardSerial, endpoint string, onlyEnabled bool) ([]string, error) { + request := &apricotpb.LinkIDsRequest{ + Hostname: hostname, + CardSerial: cardSerial, + Endpoint: endpoint, + } + response, err := c.cli.GetLinkIDsForCRUEndpoint(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetLinkIDs(), nil +} + +func (c *RemoteService) GetAliasedLinkIDsForDetector(detector string, onlyEnabled bool) ([]string, error) { + request := &apricotpb.AliasedLinkIDsRequest{ + Detector: detector, + OnlyEnabled: onlyEnabled, + } + response, err := c.cli.GetAliasedLinkIDsForDetector(context.Background(), request, grpc.EmptyCallOption{}) + if err != nil { + return nil, err + } + return response.GetAliasedLinkIDs(), nil +} + func (c *RemoteService) GetRuntimeEntry(component string, key string) (payload string, err error) { var response *apricotpb.ComponentResponse request := &apricotpb.GetRuntimeEntryRequest{ diff --git a/configuration/service.go b/configuration/service.go index 0c3bfa0df..ac9be5b70 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -59,6 +59,8 @@ type Service interface { GetDetectorsForHosts(hosts []string) ([]string, error) GetCRUCardsForHost(hostname string) ([]string, error) GetEndpointsForCRUCard(hostname, cardSerial string) ([]string, error) + GetLinkIDsForCRUEndpoint(host string, cruId string, endpoint string, onlyEnabled bool) (ids []string, err error) + GetAliasedLinkIDsForDetector(detector string, onlyEnabled bool) (aliasedLinkIds []string, err error) RawGetRecursive(path string) (string, error) } From bf0e386cefe2b8fd81279bb7301b654a5d7cbf60 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Feb 2025 12:38:37 +0100 Subject: [PATCH 2081/2352] [core] DCS: send enabled link IDs for selected detectors It is activated with '_dcs_send_enabled_links' variable. OCTRL-980 --- core/integration/dcs/dcsutil.go | 20 ++++++++++++++++++++ core/integration/dcs/plugin.go | 11 +++++++++++ 2 files changed, 31 insertions(+) diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go index 764e41016..86094b74c 100644 --- a/core/integration/dcs/dcsutil.go +++ b/core/integration/dcs/dcsutil.go @@ -26,6 +26,8 @@ package dcs import ( "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/core/the" "strings" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" @@ -51,6 +53,24 @@ func resolveDefaults(detectorArgMap map[string]string, varStack map[string]strin return detectorArgMap } +func addEnabledLinks(detectorArgMap map[string]string, varStack map[string]string, ecsDetector string, theLog *logrus.Entry) map[string]string { + sendDetLinks, ok := varStack[ecsDetector+"_dcs_send_enabled_links"] + if !ok || sendDetLinks != "true" { + return detectorArgMap + } + linkIDs, err := the.ConfSvc().GetAliasedLinkIDsForDetector(ecsDetector, true) + if err != nil { + theLog.WithError(err).Errorf("failed to get aliased link IDs for detector '%s'", ecsDetector) + return detectorArgMap + } + linksJoined := strings.Join(linkIDs, ",") + theLog.WithField(infologger.Level, infologger.IL_Devel). + Infof("adding enabled link IDs for detector '%s' to DCS payload '%s'", ecsDetector, linksJoined) + detectorArgMap["ddl_list"] = linksJoined + + return detectorArgMap +} + func ecsToDcsDetector(ecsDetector string) (dcspb.Detector, error) { var err error det := strings.ToUpper(strings.TrimSpace(ecsDetector)) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 122ecb886..0b070392e 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -664,6 +664,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "PrepareForRun"). WithField("detector", ecsDet)) + detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, + log.WithField("partition", envId). + WithField("call", "PrepareForRun"). + WithField("detector", ecsDet)) + in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, ExtraParameters: detectorArgMap, @@ -1365,6 +1370,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("run", runNumber64)) + detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, + log.WithField("partition", envId). + WithField("call", "StartOfRun"). + WithField("detector", ecsDet). + WithField("run", runNumber64)) + in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, ExtraParameters: detectorArgMap, From 02e5d7f422dc80cc2a9600fedede7853c840e2a3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 28 Feb 2025 10:28:27 +0100 Subject: [PATCH 2082/2352] [core] ODC: Send SOR/EOR timestamps as FMQ properties OCTRL-987 --- core/integration/odc/handlers.go | 49 ++++++++++++++++++++++++-------- core/integration/odc/plugin.go | 33 +++++++++++++++------ docs/handbook/configuration.md | 5 +++- 3 files changed, 65 insertions(+), 22 deletions(-) diff --git a/core/integration/odc/handlers.go b/core/integration/odc/handlers.go index 85869c1d0..6727c1af3 100644 --- a/core/integration/odc/handlers.go +++ b/core/integration/odc/handlers.go @@ -97,17 +97,10 @@ func handleGetState(ctx context.Context, odcClient *RpcClient, envId string) (st return odcutils.StateForOdcState(newState), err } -func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { - defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) +func setProperties(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { var err error = nil - var rep *odcpb.StateReply - - if envId == "" { - return errors.New("cannot proceed with empty environment id") - } - // SetProperties before START setPropertiesRequest := &odcpb.SetPropertiesRequest{ Partitionid: envId, Path: "", @@ -252,6 +245,25 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string }). Debug("call to ODC complete: odc.SetProperties") + return nil +} + +func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { + defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) + + var err error = nil + var rep *odcpb.StateReply + + if envId == "" { + return errors.New("cannot proceed with empty environment id") + } + + // SetProperties before START + err = setProperties(ctx, odcClient, arguments, paddingTimeout, envId, runNumber, call) + if err != nil { + return err + } + // The actual START operation starts here req := &odcpb.StartRequest{ Request: &odcpb.StateRequest{ @@ -262,15 +274,15 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string }, } // We ask this ODC call to complete within our own DEADLINE, minus 1 second - ctxDeadline, ok = ctx.Deadline() + ctxDeadline, ok := ctx.Deadline() if ok { req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } - payload = map[string]interface{}{ + payload := map[string]interface{}{ "odcRequest": &req, } - payloadJson, _ = json.Marshal(payload) + payloadJson, _ := json.Marshal(payload) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, @@ -382,6 +394,20 @@ func handleStart(ctx context.Context, odcClient *RpcClient, arguments map[string func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string]string, paddingTimeout time.Duration, envId string, runNumber uint64, call *callable.Call) error { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient").WithField("partition", envId)) + var err error = nil + + // SetProperties before STOP + if len(arguments) > 0 { + err = setProperties(ctx, odcClient, arguments, paddingTimeout, envId, runNumber, call) + if err != nil { + log.WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithError(err). + Warn("setProperties call to ODC failed. will continue with odc.Stop") + } + } + + // The actual STOP operation starts here req := &odcpb.StopRequest{ Request: &odcpb.StateRequest{ Partitionid: envId, @@ -396,7 +422,6 @@ func handleStop(ctx context.Context, odcClient *RpcClient, arguments map[string] req.Request.Timeout = uint32((time.Until(ctxDeadline) - paddingTimeout).Seconds()) } - var err error = nil var rep *odcpb.StateReply if envId == "" { diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 55b0a22ad..502b57231 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1363,6 +1363,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Start"). Warn("cannot acquire FairMQ devices cleanup count for ODC") } + runStartTimeMs, ok := varStack["run_start_time_ms"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Start"). + Warn("cannot acquire run_start_time_ms") + } var ( runNumberu64 uint64 @@ -1391,6 +1397,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments := make(map[string]string) arguments["run_number"] = rn arguments["runNumber"] = rn + arguments["run_start_time_ms"] = runStartTimeMs arguments["cleanup"] = strconv.Itoa(cleanupCount) ctx, cancel := context.WithTimeout(context.Background(), timeout) @@ -1409,32 +1416,40 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } stack["Stop"] = func() (out string) { // ODC Stop + callFailedStr := "EPN Stop call failed" + var ( + runNumberu64 uint64 + err error + ) rn, ok := varStack["run_number"] if !ok { log.WithField("partition", envId). WithField("call", "Start"). - Warn("cannot acquire run number for ODC") + Warn("cannot acquire run number for ODC Stop") } - var ( - runNumberu64 uint64 - err error - ) - callFailedStr := "EPN Stop call failed" - runNumberu64, err = strconv.ParseUint(rn, 10, 32) if err != nil { log.WithField("partition", envId). WithError(err). - Error("cannot acquire run number for DCS SOR") + Error("cannot acquire run number for ODC EOR") runNumberu64 = 0 } + runEndTimeMs, ok := varStack["run_end_time_ms"] + if !ok { + log.WithField("partition", envId). + WithField("call", "Start"). + Warn("cannot acquire run_end_time_ms") + } + + arguments := make(map[string]string) + arguments["run_end_time_ms"] = runEndTimeMs timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() - err = handleStop(ctx, p.odcClient, nil, paddingTimeout, envId, runNumberu64, call) + err = handleStop(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 5168e4a90..cf0024fe7 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -455,7 +455,10 @@ In addition to the above, which varies depending on the configuration of the env * `pdp_beam_type` * `pdp_override_run_start_time` -FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` transition via `SetProperty` calls. +The following values are pushed by AliECS during `STOP_ACTIVITY`: + * `run_end_time_ms` + +FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` and `STOP` transitions via `SetProperty` calls. ## Resource wants and limits From 2e39064abe79ba73689646db1b2d30e3a26ac722 Mon Sep 17 00:00:00 2001 From: Teo Mrnjavac Date: Wed, 5 Mar 2025 16:04:21 +0100 Subject: [PATCH 2083/2352] [core] Ensure doNewEnvironmentAsync gets its own copy of args --- core/server.go | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/core/server.go b/core/server.go index b2eeb072a..e44258314 100644 --- a/core/server.go +++ b/core/server.go @@ -28,6 +28,7 @@ package core import ( "encoding/json" + "maps" "runtime" "sort" "strconv" @@ -294,26 +295,23 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm return r, nil } -func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEnvironmentRequest, id uid.ID) { +func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, userVars map[string]string, requestUser *evpb.User, workflowTemplate string, public bool, autoTransition bool, id uid.ID) { var err error - userVars := request.GetVars() - if len(userVars) == 0 { - userVars = make(map[string]string) - } + // we store the last known request user in the environment - lastRequestUserJ, _ := json.Marshal(request.RequestUser) + lastRequestUserJ, _ := json.Marshal(requestUser) userVars["last_request_user"] = string(lastRequestUserJ[:]) - id, err = m.state.environments.CreateEnvironment(request.GetWorkflowTemplate(), userVars, request.GetPublic(), id, request.GetAutoTransition()) + id, err = m.state.environments.CreateEnvironment(workflowTemplate, userVars, public, id, autoTransition) if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: id.String(), State: "ERROR", Error: "cannot create new environment", Message: err.Error(), - LastRequestUser: request.RequestUser, + LastRequestUser: requestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ - Public: request.GetPublic(), - Path: request.GetWorkflowTemplate(), + Public: public, + Path: workflowTemplate, }, }) return @@ -326,10 +324,10 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEn State: "ERROR", Error: "cannot get newly created environment", Message: err.Error(), - LastRequestUser: request.RequestUser, + LastRequestUser: requestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ - Public: request.GetPublic(), - Path: request.GetWorkflowTemplate(), + Public: public, + Path: workflowTemplate, }, }) return @@ -338,7 +336,7 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, request *pb.NewEn the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: id.String(), State: newEnv.CurrentState(), - LastRequestUser: request.RequestUser, + LastRequestUser: requestUser, WorkflowTemplateInfo: newEnv.GetWorkflowInfo(), }) return @@ -351,7 +349,11 @@ func (m *RpcServer) NewEnvironmentAsync(cxt context.Context, request *pb.NewEnvi // Create new Environment instance with some roles, we get back a UUID id := uid.New() - go m.doNewEnvironmentAsync(cxt, request, id) + // We must make a copy of the userVars, otherwise there will be a race for access with gRPC + userVars := make(map[string]string) + if len(request.GetVars()) > 0 { + maps.Copy(userVars, request.GetVars()) + } ei := &pb.EnvironmentInfo{ Id: id.String(), @@ -362,6 +364,9 @@ func (m *RpcServer) NewEnvironmentAsync(cxt context.Context, request *pb.NewEnvi Environment: ei, Public: request.GetPublic(), } + + go m.doNewEnvironmentAsync(cxt, userVars, request.GetRequestUser(), request.GetWorkflowTemplate(), request.GetPublic(), request.GetAutoTransition(), id) + return } From 54935c1210eb7d555d6dcd9f2171fee9f7a43f04 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 6 Mar 2025 10:38:25 +0100 Subject: [PATCH 2084/2352] [build] Bump to v1.28.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7acfdee23..d607147d8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 27 +VERSION_MINOR := 28 VERSION_PATCH := 0 From 086ecd0b621665c6bda043ebad29fbc6b3a49360 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 12 Mar 2025 10:29:17 +0100 Subject: [PATCH 2085/2352] [core] sending enabled links to DCS should require a lower-case var It's a small bug, which required the users to use a variable `TOF_dcs_send_enabled_links` instead of `tof_dcs_send_enabled_links` to enable the feature brought in OCTRL-980. Now we require lower-case detector code. OCTRL-994 --- apricot/local/service_test.go | 14 ++++++++++++++ core/integration/dcs/dcsutil.go | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go index 9f892e740..4f6112220 100644 --- a/apricot/local/service_test.go +++ b/apricot/local/service_test.go @@ -410,6 +410,13 @@ var _ = Describe("local service", func() { Expect(err).To(HaveOccurred()) }) }) + When("retrieving the detector spelled lower-case for a host", func() { + // not supported + It("should produce an error", func() { + detector, err = svc.GetDetectorForHost("abc") + Expect(err).To(HaveOccurred()) + }) + }) }) Describe("getting detectors for hosts", func() { var ( @@ -550,6 +557,13 @@ var _ = Describe("local service", func() { Expect(err).To(HaveOccurred()) }) }) + When("retrieving the link IDs for a detector spelled lower-case", func() { + // not supported + It("should produce an error", func() { + linkIDs, err = svc.GetAliasedLinkIDsForDetector("abc", false) + Expect(err).To(HaveOccurred()) + }) + }) When("retrieving the link IDs for a detector without readoutcard config", func() { It("should produce an error", func() { linkIDs, err = svc.GetAliasedLinkIDsForDetector("DEF", false) diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go index 86094b74c..d6667f7ad 100644 --- a/core/integration/dcs/dcsutil.go +++ b/core/integration/dcs/dcsutil.go @@ -54,7 +54,7 @@ func resolveDefaults(detectorArgMap map[string]string, varStack map[string]strin } func addEnabledLinks(detectorArgMap map[string]string, varStack map[string]string, ecsDetector string, theLog *logrus.Entry) map[string]string { - sendDetLinks, ok := varStack[ecsDetector+"_dcs_send_enabled_links"] + sendDetLinks, ok := varStack[strings.ToLower(ecsDetector)+"_dcs_send_enabled_links"] if !ok || sendDetLinks != "true" { return detectorArgMap } From 688903842aeb7fd4717f69164c1254f0a5fa2051 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 12 Mar 2025 12:08:08 +0100 Subject: [PATCH 2086/2352] utils/helpers unit test A small unit test I forgot to include in some past commit. --- common/utils/utils_test.go | 46 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 common/utils/utils_test.go diff --git a/common/utils/utils_test.go b/common/utils/utils_test.go new file mode 100644 index 000000000..5669b89d2 --- /dev/null +++ b/common/utils/utils_test.go @@ -0,0 +1,46 @@ +package utils + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("Utils", func() { + Describe("ExtractTaskClassNameFromTaskName", func() { + It("should extract the correct task class name", func() { + result, err := ExtractTaskClassName("alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows/tasks/readout@12b11ac4bb652e1835e3e94806a688c951691d5f#2sP21PjpfCQ") + Expect(err).ToNot(HaveOccurred()) + Expect(result).To(Equal("readout")) + }) + + It("should extract the correct JIT task class name", func() { + result, err := ExtractTaskClassName("alio2-cr1-hv-gw01.cern.ch:/opt/git/ControlWorkflows/tasks/jit-ad6f2b64b7502198430d7d7f93f15bf94c088cab-qc-pp-TPC-CalibQC_long@12b11ac4bb652e1835e3e94806a688c951691d5f#2sP21PjpfCQ") + Expect(err).ToNot(HaveOccurred()) + Expect(result).To(Equal("jit-ad6f2b64b7502198430d7d7f93f15bf94c088cab-qc-pp-TPC-CalibQC_long")) + }) + + It("should return an error for invalid input", func() { + result, err := ExtractTaskClassName("invalid-string") + Expect(err).To(HaveOccurred()) + Expect(result).To(Equal("")) + }) + }) + + Describe("TrimJitPrefix", func() { + It("should remove the JIT prefix correctly", func() { + result := TrimJitPrefix("jit-ad6f2b64b7502198430d7d7f93f15bf94c088cab-qc-pp-TPC-CalibQC_long") + Expect(result).To(Equal("qc-pp-TPC-CalibQC_long")) + }) + + It("should return the original string if no JIT prefix is present", func() { + result := TrimJitPrefix("qc-pp-TPC-CalibQC_long") + Expect(result).To(Equal("qc-pp-TPC-CalibQC_long")) + }) + }) +}) + +func TestUtils(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Component Utils Test Suite") +} From a230b253aea5092493a84f8d7956cc922fb987d4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 13 Mar 2025 10:05:15 +0100 Subject: [PATCH 2087/2352] [build] Bump to v1.28.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d607147d8..57aa229dd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 28 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 5a02fd3b5fe6d2fc136526907ea2ab9a00efc50a Mon Sep 17 00:00:00 2001 From: rdivia <26787675+rdivia@users.noreply.github.com> Date: Thu, 13 Mar 2025 12:55:19 +0100 Subject: [PATCH 2088/2352] Added deep cleanup procedure (enabled by default). --- o2-aliecs-shmcleaner | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/o2-aliecs-shmcleaner b/o2-aliecs-shmcleaner index ce3bda1f8..a0fec0a35 100644 --- a/o2-aliecs-shmcleaner +++ b/o2-aliecs-shmcleaner @@ -94,7 +94,15 @@ done rm -f /dev/shm/*fmq* # Cleanup any ROC-allocated memory -yes | roc-cleanup --light > /dev/null 3>&1 +if false; then + # This is the standard cleanup procedure + yes | roc-cleanup --light > /dev/null 3>&1 +else + # This is the deep cleanup procedure, it can break ALF/FRED and should not be used unless really necessary + systemctl stop o2-alf + yes | roc-cleanup > /dev/null 3>&1 + systemctl start o2-alf +fi memEnd="`grep MemAvailable /proc/meminfo | sed 's/.*: *//'`" memDelta=$(( `echo ${memEnd} | awk '{print $1;}'`- `echo ${memStart} | awk '{print $1;}'` )) From 74d5eee43b206f6f98a0b7c4b67e1b551b6efb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 13 Mar 2025 14:46:25 +0100 Subject: [PATCH 2089/2352] [core] OCTRL-989 - removed `vars` from Ev_RunEvent - changing status and state of Task in kafka message only if event contains them - properly filling `traits` in Ev_TaskEvent from task.Traits --- common/protos/events.proto | 6 +++--- core/environment/environment.go | 8 -------- core/environment/manager.go | 13 ++++--------- core/task/task.go | 24 ++++++++++++++++++------ 4 files changed, 25 insertions(+), 26 deletions(-) diff --git a/common/protos/events.proto b/common/protos/events.proto index cc6940a18..66b6fe0c4 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -78,7 +78,7 @@ message Ev_TaskEvent { string name = 1; // task name, based on the name of the task class string taskid = 2; // task id, unique string state = 3; // state machine state for this task - string status = 4; // active/inactive etc. + string status = 4; // posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. string hostname = 5; string className = 6; // name of the task class from which this task was spawned Traits traits = 7; @@ -99,7 +99,7 @@ message Ev_CallEvent { message Ev_RoleEvent { string name = 1; // role name - string status = 2; // active/inactive etc., derived from the state of child tasks, calls or other roles + string status = 2; // posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. Derived from the state of child tasks, calls or other roles string state = 3; // state machine state for this role string rolePath = 4; // path to this role within the environment string environmentId = 5; @@ -123,7 +123,7 @@ message Ev_RunEvent { string error = 4; string transition = 5; OpStatus transitionStatus = 6; - map vars = 7; + reserved 7; // 7 was used for `vars` field that was removed common.User lastRequestUser = 8; } diff --git a/core/environment/environment.go b/core/environment/environment.go index 68dc56498..cbfb16b2e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -160,7 +160,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, }, fsm.Callbacks{ "before_event": func(_ context.Context, e *fsm.Event) { - env.Mu.Lock() env.currentTransition = e.Event env.Mu.Unlock() @@ -224,7 +223,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), }, runStartTime) @@ -265,7 +263,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), }, runEndTime) @@ -287,7 +284,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_STARTED, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), }, runEndTime) @@ -552,7 +548,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), } if e.Err != nil { @@ -574,7 +569,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), } if e.Err != nil { @@ -600,7 +594,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: "", Transition: e.Event, TransitionStatus: pb.OpStatus_DONE_OK, - Vars: nil, LastRequestUser: env.GetLastRequestUser(), }, runEndCompletionTime) @@ -648,7 +641,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weightPredicate func(callable.HookWeight) bool) (err error) { - // Starting point: get all hooks to be started for the current trigger hooksMapForTrigger := workflow.GetHooksMapForTrigger(trigger) callsMapForAwait := env.callsPendingAwait[trigger] diff --git a/core/environment/manager.go b/core/environment/manager.go index 3a928e179..0f239b739 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -61,9 +61,7 @@ type Manager struct { pendingStateChangeCh map[uid.ID]chan *event.TasksStateChangedEvent } -var ( - instance *Manager -) +var instance *Manager func ManagerInstance() *Manager { return instance @@ -145,7 +143,7 @@ func NewEnvManager(tm *task.Manager, incomingEventCh chan event.Event) *Manager // If there is no pending environment teardown, it means that the released task stopped // unexpectedly. In that case, the environment should get torn-down only if the task // is critical. - var releaseCriticalTask = false + releaseCriticalTask := false for _, v := range typedEvent.GetTaskIds() { if tm.GetTask(v) != nil { if tm.GetTask(v).GetTraits().Critical == true { @@ -407,7 +405,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] err = env.TryTransition(NewDeployTransition( envs.taskman, - nil, //roles, + nil, // roles, nil), ) @@ -647,7 +645,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error Error: "", Transition: "TEARDOWN", TransitionStatus: evpb.OpStatus_STARTED, - Vars: nil, }, runEndTime) } else { log.WithField("partition", environmentId.String()). @@ -667,7 +664,6 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error Error: "", Transition: "TEARDOWN", TransitionStatus: evpb.OpStatus_STARTED, - Vars: nil, }, runEndCompletionTime) } else { log.WithField("partition", environmentId.String()). @@ -1172,7 +1168,6 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { // FIXME: this function should be deduplicated with CreateEnvironment so detector resource matching works correctly func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[string]string, newId uid.ID, sub Subscription) { - envUserVars := make(map[string]string) workflowUserVars := make(map[string]string) for k, v := range userVars { @@ -1296,7 +1291,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str err = env.TryTransition(NewDeployTransition( envs.taskman, - nil, //roles, + nil, // roles, nil), ) if err == nil { diff --git a/core/task/task.go b/core/task/task.go index 825dcfc6a..d7420a4e3 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -54,7 +54,7 @@ import ( "github.com/AliceO2Group/Control/core/task/taskclass" "github.com/AliceO2Group/Control/core/task/taskclass/port" "github.com/AliceO2Group/Control/core/the" - "github.com/mesos/mesos-go/api/v1/lib" + mesos "github.com/mesos/mesos-go/api/v1/lib" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -112,7 +112,7 @@ type Task struct { mu sync.RWMutex parent parentRole className string - //configuration Descriptor + // configuration Descriptor name string hostname string agentId string @@ -501,6 +501,15 @@ func (t *Task) GetEnvironmentId() uid.ID { return t.parent.GetEnvironmentId() } +func traitsToPbTraits(traits Traits) *evpb.Traits { + return &evpb.Traits{ + Trigger: traits.Trigger, + Await: traits.Await, + Timeout: traits.Timeout, + Critical: traits.Critical, + } +} + func (t *Task) SendEvent(ev event.Event) { if t == nil { return @@ -516,6 +525,7 @@ func (t *Task) SendEvent(ev event.Event) { Hostname: t.hostname, ClassName: t.className, Path: t.getParentRolePath(), + Traits: traitsToPbTraits(t.GetTraits()), } if t.parent == nil { @@ -527,8 +537,12 @@ func (t *Task) SendEvent(ev event.Event) { taskEvent, ok := ev.(*event.TaskEvent) if ok { - outgoingEvent.State = taskEvent.State - outgoingEvent.Status = taskEvent.Status + if len(taskEvent.State) != 0 { + outgoingEvent.State = taskEvent.State + } + if len(taskEvent.Status) != 0 { + outgoingEvent.Status = taskEvent.Status + } } the.EventWriterWithTopic(topic.Task).WriteEvent(outgoingEvent) @@ -658,7 +672,6 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // __ptree__:: with the plain payload. keysToDelete := make([]string, 0) for k, v := range propMap { - if strings.HasPrefix(v, "__ptree__:") { keysToDelete = append(keysToDelete, k, v) splitValue := strings.Split(v, ":") @@ -671,7 +684,6 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand delete(propMap, k) } } - } return propMap, err } From 71dbbe78d69c6a830964de1aca8a282f8b948599 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 13 Mar 2025 16:03:03 +0100 Subject: [PATCH 2090/2352] [core] Added timestamp to all gRPC calls --- coconut/protos/o2control.pb.go | 1565 ++++++++++++++++++-------------- core/protos/o2control.pb.go | 1565 ++++++++++++++++++-------------- core/protos/o2control.proto | 20 +- core/server.go | 98 +- docs/apidocs_aliecs.md | 24 + docs/apidocs_apricot.md | 70 ++ 6 files changed, 1933 insertions(+), 1409 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index a88fe1b2f..99d90d49c 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -496,6 +496,7 @@ type GetFrameworkInfoReply struct { DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` + Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -607,6 +608,13 @@ func (x *GetFrameworkInfoReply) GetAvailableDetectors() []string { return nil } +func (x *GetFrameworkInfoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -758,6 +766,7 @@ type GetEnvironmentsReply struct { FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetEnvironmentsReply) Reset() { @@ -806,6 +815,13 @@ func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { return nil } +func (x *GetEnvironmentsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type EnvironmentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1075,6 +1091,7 @@ type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *NewEnvironmentReply) Reset() { @@ -1123,6 +1140,13 @@ func (x *NewEnvironmentReply) GetPublic() bool { return false } +func (x *NewEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1198,6 +1222,8 @@ type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *NewAutoEnvironmentReply) Reset() { @@ -1232,6 +1258,13 @@ func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{12} } +func (x *NewAutoEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1295,6 +1328,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetEnvironmentReply) Reset() { @@ -1350,6 +1384,13 @@ func (x *GetEnvironmentReply) GetPublic() bool { return false } +func (x *GetEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ControlEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1425,6 +1466,7 @@ type ControlEnvironmentReply struct { StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` + Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1501,6 +1543,13 @@ func (x *ControlEnvironmentReply) GetTransitionDuration() int64 { return 0 } +func (x *ControlEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ModifyEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1767,6 +1816,7 @@ type DestroyEnvironmentReply struct { unknownFields protoimpl.UnknownFields CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *DestroyEnvironmentReply) Reset() { @@ -1808,12 +1858,20 @@ func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +func (x *DestroyEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetActiveDetectorsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetActiveDetectorsReply) Reset() { @@ -1855,12 +1913,20 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } +func (x *GetActiveDetectorsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetAvailableDetectorsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetAvailableDetectorsReply) Reset() { @@ -1902,6 +1968,13 @@ func (x *GetAvailableDetectorsReply) GetDetectors() []string { return nil } +func (x *GetAvailableDetectorsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // ////////////////////////////////////// // Environment, GET/SET properties // ////////////////////////////////////// @@ -2357,7 +2430,8 @@ type GetTasksReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetTasksReply) Reset() { @@ -2399,6 +2473,13 @@ func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { return nil } +func (x *GetTasksReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetTaskRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2451,7 +2532,8 @@ type GetTaskReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetTaskReply) Reset() { @@ -2493,6 +2575,13 @@ func (x *GetTaskReply) GetTask() *TaskInfo { return nil } +func (x *GetTaskReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type CommandInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2784,6 +2873,7 @@ type CleanupTasksReply struct { KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *CleanupTasksReply) Reset() { @@ -2832,6 +2922,13 @@ func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { return nil } +func (x *CleanupTasksReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // ////////////////////////////////////// // Roles // ////////////////////////////////////// @@ -3022,7 +3119,8 @@ type GetRolesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetRolesReply) Reset() { @@ -3064,6 +3162,13 @@ func (x *GetRolesReply) GetRoles() []*RoleInfo { return nil } +func (x *GetRolesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetWorkflowTemplatesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3355,6 +3460,7 @@ type GetWorkflowTemplatesReply struct { unknownFields protoimpl.UnknownFields WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetWorkflowTemplatesReply) Reset() { @@ -3396,6 +3502,13 @@ func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateIn return nil } +func (x *GetWorkflowTemplatesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ListReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3521,6 +3634,7 @@ type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ListReposReply) Reset() { @@ -3569,6 +3683,13 @@ func (x *ListReposReply) GetGlobalDefaultRevision() string { return "" } +func (x *ListReposReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type AddRepoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3631,6 +3752,7 @@ type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *AddRepoReply) Reset() { @@ -3679,6 +3801,13 @@ func (x *AddRepoReply) GetInfo() string { return "" } +func (x *AddRepoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type RemoveRepoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3732,6 +3861,7 @@ type RemoveRepoReply struct { unknownFields protoimpl.UnknownFields NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *RemoveRepoReply) Reset() { @@ -3773,6 +3903,13 @@ func (x *RemoveRepoReply) GetNewDefaultRepo() string { return "" } +func (x *RemoveRepoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type RefreshReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3974,7 +4111,8 @@ type SetRepoDefaultRevisionReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *SetRepoDefaultRevisionReply) Reset() { @@ -4016,6 +4154,13 @@ func (x *SetRepoDefaultRevisionReply) GetInfo() string { return "" } +func (x *SetRepoDefaultRevisionReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type Empty struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4059,7 +4204,8 @@ type ListIntegratedServicesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ListIntegratedServicesReply) Reset() { @@ -4101,6 +4247,13 @@ func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServic return nil } +func (x *ListIntegratedServicesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type IntegratedServiceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4200,7 +4353,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, + 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xef, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, @@ -4230,713 +4383,749 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, - 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, - 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, - 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, + 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, + 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, + 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, + 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, + 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, + 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, - 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, + 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, + 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x19, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, - 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, + 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, + 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, + 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, - 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, - 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, - 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, - 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, - 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, - 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, - 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, + 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, - 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, + 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, + 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index a88fe1b2f..99d90d49c 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -496,6 +496,7 @@ type GetFrameworkInfoReply struct { DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` + Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetFrameworkInfoReply) Reset() { @@ -607,6 +608,13 @@ func (x *GetFrameworkInfoReply) GetAvailableDetectors() []string { return nil } +func (x *GetFrameworkInfoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // Not implemented yet type TeardownRequest struct { state protoimpl.MessageState @@ -758,6 +766,7 @@ type GetEnvironmentsReply struct { FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetEnvironmentsReply) Reset() { @@ -806,6 +815,13 @@ func (x *GetEnvironmentsReply) GetEnvironments() []*EnvironmentInfo { return nil } +func (x *GetEnvironmentsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type EnvironmentInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1075,6 +1091,7 @@ type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *NewEnvironmentReply) Reset() { @@ -1123,6 +1140,13 @@ func (x *NewEnvironmentReply) GetPublic() bool { return false } +func (x *NewEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type NewAutoEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1198,6 +1222,8 @@ type NewAutoEnvironmentReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *NewAutoEnvironmentReply) Reset() { @@ -1232,6 +1258,13 @@ func (*NewAutoEnvironmentReply) Descriptor() ([]byte, []int) { return file_protos_o2control_proto_rawDescGZIP(), []int{12} } +func (x *NewAutoEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1295,6 +1328,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetEnvironmentReply) Reset() { @@ -1350,6 +1384,13 @@ func (x *GetEnvironmentReply) GetPublic() bool { return false } +func (x *GetEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ControlEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1425,6 +1466,7 @@ type ControlEnvironmentReply struct { StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` + Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ControlEnvironmentReply) Reset() { @@ -1501,6 +1543,13 @@ func (x *ControlEnvironmentReply) GetTransitionDuration() int64 { return 0 } +func (x *ControlEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ModifyEnvironmentRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1767,6 +1816,7 @@ type DestroyEnvironmentReply struct { unknownFields protoimpl.UnknownFields CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *DestroyEnvironmentReply) Reset() { @@ -1808,12 +1858,20 @@ func (x *DestroyEnvironmentReply) GetCleanupTasksReply() *CleanupTasksReply { return nil } +func (x *DestroyEnvironmentReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetActiveDetectorsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetActiveDetectorsReply) Reset() { @@ -1855,12 +1913,20 @@ func (x *GetActiveDetectorsReply) GetDetectors() []string { return nil } +func (x *GetActiveDetectorsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetAvailableDetectorsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetAvailableDetectorsReply) Reset() { @@ -1902,6 +1968,13 @@ func (x *GetAvailableDetectorsReply) GetDetectors() []string { return nil } +func (x *GetAvailableDetectorsReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // ////////////////////////////////////// // Environment, GET/SET properties // ////////////////////////////////////// @@ -2357,7 +2430,8 @@ type GetTasksReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetTasksReply) Reset() { @@ -2399,6 +2473,13 @@ func (x *GetTasksReply) GetTasks() []*ShortTaskInfo { return nil } +func (x *GetTasksReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetTaskRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2451,7 +2532,8 @@ type GetTaskReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetTaskReply) Reset() { @@ -2493,6 +2575,13 @@ func (x *GetTaskReply) GetTask() *TaskInfo { return nil } +func (x *GetTaskReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type CommandInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2784,6 +2873,7 @@ type CleanupTasksReply struct { KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *CleanupTasksReply) Reset() { @@ -2832,6 +2922,13 @@ func (x *CleanupTasksReply) GetRunningTasks() []*ShortTaskInfo { return nil } +func (x *CleanupTasksReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + // ////////////////////////////////////// // Roles // ////////////////////////////////////// @@ -3022,7 +3119,8 @@ type GetRolesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetRolesReply) Reset() { @@ -3064,6 +3162,13 @@ func (x *GetRolesReply) GetRoles() []*RoleInfo { return nil } +func (x *GetRolesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type GetWorkflowTemplatesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3355,6 +3460,7 @@ type GetWorkflowTemplatesReply struct { unknownFields protoimpl.UnknownFields WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *GetWorkflowTemplatesReply) Reset() { @@ -3396,6 +3502,13 @@ func (x *GetWorkflowTemplatesReply) GetWorkflowTemplates() []*WorkflowTemplateIn return nil } +func (x *GetWorkflowTemplatesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type ListReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3521,6 +3634,7 @@ type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ListReposReply) Reset() { @@ -3569,6 +3683,13 @@ func (x *ListReposReply) GetGlobalDefaultRevision() string { return "" } +func (x *ListReposReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type AddRepoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3631,6 +3752,7 @@ type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *AddRepoReply) Reset() { @@ -3679,6 +3801,13 @@ func (x *AddRepoReply) GetInfo() string { return "" } +func (x *AddRepoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type RemoveRepoRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3732,6 +3861,7 @@ type RemoveRepoReply struct { unknownFields protoimpl.UnknownFields NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *RemoveRepoReply) Reset() { @@ -3773,6 +3903,13 @@ func (x *RemoveRepoReply) GetNewDefaultRepo() string { return "" } +func (x *RemoveRepoReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type RefreshReposRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3974,7 +4111,8 @@ type SetRepoDefaultRevisionReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *SetRepoDefaultRevisionReply) Reset() { @@ -4016,6 +4154,13 @@ func (x *SetRepoDefaultRevisionReply) GetInfo() string { return "" } +func (x *SetRepoDefaultRevisionReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type Empty struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4059,7 +4204,8 @@ type ListIntegratedServicesReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead + Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` } func (x *ListIntegratedServicesReply) Reset() { @@ -4101,6 +4247,13 @@ func (x *ListIntegratedServicesReply) GetServices() map[string]*IntegratedServic return nil } +func (x *ListIntegratedServicesReply) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + type IntegratedServiceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4200,7 +4353,7 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xd1, 0x03, + 0x09, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x22, 0xef, 0x03, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, @@ -4230,713 +4383,749 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, - 0x16, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, - 0x6c, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, - 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x78, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, - 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, - 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, - 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, + 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, + 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, + 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, + 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, + 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, + 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, + 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, + 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, - 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, + 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, + 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, + 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, + 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, + 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, + 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, - 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, + 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6b, - 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, + 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, + 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, + 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, + 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, + 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, + 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, + 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, + 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, + 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, + 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x22, 0x84, 0x02, 0x0a, 0x19, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x19, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x53, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, - 0x65, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, - 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, - 0xf3, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, - 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, - 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, - 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, + 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, + 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, + 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, - 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, - 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, - 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, - 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x22, 0x65, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, - 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x37, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x22, 0x3a, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0xcc, 0x01, - 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, + 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, + 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, + 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, + 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, + 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, + 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, + 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, + 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, + 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, + 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, + 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, - 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, - 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, - 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, - 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, - 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, - 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x37, 0x0a, - 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, - 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, - 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, - 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, - 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0x8d, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, - 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, + 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, + 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, + 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, - 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, - 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, - 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, + 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, + 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, - 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, - 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, - 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3a, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, - 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0xc9, 0x01, - 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, - 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, - 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, - 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, - 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, - 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, - 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, - 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, - 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, - 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, - 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, - 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, - 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, - 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, - 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, - 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, - 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, - 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6a, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x71, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x39, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, - 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x31, - 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x1b, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x5d, 0x0a, 0x0d, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, - 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, - 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, - 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, - 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, + 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, + 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, + 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, + 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, + 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, + 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, + 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, + 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, + 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, + 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, + 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, + 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, + 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, + 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, + 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, + 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, + 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, + 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, + 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, + 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, + 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, + 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, + 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, + 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, + 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, + 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, + 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, - 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, + 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, - 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, - 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, - 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, - 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, - 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, - 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, - 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, - 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, - 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, - 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, + 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, + 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, + 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, + 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, + 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, + 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, + 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, + 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, + 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, + 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, + 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 9969b74dc..17698b13c 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -100,6 +100,7 @@ message GetFrameworkInfoReply { repeated string detectorsInInstance = 9; repeated string activeDetectors = 10; repeated string availableDetectors = 11; + int64 timestamp = 12; // timestamp of when this object was sent in unix milliseconds } // Not implemented yet @@ -118,6 +119,7 @@ message GetEnvironmentsRequest { message GetEnvironmentsReply { string frameworkId = 1; repeated EnvironmentInfo environments = 2; + int64 timestamp = 3; // timestamp of when this object was sent in unix milliseconds } message EnvironmentInfo { string id = 1; @@ -150,6 +152,7 @@ message NewEnvironmentRequest { message NewEnvironmentReply { EnvironmentInfo environment = 1; bool public = 2; + int64 timestamp = 3; // timestamp of when this object was sent in unix milliseconds } message NewAutoEnvironmentRequest { string workflowTemplate = 1; @@ -158,7 +161,7 @@ message NewAutoEnvironmentRequest { common.User requestUser = 4; } message NewAutoEnvironmentReply { - + int64 timestamp = 1; // timestamp of when this object was sent in unix milliseconds } message GetEnvironmentRequest { @@ -169,6 +172,7 @@ message GetEnvironmentReply { EnvironmentInfo environment = 1; RoleInfo workflow = 2; bool public = 3; + int64 timestamp = 4; // timestamp of when this object was sent in unix milliseconds } message ControlEnvironmentRequest { @@ -193,6 +197,7 @@ message ControlEnvironmentReply { int64 startOfTransition = 4; int64 endOfTransition = 5; int64 transitionDuration = 6; + int64 timestamp = 7; // timestamp of when this object was sent in unix milliseconds } message ModifyEnvironmentRequest { @@ -224,14 +229,17 @@ message DestroyEnvironmentRequest { } message DestroyEnvironmentReply { CleanupTasksReply cleanupTasksReply = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message GetActiveDetectorsReply { repeated string detectors = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message GetAvailableDetectorsReply { repeated string detectors = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } //////////////////////////////////////// @@ -284,12 +292,14 @@ message TaskDeploymentInfo { message GetTasksRequest {} message GetTasksReply { repeated ShortTaskInfo tasks = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message GetTaskRequest { string taskId = 1; } message GetTaskReply { TaskInfo task = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message CommandInfo { @@ -321,6 +331,7 @@ message CleanupTasksRequest { message CleanupTasksReply { repeated ShortTaskInfo killedTasks = 1; repeated ShortTaskInfo runningTasks = 2; + int64 timestamp = 3; // timestamp of when this object was sent in unix milliseconds } //////////////////////////////////////// @@ -347,6 +358,7 @@ message RoleInfo { message GetRolesReply { repeated RoleInfo roles = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message GetWorkflowTemplatesRequest{ @@ -399,6 +411,7 @@ message WorkflowTemplateInfo { message GetWorkflowTemplatesReply{ repeated WorkflowTemplateInfo workflowTemplates = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } //////////////////////////////////////// @@ -419,6 +432,7 @@ message RepoInfo { message ListReposReply { repeated RepoInfo repos = 1; string globalDefaultRevision = 2; + int64 timestamp = 3; // timestamp of when this object was sent in unix milliseconds } message AddRepoRequest { @@ -429,6 +443,7 @@ message AddRepoRequest { message AddRepoReply { string newDefaultRevision = 1; string info = 2; + int64 timestamp = 3; // timestamp of when this object was sent in unix milliseconds } message RemoveRepoRequest { @@ -437,6 +452,7 @@ message RemoveRepoRequest { message RemoveRepoReply { string newDefaultRepo = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message RefreshReposRequest { @@ -458,6 +474,7 @@ message SetRepoDefaultRevisionRequest { message SetRepoDefaultRevisionReply { string info = 1; + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message Empty { @@ -466,6 +483,7 @@ message Empty { message ListIntegratedServicesReply { map services = 1; // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead + int64 timestamp = 2; // timestamp of when this object was sent in unix milliseconds } message IntegratedServiceInfo { diff --git a/core/server.go b/core/server.go index e44258314..ee96d6b94 100644 --- a/core/server.go +++ b/core/server.go @@ -60,7 +60,7 @@ import ( "google.golang.org/grpc" "github.com/AliceO2Group/Control/core/environment" - "github.com/AliceO2Group/Control/core/protos" + pb "github.com/AliceO2Group/Control/core/protos" ) const MAX_ERROR_LENGTH = 6000 // gRPC seems to impose this limit on the status message @@ -119,13 +119,21 @@ type RpcServer struct { envStreams SafeStreamsMap } +// We are setting up timestamp field of proto files in the moment of function return, +// NOT when object is created. This function is meant to be used with defer keyword +func setCurrentUnixMilli(valueToSet *int64) { + *valueToSet = currentUnixMilli() +} + +func currentUnixMilli() int64 { + return time.Now().UnixMilli() +} + func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) (*pb.ListIntegratedServicesReply, error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() defer m.logMethodHandled() - r := &pb.ListIntegratedServicesReply{Services: nil} - services := make(map[string]*pb.IntegratedServiceInfo) for pluginName := range integration.RegisteredPlugins() { @@ -155,8 +163,7 @@ func (m *RpcServer) GetIntegratedServices(ctx context.Context, empty *pb.Empty) services[pluginName] = s } - r.Services = services - return r, nil + return &pb.ListIntegratedServicesReply{Services: services, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoRequest) (*pb.GetFrameworkInfoReply, error) { @@ -169,7 +176,6 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) availableDetectors, activeDetectors, allDetectors, err := m.listDetectors() - if err != nil { allDetectors = []string{"NIL"} availableDetectors = []string{} @@ -195,6 +201,7 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques DetectorsInInstance: allDetectors, ActiveDetectors: activeDetectors, AvailableDetectors: availableDetectors, + Timestamp: currentUnixMilli(), } return r, nil } @@ -215,6 +222,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm FrameworkId: m.state.taskman.GetFrameworkID(), Environments: make(EnvironmentInfos, 0, 0), } + defer setCurrentUnixMilli(&r.Timestamp) // Get plugin-provided environment data for all envs integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsShortData(m.state.environments.Ids()) @@ -364,6 +372,7 @@ func (m *RpcServer) NewEnvironmentAsync(cxt context.Context, request *pb.NewEnvi Environment: ei, Public: request.GetPublic(), } + defer setCurrentUnixMilli(&reply.Timestamp) go m.doNewEnvironmentAsync(cxt, userVars, request.GetRequestUser(), request.GetWorkflowTemplate(), request.GetPublic(), request.GetAutoTransition(), id) @@ -398,7 +407,9 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme // return nil, status.Newf(codes.Internal, "cannot create new environment: %s", err.Error()).Err() //} + // TODO: is this reply necessary here? We are creating new one at the end of this function reply = &pb.NewEnvironmentReply{Public: request.Public} + defer setCurrentUnixMilli(&reply.Timestamp) inputUserVars := request.GetVars() if len(inputUserVars) == 0 { @@ -497,6 +508,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme Environment: ei, Public: newEnv.Public, } + defer setCurrentUnixMilli(&reply.Timestamp) return } @@ -574,6 +586,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe }, Public: env.Public, } + defer setCurrentUnixMilli(&reply.Timestamp) if req.GetShowWorkflowTree() { reply.Workflow = workflowToRoleTree(env.Workflow()) } @@ -639,7 +652,7 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir EndOfTransition: eot.UnixMilli(), TransitionDuration: td.Milliseconds(), } - + defer setCurrentUnixMilli(&reply.Timestamp) if err != nil { return reply, status.Newf(codes.Aborted, err.Error()).Err() } @@ -654,30 +667,41 @@ func (*RpcServer) ModifyEnvironment(context.Context, *pb.ModifyEnvironmentReques return nil, status.New(codes.Unimplemented, "not implemented").Err() } -func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvironmentRequest) (*pb.DestroyEnvironmentReply, error) { +func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvironmentRequest) (reply *pb.DestroyEnvironmentReply, err error) { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("rpcserver")) m.logMethod() defer m.logMethodHandled() + reply = nil + defer func() { + if reply != nil { + reply.Timestamp = currentUnixMilli() + } + }() + if req == nil || len(req.Id) == 0 { - return nil, status.New(codes.InvalidArgument, "received nil request").Err() + err = status.New(codes.InvalidArgument, "received nil request").Err() + return } envId, err := uid.FromString(req.Id) if err != nil { - return nil, status.New(codes.InvalidArgument, "received bad environment id").Err() + err = status.New(codes.InvalidArgument, "received bad environment id").Err() + return } env, err := m.state.environments.Environment(envId) if err != nil { - return nil, status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() + err = status.Newf(codes.NotFound, "environment not found: %s", err.Error()).Err() + return } env.SetLastRequestUser(req.RequestUser) // if Force immediately disband the environment (unlocking all tasks) and run the cleanup. if req.Force { - return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) + reply, err = m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) + return } if req.AllowInRunningState && env.CurrentState() == "RUNNING" { @@ -685,7 +709,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if err != nil { log.WithField("partition", env.Id().String()). Warn("could not perform STOP transition for environment teardown, forcing") - return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + reply, err = m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + return } } @@ -702,7 +727,8 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if !canDestroy { log.WithField("partition", env.Id().String()). Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) - return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + reply, err = m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + return } // This might transition to STANDBY if needed, or do nothing if we're already there @@ -711,11 +737,13 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir if err != nil { log.WithField("partition", env.Id().String()). Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) - return m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + reply, err = m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) + return } } - return m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) + reply, err = m.doTeardownAndCleanup(env, req.Force, req.KeepTasks) + return } func (m *RpcServer) doTeardownAndCleanup(env *environment.Environment, force bool, keepTasks bool) (*pb.DestroyEnvironmentReply, error) { @@ -758,6 +786,8 @@ func (m *RpcServer) GetActiveDetectors(_ context.Context, _ *pb.Empty) (*pb.GetA r := &pb.GetActiveDetectorsReply{ Detectors: make([]string, 0), } + defer setCurrentUnixMilli(&r.Timestamp) + detIds := m.state.environments.GetActiveDetectors() r.Detectors = detIds.StringList() @@ -797,6 +827,7 @@ func (m *RpcServer) GetAvailableDetectors(_ context.Context, _ *pb.Empty) (*pb.G } else { r := &pb.GetAvailableDetectorsReply{ Detectors: availableDetectors, + Timestamp: currentUnixMilli(), } return r, nil } @@ -809,7 +840,8 @@ func (m *RpcServer) GetTasks(context.Context, *pb.GetTasksRequest) (*pb.GetTasks tasks := m.state.taskman.GetTasks() r := &pb.GetTasksReply{ - Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + Tasks: tasksToShortTaskInfos(tasks, m.state.taskman), + Timestamp: currentUnixMilli(), } return r, nil @@ -822,7 +854,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge task := m.state.taskman.GetTask(req.TaskId) if task == nil { - return &pb.GetTaskReply{}, status.New(codes.NotFound, "task not found").Err() + return &pb.GetTaskReply{Timestamp: currentUnixMilli()}, status.New(codes.NotFound, "task not found").Err() } taskClass := task.GetTaskClass() commandInfo := task.GetTaskCommandInfo() @@ -859,6 +891,7 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge EnvId: task.GetEnvironmentId().String(), Properties: task.GetProperties(), }, + Timestamp: currentUnixMilli(), } return rep, nil } @@ -873,16 +906,14 @@ func (m *RpcServer) CleanupTasks(cxt context.Context, req *pb.CleanupTasksReques killed, running, err := m.doCleanupTasks(idsToKill) if err != nil { log.WithError(err).Error("task cleanup error") - return &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running}, status.New(codes.Internal, err.Error()).Err() + return &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running, Timestamp: currentUnixMilli()}, status.New(codes.Internal, err.Error()).Err() } - return &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running}, nil + return &pb.CleanupTasksReply{KilledTasks: killed, RunningTasks: running, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) doCleanupTasks(taskIds []string) (killedTaskInfos []*pb.ShortTaskInfo, runningTaskInfos []*pb.ShortTaskInfo, err error) { - var ( - killedTasks, runningTasks task.Tasks - ) + var killedTasks, runningTasks task.Tasks if len(taskIds) == 0 { // by default we try to kill all, best effort killedTasks, runningTasks, err = m.state.taskman.Cleanup() } else { @@ -920,7 +951,7 @@ func (m *RpcServer) GetRoles(cxt context.Context, req *pb.GetRolesRequest) (*pb. for i, rr := range resultRoles { roleInfos[i] = workflowToRoleTree(rr) } - return &pb.GetRolesReply{Roles: roleInfos}, nil + return &pb.GetRolesReply{Roles: roleInfos, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflowTemplatesRequest) (*pb.GetWorkflowTemplatesReply, error) { @@ -987,7 +1018,7 @@ func (m *RpcServer) GetWorkflowTemplates(cxt context.Context, req *pb.GetWorkflo } } - return &pb.GetWorkflowTemplatesReply{WorkflowTemplates: workflowTemplateInfos}, nil + return &pb.GetWorkflowTemplatesReply{WorkflowTemplates: workflowTemplateInfos, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*pb.ListReposReply, error) { @@ -1016,7 +1047,11 @@ func (m *RpcServer) ListRepos(cxt context.Context, req *pb.ListReposRequest) (*p repoInfos[i] = &pb.RepoInfo{Name: repoName, Default: repo.IsDefault(), DefaultRevision: repo.GetDefaultRevision(), Revisions: revisions} } - return &pb.ListReposReply{Repos: repoInfos, GlobalDefaultRevision: viper.GetString("globalDefaultRevision")}, nil + return &pb.ListReposReply{ + Repos: repoInfos, + GlobalDefaultRevision: viper.GetString("globalDefaultRevision"), + Timestamp: currentUnixMilli(), + }, nil } func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.AddRepoReply, error) { @@ -1042,7 +1077,7 @@ func (m *RpcServer) AddRepo(cxt context.Context, req *pb.AddRepoRequest) (*pb.Ad info = "The default revision for this repository has been set to \"" + newDefaultRevision + "\" (fallback value)." } - return &pb.AddRepoReply{NewDefaultRevision: newDefaultRevision, Info: info}, nil + return &pb.AddRepoReply{NewDefaultRevision: newDefaultRevision, Info: info, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) (*pb.RemoveRepoReply, error) { @@ -1055,12 +1090,11 @@ func (m *RpcServer) RemoveRepo(cxt context.Context, req *pb.RemoveRepoRequest) ( } newDefaultRepo, err := the.RepoManager().RemoveRepoByIndex(int(req.Index)) - if err != nil { return nil, err } - return &pb.RemoveRepoReply{NewDefaultRepo: newDefaultRepo}, nil + return &pb.RemoveRepoReply{NewDefaultRepo: newDefaultRepo, Timestamp: currentUnixMilli()}, nil } func (m *RpcServer) RefreshRepos(cxt context.Context, req *pb.RefreshReposRequest) (*pb.Empty, error) { @@ -1130,11 +1164,11 @@ func (m *RpcServer) SetRepoDefaultRevision(cxt context.Context, req *pb.SetRepoD info, err := the.RepoManager().UpdateDefaultRevisionByIndex(int(req.Index), req.Revision) if err != nil { - return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is filled with available revisions + return &pb.SetRepoDefaultRevisionReply{Info: info, Timestamp: currentUnixMilli()}, nil // Info is filled with available revisions // err can't be set here, otherwise the response will be empty } - return &pb.SetRepoDefaultRevisionReply{Info: info}, nil // Info is empty + return &pb.SetRepoDefaultRevisionReply{Info: info, Timestamp: currentUnixMilli()}, nil // Info is empty } func (m *RpcServer) Subscribe(req *pb.SubscribeRequest, srv pb.Control_SubscribeServer) error { @@ -1182,6 +1216,6 @@ func (m *RpcServer) NewAutoEnvironment(cxt context.Context, request *pb.NewAutoE inputUserVars["last_request_user"] = string(lastRequestUserJ[:]) go m.state.environments.CreateAutoEnvironment(request.GetWorkflowTemplate(), inputUserVars, id, sub) - r := &pb.NewAutoEnvironmentReply{} + r := &pb.NewAutoEnvironmentReply{Timestamp: currentUnixMilli()} return r, nil } diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 82ff39c3d..6783e0b13 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -109,6 +109,7 @@ | ----- | ---- | ----- | ----------- | | newDefaultRevision | [string](#string) | | | | info | [string](#string) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -158,6 +159,7 @@ | ----- | ---- | ----- | ----------- | | killedTasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | | runningTasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -212,6 +214,7 @@ | startOfTransition | [int64](#int64) | | All times are in milliseconds | | endOfTransition | [int64](#int64) | | | | transitionDuration | [int64](#int64) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -244,6 +247,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | cleanupTasksReply | [CleanupTasksReply](#o2control-CleanupTasksReply) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -400,6 +404,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | detectors | [string](#string) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -415,6 +420,7 @@ | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | detectors | [string](#string) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -480,6 +486,7 @@ | environment | [EnvironmentInfo](#o2control-EnvironmentInfo) | | | | workflow | [RoleInfo](#o2control-RoleInfo) | | | | public | [bool](#bool) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -512,6 +519,7 @@ | ----- | ---- | ----- | ----------- | | frameworkId | [string](#string) | | | | environments | [EnvironmentInfo](#o2control-EnvironmentInfo) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -554,6 +562,7 @@ Environment | detectorsInInstance | [string](#string) | repeated | | | activeDetectors | [string](#string) | repeated | | | availableDetectors | [string](#string) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -580,6 +589,7 @@ Framework | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | roles | [RoleInfo](#o2control-RoleInfo) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -612,6 +622,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | task | [TaskInfo](#o2control-TaskInfo) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -642,6 +653,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | tasks | [ShortTaskInfo](#o2control-ShortTaskInfo) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -667,6 +679,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | workflowTemplates | [WorkflowTemplateInfo](#o2control-WorkflowTemplateInfo) | repeated | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -720,6 +733,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | services | [ListIntegratedServicesReply.ServicesEntry](#o2control-ListIntegratedServicesReply-ServicesEntry) | repeated | keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -752,6 +766,7 @@ Roles | ----- | ---- | ----- | ----------- | | repos | [RepoInfo](#o2control-RepoInfo) | repeated | | | globalDefaultRevision | [string](#string) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -813,6 +828,11 @@ Roles +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | + + @@ -861,6 +881,7 @@ Roles | ----- | ---- | ----- | ----------- | | environment | [EnvironmentInfo](#o2control-EnvironmentInfo) | | | | public | [bool](#bool) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -926,6 +947,7 @@ Roles | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | newDefaultRepo | [string](#string) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -1136,6 +1158,7 @@ Environment, GET/SET properties | Field | Type | Label | Description | | ----- | ---- | ----- | ----------- | | info | [string](#string) | | | +| timestamp | [int64](#int64) | | timestamp of when this object was sent in unix milliseconds | @@ -1297,6 +1320,7 @@ Not implemented yet | index | [int32](#int32) | | | | visibleIf | [string](#string) | | JS expression that evaluates to bool | | enabledIf | [string](#string) | | JS expression that evaluates to bool | +| rows | [uint32](#uint32) | | this field is used only if widget == editBox | diff --git a/docs/apidocs_apricot.md b/docs/apidocs_apricot.md index 88a120245..d1fcd8a90 100644 --- a/docs/apidocs_apricot.md +++ b/docs/apidocs_apricot.md @@ -4,6 +4,8 @@ ## Table of Contents - [apricot.proto](#apricot-proto) + - [AliasedLinkIDsRequest](#apricot-AliasedLinkIDsRequest) + - [AliasedLinkIDsResponse](#apricot-AliasedLinkIDsResponse) - [CRUCardEndpointResponse](#apricot-CRUCardEndpointResponse) - [CRUCardsResponse](#apricot-CRUCardsResponse) - [CardRequest](#apricot-CardRequest) @@ -30,6 +32,8 @@ - [HostsRequest](#apricot-HostsRequest) - [ImportComponentConfigurationRequest](#apricot-ImportComponentConfigurationRequest) - [ImportComponentConfigurationResponse](#apricot-ImportComponentConfigurationResponse) + - [LinkIDsRequest](#apricot-LinkIDsRequest) + - [LinkIDsResponse](#apricot-LinkIDsResponse) - [ListComponentEntriesRequest](#apricot-ListComponentEntriesRequest) - [ListRuntimeEntriesRequest](#apricot-ListRuntimeEntriesRequest) - [RawGetRecursiveRequest](#apricot-RawGetRecursiveRequest) @@ -53,6 +57,37 @@ + + +### AliasedLinkIDsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| detector | [string](#string) | | | +| onlyEnabled | [bool](#bool) | | | + + + + + + + + +### AliasedLinkIDsResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| aliasedLinkIDs | [string](#string) | repeated | | + + + + + + ### CRUCardEndpointResponse @@ -454,6 +489,39 @@ + + +### LinkIDsRequest + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| hostname | [string](#string) | | | +| cardSerial | [string](#string) | | | +| endpoint | [string](#string) | | | +| onlyEnabled | [bool](#bool) | | | + + + + + + + + +### LinkIDsResponse + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| linkIDs | [string](#string) | repeated | | + + + + + + ### ListComponentEntriesRequest @@ -617,6 +685,8 @@ | GetDetectorsForHosts | [HostsRequest](#apricot-HostsRequest) | [DetectorsResponse](#apricot-DetectorsResponse) | | | GetCRUCardsForHost | [HostRequest](#apricot-HostRequest) | [CRUCardsResponse](#apricot-CRUCardsResponse) | | | GetEndpointsForCRUCard | [CardRequest](#apricot-CardRequest) | [CRUCardEndpointResponse](#apricot-CRUCardEndpointResponse) | | +| GetLinkIDsForCRUEndpoint | [LinkIDsRequest](#apricot-LinkIDsRequest) | [LinkIDsResponse](#apricot-LinkIDsResponse) | | +| GetAliasedLinkIDsForDetector | [AliasedLinkIDsRequest](#apricot-AliasedLinkIDsRequest) | [AliasedLinkIDsResponse](#apricot-AliasedLinkIDsResponse) | | | GetRuntimeEntry | [GetRuntimeEntryRequest](#apricot-GetRuntimeEntryRequest) | [ComponentResponse](#apricot-ComponentResponse) | Runtime KV calls | | SetRuntimeEntry | [SetRuntimeEntryRequest](#apricot-SetRuntimeEntryRequest) | [Empty](#apricot-Empty) | | | GetRuntimeEntries | [GetRuntimeEntriesRequest](#apricot-GetRuntimeEntriesRequest) | [StringMap](#apricot-StringMap) | | From f53062cf1d9c4253fcd311c1281cbc5cfbc6c5c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 00:16:24 +0000 Subject: [PATCH 2091/2352] Bump github.com/expr-lang/expr from 1.16.1 to 1.17.0 Bumps [github.com/expr-lang/expr](https://github.com/expr-lang/expr) from 1.16.1 to 1.17.0. - [Release notes](https://github.com/expr-lang/expr/releases) - [Commits](https://github.com/expr-lang/expr/compare/v1.16.1...v1.17.0) --- updated-dependencies: - dependency-name: github.com/expr-lang/expr dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 952d4b846..6b7360c1c 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( require ( dario.cat/mergo v1.0.1 - github.com/expr-lang/expr v1.16.1 + github.com/expr-lang/expr v1.17.0 github.com/flosch/pongo2/v6 v6.0.0 github.com/gogo/protobuf v1.3.2 github.com/hashicorp/go-multierror v1.1.1 diff --git a/go.sum b/go.sum index d1d9e032d..65bceb6ad 100644 --- a/go.sum +++ b/go.sum @@ -68,8 +68,8 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/expr-lang/expr v1.16.1 h1:Na8CUcMdyGbnNpShY7kzcHCU7WqxuL+hnxgHZ4vaz/A= -github.com/expr-lang/expr v1.16.1/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= +github.com/expr-lang/expr v1.17.0 h1:+vpszOyzKLQXC9VF+wA8cVA0tlA984/Wabc/1hF9Whg= +github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= From 2a5ac81eb1e8a5d61ba840dc1d14f3e1d0d3cd26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 13:29:59 +0000 Subject: [PATCH 2092/2352] Bump github.com/go-git/go-git/v5 from 5.11.0 to 5.13.0 Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.11.0 to 5.13.0. - [Release notes](https://github.com/go-git/go-git/releases) - [Commits](https://github.com/go-git/go-git/compare/v5.11.0...v5.13.0) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 32 ++++++++++----------- go.sum | 87 +++++++++++++++++++++++++--------------------------------- 2 files changed, 54 insertions(+), 65 deletions(-) diff --git a/go.mod b/go.mod index 6b7360c1c..82d13ed40 100644 --- a/go.mod +++ b/go.mod @@ -33,7 +33,7 @@ require ( github.com/dmarkham/enumer v1.5.8 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.7.4 - github.com/go-git/go-git/v5 v5.11.0 + github.com/go-git/go-git/v5 v5.13.0 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 @@ -63,11 +63,11 @@ require ( github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 golang.org/x/crypto v0.31.0 - golang.org/x/net v0.25.0 + golang.org/x/net v0.33.0 golang.org/x/sys v0.28.0 google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.33.0 + google.golang.org/protobuf v1.34.1 gopkg.in/yaml.v3 v3.0.1 ) @@ -78,37 +78,37 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 - github.com/onsi/ginkgo/v2 v2.11.0 - github.com/onsi/gomega v1.27.10 + github.com/onsi/ginkgo/v2 v2.19.0 + github.com/onsi/gomega v1.34.1 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.3 - golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 + golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/ProtonMail/go-crypto v1.0.0 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-logr/logr v1.2.4 // indirect + github.com/go-git/go-billy/v5 v5.6.0 // indirect + github.com/go-logr/logr v1.4.1 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/go-cmp v0.6.0 // indirect - github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect + github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.2 // indirect @@ -152,8 +152,8 @@ require ( github.com/rivo/uniseg v0.4.7 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect - github.com/sergi/go-diff v1.3.1 // indirect - github.com/skeema/knownhosts v1.2.2 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect github.com/sony/sonyflake v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect @@ -166,11 +166,11 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.17.0 // indirect + golang.org/x/mod v0.19.0 // indirect golang.org/x/sync v0.10.0 // indirect golang.org/x/term v0.27.0 // indirect golang.org/x/text v0.21.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect + golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect diff --git a/go.sum b/go.sum index 65bceb6ad..9fedcd649 100644 --- a/go.sum +++ b/go.sum @@ -17,8 +17,8 @@ github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migc github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= -github.com/ProtonMail/go-crypto v1.0.0 h1:LRuvITjQWX+WIfr930YHG2HNfjR1uOfyf5vE0kC2U78= -github.com/ProtonMail/go-crypto v1.0.0/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -37,13 +37,11 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= @@ -52,8 +50,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lV github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= +github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -62,8 +60,8 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= +github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= @@ -86,22 +84,22 @@ github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uh github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU= github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= +github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= +github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= +github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -111,8 +109,8 @@ github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5 github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -134,8 +132,8 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= -github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= +github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -292,10 +290,10 @@ github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.11.0 h1:WgqUCUt/lT6yXoQ8Wef0fsNn5cAuMK7+KT9UFRz2tcU= -github.com/onsi/ginkgo/v2 v2.11.0/go.mod h1:ZhrRA5XmEE3x3rhlzamx/JJvujdZoJ2uvgI7kR0iZvM= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= +github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= +github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= +github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= github.com/osamingo/indigo v1.1.1 h1:tjPwqwZIq6pqUzfMxCKQeSaFRW0MzLrdT3lszGqYSpg= @@ -370,16 +368,16 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUt github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/kafka-go v0.4.47 h1:IqziR4pA3vrZq7YdRxaT3w1/5fvIH5qpCwstUanQQB0= github.com/segmentio/kafka-go v0.4.47/go.mod h1:HjF6XbOKh0Pjlkr5GVZxt6CsjjwnmhVOfURM5KMd8qg= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.2 h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A= -github.com/skeema/knownhosts v1.2.2/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= @@ -408,8 +406,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= @@ -456,19 +454,17 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= -golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81 h1:6R2FC06FonbXQ8pK11/PDFY6N6LWlf9KlzibaCapmqc= -golang.org/x/exp v0.0.0-20240318143956-a85f2c67cd81/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= +golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= +golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -480,13 +476,11 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -525,8 +519,6 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -536,9 +528,7 @@ golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= @@ -552,7 +542,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= @@ -566,8 +555,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= +golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -582,8 +571,8 @@ google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From c0b6ebb89fd29d45f6aecb787fa5515dcf36b3f6 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:22:23 +0100 Subject: [PATCH 2093/2352] Make it work with newer versions of protobuf --- occ/CMakeLists.txt | 2 +- occ/cmake/OccConfig.cmake.in | 2 +- occ/occlib/OccServer.cxx | 40 +++++++++++++++++----------------- occ/occlib/OccServer.h | 24 ++++++++++---------- occ/plugin/OccPluginServer.cxx | 26 +++++++++++----------- occ/plugin/OccPluginServer.h | 20 ++++++++--------- 6 files changed, 55 insertions(+), 59 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index cf2c38294..31ec6c789 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -165,7 +165,7 @@ find_package(Boost 1.74 REQUIRED COMPONENTS ${BOOST_COMPONENTS}) # Protobuf set(protobuf_MODULE_COMPATIBLE TRUE) -find_package(protobuf 3.14.0 CONFIG REQUIRED) +find_package(protobuf CONFIG REQUIRED) message(STATUS "Using protobuf ${protobuf_VERSION}") # OpenSSL on Mac diff --git a/occ/cmake/OccConfig.cmake.in b/occ/cmake/OccConfig.cmake.in index fdf2c248a..609e2952f 100644 --- a/occ/cmake/OccConfig.cmake.in +++ b/occ/cmake/OccConfig.cmake.in @@ -31,7 +31,7 @@ include(CMakeFindDependencyMacro) list(APPEND CMAKE_MODULE_PATH ${Occ_CMAKE_DIR}) find_dependency(Boost 1.68 REQUIRED COMPONENTS program_options) set(protobuf_MODULE_COMPATIBLE TRUE) -find_dependency(protobuf 3.7.1 CONFIG REQUIRED) +find_dependency(protobuf CONFIG REQUIRED) find_dependency(gRPC 1.19.1 CONFIG REQUIRED) list(REMOVE_AT CMAKE_MODULE_PATH -1) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 6947624c2..347ae8783 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -68,7 +68,7 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, boost::uuids::basic_random_generator gen; std::string id = boost::uuids::to_string(gen()); - boost::lockfree::queue eventQueue; + boost::lockfree::queue eventQueue; m_eventQueues[id] = &eventQueue; DEFER({ m_eventQueues.erase(id); @@ -76,14 +76,14 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, bool isStreamOpen = true; while (!m_destroying && isStreamOpen && m_rco->getState() != t_State::done) { - pb::DeviceEvent *newEvent; + occ_pb::DeviceEvent *newEvent; bool ok = eventQueue.pop(newEvent); if (!ok) { // queue empty, sleep and retry std::this_thread::sleep_for(2ms); continue; } - pb::EventStreamReply response; + occ_pb::EventStreamReply response; if (newEvent) { response.mutable_event()->CopyFrom(*newEvent); isStreamOpen = writer->Write(response); @@ -94,8 +94,8 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, } grpc::Status OccServer::StateStream(grpc::ServerContext* context, - const pb::StateStreamRequest* request, - grpc::ServerWriter* writer) + const occ_pb::StateStreamRequest* request, + grpc::ServerWriter* writer) { (void) context; (void) request; @@ -118,8 +118,8 @@ grpc::Status OccServer::StateStream(grpc::ServerContext* context, continue; } - pb::StateStreamReply response; - response.set_type(pb::STATE_STABLE); + occ_pb::StateStreamReply response; + response.set_type(occ_pb::STATE_STABLE); response.set_state(getStringFromState(newState)); if (newState != t_State::done) { @@ -133,8 +133,8 @@ grpc::Status OccServer::StateStream(grpc::ServerContext* context, } grpc::Status OccServer::GetState(grpc::ServerContext* context, - const pb::GetStateRequest* request, - pb::GetStateReply* response) + const occ_pb::GetStateRequest* request, + occ_pb::GetStateReply* response) { std::lock_guard lock(m_mu); @@ -159,8 +159,8 @@ grpc::Status OccServer::GetState(grpc::ServerContext* context, * @return the status, either grpc::Status::OK or an error status */ grpc::Status OccServer::Transition(grpc::ServerContext* context, - const pb::TransitionRequest* request, - pb::TransitionReply* response) + const occ_pb::TransitionRequest* request, + occ_pb::TransitionReply* response) { std::lock_guard lock(m_mu); @@ -213,11 +213,11 @@ grpc::Status OccServer::Transition(grpc::ServerContext* context, response->set_transitionevent(request->transitionevent()); response->set_ok(newStateStr == finalState); if (newState == error) { // ERROR state - response->set_trigger(pb::DEVICE_ERROR); + response->set_trigger(occ_pb::DEVICE_ERROR); } else if (newStateStr == finalState) { // correct destination state - response->set_trigger(pb::EXECUTOR); + response->set_trigger(occ_pb::EXECUTOR); } else { // some other state, for whatever reason - we assume DEVICE_INTENTIONAL - response->set_trigger(pb::DEVICE_INTENTIONAL); + response->set_trigger(occ_pb::DEVICE_INTENTIONAL); } std::cout << "[OCC] new state: " << newStateStr << std::endl; @@ -394,14 +394,14 @@ void OccServer::publishState(t_State s) } } -void OccServer::pushEvent(pb::DeviceEvent* event) +void OccServer::pushEvent(occ_pb::DeviceEvent* event) { for (auto item : m_eventQueues) { item.second->push(event); } printf("[OCC] Object: %s - pushing event = %s\n", m_rco->getName().c_str(), - pb::DeviceEventType_Name(event->type()).c_str()); + occ_pb::DeviceEventType_Name(event->type()).c_str()); } bool OccServer::checkMachineDone() @@ -428,8 +428,8 @@ void OccServer::runChecker() int err = m_rco->iterateRunning(); if (err == 1) { // signal EndOfData event endOfData = true; - auto eodEvent = new pb::DeviceEvent; - eodEvent->set_type(pb::END_OF_STREAM); + auto eodEvent = new occ_pb::DeviceEvent; + eodEvent->set_type(occ_pb::END_OF_STREAM); pushEvent(eodEvent); } else if (err) { @@ -446,8 +446,8 @@ void OccServer::runChecker() // the above publishes a state change event to the StateStream, but we also push an exception event on the // EventStream because the transition was initiated by the task - auto taskErrorEvent = new pb::DeviceEvent; - taskErrorEvent->set_type(pb::TASK_INTERNAL_ERROR); + auto taskErrorEvent = new occ_pb::DeviceEvent; + taskErrorEvent->set_type(occ_pb::TASK_INTERNAL_ERROR); pushEvent(taskErrorEvent); } } diff --git a/occ/occlib/OccServer.h b/occ/occlib/OccServer.h index 3eb0f20cd..d05ba742c 100644 --- a/occ/occlib/OccServer.h +++ b/occ/occlib/OccServer.h @@ -36,8 +36,6 @@ #include #include -namespace pb = occ_pb; - namespace boost { namespace property_tree @@ -61,7 +59,7 @@ const std::unordered_map EXPECTED_FINAL_STATE = { {"RECOVER", "STANDBY"}, }; -class OccServer final : public pb::Occ::Service +class OccServer final : public occ_pb::Occ::Service { public: /** @@ -82,20 +80,20 @@ class OccServer final : public pb::Occ::Service virtual ~OccServer(); grpc::Status EventStream(grpc::ServerContext* context, - const pb::EventStreamRequest* request, - grpc::ServerWriter* writer) override; + const occ_pb::EventStreamRequest* request, + grpc::ServerWriter* writer) override; grpc::Status StateStream(grpc::ServerContext* context, - const pb::StateStreamRequest* request, - grpc::ServerWriter* writer) override; + const occ_pb::StateStreamRequest* request, + grpc::ServerWriter* writer) override; grpc::Status GetState(grpc::ServerContext* context, - const pb::GetStateRequest* request, - pb::GetStateReply* response) override; + const occ_pb::GetStateRequest* request, + occ_pb::GetStateReply* response) override; grpc::Status Transition(grpc::ServerContext* context, - const pb::TransitionRequest* request, - pb::TransitionReply* response) override; + const occ_pb::TransitionRequest* request, + occ_pb::TransitionReply* response) override; bool checkMachineDone(); @@ -104,7 +102,7 @@ class OccServer final : public pb::Occ::Service void updateState(t_State s); void publishState(t_State s); - void pushEvent(pb::DeviceEvent* event); + void pushEvent(occ_pb::DeviceEvent* event); void runChecker(); @@ -116,7 +114,7 @@ class OccServer final : public pb::Occ::Service bool m_machineDone; std::unordered_map* > m_stateQueues; - std::unordered_map* > m_eventQueues; + std::unordered_map* > m_eventQueues; }; diff --git a/occ/plugin/OccPluginServer.cxx b/occ/plugin/OccPluginServer.cxx index 3f96a0c2a..05b079317 100644 --- a/occ/plugin/OccPluginServer.cxx +++ b/occ/plugin/OccPluginServer.cxx @@ -70,9 +70,9 @@ OccPluginServer::EventStream(grpc::ServerContext* context, if (state == "EXITING") { std::unique_lock finished_lk(finished_mu); - auto nilEvent = new pb::DeviceEvent(); - nilEvent->set_type(pb::NULL_DEVICE_EVENT); - pb::EventStreamReply response; + auto nilEvent = new occ_pb::DeviceEvent(); + nilEvent->set_type(occ_pb::NULL_DEVICE_EVENT); + occ_pb::EventStreamReply response; response.mutable_event()->CopyFrom(*nilEvent); writer->WriteLast(response, grpc::WriteOptions()); @@ -100,8 +100,8 @@ OccPluginServer::EventStream(grpc::ServerContext* context, grpc::Status OccPluginServer::StateStream(grpc::ServerContext* context, - const pb::StateStreamRequest* request, - grpc::ServerWriter* writer) + const occ_pb::StateStreamRequest* request, + grpc::ServerWriter* writer) { (void) context; @@ -116,14 +116,14 @@ OccPluginServer::StateStream(grpc::ServerContext* context, std::lock_guard lock(writer_mu); auto state = fair::mq::PluginServices::ToStr(reachedState); last_known_state = state; - pb::StateType sType = isIntermediateFMQState(state) ? pb::STATE_INTERMEDIATE : pb::STATE_STABLE; + occ_pb::StateType sType = isIntermediateFMQState(state) ? occ_pb::STATE_INTERMEDIATE : occ_pb::STATE_STABLE; - pb::StateStreamReply response; + occ_pb::StateStreamReply response; response.set_type(sType); response.set_state(state); OLOG(debug) << "[StateStream] new state: " << state << "; type: " - << pb::StateType_Name(sType); + << occ_pb::StateType_Name(sType); if (state != "EXITING") { writer->Write(response); @@ -151,8 +151,8 @@ OccPluginServer::StateStream(grpc::ServerContext* context, } grpc::Status OccPluginServer::GetState(grpc::ServerContext* context, - const pb::GetStateRequest* request, - pb::GetStateReply* response) + const occ_pb::GetStateRequest* request, + occ_pb::GetStateReply* response) { std::lock_guard lock(m_mu); @@ -178,8 +178,8 @@ grpc::Status OccPluginServer::GetState(grpc::ServerContext* context, */ grpc::Status OccPluginServer::Transition(grpc::ServerContext* context, - const pb::TransitionRequest* request, - pb::TransitionReply* response) + const occ_pb::TransitionRequest* request, + occ_pb::TransitionReply* response) { // Valid FairMQ state machine transitions, mapped to DeviceStateTransition objects: // {DeviceStateTransition::Auto, "Auto"}, // ever needed? @@ -238,7 +238,7 @@ OccPluginServer::Transition(grpc::ServerContext* context, auto nopbResponse = std::get<0>(transitionOutcome); response->set_state(nopbResponse.state); - response->set_trigger(static_cast(nopbResponse.trigger)); + response->set_trigger(static_cast(nopbResponse.trigger)); response->set_transitionevent(nopbResponse.transitionEvent); response->set_ok(nopbResponse.ok); diff --git a/occ/plugin/OccPluginServer.h b/occ/plugin/OccPluginServer.h index 53c16bdc1..5f12a8019 100644 --- a/occ/plugin/OccPluginServer.h +++ b/occ/plugin/OccPluginServer.h @@ -32,8 +32,6 @@ #include -namespace pb = occ_pb; - namespace fair { namespace mq @@ -42,7 +40,7 @@ class PluginServices; } } -class OccPluginServer final : public pb::Occ::Service +class OccPluginServer final : public occ_pb::Occ::Service { public: explicit OccPluginServer(fair::mq::PluginServices*); @@ -51,20 +49,20 @@ class OccPluginServer final : public pb::Occ::Service {} grpc::Status EventStream(grpc::ServerContext* context, - const pb::EventStreamRequest* request, - grpc::ServerWriter* writer) override; + const occ_pb::EventStreamRequest* request, + grpc::ServerWriter* writer) override; grpc::Status StateStream(grpc::ServerContext* context, - const pb::StateStreamRequest* request, - grpc::ServerWriter* writer) override; + const occ_pb::StateStreamRequest* request, + grpc::ServerWriter* writer) override; grpc::Status GetState(grpc::ServerContext* context, - const pb::GetStateRequest* request, - pb::GetStateReply* response) override; + const occ_pb::GetStateRequest* request, + occ_pb::GetStateReply* response) override; grpc::Status Transition(grpc::ServerContext* context, - const pb::TransitionRequest* request, - pb::TransitionReply* response) override; + const occ_pb::TransitionRequest* request, + occ_pb::TransitionReply* response) override; private: fair::mq::PluginServices* m_pluginServices; From 6d9427b7a4d1c45ba35f11ea0e1162a324601d87 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:22:46 +0100 Subject: [PATCH 2094/2352] Make it work with newer versions of gRPC --- occ/plugin/litestructs/EventStream.h | 4 ++-- occ/plugin/litestructs/GetState.h | 4 ++-- occ/plugin/litestructs/JsonMessage.cxx | 3 ++- occ/plugin/litestructs/Transition.h | 4 ++-- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/occ/plugin/litestructs/EventStream.h b/occ/plugin/litestructs/EventStream.h index 1d3e19c74..a6a80cb02 100644 --- a/occ/plugin/litestructs/EventStream.h +++ b/occ/plugin/litestructs/EventStream.h @@ -90,7 +90,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; @@ -111,7 +111,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; diff --git a/occ/plugin/litestructs/GetState.h b/occ/plugin/litestructs/GetState.h index cd2679595..f88dafb3d 100644 --- a/occ/plugin/litestructs/GetState.h +++ b/occ/plugin/litestructs/GetState.h @@ -73,7 +73,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; @@ -94,7 +94,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; diff --git a/occ/plugin/litestructs/JsonMessage.cxx b/occ/plugin/litestructs/JsonMessage.cxx index 1249c71dc..f2fbac4a1 100644 --- a/occ/plugin/litestructs/JsonMessage.cxx +++ b/occ/plugin/litestructs/JsonMessage.cxx @@ -23,6 +23,7 @@ */ #include "JsonMessage.h" +#include std::string OccLite::nopb::JsonMessage::Serialize() const @@ -72,7 +73,7 @@ bool OccLite::nopb::JsonMessage::Deserialize(::grpc::ByteBuffer* byte_buffer) auto rawSlice = sl->c_slice(); std::string str = grpc::StringFromCopiedSlice(rawSlice); ss << str; - ::grpc::g_core_codegen_interface->grpc_slice_unref(rawSlice); + ::grpc_slice_unref(rawSlice); } OLOG(detail) << "Deserialized JsonMessage: " << ss.str(); diff --git a/occ/plugin/litestructs/Transition.h b/occ/plugin/litestructs/Transition.h index 71ea37c35..b856dffb6 100644 --- a/occ/plugin/litestructs/Transition.h +++ b/occ/plugin/litestructs/Transition.h @@ -95,7 +95,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; @@ -116,7 +116,7 @@ class SerializationTraits { *buffer = *source.JsonMessage::SerializeToByteBuffer(); *own_buffer = true; - return g_core_codegen_interface->ok(); + return Status::OK; } }; From 1d89badd59a058a2bc7d19d6c10084cfdd39e39b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 19 Mar 2025 15:09:57 +0100 Subject: [PATCH 2095/2352] Disable ROC deep cleanu procedure Now, we have a patch in PDA which makes the deep cleanup unneeded. --- o2-aliecs-shmcleaner | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/o2-aliecs-shmcleaner b/o2-aliecs-shmcleaner index a0fec0a35..e2358e8e6 100644 --- a/o2-aliecs-shmcleaner +++ b/o2-aliecs-shmcleaner @@ -94,7 +94,7 @@ done rm -f /dev/shm/*fmq* # Cleanup any ROC-allocated memory -if false; then +if true; then # This is the standard cleanup procedure yes | roc-cleanup --light > /dev/null 3>&1 else From cdb32b0892699804a0494f4853d40a795e4464ac Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 19 Mar 2025 16:16:00 +0100 Subject: [PATCH 2096/2352] [occ] bump OCC to c++20 Since the new abseil in https://github.com/alisw/alidist/pull/5793 exposes c++20 in headers, we have to bump accordingly. --- occ/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 31ec6c789..81c89a57b 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -103,11 +103,11 @@ project(occ ### set(CMAKE_POSITION_INDEPENDENT_CODE ON) -set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD_REQUIRED ON) -set(CMAKE_CXX_EXTENSIONS OFF) #we want std=c++14, not std=gnu++14 +set(CMAKE_CXX_EXTENSIONS OFF) #we want std=c++20, not std=gnu++20 if (CMAKE_COMPILER_IS_GNUCXX) if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.9 OR @@ -259,7 +259,7 @@ set_target_properties(${OCCLIBRARY} PROPERTIES SOVERSION ${OCC_VERSION_SHORT} PUBLIC_HEADER "${OCCLIBRARY_PUBLIC_HEADERS}") -target_compile_features(${OCCLIBRARY} PUBLIC cxx_std_14) +target_compile_features(${OCCLIBRARY} PUBLIC cxx_std_20) # Install library include(GNUInstallDirs) From d310b1e1c0624d07d601d81a959903220df89df9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 20 Mar 2025 09:02:57 +0100 Subject: [PATCH 2097/2352] [build] Bump to v1.29.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 57aa229dd..7c1b0c0e1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 28 -VERSION_PATCH := 1 +VERSION_MINOR := 29 +VERSION_PATCH := 0 From a192490cfb66bd598b40e9a9906320875de94c37 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 17 Mar 2025 16:58:31 +0100 Subject: [PATCH 2098/2352] [core] More concise logging calls in DCS plugin --- core/integration/dcs/plugin.go | 242 ++++----------------------------- 1 file changed, 29 insertions(+), 213 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 0b070392e..8bab8b3f6 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -414,13 +414,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack = make(map[string]interface{}) stack["PrepareForRun"] = func() (out string) { // must formally return string even when we return nothing var err error + log := log.WithField("partition", envId).WithField("call", "PrepareForRun") callFailedStr := "DCS PrepareForRun call failed" dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { - log.WithField("partition", envId). - WithField("call", "PrepareForRun"). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -428,8 +427,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -449,14 +446,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Warnf("cannot parse DCS PFR grace period, assuming 0 seconds") } } else { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Info("DCS PFR grace period not set, defaulting to 0 seconds") } @@ -488,8 +481,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } else { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). WithField("grace_period", pfrGracePeriod.String()). WithField("remaining_grace_period", pfrGraceTimeout.Sub(time.Now()).String()). Infof("waiting for DCS operation readiness: %s", err.Error()) @@ -511,8 +502,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if len(dcsDetectorsCompatibleWithPfr) == 0 { // if actually none are ready, we bail log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -533,8 +522,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } else if isCompatibleWithOperation && err != nil { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Warnf("cannot determine PFR readiness: %s", err.Error()) } @@ -555,19 +542,15 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // with gathering params for the operation if len(ecsDetectorsIncompatibleWithPfr) > 0 { - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). + log.WithField("level", infologger.IL_Ops). Warnf("skipping DCS PFR for detectors: %s - a detector state compatible with PFR was not reached within %s", strings.Join(ecsDetectorsIncompatibleWithPfr, " "), pfrGracePeriod) } - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). + log.WithField("level", infologger.IL_Ops). Infof("performing DCS PFR for detectors: %s", strings.Join(dcsDetectorsCompatibleWithPfr.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] if !ok { - log.WithField("partition", envId). - WithField("call", "PrepareForRun"). - Debug("no DCS SOR parameters set") + log.Debug("no DCS SOR parameters set") parameters = "{}" } @@ -577,9 +560,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { err = fmt.Errorf("error processing DCS PFR parameters: %w", err) log.WithError(err). - WithField("partition", envId). WithField("level", infologger.IL_Ops). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -616,9 +597,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ecsDet := dcsToEcsDetector(dcsDet) perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] if !okParam { - log.WithField("partition", envId). - WithField("call", "PrepareForRun"). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } detectorArgMap := make(map[string]string) @@ -629,8 +608,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). WithField("detector", ecsDet). Error("DCS error") @@ -647,8 +624,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "PrepareForRun"). WithField("detector", ecsDet). Error("DCS error") @@ -660,14 +635,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // We parse the consolidated per-detector payload for any defaultable parameters with value "default" detectorArgMap = resolveDefaults(detectorArgMap, varStack, ecsDet, - log.WithField("partition", envId). - WithField("call", "PrepareForRun"). - WithField("detector", ecsDet)) + log.WithField("detector", ecsDet)) detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, - log.WithField("partition", envId). - WithField("call", "PrepareForRun"). - WithField("detector", ecsDet)) + log.WithField("detector", ecsDet)) in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, @@ -681,8 +652,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -697,8 +666,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -737,8 +704,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -779,14 +744,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination logMsg := "DCS PFR event stream was closed from the DCS side (EOF)" - log.WithField("partition", envId). - Debug(logMsg) + log.Debug(logMsg) break // no more data } if errors.Is(err, context.DeadlineExceeded) { log.WithError(err). - WithField("partition", envId). WithField("timeout", timeout.String()). Debug("DCS PFR timed out") err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) @@ -809,7 +772,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if got == codes.DeadlineExceeded { log.WithError(err). - WithField("partition", envId). WithField("timeout", timeout.String()). Debug("DCS PFR timed out") err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) @@ -842,7 +804,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) } else { // some other gRPC error code log.WithError(err). - WithField("partition", envId). Error("DCS PFR call error") err = fmt.Errorf("DCS PFR call error: %w", err) @@ -878,8 +839,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -915,8 +874,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -952,8 +909,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -982,7 +937,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { if dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Support). Debug("DCS PFR completed successfully") @@ -1005,8 +959,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("partition", envId). - WithField("detector", ecsDet). + log.WithField("detector", ecsDet). Debugf("DCS PFR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) detPayload := map[string]interface{}{} @@ -1030,13 +983,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Support). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS PFR operation : completed DCS PFR for ") } else { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Devel). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS PFR operation : processing DCS PFR for ") @@ -1092,8 +1043,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("partition", envId). - WithField("call", "PrepareForRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -1118,23 +1067,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { stack["StartOfRun"] = func() (out string) { // must formally return string even when we return nothing var err error callFailedStr := "DCS StartOfRun call failed" + log := log.WithField("partition", envId).WithField("call", "StartOfRun") rn := varStack["run_number"] var runNumber64 int64 runNumber64, err = strconv.ParseInt(rn, 10, 32) if err != nil { - log.WithField("partition", envId). - WithField("call", "StartOfRun"). - WithError(err). + log.WithError(err). Error("cannot acquire run number for DCS SOR") } + log = log.WithField("run", runNumber64) dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { - log.WithField("partition", envId). - WithField("call", "StartOfRun"). - WithField("run", runNumber64). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -1142,8 +1088,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1162,14 +1106,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). Warnf("cannot parse DCS SOR grace period, assuming 0 seconds") } } else { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). Info("DCS SOR grace period not set, defaulting to 0 seconds") } @@ -1200,8 +1140,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } else { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). WithField("grace_period", sorGracePeriod.String()). WithField("remaining_grace_period", sorGraceTimeout.Sub(time.Now()).String()). Infof("waiting for DCS operation readiness: %s", err.Error()) @@ -1219,8 +1157,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if !isCompatibleWithOperation { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1240,8 +1176,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } else if isCompatibleWithOperation && err != nil { log.WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). Warnf("cannot determine SOR readiness: %s", err.Error()) } @@ -1260,16 +1194,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // By now the DCS must be in a compatible state, so we proceed with gathering params for the operation - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("run", runNumber64). + log.WithField("level", infologger.IL_Ops). Infof("performing DCS SOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_sor_parameters"] if !ok { - log.WithField("partition", envId). - WithField("call", "StartOfRun"). - Debug("no DCS SOR parameters set") + log.Debug("no DCS SOR parameters set") parameters = "{}" } @@ -1279,9 +1209,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { err = fmt.Errorf("error processing DCS SOR parameters: %w", err) log.WithError(err). - WithField("partition", envId). WithField("level", infologger.IL_Ops). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1318,10 +1246,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ecsDet := dcsToEcsDetector(dcsDet) perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_sor_parameters"] if !okParam { - log.WithField("partition", envId). - WithField("run", runNumber64). - WithField("call", "StartOfRun"). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } detectorArgMap := make(map[string]string) @@ -1332,10 +1257,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). WithField("detector", ecsDet). - WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1351,10 +1273,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "StartOfRun"). WithField("detector", ecsDet). - WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1365,16 +1284,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // We parse the consolidated per-detector payload for any defaultable parameters with value "default" detectorArgMap = resolveDefaults(detectorArgMap, varStack, ecsDet, - log.WithField("partition", envId). - WithField("call", "StartOfRun"). - WithField("detector", ecsDet). - WithField("run", runNumber64)) + log.WithField("detector", ecsDet)) detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, - log.WithField("partition", envId). - WithField("call", "StartOfRun"). - WithField("detector", ecsDet). - WithField("run", runNumber64)) + log.WithField("detector", ecsDet)) in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, @@ -1388,9 +1301,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1405,9 +1315,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1446,9 +1353,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1490,16 +1394,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination logMsg := "DCS SOR event stream was closed from the DCS side (EOF)" - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug(logMsg) + log.Debug(logMsg) break // no more data } if errors.Is(err, context.DeadlineExceeded) { log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS SOR timed out") err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) @@ -1522,8 +1422,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if got == codes.DeadlineExceeded { log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS SOR timed out") err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) @@ -1542,8 +1440,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else if got == codes.Unknown { // unknown error, likely not a gRPC code logMsg := "bad DCS SOR event received, any future DCS events are ignored" log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). Warn(logMsg) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ @@ -1558,8 +1454,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) } else { // some other gRPC error code log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). Debug("DCS SOR call error") err = fmt.Errorf("DCS SOR call error: %w", err) @@ -1578,9 +1472,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } if dcsEvent == nil { - log.WithField("partition", envId). - WithField("run", runNumber64). - Warn("nil DCS SOR event received, skipping to next DCS event") + log.Warn("nil DCS SOR event received, skipping to next DCS event") continue } @@ -1596,9 +1488,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -1634,9 +1523,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -1672,9 +1558,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -1703,8 +1586,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { if dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("run", runNumber64). WithField("level", infologger.IL_Support). Debug("DCS SOR completed successfully") p.pendingEORs[envId] = runNumber64 @@ -1728,9 +1609,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("partition", envId). - WithField("run", runNumber64). - WithField("detector", ecsDet). + log.WithField("detector", ecsDet). Debugf("DCS SOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) detPayload := map[string]interface{}{} @@ -1754,16 +1633,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Support). - WithField("run", runNumber64). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS SOR operation : completed DCS SOR for ") } else { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Devel). - WithField("run", runNumber64). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS SOR operation : processing DCS SOR for ") @@ -1821,9 +1696,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "StartOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -1847,12 +1719,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } eorFunc := func(runNumber64 int64) (out string) { // must formally return string even when we return nothing callFailedStr := "DCS EndOfRun call failed" + log := log.WithField("partition", envId).WithField("call", "EndOfRun").WithField("run", runNumber64) dcsDetectorsParam, ok := varStack["dcs_detectors"] if !ok { - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") dcsDetectorsParam = "[\"NULL_DETECTOR\"]" } @@ -1860,8 +1731,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1870,9 +1739,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). - WithField("run", runNumber64). + log.WithField("level", infologger.IL_Ops). Infof("performing DCS EOR for detectors: %s", strings.Join(dcsDetectors.EcsDetectorsSlice(), " ")) parameters, ok := varStack["dcs_eor_parameters"] @@ -1890,8 +1757,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1909,9 +1774,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { ecsDet := dcsToEcsDetector(dcsDet) perDetectorParameters, okParam := varStack[strings.ToLower(ecsDet)+"_dcs_eor_parameters"] if !okParam { - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("empty DCS detectors list provided") + log.Debug("empty DCS detectors list provided") perDetectorParameters = "{}" } detectorArgMap := make(map[string]string) @@ -1922,10 +1785,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "EndOfRun"). WithField("detector", ecsDet). - WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1941,10 +1801,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). - WithField("partition", envId). - WithField("call", "EndOfRun"). WithField("detector", ecsDet). - WithField("run", runNumber64). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1965,9 +1822,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -1981,9 +1835,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -2023,9 +1874,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = err.Error() @@ -2048,9 +1896,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Debug("DCS EndOfRun returned stream, awaiting responses (DCS cleanup will not run for this environment)") detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) @@ -2079,16 +1924,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination logMsg := "DCS EOR event stream was closed from the DCS side (EOF)" - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug(logMsg) + log.Debug(logMsg) break // no more data } if errors.Is(err, context.DeadlineExceeded) { log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS EOR timed out") err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) @@ -2111,8 +1952,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if got == codes.DeadlineExceeded { log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). WithField("timeout", timeout.String()). Debug("DCS EOR timed out") err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) @@ -2131,8 +1970,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else if got == codes.Unknown { // unknown error, likely not a gRPC code logMsg := "bad DCS EOR event received, any future DCS events are ignored" log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). Warn(logMsg) the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ @@ -2147,8 +1984,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { }) } else { // some other gRPC error code log.WithError(err). - WithField("partition", envId). - WithField("run", runNumber64). Debug("DCS EOR call error") err = fmt.Errorf("DCS EOR call error: %w", err) @@ -2167,9 +2002,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } if dcsEvent == nil { - log.WithField("partition", envId). - WithField("run", runNumber64). - Warn("nil DCS EOR event received, skipping to next DCS event") + log.Warn("nil DCS EOR event received, skipping to next DCS event") continue } @@ -2188,9 +2021,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -2226,9 +2056,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("detector", ecsDet). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() @@ -2257,8 +2084,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { if dcsEvent.GetDetector() == dcspb.Detector_DCS { log.WithField("event", dcsEvent). - WithField("partition", envId). - WithField("run", runNumber64). WithField("level", infologger.IL_Support). Debug("DCS EOR completed successfully") delete(p.pendingEORs, envId) @@ -2282,9 +2107,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { break } else { ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("partition", envId). - WithField("run", runNumber64). - WithField("detector", dcsEvent.GetDetector().String()). + log.WithField("detector", dcsEvent.GetDetector().String()). Debugf("DCS EOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) detPayload := map[string]interface{}{} @@ -2308,16 +2131,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Support). - WithField("run", runNumber64). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : completed DCS EOR for ") } else { log.WithField("event", dcsEvent). - WithField("partition", envId). WithField("level", infologger.IL_Devel). - WithField("run", runNumber64). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : processing DCS EOR for ") @@ -2371,9 +2190,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(logErr). WithField("level", infologger.IL_Ops). WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). - WithField("call", "EndOfRun"). Error("DCS error") call.VarStack["__call_error_reason"] = logErr.Error() From cd537c2c021eec8b52b4f6d424ebbaa3c837ad65 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 25 Mar 2025 12:03:29 +0100 Subject: [PATCH 2099/2352] [core] ECS waits until DCS operation completes in case a detector fails This changes how we consume reply streams of requests to DCS. In particular, we do not stop consuming events in case we receive a detector error and instead we wait to receive the status of all the other detectors. As it has been clarified with the DCS team, Ecs2DcsGateway never sends "a pre-closure summary of the current operation" with detector == DCS, despite the documentation in the dcs.proto file. The latest version of this proto file in the Ecs2DcsGateway repo has the comment removed. With this commit, we treat an EOF from DCS as the only correct stream termination and do not ever expect a detector == DCS event. We also remove some reduntant operations, but more refactoring will have to come. Closes OCTRL-711. --- core/integration/dcs/plugin.go | 309 +++++++++++---------------------- 1 file changed, 102 insertions(+), 207 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 8bab8b3f6..03fa94383 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -725,6 +725,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var dcsEvent *dcspb.RunEvent for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires if ctx.Err() != nil { err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) @@ -743,8 +744,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination - logMsg := "DCS PFR event stream was closed from the DCS side (EOF)" - log.Debug(logMsg) + log.Debug("DCS PFR event stream was closed from the DCS side (EOF)") + err = nil break // no more data } @@ -826,10 +827,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Warn("nil DCS PFR event received, skipping to next DCS event") continue } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } - if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { logErr := fmt.Errorf("%s PFR failure reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -851,7 +858,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, @@ -859,12 +866,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } if dcsEvent.GetState() == dcspb.DetectorState_PFR_UNAVAILABLE { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s PFR unavailable reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -886,7 +891,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, @@ -894,12 +899,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s PFR timeout reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -921,7 +924,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: PrepareForRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, @@ -929,70 +932,37 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - Debug("DCS PFR completed successfully") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["dcsEvent"] = dcsEvent - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - - break - } else { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("detector", ecsDet). - Debugf("DCS PFR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - - } - } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { log.WithField("event", dcsEvent). WithField("level", infologger.IL_Support). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + WithField("detector", ecsDet). Info("ALIECS PFR operation : completed DCS PFR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) } else { log.WithField("event", dcsEvent). WithField("level", infologger.IL_Devel). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + WithField("detector", ecsDet). Info("ALIECS PFR operation : processing DCS PFR for ") - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["detector"] = ecsDet @@ -1010,7 +980,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Payload: string(detPayloadJson[:]), }) } - } dcsFailedEcsDetectors := make([]string, 0) @@ -1034,9 +1003,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { logErr := fmt.Errorf("PFR failed for %s", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { - if errors.Is(err, io.EOF) { - err = fmt.Errorf("DCS PFR stream unexpectedly terminated from DCS side before completion: %w", err) - } logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -1375,6 +1341,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var dcsEvent *dcspb.RunEvent for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires if ctx.Err() != nil { err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) @@ -1393,8 +1360,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination - logMsg := "DCS SOR event stream was closed from the DCS side (EOF)" - log.Debug(logMsg) + log.Debug("DCS SOR event stream was closed from the DCS side (EOF)") + err = nil break // no more data } @@ -1475,10 +1442,16 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.Warn("nil DCS SOR event received, skipping to next DCS event") continue } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } - if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { logErr := fmt.Errorf("%s SOR failure reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -1500,7 +1473,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, @@ -1508,12 +1481,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } if dcsEvent.GetState() == dcspb.DetectorState_SOR_UNAVAILABLE { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s SOR unavailable reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -1535,7 +1506,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, @@ -1543,12 +1514,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s SOR timeout reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -1570,7 +1539,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: StartOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, @@ -1578,64 +1547,31 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - Debug("DCS SOR completed successfully") - p.pendingEORs[envId] = runNumber64 - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["dcsEvent"] = dcsEvent - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - - break - } else { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("detector", ecsDet). - Debugf("DCS SOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - - } - } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { log.WithField("event", dcsEvent). WithField("level", infologger.IL_Support). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS SOR operation : completed DCS SOR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) } else { log.WithField("event", dcsEvent). WithField("level", infologger.IL_Devel). @@ -1659,9 +1595,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { EnvironmentId: envId, Payload: string(detPayloadJson[:]), }) - } - } dcsFailedEcsDetectors := make([]string, 0) @@ -1687,9 +1621,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } else { logErr := fmt.Errorf("SOR failed for %s, DCS EOR will run anyway for this run", strings.Join(dcsFailedEcsDetectors, ", ")) if err != nil { - if errors.Is(err, io.EOF) { - err = fmt.Errorf("DCS SOR stream unexpectedly terminated from DCS side before completion: %w", err) - } logErr = fmt.Errorf("%v : %v", err, logErr) } @@ -1905,6 +1836,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var dcsEvent *dcspb.RunEvent for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires if ctx.Err() != nil { err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) @@ -1923,8 +1855,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } dcsEvent, err = stream.Recv() if errors.Is(err, io.EOF) { // correct stream termination - logMsg := "DCS EOR event stream was closed from the DCS side (EOF)" - log.Debug(logMsg) + log.Debug("DCS EOR event stream was closed from the DCS side (EOF)") + err = nil break // no more data } @@ -2005,17 +1937,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.Warn("nil DCS EOR event received, skipping to next DCS event") continue } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } - if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { logErr := fmt.Errorf("%s EOR failure reported by DCS", ecsDet) - if err != nil { - if errors.Is(err, io.EOF) { - err = fmt.Errorf("DCS EOR stream unexpectedly terminated from DCS side before completion: %w", err) - } - logErr = fmt.Errorf("%v : %v", err, logErr) - } log.WithError(logErr). WithField("event", dcsEvent). WithField("detector", ecsDet). @@ -2033,7 +1965,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_ERROR, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_ERROR, EnvironmentId: envId, @@ -2041,12 +1973,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return + continue } if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - logErr := fmt.Errorf("%s EOR timeout reported by DCS", ecsDet) if err != nil { logErr = fmt.Errorf("%v : %v", err, logErr) @@ -2068,7 +1998,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ Name: call.GetName(), OperationName: call.Func, - OperationStatus: pb.OpStatus_DONE_TIMEOUT, + OperationStatus: pb.OpStatus_ONGOING, OperationStep: "perform DCS call: EndOfRun", OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, EnvironmentId: envId, @@ -2076,57 +2006,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error: logErr.Error(), }) - return - } - - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - Debug("DCS EOR completed successfully") - delete(p.pendingEORs, envId) - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - - break - } else { - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - log.WithField("detector", dcsEvent.GetDetector().String()). - Debugf("DCS EOR for %s: received status %s", ecsDet, dcsEvent.GetState().String()) - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } + continue } if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { @@ -2134,13 +2014,29 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("level", infologger.IL_Support). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : completed DCS EOR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) } else { log.WithField("event", dcsEvent). WithField("level", infologger.IL_Devel). WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). Info("ALIECS EOR operation : processing DCS EOR for ") - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) detPayload := map[string]interface{}{} _ = copier.Copy(&detPayload, payload) detPayload["detector"] = ecsDet @@ -2157,7 +2053,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { EnvironmentId: envId, Payload: string(detPayloadJson[:]), }) - } } From d81e31c56c07f3431971edd271370ac34066da57 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 25 Mar 2025 16:26:39 +0100 Subject: [PATCH 2100/2352] [core] Sync DCS proto with ecs2dcsgateway Includes updating some comments and removing CPV and PHS, nothing revolutionary. --- core/integration/dcs/protos/dcs.pb.go | 191 ++++++++++----------- core/integration/dcs/protos/dcs.proto | 18 +- core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- core/integration/dcs/structs_test.go | 20 +-- 4 files changed, 111 insertions(+), 120 deletions(-) diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index ee8fa693b..e816c6898 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.31.0 -// protoc v4.25.1 +// protoc v5.26.1 // source: protos/dcs.proto package dcspb @@ -115,7 +115,6 @@ type Detector int32 const ( Detector_NULL_DETECTOR Detector = 0 - Detector_CPV Detector = 1 Detector_EMC Detector = 2 Detector_FDD Detector = 3 Detector_FT0 Detector = 4 @@ -125,7 +124,6 @@ const ( Detector_MCH Detector = 8 Detector_MFT Detector = 9 Detector_MID Detector = 10 - Detector_PHS Detector = 11 Detector_TOF Detector = 12 Detector_TPC Detector = 13 Detector_TRD Detector = 14 @@ -139,7 +137,6 @@ const ( var ( Detector_name = map[int32]string{ 0: "NULL_DETECTOR", - 1: "CPV", 2: "EMC", 3: "FDD", 4: "FT0", @@ -149,7 +146,6 @@ var ( 8: "MCH", 9: "MFT", 10: "MID", - 11: "PHS", 12: "TOF", 13: "TPC", 14: "TRD", @@ -160,7 +156,6 @@ var ( } Detector_value = map[string]int32{ "NULL_DETECTOR": 0, - "CPV": 1, "EMC": 2, "FDD": 3, "FT0": 4, @@ -170,7 +165,6 @@ var ( "MCH": 8, "MFT": 9, "MID": 10, - "PHS": 11, "TOF": 12, "TPC": 13, "TRD": 14, @@ -720,8 +714,8 @@ func (x *Event) GetMessage() string { return "" } -// Each SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. -// This is needed in order to pass per-detector parameters within a single SOR/EOR operation. +// Each PfrRequest/SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. +// This is needed in order to pass per-detector parameters within a single PFR/SOR/EOR operation. type DetectorOperationRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -964,18 +958,17 @@ func (x *EorRequest) GetRunNumber() int32 { return 0 } -// A stream of Event objects is returned by SOR and EOR calls. +// A stream of Event objects is returned by PFR, SOR and EOR calls. // Most fields are optional and filled as needed, depending on the type of request. type RunEvent struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` // type of event being published by the DCS service - Detector Detector `protobuf:"varint,2,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // if detector==DCS, the update is a pre-closure summary - // of the current operation - State DetectorState `protobuf:"varint,3,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` // aggregate state for all detectors involved in current - // SOR/EOR operation + Eventtype EventType `protobuf:"varint,1,opt,name=eventtype,proto3,enum=dcs.EventType" json:"eventtype,omitempty"` // type of event being published by the DCS service + Detector Detector `protobuf:"varint,2,opt,name=detector,proto3,enum=dcs.Detector" json:"detector,omitempty"` // detector that produced the event + State DetectorState `protobuf:"varint,3,opt,name=state,proto3,enum=dcs.DetectorState" json:"state,omitempty"` // aggregate state for all detectors involved in current + // PFR/SOR/EOR operation ExtraParameters map[string]string `protobuf:"bytes,4,rep,name=extraParameters,proto3" json:"extraParameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` Timestamp string `protobuf:"bytes,5,opt,name=timestamp,proto3" json:"timestamp,omitempty"` Message string `protobuf:"bytes,6,opt,name=message,proto3" json:"message,omitempty"` // optional user-facing error message, if the DCS wants to @@ -1279,91 +1272,91 @@ var file_protos_dcs_proto_rawDesc = []byte{ 0x0d, 0x0a, 0x09, 0x45, 0x4f, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x1e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x28, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x46, 0x52, 0x5f, 0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x32, - 0x2a, 0xbf, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, + 0x2a, 0xb9, 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x43, 0x50, 0x56, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, - 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, - 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, - 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, - 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, - 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x48, - 0x53, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, - 0x54, 0x50, 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, - 0x0a, 0x03, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, - 0x12, 0x07, 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, - 0x10, 0x12, 0x2a, 0xcd, 0x02, 0x0a, 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, - 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, - 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, - 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, - 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, - 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, - 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, - 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, - 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, - 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, - 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, - 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, - 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, - 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, - 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, - 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, - 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, - 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, - 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, - 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, - 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, - 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, - 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, - 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, - 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, - 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, - 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, - 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, - 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, - 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, - 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, - 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, - 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, - 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, - 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x07, 0x0a, 0x03, 0x45, 0x4d, 0x43, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x44, 0x44, + 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x46, 0x54, 0x30, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x46, + 0x56, 0x30, 0x10, 0x05, 0x12, 0x07, 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, + 0x03, 0x48, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x44, 0x10, + 0x0a, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4f, 0x46, 0x10, 0x0c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, + 0x43, 0x10, 0x0d, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x52, 0x44, 0x10, 0x0e, 0x12, 0x07, 0x0a, 0x03, + 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, 0x43, 0x10, 0x10, 0x12, 0x07, + 0x0a, 0x03, 0x44, 0x43, 0x53, 0x10, 0x11, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x47, 0x44, 0x10, 0x12, + 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x0b, 0x10, 0x0b, 0x2a, 0xcd, 0x02, 0x0a, + 0x0d, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, + 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x52, 0x45, 0x41, 0x44, 0x59, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x55, 0x4e, + 0x5f, 0x4f, 0x4b, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x46, 0x41, 0x49, + 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x55, 0x4e, 0x5f, 0x49, 0x4e, + 0x48, 0x49, 0x42, 0x49, 0x54, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, 0x50, + 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, + 0x45, 0x4f, 0x52, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x4e, 0x47, 0x10, + 0x06, 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, + 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x45, 0x4f, 0x52, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x10, 0x08, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x09, 0x12, 0x08, + 0x0a, 0x04, 0x44, 0x45, 0x41, 0x44, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x4f, 0x52, 0x5f, + 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0b, 0x12, 0x13, 0x0a, + 0x0f, 0x45, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, + 0x10, 0x0c, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, + 0x0d, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x45, 0x4f, 0x52, 0x5f, 0x41, 0x56, 0x41, 0x49, + 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x0f, 0x12, 0x11, 0x0a, 0x0d, 0x50, 0x46, 0x52, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x10, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x46, + 0x52, 0x5f, 0x55, 0x4e, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x11, 0x12, + 0x0b, 0x0a, 0x07, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x12, 0x2a, 0xf8, 0x02, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x55, 0x4c, 0x4c, + 0x5f, 0x52, 0x55, 0x4e, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x48, + 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x45, 0x43, 0x48, 0x4e, + 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, + 0x41, 0x4c, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x1b, 0x0a, 0x17, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, + 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, 0x54, + 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, + 0x08, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, + 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, + 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, + 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, + 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x41, 0x4c, 0x49, 0x42, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, 0x12, + 0x12, 0x08, 0x0a, 0x03, 0x41, 0x4e, 0x59, 0x10, 0xac, 0x02, 0x22, 0x04, 0x08, 0x0d, 0x10, 0x0f, + 0x22, 0x05, 0x08, 0x13, 0x10, 0xab, 0x02, 0x2a, 0x2c, 0x0a, 0x0b, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x54, 0x49, 0x4e, + 0x55, 0x4f, 0x55, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x52, 0x49, 0x47, 0x47, 0x45, + 0x52, 0x45, 0x44, 0x10, 0x01, 0x2a, 0x1d, 0x0a, 0x07, 0x53, 0x6f, 0x72, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, + 0x53, 0x54, 0x10, 0x01, 0x32, 0x91, 0x02, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x35, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x62, 0x65, 0x12, 0x18, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x64, + 0x63, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x0d, + 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x46, 0x6f, 0x72, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, + 0x64, 0x63, 0x73, 0x2e, 0x50, 0x66, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, + 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x30, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, + 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x2e, 0x0a, 0x08, 0x45, 0x6e, 0x64, 0x4f, 0x66, 0x52, 0x75, 0x6e, 0x12, + 0x0f, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0d, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, + 0x00, 0x30, 0x01, 0x12, 0x33, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x12, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x64, 0x63, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x56, 0x0a, 0x11, 0x63, 0x68, 0x2e, 0x63, + 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x64, 0x63, 0x73, 0x5a, 0x41, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, + 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, + 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x64, 0x63, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x64, 0x63, 0x73, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/dcs/protos/dcs.proto b/core/integration/dcs/protos/dcs.proto index e99308e24..053f33cd6 100644 --- a/core/integration/dcs/protos/dcs.proto +++ b/core/integration/dcs/protos/dcs.proto @@ -125,11 +125,11 @@ message Event { } ////////////////////////////////////////////////////// -// SOR/EOR calls +// PFR/SOR/EOR calls ////////////////////////////////////////////////////// -// Each SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. -// This is needed in order to pass per-detector parameters within a single SOR/EOR operation. +// Each PfrRequest/SorRequest/EorRequest contains multiple DetectorOperationRequests, one per detector. +// This is needed in order to pass per-detector parameters within a single PFR/SOR/EOR operation. message DetectorOperationRequest { Detector detector = 1; map extraParameters = 2; // detector-specific parameters @@ -159,14 +159,13 @@ message EorRequest { int32 runNumber = 2; } -// A stream of Event objects is returned by SOR and EOR calls. +// A stream of Event objects is returned by PFR, SOR and EOR calls. // Most fields are optional and filled as needed, depending on the type of request. message RunEvent { EventType eventtype = 1; // type of event being published by the DCS service - Detector detector = 2; // if detector==DCS, the update is a pre-closure summary - // of the current operation + Detector detector = 2; // detector that produced the event DetectorState state = 3; // aggregate state for all detectors involved in current - // SOR/EOR operation + // PFR/SOR/EOR operation map extraParameters = 4; string timestamp = 5; string message = 6; // optional user-facing error message, if the DCS wants to @@ -210,7 +209,7 @@ enum EventType { enum Detector { NULL_DETECTOR = 0; - CPV = 1; + reserved 1; // CPV was removed during YETS 2024-2025 EMC = 2; FDD = 3; FT0 = 4; @@ -220,7 +219,7 @@ enum Detector { MCH = 8; MFT = 9; MID = 10; - PHS = 11; + reserved 11; // PHS was removed during YETS 2024-2025 TOF = 12; TPC = 13; TRD = 14; @@ -284,4 +283,3 @@ enum SorMode { // FIXME: unused FULL = 0; FAST = 1; } - diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index b6a7ab51a..7619406c4 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.1 +// - protoc v5.26.1 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/structs_test.go b/core/integration/dcs/structs_test.go index 066160b22..d01689572 100644 --- a/core/integration/dcs/structs_test.go +++ b/core/integration/dcs/structs_test.go @@ -51,7 +51,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=NULL", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_ZDC: dcspb.DetectorState_NULL_STATE, dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, }, @@ -62,7 +62,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=SOR_AVAILABLE/states=NULL", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_ZDC: dcspb.DetectorState_NULL_STATE, dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, }, @@ -73,7 +73,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=NULL,PFR_UNAVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_ZDC: dcspb.DetectorState_NULL_STATE, dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_UNAVAILABLE, @@ -85,7 +85,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=NULL,PFR_AVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_ZDC: dcspb.DetectorState_NULL_STATE, dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -97,7 +97,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=NULL,PFR_AVAILABLE,PFR_UNAVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_NULL_STATE, + dcspb.Detector_ZDC: dcspb.DetectorState_NULL_STATE, dcspb.Detector_FT0: dcspb.DetectorState_NULL_STATE, dcspb.Detector_MID: dcspb.DetectorState_NULL_STATE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -110,7 +110,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_ZDC: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -123,7 +123,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=SOR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_ZDC: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -136,7 +136,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE,PFR_UNAVAILABLE,DEAD,ERROR,RUN_INHIBIT", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_DEAD, + dcspb.Detector_ZDC: dcspb.DetectorState_DEAD, dcspb.Detector_FT0: dcspb.DetectorState_ERROR, dcspb.Detector_MID: dcspb.DetectorState_RUN_INHIBIT, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -149,7 +149,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=PFR_AVAILABLE/states=PFR_AVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_ZDC: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, @@ -162,7 +162,7 @@ func TestDCSDetectorOpAvailabilityMap_compatibleWithDCSOperation(t *testing.T) { { name: "condition=SOR_AVAILABLE/states=PFR_AVAILABLE", dsm: map[dcspb.Detector]dcspb.DetectorState{ - dcspb.Detector_CPV: dcspb.DetectorState_PFR_AVAILABLE, + dcspb.Detector_ZDC: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_FT0: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_MID: dcspb.DetectorState_PFR_AVAILABLE, dcspb.Detector_EMC: dcspb.DetectorState_PFR_AVAILABLE, From 83ac7e1f21522b522522ddcc5ed69dd351388239 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 24 Mar 2025 12:20:00 +0100 Subject: [PATCH 2101/2352] [doc] Update DCS PFR documentation As done in https://github.com/AliceO2Group/Control/commit/56e07f5ff8db060cfe7c6b499f5eec02d27f6732 , PFR continues for PFR-compatible detectors, even if some are incompatible. --- docs/handbook/operation_order.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 4a861897d..fdf05fa7e 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -126,9 +126,9 @@ to the DCS service. If the grace period ends and at least one detector included in the environment is still incompatible with PFR, the PFR -operation **will not run for any detector**. +operation will be performed for the PFR-compatible detectors. -However, the environment +Despite some detectors not having performed PFR, the environment can still transition forward towards the `RUNNING` state, and any DCS activities that would have taken place in PFR will instead happen during SOR. Only at that point, if at least one detector is not @@ -142,8 +142,8 @@ with PFR as reported by the DCS service (or become compatible during the grace period), the PFR operation is immediately requested to the DCS service. -If this operation fails for one or more detectors, the -`dcs.PrepareForRun` call as a whole is considered to have failed, +`dcs.PrepareForRun` call fails if no detectors are PFR-compatible +or PFR fails for all those which were PFR-compatible, but since it is non-critical the environment may still reach the `CONFIGURED` state and transition forward towards `RUNNING`. From 1c1fd0690b4abfdb59828dcce9d746ee18197303 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 24 Mar 2025 13:53:35 +0100 Subject: [PATCH 2102/2352] [core] Remove ddl_list from defaultable values in DCS plugin In this case, the mechanism was replaced with the outcomes of OCTRL-980, so we do not need ddl_list to be defaultable anymore. Closes OCTRL-995. --- core/integration/dcs/dcsutil.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/dcs/dcsutil.go b/core/integration/dcs/dcsutil.go index d6667f7ad..d1fb888b0 100644 --- a/core/integration/dcs/dcsutil.go +++ b/core/integration/dcs/dcsutil.go @@ -36,7 +36,7 @@ import ( func resolveDefaults(detectorArgMap map[string]string, varStack map[string]string, ecsDetector string, theLog *logrus.Entry) map[string]string { // Do we have any default expressions for defaultable values? - defaultableKeys := []string{"ddl_list"} + defaultableKeys := []string{} // at the moment we do not have any defaultable keys for _, key := range defaultableKeys { if defaultableValue, ok := detectorArgMap[key]; ok { From c99638119ea74f028e701892d3b1beb170e04e03 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Mar 2025 14:54:20 +0100 Subject: [PATCH 2103/2352] [build] Bump to v1.30.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 7c1b0c0e1..e622cfd59 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 29 +VERSION_MINOR := 30 VERSION_PATCH := 0 From 7491f7129016f641b2bd3d491556cbc076234d8f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Mar 2025 16:48:15 +0100 Subject: [PATCH 2104/2352] [core] fix a recursive mutex locking in task Fixes a bug reported in OCTRL-999. --- core/task/task.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/task/task.go b/core/task/task.go index d7420a4e3..eb834d672 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -251,6 +251,16 @@ func (t *Task) GetTraits() Traits { return Traits{} } +// lock-free version of GetTraits +func (t *Task) getTraits() Traits { + if class := t.GetTaskClass(); class != nil { + if t.parent != nil { + return t.parent.GetTaskTraits() + } + } + return Traits{} +} + // Returns a consolidated CommandInfo for this Task, based on Roles tree and // Class. func (t *Task) BuildTaskCommand(role parentRole) (err error) { @@ -525,7 +535,7 @@ func (t *Task) SendEvent(ev event.Event) { Hostname: t.hostname, ClassName: t.className, Path: t.getParentRolePath(), - Traits: traitsToPbTraits(t.GetTraits()), + Traits: traitsToPbTraits(t.getTraits()), } if t.parent == nil { From b86538513f28012e341e14ee645c77a6b89eab26 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 27 Mar 2025 17:44:38 +0100 Subject: [PATCH 2105/2352] [core] when getting task traits, retrieve parent only once for thread safety --- core/task/task.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core/task/task.go b/core/task/task.go index eb834d672..9e379c311 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -242,20 +242,18 @@ func (t *Task) GetControlMode() controlmode.ControlMode { return controlmode.DIRECT } -func (t *Task) GetTraits() Traits { - if class := t.GetTaskClass(); class != nil { - if t.GetParent() != nil { - return t.GetParent().GetTaskTraits() - } +func getTraits(role parentRole) Traits { + if role != nil { + return role.GetTaskTraits() } return Traits{} } -// lock-free version of GetTraits -func (t *Task) getTraits() Traits { +func (t *Task) GetTraits() Traits { if class := t.GetTaskClass(); class != nil { - if t.parent != nil { - return t.parent.GetTaskTraits() + parent := t.GetParent() + if parent != nil { + return getTraits(parent) } } return Traits{} @@ -535,7 +533,7 @@ func (t *Task) SendEvent(ev event.Event) { Hostname: t.hostname, ClassName: t.className, Path: t.getParentRolePath(), - Traits: traitsToPbTraits(t.getTraits()), + Traits: traitsToPbTraits(getTraits(t.parent)), } if t.parent == nil { From 783fc893bcdc69e5c8b7646eca6c33ad4e091de2 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 28 Mar 2025 09:01:51 +0100 Subject: [PATCH 2106/2352] [build] Bump to v1.30.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index e622cfd59..7f96a9988 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 30 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 77bdd3ab2ebf7b679f77e98ede2fee6d7ddddc3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 1 Apr 2025 14:40:00 +0200 Subject: [PATCH 2107/2352] [core] INVARIANT status introduced INVARIANT status is introduced to fix OCTRL-948. INVARIANT is overwritten by any other status in status product (X() function). We are taking account the criticality of the role when merging. If all roles are noncritical we are returning INVARIANT. If there is any critical role(s) we are merging and returning their status, which shouldn't be INVARIANT. All roles except taskRole and callrole are taken as critical --- core/task/status.go | 93 ++++++---- core/task/status_test.go | 110 +++++++++++ core/task/task_suite_test.go | 37 ++++ core/workflow/safestatus.go | 66 +++++-- core/workflow/safestatus_test.go | 308 +++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+), 60 deletions(-) create mode 100644 core/task/status_test.go create mode 100644 core/task/task_suite_test.go create mode 100644 core/workflow/safestatus_test.go diff --git a/core/task/status.go b/core/task/status.go index 3bfb35353..f21df2960 100644 --- a/core/task/status.go +++ b/core/task/status.go @@ -32,47 +32,59 @@ const ( PARTIAL ACTIVE UNDEPLOYABLE + INVARIANT // overwritten by product with any other state. It is used only when merging non-critical states. If you merge aggregateState with only non-critical statuses you will propagate INVARIANT further ) -var ( - STATUS_PRODUCT = map[Status]map[Status]Status{ - UNDEFINED: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEFINED, - PARTIAL: UNDEFINED, - ACTIVE: UNDEFINED, - UNDEPLOYABLE: UNDEFINED, - }, - INACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: INACTIVE, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - PARTIAL: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - ACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: ACTIVE, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - UNDEPLOYABLE: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEPLOYABLE, - PARTIAL: UNDEPLOYABLE, - ACTIVE: UNDEPLOYABLE, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - } -) +var STATUS_PRODUCT = map[Status]map[Status]Status{ + UNDEFINED: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEFINED, + PARTIAL: UNDEFINED, + ACTIVE: UNDEFINED, + UNDEPLOYABLE: UNDEFINED, + INVARIANT: UNDEFINED, + }, + INACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: INACTIVE, + }, + PARTIAL: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: PARTIAL, + }, + ACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: ACTIVE, + }, + UNDEPLOYABLE: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEPLOYABLE, + PARTIAL: UNDEPLOYABLE, + ACTIVE: UNDEPLOYABLE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: UNDEPLOYABLE, + }, + INVARIANT: { + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: INVARIANT, + }, +} func (s Status) String() string { names := []string{ @@ -81,8 +93,9 @@ func (s Status) String() string { "PARTIAL", "ACTIVE", "UNDEPLOYABLE", + "INVARIANT", } - if s > UNDEPLOYABLE { + if s > INVARIANT { return "UNDEFINED" } return names[s] diff --git a/core/task/status_test.go b/core/task/status_test.go new file mode 100644 index 000000000..b4c429230 --- /dev/null +++ b/core/task/status_test.go @@ -0,0 +1,110 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("task status", func() { + When("product of all statuses with UNDEFINED is done", func() { + undefined := Status(UNDEFINED) + It("should be UNDEFINED for all", func() { + Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEFINED))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(INACTIVE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(PARTIAL))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(ACTIVE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEPLOYABLE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(INVARIANT))) + }) + }) + When("product of all statuses with INACTIVE is done", func() { + inactive := Status(INACTIVE) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(inactive.X(UNDEFINED))) + Expect(Status(INACTIVE)).To(Equal(inactive.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(inactive.X(PARTIAL))) + Expect(Status(PARTIAL)).To(Equal(inactive.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(inactive.X(UNDEPLOYABLE))) + Expect(Status(INACTIVE)).To(Equal(inactive.X(INVARIANT))) + }) + }) + When("product of all statuses with PARTIAL is done", func() { + partial := Status(PARTIAL) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(partial.X(UNDEFINED))) + Expect(Status(PARTIAL)).To(Equal(partial.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(partial.X(PARTIAL))) + Expect(Status(PARTIAL)).To(Equal(partial.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(partial.X(UNDEPLOYABLE))) + Expect(Status(PARTIAL)).To(Equal(partial.X(INVARIANT))) + }) + }) + When("product of all statuses with ACTIVE is done", func() { + active := Status(ACTIVE) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(active.X(UNDEFINED))) + Expect(Status(PARTIAL)).To(Equal(active.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(active.X(PARTIAL))) + Expect(Status(ACTIVE)).To(Equal(active.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(active.X(UNDEPLOYABLE))) + Expect(Status(ACTIVE)).To(Equal(active.X(INVARIANT))) + }) + }) + When("product of all statuses with UNDEPLOYABLE is done", func() { + undeployable := Status(UNDEPLOYABLE) + It("should be UNDEPLOYABLE unless UNDEFINED", func() { + Expect(Status(UNDEFINED)).To(Equal(undeployable.X(UNDEFINED))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(PARTIAL))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(UNDEPLOYABLE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INVARIANT))) + }) + }) + When("product of all statuses with INVARIANT is done", func() { + invariant := Status(INVARIANT) + It("it should be the status the product was done with", func() { + Expect(Status(UNDEFINED)).To(Equal(invariant.X(UNDEFINED))) + Expect(Status(INACTIVE)).To(Equal(invariant.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(invariant.X(PARTIAL))) + Expect(Status(ACTIVE)).To(Equal(invariant.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(invariant.X(UNDEPLOYABLE))) + Expect(Status(INVARIANT)).To(Equal(invariant.X(INVARIANT))) + }) + }) + When("String() of Status is called", func() { + It("should return string representation of a status", func() { + Expect("UNDEFINED").To(Equal(Status(UNDEFINED).String())) + Expect("INACTIVE").To(Equal(Status(INACTIVE).String())) + Expect("PARTIAL").To(Equal(Status(PARTIAL).String())) + Expect("ACTIVE").To(Equal(Status(ACTIVE).String())) + Expect("UNDEPLOYABLE").To(Equal(Status(UNDEPLOYABLE).String())) + Expect("INVARIANT").To(Equal(Status(INVARIANT).String())) + Expect("UNDEFINED").To(Equal(Status(255).String())) + }) + }) +}) diff --git a/core/task/task_suite_test.go b/core/task/task_suite_test.go new file mode 100644 index 000000000..c5f0cf618 --- /dev/null +++ b/core/task/task_suite_test.go @@ -0,0 +1,37 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestTask(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Task Test Suite") +} diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 33f1a2049..044e86be6 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -25,11 +25,13 @@ package workflow import ( + "strconv" "strings" "sync" "github.com/AliceO2Group/Control/core/task" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) type SafeStatus struct { @@ -37,40 +39,64 @@ type SafeStatus struct { status task.Status } +func reportTraceRoles(roles []Role, status task.Status) { + if viper.GetBool("veryVerbose") { + stati := make([]string, len(roles)) + critical := make([]string, len(roles)) + names := make([]string, len(roles)) + for i, role := range roles { + stati[i] = role.GetStatus().String() + names[i] = role.GetName() + if taskR, isTaskRole := role.(*taskRole); isTaskRole { + critical[i] = strconv.FormatBool(taskR.IsCritical()) + } else if callR, isCallRole := role.(*callRole); isCallRole { + critical[i] = strconv.FormatBool(callR.IsCritical()) + } else { + critical[i] = strconv.FormatBool(true) + } + } + log.WithFields(logrus.Fields{ + "statuses": strings.Join(stati, ", "), + "critical": strings.Join(critical, ", "), + "names": strings.Join(names, ", "), + "aggregated": status.String(), + }). + Trace("aggregating statuses") + } +} + +// role that are not taskRole or callRole are critical by default func aggregateStatus(roles []Role) (status task.Status) { if len(roles) == 0 { status = task.UNDEFINED return } - stati := make([]string, len(roles)) - for i, role := range roles { - stati[i] = role.GetStatus().String() - } - status = roles[0].GetStatus() - if len(roles) > 1 { - for _, c := range roles[1:] { - if status == task.UNDEFINED { - log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "aggregated": status.String(), - }). - Trace("aggregating statuses") + status = task.INVARIANT + for _, role := range roles { + if status == task.UNDEFINED { + break + } - return + if taskR, isTaskRole := role.(*taskRole); isTaskRole { + if !taskR.IsCritical() { + continue + } + } else if callR, isCallRole := role.(*callRole); isCallRole { + if !callR.IsCritical() { + continue } - status = status.X(c.GetStatus()) } + status = status.X(role.GetStatus()) } - log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "aggregated": status.String(), - }). - Trace("aggregating statuses") + + reportTraceRoles(roles, status) return } +// TODO: this function is prime candidate for refactoring. The reason being that it mostly ignores status argument +// for merging, moreover it also does not use status of role from argument. Both of these behaivour are counter-intuitive. func (t *SafeStatus) merge(s task.Status, r Role) { t.mu.Lock() defer t.mu.Unlock() diff --git a/core/workflow/safestatus_test.go b/core/workflow/safestatus_test.go new file mode 100644 index 000000000..0e2306cc7 --- /dev/null +++ b/core/workflow/safestatus_test.go @@ -0,0 +1,308 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "github.com/AliceO2Group/Control/core/task" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/spf13/viper" +) + +var _ = Describe("safe status merge", func() { + viper.Set("veryVerbose", true) + When("Task and Call roles are used", func() { + It("status should be overwritten", func() { + { + cr := &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + cr.status.merge(task.ACTIVE, cr) + Expect(cr.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + } + { + tr := &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + tr.status.merge(task.INACTIVE, tr) + Expect(tr.GetStatus()).To(Equal(task.Status(task.INACTIVE))) + } + }) + }) + + When("Aggregate role is merged with UNDEFINED status", func() { + It("becomes UNDEFINED", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} + ar.status.merge(task.UNDEFINED, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Empty aggregate role is merged with any status (except UNDEFINED) status", func() { + It("becomes UNDEFINED", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}} + ar.status.merge(task.ACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Aggregate role is merged with the same status", func() { + It("does not change it's status", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} + ar.status.merge(task.ACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has ACTIVE subroles", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + // SafeStatus.Merge basically ignores status argument in a lot of cases, so it does not matter what we use here + // and in following tests + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes PARTIAL from INACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes PARTIAL from PARTIAL", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEFINED from UNDEFINED", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Aggregator role has no critical roles", func() { + It("becomes INVARIANT regardless of subrole statuses", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.INVARIANT))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one ACTIVE aggregator role", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one INACTIVE aggregator role", func() { + It("becomes PARTIAL", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) +}) From 47fb401c051e0051298927498cbecb5fe2116adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 2 Apr 2025 17:16:27 +0200 Subject: [PATCH 2108/2352] Added CODEOWNERS file --- .github/CODEOWNERS | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..ff0c43dc6 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,3 @@ +# Global access +* @knopers8 @justonedev1 + From c280191604e139b93ce1869849a12f8b0aaf05b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 2 Apr 2025 16:37:48 +0200 Subject: [PATCH 2109/2352] [core] remove goroutine in writer.go This goroutine can cause race condition that makes kafka messages in wrong order --- common/event/writer.go | 162 ++++++++++++++++++++--------------------- 1 file changed, 80 insertions(+), 82 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index a6444b105..dd021c89f 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -97,91 +97,89 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time return } - go func() { - var ( - err error - wrappedEvent *pb.Event - key []byte = nil - ) - - switch e := e.(type) { - case *pb.Ev_MetaEvent_CoreStart: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, - } - case *pb.Ev_MetaEvent_MesosHeartbeat: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, - } - case *pb.Ev_MetaEvent_FrameworkEvent: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, - } - case *pb.Ev_TaskEvent: - key = []byte(e.Taskid) - if len(key) == 0 { - key = nil - } - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_TaskEvent{TaskEvent: e}, - } - case *pb.Ev_RoleEvent: - key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_RoleEvent{RoleEvent: e}, - } - case *pb.Ev_EnvironmentEvent: - key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, - } - case *pb.Ev_CallEvent: - key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_CallEvent{CallEvent: e}, - } - case *pb.Ev_IntegratedServiceEvent: - key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, - } - case *pb.Ev_RunEvent: - key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_RunEvent{RunEvent: e}, - } + var ( + err error + wrappedEvent *pb.Event + key []byte = nil + ) + + switch e := e.(type) { + case *pb.Ev_MetaEvent_CoreStart: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, } - - if wrappedEvent == nil { - err = fmt.Errorf("unsupported event type") - } else { - err = w.doWriteEvent(key, wrappedEvent) + case *pb.Ev_MetaEvent_MesosHeartbeat: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, } - - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Error(err.Error()) + case *pb.Ev_MetaEvent_FrameworkEvent: + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, + } + case *pb.Ev_TaskEvent: + key = []byte(e.Taskid) + if len(key) == 0 { + key = nil + } + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_TaskEvent{TaskEvent: e}, + } + case *pb.Ev_RoleEvent: + key = extractAndConvertEnvID(e) + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_RoleEvent{RoleEvent: e}, + } + case *pb.Ev_EnvironmentEvent: + key = extractAndConvertEnvID(e) + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, + } + case *pb.Ev_CallEvent: + key = extractAndConvertEnvID(e) + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_CallEvent{CallEvent: e}, + } + case *pb.Ev_IntegratedServiceEvent: + key = extractAndConvertEnvID(e) + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, } - }() + case *pb.Ev_RunEvent: + key = extractAndConvertEnvID(e) + wrappedEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), + Payload: &pb.Event_RunEvent{RunEvent: e}, + } + } + + if wrappedEvent == nil { + err = fmt.Errorf("unsupported event type") + } else { + err = w.doWriteEvent(key, wrappedEvent) + } + + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Error(err.Error()) + } } func (w *KafkaWriter) doWriteEvent(key []byte, e *pb.Event) error { From 66d721e3e7b26046265553ab632216c7c2fae3c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 3 Apr 2025 10:52:37 +0200 Subject: [PATCH 2110/2352] [core] async kafka writing with error reporting --- common/event/writer.go | 28 +++++++++++++++++++++++----- 1 file changed, 23 insertions(+), 5 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index dd021c89f..134a28d9d 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -55,22 +55,28 @@ func (*DummyWriter) Close() {} type KafkaWriter struct { *kafka.Writer + toWriteChan chan kafka.Message } func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { - return &KafkaWriter{ + writer := &KafkaWriter{ Writer: &kafka.Writer{ Addr: kafka.TCP(viper.GetStringSlice("kafkaEndpoints")...), Topic: string(topic), Balancer: &kafka.Hash{}, AllowAutoTopicCreation: true, }, + toWriteChan: make(chan kafka.Message, 1000), } + + go writer.writingLoop() + return writer } func (w *KafkaWriter) Close() { if w != nil { - w.Close() + close(w.toWriteChan) + w.Writer.Close() } } @@ -80,6 +86,16 @@ func (w *KafkaWriter) WriteEvent(e interface{}) { } } +// TODO: we can optimise this to write multiple message at once +func (w *KafkaWriter) writingLoop() { + for message := range w.toWriteChan { + err := w.WriteMessages(context.Background(), message) + if err != nil { + log.Errorf("failed to write async kafka message: %w", err) + } + } +} + type HasEnvID interface { GetEnvironmentId() string } @@ -200,9 +216,11 @@ func (w *KafkaWriter) doWriteEvent(key []byte, e *pb.Event) error { message.Key = key } - err = w.WriteMessages(context.Background(), message) - if err != nil { - return fmt.Errorf("failed to write event: %w", err) + select { + case w.toWriteChan <- message: + default: + log.Warnf("Writer of kafka topic [%s] cannot write because channel is full, discarding a message", w.Writer.Topic) } + return nil } From b1df1a8a943ddac3e0cf58b9919a0139eb82d70e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 3 Apr 2025 11:31:46 +0200 Subject: [PATCH 2111/2352] [build] Bump to v1.31.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 7f96a9988..db101e555 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 30 -VERSION_PATCH := 1 +VERSION_MINOR := 31 +VERSION_PATCH := 0 From 926ea9b9110a73e2a4ba257fe27ab5bc5491e4db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 3 Apr 2025 16:23:35 +0200 Subject: [PATCH 2112/2352] [core] refactor kafka writing loop --- common/event/writer.go | 120 ++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 75 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 134a28d9d..c67c95458 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -91,7 +91,8 @@ func (w *KafkaWriter) writingLoop() { for message := range w.toWriteChan { err := w.WriteMessages(context.Background(), message) if err != nil { - log.Errorf("failed to write async kafka message: %w", err) + log.WithField("level", infologger.IL_Support). + Errorf("failed to write async kafka message: %w", err) } } } @@ -108,104 +109,51 @@ func extractAndConvertEnvID[T HasEnvID](object T) []byte { return nil } -func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { - if w == nil { - return +func internalEventToKafkaEvent(internalEvent interface{}, timestamp time.Time) (kafkaEvent *pb.Event, key []byte, err error) { + kafkaEvent = &pb.Event{ + Timestamp: timestamp.UnixMilli(), + TimestampNano: timestamp.UnixNano(), } - var ( - err error - wrappedEvent *pb.Event - key []byte = nil - ) - - switch e := e.(type) { + switch e := internalEvent.(type) { case *pb.Ev_MetaEvent_CoreStart: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_CoreStartEvent{CoreStartEvent: e}, - } + kafkaEvent.Payload = &pb.Event_CoreStartEvent{CoreStartEvent: e} case *pb.Ev_MetaEvent_MesosHeartbeat: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e}, - } + kafkaEvent.Payload = &pb.Event_MesosHeartbeatEvent{MesosHeartbeatEvent: e} case *pb.Ev_MetaEvent_FrameworkEvent: - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_FrameworkEvent{FrameworkEvent: e}, - } + kafkaEvent.Payload = &pb.Event_FrameworkEvent{FrameworkEvent: e} case *pb.Ev_TaskEvent: key = []byte(e.Taskid) if len(key) == 0 { key = nil } - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_TaskEvent{TaskEvent: e}, - } + kafkaEvent.Payload = &pb.Event_TaskEvent{TaskEvent: e} case *pb.Ev_RoleEvent: key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_RoleEvent{RoleEvent: e}, - } + kafkaEvent.Payload = &pb.Event_RoleEvent{RoleEvent: e} case *pb.Ev_EnvironmentEvent: key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_EnvironmentEvent{EnvironmentEvent: e}, - } + kafkaEvent.Payload = &pb.Event_EnvironmentEvent{EnvironmentEvent: e} case *pb.Ev_CallEvent: key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_CallEvent{CallEvent: e}, - } + kafkaEvent.Payload = &pb.Event_CallEvent{CallEvent: e} case *pb.Ev_IntegratedServiceEvent: key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e}, - } + kafkaEvent.Payload = &pb.Event_IntegratedServiceEvent{IntegratedServiceEvent: e} case *pb.Ev_RunEvent: key = extractAndConvertEnvID(e) - wrappedEvent = &pb.Event{ - Timestamp: timestamp.UnixMilli(), - TimestampNano: timestamp.UnixNano(), - Payload: &pb.Event_RunEvent{RunEvent: e}, - } - } - - if wrappedEvent == nil { + kafkaEvent.Payload = &pb.Event_RunEvent{RunEvent: e} + default: err = fmt.Errorf("unsupported event type") - } else { - err = w.doWriteEvent(key, wrappedEvent) } - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Error(err.Error()) - } + return } -func (w *KafkaWriter) doWriteEvent(key []byte, e *pb.Event) error { - if w == nil { - return nil - } - - data, err := proto.Marshal(e) +func kafkaEventToKafkaMessage(kafkaEvent *pb.Event, key []byte) (kafka.Message, error) { + data, err := proto.Marshal(kafkaEvent) if err != nil { - return fmt.Errorf("failed to marshal event: %w", err) + return kafka.Message{}, fmt.Errorf("failed to marshal event: %w", err) } message := kafka.Message{ @@ -216,11 +164,33 @@ func (w *KafkaWriter) doWriteEvent(key []byte, e *pb.Event) error { message.Key = key } + return message, nil +} + +func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time) { + if w == nil { + return + } + + wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert event to kafka event: %s", err.Error()) + return + } + + message, err := kafkaEventToKafkaMessage(wrappedEvent, key) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert kafka event to message: %s", err.Error()) + return + } + select { case w.toWriteChan <- message: default: log.Warnf("Writer of kafka topic [%s] cannot write because channel is full, discarding a message", w.Writer.Topic) } - - return nil } From 0a92ee2dfb00034815c7d89797208b1b7556e5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 4 Apr 2025 20:32:07 +0200 Subject: [PATCH 2113/2352] [core] kafka writer does not discard messages See OCTRL-1001 for more details --- common/event/event_suite_test.go | 13 ++++ common/event/fifobuffer.go | 87 +++++++++++++++++++++ common/event/fifobuffer_test.go | 129 +++++++++++++++++++++++++++++++ common/event/writer.go | 82 ++++++++++++++++---- common/event/writer_test.go | 67 ++++++++++++++++ 5 files changed, 364 insertions(+), 14 deletions(-) create mode 100644 common/event/event_suite_test.go create mode 100644 common/event/fifobuffer.go create mode 100644 common/event/fifobuffer_test.go create mode 100644 common/event/writer_test.go diff --git a/common/event/event_suite_test.go b/common/event/event_suite_test.go new file mode 100644 index 000000000..03af84ee4 --- /dev/null +++ b/common/event/event_suite_test.go @@ -0,0 +1,13 @@ +package event_test + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestEvent(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Event Suite") +} diff --git a/common/event/fifobuffer.go b/common/event/fifobuffer.go new file mode 100644 index 000000000..a49cf4f2b --- /dev/null +++ b/common/event/fifobuffer.go @@ -0,0 +1,87 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "math" + "sync" +) + +// This structure is meant to be used as a threadsafe FIFO with builtin waiting for new data +// in its Pop and PopMultiple functions. It is meant to be used with multiple goroutines, it is a +// waste of synchronization mechanisms if used synchronously. +type FifoBuffer[T any] struct { + lock sync.Mutex + cond sync.Cond + + buffer []T +} + +func NewFifoBuffer[T any]() (result FifoBuffer[T]) { + result = FifoBuffer[T]{ + lock: sync.Mutex{}, + } + result.cond = *sync.NewCond(&result.lock) + return +} + +func (this *FifoBuffer[T]) Push(value T) { + this.cond.L.Lock() + this.buffer = append(this.buffer, value) + this.cond.Signal() + this.cond.L.Unlock() +} + +// Blocks until it has some value in internal buffer +func (this *FifoBuffer[T]) PopMultiple(numberToPop uint) (result []T) { + this.cond.L.Lock() + defer this.cond.L.Unlock() + + for len(this.buffer) == 0 { + this.cond.Wait() + // this check is used when ReleaseGoroutines is called on waiting goroutine + if len(this.buffer) == 0 { + return + } + } + + result = make([]T, int(math.Min(float64(numberToPop), float64(len(this.buffer))))) + copy(result, this.buffer[0:len(result)]) + this.buffer = this.buffer[len(result):] + + return +} + +func (this *FifoBuffer[T]) Length() int { + this.cond.L.Lock() + defer this.cond.L.Unlock() + return len(this.buffer) +} + +func (this *FifoBuffer[T]) ReleaseGoroutines() { + this.cond.L.Lock() + this.cond.Broadcast() + this.cond.L.Unlock() +} diff --git a/common/event/fifobuffer_test.go b/common/event/fifobuffer_test.go new file mode 100644 index 000000000..fed318372 --- /dev/null +++ b/common/event/fifobuffer_test.go @@ -0,0 +1,129 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "sync" + "time" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("FifoBuffer", func() { + When("Poping lower amount of items than inside of a buffer", func() { + It("returns requested items", func() { + buffer := NewFifoBuffer[int]() + buffer.Push(1) + buffer.Push(2) + buffer.Push(3) + + Expect(buffer.Length()).To(Equal(3)) + + results := buffer.PopMultiple(2) + Expect(results).To(Equal([]int{1, 2})) + }) + }) + + When("Poping higher amount of items than inside of a buffer", func() { + It("returns only available items", func() { + buffer := NewFifoBuffer[int]() + buffer.Push(1) + + results := buffer.PopMultiple(2) + Expect(results).To(Equal([]int{1})) + }) + }) + + When("We use buffer with multiple goroutines pushing first (PopMultiple)", func() { + It("is synchronised properly", func() { + buffer := NewFifoBuffer[int]() + channel := make(chan struct{}) + + wg := sync.WaitGroup{} + wg.Add(2) + + go func() { + buffer.Push(1) + channel <- struct{}{} + wg.Done() + }() + + go func() { + <-channel + result := buffer.PopMultiple(42) + Expect(result, 1) + wg.Done() + }() + + wg.Wait() + }) + }) + + When("We use buffer with multiple goroutines popping first", func() { + It("is synchronised properly", func() { + buffer := NewFifoBuffer[int]() + channel := make(chan struct{}) + + wg := sync.WaitGroup{} + wg.Add(2) + + go func() { + // Pop is blocking is we have empty buffer, so we notify before + channel <- struct{}{} + result := buffer.PopMultiple(42) + Expect(result, 1) + wg.Done() + }() + + go func() { + <-channel + buffer.Push(1) + wg.Done() + }() + + wg.Wait() + }) + }) + + When("We block FifoBuffer without data and call Release", func() { + It("releases goroutines properly", func() { + buffer := NewFifoBuffer[int]() + everythingDone := sync.WaitGroup{} + channel := make(chan struct{}) + + everythingDone.Add(1) + go func() { + channel <- struct{}{} + buffer.PopMultiple(42) + everythingDone.Done() + }() + <-channel + time.Sleep(100 * time.Millisecond) + buffer.ReleaseGoroutines() + everythingDone.Wait() + }) + }) +}) diff --git a/common/event/writer.go b/common/event/writer.go index c67c95458..d7a1ab74b 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -27,11 +27,14 @@ package event import ( "context" "fmt" + "sync" "time" + "github.com/AliceO2Group/Control/common/ecsmetrics" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/segmentio/kafka-go" "github.com/sirupsen/logrus" @@ -53,9 +56,26 @@ func (*DummyWriter) WriteEvent(interface{}) {} func (*DummyWriter) WriteEventWithTimestamp(interface{}, time.Time) {} func (*DummyWriter) Close() {} +// Kafka writer is used to convert events from events.proto into kafka messages and to write them. +// it is built with 2 workers: +// +// #1 is gathering kafka.Message from any goroutine which sends message into buffered channel and puts them into FifoBuffer. +// #2 is poping any messages from FifoBuffer and sends them to Kafka +// +// The reason for this setup over setting Async: true in kafka.Writer is the ability to have some error handling +// of failed messages. Moreover if we used only one worker that gathers messages from channel and then sends them directly to Kafka, +// we would block whole core if we receive lot of messages at once. So we split functionality into two workers: one is +// putting all messages into the buffer, so if we have a lot of messages buffer just grows without blocking whole core and the +// second does all the sending. This setup allows us to gather messages from any amount of goroutines without blocking/losing messages. +// Another benefit is batching messages instead of writing them one by one. type KafkaWriter struct { *kafka.Writer - toWriteChan chan kafka.Message + toBatchMessagesChan chan kafka.Message + messageBuffer FifoBuffer[kafka.Message] + // NOTE: we use settable callback in order to be able to test writing of messages via KafkaWriter, without necessity of setting up cluster + writeFunction func([]kafka.Message) + runningWorkers sync.WaitGroup + batchingDoneCh chan struct{} } func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { @@ -66,16 +86,33 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { Balancer: &kafka.Hash{}, AllowAutoTopicCreation: true, }, - toWriteChan: make(chan kafka.Message, 1000), + toBatchMessagesChan: make(chan kafka.Message, 100), + messageBuffer: NewFifoBuffer[kafka.Message](), + runningWorkers: sync.WaitGroup{}, + batchingDoneCh: make(chan struct{}, 1), + } + + writer.writeFunction = func(messages []kafka.Message) { + if err := writer.WriteMessages(context.Background(), messages...); err != nil { + metric := ecsmetrics.NewMetric("kafka") + metric.AddTag("topic", writer.Topic) + metric.AddValue("failedsentmessages", len(messages)) + monitoring.Send(metric) + log.Errorf("failed to write %d messages to kafka with error: %v", len(messages), err) + } } go writer.writingLoop() + go writer.batchingLoop() + return writer } func (w *KafkaWriter) Close() { if w != nil { - close(w.toWriteChan) + w.runningWorkers.Add(2) + close(w.toBatchMessagesChan) + w.runningWorkers.Wait() w.Writer.Close() } } @@ -86,17 +123,37 @@ func (w *KafkaWriter) WriteEvent(e interface{}) { } } -// TODO: we can optimise this to write multiple message at once func (w *KafkaWriter) writingLoop() { - for message := range w.toWriteChan { - err := w.WriteMessages(context.Background(), message) - if err != nil { - log.WithField("level", infologger.IL_Support). - Errorf("failed to write async kafka message: %w", err) + for { + select { + case <-w.batchingDoneCh: + w.runningWorkers.Done() + return + default: + messagesToSend := w.messageBuffer.PopMultiple(100) + if len(messagesToSend) == 0 { + continue + } + + w.writeFunction(messagesToSend) + + metric := ecsmetrics.NewMetric("kafka") + metric.AddTag("topic", w.Topic) + metric.AddValue("sentmessages", len(messagesToSend)) + monitoring.Send(metric) } } } +func (w *KafkaWriter) batchingLoop() { + for message := range w.toBatchMessagesChan { + w.messageBuffer.Push(message) + } + w.batchingDoneCh <- struct{}{} + w.messageBuffer.ReleaseGoroutines() + w.runningWorkers.Done() +} + type HasEnvID interface { GetEnvironmentId() string } @@ -109,6 +166,7 @@ func extractAndConvertEnvID[T HasEnvID](object T) []byte { return nil } +// TODO: there should be written test to verify converting all of these messages func internalEventToKafkaEvent(internalEvent interface{}, timestamp time.Time) (kafkaEvent *pb.Event, key []byte, err error) { kafkaEvent = &pb.Event{ Timestamp: timestamp.UnixMilli(), @@ -188,9 +246,5 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time return } - select { - case w.toWriteChan <- message: - default: - log.Warnf("Writer of kafka topic [%s] cannot write because channel is full, discarding a message", w.Writer.Topic) - } + w.toBatchMessagesChan <- message } diff --git a/common/event/writer_test.go b/common/event/writer_test.go new file mode 100644 index 000000000..785932f34 --- /dev/null +++ b/common/event/writer_test.go @@ -0,0 +1,67 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "sync" + + pb "github.com/AliceO2Group/Control/common/protos" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/segmentio/kafka-go" + "google.golang.org/protobuf/proto" +) + +var _ = Describe("Writer", func() { + When("event is written into writer", func() { + It("transforms it to kafka message and sends it", func() { + channel := make(chan struct{}) + writer := KafkaWriter{} + writer.toBatchMessagesChan = make(chan kafka.Message, 100) + writer.messageBuffer = NewFifoBuffer[kafka.Message]() + writer.Writer = &kafka.Writer{} + writer.Topic = "testtopic" + writer.runningWorkers = sync.WaitGroup{} + writer.batchingDoneCh = make(chan struct{}, 1) + + writer.writeFunction = func(messages []kafka.Message) { + Expect(len(messages)).To(Equal(1)) + event := &pb.Event{} + proto.Unmarshal(messages[0].Value, event) + Expect(event.GetCoreStartEvent().FrameworkId).To(Equal("FrameworkId")) + channel <- struct{}{} + } + + go writer.writingLoop() + go writer.batchingLoop() + + event := &pb.Ev_MetaEvent_CoreStart{FrameworkId: "FrameworkId"} + + writer.WriteEvent(event) + <-channel + writer.Close() + }) + }) +}) From ebd89f93dcca49ebd67011dbfa5da9fa6d561ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 8 Apr 2025 15:36:15 +0200 Subject: [PATCH 2114/2352] [core] added more metrics into kafka writer added timer to monitoring increased the size of buffered channels --- common/ecsmetrics/metric.go | 16 +++++++ common/ecsmetrics/metrics_test.go | 28 +++++++++++ common/event/writer.go | 80 ++++++++++++++++++------------- common/event/writer_test.go | 5 +- common/monitoring/monitoring.go | 2 +- 5 files changed, 96 insertions(+), 35 deletions(-) create mode 100644 common/ecsmetrics/metrics_test.go diff --git a/common/ecsmetrics/metric.go b/common/ecsmetrics/metric.go index fda30f87c..a35af762b 100644 --- a/common/ecsmetrics/metric.go +++ b/common/ecsmetrics/metric.go @@ -12,3 +12,19 @@ func NewMetric(name string) monitoring.Metric { metric.AddTag("subsystem", "ECS") return metric } + +// Timer* functions are meant to be used with defer statement to measure runtime of given function: +// defer TimerNS(&metric)() +func TimerMS(metric *monitoring.Metric) func() { + start := time.Now() + return func() { + metric.AddValue("execution_time_ms", time.Since(start).Milliseconds()) + } +} + +func TimerNS(metric *monitoring.Metric) func() { + start := time.Now() + return func() { + metric.AddValue("execution_time_ns", time.Since(start).Nanoseconds()) + } +} diff --git a/common/ecsmetrics/metrics_test.go b/common/ecsmetrics/metrics_test.go new file mode 100644 index 000000000..4c46569c9 --- /dev/null +++ b/common/ecsmetrics/metrics_test.go @@ -0,0 +1,28 @@ +package ecsmetrics + +import ( + "fmt" + "testing" + "time" + + "github.com/AliceO2Group/Control/common/monitoring" +) + +func measureFunc(metric *monitoring.Metric) { + defer TimerMS(metric)() + defer TimerNS(metric)() + time.Sleep(100 * time.Millisecond) +} + +func TestSimpleStartStop(t *testing.T) { + metric := NewMetric("test") + measureFunc(&metric) + fmt.Println(metric.Values["execution_time_ms"]) + fmt.Println(metric.Values["execution_time_ns"]) + if metric.Values["execution_time_ms"].(int64) < 100 { + t.Error("wrong milliseconds") + } + if metric.Values["execution_time_ns"].(int64) < 100000000 { + t.Error("wrong nanoseconds") + } +} diff --git a/common/event/writer.go b/common/event/writer.go index d7a1ab74b..fb3fc516c 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -42,7 +42,11 @@ import ( "google.golang.org/protobuf/proto" ) -var log = logger.New(logrus.StandardLogger(), "event") +var ( + log = logger.New(logrus.StandardLogger(), "event") + KAFKAWRITER = "kafka_writer" + KAFKAPREPARE = "kafka_prepare" +) type Writer interface { WriteEvent(e interface{}) @@ -73,9 +77,15 @@ type KafkaWriter struct { toBatchMessagesChan chan kafka.Message messageBuffer FifoBuffer[kafka.Message] // NOTE: we use settable callback in order to be able to test writing of messages via KafkaWriter, without necessity of setting up cluster - writeFunction func([]kafka.Message) - runningWorkers sync.WaitGroup - batchingDoneCh chan struct{} + writeFunction func([]kafka.Message, *monitoring.Metric) + runningWorkers sync.WaitGroup + batchingLoopDoneCh chan struct{} +} + +func (w *KafkaWriter) newMetric(name string) monitoring.Metric { + metric := ecsmetrics.NewMetric(name) + metric.AddTag("topic", w.Topic) + return metric } func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { @@ -86,18 +96,16 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { Balancer: &kafka.Hash{}, AllowAutoTopicCreation: true, }, - toBatchMessagesChan: make(chan kafka.Message, 100), + toBatchMessagesChan: make(chan kafka.Message, 10000), messageBuffer: NewFifoBuffer[kafka.Message](), runningWorkers: sync.WaitGroup{}, - batchingDoneCh: make(chan struct{}, 1), + batchingLoopDoneCh: make(chan struct{}, 1), } - writer.writeFunction = func(messages []kafka.Message) { + writer.writeFunction = func(messages []kafka.Message, metric *monitoring.Metric) { + defer ecsmetrics.TimerNS(metric)() if err := writer.WriteMessages(context.Background(), messages...); err != nil { - metric := ecsmetrics.NewMetric("kafka") - metric.AddTag("topic", writer.Topic) - metric.AddValue("failedsentmessages", len(messages)) - monitoring.Send(metric) + metric.AddValue("messages_failed", len(messages)) log.Errorf("failed to write %d messages to kafka with error: %v", len(messages), err) } } @@ -110,6 +118,7 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { func (w *KafkaWriter) Close() { if w != nil { + // We are waiting until both loops (batching and writing) are done w.runningWorkers.Add(2) close(w.toBatchMessagesChan) w.runningWorkers.Wait() @@ -126,7 +135,7 @@ func (w *KafkaWriter) WriteEvent(e interface{}) { func (w *KafkaWriter) writingLoop() { for { select { - case <-w.batchingDoneCh: + case <-w.batchingLoopDoneCh: w.runningWorkers.Done() return default: @@ -135,11 +144,12 @@ func (w *KafkaWriter) writingLoop() { continue } - w.writeFunction(messagesToSend) + metric := w.newMetric(KAFKAWRITER) + metric.AddValue("messages_sent", len(messagesToSend)) + metric.AddValue("messages_failed", 0) + + w.writeFunction(messagesToSend, &metric) - metric := ecsmetrics.NewMetric("kafka") - metric.AddTag("topic", w.Topic) - metric.AddValue("sentmessages", len(messagesToSend)) monitoring.Send(metric) } } @@ -149,7 +159,7 @@ func (w *KafkaWriter) batchingLoop() { for message := range w.toBatchMessagesChan { w.messageBuffer.Push(message) } - w.batchingDoneCh <- struct{}{} + w.batchingLoopDoneCh <- struct{}{} w.messageBuffer.ReleaseGoroutines() w.runningWorkers.Done() } @@ -230,21 +240,27 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time return } - wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Errorf("Failed to convert event to kafka event: %s", err.Error()) - return - } + metric := w.newMetric(KAFKAPREPARE) - message, err := kafkaEventToKafkaMessage(wrappedEvent, key) - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Errorf("Failed to convert kafka event to message: %s", err.Error()) - return - } + func() { + defer ecsmetrics.TimerNS(&metric)() + wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert event to kafka event: %s", err.Error()) + return + } + + message, err := kafkaEventToKafkaMessage(wrappedEvent, key) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert kafka event to message: %s", err.Error()) + return + } + w.toBatchMessagesChan <- message + }() - w.toBatchMessagesChan <- message + monitoring.Send(metric) } diff --git a/common/event/writer_test.go b/common/event/writer_test.go index 785932f34..fc5be6904 100644 --- a/common/event/writer_test.go +++ b/common/event/writer_test.go @@ -27,6 +27,7 @@ package event import ( "sync" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -44,9 +45,9 @@ var _ = Describe("Writer", func() { writer.Writer = &kafka.Writer{} writer.Topic = "testtopic" writer.runningWorkers = sync.WaitGroup{} - writer.batchingDoneCh = make(chan struct{}, 1) + writer.batchingLoopDoneCh = make(chan struct{}, 1) - writer.writeFunction = func(messages []kafka.Message) { + writer.writeFunction = func(messages []kafka.Message, _ *monitoring.Metric) { Expect(len(messages)).To(Equal(1)) event := &pb.Event{} proto.Unmarshal(messages[0].Value, event) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index be788f7de..682f0bb8c 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -36,7 +36,7 @@ func initChannels(messageBufferSize int) { metricsRequestedChannel = make(chan struct{}) // 100 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if // multiple goroutines want to send metrics without blocking each other - metricsChannel = make(chan Metric, 100) + metricsChannel = make(chan Metric, 10000) metricsExportedToRequest = make(chan []Metric) metricsLimit = messageBufferSize } From ee4786b1a0b820e7fe113d962eef97de926f374e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 8 Apr 2025 17:29:45 +0200 Subject: [PATCH 2115/2352] Update GH runner from deprecated ubuntu-20.04 to ubuntu-24.04 --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index c8893ee26..e4ebd63b9 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -12,7 +12,7 @@ jobs: runs-on: ${{ matrix.os }} strategy: matrix: - os: [macOS-latest, ubuntu-20.04] + os: [macOS-latest, ubuntu-24.04] go: [ '1.21.5' ] steps: - uses: actions/checkout@v2 From 2ad93dc1deca6ac6a78d67728f27cd39123ab2ef Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 9 Apr 2025 11:12:04 +0200 Subject: [PATCH 2116/2352] update GH runners to use golang v1.22.2 which is the version of golang used in alidist and go.mod --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index e4ebd63b9..5d84bd1b8 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-24.04] - go: [ '1.21.5' ] + go: [ '1.22.2' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From 0a7036b0fd60ce01e932db169a9b3b307e0fb7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 10 Apr 2025 10:24:01 +0200 Subject: [PATCH 2117/2352] Revert "[core] INVARIANT status introduced" This reverts commit 77bdd3ab2ebf7b679f77e98ede2fee6d7ddddc3f. --- core/task/status.go | 93 ++++------ core/task/status_test.go | 110 ----------- core/task/task_suite_test.go | 37 ---- core/workflow/safestatus.go | 66 ++----- core/workflow/safestatus_test.go | 308 ------------------------------- 5 files changed, 60 insertions(+), 554 deletions(-) delete mode 100644 core/task/status_test.go delete mode 100644 core/task/task_suite_test.go delete mode 100644 core/workflow/safestatus_test.go diff --git a/core/task/status.go b/core/task/status.go index f21df2960..3bfb35353 100644 --- a/core/task/status.go +++ b/core/task/status.go @@ -32,59 +32,47 @@ const ( PARTIAL ACTIVE UNDEPLOYABLE - INVARIANT // overwritten by product with any other state. It is used only when merging non-critical states. If you merge aggregateState with only non-critical statuses you will propagate INVARIANT further ) -var STATUS_PRODUCT = map[Status]map[Status]Status{ - UNDEFINED: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEFINED, - PARTIAL: UNDEFINED, - ACTIVE: UNDEFINED, - UNDEPLOYABLE: UNDEFINED, - INVARIANT: UNDEFINED, - }, - INACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: INACTIVE, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - INVARIANT: INACTIVE, - }, - PARTIAL: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - INVARIANT: PARTIAL, - }, - ACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: ACTIVE, - UNDEPLOYABLE: UNDEPLOYABLE, - INVARIANT: ACTIVE, - }, - UNDEPLOYABLE: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEPLOYABLE, - PARTIAL: UNDEPLOYABLE, - ACTIVE: UNDEPLOYABLE, - UNDEPLOYABLE: UNDEPLOYABLE, - INVARIANT: UNDEPLOYABLE, - }, - INVARIANT: { - UNDEFINED: UNDEFINED, - INACTIVE: INACTIVE, - PARTIAL: PARTIAL, - ACTIVE: ACTIVE, - UNDEPLOYABLE: UNDEPLOYABLE, - INVARIANT: INVARIANT, - }, -} +var ( + STATUS_PRODUCT = map[Status]map[Status]Status{ + UNDEFINED: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEFINED, + PARTIAL: UNDEFINED, + ACTIVE: UNDEFINED, + UNDEPLOYABLE: UNDEFINED, + }, + INACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + }, + PARTIAL: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + }, + ACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, + }, + UNDEPLOYABLE: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEPLOYABLE, + PARTIAL: UNDEPLOYABLE, + ACTIVE: UNDEPLOYABLE, + UNDEPLOYABLE: UNDEPLOYABLE, + }, + } +) func (s Status) String() string { names := []string{ @@ -93,9 +81,8 @@ func (s Status) String() string { "PARTIAL", "ACTIVE", "UNDEPLOYABLE", - "INVARIANT", } - if s > INVARIANT { + if s > UNDEPLOYABLE { return "UNDEFINED" } return names[s] diff --git a/core/task/status_test.go b/core/task/status_test.go deleted file mode 100644 index b4c429230..000000000 --- a/core/task/status_test.go +++ /dev/null @@ -1,110 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2025 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package task - -import ( - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("task status", func() { - When("product of all statuses with UNDEFINED is done", func() { - undefined := Status(UNDEFINED) - It("should be UNDEFINED for all", func() { - Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEFINED))) - Expect(Status(UNDEFINED)).To(Equal(undefined.X(INACTIVE))) - Expect(Status(UNDEFINED)).To(Equal(undefined.X(PARTIAL))) - Expect(Status(UNDEFINED)).To(Equal(undefined.X(ACTIVE))) - Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEPLOYABLE))) - Expect(Status(UNDEFINED)).To(Equal(undefined.X(INVARIANT))) - }) - }) - When("product of all statuses with INACTIVE is done", func() { - inactive := Status(INACTIVE) - It("should have different results", func() { - Expect(Status(UNDEFINED)).To(Equal(inactive.X(UNDEFINED))) - Expect(Status(INACTIVE)).To(Equal(inactive.X(INACTIVE))) - Expect(Status(PARTIAL)).To(Equal(inactive.X(PARTIAL))) - Expect(Status(PARTIAL)).To(Equal(inactive.X(ACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(inactive.X(UNDEPLOYABLE))) - Expect(Status(INACTIVE)).To(Equal(inactive.X(INVARIANT))) - }) - }) - When("product of all statuses with PARTIAL is done", func() { - partial := Status(PARTIAL) - It("should have different results", func() { - Expect(Status(UNDEFINED)).To(Equal(partial.X(UNDEFINED))) - Expect(Status(PARTIAL)).To(Equal(partial.X(INACTIVE))) - Expect(Status(PARTIAL)).To(Equal(partial.X(PARTIAL))) - Expect(Status(PARTIAL)).To(Equal(partial.X(ACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(partial.X(UNDEPLOYABLE))) - Expect(Status(PARTIAL)).To(Equal(partial.X(INVARIANT))) - }) - }) - When("product of all statuses with ACTIVE is done", func() { - active := Status(ACTIVE) - It("should have different results", func() { - Expect(Status(UNDEFINED)).To(Equal(active.X(UNDEFINED))) - Expect(Status(PARTIAL)).To(Equal(active.X(INACTIVE))) - Expect(Status(PARTIAL)).To(Equal(active.X(PARTIAL))) - Expect(Status(ACTIVE)).To(Equal(active.X(ACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(active.X(UNDEPLOYABLE))) - Expect(Status(ACTIVE)).To(Equal(active.X(INVARIANT))) - }) - }) - When("product of all statuses with UNDEPLOYABLE is done", func() { - undeployable := Status(UNDEPLOYABLE) - It("should be UNDEPLOYABLE unless UNDEFINED", func() { - Expect(Status(UNDEFINED)).To(Equal(undeployable.X(UNDEFINED))) - Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(PARTIAL))) - Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(ACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(UNDEPLOYABLE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INVARIANT))) - }) - }) - When("product of all statuses with INVARIANT is done", func() { - invariant := Status(INVARIANT) - It("it should be the status the product was done with", func() { - Expect(Status(UNDEFINED)).To(Equal(invariant.X(UNDEFINED))) - Expect(Status(INACTIVE)).To(Equal(invariant.X(INACTIVE))) - Expect(Status(PARTIAL)).To(Equal(invariant.X(PARTIAL))) - Expect(Status(ACTIVE)).To(Equal(invariant.X(ACTIVE))) - Expect(Status(UNDEPLOYABLE)).To(Equal(invariant.X(UNDEPLOYABLE))) - Expect(Status(INVARIANT)).To(Equal(invariant.X(INVARIANT))) - }) - }) - When("String() of Status is called", func() { - It("should return string representation of a status", func() { - Expect("UNDEFINED").To(Equal(Status(UNDEFINED).String())) - Expect("INACTIVE").To(Equal(Status(INACTIVE).String())) - Expect("PARTIAL").To(Equal(Status(PARTIAL).String())) - Expect("ACTIVE").To(Equal(Status(ACTIVE).String())) - Expect("UNDEPLOYABLE").To(Equal(Status(UNDEPLOYABLE).String())) - Expect("INVARIANT").To(Equal(Status(INVARIANT).String())) - Expect("UNDEFINED").To(Equal(Status(255).String())) - }) - }) -}) diff --git a/core/task/task_suite_test.go b/core/task/task_suite_test.go deleted file mode 100644 index c5f0cf618..000000000 --- a/core/task/task_suite_test.go +++ /dev/null @@ -1,37 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2025 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package task - -import ( - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -func TestTask(t *testing.T) { - RegisterFailHandler(Fail) - RunSpecs(t, "Task Test Suite") -} diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 044e86be6..33f1a2049 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -25,13 +25,11 @@ package workflow import ( - "strconv" "strings" "sync" "github.com/AliceO2Group/Control/core/task" "github.com/sirupsen/logrus" - "github.com/spf13/viper" ) type SafeStatus struct { @@ -39,64 +37,40 @@ type SafeStatus struct { status task.Status } -func reportTraceRoles(roles []Role, status task.Status) { - if viper.GetBool("veryVerbose") { - stati := make([]string, len(roles)) - critical := make([]string, len(roles)) - names := make([]string, len(roles)) - for i, role := range roles { - stati[i] = role.GetStatus().String() - names[i] = role.GetName() - if taskR, isTaskRole := role.(*taskRole); isTaskRole { - critical[i] = strconv.FormatBool(taskR.IsCritical()) - } else if callR, isCallRole := role.(*callRole); isCallRole { - critical[i] = strconv.FormatBool(callR.IsCritical()) - } else { - critical[i] = strconv.FormatBool(true) - } - } - log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "critical": strings.Join(critical, ", "), - "names": strings.Join(names, ", "), - "aggregated": status.String(), - }). - Trace("aggregating statuses") - } -} - -// role that are not taskRole or callRole are critical by default func aggregateStatus(roles []Role) (status task.Status) { if len(roles) == 0 { status = task.UNDEFINED return } + stati := make([]string, len(roles)) + for i, role := range roles { + stati[i] = role.GetStatus().String() + } - status = task.INVARIANT - for _, role := range roles { - if status == task.UNDEFINED { - break - } + status = roles[0].GetStatus() + if len(roles) > 1 { + for _, c := range roles[1:] { + if status == task.UNDEFINED { + log.WithFields(logrus.Fields{ + "statuses": strings.Join(stati, ", "), + "aggregated": status.String(), + }). + Trace("aggregating statuses") - if taskR, isTaskRole := role.(*taskRole); isTaskRole { - if !taskR.IsCritical() { - continue - } - } else if callR, isCallRole := role.(*callRole); isCallRole { - if !callR.IsCritical() { - continue + return } + status = status.X(c.GetStatus()) } - status = status.X(role.GetStatus()) } - - reportTraceRoles(roles, status) + log.WithFields(logrus.Fields{ + "statuses": strings.Join(stati, ", "), + "aggregated": status.String(), + }). + Trace("aggregating statuses") return } -// TODO: this function is prime candidate for refactoring. The reason being that it mostly ignores status argument -// for merging, moreover it also does not use status of role from argument. Both of these behaivour are counter-intuitive. func (t *SafeStatus) merge(s task.Status, r Role) { t.mu.Lock() defer t.mu.Unlock() diff --git a/core/workflow/safestatus_test.go b/core/workflow/safestatus_test.go deleted file mode 100644 index 0e2306cc7..000000000 --- a/core/workflow/safestatus_test.go +++ /dev/null @@ -1,308 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2025 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package workflow - -import ( - "github.com/AliceO2Group/Control/core/task" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - "github.com/spf13/viper" -) - -var _ = Describe("safe status merge", func() { - viper.Set("veryVerbose", true) - When("Task and Call roles are used", func() { - It("status should be overwritten", func() { - { - cr := &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - } - cr.status.merge(task.ACTIVE, cr) - Expect(cr.GetStatus()).To(Equal(task.Status(task.ACTIVE))) - } - { - tr := &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - } - tr.status.merge(task.INACTIVE, tr) - Expect(tr.GetStatus()).To(Equal(task.Status(task.INACTIVE))) - } - }) - }) - - When("Aggregate role is merged with UNDEFINED status", func() { - It("becomes UNDEFINED", func() { - ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} - ar.status.merge(task.UNDEFINED, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) - }) - }) - - When("Empty aggregate role is merged with any status (except UNDEFINED) status", func() { - It("becomes UNDEFINED", func() { - ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}} - ar.status.merge(task.ACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) - }) - }) - - When("Aggregate role is merged with the same status", func() { - It("does not change it's status", func() { - ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} - ar.status.merge(task.ACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) - }) - }) - - When("Aggregator role has ACTIVE subroles", func() { - It("becomes ACTIVE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - // SafeStatus.Merge basically ignores status argument in a lot of cases, so it does not matter what we use here - // and in following tests - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) - }) - }) - - When("Aggregator role has one ACTIVE subrole", func() { - It("becomes PARTIAL from INACTIVE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) - }) - }) - - When("Aggregator role has one ACTIVE subrole", func() { - It("becomes PARTIAL from PARTIAL", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) - }) - }) - - When("Aggregator role has one ACTIVE subrole", func() { - It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) - }) - }) - - When("Aggregator role has one ACTIVE subrole", func() { - It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) - }) - }) - - When("Aggregator role has one ACTIVE subrole", func() { - It("becomes UNDEFINED from UNDEFINED", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) - }) - }) - - When("Aggregator role has no critical roles", func() { - It("becomes INVARIANT regardless of subrole statuses", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - }, - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.INVARIANT))) - }) - }) - - When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role", func() { - It("becomes ACTIVE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) - }) - }) - - When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one ACTIVE aggregator role", func() { - It("becomes ACTIVE", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - }, - &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) - }) - }) - - When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one INACTIVE aggregator role", func() { - It("becomes PARTIAL", func() { - ar := &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, - aggregator: aggregator{ - []Role{ - &callRole{ - roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, - }, - &taskRole{ - roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, - Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, - }, - &aggregatorRole{ - roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, - }, - }, - }, - } - ar.status.merge(task.INACTIVE, ar) - Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) - }) - }) -}) From ce63986ce70086bcf93f903d48a46a5886c6393c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 10 Apr 2025 10:34:17 +0200 Subject: [PATCH 2118/2352] [build] Bump to v1.32.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index db101e555..2d5d434e2 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 31 +VERSION_MINOR := 32 VERSION_PATCH := 0 From 97d85911a271a7b30a2361e4a8f23458d6099951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 14 Apr 2025 10:08:23 +0200 Subject: [PATCH 2119/2352] [core] delegate too many metrics warning to devel --- common/monitoring/monitoring.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 682f0bb8c..527cf293a 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -8,6 +8,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/sirupsen/logrus" ) @@ -67,7 +68,7 @@ func eventLoop() { if len(metrics) < metricsLimit { metrics = append(metrics, metric) } else { - log.Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") + log.WithField("level", infologger.IL_Devel).Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") } case <-endChannel: From fe34835d4cce1ea22d0402406fb36749de0d1f7a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 14 Apr 2025 10:17:04 +0200 Subject: [PATCH 2120/2352] [build] Bump to v1.32.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2d5d434e2..ad4e009d3 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 32 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 468fb29220920fb726c03ef89744e7b3c86e2c1e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 23 Apr 2025 14:52:53 +0200 Subject: [PATCH 2121/2352] [core] include original run number in CCDB GRP object for synthetic runs Closes OCTRL-1006. --- Makefile | 2 +- core/integration/ccdb/plugin.go | 54 +++++- core/integration/ccdb/plugin_test.go | 266 +++++++++++++++++++++++++++ 3 files changed, 317 insertions(+), 5 deletions(-) create mode 100644 core/integration/ccdb/plugin_test.go diff --git a/Makefile b/Makefile index c8385ae66..929854bf5 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut -TEST_DIRS := ./apricot/local ./common/gera ./common/utils ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration ./core/environment +TEST_DIRS := ./apricot/local ./common/gera ./common/utils ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration/ccdb ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs ./common/monitoring coverage:COVERAGE_PREFIX := ./coverage_results diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index fe18f4eb3..6a4f70f32 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -64,6 +64,7 @@ type GeneralRunParameters struct { hbfPerTf uint32 // number of HeartBeatFrames per TimeFrame lhcPeriod string flpIdList []string + originalRunNumber uint32 // in case it is a replay run, CTP needs the replayed run number (O2-5921) } func parseDetectors(detectorsParam string) (detectors []string, err error) { @@ -84,6 +85,9 @@ func getFlpIdList(envId string) (flps []string, err error) { return []string{}, err } envMan := environment.ManagerInstance() + if envMan == nil { + return []string{}, fmt.Errorf("environment manager not initialized") + } env, err := envMan.Environment(parsedEnvId) if err != nil { return []string{}, err @@ -265,6 +269,27 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { Warningf("could not parse env id, FLP list will be empty") } + originalRunNumber := uint64(0) + originalRunNumberStr, ok := varStack["original_run_number"] + if ok && len(originalRunNumberStr) > 0 { + if runType != runtype.SYNTHETIC { + log.WithField("partition", envId). + WithField("run", runNumber). + WithField("level", infologger.IL_Support). + Warningf("original run number was set for a non-SYNTHETIC run, ignoring it") + } else { + originalRunNumber, err = strconv.ParseUint(originalRunNumberStr, 10, 32) + if err != nil { + log.WithError(err). + WithField("partition", envId). + WithField("level", infologger.IL_Support). + WithField("run", runNumberStr). + Errorf("cannot convert original run number '%s' to an integer", originalRunNumberStr) + originalRunNumber = 0 + } + } + } + return &GeneralRunParameters{ uint32(runNumber), runType, @@ -278,6 +303,7 @@ func NewGRPObject(varStack map[string]string) *GeneralRunParameters { uint32(hbfPerTf), lhcPeriod, flpIds, + uint32(originalRunNumber), } } @@ -342,6 +368,7 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin // o2-ecs-grp-create -h //Create GRP-ECS object and upload to the CCDB //Usage: + // o2-ecs-grp-create: // -h [ --help ] Print this help message // -p [ --period ] arg data taking period // -r [ --run ] arg run number @@ -353,13 +380,29 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin // continuous readout mode // -g [ --triggering ] arg (=FT0,FV0) comma separated list of detectors // providing a trigger - // -s [ --start-time ] arg (=0) run start time in ms, now() if 0 - // -e [ --end-time ] arg (=0) run end time in ms, start-time+3days is - // used if 0 + // -f [ --flps ] arg comma separated list of FLPs in the + // data taking + // -s [ --start-time ] arg (=0) ECS run start time in ms, now() if 0 + // -e [ --end-time ] arg (=0) ECS run end time in ms, + // start-time+3days is used if 0 + // --start-time-ctp arg (=0) run start CTP time in ms, same as ECS + // if not set or 0 + // --end-time-ctp arg (=0) run end CTP time in ms, same as ECS if + // not set or 0 // --ccdb-server arg (=http://alice-ccdb.cern.ch) // CCDB server for upload, local file if // empty - // --refresh refresh server cache after upload + // --ccdb-server-input arg CCDB server for inputs (if needed, e.g. + // CTPConfig), dy default ccdb-server is + // used + // -m [ --meta-data ] arg metadata as key1=value1;key2=value2;.. + // --refresh [=arg(=async)] refresh server cache after upload: + // "none" (or ""), "async" (non-blocking) + // and "sync" (blocking) + // --marginSOR arg (=345600000) validity at SOR + // --marginEOR arg (=600000) validity margin to add after EOR + // -o [ --original-run ] arg (=0) if >0, use as the source run to create + // CTP/Config/Config object cmd = "source /etc/profile.d/o2.sh && o2-ecs-grp-create" if len(grp.lhcPeriod) == 0 { @@ -403,6 +446,9 @@ func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl strin if len(grp.flpIdList) > 0 { cmd += " -f \"" + strings.Join(grp.flpIdList, ",") + "\"" } + if grp.originalRunNumber > 0 { + cmd += " -o " + strconv.FormatUint(uint64(grp.originalRunNumber), 10) + } cmd += " --ccdb-server " + ccdbUrl return diff --git a/core/integration/ccdb/plugin_test.go b/core/integration/ccdb/plugin_test.go new file mode 100644 index 000000000..65b5f5ed1 --- /dev/null +++ b/core/integration/ccdb/plugin_test.go @@ -0,0 +1,266 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package ccdb + +import ( + "github.com/AliceO2Group/Control/common/runtype" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "testing" +) + +var _ = Describe("NewGRPObject", func() { + var varStack map[string]string + + BeforeEach(func() { + varStack = map[string]string{ + "environment_id": "2oDvieFrVTi", + "run_number": "123456", + "run_type": "PHYSICS", + "run_start_time_ms": "10000", + "run_end_completion_time_ms": "20000", + "trg_start_time_ms": "10100", + "trg_end_time_ms": "19900", + "detectors": `["ITS","TPC"]`, + "pdp_n_hbf_per_tf": "128", + "lhc_period": "LHC22a", + "ctp_readout_enabled": "true", + } + }) + + It("should create a valid GRP object with all fields set", func() { + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.runNumber).To(Equal(uint32(123456))) + Expect(grp.lhcPeriod).To(Equal("LHC22a")) + Expect(grp.runType).To(Equal(runtype.PHYSICS)) + Expect(grp.runStartTimeMs).To(Equal("10000")) + Expect(grp.runEndCompletionTimeMs).To(Equal("20000")) + Expect(grp.trgStartTimeMs).To(Equal("10100")) + Expect(grp.trgEndTimeMs).To(Equal("19900")) + Expect(grp.detectors).To(ContainElements("ITS", "TPC", "TRG")) // TRG added due to ctp_readout_enabled + Expect(grp.hbfPerTf).To(Equal(uint32(128))) + }) + + It("should return nil when environment_id is missing", func() { + delete(varStack, "environment_id") + grp := NewGRPObject(varStack) + Expect(grp).To(BeNil()) + }) + + It("should return nil when run_number is missing", func() { + delete(varStack, "run_number") + grp := NewGRPObject(varStack) + Expect(grp).To(BeNil()) + }) + + It("should handle invalid run_number format", func() { + varStack["run_number"] = "invalid" + grp := NewGRPObject(varStack) + Expect(grp).To(BeNil()) + }) + + It("should handle missing run_type", func() { + delete(varStack, "run_type") + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.runType).To(Equal(runtype.NONE)) + }) + + It("should return nil when pdp_n_hbf_per_tf is missing", func() { + delete(varStack, "pdp_n_hbf_per_tf") + grp := NewGRPObject(varStack) + Expect(grp).To(BeNil()) + }) + + It("should override run start time for synthetic runs and compute run end time accordingly", func() { + varStack["run_type"] = "SYNTHETIC" + varStack["pdp_override_run_start_time"] = "15000" + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.runStartTimeMs).To(Equal("15000")) + Expect(grp.runEndCompletionTimeMs).To(Equal("25000")) + }) + + It("should log a warning for run start time override in non-synthetic runs, but override it anyway", func() { + // overriding is not really a strong requirement, it could be changed if requested + varStack["pdp_override_run_start_time"] = "15000" + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.runStartTimeMs).To(Equal("15000")) + Expect(grp.runEndCompletionTimeMs).To(Equal("25000")) + }) + + It("should survive empty detectors list", func() { + varStack["detectors"] = "[]" + varStack["ctp_readout_enabled"] = "false" + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.detectors).To(BeEmpty()) + }) + + It("should return nil when there is invalid detectors JSON", func() { + varStack["detectors"] = "invalid json" + grp := NewGRPObject(varStack) + Expect(grp).To(BeNil()) + }) + + It("should handle missing trg_start_time_ms and trg_end_time_ms", func() { + delete(varStack, "trg_start_time_ms") + delete(varStack, "trg_end_time_ms") + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.trgStartTimeMs).To(BeEmpty()) + Expect(grp.trgEndTimeMs).To(BeEmpty()) + }) + + It("should handle synthetic run with original run number", func() { + varStack["run_type"] = "SYNTHETIC" + varStack["original_run_number"] = "654321" + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.originalRunNumber).To(Equal(uint32(654321))) + Expect(grp.runNumber).To(Equal(uint32(123456))) + }) + + It("should ignore original run number for non-synthetic runs", func() { + varStack["original_run_number"] = "654321" + grp := NewGRPObject(varStack) + Expect(grp).ToNot(BeNil()) + Expect(grp.originalRunNumber).To(Equal(uint32(0))) + }) + + // fixme: we do not test extracting the list of FLPs, because we would need to mock an env manager with a realistic enough environment + // once it is easier to mock it, we should add a test for it +}) + +var _ = Describe("NewCcdbGrpWriteCommand", func() { + var plugin *Plugin + var grp *GeneralRunParameters + + BeforeEach(func() { + plugin = &Plugin{ + ccdbUrl: "http://ccdb-test:8080", + } + grp = &GeneralRunParameters{ + runNumber: 123456, + runType: runtype.PHYSICS, + detectors: []string{"ITS", "TPC"}, + runStartTimeMs: "10000", + runEndCompletionTimeMs: "20000", + trgStartTimeMs: "10100", + trgEndTimeMs: "19900", + hbfPerTf: 128, + lhcPeriod: "LHC22a", + } + }) + + It("should create basic command with required fields", func() { + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).To(ContainSubstring(" -r 123456")) + Expect(cmd).To(ContainSubstring(" -p LHC22a")) + Expect(cmd).To(ContainSubstring(" -t 1")) // PHYSICS enum value + Expect(cmd).To(ContainSubstring(" -n 128")) + Expect(cmd).To(ContainSubstring(" -s 10000")) + Expect(cmd).To(ContainSubstring(" -e 20000")) + Expect(cmd).To(ContainSubstring(" --start-time-ctp 10100")) + Expect(cmd).To(ContainSubstring(" --end-time-ctp 19900")) + Expect(cmd).To(ContainSubstring(" --ccdb-server http://ccdb-test:8080")) + }) + + It("should return an error when run number is 0", func() { + grp.runNumber = 0 + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).To(HaveOccurred()) + Expect(cmd).To(BeEmpty()) + }) + + It("should return an error when LHC period is missing", func() { + grp.lhcPeriod = "" + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).To(HaveOccurred()) + Expect(cmd).To(BeEmpty()) + }) + + It("should add the refresh flag when requested", func() { + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", true) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).To(ContainSubstring(" --refresh")) + }) + + It("should not add the refresh flag when not requested", func() { + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).ToNot(ContainSubstring(" --refresh")) + }) + + It("should include detector lists when present", func() { + grp.continuousReadoutDetectors = []string{"ITS"} + grp.triggeringDetectors = []string{"TPC"} + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).To(ContainSubstring(` -d "ITS,TPC"`)) + Expect(cmd).To(ContainSubstring(` -c "ITS"`)) + Expect(cmd).To(ContainSubstring(` -g "TPC"`)) + }) + + It("should include FLP list when present", func() { + grp.flpIdList = []string{"flp-1", "flp-2"} + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).To(ContainSubstring(` -f "flp-1,flp-2"`)) + }) + + It("should include original run number for synthetic runs", func() { + grp.originalRunNumber = 654321 + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).To(ContainSubstring(" -o 654321")) + }) + + It("should skip optional fields when empty", func() { + grp = &GeneralRunParameters{ + runNumber: 123456, + lhcPeriod: "LHC22a", + } + cmd, err := plugin.NewCcdbGrpWriteCommand(grp, "http://ccdb-test:8080", false) + Expect(err).ToNot(HaveOccurred()) + Expect(cmd).NotTo(ContainSubstring(" -d")) + Expect(cmd).NotTo(ContainSubstring(" -c")) + Expect(cmd).NotTo(ContainSubstring(" -g")) + Expect(cmd).NotTo(ContainSubstring(" -f")) + Expect(cmd).NotTo(ContainSubstring(" -t")) + Expect(cmd).NotTo(ContainSubstring(" -s")) + Expect(cmd).NotTo(ContainSubstring(" -e")) + Expect(cmd).NotTo(ContainSubstring(" --start-time-ctp")) + Expect(cmd).NotTo(ContainSubstring(" --end-time-ctp")) + }) +}) + +func TestCcdbGrpPlugin(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "CCDB GRP integration plugin Test Suite") +} From 41f665200d9b21a3b9ecef55a3b6e445690eddd9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 24 Apr 2025 11:11:34 +0200 Subject: [PATCH 2122/2352] [core] disable warning for too metrics and increase metrics buffer size --- common/monitoring/monitoring.go | 3 --- core/config.go | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 527cf293a..e3ec257f6 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -8,7 +8,6 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/sirupsen/logrus" ) @@ -67,8 +66,6 @@ func eventLoop() { case metric := <-metricsChannel: if len(metrics) < metricsLimit { metrics = append(metrics, metric) - } else { - log.WithField("level", infologger.IL_Devel).Warn("too many metrics waiting to be scraped. Are you sure that metrics scraping is running?") } case <-endChannel: diff --git a/core/config.go b/core/config.go index 9b48de8bb..9d7513f78 100644 --- a/core/config.go +++ b/core/config.go @@ -129,7 +129,7 @@ func setDefaults() error { viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) viper.SetDefault("metricsEndpoint", "8088/ecsmetrics") - viper.SetDefault("metricsBufferSize", 10000) + viper.SetDefault("metricsBufferSize", 1000000) return nil } From 9bb08076e1c8009a3b64158bac3a53e4282224e4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 24 Apr 2025 11:35:23 +0200 Subject: [PATCH 2123/2352] [build] bump to v1.33.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ad4e009d3..cf5833447 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 32 -VERSION_PATCH := 1 +VERSION_MINOR := 33 +VERSION_PATCH := 0 From 32ceab620e8036fa739f599e6ba1c65059cadd52 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 24 Apr 2025 15:15:40 +0200 Subject: [PATCH 2124/2352] [core] fix missing number of tasks in Environment calls Fixes OCTRL-1011 --- core/server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/server.go b/core/server.go index ee96d6b94..ebfaafc0d 100644 --- a/core/server.go +++ b/core/server.go @@ -480,6 +480,7 @@ func (m *RpcServer) NewEnvironment(cxt context.Context, request *pb.NewEnvironme UserVars: userVars, NumberOfFlps: int32(len(newEnv.GetFLPs())), NumberOfHosts: int32(len(newEnv.GetAllHosts())), + NumberOfTasks: int32(len(tasks)), IncludedDetectors: newEnv.GetActiveDetectors().StringList(), IntegratedServicesData: isEnvData, CurrentTransition: newEnv.CurrentTransition(), @@ -561,6 +562,7 @@ func (m *RpcServer) GetEnvironment(cxt context.Context, req *pb.GetEnvironmentRe UserVars: userVars, NumberOfFlps: int32(len(env.GetFLPs())), NumberOfHosts: int32(len(env.GetAllHosts())), + NumberOfTasks: int32(len(tasks)), IntegratedServicesData: isEnvData, CurrentTransition: env.CurrentTransition(), NumberOfActiveTasks: int32(len(tasks.Filtered(func(t *task.Task) bool { From a0d35ad3cc85b410edacb2d0e506ecde19db1d9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Apr 2025 23:01:47 +0000 Subject: [PATCH 2125/2352] Bump golang.org/x/net from 0.33.0 to 0.38.0 Bumps [golang.org/x/net](https://github.com/golang/net) from 0.33.0 to 0.38.0. - [Commits](https://github.com/golang/net/compare/v0.33.0...v0.38.0) --- updated-dependencies: - dependency-name: golang.org/x/net dependency-version: 0.38.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 15 +++++++-------- go.sum | 24 ++++++++++++------------ 2 files changed, 19 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 82d13ed40..003d217cf 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,7 @@ module github.com/AliceO2Group/Control go 1.22 - -toolchain go1.22.2 +toolchain go1.24.1 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt @@ -62,9 +61,9 @@ require ( github.com/valyala/fasttemplate v1.2.2 github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.31.0 - golang.org/x/net v0.33.0 - golang.org/x/sys v0.28.0 + golang.org/x/crypto v0.36.0 + golang.org/x/net v0.38.0 + golang.org/x/sys v0.31.0 google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.34.1 @@ -167,9 +166,9 @@ require ( github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.19.0 // indirect - golang.org/x/sync v0.10.0 // indirect - golang.org/x/term v0.27.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/term v0.30.0 // indirect + golang.org/x/text v0.23.0 // indirect golang.org/x/tools v0.23.0 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect diff --git a/go.sum b/go.sum index 9fedcd649..0bae094a3 100644 --- a/go.sum +++ b/go.sum @@ -455,8 +455,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= -golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= +golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -479,8 +479,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= -golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= +golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -489,8 +489,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ= -golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -524,16 +524,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= -golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= +golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.27.0 h1:WP60Sv1nlK1T6SupCHbXzSaN0b9wUmsPoRS9b61A23Q= -golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -545,8 +545,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= +golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 37c81bee82a2c7866cd4850ddbac316619a9e793 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 23 Apr 2025 15:37:50 +0200 Subject: [PATCH 2126/2352] update golang to v1.24.2 to allow for the dependabot bump in previous commit --- go.mod | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 003d217cf..3610a085b 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,6 @@ module github.com/AliceO2Group/Control -go 1.22 -toolchain go1.24.1 +go 1.24.2 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt From 0e7e9c4b54ccc4960c097ee66c24e8ee4f67d82e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Apr 2025 15:39:58 +0200 Subject: [PATCH 2127/2352] [core] fix incorrect Sprintf usage in CCDB plugin --- core/integration/ccdb/plugin.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 6a4f70f32..e7c6b1f14 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -536,12 +536,12 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre strings.Join(grp.detectors, ","), strings.Join(grp.triggeringDetectors, ","), strings.Join(grp.continuousReadoutDetectors, ",")) cmdStr, err := p.NewCcdbGrpWriteCommand(grp, p.ccdbUrl, refresh) if err != nil { - return errors.New(fmt.Sprintf("Failed to build a GRP to CCDB upload command: " + err.Error())) + return errors.New("Failed to build a GRP to CCDB upload command: " + err.Error()) } log.WithField("partition", envId). WithField("run", grp.runNumber). WithField("level", infologger.IL_Devel). - Debug(fmt.Sprintf("CCDB GRP upload command: '" + cmdStr + "'")) + Debugf("CCDB GRP upload command: '%s'", cmdStr) const timeoutSeconds = 10 ctx, cancel := context.WithTimeout(context.Background(), timeoutSeconds*time.Second) @@ -555,10 +555,10 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre WithField("run", grp.runNumber). Debug("CCDB GRP upload command out: " + string(cmdOut)) if ctx.Err() == context.DeadlineExceeded { - return errors.New(fmt.Sprintf("The command to upload GRP to CCDB timed out (" + strconv.Itoa(timeoutSeconds) + "s).")) + return errors.New("The command to upload GRP to CCDB timed out (" + strconv.Itoa(timeoutSeconds) + "s).") } if err != nil { - return errors.New(fmt.Sprintf("Failed to run the command to upload GRP to CCDB: " + err.Error() + "\ncommand out : " + string(cmdOut))) + return errors.New("Failed to run the command to upload GRP to CCDB: " + err.Error() + "\ncommand out : " + string(cmdOut)) } return nil } From 77f83228f9b6522f08aa48322b40a3d67c5e44c8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Apr 2025 14:33:21 +0200 Subject: [PATCH 2128/2352] [core] put error in the Error field of events This swaps Error and Message in two kafka events which deviated from the general convention, where Message contains a general, hard-coded string explaining a moment/step that an environment was at, while Error contains the specific error. It was agreed with George and this allow COG to look for "cannot create new environment" and "cannot get newly created environment" message to report the global error of an environment creation failure. --- core/server.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/server.go b/core/server.go index ebfaafc0d..0ad0ab56f 100644 --- a/core/server.go +++ b/core/server.go @@ -314,8 +314,8 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, userVars map[stri the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: id.String(), State: "ERROR", - Error: "cannot create new environment", - Message: err.Error(), + Error: err.Error(), + Message: "cannot create new environment", // GUI listens for this concrete string LastRequestUser: requestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ Public: public, @@ -330,8 +330,8 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, userVars map[stri the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ EnvironmentId: id.String(), State: "ERROR", - Error: "cannot get newly created environment", - Message: err.Error(), + Error: err.Error(), + Message: "cannot get newly created environment", // GUI listens for this concrete string LastRequestUser: requestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ Public: public, From 7f75417611a95049e03010c98c173dd049b705f8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 29 Apr 2025 15:30:13 +0200 Subject: [PATCH 2129/2352] Use golang 1.24.2 in CI --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 5d84bd1b8..57de4f793 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: os: [macOS-latest, ubuntu-24.04] - go: [ '1.22.2' ] + go: [ '1.24.2' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From 15c2e92a7f3167cf283848bb3cabe4fc693fda86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 5 May 2025 11:33:15 +0200 Subject: [PATCH 2130/2352] [protos] update protos --- .../bookkeeping/protos/bkcommon.pb.go | 320 ++++++------- .../bookkeeping/protos/bkcommon.proto | 1 + core/integration/bookkeeping/protos/run.pb.go | 174 +++---- core/integration/bookkeeping/protos/run.proto | 2 + .../bookkeeping/protos/run_grpc.pb.go | 2 +- core/integration/odc/protos/odc.pb.go | 428 ++++++++++-------- core/integration/odc/protos/odc.proto | 3 + core/integration/odc/protos/odc_grpc.pb.go | 77 ++-- 8 files changed, 544 insertions(+), 463 deletions(-) diff --git a/core/integration/bookkeeping/protos/bkcommon.pb.go b/core/integration/bookkeeping/protos/bkcommon.pb.go index c7f13d4b8..881bc1ca4 100644 --- a/core/integration/bookkeeping/protos/bkcommon.pb.go +++ b/core/integration/bookkeeping/protos/bkcommon.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.34.1 +// protoc v6.30.1 // source: protos/bkcommon.proto package bkpb @@ -296,7 +296,8 @@ type Run struct { TimeTrgEnd *int64 `protobuf:"varint,20,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` TimeTrgStart *int64 `protobuf:"varint,21,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` // Trigger value - TriggerValue *string `protobuf:"bytes,22,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + TriggerValue *string `protobuf:"bytes,22,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + RawCtpTriggerConfiguration *string `protobuf:"bytes,32,opt,name=rawCtpTriggerConfiguration,proto3,oneof" json:"rawCtpTriggerConfiguration,omitempty"` // The full name or file location of the odcTopology OdcTopologyFullName *string `protobuf:"bytes,23,opt,name=odcTopologyFullName,proto3,oneof" json:"odcTopologyFullName,omitempty"` DdFlp *bool `protobuf:"varint,24,opt,name=ddFlp,proto3,oneof" json:"ddFlp,omitempty"` @@ -496,6 +497,13 @@ func (x *Run) GetTriggerValue() string { return "" } +func (x *Run) GetRawCtpTriggerConfiguration() string { + if x != nil && x.RawCtpTriggerConfiguration != nil { + return *x.RawCtpTriggerConfiguration + } + return "" +} + func (x *Run) GetOdcTopologyFullName() string { if x != nil && x.OdcTopologyFullName != nil { return *x.OdcTopologyFullName @@ -827,7 +835,7 @@ var File_protos_bkcommon_proto protoreflect.FileDescriptor var file_protos_bkcommon_proto_rawDesc = []byte{ 0x0a, 0x15, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x62, 0x6b, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xbc, 0x0c, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, + 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x22, 0xa0, 0x0d, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, @@ -884,158 +892,164 @@ var file_protos_bkcommon_proto_rawDesc = []byte{ 0x28, 0x03, 0x48, 0x10, 0x52, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x48, 0x11, 0x52, 0x0c, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x35, - 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x48, 0x12, 0x52, 0x13, 0x6f, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x43, + 0x0a, 0x1a, 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x20, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x12, 0x52, 0x1a, 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x13, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, + 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x64, 0x64, + 0x46, 0x6c, 0x70, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x48, 0x14, 0x52, 0x05, 0x64, 0x64, 0x46, + 0x6c, 0x70, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x15, 0x52, 0x03, 0x64, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, + 0x65, 0x70, 0x6e, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x16, 0x52, 0x03, 0x65, 0x70, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, + 0x67, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x17, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, + 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, + 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x18, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x61, 0x64, 0x4f, 0x75, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x44, 0x65, 0x74, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x42, + 0x08, 0x0a, 0x06, 0x5f, 0x6e, 0x46, 0x6c, 0x70, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x53, + 0x75, 0x62, 0x74, 0x69, 0x6d, 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x12, 0x0a, 0x10, + 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, + 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, + 0x72, 0x69, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, - 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x13, 0x52, 0x05, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x88, 0x01, 0x01, - 0x12, 0x15, 0x0a, 0x03, 0x64, 0x63, 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x48, 0x14, 0x52, - 0x03, 0x64, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x65, 0x70, 0x6e, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x15, 0x52, 0x03, 0x65, 0x70, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, - 0x0a, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x16, 0x52, 0x0b, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, - 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x21, 0x0a, 0x09, 0x6c, - 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x17, - 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4f, 0x75, - 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, 0x45, 0x70, 0x6e, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6e, - 0x46, 0x6c, 0x70, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x6e, 0x53, 0x75, 0x62, 0x74, 0x69, 0x6d, - 0x65, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, - 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, - 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, - 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x42, 0x0a, 0x0a, - 0x08, 0x5f, 0x72, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x66, - 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, - 0x67, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, - 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x08, - 0x0a, 0x06, 0x5f, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x64, 0x63, 0x73, - 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x70, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x70, 0x6e, - 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xc8, 0x02, 0x0a, 0x07, 0x4c, 0x48, 0x43, 0x46, 0x69, - 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x10, - 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, - 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, 0x01, 0x52, 0x0e, 0x73, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x35, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x48, 0x02, 0x52, - 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, - 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x73, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x6a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0a, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, - 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x13, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, 0x02, 0x69, 0x64, - 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, 0x22, 0x90, 0x01, - 0x0a, 0x09, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x13, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x64, - 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2a, 0xe7, 0x02, 0x0a, 0x08, 0x44, 0x65, - 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, - 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x52, 0x44, 0x10, 0x04, 0x12, 0x10, 0x0a, - 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x4f, 0x46, 0x10, 0x05, 0x12, - 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x48, 0x4d, 0x50, 0x10, - 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x50, 0x48, - 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, - 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, - 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, - 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, - 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, 0x10, 0x12, 0x12, 0x10, 0x0a, 0x0c, 0x44, - 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x53, 0x54, 0x10, 0x13, 0x12, 0x10, 0x0a, - 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x54, 0x53, 0x10, 0x20, 0x12, - 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x44, 0x44, 0x10, - 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x54, - 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, - 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, - 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, - 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, - 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x22, 0x04, 0x08, 0x0b, 0x10, - 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, 0x08, 0x11, 0x10, 0x11, 0x22, 0x04, 0x08, - 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, - 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x51, - 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, 0x44, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, - 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x47, 0x4f, 0x4f, 0x44, - 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, - 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, - 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x04, 0x2a, 0xb0, - 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x55, - 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, - 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, - 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, 0x53, 0x54, 0x41, 0x4c, - 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, - 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, 0x24, 0x0a, 0x20, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, - 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, - 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, 0x41, 0x53, 0x4e, 0x5f, - 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, 0x25, 0x0a, 0x21, 0x52, - 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x43, 0x41, 0x4e, - 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, - 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x4e, 0x41, 0x4c, 0x4f, - 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x64, 0x64, 0x46, 0x6c, 0x70, 0x42, 0x06, 0x0a, 0x04, + 0x5f, 0x64, 0x63, 0x73, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x65, 0x70, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, + 0x5f, 0x65, 0x70, 0x6e, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x42, 0x0c, 0x0a, 0x0a, + 0x5f, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x22, 0xc8, 0x02, 0x0a, 0x07, 0x4c, + 0x48, 0x43, 0x46, 0x69, 0x6c, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x48, 0x00, 0x52, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x01, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, + 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x03, 0x48, 0x02, 0x52, 0x13, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x62, + 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, + 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, + 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x73, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x42, 0x16, 0x0a, + 0x14, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x23, 0x0a, + 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x00, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x88, + 0x01, 0x01, 0x12, 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, + 0x52, 0x02, 0x69, 0x64, 0x88, 0x01, 0x01, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x64, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, + 0x64, 0x22, 0x90, 0x01, 0x0a, 0x09, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, + 0x13, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x02, 0x69, + 0x64, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x05, 0x0a, + 0x03, 0x5f, 0x69, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x2a, 0xe7, 0x02, + 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, + 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x10, 0x0a, + 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x50, 0x43, 0x10, 0x03, 0x12, + 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x52, 0x44, 0x10, + 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x4f, + 0x46, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, + 0x48, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x50, 0x48, 0x53, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x50, 0x56, 0x10, 0x08, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x43, 0x48, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x5a, 0x44, 0x43, 0x10, 0x0f, 0x12, 0x10, 0x0a, + 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4d, 0x43, 0x10, 0x12, 0x12, + 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x54, 0x53, 0x54, 0x10, + 0x13, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x49, 0x54, + 0x53, 0x10, 0x20, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, + 0x46, 0x44, 0x44, 0x10, 0x21, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, + 0x52, 0x5f, 0x46, 0x54, 0x30, 0x10, 0x22, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, 0x45, 0x43, + 0x54, 0x4f, 0x52, 0x5f, 0x46, 0x56, 0x30, 0x10, 0x23, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x45, 0x54, + 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x46, 0x54, 0x10, 0x24, 0x12, 0x10, 0x0a, 0x0c, 0x44, + 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x4d, 0x49, 0x44, 0x10, 0x25, 0x22, 0x04, 0x08, + 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, 0x08, 0x09, 0x10, 0x09, 0x22, + 0x04, 0x08, 0x0b, 0x10, 0x0e, 0x22, 0x04, 0x08, 0x10, 0x10, 0x10, 0x22, 0x04, 0x08, 0x11, 0x10, + 0x11, 0x22, 0x04, 0x08, 0x14, 0x10, 0x1f, 0x2a, 0x79, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x51, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, + 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x52, + 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x42, 0x41, 0x44, 0x10, 0x01, + 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, + 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, + 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, + 0x52, 0x55, 0x4e, 0x5f, 0x51, 0x55, 0x41, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, + 0x10, 0x04, 0x2a, 0xb0, 0x04, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x11, + 0x0a, 0x0d, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x48, + 0x59, 0x53, 0x49, 0x43, 0x53, 0x10, 0x01, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x12, + 0x15, 0x0a, 0x11, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x50, 0x45, 0x44, 0x45, + 0x53, 0x54, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x52, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x52, + 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4c, 0x41, 0x53, 0x45, 0x52, 0x10, 0x05, 0x12, + 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x49, 0x54, 0x48, 0x52, 0x5f, 0x54, 0x55, 0x4e, + 0x49, 0x4e, 0x47, 0x10, 0x06, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x43, + 0x41, 0x53, 0x4e, 0x5f, 0x54, 0x55, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x07, 0x12, 0x21, 0x0a, 0x1d, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x48, 0x52, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x08, 0x12, + 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, + 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x49, 0x47, 0x49, 0x54, 0x41, 0x4c, 0x5f, + 0x53, 0x43, 0x41, 0x4e, 0x10, 0x09, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, - 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, 0x12, 0x18, 0x0a, 0x14, + 0x4e, 0x41, 0x4c, 0x4f, 0x47, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, + 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x46, 0x48, 0x52, 0x10, 0x0b, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x41, 0x4c, 0x50, 0x49, 0x44, 0x45, 0x5f, 0x53, 0x43, 0x41, 0x4e, 0x10, 0x0c, + 0x12, 0x18, 0x0a, 0x14, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, + 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, + 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, + 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, + 0x54, 0x48, 0x45, 0x54, 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x43, 0x4f, 0x53, 0x4d, 0x49, 0x43, 0x53, 0x10, 0x0e, 0x12, 0x16, 0x0a, 0x12, - 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x54, 0x48, 0x45, 0x54, - 0x49, 0x43, 0x10, 0x0f, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x4e, 0x4f, 0x49, 0x53, 0x45, 0x10, 0x10, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x55, 0x4e, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, 0x48, 0x10, 0x11, 0x12, - 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, 0x41, 0x4c, 0x49, - 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, 0x45, 0x54, 0x44, 0x10, - 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x55, 0x4c, 0x53, 0x45, 0x5f, 0x4c, 0x45, 0x4e, 0x47, 0x54, + 0x48, 0x10, 0x11, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x55, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x41, 0x4c, 0x49, 0x42, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x52, 0x45, 0x53, + 0x45, 0x54, 0x44, 0x10, 0x12, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, 0x70, + 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/bkcommon.proto b/core/integration/bookkeeping/protos/bkcommon.proto index d213022af..e23775248 100644 --- a/core/integration/bookkeeping/protos/bkcommon.proto +++ b/core/integration/bookkeeping/protos/bkcommon.proto @@ -93,6 +93,7 @@ message Run { optional int64 timeTrgStart = 21; // Trigger value optional string triggerValue = 22; + optional string rawCtpTriggerConfiguration = 32; // The full name or file location of the odcTopology optional string odcTopologyFullName = 23; optional bool ddFlp = 24; diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 932832a6a..1fdb0a128 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.34.1 +// protoc v6.30.1 // source: protos/run.proto package bkpb @@ -344,6 +344,7 @@ type RunUpdateRequest struct { TimeTrgStart *int64 `protobuf:"varint,5,opt,name=timeTrgStart,proto3,oneof" json:"timeTrgStart,omitempty"` TimeTrgEnd *int64 `protobuf:"varint,6,opt,name=timeTrgEnd,proto3,oneof" json:"timeTrgEnd,omitempty"` TriggerValue *string `protobuf:"bytes,7,opt,name=triggerValue,proto3,oneof" json:"triggerValue,omitempty"` + RawCtpTriggerConfiguration *string `protobuf:"bytes,19,opt,name=rawCtpTriggerConfiguration,proto3,oneof" json:"rawCtpTriggerConfiguration,omitempty"` PdpConfigOption *string `protobuf:"bytes,8,opt,name=pdpConfigOption,proto3,oneof" json:"pdpConfigOption,omitempty"` PdpTopologyDescriptionLibraryFile *string `protobuf:"bytes,9,opt,name=pdpTopologyDescriptionLibraryFile,proto3,oneof" json:"pdpTopologyDescriptionLibraryFile,omitempty"` TfbDdMode *string `protobuf:"bytes,10,opt,name=tfbDdMode,proto3,oneof" json:"tfbDdMode,omitempty"` @@ -355,7 +356,7 @@ type RunUpdateRequest struct { EorReasons []*EorReason `protobuf:"bytes,16,rep,name=eorReasons,proto3" json:"eorReasons,omitempty"` // Optional users that stopped or started the run (can also be undefined) UserO2Start *User `protobuf:"bytes,17,opt,name=userO2Start,proto3,oneof" json:"userO2Start,omitempty"` - UserO2Stop *User `protobuf:"bytes,18,opt,name=userO2Stop,proto3,oneof" json:"userO2Stop,omitempty"` + UserO2Stop *User `protobuf:"bytes,18,opt,name=userO2Stop,proto3,oneof" json:"userO2Stop,omitempty"` // 19 is trigger raw configuration } func (x *RunUpdateRequest) Reset() { @@ -432,6 +433,13 @@ func (x *RunUpdateRequest) GetTriggerValue() string { return "" } +func (x *RunUpdateRequest) GetRawCtpTriggerConfiguration() string { + if x != nil && x.RawCtpTriggerConfiguration != nil { + return *x.RawCtpTriggerConfiguration + } + return "" +} + func (x *RunUpdateRequest) GetPdpConfigOption() string { if x != nil && x.PdpConfigOption != nil { return *x.PdpConfigOption @@ -567,7 +575,7 @@ var file_protos_run_proto_rawDesc = []byte{ 0x88, 0x01, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x22, 0xc8, 0x08, 0x0a, 0x10, 0x52, + 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x22, 0xac, 0x09, 0x0a, 0x10, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x25, 0x0a, @@ -582,84 +590,90 @@ var file_protos_run_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x03, 0x48, 0x03, 0x52, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0c, 0x74, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2d, - 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x51, 0x0a, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x43, + 0x0a, 0x1a, 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x05, 0x52, 0x1a, 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x0f, + 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x51, 0x0a, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, + 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, + 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x21, 0x70, 0x64, 0x70, 0x54, - 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x09, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, - 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, - 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x15, - 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x64, 0x70, 0x42, - 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, - 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x29, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0c, 0x52, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, - 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x65, 0x6f, - 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, - 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x6f, 0x72, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, - 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x48, 0x0d, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x88, - 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, - 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x0e, 0x52, 0x0a, - 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, - 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0c, 0x0a, - 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, - 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x12, 0x0a, 0x10, - 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x72, 0x61, - 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x66, 0x62, 0x44, 0x64, - 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, - 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x70, - 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, - 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, - 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x4f, - 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x4f, - 0x32, 0x53, 0x74, 0x6f, 0x70, 0x2a, 0x42, 0x0a, 0x0c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x1a, 0x0a, - 0x16, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4c, - 0x48, 0x43, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, 0x32, 0xda, 0x01, 0x0a, 0x0a, 0x52, 0x75, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, - 0x1f, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, - 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, - 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, - 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, - 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, - 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x62, 0x6b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x74, 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x09, 0x74, 0x66, 0x62, 0x44, + 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x6c, 0x68, 0x63, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x48, 0x09, 0x52, 0x09, 0x6c, + 0x68, 0x63, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x13, 0x6f, + 0x64, 0x63, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0a, 0x52, 0x13, 0x6f, 0x64, 0x63, 0x54, + 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x39, 0x0a, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x0b, 0x52, 0x15, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, + 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x0c, 0x52, 0x0b, 0x70, 0x64, 0x70, 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, + 0x66, 0x67, 0x55, 0x72, 0x69, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x48, 0x0d, 0x52, 0x0d, 0x72, + 0x65, 0x61, 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x88, 0x01, 0x01, 0x12, + 0x39, 0x0a, 0x0a, 0x65, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x45, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0a, + 0x65, 0x6f, 0x72, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x73, + 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, + 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x0e, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4f, + 0x32, 0x53, 0x74, 0x6f, 0x70, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x32, + 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x48, 0x0f, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x88, + 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x4f, 0x32, 0x45, 0x6e, 0x64, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x72, 0x67, 0x45, 0x6e, 0x64, + 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x61, 0x77, 0x43, 0x74, 0x70, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x70, 0x64, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x70, 0x64, 0x70, 0x54, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x4c, + 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x74, + 0x66, 0x62, 0x44, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x68, 0x63, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6f, 0x64, 0x63, 0x54, 0x6f, + 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x18, + 0x0a, 0x16, 0x5f, 0x70, 0x64, 0x70, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x64, 0x70, + 0x42, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x6f, 0x75, 0x74, 0x43, 0x66, 0x67, 0x55, 0x72, 0x69, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x4f, 0x32, 0x53, 0x74, 0x6f, 0x70, 0x2a, 0x42, 0x0a, 0x0c, 0x52, 0x75, 0x6e, + 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x12, 0x52, 0x55, 0x4e, + 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4e, 0x55, 0x4c, 0x4c, 0x10, + 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x52, 0x55, 0x4e, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x5f, 0x4c, 0x48, 0x43, 0x5f, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, 0x32, 0xda, 0x01, + 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x03, + 0x47, 0x65, 0x74, 0x12, 0x1f, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x46, 0x65, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, + 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, + 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x12, 0x3f, 0x0a, 0x06, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, + 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6f, 0x32, 0x2e, 0x62, 0x6f, 0x6f, 0x6b, 0x6b, + 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2e, 0x52, 0x75, 0x6e, 0x42, 0x4a, 0x5a, 0x48, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, + 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x62, + 0x6f, 0x6f, 0x6b, 0x6b, 0x65, 0x65, 0x70, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x62, 0x6b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/bookkeeping/protos/run.proto b/core/integration/bookkeeping/protos/run.proto index 072beed7e..f9cdc79b7 100644 --- a/core/integration/bookkeeping/protos/run.proto +++ b/core/integration/bookkeeping/protos/run.proto @@ -53,6 +53,7 @@ message RunUpdateRequest { optional int64 timeTrgStart = 5; optional int64 timeTrgEnd = 6; optional string triggerValue = 7; + optional string rawCtpTriggerConfiguration = 19; optional string pdpConfigOption = 8; optional string pdpTopologyDescriptionLibraryFile = 9; optional string tfbDdMode = 10; @@ -65,6 +66,7 @@ message RunUpdateRequest { // Optional users that stopped or started the run (can also be undefined) optional User userO2Start = 17; optional User userO2Stop = 18; + // 19 is trigger raw configuration } // Enums diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index 57735ad17..586594d88 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.28.2 +// - protoc v6.30.1 // source: protos/run.proto package bkpb diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 01d947117..2c6a11814 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.34.1 +// protoc v6.30.1 // source: protos/odc.proto package odc @@ -191,6 +191,7 @@ type GeneralReply struct { State string `protobuf:"bytes,7,opt,name=state,proto3" json:"state,omitempty"` // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. Runnr uint64 `protobuf:"varint,8,opt,name=runnr,proto3" json:"runnr,omitempty"` // Run number from ECS (optional) Hosts []string `protobuf:"bytes,9,rep,name=hosts,proto3" json:"hosts,omitempty"` // Where applicable, provides a list of used hosts (Submit/Run requests) + Rmsjobids string `protobuf:"bytes,10,opt,name=rmsjobids,proto3" json:"rmsjobids,omitempty"` // Where applicable, provides a list of job IDs from the resource management system } func (x *GeneralReply) Reset() { @@ -288,6 +289,13 @@ func (x *GeneralReply) GetHosts() []string { return nil } +func (x *GeneralReply) GetRmsjobids() string { + if x != nil { + return x.Rmsjobids + } + return "" +} + // Device information // Runtime task ID and path are the same as in DDS. // To get task details use DDS Topology API. @@ -296,11 +304,13 @@ type Device struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) - State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) - Ignored bool `protobuf:"varint,4,opt,name=ignored,proto3" json:"ignored,omitempty"` // Device was stopped and set to be ignored - Host string `protobuf:"bytes,5,opt,name=host,proto3" json:"host,omitempty"` // Host where the task runs + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime task ID (same as in DDS) + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // FairMQ device state as string + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Runtime task path (same as in DDS) + Ignored bool `protobuf:"varint,4,opt,name=ignored,proto3" json:"ignored,omitempty"` // Device was stopped and set to be ignored + Host string `protobuf:"bytes,5,opt,name=host,proto3" json:"host,omitempty"` // Host where the task runs + Expendable bool `protobuf:"varint,6,opt,name=expendable,proto3" json:"expendable,omitempty"` // Device is expendable + Rmsjobid string `protobuf:"bytes,7,opt,name=rmsjobid,proto3" json:"rmsjobid,omitempty"` // job IDs from the resource management system } func (x *Device) Reset() { @@ -370,6 +380,20 @@ func (x *Device) GetHost() string { return "" } +func (x *Device) GetExpendable() bool { + if x != nil { + return x.Expendable + } + return false +} + +func (x *Device) GetRmsjobid() string { + if x != nil { + return x.Rmsjobid + } + return "" +} + // Device change/get state request type StateRequest struct { state protoimpl.MessageState @@ -1612,7 +1636,7 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x74, 0x6f, 0x12, 0x03, 0x6f, 0x64, 0x63, 0x22, 0x2d, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x8a, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0xa8, 0x02, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, @@ -1629,101 +1653,78 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x68, 0x6f, - 0x73, 0x74, 0x73, 0x22, 0x70, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, - 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, - 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, - 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6d, 0x73, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, - 0x65, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, - 0x11, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, - 0x0f, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x22, 0x96, 0x02, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x73, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, + 0x73, 0x22, 0xac, 0x01, 0x0a, 0x06, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x6f, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, + 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, + 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x73, 0x67, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6d, 0x73, 0x67, 0x12, 0x28, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x83, 0x01, 0x0a, 0x11, 0x49, 0x6e, 0x69, 0x74, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x22, 0x97, 0x01, + 0x0a, 0x0d, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x54, 0x6f, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x6f, 0x70, 0x6f, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, + 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0f, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, @@ -1733,107 +1734,136 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x08, 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, - 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x22, 0x32, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x12, 0x2d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, - 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, - 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3a, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, - 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, - 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, - 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, - 0x0a, 0x05, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, - 0x10, 0x02, 0x32, 0xdf, 0x05, 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, - 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x2b, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, - 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x35, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, - 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x96, 0x02, 0x0a, 0x0a, + 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, + 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x6f, 0x70, 0x6f, 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, + 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x12, 0x32, 0x0a, 0x14, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, + 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x6f, + 0x6c, 0x6f, 0x67, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x22, 0x63, 0x0a, 0x0f, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, + 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x32, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0xab, 0x01, 0x0a, 0x14, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, + 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x2d, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x22, 0x3f, 0x0a, + 0x10, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, + 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, + 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x0b, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0c, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3f, 0x0a, 0x10, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x29, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x2a, 0x32, 0x0a, 0x0b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x5f, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x02, 0x32, 0xdf, 0x05, + 0x0a, 0x03, 0x4f, 0x44, 0x43, 0x12, 0x39, 0x0a, 0x0a, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x69, 0x7a, 0x65, 0x12, 0x16, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x31, 0x0a, 0x06, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, + 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x12, + 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x76, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x03, 0x52, 0x75, + 0x6e, 0x12, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, - 0x12, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, - 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, - 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, - 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x09, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x15, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x12, 0x19, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x22, 0x00, 0x12, 0x30, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, - 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x10, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x42, 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x73, 0x3b, 0x6f, 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x22, 0x00, 0x12, 0x30, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x11, + 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x04, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x10, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x2d, 0x0a, 0x05, 0x52, 0x65, 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, + 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, + 0x35, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6f, + 0x64, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x12, 0x14, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x30, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x64, + 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, + 0x41, 0x5a, 0x3f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, + 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2f, 0x6f, 0x64, 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x6f, + 0x64, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 1dcda93e3..9ce3c187b 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -73,6 +73,7 @@ message GeneralReply { string state = 7; // If successful and applicable to a request then contains an aggregated FairMQ device state, otherwise UNDEFINED. uint64 runnr = 8; // Run number from ECS (optional) repeated string hosts = 9; // Where applicable, provides a list of used hosts (Submit/Run requests) + string rmsjobids = 10; // Where applicable, provides a list of job IDs from the resource management system } // Device information @@ -84,6 +85,8 @@ message Device { string path = 3; // Runtime task path (same as in DDS) bool ignored = 4; // Device was stopped and set to be ignored string host = 5; // Host where the task runs + bool expendable = 6; // Device is expendable + string rmsjobid = 7; // job IDs from the resource management system } // Device change/get state request diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 4dc314147..2252d2849 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v6.30.1 // source: protos/odc.proto package odc @@ -18,6 +18,23 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + ODC_Initialize_FullMethodName = "/odc.ODC/Initialize" + ODC_Submit_FullMethodName = "/odc.ODC/Submit" + ODC_Activate_FullMethodName = "/odc.ODC/Activate" + ODC_Run_FullMethodName = "/odc.ODC/Run" + ODC_Update_FullMethodName = "/odc.ODC/Update" + ODC_Configure_FullMethodName = "/odc.ODC/Configure" + ODC_SetProperties_FullMethodName = "/odc.ODC/SetProperties" + ODC_GetState_FullMethodName = "/odc.ODC/GetState" + ODC_Start_FullMethodName = "/odc.ODC/Start" + ODC_Stop_FullMethodName = "/odc.ODC/Stop" + ODC_Reset_FullMethodName = "/odc.ODC/Reset" + ODC_Terminate_FullMethodName = "/odc.ODC/Terminate" + ODC_Shutdown_FullMethodName = "/odc.ODC/Shutdown" + ODC_Status_FullMethodName = "/odc.ODC/Status" +) + // ODCClient is the client API for ODC service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -66,7 +83,7 @@ func NewODCClient(cc grpc.ClientConnInterface) ODCClient { func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Initialize", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Initialize_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -75,7 +92,7 @@ func (c *oDCClient) Initialize(ctx context.Context, in *InitializeRequest, opts func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Submit", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Submit_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -84,7 +101,7 @@ func (c *oDCClient) Submit(ctx context.Context, in *SubmitRequest, opts ...grpc. func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Activate", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Activate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -93,7 +110,7 @@ func (c *oDCClient) Activate(ctx context.Context, in *ActivateRequest, opts ...g func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Run", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Run_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -102,7 +119,7 @@ func (c *oDCClient) Run(ctx context.Context, in *RunRequest, opts ...grpc.CallOp func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Update", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Update_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -111,7 +128,7 @@ func (c *oDCClient) Update(ctx context.Context, in *UpdateRequest, opts ...grpc. func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Configure", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Configure_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -120,7 +137,7 @@ func (c *oDCClient) Configure(ctx context.Context, in *ConfigureRequest, opts .. func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/SetProperties", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_SetProperties_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -129,7 +146,7 @@ func (c *oDCClient) SetProperties(ctx context.Context, in *SetPropertiesRequest, func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/GetState", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_GetState_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -138,7 +155,7 @@ func (c *oDCClient) GetState(ctx context.Context, in *StateRequest, opts ...grpc func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Start", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Start_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -147,7 +164,7 @@ func (c *oDCClient) Start(ctx context.Context, in *StartRequest, opts ...grpc.Ca func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Stop", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Stop_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -156,7 +173,7 @@ func (c *oDCClient) Stop(ctx context.Context, in *StopRequest, opts ...grpc.Call func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Reset", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Reset_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -165,7 +182,7 @@ func (c *oDCClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.Ca func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts ...grpc.CallOption) (*StateReply, error) { out := new(StateReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Terminate", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Terminate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -174,7 +191,7 @@ func (c *oDCClient) Terminate(ctx context.Context, in *TerminateRequest, opts .. func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...grpc.CallOption) (*GeneralReply, error) { out := new(GeneralReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Shutdown", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Shutdown_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -183,7 +200,7 @@ func (c *oDCClient) Shutdown(ctx context.Context, in *ShutdownRequest, opts ...g func (c *oDCClient) Status(ctx context.Context, in *StatusRequest, opts ...grpc.CallOption) (*StatusReply, error) { out := new(StatusReply) - err := c.cc.Invoke(ctx, "/odc.ODC/Status", in, out, opts...) + err := c.cc.Invoke(ctx, ODC_Status_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -296,7 +313,7 @@ func _ODC_Initialize_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Initialize", + FullMethod: ODC_Initialize_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Initialize(ctx, req.(*InitializeRequest)) @@ -314,7 +331,7 @@ func _ODC_Submit_Handler(srv interface{}, ctx context.Context, dec func(interfac } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Submit", + FullMethod: ODC_Submit_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Submit(ctx, req.(*SubmitRequest)) @@ -332,7 +349,7 @@ func _ODC_Activate_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Activate", + FullMethod: ODC_Activate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Activate(ctx, req.(*ActivateRequest)) @@ -350,7 +367,7 @@ func _ODC_Run_Handler(srv interface{}, ctx context.Context, dec func(interface{} } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Run", + FullMethod: ODC_Run_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Run(ctx, req.(*RunRequest)) @@ -368,7 +385,7 @@ func _ODC_Update_Handler(srv interface{}, ctx context.Context, dec func(interfac } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Update", + FullMethod: ODC_Update_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Update(ctx, req.(*UpdateRequest)) @@ -386,7 +403,7 @@ func _ODC_Configure_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Configure", + FullMethod: ODC_Configure_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Configure(ctx, req.(*ConfigureRequest)) @@ -404,7 +421,7 @@ func _ODC_SetProperties_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/SetProperties", + FullMethod: ODC_SetProperties_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).SetProperties(ctx, req.(*SetPropertiesRequest)) @@ -422,7 +439,7 @@ func _ODC_GetState_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/GetState", + FullMethod: ODC_GetState_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).GetState(ctx, req.(*StateRequest)) @@ -440,7 +457,7 @@ func _ODC_Start_Handler(srv interface{}, ctx context.Context, dec func(interface } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Start", + FullMethod: ODC_Start_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Start(ctx, req.(*StartRequest)) @@ -458,7 +475,7 @@ func _ODC_Stop_Handler(srv interface{}, ctx context.Context, dec func(interface{ } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Stop", + FullMethod: ODC_Stop_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Stop(ctx, req.(*StopRequest)) @@ -476,7 +493,7 @@ func _ODC_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Reset", + FullMethod: ODC_Reset_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Reset(ctx, req.(*ResetRequest)) @@ -494,7 +511,7 @@ func _ODC_Terminate_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Terminate", + FullMethod: ODC_Terminate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Terminate(ctx, req.(*TerminateRequest)) @@ -512,7 +529,7 @@ func _ODC_Shutdown_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Shutdown", + FullMethod: ODC_Shutdown_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Shutdown(ctx, req.(*ShutdownRequest)) @@ -530,7 +547,7 @@ func _ODC_Status_Handler(srv interface{}, ctx context.Context, dec func(interfac } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/odc.ODC/Status", + FullMethod: ODC_Status_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(ODCServer).Status(ctx, req.(*StatusRequest)) From f5f0e16f913ee947d9ccba04ce9f0ac2debeeb5f Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 5 May 2025 11:48:22 +0200 Subject: [PATCH 2131/2352] [build] bump to v1.34.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index cf5833447..64d0c5baf 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 33 +VERSION_MINOR := 34 VERSION_PATCH := 0 From df0673ad106851f59cdefff35d9defe04a56ec2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 5 May 2025 12:12:58 +0200 Subject: [PATCH 2132/2352] [odc] plumbing for expendable and rmsjobid in odcdevice --- core/integration/odc/plugin.go | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 502b57231..96d0102ab 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -110,12 +110,14 @@ type OdcPartitionInfo struct { } type OdcDevice struct { - TaskId string `json:"taskId"` - State string `json:"state"` - EcsState sm.State `json:"ecsState"` - Path string `json:"path"` - Ignored bool `json:"ignored"` - Host string `json:"host"` + TaskId string `json:"taskId"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + Path string `json:"path"` + Ignored bool `json:"ignored"` + Host string `json:"host"` + Expendable bool `json:"expendable"` + Rmsjobid string `json:"rmsjobid"` } type partitionStateChangedEventPayload struct { @@ -136,6 +138,8 @@ type deviceStateChangedEventPayload struct { Path string `json:"path"` Ignored bool `json:"ignored"` Host string `json:"host"` + Expendable bool `json:"expendable"` + Rmsjobid string `json:"rmsjobid"` } func NewPlugin(endpoint string) integration.Plugin { @@ -258,11 +262,13 @@ func (p *Plugin) queryPartitionStatus() { odcPartInfoSlice[idx].Devices = make(map[OdcDeviceId]*OdcDevice, len(odcPartStateRep.Devices)) for _, device := range odcPartStateRep.Devices { odcPartInfoSlice[idx].Devices[OdcDeviceId(device.Id)] = &OdcDevice{ - TaskId: strconv.FormatUint(device.Id, 10), - State: device.State, - Path: device.Path, - Ignored: device.Ignored, - Host: device.Host, + TaskId: strconv.FormatUint(device.Id, 10), + State: device.State, + Path: device.Path, + Ignored: device.Ignored, + Host: device.Host, + Expendable: device.Expendable, + Rmsjobid: device.Rmsjobid, } } }(i, id) @@ -317,6 +323,8 @@ func (p *Plugin) queryPartitionStatus() { Path: device.Path, Ignored: device.Ignored, Host: device.Host, + Expendable: device.Expendable, + Rmsjobid: device.Rmsjobid, } payloadJson, _ := json.Marshal(payload) From ba8c4c6acfb47db5621d7837264d4277e48d9a69 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 5 May 2025 12:24:55 +0200 Subject: [PATCH 2133/2352] [build] bump to v1.34.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 64d0c5baf..de0b01917 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 34 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From fd509fe73b9e1b7d1535c8c5e0783357daad80b3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 6 May 2025 13:41:47 +0200 Subject: [PATCH 2134/2352] [core] fix malformatted fill_info_fill_number passed to controlled tasks int32 to string() conversion takes the bytes literally, one should use strconv library instead. Fixes OCTRL-1014. --- core/integration/bookkeeping/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index aaa0ecfda..3096ae735 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1440,7 +1440,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Errorf("could not access the parent role when trying to propagate the LHC fill info") return } - parentRole.SetGlobalRuntimeVar("fill_info_fill_number", string(lhcInfo.FillNumber)) + parentRole.SetGlobalRuntimeVar("fill_info_fill_number", strconv.FormatInt(int64(lhcInfo.FillNumber), 10)) parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", lhcInfo.FillingSchemeName) parentRole.SetGlobalRuntimeVar("fill_info_beam_type", lhcInfo.BeamType) if lhcInfo.StableBeamsStart != nil { From 1f82f48bb4463cdc52ec70bc988908cd9a4c53d1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 6 May 2025 14:32:59 +0200 Subject: [PATCH 2135/2352] [build] bump to v1.34.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index de0b01917..2d5c22050 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 34 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From 1e21d6a7b327d7d61fb9abb56554013e90340fcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 2 May 2025 17:19:52 +0200 Subject: [PATCH 2136/2352] [core] OCTRL-1003 -aggregating metrics so we don't flod influxdb -changed json to influxdb line format to properly handle tags --- common/ecsmetrics/metric.go | 31 +- common/ecsmetrics/metrics.go | 31 +- common/ecsmetrics/metrics_test.go | 32 +- common/event/writer.go | 10 +- common/monitoring/metric.go | 128 ++++- common/monitoring/metricsaggregate.go | 89 +++ common/monitoring/metricsreservoirsampling.go | 106 ++++ common/monitoring/monitoring.go | 73 ++- common/monitoring/monitoring_test.go | 531 +++++++++++++++--- common/monitoring/reservoirsampling.go | 94 ++++ go.mod | 1 + go.sum | 16 + 12 files changed, 1024 insertions(+), 118 deletions(-) create mode 100644 common/monitoring/metricsaggregate.go create mode 100644 common/monitoring/metricsreservoirsampling.go create mode 100644 common/monitoring/reservoirsampling.go diff --git a/common/ecsmetrics/metric.go b/common/ecsmetrics/metric.go index a35af762b..334650044 100644 --- a/common/ecsmetrics/metric.go +++ b/common/ecsmetrics/metric.go @@ -1,3 +1,27 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package ecsmetrics import ( @@ -7,8 +31,7 @@ import ( ) func NewMetric(name string) monitoring.Metric { - timestamp := time.Now() - metric := monitoring.Metric{Name: name, Timestamp: timestamp.UnixMilli()} + metric := monitoring.NewMetric(name, time.Now()) metric.AddTag("subsystem", "ECS") return metric } @@ -18,13 +41,13 @@ func NewMetric(name string) monitoring.Metric { func TimerMS(metric *monitoring.Metric) func() { start := time.Now() return func() { - metric.AddValue("execution_time_ms", time.Since(start).Milliseconds()) + metric.SetFieldInt64("execution_time_ms", time.Since(start).Milliseconds()) } } func TimerNS(metric *monitoring.Metric) func() { start := time.Now() return func() { - metric.AddValue("execution_time_ns", time.Since(start).Nanoseconds()) + metric.SetFieldInt64("execution_time_ns", time.Since(start).Nanoseconds()) } } diff --git a/common/ecsmetrics/metrics.go b/common/ecsmetrics/metrics.go index 066fdf0d2..7e13122ca 100644 --- a/common/ecsmetrics/metrics.go +++ b/common/ecsmetrics/metrics.go @@ -1,3 +1,27 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package ecsmetrics import ( @@ -38,9 +62,9 @@ func gather() monitoring.Metric { for _, sample := range samples { switch sample.Value.Kind() { case internalmetrics.KindUint64: - metric.AddValue(sample.Name, sample.Value.Uint64()) + metric.SetFieldUInt64(sample.Name, sample.Value.Uint64()) case internalmetrics.KindFloat64: - metric.AddValue(sample.Name, sample.Value.Float64()) + metric.SetFieldFloat64(sample.Name, sample.Value.Float64()) case internalmetrics.KindFloat64Histogram: log.WithField("level", infologger.IL_Devel).Warningf("Error: Histogram is not supported yet for metric [%s]", sample.Name) continue @@ -64,7 +88,8 @@ func StartGolangMetrics(period time.Duration) { return default: log.Debug("sending golang metrics") - monitoring.Send(gather()) + metric := gather() + monitoring.Send(&metric) time.Sleep(period) } } diff --git a/common/ecsmetrics/metrics_test.go b/common/ecsmetrics/metrics_test.go index 4c46569c9..d28b8c0be 100644 --- a/common/ecsmetrics/metrics_test.go +++ b/common/ecsmetrics/metrics_test.go @@ -1,7 +1,30 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package ecsmetrics import ( - "fmt" "testing" "time" @@ -17,12 +40,11 @@ func measureFunc(metric *monitoring.Metric) { func TestSimpleStartStop(t *testing.T) { metric := NewMetric("test") measureFunc(&metric) - fmt.Println(metric.Values["execution_time_ms"]) - fmt.Println(metric.Values["execution_time_ns"]) - if metric.Values["execution_time_ms"].(int64) < 100 { + fields := metric.GetFields() + if fields["execution_time_ms"].(int64) < 100 { t.Error("wrong milliseconds") } - if metric.Values["execution_time_ns"].(int64) < 100000000 { + if fields["execution_time_ns"].(int64) < 100000000 { t.Error("wrong nanoseconds") } } diff --git a/common/event/writer.go b/common/event/writer.go index fb3fc516c..bf6acbc2f 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -105,7 +105,7 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { writer.writeFunction = func(messages []kafka.Message, metric *monitoring.Metric) { defer ecsmetrics.TimerNS(metric)() if err := writer.WriteMessages(context.Background(), messages...); err != nil { - metric.AddValue("messages_failed", len(messages)) + metric.SetFieldUInt64("messages_failed", uint64(len(messages))) log.Errorf("failed to write %d messages to kafka with error: %v", len(messages), err) } } @@ -145,12 +145,12 @@ func (w *KafkaWriter) writingLoop() { } metric := w.newMetric(KAFKAWRITER) - metric.AddValue("messages_sent", len(messagesToSend)) - metric.AddValue("messages_failed", 0) + metric.SetFieldUInt64("messages_sent", uint64(len(messagesToSend))) + metric.SetFieldUInt64("messages_failed", 0) w.writeFunction(messagesToSend, &metric) - monitoring.Send(metric) + monitoring.Send(&metric) } } } @@ -262,5 +262,5 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time w.toBatchMessagesChan <- message }() - monitoring.Send(metric) + monitoring.Send(&metric) } diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go index 891733233..b0b13371b 100644 --- a/common/monitoring/metric.go +++ b/common/monitoring/metric.go @@ -1,27 +1,127 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package monitoring +import ( + "fmt" + "io" + "time" + + lp "github.com/influxdata/line-protocol/v2/lineprotocol" +) + type ( - TagsType map[string]any - ValuesType map[string]any + Tag struct { + name string + value string + } + + TagsType []Tag + FieldsType map[string]any ) type Metric struct { - Name string `json:"name"` - Values ValuesType `json:"values"` - Tags TagsType `json:"tags,omitempty"` - Timestamp int64 `json:"timestamp"` + name string + fields FieldsType + tags TagsType + timestamp time.Time +} + +func NewMetric(name string, timestamp time.Time) Metric { + return Metric{ + name: name, timestamp: timestamp, + } +} + +func (metric *Metric) GetFields() (fields FieldsType) { + for fieldName, field := range metric.fields { + fields[fieldName] = field + } + return +} + +func (metric *Metric) AddTag(tagName string, value string) { + metric.tags = append(metric.tags, Tag{name: tagName, value: value}) } -func (metric *Metric) AddTag(tagName string, value any) { - if metric.Tags == nil { - metric.Tags = make(TagsType) +func (metric *Metric) setField(fieldName string, field any) { + if metric.fields == nil { + metric.fields = make(FieldsType) } - metric.Tags[tagName] = value + metric.fields[fieldName] = field } -func (metric *Metric) AddValue(valueName string, value any) { - if metric.Values == nil { - metric.Values = make(ValuesType) +func (metric *Metric) SetFieldInt64(fieldName string, field int64) { + metric.setField(fieldName, field) +} + +func (metric *Metric) SetFieldUInt64(fieldName string, field uint64) { + metric.setField(fieldName, field) +} + +func (metric *Metric) SetFieldFloat64(fieldName string, field float64) { + metric.setField(fieldName, field) +} + +func (metric *Metric) MergeFields(other *Metric) { + for fieldName, field := range other.fields { + if storedField, ok := metric.fields[fieldName]; ok { + switch v := field.(type) { + case int64: + metric.fields[fieldName] = v + storedField.(int64) + case uint64: + metric.fields[fieldName] = v + storedField.(uint64) + case float64: + metric.fields[fieldName] = v + storedField.(float64) + } + } else { + metric.fields[fieldName] = field + } + } +} + +func Format(writer io.Writer, metrics []Metric) error { + var enc lp.Encoder + + for _, metric := range metrics { + enc.StartLine(metric.name) + for _, tag := range metric.tags { + enc.AddTag(tag.name, tag.value) + } + + for fieldName, field := range metric.fields { + // we cannot panic as we provide accessors only for allowed type with AddField* + enc.AddField(fieldName, lp.MustNewValue(field)) + } + enc.EndLine(metric.timestamp) } - metric.Values[valueName] = value + + if err := enc.Err(); err != nil { + return err + } + + _, err := fmt.Fprintf(writer, "%s", enc.Bytes()) + return err } diff --git a/common/monitoring/metricsaggregate.go b/common/monitoring/metricsaggregate.go new file mode 100644 index 000000000..ee6d5ad78 --- /dev/null +++ b/common/monitoring/metricsaggregate.go @@ -0,0 +1,89 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package monitoring + +import ( + "hash/maphash" + "time" +) + +type key struct { + nameTagsHash uint64 + timestamp time.Time +} + +type bucketsType map[key]*Metric + +type MetricsAggregate struct { + hash maphash.Hash + metricsBuckets bucketsType +} + +func NewMetricsAggregate() *MetricsAggregate { + metrics := &MetricsAggregate{} + metrics.metricsBuckets = make(bucketsType) + return metrics +} + +func (this *MetricsAggregate) AddMetric(metric *Metric) { + metricNameTagsToHash(&this.hash, metric) + hashKey := hashValueAndReset(&this.hash) + + k := key{nameTagsHash: hashKey, timestamp: time.Unix(metric.timestamp.Unix(), 0)} + if storedMetric, ok := this.metricsBuckets[k]; ok { + storedMetric.MergeFields(metric) + } else { + this.metricsBuckets[k] = metric + } +} + +func metricNameTagsToHash(hash *maphash.Hash, metric *Metric) { + hash.WriteString(metric.name) + + for _, tag := range metric.tags { + hash.WriteString(tag.name) + hash.WriteString(tag.value) + } +} + +func hashValueAndReset(hash *maphash.Hash) uint64 { + hashValue := hash.Sum64() + hash.Reset() + return hashValue +} + +func (this *MetricsAggregate) Clear() { + this.hash.Reset() + clear(this.metricsBuckets) +} + +func (this *MetricsAggregate) GetMetrics() []Metric { + var result []Metric + for key, metric := range this.metricsBuckets { + metric.timestamp = key.timestamp + result = append(result, *metric) + } + return result +} diff --git a/common/monitoring/metricsreservoirsampling.go b/common/monitoring/metricsreservoirsampling.go new file mode 100644 index 000000000..7e436c582 --- /dev/null +++ b/common/monitoring/metricsreservoirsampling.go @@ -0,0 +1,106 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package monitoring + +import ( + "hash/maphash" + "time" +) + +type bucketsReservoirSampleType map[key]*metricReservoirSample + +var reservoirSize uint64 = 1000 + +type metricReservoirSample struct { + metric Metric + reservoir reservoirSampling +} + +type MetricsReservoirSampling struct { + hash maphash.Hash + metricsBuckets bucketsReservoirSampleType +} + +func NewMetricsReservoirSampling() *MetricsReservoirSampling { + metrics := &MetricsReservoirSampling{} + metrics.metricsBuckets = make(bucketsReservoirSampleType) + return metrics +} + +func metricFieldToFloat64(field any) float64 { + var asserted float64 + switch v := field.(type) { + case int64: + asserted = float64(v) + case uint64: + asserted = float64(v) + case float64: + asserted = v + } + return asserted +} + +func (this *MetricsReservoirSampling) AddMetric(metric *Metric) { + for fieldName, field := range metric.fields { + metricNameTagsToHash(&this.hash, metric) + this.hash.WriteString(fieldName) + k := key{nameTagsHash: hashValueAndReset(&this.hash), timestamp: time.Unix(metric.timestamp.Unix(), 0)} + if storedMetric, ok := this.metricsBuckets[k]; !ok { + newReservoir := newReservoirSampling(fieldName, reservoirSize) + newReservoir.AddPoint(metricFieldToFloat64(field)) + this.metricsBuckets[k] = &metricReservoirSample{metric: *metric, reservoir: newReservoir} + } else { + storedMetric.reservoir.AddPoint(metricFieldToFloat64(field)) + } + } +} + +func (this *MetricsReservoirSampling) Clear() { + this.hash.Reset() + clear(this.metricsBuckets) +} + +func (this *MetricsReservoirSampling) GetMetrics() []Metric { + var result []Metric + for key, reservoirMetric := range this.metricsBuckets { + m := Metric{name: reservoirMetric.metric.name, tags: reservoirMetric.metric.tags, timestamp: key.timestamp} + + mean, median, min, p10, p30, p70, p90, max, count, poolSize := reservoirMetric.reservoir.GetStats() + + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_mean", mean) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_median", median) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_min", min) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p10", p10) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p30", p30) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p70", p70) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p90", p90) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_max", max) + m.SetFieldUInt64(reservoirMetric.reservoir.name+"_count", count) + m.SetFieldUInt64(reservoirMetric.reservoir.name+"_poolsize", poolSize) + + result = append(result, m) + } + return result +} diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index e3ec257f6..82971d6de 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -1,20 +1,45 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package monitoring import ( "context" - "encoding/json" "fmt" "net/http" "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/sirupsen/logrus" ) var ( - server *http.Server - metricsLimit int = 1000000 - metrics []Metric + server *http.Server + metricsInternal *MetricsAggregate + metricsHistogramInternal *MetricsReservoirSampling + // metrics []Metric // channel that is used to request end of metrics server, it sends notification when server ended. // It needs to be read!!! endChannel chan struct{} @@ -22,13 +47,16 @@ var ( // channel used to send metrics into the event loop metricsChannel chan Metric + // channel used to send metrics meant to be proceesed as histogram into the event loop + metricsHistosChannel chan Metric + // channel for sending requests to reset actual metrics slice and send it back to caller via metricsExportedToRequest metricsRequestedChannel chan struct{} // channel used to send metrics to be reported by http request from event loop metricsExportedToRequest chan []Metric - log = logger.New(logrus.StandardLogger(), "metrics") + log = logger.New(logrus.StandardLogger(), "metrics").WithField("level", infologger.IL_Devel) ) func initChannels(messageBufferSize int) { @@ -36,9 +64,11 @@ func initChannels(messageBufferSize int) { metricsRequestedChannel = make(chan struct{}) // 100 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if // multiple goroutines want to send metrics without blocking each other - metricsChannel = make(chan Metric, 10000) + metricsChannel = make(chan Metric, 100000) + metricsHistosChannel = make(chan Metric, 100000) metricsExportedToRequest = make(chan []Metric) - metricsLimit = messageBufferSize + metricsInternal = NewMetricsAggregate() + metricsHistogramInternal = NewMetricsReservoirSampling() } func closeChannels() { @@ -59,14 +89,18 @@ func eventLoop() { for { select { case <-metricsRequestedChannel: - shallowCopyMetrics := metrics - metrics = make([]Metric, 0) - metricsExportedToRequest <- shallowCopyMetrics + aggregatedMetrics := metricsInternal.GetMetrics() + aggregatedMetrics = append(aggregatedMetrics, metricsHistogramInternal.GetMetrics()...) + metricsInternal.Clear() + metricsHistogramInternal.Clear() + + metricsExportedToRequest <- aggregatedMetrics case metric := <-metricsChannel: - if len(metrics) < metricsLimit { - metrics = append(metrics, metric) - } + metricsInternal.AddMetric(&metric) + + case metric := <-metricsHistosChannel: + metricsHistogramInternal.AddMetric(&metric) case <-endChannel: defer func() { @@ -84,12 +118,18 @@ func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { if metricsToConvert == nil { metricsToConvert = make([]Metric, 0) } - json.NewEncoder(w).Encode(metricsToConvert) + Format(w, metricsToConvert) +} + +func Send(metric *Metric) { + if IsRunning() { + metricsChannel <- *metric + } } -func Send(metric Metric) { +func SendHistogrammable(metric *Metric) { if IsRunning() { - metricsChannel <- metric + metricsHistosChannel <- *metric } } @@ -133,7 +173,6 @@ func Stop() { endChannel <- struct{}{} <-endChannel server = nil - metrics = nil } func IsRunning() bool { diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index 7b707c3e1..91501f8dd 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -1,9 +1,39 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + package monitoring import ( - "encoding/json" + "bytes" "fmt" + "io" + "math" + "math/rand" "net/http" + "os" + "runtime/pprof" + "strings" "testing" "time" ) @@ -26,10 +56,10 @@ func isRunningWithTimeout(t *testing.T, timeout time.Duration) { // block until either length of metrics is the same as \requiredMessages or timeout is triggered func hasNumberOfMetrics(t *testing.T, timeout time.Duration, requiredMessages int) { timeoutChan := time.After(timeout) - for len(metrics) != requiredMessages { + for len(metricsInternal.GetMetrics()) != requiredMessages { select { case <-timeoutChan: - t.Errorf("Timeout %v triggered when waiting for %v messages, got %v", timeout, requiredMessages, len(metrics)) + t.Errorf("Timeout %v triggered when waiting for %v messages, got %v", timeout, requiredMessages, len(metricsInternal.GetMetrics())) return default: @@ -69,19 +99,21 @@ func testFunction(t *testing.T, testToRun func(*testing.T)) { func TestSendingSingleMetric(t *testing.T) { testFunction(t, func(t *testing.T) { - metric := Metric{Name: "test"} + metric := &Metric{name: "test"} Send(metric) hasNumberOfMetrics(t, time.Second, 1) - if metrics[0].Name != "test" { - t.Errorf("Got wrong name %s in stored metric", metrics[0].Name) + aggregatedMetrics := metricsInternal.GetMetrics() + + if aggregatedMetrics[0].name != "test" { + t.Errorf("Got wrong name %s in stored metric", aggregatedMetrics[0].name) } }) } func TestExportingMetrics(t *testing.T) { testFunction(t, func(t *testing.T) { - metric := Metric{Name: "test"} + metric := &Metric{name: "test"} Send(metric) hasNumberOfMetrics(t, time.Second, 1) @@ -92,28 +124,8 @@ func TestExportingMetrics(t *testing.T) { t.Errorf("Got wrong amount of metrics %d, expected 1", len(metricsToExport)) } - if metricsToExport[0].Name != "test" { - t.Errorf("Got wrong name of metric %s, expected test", metricsToExport[0].Name) - } - }) -} - -func TestBufferLimit(t *testing.T) { - testFunction(t, func(t *testing.T) { - metricsLimit = 1 - metric := Metric{Name: "test"} - metric.Timestamp = 10 - metric.AddTag("tag1", 42) - metric.AddValue("value1", 11) - - Send(metric) - hasNumberOfMetrics(t, time.Second, 1) - - Send(metric) - time.Sleep(100 * time.Millisecond) - - if len(metrics) != 1 { - t.Errorf("Metrics length is %d, but should be 1 after sending second metric", len(metrics)) + if metricsToExport[0].name != "test" { + t.Errorf("Got wrong name of metric %s, expected test", metricsToExport[0].name) } }) } @@ -124,20 +136,24 @@ func TestHttpRun(t *testing.T) { isRunningWithTimeout(t, time.Second) - metric := Metric{Name: "test"} - metric.Timestamp = 10 - metric.AddTag("tag1", 42) - metric.AddValue("value1", 11) - Send(metric) + metric := Metric{name: "test"} + metric.timestamp = time.Unix(10, 0) + metric.AddTag("tag1", "42") + metric.SetFieldInt64("value1", 11) + Send(&metric) response, err := http.Get("http://localhost:9876/metrics") if err != nil { t.Fatalf("Failed to GET metrics at port 9876: %v", err) } - decoder := json.NewDecoder(response.Body) - var receivedMetrics []Metric - if err = decoder.Decode(&receivedMetrics); err != nil { - t.Fatalf("Failed to decoded Metric: %v", err) + message, err := io.ReadAll(response.Body) + if err != nil { + t.Errorf("Failed to read response Body: %v", err) + } + + receivedMetrics, err := parseMultipleLineProtocol(string(message)) + if err != nil { + t.Errorf("Failed to parse message: %v", string(message)) } receivedMetric := receivedMetrics[0] @@ -146,7 +162,7 @@ func TestHttpRun(t *testing.T) { t.Errorf("Got wrong name of metric %s, expected test", receivedMetric.Name) } - if receivedMetric.Timestamp != 10 { + if receivedMetric.Timestamp != time.Unix(10, 0).UnixNano() { t.Errorf("Got wrong timestamp of metric %d, expected 10", receivedMetric.Timestamp) } @@ -154,19 +170,411 @@ func TestHttpRun(t *testing.T) { t.Errorf("Got wrong number of tags %d, expected 1", len(receivedMetric.Tags)) } - if receivedMetric.Tags["tag1"].(float64) != 42 { - t.Error("Failed to retreive tags: tag1 with value 42") + if receivedMetric.Tags["tag1"] != "42" { + t.Errorf("Failed to retreive tags: tag1 with value 42, %+v", receivedMetric.Tags) } - if len(receivedMetric.Values) != 1 { - t.Errorf("Got wrong number of values %d, expected 1", len(receivedMetric.Values)) + if len(receivedMetric.Fields) != 1 { + t.Errorf("Got wrong number of values %d, expected 1", len(receivedMetric.Fields)) } - if receivedMetric.Values["value1"].(float64) != 11 { - t.Error("Failed to retreive tags: value1 with value 11") + if receivedMetric.Fields["value1"] != "11i" { + t.Errorf("Failed to retreive tags: value1 with value 11: %+v", receivedMetric.Fields) } } +func parseMultipleLineProtocol(input string) ([]struct { + Name string + Tags map[string]string + Fields map[string]string + Timestamp int64 +}, error, +) { + lines := strings.Split(strings.TrimSpace(input), "\n") + parsed := []struct { + Name string + Tags map[string]string + Fields map[string]string + Timestamp int64 + }{} + + for _, line := range lines { + parts := strings.SplitN(line, " ", 3) + if len(parts) < 3 { + return nil, fmt.Errorf("invalid line protocol format: %s", line) + } + + // Parse measurement and tags + nameTags := strings.Split(parts[0], ",") + name := nameTags[0] + tags := map[string]string{} + for _, tag := range nameTags[1:] { + kv := strings.SplitN(tag, "=", 2) + if len(kv) == 2 { + tags[kv[0]] = kv[1] + } + } + + // Parse fields (leave as raw string for comparison) + fields := map[string]string{} + for _, field := range strings.Split(parts[1], ",") { + kv := strings.SplitN(field, "=", 2) + if len(kv) == 2 { + fields[kv[0]] = kv[1] + } + } + + // Parse timestamp + var ts int64 + _, err := fmt.Sscanf(parts[2], "%d", &ts) + if err != nil { + return nil, fmt.Errorf("invalid timestamp in line: %s", line) + } + + parsed = append(parsed, struct { + Name string + Tags map[string]string + Fields map[string]string + Timestamp int64 + }{ + Name: name, + Tags: tags, + Fields: fields, + Timestamp: ts, + }) + } + + return parsed, nil +} + +func MapsEqual[K comparable, V comparable](a, b map[K]V) bool { + if len(a) != len(b) { + return false + } + for key, valueA := range a { + if valueB, ok := b[key]; !ok || valueA != valueB { + return false + } + } + return true +} + +func TestMetricsFormat(t *testing.T) { + metrics := []Metric{} + metric1 := Metric{name: "test"} + metric1.timestamp = time.Unix(10, 0) + metric1.AddTag("tag1", "42") + metric1.SetFieldInt64("int64", 1) + metric1.SetFieldUInt64("uint64", 2) + metric1.SetFieldFloat64("float64", 3) + + metrics = append(metrics, metric1) + + metric2 := Metric{name: "test1"} + metric2.timestamp = time.Unix(10, 0) + metric2.AddTag("tag1", "43") + metric2.SetFieldInt64("int64", 2) + metric2.SetFieldUInt64("uint64", 3) + metric2.SetFieldFloat64("float64", 4) + + metrics = append(metrics, metric2) + + buf := bytes.Buffer{} + + Format(&buf, metrics) + + metricsParsed, err := parseMultipleLineProtocol(buf.String()) + if err != nil { + t.Error(err) + } + + for idx, metricParsed := range metricsParsed { + metricOrig := metrics[idx] + + if metricParsed.Name != metricOrig.name { + t.Errorf("failed to compare %v and %v ", metricOrig, metricParsed) + } + // if !MapsEqual(metricParsed.Tags, metricOrig.Tags) { + // t.Errorf("failed to compare %v and %v ", metricOrig.Tags, metricParsed.Tags) + // } + // if !MapsEqual(metricParsed.Fields, metricOrig.Values) { + // t.Errorf("failed to compare %v and %v ", metricOrig.Tags, metricParsed.Tags) + // } + if metricParsed.Timestamp != metricOrig.timestamp.UnixNano() { + t.Errorf("failed to compare %v and %v ", metricOrig.timestamp.UnixNano(), metricParsed.Timestamp) + } + } +} + +// generate unix timestamp with given seconds and random amount of nsecs +func generateTimestamp(seconds int64, r *rand.Rand) time.Time { + return time.Unix(seconds, r.Int63n(999999999)) +} + +func TestMetricsObject(t *testing.T) { + r := rand.New(rand.NewSource(42)) + tags1 := TagsType{Tag{"tag1", "1"}, Tag{"tag2", "2"}} + metrics := NewMetricsAggregate() + for i := 0; i != 1000; i++ { + metrics.AddMetric(&Metric{name: "test", tags: tags1, fields: FieldsType{"val1": int64(1)}, timestamp: generateTimestamp(10, r)}) + metrics.AddMetric(&Metric{name: "test", tags: tags1, fields: FieldsType{"val1": int64(1)}, timestamp: generateTimestamp(11, r)}) + metrics.AddMetric(&Metric{name: "test", tags: tags1, fields: FieldsType{"val2": int64(1)}, timestamp: generateTimestamp(11, r)}) + } + + if len(metrics.metricsBuckets) != 2 { + t.Errorf("there is diffent number of buckets, wanted 2 got %d", len(metrics.metricsBuckets)) + } + + var aggregatedVal1 int64 + var aggregatedVal2 int64 + for key, metric := range metrics.metricsBuckets { + if key.timestamp != time.Unix(10, 0) && key.timestamp != time.Unix(11, 0) { + t.Errorf("expected bucket timestamp as 10 or 11, got %ds, %dns", key.timestamp.Unix(), key.timestamp.UnixNano()) + } + aggregatedVal1 += metric.fields["val1"].(int64) + if _, ok := metric.fields["val2"]; ok { + aggregatedVal2 += metric.fields["val2"].(int64) + } + } + + if aggregatedVal1 != 2000 { + t.Errorf("all values \"val1\" in buckets inside the object should have been aggregated to 2000, but got %d", aggregatedVal1) + } + + if aggregatedVal2 != 1000 { + t.Errorf("all values \"val2\" in buckets inside the object should have been aggregated to 1000, but got %d", aggregatedVal2) + } + + aggregatedMetrics := metrics.GetMetrics() + if len(metrics.metricsBuckets) != 2 { + t.Errorf("there should be only 2 metrics buckets, but the number is %d", len(metrics.metricsBuckets)) + } + + aggregatedVal1 = 0 + aggregatedVal2 = 0 + for _, metric := range aggregatedMetrics { + if metric.timestamp != time.Unix(10, 0) && metric.timestamp != time.Unix(11, 0) { + t.Errorf("expected aggregated metric timestamp as 10 or 11, got %ds, %dns", metric.timestamp.Unix(), metric.timestamp.UnixNano()) + } + aggregatedVal1 += metric.fields["val1"].(int64) + if _, ok := metric.fields["val2"]; ok { + aggregatedVal2 += metric.fields["val2"].(int64) + } + } + if aggregatedVal1 != 2000 { + t.Errorf("all values \"val1\" of aggregated metrics should have been aggregated to 2000, but got %d", aggregatedVal1) + } + + if aggregatedVal2 != 1000 { + t.Errorf("all values \"val2\" of aggregated metrics should have been aggregated to 1000, but got %d", aggregatedVal2) + } + + metrics.Clear() + aggregatedMetrics = metrics.GetMetrics() + if len(aggregatedMetrics) != 0 { + t.Errorf("metrics object should be empty after clearing, but we got some metrics: %+v", aggregatedMetrics) + } +} + +func TestApproximateHistogram(t *testing.T) { + histo := newReservoirSampling("test", 500) + for i := 0; i != 20; i++ { + histo.AddPoint(10) + } + + mean, median, min, p10, p30, p70, p90, max, count, poolSize := histo.GetStats() + + if count != 20 { + t.Errorf("wrong count before reset, expected 20, got %d", count) + } + + if poolSize != 20 { + t.Errorf("wrong poolSize, expected 20, got %d", poolSize) + } + + if mean != 10 || median != 10 || min != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || max != 10 { + t.Errorf("one of the values is not 10 when it should be 10, mean %v, median %v, 10p %v, 30p %v, 70p %v, 90p %v", mean, median, p10, p30, p70, p90) + } + + histo.Reset() + _, _, _, _, _, _, _, _, count, poolSize = histo.GetStats() + if count != 0 { + t.Errorf("wrong count before reset, expected 0, got %d", count) + } + + if poolSize != 0 { + t.Errorf("wrong poolSize, expected 0, got %d", poolSize) + } + + for i := 0; i != 2000; i++ { + histo.AddPoint(10) + } + + mean, median, min, p10, p30, p70, p90, max, count, poolSize = histo.GetStats() + + if count != 2000 { + t.Errorf("wrong count before reset, expected 2000, got %d", count) + } + + if poolSize != 500 { + t.Errorf("wrong poolSize, expected 500, got %d", poolSize) + } + + if mean != 10 || median != 10 || min != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || max != 10 { + t.Errorf("one of the values is not 10 when it should be 10, mean %v, median %v, 10p %v, 30p %v, 70p %v, 90p %v", mean, median, p10, p30, p70, p90) + } + + histo.Reset() + _, _, _, _, _, _, _, _, count, poolSize = histo.GetStats() + if count != 0 { + t.Errorf("wrong count before reset, expected 0, got %d", count) + } + + if poolSize != 0 { + t.Errorf("wrong poolSize, expected 0, got %d", poolSize) + } + + for i := 0; i != 10000; i++ { + histo.AddPoint((float64(rand.Int63n(100)))) + } + + mean, median, min, p10, p30, p70, p90, max, count, poolSize = histo.GetStats() + + if count != 10000 { + t.Errorf("wrong count before reset, expected 10000, got %d", count) + } + + if poolSize != 500 { + t.Errorf("wrong poolSize, expected 500, got %d", poolSize) + } + + if math.Abs(mean-50) > 5 { + t.Errorf("wrong mean value, expected 50+-5 got %v", mean) + } + + if math.Abs(float64(median-50)) > 5 { + t.Errorf("wrong median value, expected 50+-5 got %v", median) + } + + if float64(min) > 5 { + t.Errorf("wrong min value, expected 0+-5 got %v", min) + } + + if math.Abs(float64(p10-10)) > 5 { + t.Errorf("wrong 10p value, expected 10+-5 got %v", p10) + } + + if math.Abs(float64(p30-30)) > 5 { + t.Errorf("wrong 30p value, expected 30+-5 got %v", p30) + } + + if math.Abs(float64(p70-70)) > 5 { + t.Errorf("wrong 50p value, expected 70+-5 got %v", p70) + } + + if math.Abs(float64(p90-90)) > 5 { + t.Errorf("wrong 90p value, expected 90+-5 got %v", p90) + } + + if math.Abs(float64(max-100)) > 5 { + t.Errorf("wrong max value, expected 100+-5 got %v", max) + } +} + +func TestMetricsHistogramObject(t *testing.T) { + metricsHisto := NewMetricsReservoirSampling() + r := rand.New(rand.NewSource(42)) + tags1 := TagsType{Tag{"tag1", "1"}, Tag{"tag2", "2"}} + for i := 0; i != 2000; i++ { + metricsHisto.AddMetric(&Metric{name: "test", tags: tags1, fields: FieldsType{"val1": int64(r.Int31n(100)), "val2": int64(r.Int31n(100))}, timestamp: generateTimestamp(10, r)}) + metricsHisto.AddMetric(&Metric{name: "test", tags: tags1, fields: FieldsType{"val1": int64(r.Int31n(100)), "val2": int64(r.Int31n(100))}, timestamp: generateTimestamp(15, r)}) + } + metrics := metricsHisto.GetMetrics() + if len(metrics) != 4 { + t.Errorf("received wrong number of histogram metrics, expected 4, got %d", len(metrics)) + } + + for _, metric := range metrics { + for valueName, value := range metric.fields { + if strings.Contains(valueName, "mean") { + if math.Abs(value.(float64)-50) > 5 { + t.Errorf("wrong mean value, expected 50+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "median") { + if math.Abs(value.(float64)-50) > 5 { + t.Errorf("wrong median value, expected 50+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "p10") { + if math.Abs(value.(float64)-10) > 5 { + t.Errorf("wrong p10, expected 10+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "p30") { + if math.Abs(value.(float64)-30) > 5 { + t.Errorf("wrong p30, expected 30+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "p70") { + if math.Abs(value.(float64)-70) > 5 { + t.Errorf("wrong p70, expected 70+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "p90") { + if math.Abs(value.(float64)-90) > 5 { + t.Errorf("wrong p90, expected 90+-5 got %v", value.(float64)) + } + } + if strings.Contains(valueName, "count") { + if value.(uint64) != 2000 { + t.Errorf("wrong number of count, expected 2000 got %v", value.(uint64)) + } + } + if strings.Contains(valueName, "poolsize") { + if value.(uint64) != 1000 { + t.Errorf("wrong number of poolsize, expected 1000 got %v", value.(uint64)) + } + } + } + } + + metricsHisto.Clear() + if m := metricsHisto.GetMetrics(); len(m) != 0 { + t.Errorf("histogram metrics should be empty after clearing, but we got histogram metrics: %+v", m) + } +} + +func BenchmarkSimple(b *testing.B) { + cpuProfileFile, err := os.Create("cpu_profile.pprof") + if err != nil { + b.Fatalf("could not create CPU profile: %v", err) + } + defer cpuProfileFile.Close() + + pprof.StartCPUProfile(cpuProfileFile) + defer pprof.StopCPUProfile() + + metrics := NewMetricsAggregate() + + metricToAdd1Tag1Val := Metric{name: "metricToAdd1Tag1Val", tags: TagsType{Tag{"tag1", "tag1"}}, fields: FieldsType{"val1": int64(1)}, timestamp: time.Unix(10, 1111)} + metricToAdd2Tag2Val := Metric{name: "metricToAdd1Tag1Val", tags: TagsType{Tag{"tag1", "tag1"}, Tag{"tag2", "tag2"}}, fields: FieldsType{"val1": int64(1), "val2": int64(2)}, timestamp: time.Unix(10, 1223)} + metricToAdd3Tag3Val := Metric{name: "metricToAdd1Tag1Val", tags: TagsType{Tag{"tag1", "tag1"}, Tag{"tag2", "tag2"}, Tag{"tag3", "tag3"}}, fields: FieldsType{"val1": int64(10), "val2": int64(2), "val3": int64(3)}, timestamp: time.Unix(10, 2531)} + + for b.Loop() { + metrics.AddMetric(&metricToAdd1Tag1Val) + metrics.AddMetric(&metricToAdd2Tag2Val) + metrics.AddMetric(&metricToAdd3Tag3Val) + } + + heapProfileFile, err := os.Create("heap_profile.pprof") + if err != nil { + log.Fatalf("could not create heap profile: %v", err) + } + defer heapProfileFile.Close() + pprof.WriteHeapProfile(heapProfileFile) +} + // This benchmark cannot be run for too long as it will fill whole RAM even with // results: // goos: linux @@ -179,34 +587,17 @@ func TestHttpRun(t *testing.T) { // PASS // ok github.com/AliceO2Group/Control/common/monitoring 44.686s func BenchmarkSendingMetrics(b *testing.B) { - Run(12345, "/metrics", 100) - - // this goroutine keeps clearing results so RAM does not exhausted - go func() { - for { - select { - case <-endChannel: - endChannel <- struct{}{} - break - default: - if len(metrics) >= 10000000 { - metricsRequestedChannel <- struct{}{} - <-metricsExportedToRequest - } - } - time.Sleep(100 * time.Millisecond) - } - }() + go Run(12345, "/metrics", 100) defer Stop() - metric := Metric{Name: "testname", Timestamp: 12345} - metric.AddValue("value", 42) - metric.AddTag("tag", 40) + metric := Metric{name: "testname", timestamp: time.Unix(12345, 0)} + metric.SetFieldInt64("value1", 42) + metric.SetFieldInt64("value2", 42) + metric.AddTag("tag1", "40") + metric.AddTag("tag2", "40") - for i := 0; i < b.N; i++ { - Send(metric) + for b.Loop() { + Send(&metric) } - - fmt.Println("") } diff --git a/common/monitoring/reservoirsampling.go b/common/monitoring/reservoirsampling.go new file mode 100644 index 000000000..b954d7316 --- /dev/null +++ b/common/monitoring/reservoirsampling.go @@ -0,0 +1,94 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package monitoring + +import ( + "math/rand" + "sort" +) + +// Documentation how does the calculation of percentiles work +// https://en.wikipedia.org/wiki/Reservoir_sampling + +type reservoirSampling struct { + samples []float64 + samplesLimit uint64 + name string + countSinceReset uint64 +} + +func newReservoirSampling(name string, limit uint64) reservoirSampling { + return reservoirSampling{ + samples: make([]float64, 0, limit), + samplesLimit: limit, + name: name, + countSinceReset: 0, + } +} + +func (this *reservoirSampling) AddPoint(val float64) { + this.countSinceReset += 1 + if len(this.samples) < int(this.samplesLimit) { + this.samples = append(this.samples, val) + } else { + if j := rand.Int63n(int64(this.countSinceReset)); j < int64(len(this.samples)) { + this.samples[j] = val + } + } +} + +func (this *reservoirSampling) indexForPercentile(percentile int) int { + return int(float64(len(this.samples)) * 0.01 * float64(percentile)) +} + +func (this *reservoirSampling) Reset() { + this.samples = this.samples[:0] + this.countSinceReset = 0 +} + +func (this *reservoirSampling) GetStats() (mean float64, median float64, min float64, percentile10 float64, percentile30 float64, percentile70 float64, percentile90 float64, max float64, count uint64, poolSize uint64) { + sort.Slice(this.samples, func(i, j int) bool { return this.samples[i] < this.samples[j] }) + + samplesCount := len(this.samples) + if samplesCount == 0 { + return 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } + + var sum float64 + for _, val := range this.samples { + sum += float64(val) + } + + return sum / float64(samplesCount), + this.samples[this.indexForPercentile(50)], + this.samples[0], + this.samples[this.indexForPercentile(10)], + this.samples[this.indexForPercentile(30)], + this.samples[this.indexForPercentile(70)], + this.samples[this.indexForPercentile(90)], + this.samples[len(this.samples)-1], + this.countSinceReset, + uint64(len(this.samples)) +} diff --git a/go.mod b/go.mod index 3610a085b..7c605f97a 100644 --- a/go.mod +++ b/go.mod @@ -118,6 +118,7 @@ require ( github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/influxdata/line-protocol/v2 v2.2.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect diff --git a/go.sum b/go.sum index 0bae094a3..6dfc979df 100644 --- a/go.sum +++ b/go.sum @@ -48,6 +48,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= @@ -75,6 +76,9 @@ github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/flosch/pongo2/v6 v6.0.0 h1:lsGru8IAzHgIAw6H2m4PCyleO58I40ow6apih0WprMU= github.com/flosch/pongo2/v6 v6.0.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU= +github.com/frankban/quicktest v1.11.0/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= +github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= +github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= @@ -129,6 +133,8 @@ github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -197,6 +203,12 @@ github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= +github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= +github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= +github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= +github.com/influxdata/line-protocol/v2 v2.2.1 h1:EAPkqJ9Km4uAxtMRgUubJyqAr6zgWM0dznKMLRauQRE= +github.com/influxdata/line-protocol/v2 v2.2.1/go.mod h1:DmB3Cnh+3oxmG6LOBIxce4oaL4CPj3OmMPgvauXh+tM= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= @@ -223,6 +235,7 @@ github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ib github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -288,6 +301,7 @@ github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hz github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.1 h1:PT/lllxVVN0gzzSqSlHEmP8MJB4MY2U7STGxiouV4X8= github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= @@ -576,6 +590,7 @@ google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHh gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= @@ -590,6 +605,7 @@ gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= From c3464f819cc24018fc07ef23c99d279c151cbeef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 6 May 2025 18:04:24 +0200 Subject: [PATCH 2137/2352] [core] add docs for metrics --- common/ecsmetrics/metric.go | 53 ---- common/event/writer.go | 7 +- .../{ecsmetrics => golangmetrics}/metrics.go | 8 +- .../metrics_test.go => monitoring/common.go} | 34 +-- common/monitoring/metric.go | 16 +- common/monitoring/metricsaggregate.go | 20 -- common/monitoring/metricsreservoirsampling.go | 1 + common/monitoring/monitoring.go | 21 +- common/monitoring/monitoring_test.go | 39 +-- common/monitoring/timer.go | 19 ++ core/config.go | 2 - core/core.go | 10 +- docs/metrics.md | 246 ++++++++++++++++++ 13 files changed, 339 insertions(+), 137 deletions(-) delete mode 100644 common/ecsmetrics/metric.go rename common/{ecsmetrics => golangmetrics}/metrics.go (95%) rename common/{ecsmetrics/metrics_test.go => monitoring/common.go} (67%) create mode 100644 common/monitoring/timer.go create mode 100644 docs/metrics.md diff --git a/common/ecsmetrics/metric.go b/common/ecsmetrics/metric.go deleted file mode 100644 index 334650044..000000000 --- a/common/ecsmetrics/metric.go +++ /dev/null @@ -1,53 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2025 CERN and copyright holders of ALICE O². - * Author: Michal Tichak - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package ecsmetrics - -import ( - "time" - - "github.com/AliceO2Group/Control/common/monitoring" -) - -func NewMetric(name string) monitoring.Metric { - metric := monitoring.NewMetric(name, time.Now()) - metric.AddTag("subsystem", "ECS") - return metric -} - -// Timer* functions are meant to be used with defer statement to measure runtime of given function: -// defer TimerNS(&metric)() -func TimerMS(metric *monitoring.Metric) func() { - start := time.Now() - return func() { - metric.SetFieldInt64("execution_time_ms", time.Since(start).Milliseconds()) - } -} - -func TimerNS(metric *monitoring.Metric) func() { - start := time.Now() - return func() { - metric.SetFieldInt64("execution_time_ns", time.Since(start).Nanoseconds()) - } -} diff --git a/common/event/writer.go b/common/event/writer.go index bf6acbc2f..64f9a98fc 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -30,7 +30,6 @@ import ( "sync" "time" - "github.com/AliceO2Group/Control/common/ecsmetrics" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -83,7 +82,7 @@ type KafkaWriter struct { } func (w *KafkaWriter) newMetric(name string) monitoring.Metric { - metric := ecsmetrics.NewMetric(name) + metric := monitoring.NewMetric(name) metric.AddTag("topic", w.Topic) return metric } @@ -103,7 +102,7 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { } writer.writeFunction = func(messages []kafka.Message, metric *monitoring.Metric) { - defer ecsmetrics.TimerNS(metric)() + defer monitoring.TimerNS(metric)() if err := writer.WriteMessages(context.Background(), messages...); err != nil { metric.SetFieldUInt64("messages_failed", uint64(len(messages))) log.Errorf("failed to write %d messages to kafka with error: %v", len(messages), err) @@ -243,7 +242,7 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time metric := w.newMetric(KAFKAPREPARE) func() { - defer ecsmetrics.TimerNS(&metric)() + defer monitoring.TimerNS(&metric)() wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) if err != nil { log.WithField("event", e). diff --git a/common/ecsmetrics/metrics.go b/common/golangmetrics/metrics.go similarity index 95% rename from common/ecsmetrics/metrics.go rename to common/golangmetrics/metrics.go index 7e13122ca..f1bcfabed 100644 --- a/common/ecsmetrics/metrics.go +++ b/common/golangmetrics/metrics.go @@ -22,7 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package ecsmetrics +package golangmetrics import ( internalmetrics "runtime/metrics" @@ -57,7 +57,7 @@ func gather() monitoring.Metric { internalmetrics.Read(samples) - metric := NewMetric("golangruntimemetrics") + metric := monitoring.NewMetric("golangruntimemetrics") for _, sample := range samples { switch sample.Value.Kind() { @@ -76,7 +76,7 @@ func gather() monitoring.Metric { return metric } -func StartGolangMetrics(period time.Duration) { +func Start(period time.Duration) { log.WithField("level", infologger.IL_Devel).Info("Starting golang metrics reporting") go func() { log.Debug("Starting golang metrics goroutine") @@ -96,7 +96,7 @@ func StartGolangMetrics(period time.Duration) { }() } -func StopGolangMetrics() { +func Stop() { endRequestChannel <- struct{}{} <-endRequestChannel } diff --git a/common/ecsmetrics/metrics_test.go b/common/monitoring/common.go similarity index 67% rename from common/ecsmetrics/metrics_test.go rename to common/monitoring/common.go index d28b8c0be..9f21f8567 100644 --- a/common/ecsmetrics/metrics_test.go +++ b/common/monitoring/common.go @@ -22,29 +22,29 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ -package ecsmetrics +package monitoring import ( - "testing" + "hash/maphash" "time" - - "github.com/AliceO2Group/Control/common/monitoring" ) -func measureFunc(metric *monitoring.Metric) { - defer TimerMS(metric)() - defer TimerNS(metric)() - time.Sleep(100 * time.Millisecond) +type key struct { + nameTagsHash uint64 + timestamp time.Time } -func TestSimpleStartStop(t *testing.T) { - metric := NewMetric("test") - measureFunc(&metric) - fields := metric.GetFields() - if fields["execution_time_ms"].(int64) < 100 { - t.Error("wrong milliseconds") - } - if fields["execution_time_ns"].(int64) < 100000000 { - t.Error("wrong nanoseconds") +func metricNameTagsToHash(hash *maphash.Hash, metric *Metric) { + hash.WriteString(metric.name) + + for _, tag := range metric.tags { + hash.WriteString(tag.name) + hash.WriteString(tag.value) } } + +func hashValueAndReset(hash *maphash.Hash) uint64 { + hashValue := hash.Sum64() + hash.Reset() + return hashValue +} diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go index b0b13371b..0bb26fa39 100644 --- a/common/monitoring/metric.go +++ b/common/monitoring/metric.go @@ -49,17 +49,21 @@ type Metric struct { timestamp time.Time } -func NewMetric(name string, timestamp time.Time) Metric { +// Return empty metric, it is used right now mostly in string +// to report metrics correctly to influxdb use NewECSMetric +func NewDefaultMetric(name string, timestamp time.Time) Metric { return Metric{ name: name, timestamp: timestamp, } } -func (metric *Metric) GetFields() (fields FieldsType) { - for fieldName, field := range metric.fields { - fields[fieldName] = field - } - return +// creates empty metric with tag subsystem=ECS, which +// is used by Telegraf to send metrics from ECS to correct +// bucket +func NewMetric(name string) Metric { + metric := NewDefaultMetric(name, time.Now()) + metric.AddTag("subsystem", "ECS") + return metric } func (metric *Metric) AddTag(tagName string, value string) { diff --git a/common/monitoring/metricsaggregate.go b/common/monitoring/metricsaggregate.go index ee6d5ad78..7292db761 100644 --- a/common/monitoring/metricsaggregate.go +++ b/common/monitoring/metricsaggregate.go @@ -29,11 +29,6 @@ import ( "time" ) -type key struct { - nameTagsHash uint64 - timestamp time.Time -} - type bucketsType map[key]*Metric type MetricsAggregate struct { @@ -59,21 +54,6 @@ func (this *MetricsAggregate) AddMetric(metric *Metric) { } } -func metricNameTagsToHash(hash *maphash.Hash, metric *Metric) { - hash.WriteString(metric.name) - - for _, tag := range metric.tags { - hash.WriteString(tag.name) - hash.WriteString(tag.value) - } -} - -func hashValueAndReset(hash *maphash.Hash) uint64 { - hashValue := hash.Sum64() - hash.Reset() - return hashValue -} - func (this *MetricsAggregate) Clear() { this.hash.Reset() clear(this.metricsBuckets) diff --git a/common/monitoring/metricsreservoirsampling.go b/common/monitoring/metricsreservoirsampling.go index 7e436c582..1e5cbe4df 100644 --- a/common/monitoring/metricsreservoirsampling.go +++ b/common/monitoring/metricsreservoirsampling.go @@ -46,6 +46,7 @@ type MetricsReservoirSampling struct { func NewMetricsReservoirSampling() *MetricsReservoirSampling { metrics := &MetricsReservoirSampling{} metrics.metricsBuckets = make(bucketsReservoirSampleType) + metrics.hash.SetSeed(maphash.MakeSeed()) return metrics } diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 82971d6de..54b48b1c6 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -36,10 +36,11 @@ import ( ) var ( - server *http.Server + // scraping endpoint implementation + server *http.Server + // objects to store incoming metrics metricsInternal *MetricsAggregate metricsHistogramInternal *MetricsReservoirSampling - // metrics []Metric // channel that is used to request end of metrics server, it sends notification when server ended. // It needs to be read!!! endChannel chan struct{} @@ -59,7 +60,7 @@ var ( log = logger.New(logrus.StandardLogger(), "metrics").WithField("level", infologger.IL_Devel) ) -func initChannels(messageBufferSize int) { +func initChannels() { endChannel = make(chan struct{}) metricsRequestedChannel = make(chan struct{}) // 100 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if @@ -79,11 +80,12 @@ func closeChannels() { } // this eventLoop is the main part that processes all metrics send to the package -// 3 events can happen: +// 4 events can happen: // 1. metricsChannel receives message from Send() method. We just add the new metric to metrics slice -// 2. metricsRequestChannel receives request to dump and request existing metrics. We send shallow copy of existing +// 2. metricsHistosChannel receives message from Send() method. We just add the new metric to metrics slice +// 3. metricsRequestChannel receives request to dump and request existing metrics. We send shallow copy of existing // metrics to requestor (via metricsExportedToRequest channel) while resetting current metrics slice -// 3. receive request to stop monitoring via endChannel. We send confirmation through endChannel to notify caller +// 4. receive request to stop monitoring via endChannel. We send confirmation through endChannel to notify caller // that eventLoop stopped func eventLoop() { for { @@ -112,7 +114,7 @@ func eventLoop() { } func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { - w.Header().Set("Content-Type", "application/json") + w.Header().Set("Content-Type", "text/plain") metricsRequestedChannel <- struct{}{} metricsToConvert := <-metricsExportedToRequest if metricsToConvert == nil { @@ -144,15 +146,14 @@ func handleFunc(endpointName string) { // \param port port where the scraping endpoint will be created // \param endpointName name of the endpoint, which must start with a slash eg. "/internalmetrics" -// \param messageBufferSize size of buffer for messages where messages are kept between scraping request. // // If we attempt send more messages than the size of the buffer, these overflowing messages will be ignored and warning will be logged. -func Run(port uint16, endpointName string, messageBufferSize int) error { +func Run(port uint16, endpointName string) error { if IsRunning() { return nil } - initChannels(messageBufferSize) + initChannels() go eventLoop() diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index 91501f8dd..ef43cbf9c 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -69,13 +69,13 @@ func hasNumberOfMetrics(t *testing.T, timeout time.Duration, requiredMessages in } func TestSimpleStartStop(t *testing.T) { - go Run(1234, "/random", 100) + go Run(1234, "/random") isRunningWithTimeout(t, time.Second) Stop() } func TestStartMultipleStop(t *testing.T) { - go Run(1234, "/random", 100) + go Run(1234, "/random") isRunningWithTimeout(t, time.Second) Stop() Stop() @@ -86,7 +86,7 @@ func cleaningUpAfterTest() { } func initTest() { - go Run(12345, "notimportant", 100) + go Run(12345, "notimportant") } // decorator function that properly inits and cleans after higher level test of Monitoring package @@ -131,7 +131,7 @@ func TestExportingMetrics(t *testing.T) { } func TestHttpRun(t *testing.T) { - go Run(9876, "/metrics", 10) + go Run(9876, "/metrics") defer Stop() isRunningWithTimeout(t, time.Second) @@ -545,6 +545,24 @@ func TestMetricsHistogramObject(t *testing.T) { } } +func measureFunc(metric *Metric) { + defer TimerMS(metric)() + defer TimerNS(metric)() + time.Sleep(100 * time.Millisecond) +} + +func TestTimers(t *testing.T) { + metric := NewMetric("test") + measureFunc(&metric) + fields := metric.fields + if fields["execution_time_ms"].(int64) < 100 { + t.Error("wrong milliseconds") + } + if fields["execution_time_ns"].(int64) < 100000000 { + t.Error("wrong nanoseconds") + } +} + func BenchmarkSimple(b *testing.B) { cpuProfileFile, err := os.Create("cpu_profile.pprof") if err != nil { @@ -575,19 +593,8 @@ func BenchmarkSimple(b *testing.B) { pprof.WriteHeapProfile(heapProfileFile) } -// This benchmark cannot be run for too long as it will fill whole RAM even with -// results: -// goos: linux -// goarch: amd64 -// pkg: github.com/AliceO2Group/Control/common/monitoring -// cpu: 11th Gen Intel(R) Core(TM) i9-11900H @ 2.50GHz -// BenchmarkSendingMetrics-16 -// -// 123365481 192.6 ns/op -// PASS -// ok github.com/AliceO2Group/Control/common/monitoring 44.686s func BenchmarkSendingMetrics(b *testing.B) { - go Run(12345, "/metrics", 100) + go Run(12345, "/metrics") defer Stop() diff --git a/common/monitoring/timer.go b/common/monitoring/timer.go new file mode 100644 index 000000000..722839a74 --- /dev/null +++ b/common/monitoring/timer.go @@ -0,0 +1,19 @@ +package monitoring + +import "time" + +// Timer* functions are meant to be used with defer statement to measure runtime of given function: +// defer TimerNS(&metric)() +func TimerMS(metric *Metric) func() { + start := time.Now() + return func() { + metric.SetFieldInt64("execution_time_ms", time.Since(start).Milliseconds()) + } +} + +func TimerNS(metric *Metric) func() { + start := time.Now() + return func() { + metric.SetFieldInt64("execution_time_ns", time.Since(start).Nanoseconds()) + } +} diff --git a/core/config.go b/core/config.go index 9d7513f78..0f64cbac9 100644 --- a/core/config.go +++ b/core/config.go @@ -129,7 +129,6 @@ func setDefaults() error { viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) viper.SetDefault("metricsEndpoint", "8088/ecsmetrics") - viper.SetDefault("metricsBufferSize", 1000000) return nil } @@ -201,7 +200,6 @@ func setFlags() error { pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") pflag.Bool("logAllIL", viper.GetBool("logAllIL"), "Send all the logs into IL, including Debug and Trace messages") pflag.String("metricsEndpoint", viper.GetString("metricsEndpoint"), "Http endpoint from which metrics can be scraped: [port/endpoint]") - pflag.Int("metricsBufferSize", viper.GetInt("metricsBufferSize"), "Limit for how many metrics can be stored in buffer in between scraping requests") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/core.go b/core/core.go index ade418040..d6a2cebf2 100644 --- a/core/core.go +++ b/core/core.go @@ -35,8 +35,8 @@ import ( "syscall" "time" - "github.com/AliceO2Group/Control/common/ecsmetrics" "github.com/AliceO2Group/Control/common/event/topic" + "github.com/AliceO2Group/Control/common/golangmetrics" "github.com/AliceO2Group/Control/common/logger/infologger" "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" @@ -82,13 +82,13 @@ func runMetrics() { go func() { log.Infof("Starting to listen on endpoint %s:%d for metrics", endpoint, port) - if err := monitoring.Run(port, fmt.Sprintf("/%s", endpoint), viper.GetInt("metricsBufferSize")); err != nil && err != http.ErrServerClosed { - ecsmetrics.StopGolangMetrics() + if err := monitoring.Run(port, fmt.Sprintf("/%s", endpoint)); err != nil && err != http.ErrServerClosed { + golangmetrics.Stop() log.Errorf("failed to run metrics on port %d and endpoint: %s") } }() - ecsmetrics.StartGolangMetrics(10 * time.Second) + golangmetrics.Start(10 * time.Second) } // Run is the entry point for this scheduler. @@ -144,7 +144,7 @@ func Run() error { // Plugins need to start after taskman is running, because taskman provides the FID integration.PluginsInstance().InitAll(state.taskman.GetFrameworkID()) runMetrics() - defer ecsmetrics.StopGolangMetrics() + defer golangmetrics.Stop() defer monitoring.Stop() log.WithField("level", infologger.IL_Devel).Infof("Everything initiated and listening on control port: %d", viper.GetInt("controlPort")) diff --git a/docs/metrics.md b/docs/metrics.md new file mode 100644 index 000000000..a925513f3 --- /dev/null +++ b/docs/metrics.md @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + +# Metrics in ECS + +## Overview and simple usage + +ECS core implements metrics in folder common/monitoring. Metrics stack in ALICE +experiment is based on influxdb and Telegraf, where Telegraf scrapes metrics +from given http endpoint in arbitrary format and sends it into the influxdb database +instance. In order to expose endpoint with metrics we can set cli parameter `metricsEndpoint`, +which is in format `[port]/[endpoint]` (default: `8088/ecsmetrics`). +After running core with given parameter we can scrape this endpoint with eg. curl: + +``` +curl http://127.0.0.1:8088/ecsmetrics +``` + +Result of this command is for example: + +``` +kafka,subsystem=ECS,topic=aliecs.run send_bytes=1638400u,sent_messages=42u 1746457955000000000 +``` + +This format is called [influx line protocol](https://docs.influxdata.com/influxdb/cloud/reference/syntax/line-protocol/). +We will use this example to introduce influxdb metrics format. Every line is +one metric and every metric is composed from multiple parts separated by commas +and spaces: + +1) name of measurement - (required) string on the beginning of the line (`golangruntimemetrics`) +2) comma +3) tags - (optional) key-value list separated by commas. `subsystem=ECS,topic=aliecs.run` is +the example of key-value list, where subsystem and topic are the keys, +ECS and aliecs.run are values. +4) space - divides measurement and tags from the fields holding measurement data +5) fields - (required) actual values in same format as tags. We support +`int64`, `uint64` and `float64` values (`/sched/goroutines:goroutines=42u`) +6) space - divides fields and timestamp +7) timestamp - (optional) int64 value of unix timestamp in ns + +In order to provide support for this format we introduced Metric structure in [common/monitoring/metric.go](../common/monitoring/metric.go). +Following code shows how to create a Metric with `measurement` as measurement name, +one tag `tag1=val1` and field `field1=42u`: + +```go +m := monitoring.NewMetric("measurement", time.Now()) +m.AddTag("tag1", "val1") +m.SetFieldUInt64("field1", 42) +``` + +However we also need to be able to store metrics, so these can be scraped correctly. +This mechanism is implemented in [common/monitoring/monitoring.go](../common/monitoring/monitoring.go). +Metrics endpoint is run by calling `Run(port, endpointName)`. As this method is blocking +it is advised to call it from `goroutine`. After this method is called we can than send +metrics via methods `Send` and `SendHistogrammable`. If you want to send simple metrics +(eg. counter of messages sent) you are advised to use simple `Send`. However, if you are +interested into having percentiles reported from metrics you should use +`SendHistogrammable`. + +```go +go monigoring.Run(8088, "/metrics") +m := monitoring.NewMetric("measurement", time.Now()) +m.AddTag("tag1", "val1") +m.SetFieldUInt64("field1", 42) +monigoring.Send(&m) +monigoring.SendHistogrammable(&m) +monigoring.Stop() +``` + +Example for this use-case is duration of some function, +eg. measure sending batch of messages. If we want the best coverage of metrics possible +we can combine both of these to measure amount of messages send per batch and +also measurement duration of the send. For example in code you can take a look actual +actual code in [writer.go](../common/event/writer.go) where we are sending multiple +fields per metric and demonstrate full potential of these metrics. + +Previous code example will result in following metrics to be reported: + +``` +measurement,tag1=val1 field1=1 [timestamp] +measurement,tag1=val1 field1_mean=1,field1_median=1,field1_min=1,field1_p10=1,field1_p30=1,field1_p70=1,field1_p90=1,field1_max=1,field1_count=1,field1_poolsize=1 [timestamp] +``` + +In following text we will talk about aggregating over time interval +which is always 1 second. + +First metric is self explanatory, but we can see that Histogrammable metric +reports multiple percentiles, mean, min and max. These values can be the same if +we don't receive send values during 1 second. Moreover it reports `count` +and `poolsize`, where `count` describes number of times this metric was sent +and `poolsize` is internal metric, which will be described later. + +## Types and aggregation of metrics + +### Metric types + +We mentioned in previous part that there are two ways how to send metrics in ECS +resulting in two different outcomes, based on these outcomes we talk about two +metric types: + +1) Counter - `Send` +2) Histogrammable - `SendHistogrammable` + +Creation of both metrics is done by `NewMetric(measurement, timestamp)`, +so both use same object `Metric`. The distinction is done by Send methods: +`Send` and `SendHistogrammable`. + +Simple `Send(*Metric)`is used to just store metric with given tags and fields without +creating any other information. This metric is just aggregated +(more about it later). + +Sending metric through `SendHistogrammable(*Metric)` +will result in metric being added into the collection of metrics with same +measurement and tags. This collection is used to compute percentiles +(10, 30, 50, 70, 90), min, max and count (count of elements added into +the collection since last reset). These values are reported as fields +by appending strings to the name of original field: + +| Meaning | Appended field | +| --------|-------------| +| 10-percentile | field_10p | +| 30-percentile | field_30p | +| 70-percentile | field_70p | +| 90-percentile | field_90p | +| median (50-percentile) | field_median | +| mean | field_mean | +| min | field_min | +| max | field_max | +| count | field_count | + +### Aggregation + +To reduce network bandwidth and RAM usage, we aggregate all metrics. +This is done by grouping them into one-second intervals based on: + +- Timestamps rounded down to the nearest second +- Measurement name +- Tags + +This aggregation method applies to all metric types. + +If multiple metrics share the same measurement name and tags but have timestamps +less than one second apart, they will be grouped into a single bucket, using the +timestamp rounded down to the nearest second. + +However, if the measurement name or tags even slightly differ the metrics +will not be grouped and will remain separate. Also, if a metric is missing +a tag present in the others, it won't be aggregated with them. + +``` +notaggregated,tag1=val1 fields1=1i 1000000123 +aggregated,tag1=val1 fields1=1i 1000000001 +aggregated,tag1=val1 fields1=1i 1000000021 +aggregated,tag1=val1 fields1=1i,fields2=1i 1000000021 +aggregated,tag1=val1,tag2=val2 fields1=1i 1000030021 +aggregated,tag1=val1 fields1=2i 2000000021 +``` + +If all of these metrics are send and thus aggregated we will result in following: + +``` +notaggregated,tag1=val1 fields1=1i 1000000000 +aggregated,tag1=val1 fields1=3i,fields2=1i 1000000000 +aggregated,tag1=val1,tag2=val2 fields1=1i 1000000000 +aggregated,tag1=val1 fields1=2i 2000000000 +``` + +Explanation: + +- `notaggregated` is unique measurement. +- `aggregated` with one tag will have value of `fields1` equal to 3 +as three metrics fell into the same timestamp bucket and `fields2` was aggregated into the same metric +as tags and measurement were the same. +- `aggregated` with either multiple tags or timestamp which is over 2s +cannot be aggregated anywhere and are held as unique values. + +The same would happen Histogrammables, except that the aggregation would not be addition +if different points, but creating statistical report as mentioned in previous part. + +## Implementation details + +### Event loop + +In order to send metrics from unlimited amount of goroutines, we need to have +robust and thread-safe mechanism. It is implemented in [common/monitoring/monitoring.go](../common/monitoring/monitoring.go) +as event loop (`eventLoop`) that reads data from two buffered channels (`metricsChannel` and `metricsHistosChannel`) +with one goroutine. Apart from reading messages from these two channels event loop also handles +scraping requests from `http.Server` endpoint. As the http endpoint is called by a +different goroutine than the one processing event loop, we use another two channels: +`metricsRequestedChannel` which is used by the endpoint to request current metrics. +Transformed metrics are sent via `metricsExportedToRequest` back to the endpoint. + +Methods `Send` and `SendHistogrammable` write to the corresponding channels, +which are consumed by event loop. + +### Hashing to aggregate + +In order to correctly implement behaviour described in the part about Aggregation +we use the same implementation in two container aggregating objects +`MetricsAggregate`, `MetricsReservoirSampling` implemented in files +[common/monitoring/metricsaggregate.go](../common/monitoring/metricsaggregate.go) +and [metricsreservoirsampling.go](../common/monitoring/metricsreservoirsampling.go) +in the same directory. The implementation is done as different buckets +in map with distinct keys (`metricsBuckets`). These keys need to be unique +according to the timestamp and tags. We use struct `key` composed +from `time.Time` and `maphash.Hash`. Hash was chosen so we don't have +to compare arbitrary amount of tags, where keys and it's values +must be compared piece by piece. If we are inserting new bucket into `metricsBuckets` +we create new key by rounding down timestamp `time.Unix(metric.timestamp.Unix(), 0)` +and hashing all tags and their values. This will result to unique buckets +distinguished by timestamp and tags collection. + +However there is a potential problem: +We are storing tags as unsorted slice in `Metric`, so it is possible to create +two metrics with same tags, but in different order. These will result +in different hashes as maphash is order-dependent. + +### Sampling reservoir + +We are computing percentiles from all metrics sent via `SendHistogrammable` +method, but we are computing these from streaming data with unknown +limits, so we cannot easily create histogram. However there exist simple +solution called sampling reservoir and is discussed in [this wiki article](https://en.wikipedia.org/wiki/Reservoir_sampling). +It uses easy principle where every value from streaming data must have +the same probability of staying inside fixed buffer called reservoir. From 7a1243bc5650c092f1bf519f85e9f96bbf21e312 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 5 May 2025 15:12:46 +0200 Subject: [PATCH 2138/2352] [build] remove walnut Closes OCTRL-934. --- Makefile | 7 +- cmd/walnut/main.go | 32 -- docs/building.md | 5 +- walnut/README.md | 75 ---- walnut/app/constants.go | 31 -- walnut/cmd/about.go | 83 ----- walnut/cmd/check.go | 75 ---- walnut/cmd/convert.go | 245 ------------- walnut/cmd/root.go | 100 ------ walnut/converter/converter.go | 225 ------------ walnut/converter/converter_test.go | 115 ------ walnut/converter/dump.json | 390 --------------------- walnut/converter/dump.yaml | 83 ----- walnut/converter/importer.go | 78 ----- walnut/converter/importer_test.go | 44 --- walnut/converter/small.yaml | 43 --- walnut/converter/testvalues.go | 248 ------------- walnut/doc/generate.go | 43 --- walnut/doc/walnut.md | 24 -- walnut/doc/walnut_about.md | 29 -- walnut/doc/walnut_check.md | 34 -- walnut/doc/walnut_convert.md | 31 -- walnut/includeschemata.go | 65 ---- walnut/schemata/Task.json | 186 ---------- walnut/schemata/Workflow.json | 248 ------------- walnut/schemata/includeschemata.go | 61 ---- walnut/schemata/includeschemata_test.go | 33 -- walnut/schemata/schemata.go | 442 ------------------------ walnut/schemata/task_test.yaml | 24 -- walnut/schemata/validate.go | 72 ---- walnut/schemata/validate_test.go | 48 --- walnut/schemata/workflow_test.yaml | 24 -- 32 files changed, 5 insertions(+), 3238 deletions(-) delete mode 100644 cmd/walnut/main.go delete mode 100644 walnut/README.md delete mode 100644 walnut/app/constants.go delete mode 100644 walnut/cmd/about.go delete mode 100644 walnut/cmd/check.go delete mode 100644 walnut/cmd/convert.go delete mode 100644 walnut/cmd/root.go delete mode 100644 walnut/converter/converter.go delete mode 100644 walnut/converter/converter_test.go delete mode 100644 walnut/converter/dump.json delete mode 100644 walnut/converter/dump.yaml delete mode 100644 walnut/converter/importer.go delete mode 100644 walnut/converter/importer_test.go delete mode 100644 walnut/converter/small.yaml delete mode 100644 walnut/converter/testvalues.go delete mode 100644 walnut/doc/generate.go delete mode 100644 walnut/doc/walnut.md delete mode 100644 walnut/doc/walnut_about.md delete mode 100644 walnut/doc/walnut_check.md delete mode 100644 walnut/doc/walnut_convert.md delete mode 100644 walnut/includeschemata.go delete mode 100644 walnut/schemata/Task.json delete mode 100644 walnut/schemata/Workflow.json delete mode 100644 walnut/schemata/includeschemata.go delete mode 100644 walnut/schemata/includeschemata_test.go delete mode 100644 walnut/schemata/schemata.go delete mode 100644 walnut/schemata/task_test.yaml delete mode 100644 walnut/schemata/validate.go delete mode 100644 walnut/schemata/validate_test.go delete mode 100644 walnut/schemata/workflow_test.yaml diff --git a/Makefile b/Makefile index 929854bf5..8a3a5deee 100644 --- a/Makefile +++ b/Makefile @@ -58,18 +58,17 @@ BK_LHCFILL_PROTO="https://raw.githubusercontent.com/AliceO2Group/Bookkeeping/mai VERBOSE_1 := -v VERBOSE_2 := -v -x -WHAT := o2-aliecs-core o2-aliecs-executor coconut peanut walnut o2-apricot +WHAT := o2-aliecs-core o2-aliecs-executor coconut peanut o2-apricot WHAT_o2-aliecs-core_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-aliecs-executor_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_coconut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_peanut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) -WHAT_walnut_BUILD_FLAGS=$(BUILD_ENV_FLAGS) WHAT_o2-apricot_BUILD_FLAGS=$(BUILD_ENV_FLAGS) INSTALL_WHAT:=$(patsubst %, install_%, $(WHAT)) -GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./walnut ./core/integration/trg ./core/integration/bookkeeping -SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut ./walnut +GENERATE_DIRS := ./apricot ./coconut/cmd ./common ./common/runtype ./common/system ./core ./core/integration/ccdb ./core/integration/dcs ./core/integration/ddsched ./core/integration/kafka ./core/integration/odc ./executor ./core/integration/trg ./core/integration/bookkeeping +SRC_DIRS := ./apricot ./cmd/* ./core ./coconut ./executor ./common ./configuration ./occ/peanut TEST_DIRS := ./apricot/local ./common/gera ./common/utils ./common/utils/safeacks ./configuration/cfgbackend ./configuration/componentcfg ./configuration/template ./core/task/sm ./core/workflow ./core/integration/odc/fairmq ./core/integration/ccdb ./core/integration ./core/environment GO_TEST_DIRS := ./core/repos ./core/integration/dcs ./common/monitoring diff --git a/cmd/walnut/main.go b/cmd/walnut/main.go deleted file mode 100644 index 5c41f873b..000000000 --- a/cmd/walnut/main.go +++ /dev/null @@ -1,32 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -// Package walnut implements the O² Workflow Administration and Linting Utility. -package main - -import "github.com/AliceO2Group/Control/walnut/cmd" - -func main() { - cmd.Execute() -} diff --git a/docs/building.md b/docs/building.md index b738d33e2..ffd5fbe1b 100644 --- a/docs/building.md +++ b/docs/building.md @@ -12,7 +12,6 @@ AliECS consists of: * coconut - Go, runs locally or wherever you like and connects to core * process control plugin + library (OCC) - C++, runs throughout the cluster linked by user processes * peanut - Go, local debugging tool -* walnut - Go, local workflow conversion tool ## Building with aliBuild @@ -29,7 +28,7 @@ For development purposes, due to the significant differences in building and dep $ aliBuild init --defaults o2-dataflow Control-OCCPlugin $ aliBuild build --defaults o2-dataflow Control-OCCPlugin -# Includes core and executor in default build, can be used to build coconut, peanut and walnut locally +# Includes core and executor in default build, can be used to build coconut and peanut locally $ aliBuild init --defaults o2-dataflow Control-Core $ aliBuild build --defaults o2-dataflow Control-Core ``` @@ -87,4 +86,4 @@ For subsequent builds (after the first one), plain `make` (instead of `make all` If you wish to also build the process control library and/or plugin, see [the OCC readme](./occ/README.md). -This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. \ No newline at end of file +This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. diff --git a/walnut/README.md b/walnut/README.md deleted file mode 100644 index 61e437428..000000000 --- a/walnut/README.md +++ /dev/null @@ -1,75 +0,0 @@ -# `walnut` - the O² workflow administration and linting utility - -The O² **w**orkflow **a**dministration and **l**i**n**ting **ut**ility is a command line program for workflow configuration -and import validation. - -## Configuration file - -You can check the local `walnut` configuration with -```bash -$ walnut about -``` - -## Using `walnut` - -At any step, you can type `$ walnut help ` to get information on what you can do and how, for example: - -```bash -$ walnut help -walnut is a command line program for interacting with the O² Workflow Administration and Linting Utility. - -For more information on the available commands, see the individual documentation for each command. - -Usage: - walnut [command] - -Available Commands: - check check the file passed against a specified schema. - convert Converts a DPL Dump to the required formats. - help Help about any command - -Flags: - --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) - -h, --help help for walnut - -Use "walnut [command] --help" for more information about a command. -``` - -### Validating a file - -To check if a file conforms to the pre-defined schemas, run the `check` command: -```bash -$ walnut check -``` -Example usage: -```bash -$ walnut check dump.json --format workflow -``` - -A successful validation will return no output while any errors will cause the program to exit. - -#### SEE ALSO - -* [walnut check](./doc/walnut_check.md) - - -### Converting a DPL Dump to Task/Workflow Templates - -The goal of `walnut` is to convert O²/DPL generated dumps to the required number of task templates and workflow templates. The -command used is `convert`: -```bash -$ walnut convert -``` - -Convert can also receive optional arguments to specify which modules to consider while generating task templates. - -Example usage: -```bash -$ walnut convert dump.json --modules "TestValue1 TestValue2 TestValue3" -``` - -A successful validation will return no output while any errors will cause the program to exit. - -#### SEE ALSO - -* [walnut convert](./doc/walnut_convert.md) \ No newline at end of file diff --git a/walnut/app/constants.go b/walnut/app/constants.go deleted file mode 100644 index e7e5a2bc6..000000000 --- a/walnut/app/constants.go +++ /dev/null @@ -1,31 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package app - -const ( - NAME = "walnut" - PRETTY_SHORTNAME = "walnut" - PRETTY_FULLNAME = "O² Workflow Administration and Linting Utility" -) diff --git a/walnut/cmd/about.go b/walnut/cmd/about.go deleted file mode 100644 index ac8039341..000000000 --- a/walnut/cmd/about.go +++ /dev/null @@ -1,83 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "fmt" - "time" - - "github.com/AliceO2Group/Control/walnut/app" - "github.com/fatih/color" - "github.com/spf13/cobra" - "github.com/spf13/viper" -) - -// aboutCmd represents the about command -var aboutCmd = &cobra.Command{ - Use: "about", - Aliases: []string{}, - Short: fmt.Sprintf("about %s", app.NAME), - Long: `The about command shows some basic information on this utility.`, - Run: func(*cobra.Command, []string) { - color.Set(color.FgHiWhite) - fmt.Print(app.PRETTY_SHORTNAME + " *** ") - color.Set(color.FgHiGreen) - fmt.Printf("The ALICE %s\n", app.PRETTY_FULLNAME) - color.Unset() - fmt.Printf(` -version: %s -config: %s -`, - color.HiGreenString(viper.GetString("version")), - color.HiGreenString(func() string { - if len(viper.ConfigFileUsed()) > 0 { - return viper.ConfigFileUsed() - } - return "builtin" - }())) - - color.Set(color.FgHiBlue) - fmt.Printf("\nCopyright 2017-%d CERN and the copyright holders of ALICE O².\n"+ - "This program is free software: you can redistribute it and/or modify \n"+ - "it under the terms of the GNU General Public License as published by \n"+ - "the Free Software Foundation, either version 3 of the License, or \n"+ - "(at your option) any later version.\n", time.Now().Year()) - color.Unset() - - fmt.Printf(` -bugs: %s -code: %s -maintainer: %s -`, - - color.HiBlueString("https://alice.its.cern.ch/jira/projects/OCTRL"), - color.HiBlueString("https://github.com/AliceO2Group/Control"), - color.HiBlueString("Ayaan Zaidi, ")) - }, -} - -func init() { - rootCmd.AddCommand(aboutCmd) -} diff --git a/walnut/cmd/check.go b/walnut/cmd/check.go deleted file mode 100644 index 587e0d4b5..000000000 --- a/walnut/cmd/check.go +++ /dev/null @@ -1,75 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "fmt" - "io/ioutil" - "os" - - "github.com/spf13/viper" - - "github.com/AliceO2Group/Control/walnut/schemata" - "github.com/spf13/cobra" -) - -// checkCmd represents the check command -var checkCmd = &cobra.Command{ - Use: "check", - Short: "validate the file against a specified schema", - Long: `The check command validates the given file against a specified schema. This file can be a task template, -a workflow template or an O² DPL Dump. Each of these have a schema to validate against. - -Valid schema formats: - workflow task dpl_dump`, - - Run: func(cmd *cobra.Command, args []string) { - format, _ := cmd.Flags().GetString("format") - - for _, filename := range args { - file, err := ioutil.ReadFile(filename) - if err != nil { - fmt.Printf("failed to open file %s: %v", filename, err) - os.Exit(1) - } - err = schemata.Validate(file, format) - if err != nil { - fmt.Printf("validation failed: %v", err) - os.Exit(1) - } - } - }, - Args: cobra.MinimumNArgs(1), -} - -var format string - -func init() { - rootCmd.AddCommand(checkCmd) - - checkCmd.Flags().StringP("format", "f", "", "format to validate against") - viper.BindPFlag("format", checkCmd.Flags().Lookup("format")) - checkCmd.MarkFlagRequired("format") -} diff --git a/walnut/cmd/convert.go b/walnut/cmd/convert.go deleted file mode 100644 index fb675cc68..000000000 --- a/walnut/cmd/convert.go +++ /dev/null @@ -1,245 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "errors" - "fmt" - "io/ioutil" - "log" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - - "github.com/AlecAivazis/survey/v2" - "github.com/AliceO2Group/Control/core/task/taskclass" - "github.com/mitchellh/go-homedir" - "github.com/spf13/cobra" - "github.com/spf13/viper" - - "github.com/AliceO2Group/Control/common/utils" - "github.com/AliceO2Group/Control/core/workflow" - "github.com/AliceO2Group/Control/walnut/converter" -) - -var outputDir string -var modules []string -var graft string -var workflowName string -var configURIVarname string -var staticConfigURI string -var extraVars string -var taskNamePrefix string - -// convertCmd represents the convert command -var convertCmd = &cobra.Command{ - Use: "convert", - Short: "converts a DPL Dump to the required formats", - Long: `The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to -specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module.`, - - Run: func(cmd *cobra.Command, args []string) { - for _, dumpFile := range args { - // Strip .json from end of filename - nameOfDump := filepath.Base(dumpFile)[:len(filepath.Base(dumpFile))-5] - defaults := map[string]string{ - "user": "flp", - nameOfDump + "_monitoring_url": "no-op://", - "dpl_config": "", - } - - // Open specified DPL Dump - file, err := ioutil.ReadFile(dumpFile) - if err != nil { - err = fmt.Errorf("failed to open file &s: &w", dumpFile, err) - fmt.Println(err.Error()) - os.Exit(1) - } - - if configURIVarname != "" { - defaults[configURIVarname] = staticConfigURI - } else { - defaults[nameOfDump+"_config_uri"] = staticConfigURI - } - - // Import the dump and convert it to []*task.Class - dplDump, err := converter.DPLImporter(file) - taskClass, err := converter.ExtractTaskClasses(dplDump, taskNamePrefix, modules) - - if outputDir == "" { - outputDir, _ = os.Getwd() - } - outputDir, _ = homedir.Expand(outputDir) - - extraVars = strings.TrimSpace(extraVars) - if cmd.Flags().Changed("extra-vars") && len(extraVars) == 0 { - fmt.Println(errors.New("empty list of extra-vars supplied").Error()) - os.Exit(1) - } - - extraVarsMap, err := utils.ParseExtraVars(extraVars) - if err != nil { - fmt.Println(err.Error()) - os.Exit(1) - } - - fmt.Printf("OPENED: %s", dumpFile) - - if graft == "" { - if workflowName == "" { - workflowName = nameOfDump - } - - // If not grafting, simply convert dump to WFTs and TTs - err = WriteTemplates(taskClass, workflowName, extraVarsMap, defaults) - if err != nil { - fmt.Println(err.Error()) - os.Exit(1) - } - } else { - rolePath := strings.Split(graft, ":") - workflowPath := rolePath[0] - targetRolePath := rolePath[1] - - if workflowName == "" { - workflowName = filepath.Base(workflowPath) - } - - // Open existing workflow - f, err := ioutil.ReadFile(workflowPath) - if err != nil { - log.Fatal(err) - } - root, err := workflow.LoadWorkflow(f) - if err != nil { - log.Fatal(err) - } - - // Convert DPL to yaml.Node - roleToGraft, err := workflow.LoadDPL(taskClass, dumpFile[:len(dumpFile)-5], extraVarsMap) - if err != nil { - log.Fatal(err) - } - roleData, err := workflow.RoleToYAML(roleToGraft) - if err != nil { - log.Fatal(err) - } - - grafted, err := workflow.Graft(&root, targetRolePath, roleData, workflowName) - if err != nil { - log.Fatal(err) - } - path := filepath.Join(outputDir, workflowName+".yaml") - fmt.Println("Writing to: ", path) - err = ioutil.WriteFile(path, grafted, 0644) - if err != nil { - log.Fatal(err) - } - } - } - - isGitRepo, _ := strconv.ParseBool(strings.TrimSpace( - runGitCmd([]string{"rev-parse", "--is-inside-work-tree"}))) - - if isGitRepo { - fmt.Printf(runGitCmd([]string{"status"})) - - result := true - prompt := &survey.Confirm{ - Message: "Would you like to view the git diff?", - Default: true, - } - _ = survey.AskOne(prompt, &result) - - if result { - fmt.Printf(runGitCmd([]string{"diff"})) - } - } - }, - Args: cobra.MinimumNArgs(1), -} - -func runGitCmd(args []string) string { - cmd := exec.Command("git", args...) - cmd.Dir = outputDir - out, err := cmd.Output() - if err != nil { - log.Fatal(err) - } - - return string(out) -} - -func WriteTemplates(taskClass []*taskclass.Class, nameOfDump string, extraVarsMap map[string]string, defaults map[string]string) (err error) { - err = converter.GenerateTaskTemplate(taskClass, outputDir, defaults) - if err != nil { - return fmt.Errorf("conversion to task failed for %s: %w", nameOfDump, err) - } - - role, err := workflow.LoadDPL(taskClass, nameOfDump, extraVarsMap) - err = converter.GenerateWorkflowTemplate(role, outputDir) - if err != nil { - return fmt.Errorf("conversion to workflow failed for %s: %w", nameOfDump, err) - } - - return nil -} - -func init() { - convertCmd.Flags().StringArrayVarP(&modules, "modules", "m", []string{}, "modules to load") - _ = viper.BindPFlag("modules", convertCmd.Flags().Lookup("modules")) - - convertCmd.PersistentFlags().StringVarP(&outputDir, "output-dir", "o", "", - "optional output directory") - _ = viper.BindPFlag("output-dir", rootCmd.Flags().Lookup("output-dir")) - - convertCmd.PersistentFlags().StringVarP(&graft, "graft", "g", "", - "graft converted DPL to an existing template") - _ = viper.BindPFlag("graft", rootCmd.Flags().Lookup("graft")) - - convertCmd.PersistentFlags().StringVarP(&workflowName, "workflow-name", "w", "", - "workflow to graft to") - _ = viper.BindPFlag("workflow-name", rootCmd.Flags().Lookup("workflow-name")) - - convertCmd.PersistentFlags().StringVarP(&configURIVarname, "config-uri-varname", "", "", - "name of config uri var") - _ = viper.BindPFlag("config-uri-varname", rootCmd.Flags().Lookup("config-uri-varname")) - - convertCmd.PersistentFlags().StringVarP(&staticConfigURI, "static-config-uri", "", "", - "path of config uri") - _ = viper.BindPFlag("static-config-uri", rootCmd.Flags().Lookup("static-config-uri")) - - convertCmd.PersistentFlags().StringVarP(&extraVars, "extra-vars", "", "", - "extra vars") - _ = viper.BindPFlag("extra-vars", rootCmd.Flags().Lookup("extra-vars")) - - convertCmd.PersistentFlags().StringVarP(&taskNamePrefix, "task-name-prefix", "", "", - "prefix for task name fields") - _ = viper.BindPFlag("task-name-prefix", rootCmd.Flags().Lookup("task-name-prefix")) - - rootCmd.AddCommand(convertCmd) -} diff --git a/walnut/cmd/root.go b/walnut/cmd/root.go deleted file mode 100644 index ef6a7db1b..000000000 --- a/walnut/cmd/root.go +++ /dev/null @@ -1,100 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package cmd - -import ( - "fmt" - "os" - - "github.com/AliceO2Group/Control/walnut/app" - "github.com/spf13/cobra" - - homedir "github.com/mitchellh/go-homedir" - "github.com/spf13/viper" -) - -var cfgFile string - -// rootCmd represents the base command when called without any subcommands -var rootCmd = &cobra.Command{ - Use: app.NAME, - Short: app.PRETTY_FULLNAME, - Long: fmt.Sprintf(`%s is a command line program for interacting with the %s. - -For more information on the available commands, see the individual documentation for each command.`, app.PRETTY_SHORTNAME, app.PRETTY_FULLNAME), - // Uncomment the following line if your bare application - // has an action associated with it: - // Run: func(cmd *cobra.Command, args []string) { }, -} - -// Execute adds all child commands to the root command and sets flags appropriately. -// This is called by main.main(). It only needs to happen once to the rootCmd. -func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) - } -} - -func GetRootCmd() *cobra.Command { // Used for docs generator - return rootCmd -} - -func init() { - cobra.OnInitialize(initConfig) - - // Here you will define your flags and configuration settings. - // Cobra supports persistent flags, which, if defined here, - // will be global for your application. - - rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", - fmt.Sprintf("optional configuration file for %s (default $HOME/.config/%s/settings.yaml)", app.NAME, app.NAME)) -} - -// initConfig reads in config file and ENV variables if set. -func initConfig() { - if cfgFile != "" { - // Use config file from the flag. - viper.SetConfigFile(cfgFile) - } else { - // Find home directory. - home, err := homedir.Dir() - if err != nil { - fmt.Println(err) - os.Exit(1) - } - - // Search config in home directory with name ".walnut" (without extension). - viper.AddConfigPath(home) - viper.SetConfigName(".walnut") - } - - viper.AutomaticEnv() // read in environment variables that match - - // If a config file is found, read it in. - if err := viper.ReadInConfig(); err == nil { - fmt.Println("Using config file:", viper.ConfigFileUsed()) - } -} diff --git a/walnut/converter/converter.go b/walnut/converter/converter.go deleted file mode 100644 index 0c3bf75a8..000000000 --- a/walnut/converter/converter.go +++ /dev/null @@ -1,225 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package converter - -import ( - "fmt" - "io/ioutil" - "os" - "path/filepath" - "strings" - - "github.com/AlecAivazis/survey/v2" - "github.com/AliceO2Group/Control/core/task/taskclass" - "github.com/AliceO2Group/Control/core/task/taskclass/port" - "github.com/mitchellh/go-homedir" - "gopkg.in/yaml.v3" - - "github.com/AliceO2Group/Control/common" - "github.com/AliceO2Group/Control/common/controlmode" - "github.com/AliceO2Group/Control/common/gera" - "github.com/AliceO2Group/Control/core/task/channel" - "github.com/AliceO2Group/Control/core/workflow" -) - -// return pointer to float64 -func createFloat(x float64) *float64 { - return &x -} - -// return pointer to bool -func createBool(x bool) *bool { - return &x -} - -// return pointer to string -func createString(x string) *string { - return &x -} - -// ExtractTaskClasses takes in a DPL Dump string and extracts -// an array of Tasks -func ExtractTaskClasses(dplDump Dump, taskNamePrefix string, envModules []string) (tasks []*taskclass.Class, err error) { - envModules = append(envModules, "Control-OCCPlugin") - - for index := range dplDump.Workflows { - taskName := dplDump.Workflows[index].Name - if taskNamePrefix != "" { - taskNamePrefix += "_" - } - - correspondingMetadata := index + 1 // offset to match workflowEntry with correct metadataEntry - channelNames := dplDump.Metadata[correspondingMetadata].Channels - - task := taskclass.Class{ - Identifier: taskclass.Id{ - Name: taskNamePrefix + taskName, - }, - Control: struct { - Mode controlmode.ControlMode "yaml:\"mode\"" - }{Mode: controlmode.FAIRMQ}, - Command: &common.CommandInfo{ - Env: []string{}, // -> Default to empty array - Shell: createBool(true), - Arguments: sanitizeCmdLineArgs(dplDump.Metadata[correspondingMetadata].CmdlLineArgs, - taskName), - }, - Wants: taskclass.ResourceWants{ - Cpu: createFloat(0.15), - Memory: createFloat(128), - Ports: port.Ranges{}, // begin - end OR range - }, - Properties: gera.MakeMapWithMap(map[string]string{ - "severity": "trace", - "color": "false", - }), - } - - value := fmt.Sprintf("eval `aliswmod load %s` &&\n%s", strings.Join(envModules, " "), - dplDump.Metadata[correspondingMetadata].Executable) - value = fmt.Sprintf("%s &&\n%s", value, "cat {{ dpl_config }} | dump-name") - task.Command.Value = &value - - for _, channelName := range channelNames { - // To avoid duplication, only "push" channels are included - if strings.Contains(channelName, "from_"+taskName) { - singleBind := channel.Inbound{ - Channel: channel.Channel{ - Name: channelName, - Type: channel.ChannelType("push"), - Transport: channel.TransportType("shmem"), - }, - Addressing: "ipc", - } - task.Bind = append(task.Bind, singleBind) - } - - if strings.Contains(channelName, "to_"+taskName) { - // String manipulation to generate channel target of the form: - // {{ Parent().Path }}.taskName:from_{initiator}_to_{receiver} - initiator := channelName[5:strings.Index(channelName, "_to")] - singleConnect := channel.Outbound{ - Channel: channel.Channel{ - Name: channelName, - Type: channel.ChannelType("pull"), - Transport: channel.TransportType("shmem"), - Target: fmt.Sprintf("{{ Parent().Path }}.%s:%s", initiator, channelName), - }, - } - task.Connect = append(task.Connect, singleConnect) - } - } - - tasks = append(tasks, &task) - } - return tasks, nil -} - -func sanitizeCmdLineArgs(input []string, taskName string) (output []string) { - for index, value := range input { - // Check args for dump arguments and remove them - if !(strings.Contains(value, "--dump-workflow") || - (strings.Contains(value, ".json") && input[index-1] == "--dump-workflow-file")) { - output = append(output, value) - } - } - // Add --id parameter along with name of task to arguments - output = append(output, "--id", taskName) - - return output -} - -// GenerateTaskTemplate takes as input an array of pointers to task.Class -// and writes them to a AliECS friendly YAML file -func GenerateTaskTemplate(extractedTasks []*taskclass.Class, outputDir string, defaults map[string]string) (err error) { - path := filepath.Join(outputDir, "tasks") - path, _ = homedir.Expand(path) - _ = os.MkdirAll(path, os.ModePerm) - - for _, SingleTask := range extractedTasks { - SingleTask.Defaults = gera.MakeMapWithMap(defaults) - SingleTask.Command.User = createString("{{ user }}") - - YAMLData, err := yaml.Marshal(&SingleTask) - if err != nil { - return fmt.Errorf("marshal failed: %v", err) - } - - fileName := filepath.Join(path, SingleTask.Identifier.Name+".yaml") - if _, err := os.Stat(fileName); !os.IsNotExist(err) { - result := false - prompt := &survey.Confirm{ - Message: fmt.Sprintf("%s already exists, overwrite?", fileName), - Default: false, - } - _ = survey.AskOne(prompt, &result) - if result { - continue - } - } - - f, err := os.Create(fileName) - defer f.Close() - - // Write marshaled YAML to file - err = ioutil.WriteFile(fileName, YAMLData, 0644) - if err != nil { - return fmt.Errorf("creating file failed: %v", err) - } - } - - return -} - -func GenerateWorkflowTemplate(input workflow.Role, outputDir string) (err error) { - path := filepath.Join(outputDir, "workflows") - path, _ = homedir.Expand(path) - _ = os.MkdirAll(path, os.ModePerm) - - yamlDATA, err := workflow.RoleToYAML(input) - if err != nil { - return fmt.Errorf("error converting role to YAML: %v", err) - } - - fileName := filepath.Join(path, input.GetName()+".yaml") - if _, err := os.Stat(fileName); !os.IsNotExist(err) { - result := false - prompt := &survey.Confirm{ - Message: fmt.Sprintf("%s already exists, overwrite?", fileName), - Default: false, - } - _ = survey.AskOne(prompt, &result) - if result { - return nil - } - } - - err = ioutil.WriteFile(fileName, yamlDATA, 0644) - if err != nil { - return fmt.Errorf("error writing role to file: %v", err) - } - - return -} diff --git a/walnut/converter/converter_test.go b/walnut/converter/converter_test.go deleted file mode 100644 index c32ae0add..000000000 --- a/walnut/converter/converter_test.go +++ /dev/null @@ -1,115 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package converter - -import ( - "io/ioutil" - "os" - "path/filepath" - "testing" - - "github.com/k0kubun/pp" - - "github.com/AliceO2Group/Control/core/workflow" -) - -func TestExtractClass(t *testing.T) { - t.Run("Testing class extraction", func(t *testing.T) { - extractedClasses, err := ExtractTaskClasses(TestDump, "", []string{}) - pp.Print(extractedClasses) - if err != nil { - t.Errorf("extract Task Class failed: %v", err) - } - }) -} - -func TestGenerateTaskTemplate(t *testing.T) { - t.Run("Testing Task -> YAML", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, "testPrefix", []string{"QualityControl"}) - if err != nil { - t.Errorf("extract Task Class failed: %v", err) - } - - err = GenerateTaskTemplate(allTasks, "dump", defaults) - if err != nil { - t.Errorf("failed to write YAML to file: %v", err) - } - }) -} - -func TestTaskToRole(t *testing.T) { - t.Run("Testing Task -> workflow.Role", func(t *testing.T) { - allTasks, err := ExtractTaskClasses(TestDump, "", []string{}) - if err != nil { - t.Errorf("extract Task Class failed: %v", err) - } - - role, err := workflow.LoadDPL(allTasks, "dump", extraVars) - if err != nil { - t.Errorf("error loading task to role: %v", err) - } - _, _ = pp.Print(role) - }) -} - -func TestGenerateWorkflowTemplate(t *testing.T) { - t.Run("Testing Role -> workflow.yaml", func(t *testing.T) { - dumpFile, err := ioutil.ReadFile("dump.json") - dump, err := DPLImporter(dumpFile) - allTasks, err := ExtractTaskClasses(dump, "testPrefix", []string{}) - if err != nil { - t.Errorf("extract Task Class failed: %v", err) - } - - role, err := workflow.LoadDPL(allTasks, "dump", extraVars) - if err != nil { - t.Errorf("error loading task to role: %v", err) - } - - err = GenerateWorkflowTemplate(role, "dump") - if err != nil { - t.Errorf("error converting Role to YAML: %v", err) - } - }) -} - -func TestGraft(t *testing.T) { - t.Run("test grafting role", func(t *testing.T) { - f1, _ := ioutil.ReadFile("small.yaml") - root, _ := workflow.LoadWorkflow(f1) - f2, _ := ioutil.ReadFile("dump.yaml") - - result, err := workflow.Graft(&root, "readout.host-{{ it }}", f2, "small") - if err != nil { - t.Error(err) - } - - wd, _ := os.Getwd() - err = ioutil.WriteFile(filepath.Join(wd, "test", "grafted.yaml"), result, 0644) - if err != nil { - t.Error(err) - } - }) -} diff --git a/walnut/converter/dump.json b/walnut/converter/dump.json deleted file mode 100644 index 591b5c1ca..000000000 --- a/walnut/converter/dump.json +++ /dev/null @@ -1,390 +0,0 @@ -{ - "workflow": [ - { - "name": "producer-0", - "inputs": [], - "outputs": [ - { - "binding": "out", - "origin": "TST", - "description": "RAWDATA", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - }, - { - "name": "Dispatcher", - "inputs": [ - { - "binding": "random", - "origin": "TST", - "description": "RAWDATA", - "subspec": 0, - "lifetime": 0 - }, - { - "binding": "timer-stats", - "origin": "DS", - "description": "TIMER-Dispatcher", - "subspec": 0, - "lifetime": 4 - } - ], - "outputs": [ - { - "binding": "random", - "origin": "DS", - "description": "tst-raw-0", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [ - { - "name": "period-timer-stats", - "type": "0", - "defaultValue": "10000000", - "help": "Dispatcher's stats timer period" - } - ], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - }, - { - "name": "QC-TASK-RUNNER-QcTask", - "inputs": [ - { - "binding": "random", - "origin": "DS", - "description": "tst-raw-0", - "subspec": 0, - "lifetime": 0 - }, - { - "binding": "timer-cycle", - "origin": "QC", - "description": "TIMER-QcTask-mo", - "subspec": 0, - "lifetime": 4 - } - ], - "outputs": [ - { - "binding": "mo", - "origin": "QC", - "description": "QcTask-mo", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [ - { - "name": "period-timer-cycle", - "type": "0", - "defaultValue": "10000000", - "help": "timer period" - } - ], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - }, - { - "name": "QC-CHECK-RUNNER-QcCheck", - "inputs": [ - { - "binding": "QcTask", - "origin": "QC", - "description": "QcTask-mo", - "subspec": 0, - "lifetime": 0 - } - ], - "outputs": [ - { - "binding": "QC/QcCheck-chk/0", - "origin": "QC", - "description": "QcCheck-chk", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - }, - { - "name": "printer", - "inputs": [ - { - "binding": "checked-mo", - "origin": "QC", - "description": "QcCheck-chk", - "subspec": 0, - "lifetime": 0 - } - ], - "outputs": [], - "options": [], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - } - ], - "metadata": [ - { - "name": "internal-dpl-clock", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_producer-0", - "from_internal-dpl-clock_to_Dispatcher", - "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask" - ] - }, - { - "name": "producer-0", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_producer-0", - "from_producer-0_to_Dispatcher" - ] - }, - { - "name": "Dispatcher", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_Dispatcher", - "from_producer-0_to_Dispatcher", - "from_Dispatcher_to_QC-TASK-RUNNER-QcTask" - ] - }, - { - "name": "QC-TASK-RUNNER-QcTask", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask", - "from_Dispatcher_to_QC-TASK-RUNNER-QcTask", - "from_QC-TASK-RUNNER-QcTask_to_QC-CHECK-RUNNER-QcCheck" - ] - }, - { - "name": "QC-CHECK-RUNNER-QcCheck", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_QC-TASK-RUNNER-QcTask_to_QC-CHECK-RUNNER-QcCheck", - "from_QC-CHECK-RUNNER-QcCheck_to_printer" - ] - }, - { - "name": "printer", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_QC-CHECK-RUNNER-QcCheck_to_printer" - ] - } - ] -} diff --git a/walnut/converter/dump.yaml b/walnut/converter/dump.yaml deleted file mode 100644 index 3d4ac88c2..000000000 --- a/walnut/converter/dump.yaml +++ /dev/null @@ -1,83 +0,0 @@ -name: readout-qc -defaults: - monitoring_qc_url: "no-op://" - monitoring_dd_url: "no-op://" - monitoring_readout_url: "no-op://" -roles: - - name: readout-{{ it }} - for: - range: "{{ hosts }}" - var: it - constraints: - - attribute: machine_id - value: "{{ it }}" - vars: - readout_cfg_uri: "file:/home/flp/readout.cfg" - roles: - - name: "readout" - task: - load: readout - - name: qc-single-subwf - defaults: - qchost: "{{ FromJson(hosts)[0] }}" - dpl_config: "/etc/flp.d/qc/readout-qc.dpl.json" - constraints: - - attribute: machine_id - value: "{{ qchost }}" - roles: - - name: "readout-proxy" - connect: - - name: "from_internal-dpl-clock_to_readout-proxy" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_readout-proxy" - type: "pull" - rateLogging: "60" - - name: "readout-proxy" - target: "ipc:///tmp/readout-pipe-1" - # readout.cfg [consumer-data-sampling] is hardcoded as channel "data-out" with type: pub and transport: zeromq - # shmem is only possible in push-pull mode - type: "sub" - rateLogging: "1" - task: - load: readout-proxy - - name: "internal-dpl-clock" - task: - load: readout-internal-dpl-clock - - name: "Dispatcher" - connect: - - name: "from_readout-proxy_to_Dispatcher" - target: "{{Parent().Path}}.readout-proxy:from_readout-proxy_to_Dispatcher" - type: "pull" - rateLogging: "60" - - name: "from_internal-dpl-clock_to_Dispatcher" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_Dispatcher" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-dispatcher - - name: "QC-TASK-RUNNER-daqTask" - connect: - - name: "from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" - target: "{{Parent().Path}}.internal-dpl-clock:from_internal-dpl-clock_to_QC-TASK-RUNNER-daqTask" - type: "pull" - rateLogging: "60" - - name: "from_Dispatcher_to_QC-TASK-RUNNER-daqTask" - target: "{{Parent().Path}}.Dispatcher:from_Dispatcher_to_QC-TASK-RUNNER-daqTask" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-task-runner - - name: "QC-CHECK-RUNNER-Q4H0" - connect: - - name: "from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" - target: "{{Parent().Path}}.QC-TASK-RUNNER-daqTask:from_QC-TASK-RUNNER-daqTask_to_QC-CHECK-RUNNER-Q4H0" - type: "pull" - rateLogging: "60" - task: - load: readout-qc-check-runner - - name: "internal-dpl-global-binary-file-sink" - connect: - - name: "from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" - target: "{{Parent().Path}}.QC-CHECK-RUNNER-Q4H0:from_QC-CHECK-RUNNER-Q4H0_to_internal-dpl-global-binary-file-sink" - type: "pull" - task: - load: readout-internal-dpl-global-binary-file-sink diff --git a/walnut/converter/importer.go b/walnut/converter/importer.go deleted file mode 100644 index a8e927396..000000000 --- a/walnut/converter/importer.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package converter - -import ( - "encoding/json" - "fmt" -) - -type io struct { - Binding string `json:"binding"` - Origin string `json:"origin"` - Description string `json:"description"` - Subspec int `json:"subspec"` - Lifetime int `json:"lifetime"` -} - -type options struct { - Name string `json:"name"` - Type string `json:"type"` - DefaultValue string `json:"defaultValue"` - Help string `json:"help"` -} -type workflowEntry struct { - Name string `json:"name"` - Inputs []io `json:"inputs"` - Outputs []io `json:"outputs"` - Options []options `json:"options"` - Rank int `json:"rank"` - NSlots int `json:"nSlots"` - InputTimeSliceID int `json:"inputTimeSliceId"` - MaxInputTimeslices int `json:"maxInputTimeslices"` -} - -type metadataEntry struct { - Name string `json:"name"` - Executable string `json:"executable"` - CmdlLineArgs []string `json:"cmdLineArgs"` - WorkflowOptions []options `json:"workflowOptions"` - Channels []string `json:"channels"` -} - -// Dump is a 1:1 struct representation of a DPL Dump -type Dump struct { - Workflows []workflowEntry `json:"workflow"` - Metadata []metadataEntry `json:"metadata"` -} - -func DPLImporter(input []byte) (importedJSON Dump, err error) { - err = json.Unmarshal(input, &importedJSON) - if err != nil { - return importedJSON, fmt.Errorf("JSON Unmarshal failed: %w", err) - } - - return importedJSON, nil -} diff --git a/walnut/converter/importer_test.go b/walnut/converter/importer_test.go deleted file mode 100644 index 1a53f2bb9..000000000 --- a/walnut/converter/importer_test.go +++ /dev/null @@ -1,44 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package converter - -import ( - "reflect" - "testing" -) - -func TestDPLImporter(t *testing.T) { - t.Run("Testing dump reading", func(t *testing.T) { - got, err := DPLImporter([]byte(TestJSON)) - want := TestDump - if err != nil { - t.Errorf("Import failed: %v", err) - } else { - if !reflect.DeepEqual(got, want) { - t.Error("Unmarshalled value does not match") - } - } - }) -} diff --git a/walnut/converter/small.yaml b/walnut/converter/small.yaml deleted file mode 100644 index 1d4d055e2..000000000 --- a/walnut/converter/small.yaml +++ /dev/null @@ -1,43 +0,0 @@ -name: readout-stfb -defaults: - roc_ctp_emulator_enabled: "true" - stfb_enabled: "true" -roles: - - name: host-{{ it }} - for: - range: "{{ hosts }}" - var: it - vars: - readout_cfg_uri: '{{stfb_enabled == "true" ? "file:/home/flp/readout_stfb_emu.cfg" : "file:/home/flp/readout.cfg"}}' - constraints: - - attribute: machine_id - value: "{{ it }}" - roles: - - name: "readout" - task: - load: readout - - name: "stfb" - enabled: "{{ stfb_enabled }}" - connect: - - name: readout - type: pull - target: "{{ Parent().Path }}.readout:readout" - rateLogging: "1" - task: - load: stfbuilder-nooutput - - name: roc-ctp-emulators - enabled: "{{roc_ctp_emulator_enabled}}" - defaults: - roc_ctp_emulator_endpoints: '["#0"]' - roles: - - name: "endpoint-{{ endpoint_id }}" - for: - range: "{{roc_ctp_emulator_endpoints}}" - var: endpoint_id - roles: - - name: roc-ctp-emulator - task: - load: "roc-ctp-emulator" - trigger: "enter_RUNNING" - timeout: 10s - critical: false \ No newline at end of file diff --git a/walnut/converter/testvalues.go b/walnut/converter/testvalues.go deleted file mode 100644 index 70b178609..000000000 --- a/walnut/converter/testvalues.go +++ /dev/null @@ -1,248 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package converter - -var defaults = map[string]string{ - "qc_config_uri": "json:///etc/flp.d/qc/readout.json", - "user": "test-user-1", -} - -var extraVars = map[string]string{ - "readout_cfg_uri": "file:/home/flp/readout_stfb_emu.cfg", -} - -var TestDump = Dump{ - Workflows: []workflowEntry{ - { - Name: "producer-0", - Inputs: []io{}, - Outputs: []io{ - { - Binding: "out", - Origin: "TST", - Description: "RAWDATA", - Subspec: 0, - Lifetime: 0, - }, - }, - Options: []options{}, - Rank: 0, - NSlots: 1, - InputTimeSliceID: 0, - MaxInputTimeslices: 1, - }, - }, - Metadata: []metadataEntry{ - { - Name: "internal-dpl-clock", - Executable: "o2-qc-run-basic", - CmdlLineArgs: []string{ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json", - }, - WorkflowOptions: []options{ - { - Name: "config-path", - Type: "4", - DefaultValue: "", - Help: "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling.", - }, - { - Name: "no-data-sampling", - Type: "5", - DefaultValue: "0", - Help: "Skips data sampling, connects directly the task to the producer.", - }, - { - Name: "readers", - Type: "1", - DefaultValue: "1", - Help: "number of parallel readers to use", - }, - { - Name: "pipeline", - Type: "4", - DefaultValue: "", - Help: "override default pipeline size", - }, - }, - Channels: []string{ - "from_internal-dpl-clock_to_producer-0", - "from_internal-dpl-clock_to_Dispatcher", - "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask", - }, - }, - { - Name: "producer-0", - Executable: "o2-qc-run-basic", - CmdlLineArgs: []string{ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json", - }, - WorkflowOptions: []options{ - { - Name: "config-path", - Type: "4", - DefaultValue: "", - Help: "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling.", - }, - { - Name: "no-data-sampling", - Type: "5", - DefaultValue: "0", - Help: "Skips data sampling, connects directly the task to the producer.", - }, - { - Name: "readers", - Type: "1", - DefaultValue: "1", - Help: "number of parallel readers to use", - }, - { - Name: "pipeline", - Type: "4", - DefaultValue: "", - Help: "override default pipeline size", - }, - }, - Channels: []string{ - "from_internal-dpl-clock_to_producer-0", - "from_producer-0_to_Dispatcher", - }, - }, - }, -} - -var TestJSON = ` -{ - "workflow": [ - { - "name": "producer-0", - "inputs": [], - "outputs": [ - { - "binding": "out", - "origin": "TST", - "description": "RAWDATA", - "subspec": 0, - "lifetime": 0 - } - ], - "options": [], - "rank": 0, - "nSlots": 1, - "inputTimeSliceId": 0, - "maxInputTimeslices": 1 - } - ], - "metadata": [ - { - "name": "internal-dpl-clock", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_producer-0", - "from_internal-dpl-clock_to_Dispatcher", - "from_internal-dpl-clock_to_QC-TASK-RUNNER-QcTask" - ] - }, - { - "name": "producer-0", - "executable": "o2-qc-run-basic", - "cmdLineArgs": [ - "-b", - "--dump-workflow", - "--dump-workflow-file", - "dpl-dump.json" - ], - "workflowOptions": [ - { - "name": "config-path", - "type": "4", - "defaultValue": "", - "help": "Absolute path to the config file. Overwrite the default paths. Do not use with no-data-sampling." - }, - { - "name": "no-data-sampling", - "type": "5", - "defaultValue": "0", - "help": "Skips data sampling, connects directly the task to the producer." - }, - { - "name": "readers", - "type": "1", - "defaultValue": "1", - "help": "number of parallel readers to use" - }, - { - "name": "pipeline", - "type": "4", - "defaultValue": "", - "help": "override default pipeline size" - } - ], - "channels": [ - "from_internal-dpl-clock_to_producer-0", - "from_producer-0_to_Dispatcher" - ] - } - ] -} -` diff --git a/walnut/doc/generate.go b/walnut/doc/generate.go deleted file mode 100644 index 8bb8159fc..000000000 --- a/walnut/doc/generate.go +++ /dev/null @@ -1,43 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package main - -import ( - "github.com/AliceO2Group/Control/common/logger" - "github.com/AliceO2Group/Control/walnut/app" - "github.com/AliceO2Group/Control/walnut/cmd" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra/doc" -) - -var log = logger.New(logrus.StandardLogger(), app.NAME) - -func main() { - rootCmd := cmd.GetRootCmd() - err := doc.GenMarkdownTree(rootCmd, "./") - if err != nil { - log.Fatal(err) - } -} diff --git a/walnut/doc/walnut.md b/walnut/doc/walnut.md deleted file mode 100644 index 8451401ab..000000000 --- a/walnut/doc/walnut.md +++ /dev/null @@ -1,24 +0,0 @@ -## walnut - -O² Workflow Administration and Linting Utility - -### Synopsis - -walnut is a command line program for interacting with the O² Workflow Administration and Linting Utility. - -For more information on the available commands, see the individual documentation for each command. - -### Options - -``` - --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) - -h, --help help for walnut -``` - -### SEE ALSO - -* [walnut about](walnut_about.md) - about walnut -* [walnut check](walnut_check.md) - validate the file against a specified schema -* [walnut convert](walnut_convert.md) - converts a DPL Dump to the required formats - -###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_about.md b/walnut/doc/walnut_about.md deleted file mode 100644 index 9006334ad..000000000 --- a/walnut/doc/walnut_about.md +++ /dev/null @@ -1,29 +0,0 @@ -## walnut about - -about walnut - -### Synopsis - -The about command shows some basic information on this utility. - -``` -walnut about [flags] -``` - -### Options - -``` - -h, --help help for about -``` - -### Options inherited from parent commands - -``` - --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) -``` - -### SEE ALSO - -* [walnut](walnut.md) - O² Workflow Administration and Linting Utility - -###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_check.md b/walnut/doc/walnut_check.md deleted file mode 100644 index 877c3450e..000000000 --- a/walnut/doc/walnut_check.md +++ /dev/null @@ -1,34 +0,0 @@ -## walnut check - -validate the file against a specified schema - -### Synopsis - -The check command validates the given file against a specified schema. This file can be a task template, -a workflow template or an O² DPL Dump. Each of these have a schema to validate against. - -Valid schema formats: - workflow task dpl_dump - -``` -walnut check [agrs] [flags] -``` - -### Options - -``` - --format string format to validate against - -h, --help help for check -``` - -### Options inherited from parent commands - -``` - --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) -``` - -### SEE ALSO - -* [walnut](walnut.md) - O² Workflow Administration and Linting Utility - -###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/doc/walnut_convert.md b/walnut/doc/walnut_convert.md deleted file mode 100644 index 872de6d46..000000000 --- a/walnut/doc/walnut_convert.md +++ /dev/null @@ -1,31 +0,0 @@ -## walnut convert - -converts a DPL Dump to the required formats - -### Synopsis - -The convert command takes a DPL input and outputs task and workflow templates. Optional flags can be provided to -specify which modules should be used when generating task templates. Control-OCCPlugin is always used as module. - -``` -walnut convert [args] [flags] -``` - -### Options - -``` - -h, --help help for convert - -m, --modules stringArray modules to include -``` - -### Options inherited from parent commands - -``` - --config string optional configuration file for walnut (default $HOME/.config/walnut/settings.yaml) -``` - -### SEE ALSO - -* [walnut](walnut.md) - O² Workflow Administration and Linting Utility - -###### Auto generated by spf13/cobra on 10-Jul-2020 diff --git a/walnut/includeschemata.go b/walnut/includeschemata.go deleted file mode 100644 index b5843ace0..000000000 --- a/walnut/includeschemata.go +++ /dev/null @@ -1,65 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package main - -// Generate latest schemas from .json files -//go:generate go run includeschemata.go - -import ( - "io" - "io/ioutil" - "os" - "path/filepath" - "strings" -) - -// Reads all .json files in the current folder -// and encodes them as strings literals in schemata.go -func main() { - - schemasPath := "./schemata/" - - fs, err := ioutil.ReadDir(schemasPath) - if err != nil { - return - } - - out, err := os.Create(filepath.Join(schemasPath, "schemata.go")) - if err != nil { - return - } - - out.Write([]byte("package schemata \n\nconst (\n")) - for _, f := range fs { - if strings.HasSuffix(f.Name(), ".json") { - out.Write([]byte(strings.TrimSuffix(f.Name(), ".json") + " = `\n")) - f, _ := os.Open(filepath.Join(schemasPath, f.Name())) - io.Copy(out, f) - out.Write([]byte("`\n")) - } - } - out.Write([]byte(")\n")) - -} diff --git a/walnut/schemata/Task.json b/walnut/schemata/Task.json deleted file mode 100644 index 4f073ba27..000000000 --- a/walnut/schemata/Task.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/obviyus/Controlss/walnut/schemata/Task.json", - "title": "AliECS Task Template", - "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The unique identifier for a task", - "type": "string" - }, - "control": { - "type": "object", - "title": "Type of control", - "properties": { - "mode": { - "type": "string", - "title": "Mode", - "enum": [ - "fairmq", - "basic", - "direct" - ] - } - } - }, - "wants": { - "description": "CPU, memory and ports required for task execution", - "type": "object", - "properties": { - "cpu": { - "description": "Amount of CPU", - "type": "number" - }, - "memory": { - "description": "Amount of Memory", - "type": "number" - }, - "ports": { - "description": "Range of ports to use", - "type": "string" - } - } - }, - "connect": { - "title": "Connect", - "type": "array", - "items": { - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - }, - "transport": { - "type": "string", - "enum": [ - "default", - "zeromq", - "nanomsg", - "shmem" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "command": { - "type": "object", - "title": "Command for Task execution", - "required": [ - "value" - ], - "properties": { - "env": { - "type": "array", - "title": "Environment", - "items": { - "type": "string" - } - }, - "shell": { - "type": "boolean" - }, - "value": { - "type": "string" - }, - "arguments": { - "type": "array", - "title": "Arguments", - "items": { - "type": "string" - } - }, - "user": { - "type": "string" - } - } - } - } -} diff --git a/walnut/schemata/Workflow.json b/walnut/schemata/Workflow.json deleted file mode 100644 index f58beeb9a..000000000 --- a/walnut/schemata/Workflow.json +++ /dev/null @@ -1,248 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/obviyus/Control/walnut/schemata/Workflow.json", - "title": "AliECS Workflow Template", - "description": "Workflow template schema for AliECS", - "definitions": { - "roles": { - "title": "Roles", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "Parametrized name of an iterator role", - "type": "string" - }, - "enabled": { - "type": "string" - }, - "for": { - "description": "Amount of Memory", - "type": "object", - "properties": { - "begin": { - "title": "Begin port", - "type": "string" - }, - "end": { - "title": "End port", - "type": "string" - }, - "var": { - "title": "variables", - "type": "string" - }, - "range": { - "title": "Port ranges", - "type": "string" - } - }, - "oneOf": [ - { - "required": [ - "begin", - "end", - "var" - ] - }, - { - "required": [ - "range", - "var" - ] - } - ] - }, - "constraints": { - "type": "array", - "properties": { - "attribute": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "vars": { - "type": "object", - "description": "User defined variables" - }, - "connect": { - "title": "Connect", - "type": "array", - "items": { - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - } - }, - "required": [ - "name", - "type", - "target" - ] - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - }, - "transport": { - "type": "string", - "enum": [ - "default", - "zeromq", - "nanomsg", - "shmem" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "task": { - "title": "Task entry", - "type": "object", - "required": [ - "load" - ], - "properties": { - "load": { - "title": "Task template to load", - "type": "string" - }, - "trigger": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "critical": { - "type": "boolean" - } - } - }, - "roles": { - "type": "array", - "items": { - "$ref": "#/definitions/roles" - } - } - }, - "oneOf": [ - { - "required": [ - "roles" - ] - }, - { - "required": [ - "task" - ] - } - ] - } - }, - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The name of the root role, which happens to be an aggregator role.", - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "$ref": "#/definitions/roles" - } - }, - "defaults": { - "type": "object", - "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything" - }, - "vars": { - "type": "object", - "title": "User variable definitions", - "description": "Variable definitions: vars, override defaults, overridden by user vars." - } - } -} diff --git a/walnut/schemata/includeschemata.go b/walnut/schemata/includeschemata.go deleted file mode 100644 index a5098b0f4..000000000 --- a/walnut/schemata/includeschemata.go +++ /dev/null @@ -1,61 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package schemata - -import ( - "fmt" - "io" - "io/ioutil" - "os" - "strings" -) - -// Reads all .json files in the current folder -// and encodes them as strings literals in schemata.go -func generateSchema() (err error) { - - fs, err := ioutil.ReadDir(".") - if err != nil { - return fmt.Errorf("error opening Schema: %w", err) - } - - out, err := os.Create("schemata.go") - if err != nil { - return fmt.Errorf("error creating schemata.go: %w", err) - } - - out.Write([]byte("package schemata \n\nconst (\n")) - for _, f := range fs { - if strings.HasSuffix(f.Name(), ".json") { - out.Write([]byte(strings.TrimSuffix(f.Name(), ".json") + " = `\n")) - f, _ := os.Open(f.Name()) - io.Copy(out, f) - out.Write([]byte("`\n")) - } - } - out.Write([]byte(")\n")) - - return nil -} diff --git a/walnut/schemata/includeschemata_test.go b/walnut/schemata/includeschemata_test.go deleted file mode 100644 index 9574388d2..000000000 --- a/walnut/schemata/includeschemata_test.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package schemata - -import "testing" - -func TestSchemaGeneration(t *testing.T) { - t.Run("Testing Schema Generation", func(t *testing.T) { - generateSchema() - }) -} diff --git a/walnut/schemata/schemata.go b/walnut/schemata/schemata.go deleted file mode 100644 index 1e6c96aea..000000000 --- a/walnut/schemata/schemata.go +++ /dev/null @@ -1,442 +0,0 @@ -package schemata - -const ( - Task = ` -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/obviyus/Controlss/walnut/schemata/Task.json", - "title": "AliECS Task Template", - "description": "A task template gets loaded into a task.Class object and its template expressions are resolved. Such a task.Class represents a set of tasks (processes) that can be run throughout the cluster in the same way (i.e. with the same command line invocation).", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The unique identifier for a task", - "type": "string" - }, - "control": { - "type": "object", - "title": "Type of control", - "properties": { - "mode": { - "type": "string", - "title": "Mode", - "enum": [ - "fairmq", - "basic", - "direct" - ] - } - } - }, - "wants": { - "description": "CPU, memory and ports required for task execution", - "type": "object", - "properties": { - "cpu": { - "description": "Amount of CPU", - "type": "number" - }, - "memory": { - "description": "Amount of Memory", - "type": "number" - }, - "ports": { - "description": "Range of ports to use", - "type": "string" - } - } - }, - "connect": { - "title": "Connect", - "type": "array", - "items": { - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - }, - "transport": { - "type": "string", - "enum": [ - "default", - "zeromq", - "nanomsg", - "shmem" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "command": { - "type": "object", - "title": "Command for Task execution", - "required": [ - "value" - ], - "properties": { - "env": { - "type": "array", - "title": "Environment", - "items": { - "type": "string" - } - }, - "shell": { - "type": "boolean" - }, - "value": { - "type": "string" - }, - "arguments": { - "type": "array", - "title": "Arguments", - "items": { - "type": "string" - } - }, - "user": { - "type": "string" - } - } - } - } -} -` - Workflow = ` -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "$id": "https://github.com/obviyus/Control/walnut/schemata/Workflow.json", - "title": "AliECS Workflow Template", - "description": "Workflow template schema for AliECS", - "definitions": { - "roles": { - "title": "Roles", - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "Parametrized name of an iterator role", - "type": "string" - }, - "enabled": { - "type": "string" - }, - "for": { - "description": "Amount of Memory", - "type": "object", - "properties": { - "begin": { - "title": "Begin port", - "type": "string" - }, - "end": { - "title": "End port", - "type": "string" - }, - "var": { - "title": "variables", - "type": "string" - }, - "range": { - "title": "Port ranges", - "type": "string" - } - }, - "oneOf": [ - { - "required": [ - "begin", - "end", - "var" - ] - }, - { - "required": [ - "range", - "var" - ] - } - ] - }, - "constraints": { - "type": "array", - "properties": { - "attribute": { - "type": "string" - }, - "value": { - "type": "string" - } - } - }, - "vars": { - "type": "object", - "description": "User defined variables" - }, - "connect": { - "title": "Connect", - "type": "array", - "items": { - "properties": { - "name": { - "description": "Name of the inbound channel", - "type": "string" - }, - "target": { - "description": "The target entry is a string, with some tree walk functions available for traversing the control tree.", - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - } - }, - "required": [ - "name", - "type", - "target" - ] - } - }, - "bind": { - "type": "array", - "title": "Bind array schema", - "items": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "type": "string", - "enum": [ - "pub", - "sub", - "push", - "pull" - ] - }, - "sndBufSize": { - "title": "Send Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rcvBufSize": { - "title": "Receive Buffer Size", - "type": [ - "integer", - "string" - ] - }, - "rateLogging": { - "title": "Rate Logging", - "type": [ - "integer", - "string" - ] - }, - "transport": { - "type": "string", - "enum": [ - "default", - "zeromq", - "nanomsg", - "shmem" - ] - } - }, - "required": [ - "name", - "type" - ] - } - }, - "task": { - "title": "Task entry", - "type": "object", - "required": [ - "load" - ], - "properties": { - "load": { - "title": "Task template to load", - "type": "string" - }, - "trigger": { - "type": "string" - }, - "timeout": { - "type": "string" - }, - "critical": { - "type": "boolean" - } - } - }, - "roles": { - "type": "array", - "items": { - "$ref": "#/definitions/roles" - } - } - }, - "oneOf": [ - { - "required": [ - "roles" - ] - }, - { - "required": [ - "task" - ] - } - ] - } - }, - "type": "object", - "required": [ - "name" - ], - "properties": { - "name": { - "description": "The name of the root role, which happens to be an aggregator role.", - "type": "string" - }, - "roles": { - "type": "array", - "items": { - "$ref": "#/definitions/roles" - } - }, - "defaults": { - "type": "object", - "title": "Variable definitions", - "description": "Variable definitions: defaults, overridden by anything" - }, - "vars": { - "type": "object", - "title": "User variable definitions", - "description": "Variable definitions: vars, override defaults, overridden by user vars." - } - } -} -` -) diff --git a/walnut/schemata/task_test.yaml b/walnut/schemata/task_test.yaml deleted file mode 100644 index 7c7b194f4..000000000 --- a/walnut/schemata/task_test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: readout # read by workflow -defaults: - readout_cfg_uri: "file:/home/flp/readout.cfg" -control: - mode: direct -wants: - cpu: 0.15 - memory: 128 -bind: - - name: readout - type: push - rateLogging: "1" - addressing: ipc - transport: shmem -properties: {} -command: - env: [] - shell: true - arguments: - - "{{ readout_cfg_uri }}" - value: >- - eval `aliswmod load Readout Control-OCCPlugin` && - o2-readout-exe - diff --git a/walnut/schemata/validate.go b/walnut/schemata/validate.go deleted file mode 100644 index ec9545b60..000000000 --- a/walnut/schemata/validate.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package schemata - -import ( - "errors" - "fmt" - "os" - - "gopkg.in/yaml.v3" - - "github.com/xeipuuv/gojsonschema" -) - -// Validate takes a YAML file and format then perform schema validation -// on the file against the schema specified (either workflow or task) -func Validate(input []byte, format string) (err error) { - - var inputData interface{} - if err := yaml.Unmarshal(input, &inputData); err != nil { - return fmt.Errorf("Unmarshaling YAML failed: %w", err) - } - - var schema string - switch format { - case "task": - schema = Task - case "workflow": - schema = Workflow - default: - err = errors.New("format not task or workflow") - return fmt.Errorf("Failed to obtain schema: %w", err) - } - - schemaLoader := gojsonschema.NewStringLoader(schema) // load schema - documentLoader := gojsonschema.NewGoLoader(inputData) // load unmarhsaled YAML - - result, err := gojsonschema.Validate(schemaLoader, documentLoader) - if err != nil { - return fmt.Errorf("Error loading data: %w", err) - } - - if result.Valid() { - os.Exit(0) - } else { - return fmt.Errorf("%s", result.Errors()[0]) - } - - return nil -} diff --git a/walnut/schemata/validate_test.go b/walnut/schemata/validate_test.go deleted file mode 100644 index 064d82fb9..000000000 --- a/walnut/schemata/validate_test.go +++ /dev/null @@ -1,48 +0,0 @@ -/* - * === This file is part of ALICE O² === - * - * Copyright 2020 CERN and copyright holders of ALICE O². - * Author: Ayaan Zaidi - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - * - * In applying this license CERN does not waive the privileges and - * immunities granted to it by virtue of its status as an - * Intergovernmental Organization or submit itself to any jurisdiction. - */ - -package schemata - -import ( - "io/ioutil" - "testing" -) - -func TestTaskSchemaValidation(t *testing.T) { - t.Run("Testing Validation with Task", func(t *testing.T) { - testfile, _ := ioutil.ReadFile("task_test.yaml") - err := Validate(testfile, "task") - if err != nil { - t.Errorf("task validation failed: %v", err) - } - }) - - t.Run("Testing Validation with Workflow", func(t *testing.T) { - testfile, _ := ioutil.ReadFile("workflow_test.yaml") - err := Validate(testfile, "workflow") - if err != nil { - t.Errorf("workflow validation failed: %v", err) - } - }) -} diff --git a/walnut/schemata/workflow_test.yaml b/walnut/schemata/workflow_test.yaml deleted file mode 100644 index 9ae8a1d99..000000000 --- a/walnut/schemata/workflow_test.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: readout-stfb -roles: - - name: host-{{ it }} - for: - range: "{{ hosts }}" - var: it - vars: - readout_cfg_uri: "file:/home/flp/readout_stfb_emu.cfg" - constraints: - - attribute: machine_id - value: "{{ it }}" - roles: - - name: "readout" - task: - load: readout - - name: "stfb" - connect: - - name: readout - type: pull - target: "{{ Parent().Path }}.readout:readout" - rateLogging: "1" - task: - load: stfbuilder-nooutput - \ No newline at end of file From 7b43fb61bc052a8498e0fc7d1bd7e1f829ec28cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 8 May 2025 15:32:19 +0200 Subject: [PATCH 2139/2352] [core] reset currentRunNumber in GO_ERROR instead of transition_startactivity --- core/environment/environment.go | 18 ++++++++++-------- core/environment/transition_startactivity.go | 2 -- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index cbfb16b2e..c9d6aeb7d 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -614,14 +614,6 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, errorMsg = e.Err.Error() } - if e.Event == "STOP_ACTIVITY" { - // If the event is STOP_ACTIVITY, we remove the active run number after all hooks are done. - env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) - env.currentRunNumber = 0 - env.workflow.GetVars().Del("run_number") - env.workflow.GetVars().Del("runNumber") - } - // publish transition step complete event the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ EnvironmentId: env.id.String(), @@ -634,6 +626,16 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) + + if e.Event == "STOP_ACTIVITY" || e.Event == "GO_ERROR" { + // If the event is STOP_ACTIVITY or GO_ERROR, we remove the active run number after all hooks are done. + if env.currentRunNumber != 0 { + env.workflow.GetVars().Set("last_run_number", strconv.Itoa(int(env.currentRunNumber))) + } + env.currentRunNumber = 0 + env.workflow.GetVars().Del("run_number") + env.workflow.GetVars().Del("runNumber") + } }, }, ) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 2af850a3f..8ed1b5fcc 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -81,7 +81,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { // Get a handle to the consolidated var stack of the root role of the env's workflow if wf := env.Workflow(); wf != nil { if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { - // If bookkeeping is enabled and has fetched the LHC fill info, we can acquire it here for _, key := range []string{ "fill_info_fill_number", @@ -118,7 +117,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { - env.currentRunNumber = 0 return tasksStateErrors } From 4af88a54d84224cf82358412232129152e9b18e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 13 May 2025 10:41:55 +0200 Subject: [PATCH 2140/2352] [core] better kafka metrics --- common/event/writer.go | 73 +++++++++++++++++++------------------ common/event/writer_test.go | 3 +- 2 files changed, 39 insertions(+), 37 deletions(-) diff --git a/common/event/writer.go b/common/event/writer.go index 64f9a98fc..7d4c9e511 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -42,9 +42,10 @@ import ( ) var ( - log = logger.New(logrus.StandardLogger(), "event") - KAFKAWRITER = "kafka_writer" - KAFKAPREPARE = "kafka_prepare" + log = logger.New(logrus.StandardLogger(), "event") + KAFKAWRITER = "kafka_writer" + KAFKAPREPARE = "kafka_prepare" + writerBatchsize = 100 ) type Writer interface { @@ -76,7 +77,7 @@ type KafkaWriter struct { toBatchMessagesChan chan kafka.Message messageBuffer FifoBuffer[kafka.Message] // NOTE: we use settable callback in order to be able to test writing of messages via KafkaWriter, without necessity of setting up cluster - writeFunction func([]kafka.Message, *monitoring.Metric) + writeFunction func([]kafka.Message) runningWorkers sync.WaitGroup batchingLoopDoneCh chan struct{} } @@ -94,19 +95,30 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { Topic: string(topic), Balancer: &kafka.Hash{}, AllowAutoTopicCreation: true, + BatchTimeout: time.Millisecond, // we are batching the messages ourselves and writing sync into writer, so long timeout is not necessary + BatchSize: writerBatchsize, }, - toBatchMessagesChan: make(chan kafka.Message, 10000), + toBatchMessagesChan: make(chan kafka.Message, 100000), messageBuffer: NewFifoBuffer[kafka.Message](), runningWorkers: sync.WaitGroup{}, batchingLoopDoneCh: make(chan struct{}, 1), } - writer.writeFunction = func(messages []kafka.Message, metric *monitoring.Metric) { - defer monitoring.TimerNS(metric)() + writer.writeFunction = func(messages []kafka.Message) { + metric := writer.newMetric(KAFKAWRITER) + metric.SetFieldUInt64("messages_sent", uint64(len(messages))) + metric.SetFieldUInt64("messages_failed", 0) + + metricDuration := writer.newMetric(KAFKAWRITER) + defer monitoring.SendHistogrammable(&metricDuration) + defer monitoring.TimerNS(&metricDuration)() + if err := writer.WriteMessages(context.Background(), messages...); err != nil { metric.SetFieldUInt64("messages_failed", uint64(len(messages))) log.Errorf("failed to write %d messages to kafka with error: %v", len(messages), err) } + + monitoring.Send(&metric) } go writer.writingLoop() @@ -138,18 +150,11 @@ func (w *KafkaWriter) writingLoop() { w.runningWorkers.Done() return default: - messagesToSend := w.messageBuffer.PopMultiple(100) + messagesToSend := w.messageBuffer.PopMultiple(uint(writerBatchsize)) if len(messagesToSend) == 0 { continue } - - metric := w.newMetric(KAFKAWRITER) - metric.SetFieldUInt64("messages_sent", uint64(len(messagesToSend))) - metric.SetFieldUInt64("messages_failed", 0) - - w.writeFunction(messagesToSend, &metric) - - monitoring.Send(&metric) + w.writeFunction(messagesToSend) } } } @@ -241,25 +246,23 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time metric := w.newMetric(KAFKAPREPARE) - func() { - defer monitoring.TimerNS(&metric)() - wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Errorf("Failed to convert event to kafka event: %s", err.Error()) - return - } + defer monitoring.SendHistogrammable(&metric) + defer monitoring.TimerNS(&metric)() - message, err := kafkaEventToKafkaMessage(wrappedEvent, key) - if err != nil { - log.WithField("event", e). - WithField("level", infologger.IL_Support). - Errorf("Failed to convert kafka event to message: %s", err.Error()) - return - } - w.toBatchMessagesChan <- message - }() + wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert event to kafka event: %s", err.Error()) + return + } - monitoring.Send(&metric) + message, err := kafkaEventToKafkaMessage(wrappedEvent, key) + if err != nil { + log.WithField("event", e). + WithField("level", infologger.IL_Support). + Errorf("Failed to convert kafka event to message: %s", err.Error()) + return + } + w.toBatchMessagesChan <- message } diff --git a/common/event/writer_test.go b/common/event/writer_test.go index fc5be6904..48b9fd8b2 100644 --- a/common/event/writer_test.go +++ b/common/event/writer_test.go @@ -27,7 +27,6 @@ package event import ( "sync" - "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" @@ -47,7 +46,7 @@ var _ = Describe("Writer", func() { writer.runningWorkers = sync.WaitGroup{} writer.batchingLoopDoneCh = make(chan struct{}, 1) - writer.writeFunction = func(messages []kafka.Message, _ *monitoring.Metric) { + writer.writeFunction = func(messages []kafka.Message) { Expect(len(messages)).To(Equal(1)) event := &pb.Event{} proto.Unmarshal(messages[0].Value, event) From 8e94f75fd4264989d11c8fde9e47aed37fd72e61 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 5 May 2025 14:57:32 +0200 Subject: [PATCH 2141/2352] remove the obsolete prototype code --- fpctl/README.md | 268 ---- fpctl/src/TODO.md | 24 - fpctl/src/fpctl | 246 ---- fpctl/src/fpctl.py | 1127 ----------------- fpctl/systemd/system/README.md | 3 - .../system/flpprototype-qcchecker.service.j2 | 11 - .../system/flpprototype-qcchecker@.service.j2 | 13 - .../system/flpprototype-qctask.service.j2 | 13 - .../system/flpprototype-qctask@.service.j2 | 15 - .../system/flpprototype-readout.service.j2 | 10 - .../system/flpprototype-readout@.service.j2 | 10 - fpctl/systemd/system/hugetlbfs.service.j2 | 9 - hacking/example-config.yaml | 62 - 13 files changed, 1811 deletions(-) delete mode 100644 fpctl/README.md delete mode 100644 fpctl/src/TODO.md delete mode 100755 fpctl/src/fpctl delete mode 100755 fpctl/src/fpctl.py delete mode 100644 fpctl/systemd/system/README.md delete mode 100644 fpctl/systemd/system/flpprototype-qcchecker.service.j2 delete mode 100644 fpctl/systemd/system/flpprototype-qcchecker@.service.j2 delete mode 100644 fpctl/systemd/system/flpprototype-qctask.service.j2 delete mode 100644 fpctl/systemd/system/flpprototype-qctask@.service.j2 delete mode 100644 fpctl/systemd/system/flpprototype-readout.service.j2 delete mode 100644 fpctl/systemd/system/flpprototype-readout@.service.j2 delete mode 100644 fpctl/systemd/system/hugetlbfs.service.j2 delete mode 100644 hacking/example-config.yaml diff --git a/fpctl/README.md b/fpctl/README.md deleted file mode 100644 index 30c8b3490..000000000 --- a/fpctl/README.md +++ /dev/null @@ -1,268 +0,0 @@ -# Control - -This repository hosts those parts of the control system for the September 2017 TPC test that aren't already kept in system-configuration. - -## Automatic setup with `fpctl` - -`fpctl` is an FLP prototype setup and control utility. Its goal is to make it easy -to deploy, configure and control an FLP prototype testing stack on one or more -target machines. - -`fpctl` requires CERN CentOS 7, with or without Kerberos authentication. If your source or target systems are not set up with CERN Kerberos authentication, you must enable passwordless login via public key authentication (see [Authentication on the target system](README.md#authentication-on-the-target-system)). - -Currently, in order to install `fpctl` you need access to certain git repositories on CERN GitLab. To gain access, you need to join [the alice-o2-detector-teams e-group](https://e-groups.cern.ch/e-groups/EgroupsSearch.do?searchValue=alice-o2-detector-teams). - -Set the `fpctl` install path and get `fpctl`: -``` -export FPCTL_ROOT_DIR=~/.local -mkdir -p $FPCTL_ROOT_DIR/bin -curl -o $FPCTL_ROOT_DIR/bin/fpctl https://raw.githubusercontent.com/AliceO2Group/Control/master/fpctl/src/fpctl -chmod +x $FPCTL_ROOT_DIR/bin/fpctl -export PATH="$FPCTL_ROOT_DIR/bin:$PATH" -``` - -Add `fpctl` binary directory to PATH (optional but useful): -``` -echo -e '\nexport PATH='"$FPCTL_ROOT_DIR"'/bin:$PATH\n' >> ~/.bashrc -``` - -Setup `fpctl` (if you don't run this it will run anyway the first time you use `fpctl` for some other operation): -``` -fpctl setup -``` -You should now have some repositories in `~/.local/share/fpctl` (or some other directory, depending on your `FPCTL_ROOT_DIR`). The setup routine also takes care of installing things like git and Ansible on your system. - -If you want to deploy FLP prototype on a remote system, you should create an Ansible inventory file in `~/.config/fpctl/inventory`. Otherwise, if you simply wish to deploy all the FLP prototype software on your local machine, you can proceed immediately: -``` -fpctl deploy -``` -If you haven't provided an inventory file, `fpctl` will offer to create one for you. `fpctl` may also offer to configure passwordless sudo, depending on your configuration. The deployment operation may take a while. You will see some Ansible output as everything is installed and configured. - -Start/stop all the tasks (`fpctl` and Ansible take care of doing this in the correct order): -``` -fpctl start -fpctl stop -``` - -You may also choose to only control one of the tasks: -``` -fpctl start readout -fpctl start qctask -fpctl start qcchecker -``` -An instruction like these previous three will start a given task on all the inventory items assigned to it. For instance, if you have two hosts under `[flp-readout]` in your inventory, `fpctl start readout` will start two processes, one for each machine. Similarly, `fpctl stop readout` will stop them all. - -Occasionally you might want to run `fpctl update` to pull any changes to the deployment data and to the `fpctl` tool itself. - -To deploy any configuration changes to your FLP prototype systems without reinstalling everything, run: -``` -fpctl configure -``` -It is a good idea to then restart all the FLP prototype processes to apply the new configuration. - -For more information, check `fpctl --help`. - -## fpctl Configuration and Inventory - -`fpctl` uses standard Ansible inventory files. The default inventory file path is `~/.config/fpctl/inventory`. An alternative inventory file can be passed to `fpctl` with the option `-i` or `--inventory`. A `fpctl`/Ansible inventory file must provide one or more hosts for each of the following five machine groups: - -- `flp-readout` -- `qc-task` -- `qc-checker` -- `qc-repository` -- `infologger-server` - -A host can belong to more than one group, and in fact, the default inventory that `fpctl deploy` can generate automatically looks like this: - -``` -[flp-readout] -localhost ansible_connection=local -[qc-task] -localhost ansible_connection=local -[qc-checker] -localhost ansible_connection=local -[qc-repository] -localhost ansible_connection=local -[infologger-server] -localhost ansible_connection=local -``` - -The whitespace-separated key-value pairs after the hostname are per-host variables. These can override Ansible settings, as well as any variable internally used by `fpctl`'s Ansible playbooks. For example: - -- `ansible_become_method=ksu` - use `ksu` instead of `sudo` for acquiring privileges on the target system (useful on Kerberos setups); -- `small_hugepages_count`/`large_hugepages_count` - number of hugepages allocated for the readout process; -- `flpprototype_qc_mysql_root_password` - the MariaDB root password of an existing MariaDB instance for the `qc-repository` (only necessary if a password exists), -- `ansible_connection=local` - run everything locally instead of using SSH (only applies to `localhost`) - -Here's an example of an inventory file with some remote machines, including two readout machines, one QC checker machine, and one machine with a QC task and a QC repository: - -``` -[flp-readout] -my-readout-1.cern.ch ansible_become_method=ksu small_hugepages_count=256 -my-readout-2.cern.ch ansible_become_method=ksu small_hugepages_count=256 -[qc-task] -my-qctask.cern.ch ansible_become_method=ksu -[qc-checker] -my-qcchecker.cern.ch -[qc-repository] -my-qctask.cern.ch ansible_become_method=ksu -[infologger-server] -my-infologger.cern.ch -``` - -For more information on inventory files, see [the Ansible Inventory documentation](http://docs.ansible.com/ansible/intro_inventory.html). - -## Quick start manual setup with Ansible - -Assuming a default CC7 setup with Kerberos authentication. If your source or target systems are **not** set up with CERN Kerberos authentication, you must enable passwordless login via public key authentication (see [Authentication on the target system](#authentication-on-the-target-system)). - -Create the inventory file: -``` -echo -e "[flp-readout]\nlocalhost ansible_connection=local\n[qc-task]\nlocalhost ansible_connection=local\n[qc-checker]\nlocalhost ansible_connection=local\n[qc-repository]\nlocalhost ansible_connection=local\n[infologger-server]\nlocalhost ansible_connection=local\n" > myinventory -``` -Replace `localhost` with the hostname of your target machine (and remove the `ansible_connection=local` variable which only applies to `localhost`). - -Install Ansible, clone the repos and deploy: -``` -sudo yum -y install git ansible -git clone https://github.com/AliceO2Group/Control.git -git clone https://gitlab.cern.ch/AliceO2Group/system-configuration.git -sudo sed -i "/^# control_path_dir =/s/.*/control_path_dir = \/tmp\/.ansible\/cp/" /etc/ansible/ansible.cfg -sudo sed -i "/^#host_key_checking =/s/.*/host_key_checking = False/" /etc/ansible/ansible.cfg -cd system-configuration/ansible -ansible-playbook -i ../../myinventory -s site.yml -e "flpprototype_systemd=../../Control/fpctl/systemd/system" -``` -The `git clone` statements above assume git over HTTPS. If you use SSH public key authentication with GitHub and/or GitLab, you may do the following instead: -``` -git clone git@github.com:AliceO2Group/Control.git -git clone ssh://git@gitlab.cern.ch:7999/AliceO2Group/system-configuration.git -``` - -## Full guide for Ansible deployment - -### Setting up Ansible - -To use this, you need to clone this repo, as well as the system-configuration repo which contains the Ansible configuration. - -``` -$ sudo yum install git ansible -$ git clone git@github.com:AliceO2Group/Control.git -$ git clone ssh://git@gitlab.cern.ch:7999/AliceO2Group/system-configuration.git -``` - -You should also create an inventory file which points to one or more fresh systems. Here's what an inventory file should look like: -``` -[flp-readout] -my-readout-testing-machine.cern.ch -my-other-readout-testing-machine.cern.ch -[qc-task] -... -[qc-checker] -... -[qc-repository] -... -[infologger-server] -... -``` - -The target system should accept passwordless SSH authentication (Kerberos, public key). This guide assumes that the target system is a clean CC7 instance on CERN OpenStack. - -If you are using Kerberos login for Ansible (default if you run CC7 with your CERN user account), you must also add an option in your inventory file to do passwordless privilege escalation with `ksu` instead of `sudo`, as the latter does not support `NOPASSWD` with Kerberos. - -``` -[flp-readout] -cc7-testing-machine.cern.ch ansible_become_method=ksu -[qc-task] -cc7-testing-machine.cern.ch ansible_become_method=ksu -[qc-checker] -cc7-testing-machine.cern.ch ansible_become_method=ksu -[qc-repository] -cc7-testing-machine.cern.ch ansible_become_method=ksu -[infologger-server] -cc7-testing-machine.cern.ch ansible_become_method=ksu -``` - -### Ansible and AFS - -If your home directory is *not* on AFS, skip to the next section. - -If you are running a default CC7 configuration with your home directory on AFS on your control machine, you must change the `control_path_dir` value in `/etc/ansible/ansible.cfg` to **any path that is not on AFS**. For instance, `/tmp/.ansible/cp` is a good value that's already suggested in the configuration file, so all you have to do is uncomment it. - -The reason for this is that Ansible uses SSH multiplexing to avoid creating new TCP connections for each SSH session to a target machine after the first one. This improves performance, but requires a socket file, which Ansible places in `~/.ansible/cp` by default. AFS doesn't like this, and Ansible's SSH fails with an "Operation not permitted" error. - -For more information, see https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing#Errors_Preventing_Multiplexing. - -### Authentication on the target system - -If you are running CC7 with your CERN user account and Kerberos authentication on both your system and the target system, skip to the next section (but be sure to set `ksu` as privilege escalation tool in your inventory). - -Before running Ansible commands on a target system, a way is needed for Ansible to log in and perform tasks which usually require root privileges. As far as the target system is concerned, you should make sure that: -* either the target system allows SSH login as root (configuration file `/etc/ssh/sshd_config`), accepts public key authentication for root, and Ansible is run as root (by appending `-u root` to Ansible commands); OR -* the target system accepts public key authentication for the unprivileged user, and this user is `sudo`-enabled with `NOPASSWD` on the target system. - -Ideally one would use an unprivileged user, and keep SSH root login disabled (default on CC7). If this is the case, the user on the target system must be in the group `wheel`. The command `# gpasswd -a username wheel` adds a user to the `wheel` group. To allow passwordless `sudo` the line `%wheel ALL=(ALL) NOPASSWD: ALL` should be present and uncommented in the sudoers configuration file. To check this, run `# visudo` as root on the target system. - -To enable public key authentication on the target system, the following steps are needed. - -1) Make sure you have a public key on the control machine (i.e. your machine), it is usually called `~/.ssh/id_rsa.pub` or `~/.ssh/id_dsa.pub`. If not, you can create one with `ssh-keygen`. -2) Add the contents of your `id_rsa.pub` (or similar) to `~/.ssh/authorized_keys` *on the target system*. To do that, either SSH into it and copy the contents, or run `ssh-copy-id your_username@target_hostname` on the control machine. -3) Since you are now relying on SSH public key authentication, you must make sure that your inventory file does not contain `ansible_become_method=ksu`, as this only works with Kerberos. -4) You must also make sure that the unprivileged user on the target system is a member of the `wheel` group (`# gpasswd -a username wheel`) and that the line `%wheel ALL=(ALL)       NOPASSWD: ALL` is uncommented in the `sudoers` file (editable with `visudo`). - -For more information on SSH public key authentication, see https://help.ubuntu.com/community/SSH/OpenSSH/Keys. - -### Running ansible-playbook - -Assuming the current directory is the one with Ansible's `site.yml` (directory `ansible` in the system-configuration repository) and assuming this repository (Control) is cloned at `~/Control`, this is the single step for deployment, configuration and execution (adjust the paths as needed): - -``` -$ ansible-playbook -i path/to/inventory/file -s site.yml -e "flpprototype_systemd=~/Control/fpctl/systemd/system" -``` - -This will install `alisw-flpproto` with all its dependencies on the machines from the relevant inventory file and deploy the dummy configuration files. It will also deploy some Systemd units for readout and QC. - -Add `-t `*`tag`*` ` where *`tag`* is `installation`, `configuration` or `execution` to only run one of these phases. - -### Things to do on the target machine - -View the logs for a service: - -`$ sudo journalctl -u flpprototype-readout` - -`$ sudo journalctl -u flpprototype-qctask` - -`$ sudo journalctl -u flpprototype-qcchecker` - -Control the service: - -`$ sudo systemctl start flpprototype-readout` - -`$ sudo systemctl status flpprototype-readout` - -`$ sudo systemctl stop flpprototype-readout` - -### Parametrized services - -Systemd templates allow the user to pass arguments when starting a unit. - -Start a readout service with a specific configuration (by default, configuration files are deployed to `/etc/flpprototype.d`): - -`$ sudo systemctl start flpprototype-readout@configDummy` - -The QC task service is similar, but it requires two parameters (the task name and the configuration file name): - -`$ sudo systemctl start flpprototype-qctask@myTask_1@example-default` - -### Things to do on the controller machine - -Query or control the flpprototype-readout Systemd service state on all machines without going through the Ansible role: - -`$ ansible -b -i myinventoryfile all -a "systemctl start flpprototype-readout"` - -`$ ansible -b -i myinventoryfile all -a "systemctl status flpprototype-readout"` - -`$ ansible -b -i myinventoryfile all -a "systemctl stop flpprototype-readout"` - -Example with QC task, parametrized: - -`$ ansible -b -i myinventoryfile all -a "systemctl status flpprototype-qctask@myTask_1@example-default"` diff --git a/fpctl/src/TODO.md b/fpctl/src/TODO.md deleted file mode 100644 index 94de1e339..000000000 --- a/fpctl/src/TODO.md +++ /dev/null @@ -1,24 +0,0 @@ -# FlpPrototype control wrapper design - -* Initial instructions for installing the script would include wget bash script into a bin - path (like /usr/local/bin), or into ~/bin and adding this to PATH. -* Initial shell script fpctl: if python3 exists and if repos are set up, call - ~/.local/fpctl/Control/fpctl.py. Therefore, fpctl is always the entry point. - Else, if any of the requirements for running the actual Python wrapper are not met, do - stuff like installing python34, git, ansible, etc., git clone Control and - system-configuration, creating ~/.config/fpctl, ... -* Instruct people to add their SSH keys to gitlab.cern.ch in order for the script to work. - On error bail out (this should only happen on systems other than CC7). -* The inventory file is assumed to be ~/.config/fpctl/inventory, this can be overridden - as -i /path/to/inventory. -* Syntax ideas: - * fpctl update/up - * fpctl deploy/de - * fpctl configure/co - * fpctl run [machinename] [command] // wrapper for ansible interactive command - * fpctl start [taskname] - * fpctl status [taskname] - * fpctl stop [taskname] - * fpctl log [taskname] - * fpctl help -* Also do documentation for inventory. diff --git a/fpctl/src/fpctl b/fpctl/src/fpctl deleted file mode 100755 index 170c54824..000000000 --- a/fpctl/src/fpctl +++ /dev/null @@ -1,246 +0,0 @@ -#!/usr/bin/env bash - -FPCTL_CONFIG_DIR="$HOME/.config/fpctl" -if [[ -z ${FPCTL_ROOT_DIR} ]]; then - FPCTL_ROOT_DIR="$HOME/.local" -fi -FPCTL_DATA_DIR="$FPCTL_ROOT_DIR/share/fpctl" - -C_WARN="\033[1;33m==> WARNING: \033[0m" -C_YELL="\033[1;33m==> \033[0m" -C_QUEST=$C_YELL -C_ERR="\033[1;31m==> ERROR: \033[0m" -C_RED="\033[1;31m==> \033[0m" -C_MSG="\033[1;32m==> \033[0m" -C_ITEM="\033[1;34m -> \033[0m" - -bail() -{ - echo -e "${C_ERR}$1" - echo -e "${C_RED}fpctl will now quit." -} - -message() -{ - echo -e "${C_MSG}$1" -} - -check_dependencies() -{ - message "Checking dependencies..." - which pip3 &>/dev/null - HAS_PYTHON3="$?" - - which git &>/dev/null - HAS_GIT="$?" - - which ansible &>/dev/null - HAS_ANSIBLE="$?" - - which ssh &>/dev/null - HAS_OPENSSH="$?" - - python3 -c "import colorama" &>/dev/null - HAS_COLORAMA="$?" - - python3 -c "import terminaltables" &>/dev/null - HAS_TERMINALTABLES="$?" - - if [[ "$HAS_PYTHON3" != "0" || - "$HAS_GIT" != "0" || - "$HAS_ANSIBLE" != "0" || - "$HAS_OPENSSH" != "0" || - "$HAS_COLORAMA" != "0" || - "$HAS_TERMINALTABLES" != "0" ]]; then - message "Installing dependencies..." - sudo yum -y -q install python34 python34-pip ansible git openssh-clients - if [[ "$?" != 0 ]]; then - bail $'could not install dependencies. To install the required packages manually, try running the following command \033[1mas root\033[0m:\nyum install python34 ansible git openssh-clients' - exit 5 - fi - sudo su -c "yes|pip3 install colorama terminaltables" - if [[ "$?" != 0 ]]; then - bail $'could not install dependencies. To install the required packages manually, try running the following command \033[1mas root\033[0m:\npip3 install colorama terminaltables' - exit 5 - fi - fi -} - -configure_ansible() -{ - /usr/bin/cp -f /etc/ansible/ansible.cfg $FPCTL_CONFIG_DIR - sed -i "/^# control_path_dir =/s/.*/control_path_dir = \/tmp\/.ansible\/cp/" $FPCTL_CONFIG_DIR/ansible.cfg - sed -i "/^#host_key_checking =/s/.*/host_key_checking = False/" $FPCTL_CONFIG_DIR/ansible.cfg - # NOTE: the following line enables SSH pipelining to improve performance. This is ok - # on CC7 since its sudoers configuration does not contain "requiretty", but - # might fail miserably on other target distros. - sed -i "/^#pipelining =/s/.*/pipelining = True/" $FPCTL_CONFIG_DIR/ansible.cfg - # NOTE: another potential performance gain. With this line we ask Ansible to keep - # idle SSH connections active for 3 minutes before closing them. - sed -i "/^connect_timeout =/s/.*/connect_timeout = 180/" $FPCTL_CONFIG_DIR/ansible.cfg - sed -i "\|^#fact_caching =|s|.*|fact_caching = jsonfile\nfact_caching_connection = $FPCTL_DATA_DIR/ansible_cache|" $FPCTL_CONFIG_DIR/ansible.cfg -} - -setup() -{ - # (1) SUPPORTED OS - message "Checking for supported operating system..." - uname -r | grep -q el7 - IS_KERNEL_EL7="$?" - - lsb_release -d | grep -q "CentOS Linux release 7" - IS_LSB_CENTOS7="$?" - - if [[ ! ($IS_KERNEL_EL7 && $IS_LSB_CENTOS7) ]]; then - echo -e "${C_WARN}unsupported operating system detected." - echo -e "${C_YELL}The reference platform for fpctl is CERN CentOS 7. fpctl will continue, but if issues arise you're on your own." - fi - - # (2) DEPENDENCIES - check_dependencies - - # (3) DIRECTORIES - message "Setting up directories..." - E_BAD_PATH=3 - if [[ ! -d $FPCTL_CONFIG_DIR ]]; then - message "Creating configuration directory at $FPCTL_CONFIG_DIR..." - mkdir -p $FPCTL_CONFIG_DIR - if [[ "$?" != 0 ]]; then - bail "cannot create fpctl configuration directory: $FPCTL_CONFIG_DIR." - exit $E_BAD_PATH - fi - fi - if [[ ! -w $FPCTL_CONFIG_DIR ]]; then - bail "configuration directory $FPCTL_CONFIG_DIR is not writable." - exit $E_BAD_PATH - fi - - if [[ ! -d $FPCTL_DATA_DIR ]]; then - message "Creating data directory at $FPCTL_DATA_DIR..." - mkdir -p $FPCTL_DATA_DIR - if [[ "$?" != 0 ]]; then - bail "cannot create fpctl data directory: $FPCTL_DATA_DIR." - exit $E_BAD_PATH - fi - fi - if [[ ! -w $FPCTL_DATA_DIR ]]; then - bail "data directory $FPCTL_DATA_DIR is not writable." - exit $E_BAD_PATH - fi - - configure_ansible - - # (4) GIT REPOSITORIES - message "Fetching fpctl data and system configuration..." - FPCTL_CONTROL_REPOSITORY_SSH="git@github.com:AliceO2Group/Control.git" - FPCTL_CONTROL_REPOSITORY_HTTPS="https://github.com/AliceO2Group/Control.git" - FPCTL_CONTROL_REPOSITORY_NAME="GitHub" - FPCTL_ANSIBLE_REPOSITORY_SSH="ssh://git@gitlab.cern.ch:7999/AliceO2Group/system-configuration.git" - FPCTL_ANSIBLE_REPOSITORY_HTTPS="https://gitlab.cern.ch/AliceO2Group/system-configuration.git" - FPCTL_ANSIBLE_REPOSITORY_NAME="CERN GitLab" - - git_clone() - { - SSH_URL="$1" - HTTPS_URL="$2" - KEYS_URL="$3" - DEST_PATH="$4" - REPO_PROVIDER="$5" - - if [[ -d "$DEST_PATH" ]]; then - while true; do - echo -ne "${C_QUEST}${DEST_PATH} already exists. Overwrite [y/n]?\n${C_QUEST}------------------------------------\n${C_QUEST}" - read yn - case $yn in - [Yy]* ) rm -rf "$DEST_PATH" &>/dev/null; break;; - [Nn]* ) message "Skipping repository setup..."; return 0;; - * ) echo -e "${C_QUEST}Please answer yes or no [y/n].";; - esac - done - fi - git clone "$SSH_URL" "$DEST_PATH" - if [[ "$?" != 0 ]]; then - echo -e "${C_WARN}cannot fetch system-configuration repository via SSH. Your SSH key must be listed on $KEYS_URL for this to work.\n${C_YELL}Falling back to HTTPS, you will be prompted for your $REPO_PROVIDER credentials." - git clone "$HTTPS_URL" "$DEST_PATH" - if [[ "$?" != 0 ]]; then - exit 4 - fi - fi - } - - git_clone $FPCTL_ANSIBLE_REPOSITORY_SSH $FPCTL_ANSIBLE_REPOSITORY_HTTPS "https://gitlab.cern.ch/profile/keys" "$FPCTL_DATA_DIR/system-configuration" "${FPCTL_ANSIBLE_REPOSITORY_NAME}" - if [[ "$?" != 0 ]]; then - bail "could not fetch git repository system-configuration. Please make sure that your CERN credentials are correct, and that you are a member of the alice-o2-detector-teams e-group (https://e-groups.cern.ch/e-groups/EgroupsSearch.do?searchValue=alice-o2-detector-teams)." - exit $? - fi - git_clone $FPCTL_CONTROL_REPOSITORY_SSH $FPCTL_CONTROL_REPOSITORY_HTTPS "https://github.com/settings/keys" "$FPCTL_DATA_DIR/Control" "${FPCTL_CONTROL_REPOSITORY_NAME}" - if [[ "$?" != 0 ]]; then - bail "could not fetch git repository Control. Please make sure that your GitHub credentials are correct." - exit $? - fi -} - -update() -{ - message "Updating fpctl..." - cd $FPCTL_DATA_DIR/Control && git pull --rebase - if [[ "$?" != 0 ]]; then - message "Cannot update git repository Control. Try running fpctl setup instead." - return 5 - fi - - message "Updating system configuration..." - cd $FPCTL_DATA_DIR/system-configuration && git pull --rebase - if [[ "$?" != 0 ]]; then - message "Cannot update git repository system-configuration. Try running fpctl setup instead." - return 5 - fi - - check_dependencies - - configure_ansible - - message "Finishing up..." - MYPATH=`readlink -f $0` - \cp -f $FPCTL_DATA_DIR/Control/fpctl/src/fpctl $MYPATH || true -} - - -if [[ "$1" == "setup" ]]; then - setup - STATUS="$?" - if [[ "$STATUS" == "0" ]]; then - echo -e "$FPCTL_ROOT_DIR" > "$FPCTL_CONFIG_DIR/.installed" - message "All done." - fi - exit $STATUS - -elif [[ "$1" == "update" || "$1" == "up" ]]; then - FPCTL_ROOT_DIR=$(head -n 1 "$FPCTL_CONFIG_DIR/.installed") - if [[ -z ${FPCTL_ROOT_DIR} ]]; then - FPCTL_ROOT_DIR="$HOME/.local" - fi - FPCTL_DATA_DIR="$FPCTL_ROOT_DIR/share/fpctl" - - update - STATUS="$?" - if [[ "$STATUS" == "0" ]]; then - echo -e "$FPCTL_ROOT_DIR" > "$FPCTL_CONFIG_DIR/.installed" - message "All done." - fi - exit $STATUS - -elif [[ ! -e "$FPCTL_CONFIG_DIR/.installed" ]]; then - message "fpctl configuration not found. Running first-run setup." - setup - STATUS="$?" - if [[ "$STATUS" == "0" ]]; then - echo -e "$FPCTL_ROOT_DIR" > "$FPCTL_CONFIG_DIR/.installed" - message "Setup done." - exec "$FPCTL_DATA_DIR/Control/fpctl/src/fpctl.py" "$@" - fi - exit $STATUS - -else - exec "$FPCTL_DATA_DIR/Control/fpctl/src/fpctl.py" "$@" -fi diff --git a/fpctl/src/fpctl.py b/fpctl/src/fpctl.py deleted file mode 100755 index 5500ce275..000000000 --- a/fpctl/src/fpctl.py +++ /dev/null @@ -1,1127 +0,0 @@ -#!/usr/bin/env python3 - -import argparse -import datetime -import errno -import getpass -import json -import logging -import os -import re -import subprocess -import sys -import time -from operator import itemgetter -from collections import OrderedDict - -try: - from colorama import Fore, Style - from terminaltables import SingleTable -except ImportError as e: - print('==> ERROR: cannot import a required Python module. Run fpctl setup to ensure ' - 'all dependencies are installed.') - print('Missing module: {}'.format(e.name)) - sys.exit(1) - - -FPCTL_CONFIG_DIR = os.path.expanduser('~/.config/fpctl') -FPCTL_ROOT_DIR = os.path.expanduser('~/.local') -with open(os.path.join(FPCTL_CONFIG_DIR, '.installed')) as f: - root_dir = f.readline().strip() - if (os.path.isdir(root_dir)): - FPCTL_ROOT_DIR = root_dir - else: - raise FileNotFoundError(errno.ENOENT, - os.strerror(errno.ENOENT), - root_dir) -FPCTL_DATA_DIR = os.path.expanduser(os.path.join(FPCTL_ROOT_DIR, 'share/fpctl')) -INVENTORY_READOUT_GROUP = 'flp-readout' -INVENTORY_QCTASK_GROUP = 'qc-task' -INVENTORY_QCCHECKER_GROUP = 'qc-checker' -INVENTORY_QCREPOSITORY_GROUP = 'qc-repository' -INVENTORY_INFOLOGGERSERVER_GROUP = 'infologger-server' -DEFAULT_INVENTORY_PATH = os.path.join(FPCTL_CONFIG_DIR, 'inventory') - -TARGET_GROUPS = ['flp-readout', 'qc-task', 'qc-checker'] -TASK_NAMES = ['readout', 'qctask', 'qcchecker'] - -C_WARN = Style.BRIGHT + Fore.YELLOW + '==> WARNING: ' + Style.RESET_ALL -C_YELL = Style.BRIGHT + Fore.YELLOW + '==> ' + Style.RESET_ALL -C_QUEST = C_YELL -C_ERR = Style.BRIGHT + Fore.RED + '==> ERROR: ' + Style.RESET_ALL -C_RED = Style.BRIGHT + Fore.RED + '==> ' + Style.RESET_ALL -C_MSG = Style.BRIGHT + Fore.GREEN + '==> ' + Style.RESET_ALL -C_ITEM_NO_PADDING = Style.BRIGHT + Fore.BLUE + '-> ' + Style.RESET_ALL -C_ITEM = ' ' + C_ITEM_NO_PADDING -BULLET = '\u25CF ' -ANSIBLE_SSH_DOCUMENTATION = 'https://github.com/AliceO2Group/Control/fpctl#authentication-on-the-target-system' - - -class Reprinter: - def __init__(self): - self.text = '' - - def moveup(self, lines): - for _ in range(lines): - sys.stdout.write("\x1b[A") - - def reprint(self, text): - # Clear previous text by overwritig non-spaces with spaces - self.moveup(self.text.count("\n")) - sys.stdout.write(re.sub(r"[^\s]", " ", self.text)) - - # Print new text - lines = min(self.text.count("\n"), text.count("\n")) - self.moveup(lines) - sys.stdout.write(text) - self.text = text - - -class Inventory: - def __init__(self, inventory_path): - self.inventory_path = inventory_path - self.inventory_file_lines = [] - self.hosts_cache_file_path = os.path.join(FPCTL_DATA_DIR, 'hosts_cache.json') - self.pubkey_file_path = '' - self.hosts_cache = dict() - self.SSH_DIR = os.path.join(os.path.expanduser('~'), '.ssh') - self.__init_cache() - - def __init_cache(self): - hosts_cache = dict() - if os.path.isfile(self.hosts_cache_file_path): - try: - with open(self.hosts_cache_file_path, 'r') as hosts_cache_file: - hosts_cache = json.load(hosts_cache_file) - except Exception as e: - print(C_WARN + 'A fpctl hosts cache exists but loading failed, so the ' + - 'cache will be overwritten. If you see this message more than ' + - 'once, try reinstalling fpctl.') - self.hosts_cache = hosts_cache - - def __write_cache(self): - try: - with open(self.hosts_cache_file_path, 'w') as hosts_cache_file: - json.dump(self.hosts_cache, hosts_cache_file) - except Exception as e: - print(C_WARN + 'Cannot write fpctl hosts cache. If you see this ' + - 'message more than once, try reinstalling fpctl.') - - def load(self): - output = subprocess.check_output(['ansible', - 'all', - '-i{}'.format(self.inventory_path), - '--list-hosts']) - inventory_hosts = output.decode(sys.stdout.encoding).splitlines() - inventory_hosts = inventory_hosts[1:] # we throw away the first line which is only a summary - self.inventory_hosts = [line.strip() for line in inventory_hosts] - - inventory_file_lines = [] - with open(self.inventory_path, 'r') as inventory_file: - inventory_file_lines = inventory_file.readlines() - - self.inventory_file_lines = inventory_file_lines - - if inventory_hosts != ['localhost']: - self.__check_for_ssh_keys() - - def check_hosts(self, force=False): - try: - self.__check_for_ssh_auth(force) - self.__check_for_sudo_nopasswd(force) - finally: - if self.hosts_cache: - self.__write_cache() - - def __check_for_ssh_keys(self): - self.force_deploy_ssh_keys = False - if not os.path.isdir(self.SSH_DIR): - self.force_deploy_ssh_keys = \ - query_yes_no('SSH configuration directory not found. fpctl needs ' - 'a public/private SSH key pair to operate on the ' - 'target machines. The SSH configuration directory, ' - 'as well as a key pair, can be created for you and ' - 'deployed on the target systems. Do you wish to ' - 'proceed?', default='yes') - if self.force_deploy_ssh_keys: - os.mkdir(self.SSH_DIR) - else: - print(C_RED + 'Since Ansible requires passwordless authentication on the target ' - 'hosts in order to work, fpctl cannot continue.\n' + C_RED + - 'Please see {} for instructions on how to ' - 'set up passwordless authentication for Ansible/fpctl.' - .format(ANSIBLE_SSH_DOCUMENTATION)) - self.__write_cache() - sys.exit(1) - - if self.force_deploy_ssh_keys: - self.__create_rsa_keypair() - return - - candidate_keyfiles = [['id_rsa.pub', 'id_rsa'], - ['id_dsa.pub', 'id_dsa']] - candidate_keyfiles = [[os.path.join(self.SSH_DIR, jtem) for jtem in item] for item in candidate_keyfiles] - for keypair in candidate_keyfiles: - if os.path.isfile(keypair[0]) and \ - os.path.isfile(keypair[1]): - self.pubkey_file_path = keypair[0] - print(C_MSG + 'Found SSH public/private key pair {0}/{1}.' - .format(os.path.basename(keypair[0]), - os.path.basename(keypair[1]))) - break - - if not self.pubkey_file_path: - self.force_deploy_ssh_keys = \ - query_yes_no('No suitable SSH public/private key pairs were found. ' - 'fpctl needs ' - 'a public/private SSH key pair to operate on the ' - 'target machines. The SSH configuration directory, ' - 'as well as a key pair, can be created for you and ' - 'deployed on the target systems. Do you wish to ' - 'proceed?', default='yes') - if self.force_deploy_ssh_keys: - self.__create_rsa_keypair() - else: - print(C_RED + 'Since Ansible requires passwordless authentication on the target ' - 'hosts in order to work, fpctl cannot continue.\n' + C_RED + - 'Please see {} for instructions on how to ' - 'set up passwordless authentication for Ansible/fpctl.' - .format(ANSIBLE_SSH_DOCUMENTATION)) - self.__write_cache() - sys.exit(1) - - def __create_rsa_keypair(self): - self.force_deploy_ssh_keys = True - rc = subprocess.call('ssh-keygen -t rsa -N "" -f id_rsa -q', - shell=True, - cwd=self.SSH_DIR) - if rc != 0: - print(C_ERR + 'Cannot create RSA key pair.') - self.__write_cache() - sys.exit(1) - - self.pubkey_file_path = os.path.join(self.SSH_DIR, 'id_rsa.pub') - - def __deploy_ssh_keys(self, hosts_that_cannot_ssh): - if not self.pubkey_file_path: - print(C_ERR + 'Cannot find SSH public key for deployment on target system.') - self.__write_cache() - sys.exit(1) - - for host_user_tuple in hosts_that_cannot_ssh: - ansible_user = host_user_tuple[1] - target_hostname = host_user_tuple[0] - password = getpass.getpass(prompt='[ssh] password for {0}@{1}: ' - .format(ansible_user, target_hostname)) - SCI_CALL = '/usr/bin/sshpass -p{3} /usr/bin/ssh-copy-id -i {0} {1}@{2}'.format( - self.pubkey_file_path, - ansible_user, - target_hostname, - password) - rc = subprocess.call(SCI_CALL, shell=True) - if rc != 0: - print(C_ERR + 'Cannot deploy SSH public key to target system.') - self.__write_cache() - sys.exit(1) - - def __check_for_ssh_auth(self, force=False): - hosts_that_cannot_ssh = [] - has_localhosts = False - - result = [] - for target_hostname in self.inventory_hosts: - ansible_user = os.environ.get('USER') - for line in self.inventory_file_lines: - if line.startswith(target_hostname) and 'ansible_user='in line: - splitline = line.split(' ') - for word in splitline: - if word.startswith('ansible_user='): - ansible_user = word.strip()[13:] - break # we found an ansible_user override, so we break and go on - - if not force and \ - target_hostname in self.hosts_cache and \ - 'auth_methods' in self.hosts_cache[target_hostname] and \ - self.hosts_cache[target_hostname]['auth_methods'] and \ - 'ansible_user' in self.hosts_cache[target_hostname] and \ - self.hosts_cache[target_hostname]['ansible_user'] == ansible_user: - result.append({'host': target_hostname, - 'auth': self.hosts_cache[target_hostname]['auth_methods']}) - continue - - # HACK: we check if there's an ansible_user specified for this hostname in the - # inventory file. This should be replaced with ansible-python binding. - if target_hostname == 'localhost': - has_localhosts = True - self.hosts_cache['localhost'] = {'auth_methods': ['local'], - 'ansible_user': ansible_user} - result.append({'host': 'localhost', - 'auth': ['local']}) - continue - - output = b'' - try: - output = subprocess.check_output(['ssh', - '-o BatchMode=yes', - '-o ConnectTimeout=5', - '-o StrictHostKeyChecking=no', - '-o GSSAPIAuthentication=yes', - '-o PubkeyAuthentication=no', - '{0}@{1}'.format(ansible_user, target_hostname), - 'echo fpctl GSSAPIAuthentication ok'], - stderr=subprocess.STDOUT) - logging.debug('SSH GSSAPI check output:{}'.format(output.decode(sys.stdout.encoding))) - except subprocess.CalledProcessError as e: - logging.debug('SSH GSSAPI check error: {}'.format(e.output)) - - gssapi_auth_ok = 'fpctl GSSAPIAuthentication ok' in output.decode(sys.stdout.encoding) - - try: - output = subprocess.check_output(['ssh', - '-o BatchMode=yes', - '-o ConnectTimeout=5', - '-o StrictHostKeyChecking=no', - '-o GSSAPIAuthentication=no', - '-o PubkeyAuthentication=yes', - '{0}@{1}'.format(ansible_user, target_hostname), - 'echo fpctl PubkeyAuthentication ok'], - stderr=subprocess.STDOUT) - logging.debug('SSH Pubkey check output:{}'.format(output.decode(sys.stdout.encoding))) - except subprocess.CalledProcessError as e: - logging.debug('SSH Pubkey check error: {}'.format(e.output)) - - pubkey_auth_ok = 'fpctl PubkeyAuthentication ok' in output.decode(sys.stdout.encoding) - - self.hosts_cache[target_hostname] = {'auth_methods': [], - 'ansible_user': ansible_user} - if not pubkey_auth_ok and not gssapi_auth_ok: - hosts_that_cannot_ssh.append((target_hostname, ansible_user)) - - if pubkey_auth_ok or gssapi_auth_ok: - auth_ok = [] - if pubkey_auth_ok: - auth_ok.append('public key') - self.hosts_cache[target_hostname]['auth_methods'].append('public key') - if gssapi_auth_ok: - auth_ok.append('GSSAPI/Kerberos') - self.hosts_cache[target_hostname]['auth_methods'].append('GSSAPI/Kerberos') - result.append({'host': target_hostname, 'auth': auth_ok}) - - if has_localhosts: - print(C_QUEST + 'At least one of your target systems is localhost. SSH authentication ' - 'checks were skipped for localhost inventory entries. ' - 'Make sure that you have ansible_connection=local ' - 'in your inventory, and that passwordless sudo is enabled.') - - if hosts_that_cannot_ssh: - print(C_WARN + 'The following hosts do not appear to support passwordless ' - 'authentication (through either GSSAPI/Kerberos or public key):') - for host_user_tuple in hosts_that_cannot_ssh: - print(C_ITEM + '{0}@{1}'.format(host_user_tuple[1], host_user_tuple[0])) - if not self.force_deploy_ssh_keys: - self.force_deploy_ssh_keys = \ - query_yes_no('fpctl can try to enable passwordless public key ' - 'authentication (excluding Kerberos) on these ' - 'hosts by adding your SSH public key ' - 'to their authorized keys list. ' - 'Would you like to proceed?', default="yes") - - if self.force_deploy_ssh_keys: - self.__deploy_ssh_keys(hosts_that_cannot_ssh) - else: - print(C_RED + 'Since Ansible requires passwordless authentication on the target ' - 'hosts in order to work, fpctl cannot continue.\n' + C_RED + - 'Please see {} for instructions on how to ' - 'set up passwordless authentication for Ansible/fpctl.' - .format(ANSIBLE_SSH_DOCUMENTATION)) - self.__write_cache() - sys.exit(1) - - print(C_MSG + 'Hosts in inventory:') - for item in result: - print(C_ITEM + item['host'] + ' [authentication: ' + ', '.join(item['auth']) + ']') - - def __check_for_sudo_nopasswd(self, force=False): - for target_hostname in self.inventory_hosts: - ansible_user = os.environ.get('USER') - for line in self.inventory_file_lines: - if line.startswith(target_hostname) and 'ansible_user='in line: - splitline = line.split(' ') - for word in splitline: - if word.startswith('ansible_user='): - ansible_user = word.strip()[13:] - break # we found an ansible_user override, so we break and go on - - become_with_ksu = False - for line in self.inventory_file_lines: - if line.startswith(target_hostname) and 'ansible_become_method=ksu' in line: - become_with_ksu = True - break # if this host is set up with Kerberos+ksu, we skip to the next - if become_with_ksu: - continue - - if not force and \ - target_hostname in self.hosts_cache and \ - 'sudo_nopasswd' in self.hosts_cache[target_hostname] and \ - self.hosts_cache[target_hostname]['sudo_nopasswd'] and \ - 'ansible_user' in self.hosts_cache[target_hostname] and \ - self.hosts_cache[target_hostname]['ansible_user'] == ansible_user: - continue - - output = b'' - if target_hostname == 'localhost': - try: - output = subprocess.check_output(['/bin/sudo -kn echo "fpctl sudo ok"'], - shell=True, - stderr=subprocess.STDOUT) - logging.debug('local sudo check output:{}'.format(output.decode(sys.stdout.encoding))) - except subprocess.CalledProcessError as e: - logging.debug('local sudo check error: {}'.format(e.output)) - else: - try: - output = subprocess.check_output(['ssh', - '-o BatchMode=yes', - '-o ConnectTimeout=5', - '-o StrictHostKeyChecking=no', - '{0}@{1}'.format(ansible_user, target_hostname), - '/bin/sudo -kn echo "fpctl sudo ok"'], - stderr=subprocess.STDOUT) - logging.debug('SSH sudo check output:{}'.format(output.decode(sys.stdout.encoding))) - except subprocess.CalledProcessError as e: - logging.debug('SSH sudo check error: {}'.format(e.output)) - - sudo_ok = 'fpctl sudo ok' in output.decode(sys.stdout.encoding) - self.hosts_cache[target_hostname]['sudo_nopasswd'] = sudo_ok - - if not sudo_ok: - if query_yes_no('Passwordless sudo not set on host {0}. fpctl requires ' - 'sudo NOPASSWD configuration in order to work. To ' - 'enable this, you should add a file named "zzz-fpctl" to ' - 'the /etc/sudoers.d directory on host {0}, with the ' - 'content "{1} ALL=(ALL) NOPASSWD: ALL".\n' - 'You may quit fpctl and do it yourself, or fpctl can do ' - 'this for you now. Do you wish to proceed with enabling ' - 'passwordless sudo?'.format(target_hostname, ansible_user), - default="yes"): - sudoers_extra_path = '/etc/sudoers.d/zzz-fpctl' - - file_cmd = '/bin/sudo -Sk su -c "EDITOR=tee visudo -f {}"' \ - .format(sudoers_extra_path) - password = getpass.getpass(prompt='[sudo] password for {0}@{1}: ' - .format(ansible_user, target_hostname)) - sudoers_line = '{} ALL=(ALL) NOPASSWD: ALL\n'.format(ansible_user) - - if target_hostname == 'localhost': - p = subprocess.Popen(file_cmd, - shell=True, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - stdout=subprocess.DEVNULL, - universal_newlines=True) - else: - p = subprocess.Popen(['ssh', - '-o BatchMode=yes', - '-o ConnectTimeout=5', - '-o StrictHostKeyChecking=no', - '{0}@{1}'.format(ansible_user, target_hostname), - file_cmd], - stdin=subprocess.PIPE, - stderr=subprocess.PIPE, - stdout=subprocess.DEVNULL, - universal_newlines=True) - - p.communicate('{0}\n{1}'.format(password, sudoers_line)) - if p.returncode: - print(C_ERR + 'Could not set up passwordless sudo on host {}. fpctl will now quit.' - .format(target_hostname)) - self.__write_cache() - sys.exit(p.returncode) - else: - self.hosts_cache[target_hostname]['sudo_nopasswd'] = True - print(C_MSG + 'Passwordless sudo OK on host {}.'.format(target_hostname)) - - else: - print(C_ERR + 'Passwordless sudo not allowed on host {}. fpctl will now quit.' - .format(target_hostname)) - self.__write_cache() - sys.exit(0) - - -def __get_next_run_number(): - run_number_path = os.path.join(FPCTL_CONFIG_DIR, "run_counter") - last_run_number = 0 - - if os.path.isfile(run_number_path): - run_number_line = "" - with open(run_number_path, 'r') as run_counter: - run_number_line = run_counter.readline() - last_run_number = int(run_number_line) - - run_number = last_run_number + 1 - - with open(run_number_path, 'w') as run_counter: - run_counter.writelines([str(run_number)]) - - return run_number - - -def check_for_correct_task(args): - if args.task: - if args.task not in TASK_NAMES: - print(C_ERR + 'Unknown task "{}".'.format(args.task)) - print(C_RED + 'Available tasks:') - for task_name in TASK_NAMES: - print(C_ITEM + task_name) - sys.exit(1) - - -def print_summary(inventory_path): - all_target_groups = TARGET_GROUPS + ['qc-repository', 'infologger-server'] - all_task_names = TASK_NAMES + [Style.RESET_ALL + Style.DIM + Fore.WHITE + '(none)' + Style.RESET_ALL, - Style.RESET_ALL + Style.DIM + Fore.WHITE + '(none)' + Style.RESET_ALL] - systemd_units = ['flpprototype-readout', - 'flpprotocype-qctask', - 'flpprototype-qcchecker', - Style.RESET_ALL + Style.DIM + Fore.WHITE + '(none)' + Style.RESET_ALL, - 'o2-infologger-server'] - target_hosts = [] - for group in all_target_groups: - output = subprocess.check_output(['ansible', - group, - '-i{}'.format(inventory_path), - '--list-hosts']) - if b'hosts (0)' in output: - target_hosts.append([]) - continue - - inventory_hosts = output.decode(sys.stdout.encoding).splitlines() - inventory_hosts = inventory_hosts[1:] # we throw away the first line which is only a summary - inventory_hosts = [line.strip() for line in inventory_hosts] - target_hosts.append(inventory_hosts) - - headers = list('\n'.join(Style.BRIGHT + Fore.BLUE + line + Style.RESET_ALL for line in item.splitlines()) for item in - ['Inventory groups', - 'Target hosts', - 'Systemd units\n(on target hosts)', - 'Tasks\n(accessible through fpctl)']) - - rows = list(zip(('[' + item + ']' for item in all_target_groups), - ('\n'.join(item) for item in target_hosts), - systemd_units, - (Style.BRIGHT + Fore.BLUE + item + Style.RESET_ALL for item in all_task_names))) - - table = SingleTable([headers] + - rows) - table.inner_row_border = True - table.CHAR_H_INNER_HORIZONTAL = b'\xcd'.decode('ibm437') - table.CHAR_OUTER_TOP_HORIZONTAL = b'\xcd'.decode('ibm437') - table.CHAR_OUTER_TOP_LEFT = b'\xd5'.decode('ibm437') - table.CHAR_OUTER_TOP_RIGHT = b'\xb8'.decode('ibm437') - table.CHAR_OUTER_TOP_INTERSECT = b'\xd1'.decode('ibm437') - table.CHAR_H_OUTER_LEFT_INTERSECT = b'\xc6'.decode('ibm437') - table.CHAR_H_OUTER_RIGHT_INTERSECT = b'\xb5'.decode('ibm437') - table.CHAR_H_INNER_INTERSECT = b'\xd8'.decode('ibm437') - print(table.table) - print(C_MSG + 'Configuration files were deployed in /etc/flpprototype.d on the target systems.') - print(C_MSG + 'FLP prototype software is installed in /opt/alisw. If you wish to use ' + - 'it manually, you must run "module load flpproto" after you SSH into a target system.') - print(C_MSG + 'It is now possible to control the tasks listed in the last column through fpctl.') - print(C_MSG + 'Also, if you have a local instance of InfoBrowser, you may use it with this ' + - 'configuration file: {} by copying the file to your /etc directory.'.format(os.path.join(FPCTL_CONFIG_DIR, 'infoLogger.cfg'))) - - -def query_yes_no(question, default="yes"): - """Ask a yes/no question via raw_input() and return their answer. - - "question" is a string that is presented to the user. - "default" is the presumed answer if the user just hits . - It must be "yes" (the default), "no" or None (meaning - an answer is required of the user). - - The "answer" return value is True for "yes" or False for "no". - """ - valid = {"yes": True, "y": True, "ye": True, - "no": False, "n": False} - if default is None: - prompt = " [y/n] " - elif default == "yes": - prompt = " [Y/n] " - elif default == "no": - prompt = " [y/N] " - else: - raise ValueError("invalid default answer: '%s'" % default) - - while True: - sys.stdout.write(C_QUEST + - question + prompt + '\n' + - C_QUEST + '------------------------------------\n' + - C_QUEST) - choice = input().lower() - if default is not None and choice == '': - return valid[default] - elif choice in valid: - return valid[choice] - else: - sys.stdout.write(C_QUEST + - "Please respond with 'yes' or 'no' " - "(or 'y' or 'n').\n" + - C_QUEST) - - -def get_inventory_path(inventory_option): - """Get the path of the inventory file. May interact with user.""" - inventory_path = DEFAULT_INVENTORY_PATH - - if inventory_option: - inventory_path = os.path.abspath(inventory_option) - if not os.path.isfile: - raise FileNotFoundError(errno.ENOENT, - os.strerror(errno.ENOENT), - inventory_path) - else: - return inventory_path - else: - if not os.path.isfile(inventory_path): - if query_yes_no('Ansible inventory file not found at {}. fpctl can ' - 'autogenerate a default one for you, with target localhost. ' - 'This means that all FLP prototype software will be ' - 'deployed on your current system. ' - 'Would you like to proceed?' - .format(inventory_path), default="yes"): - with open(inventory_path, 'w') as inventory_file: - loc = 'localhost ansible_connection=local' - inv = '' - for group in [INVENTORY_READOUT_GROUP, - INVENTORY_QCTASK_GROUP, - INVENTORY_QCCHECKER_GROUP, - INVENTORY_QCREPOSITORY_GROUP, - INVENTORY_INFOLOGGERSERVER_GROUP]: - inv += '[{0}]\n{1}\n'.format(group, loc) - print("{}".format(inv), file=inventory_file) - else: - raise FileNotFoundError(errno.ENOENT, - os.strerror(errno.ENOENT), - inventory_path) - return inventory_path - - -def deploy(args): - """Handler for deploy command""" - inventory_path = get_inventory_path(args.inventory) - - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts(force=True) - - ansible_cwd = os.path.join(FPCTL_DATA_DIR, 'system-configuration/ansible') - - ansible_systemd_path = os.path.join(FPCTL_DATA_DIR, 'Control/fpctl/systemd/system') - ansible_systemd_var = 'flpprototype_systemd={}'.format(ansible_systemd_path) - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [ansible_systemd_var] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - ansible_cmd = ['ansible-playbook', - os.path.join(ansible_cwd, 'site.yml'), - '-i{}'.format(inventory_path), - '-s', - '-e"{}"'.format(' '.join(ansible_extra_vars))] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - cwd=ansible_cwd, - env=ansible_env) - ansible_proc.communicate() - print(C_MSG + 'Deployment summary:') - print_summary(inventory_path) - print(C_MSG + 'All done.') - - -def configure(args): - """Handler for configure command""" - - inventory_path = get_inventory_path(args.inventory) - - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts() - - ansible_cwd = os.path.join(FPCTL_DATA_DIR, 'system-configuration/ansible') - - ansible_systemd_path = os.path.join(FPCTL_DATA_DIR, 'Control/fpctl/systemd/system') - ansible_systemd_var = 'flpprototype_systemd={}'.format(ansible_systemd_path) - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [ansible_systemd_var] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - ansible_cmd = ['ansible-playbook', - os.path.join(ansible_cwd, 'site.yml'), - '-i{}'.format(inventory_path), - '-s', - '-tconfiguration' - '-e"{}"'.format(' '.join(ansible_extra_vars))] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - cwd=ansible_cwd, - env=ansible_env) - ansible_proc.communicate() - print(C_MSG + 'Configuration summary:') - print_summary(inventory_path) - print(C_MSG + 'All done.') - - -def run(args): - """Handler for run command""" - - inventory_path = get_inventory_path(args.inventory) - - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts() - - host = args.host - custom_command = args.command - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - ansible_cmd = ['ansible', - host, - '-i"{}"'.format(inventory_path)] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - if ansible_extra_vars: - ansible_cmd += ['-e"{}"'.format(' '.join(ansible_extra_vars))] - - ansible_cmd += ['-a"{}"'.format(custom_command)] - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - env=ansible_env) - ansible_proc.communicate() - print(C_MSG + 'All done.') - - -def start(args): - """Handler for start command""" - - inventory_path = get_inventory_path(args.inventory) - - check_for_correct_task(args) - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts() - - ansible_cwd = os.path.join(FPCTL_DATA_DIR, 'system-configuration/ansible') - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - ansible_extra_vars += "fpctl_run_number={}".format(__get_next_run_number()) - - ansible_cmd = ['ansible-playbook', - os.path.join(ansible_cwd, 'control.yml'), - '-i{}'.format(inventory_path), - '-s', - '-t{}control-start' - .format('{}-'.format(args.task) if args.task else '')] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - if ansible_extra_vars: - ansible_cmd += ['-e"{}"'.format(' '.join(ansible_extra_vars))] - - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - cwd=ansible_cwd, - env=ansible_env) - ansible_proc.communicate() - print(C_MSG + 'All done.') - - -def status(args): - """Handler for status command""" - inventory_path = get_inventory_path(args.inventory) - - check_for_correct_task(args) - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts() - - ansible_cwd = os.path.join(FPCTL_DATA_DIR, 'system-configuration/ansible') - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - print(C_MSG + 'Checking status...') - - ansible_cmd = ['ansible-playbook', - os.path.join(ansible_cwd, 'control.yml'), - '-i{}'.format(inventory_path), - '-s', - '-t{}control-status' - .format('{}-'.format(args.task) if args.task else '')] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - if ansible_extra_vars: - ansible_cmd += ['-e"{}"'.format(' '.join(ansible_extra_vars))] - - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - rp = Reprinter() - - previous_now = datetime.datetime.now() - loop = True - try: - while loop: - if not args.follow: - loop = False - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - cwd=ansible_cwd, - env=ansible_env, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - - output_lines = [] - if args.verbose: - while True: - nextline = ansible_proc.stdout.readline() - u_nextline = nextline.decode(sys.stdout.encoding) - if 'PLAY RECAP' in u_nextline.strip(): - break - sys.stdout.write(u_nextline) - output_lines.append(u_nextline.rstrip()) - sys.stdout.flush() - - out, err = ansible_proc.communicate() - - if not args.verbose: - output_lines = out.decode(sys.stdout.encoding).splitlines() - - # The output from the a control playbook contains a specially formatted debug - # module instance. We need to extract it and parse it as JSON. - in_json = False - json_entries = [] - for line in output_lines: - if 'TASK' in line and 'control-status-output-json' in line: - in_json = True - continue - if in_json: - if line.startswith('task path') or line.startswith('META:'): - continue - if line.startswith('ok: ['): - json_entries.append('{\n') - elif not line.strip(): - in_json = False - else: - json_entries[-1] += (line + '\n') - else: - continue - - # print(C_MSG + 'Raw output:\n' + '\n'.join(output_lines)) - json_objects = [] - for entry in json_entries: - # print(C_ITEM + 'ITEM: ' + entry) - obj = json.loads(entry) - # print(C_ITEM + 'OBJECT:' + str(obj)) - json_objects.append(obj['msg']) - - # By service - tables = dict() - rows = [] - available_task_names = TASK_NAMES - available_target_groups = TARGET_GROUPS - if args.task: - # this is ok because check_for_correct_task runs early on - available_task_names = [args.task] - available_target_groups = [TARGET_GROUPS[TASK_NAMES.index(args.task)]] - - for i in range(len(available_task_names)): - servicename = available_task_names[i] - target_group = available_target_groups[i] - if servicename not in tables: - tables[servicename] = list() - - for obj in json_objects: - if obj['service'] == servicename: - units = dict() - for line in obj['systemctl_status_output']: - unitname = line.split(':')[0] - unitstatus = line.split(':')[1] - unitname = re.sub('\.service$', '', unitname) - units[unitname] = unitstatus - - for line in obj['systemctl_list_unit_files_output']: - unitname = re.sub('\.service$', '', line) - if '@' in unitname: - continue - if unitname not in units: - units[unitname] = 'inactive' - - units = OrderedDict(sorted(units.items())) - - unitnames = [] - unitstatuses = [] - for i, (unitname, unitstatus) in enumerate(units.items()): - c_bullet = BULLET - if unitstatus == 'active': - c_bullet = Style.BRIGHT + Fore.GREEN + BULLET + Style.RESET_ALL - elif unitstatus == 'reloading' or unitstatus == 'activating' or unitstatus == 'deactivating': - c_bullet = Style.BRIGHT + Fore.YELLOW + BULLET + Style.RESET_ALL - elif unitstatus == 'inactive': - c_bullet = Style.BRIGHT + Fore.WHITE + BULLET + Style.RESET_ALL - elif unitstatus == 'failed' or unitstatus == 'error': - c_bullet = Style.BRIGHT + Fore.RED + BULLET + Style.RESET_ALL - - unitnames.append(' ' + unitname) - unitstatuses.append(c_bullet + unitstatus) - - tables[servicename].append([' ' + obj['host'], - '\n'.join(unitnames), - '\n'.join(unitstatuses)]) - - tables[servicename] = sorted(tables[servicename], key=itemgetter(0)) - for row in tables[servicename]: - if not row[1]: - row[1] = Style.DIM + Fore.WHITE + ' (no units found)' + Style.RESET_ALL - if not row[2]: - row[2] = Style.DIM + Fore.WHITE + BULLET + '(none)' + Style.RESET_ALL - - headers = [Style.BRIGHT + Fore.BLUE + 'Inventory group' + Style.RESET_ALL + '\n Target hosts', - Style.BRIGHT + Fore.BLUE + 'Task' + Style.RESET_ALL + '\n Systemd units', - ' \nStatus'] - - rows += [[Style.BRIGHT + Fore.BLUE + '[' + target_group + ']' + Style.RESET_ALL, - Style.BRIGHT + Fore.BLUE + servicename + Style.RESET_ALL]] - rows += tables[servicename] - - table = SingleTable([headers] + - rows) - table.inner_row_border = True - table.inner_column_border = False - table.CHAR_H_INNER_HORIZONTAL = b'\xcd'.decode('ibm437') - table.CHAR_OUTER_TOP_HORIZONTAL = b'\xcd'.decode('ibm437') - table.CHAR_OUTER_TOP_LEFT = b'\xd5'.decode('ibm437') - table.CHAR_OUTER_TOP_RIGHT = b'\xb8'.decode('ibm437') - table.CHAR_OUTER_TOP_INTERSECT = b'\xd1'.decode('ibm437') - table.CHAR_H_OUTER_LEFT_INTERSECT = b'\xc6'.decode('ibm437') - table.CHAR_H_OUTER_RIGHT_INTERSECT = b'\xb5'.decode('ibm437') - table.CHAR_H_INNER_INTERSECT = b'\xd8'.decode('ibm437') - - if not args.follow: - print(table.table) - return - - now = datetime.datetime.now() - MIN_DELAY_SECONDS = 1 - if now - previous_now < datetime.timedelta(seconds=MIN_DELAY_SECONDS): - time.sleep((datetime.timedelta(seconds=MIN_DELAY_SECONDS) - (now - previous_now)).total_seconds()) - now = datetime.datetime.now() - table.title = now.strftime('%y-%m-%d %H:%M:%S') - to_print = (table.table + '\n' + - C_YELL + 'Status refreshed in {0:.2f} seconds. [Ctrl+C] to quit.\n' - .format((now - previous_now).total_seconds())) - rp.reprint(to_print) - previous_now = now - - except KeyboardInterrupt as e: - print('\n' + C_MSG + 'User interrupt.') - sys.exit(0) - - -def stop(args): - """Handler for stop command""" - inventory_path = get_inventory_path(args.inventory) - - check_for_correct_task(args) - inv = Inventory(inventory_path) - inv.load() - inv.check_hosts() - - ansible_cwd = os.path.join(FPCTL_DATA_DIR, 'system-configuration/ansible') - - ansible_extra_params = [] - if (args.ansible_extra_params): - ansible_extra_params += args.ansible_extra_params.split(' ') - - ansible_extra_vars = [] - if (args.ansible_extra_vars): - ansible_extra_vars += args.ansible_extra_vars.split(' ') - - ansible_cmd = ['ansible-playbook', - os.path.join(ansible_cwd, 'control.yml'), - '-i{}'.format(inventory_path), - '-s', - '-t{}control-stop' - .format('{}-'.format(args.task) if args.task else '')] - if args.verbose: - ansible_cmd += ['-vvv'] - if ansible_extra_params: - ansible_cmd += ansible_extra_params - if ansible_extra_vars: - ansible_cmd += ['-e"{}"'.format(' '.join(ansible_extra_vars))] - - ansible_env = os.environ.copy() - ansible_env['ANSIBLE_CONFIG'] = os.path.join(FPCTL_CONFIG_DIR, 'ansible.cfg') - - ansible_proc = subprocess.Popen(' '.join(ansible_cmd), - shell=True, - cwd=ansible_cwd, - env=ansible_env) - ansible_proc.communicate() - print(C_MSG + 'All done.') - - -def main(argv): - """Entry point, called by fpctl script.""" - args = argv[1:] - inventory_help = 'path to an Ansible infentory file (default: ~/.config/fpctl/inventory)' - verbose_help = 'print more output for debugging purposes' - ansible_extra_params_help = 'additional command line parameters to be passed to Ansible, enclosed in quotes' - ansible_extra_vars_help = 'additional variables for Ansible as key=value or JSON, enclosed in quotes' - - parser = argparse.ArgumentParser(description=C_MSG + 'FLP prototype control utility', - prog='fpctl', - epilog='run "fpctl OPERATION --help" for information on a specific fpctl operation', - formatter_class=argparse.RawDescriptionHelpFormatter) - subparsers = parser.add_subparsers(dest='subparser_name') - - sp_deploy = subparsers.add_parser('deploy', - aliases=['de'], - help='deploy FLP prototype software and configuration') - sp_deploy.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_deploy.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_deploy.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_deploy.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_deploy.set_defaults(func=deploy) - - sp_configure = subparsers.add_parser('configure', - aliases=['co'], - help='deploy FLP prototype configuration') - sp_configure.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_configure.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_configure.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_configure.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_configure.set_defaults(func=configure) - - sp_run = subparsers.add_parser('run', - help='run a custom command on one or all nodes') - sp_run.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_run.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_run.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_run.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_run.add_argument('host', metavar='HOST', - help='a hostname, an Ansible inventory group, or "all"') - sp_run.add_argument('command', metavar='COMMAND', - help='the command to run on the target node (use quotes ' - 'if it contains whitespace)') - sp_run.set_defaults(func=run) - - sp_start = subparsers.add_parser('start', - help='start some or all FLP prototype processes') - sp_start.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_start.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_start.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_start.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_start.add_argument('task', metavar='TASK', nargs='?', - help='the task to start on the nodes, as configured in the ' - 'inventory file') - sp_start.set_defaults(func=start) - - sp_status = subparsers.add_parser('status', - help='view status of some or all FLP prototype processes') - sp_status.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_status.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_status.add_argument('--follow', '-f', help='keep querying the status', action='store_true') - sp_status.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_status.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_status.add_argument('task', metavar='TASK', nargs='?', - help='the task on the nodes for which to query the status, as ' - 'configured in the inventory file') - sp_status.set_defaults(func=status) - - sp_stop = subparsers.add_parser('stop', - help='stop some or all FLP prototype processes') - sp_stop.add_argument('--inventory', '-i', metavar='INVENTORY', help=inventory_help) - sp_stop.add_argument('--verbose', '-v', help=verbose_help, action='store_true') - sp_stop.add_argument('--ansible-extra-params', '-p', metavar='ANSIBLE_PARAMS', help=ansible_extra_params_help) - sp_stop.add_argument('--ansible-extra-vars', '-e', metavar='ANSIBLE_VARS', help=ansible_extra_vars_help) - sp_stop.add_argument('task', metavar='TASK', nargs='?', - help='the task to stop on the nodes, as configured in the ' - 'inventory file') - sp_stop.set_defaults(func=stop) - - # Update and setup are fake entries with the only purpose of generating documentation. - # They are handled by the fpctl shell script - subparsers.add_parser('update', - aliases=['up'], - help='update fpctl deployment information') - subparsers.add_parser('setup', - help='install and configure fpctl') - - parsed_args = parser.parse_args(args) - logging.debug('argparse output: {}'.format(vars(parsed_args))) - - if not parsed_args.subparser_name: - print(C_ERR + 'No operation specified.') - parser.print_help() - sys.exit(1) - - parsed_args.func(parsed_args) - - -if __name__ == '__main__': - main(sys.argv) diff --git a/fpctl/systemd/system/README.md b/fpctl/systemd/system/README.md deleted file mode 100644 index 51d4e92ec..000000000 --- a/fpctl/systemd/system/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Systemd templates for FLP prototype - -These are Jinja2 templates, to be deployed through Ansible which then outputs proper Systemd units. diff --git a/fpctl/systemd/system/flpprototype-qcchecker.service.j2 b/fpctl/systemd/system/flpprototype-qcchecker.service.j2 deleted file mode 100644 index ba21a5bd5..000000000 --- a/fpctl/systemd/system/flpprototype-qcchecker.service.j2 +++ /dev/null @@ -1,11 +0,0 @@ -[Unit] -Description=O2 FlpPrototype QC checker process -After=network.target -AssertPathExistsGlob={{ flpprototype_qc_confdir }}/{{ flpprototype_qc_default_config }} - -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_qc_packagebasename }}/{{ flpprototype_qc_packageversion }} && \ - {{ o2_install_path }}/{{ flpprototype_qc_packagebasename }}/{{flpprototype_qc_packageversion}}/bin/qcCheckerLauncher \ - -n checker_0 -c json://{{ flpprototype_qc_confdir }}/{{ flpprototype_qc_default_config }} | {{ infologger_install_path }}/bin/log -x" -Restart=no diff --git a/fpctl/systemd/system/flpprototype-qcchecker@.service.j2 b/fpctl/systemd/system/flpprototype-qcchecker@.service.j2 deleted file mode 100644 index 650ce7b55..000000000 --- a/fpctl/systemd/system/flpprototype-qcchecker@.service.j2 +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=O2 FlpPrototype QC checker process -After=network.target - -# Syntax: sudo systemctl start flpprototype-qcchecker@task_name@config_file_name -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_qc_packagebasename }}/{{ flpprototype_qc_packageversion }} && \ - QCCHECKERNAME=`/bin/echo '%i' | /bin/cut -f1 -d@` && \ - QCCONFIGFILENAME=`/bin/echo '%i' | /bin/cut -f2 -d@` && \ - {{ o2_install_path }}/{{ flpprototype_qc_packagebasename }}/{{flpprototype_qc_packageversion}}/bin/qcCheckerLauncher \ - -n $${QCCHECKERNAME} -c json://{{ flpprototype_qc_confdir }}/$${QCCONFIGFILENAME}.ini | {{ infologger_install_path }}/bin/log -x" -Restart=no diff --git a/fpctl/systemd/system/flpprototype-qctask.service.j2 b/fpctl/systemd/system/flpprototype-qctask.service.j2 deleted file mode 100644 index 561089778..000000000 --- a/fpctl/systemd/system/flpprototype-qctask.service.j2 +++ /dev/null @@ -1,13 +0,0 @@ -[Unit] -Description=O2 FlpPrototype QC task process -After=network.target -AssertPathExistsGlob={{ flpprototype_qc_confdir }}/{{ flpprototype_qc_default_config }} - -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_qc_packagebasename }}/{{ flpprototype_qc_packageversion }} && \ - {{ o2_install_path }}/{{ flpprototype_qc_packagebasename }}/{{flpprototype_qc_packageversion}}/bin/qcTaskLauncher \ - -n myTask_1 -c json://{{ flpprototype_qc_confdir }}/{{ flpprototype_qc_default_config }} \ - --id myTask_1 --mq-config {{ flpprototype_qc_confdir }}/{{ flpprototype_qc_fairmq_config }} \ - --control static | {{ infologger_install_path }}/bin/log -x" -Restart=no diff --git a/fpctl/systemd/system/flpprototype-qctask@.service.j2 b/fpctl/systemd/system/flpprototype-qctask@.service.j2 deleted file mode 100644 index d3c5c6af2..000000000 --- a/fpctl/systemd/system/flpprototype-qctask@.service.j2 +++ /dev/null @@ -1,15 +0,0 @@ -[Unit] -Description=O2 FlpPrototype QC task process -After=network.target - -# Syntax: sudo systemctl start flpprototype-qctask@task_name@config_file_name -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_qc_packagebasename }}/{{ flpprototype_qc_packageversion }} && \ - QCTASKNAME=`/bin/echo '%i' | /bin/cut -f1 -d@` && \ - QCCONFIGFILENAME=`/bin/echo '%i' | /bin/cut -f2 -d@` && \ - {{ o2_install_path }}/{{ flpprototype_qc_packagebasename }}/{{flpprototype_qc_packageversion}}/bin/qcTaskLauncher \ - -n $${QCTASKNAME} -c json://{{ flpprototype_qc_confdir }}/$${QCCONFIGFILENAME}.ini \ - --id $${QCTASKNAME} --mq-config {{ flpprototype_qc_confdir }}/{{ flpprototype_qc_fairmq_config }} \ - --control static | {{ infologger_install_path }}/bin/log -x" -Restart=no diff --git a/fpctl/systemd/system/flpprototype-readout.service.j2 b/fpctl/systemd/system/flpprototype-readout.service.j2 deleted file mode 100644 index ae51ade4a..000000000 --- a/fpctl/systemd/system/flpprototype-readout.service.j2 +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=O2 FlpPrototype readout process -After=network.target -AssertPathExistsGlob={{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} - -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ - {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/o2-readout-exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }}" -Restart=no diff --git a/fpctl/systemd/system/flpprototype-readout@.service.j2 b/fpctl/systemd/system/flpprototype-readout@.service.j2 deleted file mode 100644 index a5594dae3..000000000 --- a/fpctl/systemd/system/flpprototype-readout@.service.j2 +++ /dev/null @@ -1,10 +0,0 @@ -[Unit] -Description=O2 FlpPrototype readout process -After=network.target -AssertPathExistsGlob={{ flpprototype_readout_confdir }}/%i.cfg - -[Service] -ExecStart=/bin/sh -c "source /etc/profile.d/modules.sh && \ - MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ - {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/readout.exe file:{{ flpprototype_readout_confdir }}/%i.cfg" -Restart=no diff --git a/fpctl/systemd/system/hugetlbfs.service.j2 b/fpctl/systemd/system/hugetlbfs.service.j2 deleted file mode 100644 index 52ea9667c..000000000 --- a/fpctl/systemd/system/hugetlbfs.service.j2 +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Set up hugetlbfs for readout - -[Service] -Type=oneshot -ExecStart={{ o2_install_path }}/{{ flpprototype_readoutcard_packagebasename }}/{{ flpprototype_readoutcard_packageversion }}/bin/roc-setup-hugetlbfs - -[Install] -WantedBy=multi-user.target diff --git a/hacking/example-config.yaml b/hacking/example-config.yaml deleted file mode 100644 index 2389e2794..000000000 --- a/hacking/example-config.yaml +++ /dev/null @@ -1,62 +0,0 @@ ---- -o2: - roleclasses: - readout: - wantsCPU: 1 - wantsMemory: 256 - wantsPorts: "" - command: - env: "[\"FOO=/bar/quux\", \"BAR=baz\"]" - shell: true -# value: source /etc/profile.d/modules.sh && \ -# MODULEPATH={{ o2_install_path }}/modulefiles module load {{ flpprototype_readout_packagebasename }}/{{ flpprototype_readout_packageversion }} && \ -# {{ o2_install_path }}/{{ flpprototype_readout_packagebasename }}/{{flpprototype_readout_packageversion}}/bin/o2-readout-exe file:{{ flpprototype_readout_confdir }}/{{ flpprototype_readout_default_config }} | {{ infologger_install_path }}/bin/log -x - value: source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load Readout && - /opt/alisw/el7/Readout/v0.1.0-16/bin/o2-readout-exe file:/etc/flpprototype.d/readout/configDummy.cfg | /opt/o2-InfoLogger/bin/o2-infologger-log -x - arguments: "[]" - qctask: - wantsCPU: 1 - wantsMemory: 256 - wantsPorts: "3000-3002" - command: - env: "[]" - shell: true - arguments: "[]" - value: source /etc/profile.d/modules.sh && - MODULEPATH=/opt/alisw/el7/modulefiles module load QualityControl && - MODULEPATH=/opt/alisw/el7/modulefiles module load Control-OCCPlugin && - MODULEPATH=/opt/alisw/el7/modulefiles module list && - qcTaskLauncher - -n myTask_1 -c json:///etc/flpprototype.d/qc/example-default.json - --id myTask_1 --mq-config /etc/flpprototype.d/qc/alfa.json - --severity trace --color false - -S $CONTROL_OCCPLUGIN_ROOT/lib/ - -P OCC --controlport 47101 - roles: - readout01: - roleClass: readout - qctask02: - roleClass: qctask - - - deployment: - o2_install_path: /opt/alisw/el7 - flpprototype_packagebasename: flpproto - flpprototype_packageversion: v0.1.0-16 - flpprototype_readout_confdir: /etc/flpprototype.d/readout - flpprototype_readout_default_config: configDummy.cfg - flpprototype_readout_packagebasename: Readout - flpprototype_readout_packageversion: v0.1.0-16 - flpprototype_readoutcard_packagebasename: ReadoutCard - flpprototype_readoutcard_packageversion: v0.8.7-1 - small_hugepages_count: 128 - large_hugepages_count: 0 - flpprototype_qc_confdir: /etc/flpprototype.d/qc - flpprototype_qc_default_config: example-default.ini - flpprototype_qc_fairmq_config: alfa.json - flpprototype_qc_packagebasename: QualityControl - flpprototype_qc_packageversion: v0.3.0-2 - infologger_install_path: /opt/o2-InfoLogger - infologger_confdir: /etc - From 2c9f796e7c26a0796033434a1d9b6c75a0b573bd Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 9 May 2025 14:55:34 +0200 Subject: [PATCH 2142/2352] [core] less verbose log in TRG plugin + fix missing run number --- core/integration/trg/plugin.go | 136 ++++++++++----------------------- 1 file changed, 41 insertions(+), 95 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 7983378f6..78abb68d0 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -558,8 +558,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } // global runs only stack["RunLoad"] = func() (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId). - WithField("level", infologger.IL_Ops). + rn := varStack["run_number"] + var runNumber64 int64 + runNumber64, err := strconv.ParseInt(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithError(err). + Error("cannot acquire run number for Run Load") + } + log := log.WithField("run", runNumber64).WithField("partition", envId) + + log.WithField("level", infologger.IL_Ops). Info("ALIECS SOR operation : performing TRG Run Load Request") parentRole, ok := call.GetParentRole().(callable.ParentRole) @@ -570,30 +579,17 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { globalConfig, ok := varStack["trg_global_config"] log.WithField("globalConfig", globalConfig). - WithField("partition", envId). Debug("not a TRG Global Run, continuing with TRG Run Start") if !ok { - log.WithField("partition", envId). - Debug("no TRG Global config set") + log.Debug("no TRG Global config set") globalConfig = "" } // TODO (malexis): pass consul key to TRG if avail - rn := varStack["run_number"] - var runNumber64 int64 - runNumber64, err := strconv.ParseInt(rn, 10, 32) - if err != nil { - log.WithField("partition", envId). - WithError(err). - Error("cannot acquire run number for Run Load") - } - trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" -all required must be ready - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("empty TRG detectors list provided") + log.Debug("empty TRG detectors list provided") trgDetectorsParam = "" } @@ -603,7 +599,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). - WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") call.VarStack["__call_error_reason"] = err.Error() @@ -615,9 +610,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // standalone run if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { // we do not load any run cause it is standalone - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("not a TRG Global Run, continuing with TRG Run Start") + log.Debug("not a TRG Global Run, continuing with TRG Run Start") return } @@ -629,7 +622,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { if err != nil { log.WithError(err). WithField("level", infologger.IL_Support). - WithField("partition", envId). WithField("call", "RunLoad"). Warn("could not parse ctp_readout_enabled value") } @@ -647,8 +639,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -664,8 +654,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -700,8 +688,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -729,8 +715,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunLoad"). Error("TRG error") @@ -775,16 +759,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } stack["RunStart"] = func() (out string) { // must formally return string even when we return nothing - log.WithField("partition", envId). - Info("ALIECS SOR operation : performing TRG Run Start") - - runtimeConfig, ok := varStack["trg_runtime_config"] - if !ok { - log.WithField("partition", envId). - Debug("no TRG config set, using default configuration") - runtimeConfig = "" - } - rn := varStack["run_number"] var runNumber64 int64 runNumber64, err := strconv.ParseInt(rn, 10, 32) @@ -793,13 +767,20 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("partition", envId). Error("cannot acquire run number for Run Start") } + log := log.WithField("run", runNumber64).WithField("partition", envId) + + log.Info("ALIECS SOR operation : performing TRG Run Start") + + runtimeConfig, ok := varStack["trg_runtime_config"] + if !ok { + log.Debug("no TRG config set, using default configuration") + runtimeConfig = "" + } trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" it is a global run - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("Detector for host is not available, starting global run") + log.Debug("Detector for host is not available, starting global run") trgDetectorsParam = "" } @@ -810,8 +791,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -839,8 +818,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -855,8 +832,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -891,8 +866,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -919,8 +892,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStart"). Error("TRG error") @@ -960,9 +931,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // runStart successful, we cache the run number for eventual cleanup p.pendingRunStops[envId] = runNumber64 - log.WithField("partition", envId). - WithField("run", runNumber64). - Info("TRG RunStart success") + log.Info("TRG RunStart success") trgStartTimeS := strconv.FormatInt(trgStartTime.UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) @@ -974,12 +943,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } runStopFunc := func(ctx context.Context, runNumber64 int64) (out string) { + log := log.WithField("run", runNumber64).WithField("partition", envId) + trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { // "" it is a global run - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("Detector for host is not available, stoping global run") + log.Debug("Detector for host is not available, stoping global run") trgDetectorsParam = "" } @@ -1007,8 +976,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -1023,8 +990,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -1055,8 +1020,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -1083,8 +1046,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunStop"). Error("TRG error") @@ -1124,24 +1085,21 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // RunStop successful, we pop the run number from the cache delete(p.pendingRunStops, envId) - log.WithField("partition", envId). - WithField("run", runNumber64). - Info("TRG RunStop success") + log.Info("TRG RunStop success") trgEndTimeS := strconv.FormatInt(trgEndTime.UnixMilli(), 10) parentRole, ok := call.GetParentRole().(callable.ParentRole) if ok { parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTimeS) } else { - log.WithField("partition", envId). - WithField("run", runNumber64). - WithField("trgEndTime", trgEndTimeS). + log.WithField("trgEndTime", trgEndTimeS). Debug("could not get parentRole and set TRG end time") } return } runUnloadFunc := func(ctx context.Context, runNumber64 int64) (out string) { + log := log.WithField("run", runNumber64).WithField("partition", envId) trgDetectorsParam, ok := varStack["trg_detectors"] if !ok { @@ -1155,9 +1113,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // if global run then unload if len(strings.Split(detectors, " ")) < 2 && varStack["trg_global_run_enabled"] == "false" { - log.WithField("partition", envId). - WithField("run", runNumber64). - Debug("not a TRG Global Run, skipping TRG Run Unload") + log.Debug("not a TRG Global Run, skipping TRG Run Unload") return } @@ -1175,8 +1131,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -1191,8 +1145,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -1223,8 +1175,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -1251,8 +1201,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithError(err). WithField("level", infologger.IL_Support). WithField("endpoint", viper.GetString("trgServiceEndpoint")). - WithField("run", runNumber64). - WithField("partition", envId). WithField("call", "RunUnload"). Error("TRG error") @@ -1290,17 +1238,11 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { // RunUnload successful, we pop the run number from the cache delete(p.pendingRunUnloads, envId) - log.WithField("partition", envId). - WithField("run", runNumber64). - Info("ALICECS EOR operation : TRG RunUnload success") + log.Info("ALICECS EOR operation : TRG RunUnload success") return } stack["RunStop"] = func() (out string) { - log.WithField("partition", envId). - //WithField("run", runNumber64). - Info("ALIECS EOR operation : performing TRG Run Stop ") - rn := varStack["run_number"] var runNumber64 int64 var err error @@ -1311,6 +1253,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for TRG Run Stop") } + log.WithField("partition", envId). + WithField("run", runNumber64). + Info("ALIECS EOR operation : performing TRG Run Stop ") + timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "RunStop", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() @@ -1318,10 +1264,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return runStopFunc(ctx, runNumber64) } stack["RunUnload"] = func() (out string) { - log.WithField("partition", envId). - //WithField("run", runNumber64). - Info("ALIECS EOR operation : performing TRG Run Unload ") - rn := varStack["run_number"] var runNumber64 int64 var err error @@ -1332,6 +1274,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for TRG Run Unload") } + log.WithField("partition", envId). + WithField("run", runNumber64). + Info("ALIECS EOR operation : performing TRG Run Unload ") + timeout := callable.AcquireTimeout(TRG_UNLOAD_TIMEOUT, varStack, "RunUnload", envId) ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() From 49676cd3e07580fc8a06232207186daeea20a461 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 13 May 2025 12:14:34 +0200 Subject: [PATCH 2143/2352] demote MesosCommand send error log This log cannot be understood by an operator on its own. typically, there is another error log just after, which includes this message, but also gives some context: ``` transition 'START_ACTIVITY' failed, transitioning into ERROR. error="transition canceled with error: START could not complete for critical tasks, errors: task 'source /etc/profile.d/o2.sh && export DPL_RAWPROXY_OVERRIDE_ORBITRESET=1718863780392 && o2-qc --config apricot://alio2-cr1-hv-aliecs.cern.ch:32188/o2/components/qc/ANY/any/tof-full-epn-qcmn --remote --shm-metadata-msg-size 100000 -b | o2-qc' on alio2-cr1-qc03 (id 2uWFxUQq3ku) failed with error: MesosCommand_Transition timed out for task 2uWFxUQq3ku" ``` i think it's fine to move it to Devel --- core/controlcommands/commandqueue.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 0c769dec4..376be03d8 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -163,6 +163,7 @@ func (m *CommandQueue) commit(command MesosCommand) (response MesosCommandRespon res, err := m.servent.RunCommand(singleCommand, receiver) if err != nil { log.WithField("partition", command.GetEnvironmentId().String()). + WithField(infologger.Level, infologger.IL_Devel). WithError(err). Warning("MesosCommand send error") From 6cc2cb7c6b1692cf00cd0f5517ce4314f6aae7f9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 13 May 2025 14:44:24 +0200 Subject: [PATCH 2144/2352] missing import --- core/controlcommands/commandqueue.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/controlcommands/commandqueue.go b/core/controlcommands/commandqueue.go index 376be03d8..66af7c656 100644 --- a/core/controlcommands/commandqueue.go +++ b/core/controlcommands/commandqueue.go @@ -27,6 +27,7 @@ package controlcommands import ( "errors" "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" "strings" "sync" "time" From ef77c960a2efeb899248b7331b1db9a268b0deb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 13 May 2025 16:27:22 +0200 Subject: [PATCH 2145/2352] Reapply "[core] INVARIANT status introduced" This reverts commit 0a7036b0fd60ce01e932db169a9b3b307e0fb7db. --- core/task/status.go | 93 ++++++---- core/task/status_test.go | 110 +++++++++++ core/task/task_suite_test.go | 37 ++++ core/workflow/safestatus.go | 66 +++++-- core/workflow/safestatus_test.go | 308 +++++++++++++++++++++++++++++++ 5 files changed, 554 insertions(+), 60 deletions(-) create mode 100644 core/task/status_test.go create mode 100644 core/task/task_suite_test.go create mode 100644 core/workflow/safestatus_test.go diff --git a/core/task/status.go b/core/task/status.go index 3bfb35353..f21df2960 100644 --- a/core/task/status.go +++ b/core/task/status.go @@ -32,47 +32,59 @@ const ( PARTIAL ACTIVE UNDEPLOYABLE + INVARIANT // overwritten by product with any other state. It is used only when merging non-critical states. If you merge aggregateState with only non-critical statuses you will propagate INVARIANT further ) -var ( - STATUS_PRODUCT = map[Status]map[Status]Status{ - UNDEFINED: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEFINED, - PARTIAL: UNDEFINED, - ACTIVE: UNDEFINED, - UNDEPLOYABLE: UNDEFINED, - }, - INACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: INACTIVE, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - PARTIAL: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: PARTIAL, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - ACTIVE: { - UNDEFINED: UNDEFINED, - INACTIVE: PARTIAL, - PARTIAL: PARTIAL, - ACTIVE: ACTIVE, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - UNDEPLOYABLE: { - UNDEFINED: UNDEFINED, - INACTIVE: UNDEPLOYABLE, - PARTIAL: UNDEPLOYABLE, - ACTIVE: UNDEPLOYABLE, - UNDEPLOYABLE: UNDEPLOYABLE, - }, - } -) +var STATUS_PRODUCT = map[Status]map[Status]Status{ + UNDEFINED: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEFINED, + PARTIAL: UNDEFINED, + ACTIVE: UNDEFINED, + UNDEPLOYABLE: UNDEFINED, + INVARIANT: UNDEFINED, + }, + INACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: INACTIVE, + }, + PARTIAL: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: PARTIAL, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: PARTIAL, + }, + ACTIVE: { + UNDEFINED: UNDEFINED, + INACTIVE: PARTIAL, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: ACTIVE, + }, + UNDEPLOYABLE: { + UNDEFINED: UNDEFINED, + INACTIVE: UNDEPLOYABLE, + PARTIAL: UNDEPLOYABLE, + ACTIVE: UNDEPLOYABLE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: UNDEPLOYABLE, + }, + INVARIANT: { + UNDEFINED: UNDEFINED, + INACTIVE: INACTIVE, + PARTIAL: PARTIAL, + ACTIVE: ACTIVE, + UNDEPLOYABLE: UNDEPLOYABLE, + INVARIANT: INVARIANT, + }, +} func (s Status) String() string { names := []string{ @@ -81,8 +93,9 @@ func (s Status) String() string { "PARTIAL", "ACTIVE", "UNDEPLOYABLE", + "INVARIANT", } - if s > UNDEPLOYABLE { + if s > INVARIANT { return "UNDEFINED" } return names[s] diff --git a/core/task/status_test.go b/core/task/status_test.go new file mode 100644 index 000000000..b4c429230 --- /dev/null +++ b/core/task/status_test.go @@ -0,0 +1,110 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("task status", func() { + When("product of all statuses with UNDEFINED is done", func() { + undefined := Status(UNDEFINED) + It("should be UNDEFINED for all", func() { + Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEFINED))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(INACTIVE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(PARTIAL))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(ACTIVE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(UNDEPLOYABLE))) + Expect(Status(UNDEFINED)).To(Equal(undefined.X(INVARIANT))) + }) + }) + When("product of all statuses with INACTIVE is done", func() { + inactive := Status(INACTIVE) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(inactive.X(UNDEFINED))) + Expect(Status(INACTIVE)).To(Equal(inactive.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(inactive.X(PARTIAL))) + Expect(Status(PARTIAL)).To(Equal(inactive.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(inactive.X(UNDEPLOYABLE))) + Expect(Status(INACTIVE)).To(Equal(inactive.X(INVARIANT))) + }) + }) + When("product of all statuses with PARTIAL is done", func() { + partial := Status(PARTIAL) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(partial.X(UNDEFINED))) + Expect(Status(PARTIAL)).To(Equal(partial.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(partial.X(PARTIAL))) + Expect(Status(PARTIAL)).To(Equal(partial.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(partial.X(UNDEPLOYABLE))) + Expect(Status(PARTIAL)).To(Equal(partial.X(INVARIANT))) + }) + }) + When("product of all statuses with ACTIVE is done", func() { + active := Status(ACTIVE) + It("should have different results", func() { + Expect(Status(UNDEFINED)).To(Equal(active.X(UNDEFINED))) + Expect(Status(PARTIAL)).To(Equal(active.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(active.X(PARTIAL))) + Expect(Status(ACTIVE)).To(Equal(active.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(active.X(UNDEPLOYABLE))) + Expect(Status(ACTIVE)).To(Equal(active.X(INVARIANT))) + }) + }) + When("product of all statuses with UNDEPLOYABLE is done", func() { + undeployable := Status(UNDEPLOYABLE) + It("should be UNDEPLOYABLE unless UNDEFINED", func() { + Expect(Status(UNDEFINED)).To(Equal(undeployable.X(UNDEFINED))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(PARTIAL))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(UNDEPLOYABLE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(undeployable.X(INVARIANT))) + }) + }) + When("product of all statuses with INVARIANT is done", func() { + invariant := Status(INVARIANT) + It("it should be the status the product was done with", func() { + Expect(Status(UNDEFINED)).To(Equal(invariant.X(UNDEFINED))) + Expect(Status(INACTIVE)).To(Equal(invariant.X(INACTIVE))) + Expect(Status(PARTIAL)).To(Equal(invariant.X(PARTIAL))) + Expect(Status(ACTIVE)).To(Equal(invariant.X(ACTIVE))) + Expect(Status(UNDEPLOYABLE)).To(Equal(invariant.X(UNDEPLOYABLE))) + Expect(Status(INVARIANT)).To(Equal(invariant.X(INVARIANT))) + }) + }) + When("String() of Status is called", func() { + It("should return string representation of a status", func() { + Expect("UNDEFINED").To(Equal(Status(UNDEFINED).String())) + Expect("INACTIVE").To(Equal(Status(INACTIVE).String())) + Expect("PARTIAL").To(Equal(Status(PARTIAL).String())) + Expect("ACTIVE").To(Equal(Status(ACTIVE).String())) + Expect("UNDEPLOYABLE").To(Equal(Status(UNDEPLOYABLE).String())) + Expect("INVARIANT").To(Equal(Status(INVARIANT).String())) + Expect("UNDEFINED").To(Equal(Status(255).String())) + }) + }) +}) diff --git a/core/task/task_suite_test.go b/core/task/task_suite_test.go new file mode 100644 index 000000000..c5f0cf618 --- /dev/null +++ b/core/task/task_suite_test.go @@ -0,0 +1,37 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +func TestTask(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Task Test Suite") +} diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 33f1a2049..044e86be6 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -25,11 +25,13 @@ package workflow import ( + "strconv" "strings" "sync" "github.com/AliceO2Group/Control/core/task" "github.com/sirupsen/logrus" + "github.com/spf13/viper" ) type SafeStatus struct { @@ -37,40 +39,64 @@ type SafeStatus struct { status task.Status } +func reportTraceRoles(roles []Role, status task.Status) { + if viper.GetBool("veryVerbose") { + stati := make([]string, len(roles)) + critical := make([]string, len(roles)) + names := make([]string, len(roles)) + for i, role := range roles { + stati[i] = role.GetStatus().String() + names[i] = role.GetName() + if taskR, isTaskRole := role.(*taskRole); isTaskRole { + critical[i] = strconv.FormatBool(taskR.IsCritical()) + } else if callR, isCallRole := role.(*callRole); isCallRole { + critical[i] = strconv.FormatBool(callR.IsCritical()) + } else { + critical[i] = strconv.FormatBool(true) + } + } + log.WithFields(logrus.Fields{ + "statuses": strings.Join(stati, ", "), + "critical": strings.Join(critical, ", "), + "names": strings.Join(names, ", "), + "aggregated": status.String(), + }). + Trace("aggregating statuses") + } +} + +// role that are not taskRole or callRole are critical by default func aggregateStatus(roles []Role) (status task.Status) { if len(roles) == 0 { status = task.UNDEFINED return } - stati := make([]string, len(roles)) - for i, role := range roles { - stati[i] = role.GetStatus().String() - } - status = roles[0].GetStatus() - if len(roles) > 1 { - for _, c := range roles[1:] { - if status == task.UNDEFINED { - log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "aggregated": status.String(), - }). - Trace("aggregating statuses") + status = task.INVARIANT + for _, role := range roles { + if status == task.UNDEFINED { + break + } - return + if taskR, isTaskRole := role.(*taskRole); isTaskRole { + if !taskR.IsCritical() { + continue + } + } else if callR, isCallRole := role.(*callRole); isCallRole { + if !callR.IsCritical() { + continue } - status = status.X(c.GetStatus()) } + status = status.X(role.GetStatus()) } - log.WithFields(logrus.Fields{ - "statuses": strings.Join(stati, ", "), - "aggregated": status.String(), - }). - Trace("aggregating statuses") + + reportTraceRoles(roles, status) return } +// TODO: this function is prime candidate for refactoring. The reason being that it mostly ignores status argument +// for merging, moreover it also does not use status of role from argument. Both of these behaivour are counter-intuitive. func (t *SafeStatus) merge(s task.Status, r Role) { t.mu.Lock() defer t.mu.Unlock() diff --git a/core/workflow/safestatus_test.go b/core/workflow/safestatus_test.go new file mode 100644 index 000000000..0e2306cc7 --- /dev/null +++ b/core/workflow/safestatus_test.go @@ -0,0 +1,308 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package workflow + +import ( + "github.com/AliceO2Group/Control/core/task" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/spf13/viper" +) + +var _ = Describe("safe status merge", func() { + viper.Set("veryVerbose", true) + When("Task and Call roles are used", func() { + It("status should be overwritten", func() { + { + cr := &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + cr.status.merge(task.ACTIVE, cr) + Expect(cr.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + } + { + tr := &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + } + tr.status.merge(task.INACTIVE, tr) + Expect(tr.GetStatus()).To(Equal(task.Status(task.INACTIVE))) + } + }) + }) + + When("Aggregate role is merged with UNDEFINED status", func() { + It("becomes UNDEFINED", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} + ar.status.merge(task.UNDEFINED, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Empty aggregate role is merged with any status (except UNDEFINED) status", func() { + It("becomes UNDEFINED", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}} + ar.status.merge(task.ACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Aggregate role is merged with the same status", func() { + It("does not change it's status", func() { + ar := &aggregatorRole{roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}} + ar.status.merge(task.ACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has ACTIVE subroles", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + // SafeStatus.Merge basically ignores status argument in a lot of cases, so it does not matter what we use here + // and in following tests + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes PARTIAL from INACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes PARTIAL from PARTIAL", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.PARTIAL}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEPLOYABLE from UNDEPLOYABLE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEPLOYABLE))) + }) + }) + + When("Aggregator role has one ACTIVE subrole", func() { + It("becomes UNDEFINED from UNDEFINED", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.UNDEFINED))) + }) + }) + + When("Aggregator role has no critical roles", func() { + It("becomes INVARIANT regardless of subrole statuses", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEPLOYABLE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.INVARIANT))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one ACTIVE aggregator role", func() { + It("becomes ACTIVE", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.ACTIVE))) + }) + }) + + When("Aggregator role has one ACTIVE critical subrole and one INACTIVE non critical role and one INACTIVE aggregator role", func() { + It("becomes PARTIAL", func() { + ar := &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.UNDEFINED}}, + aggregator: aggregator{ + []Role{ + &callRole{ + roleBase: roleBase{status: SafeStatus{status: task.ACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: true}, + }, + &taskRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + Traits: task.Traits{Trigger: "", Await: "", Timeout: "", Critical: false}, + }, + &aggregatorRole{ + roleBase: roleBase{status: SafeStatus{status: task.INACTIVE}}, + }, + }, + }, + } + ar.status.merge(task.INACTIVE, ar) + Expect(ar.GetStatus()).To(Equal(task.Status(task.PARTIAL))) + }) + }) +}) From 8b14cc3055bb15a20a98545e1716ea10fca0121e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 15 May 2025 10:38:06 +0200 Subject: [PATCH 2146/2352] [build] Bump AliECS to v1.35.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 2d5c22050..2b4e01ec0 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 34 -VERSION_PATCH := 2 +VERSION_MINOR := 35 +VERSION_PATCH := 0 From 1cfa87d12568458f297dbb7134b6849f4d095dba Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 19 May 2025 15:58:07 +0200 Subject: [PATCH 2147/2352] [core] split TRG cleanup into two calls for distinguishable kafka events This commit splits trg.Cleanup() into two calls which should be used subsequently instead of trg.Cleanup. Thanks to this, the GUIs can listen to kafka events for a specific operationName ("trg.EnsureRunStop") for trigger stop timestamp. We preferred to avoid having the GUIs hunt for operationStep "perform TRG call: RunStop", which seems to be a message targeted for humans and could be more prone to change, thus breaking behaviour in GUIs. Fixes OCTRL-1017. --- core/integration/trg/plugin.go | 78 +++++++++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 78abb68d0..c070eadcb 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -1285,6 +1285,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return runUnloadFunc(ctx, runNumber64) } stack["Cleanup"] = func() (out string) { + // obsolete, EnsureRunStop and EnsureRunUnload should be used instead one after another. envId, ok := varStack["environment_id"] if !ok { log.WithField("partition", envId). @@ -1303,7 +1304,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("run", runNumberStop). WithField("partition", envId). WithField("level", infologger.IL_Devel). - Debug("pending TRG Stop found, performing cleanup") + Info("pending TRG Stop found, performing cleanup") delete(p.pendingRunStops, envId) _ = runStopFunc(ctx, runNumberStop) @@ -1330,7 +1331,80 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { log.WithField("run", runNumberUnload). WithField("partition", envId). WithField("level", infologger.IL_Devel). - Debug("pending TRG Unload found, performing cleanup") + Info("pending TRG Unload found, performing cleanup") + + delete(p.pendingRunUnloads, envId) + _ = runUnloadFunc(ctx, runNumberUnload) + } else { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("TRG cleanup: Unload not needed") + } + return + } + stack["EnsureRunStop"] = func() (out string) { + // if there is a run to stop, it is stopped, otherwise we do nothing (no errors, no events) + envId, ok := varStack["environment_id"] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Warn("no environment_id found for TRG EnsureRunStop") + return + } + + timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "EnsureRunStop", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + // runStop if found pending + runNumberStop, ok := p.pendingRunStops[envId] + if ok { + log.WithField("run", runNumberStop). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Info("pending TRG Stop found, performing cleanup") + + delete(p.pendingRunStops, envId) + _ = runStopFunc(ctx, runNumberStop) + + trgEndTime := strconv.FormatInt(time.Now().UnixMilli(), 10) + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if ok { + parentRole.SetGlobalRuntimeVar("trg_end_time_ms", trgEndTime) + } else { + log.WithField("partition", envId). + WithField("run", runNumberStop). + WithField("trgEndTime", trgEndTime). + Debug("could not get parentRole and set TRG end time") + } + } else { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Debug("TRG cleanup: Stop not needed") + } + return + } + stack["EnsureRunUnload"] = func() (out string) { + // if there is a run to unload, it is unloaded, otherwise we do nothing (no errors, no events) + envId, ok := varStack["environment_id"] + if !ok { + log.WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Warn("no environment_id found for TRG EnsureRunUnload") + return + } + + timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "EnsureRunUnload", envId) + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + // runUnload if found pending + runNumberUnload, ok := p.pendingRunUnloads[envId] + if ok { + log.WithField("run", runNumberUnload). + WithField("partition", envId). + WithField("level", infologger.IL_Devel). + Info("pending TRG Unload found, performing cleanup") delete(p.pendingRunUnloads, envId) _ = runUnloadFunc(ctx, runNumberUnload) From e07b4e8a4610ae32148f9c657c780123a2c0b2e0 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 22 May 2025 09:48:47 +0200 Subject: [PATCH 2148/2352] [build] Bump to v1.36.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 2b4e01ec0..10221ab68 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 35 +VERSION_MINOR := 36 VERSION_PATCH := 0 From 3de5be82d9a38a0e45a33544ca593bdd8b92b084 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 22 May 2025 15:27:41 +0200 Subject: [PATCH 2149/2352] [core] allow to specify a test state sequence upon DCS requests When ECS2DCS2ECS is used as the DCS server, one can specify expected reply to requests by adding "STATE_SEQUENCE" to request extra parameters with a key formatted as below: ``` MILLIS_DELAY:DETECTOR_STATE[,MILLIS_DELAY:DETECTOR_STATE]* ``` This commit exposes a possibility to set these sequences via configuration parameters. Essentially, this allows us to have some configurations on staging which use DCS with pre-defined state sequences. --- core/integration/dcs/plugin.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 03fa94383..7771cdf3a 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -640,6 +640,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, log.WithField("detector", ecsDet)) + // a state sequence that can be defined in order to get an expected answer, useful for testing. + // format: MILLIS_DELAY:DETECTOR_STATE[,MILLIS_DELAY:DETECTOR_STATE]* + pfrStateSequence, ok := varStack["dcs_pfr_state_sequence"] + if ok { + detectorArgMap["STATE_SEQUENCE"] = pfrStateSequence + } + in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, ExtraParameters: detectorArgMap, @@ -1255,6 +1262,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorArgMap = addEnabledLinks(detectorArgMap, varStack, ecsDet, log.WithField("detector", ecsDet)) + // a state sequence that can be defined in order to get an expected answer, useful for testing. + // format: MILLIS_DELAY:DETECTOR_STATE[,MILLIS_DELAY:DETECTOR_STATE]* + sorStateSequence, ok := varStack["dcs_sor_state_sequence"] + if ok { + detectorArgMap["STATE_SEQUENCE"] = sorStateSequence + } + in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, ExtraParameters: detectorArgMap, @@ -1740,6 +1754,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } + // a state sequence that can be defined in order to get an expected answer, useful for testing. + // format: MILLIS_DELAY:DETECTOR_STATE[,MILLIS_DELAY:DETECTOR_STATE]* + eorStateSequence, ok := varStack["dcs_eor_state_sequence"] + if ok { + detectorArgMap["STATE_SEQUENCE"] = eorStateSequence + } in.Detectors[i] = &dcspb.DetectorOperationRequest{ Detector: dcsDet, From 72e0a6ac771f54aadab17000e5f4c28b90f80978 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 22 May 2025 08:08:03 +0200 Subject: [PATCH 2150/2352] [build] bump enumer to fix generation with go 1.24 This fixes `make generate`, which fails due to the issue discussed in https://github.com/dmarkham/enumer/issues/105 --- go.mod | 6 +++--- go.sum | 6 ++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7c605f97a..5cf831e29 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/Microsoft/go-winio v0.6.1 // indirect github.com/briandowns/spinner v1.23.0 github.com/denisbrodbeck/machineid v1.0.1 - github.com/dmarkham/enumer v1.5.8 + github.com/dmarkham/enumer v1.5.11 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.7.4 github.com/go-git/go-git/v5 v5.13.0 @@ -165,11 +165,11 @@ require ( github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.19.0 // indirect + golang.org/x/mod v0.23.0 // indirect golang.org/x/sync v0.12.0 // indirect golang.org/x/term v0.30.0 // indirect golang.org/x/text v0.23.0 // indirect - golang.org/x/tools v0.23.0 // indirect + golang.org/x/tools v0.30.0 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect diff --git a/go.sum b/go.sum index 6dfc979df..e63fcbbfc 100644 --- a/go.sum +++ b/go.sum @@ -61,6 +61,8 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= +github.com/dmarkham/enumer v1.5.11 h1:quorLCaEfzjJ23Pf7PB9lyyaHseh91YfTM/sAD/4Mbo= +github.com/dmarkham/enumer v1.5.11/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8= github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -479,6 +481,8 @@ golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= +golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -571,6 +575,8 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= +golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= +golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From f70c5f0650e0a2fd334c2ae0556835f013af7fab Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 30 Apr 2025 14:39:06 +0200 Subject: [PATCH 2151/2352] [doc] remove FLP doc sync from the release procedure there is no need for it, it is synced automatically. --- docs/development.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/development.md b/docs/development.md index bfccde00a..0c94e2fca 100644 --- a/docs/development.md +++ b/docs/development.md @@ -13,7 +13,6 @@ Bugs go to [JIRA](https://alice.its.cern.ch/jira/browse/OCTRL). 3. Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. 4. Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. 5. Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. -6. Go to your local clone of [`alice-flp/documentation`](https://gitlab.cern.ch/alice-flp/documentation), descend into `docs/aliecs`. `git pull --rebase` to ensure the submodule points to the tag created just now. Commit and push (or merge request). -7. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). -8. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). -9. Submit pull request with the above to `alisw/alidist`. +6. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). +7. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). +8. Submit pull request with the above to `alisw/alidist`. From 21d975e4af6f0ff17b9f4f175423a973fd45cecc Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 30 Apr 2025 15:17:35 +0200 Subject: [PATCH 2152/2352] [doc] add a GH workflow to look for broken links --- .github/workflows/linkspector.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .github/workflows/linkspector.yml diff --git a/.github/workflows/linkspector.yml b/.github/workflows/linkspector.yml new file mode 100644 index 000000000..20999edf5 --- /dev/null +++ b/.github/workflows/linkspector.yml @@ -0,0 +1,15 @@ +name: Linkspector +on: [pull_request] +jobs: + check-links: + name: runner / linkspector + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Run linkspector + uses: umbrelladocs/action-linkspector@v1 + with: + github_token: ${{ secrets.github_token }} + reporter: github-pr-check + fail_level: any + filter_mode: nofilter From 39b3b375eb6f84297b43afb0ea31173185fb268a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 6 May 2025 09:07:17 +0200 Subject: [PATCH 2153/2352] [doc] add common.proto and events.proto to aliecs API doc without these two, protoc doc generator creates broken links to messages in imported protos. --- Makefile | 2 +- apricot/README.md | 2 +- docs/apidocs_aliecs.md | 335 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 337 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8a3a5deee..483758d5f 100644 --- a/Makefile +++ b/Makefile @@ -313,7 +313,7 @@ docs/coconut: docs/grpc: @echo -e "generating gRPC API documentation \033[1;33m==>\033[0m \033[1;34m./docs\033[0m" @cd apricot/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_apricot.md "apricot.proto" - @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc -I=. -I=../../common --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_aliecs.md "o2control.proto" + @cd core/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc -I=. -I=../../common --doc_out="$(ROOT_DIR)/docs" --experimental_allow_proto3_optional --doc_opt=markdown,apidocs_aliecs.md o2control.proto ../../common/protos/events.proto ../../common/protos/common.proto @cd occ/protos && PATH="$(ROOT_DIR)/tools:$$PATH" protoc --doc_out="$(ROOT_DIR)/docs" --doc_opt=markdown,apidocs_occ.md "occ.proto" docs/swaggo: diff --git a/apricot/README.md b/apricot/README.md index 243b580d1..0ad56e0fc 100644 --- a/apricot/README.md +++ b/apricot/README.md @@ -11,4 +11,4 @@ Usage of bin/o2-apricot: --verbose Verbose logging ``` -Protofile: [apricot.proto](apricot/protos/apricot.proto) +Protofile: [apricot.proto](protos/apricot.proto) diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 6783e0b13..f14d9981d 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -88,6 +88,26 @@ - [Control](#o2control-Control) +- [protos/events.proto](#protos_events-proto) + - [Ev_CallEvent](#events-Ev_CallEvent) + - [Ev_EnvironmentEvent](#events-Ev_EnvironmentEvent) + - [Ev_EnvironmentEvent.VarsEntry](#events-Ev_EnvironmentEvent-VarsEntry) + - [Ev_IntegratedServiceEvent](#events-Ev_IntegratedServiceEvent) + - [Ev_MetaEvent_CoreStart](#events-Ev_MetaEvent_CoreStart) + - [Ev_MetaEvent_FrameworkEvent](#events-Ev_MetaEvent_FrameworkEvent) + - [Ev_MetaEvent_MesosHeartbeat](#events-Ev_MetaEvent_MesosHeartbeat) + - [Ev_RoleEvent](#events-Ev_RoleEvent) + - [Ev_RunEvent](#events-Ev_RunEvent) + - [Ev_TaskEvent](#events-Ev_TaskEvent) + - [Event](#events-Event) + - [Traits](#events-Traits) + + - [OpStatus](#events-OpStatus) + +- [protos/common.proto](#protos_common-proto) + - [User](#common-User) + - [WorkflowTemplateInfo](#common-WorkflowTemplateInfo) + - [Scalar Value Types](#scalar-value-types) @@ -1488,6 +1508,321 @@ Not implemented yet + +

Top

+ +## protos/events.proto + + + + + +### Ev_CallEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| func | [string](#string) | | name of the function being called, within the workflow template context | +| callStatus | [OpStatus](#events-OpStatus) | | progress or success/failure state of the call | +| return | [string](#string) | | return value of the function | +| traits | [Traits](#events-Traits) | | | +| output | [string](#string) | | any additional output of the function | +| error | [string](#string) | | error value, if returned | +| environmentId | [string](#string) | | | +| path | [string](#string) | | path to the parent callRole of this call within the environment | + + + + + + + + +### Ev_EnvironmentEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| environmentId | [string](#string) | | | +| state | [string](#string) | | | +| runNumber | [uint32](#uint32) | | only when the environment is in the running state | +| error | [string](#string) | | | +| message | [string](#string) | | any additional message concerning the current state or transition | +| transition | [string](#string) | | | +| transitionStep | [string](#string) | | | +| transitionStatus | [OpStatus](#events-OpStatus) | | | +| vars | [Ev_EnvironmentEvent.VarsEntry](#events-Ev_EnvironmentEvent-VarsEntry) | repeated | consolidated environment variables at the root role of the environment | +| lastRequestUser | [common.User](#common-User) | | | +| workflowTemplateInfo | [common.WorkflowTemplateInfo](#common-WorkflowTemplateInfo) | | | + + + + + + + + +### Ev_EnvironmentEvent.VarsEntry + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| key | [string](#string) | | | +| value | [string](#string) | | | + + + + + + + + +### Ev_IntegratedServiceEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | name of the context, usually the path of the callRole that calls a given integrated service function e.g. readout-dataflow.dd-scheduler.terminate | +| error | [string](#string) | | error message, if any | +| operationName | [string](#string) | | name of the operation, usually the name of the integrated service function being called e.g. ddsched.PartitionTerminate()" | +| operationStatus | [OpStatus](#events-OpStatus) | | progress or success/failure state of the operation | +| operationStep | [string](#string) | | if the operation has substeps, this is the name of the current substep, like an API call or polling phase | +| operationStepStatus | [OpStatus](#events-OpStatus) | | progress or success/failure state of the current substep | +| environmentId | [string](#string) | | | +| payload | [string](#string) | | any additional payload, depending on the integrated service; there is no schema, it can even be the raw return structure of a remote API call | + + + + + + + + +### Ev_MetaEvent_CoreStart + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| frameworkId | [string](#string) | | | + + + + + + + + +### Ev_MetaEvent_FrameworkEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| frameworkId | [string](#string) | | | +| message | [string](#string) | | | + + + + + + + + +### Ev_MetaEvent_MesosHeartbeat + + + + + + + + + +### Ev_RoleEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | role name | +| status | [string](#string) | | posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. Derived from the state of child tasks, calls or other roles | +| state | [string](#string) | | state machine state for this role | +| rolePath | [string](#string) | | path to this role within the environment | +| environmentId | [string](#string) | | | + + + + + + + + +### Ev_RunEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| environmentId | [string](#string) | | | +| runNumber | [uint32](#uint32) | | | +| state | [string](#string) | | | +| error | [string](#string) | | | +| transition | [string](#string) | | | +| transitionStatus | [OpStatus](#events-OpStatus) | | | +| lastRequestUser | [common.User](#common-User) | | | + + + + + + + + +### Ev_TaskEvent + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | task name, based on the name of the task class | +| taskid | [string](#string) | | task id, unique | +| state | [string](#string) | | state machine state for this task | +| status | [string](#string) | | posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. | +| hostname | [string](#string) | | | +| className | [string](#string) | | name of the task class from which this task was spawned | +| traits | [Traits](#events-Traits) | | | +| environmentId | [string](#string) | | | +| path | [string](#string) | | path to the parent taskRole of this task within the environment | + + + + + + + + +### Event + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| timestamp | [int64](#int64) | | | +| timestampNano | [int64](#int64) | | | +| environmentEvent | [Ev_EnvironmentEvent](#events-Ev_EnvironmentEvent) | | | +| taskEvent | [Ev_TaskEvent](#events-Ev_TaskEvent) | | | +| roleEvent | [Ev_RoleEvent](#events-Ev_RoleEvent) | | | +| callEvent | [Ev_CallEvent](#events-Ev_CallEvent) | | | +| integratedServiceEvent | [Ev_IntegratedServiceEvent](#events-Ev_IntegratedServiceEvent) | | | +| runEvent | [Ev_RunEvent](#events-Ev_RunEvent) | | | +| frameworkEvent | [Ev_MetaEvent_FrameworkEvent](#events-Ev_MetaEvent_FrameworkEvent) | | | +| mesosHeartbeatEvent | [Ev_MetaEvent_MesosHeartbeat](#events-Ev_MetaEvent_MesosHeartbeat) | | | +| coreStartEvent | [Ev_MetaEvent_CoreStart](#events-Ev_MetaEvent_CoreStart) | | | + + + + + + + + +### Traits + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| trigger | [string](#string) | | | +| await | [string](#string) | | | +| timeout | [string](#string) | | | +| critical | [bool](#bool) | | | + + + + + + + + + + +### OpStatus + + +| Name | Number | Description | +| ---- | ------ | ----------- | +| NULL | 0 | | +| STARTED | 1 | | +| ONGOING | 2 | | +| DONE_OK | 3 | | +| DONE_ERROR | 4 | | +| DONE_TIMEOUT | 5 | | + + + + + + + + + + + +

Top

+ +## protos/common.proto + + + + + +### User + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| externalId | [int32](#int32) | optional | The unique CERN identifier of this user. | +| id | [int32](#int32) | optional | The unique identifier of this entity. | +| name | [string](#string) | | Name of the user. | + + + + + + + + +### WorkflowTemplateInfo + + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| name | [string](#string) | | | +| description | [string](#string) | | | +| path | [string](#string) | | | +| public | [bool](#bool) | | whether the environment is public or not | + + + + + + + + + + + + + + + ## Scalar Value Types | .proto Type | Notes | C++ | Java | Python | Go | C# | PHP | Ruby | From 57d49c59fc274d596570d977b8c5b04f5ce248a6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 7 May 2025 10:56:13 +0200 Subject: [PATCH 2154/2352] [doc] Table of Contents in README.md and filling missing bits --- README.md | 210 ++++++++++++++++---- apricot/README.md | 19 +- apricot/docs/apricot.md | 6 +- apricot/docs/apricot_http_service.md | 2 +- coconut/README.md | 2 +- core/integration/README.md | 158 +++++++++++++++ core/protos/o2control.proto | 8 + docs/CONTRIBUTING.md | 49 +++++ docs/apidocs_aliecs.md | 8 +- docs/building.md | 4 +- docs/faq.md | 2 - docs/handbook/AliECS-environment.png | Bin 0 -> 85353 bytes docs/handbook/appconfiguration.md | 8 +- docs/handbook/concepts.md | 31 ++- docs/handbook/configuration.md | 17 +- docs/handbook/operation_order.md | 131 ++---------- docs/handbook/overview.md | 7 +- docs/kafka.md | 6 +- docs/running.md | 10 +- docs/using_grpcc_occ.md | 2 +- hacking/COG.md | 6 +- occ/README.md | 2 +- occ/occlib/examples/dummy-process/README.md | 2 +- occ/peanut/README.md | 2 +- 24 files changed, 476 insertions(+), 216 deletions(-) create mode 100644 core/integration/README.md create mode 100644 docs/CONTRIBUTING.md delete mode 100644 docs/faq.md create mode 100644 docs/handbook/AliECS-environment.png diff --git a/README.md b/README.md index c72abca5b..17d77d234 100644 --- a/README.md +++ b/README.md @@ -2,54 +2,192 @@ [![godoc](https://img.shields.io/badge/godoc-Reference-5272B4.svg)](https://godoc.org/github.com/AliceO2Group/Control) # AliECS -The ALICE Experiment Control System +The ALICE Experiment Control System (**AliECS**) is the piece of software to drive and control data taking activities in the experiment. +It is a distributed system that combines state of the art cluster resource management and experiment control functionalities into a single comprehensive solution. -## Install instructions +Please refer to the [CHEP 2023 paper](https://doi.org/10.1051/epjconf/202429502027) for the latest design overview. -What is your use case? +## How to get started -* I want to **run AliECS** and other O²/FLP software +Regardless of your particular interests, it is recommended to get acquainted with the main [AliECS concepts](docs/handbook/concepts.md). - :arrow_right: [O²/FLP Suite deployment instructions](https://alice-flp.docs.cern.ch/system-configuration/utils/o2-flp-setup/) +After that, please find your concrete use case: - These instructions apply to both single-node and multi-node deployments. +### I want to **run AliECS** and other O²/FLP software - Contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. - -* I want to ensure AliECS can **run and control my process** +See [O²/FLP Suite deployment instructions](https://alice-flp.docs.cern.ch/system-configuration/utils/o2-flp-setup/) - * My software is based on FairMQ and/or O² DPL - - :palm_tree: Nothing to do, AliECS natively supports FairMQ (and DPL) devices. - - * My software does not use FairMQ and/or DPL, but should be controlled through a state machine - - :telescope: See [the OCC documentation](occ/README.md) to learn how to integrate the O² Control and Configuration library with your software. [Readout](https://github.com/AliceO2Group/Readout) is currently the only example of this setup. - - * My software is a command line utility with no state machine - - :palm_tree: Nothing to do, AliECS natively supports generic commands. Make sure the task template for your command sets the control mode to `basic` ([see example](https://github.com/AliceO2Group/ControlWorkflows/blob/basic-tasks/tasks/sleep.yaml)). - -* I want to build and run AliECS for **development** purposes +These instructions apply to both single-node and multi-node deployments. +Contact [alice-o2-flp-support](mailto:alice-o2-flp-support@cern.ch) for assistance with provisioning and deployment. - :hammer_and_wrench: [Building instructions](https://alice-flp.docs.cern.ch/aliecs/building/) - - :arrow_right: [Running instructions](https://alice-flp.docs.cern.ch/aliecs/running/) +There are two ways of interacting with AliECS: -* I want to communicate with AliECS via one of the plugins - - * [Receive updates on running environments via Kafka](docs/kafka.md) +- The AliECS GUI (a.k.a. Control GUI, COG) - not in this repository, but included in most deployments, recommended -## Using AliECS + :arrow_right: [AliECS GUI documentation](hacking/COG.md) -There are two ways of interacting with AliECS: - -* The AliECS GUI - not in this repository, but included in most deployments, recommended +- `coconut` - the command-line control and configuration utility, included with AliECS core, typically for developers and advanced users - :arrow_right: [AliECS GUI documentation](hacking/COG.md) + :arrow_right: [Using `coconut`](https://alice-flp.docs.cern.ch/aliecs/coconut/) + + :arrow_right: [`coconut` command reference](https://alice-flp.docs.cern.ch/aliecs/coconut/doc/coconut/) -* `coconut` - the command-line control and configuration utility, included with AliECS core +### I want to ensure AliECS can **run and control my process** + +* **My software is based on FairMQ and/or O² DPL (Data Processing Later)** + + AliECS natively supports FairMQ (and DPL) devices. + Head to [ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) for instructions on how to configure your software to be controlled by AliECS. + +* **My software does not use FairMQ and/or DPL, but should be controlled through a state machine** + + See [the OCC documentation](occ/README.md) to learn how to integrate the O² Control and Configuration library with your software. [Readout](https://github.com/AliceO2Group/Readout) is an example of this setup. + + Once ready, head to [ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) for instructions on how to configure it to be controlled by AliECS. - :arrow_right: [Using `coconut`](https://alice-flp.docs.cern.ch/aliecs/coconut/) +* **My software is a command line utility with no state machine** + + AliECS natively supports generic commands. + Head to [ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) for instructions to have your command ran by AliECS. + Make sure the task template for your command sets the control mode to `basic` ([see example](https://github.com/AliceO2Group/ControlWorkflows/blob/master/tasks/o2-roc-cleanup.yaml)). - :arrow_right: [`coconut` command reference](https://alice-flp.docs.cern.ch/aliecs/coconut/doc/coconut/) +### I want to develop AliECS + +:hammer_and_wrench: Welcome to the team, please head to [contributing instructions](/docs/CONTRIBUTING.md) + +### I want to receive updates about environments or services controlled by AliECS + +:pager: Learn more about the [kafka event service](/docs/kafka.md) + +### I want my application to send requests to AliECS + +:scroll: See the API docs of AliECS components: +- [core gRPC server](/docs/apidocs_aliecs.md) +- [apricot gRPC server](/docs/apidocs_apricot.md) +- [apricot HTTP server](/apricot/docs/apricot_http_service.md) + +### I want my service to be sent requests by AliECS + +:electric_plug: Learn more about the [plugin system](/core/integration/README.md) + +## Table of Contents + +* Introduction + * [Basic Concepts](/docs/handbook/concepts.md#basic-concepts) + * [Tasks](/docs/handbook/concepts.md#tasks) + * [Workflows, roles and environments](/docs/handbook/concepts.md#workflows-roles-and-environments) + * [Design Overview](/docs/handbook/overview.md#design-overview) + * [AliECS Structure](/docs/handbook/overview.md#aliecs-structure) + * [Resource Management](/docs/handbook/overview.md#resource-management) + * [FairMQ](/docs/handbook/overview.md#fairmq) + * [State machines](/docs/handbook/overview.md#state-machines) + +* Component reference + * AliECS GUI + * [AliECS GUI overview](/hacking/COG.md) + * AliECS core + * [Workflow Configuration](/docs/handbook/configuration.md#workflow-configuration) + * [The AliECS workflow template language](/docs/handbook/configuration.md#the-aliecs-workflow-template-language) + * [Workflow template structure](/docs/handbook/configuration.md#workflow-template-structure) + * [Task roles](/docs/handbook/configuration.md#task-roles) + * [Call roles](/docs/handbook/configuration.md#call-roles) + * [Aggregator roles](/docs/handbook/configuration.md#aggregator-roles) + * [Iterator roles](/docs/handbook/configuration.md#iterator-roles) + * [Include roles](/docs/handbook/configuration.md#include-roles) + * [Template expressions](/docs/handbook/configuration.md#template-expressions) + * [Task Configuration](/docs/handbook/configuration.md#task-configuration) + * [Task template structure](/docs/handbook/configuration.md#task-template-structure) + * [Variables pushed to controlled tasks](/docs/handbook/configuration.md#variables-pushed-to-controlled-tasks) + * [Resource wants and limits](/docs/handbook/configuration.md#resource-wants-and-limits) + * [Integration plugins](/core/integration/README.md#integration-plugins) + * [Plugin system overview](/core/integration/README.md#plugin-system-overview) + * [Integrated service operations](/core/integration/README.md#integrated-service-operations) + * [Bookkeeping](/core/integration/README.md#bookkeeping) + * [CCDB](/core/integration/README.md#ccdb) + * [DCS](/core/integration/README.md#dcs) + * [DCS operations](/core/integration/README.md#dcs-operations) + * [DCS PrepareForRun behaviour](/core/integration/README.md#dcs-prepareforrun-behaviour) + * [DCS StartOfRun behaviour](/core/integration/README.md#dcs-startofrun-behaviour) + * [DCS EndOfRun behaviour](/core/integration/README.md#dcs-endofrun-behaviour) + * [DD Scheduler](/core/integration/README.md#dd-scheduler) + * [Kafka (legacy)](/core/integration/README.md#kafka-legacy) + * [ODC](/core/integration/README.md#odc) + * [Test plugin](/core/integration/README.md#test-plugin) + * [Trigger](/core/integration/README.md#trigger) + * [Environment operation order](/docs/handbook/operation_order.md#environment-operation-order) + * [State machine triggers](/docs/handbook/operation_order.md#state-machine-triggers) + * [START_ACTIVITY (Start Of Run)](/docs/handbook/operation_order.md#start_activity-start-of-run) + * [STOP_ACTIVITY (End Of Run)](/docs/handbook/operation_order.md#stop_activity-end-of-run) + * [Protocol documentation](/docs/apidocs_aliecs.md) + * coconut + * [The O² control and configuration utility overview](/coconut/README.md#the-o-control-and-configuration-utility-overview) + * [Configuration file](/coconut/README.md#configuration-file) + * [Using coconut](/coconut/README.md#using-coconut) + * [Creating an environment](/coconut/README.md#creating-an-environment) + * [Controlling an environment](/coconut/README.md#controlling-an-environment) + * [Command reference](/coconut/doc/coconut.md) + * apricot + * [ALICE configuration service overview](/apricot/README.md#alice-configuration-service-overview) + * [HTTP service](/apricot/docs/apricot_http_service.md#apricot-http-service) + * [Configuration](/apricot/docs/apricot_http_service.md#configuration) + * [Usage and options](/apricot/docs/apricot_http_service.md#usage-and-options) + * [Examples](/apricot/docs/apricot_http_service.md#examples) + * [Protocol documentation](/docs/apidocs_apricot.md) + * [Command reference](/apricot/docs/apricot.md) + * occ + * [O² Control and Configuration Components](/occ/README.md#o-control-and-configuration-components) + * [Developer quick start instructions for OCClib](/occ/README.md#developer-quick-start-instructions-for-occlib) + * [Manual build instructions](/occ/README.md#manual-build-instructions) + * [Run example](/occ/README.md#run-example) + * [The OCC state machine](/occ/README.md#the-occ-state-machine) + * [Single process control with peanut](/occ/README.md#single-process-control-with-peanut) + * [OCC API debugging with grpcc](/occ/README.md#occ-api-debugging-with-grpcc) + * [Dummy process example for OCC library](/occ/occlib/examples/dummy-process/README.md#dummy-process-example-for-occ-library) + * [Protocol documentation](/docs/apidocs_occ.md) + * peanut + * [Process control and execution utility overview](/occ/peanut/README.md) + * Event service + * [Kafka producer functionality in AliECS core](/docs/kafka.md#kafka-producer-functionality-in-aliecs-core) + * [Making sure that AliECS sends messages](/docs/kafka.md#making-sure-that-aliecs-sends-messages) + * [Currently available topics](/docs/kafka.md#currently-available-topics) + * [Decoding the messages](/docs/kafka.md#decoding-the-messages) + * [Legacy events: Kafka plugin](/docs/kafka.md#legacy-events-kafka-plugin) + * [Making sure that AliECS sends messages](/docs/kafka.md#making-sure-that-aliecs-sends-messages-1) + * [Currently available topics](/docs/kafka.md#currently-available-topics-1) + * [Decoding the messages](/docs/kafka.md#decoding-the-messages-1) + * [Getting Start of Run and End of Run notifications](/docs/kafka.md#getting-start-of-run-and-end-of-run-notifications) + * [Using Kafka debug tools](/docs/kafka.md#using-kafka-debug-tools) + +* Developer documentation + * [Contributing](/docs/CONTRIBUTING.md) + * [Package pkg.go.dev documentation](https://pkg.go.dev/github.com/AliceO2Group/Control) + * [Building AliECS](/docs/building.md#building-aliecs) + * [Overview](/docs/building.md#overview) + * [Building with aliBuild](/docs/building.md#building-with-alibuild) + * [Manual build](/docs/building.md#manual-build) + * [Go environment](/docs/building.md#go-environment) + * [Clone and build (Go components only)](/docs/building.md#clone-and-build-go-components-only) + * [Makefile reference](/docs/makefile_reference.md) + * [Component Configuration](/docs/handbook/appconfiguration.md#component-configuration) + * [Apache Mesos](/docs/handbook/appconfiguration.md#apache-mesos) + * [Connectivity to controlled nodes](/docs/handbook/appconfiguration.md#connectivity-to-controlled-nodes) + * [Running AliECS as a developer](/docs/running.md#running-aliecs-as-a-developer) + * [Running the AliECS core](/docs/running.md#running-the-aliecs-core) + * [Running AliECS in production](/docs/running.md#running-aliecs-in-production) + * [Health checks](/docs/running.md#health-checks) + * [Development Information](/docs/development.md#development-information) + * [Release Procedure](/docs/development.md#release-procedure) + * [Metrics in ECS](/docs/metrics.md#metrics-in-ecs) + * [Overview and simple usage](/docs/metrics.md#overview-and-simple-usage) + * [Types and aggregation of metrics](/docs/metrics.md#types-and-aggregation-of-metrics) + * [Metric types](/docs/metrics.md#metric-types) + * [Aggregation](/docs/metrics.md#aggregation) + * [Implementation details](/docs/metrics.md#implementation-details) + * [Event loop](/docs/metrics.md#event-loop) + * [Hashing to aggregate](/docs/metrics.md#hashing-to-aggregate) + * [Sampling reservoir](/docs/metrics.md#sampling-reservoir) + * [OCC API debugging with grpcc](/docs/using_grpcc_occ.md#occ-api-debugging-with-grpcc) + +* Resources + * T. Mrnjavac et. al, [AliECS: A New Experiment Control System for the ALICE Experiment](https://doi.org/10.1051/epjconf/202429502027), CHEP23 + diff --git a/apricot/README.md b/apricot/README.md index 0ad56e0fc..c32dce703 100644 --- a/apricot/README.md +++ b/apricot/README.md @@ -1,14 +1,9 @@ -# `APRICOT` +# ALICE configuration service overview -**A** **p**rocessor and **r**epos**i**tory for **co**nfiguration **t**emplates +**A** **p**rocessor and **r**epos**i**tory for **co**nfiguration **t**emplates, or apricot, implements the configuration service for the ALICE data taking activities. +It adds templating, load balancing and caching on top of the configuration store. -The `o2-apricot` binary implements a centralized configuration (micro)service for ALICE O². - -``` -Usage of bin/o2-apricot: - --backendUri string URI of the Consul server or YAML configuration file (default "consul://127.0.0.1:8500") - --listenPort int Port of apricot server (default 32101) - --verbose Verbose logging -``` - -Protofile: [apricot.proto](protos/apricot.proto) +See also: +* [apricot HTTP service](docs/apricot_http_service.md) - make essential cluster information available via a web server +* Protofile: [apricot.proto](protos/apricot.proto) +* [Command reference](docs/apricot.md) diff --git a/apricot/docs/apricot.md b/apricot/docs/apricot.md index e0448f6d8..43fd6027b 100644 --- a/apricot/docs/apricot.md +++ b/apricot/docs/apricot.md @@ -13,8 +13,4 @@ Usage of bin/o2-apricot: --backendUri string URI of the Consul server or YAML configuration file (default "consul://127.0.0.1:8500") --listenPort int Port of apricot server (default 32101) --verbose Verbose logging -``` - -### SEE ALSO - -* [apricot HTTP service](apricot_http_service.md) - make essential cluster information available via a web server +``` \ No newline at end of file diff --git a/apricot/docs/apricot_http_service.md b/apricot/docs/apricot_http_service.md index 15dd91a97..fd4609736 100644 --- a/apricot/docs/apricot_http_service.md +++ b/apricot/docs/apricot_http_service.md @@ -46,4 +46,4 @@ Besides configuration retrieval, the API also includes calls for browsing the co Getting a template-processed configuration payload for a component (entry `tpc-full-qcmn` for component `qc`, with `list_of_detectors` and `run_type` passed as template variables): * In a browser: `http://localhost:32188/components/qc/ANY/any/tpc-full-qcmn?process=true&list_of_detectors=tpc,its&run_type=PHYSICS` -* With `curl`: `curl http://127.0.0.1:32188/components/qc/ANY/any/tpc-full-qcmn\?process\=true\&list_of_detectors\=tpc,its\&run_type\=PHYSICS` \ No newline at end of file +* With `curl`: `curl http://127.0.0.1:32188/components/qc/ANY/any/tpc-full-qcmn\?process\=true\&list_of_detectors\=tpc,its\&run_type\=PHYSICS` diff --git a/coconut/README.md b/coconut/README.md index f20c2bfa6..c6cb97a68 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -1,4 +1,4 @@ -# `coconut` - the O² control and configuration utility +# The O² control and configuration utility overview The O² **co**ntrol and **con**figuration **ut**ility is a command line program for interacting with the AliECS core. diff --git a/core/integration/README.md b/core/integration/README.md new file mode 100644 index 000000000..3095650cd --- /dev/null +++ b/core/integration/README.md @@ -0,0 +1,158 @@ +# Integration plugins + +The integration plugins allow AliECS to communicate with other ALICE services. +A plugin can register a set of callback which can be invoked upon defined environment events (state transitions). + +## Plugin system overview + +All plugins should implement the [`Plugin`](/core/integration/plugin.go) interface. +See the existing plugins for examples. + +In order to have the plugin loaded by the AliECS, one has to: +- add `RegisterPlugin` to the `init()` function in [AliECS core main source](https://github.com/AliceO2Group/Control/blob/master/cmd/o2-aliecs-core/main.go) +- add plugin name in the `integrationPlugins` list and set the endpoint in the AliECS configuration file (typically at `/o2/components/aliecs/ANY/any/settings` in the configuration store) + +# Integrated service operations + +In this chapter we list and describe the integrated service plugins. + +## Bookkeeping + +The legacy Bookkeeping plugin sends updates to Bookkeeping about the state of data taking runs. +As of May 2025, Bookkeeping has transitioned into consuming input from the Kafka event service and the only call in use is "FillInfo", which allows ECS to retrieve LHC fill information. + +## CCDB + +CCDB plugin calls PDP-provided executable which creates a General Run Parameters (GRP) object at each run start and stop. + +## DCS + +DCS plugin communicates with the ALICE Detector Control System (DCS). + +### DCS operations + +The DCS integration plugin exposes to the workflow template (WFT) context the +following operations. Their associated transitions in this table refer +to the [readout-dataflow](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) workflow template. + +| **DCS operation** | **WFT call** | **Call timing** | **Critical** | **Contingent on detector state** | +|-----------------------|---------------------|---------------------------|--------------|----------------------------------| +| Prepare For Run (PFR) | `dcs.PrepareForRun` | during `CONFIGURE` | `false` | yes | +| Start Of Run (SOR) | `dcs.StartOfRun` | early in `START_ACTIVITY` | `true` | yes | +| End Of Run (EOR) | `dcs.EndOfRun` | late in `STOP_ACTIVITY` | `true` | no | + +The DCS integration plugin subscribes to the [DCS service](https://github.com/AliceO2Group/Control/blob/master/core/integration/dcs/protos/dcs.proto) and continually +receives information on operation-state compatibility for all +detectors. +When a given environment reaches a DCS call, the relevant DCS operation +will be called only if the DCS service reports that all detectors in that +environment are compatible with this operation, except EOR, which is +always called. + +### DCS PrepareForRun behaviour + +Unlike SOR and EOR, which are mandatory if `dcs_enabled` is set to `true`, +an impossibility to run PFR or a PFR failure will not prevent the +environment from transitioning forward. + +#### DCS PFR incompatibility + +When `dcs.PrepareForRun` is called, if at least one detector is in a +state that is incompatible with PFR as reported by the DCS service, +a grace period of 10 seconds is given for the detector(s) to become +compatible with PFR, with 1Hz polling frequency. As soon as all +detectors become compatible with PFR, the PFR operation is requested +to the DCS service. + +If the grace period ends and at least one detector +included in the environment is still incompatible with PFR, the PFR +operation will be performed for the PFR-compatible detectors. + +Despite some detectors not having performed PFR, the environment +can still transition forward towards the `RUNNING` state, and any DCS +activities that would have taken place in PFR will instead happen +during SOR. Only at that point, if at least one detector is not +compatible with SOR (or if it is but SOR fails), will the environment +declare a failure. + +#### DCS PFR failure + +When `dcs.PrepareForRun` is called, if all detectors are compatible +with PFR as reported by the DCS service (or become compatible during +the grace period), the PFR operation is immediately requested to the +DCS service. + +`dcs.PrepareForRun` call fails if no detectors are PFR-compatible +or PFR fails for all those which were PFR-compatible, +but since it is non-critical the environment may still reach the +`CONFIGURED` state and transition forward towards `RUNNING`. + +As in the case of an impossibility to run PFR, any DCS activities that +would have taken place in PFR will instead be done during SOR. + +### DCS StartOfRun behaviour + +The SOR operation is mandatory if `dcs_enabled` is set to `true` +(AliECS GUI "DCS" switched on). + +#### DCS SOR incompatibility + +When `dcs.StartOfRun` is called, if at least one detector is in a +state that is incompatible with SOR as reported by the DCS service, +or if after a grace period of 10 seconds at least one detector is +still incompatible with SOR, the SOR operation **will not run for any +detector**. + +The environment will then declare a **failure**, the +`START_ACTIVITY` transition will be blocked and the environment +will move to `ERROR`. + +#### DCS SOR failure + +When `dcs.StartOfRun` is called, if all detectors are compatible +with SOR as reported by the DCS service (or become compatible during +the grace period), the SOR operation is immediately requested to the +DCS service. + +If this operation fails for one or more detectors, the +`dcs.StartOfRun` call as a whole is considered to have failed. + +The environment will then declare a **failure**, the +`START_ACTIVITY` transition will be blocked and the environment +will move to `ERROR` + +### DCS EndOfRun behaviour + +The EOR operation is mandatory if `dcs_enabled` is set to `true` +(AliECS GUI "DCS" switched on). However, unlike with PFR and SOR, there +is **no check for compatibility** with the EOR operation. The EOR +request will always be sent to the DCS service during `STOP_ACTIVITY`. + +#### DCS EOR failure + +If this operation fails for one or more detectors, the +`dcs.EndOfRun` call as a whole is considered to have failed. + +The environment will then declare a **failure**, the +`STOP_ACTIVITY` transition will be blocked and the environment +will move to `ERROR`. + +## DD Scheduler + +DD scheduler plugin informs the Data Distribution software about the pool of FLPs taking part in data taking. + +## Kafka (legacy) + +See [Legacy events: Kafka plugin](/docs/kafka.md#legacy-events-kafka-plugin) + +## ODC + +ODC plugin communicates with the [Online Device Control (ODC)](https://github.com/FairRootGroup/ODC) instance of the ALICE experiment, which controls the event processing farm used in data taking and offline processing. + +## Test plugin + +Test plugin serves as an example of a plugin and is used for testing the plugin system. + +## Trigger + +Trigger plugin communicates with the ALICE trigger system. diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index 17698b13c..df3069b90 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -30,11 +30,16 @@ option go_package = "github.com/AliceO2Group/Control/core/protos;pb"; import public "protos/events.proto"; +// The Control service is the main interface to AliECS service Control { rpc GetFrameworkInfo (GetFrameworkInfoRequest) returns (GetFrameworkInfoReply) {} rpc GetEnvironments (GetEnvironmentsRequest) returns (GetEnvironmentsReply) {} + // Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. rpc NewAutoEnvironment (NewAutoEnvironmentRequest) returns (NewAutoEnvironmentReply) {} + // Creates a new environment. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. rpc NewEnvironment (NewEnvironmentRequest) returns (NewEnvironmentReply) {} rpc GetEnvironment (GetEnvironmentRequest) returns (GetEnvironmentReply) {} rpc ControlEnvironment (ControlEnvironmentRequest) returns (ControlEnvironmentReply) {} @@ -42,6 +47,9 @@ service Control { rpc GetActiveDetectors (Empty) returns (GetActiveDetectorsReply) {} rpc GetAvailableDetectors (Empty) returns (GetAvailableDetectorsReply) {} + // Creates a new environment. + // It returns once an environment ID is created and continues the creation asynchronously to the call. + // The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. rpc NewEnvironmentAsync (NewEnvironmentRequest) returns (NewEnvironmentReply) {} // rpc SetEnvironmentProperties (SetEnvironmentPropertiesRequest) returns (SetEnvironmentPropertiesReply) {} diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md new file mode 100644 index 000000000..0bd697dcb --- /dev/null +++ b/docs/CONTRIBUTING.md @@ -0,0 +1,49 @@ +# Contributing + +Thank you for your interest in contributing to the project. +This document provides guidelines and information to help you contribute effectively. + +If you are not in contact with the project maintainers, please reach out to them before proposing any changes. +We use JIRA for issue tracking and project management. +This software component is part of the O²/FLP project in the ALICE experiment. + +## Getting started + +Getting acquainted with the introduction chapters is absolutely essential, glossing over the whole documentation is highly advised. + +A development environment setup will be necessary for compiling binaries and running unit tests, see [Building](/docs/building.md) for details. + +## Testing + +Run unit tests in the Control project with `make test`. +To obtain test coverage reports, run `make coverage`. + +Typically, you will also want to prepare a test setup in form of an [FLP suite deployment](https://alice-flp.docs.cern.ch/system-configuration/utils/o2-flp-setup/) on a virtual machine. +Since AliECS interacts with many other project components, the last testing step might involve replacing the modified binary on the test VM and trying out the new functionality or the fix. + +The binaries are installed at `/opt/o2/bin`. + +`o2-aliecs-core` and `o2-apricot` are ran as systemd services, so you will need to restart them after replacing the binary. + +`o2-aliecs-executor` is started by `mesos-slave` if it is not running already at environment creation. +To make sure that the replaced binary is used, kill the running process (`pkill -f o2-aliecs-executor`). + +## Pull requests guidelines + +- Make sure your work has a corresponding JIRA ticket and it is assigned to yourself. +Trivial PRs are acceptable without a ticket. + +- Work on your changes in your fork on a dedicated branch with a descriptive name. + +- Make focused, logically atomic commits with clear messages and descriptions explaining the design choices. +Multiple commits per pull request are allowed. +However, please make sure that the project can be built and the tests pass at any commit. + +- Commit message or description should include the JIRA ticket number + +- Add tests for your changes whenever possible. +Gomega/Ginkgo tests are preferred, but other style of tests are also welcome. + +- Add documentation for new features. + +- Your contribution will be reviewed by the project maintainers once the PR is marked as ready for review. \ No newline at end of file diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index f14d9981d..7004c9050 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -1473,20 +1473,20 @@ Not implemented yet ### Control - +The Control service is the main interface to AliECS | Method Name | Request Type | Response Type | Description | | ----------- | ------------ | ------------- | ------------| | GetFrameworkInfo | [GetFrameworkInfoRequest](#o2control-GetFrameworkInfoRequest) | [GetFrameworkInfoReply](#o2control-GetFrameworkInfoReply) | | | GetEnvironments | [GetEnvironmentsRequest](#o2control-GetEnvironmentsRequest) | [GetEnvironmentsReply](#o2control-GetEnvironmentsReply) | | -| NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control-NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control-NewAutoEnvironmentReply) | | -| NewEnvironment | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | | +| NewAutoEnvironment | [NewAutoEnvironmentRequest](#o2control-NewAutoEnvironmentRequest) | [NewAutoEnvironmentReply](#o2control-NewAutoEnvironmentReply) | Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. | +| NewEnvironment | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | Creates a new environment. It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. | | GetEnvironment | [GetEnvironmentRequest](#o2control-GetEnvironmentRequest) | [GetEnvironmentReply](#o2control-GetEnvironmentReply) | | | ControlEnvironment | [ControlEnvironmentRequest](#o2control-ControlEnvironmentRequest) | [ControlEnvironmentReply](#o2control-ControlEnvironmentReply) | | | DestroyEnvironment | [DestroyEnvironmentRequest](#o2control-DestroyEnvironmentRequest) | [DestroyEnvironmentReply](#o2control-DestroyEnvironmentReply) | | | GetActiveDetectors | [Empty](#o2control-Empty) | [GetActiveDetectorsReply](#o2control-GetActiveDetectorsReply) | | | GetAvailableDetectors | [Empty](#o2control-Empty) | [GetAvailableDetectorsReply](#o2control-GetAvailableDetectorsReply) | | -| NewEnvironmentAsync | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | | +| NewEnvironmentAsync | [NewEnvironmentRequest](#o2control-NewEnvironmentRequest) | [NewEnvironmentReply](#o2control-NewEnvironmentReply) | Creates a new environment. It returns once an environment ID is created and continues the creation asynchronously to the call. The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. | | GetTasks | [GetTasksRequest](#o2control-GetTasksRequest) | [GetTasksReply](#o2control-GetTasksReply) | | | GetTask | [GetTaskRequest](#o2control-GetTaskRequest) | [GetTaskReply](#o2control-GetTaskReply) | | | CleanupTasks | [CleanupTasksRequest](#o2control-CleanupTasksRequest) | [CleanupTasksReply](#o2control-CleanupTasksReply) | | diff --git a/docs/building.md b/docs/building.md index ffd5fbe1b..624898807 100644 --- a/docs/building.md +++ b/docs/building.md @@ -1,6 +1,6 @@ # Building AliECS -> **WARNING**: The building instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the [O²/FLP Suite instructions](../../installation/) instead. +> **WARNING**: The building instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the [O²/FLP Suite instructions](https://alice-flp.docs.cern.ch/Operations/Experts/system-configuration/utils/o2-flp-setup/) instead. ## Overview @@ -84,6 +84,6 @@ You should find several executables including `o2control-core`, `o2control-execu For subsequent builds (after the first one), plain `make` (instead of `make all`) is sufficient. See the [Makefile reference](makefile_reference.md) for more information. -If you wish to also build the process control library and/or plugin, see [the OCC readme](./occ/README.md). +If you wish to also build the process control library and/or plugin, see [the OCC readme](/occ/README.md). This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. diff --git a/docs/faq.md b/docs/faq.md deleted file mode 100644 index d39935874..000000000 --- a/docs/faq.md +++ /dev/null @@ -1,2 +0,0 @@ -# Frequently Asked Questions - diff --git a/docs/handbook/AliECS-environment.png b/docs/handbook/AliECS-environment.png new file mode 100644 index 0000000000000000000000000000000000000000..e944448062ae981851c520fabca5197205be99bd GIT binary patch literal 85353 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%0Dm&yhVGEjbvtm zcRNG4_n@>LqWUg_EnLQ5 zGw6E5_wNC{3Ur~*AppPt-Fx27Y_tf##tjTeFW>I1TD*3B;7gpmFz%^yKKNVcH&>%U z0NL+Pk4#P~`{ntA;wnIwf+KV(ya%B6rf<4hU7LZLsB7qp)6t4K1iDrN49k4T1gDdab9&PB#Bc2NsId*+5RwnHcj9DD<$g z{R~6O%Pr29C(|ygoAJ8xD+|kGgteh=NkkU5s2JHI)fQcBqxKX8gdi3Ou*>R>2>3iU zp>1+;6No@y9C`DKtuW#9SmvbmTL{wQAuIaQ{4|lcP42KCSNf-7zQQsvWMua(coP{E z)_`IxFU_s|jBozQnai_v`w{4KVjql%o=bsp%j3tjxQ)Hb=HUCnuYI;_<0D2#mst;Y zuH)L3x*#>-eolYyvaCV&EsHWS^t%{oe+q-yUZ=}x$2{;Tl%>Kg+$tfCQef(%UYE4~ ztD}sMS_cCGyNH%W&UHSSxW&cE)|~Kqpn(i4$;p0leu)#4sQvw-e1mB9AqNZ$tFonN z_)jKEBA{5d7|*Y-k1CLO&OSPLdgBYq7E;&7fHrO24uZm-E$DnK=nOfIb$jq9kI|bb zmTKl9=oATcH7*Gz$2JdXUk@og{xyG3Oc1W^Woil(s}JvY3k2^R+n%{iXsf*yBL3T+ zt0aT|`t=t1XO3PYJMD(Y9|*BgbKQpzTaXT@+O%CVx1>!-4y^^21fAbS1oVoy%I%Qm z9N(Zo!ni{yYCHL}`0O*~)Fx+PYi-Y5{50+)CYrj#;~$oRo0Qws6%2 zOB(m{AsIZT<^Qx{S^uG(Y^d)D5@uK36wR4=*@gaf6GWV`JaFm@jDismfJ^%OL8T*lc)a#x`-bv7CbN^ zJp4i+Hcxm{6)7jLEhGBk@qacn3E<^dTF+o1ec0FiX^Z)H9QmKL$S3y&LHN{E2H0R( z}>&4h~Savfk#w{Vz@}%kQy4kUplM z;JzE$U1fLaxesJ?iPdZY~UA~;#`BbZ?`RH zKB`PK-NP6CXBL+L^qiN~I6z%a3aZ?N;{VTZfZebxJ@N)<(eoYGDNNq{Gr7zB=+>Dl zqpc8EIMbKETByM#%wF+>@qb1@^4Ciz=0GT9fN46AE%^MYN#K3dF4fKDOgwpSksSX2 zNiEc!QUmoj^Upe%=_E(otaytEDN7%vHlmmp{E$)qPfo#yrr(G?g zy`4-qQ6celo+&RVz)d%!2gdni8{jV^QjO!`Z)RhR0W{Ldpf0a$psY&$kV{LeRxlaw zKUO01N3QKw>;Wi=LnD(-b+6Hm#-xoTYQT0lhn^aN&A}v zZ!^H<$$<#8T$DFs4Kw0P0TZYcl9(bGH5uQD^3U&m{y$a~9SGl$mG@a0tg-~kL^$94 z|Iow0WQPFwW{iJJ4rOmXheHccNJIbcRi}F*!lO=bc>DAJt1H6wcKzo=C5OI&jZ*eS zV=9Nko|bGq;(rxWqb`?>j9;e$hqM)_acOWn%A*J>O)baA2mjCO=5jglJl^gQNUJko z6a8O}72@>mA6ZI9Hl}zMk4(SX4>1D81({7LVVL*-yCe%hMnSy?B7Epn_&1u_1hA-~ z|Gj2x#=voLZBeP{x5J~{|JDgAKzZ#PC@HB7mCFA4s{E4^f<-tNHBzZB@I&FPlsQ2<42`1vkCklv9m`s5b6X>S_)6IjdhLx0pv-nps zBN0DBqsLgr?BPaN>Paj>Vvk+)2w_l-n}Uars2X{ssD^rq882ISup663p# z;Yq%31-5AN{|n3Iy2bg9A8r4ux8pCiTEJyY{~BlK&~C*@ zb?X_Vj8;iYd`9(xZ9a5=CQW)|>qYw%aSfrujV;d?DL4Z3Mvk8%wNbkdJ|Pd}HIK1v z>$x#^!)k=QMQmB2p5F*0njou&wFa4$sYZ1Hgk_uIwv_F;PyvhS?~0CP+Zt~unk8Wl znmxvu7}zv3H^oGB;CMyo zvM}DxclfGDgm@AuQ77c4llLl!1QRAAcjWKr^tf!IIC&n`e&81r3p#*)GJeP?{r;Zo z-kWEQoM&Y)F z%u2UnKKGB&$x1Zv-jgEs>UM%0p#sCQGrw`PiD-;V6&Qn&B;s{X8t!dZ8ekF_=U)VG zEx2}J!^!rvqbYZGg61vdNk_z?qNF$#GYy5lLF@hL^YSB)7?=0_iqvba=Lr;8Pe(j= zZV{j`9JSJt7R8}5H@^`98^y6VeAO3I#F?14M6y!nw^5^OaxBID-OEG@tXIs(jyNKg zAr8zR+C?h8R6qN?gH7zCr!*wbeyyl{BEzE}e)Rd!R0edCtaZ6&CjL*#`?nB;EK+$9 zbR`Bo;1|_!oj`)gul{Pmhx;He-|aYmY;iOJf2f0#ns7zM!Obq}yanfE@3gZ}FwUiW>{k4yWpIADK9M#eclG+yn@iwuTTD%F_!Vy`jQ?0d2!QbIg8=TnYE@P#d+=_g_C1a0^mJJQmT$_$3 z-45YpRJrGSsZM%~EmCAHa%JAl_VFi@Zy^F6=fiCzOEX{j1;-FX}J7UoS9C=9JDoc zr9E)s09%qPFGT)Q_E+z7Z%+cpYMk9u{lFC+!;rSWV@@BeqgSjKY#g)ri&4C`ofgnlW}w8NYqniVOFho*gg?_kIH+&kP97I(~o zQ2s{Gd(z+DLBT8p?I1)7rLsfs`ls?%NRBMLoT)o>{Iyz^I;*o~#ip_TkJrP+>U3OtbJsLPejjp)i7Bhl zUwzswVk*M^;xFI-lsnhlE2~AU&eNNqd$NXzCm^Bkzl>E zBFM)v-;op{!a!0i2r-T>-{2u+K~z{6Di@RY8Cv)eYLu`Lb(ABA-SQn-uG8GdW{viZ z3~)Xw*IYb>;nVcXE|!Gzu57)mx>-_Y{#I^eg8|7ZTMV~OWn;X6$40<~bZndGV}B(j zq()=S`sEc%my+>1`geR}M}%@ID-{f%FBudpkEiW74a8njH=xAOPzWMG3Y*Ua{4Sx?VN?f<*2%2j2yKSNhYN}F+O?eSKAa#Vs_^A>fsA#D-1lm zq$iFcZBN$+Iy|WQkcV1%a>|MqyZ(?RWNDwFro0mnaHcji1EHWM*O!P@nS5116Cai7 z)k7!VB42|f)2T7_USiyk#wU*-e5B7B!_3T86ZqESh6l_+5zMyF-&6;C)LFHp&epvA zB-Uy#Pp!d(0k=E!w=3aG}}dfhWLaC`b8voO=- zc0S9Jwy)%Dr!BF+(g2P`!D)!ck``GSzp`8F*cVrywMYx&WolfQkCCl zYEJEEw$0OJ47R627~%Bdr0+daOiW>|g6MULdQvRj(q#EPM>yfU+6vpoaLRxsZMSuq z?oE=H%AniRt*Sb*uL9e_tj+WP{$#KZ5Glp%pO#}nd~#Tz@tcU18LW};&4E9Ag3FJd3{}!!wUr8n-%MDh=l z0kTAtzqeokd5Qqh2lKS!=$LE7ArAk*)MF!`-jl4X@DCP$YgmAEh~Ka85fbD zp`j={u(rF6`^m{6N=3G?{_lKY?vGM&RtdS!Gk-^BhNlY|^h$qW_XnNMKCq%h_2?*l z{6a&1Syfp1CQ4h2Ury@5&44JpODZV*16?LluY}=-Npg~gWPj1F1+ZcAeBq(}<)`9g3tOjpk^F-il*H;^~+k84bmo$a1(cl2s1y3Cv$a%}9; z0v8QheD1Acs~~ZQfV z6_;k0%E{&`_AFQfzn=swnW3Q%)U@Q7fw7aIjZX4j|3fH|nBsNLej#%j-|r&x;hC&@ zU%d?Z(APNYFRtAg{n87Jr!(K*i<(FqJ}_?&?g}%tYl9xFE~m%R&>KeER?uG=@*XPD zVs>-izEe?(vFL&0tiSy9^)x?PyZs_K=kjQ}g_0gSuA7=N43BNXdgd9KVa&7k8rR46 zPNg$oN_K+mlhWwnMdhd^ZIqg_#D*iV2=C@p1q;EEjH#q5l(jahPc1gOyi6R^J4cne zBxszTsR}UAo$mURsC<)^MfyWRj5N}z`ETE(6%&IwC5fB+{?y4g?i!7-rE*lyKGu6h z3+T;6v#9CkmzVK920D6hE%ha;(>?BAw{}n9=Ef9Wk%i04Dyr4$ZvFbqlqKB?KGss> z?aIrVjHtfIiAQc%7d9feigb5_CxV%HQ*LheL5&w?A=7W-2JzS{-J-7dVyl9y3pL?E z3+qC)x=un!Tp~!B?$<5ZIk)30?6nEw<-sW4a!ftn_>y-QA=a zWaZvoRxD#@ovmgHG%HZywu(Ob%YyysKM*Cb?X9cPo9+oJ89|o72rsFU2q}R6aFYGui|yyO{mQ(GFYkj zT|f7vDKa$lGEO#+5iTH9v#zswC1$M87=23$A9&9{rM$|Z7&Q64=@q-FIH@-4I!(yA z-v$gD4D^ihjCJ6lg?X+rB*lD5oA>xH1MBMDaNi_!_l{t$rMI>T5c7H^F}X}98|w<` zg{p4O`b9kzCq0LhS@B&TC!P!ctc?CHL%0aG{O-x7v110WDGEWb;}`A4K`p&rPAnn{ zaNabb{(<;}XECaB#l>lUMdy|W_#F=U1uh#|9myQ^2?^>S3UW8L44ctBqf--E%tx0g zj`TVzKGKofc79sgHB0f&cGO;4VRrG`FRU#6$p)HhP<_a=nDeUR!4(fe-jXEf+_1g9 zMoVnA_t0;D2E|z&N|KY%Q&3Y-CrhT)I36KD28_b$Ii2i41VhKoGSc7LnJp+PMVpKy zGLyL6B}uN|7F6r{taH^PGhh6&eTC<|!9rEFwh1m^Z};8CmXQbQ6V};9ADBMAi$W1% z4x*&MeK5<8!q7N7K0%%ElS9$xyF33*BQOJz5qyWzj=-Z&Y6&X5gX-MtZ}RfY$tgPJ zauuft8qZNe0)_M>*SEmdr!w?Snf90Cy}<99yl?fa1ar;U5Ql@K!@=R-6~(L^Qg<{D zC;L>d*HbB0UKhnO{#)U&U{-?u0M&$_)|R*DomV>SZ4PuT%%q3OO zeA)|TACV}T&p~Vqf6DiUKP#xmsmeWWc0_^41B7`UK>evT_Ptn@>~p zX&Q8*GN4!QJSH^%blWrleB;@bV(1p;Q9~qSqLoG!Uhy_~L`1$}^O$eRd2h2iw^Fdh zk8B(&jM3iGJzg-xhZK_#k#PQD{bJ$WYm`u_Em~ETR1{p(&(!zXM2L)*gP0l$Q=)cM z<{&UmKQ%|?VaE00a@*X7)b?fW;_fY>^HFC0*goHobZj9X(b90rpMg=&+ z^8HEiLYQ|apTu%uj}Jdw!ee!{^?)5dv)h!ye~)n-5Sqf}aG5R=RFq-<^>LF4`o)pG z6!3?h1MG>eht-P7UO2@G&GwD!K|J>g-I*^JX^c7!%wg(Y#c^Q(_LZrb>8FJeNCI%;rQGE`c&@Jm$s0Ig&k8SC$_pW z_GD?0y)I~|YI>q`Lb(G`l997=7^3CQF*;3i%9~Th zg#Q$4+n)5V#0?P`8E5NCsQ7q$9bWT5Z$4S7#5mwAwBL$^{ zo%k9Je~fgcW1rpiB_vI_(CF4@mLFnqATeAKH?((b@A2YD-bnZc!`c|^X*W^N+k0`Du`x3i$tb|JJRa<6Kj)29kp%$NB0U!_#P|F;h2%aDw?ze` z{M|L0dWA~~80$ay@?81Err+J2uVzPUqqbdUz#>N@U?8C8axi%9ON68B=#=7tsX|Bl zq0Z%|Kg4A;pAQ7}YvWVUQ(@e&=VX^KLjtjC#*=z)%#e#<%KCP@d~|iNn7ewPeX&8WAkSQUMk}elRu}oWy~e~w zSB@VHRQ#{ckCs?5(Z=*&veMN`+>SaYJXdtzC#Z3B(ZlzSBrusMiHIoo-sgawjh$RP zNK-=*g1}MY@6O$Bq!2m!JMNh>iK*MS%}#r#HwynG5s$A_XbRQZ`6pVs6>Y1ei7?0| zAD-VOz0oG&t?>1k`3&}e7_Q0D*~6oF$$8Z~{ zm&y!m^$3CQAwIBeLqOrYP6;e!e@48@+_#A2LauY$?WQA+sJWUZqgKD$jC*{i26E^* z;cx!oZB|3PVd)T5cz{PrZEj*Vq}fp2G=KunA3Kno6cb@)q+9XSKJiTX*(b{*RALHI z1!XxnNLq* zo0OdAa?gLm4$?V@^&nV$P!}2Hz_7OXVI1tA4NeShWXsNGwgQc!;zXE8ulwIbB_``` zE!XVHwv;qR-#F!Zyr3!KgrK1Gde)Lv+x)j0X}XKNZ^tt4IoXOx zF%Z?SlFf8b?>G?=e4R>CJ zh*u^*Ol6551a1*g&nDZ)>$VnikQd&ez6I+rr^ztjx<_Yw`*YE&Km|4V^LsfRcS!>m z)fbMULwy6W`9KoicE>gZ!UPiqN_lDd9=A^J(J%vQI|mq+jrkJ~1Eh`P_;;b_Za4H} z`Mq!Xe?D-sCb3sP4_3+Uq1Fk)E~-MjION=RFixw!9-v~Q8#^!p=*y^>g`iDMs zeai?Ti3{WFsdr%fMt*4hp2pqx06#={cUYfcv8C*6Ou{>d6W&+lqYD2lb@I&3`ntRI ziajHLcCYvOlw4YB|4Y)yqil{QH{AZvQ5WP6sMhR)#cO8$&L}$v>-7lCZSrJ!V8-Y*{hbE7o=|g^jJg7D@<1ae1^<2E)V#3PVgyb^z-DlS;2N0Mb!T8J?RG zbu0p$$k@oAv5{ZzTdKhv`!}9rzs@$s+#n)8rXjBrLE6CS%h+#5nM%*?c8>=^oCVV( zaBQ>jDFHu5>x7YJ!|+Rxyr!E%@q*g|GMd*ZkK^O$#dHG4{@PrchXzlRn`-@O*f(RA zDu)@G%~sVlc-S5G^F((fmqv?41M;YqOO>NLdSbA27r*B;qe$e9^%hbtm6>+z_XwKpiB26h8Vzd0 zK*r%m9v2NS4qc@{E(D@z3LMmI_^uTbsVz!E+dqrT^_`}%Vd|q`ipP)U*LXZ0hw}KE zaPa(EJZ_(c$3BlThx3z0qNUW)mHhs~H>AnqC7wLnT&trTErYwj#?A6F5qni)`A;Dl zbuFHh=fGxTn$7vQoRYh9LV>JaaB6kCpOPdzQlHD*oX*;7=rD&_9-Sfi8-7$Zj{y-K zZ+0BKi#v0k=Wpvm2q5n;DAV?k_P~wRGcwhzFE8@Qp}x{;zKyK5SYWl##0GPB9wQvg z%c-^C6#)NfS^*2PL`7Vg$A?1Pm4A<}<~IbX0U9BV05w z9KEh_TZ7$v(2Eyp za5=eNjc*&Et|bL)v(Dx=Ur7e7$!_}%^ zOWnI2OzlmJw0~#T?x2>zzcy1VXQ9l>+wa~CB{UOnJB(M|Sx=0!$YCvjr7K4I;7G@w zaGy3d1!@az%SWeZlNU5#k(%m@?q3td0&Gyhgj)VRP=z4TOGT z5h@r@{s9?m_K+$P1Qu(v^X>B0_Xik@x!xxIE$vckwV7G{!Dp~AydU0IJ0e(WK4=EO z0n%DgXnLhl-BVkQ!L$cd|L0~}jHT%-gey%A&sOeHUb3@NH8>(*#y32zD;XM2oR&wD z*^y5^57=#K=r`Ip_b9B&*|0UL8_xEnClM-s; z#Q(sd2j5qJ@)J6fOY(`#IQR_IlDzTvAROqb~+6=hmy#AJM;%bHo+D2YoBdCPZ zX}U?rS3yv(crfx#Z58#GnOSmJbW`5);;_7in8TIVaN)Il`Vre#htusJTifWGyDsFd$ zhw{2A%SZM46@=wwl$6SE?sqvlo_XKWWP078yx}!OgOa!^*V^V@OJTo5*4R{366YS# zr%3AC5PJ-L3Gec79}zuG86=L76R-&J>d zv)VWyeuACWqEo559=rC zqxPDZn}vas1l6-YuCI`?#IkJV>!&3VxvQ#QTy5xX{?p}-atBg(+5pvwKOVn*7<&>@ z6H?VjfBY+R7=wlVHJ>V#t6@M-nX({Pm$k4(Jr2ypvVynvjrtmBWP4DKI%l&q0OM{;{>I$zhH#f82fDt5z^W&9$)lOHxYXI|8yY~E#K1HmYR-OG}=5Z+ow0u?&)m(J$WT7^a6R?m+Qh#d82m|r|tl9nn z&`}r=t1nIuRb+;St(Skut>wV9jCeez9ciZ(~gnVI3Dt=*4FDA$ml~z`_ zNfN3IrBZ&NYtKYNYG^V#k=)1l!$H3o za->a8k?z7Y(`9p;pHRXyVd43$w2?88;CJ!@zbx}OzL3S@uA3sP=VYYrRiR7r*CfIc z?m&L>n47#fG_pG#Mx$YVCOmRIUDCHH^$a48*xpgFrYR0^dU~O-1=|81O6xiAZIRqB zbr`K5`5BO};`~>>XYk9q}ewexw zgu5MWW+CUG!Sabx#NFySBEq*`elxx}4+ZcGvQcPJqna5N9vwPFiDm2N`TCfCn7H>X z@*64X9|to%!y_7oEB$4nSJnvLEQyzq-RqI*zD-v6x0n0Nns$nwn_T7N%826yycvK))&OPS=zg|+q1*d{a#0(LA4q(d-+iF zXFYUW79a7L72ACOYx^A?vBXdP<_qOBltF{4m1+P!;s3d__RP8N%lV-d({Gio`ThPj zW2?vy(doYTUXKLNpbkHK5f@cgvsIAcYg$%u#($W5*Ym{WVgm9_DJ|WhkziCIeT6*6 z=Q5f(J=D=LIP^ev^jX=@$|~hcXBIYc_AGAijjO%JCvyuI)gJG^8Kqy_+uT^Mz7Ahq zY;PZ$++RORJ#kZ%qR!a}a@A-64dB3_SdmWj!HM?ThMB1~skJo?Z-e#JbnaJJpHjUC zw7hk6`NFd$Yb(=WqHb`G{a7@s*eRKW27zhEu5SKG-JB-%=_=-|s|TxhH?;l*yZ~S* zaw=*|M7s#kZUN2$e5%h{vERWg1DI`E!OqnzU5wKG^!W07S_(djY1k%JarLa|)eW4t zM-Clw?9&|I)MauVjYjQDh=3P#$?Bca#vo{`El7;_Lxl>pdAbH=i<|4)eBL=bP-=ek|&HS54U3`hy(ps@R|c5H2C-APXyVn&UVsR=yND#SbxQ zbFCK={{9m2dzSehR=neKvo$&p-6?~LwV2_Mi*Hy&LQ_G{Nu=%CMa?3-5NsnUyaw|# zD(Fj{Q6ipHN?+dF#i=SMr+2{YL=MjNhfwQ+C>_v_fHiv2w*~QONdr$aPAX!H$8$Mp zoP6+v_)=IZG{1T`Y?-U-M@`Fax7wQhc+5ukm|( z6N|~VfdcOobqz6kYFcGwxpyqOvneF6>uN5eBVq=`q*A!rhPvDPr^nsT+jqo!sV2DS z5(o104ZvwxeU4o+g~4lYQ6bVz>ZTU7&YEiNtqwo>Xp@#zg`YYU7ZCv{1x_bB(4_*# z`+EqnqmsjO!SXVrfq`n@Z~o-SKj3`}8eb}>XBW?86{t%qb0l_nqqn-L!?2l!iNb5qMI~)VDcu?pO$J$oL2eDA3OygQF%m70U()pGCVd&@j1EVP*&*b?z|6Y0v9Q$A4NsjZn>(nvP+l=Q&Qj%! zCv6-@0LlK{%r=PYmVcpzHkvZ~`6j(zFTy|Hx0XM2PTP1Yg|WO`7y&f6&MQuv=&Lva z*atXRSa8^vAC3E^q$()#ff~q((UCj1?4?-lF3q~D)sq_b_#Mx_$%1^-FLN9rZ|?qt z6yk*|D5>^r+U8fj0w++qkq4hmNj6+kX&C2 z2NgudMXO4Zy>jQ6JfP8T;Y(-qD`$+BR(Aaom{yh-6Y2q|zQm5qo<2^;9S(3uCS-Fk zBT5$GB!ZBFkan^<{A`(T{*rVa@!E6%YA&qUQ%!tzSnd^o?yKz2J0%m+@`~C@Hp^xT z#aR`El@?liWk+e^|F0In@w^?k9_{(|J5TgAnh#V4AA3Wj`U66ei0H=In6pRLUt;N2 z#7}}g<5l($5$&JKq#lN;_o{m=x&is~xnCbW&x@w8SMv|;OvB0qhYRbWh01G}!6vQ@=8EVuT8=D6g@u?Si+6aK5udCr zhN@$VV0hdIg2ehASaa?VZn%#&(!Iqa5b?*R;fW* zX&$*-OdTO3L|Cm8#b}eL=Z>a^GjE5Y&_CzRka^(ceM?Hjh;l!^t`erca;zOn=&JSX0P6@cgunPP3?b}#LbTlKxr+M&1>x{25`RUWACzVXYbr|owGA%%3_b>Op zeg1swDJXi}0xD%@Gc)H;z|~M)TVB3@@=iBV6QKiji2wb}^PI-Wl=!aVb;vt3=CgX= z|NE-}Y)2$e%ltT>N{-x(!6Q)uziQME2ojSpqQCRNc!>m&t~$LpZ+})Pd{+EGju_O! zCfD&35rPm$!#YGtD>S=gge0BiG8X%Xm4B3uN#|c>!Lvl=aBIV2A$UKN{~q}R{+gjn zkaK-b$gFkl{YS%tnZ4H;BC|{bzYDPqUqCIz(Sv~_o_sK0lqR6xq*opd;^puV-^ZJd#y`@DOWGU2enaR@IzuD<)1r z7X@aE(B7SM%tqjD5IiK-7a{$7OnMplyNj?S^l{?xeTPpx&P!<2b}nxk`kA7F1R1G0 z7#MvVBZuMB#jP)I+}-QHx5eT&`~a^x;p*@`o)s4woqHhrI8l6sZuMIvJrYsiWu%mG zWx9rxw`vb9Eht-MO76_hGyjts6T_qwjU909TA68LDab@=j_s13MSu(O2pLrh>LdF8 zelHgf>14>r-`k|En0-d@{_&j)tt5U)WtirB$EM<$Uy!ZPyKjV*DZyme5aX%%nM4Au zwi{DqthzY8(Mu?acDLKbsPOZ+Jb60e+f$Z`3&Xn)us+)gl4y`UD+!ydi$%~ZK|^^{G@mjcjnl~W zi5a*p(sV!Db?B#q_4(MY^bC?OmjIvU_d(Bo-x@MOQ*eonjREEGP+r=#ksW?y<4arw zXS~R0mH8&Ccyrka^z#L1%>*!hoM<=;q2$jzh^A>Oib(UO#e zKp)$y4(G|MRGSWU1myj>q^wrvZD^^q)JITi`9Cgpo>>Pd!+8@+RcBO%h52J(anVmavO&uW{6S{x@!S*@Oqm{V;+@<4`${_1VEnv>Io^T^9^GYnFG{YmC5;ZS{+VM0)x8 zBaK(=WHjITAY>9LAa>fQZi1&_Wn=ln%$;FR&)@o)~Wc+!L|=(iAwk6NxBTFTZf$`9;Sg zRQhnAC#^{k(ixdQxpTU=@}IaA38plMa@W(2FyUXY`wEcDFA$gDn$a*~4a>csc^Ba} zBj?FsE=}W)Y z5Iou2zZ!}23kenz+ZM4Q;^&&MybLmmtwPu7)m#V6xW2_yWf=@J1F-@{Pd>k;F;9h3 z6>fI?h;d$93U(n8zl>f-+?>s{n#4-%T(D?YL?$AQAdI4=(IL|CRM$eJivOJ_S;<6n zQJ#_8Eiv?T8(qaERh(GRw(0_mmt4YBz!+{Y6~6etuRKCu z4MRaFIeYF+Z4OMGl6ay2BE<4N%>N?87CQ7_WclO;{ZG+#1J@G6^6wIa(ElGVk#JdD zEh4Xa3^VL_MXZwaWQ<6Pu#n>LDBmMk5p**1V=SL?4AKAXz6`wQ~s|B|hdANs1Qc#}1k!3DA4``6fDsKP?SkfY*p|w2y z?XAlUi2xF(l8n5pw9CHGV+3E|2R?d=^jfsuDEiew>_|8|dxNE$X;= z0?gd#YAdX3N>)`eo>Ws&$6wQ&`x)xJ)>TH@fW_oHNoPWw3(kZ4`nyckKYvM#i%sbM zKBfXb^+#76`amK_T@k`f^M>7aeM&Nl=;cvLT;jrH`EsT9qs9Lw7hzgsBEJyvcP+(M zJrz^)eAC>#do>auamw1j77sf0cb#n}k(B%F;({>7r=l+Bb7@WspogS;0bJbtrZ93J zK8(1EX{8&#j@g7=Gb(XZJS{aXIYs$mB6{Q894XSrbrJQydato!@+m*;nwc|eR5bW1 zebLA-0{)lz^Vel!KFN3_9{4V5f^yZwFC&vxAPC$NOMFg-H;wOSY8)zb`>fLdDa+6G zCE~T;IhT)jNnTb#?s+f;px&sc`c>qVRHlZ_Bp(2j00bt*P4E2#EDc^~kqO7pWEcAY z*;k<=dquj2=oFt8f0<7k$cm|`-iV9$&eq+cDhkR~X6AYi7@6&DQ&X}suXv&Qc&Eli z<^9er%*!HCrNcx*-mVq!`F#m>9N$cUBVxHNvnBq+vqwFEh50t%LBo?1)+~KWcbckk z48MX|_a_dg=elR67VRpt8^c5IejEhA0q=Hb+Vd0Nz+_+c6k_4&67rK$#f5yu#cb&v zymG5fc{Ksol=-w|z71Qlw8uWT=sWhiUG|GPw^c@8qE)SsB##M;Mzo|RB*+D!;|qyd zwU%Fp;VOqfn#oaMUtO4o1II<#*_$l0JC!Ayvy4~rZ<&Ig4=v@*xL&+F3P|5htC&Kq zLn+;67%%OE+=du_F=>3p)gLd6$*)dvB*>`5bMG9|3`UhjiBoCZy3ShE-yH3CHJiPg zb_-**!Ot{3s?fc9!LKP-L>ZJ)>pC=RS(6`{liWqgo#Tna?SIJSnwFp~S{-}6j&d|& z$IRjEbZrivUFPWpGE$Iu*6w|UZDK-^N^02|DY77m-nd0$-FY%16t3<0b(foflN~(H z+0CqlhNj~}kjOThoZsD`qK((;STH!OvWpphdr*3SVDX{TZbJ0`S`7L1?n@a%%C#92w950aOO_6&XHH zbsc^Pqny*i2sc1y$F7=N$Np9qHSFE$3DA|!`iA1KALTv@4rTVzV^Rkjyk7 z$?JJx_ed}~B2;EQghr4owSXTQc6jz0G1J&qTyK6pkEHHP{?(4@R8EejG4%xi%>clf zK{?yvVuds7X{tc6fnAvLEr%?}7|uJ?FVH_hTwFxj*7Y*sK$O=#5UtMncN3gc=y@r+ zA`-&beh?C~gaQdH%xDGR?8M_Nc|bRUdzC@U-%bfhh1Es_j#;vlZ+Wc`iUR1NmUh`8 zF>MO+_ZK&FGK5V+y!DQmITAVk&s(>U-$*LUt4;1&iaHViR77`GNB`slBkOyzj3wvh z;osi;QLl}+u+Mil+YOXFLnWFVk8lHp>g=5>Y7lU#Hd=Pf!6wDbuBtAfz!)DLkqrF) zXUm@?J^4>&Jl>Jk3(DDF23h8mz{7f%NBYJ`cp9N`b5mPSOtxV$y7cV7h>Ri8kBYSh z!tfOCWYzurVvC-BNt12YDX;m^kO9N?FnKUJ zDtoX{U@q;c3r1+fI}vm!SubXZyZ|n&+@kkU3GssDQ5-X>J>9ZRon)ys&RYvW7;uzq zdhL=*Ks5uDD5JAsU27W~2G0<*WPXIYp0g$h<+EwO4N8|JhlAjG7k{>I zxO-OBd}QKw*(X95arqD-R#|l?3nVOiKkOZp3r|(fYjrujoU9iacT*XIQXVw7d_$4j*n?Br@Pe-8+BW~@C z>f_#P%X)R5SERMu}MmYpt`)mJGoh_H4m@1KlngUvvfWJm;xB@ zuwtL42%GoZ%|yIgfV-3VcGz&6B%U>yY4G`TNFu8h(7z;$kK$2+TGc0R<&ngl zFdiGs&?g^=#wv^)&|}2q8bq%^gYv0nB+0+^J)|XR59l-Eo;U2zO~F=MYiKbc-6i;R zbqGlla(c^Y0XN@%8Vd}e=%^Ti`)e)0uJx5-sj9L=Kf><0EG@iPgFjGH8(VI*Y}m?2 zt)d^!z5(jMvNNZSv-ecQ`$rLtwHj#g0%b?z2oU3#0{A?D)TjJF_3L&B{m)OMoMfs! zLE{pN9OI~-%z)RIS7-Y^*dpzuRx@5kRZEJ{mjgD3s--*)N;4B5AwF z*6HvUEzB~PdIm9>K1Ii>grqd?UIZL-chS?wbH7x;U|$J`bS|n%IKz_Ih9`O-F-ggK zdL*2zxZU4V3wnIj<=u?wUpdXDpK*V9JbQ6AN!C zP(H0R7Hd&=wyo3>8c=Ybt<$BaQTOm>Y#iA*WUh8l#$O!4`}Gm;Qq7b5-}5qg`Q#?d z?X^SKja=SMF}vmSiH@hk;2;^7+uMwiaCLpUS0xF}Iu9v+Or4h6Oxnu+LFwC-WQjvd z&d!&!jYS2U;t55Yh4T>!@%ollc#g=`x)rn}MJNdjsVmsjqG z?MtD&hlS8l^R&ulb!+q8s=sp^ht^ylo zsa5gyXtD}8!+^%apB?I)=F~(~cSft!7an&NlzNnv?gC$;K+<^gDN*sP#v=)faQ=EZ z2#}Qq&ly+;KpFMw_0h%oF$_c(S7EiY59ENf$(%bo0nU;Gjb0CUW8)H2*TC%omI)tg z*iHt2*3i(LesUb}jXg;(02LyrUooaaptF^vpj2yg(%*${WvN!tvN%$E`6WRJhTHln z3^jJrQDV|!VvH>^0@&5_G`sfjzIwBfRp;v8MK|A3m#Y(<%u}9YKGaKYx8!1XvXdrnwokJvwr!)v{QeeDH3jyYw+748O2FTNjlj=Ad8; zj*lhv>Bd|`UkxMhC++h=sO9`bu;YY;nSDl|Q~3kcaQPV$$Qx#UIby)8UJkXpD2VE} zesU_`GckVwxi=kawP=-9CvzBKD6=!LD4ZU9rf}CeR=+NBjKSKtvebZuD1-dn9}k~> zOW(fL?1E{@aNBxFjMYha3%Sp0${eYRl1uFU4y%qurzgOu=Ne3AMA{>!YLdet2svrH zJy@y~QuarJ;9+$q+jSu#%=cx1rmGw)BQMauEy1)Lq9S+9JtOybbz`N0^)B#{F`v^? zi@9<;Y{Pf&8w`+c6eI-ck}f5r zyIVrKyIYW!F6r*>4yC(Gy1Tpg_59y?XZDA^zieiGW3iaI*A-{{j`KLa>Ht^h#Y1u) z>amVrUl8MLz^TGkU}!V==AVx^J|7*=tmzA%NasnMg2A{XX zHMhP|?wgwjK$f^&6X=^QzuDhBx012Tz>Zwpb84*k9c;jTOXU5?60CP&enADi$!_RC*vE{f}zqUUlEvgfD-TRO*(@@ zxYV8~NQAnZiD;?EBGV*-5n*&rdWp75qAC$`n|ND`cGXqNwsjnj zu&W~?{HJfQd54Pk2C~xnymjiyet0uEhp43J1rO8`wx|%ep}sXX%-EqdyI-L}$(nA# zN}q(E|B%7}NH8TO@44dfteStsrVGx=m$VE zfiH&}7YE&G-OD1BXgd5sIMZ~55UXc@as>MyvMxUmX~Uu5&(AnHqdJv!-zV#5lU1pK zdTd=~?48(1J3J%~GO#(?0@f6#Wqzreje57ME+kmpOj0xD4_k3;U-z&dse{s9t z+r=L{x0|L<@c=5RA06FSgrBNw+r-`NKSI9~HKvai|HIXP!t&dGHP0Jvi|wwx_Rf$e zV~o^>+W)HGy%fhFxP1o=mSk`HmU<46S_!Ko7y?T`hv8f$Pe7*gXqE*0N}P3Tmjx;V z-pc_~`hNwLwRMbM)}G77n;LezLhM8@m)+55Wuo!NXY?k{=5WaUL(M;~bo;W-hl}4i zu*9y7+y1BbAusjK_WT={M(b!MsI%;LXV};6k-&N3UxXbyy>NJ0&8nf5Pwt)4ee(My zs|G_snrdt;)UK~ooA}8fr)$;#ZQ^G_4pZ1hHqG?tp2Zu|Xe*h&t|8F~+K zB`ONfx2)7Oblp6~S}b~x<6a-VFoI3r|Clw;jj627&zbWQKNRSfkSIr8Djna$)_AT| zqdh2U_F0?T4_Bs3CM3AM1^GWvGq9Ch?Qd;y8jayqpuZN9Gp9{dZ>({fxl>lvQXW_A zGeh2h^P@pKQ7cA(M#ra%j?p4z1L>lVzahfkjYW$fIS#z^wuv@6=ST)B2VkEaVuYgo z*-lkL#A>HE2=Mflvjr7u#(DjC(4EVbC}Iol1KUBj@AeOwB}HYM($_r5?q_#{OPA{b zm-oA?a3kL|s=qTp7mr2vywM`6zu%5;=+kf}OE0bCF}ygQ7yqUtbSIwgLjwJNJI#2T z7>|#d8lF^zBQ%yupYo6!UQxrMls*QvFWIrg)nwIH*9=WqAd*w~NtUj&6jH)^$N8HU zy&=7tCXUw7I|~OoD5u^X0MGL@I;}4j837!a2Brrblxg*7l#coN;d^^{3K&va{HB}0 zrmhk9c!iZ=tu$6Kn;{e<9~Nxniu%rl@vE&YRIu{_9CN$#Gz1t5R4Z)&-P`_4CIhHi z=N`NtZ2l!Bl@PP#q3%ghQ3bx;3%c`H?t}3v!osy-e+t1TMcEE1b4H3L^EmDHzM1eL zT6VKP?#_#t>GHb(4gD|mc9#pGJvcSfTSF4}O4ATuj;y=K0(gON#;5V%g6WhqVgB1#%qz)ceoy$npbRma28Y+6z6v9p8GeD&i zaG29pWj;(#+1=M!0qU_#o#pYir_;XQu_>TvYIQj{W8b zpY_4`6oBPppO5ZNuDZfP2Y@PSm~ei7(I~=>ogMZE0Nef+Q}!IJ$b+$1Iz)J?&rf&& z%fd*Y#X#6Uz!i`V6V8x*1?zbXBT#q9yZGBMHdaX_EQ!l@VG=y`0hk`3pOI6IsI%F8 z0N`$-)J3Cl9{w-+(GC5)uy^j(158kU@!C)S9=311Y>c6reK6i~FFf$7rj&_L*l=b8 zdS|n>EjOHiK(6}=Dd6%t`)P1`S4V@?LVdc-+^FXL)$|q=5fMeDbzk=Z(D?wjha#e5 zuO|A3mM(#0rM#s1V6eJ5dC-4fLv{Xp6??`M^RwFgbaO;mffx`5$b;5+&+yDmu=`Cd zs>yr?DYT()Fv;_g<_k8ofsG|aSDfwnb+wK}3JeL^LP&_78?EWSN?6w;#m`ruNc`6r zqGCbFWJ>}8b~%tpL_LsKKus?&W$-5n`W3%&ZFd4cwZ8N>{=HKQ9x{S^Vr z4CTVfE4&=MgGOue;0&D`rgm(^NS1W4Jnkugg&A-sy3jAE|FdVhG?C5?txOrE>%-S) zRw6)(pFBDGD&$swKWnd_o)AJ1;NI~$Mmvlk=wnw;r_gh-N)(U=K*aDQ@9-8efcX0H zI5j%Us7zdZ03$v|rM#911%j9oHuhB4ZE`ZR1G{S7Z{#syLpD>&tC+gZq!&nf}Y?pUmR z9$fRfuIZd5V;rCP^ZM=0Moqnwt6X2;E=_rv%f<1?S-&_!6$Nq+wbh)L@cUm+TY8<< zT}ijF{1OrxM85aVIw;fQ)_Pv)reWBB`oyT5&>HxZ}9PcoeN) z(kbt5o`w=IUyHpuVED^T8Pg=I;Aka*DtnR=wt9faKA5`ya%^+nAFDX8`}#K%4J$}y z*cl*c;JiG~3tRHq+wVB!@$KBrm=w zxfm2g4;QR5TWW+%4a36X07R(*rZ!$pop+F||INaDTC_V`NiajH#gSAtFg3Kq4v>hB z*5uGD4*JfF|L-F()hybQQCs!eQ4lO{**0cZ5pl%c9t%OE_G2;_Oh0EQOs%)itMVO+ zVPqYqPKtj%XZ*aSAb0>;3RkJk=BD}a5)6Nn`wxpHnWQ4G898g7LW8g9R4P<|lO`&l+~tXh;9oKv$1#Q1DwYH#tej~1u;Cl}O-SGKne zg9J0{%2Ih;a6`WI*ze5VPMxO%0XUGXf@1&(hj6&vM^9|P`gl6I@+%XeP(UmKn(pFX zlWj)y@Gh9N3F;ru&U--K0sry=+?})*T*jumxsIY*&FT(q? zEFyd6O8ZbR#m>Ch{1ZU%f%u~H-*oDbAyBv2a4J<++Io##0A2iW@Ay{x+YtFAerf8vyL&PnFKyn%=`pY?w=Ub@2^L zsHXbzlg1U0On$KPSq7u)*G5q^n!>0}_kLB5citGk8@`7e87EGr#J zVG`F=;v^%5ljxM|T6L_hX?Apu0GaYgdrwpWTmIl)E2=!e?8ye_@|OH zTHhdF?vx4?F?pPyhCyEJ^us93LVI(~xM%fjQnAfSZg1aM^GmIgf@Z8{-0A#IAc*V zAoC;o(i8NOL|JY8bBp=#$LCl(Y;5Dc-8rMO#kO1G`skF+ruK<|$N1}`DJ5bwYAR2e zJ2IJQH=Fg@;D+efSgha0{rNXBOs^FbG#wt--r42-!cggOjf{+B^P!=k%BQC3>wj3$ z;fn^|xyte}&)=u`$fL`JKUM+8B~q37Wx+33>8t7Q;S5Oo$6^@~RkpijUt6;cw~Wp5 zt<>4>4;K|m3JMs>B~#qa#y!lq;a>6s6)ULH|KK}0ICR^Ybg1Yu**g#l(`*bD%q&|? zv()Bh@Dxm{vc3eGbRdTS-*pJZ^?-N?ZplKm>jdEoQcMFdG|SE3j=ipZI}PMGG&CX- z(t-cgIzgg=9t3hYxCQquZu?)^pYLV9RoGbzqJ7-jk6$=I(o+Z-k4g+^yVO86Uv%nk z?~UnM?{DxIva#)?VqmlytFNMX$;;|+^UV-4Ut*k68{zia~1k}(?N0cCBv;je(w>dw~*L=DqG`AbE8gLU?wN(TV+1e(5p z^(5qUk~r&cbh~OGyl72IqVNd>O7I7)v&63Aor8a*D|gYWdQWkCEqMVWcO`HDf(ANP zhEyI=@jx)EV|>mmJXC5B#9ukn<%;jr%nuyGY*xxEa4o+a?`-&F8Y{bsD+^Nx6N6$I zN?HrqRmD3X_SocR0M!B!w2yRT9}d*?yP}3ZoWq$iSD&w zj0BrvU9SyHzXp1davRpC>Sw(Foe?`oQ?YvASLc>a(rOb9aViBYo51l$R2Mgc^y`&N zVo*kDuzXAEFEWE)lY`$ZkXiL!Xo~gJP@}N(a0(D(sVCwEOD$0bljj&rg^dAT^&RK! zFNC<91UU;Ugbdl3--&A7I)z2l^QynAZCz!wSb2FkQwECISjQ)3ZV7E7Qe%zM^T@(z zalxFl=<&+_w~}|CNR=T*17dZ&tM5ik?|@1K-Um>mY{^Hl z1DhWyIx*m1V%iPd+1spxh0{CK2gbGLZpHOeJ8(P2#^P-28>Ca38tcoa;Y&KOGH{cI z_UY%F8SmjIiW+DjhxR>T#IGBRrvh+~xRq;F3ERl?3+my2jKV|AvLayKh9m~4_OB{e z{(@;Ue@y=G^a9<^c>7?BwvzmHDk_S!-G^dJ#X`1LJ}jJh*C17!r>fBq^}U)*y8L1q z+j(+9e7HO|*bGYA+P*)V92|!M06IW$J)#^p{4>Py%n#q`YE+r|p5tv@kEmwyv)(V( zBwi_-5J}xfLT-&rwfD)|?XoE>MNa3=&1);wA8uZg{=WhfbZbT_w)J<65839M3khn@YuJ{r`hQ z)C6fTka;}DnGwOkL9-VR-IQibeh0GyrPv$bpGIROjD79LTh{3WPyPQxLZl@kBQM*o zhM7x)Huu*l{FdApU`YaDshx#h6=Ztr3doh}GEn-oXtrEwmA-1yWl%*EiX=hsp`;X| z@~vMb1Zy?w-8U)1Q@0!U|P|QJEbltEpiqYnhp_@y-_{ zY#-=K62C@9MSL2aCS-S=+{qAVt1B$vES+tu3t=cOl@4)6q*^FhRA0vLE`Pa;&5hMXI8fHAviTQws9h! zR-)TAmz%}y*N;ekAqFgr)qWzCMJF#xp3VW?;%!enjMaqURWXzXXCMT=!l{|2sU9TI?H4WX|_g?B2 zkN7PhhKJw|r{`u@54v?1&UuA++{?p2TZ2n?mq-?9G1fu_w->WOe{PyaQv zJl9Tyiawo$_32YnQD3vO;BeS)$;+DF-8=42$c%U|t7_NV(o=EDaU_M+9+51Qd5xTO zt+tkmo{`Yssg8b!+I2qNH9o#Zen03Xj+|pSapeGzLS5tdZY~-MOqYop$+Sfm=@_l` zaJK2sz%kLDl||K@t)cd6F;7N2Sfchlug&VyqXrx*eA48vh0ilx5~ln6LMP4)zzngt z_+w`mFDCp<+Ru25pm1H?JT7j%Pru{)`s~=BJGQJRV`Fh86U?)V2J|a1#>WW-h1y2? zQ!&b^X=oM2Gn;6BT}+JIKJ4!kH3dr!_cK7=k#TWry4pjf6{$SWYGAonEp)$tLZ!=y zBbPk-i%FvE;8Hvjk{>oE#pEK(=(ur`zOY(5*vn%;Z}<0a>znq?Ojw!TzA-UD&C=7# z$u8!!=Q!91I(99j{66ya1$*&|ZG&myo>sKs1v|@@HAezx8sSerEF4V3;WWqF3x}pi zJ?Gm^{Y_~Co`Lzt0n^UM@(2W7p(a04o`^A0bHAi^U_Q_F;79uQf*E7Dpr~Z~hzkbF zcbM$&Kf5-e$}u3DzcP0@r$4*Qfqv6t^pLw~%l$F! zeTyq{#pI8w=Oz4djQK6<1a_D4QtW|nt){2rN`u8RIs^zU7#_d2bk(*YOL#Vw*HcVg z{k2%y-foTgAKNrP=Cd=q8FQ3C4-5v zm2F8k{_Sn<1J58&Cr#)sxMB+~q-)sTP9ZA(`T~`BX4(>!%g*CjMWrtX4)u+J0c8EX zrwumLl2J}B^>*F1p^`qVWSWK@8zh=pBtFt@l~H%6$NnJF?|f*j%@R$Son7PF(s zg5P9!2@!Nw^?ofrDgA&oGAS%1)N0ylqL0x~ykKM~^H(pTq+sth{oPnu$>;wN71g|^ zi;?ix*m7D~p{fdxoPzE#tL_q8oPh4B;~qi2=I8I<6|Je4>HH5Z0a{ya=^ekw{hN~? z67+DL zX!felpDURvMXpnvlg|9rC0g!JYP~BQZQkPFlK4n|NNcq|>s?x3R$_`D80znP3GBFG zA*9#q3d%(cW0U&Cgx8@Blyo$GcgbRfr9ejiPM5JdO^dsA{a@q1@k%g!|DDI8CvaJK zq+-4&4H#f$!}~Nijxc|Ef|OBCOu>*OSr8c=TZPB;O+w+m$@1j~3U-<@;x&GK z@PHd3=VOj%demax@jJ7h6{I4KbN_fk!@bZj?S3{ZD~X|tp$7eeh3xe7*fr**rMGLV z%V*7@o&1oyruKDf^2a-LGgEQupytl>d8fn#NoW=y?Ie0rB|=of=_pKE+|I!o<;A>&z6IxlHt=hbZ~}fc{_kDI z2}Rq3M;_6Oy~e+Og+kD=36E{1?caAu_wP74>jk?7fBsxrtluLVvkE{9mI!&6q3h5o z2RpuY|Jmc5{zu2Ev8nN{>HekQBN^Gp05$cV=HUMOGqn|2(kz?Qk-r@jsGnWIsO&mn zk$Y}oCg4QdW3RGg$+L=BNkdJ2cl)TaDB*x?GBAuh#*kINP}b3#WpRLVz)@V1)1j^N zZEYZS|Do7lHSM##;S~9E9hF$KK<4V;G&HC35gEPw z!os|2GP+Ws9S?q8*w`e_4}x%Rn#iFHU0oH&QABO-o4jT?y2WH&T@pc^8M(Q+{;&7M z#XnNBJ}AA971pRVs{{5khvmo9eZ;i$HTTmKMsJY}4|*dz;7~Kijfu|BFytq$lDUr= zyDcN+tgffmF|}D)Sz)|=Edu^BP;hVe{tmozRlm!tUhQ~V%TZB`yQfVaUd>4nrZ>ps7;O%Ae6jL zRK+AdAikl$8KEJoEWhf~T_oB`H#1pQk#ywCx-nLCsqm^(@AgCpfY z_toalL@&jNUg{=h>(3>G_``Oxu91L?n7I(car|9yjvkd_#$d-**;SEf3odwAhsgf+ zx9E%v}C8*F1+z4Oy&%})#g;_ z8%t6L&W=`RGuVnva(b@(Iuik*m!GPpWl_`4&d~Hy1c-^tT&tcmpKsY|RadIMlLkrN znr#)U9Ua+GxTvEt?T;Zi1!SHfd^LFosUm&im&Z#=M2lQTg-3Wb3%1=_Fap(^punoU z094CZ1T-_#B_o4*RdwQ~=#-RiBB2{j$Y7fn8x9s{$opC@-!kfH@{=rj;=n*=+jmE2 z+J7Wuo|BU_Wk>Jh@Suoc9td87)%oqU)guBz2!eBWqmL@1-qB=Y;@$xNjJcmboXf{% z4`e9or=VL~1UUB~Sp_A`9RfC1Fm$AM_%s#YepOI(hv1p4=x2$M$jT{6UU({;w}XaC zd|d3#-p+@nhXbzqmf~hbY2~9op*_ucb@oqZR6K;(oxyb6?B5U?sjU$T8pS0PxYs<9 zWY(Q`Zk`mj!!d(_oz?QWrQJI4`Z8Z?_#s&!r=oz`a;d1Gi7A$Lef@XWj(i)l^?5P-Apf8Uh6-l)gPt5&+mX?YW-S-ce z!)Nw8hc$|0$gZ*FekUD~0*vy)8CFArzzXoO`j$N{uQ0)T(pGD7Sq%afQU9YaD`}ai zGQo0kvV3fm4lMdv!IJ!JlUT9;cmu+zhNa^jkH8em?=0-vt~aBOVP#YH$5kIbI3Rz) z_?aV-m@o(uk?0q&bMM1qes(4{*hO4WgDiZd!4)lPoS9It=fta!Dh70bi6f7A!e4qT z*%_YGvi`T<-G1HvgJRGyF|F5%XlR<|=V04=nwyE5STX#9?M(vQxr22~m~`Tr=EGxe zqa&zTA@43-Y;3NFf_&;a@m@1ZRtuv@qZ?@|DjG+p6j^mG*Zn2rjgIB-aNg7yk+P}~ zL|QE3C=d4)eH8>?4{31UuN&2#lba91)!sqG4}eNmh02YOQ9-9>ZTarBL zhJ+pulKcgC1|Ei}m{=26=nHRrC-r46Wr1Q=)@q3O&R~OmCOG_im6~&NVAbR7u-T== zP6wTt%iJ^ydgzj=RzbCLSM^WlI$_%x>XXhGh|CT;^3AtkWPG04X$*HutZHxkI7X3PZaUnJ={kC053l+8P;ZqFn=4}J> zRq*m#d(YJFHevIA{k*Gn9w(pNU<8Qe6JFEc9KCQO7l@XIB)9$y#KT=5hf@xDF-)pc zLxDlT4ot=$#&A|}`;Z{A93e7;F36gfcEeK@J}RHM?9;%$)e|P>GC2tH`JacAs5v$7fm`%z~+31y%IgZPv^i zjmsp@M{aK16k7&ZXEe4p*4P{y=Ddz0t0{DJbf-aOKb0t9JHkP9#5PU3j-l<*|8!Av zq9WJpZ@o&7Qo8LsQm$IeevCo!>-wPBzbq4mPh4JnR$z1O)0LRuTR-vJn3Nx?MofN4 zU=D~6s)&{r3>2tTGBN$>?VvMmox}{iV2g9B!6DlZv&%5lmv_|_hAgZf@R{UGNMBdV zmjwH5)v_DK8y6HDAtKFIEF8OhU2Eyh7pbVQf4wey63fsa~XqsvIF_hEF&_l~$R;B{5;B z*IzP8xwAL@c__r`Rizlb*ynjcH_aQqJA6FE--b$?S4ydG#L9*&B%$;lOYN)H5rPI} zu?hhr@TjAwmZp85+wh&rm=fQ{mujjK)$hhX{0{k-J7Z=7FU&h_E^#YAT0;1{u@QK4 zQLzpU4F$5HL@J2}N>KLFz~d}Uj~-Q?{LO>~2dn~aT$)*a-Sj60UR1{EM7%^uR#g)1 z0!ZyHXep`?=n?ogsqnqC__A1QhS%#@v&o!iTVO3tnHcAnWjX9G z=S^NI?uOcTsw(8`L$Y#~+t=+AgAQsO@&d6}imuIHjV=5nQ+6&-P9H1J#?9({J&cA# zFcc=1MOvIuAk4+q?v{6^-*a*bG_~Y#2=Gnn0lpN)+gy}2b(#3z;vTuvTf)`%Wlzp8 zo4X?){DAeOn($a%eMH0^EP3gPhP`O;r0w^k_DZ+R1nBK7MTL*pE#L@{9rTqw_zPBI zc8*{8!gw2!M{8S>@!1IZ<$3YBVE5^I+Z=3$OlEg3ob+(Y{C#LPdYH_Cf!f_3>Wj-q zJMm{=pRUGa_2{ zy-C13)3e%FO;%C^uNbw+ySs@Ji4W&S40{Xmq&IYDJ?kgP$d@ygub!h42t@5-`*hFn zZor%jOH5xFcY?^_4EFIzI(pLApN;3xUeb%H~RHz3eu}KTcA7tLSC>7`RhIQE}0*^2%M$KC2}%sGSd!S;!Bi z2h|l>)1u{#Wh!L7d*|}~{O$#Dr~*oWKneEyp;{oS!SrWQf5@Aq$UM<>|Li^LRe|QOp#O%m_QfDKAt)g*P}Igm?j$q>eN4u|!G5N6 z!I}N$$4y;E0GgACX*XQ+`pIc^PLl1I%MfgisU{6A1jC zRe>a#jSFmKVy!O1kY19*JlY9jq0jYQy!bwFC8_?sgx$X! zZ%Wxr*a>V`S;0g`q@QAf{EE{p-N9WjARAMc04C_vOZ+QUM|zC;m)K#0BO4S|Qpj^d zZXSN1oKXi4Vp8`uSee@nTYirdU`$tDBlmu#YBU024bxxW?W^9xL6-OF~r9l-JmnyMwO88 z*Kawv8)#Xn--tWTJnO#pF;;jzXT;V?K|vnY zyZsT)g{$k>p!v}F4I?AO;VB?%+HGR@il{9BwlV`JHf^ec!Y2iKfl$p z&>!_GUgv-~yf%w}**ne5$Hm6Mc)$MeuBfGibWH$c8bQ1*IXPrEcdr1ZH;DtU6c{0M z)7@~rr3ss9`F{I>HFMY**Xbke;pRT>Eprv;K@mH{3-5*mq4+Ur^02g*5b!|UD;ap$ z4gJ*(vQ)@BD+RMHn}L26`@did#v9nDT7UaS_!j9k`g2!v@K<-@TGB&T=2>%4k|R2A z?QE3@b560o{l1edl@#DMawq?dgoeyvdz7C!%j)YJFgAlotq#Zc&jt>*n%fAM$F`-i zC%>GF&_UCN%d!IT4&`F-&)^J*jjh*v1cdAHLsf=uW!_tL1uhT06 zC_SrmI7zcbcVsC`rR=cH-sN#D>x*j=$a-7b`Jnt05;C=Sw~Me0TO>SH9x53t_^Wp88SPP{_` zN6fdeS&zR9UbW=exonIHU@Q7{qoo#fS8=$xyd zmz%S`_Whuw;^6h8!t>4_l2w$yVR{lG&0-{D<-G0Sh9aV3&a~e{5W`v~`?0D_F$pZ6 zi_qMig_#yv^Gk1nBqzjyPmoUJ^TWw@_&X^iwg3Wr+$!5gTW}*PU#4QN^-&cu;yc-(Dv+>;C7NF0+z}1>l7Z(b^qdO`*#%xQ0eh<)9H?vfszu+IWCrn$eIlYWc}7M zv_lu;J_$I#_tb3f&OwZGvbSs^Mlq8(|3E+`dDGV` zd9Bf+%JF!*2=CIM&8hQgw9|Z$(yjBiWArKgk%%;5x-6Ale2sW-4NHw)S~CtVt~QI4 z3BMeFZ^t~lKu!;ucUcgr+y;2oC_!r2? z5#bFsUQORSa3mAl?H~W$Dv%F2eWo`z(Op|#rT6Kn;xs1@8QQe1nVMQSFb^-)-ackV z4DS#N43fg%XR^F7wqYF0H6%~!5Qf!2CHia}T6SDOmxNaL!YBC`Ql(BP=o45D*OgkO zv$L?Fu&|uiTSpj=$f>F;_o3HS>nVJ0%*y`?%Y2;Gy^)zRj@BZr(&jXxwXC@Tn zzb21OP7dlaCP)f#a!N$QOlWGNma4TFoRTz@!u3}~C%>0MM&852Ge!pUj!JS0x%$RV z4{A&Fic26UyhF;#VbhvJN#B+=Hn?Z~eZaHB_Z~;EmJR|maAV>U@vqa?7PwgQa7Oj4#tr@|leAL^o#$amms&=InN^cqpR`_HQNdh%lO zVUKP7H=K~U$puFq&P9j6t6&Dx`}sQV6zjDEU{3hgB-+p(;~h5C-!GvUqZAtY zy87Ox)@k)!U}dm8nGo5)AA!a!I{xNrUrD(6&`Mm6NtxyJ)>QwPV_n|b0eJiz zHS9?>&!*=pg%8JlMMOYKKvU^af?tcdN=!<~qB(?{NtueAoULm@LQ^U0ht~3}=(cUc z;{_7Ai{zKu>rNeJyB}XSHaCo1hEhL&-*d*j?juylmAbgvMkVT{5h04gE0XE36QqZNPHn7Ave-* z*@(wNhQ=hW?9>i2TF>=sUdEn#MD{RfOKDf(gm-NE^Nz{iBWLQwNavSPK3kK$4e4n} zUY@k{k9z3NV;|`JD41e&b)X(-jxxW{9V2a3@3zUmjXCt}1n-8^Xq!R=xl7(HSlV~+ z#sB{%5q$g z0y|gpN9$VEQ_II((3ZwBqL`G=vi}R3*!Hfz_4PMs=U4Hhe79N780dzUdQ4q;kL_)u z=JOyy_~G&f?sh$Ahy|b8P%!&Fs zB_*XtN(hB-crus$^O)vWbeK1!e#A7S+{0a8tmjPiIT^ue>GRhe>Gikw-&E+d?=?+_ zwc$;Ro1lO$>WAdqSFbj`;vzdlg#5er_IAX?A5sfsQb_6O&X2oO=GhJ?Y3V`df`tk1 z)EV7@)q#Lc6DD%}aNydZ+QH2=wrhBoU+_9>sZzmhrTK$;>+JpNorPUIhXbZ zvj1|}w5{)Mh~A)}g4t8WrDTS+%nSu=Z5kQcyO+PTzm>7Mj;hXFTM~c7ijg*6t&Iq3 zb2cPK5Vsm9?RIUq-;Rqr4kZ2Ia~7@hi6B@OTTxIr)QqB$5kY+9L)p!~NP}yq>OR+F zWnTm(C2!EL + AliECS Environment + + +## Tasks + The basic unit of scheduling in AliECS is a **task**. A task generally corresponds to a process. Sometimes this is a process that can receive and respond to OCC-compatible control messages (also called a **stateful task**), and other times this is simply a shell script or command line tool invocation (also called a **stateless task** or **basic task**). +## Workflows, roles and environments + All AliECS **workflows** are collections of tasks, which together form a coherent data processing chain. -Tasks are the leaves in a tree of roles. A **role** is a runtime subdivision of the complete system, it represents a kind of operation along with its resources (but less than a complete data processing chain). Each task implements one or more roles. Roles allow binding tasks or groups of tasks to specific host attributes, detectors and configuration values. Each role represents either a single task, or a group of child roles. If tasks are leaves, roles are all the other nodes in the control tree of an environment. +Tasks are the leaves in a tree of roles. +A **role** is a runtime subdivision of the complete system, it represents a kind of operation along with its resources (but less than a complete data processing chain). +Each task implements one or more roles. +Roles allow binding tasks or groups of tasks to specific host attributes, detectors and configuration values. +Each role represents either a single task, or a group of child roles. While tasks are leaves, roles are all the other nodes in the control tree of an environment. + +These novel, more flexible and more easily deployable abstractions represent the evolution of Run 2 abstractions such as ECS partitions. +In memory, a tree of O² roles, along with their tasks and their configuration is a **workflow**. +A workflow aggregates the collective state of its constituent O2 roles. +A running workflow, along with associated detectors and other hardware and software resources required for experiment operation constitutes an **environment**. + +## Activities and runs + +**Activity** and (data-taking) **run** are used interchangeably in AliECS. +Run is a term present in ALICE from the beginning, while activity was introduced in the early days of the O2 project when it was not clear how the idea of a run would evolve. + +A run is a period of data taking, which is defined by a start and end time, typically lasting several hours at most. +It is identified by a run number, which is a monotonically increasing integer. +It is also associated with a set of configuration parameters, which are used to configure the data processing chain. -These novel, more flexible and more easily deployable abstractions represent the evolution of Run 2 abstractions such as ECS partitions. In memory, a tree of O² roles, along with their tasks and their configuration is a **workflow**. A workflow aggregates the collective state of its constituent O2 roles. A running workflow, along with associated detectors and other hardware and software resources required for experiment operation constitutes an **environment**. +Run has also a second meaning at CERN, which is understood as a period of LHC operations, lasting a few years and separated by Long Shutdowns. +These operational runs are not to be mistaken with data-taking runs. diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index cf0024fe7..f0953e17a 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -167,21 +167,6 @@ roles: In the absence of an explicit `critical` trait for a given task role, the assumed default value is `critical: true`. -#### State machine callbacks moments - -The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). -This is the order of callback execution upon a state transition: -1. `before_` - called before event named `` -2. `before_event` - called before all events -3. `leave_` - called before leaving `` -4. `leave_state` - called before leaving all states -5. `enter_`, `` - called after entering `` -6. `enter_state` - called after entering all states -7. `after_`, `` - called after event named `` -8. `after_event` - called after all events - -Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. - ### Call roles Call roles represent calls to integrated services. They must contain a `call` @@ -212,7 +197,7 @@ for examples of call roles that reference a variety of integration plugins. The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). -* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. +* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. For possible values, see [State machine triggers](/docs/handbook/operation_order.md#state-machine-triggers) * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. * `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time that `func` should take. The value is provided to the plugin via `varStack["__call_timeout"]` and the plugin should implement a timeout mechanism. The ECS will not abort the call upon reaching the timeout value! * `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index fdf05fa7e..de36c9f59 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -4,7 +4,22 @@ This chapter attempts to document the order of important operations done during Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [core/environment/environment.go](https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. Also, please report to the ECS developers any inaccuracies. -[State Machine Callbacks](configuration.md#State-machine-callbacks) documents the order of callbacks that can be associated with state machine transitions. +## State machine triggers + +The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). +This is the order of callback execution upon a state transition: +1. `before_` - called before event named `` +2. `before_event` - called before all events +3. `leave_` - called before leaving `` +4. `leave_state` - called before leaving all states +5. `enter_`, `` - called after entering `` +6. `enter_state` - called after entering all states +7. `after_`, `` - called after event named `` +8. `after_event` - called after all events + +Callback execution is further refined with integer indexes, with the syntax `±index`, e.g. `before_CONFIGURE+2`, `enter_CONFIGURED-666`. +An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. +Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. ## START_ACTIVITY (Start Of Run) @@ -83,116 +98,4 @@ This is the order of actions happening at a healthy end of run. - `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. - `after_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `ccdb.RunStop()` at `0` - - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` - -# Integrated service operations - -## DCS - -### DCS operations - -The DCS integration plugin exposes to the workflow template (WFT) context the -following operations. Their associated transitions in this table refer -to the [readout-dataflow](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) workflow template. - -| **DCS operation** | **WFT call** | **Call timing** | **Critical** | **Contingent on detector state** | -|-----------------------|---------------------|---------------------------|--------------|----------------------------------| -| Prepare For Run (PFR) | `dcs.PrepareForRun` | during `CONFIGURE` | `false` | yes | -| Start Of Run (SOR) | `dcs.StartOfRun` | early in `START_ACTIVITY` | `true` | yes | -| End Of Run (EOR) | `dcs.EndOfRun` | late in `STOP_ACTIVITY` | `true` | no | - -The DCS integration plugin subscribes to the [DCS service](https://github.com/AliceO2Group/Control/blob/master/core/integration/dcs/protos/dcs.proto) and continually -receives information on operation-state compatibility for all -detectors. -When a given environment reaches a DCS call, the relevant DCS operation -will be called only if the DCS service reports that all detectors in that -environment are compatible with this operation, except EOR, which is -always called. - -### DCS PrepareForRun behaviour - -Unlike SOR and EOR, which are mandatory if `dcs_enabled` is set to `true`, -an impossibility to run PFR or a PFR failure will not prevent the -environment from transitioning forward. - -#### DCS PFR incompatibility - -When `dcs.PrepareForRun` is called, if at least one detector is in a -state that is incompatible with PFR as reported by the DCS service, -a grace period of 10 seconds is given for the detector(s) to become -compatible with PFR, with 1Hz polling frequency. As soon as all -detectors become compatible with PFR, the PFR operation is requested -to the DCS service. - -If the grace period ends and at least one detector -included in the environment is still incompatible with PFR, the PFR -operation will be performed for the PFR-compatible detectors. - -Despite some detectors not having performed PFR, the environment -can still transition forward towards the `RUNNING` state, and any DCS -activities that would have taken place in PFR will instead happen -during SOR. Only at that point, if at least one detector is not -compatible with SOR (or if it is but SOR fails), will the environment -declare a failure. - -#### DCS PFR failure - -When `dcs.PrepareForRun` is called, if all detectors are compatible -with PFR as reported by the DCS service (or become compatible during -the grace period), the PFR operation is immediately requested to the -DCS service. - -`dcs.PrepareForRun` call fails if no detectors are PFR-compatible -or PFR fails for all those which were PFR-compatible, -but since it is non-critical the environment may still reach the -`CONFIGURED` state and transition forward towards `RUNNING`. - -As in the case of an impossibility to run PFR, any DCS activities that -would have taken place in PFR will instead be done during SOR. - -### DCS StartOfRun behaviour - -The SOR operation is mandatory if `dcs_enabled` is set to `true` -(AliECS GUI "DCS" switched on). - -#### DCS SOR incompatibility - -When `dcs.StartOfRun` is called, if at least one detector is in a -state that is incompatible with SOR as reported by the DCS service, -or if after a grace period of 10 seconds at least one detector is -still incompatible with SOR, the SOR operation **will not run for any -detector**. - -The environment will then declare a **failure**, the -`START_ACTIVITY` transition will be blocked and the environment -will move to `ERROR`. - -#### DCS SOR failure - -When `dcs.StartOfRun` is called, if all detectors are compatible -with SOR as reported by the DCS service (or become compatible during -the grace period), the SOR operation is immediately requested to the -DCS service. - -If this operation fails for one or more detectors, the -`dcs.StartOfRun` call as a whole is considered to have failed. - -The environment will then declare a **failure**, the -`START_ACTIVITY` transition will be blocked and the environment -will move to `ERROR` - -### DCS EndOfRun behaviour - -The EOR operation is mandatory if `dcs_enabled` is set to `true` -(AliECS GUI "DCS" switched on). However, unlike with PFR and SOR, there -is **no check for compatibility** with the EOR operation. The EOR -request will always be sent to the DCS service during `STOP_ACTIVITY`. - -#### DCS EOR failure - -If this operation fails for one or more detectors, the -`dcs.EndOfRun` call as a whole is considered to have failed. - -The environment will then declare a **failure**, the -`STOP_ACTIVITY` transition will be blocked and the environment -will move to `ERROR`. + - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file diff --git a/docs/handbook/overview.md b/docs/handbook/overview.md index 2d3bcb481..d1cf1f9a2 100644 --- a/docs/handbook/overview.md +++ b/docs/handbook/overview.md @@ -1,6 +1,6 @@ # Design Overview -AliECS in a distributed application, using Apache Mesos as toolkit. It integrates a task scheduler component, a purpose-built distributed state machine system, a multi-source stateful process configuration mechanism, and a control plugin and library compatible with any data-driven O2 process. +AliECS is a distributed application, using Apache Mesos as toolkit. It integrates a task scheduler component, a purpose-built distributed state machine system, a multi-source stateful process configuration mechanism, and a control plugin and library compatible with any data-driven O2 process. ## AliECS Structure @@ -18,14 +18,13 @@ AliECS in a distributed application, using Apache Mesos as toolkit. It integrate | AliECS GUI | Instance of the user-facing web interface for AliECS (`cog`), running on the head node. This is the main entry point for regular users. | | AliECS CLI | The `coconut` command, provided by the package with the same name. This is the reference client for advanced users and developers. | - ## Resource Management Apache Mesos is a cluster resource management system. It greatly streamlines distributed application development by providing a unified distributed execution environment. Mesos facilitates the management of O²/FLP components, resources and tasks inside the O²/FLP facility, effectively enabling the developer to program against the datacenter (i.e., the O²/FLP facility at LHC Point 2) as if it was a single pool of resources. For AliECS, Mesos acts as an authoritative source of knowledge on the state of the cluster, as well as providing transport facilities for communication between the AliECS core and the executor. -You can view the state of the cluster as presented by Mesos via the Mesos web interface, served on port `5050` of your head node when deployed via the [O²/FLP Suite setup tool](../../installation/). +You can view the state of the cluster as presented by Mesos via the Mesos web interface, served on port `5050` of your head node when deployed via the O²/FLP Suite setup tool. ## FairMQ @@ -40,4 +39,4 @@ The main state machine of AliECS is the environment state machine, which represe ![](AliECS-envsm.svg) -While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](https://alice-flp-suite.docs.cern.ch/aliecs/occ/) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. +While FairMQ devices use their own, FairMQ-specific state machine, non-FairMQ tasks based on the [OCC library](/occ/README.md) use the same state machine as the AliECS environment state machine, the only difference being that the `START_ACTIVITY` transition is simply `START`, and the `STOP_ACTIVITY` transition is simply `STOP`. diff --git a/docs/kafka.md b/docs/kafka.md index 53d3bd56d..0a5ab2813 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -24,7 +24,7 @@ Once the topics exist, no further messages can be lost and no action is necessar ### Currently available topics -See [events.proto](../common/protos/events.proto) for the protobuf definitions of the messages. +See [events.proto](/common/protos/events.proto) for the protobuf definitions of the messages. * `aliecs.core` - core events that don't concern a specific environment or task * `aliecs.environment` - events that concern an environment, e.g. environment state changes @@ -38,7 +38,7 @@ See [events.proto](../common/protos/events.proto) for the protobuf definitions o ### Decoding the messages -Messages are encoded with protobuf, with the aforementioned [events.proto](../common/protos/events.proto) file defining the schema. +Messages are encoded with protobuf, with the aforementioned [events.proto](/common/protos/events.proto) file defining the schema. Integraed service messages include a payload portion that is usually JSON-encoded, and has no predefined schema. To generate the precompiled protobuf interface, run `make fdset`. @@ -79,7 +79,7 @@ As for today, AliECS publishes on the following types of topics: ### Decoding the messages -Messages are encoded with protobuf. Please use [this](../core/integration/kafka/protos/kafka.proto) proto file to generate code which deserializes the messages. +Messages are encoded with protobuf. Please use [this](/core/integration/kafka/protos/kafka.proto) proto file to generate code which deserializes the messages. ### Getting Start of Run and End of Run notifications diff --git a/docs/running.md b/docs/running.md index 840c89aab..53d80afab 100644 --- a/docs/running.md +++ b/docs/running.md @@ -1,14 +1,14 @@ # Running AliECS as a developer - -> **WARNING**: The running instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the [O²/FLP Suite instructions](https://alice-flp-suite.docs.cern.ch/installation/) instead. - +> **WARNING**: The running instructions described in this page are **for development purposes only**. Users interested in deploying, running and controlling O²/FLP software or their own software with AliECS should refer to the O²/FLP Suite instructions instead. ## Running the AliECS core This part assumes you have already set up the Go environment, fetched the sources and built all AliECS Go components. -The recommended way to set up a Mesos cluster is by performing a complete deployment of the O²/FLP Suite with `o2-flp-setup`. The AliECS core on the head node should be stopped (`systemctl stop o2-aliecs-core`) and your own AliECS core should be made to point to the head node. +The recommended way to set up a Mesos cluster is by performing a complete deployment of the O²/FLP Suite with `o2-flp-setup`. +The AliECS core on the head node should be stopped (`systemctl stop o2-aliecs-core`) and your own AliECS core should be made to point to the head node. +Typically, it can be done by replacing the AliECS core binary on the head node with your own and restarting the `o2-aliecs-core` systemd service. The following example flags assume a remote head node `centosvmtest`, the use of the default `settings.yaml` file, very verbose output, verbose workflow dumps on every workflow deployment, and the executor having been copied (`scp`) to `/opt/o2control-executor` on all controlled nodes: @@ -26,7 +26,7 @@ http://centosvmtest:5050/api/v1/scheduler --dumpWorkflows ``` -See [Using `coconut`](./coconut/README.md) for instructions on the O² Control core command line interface. +See [Using `coconut`](/coconut/README.md) for instructions on the O² Control core command line interface. # Running AliECS in production diff --git a/docs/using_grpcc_occ.md b/docs/using_grpcc_occ.md index 68e535aee..8a26c5b11 100644 --- a/docs/using_grpcc_occ.md +++ b/docs/using_grpcc_occ.md @@ -8,7 +8,7 @@ installation with `npm` is straightforward. ```bash $ sudo yum install http-parser nodejs npm -$ npm install -g grpcc +$ npm install -g grpcc # it can take a few minutes due to grpc build ``` In a new terminal, we go to the `occ` directory (not the `build` dir) and connect via gRPC: diff --git a/hacking/COG.md b/hacking/COG.md index 0bb5aad7b..1733f3cb8 100644 --- a/hacking/COG.md +++ b/hacking/COG.md @@ -1,4 +1,4 @@ -# AliECS GUI +# AliECS GUI overview If you are using the [Single node O²/FLP software deployment instructions](https://gitlab.cern.ch/AliceO2Group/system-configuration/blob/master/ansible/docs/O2_INSTALL_FLP_STANDALONE.md), the AliECS GUI is automatically installed along with the full O²/FLP suite. @@ -44,11 +44,11 @@ In production, AliECS will manage and push all configuration to active tasks, bu Every task still has their own configuration file, with paths such as `/etc/flp.d/qc/*.json` for QualityControl and `/home/flp/readout.cfg` for Readout. These paths can be edited by the user, and any changes affect all newly launched instances of the task. -All configuration file paths used by tasks can be found in the task descriptors of the workflow configuration repository in use. For more information on workflow configuration repositories, see [the `coconut repository` reference](https://github.com/AliceO2Group/Control/blob/doc/coconut/doc/coconut_repository.md). The default workflow configuration repository which comes pre-loaded with AliECS is accessible at [AliceO2Group/ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) (all task descriptor files are found in the `tasks` directory). +All configuration file paths used by tasks can be found in the task descriptors of the workflow configuration repository in use. For more information on workflow configuration repositories, see [the `coconut repository` reference](/coconut/doc/coconut_repository.md). The default workflow configuration repository which comes pre-loaded with AliECS is accessible at [AliceO2Group/ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) (all task descriptor files are found in the `tasks` directory). * **modify an existing workflow or task?** -You are free to keep as many workflow configuration repositories as you wish in your AliECS instance. For more information on workflow configuration repositories, see [the `coconut repository` reference](https://github.com/AliceO2Group/Control/blob/doc/coconut/doc/coconut_repository.md). +You are free to keep as many workflow configuration repositories as you wish in your AliECS instance. For more information on workflow configuration repositories, see [the `coconut repository` reference](/coconut/doc/coconut_repository.md). Changes to a configuration repository are immediately available after running `coconut repo refresh`. There is no support in the AliECS GUI at this time. diff --git a/occ/README.md b/occ/README.md index 330a370ec..6afa0dcb1 100644 --- a/occ/README.md +++ b/occ/README.md @@ -55,4 +55,4 @@ See [`peanut` Overview](peanut/README.md). ## OCC API debugging with `grpcc` -See [OCC API debugging with `grpcc`](../docs/using_grpcc_occ.md). \ No newline at end of file +See [OCC API debugging with `grpcc`](/docs/using_grpcc_occ.md). \ No newline at end of file diff --git a/occ/occlib/examples/dummy-process/README.md b/occ/occlib/examples/dummy-process/README.md index 905a427d1..516bcf2e3 100644 --- a/occ/occlib/examples/dummy-process/README.md +++ b/occ/occlib/examples/dummy-process/README.md @@ -2,7 +2,7 @@ This example is built from the top-level CMakeLists.txt when `BUILD_EXAMPLES` is true. -For instructions on running it, see [Run example](../../../README.md#run-example). +For instructions on running it, see [Run example](/occ/README.md#run-example). ## Standalone build diff --git a/occ/peanut/README.md b/occ/peanut/README.md index b6d488e3f..61f72815b 100644 --- a/occ/peanut/README.md +++ b/occ/peanut/README.md @@ -1,4 +1,4 @@ -# `peanut` +# Process control and execution utility overview `peanut` is the **p**rocess **e**xecution **a**nd co**n**trol **ut**ility for OCClib-based O² processes. Its purpose is to be a debugging and development aid for non-FairMQ O² devices, where FairMQ's interactive From 897a0af209f279269969691297b84e8feaa61ed1 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 16 May 2025 14:34:39 +0200 Subject: [PATCH 2155/2352] [doc] formatting fixes for mkdocs --- README.md | 1 + apricot/README.md | 1 + coconut/README.md | 1 + coconut/doc/coconut_environment_create.md | 1 + coconut/doc/coconut_repository.md | 1 + coconut/doc/coconut_repository_add.md | 1 + coconut/doc/coconut_role_query.md | 1 + coconut/doc/coconut_template_list.md | 3 ++- core/integration/README.md | 1 + docs/handbook/configuration.md | 5 +++++ docs/handbook/{index.md => introduction.md} | 0 docs/handbook/operation_order.md | 1 + docs/kafka.md | 7 +++++-- 13 files changed, 21 insertions(+), 3 deletions(-) rename docs/handbook/{index.md => introduction.md} (100%) diff --git a/README.md b/README.md index 17d77d234..79d3ca6f3 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,7 @@ There are two ways of interacting with AliECS: ### I want my application to send requests to AliECS :scroll: See the API docs of AliECS components: + - [core gRPC server](/docs/apidocs_aliecs.md) - [apricot gRPC server](/docs/apidocs_apricot.md) - [apricot HTTP server](/apricot/docs/apricot_http_service.md) diff --git a/apricot/README.md b/apricot/README.md index c32dce703..f3a63b6e5 100644 --- a/apricot/README.md +++ b/apricot/README.md @@ -4,6 +4,7 @@ It adds templating, load balancing and caching on top of the configuration store. See also: + * [apricot HTTP service](docs/apricot_http_service.md) - make essential cluster information available via a web server * Protofile: [apricot.proto](protos/apricot.proto) * [Command reference](docs/apricot.md) diff --git a/coconut/README.md b/coconut/README.md index c6cb97a68..086de07f0 100644 --- a/coconut/README.md +++ b/coconut/README.md @@ -98,6 +98,7 @@ A valid workflow template (sometimes called simply "workflow" for brevity) must Workflows and tasks are managed with a git based configuration system, so the workflow template may be provided simply by name or with repository and branch/tag/hash constraints. Examples: + * `coconut env create -w myworkflow` - loads workflow `myworkflow` from default configuration repository at HEAD of master branch * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow` - loads a workflow from a specific git repository, HEAD of master branch * `coconut env create -w myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` diff --git a/coconut/doc/coconut_environment_create.md b/coconut/doc/coconut_environment_create.md index ce39b7349..62ec30471 100644 --- a/coconut/doc/coconut_environment_create.md +++ b/coconut/doc/coconut_environment_create.md @@ -13,6 +13,7 @@ A valid workflow template (sometimes called simply "workflow" for brevity) must Workflows and tasks are managed with a git based configuration system, so the workflow template may be provided simply by name or with repository and branch/tag/hash constraints. Examples: + * `coconut env create -w myworkflow` - loads workflow `myworkflow` from default configuration repository at HEAD of master branch * `coconut env create -w github.com/AliceO2Group/MyConfRepo/myworkflow` - loads a workflow from a specific git repository, HEAD of master branch * `coconut env create -w myworkflow@rev` - loads a workflow from default repository, on branch, tag or revision `rev` diff --git a/coconut/doc/coconut_repository.md b/coconut/doc/coconut_repository.md index 32156d56d..7ba96cc14 100644 --- a/coconut/doc/coconut_repository.md +++ b/coconut/doc/coconut_repository.md @@ -9,6 +9,7 @@ The repository command performs operations on the repositories used for task and A valid workflow configuration repository must contain the directories `tasks` and `workflows` in its `master` branch. When referencing a repository, the clone method should never be prepended. Supported repo backends and their expected format are: + - https: [hostname]/[repo_path] - ssh: [hostname]:[repo_path] - local [repo_path] (local repo entries are ephemeral and will not survive a core restart) diff --git a/coconut/doc/coconut_repository_add.md b/coconut/doc/coconut_repository_add.md index 90db22e45..7b24c4f80 100644 --- a/coconut/doc/coconut_repository_add.md +++ b/coconut/doc/coconut_repository_add.md @@ -16,6 +16,7 @@ the ensuing list is followed until a valid revision has been identified: Exhaustion of the aforementioned list results in a repo add failure. `coconut repo add` can be called with + 1) a repository identifier 2) a repository identifier coupled with the `--default-revision` flag (see examples below) diff --git a/coconut/doc/coconut_role_query.md b/coconut/doc/coconut_role_query.md index 6d5626791..ee3759272 100644 --- a/coconut/doc/coconut_role_query.md +++ b/coconut/doc/coconut_role_query.md @@ -17,6 +17,7 @@ walk through the role tree of the given environment, starting from the root role per https://github.com/gobwas/glob syntax. Examples: + * `coconut role query 2rE9AV3m1HL readout-dataflow` - queries the role `readout-dataflow` in environment `2rE9AV3m1HL`, prints the full tree, along with the variables defined in the root role * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102` - queries the role `readout-dataflow.host-aido2-bld4-lab102`, prints the subtree of that role, along with the variables defined in it * `coconut role query 2rE9AV3m1HL readout-dataflow.host-aido2-bld4-lab102.data-distribution.stfs` - queries the role at the given path, it is a task role so there is no subtree, prints the variables defined in that role diff --git a/coconut/doc/coconut_template_list.md b/coconut/doc/coconut_template_list.md index 47853a119..7d2fdda29 100644 --- a/coconut/doc/coconut_template_list.md +++ b/coconut/doc/coconut_template_list.md @@ -7,7 +7,8 @@ list available workflow templates The template list command shows a list of available workflow templates. These workflow templates can then be loaded to create an environment. -`coconut templ list` can be called with +`coconut templ list` can be called with + 1) a combination of the `--repo` , `--revision` , `--all-branches` , `--all-tags` , `--all-workflows` flags, or with 2) an argument in the form of [repo-pattern]@[revision-pattern], where the patterns are globbing. diff --git a/core/integration/README.md b/core/integration/README.md index 3095650cd..369be93bb 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -9,6 +9,7 @@ All plugins should implement the [`Plugin`](/core/integration/plugin.go) interfa See the existing plugins for examples. In order to have the plugin loaded by the AliECS, one has to: + - add `RegisterPlugin` to the `init()` function in [AliECS core main source](https://github.com/AliceO2Group/Control/blob/master/cmd/o2-aliecs-core/main.go) - add plugin name in the `integrationPlugins` list and set the endpoint in the AliECS configuration file (typically at `/o2/components/aliecs/ANY/any/settings` in the configuration store) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index f0953e17a..a6da1f082 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -12,6 +12,7 @@ while still being powerful enough to express complex workflows. To instantiate a data taking activity, or environment, two kinds of files are needed: + * workflow templates * task templates @@ -196,6 +197,7 @@ for examples of call roles that reference a variety of integration plugins. #### Workflow hook call structure The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. + * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). * `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. For possible values, see [State machine triggers](/docs/handbook/operation_order.md#state-machine-triggers) * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. @@ -410,10 +412,12 @@ Variables whose availability to tasks is handled in some way by AliECS include * variables delivered to tasks explicitly via task templates. The latter can be + * sourced from Apricot with a query from the task template iself (e.g. `config.Get`), or * sourced from the variables available to the current AliECS environment, as defined in the workflow template (e.g. readout-dataflow.yaml) Depending on the specification in the task template (`command.env`, `command.arguments` or `properties`), the push to the given task can happen + * as system environment variables on task startup, * as command line parameters on task startup, or * as (FairMQ) key-values during `CONFIGURE`. @@ -441,6 +445,7 @@ In addition to the above, which varies depending on the configuration of the env * `pdp_override_run_start_time` The following values are pushed by AliECS during `STOP_ACTIVITY`: + * `run_end_time_ms` FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` and `STOP` transitions via `SetProperty` calls. diff --git a/docs/handbook/index.md b/docs/handbook/introduction.md similarity index 100% rename from docs/handbook/index.md rename to docs/handbook/introduction.md diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index de36c9f59..f27172f11 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -8,6 +8,7 @@ Also, please report to the ECS developers any inaccuracies. The underlying state machine library allows us to add callbacks upon entering and leaving states as well as before and after events (transitions). This is the order of callback execution upon a state transition: + 1. `before_` - called before event named `` 2. `before_event` - called before all events 3. `leave_` - called before leaving `` diff --git a/docs/kafka.md b/docs/kafka.md index 0a5ab2813..292900813 100644 --- a/docs/kafka.md +++ b/docs/kafka.md @@ -6,7 +6,8 @@ As of 2024 the AliECS core integrates Kafka producer functionality independent o ### Making sure that AliECS sends messages -To enable the plugin, one should make sure that the following points are fullfiled. +To enable the plugin, one should make sure that the following points are fulfilled. + * The consul instance includes coordinates to the list of kafka brokers. Navigate to `o2/components/aliecs/ANY/any/settings` and make sure the following key value pairs are there: ``` @@ -57,7 +58,8 @@ The messages are encoded with protobuf. ### Making sure that AliECS sends messages -To enable the plugin, one should make sure that the following points are fullfiled. +To enable the plugin, one should make sure that the following points are fulfilled. + * The consul instance includes coordinates to your kafka broker and enables the plugin. Navigate to `o2/components/aliecs/ANY/any/settings` and make sure the following key value pairs are there: ``` @@ -84,6 +86,7 @@ Messages are encoded with protobuf. Please use [this](/core/integration/kafka/pr ### Getting Start of Run and End of Run notifications To get SOR and EOR notifications, please subscribe to the two corresponding topics: + * `aliecs.env_state.RUNNING` for Start of Run * `aliecs.env_leave_state.RUNNING` for End of Run From c198a6b2b4246fc497fe224b9930e4d3509cecdd Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 19 May 2025 14:00:32 +0200 Subject: [PATCH 2156/2352] [doc] reorganization and link fixes for mkdocs --- core/integration/README.md | 2 +- docs/CONTRIBUTING.md | 16 +++++- docs/building.md | 2 +- docs/development.md | 2 +- docs/handbook/configuration.md | 2 +- docs/handbook/operation_order.md | 2 +- docs/metrics.md | 12 ++--- hacking/COG.md | 4 +- mkdocs-dev.yml | 12 +++++ mkdocs.yml | 54 ++++++++++----------- occ/README.md | 8 +-- occ/occlib/examples/dummy-process/README.md | 4 +- 12 files changed, 72 insertions(+), 48 deletions(-) create mode 100644 mkdocs-dev.yml diff --git a/core/integration/README.md b/core/integration/README.md index 369be93bb..d86622233 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -5,7 +5,7 @@ A plugin can register a set of callback which can be invoked upon defined enviro ## Plugin system overview -All plugins should implement the [`Plugin`](/core/integration/plugin.go) interface. +All plugins should implement the [`Plugin`](https://github.com/AliceO2Group/Control/blob/master/core/integration/plugin.go) interface. See the existing plugins for examples. In order to have the plugin loaded by the AliECS, one has to: diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 0bd697dcb..54611fd45 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -46,4 +46,18 @@ Gomega/Ginkgo tests are preferred, but other style of tests are also welcome. - Add documentation for new features. -- Your contribution will be reviewed by the project maintainers once the PR is marked as ready for review. \ No newline at end of file +- Your contribution will be reviewed by the project maintainers once the PR is marked as ready for review. + +## Documentation guidelines + +The markdown documentation is aimed to be browsed on GitHub, but it also on the aggregated [FLP documentation](https://alice-flp.docs.cern.ch) based on [MkDocs](https://www.mkdocs.org/). +Consequently, any changes in the documentation structure should be reflected in the Table of Contents in the main README.md, as well as `mkdocs.yml` and `mkdocs.yml`. + +The AliECS MkDocs documentation is split into two aforementioned files to follow the split between "Products" and "Developers" tabs in the FLP documentation. +The `mkdocs-dev.yml` uses a symlink `aliecs-dev` to `aliecs` directory to avoid complaints about duplicated site names. + +Because of the dual target of the documentation, the points below are important to keep in mind: + +- Absolute paths in links to other files do not always work, they should be avoided. +- When referencing source files in the repository, use full URIs to GitHub. +- In MkDocs layouts, one cannot reference specific sections within markdown files. Only links to entire markdown files are possible. \ No newline at end of file diff --git a/docs/building.md b/docs/building.md index 624898807..0a4243ec9 100644 --- a/docs/building.md +++ b/docs/building.md @@ -84,6 +84,6 @@ You should find several executables including `o2control-core`, `o2control-execu For subsequent builds (after the first one), plain `make` (instead of `make all`) is sufficient. See the [Makefile reference](makefile_reference.md) for more information. -If you wish to also build the process control library and/or plugin, see [the OCC readme](/occ/README.md). +If you wish to also build the process control library and/or plugin, see [the OCC readme](../occ/README.md). This build of AliECS can be run locally and connected to an existing O²/FLP Suite cluster by passing a `--mesosUrl` parameter. If you do this, remember to `systemctl stop o2-aliecs-core` on the head node, in order to stop the core that came with the O²/FLP Suite and use your own. diff --git a/docs/development.md b/docs/development.md index 0c94e2fca..d0373f09f 100644 --- a/docs/development.md +++ b/docs/development.md @@ -4,7 +4,7 @@ Generated API documentation is available on [pkg.go.dev](https:///pkg.go.dev/git The release log is managed via [GitHub](https://github.com/AliceO2Group/Control/releases/). -Bugs go to [JIRA](https://alice.its.cern.ch/jira/browse/OCTRL). +Bugs go to [JIRA](https://its.cern.ch/jira/projects/OCTRL/issues). ## Release Procedure diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index a6da1f082..9f9376529 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -199,7 +199,7 @@ for examples of call roles that reference a variety of integration plugins. The state machine callback moments are exposed to the AliECS workflow template interface and can be used as triggers or synchronization points for integration plugin function calls. The `call` block can be used for this purpose, with similar syntax to the `task` block used for controllable tasks. Its fields are as follows. * `func` - mandatory, it parses as an [`antonmedv/expr`](https://github.com/antonmedv/expr) expression that corresponds to a call to a function that belongs to an integration plugin object (e.g. `bookkeeping.StartOfRun()`, `dcs.EndOfRun()`, etc.). -* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. For possible values, see [State machine triggers](/docs/handbook/operation_order.md#state-machine-triggers) +* `trigger` - mandatory, the expression at `func` will be executed once the state machine reaches this moment. For possible values, see [State machine triggers](operation_order.md#state-machine-triggers) * `await` - optional, if absent it defaults to the same as `trigger`, the expression at `func` needs to finish by this moment, and the state machine will block until `func` completes. * `timeout` - optional, Go `time.Duration` expression, defaults to `30s`, the maximum time that `func` should take. The value is provided to the plugin via `varStack["__call_timeout"]` and the plugin should implement a timeout mechanism. The ECS will not abort the call upon reaching the timeout value! * `critical` - optional, it defaults to `true`, if `true` then a failure or timeout for `func` will send the environment state machine to `ERROR`. diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index f27172f11..50dac7147 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -1,7 +1,7 @@ # Environment operation order This chapter attempts to document the order of important operations done during environment transitions. -Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [core/environment/environment.go](https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. +Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [environment.go][https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. Also, please report to the ECS developers any inaccuracies. ## State machine triggers diff --git a/docs/metrics.md b/docs/metrics.md index a925513f3..799b88a64 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -59,7 +59,7 @@ ECS and aliecs.run are values. 6) space - divides fields and timestamp 7) timestamp - (optional) int64 value of unix timestamp in ns -In order to provide support for this format we introduced Metric structure in [common/monitoring/metric.go](../common/monitoring/metric.go). +In order to provide support for this format we introduced Metric structure in [common/monitoring/metric.go](https://github.com/AliceO2Group/Control/blob/master/common/monitoring/metric.go). Following code shows how to create a Metric with `measurement` as measurement name, one tag `tag1=val1` and field `field1=42u`: @@ -70,7 +70,7 @@ m.SetFieldUInt64("field1", 42) ``` However we also need to be able to store metrics, so these can be scraped correctly. -This mechanism is implemented in [common/monitoring/monitoring.go](../common/monitoring/monitoring.go). +This mechanism is implemented in [common/monitoring/monitoring.go](https://github.com/AliceO2Group/Control/blob/master/common/monitoring/monitoring.go). Metrics endpoint is run by calling `Run(port, endpointName)`. As this method is blocking it is advised to call it from `goroutine`. After this method is called we can than send metrics via methods `Send` and `SendHistogrammable`. If you want to send simple metrics @@ -92,7 +92,7 @@ Example for this use-case is duration of some function, eg. measure sending batch of messages. If we want the best coverage of metrics possible we can combine both of these to measure amount of messages send per batch and also measurement duration of the send. For example in code you can take a look actual -actual code in [writer.go](../common/event/writer.go) where we are sending multiple +actual code in [writer.go](https://github.com/AliceO2Group/Control/blob/master/common/event/writer.go) where we are sending multiple fields per metric and demonstrate full potential of these metrics. Previous code example will result in following metrics to be reported: @@ -203,7 +203,7 @@ if different points, but creating statistical report as mentioned in previous pa ### Event loop In order to send metrics from unlimited amount of goroutines, we need to have -robust and thread-safe mechanism. It is implemented in [common/monitoring/monitoring.go](../common/monitoring/monitoring.go) +robust and thread-safe mechanism. It is implemented in [common/monitoring/monitoring.go](https://github.com/AliceO2Group/Control/blob/master/common/monitoring/monitoring.go) as event loop (`eventLoop`) that reads data from two buffered channels (`metricsChannel` and `metricsHistosChannel`) with one goroutine. Apart from reading messages from these two channels event loop also handles scraping requests from `http.Server` endpoint. As the http endpoint is called by a @@ -219,8 +219,8 @@ which are consumed by event loop. In order to correctly implement behaviour described in the part about Aggregation we use the same implementation in two container aggregating objects `MetricsAggregate`, `MetricsReservoirSampling` implemented in files -[common/monitoring/metricsaggregate.go](../common/monitoring/metricsaggregate.go) -and [metricsreservoirsampling.go](../common/monitoring/metricsreservoirsampling.go) +[common/monitoring/metricsaggregate.go](https://github.com/AliceO2Group/Control/blob/master/common/monitoring/metricsaggregate.go) +and [metricsreservoirsampling.go](https://github.com/AliceO2Group/Control/blob/master/common/monitoring/metricsreservoirsampling.go) in the same directory. The implementation is done as different buckets in map with distinct keys (`metricsBuckets`). These keys need to be unique according to the timestamp and tags. We use struct `key` composed diff --git a/hacking/COG.md b/hacking/COG.md index 1733f3cb8..21ca826e8 100644 --- a/hacking/COG.md +++ b/hacking/COG.md @@ -44,11 +44,11 @@ In production, AliECS will manage and push all configuration to active tasks, bu Every task still has their own configuration file, with paths such as `/etc/flp.d/qc/*.json` for QualityControl and `/home/flp/readout.cfg` for Readout. These paths can be edited by the user, and any changes affect all newly launched instances of the task. -All configuration file paths used by tasks can be found in the task descriptors of the workflow configuration repository in use. For more information on workflow configuration repositories, see [the `coconut repository` reference](/coconut/doc/coconut_repository.md). The default workflow configuration repository which comes pre-loaded with AliECS is accessible at [AliceO2Group/ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) (all task descriptor files are found in the `tasks` directory). +All configuration file paths used by tasks can be found in the task descriptors of the workflow configuration repository in use. For more information on workflow configuration repositories, see [the `coconut repository` reference](../coconut/doc/coconut_repository.md). The default workflow configuration repository which comes pre-loaded with AliECS is accessible at [AliceO2Group/ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) (all task descriptor files are found in the `tasks` directory). * **modify an existing workflow or task?** -You are free to keep as many workflow configuration repositories as you wish in your AliECS instance. For more information on workflow configuration repositories, see [the `coconut repository` reference](/coconut/doc/coconut_repository.md). +You are free to keep as many workflow configuration repositories as you wish in your AliECS instance. For more information on workflow configuration repositories, see [the `coconut repository` reference](../coconut/doc/coconut_repository.md). Changes to a configuration repository are immediately available after running `coconut repo refresh`. There is no support in the AliECS GUI at this time. diff --git a/mkdocs-dev.yml b/mkdocs-dev.yml new file mode 100644 index 000000000..6f5db4aeb --- /dev/null +++ b/mkdocs-dev.yml @@ -0,0 +1,12 @@ +site_name: aliecs-dev + +nav: + - 'Contributing': '/docs/CONTRIBUTING.md' + - 'Development': '/docs/development.md' + - 'Package pkg.go.dev': 'https://pkg.go.dev/github.com/AliceO2Group/Control' + - 'Building': '/docs/building.md' + - 'Makefile reference': '/docs/makefile_reference.md' + - 'Component Configuration': '/docs/handbook/appconfiguration.md' + - 'Running': 'docs/running.md' + - 'Metrics': '/docs/metrics.md' + - 'OCC API debugging': '/docs/using_grpcc_occ.md' diff --git a/mkdocs.yml b/mkdocs.yml index edcf58f51..35ae83ae8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -2,31 +2,29 @@ site_name: aliecs nav: - 'Handbook': - - Introduction: handbook/index.md - - Overview: handbook/overview.md - - Basic Concepts: handbook/concepts.md - - Environment Operation Order: handbook/operation_order.md - - Configuration: - - Workflow Configuration: handbook/configuration.md - - Apricot Usage: './apricot/docs/apricot.md' - - Apricot HTTP API: './apricot/docs/apricot_http_service.md' - - Interfaces: - - AliECS gRPC API: apidocs_aliecs.md - - Apricot gRPC API: apidocs_apricot.md - - OCC gRPC API (Protobuf based): apidocs_occ.md - - Kafka: kafka.md - - Workflow Variables: '../controlworkflows/README.md' - - 'Command Reference': - - coconut: - - Overview: './coconut/README.md' - - coconut: './coconut/doc/coconut.md' - - coconut about: './coconut/doc/coconut_about.md' - - coconut configuration: './coconut/doc/coconut_configuration.md' - - coconut environment: './coconut/doc/coconut_environment.md' - - coconut info: './coconut/doc/coconut_info.md' - - coconut repository: './coconut/doc/coconut_repository.md' - - coconut role: './coconut/doc/coconut_role.md' - - coconut task: './coconut/doc/coconut_task.md' - - coconut template: './coconut/doc/coconut_template.md' - - peanut: './occ/peanut/README.md' - - 'FAQ': faq.md + - 'Introduction': 'docs/handbook/introduction.md' + - 'Basic Concepts': 'docs/handbook/concepts.md' + - 'Design Overview': 'docs/handbook/overview.md' + - 'Workflow and Task Config.': 'docs/handbook/configuration.md' + - 'Environment Operation Order': 'docs/handbook/operation_order.md' + - 'Workflow Variables': '../controlworkflows' + - 'Component reference': + - 'AliECS GUI': 'hacking/COG.md' + - 'AliECS core': + - 'Integrated Services': 'core/integration/README.md' + - 'Protocol': 'docs/apidocs_aliecs.md' + - 'coconut': + - 'Overview': 'coconut/README.md' + - 'Command Ref.': 'coconut/doc/coconut.md' + - 'apricot': + - 'Overview': 'apricot/README.md' + - 'HTTP Service': 'apricot/docs/apricot_http_service.md' + - 'Protocol': 'docs/apidocs_apricot.md' + - 'Command Ref.': 'apricot/docs/apricot.md' + - 'occ': + - 'Overview': 'occ/README.md' + - 'Example': 'occ/occlib/examples/dummy-process/README.md' + - 'Protocol': 'docs/apidocs_occ.md' + - 'peanut': + - 'Overview': 'occ/peanut/README.md' + - 'Event Service': 'docs/kafka.md' diff --git a/occ/README.md b/occ/README.md index 6afa0dcb1..8e173441b 100644 --- a/occ/README.md +++ b/occ/README.md @@ -9,9 +9,9 @@ For stateful tasks that do not use FairMQ, the OCC interface is implemented by t ## Developer quick start instructions for OCClib 1. Build & install the OCC library either manually or via aliBuild (`Control-OCCPlugin`); -2. check out [the dummy process example](occlib/examples/dummy-process) and [its entry point](occlib/examples/dummy-process/main.cxx) and to see how to instantiate OCC; -3. implement interface at [`occlib/RuntimeControlledObject.h`](occlib/RuntimeControlledObject.h), -4. link your non-FairMQ O² process against the target `AliceO2::Occ` as described in [the dummy process README](occlib/examples/dummy-process/README.md#standalone-build). +2. check out [the dummy process example](https://github.com/AliceO2Group/Control/blob/master/occ/occlib/examples/dummy-process) and [its entry point](https://github.com/AliceO2Group/Control/blob/master/occ/occlib/examples/dummy-process/main.cxx) and to see how to instantiate OCC; +3. implement interface at [`occlib/RuntimeControlledObject.h`](https://github.com/AliceO2Group/Control/blob/master/occ/occlib/RuntimeControlledObject.h), +4. link your non-FairMQ O² process against the target `AliceO2::Occ` as described in [the dummy process README](https://github.com/AliceO2Group/Control/blob/master/occ/occlib/examples/dummy-process/README.md#standalone-build). ## Manual build instructions Starting from the `occ` directory. @@ -55,4 +55,4 @@ See [`peanut` Overview](peanut/README.md). ## OCC API debugging with `grpcc` -See [OCC API debugging with `grpcc`](/docs/using_grpcc_occ.md). \ No newline at end of file +See [OCC API debugging with `grpcc`](../docs/using_grpcc_occ.md). \ No newline at end of file diff --git a/occ/occlib/examples/dummy-process/README.md b/occ/occlib/examples/dummy-process/README.md index 516bcf2e3..9324c7915 100644 --- a/occ/occlib/examples/dummy-process/README.md +++ b/occ/occlib/examples/dummy-process/README.md @@ -2,11 +2,11 @@ This example is built from the top-level CMakeLists.txt when `BUILD_EXAMPLES` is true. -For instructions on running it, see [Run example](/occ/README.md#run-example). +For instructions on running it, see [Run example](../../../README.md#run-example). ## Standalone build -For guidelines on building the example as a standalone project, see [CMakeLists.txt.example](CMakeLists.txt.example). +For guidelines on building the example as a standalone project, see [CMakeLists.txt.example](https://github.com/AliceO2Group/Control/blob/master/occ/occlib/examples/dummy-process/CMakeLists.txt.example). Dependencies in aliBuild: From 06322a5a0e17bf7d3dc585e209dd53eb9d828aab Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 19 May 2025 14:35:21 +0200 Subject: [PATCH 2157/2352] [doc] linkspector should check only changed documentation lines Unfortunately this change will prevent us from discovering broken links in files which have a reference to the affected ones. However, checking too many links causes sometimes "Too Many Requests" error, so we would be getting some false positives. --- .github/workflows/linkspector.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/linkspector.yml b/.github/workflows/linkspector.yml index 20999edf5..75d766990 100644 --- a/.github/workflows/linkspector.yml +++ b/.github/workflows/linkspector.yml @@ -12,4 +12,4 @@ jobs: github_token: ${{ secrets.github_token }} reporter: github-pr-check fail_level: any - filter_mode: nofilter + filter_mode: added From 0b5e60d8eab67a18fc2d57b066c70f65273006eb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 27 May 2025 15:28:07 +0200 Subject: [PATCH 2158/2352] [doc] document ECS2DCS2ECS mock server usage OCTRL-1026 --- README.md | 1 + core/integration/README.md | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/README.md b/README.md index 79d3ca6f3..2d2129404 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ There are two ways of interacting with AliECS: * [DCS PrepareForRun behaviour](/core/integration/README.md#dcs-prepareforrun-behaviour) * [DCS StartOfRun behaviour](/core/integration/README.md#dcs-startofrun-behaviour) * [DCS EndOfRun behaviour](/core/integration/README.md#dcs-endofrun-behaviour) + * [ECS2DCS2ECS mock server](/core/integration/README.md#ecs2dcs2ecs-mock-server) * [DD Scheduler](/core/integration/README.md#dd-scheduler) * [Kafka (legacy)](/core/integration/README.md#kafka-legacy) * [ODC](/core/integration/README.md#odc) diff --git a/core/integration/README.md b/core/integration/README.md index d86622233..d76f2bebf 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -138,6 +138,19 @@ The environment will then declare a **failure**, the `STOP_ACTIVITY` transition will be blocked and the environment will move to `ERROR`. +### ECS2DCS2ECS mock server + +ECS2DCS2ECS is a simple server that mimics the DCS service and is developed by the DCS team. +In particular, it sends heartbeats, reports detectors as PFR or SOR available and replies with requested state sequences. + +The state sequences should be added as extra arguments to the DCS calls with key `"STATE_SEQUENCE"`, while the value is a comma-separated list of `MILLIS_DELAY:DETECTOR_STATE` values. + +From the AliECS user point of view, state sequences can be defined as the following user-vars (Advanced Configuration panel in COG), which are then passed to the corresponding PFR/SOR/EOR calls for all detectors: + +- `dcs_pfr_state_sequence` +- `dcs_sor_state_sequence` +- `dcs_eor_state_sequence` + ## DD Scheduler DD scheduler plugin informs the Data Distribution software about the pool of FLPs taking part in data taking. From 8ab57daf1cda2bf9feb696814f3dcbc611ad5b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 14 May 2025 17:28:33 +0200 Subject: [PATCH 2159/2352] [core] deployment retry properly retries only failed tasks --- core/task/manager.go | 53 ++- core/task/scheduler.go | 736 ++++++++++++++++++------------------ core/task/schedulerstate.go | 2 +- 3 files changed, 399 insertions(+), 392 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index de705fe2e..f9727ec72 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -28,12 +28,13 @@ import ( "context" "errors" "fmt" - "github.com/AliceO2Group/Control/common/utils/safeacks" "os" "strings" "sync" "time" + "github.com/AliceO2Group/Control/common/utils/safeacks" + "github.com/AliceO2Group/Control/apricot" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/gera" @@ -494,7 +495,12 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e undeployableNonCriticalDescriptors := make(Descriptors, 0) undeployableCriticalDescriptors := make(Descriptors, 0) - deployedTasks := make(DeploymentMap) + // we are retrying deployment multiple times in case of failure and we don't want + // to rerun tasks already running + tasksToRunThisAttempt := make(Descriptors, len(tasksToRun)) + copy(tasksToRunThisAttempt, tasksToRun) + + allDeployedTasks := make(DeploymentMap) if len(tasksToRun) > 0 { // Alright, so we have some descriptors whose requirements should be met with // new Tasks we're about to deploy here. @@ -524,45 +530,49 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e undeployableNonCriticalDescriptors = make(Descriptors, 0) undeployableCriticalDescriptors = make(Descriptors, 0) - deployedTasks = make(DeploymentMap) - outcomeCh := make(chan ResourceOffersOutcome) m.tasksToDeploy <- &ResourceOffersDeploymentRequest{ - tasksToDeploy: tasksToRun, + tasksToDeploy: tasksToRunThisAttempt, envId: envId, outcomeCh: outcomeCh, } // buffered channel, does not block log.WithField("partition", envId). - Debugf("scheduler has been sent request to deploy %d tasks", len(tasksToRun)) + Debugf("scheduler has been sent request to deploy %d tasks", len(tasksToRunThisAttempt)) timeReviveOffers := time.Now() timeDeployMu := time.Now() m.reviveOffersTrg <- struct{}{} // signal scheduler to revive offers <-m.reviveOffersTrg // we only continue when it's done utils.TimeTrack(timeReviveOffers, "acquireTasks: revive offers", - log.WithField("tasksToRun", len(tasksToRun)). + log.WithField("tasksToRunThisAttempt", len(tasksToRunThisAttempt)). WithField("partition", envId)) roOutcome := <-outcomeCh // blocks until a verdict from resourceOffers comes in utils.TimeTrack(timeDeployMu, "acquireTasks: deployment critical section", - log.WithField("tasksToRun", len(tasksToRun)). + log.WithField("tasksToRunThisAttempt", len(tasksToRunThisAttempt)). WithField("partition", envId)) - deployedTasks = roOutcome.deployed + deployedThisAttempt := roOutcome.deployed undeployedDescriptors = roOutcome.undeployed undeployableDescriptors = roOutcome.undeployable - logWithId.WithField("tasks", deployedTasks). - Debugf("resourceOffers is done, %d new tasks running", len(deployedTasks)) + logWithId.WithField("tasks", deployedThisAttempt). + Debugf("resourceOffers is done, %d new tasks running", len(deployedThisAttempt)) - if len(deployedTasks) != len(tasksToRun) { + for deployedTask, deployedDescriptor := range deployedThisAttempt { + allDeployedTasks[deployedTask] = deployedDescriptor + // add deployed tasks to roster, so updates can be distributed properly + m.roster.append(deployedTask) + } + + if len(deployedThisAttempt) != len(tasksToRunThisAttempt) { // ↑ Not all roles could be deployed. If some were critical, // we cannot proceed with running this environment. Either way, // we keep the roles running since they might be useful in the future. logWithId.WithField("level", infologger.IL_Devel). - Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRun), len(deployedTasks)) + Errorf("environment deployment failure: %d tasks requested for deployment, but %d deployed", len(tasksToRunThisAttempt), len(deployedThisAttempt)) for _, desc := range undeployedDescriptors { if desc.TaskRole.GetTaskTraits().Critical == true { @@ -586,7 +596,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e if deploymentSuccess { // ↑ means all the required critical processes are now running, // and we are ready to update the envId - for taskPtr, descriptor := range deployedTasks { + for taskPtr, descriptor := range deployedThisAttempt { taskPtr.SetParent(descriptor.TaskRole) // Ensure everything is filled out properly if !taskPtr.IsLocked() { @@ -596,6 +606,9 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } break DEPLOYMENT_ATTEMPTS_LOOP } + tasksToRunThisAttempt = make(Descriptors, 0, len(undeployableDescriptors)+len(undeployedDescriptors)) + tasksToRunThisAttempt = append(tasksToRunThisAttempt, undeployedDescriptors...) + tasksToRunThisAttempt = append(tasksToRunThisAttempt, undeployableDescriptors...) log.WithField("partition", envId). WithField("level", infologger.IL_Devel). @@ -604,12 +617,14 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } } + log.Infof("Succeeded to deploy %d/%d tasks", len(allDeployedTasks), len(tasksToRun)) + { logWithIdDev := logWithId.WithField("level", infologger.IL_Devel) logDescriptors("critical task deployment impossible: ", logWithIdDev.Errorf, undeployableCriticalDescriptors) logDescriptors("critical task deployment failure: ", logWithIdDev.Errorf, undeployedCriticalDescriptors) - logDescriptors("non-critical task deployment failure: ", logWithIdDev.Warningf, undeployedNonCriticalDescriptors) + logDescriptors("non-critical task deployment impossible: ", logWithIdDev.Warningf, undeployableNonCriticalDescriptors) } @@ -624,7 +639,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e if !deploymentSuccess { var deployedTaskIds []string - for taskPtr := range deployedTasks { + for taskPtr := range allDeployedTasks { taskPtr.SetParent(nil) deployedTaskIds = append(deployedTaskIds, taskPtr.taskId) } @@ -638,12 +653,8 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } } - // Finally, we write to the roster. Point of no return! - for taskPtr := range deployedTasks { - m.roster.append(taskPtr) - } if deploymentSuccess { - for taskPtr := range deployedTasks { + for taskPtr := range allDeployedTasks { taskPtr.GetParent().SetTask(taskPtr) } for taskPtr, descriptor := range tasksAlreadyRunning { diff --git a/core/task/scheduler.go b/core/task/scheduler.go index aeea651f5..c5088cc4b 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -84,7 +84,8 @@ var schedEventsCh = make(chan scheduler.Event_Type) func runSchedulerController(ctx context.Context, state *schedulerState, - fidStore store.Singleton) error { + fidStore store.Singleton, +) error { // Set up communication from controller to state machine. go func() { for { @@ -275,7 +276,6 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { // only one entry in the list, we signal back to commandqueue // otherwise, we log and ignore. return func(ctx context.Context, e *scheduler.Event) (err error) { - mesosMessage := e.GetMessage() if mesosMessage == nil { err = errors.New("message handler got bad MESSAGE") @@ -339,7 +339,7 @@ func (state *schedulerState) incomingMessageHandler() events.HandlerFunc { return } state.taskman.internalEventCh <- ev - //state.handleDeviceEvent(ev) + // state.handleDeviceEvent(ev) } else { log.WithFields(logrus.Fields{ "type": incomingEvent.Type.String(), @@ -440,7 +440,7 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han timeResourceOffersCall := time.Now() var ( offers = e.GetOffers().GetOffers() - callOption = calls.RefuseSeconds(time.Second) //calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) + callOption = calls.RefuseSeconds(time.Second) // calls.RefuseSecondsWithJitter(state.random, state.config.maxRefuseSeconds) tasksLaunchedThisCycle = 0 offersDeclined = 0 ) @@ -449,16 +449,18 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han var ( prettyOffers []string offerIds []string + hostnames []string ) for i := range offers { prettyOffer, _ := json.MarshalIndent(offers[i], "", "\t") prettyOffers = append(prettyOffers, string(prettyOffer)) offerIds = append(offerIds, offers[i].ID.Value) + hostnames = append(hostnames, offers[i].Hostname) } log.WithPrefix("scheduler").WithFields(logrus.Fields{ - "offerIds": strings.Join(offerIds, ", "), - //"offers": strings.Join(prettyOffers, "\n"), - "offers": len(offerIds), + "offerIds": strings.Join(offerIds, ", "), + "hostnames": strings.Join(hostnames, ", "), + "offersCount": len(offerIds), }). Trace("received offers") } @@ -589,6 +591,10 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han } offerDescriptorsPrematchToDeploy[offer.ID] = append(offerDescriptorsPrematchToDeploy[offer.ID], descriptor) descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + log.WithField("partition", envId.String()). + WithField("level", infologger.IL_Devel). + WithField("descriptor", descriptor.TaskClassName). + WithField("hostname", offer.Hostname).Trace("descriptor matched") } else { // We have a constraint on the machine_id, but we didn't find any offer that matches it. // We can bail out early. @@ -611,418 +617,410 @@ func (state *schedulerState) resourceOffers(fidStore store.Singleton) events.Han // concurrent stuff starts to happen here. descriptorsMu := sync.Mutex{} - if len(descriptorsUndeployable) == 0 { // we still have hope to deploy something - - // Parallelized offer processing, exhaustive search for each offer - var offerWaitGroup sync.WaitGroup - offerWaitGroup.Add(len(offers)) - - for offerIndex := range offers { - go func(offerIndex int) { - defer offerWaitGroup.Done() - - offer := offers[offerIndex] - - timeSingleOffer := time.Now() - var ( - remainingResourcesInOffer = mesos.Resources(offer.Resources) - taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) - tasksDeployedForCurrentOffer = make(DeploymentMap) - targetExecutorId = mesos.ExecutorID{} - ) - - // If there are no executors provided by the offer, - // we start a new one by generating a new ID - if len(offer.ExecutorIDs) == 0 { - targetExecutorId.Value = uid.New().String() + // Parallelized offer processing, exhaustive search for each offer + var offerWaitGroup sync.WaitGroup + offerWaitGroup.Add(len(offers)) + + for offerIndex := range offers { + go func(offerIndex int) { + defer offerWaitGroup.Done() + + offer := offers[offerIndex] + + timeSingleOffer := time.Now() + var ( + remainingResourcesInOffer = mesos.Resources(offer.Resources) + taskInfosToLaunchForCurrentOffer = make([]mesos.TaskInfo, 0) + tasksDeployedForCurrentOffer = make(DeploymentMap) + targetExecutorId = mesos.ExecutorID{} + ) + + // If there are no executors provided by the offer, + // we start a new one by generating a new ID + if len(offer.ExecutorIDs) == 0 { + targetExecutorId.Value = uid.New().String() + log.WithField("executorId", targetExecutorId.Value). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Support). + Info("received offer without executor ID, will start new executor if accepted") + } else { + targetExecutorId.Value = offer.ExecutorIDs[0].Value + if len(offer.ExecutorIDs) == 1 { log.WithField("executorId", targetExecutorId.Value). WithField("offerHost", offer.GetHostname()). WithField("level", infologger.IL_Support). - Info("received offer without executor ID, will start new executor if accepted") - } else { - targetExecutorId.Value = offer.ExecutorIDs[0].Value - if len(offer.ExecutorIDs) == 1 { - log.WithField("executorId", targetExecutorId.Value). - WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Support). - Info("received offer with one executor ID, will use existing executor") - } else if len(offer.ExecutorIDs) > 1 { - log.WithField("executorId", targetExecutorId.Value). - WithField("executorIds", offer.ExecutorIDs). - WithField("offerHost", offer.GetHostname()). - WithField("level", infologger.IL_Support). - Warn("received offer with more than one executor ID, will use first one") - } + Info("received offer with one executor ID, will use existing executor") + } else if len(offer.ExecutorIDs) > 1 { + log.WithField("executorId", targetExecutorId.Value). + WithField("executorIds", offer.ExecutorIDs). + WithField("offerHost", offer.GetHostname()). + WithField("level", infologger.IL_Support). + Warn("received offer with more than one executor ID, will use first one") } + } - host := offer.GetHostname() - var detector string - detector, err = apricot.Instance().GetDetectorForHost(host) - if err != nil { - detector = "" - } + host := offer.GetHostname() + var detector string + detector, err = apricot.Instance().GetDetectorForHost(host) + if err != nil { + detector = "" + } - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "offerId": offer.ID.Value, - "offerHost": host, - "resources": remainingResourcesInOffer.String(), - "partition": envId.String(), - "detector": detector, - }). - Debug("processing offer") - - remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) - - // avoid the expense of computing these if we can... - if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { - for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { - if resType == mesos.SCALAR { - sum, _ := name.Sum(remainingResourcesFlattened...) - state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) - } + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "offerId": offer.ID.Value, + "offerHost": host, + "resources": remainingResourcesInOffer.String(), + "partition": envId.String(), + "detector": detector, + }). + Debug("processing offer") + + remainingResourcesFlattened := resources.Flatten(remainingResourcesInOffer) + + // avoid the expense of computing these if we can... + if viper.GetBool("summaryMetrics") && viper.GetBool("mesosResourceTypeMetrics") { + for name, resType := range resources.TypesOf(remainingResourcesFlattened...) { + if resType == mesos.SCALAR { + sum, _ := name.Sum(remainingResourcesFlattened...) + state.metricsAPI.offeredResources(sum.GetScalar().GetValue(), name.String()) } } + } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", detector). - Trace("state lock to process descriptors to deploy") - - timeDescriptorsSection := time.Now() - descriptorsMu.Lock() + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", detector). + Trace("state lock to process descriptors to deploy") - descriptorsPrematchToDeploy, prematchedDescriptorsExistForThisOffer := offerDescriptorsPrematchToDeploy[offer.ID] - if prematchedDescriptorsExistForThisOffer { - FOR_PREMATCH_DESCRIPTORS: - for i := len(descriptorsPrematchToDeploy) - 1; i >= 0; i-- { - descriptor := descriptorsPrematchToDeploy[i] + timeDescriptorsSection := time.Now() + descriptorsMu.Lock() - descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") - if !ok { - descriptorDetector = "" - } + descriptorsPrematchToDeploy, prematchedDescriptorsExistForThisOffer := offerDescriptorsPrematchToDeploy[offer.ID] + if prematchedDescriptorsExistForThisOffer { + FOR_PREMATCH_DESCRIPTORS: + for i := len(descriptorsPrematchToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsPrematchToDeploy[i] - offerAttributes := constraint.Attributes(offer.Attributes) - if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "attributes": offerAttributes.String(), - }). - Trace("descriptor constraints not satisfied by pre-matched offer attributes, descriptor undeployable") - } - - // we know this descriptor will never be satisfiable, no point in continuing - descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) - descriptorsUndeployable = append(descriptorsUndeployable, descriptor) - - break FOR_PREMATCH_DESCRIPTORS - } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - Debug("pre-matched offer attributes satisfy constraints") + descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") + if !ok { + descriptorDetector = "" + } - var wants *Wants - wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) - if err != nil { + offerAttributes := constraint.Attributes(offer.Attributes) + if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { + if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). - WithError(err). WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithFields(logrus.Fields{ - "class": descriptor.TaskClassName, - "constraints": descriptor.RoleConstraints.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), }). - Error("invalid task class: no task class or no resource demands for pre-matched descriptor, WILL NOT BE DEPLOYED") - - // we know this descriptor will never be satisfiable, no point in continuing - descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) - descriptorsUndeployable = append(descriptorsUndeployable, descriptor) - - break FOR_PREMATCH_DESCRIPTORS - } - if !Resources(remainingResourcesInOffer).Satisfy(wants) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, - }). - Warn("descriptor wants not satisfied by pre-matched offer resources") - } - - // we know this descriptor will never be satisfiable, no point in continuing - descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) - descriptorsUndeployable = append(descriptorsUndeployable, descriptor) - - break FOR_PREMATCH_DESCRIPTORS - } - - var limits *Limits - limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) - - // Point of no return, we start subtracting resources - taskPtr, mesosTaskInfo := makeTaskForMesosResources( - state, - &offer, - descriptor, - wants, - limits, - remainingResourcesInOffer, - machinesUsed, - targetExecutorId, - envId, - descriptorDetector, - offerIDsToDecline, - ) - if taskPtr == nil || mesosTaskInfo == nil { - break FOR_PREMATCH_DESCRIPTORS + Trace("descriptor constraints not satisfied by pre-matched offer attributes, descriptor undeployable") } - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "name": mesosTaskInfo.Name, - "taskId": mesosTaskInfo.TaskID.Value, - "offerId": offer.ID.Value, - "executorId": state.executor.ExecutorID.Value, - "limits": mesosTaskInfo.Limits, - }).Debug("launching task") - - taskPtr.SendEvent(&event.TaskEvent{ - Name: taskPtr.GetName(), - TaskID: mesosTaskInfo.TaskID.Value, - State: "LAUNCHED", - Hostname: taskPtr.hostname, - ClassName: taskPtr.GetClassName(), - }) - - taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) + // we know this descriptor will never be satisfiable, no point in continuing descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) - tasksDeployedForCurrentOffer[taskPtr] = descriptor + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + break FOR_PREMATCH_DESCRIPTORS } - } // end FOR_PREMATCH_DESCRIPTORS - - if len(descriptorsUndeployable) == 0 { // still hope of deploying something - - // We iterate down over the descriptors, and we remove them as we match - FOR_DESCRIPTORS: - for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { - descriptor := descriptorsStillToDeploy[i] - - descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") - if !ok { - descriptorDetector = "" - } + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + Debug("pre-matched offer attributes satisfy constraints") - offerAttributes := constraint.Attributes(offer.Attributes) - if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "constraints": descriptorConstraints[descriptor], - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "attributes": offerAttributes.String(), - }). - Trace("descriptor constraints not satisfied by offer attributes") - } - continue FOR_DESCRIPTORS // next descriptor - } + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) + if err != nil { log.WithPrefix("scheduler"). + WithError(err). WithField("partition", envId.String()). WithField("detector", descriptorDetector). - Debug("offer attributes satisfy constraints") + WithFields(logrus.Fields{ + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Error("invalid task class: no task class or no resource demands for pre-matched descriptor, WILL NOT BE DEPLOYED") + + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) - var wants *Wants - wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) - if err != nil { + break FOR_PREMATCH_DESCRIPTORS + } + if !Resources(remainingResourcesInOffer).Satisfy(wants) { + if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). - WithError(err). WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithFields(logrus.Fields{ - "class": descriptor.TaskClassName, - "constraints": descriptor.RoleConstraints.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, }). - Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") - continue FOR_DESCRIPTORS // next descriptor - } - if !Resources(remainingResourcesInOffer).Satisfy(wants) { - if viper.GetBool("veryVerbose") { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("detector", descriptorDetector). - WithFields(logrus.Fields{ - "taskClass": descriptor.TaskClassName, - "wants": *wants, - "offerId": offer.ID.Value, - "resources": remainingResourcesInOffer.String(), - "level": infologger.IL_Devel, - "offerHost": offer.Hostname, - }). - Warn("descriptor wants not satisfied by offer resources") - } - continue FOR_DESCRIPTORS // next descriptor + Warn("descriptor wants not satisfied by pre-matched offer resources") } - var limits *Limits - limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) - - // Point of no return, we start subtracting resources - taskPtr, mesosTaskInfo := makeTaskForMesosResources( - state, - &offer, - descriptor, - wants, - limits, - remainingResourcesInOffer, - machinesUsed, - targetExecutorId, - envId, - descriptorDetector, - offerIDsToDecline, - ) - if taskPtr == nil || mesosTaskInfo == nil { - continue FOR_DESCRIPTORS // next descriptor - } + // we know this descriptor will never be satisfiable, no point in continuing + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + descriptorsUndeployable = append(descriptorsUndeployable, descriptor) + + break FOR_PREMATCH_DESCRIPTORS + } + + var limits *Limits + limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) + + // Point of no return, we start subtracting resources + taskPtr, mesosTaskInfo := makeTaskForMesosResources( + state, + &offer, + descriptor, + wants, + limits, + remainingResourcesInOffer, + machinesUsed, + targetExecutorId, + envId, + descriptorDetector, + offerIDsToDecline, + ) + if taskPtr == nil || mesosTaskInfo == nil { + break FOR_PREMATCH_DESCRIPTORS + } + + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, + "taskId": mesosTaskInfo.TaskID.Value, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + "limits": mesosTaskInfo.Limits, + }).Debug("launching task") + + taskPtr.SendEvent(&event.TaskEvent{ + Name: taskPtr.GetName(), + TaskID: mesosTaskInfo.TaskID.Value, + State: "LAUNCHED", + Hostname: taskPtr.hostname, + ClassName: taskPtr.GetClassName(), + }) + + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) + descriptorsPrematchToDeploy = append(descriptorsPrematchToDeploy[:i], descriptorsPrematchToDeploy[i+1:]...) + tasksDeployedForCurrentOffer[taskPtr] = descriptor + } + } // end FOR_PREMATCH_DESCRIPTORS + + // We iterate down over the descriptors, and we remove them as we match + FOR_DESCRIPTORS: + for i := len(descriptorsStillToDeploy) - 1; i >= 0; i-- { + descriptor := descriptorsStillToDeploy[i] + + descriptorDetector, ok := descriptor.TaskRole.GetVars().Get("detector") + if !ok { + descriptorDetector = "" + } + + offerAttributes := constraint.Attributes(offer.Attributes) + if !offerAttributes.Satisfy(descriptorConstraints[descriptor]) { + if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). WithField("partition", envId.String()). WithField("detector", descriptorDetector). WithFields(logrus.Fields{ - "name": mesosTaskInfo.Name, - "taskId": mesosTaskInfo.TaskID.Value, - "offerId": offer.ID.Value, - "executorId": state.executor.ExecutorID.Value, - "limits": mesosTaskInfo.Limits, - }).Debug("launching task") - - taskPtr.SendEvent(&event.TaskEvent{ - Name: taskPtr.GetName(), - TaskID: mesosTaskInfo.TaskID.Value, - State: "LAUNCHED", - Hostname: taskPtr.hostname, - ClassName: taskPtr.GetClassName(), - }) - - taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) - descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) - tasksDeployedForCurrentOffer[taskPtr] = descriptor - - } // end FOR_DESCRIPTORS + "taskClass": descriptor.TaskClassName, + "constraints": descriptorConstraints[descriptor], + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "attributes": offerAttributes.String(), + }). + Trace("descriptor constraints not satisfied by offer attributes") + } + continue FOR_DESCRIPTORS // next descriptor } - descriptorsMu.Unlock() - - utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. - WithField("partition", envId.String()). - WithField("offerHost", host). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers))) - timeOfferAcceptance := time.Now() - log.WithPrefix("scheduler"). - WithField("offerHost", host). - WithField("detector", detector). WithField("partition", envId.String()). - Trace("state unlock") - - // build ACCEPT call to launch all of the tasks we've assembled - accept := calls.Accept( - calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), - ).With(callOption) // handles refuseSeconds etc. + WithField("detector", descriptorDetector). + Debug("offer attributes satisfy constraints") - // send ACCEPT call to mesos - err = calls.CallNoData(ctx, state.cli, accept) + var wants *Wants + wants, err = state.taskman.GetWantsForDescriptor(descriptor, envId) if err != nil { log.WithPrefix("scheduler"). WithError(err). - WithField("detector", detector). WithField("partition", envId.String()). - WithField("offerHost", host). - Error("failed to launch tasks") - // FIXME: we probably need to react to a failed ACCEPT here - } else { - if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { - tasksLaunchedThisCycle += n + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "class": descriptor.TaskClassName, + "constraints": descriptor.RoleConstraints.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Error("invalid task class: no task class or no resource demands for descriptor, WILL NOT BE DEPLOYED") + continue FOR_DESCRIPTORS // next descriptor + } + if !Resources(remainingResourcesInOffer).Satisfy(wants) { + if viper.GetBool("veryVerbose") { log.WithPrefix("scheduler"). - WithField("tasks", n). WithField("partition", envId.String()). - WithField("detector", detector). - WithField("level", infologger.IL_Support). - WithField("offerHost", offer.Hostname). - WithField("executorId", targetExecutorId.Value). - Infof("launch request sent to %s: %d tasks", offer.Hostname, n) - for _, taskInfo := range taskInfosToLaunchForCurrentOffer { - log.WithPrefix("scheduler"). - WithFields(logrus.Fields{ - "executorId": taskInfo.GetExecutor().ExecutorID.Value, - "executorName": taskInfo.GetExecutor().GetName(), - "agentId": taskInfo.GetAgentID().Value, - "taskId": taskInfo.GetTaskID().Value, - "level": infologger.IL_Devel, - }). - WithField("offerHost", offer.Hostname). - WithField("partition", envId.String()). - WithField("detector", detector). - Debug("task launch requested") - } - - tasksDeployedMutex.Lock() - // update deployment map - for k, v := range tasksDeployedForCurrentOffer { - tasksDeployed[k] = v - } - tasksDeployedMutex.Unlock() - } else { - offersDeclined++ + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "taskClass": descriptor.TaskClassName, + "wants": *wants, + "offerId": offer.ID.Value, + "resources": remainingResourcesInOffer.String(), + "level": infologger.IL_Devel, + "offerHost": offer.Hostname, + }). + Warn("descriptor wants not satisfied by offer resources") } + continue FOR_DESCRIPTORS // next descriptor } - utils.TimeTrack(timeOfferAcceptance, "resourceOffers: single offer acceptance section", log. - WithField("partition", envId.String()). - WithField("detector", detector). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers)). - WithField("offerHost", offer.Hostname)) - utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. + var limits *Limits + limits = state.taskman.GetLimitsForDescriptor(descriptor, envId) + + // Point of no return, we start subtracting resources + taskPtr, mesosTaskInfo := makeTaskForMesosResources( + state, + &offer, + descriptor, + wants, + limits, + remainingResourcesInOffer, + machinesUsed, + targetExecutorId, + envId, + descriptorDetector, + offerIDsToDecline, + ) + if taskPtr == nil || mesosTaskInfo == nil { + continue FOR_DESCRIPTORS // next descriptor + } + + log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("detector", descriptorDetector). + WithFields(logrus.Fields{ + "name": mesosTaskInfo.Name, + "taskId": mesosTaskInfo.TaskID.Value, + "offerId": offer.ID.Value, + "executorId": state.executor.ExecutorID.Value, + "limits": mesosTaskInfo.Limits, + }).Debug("launching task") + + taskPtr.SendEvent(&event.TaskEvent{ + Name: taskPtr.GetName(), + TaskID: mesosTaskInfo.TaskID.Value, + State: "LAUNCHED", + Hostname: taskPtr.hostname, + ClassName: taskPtr.GetClassName(), + }) + + taskInfosToLaunchForCurrentOffer = append(taskInfosToLaunchForCurrentOffer, *mesosTaskInfo) + descriptorsStillToDeploy = append(descriptorsStillToDeploy[:i], descriptorsStillToDeploy[i+1:]...) + tasksDeployedForCurrentOffer[taskPtr] = descriptor + + } // end FOR_DESCRIPTORS + descriptorsMu.Unlock() + + utils.TimeTrack(timeDescriptorsSection, "resourceOffers: single offer descriptors section", log. + WithField("partition", envId.String()). + WithField("offerHost", host). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers))) + timeOfferAcceptance := time.Now() + + log.WithPrefix("scheduler"). + WithField("offerHost", host). + WithField("detector", detector). + WithField("partition", envId.String()). + Trace("state unlock") + + // build ACCEPT call to launch all of the tasks we've assembled + accept := calls.Accept( + calls.OfferOperations{calls.OpLaunch(taskInfosToLaunchForCurrentOffer...)}.WithOffers(offer.ID), + ).With(callOption) // handles refuseSeconds etc. + + // send ACCEPT call to mesos + err = calls.CallNoData(ctx, state.cli, accept) + if err != nil { + log.WithPrefix("scheduler"). + WithError(err). WithField("detector", detector). - WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). - WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). - WithField("offers", len(offers)). - WithField("offerHost", offer.Hostname)) + WithField("partition", envId.String()). + WithField("offerHost", host). + Error("failed to launch tasks") + // FIXME: we probably need to react to a failed ACCEPT here + } else { + if n := len(taskInfosToLaunchForCurrentOffer); n > 0 { + tasksLaunchedThisCycle += n + log.WithPrefix("scheduler"). + WithField("tasks", n). + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("level", infologger.IL_Support). + WithField("offerHost", offer.Hostname). + WithField("executorId", targetExecutorId.Value). + Infof("launch request sent to %s: %d tasks", offer.Hostname, n) + for _, taskInfo := range taskInfosToLaunchForCurrentOffer { + log.WithPrefix("scheduler"). + WithFields(logrus.Fields{ + "executorId": taskInfo.GetExecutor().ExecutorID.Value, + "executorName": taskInfo.GetExecutor().GetName(), + "agentId": taskInfo.GetAgentID().Value, + "taskId": taskInfo.GetTaskID().Value, + "level": infologger.IL_Devel, + }). + WithField("offerHost", offer.Hostname). + WithField("partition", envId.String()). + WithField("detector", detector). + Debug("task launch requested") + } - }(offerIndex) // end for offer closure - } // end for _, offer := range offers - offerWaitGroup.Wait() + tasksDeployedMutex.Lock() + // update deployment map + for k, v := range tasksDeployedForCurrentOffer { + tasksDeployed[k] = v + } + tasksDeployedMutex.Unlock() + } else { + offersDeclined++ + } + } + utils.TimeTrack(timeOfferAcceptance, "resourceOffers: single offer acceptance section", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) - } + utils.TimeTrack(timeSingleOffer, "resourceOffers: process and accept host offer", log. + WithField("partition", envId.String()). + WithField("detector", detector). + WithField("tasksDeployed", len(tasksDeployedForCurrentOffer)). + WithField("descriptorsStillToDeploy", len(descriptorsStillToDeploy)). + WithField("offers", len(offers)). + WithField("offerHost", offer.Hostname)) + }(offerIndex) // end for offer closure + } // end for _, offer := range offers + offerWaitGroup.Wait() utils.TimeTrack(timeForOffers, "resourceOffers: pre-processing done to for_offers done (concurrent)", log. WithField("partition", envId.String()). @@ -1339,7 +1337,6 @@ func makeTaskForMesosResources( descriptorDetector string, offerIDsToDecline map[mesos.OfferID]struct{}, ) (*Task, *mesos.TaskInfo) { - bindMap := make(channel.BindMap) for _, ch := range wants.InboundChannels { if ch.Addressing == channel.IPC { @@ -1372,7 +1369,7 @@ func makeTaskForMesosResources( Attributes: offer.Attributes, Hostname: offer.Hostname, } - state.taskman.AgentCache.Update(agentForCache) //thread safe + state.taskman.AgentCache.Update(agentForCache) // thread safe machinesUsed[offer.Hostname] = struct{}{} taskPtr := state.taskman.newTaskForMesosOffer(offer, descriptor, bindMap, targetExecutorId) @@ -1570,12 +1567,11 @@ func makeTaskForMesosResources( ldLibPath, ok := agentForCache.Attributes.Get("executor_env_LD_LIBRARY_PATH") mesosTaskInfo.Executor.Command.Environment = &mesos.Environment{} if ok { - mesosTaskInfo.Executor.Command.Environment.Variables = - append(mesosTaskInfo.Executor.Command.Environment.Variables, - mesos.Environment_Variable{ - Name: "LD_LIBRARY_PATH", - Value: proto.String(ldLibPath), - }) + mesosTaskInfo.Executor.Command.Environment.Variables = append(mesosTaskInfo.Executor.Command.Environment.Variables, + mesos.Environment_Variable{ + Name: "LD_LIBRARY_PATH", + Value: proto.String(ldLibPath), + }) } return taskPtr, &mesosTaskInfo diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index e85e01ee1..86970754f 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -50,7 +50,7 @@ import ( const ( MAX_CONCURRENT_DEPLOY_REQUESTS = 100 - MAX_ATTEMPTS_PER_DEPLOY_REQUEST = 3 + MAX_ATTEMPTS_PER_DEPLOY_REQUEST = 5 SLEEP_LENGTH_BETWEEN_PER_DEPLOY_REQUESTS = 1 // in seconds ) From 4636d9e95a5fd11882fac06a3ff444d71c89bb4e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 28 May 2025 11:55:49 +0200 Subject: [PATCH 2160/2352] [build] Bump to v1.37.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 10221ab68..36c8be205 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 36 +VERSION_MINOR := 37 VERSION_PATCH := 0 From cb23159c179a9b4dab0ace01a49a085d11d44cdd Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 28 May 2025 12:12:44 +0200 Subject: [PATCH 2161/2352] [doc] A bit more doc about the DCS mock setup --- core/integration/README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/core/integration/README.md b/core/integration/README.md index d76f2bebf..2b56fd8a5 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -29,6 +29,7 @@ CCDB plugin calls PDP-provided executable which creates a General Run Parameters ## DCS DCS plugin communicates with the ALICE Detector Control System (DCS). +In particular, it communicates with a gRPC endpoint exposed by `ecs2dcsgateway` (developed by the DCS team), which then passes the requests to the DCS. ### DCS operations @@ -151,6 +152,23 @@ From the AliECS user point of view, state sequences can be defined as the follow - `dcs_sor_state_sequence` - `dcs_eor_state_sequence` +#### Testing tips + +Typical valid sequences are: + +``` +{ + "dcs_pfr_state_sequence": "1000:RUN_OK", + "dcs_sor_state_sequence": "1000:SOR_PROGRESSING,3000:RUN_OK", + "dcs_eor_state_sequence": "1000:EOR_PROGRESSING,3000:RUN_OK" +} +``` + +`PFR_AVAILABLE` and `SOR_AVAILABLE` are typically send by DCS via the heartbeat stream, so requesting them as an answer to an operation request does not reflect the behaviour of the production system. + +To trigger a `TIMEOUT` event, one should not request a `TIMEOUT` state in the sequence, but rather put a too long delay compared to the provided gRPC timeout. +Both in the production and the mock setup, `TIMEOUT` events are generated by `ecs2dcsgateway` when a detector does not respond to a request within the specified timeout. + ## DD Scheduler DD scheduler plugin informs the Data Distribution software about the pool of FLPs taking part in data taking. From c986bb3d1afc7f3ac955250c6267b3294df1476a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 2 Jun 2025 09:40:34 +0200 Subject: [PATCH 2162/2352] update release procedure - delete obsolete, add patch release --- docs/development.md | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/docs/development.md b/docs/development.md index d0373f09f..20247acc7 100644 --- a/docs/development.md +++ b/docs/development.md @@ -8,11 +8,26 @@ Bugs go to [JIRA](https://its.cern.ch/jira/projects/OCTRL/issues). ## Release Procedure +### Major releases + 1. Update documentation if necessary. 2. Bump `VERSION` file, commit, push (or pull request). -3. Run `hacking/release_notes.sh HEAD` to get a formatted commit message list since the last tag, copy it. -4. Paste the above into a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Sort, categorize, add summary on top. -5. Pick a version number. Numbers `x.x.80`-`x.x.89` are reserved for Alpha pre-releases. Numbers `x.x.90`-`x.x.99` are reserved for Beta and RC pre-releases. If doing a pre-release, don't forget to tick `This is a pre-release`. When ready, hit `Publish release`. -6. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). -7. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). -8. Submit pull request with the above to `alisw/alidist`. +3. Go to a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Use "Generate release notes" to create a list of changes. Write a short summary at the top. +4. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). +5. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). +6. Submit pull request with the above to `alisw/alidist`. + +### Patch releases + +1. Update documentation if necessary. +2. If the patch release should NOT be based on master: + + * Checkout the tag which the patch release should be based on, e.g. `git checkout v1.34.0` + * Create a branch called `branch_`, e.g. `git checkout -b branch_v1.34.1`. + +3. Bump `VERSION` file, commit, push (or pull request). +4. Go to a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Use "Generate release notes" to create a list of changes. Write a short summary at the top. +5. Go to your local clone of `alidist`, ensure that the branch is `master` and that it's up to date. Then branch out into `aliecs-bump` (`git branch aliecs-bump`). +6. Bump the version in `control.sh`, `control-core.sh`, `control-occplugin.sh` and `coconut.sh`. Commit and push to `origin/aliecs-bump` (`git push -u origin aliecs-bump`). +7. Submit pull request with the above to `alisw/alidist`. + From 0189b56f62bb0b5f7c7589f9968134e619412400 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 2 Jun 2025 10:52:20 +0200 Subject: [PATCH 2163/2352] More permissive margins in monitoring tests The monitoring tests include some pseudo-random outputs which sporadically go out of originally expected, too narrow margins, which is perfectly normal. The commit extends the margins. --- common/monitoring/monitoring_test.go | 56 ++++++++++++++-------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index ef43cbf9c..ba5e719f0 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -448,36 +448,36 @@ func TestApproximateHistogram(t *testing.T) { t.Errorf("wrong poolSize, expected 500, got %d", poolSize) } - if math.Abs(mean-50) > 5 { - t.Errorf("wrong mean value, expected 50+-5 got %v", mean) + if math.Abs(mean-50) > 10 { + t.Errorf("wrong mean value, expected 50+-10 got %v", mean) } - if math.Abs(float64(median-50)) > 5 { - t.Errorf("wrong median value, expected 50+-5 got %v", median) + if math.Abs(float64(median-50)) > 10 { + t.Errorf("wrong median value, expected 50+-10 got %v", median) } - if float64(min) > 5 { - t.Errorf("wrong min value, expected 0+-5 got %v", min) + if float64(min) > 10 { + t.Errorf("wrong min value, expected 0+-10 got %v", min) } - if math.Abs(float64(p10-10)) > 5 { - t.Errorf("wrong 10p value, expected 10+-5 got %v", p10) + if math.Abs(float64(p10-10)) > 10 { + t.Errorf("wrong 10p value, expected 10+-10 got %v", p10) } - if math.Abs(float64(p30-30)) > 5 { - t.Errorf("wrong 30p value, expected 30+-5 got %v", p30) + if math.Abs(float64(p30-30)) > 10 { + t.Errorf("wrong 30p value, expected 30+-10 got %v", p30) } - if math.Abs(float64(p70-70)) > 5 { - t.Errorf("wrong 50p value, expected 70+-5 got %v", p70) + if math.Abs(float64(p70-70)) > 10 { + t.Errorf("wrong 50p value, expected 70+-10 got %v", p70) } - if math.Abs(float64(p90-90)) > 5 { - t.Errorf("wrong 90p value, expected 90+-5 got %v", p90) + if math.Abs(float64(p90-90)) > 10 { + t.Errorf("wrong 90p value, expected 90+-10 got %v", p90) } - if math.Abs(float64(max-100)) > 5 { - t.Errorf("wrong max value, expected 100+-5 got %v", max) + if math.Abs(float64(max-100)) > 10 { + t.Errorf("wrong max value, expected 100+-10 got %v", max) } } @@ -497,33 +497,33 @@ func TestMetricsHistogramObject(t *testing.T) { for _, metric := range metrics { for valueName, value := range metric.fields { if strings.Contains(valueName, "mean") { - if math.Abs(value.(float64)-50) > 5 { - t.Errorf("wrong mean value, expected 50+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-50) > 10 { + t.Errorf("wrong mean value, expected 50+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "median") { - if math.Abs(value.(float64)-50) > 5 { - t.Errorf("wrong median value, expected 50+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-50) > 10 { + t.Errorf("wrong median value, expected 50+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "p10") { - if math.Abs(value.(float64)-10) > 5 { - t.Errorf("wrong p10, expected 10+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-10) > 10 { + t.Errorf("wrong p10, expected 10+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "p30") { - if math.Abs(value.(float64)-30) > 5 { - t.Errorf("wrong p30, expected 30+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-30) > 10 { + t.Errorf("wrong p30, expected 30+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "p70") { - if math.Abs(value.(float64)-70) > 5 { - t.Errorf("wrong p70, expected 70+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-70) > 10 { + t.Errorf("wrong p70, expected 70+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "p90") { - if math.Abs(value.(float64)-90) > 5 { - t.Errorf("wrong p90, expected 90+-5 got %v", value.(float64)) + if math.Abs(value.(float64)-90) > 10 { + t.Errorf("wrong p90, expected 90+-10 got %v", value.(float64)) } } if strings.Contains(valueName, "count") { From 6a9a18c636500ed47b84fc91ff6608663e754632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 3 Jun 2025 09:49:35 +0200 Subject: [PATCH 2164/2352] [core] added flag to GetEnvironments request that lists data of all integrated plugins --- core/protos/o2control.pb.go | 1499 +++++++++++++++--------------- core/protos/o2control.proto | 1 + core/protos/o2control_grpc.pb.go | 16 +- core/server.go | 8 +- 4 files changed, 779 insertions(+), 745 deletions(-) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 99d90d49c..417e42bbc 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.33.0 -// protoc v5.29.2 +// protoc v6.30.1 // source: protos/o2control.proto package pb @@ -496,7 +496,7 @@ type GetFrameworkInfoReply struct { DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` - Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetFrameworkInfoReply) Reset() { @@ -709,8 +709,9 @@ type GetEnvironmentsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` - ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` + ShowDetailedIntegratedServices bool `protobuf:"varint,3,opt,name=showDetailedIntegratedServices,proto3" json:"showDetailedIntegratedServices,omitempty"` // integratedServices are returned everytime, setting this flag gives detailed report } func (x *GetEnvironmentsRequest) Reset() { @@ -759,6 +760,13 @@ func (x *GetEnvironmentsRequest) GetShowTaskInfos() bool { return false } +func (x *GetEnvironmentsRequest) GetShowDetailedIntegratedServices() bool { + if x != nil { + return x.ShowDetailedIntegratedServices + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -766,7 +774,7 @@ type GetEnvironmentsReply struct { FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetEnvironmentsReply) Reset() { @@ -1091,7 +1099,7 @@ type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *NewEnvironmentReply) Reset() { @@ -1223,7 +1231,7 @@ type NewAutoEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *NewAutoEnvironmentReply) Reset() { @@ -1328,7 +1336,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` - Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetEnvironmentReply) Reset() { @@ -1466,7 +1474,7 @@ type ControlEnvironmentReply struct { StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` - Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ControlEnvironmentReply) Reset() { @@ -1816,7 +1824,7 @@ type DestroyEnvironmentReply struct { unknownFields protoimpl.UnknownFields CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *DestroyEnvironmentReply) Reset() { @@ -1871,7 +1879,7 @@ type GetActiveDetectorsReply struct { unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetActiveDetectorsReply) Reset() { @@ -1926,7 +1934,7 @@ type GetAvailableDetectorsReply struct { unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetAvailableDetectorsReply) Reset() { @@ -2431,7 +2439,7 @@ type GetTasksReply struct { unknownFields protoimpl.UnknownFields Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetTasksReply) Reset() { @@ -2533,7 +2541,7 @@ type GetTaskReply struct { unknownFields protoimpl.UnknownFields Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetTaskReply) Reset() { @@ -2873,7 +2881,7 @@ type CleanupTasksReply struct { KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *CleanupTasksReply) Reset() { @@ -3120,7 +3128,7 @@ type GetRolesReply struct { unknownFields protoimpl.UnknownFields Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetRolesReply) Reset() { @@ -3460,7 +3468,7 @@ type GetWorkflowTemplatesReply struct { unknownFields protoimpl.UnknownFields WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetWorkflowTemplatesReply) Reset() { @@ -3634,7 +3642,7 @@ type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ListReposReply) Reset() { @@ -3752,7 +3760,7 @@ type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *AddRepoReply) Reset() { @@ -3861,7 +3869,7 @@ type RemoveRepoReply struct { unknownFields protoimpl.UnknownFields NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *RemoveRepoReply) Reset() { @@ -4112,7 +4120,7 @@ type SetRepoDefaultRevisionReply struct { unknownFields protoimpl.UnknownFields Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *SetRepoDefaultRevisionReply) Reset() { @@ -4205,7 +4213,7 @@ type ListIntegratedServicesReply struct { unknownFields protoimpl.UnknownFields Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ListIntegratedServicesReply) Reset() { @@ -4388,744 +4396,749 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, - 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, - 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, - 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xa0, 0x01, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1e, + 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x96, + 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, + 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, - 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, - 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, - 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, + 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, - 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, - 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, - 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, + 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, + 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, + 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, + 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, + 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, + 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, - 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, - 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, - 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, - 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, - 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, - 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, + 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, + 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, + 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, - 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, + 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, + 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, + 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, + 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, + 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, + 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, + 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, - 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, - 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/core/protos/o2control.proto b/core/protos/o2control.proto index df3069b90..9f9d0c544 100644 --- a/core/protos/o2control.proto +++ b/core/protos/o2control.proto @@ -123,6 +123,7 @@ message TeardownReply {} message GetEnvironmentsRequest { bool showAll = 1; bool showTaskInfos = 2; + bool showDetailedIntegratedServices = 3; // integratedServices are returned everytime, setting this flag gives detailed report } message GetEnvironmentsReply { string frameworkId = 1; diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 942f75d1e..a0c05c50f 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.29.2 +// - protoc v6.30.1 // source: protos/o2control.proto package pb @@ -77,13 +77,20 @@ const ( type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + // Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + // Creates a new environment. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) + // Creates a new environment. + // It returns once an environment ID is created and continues the creation asynchronously to the call. + // The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) @@ -375,13 +382,20 @@ func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnviron type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + // Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) + // Creates a new environment. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) + // Creates a new environment. + // It returns once an environment ID is created and continues the creation asynchronously to the call. + // The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) diff --git a/core/server.go b/core/server.go index 0ad0ab56f..3d9ff63fa 100644 --- a/core/server.go +++ b/core/server.go @@ -225,7 +225,12 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm defer setCurrentUnixMilli(&r.Timestamp) // Get plugin-provided environment data for all envs - integratedServicesEnvsData := integration.PluginsInstance().GetEnvironmentsShortData(m.state.environments.Ids()) + var integratedServicesEnvsData map[uid.ID]map[string]string + if request.GetShowDetailedIntegratedServices() { + integratedServicesEnvsData = integration.PluginsInstance().GetEnvironmentsData(m.state.environments.Ids()) + } else { + integratedServicesEnvsData = integration.PluginsInstance().GetEnvironmentsShortData(m.state.environments.Ids()) + } // Get all environments for _, id := range m.state.environments.Ids() { @@ -294,6 +299,7 @@ func (m *RpcServer) GetEnvironments(cxt context.Context, request *pb.GetEnvironm if request.GetShowTaskInfos() { e.Tasks = tasksToShortTaskInfos(tasks, m.state.taskman) } + e.IncludedDetectors = env.GetActiveDetectors().StringList() r.Environments = append(r.Environments, e) From 44910d1cebaf7a477d0e51751c666cc36b036458 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 10:35:05 +0200 Subject: [PATCH 2165/2352] Handle a bunch of unhandled errors --- apricot/local/local_test.go | 17 +++++++++-- apricot/local/service.go | 5 +++- apricot/local/service_test.go | 6 ++++ apricot/local/service_test.yaml | 4 ++- apricot/local/servicehttp.go | 29 ++++++++++++++++--- common/event/writer.go | 6 +++- common/event/writer_test.go | 3 +- common/monitoring/common.go | 6 ++-- common/monitoring/metricsreservoirsampling.go | 2 +- common/monitoring/monitoring.go | 5 +++- .../cfgbackend/configuration_suite_test.go | 17 +++++++++-- configuration/template/template_test.go | 17 +++++++++-- core/environment/utils.go | 6 +++- core/task/channel/outbound.go | 6 +++- core/task/manager.go | 16 +++++++--- core/task/scheduler.go | 7 ++++- core/task/schedulerstate.go | 14 +++++++-- 17 files changed, 135 insertions(+), 31 deletions(-) diff --git a/apricot/local/local_test.go b/apricot/local/local_test.go index ea48c3a4d..49fc11245 100644 --- a/apricot/local/local_test.go +++ b/apricot/local/local_test.go @@ -31,11 +31,21 @@ var _ = BeforeSuite(func() { for _, configFile := range configFiles { from, err := os.Open("./" + configFile) Expect(err).NotTo(HaveOccurred()) - defer from.Close() + defer func() { + err := from.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) Expect(err).NotTo(HaveOccurred()) - defer to.Close() + defer func() { + err := to.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() _, err = io.Copy(to, from) Expect(err).NotTo(HaveOccurred()) @@ -45,5 +55,6 @@ var _ = BeforeSuite(func() { }) var _ = AfterSuite(func() { - os.RemoveAll(*tmpDir) + err := os.RemoveAll(*tmpDir) + Expect(err).NotTo(HaveOccurred()) }) diff --git a/apricot/local/service.go b/apricot/local/service.go index 0fe042dd2..53e111529 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -508,7 +508,10 @@ func (s *Service) GetCRUCardsForHost(hostname string) ([]string, error) { if err != nil { return nil, err } - json.Unmarshal([]byte(cfgCards), &cards) + err = json.Unmarshal([]byte(cfgCards), &cards) + if err != nil { + return nil, err + } unique := make(map[string]bool) for _, card := range cards { if _, value := unique[card.Serial]; !value { diff --git a/apricot/local/service_test.go b/apricot/local/service_test.go index 4f6112220..b3d8e1ede 100644 --- a/apricot/local/service_test.go +++ b/apricot/local/service_test.go @@ -461,6 +461,12 @@ var _ = Describe("local service", func() { Expect(err).To(HaveOccurred()) }) }) + When("retrieving the CRU cards for an FLP with invalid \"cards\" JSON", func() { + It("should produce an error", func() { + cards, err = svc.GetCRUCardsForHost("flp500") + Expect(err).To(HaveOccurred()) + }) + }) }) Describe("getting endpoints for a CRU card", func() { var ( diff --git a/apricot/local/service_test.yaml b/apricot/local/service_test.yaml index 07047525a..4d15acac4 100644 --- a/apricot/local/service_test.yaml +++ b/apricot/local/service_test.yaml @@ -192,4 +192,6 @@ o2: flp003: cards: "{ \"key\" : \"value\" }" flp100: - cards: "{ \"key\" : \"value\" }" \ No newline at end of file + cards: "{ \"key\" : \"value\" }" + flp500: + cards: "invalid json{" \ No newline at end of file diff --git a/apricot/local/servicehttp.go b/apricot/local/servicehttp.go index 50e66995b..c7f3c9fe4 100644 --- a/apricot/local/servicehttp.go +++ b/apricot/local/servicehttp.go @@ -615,7 +615,13 @@ func (httpsvc *HttpService) ApiPrintClusterInformation(w http.ResponseWriter, r log.WithError(err).Warn("Error, could not marshal inventory.") } } - fmt.Fprintln(w, string(result)) + _, err = fmt.Fprintln(w, string(result)) + if err != nil { + log.WithField("result", string(result)). + WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Warn("Error, could not write a part of HTTP response to response writer.") + } case "text": fallthrough default: @@ -623,13 +629,28 @@ func (httpsvc *HttpService) ApiPrintClusterInformation(w http.ResponseWriter, r w.WriteHeader(http.StatusOK) if hosts != nil { for _, hostname := range hosts { - fmt.Fprintf(w, "%s\n", hostname) + _, err := fmt.Fprintf(w, "%s\n", hostname) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Warn("Error, could not write a part of HTTP response to response writer.") + } } } else if inventory != nil { for detector, flps := range inventory { - fmt.Fprintf(w, "%s\n", detector) + _, err := fmt.Fprintf(w, "%s\n", detector) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Warn("Error, could not write a part of HTTP response to response writer.") + } for _, hostname := range flps { - fmt.Fprintf(w, "\t%s\n", hostname) + _, err = fmt.Fprintf(w, "\t%s\n", hostname) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Warn("Error, could not write a part of HTTP response to response writer.") + } } } } diff --git a/common/event/writer.go b/common/event/writer.go index 7d4c9e511..534c77319 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -133,7 +133,11 @@ func (w *KafkaWriter) Close() { w.runningWorkers.Add(2) close(w.toBatchMessagesChan) w.runningWorkers.Wait() - w.Writer.Close() + err := w.Writer.Close() + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel). + Errorf("failed to close writer: %v", err) + } } } diff --git a/common/event/writer_test.go b/common/event/writer_test.go index 48b9fd8b2..1a6363a85 100644 --- a/common/event/writer_test.go +++ b/common/event/writer_test.go @@ -49,7 +49,8 @@ var _ = Describe("Writer", func() { writer.writeFunction = func(messages []kafka.Message) { Expect(len(messages)).To(Equal(1)) event := &pb.Event{} - proto.Unmarshal(messages[0].Value, event) + err := proto.Unmarshal(messages[0].Value, event) + Expect(err).To(BeNil()) Expect(event.GetCoreStartEvent().FrameworkId).To(Equal("FrameworkId")) channel <- struct{}{} } diff --git a/common/monitoring/common.go b/common/monitoring/common.go index 9f21f8567..e5c0b1a82 100644 --- a/common/monitoring/common.go +++ b/common/monitoring/common.go @@ -35,11 +35,11 @@ type key struct { } func metricNameTagsToHash(hash *maphash.Hash, metric *Metric) { - hash.WriteString(metric.name) + _, _ = hash.WriteString(metric.name) for _, tag := range metric.tags { - hash.WriteString(tag.name) - hash.WriteString(tag.value) + _, _ = hash.WriteString(tag.name) + _, _ = hash.WriteString(tag.value) } } diff --git a/common/monitoring/metricsreservoirsampling.go b/common/monitoring/metricsreservoirsampling.go index 1e5cbe4df..f4b0eb4bd 100644 --- a/common/monitoring/metricsreservoirsampling.go +++ b/common/monitoring/metricsreservoirsampling.go @@ -66,7 +66,7 @@ func metricFieldToFloat64(field any) float64 { func (this *MetricsReservoirSampling) AddMetric(metric *Metric) { for fieldName, field := range metric.fields { metricNameTagsToHash(&this.hash, metric) - this.hash.WriteString(fieldName) + _, _ = this.hash.WriteString(fieldName) k := key{nameTagsHash: hashValueAndReset(&this.hash), timestamp: time.Unix(metric.timestamp.Unix(), 0)} if storedMetric, ok := this.metricsBuckets[k]; !ok { newReservoir := newReservoirSampling(fieldName, reservoirSize) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 54b48b1c6..47cf9dc2c 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -120,7 +120,10 @@ func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { if metricsToConvert == nil { metricsToConvert = make([]Metric, 0) } - Format(w, metricsToConvert) + err := Format(w, metricsToConvert) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel).Errorf("Failed to export metrics: %v", err) + } } func Send(metric *Metric) { diff --git a/configuration/cfgbackend/configuration_suite_test.go b/configuration/cfgbackend/configuration_suite_test.go index 55bcc0eea..0c7e61fa3 100644 --- a/configuration/cfgbackend/configuration_suite_test.go +++ b/configuration/cfgbackend/configuration_suite_test.go @@ -28,16 +28,27 @@ var _ = BeforeSuite(func() { // copy config file from, err := os.Open("./" + configFile) Expect(err).NotTo(HaveOccurred()) - defer from.Close() + defer func() { + err := from.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) Expect(err).NotTo(HaveOccurred()) - defer to.Close() + defer func() { + err := to.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() _, err = io.Copy(to, from) Expect(err).NotTo(HaveOccurred()) }) var _ = AfterSuite(func() { - os.RemoveAll(*tmpDir) + err := os.RemoveAll(*tmpDir) + Expect(err).NotTo(HaveOccurred()) }) diff --git a/configuration/template/template_test.go b/configuration/template/template_test.go index 91b90c458..5c4d6d424 100644 --- a/configuration/template/template_test.go +++ b/configuration/template/template_test.go @@ -28,11 +28,21 @@ var _ = BeforeSuite(func() { for _, configFile := range configFiles { from, err := os.Open("./" + configFile) Expect(err).NotTo(HaveOccurred()) - defer from.Close() + defer func() { + err := from.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() to, err := os.OpenFile(*tmpDir+"/"+configFile, os.O_RDWR|os.O_CREATE, 0666) Expect(err).NotTo(HaveOccurred()) - defer to.Close() + defer func() { + err := to.Close() + if err != nil { + Expect(err).NotTo(HaveOccurred()) + } + }() _, err = io.Copy(to, from) Expect(err).NotTo(HaveOccurred()) @@ -40,5 +50,6 @@ var _ = BeforeSuite(func() { }) var _ = AfterSuite(func() { - os.RemoveAll(*tmpDir) + err := os.RemoveAll(*tmpDir) + Expect(err).NotTo(HaveOccurred()) }) diff --git a/core/environment/utils.go b/core/environment/utils.go index 3270f24ce..7cb236b79 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -28,6 +28,7 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" "os" "sort" @@ -93,7 +94,10 @@ func sortMapToString(m map[string]string) string { b := new(bytes.Buffer) for _, k := range keys { - fmt.Fprintf(b, "%s=\"%s\"\n", k, m[k]) + _, err := fmt.Fprintf(b, "%s=\"%s\"\n", k, m[k]) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel).Errorf("Error formatting or buffering string for key %s: %v", k, err) + } } return b.String() } diff --git a/core/task/channel/outbound.go b/core/task/channel/outbound.go index a9855df0d..040ca95df 100644 --- a/core/task/channel/outbound.go +++ b/core/task/channel/outbound.go @@ -26,6 +26,7 @@ package channel import ( "fmt" + "github.com/AliceO2Group/Control/common/logger/infologger" "strconv" "strings" @@ -173,7 +174,10 @@ func MergeOutbound(hp, lp []Outbound) (channels []Outbound) { updated := false for _, pCh := range channels { if v.Name == pCh.Name { - mergo.Merge(&pCh, v) + err := mergo.Merge(&pCh, v) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel).Errorf("error merging outbound channel '%s': %v", v.Name, err) + } updated = true break } diff --git a/core/task/manager.go b/core/task/manager.go index f9727ec72..4ac46fcd1 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -666,7 +666,7 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e return } -func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { +func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) { taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -685,8 +685,6 @@ func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) error { } m.internalEventCh <- event.NewTasksReleasedEvent(envId, taskIdsReleased, taskReleaseErrors) - - return nil } func (m *Manager) releaseTask(envId uid.ID, task *Task) error { @@ -1276,7 +1274,17 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { mesosState == mesos.TASK_KILLING || mesosState == mesos.TASK_UNKNOWN) { killCall := calls.Kill(mesosStatus.TaskID.GetValue(), mesosStatus.AgentID.GetValue()) - calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + err := calls.CallNoData(context.TODO(), m.schedulerState.cli, killCall) + if err != nil { + log.WithPrefix("taskman"). + WithField("taskId", mesosStatus.GetTaskID().Value). + WithField("state", mesosState.String()). + WithField("source", mesosStatus.GetSource().String()). + WithField("message", mesosStatus.GetMessage()). + WithField(infologger.Level, infologger.IL_Devel). + WithError(err). + Errorf("could not kill task '%s' after reconciliation", mesosStatus.GetTaskID().Value) + } } else { // Enqueue task state update go m.updateTaskStatus(&mesosStatus) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index c5088cc4b..02a32c42d 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -93,7 +93,12 @@ func runSchedulerController(ctx context.Context, switch { case receivedEvent == scheduler.Event_SUBSCRIBED: if state.sm.Is("INITIAL") { - state.sm.Event(context.Background(), "CONNECT") + err := state.sm.Event(context.Background(), "CONNECT") + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Error("scheduler state CONNECT event failed") + } } } } diff --git a/core/task/schedulerstate.go b/core/task/schedulerstate.go index 86970754f..946ca7414 100644 --- a/core/task/schedulerstate.go +++ b/core/task/schedulerstate.go @@ -208,10 +208,20 @@ func (state *schedulerState) Start(ctx context.Context) { if state.err != nil { err = state.err log.WithField("error", err.Error()).Debug("scheduler quit with error, main state machine GO_ERROR") - state.sm.Event(context.Background(), "GO_ERROR", err) // TODO: use error information in GO_ERROR + err = state.sm.Event(context.Background(), "GO_ERROR", err) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel). + WithError(err). + Error("scheduler state GO_ERROR event failed") + } } else { log.Debug("scheduler quit, no errors") - state.sm.Event(context.Background(), "EXIT") + err := state.sm.Event(context.Background(), "EXIT") + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel). + WithError(err). + Error("scheduler state EXIT event failed") + } } }() } From f641fe89ad607bc9ec0ea28c58b8598db60a86c4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 11:58:38 +0200 Subject: [PATCH 2166/2352] fix reserved words used as variable names --- common/gera/map_test.go | 24 +++++++++---------- common/monitoring/metricsreservoirsampling.go | 6 ++--- common/monitoring/monitoring_test.go | 18 +++++++------- core/server.go | 12 +++++----- 4 files changed, 30 insertions(+), 30 deletions(-) diff --git a/common/gera/map_test.go b/common/gera/map_test.go index 8434fa1b6..187c7446e 100644 --- a/common/gera/map_test.go +++ b/common/gera/map_test.go @@ -250,18 +250,18 @@ pdp_workflow_parameters: "" }) It("should correctly return a copy of the whole structure", func() { - copy := stringMap.Copy() - Expect(copy).NotTo(BeNil()) - Expect(copy == stringMap).NotTo(BeTrue()) - Expect(copy).To(Equal(stringMap)) - Expect(copy.Raw()).To(Equal(stringMap.Raw())) - Expect(copy.Len()).To(Equal(stringMap.Len())) - copy.Set("detector", "test") - Expect(copy).NotTo(Equal(stringMap)) - Expect(copy.Raw()).NotTo(Equal(stringMap.Raw())) - Expect(copy.Len()).To(Equal(stringMap.Len())) - copy.Set("detector2", "test2") - Expect(copy.Len()).To(Equal(stringMap.Len() + 1)) + mapCopy := stringMap.Copy() + Expect(mapCopy).NotTo(BeNil()) + Expect(mapCopy == stringMap).NotTo(BeTrue()) + Expect(mapCopy).To(Equal(stringMap)) + Expect(mapCopy.Raw()).To(Equal(stringMap.Raw())) + Expect(mapCopy.Len()).To(Equal(stringMap.Len())) + mapCopy.Set("detector", "test") + Expect(mapCopy).NotTo(Equal(stringMap)) + Expect(mapCopy.Raw()).NotTo(Equal(stringMap.Raw())) + Expect(mapCopy.Len()).To(Equal(stringMap.Len())) + mapCopy.Set("detector2", "test2") + Expect(mapCopy.Len()).To(Equal(stringMap.Len() + 1)) }) It("should correctly return a copy of the underlying map", func() { diff --git a/common/monitoring/metricsreservoirsampling.go b/common/monitoring/metricsreservoirsampling.go index f4b0eb4bd..853715dd7 100644 --- a/common/monitoring/metricsreservoirsampling.go +++ b/common/monitoring/metricsreservoirsampling.go @@ -88,16 +88,16 @@ func (this *MetricsReservoirSampling) GetMetrics() []Metric { for key, reservoirMetric := range this.metricsBuckets { m := Metric{name: reservoirMetric.metric.name, tags: reservoirMetric.metric.tags, timestamp: key.timestamp} - mean, median, min, p10, p30, p70, p90, max, count, poolSize := reservoirMetric.reservoir.GetStats() + mean, median, minimum, p10, p30, p70, p90, maximum, count, poolSize := reservoirMetric.reservoir.GetStats() m.SetFieldFloat64(reservoirMetric.reservoir.name+"_mean", mean) m.SetFieldFloat64(reservoirMetric.reservoir.name+"_median", median) - m.SetFieldFloat64(reservoirMetric.reservoir.name+"_min", min) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_min", minimum) m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p10", p10) m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p30", p30) m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p70", p70) m.SetFieldFloat64(reservoirMetric.reservoir.name+"_p90", p90) - m.SetFieldFloat64(reservoirMetric.reservoir.name+"_max", max) + m.SetFieldFloat64(reservoirMetric.reservoir.name+"_max", maximum) m.SetFieldUInt64(reservoirMetric.reservoir.name+"_count", count) m.SetFieldUInt64(reservoirMetric.reservoir.name+"_poolsize", poolSize) diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index ba5e719f0..1f68a9bd3 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -382,7 +382,7 @@ func TestApproximateHistogram(t *testing.T) { histo.AddPoint(10) } - mean, median, min, p10, p30, p70, p90, max, count, poolSize := histo.GetStats() + mean, median, minimum, p10, p30, p70, p90, maximum, count, poolSize := histo.GetStats() if count != 20 { t.Errorf("wrong count before reset, expected 20, got %d", count) @@ -392,7 +392,7 @@ func TestApproximateHistogram(t *testing.T) { t.Errorf("wrong poolSize, expected 20, got %d", poolSize) } - if mean != 10 || median != 10 || min != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || max != 10 { + if mean != 10 || median != 10 || minimum != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || maximum != 10 { t.Errorf("one of the values is not 10 when it should be 10, mean %v, median %v, 10p %v, 30p %v, 70p %v, 90p %v", mean, median, p10, p30, p70, p90) } @@ -410,7 +410,7 @@ func TestApproximateHistogram(t *testing.T) { histo.AddPoint(10) } - mean, median, min, p10, p30, p70, p90, max, count, poolSize = histo.GetStats() + mean, median, minimum, p10, p30, p70, p90, maximum, count, poolSize = histo.GetStats() if count != 2000 { t.Errorf("wrong count before reset, expected 2000, got %d", count) @@ -420,7 +420,7 @@ func TestApproximateHistogram(t *testing.T) { t.Errorf("wrong poolSize, expected 500, got %d", poolSize) } - if mean != 10 || median != 10 || min != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || max != 10 { + if mean != 10 || median != 10 || minimum != 10 || p10 != 10 || p30 != 10 || p70 != 10 || p90 != 10 || maximum != 10 { t.Errorf("one of the values is not 10 when it should be 10, mean %v, median %v, 10p %v, 30p %v, 70p %v, 90p %v", mean, median, p10, p30, p70, p90) } @@ -438,7 +438,7 @@ func TestApproximateHistogram(t *testing.T) { histo.AddPoint((float64(rand.Int63n(100)))) } - mean, median, min, p10, p30, p70, p90, max, count, poolSize = histo.GetStats() + mean, median, minimum, p10, p30, p70, p90, maximum, count, poolSize = histo.GetStats() if count != 10000 { t.Errorf("wrong count before reset, expected 10000, got %d", count) @@ -456,8 +456,8 @@ func TestApproximateHistogram(t *testing.T) { t.Errorf("wrong median value, expected 50+-10 got %v", median) } - if float64(min) > 10 { - t.Errorf("wrong min value, expected 0+-10 got %v", min) + if float64(minimum) > 10 { + t.Errorf("wrong min value, expected 0+-10 got %v", minimum) } if math.Abs(float64(p10-10)) > 10 { @@ -476,8 +476,8 @@ func TestApproximateHistogram(t *testing.T) { t.Errorf("wrong 90p value, expected 90+-10 got %v", p90) } - if math.Abs(float64(max-100)) > 10 { - t.Errorf("wrong max value, expected 100+-10 got %v", max) + if math.Abs(float64(maximum-100)) > 10 { + t.Errorf("wrong max value, expected 100+-10 got %v", maximum) } } diff --git a/core/server.go b/core/server.go index 3d9ff63fa..2067cd47e 100644 --- a/core/server.go +++ b/core/server.go @@ -171,9 +171,9 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques m.logMethod() defer m.logMethodHandled() - maj, _ := strconv.ParseInt(product.VERSION_MAJOR, 10, 32) - min, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) - pat, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) + major, _ := strconv.ParseInt(product.VERSION_MAJOR, 10, 32) + minor, _ := strconv.ParseInt(product.VERSION_MINOR, 10, 32) + patch, _ := strconv.ParseInt(product.VERSION_PATCH, 10, 32) availableDetectors, activeDetectors, allDetectors, err := m.listDetectors() if err != nil { @@ -190,9 +190,9 @@ func (m *RpcServer) GetFrameworkInfo(context.Context, *pb.GetFrameworkInfoReques HostsCount: int32(m.state.taskman.AgentCache.Count()), InstanceName: viper.GetString("instanceName"), Version: &pb.Version{ - Major: int32(maj), - Minor: int32(min), - Patch: int32(pat), + Major: int32(major), + Minor: int32(minor), + Patch: int32(patch), Build: product.BUILD, VersionStr: product.VERSION, ProductName: product.PRETTY_SHORTNAME, From 499b3fa501fa9cba9f2012a6667a01aca0c630bb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 12:18:03 +0200 Subject: [PATCH 2167/2352] fix missing 'case' statements for 'iota' consts in 'switch' --- configuration/template/fields.go | 1 + core/task/manager.go | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index a10a99c30..71246376a 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -218,6 +218,7 @@ func (vs *VarStack) consolidated(stage Stage) (consolidatedStack map[string]stri if err != nil { return } + case _STAGE_MAX: } consolidated := gera.MakeMapWithMap(vs.Locals).Wrap(gera.MakeMapWithMap(userVars).Wrap(gera.MakeMapWithMap(vars).Wrap(gera.MakeMapWithMap(defaults)))) diff --git a/core/task/manager.go b/core/task/manager.go index 4ac46fcd1..7a92cf573 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -1293,6 +1293,21 @@ func (m *Manager) handleMessage(tm *TaskmanMessage) error { go m.updateTaskState(tm.taskId, tm.state) case taskop.ReleaseTasks: go m.releaseTasks(tm.GetEnvironmentId(), tm.GetTasks()) + case taskop.KillTasks: + log.WithPrefix("taskman"). + WithField("partition", tm.GetEnvironmentId().String()). + WithField("level", infologger.IL_Devel). + WithField("status", tm.status.String()). + WithField("source", tm.status.GetSource().String()). + WithField("message", tm.status.GetMessage()). + Warn("unexpected KillTasks message received") + case taskop.Error: + log.WithPrefix("taskman"). + WithField("partition", tm.GetEnvironmentId().String()). + WithField("level", infologger.IL_Devel). + WithField("status", tm.status.String()). + WithField("source", tm.status.GetSource().String()). + Warn("taskman received error: %s", tm.GetError()) } return nil From b490dbf02927fbbb3aa523eddefe901ae63600ac Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 14:42:18 +0200 Subject: [PATCH 2168/2352] fix wrong int to string conversion in BKP plugin --- core/integration/bookkeeping/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 3096ae735..3cd605f4a 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -160,7 +160,7 @@ func (p *Plugin) getPendingRunStopsForEnvs(envIds []uid.ID) map[uid.ID]string { for _, envId := range envIds { if runStop, ok := p.pendingRunStops[envId.String()]; ok { - out[envId] = string(runStop) + out[envId] = strconv.FormatInt(runStop, 10) } } return out From 52083ffe1a11fed4e7013985f2fcdcf10450f9d0 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 14:49:40 +0200 Subject: [PATCH 2169/2352] fix variable names collding with imported package names --- configuration/template/fields.go | 4 ++-- core/server.go | 18 +++++++++--------- core/task/manager.go | 4 ++-- core/task/scheduler.go | 10 +++++----- core/workflow/callable/call.go | 12 ++++++------ executor/executable/task.go | 8 ++++---- executor/executor.go | 6 +++--- executor/executorcmd/client.go | 4 ++-- 8 files changed, 33 insertions(+), 33 deletions(-) diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 71246376a..3a0114fe8 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -343,7 +343,7 @@ func (fields Fields) Execute(confSvc ConfigurationService, parentPath string, va func copyMap(src map[string]interface{}, dest map[string]interface{}) { for k, v := range src { - vm, ok := v.(map[string]interface{}) + vmap, ok := v.(map[string]interface{}) if ok { var destk map[string]interface{} if _, exists := dest[k]; exists { @@ -354,7 +354,7 @@ func copyMap(src map[string]interface{}, dest map[string]interface{}) { } else { destk = make(map[string]interface{}) } - copyMap(vm, destk) + copyMap(vmap, destk) dest[k] = destk } else { dest[k] = v diff --git a/core/server.go b/core/server.go index 2067cd47e..d8d3a6a1d 100644 --- a/core/server.go +++ b/core/server.go @@ -860,24 +860,24 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge m.logMethod() defer m.logMethodHandled() - task := m.state.taskman.GetTask(req.TaskId) - if task == nil { + requestedTask := m.state.taskman.GetTask(req.TaskId) + if requestedTask == nil { return &pb.GetTaskReply{Timestamp: currentUnixMilli()}, status.New(codes.NotFound, "task not found").Err() } - taskClass := task.GetTaskClass() - commandInfo := task.GetTaskCommandInfo() + taskClass := requestedTask.GetTaskClass() + commandInfo := requestedTask.GetTaskCommandInfo() var outbound []channel.Outbound var inbound []channel.Inbound taskPath := "" // TODO: probably not the nicest way to do this... the outbound assignments should be cached // in the Task - if task.IsLocked() { + if requestedTask.IsLocked() { type parentRole interface { CollectOutboundChannels() []channel.Outbound GetPath() string CollectInboundChannels() []channel.Inbound } - parent, ok := task.GetParentRole().(parentRole) + parent, ok := requestedTask.GetParentRole().(parentRole) if ok { outbound = channel.MergeOutbound(parent.CollectOutboundChannels(), taskClass.Connect) taskPath = parent.GetPath() @@ -891,13 +891,13 @@ func (m *RpcServer) GetTask(cxt context.Context, req *pb.GetTaskRequest) (*pb.Ge rep := &pb.GetTaskReply{ Task: &pb.TaskInfo{ - ShortInfo: taskToShortTaskInfo(task, m.state.taskman), + ShortInfo: taskToShortTaskInfo(requestedTask, m.state.taskman), InboundChannels: inboundChannelsToPbChannels(inbound), OutboundChannels: outboundChannelsToPbChannels(outbound), CommandInfo: commandInfoToPbCommandInfo(commandInfo), TaskPath: taskPath, - EnvId: task.GetEnvironmentId().String(), - Properties: task.GetProperties(), + EnvId: requestedTask.GetEnvironmentId().String(), + Properties: requestedTask.GetProperties(), }, Timestamp: currentUnixMilli(), } diff --git a/core/task/manager.go b/core/task/manager.go index 7a92cf573..28d1d0d22 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -744,7 +744,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { Debug("generated inbound bindMap for environment configuration") src := sm.STANDBY.String() - event := "CONFIGURE" + evt := "CONFIGURE" dest := sm.CONFIGURED.String() args := make(controlcommands.PropertyMapsMap) args, err = tasks.BuildPropertyMaps(bindMap) @@ -755,7 +755,7 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { WithField("partition", envId.String()). Debug("pushing configuration to tasks") - cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, event, dest, args) + cmd := controlcommands.NewMesosCommand_Transition(envId, receivers, src, evt, dest, args) cmd.ResponseTimeout = 120 * time.Second // The default timeout is 90 seconds, but we need more time for the tasks to configure _ = m.cq.Enqueue(cmd, notify) diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 02a32c42d..5e2d60fe4 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -1516,12 +1516,12 @@ func makeTaskForMesosResources( WithField("inboundChannels", func() string { accu := make([]string, len(wants.InboundChannels)) for i := 0; i < len(wants.InboundChannels); i++ { - channel := wants.InboundChannels[i] - accu[i] = channel.Name - if len(channel.Global) > 0 { - accu[i] += fmt.Sprintf(" (global: %s)", channel.Global) + inboundChannel := wants.InboundChannels[i] + accu[i] = inboundChannel.Name + if len(inboundChannel.Global) > 0 { + accu[i] += fmt.Sprintf(" (global: %s)", inboundChannel.Global) } - if endpoint, ok := bindMap[channel.Name]; ok { + if endpoint, ok := bindMap[inboundChannel.Name]; ok { accu[i] += fmt.Sprintf(" -> %s", endpoint.GetAddress()) } } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 7b1282da2..0af9946cd 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -72,14 +72,14 @@ func NewCall(funcCall string, returnVar string, parent ParentRole) (call *Call) } func (s Calls) CallAll() map[*Call]error { - errors := make(map[*Call]error) + errs := make(map[*Call]error) for _, v := range s { err := v.Call() if err != nil { - errors[v] = err + errs[v] = err } } - return errors + return errs } func (s Calls) StartAll() { @@ -90,7 +90,7 @@ func (s Calls) StartAll() { func (s Calls) AwaitAll() map[*Call]error { // Since each Await call blocks, we call it in parallel and then collect - errors := make(map[*Call]error) + errs := make(map[*Call]error) wg := &sync.WaitGroup{} wg.Add(len(s)) for _, v := range s { @@ -98,12 +98,12 @@ func (s Calls) AwaitAll() map[*Call]error { defer wg.Done() err := v.Await() if err != nil { - errors[v] = err + errs[v] = err } }(v) } wg.Wait() - return errors + return errs } func (c *Call) Call() error { diff --git a/executor/executable/task.go b/executor/executable/task.go index 337be37fd..0376fe8f3 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -208,11 +208,11 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { return nil, err } - uid, err := strconv.ParseUint(targetUser.Uid, 10, 32) + userid, err := strconv.ParseUint(targetUser.Uid, 10, 32) if err != nil { return nil, err } - gid, err := strconv.ParseUint(targetUser.Gid, 10, 32) + groupid, err := strconv.ParseUint(targetUser.Gid, 10, 32) if err != nil { return nil, err } @@ -220,8 +220,8 @@ func prepareTaskCmd(commandInfo *common.TaskCommandInfo) (*exec.Cmd, error) { gids, gidStrings := executorutil.GetGroupIDs(targetUser) credential := &syscall.Credential{ - Uid: uint32(uid), - Gid: uint32(gid), + Uid: uint32(userid), + Gid: uint32(groupid), Groups: gids, NoSetGroups: false, } diff --git a/executor/executor.go b/executor/executor.go index c570a95fc..ba44333ca 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -111,7 +111,7 @@ func Run(cfg config.Config) { Host: cfg.AgentEndpoint, Path: apiPath, } - http = httpcli.New( + client = httpcli.New( httpcli.Endpoint(apiURL.String()), httpcli.Codec(codecs.ByMediaType[codecs.MediaTypeProtobuf]), httpcli.Do(httpcli.With( @@ -132,7 +132,7 @@ func Run(cfg config.Config) { state = &internalState{ // With this we inject the callOptions into all outgoing calls cli: calls.SenderWith( - httpexec.NewSender(http.Send), + httpexec.NewSender(client.Send), callOptions..., ), // The executor keeps lists of unacknowledged tasks and unacknowledged updates. In case of unexpected @@ -151,7 +151,7 @@ func Run(cfg config.Config) { } subscriber = calls.SenderWith( // Here too, callOptions for all outgoing subscriber calls - httpexec.NewSender(http.Send, httpcli.Close(true)), + httpexec.NewSender(client.Send, httpcli.Close(true)), callOptions..., ) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index ae400c501..2fa55c0b6 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -43,7 +43,7 @@ import ( "github.com/AliceO2Group/Control/executor/executorcmd/transitioner" pb "github.com/AliceO2Group/Control/executor/protos" "github.com/sirupsen/logrus" - "google.golang.org/grpc/status" + grpcstatus "google.golang.org/grpc/status" ) type ControlTransport uint32 @@ -164,7 +164,7 @@ func (r *RpcClient) doTransition(ei transitioner.EventInfo) (newState string, er }, grpc.EmptyCallOption{}) if err != nil { - status, ok := status.FromError(err) + status, ok := grpcstatus.FromError(err) if ok { r.Log.WithFields(logrus.Fields{ "code": status.Code().String(), From 6c4ed40a0bf54d7ec44f11139e642204ed5523c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 4 Jun 2025 11:08:07 +0200 Subject: [PATCH 2170/2352] Bump to v1.38.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 36c8be205..5099f5671 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 37 +VERSION_MINOR := 38 VERSION_PATCH := 0 From 813b1cf96c716dec1db12f838814ed48e1731dfd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 3 Jun 2025 17:18:12 +0200 Subject: [PATCH 2171/2352] [core] sorting active environmets in kafka plugin --- core/integration/kafka/plugin.go | 29 +++++++++++- core/integration/kafka/plugin_test.go | 65 +++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 1 deletion(-) create mode 100644 core/integration/kafka/plugin_test.go diff --git a/core/integration/kafka/plugin.go b/core/integration/kafka/plugin.go index 29f96f548..f20b50ee9 100644 --- a/core/integration/kafka/plugin.go +++ b/core/integration/kafka/plugin.go @@ -31,6 +31,7 @@ import ( "encoding/json" "errors" "net/url" + "slices" "strconv" "strings" "sync" @@ -304,9 +305,36 @@ func (p *Plugin) GetRunningEnvList() []*kafkapb.EnvInfo { for _, v := range p.envsInRunning { array = append(array, v) } + + p.SortRunningEnvList(array) + p.SortDetectorsOfRunningEnvs(array) return array } +// OCTRL-932 we sort the active envs here are grafana cannot do it +// order is defined as: +// 1) runs with more than 2 detectors first +// 2) if there are more than 2 runs with more than 2 detectors, those with ITS should be first +func (p *Plugin) SortRunningEnvList(activeEnvs []*kafkapb.EnvInfo) { + slices.SortStableFunc(activeEnvs, func(a, b *kafkapb.EnvInfo) int { + if len(a.Detectors) >= 2 && len(b.Detectors) >= 2 { + if slices.Contains(a.Detectors, "ITS") { + return -1 + } + if slices.Contains(b.Detectors, "ITS") { + return 1 + } + } + return len(b.Detectors) - len(a.Detectors) + }) +} + +func (p *Plugin) SortDetectorsOfRunningEnvs(activeEnvs []*kafkapb.EnvInfo) { + for _, env := range activeEnvs { + slices.Sort(env.Detectors) + } +} + func (p *Plugin) produceMessage(message []byte, topic string, envId string, call string) { log.WithField("call", call). WithField("partition", envId). @@ -317,7 +345,6 @@ func (p *Plugin) produceMessage(message []byte, topic string, envId string, call Topic: topic, Value: message, }) - if err != nil { log.WithField("call", call). WithField("partition", envId). diff --git a/core/integration/kafka/plugin_test.go b/core/integration/kafka/plugin_test.go new file mode 100644 index 000000000..6ae6442ba --- /dev/null +++ b/core/integration/kafka/plugin_test.go @@ -0,0 +1,65 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package kafka + +import ( + "testing" + + kafkapb "github.com/AliceO2Group/Control/core/integration/kafka/protos" +) + +func TestSortActiveRuns(t *testing.T) { + p := Plugin{} + p.SortRunningEnvList(nil) + + var envs []*kafkapb.EnvInfo + envs = append(envs, + &kafkapb.EnvInfo{EnvironmentId: "1", Detectors: []string{"first"}}, + &kafkapb.EnvInfo{EnvironmentId: "2", Detectors: []string{"second"}}, + &kafkapb.EnvInfo{EnvironmentId: "3", Detectors: []string{"ITS", "first"}}, + &kafkapb.EnvInfo{EnvironmentId: "4", Detectors: []string{"first", "second", "third"}}) + + p.SortRunningEnvList(envs) + + if len(envs) != 4 { + t.Error("wrong number of environments") + } + + if envs[0].EnvironmentId != "3" { + t.Errorf("first should have been environment 3, but is %s with dets %v", envs[0].EnvironmentId, envs[0].Detectors) + } + + if envs[1].EnvironmentId != "4" { + t.Errorf("second should have been environment 4, but is %s with dets %v", envs[1].EnvironmentId, envs[1].Detectors) + } + + if envs[2].EnvironmentId != "1" { + t.Errorf("third should have been environment 1, but is %s with dets %v", envs[2].EnvironmentId, envs[2].Detectors) + } + + if envs[3].EnvironmentId != "2" { + t.Errorf("fourth should have been environment 2, but is %s with dets %v", envs[3].EnvironmentId, envs[3].Detectors) + } +} From f964dace797c56b947e2375016b2eef400c6137c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 4 Jun 2025 15:20:44 +0200 Subject: [PATCH 2172/2352] Bump to v1.39.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5099f5671..d184ae191 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 38 +VERSION_MINOR := 39 VERSION_PATCH := 0 From 9bc69ed379f2897ab4658495ea6bba2fdd6db466 Mon Sep 17 00:00:00 2001 From: Giulio Eulisse <10544+ktf@users.noreply.github.com> Date: Fri, 13 Jun 2025 07:38:55 +0200 Subject: [PATCH 2173/2352] Avoid specifying the version It does not work and it's in any case obsolete. --- occ/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index 81c89a57b..b8692da52 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -151,10 +151,10 @@ list(APPEND CMAKE_PREFIX_PATH list(APPEND BOOST_COMPONENTS program_options) -find_package(FairMQ 1.4.2 REQUIRED) +find_package(FairMQ REQUIRED) if (${FairMQ_FOUND}) message(STATUS "Found FairMQ ${FairMQ_VERSION}") - find_package(FairLogger ${FairMQ_FairLogger_VERSION} REQUIRED) + find_package(FairLogger REQUIRED) if (${FairLogger_FOUND}) message(STATUS "Found FairLogger ${FairLogger_VERSION}") endif() From abfdabfb4a0448e578ff93e819f009b2310712de Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 16 Jun 2025 11:06:32 +0200 Subject: [PATCH 2174/2352] Bump to v1.39.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index d184ae191..ddc9b04e8 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 39 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 2273185825f6525f44767fbb54b7bf901a6af55d Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 1 Jul 2025 17:17:51 +0200 Subject: [PATCH 2175/2352] Fix link in operation_order --- docs/handbook/operation_order.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 50dac7147..66ef2028d 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -1,7 +1,7 @@ # Environment operation order This chapter attempts to document the order of important operations done during environment transitions. -Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [environment.go][https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. +Since AliECS is an evolving system, the information presented here might be out-of-date, thus please refer to event handling in [environment.go](https://github.com/AliceO2Group/Control/blob/master/core/environment/environment.go) and plugin calls in [ControlWorkflows/workflows/readout-dataflow.yaml](https://github.com/AliceO2Group/ControlWorkflows/blob/master/workflows/readout-dataflow.yaml) for the ultimate source of truth. Also, please report to the ECS developers any inaccuracies. ## State machine triggers @@ -99,4 +99,4 @@ This is the order of actions happening at a healthy end of run. - `"run_end_completion_time_ms"` is set using current time. It is considered as the EOEOR timestamp. - `after_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `ccdb.RunStop()` at `0` - - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` \ No newline at end of file + - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` From a9328db987de31408f062cbddfa6308589ff8bec Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 27 Jun 2025 08:58:35 +0200 Subject: [PATCH 2176/2352] [core] propagate original_run_number as FairMQ property to tasks Closes OCTRL-1032 --- core/environment/transition_startactivity.go | 1 + core/integration/odc/plugin.go | 4 ++++ docs/handbook/configuration.md | 1 + 3 files changed, 6 insertions(+) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 8ed1b5fcc..86f13cbad 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -94,6 +94,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "lhc_period", "pdp_beam_type", "pdp_override_run_start_time", + "original_run_number", } { if value, ok := cvs[key]; ok { // we push the above parameters with both camelCase and snake_case identifiers for convenience diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 96d0102ab..b1550e952 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1365,6 +1365,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Start"). Warn("cannot acquire run number for ODC") } + originalRunNumber, _ := varStack["original_run_number"] cleanupCountS, ok := varStack["__fmq_cleanup_count"] if !ok { log.WithField("partition", envId). @@ -1407,6 +1408,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments["runNumber"] = rn arguments["run_start_time_ms"] = runStartTimeMs arguments["cleanup"] = strconv.Itoa(cleanupCount) + if len(originalRunNumber) > 0 { + arguments["original_run_number"] = originalRunNumber + } ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 9f9376529..798114606 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -443,6 +443,7 @@ In addition to the above, which varies depending on the configuration of the env * `lhcPeriod` * `pdp_beam_type` * `pdp_override_run_start_time` + * `original_run_number` The following values are pushed by AliECS during `STOP_ACTIVITY`: From c083fa31bea6221bdea48f0568d8d2af7a156c20 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 7 Jul 2025 13:53:01 +0200 Subject: [PATCH 2177/2352] document what is safe about SafeStatus and SafeState OCTRL-873 --- core/workflow/safestate.go | 1 + core/workflow/safestatus.go | 1 + 2 files changed, 2 insertions(+) diff --git a/core/workflow/safestate.go b/core/workflow/safestate.go index 86c4f1197..a2673bda6 100644 --- a/core/workflow/safestate.go +++ b/core/workflow/safestate.go @@ -30,6 +30,7 @@ import ( "sync" ) +// SafeState is a thread-safe structure that holds the state of a role. type SafeState struct { mu sync.RWMutex state sm.State diff --git a/core/workflow/safestatus.go b/core/workflow/safestatus.go index 044e86be6..ac23d38ea 100644 --- a/core/workflow/safestatus.go +++ b/core/workflow/safestatus.go @@ -34,6 +34,7 @@ import ( "github.com/spf13/viper" ) +// SafeStatus is a thread-safe structure that holds the status of a role. type SafeStatus struct { mu sync.RWMutex status task.Status From 2df64d615d24d684d8ed3cce00653e8caa1d3d46 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 6 Mar 2025 13:37:57 +0100 Subject: [PATCH 2178/2352] [core] Demote cleanup script failures to Support OCTRL-983 --- core/environment/transition_deploy.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index ed7e6e455..34436be04 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -92,6 +92,7 @@ func (t DeployTransition) do(env *Environment) (err error) { localErr = cmd.Run() if localErr != nil { log.WithField("partition", env.Id().String()). + WithField("level", infologger.IL_Support). Warnf("cleanup script failed on %s : %s\n", flp, localErr.Error()) scriptErrors = multierror.Append(scriptErrors, fmt.Errorf("cleanup unsuccessful on %s: %w", flp, localErr)) } else { @@ -197,6 +198,7 @@ func (t DeployTransition) do(env *Environment) (err error) { } if err != nil { log.WithField("partition", env.Id().String()). + WithField("level", infologger.IL_Ops). Warnf("pre-deployment cleanup, %s", err.Error()) err = nil // we don't want to fail the deployment because of pre-deploy cleanup issues } From c187adfef199d03fb41760736ff71a9b669c90ea Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 10 Jul 2025 09:14:01 +0200 Subject: [PATCH 2179/2352] [build] Bump to v1.40.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index ddc9b04e8..457dc3512 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 39 -VERSION_PATCH := 1 +VERSION_MINOR := 40 +VERSION_PATCH := 0 From fcc429d19e3d2174d0bc6d9a7fef1d363aeca7af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 24 Jul 2025 16:21:05 +0200 Subject: [PATCH 2180/2352] [all] regenerated protofiles to unify their version of protoc --- apricot/protos/apricot.pb.go | 2 +- apricot/protos/apricot_grpc.pb.go | 2 +- coconut/protos/o2control.pb.go | 1499 +++++++++-------- coconut/protos/o2control_grpc.pb.go | 16 +- common/protos/common.pb.go | 4 +- common/protos/events.pb.go | 207 ++- .../bookkeeping/protos/bkcommon.pb.go | 4 +- .../bookkeeping/protos/environment.pb.go | 4 +- .../bookkeeping/protos/environment_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/flp.pb.go | 4 +- .../bookkeeping/protos/flp_grpc.pb.go | 2 +- .../bookkeeping/protos/lhcFill.pb.go | 4 +- .../bookkeeping/protos/lhcFill_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/log.pb.go | 4 +- .../bookkeeping/protos/log_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/run.pb.go | 4 +- .../bookkeeping/protos/run_grpc.pb.go | 2 +- core/integration/dcs/protos/dcs.pb.go | 4 +- core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- core/integration/ddsched/protos/ddsched.pb.go | 17 +- .../ddsched/protos/ddsched_grpc.pb.go | 39 +- core/integration/kafka/protos/kafka.pb.go | 4 +- core/integration/odc/protos/odc.pb.go | 4 +- core/integration/odc/protos/odc_grpc.pb.go | 2 +- core/integration/trg/protos/ctpecs.pb.go | 4 +- core/integration/trg/protos/ctpecs_grpc.pb.go | 57 +- core/protos/o2control.pb.go | 2 +- core/protos/o2control_grpc.pb.go | 2 +- executor/protos/occ.pb.go | 4 +- executor/protos/occ_grpc.pb.go | 46 +- 30 files changed, 1020 insertions(+), 931 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index e60821d40..27a6b18f7 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.33.0 -// protoc v3.12.4 +// protoc v6.31.1 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index 25f695a15..b9b6e1ee6 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v3.12.4 +// - protoc v6.31.1 // source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 99d90d49c..5736c718e 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.33.0 -// protoc v5.29.2 +// protoc v6.31.1 // source: protos/o2control.proto package pb @@ -496,7 +496,7 @@ type GetFrameworkInfoReply struct { DetectorsInInstance []string `protobuf:"bytes,9,rep,name=detectorsInInstance,proto3" json:"detectorsInInstance,omitempty"` ActiveDetectors []string `protobuf:"bytes,10,rep,name=activeDetectors,proto3" json:"activeDetectors,omitempty"` AvailableDetectors []string `protobuf:"bytes,11,rep,name=availableDetectors,proto3" json:"availableDetectors,omitempty"` - Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,12,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetFrameworkInfoReply) Reset() { @@ -709,8 +709,9 @@ type GetEnvironmentsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` - ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` + ShowAll bool `protobuf:"varint,1,opt,name=showAll,proto3" json:"showAll,omitempty"` + ShowTaskInfos bool `protobuf:"varint,2,opt,name=showTaskInfos,proto3" json:"showTaskInfos,omitempty"` + ShowDetailedIntegratedServices bool `protobuf:"varint,3,opt,name=showDetailedIntegratedServices,proto3" json:"showDetailedIntegratedServices,omitempty"` // integratedServices are returned everytime, setting this flag gives detailed report } func (x *GetEnvironmentsRequest) Reset() { @@ -759,6 +760,13 @@ func (x *GetEnvironmentsRequest) GetShowTaskInfos() bool { return false } +func (x *GetEnvironmentsRequest) GetShowDetailedIntegratedServices() bool { + if x != nil { + return x.ShowDetailedIntegratedServices + } + return false +} + type GetEnvironmentsReply struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -766,7 +774,7 @@ type GetEnvironmentsReply struct { FrameworkId string `protobuf:"bytes,1,opt,name=frameworkId,proto3" json:"frameworkId,omitempty"` Environments []*EnvironmentInfo `protobuf:"bytes,2,rep,name=environments,proto3" json:"environments,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetEnvironmentsReply) Reset() { @@ -1091,7 +1099,7 @@ type NewEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Public bool `protobuf:"varint,2,opt,name=public,proto3" json:"public,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *NewEnvironmentReply) Reset() { @@ -1223,7 +1231,7 @@ type NewAutoEnvironmentReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *NewAutoEnvironmentReply) Reset() { @@ -1328,7 +1336,7 @@ type GetEnvironmentReply struct { Environment *EnvironmentInfo `protobuf:"bytes,1,opt,name=environment,proto3" json:"environment,omitempty"` Workflow *RoleInfo `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` Public bool `protobuf:"varint,3,opt,name=public,proto3" json:"public,omitempty"` - Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetEnvironmentReply) Reset() { @@ -1466,7 +1474,7 @@ type ControlEnvironmentReply struct { StartOfTransition int64 `protobuf:"varint,4,opt,name=startOfTransition,proto3" json:"startOfTransition,omitempty"` EndOfTransition int64 `protobuf:"varint,5,opt,name=endOfTransition,proto3" json:"endOfTransition,omitempty"` TransitionDuration int64 `protobuf:"varint,6,opt,name=transitionDuration,proto3" json:"transitionDuration,omitempty"` - Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,7,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ControlEnvironmentReply) Reset() { @@ -1816,7 +1824,7 @@ type DestroyEnvironmentReply struct { unknownFields protoimpl.UnknownFields CleanupTasksReply *CleanupTasksReply `protobuf:"bytes,1,opt,name=cleanupTasksReply,proto3" json:"cleanupTasksReply,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *DestroyEnvironmentReply) Reset() { @@ -1871,7 +1879,7 @@ type GetActiveDetectorsReply struct { unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetActiveDetectorsReply) Reset() { @@ -1926,7 +1934,7 @@ type GetAvailableDetectorsReply struct { unknownFields protoimpl.UnknownFields Detectors []string `protobuf:"bytes,1,rep,name=detectors,proto3" json:"detectors,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetAvailableDetectorsReply) Reset() { @@ -2431,7 +2439,7 @@ type GetTasksReply struct { unknownFields protoimpl.UnknownFields Tasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=tasks,proto3" json:"tasks,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetTasksReply) Reset() { @@ -2533,7 +2541,7 @@ type GetTaskReply struct { unknownFields protoimpl.UnknownFields Task *TaskInfo `protobuf:"bytes,1,opt,name=task,proto3" json:"task,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetTaskReply) Reset() { @@ -2873,7 +2881,7 @@ type CleanupTasksReply struct { KilledTasks []*ShortTaskInfo `protobuf:"bytes,1,rep,name=killedTasks,proto3" json:"killedTasks,omitempty"` RunningTasks []*ShortTaskInfo `protobuf:"bytes,2,rep,name=runningTasks,proto3" json:"runningTasks,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *CleanupTasksReply) Reset() { @@ -3120,7 +3128,7 @@ type GetRolesReply struct { unknownFields protoimpl.UnknownFields Roles []*RoleInfo `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetRolesReply) Reset() { @@ -3460,7 +3468,7 @@ type GetWorkflowTemplatesReply struct { unknownFields protoimpl.UnknownFields WorkflowTemplates []*WorkflowTemplateInfo `protobuf:"bytes,1,rep,name=workflowTemplates,proto3" json:"workflowTemplates,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *GetWorkflowTemplatesReply) Reset() { @@ -3634,7 +3642,7 @@ type ListReposReply struct { Repos []*RepoInfo `protobuf:"bytes,1,rep,name=repos,proto3" json:"repos,omitempty"` GlobalDefaultRevision string `protobuf:"bytes,2,opt,name=globalDefaultRevision,proto3" json:"globalDefaultRevision,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ListReposReply) Reset() { @@ -3752,7 +3760,7 @@ type AddRepoReply struct { NewDefaultRevision string `protobuf:"bytes,1,opt,name=newDefaultRevision,proto3" json:"newDefaultRevision,omitempty"` Info string `protobuf:"bytes,2,opt,name=info,proto3" json:"info,omitempty"` - Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *AddRepoReply) Reset() { @@ -3861,7 +3869,7 @@ type RemoveRepoReply struct { unknownFields protoimpl.UnknownFields NewDefaultRepo string `protobuf:"bytes,1,opt,name=newDefaultRepo,proto3" json:"newDefaultRepo,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *RemoveRepoReply) Reset() { @@ -4112,7 +4120,7 @@ type SetRepoDefaultRevisionReply struct { unknownFields protoimpl.UnknownFields Info string `protobuf:"bytes,1,opt,name=info,proto3" json:"info,omitempty"` - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *SetRepoDefaultRevisionReply) Reset() { @@ -4205,7 +4213,7 @@ type ListIntegratedServicesReply struct { unknownFields protoimpl.UnknownFields Services map[string]*IntegratedServiceInfo `protobuf:"bytes,1,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // keys are IDs (e.g. "ddsched"), the service name should be displayed to users instead - Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // timestamp of when this object was sent in unix milliseconds } func (x *ListIntegratedServicesReply) Reset() { @@ -4388,744 +4396,749 @@ var file_protos_o2control_proto_rawDesc = []byte{ 0x29, 0x0a, 0x0f, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x65, - 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x47, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, 0x12, - 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, - 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x22, 0x96, 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, - 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, - 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, - 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, - 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, - 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, - 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, - 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, + 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0xa0, 0x01, 0x0a, 0x16, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x68, 0x6f, 0x77, 0x41, 0x6c, 0x6c, + 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x73, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1e, + 0x73, 0x68, 0x6f, 0x77, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x49, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x22, 0x96, + 0x01, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x72, 0x61, 0x6d, 0x65, + 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x72, + 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdb, 0x08, 0x0a, 0x0f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x57, 0x68, 0x65, 0x6e, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, + 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, + 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x73, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x6c, 0x70, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x46, 0x6c, 0x70, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, + 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x6e, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, - 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, - 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0d, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x34, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, + 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, + 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, + 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, + 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, + 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x49, 0x0a, 0x1b, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, - 0x15, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, - 0x72, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x26, 0x0a, 0x0e, 0x61, 0x75, - 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, - 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, - 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, - 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, - 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x89, 0x01, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x84, 0x02, 0x0a, 0x19, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x42, 0x0a, 0x04, 0x76, 0x61, + 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x56, + 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2e, + 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, + 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x37, 0x0a, 0x17, 0x4e, 0x65, 0x77, 0x41, 0x75, + 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x22, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, + 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x72, 0x65, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x73, 0x68, 0x6f, 0x77, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x72, 0x65, 0x65, 0x22, 0xba, 0x01, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3c, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x12, 0x1c, 0x0a, 0x09, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x8b, 0x02, 0x0a, 0x19, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, - 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, - 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, - 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, - 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, - 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, - 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, - 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, - 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, - 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, - 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, - 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, - 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, - 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, + 0x12, 0x3f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, + 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x54, 0x4f, + 0x50, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x52, + 0x45, 0x53, 0x45, 0x54, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x10, 0x06, + 0x22, 0x91, 0x02, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, + 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x52, 0x75, 0x6e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, + 0x0a, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x0f, + 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4f, 0x66, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, - 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, - 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, + 0x64, 0x12, 0x3f, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x65, 0x41, 0x6c, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x6c, 0x6c, 0x22, 0xa1, 0x01, 0x0a, 0x14, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x4f, 0x70, 0x74, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x72, 0x6f, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x31, 0x0a, 0x06, 0x4f, + 0x70, 0x74, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4f, 0x50, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x03, + 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x44, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x10, 0x04, 0x22, 0x8b, + 0x01, 0x0a, 0x16, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4b, 0x0a, 0x10, 0x66, 0x61, 0x69, + 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0xc1, 0x01, 0x0a, + 0x19, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, + 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, + 0x65, 0x65, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x49, 0x6e, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x49, 0x6e, 0x52, 0x75, + 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x2e, 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x22, 0x83, 0x01, 0x0a, 0x17, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4a, 0x0a, 0x11, + 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x52, 0x11, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x55, 0x0a, - 0x17, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, - 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, - 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, - 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, - 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, - 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, - 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, - 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, - 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, - 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, - 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, - 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, - 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, - 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, - 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, - 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, - 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, - 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, - 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, - 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, - 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, - 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, - 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, - 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, - 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, - 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, - 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, - 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x58, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xcc, 0x01, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x5a, 0x0a, 0x0a, 0x70, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x3a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1f, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x73, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, + 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x63, 0x6c, 0x75, 0x64, 0x65, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x22, 0xb8, 0x01, 0x0a, + 0x1d, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x58, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, + 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd8, 0x02, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x72, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, + 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x6c, 0x61, 0x73, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, + 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x61, 0x6e, 0x64, 0x62, + 0x6f, 0x78, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x61, 0x69, + 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6c, 0x61, + 0x69, 0x6d, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, + 0x61, 0x6c, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x54, 0x61, 0x73, 0x6b, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6f, 0x66, 0x66, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x28, 0x0a, 0x0e, 0x47, + 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, + 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x7d, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0b, 0x43, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0xbe, 0x03, 0x0a, 0x08, 0x54, + 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x40, 0x0a, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x0f, 0x69, 0x6e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, + 0x73, 0x12, 0x42, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, + 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x68, 0x61, + 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x12, 0x38, 0x0a, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x1a, 0x0a, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x74, 0x61, 0x73, 0x6b, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x6e, 0x76, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, 0x76, 0x49, + 0x64, 0x12, 0x43, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x6f, 0x70, 0x65, + 0x72, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x70, + 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x2f, 0x0a, 0x13, 0x43, + 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x73, 0x22, 0xab, 0x01, 0x0a, + 0x11, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x12, 0x3a, 0x0a, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x0b, 0x6b, 0x69, 0x6c, 0x6c, 0x65, 0x64, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x3c, + 0x0a, 0x0c, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x68, 0x6f, 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, + 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x6e, 0x76, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6e, + 0x76, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x74, 0x68, 0x53, 0x70, 0x65, 0x63, 0x22, + 0xd3, 0x05, 0x0a, 0x08, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x66, 0x75, 0x6c, 0x6c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x61, + 0x73, 0x6b, 0x49, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x61, 0x73, + 0x6b, 0x49, 0x64, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, + 0x3d, 0x0a, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, + 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x31, + 0x0a, 0x04, 0x76, 0x61, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, - 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, - 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, - 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, - 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, - 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, - 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, - 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, - 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, - 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, - 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, - 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, - 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, - 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, - 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, - 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, - 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, - 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, - 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, - 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, - 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, - 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, - 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, - 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, + 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, + 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, + 0x12, 0x58, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x61, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x61, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x3b, 0x0a, 0x0d, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x1a, 0x3b, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x72, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x53, + 0x74, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, + 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, - 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, - 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, - 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, - 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, - 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, + 0xc9, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x72, 0x65, 0x70, 0x6f, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, + 0x6e, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, + 0x74, 0x65, 0x72, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x74, 0x74, 0x65, 0x72, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x61, + 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0b, 0x61, 0x6c, 0x6c, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x61, 0x6c, 0x6c, 0x54, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x6c, 0x6c, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, + 0x6c, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x22, 0xae, 0x04, 0x0a, 0x0e, + 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, + 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, + 0x0a, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, + 0x65, 0x74, 0x52, 0x06, 0x77, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, + 0x6e, 0x65, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x6e, 0x65, 0x6c, + 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1c, 0x0a, 0x09, + 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x76, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x49, 0x66, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x49, 0x66, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x22, 0x71, 0x0a, 0x08, + 0x55, 0x69, 0x57, 0x69, 0x64, 0x67, 0x65, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x64, 0x69, 0x74, + 0x42, 0x6f, 0x78, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x6c, 0x69, 0x73, 0x74, 0x42, 0x6f, 0x78, 0x10, 0x02, 0x12, 0x0f, + 0x0a, 0x0b, 0x64, 0x72, 0x6f, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x42, 0x6f, 0x78, 0x10, 0x03, 0x12, + 0x0c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x62, 0x6f, 0x42, 0x6f, 0x78, 0x10, 0x04, 0x12, 0x12, 0x0a, + 0x0e, 0x72, 0x61, 0x64, 0x69, 0x6f, 0x42, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x42, 0x6f, 0x78, 0x10, + 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x6f, 0x78, 0x10, 0x06, 0x22, + 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x10, 0x01, 0x12, + 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x6c, 0x69, 0x73, + 0x74, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x10, 0x04, 0x22, 0xaf, 0x02, 0x0a, + 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4f, 0x0a, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, 0x70, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x61, + 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x76, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x58, 0x0a, 0x0f, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, + 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x56, 0x61, 0x72, 0x53, 0x70, 0x65, 0x63, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, + 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x4d, 0x0a, 0x11, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x36, 0x0a, 0x10, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x67, 0x65, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x80, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x8f, 0x01, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, + 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x72, 0x65, 0x70, + 0x6f, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x15, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x4e, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x70, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x29, 0x0a, 0x11, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x57, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x2b, 0x0a, 0x13, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x2d, 0x0a, 0x15, 0x53, 0x65, 0x74, + 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x3d, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x51, 0x0a, 0x1d, 0x53, 0x65, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1a, + 0x0a, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x4f, 0x0a, 0x1b, 0x53, 0x65, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, - 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, - 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, - 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x07, 0x0a, 0x05, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x1b, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x12, 0x50, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x1a, 0x5d, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x9f, 0x01, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, + 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, 0xeb, 0x10, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x12, 0x5a, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x57, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, + 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, + 0x65, 0x77, 0x41, 0x75, 0x74, 0x6f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x4e, 0x65, 0x77, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, + 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, + 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, + 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x12, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x45, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x60, 0x0a, - 0x12, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x12, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x44, 0x65, 0x73, 0x74, 0x72, 0x6f, 0x79, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x4c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x22, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x52, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x74, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x25, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, - 0x65, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x59, 0x0a, 0x13, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4e, 0x65, 0x77, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, - 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, - 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, - 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, - 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, - 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, - 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, - 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, - 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, - 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, - 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, - 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, - 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, - 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, - 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, - 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, - 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, - 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, - 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, + 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, + 0x74, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x07, 0x47, 0x65, 0x74, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x47, 0x65, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0c, 0x43, 0x6c, + 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x75, 0x70, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, + 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x66, + 0x0a, 0x14, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x70, 0x6f, 0x73, 0x12, 0x1b, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x1c, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x70, 0x6f, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0e, + 0x53, 0x65, 0x74, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x12, 0x20, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x18, 0x53, 0x65, 0x74, 0x47, 0x6c, 0x6f, 0x62, 0x61, + 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x2a, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, + 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x10, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x6c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, + 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x2e, 0x6f, 0x32, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, + 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x53, 0x65, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x09, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x32, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x00, 0x30, 0x01, 0x12, 0x53, 0x0a, 0x15, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x12, 0x10, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x26, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x22, 0x00, + 0x12, 0x42, 0x0a, 0x08, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x1a, 0x2e, 0x6f, + 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x54, 0x65, 0x61, 0x72, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x70, + 0x6c, 0x79, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x11, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x2e, 0x6f, 0x32, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6f, 0x32, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x79, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x70, 0x6c, + 0x79, 0x22, 0x00, 0x42, 0x54, 0x0a, 0x22, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, + 0x72, 0x70, 0x63, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5a, 0x2e, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 942f75d1e..491e21d26 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.29.2 +// - protoc v6.31.1 // source: protos/o2control.proto package pb @@ -77,13 +77,20 @@ const ( type ControlClient interface { GetFrameworkInfo(ctx context.Context, in *GetFrameworkInfoRequest, opts ...grpc.CallOption) (*GetFrameworkInfoReply, error) GetEnvironments(ctx context.Context, in *GetEnvironmentsRequest, opts ...grpc.CallOption) (*GetEnvironmentsReply, error) + // Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewAutoEnvironment(ctx context.Context, in *NewAutoEnvironmentRequest, opts ...grpc.CallOption) (*NewAutoEnvironmentReply, error) + // Creates a new environment. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewEnvironment(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetEnvironment(ctx context.Context, in *GetEnvironmentRequest, opts ...grpc.CallOption) (*GetEnvironmentReply, error) ControlEnvironment(ctx context.Context, in *ControlEnvironmentRequest, opts ...grpc.CallOption) (*ControlEnvironmentReply, error) DestroyEnvironment(ctx context.Context, in *DestroyEnvironmentRequest, opts ...grpc.CallOption) (*DestroyEnvironmentReply, error) GetActiveDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetActiveDetectorsReply, error) GetAvailableDetectors(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAvailableDetectorsReply, error) + // Creates a new environment. + // It returns once an environment ID is created and continues the creation asynchronously to the call. + // The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. NewEnvironmentAsync(ctx context.Context, in *NewEnvironmentRequest, opts ...grpc.CallOption) (*NewEnvironmentReply, error) GetTasks(ctx context.Context, in *GetTasksRequest, opts ...grpc.CallOption) (*GetTasksReply, error) GetTask(ctx context.Context, in *GetTaskRequest, opts ...grpc.CallOption) (*GetTaskReply, error) @@ -375,13 +382,20 @@ func (c *controlClient) ModifyEnvironment(ctx context.Context, in *ModifyEnviron type ControlServer interface { GetFrameworkInfo(context.Context, *GetFrameworkInfoRequest) (*GetFrameworkInfoReply, error) GetEnvironments(context.Context, *GetEnvironmentsRequest) (*GetEnvironmentsReply, error) + // Creates a new environment which automatically follows one STANDBY->RUNNING->DONE cycle in the state machine. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewAutoEnvironment(context.Context, *NewAutoEnvironmentRequest) (*NewAutoEnvironmentReply, error) + // Creates a new environment. + // It returns only once the environment reaches the CONFIGURED state or upon any earlier failure. NewEnvironment(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetEnvironment(context.Context, *GetEnvironmentRequest) (*GetEnvironmentReply, error) ControlEnvironment(context.Context, *ControlEnvironmentRequest) (*ControlEnvironmentReply, error) DestroyEnvironment(context.Context, *DestroyEnvironmentRequest) (*DestroyEnvironmentReply, error) GetActiveDetectors(context.Context, *Empty) (*GetActiveDetectorsReply, error) GetAvailableDetectors(context.Context, *Empty) (*GetAvailableDetectorsReply, error) + // Creates a new environment. + // It returns once an environment ID is created and continues the creation asynchronously to the call. + // The environment will be listed in GetEnvironments() only once the workflow is loaded and deployment starts. NewEnvironmentAsync(context.Context, *NewEnvironmentRequest) (*NewEnvironmentReply, error) GetTasks(context.Context, *GetTasksRequest) (*GetTasksReply, error) GetTask(context.Context, *GetTaskRequest) (*GetTaskReply, error) diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index da2413f6f..a59816e25 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/common.proto package pb diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index a3654453e..781ab111c 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.3 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/events.proto package pb @@ -447,7 +447,7 @@ type Ev_TaskEvent struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // task name, based on the name of the task class Taskid string `protobuf:"bytes,2,opt,name=taskid,proto3" json:"taskid,omitempty"` // task id, unique State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // state machine state for this task - Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // active/inactive etc. + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` // posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. Hostname string `protobuf:"bytes,5,opt,name=hostname,proto3" json:"hostname,omitempty"` ClassName string `protobuf:"bytes,6,opt,name=className,proto3" json:"className,omitempty"` // name of the task class from which this task was spawned Traits *Traits `protobuf:"bytes,7,opt,name=traits,proto3" json:"traits,omitempty"` @@ -659,7 +659,7 @@ type Ev_RoleEvent struct { unknownFields protoimpl.UnknownFields Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // role name - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // active/inactive etc., derived from the state of child tasks, calls or other roles + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` // posible values: ACTIVE/INACTIVE/PARTIAL/UNDEFINED/UNDEPLOYABLE as defined in status.go. Derived from the state of child tasks, calls or other roles State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` // state machine state for this role RolePath string `protobuf:"bytes,4,opt,name=rolePath,proto3" json:"rolePath,omitempty"` // path to this role within the environment EnvironmentId string `protobuf:"bytes,5,opt,name=environmentId,proto3" json:"environmentId,omitempty"` @@ -840,14 +840,13 @@ type Ev_RunEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` - RunNumber uint32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` - State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Transition string `protobuf:"bytes,5,opt,name=transition,proto3" json:"transition,omitempty"` - TransitionStatus OpStatus `protobuf:"varint,6,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` - Vars map[string]string `protobuf:"bytes,7,rep,name=vars,proto3" json:"vars,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - LastRequestUser *User `protobuf:"bytes,8,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` + EnvironmentId string `protobuf:"bytes,1,opt,name=environmentId,proto3" json:"environmentId,omitempty"` + RunNumber uint32 `protobuf:"varint,2,opt,name=runNumber,proto3" json:"runNumber,omitempty"` + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + Transition string `protobuf:"bytes,5,opt,name=transition,proto3" json:"transition,omitempty"` + TransitionStatus OpStatus `protobuf:"varint,6,opt,name=transitionStatus,proto3,enum=events.OpStatus" json:"transitionStatus,omitempty"` + LastRequestUser *User `protobuf:"bytes,8,opt,name=lastRequestUser,proto3" json:"lastRequestUser,omitempty"` } func (x *Ev_RunEvent) Reset() { @@ -924,13 +923,6 @@ func (x *Ev_RunEvent) GetTransitionStatus() OpStatus { return OpStatus_NULL } -func (x *Ev_RunEvent) GetVars() map[string]string { - if x != nil { - return x.Vars - } - return nil -} - func (x *Ev_RunEvent) GetLastRequestUser() *User { if x != nil { return x.LastRequestUser @@ -1254,7 +1246,7 @@ var file_protos_events_proto_rawDesc = []byte{ 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xff, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x99, 0x02, 0x0a, 0x0b, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, @@ -1268,75 +1260,68 @@ var file_protos_events_proto_rawDesc = []byte{ 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x76, - 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x56, - 0x61, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x76, 0x61, 0x72, 0x73, 0x12, 0x36, - 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x1a, 0x37, 0x0a, 0x09, 0x56, 0x61, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd1, 0x05, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x49, 0x0a, - 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, - 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, - 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, - 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, - 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, - 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, - 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, - 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, - 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, - 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, - 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, - 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0b, 0x4a, 0x04, 0x08, - 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, - 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, - 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, - 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, - 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, - 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, - 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, - 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x36, 0x0a, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xd1, 0x05, 0x0a, 0x05, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, + 0x6e, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x49, 0x0a, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x45, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, + 0x52, 0x10, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x74, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, + 0x76, 0x5f, 0x54, 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x74, + 0x61, 0x73, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x72, 0x6f, 0x6c, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x52, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x09, 0x72, 0x6f, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x34, + 0x0a, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x43, 0x61, + 0x6c, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x09, 0x63, 0x61, 0x6c, 0x6c, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x16, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, + 0x52, 0x75, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x72, 0x75, 0x6e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, + 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x5f, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x77, 0x6f, 0x72, 0x6b, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, + 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x4d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, 0x61, 0x72, + 0x74, 0x62, 0x65, 0x61, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x65, 0x73, 0x6f, 0x73, 0x48, 0x65, + 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x48, 0x0a, 0x0e, + 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x67, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, + 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, + 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, + 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, + 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, + 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, + 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, + 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, + 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, + 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1352,7 +1337,7 @@ func file_protos_events_proto_rawDescGZIP() []byte { } var file_protos_events_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_protos_events_proto_goTypes = []interface{}{ (OpStatus)(0), // 0: events.OpStatus (*Ev_MetaEvent_MesosHeartbeat)(nil), // 1: events.Ev_MetaEvent_MesosHeartbeat @@ -1367,37 +1352,35 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Ev_RunEvent)(nil), // 10: events.Ev_RunEvent (*Event)(nil), // 11: events.Event nil, // 12: events.Ev_EnvironmentEvent.VarsEntry - nil, // 13: events.Ev_RunEvent.VarsEntry - (*User)(nil), // 14: common.User - (*WorkflowTemplateInfo)(nil), // 15: common.WorkflowTemplateInfo + (*User)(nil), // 13: common.User + (*WorkflowTemplateInfo)(nil), // 14: common.WorkflowTemplateInfo } var file_protos_events_proto_depIdxs = []int32{ 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus 12, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry - 14, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User - 15, // 3: events.Ev_EnvironmentEvent.workflowTemplateInfo:type_name -> common.WorkflowTemplateInfo + 13, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User + 14, // 3: events.Ev_EnvironmentEvent.workflowTemplateInfo:type_name -> common.WorkflowTemplateInfo 5, // 4: events.Ev_TaskEvent.traits:type_name -> events.Traits 0, // 5: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus 5, // 6: events.Ev_CallEvent.traits:type_name -> events.Traits 0, // 7: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus 0, // 8: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus 0, // 9: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus - 13, // 10: events.Ev_RunEvent.vars:type_name -> events.Ev_RunEvent.VarsEntry - 14, // 11: events.Ev_RunEvent.lastRequestUser:type_name -> common.User - 4, // 12: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 6, // 13: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 8, // 14: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 7, // 15: events.Event.callEvent:type_name -> events.Ev_CallEvent - 9, // 16: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 10, // 17: events.Event.runEvent:type_name -> events.Ev_RunEvent - 3, // 18: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 1, // 19: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 2, // 20: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 21, // [21:21] is the sub-list for method output_type - 21, // [21:21] is the sub-list for method input_type - 21, // [21:21] is the sub-list for extension type_name - 21, // [21:21] is the sub-list for extension extendee - 0, // [0:21] is the sub-list for field type_name + 13, // 10: events.Ev_RunEvent.lastRequestUser:type_name -> common.User + 4, // 11: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 12: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 13: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 14: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 15: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 10, // 16: events.Event.runEvent:type_name -> events.Ev_RunEvent + 3, // 17: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 18: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 19: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 20, // [20:20] is the sub-list for method output_type + 20, // [20:20] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1557,7 +1540,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 1, - NumMessages: 13, + NumMessages: 12, NumExtensions: 0, NumServices: 0, }, diff --git a/core/integration/bookkeeping/protos/bkcommon.pb.go b/core/integration/bookkeeping/protos/bkcommon.pb.go index 881bc1ca4..3dfdfec7d 100644 --- a/core/integration/bookkeeping/protos/bkcommon.pb.go +++ b/core/integration/bookkeeping/protos/bkcommon.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 -// protoc v6.30.1 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/bkcommon.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index aa2c31c5d..8a9ef3735 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index 393fc5c2e..6a5e4ac67 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.28.2 +// - protoc v6.31.1 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index 750a3608d..b2158c08b 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index 40f5f3e19..9e03d15ef 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.28.2 +// - protoc v6.31.1 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill.pb.go b/core/integration/bookkeeping/protos/lhcFill.pb.go index 795321ac6..f1da1126b 100644 --- a/core/integration/bookkeeping/protos/lhcFill.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go index 5cfbe2c78..5d62f07b5 100644 --- a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.28.2 +// - protoc v6.31.1 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index da160cd66..0ca547fe2 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.28.2 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 4926be8b2..7660e7149 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.28.2 +// - protoc v6.31.1 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index 1fdb0a128..c223e5151 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 -// protoc v6.30.1 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/run.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index 586594d88..e21507950 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.30.1 +// - protoc v6.31.1 // source: protos/run.proto package bkpb diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index e816c6898..12d6a118a 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -24,8 +24,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v5.26.1 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index 7619406c4..b4dda5e37 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v5.26.1 +// - protoc v6.31.1 // source: protos/dcs.proto package dcspb diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index 6eb7f703d..d2dd6e746 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -1,7 +1,20 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \author Gvozden Nešković, Frankfurt Institute for Advanced Studies and Goethe University Frankfurt + // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 2ee5bbfec..123b564b6 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -1,9 +1,26 @@ +// Copyright 2019-2022 CERN and copyright holders of ALICE O2. +// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders. +// All rights not expressly granted are reserved. +// +// This software is distributed under the terms of the GNU General Public +// License v3 (GPL Version 3), copied verbatim in the file "COPYING". +// +// In applying this license CERN does not waive the privileges and immunities +// granted to it by virtue of its status as an Intergovernmental Organization +// or submit itself to any jurisdiction. + +/// \author Gvozden Nešković, Frankfurt Institute for Advanced Studies and Goethe University Frankfurt + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.6 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v6.31.1 // source: protos/ddsched.proto +// Changelog: +// 2021-02-08: - Initial version +// - Support for a single partition/environment: PartitionID = EnvironmentID + package ddpb import ( @@ -18,6 +35,12 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + DataDistributionControl_PartitionInitialize_FullMethodName = "/o2.DataDistribution.Control.DataDistributionControl/PartitionInitialize" + DataDistributionControl_PartitionTerminate_FullMethodName = "/o2.DataDistribution.Control.DataDistributionControl/PartitionTerminate" + DataDistributionControl_PartitionStatus_FullMethodName = "/o2.DataDistribution.Control.DataDistributionControl/PartitionStatus" +) + // DataDistributionControlClient is the client API for DataDistributionControl service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -38,7 +61,7 @@ func NewDataDistributionControlClient(cc grpc.ClientConnInterface) DataDistribut func (c *dataDistributionControlClient) PartitionInitialize(ctx context.Context, in *PartitionInitRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { out := new(PartitionResponse) - err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionInitialize", in, out, opts...) + err := c.cc.Invoke(ctx, DataDistributionControl_PartitionInitialize_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -47,7 +70,7 @@ func (c *dataDistributionControlClient) PartitionInitialize(ctx context.Context, func (c *dataDistributionControlClient) PartitionTerminate(ctx context.Context, in *PartitionTermRequest, opts ...grpc.CallOption) (*PartitionResponse, error) { out := new(PartitionResponse) - err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionTerminate", in, out, opts...) + err := c.cc.Invoke(ctx, DataDistributionControl_PartitionTerminate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -56,7 +79,7 @@ func (c *dataDistributionControlClient) PartitionTerminate(ctx context.Context, func (c *dataDistributionControlClient) PartitionStatus(ctx context.Context, in *PartitionInfo, opts ...grpc.CallOption) (*PartitionResponse, error) { out := new(PartitionResponse) - err := c.cc.Invoke(ctx, "/o2.DataDistribution.Control.DataDistributionControl/PartitionStatus", in, out, opts...) + err := c.cc.Invoke(ctx, DataDistributionControl_PartitionStatus_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -108,7 +131,7 @@ func _DataDistributionControl_PartitionInitialize_Handler(srv interface{}, ctx c } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionInitialize", + FullMethod: DataDistributionControl_PartitionInitialize_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DataDistributionControlServer).PartitionInitialize(ctx, req.(*PartitionInitRequest)) @@ -126,7 +149,7 @@ func _DataDistributionControl_PartitionTerminate_Handler(srv interface{}, ctx co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionTerminate", + FullMethod: DataDistributionControl_PartitionTerminate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DataDistributionControlServer).PartitionTerminate(ctx, req.(*PartitionTermRequest)) @@ -144,7 +167,7 @@ func _DataDistributionControl_PartitionStatus_Handler(srv interface{}, ctx conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/o2.DataDistribution.Control.DataDistributionControl/PartitionStatus", + FullMethod: DataDistributionControl_PartitionStatus_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(DataDistributionControlServer).PartitionStatus(ctx, req.(*PartitionInfo)) diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go index 611436e98..baf618b92 100644 --- a/core/integration/kafka/protos/kafka.pb.go +++ b/core/integration/kafka/protos/kafka.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.6 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/kafka.proto package kafka diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 2c6a11814..cfaf4dc50 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 -// protoc v6.30.1 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/odc.proto package odc diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index 2252d2849..c2355ed1a 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.30.1 +// - protoc v6.31.1 // source: protos/odc.proto package odc diff --git a/core/integration/trg/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go index d175f1d27..664af7a49 100644 --- a/core/integration/trg/protos/ctpecs.pb.go +++ b/core/integration/trg/protos/ctpecs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v4.24.2 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/ctpecs.proto package ctpecs diff --git a/core/integration/trg/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go index 9376919dc..1e33ddc34 100644 --- a/core/integration/trg/protos/ctpecs_grpc.pb.go +++ b/core/integration/trg/protos/ctpecs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v4.24.2 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v6.31.1 // source: protos/ctpecs.proto package ctpecs @@ -18,6 +18,19 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + CTPd_PrepareForRun_FullMethodName = "/ctpd.CTPd/PrepareForRun" + CTPd_RunLoad_FullMethodName = "/ctpd.CTPd/RunLoad" + CTPd_RunUnload_FullMethodName = "/ctpd.CTPd/RunUnload" + CTPd_RunStart_FullMethodName = "/ctpd.CTPd/RunStart" + CTPd_RunStatus_FullMethodName = "/ctpd.CTPd/RunStatus" + CTPd_RunList_FullMethodName = "/ctpd.CTPd/RunList" + CTPd_RunStop_FullMethodName = "/ctpd.CTPd/RunStop" + CTPd_RunConfig_FullMethodName = "/ctpd.CTPd/RunConfig" + CTPd_RunCleanup_FullMethodName = "/ctpd.CTPd/RunCleanup" + CTPd_TPCReset_FullMethodName = "/ctpd.CTPd/TPCReset" +) + // CTPdClient is the client API for CTPd service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -46,7 +59,7 @@ func NewCTPdClient(cc grpc.ClientConnInterface) CTPdClient { func (c *cTPdClient) PrepareForRun(ctx context.Context, in *RunPrepareRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/PrepareForRun", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_PrepareForRun_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -55,7 +68,7 @@ func (c *cTPdClient) PrepareForRun(ctx context.Context, in *RunPrepareRequest, o func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunLoad", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunLoad_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -64,7 +77,7 @@ func (c *cTPdClient) RunLoad(ctx context.Context, in *RunLoadRequest, opts ...gr func (c *cTPdClient) RunUnload(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunUnload", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunUnload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -73,7 +86,7 @@ func (c *cTPdClient) RunUnload(ctx context.Context, in *RunStopRequest, opts ... func (c *cTPdClient) RunStart(ctx context.Context, in *RunStartRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStart", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunStart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -82,7 +95,7 @@ func (c *cTPdClient) RunStart(ctx context.Context, in *RunStartRequest, opts ... func (c *cTPdClient) RunStatus(ctx context.Context, in *RunStatusRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStatus", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunStatus_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -91,7 +104,7 @@ func (c *cTPdClient) RunStatus(ctx context.Context, in *RunStatusRequest, opts . func (c *cTPdClient) RunList(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunList", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunList_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -100,7 +113,7 @@ func (c *cTPdClient) RunList(ctx context.Context, in *Empty, opts ...grpc.CallOp func (c *cTPdClient) RunStop(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunStop", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunStop_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -109,7 +122,7 @@ func (c *cTPdClient) RunStop(ctx context.Context, in *RunStopRequest, opts ...gr func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunConfig", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunConfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -118,7 +131,7 @@ func (c *cTPdClient) RunConfig(ctx context.Context, in *RunStopRequest, opts ... func (c *cTPdClient) RunCleanup(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/RunCleanup", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_RunCleanup_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -127,7 +140,7 @@ func (c *cTPdClient) RunCleanup(ctx context.Context, in *Empty, opts ...grpc.Cal func (c *cTPdClient) TPCReset(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*RunReply, error) { out := new(RunReply) - err := c.cc.Invoke(ctx, "/ctpd.CTPd/TPCReset", in, out, opts...) + err := c.cc.Invoke(ctx, CTPd_TPCReset_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -208,7 +221,7 @@ func _CTPd_PrepareForRun_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/PrepareForRun", + FullMethod: CTPd_PrepareForRun_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).PrepareForRun(ctx, req.(*RunPrepareRequest)) @@ -226,7 +239,7 @@ func _CTPd_RunLoad_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunLoad", + FullMethod: CTPd_RunLoad_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunLoad(ctx, req.(*RunLoadRequest)) @@ -244,7 +257,7 @@ func _CTPd_RunUnload_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunUnload", + FullMethod: CTPd_RunUnload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunUnload(ctx, req.(*RunStopRequest)) @@ -262,7 +275,7 @@ func _CTPd_RunStart_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunStart", + FullMethod: CTPd_RunStart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStart(ctx, req.(*RunStartRequest)) @@ -280,7 +293,7 @@ func _CTPd_RunStatus_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunStatus", + FullMethod: CTPd_RunStatus_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStatus(ctx, req.(*RunStatusRequest)) @@ -298,7 +311,7 @@ func _CTPd_RunList_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunList", + FullMethod: CTPd_RunList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunList(ctx, req.(*Empty)) @@ -316,7 +329,7 @@ func _CTPd_RunStop_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunStop", + FullMethod: CTPd_RunStop_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunStop(ctx, req.(*RunStopRequest)) @@ -334,7 +347,7 @@ func _CTPd_RunConfig_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunConfig", + FullMethod: CTPd_RunConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunConfig(ctx, req.(*RunStopRequest)) @@ -352,7 +365,7 @@ func _CTPd_RunCleanup_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/RunCleanup", + FullMethod: CTPd_RunCleanup_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).RunCleanup(ctx, req.(*Empty)) @@ -370,7 +383,7 @@ func _CTPd_TPCReset_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/ctpd.CTPd/TPCReset", + FullMethod: CTPd_TPCReset_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(CTPdServer).TPCReset(ctx, req.(*Empty)) diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 417e42bbc..5736c718e 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: // protoc-gen-go v1.33.0 -// protoc v6.30.1 +// protoc v6.31.1 // source: protos/o2control.proto package pb diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index a0c05c50f..491e21d26 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.30.1 +// - protoc v6.31.1 // source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index af1f237cc..dc11b2a98 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.1 -// protoc v3.21.12 +// protoc-gen-go v1.33.0 +// protoc v6.31.1 // source: protos/occ.proto package pb diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 162ad4479..67fb65b13 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -1,7 +1,30 @@ +// +// === This file is part of ALICE O² === +// +// Copyright 2018 CERN and copyright holders of ALICE O². +// Author: Teo Mrnjavac +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . +// +// In applying this license CERN does not waive the privileges and +// immunities granted to it by virtue of its status as an +// Intergovernmental Organization or submit itself to any jurisdiction. + // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v6.31.1 // source: protos/occ.proto package pb @@ -18,6 +41,13 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + Occ_EventStream_FullMethodName = "/occ_pb.Occ/EventStream" + Occ_StateStream_FullMethodName = "/occ_pb.Occ/StateStream" + Occ_GetState_FullMethodName = "/occ_pb.Occ/GetState" + Occ_Transition_FullMethodName = "/occ_pb.Occ/Transition" +) + // OccClient is the client API for Occ service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -39,7 +69,7 @@ func NewOccClient(cc grpc.ClientConnInterface) OccClient { } func (c *occClient) EventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Occ_EventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], "/occ_pb.Occ/EventStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[0], Occ_EventStream_FullMethodName, opts...) if err != nil { return nil, err } @@ -71,7 +101,7 @@ func (x *occEventStreamClient) Recv() (*EventStreamReply, error) { } func (c *occClient) StateStream(ctx context.Context, in *StateStreamRequest, opts ...grpc.CallOption) (Occ_StateStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], "/occ_pb.Occ/StateStream", opts...) + stream, err := c.cc.NewStream(ctx, &Occ_ServiceDesc.Streams[1], Occ_StateStream_FullMethodName, opts...) if err != nil { return nil, err } @@ -104,7 +134,7 @@ func (x *occStateStreamClient) Recv() (*StateStreamReply, error) { func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...grpc.CallOption) (*GetStateReply, error) { out := new(GetStateReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/GetState", in, out, opts...) + err := c.cc.Invoke(ctx, Occ_GetState_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -113,7 +143,7 @@ func (c *occClient) GetState(ctx context.Context, in *GetStateRequest, opts ...g func (c *occClient) Transition(ctx context.Context, in *TransitionRequest, opts ...grpc.CallOption) (*TransitionReply, error) { out := new(TransitionReply) - err := c.cc.Invoke(ctx, "/occ_pb.Occ/Transition", in, out, opts...) + err := c.cc.Invoke(ctx, Occ_Transition_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -214,7 +244,7 @@ func _Occ_GetState_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/occ_pb.Occ/GetState", + FullMethod: Occ_GetState_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(OccServer).GetState(ctx, req.(*GetStateRequest)) @@ -232,7 +262,7 @@ func _Occ_Transition_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/occ_pb.Occ/Transition", + FullMethod: Occ_Transition_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(OccServer).Transition(ctx, req.(*TransitionRequest)) From 7f189085037c50345524e3377e5bdd9918a1d110 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 24 Jul 2025 16:22:05 +0200 Subject: [PATCH 2181/2352] [core] Added monitoring to hooks and communication with outside services - we monitor every trigger - we monitor every process run by a trigger (more granularity) - we monitor outside communication with services defined in integration - DCS: we monitor duration of it's stream Recv() function - DCS: we monitor duration of whole gRPC stream communication for PFR, SOR, EOR --- common/event/writer.go | 6 +- common/monitoring/grpcinterceptor.go | 79 ++ common/monitoring/metric.go | 5 + common/monitoring/monitoring_test.go | 4 +- common/monitoring/timer.go | 60 +- core/environment/environment.go | 6 + core/integration/ccdb/plugin.go | 11 +- core/integration/dcs/client.go | 18 + core/integration/dcs/plugin.go | 1517 +++++++++++++------------- core/integration/ddsched/client.go | 16 + core/integration/odc/client.go | 38 + core/integration/trg/client.go | 30 + core/workflow/callable/call.go | 15 + 13 files changed, 1048 insertions(+), 757 deletions(-) create mode 100644 common/monitoring/grpcinterceptor.go diff --git a/common/event/writer.go b/common/event/writer.go index 534c77319..347c0a781 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -110,8 +110,7 @@ func NewWriterWithTopic(topic topic.Topic) *KafkaWriter { metric.SetFieldUInt64("messages_failed", 0) metricDuration := writer.newMetric(KAFKAWRITER) - defer monitoring.SendHistogrammable(&metricDuration) - defer monitoring.TimerNS(&metricDuration)() + defer monitoring.TimerSendHist(&metricDuration, monitoring.Nanosecond)() if err := writer.WriteMessages(context.Background(), messages...); err != nil { metric.SetFieldUInt64("messages_failed", uint64(len(messages))) @@ -250,8 +249,7 @@ func (w *KafkaWriter) WriteEventWithTimestamp(e interface{}, timestamp time.Time metric := w.newMetric(KAFKAPREPARE) - defer monitoring.SendHistogrammable(&metric) - defer monitoring.TimerNS(&metric)() + defer monitoring.TimerSendHist(&metric, monitoring.Nanosecond)() wrappedEvent, key, err := internalEventToKafkaEvent(e, timestamp) if err != nil { diff --git a/common/monitoring/grpcinterceptor.go b/common/monitoring/grpcinterceptor.go new file mode 100644 index 000000000..d23b1e3ef --- /dev/null +++ b/common/monitoring/grpcinterceptor.go @@ -0,0 +1,79 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package monitoring + +import ( + "context" + + "google.golang.org/grpc" +) + +type measuredClientStream struct { + grpc.ClientStream + method string + metricName string +} + +func (t *measuredClientStream) RecvMsg(m interface{}) error { + metric := NewMetric(t.metricName) + metric.AddTag("method", t.method) + defer TimerSendSingle(&metric, Millisecond)() + + err := t.ClientStream.RecvMsg(m) + return err +} + +type NameConvertType func(string) string + +func SetupStreamClientInterceptor(metricName string, convert NameConvertType) grpc.StreamClientInterceptor { + return func( + ctx context.Context, + desc *grpc.StreamDesc, + cc *grpc.ClientConn, + method string, + streamer grpc.Streamer, + opts ...grpc.CallOption, + ) (grpc.ClientStream, error) { + clientStream, err := streamer(ctx, desc, cc, method, opts...) + if err != nil { + return nil, err + } + + return &measuredClientStream{ + ClientStream: clientStream, + method: convert(method), + metricName: metricName, + }, nil + } +} + +func SetupUnaryClientInterceptor(name string, convert NameConvertType) grpc.UnaryClientInterceptor { + return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + metric := NewMetric(name) + metric.AddTag("method", convert(method)) + defer TimerSendSingle(&metric, Millisecond)() + return invoker(ctx, method, req, reply, cc, opts...) + } +} diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go index 0bb26fa39..41f8b78fd 100644 --- a/common/monitoring/metric.go +++ b/common/monitoring/metric.go @@ -27,6 +27,7 @@ package monitoring import ( "fmt" "io" + "sort" "time" lp "github.com/influxdata/line-protocol/v2/lineprotocol" @@ -110,6 +111,10 @@ func Format(writer io.Writer, metrics []Metric) error { var enc lp.Encoder for _, metric := range metrics { + // AddTag requires tags sorted lexicografically + sort.Slice(metric.tags, func(i int, j int) bool { + return metric.tags[i].name < metric.tags[j].name + }) enc.StartLine(metric.name) for _, tag := range metric.tags { enc.AddTag(tag.name, tag.value) diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index 1f68a9bd3..67540d0fd 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -546,8 +546,8 @@ func TestMetricsHistogramObject(t *testing.T) { } func measureFunc(metric *Metric) { - defer TimerMS(metric)() - defer TimerNS(metric)() + defer Timer(metric, Millisecond)() + defer Timer(metric, Nanosecond)() time.Sleep(100 * time.Millisecond) } diff --git a/common/monitoring/timer.go b/common/monitoring/timer.go index 722839a74..f1d26bc31 100644 --- a/common/monitoring/timer.go +++ b/common/monitoring/timer.go @@ -1,19 +1,59 @@ package monitoring -import "time" +import ( + "time" -// Timer* functions are meant to be used with defer statement to measure runtime of given function: -// defer TimerNS(&metric)() -func TimerMS(metric *Metric) func() { - start := time.Now() - return func() { - metric.SetFieldInt64("execution_time_ms", time.Since(start).Milliseconds()) - } + "github.com/AliceO2Group/Control/common/logger/infologger" +) + +type TimeResolution int + +const ( + Millisecond TimeResolution = iota + Nanosecond +) + +// Timer function is meant to be used with defer statement to measure runtime of given function: +// defer Timer(&metric, Milliseconds)() +func Timer(metric *Metric, unit TimeResolution) func() { + return timer(metric, unit, false, false) } -func TimerNS(metric *Metric) func() { +// Timer function is meant to be used with defer statement to measure runtime of given function: +// defer Timer(&metric, Milliseconds)() +// sends measured value as Send(metric) +func TimerSendSingle(metric *Metric, unit TimeResolution) func() { + return timer(metric, unit, true, false) +} + +// Timer function is meant to be used with defer statement to measure runtime of given function: +// defer Timer(&metric, Milliseconds)() +// sends measured value as SendHistogrammable(metric) +func TimerSendHist(metric *Metric, unit TimeResolution) func() { + return timer(metric, unit, true, true) +} + +func timer(metric *Metric, unit TimeResolution, send bool, sendHistogrammable bool) func() { start := time.Now() + return func() { - metric.SetFieldInt64("execution_time_ns", time.Since(start).Nanoseconds()) + dur := time.Since(start) + // we are setting default value as Nanoseconds + switch unit { + case Millisecond: + metric.SetFieldInt64("execution_time_ms", dur.Milliseconds()) + case Nanosecond: + metric.SetFieldInt64("execution_time_ns", dur.Nanoseconds()) + default: + log.WithField("level", infologger.IL_Devel).Warnf("trying to use unknown time resolution in monitoring.timer function [%d], skipping", unit) + } + + if send { + if sendHistogrammable { + SendHistogrammable(metric) + } else { + Send(metric) + } + } } } diff --git a/core/environment/environment.go b/core/environment/environment.go index c9d6aeb7d..fd08fd60a 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -42,6 +42,7 @@ import ( "github.com/AliceO2Group/Control/common/gera" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/system" @@ -647,6 +648,11 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weig hooksMapForTrigger := workflow.GetHooksMapForTrigger(trigger) callsMapForAwait := env.callsPendingAwait[trigger] + metric := monitoring.NewMetric("hooks") + metric.AddTag("trigger", trigger) + metric.AddTag("envId", env.id.String()) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + allWeightsSet := make(callable.HooksMap) for k := range hooksMapForTrigger { allWeightsSet[k] = callable.Hooks{} diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index e7c6b1f14..5ab1d9aa2 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -37,6 +37,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/environment" @@ -109,7 +110,6 @@ func getFlpIdList(envId string) (flps []string, err error) { } func NewGRPObject(varStack map[string]string) *GeneralRunParameters { - envId, ok := varStack["environment_id"] if !ok { log.WithField("level", infologger.IL_Support). @@ -366,8 +366,8 @@ func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack ma func (p *Plugin) NewCcdbGrpWriteCommand(grp *GeneralRunParameters, ccdbUrl string, refresh bool) (cmd string, err error) { // o2-ecs-grp-create -h - //Create GRP-ECS object and upload to the CCDB - //Usage: + // Create GRP-ECS object and upload to the CCDB + // Usage: // o2-ecs-grp-create: // -h [ --help ] Print this help message // -p [ --period ] arg data taking period @@ -524,7 +524,6 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refresh bool) error { - if grp == nil { return errors.New(fmt.Sprintf("Failed to create a GRP object")) } @@ -547,6 +546,10 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre ctx, cancel := context.WithTimeout(context.Background(), timeoutSeconds*time.Second) defer cancel() + metric := monitoring.NewMetric("ccdb") + metric.AddTag("envId", envId) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + cmd := exec.CommandContext(ctx, "bash", "-c", cmdStr) // execute the DPL command in the repo of the workflow used cmd.Dir = "/tmp" diff --git a/core/integration/dcs/client.go b/core/integration/dcs/client.go index 36aab7170..6a529bd59 100644 --- a/core/integration/dcs/client.go +++ b/core/integration/dcs/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" dcspb "github.com/AliceO2Group/Control/core/integration/dcs/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -40,6 +41,22 @@ import ( var log = logger.New(logrus.StandardLogger(), "dcsclient") +func convertMethodName(method string) (converted string) { + switch method { + case dcspb.Configurator_Subscribe_FullMethodName: + converted = "Subscribe" + case dcspb.Configurator_PrepareForRun_FullMethodName: + converted = "PFR" + case dcspb.Configurator_StartOfRun_FullMethodName: + converted = "SOR" + case dcspb.Configurator_EndOfRun_FullMethodName: + converted = "EOR" + default: + converted = "Unknown" + } + return +} + type RpcClient struct { dcspb.ConfiguratorClient conn *grpc.ClientConn @@ -67,6 +84,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), + grpc.WithStreamInterceptor(monitoring.SetupStreamClientInterceptor("dcsgrpcstream", convertMethodName)), } if !viper.GetBool("dcsServiceUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 7771cdf3a..9a5b253ef 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -42,6 +42,7 @@ import ( "dario.cat/mergo" "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/runtype" "github.com/AliceO2Group/Control/common/utils/uid" @@ -730,264 +731,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var dcsEvent *dcspb.RunEvent - for { - // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires - if ctx.Err() != nil { - err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - dcsEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination - log.Debug("DCS PFR event stream was closed from the DCS side (EOF)") - err = nil - - break // no more data - } - if errors.Is(err, context.DeadlineExceeded) { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS PFR timed out") - err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - if err != nil { // stream termination in case of unknown or gRPC error - got := status.Code(err) - - if got == codes.DeadlineExceeded { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS PFR timed out") - err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - } else if got == codes.Unknown { // unknown error, likely not a gRPC code - logMsg := "bad DCS PFR event received, any future DCS events are ignored" - log.WithError(err). - WithField("partition", envId). - Warn(logMsg) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - } else { // some other gRPC error code - log.WithError(err). - Error("DCS PFR call error") - err = fmt.Errorf("DCS PFR call error: %w", err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - } - - break - } - if dcsEvent == nil { - log.WithField("partition", envId). - Warn("nil DCS PFR event received, skipping to next DCS event") - continue - } - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField(infologger.Level, infologger.IL_Support). - Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) - continue - } - - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - - if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - logErr := fmt.Errorf("%s PFR failure reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_PFR_UNAVAILABLE { - logErr := fmt.Errorf("%s PFR unavailable reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - logErr := fmt.Errorf("%s PFR timeout reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - WithField("detector", ecsDet). - Info("ALIECS PFR operation : completed DCS PFR for ") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } else { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Devel). - WithField("detector", ecsDet). - Info("ALIECS PFR operation : processing DCS PFR for ") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: PrepareForRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } - } + err, payloadJson = PFRgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -1353,264 +1097,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later - var dcsEvent *dcspb.RunEvent - for { - // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires - if ctx.Err() != nil { - err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - dcsEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination - log.Debug("DCS SOR event stream was closed from the DCS side (EOF)") - err = nil - - break // no more data - } - if errors.Is(err, context.DeadlineExceeded) { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS SOR timed out") - err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - if err != nil { // stream termination in case of unknown or gRPC error - got := status.Code(err) - - if got == codes.DeadlineExceeded { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS SOR timed out") - err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - } else if got == codes.Unknown { // unknown error, likely not a gRPC code - logMsg := "bad DCS SOR event received, any future DCS events are ignored" - log.WithError(err). - Warn(logMsg) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - } else { // some other gRPC error code - log.WithError(err). - Debug("DCS SOR call error") - err = fmt.Errorf("DCS SOR call error: %w", err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - } - - break - } - if dcsEvent == nil { - log.Warn("nil DCS SOR event received, skipping to next DCS event") - continue - } - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField(infologger.Level, infologger.IL_Support). - Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) - continue - } - - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - - if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { - logErr := fmt.Errorf("%s SOR failure reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_SOR_UNAVAILABLE { - logErr := fmt.Errorf("%s SOR unavailable reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - logErr := fmt.Errorf("%s SOR timeout reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). - Info("ALIECS SOR operation : completed DCS SOR for ") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } else { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Devel). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). - Info("ALIECS SOR operation : processing DCS SOR for ") - - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: StartOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } - } + err, payloadJson = SORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -1854,227 +1341,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } - var dcsEvent *dcspb.RunEvent - for { - // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires - if ctx.Err() != nil { - err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - dcsEvent, err = stream.Recv() - if errors.Is(err, io.EOF) { // correct stream termination - log.Debug("DCS EOR event stream was closed from the DCS side (EOF)") - err = nil - - break // no more data - } - if errors.Is(err, context.DeadlineExceeded) { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS EOR timed out") - err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - break - } - if err != nil { // stream termination in case of unknown or gRPC error - got := status.Code(err) - - if got == codes.DeadlineExceeded { - log.WithError(err). - WithField("timeout", timeout.String()). - Debug("DCS EOR timed out") - err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - - } else if got == codes.Unknown { // unknown error, likely not a gRPC code - logMsg := "bad DCS EOR event received, any future DCS events are ignored" - log.WithError(err). - Warn(logMsg) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logMsg, - }) - } else { // some other gRPC error code - log.WithError(err). - Debug("DCS EOR call error") - err = fmt.Errorf("DCS EOR call error: %w", err) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: err.Error(), - }) - } - - break - } - if dcsEvent == nil { - log.Warn("nil DCS EOR event received, skipping to next DCS event") - continue - } - if dcsEvent.GetDetector() == dcspb.Detector_DCS { - log.WithField(infologger.Level, infologger.IL_Support). - Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) - continue - } - - detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() - ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) - - if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { - logErr := fmt.Errorf("%s EOR failure reported by DCS", ecsDet) - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_ERROR, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { - logErr := fmt.Errorf("%s EOR timeout reported by DCS", ecsDet) - if err != nil { - logErr = fmt.Errorf("%v : %v", err, logErr) - } - log.WithError(logErr). - WithField("event", dcsEvent). - WithField("detector", ecsDet). - WithField("level", infologger.IL_Ops). - WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - Error("DCS error") - - call.VarStack["__call_error_reason"] = logErr.Error() - call.VarStack["__call_error"] = callFailedStr - - payload["detector"] = ecsDet - payload["dcsEvent"] = dcsEvent - payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - payloadJson, _ = json.Marshal(payload) - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, - EnvironmentId: envId, - Payload: string(payloadJson[:]), - Error: logErr.Error(), - }) - - continue - } - - if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Support). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). - Info("ALIECS EOR operation : completed DCS EOR for ") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } else { - log.WithField("event", dcsEvent). - WithField("level", infologger.IL_Devel). - WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). - Info("ALIECS EOR operation : processing DCS EOR for ") - - detPayload := map[string]interface{}{} - _ = copier.Copy(&detPayload, payload) - detPayload["detector"] = ecsDet - detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] - detPayload["dcsEvent"] = dcsEvent - detPayloadJson, _ := json.Marshal(detPayload) - - the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ - Name: call.GetName(), - OperationName: call.Func, - OperationStatus: pb.OpStatus_ONGOING, - OperationStep: "perform DCS call: EndOfRun", - OperationStepStatus: pb.OpStatus_ONGOING, - EnvironmentId: envId, - Payload: string(detPayloadJson[:]), - }) - } - } + err, payloadJson = EORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -2170,6 +1437,782 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } +func newMetric(method string) monitoring.Metric { + metric := monitoring.NewMetric("dcsecs") + metric.AddTag("method", method) + return metric +} + +func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, + payloadJsonForKafka []byte, stream dcspb.Configurator_EndOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, + callFailedStr string, payload map[string]interface{}, +) (error, []byte) { + metric := newMetric("EOR") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + + var dcsEvent *dcspb.RunEvent + var err error + for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires + if ctx.Err() != nil { + err = fmt.Errorf("DCS EndOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + dcsEvent, err = stream.Recv() + if errors.Is(err, io.EOF) { // correct stream termination + log.Debug("DCS EOR event stream was closed from the DCS side (EOF)") + err = nil + + break // no more data + } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS EOR timed out") + err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) + + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS EOR timed out") + err = fmt.Errorf("DCS EOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS EOR event received, any future DCS events are ignored" + log.WithError(err). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + Debug("DCS EOR call error") + err = fmt.Errorf("DCS EOR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + } + + break + } + if dcsEvent == nil { + log.Warn("nil DCS EOR event received, skipping to next DCS event") + continue + } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } + + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { + logErr := fmt.Errorf("%s EOR failure reported by DCS", ecsDet) + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + logErr := fmt.Errorf("%s EOR timeout reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Support). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + Info("ALIECS EOR operation : completed DCS EOR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } else { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Devel). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + Info("ALIECS EOR operation : processing DCS EOR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: EndOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } + } + return err, payloadJsonForKafka +} + +func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, + payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, + callFailedStr string, payload map[string]interface{}, +) (error, []byte) { + metric := newMetric("SOR") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + + var dcsEvent *dcspb.RunEvent + var err error + for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires + if ctx.Err() != nil { + err = fmt.Errorf("DCS StartOfRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + dcsEvent, err = stream.Recv() + if errors.Is(err, io.EOF) { // correct stream termination + log.Debug("DCS SOR event stream was closed from the DCS side (EOF)") + err = nil + + break // no more data + } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS SOR timed out") + err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) + + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS SOR timed out") + err = fmt.Errorf("DCS SOR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS SOR event received, any future DCS events are ignored" + log.WithError(err). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + Debug("DCS SOR call error") + err = fmt.Errorf("DCS SOR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + } + + break + } + if dcsEvent == nil { + log.Warn("nil DCS SOR event received, skipping to next DCS event") + continue + } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } + + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { + logErr := fmt.Errorf("%s SOR failure reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_SOR_UNAVAILABLE { + logErr := fmt.Errorf("%s SOR unavailable reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + logErr := fmt.Errorf("%s SOR timeout reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Support). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + Info("ALIECS SOR operation : completed DCS SOR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } else { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Devel). + WithField("detector", dcsToEcsDetector(dcsEvent.GetDetector())). + Info("ALIECS SOR operation : processing DCS SOR for ") + + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: StartOfRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } + } + return err, payloadJsonForKafka +} + +func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, + payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, + callFailedStr string, payload map[string]interface{}, +) (error, []byte) { + metric := newMetric("PFR") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + + var err error + var dcsEvent *dcspb.RunEvent + for { + // fixme: consider removing this check, since `stream.Recv()` will return a timeout error anyway if the context expires + if ctx.Err() != nil { + err = fmt.Errorf("DCS PrepareForRun context timed out (%s), any future DCS events are ignored", timeout.String()) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + dcsEvent, err = stream.Recv() + if errors.Is(err, io.EOF) { // correct stream termination + log.Debug("DCS PFR event stream was closed from the DCS side (EOF)") + err = nil + + break // no more data + } + if errors.Is(err, context.DeadlineExceeded) { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS PFR timed out") + err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + + break + } + if err != nil { // stream termination in case of unknown or gRPC error + got := status.Code(err) + + if got == codes.DeadlineExceeded { + log.WithError(err). + WithField("timeout", timeout.String()). + Debug("DCS PFR timed out") + err = fmt.Errorf("DCS PFR timed out after %s: %w", timeout.String(), err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + } else if got == codes.Unknown { // unknown error, likely not a gRPC code + logMsg := "bad DCS PFR event received, any future DCS events are ignored" + log.WithError(err). + WithField("partition", envId). + Warn(logMsg) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logMsg, + }) + } else { // some other gRPC error code + log.WithError(err). + Error("DCS PFR call error") + err = fmt.Errorf("DCS PFR call error: %w", err) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: err.Error(), + }) + } + + break + } + if dcsEvent == nil { + log.WithField("partition", envId). + Warn("nil DCS PFR event received, skipping to next DCS event") + continue + } + if dcsEvent.GetDetector() == dcspb.Detector_DCS { + log.WithField(infologger.Level, infologger.IL_Support). + Warnf("Received an event for DCS detector (%s), which is unexpected, ignoring", dcsEvent.GetState().String()) + continue + } + + detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) + + if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { + logErr := fmt.Errorf("%s PFR failure reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_PFR_UNAVAILABLE { + logErr := fmt.Errorf("%s PFR unavailable reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_ERROR, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_TIMEOUT { + logErr := fmt.Errorf("%s PFR timeout reported by DCS", ecsDet) + if err != nil { + logErr = fmt.Errorf("%v : %v", err, logErr) + } + log.WithError(logErr). + WithField("event", dcsEvent). + WithField("detector", ecsDet). + WithField("level", infologger.IL_Ops). + WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Error("DCS error") + + call.VarStack["__call_error_reason"] = logErr.Error() + call.VarStack["__call_error"] = callFailedStr + + payload["detector"] = ecsDet + payload["dcsEvent"] = dcsEvent + payload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + payloadJsonForKafka, _ = json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_DONE_TIMEOUT, + EnvironmentId: envId, + Payload: string(payloadJsonForKafka[:]), + Error: logErr.Error(), + }) + + continue + } + + if dcsEvent.GetState() == dcspb.DetectorState_RUN_OK { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Support). + WithField("detector", ecsDet). + Info("ALIECS PFR operation : completed DCS PFR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } else { + log.WithField("event", dcsEvent). + WithField("level", infologger.IL_Devel). + WithField("detector", ecsDet). + Info("ALIECS PFR operation : processing DCS PFR for ") + + detPayload := map[string]interface{}{} + _ = copier.Copy(&detPayload, payload) + detPayload["detector"] = ecsDet + detPayload["state"] = dcspb.DetectorState_name[int32(dcsEvent.GetState())] + detPayload["dcsEvent"] = dcsEvent + detPayloadJson, _ := json.Marshal(detPayload) + + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: call.GetName(), + OperationName: call.Func, + OperationStatus: pb.OpStatus_ONGOING, + OperationStep: "perform DCS call: PrepareForRun", + OperationStepStatus: pb.OpStatus_ONGOING, + EnvironmentId: envId, + Payload: string(detPayloadJson[:]), + }) + } + } + return err, payloadJsonForKafka +} + func (p *Plugin) parseDetectors(dcsDetectorsParam string) (detectors DCSDetectors, err error) { detectorsSlice := make([]string, 0) bytes := []byte(dcsDetectorsParam) diff --git a/core/integration/ddsched/client.go b/core/integration/ddsched/client.go index 565d3c488..a24b37365 100644 --- a/core/integration/ddsched/client.go +++ b/core/integration/ddsched/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" ddpb "github.com/AliceO2Group/Control/core/integration/ddsched/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -40,6 +41,20 @@ import ( var log = logger.New(logrus.StandardLogger(), "ddschedclient") +func convertMethodName(method string) (converted string) { + switch method { + case ddpb.DataDistributionControl_PartitionInitialize_FullMethodName: + converted = "PartInit" + case ddpb.DataDistributionControl_PartitionTerminate_FullMethodName: + converted = "PartTerm" + case ddpb.DataDistributionControl_PartitionStatus_FullMethodName: + converted = "PartStatus" + default: + converted = "Unknown" + } + return +} + type RpcClient struct { ddpb.DataDistributionControlClient conn *grpc.ClientConn @@ -67,6 +82,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), + grpc.WithUnaryInterceptor(monitoring.SetupUnaryClientInterceptor("ddsched", convertMethodName)), } if !viper.GetBool("ddSchedulerUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) diff --git a/core/integration/odc/client.go b/core/integration/odc/client.go index 333ef0904..d8d15cabd 100644 --- a/core/integration/odc/client.go +++ b/core/integration/odc/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" odcpb "github.com/AliceO2Group/Control/core/integration/odc/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -40,6 +41,42 @@ import ( var log = logger.New(logrus.StandardLogger(), "odcclient") +func convertMethodName(method string) (converted string) { + switch method { + case odcpb.ODC_Initialize_FullMethodName: + converted = "Initialize" + case odcpb.ODC_Submit_FullMethodName: + converted = "Submit" + case odcpb.ODC_Activate_FullMethodName: + converted = "Activate" + case odcpb.ODC_Run_FullMethodName: + converted = "Run" + case odcpb.ODC_Update_FullMethodName: + converted = "Update" + case odcpb.ODC_Configure_FullMethodName: + converted = "Configure" + case odcpb.ODC_SetProperties_FullMethodName: + converted = "SetProperties" + case odcpb.ODC_GetState_FullMethodName: + converted = "GetState" + case odcpb.ODC_Start_FullMethodName: + converted = "Start" + case odcpb.ODC_Stop_FullMethodName: + converted = "Stop" + case odcpb.ODC_Reset_FullMethodName: + converted = "Reset" + case odcpb.ODC_Terminate_FullMethodName: + converted = "Terminate" + case odcpb.ODC_Shutdown_FullMethodName: + converted = "Shutdown" + case odcpb.ODC_Status_FullMethodName: + converted = "Status" + default: + converted = "Unknown" + } + return +} + type RpcClient struct { odcpb.ODCClient conn *grpc.ClientConn @@ -68,6 +105,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) PermitWithoutStream: true, }), grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ODC_MAX_INBOUND_MESSAGE_SIZE)), + grpc.WithUnaryInterceptor(monitoring.SetupUnaryClientInterceptor("odc", convertMethodName)), } if !viper.GetBool("odcUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) diff --git a/core/integration/trg/client.go b/core/integration/trg/client.go index 92652903f..2ab48a006 100644 --- a/core/integration/trg/client.go +++ b/core/integration/trg/client.go @@ -29,6 +29,7 @@ import ( "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" trgecspb "github.com/AliceO2Group/Control/core/integration/trg/protos" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -40,6 +41,34 @@ import ( var log = logger.New(logrus.StandardLogger(), "trgclient") +func convertMethodName(method string) (converted string) { + switch method { + case trgecspb.CTPd_PrepareForRun_FullMethodName: + converted = "PrepareForRun" + case trgecspb.CTPd_RunLoad_FullMethodName: + converted = "RunLoad" + case trgecspb.CTPd_RunUnload_FullMethodName: + converted = "RunUnload" + case trgecspb.CTPd_RunStart_FullMethodName: + converted = "RunStart" + case trgecspb.CTPd_RunStatus_FullMethodName: + converted = "RunStatus" + case trgecspb.CTPd_RunList_FullMethodName: + converted = "RunList" + case trgecspb.CTPd_RunStop_FullMethodName: + converted = "RunStop" + case trgecspb.CTPd_RunConfig_FullMethodName: + converted = "RunConfig" + case trgecspb.CTPd_RunCleanup_FullMethodName: + converted = "RunCleanup" + case trgecspb.CTPd_TPCReset_FullMethodName: + converted = "TPCReset" + default: + converted = "Unknown" + } + return +} + type RpcClient struct { trgecspb.CTPdClient conn *grpc.ClientConn @@ -66,6 +95,7 @@ func NewClient(cxt context.Context, cancel context.CancelFunc, endpoint string) Timeout: time.Second, PermitWithoutStream: true, }), + grpc.WithUnaryInterceptor(monitoring.SetupUnaryClientInterceptor("trg", convertMethodName)), } if !viper.GetBool("trgServiceUseSystemProxy") { dialOptions = append(dialOptions, grpc.WithNoProxy()) diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 0af9946cd..f0a04e476 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -37,6 +37,7 @@ import ( "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" evpb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/configuration/template" @@ -113,6 +114,9 @@ func (c *Call) Call() error { WithField("level", infologger.IL_Devel). Debugf("calling hook function %s", c.Func) + metric := c.newMetric("callablecall") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ Path: c.GetParentRolePath(), Func: c.Func, @@ -220,11 +224,22 @@ func (c *Call) Call() error { return nil } +func (c *Call) newMetric(name string) monitoring.Metric { + metric := monitoring.NewMetric(name) + metric.AddTag("name", c.GetName()) + metric.AddTag("trigger", c.GetTraits().Trigger) + metric.AddTag("envId", c.parentRole.GetEnvironmentId().String()) + return metric +} + func (c *Call) Start() { c.await = make(chan error) ctx, cancel := context.WithCancel(context.Background()) c.awaitCancel = cancel go func() { + metric := c.newMetric("callablewrapped") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + callId := fmt.Sprintf("hook:%s:%s", c.GetTraits().Trigger, c.GetName()) log.Debugf("%s started", callId) defer utils.TimeTrack(time.Now(), callId, log.WithPrefix("callable")) From 07ef0bbb9151d477f771b9162c72a08c88636d59 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 5 Aug 2025 11:04:31 +0200 Subject: [PATCH 2182/2352] No need to force ERROR when GO_ERROR succeeded Probably due to a mostly harmless mistake, we would force an environment into ERROR state even when not needed, after a successful GO_ERROR. If very unlucky, this could cause some conflicts with following transitions towards environment destruction. This affects only GO_ERROR due to ODC going to ERROR, other cases are fine. I did not see this issue cause any troubles, I just accidentally stumbled upon it. --- core/environment/manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index 0f239b739..5379d8740 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -997,8 +997,8 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve WithField("partition", envId.String()). WithError(err). Error("environment GO_ERROR transition failed after ODC_PARTITION_STATE_CHANGE ERROR event") + env.setState("ERROR") } - env.setState("ERROR") } }() } From 570630651dc780631f46aa9bfeac3a8554db205d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 14 Aug 2025 12:04:03 +0200 Subject: [PATCH 2183/2352] v1.41.0 [build] Bump to v1.41.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 457dc3512..eafd32b29 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 40 +VERSION_MINOR := 41 VERSION_PATCH := 0 From 0fc831480b2648b2510551c714ca605ae575d471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 14 Aug 2025 17:22:20 +0200 Subject: [PATCH 2184/2352] [docs] Adding link to environment workflow diagram --- docs/handbook/operation_order.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 66ef2028d..7c2924c7d 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -22,6 +22,8 @@ Callback execution is further refined with integer indexes, with the syntax `±i An expression with no index is assumed to be indexed `+0`. These indexes do not correspond to timestamps, they are discrete labels that allow more granularity in callbacks, ensuring a strict ordering of callback opportunities within a given callback moment. Thus, `before_CONFIGURE+2` will complete execution strictly after `before_CONFIGURE` runs, but strictly before `enter_CONFIGURED-666` is executed. +Following States and Transitions are represented by this diagram: ![ECS environment state machine representation](AliECS-envsm.svg) + ## START_ACTIVITY (Start Of Run) This is the order of actions happening at a healthy start of run. From 37c0b1eecafe6bb65510c1db1b81c116a9e02c1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 15 Aug 2025 12:25:59 +0200 Subject: [PATCH 2185/2352] [build] add check whether we are in alidist environment --- .gitignore | 1 + Makefile | 3 +++ 2 files changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 26c35b577..448644152 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ wf-unprocessed* wf-processed* *.*.old coverage_results +.envrc diff --git a/Makefile b/Makefile index 483758d5f..58184a101 100644 --- a/Makefile +++ b/Makefile @@ -150,6 +150,9 @@ generate: ifndef HAS_PROTOC $(MAKE) tools/protoc endif + @if [ -z "$(PROTOBUF_VERSION)" ]; then \ + echo "Warning: PROTOBUF_VERSION env var not detected are you sure you are generating from alidist environment?"; \ + fi @for gendir in $(GENERATE_DIRS); do \ echo -e "\033[1;33mgo generate\033[0m $$gendir"; \ PATH="$(ROOT_DIR)/tools:$$PATH" go generate $(VERBOSE_$(V)) $$gendir; \ From 5d0a3865511318207cac0589758317f9e5ac9537 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 15 Aug 2025 14:34:21 +0200 Subject: [PATCH 2186/2352] [build] Regenerated protofiles protoc v5.29.3 protoc-gen-go v1.34.1 protoc-gen-go-grpc v1.3.0 --- apricot/protos/apricot.pb.go | 4 ++-- apricot/protos/apricot_grpc.pb.go | 2 +- coconut/protos/o2control.pb.go | 4 ++-- coconut/protos/o2control_grpc.pb.go | 2 +- common/protos/common.pb.go | 4 ++-- common/protos/events.pb.go | 4 ++-- core/integration/bookkeeping/protos/bkcommon.pb.go | 4 ++-- core/integration/bookkeeping/protos/environment.pb.go | 4 ++-- core/integration/bookkeeping/protos/environment_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/flp.pb.go | 4 ++-- core/integration/bookkeeping/protos/flp_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/lhcFill.pb.go | 4 ++-- core/integration/bookkeeping/protos/lhcFill_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/log.pb.go | 4 ++-- core/integration/bookkeeping/protos/log_grpc.pb.go | 2 +- core/integration/bookkeeping/protos/run.pb.go | 4 ++-- core/integration/bookkeeping/protos/run_grpc.pb.go | 2 +- core/integration/dcs/protos/dcs.pb.go | 4 ++-- core/integration/dcs/protos/dcs_grpc.pb.go | 2 +- core/integration/ddsched/protos/ddsched.pb.go | 4 ++-- core/integration/ddsched/protos/ddsched_grpc.pb.go | 2 +- core/integration/kafka/protos/kafka.pb.go | 4 ++-- core/integration/odc/protos/odc.pb.go | 4 ++-- core/integration/odc/protos/odc_grpc.pb.go | 2 +- core/integration/trg/protos/ctpecs.pb.go | 4 ++-- core/integration/trg/protos/ctpecs_grpc.pb.go | 2 +- core/protos/o2control.pb.go | 4 ++-- core/protos/o2control_grpc.pb.go | 2 +- executor/protos/occ.pb.go | 4 ++-- executor/protos/occ_grpc.pb.go | 2 +- 30 files changed, 47 insertions(+), 47 deletions(-) diff --git a/apricot/protos/apricot.pb.go b/apricot/protos/apricot.pb.go index 27a6b18f7..c24df2de3 100644 --- a/apricot/protos/apricot.pb.go +++ b/apricot/protos/apricot.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/apricot.proto package apricotpb diff --git a/apricot/protos/apricot_grpc.pb.go b/apricot/protos/apricot_grpc.pb.go index b9b6e1ee6..1a2d651f1 100644 --- a/apricot/protos/apricot_grpc.pb.go +++ b/apricot/protos/apricot_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/apricot.proto package apricotpb diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 5736c718e..76c26d707 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/o2control.proto package pb diff --git a/coconut/protos/o2control_grpc.pb.go b/coconut/protos/o2control_grpc.pb.go index 491e21d26..1208a45bc 100644 --- a/coconut/protos/o2control_grpc.pb.go +++ b/coconut/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/o2control.proto package pb diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index a59816e25..24a60e97c 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/common.proto package pb diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 781ab111c..532d0ac1b 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/events.proto package pb diff --git a/core/integration/bookkeeping/protos/bkcommon.pb.go b/core/integration/bookkeeping/protos/bkcommon.pb.go index 3dfdfec7d..ca870e26b 100644 --- a/core/integration/bookkeeping/protos/bkcommon.pb.go +++ b/core/integration/bookkeeping/protos/bkcommon.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/bkcommon.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment.pb.go b/core/integration/bookkeeping/protos/environment.pb.go index 8a9ef3735..5f7a6ae12 100644 --- a/core/integration/bookkeeping/protos/environment.pb.go +++ b/core/integration/bookkeeping/protos/environment.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/environment_grpc.pb.go b/core/integration/bookkeeping/protos/environment_grpc.pb.go index 6a5e4ac67..4d3343267 100644 --- a/core/integration/bookkeeping/protos/environment_grpc.pb.go +++ b/core/integration/bookkeeping/protos/environment_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/environment.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp.pb.go b/core/integration/bookkeeping/protos/flp.pb.go index b2158c08b..c1a14b2d5 100644 --- a/core/integration/bookkeeping/protos/flp.pb.go +++ b/core/integration/bookkeeping/protos/flp.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/flp_grpc.pb.go b/core/integration/bookkeeping/protos/flp_grpc.pb.go index 9e03d15ef..0a6baa76d 100644 --- a/core/integration/bookkeeping/protos/flp_grpc.pb.go +++ b/core/integration/bookkeeping/protos/flp_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/flp.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill.pb.go b/core/integration/bookkeeping/protos/lhcFill.pb.go index f1da1126b..e615a4139 100644 --- a/core/integration/bookkeeping/protos/lhcFill.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go index 5d62f07b5..17eca77f7 100644 --- a/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go +++ b/core/integration/bookkeeping/protos/lhcFill_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/lhcFill.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log.pb.go b/core/integration/bookkeeping/protos/log.pb.go index 0ca547fe2..5b97693a4 100644 --- a/core/integration/bookkeeping/protos/log.pb.go +++ b/core/integration/bookkeeping/protos/log.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/log_grpc.pb.go b/core/integration/bookkeeping/protos/log_grpc.pb.go index 7660e7149..b4925ff0b 100644 --- a/core/integration/bookkeeping/protos/log_grpc.pb.go +++ b/core/integration/bookkeeping/protos/log_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/log.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run.pb.go b/core/integration/bookkeeping/protos/run.pb.go index c223e5151..fb2431032 100644 --- a/core/integration/bookkeeping/protos/run.pb.go +++ b/core/integration/bookkeeping/protos/run.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/run.proto package bkpb diff --git a/core/integration/bookkeeping/protos/run_grpc.pb.go b/core/integration/bookkeeping/protos/run_grpc.pb.go index e21507950..39cff60d7 100644 --- a/core/integration/bookkeeping/protos/run_grpc.pb.go +++ b/core/integration/bookkeeping/protos/run_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/run.proto package bkpb diff --git a/core/integration/dcs/protos/dcs.pb.go b/core/integration/dcs/protos/dcs.pb.go index 12d6a118a..a7607b9aa 100644 --- a/core/integration/dcs/protos/dcs.pb.go +++ b/core/integration/dcs/protos/dcs.pb.go @@ -24,8 +24,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/dcs.proto package dcspb diff --git a/core/integration/dcs/protos/dcs_grpc.pb.go b/core/integration/dcs/protos/dcs_grpc.pb.go index b4dda5e37..35ee86566 100644 --- a/core/integration/dcs/protos/dcs_grpc.pb.go +++ b/core/integration/dcs/protos/dcs_grpc.pb.go @@ -25,7 +25,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/dcs.proto package dcspb diff --git a/core/integration/ddsched/protos/ddsched.pb.go b/core/integration/ddsched/protos/ddsched.pb.go index d2dd6e746..fe89342bc 100644 --- a/core/integration/ddsched/protos/ddsched.pb.go +++ b/core/integration/ddsched/protos/ddsched.pb.go @@ -13,8 +13,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/ddsched/protos/ddsched_grpc.pb.go b/core/integration/ddsched/protos/ddsched_grpc.pb.go index 123b564b6..ed9482e81 100644 --- a/core/integration/ddsched/protos/ddsched_grpc.pb.go +++ b/core/integration/ddsched/protos/ddsched_grpc.pb.go @@ -14,7 +14,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/ddsched.proto // Changelog: diff --git a/core/integration/kafka/protos/kafka.pb.go b/core/integration/kafka/protos/kafka.pb.go index baf618b92..54e07e02d 100644 --- a/core/integration/kafka/protos/kafka.pb.go +++ b/core/integration/kafka/protos/kafka.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/kafka.proto package kafka diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index cfaf4dc50..4edcb3cc5 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/odc.proto package odc diff --git a/core/integration/odc/protos/odc_grpc.pb.go b/core/integration/odc/protos/odc_grpc.pb.go index c2355ed1a..6603ec2a2 100644 --- a/core/integration/odc/protos/odc_grpc.pb.go +++ b/core/integration/odc/protos/odc_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/odc.proto package odc diff --git a/core/integration/trg/protos/ctpecs.pb.go b/core/integration/trg/protos/ctpecs.pb.go index 664af7a49..cb61c9a0c 100644 --- a/core/integration/trg/protos/ctpecs.pb.go +++ b/core/integration/trg/protos/ctpecs.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/ctpecs.proto package ctpecs diff --git a/core/integration/trg/protos/ctpecs_grpc.pb.go b/core/integration/trg/protos/ctpecs_grpc.pb.go index 1e33ddc34..abde79d52 100644 --- a/core/integration/trg/protos/ctpecs_grpc.pb.go +++ b/core/integration/trg/protos/ctpecs_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/ctpecs.proto package ctpecs diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 5736c718e..76c26d707 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/o2control.proto package pb diff --git a/core/protos/o2control_grpc.pb.go b/core/protos/o2control_grpc.pb.go index 491e21d26..1208a45bc 100644 --- a/core/protos/o2control_grpc.pb.go +++ b/core/protos/o2control_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/o2control.proto package pb diff --git a/executor/protos/occ.pb.go b/executor/protos/occ.pb.go index dc11b2a98..97c5451e6 100644 --- a/executor/protos/occ.pb.go +++ b/executor/protos/occ.pb.go @@ -23,8 +23,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v6.31.1 +// protoc-gen-go v1.34.1 +// protoc v5.29.3 // source: protos/occ.proto package pb diff --git a/executor/protos/occ_grpc.pb.go b/executor/protos/occ_grpc.pb.go index 67fb65b13..0ccbbab21 100644 --- a/executor/protos/occ_grpc.pb.go +++ b/executor/protos/occ_grpc.pb.go @@ -24,7 +24,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v6.31.1 +// - protoc v5.29.3 // source: protos/occ.proto package pb From fd5d7a52142de7cb0a023f00287d2fcde86c0981 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:55:53 +0200 Subject: [PATCH 2187/2352] OCTRL-1021 Add package documentation for all Go packages (#733) * Initial plan * Add package documentation for core packages Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Add package documentation for configuration, core, executor, and integration packages Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Complete package documentation for all remaining packages Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Initial plan for addressing PR review comments Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Address PR review comments on package documentation Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Fix package documentation placement and remove go.mod changes Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> --- apricot/apricot.go | 2 ++ apricot/cacheproxy/service.go | 2 ++ apricot/local/service.go | 2 ++ apricot/remote/service.go | 2 ++ coconut/app/constants.go | 2 ++ coconut/cmd/environment.go | 2 ++ common/event/topic/topic.go | 1 + common/event/writer.go | 2 ++ common/golangmetrics/metrics.go | 2 ++ common/logger/infologger/protocols.go | 2 ++ common/monitoring/monitoring.go | 2 ++ common/product/constants.go | 2 ++ common/utils/safeacks/safeacks.go | 2 ++ common/utils/uid/uid.go | 1 + common/utils/utils.go | 2 ++ configuration/componentcfg/componentcfg.go | 2 ++ configuration/service.go | 2 ++ configuration/template/fields.go | 2 ++ core/core.go | 2 ++ core/integration/bookkeeping/plugin.go | 2 ++ core/integration/ccdb/plugin.go | 2 ++ core/integration/dcs/plugin.go | 2 ++ core/integration/ddsched/plugin.go | 2 ++ core/integration/odc/plugin.go | 2 ++ core/integration/plugin.go | 2 ++ core/integration/testplugin/plugin.go | 2 ++ core/integration/trg/plugin.go | 1 + core/integration/trg/trgutil.go | 1 + core/repos/sshrepo.go | 2 ++ core/repos/varsource/varsource.go | 2 ++ core/task/channel/channel.go | 2 ++ core/task/schedutil/mesosutil.go | 2 ++ core/task/sm/machine.go | 2 ++ core/task/taskclass/port/range.go | 2 ++ core/task/taskclass/resourcelimits.go | 2 ++ core/task/taskop/messagetype.go | 2 ++ core/the/eventwriter.go | 2 ++ core/workflow/callable/utils.go | 2 ++ executor/executable/task.go | 2 ++ executor/executorcmd/nopb/jsoncodec.go | 2 ++ executor/executorutil/executorutil.go | 2 ++ occ/peanut/peanut.go | 2 ++ 42 files changed, 80 insertions(+) diff --git a/apricot/apricot.go b/apricot/apricot.go index f4c33898d..e9a517984 100644 --- a/apricot/apricot.go +++ b/apricot/apricot.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package apricot implements the ALICE configuration service with templating, +// load balancing and caching capabilities on top of the configuration store. package apricot import ( diff --git a/apricot/cacheproxy/service.go b/apricot/cacheproxy/service.go index 05ea7aa94..78c2c1d92 100644 --- a/apricot/cacheproxy/service.go +++ b/apricot/cacheproxy/service.go @@ -1,3 +1,5 @@ +// Package cacheproxy provides a caching proxy implementation for the +// configuration service, optimizing detector inventory lookups. package cacheproxy import ( diff --git a/apricot/local/service.go b/apricot/local/service.go index 53e111529..827cb931b 100644 --- a/apricot/local/service.go +++ b/apricot/local/service.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package local implements a local configuration backend for the configuration +// service, providing direct access to the backend storage without gRPC. package local import ( diff --git a/apricot/remote/service.go b/apricot/remote/service.go index 974e604e3..a80efa1c6 100644 --- a/apricot/remote/service.go +++ b/apricot/remote/service.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package remote implements a remote configuration backend for the configuration +// service, accessing configuration handled by a different application via gRPC. package remote import ( diff --git a/coconut/app/constants.go b/coconut/app/constants.go index e66f78d47..2f8338da9 100644 --- a/coconut/app/constants.go +++ b/coconut/app/constants.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package app provides application constants and metadata for the coconut +// command line interface and its components. package app const ( diff --git a/coconut/cmd/environment.go b/coconut/cmd/environment.go index f6dcc1f58..125e947b8 100644 --- a/coconut/cmd/environment.go +++ b/coconut/cmd/environment.go @@ -24,6 +24,8 @@ //go:generate protoc -I=../../core -I=../../common --go_out=.. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:.. protos/o2control.proto +// Package cmd implements the command line interface for coconut, providing +// various subcommands for managing O² Control environments and configurations. package cmd import ( diff --git a/common/event/topic/topic.go b/common/event/topic/topic.go index ae2e2d262..b71936ad8 100644 --- a/common/event/topic/topic.go +++ b/common/event/topic/topic.go @@ -22,6 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package topic defines constants and types for event system topics. package topic type Topic string diff --git a/common/event/writer.go b/common/event/writer.go index 347c0a781..b0cb571a6 100644 --- a/common/event/writer.go +++ b/common/event/writer.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package event provides event publishing and streaming functionality for +// O² Control components, supporting Kafka and dummy event writers. package event import ( diff --git a/common/golangmetrics/metrics.go b/common/golangmetrics/metrics.go index f1bcfabed..855faeed7 100644 --- a/common/golangmetrics/metrics.go +++ b/common/golangmetrics/metrics.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package golangmetrics provides Go runtime metrics collection and reporting +// functionality for monitoring system resource usage and performance. package golangmetrics import ( diff --git a/common/logger/infologger/protocols.go b/common/logger/infologger/protocols.go index cf640f4a6..0b0782052 100644 --- a/common/logger/infologger/protocols.go +++ b/common/logger/infologger/protocols.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package infologger provides InfoLogger protocol implementation for +// integration with the ALICE InfoLogger logging system. package infologger type protoVersion string diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 47cf9dc2c..ca21056b9 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package monitoring provides monitoring and metrics collection functionality +// for O² Control components. package monitoring import ( diff --git a/common/product/constants.go b/common/product/constants.go index 6f3c1f345..c6c981d3a 100644 --- a/common/product/constants.go +++ b/common/product/constants.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package product provides version information and build metadata for +// O² Control products and components. package product import ( diff --git a/common/utils/safeacks/safeacks.go b/common/utils/safeacks/safeacks.go index bace3f235..b3ff7f116 100644 --- a/common/utils/safeacks/safeacks.go +++ b/common/utils/safeacks/safeacks.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package safeacks provides thread-safe acknowledgment handling for managing +// communication between multiple senders and a single receiver. package safeacks import ( diff --git a/common/utils/uid/uid.go b/common/utils/uid/uid.go index 95aa79ee9..1b417a638 100644 --- a/common/utils/uid/uid.go +++ b/common/utils/uid/uid.go @@ -22,6 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package uid provides unique identifier generation functionality. package uid import ( diff --git a/common/utils/utils.go b/common/utils/utils.go index c4702ea72..d04008ce9 100644 --- a/common/utils/utils.go +++ b/common/utils/utils.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package utils provides common utility functions for string manipulation, +// data conversion, and various helper operations used across O² Control components. package utils import ( diff --git a/configuration/componentcfg/componentcfg.go b/configuration/componentcfg/componentcfg.go index ca7065e7c..082464d21 100644 --- a/configuration/componentcfg/componentcfg.go +++ b/configuration/componentcfg/componentcfg.go @@ -23,6 +23,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package componentcfg provides component configuration management functionality, +// including query handling and template processing for O² components. package componentcfg import ( diff --git a/configuration/service.go b/configuration/service.go index ac9be5b70..534cba725 100644 --- a/configuration/service.go +++ b/configuration/service.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package configuration provides interfaces and implementations for managing +// runtime configuration of O² Control components and detectors. package configuration import ( diff --git a/configuration/template/fields.go b/configuration/template/fields.go index 3a0114fe8..43a0f8441 100644 --- a/configuration/template/fields.go +++ b/configuration/template/fields.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package template provides template processing functionality for configuration +// files, including custom field handling and template execution. package template import ( diff --git a/core/core.go b/core/core.go index d6a2cebf2..6919cb45c 100644 --- a/core/core.go +++ b/core/core.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package core implements the main AliECS core functionality including +// the gRPC API server, environment management, and integration with various services. package core import ( diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 3cd605f4a..476fdb1be 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -31,6 +31,8 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/run.proto //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/lhcFill.proto +// Package bookkeeping provides integration with the ALICE Bookkeeping system +// for tracking runs and retrieving LHC fill information. package bookkeeping import ( diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index 5ab1d9aa2..b420e3be9 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package ccdb provides integration with the Condition and Calibration Database (CCDB) +// for creating and managing General Run Parameters (GRP) objects. package ccdb import ( diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 9a5b253ef..e6d8485f9 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -24,6 +24,8 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/dcs.proto +// Package dcs provides integration with the ALICE Detector Control System (DCS) +// for managing detector operations and state compatibility checks. package dcs import ( diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index ce3f88f3c..917b1a6e5 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -24,6 +24,8 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ddsched.proto +// Package ddsched provides integration with the Data Distribution (DD) scheduler +// for managing the pool of FLPs participating in data taking operations. package ddsched import ( diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index b1550e952..ba50a8919 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -24,6 +24,8 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/odc.proto +// Package odc provides integration with the Online Device Control (ODC) system +// for managing the ALICE event processing farm during data taking and offline processing. package odc import ( diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 2b4f73444..12bd01fbc 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package integration provides the plugin system for integrating O² Control +// with external services like DCS, Bookkeeping, ODC, and other ALICE systems. package integration import ( diff --git a/core/integration/testplugin/plugin.go b/core/integration/testplugin/plugin.go index 19d96e810..fe545a247 100644 --- a/core/integration/testplugin/plugin.go +++ b/core/integration/testplugin/plugin.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package testplugin provides a test integration plugin that serves as an example +// and is used for testing the plugin system functionality. package testplugin import ( diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index c070eadcb..2ebdc84d7 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -25,6 +25,7 @@ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto +// Package trg provides integration with the ALICE trigger system. package trg import ( diff --git a/core/integration/trg/trgutil.go b/core/integration/trg/trgutil.go index dca8b9a3f..c1a705d0b 100644 --- a/core/integration/trg/trgutil.go +++ b/core/integration/trg/trgutil.go @@ -22,6 +22,7 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package trg provides integration with the ALICE trigger system. package trg import ( diff --git a/core/repos/sshrepo.go b/core/repos/sshrepo.go index 1ad7e0702..a47f3aaa5 100644 --- a/core/repos/sshrepo.go +++ b/core/repos/sshrepo.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package repos provides repository management functionality for accessing +// and synchronizing Git repositories containing workflow templates and configurations. package repos import ( diff --git a/core/repos/varsource/varsource.go b/core/repos/varsource/varsource.go index a7e3b85c1..8551ed739 100644 --- a/core/repos/varsource/varsource.go +++ b/core/repos/varsource/varsource.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package varsource provides variable source management functionality for +// tracking the origin and precedence of configuration variables in workflows. package varsource type Source int diff --git a/core/task/channel/channel.go b/core/task/channel/channel.go index 1e05e5123..d79496f6b 100644 --- a/core/task/channel/channel.go +++ b/core/task/channel/channel.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package channel provides functionality for managing task communication channels, +// including inbound and outbound channel configuration and message routing. package channel import ( diff --git a/core/task/schedutil/mesosutil.go b/core/task/schedutil/mesosutil.go index a6bff6201..6db3d511b 100644 --- a/core/task/schedutil/mesosutil.go +++ b/core/task/schedutil/mesosutil.go @@ -25,6 +25,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package schedutil provides scheduler utility functions for Apache Mesos +// integration, including resource management and task scheduling helpers. package schedutil import ( diff --git a/core/task/sm/machine.go b/core/task/sm/machine.go index 7287714ef..81546c9c2 100644 --- a/core/task/sm/machine.go +++ b/core/task/sm/machine.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package sm provides state machine functionality for task lifecycle management, +// including state transitions and event handling. package sm type Transition struct { diff --git a/core/task/taskclass/port/range.go b/core/task/taskclass/port/range.go index 895ba97ae..caf335b23 100644 --- a/core/task/taskclass/port/range.go +++ b/core/task/taskclass/port/range.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package port provides port range management functionality for task +// communication, including port range parsing and validation. package port import ( diff --git a/core/task/taskclass/resourcelimits.go b/core/task/taskclass/resourcelimits.go index 5b62f84f2..37916e843 100644 --- a/core/task/taskclass/resourcelimits.go +++ b/core/task/taskclass/resourcelimits.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package taskclass provides task class definitions and resource management +// for different types of tasks. package taskclass import "strconv" diff --git a/core/task/taskop/messagetype.go b/core/task/taskop/messagetype.go index 92e97da06..fa2d18a46 100644 --- a/core/task/taskop/messagetype.go +++ b/core/task/taskop/messagetype.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package taskop provides task operation types and message handling functionality +// for controlling task lifecycle and communication. package taskop import ( diff --git a/core/the/eventwriter.go b/core/the/eventwriter.go index 064f025fc..bf7d76175 100644 --- a/core/the/eventwriter.go +++ b/core/the/eventwriter.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package the provides global event handling and state management for +// the core system, including event writers and system-wide notifications. package the import ( diff --git a/core/workflow/callable/utils.go b/core/workflow/callable/utils.go index df2eae902..02e579e2c 100644 --- a/core/workflow/callable/utils.go +++ b/core/workflow/callable/utils.go @@ -1,3 +1,5 @@ +// Package callable provides utility functions for workflow callable operations, +// including timeout handling and trigger expression parsing. package callable import ( diff --git a/executor/executable/task.go b/executor/executable/task.go index 0376fe8f3..e23b56394 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package executable provides platform-specific executable management functionality +// for running and controlling tasks in the executor environment. package executable import ( diff --git a/executor/executorcmd/nopb/jsoncodec.go b/executor/executorcmd/nopb/jsoncodec.go index a6abbff16..b4c69c024 100644 --- a/executor/executorcmd/nopb/jsoncodec.go +++ b/executor/executorcmd/nopb/jsoncodec.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package nopb provides non-protobuf encoding functionality including +// JSON codec implementations for gRPC communication. package nopb import ( diff --git a/executor/executorutil/executorutil.go b/executor/executorutil/executorutil.go index 7b28cef29..5dbbb0961 100644 --- a/executor/executorutil/executorutil.go +++ b/executor/executorutil/executorutil.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package executorutil provides utility functions for the executor, +// including resource management and task execution helpers. package executorutil import ( diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index 8493ea11f..4e6f4d5f5 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -22,6 +22,8 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +// Package peanut implements a process execution and control utility for +// OCClib-based O² processes, providing debugging and development support. package peanut import ( From 5b31372eb10c8017fe94fe2b5024a615589f5e5e Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 19 Aug 2025 09:33:41 +0200 Subject: [PATCH 2188/2352] OCTRL-1008 Attempt reconnecting to ecs-dcs gateway at core startup (#734) * Initial plan * Initial repository exploration and dependency setup Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Fix DCS plugin to reconnect even after initialization failure - Move subscription logic into goroutine to enable continuous retry - Always start reconnection goroutine regardless of initial connection state - Plugin initialization now succeeds even if DCS gateway is unavailable - Add comprehensive test for unavailable gateway scenario - Resolves issue where plugin never attempted reconnection after init failure Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Remove unrelated proto-generated files from DCS plugin fix PR Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * remove test which tests almost nothing --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> Co-authored-by: Piotr Konopka --- core/integration/dcs/plugin.go | 45 ++++++++++++++++++++++------------ 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index e6d8485f9..2982fcf56 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -289,12 +289,33 @@ func (p *Plugin) Init(instanceId string) error { in := &dcspb.SubscriptionRequest{ InstanceId: instanceId, } - evStream, err := p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) - if err != nil { - return fmt.Errorf("failed to subscribe to DCS service on %s, possible network issue or DCS gateway malfunction", viper.GetString("dcsServiceEndpoint")) - } + + // Always start the goroutine, even if initial subscription fails go func() { + var evStream dcspb.Configurator_SubscribeClient + var err error + for { + // Try to establish subscription if we don't have one + if evStream == nil { + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + Debug("attempting to subscribe to DCS service") + + evStream, err = p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) + if err != nil { + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithError(err). + Warnf("failed to subscribe to DCS service, possible network issue or DCS gateway malfunction") + time.Sleep(3 * time.Second) + continue + } else { + log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). + WithField("level", infologger.IL_Support). + Info("successfully subscribed to DCS service") + } + } + + // Process events from the stream for { if evStream == nil { break @@ -302,12 +323,14 @@ func (p *Plugin) Init(instanceId string) error { ev, streamErr := evStream.Recv() if streamErr == io.EOF { log.Info("unexpected EOF from DCS service, possible DCS gateway malfunction") + evStream = nil break } if streamErr != nil { log.WithError(streamErr). Error("stream error or bad event from DCS service, dropping stream") + evStream = nil time.Sleep(3 * time.Second) break } @@ -332,20 +355,10 @@ func (p *Plugin) Init(instanceId string) error { Debug("received DCS event") } + // If we reach here, the stream was dropped and evStream is nil + // The loop will continue and try to reestablish the subscription log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Info("DCS stream dropped, attempting reconnect") - - evStream, err = p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) - if err != nil { - log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithError(err). - Warnf("failed to resubscribe to DCS service, possible network issue or DCS gateway malfunction") - time.Sleep(3 * time.Second) - } else { - log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). - WithField("level", infologger.IL_Support). - Info("successfully resubscribed to DCS service") - } } }() } From 5ce13571842667d19c2af4e7c3e110c76e26c954 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 19 Aug 2025 09:34:36 +0200 Subject: [PATCH 2189/2352] Call ODC STOP only when the partition is in RUNNING (#732) Ensure that ODC Stop is called at FLP/QC-initiated GO_ERROR This allows us to stop a run on EPNs at GO_ERROR transition by adding a corresponding ODC.EnsureStop hook. As GO_ERROR can occur with any source state, we make sure to make the actual STOP call only if the ODC partition is in RUNNING. At the same time, ODC partitions require us to call ODC.Stop if they voluntarily transition to ERROR. In such case, ODC.Stop allows the remaining healthy devices to finish processing. By keeping the original ODC.Stop behaviour, we preserve this functionality. Additionally, the commit includes minor corrections to a few related logs. Fixes OCTRL-1036. --- core/integration/odc/plugin.go | 73 +++++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index ba50a8919..94c093d79 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1439,12 +1439,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { rn, ok := varStack["run_number"] if !ok { log.WithField("partition", envId). - WithField("call", "Start"). + WithField("call", "Stop"). Warn("cannot acquire run number for ODC Stop") } runNumberu64, err = strconv.ParseUint(rn, 10, 32) if err != nil { log.WithField("partition", envId). + WithField("call", "Stop"). WithError(err). Error("cannot acquire run number for ODC EOR") runNumberu64 = 0 @@ -1452,7 +1453,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { runEndTimeMs, ok := varStack["run_end_time_ms"] if !ok { log.WithField("partition", envId). - WithField("call", "Start"). + WithField("call", "Stop"). Warn("cannot acquire run_end_time_ms") } @@ -1475,6 +1476,74 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } return } + stack["EnsureStop"] = func() (out string) { + // ODC Stop + callFailedStr := "EPN EnsureStop call failed" + var ( + runNumberu64 uint64 + err error + ) + + timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "EnsureStop", envId) + + ctx, cancel := context.WithTimeout(context.Background(), timeout) + defer cancel() + + state, err := handleGetState(ctx, p.odcClient, envId) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EnsureStop"). + Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + return + } + if state != "RUNNING" { + log.WithField("level", infologger.IL_Devel). + WithField("partition", envId). + WithField("call", "EnsureStop"). + Infof("ODC EnsureStop attempted, while ODC partition is not in 'RUNNING' but '%s', skipping", state) + return + } + + rn, ok := varStack["run_number"] + if !ok { + log.WithField("partition", envId). + WithField("call", "EnsureStop"). + Warn("cannot acquire run number for ODC EnsureStop") + } + runNumberu64, err = strconv.ParseUint(rn, 10, 32) + if err != nil { + log.WithField("partition", envId). + WithField("call", "EnsureStop"). + WithError(err). + Error("cannot acquire run number for ODC EOR") + runNumberu64 = 0 + } + runEndTimeMs, ok := varStack["run_end_time_ms"] + if !ok { + log.WithField("partition", envId). + WithField("call", "EnsureStop"). + Warn("cannot acquire run_end_time_ms") + } + + arguments := make(map[string]string) + arguments["run_end_time_ms"] = runEndTimeMs + + err = handleStop(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) + if err != nil { + log.WithError(err). + WithField("level", infologger.IL_Support). + WithField("partition", envId). + WithField("call", "EnsureStop"). + Error("ODC error") + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = callFailedStr + } + return + } stack["EnsureCleanup"] = func() (out string) { // ODC Shutdown for current env + all orphans From 1f512fb65b01582beeb08b6d51c4e0a429d6449a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 19 Aug 2025 09:54:55 +0200 Subject: [PATCH 2190/2352] Add a message for the event reporting successful environment creation (#739) This becomes consistent with two other events in this function, which report failure to create an environment. --- core/server.go | 1 + 1 file changed, 1 insertion(+) diff --git a/core/server.go b/core/server.go index d8d3a6a1d..f14c1e454 100644 --- a/core/server.go +++ b/core/server.go @@ -352,6 +352,7 @@ func (m *RpcServer) doNewEnvironmentAsync(cxt context.Context, userVars map[stri State: newEnv.CurrentState(), LastRequestUser: requestUser, WorkflowTemplateInfo: newEnv.GetWorkflowInfo(), + Message: "created new environment", }) return } From e97b3fc237c284a6f4373a2daba52cc3821809f5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 19 Aug 2025 13:13:09 +0200 Subject: [PATCH 2191/2352] Add missing transitionStatus to Environment Events (#738) I consider transitionStatus as the status of the whole transition, i.e. even if the transition has multiple steps, OpStatus_STARTED and OpStatus_DONE_OK should be published just once, as the first and the last event for a transition. Fixes OCTRL-1038. --- core/environment/environment.go | 22 +++++++++++++++++++ core/environment/manager.go | 39 +++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 12 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index fd08fd60a..4c7cdfa91 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -173,6 +173,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, RunNumber: env.GetCurrentRunNumber(), Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_ONGOING, Message: "transition step starting", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -189,6 +190,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: errHooks.Error(), Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_DONE_ERROR, Message: "transition step finished", WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -325,6 +327,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step finished", Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_ONGOING, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -339,6 +342,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Transition: e.Event, TransitionStep: trigger, Message: "transition step starting", + TransitionStatus: pb.OpStatus_ONGOING, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -365,6 +369,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Error: errHooks.Error(), Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_DONE_ERROR, Message: "transition step finished", WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -389,6 +394,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step finished", Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_DONE_ERROR, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -404,6 +410,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step starting", Transition: e.Event, TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + TransitionStatus: pb.OpStatus_ONGOING, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -411,9 +418,11 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, env.handlerFunc()(e) eventState := e.Dst // we set the destination state here instead of the current for the event write, if the tasks have transitioned + transitionStatus := pb.OpStatus_ONGOING if e.Err != nil { errorMsg = e.Err.Error() eventState = e.Src + transitionStatus = pb.OpStatus_DONE_ERROR } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ @@ -424,6 +433,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step finished", Transition: e.Event, TransitionStep: fmt.Sprintf("tasks_%s", e.Event), + TransitionStatus: transitionStatus, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -437,6 +447,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, RunNumber: env.currentRunNumber, Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_ONGOING, Message: "transition step starting", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -454,8 +465,10 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } errorMsg := "" + transitionStatus := pb.OpStatus_ONGOING if e.Err != nil { errorMsg = e.Err.Error() + transitionStatus = pb.OpStatus_DONE_ERROR } the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ @@ -466,6 +479,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step finished", Transition: e.Event, TransitionStep: trigger, + TransitionStatus: transitionStatus, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -496,6 +510,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, RunNumber: env.currentRunNumber, Transition: e.Event, TransitionStep: trigger, + TransitionStatus: pb.OpStatus_ONGOING, Message: "transition step starting", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -611,8 +626,10 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } errorMsg := "" + transitionStatus := pb.OpStatus_ONGOING if e.Err != nil { errorMsg = e.Err.Error() + transitionStatus = pb.OpStatus_DONE_ERROR } // publish transition step complete event @@ -624,6 +641,7 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, Message: "transition step finished", Transition: e.Event, TransitionStep: trigger, + TransitionStatus: transitionStatus, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -990,6 +1008,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { RunNumber: env.currentRunNumber, Message: "transition starting", Transition: t.eventName(), + TransitionStatus: pb.OpStatus_STARTED, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -1003,6 +1022,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { Error: err.Error(), Message: "transition impossible", Transition: t.eventName(), + TransitionStatus: pb.OpStatus_DONE_ERROR, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -1018,6 +1038,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { Error: err.Error(), Message: "transition error", Transition: t.eventName(), + TransitionStatus: pb.OpStatus_DONE_ERROR, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) @@ -1028,6 +1049,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { RunNumber: env.currentRunNumber, Message: "transition completed successfully", Transition: t.eventName(), + TransitionStatus: pb.OpStatus_DONE_OK, LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) diff --git a/core/environment/manager.go b/core/environment/manager.go index 5379d8740..c4c84a1b4 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -226,12 +226,13 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "instantiating", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + TransitionStatus: evpb.OpStatus_STARTED, + Message: "instantiating", + LastRequestUser: lastRequestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ Path: workflowPath, Public: workflowPublicInfo.IsPublic, @@ -322,6 +323,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] State: "PENDING", Transition: "CREATE", TransitionStep: "before_CREATE", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "running hooks", LastRequestUser: lastRequestUser, WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -339,6 +341,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] State: "PENDING", Transition: "CREATE", TransitionStep: "CREATE", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "loading workflow", LastRequestUser: lastRequestUser, WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -386,6 +389,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] State: env.CurrentState(), Transition: "CREATE", TransitionStep: "after_CREATE", + TransitionStatus: evpb.OpStatus_DONE_OK, Message: "workflow loaded", Vars: cvs, // we push the full var stack of the root role in the workflow loaded event LastRequestUser: lastRequestUser, @@ -605,6 +609,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: env.CurrentState(), Transition: "DESTROY", TransitionStep: "before_DESTROY", + TransitionStatus: evpb.OpStatus_STARTED, Message: "workflow teardown started", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -619,6 +624,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: env.CurrentState(), Transition: "DESTROY", TransitionStep: "leave_" + env.CurrentState(), + TransitionStatus: evpb.OpStatus_ONGOING, Message: "workflow teardown ongoing", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -703,6 +709,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: env.CurrentState(), Transition: "DESTROY", TransitionStep: "DESTROY", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "releasing tasks", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -771,6 +778,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: "DONE", Transition: "DESTROY", TransitionStep: "after_DESTROY", + TransitionStatus: evpb.OpStatus_DONE_ERROR, Message: "environment teardown finished with error", Error: err.Error(), LastRequestUser: env.GetLastRequestUser(), @@ -785,6 +793,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: env.CurrentState(), Transition: "DESTROY", TransitionStep: "after_DESTROY", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "running DESTROY hooks", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -855,6 +864,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: "DONE", Transition: "DESTROY", TransitionStep: "after_DESTROY", + TransitionStatus: evpb.OpStatus_DONE_ERROR, Message: "environment teardown finished with error", Error: err.Error(), LastRequestUser: env.GetLastRequestUser(), @@ -883,6 +893,7 @@ func (envs *Manager) TeardownEnvironment(environmentId uid.ID, force bool) error State: "DONE", Transition: "DESTROY", TransitionStep: "after_DESTROY", + TransitionStatus: evpb.OpStatus_DONE_OK, Message: "environment teardown complete", LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -1195,12 +1206,13 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ - EnvironmentId: newId.String(), - State: "PENDING", - Transition: "CREATE", - TransitionStep: "before_CREATE", - Message: "instantiating", - LastRequestUser: lastRequestUser, + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStep: "before_CREATE", + TransitionStatus: evpb.OpStatus_STARTED, + Message: "instantiating", + LastRequestUser: lastRequestUser, WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ Path: workflowPath, Public: workflowPublicInfo.IsPublic, @@ -1234,6 +1246,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str State: "PENDING", Transition: "CREATE", TransitionStep: "before_CREATE", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "running hooks", LastRequestUser: lastRequestUser, WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -1254,6 +1267,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str State: "PENDING", Transition: "CREATE", TransitionStep: "CREATE", + TransitionStatus: evpb.OpStatus_ONGOING, Message: "loading workflow", LastRequestUser: lastRequestUser, WorkflowTemplateInfo: env.GetWorkflowInfo(), @@ -1272,6 +1286,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str State: env.CurrentState(), Transition: "CREATE", TransitionStep: "after_CREATE", + TransitionStatus: evpb.OpStatus_DONE_OK, Message: "workflow loaded", Vars: cvs, // we push the full var stack of the root role in the workflow loaded event LastRequestUser: lastRequestUser, From 9d73ad95d118bf0a8127711e340933fcfaa547ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 18 Aug 2025 17:18:01 +0200 Subject: [PATCH 2192/2352] [docs] add summary of virtual states into the operation_order.md --- README.md | 1 + docs/handbook/operation_order.md | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/README.md b/README.md index 2d2129404..3c06e2b42 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,7 @@ There are two ways of interacting with AliECS: * [State machine triggers](/docs/handbook/operation_order.md#state-machine-triggers) * [START_ACTIVITY (Start Of Run)](/docs/handbook/operation_order.md#start_activity-start-of-run) * [STOP_ACTIVITY (End Of Run)](/docs/handbook/operation_order.md#stop_activity-end-of-run) + * [Virtual states and transitions](/docs/handbook/operation_order.md#virtual-states-and-transitions) * [Protocol documentation](/docs/apidocs_aliecs.md) * coconut * [The O² control and configuration utility overview](/coconut/README.md#the-o-control-and-configuration-utility-overview) diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index 7c2924c7d..cd81e77ee 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -102,3 +102,21 @@ This is the order of actions happening at a healthy end of run. - `after_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `ccdb.RunStop()` at `0` - `bookkeeping.UpdateRunStop()`, `bookkeeping.UpdateEnv()` at `+100` + +## Virtual states and transitions + +State **PENDING** and transitions **TEARDOWN**, and **DESTROY** lie outside the core FSM in `environment.go` and are driven by the Manager. See [core/environment/manager.go](../../core/environment/manager.go) for details. +As these are not in a FSM we trigger them be calling specific methods. You can find details about triggering these in the according sections. + +### State PENDING + +Before the FSM enters `STANDBY`, the Manager drives the initial creation steps by emitting `Ev_EnvironmentEvent` messages (`Transition: CREATE, State: PENDING`) for both `before_CREATE` (running hooks) and `CREATE` (loading workflow). + +### Transition TEARDOWN + +When the FSM is in `RUNNING` and `TeardownEnvironment` function is called, the Manager records both `run_end_time_ms` and `run_end_completion_time_ms` and emits message `Ev_RunEvent` with content (`Transition: TEARDOWN`, `OpStatus_STARTED`) for each of timestamps. Right now there is only `OpStatus_STARTED` reported in Kafka. You can trigger `TeardownEnvironment` for example by invoking gRPC method `DestroyEnvironment` with `Force = true`. You cannot trigger `TEARDOWN` by calling gRPC method `Teardown`. + +### Transition DESTROY + +The Manager’s `TeardownEnvironment(...)` drives a four‑step `Ev_EnvironmentEvent` sequence (`before_DESTROY`, `leave_`, `DESTROY`, `after_DESTROY`) on `topic.Environment` to release tasks, run hooks, and finalize teardown. +You can trigger `TeardownEnvironment` for example by invoking gRPC method `DestroyEnvironment` with `Force = true`. From ce2ca524d80d2202459c34748e0c493029270013 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Aug 2025 11:16:29 +0200 Subject: [PATCH 2193/2352] Simplify critical hook execution error targeted towards operators (#745) Details were moved to logs. --- core/environment/environment.go | 31 ++++++++++++++----------------- 1 file changed, 14 insertions(+), 17 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 4c7cdfa91..50bf356cb 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -788,32 +788,29 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weig // If the hook call or task is critical: true if hook.GetTraits().Critical { log.WithField("partition", env.Id().String()). - Logf(logrus.FatalLevel, "critical hook failed: %s", err) // Must use Logf(FatalLevel) instead of + Logf(logrus.FatalLevel, "critical hook failed at trigger %s: %s", trigger, err) // Must use Logf(FatalLevel) instead of // Fatalf because the latter calls Exit criticalFailures = append(criticalFailures, err) } else { - log.WithField("level", infologger.IL_Devel). + log.WithField("level", infologger.IL_Support). WithField("partition", env.Id().String()). - Debugf("non-critical hook failed: %s", err) + Warnf("non-critical hook failed at trigger %s: %s", trigger, err) } } - if len(criticalFailures) != 0 { - if len(criticalFailures) > 3 { - return fmt.Errorf("%d critical hooks failed at trigger %s (see InfoLogger for details)", len(criticalFailures), trigger) - } else if len(criticalFailures) > 1 { // 2-3 failed hooks - consolidated := make([]string, len(criticalFailures)) - for i, cf := range criticalFailures { - consolidated[i] = cf.Error() - } - consolidatedS := strings.Join(consolidated, "; ") - - return fmt.Errorf("%d critical hooks failed at trigger %s: %s", len(criticalFailures), trigger, consolidatedS) - } else { // 1 hook failed - return fmt.Errorf("critical hook failed at trigger %s: %s", trigger, criticalFailures[0]) + if len(criticalFailures) > 3 { + return fmt.Errorf("%d critical hooks failed at trigger %s (see InfoLogger for details)", len(criticalFailures), trigger) + } else if len(criticalFailures) > 0 { // 1-3 failed hooks + consolidated := make([]string, len(criticalFailures)) + for i, cf := range criticalFailures { + consolidated[i] = cf.Error() } + consolidatedS := strings.Join(consolidated, "; ") + + return errors.New(consolidatedS) + } else { + return nil } - return nil } func (env *Environment) handleAllHooks(workflow workflow.Role, trigger string) (err error) { From 4e36facb57c690fd8a8407085a4aaf056d992029 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Aug 2025 11:16:44 +0200 Subject: [PATCH 2194/2352] Add Copilot agent instructions (#744) --- .github/copilot-instructions.md | 17 +++++++++++++++++ docs/CONTRIBUTING.md | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .github/copilot-instructions.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md new file mode 100644 index 000000000..afa8b0e12 --- /dev/null +++ b/.github/copilot-instructions.md @@ -0,0 +1,17 @@ +## ALICE Experiment Control System (AliECS) + +The ALICE Experiment Control System (**AliECS**) is the piece of software to drive and control data taking activities in the experiment. +It is a distributed system that combines state of the art cluster resource management and experiment control functionalities into a single comprehensive solution. + +### Copilot agent instructions + +- Running `make` in the main directory lets you build all golang components of AliECS. +- Running `make test` in the main directory lets you run all golang tests of AliECS. +- Do not attempt to build C++ components unless you already have access to their dependencies (FairMQ and FairLogger) and the task requires you to do it. +- When changing API interfaces, run `make docs` to regenerate the API documentation. +- When changing gRPC interfaces and proto files, run `make generate` to regenerate the gRPC code. +- Do not include regenerated Go files in your commits unless you are changing the API or proto files. If you do, include only the files which are related to your task. +- Do not include modified go.mod and go.sum files in your commits unless you are adding or upgrading a dependency. +- When adding features or fixing bugs, add a corresponding unit test if feasible. Use Ginkgo/Gomega, unless a package already uses a different testing framework. +- When adding a new feature, extend the documentation accordingly, follow the existing style and structure, and make sure that Tables of Contents are updated. See [Documentation guidelines](docs/CONTRIBUTING.md#documentation-guidelines) for some more details. +- When providing a fix, explain what was causing the issue and how it was fixed. \ No newline at end of file diff --git a/docs/CONTRIBUTING.md b/docs/CONTRIBUTING.md index 54611fd45..f1d67c8cf 100644 --- a/docs/CONTRIBUTING.md +++ b/docs/CONTRIBUTING.md @@ -51,7 +51,7 @@ Gomega/Ginkgo tests are preferred, but other style of tests are also welcome. ## Documentation guidelines The markdown documentation is aimed to be browsed on GitHub, but it also on the aggregated [FLP documentation](https://alice-flp.docs.cern.ch) based on [MkDocs](https://www.mkdocs.org/). -Consequently, any changes in the documentation structure should be reflected in the Table of Contents in the main README.md, as well as `mkdocs.yml` and `mkdocs.yml`. +Consequently, any changes in the documentation structure should be reflected in the Table of Contents in the main README.md, as well as `mkdocs.yml` and `mkdocs-dev.yml`. The AliECS MkDocs documentation is split into two aforementioned files to follow the split between "Products" and "Developers" tabs in the FLP documentation. The `mkdocs-dev.yml` uses a symlink `aliecs-dev` to `aliecs` directory to avoid complaints about duplicated site names. From c483aea4cee5bdede0f36c483f5feb5f6dabcee6 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Aug 2025 11:16:57 +0200 Subject: [PATCH 2195/2352] Add test runcounter.txt to .gitignore (#743) --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 448644152..469eadb09 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ wf-processed* *.*.old coverage_results .envrc +core/environment/runcounter.txt From 61e7b1da785855188412edf9628b5acf9aa56120 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 21 Aug 2025 11:21:36 +0200 Subject: [PATCH 2196/2352] [build] Bump to v1.42.0 (#746) --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index eafd32b29..ae3d7ad99 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 41 +VERSION_MINOR := 42 VERSION_PATCH := 0 From 2d0bcb1fce016da8ff77aea6dac94811614d3ea8 Mon Sep 17 00:00:00 2001 From: Copilot <198982749+Copilot@users.noreply.github.com> Date: Tue, 26 Aug 2025 15:00:43 +0200 Subject: [PATCH 2197/2352] OCTRL-981: Do not print error for BASIC_TASK_TERMINATED event with no parent role (#741) * Initial plan * Fix printf formatting directive issue in task manager Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * Fix race condition: Change error to debug for BASIC_TASK_TERMINATED with no parent role Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> * OCTRL-981: Remove unrelated changes - keep only environment manager fix Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: knopers8 <14327588+knopers8@users.noreply.github.com> --- core/environment/manager.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index c4c84a1b4..bdb720391 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1070,10 +1070,13 @@ func (envs *Manager) handleDeviceEvent(evt event.DeviceEvent) { } } } else { + // Task has no parent role - this can happen during environment teardown + // when tasks are released before termination events are processed log.WithPrefix("scheduler"). WithField("partition", envId.String()). + WithField("taskId", taskId.Value). WithField(infologger.Level, infologger.IL_Devel). - Error("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role") + Debug("DeviceEvent BASIC_TASK_TERMINATED received for task with no parent role, likely due to environment teardown") } } else { log.WithPrefix("scheduler"). From 01b9d2e22c91ae8814c103930011fd25a13ae962 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 3 Sep 2025 08:55:04 +0200 Subject: [PATCH 2198/2352] Fix race condition in tests (#747) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [monitoring] fixed racecondition on Run monitoring and Stop * fixup! [monitoring] fixed racecondition on Run monitoring and Stop --------- Co-authored-by: Michal Tichák --- common/monitoring/monitoring.go | 26 ++++++++++++-------------- common/monitoring/monitoring_test.go | 12 ++---------- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index ca21056b9..91dbd417f 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -30,6 +30,7 @@ import ( "context" "fmt" "net/http" + "sync/atomic" "time" "github.com/AliceO2Group/Control/common/logger" @@ -38,8 +39,8 @@ import ( ) var ( - // scraping endpoint implementation - server *http.Server + // atomic holder for the HTTP server instance + server atomic.Pointer[http.Server] // objects to store incoming metrics metricsInternal *MetricsAggregate metricsHistogramInternal *MetricsReservoirSampling @@ -154,33 +155,30 @@ func handleFunc(endpointName string) { // // If we attempt send more messages than the size of the buffer, these overflowing messages will be ignored and warning will be logged. func Run(port uint16, endpointName string) error { - if IsRunning() { + localServer := &http.Server{Addr: fmt.Sprintf(":%d", port)} + // only one Run should initialize and serve + if !server.CompareAndSwap(nil, localServer) { return nil } - initChannels() - go eventLoop() - - server = &http.Server{Addr: fmt.Sprintf(":%d", port)} handleFunc(endpointName) - return server.ListenAndServe() + // block until Shutdown is called + return localServer.ListenAndServe() } func Stop() { - if !IsRunning() { + localServer := server.Swap(nil) + if localServer == nil { return } - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() - server.Shutdown(ctx) - + localServer.Shutdown(ctx) endChannel <- struct{}{} <-endChannel - server = nil } func IsRunning() bool { - return server != nil + return server.Load() != nil } diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index 67540d0fd..b0da38435 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -81,20 +81,12 @@ func TestStartMultipleStop(t *testing.T) { Stop() } -func cleaningUpAfterTest() { - Stop() -} - -func initTest() { - go Run(12345, "notimportant") -} - // decorator function that properly inits and cleans after higher level test of Monitoring package func testFunction(t *testing.T, testToRun func(*testing.T)) { - initTest() + go Run(12345, "notimportant") isRunningWithTimeout(t, time.Second) testToRun(t) - cleaningUpAfterTest() + Stop() } func TestSendingSingleMetric(t *testing.T) { From 6db969a063762ce650fdee4e9cc44532187cd143 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 28 Aug 2025 18:13:42 +0200 Subject: [PATCH 2199/2352] [monitoring] OCTRL-1042: Add run type to metrics calls --- common/monitoring/grpcinterceptor.go | 25 +++++++++++++++++++ core/environment/environment.go | 1 + core/integration/ccdb/plugin.go | 8 +++--- core/integration/dcs/plugin.go | 37 ++++++++++++++++------------ core/integration/ddsched/plugin.go | 20 ++++++--------- core/integration/odc/plugin.go | 24 +++++++++--------- core/integration/plugin.go | 28 ++++++++++++++++++++- core/integration/trg/plugin.go | 25 ++++++++++--------- core/workflow/callable/call.go | 17 ++++++++++++- 9 files changed, 128 insertions(+), 57 deletions(-) diff --git a/common/monitoring/grpcinterceptor.go b/common/monitoring/grpcinterceptor.go index d23b1e3ef..bc4d36caa 100644 --- a/common/monitoring/grpcinterceptor.go +++ b/common/monitoring/grpcinterceptor.go @@ -30,8 +30,20 @@ import ( "google.golang.org/grpc" ) +type ( + EnvIDKey struct{} + RunTypeKey struct{} +) + +func AddEnvAndRunType(ctx context.Context, envId, runType string) context.Context { + ctx = context.WithValue(ctx, EnvIDKey{}, envId) + ctx = context.WithValue(ctx, RunTypeKey{}, runType) + return ctx +} + type measuredClientStream struct { grpc.ClientStream + ctx context.Context method string metricName string } @@ -39,6 +51,12 @@ type measuredClientStream struct { func (t *measuredClientStream) RecvMsg(m interface{}) error { metric := NewMetric(t.metricName) metric.AddTag("method", t.method) + if env, ok := t.ctx.Value(EnvIDKey{}).(string); ok { + metric.AddTag("envId", env) + } + if rt, ok := t.ctx.Value(RunTypeKey{}).(string); ok { + metric.AddTag("runtype", rt) + } defer TimerSendSingle(&metric, Millisecond)() err := t.ClientStream.RecvMsg(m) @@ -63,6 +81,7 @@ func SetupStreamClientInterceptor(metricName string, convert NameConvertType) gr return &measuredClientStream{ ClientStream: clientStream, + ctx: ctx, method: convert(method), metricName: metricName, }, nil @@ -73,6 +92,12 @@ func SetupUnaryClientInterceptor(name string, convert NameConvertType) grpc.Unar return func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { metric := NewMetric(name) metric.AddTag("method", convert(method)) + if env, ok := ctx.Value(EnvIDKey{}).(string); ok { + metric.AddTag("envId", env) + } + if rt, ok := ctx.Value(RunTypeKey{}).(string); ok { + metric.AddTag("runtype", rt) + } defer TimerSendSingle(&metric, Millisecond)() return invoker(ctx, method, req, reply, cc, opts...) } diff --git a/core/environment/environment.go b/core/environment/environment.go index 50bf356cb..3c8bfe99c 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -669,6 +669,7 @@ func (env *Environment) handleHooks(workflow workflow.Role, trigger string, weig metric := monitoring.NewMetric("hooks") metric.AddTag("trigger", trigger) metric.AddTag("envId", env.id.String()) + metric.AddTag("runtype", env.GetRunType().String()) defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() allWeightsSet := make(callable.HooksMap) diff --git a/core/integration/ccdb/plugin.go b/core/integration/ccdb/plugin.go index b420e3be9..763fd4883 100644 --- a/core/integration/ccdb/plugin.go +++ b/core/integration/ccdb/plugin.go @@ -481,7 +481,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } p.existingRuns[grp.runNumber] = types.Nil{} - err := p.uploadCurrentGRP(grp, envId, true) + err := p.uploadCurrentGRP(grp, envId, true, varStack, "RunStart") if err != nil { log.WithField("call", "RunStop"). WithField("run", grp.runNumber). @@ -506,7 +506,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { _, runExists := p.existingRuns[grp.runNumber] if runExists { delete(p.existingRuns, grp.runNumber) - err := p.uploadCurrentGRP(grp, envId, false) + err := p.uploadCurrentGRP(grp, envId, false, varStack, "RunStop") if err != nil { log.WithField("call", "RunStop"). WithField("run", grp.runNumber). @@ -525,7 +525,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } -func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refresh bool) error { +func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refresh bool, varStack map[string]string, callName string) error { if grp == nil { return errors.New(fmt.Sprintf("Failed to create a GRP object")) } @@ -550,6 +550,8 @@ func (p *Plugin) uploadCurrentGRP(grp *GeneralRunParameters, envId string, refre metric := monitoring.NewMetric("ccdb") metric.AddTag("envId", envId) + metric.AddTag("runtype", integration.ExtractRunTypeOrUndefined(varStack)) + metric.AddTag("call", callName) defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() cmd := exec.CommandContext(ctx, "bash", "-c", cmdStr) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 2982fcf56..8886f6492 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -289,18 +289,18 @@ func (p *Plugin) Init(instanceId string) error { in := &dcspb.SubscriptionRequest{ InstanceId: instanceId, } - + // Always start the goroutine, even if initial subscription fails go func() { var evStream dcspb.Configurator_SubscribeClient var err error - + for { // Try to establish subscription if we don't have one if evStream == nil { log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). Debug("attempting to subscribe to DCS service") - + evStream, err = p.dcsClient.Subscribe(context.Background(), in, grpc.EmptyCallOption{}) if err != nil { log.WithField("endpoint", viper.GetString("dcsServiceEndpoint")). @@ -699,7 +699,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var stream dcspb.Configurator_StartOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "PFR", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) @@ -746,7 +746,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - err, payloadJson = PFRgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) + err, payloadJson = PFRgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, + detectorStatusMap, callFailedStr, payload, integration.ExtractRunTypeOrUndefined(varStack)) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -1064,7 +1065,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var stream dcspb.Configurator_StartOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "SOR", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() detectorStatusMap := make(map[dcspb.Detector]dcspb.DetectorState) @@ -1112,7 +1113,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } p.pendingEORs[envId] = runNumber64 // make sure the corresponding EOR runs sooner or later - err, payloadJson = SORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) + err, payloadJson = SORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, + detectorStatusMap, callFailedStr, payload, integration.ExtractRunTypeOrUndefined(varStack)) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -1298,7 +1300,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { var stream dcspb.Configurator_EndOfRunClient timeout := callable.AcquireTimeout(DCS_GENERAL_OP_TIMEOUT, varStack, "EOR", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -1356,7 +1358,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { detectorStatusMap[v] = dcspb.DetectorState_NULL_STATE } - err, payloadJson = EORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, detectorStatusMap, callFailedStr, payload) + err, payloadJson = EORgRPCCommunicationLoop(ctx, timeout, call, envId, payloadJson, stream, + detectorStatusMap, callFailedStr, payload, integration.ExtractRunTypeOrUndefined(varStack)) dcsFailedEcsDetectors := make([]string, 0) dcsopOk := true @@ -1452,17 +1455,19 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } -func newMetric(method string) monitoring.Metric { +func newMetric(runType, envId, method string) monitoring.Metric { metric := monitoring.NewMetric("dcsecs") metric.AddTag("method", method) + metric.AddTag("envId", envId) + metric.AddTag("runtype", runType) return metric } func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, payloadJsonForKafka []byte, stream dcspb.Configurator_EndOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, - callFailedStr string, payload map[string]interface{}, + callFailedStr string, payload map[string]interface{}, runType string, ) (error, []byte) { - metric := newMetric("EOR") + metric := newMetric(runType, envId, "EOR") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() var dcsEvent *dcspb.RunEvent @@ -1692,9 +1697,9 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, - callFailedStr string, payload map[string]interface{}, + callFailedStr string, payload map[string]interface{}, runType string, ) (error, []byte) { - metric := newMetric("SOR") + metric := newMetric(runType, envId, "SOR") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() var dcsEvent *dcspb.RunEvent @@ -1961,9 +1966,9 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, - callFailedStr string, payload map[string]interface{}, + callFailedStr string, payload map[string]interface{}, runType string, ) (error, []byte) { - metric := newMetric("PFR") + metric := newMetric(runType, envId, "PFR") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() var err error diff --git a/core/integration/ddsched/plugin.go b/core/integration/ddsched/plugin.go index 917b1a6e5..c6d3e1dd6 100644 --- a/core/integration/ddsched/plugin.go +++ b/core/integration/ddsched/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" @@ -163,6 +164,7 @@ func (p *Plugin) partitionStatesForEnvs(envIds []uid.ID) map[uid.ID]map[string]s EnvironmentId: envId.String(), } ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("ddschedStatusTimeout")) + ctx = monitoring.AddEnvAndRunType(ctx, envId.String(), "none") state, err := p.ddSchedClient.PartitionStatus(ctx, &in, grpc.EmptyCallOption{}) cancel() if err != nil { @@ -321,11 +323,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var ( - response *ddpb.PartitionResponse - ) + var response *ddpb.PartitionResponse timeout := callable.AcquireTimeout(DDSCHED_INITIALIZE_TIMEOUT, varStack, "Initialize", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -574,11 +574,9 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var ( - response *ddpb.PartitionResponse - ) + var response *ddpb.PartitionResponse timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -821,16 +819,14 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { return } - var ( - response *ddpb.PartitionResponse - ) + var response *ddpb.PartitionResponse infoReq := ddpb.PartitionInfo{ EnvironmentId: envId, PartitionId: envId, } timeout := callable.AcquireTimeout(DDSCHED_TERMINATE_TIMEOUT, varStack, "Terminate", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 94c093d79..11a1d9fa3 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -183,7 +183,7 @@ func (p *Plugin) GetConnectionState() string { func (p *Plugin) queryPartitionStatus() { defer utils.TimeTrackFunction(time.Now(), log.WithPrefix("odcclient")) - ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) + ctx, cancel := integration.NewContextEmptyEnvIdRunType(ODC_STATUS_TIMEOUT) defer cancel() statusRep := &odc.StatusReply{} @@ -238,7 +238,7 @@ func (p *Plugin) queryPartitionStatus() { go func(idx int, partId uid.ID) { defer wg.Done() - ctx, cancel := context.WithTimeout(context.Background(), ODC_STATUS_TIMEOUT) + ctx, cancel := integration.NewContextEmptyEnvIdRunType(ODC_STATUS_TIMEOUT) defer cancel() odcPartStateRep, err := p.odcClient.GetState(ctx, &odc.StateRequest{ @@ -1179,7 +1179,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_PARTITIONINITIALIZE_TIMEOUT, varStack, "PartitionInitialize", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err = handleRun(ctx, p.odcClient, isManualXml, map[string]string{ @@ -1292,7 +1292,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } } - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err := handleConfigure(ctx, p.odcClient, arguments, paddingTimeout, envId, call) if err != nil { @@ -1314,7 +1314,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "EPN Reset call failed" - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, call.VarStack, timeout) defer cancel() err := handleReset(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { @@ -1343,7 +1343,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "EPN PartitionTerminate call failed" - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err := handlePartitionTerminate(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { @@ -1414,7 +1414,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { arguments["original_run_number"] = originalRunNumber } - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err = handleStart(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) if err != nil { @@ -1462,7 +1462,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err = handleStop(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) if err != nil { @@ -1486,7 +1486,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "EnsureStop", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() state, err := handleGetState(ctx, p.odcClient, envId) @@ -1551,7 +1551,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "EPN EnsureCleanup call failed" - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { @@ -1572,7 +1572,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "EPN PreDeploymentCleanup call failed" - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err := handleCleanup(ctx, p.odcClient, nil, paddingTimeout, "", call) if err != nil { @@ -1593,7 +1593,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { callFailedStr := "EPN EnsureCleanupLegacy call failed" - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() err := handleCleanupLegacy(ctx, p.odcClient, nil, paddingTimeout, envId, call) if err != nil { diff --git a/core/integration/plugin.go b/core/integration/plugin.go index 12bd01fbc..48e87626b 100644 --- a/core/integration/plugin.go +++ b/core/integration/plugin.go @@ -27,9 +27,12 @@ package integration import ( + "context" "sync" + "time" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/sirupsen/logrus" "github.com/spf13/viper" @@ -121,7 +124,7 @@ func (p Plugins) CallStack(data interface{}) (stack map[string]interface{}) { func (p Plugins) ObjectStack(varStack map[string]string, baseConfigStack map[string]string) (stack map[string]interface{}) { stack = make(map[string]interface{}) - //HACK: this is a dummy object+function to allow odc.GenerateEPNTopologyFullname in the root role + // HACK: this is a dummy object+function to allow odc.GenerateEPNTopologyFullname in the root role stack["odc"] = map[string]interface{}{ "GenerateEPNTopologyFullname": func() string { return "" @@ -221,3 +224,26 @@ func Reset() { loaderOnce = sync.Once{} pluginLoaders = make(map[string]func() Plugin) } + +func ExtractRunTypeOrUndefined(varStack map[string]string) string { + runType, ok := varStack["run_type"] + if !ok { + runType = "undefined" + } + return runType +} + +func NewContext(envId string, varStack map[string]string, timeout time.Duration) (context.Context, context.CancelFunc) { + return context.WithTimeout( + monitoring.AddEnvAndRunType(context.Background(), + envId, + ExtractRunTypeOrUndefined(varStack), + ), + timeout) +} + +func NewContextEmptyEnvIdRunType(timeout time.Duration) (context.Context, context.CancelFunc) { + return context.WithTimeout( + monitoring.AddEnvAndRunType(context.Background(), "none", "none"), + timeout) +} diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 2ebdc84d7..556706f96 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -40,6 +40,7 @@ import ( "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" @@ -124,7 +125,7 @@ func (p *Plugin) GetConnectionState() string { } func (p *Plugin) queryRunList() { - ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgPollingTimeout")) + ctx, cancel := integration.NewContextEmptyEnvIdRunType(viper.GetDuration("trgPollingTimeout")) defer cancel() runReply, err := p.trgClient.RunList(ctx, &trgpb.Empty{}, grpc.EmptyCallOption{}) @@ -324,7 +325,7 @@ func (p *Plugin) reconcile() { } }*/ - ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgReconciliationTimeout")) + ctx, cancel := integration.NewContextEmptyEnvIdRunType(viper.GetDuration("trgReconciliationTimeout")) _, err := p.trgClient.RunStop(ctx, &in, grpc.EmptyCallOption{}) cancel() @@ -349,7 +350,8 @@ func (p *Plugin) reconcile() { } } if trgRun.State == CTP_LOADED && trgRun.Cardinality == CTP_GLOBAL { - ctx, cancel := context.WithTimeout(context.Background(), viper.GetDuration("trgReconciliationTimeout")) + ctx, cancel := integration.NewContextEmptyEnvIdRunType(viper.GetDuration("trgReconciliationTimeout")) + monitoring.AddEnvAndRunType(ctx, "none", "none") _, err := p.trgClient.RunUnload(ctx, &in, grpc.EmptyCallOption{}) cancel() if err != nil { @@ -371,7 +373,6 @@ func (p *Plugin) reconcile() { } } p.cachedStatusMu.RUnlock() - } func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { @@ -464,7 +465,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_PFR_TIMEOUT, varStack, "PrepareForRun", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -665,7 +666,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_LOAD_TIMEOUT, varStack, "RunLoad", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -843,7 +844,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_START_TIMEOUT, varStack, "RunStart", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() payload := map[string]interface{}{ @@ -1259,7 +1260,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("ALIECS EOR operation : performing TRG Run Stop ") timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "RunStop", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() return runStopFunc(ctx, runNumber64) @@ -1280,7 +1281,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Info("ALIECS EOR operation : performing TRG Run Unload ") timeout := callable.AcquireTimeout(TRG_UNLOAD_TIMEOUT, varStack, "RunUnload", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() return runUnloadFunc(ctx, runNumber64) @@ -1296,7 +1297,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_CLEANUP_TIMEOUT, varStack, "Cleanup", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() // runStop if found pending @@ -1354,7 +1355,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "EnsureRunStop", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() // runStop if found pending @@ -1396,7 +1397,7 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { } timeout := callable.AcquireTimeout(TRG_STOP_TIMEOUT, varStack, "EnsureRunUnload", envId) - ctx, cancel := context.WithTimeout(context.Background(), timeout) + ctx, cancel := integration.NewContext(envId, varStack, timeout) defer cancel() // runUnload if found pending diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index f0a04e476..502688c1e 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -47,7 +47,10 @@ import ( "github.com/sirupsen/logrus" ) -var log = logger.New(logrus.StandardLogger(), "callable") +var ( + log = logger.New(logrus.StandardLogger(), "callable") + none = "none" +) type Call struct { Func string @@ -226,6 +229,7 @@ func (c *Call) Call() error { func (c *Call) newMetric(name string) monitoring.Metric { metric := monitoring.NewMetric(name) + metric.AddTag("runtype", c.getRunTypeTag()) metric.AddTag("name", c.GetName()) metric.AddTag("trigger", c.GetTraits().Trigger) metric.AddTag("envId", c.parentRole.GetEnvironmentId().String()) @@ -266,6 +270,17 @@ func (c *Call) Cancel() bool { return false } +func (c *Call) getRunTypeTag() string { + varStack, err := c.parentRole.ConsolidatedVarStack() + if err != nil { + return none + } + if rt, ok := varStack["run_type"]; ok { + return rt + } + return none +} + func (c *Call) GetParentRole() interface{} { return c.parentRole } From 0db3da9506bb58ba35c90c461f0fb04eb8bf671d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 4 Sep 2025 12:31:37 +0200 Subject: [PATCH 2200/2352] v1.43.0 [build] Bump to v1.43.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index ae3d7ad99..490857830 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 42 +VERSION_MINOR := 43 VERSION_PATCH := 0 From 3585caca250e74c52ab12e948c65f1ff0f674028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 28 Aug 2025 15:52:01 +0200 Subject: [PATCH 2201/2352] [dcs] sending SOR,PFR,EOR metrics per detector results of dcs calls renaming --- core/integration/dcs/plugin.go | 83 ++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 4 deletions(-) diff --git a/core/integration/dcs/plugin.go b/core/integration/dcs/plugin.go index 8886f6492..0c202e2bf 100644 --- a/core/integration/dcs/plugin.go +++ b/core/integration/dcs/plugin.go @@ -67,6 +67,12 @@ const ( DCS_GENERAL_OP_TIMEOUT = 45 * time.Second DCS_TIME_FORMAT = "2006-01-02 15:04:05.000" TOPIC = topic.IntegratedService + topic.Separator + "dcs" + + DCS_RESULT_OK = "ok" + DCS_RESULT_TIMEOUT = "timeout" + DCS_RESULT_GRPC_TIMEOUT = "gRPC_timeout" + DCS_RESULT_GRPC_UNKNOWN = "gRPC_unknown" + DCS_RESULT_GRPC_ERROR = "gRPC_error" ) type Plugin struct { @@ -1469,6 +1475,13 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * ) (error, []byte) { metric := newMetric(runType, envId, "EOR") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + eor := "EOR" + durationsPerDetector := map[dcspb.Detector]time.Duration{} + start := time.Now() + + totalCallDurationMetric := newMetric(runType, envId, eor) + totalCallDurationMetric.AddTag("detector", "All") + defer monitoring.TimerSendSingle(&totalCallDurationMetric, monitoring.Millisecond)() var dcsEvent *dcspb.RunEvent var err error @@ -1488,6 +1501,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_TIMEOUT) break } dcsEvent, err = stream.Recv() @@ -1495,6 +1509,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * log.Debug("DCS EOR event stream was closed from the DCS side (EOF)") err = nil + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_OK) break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1514,6 +1529,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_TIMEOUT) break } if err != nil { // stream termination in case of unknown or gRPC error @@ -1535,6 +1551,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_TIMEOUT) } else if got == codes.Unknown { // unknown error, likely not a gRPC code logMsg := "bad DCS EOR event received, any future DCS events are ignored" @@ -1551,6 +1568,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: logMsg, }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_UNKNOWN) } else { // some other gRPC error code log.WithError(err). Debug("DCS EOR call error") @@ -1566,6 +1584,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_ERROR) } break @@ -1581,6 +1600,7 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * } detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + durationsPerDetector[dcsEvent.GetDetector()] = time.Since(start) ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) if dcsEvent.GetState() == dcspb.DetectorState_EOR_FAILURE { @@ -1692,6 +1712,9 @@ func EORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * }) } } + + convertAndSendDetectorDurationsAndStates(eor, detectorStatusMap, durationsPerDetector, envId, runType, &totalCallDurationMetric) + return err, payloadJsonForKafka } @@ -1699,8 +1722,13 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, callFailedStr string, payload map[string]interface{}, runType string, ) (error, []byte) { - metric := newMetric(runType, envId, "SOR") - defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + sor := "SOR" + detectorDurations := map[dcspb.Detector]time.Duration{} + start := time.Now() + + totalCallDurationMetric := newMetric(runType, envId, sor) + totalCallDurationMetric.AddTag("detector", "All") + defer monitoring.TimerSendSingle(&totalCallDurationMetric, monitoring.Millisecond)() var dcsEvent *dcspb.RunEvent var err error @@ -1720,6 +1748,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_TIMEOUT) break } dcsEvent, err = stream.Recv() @@ -1727,6 +1756,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * log.Debug("DCS SOR event stream was closed from the DCS side (EOF)") err = nil + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_OK) break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -1746,6 +1776,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_TIMEOUT) break } if err != nil { // stream termination in case of unknown or gRPC error @@ -1768,6 +1799,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_TIMEOUT) } else if got == codes.Unknown { // unknown error, likely not a gRPC code logMsg := "bad DCS SOR event received, any future DCS events are ignored" log.WithError(err). @@ -1783,6 +1815,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: logMsg, }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_UNKNOWN) } else { // some other gRPC error code log.WithError(err). Debug("DCS SOR call error") @@ -1798,6 +1831,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_ERROR) } break @@ -1813,6 +1847,7 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * } detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + detectorDurations[dcsEvent.GetDetector()] = time.Since(start) ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { @@ -1961,15 +1996,45 @@ func SORgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * }) } } + + convertAndSendDetectorDurationsAndStates(sor, detectorStatusMap, detectorDurations, envId, runType, &totalCallDurationMetric) + return err, payloadJsonForKafka } +func convertAndSendDetectorDurationsAndStates(method string, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, detectorDurations map[dcspb.Detector]time.Duration, envId, runType string, totalCallMetric *monitoring.Metric) { + resultsMap := make(map[dcspb.DetectorState]int) + for dcsDet, state := range detectorStatusMap { + metric := newMetric(runType, envId, method) + det := dcsToEcsDetector(dcsDet) + metric.AddTag("detector", det) + metric.AddTag("state", dcspb.DetectorState_name[int32(state)]) + resultsMap[state] += 1 + if duration, ok := detectorDurations[dcsDet]; ok { + metric.SetFieldInt64("execution_time_ms", duration.Milliseconds()) + monitoring.Send(&metric) + } + } + for detectorState, detectorCount := range resultsMap { + totalCallMetric.SetFieldInt64(dcspb.DetectorState_name[int32(detectorState)], int64(detectorCount)) + } +} + +func addFunctionResult(metric *monitoring.Metric, result string) { + metric.AddTag("result", result) +} + func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call *callable.Call, envId string, payloadJsonForKafka []byte, stream dcspb.Configurator_StartOfRunClient, detectorStatusMap map[dcspb.Detector]dcspb.DetectorState, callFailedStr string, payload map[string]interface{}, runType string, ) (error, []byte) { - metric := newMetric(runType, envId, "PFR") - defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + pfr := "PFR" + detectorDurations := map[dcspb.Detector]time.Duration{} + start := time.Now() + + totalCallDurationMetric := newMetric(runType, envId, pfr) + totalCallDurationMetric.AddTag("detector", "All") + defer monitoring.TimerSendSingle(&totalCallDurationMetric, monitoring.Millisecond)() var err error var dcsEvent *dcspb.RunEvent @@ -1989,6 +2054,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_TIMEOUT) break } dcsEvent, err = stream.Recv() @@ -1996,6 +2062,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * log.Debug("DCS PFR event stream was closed from the DCS side (EOF)") err = nil + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_OK) break // no more data } if errors.Is(err, context.DeadlineExceeded) { @@ -2015,6 +2082,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_TIMEOUT) break } if err != nil { // stream termination in case of unknown or gRPC error @@ -2036,6 +2104,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_TIMEOUT) } else if got == codes.Unknown { // unknown error, likely not a gRPC code logMsg := "bad DCS PFR event received, any future DCS events are ignored" log.WithError(err). @@ -2052,6 +2121,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: logMsg, }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_UNKNOWN) } else { // some other gRPC error code log.WithError(err). Error("DCS PFR call error") @@ -2067,6 +2137,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * Payload: string(payloadJsonForKafka[:]), Error: err.Error(), }) + addFunctionResult(&totalCallDurationMetric, DCS_RESULT_GRPC_ERROR) } break @@ -2083,6 +2154,7 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * } detectorStatusMap[dcsEvent.GetDetector()] = dcsEvent.GetState() + detectorDurations[dcsEvent.GetDetector()] = time.Since(start) ecsDet := dcsToEcsDetector(dcsEvent.GetDetector()) if dcsEvent.GetState() == dcspb.DetectorState_SOR_FAILURE { @@ -2230,6 +2302,9 @@ func PFRgRPCCommunicationLoop(ctx context.Context, timeout time.Duration, call * }) } } + + convertAndSendDetectorDurationsAndStates(pfr, detectorStatusMap, detectorDurations, envId, runType, &totalCallDurationMetric) + return err, payloadJsonForKafka } From 5a36d3c5e8fe8981568ef5d9b77392d42946bb32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 15 Sep 2025 16:56:46 +0200 Subject: [PATCH 2202/2352] OCTRL-1046: Missing main transition event for CREATE (#750) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [core] Added transition started and completed to the CreateEnvironment Co-authored-by: Michal Tichák --- core/environment/manager.go | 66 ++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/core/environment/manager.go b/core/environment/manager.go index bdb720391..d6a81b017 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -202,7 +202,7 @@ func (envs *Manager) GetActiveDetectors() system.IDMap { return response } -func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string, public bool, newId uid.ID, autoTransition bool) (uid.ID, error) { +func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string]string, public bool, newId uid.ID, autoTransition bool) (resultEnvId uid.ID, resultErr error) { // Before we load the workflow, we get the list of currently active detectors. This query must be performed before // loading the workflow in order to compare the currently used detectors with the detectors required by the newly // created environment. @@ -214,6 +214,31 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] _ = json.Unmarshal([]byte(lastRequestUserJ), lastRequestUser) } + // CreateEnvironment() is not transition from state machine, so we need to emit the same message as in TryTransition + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "PENDING", + Transition: "CREATE", + TransitionStatus: evpb.OpStatus_STARTED, + LastRequestUser: lastRequestUser, + Message: "transition starting", + }) + + // report error of the CreateEnvironment() in the same way as in TryTransition + defer func() { + if resultErr != nil { + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + Error: resultErr.Error(), + LastRequestUser: lastRequestUser, + Message: "transition error", + State: "PENDING", + Transition: "CREATE", + TransitionStatus: evpb.OpStatus_DONE_ERROR, + }) + } + }() + // in case of err==nil, env will be false unless user // set it to True which will be overwritten in server.go workflowPublicInfo, err := parseWorkflowPublicInfo(workflowPath) @@ -222,7 +247,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("workflow path", workflowPath). WithError(err). Warn("parse workflow public info failed.") - return newId, fmt.Errorf("workflow public info parsing failed: %w", err) + + resultEnvId = newId + resultErr = fmt.Errorf("workflow public info parsing failed: %w", err) + return } the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ @@ -305,7 +333,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] log.WithError(err). WithField("partition", gotEnvId.String()). Logf(logrus.FatalLevel, "environment creation failed") - return gotEnvId, err + resultEnvId = gotEnvId + resultErr = err + return } log.WithFields(logrus.Fields{ @@ -352,7 +382,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) - return env.id, err + resultEnvId = env.id + resultErr = err + return } // Ensure we provide a very defaulty `detectors` variable @@ -360,13 +392,17 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] if err != nil { err = fmt.Errorf("cannot acquire detectors in loaded workflow template: %w", err) - return env.id, err + resultEnvId = env.id + resultErr = err + return } detectorsStr, err := SliceToJSONSlice(detectors) if err != nil { err = fmt.Errorf("cannot process detectors in loaded workflow template: %w", err) - return env.id, err + resultEnvId = env.id + resultErr = err + return } env.GlobalDefaults.Set("detectors", detectorsStr) @@ -379,7 +415,10 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] for det := range neededDetectors { if _, contains := alreadyActiveDetectors[det]; contains { // required detector det is already active in some other environment - return env.id, fmt.Errorf("detector %s is already in use", det.String()) + + resultEnvId = env.id + resultErr = fmt.Errorf("detector %s is already in use", det.String()) + return } } @@ -396,6 +435,15 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WorkflowTemplateInfo: env.GetWorkflowInfo(), }) + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + LastRequestUser: lastRequestUser, + Message: "transition completed successfully", + State: env.CurrentState(), + Transition: "CREATE", + TransitionStatus: evpb.OpStatus_DONE_OK, + }) + log.WithField("method", "CreateEnvironment"). WithField("level", infologger.IL_Devel). Debug("envman write lock") @@ -528,7 +576,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] }() } - return env.id, err + resultEnvId = env.id + resultErr = err + return } // Deployment/configuration failure code path starts here From d6cb42632cb3606c33fb6fc79f8f96c97f5e6e4a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 25 Sep 2025 08:13:04 +0200 Subject: [PATCH 2203/2352] Bump to v1.44.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 490857830..f3077269c 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 43 +VERSION_MINOR := 44 VERSION_PATCH := 0 From c092647c9a71217d53a7578496ed0405517905dc Mon Sep 17 00:00:00 2001 From: George Raduta Date: Wed, 8 Oct 2025 14:57:48 +0200 Subject: [PATCH 2204/2352] [O2B-1475] Add proto message and associated ones for BeamModeEvent changes (#752) * Add new message object in proto for BeamMode * leave more space for meta events in events.proto * regenerate go sources and documentation due to the events.proto update --------- Co-authored-by: Piotr Konopka --- common/protos/common.pb.go | 299 ++++++++++++++++++++++++++++++++++-- common/protos/common.proto | 47 +++++- common/protos/events.pb.go | 189 +++++++++++++++++------ common/protos/events.proto | 15 ++ core/protos/o2control.pb.go | 2 + docs/apidocs_aliecs.md | 84 +++++++++- 6 files changed, 579 insertions(+), 57 deletions(-) diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index 24a60e97c..d3d7d8455 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -43,6 +43,117 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// * +// Beam modes as defined and sent by LHC DIP client plus: +// * virtual type LOST_BEAMS - that is generated when beam 1 and beam 2 energy values are not equal anymore as per LHC DIP track: dip/acc/LHC/RunControl/SafeBeam +// * virtual type UNKNOWN - that is generated when there is no beam in the machine or value not added by the BKP-LHC Client +// Source of Beam Modes: https://lhc-commissioning.web.cern.ch/systems/data-exchange/doc/LHC-OP-ES-0005-10-00.pdf +type BeamMode int32 + +const ( + BeamMode_UNKNOWN BeamMode = 0 // virtual type + BeamMode_SETUP BeamMode = 1 + BeamMode_ABORT BeamMode = 2 + BeamMode_INJECTION_PROBE_BEAM BeamMode = 3 + BeamMode_INJECTION_SETUP_BEAM BeamMode = 4 + BeamMode_INJECTION_PHYSICS_BEAM BeamMode = 5 + BeamMode_PREPARE_RAMP BeamMode = 6 + BeamMode_RAMP BeamMode = 7 + BeamMode_FLAT_TOP BeamMode = 8 + BeamMode_SQUEEZE BeamMode = 9 + BeamMode_ADJUST BeamMode = 10 + BeamMode_STABLE_BEAMS BeamMode = 11 + BeamMode_LOST_BEAMS BeamMode = 12 // virtual type + BeamMode_UNSTABLE_BEAMS BeamMode = 13 + BeamMode_BEAM_DUMP_WARNING BeamMode = 14 + BeamMode_BEAM_DUMP BeamMode = 15 + BeamMode_RAMP_DOWN BeamMode = 16 + BeamMode_CYCLING BeamMode = 17 + BeamMode_RECOVERY BeamMode = 18 + BeamMode_INJECT_AND_DUMP BeamMode = 19 + BeamMode_CIRCULATE_AND_DUMP BeamMode = 20 + BeamMode_NO_BEAM BeamMode = 21 +) + +// Enum value maps for BeamMode. +var ( + BeamMode_name = map[int32]string{ + 0: "UNKNOWN", + 1: "SETUP", + 2: "ABORT", + 3: "INJECTION_PROBE_BEAM", + 4: "INJECTION_SETUP_BEAM", + 5: "INJECTION_PHYSICS_BEAM", + 6: "PREPARE_RAMP", + 7: "RAMP", + 8: "FLAT_TOP", + 9: "SQUEEZE", + 10: "ADJUST", + 11: "STABLE_BEAMS", + 12: "LOST_BEAMS", + 13: "UNSTABLE_BEAMS", + 14: "BEAM_DUMP_WARNING", + 15: "BEAM_DUMP", + 16: "RAMP_DOWN", + 17: "CYCLING", + 18: "RECOVERY", + 19: "INJECT_AND_DUMP", + 20: "CIRCULATE_AND_DUMP", + 21: "NO_BEAM", + } + BeamMode_value = map[string]int32{ + "UNKNOWN": 0, + "SETUP": 1, + "ABORT": 2, + "INJECTION_PROBE_BEAM": 3, + "INJECTION_SETUP_BEAM": 4, + "INJECTION_PHYSICS_BEAM": 5, + "PREPARE_RAMP": 6, + "RAMP": 7, + "FLAT_TOP": 8, + "SQUEEZE": 9, + "ADJUST": 10, + "STABLE_BEAMS": 11, + "LOST_BEAMS": 12, + "UNSTABLE_BEAMS": 13, + "BEAM_DUMP_WARNING": 14, + "BEAM_DUMP": 15, + "RAMP_DOWN": 16, + "CYCLING": 17, + "RECOVERY": 18, + "INJECT_AND_DUMP": 19, + "CIRCULATE_AND_DUMP": 20, + "NO_BEAM": 21, + } +) + +func (x BeamMode) Enum() *BeamMode { + p := new(BeamMode) + *p = x + return p +} + +func (x BeamMode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (BeamMode) Descriptor() protoreflect.EnumDescriptor { + return file_protos_common_proto_enumTypes[0].Descriptor() +} + +func (BeamMode) Type() protoreflect.EnumType { + return &file_protos_common_proto_enumTypes[0] +} + +func (x BeamMode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use BeamMode.Descriptor instead. +func (BeamMode) EnumDescriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{0} +} + type User struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -180,6 +291,111 @@ func (x *WorkflowTemplateInfo) GetPublic() bool { return false } +// * +// Beam information at a specific point in time (e.g. start or end of stable beams) +type BeamInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + StableBeamsStart int64 `protobuf:"varint,1,opt,name=stableBeamsStart,proto3" json:"stableBeamsStart,omitempty"` // milliseconds since epoch when stable beams started + StableBeamsEnd int64 `protobuf:"varint,2,opt,name=stableBeamsEnd,proto3" json:"stableBeamsEnd,omitempty"` // milliseconds since epoch when stable beams ended + FillNumber int32 `protobuf:"varint,3,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` // LHC fill number + FillingSchemeName string `protobuf:"bytes,4,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` // LHC filling scheme name e.g. 25ns_2460b_2448_2089_2227_144bpi_20inj + Beam1Energy float32 `protobuf:"fixed32,5,opt,name=beam1Energy,proto3" json:"beam1Energy,omitempty"` // in GeV + Beam2Energy float32 `protobuf:"fixed32,6,opt,name=beam2Energy,proto3" json:"beam2Energy,omitempty"` // in GeV + BeamType string `protobuf:"bytes,7,opt,name=beamType,proto3" json:"beamType,omitempty"` // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p + BeamMode BeamMode `protobuf:"varint,8,opt,name=beamMode,proto3,enum=common.BeamMode" json:"beamMode,omitempty"` +} + +func (x *BeamInfo) Reset() { + *x = BeamInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_common_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *BeamInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeamInfo) ProtoMessage() {} + +func (x *BeamInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_common_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use BeamInfo.ProtoReflect.Descriptor instead. +func (*BeamInfo) Descriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{2} +} + +func (x *BeamInfo) GetStableBeamsStart() int64 { + if x != nil { + return x.StableBeamsStart + } + return 0 +} + +func (x *BeamInfo) GetStableBeamsEnd() int64 { + if x != nil { + return x.StableBeamsEnd + } + return 0 +} + +func (x *BeamInfo) GetFillNumber() int32 { + if x != nil { + return x.FillNumber + } + return 0 +} + +func (x *BeamInfo) GetFillingSchemeName() string { + if x != nil { + return x.FillingSchemeName + } + return "" +} + +func (x *BeamInfo) GetBeam1Energy() float32 { + if x != nil { + return x.Beam1Energy + } + return 0 +} + +func (x *BeamInfo) GetBeam2Energy() float32 { + if x != nil { + return x.Beam2Energy + } + return 0 +} + +func (x *BeamInfo) GetBeamType() string { + if x != nil { + return x.BeamType + } + return "" +} + +func (x *BeamInfo) GetBeamMode() BeamMode { + if x != nil { + return x.BeamMode + } + return BeamMode_UNKNOWN +} + var File_protos_common_proto protoreflect.FileDescriptor var file_protos_common_proto_rawDesc = []byte{ @@ -199,7 +415,51 @@ var file_protos_common_proto_rawDesc = []byte{ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, + 0x6c, 0x69, 0x63, 0x22, 0xba, 0x02, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, + 0x73, 0x45, 0x6e, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x66, 0x69, 0x6c, 0x6c, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x31, 0x45, 0x6e, 0x65, 0x72, 0x67, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x31, 0x45, 0x6e, + 0x65, 0x72, 0x67, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x32, 0x45, 0x6e, 0x65, + 0x72, 0x67, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x32, + 0x45, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x65, + 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, + 0x2a, 0x80, 0x03, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x45, + 0x54, 0x55, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, + 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, + 0x4f, 0x42, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, + 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x42, 0x45, + 0x41, 0x4d, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x05, + 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x41, 0x4d, 0x50, + 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, + 0x46, 0x4c, 0x41, 0x54, 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x51, + 0x55, 0x45, 0x45, 0x5a, 0x45, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x4a, 0x55, 0x53, + 0x54, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, + 0x41, 0x4d, 0x53, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x53, 0x54, 0x5f, 0x42, 0x45, + 0x41, 0x4d, 0x53, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x45, 0x41, + 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x0e, + 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x0f, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x10, 0x12, 0x0b, + 0x0a, 0x07, 0x43, 0x59, 0x43, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, 0x0c, 0x0a, 0x08, 0x52, + 0x45, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x4a, + 0x45, 0x43, 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x13, 0x12, 0x16, + 0x0a, 0x12, 0x43, 0x49, 0x52, 0x43, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x44, 0x55, 0x4d, 0x50, 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x42, 0x45, 0x41, + 0x4d, 0x10, 0x15, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, @@ -219,17 +479,21 @@ func file_protos_common_proto_rawDescGZIP() []byte { return file_protos_common_proto_rawDescData } -var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_protos_common_proto_goTypes = []interface{}{ - (*User)(nil), // 0: common.User - (*WorkflowTemplateInfo)(nil), // 1: common.WorkflowTemplateInfo + (BeamMode)(0), // 0: common.BeamMode + (*User)(nil), // 1: common.User + (*WorkflowTemplateInfo)(nil), // 2: common.WorkflowTemplateInfo + (*BeamInfo)(nil), // 3: common.BeamInfo } var file_protos_common_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 0, // 0: common.BeamInfo.beamMode:type_name -> common.BeamMode + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_protos_common_proto_init() } @@ -262,6 +526,18 @@ func file_protos_common_proto_init() { return nil } } + file_protos_common_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BeamInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_protos_common_proto_msgTypes[0].OneofWrappers = []interface{}{} type x struct{} @@ -269,13 +545,14 @@ func file_protos_common_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_common_proto_rawDesc, - NumEnums: 0, - NumMessages: 2, + NumEnums: 1, + NumMessages: 3, NumExtensions: 0, NumServices: 0, }, GoTypes: file_protos_common_proto_goTypes, DependencyIndexes: file_protos_common_proto_depIdxs, + EnumInfos: file_protos_common_proto_enumTypes, MessageInfos: file_protos_common_proto_msgTypes, }.Build() File_protos_common_proto = out.File diff --git a/common/protos/common.proto b/common/protos/common.proto index 435790e40..f1e77874d 100644 --- a/common/protos/common.proto +++ b/common/protos/common.proto @@ -45,4 +45,49 @@ message WorkflowTemplateInfo { string description = 2; string path = 3; bool public = 4; // whether the environment is public or not -} \ No newline at end of file +} + +/** + * Beam information at a specific point in time (e.g. start or end of stable beams) + */ +message BeamInfo { + int64 stableBeamsStart = 1; // milliseconds since epoch when stable beams started + int64 stableBeamsEnd = 2; // milliseconds since epoch when stable beams ended + int32 fillNumber = 3; // LHC fill number + string fillingSchemeName = 4; // LHC filling scheme name e.g. 25ns_2460b_2448_2089_2227_144bpi_20inj + float beam1Energy = 5; // in GeV + float beam2Energy = 6; // in GeV + string beamType = 7; // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p + BeamMode beamMode = 8; +} + +/** + * Beam modes as defined and sent by LHC DIP client plus: + * * virtual type LOST_BEAMS - that is generated when beam 1 and beam 2 energy values are not equal anymore as per LHC DIP track: dip/acc/LHC/RunControl/SafeBeam + * * virtual type UNKNOWN - that is generated when there is no beam in the machine or value not added by the BKP-LHC Client + * Source of Beam Modes: https://lhc-commissioning.web.cern.ch/systems/data-exchange/doc/LHC-OP-ES-0005-10-00.pdf + */ +enum BeamMode { + UNKNOWN = 0; // virtual type + SETUP = 1; + ABORT = 2; + INJECTION_PROBE_BEAM = 3; + INJECTION_SETUP_BEAM = 4; + INJECTION_PHYSICS_BEAM = 5; + PREPARE_RAMP = 6; + RAMP = 7; + FLAT_TOP = 8; + SQUEEZE = 9; + ADJUST = 10; + STABLE_BEAMS = 11; + LOST_BEAMS = 12; // virtual type + UNSTABLE_BEAMS = 13; + BEAM_DUMP_WARNING = 14; + BEAM_DUMP = 15; + RAMP_DOWN = 16; + CYCLING = 17; + RECOVERY = 18; + INJECT_AND_DUMP = 19; + CIRCULATE_AND_DUMP = 20; + NO_BEAM = 21; +} diff --git a/common/protos/events.pb.go b/common/protos/events.pb.go index 532d0ac1b..65d690048 100644 --- a/common/protos/events.pb.go +++ b/common/protos/events.pb.go @@ -930,6 +930,64 @@ func (x *Ev_RunEvent) GetLastRequestUser() *User { return nil } +// * +// Beam mode changes are propagated as Kafka events and to be sent by the BKP-LHC-Client on a dedicated topic +// e.g. dip.lhc.beam_mode +type Ev_BeamModeEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp int64 `protobuf:"varint,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` // milliseconds since epoch when the beam mode change happened + BeamInfo *BeamInfo `protobuf:"bytes,2,opt,name=beamInfo,proto3" json:"beamInfo,omitempty"` +} + +func (x *Ev_BeamModeEvent) Reset() { + *x = Ev_BeamModeEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_events_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Ev_BeamModeEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Ev_BeamModeEvent) ProtoMessage() {} + +func (x *Ev_BeamModeEvent) ProtoReflect() protoreflect.Message { + mi := &file_protos_events_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Ev_BeamModeEvent.ProtoReflect.Descriptor instead. +func (*Ev_BeamModeEvent) Descriptor() ([]byte, []int) { + return file_protos_events_proto_rawDescGZIP(), []int{10} +} + +func (x *Ev_BeamModeEvent) GetTimestamp() int64 { + if x != nil { + return x.Timestamp + } + return 0 +} + +func (x *Ev_BeamModeEvent) GetBeamInfo() *BeamInfo { + if x != nil { + return x.BeamInfo + } + return nil +} + type Event struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -948,13 +1006,14 @@ type Event struct { // *Event_FrameworkEvent // *Event_MesosHeartbeatEvent // *Event_CoreStartEvent + // *Event_BeamModeEvent Payload isEvent_Payload `protobuf_oneof:"Payload"` } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_protos_events_proto_msgTypes[10] + mi := &file_protos_events_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -967,7 +1026,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_protos_events_proto_msgTypes[10] + mi := &file_protos_events_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -980,7 +1039,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_protos_events_proto_rawDescGZIP(), []int{10} + return file_protos_events_proto_rawDescGZIP(), []int{11} } func (x *Event) GetTimestamp() int64 { @@ -1067,11 +1126,19 @@ func (x *Event) GetCoreStartEvent() *Ev_MetaEvent_CoreStart { return nil } +func (x *Event) GetBeamModeEvent() *Ev_BeamModeEvent { + if x, ok := x.GetPayload().(*Event_BeamModeEvent); ok { + return x.BeamModeEvent + } + return nil +} + type isEvent_Payload interface { isEvent_Payload() } type Event_EnvironmentEvent struct { + // Events produced by AliECS EnvironmentEvent *Ev_EnvironmentEvent `protobuf:"bytes,11,opt,name=environmentEvent,proto3,oneof"` } @@ -1096,6 +1163,7 @@ type Event_RunEvent struct { } type Event_FrameworkEvent struct { + // Meta events produced by AliECS or its components FrameworkEvent *Ev_MetaEvent_FrameworkEvent `protobuf:"bytes,101,opt,name=frameworkEvent,proto3,oneof"` } @@ -1107,6 +1175,11 @@ type Event_CoreStartEvent struct { CoreStartEvent *Ev_MetaEvent_CoreStart `protobuf:"bytes,103,opt,name=coreStartEvent,proto3,oneof"` } +type Event_BeamModeEvent struct { + // Events produced by other systems, but natively supported and defined by AliECS + BeamModeEvent *Ev_BeamModeEvent `protobuf:"bytes,200,opt,name=beamModeEvent,proto3,oneof"` +} + func (*Event_EnvironmentEvent) isEvent_Payload() {} func (*Event_TaskEvent) isEvent_Payload() {} @@ -1125,6 +1198,8 @@ func (*Event_MesosHeartbeatEvent) isEvent_Payload() {} func (*Event_CoreStartEvent) isEvent_Payload() {} +func (*Event_BeamModeEvent) isEvent_Payload() {} + var File_protos_events_proto protoreflect.FileDescriptor var file_protos_events_proto_rawDesc = []byte{ @@ -1264,7 +1339,13 @@ var file_protos_events_proto_rawDesc = []byte{ 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xd1, 0x05, 0x0a, 0x05, 0x45, 0x76, + 0x73, 0x65, 0x72, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0x5e, 0x0a, 0x10, 0x45, 0x76, 0x5f, + 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x08, 0x62, + 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x08, 0x62, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x9b, 0x06, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x61, @@ -1308,20 +1389,25 @@ var file_protos_events_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x4d, 0x65, 0x74, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x43, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, 0x2a, 0x5d, 0x0a, - 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, - 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, - 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, - 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, - 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, - 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, - 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, - 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, - 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, + 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0xc8, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, + 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x45, 0x76, 0x5f, 0x42, 0x65, 0x61, 0x6d, 0x4d, + 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x62, 0x65, 0x61, 0x6d, + 0x4d, 0x6f, 0x64, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x65, + 0x4a, 0x05, 0x08, 0x68, 0x10, 0xc8, 0x01, 0x2a, 0x5d, 0x0a, 0x08, 0x4f, 0x70, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x4e, + 0x47, 0x4f, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x4f, 0x4e, 0x45, 0x5f, + 0x4f, 0x4b, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x04, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x4f, 0x4e, 0x45, 0x5f, 0x54, 0x49, 0x4d, + 0x45, 0x4f, 0x55, 0x54, 0x10, 0x05, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, + 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x2e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x50, 0x00, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1337,7 +1423,7 @@ func file_protos_events_proto_rawDescGZIP() []byte { } var file_protos_events_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_protos_events_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_protos_events_proto_goTypes = []interface{}{ (OpStatus)(0), // 0: events.OpStatus (*Ev_MetaEvent_MesosHeartbeat)(nil), // 1: events.Ev_MetaEvent_MesosHeartbeat @@ -1350,37 +1436,41 @@ var file_protos_events_proto_goTypes = []interface{}{ (*Ev_RoleEvent)(nil), // 8: events.Ev_RoleEvent (*Ev_IntegratedServiceEvent)(nil), // 9: events.Ev_IntegratedServiceEvent (*Ev_RunEvent)(nil), // 10: events.Ev_RunEvent - (*Event)(nil), // 11: events.Event - nil, // 12: events.Ev_EnvironmentEvent.VarsEntry - (*User)(nil), // 13: common.User - (*WorkflowTemplateInfo)(nil), // 14: common.WorkflowTemplateInfo + (*Ev_BeamModeEvent)(nil), // 11: events.Ev_BeamModeEvent + (*Event)(nil), // 12: events.Event + nil, // 13: events.Ev_EnvironmentEvent.VarsEntry + (*User)(nil), // 14: common.User + (*WorkflowTemplateInfo)(nil), // 15: common.WorkflowTemplateInfo + (*BeamInfo)(nil), // 16: common.BeamInfo } var file_protos_events_proto_depIdxs = []int32{ 0, // 0: events.Ev_EnvironmentEvent.transitionStatus:type_name -> events.OpStatus - 12, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry - 13, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User - 14, // 3: events.Ev_EnvironmentEvent.workflowTemplateInfo:type_name -> common.WorkflowTemplateInfo + 13, // 1: events.Ev_EnvironmentEvent.vars:type_name -> events.Ev_EnvironmentEvent.VarsEntry + 14, // 2: events.Ev_EnvironmentEvent.lastRequestUser:type_name -> common.User + 15, // 3: events.Ev_EnvironmentEvent.workflowTemplateInfo:type_name -> common.WorkflowTemplateInfo 5, // 4: events.Ev_TaskEvent.traits:type_name -> events.Traits 0, // 5: events.Ev_CallEvent.callStatus:type_name -> events.OpStatus 5, // 6: events.Ev_CallEvent.traits:type_name -> events.Traits 0, // 7: events.Ev_IntegratedServiceEvent.operationStatus:type_name -> events.OpStatus 0, // 8: events.Ev_IntegratedServiceEvent.operationStepStatus:type_name -> events.OpStatus 0, // 9: events.Ev_RunEvent.transitionStatus:type_name -> events.OpStatus - 13, // 10: events.Ev_RunEvent.lastRequestUser:type_name -> common.User - 4, // 11: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent - 6, // 12: events.Event.taskEvent:type_name -> events.Ev_TaskEvent - 8, // 13: events.Event.roleEvent:type_name -> events.Ev_RoleEvent - 7, // 14: events.Event.callEvent:type_name -> events.Ev_CallEvent - 9, // 15: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent - 10, // 16: events.Event.runEvent:type_name -> events.Ev_RunEvent - 3, // 17: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent - 1, // 18: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat - 2, // 19: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart - 20, // [20:20] is the sub-list for method output_type - 20, // [20:20] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 14, // 10: events.Ev_RunEvent.lastRequestUser:type_name -> common.User + 16, // 11: events.Ev_BeamModeEvent.beamInfo:type_name -> common.BeamInfo + 4, // 12: events.Event.environmentEvent:type_name -> events.Ev_EnvironmentEvent + 6, // 13: events.Event.taskEvent:type_name -> events.Ev_TaskEvent + 8, // 14: events.Event.roleEvent:type_name -> events.Ev_RoleEvent + 7, // 15: events.Event.callEvent:type_name -> events.Ev_CallEvent + 9, // 16: events.Event.integratedServiceEvent:type_name -> events.Ev_IntegratedServiceEvent + 10, // 17: events.Event.runEvent:type_name -> events.Ev_RunEvent + 3, // 18: events.Event.frameworkEvent:type_name -> events.Ev_MetaEvent_FrameworkEvent + 1, // 19: events.Event.mesosHeartbeatEvent:type_name -> events.Ev_MetaEvent_MesosHeartbeat + 2, // 20: events.Event.coreStartEvent:type_name -> events.Ev_MetaEvent_CoreStart + 11, // 21: events.Event.beamModeEvent:type_name -> events.Ev_BeamModeEvent + 22, // [22:22] is the sub-list for method output_type + 22, // [22:22] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name } func init() { file_protos_events_proto_init() } @@ -1511,6 +1601,18 @@ func file_protos_events_proto_init() { } } file_protos_events_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Ev_BeamModeEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_events_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -1523,7 +1625,7 @@ func file_protos_events_proto_init() { } } } - file_protos_events_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_protos_events_proto_msgTypes[11].OneofWrappers = []interface{}{ (*Event_EnvironmentEvent)(nil), (*Event_TaskEvent)(nil), (*Event_RoleEvent)(nil), @@ -1533,6 +1635,7 @@ func file_protos_events_proto_init() { (*Event_FrameworkEvent)(nil), (*Event_MesosHeartbeatEvent)(nil), (*Event_CoreStartEvent)(nil), + (*Event_BeamModeEvent)(nil), } type x struct{} out := protoimpl.TypeBuilder{ @@ -1540,7 +1643,7 @@ func file_protos_events_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_events_proto_rawDesc, NumEnums: 1, - NumMessages: 12, + NumMessages: 13, NumExtensions: 0, NumServices: 0, }, diff --git a/common/protos/events.proto b/common/protos/events.proto index 66b6fe0c4..870524ff1 100644 --- a/common/protos/events.proto +++ b/common/protos/events.proto @@ -127,13 +127,24 @@ message Ev_RunEvent { common.User lastRequestUser = 8; } +/** + * Beam mode changes are propagated as Kafka events and to be sent by the BKP-LHC-Client on a dedicated topic + * e.g. dip.lhc.beam_mode + */ +message Ev_BeamModeEvent { + int64 timestamp = 1; // milliseconds since epoch when the beam mode change happened + common.BeamInfo beamInfo = 2; +} + message Event { int64 timestamp = 1; int64 timestampNano = 2; reserved 3 to 10; reserved 17 to 100; + reserved 104 to 199; oneof Payload { + // Events produced by AliECS Ev_EnvironmentEvent environmentEvent = 11; Ev_TaskEvent taskEvent = 12; Ev_RoleEvent roleEvent = 13; @@ -141,8 +152,12 @@ message Event { Ev_IntegratedServiceEvent integratedServiceEvent = 15; Ev_RunEvent runEvent = 16; + // Meta events produced by AliECS or its components Ev_MetaEvent_FrameworkEvent frameworkEvent = 101; Ev_MetaEvent_MesosHeartbeat mesosHeartbeatEvent = 102; Ev_MetaEvent_CoreStart coreStartEvent = 103; + + // Events produced by other systems, but natively supported and defined by AliECS + Ev_BeamModeEvent beamModeEvent = 200; } } diff --git a/core/protos/o2control.pb.go b/core/protos/o2control.pb.go index 76c26d707..4124ea0a0 100644 --- a/core/protos/o2control.pb.go +++ b/core/protos/o2control.pb.go @@ -68,6 +68,7 @@ type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent type Ev_RunEvent = protos.Ev_RunEvent +type Ev_BeamModeEvent = protos.Ev_BeamModeEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent @@ -78,6 +79,7 @@ type Event_RunEvent = protos.Event_RunEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent +type Event_BeamModeEvent = protos.Event_BeamModeEvent type ControlEnvironmentRequest_Optype int32 diff --git a/docs/apidocs_aliecs.md b/docs/apidocs_aliecs.md index 7004c9050..1f790fe3c 100644 --- a/docs/apidocs_aliecs.md +++ b/docs/apidocs_aliecs.md @@ -89,6 +89,7 @@ - [Control](#o2control-Control) - [protos/events.proto](#protos_events-proto) + - [Ev_BeamModeEvent](#events-Ev_BeamModeEvent) - [Ev_CallEvent](#events-Ev_CallEvent) - [Ev_EnvironmentEvent](#events-Ev_EnvironmentEvent) - [Ev_EnvironmentEvent.VarsEntry](#events-Ev_EnvironmentEvent-VarsEntry) @@ -105,9 +106,12 @@ - [OpStatus](#events-OpStatus) - [protos/common.proto](#protos_common-proto) + - [BeamInfo](#common-BeamInfo) - [User](#common-User) - [WorkflowTemplateInfo](#common-WorkflowTemplateInfo) + - [BeamMode](#common-BeamMode) + - [Scalar Value Types](#scalar-value-types) @@ -557,6 +561,7 @@ Environment | ----- | ---- | ----- | ----------- | | showAll | [bool](#bool) | | | | showTaskInfos | [bool](#bool) | | | +| showDetailedIntegratedServices | [bool](#bool) | | integratedServices are returned everytime, setting this flag gives detailed report | @@ -1515,6 +1520,23 @@ The Control service is the main interface to AliECS + + +### Ev_BeamModeEvent +Beam mode changes are propagated as Kafka events and to be sent by the BKP-LHC-Client on a dedicated topic +e.g. dip.lhc.beam_mode + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| timestamp | [int64](#int64) | | milliseconds since epoch when the beam mode change happened | +| beamInfo | [common.BeamInfo](#common-BeamInfo) | | | + + + + + + ### Ev_CallEvent @@ -1714,15 +1736,16 @@ The Control service is the main interface to AliECS | ----- | ---- | ----- | ----------- | | timestamp | [int64](#int64) | | | | timestampNano | [int64](#int64) | | | -| environmentEvent | [Ev_EnvironmentEvent](#events-Ev_EnvironmentEvent) | | | +| environmentEvent | [Ev_EnvironmentEvent](#events-Ev_EnvironmentEvent) | | Events produced by AliECS | | taskEvent | [Ev_TaskEvent](#events-Ev_TaskEvent) | | | | roleEvent | [Ev_RoleEvent](#events-Ev_RoleEvent) | | | | callEvent | [Ev_CallEvent](#events-Ev_CallEvent) | | | | integratedServiceEvent | [Ev_IntegratedServiceEvent](#events-Ev_IntegratedServiceEvent) | | | | runEvent | [Ev_RunEvent](#events-Ev_RunEvent) | | | -| frameworkEvent | [Ev_MetaEvent_FrameworkEvent](#events-Ev_MetaEvent_FrameworkEvent) | | | +| frameworkEvent | [Ev_MetaEvent_FrameworkEvent](#events-Ev_MetaEvent_FrameworkEvent) | | Meta events produced by AliECS or its components | | mesosHeartbeatEvent | [Ev_MetaEvent_MesosHeartbeat](#events-Ev_MetaEvent_MesosHeartbeat) | | | | coreStartEvent | [Ev_MetaEvent_CoreStart](#events-Ev_MetaEvent_CoreStart) | | | +| beamModeEvent | [Ev_BeamModeEvent](#events-Ev_BeamModeEvent) | | Events produced by other systems, but natively supported and defined by AliECS | @@ -1779,6 +1802,28 @@ The Control service is the main interface to AliECS + + +### BeamInfo +Beam information at a specific point in time (e.g. start or end of stable beams) + + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| stableBeamsStart | [int64](#int64) | | milliseconds since epoch when stable beams started | +| stableBeamsEnd | [int64](#int64) | | milliseconds since epoch when stable beams ended | +| fillNumber | [int32](#int32) | | LHC fill number | +| fillingSchemeName | [string](#string) | | LHC filling scheme name e.g. 25ns_2460b_2448_2089_2227_144bpi_20inj | +| beam1Energy | [float](#float) | | in GeV | +| beam2Energy | [float](#float) | | in GeV | +| beamType | [string](#string) | | e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p | +| beamMode | [BeamMode](#common-BeamMode) | | | + + + + + + ### User @@ -1815,6 +1860,41 @@ The Control service is the main interface to AliECS + + + +### BeamMode +Beam modes as defined and sent by LHC DIP client plus: +* virtual type LOST_BEAMS - that is generated when beam 1 and beam 2 energy values are not equal anymore as per LHC DIP track: dip/acc/LHC/RunControl/SafeBeam +* virtual type UNKNOWN - that is generated when there is no beam in the machine or value not added by the BKP-LHC Client +Source of Beam Modes: https://lhc-commissioning.web.cern.ch/systems/data-exchange/doc/LHC-OP-ES-0005-10-00.pdf + +| Name | Number | Description | +| ---- | ------ | ----------- | +| UNKNOWN | 0 | virtual type | +| SETUP | 1 | | +| ABORT | 2 | | +| INJECTION_PROBE_BEAM | 3 | | +| INJECTION_SETUP_BEAM | 4 | | +| INJECTION_PHYSICS_BEAM | 5 | | +| PREPARE_RAMP | 6 | | +| RAMP | 7 | | +| FLAT_TOP | 8 | | +| SQUEEZE | 9 | | +| ADJUST | 10 | | +| STABLE_BEAMS | 11 | | +| LOST_BEAMS | 12 | virtual type | +| UNSTABLE_BEAMS | 13 | | +| BEAM_DUMP_WARNING | 14 | | +| BEAM_DUMP | 15 | | +| RAMP_DOWN | 16 | | +| CYCLING | 17 | | +| RECOVERY | 18 | | +| INJECT_AND_DUMP | 19 | | +| CIRCULATE_AND_DUMP | 20 | | +| NO_BEAM | 21 | | + + From c7ee4618346951b609f1e43b4092fec467e22408 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 14 Oct 2025 16:01:05 +0200 Subject: [PATCH 2205/2352] Remove beam energy from BeamInfo proto (#755) As agreed with George, DIP Client does not have it and AliECS does not need it. A small, previously missing addition to coconut source files is added, it seems I just did not include it before. --- coconut/protos/o2control.pb.go | 2 + common/protos/common.pb.go | 96 ++++++++++++++-------------------- common/protos/common.proto | 6 +-- 3 files changed, 42 insertions(+), 62 deletions(-) diff --git a/coconut/protos/o2control.pb.go b/coconut/protos/o2control.pb.go index 76c26d707..4124ea0a0 100644 --- a/coconut/protos/o2control.pb.go +++ b/coconut/protos/o2control.pb.go @@ -68,6 +68,7 @@ type Ev_CallEvent = protos.Ev_CallEvent type Ev_RoleEvent = protos.Ev_RoleEvent type Ev_IntegratedServiceEvent = protos.Ev_IntegratedServiceEvent type Ev_RunEvent = protos.Ev_RunEvent +type Ev_BeamModeEvent = protos.Ev_BeamModeEvent type Event = protos.Event type Event_EnvironmentEvent = protos.Event_EnvironmentEvent type Event_TaskEvent = protos.Event_TaskEvent @@ -78,6 +79,7 @@ type Event_RunEvent = protos.Event_RunEvent type Event_FrameworkEvent = protos.Event_FrameworkEvent type Event_MesosHeartbeatEvent = protos.Event_MesosHeartbeatEvent type Event_CoreStartEvent = protos.Event_CoreStartEvent +type Event_BeamModeEvent = protos.Event_BeamModeEvent type ControlEnvironmentRequest_Optype int32 diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index d3d7d8455..5ea0cc482 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -302,10 +302,8 @@ type BeamInfo struct { StableBeamsEnd int64 `protobuf:"varint,2,opt,name=stableBeamsEnd,proto3" json:"stableBeamsEnd,omitempty"` // milliseconds since epoch when stable beams ended FillNumber int32 `protobuf:"varint,3,opt,name=fillNumber,proto3" json:"fillNumber,omitempty"` // LHC fill number FillingSchemeName string `protobuf:"bytes,4,opt,name=fillingSchemeName,proto3" json:"fillingSchemeName,omitempty"` // LHC filling scheme name e.g. 25ns_2460b_2448_2089_2227_144bpi_20inj - Beam1Energy float32 `protobuf:"fixed32,5,opt,name=beam1Energy,proto3" json:"beam1Energy,omitempty"` // in GeV - Beam2Energy float32 `protobuf:"fixed32,6,opt,name=beam2Energy,proto3" json:"beam2Energy,omitempty"` // in GeV - BeamType string `protobuf:"bytes,7,opt,name=beamType,proto3" json:"beamType,omitempty"` // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p - BeamMode BeamMode `protobuf:"varint,8,opt,name=beamMode,proto3,enum=common.BeamMode" json:"beamMode,omitempty"` + BeamType string `protobuf:"bytes,5,opt,name=beamType,proto3" json:"beamType,omitempty"` // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p + BeamMode BeamMode `protobuf:"varint,6,opt,name=beamMode,proto3,enum=common.BeamMode" json:"beamMode,omitempty"` } func (x *BeamInfo) Reset() { @@ -368,20 +366,6 @@ func (x *BeamInfo) GetFillingSchemeName() string { return "" } -func (x *BeamInfo) GetBeam1Energy() float32 { - if x != nil { - return x.Beam1Energy - } - return 0 -} - -func (x *BeamInfo) GetBeam2Energy() float32 { - if x != nil { - return x.Beam2Energy - } - return 0 -} - func (x *BeamInfo) GetBeamType() string { if x != nil { return x.BeamType @@ -415,7 +399,7 @@ var file_protos_common_proto_rawDesc = []byte{ 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x22, 0xba, 0x02, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, + 0x6c, 0x69, 0x63, 0x22, 0xf6, 0x01, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x65, 0x61, 0x6d, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, @@ -426,45 +410,41 @@ var file_protos_common_proto_rawDesc = []byte{ 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x6c, 0x69, 0x6e, 0x67, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x31, 0x45, 0x6e, 0x65, 0x72, 0x67, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x31, 0x45, 0x6e, - 0x65, 0x72, 0x67, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x32, 0x45, 0x6e, 0x65, - 0x72, 0x67, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0b, 0x62, 0x65, 0x61, 0x6d, 0x32, - 0x45, 0x6e, 0x65, 0x72, 0x67, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x65, - 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, - 0x2a, 0x80, 0x03, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x45, - 0x54, 0x55, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, - 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, - 0x4f, 0x42, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, - 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x42, 0x45, - 0x41, 0x4d, 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x5f, 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x05, - 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x41, 0x4d, 0x50, - 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, - 0x46, 0x4c, 0x41, 0x54, 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x51, - 0x55, 0x45, 0x45, 0x5a, 0x45, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x4a, 0x55, 0x53, - 0x54, 0x10, 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, - 0x41, 0x4d, 0x53, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x53, 0x54, 0x5f, 0x42, 0x45, - 0x41, 0x4d, 0x53, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x45, 0x41, - 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x0e, - 0x12, 0x0d, 0x0a, 0x09, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x0f, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x10, 0x12, 0x0b, - 0x0a, 0x07, 0x43, 0x59, 0x43, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, 0x0c, 0x0a, 0x08, 0x52, - 0x45, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x59, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x4a, - 0x45, 0x43, 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x13, 0x12, 0x16, - 0x0a, 0x12, 0x43, 0x49, 0x52, 0x43, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x44, 0x55, 0x4d, 0x50, 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x42, 0x45, 0x41, - 0x4d, 0x10, 0x15, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, - 0x6c, 0x69, 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, + 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x2a, 0x80, 0x03, 0x0a, + 0x08, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, + 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, + 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, + 0x42, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x04, + 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x48, + 0x59, 0x53, 0x49, 0x43, 0x53, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, + 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x08, + 0x0a, 0x04, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4c, 0x41, 0x54, + 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x51, 0x55, 0x45, 0x45, 0x5a, + 0x45, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x10, 0x0a, 0x12, + 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, + 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, + 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, + 0x41, 0x4d, 0x53, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, + 0x4d, 0x50, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, + 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x59, + 0x43, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, 0x4f, 0x56, + 0x45, 0x52, 0x59, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x5f, + 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x13, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, + 0x52, 0x43, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, + 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x15, 0x42, + 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, + 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, + 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/common/protos/common.proto b/common/protos/common.proto index f1e77874d..f367be9e4 100644 --- a/common/protos/common.proto +++ b/common/protos/common.proto @@ -55,10 +55,8 @@ message BeamInfo { int64 stableBeamsEnd = 2; // milliseconds since epoch when stable beams ended int32 fillNumber = 3; // LHC fill number string fillingSchemeName = 4; // LHC filling scheme name e.g. 25ns_2460b_2448_2089_2227_144bpi_20inj - float beam1Energy = 5; // in GeV - float beam2Energy = 6; // in GeV - string beamType = 7; // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p - BeamMode beamMode = 8; + string beamType = 5; // e.g. PROTON-PROTON, O8-O8, Pb-Pb, p-Pb, Pb-p + BeamMode beamMode = 6; } /** From a0fef4683d098ab200282d3dac612edbd44d1294 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 15 Oct 2025 14:59:18 +0200 Subject: [PATCH 2206/2352] OCTRL-1049 Stop tasks within GO_ERROR transition (#756) This moves stopping RUNNING tasks into GO_ERROR transition, so that the stop order makes sense - FLP and EPN tasks stop roughly in parallel. Before, FLP tasks would be stopped only after EPN tasks, which was preventing EPNs to finalize certain computations and was generally opposite to the data flow. I could not see any unwanted side effects of this change, seemed good on staging. --- core/environment/environment.go | 16 ---------------- core/environment/transition_goerror.go | 22 ++++++++++++++++++++-- 2 files changed, 20 insertions(+), 18 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index 3c8bfe99c..f5c8b70b7 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1236,22 +1236,6 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { env.setState(wfState.String()) } } - toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { - t.SetSafeToStop(true) - return t.IsSafeToStop() - }) - if len(toStop) > 0 { - taskmanMessage := task.NewTransitionTaskMessage( - toStop, - sm.RUNNING.String(), - sm.STOP.String(), - sm.CONFIGURED.String(), - nil, - env.Id(), - ) - taskman.MessageChannel <- taskmanMessage - <-env.stateChangedCh - } }) break WORKFLOW_STATE_LOOP } diff --git a/core/environment/transition_goerror.go b/core/environment/transition_goerror.go index f8f5467df..6b59d85f7 100644 --- a/core/environment/transition_goerror.go +++ b/core/environment/transition_goerror.go @@ -26,6 +26,7 @@ package environment import ( "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" ) func NewGoErrorTransition(taskman *task.Manager) Transition { @@ -42,7 +43,24 @@ type GoErrorTransition struct { } func (t GoErrorTransition) do(env *Environment) (err error) { - // We do not do anything here, because the error handling was already implemented elsewhere - // and we do not expose this transition to external calls (e.g. from the GUI). + + // we stop all tasks which are in RUNNING + toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { + t.SetSafeToStop(true) + return t.IsSafeToStop() + }) + if len(toStop) > 0 { + taskmanMessage := task.NewTransitionTaskMessage( + toStop, + sm.RUNNING.String(), + sm.STOP.String(), + sm.CONFIGURED.String(), + nil, + env.Id(), + ) + t.taskman.MessageChannel <- taskmanMessage + <-env.stateChangedCh + } + return } From f03795d31bad989651f0e2dab6f3f6c4ba84b4ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 15 Oct 2025 14:59:52 +0200 Subject: [PATCH 2207/2352] [OCTRL-1051] Missing Error & Done Kafka events for early failed NewAutoEnvironment (#757) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit OCTRL-1051: added error messages to CreateAutoEnvironment Co-authored-by: Michal Tichák --- core/environment/manager.go | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index d6a81b017..38c202dd0 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1281,6 +1281,19 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str } else { log.WithError(err).Logf(logrus.FatalLevel, "environment creation failed") env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: newEnvId.String(), Error: err}) + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "ERROR", + Error: err.Error(), + Message: "cannot create new environment", // GUI listens for this concrete string + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Path: workflowPath, + Public: workflowPublicInfo.IsPublic, + Name: workflowPublicInfo.Name, + Description: workflowPublicInfo.Description, + }, + }) return } @@ -1330,6 +1343,23 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str if err != nil { err = fmt.Errorf("cannot load workflow template: %w", err) env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), Error: err}) + + log.WithError(err).Error("failed to load workflow") + + the.EventWriterWithTopic(topic.Environment).WriteEvent(&evpb.Ev_EnvironmentEvent{ + EnvironmentId: newId.String(), + State: "ERROR", + Error: err.Error(), + Message: "cannot load workflow", // GUI listens for this concrete string + LastRequestUser: lastRequestUser, + WorkflowTemplateInfo: &evpb.WorkflowTemplateInfo{ + Path: workflowPath, + Public: workflowPublicInfo.IsPublic, + Name: workflowPublicInfo.Name, + Description: workflowPublicInfo.Description, + }, + }) + return } From 31b8710225d55d20bae9fc3ea89481f0f31b331e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 10 Oct 2025 15:18:27 +0200 Subject: [PATCH 2208/2352] Add a Kafka reader A necessary building block for OCTRL-1049 --- common/event/reader.go | 132 ++++++++++++++++++++++++++++++++++++ common/event/reader_test.go | 48 +++++++++++++ 2 files changed, 180 insertions(+) create mode 100644 common/event/reader.go create mode 100644 common/event/reader_test.go diff --git a/common/event/reader.go b/common/event/reader.go new file mode 100644 index 000000000..0b348cafc --- /dev/null +++ b/common/event/reader.go @@ -0,0 +1,132 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "context" + "fmt" + "github.com/AliceO2Group/Control/common/event/topic" + "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" + "github.com/segmentio/kafka-go" + "github.com/spf13/viper" + "google.golang.org/protobuf/proto" + "sync" +) + +// Reader interface provides methods to read events. +type Reader interface { + Next(ctx context.Context) (*pb.Event, error) + Close() error +} + +// DummyReader is an implementation of Reader that returns no events. +type DummyReader struct{} + +// Next returns the next event or nil if there are no more events. +func (*DummyReader) Next(context.Context) (*pb.Event, error) { return nil, nil } + +// Close closes the DummyReader. +func (*DummyReader) Close() error { return nil } + +// KafkaReader reads events from Kafka and provides a blocking, cancellable API to fetch events. +// Consumption mode is chosen at creation time: +// - latestOnly=false: consume everything (from stored offsets or beginning depending on group state) +// - latestOnly=true: seek to latest offsets on start and only receive messages produced after start +type KafkaReader struct { + *kafka.Reader + mu sync.Mutex + topic string +} + +// NewReaderWithTopic creates a KafkaReader for the provided topic and starts it. +// If latestOnly is true the reader attempts to seek to the latest offsets on start so that +// only new messages (produced after creation) are consumed. +func NewReaderWithTopic(topic topic.Topic, groupID string, latestOnly bool) *KafkaReader { + cfg := kafka.ReaderConfig{ + Brokers: viper.GetStringSlice("kafkaEndpoints"), + Topic: string(topic), + GroupID: groupID, + MinBytes: 1, + MaxBytes: 10e7, + } + + rk := &KafkaReader{ + Reader: kafka.NewReader(cfg), + topic: string(topic), + } + + if latestOnly { + // best-effort: set offset to last so we don't replay older messages + if err := rk.SetOffset(kafka.LastOffset); err != nil { + log.WithField(infologger.Level, infologger.IL_Devel). + Warnf("failed to set offset to last offset: %v", err) + } + } + + return rk +} + +// Next blocks until the next event is available or ctx is cancelled. It returns an error when the reader is closed +// (io.EOF) or the context is cancelled. The caller is responsible for providing a cancellable ctx. +func (r *KafkaReader) Next(ctx context.Context) (*pb.Event, error) { + if r == nil { + return nil, fmt.Errorf("nil reader") + } + + msg, err := r.ReadMessage(ctx) + if err != nil { + return nil, err + } + + event, err := kafkaMessageToEvent(msg) + if err != nil { + return nil, err + } + + return event, nil +} + +// Close stops the reader. +func (r *KafkaReader) Close() error { + if r == nil { + return nil + } + // Close the underlying kafka reader which will cause ReadMessage to return an error + err := r.Reader.Close() + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel). + Errorf("failed to close kafka reader: %v", err) + } + return err +} + +func kafkaMessageToEvent(m kafka.Message) (*pb.Event, error) { + var evt pb.Event + if err := proto.Unmarshal(m.Value, &evt); err != nil { + return nil, fmt.Errorf("failed to unmarshal kafka message: %w", err) + } + return &evt, nil +} diff --git a/common/event/reader_test.go b/common/event/reader_test.go new file mode 100644 index 000000000..751606fd0 --- /dev/null +++ b/common/event/reader_test.go @@ -0,0 +1,48 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + pb "github.com/AliceO2Group/Control/common/protos" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "github.com/segmentio/kafka-go" + "google.golang.org/protobuf/proto" +) + +var _ = Describe("Reader", func() { + When("converting kafka message to event", func() { + It("unmarshals protobuf payload correctly", func() { + e := &pb.Event{Payload: &pb.Event_CoreStartEvent{CoreStartEvent: &pb.Ev_MetaEvent_CoreStart{FrameworkId: "z"}}} + b, err := proto.Marshal(e) + Expect(err).To(BeNil()) + + m := kafka.Message{Value: b} + evt, err := kafkaMessageToEvent(m) + Expect(err).To(BeNil()) + Expect(evt.GetCoreStartEvent().FrameworkId).To(Equal("z")) + }) + }) +}) From 98d49cff0836979d08b32cbcf4038f29a05ffb6c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 10 Oct 2025 15:20:56 +0200 Subject: [PATCH 2209/2352] New LHC plugin to follow LHC updates available in Kafka The updates come from ALICE LHC DIP client. Work towards OCTRL-1049. Eventually, this plugin will also allow to get rid of BKP.RetrieveFillInfo call and consume Fill information without going through BKP. --- README.md | 1 + cmd/o2-aliecs-core/main.go | 5 + core/integration/README.md | 5 + core/integration/lhc/event/lhcevent.go | 56 +++++++ core/integration/lhc/plugin.go | 200 +++++++++++++++++++++++++ 5 files changed, 267 insertions(+) create mode 100644 core/integration/lhc/event/lhcevent.go create mode 100644 core/integration/lhc/plugin.go diff --git a/README.md b/README.md index 3c06e2b42..c1326df51 100644 --- a/README.md +++ b/README.md @@ -113,6 +113,7 @@ There are two ways of interacting with AliECS: * [ECS2DCS2ECS mock server](/core/integration/README.md#ecs2dcs2ecs-mock-server) * [DD Scheduler](/core/integration/README.md#dd-scheduler) * [Kafka (legacy)](/core/integration/README.md#kafka-legacy) + * [LHC](/core/integration/README.md) * [ODC](/core/integration/README.md#odc) * [Test plugin](/core/integration/README.md#test-plugin) * [Trigger](/core/integration/README.md#trigger) diff --git a/cmd/o2-aliecs-core/main.go b/cmd/o2-aliecs-core/main.go index e19eadec8..1da25fdd6 100644 --- a/cmd/o2-aliecs-core/main.go +++ b/cmd/o2-aliecs-core/main.go @@ -35,6 +35,7 @@ import ( "github.com/AliceO2Group/Control/core/integration/dcs" "github.com/AliceO2Group/Control/core/integration/ddsched" "github.com/AliceO2Group/Control/core/integration/kafka" + "github.com/AliceO2Group/Control/core/integration/lhc" "github.com/AliceO2Group/Control/core/integration/odc" "github.com/AliceO2Group/Control/core/integration/testplugin" "github.com/AliceO2Group/Control/core/integration/trg" @@ -64,6 +65,10 @@ func init() { "kafka", "kafkaEndpoint", kafka.NewPlugin) + integration.RegisterPlugin( + "lhc", + "kafkaEndpoints", + lhc.NewPlugin) integration.RegisterPlugin( "odc", "odcEndpoint", diff --git a/core/integration/README.md b/core/integration/README.md index 2b56fd8a5..eda781e82 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -177,6 +177,11 @@ DD scheduler plugin informs the Data Distribution software about the pool of FLP See [Legacy events: Kafka plugin](/docs/kafka.md#legacy-events-kafka-plugin) +# LHC plugin + +This plugin listens to Kafka messages coming from the LHC DIP Client and pushes any relevant internal notifications to the AliECS core. +Its main purpose is to provide basic information about ongoing LHC activity (e.g. fill information) to affected parties and allow AliECS to react upon them (e.g. by automatically stopping a physics run when stable beams are over). + ## ODC ODC plugin communicates with the [Online Device Control (ODC)](https://github.com/FairRootGroup/ODC) instance of the ALICE experiment, which controls the event processing farm used in data taking and offline processing. diff --git a/core/integration/lhc/event/lhcevent.go b/core/integration/lhc/event/lhcevent.go new file mode 100644 index 000000000..ecaa3cc6c --- /dev/null +++ b/core/integration/lhc/event/lhcevent.go @@ -0,0 +1,56 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package event + +import ( + "github.com/AliceO2Group/Control/common/event" + commonpb "github.com/AliceO2Group/Control/common/protos" +) + +// BeamInfo mirrors (a subset of) the information described in the proto draft. +type BeamInfo struct { + StableBeamsStart int64 `json:"stableBeamsStart,omitempty"` + StableBeamsEnd int64 `json:"stableBeamsEnd,omitempty"` + FillNumber int32 `json:"fillNumber,omitempty"` + FillingSchemeName string `json:"fillingSchemeName,omitempty"` + BeamType string `json:"beamType,omitempty"` + BeamMode commonpb.BeamMode `json:"beamMode,omitempty"` +} + +type LhcStateChangeEvent struct { + event.IntegratedServiceEventBase + BeamInfo BeamInfo +} + +func (e *LhcStateChangeEvent) GetName() string { + return "LHC_STATE_CHANGE_EVENT" +} + +func (e *LhcStateChangeEvent) GetBeamInfo() BeamInfo { + if e == nil { + return BeamInfo{} + } + return e.BeamInfo +} diff --git a/core/integration/lhc/plugin.go b/core/integration/lhc/plugin.go new file mode 100644 index 000000000..bb4276551 --- /dev/null +++ b/core/integration/lhc/plugin.go @@ -0,0 +1,200 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package lhc + +import ( + "context" + "encoding/json" + "errors" + "github.com/AliceO2Group/Control/common/event/topic" + "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" + "io" + "strings" + "sync" + "time" + + cmnevent "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/core/environment" + "github.com/AliceO2Group/Control/core/integration" + lhcevent "github.com/AliceO2Group/Control/core/integration/lhc/event" + "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +var log = logger.New(logrus.StandardLogger(), "lhcclient") +var dipClientTopic topic.Topic = "dip.lhc.beam_mode" + +// Plugin implements integration.Plugin and listens for LHC updates. +type Plugin struct { + endpoint string + ctx context.Context + //cancel context.CancelFunc + //wg sync.WaitGroup + mu sync.Mutex + currentState *pb.BeamInfo + reader cmnevent.Reader +} + +func NewPlugin(endpoint string) integration.Plugin { + + return &Plugin{endpoint: endpoint, mu: sync.Mutex{}, currentState: &pb.BeamInfo{BeamMode: pb.BeamMode_UNKNOWN}} +} + +func (p *Plugin) Init(_ string) error { + + // use a background context for reader loop; Destroy will Close the reader + p.ctx = context.Background() + + p.reader = cmnevent.NewReaderWithTopic(dipClientTopic, "", true) + + if p.reader == nil { + return errors.New("could not create a kafka reader for LHC plugin") + } + go p.readAndInjectLhcUpdates() + + log.Debug("LHC plugin initialized (client started)") + return nil +} + +func (p *Plugin) GetName() string { return "lhc" } +func (p *Plugin) GetPrettyName() string { return "LHC (DIP/Kafka client)" } +func (p *Plugin) GetEndpoint() string { + return strings.Join(viper.GetStringSlice("kafkaEndpoints"), ",") +} + +func (p *Plugin) GetConnectionState() string { + if p == nil || p.reader == nil { + return "UNKNOWN" + } + return "READY" // Unfortunately, kafka.Reader does not provide any GetStatus method +} + +func (p *Plugin) GetData(_ []any) string { + p.mu.Lock() + defer p.mu.Unlock() + if p.currentState == nil { + return "" + } + + outMap := make(map[string]interface{}) + outMap["BeamMode"] = p.currentState.BeamMode.String() + outMap["BeamType"] = p.currentState.BeamType + outMap["FillingSchemeName"] = p.currentState.FillingSchemeName + outMap["FillNumber"] = p.currentState.FillNumber + outMap["StableBeamsEnd"] = p.currentState.StableBeamsEnd + outMap["StableBeamsStart"] = p.currentState.StableBeamsStart + + b, _ := json.Marshal(outMap) + return string(b) +} + +func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { + // there is nothing sensible we could provide here, LHC client is not environment-specific + return nil +} + +func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { + return p.GetEnvironmentsData(envIds) +} + +func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { + return make(map[string]interface{}) +} +func (p *Plugin) CallStack(_ interface{}) (stack map[string]interface{}) { + return make(map[string]interface{}) +} + +func (p *Plugin) Destroy() error { + if p == nil { + return nil + } + p.mu.Lock() + defer p.mu.Unlock() + + if p.reader != nil { + err := p.reader.Close() + if err != nil { + return err + } + } + return nil +} + +func (p *Plugin) readAndInjectLhcUpdates() { + for { + msg, err := p.reader.Next(p.ctx) + if errors.Is(err, io.EOF) { + log.WithField(infologger.Level, infologger.IL_Support). + Debug("received an EOF from Kafka reader, likely cancellation was requested, breaking") + break + } + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Error("error while reading from Kafka") + // in case of errors, we throttle the loop to mitigate the risk a log spam if error persists + time.Sleep(time.Second * 1) + continue + } + if msg == nil { + log.WithField(infologger.Level, infologger.IL_Devel). + Warn("received an empty message with no error. it's unexpected, but continuing") + continue + } + + if bmEvt := msg.GetBeamModeEvent(); bmEvt != nil && bmEvt.GetBeamInfo() != nil { + beamInfo := bmEvt.GetBeamInfo() + log.WithField(infologger.Level, infologger.IL_Devel). + Debugf("new LHC update received: BeamMode=%s, FillNumber=%d, FillingScheme=%s, StableBeamsStart=%d, StableBeamsEnd=%d, BeamType=%s", + beamInfo.GetBeamMode().String(), beamInfo.GetFillNumber(), beamInfo.GetFillingSchemeName(), + beamInfo.GetStableBeamsStart(), beamInfo.GetStableBeamsEnd(), beamInfo.GetBeamType()) + // update plugin state + p.mu.Lock() + p.currentState = beamInfo + p.mu.Unlock() + + // convert to internal LHC event and notify environment manager + go func(beamInfo *pb.BeamInfo) { + envMan := environment.ManagerInstance() + + ev := &lhcevent.LhcStateChangeEvent{ + IntegratedServiceEventBase: cmnevent.IntegratedServiceEventBase{ServiceName: "LHC"}, + BeamInfo: lhcevent.BeamInfo{ + BeamMode: beamInfo.GetBeamMode(), + StableBeamsStart: beamInfo.GetStableBeamsStart(), + StableBeamsEnd: beamInfo.GetStableBeamsEnd(), + FillNumber: beamInfo.GetFillNumber(), + FillingSchemeName: beamInfo.GetFillingSchemeName(), + BeamType: beamInfo.GetBeamType(), + }, + } + envMan.NotifyIntegratedServiceEvent(ev) + }(beamInfo) + } + } +} From faa6de6d5a6a4c190c187e98a071bf7c070b41b9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 10 Oct 2025 15:22:14 +0200 Subject: [PATCH 2210/2352] Stop ongoing runs upon beam dump if requested A new "stop_at_beam_dump" flag allows to request an automatic STOP_ACTIVITY when we recognize that LHC dumped beams. Closes OCTRL-1049 --- core/environment/manager.go | 61 +++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/core/environment/manager.go b/core/environment/manager.go index 38c202dd0..04004898e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -42,6 +42,7 @@ import ( "github.com/AliceO2Group/Control/common/system" "github.com/AliceO2Group/Control/common/utils" "github.com/AliceO2Group/Control/common/utils/uid" + lhcevent "github.com/AliceO2Group/Control/core/integration/lhc/event" event2 "github.com/AliceO2Group/Control/core/integration/odc/event" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" @@ -1065,6 +1066,66 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve } } } + } else if evt.GetServiceName() == "LHC" { + envs.handleLhcEvents(evt) + } +} + +func (envs *Manager) handleLhcEvents(evt event.IntegratedServiceEvent) { + + lhcEvent, ok := evt.(*lhcevent.LhcStateChangeEvent) + if !ok { + return + } + + // stop all relevant environments when beams are dumped + beamMode := lhcEvent.GetBeamInfo().BeamMode + beamsDumped := beamMode == evpb.BeamMode_BEAM_DUMP || beamMode == evpb.BeamMode_LOST_BEAMS || beamMode == evpb.BeamMode_NO_BEAM + if !beamsDumped { + return + } + + for envId, env := range envs.m { + shouldStopAtBeamDump, _ := strconv.ParseBool(env.GetKV("", "stop_at_beam_dump")) + if shouldStopAtBeamDump && env.CurrentState() == "RUNNING" { + if currentTransition := env.CurrentTransition(); currentTransition != "" { + log.WithPrefix("scheduler"). + WithField(infologger.Level, infologger.IL_Support). + WithField("partition", envId.String()). + WithField("run", env.currentRunNumber). + Infof("run was supposed to be stopped at beam dump, but transition '%s' is already in progress, skipping (probably the operator was faster)", currentTransition) + continue + } + + go func(env *Environment) { + log.WithPrefix("scheduler"). + WithField(infologger.Level, infologger.IL_Ops). + WithField("partition", envId.String()). + WithField("run", env.currentRunNumber). + Info("stopping the run due to beam dump") + + err := env.TryTransition(NewStopActivityTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("run", env.currentRunNumber). + WithError(err). + Error("could not stop the run upon beam dump") + + if env.CurrentState() != "ERROR" { + err = env.TryTransition(NewGoErrorTransition(envs.taskman)) + if err != nil { + log.WithPrefix("scheduler"). + WithField("partition", envId.String()). + WithField("run", env.currentRunNumber). + WithError(err). + Error("environment GO_ERROR transition failed after a beam dump event, forcing") + env.setState("ERROR") + } + } + } + }(env) + } } } From 24e802e2b22e21f64df628fc66ae9ea874ae16ae Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 15 Oct 2025 16:10:19 +0200 Subject: [PATCH 2211/2352] Remove obsolete err check The need for the check was removed in https://github.com/AliceO2Group/Control/commit/4fb6ba0d5851b836078acea361e71ac496f7352e --- core/environment/environment.go | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index f5c8b70b7..4f07e6f86 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -240,17 +240,13 @@ func newEnvironment(userVars map[string]string, newId uid.ID) (env *Environment, } env.GlobalVars.Set("__fmq_cleanup_count", strconv.Itoa(cleanupCount)) // number of times the START transition has run for this env - if err == nil { - lhcPeriod, ok := env.BaseConfigStack["lhc_period"] - if ok { - env.workflow.GetVars().Set("lhc_period", lhcPeriod) - } - nHbfPerTf, ok := env.BaseConfigStack["pdp_n_hbf_per_tf"] - if ok { - env.workflow.GetVars().Set("pdp_n_hbf_per_tf", nHbfPerTf) - } - } else { - log.Error("cannot access AliECS workflow configuration defaults") + lhcPeriod, ok := env.BaseConfigStack["lhc_period"] + if ok { + env.workflow.GetVars().Set("lhc_period", lhcPeriod) + } + nHbfPerTf, ok := env.BaseConfigStack["pdp_n_hbf_per_tf"] + if ok { + env.workflow.GetVars().Set("pdp_n_hbf_per_tf", nHbfPerTf) } } else if e.Event == "STOP_ACTIVITY" { endTime, ok := env.workflow.GetUserVars().Get("run_end_time_ms") From d6ef3441f83febac88c4573fe48e1270c33f421d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 9 Oct 2025 16:30:13 +0200 Subject: [PATCH 2212/2352] [docs] Added description how to run task inside a docker container --- README.md | 2 +- docs/running_docker.md | 116 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 docs/running_docker.md diff --git a/README.md b/README.md index c1326df51..18b4c98f9 100644 --- a/README.md +++ b/README.md @@ -191,7 +191,7 @@ There are two ways of interacting with AliECS: * [Hashing to aggregate](/docs/metrics.md#hashing-to-aggregate) * [Sampling reservoir](/docs/metrics.md#sampling-reservoir) * [OCC API debugging with grpcc](/docs/using_grpcc_occ.md#occ-api-debugging-with-grpcc) - + * [Running tasks inside docker](/docs/running_docker.md#running-a-task-inside-a-docker-container) * Resources * T. Mrnjavac et. al, [AliECS: A New Experiment Control System for the ALICE Experiment](https://doi.org/10.1051/epjconf/202429502027), CHEP23 diff --git a/docs/running_docker.md b/docs/running_docker.md new file mode 100644 index 000000000..e5d43698a --- /dev/null +++ b/docs/running_docker.md @@ -0,0 +1,116 @@ +# Running a Task Inside a Docker Container + +> ⚠️ **Warning** +> This method is **not intended for production use**. +> It serves only as a **proof of concept** for testing Docker images as part of an existing pipeline. +> +> Currently, it has been tested with the `alma9-flp-node` image running the *readout* component. + +--- + +## How To + +### 1. Manual Setup + +Before running tasks in Docker, ensure that the host machine has Docker installed. +At the time of writing, Docker must be installed **manually**. + +> ⚠️ **Security Note** +> The `flp` user must be able to run `sudo` **without a password**, because Docker requires root privileges because of inter process communication requirements +> +> This setup is **potentially unsafe** for production systems. There exists rootless mode in Podman (alias for Docker at RHEL) which might solve safety +> issues. However, we were not able to make this work for more than one container because of ipc requirements. + +Run the following commands as `root` to add `flp` user to sudoers: + +```bash +usermod -aG wheel flp +echo '%wheel ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/90-wheel-nopasswd +``` + +--- + +### 2. Modifying ControlWorkflows + +To run a task inside a Docker container on the executor, wrap the binary call in a `docker run` command within the [ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) repository. + +For example, to run readout, modify the `_plain_command` section of [`readout.yaml`](https://github.com/AliceO2Group/ControlWorkflows/blob/master/tasks/readout.yaml) by adding a Docker command. + +> 🧩 **Note** +> You must already have a Docker image that includes the required binary and configuration. +> (Creating such an image is outside the scope of this document.) + +#### Example Command + +When running readout, we successfully used the following command inside the `alma9-flp-node` image: + +```bash +sudo /usr/bin/docker run --name readout --replace \ + --user "$(id -u flp):$(id -u flp)" \ + --network=host --ipc=host \ + -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT \ + -e O2_SYSTEM -e O2_ROLE \ + gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 \ + /opt/o2/bin/o2-readout-exe +``` + +> 🧩 **Note** +> We are not claiming that this is the most efficient way how to run this image, just that it works. + +#### Environment Variables + +To identify all required environment variables: + +1. Open the **ECS GUI**. +2. Go to the **Environment Details** page for the relevant task. +3. Review the variables defined there — these match those used when running the binary outside Docker. + +#### Shared Memory Communication + +To enable shared memory communication between processes, add the `--ipc=host` flag when running the container. +However, doing so requires **elevated privileges**. + +While **Podman** can run without root privileges, it pauses other Podman processes for the same user. +This means commands like `podman ps -a` or starting multiple containers in parallel will not work. + +Therefore, you should run containers using the same user as the rest of the pipeline: + +```bash +--user "$(id -u flp):$(id -u flp)" +``` + +This ensures shared memory segments are created under the same user context. + +--- + +## Tips and Tricks + +* Production systems running RHEL do not install native Docker via: + + ```bash + dnf install docker + ``` + + Instead, they use **Podman**, which emulates Docker’s behavior but may differ in certain aspects. + +* To check whether ECS has started a container, run: + + ```bash + docker ps -a + ``` + + This lists all containers that have run (or are currently running) under the current user. + + > ECS typically runs as the `flp` user, so to inspect its containers, switch users first: + > + > ```bash + > su - flp + > ``` + +* To view container logs directly from Docker: + + ```bash + docker logs + ``` + +--- From 9588d2f41979a0c8ac0d111a8ff4857f90ada5b5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 18 Sep 2025 16:39:40 +0200 Subject: [PATCH 2213/2352] OCTRL-678 Pass the error message to BKP in case of GO_ERROR An error message is now propagated to kafka events just before scheduling a GO_ERROR transition. --- core/environment/environment.go | 19 +++++++++++++++++ core/environment/manager.go | 12 +++++++++++ core/environment/utils.go | 38 +++++++++++++++++++++++++++++++++ core/server.go | 4 ++++ core/task/task.go | 7 ++++++ 5 files changed, 80 insertions(+) diff --git a/core/environment/environment.go b/core/environment/environment.go index 4f07e6f86..34241d782 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1172,6 +1172,15 @@ func (env *Environment) QueryRoles(pathSpec string) (rs []workflow.Role) { return } +func (env *Environment) GetId() uid.ID { + if env == nil { + return "" + } + env.Mu.RLock() + defer env.Mu.RUnlock() + return env.id +} + func (env *Environment) GetPath() string { return "" } @@ -1218,7 +1227,12 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { log.WithField("partition", env.id). WithField("level", infologger.IL_Ops). Error("one of the critical tasks went into ERROR state, transitioning the environment into ERROR") + + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, newCriticalTasksErrorMessage(env)), + ) err := env.TryTransition(NewGoErrorTransition(taskman)) + if err != nil { if env.Sm.Current() == "ERROR" { log.WithField("partition", env.id). @@ -1451,6 +1465,11 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t log.WithField("partition", env.id). WithField("run", env.currentRunNumber). Errorf("Scheduled auto stop transition failed: %s, Transitioning into ERROR", err.Error()) + + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, fmt.Sprintf("scheduled auto stop transition failed: %s", err.Error())), + ) + err = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) if err != nil { log.WithField("partition", env.id). diff --git a/core/environment/manager.go b/core/environment/manager.go index 04004898e..e797f257a 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -489,6 +489,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithError(err). Warnf("auto-transitioning environment failed %s, cleanup in progress", op) + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, fmt.Sprintf("%s failed: %v", op, err)), + ) err := env.TryTransition(NewGoErrorTransition( envs.taskman), ) @@ -593,6 +596,9 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] WithField("level", infologger.IL_Devel). Error("environment deployment and configuration error, cleanup in progress") + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, fmt.Sprintf("deployment or configuration failed: %v", err)), + ) errTxErr := env.TryTransition(NewGoErrorTransition( envs.taskman), ) @@ -1053,6 +1059,9 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve } if env.CurrentState() != "ERROR" { + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, "ODC partition went to ERROR during RUNNING"), + ) err = env.TryTransition(NewGoErrorTransition(envs.taskman)) if err != nil { log.WithPrefix("scheduler"). @@ -1467,6 +1476,9 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str WithError(err). Warnf("auto-transitioning environment failed %s, cleanup in progress", op) + the.EventWriterWithTopic(topic.Environment).WriteEvent( + NewEnvGoErrorEvent(env, fmt.Sprintf("%s failed: %v", op, err)), + ) err := env.TryTransition(NewGoErrorTransition( envs.taskman), ) diff --git a/core/environment/utils.go b/core/environment/utils.go index 7cb236b79..229fde3e1 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -29,6 +29,10 @@ import ( "encoding/json" "fmt" "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" + "github.com/AliceO2Group/Control/core/task" + "github.com/AliceO2Group/Control/core/task/sm" + "github.com/AliceO2Group/Control/core/workflow" "os" "sort" @@ -101,3 +105,37 @@ func sortMapToString(m map[string]string) string { } return b.String() } + +func NewEnvGoErrorEvent(env *Environment, err string) *pb.Ev_EnvironmentEvent { + return &pb.Ev_EnvironmentEvent{ + EnvironmentId: env.GetId().String(), + State: env.Sm.Current(), + RunNumber: env.GetCurrentRunNumber(), + Error: err, + Message: "a critical error occurred, GO_ERROR transition imminent", + LastRequestUser: env.GetLastRequestUser(), + WorkflowTemplateInfo: env.GetWorkflowInfo(), + } +} + +func newCriticalTasksErrorMessage(env *Environment) string { + criticalTasksInError := env.workflow.GetTasks().Filtered(func(t *task.Task) bool { + return t.GetTraits().Critical && t.GetState() == sm.ERROR + }) + + if len(criticalTasksInError) == 0 { + return "no critical tasks in ERROR" + } else if len(criticalTasksInError) == 1 { + t := criticalTasksInError[0] + name := t.GetName() + + // if available, we prefer role name, because it does not have a long hash for JIT-generated DPL tasks + role, ok := t.GetParentRole().(workflow.Role) + if ok { + name = role.GetName() + } + return fmt.Sprintf("critical task '%s' on host '%s' transitioned to ERROR", name, t.GetHostname()) + } else { + return fmt.Sprintf("%d critical tasks transitioned to ERROR, could not determine the first one to fail", len(criticalTasksInError)) + } +} diff --git a/core/server.go b/core/server.go index f14c1e454..86bacb288 100644 --- a/core/server.go +++ b/core/server.go @@ -28,6 +28,7 @@ package core import ( "encoding/json" + "fmt" "maps" "runtime" "sort" @@ -646,6 +647,9 @@ func (m *RpcServer) ControlEnvironment(cxt context.Context, req *pb.ControlEnvir WithField("level", infologger.IL_Ops). WithError(err). Errorf("transition '%s' failed, transitioning into ERROR.", req.GetType().String()) + the.EventWriterWithTopic(topic.Environment).WriteEvent( + environment.NewEnvGoErrorEvent(env, fmt.Sprintf("transition %s failed: %v", req.GetType().String(), err)), + ) err = env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) if err != nil { log.WithField("partition", env.Id()).Warnf("could not complete requested GO_ERROR transition, forcing move to ERROR: %s", err.Error()) diff --git a/core/task/task.go b/core/task/task.go index 9e379c311..6e7040865 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -151,6 +151,13 @@ func (t *Task) SetSafeToStop(done bool) { t.safeToStop = done } +func (t *Task) GetState() sm.State { + t.mu.Lock() + defer t.mu.Unlock() + + return t.state +} + func (t *Task) GetParentRole() interface{} { t.mu.RLock() defer t.mu.RUnlock() From 615e481d1e4917efbd7eab2a52a2a910a366a75e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 16 Oct 2025 11:36:29 +0200 Subject: [PATCH 2214/2352] Bump to v1.45.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index f3077269c..5b07e409f 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 44 +VERSION_MINOR := 45 VERSION_PATCH := 0 From 97d567785fb35b78ec33c6ae3cb0746b2fac4bf7 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 22 May 2025 09:40:27 +0200 Subject: [PATCH 2215/2352] [core] update odc.proto to include collection info OCTRL-1024 --- core/integration/odc/protos/odc.pb.go | 405 ++++++++++++++++---------- core/integration/odc/protos/odc.proto | 13 +- 2 files changed, 265 insertions(+), 153 deletions(-) diff --git a/core/integration/odc/protos/odc.pb.go b/core/integration/odc/protos/odc.pb.go index 4edcb3cc5..9475e2b02 100644 --- a/core/integration/odc/protos/odc.pb.go +++ b/core/integration/odc/protos/odc.pb.go @@ -394,6 +394,78 @@ func (x *Device) GetRmsjobid() string { return "" } +// Collection information +type Collection struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id uint64 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` // Runtime collection ID (same as in DDS) + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` // Aggregated state as string + Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` // Path in the topology + Host string `protobuf:"bytes,5,opt,name=host,proto3" json:"host,omitempty"` // Host where the collection runs +} + +func (x *Collection) Reset() { + *x = Collection{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_odc_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Collection) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Collection) ProtoMessage() {} + +func (x *Collection) ProtoReflect() protoreflect.Message { + mi := &file_protos_odc_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Collection.ProtoReflect.Descriptor instead. +func (*Collection) Descriptor() ([]byte, []int) { + return file_protos_odc_proto_rawDescGZIP(), []int{3} +} + +func (x *Collection) GetId() uint64 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *Collection) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Collection) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *Collection) GetHost() string { + if x != nil { + return x.Host + } + return "" +} + // Device change/get state request type StateRequest struct { state protoimpl.MessageState @@ -410,7 +482,7 @@ type StateRequest struct { func (x *StateRequest) Reset() { *x = StateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[3] + mi := &file_protos_odc_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -423,7 +495,7 @@ func (x *StateRequest) String() string { func (*StateRequest) ProtoMessage() {} func (x *StateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[3] + mi := &file_protos_odc_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -436,7 +508,7 @@ func (x *StateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StateRequest.ProtoReflect.Descriptor instead. func (*StateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{3} + return file_protos_odc_proto_rawDescGZIP(), []int{4} } func (x *StateRequest) GetPartitionid() string { @@ -480,14 +552,15 @@ type StateReply struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` // General reply. See GeneralReply message for details. - Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. + Reply *GeneralReply `protobuf:"bytes,1,opt,name=reply,proto3" json:"reply,omitempty"` // General reply. See GeneralReply message for details. + Devices []*Device `protobuf:"bytes,2,rep,name=devices,proto3" json:"devices,omitempty"` // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. + Collections []*Collection `protobuf:"bytes,3,rep,name=collections,proto3" json:"collections,omitempty"` // If detailed reply is requested then this field contains a list of affected collections otherwise it's empty. } func (x *StateReply) Reset() { *x = StateReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[4] + mi := &file_protos_odc_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -500,7 +573,7 @@ func (x *StateReply) String() string { func (*StateReply) ProtoMessage() {} func (x *StateReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[4] + mi := &file_protos_odc_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -513,7 +586,7 @@ func (x *StateReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StateReply.ProtoReflect.Descriptor instead. func (*StateReply) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{4} + return file_protos_odc_proto_rawDescGZIP(), []int{5} } func (x *StateReply) GetReply() *GeneralReply { @@ -530,6 +603,13 @@ func (x *StateReply) GetDevices() []*Device { return nil } +func (x *StateReply) GetCollections() []*Collection { + if x != nil { + return x.Collections + } + return nil +} + // Status of each partition type PartitionStatus struct { state protoimpl.MessageState @@ -547,7 +627,7 @@ type PartitionStatus struct { func (x *PartitionStatus) Reset() { *x = PartitionStatus{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[5] + mi := &file_protos_odc_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -560,7 +640,7 @@ func (x *PartitionStatus) String() string { func (*PartitionStatus) ProtoMessage() {} func (x *PartitionStatus) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[5] + mi := &file_protos_odc_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -573,7 +653,7 @@ func (x *PartitionStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use PartitionStatus.ProtoReflect.Descriptor instead. func (*PartitionStatus) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{5} + return file_protos_odc_proto_rawDescGZIP(), []int{6} } func (x *PartitionStatus) GetPartitionid() string { @@ -634,7 +714,7 @@ type StatusReply struct { func (x *StatusReply) Reset() { *x = StatusReply{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[6] + mi := &file_protos_odc_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -647,7 +727,7 @@ func (x *StatusReply) String() string { func (*StatusReply) ProtoMessage() {} func (x *StatusReply) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[6] + mi := &file_protos_odc_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -660,7 +740,7 @@ func (x *StatusReply) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusReply.ProtoReflect.Descriptor instead. func (*StatusReply) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{6} + return file_protos_odc_proto_rawDescGZIP(), []int{7} } func (x *StatusReply) GetMsg() string { @@ -713,7 +793,7 @@ type InitializeRequest struct { func (x *InitializeRequest) Reset() { *x = InitializeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[7] + mi := &file_protos_odc_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -726,7 +806,7 @@ func (x *InitializeRequest) String() string { func (*InitializeRequest) ProtoMessage() {} func (x *InitializeRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[7] + mi := &file_protos_odc_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -739,7 +819,7 @@ func (x *InitializeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InitializeRequest.ProtoReflect.Descriptor instead. func (*InitializeRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{7} + return file_protos_odc_proto_rawDescGZIP(), []int{8} } func (x *InitializeRequest) GetPartitionid() string { @@ -786,7 +866,7 @@ type SubmitRequest struct { func (x *SubmitRequest) Reset() { *x = SubmitRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[8] + mi := &file_protos_odc_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -799,7 +879,7 @@ func (x *SubmitRequest) String() string { func (*SubmitRequest) ProtoMessage() {} func (x *SubmitRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[8] + mi := &file_protos_odc_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -812,7 +892,7 @@ func (x *SubmitRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitRequest.ProtoReflect.Descriptor instead. func (*SubmitRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{8} + return file_protos_odc_proto_rawDescGZIP(), []int{9} } func (x *SubmitRequest) GetPartitionid() string { @@ -868,7 +948,7 @@ type ActivateRequest struct { func (x *ActivateRequest) Reset() { *x = ActivateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[9] + mi := &file_protos_odc_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -881,7 +961,7 @@ func (x *ActivateRequest) String() string { func (*ActivateRequest) ProtoMessage() {} func (x *ActivateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[9] + mi := &file_protos_odc_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -894,7 +974,7 @@ func (x *ActivateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ActivateRequest.ProtoReflect.Descriptor instead. func (*ActivateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{9} + return file_protos_odc_proto_rawDescGZIP(), []int{10} } func (x *ActivateRequest) GetPartitionid() string { @@ -960,7 +1040,7 @@ type RunRequest struct { func (x *RunRequest) Reset() { *x = RunRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[10] + mi := &file_protos_odc_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -973,7 +1053,7 @@ func (x *RunRequest) String() string { func (*RunRequest) ProtoMessage() {} func (x *RunRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[10] + mi := &file_protos_odc_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -986,7 +1066,7 @@ func (x *RunRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RunRequest.ProtoReflect.Descriptor instead. func (*RunRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{10} + return file_protos_odc_proto_rawDescGZIP(), []int{11} } func (x *RunRequest) GetPartitionid() string { @@ -1070,7 +1150,7 @@ type UpdateRequest struct { func (x *UpdateRequest) Reset() { *x = UpdateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[11] + mi := &file_protos_odc_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1083,7 +1163,7 @@ func (x *UpdateRequest) String() string { func (*UpdateRequest) ProtoMessage() {} func (x *UpdateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[11] + mi := &file_protos_odc_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1096,7 +1176,7 @@ func (x *UpdateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateRequest.ProtoReflect.Descriptor instead. func (*UpdateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{11} + return file_protos_odc_proto_rawDescGZIP(), []int{12} } func (x *UpdateRequest) GetPartitionid() string { @@ -1155,7 +1235,7 @@ type ShutdownRequest struct { func (x *ShutdownRequest) Reset() { *x = ShutdownRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[12] + mi := &file_protos_odc_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1168,7 +1248,7 @@ func (x *ShutdownRequest) String() string { func (*ShutdownRequest) ProtoMessage() {} func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[12] + mi := &file_protos_odc_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1181,7 +1261,7 @@ func (x *ShutdownRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ShutdownRequest.ProtoReflect.Descriptor instead. func (*ShutdownRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{12} + return file_protos_odc_proto_rawDescGZIP(), []int{13} } func (x *ShutdownRequest) GetPartitionid() string { @@ -1218,7 +1298,7 @@ type Property struct { func (x *Property) Reset() { *x = Property{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[13] + mi := &file_protos_odc_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1231,7 +1311,7 @@ func (x *Property) String() string { func (*Property) ProtoMessage() {} func (x *Property) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[13] + mi := &file_protos_odc_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1244,7 +1324,7 @@ func (x *Property) ProtoReflect() protoreflect.Message { // Deprecated: Use Property.ProtoReflect.Descriptor instead. func (*Property) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{13} + return file_protos_odc_proto_rawDescGZIP(), []int{14} } func (x *Property) GetKey() string { @@ -1277,7 +1357,7 @@ type SetPropertiesRequest struct { func (x *SetPropertiesRequest) Reset() { *x = SetPropertiesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[14] + mi := &file_protos_odc_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1290,7 +1370,7 @@ func (x *SetPropertiesRequest) String() string { func (*SetPropertiesRequest) ProtoMessage() {} func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[14] + mi := &file_protos_odc_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1303,7 +1383,7 @@ func (x *SetPropertiesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetPropertiesRequest.ProtoReflect.Descriptor instead. func (*SetPropertiesRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{14} + return file_protos_odc_proto_rawDescGZIP(), []int{15} } func (x *SetPropertiesRequest) GetPartitionid() string { @@ -1353,7 +1433,7 @@ type ConfigureRequest struct { func (x *ConfigureRequest) Reset() { *x = ConfigureRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[15] + mi := &file_protos_odc_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1366,7 +1446,7 @@ func (x *ConfigureRequest) String() string { func (*ConfigureRequest) ProtoMessage() {} func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[15] + mi := &file_protos_odc_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1379,7 +1459,7 @@ func (x *ConfigureRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigureRequest.ProtoReflect.Descriptor instead. func (*ConfigureRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{15} + return file_protos_odc_proto_rawDescGZIP(), []int{16} } func (x *ConfigureRequest) GetRequest() *StateRequest { @@ -1401,7 +1481,7 @@ type StartRequest struct { func (x *StartRequest) Reset() { *x = StartRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[16] + mi := &file_protos_odc_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1414,7 +1494,7 @@ func (x *StartRequest) String() string { func (*StartRequest) ProtoMessage() {} func (x *StartRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[16] + mi := &file_protos_odc_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1427,7 +1507,7 @@ func (x *StartRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartRequest.ProtoReflect.Descriptor instead. func (*StartRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{16} + return file_protos_odc_proto_rawDescGZIP(), []int{17} } func (x *StartRequest) GetRequest() *StateRequest { @@ -1449,7 +1529,7 @@ type StopRequest struct { func (x *StopRequest) Reset() { *x = StopRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[17] + mi := &file_protos_odc_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1462,7 +1542,7 @@ func (x *StopRequest) String() string { func (*StopRequest) ProtoMessage() {} func (x *StopRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[17] + mi := &file_protos_odc_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1475,7 +1555,7 @@ func (x *StopRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopRequest.ProtoReflect.Descriptor instead. func (*StopRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{17} + return file_protos_odc_proto_rawDescGZIP(), []int{18} } func (x *StopRequest) GetRequest() *StateRequest { @@ -1497,7 +1577,7 @@ type ResetRequest struct { func (x *ResetRequest) Reset() { *x = ResetRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[18] + mi := &file_protos_odc_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1510,7 +1590,7 @@ func (x *ResetRequest) String() string { func (*ResetRequest) ProtoMessage() {} func (x *ResetRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[18] + mi := &file_protos_odc_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1523,7 +1603,7 @@ func (x *ResetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetRequest.ProtoReflect.Descriptor instead. func (*ResetRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{18} + return file_protos_odc_proto_rawDescGZIP(), []int{19} } func (x *ResetRequest) GetRequest() *StateRequest { @@ -1545,7 +1625,7 @@ type TerminateRequest struct { func (x *TerminateRequest) Reset() { *x = TerminateRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[19] + mi := &file_protos_odc_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1558,7 +1638,7 @@ func (x *TerminateRequest) String() string { func (*TerminateRequest) ProtoMessage() {} func (x *TerminateRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[19] + mi := &file_protos_odc_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1571,7 +1651,7 @@ func (x *TerminateRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use TerminateRequest.ProtoReflect.Descriptor instead. func (*TerminateRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{19} + return file_protos_odc_proto_rawDescGZIP(), []int{20} } func (x *TerminateRequest) GetRequest() *StateRequest { @@ -1593,7 +1673,7 @@ type StatusRequest struct { func (x *StatusRequest) Reset() { *x = StatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protos_odc_proto_msgTypes[20] + mi := &file_protos_odc_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1606,7 +1686,7 @@ func (x *StatusRequest) String() string { func (*StatusRequest) ProtoMessage() {} func (x *StatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_protos_odc_proto_msgTypes[20] + mi := &file_protos_odc_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1619,7 +1699,7 @@ func (x *StatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusRequest.ProtoReflect.Descriptor instead. func (*StatusRequest) Descriptor() ([]byte, []int) { - return file_protos_odc_proto_rawDescGZIP(), []int{20} + return file_protos_odc_proto_rawDescGZIP(), []int{21} } func (x *StatusRequest) GetRunning() bool { @@ -1666,21 +1746,30 @@ var file_protos_odc_proto_rawDesc = []byte{ 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x65, 0x6e, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x6d, 0x73, 0x6a, 0x6f, 0x62, 0x69, 0x64, - 0x22, 0x90, 0x01, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x22, 0x5c, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, - 0x79, 0x12, 0x27, 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, - 0x70, 0x6c, 0x79, 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, - 0x63, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x22, 0x5a, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x22, 0x90, 0x01, 0x0a, + 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x6e, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x22, + 0x8f, 0x01, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x27, + 0x0a, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x6f, 0x64, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x65, 0x70, 0x6c, 0x79, + 0x52, 0x05, 0x72, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x31, + 0x0a, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x6f, 0x64, 0x63, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, @@ -1879,80 +1968,82 @@ func file_protos_odc_proto_rawDescGZIP() []byte { } var file_protos_odc_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_protos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_protos_odc_proto_msgTypes = make([]protoimpl.MessageInfo, 22) var file_protos_odc_proto_goTypes = []interface{}{ (ReplyStatus)(0), // 0: odc.ReplyStatus (SessionStatus)(0), // 1: odc.SessionStatus (*Error)(nil), // 2: odc.Error (*GeneralReply)(nil), // 3: odc.GeneralReply (*Device)(nil), // 4: odc.Device - (*StateRequest)(nil), // 5: odc.StateRequest - (*StateReply)(nil), // 6: odc.StateReply - (*PartitionStatus)(nil), // 7: odc.PartitionStatus - (*StatusReply)(nil), // 8: odc.StatusReply - (*InitializeRequest)(nil), // 9: odc.InitializeRequest - (*SubmitRequest)(nil), // 10: odc.SubmitRequest - (*ActivateRequest)(nil), // 11: odc.ActivateRequest - (*RunRequest)(nil), // 12: odc.RunRequest - (*UpdateRequest)(nil), // 13: odc.UpdateRequest - (*ShutdownRequest)(nil), // 14: odc.ShutdownRequest - (*Property)(nil), // 15: odc.Property - (*SetPropertiesRequest)(nil), // 16: odc.SetPropertiesRequest - (*ConfigureRequest)(nil), // 17: odc.ConfigureRequest - (*StartRequest)(nil), // 18: odc.StartRequest - (*StopRequest)(nil), // 19: odc.StopRequest - (*ResetRequest)(nil), // 20: odc.ResetRequest - (*TerminateRequest)(nil), // 21: odc.TerminateRequest - (*StatusRequest)(nil), // 22: odc.StatusRequest + (*Collection)(nil), // 5: odc.Collection + (*StateRequest)(nil), // 6: odc.StateRequest + (*StateReply)(nil), // 7: odc.StateReply + (*PartitionStatus)(nil), // 8: odc.PartitionStatus + (*StatusReply)(nil), // 9: odc.StatusReply + (*InitializeRequest)(nil), // 10: odc.InitializeRequest + (*SubmitRequest)(nil), // 11: odc.SubmitRequest + (*ActivateRequest)(nil), // 12: odc.ActivateRequest + (*RunRequest)(nil), // 13: odc.RunRequest + (*UpdateRequest)(nil), // 14: odc.UpdateRequest + (*ShutdownRequest)(nil), // 15: odc.ShutdownRequest + (*Property)(nil), // 16: odc.Property + (*SetPropertiesRequest)(nil), // 17: odc.SetPropertiesRequest + (*ConfigureRequest)(nil), // 18: odc.ConfigureRequest + (*StartRequest)(nil), // 19: odc.StartRequest + (*StopRequest)(nil), // 20: odc.StopRequest + (*ResetRequest)(nil), // 21: odc.ResetRequest + (*TerminateRequest)(nil), // 22: odc.TerminateRequest + (*StatusRequest)(nil), // 23: odc.StatusRequest } var file_protos_odc_proto_depIdxs = []int32{ 0, // 0: odc.GeneralReply.status:type_name -> odc.ReplyStatus 2, // 1: odc.GeneralReply.error:type_name -> odc.Error 3, // 2: odc.StateReply.reply:type_name -> odc.GeneralReply 4, // 3: odc.StateReply.devices:type_name -> odc.Device - 1, // 4: odc.PartitionStatus.status:type_name -> odc.SessionStatus - 0, // 5: odc.StatusReply.status:type_name -> odc.ReplyStatus - 2, // 6: odc.StatusReply.error:type_name -> odc.Error - 7, // 7: odc.StatusReply.partitions:type_name -> odc.PartitionStatus - 15, // 8: odc.SetPropertiesRequest.properties:type_name -> odc.Property - 5, // 9: odc.ConfigureRequest.request:type_name -> odc.StateRequest - 5, // 10: odc.StartRequest.request:type_name -> odc.StateRequest - 5, // 11: odc.StopRequest.request:type_name -> odc.StateRequest - 5, // 12: odc.ResetRequest.request:type_name -> odc.StateRequest - 5, // 13: odc.TerminateRequest.request:type_name -> odc.StateRequest - 9, // 14: odc.ODC.Initialize:input_type -> odc.InitializeRequest - 10, // 15: odc.ODC.Submit:input_type -> odc.SubmitRequest - 11, // 16: odc.ODC.Activate:input_type -> odc.ActivateRequest - 12, // 17: odc.ODC.Run:input_type -> odc.RunRequest - 13, // 18: odc.ODC.Update:input_type -> odc.UpdateRequest - 17, // 19: odc.ODC.Configure:input_type -> odc.ConfigureRequest - 16, // 20: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest - 5, // 21: odc.ODC.GetState:input_type -> odc.StateRequest - 18, // 22: odc.ODC.Start:input_type -> odc.StartRequest - 19, // 23: odc.ODC.Stop:input_type -> odc.StopRequest - 20, // 24: odc.ODC.Reset:input_type -> odc.ResetRequest - 21, // 25: odc.ODC.Terminate:input_type -> odc.TerminateRequest - 14, // 26: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest - 22, // 27: odc.ODC.Status:input_type -> odc.StatusRequest - 3, // 28: odc.ODC.Initialize:output_type -> odc.GeneralReply - 3, // 29: odc.ODC.Submit:output_type -> odc.GeneralReply - 3, // 30: odc.ODC.Activate:output_type -> odc.GeneralReply - 3, // 31: odc.ODC.Run:output_type -> odc.GeneralReply - 3, // 32: odc.ODC.Update:output_type -> odc.GeneralReply - 6, // 33: odc.ODC.Configure:output_type -> odc.StateReply - 3, // 34: odc.ODC.SetProperties:output_type -> odc.GeneralReply - 6, // 35: odc.ODC.GetState:output_type -> odc.StateReply - 6, // 36: odc.ODC.Start:output_type -> odc.StateReply - 6, // 37: odc.ODC.Stop:output_type -> odc.StateReply - 6, // 38: odc.ODC.Reset:output_type -> odc.StateReply - 6, // 39: odc.ODC.Terminate:output_type -> odc.StateReply - 3, // 40: odc.ODC.Shutdown:output_type -> odc.GeneralReply - 8, // 41: odc.ODC.Status:output_type -> odc.StatusReply - 28, // [28:42] is the sub-list for method output_type - 14, // [14:28] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 5, // 4: odc.StateReply.collections:type_name -> odc.Collection + 1, // 5: odc.PartitionStatus.status:type_name -> odc.SessionStatus + 0, // 6: odc.StatusReply.status:type_name -> odc.ReplyStatus + 2, // 7: odc.StatusReply.error:type_name -> odc.Error + 8, // 8: odc.StatusReply.partitions:type_name -> odc.PartitionStatus + 16, // 9: odc.SetPropertiesRequest.properties:type_name -> odc.Property + 6, // 10: odc.ConfigureRequest.request:type_name -> odc.StateRequest + 6, // 11: odc.StartRequest.request:type_name -> odc.StateRequest + 6, // 12: odc.StopRequest.request:type_name -> odc.StateRequest + 6, // 13: odc.ResetRequest.request:type_name -> odc.StateRequest + 6, // 14: odc.TerminateRequest.request:type_name -> odc.StateRequest + 10, // 15: odc.ODC.Initialize:input_type -> odc.InitializeRequest + 11, // 16: odc.ODC.Submit:input_type -> odc.SubmitRequest + 12, // 17: odc.ODC.Activate:input_type -> odc.ActivateRequest + 13, // 18: odc.ODC.Run:input_type -> odc.RunRequest + 14, // 19: odc.ODC.Update:input_type -> odc.UpdateRequest + 18, // 20: odc.ODC.Configure:input_type -> odc.ConfigureRequest + 17, // 21: odc.ODC.SetProperties:input_type -> odc.SetPropertiesRequest + 6, // 22: odc.ODC.GetState:input_type -> odc.StateRequest + 19, // 23: odc.ODC.Start:input_type -> odc.StartRequest + 20, // 24: odc.ODC.Stop:input_type -> odc.StopRequest + 21, // 25: odc.ODC.Reset:input_type -> odc.ResetRequest + 22, // 26: odc.ODC.Terminate:input_type -> odc.TerminateRequest + 15, // 27: odc.ODC.Shutdown:input_type -> odc.ShutdownRequest + 23, // 28: odc.ODC.Status:input_type -> odc.StatusRequest + 3, // 29: odc.ODC.Initialize:output_type -> odc.GeneralReply + 3, // 30: odc.ODC.Submit:output_type -> odc.GeneralReply + 3, // 31: odc.ODC.Activate:output_type -> odc.GeneralReply + 3, // 32: odc.ODC.Run:output_type -> odc.GeneralReply + 3, // 33: odc.ODC.Update:output_type -> odc.GeneralReply + 7, // 34: odc.ODC.Configure:output_type -> odc.StateReply + 3, // 35: odc.ODC.SetProperties:output_type -> odc.GeneralReply + 7, // 36: odc.ODC.GetState:output_type -> odc.StateReply + 7, // 37: odc.ODC.Start:output_type -> odc.StateReply + 7, // 38: odc.ODC.Stop:output_type -> odc.StateReply + 7, // 39: odc.ODC.Reset:output_type -> odc.StateReply + 7, // 40: odc.ODC.Terminate:output_type -> odc.StateReply + 3, // 41: odc.ODC.Shutdown:output_type -> odc.GeneralReply + 9, // 42: odc.ODC.Status:output_type -> odc.StatusReply + 29, // [29:43] is the sub-list for method output_type + 15, // [15:29] is the sub-list for method input_type + 15, // [15:15] is the sub-list for extension type_name + 15, // [15:15] is the sub-list for extension extendee + 0, // [0:15] is the sub-list for field type_name } func init() { file_protos_odc_proto_init() } @@ -1998,7 +2089,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateRequest); i { + switch v := v.(*Collection); i { case 0: return &v.state case 1: @@ -2010,7 +2101,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StateReply); i { + switch v := v.(*StateRequest); i { case 0: return &v.state case 1: @@ -2022,7 +2113,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PartitionStatus); i { + switch v := v.(*StateReply); i { case 0: return &v.state case 1: @@ -2034,7 +2125,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatusReply); i { + switch v := v.(*PartitionStatus); i { case 0: return &v.state case 1: @@ -2046,7 +2137,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InitializeRequest); i { + switch v := v.(*StatusReply); i { case 0: return &v.state case 1: @@ -2058,7 +2149,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubmitRequest); i { + switch v := v.(*InitializeRequest); i { case 0: return &v.state case 1: @@ -2070,7 +2161,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ActivateRequest); i { + switch v := v.(*SubmitRequest); i { case 0: return &v.state case 1: @@ -2082,7 +2173,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunRequest); i { + switch v := v.(*ActivateRequest); i { case 0: return &v.state case 1: @@ -2094,7 +2185,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateRequest); i { + switch v := v.(*RunRequest); i { case 0: return &v.state case 1: @@ -2106,7 +2197,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShutdownRequest); i { + switch v := v.(*UpdateRequest); i { case 0: return &v.state case 1: @@ -2118,7 +2209,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Property); i { + switch v := v.(*ShutdownRequest); i { case 0: return &v.state case 1: @@ -2130,7 +2221,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetPropertiesRequest); i { + switch v := v.(*Property); i { case 0: return &v.state case 1: @@ -2142,7 +2233,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureRequest); i { + switch v := v.(*SetPropertiesRequest); i { case 0: return &v.state case 1: @@ -2154,7 +2245,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartRequest); i { + switch v := v.(*ConfigureRequest); i { case 0: return &v.state case 1: @@ -2166,7 +2257,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopRequest); i { + switch v := v.(*StartRequest); i { case 0: return &v.state case 1: @@ -2178,7 +2269,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetRequest); i { + switch v := v.(*StopRequest); i { case 0: return &v.state case 1: @@ -2190,7 +2281,7 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TerminateRequest); i { + switch v := v.(*ResetRequest); i { case 0: return &v.state case 1: @@ -2202,6 +2293,18 @@ func file_protos_odc_proto_init() { } } file_protos_odc_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TerminateRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_odc_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusRequest); i { case 0: return &v.state @@ -2220,7 +2323,7 @@ func file_protos_odc_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_odc_proto_rawDesc, NumEnums: 2, - NumMessages: 21, + NumMessages: 22, NumExtensions: 0, NumServices: 1, }, diff --git a/core/integration/odc/protos/odc.proto b/core/integration/odc/protos/odc.proto index 9ce3c187b..6caa07a76 100644 --- a/core/integration/odc/protos/odc.proto +++ b/core/integration/odc/protos/odc.proto @@ -58,8 +58,8 @@ enum SessionStatus { message Error { string msg = 1; // Detailed error message int32 code = 2; // Error code. - // TODO: Make error codes specific for each concrete request and/or error type. - // TODO: Add link to a documented error codes. + // TODO: Make error codes specific for each concrete request and/or error type. + // TODO: Add link to a documented error codes. } // General reply to requests @@ -89,6 +89,14 @@ message Device { string rmsjobid = 7; // job IDs from the resource management system } +//Collection information +message Collection { + uint64 id = 1; // Runtime collection ID (same as in DDS) + string state = 2; // Aggregated state as string + string path = 3; // Path in the topology + string host = 5; // Host where the collection runs +} + // Device change/get state request message StateRequest { string partitionid = 1; // Partition ID from ECS @@ -102,6 +110,7 @@ message StateRequest { message StateReply { GeneralReply reply = 1; // General reply. See GeneralReply message for details. repeated Device devices = 2; // If detailed reply is requested then this field contains a list of affected devices otherwise it's empty. + repeated Collection collections = 3; // If detailed reply is requested then this field contains a list of affected collections otherwise it's empty. } // Status of each partition From ddc3b5bf9e9565e1f62a22a8c7aee74ff909cf66 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 30 May 2025 09:38:57 +0200 Subject: [PATCH 2216/2352] [core] expose ODC collection info in the plugin GetEnvironmentsData --- core/integration/odc/plugin.go | 86 ++++++++++++++++++++++++++++++---- 1 file changed, 78 insertions(+), 8 deletions(-) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 11a1d9fa3..a282dbddf 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -95,20 +95,22 @@ type OdcStatus struct { } type OdcDeviceId uint64 +type OdcCollectionId uint64 func (o OdcDeviceId) MarshalJSON() ([]byte, error) { return json.Marshal(strconv.FormatUint(uint64(o), 10)) } type OdcPartitionInfo struct { - PartitionId uid.ID `json:"-"` - RunNumber uint32 `json:"runNumber"` - State string `json:"state"` - EcsState sm.State `json:"ecsState"` - DdsSessionId string `json:"ddsSessionId"` - DdsSessionStatus string `json:"ddsSessionStatus"` - Devices map[OdcDeviceId]*OdcDevice `json:"devices"` - Hosts []string `json:"hosts"` + PartitionId uid.ID `json:"-"` + RunNumber uint32 `json:"runNumber"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + Devices map[OdcDeviceId]*OdcDevice `json:"devices"` + Hosts []string `json:"hosts"` + Collections map[OdcCollectionId]*OdcCollection `json:"collections"` } type OdcDevice struct { @@ -122,6 +124,14 @@ type OdcDevice struct { Rmsjobid string `json:"rmsjobid"` } +type OdcCollection struct { + CollectionId OdcCollectionId `json:"collectionId"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + Path string `json:"path"` + Host string `json:"host"` +} + type partitionStateChangedEventPayload struct { PartitionId uid.ID `json:"partitionId"` DdsSessionId string `json:"ddsSessionId"` @@ -144,6 +154,17 @@ type deviceStateChangedEventPayload struct { Rmsjobid string `json:"rmsjobid"` } +type collectionStateChangedEventPayload struct { + PartitionId uid.ID `json:"partitionId"` + DdsSessionId string `json:"ddsSessionId"` + DdsSessionStatus string `json:"ddsSessionStatus"` + State string `json:"state"` + EcsState sm.State `json:"ecsState"` + CollectionId OdcCollectionId `json:"collectionId"` + Path string `json:"path"` + Host string `json:"host"` +} + func NewPlugin(endpoint string) integration.Plugin { u, err := url.Parse(endpoint) if err != nil { @@ -273,6 +294,16 @@ func (p *Plugin) queryPartitionStatus() { Rmsjobid: device.Rmsjobid, } } + odcPartInfoSlice[idx].Collections = make(map[OdcCollectionId]*OdcCollection, len(odcPartStateRep.Collections)) + for _, collection := range odcPartStateRep.Collections { + odcPartInfoSlice[idx].Collections[OdcCollectionId(collection.Id)] = &OdcCollection{ + CollectionId: OdcCollectionId(collection.Id), + State: collection.State, + EcsState: fairmq.ToEcsState(collection.State, sm.UNKNOWN), + Path: collection.Path, + Host: collection.Host, + } + } }(i, id) } wg.Wait() @@ -337,6 +368,45 @@ func (p *Plugin) queryPartitionStatus() { }) } + // detection of collection state change + event publication + for collectionId, collection := range partitionInfo.Collections { + existingCollection, hasCollection := existingPartition.Collections[collectionId] + + oldEcsState := sm.UNKNOWN // we presume the collection didn't exist before + + // if a collection with this ID is already known to us from before + if hasCollection { + // if collection state has changed + if existingCollection.State != collection.State { + // if the state has changed, we take note of the previous state + oldEcsState = existingCollection.EcsState + } else { + // if the state hasn't changed, we set the old ECS state and bail + collection.EcsState = existingCollection.EcsState + continue + } + } + + collection.EcsState = fairmq.ToEcsState(collection.State, oldEcsState) + + payload := collectionStateChangedEventPayload{ + PartitionId: partitionInfo.PartitionId, + DdsSessionId: partitionInfo.DdsSessionId, + DdsSessionStatus: partitionInfo.DdsSessionStatus, + State: collection.State, + EcsState: collection.EcsState, + CollectionId: collection.CollectionId, + Path: collection.Path, + Host: collection.Host, + } + payloadJson, _ := json.Marshal(payload) + the.EventWriterWithTopic(TOPIC).WriteEvent(&pb.Ev_IntegratedServiceEvent{ + Name: "odc.collectionStateChanged", + EnvironmentId: id.String(), + Payload: string(payloadJson[:]), + }) + } + // detection of env (ODC partition) state change + event publication if existingPartition.State != partitionInfo.State { partitionInfo.EcsState = fairmq.ToEcsState(partitionInfo.State, existingPartition.EcsState) From f67074cd3334eee76b0eafe98eb1a57ae60a2ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 21 Oct 2025 17:56:30 +0200 Subject: [PATCH 2217/2352] [OCTRL-1052] Provide description how to run readout with CRU from ECS --- docs/running_docker.md | 74 +++++++++++++++++++++++++----------------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/docs/running_docker.md b/docs/running_docker.md index e5d43698a..11fbb4fbd 100644 --- a/docs/running_docker.md +++ b/docs/running_docker.md @@ -4,7 +4,7 @@ > This method is **not intended for production use**. > It serves only as a **proof of concept** for testing Docker images as part of an existing pipeline. > -> Currently, it has been tested with the `alma9-flp-node` image running the *readout* component. +> Currently, it was tested with the `alma9-flp-node` image running the *readout* component with CRU. --- @@ -45,55 +45,69 @@ For example, to run readout, modify the `_plain_command` section of [`readout.ya When running readout, we successfully used the following command inside the `alma9-flp-node` image: ```bash -sudo /usr/bin/docker run --name readout --replace \ - --user "$(id -u flp):$(id -u flp)" \ +sudo -E docker run --name readout --replace \ + --user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro \ + --privileged \ --network=host --ipc=host \ - -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT \ - -e O2_SYSTEM -e O2_ROLE \ + -v /tmp:/tmp \ + -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) \ + -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT -e O2_SYSTEM -e O2_ROLE \ gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 \ /opt/o2/bin/o2-readout-exe ``` > 🧩 **Note** > We are not claiming that this is the most efficient way how to run this image, just that it works. +> +#### Explanation of command + +Let's explain all parts of the `docker run` command and what is their purpose. As RHEL uses Podman by default +instead of docker we are going to comment on Podman parameters, but docker should be equivalent or pretty close. + +- `sudo -E` switch to the rootful mode of Podman and pass all of the environment variables +- `docker run --name readout --replace` start container with the name readout and replace already existing container +- `--privileged` runs container with extended privileges and allows access to the devices and other resources +on host system with the same privileges as user running the container (`flp` in our case). Readout communicates +directly with CRUs and others connected via PCIe so we need to make these available inside the container. +- `--user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro` run container as flp user provide same user +and group settings as on a host machine. This is necessary as readout is using shared memory which is mapped under +flp user and needs access to [BAR](https://github.com/AliceO2Group/ReadoutCard?tab=readme-ov-file#bar-interface) +interfaces of CRU which belong to the `pda` group. We used this way of setting up user privileges and ids as there is +no guarantee that ids would match if we would hardwire user into docker image +- `--network=host` bind container's network to the host's. This allows services running outside of docker to communicate +with internals (eg. gRPC, IL, ... ). It should be changed to open just required ports. +- `--ipc=host` readout uses FairMQ which communicates through shared memory Inter-Process Communication. +As we are now running readout inside the docker with the rest of data distribution running bare metal we +need to have access to the hosting OS shared memory. This is the main requirement for running as rootful. +If we run container in rootless mode with this flag set, Podman switches into elevated privileges mode that blocks +other cli commands from the same user command until this command is finished unless running under root. +We tried to just bind `/dev/shm/` but readout failed on permission errors. +- `-v /tmp:/tmp` binds `/tmp` of host to the container for monitoring purposes. +- `-v /lib/modules/$(uname -r):/lib/modules/$(uname -r)` binds folder with host's kernel modules for the usage of PDA +used by readout itself. +- `e ...` pass environment variables required by readout to the container #### Environment Variables -To identify all required environment variables: +--- + +## Tips and Tricks + +- To identify all required environment variables: 1. Open the **ECS GUI**. 2. Go to the **Environment Details** page for the relevant task. 3. Review the variables defined there — these match those used when running the binary outside Docker. -#### Shared Memory Communication - -To enable shared memory communication between processes, add the `--ipc=host` flag when running the container. -However, doing so requires **elevated privileges**. - -While **Podman** can run without root privileges, it pauses other Podman processes for the same user. -This means commands like `podman ps -a` or starting multiple containers in parallel will not work. - -Therefore, you should run containers using the same user as the rest of the pipeline: - -```bash ---user "$(id -u flp):$(id -u flp)" -``` - -This ensures shared memory segments are created under the same user context. - ---- - -## Tips and Tricks - -* Production systems running RHEL do not install native Docker via: +- Production systems running RHEL do not install native Docker via: ```bash dnf install docker ``` - Instead, they use **Podman**, which emulates Docker’s behavior but may differ in certain aspects. + Instead, they use Podman, which emulates Docker’s behavior but may differ in certain aspects. -* To check whether ECS has started a container, run: +- To check whether ECS has started a container, run: ```bash docker ps -a @@ -107,7 +121,7 @@ This ensures shared memory segments are created under the same user context. > su - flp > ``` -* To view container logs directly from Docker: +- To view container logs directly from Docker: ```bash docker logs From 94c397fe4833f80eef6c301f88630720374e19d4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 24 Oct 2025 09:00:06 +0200 Subject: [PATCH 2218/2352] use a group name for the kafka reader otherwise, we will not get all messages among multiple partitions/replicas. --- core/integration/lhc/plugin.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/integration/lhc/plugin.go b/core/integration/lhc/plugin.go index bb4276551..1d5853d91 100644 --- a/core/integration/lhc/plugin.go +++ b/core/integration/lhc/plugin.go @@ -70,7 +70,7 @@ func (p *Plugin) Init(_ string) error { // use a background context for reader loop; Destroy will Close the reader p.ctx = context.Background() - p.reader = cmnevent.NewReaderWithTopic(dipClientTopic, "", true) + p.reader = cmnevent.NewReaderWithTopic(dipClientTopic, "o2-aliecs-core.lhc", true) if p.reader == nil { return errors.New("could not create a kafka reader for LHC plugin") From c64a5947f022bd17016d4bbbbfffbc6eecb55e53 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 29 Oct 2025 09:00:21 +0100 Subject: [PATCH 2219/2352] Rework handling failed GO_ERROR In this commit we unify the way that a failed GO_ERROR is handled. We recognize invalid event errors as harmless (ERROR->ERROR is pointless, DONE->ERROR is too late). Any other case is very much unexpected and we print a visible error and comply with the previous behaviour - setting EROR state manually. Closes OCTRL-1064. --- core/environment/environment.go | 18 ++---------- core/environment/manager.go | 28 ++++-------------- core/environment/utils.go | 26 +++++++++++++++++ core/environment/utils_test.go | 50 +++++++++++++++++++++++++++++++++ 4 files changed, 83 insertions(+), 39 deletions(-) create mode 100644 core/environment/utils_test.go diff --git a/core/environment/environment.go b/core/environment/environment.go index 34241d782..f75367461 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1232,19 +1232,8 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { NewEnvGoErrorEvent(env, newCriticalTasksErrorMessage(env)), ) err := env.TryTransition(NewGoErrorTransition(taskman)) - if err != nil { - if env.Sm.Current() == "ERROR" { - log.WithField("partition", env.id). - WithField("level", infologger.IL_Devel). - Info("skipped requested transition to ERROR: environment already in ERROR state") - } else { - log.WithField("partition", env.id). - WithError(err). - WithField("level", infologger.IL_Devel). - Warn("could not transition gently to ERROR, forcing it") - env.setState(wfState.String()) - } + handleFailedGoError(err, env) } }) break WORKFLOW_STATE_LOOP @@ -1472,10 +1461,7 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t err = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) if err != nil { - log.WithField("partition", env.id). - WithField("run", env.currentRunNumber). - Errorf("Forced transition to ERROR failed: %s", err.Error()) - env.setState("ERROR") + handleFailedGoError(err, env) } return } diff --git a/core/environment/manager.go b/core/environment/manager.go index e797f257a..5c732607e 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -496,10 +496,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman), ) if err != nil { - log.WithField("partition", env.Id().String()). - WithField("state", envState). - Debug("could not transition failed auto-transitioning environment to ERROR, cleanup in progress") - env.setState("ERROR") + handleFailedGoError(err, env) } envTasks := env.Workflow().GetTasks() @@ -603,10 +600,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman), ) if errTxErr != nil { - log.WithField("partition", env.Id().String()). - WithField("state", envState). - WithError(errTxErr). - Debug("could not transition to ERROR after failed deployment/configuration, cleanup in progress") + handleFailedGoError(errTxErr, env) } envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally @@ -1064,11 +1058,7 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve ) err = env.TryTransition(NewGoErrorTransition(envs.taskman)) if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithError(err). - Error("environment GO_ERROR transition failed after ODC_PARTITION_STATE_CHANGE ERROR event") - env.setState("ERROR") + handleFailedGoError(err, env) } } }() @@ -1124,12 +1114,7 @@ func (envs *Manager) handleLhcEvents(evt event.IntegratedServiceEvent) { if env.CurrentState() != "ERROR" { err = env.TryTransition(NewGoErrorTransition(envs.taskman)) if err != nil { - log.WithPrefix("scheduler"). - WithField("partition", envId.String()). - WithField("run", env.currentRunNumber). - WithError(err). - Error("environment GO_ERROR transition failed after a beam dump event, forcing") - env.setState("ERROR") + handleFailedGoError(err, env) } } } @@ -1483,11 +1468,8 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envs.taskman), ) if err != nil { - log.WithField("partition", env.Id().String()). - WithField("state", envState). - Debug("could not transition failed auto-transitioning environment to ERROR, cleanup in progress") + handleFailedGoError(err, env) env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "transition ERROR failed, forcing", EnvironmentID: env.Id().String(), Error: err}) - env.setState("ERROR") } envTasks := env.Workflow().GetTasks() diff --git a/core/environment/utils.go b/core/environment/utils.go index 229fde3e1..b5367d248 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -27,12 +27,14 @@ package environment import ( "bytes" "encoding/json" + "errors" "fmt" "github.com/AliceO2Group/Control/common/logger/infologger" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" + "github.com/looplab/fsm" "os" "sort" @@ -139,3 +141,27 @@ func newCriticalTasksErrorMessage(env *Environment) string { return fmt.Sprintf("%d critical tasks transitioned to ERROR, could not determine the first one to fail", len(criticalTasksInError)) } } + +func handleFailedGoError(err error, env *Environment) { + var invalidEventErr *fsm.InvalidEventError + if errors.As(err, &invalidEventErr) { + // this case can occur if the environment is in either: + // - ERROR (env already transitioned to ERROR for another reason) + // - DONE (an error might have occurred during teardown, but it's already over, no point in spreading panic) + log.WithError(invalidEventErr). + WithField("partition", env.Id().String()). + WithField("run", env.currentRunNumber). + WithField("state", env.CurrentState()). + WithField(infologger.Level, infologger.IL_Support). + Warn("did not perform GO_ERROR transition") + } else { + // in principle this should never happen, so we log it accordingly and force the ERROR state just in case + log.WithError(err). + WithField("partition", env.Id().String()). + WithField("run", env.currentRunNumber). + WithField("state", env.CurrentState()). + WithField(infologger.Level, infologger.IL_Ops). + Error("could not perform GO_ERROR transition due to unexpected error, forcing...") + env.setState("ERROR") + } +} diff --git a/core/environment/utils_test.go b/core/environment/utils_test.go new file mode 100644 index 000000000..24e205d30 --- /dev/null +++ b/core/environment/utils_test.go @@ -0,0 +1,50 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2025 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package environment + +import ( + "github.com/looplab/fsm" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("handleFailedGoError", func() { + It("does not overwrite state for InvalidEventError", func() { + env := &Environment{} + env.Sm = fsm.NewFSM("DONE", fsm.Events{}, fsm.Callbacks{}) + Expect(env.Sm.Current()).To(Equal("DONE")) + + handleFailedGoError(&fsm.InvalidEventError{Event: "GO_ERROR", State: "DONE"}, env) + Expect(env.Sm.Current()).To(Equal("DONE")) + }) + + It("overwrites state to ERROR for other errors", func() { + env := &Environment{} + env.Sm = fsm.NewFSM("CONFIGURED", fsm.Events{}, fsm.Callbacks{}) + + handleFailedGoError(fsm.UnknownEventError{Event: "BOOM"}, env) + Expect(env.Sm.Current()).To(Equal("ERROR")) + }) +}) From e3283bd7694dd6ee7504e759ed39235a5ec488f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 30 Oct 2025 14:13:09 +0100 Subject: [PATCH 2220/2352] [odc] OCTRL-1015: fill in EcsState properly --- core/integration/odc/plugin.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index a282dbddf..9311aa177 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -251,6 +251,7 @@ func (p *Plugin) queryPartitionStatus() { PartitionId: id, RunNumber: uint32(odcPartSt.Runnr), State: odcPartSt.State, + EcsState: fairmq.ToEcsState(odcPartSt.State, sm.UNKNOWN), DdsSessionId: odcPartSt.Sessionid, DdsSessionStatus: odcPartSt.Status.String(), } @@ -287,6 +288,7 @@ func (p *Plugin) queryPartitionStatus() { odcPartInfoSlice[idx].Devices[OdcDeviceId(device.Id)] = &OdcDevice{ TaskId: strconv.FormatUint(device.Id, 10), State: device.State, + EcsState: fairmq.ToEcsState(device.State, sm.UNKNOWN), Path: device.Path, Ignored: device.Ignored, Host: device.Host, From a3fd1f2538b0f8474d234cec5e2c199ab6d2acd5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 31 Oct 2025 10:01:26 +0100 Subject: [PATCH 2221/2352] fix recognizing InvalidEventError in handleFailedGoError Fixing an issue caused by the fact that I have no idea what I'm doing in Go. fsm.InvalidEventError implements Error() with a value receiver, which actually allows to provide an error as a value or as a pointer. However, errors.As() is not smart about it and does not strip the type from references/pointers/etc, so the original version would work only with errors passed as pointers. This commit modifies the helper to work correctly with errors provided as values, which is the more natural way to use it. Unfortunately it is not possible to prevent a caller from passing an error pointer. Let's consider it as a part of OCTRL-1064. --- core/environment/utils.go | 7 ++++--- core/environment/utils_test.go | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/environment/utils.go b/core/environment/utils.go index b5367d248..f05c0e3cb 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -29,14 +29,15 @@ import ( "encoding/json" "errors" "fmt" + "os" + "sort" + "github.com/AliceO2Group/Control/common/logger/infologger" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" "github.com/looplab/fsm" - "os" - "sort" "github.com/AliceO2Group/Control/core/the" "gopkg.in/yaml.v3" @@ -143,7 +144,7 @@ func newCriticalTasksErrorMessage(env *Environment) string { } func handleFailedGoError(err error, env *Environment) { - var invalidEventErr *fsm.InvalidEventError + var invalidEventErr fsm.InvalidEventError if errors.As(err, &invalidEventErr) { // this case can occur if the environment is in either: // - ERROR (env already transitioned to ERROR for another reason) diff --git a/core/environment/utils_test.go b/core/environment/utils_test.go index 24e205d30..035f361a3 100644 --- a/core/environment/utils_test.go +++ b/core/environment/utils_test.go @@ -36,7 +36,7 @@ var _ = Describe("handleFailedGoError", func() { env.Sm = fsm.NewFSM("DONE", fsm.Events{}, fsm.Callbacks{}) Expect(env.Sm.Current()).To(Equal("DONE")) - handleFailedGoError(&fsm.InvalidEventError{Event: "GO_ERROR", State: "DONE"}, env) + handleFailedGoError(fsm.InvalidEventError{Event: "GO_ERROR", State: "DONE"}, env) Expect(env.Sm.Current()).To(Equal("DONE")) }) From 5c463fa0ee650eb2e233c429d5f58d8b0aeba718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 31 Oct 2025 11:50:06 +0100 Subject: [PATCH 2222/2352] [doc] add link for EPN workflow generation --- README.md | 1 + docs/handbook/configuration.md | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 18b4c98f9..4889d30cb 100644 --- a/README.md +++ b/README.md @@ -100,6 +100,7 @@ There are two ways of interacting with AliECS: * [Task template structure](/docs/handbook/configuration.md#task-template-structure) * [Variables pushed to controlled tasks](/docs/handbook/configuration.md#variables-pushed-to-controlled-tasks) * [Resource wants and limits](/docs/handbook/configuration.md#resource-wants-and-limits) + * [EPN workflow generation](/docs/handbook/configuration.md#epn-workflow-generation) * [Integration plugins](/core/integration/README.md#integration-plugins) * [Plugin system overview](/core/integration/README.md#plugin-system-overview) * [Integrated service operations](/core/integration/README.md#integrated-service-operations) diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 798114606..637fb59a5 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -469,3 +469,9 @@ limits: defaults: (...) ``` + +## EPN workflow generation + +Workflow generation for EPNs is not the responsibility of ECS, but you can find +more details [here](https://alice-pdp-operations.docs.cern.ch/workflow/#for-the-epns). + From ae22899ee61d312a50670f9ac87c69f68b3e136a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 30 Oct 2025 15:18:17 +0100 Subject: [PATCH 2223/2352] Perform GO_ERROR after failed STOP_ACTIVITY and RESET during env destruction Even if we destroy an environment, it is good to recognize that it was not a healthy shutdown, e.g. for bookkeeping reasons. Also, we might miss out on some necessary calls to integrated services by not going to ERROR. Fixes OCTRL-1063. --- core/environment/environment.go | 4 ++-- core/environment/manager.go | 10 +++++----- core/environment/utils.go | 2 +- core/environment/utils_test.go | 6 +++--- core/server.go | 28 ++++++++++++++++++++++------ 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/core/environment/environment.go b/core/environment/environment.go index f75367461..e42620093 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1233,7 +1233,7 @@ func (env *Environment) subscribeToWfState(taskman *task.Manager) { ) err := env.TryTransition(NewGoErrorTransition(taskman)) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) } }) break WORKFLOW_STATE_LOOP @@ -1461,7 +1461,7 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t err = env.TryTransition(NewGoErrorTransition(ManagerInstance().taskman)) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) } return } diff --git a/core/environment/manager.go b/core/environment/manager.go index 5c732607e..c494e90fe 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -496,7 +496,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman), ) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) } envTasks := env.Workflow().GetTasks() @@ -600,7 +600,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] envs.taskman), ) if errTxErr != nil { - handleFailedGoError(errTxErr, env) + HandleFailedGoError(errTxErr, env) } envTasks := env.Workflow().GetTasks() // TeardownEnvironment manages the envs.mu internally @@ -1058,7 +1058,7 @@ func (envs *Manager) handleIntegratedServiceEvent(evt event.IntegratedServiceEve ) err = env.TryTransition(NewGoErrorTransition(envs.taskman)) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) } } }() @@ -1114,7 +1114,7 @@ func (envs *Manager) handleLhcEvents(evt event.IntegratedServiceEvent) { if env.CurrentState() != "ERROR" { err = env.TryTransition(NewGoErrorTransition(envs.taskman)) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) } } } @@ -1468,7 +1468,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str envs.taskman), ) if err != nil { - handleFailedGoError(err, env) + HandleFailedGoError(err, env) env.sendEnvironmentEvent(&event.EnvironmentEvent{Message: "transition ERROR failed, forcing", EnvironmentID: env.Id().String(), Error: err}) } diff --git a/core/environment/utils.go b/core/environment/utils.go index f05c0e3cb..1ca0dcad3 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -143,7 +143,7 @@ func newCriticalTasksErrorMessage(env *Environment) string { } } -func handleFailedGoError(err error, env *Environment) { +func HandleFailedGoError(err error, env *Environment) { var invalidEventErr fsm.InvalidEventError if errors.As(err, &invalidEventErr) { // this case can occur if the environment is in either: diff --git a/core/environment/utils_test.go b/core/environment/utils_test.go index 035f361a3..bf914be83 100644 --- a/core/environment/utils_test.go +++ b/core/environment/utils_test.go @@ -30,13 +30,13 @@ import ( . "github.com/onsi/gomega" ) -var _ = Describe("handleFailedGoError", func() { +var _ = Describe("HandleFailedGoError", func() { It("does not overwrite state for InvalidEventError", func() { env := &Environment{} env.Sm = fsm.NewFSM("DONE", fsm.Events{}, fsm.Callbacks{}) Expect(env.Sm.Current()).To(Equal("DONE")) - handleFailedGoError(fsm.InvalidEventError{Event: "GO_ERROR", State: "DONE"}, env) + HandleFailedGoError(fsm.InvalidEventError{Event: "GO_ERROR", State: "DONE"}, env) Expect(env.Sm.Current()).To(Equal("DONE")) }) @@ -44,7 +44,7 @@ var _ = Describe("handleFailedGoError", func() { env := &Environment{} env.Sm = fsm.NewFSM("CONFIGURED", fsm.Events{}, fsm.Callbacks{}) - handleFailedGoError(fsm.UnknownEventError{Event: "BOOM"}, env) + HandleFailedGoError(fsm.UnknownEventError{Event: "BOOM"}, env) Expect(env.Sm.Current()).To(Equal("ERROR")) }) }) diff --git a/core/server.go b/core/server.go index 86bacb288..b6e50b816 100644 --- a/core/server.go +++ b/core/server.go @@ -718,10 +718,18 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir } if req.AllowInRunningState && env.CurrentState() == "RUNNING" { - err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_STOP_ACTIVITY)) + err = env.TryTransition(environment.NewStopActivityTransition(m.state.taskman)) if err != nil { - log.WithField("partition", env.Id().String()). - Warn("could not perform STOP transition for environment teardown, forcing") + log.WithError(err). + WithField("partition", env.Id().String()). + Warn("could not perform STOP transition for environment teardown, going to ERROR, then forcing") + the.EventWriterWithTopic(topic.Environment).WriteEvent( + environment.NewEnvGoErrorEvent(env, "STOP_ACTIVITY during environment destruction failed"), + ) + err = env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) + if err != nil { + environment.HandleFailedGoError(err, env) + } reply, err = m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) return } @@ -746,10 +754,18 @@ func (m *RpcServer) DestroyEnvironment(cxt context.Context, req *pb.DestroyEnvir // This might transition to STANDBY if needed, or do nothing if we're already there if env.CurrentState() == "CONFIGURED" { - err = env.TryTransition(environment.MakeTransition(m.state.taskman, pb.ControlEnvironmentRequest_RESET)) + err = env.TryTransition(environment.NewResetTransition(m.state.taskman)) if err != nil { - log.WithField("partition", env.Id().String()). - Warnf("cannot teardown environment in state %s, forcing", env.CurrentState()) + log.WithError(err). + WithField("partition", env.Id().String()). + Warnf("cannot teardown environment in state %s, going to ERROR, then forcing", env.CurrentState()) + the.EventWriterWithTopic(topic.Environment).WriteEvent( + environment.NewEnvGoErrorEvent(env, "RESET during environment destruction failed"), + ) + err = env.TryTransition(environment.NewGoErrorTransition(m.state.taskman)) + if err != nil { + environment.HandleFailedGoError(err, env) + } reply, err = m.doTeardownAndCleanup(env, true /*force*/, false /*keepTasks*/) return } From e17af39151f6be3c56ad872d80058167ee40d00b Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 3 Nov 2025 09:15:50 +0100 Subject: [PATCH 2224/2352] Add missing step in patch release process --- docs/development.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/development.md b/docs/development.md index 20247acc7..b9c189841 100644 --- a/docs/development.md +++ b/docs/development.md @@ -24,6 +24,7 @@ Bugs go to [JIRA](https://its.cern.ch/jira/projects/OCTRL/issues). * Checkout the tag which the patch release should be based on, e.g. `git checkout v1.34.0` * Create a branch called `branch_`, e.g. `git checkout -b branch_v1.34.1`. + * Cherry-pick desired commits 3. Bump `VERSION` file, commit, push (or pull request). 4. Go to a [new GitHub release draft](https://github.com/AliceO2Group/Control/releases/new). Use "Generate release notes" to create a list of changes. Write a short summary at the top. From 6a97d97dc9eb28e52f778b0674769b71c359edb3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 3 Nov 2025 09:41:08 +0100 Subject: [PATCH 2225/2352] Fix unexpected operator build error on POSIX shells '==' comparison operator is only supported by Bash, while '=' is supported by both Bash and standard POSIX shells. --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 58184a101..f59740768 100644 --- a/Makefile +++ b/Makefile @@ -127,7 +127,7 @@ $(WHAT): validate-go-version @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ # special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script - @if [ $@ == "o2-aliecs-executor" ]; then \ + @if [ $@ = "o2-aliecs-executor" ]; then \ echo -e "\033[1;33mcopy\033[0m ./o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m./bin/o2-aliecs-shmcleaner\033[0m"; \ cp o2-aliecs-shmcleaner bin/o2-aliecs-shmcleaner; \ chmod +x bin/o2-aliecs-shmcleaner; \ @@ -140,7 +140,7 @@ $(INSTALL_WHAT): validate-go-version @$(WHAT_$(@:install_%=%)_BUILD_FLAGS) go install -mod=vendor $(VERBOSE_$(V)) $(LDFLAGS) ./cmd/$(@:install_%=%) # special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script - @if [ $@ == "install_o2-aliecs-executor" ]; then \ + @if [ $@ = "install_o2-aliecs-executor" ]; then \ echo -e "\033[1;33minstall\033[0m ./o2-aliecs-shmcleaner \033[1;33m==>\033[0m \033[1;34m$$GOPATH/bin/o2-aliecs-shmcleaner\033[0m"; \ cp o2-aliecs-shmcleaner $${GOPATH}/bin/o2-aliecs-shmcleaner; \ chmod +x $${GOPATH}/bin/o2-aliecs-shmcleaner; \ From 20f3a9313cedac8346792eabdd72ab0d921e37a4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 4 Nov 2025 12:05:30 +0100 Subject: [PATCH 2226/2352] Set special users before automatic run stops A minimal, but not comprehensive addition for OCTRL-1065. --- common/protos/common.pb.go | 138 ++++++++++++++++++++++---------- common/protos/common.proto | 9 +++ common/protos/protoutils.go | 14 ++++ core/environment/environment.go | 1 + core/environment/manager.go | 1 + 5 files changed, 122 insertions(+), 41 deletions(-) diff --git a/common/protos/common.pb.go b/common/protos/common.pb.go index 5ea0cc482..ce7796310 100644 --- a/common/protos/common.pb.go +++ b/common/protos/common.pb.go @@ -43,6 +43,58 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Production and staging BKP recognizes these special user IDs. +// They are used to associate certain actions (e.g. EOR) with certain subsystem +// or AliECS component rather than a human user. +type SpecialUserId int32 + +const ( + SpecialUserId_INVALID SpecialUserId = 0 + SpecialUserId_LHC SpecialUserId = 60 + SpecialUserId_TIMER SpecialUserId = 65 +) + +// Enum value maps for SpecialUserId. +var ( + SpecialUserId_name = map[int32]string{ + 0: "INVALID", + 60: "LHC", + 65: "TIMER", + } + SpecialUserId_value = map[string]int32{ + "INVALID": 0, + "LHC": 60, + "TIMER": 65, + } +) + +func (x SpecialUserId) Enum() *SpecialUserId { + p := new(SpecialUserId) + *p = x + return p +} + +func (x SpecialUserId) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SpecialUserId) Descriptor() protoreflect.EnumDescriptor { + return file_protos_common_proto_enumTypes[0].Descriptor() +} + +func (SpecialUserId) Type() protoreflect.EnumType { + return &file_protos_common_proto_enumTypes[0] +} + +func (x SpecialUserId) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SpecialUserId.Descriptor instead. +func (SpecialUserId) EnumDescriptor() ([]byte, []int) { + return file_protos_common_proto_rawDescGZIP(), []int{0} +} + // * // Beam modes as defined and sent by LHC DIP client plus: // * virtual type LOST_BEAMS - that is generated when beam 1 and beam 2 energy values are not equal anymore as per LHC DIP track: dip/acc/LHC/RunControl/SafeBeam @@ -138,11 +190,11 @@ func (x BeamMode) String() string { } func (BeamMode) Descriptor() protoreflect.EnumDescriptor { - return file_protos_common_proto_enumTypes[0].Descriptor() + return file_protos_common_proto_enumTypes[1].Descriptor() } func (BeamMode) Type() protoreflect.EnumType { - return &file_protos_common_proto_enumTypes[0] + return &file_protos_common_proto_enumTypes[1] } func (x BeamMode) Number() protoreflect.EnumNumber { @@ -151,7 +203,7 @@ func (x BeamMode) Number() protoreflect.EnumNumber { // Deprecated: Use BeamMode.Descriptor instead. func (BeamMode) EnumDescriptor() ([]byte, []int) { - return file_protos_common_proto_rawDescGZIP(), []int{0} + return file_protos_common_proto_rawDescGZIP(), []int{1} } type User struct { @@ -414,37 +466,40 @@ var file_protos_common_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x2a, 0x80, 0x03, 0x0a, - 0x08, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, - 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x45, 0x54, 0x55, 0x50, 0x10, - 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, - 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x42, 0x45, 0x5f, - 0x42, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x04, - 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x48, - 0x59, 0x53, 0x49, 0x43, 0x53, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, - 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x06, 0x12, 0x08, - 0x0a, 0x04, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4c, 0x41, 0x54, - 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x51, 0x55, 0x45, 0x45, 0x5a, - 0x45, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x10, 0x0a, 0x12, - 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, - 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, - 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, - 0x41, 0x4d, 0x53, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, - 0x4d, 0x50, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x0e, 0x12, 0x0d, 0x0a, 0x09, - 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x0f, 0x12, 0x0d, 0x0a, 0x09, 0x52, - 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x59, - 0x43, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x59, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x5f, - 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x13, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x49, - 0x52, 0x43, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, - 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x15, 0x42, - 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, 0x63, 0x65, - 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, - 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x64, 0x65, 0x52, 0x08, 0x62, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x2a, 0x30, 0x0a, 0x0d, + 0x53, 0x70, 0x65, 0x63, 0x69, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x0b, 0x0a, + 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x48, + 0x43, 0x10, 0x3c, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x49, 0x4d, 0x45, 0x52, 0x10, 0x41, 0x2a, 0x80, + 0x03, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x6d, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, + 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x45, 0x54, 0x55, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x02, 0x12, 0x18, + 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x42, + 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x4a, 0x45, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x55, 0x50, 0x5f, 0x42, 0x45, 0x41, 0x4d, + 0x10, 0x04, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4e, 0x4a, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x50, 0x48, 0x59, 0x53, 0x49, 0x43, 0x53, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, 0x05, 0x12, 0x10, + 0x0a, 0x0c, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x45, 0x5f, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x06, + 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x4d, 0x50, 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x4c, + 0x41, 0x54, 0x5f, 0x54, 0x4f, 0x50, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x51, 0x55, 0x45, + 0x45, 0x5a, 0x45, 0x10, 0x09, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x4a, 0x55, 0x53, 0x54, 0x10, + 0x0a, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x42, 0x45, 0x41, 0x4d, + 0x53, 0x10, 0x0b, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x53, 0x54, 0x5f, 0x42, 0x45, 0x41, 0x4d, + 0x53, 0x10, 0x0c, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x5f, + 0x42, 0x45, 0x41, 0x4d, 0x53, 0x10, 0x0d, 0x12, 0x15, 0x0a, 0x11, 0x42, 0x45, 0x41, 0x4d, 0x5f, + 0x44, 0x55, 0x4d, 0x50, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x0e, 0x12, 0x0d, + 0x0a, 0x09, 0x42, 0x45, 0x41, 0x4d, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x0f, 0x12, 0x0d, 0x0a, + 0x09, 0x52, 0x41, 0x4d, 0x50, 0x5f, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, + 0x43, 0x59, 0x43, 0x4c, 0x49, 0x4e, 0x47, 0x10, 0x11, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, + 0x4f, 0x56, 0x45, 0x52, 0x59, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x4a, 0x45, 0x43, + 0x54, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, 0x4d, 0x50, 0x10, 0x13, 0x12, 0x16, 0x0a, 0x12, + 0x43, 0x49, 0x52, 0x43, 0x55, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x44, 0x55, + 0x4d, 0x50, 0x10, 0x14, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x42, 0x45, 0x41, 0x4d, 0x10, + 0x15, 0x42, 0x53, 0x0a, 0x1f, 0x63, 0x68, 0x2e, 0x63, 0x65, 0x72, 0x6e, 0x2e, 0x61, 0x6c, 0x69, + 0x63, 0x65, 0x2e, 0x6f, 0x32, 0x2e, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x5a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x41, 0x6c, 0x69, 0x63, 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -459,16 +514,17 @@ func file_protos_common_proto_rawDescGZIP() []byte { return file_protos_common_proto_rawDescData } -var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_protos_common_proto_enumTypes = make([]protoimpl.EnumInfo, 2) var file_protos_common_proto_msgTypes = make([]protoimpl.MessageInfo, 3) var file_protos_common_proto_goTypes = []interface{}{ - (BeamMode)(0), // 0: common.BeamMode - (*User)(nil), // 1: common.User - (*WorkflowTemplateInfo)(nil), // 2: common.WorkflowTemplateInfo - (*BeamInfo)(nil), // 3: common.BeamInfo + (SpecialUserId)(0), // 0: common.SpecialUserId + (BeamMode)(0), // 1: common.BeamMode + (*User)(nil), // 2: common.User + (*WorkflowTemplateInfo)(nil), // 3: common.WorkflowTemplateInfo + (*BeamInfo)(nil), // 4: common.BeamInfo } var file_protos_common_proto_depIdxs = []int32{ - 0, // 0: common.BeamInfo.beamMode:type_name -> common.BeamMode + 1, // 0: common.BeamInfo.beamMode:type_name -> common.BeamMode 1, // [1:1] is the sub-list for method output_type 1, // [1:1] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name @@ -525,7 +581,7 @@ func file_protos_common_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protos_common_proto_rawDesc, - NumEnums: 1, + NumEnums: 2, NumMessages: 3, NumExtensions: 0, NumServices: 0, diff --git a/common/protos/common.proto b/common/protos/common.proto index f367be9e4..1942c36e2 100644 --- a/common/protos/common.proto +++ b/common/protos/common.proto @@ -40,6 +40,15 @@ message User { string name = 3; } +// Production and staging BKP recognizes these special user IDs. +// They are used to associate certain actions (e.g. EOR) with certain subsystem +// or AliECS component rather than a human user. +enum SpecialUserId { + INVALID = 0; + LHC = 60; + TIMER = 65; +} + message WorkflowTemplateInfo { string name = 1; string description = 2; diff --git a/common/protos/protoutils.go b/common/protos/protoutils.go index e0a009de5..5d3a43d82 100644 --- a/common/protos/protoutils.go +++ b/common/protos/protoutils.go @@ -34,3 +34,17 @@ func WrapEvent(ce isEvent_Payload) *Event { Payload: ce, } } + +// SpecialUser returns a User populated from a SpecialUserId enum: +// - externalId = enum numeric value +// - id = enum numeric value +// - name = enum string name +func SpecialUser(enumId SpecialUserId) *User { + externalId := int32(enumId) + name := enumId.String() + return &User{ + ExternalId: &externalId, + Id: nil, + Name: name, + } +} diff --git a/core/environment/environment.go b/core/environment/environment.go index e42620093..fcdac227e 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1449,6 +1449,7 @@ func (env *Environment) scheduleAutoStopTransition() (scheduled bool, expected t log.WithField("partition", env.id). WithField("run", env.currentRunNumber). Infof("Executing scheduled auto stop transition following expiration of %s", autoStopDuration) + env.SetLastRequestUser(pb.SpecialUser(pb.SpecialUserId_TIMER)) err = env.TryTransition(NewStopActivityTransition(ManagerInstance().taskman)) if err != nil { log.WithField("partition", env.id). diff --git a/core/environment/manager.go b/core/environment/manager.go index c494e90fe..33ad5c098 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -1103,6 +1103,7 @@ func (envs *Manager) handleLhcEvents(evt event.IntegratedServiceEvent) { WithField("run", env.currentRunNumber). Info("stopping the run due to beam dump") + env.SetLastRequestUser(evpb.SpecialUser(evpb.SpecialUserId_LHC)) err := env.TryTransition(NewStopActivityTransition(envs.taskman)) if err != nil { log.WithPrefix("scheduler"). From fee4e3416ac778156d02b0a42f98287c2a20cb10 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 6 Nov 2025 09:59:07 +0100 Subject: [PATCH 2227/2352] Add a copilot guidelines for avoiding unobvious abbreviations and acronyms --- .github/copilot-instructions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index afa8b0e12..fb7011437 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -14,4 +14,5 @@ It is a distributed system that combines state of the art cluster resource manag - Do not include modified go.mod and go.sum files in your commits unless you are adding or upgrading a dependency. - When adding features or fixing bugs, add a corresponding unit test if feasible. Use Ginkgo/Gomega, unless a package already uses a different testing framework. - When adding a new feature, extend the documentation accordingly, follow the existing style and structure, and make sure that Tables of Contents are updated. See [Documentation guidelines](docs/CONTRIBUTING.md#documentation-guidelines) for some more details. -- When providing a fix, explain what was causing the issue and how it was fixed. \ No newline at end of file +- When providing a fix, explain what was causing the issue and how it was fixed. +- Avoid using abbreviations and acronyms for variable and function names. They are acceptable if they are commonly used in a given domain, such as "cfg" for "configura +++tion" or "LHC" for "Large Hadron Collider". From 365efca584f1722b0406d077b8b23f5c28e6e20d Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 10 Nov 2025 10:51:50 +0100 Subject: [PATCH 2228/2352] Improvements in logging failures of auto-environments - Environment failure is reported as an Error, not Warn - we simplify "MesosCommand_Transition timed out for task 2xhyfnmHttq" to "Transition timed out", so the full error is more readable. For examplewq "Transition canceled with error: CONFIGURE could not complete for critical tasks, errors: task 'readout' on alio2-cr1-mvs03 (id 2y3E83DDK6E) failed with error: Transition timed out; task 'stfb' on alio2-cr1-mvs03 (id 2y3E83DDeaA) failed with error: Transition timed out; task 'stfs' on alio2-cr1-mvs03 (id 2y3E83DDz46) failed with error: Transition timed out" Closes OCTRL-1059. --- core/controlcommands/mesoscommandservent.go | 4 +++- core/environment/manager.go | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/controlcommands/mesoscommandservent.go b/core/controlcommands/mesoscommandservent.go index 2185eea2e..4eded55eb 100644 --- a/core/controlcommands/mesoscommandservent.go +++ b/core/controlcommands/mesoscommandservent.go @@ -26,6 +26,7 @@ package controlcommands import ( "fmt" + "strings" "sync" "time" @@ -144,7 +145,8 @@ func (s *Servent) RunCommand(cmd MesosCommand, receiver MesosCommandTarget) (Mes // By the time we get here, ProcessResponse should have already added a Response to the // pending call, and removed it from servent.pending. case <-time.After(cmd.GetResponseTimeout()): - call.Error = fmt.Errorf("%s timed out for task %s", cmd.GetName(), receiver.TaskId.Value) + userFriendlyCommandName, _ := strings.CutPrefix(cmd.GetName(), "MesosCommand_") + call.Error = fmt.Errorf("%s timed out", userFriendlyCommandName) log.WithPrefix("servent"). WithField("partition", cmd.GetEnvironmentId().String()). diff --git a/core/environment/manager.go b/core/environment/manager.go index 33ad5c098..8546bd0c9 100644 --- a/core/environment/manager.go +++ b/core/environment/manager.go @@ -487,7 +487,7 @@ func (envs *Manager) CreateEnvironment(workflowPath string, userVars map[string] log.WithField("state", envState). WithField("partition", env.Id().String()). WithError(err). - Warnf("auto-transitioning environment failed %s, cleanup in progress", op) + Errorf("auto-transitioning environment failed %s, cleanup in progress", op) the.EventWriterWithTopic(topic.Environment).WriteEvent( NewEnvGoErrorEvent(env, fmt.Sprintf("%s failed: %v", op, err)), @@ -1460,7 +1460,7 @@ func (envs *Manager) CreateAutoEnvironment(workflowPath string, userVars map[str log.WithField("state", envState). WithField("partition", env.Id().String()). WithError(err). - Warnf("auto-transitioning environment failed %s, cleanup in progress", op) + Errorf("auto-transitioning environment failed %s, cleanup in progress", op) the.EventWriterWithTopic(topic.Environment).WriteEvent( NewEnvGoErrorEvent(env, fmt.Sprintf("%s failed: %v", op, err)), From 9258177dfa85fca41b7d4175a66d431fe4f015a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 31 Oct 2025 09:53:48 +0100 Subject: [PATCH 2229/2352] [monitoring] Refactor monitoring so Send doesn't have to wait until library is running --- common/monitoring/monitoring.go | 77 +++++++++++++++------------- common/monitoring/monitoring_test.go | 18 ++----- core/core.go | 5 ++ 3 files changed, 51 insertions(+), 49 deletions(-) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index 91dbd417f..f64339bdb 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -42,50 +42,38 @@ var ( // atomic holder for the HTTP server instance server atomic.Pointer[http.Server] // objects to store incoming metrics - metricsInternal *MetricsAggregate - metricsHistogramInternal *MetricsReservoirSampling + metricsInternal *MetricsAggregate = NewMetricsAggregate() + metricsHistogramInternal *MetricsReservoirSampling = NewMetricsReservoirSampling() // channel that is used to request end of metrics server, it sends notification when server ended. // It needs to be read!!! - endChannel chan struct{} + endChannel chan struct{} = make(chan struct{}) // channel used to send metrics into the event loop - metricsChannel chan Metric + // 100000 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if + // multiple goroutines want to send metrics without blocking each other + metricsChannel chan Metric = make(chan Metric, 100000) // channel used to send metrics meant to be proceesed as histogram into the event loop - metricsHistosChannel chan Metric + // 100000 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if + // multiple goroutines want to send metrics without blocking each other + metricsHistosChannel chan Metric = make(chan Metric, 100000) // channel for sending requests to reset actual metrics slice and send it back to caller via metricsExportedToRequest - metricsRequestedChannel chan struct{} + metricsRequestedChannel chan struct{} = make(chan struct{}) // channel used to send metrics to be reported by http request from event loop - metricsExportedToRequest chan []Metric + metricsExportedToRequest chan []Metric = make(chan []Metric) - log = logger.New(logrus.StandardLogger(), "metrics").WithField("level", infologger.IL_Devel) -) - -func initChannels() { - endChannel = make(chan struct{}) - metricsRequestedChannel = make(chan struct{}) - // 100 was chosen arbitrarily as a number that seemed sensible to be high enough to provide nice buffer if - // multiple goroutines want to send metrics without blocking each other - metricsChannel = make(chan Metric, 100000) - metricsHistosChannel = make(chan Metric, 100000) - metricsExportedToRequest = make(chan []Metric) - metricsInternal = NewMetricsAggregate() - metricsHistogramInternal = NewMetricsReservoirSampling() -} + // WaitUntilRunning is waiting until this channel is closed + waitUntilRunningChannel chan struct{} = make(chan struct{}) -func closeChannels() { - close(endChannel) - close(metricsRequestedChannel) - close(metricsChannel) - close(metricsExportedToRequest) -} + log = logger.New(logrus.StandardLogger(), "metrics").WithField(infologger.Level, infologger.IL_Devel) +) // this eventLoop is the main part that processes all metrics send to the package // 4 events can happen: -// 1. metricsChannel receives message from Send() method. We just add the new metric to metrics slice -// 2. metricsHistosChannel receives message from Send() method. We just add the new metric to metrics slice +// 1. metricsChannel receives message from Send() method. We add the new metric to metrics slice +// 2. metricsHistosChannel receives message from Send() method. We add the new metric to metrics slice // 3. metricsRequestChannel receives request to dump and request existing metrics. We send shallow copy of existing // metrics to requestor (via metricsExportedToRequest channel) while resetting current metrics slice // 4. receive request to stop monitoring via endChannel. We send confirmation through endChannel to notify caller @@ -130,14 +118,18 @@ func exportMetricsAndReset(w http.ResponseWriter, r *http.Request) { } func Send(metric *Metric) { - if IsRunning() { - metricsChannel <- *metric + // drop overflowing messages to not slowdown processing, we don't log so we don't flood IL + select { + case metricsChannel <- *metric: + default: } } func SendHistogrammable(metric *Metric) { - if IsRunning() { - metricsHistosChannel <- *metric + // drop overflowing messages to not slowdown processing, we don't log so we don't flood IL + select { + case metricsHistosChannel <- *metric: + default: } } @@ -160,10 +152,10 @@ func Run(port uint16, endpointName string) error { if !server.CompareAndSwap(nil, localServer) { return nil } - initChannels() go eventLoop() handleFunc(endpointName) // block until Shutdown is called + close(waitUntilRunningChannel) return localServer.ListenAndServe() } @@ -176,9 +168,22 @@ func Stop() { defer cancel() localServer.Shutdown(ctx) endChannel <- struct{}{} + _, ok := <-waitUntilRunningChannel + if !ok { + waitUntilRunningChannel = make(chan struct{}) + } <-endChannel } -func IsRunning() bool { - return server.Load() != nil +// If monitoring is not running it will wait until monitoring is running or +// timeout is triggered. +// \return true if monitoring is running, false if timeout occured +func WaitUntilRunning(timeout time.Duration) bool { + timeoutChan := time.After(timeout) + select { + case <-waitUntilRunningChannel: + return true + case <-timeoutChan: + return false + } } diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index b0da38435..dd98cf6b8 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -40,16 +40,8 @@ import ( // blocks until either IsRunning() returns true or timeout is triggered func isRunningWithTimeout(t *testing.T, timeout time.Duration) { - timeoutChan := time.After(timeout) - for !IsRunning() { - select { - case <-timeoutChan: - t.Errorf("Monitoring is not running even after %v", timeout) - return - - default: - time.Sleep(10 * time.Millisecond) - } + if !WaitUntilRunning(timeout) { + t.Errorf("Failed to init monitoring library in %v", timeout) } } @@ -126,7 +118,7 @@ func TestHttpRun(t *testing.T) { go Run(9876, "/metrics") defer Stop() - isRunningWithTimeout(t, time.Second) + isRunningWithTimeout(t, 5*time.Second) metric := Metric{name: "test"} metric.timestamp = time.Unix(10, 0) @@ -140,12 +132,12 @@ func TestHttpRun(t *testing.T) { } message, err := io.ReadAll(response.Body) if err != nil { - t.Errorf("Failed to read response Body: %v", err) + t.Fatalf("Failed to read response Body: %v", err) } receivedMetrics, err := parseMultipleLineProtocol(string(message)) if err != nil { - t.Errorf("Failed to parse message: %v", string(message)) + t.Fatalf("Failed to parse message: %v with err: %v", string(message), err) } receivedMetric := receivedMetrics[0] diff --git a/core/core.go b/core/core.go index 6919cb45c..f2370f11b 100644 --- a/core/core.go +++ b/core/core.go @@ -90,6 +90,11 @@ func runMetrics() { } }() + monitoringTimeout := 30 * time.Second + if !monitoring.WaitUntilRunning(monitoringTimeout) { + log.WithField(infologger.Level, infologger.IL_Devel).Warnf("Failed to initialize monitoring framework in %v, it might catch up later. For now we are starting without metrics", monitoringTimeout) + } + golangmetrics.Start(10 * time.Second) } From 39494636ed2f327de1cf40bbd7aba27a591282de Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 6 Nov 2025 09:52:13 +0100 Subject: [PATCH 2230/2352] Drain backlog LHC events and load current fill info upon startup When AliECS core starts, We are not interested in old events except of the latest, so we know the current beam conditions. This works will allow us to get rid of BKP.RetrieveFillInfo() and have a corresponding update call in the LHC plugin. Closes OCTRL-1067. --- common/event/reader.go | 151 +++++++++++++++++++++++++-------- core/integration/lhc/plugin.go | 74 +++++++++++++--- 2 files changed, 176 insertions(+), 49 deletions(-) diff --git a/common/event/reader.go b/common/event/reader.go index 0b348cafc..f163e692e 100644 --- a/common/event/reader.go +++ b/common/event/reader.go @@ -27,44 +27,42 @@ package event import ( "context" "fmt" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger/infologger" pb "github.com/AliceO2Group/Control/common/protos" "github.com/segmentio/kafka-go" "github.com/spf13/viper" "google.golang.org/protobuf/proto" - "sync" ) // Reader interface provides methods to read events. type Reader interface { + // Next should return the next event or cancel if the context is cancelled. Next(ctx context.Context) (*pb.Event, error) + // Last should return the last available event currently present on the topic (or nil if none) + // or cancel if the context is cancelled. + Last(ctx context.Context) (*pb.Event, error) Close() error } // DummyReader is an implementation of Reader that returns no events. type DummyReader struct{} -// Next returns the next event or nil if there are no more events. func (*DummyReader) Next(context.Context) (*pb.Event, error) { return nil, nil } - -// Close closes the DummyReader. -func (*DummyReader) Close() error { return nil } +func (*DummyReader) Last(context.Context) (*pb.Event, error) { return nil, nil } +func (*DummyReader) Close() error { return nil } // KafkaReader reads events from Kafka and provides a blocking, cancellable API to fetch events. -// Consumption mode is chosen at creation time: -// - latestOnly=false: consume everything (from stored offsets or beginning depending on group state) -// - latestOnly=true: seek to latest offsets on start and only receive messages produced after start type KafkaReader struct { *kafka.Reader - mu sync.Mutex - topic string + topic string + brokers []string + groupID string } // NewReaderWithTopic creates a KafkaReader for the provided topic and starts it. -// If latestOnly is true the reader attempts to seek to the latest offsets on start so that -// only new messages (produced after creation) are consumed. -func NewReaderWithTopic(topic topic.Topic, groupID string, latestOnly bool) *KafkaReader { +func NewReaderWithTopic(topic topic.Topic, groupID string) *KafkaReader { cfg := kafka.ReaderConfig{ Brokers: viper.GetStringSlice("kafkaEndpoints"), Topic: string(topic), @@ -74,39 +72,72 @@ func NewReaderWithTopic(topic topic.Topic, groupID string, latestOnly bool) *Kaf } rk := &KafkaReader{ - Reader: kafka.NewReader(cfg), - topic: string(topic), - } - - if latestOnly { - // best-effort: set offset to last so we don't replay older messages - if err := rk.SetOffset(kafka.LastOffset); err != nil { - log.WithField(infologger.Level, infologger.IL_Devel). - Warnf("failed to set offset to last offset: %v", err) - } + Reader: kafka.NewReader(cfg), + topic: string(topic), + brokers: append([]string{}, cfg.Brokers...), + groupID: groupID, } - return rk } -// Next blocks until the next event is available or ctx is cancelled. It returns an error when the reader is closed -// (io.EOF) or the context is cancelled. The caller is responsible for providing a cancellable ctx. +// Next blocks until the next event is available or ctx is cancelled. func (r *KafkaReader) Next(ctx context.Context) (*pb.Event, error) { if r == nil { return nil, fmt.Errorf("nil reader") } - msg, err := r.ReadMessage(ctx) if err != nil { return nil, err } + return kafkaMessageToEvent(msg) +} - event, err := kafkaMessageToEvent(msg) +// Last fetches the last available message on the topic (considering all partitions). +// If multiple partitions have data, the event with the greatest message timestamp is returned. +func (r *KafkaReader) Last(ctx context.Context) (*pb.Event, error) { + if r == nil { + return nil, fmt.Errorf("nil reader") + } + partitions, err := r.readPartitions() if err != nil { return nil, err } - - return event, nil + var latestEvt *pb.Event + var latestEvtTimeNs int64 + for _, p := range partitions { + if p.Topic != r.topic { + continue + } + first, last, err := r.readFirstAndLast(p.ID) + if err != nil { + log.WithField(infologger.Level, infologger.IL_Devel).WithError(err). + Warnf("failed to read offsets for %s[%d]", r.topic, p.ID) + continue + } + if last <= first { + continue + } + msg, err := r.readAtOffset(ctx, p.ID, last-1) + if err != nil { + log.WithError(err). + WithField(infologger.Level, infologger.IL_Devel). + Warnf("failed to read last message for %s[%d] at offset %d", r.topic, p.ID, last-1) + continue + } + evt, err := kafkaMessageToEvent(msg) + if err != nil { + log.WithError(err). + WithField(infologger.Level, infologger.IL_Devel). + Warnf("failed to decode last message for %s[%d]", r.topic, p.ID) + continue + } + currentEvtTimeNs := msg.Time.UnixNano() + if latestEvt == nil || currentEvtTimeNs > latestEvtTimeNs { + latestEvt = evt + latestEvtTimeNs = currentEvtTimeNs + } + } + return latestEvt, nil } // Close stops the reader. @@ -114,13 +145,7 @@ func (r *KafkaReader) Close() error { if r == nil { return nil } - // Close the underlying kafka reader which will cause ReadMessage to return an error - err := r.Reader.Close() - if err != nil { - log.WithField(infologger.Level, infologger.IL_Devel). - Errorf("failed to close kafka reader: %v", err) - } - return err + return r.Reader.Close() } func kafkaMessageToEvent(m kafka.Message) (*pb.Event, error) { @@ -130,3 +155,55 @@ func kafkaMessageToEvent(m kafka.Message) (*pb.Event, error) { } return &evt, nil } + +func (r *KafkaReader) brokerAddr() (string, error) { + if len(r.brokers) == 0 { + return "", fmt.Errorf("no kafka brokers configured") + } + return r.brokers[0], nil +} + +func (r *KafkaReader) readPartitions() ([]kafka.Partition, error) { + addr, err := r.brokerAddr() + if err != nil { + return nil, err + } + conn, err := kafka.Dial("tcp", addr) + if err != nil { + return nil, err + } + defer conn.Close() + return conn.ReadPartitions(r.topic) +} + +func (r *KafkaReader) readFirstAndLast(partition int) (int64, int64, error) { + addr, err := r.brokerAddr() + if err != nil { + return 0, 0, err + } + conn, err := kafka.DialLeader(context.Background(), "tcp", addr, r.topic, partition) + if err != nil { + return 0, 0, err + } + defer conn.Close() + first, last, err := conn.ReadOffsets() + return first, last, err +} + +func (r *KafkaReader) readAtOffset(ctx context.Context, partition int, offset int64) (kafka.Message, error) { + if offset < 0 { + return kafka.Message{}, fmt.Errorf("invalid offset %d", offset) + } + kr := kafka.NewReader(kafka.ReaderConfig{ + Brokers: append([]string{}, r.brokers...), + Topic: r.topic, + Partition: partition, + MinBytes: 1, + MaxBytes: 10e6, + }) + defer kr.Close() + if err := kr.SetOffset(offset); err != nil { + return kafka.Message{}, err + } + return kr.ReadMessage(ctx) +} diff --git a/core/integration/lhc/plugin.go b/core/integration/lhc/plugin.go index 1d5853d91..28cbcc74e 100644 --- a/core/integration/lhc/plugin.go +++ b/core/integration/lhc/plugin.go @@ -28,16 +28,16 @@ import ( "context" "encoding/json" "errors" - "github.com/AliceO2Group/Control/common/event/topic" - "github.com/AliceO2Group/Control/common/logger/infologger" - pb "github.com/AliceO2Group/Control/common/protos" "io" "strings" "sync" "time" cmnevent "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/event/topic" "github.com/AliceO2Group/Control/common/logger" + "github.com/AliceO2Group/Control/common/logger/infologger" + pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/common/utils/uid" "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" @@ -51,10 +51,8 @@ var dipClientTopic topic.Topic = "dip.lhc.beam_mode" // Plugin implements integration.Plugin and listens for LHC updates. type Plugin struct { - endpoint string - ctx context.Context - //cancel context.CancelFunc - //wg sync.WaitGroup + endpoint string + ctx context.Context mu sync.Mutex currentState *pb.BeamInfo reader cmnevent.Reader @@ -66,21 +64,73 @@ func NewPlugin(endpoint string) integration.Plugin { } func (p *Plugin) Init(_ string) error { - // use a background context for reader loop; Destroy will Close the reader p.ctx = context.Background() - p.reader = cmnevent.NewReaderWithTopic(dipClientTopic, "o2-aliecs-core.lhc", true) - + p.reader = cmnevent.NewReaderWithTopic(dipClientTopic, "o2-aliecs-core.lhc") if p.reader == nil { return errors.New("could not create a kafka reader for LHC plugin") } - go p.readAndInjectLhcUpdates() - log.Debug("LHC plugin initialized (client started)") + // Always perform a short pre-drain to consume any backlog without injecting. + log.WithField(infologger.Level, infologger.IL_Devel). + Info("LHC plugin: draining any initial backlog") + p.drainBacklog(2 * time.Second) + + // If state is still empty, try reading the latest message once. + p.mu.Lock() + empty := p.currentState == nil || p.currentState.BeamMode == pb.BeamMode_UNKNOWN + p.mu.Unlock() + if empty { + if last, err := p.reader.Last(p.ctx); err != nil { + log.WithField(infologger.Level, infologger.IL_Support).WithError(err).Warn("failed to read last LHC state on init") + } else if last != nil { + if bmEvt := last.GetBeamModeEvent(); bmEvt != nil && bmEvt.GetBeamInfo() != nil { + p.mu.Lock() + p.currentState = bmEvt.GetBeamInfo() + p.mu.Unlock() + } + } else { + // nothing to retrieve in the topic, we move on + } + } + + go p.readAndInjectLhcUpdates() + log.WithField(infologger.Level, infologger.IL_Devel).Debug("LHC plugin initialized (client started)") return nil } +// drainBacklog reads messages for a limited time and only updates the plugin state, without injecting to env manager. +func (p *Plugin) drainBacklog(timeout time.Duration) { + drainCtx, cancel := context.WithTimeout(p.ctx, timeout) + defer cancel() + for { + msg, err := p.reader.Next(drainCtx) + if err != nil { + if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, io.EOF) || errors.Is(err, context.Canceled) { + break + } + // transient error: small sleep and continue until timeout + time.Sleep(50 * time.Millisecond) + continue + } + if msg == nil { + continue + } + if beamModeEvent := msg.GetBeamModeEvent(); beamModeEvent != nil && beamModeEvent.GetBeamInfo() != nil { + beamInfo := beamModeEvent.GetBeamInfo() + log.WithField(infologger.Level, infologger.IL_Devel). + Debugf("new LHC update received while draining backlog: BeamMode=%s, FillNumber=%d, FillingScheme=%s, StableBeamsStart=%d, StableBeamsEnd=%d, BeamType=%s", + beamInfo.GetBeamMode().String(), beamInfo.GetFillNumber(), beamInfo.GetFillingSchemeName(), + beamInfo.GetStableBeamsStart(), beamInfo.GetStableBeamsEnd(), beamInfo.GetBeamType()) + + p.mu.Lock() + p.currentState = beamModeEvent.GetBeamInfo() + p.mu.Unlock() + } + } +} + func (p *Plugin) GetName() string { return "lhc" } func (p *Plugin) GetPrettyName() string { return "LHC (DIP/Kafka client)" } func (p *Plugin) GetEndpoint() string { From 87f06096b21cab233f71311e48828631ad27a1d5 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 3 Nov 2025 14:44:21 +0100 Subject: [PATCH 2231/2352] Migrate fill info retrieval to the new LHC plugin This commit adds a new call in LHC plugin which updates a given environment with the latest known fill information. Once we validate it, we can proceed with switching off the bkp.RetrieveFillInfo() call. A necessary change in workflow template will have to follow. This approach is better, because we don't rely on a man in the middle, thus reduce risks of errors and getting the required info too late (i.e. not before SOR). Closes OCTRL-1057 --- core/environment/transition_startactivity.go | 1 - core/integration/lhc/plugin.go | 96 +++++++++++++++++++- docs/handbook/operation_order.md | 3 +- 3 files changed, 96 insertions(+), 4 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 86f13cbad..21c6ec9ec 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -81,7 +81,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { // Get a handle to the consolidated var stack of the root role of the env's workflow if wf := env.Workflow(); wf != nil { if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { - // If bookkeeping is enabled and has fetched the LHC fill info, we can acquire it here for _, key := range []string{ "fill_info_fill_number", "fill_info_filling_scheme", diff --git a/core/integration/lhc/plugin.go b/core/integration/lhc/plugin.go index 28cbcc74e..ed9f01e25 100644 --- a/core/integration/lhc/plugin.go +++ b/core/integration/lhc/plugin.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "io" + "strconv" "strings" "sync" "time" @@ -42,6 +43,7 @@ import ( "github.com/AliceO2Group/Control/core/environment" "github.com/AliceO2Group/Control/core/integration" lhcevent "github.com/AliceO2Group/Control/core/integration/lhc/event" + "github.com/AliceO2Group/Control/core/workflow/callable" "github.com/sirupsen/logrus" "github.com/spf13/viper" ) @@ -175,8 +177,18 @@ func (p *Plugin) GetEnvironmentsShortData(envIds []uid.ID) map[uid.ID]string { func (p *Plugin) ObjectStack(_ map[string]string, _ map[string]string) (stack map[string]interface{}) { return make(map[string]interface{}) } -func (p *Plugin) CallStack(_ interface{}) (stack map[string]interface{}) { - return make(map[string]interface{}) +func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { + call, ok := data.(*callable.Call) + if !ok { + return + } + + stack = make(map[string]interface{}) + stack["UpdateFillInfo"] = func() (out string) { + p.updateFillInfo(call) + return + } + return } func (p *Plugin) Destroy() error { @@ -248,3 +260,83 @@ func (p *Plugin) readAndInjectLhcUpdates() { } } } + +// UpdateFillInfo: propagate latest LHC fill info into the environment's global runtime vars +func (p *Plugin) updateFillInfo(call *callable.Call) (out string) { + varStack := call.VarStack + envId, ok := varStack["environment_id"] + if !ok { + err := errors.New("cannot acquire environment ID") + log.Error(err) + + call.VarStack["__call_error_reason"] = err.Error() + call.VarStack["__call_error"] = "LHC plugin Call Stack failed" + return + } + + log := log.WithFields(logrus.Fields{ + "partition": envId, + "call": "UpdateFillInfo", + }) + + parentRole, ok := call.GetParentRole().(callable.ParentRole) + if !ok || parentRole == nil { + log.WithField(infologger.Level, infologger.IL_Support). + Error("cannot access parent role to propagate LHC fill info") + return + } + + if p.currentState == nil { + log.WithField(infologger.Level, infologger.IL_Support). + Warn("attempted to update environment with fill info, but fill info is not available in plugin") + return + } + + // note: the following was causing very weird behaviours, which could be attributed to memory corruption. + // I did not manage to understand why can't we safely clone such a proto message. + // state := proto.Clone(p.currentState).(*pb.BeamInfo) + + p.mu.Lock() + defer p.mu.Unlock() + state := p.currentState + + parentRole.SetGlobalRuntimeVar("fill_info_beam_mode", state.BeamMode.String()) + + // If NO_BEAM, clear all other fill info and return + if state.BeamMode == pb.BeamMode_NO_BEAM { + parentRole.DeleteGlobalRuntimeVar("fill_info_fill_number") + parentRole.DeleteGlobalRuntimeVar("fill_info_filling_scheme") + parentRole.DeleteGlobalRuntimeVar("fill_info_beam_type") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") + + log.WithField(infologger.Level, infologger.IL_Devel). + Debug("NO_BEAM — cleared fill info vars and set beam mode only") + return + } + + // Otherwise, propagate latest known info + parentRole.SetGlobalRuntimeVar("fill_info_fill_number", strconv.FormatInt(int64(state.FillNumber), 10)) + parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", state.FillingSchemeName) + parentRole.SetGlobalRuntimeVar("fill_info_beam_type", state.BeamType) + if state.StableBeamsStart > 0 { + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(state.StableBeamsStart, 10)) + } else { + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") + } + if state.StableBeamsEnd > 0 { + parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(state.StableBeamsEnd, 10)) + } else { + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") + } + + log.WithField("fillNumber", state.FillNumber). + WithField("fillingScheme", state.FillingSchemeName). + WithField("beamType", state.BeamType). + WithField("beamMode", state.BeamMode). + WithField("stableStartMs", state.StableBeamsStart). + WithField("stableEndMs", state.StableBeamsEnd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("updated environment fill info from latest snapshot") + return +} diff --git a/docs/handbook/operation_order.md b/docs/handbook/operation_order.md index cd81e77ee..7f1ef830d 100644 --- a/docs/handbook/operation_order.md +++ b/docs/handbook/operation_order.md @@ -32,11 +32,11 @@ This is the order of actions happening at a healthy start of run. - `before_START_ACTIVITY` hooks with negative weights are executed: - `trg.PrepareForRun()` at `-200` + - `lhc.UpdateFillInfo()` at `-50` - `"run_number"` is set. - `"run_start_time_ms"` is set using the current time. It is considered as the SOR and SOSOR timestamps. - `before_START_ACTIVITY` hooks with positive weights (incl. 0) are executed: - `trg.RunLoad()`, `bookkeeping.StartOfRun()` at `10` - - `bookkeeping.RetrieveFillInfo()` at `11` - `kafka.PublishStartActivityUpdate()` at `50` - `dcs.StartOfRun()`, `odc.Start()` (does not need to return now), `ccdb.RunStart()` at `100` @@ -72,6 +72,7 @@ This is the order of actions happening at a healthy end of run. ### before_STOP_ACTIVITY - `before_STOP_ACTIVITY` hooks with negative weights are executed + - `lhc.UpdateFillInfo()` at `-50` - `trg.RunStop()` at `-10` - `"run_end_time_ms"` is set using the current time. It is considered as the EOR and SOEOR timestamps. - `before_STOP_ACTIVITY` hooks with positive weights (incl. 0) are executed: From 832ed65b64adc263c76c1526a3987fe130b6621d Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 20 Nov 2025 16:48:09 +0100 Subject: [PATCH 2232/2352] Rename stable_beam to stable_beams Initially, we followed some naming convention from BKP, keeping the singular "beam". Luckily, we moved to more conventional "beams" upstream and luckily no device is using yet the SB timestamp variables, so we are good to rename them. --- core/environment/transition_startactivity.go | 4 ++-- core/integration/bookkeeping/plugin.go | 8 ++++---- core/integration/lhc/plugin.go | 12 ++++++------ docs/handbook/configuration.md | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 21c6ec9ec..8361bed21 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -85,8 +85,8 @@ func (t StartActivityTransition) do(env *Environment) (err error) { "fill_info_fill_number", "fill_info_filling_scheme", "fill_info_beam_type", - "fill_info_stable_beam_start_ms", - "fill_info_stable_beam_end_ms", + "fill_info_stable_beams_start_ms", + "fill_info_stable_beams_end_ms", "run_type", "run_start_time_ms", "run_end_time_ms", // included to ensure that a cleared SOEOR timestamp is propagated to all tasks during START-STOP-START diff --git a/core/integration/bookkeeping/plugin.go b/core/integration/bookkeeping/plugin.go index 476fdb1be..49344a7af 100644 --- a/core/integration/bookkeeping/plugin.go +++ b/core/integration/bookkeeping/plugin.go @@ -1446,10 +1446,10 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", lhcInfo.FillingSchemeName) parentRole.SetGlobalRuntimeVar("fill_info_beam_type", lhcInfo.BeamType) if lhcInfo.StableBeamsStart != nil { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(*lhcInfo.StableBeamsStart, 10)) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beams_start_ms", strconv.FormatInt(*lhcInfo.StableBeamsStart, 10)) } if lhcInfo.StableBeamsEnd != nil { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(*lhcInfo.StableBeamsEnd, 10)) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beams_end_ms", strconv.FormatInt(*lhcInfo.StableBeamsEnd, 10)) } log.WithField("partition", envId). WithField("level", infologger.IL_Devel). @@ -1471,8 +1471,8 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { parentRole.DeleteGlobalRuntimeVar("fill_info_fill_number") parentRole.DeleteGlobalRuntimeVar("fill_info_filling_scheme") parentRole.DeleteGlobalRuntimeVar("fill_info_beam_type") - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_start_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_end_ms") } stack["RetrieveFillInfo"] = func() (out string) { diff --git a/core/integration/lhc/plugin.go b/core/integration/lhc/plugin.go index ed9f01e25..d29177c6a 100644 --- a/core/integration/lhc/plugin.go +++ b/core/integration/lhc/plugin.go @@ -307,8 +307,8 @@ func (p *Plugin) updateFillInfo(call *callable.Call) (out string) { parentRole.DeleteGlobalRuntimeVar("fill_info_fill_number") parentRole.DeleteGlobalRuntimeVar("fill_info_filling_scheme") parentRole.DeleteGlobalRuntimeVar("fill_info_beam_type") - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_start_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_end_ms") log.WithField(infologger.Level, infologger.IL_Devel). Debug("NO_BEAM — cleared fill info vars and set beam mode only") @@ -320,14 +320,14 @@ func (p *Plugin) updateFillInfo(call *callable.Call) (out string) { parentRole.SetGlobalRuntimeVar("fill_info_filling_scheme", state.FillingSchemeName) parentRole.SetGlobalRuntimeVar("fill_info_beam_type", state.BeamType) if state.StableBeamsStart > 0 { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_start_ms", strconv.FormatInt(state.StableBeamsStart, 10)) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beams_start_ms", strconv.FormatInt(state.StableBeamsStart, 10)) } else { - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_start_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_start_ms") } if state.StableBeamsEnd > 0 { - parentRole.SetGlobalRuntimeVar("fill_info_stable_beam_end_ms", strconv.FormatInt(state.StableBeamsEnd, 10)) + parentRole.SetGlobalRuntimeVar("fill_info_stable_beams_end_ms", strconv.FormatInt(state.StableBeamsEnd, 10)) } else { - parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beam_end_ms") + parentRole.DeleteGlobalRuntimeVar("fill_info_stable_beams_end_ms") } log.WithField("fillNumber", state.FillNumber). diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 637fb59a5..9cf18ee59 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -428,16 +428,16 @@ In addition to the above, which varies depending on the configuration of the env * `fill_info_fill_number` * `fill_info_filling_scheme` * `fill_info_beam_type` - * `fill_info_stable_beam_start_ms` - * `fill_info_stable_beam_end_ms` + * `fill_info_stable_beams_start_ms` + * `fill_info_stable_beams_end_ms` * `run_type` * `run_start_time_ms` * `lhc_period` * `fillInfoFillNumber` * `fillInfoFillingScheme` * `fillInfoBeamType` - * `fillInfoStableBeamStartMs` - * `fillInfoStableBeamEndMs` + * `fillInfoStableBeamsStartMs` + * `fillInfoStableBeamsEndMs` * `runType` * `runStartTimeMs` * `lhcPeriod` From 4ed69a71ed0548fc8016cacab750fc54df995b33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Jun 2025 21:22:50 +0000 Subject: [PATCH 2233/2352] Bump github.com/cloudflare/circl from 1.3.7 to 1.6.1 Bumps [github.com/cloudflare/circl](https://github.com/cloudflare/circl) from 1.3.7 to 1.6.1. - [Release notes](https://github.com/cloudflare/circl/releases) - [Commits](https://github.com/cloudflare/circl/compare/v1.3.7...v1.6.1) --- updated-dependencies: - dependency-name: github.com/cloudflare/circl dependency-version: 1.6.1 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 9 ++------- go.sum | 32 +++----------------------------- 2 files changed, 5 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 5cf831e29..3021f600c 100644 --- a/go.mod +++ b/go.mod @@ -21,7 +21,6 @@ replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.16 replace github.com/armon/go-metrics => github.com/hashicorp/go-metrics v0.5.3 require ( - github.com/AlecAivazis/survey/v2 v2.3.7 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -58,7 +57,6 @@ require ( github.com/spf13/viper v1.18.2 github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 - github.com/xeipuuv/gojsonschema v1.2.0 github.com/xlab/treeprint v1.2.0 golang.org/x/crypto v0.36.0 golang.org/x/net v0.38.0 @@ -76,6 +74,7 @@ require ( github.com/gogo/protobuf v1.3.2 github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 + github.com/influxdata/line-protocol/v2 v2.2.1 github.com/onsi/ginkgo/v2 v2.19.0 github.com/onsi/gomega v1.34.1 github.com/swaggo/http-swagger/v2 v2.0.2 @@ -89,7 +88,7 @@ require ( github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cloudflare/circl v1.3.7 // indirect + github.com/cloudflare/circl v1.6.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/emirpasic/gods v1.18.1 // indirect @@ -118,11 +117,9 @@ require ( github.com/huandu/xstrings v1.4.0 // indirect github.com/imdario/mergo v0.3.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/influxdata/line-protocol/v2 v2.2.1 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.7 // indirect github.com/kylelemons/godebug v1.1.0 // indirect @@ -162,8 +159,6 @@ require ( github.com/urfave/cli/v2 v2.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect - github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect - github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.23.0 // indirect golang.org/x/sync v0.12.0 // indirect diff --git a/go.sum b/go.sum index e63fcbbfc..88615a5d8 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= -github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= -github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= @@ -15,8 +13,6 @@ github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuN github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63nhn5WAunQHLTznkw5W8b1Xc0dNjp83s= -github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -42,15 +38,13 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= -github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= +github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= +github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/creack/pty v1.1.17 h1:QeVUsEDNrLBW4tMgZHvxy18sKtr6VI492kBhUfhDJNI= -github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -59,8 +53,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMSRhl4D7AQ= github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= -github.com/dmarkham/enumer v1.5.8 h1:fIF11F9l5jyD++YYvxcSH5WgHfeaSGPaN/T4kOQ4qEM= -github.com/dmarkham/enumer v1.5.8/go.mod h1:d10o8R3t/gROm2p3BXqTkMt2+HMuxEmWCXzorAruYak= github.com/dmarkham/enumer v1.5.11 h1:quorLCaEfzjJ23Pf7PB9lyyaHseh91YfTM/sAD/4Mbo= github.com/dmarkham/enumer v1.5.11/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8= github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= @@ -195,8 +187,6 @@ github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY= github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= -github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/huandu/xstrings v1.4.0 h1:D17IlohoQq4UcpqD7fDk80P7l+lwAmlFaBHgOipl2FU= github.com/huandu/xstrings v1.4.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= @@ -206,6 +196,7 @@ github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+h github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= +github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= github.com/influxdata/line-protocol/v2 v2.0.0-20210312151457-c52fdecb625a/go.mod h1:6+9Xt5Sq1rWx+glMgxhcg2c0DUaehK+5TDcPZ76GypY= github.com/influxdata/line-protocol/v2 v2.1.0/go.mod h1:QKw43hdUBg3GTk2iC3iyCxksNj7PX9aUSeYOYE/ceHY= @@ -224,8 +215,6 @@ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQ github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40= github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -255,7 +244,6 @@ github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3v github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -276,7 +264,6 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= -github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -416,7 +403,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= @@ -449,13 +435,6 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo= -github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -479,8 +458,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8= -golang.org/x/mod v0.19.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -558,7 +535,6 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -573,8 +549,6 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.23.0 h1:SGsXPZ+2l4JsgaCKkx+FQ9YZ5XEtA1GZYuoDjenLjvg= -golang.org/x/tools v0.23.0/go.mod h1:pnu6ufv6vQkll6szChhK3C3L/ruaIv5eBeztNG8wtsI= golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 61479b7e9bddcad03e50e0b597a4fd5918352e00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 21 Nov 2025 14:48:51 +0100 Subject: [PATCH 2234/2352] [monitoring] fixed cleaning of monitoring buffers after Stop --- common/monitoring/monitoring.go | 2 ++ common/monitoring/monitoring_test.go | 53 ++++++++++++++++++---------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/common/monitoring/monitoring.go b/common/monitoring/monitoring.go index f64339bdb..ed22df9da 100644 --- a/common/monitoring/monitoring.go +++ b/common/monitoring/monitoring.go @@ -172,6 +172,8 @@ func Stop() { if !ok { waitUntilRunningChannel = make(chan struct{}) } + metricsInternal.Clear() + metricsHistogramInternal.Clear() <-endChannel } diff --git a/common/monitoring/monitoring_test.go b/common/monitoring/monitoring_test.go index dd98cf6b8..2facaf146 100644 --- a/common/monitoring/monitoring_test.go +++ b/common/monitoring/monitoring_test.go @@ -79,17 +79,24 @@ func testFunction(t *testing.T, testToRun func(*testing.T)) { isRunningWithTimeout(t, time.Second) testToRun(t) Stop() + + if len(metricsInternal.GetMetrics()) != 0 { + t.Fatal("didn't clear metrics properly after tests") + } + if len(metricsHistogramInternal.GetMetrics()) != 0 { + t.Fatal("didn't clear histo metrics properly after tests") + } } func TestSendingSingleMetric(t *testing.T) { testFunction(t, func(t *testing.T) { - metric := &Metric{name: "test"} + metric := &Metric{name: "testsinglemetric"} Send(metric) hasNumberOfMetrics(t, time.Second, 1) aggregatedMetrics := metricsInternal.GetMetrics() - if aggregatedMetrics[0].name != "test" { + if aggregatedMetrics[0].name != "testsinglemetric" { t.Errorf("Got wrong name %s in stored metric", aggregatedMetrics[0].name) } }) @@ -97,7 +104,7 @@ func TestSendingSingleMetric(t *testing.T) { func TestExportingMetrics(t *testing.T) { testFunction(t, func(t *testing.T) { - metric := &Metric{name: "test"} + metric := &Metric{name: "testexporting"} Send(metric) hasNumberOfMetrics(t, time.Second, 1) @@ -105,28 +112,36 @@ func TestExportingMetrics(t *testing.T) { metricsToExport := <-metricsExportedToRequest if len(metricsToExport) != 1 { - t.Errorf("Got wrong amount of metrics %d, expected 1", len(metricsToExport)) + t.Fatalf("Got wrong amount of metrics %d, expected 1", len(metricsToExport)) } - if metricsToExport[0].name != "test" { - t.Errorf("Got wrong name of metric %s, expected test", metricsToExport[0].name) + if metricsToExport[0].name != "testexporting" { + t.Fatalf("Got wrong name of metric %s, expected testexporting", metricsToExport[0].name) } }) } func TestHttpRun(t *testing.T) { - go Run(9876, "/metrics") + port := uint16(9876) + endpoint := "/metrics" + go Run(port, endpoint) defer Stop() isRunningWithTimeout(t, 5*time.Second) - metric := Metric{name: "test"} - metric.timestamp = time.Unix(10, 0) - metric.AddTag("tag1", "42") - metric.SetFieldInt64("value1", 11) + sendAndTestMetric(t, port, endpoint, "testhttprun1", time.Unix(10, 0), "tag1", "42", "value1", 11) + sendAndTestMetric(t, port, endpoint, "testhttprun2", time.Unix(11, 0), "tag2", "43", "value2", 12) + sendAndTestMetric(t, port, endpoint, "testhttprun3", time.Unix(12, 0), "tag3", "44", "value3", 13) + sendAndTestMetric(t, port, endpoint, "testhttprun4", time.Unix(13, 0), "tag4", "45", "value4", 14) +} + +func sendAndTestMetric(t *testing.T, port uint16, endpoint string, metricName string, timestamp time.Time, tagName string, tagVal string, fieldName string, fieldVal int64) { + metric := Metric{name: metricName, timestamp: timestamp} + metric.AddTag(tagName, tagVal) + metric.SetFieldInt64(fieldName, fieldVal) Send(&metric) - response, err := http.Get("http://localhost:9876/metrics") + response, err := http.Get(fmt.Sprintf("http://localhost:%d%s", port, endpoint)) if err != nil { t.Fatalf("Failed to GET metrics at port 9876: %v", err) } @@ -142,19 +157,19 @@ func TestHttpRun(t *testing.T) { receivedMetric := receivedMetrics[0] - if receivedMetric.Name != "test" { - t.Errorf("Got wrong name of metric %s, expected test", receivedMetric.Name) + if receivedMetric.Name != metricName { + t.Errorf("Got wrong name of metric %s, expected %s", receivedMetric.Name, metricName) } - if receivedMetric.Timestamp != time.Unix(10, 0).UnixNano() { - t.Errorf("Got wrong timestamp of metric %d, expected 10", receivedMetric.Timestamp) + if receivedMetric.Timestamp != timestamp.UnixNano() { + t.Errorf("Got wrong timestamp of metric %d, expected %v", receivedMetric.Timestamp, timestamp.UnixNano()) } if len(receivedMetric.Tags) != 1 { t.Errorf("Got wrong number of tags %d, expected 1", len(receivedMetric.Tags)) } - if receivedMetric.Tags["tag1"] != "42" { + if receivedMetric.Tags[tagName] != tagVal { t.Errorf("Failed to retreive tags: tag1 with value 42, %+v", receivedMetric.Tags) } @@ -162,8 +177,8 @@ func TestHttpRun(t *testing.T) { t.Errorf("Got wrong number of values %d, expected 1", len(receivedMetric.Fields)) } - if receivedMetric.Fields["value1"] != "11i" { - t.Errorf("Failed to retreive tags: value1 with value 11: %+v", receivedMetric.Fields) + if receivedMetric.Fields[fieldName] != fmt.Sprintf("%di", fieldVal) { + t.Errorf("Failed to retreive tags: %s with value %d: %+v", fieldName, fieldVal, receivedMetric.Fields) } } From d0a4e706a9e62bddded93a230c2901982564cfc5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Nov 2025 11:06:54 +0000 Subject: [PATCH 2235/2352] Bump golang.org/x/crypto from 0.36.0 to 0.45.0 Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.36.0 to 0.45.0. - [Commits](https://github.com/golang/crypto/compare/v0.36.0...v0.45.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.45.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 16 ++++++++-------- go.sum | 32 ++++++++++++++++---------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index 3021f600c..1fd24d1c8 100644 --- a/go.mod +++ b/go.mod @@ -58,9 +58,9 @@ require ( github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.36.0 - golang.org/x/net v0.38.0 - golang.org/x/sys v0.31.0 + golang.org/x/crypto v0.45.0 + golang.org/x/net v0.47.0 + golang.org/x/sys v0.38.0 google.golang.org/grpc v1.62.1 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.34.1 @@ -160,11 +160,11 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.23.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect - golang.org/x/tools v0.30.0 // indirect + golang.org/x/mod v0.29.0 // indirect + golang.org/x/sync v0.18.0 // indirect + golang.org/x/term v0.37.0 // indirect + golang.org/x/text v0.31.0 // indirect + golang.org/x/tools v0.38.0 // indirect google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect diff --git a/go.sum b/go.sum index 88615a5d8..a23533be8 100644 --- a/go.sum +++ b/go.sum @@ -450,16 +450,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= -golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -474,8 +474,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.38.0 h1:vRMAPTMaeGqVhG5QyLJHqNDwecKTomGeqbnfZyKlBI8= -golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -484,8 +484,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -519,16 +519,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -539,8 +539,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -549,8 +549,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY= -golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From d9ccf544d4f98312b3429258b6096486ed43cec3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 20 Nov 2025 16:57:23 +0100 Subject: [PATCH 2236/2352] Standardize properties sent to AliECS- and ODC-controlled tasks We define a common list of parameter keys sent to AliECS- and ODC-controlled tasks and facilitate adding new ones. At the same time, we extend the lists to include some more fill information. --- core/environment/transition_startactivity.go | 31 ++++++++------- core/environment/transition_stopactivity.go | 22 ++++++++--- core/integration/odc/plugin.go | 40 +++++++------------- docs/handbook/configuration.md | 18 ++++----- 4 files changed, 57 insertions(+), 54 deletions(-) diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index 8361bed21..be7ec03c6 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -38,6 +38,22 @@ import ( "github.com/iancoleman/strcase" ) +var StartActivityParameterKeys = []string{ + "fill_info_fill_number", + "fill_info_filling_scheme", + "fill_info_beam_type", + "fill_info_stable_beams_start_ms", + "fill_info_stable_beams_end_ms", + "run_number", + "run_type", + "run_start_time_ms", + "run_end_time_ms", // included to ensure that a cleared SOEOR timestamp is propagated to all tasks during START-STOP-START + "lhc_period", + "pdp_beam_type", + "pdp_override_run_start_time", + "original_run_number", +} + func NewStartActivityTransition(taskman *task.Manager) Transition { return &StartActivityTransition{ baseTransition: baseTransition{ @@ -81,20 +97,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { // Get a handle to the consolidated var stack of the root role of the env's workflow if wf := env.Workflow(); wf != nil { if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { - for _, key := range []string{ - "fill_info_fill_number", - "fill_info_filling_scheme", - "fill_info_beam_type", - "fill_info_stable_beams_start_ms", - "fill_info_stable_beams_end_ms", - "run_type", - "run_start_time_ms", - "run_end_time_ms", // included to ensure that a cleared SOEOR timestamp is propagated to all tasks during START-STOP-START - "lhc_period", - "pdp_beam_type", - "pdp_override_run_start_time", - "original_run_number", - } { + for _, key := range StartActivityParameterKeys { if value, ok := cvs[key]; ok { // we push the above parameters with both camelCase and snake_case identifiers for convenience args[strcase.ToLowerCamel(key)] = value diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 1533c68fe..8653302e1 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -36,6 +36,15 @@ import ( "github.com/iancoleman/strcase" ) +var StopActivityParameterKeys = []string{ + "fill_info_fill_number", + "fill_info_filling_scheme", + "fill_info_beam_type", + "fill_info_stable_beams_start_ms", + "fill_info_stable_beams_end_ms", + "run_end_time_ms", +} + func NewStopActivityTransition(taskman *task.Manager) Transition { return &StopActivityTransition{ baseTransition: baseTransition{ @@ -64,11 +73,14 @@ func (t StopActivityTransition) do(env *Environment) (err error) { // Get a handle to the consolidated var stack of the root role of the env's workflow if wf := env.Workflow(); wf != nil { if cvs, cvsErr := wf.ConsolidatedVarStack(); cvsErr == nil { - - // Propagate run end time to all tasks - if value, ok := cvs["run_end_time_ms"]; ok { - args[strcase.ToLowerCamel("run_end_time_ms")] = value - args["run_end_time_ms"] = value + // in principle, only stable beams end should change among fill info vars in a typical scenario, + // but just in case of more creative uses, we push all of them again. + for _, key := range StopActivityParameterKeys { + if value, ok := cvs[key]; ok { + // we push the above parameters with both camelCase and snake_case identifiers for convenience + args[strcase.ToLowerCamel(key)] = value + args[key] = value + } } } } diff --git a/core/integration/odc/plugin.go b/core/integration/odc/plugin.go index 9311aa177..1a9a9d261 100644 --- a/core/integration/odc/plugin.go +++ b/core/integration/odc/plugin.go @@ -1439,19 +1439,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { WithField("call", "Start"). Warn("cannot acquire run number for ODC") } - originalRunNumber, _ := varStack["original_run_number"] cleanupCountS, ok := varStack["__fmq_cleanup_count"] if !ok { log.WithField("partition", envId). WithField("call", "Start"). Warn("cannot acquire FairMQ devices cleanup count for ODC") } - runStartTimeMs, ok := varStack["run_start_time_ms"] - if !ok { - log.WithField("partition", envId). - WithField("call", "Start"). - Warn("cannot acquire run_start_time_ms") - } var ( runNumberu64 uint64 @@ -1478,12 +1471,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { timeout := callable.AcquireTimeout(ODC_START_TIMEOUT, varStack, "Start", envId) arguments := make(map[string]string) - arguments["run_number"] = rn arguments["runNumber"] = rn - arguments["run_start_time_ms"] = runStartTimeMs arguments["cleanup"] = strconv.Itoa(cleanupCount) - if len(originalRunNumber) > 0 { - arguments["original_run_number"] = originalRunNumber + for _, key := range environment.StartActivityParameterKeys { + if value, ok := varStack[key]; ok { + arguments[key] = value + } } ctx, cancel := integration.NewContext(envId, varStack, timeout) @@ -1522,15 +1515,13 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for ODC EOR") runNumberu64 = 0 } - runEndTimeMs, ok := varStack["run_end_time_ms"] - if !ok { - log.WithField("partition", envId). - WithField("call", "Stop"). - Warn("cannot acquire run_end_time_ms") - } arguments := make(map[string]string) - arguments["run_end_time_ms"] = runEndTimeMs + for _, key := range environment.StopActivityParameterKeys { + if value, ok := varStack[key]; ok { + arguments[key] = value + } + } timeout := callable.AcquireTimeout(ODC_STOP_TIMEOUT, varStack, "Stop", envId) @@ -1594,15 +1585,12 @@ func (p *Plugin) CallStack(data interface{}) (stack map[string]interface{}) { Error("cannot acquire run number for ODC EOR") runNumberu64 = 0 } - runEndTimeMs, ok := varStack["run_end_time_ms"] - if !ok { - log.WithField("partition", envId). - WithField("call", "EnsureStop"). - Warn("cannot acquire run_end_time_ms") - } - arguments := make(map[string]string) - arguments["run_end_time_ms"] = runEndTimeMs + for _, key := range environment.StopActivityParameterKeys { + if value, ok := varStack[key]; ok { + arguments[key] = value + } + } err = handleStop(ctx, p.odcClient, arguments, paddingTimeout, envId, runNumberu64, call) if err != nil { diff --git a/docs/handbook/configuration.md b/docs/handbook/configuration.md index 9cf18ee59..6acb3370e 100644 --- a/docs/handbook/configuration.md +++ b/docs/handbook/configuration.md @@ -424,7 +424,7 @@ Depending on the specification in the task template (`command.env`, `command.arg In addition to the above, which varies depending on the configuration of the environment itself as well as on the configuration of the system as a whole, some special values are pushed by AliECS itself during `START_ACTIVITY`: - * `runNumber` + * `run_number` * `fill_info_fill_number` * `fill_info_filling_scheme` * `fill_info_beam_type` @@ -432,22 +432,22 @@ In addition to the above, which varies depending on the configuration of the env * `fill_info_stable_beams_end_ms` * `run_type` * `run_start_time_ms` + * `run_end_time_ms` (as an empty value) * `lhc_period` - * `fillInfoFillNumber` - * `fillInfoFillingScheme` - * `fillInfoBeamType` - * `fillInfoStableBeamsStartMs` - * `fillInfoStableBeamsEndMs` - * `runType` - * `runStartTimeMs` - * `lhcPeriod` * `pdp_beam_type` * `pdp_override_run_start_time` * `original_run_number` +For AliECS-controlled tasks, the same values are additionally pushed with keys in camelCase format. + The following values are pushed by AliECS during `STOP_ACTIVITY`: * `run_end_time_ms` + * `fill_info_fill_number` + * `fill_info_filling_scheme` + * `fill_info_beam_type` + * `fill_info_stable_beam_start_ms` + * `fill_info_stable_beam_end_ms` FairMQ task implementors should expect that these values are written to the FairMQ properties map right before the `RUN` and `STOP` transitions via `SetProperty` calls. From 01ab88e40ebaa808a77f006effa62bb723cb1576 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 21 Nov 2025 10:59:27 +0100 Subject: [PATCH 2237/2352] Continue all remaining jobs in make check if one fails Given that our checks are rather lightweight, it's useful to avoid cancelling other jobs in the matrix if one fails. This way we can recognize if an issue is platform-specific or is intermittent. --- .github/workflows/control.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 57de4f793..5ad85275a 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -11,6 +11,7 @@ jobs: name: Basic Make Check runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [macOS-latest, ubuntu-24.04] go: [ '1.24.2' ] From 241a1b5e6cdd3881706a627824ab79ef99271866 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 21 Nov 2025 11:21:53 +0100 Subject: [PATCH 2238/2352] Send the same properties upon run error as for heathly stop Closes OCTRL-1070. --- core/environment/transition_goerror.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/core/environment/transition_goerror.go b/core/environment/transition_goerror.go index 6b59d85f7..c8adb14e2 100644 --- a/core/environment/transition_goerror.go +++ b/core/environment/transition_goerror.go @@ -25,6 +25,7 @@ package environment import ( + "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" ) @@ -50,12 +51,21 @@ func (t GoErrorTransition) do(env *Environment) (err error) { return t.IsSafeToStop() }) if len(toStop) > 0 { + args := controlcommands.PropertyMap{} + if cvs, err := env.Workflow().ConsolidatedVarStack(); err == nil { + for _, key := range StopActivityParameterKeys { + if value, ok := cvs[key]; ok { + args[key] = value + } + } + } + taskmanMessage := task.NewTransitionTaskMessage( toStop, sm.RUNNING.String(), sm.STOP.String(), sm.CONFIGURED.String(), - nil, + args, env.Id(), ) t.taskman.MessageChannel <- taskmanMessage From adffc9fa562032998b2aea7eb699d77aa2fea976 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 4 Dec 2025 10:47:07 +0100 Subject: [PATCH 2239/2352] Bump to v1.46.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 5b07e409f..fffb89137 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 45 +VERSION_MINOR := 46 VERSION_PATCH := 0 From 2a48ae79f3febb78d6dae80fd08b0b2e4b9d35a8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Dec 2025 11:05:04 +0100 Subject: [PATCH 2240/2352] increase task startup timeout until O2-6547 is fixed Tasks take longer to start up due to performance regression in ROOT reported at https://github.com/root-project/root/issues/20673 We increase the startup timeout until the issue is resolved. --- executor/executorcmd/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 2fa55c0b6..738a7e521 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -52,7 +52,7 @@ const ( ProtobufTransport = ControlTransport(0) JsonTransport = ControlTransport(1) ) -const GRPC_DIAL_TIMEOUT = 30 * time.Second +const GRPC_DIAL_TIMEOUT = 45 * time.Second func NewClient( controlPort uint64, From 8eb67558844c097b1ba72b03f38c2fa1efc18885 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Dec 2025 11:25:09 +0100 Subject: [PATCH 2241/2352] Bump to v1.46.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index fffb89137..6a9804ddb 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 46 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From 94c600440d8de50ea0c957985f50fd0e235b80db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 10 Dec 2025 15:55:01 +0100 Subject: [PATCH 2242/2352] [core] part of OCTRL-1076, fixing leaked logging goroutines --- executor/executable/basictaskcommon.go | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 166270962..014d640ba 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -28,12 +28,13 @@ import ( "bytes" "encoding/json" "errors" - "github.com/AliceO2Group/Control/common/utils" "io" "os/exec" "syscall" "time" + "github.com/AliceO2Group/Control/common/utils" + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" @@ -73,6 +74,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { var errStdout, errStderr error var stdoutBuf, stderrBuf bytes.Buffer var stdout, stderr io.Writer + // To be closed after task is done + var stdoutLog, stderrLog *io.PipeWriter if t.Tci.Stdout == nil { none := "none" @@ -85,7 +88,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { switch *t.Tci.Stdout { case "stdout": - stdoutLog := log.WithPrefix("task-stdout"). + stdoutLog = log.WithPrefix("task-stdout"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). @@ -97,7 +100,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { stdout = io.MultiWriter(stdoutLog, &stdoutBuf) case "all": - stdoutLog := log.WithPrefix("task-stdout"). + stdoutLog = log.WithPrefix("task-stdout"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). @@ -112,7 +115,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { switch *t.Tci.Stderr { case "stdout": - stderrLog := log.WithPrefix("task-stderr"). + stderrLog = log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). @@ -124,7 +127,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { stderr = io.MultiWriter(stderrLog, &stderrBuf) case "all": - stderrLog := log.WithPrefix("task-stderr"). + stderrLog = log.WithPrefix("task-stderr"). WithField("level", infologger.IL_Support). WithField("partition", t.knownEnvironmentId.String()). WithField("detector", t.knownDetector). @@ -142,7 +145,6 @@ func (t *basicTaskBase) startBasicTask() (err error) { stderrIn, _ := t.taskCmd.StderrPipe() err = t.taskCmd.Start() - if err != nil { log.WithField("partition", t.knownEnvironmentId.String()). WithFields(logrus.Fields{ @@ -172,6 +174,13 @@ func (t *basicTaskBase) startBasicTask() (err error) { err = taskCmd.Wait() // ^ when this unblocks, the task is done + if stdoutLog != nil { + stdoutLog.Close() + } + if stderrLog != nil { + stderrLog.Close() + } + pendingState := mesos.TASK_FINISHED var tciCommandStr string if t.Tci.Value != nil { From 2317e45f37e17cbd3543c2ec0e7f6e404ea04c4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 10 Dec 2025 16:07:58 +0100 Subject: [PATCH 2243/2352] [core] part of OCTRL-1076, fixed leaked controllable task Kill goroutine --- executor/executable/controllabletask.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index e45256bdc..ff8d162f0 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -728,8 +728,8 @@ func (t *ControllableTask) Kill() error { }). Debug("state DONE not reached, about to commit transition") - // Call cmd.Commit() asynchronous - commitDone := make(chan *CommitResponse) + // Call cmd.Commit() asynchronous with buffered channel so it doesn't get stuck in a case of timeout + commitDone := make(chan *CommitResponse, 1) go func() { var cr CommitResponse cr.newState, cr.transitionError = cmd.Commit() @@ -856,7 +856,6 @@ func (t *ControllableTask) doKill9(pid int) error { } func (t *ControllableTask) doTermIntKill(pid int) error { - killErrCh := make(chan error) go func() { log.WithField("partition", t.knownEnvironmentId.String()). From 6f582db526a95164b7fc6c56fc1ca4bc24661442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 11 Dec 2025 17:34:21 +0100 Subject: [PATCH 2244/2352] [core] part of OCTRL-1076, proper error handling in eventloop --- executor/eventloop.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/executor/eventloop.go b/executor/eventloop.go index 3c19ed251..5fe38d14c 100644 --- a/executor/eventloop.go +++ b/executor/eventloop.go @@ -69,6 +69,11 @@ func eventLoop(state *internalState, decoder encoding.Decoder, h events.Handler) case e := <-eventCh: log.Trace("EVENT LOOP about to handle event") err = h.HandleEvent(ctx, &e) + // if we get an error here we are stoping the eventloop before triggering another nextEventNotify + // so it won't get stuck on eventCh, errorCh + if err != nil { + break + } // Spawn a goroutine to wait for the next event go nextEventNotify(decoder, eventCh, errorCh) @@ -100,7 +105,7 @@ func sendFailedTasks(state *internalState) { delete(state.failedTasks, taskID) // If there aren't any failed and active tasks, we request to shutdown the executor. if len(state.failedTasks) == 0 && len(state.activeTasks) == 0 { - //Originally state.shouldQuit = true but we want to keep the executor running + // Originally state.shouldQuit = true but we want to keep the executor running log.WithField("executorId", state.executor.ExecutorID).Info("task failure notified, no tasks present on executor") } } From a785ffc8d9fcbca56f8ab94827842a06b12eceb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 12 Dec 2025 11:01:15 +0100 Subject: [PATCH 2245/2352] [executor] properly closing pipes in basic common task when in error --- executor/executable/basictaskcommon.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/executor/executable/basictaskcommon.go b/executor/executable/basictaskcommon.go index 014d640ba..068752aef 100644 --- a/executor/executable/basictaskcommon.go +++ b/executor/executable/basictaskcommon.go @@ -155,6 +155,8 @@ func (t *basicTaskBase) startBasicTask() (err error) { }). Error("failed to run basic task") + closePipeWriters(stdoutLog, stderrLog) + return err } log.WithField("partition", t.knownEnvironmentId.String()). @@ -174,12 +176,7 @@ func (t *basicTaskBase) startBasicTask() (err error) { err = taskCmd.Wait() // ^ when this unblocks, the task is done - if stdoutLog != nil { - stdoutLog.Close() - } - if stderrLog != nil { - stderrLog.Close() - } + closePipeWriters(stdoutLog, stderrLog) pendingState := mesos.TASK_FINISHED var tciCommandStr string @@ -252,6 +249,15 @@ func (t *basicTaskBase) startBasicTask() (err error) { return err } +func closePipeWriters(stdoutLog *io.PipeWriter, stderrLog *io.PipeWriter) { + if stdoutLog != nil { + stdoutLog.Close() + } + if stderrLog != nil { + stderrLog.Close() + } +} + func (t *basicTaskBase) ensureBasicTaskKilled() (err error) { if t.taskCmd == nil { return nil From a5991508df117ef244ff97141d53f102c64dad9e Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 10 Dec 2025 14:12:49 +0100 Subject: [PATCH 2246/2352] refactor logging in controllabletask we reduce boiler-plate by having a common set of log fields that are defined once. infologger.level constant is used instead of "level". "cmd" and "command" log fields were unified to "command". --- executor/executable/controllabletask.go | 481 ++++++++---------------- 1 file changed, 162 insertions(+), 319 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index ff8d162f0..6f085655b 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -71,48 +71,39 @@ type CommitResponse struct { } func (t *ControllableTask) Launch() error { - log.WithFields(logrus.Fields{ + defaultLogFields := logrus.Fields{ "taskId": t.ti.TaskID.GetValue(), "taskName": t.ti.Name, - "level": infologger.IL_Devel, "partition": t.knownEnvironmentId.String(), "detector": t.knownDetector, - }).Debug("executor.ControllableTask.Launch begin") + } + + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). + Debug("executor.ControllableTask.Launch begin") launchStartTime := time.Now() defer utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch", - log.WithFields(logrus.Fields{ - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - "partition": t.knownEnvironmentId.String(), - "detector": t.knownDetector, - })) + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) t.pendingFinalTaskStateCh = make(chan mesos.TaskState, 1) // we use this to receive a pending status update if the task was killed taskCmd, err := prepareTaskCmd(t.Tci) if err != nil { msg := "cannot build task command" - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err, - "partition": t.knownEnvironmentId.String(), - "detector": t.knownDetector, - }). + log.WithFields(defaultLogFields). + WithError(err). Error(msg) t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, msg+": "+err.Error()) return err } - log.WithField("payload", string(t.ti.GetData()[:])). - WithField("task", t.ti.Name). - WithField("level", infologger.IL_Devel). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). + WithField("payload", string(t.ti.GetData()[:])). + WithField(infologger.Level, infologger.IL_Devel). Debug("starting task asynchronously") // We fork out into a goroutine for the actual process management. @@ -121,14 +112,10 @@ func (t *ControllableTask) Launch() error { // via channels. go func() { truncatedCmd := executorutil.TruncateCommandBeforeTheLastPipe(t.Tci.GetValue(), 500) - log.WithFields(logrus.Fields{ - "cmd": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - "partition": t.knownEnvironmentId.String(), - "detector": t.knownDetector, - }).Debug("executor.ControllableTask.Launch.async begin") + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("executor.ControllableTask.Launch.async begin") // Set up pipes for controlled process var errStdout, errStderr error @@ -137,36 +124,22 @@ func (t *ControllableTask) Launch() error { err = taskCmd.Start() if err != nil { - log.WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "command": truncatedCmd, - "partition": t.knownEnvironmentId.String(), - "detector": t.knownDetector, - }). + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithError(err). Error("failed to run task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.doTermIntKill(-taskCmd.Process.Pid) return } - log.WithField("id", t.ti.TaskID.Value). - WithField("task", t.ti.Name). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - Debug("task launched") + log.WithFields(defaultLogFields).Debug("task launched") utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "cmd": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel)) if t.Tci.Stdout == nil { none := "none" @@ -181,10 +154,8 @@ func (t *ControllableTask) Launch() error { case "stdout": go func() { entry := log.WithPrefix("task-stdout"). - WithField("level", infologger.IL_Support). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). WithField("nohooks", true) writer := &logger.SafeLogrusWriter{ Entry: entry, @@ -196,10 +167,8 @@ func (t *ControllableTask) Launch() error { case "all": go func() { entry := log.WithPrefix("task-stdout"). - WithField("level", infologger.IL_Support). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name) + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support) writer := &logger.SafeLogrusWriter{ Entry: entry, PrintFunc: entry.Debug, @@ -217,10 +186,8 @@ func (t *ControllableTask) Launch() error { case "stdout": go func() { entry := log.WithPrefix("task-stderr"). - WithField("level", infologger.IL_Support). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). WithField("nohooks", true) writer := &logger.SafeLogrusWriter{ Entry: entry, @@ -232,10 +199,8 @@ func (t *ControllableTask) Launch() error { case "all": go func() { entry := log.WithPrefix("task-stderr"). - WithField("level", infologger.IL_Support). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name) + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support) writer := &logger.SafeLogrusWriter{ Entry: entry, PrintFunc: entry.Warn, @@ -249,19 +214,15 @@ func (t *ControllableTask) Launch() error { }() } - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "controlPort": t.Tci.ControlPort, - "controlMode": t.Tci.ControlMode.String(), - "task": t.ti.Name, - "id": t.ti.TaskID.Value, - "path": taskCmd.Path, - "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", - "argc": len(taskCmd.Args), - "level": infologger.IL_Devel, - }). - Debug("starting gRPC client") + log.WithFields(defaultLogFields). + WithFields(logrus.Fields{ + "controlPort": t.Tci.ControlPort, + "controlMode": t.Tci.ControlMode.String(), + "path": taskCmd.Path, + "argv": "[ " + strings.Join(taskCmd.Args, ", ") + " ]", + "argc": len(taskCmd.Args), + infologger.Level: infologger.IL_Devel, + }).Debug("starting gRPC client") controlTransport := executorcmd.ProtobufTransport for _, v := range taskCmd.Args { @@ -278,26 +239,15 @@ func (t *ControllableTask) Launch() error { t.Tci.ControlMode, controlTransport, log.WithPrefix("executorcmd"). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": truncatedCmd, - }, - ), + WithFields(defaultLogFields). + WithField("command", truncatedCmd), ) if t.rpc == nil { err = errors.New("rpc client is nil") - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "error": err.Error(), - "command": truncatedCmd, - }). - WithField("level", infologger.IL_Devel). + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithError(err). + WithField(infologger.Level, infologger.IL_Devel). Error("could not start gRPC client") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) @@ -308,60 +258,37 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "command": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel)) utils.TimeTrack(rpcDialStartTime, "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "command": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel)) statePollingStartTime := time.Now() elapsed := 0 * time.Second for { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": truncatedCmd, - "elapsed": elapsed.String(), - "level": infologger.IL_Devel, - }). + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField("elapsed", elapsed.String()). + WithField(infologger.Level, infologger.IL_Devel). Debug("polling task for IDLE state reached") response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { log.WithError(err). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "state": response.GetState(), - "task": t.ti.Name, - "command": truncatedCmd, - }). + WithFields(defaultLogFields). + WithField("state", response.GetState()). + WithField("command", truncatedCmd). Info("cannot query task status") } else { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "state": response.GetState(), - "task": t.ti.Name, - "command": truncatedCmd, - "level": infologger.IL_Devel, - }). + log.WithFields(defaultLogFields). + WithField("state", response.GetState()). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). Debug("task status queried") t.knownPid = int(response.GetPid()) } @@ -369,12 +296,9 @@ func (t *ControllableTask) Launch() error { reachedState := t.rpc.FromDeviceState(response.GetState()) if reachedState == "STANDBY" && err == nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("id", t.ti.TaskID.Value). - WithField("task", t.ti.Name). + log.WithFields(defaultLogFields). WithField("command", truncatedCmd). - WithField("level", infologger.IL_Devel). + WithField(infologger.Level, infologger.IL_Devel). Debug("task running and ready for control input") break } else if reachedState == "DONE" || reachedState == "ERROR" { @@ -385,24 +309,20 @@ func (t *ControllableTask) Launch() error { // of this process, so we must rely on the PGID of the containing shell pid = -t.rpc.TaskCmd.Process.Pid } - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.Name). + log.WithFields(defaultLogFields). Debug("sending SIGKILL (9) to task") _ = syscall.Kill(pid, syscall.SIGKILL) _ = stdoutIn.Close() _ = stderrIn.Close() - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name).Debug("task killed") + log.WithFields(defaultLogFields). + Debug("task killed") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, "task reached wrong state on startup") return } else if elapsed >= startupTimeout { err = errors.New("timeout while waiting for task startup") - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name).Error(err.Error()) + log.WithFields(defaultLogFields). + Error(err.Error()) t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() t.rpc = nil @@ -412,9 +332,7 @@ func (t *ControllableTask) Launch() error { return } else { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.Name). + log.WithFields(defaultLogFields). WithField("command", truncatedCmd). Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) time.Sleep(startupPollingInterval) @@ -424,33 +342,21 @@ func (t *ControllableTask) Launch() error { utils.TimeTrack(launchStartTime, "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "command": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel)) utils.TimeTrack(statePollingStartTime, "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "command": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - })) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel)) // Set up event stream from task esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) if err != nil { - log.WithField("task", t.ti.Name). + log.WithFields(defaultLogFields). WithError(err). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). Error("cannot set up event stream from task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) _ = t.rpc.Close() @@ -465,22 +371,15 @@ func (t *ControllableTask) Launch() error { jsonEvent, err := json.Marshal(taskMessage) if err != nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.TaskID.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). WithError(err). Warning("error marshaling message") } else { t.sendMessage(jsonEvent) - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "command": truncatedCmd, - "taskId": t.ti.TaskID.GetValue(), - "taskName": t.ti.Name, - "level": infologger.IL_Devel, - }).Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") } // Process events from task in yet another goroutine @@ -492,32 +391,23 @@ func (t *ControllableTask) Launch() error { } for { if t.rpc == nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", deo.TaskId.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). WithError(err). Debug("event stream done") break } esr, err := esc.Recv() if err == io.EOF { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", deo.TaskId.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). WithError(err). Debug("event stream EOF") break } if err != nil { - log.WithError(err). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithField("errorType", reflect.TypeOf(err)). - WithField("level", infologger.IL_Devel). - WithField("taskId", deo.TaskId.GetValue()). - WithField("taskName", t.ti.Name). + WithField(infologger.Level, infologger.IL_Devel). + WithError(err). Warning("error receiving event") if status.Code(err) == codes.Unavailable { break @@ -528,29 +418,18 @@ func (t *ControllableTask) Launch() error { deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) if deviceEvent == nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", deo.TaskId.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") break } else { - taskId := deo.TaskId.Value - if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", taskId). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). WithField("taskPid", t.knownPid). Debug("END_OF_STREAM DeviceEvent received - notifying environment") } else if ev.GetType() == pb.DeviceEventType_TASK_INTERNAL_ERROR { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", taskId). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). WithField("taskPid", t.knownPid). - WithField("level", infologger.IL_Support). + WithField(infologger.Level, infologger.IL_Support). Warningf("task transitioned to ERROR on its own - notifying environment") } } @@ -562,31 +441,21 @@ func (t *ControllableTask) Launch() error { err = taskCmd.Wait() // ^ when this unblocks, the task is done - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": truncatedCmd, - "level": infologger.IL_Devel, - }).Debug("task done (taskCmd.Wait unblocks), preparing final update") + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("task done (taskCmd.Wait unblocks), preparing final update") pendingState := mesos.TASK_FINISHED if err != nil { taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("level", infologger.IL_Ops). + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Ops). Errorf("task '%s' terminated with error: %s", utils.TrimJitPrefix(taskClassName), err.Error()) - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": truncatedCmd, - "error": err.Error(), - "level": infologger.IL_Devel, - }). + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + WithError(err). Error("task terminated with error (details):") pendingState = mesos.TASK_FAILED } @@ -599,42 +468,27 @@ func (t *ControllableTask) Launch() error { if t.rpc != nil { _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.TaskID.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). Debug("rpc client closed") t.rpc = nil - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.TaskID.GetValue()). - WithField("taskName", t.ti.Name). + log.WithFields(defaultLogFields). Debug("rpc client removed") } if errStdout != nil || errStderr != nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "errStderr": errStderr, - "errStdout": errStdout, - "id": t.ti.TaskID.Value, - "task": t.ti.Name, - "command": truncatedCmd, - "level": infologger.IL_Devel, - }). + log.WithFields(defaultLogFields). + WithField("errStderr", errStderr). + WithField("errStdout", errStdout). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). Warning("failed to capture stdout or stderr of task") } t.sendStatus(t.knownEnvironmentId, pendingState, "") }() - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithFields(logrus.Fields{ - "task": t.ti.Name, - "level": infologger.IL_Devel, - }). + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). Debug("gRPC client starting, handler forked: executor.ControllableTask.Launch end") return nil } @@ -662,6 +516,13 @@ func (t *ControllableTask) Transition(cmd *executorcmd.ExecutorCommand_Transitio } func (t *ControllableTask) Kill() error { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + var ( pid = 0 reachedState = "UNKNOWN" // FIXME: should be LAUNCHING or similar @@ -670,11 +531,9 @@ func (t *ControllableTask) Kill() error { defer cancel() response, err := t.rpc.GetState(cxt, &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err == nil { // we successfully got the state from the task - log.WithField("nativeState", response.GetState()). - WithField("taskId", t.ti.GetTaskID()). - WithField("level", infologger.IL_Devel). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). + WithField("nativeState", response.GetState()). + WithField(infologger.Level, infologger.IL_Devel). Debug("task status queried for upcoming soft kill") // NOTE: we acquire the transitioner-dependent STANDBY equivalent state @@ -717,14 +576,13 @@ func (t *ControllableTask) Kill() error { for reachedState != "DONE" { cmd := nextTransition(reachedState) - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithFields(logrus.Fields{ - "evt": cmd.Event, - "src": cmd.Source, - "dst": cmd.Destination, - "targetList": cmd.TargetList, - "level": infologger.IL_Devel, + "evt": cmd.Event, + "src": cmd.Source, + "dst": cmd.Destination, + "targetList": cmd.TargetList, + infologger.Level: infologger.IL_Devel, }). Debug("state DONE not reached, about to commit transition") @@ -741,10 +599,8 @@ func (t *ControllableTask) Kill() error { select { case commitResponse = <-commitDone: case <-time.After(KILL_TRANSITION_TIMEOUT): - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.TaskID.Value). - WithField("level", infologger.IL_Devel). + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). Warn("teardown transition sequence timed out") } // timeout we should break @@ -752,29 +608,23 @@ func (t *ControllableTask) Kill() error { break } - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithField("newState", commitResponse.newState). WithError(commitResponse.transitionError). - WithField("task", t.ti.TaskID.Value). - WithField("level", infologger.IL_Devel). + WithField(infologger.Level, infologger.IL_Devel). Debug("transition committed") if commitResponse.transitionError != nil || len(cmd.Event) == 0 { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithError(commitResponse.transitionError). - WithField("task", t.ti.TaskID.Value). - WithField("level", infologger.IL_Devel). + WithField(infologger.Level, infologger.IL_Devel). Warn("teardown transition sequence error") break } reachedState = commitResponse.newState } - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("task", t.ti.TaskID.Value). - WithField("level", infologger.IL_Devel). + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). Debug("teardown transition sequence done") pid = int(response.GetPid()) if pid == 0 { @@ -785,10 +635,8 @@ func (t *ControllableTask) Kill() error { // If GetState didn't succeed during this Kill code path, but might still have // at some earlier point during the lifetime of this task. // Either way, we might or might not have the true PID. - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithError(err). - WithField("taskId", t.ti.GetTaskID()). Warn("cannot query task status for graceful process termination") pid = t.knownPid if pid == 0 { @@ -802,9 +650,8 @@ func (t *ControllableTask) Kill() error { // terminate the shell that is wrapping the command, so we avoid using // negative PID is all other cases in order to allow FairMQ cleanup to // run. - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithError(err).WithField("taskId", t.ti.GetTaskID()). + log.WithFields(defaultLogFields). + WithError(err). Warn("task PID not known from task, using containing shell PGID") } } @@ -813,16 +660,12 @@ func (t *ControllableTask) Kill() error { t.rpc = nil if reachedState == "DONE" { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.TaskID.Value). + log.WithFields(defaultLogFields). Debugf("task reached DONE, will wait %.1fs before terminating it", DONE_TIMEOUT.Seconds()) t.pendingFinalTaskStateCh <- mesos.TASK_FINISHED time.Sleep(DONE_TIMEOUT) } else { // something went wrong - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.TaskID.Value). + log.WithFields(defaultLogFields). Debug("task died already or will be killed soon") t.pendingFinalTaskStateCh <- mesos.TASK_KILLED } @@ -830,25 +673,26 @@ func (t *ControllableTask) Kill() error { if pidExists(pid) { return t.doTermIntKill(pid) } else { - log.WithField("taskId", t.ti.GetTaskID()). - WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). Debugf("task terminated on its own") return nil } } func (t *ControllableTask) doKill9(pid int) error { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.GetTaskID()). + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + + log.WithFields(defaultLogFields). Debug("sending SIGKILL (9) to task") killErr := syscall.Kill(pid, syscall.SIGKILL) if killErr != nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithError(killErr). - WithField("taskId", t.ti.GetTaskID()). Warning("task SIGKILL failed") } @@ -856,18 +700,21 @@ func (t *ControllableTask) doKill9(pid int) error { } func (t *ControllableTask) doTermIntKill(pid int) error { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + killErrCh := make(chan error) go func() { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.GetTaskID()). + log.WithFields(defaultLogFields). Debug("sending SIGTERM (15) to task") err := syscall.Kill(pid, syscall.SIGTERM) if err != nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithError(err). - WithField("taskId", t.ti.GetTaskID()). Warning("task SIGTERM failed") } killErrCh <- err @@ -882,16 +729,12 @@ func (t *ControllableTask) doTermIntKill(pid int) error { if pidExists(pid) { // SIGINT for the "Waiting for graceful device shutdown. // Hit Ctrl-C again to abort immediately" message. - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). - WithField("taskId", t.ti.GetTaskID()). + log.WithFields(defaultLogFields). Debug("sending SIGINT (2) to task") killErr = syscall.Kill(pid, syscall.SIGINT) if killErr != nil { - log.WithField("partition", t.knownEnvironmentId.String()). - WithField("detector", t.knownDetector). + log.WithFields(defaultLogFields). WithError(killErr). - WithField("taskId", t.ti.GetTaskID()). Warning("task SIGINT failed") } time.Sleep(SIGINT_TIMEOUT) From 232fc2124ab90f9f699d1502a327813c9373b690 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 11 Dec 2025 12:43:33 +0100 Subject: [PATCH 2247/2352] Refactor controllable task Launch Launch is broken into smaller pieces for better readability. Some minor error handling bugs are automatically fixed on the occasion and some more are marked with fixme and will be taken care of in separate commits. --- executor/executable/controllabletask.go | 671 +++++++++++++----------- 1 file changed, 351 insertions(+), 320 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 6f085655b..72bbf7374 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -29,6 +29,7 @@ import ( "encoding/json" "errors" "io" + "os/exec" "reflect" "strings" "syscall" @@ -111,108 +112,54 @@ func (t *ControllableTask) Launch() error { // Anything in the following goroutine must not touch *internalState, except // via channels. go func() { - truncatedCmd := executorutil.TruncateCommandBeforeTheLastPipe(t.Tci.GetValue(), 500) - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel). - Debug("executor.ControllableTask.Launch.async begin") + t.doLaunchTask(taskCmd, launchStartTime) + }() - // Set up pipes for controlled process - var errStdout, errStderr error - stdoutIn, _ := taskCmd.StdoutPipe() - stderrIn, _ := taskCmd.StderrPipe() + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). + Debug("gRPC client starting, handler forked: executor.ControllableTask.Launch end") + return nil +} - err = taskCmd.Start() - if err != nil { - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithError(err). - Error("failed to run task") +func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time.Time) { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + truncatedCmd := executorutil.TruncateCommandBeforeTheLastPipe(t.Tci.GetValue(), 500) - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.doTermIntKill(-taskCmd.Process.Pid) - return - } - log.WithFields(defaultLogFields).Debug("task launched") + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("executor.ControllableTask.Launch.async begin") - utils.TimeTrack(launchStartTime, - "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel)) + // Set up pipes for controlled process. They have to be retrieved before starting the task. + stdoutIn, _ := taskCmd.StdoutPipe() + stderrIn, _ := taskCmd.StderrPipe() - if t.Tci.Stdout == nil { - none := "none" - t.Tci.Stdout = &none - } - if t.Tci.Stderr == nil { - none := "none" - t.Tci.Stderr = &none - } + err := taskCmd.Start() + if err != nil { + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithError(err). + Error("failed to run task") - switch *t.Tci.Stdout { - case "stdout": - go func() { - entry := log.WithPrefix("task-stdout"). - WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Support). - WithField("nohooks", true) - writer := &logger.SafeLogrusWriter{ - Entry: entry, - PrintFunc: entry.Debug, - } - _, errStdout = io.Copy(writer, stdoutIn) - writer.Flush() - }() - case "all": - go func() { - entry := log.WithPrefix("task-stdout"). - WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Support) - writer := &logger.SafeLogrusWriter{ - Entry: entry, - PrintFunc: entry.Debug, - } - _, errStdout = io.Copy(writer, stdoutIn) - writer.Flush() - }() - default: - go func() { - _, errStdout = io.Copy(io.Discard, stdoutIn) - }() - } + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) + // fixme: i confirmed on staging, that's a nil access! taskCmd.Process is not set if Start() fails + _ = t.doTermIntKill(-taskCmd.Process.Pid) + // fixme: shouldn't we also close pipes, as we do in some other error cases later? + return + } + log.WithFields(defaultLogFields).Debug("task launched") - switch *t.Tci.Stderr { - case "stdout": - go func() { - entry := log.WithPrefix("task-stderr"). - WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Support). - WithField("nohooks", true) - writer := &logger.SafeLogrusWriter{ - Entry: entry, - PrintFunc: entry.Warn, - } - _, errStderr = io.Copy(writer, stderrIn) - writer.Flush() - }() - case "all": - go func() { - entry := log.WithPrefix("task-stderr"). - WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Support) - writer := &logger.SafeLogrusWriter{ - Entry: entry, - PrintFunc: entry.Warn, - } - _, errStderr = io.Copy(writer, stderrIn) - writer.Flush() - }() - default: - go func() { - _, errStderr = io.Copy(io.Discard, stderrIn) - }() - } + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to taskCmd.Start() complete", + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) + + t.initTaskStdLogging(stdoutIn, stderrIn) log.WithFields(defaultLogFields). WithFields(logrus.Fields{ @@ -224,273 +171,357 @@ func (t *ControllableTask) Launch() error { infologger.Level: infologger.IL_Devel, }).Debug("starting gRPC client") - controlTransport := executorcmd.ProtobufTransport - for _, v := range taskCmd.Args { - if strings.Contains(v, "-P OCClite") { - controlTransport = executorcmd.JsonTransport - break - } + controlTransport := executorcmd.ProtobufTransport + for _, v := range taskCmd.Args { + if strings.Contains(v, "-P OCClite") { + controlTransport = executorcmd.JsonTransport + break } + } - rpcDialStartTime := time.Now() + rpcDialStartTime := time.Now() + t.rpc = executorcmd.NewClient( + t.Tci.ControlPort, + t.Tci.ControlMode, + controlTransport, + log.WithPrefix("executorcmd"). + WithFields(defaultLogFields), + ) + if t.rpc == nil { + err = errors.New("rpc client is nil") + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithError(err). + WithField(infologger.Level, infologger.IL_Devel). + Error("could not start gRPC client") - t.rpc = executorcmd.NewClient( - t.Tci.ControlPort, - t.Tci.ControlMode, - controlTransport, - log.WithPrefix("executorcmd"). - WithFields(defaultLogFields). - WithField("command", truncatedCmd), - ) - if t.rpc == nil { - err = errors.New("rpc client is nil") - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithError(err). - WithField(infologger.Level, infologger.IL_Devel). - Error("could not start gRPC client") + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) + _ = t.doTermIntKill(-taskCmd.Process.Pid) + return + } + t.rpc.TaskCmd = taskCmd - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.doTermIntKill(-taskCmd.Process.Pid) - return + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) + + utils.TimeTrack(rpcDialStartTime, + "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) + + err = t.pollTaskForStandbyState() + if err != nil { + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) + + _ = t.rpc.Close() + t.rpc = nil + + pid := t.knownPid + if pid == 0 { + // The pid was never known through a successful `GetState` in the lifetime + // of this process, so we must rely on the PGID of the containing shell + pid = -taskCmd.Process.Pid } - t.rpc.TaskCmd = taskCmd + log.WithFields(defaultLogFields). + Debug("sending SIGKILL (9) to task") + _ = syscall.Kill(pid, syscall.SIGKILL) // fixme: not sure why we do it differently than elsewhere (doTermIntKill) + _ = stdoutIn.Close() + _ = stderrIn.Close() - utils.TimeTrack(launchStartTime, - "executor.ControllableTask.Launch.async: Launch begin to gRPC client dial success", - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel)) + log.WithFields(defaultLogFields). + Debug("task killed") + return + } - utils.TimeTrack(rpcDialStartTime, - "executor.ControllableTask.Launch.async: gRPC client dial begin to gRPC client dial success", - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel)) + utils.TimeTrack(launchStartTime, + "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) - statePollingStartTime := time.Now() - elapsed := 0 * time.Second - for { - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField("elapsed", elapsed.String()). - WithField(infologger.Level, infologger.IL_Devel). - Debug("polling task for IDLE state reached") - - response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithError(err). - WithFields(defaultLogFields). - WithField("state", response.GetState()). - WithField("command", truncatedCmd). - Info("cannot query task status") - } else { - log.WithFields(defaultLogFields). - WithField("state", response.GetState()). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel). - Debug("task status queried") - t.knownPid = int(response.GetPid()) - } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - reachedState := t.rpc.FromDeviceState(response.GetState()) + // Set up event stream from task + esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) + if err != nil { + log.WithFields(defaultLogFields). + WithError(err). + Error("cannot set up event stream from task") + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) + _ = t.rpc.Close() + t.rpc = nil + // fixme: why don't we kill the task in this error case, but we do in others? + return + } - if reachedState == "STANDBY" && err == nil { - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel). - Debug("task running and ready for control input") - break - } else if reachedState == "DONE" || reachedState == "ERROR" { - // something went wrong, the device moved to DONE or ERROR on startup - pid := t.knownPid - if pid == 0 { - // The pid was never known through a successful `GetState` in the lifetime - // of this process, so we must rely on the PGID of the containing shell - pid = -t.rpc.TaskCmd.Process.Pid - } - log.WithFields(defaultLogFields). - Debug("sending SIGKILL (9) to task") - _ = syscall.Kill(pid, syscall.SIGKILL) - _ = stdoutIn.Close() - _ = stderrIn.Close() + // send RUNNING + t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") + taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) + taskMessage.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) - log.WithFields(defaultLogFields). - Debug("task killed") - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, "task reached wrong state on startup") - return - } else if elapsed >= startupTimeout { - err = errors.New("timeout while waiting for task startup") - log.WithFields(defaultLogFields). - Error(err.Error()) - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.rpc.Close() - t.rpc = nil + jsonEvent, err := json.Marshal(taskMessage) + if err != nil { + log.WithFields(defaultLogFields). + WithError(err). + Warning("error marshaling message") + } else { + t.sendMessage(jsonEvent) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") + } + + // Process events from task in yet another goroutine + go func() { + t.processEventsFromTask(esc) + }() - _ = stdoutIn.Close() - _ = stderrIn.Close() + err = taskCmd.Wait() + // ^ when this unblocks, the task is done + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + Debug("task done (taskCmd.Wait unblocks), preparing final update") - return - } else { - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) - time.Sleep(startupPollingInterval) - elapsed += startupPollingInterval - } - } + pendingState := mesos.TASK_FINISHED + if err != nil { + taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Ops). + Errorf("task '%s' terminated with error: %s", utils.TrimJitPrefix(taskClassName), err.Error()) + log.WithFields(defaultLogFields). + WithField("command", truncatedCmd). + WithField(infologger.Level, infologger.IL_Devel). + WithError(err). + Error("task terminated with error (details):") + pendingState = mesos.TASK_FAILED + } - utils.TimeTrack(launchStartTime, - "executor.ControllableTask.Launch.async: Launch begin to gRPC state polling done", - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel)) + select { + case pending := <-t.pendingFinalTaskStateCh: + pendingState = pending + default: + } - utils.TimeTrack(statePollingStartTime, - "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithField(infologger.Level, infologger.IL_Devel)) + if t.rpc != nil { + _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much + log.WithFields(defaultLogFields). + Debug("rpc client closed") + t.rpc = nil + log.WithFields(defaultLogFields). + Debug("rpc client removed") + } - // Set up event stream from task - esc, err := t.rpc.EventStream(context.TODO(), &pb.EventStreamRequest{}, grpc.EmptyCallOption{}) - if err != nil { - log.WithFields(defaultLogFields). - WithError(err). - Error("cannot set up event stream from task") - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.rpc.Close() - t.rpc = nil - return - } + t.sendStatus(t.knownEnvironmentId, pendingState, "") + return +} - // send RUNNING - t.sendStatus(t.knownEnvironmentId, mesos.TASK_RUNNING, "") - taskMessage := event.NewAnnounceTaskPIDEvent(t.ti.TaskID.GetValue(), int32(t.knownPid)) - taskMessage.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) +func (t *ControllableTask) initTaskStdLogging(stdoutIn io.ReadCloser, stderrIn io.ReadCloser) { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } - jsonEvent, err := json.Marshal(taskMessage) - if err != nil { - log.WithFields(defaultLogFields). - WithError(err). - Warning("error marshaling message") - } else { - t.sendMessage(jsonEvent) + if t.Tci.Stdout == nil { + none := "none" + t.Tci.Stdout = &none + } + if t.Tci.Stderr == nil { + none := "none" + t.Tci.Stderr = &none + } + + go func() { + var errStdout error + switch *t.Tci.Stdout { + case "stdout": + entry := log.WithPrefix("task-stdout"). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). + WithField("nohooks", true) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Debug, + } + _, errStdout = io.Copy(writer, stdoutIn) + writer.Flush() + case "all": + entry := log.WithPrefix("task-stdout"). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Debug, + } + _, errStdout = io.Copy(writer, stdoutIn) + writer.Flush() + default: + _, errStdout = io.Copy(io.Discard, stdoutIn) + } + if errStdout != nil { log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). + WithError(errStdout). WithField(infologger.Level, infologger.IL_Devel). - Debug("executor.ControllableTask.Launch.async: TASK_RUNNING sent back to core") + Warning("failed to capture stdout of task") } + }() - // Process events from task in yet another goroutine - go func() { - deo := event.DeviceEventOrigin{ - AgentId: t.ti.AgentID, - ExecutorId: t.ti.GetExecutor().ExecutorID, - TaskId: t.ti.TaskID, + go func() { + var errStderr error + switch *t.Tci.Stderr { + case "stdout": + entry := log.WithPrefix("task-stderr"). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). + WithField("nohooks", true) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Warn, } - for { - if t.rpc == nil { - log.WithFields(defaultLogFields). - WithError(err). - Debug("event stream done") - break - } - esr, err := esc.Recv() - if err == io.EOF { - log.WithFields(defaultLogFields). - WithError(err). - Debug("event stream EOF") - break - } - if err != nil { - log.WithFields(defaultLogFields). - WithField("errorType", reflect.TypeOf(err)). - WithField(infologger.Level, infologger.IL_Devel). - WithError(err). - Warning("error receiving event") - if status.Code(err) == codes.Unavailable { - break - } - continue - } - ev := esr.GetEvent() - - deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) - if deviceEvent == nil { - log.WithFields(defaultLogFields). - Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") - break - } else { - if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { - log.WithFields(defaultLogFields). - WithField("taskPid", t.knownPid). - Debug("END_OF_STREAM DeviceEvent received - notifying environment") - } else if ev.GetType() == pb.DeviceEventType_TASK_INTERNAL_ERROR { - log.WithFields(defaultLogFields). - WithField("taskPid", t.knownPid). - WithField(infologger.Level, infologger.IL_Support). - Warningf("task transitioned to ERROR on its own - notifying environment") - } - } - deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) - - t.sendDeviceEvent(t.knownEnvironmentId, deviceEvent) + _, errStderr = io.Copy(writer, stderrIn) + writer.Flush() + case "all": + entry := log.WithPrefix("task-stderr"). + WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support) + writer := &logger.SafeLogrusWriter{ + Entry: entry, + PrintFunc: entry.Warn, } - }() + _, errStderr = io.Copy(writer, stderrIn) + writer.Flush() + default: + _, errStderr = io.Copy(io.Discard, stderrIn) + } + if errStderr != nil { + log.WithFields(defaultLogFields). + WithError(errStderr). + WithField(infologger.Level, infologger.IL_Devel). + Warning("failed to capture stderr of task") + } + }() +} - err = taskCmd.Wait() - // ^ when this unblocks, the task is done +func (t *ControllableTask) pollTaskForStandbyState() error { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + statePollingStartTime := time.Now() + elapsed := 0 * time.Second + for { log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). + WithField("elapsed", elapsed.String()). WithField(infologger.Level, infologger.IL_Devel). - Debug("task done (taskCmd.Wait unblocks), preparing final update") + Debug("polling task for STANDBY state reached") - pendingState := mesos.TASK_FINISHED + response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) if err != nil { - taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) - log.WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Ops). - Errorf("task '%s' terminated with error: %s", utils.TrimJitPrefix(taskClassName), err.Error()) + log.WithError(err). + WithFields(defaultLogFields). + WithField("state", response.GetState()). + Info("cannot query task status") + } else { log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). + WithField("state", response.GetState()). WithField(infologger.Level, infologger.IL_Devel). - WithError(err). - Error("task terminated with error (details):") - pendingState = mesos.TASK_FAILED + Debug("task status queried") + t.knownPid = int(response.GetPid()) } + // NOTE: we acquire the transitioner-dependent STANDBY equivalent state + // fixme: that's a possible nil access there, because we do not "continue" on error + reachedState := t.rpc.FromDeviceState(response.GetState()) - select { - case pending := <-t.pendingFinalTaskStateCh: - pendingState = pending - default: + if reachedState == "STANDBY" && err == nil { + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel). + Debug("task running and ready for control input") + break + } else if reachedState == "DONE" || reachedState == "ERROR" { + // something went wrong, the device moved to DONE or ERROR on startup + return errors.New("task reached wrong state on startup") + } else if elapsed >= startupTimeout { + return errors.New("timeout while trying to poll task") + } else { + log.WithFields(defaultLogFields). + Debugf("task not ready yet, waiting %s", startupPollingInterval.String()) + time.Sleep(startupPollingInterval) + elapsed += startupPollingInterval } + } - if t.rpc != nil { - _ = t.rpc.Close() // NOTE: might return non-nil error, but we don't care much + utils.TimeTrack(statePollingStartTime, + "executor.ControllableTask.Launch.async: gRPC state polling begin to gRPC state polling done", + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Devel)) + return nil +} + +func (t *ControllableTask) processEventsFromTask(esc pb.Occ_EventStreamClient) { + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + deo := event.DeviceEventOrigin{ + AgentId: t.ti.AgentID, + ExecutorId: t.ti.GetExecutor().ExecutorID, + TaskId: t.ti.TaskID, + } + + for { + if t.rpc == nil { log.WithFields(defaultLogFields). - Debug("rpc client closed") - t.rpc = nil + Debug("event stream done") + break + } + esr, err := esc.Recv() + if err == io.EOF { log.WithFields(defaultLogFields). - Debug("rpc client removed") + WithError(err). + Debug("event stream EOF") + break } - - if errStdout != nil || errStderr != nil { + if err != nil { log.WithFields(defaultLogFields). - WithField("errStderr", errStderr). - WithField("errStdout", errStdout). - WithField("command", truncatedCmd). + WithField("errorType", reflect.TypeOf(err)). WithField(infologger.Level, infologger.IL_Devel). - Warning("failed to capture stdout or stderr of task") + WithError(err). + Warning("error receiving event") + if status.Code(err) == codes.Unavailable { + break + } + // fixme: we also get codes.Canceled sometimes, it's probably OK and we should not complain + continue } + ev := esr.GetEvent() - t.sendStatus(t.knownEnvironmentId, pendingState, "") - }() + deviceEvent := event.NewDeviceEvent(deo, ev.GetType()) + if deviceEvent == nil { + log.WithFields(defaultLogFields). + Debug("nil DeviceEvent received (NULL_DEVICE_EVENT) - closing stream") + break + } else { + if deviceEvent.GetType() == pb.DeviceEventType_END_OF_STREAM { + log.WithFields(defaultLogFields). + WithField("taskPid", t.knownPid). + Debug("END_OF_STREAM DeviceEvent received - notifying environment") + } else if ev.GetType() == pb.DeviceEventType_TASK_INTERNAL_ERROR { + log.WithFields(defaultLogFields). + WithField("taskPid", t.knownPid). + WithField(infologger.Level, infologger.IL_Support). + Warningf("task transitioned to ERROR on its own - notifying environment") + } + } + deviceEvent.SetLabels(map[string]string{"detector": t.knownDetector, "environmentId": t.knownEnvironmentId.String()}) - log.WithFields(defaultLogFields). - WithField(infologger.Level, infologger.IL_Devel). - Debug("gRPC client starting, handler forked: executor.ControllableTask.Launch end") - return nil + t.sendDeviceEvent(t.knownEnvironmentId, deviceEvent) + } } func (t *ControllableTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { From 5589d40df791ddbee225cb7d0be91d6bf70d0655 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 12:01:58 +0100 Subject: [PATCH 2248/2352] do not attempt to kill a process which never started it's difficult to trigger such an error, but if taskCmd.Start() actually fails, it never sets taskCmd.Process, so trying to use the PID there is a nil access and causes executor to crash. --- executor/executable/controllabletask.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 72bbf7374..d0642e878 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -147,8 +147,6 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. Error("failed to run task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - // fixme: i confirmed on staging, that's a nil access! taskCmd.Process is not set if Start() fails - _ = t.doTermIntKill(-taskCmd.Process.Pid) // fixme: shouldn't we also close pipes, as we do in some other error cases later? return } From 5d2bb0b3500a6975a65e5a6649181a424a6ecf34 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 12:22:26 +0100 Subject: [PATCH 2249/2352] document that we don't need to close pipes if command fails to start --- executor/executable/controllabletask.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index d0642e878..ea3f16c3a 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -147,7 +147,7 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. Error("failed to run task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - // fixme: shouldn't we also close pipes, as we do in some other error cases later? + // no need to close IO pipes, Cmd.Start does it on failure return } log.WithFields(defaultLogFields).Debug("task launched") From 46636baa54ae82a85ebb034ea82e7907d4d771f3 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 12:33:31 +0100 Subject: [PATCH 2250/2352] be gentler with terminating tasks which fail to reach STANDBY If a task fails to report STANDBY state upon startup, we now perform the standard TERM, INT, KILL sequence instead of just KILL. We also rely on Wait() to close relevant pipes and provide us with exit code. All above is moved into a dedicated method which will be reused in next fixes. --- executor/executable/controllabletask.go | 64 ++++++++++++++++++------- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index ea3f16c3a..557e4f378 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -211,25 +211,14 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. err = t.pollTaskForStandbyState() if err != nil { - t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - - _ = t.rpc.Close() - t.rpc = nil - - pid := t.knownPid - if pid == 0 { - // The pid was never known through a successful `GetState` in the lifetime - // of this process, so we must rely on the PGID of the containing shell - pid = -taskCmd.Process.Pid - } log.WithFields(defaultLogFields). - Debug("sending SIGKILL (9) to task") - _ = syscall.Kill(pid, syscall.SIGKILL) // fixme: not sure why we do it differently than elsewhere (doTermIntKill) - _ = stdoutIn.Close() - _ = stderrIn.Close() + WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Error("failed to poll task for standby state") - log.WithFields(defaultLogFields). - Debug("task killed") + t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) + + t.cleanupFailedTask(taskCmd) return } @@ -314,6 +303,47 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. return } +func (t *ControllableTask) cleanupFailedTask(taskCmd *exec.Cmd) { + + defaultLogFields := logrus.Fields{ + "taskId": t.ti.TaskID.GetValue(), + "taskName": t.ti.Name, + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + } + + if taskCmd.Process == nil { + // task never started or was already terminated + return + } + + if t.rpc != nil { + _ = t.rpc.Close() + t.rpc = nil + } + + pid := t.knownPid + if pid == 0 { + // The pid was never known through a successful `GetState` in the lifetime + // of this process, so we must rely on the PGID of the containing shell + pid = -taskCmd.Process.Pid + } + + _ = t.doTermIntKill(-taskCmd.Process.Pid) + + err := taskCmd.Wait() + if err != nil { + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Warning("task terminated and exited with error") + } else { + log.WithFields(defaultLogFields). + WithField(infologger.Level, infologger.IL_Support). + Debug("task terminated") + } +} + func (t *ControllableTask) initTaskStdLogging(stdoutIn io.ReadCloser, stderrIn io.ReadCloser) { defaultLogFields := logrus.Fields{ "taskId": t.ti.TaskID.GetValue(), From 24dae4b4b0ae77d48f7a94b305c424aa35a27617 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 14:52:35 +0100 Subject: [PATCH 2251/2352] be consistent in cleaning up failed controllable task --- executor/executable/controllabletask.go | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index 557e4f378..e17bd167b 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -194,7 +194,8 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. Error("could not start gRPC client") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.doTermIntKill(-taskCmd.Process.Pid) + + t.cleanupFailedTask(taskCmd) return } t.rpc.TaskCmd = taskCmd @@ -234,9 +235,7 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. WithError(err). Error("cannot set up event stream from task") t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) - _ = t.rpc.Close() - t.rpc = nil - // fixme: why don't we kill the task in this error case, but we do in others? + t.cleanupFailedTask(taskCmd) return } From e724c0ca4f9b0fd316c7fcf22c8c9c24c3ff2f3c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 15:06:18 +0100 Subject: [PATCH 2252/2352] fix nil access while polling controllable task for STANDBY state --- executor/executable/controllabletask.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index e17bd167b..efbd0df90 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -447,6 +447,7 @@ func (t *ControllableTask) pollTaskForStandbyState() error { Debug("polling task for STANDBY state reached") response, err := t.rpc.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) + reachedState := "UNKNOWN" if err != nil { log.WithError(err). WithFields(defaultLogFields). @@ -458,12 +459,11 @@ func (t *ControllableTask) pollTaskForStandbyState() error { WithField(infologger.Level, infologger.IL_Devel). Debug("task status queried") t.knownPid = int(response.GetPid()) + // NOTE: we acquire the transitioner-dependent STANDBY equivalent state + reachedState = t.rpc.FromDeviceState(response.GetState()) } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - // fixme: that's a possible nil access there, because we do not "continue" on error - reachedState := t.rpc.FromDeviceState(response.GetState()) - if reachedState == "STANDBY" && err == nil { + if reachedState == "STANDBY" { log.WithFields(defaultLogFields). WithField(infologger.Level, infologger.IL_Devel). Debug("task running and ready for control input") From a10f2366dcbdec9ff00136d757a69fdf79f350d9 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 12 Dec 2025 16:30:53 +0100 Subject: [PATCH 2253/2352] Distinguish between task too slow to start and crashing on start Fixes OCTRL-1075 --- executor/executable/controllabletask.go | 32 ++++++++++++++++++------- executor/executorcmd/client.go | 6 +---- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/executor/executable/controllabletask.go b/executor/executable/controllabletask.go index efbd0df90..c8794c7f0 100644 --- a/executor/executable/controllabletask.go +++ b/executor/executable/controllabletask.go @@ -63,6 +63,7 @@ type ControllableTask struct { taskBase rpc *executorcmd.RpcClient pendingFinalTaskStateCh chan mesos.TaskState + taskDoneCh chan error knownPid int } @@ -159,6 +160,12 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. t.initTaskStdLogging(stdoutIn, stderrIn) + // We start to Wait() for the result already, so we have access to ProcessState on an early failure + t.taskDoneCh = make(chan error, 1) + go func() { + t.taskDoneCh <- taskCmd.Wait() + }() + log.WithFields(defaultLogFields). WithFields(logrus.Fields{ "controlPort": t.Tci.ControlPort, @@ -186,12 +193,20 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. WithFields(defaultLogFields), ) if t.rpc == nil { - err = errors.New("rpc client is nil") - log.WithFields(defaultLogFields). - WithField("command", truncatedCmd). - WithError(err). - WithField(infologger.Level, infologger.IL_Devel). - Error("could not start gRPC client") + // Check if the task is still running by checking ProcessState + if taskCmd.ProcessState != nil { + err = errors.New("AliECS executor could not connect to task, likely crashed on startup") + } else { + err = errors.New("AliECS executor could not connect to task, likely took too long to start") + } + + taskClassName, _ := utils.ExtractTaskClassName(t.ti.Name) + log.WithFields(logrus.Fields{ + "task": utils.TrimJitPrefix(taskClassName), + "partition": t.knownEnvironmentId.String(), + "detector": t.knownDetector, + infologger.Level: infologger.IL_Ops, + }).Error(err.Error()) t.sendStatus(t.knownEnvironmentId, mesos.TASK_FAILED, err.Error()) @@ -262,7 +277,7 @@ func (t *ControllableTask) doLaunchTask(taskCmd *exec.Cmd, launchStartTime time. t.processEventsFromTask(esc) }() - err = taskCmd.Wait() + err = <-t.taskDoneCh // ^ when this unblocks, the task is done log.WithFields(defaultLogFields). WithField("command", truncatedCmd). @@ -330,7 +345,8 @@ func (t *ControllableTask) cleanupFailedTask(taskCmd *exec.Cmd) { _ = t.doTermIntKill(-taskCmd.Process.Pid) - err := taskCmd.Wait() + // Wait for task to finish and report the error + err := <-t.taskDoneCh if err != nil { log.WithFields(defaultLogFields). WithField(infologger.Level, infologger.IL_Support). diff --git a/executor/executorcmd/client.go b/executor/executorcmd/client.go index 738a7e521..bc9a2e7a8 100644 --- a/executor/executorcmd/client.go +++ b/executor/executorcmd/client.go @@ -80,12 +80,8 @@ func NewClient( log.WithField("error", err.Error()). WithField("endpoint", endpoint). WithField("transport", controlTransportS). - WithField("level", infologger.IL_Trace). + WithField("level", infologger.IL_Devel). Error("gRPC client can't dial") - log.WithField("error", err.Error()). - WithField("endpoint", endpoint). - WithField("level", infologger.IL_Ops). - Error("AliECS executor could not connect to task, possible crash on startup") cancel() if conn != nil { From 232d21b2be3517271478669160c141d7268aa866 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Dec 2025 22:35:40 +0000 Subject: [PATCH 2254/2352] Bump github.com/expr-lang/expr from 1.17.0 to 1.17.7 Bumps [github.com/expr-lang/expr](https://github.com/expr-lang/expr) from 1.17.0 to 1.17.7. - [Release notes](https://github.com/expr-lang/expr/releases) - [Commits](https://github.com/expr-lang/expr/compare/v1.17.0...v1.17.7) --- updated-dependencies: - dependency-name: github.com/expr-lang/expr dependency-version: 1.17.7 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1fd24d1c8..90a854904 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( require ( dario.cat/mergo v1.0.1 - github.com/expr-lang/expr v1.17.0 + github.com/expr-lang/expr v1.17.7 github.com/flosch/pongo2/v6 v6.0.0 github.com/gogo/protobuf v1.3.2 github.com/hashicorp/go-multierror v1.1.1 diff --git a/go.sum b/go.sum index a23533be8..c589d794f 100644 --- a/go.sum +++ b/go.sum @@ -61,8 +61,8 @@ github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/expr-lang/expr v1.17.0 h1:+vpszOyzKLQXC9VF+wA8cVA0tlA984/Wabc/1hF9Whg= -github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= +github.com/expr-lang/expr v1.17.7 h1:Q0xY/e/2aCIp8g9s/LGvMDCC5PxYlvHgDZRQ4y16JX8= +github.com/expr-lang/expr v1.17.7/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= From c66a3da44472fbad630143434c673a592cf9097d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 13 Jan 2026 12:09:40 +0100 Subject: [PATCH 2255/2352] [coconut] fixed timestamp formatting in env list and show commands --- coconut/control/control.go | 4 ++-- coconut/control/controlutil.go | 7 +++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/coconut/control/control.go b/coconut/control/control.go index bc0983a8b..51b09ff15 100644 --- a/coconut/control/control.go +++ b/coconut/control/control.go @@ -252,7 +252,7 @@ func GetEnvironments(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com data := make([][]string, 0, 0) for _, envi := range response.GetEnvironments() { - formatted := formatTimestamp(envi.GetCreatedWhen()) + formatted := formatTimestamp(time.Millisecond*time.Duration(envi.GetCreatedWhen())) data = append(data, []string{envi.GetId(), envi.GetRootRole(), formatted, colorState(envi.GetState())}) } @@ -539,7 +539,7 @@ func ShowEnvironment(cxt context.Context, rpc *coconut.RpcClient, cmd *cobra.Com _, _ = fmt.Fprintf(o, "environment id: %s\n", env.GetId()) _, _ = fmt.Fprintf(o, "workflow template: %s\n", env.GetRootRole()) _, _ = fmt.Fprintf(o, "description: %s\n", env.GetDescription()) - _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(env.GetCreatedWhen())) + _, _ = fmt.Fprintf(o, "created: %s\n", formatTimestamp(time.Millisecond*time.Duration(env.GetCreatedWhen()))) _, _ = fmt.Fprintf(o, "state: %s\n", colorState(env.GetState())) if currentTransition := env.GetCurrentTransition(); len(currentTransition) != 0 { _, _ = fmt.Fprintf(o, "transition: %s\n", currentTransition) diff --git a/coconut/control/controlutil.go b/coconut/control/controlutil.go index 7f6642e0b..5d85a5906 100644 --- a/coconut/control/controlutil.go +++ b/coconut/control/controlutil.go @@ -178,10 +178,9 @@ func drawTableShortTaskInfos(tasks []*pb.ShortTaskInfo, headers []string, linePr table.Render() } -func formatTimestamp(int64timestamp int64) string { - timestamp := time.Unix(0, int64timestamp) - formatted := timestamp.Local().Format("2006-01-02 15:04:05 MST") - return formatted +func formatTimestamp(timestamp time.Duration) string { + time := time.Unix(int64(timestamp.Seconds()), 0) + return time.Local().Format("2006-01-02 15:04:05 MST") } func formatNumber(numberOfMachines int32) string { From 5e79b372e0da5f23fbd78a900b1fa91fb18a1081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 13 Jan 2026 14:29:41 +0100 Subject: [PATCH 2256/2352] [build] Added debug build possibility to Makefile --- Makefile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index f59740768..88a426438 100644 --- a/Makefile +++ b/Makefile @@ -81,6 +81,11 @@ PROD :=-X=$(REPOPATH)/common/product EXTLDFLAGS :="-static" LDFLAGS=-ldflags "-extldflags $(EXTLDFLAGS) $(PROD).VERSION_MAJOR=$(VERSION_MAJOR) $(PROD).VERSION_MINOR=$(VERSION_MINOR) $(PROD).VERSION_PATCH=$(VERSION_PATCH) $(PROD).BUILD=$(BUILD)" -tags osusergo,netgo +# To invoke debug build you need to pass DEBUG variable with any value, eg: DEBUG=1 make WHAT=... +ifdef DEBUG + GCFLAGS += -gcflags="all=-N -l" +endif + # We expect to find the protoc-gen-go executable in $GOPATH/bin GOPATH := $(shell go env GOPATH) GOPROTOCPATH=$(ROOT_DIR)/tools/protoc-gen-go @@ -124,7 +129,7 @@ $(WHAT): validate-go-version # @echo -e "WHAT_$@_BUILD_FLAGS $(WHAT_$@_BUILD_FLAGS)" @echo -e "\033[1;33mgo build -mod=vendor\033[0m ./cmd/$@ \033[1;33m==>\033[0m \033[1;34m./bin/$@\033[0m" # @echo ${PWD} - @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) -o bin/$@ $(LDFLAGS) ./cmd/$@ + @$(WHAT_$@_BUILD_FLAGS) go build -mod=vendor $(VERBOSE_$(V)) $(GCFLAGS) -o bin/$@ $(LDFLAGS) ./cmd/$@ # special case: if the current WHAT is o2-aliecs-executor, also copy over the shmcleaner script @if [ $@ = "o2-aliecs-executor" ]; then \ From f03724f0c786ac0a50a6bf3e6279a37131a430eb Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 15 Jan 2026 09:42:01 +0100 Subject: [PATCH 2257/2352] Bump to v1.47.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index 6a9804ddb..8bbf43827 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 46 -VERSION_PATCH := 1 +VERSION_MINOR := 47 +VERSION_PATCH := 0 From 79d80ad152e11b5e053e362f477d4ae7f4a1324a Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 22 Jan 2026 10:54:39 +0100 Subject: [PATCH 2258/2352] Add ctp_status to the trg plugin Towards OCTRL-1040 --- core/integration/trg/plugin.go | 1 + core/integration/trg/protos/ctp_status.pb.go | 387 +++++++++++++++++++ core/integration/trg/protos/ctp_status.proto | 46 +++ 3 files changed, 434 insertions(+) create mode 100644 core/integration/trg/protos/ctp_status.pb.go create mode 100644 core/integration/trg/protos/ctp_status.proto diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 556706f96..75a90b7da 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -24,6 +24,7 @@ */ //go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ctpecs.proto +//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-grpc_opt=paths=source_relative --go-grpc_out=require_unimplemented_servers=false:. protos/ctp_status.proto // Package trg provides integration with the ALICE trigger system. package trg diff --git a/core/integration/trg/protos/ctp_status.pb.go b/core/integration/trg/protos/ctp_status.pb.go new file mode 100644 index 000000000..39bd8c3d8 --- /dev/null +++ b/core/integration/trg/protos/ctp_status.pb.go @@ -0,0 +1,387 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.1 +// protoc v5.29.3 +// source: protos/ctp_status.proto + +package ctpecs + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Detector int32 + +const ( + Detector_NULL_DETECTOR Detector = 0 + Detector_ITS Detector = 6 + Detector_MCH Detector = 8 + Detector_MFT Detector = 9 + Detector_TPC Detector = 13 +) + +// Enum value maps for Detector. +var ( + Detector_name = map[int32]string{ + 0: "NULL_DETECTOR", + 6: "ITS", + 8: "MCH", + 9: "MFT", + 13: "TPC", + } + Detector_value = map[string]int32{ + "NULL_DETECTOR": 0, + "ITS": 6, + "MCH": 8, + "MFT": 9, + "TPC": 13, + } +) + +func (x Detector) Enum() *Detector { + p := new(Detector) + *p = x + return p +} + +func (x Detector) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Detector) Descriptor() protoreflect.EnumDescriptor { + return file_protos_ctp_status_proto_enumTypes[0].Descriptor() +} + +func (Detector) Type() protoreflect.EnumType { + return &file_protos_ctp_status_proto_enumTypes[0] +} + +func (x Detector) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Detector.Descriptor instead. +func (Detector) EnumDescriptor() ([]byte, []int) { + return file_protos_ctp_status_proto_rawDescGZIP(), []int{0} +} + +type Clock int32 + +const ( + Clock_NULL Clock = 0 + Clock_LOCAL Clock = 1 + Clock_BEAM1 Clock = 2 +) + +// Enum value maps for Clock. +var ( + Clock_name = map[int32]string{ + 0: "NULL", + 1: "LOCAL", + 2: "BEAM1", + } + Clock_value = map[string]int32{ + "NULL": 0, + "LOCAL": 1, + "BEAM1": 2, + } +) + +func (x Clock) Enum() *Clock { + p := new(Clock) + *p = x + return p +} + +func (x Clock) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Clock) Descriptor() protoreflect.EnumDescriptor { + return file_protos_ctp_status_proto_enumTypes[1].Descriptor() +} + +func (Clock) Type() protoreflect.EnumType { + return &file_protos_ctp_status_proto_enumTypes[1] +} + +func (x Clock) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use Clock.Descriptor instead. +func (Clock) EnumDescriptor() ([]byte, []int) { + return file_protos_ctp_status_proto_rawDescGZIP(), []int{1} +} + +type DetectorInfo struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Detector Detector `protobuf:"varint,1,opt,name=detector,proto3,enum=ctp_status.Detector" json:"detector,omitempty"` + HoldoverOngoing bool `protobuf:"varint,2,opt,name=holdover_ongoing,json=holdoverOngoing,proto3" json:"holdover_ongoing,omitempty"` // detector:holdover, holdover=True if holdover ON or holdover OFF not finished, holdover=False if holdover procedure finished +} + +func (x *DetectorInfo) Reset() { + *x = DetectorInfo{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctp_status_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DetectorInfo) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DetectorInfo) ProtoMessage() {} + +func (x *DetectorInfo) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctp_status_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DetectorInfo.ProtoReflect.Descriptor instead. +func (*DetectorInfo) Descriptor() ([]byte, []int) { + return file_protos_ctp_status_proto_rawDescGZIP(), []int{0} +} + +func (x *DetectorInfo) GetDetector() Detector { + if x != nil { + return x.Detector + } + return Detector_NULL_DETECTOR +} + +func (x *DetectorInfo) GetHoldoverOngoing() bool { + if x != nil { + return x.HoldoverOngoing + } + return false +} + +type Status struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TimestampNano uint64 `protobuf:"varint,1,opt,name=timestamp_nano,json=timestampNano,proto3" json:"timestamp_nano,omitempty"` // nanoseconds since epoch or whatever precision you can offer + DetectorInfo []*DetectorInfo `protobuf:"bytes,2,rep,name=detector_info,json=detectorInfo,proto3" json:"detector_info,omitempty"` + Clock Clock `protobuf:"varint,3,opt,name=clock,proto3,enum=ctp_status.Clock" json:"clock,omitempty"` + ClockTransitionExpected uint32 `protobuf:"varint,4,opt,name=clock_transition_expected,json=clockTransitionExpected,proto3" json:"clock_transition_expected,omitempty"` // Integer, values only 90,60,30,0 + Ready bool `protobuf:"varint,5,opt,name=ready,proto3" json:"ready,omitempty"` // True if no holdover for any detector and clocktransition=0, False otherwise +} + +func (x *Status) Reset() { + *x = Status{} + if protoimpl.UnsafeEnabled { + mi := &file_protos_ctp_status_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Status) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Status) ProtoMessage() {} + +func (x *Status) ProtoReflect() protoreflect.Message { + mi := &file_protos_ctp_status_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Status.ProtoReflect.Descriptor instead. +func (*Status) Descriptor() ([]byte, []int) { + return file_protos_ctp_status_proto_rawDescGZIP(), []int{1} +} + +func (x *Status) GetTimestampNano() uint64 { + if x != nil { + return x.TimestampNano + } + return 0 +} + +func (x *Status) GetDetectorInfo() []*DetectorInfo { + if x != nil { + return x.DetectorInfo + } + return nil +} + +func (x *Status) GetClock() Clock { + if x != nil { + return x.Clock + } + return Clock_NULL +} + +func (x *Status) GetClockTransitionExpected() uint32 { + if x != nil { + return x.ClockTransitionExpected + } + return 0 +} + +func (x *Status) GetReady() bool { + if x != nil { + return x.Ready + } + return false +} + +var File_protos_ctp_status_proto protoreflect.FileDescriptor + +var file_protos_ctp_status_proto_rawDesc = []byte{ + 0x0a, 0x17, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2f, 0x63, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x63, 0x74, 0x70, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x6b, 0x0a, 0x0c, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x30, 0x0a, 0x08, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x63, 0x74, 0x70, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x64, + 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x68, 0x6f, 0x6c, 0x64, 0x6f, + 0x76, 0x65, 0x72, 0x5f, 0x6f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x68, 0x6f, 0x6c, 0x64, 0x6f, 0x76, 0x65, 0x72, 0x4f, 0x6e, 0x67, 0x6f, 0x69, + 0x6e, 0x67, 0x22, 0xe9, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x25, 0x0a, + 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6e, 0x61, 0x6e, 0x6f, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x4e, 0x61, 0x6e, 0x6f, 0x12, 0x3d, 0x0a, 0x0d, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x74, + 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0c, 0x64, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x27, 0x0a, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x63, 0x74, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x52, 0x05, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x3a, 0x0a, 0x19, + 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x17, 0x63, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x2a, 0x83, + 0x01, 0x0a, 0x08, 0x44, 0x65, 0x74, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x11, 0x0a, 0x0d, 0x4e, + 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x07, + 0x0a, 0x03, 0x49, 0x54, 0x53, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x43, 0x48, 0x10, 0x08, + 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x46, 0x54, 0x10, 0x09, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x50, 0x43, + 0x10, 0x0d, 0x22, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x04, 0x08, 0x02, 0x10, 0x02, 0x22, 0x04, + 0x08, 0x03, 0x10, 0x03, 0x22, 0x04, 0x08, 0x04, 0x10, 0x04, 0x22, 0x04, 0x08, 0x05, 0x10, 0x05, + 0x22, 0x04, 0x08, 0x07, 0x10, 0x07, 0x22, 0x04, 0x08, 0x0a, 0x10, 0x0a, 0x22, 0x04, 0x08, 0x0b, + 0x10, 0x0b, 0x22, 0x04, 0x08, 0x0c, 0x10, 0x0c, 0x22, 0x04, 0x08, 0x0e, 0x10, 0x0e, 0x22, 0x04, + 0x08, 0x0f, 0x10, 0x0f, 0x2a, 0x27, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x55, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x4f, 0x43, 0x41, 0x4c, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x45, 0x41, 0x4d, 0x31, 0x10, 0x02, 0x42, 0x44, 0x5a, + 0x42, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x41, 0x6c, 0x69, 0x63, + 0x65, 0x4f, 0x32, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x2f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x74, 0x72, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x3b, 0x63, 0x74, 0x70, + 0x65, 0x63, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_protos_ctp_status_proto_rawDescOnce sync.Once + file_protos_ctp_status_proto_rawDescData = file_protos_ctp_status_proto_rawDesc +) + +func file_protos_ctp_status_proto_rawDescGZIP() []byte { + file_protos_ctp_status_proto_rawDescOnce.Do(func() { + file_protos_ctp_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_protos_ctp_status_proto_rawDescData) + }) + return file_protos_ctp_status_proto_rawDescData +} + +var file_protos_ctp_status_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_protos_ctp_status_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_protos_ctp_status_proto_goTypes = []interface{}{ + (Detector)(0), // 0: ctp_status.Detector + (Clock)(0), // 1: ctp_status.Clock + (*DetectorInfo)(nil), // 2: ctp_status.DetectorInfo + (*Status)(nil), // 3: ctp_status.Status +} +var file_protos_ctp_status_proto_depIdxs = []int32{ + 0, // 0: ctp_status.DetectorInfo.detector:type_name -> ctp_status.Detector + 2, // 1: ctp_status.Status.detector_info:type_name -> ctp_status.DetectorInfo + 1, // 2: ctp_status.Status.clock:type_name -> ctp_status.Clock + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_protos_ctp_status_proto_init() } +func file_protos_ctp_status_proto_init() { + if File_protos_ctp_status_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_protos_ctp_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DetectorInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protos_ctp_status_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Status); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_protos_ctp_status_proto_rawDesc, + NumEnums: 2, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_protos_ctp_status_proto_goTypes, + DependencyIndexes: file_protos_ctp_status_proto_depIdxs, + EnumInfos: file_protos_ctp_status_proto_enumTypes, + MessageInfos: file_protos_ctp_status_proto_msgTypes, + }.Build() + File_protos_ctp_status_proto = out.File + file_protos_ctp_status_proto_rawDesc = nil + file_protos_ctp_status_proto_goTypes = nil + file_protos_ctp_status_proto_depIdxs = nil +} diff --git a/core/integration/trg/protos/ctp_status.proto b/core/integration/trg/protos/ctp_status.proto new file mode 100644 index 000000000..78b153d3b --- /dev/null +++ b/core/integration/trg/protos/ctp_status.proto @@ -0,0 +1,46 @@ +syntax="proto3"; + +package ctp_status; +option go_package = "github.com/AliceO2Group/Control/core/integration/trg/protos;ctpecs"; + + +enum Detector { +NULL_DETECTOR = 0; +reserved 1; // CPV was removed during YETS 2024-2025 +reserved 2; // EMC not using holdover +reserved 3; // FDD not using holdover +reserved 4; // FT0 not using holdover +reserved 5; // FV0 not using holdover +ITS = 6; +reserved 7; // HMP not using holdover +MCH = 8; +MFT = 9; +reserved 10; // MID not using holdover +reserved 11; // PHS was removed during YETS 2024-2025 +reserved 12; // TOF not using holdover +TPC = 13; +reserved 14; // TRD not using holdover +reserved 15; // ZDC not using holdover +} + + +message DetectorInfo { +Detector detector = 1; +bool holdover_ongoing = 2; // detector:holdover, holdover=True if holdover ON or holdover OFF not finished, holdover=False if holdover procedure finished +} + + +enum Clock { +NULL = 0; +LOCAL = 1; +BEAM1 = 2; +} + +message Status { // General status message for kafka + +uint64 timestamp_nano = 1; // nanoseconds since epoch or whatever precision you can offer +repeated DetectorInfo detector_info = 2; +Clock clock = 3; +uint32 clock_transition_expected = 4; // Integer, values only 90,60,30,0 +bool ready = 5; // True if no holdover for any detector and clocktransition=0, False otherwise +} \ No newline at end of file From edb17247645d9bd99530358f8c6647ac80963289 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 23 Jan 2026 16:13:12 +0100 Subject: [PATCH 2259/2352] Inform operators of CTP clock transitions and detectors in holdover Closes OCTRL-1040 --- core/integration/trg/ctp_status_reader.go | 72 +++++++++ core/integration/trg/plugin.go | 183 +++++++++++++++++++--- 2 files changed, 237 insertions(+), 18 deletions(-) create mode 100644 core/integration/trg/ctp_status_reader.go diff --git a/core/integration/trg/ctp_status_reader.go b/core/integration/trg/ctp_status_reader.go new file mode 100644 index 000000000..37de809ce --- /dev/null +++ b/core/integration/trg/ctp_status_reader.go @@ -0,0 +1,72 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Piotr Konopka + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package trg + +import ( + "context" + "fmt" + + trgpb "github.com/AliceO2Group/Control/core/integration/trg/protos" + "github.com/segmentio/kafka-go" + "github.com/spf13/viper" + "google.golang.org/protobuf/proto" +) + +// CtpStatusReader reads CTP status messages from Kafka +type CtpStatusReader struct { + *kafka.Reader +} + +// NewCtpStatusReader creates a new reader for CTP status messages +func NewCtpStatusReader(topic string, groupID string) *CtpStatusReader { + cfg := kafka.ReaderConfig{ + Brokers: viper.GetStringSlice("kafkaEndpoints"), + Topic: topic, + GroupID: groupID, + MinBytes: 1, + MaxBytes: 10e7, + } + + return &CtpStatusReader{ + Reader: kafka.NewReader(cfg), + } +} + +// Next reads the next CTP status message from Kafka +func (r *CtpStatusReader) Next(ctx context.Context) (*trgpb.Status, error) { + if r == nil { + return nil, fmt.Errorf("nil reader") + } + msg, err := r.ReadMessage(ctx) + if err != nil { + return nil, err + } + + var status trgpb.Status + if err := proto.Unmarshal(msg.Value, &status); err != nil { + return nil, fmt.Errorf("failed to unmarshal CTP status message: %w", err) + } + return &status, nil +} diff --git a/core/integration/trg/plugin.go b/core/integration/trg/plugin.go index 75a90b7da..13eae9444 100644 --- a/core/integration/trg/plugin.go +++ b/core/integration/trg/plugin.go @@ -32,7 +32,9 @@ package trg import ( "context" "encoding/json" + "errors" "fmt" + "io" "net/url" "strconv" "strings" @@ -65,25 +67,37 @@ const ( TOPIC = topic.IntegratedService + topic.Separator + "trg" ) +var ctpStatusTopic topic.Topic = "ctp.status" + type Plugin struct { trgHost string trgPort int - trgClient *RpcClient + trgClient *RpcClient + trgClientCancel context.CancelFunc + + kafkaReader *CtpStatusReader + kafkaReaderCtx context.Context + kafkaReaderCancel context.CancelFunc pendingRunStops map[string] /*envId*/ int64 pendingRunUnloads map[string] /*envId*/ int64 - cachedStatus *TrgStatus - cachedStatusMu sync.RWMutex - cachedStatusCancelFunc context.CancelFunc + cachedStatus *TrgStatus + cachedStatusMu sync.RWMutex } type TrgStatus struct { + // Fields from TRG RunList queries RunCount int `json:"runCount,omitempty"` Lines []string `json:"lines,omitempty"` Structured Runs `json:"structured,omitempty"` EnvMap map[uid.ID]Run `json:"envMap,omitempty"` + + // Fields from CTP status Kafka messages + Clock string `json:"clock,omitempty"` + DetectorsInHoldover []string `json:"detectorsInHoldover,omitempty"` + ClockTransitionExpectedTime int64 `json:"clockTransitionExpectedTime,omitempty"` // nanoseconds since epoch, 0 if not expected } func NewPlugin(endpoint string) integration.Plugin { @@ -103,6 +117,7 @@ func NewPlugin(endpoint string) integration.Plugin { trgClient: nil, pendingRunStops: make(map[string]int64), pendingRunUnloads: make(map[string]int64), + cachedStatus: &TrgStatus{}, } } @@ -190,15 +205,11 @@ func (p *Plugin) queryRunList() { } } - out := &TrgStatus{ - RunCount: int(runReply.Rc), - Lines: strings.Split(runReply.Msg, "\n"), - Structured: structured, - EnvMap: envMap, - } - p.cachedStatusMu.Lock() - p.cachedStatus = out + p.cachedStatus.RunCount = int(runReply.Rc) + p.cachedStatus.Lines = strings.Split(runReply.Msg, "\n") + p.cachedStatus.Structured = structured + p.cachedStatus.EnvMap = envMap p.cachedStatusMu.Unlock() } @@ -232,10 +243,6 @@ func (p *Plugin) GetEnvironmentsData(envIds []uid.ID) map[uid.ID]string { defer p.cachedStatusMu.RUnlock() out := make(map[uid.ID]string) - - if p.cachedStatus == nil { - return nil - } envMap := p.cachedStatus.EnvMap for _, envId := range envIds { if run, ok := envMap[envId]; !ok { @@ -268,7 +275,7 @@ func (p *Plugin) Init(instanceId string) error { } var ctx context.Context - ctx, p.cachedStatusCancelFunc = context.WithCancel(context.Background()) + ctx, p.trgClientCancel = context.WithCancel(context.Background()) trgPollingInterval := viper.GetDuration("trgPollingInterval") @@ -284,6 +291,21 @@ func (p *Plugin) Init(instanceId string) error { } } }() + + // Initialize CTP status reader + p.kafkaReaderCtx, p.kafkaReaderCancel = context.WithCancel(context.Background()) + p.kafkaReader = NewCtpStatusReader(string(ctpStatusTopic), "o2-aliecs-core.trg") + if p.kafkaReader != nil { + log.WithField("level", infologger.IL_Devel).Info("TRG plugin: draining CTP status backlog") + p.drainCtpStatusBacklog(2 * time.Second) + + // Start reading CTP status updates + go p.readCtpStatusUpdates() + } else { + log.WithField("level", infologger.IL_Support). + Warn("could not create CTP status reader, CTP status monitoring disabled") + } + return nil } @@ -1435,7 +1457,132 @@ func (p *Plugin) parseDetectors(ctsDetectorsParam string) (detectors string, err return } +func (p *Plugin) drainCtpStatusBacklog(timeout time.Duration) { + drainCtx, cancel := context.WithTimeout(p.kafkaReaderCtx, timeout) + defer cancel() + for { + ctpStatus, err := p.kafkaReader.Next(drainCtx) + if err != nil { + if errors.Is(err, context.DeadlineExceeded) || errors.Is(err, io.EOF) || errors.Is(err, context.Canceled) { + break + } + // transient error: small sleep and continue until timeout + time.Sleep(50 * time.Millisecond) + continue + } + if ctpStatus == nil { + continue + } + + detectorsInHoldover := extractDetectorsInHoldover(ctpStatus) + clockTransitionTimeExpected := extractClockTransitionExpected(ctpStatus) + currentClock := ctpStatus.Clock.String() + + p.cachedStatusMu.Lock() + p.cachedStatus.Clock = currentClock + p.cachedStatus.DetectorsInHoldover = detectorsInHoldover + p.cachedStatus.ClockTransitionExpectedTime = clockTransitionTimeExpected + p.cachedStatusMu.Unlock() + } +} + +func extractClockTransitionExpected(ctpStatus *trgpb.Status) int64 { + var clockTransitionTimeExpected int64 + if ctpStatus.ClockTransitionExpected > 0 { + clockTransitionTimeExpected = int64(ctpStatus.TimestampNano) + int64(ctpStatus.ClockTransitionExpected)*1e9 + } + return clockTransitionTimeExpected +} + +func extractDetectorsInHoldover(ctpStatus *trgpb.Status) []string { + var detectorsInHoldover []string + for _, detInfo := range ctpStatus.DetectorInfo { + if detInfo.HoldoverOngoing { + detectorsInHoldover = append(detectorsInHoldover, detInfo.Detector.String()) + } + } + return detectorsInHoldover +} + +func (p *Plugin) readCtpStatusUpdates() { + for { + ctpStatus, err := p.kafkaReader.Next(p.kafkaReaderCtx) + if errors.Is(err, io.EOF) { + log.WithField(infologger.Level, infologger.IL_Support). + Debug("received EOF from CTP status reader, likely reading was cancelled, exiting") + break + } + if err != nil { + log.WithField(infologger.Level, infologger.IL_Support). + WithError(err). + Error("error while reading CTP status from Kafka") + time.Sleep(time.Second * 1) // throttle to avoid spamming infologger + continue + } + if ctpStatus == nil { + continue + } + + detectorsInHoldover := extractDetectorsInHoldover(ctpStatus) + clockTransitionExpectedTime := extractClockTransitionExpected(ctpStatus) + currentClock := ctpStatus.Clock.String() + + p.cachedStatusMu.Lock() + previousExpectedClockTransitionTime := p.cachedStatus.ClockTransitionExpectedTime + previousDetectorsInHoldover := p.cachedStatus.DetectorsInHoldover + + p.cachedStatus.Clock = currentClock + p.cachedStatus.DetectorsInHoldover = detectorsInHoldover + p.cachedStatus.ClockTransitionExpectedTime = clockTransitionExpectedTime + p.cachedStatusMu.Unlock() + + p.reportCtpStatus(ctpStatus.ClockTransitionExpected, previousExpectedClockTransitionTime, detectorsInHoldover, previousDetectorsInHoldover) + } +} + +func (p *Plugin) reportCtpStatus(clockTransitionExpected uint32, previousExpectedClockTransitionTime int64, detectorsInHoldover []string, previousDetectorsInHoldover []string) { + + if clockTransitionExpected == 0 && previousExpectedClockTransitionTime == 0 && len(detectorsInHoldover) == 0 && len(previousDetectorsInHoldover) == 0 { + // nothing interesting happening in CTP, don't report anything + return + } + + msg := "" + if clockTransitionExpected > 0 { + msg += fmt.Sprintf("Clock transition expected in less than %ds. ", clockTransitionExpected) + } else if clockTransitionExpected == 0 && previousExpectedClockTransitionTime > 0 { + msg += "Clock transition has just been performed. " + } else { + // clock transition was not and is not expected, noop + } + + if len(detectorsInHoldover) > 0 { + msg += fmt.Sprintf("Detectors in Holdover: %s. ", strings.Join(detectorsInHoldover, ", ")) + } else { + msg += "No detectors in Holdover. " + } + + if clockTransitionExpected > 0 { + msg += "Starting a trigger run with ANY detector may cause instabilities." + log.WithField(infologger.Level, infologger.IL_Ops).Warn(msg) + } else if len(detectorsInHoldover) > 0 { + msg += "Starting a trigger run with these detectors may cause instabilities." + log.WithField(infologger.Level, infologger.IL_Ops).Warn(msg) + } else { + msg += "It is safe to start trigger runs." + log.WithField(infologger.Level, infologger.IL_Ops).Info(msg) + } +} + func (p *Plugin) Destroy() error { - p.cachedStatusCancelFunc() + p.trgClientCancel() + + if p.kafkaReaderCancel != nil { + p.kafkaReaderCancel() + } + if p.kafkaReader != nil { + _ = p.kafkaReader.Close() + } + return p.trgClient.Close() } From 9dab259c85bd0081b5eff65c6bf73fa2c4b0ec9c Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Thu, 29 Jan 2026 08:47:31 +0100 Subject: [PATCH 2260/2352] Bump to v1.48.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 8bbf43827..bc324f078 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 47 +VERSION_MINOR := 48 VERSION_PATCH := 0 From a6ad63f1f95f6a06df2c84b55d8fb7c66833cd22 Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Fri, 6 Feb 2026 14:16:27 +0100 Subject: [PATCH 2261/2352] Properly link to C gRPC Needed to compile on the latest gRPC --- occ/protos/CMakeLists.txt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/occ/protos/CMakeLists.txt b/occ/protos/CMakeLists.txt index 554abbdfa..c3dd36b66 100644 --- a/occ/protos/CMakeLists.txt +++ b/occ/protos/CMakeLists.txt @@ -27,8 +27,9 @@ set(PROTO_IMPORT_DIR "${CMAKE_CURRENT_LIST_DIR}") file(MAKE_DIRECTORY ${PROTO_GENERATED_DIR}) add_library(Occ-proto OBJECT "${CMAKE_CURRENT_LIST_DIR}/occ.proto") -target_link_libraries(Occ-proto PUBLIC - protobuf::libprotobuf +target_link_libraries(Occ-proto PUBLIC + protobuf::libprotobuf + gRPC::grpc gRPC::grpc++ gRPC::grpc++_reflection ) From 86e25966c55b85e322b6227d39058ca73b9f3a07 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 6 Feb 2026 14:26:24 +0100 Subject: [PATCH 2262/2352] Bump to v1.48.1 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index bc324f078..de713e2b9 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 48 -VERSION_PATCH := 0 +VERSION_PATCH := 1 From de685b2209682f64109df1d9b3d9633b5633b264 Mon Sep 17 00:00:00 2001 From: Sergio Garcia Date: Mon, 9 Feb 2026 14:40:02 +0100 Subject: [PATCH 2263/2352] Properly link to C gRPC in all CMakeLists --- occ/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/occ/CMakeLists.txt b/occ/CMakeLists.txt index b8692da52..f1fdc6248 100644 --- a/occ/CMakeLists.txt +++ b/occ/CMakeLists.txt @@ -391,6 +391,7 @@ add_library(${OCCLITE} SHARED target_link_libraries(${OCCLITE} PRIVATE FairMQ::FairMQ + gRPC::grpc gRPC::grpc++ gRPC::grpc++_reflection Boost::program_options) From 59b9510be801599be5257e303fb664da97dc3fa1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 10 Feb 2026 00:32:09 +0000 Subject: [PATCH 2264/2352] Bump github.com/go-git/go-git/v5 from 5.13.0 to 5.16.5 Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.13.0 to 5.16.5. - [Release notes](https://github.com/go-git/go-git/releases) - [Commits](https://github.com/go-git/go-git/compare/v5.13.0...v5.16.5) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.16.5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 18 +++++++++--------- go.sum | 44 ++++++++++++++++++++++---------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/go.mod b/go.mod index 90a854904..e117e4178 100644 --- a/go.mod +++ b/go.mod @@ -24,13 +24,13 @@ require ( github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/briandowns/spinner v1.23.0 github.com/denisbrodbeck/machineid v1.0.1 github.com/dmarkham/enumer v1.5.11 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.7.4 - github.com/go-git/go-git/v5 v5.13.0 + github.com/go-git/go-git/v5 v5.16.5 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 @@ -84,27 +84,27 @@ require ( require ( github.com/KyleBanks/depth v1.2.1 // indirect - github.com/ProtonMail/go-crypto v1.1.3 // indirect + github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cloudflare/circl v1.6.1 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyphar/filepath-securejoin v0.2.5 // indirect + github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.0 // indirect + github.com/go-git/go-billy/v5 v5.6.2 // indirect github.com/go-logr/logr v1.4.1 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect @@ -139,7 +139,7 @@ require ( github.com/pascaldekloe/name v1.0.1 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect + github.com/pjbgf/sha1cd v0.3.2 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.50.0 // indirect @@ -149,7 +149,7 @@ require ( github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect - github.com/skeema/knownhosts v1.3.0 // indirect + github.com/skeema/knownhosts v1.3.1 // indirect github.com/sony/sonyflake v1.2.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect diff --git a/go.sum b/go.sum index c589d794f..372c21511 100644 --- a/go.sum +++ b/go.sum @@ -11,10 +11,10 @@ github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF0 github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= -github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= -github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw= +github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -45,8 +45,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= -github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= +github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -55,8 +55,8 @@ github.com/denisbrodbeck/machineid v1.0.1 h1:geKr9qtkB876mXguW2X6TU4ZynleN6ezuMS github.com/denisbrodbeck/machineid v1.0.1/go.mod h1:dJUwb7PTidGDeYyUBmXZ2GphQBbjJCrnectwCyxcUSI= github.com/dmarkham/enumer v1.5.11 h1:quorLCaEfzjJ23Pf7PB9lyyaHseh91YfTM/sAD/4Mbo= github.com/dmarkham/enumer v1.5.11/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8= -github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= -github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= +github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= +github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= @@ -86,12 +86,12 @@ github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= -github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= +github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= +github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= -github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= +github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= +github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -115,8 +115,8 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ= +github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -129,8 +129,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= @@ -313,8 +313,8 @@ github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdU github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= +github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -355,8 +355,8 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -379,8 +379,8 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= -github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= +github.com/skeema/knownhosts v1.3.1 h1:X2osQ+RAjK76shCbvhHHHVl3ZlgDm8apHEHFqRjnBY8= +github.com/skeema/knownhosts v1.3.1/go.mod h1:r7KTdC8l4uxWRyK2TpQZ/1o5HaSzh06ePQNxPwTcfiY= github.com/sony/sonyflake v1.2.0 h1:Pfr3A+ejSg+0SPqpoAmQgEtNDAhc2G1SUYk205qVMLQ= github.com/sony/sonyflake v1.2.0/go.mod h1:LORtCywH/cq10ZbyfhKrHYgAUGH7mOBa76enV9txy/Y= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= From cc9a741564476f5c5d585f045010b7ffe5e91428 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 11 Feb 2026 12:26:02 +0100 Subject: [PATCH 2265/2352] Bump to v1.48.2 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index de713e2b9..d437d24c4 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 VERSION_MINOR := 48 -VERSION_PATCH := 1 +VERSION_PATCH := 2 From bf6011ac10b30178200ab6e7c06e7461af19e6df Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 11 Feb 2026 14:20:16 +0100 Subject: [PATCH 2266/2352] Update make reference with `make coverage` and `DEBUG` --- docs/makefile_reference.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/makefile_reference.md b/docs/makefile_reference.md index 657d54366..1b894d99e 100644 --- a/docs/makefile_reference.md +++ b/docs/makefile_reference.md @@ -19,5 +19,8 @@ AliECS comes with a `make`-based build system, with all `.PHONY` targets. | `make tools/protoc` | ensures `protoc-gen-go` is present (included in `make tools`) | | `make doc`
`make docs` | regenerates command reference documentation for command line tools | | `make help` | displays inline documentation | +| `make coverage` | builds a test coverage report | The variable `WHAT` is obeyed by `make build` (or `make`) and `make install` in order to customize the components to build. For example `make WHAT=coconut install` builds and installs only `coconut`. By default `WHAT` includes all components. + +Add `DEBUG=1` before `make` to enable non-optimized, debug builds. From f7f5d95dd75effd05a3ef0248f2885446af7bafe Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 17 Feb 2026 16:29:12 +0100 Subject: [PATCH 2267/2352] Toy model for imitating O2 software memory usage in K8s Closes OCTRL-1079 --- hacking/o2-software-model/README.md | 27 ++ hacking/o2-software-model/allocate.py | 265 ++++++++++++++++++ .../o2-software-model/mem-allocate-test.yaml | 153 ++++++++++ hacking/o2-software-model/mem_guard.py | 87 ++++++ 4 files changed, 532 insertions(+) create mode 100644 hacking/o2-software-model/README.md create mode 100755 hacking/o2-software-model/allocate.py create mode 100644 hacking/o2-software-model/mem-allocate-test.yaml create mode 100755 hacking/o2-software-model/mem_guard.py diff --git a/hacking/o2-software-model/README.md b/hacking/o2-software-model/README.md new file mode 100644 index 000000000..9aec94435 --- /dev/null +++ b/hacking/o2-software-model/README.md @@ -0,0 +1,27 @@ +# O2 software toy model + +This directory contains a toy model which pretends to be O2 software in terms of how it uses memory and runs on a K8s cluster. +The manifest file declares an init container which creates a shared memory segment and two identical `memory-user` containers which write to anonymous and/or shared memory with specified rates. +One can set memory requests and limits to the containers and observe the behaviour. + +The manifest also includes a `mem-guard` container, which monitors anonymous memory usage of `memory-user`s and kills them when they go above a set threshold. + +See the manifest and environment variables inside for configuring memory consumption rates and thresholds. + +See OCTRL-1079 for more context and info which was understood using this model. +## Running + +1. Add `allocate.py` and `mem_guard.py` scripts to a configmap. This way we can reuse the official python image as-is. + +``` +kubectl create configmap allocate-script \ + --from-file=allocate.py=./allocate.py \ + --from-file=mem_guard.py=./mem_guard.py \ + -o yaml --dry-run=client | kubectl apply -f - +``` + +2. Apply the manifest + +``` +kubectl apply -f mem-allocate-test.yaml +``` diff --git a/hacking/o2-software-model/allocate.py b/hacking/o2-software-model/allocate.py new file mode 100755 index 000000000..8d23a753c --- /dev/null +++ b/hacking/o2-software-model/allocate.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +import argparse +import mmap +import os +import sys +import time + + +def parse_args(): + p = argparse.ArgumentParser( + description="Memory load generator: private allocation + shmem(tmpfs file) mmap read/write." + ) + + # Private memory + p.add_argument("--private-rate-bps", type=int, default=0, + help="Private memory allocation+fill rate in bytes/sec. 0 disables.") + p.add_argument("--private-bytes", type=int, default=0, + help="Optional cap for private bytes to allocate. 0 means no cap (grow forever).") + p.add_argument("--private-chunk-bytes", type=int, default=4 * 1024 * 1024, + help="Chunk size for private allocations (bytes). Default 4MiB.") + p.add_argument("--page-touch-bytes", type=int, default=4096, + help="Stride for touching/filling memory to force residency. Default 4096.") + + # Shmem mmap activity + p.add_argument("--shmem-path", type=str, default="", + help="Path to a shmem/tmpfs-backed file (e.g. /dev/shm/segment.bin).") + p.add_argument("--shmem-bytes", type=int, default=0, + help="Ensure shmem file size is at least this many bytes (create/truncate). 0 = don't change size.") + p.add_argument("--shmem-read-rate-bps", type=int, default=0, + help="Read rate from shmem mapping in bytes/sec. Only reads if > 0.") + p.add_argument("--shmem-write-rate-bps", type=int, default=0, + help="Write rate to shmem mapping in bytes/sec. Only writes if > 0.") + + # Loop control + p.add_argument("--tick-ms", type=int, default=50, + help="Control loop tick in milliseconds. Default 50ms.") + p.add_argument("--report-every-s", type=float, default=2.0, + help="Print status every N seconds. Default 2s.") + + return p.parse_args() + + +def touch_buffer(buf: bytearray, stride: int): + """Touch/dirty memory with given stride to force page allocation.""" + n = len(buf) + if n == 0: + return + v = int(time.time_ns() & 0xFF) + for i in range(0, n, stride): + buf[i] = (buf[i] + v + (i & 0xFF)) & 0xFF + + +def ensure_file_size(path: str, size: int): + fd = os.open(path, os.O_RDWR | os.O_CREAT, 0o666) + try: + os.ftruncate(fd, size) + finally: + os.close(fd) + + +def main(): + args = parse_args() + + for name, v in [ + ("--private-rate-bps", args.private_rate_bps), + ("--shmem-read-rate-bps", args.shmem_read_rate_bps), + ("--shmem-write-rate-bps", args.shmem_write_rate_bps), + ]: + if v < 0: + print(f"{name} must be >= 0", file=sys.stderr) + return 2 + + if args.private_chunk_bytes <= 0: + print("--private-chunk-bytes must be > 0", file=sys.stderr) + return 2 + if args.page_touch_bytes <= 0: + print("--page-touch-bytes must be > 0", file=sys.stderr) + return 2 + + tick = args.tick_ms / 1000.0 + report_every = args.report_every_s + + # Private memory state + private_chunks: list[bytearray] = [] + private_allocated = 0 + + # Shmem state + shmem_fd = None + shmem_mm = None + shmem_size = 0 + shmem_r_off = 0 + shmem_w_off = 0 + shmem_read_total = 0 + shmem_written_total = 0 + + need_shmem = (args.shmem_read_rate_bps > 0) or (args.shmem_write_rate_bps > 0) + if need_shmem: + if not args.shmem_path: + print("shmem activity requested but --shmem-path is empty", file=sys.stderr) + return 2 + + if args.shmem_bytes > 0: + try: + ensure_file_size(args.shmem_path, args.shmem_bytes) + except Exception as e: + print(f"Failed to create/size shmem file: {e}", file=sys.stderr) + return 2 + + # For mmap write, we need RDWR; for read-only, RDONLY is enough + open_flags = os.O_RDONLY if args.shmem_write_rate_bps == 0 else os.O_RDWR + try: + shmem_fd = os.open(args.shmem_path, open_flags) + st = os.fstat(shmem_fd) + shmem_size = st.st_size + if shmem_size <= 0: + raise RuntimeError("shmem file size is 0; set --shmem-bytes to something > 0") + + access = mmap.ACCESS_READ if args.shmem_write_rate_bps == 0 else mmap.ACCESS_WRITE + shmem_mm = mmap.mmap(shmem_fd, shmem_size, access=access) + except Exception as e: + if shmem_fd is not None: + try: + os.close(shmem_fd) + except Exception: + pass + print(f"Failed to open/mmap shmem file: {e}", file=sys.stderr) + return 2 + + last = time.monotonic() + last_report = last + + private_budget = 0.0 + shmem_read_budget = 0.0 + shmem_write_budget = 0.0 + + # A tiny accumulator so reads can't be optimized away + checksum = 0 + + try: + while True: + now = time.monotonic() + dt = now - last + last = now + + private_budget += args.private_rate_bps * dt + shmem_read_budget += args.shmem_read_rate_bps * dt + shmem_write_budget += args.shmem_write_rate_bps * dt + + # --- Private allocation (allocate + touch) --- + if args.private_rate_bps > 0: + cap = args.private_bytes + while private_budget >= 1: + if cap > 0 and private_allocated >= cap: + private_budget = 0 + break + + chunk = args.private_chunk_bytes + if cap > 0: + remaining = cap - private_allocated + if remaining <= 0: + private_budget = 0 + break + if remaining < chunk: + chunk = remaining + + if private_budget < chunk: + chunk = int(private_budget) + if chunk < 64 * 1024: + break + + buf = bytearray(chunk) + touch_buffer(buf, args.page_touch_bytes) + private_chunks.append(buf) + private_allocated += chunk + private_budget -= chunk + + # --- Shmem mmap write: touches mapped pages, should increase RES/SHR --- + if shmem_mm is not None and args.shmem_write_rate_bps > 0: + while shmem_write_budget >= 1: + to_write = int(shmem_write_budget) + if to_write <= 0: + break + + if shmem_w_off >= shmem_size: + shmem_w_off = 0 + + n = min(to_write, shmem_size - shmem_w_off) + if n <= 0: + shmem_w_off = 0 + break + + # Touch each page once (or more if n is large) to fault pages in. + stride = 4096 + v = int(time.time_ns() & 0xFF) + end = shmem_w_off + n + for off in range(shmem_w_off, end, stride): + shmem_mm[off] = (shmem_mm[off] + v) & 0xFF + + shmem_w_off = end + shmem_written_total += n + shmem_write_budget -= n + + if shmem_w_off >= shmem_size: + shmem_w_off = 0 + + # --- Shmem mmap read: faults pages in (RES/SHR can still rise), no dirtying --- + if shmem_mm is not None and args.shmem_read_rate_bps > 0: + while shmem_read_budget >= 1: + to_read = int(shmem_read_budget) + if to_read <= 0: + break + + if shmem_r_off >= shmem_size: + shmem_r_off = 0 + + n = min(to_read, shmem_size - shmem_r_off) + if n <= 0: + shmem_r_off = 0 + break + + stride = 4096 + end = shmem_r_off + n + for off in range(shmem_r_off, end, stride): + checksum ^= shmem_mm[off] + + shmem_r_off = end + shmem_read_total += n + shmem_read_budget -= n + + if shmem_r_off >= shmem_size: + shmem_r_off = 0 + + # --- Reporting --- + if now - last_report >= report_every: + last_report = now + parts = [f"private_allocated={private_allocated}B"] + if shmem_mm is not None: + parts.append(f"shmem_size={shmem_size}B") + parts.append(f"shmem_written_total={shmem_written_total}B") + parts.append(f"shmem_read_total={shmem_read_total}B") + parts.append(f"checksum={checksum}") + parts.append(f"shmem_path={args.shmem_path}") + print(" ".join(parts), flush=True) + + time.sleep(tick) + + except KeyboardInterrupt: + print("\nExiting.", file=sys.stderr) + finally: + if shmem_mm is not None: + try: + shmem_mm.close() + except Exception: + pass + if shmem_fd is not None: + try: + os.close(shmem_fd) + except Exception: + pass + + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/hacking/o2-software-model/mem-allocate-test.yaml b/hacking/o2-software-model/mem-allocate-test.yaml new file mode 100644 index 000000000..acf41e4ba --- /dev/null +++ b/hacking/o2-software-model/mem-allocate-test.yaml @@ -0,0 +1,153 @@ +apiVersion: v1 +kind: Pod +metadata: + name: allocate + labels: + app: allocate +spec: + restartPolicy: Always + shareProcessNamespace: true + initContainers: + - name: shmem-init + image: python:3.14-alpine + imagePullPolicy: IfNotPresent + restartPolicy: Never + command: ["python3", "-c"] + args: + - | + import os + + path = "/dev/shm/test1" + size = int(os.environ.get("SHMEM_BYTES", "1073741824")) + + fd = os.open(path, os.O_RDWR | os.O_CREAT, 0o666) + os.ftruncate(fd, size) + os.close(fd) + + st = os.stat(path) + print(f"Created {path} size={st.st_size}") + env: + - name: SHMEM_BYTES + value: "2000000000" #"1073741824" + volumeMounts: + - name: dshm + mountPath: /dev/shm + containers: + - name: memory-user-1 + image: python:3.14-alpine + imagePullPolicy: IfNotPresent + command: ["/bin/sh", "-lc"] + args: + - | + set -eux + python3 --version + ls -l /scripts + ls -lh /dev/shm/test1 + + exec python3 /scripts/allocate.py \ + --private-rate-bps "${PRIVATE_RATE_BPS:-0}" \ + --private-bytes "${PRIVATE_BYTES:-0}" \ + --shmem-path /dev/shm/test1 \ + --shmem-read-rate-bps "${SHMEM_READ_RATE_BPS:-0}" \ + --shmem-write-rate-bps "${SHMEM_WRITE_RATE_BPS:-0}" \ + --report-every-s 2 + env: + - name: PRIVATE_RATE_BPS + value: "100000000" + - name: PRIVATE_BYTES + value: "500000000" + - name: SHMEM_READ_RATE_BPS + value: "0" + - name: SHMEM_WRITE_RATE_BPS + value: "200000000" #"209715200" + volumeMounts: + - name: scripts + mountPath: /scripts + readOnly: true + - name: dshm + mountPath: /dev/shm + resources: + requests: + memory: "100Mi" + cpu: "1" + limits: + memory: "5000Mi" + cpu: "2" + - name: memory-user-2 + image: python:3.14-alpine + imagePullPolicy: IfNotPresent + command: [ "/bin/sh", "-lc" ] + args: + - | + set -eux + python3 --version + ls -l /scripts + ls -lh /dev/shm/test1 + + exec python3 /scripts/allocate.py \ + --private-rate-bps "${PRIVATE_RATE_BPS:-0}" \ + --private-bytes "${PRIVATE_BYTES:-0}" \ + --shmem-path /dev/shm/test1 \ + --shmem-read-rate-bps "${SHMEM_READ_RATE_BPS:-0}" \ + --shmem-write-rate-bps "${SHMEM_WRITE_RATE_BPS:-0}" \ + --report-every-s 2 + env: + - name: PRIVATE_RATE_BPS + value: "100000000" + - name: PRIVATE_BYTES + value: "1000000000" + - name: SHMEM_READ_RATE_BPS + value: "0" + - name: SHMEM_WRITE_RATE_BPS + value: "200000000" #"209715200" + volumeMounts: + - name: scripts + mountPath: /scripts + readOnly: true + - name: dshm + mountPath: /dev/shm + resources: + requests: + memory: "100Mi" + cpu: "1" + limits: + memory: "5000Mi" + cpu: "2" + - name: mem-guard + image: python:3.14-alpine + imagePullPolicy: IfNotPresent + securityContext: + runAsUser: 0 + allowPrivilegeEscalation: false + capabilities: + add: + - KILL + - SYS_PTRACE + env: + - name: TARGET_SUBSTR + value: "/scripts/allocate.py" + - name: ANON_THRESHOLD_KB + value: "800000" # ~800 MiB anonymous, per matching PID + - name: POLL_INTERVAL_S + value: "1" + command: ["python3", "/scripts/mem_guard.py"] + volumeMounts: + - name: scripts + mountPath: /scripts + readOnly: true + resources: + requests: + cpu: "100m" + memory: "64Mi" + limits: + cpu: "500m" + memory: "256Mi" + volumes: + - name: scripts + configMap: + name: allocate-script + defaultMode: 0555 + - name: dshm + emptyDir: + medium: Memory + sizeLimit: 2Gi diff --git a/hacking/o2-software-model/mem_guard.py b/hacking/o2-software-model/mem_guard.py new file mode 100755 index 000000000..dc7b8c44b --- /dev/null +++ b/hacking/o2-software-model/mem_guard.py @@ -0,0 +1,87 @@ +import os, time, signal, datetime + +TARGET_SUBSTR = os.environ.get("TARGET_SUBSTR", "/scripts/allocate.py") +ANON_THRESHOLD_KB = int(os.environ.get("ANON_THRESHOLD_KB", "800000")) +POLL_INTERVAL_S = float(os.environ.get("POLL_INTERVAL_S", "1")) +LOG_EVERY_S = float(os.environ.get("LOG_EVERY_S", "10")) + +def log(msg: str): + ts = datetime.datetime.utcnow().isoformat(timespec="seconds") + "Z" + print(f"{ts} mem-guard: {msg}", flush=True) + +def read_cmdline(pid: int) -> str: + try: + with open(f"/proc/{pid}/cmdline", "rb") as f: + raw = f.read() + return raw.replace(b"\x00", b" ").decode("utf-8", "replace").strip() + except FileNotFoundError: + return "" + except PermissionError as e: + log(f"cannot read cmdline for pid={pid}: {e}") + return "" + +def anon_kb(pid: int) -> int: + # smaps_rollup is per-process; "Anonymous:" is in kB when present. + path = f"/proc/{pid}/smaps_rollup" + try: + with open(path, "r", encoding="utf-8", errors="replace") as f: + for line in f: + if line.startswith("Anonymous:"): + parts = line.split() + return int(parts[1]) + except FileNotFoundError: + return 0 + except PermissionError as e: + log(f"cannot read smaps_rollup for pid={pid}: {e}") + return 0 + except Exception as e: + log(f"error reading smaps_rollup for pid={pid}: {e}") + return 0 + return 0 + +def kill_pid(pid: int, cmd: str, akb: int): + log(f"action=kill pid={pid} anon_kb={akb} threshold_kb={ANON_THRESHOLD_KB} cmd={cmd!r}") + try: + os.kill(pid, signal.SIGTERM) + log(f"sent SIGTERM pid={pid}") + except ProcessLookupError: + log(f"pid={pid} already gone before SIGTERM") + return + except PermissionError as e: + log(f"permission denied sending SIGTERM pid={pid}: {e}") + return + + time.sleep(0.5) + + try: + os.kill(pid, signal.SIGKILL) + log(f"sent SIGKILL pid={pid}") + except ProcessLookupError: + log(f"pid={pid} exited after SIGTERM") + return + except PermissionError as e: + log(f"permission denied sending SIGKILL pid={pid}: {e}") + return + +log(f"starting; target_substr={TARGET_SUBSTR!r} anon_threshold_kb={ANON_THRESHOLD_KB} poll_interval_s={POLL_INTERVAL_S}") +last_status = 0.0 + +while True: + now = time.time() + if now - last_status >= LOG_EVERY_S: + log("status=ok poll=begin") + last_status = now + + for d in os.listdir("/proc"): + if not d.isdigit(): + continue + pid = int(d) + cmd = read_cmdline(pid) + if not cmd or TARGET_SUBSTR not in cmd: + continue + + akb = anon_kb(pid) + if akb > ANON_THRESHOLD_KB: + kill_pid(pid, cmd, akb) + + time.sleep(POLL_INTERVAL_S) \ No newline at end of file From d734d8c44785da60b94cf9042fecb6aa92f9c575 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 27 Feb 2026 13:17:25 +0100 Subject: [PATCH 2268/2352] [core] fixed race conditions caused by repeated use of GetParent --- core/task/manager.go | 12 +++++------ core/task/task.go | 47 ++++++++++++++++++++++---------------------- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 28d1d0d22..9c96b83d3 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -976,8 +976,8 @@ func (m *Manager) updateTaskState(taskId string, state string) { taskPtr.state = st taskPtr.safeToStop = false taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, State: state, Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateState(st) + if parent := taskPtr.GetParent(); parent != nil { + parent.UpdateState(st) } } @@ -1049,8 +1049,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { WithField("partition", envId.String()). Debug("task active (received TASK_RUNNING event from executor)") taskPtr.status = ACTIVE - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateStatus(ACTIVE) + if parent := taskPtr.GetParent(); parent != nil { + parent.UpdateStatus(ACTIVE) } if status.GetAgentID() != nil { taskPtr.agentId = status.GetAgentID().GetValue() @@ -1062,8 +1062,8 @@ func (m *Manager) updateTaskStatus(status *mesos.TaskStatus) { case mesos.TASK_DROPPED, mesos.TASK_LOST, mesos.TASK_KILLED, mesos.TASK_FAILED, mesos.TASK_ERROR, mesos.TASK_FINISHED: taskPtr.status = INACTIVE - if taskPtr.GetParent() != nil { - taskPtr.GetParent().UpdateStatus(INACTIVE) + if parent := taskPtr.GetParent(); parent != nil { + parent.UpdateStatus(INACTIVE) } } taskPtr.SendEvent(&event.TaskEvent{Name: taskPtr.GetName(), TaskID: taskId, Status: taskPtr.status.String(), Hostname: taskPtr.hostname, ClassName: taskPtr.GetClassName()}) diff --git a/core/task/task.go b/core/task/task.go index 6e7040865..ba3c459e5 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -238,8 +238,9 @@ func (t *Task) GetControlMode() controlmode.ControlMode { // If it's a BASIC task but its parent role uses it as a HOOK, // we modify the actual control mode of the task. // The class itself can never be HOOK, only BASIC - if class.Control.Mode == controlmode.BASIC && t.GetParent() != nil { - traits := t.GetParent().GetTaskTraits() + parent := t.GetParent() + if class.Control.Mode == controlmode.BASIC && parent != nil { + traits := parent.GetTaskTraits() if len(traits.Trigger) > 0 { return controlmode.HOOK } @@ -409,7 +410,7 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { // If it's a HOOK, we must pass the Timeout to the TCI for // executor-side timeout enforcement if cmd.ControlMode == controlmode.HOOK || cmd.ControlMode == controlmode.BASIC { - traits := t.GetParent().GetTaskTraits() + traits := role.GetTaskTraits() cmd.Timeout, err = time.ParseDuration(traits.Timeout) } @@ -579,7 +580,8 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap = make(controlcommands.PropertyMap) if class := t.GetTaskClass(); class != nil { if class.Control.Mode != controlmode.BASIC { // if it's NOT a basic task or hook, we template the props - if t.GetParent() == nil { + parent := t.GetParent() + if parent == nil { err = fmt.Errorf("cannot build property map for parentless task %s (id %s)", t.name, t.taskId) return } @@ -590,7 +592,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // First we get the full varStack from the parent role, and // consolidate it. var varStack map[string]string - varStack, err = t.GetParent().ConsolidatedVarStack() + varStack, err = parent.ConsolidatedVarStack() if err != nil { err = fmt.Errorf("cannot fetch variables stack for property map: %w", err) return @@ -616,7 +618,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // Finally we build the task-specific special values, and write them // into the varStack (overwriting anything). - specialVarStack := t.buildSpecialVarStack(t.GetParent()) + specialVarStack := t.buildSpecialVarStack(parent) for k, v := range specialVarStack { varStack[k] = v } @@ -634,7 +636,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT { - for _, inbCh := range channel.MergeInbound(t.GetParent().CollectInboundChannels(), class.Bind) { + for _, inbCh := range channel.MergeInbound(parent.CollectInboundChannels(), class.Bind) { // We get the FairMQ-formatted propertyMap from the inbound channel spec var chanProps controlcommands.PropertyMap chanProps, err = inbCh.ToFMQMap(t.localBindMap) @@ -647,7 +649,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand propMap[k] = v } } - for _, outboundCh := range channel.MergeOutbound(t.GetParent().CollectOutboundChannels(), class.Connect) { + for _, outboundCh := range channel.MergeOutbound(parent.CollectOutboundChannels(), class.Connect) { // We get the FairMQ-formatted propertyMap from the outbound channel spec var chanProps controlcommands.PropertyMap chanProps, err = outboundCh.ToFMQMap(bindMap) @@ -672,7 +674,7 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand err = fields.Execute(the.ConfSvc(), t.name, varStack, objStack, nil, make(map[string]texttemplate.Template), nil) if err != nil { log.WithError(err). - WithField("partition", t.GetParent().GetEnvironmentId().String()). + WithField("partition", parent.GetEnvironmentId().String()). WithField("detector", detector). Error("cannot resolve templates for property map") return @@ -718,13 +720,14 @@ func (t *Task) GetMesosCommandTarget() controlcommands.MesosCommandTarget { } func (t *Task) GetProperties() map[string]string { - t.mu.RLock() - defer t.mu.RUnlock() - if t == nil { log.Warn("attempted to get properties of nil task") return make(map[string]string) } + + t.mu.RLock() + defer t.mu.RUnlock() + propertiesMap, err := t.properties.Flattened() if err != nil { return make(map[string]string) @@ -733,22 +736,24 @@ func (t *Task) GetProperties() map[string]string { } func (t *Task) setTaskPID(pid int) { - t.mu.Lock() - defer t.mu.Unlock() - if t == nil { return } + + t.mu.Lock() + defer t.mu.Unlock() + t.pid = strconv.Itoa(pid) } func (t *Task) GetTaskPID() string { - t.mu.RLock() - defer t.mu.RUnlock() - if t == nil { return "" } + + t.mu.RLock() + defer t.mu.RUnlock() + return t.pid } @@ -767,11 +772,5 @@ func (t *Task) SetParent(parent parentRole) { } func (t *Task) GetTask() *Task { - if t == nil { - return nil - } - t.mu.RLock() - defer t.mu.RUnlock() - return t } From dd84863ebda88c46ac23785575c9f98c4cbfcc32 Mon Sep 17 00:00:00 2001 From: David Rohr Date: Mon, 2 Mar 2026 20:37:09 +0100 Subject: [PATCH 2269/2352] Fixes for boost 1.90 --- occ/occlib/OccServer.cxx | 7 +++++-- occ/plugin/OccFMQCommon.cxx | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/occ/occlib/OccServer.cxx b/occ/occlib/OccServer.cxx index 347ae8783..48c240956 100644 --- a/occ/occlib/OccServer.cxx +++ b/occ/occlib/OccServer.cxx @@ -23,6 +23,9 @@ * Intergovernmental Organization or submit itself to any jurisdiction. */ +#define BOOST_NO_CXX20_HDR_CONCEPTS // TODO: David Rohr: Fix the + // boost::lockfree::queue, must + // not use trivial constructor!!! #include "OccServer.h" @@ -65,7 +68,7 @@ grpc::Status OccServer::EventStream(grpc::ServerContext* context, const occ_pb::EventStreamRequest* request, grpc::ServerWriter* writer) { - boost::uuids::basic_random_generator gen; + boost::uuids::basic_random_generator gen; std::string id = boost::uuids::to_string(gen()); boost::lockfree::queue eventQueue; @@ -100,7 +103,7 @@ grpc::Status OccServer::StateStream(grpc::ServerContext* context, (void) context; (void) request; - boost::uuids::basic_random_generator gen; + boost::uuids::basic_random_generator gen; std::string id = boost::uuids::to_string(gen()); boost::lockfree::queue stateQueue; diff --git a/occ/plugin/OccFMQCommon.cxx b/occ/plugin/OccFMQCommon.cxx index ea457a950..d37ed0925 100644 --- a/occ/plugin/OccFMQCommon.cxx +++ b/occ/plugin/OccFMQCommon.cxx @@ -28,6 +28,8 @@ #include "util/Defer.h" #include +#include +#include #include std::string generateSubscriptionId(const std::string& prefix) From 4b095d9e500247e5f999387638d54b102173c603 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Feb 2026 19:40:58 +0000 Subject: [PATCH 2270/2352] Bump github.com/cloudflare/circl from 1.6.1 to 1.6.3 Bumps [github.com/cloudflare/circl](https://github.com/cloudflare/circl) from 1.6.1 to 1.6.3. - [Release notes](https://github.com/cloudflare/circl/releases) - [Commits](https://github.com/cloudflare/circl/compare/v1.6.1...v1.6.3) --- updated-dependencies: - dependency-name: github.com/cloudflare/circl dependency-version: 1.6.3 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index e117e4178..c47808e51 100644 --- a/go.mod +++ b/go.mod @@ -88,7 +88,7 @@ require ( github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cloudflare/circl v1.6.1 // indirect + github.com/cloudflare/circl v1.6.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect diff --git a/go.sum b/go.sum index 372c21511..70b2612e7 100644 --- a/go.sum +++ b/go.sum @@ -38,8 +38,8 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= -github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0= -github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs= +github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= +github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= From adbed10c5489d09ba81a2add0800ecb3fd87a192 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Tue, 3 Mar 2026 09:32:10 +0100 Subject: [PATCH 2271/2352] Bump AliECS to v1.49.0 --- VERSION | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/VERSION b/VERSION index d437d24c4..00cbec6bd 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 48 -VERSION_PATCH := 2 +VERSION_MINOR := 49 +VERSION_PATCH := 0 From 654e8e436321196e56cd0b830f5d09a0fe1347a8 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Wed, 8 Apr 2026 17:21:18 +0200 Subject: [PATCH 2272/2352] Minor documentation inconsistency fixes Out of curiosity, I asked an LLM agent to review the documentation against the code and point out inconsistencies. That's what it came with. --- README.md | 2 +- core/integration/README.md | 2 +- docs/building.md | 2 +- docs/running.md | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 4889d30cb..eb4d30be3 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ There are two ways of interacting with AliECS: ### I want to ensure AliECS can **run and control my process** -* **My software is based on FairMQ and/or O² DPL (Data Processing Later)** +* **My software is based on FairMQ and/or O² DPL (Data Processing Layer)** AliECS natively supports FairMQ (and DPL) devices. Head to [ControlWorkflows](https://github.com/AliceO2Group/ControlWorkflows) for instructions on how to configure your software to be controlled by AliECS. diff --git a/core/integration/README.md b/core/integration/README.md index eda781e82..41996b2b9 100644 --- a/core/integration/README.md +++ b/core/integration/README.md @@ -177,7 +177,7 @@ DD scheduler plugin informs the Data Distribution software about the pool of FLP See [Legacy events: Kafka plugin](/docs/kafka.md#legacy-events-kafka-plugin) -# LHC plugin +## LHC This plugin listens to Kafka messages coming from the LHC DIP Client and pushes any relevant internal notifications to the AliECS core. Its main purpose is to provide basic information about ongoing LHC activity (e.g. fill information) to affected parties and allow AliECS to react upon them (e.g. by automatically stopping a physics run when stable beams are over). diff --git a/docs/building.md b/docs/building.md index 0a4243ec9..a692b7f91 100644 --- a/docs/building.md +++ b/docs/building.md @@ -80,7 +80,7 @@ Running `make` will take a while as all dependencies are gathered, built and ins $ make all ``` -You should find several executables including `o2control-core`, `o2control-executor` and `coconut` in `bin`. +You should find several executables including `o2-aliecs-core`, `o2-aliecs-executor` and `coconut` in `bin`. For subsequent builds (after the first one), plain `make` (instead of `make all`) is sufficient. See the [Makefile reference](makefile_reference.md) for more information. diff --git a/docs/running.md b/docs/running.md index 53d80afab..d3fd958fa 100644 --- a/docs/running.md +++ b/docs/running.md @@ -10,7 +10,7 @@ The recommended way to set up a Mesos cluster is by performing a complete deploy The AliECS core on the head node should be stopped (`systemctl stop o2-aliecs-core`) and your own AliECS core should be made to point to the head node. Typically, it can be done by replacing the AliECS core binary on the head node with your own and restarting the `o2-aliecs-core` systemd service. -The following example flags assume a remote head node `centosvmtest`, the use of the default `settings.yaml` file, very verbose output, verbose workflow dumps on every workflow deployment, and the executor having been copied (`scp`) to `/opt/o2control-executor` on all controlled nodes: +The following example flags assume a remote head node `centosvmtest`, the use of the default `settings.yaml` file, very verbose output, verbose workflow dumps on every workflow deployment, and the executor having been copied (`scp`) to `/opt/o2-aliecs-executor` on all controlled nodes: ```bash --coreConfigurationUri @@ -22,7 +22,7 @@ http://centosvmtest:5050/api/v1/scheduler --verbose --veryVerbose --executor -/opt/o2control-executor +/opt/o2-aliecs-executor --dumpWorkflows ``` From 37a4f2ec17a4c9fa978e63985979f11be1b63fbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 13 Apr 2026 10:01:39 +0200 Subject: [PATCH 2273/2352] [peanut] peanut now supports direct, fmq batched and single step modes (#803) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [peanut] peanut now supports direct, fmq batched and single step modes in TUI and CLI modes written using Claude Opus 4.6 * better --help and handling of streams * better error handling --------- Co-authored-by: Michal Tichák --- cmd/peanut/main.go | 83 +++- executor/executorcmd/nopb/occclient.go | 36 +- occ/peanut/README.md | 237 +++++++++-- occ/peanut/cli.go | 434 +++++++++++++++++++++ occ/peanut/flatten/flatten.go | 3 +- occ/peanut/peanut.go | 520 ++++++++++++++++++------- 6 files changed, 1153 insertions(+), 160 deletions(-) create mode 100644 occ/peanut/cli.go diff --git a/cmd/peanut/main.go b/cmd/peanut/main.go index 59ce9efc2..95ca39f02 100644 --- a/cmd/peanut/main.go +++ b/cmd/peanut/main.go @@ -25,17 +25,90 @@ package main import ( + "flag" + "fmt" "os" - "strings" "github.com/AliceO2Group/Control/occ/peanut" ) func main() { - cmdArg := os.Args[1:] - cmdString := strings.Trim(strings.Join(cmdArg, " "), " ") + fs := flag.NewFlagSet("peanut", flag.ExitOnError) + addr := fs.String("addr", "", "OCC gRPC address (host:port); if empty, OCC_CONTROL_PORT env var is used in direct mode") + mode := fs.String("mode", "direct", "control mode: direct (default), fmq, or fmq-step") + fs.Usage = func() { + fmt.Fprint(os.Stderr, `peanut — process execution and control utility for OCC / FairMQ processes - if err := peanut.Run(cmdString); err != nil { - panic(err) +TUI mode (interactive, launched when no command is given): + peanut direct mode via OCC_CONTROL_PORT env var + peanut -addr host:port direct mode (OCC protobuf, one button per transition) + peanut -addr host:port -mode fmq fmq batched mode (drives full FairMQ sequence per transition) + peanut -addr host:port -mode fmq-step fmq single-step mode (one button per raw FairMQ event) + +CLI mode (non-interactive, launched when a command is given): + peanut [flags] [args] + +TUI Flags: + -addr string gRPC address (host:port); if empty, uses OCC_CONTROL_PORT env var in direct mode + -mode string direct (default), fmq, or fmq-step + +CLI Flags: + -addr string gRPC address (default "localhost:47100") + -mode string fmq (default) or direct + -timeout duration unary call timeout (default 30s) + -config string path to YAML/JSON file with arguments to push (inline key=val args take precedence) + +CLI Commands: + get-state + Print the current FSM state. + + transition [key=val ...] + High-level OCC transition. In fmq mode drives the full multi-step FairMQ sequence: + STANDBY→CONFIGURED runs INIT DEVICE, COMPLETE INIT, BIND, CONNECT, INIT TASK + CONFIGURED→RUNNING runs RUN + RUNNING→CONFIGURED runs STOP + CONFIGURED→STANDBY runs RESET TASK, RESET DEVICE + In direct mode sends a single OCC protobuf Transition RPC. + key=val pairs are forwarded as ConfigEntry arguments. + + direct-step [key=val ...] + Low-level: send a single raw OCC protobuf Transition RPC regardless of -mode. + Events: CONFIGURE, RESET, START, STOP, RECOVER, EXIT + + fmq-step [key=val ...] + Low-level: send a single raw FairMQ gRPC Transition call regardless of -mode. + FairMQ state/event names that contain spaces must be quoted. + + state-stream + Subscribe to StateStream; print updates until interrupted (ctrl-c to stop). + + event-stream + Subscribe to EventStream; print events until interrupted (ctrl-c to stop). + +Examples: + peanut -addr localhost:47100 get-state + peanut -addr localhost:47100 transition STANDBY CONFIGURED chans.x.0.address=ipc://@foo + peanut -addr localhost:47100 -config args.yaml transition STANDBY CONFIGURED + peanut -addr localhost:47100 fmq-step IDLE "INIT DEVICE" chans.x.0.address=ipc://@foo + peanut -addr localhost:47100 direct-step STANDBY CONFIGURE key=val + peanut -addr localhost:47100 state-stream + peanut -addr localhost:47100 -mode direct transition STANDBY CONFIGURED +`) + } + _ = fs.Parse(os.Args[1:]) + + if fs.NArg() > 0 { + // CLI mode — pass all original args so RunCLI can re-parse its own flags + if err := peanut.RunCLI(os.Args[1:]); err != nil { + fmt.Fprintf(os.Stderr, "peanut: %v\n", err) + os.Exit(1) + } + return + } + + // TUI mode + if err := peanut.Run(peanut.Options{Addr: *addr, Mode: *mode}); err != nil { + fmt.Fprintf(os.Stderr, "peanut: %v\n", err) + os.Exit(1) } } diff --git a/executor/executorcmd/nopb/occclient.go b/executor/executorcmd/nopb/occclient.go index 5efe87502..2929aa9db 100644 --- a/executor/executorcmd/nopb/occclient.go +++ b/executor/executorcmd/nopb/occclient.go @@ -61,8 +61,42 @@ func (c *occClient) EventStream(ctx context.Context, in *pb.EventStreamRequest, return x, nil } +type occStateStreamClient struct { + grpc.ClientStream +} + +func (x *occStateStreamClient) Recv() (*pb.StateStreamReply, error) { + m := new(pb.StateStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *occClient) StateStream(ctx context.Context, in *pb.StateStreamRequest, opts ...grpc.CallOption) (pb.Occ_StateStreamClient, error) { - return nil, nil + opts = append(opts, + []grpc.CallOption{ + grpc.CallContentSubtype("json"), + }..., + ) + streamDesc := grpc.StreamDesc{ + StreamName: "StateStream", + Handler: nil, + ServerStreams: true, + ClientStreams: false, + } + stream, err := c.cc.NewStream(ctx, &streamDesc, "StateStream", opts...) + if err != nil { + return nil, err + } + x := &occStateStreamClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil } func (c *occClient) GetState(ctx context.Context, in *pb.GetStateRequest, opts ...grpc.CallOption) (*pb.GetStateReply, error) { diff --git a/occ/peanut/README.md b/occ/peanut/README.md index 61f72815b..b763776ba 100644 --- a/occ/peanut/README.md +++ b/occ/peanut/README.md @@ -1,42 +1,233 @@ # Process control and execution utility overview `peanut` is the **p**rocess **e**xecution **a**nd co**n**trol **ut**ility for OCClib-based O² processes. Its purpose -is to be a debugging and development aid for non-FairMQ O² devices, where FairMQ's interactive -controller is not available. +is to be a debugging and development aid for OCC-based and FairMQ O² devices. In aliBuild it is part of the `coconut` package. -`peanut` can connect to a running OCClib-based process, query its status, drive its state machine +`peanut` can connect to a running OCClib-based or FairMQ process, query its status, drive its state machine and push runtime configuration data. -`peanut` is an interactive tool, the only information it picks up from its environment is the -`OCC_CONTROL_PORT` variable, which is used to connect to a running OCClib-based process. +`peanut` runs in two modes depending on whether a command is passed: + +* **TUI mode** — interactive terminal UI (launched when no command is given) +* **CLI mode** — non-interactive, scriptable (launched when a command is given) + +--- + +## TUI mode + +![Screenshot of peanut](peanut.png) ```bash -$ OCC_CONTROL_PORT= peanut +peanut [flags] ``` -![Screenshot of peanut](peanut.png) +| Flag | Default | Description | +|------|---------|-------------| +| `-addr` | `""` | gRPC address `host:port`; if empty, falls back to `OCC_CONTROL_PORT` env var (direct mode only) | +| `-mode` | `direct` | `direct`, `fmq`, or `fmq-step` (see below) | + +### Modes + +#### `direct` — OCC protobuf (default) + +Connects to an OCClib-based process using the standard OCC protobuf codec. +The state machine operates on OCC states: `STANDBY`, `CONFIGURED`, `RUNNING`, `ERROR`. + +```bash +OCC_CONTROL_PORT=47100 peanut +# or +peanut -addr localhost:47100 -mode direct +``` + +Control buttons: **CONFIGURE**, **RESET**, **START**, **STOP**, **RECOVER**, **EXIT** + +#### `fmq` — FairMQ JSON codec with automatic multi-step sequencing + +Connects to a FairMQ device using the JSON codec. Each OCC-level button press +automatically drives the full underlying FairMQ state machine sequence. +The state is displayed as an OCC-mapped state (`STANDBY`, `CONFIGURED`, `RUNNING`…). + +```bash +peanut -addr localhost:47100 -mode fmq +``` + +Control buttons: **CONFIGURE**, **RESET**, **START**, **STOP**, **RECOVER**, **EXIT** + +Sequences driven automatically: + +| Button | FairMQ steps | +|--------|-------------| +| CONFIGURE | INIT DEVICE → COMPLETE INIT → BIND → CONNECT → INIT TASK | +| RESET | RESET TASK → RESET DEVICE | +| START | RUN | +| STOP | STOP | +| RECOVER | RESET DEVICE (from ERROR) | +| EXIT | RESET (if needed) → END | + +#### `fmq-step` — FairMQ JSON codec with granular per-step control + +Connects to a FairMQ device using the JSON codec. Exposes each individual FairMQ +state machine step as a separate button. The state is displayed as the raw FairMQ state. + +```bash +peanut -addr localhost:47100 -mode fmq-step +``` + +| Key | Button | Transition | +|-----|--------|-----------| +| `1` | INIT DEVICE | IDLE → INITIALIZING DEVICE | +| `2` | COMPLETE INIT | INITIALIZING DEVICE → INITIALIZED | +| `3` | BIND | INITIALIZED → BOUND | +| `4` | CONNECT | BOUND → DEVICE READY | +| `5` | INIT TASK | DEVICE READY → READY | +| `6` | RUN | READY → RUNNING | +| `7` | STOP | RUNNING → READY | +| `8` | RESET TASK | READY → DEVICE READY | +| `9` | RESET DEVICE | → IDLE | +| `0` | END | IDLE → EXITING | + +### Common TUI controls (all modes) + +| Key | Action | +|-----|--------| +| `n` | **Reconnect** — re-establish the gRPC connection to the controlled process. Use this when the process has been restarted after a crash or deliberate termination. | +| `l` | **Load configuration** — open a file dialog to read a YAML or JSON configuration file. The path field supports tab-completion. Once loaded, the right panel shows `NOT PUSHED` until the next CONFIGURE transition, then `PUSHED`. | +| `q` | **Quit** — disconnect and exit without sending any transitions. | + +### Connection monitoring + +While connected, peanut polls `GetState` every 2 seconds in a background goroutine. If the process stops responding, the state display shows `UNREACHABLE` and an error modal appears. After restarting the controlled process, press `n` to reconnect. + +Transition buttons are dimmed and disabled until a connection is successfully established. + +#### Connection error states + +| State | Meaning | +|-------|---------| +| `CONNECTING` | Connection attempt in progress | +| `UNREACHABLE` | No process is listening on the given address, or the connection was lost after a successful connect | +| `WRONG MODE` | A process is running but speaks a different protocol — check the `-mode` flag | + +If `WRONG MODE` is shown, peanut will suggest the correct mode in the error modal. + +### Runtime configuration files + +Configuration files are YAML or JSON, with arbitrarily nested structure. +`peanut` flattens them to dot-notation key=value pairs before pushing. +Integer map keys and integer values are both handled correctly. + +Example (channel configuration): + +```yaml +chans: + data: + numSockets: 1 + 0: + address: ipc://@o2ipc-example + method: bind + type: push + transport: shmem + sndBufSize: 1000 + rcvBufSize: 1000 + sndKernelSize: 0 + rcvKernelSize: 0 + rateLogging: 0 +``` -`peanut` commands are documented inline. Each transition is applied immediately and -the state is updated in real time. +This flattens to entries like `chans.data.0.address=ipc://@o2ipc-example`. -Compared to the raw gRPC API, the following limitations apply: +--- -* It is not possible to perform a `GO_ERROR` transition, as this transition is only triggered from -user code. +## CLI mode -* The `CONFIGURE` transition may be triggered both with and without runtime configuration data, which -may or may not be suitable depending on user code. All other transitions send no payload. +```bash +peanut [flags] [args] +``` + +| Flag | Default | Description | +|------|---------|-------------| +| `-addr` | `localhost:47100` | gRPC address `host:port` | +| `-mode` | `fmq` | `fmq` (JSON codec) or `direct` (protobuf) | +| `-timeout` | `30s` | timeout for unary gRPC calls | +| `-config` | `""` | path to YAML/JSON file; flattened key=value pairs are sent as arguments. Inline `key=val` arguments take precedence. | + +### Commands + +#### `get-state` + +Print the current FSM state. + +```bash +peanut -addr localhost:47100 get-state +``` + +#### `transition [key=val ...]` + +High-level state transition. In `fmq` mode drives the full multi-step FairMQ sequence automatically. + +```bash +# FairMQ: drive full configure sequence +peanut -addr localhost:47100 -mode fmq transition STANDBY CONFIGURED \ + chans.data.0.address=ipc://@o2ipc-example + +# FairMQ: with config file +peanut -addr localhost:47100 -mode fmq -config stfsender-configure-args.yaml \ + transition STANDBY CONFIGURED + +# Direct OCC +peanut -addr localhost:47100 -mode direct transition STANDBY CONFIGURED +``` + +FairMQ sequences driven automatically: + +| From → To | Steps | +|-----------|-------| +| `STANDBY → CONFIGURED` | INIT DEVICE, COMPLETE INIT, BIND, CONNECT, INIT TASK | +| `CONFIGURED → RUNNING` | RUN | +| `RUNNING → CONFIGURED` | STOP | +| `CONFIGURED → STANDBY` | RESET TASK, RESET DEVICE | + +#### `direct-step [key=val ...]` + +Low-level: send a single raw OCC gRPC Transition call (protobuf codec). + +```bash +peanut -addr localhost:47100 -mode direct direct-step STANDBY CONFIGURE key=val +``` + +Events: `CONFIGURE`, `RESET`, `START`, `STOP`, `RECOVER`, `EXIT` + +#### `fmq-step [key=val ...]` + +Low-level: send a single raw FairMQ gRPC Transition call (JSON codec). +State/event names that contain spaces must be quoted. + +```bash +peanut -addr localhost:47100 fmq-step IDLE "INIT DEVICE" chans.x.0.address=ipc://@foo +peanut -addr localhost:47100 fmq-step READY RUN +``` + +#### `state-stream` + +Subscribe to `StateStream` and print state updates until interrupted (Ctrl-C). + +```bash +peanut -addr localhost:47100 state-stream +``` + +#### `event-stream` + +Subscribe to `EventStream` and print events until interrupted (Ctrl-C). + +```bash +peanut -addr localhost:47100 event-stream +``` -The last two commands are **not** transitions: +--- -* `Load configuration` allows the user to read in a JSON or YAML file containing sample -configuration data that is then available to be pushed to the controlled process during a future -`CONFIGURE` transition. On startup, there is no file loaded, so a `CONFIGURE` transition will push -an empty payload. Once a runtime configuration file is loaded, its title bar reports `NOT PUSHED` -until the next `CONFIGURE` transition, at which point it becomes `PUSHED`. +## Limitations -* `Quit` disconnects from the controlled process and quits `peanut`, but it performs no transitions -or other data exchange with the controlled process. A future instance of `peanut` may reattach itself -to the same process and continue from there. +* The `GO_ERROR` transition cannot be triggered from `peanut`, as it is only triggered from user code inside the controlled process. +* `Quit` / `q` disconnects without sending any transition. A future instance of `peanut` can reattach to the same process and continue. diff --git a/occ/peanut/cli.go b/occ/peanut/cli.go new file mode 100644 index 000000000..29edf21e0 --- /dev/null +++ b/occ/peanut/cli.go @@ -0,0 +1,434 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package peanut + +import ( + "context" + "encoding/json" + "flag" + "fmt" + "os" + "os/signal" + "strings" + "syscall" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + + "github.com/AliceO2Group/Control/executor/executorcmd/nopb" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" + pb "github.com/AliceO2Group/Control/executor/protos" + "github.com/AliceO2Group/Control/occ/peanut/flatten" +) + +// RunCLI runs peanut in non-interactive CLI mode. +// args should be os.Args[1:]. +func RunCLI(args []string) error { + fs := flag.NewFlagSet("peanut", flag.ExitOnError) + addr := fs.String("addr", "localhost:47100", "OCC gRPC address (host:port)") + mode := fs.String("mode", "fmq", "control mode: fmq (json codec, default) or direct (protobuf)") + timeout := fs.Duration("timeout", 30*time.Second, "request timeout for unary calls") + configFile := fs.String("config", "", "path to YAML/JSON file whose flattened key=value pairs are sent as arguments (inline key=val args take precedence)") + fs.Usage = cliUsage + _ = fs.Parse(args) + + cmds := fs.Args() + if len(cmds) == 0 { + cliUsage() + return fmt.Errorf("no command specified") + } + + conn, err := grpc.Dial(*addr, grpc.WithTransportCredentials(insecure.NewCredentials())) //nolint:staticcheck + if err != nil { + return fmt.Errorf("dial %s: %w", *addr, err) + } + defer conn.Close() + + var client pb.OccClient + if *mode == "fmq" { + client = nopb.NewOccClient(conn) + } else { + client = pb.NewOccClient(conn) + } + + loadedKVs, err := cliLoadConfig(*configFile) + if err != nil { + return fmt.Errorf("config file: %w", err) + } + + switch cmds[0] { + case "get-state": + ctx, cancel := context.WithTimeout(context.Background(), *timeout) + defer cancel() + reply, err := client.GetState(ctx, &pb.GetStateRequest{}) + if err != nil { + return fmt.Errorf("GetState: %w", err) + } + fmt.Println(reply.GetState()) + + case "transition": + if len(cmds) < 3 { + return fmt.Errorf("usage: transition [key=val ...]") + } + from := strings.ToUpper(cmds[1]) + to := strings.ToUpper(cmds[2]) + kvs := cliMergeKVs(loadedKVs, cliParseKVs(cmds[3:])) + + ctx, cancel := context.WithTimeout(context.Background(), *timeout) + defer cancel() + + if *mode == "fmq" { + result, err := cliFMQTransition(ctx, client, from, to, kvs) + if err != nil { + return fmt.Errorf("transition %s→%s: %w", from, to, err) + } + fmt.Printf("ok state=%s\n", result) + } else { + event := cliOCCEventForTransition(from, to) + reply, err := client.Transition(ctx, &pb.TransitionRequest{ + SrcState: from, + TransitionEvent: event, + Arguments: cliKVsToEntries(kvs), + }) + if err != nil { + return fmt.Errorf("Transition: %w", err) + } + fmt.Printf("ok state=%s trigger=%s\n", reply.GetState(), reply.GetTrigger()) + } + + case "direct-step": + // Low-level single OCC gRPC call. Mirrors what the TUI does. + // Usage: direct-step [key=val ...] + if len(cmds) < 3 { + return fmt.Errorf("usage: direct-step [key=val ...]\n e.g. direct-step STANDBY CONFIGURE key=val") + } + kvs := cliMergeKVs(loadedKVs, cliParseKVs(cmds[3:])) + ctx, cancel := context.WithTimeout(context.Background(), *timeout) + defer cancel() + reply, err := client.Transition(ctx, &pb.TransitionRequest{ + SrcState: cmds[1], + TransitionEvent: cmds[2], + Arguments: cliKVsToEntries(kvs), + }) + if err != nil { + return fmt.Errorf("occ-step: %w", err) + } + fmt.Printf("ok state=%s trigger=%s\n", reply.GetState(), reply.GetTrigger()) + + case "fmq-step": + if len(cmds) < 3 { + return fmt.Errorf("usage: fmq-step [key=val ...]\n e.g. fmq-step IDLE \"INIT DEVICE\" key=val") + } + kvs := cliMergeKVs(loadedKVs, cliParseKVs(cmds[3:])) + ctx, cancel := context.WithTimeout(context.Background(), *timeout) + defer cancel() + state, err := cliFMQDoStep(ctx, client, cmds[1], cmds[2], kvs) + if err != nil { + return fmt.Errorf("fmq-step: %w", err) + } + fmt.Printf("ok fmq-state=%s occ-state=%s\n", state, cliFMQToOCCState(state)) + + case "state-stream": + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer cancel() + stream, err := client.StateStream(ctx, &pb.StateStreamRequest{}) + if err != nil { + return fmt.Errorf("StateStream: %w", err) + } + if stream == nil { + return fmt.Errorf("StateStream not supported by this server (try polling with get-state)") + } + fmt.Fprintf(os.Stderr, "streaming state updates from %s (ctrl-c to stop)\n", *addr) + for { + msg, err := stream.Recv() + if err != nil { + if ctx.Err() != nil { + return nil + } + return fmt.Errorf("StateStream recv: %w", err) + } + fmt.Printf("type=%-12s state=%s\n", msg.GetType(), msg.GetState()) + } + + case "event-stream": + ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) + defer cancel() + stream, err := client.EventStream(ctx, &pb.EventStreamRequest{}) + if err != nil { + return fmt.Errorf("EventStream: %w", err) + } + if stream == nil { + return fmt.Errorf("EventStream not supported by this server") + } + fmt.Fprintf(os.Stderr, "streaming events from %s (ctrl-c to stop)\n", *addr) + for { + msg, err := stream.Recv() + if err != nil { + if ctx.Err() != nil { + return nil + } + return fmt.Errorf("EventStream recv: %w", err) + } + fmt.Printf("event=%s\n", msg.GetEvent()) + } + + default: + return fmt.Errorf("unknown command %q — valid: get-state, transition, direct-step, fmq-step, state-stream, event-stream", cmds[0]) + } + return nil +} + +// cliFMQStateToOCC maps FairMQ device states to OCC states. +var cliFMQStateToOCC = map[string]string{ + fairmq.IDLE: "STANDBY", + fairmq.INITIALIZING_DEVICE: "STANDBY", + fairmq.INITIALIZED: "STANDBY", + fairmq.BOUND: "STANDBY", + fairmq.DEVICE_READY: "STANDBY", + fairmq.READY: "CONFIGURED", + fairmq.RUNNING: "RUNNING", + fairmq.ERROR: "ERROR", +} + +func cliFMQToOCCState(fmqState string) string { + if s, ok := cliFMQStateToOCC[strings.ToUpper(fmqState)]; ok { + return s + } + return "STANDBY" +} + +// fmqDoStep performs a single raw FairMQ gRPC Transition call with no output. +func fmqDoStep(ctx context.Context, client pb.OccClient, srcFMQ, event string, kvs map[string]string) (string, error) { + reply, err := client.Transition(ctx, &pb.TransitionRequest{ + SrcState: srcFMQ, + TransitionEvent: event, + Arguments: cliKVsToEntries(kvs), + }) + if err != nil { + return "", fmt.Errorf("step %q failed: %w", event, err) + } + state := reply.GetState() + if !reply.GetOk() { + return state, fmt.Errorf("step %q not ok, state=%s", event, state) + } + return state, nil +} + +// cliFMQDoStep wraps fmqDoStep with stderr progress output for CLI use. +func cliFMQDoStep(ctx context.Context, client pb.OccClient, srcFMQ, event string, kvs map[string]string) (string, error) { + fmt.Fprintf(os.Stderr, " fmq-step src=%-20q event=%q\n", srcFMQ, event) + state, err := fmqDoStep(ctx, client, srcFMQ, event, kvs) + ok := err == nil + fmt.Fprintf(os.Stderr, " result=%-20q ok=%v\n", state, ok) + return state, err +} + +func cliFMQTransition(ctx context.Context, client pb.OccClient, from, to string, kvs map[string]string) (string, error) { + switch { + case from == "STANDBY" && to == "CONFIGURED": + return cliFMQConfigure(ctx, client, kvs) + case from == "CONFIGURED" && to == "STANDBY": + return cliFMQReset(ctx, client, kvs) + case from == "CONFIGURED" && to == "RUNNING": + state, err := cliFMQDoStep(ctx, client, fairmq.READY, fairmq.EvtRUN, kvs) + return cliFMQToOCCState(state), err + case from == "RUNNING" && to == "CONFIGURED": + state, err := cliFMQDoStep(ctx, client, fairmq.RUNNING, fairmq.EvtSTOP, kvs) + return cliFMQToOCCState(state), err + default: + return from, fmt.Errorf("unsupported FairMQ transition %s → %s", from, to) + } +} + +// fmqStepErr formats a FairMQ step failure, omitting the cause when err is nil +// (state arrived but was wrong) to avoid a trailing ": " in the message. +func fmqStepErr(step, want, got string, err error) error { + if err != nil { + return fmt.Errorf("%s: expected %q got %q: %w", step, want, got, err) + } + return fmt.Errorf("%s: expected %q got %q", step, want, got) +} + +func cliFMQConfigure(ctx context.Context, client pb.OccClient, args map[string]string) (string, error) { + state, err := cliFMQDoStep(ctx, client, fairmq.IDLE, fairmq.EvtINIT_DEVICE, args) + if err != nil || state != fairmq.INITIALIZING_DEVICE { + return cliFMQToOCCState(state), fmqStepErr("INIT DEVICE", fairmq.INITIALIZING_DEVICE, state, err) + } + state, err = cliFMQDoStep(ctx, client, fairmq.INITIALIZING_DEVICE, fairmq.EvtCOMPLETE_INIT, nil) + if err != nil || state != fairmq.INITIALIZED { + return cliFMQToOCCState(state), fmqStepErr("COMPLETE INIT", fairmq.INITIALIZED, state, err) + } + state, err = cliFMQDoStep(ctx, client, fairmq.INITIALIZED, fairmq.EvtBIND, nil) + if err != nil || state != fairmq.BOUND { + cliFMQDoStep(ctx, client, fairmq.INITIALIZED, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("BIND", fairmq.BOUND, state, err) + } + state, err = cliFMQDoStep(ctx, client, fairmq.BOUND, fairmq.EvtCONNECT, nil) + if err != nil || state != fairmq.DEVICE_READY { + cliFMQDoStep(ctx, client, fairmq.BOUND, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("CONNECT", fairmq.DEVICE_READY, state, err) + } + state, err = cliFMQDoStep(ctx, client, fairmq.DEVICE_READY, fairmq.EvtINIT_TASK, nil) + if err != nil || state != fairmq.READY { + cliFMQDoStep(ctx, client, fairmq.DEVICE_READY, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("INIT TASK", fairmq.READY, state, err) + } + return cliFMQToOCCState(state), nil +} + +func cliFMQReset(ctx context.Context, client pb.OccClient, args map[string]string) (string, error) { + state, err := cliFMQDoStep(ctx, client, fairmq.READY, fairmq.EvtRESET_TASK, nil) + if err != nil || state != fairmq.DEVICE_READY { + return cliFMQToOCCState(state), fmqStepErr("RESET TASK", fairmq.DEVICE_READY, state, err) + } + state, err = cliFMQDoStep(ctx, client, fairmq.DEVICE_READY, fairmq.EvtRESET_DEVICE, args) + return cliFMQToOCCState(state), err +} + +func cliOCCEventForTransition(from, to string) string { + type edge struct{ from, to string } + table := map[edge]string{ + {"STANDBY", "CONFIGURED"}: "CONFIGURE", + {"CONFIGURED", "RUNNING"}: "START", + {"RUNNING", "CONFIGURED"}: "STOP", + {"CONFIGURED", "STANDBY"}: "RESET", + {"ERROR", "STANDBY"}: "RECOVER", + } + if ev, ok := table[edge{from, to}]; ok { + return ev + } + return to +} + +func cliKVsToEntries(kvs map[string]string) []*pb.ConfigEntry { + entries := make([]*pb.ConfigEntry, 0, len(kvs)) + for k, v := range kvs { + entries = append(entries, &pb.ConfigEntry{Key: k, Value: v}) + } + return entries +} + +func cliParseKVs(args []string) map[string]string { + m := make(map[string]string, len(args)) + for _, kv := range args { + parts := strings.SplitN(kv, "=", 2) + if len(parts) == 2 { + m[parts[0]] = parts[1] + } + } + return m +} + +// cliLoadConfig reads and flattens a YAML/JSON config file into a key=value map. +// Returns an empty map (not an error) if path is empty. +func cliLoadConfig(path string) (map[string]string, error) { + if path == "" { + return map[string]string{}, nil + } + data, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("cannot read %q: %w", path, err) + } + flattened, err := flatten.FlattenString(string(data), "", flatten.DotStyle) + if err != nil { + return nil, fmt.Errorf("cannot flatten %q: %w", path, err) + } + var rawMap map[string]interface{} + if err := json.Unmarshal([]byte(flattened), &rawMap); err != nil { + return nil, fmt.Errorf("cannot parse flattened config: %w", err) + } + kvs := make(map[string]string, len(rawMap)) + for k, v := range rawMap { + kvs[k] = fmt.Sprintf("%v", v) + } + return kvs, nil +} + +// cliMergeKVs merges base and override maps; keys in override take precedence. +func cliMergeKVs(base, override map[string]string) map[string]string { + merged := make(map[string]string, len(base)+len(override)) + for k, v := range base { + merged[k] = v + } + for k, v := range override { + merged[k] = v + } + return merged +} + +func cliUsage() { + fmt.Fprint(os.Stderr, `peanut — process execution and control utility for OCC / FairMQ processes + +TUI mode (interactive, no command given): + peanut direct mode via OCC_CONTROL_PORT env var + peanut -addr host:port direct mode (OCC protobuf) + peanut -addr host:port -mode fmq fmq batched mode (full FairMQ sequence per transition) + peanut -addr host:port -mode fmq-step fmq single-step mode (one button per raw FairMQ event) + +CLI mode (non-interactive, command given): + peanut [flags] [args] + +CLI Flags: + -addr string gRPC address (default "localhost:47100") + -mode string fmq (FairMQ json codec, default) or direct (OCC protobuf) + -timeout duration unary call timeout (default 30s) + -config string path to YAML/JSON file with arguments to push (inline key=val args take precedence) + +CLI Commands: + get-state + Print the current FSM state. + + transition [key=val ...] + High-level OCC transition. In fmq mode drives the full multi-step + FairMQ sequence automatically: + STANDBY→CONFIGURED runs INIT DEVICE, COMPLETE INIT, BIND, CONNECT, INIT TASK + CONFIGURED→RUNNING runs RUN + RUNNING→CONFIGURED runs STOP + CONFIGURED→STANDBY runs RESET TASK, RESET DEVICE + In direct mode sends a single OCC protobuf Transition RPC. + key=val pairs are forwarded as ConfigEntry arguments. + + direct-step [key=val ...] + Low-level: send a single raw OCC protobuf Transition RPC regardless of -mode. + Events: CONFIGURE, RESET, START, STOP, RECOVER, EXIT + + fmq-step [key=val ...] + Low-level: send a single raw FairMQ gRPC Transition call regardless of -mode. + FairMQ state/event names that contain spaces must be quoted. + + state-stream + Subscribe to StateStream; print updates until interrupted. + + event-stream + Subscribe to EventStream; print events until interrupted. + +Examples: + peanut -addr localhost:47100 get-state + peanut -addr localhost:47100 transition STANDBY CONFIGURED chans.x.0.address=ipc://@foo + peanut -addr localhost:47100 fmq-step IDLE "INIT DEVICE" chans.x.0.address=ipc://@foo + peanut -addr localhost:47100 state-stream + peanut -addr localhost:47100 -mode direct transition STANDBY CONFIGURED +`) +} diff --git a/occ/peanut/flatten/flatten.go b/occ/peanut/flatten/flatten.go index 09db104a1..fbf9b2a58 100644 --- a/occ/peanut/flatten/flatten.go +++ b/occ/peanut/flatten/flatten.go @@ -94,6 +94,7 @@ package flatten import ( "encoding/json" "errors" + "fmt" "strconv" "gopkg.in/yaml.v3" @@ -175,7 +176,7 @@ func flatten(top bool, flatMap map[string]interface{}, nested interface{}, prefi switch nested.(type) { case map[interface{}]interface{}: for k, v := range nested.(map[interface{}]interface{}) { - newKey := enkey(top, prefix, k.(string), style) + newKey := enkey(top, prefix, fmt.Sprintf("%v", k), style) assign(newKey, v) } case map[string]interface{}: diff --git a/occ/peanut/peanut.go b/occ/peanut/peanut.go index 4e6f4d5f5..e0ee3516d 100644 --- a/occ/peanut/peanut.go +++ b/occ/peanut/peanut.go @@ -32,28 +32,153 @@ import ( "fmt" "io/ioutil" "os" + "path/filepath" "strconv" + "strings" "time" - "github.com/AliceO2Group/Control/common/controlmode" - "github.com/AliceO2Group/Control/executor/executorcmd" + "github.com/AliceO2Group/Control/executor/executorcmd/nopb" + "github.com/AliceO2Group/Control/executor/executorcmd/transitioner/fairmq" "github.com/AliceO2Group/Control/executor/protos" "github.com/AliceO2Group/Control/occ/peanut/flatten" "github.com/gdamore/tcell/v2" "github.com/rivo/tview" - log "github.com/sirupsen/logrus" "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/status" ) +// Options configures the peanut TUI. +type Options struct { + Addr string // host:port; if empty, falls back to OCC_CONTROL_PORT env var (occ mode only) + Mode string // "direct" (default), "fmq", or "fmq-step" +} + var ( app *tview.Application state string + tuiMode string + tuiAddr string + tuiConn *grpc.ClientConn + monitorCancel context.CancelFunc + transitioning bool + connected bool + setCommandsEnabled func(bool) configMap map[string]string controlList *tview.List configTextView *tview.TextView - rpcClient *executorcmd.RpcClient + configPages *tview.Pages + occClient pb.OccClient ) +func monitorConnection(ctx context.Context) { + // Poll GetState every 2s for disconnect detection. + ticker := time.NewTicker(2 * time.Second) + defer ticker.Stop() + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + if _, e := occClient.GetState(ctx, &pb.GetStateRequest{}); e != nil { + if ctx.Err() != nil { + return + } + app.QueueUpdateDraw(func() { + connected = false + if setCommandsEnabled != nil { + setCommandsEnabled(false) + } + state = "UNREACHABLE" + errorMessage(configPages, "Connection lost", e.Error()) + }) + return + } + } + } +} + +func connectRPC() { + if monitorCancel != nil { + monitorCancel() // stop any existing stream monitor + } + connected = false + if setCommandsEnabled != nil { + setCommandsEnabled(false) + } + state = "CONNECTING" + go func() { + if tuiConn != nil { + tuiConn.Close() + tuiConn = nil + } + conn, e := grpc.Dial(tuiAddr, grpc.WithTransportCredentials(insecure.NewCredentials())) //nolint:staticcheck + if e != nil { + app.QueueUpdateDraw(func() { + state = "UNREACHABLE" + errorMessage(configPages, "Connection failed", e.Error()) + }) + return + } + if tuiMode == "fmq" || tuiMode == "fmq-step" { + occClient = nopb.NewOccClient(conn) + } else { + occClient = pb.NewOccClient(conn) + } + response, e := occClient.GetState(context.TODO(), &pb.GetStateRequest{}) + if e != nil { + if st, ok := status.FromError(e); ok && st.Code() == codes.Unavailable { + app.QueueUpdateDraw(func() { + state = "UNREACHABLE" + errorMessage(configPages, "Nothing running", "No process is listening on "+tuiAddr+".") + }) + return + } + // Probe with the opposite client to detect mode mismatch. + var altClient pb.OccClient + if tuiMode == "fmq" || tuiMode == "fmq-step" { + altClient = pb.NewOccClient(conn) + } else { + altClient = nopb.NewOccClient(conn) + } + _, altErr := altClient.GetState(context.TODO(), &pb.GetStateRequest{}) + app.QueueUpdateDraw(func() { + if altErr == nil { + state = "WRONG MODE" + if tuiMode == "fmq" || tuiMode == "fmq-step" { + errorMessage(configPages, "Wrong mode", + "The process at "+tuiAddr+" is a direct OCC process.\nRestart peanut without -mode fmq.") + } else { + errorMessage(configPages, "Wrong mode", + "The process at "+tuiAddr+" is a FairMQ process.\nRestart peanut with -mode fmq.") + } + } else { + state = "UNREACHABLE" + errorMessage(configPages, "Connection failed", e.Error()) + } + }) + return + } + tuiConn = conn + connected = true + ctx, cancel := context.WithCancel(context.Background()) + monitorCancel = cancel + go monitorConnection(ctx) + app.QueueUpdateDraw(func() { + if setCommandsEnabled != nil { + setCommandsEnabled(true) + } + switch tuiMode { + case "fmq": + state = cliFMQToOCCState(response.GetState()) + default: + state = response.GetState() + } + }) + }() +} + func modal(p tview.Primitive, width, height int) tview.Primitive { return tview.NewFlex(). AddItem(nil, 0, 1, false). @@ -65,7 +190,7 @@ func modal(p tview.Primitive, width, height int) tview.Primitive { } func transition(evt string) error { - args := make([]*pb.ConfigEntry, 0) + args := make([]*pb.ConfigEntry, 0, len(configMap)) for k, v := range configMap { args = append(args, &pb.ConfigEntry{Key: k, Value: v}) } @@ -78,41 +203,163 @@ func transition(evt string) error { }) } - response, err := rpcClient.Transition(context.TODO(), &pb.TransitionRequest{ - TransitionEvent: evt, - Arguments: args, - SrcState: state, - }, grpc.EmptyCallOption{}) - if err != nil { - app.Stop() + var ( + newState string + err error + ) + + if tuiMode == "fmq" { + newState, err = tuiFMQTransition(evt, args) + } else { + var response *pb.TransitionReply + response, err = occClient.Transition(context.TODO(), &pb.TransitionRequest{ + TransitionEvent: evt, + Arguments: args, + SrcState: state, + }) + if err == nil { + newState = response.GetState() + } + } - fmt.Println(err.Error()) + if err != nil { return err } if evt == "CONFIGURE" { configTextView.SetTitle("runtime configuration (PUSHED)") } - state = response.GetState() + state = newState return nil } +// tuiFMQTransition maps TUI event names to FairMQ multi-step sequences. +func tuiFMQTransition(evt string, args []*pb.ConfigEntry) (string, error) { + kvs := make(map[string]string, len(args)) + for _, e := range args { + kvs[e.Key] = e.Value + } + + switch evt { + case "CONFIGURE": + return tuiFMQConfigure(kvs) + case "RESET": + return tuiFMQReset(kvs) + case "START": + result, err := fmqDoStep(context.TODO(), occClient, fairmq.READY, fairmq.EvtRUN, kvs) + return cliFMQToOCCState(result), err + case "STOP": + result, err := fmqDoStep(context.TODO(), occClient, fairmq.RUNNING, fairmq.EvtSTOP, kvs) + return cliFMQToOCCState(result), err + case "RECOVER": + result, err := fmqDoStep(context.TODO(), occClient, fairmq.ERROR, fairmq.EvtRESET_DEVICE, kvs) + return cliFMQToOCCState(result), err + case "EXIT": + if state == "CONFIGURED" { + if _, err := tuiFMQReset(nil); err != nil { + return state, err + } + } + result, err := fmqDoStep(context.TODO(), occClient, fairmq.IDLE, fairmq.EvtEND, nil) + return cliFMQToOCCState(result), err + default: + return state, fmt.Errorf("unsupported transition %q in FairMQ mode", evt) + } +} + +func tuiFMQConfigure(args map[string]string) (string, error) { + state, err := fmqDoStep(context.TODO(), occClient, fairmq.IDLE, fairmq.EvtINIT_DEVICE, args) + if err != nil || state != fairmq.INITIALIZING_DEVICE { + return cliFMQToOCCState(state), fmqStepErr("INIT DEVICE", fairmq.INITIALIZING_DEVICE, state, err) + } + state, err = fmqDoStep(context.TODO(), occClient, fairmq.INITIALIZING_DEVICE, fairmq.EvtCOMPLETE_INIT, nil) + if err != nil || state != fairmq.INITIALIZED { + return cliFMQToOCCState(state), fmqStepErr("COMPLETE INIT", fairmq.INITIALIZED, state, err) + } + state, err = fmqDoStep(context.TODO(), occClient, fairmq.INITIALIZED, fairmq.EvtBIND, nil) + if err != nil || state != fairmq.BOUND { + fmqDoStep(context.TODO(), occClient, fairmq.INITIALIZED, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("BIND", fairmq.BOUND, state, err) + } + state, err = fmqDoStep(context.TODO(), occClient, fairmq.BOUND, fairmq.EvtCONNECT, nil) + if err != nil || state != fairmq.DEVICE_READY { + fmqDoStep(context.TODO(), occClient, fairmq.BOUND, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("CONNECT", fairmq.DEVICE_READY, state, err) + } + state, err = fmqDoStep(context.TODO(), occClient, fairmq.DEVICE_READY, fairmq.EvtINIT_TASK, nil) + if err != nil || state != fairmq.READY { + fmqDoStep(context.TODO(), occClient, fairmq.DEVICE_READY, fairmq.EvtRESET_DEVICE, nil) // rollback + return cliFMQToOCCState(state), fmqStepErr("INIT TASK", fairmq.READY, state, err) + } + return cliFMQToOCCState(state), nil +} + +func tuiFMQReset(args map[string]string) (string, error) { + state, err := fmqDoStep(context.TODO(), occClient, fairmq.READY, fairmq.EvtRESET_TASK, nil) + if err != nil || state != fairmq.DEVICE_READY { + return cliFMQToOCCState(state), fmqStepErr("RESET TASK", fairmq.DEVICE_READY, state, err) + } + state, err = fmqDoStep(context.TODO(), occClient, fairmq.DEVICE_READY, fairmq.EvtRESET_DEVICE, args) + return cliFMQToOCCState(state), err +} + func drawStatus(screen tcell.Screen, x int, y int, width int, height int) (int, int, int, int) { tview.Print(screen, state, x, height/2, width, tview.AlignCenter, tcell.ColorLime) return 0, 0, 0, 0 } +// pathComplete returns filesystem completions for the given partial path. +func pathComplete(text string) []string { + // Expand ~ to home directory + if strings.HasPrefix(text, "~/") { + if home, err := os.UserHomeDir(); err == nil { + text = filepath.Join(home, text[2:]) + } + } + + // Split into directory and filename prefix + dir, prefix := filepath.Split(text) + if dir == "" { + dir = "." + } + + entries, err := os.ReadDir(dir) + if err != nil { + return nil + } + + var matches []string + for _, entry := range entries { + name := entry.Name() + if !strings.HasPrefix(name, prefix) { + continue + } + full := filepath.Join(dir, name) + if entry.IsDir() { + full += "/" + } + matches = append(matches, full) + } + return matches +} + func acquireConfigFile(configPages *tview.Pages) error { configInputFrame := tview.NewForm() configInputFrame.SetTitle("file path for runtime configuration") configInputFrame.SetBorder(true) configInputFrame.AddInputField("path:", "", 0, nil, nil) + // Wire up filesystem tab-completion on the path input field + pathField := configInputFrame.GetFormItemByLabel("path:").(*tview.InputField) + pathField.SetAutocompleteFunc(func(currentText string) []string { + return pathComplete(currentText) + }) + configPages.AddPage("modal", modal(configInputFrame, 40, 10), true, true) + app.SetFocus(configInputFrame) configCancelFunc := func() { configPages.RemovePage("modal") app.SetFocus(controlList) - app.Draw() } configInputFrame.AddButton("Ok", func() { @@ -126,9 +373,6 @@ func acquireConfigFile(configPages *tview.Pages) error { configInputFrame.SetCancelFunc(configCancelFunc) configInputFrame.AddButton("Cancel", configCancelFunc) - app.SetFocus(configInputFrame) - - app.Draw() return nil } @@ -141,7 +385,6 @@ func errorMessage(configPages *tview.Pages, title string, text string) { configPages.AddPage("modal", modalPage, true, true) app.SetFocus(modalPage) - app.Draw() } func loadConfig(configFilePath string, configPages *tview.Pages) { @@ -149,21 +392,6 @@ func loadConfig(configFilePath string, configPages *tview.Pages) { errorMessage(configPages, "Cannot open configuration file", "path empty") return } - /*// Make sure we trim all variants - trimmed := strings.TrimPrefix(configFilePath, "file://") - trimmed = strings.TrimPrefix(trimmed, "file:/") - trimmed = strings.TrimPrefix(trimmed, "file:") - uri := "file://" + trimmed - cfg, err := configuration.NewConfiguration(uri) - if err != nil { - errorMessage(configPages, "Cannot open configuration file", err.Error()) - return - } - yamlConfig, err := cfg.GetRecursiveYaml("") - if err != nil { - errorMessage(configPages, "Cannot parse configuration file", err.Error()) - return - }*/ yamlConfig, err := ioutil.ReadFile(configFilePath) if err != nil { errorMessage(configPages, "Cannot open configuration file", err.Error()) @@ -178,84 +406,149 @@ func loadConfig(configFilePath string, configPages *tview.Pages) { configTextView.SetTitle("runtime configuration (NOT PUSHED)") - configMap = make(map[string]string) - err = json.Unmarshal([]byte(configTextView.GetText(false))[:], &configMap) + var rawMap map[string]interface{} + err = json.Unmarshal([]byte(configTextView.GetText(false)), &rawMap) if err != nil { errorMessage(configPages, "Cannot process configuration file", err.Error()) return } + configMap = make(map[string]string, len(rawMap)) + for k, v := range rawMap { + configMap[k] = fmt.Sprintf("%v", v) + } } -func Run(cmdString string) (err error) { +func Run(opts Options) (err error) { state = "UNKNOWN" + tuiMode = opts.Mode + if tuiMode == "" { + tuiMode = "direct" + } + + // Validate mode + switch tuiMode { + case "direct", "fmq", "fmq-step": + default: + return fmt.Errorf("unknown mode %q — valid modes: direct, fmq, fmq-step", tuiMode) + } + + // Resolve address + addr := opts.Addr + if addr == "" { + if tuiMode == "fmq" || tuiMode == "fmq-step" { + return fmt.Errorf("%s mode requires -addr flag", tuiMode) + } + // Fall back to OCC_CONTROL_PORT env var (direct mode legacy behaviour) + occPortString := os.Getenv("OCC_CONTROL_PORT") + if occPortString == "" { + return fmt.Errorf("OCC_CONTROL_PORT not defined") + } + occPort, e := strconv.ParseUint(occPortString, 10, 64) + if e != nil { + return e + } + addr = fmt.Sprintf("127.0.0.1:%d", occPort) + } // Setup UI app = tview.NewApplication() statusBox := tview.NewBox().SetBorder(true).SetTitle("state") - configTextView = tview.NewTextView().SetChangedFunc(func() { app.Draw() }) + configTextView = tview.NewTextView().SetChangedFunc(func() { app.QueueUpdateDraw(func() {}) }) configTextView.SetBorder(true).SetTitle("runtime configuration (EMPTY)") - configPages := tview.NewPages(). + configPages = tview.NewPages(). AddPage("configBox", configTextView, true, true) - controlList = tview.NewList(). - AddItem("Transition CONFIGURE", - "perform CONFIGURE transition", - 'c', - func() { - err = transition("CONFIGURE") - }). - AddItem("Transition RESET", - "perform RESET transition", - 'r', - func() { - err = transition("RESET") - }). - AddItem("Transition START", - "perform START transition", - 's', - func() { - err = transition("START") - }). - AddItem("Transition STOP", - "perform STOP transition", - 't', - func() { - err = transition("STOP") - }). - //AddItem("Transition GO_ERROR", - // "perform GO_ERROR transition", - // 'e', - // func(){ - // err = transition("GO_ERROR") - // app.Draw() - // }). - AddItem("Transition RECOVER", - "perform RECOVER transition", - 'v', - func() { - err = transition("RECOVER") - }). - AddItem("Transition EXIT", - "perform EXIT transition", - 'x', - func() { - err = transition("EXIT") - }). - AddItem("Load configuration", - "read runtime configuration from file", - 'l', - func() { - err = acquireConfigFile(configPages) - }). - AddItem("Quit", - "disconnect from the process and quit peanut", - 'q', - func() { - app.Stop() + doTransition := func(evt string) { + if !connected || transitioning { + return + } + transitioning = true + go func() { + e := transition(evt) + app.QueueUpdateDraw(func() { + transitioning = false + if e != nil { + err = e + errorMessage(configPages, "Transition error", e.Error()) + } + }) + }() + } + + doFMQStep := func(event string) { + if !connected || transitioning { + return + } + transitioning = true + go func() { + kvs := make(map[string]string, len(configMap)) + for k, v := range configMap { + kvs[k] = v + } + newState, e := fmqDoStep(context.TODO(), occClient, state, event, kvs) + app.QueueUpdateDraw(func() { + transitioning = false + if e != nil { + err = e + errorMessage(configPages, "FMQ step error", e.Error()) + } else { + state = newState + } }) + }() + } + + controlList = tview.NewList() + + var cmdIndices []int + addCmd := func(main, secondary string, shortcut rune, handler func()) { + cmdIndices = append(cmdIndices, controlList.GetItemCount()) + controlList.AddItem(main, secondary, shortcut, handler) + } + + switch tuiMode { + case "fmq-step": + addCmd("INIT DEVICE", "IDLE → INITIALIZING DEVICE", '1', func() { doFMQStep(fairmq.EvtINIT_DEVICE) }) + addCmd("COMPLETE INIT", "INITIALIZING DEVICE → INITIALIZED", '2', func() { doFMQStep(fairmq.EvtCOMPLETE_INIT) }) + addCmd("BIND", "INITIALIZED → BOUND", '3', func() { doFMQStep(fairmq.EvtBIND) }) + addCmd("CONNECT", "BOUND → DEVICE READY", '4', func() { doFMQStep(fairmq.EvtCONNECT) }) + addCmd("INIT TASK", "DEVICE READY → READY", '5', func() { doFMQStep(fairmq.EvtINIT_TASK) }) + addCmd("RUN", "READY → RUNNING", '6', func() { doFMQStep(fairmq.EvtRUN) }) + addCmd("STOP", "RUNNING → READY", '7', func() { doFMQStep(fairmq.EvtSTOP) }) + addCmd("RESET TASK", "READY → DEVICE READY", '8', func() { doFMQStep(fairmq.EvtRESET_TASK) }) + addCmd("RESET DEVICE", "→ IDLE", '9', func() { doFMQStep(fairmq.EvtRESET_DEVICE) }) + addCmd("END", "IDLE → EXITING", '0', func() { doFMQStep(fairmq.EvtEND) }) + default: // direct, fmq + addCmd("Transition CONFIGURE", "perform CONFIGURE transition", 'c', func() { doTransition("CONFIGURE") }) + addCmd("Transition RESET", "perform RESET transition", 'r', func() { doTransition("RESET") }) + addCmd("Transition START", "perform START transition", 's', func() { doTransition("START") }) + addCmd("Transition STOP", "perform STOP transition", 't', func() { doTransition("STOP") }) + addCmd("Transition RECOVER", "perform RECOVER transition", 'v', func() { doTransition("RECOVER") }) + addCmd("Transition EXIT", "perform EXIT transition", 'x', func() { doTransition("EXIT") }) + } + // Always-on items — not registered in cmdIndices. + controlList. + AddItem("Reconnect", "re-establish gRPC connection to the controlled process", 'n', func() { connectRPC() }). + AddItem("Load configuration", "read runtime configuration from file", 'l', func() { err = acquireConfigFile(configPages) }). + AddItem("Quit", "disconnect from the process and quit peanut", 'q', func() { app.Stop() }) controlList.SetBorder(true).SetTitle("control") + origTexts := make([][2]string, len(cmdIndices)) + for i, idx := range cmdIndices { + origTexts[i][0], origTexts[i][1] = controlList.GetItemText(idx) + } + setCommandsEnabled = func(enabled bool) { + for i, idx := range cmdIndices { + if enabled { + controlList.SetItemText(idx, origTexts[i][0], origTexts[i][1]) + } else { + controlList.SetItemText(idx, "[::d]"+origTexts[i][0], "[::d]"+origTexts[i][1]) + } + } + } + setCommandsEnabled(false) // start grayed out until connected + flex := tview.NewFlex().AddItem(tview.NewFlex().SetDirection(tview.FlexRow). AddItem(statusBox, 3, 1, false). AddItem(controlList, 0, 1, true), 0, 1, false). @@ -263,41 +556,8 @@ func Run(cmdString string) (err error) { statusBox.SetDrawFunc(drawStatus) - // Parse input - var occPort uint64 - if len(cmdString) > 0 { - // RUN process - } else { - // If cmdString not passed, env var OCC_CONTROL_PORT (occ/OccGlobals.h) must be defined - occPortString := os.Getenv("OCC_CONTROL_PORT") - if len(occPortString) == 0 { - err = fmt.Errorf("OCC_CONTROL_PORT not defined") - return - } - occPort, err = strconv.ParseUint(occPortString, 10, 64) - if err != nil { - return - } - } - - // Setup RPC - go func() { - // FIXME allow choice of controlmode.FAIRMQ - rpcClient = executorcmd.NewClient( - occPort, - controlmode.DIRECT, - executorcmd.ProtobufTransport, - log.WithField("id", "")) - var response *pb.GetStateReply - response, err = rpcClient.GetState(context.TODO(), &pb.GetStateRequest{}, grpc.EmptyCallOption{}) - if err != nil { - app.Stop() - fmt.Println(err.Error()) - return - } - // NOTE: we acquire the transitioner-dependent STANDBY equivalent state - state = rpcClient.FromDeviceState(response.GetState()) - app.Draw() - }() + // Connect to the controlled process + tuiAddr = addr + connectRPC() return app.SetRoot(flex, true).SetFocus(controlList).Run() } From 674cce10e04d0e5593bad2af57d7e779ab60d7b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Fri, 24 Apr 2026 10:57:30 +0200 Subject: [PATCH 2274/2352] [OCTRL-1092] Improve metrics error reporting (#810) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [core] add metrics to the transition * [core] OCTRL-1092 add call results to metric in call.go * [core] use transtion name as a tag --------- Co-authored-by: Michal Tichák --- common/monitoring/metric.go | 11 +++++++ core/environment/transition.go | 10 +++++- core/environment/transition_configure.go | 6 ++++ core/environment/transition_deploy.go | 6 ++++ core/environment/transition_goerror.go | 4 +++ core/environment/transition_reset.go | 6 ++++ core/environment/transition_startactivity.go | 6 ++++ core/environment/transition_stopactivity.go | 6 ++++ core/environment/utils.go | 2 +- core/workflow/callable/call.go | 34 +++++++++++++------- 10 files changed, 77 insertions(+), 14 deletions(-) diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go index 41f8b78fd..fe0ab8c9a 100644 --- a/common/monitoring/metric.go +++ b/common/monitoring/metric.go @@ -71,6 +71,17 @@ func (metric *Metric) AddTag(tagName string, value string) { metric.tags = append(metric.tags, Tag{name: tagName, value: value}) } +const ( + ERROR = "error" + SUCCESS = "success" + CANCELLED = "cancelled" + TIMEOUT = "timeout" +) + +func (metric *Metric) AddResult(result string) { + metric.AddTag("result", result) +} + func (metric *Metric) setField(fieldName string, field any) { if metric.fields == nil { metric.fields = make(FieldsType) diff --git a/core/environment/transition.go b/core/environment/transition.go index a821e3dfa..ecb563bf8 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -27,7 +27,8 @@ package environment import ( "errors" - "github.com/AliceO2Group/Control/core/protos" + "github.com/AliceO2Group/Control/common/monitoring" + pb "github.com/AliceO2Group/Control/core/protos" "github.com/AliceO2Group/Control/core/task" ) @@ -74,3 +75,10 @@ func (t baseTransition) check() (err error) { func (t baseTransition) eventName() string { return t.name } + +func (t baseTransition) transitionDoMetric(env *Environment) monitoring.Metric { + metric := monitoring.NewMetric("transition_do") + metric.AddTag("transition", t.name) + metric.AddTag("envId", env.Id().String()) + return metric +} diff --git a/core/environment/transition_configure.go b/core/environment/transition_configure.go index aab902bb2..09d93eca9 100644 --- a/core/environment/transition_configure.go +++ b/core/environment/transition_configure.go @@ -30,6 +30,7 @@ import ( "github.com/AliceO2Group/Control/core/workflow" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/taskop" ) @@ -52,6 +53,9 @@ func (t ConfigureTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + wf := env.Workflow() activeTasks := workflow.GetActiveTasks(wf) @@ -64,9 +68,11 @@ func (t ConfigureTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + metric.AddResult(monitoring.ERROR) return tasksStateErrors } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 34436be04..9c0e49b5b 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -36,6 +36,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/task/taskop" @@ -66,6 +67,9 @@ func (t DeployTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + wf := env.Workflow() // Skip cleanup for anything other than readout-dataflow @@ -347,10 +351,12 @@ func (t DeployTransition) do(env *Environment) (err error) { log.WithField("level", infologger.IL_Ops). WithField("partition", env.Id().String()). Error(err) + metric.AddResult(monitoring.ERROR) return } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "DEPLOYED"}) + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/transition_goerror.go b/core/environment/transition_goerror.go index c8adb14e2..e0844f6d5 100644 --- a/core/environment/transition_goerror.go +++ b/core/environment/transition_goerror.go @@ -25,6 +25,7 @@ package environment import ( + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" @@ -44,6 +45,8 @@ type GoErrorTransition struct { } func (t GoErrorTransition) do(env *Environment) (err error) { + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() // we stop all tasks which are in RUNNING toStop := env.Workflow().GetTasks().Filtered(func(t *task.Task) bool { @@ -72,5 +75,6 @@ func (t GoErrorTransition) do(env *Environment) (err error) { <-env.stateChangedCh } + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/transition_reset.go b/core/environment/transition_reset.go index fd9642dfa..84bfd44da 100644 --- a/core/environment/transition_reset.go +++ b/core/environment/transition_reset.go @@ -28,6 +28,7 @@ import ( "errors" "github.com/AliceO2Group/Control/common/event" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" "github.com/AliceO2Group/Control/core/workflow" @@ -51,6 +52,9 @@ func (t ResetTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + taskmanMessage := task.NewTransitionTaskMessage( workflow.GetActiveTasks(env.Workflow()), sm.CONFIGURED.String(), @@ -64,9 +68,11 @@ func (t ResetTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + metric.AddResult(monitoring.ERROR) return tasksStateErrors } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "RESET"}) + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/transition_startactivity.go b/core/environment/transition_startactivity.go index be7ec03c6..47a547c1b 100644 --- a/core/environment/transition_startactivity.go +++ b/core/environment/transition_startactivity.go @@ -33,6 +33,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/iancoleman/strcase" @@ -72,6 +73,9 @@ func (t StartActivityTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + runNumber := env.currentRunNumber log.WithField(infologger.Run, runNumber). @@ -120,6 +124,7 @@ func (t StartActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + metric.AddResult(monitoring.ERROR) return tasksStateErrors } @@ -133,5 +138,6 @@ func (t StartActivityTransition) do(env *Environment) (err error) { Run: env.currentRunNumber, }) + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/transition_stopactivity.go b/core/environment/transition_stopactivity.go index 8653302e1..7e55fbe62 100644 --- a/core/environment/transition_stopactivity.go +++ b/core/environment/transition_stopactivity.go @@ -29,6 +29,7 @@ import ( "github.com/AliceO2Group/Control/common/event" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" @@ -63,6 +64,9 @@ func (t StopActivityTransition) do(env *Environment) (err error) { return errors.New("cannot transition in NIL environment") } + metric := t.transitionDoMetric(env) + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + log.WithField(infologger.Run, env.currentRunNumber). WithField("partition", env.Id().String()). WithField(infologger.Level, infologger.IL_Support). @@ -98,6 +102,7 @@ func (t StopActivityTransition) do(env *Environment) (err error) { incomingEv := <-env.stateChangedCh // If some tasks failed to transition if tasksStateErrors := incomingEv.GetTasksStateChangedError(); tasksStateErrors != nil { + metric.AddResult(monitoring.ERROR) return tasksStateErrors } env.sendEnvironmentEvent(&event.EnvironmentEvent{EnvironmentID: env.Id().String(), State: "CONFIGURED"}) @@ -107,5 +112,6 @@ func (t StopActivityTransition) do(env *Environment) (err error) { WithField(infologger.Level, infologger.IL_Support). Info("run stopped") + metric.AddResult(monitoring.SUCCESS) return } diff --git a/core/environment/utils.go b/core/environment/utils.go index 1ca0dcad3..7bc15c4f7 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -52,7 +52,7 @@ type WorkflowPublicInfo struct { func parseWorkflowPublicInfo(workflowExpr string) (WorkflowPublicInfo, error) { repoManager := the.RepoManager() - resolvedWorkflowPath, _, err := repoManager.GetWorkflow(workflowExpr) //Will fail if repo unknown + resolvedWorkflowPath, _, err := repoManager.GetWorkflow(workflowExpr) // Will fail if repo unknown if err != nil { return WorkflowPublicInfo{}, err } diff --git a/core/workflow/callable/call.go b/core/workflow/callable/call.go index 502688c1e..1a83c100f 100644 --- a/core/workflow/callable/call.go +++ b/core/workflow/callable/call.go @@ -110,6 +110,15 @@ func (s Calls) AwaitAll() map[*Call]error { return errs } +func (c *Call) callableMetric(name string) monitoring.Metric { + metric := monitoring.NewMetric(name) + metric.AddTag("runtype", c.getRunTypeTag()) + metric.AddTag("name", c.GetName()) + metric.AddTag("trigger", c.GetTraits().Trigger) + metric.AddTag("envId", c.parentRole.GetEnvironmentId().String()) + return metric +} + func (c *Call) Call() error { log.WithField("trigger", c.Traits.Trigger). WithField("await", c.Traits.Await). @@ -117,7 +126,7 @@ func (c *Call) Call() error { WithField("level", infologger.IL_Devel). Debugf("calling hook function %s", c.Func) - metric := c.newMetric("callablecall") + metric := c.callableMetric("callablecall") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() the.EventWriterWithTopic(topic.Call).WriteEvent(&evpb.Ev_CallEvent{ @@ -178,6 +187,7 @@ func (c *Call) Call() error { EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) + metric.AddResult(monitoring.ERROR) return err } if len(returnVar) > 0 { @@ -206,6 +216,7 @@ func (c *Call) Call() error { EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) + metric.AddResult(monitoring.ERROR) return errors.New(errMsg) } @@ -224,32 +235,31 @@ func (c *Call) Call() error { EnvironmentId: c.parentRole.GetEnvironmentId().String(), }) + metric.AddResult(monitoring.SUCCESS) return nil } -func (c *Call) newMetric(name string) monitoring.Metric { - metric := monitoring.NewMetric(name) - metric.AddTag("runtype", c.getRunTypeTag()) - metric.AddTag("name", c.GetName()) - metric.AddTag("trigger", c.GetTraits().Trigger) - metric.AddTag("envId", c.parentRole.GetEnvironmentId().String()) - return metric -} - func (c *Call) Start() { c.await = make(chan error) ctx, cancel := context.WithCancel(context.Background()) c.awaitCancel = cancel go func() { - metric := c.newMetric("callablewrapped") + metric := c.callableMetric("callablewrapped") defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() callId := fmt.Sprintf("hook:%s:%s", c.GetTraits().Trigger, c.GetName()) log.Debugf("%s started", callId) defer utils.TimeTrack(time.Now(), callId, log.WithPrefix("callable")) + err := c.Call() select { - case c.await <- c.Call(): + case c.await <- err: + if err == nil { + metric.AddResult(monitoring.SUCCESS) + } else { + metric.AddResult(monitoring.ERROR) + } case <-ctx.Done(): + metric.AddResult(monitoring.CANCELLED) log.Debugf("%s cancelled", callId) } close(c.await) From 9e6bfdc00f16390f76e66a3cdcf99500e9e33362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 27 Apr 2026 15:48:04 +0200 Subject: [PATCH 2275/2352] OCTRL-1078 Make Task Controller able to control OCC tasks (#804) * [operator] OCTRL-1078 controller operator that is able to control all OCC tasks * [operator] fairmq states are better mapped * [operator] changed name in copyright * [operator] moved to correct image name * [operator] addressing not addressed * [operator] fixed examples with arguments and configMap * [operator] disable kube-rbac-proxy verification for metrics for testing purposes * [operator] health checks listen on correct port * [operator] add gitlab-registry-secret to task-controller image deployment * [operator] don't restart failed pods * [operator] task-controller is started with correct live and metrics ports * [operator] deploy as daemonset and use hostNetwork: true for test purposes --- README.md | 3 + control-operator/.gitignore | 3 + control-operator/Dockerfile | 34 + control-operator/Makefile | 306 ++ control-operator/PROJECT | 23 + control-operator/README.md | 94 + .../api/v1alpha1/groupversion_info.go | 44 + control-operator/api/v1alpha1/task_types.go | 125 + .../api/v1alpha1/zz_generated.deepcopy.go | 194 + control-operator/cmd/main.go | 117 + .../crd/bases/aliecs.alice.cern_tasks.yaml | 4737 +++++++++++++++++ .../config/crd/kustomization.yaml | 21 + .../config/crd/kustomizeconfig.yaml | 19 + .../crd/patches/cainjection_in_tasks.yaml | 7 + .../config/crd/patches/webhook_in_tasks.yaml | 16 + .../config/default/kustomization.yaml | 145 + .../default/manager_auth_proxy_patch.yaml | 39 + .../config/default/manager_config_patch.yaml | 10 + .../config/manager/kustomization.yaml | 8 + control-operator/config/manager/manager.yaml | 106 + .../config/manifests/kustomization.yaml | 28 + .../config/prometheus/kustomization.yaml | 2 + .../config/prometheus/monitor.yaml | 26 + .../rbac/auth_proxy_client_clusterrole.yaml | 16 + .../config/rbac/auth_proxy_role.yaml | 24 + .../config/rbac/auth_proxy_role_binding.yaml | 19 + .../config/rbac/auth_proxy_service.yaml | 21 + .../config/rbac/kustomization.yaml | 18 + .../config/rbac/leader_election_role.yaml | 44 + .../rbac/leader_election_role_binding.yaml | 19 + control-operator/config/rbac/role.yaml | 51 + .../config/rbac/role_binding.yaml | 19 + .../config/rbac/service_account.yaml | 12 + .../config/rbac/task_editor_role.yaml | 31 + .../config/rbac/task_viewer_role.yaml | 27 + .../config/samples/aliecs_v1alpha1_task.yaml | 12 + .../config/samples/kustomization.yaml | 4 + .../config/scorecard/bases/config.yaml | 7 + .../config/scorecard/kustomization.yaml | 16 + .../scorecard/patches/basic.config.yaml | 10 + .../config/scorecard/patches/olm.config.yaml | 50 + .../control-workflows/readout-docker.yaml | 33 + .../control-workflows/readout-kube.yaml | 35 + .../control-workflows/readout-orig.yaml | 33 + .../stfbuilder-senderoutput-kube.yaml | 66 + .../stfbuilder-senderoutput-orig.yaml | 64 + .../control-workflows/stfsender-docker.yaml | 65 + .../control-workflows/stfsender-kube.yaml | 66 + .../control-workflows/stfsender-orig.yaml | 64 + .../ecs-manifests/kubernetes-ecs.md | 35 + .../kubernetes-manifests/readout-test.yaml | 179 + .../kubernetes-manifests/readout.yaml | 82 + .../stfbuilder-senderoutput-test.yaml | 114 + .../stfbuilder-senderoutput.yaml | 91 + .../kubernetes-manifests/stfsender-test.yaml | 92 + .../kubernetes-manifests/stfsender.yaml | 105 + .../readout-configure-args.yaml | 16 + ...tfbuilder-senderoutput-configure-args.yaml | 28 + .../stfsender-configure-args.yaml | 15 + control-operator/go.mod | 86 + control-operator/go.sum | 213 + control-operator/hack/boilerplate.go.txt | 23 + .../internal/controller/direct_transition.go | 145 + .../internal/controller/fairmq_transition.go | 223 + .../internal/controller/grpc_client.go | 305 ++ .../internal/controller/jsoncodec.go | 49 + .../internal/controller/protos/occ.proto | 99 + .../internal/controller/suite_test.go | 89 + .../internal/controller/task_controller.go | 384 ++ 69 files changed, 9306 insertions(+) create mode 100644 control-operator/.gitignore create mode 100644 control-operator/Dockerfile create mode 100644 control-operator/Makefile create mode 100644 control-operator/PROJECT create mode 100644 control-operator/README.md create mode 100644 control-operator/api/v1alpha1/groupversion_info.go create mode 100644 control-operator/api/v1alpha1/task_types.go create mode 100644 control-operator/api/v1alpha1/zz_generated.deepcopy.go create mode 100644 control-operator/cmd/main.go create mode 100644 control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml create mode 100644 control-operator/config/crd/kustomization.yaml create mode 100644 control-operator/config/crd/kustomizeconfig.yaml create mode 100644 control-operator/config/crd/patches/cainjection_in_tasks.yaml create mode 100644 control-operator/config/crd/patches/webhook_in_tasks.yaml create mode 100644 control-operator/config/default/kustomization.yaml create mode 100644 control-operator/config/default/manager_auth_proxy_patch.yaml create mode 100644 control-operator/config/default/manager_config_patch.yaml create mode 100644 control-operator/config/manager/kustomization.yaml create mode 100644 control-operator/config/manager/manager.yaml create mode 100644 control-operator/config/manifests/kustomization.yaml create mode 100644 control-operator/config/prometheus/kustomization.yaml create mode 100644 control-operator/config/prometheus/monitor.yaml create mode 100644 control-operator/config/rbac/auth_proxy_client_clusterrole.yaml create mode 100644 control-operator/config/rbac/auth_proxy_role.yaml create mode 100644 control-operator/config/rbac/auth_proxy_role_binding.yaml create mode 100644 control-operator/config/rbac/auth_proxy_service.yaml create mode 100644 control-operator/config/rbac/kustomization.yaml create mode 100644 control-operator/config/rbac/leader_election_role.yaml create mode 100644 control-operator/config/rbac/leader_election_role_binding.yaml create mode 100644 control-operator/config/rbac/role.yaml create mode 100644 control-operator/config/rbac/role_binding.yaml create mode 100644 control-operator/config/rbac/service_account.yaml create mode 100644 control-operator/config/rbac/task_editor_role.yaml create mode 100644 control-operator/config/rbac/task_viewer_role.yaml create mode 100644 control-operator/config/samples/aliecs_v1alpha1_task.yaml create mode 100644 control-operator/config/samples/kustomization.yaml create mode 100644 control-operator/config/scorecard/bases/config.yaml create mode 100644 control-operator/config/scorecard/kustomization.yaml create mode 100644 control-operator/config/scorecard/patches/basic.config.yaml create mode 100644 control-operator/config/scorecard/patches/olm.config.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/readout-docker.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/readout-kube.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/readout-orig.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-orig.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfsender-docker.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfsender-kube.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfsender-orig.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-ecs.md create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/readout.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml create mode 100644 control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml create mode 100644 control-operator/ecs-manifests/occ-configure-arguments/readout-configure-args.yaml create mode 100644 control-operator/ecs-manifests/occ-configure-arguments/stfbuilder-senderoutput-configure-args.yaml create mode 100644 control-operator/ecs-manifests/occ-configure-arguments/stfsender-configure-args.yaml create mode 100644 control-operator/go.mod create mode 100644 control-operator/go.sum create mode 100644 control-operator/hack/boilerplate.go.txt create mode 100644 control-operator/internal/controller/direct_transition.go create mode 100644 control-operator/internal/controller/fairmq_transition.go create mode 100644 control-operator/internal/controller/grpc_client.go create mode 100644 control-operator/internal/controller/jsoncodec.go create mode 100644 control-operator/internal/controller/protos/occ.proto create mode 100644 control-operator/internal/controller/suite_test.go create mode 100644 control-operator/internal/controller/task_controller.go diff --git a/README.md b/README.md index eb4d30be3..80bb8d7a8 100644 --- a/README.md +++ b/README.md @@ -193,6 +193,9 @@ There are two ways of interacting with AliECS: * [Sampling reservoir](/docs/metrics.md#sampling-reservoir) * [OCC API debugging with grpcc](/docs/using_grpcc_occ.md#occ-api-debugging-with-grpcc) * [Running tasks inside docker](/docs/running_docker.md#running-a-task-inside-a-docker-container) + * Kubernetes + * [Operator controller](/control-operator/README.md) + * [Testing manifests](/control-operator/ecs-manifests/kubernetes-ecs.md) * Resources * T. Mrnjavac et. al, [AliECS: A New Experiment Control System for the ALICE Experiment](https://doi.org/10.1051/epjconf/202429502027), CHEP23 diff --git a/control-operator/.gitignore b/control-operator/.gitignore new file mode 100644 index 000000000..2a14aa847 --- /dev/null +++ b/control-operator/.gitignore @@ -0,0 +1,3 @@ +bin +cover.out +/internal/controller/protos/generated diff --git a/control-operator/Dockerfile b/control-operator/Dockerfile new file mode 100644 index 000000000..ddd858167 --- /dev/null +++ b/control-operator/Dockerfile @@ -0,0 +1,34 @@ +# Build the manager binary +FROM golang:1.25 as builder +ARG TARGETOS +ARG TARGETARCH + +WORKDIR /workspace +# Copy the Go Modules manifests +COPY go.mod go.mod +COPY go.sum go.sum +RUN sed -i '\,replace github.com/AliceO2Group/Control,d' go.mod +# cache deps before building and copying source so that we don't need to re-download as much +# and so that source changes don't invalidate our downloaded layer +RUN go mod download + +# Copy the go source +COPY cmd/main.go cmd/main.go +COPY api/ api/ +COPY internal/controller/ internal/controller/ + +# Build +# the GOARCH has not a default value to allow the binary be built according to the host where the command +# was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO +# the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, +# by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. +RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager cmd/main.go + +# Use distroless as minimal base image to package the manager binary +# Refer to https://github.com/GoogleContainerTools/distroless for more details +FROM gcr.io/distroless/static:nonroot +WORKDIR / +COPY --from=builder /workspace/manager . +USER 65532:65532 + +ENTRYPOINT ["/manager"] diff --git a/control-operator/Makefile b/control-operator/Makefile new file mode 100644 index 000000000..d01cfcb64 --- /dev/null +++ b/control-operator/Makefile @@ -0,0 +1,306 @@ +# VERSION defines the project version for the bundle. +# Update this value when you upgrade the version of your project. +# To re-generate a bundle for another specific version without changing the standard setup, you can: +# - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) +# - use environment variables to overwrite this value (e.g export VERSION=0.0.2) +VERSION ?= 0.0.1 + +# CHANNELS define the bundle channels used in the bundle. +# Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") +# To re-generate a bundle for other specific channels without changing the standard setup, you can: +# - use the CHANNELS as arg of the bundle target (e.g make bundle CHANNELS=candidate,fast,stable) +# - use environment variables to overwrite this value (e.g export CHANNELS="candidate,fast,stable") +ifneq ($(origin CHANNELS), undefined) +BUNDLE_CHANNELS := --channels=$(CHANNELS) +endif + +# DEFAULT_CHANNEL defines the default channel used in the bundle. +# Add a new line here if you would like to change its default config. (E.g DEFAULT_CHANNEL = "stable") +# To re-generate a bundle for any other default channel without changing the default setup, you can: +# - use the DEFAULT_CHANNEL as arg of the bundle target (e.g make bundle DEFAULT_CHANNEL=stable) +# - use environment variables to overwrite this value (e.g export DEFAULT_CHANNEL="stable") +ifneq ($(origin DEFAULT_CHANNEL), undefined) +BUNDLE_DEFAULT_CHANNEL := --default-channel=$(DEFAULT_CHANNEL) +endif +BUNDLE_METADATA_OPTS ?= $(BUNDLE_CHANNELS) $(BUNDLE_DEFAULT_CHANNEL) + +# IMAGE_TAG_BASE defines the docker.io namespace and part of the image name for remote images. +# This variable is used to construct full image tags for bundle and catalog images. +# +# For example, running 'make bundle-build bundle-push catalog-build catalog-push' will build and push both +# alice.cern/operator-bundle:$VERSION and alice.cern/operator-catalog:$VERSION. +IMAGE_TAG_BASE ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs + +# BUNDLE_IMG defines the image:tag used for the bundle. +# You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=/:) +BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION) + +# BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command +BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) + +# USE_IMAGE_DIGESTS defines if images are resolved via tags or digests +# You can enable this value if you would like to use SHA Based Digests +# To enable set flag to true +USE_IMAGE_DIGESTS ?= false +ifeq ($(USE_IMAGE_DIGESTS), true) + BUNDLE_GEN_FLAGS += --use-image-digests +endif + +# Set the Operator SDK version to use. By default, what is installed on the system is used. +# This is useful for CI or a project to utilize a specific version of the operator-sdk toolkit. +OPERATOR_SDK_VERSION ?= unknown + +# Image URL to use all building/pushing image targets +IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager:latest +# ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. +ENVTEST_K8S_VERSION = 1.27.1 + +# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set) +ifeq (,$(shell go env GOBIN)) +GOBIN=$(shell go env GOPATH)/bin +else +GOBIN=$(shell go env GOBIN) +endif + +# CONTAINER_TOOL defines the container tool to be used for building images. +# Be aware that the target commands are only tested with Docker which is +# scaffolded by default. However, you might want to replace it to use other +# tools. (i.e. podman) +CONTAINER_TOOL ?= docker + +# Setting SHELL to bash allows bash commands to be executed by recipes. +# Options are set to exit when a recipe line exits non-zero or a piped command fails. +SHELL = /usr/bin/env bash -o pipefail +.SHELLFLAGS = -ec + +.PHONY: all +all: build + +##@ General + +# The help target prints out all targets with their descriptions organized +# beneath their categories. The categories are represented by '##@' and the +# target descriptions by '##'. The awk commands is responsible for reading the +# entire set of makefiles included in this invocation, looking for lines of the +# file as xyz: ## something, and then pretty-format the target and help. Then, +# if there's a line with ##@ something, that gets pretty-printed as a category. +# More info on the usage of ANSI control characters for terminal formatting: +# https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters +# More info on the awk command: +# http://linuxcommand.org/lc3_adv_awk.php + +.PHONY: help +help: ## Display this help. + @awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m\033[0m\n"} /^[a-zA-Z_0-9-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST) + +##@ Development + +.PHONY: manifests +manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. + # Note that the option maxDescLen=0 was added in the default scaffold in order to sort out the issue + # Too long: must have at most 262144 bytes. By using kubectl apply to create / update resources an annotation + # is created by K8s API to store the latest version of the resource ( kubectl.kubernetes.io/last-applied-configuration). + # However, it has a size limit and if the CRD is too big with so many long descriptions as this one it will cause the failure. + $(CONTROLLER_GEN) rbac:roleName=manager-role crd:maxDescLen=0 webhook paths="./..." output:crd:artifacts:config=config/crd/bases + +# .PHONY: manifests +# manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. +# $(CONTROLLER_GEN) rbac:roleName=manager-role crd webhook paths="./..." output:crd:artifacts:config=config/crd/bases + +.PHONY: generate +generate: controller-gen generate-proto ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations. + $(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" paths="./..." + +.PHONY: fmt +fmt: ## Run go fmt against code. + go fmt ./... + +.PHONY: vet +vet: ## Run go vet against code. + go vet ./... + +.PHONY: test +test: manifests generate fmt vet envtest ## Run tests. + KUBEBUILDER_ASSETS="$(shell $(ENVTEST) use $(ENVTEST_K8S_VERSION) --bin-dir $(LOCALBIN) -p path)" go test ./... -coverprofile cover.out + +##@ Protobuf + +.PHONY: generate-proto +generate-proto: ## Generate protobuf and gRPC Go files from occ.proto. + mkdir -p internal/controller/protos/generated + protoc --go_out=internal/controller/protos/generated --go_opt=paths=source_relative --go-grpc_out=internal/controller/protos/generated --go-grpc_opt=paths=source_relative -I internal/controller/protos internal/controller/protos/occ.proto + +.PHONY: clean-proto +clean-proto: ## Remove generated protobuf and gRPC Go files. + rm -rf internal/controller/protos/generated/* + +##@ Build + +.PHONY: build +build: manifests generate fmt vet ## Build manager binary. + go build -o bin/manager cmd/main.go + +.PHONY: run +run: manifests generate fmt vet ## Run a controller from your host. + go run ./cmd/main.go + +# If you wish built the manager image targeting other platforms you can use the --platform flag. +# (i.e. docker build --platform linux/arm64 ). However, you must enable docker buildKit for it. +# More info: https://docs.docker.com/develop/develop-images/build_enhancements/ +.PHONY: docker-build +docker-build: test ## Build docker image with the manager. + $(CONTAINER_TOOL) build -t ${IMG} . + +.PHONY: docker-push +docker-push: ## Push docker image with the manager. + $(CONTAINER_TOOL) push ${IMG} + +# PLATFORMS defines the target platforms for the manager image be build to provide support to multiple +# architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: +# - able to use docker buildx . More info: https://docs.docker.com/build/buildx/ +# - have enable BuildKit, More info: https://docs.docker.com/develop/develop-images/build_enhancements/ +# - be able to push the image for your registry (i.e. if you do not inform a valid value via IMG=> then the export will fail) +# To properly provided solutions that supports more than one platform you should use this option. +PLATFORMS ?= linux/arm64,linux/amd64,linux/s390x,linux/ppc64le +.PHONY: docker-buildx +docker-buildx: test ## Build and push docker image for the manager for cross-platform support + # copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile + sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile.cross + - $(CONTAINER_TOOL) buildx create --name project-v3-builder + $(CONTAINER_TOOL) buildx use project-v3-builder + - $(CONTAINER_TOOL) buildx build --push --platform=$(PLATFORMS) --tag ${IMG} -f Dockerfile.cross . + - $(CONTAINER_TOOL) buildx rm project-v3-builder + rm Dockerfile.cross + +##@ Deployment + +ifndef ignore-not-found + ignore-not-found = false +endif + +.PHONY: install +install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config. + $(KUSTOMIZE) build config/crd | $(KUBECTL) apply --server-side -f - + +.PHONY: uninstall +uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - + +.PHONY: deploy +deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. + cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} + $(KUSTOMIZE) build config/default | $(KUBECTL) apply -f - --server-side + +.PHONY: undeploy +undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - + +##@ Build Dependencies + +## Location to install dependencies to +LOCALBIN ?= $(shell pwd)/bin +$(LOCALBIN): + mkdir -p $(LOCALBIN) + +## Tool Binaries +KUBECTL ?= kubectl +KUSTOMIZE ?= $(LOCALBIN)/kustomize +CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen +ENVTEST ?= $(LOCALBIN)/setup-envtest + +## Tool Versions +KUSTOMIZE_VERSION ?= v5.0.1 +CONTROLLER_TOOLS_VERSION ?= v0.16.5 + +.PHONY: kustomize +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading. +$(KUSTOMIZE): $(LOCALBIN) + @if test -x $(LOCALBIN)/kustomize && ! $(LOCALBIN)/kustomize version | grep -q $(KUSTOMIZE_VERSION); then \ + echo "$(LOCALBIN)/kustomize version is not expected $(KUSTOMIZE_VERSION). Removing it before installing."; \ + rm -rf $(LOCALBIN)/kustomize; \ + fi + test -s $(LOCALBIN)/kustomize || GOBIN=$(LOCALBIN) GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION) + +.PHONY: controller-gen +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten. +$(CONTROLLER_GEN): $(LOCALBIN) + test -s $(LOCALBIN)/controller-gen && $(LOCALBIN)/controller-gen --version | grep -q $(CONTROLLER_TOOLS_VERSION) || \ + GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) + +.PHONY: envtest +envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. +$(ENVTEST): $(LOCALBIN) + test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + +.PHONY: operator-sdk +OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk +operator-sdk: ## Download operator-sdk locally if necessary. +ifeq (,$(wildcard $(OPERATOR_SDK))) +ifeq (, $(shell which operator-sdk 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPERATOR_SDK)) ;\ + OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \ + curl -sSLo $(OPERATOR_SDK) https://github.com/operator-framework/operator-sdk/releases/download/$(OPERATOR_SDK_VERSION)/operator-sdk_$${OS}_$${ARCH} ;\ + chmod +x $(OPERATOR_SDK) ;\ + } +else +OPERATOR_SDK = $(shell which operator-sdk) +endif +endif + +.PHONY: bundle +bundle: manifests kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. + $(OPERATOR_SDK) generate kustomize manifests -q + cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) + $(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) + $(OPERATOR_SDK) bundle validate ./bundle + +.PHONY: bundle-build +bundle-build: ## Build the bundle image. + docker build -f bundle.Dockerfile -t $(BUNDLE_IMG) . + +.PHONY: bundle-push +bundle-push: ## Push the bundle image. + $(MAKE) docker-push IMG=$(BUNDLE_IMG) + +.PHONY: opm +OPM = ./bin/opm +opm: ## Download opm locally if necessary. +ifeq (,$(wildcard $(OPM))) +ifeq (,$(shell which opm 2>/dev/null)) + @{ \ + set -e ;\ + mkdir -p $(dir $(OPM)) ;\ + OS=$(shell go env GOOS) && ARCH=$(shell go env GOARCH) && \ + curl -sSLo $(OPM) https://github.com/operator-framework/operator-registry/releases/download/v1.23.0/$${OS}-$${ARCH}-opm ;\ + chmod +x $(OPM) ;\ + } +else +OPM = $(shell which opm) +endif +endif + +# A comma-separated list of bundle images (e.g. make catalog-build BUNDLE_IMGS=example.com/operator-bundle:v0.1.0,example.com/operator-bundle:v0.2.0). +# These images MUST exist in a registry and be pull-able. +BUNDLE_IMGS ?= $(BUNDLE_IMG) + +# The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). +CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) + +# Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. +ifneq ($(origin CATALOG_BASE_IMG), undefined) +FROM_INDEX_OPT := --from-index $(CATALOG_BASE_IMG) +endif + +# Build a catalog image by adding bundle images to an empty catalog using the operator package manager tool, 'opm'. +# This recipe invokes 'opm' in 'semver' bundle add mode. For more information on add modes, see: +# https://github.com/operator-framework/community-operators/blob/7f1438c/docs/packaging-operator.md#updating-your-existing-operator +.PHONY: catalog-build +catalog-build: opm ## Build a catalog image. + $(OPM) index add --container-tool docker --mode semver --tag $(CATALOG_IMG) --bundles $(BUNDLE_IMGS) $(FROM_INDEX_OPT) + +# Push the catalog image. +.PHONY: catalog-push +catalog-push: ## Push a catalog image. + $(MAKE) docker-push IMG=$(CATALOG_IMG) diff --git a/control-operator/PROJECT b/control-operator/PROJECT new file mode 100644 index 000000000..3d2493cb6 --- /dev/null +++ b/control-operator/PROJECT @@ -0,0 +1,23 @@ +# Code generated by tool. DO NOT EDIT. +# This file is used to track the info used to scaffold your project +# and allow the plugins properly work. +# More info: https://book.kubebuilder.io/reference/project-config.html +domain: alice.cern +layout: +- go.kubebuilder.io/v4 +plugins: + manifests.sdk.operatorframework.io/v2: {} + scorecard.sdk.operatorframework.io/v2: {} +projectName: operator +repo: github.com/AliceO2Group/Control/operator +resources: +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: alice.cern + group: aliecs + kind: Task + path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + version: v1alpha1 +version: "3" diff --git a/control-operator/README.md b/control-operator/README.md new file mode 100644 index 000000000..4813880ef --- /dev/null +++ b/control-operator/README.md @@ -0,0 +1,94 @@ +# operator +// TODO(user): Add simple overview of use/purpose + +## Description +// TODO(user): An in-depth paragraph about your project and overview of use + +## Getting Started +You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster. +**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster `kubectl cluster-info` shows). + +### Running on the cluster +1. Install Instances of Custom Resources: + +```sh +kubectl apply -f config/samples/ +``` + +2. Build and push your image to the location specified by `IMG`: + +```sh +make docker-build docker-push IMG=/operator:tag +``` + +3. Deploy the controller to the cluster with the image specified by `IMG`: + +```sh +make deploy IMG=/operator:tag +``` + +### Uninstall CRDs +To delete the CRDs from the cluster: + +```sh +make uninstall +``` + +### Undeploy controller +UnDeploy the controller from the cluster: + +```sh +make undeploy +``` + +## Contributing +// TODO(user): Add detailed information on how you would like others to contribute to this project + +### How it works +This project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). + +It uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/), +which provide a reconcile function responsible for synchronizing resources until the desired state is reached on the cluster. + +### Test It Out +1. Install the CRDs into the cluster: + +```sh +make install +``` + +2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): + +```sh +make run +``` + +**NOTE:** You can also run this in one step by running: `make install run` + +### Modifying the API definitions +If you are editing the API definitions, generate the manifests such as CRs or CRDs using: + +```sh +make manifests +``` + +**NOTE:** Run `make --help` for more information on all potential `make` targets + +More information can be found via the [Kubebuilder Documentation](https://book.kubebuilder.io/introduction.html) + +## License + +Copyright 2024. + +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. + diff --git a/control-operator/api/v1alpha1/groupversion_info.go b/control-operator/api/v1alpha1/groupversion_info.go new file mode 100644 index 000000000..55a752379 --- /dev/null +++ b/control-operator/api/v1alpha1/groupversion_info.go @@ -0,0 +1,44 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +// Package v1alpha1 contains API Schema definitions for the aliecs v1alpha1 API group +// +kubebuilder:object:generate=true +// +groupName=aliecs.alice.cern +package v1alpha1 + +import ( + "k8s.io/apimachinery/pkg/runtime/schema" + "sigs.k8s.io/controller-runtime/pkg/scheme" +) + +var ( + // GroupVersion is group version used to register these objects + GroupVersion = schema.GroupVersion{Group: "aliecs.alice.cern", Version: "v1alpha1"} + + // SchemeBuilder is used to add go types to the GroupVersionKind scheme + SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion} + + // AddToScheme adds the types in this group-version to the given scheme. + AddToScheme = SchemeBuilder.AddToScheme +) diff --git a/control-operator/api/v1alpha1/task_types.go b/control-operator/api/v1alpha1/task_types.go new file mode 100644 index 000000000..00bca1db5 --- /dev/null +++ b/control-operator/api/v1alpha1/task_types.go @@ -0,0 +1,125 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +type TaskSpecControl struct { + // +kubebuilder:validation:Enum=direct;fairmq;basic;hook + Mode string `json:"mode,omitempty"` + // +kubebuilder:validation:Minimum:1024 + // +kubebuilder:validation:Maximum:49151 + Port int `json:"port,omitempty"` +} + +type TaskSpecChannelInbound struct { + Name string `json:"name"` + // +kubebuilder:validation:Enum=push;pull;pub;sub + Type string `json:"type"` + SndBufSize int `json:"sndBufSize,omitempty"` + RcvBufSize int `json:"rcvBufSize,omitempty"` + RateLogging string `json:"rateLogging,omitempty"` + // +kubebuilder:validation:Enum=default;zeromq;nanomsg;shmem + // +kubebuilder:default=default + Transport string `json:"transport,omitempty"` + Target string `json:"target"` + + Global string `json:"global"` + // +kubebuilder:validation:Enum=tcp;ipc + // +kubebuilder:default=tcp + Addressing string `json:"addressing,omitempty"` +} + +type TaskSpecChannelOutbound struct { + Name string `json:"name"` + // +kubebuilder:validation:Enum=push;pull;pub;sub + Type string `json:"type"` + SndBufSize int `json:"sndBufSize,omitempty"` + RcvBufSize int `json:"rcvBufSize,omitempty"` + RateLogging string `json:"rateLogging,omitempty"` + // +kubebuilder:validation:Enum=default;zeromq;nanomsg;shmem + // +kubebuilder:default=default + Transport string `json:"transport,omitempty"` + Target string `json:"target"` +} + +// TaskSpec defines the desired state of Task +type TaskSpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // Foo is an example field of Task. Edit task_types.go to remove/update + Pod v1.PodSpec `json:"pod,omitempty"` + Control TaskSpecControl `json:"control,omitempty"` + Bind []TaskSpecChannelInbound `json:"bind,omitempty"` + Connect []TaskSpecChannelOutbound `json:"connect,omitempty"` + Properties map[string]string `json:"properties,omitempty"` + Arguments map[string]string `json:"arguments,omitempty"` + // +kubebuilder:validation:Enum=standby;deployed;configured;running + State string `json:"state,omitempty"` // this is the *requested* state, there are other states the task may end up in but cannot be requested +} + +// TaskStatus defines the observed state of Task +type TaskStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file + Pod v1.PodStatus `json:"pod,omitempty"` + State string `json:"state,omitempty"` + Error string `json:"error,omitempty"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Desired",type="string",JSONPath=".spec.state" +// +kubebuilder:printcolumn:name="Actual",type="string",JSONPath=".status.state" +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" + +// Task is the Schema for the tasks API +type Task struct { + metav1.TypeMeta `json:",inline"` + metav1.ObjectMeta `json:"metadata,omitempty"` + + Spec TaskSpec `json:"spec,omitempty"` + Status TaskStatus `json:"status,omitempty"` +} + +//+kubebuilder:object:root=true + +// TaskList contains a list of Task +type TaskList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitempty"` + Items []Task `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Task{}, &TaskList{}) +} diff --git a/control-operator/api/v1alpha1/zz_generated.deepcopy.go b/control-operator/api/v1alpha1/zz_generated.deepcopy.go new file mode 100644 index 000000000..690b50a70 --- /dev/null +++ b/control-operator/api/v1alpha1/zz_generated.deepcopy.go @@ -0,0 +1,194 @@ +//go:build !ignore_autogenerated + +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +// Code generated by controller-gen. DO NOT EDIT. + +package v1alpha1 + +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 *Task) DeepCopyInto(out *Task) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Task. +func (in *Task) DeepCopy() *Task { + if in == nil { + return nil + } + out := new(Task) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Task) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskList) DeepCopyInto(out *TaskList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Task, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskList. +func (in *TaskList) DeepCopy() *TaskList { + if in == nil { + return nil + } + out := new(TaskList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TaskList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskSpec) DeepCopyInto(out *TaskSpec) { + *out = *in + in.Pod.DeepCopyInto(&out.Pod) + out.Control = in.Control + if in.Bind != nil { + in, out := &in.Bind, &out.Bind + *out = make([]TaskSpecChannelInbound, len(*in)) + copy(*out, *in) + } + if in.Connect != nil { + in, out := &in.Connect, &out.Connect + *out = make([]TaskSpecChannelOutbound, len(*in)) + copy(*out, *in) + } + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.Arguments != nil { + in, out := &in.Arguments, &out.Arguments + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskSpec. +func (in *TaskSpec) DeepCopy() *TaskSpec { + if in == nil { + return nil + } + out := new(TaskSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskSpecChannelInbound) DeepCopyInto(out *TaskSpecChannelInbound) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskSpecChannelInbound. +func (in *TaskSpecChannelInbound) DeepCopy() *TaskSpecChannelInbound { + if in == nil { + return nil + } + out := new(TaskSpecChannelInbound) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskSpecChannelOutbound) DeepCopyInto(out *TaskSpecChannelOutbound) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskSpecChannelOutbound. +func (in *TaskSpecChannelOutbound) DeepCopy() *TaskSpecChannelOutbound { + if in == nil { + return nil + } + out := new(TaskSpecChannelOutbound) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskSpecControl) DeepCopyInto(out *TaskSpecControl) { + *out = *in +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskSpecControl. +func (in *TaskSpecControl) DeepCopy() *TaskSpecControl { + if in == nil { + return nil + } + out := new(TaskSpecControl) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskStatus) DeepCopyInto(out *TaskStatus) { + *out = *in + in.Pod.DeepCopyInto(&out.Pod) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskStatus. +func (in *TaskStatus) DeepCopy() *TaskStatus { + if in == nil { + return nil + } + out := new(TaskStatus) + in.DeepCopyInto(out) + return out +} diff --git a/control-operator/cmd/main.go b/control-operator/cmd/main.go new file mode 100644 index 000000000..5773164eb --- /dev/null +++ b/control-operator/cmd/main.go @@ -0,0 +1,117 @@ +/* +Copyright 2024. + +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 main + +import ( + "flag" + "os" + + // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) + // to ensure that exec-entrypoint and run can make use of them. + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/healthz" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/metrics/server" + "sigs.k8s.io/controller-runtime/pkg/webhook" + + aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + "github.com/AliceO2Group/ControlOperator/internal/controller" + //+kubebuilder:scaffold:imports +) + +var ( + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + + utilruntime.Must(aliecsv1alpha1.AddToScheme(scheme)) + //+kubebuilder:scaffold:scheme +} + +func main() { + var metricsAddr string + var enableLeaderElection bool + var probeAddr string + flag.StringVar(&metricsAddr, "metrics-bind-address", ":9080", "The address the metric endpoint binds to.") + flag.StringVar(&probeAddr, "health-probe-bind-address", ":9081", "The address the probe endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + opts := zap.Options{ + Development: true, + } + opts.BindFlags(flag.CommandLine) + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Metrics: server.Options{BindAddress: metricsAddr}, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "03b91661.alice.cern", + WebhookServer: webhook.NewServer(webhook.Options{Port: 9443}), + // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily + // when the Manager ends. This requires the binary to immediately end when the + // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly + // speeds up voluntary leader transitions as the new leader don't have to wait + // LeaseDuration time first. + // + // In the default scaffold provided, the program ends immediately after + // the manager stops, so would be fine to enable this option. However, + // if you are doing or is intended to do any operation such as perform cleanups + // after the manager stops then its usage might be unsafe. + // LeaderElectionReleaseOnCancel: true, + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (&controller.TaskReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor("task-controller"), // used within reconcile method to emit events + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Task") + os.Exit(1) + } + //+kubebuilder:scaffold:builder + + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + os.Exit(1) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + os.Exit(1) + } + + setupLog.Info("starting manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } +} diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml new file mode 100644 index 000000000..a7b823e63 --- /dev/null +++ b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml @@ -0,0 +1,4737 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.5 + name: tasks.aliecs.alice.cern +spec: + group: aliecs.alice.cern + names: + kind: Task + listKind: TaskList + plural: tasks + singular: task + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.state + name: Desired + type: string + - jsonPath: .status.state + name: Actual + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + arguments: + additionalProperties: + type: string + type: object + bind: + items: + properties: + addressing: + default: tcp + enum: + - tcp + - ipc + type: string + global: + type: string + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - global + - name + - target + - type + type: object + type: array + connect: + items: + properties: + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - name + - target + - type + type: object + type: array + control: + properties: + mode: + enum: + - direct + - fairmq + - basic + - hook + type: string + port: + type: integer + type: object + pod: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-type: atomic + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + x-kubernetes-list-type: atomic + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + searches: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + x-kubernetes-list-type: atomic + ip: + type: string + required: + - ip + type: object + type: array + x-kubernetes-list-map-keys: + - ip + x-kubernetes-list-type: map + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + hostnameOverride: + type: string + imagePullSecrets: + items: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + initContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + x-kubernetes-list-type: atomic + resourceClaims: + items: + properties: + name: + type: string + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + securityContext: + properties: + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxChangePolicy: + type: string + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + supplementalGroupsPolicy: + type: string + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + items: + properties: + awsElasticBlockStore: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + azureDisk: + properties: + cachingMode: + type: string + diskName: + type: string + diskURI: + type: string + fsType: + default: ext4 + type: string + kind: + type: string + readOnly: + default: false + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + properties: + readOnly: + type: boolean + secretName: + type: string + shareName: + type: string + required: + - secretName + - shareName + type: object + cephfs: + properties: + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + path: + type: string + readOnly: + type: boolean + secretFile: + type: string + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + type: string + required: + - monitors + type: object + cinder: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + type: string + required: + - volumeID + type: object + configMap: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + properties: + driver: + type: string + fsType: + type: string + nodePublishSecretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + type: boolean + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + type: object + downwardAPI: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + emptyDir: + properties: + medium: + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + properties: + volumeClaimTemplate: + properties: + metadata: + type: object + spec: + properties: + accessModes: + items: + type: string + type: array + x-kubernetes-list-type: atomic + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + type: string + volumeAttributesClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + required: + - spec + type: object + type: object + fc: + properties: + fsType: + type: string + lun: + format: int32 + type: integer + readOnly: + type: boolean + targetWWNs: + items: + type: string + type: array + x-kubernetes-list-type: atomic + wwids: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + flexVolume: + properties: + driver: + type: string + fsType: + type: string + options: + additionalProperties: + type: string + type: object + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + properties: + datasetName: + type: string + datasetUUID: + type: string + type: object + gcePersistentDisk: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + pdName: + type: string + readOnly: + type: boolean + required: + - pdName + type: object + gitRepo: + properties: + directory: + type: string + repository: + type: string + revision: + type: string + required: + - repository + type: object + glusterfs: + properties: + endpoints: + type: string + path: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + type: object + hostPath: + properties: + path: + type: string + type: + type: string + required: + - path + type: object + image: + properties: + pullPolicy: + type: string + reference: + type: string + type: object + iscsi: + properties: + chapAuthDiscovery: + type: boolean + chapAuthSession: + type: boolean + fsType: + type: string + initiatorName: + type: string + iqn: + type: string + iscsiInterface: + default: default + type: string + lun: + format: int32 + type: integer + portals: + items: + type: string + type: array + x-kubernetes-list-type: atomic + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + type: string + nfs: + properties: + path: + type: string + readOnly: + type: boolean + server: + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + properties: + fsType: + type: string + pdID: + type: string + required: + - pdID + type: object + portworxVolume: + properties: + fsType: + type: string + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + projected: + properties: + defaultMode: + format: int32 + type: integer + sources: + items: + properties: + clusterTrustBundle: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + optional: + type: boolean + path: + type: string + signerName: + type: string + required: + - path + type: object + configMap: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + properties: + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + userAnnotations: + additionalProperties: + type: string + type: object + required: + - keyType + - signerName + type: object + secret: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + properties: + audience: + type: string + expirationSeconds: + format: int64 + type: integer + path: + type: string + required: + - path + type: object + type: object + type: array + x-kubernetes-list-type: atomic + type: object + quobyte: + properties: + group: + type: string + readOnly: + type: boolean + registry: + type: string + tenant: + type: string + user: + type: string + volume: + type: string + required: + - registry + - volume + type: object + rbd: + properties: + fsType: + type: string + image: + type: string + keyring: + default: /etc/ceph/keyring + type: string + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + pool: + default: rbd + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + default: admin + type: string + required: + - image + - monitors + type: object + scaleIO: + properties: + fsType: + default: xfs + type: string + gateway: + type: string + protectionDomain: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + type: boolean + storageMode: + default: ThinProvisioned + type: string + storagePool: + type: string + system: + type: string + volumeName: + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + optional: + type: boolean + secretName: + type: string + type: object + storageos: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + type: string + volumeNamespace: + type: string + type: object + vsphereVolume: + properties: + fsType: + type: string + storagePolicyID: + type: string + storagePolicyName: + type: string + volumePath: + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + workloadRef: + properties: + name: + type: string + podGroup: + type: string + podGroupReplicaKey: + type: string + required: + - name + - podGroup + type: object + required: + - containers + type: object + properties: + additionalProperties: + type: string + type: object + state: + enum: + - standby + - deployed + - configured + - running + type: string + type: object + status: + properties: + error: + type: string + pod: + properties: + allocatedResources: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + conditions: + items: + properties: + lastProbeTime: + format: date-time + type: string + lastTransitionTime: + format: date-time + type: string + message: + type: string + observedGeneration: + format: int64 + type: integer + reason: + type: string + status: + type: string + type: + type: string + required: + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + containerStatuses: + items: + properties: + allocatedResources: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + allocatedResourcesStatus: + items: + properties: + name: + type: string + resources: + items: + properties: + health: + type: string + resourceID: + type: string + required: + - resourceID + type: object + type: array + x-kubernetes-list-map-keys: + - resourceID + x-kubernetes-list-type: map + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + containerID: + type: string + image: + type: string + imageID: + type: string + lastState: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + name: + type: string + ready: + type: boolean + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartCount: + format: int32 + type: integer + started: + type: boolean + state: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + stopSignal: + type: string + user: + properties: + linux: + properties: + gid: + format: int64 + type: integer + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + uid: + format: int64 + type: integer + required: + - gid + - uid + type: object + type: object + volumeMounts: + items: + properties: + mountPath: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + required: + - image + - imageID + - name + - ready + - restartCount + type: object + type: array + x-kubernetes-list-type: atomic + ephemeralContainerStatuses: + items: + properties: + allocatedResources: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + allocatedResourcesStatus: + items: + properties: + name: + type: string + resources: + items: + properties: + health: + type: string + resourceID: + type: string + required: + - resourceID + type: object + type: array + x-kubernetes-list-map-keys: + - resourceID + x-kubernetes-list-type: map + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + containerID: + type: string + image: + type: string + imageID: + type: string + lastState: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + name: + type: string + ready: + type: boolean + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartCount: + format: int32 + type: integer + started: + type: boolean + state: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + stopSignal: + type: string + user: + properties: + linux: + properties: + gid: + format: int64 + type: integer + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + uid: + format: int64 + type: integer + required: + - gid + - uid + type: object + type: object + volumeMounts: + items: + properties: + mountPath: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + required: + - image + - imageID + - name + - ready + - restartCount + type: object + type: array + x-kubernetes-list-type: atomic + extendedResourceClaimStatus: + properties: + requestMappings: + items: + properties: + containerName: + type: string + requestName: + type: string + resourceName: + type: string + required: + - containerName + - requestName + - resourceName + type: object + type: array + x-kubernetes-list-type: atomic + resourceClaimName: + type: string + required: + - requestMappings + - resourceClaimName + type: object + hostIP: + type: string + hostIPs: + items: + properties: + ip: + type: string + required: + - ip + type: object + type: array + x-kubernetes-list-type: atomic + initContainerStatuses: + items: + properties: + allocatedResources: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + allocatedResourcesStatus: + items: + properties: + name: + type: string + resources: + items: + properties: + health: + type: string + resourceID: + type: string + required: + - resourceID + type: object + type: array + x-kubernetes-list-map-keys: + - resourceID + x-kubernetes-list-type: map + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + containerID: + type: string + image: + type: string + imageID: + type: string + lastState: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + name: + type: string + ready: + type: boolean + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartCount: + format: int32 + type: integer + started: + type: boolean + state: + properties: + running: + properties: + startedAt: + format: date-time + type: string + type: object + terminated: + properties: + containerID: + type: string + exitCode: + format: int32 + type: integer + finishedAt: + format: date-time + type: string + message: + type: string + reason: + type: string + signal: + format: int32 + type: integer + startedAt: + format: date-time + type: string + required: + - exitCode + type: object + waiting: + properties: + message: + type: string + reason: + type: string + type: object + type: object + stopSignal: + type: string + user: + properties: + linux: + properties: + gid: + format: int64 + type: integer + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + uid: + format: int64 + type: integer + required: + - gid + - uid + type: object + type: object + volumeMounts: + items: + properties: + mountPath: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + required: + - image + - imageID + - name + - ready + - restartCount + type: object + type: array + x-kubernetes-list-type: atomic + message: + type: string + nominatedNodeName: + type: string + observedGeneration: + format: int64 + type: integer + phase: + type: string + podIP: + type: string + podIPs: + items: + properties: + ip: + type: string + required: + - ip + type: object + type: array + x-kubernetes-list-map-keys: + - ip + x-kubernetes-list-type: map + qosClass: + type: string + reason: + type: string + resize: + type: string + resourceClaimStatuses: + items: + properties: + name: + type: string + resourceClaimName: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + startTime: + format: date-time + type: string + type: object + state: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} diff --git a/control-operator/config/crd/kustomization.yaml b/control-operator/config/crd/kustomization.yaml new file mode 100644 index 000000000..dcc3db956 --- /dev/null +++ b/control-operator/config/crd/kustomization.yaml @@ -0,0 +1,21 @@ +# This kustomization.yaml is not intended to be run by itself, +# since it depends on service name and namespace that are out of this kustomize package. +# It should be run by config/default +resources: +- bases/aliecs.alice.cern_tasks.yaml +#+kubebuilder:scaffold:crdkustomizeresource + +patches: +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix. +# patches here are for enabling the conversion webhook for each CRD +#- path: patches/webhook_in_tasks.yaml +#+kubebuilder:scaffold:crdkustomizewebhookpatch + +# [CERTMANAGER] To enable cert-manager, uncomment all the sections with [CERTMANAGER] prefix. +# patches here are for enabling the CA injection for each CRD +#- path: patches/cainjection_in_tasks.yaml +#+kubebuilder:scaffold:crdkustomizecainjectionpatch + +# the following config is for teaching kustomize how to do kustomization for CRDs. +configurations: +- kustomizeconfig.yaml diff --git a/control-operator/config/crd/kustomizeconfig.yaml b/control-operator/config/crd/kustomizeconfig.yaml new file mode 100644 index 000000000..ec5c150a9 --- /dev/null +++ b/control-operator/config/crd/kustomizeconfig.yaml @@ -0,0 +1,19 @@ +# This file is for teaching kustomize how to substitute name and namespace reference in CRD +nameReference: +- kind: Service + version: v1 + fieldSpecs: + - kind: CustomResourceDefinition + version: v1 + group: apiextensions.k8s.io + path: spec/conversion/webhook/clientConfig/service/name + +namespace: +- kind: CustomResourceDefinition + version: v1 + group: apiextensions.k8s.io + path: spec/conversion/webhook/clientConfig/service/namespace + create: false + +varReference: +- path: metadata/annotations diff --git a/control-operator/config/crd/patches/cainjection_in_tasks.yaml b/control-operator/config/crd/patches/cainjection_in_tasks.yaml new file mode 100644 index 000000000..f5feffa47 --- /dev/null +++ b/control-operator/config/crd/patches/cainjection_in_tasks.yaml @@ -0,0 +1,7 @@ +# The following patch adds a directive for certmanager to inject CA into the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + cert-manager.io/inject-ca-from: CERTIFICATE_NAMESPACE/CERTIFICATE_NAME + name: tasks.aliecs.alice.cern diff --git a/control-operator/config/crd/patches/webhook_in_tasks.yaml b/control-operator/config/crd/patches/webhook_in_tasks.yaml new file mode 100644 index 000000000..b69d74838 --- /dev/null +++ b/control-operator/config/crd/patches/webhook_in_tasks.yaml @@ -0,0 +1,16 @@ +# The following patch enables a conversion webhook for the CRD +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: tasks.aliecs.alice.cern +spec: + conversion: + strategy: Webhook + webhook: + clientConfig: + service: + namespace: system + name: webhook-service + path: /convert + conversionReviewVersions: + - v1 diff --git a/control-operator/config/default/kustomization.yaml b/control-operator/config/default/kustomization.yaml new file mode 100644 index 000000000..b2bc27ead --- /dev/null +++ b/control-operator/config/default/kustomization.yaml @@ -0,0 +1,145 @@ +# Adds namespace to all resources. +namespace: operator-system + +# Value of this field is prepended to the +# names of all resources, e.g. a deployment named +# "wordpress" becomes "alices-wordpress". +# Note that it should also match with the prefix (text before '-') of the namespace +# field above. +namePrefix: operator- + +# Labels to add to all resources and selectors. +#labels: +#- includeSelectors: true +# pairs: +# someName: someValue + +resources: +- ../crd +- ../rbac +- ../manager +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- ../webhook +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. 'WEBHOOK' components are required. +#- ../certmanager +# [PROMETHEUS] To enable prometheus monitor, uncomment all sections with 'PROMETHEUS'. +#- ../prometheus + +patchesStrategicMerge: +# Protect the /metrics endpoint by putting it behind auth. +# If you want your controller-manager to expose the /metrics +# endpoint w/o any authn/z, please comment the following line. +# TODO: replace kube-rbac-proxy with WithAuthenticationAndAuthorization (see kubebuilder deprecation notice) +#- manager_auth_proxy_patch.yaml + + + +# [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in +# crd/kustomization.yaml +#- manager_webhook_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER'. +# Uncomment 'CERTMANAGER' sections in crd/kustomization.yaml to enable the CA injection in the admission webhooks. +# 'CERTMANAGER' needs to be enabled to use ca injection +#- webhookcainjection_patch.yaml + +# [CERTMANAGER] To enable cert-manager, uncomment all sections with 'CERTMANAGER' prefix. +# Uncomment the following replacements to add the cert-manager CA injection annotations +#replacements: +# - source: # Add cert-manager annotation to ValidatingWebhookConfiguration, MutatingWebhookConfiguration and CRDs +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.namespace # namespace of the certificate CR +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 0 +# create: true +# - source: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# name: serving-cert # this name should match the one in certificate.yaml +# fieldPath: .metadata.name +# targets: +# - select: +# kind: ValidatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: MutatingWebhookConfiguration +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - select: +# kind: CustomResourceDefinition +# fieldPaths: +# - .metadata.annotations.[cert-manager.io/inject-ca-from] +# options: +# delimiter: '/' +# index: 1 +# create: true +# - source: # Add cert-manager annotation to the webhook Service +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.name # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 0 +# create: true +# - source: +# kind: Service +# version: v1 +# name: webhook-service +# fieldPath: .metadata.namespace # namespace of the service +# targets: +# - select: +# kind: Certificate +# group: cert-manager.io +# version: v1 +# fieldPaths: +# - .spec.dnsNames.0 +# - .spec.dnsNames.1 +# options: +# delimiter: '.' +# index: 1 +# create: true diff --git a/control-operator/config/default/manager_auth_proxy_patch.yaml b/control-operator/config/default/manager_auth_proxy_patch.yaml new file mode 100644 index 000000000..73fad2a67 --- /dev/null +++ b/control-operator/config/default/manager_auth_proxy_patch.yaml @@ -0,0 +1,39 @@ +# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: kube-rbac-proxy + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.14.1 + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=0" + ports: + - containerPort: 8443 + protocol: TCP + name: https + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + - name: manager + args: + - "--health-probe-bind-address=:8081" + - "--metrics-bind-address=127.0.0.1:8080" + - "--leader-elect" diff --git a/control-operator/config/default/manager_config_patch.yaml b/control-operator/config/default/manager_config_patch.yaml new file mode 100644 index 000000000..f6f589169 --- /dev/null +++ b/control-operator/config/default/manager_config_patch.yaml @@ -0,0 +1,10 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: controller-manager + namespace: system +spec: + template: + spec: + containers: + - name: manager diff --git a/control-operator/config/manager/kustomization.yaml b/control-operator/config/manager/kustomization.yaml new file mode 100644 index 000000000..e3c9ed1ad --- /dev/null +++ b/control-operator/config/manager/kustomization.yaml @@ -0,0 +1,8 @@ +resources: +- manager.yaml +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +images: +- name: controller + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager + newTag: latest diff --git a/control-operator/config/manager/manager.yaml b/control-operator/config/manager/manager.yaml new file mode 100644 index 000000000..3a355e8ee --- /dev/null +++ b/control-operator/config/manager/manager.yaml @@ -0,0 +1,106 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: namespace + app.kubernetes.io/instance: system + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: system +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: controller-manager + namespace: system + labels: + control-plane: controller-manager + app.kubernetes.io/name: daemonset + app.kubernetes.io/instance: controller-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: controller-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: controller-manager + spec: + # TODO(user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + hostNetwork: true + imagePullSecrets: + - name: gitlab-registry-secret + securityContext: + runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:9083 + - --metrics-bind-address=:9080 + image: controller:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 9083 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 9083 + initialDelaySeconds: 5 + periodSeconds: 10 + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 diff --git a/control-operator/config/manifests/kustomization.yaml b/control-operator/config/manifests/kustomization.yaml new file mode 100644 index 000000000..61b939e6f --- /dev/null +++ b/control-operator/config/manifests/kustomization.yaml @@ -0,0 +1,28 @@ +# These resources constitute the fully configured set of manifests +# used to generate the 'manifests/' directory in a bundle. +resources: +- bases/operator.clusterserviceversion.yaml +- ../default +- ../samples +- ../scorecard + +# [WEBHOOK] To enable webhooks, uncomment all the sections with [WEBHOOK] prefix. +# Do NOT uncomment sections with prefix [CERTMANAGER], as OLM does not support cert-manager. +# These patches remove the unnecessary "cert" volume and its manager container volumeMount. +#patchesJson6902: +#- target: +# group: apps +# version: v1 +# kind: Deployment +# name: controller-manager +# namespace: system +# patch: |- +# # Remove the manager container's "cert" volumeMount, since OLM will create and mount a set of certs. +# # Update the indices in this path if adding or removing containers/volumeMounts in the manager's Deployment. +# - op: remove + +# path: /spec/template/spec/containers/0/volumeMounts/0 +# # Remove the "cert" volume, since OLM will create and mount a set of certs. +# # Update the indices in this path if adding or removing volumes in the manager's Deployment. +# - op: remove +# path: /spec/template/spec/volumes/0 diff --git a/control-operator/config/prometheus/kustomization.yaml b/control-operator/config/prometheus/kustomization.yaml new file mode 100644 index 000000000..ed137168a --- /dev/null +++ b/control-operator/config/prometheus/kustomization.yaml @@ -0,0 +1,2 @@ +resources: +- monitor.yaml diff --git a/control-operator/config/prometheus/monitor.yaml b/control-operator/config/prometheus/monitor.yaml new file mode 100644 index 000000000..50225c34c --- /dev/null +++ b/control-operator/config/prometheus/monitor.yaml @@ -0,0 +1,26 @@ + +# Prometheus Monitor Service (Metrics) +apiVersion: monitoring.coreos.com/v1 +kind: ServiceMonitor +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: servicemonitor + app.kubernetes.io/instance: controller-manager-metrics-monitor + app.kubernetes.io/component: metrics + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-monitor + namespace: system +spec: + endpoints: + - path: /metrics + port: https + scheme: https + bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token + tlsConfig: + insecureSkipVerify: true + selector: + matchLabels: + control-plane: controller-manager diff --git a/control-operator/config/rbac/auth_proxy_client_clusterrole.yaml b/control-operator/config/rbac/auth_proxy_client_clusterrole.yaml new file mode 100644 index 000000000..8f6e4d166 --- /dev/null +++ b/control-operator/config/rbac/auth_proxy_client_clusterrole.yaml @@ -0,0 +1,16 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: clusterrole + app.kubernetes.io/instance: metrics-reader + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: metrics-reader +rules: +- nonResourceURLs: + - "/metrics" + verbs: + - get diff --git a/control-operator/config/rbac/auth_proxy_role.yaml b/control-operator/config/rbac/auth_proxy_role.yaml new file mode 100644 index 000000000..c48234ef0 --- /dev/null +++ b/control-operator/config/rbac/auth_proxy_role.yaml @@ -0,0 +1,24 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: clusterrole + app.kubernetes.io/instance: proxy-role + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: proxy-role +rules: +- apiGroups: + - authentication.k8s.io + resources: + - tokenreviews + verbs: + - create +- apiGroups: + - authorization.k8s.io + resources: + - subjectaccessreviews + verbs: + - create diff --git a/control-operator/config/rbac/auth_proxy_role_binding.yaml b/control-operator/config/rbac/auth_proxy_role_binding.yaml new file mode 100644 index 000000000..8cb153a80 --- /dev/null +++ b/control-operator/config/rbac/auth_proxy_role_binding.yaml @@ -0,0 +1,19 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: clusterrolebinding + app.kubernetes.io/instance: proxy-rolebinding + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: proxy-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: proxy-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/control-operator/config/rbac/auth_proxy_service.yaml b/control-operator/config/rbac/auth_proxy_service.yaml new file mode 100644 index 000000000..8fa979bad --- /dev/null +++ b/control-operator/config/rbac/auth_proxy_service.yaml @@ -0,0 +1,21 @@ +apiVersion: v1 +kind: Service +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: service + app.kubernetes.io/instance: controller-manager-metrics-service + app.kubernetes.io/component: kube-rbac-proxy + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager-metrics-service + namespace: system +spec: + ports: + - name: https + port: 8443 + protocol: TCP + targetPort: https + selector: + control-plane: controller-manager diff --git a/control-operator/config/rbac/kustomization.yaml b/control-operator/config/rbac/kustomization.yaml new file mode 100644 index 000000000..731832a6a --- /dev/null +++ b/control-operator/config/rbac/kustomization.yaml @@ -0,0 +1,18 @@ +resources: +# All RBAC will be applied under this service account in +# the deployment namespace. You may comment out this resource +# if your manager will use a service account that exists at +# runtime. Be sure to update RoleBinding and ClusterRoleBinding +# subjects if changing service account names. +- service_account.yaml +- role.yaml +- role_binding.yaml +- leader_election_role.yaml +- leader_election_role_binding.yaml +# Comment the following 4 lines if you want to disable +# the auth proxy (https://github.com/brancz/kube-rbac-proxy) +# which protects your /metrics endpoint. +- auth_proxy_service.yaml +- auth_proxy_role.yaml +- auth_proxy_role_binding.yaml +- auth_proxy_client_clusterrole.yaml diff --git a/control-operator/config/rbac/leader_election_role.yaml b/control-operator/config/rbac/leader_election_role.yaml new file mode 100644 index 000000000..6a5caf3f6 --- /dev/null +++ b/control-operator/config/rbac/leader_election_role.yaml @@ -0,0 +1,44 @@ +# permissions to do leader election. +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/name: role + app.kubernetes.io/instance: leader-election-role + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: leader-election-role +rules: +- apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - coordination.k8s.io + resources: + - leases + verbs: + - get + - list + - watch + - create + - update + - patch + - delete +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch diff --git a/control-operator/config/rbac/leader_election_role_binding.yaml b/control-operator/config/rbac/leader_election_role_binding.yaml new file mode 100644 index 000000000..f07fa72af --- /dev/null +++ b/control-operator/config/rbac/leader_election_role_binding.yaml @@ -0,0 +1,19 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/name: rolebinding + app.kubernetes.io/instance: leader-election-rolebinding + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: leader-election-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: leader-election-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/control-operator/config/rbac/role.yaml b/control-operator/config/rbac/role.yaml new file mode 100644 index 000000000..a6843b9f2 --- /dev/null +++ b/control-operator/config/rbac/role.yaml @@ -0,0 +1,51 @@ +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: manager-role +rules: +- apiGroups: + - "" + resources: + - events + verbs: + - create + - patch +- apiGroups: + - aliecs.alice.cern + resources: + - tasks + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - tasks/finalizers + verbs: + - update +- apiGroups: + - aliecs.alice.cern + resources: + - tasks/status + verbs: + - get + - patch + - update +- apiGroups: + - "" + resources: + - pods + verbs: + - create + - delete + - get + - list + - patch + - update + - watch diff --git a/control-operator/config/rbac/role_binding.yaml b/control-operator/config/rbac/role_binding.yaml new file mode 100644 index 000000000..b8b41d60d --- /dev/null +++ b/control-operator/config/rbac/role_binding.yaml @@ -0,0 +1,19 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/name: clusterrolebinding + app.kubernetes.io/instance: manager-rolebinding + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: manager-rolebinding +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: manager-role +subjects: +- kind: ServiceAccount + name: controller-manager + namespace: system diff --git a/control-operator/config/rbac/service_account.yaml b/control-operator/config/rbac/service_account.yaml new file mode 100644 index 000000000..00526cc6b --- /dev/null +++ b/control-operator/config/rbac/service_account.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/name: serviceaccount + app.kubernetes.io/instance: controller-manager-sa + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: controller-manager + namespace: system diff --git a/control-operator/config/rbac/task_editor_role.yaml b/control-operator/config/rbac/task_editor_role.yaml new file mode 100644 index 000000000..77de69cdc --- /dev/null +++ b/control-operator/config/rbac/task_editor_role.yaml @@ -0,0 +1,31 @@ +# permissions for end users to edit tasks. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: clusterrole + app.kubernetes.io/instance: task-editor-role + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: task-editor-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - tasks + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - tasks/status + verbs: + - get diff --git a/control-operator/config/rbac/task_viewer_role.yaml b/control-operator/config/rbac/task_viewer_role.yaml new file mode 100644 index 000000000..8eaecaa1c --- /dev/null +++ b/control-operator/config/rbac/task_viewer_role.yaml @@ -0,0 +1,27 @@ +# permissions for end users to view tasks. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: clusterrole + app.kubernetes.io/instance: task-viewer-role + app.kubernetes.io/component: rbac + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: task-viewer-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - tasks + verbs: + - get + - list + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - tasks/status + verbs: + - get diff --git a/control-operator/config/samples/aliecs_v1alpha1_task.yaml b/control-operator/config/samples/aliecs_v1alpha1_task.yaml new file mode 100644 index 000000000..b5c853bae --- /dev/null +++ b/control-operator/config/samples/aliecs_v1alpha1_task.yaml @@ -0,0 +1,12 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + labels: + app.kubernetes.io/name: task + app.kubernetes.io/instance: task-sample + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + app.kubernetes.io/created-by: operator + name: task-sample +spec: + # TODO(user): Add fields here diff --git a/control-operator/config/samples/kustomization.yaml b/control-operator/config/samples/kustomization.yaml new file mode 100644 index 000000000..498ea9f86 --- /dev/null +++ b/control-operator/config/samples/kustomization.yaml @@ -0,0 +1,4 @@ +## Append samples of your project ## +resources: +- aliecs_v1alpha1_task.yaml +#+kubebuilder:scaffold:manifestskustomizesamples diff --git a/control-operator/config/scorecard/bases/config.yaml b/control-operator/config/scorecard/bases/config.yaml new file mode 100644 index 000000000..c77047841 --- /dev/null +++ b/control-operator/config/scorecard/bases/config.yaml @@ -0,0 +1,7 @@ +apiVersion: scorecard.operatorframework.io/v1alpha3 +kind: Configuration +metadata: + name: config +stages: +- parallel: true + tests: [] diff --git a/control-operator/config/scorecard/kustomization.yaml b/control-operator/config/scorecard/kustomization.yaml new file mode 100644 index 000000000..50cd2d084 --- /dev/null +++ b/control-operator/config/scorecard/kustomization.yaml @@ -0,0 +1,16 @@ +resources: +- bases/config.yaml +patchesJson6902: +- path: patches/basic.config.yaml + target: + group: scorecard.operatorframework.io + version: v1alpha3 + kind: Configuration + name: config +- path: patches/olm.config.yaml + target: + group: scorecard.operatorframework.io + version: v1alpha3 + kind: Configuration + name: config +#+kubebuilder:scaffold:patchesJson6902 diff --git a/control-operator/config/scorecard/patches/basic.config.yaml b/control-operator/config/scorecard/patches/basic.config.yaml new file mode 100644 index 000000000..8aa415864 --- /dev/null +++ b/control-operator/config/scorecard/patches/basic.config.yaml @@ -0,0 +1,10 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - basic-check-spec + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: basic + test: basic-check-spec-test diff --git a/control-operator/config/scorecard/patches/olm.config.yaml b/control-operator/config/scorecard/patches/olm.config.yaml new file mode 100644 index 000000000..47153a8b7 --- /dev/null +++ b/control-operator/config/scorecard/patches/olm.config.yaml @@ -0,0 +1,50 @@ +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-bundle-validation + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: olm + test: olm-bundle-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-validation + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: olm + test: olm-crds-have-validation-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-crds-have-resources + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: olm + test: olm-crds-have-resources-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-spec-descriptors + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: olm + test: olm-spec-descriptors-test +- op: add + path: /stages/0/tests/- + value: + entrypoint: + - scorecard-test + - olm-status-descriptors + image: quay.io/operator-framework/scorecard-test:unknown + labels: + suite: olm + test: olm-status-descriptors-test diff --git a/control-operator/ecs-manifests/control-workflows/readout-docker.yaml b/control-operator/ecs-manifests/control-workflows/readout-docker.yaml new file mode 100644 index 000000000..043b05f7c --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/readout-docker.yaml @@ -0,0 +1,33 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "consul-ini://{{ consul_endpoint }}/o2/components/readout/ANY/any/readout-standalone-{{ task_hostname }}" + user: flp + log_task_stdout: none + log_task_stderr: none + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && + o2-readout-exe + _plain_cmdline: "sudo -E docker run --name readout --replace --privileged --user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /tmp:/tmp -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) --network=host --ipc=host -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT -e O2_SYSTEM -e O2_ROLE gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 /opt/o2/bin/o2-readout-exe" +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "{{ fmq_rate_logging }}" + addressing: ipc + transport: shmem +properties: {} +command: + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + env: + - O2_DETECTOR={{ detector }} + - O2_PARTITION={{ environment_id }} + user: "{{ user }}" + arguments: + - "{{ readout_cfg_uri }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" diff --git a/control-operator/ecs-manifests/control-workflows/readout-kube.yaml b/control-operator/ecs-manifests/control-workflows/readout-kube.yaml new file mode 100644 index 000000000..549aebd14 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/readout-kube.yaml @@ -0,0 +1,35 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "consul-ini://{{ consul_endpoint }}/o2/components/readout/ANY/any/readout-standalone-{{ task_hostname }}" + user: flp + log_task_stdout: none + log_task_stderr: none + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && + o2-readout-exe + _plain_cmdline: "{{ o2_install_path }}/bin/o2-readout-exe" +control: + mode: kubectl_direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "{{ fmq_rate_logging }}" + addressing: ipc + transport: shmem +properties: {} +command: + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + env: + - O2_DETECTOR={{ detector }} + - O2_PARTITION={{ environment_id }} + user: "{{ user }}" + arguments: + # the first argument is the location of yaml readout manifest to be loaded, the one to be used is located in this repo inside control-operator/ecs-manifests/kubernetes-manifests/readout.yaml + - "/root/readout.yaml" + - "{{ readout_cfg_uri }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" diff --git a/control-operator/ecs-manifests/control-workflows/readout-orig.yaml b/control-operator/ecs-manifests/control-workflows/readout-orig.yaml new file mode 100644 index 000000000..5d6130024 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/readout-orig.yaml @@ -0,0 +1,33 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "consul-ini://{{ consul_endpoint }}/o2/components/readout/ANY/any/readout-standalone-{{ task_hostname }}" + user: flp + log_task_stdout: none + log_task_stderr: none + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && + o2-readout-exe + _plain_cmdline: "{{ o2_install_path }}/bin/o2-readout-exe" +control: + mode: direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "{{ fmq_rate_logging }}" + addressing: ipc + transport: shmem +properties: {} +command: + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + env: + - O2_DETECTOR={{ detector }} + - O2_PARTITION={{ environment_id }} + user: "{{ user }}" + arguments: + - "{{ readout_cfg_uri }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube.yaml b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube.yaml new file mode 100644 index 000000000..9c84f0ed7 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube.yaml @@ -0,0 +1,66 @@ +name: stfbuilder-senderoutput +control: + mode: kubectl_fairmq +defaults: + detector: TST + rdh_version: "6" + user: flp + fmq_severity: info + dd_detector_subspec: feeid + dd_discovery_endpoint: "no-op://" # location of consul docker instance + log_task_stdout: none + log_task_stderr: none + stfb_dd_mode: "physics" + stfb_fee_mask: "0xffff" + stfb_enable_datasink: "false" + stfb_datasink_dir: "/tmp" + stfb_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + StfBuilder + _plain_cmdline: "{{ o2_install_path }}/bin/StfBuilder" +wants: + cpu: 0.15 + memory: 128 +bind: + - name: buildertosender + type: push + rateLogging: "{{ fmq_rate_logging }}" + transport: shmem + addressing: ipc + sndBufSize: "4" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - O2_DETECTOR={{ detector }} + - DATADIST_FEE_MASK={{ stfb_fee_mask }} + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + # the first argument is the location of yaml readout manifest to be loaded, the one to be used is located in this repo inside control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml + - "/root/stfbuilder-senderoutput.yaml" + - "--session=default" + - "--transport=shmem" + - "--shm-segment-id=2" + - "--shm-segment-size=33554432" + - "--monitoring-backend='{{ monitoring_dd_url }}'" + - "--monitoring-process-interval='{{ monitoring_dd_interval }}'" + - "--discovery-partition={{ environment_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--detector-rdh={{ rdh_version }}" + - "--detector-subspec={{ dd_detector_subspec }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--output-channel-name=buildertosender" + - "--shm-monitor=false" + - "--detector={{ detector }}" + - "--run-type={{ stfb_dd_mode }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-dir=' + stfb_datasink_dir : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfb_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-orig.yaml b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-orig.yaml new file mode 100644 index 000000000..3d33ac31d --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-orig.yaml @@ -0,0 +1,64 @@ +name: stfbuilder-senderoutput +control: + mode: fairmq +defaults: + detector: TST + rdh_version: "6" + user: flp + fmq_severity: info + dd_detector_subspec: feeid + dd_discovery_endpoint: "no-op://" # location of consul docker instance + log_task_stdout: none + log_task_stderr: none + stfb_dd_mode: "physics" + stfb_fee_mask: "0xffff" + stfb_enable_datasink: "false" + stfb_datasink_dir: "/tmp" + stfb_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + StfBuilder + _plain_cmdline: "{{ o2_install_path }}/bin/StfBuilder" +wants: + cpu: 0.15 + memory: 128 +bind: + - name: buildertosender + type: push + rateLogging: "{{ fmq_rate_logging }}" + transport: shmem + addressing: ipc + sndBufSize: "4" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - O2_DETECTOR={{ detector }} + - DATADIST_FEE_MASK={{ stfb_fee_mask }} + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + - "--session=default" + - "--transport=shmem" + - "--shm-segment-id=2" + - "--shm-segment-size=33554432" + - "--monitoring-backend='{{ monitoring_dd_url }}'" + - "--monitoring-process-interval='{{ monitoring_dd_interval }}'" + - "--discovery-partition={{ environment_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--detector-rdh={{ rdh_version }}" + - "--detector-subspec={{ dd_detector_subspec }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--output-channel-name=buildertosender" + - "--shm-monitor=false" + - "--detector={{ detector }}" + - "--run-type={{ stfb_dd_mode }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-dir=' + stfb_datasink_dir : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfb_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfsender-docker.yaml b/control-operator/ecs-manifests/control-workflows/stfsender-docker.yaml new file mode 100644 index 000000000..a8f67ba33 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfsender-docker.yaml @@ -0,0 +1,65 @@ +name: stfsender +control: + mode: fairmq +wants: + cpu: 0.15 + memory: 128 +defaults: + max_buffered_stfs: "-1" + dd_discovery_net_if: "ib0" #the loopback intf + dd_discovery_endpoint: "no-op://" # location of consul docker instance + user: flp + fmq_severity: info + log_task_stdout: none + log_task_stderr: none + stfs_dd_region_size: 4096 + stfs_shm_segment_size: 33554432 + stfs_enable_datasink: "false" + stfs_datasink_dir: "/tmp" + stfs_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + numactl --cpunodebind=0 --preferred=0 -- StfSender + #_plain_cmdline: "numactl --cpunodebind=0 --preferred=0 -- {{ o2_install_path }}/bin/StfSender" + _plain_cmdline: "sudo -E docker run --name stfsender --replace --privileged --user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /tmp:/tmp -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) --network=host --ipc=host -e CONTROL_OCCPLUGIN_ROOT=/opt/o2 -e O2_INFOLOGGER_MODE -e UCX_TLS -e UCX_IB_SL -e UCX_DC_MAX_NUM_EPS -e UCX_RC_MAX_NUM_EPS -e http_proxy -e https_proxy -e UCX_NET_DEVICES -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT -e O2_SYSTEM -e O2_ROLE gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 numactl --cpunodebind=0 --preferred=0 -- {{ o2_install_path }}/bin/StfSender" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - http_proxy="" + - https_proxy="" + - no_proxy=-ib,.internal + - O2_DETECTOR={{ detector }} + - UCX_NET_DEVICES=mlx5_0:1 # This limits StfSender to IB interface (used as of DD v1.3.0) + - UCX_TLS=sm,self,dc,rc # Force dc/rc connection (used as of DD v1.4.0) + - UCX_IB_SL=1 # Force IB SL1 with Adaptive Routing (AR) + - UCX_DC_MAX_NUM_EPS=512 # Allow 512 peers for DC transport + - UCX_RC_MAX_NUM_EPS=512 # Allow 512 peers for RC transport + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + - "--session=default" + - "--shm-segment-id=2" + - "--shm-segment-size={{ stfs_shm_segment_size }}" + - "--dd-region-size={{ stfs_dd_region_size }}" + - "--dd-region-id=3536" + - "--transport=shmem" + - "--input-channel-name={{ stfs_input_channel_name }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--monitoring-backend='{{ monitoring_dd_url }}'" + - "--monitoring-process-interval='{{ monitoring_dd_interval }}'" + - "--discovery-partition={{ environment_id }}" + - "--discovery-id={{ dd_discovery_stfs_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--discovery-net-if={{ dd_discovery_net_if }}" + - '{{ ddsched_enabled == "true" ? "" : "--stand-alone" }}' + - "--shm-monitor=false" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-dir=' + stfs_datasink_dir : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfs_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfsender-kube.yaml b/control-operator/ecs-manifests/control-workflows/stfsender-kube.yaml new file mode 100644 index 000000000..58a6106b6 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfsender-kube.yaml @@ -0,0 +1,66 @@ +name: stfsender +control: + mode: kubectl_fairmq +wants: + cpu: 0.15 + memory: 128 +defaults: + max_buffered_stfs: "-1" + dd_discovery_net_if: "ib0" #the loopback intf + dd_discovery_endpoint: "no-op://" # location of consul docker instance + user: flp + fmq_severity: info + log_task_stdout: none + log_task_stderr: none + stfs_dd_region_size: 4096 + stfs_shm_segment_size: 33554432 + stfs_enable_datasink: "false" + stfs_datasink_dir: "/tmp" + stfs_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + numactl --cpunodebind=0 --preferred=0 -- StfSender + _plain_cmdline: "numactl --cpunodebind=0 --preferred=0 -- {{ o2_install_path }}/bin/StfSender" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - http_proxy= + - https_proxy= + - no_proxy=-ib,.internal + - O2_DETECTOR={{ detector }} + - UCX_NET_DEVICES=mlx5_0:1 # This limits StfSender to IB interface (used as of DD v1.3.0) + - UCX_TLS=sm,self,dc,rc # Force dc/rc connection (used as of DD v1.4.0) + - UCX_IB_SL=1 # Force IB SL1 with Adaptive Routing (AR) + - UCX_DC_MAX_NUM_EPS=512 # Allow 512 peers for DC transport + - UCX_RC_MAX_NUM_EPS=512 # Allow 512 peers for RC transport + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + # the first argument is the location of yaml readout manifest to be loaded, the one to be used is located in this repo inside control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml + - "/root/stfsender.yaml" + - "--session=default" + - "--shm-segment-id=2" + - "--shm-segment-size={{ stfs_shm_segment_size }}" + - "--dd-region-size={{ stfs_dd_region_size }}" + - "--dd-region-id=3536" + - "--transport=shmem" + - "--input-channel-name={{ stfs_input_channel_name }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--monitoring-backend='{{ monitoring_dd_url }}'" + - "--monitoring-process-interval='{{ monitoring_dd_interval }}'" + - "--discovery-partition={{ environment_id }}" + - "--discovery-id={{ dd_discovery_stfs_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--discovery-net-if={{ dd_discovery_net_if }}" + - '{{ ddsched_enabled == "true" ? "" : "--stand-alone" }}' + - "--shm-monitor=false" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-dir=' + stfs_datasink_dir : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfs_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfsender-orig.yaml b/control-operator/ecs-manifests/control-workflows/stfsender-orig.yaml new file mode 100644 index 000000000..7bb9ecd23 --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfsender-orig.yaml @@ -0,0 +1,64 @@ +name: stfsender +control: + mode: fairmq +wants: + cpu: 0.15 + memory: 128 +defaults: + max_buffered_stfs: "-1" + dd_discovery_net_if: "ib0" #the loopback intf + dd_discovery_endpoint: "no-op://" # location of consul docker instance + user: flp + fmq_severity: info + log_task_stdout: none + log_task_stderr: none + stfs_dd_region_size: 4096 + stfs_shm_segment_size: 33554432 + stfs_enable_datasink: "false" + stfs_datasink_dir: "/tmp" + stfs_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + numactl --cpunodebind=0 --preferred=0 -- StfSender + _plain_cmdline: "numactl --cpunodebind=0 --preferred=0 -- {{ o2_install_path }}/bin/StfSender" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - http_proxy="" + - https_proxy="" + - no_proxy=-ib,.internal + - O2_DETECTOR={{ detector }} + - UCX_NET_DEVICES=mlx5_0:1 # This limits StfSender to IB interface (used as of DD v1.3.0) + - UCX_TLS=sm,self,dc,rc # Force dc/rc connection (used as of DD v1.4.0) + - UCX_IB_SL=1 # Force IB SL1 with Adaptive Routing (AR) + - UCX_DC_MAX_NUM_EPS=512 # Allow 512 peers for DC transport + - UCX_RC_MAX_NUM_EPS=512 # Allow 512 peers for RC transport + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + - "--session=default" + - "--shm-segment-id=2" + - "--shm-segment-size={{ stfs_shm_segment_size }}" + - "--dd-region-size={{ stfs_dd_region_size }}" + - "--dd-region-id=3536" + - "--transport=shmem" + - "--input-channel-name={{ stfs_input_channel_name }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--monitoring-backend='{{ monitoring_dd_url }}'" + - "--monitoring-process-interval='{{ monitoring_dd_interval }}'" + - "--discovery-partition={{ environment_id }}" + - "--discovery-id={{ dd_discovery_stfs_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--discovery-net-if={{ dd_discovery_net_if }}" + - '{{ ddsched_enabled == "true" ? "" : "--stand-alone" }}' + - "--shm-monitor=false" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-dir=' + stfs_datasink_dir : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfs_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/kubernetes-ecs.md b/control-operator/ecs-manifests/kubernetes-ecs.md new file mode 100644 index 000000000..e5608750d --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-ecs.md @@ -0,0 +1,35 @@ +# ECS in Kubernetes + +For now we can run OCC tasks in Kubernetes (namely `readout`, `stfsender`, `stfbuilder-senderoutput`) using +the task controller inside the `control-operator` folder and `kubectltask` created as a version of `controllabletask` +for the Mesos executor wrapping `kubectl` tool. However as the `kubectl` requires manifests we used `control-operator/ecs-manifests` +to store these test manifests. There are more test files apart from these manifests. + +There are 3 subfolders inside `ecs-manifests`, namely `control-workflows`, `kubernetes-manifests` and `occ-configure-arguments`. + +### `control-workflows` + +In order to run given task from ECS you need to provide yaml template normally contained inside the `ControlWorkflows` +repository that is processed by ECS core and sent to Mesos framework that runs the given task on a given agent. +Inside the folder you can find files with suffixes `docker`, `kube`, `orig` appended to the name of the task they +are representing. These files are to be put into the `ControlWorkflows/tasks` so ECS can find those and run task +in proper way. Eg. if one is to run readout in Kubernetes copy (or symlink) `readout-kube.yaml` into the `ControlWorkflows` +directory under the name `readout.yaml` (same for the other tasks) + +### `kubernetes-manifests` + +Kubectltask requires Kubernetes manifests to pass to `kubectl`, these manifests are located in directory `kubernetes-manifests`. +There are two types of manifests `task.yaml` and `task-test.yaml`. The first one is the actual manifest to be used by +executors and kubectltask where environment variables substitution is used in a form of `${VAR}`. `task-test.yaml` +has the same form as templated manifest, but with actual test values to test container/binary inside the kubernetes. +Apply the manifest by invoking: + +```bash +kubectl apply -f task-test.yaml +``` + +### `occ-configure-arguments` + +yaml files containing data used by `peanut` to properly transition `readout`, `stfsender` and `stfbuilder-senderoutput` +to `CONFIGURED`. Use these files by either loading them into `peanut` with LoadConfiguration in TUI mode or +by using `--config` flag in CLI mode. diff --git a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml new file mode 100644 index 000000000..d9711feb3 --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml @@ -0,0 +1,179 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: readout +spec: + arguments: + chans.readout.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l2g + chans.readout.0.autoBind: "0" + chans.readout.0.method: bind + chans.readout.0.rateLogging: "0" + chans.readout.0.rcvBufSize: "1000" + chans.readout.0.rcvKernelSize: "0" + chans.readout.0.sndBufSize: "1000" + chans.readout.0.sndKernelSize: "0" + chans.readout.0.transport: shmem + chans.readout.0.type: push + chans.readout.numSockets: "1" + environment_id: 323ikoYJ88i + orbit-reset-time: "" + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 + command: ["/opt/o2/bin/o2-readout-exe"] + args: ["/etc/readout/readout-cfg.ini"] + securityContext: + privileged: true + runAsUser: 1100 + runAsGroup: 1100 + env: + - name: O2_DETECTOR + value: "TST" + - name: O2_PARTITION + value: "323ikoYJ88i" + - name: OCC_CONTROL_PORT + value: "31000" + - name: O2_SYSTEM + value: "flp" + # it might be necessary to change the role for your use case + - name: O2_ROLE + value: "mtichak" + volumeMounts: + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + - name: readout-config + mountPath: /etc/readout + readOnly: true + imagePullPolicy: IfNotPresent + volumes: + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + - name: readout-config + configMap: + name: readout-config + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "direct" + port: 31000 + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby + +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: readout-config +data: + readout-cfg.ini: | + # Example configuration file for o2-readout-exe + # Standalone operation, with emulated input, and output to Data Distribution + # to run readout-stbf out of the box with data emulator + + [readout] + aggregatorSliceTimeout=0.5 + aggregatorStfTimeout=1 + + # dummy data source + [equipment-emulator-1] + enabled=1 + equipmentType=cruEmulator + memoryPoolNumberOfPages=1000 + memoryPoolPageSize=1M + numberOfLinks=1 + PayloadSize=8000 + rdhUseFirstInPageEnabled=1 + #systemId=19 + #feeId=0 + #cruId=0 + #dpwId=0 + id=1 + + # define a (disabled) CRU equipment for CRU end point #0 + [equipment-rorc-1] + enabled=0 + equipmentType=rorc + cardId=#0 + dataSource=Ddg + memoryPoolNumberOfPages=1800 + memoryPoolPageSize=1M + rdhUseFirstInPageEnabled=1 + + + # monitor counters + [consumer-stats] + consumerType=stats + monitoringEnabled=1 + monitoringUpdatePeriod=5 + processMonitoringInterval=15 + monitoringURI=influxdb-unix:///tmp/telegraf.sock + + + # record data to file (disabled) + [consumer-rec] + enabled=0 + consumerType=fileRecorder + fileName=/tmp/data.raw + + + # allow data sampling to take data + [consumer-data-sampling] + enabled=0 + consumerType=DataSampling + + + # send data to stfb + [consumer-StfBuilder] + enabled = 1 + consumerType = FairMQChannel + sessionName = default + fmq-transport = shmem + fmq-name = readout + fmq-type = push + fmq-address = ipc:///tmp/flp-readout-pipe-0 + unmanagedMemorySize = 2G + memoryPoolNumberOfPages = 200 + memoryPoolPageSize = 1M + disableSending=0 + + + # matching config for the test receiver + [receiver-fmq] + decodingMode=stfHbf + channelAddress=ipc:///tmp/flp-readout-pipe-0 + channelType=pull diff --git a/control-operator/ecs-manifests/kubernetes-manifests/readout.yaml b/control-operator/ecs-manifests/kubernetes-manifests/readout.yaml new file mode 100644 index 000000000..90d7600fe --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/readout.yaml @@ -0,0 +1,82 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: readout +spec: + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: ${FLP_GID} + supplementalGroups: ${FLP_SUPPLEMENTAL_GROUPS} + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 + command: ["/bin/bash"] + args: + - "-c" + - "${KUBE_COMMAND} ${KUBE_ARGUMENTS}" + securityContext: + privileged: true + runAsUser: ${FLP_UID} + runAsGroup: ${FLP_GID} + env: + - name: O2_DETECTOR + value: "${O2_DETECTOR}" + - name: O2_PARTITION + value: "${O2_PARTITION}" + - name: OCC_CONTROL_PORT + value: "${OCC_CONTROL_PORT}" + - name: O2_SYSTEM + value: "${O2_SYSTEM}" + - name: O2_ROLE + value: "${O2_ROLE}" + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "direct" + port: ${OCC_CONTROL_PORT} + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml new file mode 100644 index 000000000..2e625d13d --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml @@ -0,0 +1,114 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: stfbuilder-senderoutput +spec: + arguments: + chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 + chans.buildertosender.0.autoBind: "0" + chans.buildertosender.0.method: bind + chans.buildertosender.0.rateLogging: "0" + chans.buildertosender.0.rcvBufSize: "1000" + chans.buildertosender.0.rcvKernelSize: "0" + chans.buildertosender.0.sndBufSize: "4" + chans.buildertosender.0.sndKernelSize: "0" + chans.buildertosender.0.transport: shmem + chans.buildertosender.0.type: push + chans.buildertosender.numSockets: "1" + chans.readout.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l2g + chans.readout.0.method: connect + chans.readout.0.rateLogging: "0" + chans.readout.0.rcvBufSize: "1000" + chans.readout.0.rcvKernelSize: "0" + chans.readout.0.sndBufSize: "1000" + chans.readout.0.sndKernelSize: "0" + chans.readout.0.transport: shmem + chans.readout.0.type: pull + chans.readout.numSockets: "1" + environment_id: 323ikoYJ88i + orbit-reset-time: "" + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] + containers: + - name: stfbuilder-senderoutput + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: ["/bin/bash"] + args: + - "-lc" + - "/opt/o2/bin/StfBuilder --session=default --transport=shmem --shm-segment-id=2 --shm-segment-size=33554432 --monitoring-backend='influxdb-unix:///tmp/telegraf.sock' --monitoring-process-interval='5' --discovery-partition=323ikoYJ88i --discovery-endpoint=no-op:// --detector-rdh=6 --detector-subspec=feeid --severity=info --severity-infologger=info --output-channel-name=buildertosender --shm-monitor=false --detector=TST --run-type=physics --id 323ikp9sptz -S $CONTROL_OCCPLUGIN_ROOT/lib/ -P OCClite --color false --control-port 31001" + securityContext: + privileged: true + runAsUser: 1100 + runAsGroup: 1100 + capabilities: + add: ["IPC_LOCK"] + env: + - name: O2_DETECTOR + value: "TST" + - name: O2_PARTITION + value: "323ikoYJ88i" + - name: OCC_CONTROL_PORT + value: "31001" + - name: O2_SYSTEM + value: "FLP" + - name: O2_ROLE + value: "mtichak-ost" + - name: O2_INFOLOGGER_MODE + value: "infoLoggerD" + - name: DATADIST_FEE_MASK + value: "0xffff" + - name: CONTROL_OCCPLUGIN_ROOT + value: "/opt/o2" + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + port: 31001 + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml new file mode 100644 index 000000000..9195ed2f6 --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml @@ -0,0 +1,91 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: stfbuilder-senderoutput +spec: + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: ${FLP_GID} + supplementalGroups: ${FLP_SUPPLEMENTAL_GROUPS} + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: ["/bin/bash"] + args: + - "-lc" + - "${KUBE_COMMAND} ${KUBE_ARGUMENTS}" + securityContext: + privileged: true + runAsUser: ${FLP_UID} + runAsGroup: ${FLP_GID} + capabilities: + add: ["IPC_LOCK"] + + env: + - name: O2_DETECTOR + value: "${O2_DETECTOR}" + - name: O2_PARTITION + value: "${O2_PARTITION}" + - name: OCC_CONTROL_PORT + value: "${OCC_CONTROL_PORT}" + - name: O2_SYSTEM + value: "${O2_SYSTEM}" + - name: O2_ROLE + value: "${O2_ROLE}" + - name: O2_INFOLOGGER_MODE + value: "${O2_INFOLOGGER_MODE}" + - name: DATADIST_FEE_MASK + value: "${DATADIST_FEE_MASK}" + - name: CONTROL_OCCPLUGIN_ROOT + value: "/opt/o2" + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + port: ${OCC_CONTROL_PORT} + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml new file mode 100644 index 000000000..7db060d53 --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml @@ -0,0 +1,92 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: stfsender +spec: + arguments: + chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 + chans.buildertosender.0.method: connect + chans.buildertosender.0.rateLogging: "0" + chans.buildertosender.0.rcvBufSize: "1000" + chans.buildertosender.0.rcvKernelSize: "0" + chans.buildertosender.0.sndBufSize: "1000" + chans.buildertosender.0.sndKernelSize: "0" + chans.buildertosender.0.transport: shmem + chans.buildertosender.0.type: pull + chans.buildertosender.numSockets: "1" + environment_id: 323ikoYJ88i + orbit-reset-time: "" + + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: ["/bin/bash"] + args: + - "-c" + # you might need to change mtichak from args to your usecase change this part + - "numactl --cpunodebind=0 --preferred=0 -- /opt/o2/bin/StfSender --session=default --shm-segment-id=2 --shm-segment-size=33554432 --dd-region-size=4096 --dd-region-id=3536 --transport=shmem --input-channel-name=buildertosender --severity=info --severity-infologger=info --monitoring-backend='influxdb-unix:///tmp/telegraf.sock' --monitoring-process-interval='5' --discovery-partition=323ikoYJ88i --discovery-id=stfs-mtichak-ost-323ikoig378 --discovery-endpoint=no-op:// --discovery-net-if=ib0 --stand-alone --shm-monitor=false --id 323ikp9tANv -S $CONTROL_OCCPLUGIN_ROOT/lib/ -P OCClite --color false --control-port 31002" + securityContext: + privileged: true + runAsUser: 1100 + runAsGroup: 1100 + env: + - name: O2_DETECTOR + value: "TST" + - name: O2_PARTITION + value: "xxxxxxxx" + - name: OCC_CONTROL_PORT + value: "31002" + - name: O2_SYSTEM + value: "flp" + # it might be necessary to change the role for your use case + - name: O2_ROLE + value: "mtichak" + volumeMounts: + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + port: 31002 + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml new file mode 100644 index 000000000..a61b190ee --- /dev/null +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml @@ -0,0 +1,105 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Task +metadata: + name: stfsender +spec: + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: ${FLP_GID} + supplementalGroups: ${FLP_SUPPLEMENTAL_GROUPS} + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: ["/bin/bash"] + args: + - "-lc" + - "${KUBE_COMMAND} ${KUBE_ARGUMENTS}" + securityContext: + privileged: true + runAsUser: ${FLP_UID} + runAsGroup: ${FLP_GID} + capabilities: + add: ["IPC_LOCK"] + + env: + - name: O2_DETECTOR + value: "${O2_DETECTOR}" + - name: O2_PARTITION + value: "${O2_PARTITION}" + - name: OCC_CONTROL_PORT + value: "${OCC_CONTROL_PORT}" + - name: O2_SYSTEM + value: "${O2_SYSTEM}" + - name: O2_ROLE + value: "${O2_ROLE}" + - name: O2_INFOLOGGER_MODE + value: "${O2_INFOLOGGER_MODE}" + - name: http_proxy + value: "${http_proxy}" + - name: https_proxy + value: "${https_proxy}" + - name: no_proxy + value: "${no_proxy}" + - name: UCX_NET_DEVICES + value: "${UCX_NET_DEVICES}" + - name: UCX_TLS + value: "${UCX_TLS}" + - name: UCX_IB_SL + value: "${UCX_IB_SL}" + - name: UCX_DC_MAX_NUM_EPS + value: "${UCX_DC_MAX_NUM_EPS}" + - name: UCX_RC_MAX_NUM_EPS + value: "${UCX_RC_MAX_NUM_EPS}" + - name: CONTROL_OCCPLUGIN_ROOT + value: "/opt/o2" + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + port: ${OCC_CONTROL_PORT} + bind: + - name: readout + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + global: "" + target: "" + connect: + properties: + var1: value1 + var2: value2 + state: standby diff --git a/control-operator/ecs-manifests/occ-configure-arguments/readout-configure-args.yaml b/control-operator/ecs-manifests/occ-configure-arguments/readout-configure-args.yaml new file mode 100644 index 000000000..2216e58b6 --- /dev/null +++ b/control-operator/ecs-manifests/occ-configure-arguments/readout-configure-args.yaml @@ -0,0 +1,16 @@ +chans: + readout: + numSockets: 1 + 0: + address: ipc://@o2ipc-d6qto8m8ndm409ltqngg + autoBind: 0 + method: bind + rateLogging: 0 + rcvBufSize: 1000 + rcvKernelSize: 0 + sndBufSize: 1000 + sndKernelSize: 0 + transport: shmem + type: push + +environment_id: 31UAUL4cwuk diff --git a/control-operator/ecs-manifests/occ-configure-arguments/stfbuilder-senderoutput-configure-args.yaml b/control-operator/ecs-manifests/occ-configure-arguments/stfbuilder-senderoutput-configure-args.yaml new file mode 100644 index 000000000..9d76ca13d --- /dev/null +++ b/control-operator/ecs-manifests/occ-configure-arguments/stfbuilder-senderoutput-configure-args.yaml @@ -0,0 +1,28 @@ +chans: + buildertosender: + numSockets: 1 + 0: + address: ipc://@o2ipc-d6qto8m8ndm409ltqnh0 + autoBind: 0 + method: bind + rateLogging: 0 + rcvBufSize: 1000 + rcvKernelSize: 0 + sndBufSize: 4 + sndKernelSize: 0 + transport: shmem + type: push + readout: + numSockets: 1 + 0: + address: ipc://@o2ipc-d6qto8m8ndm409ltqngg + method: connect + rateLogging: 0 + rcvBufSize: 1000 + rcvKernelSize: 0 + sndBufSize: 1000 + sndKernelSize: 0 + transport: shmem + type: pull + +environment_id: 31UAUL4cwuk diff --git a/control-operator/ecs-manifests/occ-configure-arguments/stfsender-configure-args.yaml b/control-operator/ecs-manifests/occ-configure-arguments/stfsender-configure-args.yaml new file mode 100644 index 000000000..fabc47d3f --- /dev/null +++ b/control-operator/ecs-manifests/occ-configure-arguments/stfsender-configure-args.yaml @@ -0,0 +1,15 @@ +chans: + buildertosender: + numSockets: 1 + 0: + address: ipc://@o2ipc-d6qto8m8ndm409ltqnh0 + method: connect + rateLogging: 0 + rcvBufSize: 1000 + rcvKernelSize: 0 + sndBufSize: 1000 + sndKernelSize: 0 + transport: shmem + type: pull + +environment_id: 31UAUL4cwuk diff --git a/control-operator/go.mod b/control-operator/go.mod new file mode 100644 index 000000000..2cbfefa21 --- /dev/null +++ b/control-operator/go.mod @@ -0,0 +1,86 @@ +module github.com/AliceO2Group/ControlOperator + +go 1.25.0 + +require ( + github.com/onsi/ginkgo/v2 v2.27.2 + github.com/onsi/gomega v1.38.2 + k8s.io/api v0.35.0 + k8s.io/apimachinery v0.35.0 + k8s.io/client-go v0.35.0 + sigs.k8s.io/controller-runtime v0.23.0 +) + +require ( + github.com/Masterminds/semver/v3 v3.4.0 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect + github.com/go-logr/logr v1.4.3 // indirect + github.com/go-logr/zapr v1.3.0 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect + github.com/go-openapi/swag v0.25.4 // indirect + github.com/go-openapi/swag/cmdutils v0.25.4 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/fileutils v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/jsonutils v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/mangling v0.25.4 // indirect + github.com/go-openapi/swag/netutils v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-task/slim-sprig/v3 v3.0.0 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/gnostic-models v0.7.1 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/client_golang v1.23.2 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/x448/float16 v0.8.4 // indirect + go.uber.org/multierr v1.11.0 // indirect + go.uber.org/zap v1.27.1 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/mod v0.31.0 // indirect + golang.org/x/net v0.49.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/term v0.39.0 // indirect + golang.org/x/text v0.33.0 // indirect + golang.org/x/time v0.14.0 // indirect + golang.org/x/tools v0.40.0 // indirect + gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d // indirect + google.golang.org/grpc v1.78.0 // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 // indirect + google.golang.org/protobuf v1.36.11 // indirect + gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/apiextensions-apiserver v0.35.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e // indirect + k8s.io/utils v0.0.0-20260108192941-914a6e750570 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.1 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect +) + +replace github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated => ./internal/controller/protos/generated diff --git a/control-operator/go.sum b/control-operator/go.sum new file mode 100644 index 000000000..752dcbba0 --- /dev/null +++ b/control-operator/go.sum @@ -0,0 +1,213 @@ +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/evanphx/json-patch v0.5.2 h1:xVCHIVMUu1wtM/VkR9jVZ45N3FhZfYMMYGorLCR8P3k= +github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= +github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= +github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= +github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= +github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= +github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= +github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= +github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= +github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= +github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= +github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= +github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= +github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= +github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= +go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +golang.org/x/mod v0.31.0 h1:HaW9xtz0+kOcWKwli0ZXy79Ix+UW/vOfmWI5QVd2tgI= +golang.org/x/mod v0.31.0/go.mod h1:43JraMp9cGx1Rx3AqioxrbrhNsLl2l/iNAvuBkrezpg= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= +golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= +gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= +gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d h1:xXzuihhT3gL/ntduUZwHECzAn57E8dA6l8SOtYWdD8Q= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= +google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 h1:6Al3kEFFP9VJhRz3DID6quisgPnTeZVr4lep9kkxdPA= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0/go.mod h1:QLvsjh0OIR0TYBeiu2bkWGTJBUNQ64st52iWj/yA93I= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e h1:iW9ChlU0cU16w8MpVYjXk12dqQ4BPFBEgif+ap7/hqQ= +k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20260108192941-914a6e750570 h1:JT4W8lsdrGENg9W+YwwdLJxklIuKWdRm+BC+xt33FOY= +k8s.io/utils v0.0.0-20260108192941-914a6e750570/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/controller-runtime v0.23.0 h1:Ubi7klJWiwEWqDY+odSVZiFA0aDSevOCXpa38yCSYu8= +sigs.k8s.io/controller-runtime v0.23.0/go.mod h1:DBOIr9NsprUqCZ1ZhsuJ0wAnQSIxY/C6VjZbmLgw0j0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.1 h1:JrhdFMqOd/+3ByqlP2I45kTOZmTRLBUm5pvRjeheg7E= +sigs.k8s.io/structured-merge-diff/v6 v6.3.1/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= diff --git a/control-operator/hack/boilerplate.go.txt b/control-operator/hack/boilerplate.go.txt new file mode 100644 index 000000000..100584a9f --- /dev/null +++ b/control-operator/hack/boilerplate.go.txt @@ -0,0 +1,23 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: author + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ diff --git a/control-operator/internal/controller/direct_transition.go b/control-operator/internal/controller/direct_transition.go new file mode 100644 index 000000000..4f73f1bc4 --- /dev/null +++ b/control-operator/internal/controller/direct_transition.go @@ -0,0 +1,145 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "fmt" +) + +type State int + +const ( + CONFIGURED = iota + RUNNING + STANDBY + ERROR +) + +type Transition int + +const ( + GO_ERROR = iota + RECOVER + CONFIGURE + RESET + STOP + START + EXIT +) + +type FromTo struct { + from, to State +} + +// How to handle EXIT? +var fromStatesToTransition = map[FromTo]Transition{ + {from: CONFIGURED, to: ERROR}: GO_ERROR, + {from: CONFIGURED, to: RUNNING}: START, + {from: CONFIGURED, to: STANDBY}: RESET, + {from: ERROR, to: STANDBY}: RECOVER, + {from: RUNNING, to: CONFIGURED}: STOP, + {from: RUNNING, to: ERROR}: GO_ERROR, + {from: STANDBY, to: CONFIGURED}: CONFIGURE, +} + +func FromStatesToTransition(from, to State) (Transition, error) { + transition, hasValue := fromStatesToTransition[FromTo{from: from, to: to}] + if !hasValue { + return 0, fmt.Errorf("failed to find transition from %s, to %s", from, to) + } + return transition, nil +} + +func (s State) String() string { + switch s { + case CONFIGURED: + return "configured" + case RUNNING: + return "running" + case STANDBY: + return "standby" + case ERROR: + return "error" + default: + return fmt.Sprintf("State(%d)", s) + } +} + +func StateFromString(s string) (State, error) { + switch s { + case "configured": + return CONFIGURED, nil + case "running": + return RUNNING, nil + case "standby": + return STANDBY, nil + case "error": + return ERROR, nil + default: + return 0, fmt.Errorf("invalid State: %s", s) + } +} + +func (t Transition) String() string { + switch t { + case GO_ERROR: + return "go_error" + case RECOVER: + return "recover" + case CONFIGURE: + return "configure" + case RESET: + return "reset" + case STOP: + return "stop" + case START: + return "start" + case EXIT: + return "exit" + default: + return fmt.Sprintf("Transition(%d)", t) + } +} + +func TransitionFromString(s string) (Transition, error) { + switch s { + case "go_error": + return GO_ERROR, nil + case "recover": + return RECOVER, nil + case "configure": + return CONFIGURE, nil + case "reset": + return RESET, nil + case "stop": + return STOP, nil + case "start": + return START, nil + case "exit": + return EXIT, nil + default: + return 0, fmt.Errorf("invalid Transition: %s", s) + } +} diff --git a/control-operator/internal/controller/fairmq_transition.go b/control-operator/internal/controller/fairmq_transition.go new file mode 100644 index 000000000..37d6f347a --- /dev/null +++ b/control-operator/internal/controller/fairmq_transition.go @@ -0,0 +1,223 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + "fmt" + "strings" + + pb "github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated" +) + +// FairMQ internal state names as used by the OCC plugin +const ( + fmqOK = "OK" + fmqIdle = "IDLE" + fmqInitializingDevice = "INITIALIZING DEVICE" + fmqInitialized = "INITIALIZED" + fmqBound = "BOUND" + fmqDeviceReady = "DEVICE READY" + fmqReady = "READY" + fmqRunning = "RUNNING" + fmqError = "ERROR" + fmqExiting = "EXITING" +) + +// FairMQ transition event names as used by the OCC plugin +const ( + fmqEvtInitDevice = "INIT DEVICE" + fmqEvtCompleteInit = "COMPLETE INIT" + fmqEvtBind = "BIND" + fmqEvtConnect = "CONNECT" + fmqEvtInitTask = "INIT TASK" + fmqEvtRun = "RUN" + fmqEvtStop = "STOP" + fmqEvtResetTask = "RESET TASK" + fmqEvtResetDevice = "RESET DEVICE" + fmqEvtEnd = "END" + fmqEvtAuto = "Auto" +) + +// fmqToOCCState maps FairMQ internal states to lowercase OCC state names +var fmqToOCCState = map[string]string{ + fmqIdle: "standby", + fmqReady: "configured", + fmqRunning: "running", + fmqError: "error", + fmqExiting: "done", +} + +func occStateForFmqState(fmqState string) string { + if occ, ok := fmqToOCCState[strings.ToUpper(fmqState)]; ok { + return occ + } + // TODO: it might be better to do proper error handling for doFairMQStep when intermediate step fail + return "not-mapped" +} + +// doFairMQStep sends a single FairMQ-level gRPC Transition and returns the +// resulting FairMQ state as reported by the OCC plugin. +func (c *OccClient) doFairMQStep(ctx context.Context, srcFmqState, fmqEvent string, args map[string]string) (string, error) { + var configEntries []*pb.ConfigEntry + for k, v := range args { + configEntries = append(configEntries, &pb.ConfigEntry{Key: k, Value: v}) + } + + request := &pb.TransitionRequest{ + SrcState: srcFmqState, + TransitionEvent: fmqEvent, + Arguments: configEntries, + } + c.log.V(1).Info("FairMQ step", "event", fmqEvent, "src", srcFmqState) + + reply, err := c.client.Transition(ctx, request) + if err != nil { + return "", fmt.Errorf("FairMQ gRPC transition %q failed: %w", fmqEvent, err) + } + + resultState := reply.GetState() + if !reply.GetOk() { + return resultState, fmt.Errorf("FairMQ transition %q not ok, state: %s", fmqEvent, resultState) + } + c.log.V(1).Info("FairMQ step done", "event", fmqEvent, "result", resultState) + return resultState, nil +} + +// fairMQConfigure drives the FairMQ device through the 5-step CONFIGURE sequence: +// +// IDLE → (INIT DEVICE + args) → INITIALIZING DEVICE +// → (COMPLETE INIT) → INITIALIZED +// → (BIND) → BOUND +// → (CONNECT) → DEVICE READY +// → (INIT TASK) → READY (= CONFIGURED in OCC terms) +// +// On failure in any intermediate step, a RESET DEVICE rollback is attempted. +func (c *OccClient) fairMQConfigure(ctx context.Context, args map[string]string) (string, error) { + // Step 1: INIT DEVICE — channel config args go here + state, err := c.doFairMQStep(ctx, fmqIdle, fmqEvtInitDevice, args) + if state != fmqInitializingDevice { + return occStateForFmqState(state), fmt.Errorf("INIT DEVICE: expected %s, got %s: %w", fmqInitializingDevice, state, err) + } + + // Step 2: COMPLETE INIT + state, err = c.doFairMQStep(ctx, fmqInitializingDevice, fmqEvtCompleteInit, nil) + if state != fmqInitialized { + return occStateForFmqState(state), fmt.Errorf("COMPLETE INIT: expected %s, got %s: %w", fmqInitialized, state, err) + } + + // Step 3: BIND + state, err = c.doFairMQStep(ctx, fmqInitialized, fmqEvtBind, nil) + if state == fmqInitialized { + // Stuck — roll back to IDLE + rollback, _ := c.doFairMQStep(ctx, fmqInitialized, fmqEvtResetDevice, nil) + return occStateForFmqState(rollback), fmt.Errorf("BIND: stuck in %s, rolled back to %s", fmqInitialized, rollback) + } else if state != fmqBound { + return occStateForFmqState(state), fmt.Errorf("BIND: expected %s, got %s: %w", fmqBound, state, err) + } + + // Step 4: CONNECT + state, err = c.doFairMQStep(ctx, fmqBound, fmqEvtConnect, nil) + if state == fmqBound { + // Stuck — roll back to IDLE + rollback, _ := c.doFairMQStep(ctx, fmqBound, fmqEvtResetDevice, nil) + return occStateForFmqState(rollback), fmt.Errorf("CONNECT: stuck in %s, rolled back to %s", fmqBound, rollback) + } else if state != fmqDeviceReady { + return occStateForFmqState(state), fmt.Errorf("CONNECT: expected %s, got %s: %w", fmqDeviceReady, state, err) + } + + // Step 5: INIT TASK + state, err = c.doFairMQStep(ctx, fmqDeviceReady, fmqEvtInitTask, nil) + if state == fmqDeviceReady { + // Stuck — roll back to IDLE + rollback, _ := c.doFairMQStep(ctx, fmqDeviceReady, fmqEvtResetDevice, nil) + return occStateForFmqState(rollback), fmt.Errorf("INIT TASK: stuck in %s, rolled back to %s", fmqDeviceReady, rollback) + } + + return occStateForFmqState(state), err +} + +// fairMQReset drives the FairMQ device through the 2-step RESET sequence: +// +// READY → (RESET TASK) → DEVICE READY +// → (RESET DEVICE + args) → IDLE (= STANDBY in OCC terms) +func (c *OccClient) fairMQReset(ctx context.Context, args map[string]string) (string, error) { + // Step 1: RESET TASK + state, err := c.doFairMQStep(ctx, fmqReady, fmqEvtResetTask, nil) + if state != fmqDeviceReady { + return occStateForFmqState(state), fmt.Errorf("RESET TASK: expected %s, got %s: %w", fmqDeviceReady, state, err) + } + + // Step 2: RESET DEVICE — args go here, matching executor doReset behaviour + state, err = c.doFairMQStep(ctx, fmqDeviceReady, fmqEvtResetDevice, args) + if state == fmqDeviceReady { + // Stuck — roll back to READY + rollback, _ := c.doFairMQStep(ctx, fmqDeviceReady, fmqEvtInitTask, nil) + return occStateForFmqState(rollback), fmt.Errorf("RESET DEVICE: stuck in %s, rolled back to %s", fmqDeviceReady, rollback) + } + + return occStateForFmqState(state), err +} + +// FairMQTransitionRequest drives a FairMQ OCC device through the multi-step +// sequence that corresponds to a single OCC-level transition (CONFIGURE, RESET, +// START, STOP). Returns the resulting OCC state in lowercase ("configured", +// "running", "standby", "error"). +func (c *OccClient) FairMQTransitionRequest(ctx context.Context, fromState, toState string, args map[string]string) (string, error) { + if c == nil || c.client == nil { + return fromState, fmt.Errorf("nil client for FairMQTransitionRequest") + } + + from, err := StateFromString(fromState) + if err != nil { + return fromState, err + } + to, err := StateFromString(toState) + if err != nil { + return fromState, err + } + + transition, err := FromStatesToTransition(from, to) + if err != nil { + return fromState, err + } + + c.log.Info("FairMQTransitionRequest", "from", fromState, "to", toState, "transition", transition.String(), "args", args) + + switch transition { + case CONFIGURE: + return c.fairMQConfigure(ctx, args) + case RESET: + return c.fairMQReset(ctx, args) + case START: + state, err := c.doFairMQStep(ctx, fmqReady, fmqEvtRun, args) + return occStateForFmqState(state), err + case STOP: + state, err := c.doFairMQStep(ctx, fmqRunning, fmqEvtStop, args) + return occStateForFmqState(state), err + default: + return fromState, fmt.Errorf("FairMQ transition %s not implemented", transition.String()) + } +} diff --git a/control-operator/internal/controller/grpc_client.go b/control-operator/internal/controller/grpc_client.go new file mode 100644 index 000000000..5c2c13333 --- /dev/null +++ b/control-operator/internal/controller/grpc_client.go @@ -0,0 +1,305 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + "errors" + "fmt" + "strings" + "time" + + "github.com/go-logr/logr" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/connectivity" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/status" + "k8s.io/apimachinery/pkg/types" + + aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + pb "github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated" +) + +// jsonOccClient mirrors executor/executorcmd/nopb/occclient.go: uses short method +// names and JSON content subtype for OCC lite / FairMQ processes. +type jsonOccClient struct{ conn *grpc.ClientConn } + +type jsonEventStreamClient struct{ grpc.ClientStream } + +func (x *jsonEventStreamClient) Recv() (*pb.EventStreamReply, error) { + m := new(pb.EventStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +type jsonStateStreamClient struct{ grpc.ClientStream } + +func (x *jsonStateStreamClient) Recv() (*pb.StateStreamReply, error) { + m := new(pb.StateStreamReply) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *jsonOccClient) EventStream(ctx context.Context, in *pb.EventStreamRequest, opts ...grpc.CallOption) (pb.Occ_EventStreamClient, error) { + opts = append(opts, grpc.CallContentSubtype("json")) + stream, err := c.conn.NewStream(ctx, &grpc.StreamDesc{StreamName: "EventStream", ServerStreams: true}, "EventStream", opts...) + if err != nil { + return nil, err + } + x := &jsonEventStreamClient{stream} + if err := x.SendMsg(in); err != nil { + return nil, err + } + if err := x.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +func (c *jsonOccClient) StateStream(ctx context.Context, in *pb.StateStreamRequest, opts ...grpc.CallOption) (pb.Occ_StateStreamClient, error) { + opts = append(opts, grpc.CallContentSubtype("json")) + stream, err := c.conn.NewStream(ctx, &grpc.StreamDesc{StreamName: "StateStream", ServerStreams: true}, "StateStream", opts...) + if err != nil { + return nil, err + } + x := &jsonStateStreamClient{stream} + if err := x.SendMsg(in); err != nil { + return nil, err + } + if err := x.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +func (c *jsonOccClient) GetState(ctx context.Context, in *pb.GetStateRequest, opts ...grpc.CallOption) (*pb.GetStateReply, error) { + out := new(pb.GetStateReply) + opts = append(opts, grpc.CallContentSubtype("json")) + if err := c.conn.Invoke(ctx, "GetState", in, out, opts...); err != nil { + return nil, err + } + return out, nil +} + +func (c *jsonOccClient) Transition(ctx context.Context, in *pb.TransitionRequest, opts ...grpc.CallOption) (*pb.TransitionReply, error) { + out := new(pb.TransitionReply) + opts = append(opts, grpc.CallContentSubtype("json")) + if err := c.conn.Invoke(ctx, "Transition", in, out, opts...); err != nil { + return nil, err + } + return out, nil +} + +type OccClient struct { + client pb.OccClient + conn *grpc.ClientConn + crdName types.NamespacedName + reconciler *TaskReconciler + cancel *context.CancelFunc + log logr.Logger + controlMode string +} + +// fromDeviceState translates a raw device state to an OCC state name, +// mirroring executor/executorcmd/transitioner FairMQ and Direct FromDeviceState logic. +func fromDeviceState(controlMode string, state string) string { + if controlMode == "fairmq" { + return occStateForFmqState(state) + } + return strings.ToLower(state) +} + +func NewOccClient(ctx context.Context, address string, controlMode string, reconciler *TaskReconciler, crdName types.NamespacedName, log logr.Logger) (*OccClient, error) { + // grpc.WithBlock() ensures that the dialer waits for the connection to be established. + // If the server isn't listening, this will return an error after the context timeout. + conn, err := grpc.NewClient(address, grpc.WithTransportCredentials(insecure.NewCredentials())) + if err != nil { + return nil, err + } + + var occClient pb.OccClient + if controlMode == "fairmq" { + occClient = &jsonOccClient{conn} + } else { + occClient = pb.NewOccClient(conn) + } + + client := &OccClient{client: occClient, conn: conn, crdName: crdName, reconciler: reconciler, log: log, controlMode: controlMode} + + client.conn.Connect() + + // ctxWithTimeout, cancel := context.WithTimeout(ctx, 1*time.Second) + // defer cancel() + // client.GetState(ctxWithTimeout) + + return client, nil +} + +func (c *OccClient) ConsumeIfReady(ctx context.Context) bool { + if c.cancel != nil { + return true + } + + if connState := c.conn.GetState(); connState != connectivity.Ready { + c.log.V(1).Info("connection is in different state than ready", "conn state", connState.String()) + return false + } + clientCtx, clientCancel := context.WithCancel(context.Background()) + c.cancel = &clientCancel + + go c.ConsumeEventStream(clientCtx) + go c.ConsumeStateStream(clientCtx) + return true +} + +func (c *OccClient) WaitUntilConnected(ctx context.Context) error { + for { + state := c.conn.GetState() + if state == connectivity.Ready { + return nil + } + + if !c.conn.WaitForStateChange(ctx, state) { + return fmt.Errorf("connection failed: %w", ctx.Err()) + } + } +} + +func (c *OccClient) Close() error { + if c.cancel != nil { + (*c.cancel)() + } + if c.conn != nil { + return c.conn.Close() + } + return nil +} + +func (c *OccClient) GetState(ctx context.Context) (*pb.GetStateReply, error) { + if c == nil || c.client == nil { + return nil, errors.New("nil client for TransitionRequest") + } + c.log.V(1).Info("GetState") + result, err := c.client.GetState(ctx, &pb.GetStateRequest{}) + if err == nil { + result.State = fromDeviceState(c.controlMode, result.State) + } + return result, err +} + +func (c *OccClient) TransitionRequest(ctx context.Context, fromState string, toState string, args map[string]string) (*pb.TransitionReply, error) { + if c == nil || c.client == nil { + return nil, errors.New("nil client for TransitionRequest") + } + + from, err := StateFromString(fromState) + if err != nil { + return nil, err + } + to, err := StateFromString(toState) + if err != nil { + return nil, err + } + + transition, err := FromStatesToTransition(from, to) + if err != nil { + return nil, err + } + + var configEntries []*pb.ConfigEntry + for k, v := range args { + configEntries = append(configEntries, &pb.ConfigEntry{Key: k, Value: v}) + } + + request := &pb.TransitionRequest{ + SrcState: strings.ToUpper(fromState), + TransitionEvent: strings.ToUpper(transition.String()), + Arguments: configEntries, + } + c.log.V(1).Info("TransitionRequest", "req", request) + + return c.client.Transition(ctx, request) +} + +func (c *OccClient) ConsumeEventStream(ctx context.Context) { + c.log.Info("starting to consume EventStream") + stream, err := c.client.EventStream(ctx, &pb.EventStreamRequest{}) + if err != nil { + c.log.Error(err, "failed to start event stream") + return + } + for { + resp, err := stream.Recv() + if err != nil { + if st, ok := status.FromError(err); ok && st.Code() == codes.Canceled { + c.log.Info("EventStream stopped: context cancelled") + return + } + c.log.Error(err, "EventStream stopped with error") + return + } + c.log.Info("received event", "event", resp.GetEvent()) + } +} + +func (c *OccClient) ConsumeStateStream(ctx context.Context) { + c.log.Info("starting to consume StateStream") + stream, err := c.client.StateStream(ctx, &pb.StateStreamRequest{}) + if err != nil { + c.log.Error(err, "failed to start state stream") + return + } + + for { + resp, err := stream.Recv() + if err != nil { + if st, ok := status.FromError(err); ok && st.Code() == codes.Canceled { + c.log.Info("StateStream stopped: context cancelled") + return + } + c.log.Error(err, "StateStream stopped with error") + return + } + c.log.V(1).Info("received state update", "type", resp.GetType(), "state", resp.GetState()) + + task := &aliecsv1alpha1.Task{} + if err := c.reconciler.Get(ctx, c.crdName, task); err != nil { + c.log.V(1).Error(err, "state event could not find task") + continue + } + // TODO: add some checks?? + task.Status.State = fromDeviceState(c.controlMode, resp.GetState()) + updateCtx, cancel := context.WithTimeout(context.Background(), time.Second) + if err := c.reconciler.Status().Update(updateCtx, task); err != nil { + c.log.Error(err, "state event did not apply state change to task", "state", task.Status.State) + } + cancel() + } +} diff --git a/control-operator/internal/controller/jsoncodec.go b/control-operator/internal/controller/jsoncodec.go new file mode 100644 index 000000000..a4070f8e6 --- /dev/null +++ b/control-operator/internal/controller/jsoncodec.go @@ -0,0 +1,49 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "encoding/json" + + "google.golang.org/grpc/encoding" +) + +func init() { + encoding.RegisterCodec(&jsonCodec{}) +} + +type jsonCodec struct{} + +func (*jsonCodec) Marshal(v interface{}) ([]byte, error) { + return json.Marshal(v) +} + +func (*jsonCodec) Unmarshal(data []byte, v interface{}) error { + return json.Unmarshal(data, v) +} + +func (*jsonCodec) Name() string { + return "json" +} diff --git a/control-operator/internal/controller/protos/occ.proto b/control-operator/internal/controller/protos/occ.proto new file mode 100644 index 000000000..ca00369c1 --- /dev/null +++ b/control-operator/internal/controller/protos/occ.proto @@ -0,0 +1,99 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +syntax = "proto3"; + +package occ_pb; +option go_package = "github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated;pb"; + +////////////////////////////////////////////////////// + +service Occ { + // We have to have a notification stream because the FairMQDevice might transition + // on its own for whatever reason. + rpc EventStream (EventStreamRequest) returns (stream EventStreamReply) {} + rpc StateStream (StateStreamRequest) returns (stream StateStreamReply) {} + rpc GetState (GetStateRequest) returns (GetStateReply) {} + rpc Transition (TransitionRequest) returns (TransitionReply) {} +} + +enum StateChangeTrigger { + EXECUTOR = 0; + DEVICE_INTENTIONAL = 1; + DEVICE_ERROR = 2; +} + +enum StateType { + STATE_STABLE = 0; + STATE_INTERMEDIATE = 1; +} + +enum DeviceEventType { + NULL_DEVICE_EVENT = 0; + END_OF_STREAM = 1; + BASIC_TASK_TERMINATED = 2; + TASK_INTERNAL_ERROR = 3; +} + +message StateStreamRequest {} + +message StateStreamReply { + StateType type = 1; + string state = 2; +} + +message EventStreamRequest {} + +message DeviceEvent { + DeviceEventType type = 1; +} + +message EventStreamReply { + DeviceEvent event = 1; +} + +message GetStateRequest {} + +message GetStateReply { + string state = 1; + int32 pid = 2; +} + +message ConfigEntry { + string key = 1; + string value = 2; +} + +message TransitionRequest { + string srcState = 1; + string transitionEvent = 2; + repeated ConfigEntry arguments = 3; +} + +message TransitionReply { + StateChangeTrigger trigger = 1; + string state = 2; + string transitionEvent = 3; + bool ok = 4; +} diff --git a/control-operator/internal/controller/suite_test.go b/control-operator/internal/controller/suite_test.go new file mode 100644 index 000000000..7be153c8f --- /dev/null +++ b/control-operator/internal/controller/suite_test.go @@ -0,0 +1,89 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "path/filepath" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/envtest" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + + aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + //+kubebuilder:scaffold:imports +) + +// These tests use Ginkgo (BDD-style Go testing framework). Refer to +// http://onsi.github.io/ginkgo/ to learn more about Ginkgo. + +var ( + cfg *rest.Config + k8sClient client.Client + testEnv *envtest.Environment +) + +func TestControllers(t *testing.T) { + RegisterFailHandler(Fail) + + RunSpecs(t, "Controller Suite") +} + +var _ = BeforeSuite(func() { + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) + + By("bootstrapping test environment") + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, + ErrorIfCRDPathMissing: true, + } + + var err error + // cfg is defined in this file globally. + cfg, err = testEnv.Start() + Expect(err).NotTo(HaveOccurred()) + Expect(cfg).NotTo(BeNil()) + + err = aliecsv1alpha1.AddToScheme(scheme.Scheme) + Expect(err).NotTo(HaveOccurred()) + + //+kubebuilder:scaffold:scheme + + k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme}) + Expect(err).NotTo(HaveOccurred()) + Expect(k8sClient).NotTo(BeNil()) +}) + +var _ = AfterSuite(func() { + By("tearing down the test environment") + err := testEnv.Stop() + Expect(err).NotTo(HaveOccurred()) +}) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go new file mode 100644 index 000000000..93ec00b96 --- /dev/null +++ b/control-operator/internal/controller/task_controller.go @@ -0,0 +1,384 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + "encoding/json" + "fmt" + "reflect" + "strings" + "time" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/log" + + aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + "github.com/go-logr/logr" +) + +// TaskReconciler reconciles a Task object +type TaskReconciler struct { + client.Client + Scheme *runtime.Scheme + Recorder record.EventRecorder +} + +var clientsForContainers map[string]*OccClient = make(map[string]*OccClient) + +const taskFinalizer string = "aliecs.alice.cern/finalizer" + +//+kubebuilder:rbac:groups=aliecs.alice.cern,resources=tasks,verbs=get;list;watch;create;update;patch;delete +//+kubebuilder:rbac:groups=aliecs.alice.cern,resources=tasks/status,verbs=get;update;patch +//+kubebuilder:rbac:groups=aliecs.alice.cern,resources=tasks/finalizers,verbs=update +//+kubebuilder:rbac:groups=core,resources=events,verbs=create;patch +//+kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// TODO(user): Modify the Reconcile function to compare the state specified by +// the Task object against the actual cluster state, and then +// perform operations to make the cluster state reflect the state specified by +// the user. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.15.0/pkg/reconcile +// TODO: right now if POD fails and stops sooner, reconciliation creates a new one... +func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + log := log.FromContext(ctx) + + t := &aliecsv1alpha1.Task{} + if err := r.Get(ctx, req.NamespacedName, t); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + log.V(1).Info("new reconcile request on existing Task Kind", "request", req) + + // Handle finalizers for clean deletion + if res, stop, err := r.handleFinalizer(ctx, t, log); err != nil || stop { + return res, err + } + + // TODO: add this check to direct_transition.go + if t.Status.State == "error" && t.Spec.State != "standby" { + return ctrl.Result{}, nil + } + + // Get existing pod or create new one, Reconciler owns the pod, so all changes to the pod and task will trigger + // reconciliation + // TODO: make this function + existingPod := &v1.Pod{} + err := r.Get(ctx, types.NamespacedName{ + Name: podNameFromTask(t.Name), + Namespace: t.Namespace, + }, existingPod) + if err != nil { + if errors.IsNotFound(err) { + pod := r.podForTask(t) + log.Info("Creating a new Pod", "Pod.Namespace", pod.Namespace, "Pod.Name", pod.Name) + if err = r.Create(ctx, pod); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil + } + return ctrl.Result{}, err + } + + if failed, reason := isPodFailed(existingPod); failed { + if t.Status.State != "error" { + log.Info("Pod failure detected, setting Task state to error", "reason", reason) + t.Status.State = "error" + t.Status.Error = reason + t.Status.Pod = *existingPod.Status.DeepCopy() + if err := r.Status().Update(ctx, t); err != nil { + return ctrl.Result{}, err + } + } + // Always stop reconciliation if the Pod is in a failed state + return ctrl.Result{}, nil + } + + if _, exists := clientsForContainers[t.Name]; !exists { + if existingPod.Status.PodIP == "" { + log.Info("pod doesn't have IP yet, we wait for different event") + return ctrl.Result{}, nil + } + res, err := r.createGRPCConsumer(ctx, t, existingPod, req.NamespacedName, log) + if err != nil || !res.IsZero() { + return res, err + } + } + + // when this succesfully returns we should be able to communicate via gRPC + if res := r.consumeGRPCConsumerIfReady(ctx, t, log); !res.IsZero() { + return res, nil + } + + // As far as I understand this is necessary because even though we have gRPC streams, we cannot rely + // on them being implemented + if t.Status.State == "" { + log.V(1).Info("Status.State is empty, querying container") + client, exists := clientsForContainers[t.Name] + if !exists { + return ctrl.Result{Requeue: true}, nil + } + + stateReply, err := client.GetState(ctx) + if err != nil { + log.Error(err, "Failed to GetState") + return ctrl.Result{}, nil + } + + log.V(1).Info("Current State inside POD is: ", "state", stateReply.State) + t.Status.State = stateReply.State + log.Info("Updating empty Task status ", "state", t.Status.State) + if err := r.Status().Update(ctx, t); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil + } + + oldStatus := t.Status.DeepCopy() + + t.Status.Pod = *existingPod.Status.DeepCopy() + + // Handle Spec -> gRPC State Sync + if t.Status.State != t.Spec.State { + client, exists := clientsForContainers[t.Name] + if !exists { + return ctrl.Result{Requeue: true}, nil + } + + stateReply, err := client.GetState(ctx) + if err != nil { + log.Info("Failed to get state for sync, retrying in 5s", "error", err.Error()) + client.Close() + delete(clientsForContainers, t.Name) + return ctrl.Result{RequeueAfter: 5 * time.Second}, nil + } + + if stateReply.GetState() != t.Spec.State { + var ( + newState string + transErr error + ) + + if t.Spec.Control.Mode == "fairmq" { + newState, transErr = client.FairMQTransitionRequest(ctx, stateReply.GetState(), t.Spec.State, t.Spec.Arguments) + } else { + reply, err := client.TransitionRequest(ctx, stateReply.GetState(), t.Spec.State, t.Spec.Arguments) + transErr = err + if err == nil && reply.GetOk() { + newState = strings.ToLower(reply.GetState()) + } + } + + if transErr != nil { + log.Error(transErr, "failed to Transition") + t.Status.Error = transErr.Error() + log.Info("Updating Task status") + if err := r.Status().Update(ctx, t); err != nil { + return ctrl.Result{}, err + } + return ctrl.Result{}, nil + } + if newState != "" { + log.V(1).Info("succeeded in transition", "new state", newState) + t.Status.State = newState + } + } + + } + + // Status Update: Only call the API if the status actually changed + // TODO: should I also add some query for GetState in case some Update or whatever fails? + // TODO: is this the best way? shouldn't we do the Update the moment something changes? + if !reflect.DeepEqual(oldStatus, &t.Status) { + log.Info("Updating Task status") + if err := r.Status().Update(ctx, t); err != nil { + return ctrl.Result{}, err + } + } + + return ctrl.Result{}, nil +} + +func (r *TaskReconciler) createGRPCConsumer(ctx context.Context, t *aliecsv1alpha1.Task, found *v1.Pod, taskName types.NamespacedName, log logr.Logger) (ctrl.Result, error) { + addr := fmt.Sprintf("%s:%d", found.Status.PodIP, t.Spec.Control.Port) + ctx, cancel := context.WithTimeout(ctx, 3*time.Second) + defer cancel() + + log.Info("creating gRPC client for task to task: ", "address", addr) + client, err := NewOccClient(ctx, addr, t.Spec.Control.Mode, r, taskName, log) + if err != nil { + log.Error(err, "failed to create gRPC client, retrying in 5 seconds") + // TODO: what would be proper error handling here? + return ctrl.Result{RequeueAfter: 5 * time.Second}, nil + } + + clientsForContainers[t.Name] = client + + return ctrl.Result{}, nil +} + +func (r *TaskReconciler) consumeGRPCConsumerIfReady(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) ctrl.Result { + client, exists := clientsForContainers[t.Name] + + if !exists { + log.Info("didn't found existing client, retrying ", "task", t.Name) + return ctrl.Result{RequeueAfter: time.Second} + } + + if !client.ConsumeIfReady(ctx) { + log.Info("gRPC client is not ready, retrying in 5 seconds", "name", t.Name) + return ctrl.Result{RequeueAfter: 5 * time.Second} + } + return ctrl.Result{} +} + +// Note: if you add finalizer to a task you cannot delete it unless you remove the finalizer, run: +// kubectl patch task --type=json -p='[{"op": "remove", "path": "/metadata/finalizers"}]' +func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (ctrl.Result, bool, error) { + if t.DeletionTimestamp.IsZero() { + if !controllerutil.ContainsFinalizer(t, taskFinalizer) { + controllerutil.AddFinalizer(t, taskFinalizer) + if err := r.Update(ctx, t); err != nil { + return ctrl.Result{}, true, err + } + return ctrl.Result{}, true, nil + } + } else { + if controllerutil.ContainsFinalizer(t, taskFinalizer) { + log.Info("Cleaning up gRPC connection before deletion") + if client, exists := clientsForContainers[t.Name]; exists { + if err := client.Close(); err != nil { + log.Error(err, "Failed to close gRPC client during deletion") + } + delete(clientsForContainers, t.Name) + } + + controllerutil.RemoveFinalizer(t, taskFinalizer) + if err := r.Update(ctx, t); err != nil { + return ctrl.Result{}, true, err + } + } + return ctrl.Result{}, true, nil + } + return ctrl.Result{}, false, nil +} + +func podNameFromTask(name string) string { + return fmt.Sprintf("aliecs-task-pod-%s", name) +} + +func (r *TaskReconciler) podForTask(t *aliecsv1alpha1.Task) *v1.Pod { + lbls := labelsForTask(t) + + pod := &v1.Pod{ + ObjectMeta: metav1.ObjectMeta{ + Name: podNameFromTask(t.Name), + Namespace: t.Namespace, + Labels: lbls, + }, + Spec: t.Spec.Pod, + } + pod.Spec.RestartPolicy = v1.RestartPolicyNever + + _ = controllerutil.SetControllerReference(t, pod, r.Scheme) + return pod +} + +func labelsForTask(t *aliecsv1alpha1.Task) map[string]string { + return map[string]string{ + "task_name": t.Name, + "application": "ControlOperator", + } +} + +func isPodFailed(pod *v1.Pod) (bool, string) { + if pod.Status.Phase == v1.PodFailed { + return true, fmt.Sprintf("Pod failed: %s", pod.Status.Reason) + } + + // Helper to check container statuses + checkContainerStatus := func(statuses []v1.ContainerStatus) (bool, string) { + for _, cs := range statuses { + if cs.State.Waiting != nil { + reason := cs.State.Waiting.Reason + switch reason { + case "CrashLoopBackOff", "ImagePullBackOff", "ErrImagePull", "CreateContainerConfigError", "InvalidImageName", "CreateContainerError": + return true, fmt.Sprintf("Container %s is in %s: %s", cs.Name, reason, cs.State.Waiting.Message) + } + } + if cs.State.Terminated != nil && cs.State.Terminated.ExitCode != 0 { + return true, fmt.Sprintf("Container %s failed with ExitCode %d: %s", cs.Name, cs.State.Terminated.ExitCode, cs.State.Terminated.Message) + } + // If it has restarted multiple times and is currently not ready, it's likely failing + if cs.RestartCount > 3 && !cs.Ready { + return true, fmt.Sprintf("Container %s has crashed %d times", cs.Name, cs.RestartCount) + } + } + return false, "" + } + + // Check main containers + if failed, reason := checkContainerStatus(pod.Status.ContainerStatuses); failed { + return failed, reason + } + + // Check init containers + if failed, reason := checkContainerStatus(pod.Status.InitContainerStatuses); failed { + return failed, reason + } + + return false, "" +} + +// SetupWithManager sets up the controller with the Manager. +func (r *TaskReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&aliecsv1alpha1.Task{}). + Owns(&v1.Pod{}). + WithOptions(controller.Options{MaxConcurrentReconciles: 1}). + Complete(r) +} + +func prettyPrint(i any) string { + s, err := json.MarshalIndent(i, "", " ") + if err != nil { + // If marshalling fails, return a simple error string + return "failed to pretty-print object" + } + return string(s) +} From 21dd064312cab0402f448671ec538da40f03bde9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Thu, 30 Apr 2026 16:40:35 +0200 Subject: [PATCH 2276/2352] [OCTRL-1092] Add metrics to TryTransition (#814) --- common/monitoring/metric.go | 8 ++++++++ core/environment/environment.go | 5 +++++ core/environment/transition.go | 5 +---- core/environment/utils.go | 9 +++++++++ 4 files changed, 23 insertions(+), 4 deletions(-) diff --git a/common/monitoring/metric.go b/common/monitoring/metric.go index fe0ab8c9a..b0f4f98a7 100644 --- a/common/monitoring/metric.go +++ b/common/monitoring/metric.go @@ -78,6 +78,14 @@ const ( TIMEOUT = "timeout" ) +func (metric *Metric) AddError(err error) { + if err == nil { + metric.AddResult(SUCCESS) + } else { + metric.AddResult(ERROR) + } +} + func (metric *Metric) AddResult(result string) { metric.AddTag("result", result) } diff --git a/core/environment/environment.go b/core/environment/environment.go index fcdac227e..176b80a2d 100644 --- a/core/environment/environment.go +++ b/core/environment/environment.go @@ -1007,6 +1007,9 @@ func (env *Environment) TryTransition(t Transition) (err error) { WorkflowTemplateInfo: env.GetWorkflowInfo(), }) + metric := transitionMetric(env, t.eventName(), "try") + defer monitoring.TimerSendSingle(&metric, monitoring.Millisecond)() + err = t.check() if err != nil { the.EventWriterWithTopic(topic.Environment).WriteEvent(&pb.Ev_EnvironmentEvent{ @@ -1020,6 +1023,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { LastRequestUser: env.GetLastRequestUser(), WorkflowTemplateInfo: env.GetWorkflowInfo(), }) + metric.AddError(err) return } err = env.Sm.Event(context.Background(), t.eventName(), t) @@ -1048,6 +1052,7 @@ func (env *Environment) TryTransition(t Transition) (err error) { WorkflowTemplateInfo: env.GetWorkflowInfo(), }) } + metric.AddError(err) return } diff --git a/core/environment/transition.go b/core/environment/transition.go index ecb563bf8..0cf342635 100644 --- a/core/environment/transition.go +++ b/core/environment/transition.go @@ -77,8 +77,5 @@ func (t baseTransition) eventName() string { } func (t baseTransition) transitionDoMetric(env *Environment) monitoring.Metric { - metric := monitoring.NewMetric("transition_do") - metric.AddTag("transition", t.name) - metric.AddTag("envId", env.Id().String()) - return metric + return transitionMetric(env, t.eventName(), "do") } diff --git a/core/environment/utils.go b/core/environment/utils.go index 7bc15c4f7..e705dcaff 100644 --- a/core/environment/utils.go +++ b/core/environment/utils.go @@ -33,6 +33,7 @@ import ( "sort" "github.com/AliceO2Group/Control/common/logger/infologger" + "github.com/AliceO2Group/Control/common/monitoring" pb "github.com/AliceO2Group/Control/common/protos" "github.com/AliceO2Group/Control/core/task" "github.com/AliceO2Group/Control/core/task/sm" @@ -166,3 +167,11 @@ func HandleFailedGoError(err error, env *Environment) { env.setState("ERROR") } } + +func transitionMetric(env *Environment, transition string, funName string) monitoring.Metric { + metric := monitoring.NewMetric("transition") + metric.AddTag("function", funName) + metric.AddTag("transition", transition) + metric.AddTag("envId", env.Id().String()) + return metric +} From e0a7f09706312a568c3470dacfb09058310094fc Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 4 May 2026 08:50:53 +0200 Subject: [PATCH 2277/2352] Bump to v1.50.0 --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 00cbec6bd..3530926cc 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ # GNU Make syntax VERSION_MAJOR := 1 -VERSION_MINOR := 49 +VERSION_MINOR := 50 VERSION_PATCH := 0 From e613d36d486eb509f1756981d994d5e0a5b0e65f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Fri, 8 May 2026 16:52:01 +0200 Subject: [PATCH 2278/2352] Hook control mode was changed to direct in task (#815) [core] Hook control mode is no longer changed to direct --- core/task/taskclass/class.go | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/task/taskclass/class.go b/core/task/taskclass/class.go index 902741c6c..0acf88a93 100644 --- a/core/task/taskclass/class.go +++ b/core/task/taskclass/class.go @@ -123,7 +123,6 @@ func (c *Class) UnmarshalYAML(unmarshal func(interface{}) error) (err error) { } } return - } func (c *Class) MarshalYAML() (interface{}, error) { @@ -153,14 +152,7 @@ func (c *Class) MarshalYAML() (interface{}, error) { Constraints: c.Constraints, Command: c.Command, } - - if c.Control.Mode == controlmode.FAIRMQ { - aux.Control.Mode = "fairmq" - } else if c.Control.Mode == controlmode.BASIC { - aux.Control.Mode = "basic" - } else { - aux.Control.Mode = "direct" - } + aux.Control.Mode = c.Control.Mode.String() return aux, nil } From 8ef980666251bc6a748102abed81c7272e1f6dd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Fri, 8 May 2026 17:21:41 +0200 Subject: [PATCH 2279/2352] [OCTRL-1081] Wrap kubectl into Mesos executor task (#805) * OCTRL-1081 kubectl task to create rudimentary bridge to kubernetes user infor setup properly... kubectl passes arguments properly to the kubernetes attempt for fairmq bla * fixed documentation * adding kubeconfig to kubectl calls so it works even without $HOME set * fixing documentation and typos * strip quotes in kubectl_task.go * remove leftover --- README.md | 1 + common/controlmode/controlmode.go | 10 + control-operator/README.md | 29 +- core/task/scheduler.go | 3 +- core/task/task.go | 11 +- docs/kubernetes_ecs.md | 76 +++++ executor/executable/kubectltask.go | 427 ++++++++++++++++++++++++ executor/executable/kubectltask_test.go | 80 +++++ executor/executable/task.go | 23 +- 9 files changed, 645 insertions(+), 15 deletions(-) create mode 100644 docs/kubernetes_ecs.md create mode 100644 executor/executable/kubectltask.go create mode 100644 executor/executable/kubectltask_test.go diff --git a/README.md b/README.md index 80bb8d7a8..2d1b3d87a 100644 --- a/README.md +++ b/README.md @@ -196,6 +196,7 @@ There are two ways of interacting with AliECS: * Kubernetes * [Operator controller](/control-operator/README.md) * [Testing manifests](/control-operator/ecs-manifests/kubernetes-ecs.md) + * [ECS bridge to Kubernetes](/docs/kubernetes_ecs.md) * Resources * T. Mrnjavac et. al, [AliECS: A New Experiment Control System for the ALICE Experiment](https://doi.org/10.1051/epjconf/202429502027), CHEP23 diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index 6d6dc8fdb..5cab19729 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -39,6 +39,8 @@ const ( FAIRMQ BASIC HOOK + KUBECTL_DIRECT + KUBECTL_FAIRMQ ) func (cm ControlMode) String() string { @@ -51,6 +53,10 @@ func (cm ControlMode) String() string { return "basic" case HOOK: return "hook" + case KUBECTL_DIRECT: + return "kubectl_direct" + case KUBECTL_FAIRMQ: + return "kubectl_fairmq" } return "direct" } @@ -71,6 +77,10 @@ func (cm *ControlMode) UnmarshalText(b []byte) error { *cm = BASIC case "hook": *cm = HOOK + case "kubectl_direct": + *cm = KUBECTL_DIRECT + case "kubectl_fairmq": + *cm = KUBECTL_FAIRMQ default: *cm = DIRECT } diff --git a/control-operator/README.md b/control-operator/README.md index 4813880ef..852a2aa5b 100644 --- a/control-operator/README.md +++ b/control-operator/README.md @@ -1,33 +1,42 @@ # operator -// TODO(user): Add simple overview of use/purpose + +Folder with operators regarding Task and Environment deployment. ## Description -// TODO(user): An in-depth paragraph about your project and overview of use + +In order to deploy Task and Environment workflows to the k8s cluster you need controllers and operators +controlling custom CRDs defining ALICE custom workload. This Folder defines and implements all moving parts together with Makefile +to build, deploy, install CRDs and operators. ## Getting Started -You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster. -**Note:** Your controller will automatically use the current context in your kubeconfig file (i.e. whatever cluster `kubectl cluster-info` shows). + +You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster. Author had the most success with K3s [see](/docs/kubernetes_ecs.md). +**Note:** Your controller will automatically use the current context in your kubeconfig (usually ~/.kube/config) file (i.e. whatever cluster `kubectl cluster-info` shows). ### Running on the cluster + +Following commands show basic use of Makefile. However this isn't exhaustive list. + 1. Install Instances of Custom Resources: ```sh kubectl apply -f config/samples/ ``` -2. Build and push your image to the location specified by `IMG`: +1. Build and push your image to the location specified by `IMG`: ```sh make docker-build docker-push IMG=/operator:tag ``` -3. Deploy the controller to the cluster with the image specified by `IMG`: +1. Deploy the controller to the cluster with the image specified by `IMG`: ```sh make deploy IMG=/operator:tag ``` ### Uninstall CRDs + To delete the CRDs from the cluster: ```sh @@ -35,6 +44,7 @@ make uninstall ``` ### Undeploy controller + UnDeploy the controller from the cluster: ```sh @@ -42,22 +52,25 @@ make undeploy ``` ## Contributing + // TODO(user): Add detailed information on how you would like others to contribute to this project ### How it works + This project aims to follow the Kubernetes [Operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). It uses [Controllers](https://kubernetes.io/docs/concepts/architecture/controller/), which provide a reconcile function responsible for synchronizing resources until the desired state is reached on the cluster. ### Test It Out + 1. Install the CRDs into the cluster: ```sh make install ``` -2. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): +1. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): ```sh make run @@ -66,6 +79,7 @@ make run **NOTE:** You can also run this in one step by running: `make install run` ### Modifying the API definitions + If you are editing the API definitions, generate the manifests such as CRs or CRDs using: ```sh @@ -91,4 +105,3 @@ 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. - diff --git a/core/task/scheduler.go b/core/task/scheduler.go index 5e2d60fe4..737cad73e 100644 --- a/core/task/scheduler.go +++ b/core/task/scheduler.go @@ -1432,7 +1432,8 @@ func makeTaskForMesosResources( cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%d", "OCC_CONTROL_PORT", controlPort)) } - if cmd.ControlMode == controlmode.FAIRMQ { + if cmd.ControlMode == controlmode.FAIRMQ || + cmd.ControlMode == controlmode.KUBECTL_FAIRMQ { cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(controlPort, 10)) } diff --git a/core/task/task.go b/core/task/task.go index ba3c459e5..bee19a1b5 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -286,7 +286,9 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { if class.Control.Mode == controlmode.BASIC || class.Control.Mode == controlmode.HOOK || class.Control.Mode == controlmode.DIRECT || - class.Control.Mode == controlmode.FAIRMQ { + class.Control.Mode == controlmode.FAIRMQ || + class.Control.Mode == controlmode.KUBECTL_DIRECT || + class.Control.Mode == controlmode.KUBECTL_FAIRMQ { var varStack map[string]string // First we get the full varStack from the parent role, and @@ -393,7 +395,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { } } - if class.Control.Mode == controlmode.FAIRMQ { + if class.Control.Mode == controlmode.FAIRMQ || + class.Control.Mode == controlmode.KUBECTL_FAIRMQ { // FIXME read this from configuration // if the task class doesn't provide an id, we generate one ourselves if !utils.StringSliceContains(cmd.Arguments, "--id") { @@ -635,7 +638,9 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand // For FAIRMQ tasks, we append FairMQ channel configuration if class.Control.Mode == controlmode.FAIRMQ || - class.Control.Mode == controlmode.DIRECT { + class.Control.Mode == controlmode.DIRECT || + class.Control.Mode == controlmode.KUBECTL_DIRECT || + class.Control.Mode == controlmode.KUBECTL_FAIRMQ { for _, inbCh := range channel.MergeInbound(parent.CollectInboundChannels(), class.Bind) { // We get the FairMQ-formatted propertyMap from the inbound channel spec var chanProps controlcommands.PropertyMap diff --git a/docs/kubernetes_ecs.md b/docs/kubernetes_ecs.md new file mode 100644 index 000000000..dfe89e03d --- /dev/null +++ b/docs/kubernetes_ecs.md @@ -0,0 +1,76 @@ +# ECS with Kubernetes + +> ⚠️ **Warning** +> All Kubernetes work done is in a stage of prototype. + +## Kubernetes Cluster + +While prototyping we used many Kubernetes clusters, namely [`kind`](https://kind.sigs.k8s.io/), [`minikube`](https://minikube.sigs.k8s.io/docs/) and [`k3s`](https://k3s.io/) +in both local and remote cluster deployment. We used Openstack for remote deployment. +Follow the guides at the individual distributions in order to create the desired cluster setup. +k3s is recommended to run this prototype, as it is lightweight +and easily installed distribution which is also [`CNCF`](https://www.cncf.io/training/certification/) certified. + +All settings of `k3s` were used as default except one: locked-in-memory size. Use `ulimit -l` to learn +what is the limit for the current user and `LimitMEMLOCK` inside the k3s systemd service config +to set it for correct value. Right now the `flp` user has unlimited size (`LimitMEMLOCK=infinity`). +This config is necessary because even if you are running Pods with the privileged security context +under user flp, Kubernetes still sets limits according to its internal settings and doesn't +respect linux settings. + +Another setup we expect at this moment to be present at the target nodes +is ability to run Pods with privileged permissions and also under user `flp`. +This means that the machine has to have `flp` user setup the same way as +if you would do the installation with [`o2-flp-setup`](https://alice-flp.docs.cern.ch/Operations/Experts/system-configuration/utils/o2-flp-setup/). + +## Task Controller + +Following text assumes that there is a Task Controller from `control-operator` running +at your K8s cluster and Task CRD installed at your cluster. +You can find the details about the usage in the [documentation](/control-operator/README.md). + +## Running tasks (`KubectlTask`) + +ECS is setup to run tasks through Mesos on all required hosts baremetal with active +task management (see [`ControllableTask`](/executor/executable/controllabletask.go)) +and OCC gRPC communication. When running docker task through ECS we could easily +wrap command to be run into the docker container with proper settings +([see](/docs/running_docker.md)). This is however not possible for Kubernetes +workloads as the Pods are "hidden" inside the cluster. So we plan +to deploy our own Task Controller which will connect to and guide +OCC state machine of required tasks. Thus we need to create custom +POC way to communicate with Kubernetes cluster from Mesos executor. + +The reason why we don't call Kubernetes cluster directly from ECS core +is that ECS does a lot of heavy lifting while deploying workloads, +monitoring workloads and by generating a lot of configuration which +is not trivial to replicate manually. However, if we create some class +that would be able to deploy one task into the Kubernetes and monitor its +state we could replicate `ControllableTask` workflow and leave ECS +mostly intact for now, save a lot of work and focus on prototyping +Kubernetes operator pattern. + +Thus [`KubectlTask`](/executor/executable/kubectltask.go) was created. This class +is written as a wrapper around `kubectl` utility to manage Kubernetes cluster. +It is based on following `kubectl` commands: + +* `apply` => `kubectl apply -f manifest.yaml` - deploys resource described inside given manifest +* `delete` => `kubectl delete -f manifest.yaml` - deletes resource from cluster +* `patch` => `kubectl patch -f exampletask.yaml --type='json' -p='[{"op": "replace", "path": "/spec/state", "value": "running"}]` - changes the state of resource inside cluster +* `get` => `kubectl get -f manifest.yaml -o jsonpath='{.spec.state}'` - queries exact field of resource (`state` in the example) inside cluster. + +These four commands allow us to deploy and monitor status of the deployed +resource without necessity to interact with it directly. However `KubectlTask` +expects that resource is the CRD [Task](/control-operator/api/v1alpha1/task_types.go). + +In order to activate `KubectlTask` you need to change yaml template +inside the `ControlWorkflows` directory. Namely: + +* add path to the kubectl manifest as the first argument in `.command.arguments` field +* change `.control.mode` to either `kubectl_direct` or `kubectl_fairmq` +You can find working template inside `control-operator/ecs-manifests/control-workflows/*-kube.yaml` + +Working kubectl manifests are to be found in `control-operator/ecs-manifests/kubernetes-manifests`. +You can see `*test.yaml` for concrete deployable manifests by `kubectl apply`, the rest +are the templates with variables to be filled in in a `${var}` format. `KubectlTask` +fills these variables from env vars. diff --git a/executor/executable/kubectltask.go b/executor/executable/kubectltask.go new file mode 100644 index 000000000..7a764390a --- /dev/null +++ b/executor/executable/kubectltask.go @@ -0,0 +1,427 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "os" + "os/exec" + "os/user" + "path/filepath" + "strconv" + "strings" + "sync/atomic" + "time" + + "github.com/AliceO2Group/Control/core/controlcommands" + "github.com/AliceO2Group/Control/executor/executorcmd" + mesos "github.com/mesos/mesos-go/api/v1/lib" + "github.com/sirupsen/logrus" +) + +const ( + KUBECTL string = "kubectl" + + APPLY string = "apply" + DELETE string = "delete" + PATCH string = "patch" + GET string = "get" + TASK string = "task" + CREATE string = "create" + + // TRANSITION_TIMEOUT = 10 * time.Second // inside controllable task +) + +var kubeconfigDir string + +func init() { + if kc := os.Getenv("KUBECONFIG"); kc != "" { + kubeconfigDir = kc + return + } + if u, err := user.Current(); err == nil { + tempPath := filepath.Join(u.HomeDir, ".kube", "config") + if _, err = os.Stat(tempPath); err == nil { + kubeconfigDir = tempPath + } + } +} + +func kubectl(ctx context.Context, arg ...string) *exec.Cmd { + if kubeconfigDir == "" { + log.Warn(`kubectl config was not set, thus kubectl might not be able to find a cluster. +Either KUBECONFIG env var was not found, or current user was not determined, or home/.kube/config does not exist. +Using kubectl builtin defaults`) + return exec.CommandContext(ctx, KUBECTL, arg...) + } else { + return exec.CommandContext(ctx, KUBECTL, append([]string{"--kubeconfig", kubeconfigDir}, arg...)...) + } +} + +type KubectlTask struct { + taskBase + rpc *executorcmd.RpcClient + configYaml string + running bool + latestStatus atomic.Value +} + +func GetUserInfo(username string) (uid, gid int64, supplemental []int64, err error) { + u, err := user.Lookup(username) + if err != nil { + return 0, 0, nil, err + } + + // Convert UID + uidInt, _ := strconv.ParseInt(u.Uid, 10, 64) + + // Convert Primary GID + gidInt, _ := strconv.ParseInt(u.Gid, 10, 64) + + // Get Supplemental Groups (e.g., wheel, pda) + groupStrings, _ := u.GroupIds() + var supplementalInts []int64 + for _, g := range groupStrings { + gInt, _ := strconv.ParseInt(g, 10, 64) + // Avoid adding the primary GID to the supplemental list + if gInt != gidInt { + supplementalInts = append(supplementalInts, gInt) + } + } + + return uidInt, gidInt, supplementalInts, nil +} + +func (task *KubectlTask) Launch() error { + if len(task.Tci.Arguments) == 0 { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + }). + Error("no arguments in kubectl task. We need to have at least manifest location as the last argument") + return errors.New("no arguments for kubectl task. Location for kubernetes manifest needed") + } + + task.configYaml = task.Tci.Arguments[0] + + // Read the template file + content, err := os.ReadFile(task.configYaml) + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "file": task.configYaml, + }).WithError(err).Error("failed to read kubectl config file") + return err + } + + // Set the AliECS environment variables in the local process + // so os.ExpandEnv can find them + for _, envVar := range task.Tci.Env { + parts := strings.SplitN(envVar, "=", 2) + if len(parts) == 2 { + value := parts[1] + if n := len(value); n >= 2 && ((value[0] == '"' && value[n-1] == '"') || (value[0] == '\'' && value[n-1] == '\'')) { + value = value[1 : n-1] + } + os.Setenv(parts[0], value) + } + } + + // Set arguments into the KUBE_ARGUMENTS os env leaving the kubemanifest file + arguments := task.Tci.Arguments[1:] + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "args": arguments, + }).Info("setting arguments as a KUBE_ARGUMENTS env var") + + os.Setenv("KUBE_ARGUMENTS", strings.Join(arguments, " ")) + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": *task.Tci.Value, + }).Info("setting command as a KUBE_COMMAND env var") + os.Setenv("KUBE_COMMAND", *task.Tci.Value) + + if uid, gid, supplementalIds, err := GetUserInfo("flp"); err == nil { + os.Setenv("FLP_UID", strconv.FormatInt(uid, 10)) + os.Setenv("FLP_GID", strconv.FormatInt(gid, 10)) + + var strIds []string + for _, id := range supplementalIds { + strIds = append(strIds, strconv.FormatInt(id, 10)) + } + supplementalString := "[" + strings.Join(strIds, ", ") + "]" + + os.Setenv("FLP_SUPPLEMENTAL_GROUPS", supplementalString) + } else { + log.Error("we cannot run kubectl task as flp user because we didn't find user details") + } + + // Replace ${VAR} placeholders with actual values + expandedYaml := os.ExpandEnv(string(content)) + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + // Apply via Stdin (-) + command := kubectl(ctx, APPLY, "-f", "-") + command.Stdin = strings.NewReader(expandedYaml) + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + "expandedYaml": expandedYaml, + }).Info("Starting kubectl apply via Stdin") + + var stdoutBuf bytes.Buffer + var stderrBuf bytes.Buffer + + command.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf) + command.Stderr = io.MultiWriter(os.Stderr, &stderrBuf) + + err = command.Run() + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + }).WithError(err).Errorf("kubectl apply failed stderr: %s , stdout: %s", stderrBuf.String(), stdoutBuf.String()) + return err + } + + task.latestStatus.Store("") + task.running = true + go task.eventLoop() + return nil +} + +func (task *KubectlTask) Kill() error { + task.running = false + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + command := kubectl(ctx, DELETE, "-f", task.configYaml) + + command.Stdout = os.Stdout + command.Stderr = os.Stderr + + err := command.Run() + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + }).WithError(err).Error("kubectl delete failed") + return err + } + + task.sendStatus(task.knownEnvironmentId, mesos.TASK_FINISHED, "") + + return nil +} + +func (task *KubectlTask) Transition(transition *executorcmd.ExecutorCommand_Transition) *controlcommands.MesosCommandResponse_Transition { + // kubectl patch -f exampletask.yaml --type='json' -p='[{"op": "replace", "path": "/spec/state", "value": "running"}]' + + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + // Extract the transition arguments (the 'Mix') to pipe them to Kubernetes + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "args": transition.Arguments, + }).Info("Patching transition arguments to Kubernetes") + + argsJSON, err := json.Marshal(transition.Arguments) + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + }).WithError(err).Error("failed to marshal transition arguments") + return transition.PrepareResponse(err, transition.Source, task.ti.TaskID.Value) + } + + transitionJSON := fmt.Sprintf(`[ + {"op": "add", "path": "/spec/state", "value": "%s"}, + {"op": "add", "path": "/spec/arguments", "value": %s} + ]`, strings.ToLower(transition.Destination), string(argsJSON)) + + command := kubectl(ctx, PATCH, "-f", task.configYaml, "--type=json", "-p", transitionJSON) + + command.Stdout = os.Stdout + command.Stderr = os.Stderr + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).Info("Starting kubectl patch") + + statusBeforeTransition := task.latestStatus.Load().(string) + + err = command.Run() + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).WithError(err).Error("kubectl patch failed") + return transition.PrepareResponse(err, transition.Source, task.ti.TaskID.Value) + } + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).Info("kubectl patch suceeded, waiting for actual status change") + actualStatus := "" + timeout := time.After(TRANSITION_TIMEOUT) + ticker := time.NewTicker(time.Second) + defer ticker.Stop() + +loop: + for { + select { + case <-ticker.C: + actualStatus = task.latestStatus.Load().(string) + if actualStatus != statusBeforeTransition { + break loop + } + case <-timeout: + return transition.PrepareResponse(errors.New("timeout waiting for status change"), statusBeforeTransition, task.ti.TaskID.Value) + } + } + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).Infof("status changed from %s to %s", statusBeforeTransition, actualStatus) + + // TODO: I am not sure what PID should I put here + return transition.PrepareResponse(nil, actualStatus, task.ti.TaskID.Value) +} + +func (task *KubectlTask) getTaskStatus() (string, error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + // command := exec.CommandContext(ctx, KUBECTL, GET, "-f", task.configYaml, "-o", "jsonpath={.status.state}") + command := kubectl(ctx, GET, "-f", task.configYaml, "-o", "jsonpath={.status.state}") + + var stdoutBuf bytes.Buffer + + command.Stdout = io.MultiWriter(os.Stdout, &stdoutBuf) + command.Stderr = os.Stderr + + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).Debug("Starting kubectl get task") + + err := command.Run() + if err != nil { + log.WithFields(logrus.Fields{ + "controlmode": task.Tci.ControlMode, + "name": task.ti.Name, + "command": command, + }).WithError(err).Error("kubectl get task failed") + return "", err + } + + // no newlines + return strings.TrimSpace(stdoutBuf.String()), nil +} + +func (task *KubectlTask) eventLoop() { + errorCount := 0 + maxErrors := 5 + for task.running { + time.Sleep(5 * time.Second) + status, err := task.getTaskStatus() + if err != nil { + errorCount += 1 + if errorCount < maxErrors { + log.WithError(err).Warnf("failed to get Task Status, retrying %d/%d", errorCount, maxErrors) + continue + } + log.WithError(err).Errorf("failed to get Task Status, sending TASK_FAILED and breaking from the eventLoop") + task.sendStatus(task.knownEnvironmentId, mesos.TASK_FAILED, "couldn't get task status via kubectl") + task.running = false + // TODO: remove when debugging done + // _ = task.Kill() + break + } + + status = strings.ToUpper(status) + + if task.latestStatus.Load().(string) == status { + continue + } + task.latestStatus.Store(status) + + var state mesos.TaskState + switch status { + case "CONFIGURED", "RUNNING", "STANDBY": + state = mesos.TASK_RUNNING + + case "ERROR": + state = mesos.TASK_FAILED + log.WithError(err).Error("Received error from kubectl task, terminating everything and sending update") + task.running = false + // TODO: remove when debugging done + // _ = task.Kill() + // + + default: + log.Errorf("received different status than expected: %s", status) + continue + } + + log.Debugf("sending new status from kubectl task %s", status) + task.sendStatus(task.knownEnvironmentId, state, "") + + } +} + +func (task *KubectlTask) UnmarshalTransition(data []byte) (cmd *executorcmd.ExecutorCommand_Transition, err error) { + cmd = new(executorcmd.ExecutorCommand_Transition) + if task.rpc != nil { + cmd.Transitioner = task.rpc.Transitioner + } + err = json.Unmarshal(data, cmd) + if err != nil { + cmd = nil + } + return +} diff --git a/executor/executable/kubectltask_test.go b/executor/executable/kubectltask_test.go new file mode 100644 index 000000000..6dbb6d300 --- /dev/null +++ b/executor/executable/kubectltask_test.go @@ -0,0 +1,80 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2018-2025 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package executable + +import ( + "testing" + "time" + + "github.com/AliceO2Group/Control/common" + "github.com/AliceO2Group/Control/executor/executorcmd" + mesos "github.com/mesos/mesos-go/api/v1/lib" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" +) + +var _ = Describe("kubectl task test", func() { + task := KubectlTask{} + task.Tci = &common.TaskCommandInfo{} + task.Tci.Arguments = []string{"exampletask.yaml"} + task.configYaml = "exampletask.yaml" + task.ti = &mesos.TaskInfo{Name: "exampletask"} + When("starting and stoping the task", func() { + It("should start and stop accordingly", func() { + err := task.Launch() + Expect(err).NotTo(HaveOccurred()) + + // just so we can see monitoring tools show something + time.Sleep(2 * time.Second) + + err = task.Kill() + Expect(err).NotTo(HaveOccurred()) + }) + }) + + When("transitioning to running", func() { + It("should transition", func() { + task.configYaml = "exampletask.yaml" + transitionMsg := &executorcmd.ExecutorCommand_Transition{} + transitionMsg.Destination = "running" + result := task.Transition(transitionMsg) + Expect(result.ErrorString).To(BeEmpty()) + }) + }) + + // this test expects there is a task with a status on cluster. + When("geting current status", func() { + It("should get proper status", func() { + status, err := task.getTaskStatus() + Expect(err).NotTo(HaveOccurred()) + Expect(status).To(Equal("standby")) + }) + }) +}) + +func TestKubectlTask(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "KubectlTask suite") +} diff --git a/executor/executable/task.go b/executor/executable/task.go index e23b56394..7da04e9a1 100644 --- a/executor/executable/task.go +++ b/executor/executable/task.go @@ -58,9 +58,11 @@ const ( var log = logger.New(logrus.StandardLogger(), "executor") -type SendStatusFunc func(envId uid.ID, state mesos.TaskState, message string) -type SendDeviceEventFunc func(envId uid.ID, event event.DeviceEvent) -type SendMessageFunc func(message []byte) +type ( + SendStatusFunc func(envId uid.ID, state mesos.TaskState, message string) + SendDeviceEventFunc func(envId uid.ID, event event.DeviceEvent) + SendMessageFunc func(message []byte) +) type Task interface { Launch() error @@ -177,6 +179,21 @@ func NewTask(taskInfo mesos.TaskInfo, sendStatusFunc SendStatusFunc, sendDeviceE }, rpc: nil, } + case controlmode.KUBECTL_DIRECT: + fallthrough + case controlmode.KUBECTL_FAIRMQ: + newTask = &KubectlTask{ + taskBase: taskBase{ + ti: &taskInfo, + Tci: &commandInfo, + sendStatus: sendStatusFunc, + sendDeviceEvent: sendDeviceEventFunc, + sendMessage: sendMessageFunc, + knownEnvironmentId: envId, + knownDetector: detector, + }, + rpc: nil, + } } return newTask From af61c52cd6226c9c421c30867358463ce6d1e07f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 19 Mar 2026 13:44:30 +0100 Subject: [PATCH 2280/2352] [OCTRL-1088] first environment controller --- control-operator/Dockerfile | 7 +- control-operator/Makefile | 73 +- control-operator/PROJECT | 17 + .../api/v1alpha1/environment_types.go | 122 + control-operator/api/v1alpha1/task_types.go | 3 +- .../api/v1alpha1/tasktemplate_types.go | 87 + .../api/v1alpha1/zz_generated.deepcopy.go | 299 ++ .../cmd/environment-manager/main.go | 107 + control-operator/cmd/main.go | 11 +- control-operator/cmd/task-manager/main.go | 108 + .../config/base/kustomization.yaml | 7 + control-operator/config/base/namespace.yaml | 12 + .../bases/aliecs.alice.cern_environments.yaml | 4119 +++++++++++++++++ .../crd/bases/aliecs.alice.cern_tasks.yaml | 2 + .../aliecs.alice.cern_tasktemplates.yaml | 3917 ++++++++++++++++ .../config/crd/kustomization.yaml | 2 + .../default/environment_auth_proxy_patch.yaml | 39 + .../config/default/kustomization.yaml | 6 +- .../default/manager_auth_proxy_patch.yaml | 2 +- .../config/environment/kustomization.yaml | 14 + .../environment-manager.yaml | 61 + .../environment-manager/kustomization.yaml | 10 + .../config/manager/kustomization.yaml | 8 +- control-operator/config/manager/manager.yaml | 110 +- .../manager/task-manager/kustomization.yaml | 10 + .../manager/task-manager/task-manager.yaml | 61 + .../config/rbac/environment_admin_role.yaml | 27 + .../config/rbac/environment_editor_role.yaml | 33 + .../config/rbac/environment_viewer_role.yaml | 29 + .../config/rbac/kustomization.yaml | 11 + control-operator/config/rbac/role.yaml | 31 +- .../config/rbac/tasktemplate_admin_role.yaml | 27 + .../config/rbac/tasktemplate_editor_role.yaml | 33 + .../config/rbac/tasktemplate_viewer_role.yaml | 29 + .../samples/aliecs_v1alpha1_environment.yaml | 9 + .../samples/aliecs_v1alpha1_tasktemplate.yaml | 9 + .../config/samples/kustomization.yaml | 2 + .../config/task/kustomization.yaml | 14 + .../ecs-manifests/environment/test_env.yaml | 189 + .../stfbuilder-senderoutput.yaml | 2 +- .../kubernetes-manifests/stfsender.yaml | 2 +- .../task-templates/readout-tasktemplate.yaml | 56 + .../stfbuilder-senderoutput-tasktemplate.yaml | 70 + .../stfsender-tasktemplate.yaml | 66 + control-operator/go.mod | 11 +- control-operator/go.sum | 20 +- .../controller/environment_controller.go | 233 + .../controller/environment_controller_test.go | 98 + .../internal/controller/fairmq_transition.go | 2 +- .../internal/controller/grpc_client.go | 4 +- .../internal/controller/suite_test.go | 2 +- .../internal/controller/task_controller.go | 6 +- 52 files changed, 10162 insertions(+), 67 deletions(-) create mode 100644 control-operator/api/v1alpha1/environment_types.go create mode 100644 control-operator/api/v1alpha1/tasktemplate_types.go create mode 100644 control-operator/cmd/environment-manager/main.go create mode 100644 control-operator/cmd/task-manager/main.go create mode 100644 control-operator/config/base/kustomization.yaml create mode 100644 control-operator/config/base/namespace.yaml create mode 100644 control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml create mode 100644 control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml create mode 100644 control-operator/config/default/environment_auth_proxy_patch.yaml create mode 100644 control-operator/config/environment/kustomization.yaml create mode 100644 control-operator/config/manager/environment-manager/environment-manager.yaml create mode 100644 control-operator/config/manager/environment-manager/kustomization.yaml create mode 100644 control-operator/config/manager/task-manager/kustomization.yaml create mode 100644 control-operator/config/manager/task-manager/task-manager.yaml create mode 100644 control-operator/config/rbac/environment_admin_role.yaml create mode 100644 control-operator/config/rbac/environment_editor_role.yaml create mode 100644 control-operator/config/rbac/environment_viewer_role.yaml create mode 100644 control-operator/config/rbac/tasktemplate_admin_role.yaml create mode 100644 control-operator/config/rbac/tasktemplate_editor_role.yaml create mode 100644 control-operator/config/rbac/tasktemplate_viewer_role.yaml create mode 100644 control-operator/config/samples/aliecs_v1alpha1_environment.yaml create mode 100644 control-operator/config/samples/aliecs_v1alpha1_tasktemplate.yaml create mode 100644 control-operator/config/task/kustomization.yaml create mode 100644 control-operator/ecs-manifests/environment/test_env.yaml create mode 100644 control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml create mode 100644 control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml create mode 100644 control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml create mode 100644 control-operator/internal/controller/environment_controller.go create mode 100644 control-operator/internal/controller/environment_controller_test.go diff --git a/control-operator/Dockerfile b/control-operator/Dockerfile index ddd858167..42abd3473 100644 --- a/control-operator/Dockerfile +++ b/control-operator/Dockerfile @@ -2,27 +2,26 @@ FROM golang:1.25 as builder ARG TARGETOS ARG TARGETARCH +ARG MANAGER=task-manager WORKDIR /workspace # Copy the Go Modules manifests COPY go.mod go.mod COPY go.sum go.sum -RUN sed -i '\,replace github.com/AliceO2Group/Control,d' go.mod # cache deps before building and copying source so that we don't need to re-download as much # and so that source changes don't invalidate our downloaded layer RUN go mod download # Copy the go source -COPY cmd/main.go cmd/main.go +COPY cmd/ cmd/ COPY api/ api/ COPY internal/controller/ internal/controller/ - # Build # the GOARCH has not a default value to allow the binary be built according to the host where the command # was called. For example, if we call make docker-build in a local env which has the Apple Silicon M1 SO # the docker BUILDPLATFORM arg will be linux/arm64 when for Apple x86 it will be linux/amd64. Therefore, # by leaving it empty we can ensure that the container and binary shipped on it will have the same platform. -RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager cmd/main.go +RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -a -o manager ./cmd/${MANAGER}/ # Use distroless as minimal base image to package the manager binary # Refer to https://github.com/GoogleContainerTools/distroless for more details diff --git a/control-operator/Makefile b/control-operator/Makefile index d01cfcb64..31f0668ab 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -33,7 +33,7 @@ IMAGE_TAG_BASE ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs # BUNDLE_IMG defines the image:tag used for the bundle. # You can use it as an arg. (E.g make bundle-build BUNDLE_IMG=/:) -BUNDLE_IMG ?= $(IMAGE_TAG_BASE)-bundle:v$(VERSION) +BUNDLE_IMG ?= $(IMAGE_TAG_BASE)/bundle:v$(VERSION) # BUNDLE_GEN_FLAGS are the flags passed to the operator-sdk generate bundle command BUNDLE_GEN_FLAGS ?= -q --overwrite --version $(VERSION) $(BUNDLE_METADATA_OPTS) @@ -51,7 +51,8 @@ endif OPERATOR_SDK_VERSION ?= unknown # Image URL to use all building/pushing image targets -IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager:latest +TASK_IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager:latest +ENVIRONMENT_IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager:latest # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. ENVTEST_K8S_VERSION = 1.27.1 @@ -97,11 +98,11 @@ help: ## Display this help. .PHONY: manifests manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. - # Note that the option maxDescLen=0 was added in the default scaffold in order to sort out the issue - # Too long: must have at most 262144 bytes. By using kubectl apply to create / update resources an annotation - # is created by K8s API to store the latest version of the resource ( kubectl.kubernetes.io/last-applied-configuration). - # However, it has a size limit and if the CRD is too big with so many long descriptions as this one it will cause the failure. - $(CONTROLLER_GEN) rbac:roleName=manager-role crd:maxDescLen=0 webhook paths="./..." output:crd:artifacts:config=config/crd/bases + # Note that the option maxDescLen=0 was added in the default scaffold in order to sort out the issue + # Too long: must have at most 262144 bytes. By using kubectl apply to create / update resources an annotation + # is created by K8s API to store the latest version of the resource ( kubectl.kubernetes.io/last-applied-configuration). + # However, it has a size limit and if the CRD is too big with so many long descriptions as this one it will cause the failure. + $(CONTROLLER_GEN) rbac:roleName=manager-role crd:maxDescLen=0 webhook paths="./..." output:crd:artifacts:config=config/crd/bases # .PHONY: manifests # manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. @@ -137,23 +138,42 @@ clean-proto: ## Remove generated protobuf and gRPC Go files. ##@ Build .PHONY: build -build: manifests generate fmt vet ## Build manager binary. - go build -o bin/manager cmd/main.go +build: manifests generate fmt vet ## Build manager binaries. + go build -o bin/task-manager ./cmd/task-manager/ + go build -o bin/environment-manager ./cmd/environment-manager/ -.PHONY: run -run: manifests generate fmt vet ## Run a controller from your host. - go run ./cmd/main.go +.PHONY: run-task +run-task: manifests generate fmt vet ## Run the task controller from your host. + go run ./cmd/task-manager/ + +.PHONY: run-environment +run-environment: manifests generate fmt vet ## Run the environment controller from your host. + go run ./cmd/environment-manager/ # If you wish built the manager image targeting other platforms you can use the --platform flag. # (i.e. docker build --platform linux/arm64 ). However, you must enable docker buildKit for it. # More info: https://docs.docker.com/develop/develop-images/build_enhancements/ .PHONY: docker-build -docker-build: test ## Build docker image with the manager. - $(CONTAINER_TOOL) build -t ${IMG} . +docker-build: docker-build-task docker-build-environment ## Build all docker images. + +.PHONY: docker-build-task +docker-build-task: test ## Build docker image for the task manager. + $(CONTAINER_TOOL) build --build-arg MANAGER=task-manager -t ${TASK_IMG} . + +.PHONY: docker-build-environment +docker-build-environment: test ## Build docker image for the environment manager. + $(CONTAINER_TOOL) build --build-arg MANAGER=environment-manager -t ${ENVIRONMENT_IMG} . .PHONY: docker-push -docker-push: ## Push docker image with the manager. - $(CONTAINER_TOOL) push ${IMG} +docker-push: docker-push-task docker-push-environment ## Push all docker images. + +.PHONY: docker-push-task +docker-push-task: ## Push docker image for the task manager. + $(CONTAINER_TOOL) push ${TASK_IMG} + +.PHONY: docker-push-environment +docker-push-environment: ## Push docker image for the environment manager. + $(CONTAINER_TOOL) push ${ENVIRONMENT_IMG} # PLATFORMS defines the target platforms for the manager image be build to provide support to multiple # architectures. (i.e. make docker-buildx IMG=myregistry/mypoperator:0.0.1). To use this option you need to: @@ -187,12 +207,20 @@ uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified $(KUSTOMIZE) build config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - .PHONY: deploy -deploy: manifests kustomize ## Deploy controller to the K8s cluster specified in ~/.kube/config. - cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG} - $(KUSTOMIZE) build config/default | $(KUBECTL) apply -f - --server-side +deploy: deploy-task deploy-environment ## Deploy both controllers to the K8s cluster specified in ~/.kube/config. + +.PHONY: deploy-task +deploy-task: manifests kustomize ## Deploy task controller to the K8s cluster specified in ~/.kube/config. + cd config/task && $(KUSTOMIZE) edit set image task-manager=${TASK_IMG} + $(KUSTOMIZE) build config/task | $(KUBECTL) apply -f - --server-side + +.PHONY: deploy-environment +deploy-environment: manifests kustomize ## Deploy environment controller to the K8s cluster specified in ~/.kube/config. + cd config/environment && $(KUSTOMIZE) edit set image environment-manager=${ENVIRONMENT_IMG} + $(KUSTOMIZE) build config/environment | $(KUBECTL) apply -f - --server-side .PHONY: undeploy -undeploy: ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. +undeploy: ## Undeploy both controllers from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. $(KUSTOMIZE) build config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - ##@ Build Dependencies @@ -252,7 +280,8 @@ endif .PHONY: bundle bundle: manifests kustomize operator-sdk ## Generate bundle manifests and metadata, then validate generated files. $(OPERATOR_SDK) generate kustomize manifests -q - cd config/manager && $(KUSTOMIZE) edit set image controller=$(IMG) + cd config/manager && $(KUSTOMIZE) edit set image task-manager=$(TASK_IMG) + cd config/manager && $(KUSTOMIZE) edit set image environment-manager=$(ENVIRONMENT_IMG) $(KUSTOMIZE) build config/manifests | $(OPERATOR_SDK) generate bundle $(BUNDLE_GEN_FLAGS) $(OPERATOR_SDK) bundle validate ./bundle @@ -286,7 +315,7 @@ endif BUNDLE_IMGS ?= $(BUNDLE_IMG) # The image tag given to the resulting catalog image (e.g. make catalog-build CATALOG_IMG=example.com/operator-catalog:v0.2.0). -CATALOG_IMG ?= $(IMAGE_TAG_BASE)-catalog:v$(VERSION) +CATALOG_IMG ?= $(IMAGE_TAG_BASE)/catalog:v$(VERSION) # Set CATALOG_BASE_IMG to an existing catalog image tag to add $BUNDLE_IMGS to that image. ifneq ($(origin CATALOG_BASE_IMG), undefined) diff --git a/control-operator/PROJECT b/control-operator/PROJECT index 3d2493cb6..d89e1dce1 100644 --- a/control-operator/PROJECT +++ b/control-operator/PROJECT @@ -20,4 +20,21 @@ resources: kind: Task path: github.com/AliceO2Group/Control/operator/api/v1alpha1 version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + controller: true + domain: alice.cern + group: aliecs + kind: Environment + path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + version: v1alpha1 +- api: + crdVersion: v1 + namespaced: true + domain: alice.cern + group: aliecs + kind: TaskTemplate + path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + version: v1alpha1 version: "3" diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go new file mode 100644 index 000000000..e872bbdd8 --- /dev/null +++ b/control-operator/api/v1alpha1/environment_types.go @@ -0,0 +1,122 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// EnvironmentSpec defines the desired state of Environment +type EnvironmentSpec struct { + // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster + // Important: Run "make" to regenerate code after modifying this file + // The following markers will use OpenAPI v3 schema to validate the value + // More info: https://book.kubebuilder.io/reference/markers/crd-validation.html + + Tasks map[string][]TaskTemplate `json:"tasks"` + // +kubebuilder:validation:Enum=standby;deployed;configured;running + State string `json:"state"` +} + +// EnvironmentStatus defines the observed state of Environment. +type EnvironmentStatus struct { + // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster + // Important: Run "make" to regenerate code after modifying this file + + // For Kubernetes API conventions, see: + // https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#typical-status-properties + // conditions represent the current state of the Environment resource. + // Each condition has a unique type and reflects the status of a specific aspect of the resource. + // + // Standard condition types include: + // - "Available": the resource is fully functional + // - "Progressing": the resource is being created or updated + // - "Degraded": the resource failed to reach or maintain its desired state + // + // The status of each condition is one of True, False, or Unknown. + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` + + Tasks map[string]map[string]string `json:"tasks"` + State string `json:"state,omitempty"` +} + +type TaskReference struct { + Name string `json:"name"` + Env []v1.EnvVar `json:"env"` + ArgsCLI []string `json:"argsCLI"` + ArgsTransition map[string]string `json:"argsTransition"` +} + +type TemplateSpecification struct { + Tasks map[string][]TaskReference `json:"tasks"` +} + +// +kubebuilder:object:root=true +// +kubebuilder:subresource:status +// +kubebuilder:printcolumn:name="Desired",type="string",JSONPath=".spec.state" +// +kubebuilder:printcolumn:name="Actual",type="string",JSONPath=".status.state" +// +kubebuilder:printcolumn:name="Age",type="date",JSONPath=".metadata.creationTimestamp" + +// Environment is the Schema for the environments API +type Environment struct { + metav1.TypeMeta `json:",inline"` + + // metadata is a standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitzero"` + + // taskTemplates defines templates stored in cluster to be used + // for task creation, meant for more common tasks + // +optional + TaskTemplates TemplateSpecification `json:"taskTemplates"` + + // spec defines the desired state of Environment + // +required + Spec EnvironmentSpec `json:"spec"` + + // status defines the observed state of Environment + // +optional + Status EnvironmentStatus `json:"status,omitzero"` +} + +// +kubebuilder:object:root=true + +// EnvironmentList contains a list of Environment +type EnvironmentList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitzero"` + Items []Environment `json:"items"` +} + +func init() { + SchemeBuilder.Register(&Environment{}, &EnvironmentList{}) +} diff --git a/control-operator/api/v1alpha1/task_types.go b/control-operator/api/v1alpha1/task_types.go index 00bca1db5..ace24d3e2 100644 --- a/control-operator/api/v1alpha1/task_types.go +++ b/control-operator/api/v1alpha1/task_types.go @@ -84,7 +84,8 @@ type TaskSpec struct { Properties map[string]string `json:"properties,omitempty"` Arguments map[string]string `json:"arguments,omitempty"` // +kubebuilder:validation:Enum=standby;deployed;configured;running - State string `json:"state,omitempty"` // this is the *requested* state, there are other states the task may end up in but cannot be requested + State string `json:"state,omitempty"` // this is the *requested* state, there are other states the task may end up in but cannot be requested + NodeName string `json:"nodeName,omitempty"` } // TaskStatus defines the observed state of Task diff --git a/control-operator/api/v1alpha1/tasktemplate_types.go b/control-operator/api/v1alpha1/tasktemplate_types.go new file mode 100644 index 000000000..97c75732e --- /dev/null +++ b/control-operator/api/v1alpha1/tasktemplate_types.go @@ -0,0 +1,87 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package v1alpha1 + +import ( + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +// EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! +// NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. + +// TaskTemplateSpec defines the static part of a task that is reused across environments. +// Dynamic parts (node, arguments) are provided by the Environment at instantiation time. +type TaskTemplateSpec struct { + // Pod defines the pod spec for the task container, excluding node assignment. + Pod v1.PodSpec `json:"pod,omitempty"` + + // Control defines the OCC gRPC control mode and port. + Control TaskSpecControl `json:"control,omitempty"` + + // Bind defines the inbound FairMQ channels exposed by this task. + // +optional + Bind []TaskSpecChannelInbound `json:"bind,omitempty"` + + // Connect defines the outbound FairMQ channels this task connects to. + // +optional + Connect []TaskSpecChannelOutbound `json:"connect,omitempty"` + + // Properties defines static key-value properties passed to the task. + // +optional + Properties map[string]string `json:"properties,omitempty"` + + // Names of the expected Environment variables to be passed to Pod + // +optional + EnvVars []string `json:"envVars,omitempty"` +} + +// +kubebuilder:object:root=true + +// TaskTemplate is the Schema for the tasktemplates API +type TaskTemplate struct { + metav1.TypeMeta `json:",inline"` + + // metadata is a standard object metadata + // +optional + metav1.ObjectMeta `json:"metadata,omitzero"` + + // spec defines the static task definition + // +required + Spec TaskTemplateSpec `json:"spec"` +} + +// +kubebuilder:object:root=true + +// TaskTemplateList contains a list of TaskTemplate +type TaskTemplateList struct { + metav1.TypeMeta `json:",inline"` + metav1.ListMeta `json:"metadata,omitzero"` + Items []TaskTemplate `json:"items"` +} + +func init() { + SchemeBuilder.Register(&TaskTemplate{}, &TaskTemplateList{}) +} diff --git a/control-operator/api/v1alpha1/zz_generated.deepcopy.go b/control-operator/api/v1alpha1/zz_generated.deepcopy.go index 690b50a70..f7b37c209 100644 --- a/control-operator/api/v1alpha1/zz_generated.deepcopy.go +++ b/control-operator/api/v1alpha1/zz_generated.deepcopy.go @@ -29,9 +29,144 @@ package v1alpha1 import ( + corev1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1" 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 *Environment) DeepCopyInto(out *Environment) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.TaskTemplates.DeepCopyInto(&out.TaskTemplates) + in.Spec.DeepCopyInto(&out.Spec) + in.Status.DeepCopyInto(&out.Status) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new Environment. +func (in *Environment) DeepCopy() *Environment { + if in == nil { + return nil + } + out := new(Environment) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *Environment) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvironmentList) DeepCopyInto(out *EnvironmentList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]Environment, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvironmentList. +func (in *EnvironmentList) DeepCopy() *EnvironmentList { + if in == nil { + return nil + } + out := new(EnvironmentList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *EnvironmentList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvironmentSpec) DeepCopyInto(out *EnvironmentSpec) { + *out = *in + if in.Tasks != nil { + in, out := &in.Tasks, &out.Tasks + *out = make(map[string][]TaskTemplate, len(*in)) + for key, val := range *in { + var outVal []TaskTemplate + if val == nil { + (*out)[key] = nil + } else { + inVal := (*in)[key] + in, out := &inVal, &outVal + *out = make([]TaskTemplate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + (*out)[key] = outVal + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvironmentSpec. +func (in *EnvironmentSpec) DeepCopy() *EnvironmentSpec { + if in == nil { + return nil + } + out := new(EnvironmentSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *EnvironmentStatus) DeepCopyInto(out *EnvironmentStatus) { + *out = *in + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.Tasks != nil { + in, out := &in.Tasks, &out.Tasks + *out = make(map[string]map[string]string, len(*in)) + for key, val := range *in { + var outVal map[string]string + if val == nil { + (*out)[key] = nil + } else { + inVal := (*in)[key] + in, out := &inVal, &outVal + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + (*out)[key] = outVal + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new EnvironmentStatus. +func (in *EnvironmentStatus) DeepCopy() *EnvironmentStatus { + if in == nil { + return nil + } + out := new(EnvironmentStatus) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *Task) DeepCopyInto(out *Task) { *out = *in @@ -91,6 +226,40 @@ func (in *TaskList) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskReference) DeepCopyInto(out *TaskReference) { + *out = *in + if in.Env != nil { + in, out := &in.Env, &out.Env + *out = make([]corev1.EnvVar, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + if in.ArgsCLI != nil { + in, out := &in.ArgsCLI, &out.ArgsCLI + *out = make([]string, len(*in)) + copy(*out, *in) + } + if in.ArgsTransition != nil { + in, out := &in.ArgsTransition, &out.ArgsTransition + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskReference. +func (in *TaskReference) DeepCopy() *TaskReference { + if in == nil { + return nil + } + out := new(TaskReference) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TaskSpec) DeepCopyInto(out *TaskSpec) { *out = *in @@ -192,3 +361,133 @@ func (in *TaskStatus) DeepCopy() *TaskStatus { in.DeepCopyInto(out) return out } + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskTemplate) DeepCopyInto(out *TaskTemplate) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ObjectMeta.DeepCopyInto(&out.ObjectMeta) + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskTemplate. +func (in *TaskTemplate) DeepCopy() *TaskTemplate { + if in == nil { + return nil + } + out := new(TaskTemplate) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TaskTemplate) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskTemplateList) DeepCopyInto(out *TaskTemplateList) { + *out = *in + out.TypeMeta = in.TypeMeta + in.ListMeta.DeepCopyInto(&out.ListMeta) + if in.Items != nil { + in, out := &in.Items, &out.Items + *out = make([]TaskTemplate, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskTemplateList. +func (in *TaskTemplateList) DeepCopy() *TaskTemplateList { + if in == nil { + return nil + } + out := new(TaskTemplateList) + in.DeepCopyInto(out) + return out +} + +// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. +func (in *TaskTemplateList) DeepCopyObject() runtime.Object { + if c := in.DeepCopy(); c != nil { + return c + } + return nil +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskTemplateSpec) DeepCopyInto(out *TaskTemplateSpec) { + *out = *in + in.Pod.DeepCopyInto(&out.Pod) + out.Control = in.Control + if in.Bind != nil { + in, out := &in.Bind, &out.Bind + *out = make([]TaskSpecChannelInbound, len(*in)) + copy(*out, *in) + } + if in.Connect != nil { + in, out := &in.Connect, &out.Connect + *out = make([]TaskSpecChannelOutbound, len(*in)) + copy(*out, *in) + } + if in.Properties != nil { + in, out := &in.Properties, &out.Properties + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } + if in.EnvVars != nil { + in, out := &in.EnvVars, &out.EnvVars + *out = make([]string, len(*in)) + copy(*out, *in) + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskTemplateSpec. +func (in *TaskTemplateSpec) DeepCopy() *TaskTemplateSpec { + if in == nil { + return nil + } + out := new(TaskTemplateSpec) + in.DeepCopyInto(out) + return out +} + +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TemplateSpecification) DeepCopyInto(out *TemplateSpecification) { + *out = *in + if in.Tasks != nil { + in, out := &in.Tasks, &out.Tasks + *out = make(map[string][]TaskReference, len(*in)) + for key, val := range *in { + var outVal []TaskReference + if val == nil { + (*out)[key] = nil + } else { + inVal := (*in)[key] + in, out := &inVal, &outVal + *out = make([]TaskReference, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } + (*out)[key] = outVal + } + } +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TemplateSpecification. +func (in *TemplateSpecification) DeepCopy() *TemplateSpecification { + if in == nil { + return nil + } + out := new(TemplateSpecification) + in.DeepCopyInto(out) + return out +} diff --git a/control-operator/cmd/environment-manager/main.go b/control-operator/cmd/environment-manager/main.go new file mode 100644 index 000000000..a117ec878 --- /dev/null +++ b/control-operator/cmd/environment-manager/main.go @@ -0,0 +1,107 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +import ( + "flag" + "os" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/healthz" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/metrics/server" + "sigs.k8s.io/controller-runtime/pkg/webhook" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + "github.com/AliceO2Group/Control/operator/internal/controller" +) + +var ( + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(aliecsv1alpha1.AddToScheme(scheme)) +} + +func main() { + var metricsAddr string + var enableLeaderElection bool + var probeAddr string + flag.StringVar(&metricsAddr, "metrics-bind-address", ":9080", "The address the metric endpoint binds to.") + flag.StringVar(&probeAddr, "health-probe-bind-address", ":9081", "The address the probe endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + opts := zap.Options{ + Development: true, + } + opts.BindFlags(flag.CommandLine) + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Metrics: server.Options{BindAddress: metricsAddr}, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "03b91661-environment.alice.cern", + WebhookServer: webhook.NewServer(webhook.Options{Port: 9443}), + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (&controller.EnvironmentReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Environment") + os.Exit(1) + } + + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + os.Exit(1) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + os.Exit(1) + } + + setupLog.Info("starting environment manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } +} diff --git a/control-operator/cmd/main.go b/control-operator/cmd/main.go index 5773164eb..22c18da52 100644 --- a/control-operator/cmd/main.go +++ b/control-operator/cmd/main.go @@ -32,8 +32,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/webhook" - aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" - "github.com/AliceO2Group/ControlOperator/internal/controller" + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + "github.com/AliceO2Group/Control/operator/internal/controller" //+kubebuilder:scaffold:imports ) @@ -98,6 +98,13 @@ func main() { setupLog.Error(err, "unable to create controller", "controller", "Task") os.Exit(1) } + if err := (&controller.EnvironmentReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "Failed to create controller", "controller", "Environment") + os.Exit(1) + } //+kubebuilder:scaffold:builder if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { diff --git a/control-operator/cmd/task-manager/main.go b/control-operator/cmd/task-manager/main.go new file mode 100644 index 000000000..5810d7bd7 --- /dev/null +++ b/control-operator/cmd/task-manager/main.go @@ -0,0 +1,108 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package main + +import ( + "flag" + "os" + + "k8s.io/apimachinery/pkg/runtime" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" + clientgoscheme "k8s.io/client-go/kubernetes/scheme" + _ "k8s.io/client-go/plugin/pkg/client/auth" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/healthz" + "sigs.k8s.io/controller-runtime/pkg/log/zap" + "sigs.k8s.io/controller-runtime/pkg/metrics/server" + "sigs.k8s.io/controller-runtime/pkg/webhook" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + "github.com/AliceO2Group/Control/operator/internal/controller" +) + +var ( + scheme = runtime.NewScheme() + setupLog = ctrl.Log.WithName("setup") +) + +func init() { + utilruntime.Must(clientgoscheme.AddToScheme(scheme)) + utilruntime.Must(aliecsv1alpha1.AddToScheme(scheme)) +} + +func main() { + var metricsAddr string + var enableLeaderElection bool + var probeAddr string + flag.StringVar(&metricsAddr, "metrics-bind-address", ":9082", "The address the metric endpoint binds to.") + flag.StringVar(&probeAddr, "health-probe-bind-address", ":9083", "The address the probe endpoint binds to.") + flag.BoolVar(&enableLeaderElection, "leader-elect", false, + "Enable leader election for controller manager. "+ + "Enabling this will ensure there is only one active controller manager.") + opts := zap.Options{ + Development: true, + } + opts.BindFlags(flag.CommandLine) + flag.Parse() + + ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) + + mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ + Scheme: scheme, + Metrics: server.Options{BindAddress: metricsAddr}, + HealthProbeBindAddress: probeAddr, + LeaderElection: enableLeaderElection, + LeaderElectionID: "03b91661-task.alice.cern", + WebhookServer: webhook.NewServer(webhook.Options{Port: 9443}), + }) + if err != nil { + setupLog.Error(err, "unable to start manager") + os.Exit(1) + } + + if err = (&controller.TaskReconciler{ + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor("task-controller"), + }).SetupWithManager(mgr); err != nil { + setupLog.Error(err, "unable to create controller", "controller", "Task") + os.Exit(1) + } + + if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up health check") + os.Exit(1) + } + if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { + setupLog.Error(err, "unable to set up ready check") + os.Exit(1) + } + + setupLog.Info("starting task manager") + if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { + setupLog.Error(err, "problem running manager") + os.Exit(1) + } +} diff --git a/control-operator/config/base/kustomization.yaml b/control-operator/config/base/kustomization.yaml new file mode 100644 index 000000000..863ffa069 --- /dev/null +++ b/control-operator/config/base/kustomization.yaml @@ -0,0 +1,7 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- namespace.yaml +- ../crd +- ../rbac diff --git a/control-operator/config/base/namespace.yaml b/control-operator/config/base/namespace.yaml new file mode 100644 index 000000000..bf2900319 --- /dev/null +++ b/control-operator/config/base/namespace.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Namespace +metadata: + labels: + control-plane: controller-manager + app.kubernetes.io/name: namespace + app.kubernetes.io/instance: system + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize + name: system diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml new file mode 100644 index 000000000..30bb276c1 --- /dev/null +++ b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml @@ -0,0 +1,4119 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.5 + name: environments.aliecs.alice.cern +spec: + group: aliecs.alice.cern + names: + kind: Environment + listKind: EnvironmentList + plural: environments + singular: environment + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.state + name: Desired + type: string + - jsonPath: .status.state + name: Actual + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + state: + enum: + - standby + - deployed + - configured + - running + type: string + tasks: + additionalProperties: + items: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + bind: + items: + properties: + addressing: + default: tcp + enum: + - tcp + - ipc + type: string + global: + type: string + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - global + - name + - target + - type + type: object + type: array + connect: + items: + properties: + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - name + - target + - type + type: object + type: array + control: + properties: + mode: + enum: + - direct + - fairmq + - basic + - hook + type: string + port: + type: integer + type: object + envVars: + items: + type: string + type: array + pod: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-type: atomic + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + x-kubernetes-list-type: atomic + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + searches: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + x-kubernetes-list-type: atomic + ip: + type: string + required: + - ip + type: object + type: array + x-kubernetes-list-map-keys: + - ip + x-kubernetes-list-type: map + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + hostnameOverride: + type: string + imagePullSecrets: + items: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + initContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + x-kubernetes-list-type: atomic + resourceClaims: + items: + properties: + name: + type: string + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + securityContext: + properties: + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxChangePolicy: + type: string + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + supplementalGroupsPolicy: + type: string + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + items: + properties: + awsElasticBlockStore: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + azureDisk: + properties: + cachingMode: + type: string + diskName: + type: string + diskURI: + type: string + fsType: + default: ext4 + type: string + kind: + type: string + readOnly: + default: false + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + properties: + readOnly: + type: boolean + secretName: + type: string + shareName: + type: string + required: + - secretName + - shareName + type: object + cephfs: + properties: + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + path: + type: string + readOnly: + type: boolean + secretFile: + type: string + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + type: string + required: + - monitors + type: object + cinder: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + type: string + required: + - volumeID + type: object + configMap: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + properties: + driver: + type: string + fsType: + type: string + nodePublishSecretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + type: boolean + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + type: object + downwardAPI: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + emptyDir: + properties: + medium: + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + properties: + volumeClaimTemplate: + properties: + metadata: + type: object + spec: + properties: + accessModes: + items: + type: string + type: array + x-kubernetes-list-type: atomic + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + type: string + volumeAttributesClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + required: + - spec + type: object + type: object + fc: + properties: + fsType: + type: string + lun: + format: int32 + type: integer + readOnly: + type: boolean + targetWWNs: + items: + type: string + type: array + x-kubernetes-list-type: atomic + wwids: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + flexVolume: + properties: + driver: + type: string + fsType: + type: string + options: + additionalProperties: + type: string + type: object + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + properties: + datasetName: + type: string + datasetUUID: + type: string + type: object + gcePersistentDisk: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + pdName: + type: string + readOnly: + type: boolean + required: + - pdName + type: object + gitRepo: + properties: + directory: + type: string + repository: + type: string + revision: + type: string + required: + - repository + type: object + glusterfs: + properties: + endpoints: + type: string + path: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + type: object + hostPath: + properties: + path: + type: string + type: + type: string + required: + - path + type: object + image: + properties: + pullPolicy: + type: string + reference: + type: string + type: object + iscsi: + properties: + chapAuthDiscovery: + type: boolean + chapAuthSession: + type: boolean + fsType: + type: string + initiatorName: + type: string + iqn: + type: string + iscsiInterface: + default: default + type: string + lun: + format: int32 + type: integer + portals: + items: + type: string + type: array + x-kubernetes-list-type: atomic + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + type: string + nfs: + properties: + path: + type: string + readOnly: + type: boolean + server: + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + properties: + fsType: + type: string + pdID: + type: string + required: + - pdID + type: object + portworxVolume: + properties: + fsType: + type: string + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + projected: + properties: + defaultMode: + format: int32 + type: integer + sources: + items: + properties: + clusterTrustBundle: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + optional: + type: boolean + path: + type: string + signerName: + type: string + required: + - path + type: object + configMap: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + properties: + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + userAnnotations: + additionalProperties: + type: string + type: object + required: + - keyType + - signerName + type: object + secret: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + properties: + audience: + type: string + expirationSeconds: + format: int64 + type: integer + path: + type: string + required: + - path + type: object + type: object + type: array + x-kubernetes-list-type: atomic + type: object + quobyte: + properties: + group: + type: string + readOnly: + type: boolean + registry: + type: string + tenant: + type: string + user: + type: string + volume: + type: string + required: + - registry + - volume + type: object + rbd: + properties: + fsType: + type: string + image: + type: string + keyring: + default: /etc/ceph/keyring + type: string + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + pool: + default: rbd + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + default: admin + type: string + required: + - image + - monitors + type: object + scaleIO: + properties: + fsType: + default: xfs + type: string + gateway: + type: string + protectionDomain: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + type: boolean + storageMode: + default: ThinProvisioned + type: string + storagePool: + type: string + system: + type: string + volumeName: + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + optional: + type: boolean + secretName: + type: string + type: object + storageos: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + type: string + volumeNamespace: + type: string + type: object + vsphereVolume: + properties: + fsType: + type: string + storagePolicyID: + type: string + storagePolicyName: + type: string + volumePath: + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + workloadRef: + properties: + name: + type: string + podGroup: + type: string + podGroupReplicaKey: + type: string + required: + - name + - podGroup + type: object + required: + - containers + type: object + properties: + additionalProperties: + type: string + type: object + type: object + required: + - spec + type: object + type: array + type: object + required: + - state + - tasks + type: object + status: + properties: + conditions: + items: + properties: + lastTransitionTime: + format: date-time + type: string + message: + maxLength: 32768 + type: string + observedGeneration: + format: int64 + minimum: 0 + type: integer + reason: + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + enum: + - "True" + - "False" + - Unknown + type: string + type: + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map + state: + type: string + tasks: + additionalProperties: + additionalProperties: + type: string + type: object + type: object + required: + - tasks + type: object + taskTemplates: + properties: + tasks: + additionalProperties: + items: + properties: + argsCLI: + items: + type: string + type: array + argsTransition: + additionalProperties: + type: string + type: object + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + name: + type: string + required: + - argsCLI + - argsTransition + - env + - name + type: object + type: array + type: object + required: + - tasks + type: object + required: + - spec + type: object + served: true + storage: true + subresources: + status: {} diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml index a7b823e63..6bef94e68 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml @@ -129,6 +129,8 @@ spec: port: type: integer type: object + nodeName: + type: string pod: properties: activeDeadlineSeconds: diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml new file mode 100644 index 000000000..20d22c3a3 --- /dev/null +++ b/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml @@ -0,0 +1,3917 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.16.5 + name: tasktemplates.aliecs.alice.cern +spec: + group: aliecs.alice.cern + names: + kind: TaskTemplate + listKind: TaskTemplateList + plural: tasktemplates + singular: tasktemplate + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + properties: + apiVersion: + type: string + kind: + type: string + metadata: + type: object + spec: + properties: + bind: + items: + properties: + addressing: + default: tcp + enum: + - tcp + - ipc + type: string + global: + type: string + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - global + - name + - target + - type + type: object + type: array + connect: + items: + properties: + name: + type: string + rateLogging: + type: string + rcvBufSize: + type: integer + sndBufSize: + type: integer + target: + type: string + transport: + default: default + enum: + - default + - zeromq + - nanomsg + - shmem + type: string + type: + enum: + - push + - pull + - pub + - sub + type: string + required: + - name + - target + - type + type: object + type: array + control: + properties: + mode: + enum: + - direct + - fairmq + - basic + - hook + type: string + port: + type: integer + type: object + envVars: + items: + type: string + type: array + pod: + properties: + activeDeadlineSeconds: + format: int64 + type: integer + affinity: + properties: + nodeAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + preference: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + weight: + format: int32 + type: integer + required: + - preference + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + properties: + nodeSelectorTerms: + items: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchFields: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-type: atomic + required: + - nodeSelectorTerms + type: object + x-kubernetes-map-type: atomic + type: object + podAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podAntiAffinity: + properties: + preferredDuringSchedulingIgnoredDuringExecution: + items: + properties: + podAffinityTerm: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + weight: + format: int32 + type: integer + required: + - podAffinityTerm + - weight + type: object + type: array + x-kubernetes-list-type: atomic + requiredDuringSchedulingIgnoredDuringExecution: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + mismatchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + namespaceSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + namespaces: + items: + type: string + type: array + x-kubernetes-list-type: atomic + topologyKey: + type: string + required: + - topologyKey + type: object + type: array + x-kubernetes-list-type: atomic + type: object + type: object + automountServiceAccountToken: + type: boolean + containers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + dnsConfig: + properties: + nameservers: + items: + type: string + type: array + x-kubernetes-list-type: atomic + options: + items: + properties: + name: + type: string + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + searches: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + dnsPolicy: + type: string + enableServiceLinks: + type: boolean + ephemeralContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + targetContainerName: + type: string + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + hostAliases: + items: + properties: + hostnames: + items: + type: string + type: array + x-kubernetes-list-type: atomic + ip: + type: string + required: + - ip + type: object + type: array + x-kubernetes-list-map-keys: + - ip + x-kubernetes-list-type: map + hostIPC: + type: boolean + hostNetwork: + type: boolean + hostPID: + type: boolean + hostUsers: + type: boolean + hostname: + type: string + hostnameOverride: + type: string + imagePullSecrets: + items: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + initContainers: + items: + properties: + args: + items: + type: string + type: array + x-kubernetes-list-type: atomic + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + env: + items: + properties: + name: + type: string + value: + type: string + valueFrom: + properties: + configMapKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + fileKeyRef: + properties: + key: + type: string + optional: + default: false + type: boolean + path: + type: string + volumeName: + type: string + required: + - key + - path + - volumeName + type: object + x-kubernetes-map-type: atomic + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + secretKeyRef: + properties: + key: + type: string + name: + default: "" + type: string + optional: + type: boolean + required: + - key + type: object + x-kubernetes-map-type: atomic + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + envFrom: + items: + properties: + configMapRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + prefix: + type: string + secretRef: + properties: + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + type: object + type: array + x-kubernetes-list-type: atomic + image: + type: string + imagePullPolicy: + type: string + lifecycle: + properties: + postStart: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + preStop: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + sleep: + properties: + seconds: + format: int64 + type: integer + required: + - seconds + type: object + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + type: object + stopSignal: + type: string + type: object + livenessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + name: + type: string + ports: + items: + properties: + containerPort: + format: int32 + type: integer + hostIP: + type: string + hostPort: + format: int32 + type: integer + name: + type: string + protocol: + default: TCP + type: string + required: + - containerPort + type: object + type: array + x-kubernetes-list-map-keys: + - containerPort + - protocol + x-kubernetes-list-type: map + readinessProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + resizePolicy: + items: + properties: + resourceName: + type: string + restartPolicy: + type: string + required: + - resourceName + - restartPolicy + type: object + type: array + x-kubernetes-list-type: atomic + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + restartPolicyRules: + items: + properties: + action: + type: string + exitCodes: + properties: + operator: + type: string + values: + items: + format: int32 + type: integer + type: array + x-kubernetes-list-type: set + required: + - operator + type: object + required: + - action + type: object + type: array + x-kubernetes-list-type: atomic + securityContext: + properties: + allowPrivilegeEscalation: + type: boolean + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + capabilities: + properties: + add: + items: + type: string + type: array + x-kubernetes-list-type: atomic + drop: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + privileged: + type: boolean + procMount: + type: string + readOnlyRootFilesystem: + type: boolean + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + startupProbe: + properties: + exec: + properties: + command: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + failureThreshold: + format: int32 + type: integer + grpc: + properties: + port: + format: int32 + type: integer + service: + default: "" + type: string + required: + - port + type: object + httpGet: + properties: + host: + type: string + httpHeaders: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + path: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + scheme: + type: string + required: + - port + type: object + initialDelaySeconds: + format: int32 + type: integer + periodSeconds: + format: int32 + type: integer + successThreshold: + format: int32 + type: integer + tcpSocket: + properties: + host: + type: string + port: + anyOf: + - type: integer + - type: string + x-kubernetes-int-or-string: true + required: + - port + type: object + terminationGracePeriodSeconds: + format: int64 + type: integer + timeoutSeconds: + format: int32 + type: integer + type: object + stdin: + type: boolean + stdinOnce: + type: boolean + terminationMessagePath: + type: string + terminationMessagePolicy: + type: string + tty: + type: boolean + volumeDevices: + items: + properties: + devicePath: + type: string + name: + type: string + required: + - devicePath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - devicePath + x-kubernetes-list-type: map + volumeMounts: + items: + properties: + mountPath: + type: string + mountPropagation: + type: string + name: + type: string + readOnly: + type: boolean + recursiveReadOnly: + type: string + subPath: + type: string + subPathExpr: + type: string + required: + - mountPath + - name + type: object + type: array + x-kubernetes-list-map-keys: + - mountPath + x-kubernetes-list-type: map + workingDir: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + nodeName: + type: string + nodeSelector: + additionalProperties: + type: string + type: object + x-kubernetes-map-type: atomic + os: + properties: + name: + type: string + required: + - name + type: object + overhead: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + preemptionPolicy: + type: string + priority: + format: int32 + type: integer + priorityClassName: + type: string + readinessGates: + items: + properties: + conditionType: + type: string + required: + - conditionType + type: object + type: array + x-kubernetes-list-type: atomic + resourceClaims: + items: + properties: + name: + type: string + resourceClaimName: + type: string + resourceClaimTemplateName: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + resources: + properties: + claims: + items: + properties: + name: + type: string + request: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + restartPolicy: + type: string + runtimeClassName: + type: string + schedulerName: + type: string + schedulingGates: + items: + properties: + name: + type: string + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + securityContext: + properties: + appArmorProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + fsGroup: + format: int64 + type: integer + fsGroupChangePolicy: + type: string + runAsGroup: + format: int64 + type: integer + runAsNonRoot: + type: boolean + runAsUser: + format: int64 + type: integer + seLinuxChangePolicy: + type: string + seLinuxOptions: + properties: + level: + type: string + role: + type: string + type: + type: string + user: + type: string + type: object + seccompProfile: + properties: + localhostProfile: + type: string + type: + type: string + required: + - type + type: object + supplementalGroups: + items: + format: int64 + type: integer + type: array + x-kubernetes-list-type: atomic + supplementalGroupsPolicy: + type: string + sysctls: + items: + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + x-kubernetes-list-type: atomic + windowsOptions: + properties: + gmsaCredentialSpec: + type: string + gmsaCredentialSpecName: + type: string + hostProcess: + type: boolean + runAsUserName: + type: string + type: object + type: object + serviceAccount: + type: string + serviceAccountName: + type: string + setHostnameAsFQDN: + type: boolean + shareProcessNamespace: + type: boolean + subdomain: + type: string + terminationGracePeriodSeconds: + format: int64 + type: integer + tolerations: + items: + properties: + effect: + type: string + key: + type: string + operator: + type: string + tolerationSeconds: + format: int64 + type: integer + value: + type: string + type: object + type: array + x-kubernetes-list-type: atomic + topologySpreadConstraints: + items: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + matchLabelKeys: + items: + type: string + type: array + x-kubernetes-list-type: atomic + maxSkew: + format: int32 + type: integer + minDomains: + format: int32 + type: integer + nodeAffinityPolicy: + type: string + nodeTaintsPolicy: + type: string + topologyKey: + type: string + whenUnsatisfiable: + type: string + required: + - maxSkew + - topologyKey + - whenUnsatisfiable + type: object + type: array + x-kubernetes-list-map-keys: + - topologyKey + - whenUnsatisfiable + x-kubernetes-list-type: map + volumes: + items: + properties: + awsElasticBlockStore: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + azureDisk: + properties: + cachingMode: + type: string + diskName: + type: string + diskURI: + type: string + fsType: + default: ext4 + type: string + kind: + type: string + readOnly: + default: false + type: boolean + required: + - diskName + - diskURI + type: object + azureFile: + properties: + readOnly: + type: boolean + secretName: + type: string + shareName: + type: string + required: + - secretName + - shareName + type: object + cephfs: + properties: + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + path: + type: string + readOnly: + type: boolean + secretFile: + type: string + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + type: string + required: + - monitors + type: object + cinder: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeID: + type: string + required: + - volumeID + type: object + configMap: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + csi: + properties: + driver: + type: string + fsType: + type: string + nodePublishSecretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + readOnly: + type: boolean + volumeAttributes: + additionalProperties: + type: string + type: object + required: + - driver + type: object + downwardAPI: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + emptyDir: + properties: + medium: + type: string + sizeLimit: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + ephemeral: + properties: + volumeClaimTemplate: + properties: + metadata: + type: object + spec: + properties: + accessModes: + items: + type: string + type: array + x-kubernetes-list-type: atomic + dataSource: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + required: + - kind + - name + type: object + x-kubernetes-map-type: atomic + dataSourceRef: + properties: + apiGroup: + type: string + kind: + type: string + name: + type: string + namespace: + type: string + required: + - kind + - name + type: object + resources: + properties: + limits: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + requests: + additionalProperties: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + type: object + type: object + selector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + storageClassName: + type: string + volumeAttributesClassName: + type: string + volumeMode: + type: string + volumeName: + type: string + type: object + required: + - spec + type: object + type: object + fc: + properties: + fsType: + type: string + lun: + format: int32 + type: integer + readOnly: + type: boolean + targetWWNs: + items: + type: string + type: array + x-kubernetes-list-type: atomic + wwids: + items: + type: string + type: array + x-kubernetes-list-type: atomic + type: object + flexVolume: + properties: + driver: + type: string + fsType: + type: string + options: + additionalProperties: + type: string + type: object + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + required: + - driver + type: object + flocker: + properties: + datasetName: + type: string + datasetUUID: + type: string + type: object + gcePersistentDisk: + properties: + fsType: + type: string + partition: + format: int32 + type: integer + pdName: + type: string + readOnly: + type: boolean + required: + - pdName + type: object + gitRepo: + properties: + directory: + type: string + repository: + type: string + revision: + type: string + required: + - repository + type: object + glusterfs: + properties: + endpoints: + type: string + path: + type: string + readOnly: + type: boolean + required: + - endpoints + - path + type: object + hostPath: + properties: + path: + type: string + type: + type: string + required: + - path + type: object + image: + properties: + pullPolicy: + type: string + reference: + type: string + type: object + iscsi: + properties: + chapAuthDiscovery: + type: boolean + chapAuthSession: + type: boolean + fsType: + type: string + initiatorName: + type: string + iqn: + type: string + iscsiInterface: + default: default + type: string + lun: + format: int32 + type: integer + portals: + items: + type: string + type: array + x-kubernetes-list-type: atomic + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + targetPortal: + type: string + required: + - iqn + - lun + - targetPortal + type: object + name: + type: string + nfs: + properties: + path: + type: string + readOnly: + type: boolean + server: + type: string + required: + - path + - server + type: object + persistentVolumeClaim: + properties: + claimName: + type: string + readOnly: + type: boolean + required: + - claimName + type: object + photonPersistentDisk: + properties: + fsType: + type: string + pdID: + type: string + required: + - pdID + type: object + portworxVolume: + properties: + fsType: + type: string + readOnly: + type: boolean + volumeID: + type: string + required: + - volumeID + type: object + projected: + properties: + defaultMode: + format: int32 + type: integer + sources: + items: + properties: + clusterTrustBundle: + properties: + labelSelector: + properties: + matchExpressions: + items: + properties: + key: + type: string + operator: + type: string + values: + items: + type: string + type: array + x-kubernetes-list-type: atomic + required: + - key + - operator + type: object + type: array + x-kubernetes-list-type: atomic + matchLabels: + additionalProperties: + type: string + type: object + type: object + x-kubernetes-map-type: atomic + name: + type: string + optional: + type: boolean + path: + type: string + signerName: + type: string + required: + - path + type: object + configMap: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + downwardAPI: + properties: + items: + items: + properties: + fieldRef: + properties: + apiVersion: + type: string + fieldPath: + type: string + required: + - fieldPath + type: object + x-kubernetes-map-type: atomic + mode: + format: int32 + type: integer + path: + type: string + resourceFieldRef: + properties: + containerName: + type: string + divisor: + anyOf: + - type: integer + - type: string + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + resource: + type: string + required: + - resource + type: object + x-kubernetes-map-type: atomic + required: + - path + type: object + type: array + x-kubernetes-list-type: atomic + type: object + podCertificate: + properties: + certificateChainPath: + type: string + credentialBundlePath: + type: string + keyPath: + type: string + keyType: + type: string + maxExpirationSeconds: + format: int32 + type: integer + signerName: + type: string + userAnnotations: + additionalProperties: + type: string + type: object + required: + - keyType + - signerName + type: object + secret: + properties: + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + name: + default: "" + type: string + optional: + type: boolean + type: object + x-kubernetes-map-type: atomic + serviceAccountToken: + properties: + audience: + type: string + expirationSeconds: + format: int64 + type: integer + path: + type: string + required: + - path + type: object + type: object + type: array + x-kubernetes-list-type: atomic + type: object + quobyte: + properties: + group: + type: string + readOnly: + type: boolean + registry: + type: string + tenant: + type: string + user: + type: string + volume: + type: string + required: + - registry + - volume + type: object + rbd: + properties: + fsType: + type: string + image: + type: string + keyring: + default: /etc/ceph/keyring + type: string + monitors: + items: + type: string + type: array + x-kubernetes-list-type: atomic + pool: + default: rbd + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + user: + default: admin + type: string + required: + - image + - monitors + type: object + scaleIO: + properties: + fsType: + default: xfs + type: string + gateway: + type: string + protectionDomain: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + sslEnabled: + type: boolean + storageMode: + default: ThinProvisioned + type: string + storagePool: + type: string + system: + type: string + volumeName: + type: string + required: + - gateway + - secretRef + - system + type: object + secret: + properties: + defaultMode: + format: int32 + type: integer + items: + items: + properties: + key: + type: string + mode: + format: int32 + type: integer + path: + type: string + required: + - key + - path + type: object + type: array + x-kubernetes-list-type: atomic + optional: + type: boolean + secretName: + type: string + type: object + storageos: + properties: + fsType: + type: string + readOnly: + type: boolean + secretRef: + properties: + name: + default: "" + type: string + type: object + x-kubernetes-map-type: atomic + volumeName: + type: string + volumeNamespace: + type: string + type: object + vsphereVolume: + properties: + fsType: + type: string + storagePolicyID: + type: string + storagePolicyName: + type: string + volumePath: + type: string + required: + - volumePath + type: object + required: + - name + type: object + type: array + x-kubernetes-list-map-keys: + - name + x-kubernetes-list-type: map + workloadRef: + properties: + name: + type: string + podGroup: + type: string + podGroupReplicaKey: + type: string + required: + - name + - podGroup + type: object + required: + - containers + type: object + properties: + additionalProperties: + type: string + type: object + type: object + required: + - spec + type: object + served: true + storage: true diff --git a/control-operator/config/crd/kustomization.yaml b/control-operator/config/crd/kustomization.yaml index dcc3db956..fdb11dc4d 100644 --- a/control-operator/config/crd/kustomization.yaml +++ b/control-operator/config/crd/kustomization.yaml @@ -3,6 +3,8 @@ # It should be run by config/default resources: - bases/aliecs.alice.cern_tasks.yaml +- bases/aliecs.alice.cern_environments.yaml +- bases/aliecs.alice.cern_tasktemplates.yaml #+kubebuilder:scaffold:crdkustomizeresource patches: diff --git a/control-operator/config/default/environment_auth_proxy_patch.yaml b/control-operator/config/default/environment_auth_proxy_patch.yaml new file mode 100644 index 000000000..150113a87 --- /dev/null +++ b/control-operator/config/default/environment_auth_proxy_patch.yaml @@ -0,0 +1,39 @@ +# This patch inject a sidecar container which is a HTTP proxy for the +# controller manager, it performs RBAC authorization against the Kubernetes API using SubjectAccessReviews. +apiVersion: apps/v1 +kind: Deployment +metadata: + name: environment-manager + namespace: system +spec: + template: + spec: + containers: + - name: kube-rbac-proxy + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + image: gcr.io/kubebuilder/kube-rbac-proxy:v0.14.1 + args: + - "--secure-listen-address=0.0.0.0:8443" + - "--upstream=http://127.0.0.1:8080/" + - "--logtostderr=true" + - "--v=0" + ports: + - containerPort: 8443 + protocol: TCP + name: https + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 5m + memory: 64Mi + - name: manager + args: + - "--health-probe-bind-address=:8081" + - "--metrics-bind-address=127.0.0.1:8080" + - "--leader-elect" diff --git a/control-operator/config/default/kustomization.yaml b/control-operator/config/default/kustomization.yaml index b2bc27ead..9185c158d 100644 --- a/control-operator/config/default/kustomization.yaml +++ b/control-operator/config/default/kustomization.yaml @@ -15,8 +15,7 @@ namePrefix: operator- # someName: someValue resources: -- ../crd -- ../rbac +- ../base - ../manager # [WEBHOOK] To enable webhook, uncomment all the sections with [WEBHOOK] prefix including the one in # crd/kustomization.yaml @@ -29,9 +28,10 @@ resources: patchesStrategicMerge: # Protect the /metrics endpoint by putting it behind auth. # If you want your controller-manager to expose the /metrics -# endpoint w/o any authn/z, please comment the following line. +# endpoint w/o any authn/z, please comment the following lines. # TODO: replace kube-rbac-proxy with WithAuthenticationAndAuthorization (see kubebuilder deprecation notice) #- manager_auth_proxy_patch.yaml +#- environment_auth_proxy_patch.yaml diff --git a/control-operator/config/default/manager_auth_proxy_patch.yaml b/control-operator/config/default/manager_auth_proxy_patch.yaml index 73fad2a67..a2f54b4ab 100644 --- a/control-operator/config/default/manager_auth_proxy_patch.yaml +++ b/control-operator/config/default/manager_auth_proxy_patch.yaml @@ -3,7 +3,7 @@ apiVersion: apps/v1 kind: Deployment metadata: - name: controller-manager + name: task-manager namespace: system spec: template: diff --git a/control-operator/config/environment/kustomization.yaml b/control-operator/config/environment/kustomization.yaml new file mode 100644 index 000000000..c4c6010b5 --- /dev/null +++ b/control-operator/config/environment/kustomization.yaml @@ -0,0 +1,14 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: operator-system +namePrefix: operator- + +resources: +- ../base +- ../manager/environment-manager + +images: +- name: environment-manager + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager + newTag: latest diff --git a/control-operator/config/manager/environment-manager/environment-manager.yaml b/control-operator/config/manager/environment-manager/environment-manager.yaml new file mode 100644 index 000000000..9b02dd2f5 --- /dev/null +++ b/control-operator/config/manager/environment-manager/environment-manager.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: environment-manager + namespace: system + labels: + control-plane: environment-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: environment-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: environment-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: environment-manager + spec: + securityContext: + runAsNonRoot: true + containers: + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:8081 + image: environment-manager:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 8081 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 8081 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 diff --git a/control-operator/config/manager/environment-manager/kustomization.yaml b/control-operator/config/manager/environment-manager/kustomization.yaml new file mode 100644 index 000000000..31c476c0f --- /dev/null +++ b/control-operator/config/manager/environment-manager/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- environment-manager.yaml + +images: +- name: environment-manager + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager + newTag: latest diff --git a/control-operator/config/manager/kustomization.yaml b/control-operator/config/manager/kustomization.yaml index e3c9ed1ad..c958d22a6 100644 --- a/control-operator/config/manager/kustomization.yaml +++ b/control-operator/config/manager/kustomization.yaml @@ -1,8 +1,12 @@ resources: -- manager.yaml +- task-manager +- environment-manager apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization images: -- name: controller +- name: environment-manager + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager + newTag: latest +- name: task-manager newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager newTag: latest diff --git a/control-operator/config/manager/manager.yaml b/control-operator/config/manager/manager.yaml index 3a355e8ee..ece36694b 100644 --- a/control-operator/config/manager/manager.yaml +++ b/control-operator/config/manager/manager.yaml @@ -14,12 +14,104 @@ metadata: apiVersion: apps/v1 kind: DaemonSet metadata: - name: controller-manager + name: task-manager namespace: system labels: - control-plane: controller-manager - app.kubernetes.io/name: daemonset - app.kubernetes.io/instance: controller-manager + control-plane: task-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: task-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: task-manager + replicas: 1 + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: task-manager + spec: + # TODO(user): Uncomment the following code to configure the nodeAffinity expression + # according to the platforms which are supported by your solution. + # It is considered best practice to support multiple architectures. You can + # build your manager image using the makefile target docker-buildx. + # affinity: + # nodeAffinity: + # requiredDuringSchedulingIgnoredDuringExecution: + # nodeSelectorTerms: + # - matchExpressions: + # - key: kubernetes.io/arch + # operator: In + # values: + # - amd64 + # - arm64 + # - ppc64le + # - s390x + # - key: kubernetes.io/os + # operator: In + # values: + # - linux + hostNetwork: true + securityContext: + runAsNonRoot: true + # TODO(user): For common cases that do not require escalating privileges + # it is recommended to ensure that all your Pods/Containers are restrictive. + # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted + # Please uncomment the following code if your project does NOT have to work on old Kubernetes + # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). + # seccompProfile: + # type: RuntimeDefault + containers: + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:9080 + image: task-manager:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 9080 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 9080 + initialDelaySeconds: 5 + periodSeconds: 10 + # TODO(user): Configure the resources accordingly based on the project requirements. + # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: environment-manager + namespace: system + labels: + control-plane: environment-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: environment-manager app.kubernetes.io/component: manager app.kubernetes.io/created-by: operator app.kubernetes.io/part-of: operator @@ -27,13 +119,14 @@ metadata: spec: selector: matchLabels: - control-plane: controller-manager + control-plane: environment-manager + replicas: 1 template: metadata: annotations: kubectl.kubernetes.io/default-container: manager labels: - control-plane: controller-manager + control-plane: environment-manager spec: # TODO(user): Uncomment the following code to configure the nodeAffinity expression # according to the platforms which are supported by your solution. @@ -72,9 +165,8 @@ spec: - /manager args: - --leader-elect - - --health-probe-bind-address=:9083 - - --metrics-bind-address=:9080 - image: controller:latest + - --health-probe-bind-address=:8081 + image: environment-manager:latest name: manager securityContext: allowPrivilegeEscalation: false diff --git a/control-operator/config/manager/task-manager/kustomization.yaml b/control-operator/config/manager/task-manager/kustomization.yaml new file mode 100644 index 000000000..51192d22e --- /dev/null +++ b/control-operator/config/manager/task-manager/kustomization.yaml @@ -0,0 +1,10 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: +- task-manager.yaml + +images: +- name: task-manager + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager + newTag: latest diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml new file mode 100644 index 000000000..16bf76e34 --- /dev/null +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -0,0 +1,61 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: task-manager + namespace: system + labels: + control-plane: task-manager + app.kubernetes.io/name: deployment + app.kubernetes.io/instance: task-manager + app.kubernetes.io/component: manager + app.kubernetes.io/created-by: operator + app.kubernetes.io/part-of: operator + app.kubernetes.io/managed-by: kustomize +spec: + selector: + matchLabels: + control-plane: task-manager + template: + metadata: + annotations: + kubectl.kubernetes.io/default-container: manager + labels: + control-plane: task-manager + spec: + hostNetwork: true + securityContext: + runAsNonRoot: true + containers: + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:9080 + image: task-manager:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 9080 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 9080 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi + serviceAccountName: controller-manager + terminationGracePeriodSeconds: 10 diff --git a/control-operator/config/rbac/environment_admin_role.yaml b/control-operator/config/rbac/environment_admin_role.yaml new file mode 100644 index 000000000..69f7776af --- /dev/null +++ b/control-operator/config/rbac/environment_admin_role.yaml @@ -0,0 +1,27 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants full permissions ('*') over aliecs.alice.cern. +# This role is intended for users authorized to modify roles and bindings within the cluster, +# enabling them to delegate specific permissions to other users or groups as needed. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: environment-admin-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - environments + verbs: + - '*' +- apiGroups: + - aliecs.alice.cern + resources: + - environments/status + verbs: + - get diff --git a/control-operator/config/rbac/environment_editor_role.yaml b/control-operator/config/rbac/environment_editor_role.yaml new file mode 100644 index 000000000..3af1791ec --- /dev/null +++ b/control-operator/config/rbac/environment_editor_role.yaml @@ -0,0 +1,33 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants permissions to create, update, and delete resources within the aliecs.alice.cern. +# This role is intended for users who need to manage these resources +# but should not control RBAC or manage permissions for others. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: environment-editor-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - environments + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - environments/status + verbs: + - get diff --git a/control-operator/config/rbac/environment_viewer_role.yaml b/control-operator/config/rbac/environment_viewer_role.yaml new file mode 100644 index 000000000..3d5084c85 --- /dev/null +++ b/control-operator/config/rbac/environment_viewer_role.yaml @@ -0,0 +1,29 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants read-only access to aliecs.alice.cern resources. +# This role is intended for users who need visibility into these resources +# without permissions to modify them. It is ideal for monitoring purposes and limited-access viewing. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: environment-viewer-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - environments + verbs: + - get + - list + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - environments/status + verbs: + - get diff --git a/control-operator/config/rbac/kustomization.yaml b/control-operator/config/rbac/kustomization.yaml index 731832a6a..426bfd7d4 100644 --- a/control-operator/config/rbac/kustomization.yaml +++ b/control-operator/config/rbac/kustomization.yaml @@ -16,3 +16,14 @@ resources: - auth_proxy_role.yaml - auth_proxy_role_binding.yaml - auth_proxy_client_clusterrole.yaml +# For each CRD, "Admin", "Editor" and "Viewer" roles are scaffolded by +# default, aiding admins in cluster management. Those roles are +# not used by the operator itself. You can comment the following lines +# if you do not want those helpers be installed with your Project. +- tasktemplate_admin_role.yaml +- tasktemplate_editor_role.yaml +- tasktemplate_viewer_role.yaml +- environment_admin_role.yaml +- environment_editor_role.yaml +- environment_viewer_role.yaml + diff --git a/control-operator/config/rbac/role.yaml b/control-operator/config/rbac/role.yaml index a6843b9f2..3b38b9048 100644 --- a/control-operator/config/rbac/role.yaml +++ b/control-operator/config/rbac/role.yaml @@ -11,9 +11,30 @@ rules: verbs: - create - patch +- apiGroups: + - "" + resources: + - nodes + verbs: + - get + - list + - watch +- apiGroups: + - "" + resources: + - pods + verbs: + - create + - delete + - get + - list + - patch + - update + - watch - apiGroups: - aliecs.alice.cern resources: + - environments - tasks verbs: - create @@ -26,26 +47,24 @@ rules: - apiGroups: - aliecs.alice.cern resources: + - environments/finalizers - tasks/finalizers verbs: - update - apiGroups: - aliecs.alice.cern resources: + - environments/status - tasks/status verbs: - get - patch - update - apiGroups: - - "" + - aliecs.alice.cern resources: - - pods + - tasktemplates verbs: - - create - - delete - get - list - - patch - - update - watch diff --git a/control-operator/config/rbac/tasktemplate_admin_role.yaml b/control-operator/config/rbac/tasktemplate_admin_role.yaml new file mode 100644 index 000000000..c6a5bbd25 --- /dev/null +++ b/control-operator/config/rbac/tasktemplate_admin_role.yaml @@ -0,0 +1,27 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants full permissions ('*') over aliecs.alice.cern. +# This role is intended for users authorized to modify roles and bindings within the cluster, +# enabling them to delegate specific permissions to other users or groups as needed. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: tasktemplate-admin-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates + verbs: + - '*' +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates/status + verbs: + - get diff --git a/control-operator/config/rbac/tasktemplate_editor_role.yaml b/control-operator/config/rbac/tasktemplate_editor_role.yaml new file mode 100644 index 000000000..448283e73 --- /dev/null +++ b/control-operator/config/rbac/tasktemplate_editor_role.yaml @@ -0,0 +1,33 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants permissions to create, update, and delete resources within the aliecs.alice.cern. +# This role is intended for users who need to manage these resources +# but should not control RBAC or manage permissions for others. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: tasktemplate-editor-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates + verbs: + - create + - delete + - get + - list + - patch + - update + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates/status + verbs: + - get diff --git a/control-operator/config/rbac/tasktemplate_viewer_role.yaml b/control-operator/config/rbac/tasktemplate_viewer_role.yaml new file mode 100644 index 000000000..96127f5db --- /dev/null +++ b/control-operator/config/rbac/tasktemplate_viewer_role.yaml @@ -0,0 +1,29 @@ +# This rule is not used by the project operator itself. +# It is provided to allow the cluster admin to help manage permissions for users. +# +# Grants read-only access to aliecs.alice.cern resources. +# This role is intended for users who need visibility into these resources +# without permissions to modify them. It is ideal for monitoring purposes and limited-access viewing. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: tasktemplate-viewer-role +rules: +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates + verbs: + - get + - list + - watch +- apiGroups: + - aliecs.alice.cern + resources: + - tasktemplates/status + verbs: + - get diff --git a/control-operator/config/samples/aliecs_v1alpha1_environment.yaml b/control-operator/config/samples/aliecs_v1alpha1_environment.yaml new file mode 100644 index 000000000..164344db5 --- /dev/null +++ b/control-operator/config/samples/aliecs_v1alpha1_environment.yaml @@ -0,0 +1,9 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Environment +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: environment-sample +spec: + # TODO(user): Add fields here diff --git a/control-operator/config/samples/aliecs_v1alpha1_tasktemplate.yaml b/control-operator/config/samples/aliecs_v1alpha1_tasktemplate.yaml new file mode 100644 index 000000000..82635c3d1 --- /dev/null +++ b/control-operator/config/samples/aliecs_v1alpha1_tasktemplate.yaml @@ -0,0 +1,9 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: TaskTemplate +metadata: + labels: + app.kubernetes.io/name: operator + app.kubernetes.io/managed-by: kustomize + name: tasktemplate-sample +spec: + # TODO(user): Add fields here diff --git a/control-operator/config/samples/kustomization.yaml b/control-operator/config/samples/kustomization.yaml index 498ea9f86..81298dd00 100644 --- a/control-operator/config/samples/kustomization.yaml +++ b/control-operator/config/samples/kustomization.yaml @@ -1,4 +1,6 @@ ## Append samples of your project ## resources: - aliecs_v1alpha1_task.yaml +- aliecs_v1alpha1_environment.yaml +- aliecs_v1alpha1_tasktemplate.yaml #+kubebuilder:scaffold:manifestskustomizesamples diff --git a/control-operator/config/task/kustomization.yaml b/control-operator/config/task/kustomization.yaml new file mode 100644 index 000000000..02b078f52 --- /dev/null +++ b/control-operator/config/task/kustomization.yaml @@ -0,0 +1,14 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +namespace: operator-system +namePrefix: operator- + +resources: +- ../base +- ../manager/task-manager + +images: +- name: task-manager + newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager + newTag: latest diff --git a/control-operator/ecs-manifests/environment/test_env.yaml b/control-operator/ecs-manifests/environment/test_env.yaml new file mode 100644 index 000000000..2caafa1ff --- /dev/null +++ b/control-operator/ecs-manifests/environment/test_env.yaml @@ -0,0 +1,189 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: Environment +metadata: + name: 31jdwll4xl6 + +taskTemplates: + tasks: + mtichak-ost.cern.ch: + # mtichak-xps-cern: + - name: readout + argsCLI: + - consul-ini://mtichak-ost.cern.ch:8500/o2/components/readout/ANY/any/readout-stfb-mtichak-ost + argsTransition: + chans.readout.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94og + chans.readout.0.autoBind: "0" + chans.readout.0.method: bind + chans.readout.0.rateLogging: "0" + chans.readout.0.rcvBufSize: "1000" + chans.readout.0.rcvKernelSize: "0" + chans.readout.0.sndBufSize: "1000" + chans.readout.0.sndKernelSize: "0" + chans.readout.0.transport: shmem + chans.readout.0.type: push + chans.readout.numSockets: "1" + environment_id: 31jdWLL4XL6 + Orbit-Reset-Time: "" + env: + - name: O2_DETECTOR + value: TST + - name: O2_PARTITION + value: 31jdWLL4XL6 + - name: OCC_CONTROL_PORT + value: "31000" + - name: O2_SYSTEM + value: FLP + - name: O2_ROLE + value: mtichak-ost + + - name: stfbuilder-senderoutput + argsCLI: + - --session=default + - --transport=shmem + - --shm-segment-id=2 + - --shm-segment-size=33554432 + - --monitoring-backend=influxdb-unix:///tmp/telegraf.sock + - --monitoring-process-interval=5 + - --discovery-partition=31jdWLL4XL6 + - --discovery-endpoint=no-op:// + - --detector-rdh=6 + - --detector-subspec=feeid + - --severity=info + - --severity-infologger=info + - --output-channel-name=buildertosender + - --shm-monitor=false + - --detector=TST + - --run-type=physics + - --id + - 31jdWLqicSv + - -S + - $(CONTROL_OCCPLUGIN_ROOT)/lib/ + - -P + - OCClite + - --color + - "false" + - --control-port + - "31001" + argsTransition: + chans.buildertosender.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94p0 + chans.buildertosender.0.autoBind: "0" + chans.buildertosender.0.method: bind + chans.buildertosender.0.rateLogging: "0" + chans.buildertosender.0.rcvBufSize: "1000" + chans.buildertosender.0.rcvKernelSize: "0" + chans.buildertosender.0.sndBufSize: "4" + chans.buildertosender.0.sndKernelSize: "0" + chans.buildertosender.0.transport: shmem + chans.buildertosender.0.type: push + chans.buildertosender.numSockets: "1" + chans.readout.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94og + chans.readout.0.method: connect + chans.readout.0.rateLogging: "0" + chans.readout.0.rcvBufSize: "1000" + chans.readout.0.rcvKernelSize: "0" + chans.readout.0.sndBufSize: "1000" + chans.readout.0.sndKernelSize: "0" + chans.readout.0.transport: shmem + chans.readout.0.type: pull + chans.readout.numSockets: "1" + environment_id: 31jdWLL4XL6 + Orbit-Reset-Time: "" + env: + - name: O2_DETECTOR + value: TST + - name: O2_PARTITION + value: 31jdWLL4XL6 + - name: OCC_CONTROL_PORT + value: "31001" + - name: O2_SYSTEM + value: FLP + - name: O2_ROLE + value: mtichak-ost + - name: O2_INFOLOGGER_MODE + value: infoLoggerD + - name: DATADIST_FEE_MASK + value: "0xffff" + - name: CONTROL_OCCPLUGIN_ROOT + value: /opt/o2 + + - name: stfsender + argsCLI: + - --cpunodebind=0 + - --preferred=0 + - -- + - /opt/o2/bin/StfSender + - --session=default + - --shm-segment-id=2 + - --shm-segment-size=33554432 + - --dd-region-size=4096 + - --dd-region-id=3536 + - --transport=shmem + - --input-channel-name=buildertosender + - --severity=info + - --severity-infologger=info + - --monitoring-backend=influxdb-unix:///tmp/telegraf.sock + - --monitoring-process-interval=5 + - --discovery-partition=31jdWLL4XL6 + - --discovery-id=stfs-mtichak-ost-31jdWLTUTjp + - --discovery-endpoint=no-op:// + - --discovery-net-if=ib0 + - --stand-alone + - --shm-monitor=false + - --id + - 31jdWLsCGFL + - -S + - $(CONTROL_OCCPLUGIN_ROOT)/lib/ + - -P + - OCClite + - --color + - "false" + - --control-port + - "31002" + argsTransition: + chans.buildertosender.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94p0 + chans.buildertosender.0.method: connect + chans.buildertosender.0.rateLogging: "0" + chans.buildertosender.0.rcvBufSize: "1000" + chans.buildertosender.0.rcvKernelSize: "0" + chans.buildertosender.0.sndBufSize: "1000" + chans.buildertosender.0.sndKernelSize: "0" + chans.buildertosender.0.transport: shmem + chans.buildertosender.0.type: pull + chans.buildertosender.numSockets: "1" + environment_id: 31jdWLL4XL6 + Orbit-Reset-Time: "" + env: + - name: O2_DETECTOR + value: TST + - name: O2_PARTITION + value: 31jdWLL4XL6 + - name: OCC_CONTROL_PORT + value: "31002" + - name: O2_SYSTEM + value: FLP + - name: O2_ROLE + value: mtichak-ost + - name: O2_INFOLOGGER_MODE + value: infoLoggerD + - name: http_proxy + value: "" + - name: https_proxy + value: "" + - name: no_proxy + value: -ib,.internal + - name: UCX_NET_DEVICES + value: mlx5_0:1 + - name: UCX_TLS + value: sm,self,dc,rc + - name: UCX_IB_SL + value: "1" + - name: UCX_DC_MAX_NUM_EPS + value: "512" + - name: UCX_RC_MAX_NUM_EPS + value: "512" + - name: CONTROL_OCCPLUGIN_ROOT + value: /opt/o2 + +spec: + state: standby + tasks: {} diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml index 9195ed2f6..ae2bdc0be 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput.yaml @@ -10,7 +10,7 @@ spec: fsGroup: ${FLP_GID} supplementalGroups: ${FLP_SUPPLEMENTAL_GROUPS} containers: - - name: readout + - name: stfbuilder-senderoutput image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: ["/bin/bash"] args: diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml index a61b190ee..94f5478df 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfsender.yaml @@ -10,7 +10,7 @@ spec: fsGroup: ${FLP_GID} supplementalGroups: ${FLP_SUPPLEMENTAL_GROUPS} containers: - - name: readout + - name: stfsender image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: ["/bin/bash"] args: diff --git a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml new file mode 100644 index 000000000..467470ce7 --- /dev/null +++ b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml @@ -0,0 +1,56 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: TaskTemplate +metadata: + name: readout +spec: + envVars: + - O2_DETECTOR + - O2_PARTITION + - OCC_CONTROL_PORT + - O2_SYSTEM + - O2_ROLE + pod: + hostNetwork: true + hostIPC: true + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 + command: ["/opt/o2/bin/o2-readout-exe"] + securityContext: + privileged: true + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "direct" + # port: ${OCC_CONTROL_PORT} # to be filled in diff --git a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml new file mode 100644 index 000000000..50e3b757f --- /dev/null +++ b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml @@ -0,0 +1,70 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: TaskTemplate +metadata: + name: stfbuilder-senderoutput +spec: + envVars: + - O2_DETECTOR + - O2_PARTITION + - OCC_CONTROL_PORT + - O2_SYSTEM + - O2_ROLE + - O2_INFOLOGGER_MODE + - DATADIST_FEE_MASK + pod: + hostNetwork: true + hostIPC: true + securityContext: + containers: + - name: stfbuilder + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: [/opt/o2/bin/StfBuilder] + securityContext: + privileged: true + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + # port: ${OCC_CONTROL_PORT} #to be filled in + bind: + - name: buildertosender + type: push + rateLogging: "0" + addressing: ipc + transport: shmem + sndBufSize: 4 + global: "" + target: "" + connect: [] + properties: {} diff --git a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml new file mode 100644 index 000000000..082b73093 --- /dev/null +++ b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml @@ -0,0 +1,66 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: TaskTemplate +metadata: + name: stfsender +spec: + envVars: + - O2_DETECTOR + - O2_PARTITION + - OCC_CONTROL_PORT + - O2_SYSTEM + - O2_ROLE + - O2_INFOLOGGER_MODE + - http_proxy + - https_proxy + - no_proxy + - UCX_NET_DEVICES + - UCX_TLS + - UCX_IB_SL + - UCX_DC_MAX_NUM_EPS + - UCX_RC_MAX_NUM_EPS + pod: + hostNetwork: true + hostIPC: true + securityContext: + containers: + - name: stfsender + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 + command: ["numactl"] + securityContext: + privileged: true + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + # port: ${OCC_CONTROL_PORT} # to be filled in diff --git a/control-operator/go.mod b/control-operator/go.mod index 2cbfefa21..b95e4ec51 100644 --- a/control-operator/go.mod +++ b/control-operator/go.mod @@ -1,10 +1,13 @@ -module github.com/AliceO2Group/ControlOperator +module github.com/AliceO2Group/Control/operator go 1.25.0 require ( + github.com/go-logr/logr v1.4.3 github.com/onsi/ginkgo/v2 v2.27.2 github.com/onsi/gomega v1.38.2 + google.golang.org/grpc v1.78.0 + google.golang.org/protobuf v1.36.11 k8s.io/api v0.35.0 k8s.io/apimachinery v0.35.0 k8s.io/client-go v0.35.0 @@ -20,7 +23,6 @@ require ( github.com/evanphx/json-patch/v5 v5.9.11 // indirect github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.9.0 // indirect - github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/zapr v1.3.0 // indirect github.com/go-openapi/jsonpointer v0.22.4 // indirect github.com/go-openapi/jsonreference v0.21.4 // indirect @@ -68,9 +70,6 @@ require ( golang.org/x/tools v0.40.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d // indirect - google.golang.org/grpc v1.78.0 // indirect - google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 // indirect - google.golang.org/protobuf v1.36.11 // indirect gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect k8s.io/apiextensions-apiserver v0.35.0 // indirect @@ -83,4 +82,4 @@ require ( sigs.k8s.io/yaml v1.6.0 // indirect ) -replace github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated => ./internal/controller/protos/generated +replace github.com/AliceO2Group/Control/operator/internal/controller/protos/generated => ./internal/controller/protos/generated diff --git a/control-operator/go.sum b/control-operator/go.sum index 752dcbba0..3c8f95fef 100644 --- a/control-operator/go.sum +++ b/control-operator/go.sum @@ -26,6 +26,8 @@ github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01 github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= @@ -66,6 +68,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= @@ -140,6 +144,18 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= +go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= +go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= +go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= +go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= +go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -170,12 +186,12 @@ golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA= golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc= gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d h1:xXzuihhT3gL/ntduUZwHECzAn57E8dA6l8SOtYWdD8Q= google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.78.0 h1:K1XZG/yGDJnzMdd/uZHAkVqJE+xIDOcmdSFZkBUicNc= google.golang.org/grpc v1.78.0/go.mod h1:I47qjTo4OKbMkjA/aOOwxDIiPSBofUtQUI5EfpWvW7U= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0 h1:6Al3kEFFP9VJhRz3DID6quisgPnTeZVr4lep9kkxdPA= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.0/go.mod h1:QLvsjh0OIR0TYBeiu2bkWGTJBUNQ64st52iWj/yA93I= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go new file mode 100644 index 000000000..b2393cd92 --- /dev/null +++ b/control-operator/internal/controller/environment_controller.go @@ -0,0 +1,233 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + "fmt" + "maps" + "slices" + "strconv" + + v1 "k8s.io/api/core/v1" + k8serrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" + "sigs.k8s.io/controller-runtime/pkg/handler" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" +) + +// EnvironmentReconciler reconciles a Environment object +type EnvironmentReconciler struct { + client.Client + Scheme *runtime.Scheme +} + +// +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments,verbs=get;list;watch;create;update;patch;delete +// +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/status,verbs=get;update;patch +// +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/finalizers,verbs=update +// +kubebuilder:rbac:groups=aliecs.alice.cern,resources=tasktemplates,verbs=get;list;watch +// +kubebuilder:rbac:groups=core,resources=nodes,verbs=get;list;watch + +// Reconcile is part of the main kubernetes reconciliation loop which aims to +// move the current state of the cluster closer to the desired state. +// TODO(user): Modify the Reconcile function to compare the state specified by +// the Environment object against the actual cluster state, and then +// perform operations to make the cluster state reflect the state specified by +// the user. +// +// For more details, check Reconcile and its Result here: +// - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.23.1/pkg/reconcile +func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { + log := logf.FromContext(ctx) + + env := &aliecsv1alpha1.Environment{} + if err := r.Get(ctx, req.NamespacedName, env); err != nil { + return ctrl.Result{}, client.IgnoreNotFound(err) + } + + if env.Status.State == "" { + for nodename, tasks := range env.TaskTemplates.Tasks { + log.Info("creating tasks for hostname", "hostname", nodename, "number of tasks", len(tasks)) + + for _, taskReference := range tasks { + log.Info("geting stored template for task", "task", taskReference.Name) + template := &aliecsv1alpha1.TaskTemplate{} + if err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: taskReference.Name}, template); err != nil { + log.Error(err, "failed to get template for task", "task", taskReference.Name) + return ctrl.Result{}, nil + } + + node := &v1.Node{} + if err := r.Get(ctx, types.NamespacedName{Name: nodename}, node); err != nil { + if k8serrors.IsNotFound(err) { + return ctrl.Result{}, fmt.Errorf("node %s not found in cluster", nodename) + } + return ctrl.Result{}, err + } + + task := &aliecsv1alpha1.Task{} + task.Name = fmt.Sprintf("%s-%s", nodename, template.Name) + task.Namespace = req.Namespace + if err := r.Get(ctx, types.NamespacedName{Name: task.Name, Namespace: task.Namespace}, task); err == nil { + continue + } + + // TODO: N^2 change + for _, env := range template.Spec.EnvVars { + if !slices.ContainsFunc(taskReference.Env, func(envVar v1.EnvVar) bool { + return envVar.Name == env + }) { + + log.Error(fmt.Errorf("didn't find required env: %s", env), "failed to fill in env vars from template") + return reconcile.Result{}, nil + } + } + + task.Spec.Pod = *template.Spec.Pod.DeepCopy() + task.Spec.Control = *template.Spec.Control.DeepCopy() + + if foundIdx := slices.IndexFunc(taskReference.Env, func(envVar v1.EnvVar) bool { return envVar.Name == "OCC_CONTROL_PORT" }); foundIdx == -1 { + log.Error(fmt.Errorf("didn't find OCC_CONTROL_PORT in env"), "failed to fill in env vars from template") + } else { + port, err := strconv.Atoi(taskReference.Env[foundIdx].Value) + if err != nil { + log.Error(fmt.Errorf("found OCC_CONTROL_PORT isn't convertible to number "), "failed to fill in env vars from template") + return reconcile.Result{}, nil + } + task.Spec.Control.Port = port + } + + if task.Spec.Arguments == nil { + task.Spec.Arguments = make(map[string]string) + } + + // TODO: check for containers! + task.Spec.Pod.Containers[0].Env = append(task.Spec.Pod.Containers[0].Env, taskReference.Env...) + task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) + maps.Copy(task.Spec.Arguments, taskReference.ArgsTransition) + + task.Spec.Pod.NodeName = nodename + task.Spec.State = env.Spec.State + + // create label to bunch tasks to the environment + task.Labels = map[string]string{"environment": env.Name} + + if err := controllerutil.SetControllerReference(env, task, r.Scheme); err != nil { + log.Error(err, "failed to set controller reference", "task", task.Name) + return ctrl.Result{}, err + } + + if err := r.Create(ctx, task); err != nil { + if err = client.IgnoreAlreadyExists(err); err != nil { + log.Error(err, "Failed to create task on node", "nodename", nodename, "task", task.Name) + // TODO: add error handling + } + } + } + } + } + + tasks := &aliecsv1alpha1.TaskList{} + if err := r.List(ctx, tasks, client.InNamespace(env.Namespace), client.MatchingLabels{"environment": env.Name}); err != nil { + log.Error(err, "failed to get list of tasks for this environment") + return ctrl.Result{}, err + } + + if env.Status.Tasks == nil { + env.Status.Tasks = make(map[string]map[string]string) + } + + for _, task := range tasks.Items { + nodename := task.Spec.Pod.NodeName + if env.Status.Tasks[nodename] == nil { + env.Status.Tasks[nodename] = make(map[string]string) + } + + env.Status.Tasks[nodename][task.Name] = task.Status.State + } + + env.Status.State = aggregateState(tasks.Items, env.Status.State) + + for _, task := range tasks.Items { + if task.Spec.State != env.Spec.State { + patch := client.MergeFrom(task.DeepCopy()) + task.Spec.State = env.Spec.State + if err := r.Patch(ctx, &task, patch); err != nil { + log.Error(err, "failed to patch task state", "task", task.Name) + } + } + } + + if err := r.Status().Update(ctx, env); err != nil { + if k8serrors.IsConflict(err) { + return ctrl.Result{Requeue: true}, nil + } + log.Error(err, "failed to update status") + return ctrl.Result{}, err + } + + return ctrl.Result{}, nil +} + +func aggregateState(tasks []aliecsv1alpha1.Task, previousState string) string { + if len(tasks) == 0 { + return previousState + } + + first := tasks[0].Status.State + allSame := true + for _, task := range tasks { + if task.Status.State == "error" { + return "error" + } + if task.Status.State != first { + allSame = false + } + } + + if allSame { + return first + } + return previousState +} + +// SetupWithManager sets up the controller with the Manager. +func (r *EnvironmentReconciler) SetupWithManager(mgr ctrl.Manager) error { + return ctrl.NewControllerManagedBy(mgr). + For(&aliecsv1alpha1.Environment{}). + Owns(&aliecsv1alpha1.Task{}). + Watches(&aliecsv1alpha1.TaskTemplate{}, handler.EnqueueRequestsFromMapFunc(func(ctx context.Context, obj client.Object) []reconcile.Request { + return nil + })). + Named("environment"). + Complete(r) +} diff --git a/control-operator/internal/controller/environment_controller_test.go b/control-operator/internal/controller/environment_controller_test.go new file mode 100644 index 000000000..2e23165f4 --- /dev/null +++ b/control-operator/internal/controller/environment_controller_test.go @@ -0,0 +1,98 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2024 CERN and copyright holders of ALICE O². + * Author: Teo Mrnjavac + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" +) + +var _ = Describe("Environment Controller", func() { + Context("When reconciling a resource", func() { + const resourceName = "test-resource" + + ctx := context.Background() + + typeNamespacedName := types.NamespacedName{ + Name: resourceName, + Namespace: "default", // TODO(user):Modify as needed + } + environment := &aliecsv1alpha1.Environment{} + + BeforeEach(func() { + By("creating the custom resource for the Kind Environment") + err := k8sClient.Get(ctx, typeNamespacedName, environment) + if err != nil && errors.IsNotFound(err) { + resource := &aliecsv1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: "default", + }, + Spec: aliecsv1alpha1.EnvironmentSpec{ + State: "standby", + Tasks: map[string][]aliecsv1alpha1.TaskTemplate{}, + }, + TaskTemplates: aliecsv1alpha1.TemplateSpecification{ + Tasks: map[string][]aliecsv1alpha1.TaskReference{}, + }, + } + Expect(k8sClient.Create(ctx, resource)).To(Succeed()) + } + }) + + AfterEach(func() { + // TODO(user): Cleanup logic after each test, like removing the resource instance. + resource := &aliecsv1alpha1.Environment{} + err := k8sClient.Get(ctx, typeNamespacedName, resource) + Expect(err).NotTo(HaveOccurred()) + + By("Cleanup the specific resource instance Environment") + Expect(k8sClient.Delete(ctx, resource)).To(Succeed()) + }) + It("should successfully reconcile the resource", func() { + By("Reconciling the created resource") + controllerReconciler := &EnvironmentReconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), + } + + _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespacedName, + }) + Expect(err).NotTo(HaveOccurred()) + // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. + // Example: If you expect a certain status condition after reconciliation, verify it here. + }) + }) +}) diff --git a/control-operator/internal/controller/fairmq_transition.go b/control-operator/internal/controller/fairmq_transition.go index 37d6f347a..ac58a50b6 100644 --- a/control-operator/internal/controller/fairmq_transition.go +++ b/control-operator/internal/controller/fairmq_transition.go @@ -29,7 +29,7 @@ import ( "fmt" "strings" - pb "github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated" + pb "github.com/AliceO2Group/Control/operator/internal/controller/protos/generated" ) // FairMQ internal state names as used by the OCC plugin diff --git a/control-operator/internal/controller/grpc_client.go b/control-operator/internal/controller/grpc_client.go index 5c2c13333..a76310cb9 100644 --- a/control-operator/internal/controller/grpc_client.go +++ b/control-operator/internal/controller/grpc_client.go @@ -39,8 +39,8 @@ import ( "google.golang.org/grpc/status" "k8s.io/apimachinery/pkg/types" - aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" - pb "github.com/AliceO2Group/ControlOperator/internal/controller/protos/generated" + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + pb "github.com/AliceO2Group/Control/operator/internal/controller/protos/generated" ) // jsonOccClient mirrors executor/executorcmd/nopb/occclient.go: uses short method diff --git a/control-operator/internal/controller/suite_test.go b/control-operator/internal/controller/suite_test.go index 7be153c8f..7e57b8ab8 100644 --- a/control-operator/internal/controller/suite_test.go +++ b/control-operator/internal/controller/suite_test.go @@ -38,7 +38,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" //+kubebuilder:scaffold:imports ) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 93ec00b96..2d0e52eca 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -42,9 +42,9 @@ import ( "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" - "sigs.k8s.io/controller-runtime/pkg/log" + logf "sigs.k8s.io/controller-runtime/pkg/log" - aliecsv1alpha1 "github.com/AliceO2Group/ControlOperator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" "github.com/go-logr/logr" ) @@ -76,7 +76,7 @@ const taskFinalizer string = "aliecs.alice.cern/finalizer" // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.15.0/pkg/reconcile // TODO: right now if POD fails and stops sooner, reconciliation creates a new one... func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { - log := log.FromContext(ctx) + log := logf.FromContext(ctx) t := &aliecsv1alpha1.Task{} if err := r.Get(ctx, req.NamespacedName, t); err != nil { From 332c1bcdcbc14146d9cae001ade601f7af84fb13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 17 Apr 2026 15:31:34 +0200 Subject: [PATCH 2281/2352] [OCTRL-1088] added TaskDefinitions to environment-controller --- control-operator/Dockerfile | 2 +- .../api/v1alpha1/environment_types.go | 9 +- .../api/v1alpha1/tasktemplate_types.go | 4 + .../api/v1alpha1/zz_generated.deepcopy.go | 29 +- .../bases/aliecs.alice.cern_environments.yaml | 11 +- .../aliecs.alice.cern_tasktemplates.yaml | 4 + .../environment-manager.yaml | 65 ++--- control-operator/config/manager/manager.yaml | 198 -------------- .../manager/task-manager/task-manager.yaml | 65 ++--- .../ecs-manifests/environment/test_env.yaml | 133 +++++++-- .../controller/environment_controller.go | 258 ++++++++++++------ .../controller/environment_controller_test.go | 2 +- 12 files changed, 390 insertions(+), 390 deletions(-) delete mode 100644 control-operator/config/manager/manager.yaml diff --git a/control-operator/Dockerfile b/control-operator/Dockerfile index 42abd3473..2fcd5a5e2 100644 --- a/control-operator/Dockerfile +++ b/control-operator/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.25 as builder +FROM golang:1.25 AS builder ARG TARGETOS ARG TARGETARCH ARG MANAGER=task-manager diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go index e872bbdd8..6bba53677 100644 --- a/control-operator/api/v1alpha1/environment_types.go +++ b/control-operator/api/v1alpha1/environment_types.go @@ -32,6 +32,13 @@ import ( // EDIT THIS FILE! THIS IS SCAFFOLDING FOR YOU TO OWN! // NOTE: json tags are required. Any new fields you add must have json tags for the fields to be serialized. +// TaskDefinition is a lightweight inline task definition used within an Environment spec. +// Unlike TaskTemplate, it is not a cluster resource — it carries a plain name and the same spec fields. +type TaskDefinition struct { + Name string `json:"name"` + Spec TaskTemplateSpec `json:"spec"` +} + // EnvironmentSpec defines the desired state of Environment type EnvironmentSpec struct { // INSERT ADDITIONAL SPEC FIELDS - desired state of cluster @@ -39,7 +46,7 @@ type EnvironmentSpec struct { // The following markers will use OpenAPI v3 schema to validate the value // More info: https://book.kubebuilder.io/reference/markers/crd-validation.html - Tasks map[string][]TaskTemplate `json:"tasks"` + Tasks map[string][]TaskDefinition `json:"tasks"` // +kubebuilder:validation:Enum=standby;deployed;configured;running State string `json:"state"` } diff --git a/control-operator/api/v1alpha1/tasktemplate_types.go b/control-operator/api/v1alpha1/tasktemplate_types.go index 97c75732e..69ba168a7 100644 --- a/control-operator/api/v1alpha1/tasktemplate_types.go +++ b/control-operator/api/v1alpha1/tasktemplate_types.go @@ -53,6 +53,10 @@ type TaskTemplateSpec struct { // +optional Properties map[string]string `json:"properties,omitempty"` + // Arguments defines transition arguments passed to the task via OCC gRPC. + // +optional + Arguments map[string]string `json:"arguments,omitempty"` + // Names of the expected Environment variables to be passed to Pod // +optional EnvVars []string `json:"envVars,omitempty"` diff --git a/control-operator/api/v1alpha1/zz_generated.deepcopy.go b/control-operator/api/v1alpha1/zz_generated.deepcopy.go index f7b37c209..628dc1b42 100644 --- a/control-operator/api/v1alpha1/zz_generated.deepcopy.go +++ b/control-operator/api/v1alpha1/zz_generated.deepcopy.go @@ -99,15 +99,15 @@ func (in *EnvironmentSpec) DeepCopyInto(out *EnvironmentSpec) { *out = *in if in.Tasks != nil { in, out := &in.Tasks, &out.Tasks - *out = make(map[string][]TaskTemplate, len(*in)) + *out = make(map[string][]TaskDefinition, len(*in)) for key, val := range *in { - var outVal []TaskTemplate + var outVal []TaskDefinition if val == nil { (*out)[key] = nil } else { inVal := (*in)[key] in, out := &inVal, &outVal - *out = make([]TaskTemplate, len(*in)) + *out = make([]TaskDefinition, len(*in)) for i := range *in { (*in)[i].DeepCopyInto(&(*out)[i]) } @@ -194,6 +194,22 @@ func (in *Task) DeepCopyObject() runtime.Object { return nil } +// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. +func (in *TaskDefinition) DeepCopyInto(out *TaskDefinition) { + *out = *in + in.Spec.DeepCopyInto(&out.Spec) +} + +// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskDefinition. +func (in *TaskDefinition) DeepCopy() *TaskDefinition { + if in == nil { + return nil + } + out := new(TaskDefinition) + in.DeepCopyInto(out) + return out +} + // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. func (in *TaskList) DeepCopyInto(out *TaskList) { *out = *in @@ -442,6 +458,13 @@ func (in *TaskTemplateSpec) DeepCopyInto(out *TaskTemplateSpec) { (*out)[key] = val } } + if in.Arguments != nil { + in, out := &in.Arguments, &out.Arguments + *out = make(map[string]string, len(*in)) + for key, val := range *in { + (*out)[key] = val + } + } if in.EnvVars != nil { in, out := &in.EnvVars, &out.EnvVars *out = make([]string, len(*in)) diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml index 30bb276c1..d32e00590 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml @@ -47,14 +47,14 @@ spec: additionalProperties: items: properties: - apiVersion: - type: string - kind: + name: type: string - metadata: - type: object spec: properties: + arguments: + additionalProperties: + type: string + type: object bind: items: properties: @@ -3940,6 +3940,7 @@ spec: type: object type: object required: + - name - spec type: object type: array diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml index 20d22c3a3..a45b860e2 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_tasktemplates.yaml @@ -26,6 +26,10 @@ spec: type: object spec: properties: + arguments: + additionalProperties: + type: string + type: object bind: items: properties: diff --git a/control-operator/config/manager/environment-manager/environment-manager.yaml b/control-operator/config/manager/environment-manager/environment-manager.yaml index 9b02dd2f5..19e2a2df5 100644 --- a/control-operator/config/manager/environment-manager/environment-manager.yaml +++ b/control-operator/config/manager/environment-manager/environment-manager.yaml @@ -23,39 +23,42 @@ spec: labels: control-plane: environment-manager spec: + imagePullSecrets: + - name: gitlab-registry-secret securityContext: runAsNonRoot: true containers: - - command: - - /manager - args: - - --leader-elect - - --health-probe-bind-address=:8081 - image: environment-manager:latest - name: manager - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - livenessProbe: - httpGet: - path: /healthz - port: 8081 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 8081 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:9080 + - --metrics-bind-address=:9081 + image: environment-manager:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 9080 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 9080 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi serviceAccountName: controller-manager terminationGracePeriodSeconds: 10 diff --git a/control-operator/config/manager/manager.yaml b/control-operator/config/manager/manager.yaml deleted file mode 100644 index ece36694b..000000000 --- a/control-operator/config/manager/manager.yaml +++ /dev/null @@ -1,198 +0,0 @@ -apiVersion: v1 -kind: Namespace -metadata: - labels: - control-plane: controller-manager - app.kubernetes.io/name: namespace - app.kubernetes.io/instance: system - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: operator - app.kubernetes.io/part-of: operator - app.kubernetes.io/managed-by: kustomize - name: system ---- -apiVersion: apps/v1 -kind: DaemonSet -metadata: - name: task-manager - namespace: system - labels: - control-plane: task-manager - app.kubernetes.io/name: deployment - app.kubernetes.io/instance: task-manager - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: operator - app.kubernetes.io/part-of: operator - app.kubernetes.io/managed-by: kustomize -spec: - selector: - matchLabels: - control-plane: task-manager - replicas: 1 - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: task-manager - spec: - # TODO(user): Uncomment the following code to configure the nodeAffinity expression - # according to the platforms which are supported by your solution. - # It is considered best practice to support multiple architectures. You can - # build your manager image using the makefile target docker-buildx. - # affinity: - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/arch - # operator: In - # values: - # - amd64 - # - arm64 - # - ppc64le - # - s390x - # - key: kubernetes.io/os - # operator: In - # values: - # - linux - hostNetwork: true - securityContext: - runAsNonRoot: true - # TODO(user): For common cases that do not require escalating privileges - # it is recommended to ensure that all your Pods/Containers are restrictive. - # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted - # Please uncomment the following code if your project does NOT have to work on old Kubernetes - # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). - # seccompProfile: - # type: RuntimeDefault - containers: - - command: - - /manager - args: - - --leader-elect - - --health-probe-bind-address=:9080 - image: task-manager:latest - name: manager - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - livenessProbe: - httpGet: - path: /healthz - port: 9080 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 9080 - initialDelaySeconds: 5 - periodSeconds: 10 - # TODO(user): Configure the resources accordingly based on the project requirements. - # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi - serviceAccountName: controller-manager - terminationGracePeriodSeconds: 10 ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: environment-manager - namespace: system - labels: - control-plane: environment-manager - app.kubernetes.io/name: deployment - app.kubernetes.io/instance: environment-manager - app.kubernetes.io/component: manager - app.kubernetes.io/created-by: operator - app.kubernetes.io/part-of: operator - app.kubernetes.io/managed-by: kustomize -spec: - selector: - matchLabels: - control-plane: environment-manager - replicas: 1 - template: - metadata: - annotations: - kubectl.kubernetes.io/default-container: manager - labels: - control-plane: environment-manager - spec: - # TODO(user): Uncomment the following code to configure the nodeAffinity expression - # according to the platforms which are supported by your solution. - # It is considered best practice to support multiple architectures. You can - # build your manager image using the makefile target docker-buildx. - # affinity: - # nodeAffinity: - # requiredDuringSchedulingIgnoredDuringExecution: - # nodeSelectorTerms: - # - matchExpressions: - # - key: kubernetes.io/arch - # operator: In - # values: - # - amd64 - # - arm64 - # - ppc64le - # - s390x - # - key: kubernetes.io/os - # operator: In - # values: - # - linux - hostNetwork: true - imagePullSecrets: - - name: gitlab-registry-secret - securityContext: - runAsNonRoot: true - # TODO(user): For common cases that do not require escalating privileges - # it is recommended to ensure that all your Pods/Containers are restrictive. - # More info: https://kubernetes.io/docs/concepts/security/pod-security-standards/#restricted - # Please uncomment the following code if your project does NOT have to work on old Kubernetes - # versions < 1.19 or on vendors versions which do NOT support this field by default (i.e. Openshift < 4.11 ). - # seccompProfile: - # type: RuntimeDefault - containers: - - command: - - /manager - args: - - --leader-elect - - --health-probe-bind-address=:8081 - image: environment-manager:latest - name: manager - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - livenessProbe: - httpGet: - path: /healthz - port: 9083 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 9083 - initialDelaySeconds: 5 - periodSeconds: 10 - # TODO(user): Configure the resources accordingly based on the project requirements. - # More info: https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi - serviceAccountName: controller-manager - terminationGracePeriodSeconds: 10 diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 16bf76e34..1983a5224 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -23,39 +23,42 @@ spec: control-plane: task-manager spec: hostNetwork: true + imagePullSecrets: + - name: gitlab-registry-secret securityContext: runAsNonRoot: true containers: - - command: - - /manager - args: - - --leader-elect - - --health-probe-bind-address=:9080 - image: task-manager:latest - name: manager - securityContext: - allowPrivilegeEscalation: false - capabilities: - drop: - - "ALL" - livenessProbe: - httpGet: - path: /healthz - port: 9080 - initialDelaySeconds: 15 - periodSeconds: 20 - readinessProbe: - httpGet: - path: /readyz - port: 9080 - initialDelaySeconds: 5 - periodSeconds: 10 - resources: - limits: - cpu: 500m - memory: 128Mi - requests: - cpu: 10m - memory: 64Mi + - command: + - /manager + args: + - --leader-elect + - --health-probe-bind-address=:9082 + - --metrics-bind-address=:9083 + image: task-manager:latest + name: manager + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - "ALL" + livenessProbe: + httpGet: + path: /healthz + port: 9082 + initialDelaySeconds: 15 + periodSeconds: 20 + readinessProbe: + httpGet: + path: /readyz + port: 9082 + initialDelaySeconds: 5 + periodSeconds: 10 + resources: + limits: + cpu: 500m + memory: 128Mi + requests: + cpu: 10m + memory: 64Mi serviceAccountName: controller-manager terminationGracePeriodSeconds: 10 diff --git a/control-operator/ecs-manifests/environment/test_env.yaml b/control-operator/ecs-manifests/environment/test_env.yaml index 2caafa1ff..599d587b9 100644 --- a/control-operator/ecs-manifests/environment/test_env.yaml +++ b/control-operator/ecs-manifests/environment/test_env.yaml @@ -7,34 +7,34 @@ taskTemplates: tasks: mtichak-ost.cern.ch: # mtichak-xps-cern: - - name: readout - argsCLI: - - consul-ini://mtichak-ost.cern.ch:8500/o2/components/readout/ANY/any/readout-stfb-mtichak-ost - argsTransition: - chans.readout.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94og - chans.readout.0.autoBind: "0" - chans.readout.0.method: bind - chans.readout.0.rateLogging: "0" - chans.readout.0.rcvBufSize: "1000" - chans.readout.0.rcvKernelSize: "0" - chans.readout.0.sndBufSize: "1000" - chans.readout.0.sndKernelSize: "0" - chans.readout.0.transport: shmem - chans.readout.0.type: push - chans.readout.numSockets: "1" - environment_id: 31jdWLL4XL6 - Orbit-Reset-Time: "" - env: - - name: O2_DETECTOR - value: TST - - name: O2_PARTITION - value: 31jdWLL4XL6 - - name: OCC_CONTROL_PORT - value: "31000" - - name: O2_SYSTEM - value: FLP - - name: O2_ROLE - value: mtichak-ost + # - name: readout + # argsCLI: + # - consul-ini://mtichak-ost.cern.ch:8500/o2/components/readout/ANY/any/readout-stfb-mtichak-ost + # argsTransition: + # chans.readout.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94og + # chans.readout.0.autoBind: "0" + # chans.readout.0.method: bind + # chans.readout.0.rateLogging: "0" + # chans.readout.0.rcvBufSize: "1000" + # chans.readout.0.rcvKernelSize: "0" + # chans.readout.0.sndBufSize: "1000" + # chans.readout.0.sndKernelSize: "0" + # chans.readout.0.transport: shmem + # chans.readout.0.type: push + # chans.readout.numSockets: "1" + # environment_id: 31jdWLL4XL6 + # Orbit-Reset-Time: "" + # env: + # - name: O2_DETECTOR + # value: TST + # - name: O2_PARTITION + # value: 31jdWLL4XL6 + # - name: OCC_CONTROL_PORT + # value: "31000" + # - name: O2_SYSTEM + # value: FLP + # - name: O2_ROLE + # value: mtichak-ost - name: stfbuilder-senderoutput argsCLI: @@ -186,4 +186,79 @@ taskTemplates: spec: state: standby - tasks: {} + tasks: + mtichak-ost.cern.ch: + - name: readout + spec: + pod: + hostNetwork: true + hostIPC: true + containers: + - name: readout + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 + command: ["/opt/o2/bin/o2-readout-exe"] + args: + - consul-ini://mtichak-ost.cern.ch:8500/o2/components/readout/ANY/any/readout-stfb-mtichak-ost + env: + - name: O2_DETECTOR + value: TST + - name: O2_PARTITION + value: 31jdWLL4XL6 + - name: OCC_CONTROL_PORT + value: "31000" + - name: O2_SYSTEM + value: FLP + - name: O2_ROLE + value: mtichak-ost + securityContext: + privileged: true + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "direct" + port: 31000 + arguments: + chans.readout.0.address: ipc://@o2ipc-d73tvau8ndm8ddkd94og + chans.readout.0.autoBind: "0" + chans.readout.0.method: bind + chans.readout.0.rateLogging: "0" + chans.readout.0.rcvBufSize: "1000" + chans.readout.0.rcvKernelSize: "0" + chans.readout.0.sndBufSize: "1000" + chans.readout.0.sndKernelSize: "0" + chans.readout.0.transport: shmem + chans.readout.0.type: push + chans.readout.numSockets: "1" + environment_id: 31jdWLL4XL6 + Orbit-Reset-Time: "" diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index b2393cd92..cc4a17e22 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -43,6 +43,7 @@ import ( "sigs.k8s.io/controller-runtime/pkg/reconcile" aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + "github.com/go-logr/logr" ) // EnvironmentReconciler reconciles a Environment object @@ -51,6 +52,130 @@ type EnvironmentReconciler struct { Scheme *runtime.Scheme } +func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, taskReferences []aliecsv1alpha1.TaskReference, + nodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, +) (*ctrl.Result, error) { + for _, taskReference := range taskReferences { + log.Info("geting stored template for task", "task", taskReference.Name) + template := &aliecsv1alpha1.TaskTemplate{} + if err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: taskReference.Name}, template); err != nil { + log.Error(err, "failed to get template for task", "task", taskReference.Name) + return &ctrl.Result{}, nil + } + + task := &aliecsv1alpha1.Task{} + task.Namespace = req.Namespace + task.Name = fmt.Sprintf("%s-%s", nodename, template.Name) + if err := r.Get(ctx, types.NamespacedName{Name: task.Name, Namespace: task.Namespace}, task); err == nil { + continue + } + + // TODO: N^2 change + for _, env := range template.Spec.EnvVars { + if !slices.ContainsFunc(taskReference.Env, func(envVar v1.EnvVar) bool { + return envVar.Name == env + }) { + log.Error(fmt.Errorf("didn't find required env: %s", env), "failed to fill in env vars from template") + return &reconcile.Result{}, nil + } + } + + task.Spec.Pod = *template.Spec.Pod.DeepCopy() + task.Spec.Control = *template.Spec.Control.DeepCopy() + + if foundIdx := slices.IndexFunc(taskReference.Env, func(envVar v1.EnvVar) bool { return envVar.Name == "OCC_CONTROL_PORT" }); foundIdx == -1 { + log.Error(fmt.Errorf("didn't find OCC_CONTROL_PORT in env"), "failed to fill in env vars from template") + } else { + port, err := strconv.Atoi(taskReference.Env[foundIdx].Value) + if err != nil { + log.Error(fmt.Errorf("found OCC_CONTROL_PORT isn't convertible to number "), "failed to fill in env vars from template") + return &reconcile.Result{}, nil + } + task.Spec.Control.Port = port + } + + if task.Spec.Arguments == nil { + task.Spec.Arguments = make(map[string]string) + } + + // TODO: check for containers! + task.Spec.Pod.Containers[0].Env = append(task.Spec.Pod.Containers[0].Env, taskReference.Env...) + task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) + maps.Copy(task.Spec.Arguments, taskReference.ArgsTransition) + + task.Spec.Pod.NodeName = nodename + task.Spec.State = environment.Spec.State + + task.Labels = labels(environment, nodename) + + if err := controllerutil.SetControllerReference(environment, task, r.Scheme); err != nil { + log.Error(err, "failed to set controller reference", "task", task.Name) + return &ctrl.Result{}, err + } + + if err := r.Create(ctx, task); err != nil { + if err = client.IgnoreAlreadyExists(err); err != nil { + log.Error(err, "Failed to create task on node", "nodename", nodename, "task", task.Name) + return &ctrl.Result{}, err + // TODO: add error handling + } + } + } + return nil, nil +} + +func (r *EnvironmentReconciler) runTaskFromDefinitionOnNode(ctx context.Context, taskDefs []aliecsv1alpha1.TaskDefinition, + nodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, +) (*ctrl.Result, error) { + for _, taskDef := range taskDefs { + task := &aliecsv1alpha1.Task{} + task.Namespace = req.Namespace + task.Name = fmt.Sprintf("%s-%s", nodename, taskDef.Name) + if err := r.Get(ctx, types.NamespacedName{Name: task.Name, Namespace: task.Namespace}, task); err == nil { + continue + } + + task.Spec.Pod = *taskDef.Spec.Pod.DeepCopy() + task.Spec.Control = *taskDef.Spec.Control.DeepCopy() + + if len(taskDef.Spec.Arguments) > 0 { + if task.Spec.Arguments == nil { + task.Spec.Arguments = make(map[string]string) + } + maps.Copy(task.Spec.Arguments, taskDef.Spec.Arguments) + } + + task.Spec.Pod.NodeName = nodename + task.Spec.State = environment.Spec.State + + task.Labels = labels(environment, nodename) + + if err := controllerutil.SetControllerReference(environment, task, r.Scheme); err != nil { + log.Error(err, "failed to set controller reference", "task", task.Name) + return &ctrl.Result{}, err + } + + if err := r.Create(ctx, task); err != nil { + if err = client.IgnoreAlreadyExists(err); err != nil { + log.Error(err, "Failed to create task on node", "nodename", nodename, "task", task.Name) + return &ctrl.Result{}, err + // TODO: add error handling + } + } + + } + + return nil, nil +} + +// create label to bunch tasks to the environment and node +func labels(environment *aliecsv1alpha1.Environment, nodename string) map[string]string { + return map[string]string{ + "environment": environment.Name, + "node": nodename, + } +} + // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/status,verbs=get;update;patch // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/finalizers,verbs=update @@ -69,125 +194,67 @@ type EnvironmentReconciler struct { func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := logf.FromContext(ctx) - env := &aliecsv1alpha1.Environment{} - if err := r.Get(ctx, req.NamespacedName, env); err != nil { + environment := &aliecsv1alpha1.Environment{} + if err := r.Get(ctx, req.NamespacedName, environment); err != nil { return ctrl.Result{}, client.IgnoreNotFound(err) } - if env.Status.State == "" { - for nodename, tasks := range env.TaskTemplates.Tasks { - log.Info("creating tasks for hostname", "hostname", nodename, "number of tasks", len(tasks)) - - for _, taskReference := range tasks { - log.Info("geting stored template for task", "task", taskReference.Name) - template := &aliecsv1alpha1.TaskTemplate{} - if err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: taskReference.Name}, template); err != nil { - log.Error(err, "failed to get template for task", "task", taskReference.Name) - return ctrl.Result{}, nil - } - - node := &v1.Node{} - if err := r.Get(ctx, types.NamespacedName{Name: nodename}, node); err != nil { - if k8serrors.IsNotFound(err) { - return ctrl.Result{}, fmt.Errorf("node %s not found in cluster", nodename) - } - return ctrl.Result{}, err - } - - task := &aliecsv1alpha1.Task{} - task.Name = fmt.Sprintf("%s-%s", nodename, template.Name) - task.Namespace = req.Namespace - if err := r.Get(ctx, types.NamespacedName{Name: task.Name, Namespace: task.Namespace}, task); err == nil { - continue - } - - // TODO: N^2 change - for _, env := range template.Spec.EnvVars { - if !slices.ContainsFunc(taskReference.Env, func(envVar v1.EnvVar) bool { - return envVar.Name == env - }) { - - log.Error(fmt.Errorf("didn't find required env: %s", env), "failed to fill in env vars from template") - return reconcile.Result{}, nil - } - } - - task.Spec.Pod = *template.Spec.Pod.DeepCopy() - task.Spec.Control = *template.Spec.Control.DeepCopy() - - if foundIdx := slices.IndexFunc(taskReference.Env, func(envVar v1.EnvVar) bool { return envVar.Name == "OCC_CONTROL_PORT" }); foundIdx == -1 { - log.Error(fmt.Errorf("didn't find OCC_CONTROL_PORT in env"), "failed to fill in env vars from template") - } else { - port, err := strconv.Atoi(taskReference.Env[foundIdx].Value) - if err != nil { - log.Error(fmt.Errorf("found OCC_CONTROL_PORT isn't convertible to number "), "failed to fill in env vars from template") - return reconcile.Result{}, nil - } - task.Spec.Control.Port = port - } - - if task.Spec.Arguments == nil { - task.Spec.Arguments = make(map[string]string) - } - - // TODO: check for containers! - task.Spec.Pod.Containers[0].Env = append(task.Spec.Pod.Containers[0].Env, taskReference.Env...) - task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) - maps.Copy(task.Spec.Arguments, taskReference.ArgsTransition) - - task.Spec.Pod.NodeName = nodename - task.Spec.State = env.Spec.State - - // create label to bunch tasks to the environment - task.Labels = map[string]string{"environment": env.Name} - - if err := controllerutil.SetControllerReference(env, task, r.Scheme); err != nil { - log.Error(err, "failed to set controller reference", "task", task.Name) - return ctrl.Result{}, err - } - - if err := r.Create(ctx, task); err != nil { - if err = client.IgnoreAlreadyExists(err); err != nil { - log.Error(err, "Failed to create task on node", "nodename", nodename, "task", task.Name) - // TODO: add error handling - } - } + if environment.Status.State == "" { + for nodename, tasksReferences := range environment.TaskTemplates.Tasks { + log.Info("creating tasks for hostname from references", "hostname", nodename, "number of tasks", len(tasksReferences)) + if res, err := r.checkNodeExistence(ctx, nodename); err != nil { + return res, err + } + + if res, err := r.runTasksFromReferenceOnNode(ctx, tasksReferences, nodename, req, environment, log); res != nil { + return *res, err + } + } + + for nodename, taskTemplates := range environment.Spec.Tasks { + log.Info("creating tasks for hostname from definitions", "hostname", nodename, "number of tasks", len(taskTemplates)) + if res, err := r.checkNodeExistence(ctx, nodename); err != nil { + return res, err + } + + if res, err := r.runTaskFromDefinitionOnNode(ctx, taskTemplates, nodename, req, environment, log); res != nil { + return *res, err } } } tasks := &aliecsv1alpha1.TaskList{} - if err := r.List(ctx, tasks, client.InNamespace(env.Namespace), client.MatchingLabels{"environment": env.Name}); err != nil { + if err := r.List(ctx, tasks, client.InNamespace(environment.Namespace), client.MatchingLabels{"environment": environment.Name}); err != nil { log.Error(err, "failed to get list of tasks for this environment") return ctrl.Result{}, err } - if env.Status.Tasks == nil { - env.Status.Tasks = make(map[string]map[string]string) + if environment.Status.Tasks == nil { + environment.Status.Tasks = make(map[string]map[string]string) } for _, task := range tasks.Items { nodename := task.Spec.Pod.NodeName - if env.Status.Tasks[nodename] == nil { - env.Status.Tasks[nodename] = make(map[string]string) + if environment.Status.Tasks[nodename] == nil { + environment.Status.Tasks[nodename] = make(map[string]string) } - env.Status.Tasks[nodename][task.Name] = task.Status.State + environment.Status.Tasks[nodename][task.Name] = task.Status.State } - env.Status.State = aggregateState(tasks.Items, env.Status.State) + environment.Status.State = aggregateState(tasks.Items, environment.Status.State) for _, task := range tasks.Items { - if task.Spec.State != env.Spec.State { + if task.Spec.State != environment.Spec.State { patch := client.MergeFrom(task.DeepCopy()) - task.Spec.State = env.Spec.State + task.Spec.State = environment.Spec.State if err := r.Patch(ctx, &task, patch); err != nil { log.Error(err, "failed to patch task state", "task", task.Name) } } } - if err := r.Status().Update(ctx, env); err != nil { + if err := r.Status().Update(ctx, environment); err != nil { if k8serrors.IsConflict(err) { return ctrl.Result{Requeue: true}, nil } @@ -198,6 +265,17 @@ func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, nil } +func (r *EnvironmentReconciler) checkNodeExistence(ctx context.Context, nodename string) (ctrl.Result, error) { + node := &v1.Node{} + if err := r.Get(ctx, types.NamespacedName{Name: nodename}, node); err != nil { + if k8serrors.IsNotFound(err) { + return ctrl.Result{}, fmt.Errorf("node %s not found in cluster", nodename) + } + return ctrl.Result{}, err + } + return ctrl.Result{}, nil +} + func aggregateState(tasks []aliecsv1alpha1.Task, previousState string) string { if len(tasks) == 0 { return previousState diff --git a/control-operator/internal/controller/environment_controller_test.go b/control-operator/internal/controller/environment_controller_test.go index 2e23165f4..fc56bac42 100644 --- a/control-operator/internal/controller/environment_controller_test.go +++ b/control-operator/internal/controller/environment_controller_test.go @@ -61,7 +61,7 @@ var _ = Describe("Environment Controller", func() { }, Spec: aliecsv1alpha1.EnvironmentSpec{ State: "standby", - Tasks: map[string][]aliecsv1alpha1.TaskTemplate{}, + Tasks: map[string][]aliecsv1alpha1.TaskDefinition{}, }, TaskTemplates: aliecsv1alpha1.TemplateSpecification{ Tasks: map[string][]aliecsv1alpha1.TaskReference{}, From 81a1fcae94772f02803039c6aa8e01d19c0a9524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 11 May 2026 15:10:00 +0200 Subject: [PATCH 2282/2352] [OCTRL-1088] rename author and properly handling TaskController as a daemon set --- control-operator/Makefile | 13 +- control-operator/README.md | 28 +++- .../api/v1alpha1/environment_types.go | 6 +- .../api/v1alpha1/tasktemplate_types.go | 4 +- .../cmd/environment-manager/main.go | 4 +- control-operator/cmd/main.go | 124 ------------------ control-operator/cmd/task-manager/main.go | 12 +- .../manager/task-manager/task-manager.yaml | 6 +- .../controller/environment_controller.go | 7 +- .../controller/environment_controller_test.go | 4 +- .../internal/controller/task_controller.go | 13 +- 11 files changed, 73 insertions(+), 148 deletions(-) delete mode 100644 control-operator/cmd/main.go diff --git a/control-operator/Makefile b/control-operator/Makefile index 31f0668ab..d178965b7 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -97,7 +97,7 @@ help: ## Display this help. ##@ Development .PHONY: manifests -manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. +manifests: controller-gen generate-proto ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects. # Note that the option maxDescLen=0 was added in the default scaffold in order to sort out the issue # Too long: must have at most 262144 bytes. By using kubectl apply to create / update resources an annotation # is created by K8s API to store the latest version of the resource ( kubectl.kubernetes.io/last-applied-configuration). @@ -220,8 +220,15 @@ deploy-environment: manifests kustomize ## Deploy environment controller to the $(KUSTOMIZE) build config/environment | $(KUBECTL) apply -f - --server-side .PHONY: undeploy -undeploy: ## Undeploy both controllers from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. - $(KUSTOMIZE) build config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - +undeploy: undeploy-task undeploy-environment ## Undeploy both controllers from the K8s cluster specified in ~/.kube/config. + +.PHONY: undeploy-task +undeploy-task: kustomize ## Undeploy task controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/task | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - + +.PHONY: undeploy-environment +undeploy-environment: kustomize ## Undeploy environment controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion. + $(KUSTOMIZE) build config/environment | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f - ##@ Build Dependencies diff --git a/control-operator/README.md b/control-operator/README.md index 852a2aa5b..208ff6b67 100644 --- a/control-operator/README.md +++ b/control-operator/README.md @@ -8,6 +8,14 @@ In order to deploy Task and Environment workflows to the k8s cluster you need co controlling custom CRDs defining ALICE custom workload. This Folder defines and implements all moving parts together with Makefile to build, deploy, install CRDs and operators. +## Architecture + +The operator is split into two separate binaries with different deployment strategies: + +**task-manager** runs as a DaemonSet — one pod per node. Each pod is responsible only for `Task` resources assigned to its node (matched via `spec.nodeName`). This is necessary because the task-manager communicates with OCC gRPC processes running locally on the same node via `hostNetwork`. + +**environment-manager** runs as a Deployment with a single replica per cluster. It is responsible for `Environment` resources which are cluster-scoped and not tied to a specific node. + ## Getting Started You’ll need a Kubernetes cluster to run against. You can use [KIND](https://sigs.k8s.io/kind) to get a local cluster for testing, or run against a remote cluster. Author had the most success with K3s [see](/docs/kubernetes_ecs.md). @@ -23,16 +31,16 @@ Following commands show basic use of Makefile. However this isn't exhaustive lis kubectl apply -f config/samples/ ``` -1. Build and push your image to the location specified by `IMG`: +1. Build and push your images. Default image tags are defined in the Makefile via `TASK_IMG` and `ENVIRONMENT_IMG`. Override them only if you want to use a different registry or tag: ```sh -make docker-build docker-push IMG=/operator:tag +make docker-build docker-push TASK_IMG=/task-manager:tag ENVIRONMENT_IMG=/environment-manager:tag ``` -1. Deploy the controller to the cluster with the image specified by `IMG`: +1. Deploy the controllers to the cluster. Uses the same `TASK_IMG` and `ENVIRONMENT_IMG` defaults, override them if needed: ```sh -make deploy IMG=/operator:tag +make deploy TASK_IMG=/task-manager:tag ENVIRONMENT_IMG=/environment-manager:tag ``` ### Uninstall CRDs @@ -70,13 +78,19 @@ which provide a reconcile function responsible for synchronizing resources until make install ``` -1. Run your controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): +1. Run a controller (this will run in the foreground, so switch to a new terminal if you want to leave it running): + +```sh +make run-environment +``` + +The task-manager requires a `NODE_NAME` environment variable to know which node it is responsible for. In-cluster this is injected automatically via the downward API. When running locally you must set it manually: ```sh -make run +NODE_NAME= make run-task ``` -**NOTE:** You can also run this in one step by running: `make install run` +**NOTE:** You can also install CRDs and run in one step: `make install run-environment` or `make install run-task` ### Modifying the API definitions diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go index 6bba53677..0abb6ffba 100644 --- a/control-operator/api/v1alpha1/environment_types.go +++ b/control-operator/api/v1alpha1/environment_types.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -66,6 +66,8 @@ type EnvironmentStatus struct { // - "Progressing": the resource is being created or updated // - "Degraded": the resource failed to reach or maintain its desired state // + // TODO: use conditions properly during deployment + // // The status of each condition is one of True, False, or Unknown. // +listType=map // +listMapKey=type diff --git a/control-operator/api/v1alpha1/tasktemplate_types.go b/control-operator/api/v1alpha1/tasktemplate_types.go index 69ba168a7..29e510324 100644 --- a/control-operator/api/v1alpha1/tasktemplate_types.go +++ b/control-operator/api/v1alpha1/tasktemplate_types.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/control-operator/cmd/environment-manager/main.go b/control-operator/cmd/environment-manager/main.go index a117ec878..9033f8610 100644 --- a/control-operator/cmd/environment-manager/main.go +++ b/control-operator/cmd/environment-manager/main.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/control-operator/cmd/main.go b/control-operator/cmd/main.go deleted file mode 100644 index 22c18da52..000000000 --- a/control-operator/cmd/main.go +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2024. - -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 main - -import ( - "flag" - "os" - - // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.) - // to ensure that exec-entrypoint and run can make use of them. - "k8s.io/apimachinery/pkg/runtime" - utilruntime "k8s.io/apimachinery/pkg/util/runtime" - clientgoscheme "k8s.io/client-go/kubernetes/scheme" - _ "k8s.io/client-go/plugin/pkg/client/auth" - ctrl "sigs.k8s.io/controller-runtime" - "sigs.k8s.io/controller-runtime/pkg/healthz" - "sigs.k8s.io/controller-runtime/pkg/log/zap" - "sigs.k8s.io/controller-runtime/pkg/metrics/server" - "sigs.k8s.io/controller-runtime/pkg/webhook" - - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" - "github.com/AliceO2Group/Control/operator/internal/controller" - //+kubebuilder:scaffold:imports -) - -var ( - scheme = runtime.NewScheme() - setupLog = ctrl.Log.WithName("setup") -) - -func init() { - utilruntime.Must(clientgoscheme.AddToScheme(scheme)) - - utilruntime.Must(aliecsv1alpha1.AddToScheme(scheme)) - //+kubebuilder:scaffold:scheme -} - -func main() { - var metricsAddr string - var enableLeaderElection bool - var probeAddr string - flag.StringVar(&metricsAddr, "metrics-bind-address", ":9080", "The address the metric endpoint binds to.") - flag.StringVar(&probeAddr, "health-probe-bind-address", ":9081", "The address the probe endpoint binds to.") - flag.BoolVar(&enableLeaderElection, "leader-elect", false, - "Enable leader election for controller manager. "+ - "Enabling this will ensure there is only one active controller manager.") - opts := zap.Options{ - Development: true, - } - opts.BindFlags(flag.CommandLine) - flag.Parse() - - ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts))) - - mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{ - Scheme: scheme, - Metrics: server.Options{BindAddress: metricsAddr}, - HealthProbeBindAddress: probeAddr, - LeaderElection: enableLeaderElection, - LeaderElectionID: "03b91661.alice.cern", - WebhookServer: webhook.NewServer(webhook.Options{Port: 9443}), - // LeaderElectionReleaseOnCancel defines if the leader should step down voluntarily - // when the Manager ends. This requires the binary to immediately end when the - // Manager is stopped, otherwise, this setting is unsafe. Setting this significantly - // speeds up voluntary leader transitions as the new leader don't have to wait - // LeaseDuration time first. - // - // In the default scaffold provided, the program ends immediately after - // the manager stops, so would be fine to enable this option. However, - // if you are doing or is intended to do any operation such as perform cleanups - // after the manager stops then its usage might be unsafe. - // LeaderElectionReleaseOnCancel: true, - }) - if err != nil { - setupLog.Error(err, "unable to start manager") - os.Exit(1) - } - - if err = (&controller.TaskReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("task-controller"), // used within reconcile method to emit events - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "unable to create controller", "controller", "Task") - os.Exit(1) - } - if err := (&controller.EnvironmentReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - }).SetupWithManager(mgr); err != nil { - setupLog.Error(err, "Failed to create controller", "controller", "Environment") - os.Exit(1) - } - //+kubebuilder:scaffold:builder - - if err := mgr.AddHealthzCheck("healthz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up health check") - os.Exit(1) - } - if err := mgr.AddReadyzCheck("readyz", healthz.Ping); err != nil { - setupLog.Error(err, "unable to set up ready check") - os.Exit(1) - } - - setupLog.Info("starting manager") - if err := mgr.Start(ctrl.SetupSignalHandler()); err != nil { - setupLog.Error(err, "problem running manager") - os.Exit(1) - } -} diff --git a/control-operator/cmd/task-manager/main.go b/control-operator/cmd/task-manager/main.go index 5810d7bd7..b1d171b53 100644 --- a/control-operator/cmd/task-manager/main.go +++ b/control-operator/cmd/task-manager/main.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -26,6 +26,7 @@ package main import ( "flag" + "fmt" "os" "k8s.io/apimachinery/pkg/runtime" @@ -82,10 +83,17 @@ func main() { os.Exit(1) } + nodeName := os.Getenv("NODE_NAME") + if nodeName == "" { + setupLog.Error(fmt.Errorf("NODE_NAME environment variable not set"), "NODE_NAME is required") + os.Exit(1) + } + if err = (&controller.TaskReconciler{ Client: mgr.GetClient(), Scheme: mgr.GetScheme(), Recorder: mgr.GetEventRecorderFor("task-controller"), + NodeName: nodeName, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Task") os.Exit(1) diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 1983a5224..09c538cc5 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -31,9 +31,13 @@ spec: - command: - /manager args: - - --leader-elect - --health-probe-bind-address=:9082 - --metrics-bind-address=:9083 + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName image: task-manager:latest name: manager securityContext: diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index cc4a17e22..8455d997d 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -83,8 +83,11 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, task.Spec.Pod = *template.Spec.Pod.DeepCopy() task.Spec.Control = *template.Spec.Control.DeepCopy() + // TODO: regarding error handling. Is it correct to stop while handling one task? this will fail the whole deployment, + // which might not be desirable outcome especially for non-critical tasks if foundIdx := slices.IndexFunc(taskReference.Env, func(envVar v1.EnvVar) bool { return envVar.Name == "OCC_CONTROL_PORT" }); foundIdx == -1 { log.Error(fmt.Errorf("didn't find OCC_CONTROL_PORT in env"), "failed to fill in env vars from template") + return &reconcile.Result{}, nil } else { port, err := strconv.Atoi(taskReference.Env[foundIdx].Value) if err != nil { diff --git a/control-operator/internal/controller/environment_controller_test.go b/control-operator/internal/controller/environment_controller_test.go index fc56bac42..dfadf48c2 100644 --- a/control-operator/internal/controller/environment_controller_test.go +++ b/control-operator/internal/controller/environment_controller_test.go @@ -1,8 +1,8 @@ /* * === This file is part of ALICE O² === * - * Copyright 2024 CERN and copyright holders of ALICE O². - * Author: Teo Mrnjavac + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 2d0e52eca..cbace7041 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -39,10 +39,12 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/client-go/tools/record" ctrl "sigs.k8s.io/controller-runtime" + "sigs.k8s.io/controller-runtime/pkg/builder" "sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/controller" "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/predicate" aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" "github.com/go-logr/logr" @@ -53,6 +55,7 @@ type TaskReconciler struct { client.Client Scheme *runtime.Scheme Recorder record.EventRecorder + NodeName string } var clientsForContainers map[string]*OccClient = make(map[string]*OccClient) @@ -368,7 +371,15 @@ func isPodFailed(pod *v1.Pod) (bool, string) { // SetupWithManager sets up the controller with the Manager. func (r *TaskReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). - For(&aliecsv1alpha1.Task{}). + For(&aliecsv1alpha1.Task{}, builder.WithPredicates( + predicate.NewPredicateFuncs(func(obj client.Object) bool { + task, ok := obj.(*aliecsv1alpha1.Task) + if !ok { + return false + } + return task.Spec.NodeName == r.NodeName + }), + )). Owns(&v1.Pod{}). WithOptions(controller.Options{MaxConcurrentReconciles: 1}). Complete(r) From 102699716514acd7f92536d3820b27cbf08d2f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Tue, 2 Jun 2026 09:08:19 +0200 Subject: [PATCH 2283/2352] Rename operator (#820) [operator] rename operator to control-operator --- control-operator/PROJECT | 8 ++++---- control-operator/cmd/environment-manager/main.go | 4 ++-- control-operator/cmd/task-manager/main.go | 4 ++-- control-operator/go.mod | 4 ++-- .../internal/controller/environment_controller.go | 2 +- .../internal/controller/environment_controller_test.go | 2 +- control-operator/internal/controller/fairmq_transition.go | 2 +- control-operator/internal/controller/grpc_client.go | 4 ++-- control-operator/internal/controller/suite_test.go | 2 +- control-operator/internal/controller/task_controller.go | 2 +- 10 files changed, 17 insertions(+), 17 deletions(-) diff --git a/control-operator/PROJECT b/control-operator/PROJECT index d89e1dce1..0f052ac36 100644 --- a/control-operator/PROJECT +++ b/control-operator/PROJECT @@ -9,7 +9,7 @@ plugins: manifests.sdk.operatorframework.io/v2: {} scorecard.sdk.operatorframework.io/v2: {} projectName: operator -repo: github.com/AliceO2Group/Control/operator +repo: github.com/AliceO2Group/Control/control-operator resources: - api: crdVersion: v1 @@ -18,7 +18,7 @@ resources: domain: alice.cern group: aliecs kind: Task - path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + path: github.com/AliceO2Group/Control/control-operator/api/v1alpha1 version: v1alpha1 - api: crdVersion: v1 @@ -27,7 +27,7 @@ resources: domain: alice.cern group: aliecs kind: Environment - path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + path: github.com/AliceO2Group/Control/control-operator/api/v1alpha1 version: v1alpha1 - api: crdVersion: v1 @@ -35,6 +35,6 @@ resources: domain: alice.cern group: aliecs kind: TaskTemplate - path: github.com/AliceO2Group/Control/operator/api/v1alpha1 + path: github.com/AliceO2Group/Control/control-operator/api/v1alpha1 version: v1alpha1 version: "3" diff --git a/control-operator/cmd/environment-manager/main.go b/control-operator/cmd/environment-manager/main.go index 9033f8610..bdc4cc342 100644 --- a/control-operator/cmd/environment-manager/main.go +++ b/control-operator/cmd/environment-manager/main.go @@ -38,8 +38,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/webhook" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" - "github.com/AliceO2Group/Control/operator/internal/controller" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + "github.com/AliceO2Group/Control/control-operator/internal/controller" ) var ( diff --git a/control-operator/cmd/task-manager/main.go b/control-operator/cmd/task-manager/main.go index b1d171b53..046a0b6f9 100644 --- a/control-operator/cmd/task-manager/main.go +++ b/control-operator/cmd/task-manager/main.go @@ -39,8 +39,8 @@ import ( "sigs.k8s.io/controller-runtime/pkg/metrics/server" "sigs.k8s.io/controller-runtime/pkg/webhook" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" - "github.com/AliceO2Group/Control/operator/internal/controller" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + "github.com/AliceO2Group/Control/control-operator/internal/controller" ) var ( diff --git a/control-operator/go.mod b/control-operator/go.mod index b95e4ec51..1a50ceea8 100644 --- a/control-operator/go.mod +++ b/control-operator/go.mod @@ -1,4 +1,4 @@ -module github.com/AliceO2Group/Control/operator +module github.com/AliceO2Group/Control/control-operator go 1.25.0 @@ -82,4 +82,4 @@ require ( sigs.k8s.io/yaml v1.6.0 // indirect ) -replace github.com/AliceO2Group/Control/operator/internal/controller/protos/generated => ./internal/controller/protos/generated +replace github.com/AliceO2Group/Control/control-operator/internal/controller/protos/generated => ./internal/controller/protos/generated diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index 8455d997d..c66ec38f4 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -42,7 +42,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/reconcile" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" "github.com/go-logr/logr" ) diff --git a/control-operator/internal/controller/environment_controller_test.go b/control-operator/internal/controller/environment_controller_test.go index dfadf48c2..8a7532f7f 100644 --- a/control-operator/internal/controller/environment_controller_test.go +++ b/control-operator/internal/controller/environment_controller_test.go @@ -35,7 +35,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" ) var _ = Describe("Environment Controller", func() { diff --git a/control-operator/internal/controller/fairmq_transition.go b/control-operator/internal/controller/fairmq_transition.go index ac58a50b6..1fe9cabfd 100644 --- a/control-operator/internal/controller/fairmq_transition.go +++ b/control-operator/internal/controller/fairmq_transition.go @@ -29,7 +29,7 @@ import ( "fmt" "strings" - pb "github.com/AliceO2Group/Control/operator/internal/controller/protos/generated" + pb "github.com/AliceO2Group/Control/control-operator/internal/controller/protos/generated" ) // FairMQ internal state names as used by the OCC plugin diff --git a/control-operator/internal/controller/grpc_client.go b/control-operator/internal/controller/grpc_client.go index a76310cb9..3b82f4e4f 100644 --- a/control-operator/internal/controller/grpc_client.go +++ b/control-operator/internal/controller/grpc_client.go @@ -39,8 +39,8 @@ import ( "google.golang.org/grpc/status" "k8s.io/apimachinery/pkg/types" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" - pb "github.com/AliceO2Group/Control/operator/internal/controller/protos/generated" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + pb "github.com/AliceO2Group/Control/control-operator/internal/controller/protos/generated" ) // jsonOccClient mirrors executor/executorcmd/nopb/occclient.go: uses short method diff --git a/control-operator/internal/controller/suite_test.go b/control-operator/internal/controller/suite_test.go index 7e57b8ab8..f9d2f5c41 100644 --- a/control-operator/internal/controller/suite_test.go +++ b/control-operator/internal/controller/suite_test.go @@ -38,7 +38,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/log/zap" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" //+kubebuilder:scaffold:imports ) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index cbace7041..ff3fc21f2 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -46,7 +46,7 @@ import ( logf "sigs.k8s.io/controller-runtime/pkg/log" "sigs.k8s.io/controller-runtime/pkg/predicate" - aliecsv1alpha1 "github.com/AliceO2Group/Control/operator/api/v1alpha1" + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" "github.com/go-logr/logr" ) From d4aee23f01f8a7820e7a298a96a003f19ad82b90 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:27:39 +0200 Subject: [PATCH 2284/2352] Bump google.golang.org/grpc from 1.62.1 to 1.79.3 (#806) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.62.1 to 1.79.3. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.62.1...v1.79.3) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-version: 1.79.3 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 31 +++++++++++------------ go.sum | 78 ++++++++++++++++++++++++++++++++++------------------------ 2 files changed, 61 insertions(+), 48 deletions(-) diff --git a/go.mod b/go.mod index c47808e51..411d2eda7 100644 --- a/go.mod +++ b/go.mod @@ -58,12 +58,12 @@ require ( github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.45.0 - golang.org/x/net v0.47.0 - golang.org/x/sys v0.38.0 - google.golang.org/grpc v1.62.1 + golang.org/x/crypto v0.46.0 + golang.org/x/net v0.48.0 + golang.org/x/sys v0.39.0 + google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.34.1 + google.golang.org/protobuf v1.36.10 gopkg.in/yaml.v3 v3.0.1 ) @@ -87,17 +87,17 @@ require ( github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/cyphar/filepath-securejoin v0.4.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect - github.com/envoyproxy/protoc-gen-validate v1.0.4 // indirect + github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.6.2 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/spec v0.21.0 // indirect @@ -160,14 +160,13 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.29.0 // indirect - golang.org/x/sync v0.18.0 // indirect - golang.org/x/term v0.37.0 // indirect - golang.org/x/text v0.31.0 // indirect - golang.org/x/tools v0.38.0 // indirect - google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 // indirect + golang.org/x/mod v0.30.0 // indirect + golang.org/x/sync v0.19.0 // indirect + golang.org/x/term v0.38.0 // indirect + golang.org/x/text v0.32.0 // indirect + golang.org/x/tools v0.39.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 70b2612e7..aad1dfe3a 100644 --- a/go.sum +++ b/go.sum @@ -34,8 +34,8 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/briandowns/spinner v1.23.0 h1:alDF2guRWqa/FOZZYWjlMIx2L6H0wyewPxo/CH4Pt2A= github.com/briandowns/spinner v1.23.0/go.mod h1:rPG4gmXeN3wQV/TsAY4w8lPdIM6RX3yqeBQJSrbXjuE= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= @@ -59,8 +59,8 @@ github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= -github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= +github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= +github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= github.com/expr-lang/expr v1.17.7 h1:Q0xY/e/2aCIp8g9s/LGvMDCC5PxYlvHgDZRQ4y16JX8= github.com/expr-lang/expr v1.17.7/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -96,8 +96,10 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= @@ -440,6 +442,18 @@ github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= @@ -450,16 +464,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= -golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= +golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= +golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= +golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= +golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -474,8 +488,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= -golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= +golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= +golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -484,8 +498,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= -golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= +golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -519,16 +533,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= -golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= +golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= -golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= +golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= +golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -539,8 +553,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= -golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= +golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= +golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -549,24 +563,24 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= +golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80 h1:KAeGQVN3M9nD0/bQXnr/ClcEMJ968gUXJQ9pwfSynuQ= -google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqtv9gMOr0zHg2Vzff5ULhhL2IXP4sbcn32Dro= -google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= -google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237 h1:NnYq6UN9ReLM9/Y01KWNOWyI5xQ9kbIms5GGJVwS/Yc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/grpc v1.62.1 h1:B4n+nfKzOICUXMgyrNd19h/I9oH0L1pizfk1d4zSgTk= -google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 7f4f6dfc2266404bc18b96d662d20f5ec5a8132a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 10:52:19 +0200 Subject: [PATCH 2285/2352] Bump go to 1.25.0 and github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 (#819) Bump github.com/go-git/go-git/v5 from 5.16.5 to 5.19.1 Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.16.5 to 5.19.1. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.16.5...v5.19.1) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 29 +++++++++++++++-------------- go.sum | 58 ++++++++++++++++++++++++++++++---------------------------- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/go.mod b/go.mod index 411d2eda7..9800a9572 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/AliceO2Group/Control -go 1.24.2 +go 1.25.0 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt @@ -30,7 +30,7 @@ require ( github.com/dmarkham/enumer v1.5.11 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.7.4 - github.com/go-git/go-git/v5 v5.16.5 + github.com/go-git/go-git/v5 v5.19.1 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 @@ -58,9 +58,9 @@ require ( github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.46.0 - golang.org/x/net v0.48.0 - golang.org/x/sys v0.39.0 + golang.org/x/crypto v0.50.0 + golang.org/x/net v0.53.0 + golang.org/x/sys v0.43.0 google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.36.10 @@ -79,7 +79,7 @@ require ( github.com/onsi/gomega v1.34.1 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.3 - golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 + golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f ) require ( @@ -90,13 +90,13 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect - github.com/cyphar/filepath-securejoin v0.4.1 // indirect + github.com/cyphar/filepath-securejoin v0.6.1 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.6.2 // indirect + github.com/go-git/go-billy/v5 v5.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect @@ -122,6 +122,7 @@ require ( github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -139,7 +140,7 @@ require ( github.com/pascaldekloe/name v1.0.1 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect - github.com/pjbgf/sha1cd v0.3.2 // indirect + github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.50.0 // indirect @@ -160,11 +161,11 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.30.0 // indirect - golang.org/x/sync v0.19.0 // indirect - golang.org/x/term v0.38.0 // indirect - golang.org/x/text v0.32.0 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/mod v0.35.0 // indirect + golang.org/x/sync v0.20.0 // indirect + golang.org/x/term v0.42.0 // indirect + golang.org/x/text v0.36.0 // indirect + golang.org/x/tools v0.44.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index aad1dfe3a..da0b3cb44 100644 --- a/go.sum +++ b/go.sum @@ -45,8 +45,8 @@ github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.4.1 h1:JyxxyPEaktOD+GAnqIqTf9A8tHyAG22rowi7HkoSU1s= -github.com/cyphar/filepath-securejoin v0.4.1/go.mod h1:Sdj7gXlvMcPZsbhwhQ33GguGLDGQL7h7bg04C/+u9jI= +github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= +github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -86,12 +86,12 @@ github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.6.2 h1:6Q86EsPXMa7c3YZ3aLAQsMA0VlWmy43r6FHqa/UNbRM= -github.com/go-git/go-billy/v5 v5.6.2/go.mod h1:rcFC2rAsp/erv7CMz9GczHcuD0D32fWzH+MJAU+jaUU= +github.com/go-git/go-billy/v5 v5.9.0 h1:jItGXszUDRtR/AlferWPTMN4j38BQ88XnXKbilmmBPA= +github.com/go-git/go-billy/v5 v5.9.0/go.mod h1:jCnQMLj9eUgGU7+ludSTYoZL/GGmii14RxKFj7ROgHw= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.16.5 h1:mdkuqblwr57kVfXri5TTH+nMFLNUxIj9Z7F5ykFbw5s= -github.com/go-git/go-git/v5 v5.16.5/go.mod h1:QOMLpNf1qxuSY4StA/ArOdfFR2TrKEjJiye2kel2m+M= +github.com/go-git/go-git/v5 v5.19.1 h1:nX27AnaU43/K5bKktKwgBmR9lawoYVe1Ckg0rgzzN00= +github.com/go-git/go-git/v5 v5.19.1/go.mod h1:Pb1v0c7/g8aGQJwx9Us09W85yGoyvSwuhEGMH7zjDKQ= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -225,6 +225,8 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -315,8 +317,8 @@ github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdU github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ= github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= -github.com/pjbgf/sha1cd v0.3.2 h1:a9wb0bp1oC2TGwStyn0Umc/IGKQnEgF0vVaZ8QF8eo4= -github.com/pjbgf/sha1cd v0.3.2/go.mod h1:zQWigSxVmsHEZow5qaLtPYxpcKMMQpa09ixqBxuCS6A= +github.com/pjbgf/sha1cd v0.6.0 h1:3WJ8Wz8gvDz29quX1OcEmkAlUg9diU4GxJHqs0/XiwU= +github.com/pjbgf/sha1cd v0.6.0/go.mod h1:lhpGlyHLpQZoxMv8HcgXvZEhcGs0PG/vsZnEJ7H0iCM= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -410,8 +412,8 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/swaggo/files/v2 v2.0.0 h1:hmAt8Dkynw7Ssz46F6pn8ok6YmGZqHSVLZ+HQM7i0kw= @@ -464,16 +466,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8= -golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= +golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -488,8 +490,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -498,8 +500,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4= -golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -533,16 +535,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -553,8 +555,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -563,8 +565,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 0169f7f7402f47492daac5a70fe2c9216e141668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Thu, 2 Jul 2026 16:28:57 +0200 Subject: [PATCH 2286/2352] Setting proper platform for control-operator builds (#823) [control-operator] setting platform as linux for manager container builds --- control-operator/Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/control-operator/Makefile b/control-operator/Makefile index d178965b7..992fe1162 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -158,11 +158,11 @@ docker-build: docker-build-task docker-build-environment ## Build all docker ima .PHONY: docker-build-task docker-build-task: test ## Build docker image for the task manager. - $(CONTAINER_TOOL) build --build-arg MANAGER=task-manager -t ${TASK_IMG} . + $(CONTAINER_TOOL) build --platform linux/amd64 --build-arg MANAGER=task-manager -t ${TASK_IMG} . .PHONY: docker-build-environment docker-build-environment: test ## Build docker image for the environment manager. - $(CONTAINER_TOOL) build --build-arg MANAGER=environment-manager -t ${ENVIRONMENT_IMG} . + $(CONTAINER_TOOL) build --platform linux/amd64 --build-arg MANAGER=environment-manager -t ${ENVIRONMENT_IMG} . .PHONY: docker-push docker-push: docker-push-task docker-push-environment ## Push all docker images. From 3cf91fbfb901591544b2f56a5f630074e192a6ce Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Fri, 3 Jul 2026 15:16:23 +0200 Subject: [PATCH 2287/2352] Update go version used in CI (#825) It was updated in go.mod, but I forgot to update it here. --- .github/workflows/control.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 5ad85275a..3b1fc2117 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [macOS-latest, ubuntu-24.04] - go: [ '1.24.2' ] + go: [ '1.25.0' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 From 17c0b199ad2bb87c8843f04fb51defa0f69271e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 8 Jul 2026 16:22:07 +0200 Subject: [PATCH 2288/2352] [control-operator] repeat if we failed to get state from occ task (#829) --- control-operator/internal/controller/task_controller.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index ff3fc21f2..daf1f32c7 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -160,7 +160,7 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. stateReply, err := client.GetState(ctx) if err != nil { log.Error(err, "Failed to GetState") - return ctrl.Result{}, nil + return ctrl.Result{RequeueAfter: 5 * time.Second}, nil } log.V(1).Info("Current State inside POD is: ", "state", stateReply.State) From f2e45566889f5289fc20f5fc7c4f087281d54ebd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 3 Jul 2026 15:18:56 +0200 Subject: [PATCH 2289/2352] [control-operator] finalizer for Environment CRD prohibiting deletion until tasks are gone --- .../controller/environment_controller.go | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index c66ec38f4..88f511a64 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -179,6 +179,8 @@ func labels(environment *aliecsv1alpha1.Environment, nodename string) map[string } } +const environmentFinalizer = "aliecs.alice.cern/environment-finalizer" + // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments,verbs=get;list;watch;create;update;patch;delete // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/status,verbs=get;update;patch // +kubebuilder:rbac:groups=aliecs.alice.cern,resources=environments/finalizers,verbs=update @@ -194,6 +196,42 @@ func labels(environment *aliecsv1alpha1.Environment, nodename string) map[string // // For more details, check Reconcile and its Result here: // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.23.1/pkg/reconcile +func (r *EnvironmentReconciler) handleFinalizer(ctx context.Context, environment *aliecsv1alpha1.Environment, log logr.Logger) (ctrl.Result, bool, error) { + if environment.DeletionTimestamp.IsZero() { + if !controllerutil.ContainsFinalizer(environment, environmentFinalizer) { + controllerutil.AddFinalizer(environment, environmentFinalizer) + if err := r.Update(ctx, environment); err != nil { + return ctrl.Result{}, true, err + } + return ctrl.Result{}, true, nil + } + } else { + if controllerutil.ContainsFinalizer(environment, environmentFinalizer) { + tasks := &aliecsv1alpha1.TaskList{} + if err := r.List(ctx, tasks, client.InNamespace(environment.Namespace), client.MatchingLabels{"environment": environment.Name}); err != nil { + return ctrl.Result{}, true, err + } + if len(tasks.Items) > 0 { + for i := range tasks.Items { + if tasks.Items[i].DeletionTimestamp.IsZero() { + if err := r.Delete(ctx, &tasks.Items[i]); err != nil && !k8serrors.IsNotFound(err) { + return ctrl.Result{}, true, err + } + } + } + log.Info("waiting for tasks to be deleted before removing environment", "remaining", len(tasks.Items)) + return ctrl.Result{}, true, nil + } + controllerutil.RemoveFinalizer(environment, environmentFinalizer) + if err := r.Update(ctx, environment); err != nil { + return ctrl.Result{}, true, err + } + } + return ctrl.Result{}, true, nil + } + return ctrl.Result{}, false, nil +} + func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { log := logf.FromContext(ctx) @@ -202,6 +240,10 @@ func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, client.IgnoreNotFound(err) } + if res, stop, err := r.handleFinalizer(ctx, environment, log); err != nil || stop { + return res, err + } + if environment.Status.State == "" { for nodename, tasksReferences := range environment.TaskTemplates.Tasks { log.Info("creating tasks for hostname from references", "hostname", nodename, "number of tasks", len(tasksReferences)) From db6356029684fe35d7ad5c96058d596e88af7a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 6 Jul 2026 17:06:01 +0200 Subject: [PATCH 2290/2352] fixup! [control-operator] finalizer for Environment CRD prohibiting deletion until tasks are gone --- .../controller/environment_controller.go | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index 88f511a64..d1159bcd8 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -198,38 +198,39 @@ const environmentFinalizer = "aliecs.alice.cern/environment-finalizer" // - https://pkg.go.dev/sigs.k8s.io/controller-runtime@v0.23.1/pkg/reconcile func (r *EnvironmentReconciler) handleFinalizer(ctx context.Context, environment *aliecsv1alpha1.Environment, log logr.Logger) (ctrl.Result, bool, error) { if environment.DeletionTimestamp.IsZero() { - if !controllerutil.ContainsFinalizer(environment, environmentFinalizer) { - controllerutil.AddFinalizer(environment, environmentFinalizer) - if err := r.Update(ctx, environment); err != nil { - return ctrl.Result{}, true, err - } - return ctrl.Result{}, true, nil - } - } else { if controllerutil.ContainsFinalizer(environment, environmentFinalizer) { - tasks := &aliecsv1alpha1.TaskList{} - if err := r.List(ctx, tasks, client.InNamespace(environment.Namespace), client.MatchingLabels{"environment": environment.Name}); err != nil { - return ctrl.Result{}, true, err - } - if len(tasks.Items) > 0 { - for i := range tasks.Items { - if tasks.Items[i].DeletionTimestamp.IsZero() { - if err := r.Delete(ctx, &tasks.Items[i]); err != nil && !k8serrors.IsNotFound(err) { - return ctrl.Result{}, true, err - } - } - } - log.Info("waiting for tasks to be deleted before removing environment", "remaining", len(tasks.Items)) - return ctrl.Result{}, true, nil + // finalizer already in place, nothing to do: continue reconciliation + return ctrl.Result{}, false, nil + } + controllerutil.AddFinalizer(environment, environmentFinalizer) + return ctrl.Result{}, true, r.Update(ctx, environment) + } + + // environment is being deleted + if !controllerutil.ContainsFinalizer(environment, environmentFinalizer) { + return ctrl.Result{}, true, nil + } + + tasks := &aliecsv1alpha1.TaskList{} + if err := r.List(ctx, tasks, client.InNamespace(environment.Namespace), client.MatchingLabels{"environment": environment.Name}); err != nil { + return ctrl.Result{}, true, err + } + + if len(tasks.Items) > 0 { + for i := range tasks.Items { + if !tasks.Items[i].DeletionTimestamp.IsZero() { + continue } - controllerutil.RemoveFinalizer(environment, environmentFinalizer) - if err := r.Update(ctx, environment); err != nil { + if err := r.Delete(ctx, &tasks.Items[i]); err != nil && !k8serrors.IsNotFound(err) { return ctrl.Result{}, true, err } } + log.Info("waiting for tasks to be deleted before removing environment", "remaining", len(tasks.Items)) return ctrl.Result{}, true, nil } - return ctrl.Result{}, false, nil + + controllerutil.RemoveFinalizer(environment, environmentFinalizer) + return ctrl.Result{}, true, r.Update(ctx, environment) } func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) { From 5d1537cbdc2c5e971831ffed547e1e712b8ef440 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:58:13 +0200 Subject: [PATCH 2291/2352] [control-operator] disable grpc streams for time being (#831) --- control-operator/internal/controller/grpc_client.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/control-operator/internal/controller/grpc_client.go b/control-operator/internal/controller/grpc_client.go index 3b82f4e4f..1ae82df0c 100644 --- a/control-operator/internal/controller/grpc_client.go +++ b/control-operator/internal/controller/grpc_client.go @@ -171,11 +171,16 @@ func (c *OccClient) ConsumeIfReady(ctx context.Context) bool { c.log.V(1).Info("connection is in different state than ready", "conn state", connState.String()) return false } - clientCtx, clientCancel := context.WithCancel(context.Background()) + // clientCtx, clientCancel := context.WithCancel(context.Background()) + _, clientCancel := context.WithCancel(context.Background()) c.cancel = &clientCancel - go c.ConsumeEventStream(clientCtx) - go c.ConsumeStateStream(clientCtx) + // TODO: Streams are not used anywhere now so we turn them off until they are fixed/useful + // they are not useful for now because any Transition call imediately returns final + // status. So for now we don't need them. Of course the problem is that if something + // changes inside OCC container we have no way how to detect it now. + // go c.ConsumeEventStream(clientCtx) + // go c.ConsumeStateStream(clientCtx) return true } From 61587afa91561e4aea26a78b42cd8215b43daaa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:58:25 +0200 Subject: [PATCH 2292/2352] [control-operator] rename manager containers in k8s cluster (#832) [control-operator] rename task and environment manager containers in k8s cluster --- .../manager/environment-manager/environment-manager.yaml | 4 ++-- .../config/manager/task-manager/task-manager.yaml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/control-operator/config/manager/environment-manager/environment-manager.yaml b/control-operator/config/manager/environment-manager/environment-manager.yaml index 19e2a2df5..ea31d309d 100644 --- a/control-operator/config/manager/environment-manager/environment-manager.yaml +++ b/control-operator/config/manager/environment-manager/environment-manager.yaml @@ -19,7 +19,7 @@ spec: template: metadata: annotations: - kubectl.kubernetes.io/default-container: manager + kubectl.kubernetes.io/default-container: environment-manager labels: control-plane: environment-manager spec: @@ -35,7 +35,7 @@ spec: - --health-probe-bind-address=:9080 - --metrics-bind-address=:9081 image: environment-manager:latest - name: manager + name: environment-manager securityContext: allowPrivilegeEscalation: false capabilities: diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 09c538cc5..99e641b80 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -18,7 +18,7 @@ spec: template: metadata: annotations: - kubectl.kubernetes.io/default-container: manager + kubectl.kubernetes.io/default-container: task-manager labels: control-plane: task-manager spec: @@ -39,7 +39,7 @@ spec: fieldRef: fieldPath: spec.nodeName image: task-manager:latest - name: manager + name: task-manager securityContext: allowPrivilegeEscalation: false capabilities: From 601684a389c82266592f241327dff687251c95dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:58:42 +0200 Subject: [PATCH 2293/2352] [OCTRL-1091] Add TaskID to the TaskReference CRD (#835) [control-operator] taskID added to the TaskReference --- control-operator/api/v1alpha1/environment_types.go | 1 + .../config/crd/bases/aliecs.alice.cern_environments.yaml | 2 ++ control-operator/internal/controller/environment_controller.go | 3 +++ 3 files changed, 6 insertions(+) diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go index 0abb6ffba..7fa67fdb2 100644 --- a/control-operator/api/v1alpha1/environment_types.go +++ b/control-operator/api/v1alpha1/environment_types.go @@ -80,6 +80,7 @@ type EnvironmentStatus struct { type TaskReference struct { Name string `json:"name"` + TaskID string `json:"taskID,omitempty"` Env []v1.EnvVar `json:"env"` ArgsCLI []string `json:"argsCLI"` ArgsTransition map[string]string `json:"argsTransition"` diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml index d32e00590..0df33f7e1 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml @@ -4100,6 +4100,8 @@ spec: type: array name: type: string + taskID: + type: string required: - argsCLI - argsTransition diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index d1159bcd8..423969171 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -110,6 +110,9 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, task.Spec.State = environment.Spec.State task.Labels = labels(environment, nodename) + if taskReference.TaskID != "" { + task.Labels["taskID"] = taskReference.TaskID + } if err := controllerutil.SetControllerReference(environment, task, r.Scheme); err != nil { log.Error(err, "failed to set controller reference", "task", task.Name) From 3bcfc6ab0140bebaabfee948dde99679c0554f67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:58:53 +0200 Subject: [PATCH 2294/2352] Correct image in test manifest (#836) [control-operator] use correct image in readout-test.yaml --- .../ecs-manifests/kubernetes-manifests/readout-test.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml index d9711feb3..6a282c52c 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml @@ -25,7 +25,7 @@ spec: supplementalGroups: [10, 1105] containers: - name: readout - image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 + image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 command: ["/opt/o2/bin/o2-readout-exe"] args: ["/etc/readout/readout-cfg.ini"] securityContext: From aa4f056c852eccfcb3dca62803b2c2ef750d6f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:59:05 +0200 Subject: [PATCH 2295/2352] [OCTRL-1091] Proper privileges for Pods in TaskTemplate CRDs (#837) [control-operator] proper privileges added to task-templates manifests --- .../ecs-manifests/task-templates/readout-tasktemplate.yaml | 5 +++++ .../task-templates/stfbuilder-senderoutput-tasktemplate.yaml | 4 ++++ .../ecs-manifests/task-templates/stfsender-tasktemplate.yaml | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml index 467470ce7..3442286e8 100644 --- a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml @@ -12,12 +12,17 @@ spec: pod: hostNetwork: true hostIPC: true + securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] containers: - name: readout image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 command: ["/opt/o2/bin/o2-readout-exe"] securityContext: privileged: true + runAsUser: 1100 + runAsGroup: 1100 volumeMounts: - name: host-shm mountPath: /dev/shm diff --git a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml index 50e3b757f..d42664f54 100644 --- a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml @@ -15,12 +15,16 @@ spec: hostNetwork: true hostIPC: true securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] containers: - name: stfbuilder image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: [/opt/o2/bin/StfBuilder] securityContext: privileged: true + runAsUser: 1100 + runAsGroup: 1100 volumeMounts: - name: host-shm mountPath: /dev/shm diff --git a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml index 082b73093..715bed6f7 100644 --- a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml @@ -22,12 +22,16 @@ spec: hostNetwork: true hostIPC: true securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] containers: - name: stfsender image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: ["numactl"] securityContext: privileged: true + runAsUser: 1100 + runAsGroup: 1100 volumeMounts: - name: host-shm mountPath: /dev/shm From 145fbde11d9585232dbb57159b76ecace70ea59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:59:17 +0200 Subject: [PATCH 2296/2352] alice-tasks namespace in yaml manifests (#838) [control-operator] added alice-tasks namespace to the control-operator manifests --- control-operator/ecs-manifests/environment/test_env.yaml | 1 + .../ecs-manifests/kubernetes-manifests/readout-test.yaml | 2 ++ .../kubernetes-manifests/stfbuilder-senderoutput-test.yaml | 1 + .../ecs-manifests/kubernetes-manifests/stfsender-test.yaml | 1 + .../ecs-manifests/task-templates/readout-tasktemplate.yaml | 1 + .../task-templates/stfbuilder-senderoutput-tasktemplate.yaml | 1 + .../ecs-manifests/task-templates/stfsender-tasktemplate.yaml | 1 + 7 files changed, 8 insertions(+) diff --git a/control-operator/ecs-manifests/environment/test_env.yaml b/control-operator/ecs-manifests/environment/test_env.yaml index 599d587b9..a16f7854b 100644 --- a/control-operator/ecs-manifests/environment/test_env.yaml +++ b/control-operator/ecs-manifests/environment/test_env.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: Environment metadata: name: 31jdwll4xl6 + namespace: alice-tasks taskTemplates: tasks: diff --git a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml index 6a282c52c..52e1bd981 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: Task metadata: name: readout + namespace: alice-tasks spec: arguments: chans.readout.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l2g @@ -99,6 +100,7 @@ apiVersion: v1 kind: ConfigMap metadata: name: readout-config + namespace: alice-tasks data: readout-cfg.ini: | # Example configuration file for o2-readout-exe diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml index 2e625d13d..16e2a3dff 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: Task metadata: name: stfbuilder-senderoutput + namespace: alice-tasks spec: arguments: chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml index 7db060d53..834603c67 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: Task metadata: name: stfsender + namespace: alice-tasks spec: arguments: chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 diff --git a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml index 3442286e8..9412a0a36 100644 --- a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: TaskTemplate metadata: name: readout + namespace: alice-tasks spec: envVars: - O2_DETECTOR diff --git a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml index d42664f54..ea7289809 100644 --- a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: TaskTemplate metadata: name: stfbuilder-senderoutput + namespace: alice-tasks spec: envVars: - O2_DETECTOR diff --git a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml index 715bed6f7..b5adc33ca 100644 --- a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml @@ -2,6 +2,7 @@ apiVersion: aliecs.alice.cern/v1alpha1 kind: TaskTemplate metadata: name: stfsender + namespace: alice-tasks spec: envVars: - O2_DETECTOR From 01cca13fd6e04bdc354616e0822b789a81c617b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:59:29 +0200 Subject: [PATCH 2297/2352] nodeName set in test manifests (#840) [controller-operator] nodeName in test manifests --- .../ecs-manifests/kubernetes-manifests/readout-test.yaml | 1 + .../kubernetes-manifests/stfbuilder-senderoutput-test.yaml | 1 + .../ecs-manifests/kubernetes-manifests/stfsender-test.yaml | 1 + 3 files changed, 3 insertions(+) diff --git a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml index 52e1bd981..d77933ff1 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/readout-test.yaml @@ -4,6 +4,7 @@ metadata: name: readout namespace: alice-tasks spec: + nodeName: mtichak-ost.cern.ch arguments: chans.readout.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l2g chans.readout.0.autoBind: "0" diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml index 16e2a3dff..982d0ea43 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfbuilder-senderoutput-test.yaml @@ -4,6 +4,7 @@ metadata: name: stfbuilder-senderoutput namespace: alice-tasks spec: + nodeName: mtichak-ost.cern.ch arguments: chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 chans.buildertosender.0.autoBind: "0" diff --git a/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml index 834603c67..fa8589c15 100644 --- a/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml +++ b/control-operator/ecs-manifests/kubernetes-manifests/stfsender-test.yaml @@ -4,6 +4,7 @@ metadata: name: stfsender namespace: alice-tasks spec: + nodeName: mtichak-ost.cern.ch arguments: chans.buildertosender.0.address: ipc://@o2ipc-d7ef3du8ndmd7n8j7l30 chans.buildertosender.0.method: connect From 4ada65da1a2b48bd089aab99f122e826ae2b0af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:59:44 +0200 Subject: [PATCH 2298/2352] [OCTRL-1091] Hostname resolving in environment controller (#839) [control-operator] hostname resolving in EnvironmentReconciler Environment CRD controller needs a way how to resolve hostname passed from ECS to the one existing inside k8s cluster. ECS passes non fully qualified hostname, while kubernetes needs fully qualified hostname --- .../ecs-manifests/environment/test_env.yaml | 4 +- .../controller/environment_controller.go | 71 ++++++++++++++----- 2 files changed, 57 insertions(+), 18 deletions(-) diff --git a/control-operator/ecs-manifests/environment/test_env.yaml b/control-operator/ecs-manifests/environment/test_env.yaml index a16f7854b..ae3c21eaf 100644 --- a/control-operator/ecs-manifests/environment/test_env.yaml +++ b/control-operator/ecs-manifests/environment/test_env.yaml @@ -7,6 +7,7 @@ metadata: taskTemplates: tasks: mtichak-ost.cern.ch: + # mtichak-ost: # mtichak-xps-cern: # - name: readout # argsCLI: @@ -188,7 +189,8 @@ taskTemplates: spec: state: standby tasks: - mtichak-ost.cern.ch: + # mtichak-ost.cern.ch: + mtichak-ost: - name: readout spec: pod: diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index 423969171..0be44006d 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -53,7 +53,7 @@ type EnvironmentReconciler struct { } func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, taskReferences []aliecsv1alpha1.TaskReference, - nodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, + nodename string, resolvedNodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, ) (*ctrl.Result, error) { for _, taskReference := range taskReferences { log.Info("geting stored template for task", "task", taskReference.Name) @@ -106,7 +106,8 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) maps.Copy(task.Spec.Arguments, taskReference.ArgsTransition) - task.Spec.Pod.NodeName = nodename + task.Spec.Pod.NodeName = resolvedNodename + task.Spec.NodeName = resolvedNodename task.Spec.State = environment.Spec.State task.Labels = labels(environment, nodename) @@ -131,7 +132,7 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, } func (r *EnvironmentReconciler) runTaskFromDefinitionOnNode(ctx context.Context, taskDefs []aliecsv1alpha1.TaskDefinition, - nodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, + nodename string, resolvedNodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, ) (*ctrl.Result, error) { for _, taskDef := range taskDefs { task := &aliecsv1alpha1.Task{} @@ -151,7 +152,8 @@ func (r *EnvironmentReconciler) runTaskFromDefinitionOnNode(ctx context.Context, maps.Copy(task.Spec.Arguments, taskDef.Spec.Arguments) } - task.Spec.Pod.NodeName = nodename + task.Spec.Pod.NodeName = resolvedNodename + task.Spec.NodeName = resolvedNodename task.Spec.State = environment.Spec.State task.Labels = labels(environment, nodename) @@ -249,24 +251,31 @@ func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) } if environment.Status.State == "" { + nodeNames, err := r.listAndParseNodes(ctx) + if err != nil { + return ctrl.Result{}, err + } + for nodename, tasksReferences := range environment.TaskTemplates.Tasks { log.Info("creating tasks for hostname from references", "hostname", nodename, "number of tasks", len(tasksReferences)) - if res, err := r.checkNodeExistence(ctx, nodename); err != nil { - return res, err + resolvedName, err := resolveNodeName(nodeNames, nodename) + if err != nil { + return ctrl.Result{}, err } - if res, err := r.runTasksFromReferenceOnNode(ctx, tasksReferences, nodename, req, environment, log); res != nil { + if res, err := r.runTasksFromReferenceOnNode(ctx, tasksReferences, nodename, resolvedName, req, environment, log); res != nil { return *res, err } } for nodename, taskTemplates := range environment.Spec.Tasks { log.Info("creating tasks for hostname from definitions", "hostname", nodename, "number of tasks", len(taskTemplates)) - if res, err := r.checkNodeExistence(ctx, nodename); err != nil { - return res, err + resolvedName, err := resolveNodeName(nodeNames, nodename) + if err != nil { + return ctrl.Result{}, err } - if res, err := r.runTaskFromDefinitionOnNode(ctx, taskTemplates, nodename, req, environment, log); res != nil { + if res, err := r.runTaskFromDefinitionOnNode(ctx, taskTemplates, nodename, resolvedName, req, environment, log); res != nil { return *res, err } } @@ -314,15 +323,43 @@ func (r *EnvironmentReconciler) Reconcile(ctx context.Context, req ctrl.Request) return ctrl.Result{}, nil } -func (r *EnvironmentReconciler) checkNodeExistence(ctx context.Context, nodename string) (ctrl.Result, error) { - node := &v1.Node{} - if err := r.Get(ctx, types.NamespacedName{Name: nodename}, node); err != nil { - if k8serrors.IsNotFound(err) { - return ctrl.Result{}, fmt.Errorf("node %s not found in cluster", nodename) +var filterList = []string{"cern", "ch"} + +// listAndParseNodes asks k8s cluster for all nodes and it creates map out of them containing the node names +// and also partial node names while filtering those from `filterList`, so map will contain following for example: +// { "flp001.cern.ch": "flp001.cern.ch", "flp001": "flp001.cern.ch" } +func (r *EnvironmentReconciler) listAndParseNodes(ctx context.Context) (map[string]string, error) { + nodeList := &v1.NodeList{} + nodeNames := make(map[string]string) + if err := r.List(ctx, nodeList); err != nil { + return nodeNames, fmt.Errorf("listing nodes: %w", err) + } + + for _, node := range nodeList.Items { + if val, ok := nodeNames[node.Name]; ok { + return nil, fmt.Errorf("duplicate node names %s and %s ", node.Name, val) + } + nodeNames[node.Name] = node.Name + for _, nodePart := range strings.Split(node.Name, ".") { + if !slices.Contains(filterList, nodePart) { + if val, ok := nodeNames[nodePart]; ok { + return nil, fmt.Errorf("duplicate partial node names %s and %s ", nodePart, val) + } + nodeNames[nodePart] = node.Name + } } - return ctrl.Result{}, err } - return ctrl.Result{}, nil + + return nodeNames, nil +} + +// resolveNodeNames checks created map in listAndParseNodes for any match +func resolveNodeName(nodes map[string]string, nodename string) (string, error) { + if res, ok := nodes[nodename]; !ok { + return "", fmt.Errorf("node not in cluster: %s", nodename) + } else { + return res, nil + } } func aggregateState(tasks []aliecsv1alpha1.Task, previousState string) string { From 737cfc90ef3a7196cb2d80d2985aff0a5a1ea4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Wed, 22 Jul 2026 15:59:54 +0200 Subject: [PATCH 2299/2352] [OCTRL-1091] OCC_CONTROL_PORT removal from TaskTemplate CRDs (#841) [control-operator] Remove OCC_CONTROL_PORT as requirement from TaskTemplate The reason for the removal is that ECS can assign OCC_CONTROL_PORT only for mesos tasks, thus the removal here. The variable is now set inside the TaskTemplates. Ability to overwrite EnvVars from TaskReference CRDs was also added --- .../task-templates/readout-tasktemplate.yaml | 3 ++ .../stfbuilder-senderoutput-tasktemplate.yaml | 3 ++ .../stfsender-tasktemplate.yaml | 3 ++ .../controller/environment_controller.go | 46 ++++++++++++------- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml index 9412a0a36..71c0dc91b 100644 --- a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml @@ -20,6 +20,9 @@ spec: - name: readout image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 command: ["/opt/o2/bin/o2-readout-exe"] + env: + - name: OCC_CONTROL_PORT + value: "47101" securityContext: privileged: true runAsUser: 1100 diff --git a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml index ea7289809..cc7136c7e 100644 --- a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml @@ -22,6 +22,9 @@ spec: - name: stfbuilder image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: [/opt/o2/bin/StfBuilder] + env: + - name: OCC_CONTROL_PORT + value: "47102" securityContext: privileged: true runAsUser: 1100 diff --git a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml index b5adc33ca..87111c255 100644 --- a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml @@ -29,6 +29,9 @@ spec: - name: stfsender image: gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/dd:1 command: ["numactl"] + env: + - name: OCC_CONTROL_PORT + value: "47103" securityContext: privileged: true runAsUser: 1100 diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index 0be44006d..6d2f14988 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -83,27 +83,11 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, task.Spec.Pod = *template.Spec.Pod.DeepCopy() task.Spec.Control = *template.Spec.Control.DeepCopy() - // TODO: regarding error handling. Is it correct to stop while handling one task? this will fail the whole deployment, - // which might not be desirable outcome especially for non-critical tasks - if foundIdx := slices.IndexFunc(taskReference.Env, func(envVar v1.EnvVar) bool { return envVar.Name == "OCC_CONTROL_PORT" }); foundIdx == -1 { - log.Error(fmt.Errorf("didn't find OCC_CONTROL_PORT in env"), "failed to fill in env vars from template") - return &reconcile.Result{}, nil - } else { - port, err := strconv.Atoi(taskReference.Env[foundIdx].Value) - if err != nil { - log.Error(fmt.Errorf("found OCC_CONTROL_PORT isn't convertible to number "), "failed to fill in env vars from template") - return &reconcile.Result{}, nil - } - task.Spec.Control.Port = port - } - if task.Spec.Arguments == nil { task.Spec.Arguments = make(map[string]string) } - // TODO: check for containers! - task.Spec.Pod.Containers[0].Env = append(task.Spec.Pod.Containers[0].Env, taskReference.Env...) - task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) + handleEnvVars(task, taskReference) maps.Copy(task.Spec.Arguments, taskReference.ArgsTransition) task.Spec.Pod.NodeName = resolvedNodename @@ -131,6 +115,34 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, return nil, nil } +func handleEnvVars(task *aliecsv1alpha1.Task, taskReference aliecsv1alpha1.TaskReference) { + // TODO: check for existence of containers + // TODO: adapt for Pods with multiple containers + // reference to existing Env Vars to overwrite them if found in taskReference + existing := make(map[string]int, len(task.Spec.Pod.Containers[0].Env)) + for i, e := range task.Spec.Pod.Containers[0].Env { + existing[e.Name] = i + } + for _, e := range taskReference.Env { + if i, ok := existing[e.Name]; ok { + task.Spec.Pod.Containers[0].Env[i] = e + } else { + task.Spec.Pod.Containers[0].Env = append(task.Spec.Pod.Containers[0].Env, e) + } + } + task.Spec.Pod.Containers[0].Args = append(task.Spec.Pod.Containers[0].Args, taskReference.ArgsCLI...) + + // TODO: should the OCC_CONTROL_PORT handled in task_controller.go and set only Ports and types in this controller? + for _, envVar := range task.Spec.Pod.Containers[0].Env { + if envVar.Name == "OCC_CONTROL_PORT" { + if port, err := strconv.Atoi(envVar.Value); err == nil { + task.Spec.Control.Port = port + } + break + } + } +} + func (r *EnvironmentReconciler) runTaskFromDefinitionOnNode(ctx context.Context, taskDefs []aliecsv1alpha1.TaskDefinition, nodename string, resolvedNodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, ) (*ctrl.Result, error) { From 82bc47529e9e7e7e4faaa92c66ca50762362cabf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jul 2026 16:01:40 +0200 Subject: [PATCH 2300/2352] Bump golang.org/x/crypto from 0.50.0 to 0.52.0 (#834) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.50.0 to 0.52.0. - [Commits](https://github.com/golang/crypto/compare/v0.50.0...v0.52.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-version: 0.52.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 9800a9572..b90bc389e 100644 --- a/go.mod +++ b/go.mod @@ -58,9 +58,9 @@ require ( github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.50.0 - golang.org/x/net v0.53.0 - golang.org/x/sys v0.43.0 + golang.org/x/crypto v0.52.0 + golang.org/x/net v0.54.0 + golang.org/x/sys v0.45.0 google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.36.10 @@ -163,8 +163,8 @@ require ( go.uber.org/multierr v1.11.0 // indirect golang.org/x/mod v0.35.0 // indirect golang.org/x/sync v0.20.0 // indirect - golang.org/x/term v0.42.0 // indirect - golang.org/x/text v0.36.0 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect golang.org/x/tools v0.44.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect diff --git a/go.sum b/go.sum index da0b3cb44..b1717fb27 100644 --- a/go.sum +++ b/go.sum @@ -466,8 +466,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= +golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -490,8 +490,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -535,16 +535,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= +golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= -golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -555,8 +555,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 763366e25dd0841d93a650c117fa2c22daf1ac4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 27 Jul 2026 16:55:27 +0200 Subject: [PATCH 2301/2352] [control-operator] added missing strings package --- control-operator/internal/controller/environment_controller.go | 1 + 1 file changed, 1 insertion(+) diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index 6d2f14988..a605b37ae 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -30,6 +30,7 @@ import ( "maps" "slices" "strconv" + "strings" v1 "k8s.io/api/core/v1" k8serrors "k8s.io/apimachinery/pkg/api/errors" From 21c18ec23a274d82ea199dfbcc8388a9ae9fc630 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 10 Aug 2026 13:32:42 +0200 Subject: [PATCH 2302/2352] [controller-operator] podForTask test (#844) --- .../controller/task_controller_test.go | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 control-operator/internal/controller/task_controller_test.go diff --git a/control-operator/internal/controller/task_controller_test.go b/control-operator/internal/controller/task_controller_test.go new file mode 100644 index 000000000..ac16d8411 --- /dev/null +++ b/control-operator/internal/controller/task_controller_test.go @@ -0,0 +1,112 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "testing" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" +) + +// newTestScheme is used to register owner of pod properly in TestPodForTask +func newTestScheme(t *testing.T) *runtime.Scheme { + t.Helper() + scheme := runtime.NewScheme() + if err := aliecsv1alpha1.AddToScheme(scheme); err != nil { + t.Fatalf("failed to add aliecsv1alpha1 to scheme: %v", err) + } + return scheme +} + +func TestPodForTask(t *testing.T) { + r := &TaskReconciler{Scheme: newTestScheme(t)} + + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-task", + Namespace: "my-namespace", + UID: types.UID("test-uid"), + }, + Spec: aliecsv1alpha1.TaskSpec{ + Pod: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyAlways, + Containers: []v1.Container{ + {Name: "main", Image: "example.io/image:latest"}, + }, + }, + }, + } + + pod := r.podForTask(task) + + if pod.Name != "aliecs-task-pod-my-task" { + t.Errorf("pod.Name = %q, want %q", pod.Name, "aliecs-task-pod-my-task") + } + if pod.Namespace != task.Namespace { + t.Errorf("pod.Namespace = %q, want %q", pod.Namespace, task.Namespace) + } + + wantLabels := map[string]string{ + "task_name": "my-task", + "application": "ControlOperator", + } + for k, v := range wantLabels { + if got := pod.Labels[k]; got != v { + t.Errorf("pod.Labels[%q] = %q, want %q", k, got, v) + } + } + + if len(pod.Spec.Containers) != 1 || pod.Spec.Containers[0].Name != "main" { + t.Errorf("pod.Spec.Containers not copied from task.Spec.Pod, got %+v", pod.Spec.Containers) + } + + // podForTask always forces RestartPolicyNever, regardless of what's set on the Task spec. + if pod.Spec.RestartPolicy != v1.RestartPolicyNever { + t.Errorf("pod.Spec.RestartPolicy = %q, want %q", pod.Spec.RestartPolicy, v1.RestartPolicyNever) + } + + ownerRefs := pod.GetOwnerReferences() + if len(ownerRefs) != 1 { + t.Fatalf("expected exactly one owner reference, got %d: %+v", len(ownerRefs), ownerRefs) + } + owner := ownerRefs[0] + if owner.Kind != "Task" { + t.Errorf("owner.Kind = %q, want %q", owner.Kind, "Task") + } + if owner.Name != task.Name { + t.Errorf("owner.Name = %q, want %q", owner.Name, task.Name) + } + if owner.UID != task.UID { + t.Errorf("owner.UID = %q, want %q", owner.UID, task.UID) + } + if owner.Controller == nil || !*owner.Controller { + t.Errorf("owner.Controller = %v, want true", owner.Controller) + } +} From 3a6c14c97cfdca82ee4fd03ef0ed73825545cbe4 Mon Sep 17 00:00:00 2001 From: Piotr Konopka Date: Mon, 10 Aug 2026 14:35:54 +0200 Subject: [PATCH 2303/2352] Run control-operator tests in CI (#824) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Run control-operator tests in CI * Update control.yml * [github workflows] control-operator it's own workflow --------- Co-authored-by: Michal Tichák --- .github/workflows/control-operator.yml | 31 ++++++++++++++++++++++++++ control-operator/Makefile | 20 +++++++++++++++-- 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/control-operator.yml diff --git a/.github/workflows/control-operator.yml b/.github/workflows/control-operator.yml new file mode 100644 index 000000000..de76438ad --- /dev/null +++ b/.github/workflows/control-operator.yml @@ -0,0 +1,31 @@ +name: AliECS Control Operator + +on: + pull_request: + push: + branches: + - 'master' + +jobs: + control-operator-basic-check: + name: Basic Make Check + runs-on: ${{ matrix.os }} + defaults: + run: + working-directory: control-operator + strategy: + fail-fast: false + matrix: + os: [macOS-latest, ubuntu-24.04] + go: [ '1.26.5' ] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-go@v2 + with: + go-version: ${{matrix.go}} + - uses: arduino/setup-protoc@v3 + with: + version: '35.1' + repo-token: ${{ secrets.GITHUB_TOKEN }} + - run: make + - run: make test diff --git a/control-operator/Makefile b/control-operator/Makefile index 992fe1162..b0a1cb07e 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -127,9 +127,9 @@ test: manifests generate fmt vet envtest ## Run tests. ##@ Protobuf .PHONY: generate-proto -generate-proto: ## Generate protobuf and gRPC Go files from occ.proto. +generate-proto: protoc-gen-go protoc-gen-go-grpc ## Generate protobuf and gRPC Go files from occ.proto. mkdir -p internal/controller/protos/generated - protoc --go_out=internal/controller/protos/generated --go_opt=paths=source_relative --go-grpc_out=internal/controller/protos/generated --go-grpc_opt=paths=source_relative -I internal/controller/protos internal/controller/protos/occ.proto + PATH="$(LOCALBIN):$$PATH" protoc --go_out=internal/controller/protos/generated --go_opt=paths=source_relative --go-grpc_out=internal/controller/protos/generated --go-grpc_opt=paths=source_relative -I internal/controller/protos internal/controller/protos/occ.proto .PHONY: clean-proto clean-proto: ## Remove generated protobuf and gRPC Go files. @@ -242,10 +242,14 @@ KUBECTL ?= kubectl KUSTOMIZE ?= $(LOCALBIN)/kustomize CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen ENVTEST ?= $(LOCALBIN)/setup-envtest +PROTOC_GEN_GO ?= $(LOCALBIN)/protoc-gen-go +PROTOC_GEN_GO_GRPC ?= $(LOCALBIN)/protoc-gen-go-grpc ## Tool Versions KUSTOMIZE_VERSION ?= v5.0.1 CONTROLLER_TOOLS_VERSION ?= v0.16.5 +PROTOC_GEN_GO_VERSION ?= v1.36.11 +PROTOC_GEN_GO_GRPC_VERSION ?= v1.6.2 .PHONY: kustomize kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading. @@ -267,6 +271,18 @@ envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest +.PHONY: protoc-gen-go +protoc-gen-go: $(PROTOC_GEN_GO) ## Download protoc-gen-go locally if necessary. If wrong version is installed, it will be overwritten. +$(PROTOC_GEN_GO): $(LOCALBIN) + test -s $(LOCALBIN)/protoc-gen-go && $(LOCALBIN)/protoc-gen-go --version | grep -q $(PROTOC_GEN_GO_VERSION) || \ + GOBIN=$(LOCALBIN) go install google.golang.org/protobuf/cmd/protoc-gen-go@$(PROTOC_GEN_GO_VERSION) + +.PHONY: protoc-gen-go-grpc +protoc-gen-go-grpc: $(PROTOC_GEN_GO_GRPC) ## Download protoc-gen-go-grpc locally if necessary. If wrong version is installed, it will be overwritten. +$(PROTOC_GEN_GO_GRPC): $(LOCALBIN) + test -s $(LOCALBIN)/protoc-gen-go-grpc && $(LOCALBIN)/protoc-gen-go-grpc --version | grep -q $(subst v,,$(PROTOC_GEN_GO_GRPC_VERSION)) || \ + GOBIN=$(LOCALBIN) go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@$(PROTOC_GEN_GO_GRPC_VERSION) + .PHONY: operator-sdk OPERATOR_SDK ?= $(LOCALBIN)/operator-sdk operator-sdk: ## Download operator-sdk locally if necessary. From 611d0fc5a711af03f82fee4cde705f8c7fc05a51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2026 09:43:43 +0200 Subject: [PATCH 2304/2352] Bump github.com/go-git/go-git/v5 from 5.19.1 to 5.19.2 (#847) Bumps [github.com/go-git/go-git/v5](https://github.com/go-git/go-git) from 5.19.1 to 5.19.2. - [Release notes](https://github.com/go-git/go-git/releases) - [Changelog](https://github.com/go-git/go-git/blob/main/HISTORY.md) - [Commits](https://github.com/go-git/go-git/compare/v5.19.1...v5.19.2) --- updated-dependencies: - dependency-name: github.com/go-git/go-git/v5 dependency-version: 5.19.2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 36 ++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 27 deletions(-) diff --git a/go.mod b/go.mod index b90bc389e..45da51f25 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/dmarkham/enumer v1.5.11 github.com/fatih/color v1.16.0 github.com/gdamore/tcell/v2 v2.7.4 - github.com/go-git/go-git/v5 v5.19.1 + github.com/go-git/go-git/v5 v5.19.2 github.com/gobwas/glob v0.2.3 github.com/golang/protobuf v1.5.4 // indirect github.com/google/uuid v1.6.0 @@ -58,9 +58,9 @@ require ( github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 github.com/xlab/treeprint v1.2.0 - golang.org/x/crypto v0.52.0 - golang.org/x/net v0.54.0 - golang.org/x/sys v0.45.0 + golang.org/x/crypto v0.53.0 + golang.org/x/net v0.56.0 + golang.org/x/sys v0.46.0 google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.36.10 @@ -161,11 +161,11 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/mod v0.35.0 // indirect - golang.org/x/sync v0.20.0 // indirect - golang.org/x/term v0.43.0 // indirect - golang.org/x/text v0.37.0 // indirect - golang.org/x/tools v0.44.0 // indirect + golang.org/x/mod v0.37.0 // indirect + golang.org/x/sync v0.21.0 // indirect + golang.org/x/term v0.44.0 // indirect + golang.org/x/text v0.39.0 // indirect + golang.org/x/tools v0.47.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index b1717fb27..295589814 100644 --- a/go.sum +++ b/go.sum @@ -90,8 +90,8 @@ github.com/go-git/go-billy/v5 v5.9.0 h1:jItGXszUDRtR/AlferWPTMN4j38BQ88XnXKbilmm github.com/go-git/go-billy/v5 v5.9.0/go.mod h1:jCnQMLj9eUgGU7+ludSTYoZL/GGmii14RxKFj7ROgHw= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.19.1 h1:nX27AnaU43/K5bKktKwgBmR9lawoYVe1Ckg0rgzzN00= -github.com/go-git/go-git/v5 v5.19.1/go.mod h1:Pb1v0c7/g8aGQJwx9Us09W85yGoyvSwuhEGMH7zjDKQ= +github.com/go-git/go-git/v5 v5.19.2 h1:wkfn7vOlUBu8ivAWKBWisTiwJK4jYHzTF8Ndv1LyGqY= +github.com/go-git/go-git/v5 v5.19.2/go.mod h1:QqCBE1EFN5ddFmrliLQ3/ntRCUjZU3EJuwuB/jWEHjk= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= @@ -466,16 +466,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.52.0 h1:RMs7fP2rXdep0CftQlK8Uf+kibLm7qkCcradZWYz988= -golang.org/x/crypto v0.52.0/go.mod h1:1QgfPxDqh0T2M/elOJtp9RvuR95kVjir0e6/BvEmGbc= +golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto= +golang.org/x/crypto v0.53.0/go.mod h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f h1:W3F4c+6OLc6H2lb//N1q4WpJkhzJCK5J6kUi1NTVXfM= golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f/go.mod h1:J1xhfL/vlindoeF/aINzNzt2Bket5bjo9sdOYzOsU80= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.37.0 h1:vF1DjpVEshcIqoEaauuHebaLk1O1forxjxBaVn884JQ= +golang.org/x/mod v0.37.0/go.mod h1:m8S8VeM9r4dzDwjrKO0a1sZP3YjeMamRRlD+fmR2Q/0= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -490,8 +490,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= -golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= +golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -500,8 +500,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= -golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= +golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM= +golang.org/x/sync v0.21.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -535,16 +535,16 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.45.0 h1:dO4czNzziLiiXplLQgBCEpCvXQ3dnkn0SdaZSYdQ+FY= -golang.org/x/sys v0.45.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw= +golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= -golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= +golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc= +golang.org/x/term v0.44.0/go.mod h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -555,8 +555,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= -golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= +golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -565,8 +565,8 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.47.0 h1:7Kn5x/d1svx/PzryTsqeoZN4TZwqeH5pGWjefhLi/1Q= +golang.org/x/tools v0.47.0/go.mod h1:dFHnyTvFWY212G+h7ZY4Vsp/K3U4/7W9TyVaAul8uCA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From b8b6f187bfc921049d646c26c01e71216e90306e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 3 Jul 2026 16:25:42 +0200 Subject: [PATCH 2305/2352] [control-operator] finalizer blocks deletion of task until all pods are gone --- .../internal/controller/task_controller.go | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index daf1f32c7..cd62ab2b2 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -283,14 +283,32 @@ func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1. } } else { if controllerutil.ContainsFinalizer(t, taskFinalizer) { - log.Info("Cleaning up gRPC connection before deletion") + log.Info("Finalizer found, starting cleanup") if client, exists := clientsForContainers[t.Name]; exists { + log.Info("Cleaning up gRPC connection before deletion") if err := client.Close(); err != nil { log.Error(err, "Failed to close gRPC client during deletion") } delete(clientsForContainers, t.Name) + log.Info("gRPC cleaned") } + pod := &v1.Pod{} + err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod) + if err == nil { + if pod.DeletionTimestamp.IsZero() { + log.Info("Deleting pod before removing finalizer") + if err := r.Delete(ctx, pod); err != nil && !errors.IsNotFound(err) { + return ctrl.Result{}, true, err + } + } + log.Info("Waiting for pod to terminate before removing finalizer") + return ctrl.Result{}, true, nil + } else if !errors.IsNotFound(err) { + return ctrl.Result{}, true, err + } + log.Info("POD cleaned") + controllerutil.RemoveFinalizer(t, taskFinalizer) if err := r.Update(ctx, t); err != nil { return ctrl.Result{}, true, err From 92179e6354b3cb13ccc2d2ebff44a5c7a740c45b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 14 Jul 2026 11:37:29 +0200 Subject: [PATCH 2306/2352] fixup! [control-operator] finalizer blocks deletion of task until all pods are gone --- .../internal/controller/task_controller.go | 88 +++++++++++-------- 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index cd62ab2b2..1ab67f347 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -270,53 +270,65 @@ func (r *TaskReconciler) consumeGRPCConsumerIfReady(ctx context.Context, t *alie return ctrl.Result{} } +// handleFinalizer sets the finalizer, when Task isn't marked for deletion, and when deletion reconcile is triggered +// it then clears the gRPC connection and deletes the underlying POD and doesn't allow Task to be deleted +// until POD is gone. // Note: if you add finalizer to a task you cannot delete it unless you remove the finalizer, run: // kubectl patch task --type=json -p='[{"op": "remove", "path": "/metadata/finalizers"}]' func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (ctrl.Result, bool, error) { if t.DeletionTimestamp.IsZero() { - if !controllerutil.ContainsFinalizer(t, taskFinalizer) { - controllerutil.AddFinalizer(t, taskFinalizer) - if err := r.Update(ctx, t); err != nil { - return ctrl.Result{}, true, err - } - return ctrl.Result{}, true, nil + if controllerutil.AddFinalizer(t, taskFinalizer) { + return ctrl.Result{}, true, r.Update(ctx, t) } - } else { - if controllerutil.ContainsFinalizer(t, taskFinalizer) { - log.Info("Finalizer found, starting cleanup") - if client, exists := clientsForContainers[t.Name]; exists { - log.Info("Cleaning up gRPC connection before deletion") - if err := client.Close(); err != nil { - log.Error(err, "Failed to close gRPC client during deletion") - } - delete(clientsForContainers, t.Name) - log.Info("gRPC cleaned") - } + return ctrl.Result{}, false, nil + } - pod := &v1.Pod{} - err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod) - if err == nil { - if pod.DeletionTimestamp.IsZero() { - log.Info("Deleting pod before removing finalizer") - if err := r.Delete(ctx, pod); err != nil && !errors.IsNotFound(err) { - return ctrl.Result{}, true, err - } - } - log.Info("Waiting for pod to terminate before removing finalizer") - return ctrl.Result{}, true, nil - } else if !errors.IsNotFound(err) { - return ctrl.Result{}, true, err - } - log.Info("POD cleaned") + if !controllerutil.ContainsFinalizer(t, taskFinalizer) { + return ctrl.Result{}, true, nil + } - controllerutil.RemoveFinalizer(t, taskFinalizer) - if err := r.Update(ctx, t); err != nil { - return ctrl.Result{}, true, err - } + log.Info("Finalizer found, starting cleanup") + r.cleargRPC(t, log) + + if podGone, err := r.podDeleted(ctx, t, log); err != nil || !podGone { + return ctrl.Result{}, true, err + } + + controllerutil.RemoveFinalizer(t, taskFinalizer) + return ctrl.Result{}, true, r.Update(ctx, t) +} + +// podDeleted deletes the Task's Pod if it still exists, and reports whether it is +// fully gone yet so the caller can wait for termination before removing the finalizer. +func (r *TaskReconciler) podDeleted(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (bool, error) { + pod := &v1.Pod{} + err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod) + if errors.IsNotFound(err) { + log.Info("POD cleaned") + return true, nil + } else if err != nil { + return false, err + } + + if pod.DeletionTimestamp.IsZero() { + log.Info("Deleting pod before removing finalizer") + if err := r.Delete(ctx, pod); err != nil && !errors.IsNotFound(err) { + return false, err } - return ctrl.Result{}, true, nil } - return ctrl.Result{}, false, nil + log.Info("Waiting for pod to terminate before removing finalizer") + return false, nil +} + +func (*TaskReconciler) cleargRPC(t *aliecsv1alpha1.Task, log logr.Logger) { + if client, exists := clientsForContainers[t.Name]; exists { + log.Info("Cleaning up gRPC connection") + if err := client.Close(); err != nil { + log.Error(err, "Failed to close gRPC client during deletion") + } + delete(clientsForContainers, t.Name) + log.Info("gRPC cleaned") + } } func podNameFromTask(name string) string { From 2d876848786f47a2197a1012951006f2d3c8f57d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 6 Aug 2026 13:02:01 +0200 Subject: [PATCH 2307/2352] fixup! fixup! [control-operator] finalizer blocks deletion of task until all pods are gone --- .../internal/controller/task_controller.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 1ab67f347..2402ea691 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -290,7 +290,7 @@ func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1. log.Info("Finalizer found, starting cleanup") r.cleargRPC(t, log) - if podGone, err := r.podDeleted(ctx, t, log); err != nil || !podGone { + if podDeleted, err := r.deletePod(ctx, t, log); err != nil || !podDeleted { return ctrl.Result{}, true, err } @@ -298,13 +298,13 @@ func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1. return ctrl.Result{}, true, r.Update(ctx, t) } -// podDeleted deletes the Task's Pod if it still exists, and reports whether it is +// deletePod deletes the Task's Pod if it still exists, and reports whether it is // fully gone yet so the caller can wait for termination before removing the finalizer. -func (r *TaskReconciler) podDeleted(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (bool, error) { +func (r *TaskReconciler) deletePod(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (podDeleted bool, err error) { pod := &v1.Pod{} - err := r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod) + err = r.Get(ctx, types.NamespacedName{Name: podNameFromTask(t.Name), Namespace: t.Namespace}, pod) if errors.IsNotFound(err) { - log.Info("POD cleaned") + log.Info("Pod deleted") return true, nil } else if err != nil { return false, err From 009d329fd1173bd39a00f204fa826259f1ce2960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 6 Aug 2026 13:09:20 +0200 Subject: [PATCH 2308/2352] fixup! fixup! fixup! [control-operator] finalizer blocks deletion of task until all pods are gone --- control-operator/internal/controller/task_controller.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 2402ea691..852054b4c 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -272,10 +272,10 @@ func (r *TaskReconciler) consumeGRPCConsumerIfReady(ctx context.Context, t *alie // handleFinalizer sets the finalizer, when Task isn't marked for deletion, and when deletion reconcile is triggered // it then clears the gRPC connection and deletes the underlying POD and doesn't allow Task to be deleted -// until POD is gone. +// until pod is gone. // Note: if you add finalizer to a task you cannot delete it unless you remove the finalizer, run: // kubectl patch task --type=json -p='[{"op": "remove", "path": "/metadata/finalizers"}]' -func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (ctrl.Result, bool, error) { +func (r *TaskReconciler) handleFinalizer(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) (result ctrl.Result, stopReconciliation bool, err error) { if t.DeletionTimestamp.IsZero() { if controllerutil.AddFinalizer(t, taskFinalizer) { return ctrl.Result{}, true, r.Update(ctx, t) From 3f98d2fed6b5eabae5d1c2a3fea6bb9a8a4c3c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 25 Jun 2026 16:35:43 +0200 Subject: [PATCH 2309/2352] [OCTRL-1095] fluent-bit configs --- .../manifests/fluent-bit-audit.yml | 98 ++++++++++++++ .../manifests/fluent-bit-events.yml | 94 +++++++++++++ .../manifests/fluent-bit-logs.yml | 123 ++++++++++++++++++ .../manifests/opensearch-config.yml | 8 ++ .../k3s-observability/other/audit-policy.yaml | 27 ++++ 5 files changed, 350 insertions(+) create mode 100644 control-operator/k3s-observability/manifests/fluent-bit-audit.yml create mode 100644 control-operator/k3s-observability/manifests/fluent-bit-events.yml create mode 100644 control-operator/k3s-observability/manifests/fluent-bit-logs.yml create mode 100644 control-operator/k3s-observability/manifests/opensearch-config.yml create mode 100644 control-operator/k3s-observability/other/audit-policy.yaml diff --git a/control-operator/k3s-observability/manifests/fluent-bit-audit.yml b/control-operator/k3s-observability/manifests/fluent-bit-audit.yml new file mode 100644 index 000000000..6e438dbe5 --- /dev/null +++ b/control-operator/k3s-observability/manifests/fluent-bit-audit.yml @@ -0,0 +1,98 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fluent-bit-audit-config + namespace: kube-system +data: + fluent-bit-audit.yml: | + service: + flush: 5 + log_level: info + + parsers: + - name: audit-json + format: json + time_key: requestReceivedTimestamp + time_format: "%Y-%m-%dT%H:%M:%S.%LZ" + + pipeline: + inputs: + - name: tail + path: /var/log/k3s-audit.log + tag: k8s.audit + parser: audit-json + db: /db/fluent-bit-audit.db + buffer_max_size: 2MB + skip_long_lines: off + + filters: + - name: nest + match: k8s.audit + operation: lift + nested_under: objectRef + add_prefix: objectRef_ + + - name: nest + match: k8s.audit + operation: lift + nested_under: user + add_prefix: user_ + + outputs: + - name: forward + match: k8s.audit + host: ${OPENSEARCH_HOST} + port: ${OPENSEARCH_PORT} +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: fluent-bit-audit + namespace: kube-system +spec: + selector: + matchLabels: + app: fluent-bit-audit + template: + metadata: + labels: + app: fluent-bit-audit + annotations: + reloader.stakater.com/auto: "true" + spec: + nodeSelector: + node-role.kubernetes.io/control-plane: "true" + tolerations: + - key: node-role.kubernetes.io/control-plane + operator: Exists + effect: NoSchedule + containers: + - name: fluent-bit + image: fluent/fluent-bit:5.0 + args: + - -c + - /etc/fluent-bit-audit/fluent-bit-audit.yml + envFrom: + - configMapRef: + name: opensearch-config + volumeMounts: + - name: config + mountPath: /etc/fluent-bit-audit/fluent-bit-audit.yml + subPath: fluent-bit-audit.yml + - name: auditlog + mountPath: /var/log/k3s-audit.log + readOnly: true + - name: db + mountPath: /db + volumes: + - name: config + configMap: + name: fluent-bit-audit-config + - name: auditlog + hostPath: + path: /var/log/k3s-audit.log + type: File + - name: db + hostPath: + path: /var/log/fluent-bit-audit + type: DirectoryOrCreate diff --git a/control-operator/k3s-observability/manifests/fluent-bit-events.yml b/control-operator/k3s-observability/manifests/fluent-bit-events.yml new file mode 100644 index 000000000..cdff9507c --- /dev/null +++ b/control-operator/k3s-observability/manifests/fluent-bit-events.yml @@ -0,0 +1,94 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fluent-bit-events-config + namespace: kube-system +data: + fluent-bit.yml: | + service: + flush: 5 + log_level: info + + pipeline: + inputs: + - name: kubernetes_events + tag: kube.events + kube_url: https://kubernetes.default.svc:443 + kube_ca_file: /var/lib/rancher/k3s/server/tls/server-ca.crt + kube_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + + outputs: + - name: forward + match: kube.events + host: ${OPENSEARCH_HOST} + port: ${OPENSEARCH_PORT} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: fluent-bit-events + namespace: kube-system +spec: + replicas: 1 + selector: + matchLabels: + app: fluent-bit-events + template: + metadata: + labels: + app: fluent-bit-events + annotations: + reloader.stakater.com/auto: "true" + spec: + serviceAccountName: fluent-bit-events + containers: + - name: fluent-bit + image: fluent/fluent-bit:5.0 + args: + - -c + - /etc/fluent-bit/fluent-bit.yml + envFrom: + - configMapRef: + name: opensearch-config + volumeMounts: + - name: config + mountPath: /etc/fluent-bit/fluent-bit.yml + subPath: fluent-bit.yml + - name: k3s-tls + mountPath: /var/lib/rancher/k3s/server/tls + readOnly: true + volumes: + - name: config + configMap: + name: fluent-bit-events-config + - name: k3s-tls + hostPath: + path: /var/lib/rancher/k3s/server/tls +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fluent-bit-events + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fluent-bit-events +rules: +- apiGroups: [""] + resources: [events] + verbs: [get, list, watch] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fluent-bit-events +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fluent-bit-events +subjects: +- kind: ServiceAccount + name: fluent-bit-events + namespace: kube-system diff --git a/control-operator/k3s-observability/manifests/fluent-bit-logs.yml b/control-operator/k3s-observability/manifests/fluent-bit-logs.yml new file mode 100644 index 000000000..cd852ea71 --- /dev/null +++ b/control-operator/k3s-observability/manifests/fluent-bit-logs.yml @@ -0,0 +1,123 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: fluent-bit-logs-config + namespace: kube-system +data: + fluent-bit-logs.yml: | + service: + flush: 5 + log_level: info + + pipeline: + inputs: + - name: tail + path: /var/log/containers/*.log + multiline.parser: cri + tag: kube.* + mem_buf_limit: 50MB + skip_long_lines: on + + + filters: + - name: kubernetes + match: kube.* + kube_url: https://kubernetes.default.svc:443 + kube_ca_file: /var/lib/rancher/k3s/server/tls/server-ca.crt + kube_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token + labels: on + annotations: off + merge_log: on + + - name: nest + match: kube.* + operation: lift + nested_under: kubernetes + add_prefix: kubernetes. + + - name: modify + match: kube.* + rename: msg log + + outputs: + - name: forward + match: kube.* + host: ${OPENSEARCH_HOST} + port: ${OPENSEARCH_PORT} +--- +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: fluent-bit-logs + namespace: kube-system +spec: + selector: + matchLabels: + app: fluent-bit-logs + template: + metadata: + labels: + app: fluent-bit-logs + annotations: + reloader.stakater.com/auto: "true" + spec: + serviceAccountName: fluent-bit-logs + tolerations: + - operator: Exists + containers: + - name: fluent-bit + image: fluent/fluent-bit:5.0 + args: + - -c + - /etc/fluent-bit-logs/fluent-bit-logs.yml + envFrom: + - configMapRef: + name: opensearch-config + volumeMounts: + - name: config + mountPath: /etc/fluent-bit-logs/fluent-bit-logs.yml + subPath: fluent-bit-logs.yml + - name: varlog + mountPath: /var/log + readOnly: true + - name: k3s-tls + mountPath: /var/lib/rancher/k3s/server/tls + readOnly: true + volumes: + - name: config + configMap: + name: fluent-bit-logs-config + - name: varlog + hostPath: + path: /var/log + - name: k3s-tls + hostPath: + path: /var/lib/rancher/k3s/server/tls +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: fluent-bit-logs + namespace: kube-system +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: fluent-bit-logs +rules: +- apiGroups: [""] + resources: [pods, namespaces] + verbs: [get, list, watch] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: fluent-bit-logs +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: fluent-bit-logs +subjects: +- kind: ServiceAccount + name: fluent-bit-logs + namespace: kube-system diff --git a/control-operator/k3s-observability/manifests/opensearch-config.yml b/control-operator/k3s-observability/manifests/opensearch-config.yml new file mode 100644 index 000000000..883499fc7 --- /dev/null +++ b/control-operator/k3s-observability/manifests/opensearch-config.yml @@ -0,0 +1,8 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: opensearch-config + namespace: kube-system +data: + OPENSEARCH_HOST: mtichak-opensearch.cern.ch + OPENSEARCH_PORT: "24224" diff --git a/control-operator/k3s-observability/other/audit-policy.yaml b/control-operator/k3s-observability/other/audit-policy.yaml new file mode 100644 index 000000000..b4e8cb461 --- /dev/null +++ b/control-operator/k3s-observability/other/audit-policy.yaml @@ -0,0 +1,27 @@ +apiVersion: audit.k8s.io/v1 +kind: Policy +rules: + # Full request+response for ALIECS custom resources + - level: RequestResponse + omitManagedFields: true + verbs: [create, update, patch, delete] + resources: + - group: aliecs.alice.cern + resources: [environments, tasks, tasktemplates] + + # Pod lifecycle — metadata only (no need for full spec, we have container logs) + - level: Metadata + verbs: [create, delete] + resources: + - group: "" + resources: [pods] + + # Drop noisy non-events + - level: None + resources: + - group: coordination.k8s.io + resources: [leases] + - level: None + users: [system:node:*] + - level: None + nonResourceURLs: [/healthz*, /readyz*, /livez*, /metrics] From de197b2b78626d789b67a2e48428ba2b06b06ea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 25 Jun 2026 16:46:33 +0200 Subject: [PATCH 2310/2352] [OCTRL-1095] create and record Events for Task Controller --- .../crd/bases/aliecs.alice.cern_tasks.yaml | 39 +++++++++++++++++++ .../environment-manager.yaml | 1 + .../manager/task-manager/task-manager.yaml | 1 + .../internal/controller/task_controller.go | 37 ++++++++++++++++++ 4 files changed, 78 insertions(+) diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml index 6bef94e68..415cdee8a 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_tasks.yaml @@ -3931,6 +3931,45 @@ spec: type: object status: properties: + conditions: + items: + properties: + lastTransitionTime: + format: date-time + type: string + message: + maxLength: 32768 + type: string + observedGeneration: + format: int64 + minimum: 0 + type: integer + reason: + maxLength: 1024 + minLength: 1 + pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$ + type: string + status: + enum: + - "True" + - "False" + - Unknown + type: string + type: + maxLength: 316 + pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$ + type: string + required: + - lastTransitionTime + - message + - reason + - status + - type + type: object + type: array + x-kubernetes-list-map-keys: + - type + x-kubernetes-list-type: map error: type: string pod: diff --git a/control-operator/config/manager/environment-manager/environment-manager.yaml b/control-operator/config/manager/environment-manager/environment-manager.yaml index ea31d309d..11b12925d 100644 --- a/control-operator/config/manager/environment-manager/environment-manager.yaml +++ b/control-operator/config/manager/environment-manager/environment-manager.yaml @@ -34,6 +34,7 @@ spec: - --leader-elect - --health-probe-bind-address=:9080 - --metrics-bind-address=:9081 + - --zap-encoder=json image: environment-manager:latest name: environment-manager securityContext: diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 99e641b80..15cefd9a2 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -33,6 +33,7 @@ spec: args: - --health-probe-bind-address=:9082 - --metrics-bind-address=:9083 + - --zap-encoder=json env: - name: NODE_NAME valueFrom: diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 852054b4c..f0dfafae1 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -34,6 +34,7 @@ import ( v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/types" @@ -127,6 +128,9 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionPodReady, metav1.ConditionFalse, "PodFailed", reason); err != nil { + return ctrl.Result{}, err + } } // Always stop reconciliation if the Pod is in a failed state return ctrl.Result{}, nil @@ -137,6 +141,9 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. log.Info("pod doesn't have IP yet, we wait for different event") return ctrl.Result{}, nil } + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionPodReady, metav1.ConditionTrue, "PodRunning", fmt.Sprintf("Pod %s has IP %s", existingPod.Name, existingPod.Status.PodIP)); err != nil { + return ctrl.Result{}, err + } res, err := r.createGRPCConsumer(ctx, t, existingPod, req.NamespacedName, log) if err != nil || !res.IsZero() { return res, err @@ -169,6 +176,9 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateInitialized, metav1.ConditionTrue, "StateQueried", fmt.Sprintf("Initial state: %s", t.Status.State)); err != nil { + return ctrl.Result{}, err + } return ctrl.Result{}, nil } @@ -214,6 +224,9 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitioned, metav1.ConditionFalse, "TransitionFailed", fmt.Sprintf("Transition from %s to %s failed: %s", stateReply.GetState(), t.Spec.State, transErr.Error())); err != nil { + return ctrl.Result{}, err + } return ctrl.Result{}, nil } if newState != "" { @@ -232,6 +245,11 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } + if t.Status.State != oldStatus.State { + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitioned, metav1.ConditionTrue, "TransitionComplete", fmt.Sprintf("Transitioned from %s to %s", oldStatus.State, t.Status.State)); err != nil { + return ctrl.Result{}, err + } + } } return ctrl.Result{}, nil @@ -252,6 +270,9 @@ func (r *TaskReconciler) createGRPCConsumer(ctx context.Context, t *aliecsv1alph clientsForContainers[t.Name] = client + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionGRPCConnected, metav1.ConditionTrue, "Connected", fmt.Sprintf("gRPC connection established to %s", addr)); err != nil { + return ctrl.Result{}, err + } return ctrl.Result{}, nil } @@ -415,6 +436,22 @@ func (r *TaskReconciler) SetupWithManager(mgr ctrl.Manager) error { Complete(r) } +func (r *TaskReconciler) recordCondition(ctx context.Context, t *aliecsv1alpha1.Task, condType string, condStatus metav1.ConditionStatus, reason, message string) error { + patch := client.MergeFrom(t.DeepCopy()) + eventType := v1.EventTypeNormal + if condStatus == metav1.ConditionFalse { + eventType = v1.EventTypeWarning + } + meta.SetStatusCondition(&t.Status.Conditions, metav1.Condition{ + Type: condType, + Status: condStatus, + Reason: reason, + Message: message, + }) + r.Recorder.Event(t, eventType, reason, message) + return r.Status().Patch(ctx, t, patch) +} + func prettyPrint(i any) string { s, err := json.MarshalIndent(i, "", " ") if err != nil { From 25654f425126fce17d6c003253aacc4cd5e553b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 25 Jun 2026 16:55:45 +0200 Subject: [PATCH 2311/2352] [OCTRL-1095] add k3s observability docs --- control-operator/api/v1alpha1/task_types.go | 11 ++ .../api/v1alpha1/zz_generated.deepcopy.go | 7 + docs/k3s_observability.md | 124 ++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 docs/k3s_observability.md diff --git a/control-operator/api/v1alpha1/task_types.go b/control-operator/api/v1alpha1/task_types.go index ace24d3e2..6b6d751c3 100644 --- a/control-operator/api/v1alpha1/task_types.go +++ b/control-operator/api/v1alpha1/task_types.go @@ -88,6 +88,13 @@ type TaskSpec struct { NodeName string `json:"nodeName,omitempty"` } +const ( + ConditionPodReady = "PodReady" + ConditionGRPCConnected = "GRPCConnected" + ConditionStateInitialized = "StateInitialized" + ConditionStateTransitioned = "StateTransitioned" +) + // TaskStatus defines the observed state of Task type TaskStatus struct { // INSERT ADDITIONAL STATUS FIELD - define observed state of cluster @@ -95,6 +102,10 @@ type TaskStatus struct { Pod v1.PodStatus `json:"pod,omitempty"` State string `json:"state,omitempty"` Error string `json:"error,omitempty"` + // +listType=map + // +listMapKey=type + // +optional + Conditions []metav1.Condition `json:"conditions,omitempty"` } // +kubebuilder:object:root=true diff --git a/control-operator/api/v1alpha1/zz_generated.deepcopy.go b/control-operator/api/v1alpha1/zz_generated.deepcopy.go index 628dc1b42..695e2f3cd 100644 --- a/control-operator/api/v1alpha1/zz_generated.deepcopy.go +++ b/control-operator/api/v1alpha1/zz_generated.deepcopy.go @@ -366,6 +366,13 @@ func (in *TaskSpecControl) DeepCopy() *TaskSpecControl { func (in *TaskStatus) DeepCopyInto(out *TaskStatus) { *out = *in in.Pod.DeepCopyInto(&out.Pod) + if in.Conditions != nil { + in, out := &in.Conditions, &out.Conditions + *out = make([]v1.Condition, len(*in)) + for i := range *in { + (*in)[i].DeepCopyInto(&(*out)[i]) + } + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TaskStatus. diff --git a/docs/k3s_observability.md b/docs/k3s_observability.md new file mode 100644 index 000000000..22ad1696c --- /dev/null +++ b/docs/k3s_observability.md @@ -0,0 +1,124 @@ +# K3s Observability + +> ⚠️ **Warning** +> This observability setup is a prototype configured for a specific OpenSearch instance. Adjust `opensearch-config.yml` before deploying to a different environment. + +All manifests and server-side configuration live in `control-operator/k3s-observability/`: + +``` +k3s-observability/ +├── manifests/ # applied via kubectl +│ ├── opensearch-config.yml +│ ├── fluent-bit-events.yml +│ ├── fluent-bit-logs.yml +│ └── fluent-bit-audit.yml +└── other/ # deployed manually on the k3s server node + └── audit-policy.yaml +``` + +## Overview + +Three fluent-bit components run inside the k3s cluster and forward data to an external observability stack via the Fluent Forward protocol (port 24224 on `OPENSEARCH_HOST`): + +| Manifest | Kind | What it collects | +|---|---|---| +| `fluent-bit-events.yml` | Deployment | Kubernetes `Event` objects — pod lifecycle, gRPC connections, controller-emitted events | +| `fluent-bit-logs.yml` | DaemonSet | Container stdout/stderr from all pods | +| `fluent-bit-audit.yml` | DaemonSet (control-plane only) | Kubernetes API audit log — full CRD specs on create/update/delete | + +The external observability stack (Fluent Bit → OTel Collector → Data Prepper → OpenSearch) receives and processes the forwarded data. + +`OPENSEARCH_HOST` and `OPENSEARCH_PORT` in `opensearch-config.yml` point at the observability Fluent Bit forward input, not at OpenSearch directly. All k3s Fluent Bit components read these via `envFrom`. + +[Reloader](https://github.com/stakater/Reloader) can be used to automatically restart any pods whenever their ConfigMap changes including the fluent-bit ones. However it is not required for fluent-bit deployment. Each Deployment/DaemonSet has the annotation `reloader.stakater.com/auto: "true"` on the pod template. + +## Deployment + +### First-time setup + +**1. Configure OpenSearch endpoint** + +Edit `manifests/opensearch-config.yml` with the correct host and port, then apply all manifests: + +```bash +kubectl apply -f control-operator/k3s-observability/manifests/ +``` + +**2. Set up audit logging on the k3s server node** + +Copy the audit policy to the server: +```bash +scp control-operator/k3s-observability/other/audit-policy.yaml :/etc/rancher/k3s/audit-policy.yaml +``` + +Create `/etc/rancher/k3s/config.yaml` on the server (create it if it doesn't exist): +```yaml +kube-apiserver-arg: + - "audit-log-path=/var/log/k3s-audit.log" + - "audit-policy-file=/etc/rancher/k3s/audit-policy.yaml" + - "audit-log-maxage=7" + - "audit-log-maxbackup=3" + - "audit-log-maxsize=100" +``` + +Restart k3s. If leftover containerd-shim processes block the restart: +```bash +/usr/local/bin/k3s-killall.sh && systemctl start k3s +``` + +**(OPTIONAL) 3. Install Reloader** +```bash +kubectl apply -f https://raw.githubusercontent.com/stakater/Reloader/master/deployments/kubernetes/reloader.yaml +``` + +### Updating config + +After any change to the manifests: +```bash +kubectl apply -f control-operator/k3s-observability/manifests/ +``` + +Reloader will automatically restart affected pods when their ConfigMap changes. + +## What is recorded and where + +### Kubernetes Events (`fluent-bit-events`) + +Watches the Kubernetes `Event` API directly. Captures events emitted by kubelet and the ALIECS controllers: + +- Pod lifecycle: `Created`, `Started`, `Killing` (explicit kill), `BackOff` (crash loop) +- Task controller: pod IP assignment, gRPC connection established, pod failure detected +- Notable gap: containers that exit on their own do not generate a kubelet `Killing` event — their exit is only visible in pod status. The task controller emits a `PodFailed` event to fill this gap. + +Query in OpenSearch: `WHERE attributes.kind = 'Event'` + +### Container logs (`fluent-bit-logs`) + +Tails `/var/log/containers/*.log` on every node. Captures stdout/stderr from all containers including the task and environment managers. + +The ALIECS controllers are configured with `--zap-encoder=json` so their log lines are pure JSON. The fluent-bit `merge_log: on` option parses these automatically, lifting structured fields as queryable attributes. The OTel Collector further normalises controller logs — including mapping the Go `level` field (`debug`/`info`/`warn`/`error`) to OTLP `severity_text` and `severity_number` so that log level filtering works correctly in OpenSearch Dashboards: + +### Audit log (`fluent-bit-audit`) + +Tails `/var/log/k3s-audit.log` on the control-plane node. Records every API server interaction matching the audit policy. + +**What is captured:** + +| Resource | Level | Verbs | +|---|---|---| +| ALIECS CRDs (Task, Environment, TaskTemplate) | `RequestResponse` (full spec) | create, update, patch, delete | +| Pods | `Metadata` (no body) | create, delete | + +`RequestResponse` means the full request and response body is logged — i.e. the complete spec of every Task and Environment CRD at the time it was created or modified. This gives a persistent record of what was deployed even after the CRD is deleted. + +`managedFields` is stripped at source via `omitManagedFields: true` in the audit policy. This field uses `.` as a JSON key (Kubernetes FieldsV1 format), which OpenSearch rejects. Removing it at the kube-apiserver level is cleaner than filtering it in the pipeline. + +Pod deletion (which sets the pod to Terminating) is captured at `Metadata` level via `verb: delete`. + +What is **not** captured: pod status transitions (Running → Terminating → Succeeded/Failed) — these are `patch` operations on the Pod object and are excluded to avoid noise. + +## Audit policy + +The audit policy at `other/audit-policy.yaml` is a server-side file read by the kube-apiserver at startup — it is **not** a Kubernetes resource and cannot be applied with `kubectl`. Any change to it requires copying the file to the server and restarting k3s. + +Noise excluded by policy: lease updates, node heartbeats, health/metrics endpoints. `managedFields` is excluded from all captured events via `omitManagedFields: true` on the ALIECS CRD rule. From 55f507e426230d80b6412a1238cecaa0bbf1be12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 6 Aug 2026 13:18:11 +0200 Subject: [PATCH 2312/2352] fixup! [OCTRL-1095] add k3s observability docs --- control-operator/api/v1alpha1/task_types.go | 8 ++++---- control-operator/internal/controller/task_controller.go | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/control-operator/api/v1alpha1/task_types.go b/control-operator/api/v1alpha1/task_types.go index 6b6d751c3..6b690d8be 100644 --- a/control-operator/api/v1alpha1/task_types.go +++ b/control-operator/api/v1alpha1/task_types.go @@ -89,10 +89,10 @@ type TaskSpec struct { } const ( - ConditionPodReady = "PodReady" - ConditionGRPCConnected = "GRPCConnected" - ConditionStateInitialized = "StateInitialized" - ConditionStateTransitioned = "StateTransitioned" + ConditionPodReady = "PodReady" + ConditionGRPCConnected = "GRPCConnected" + ConditionStateAccessible = "StateAccessible" + ConditionStateTransitionResult = "StateTransitionResult" ) // TaskStatus defines the observed state of Task diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index f0dfafae1..a9a486a4f 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -176,7 +176,7 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } - if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateInitialized, metav1.ConditionTrue, "StateQueried", fmt.Sprintf("Initial state: %s", t.Status.State)); err != nil { + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateAccessible, metav1.ConditionTrue, "StateQueried", fmt.Sprintf("Initial state: %s", t.Status.State)); err != nil { return ctrl.Result{}, err } return ctrl.Result{}, nil @@ -224,7 +224,7 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. if err := r.Status().Update(ctx, t); err != nil { return ctrl.Result{}, err } - if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitioned, metav1.ConditionFalse, "TransitionFailed", fmt.Sprintf("Transition from %s to %s failed: %s", stateReply.GetState(), t.Spec.State, transErr.Error())); err != nil { + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitionResult, metav1.ConditionFalse, "TransitionFailed", fmt.Sprintf("Transition from %s to %s failed: %s", stateReply.GetState(), t.Spec.State, transErr.Error())); err != nil { return ctrl.Result{}, err } return ctrl.Result{}, nil @@ -246,7 +246,7 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. return ctrl.Result{}, err } if t.Status.State != oldStatus.State { - if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitioned, metav1.ConditionTrue, "TransitionComplete", fmt.Sprintf("Transitioned from %s to %s", oldStatus.State, t.Status.State)); err != nil { + if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionStateTransitionResult, metav1.ConditionTrue, "TransitionComplete", fmt.Sprintf("Transitioned from %s to %s", oldStatus.State, t.Status.State)); err != nil { return ctrl.Result{}, err } } From 302f5c5124e099a5aaae4e83ac781457bf4a547f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 7 Aug 2026 13:50:33 +0200 Subject: [PATCH 2313/2352] [control-operator] isPodFailed tests --- .../controller/task_controller_test.go | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/control-operator/internal/controller/task_controller_test.go b/control-operator/internal/controller/task_controller_test.go index ac16d8411..9f36d65b2 100644 --- a/control-operator/internal/controller/task_controller_test.go +++ b/control-operator/internal/controller/task_controller_test.go @@ -110,3 +110,132 @@ func TestPodForTask(t *testing.T) { t.Errorf("owner.Controller = %v, want true", owner.Controller) } } + +func TestIsPodFailed(t *testing.T) { + tests := []struct { + name string + pod *v1.Pod + wantFailed bool + }{ + { + name: "running pod with ready container is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", Ready: true}}, + }, + }, + wantFailed: false, + }, + { + name: "pod phase Failed is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodFailed, + Reason: "Evicted", + }, + }, + wantFailed: true, + }, + { + name: "container waiting CrashLoopBackOff is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "CrashLoopBackOff"}}, + }}, + }, + }, + wantFailed: true, + }, + { + name: "container waiting for a benign reason is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "ContainerCreating"}}, + }}, + }, + }, + wantFailed: false, + }, + { + name: "container terminated with non-zero exit code is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 1}}, + }}, + }, + }, + wantFailed: true, + }, + { + name: "container terminated with exit code 0 is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 0}}, + }}, + }, + }, + wantFailed: false, + }, + { + name: "container with more than 3 restarts and not ready is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: false}}, + }, + }, + wantFailed: true, + }, + { + name: "container with more than 3 restarts but ready is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: true}}, + }, + }, + wantFailed: false, + }, + { + name: "init container failure is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + InitContainerStatuses: []v1.ContainerStatus{{ + Name: "init", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "InvalidImageName"}}, + }}, + }, + }, + wantFailed: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotFailed, gotReason := isPodFailed(tt.pod) + if gotFailed != tt.wantFailed { + t.Errorf("isPodFailed() failed = %v, want %v (reason: %q)", gotFailed, tt.wantFailed, gotReason) + } + if gotFailed && gotReason == "" { + t.Errorf("isPodFailed() returned failed=true with empty reason") + } + if !gotFailed && gotReason != "" { + t.Errorf("isPodFailed() returned failed=false with non-empty reason %q", gotReason) + } + }) + } +} From 739bb09a51de29a10c8cfc2748e819d2d670a582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 5 May 2026 14:32:34 +0200 Subject: [PATCH 2314/2352] [OCTRL-1090] created kubernetes client to interact with cluster --- control-operator/pkg/client/client.go | 133 +++++++++++++++ control-operator/pkg/client/client_test.go | 188 +++++++++++++++++++++ control-operator/pkg/client/suite_test.go | 68 ++++++++ 3 files changed, 389 insertions(+) create mode 100644 control-operator/pkg/client/client.go create mode 100644 control-operator/pkg/client/client_test.go create mode 100644 control-operator/pkg/client/suite_test.go diff --git a/control-operator/pkg/client/client.go b/control-operator/pkg/client/client.go new file mode 100644 index 000000000..73fa7a2b1 --- /dev/null +++ b/control-operator/pkg/client/client.go @@ -0,0 +1,133 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package client + +import ( + "context" + "fmt" + + "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + "k8s.io/apimachinery/pkg/watch" + "k8s.io/client-go/rest" + "k8s.io/client-go/tools/clientcmd" + crClient "sigs.k8s.io/controller-runtime/pkg/client" +) + +type Client struct { + client crClient.WithWatch + namespace string +} + +func New(kubeconfigPath, namespace string) (*Client, error) { + config, err := buildConfig(kubeconfigPath) + if err != nil { + return nil, fmt.Errorf("building kubeconfig: %w", err) + } + return NewFromConfig(config, namespace) +} + +func NewFromConfig(config *rest.Config, namespace string) (*Client, error) { + scheme := runtime.NewScheme() + if err := v1alpha1.AddToScheme(scheme); err != nil { + return nil, fmt.Errorf("registering v1alpha1 scheme: %w", err) + } + + c, err := crClient.NewWithWatch(config, crClient.Options{Scheme: scheme}) + if err != nil { + return nil, fmt.Errorf("creating kubernetes client: %w", err) + } + + return &Client{client: c, namespace: namespace}, nil +} + +func buildConfig(kubeconfigPath string) (*rest.Config, error) { + if kubeconfigPath != "" { + return clientcmd.BuildConfigFromFlags("", kubeconfigPath) + } + if config, err := rest.InClusterConfig(); err == nil { + return config, nil + } + + return nil, fmt.Errorf("ECS isn't running in a container and you didn't pass any kubernetes config") +} + +func (c *Client) CreateTask(ctx context.Context, task *v1alpha1.Task) error { + task.Namespace = c.namespace + return c.client.Create(ctx, task) +} + +func (c *Client) GetTask(ctx context.Context, name string) (*v1alpha1.Task, error) { + task := &v1alpha1.Task{} + err := c.client.Get(ctx, types.NamespacedName{Name: name, Namespace: c.namespace}, task) + return task, err +} + +func (c *Client) UpdateTask(ctx context.Context, task *v1alpha1.Task) error { + task.Namespace = c.namespace + return c.client.Update(ctx, task) +} + +func (c *Client) DeleteTask(ctx context.Context, name string) error { + return c.client.Delete(ctx, &v1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: c.namespace}, + }) +} + +// WatchTasks returns a watcher for all Task resources in the namespace. +// Each event on ResultChan() carries a *v1alpha1.Task as event.Object. +func (c *Client) WatchTasks(ctx context.Context) (watch.Interface, error) { + return c.client.Watch(ctx, &v1alpha1.TaskList{}, crClient.InNamespace(c.namespace)) +} + +func (c *Client) CreateEnvironment(ctx context.Context, env *v1alpha1.Environment) error { + env.Namespace = c.namespace + return c.client.Create(ctx, env) +} + +func (c *Client) GetEnvironment(ctx context.Context, name string) (*v1alpha1.Environment, error) { + env := &v1alpha1.Environment{} + err := c.client.Get(ctx, types.NamespacedName{Name: name, Namespace: c.namespace}, env) + return env, err +} + +func (c *Client) UpdateEnvironment(ctx context.Context, env *v1alpha1.Environment) error { + env.Namespace = c.namespace + return c.client.Update(ctx, env) +} + +func (c *Client) DeleteEnvironment(ctx context.Context, name string) error { + return c.client.Delete(ctx, &v1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{Name: name, Namespace: c.namespace}, + }) +} + +// WatchEnvironments returns a watcher for all Environment resources in the namespace. +// Each event on ResultChan() carries a *v1alpha1.Environment as event.Object. +func (c *Client) WatchEnvironments(ctx context.Context) (watch.Interface, error) { + return c.client.Watch(ctx, &v1alpha1.EnvironmentList{}, crClient.InNamespace(c.namespace)) +} diff --git a/control-operator/pkg/client/client_test.go b/control-operator/pkg/client/client_test.go new file mode 100644 index 000000000..1b23f75fe --- /dev/null +++ b/control-operator/pkg/client/client_test.go @@ -0,0 +1,188 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package client_test + +import ( + "context" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + k8swatch "k8s.io/apimachinery/pkg/watch" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + "github.com/AliceO2Group/Control/control-operator/pkg/client" +) + +var _ = Describe("Client", func() { + var ( + ctx context.Context + c *client.Client + ) + + BeforeEach(func() { + ctx = context.Background() + var err error + c, err = client.NewFromConfig(cfg, "default") + Expect(err).NotTo(HaveOccurred()) + }) + + Describe("Task Create, Read, Update, Delete", func() { + var task *aliecsv1alpha1.Task + + BeforeEach(func() { + task = &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "test-task"}, + Spec: aliecsv1alpha1.TaskSpec{State: "standby", Pod: v1.PodSpec{Containers: []v1.Container{}}}, + } + Expect(c.CreateTask(ctx, task)).To(Succeed()) + }) + + AfterEach(func() { + _ = c.DeleteTask(ctx, task.Name) + }) + + It("gets a created task", func() { + got, err := c.GetTask(ctx, "test-task") + Expect(err).NotTo(HaveOccurred()) + Expect(got.Name).To(Equal("test-task")) + Expect(got.Spec.State).To(Equal("standby")) + }) + + It("updates a task", func() { + got, err := c.GetTask(ctx, "test-task") + Expect(err).NotTo(HaveOccurred()) + + got.Spec.State = "running" + Expect(c.UpdateTask(ctx, got)).To(Succeed()) + + updated, err := c.GetTask(ctx, "test-task") + Expect(err).NotTo(HaveOccurred()) + Expect(updated.Spec.State).To(Equal("running")) + }) + + It("deletes a task", func() { + Expect(c.DeleteTask(ctx, "test-task")).To(Succeed()) + + _, err := c.GetTask(ctx, "test-task") + Expect(err).To(HaveOccurred()) + }) + }) + + Describe("Task Watch", func() { + It("receives events for task changes", func() { + watcher, err := c.WatchTasks(ctx) + Expect(err).NotTo(HaveOccurred()) + defer watcher.Stop() + + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: "watch-task"}, + Spec: aliecsv1alpha1.TaskSpec{State: "standby", Pod: v1.PodSpec{Containers: []v1.Container{}}}, + } + Expect(c.CreateTask(ctx, task)).To(Succeed()) + defer c.DeleteTask(ctx, task.Name) + + Eventually(watcher.ResultChan()).Should(Receive(Satisfy(func(e k8swatch.Event) bool { + t, ok := e.Object.(*aliecsv1alpha1.Task) + return ok && t.Name == "watch-task" && e.Type == k8swatch.Added + }))) + }) + }) + + Describe("Environment Create, Read, Update, Delete", func() { + var env *aliecsv1alpha1.Environment + + BeforeEach(func() { + env = &aliecsv1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{Name: "test-env"}, + Spec: aliecsv1alpha1.EnvironmentSpec{ + State: "standby", + Tasks: map[string][]aliecsv1alpha1.TaskDefinition{}, + }, + TaskTemplates: aliecsv1alpha1.TemplateSpecification{ + Tasks: map[string][]aliecsv1alpha1.TaskReference{}, + }, + } + Expect(c.CreateEnvironment(ctx, env)).To(Succeed()) + }) + + AfterEach(func() { + _ = c.DeleteEnvironment(ctx, env.Name) + }) + + It("gets a created environment", func() { + got, err := c.GetEnvironment(ctx, "test-env") + Expect(err).NotTo(HaveOccurred()) + Expect(got.Name).To(Equal("test-env")) + Expect(got.Spec.State).To(Equal("standby")) + }) + + It("updates an environment", func() { + got, err := c.GetEnvironment(ctx, "test-env") + Expect(err).NotTo(HaveOccurred()) + + got.Spec.State = "running" + Expect(c.UpdateEnvironment(ctx, got)).To(Succeed()) + + updated, err := c.GetEnvironment(ctx, "test-env") + Expect(err).NotTo(HaveOccurred()) + Expect(updated.Spec.State).To(Equal("running")) + }) + + It("deletes an environment", func() { + Expect(c.DeleteEnvironment(ctx, "test-env")).To(Succeed()) + + _, err := c.GetEnvironment(ctx, "test-env") + Expect(err).To(HaveOccurred()) + }) + }) + + Describe("Environment Watch", func() { + It("receives events for environment changes", func() { + watcher, err := c.WatchEnvironments(ctx) + Expect(err).NotTo(HaveOccurred()) + defer watcher.Stop() + + env := &aliecsv1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{Name: "watch-env"}, + Spec: aliecsv1alpha1.EnvironmentSpec{ + State: "standby", + Tasks: map[string][]aliecsv1alpha1.TaskDefinition{}, + }, + TaskTemplates: aliecsv1alpha1.TemplateSpecification{ + Tasks: map[string][]aliecsv1alpha1.TaskReference{}, + }, + } + Expect(c.CreateEnvironment(ctx, env)).To(Succeed()) + defer c.DeleteEnvironment(ctx, env.Name) + + Eventually(watcher.ResultChan()).Should(Receive(Satisfy(func(e k8swatch.Event) bool { + ev, ok := e.Object.(*aliecsv1alpha1.Environment) + return ok && ev.Name == "watch-env" && e.Type == k8swatch.Added + }))) + }) + }) +}) diff --git a/control-operator/pkg/client/suite_test.go b/control-operator/pkg/client/suite_test.go new file mode 100644 index 000000000..cd571f8bf --- /dev/null +++ b/control-operator/pkg/client/suite_test.go @@ -0,0 +1,68 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package client_test + +import ( + "path/filepath" + "testing" + + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" + + "k8s.io/client-go/rest" + "sigs.k8s.io/controller-runtime/pkg/envtest" + logf "sigs.k8s.io/controller-runtime/pkg/log" + "sigs.k8s.io/controller-runtime/pkg/log/zap" +) + +var ( + cfg *rest.Config + testEnv *envtest.Environment +) + +func TestClient(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "Client Suite") +} + +var _ = BeforeSuite(func() { + logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) + + By("bootstrapping test environment") + testEnv = &envtest.Environment{ + CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")}, + ErrorIfCRDPathMissing: true, + } + + var err error + cfg, err = testEnv.Start() + Expect(err).NotTo(HaveOccurred()) + Expect(cfg).NotTo(BeNil()) +}) + +var _ = AfterSuite(func() { + By("tearing down the test environment") + Expect(testEnv.Stop()).To(Succeed()) +}) From 30e5a0fcc78cbc4b42ef9e0fa3c01c0889d4129d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 9 Jul 2026 17:15:32 +0200 Subject: [PATCH 2315/2352] [OCTRL-1090] watch from Version and List by label added to control-operator client --- control-operator/pkg/client/client.go | 21 +++++ control-operator/pkg/client/client_test.go | 102 +++++++++++++++++++++ 2 files changed, 123 insertions(+) diff --git a/control-operator/pkg/client/client.go b/control-operator/pkg/client/client.go index 73fa7a2b1..0f5de71db 100644 --- a/control-operator/pkg/client/client.go +++ b/control-operator/pkg/client/client.go @@ -104,6 +104,19 @@ func (c *Client) WatchTasks(ctx context.Context) (watch.Interface, error) { return c.client.Watch(ctx, &v1alpha1.TaskList{}, crClient.InNamespace(c.namespace)) } +// ListTasksByLabel returns all Task resources matching the given label selector. +// Returns an error if no tasks are found. +func (c *Client) ListTasksByLabel(ctx context.Context, labels map[string]string) ([]v1alpha1.Task, error) { + taskList := &v1alpha1.TaskList{} + if err := c.client.List(ctx, taskList, crClient.InNamespace(c.namespace), crClient.MatchingLabels(labels)); err != nil { + return nil, err + } + if len(taskList.Items) == 0 { + return nil, fmt.Errorf("no Task CRDs found matching labels %v", labels) + } + return taskList.Items, nil +} + func (c *Client) CreateEnvironment(ctx context.Context, env *v1alpha1.Environment) error { env.Namespace = c.namespace return c.client.Create(ctx, env) @@ -131,3 +144,11 @@ func (c *Client) DeleteEnvironment(ctx context.Context, name string) error { func (c *Client) WatchEnvironments(ctx context.Context) (watch.Interface, error) { return c.client.Watch(ctx, &v1alpha1.EnvironmentList{}, crClient.InNamespace(c.namespace)) } + +// WatchEnvironmentsFromVersion watches Environment resources starting from the given resourceVersion, +// ensuring no events that occurred after that version are missed. +func (c *Client) WatchEnvironmentsFromVersion(ctx context.Context, resourceVersion string) (watch.Interface, error) { + return c.client.Watch(ctx, &v1alpha1.EnvironmentList{}, + crClient.InNamespace(c.namespace), + &crClient.ListOptions{Raw: &metav1.ListOptions{ResourceVersion: resourceVersion}}) +} diff --git a/control-operator/pkg/client/client_test.go b/control-operator/pkg/client/client_test.go index 1b23f75fe..7e1b92967 100644 --- a/control-operator/pkg/client/client_test.go +++ b/control-operator/pkg/client/client_test.go @@ -160,6 +160,39 @@ var _ = Describe("Client", func() { }) }) + Describe("WatchEnvironmentsFromVersion", func() { + It("does not miss events that occurred between Get and Watch", func() { + env := &aliecsv1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{Name: "versioned-watch-env"}, + Spec: aliecsv1alpha1.EnvironmentSpec{ + State: "standby", + Tasks: map[string][]aliecsv1alpha1.TaskDefinition{}, + }, + TaskTemplates: aliecsv1alpha1.TemplateSpecification{ + Tasks: map[string][]aliecsv1alpha1.TaskReference{}, + }, + } + Expect(c.CreateEnvironment(ctx, env)).To(Succeed()) + defer c.DeleteEnvironment(ctx, env.Name) + + got, err := c.GetEnvironment(ctx, env.Name) + Expect(err).NotTo(HaveOccurred()) + resourceVersionBeforeUpdate := got.ResourceVersion + + got.Spec.State = "configured" + Expect(c.UpdateEnvironment(ctx, got)).To(Succeed()) + + watcher, err := c.WatchEnvironmentsFromVersion(ctx, resourceVersionBeforeUpdate) + Expect(err).NotTo(HaveOccurred()) + defer watcher.Stop() + + Eventually(watcher.ResultChan()).Should(Receive(Satisfy(func(e k8swatch.Event) bool { + ev, ok := e.Object.(*aliecsv1alpha1.Environment) + return ok && ev.Name == env.Name && ev.Spec.State == "configured" + }))) + }) + }) + Describe("Environment Watch", func() { It("receives events for environment changes", func() { watcher, err := c.WatchEnvironments(ctx) @@ -185,4 +218,73 @@ var _ = Describe("Client", func() { }))) }) }) + + Describe("ListTasksByLabel", func() { + newTask := func(name string, labels map[string]string) *aliecsv1alpha1.Task { + return &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{Name: name, Labels: labels}, + Spec: aliecsv1alpha1.TaskSpec{State: "standby", Pod: v1.PodSpec{Containers: []v1.Container{}}}, + } + } + + It("returns an error when no tasks match", func() { + _, err := c.ListTasksByLabel(ctx, map[string]string{"env": "nonexistent"}) + Expect(err).To(HaveOccurred()) + Expect(err.Error()).To(ContainSubstring("no Task CRDs found")) + }) + + It("returns tasks matching a single label", func() { + task := newTask("label-task-1", map[string]string{"env": "test"}) + Expect(c.CreateTask(ctx, task)).To(Succeed()) + defer c.DeleteTask(ctx, task.Name) + + tasks, err := c.ListTasksByLabel(ctx, map[string]string{"env": "test"}) + Expect(err).NotTo(HaveOccurred()) + Expect(tasks).To(HaveLen(1)) + Expect(tasks[0].Name).To(Equal("label-task-1")) + }) + + It("returns multiple tasks matching a label", func() { + task1 := newTask("label-task-2a", map[string]string{"env": "multi"}) + task2 := newTask("label-task-2b", map[string]string{"env": "multi"}) + Expect(c.CreateTask(ctx, task1)).To(Succeed()) + defer c.DeleteTask(ctx, task1.Name) + Expect(c.CreateTask(ctx, task2)).To(Succeed()) + defer c.DeleteTask(ctx, task2.Name) + + tasks, err := c.ListTasksByLabel(ctx, map[string]string{"env": "multi"}) + Expect(err).NotTo(HaveOccurred()) + Expect(tasks).To(HaveLen(2)) + names := []string{tasks[0].Name, tasks[1].Name} + Expect(names).To(ConsistOf("label-task-2a", "label-task-2b")) + }) + + It("returns only tasks matching all labels", func() { + taskBoth := newTask("label-task-3a", map[string]string{"env": "filter", "role": "worker"}) + taskOne := newTask("label-task-3b", map[string]string{"env": "filter"}) + Expect(c.CreateTask(ctx, taskBoth)).To(Succeed()) + defer c.DeleteTask(ctx, taskBoth.Name) + Expect(c.CreateTask(ctx, taskOne)).To(Succeed()) + defer c.DeleteTask(ctx, taskOne.Name) + + tasks, err := c.ListTasksByLabel(ctx, map[string]string{"env": "filter", "role": "worker"}) + Expect(err).NotTo(HaveOccurred()) + Expect(tasks).To(HaveLen(1)) + Expect(tasks[0].Name).To(Equal("label-task-3a")) + }) + + It("does not return tasks with a different label value", func() { + taskA := newTask("label-task-4a", map[string]string{"env": "staging"}) + taskB := newTask("label-task-4b", map[string]string{"env": "production"}) + Expect(c.CreateTask(ctx, taskA)).To(Succeed()) + defer c.DeleteTask(ctx, taskA.Name) + Expect(c.CreateTask(ctx, taskB)).To(Succeed()) + defer c.DeleteTask(ctx, taskB.Name) + + tasks, err := c.ListTasksByLabel(ctx, map[string]string{"env": "staging"}) + Expect(err).NotTo(HaveOccurred()) + Expect(tasks).To(HaveLen(1)) + Expect(tasks[0].Name).To(Equal("label-task-4a")) + }) + }) }) From 0403bf75f32760e2a0d69623eb96a606304a348f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 22 Jul 2026 17:04:30 +0200 Subject: [PATCH 2316/2352] fixup! [OCTRL-1090] watch from Version and List by label added to control-operator client --- control-operator/pkg/client/client.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/control-operator/pkg/client/client.go b/control-operator/pkg/client/client.go index 0f5de71db..41235f48d 100644 --- a/control-operator/pkg/client/client.go +++ b/control-operator/pkg/client/client.go @@ -69,11 +69,12 @@ func buildConfig(kubeconfigPath string) (*rest.Config, error) { if kubeconfigPath != "" { return clientcmd.BuildConfigFromFlags("", kubeconfigPath) } - if config, err := rest.InClusterConfig(); err == nil { + config, err := rest.InClusterConfig() + if err == nil { return config, nil } - return nil, fmt.Errorf("ECS isn't running in a container and you didn't pass any kubernetes config") + return nil, fmt.Errorf("ECS isn't running in a container and you didn't pass any kubernetes config: %v", err) } func (c *Client) CreateTask(ctx context.Context, task *v1alpha1.Task) error { From 60bc2581410c99d8dbaa79d7a050c12216496441 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Tue, 11 Aug 2026 15:31:12 +0200 Subject: [PATCH 2317/2352] [control-operator] tests for podname creation and labels (#845) [control-operator] labels and podname tests --- .../controller/task_controller_test.go | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/control-operator/internal/controller/task_controller_test.go b/control-operator/internal/controller/task_controller_test.go index 9f36d65b2..7d37a8d68 100644 --- a/control-operator/internal/controller/task_controller_test.go +++ b/control-operator/internal/controller/task_controller_test.go @@ -111,6 +111,49 @@ func TestPodForTask(t *testing.T) { } } +func TestPodNameFromTask(t *testing.T) { + tests := []struct { + name string + taskName string + want string + }{ + {name: "simple task name", taskName: "my-task", want: "aliecs-task-pod-my-task"}, + {name: "empty task name", taskName: "", want: "aliecs-task-pod-"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := podNameFromTask(tt.taskName); got != tt.want { + t.Errorf("podNameFromTask(%q) = %q, want %q", tt.taskName, got, tt.want) + } + }) + } +} + +func TestLabelsForTask(t *testing.T) { + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-task", + }, + } + + want := map[string]string{ + "task_name": "my-task", + "application": "ControlOperator", + } + + got := labelsForTask(task) + + if len(got) != len(want) { + t.Fatalf("labelsForTask() = %v, want %v", got, want) + } + for k, v := range want { + if got[k] != v { + t.Errorf("labelsForTask()[%q] = %q, want %q", k, got[k], v) + } + } +} + func TestIsPodFailed(t *testing.T) { tests := []struct { name string From d35ca0fab057176a4ff1693809ab207044ab591c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 6 Jul 2026 10:56:10 +0200 Subject: [PATCH 2318/2352] [OCTRL-1091] deps --- go.mod | 80 +++++++++++++++++------- go.sum | 190 +++++++++++++++++++++++++++++++++++++++++++++------------ 2 files changed, 209 insertions(+), 61 deletions(-) diff --git a/go.mod b/go.mod index 45da51f25..dab649326 100644 --- a/go.mod +++ b/go.mod @@ -20,7 +20,10 @@ replace github.com/imdario/mergo => github.com/imdario/mergo v0.3.16 replace github.com/armon/go-metrics => github.com/hashicorp/go-metrics v0.5.3 +replace github.com/AliceO2Group/Control/control-operator => ./control-operator + require ( + github.com/AliceO2Group/Control/control-operator v0.0.0 github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect @@ -45,15 +48,15 @@ require ( github.com/olekukonko/tablewriter v0.0.5 github.com/osamingo/indigo v1.1.1 github.com/pborman/uuid v1.2.1 - github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/client_golang v1.23.2 github.com/pseudomuto/protoc-gen-doc v1.5.1 github.com/rivo/tview v0.0.0-20240307173318-e804876934a1 github.com/rs/xid v1.5.0 github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/segmentio/kafka-go v0.4.47 github.com/sirupsen/logrus v1.9.3 - github.com/spf13/cobra v1.8.0 - github.com/spf13/pflag v1.0.5 + github.com/spf13/cobra v1.10.0 + github.com/spf13/pflag v1.0.10 github.com/spf13/viper v1.18.2 github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a github.com/valyala/fasttemplate v1.2.2 @@ -63,7 +66,7 @@ require ( golang.org/x/sys v0.46.0 google.golang.org/grpc v1.79.3 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.36.10 + google.golang.org/protobuf v1.36.11 gopkg.in/yaml.v3 v3.0.1 ) @@ -75,37 +78,56 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/iancoleman/strcase v0.3.0 github.com/influxdata/line-protocol/v2 v2.2.1 - github.com/onsi/ginkgo/v2 v2.19.0 - github.com/onsi/gomega v1.34.1 + github.com/onsi/ginkgo/v2 v2.27.2 + github.com/onsi/gomega v1.38.2 github.com/swaggo/http-swagger/v2 v2.0.2 github.com/swaggo/swag v1.16.3 golang.org/x/exp v0.0.0-20260410095643-746e56fc9e2f + k8s.io/api v0.35.0 + k8s.io/apimachinery v0.35.0 ) require ( github.com/KyleBanks/depth v1.2.1 // indirect + github.com/Masterminds/semver/v3 v3.4.0 // indirect github.com/ProtonMail/go-crypto v1.1.6 // indirect github.com/armon/go-metrics v0.5.3 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.6.3 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect github.com/cyphar/filepath-securejoin v0.6.1 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/emicklei/go-restful/v3 v3.13.0 // indirect github.com/emirpasic/gods v1.18.1 // indirect github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/evanphx/json-patch/v5 v5.9.11 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect + github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/gdamore/encoding v1.0.1 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect github.com/go-git/go-billy/v5 v5.9.0 // indirect github.com/go-logr/logr v1.4.3 // indirect - github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.21.0 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect github.com/go-openapi/spec v0.21.0 // indirect - github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-openapi/swag v0.25.4 // indirect + github.com/go-openapi/swag/cmdutils v0.25.4 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/fileutils v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/jsonutils v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/mangling v0.25.4 // indirect + github.com/go-openapi/swag/netutils v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect github.com/go-task/slim-sprig/v3 v3.0.0 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect + github.com/google/gnostic-models v0.7.1 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 // indirect + github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-hclog v1.6.2 // indirect @@ -118,15 +140,13 @@ require ( github.com/imdario/mergo v0.3.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect - github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/klauspost/compress v1.17.7 // indirect + github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.3.0 // indirect - github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect github.com/magiconair/properties v1.8.7 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect @@ -134,6 +154,9 @@ require ( github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/mwitkow/go-proto-validators v0.3.2 // indirect github.com/naoina/go-stringutil v0.1.0 // indirect github.com/osamingo/base58 v1.0.0 // indirect @@ -142,9 +165,9 @@ require ( github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pjbgf/sha1cd v0.6.0 // indirect github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.50.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.19.2 // indirect github.com/pseudomuto/protokit v0.2.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect @@ -159,19 +182,32 @@ require ( github.com/swaggo/files/v2 v2.0.0 // indirect github.com/urfave/cli/v2 v2.3.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/x448/float16 v0.8.4 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect go.uber.org/multierr v1.11.0 // indirect + go.yaml.in/yaml/v2 v2.4.3 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/mod v0.37.0 // indirect + golang.org/x/oauth2 v0.34.0 // indirect golang.org/x/sync v0.21.0 // indirect golang.org/x/term v0.44.0 // indirect golang.org/x/text v0.39.0 // indirect + golang.org/x/time v0.14.0 // indirect golang.org/x/tools v0.47.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d // indirect + gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - gopkg.in/yaml.v2 v2.4.0 // indirect - sigs.k8s.io/yaml v1.3.0 // indirect + k8s.io/client-go v0.35.0 // indirect + k8s.io/klog/v2 v2.130.1 // indirect + k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e // indirect + k8s.io/utils v0.0.0-20260108192941-914a6e750570 // indirect + sigs.k8s.io/controller-runtime v0.23.0 // indirect + sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect + sigs.k8s.io/randfill v1.0.0 // indirect + sigs.k8s.io/structured-merge-diff/v6 v6.3.1 // indirect + sigs.k8s.io/yaml v1.6.0 // indirect ) replace github.com/codahale/hdrhistogram => github.com/HdrHistogram/hdrhistogram-go v1.0.1 diff --git a/go.sum b/go.sum index 295589814..857597ead 100644 --- a/go.sum +++ b/go.sum @@ -8,6 +8,8 @@ github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= +github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0= +github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= @@ -41,9 +43,8 @@ github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp github.com/cloudflare/circl v1.6.3 h1:9GPOhQGF9MCYUeXyMYlqTR6a5gTrgR/fBLXvUgtVcg8= github.com/cloudflare/circl v1.6.3/go.mod h1:2eXP6Qfat4O/Yhh8BznvKnJ+uzEoTQ6jVKJRn81BiS4= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.6.1 h1:5CeZ1jPXEiYt3+Z6zqprSAgSWiggmpVyciv8syjIpVE= github.com/cyphar/filepath-securejoin v0.6.1/go.mod h1:A8hd4EnAeyujCJRrICiOWqjS1AX0a9kM5XL+NwKoYSc= @@ -57,10 +58,14 @@ github.com/dmarkham/enumer v1.5.11 h1:quorLCaEfzjJ23Pf7PB9lyyaHseh91YfTM/sAD/4Mb github.com/dmarkham/enumer v1.5.11/go.mod h1:yixql+kDDQRYqcuBM2n9Vlt7NoT9ixgXhaXry8vmRg8= github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o= github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= +github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= +github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4= github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA= +github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU= +github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM= github.com/expr-lang/expr v1.17.7 h1:Q0xY/e/2aCIp8g9s/LGvMDCC5PxYlvHgDZRQ4y16JX8= github.com/expr-lang/expr v1.17.7/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -75,13 +80,21 @@ github.com/frankban/quicktest v1.11.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P github.com/frankban/quicktest v1.13.0/go.mod h1:qLE0fzW0VuyUAJgPU19zByoIr0HtCHN/r/VLSOOIySU= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= +github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/encoding v1.0.1 h1:YzKZckdBL6jVt2Gc+5p82qhrGiqMdG/eNs6Wy0u3Uhw= github.com/gdamore/encoding v1.0.1/go.mod h1:0Z0cMFinngz9kS1QfMjCP8TY7em3bZYeeklsSDPivEo= github.com/gdamore/tcell/v2 v2.7.4 h1:sg6/UnTM9jGpZU+oFYAsDahfchWAFW8Xx2yFinNSAYU= github.com/gdamore/tcell/v2 v2.7.4/go.mod h1:dSXtXTSK0VsW1biw65DZLZ2NKr7j0qP/0J7ONmsraWg= +github.com/gkampitakis/ciinfo v0.3.2 h1:JcuOPk8ZU7nZQjdUhctuhQofk7BGHuIy0c9Ez8BNhXs= +github.com/gkampitakis/ciinfo v0.3.2/go.mod h1:1NIwaOcFChN4fa/B0hEBdAb6npDlFL8Bwx4dfRLRqAo= +github.com/gkampitakis/go-diff v1.3.2 h1:Qyn0J9XJSDTgnsgHRdz9Zp24RaJeKMUHg2+PDZZdC4M= +github.com/gkampitakis/go-diff v1.3.2/go.mod h1:LLgOrpqleQe26cte8s36HTWcTmMEur6OPYerdAAS9tk= +github.com/gkampitakis/go-snaps v0.5.15 h1:amyJrvM1D33cPHwVrjo9jQxX8g/7E2wYdZ+01KS3zGE= +github.com/gkampitakis/go-snaps v0.5.15/go.mod h1:HNpx/9GoKisdhw9AFOBT1N7DBs9DiHo/hGheFGBZ+mc= github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= @@ -100,19 +113,55 @@ github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= +github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= +github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY= github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk= -github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= -github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= +github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= +github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= +github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= +github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= +github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= +github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= +github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= +github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -125,8 +174,10 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4= -github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic-models v0.7.1 h1:SisTfuFKJSKM5CPZkffwi6coztzzeYUhc3v4yxLWH8c= +github.com/google/gnostic-models v0.7.1/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= @@ -134,8 +185,8 @@ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6 h1:k7nVchz72niMH6YLQNvHSdIE7iqsQxK1P41mySCvssg= -github.com/google/pprof v0.0.0-20240424215950-a892ee059fd6/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= +github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -208,10 +259,12 @@ github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOl github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jinzhu/copier v0.4.0 h1:w3ciUoD19shMCRargcpm0cm91ytaBhDvuRpz1ODO/U8= github.com/jinzhu/copier v0.4.0/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/joshdk/go-junit v1.0.0 h1:S86cUKIdwBHWwA6xCmFlf3RTLfVXYQfvanM5Uh+K6GE= +github.com/joshdk/go-junit v1.0.0/go.mod h1:TiiV0PqkaNfFXjEiyjWM3XXrhVyCa1K4Zfga6W52ung= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= @@ -223,8 +276,8 @@ github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQL github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= -github.com/klauspost/compress v1.17.7 h1:ehO88t2UGzQK66LMdE8tibEd1ErmzZjNEqWkjLAKQQg= -github.com/klauspost/compress v1.17.7/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= +github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -245,8 +298,8 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/maruel/natural v1.1.1 h1:Hja7XhhmvEFhcByqDoHz9QZbkWey+COd9xWfCfn1ioo= +github.com/maruel/natural v1.1.1/go.mod h1:v+Rfd79xlw1AgVBjbO0BEQmptqb5HvL/k9GRHB7ZKEg= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= @@ -268,6 +321,8 @@ github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mesos/mesos-go v0.0.11 h1:jMp9+W3zLu46g8EuP2su2Sjj7ipBh4N/g65c0kzGl/8= github.com/mesos/mesos-go v0.0.11/go.mod h1:kPYCMQ9gsOXVAle1OsoY4I1+9kPu8GHkf88aV59fDr4= +github.com/mfridman/tparse v0.18.0 h1:wh6dzOKaIwkUGyKgOntDW4liXSo37qg5AXbIhkMV3vE= +github.com/mfridman/tparse v0.18.0/go.mod h1:gEvqZTuCgEhPbYk/2lS3Kcxg1GmTxxU7kTC8DvP0i/A= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d h1:5PJl274Y63IEHC+7izoQE9x6ikvDFZS2mDVS3drnohI= github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= @@ -284,9 +339,15 @@ github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= +github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-proto-validators v0.3.2 h1:qRlmpTzm2pstMKKzTdvwPCF5QfBNURSlAgN/R+qbKos= github.com/mwitkow/go-proto-validators v0.3.2/go.mod h1:ej0Qp0qMgHN/KtDyUt+Q1/tA7a5VarXUOUxD+oeD30w= @@ -297,10 +358,10 @@ github.com/naoina/toml v0.1.1/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= -github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= -github.com/onsi/gomega v1.34.1 h1:EUMJIKUjM8sKjYbtxQI9A4z2o+rruxnzNvpknOXie6k= -github.com/onsi/gomega v1.34.1/go.mod h1:kU1QgUvBDLXBJq618Xvm2LUX6rSAfRaFRTcdOeDLwwY= +github.com/onsi/ginkgo/v2 v2.27.2 h1:LzwLj0b89qtIy6SSASkzlNvX6WktqurSHwkk2ipF/Ns= +github.com/onsi/ginkgo/v2 v2.27.2/go.mod h1:ArE1D/XhNXBXCBkKOLkbsb2c81dQHCRcF5zwn/ykDRo= +github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A= +github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k= github.com/osamingo/base58 v1.0.0 h1:NhsHxeyMRaD5Li67LgdZG+4/rlyaNr9rVqYQxNGLOYg= github.com/osamingo/base58 v1.0.0/go.mod h1:nADsGCd4fm122SrLUaut+PhzCVwyvchAgxxBVDS5Wf8= github.com/osamingo/indigo v1.1.1 h1:tjPwqwZIq6pqUzfMxCKQeSaFRW0MzLrdT3lszGqYSpg= @@ -333,22 +394,22 @@ github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BU github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= +github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= -github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= -github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= +github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= -github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +github.com/prometheus/procfs v0.19.2 h1:zUMhqEW66Ex7OXIiDkll3tl9a1ZdilUOd/F6ZXw4Vws= +github.com/prometheus/procfs v0.19.2/go.mod h1:M0aotyiemPhBCM0z5w87kL22CxfcH05ZpYlu+b4J7mw= github.com/pseudomuto/protoc-gen-doc v1.5.1 h1:Ah259kcrio7Ix1Rhb6u8FCaOkzf9qRBqXnvAufg061w= github.com/pseudomuto/protoc-gen-doc v1.5.1/go.mod h1:XpMKYg6zkcpgfpCfQ8GcWBDRtRxOmMR5w7pz4Xo+dYM= github.com/pseudomuto/protokit v0.2.1 h1:kCYpE3thoR6Esm0CUvd5xbrDTOZPvQPTDeyXpZfrJdk= @@ -393,17 +454,19 @@ github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/cobra v1.10.0 h1:a5/WeUlSDCvV5a45ljW2ZFtV0bTDpkfSAj3uqB6Sc+0= +github.com/spf13/cobra v1.10.0/go.mod h1:9dhySC7dnTtEiqzmqfkLj47BslqLCUPMXjG2lj/NgoE= +github.com/spf13/pflag v1.0.8/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -424,6 +487,14 @@ github.com/swaggo/swag v1.16.3 h1:PnCYjPCah8FK4I26l2F/KQ4yz3sILcVUN3cTlBFA9Pg= github.com/swaggo/swag v1.16.3/go.mod h1:DImHIuOFXKpMFAQjcC7FG4m3Dg4+QuUgUzJmKjI/gRk= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a h1:iFCCEcdQHtGCeBv3zQOq67yIoVSubAMoPKnDUSfEw9M= github.com/teo/logrus-prefixed-formatter v0.5.3-0.20230717095749-669d57324f0a/go.mod h1:76q+dZ4qOCuYrqwoUUjVCuAXF1TXB4jc98eaZFo6Yh0= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= +github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= +github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= +github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= +github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= @@ -431,6 +502,8 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= +github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= @@ -456,8 +529,16 @@ go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2W go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.3 h1:6gvOSjQoTB3vt1l+CU+tSyi/HOjfOjRLJ4YwYZGwRO0= +go.yaml.in/yaml/v2 v2.4.3/go.mod h1:zSxWcmIDjOzPXpjlTTbAsKokqkDNAVtZO0WOMiT90s8= +go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= +go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= @@ -492,6 +573,8 @@ golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.56.0 h1:Rw8j/hFzGvJUZwNBXnAtf5sVDVt+65SK2C7IxCxZt5o= golang.org/x/net v0.56.0/go.mod h1:D3Ku6r+V6JROoZK144D2XfMHFcMq/0zSfLelVTCFKec= +golang.org/x/oauth2 v0.34.0 h1:hqK/t4AKgbqWkdkcAeI8XLmbK+4m4G5YeQRrmiotGlw= +golang.org/x/oauth2 v0.34.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -557,6 +640,8 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.39.0 h1:UbZz4pLOvn600D6Oh6GGEI6VAmndrEBLv8/6BEXzyus= golang.org/x/text v0.39.0/go.mod h1:3UwRclnC2g0TU9x8PZiyfOajCd1zaUNHF9cvqcQZ+ZM= +golang.org/x/time v0.14.0 h1:MRx4UaLrDotUKUdCIqzPC48t1Y9hANFKIRpNx+Te8PI= +golang.org/x/time v0.14.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -575,20 +660,26 @@ gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d h1:xXzuihhT3gL/ntduUZwHECzAn57E8dA6l8SOtYWdD8Q= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260122232226-8e98ce8d340d/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/evanphx/json-patch.v4 v4.13.0 h1:czT3CmqEaQ1aanPc5SdlgQrrEIb8w/wwCvWWnfEbYzo= +gopkg.in/evanphx/json-patch.v4 v4.13.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= @@ -598,11 +689,32 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= -sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= +k8s.io/api v0.35.0 h1:iBAU5LTyBI9vw3L5glmat1njFK34srdLmktWwLTprlY= +k8s.io/api v0.35.0/go.mod h1:AQ0SNTzm4ZAczM03QH42c7l3bih1TbAXYo0DkF8ktnA= +k8s.io/apiextensions-apiserver v0.35.0 h1:3xHk2rTOdWXXJM+RDQZJvdx0yEOgC0FgQ1PlJatA5T4= +k8s.io/apiextensions-apiserver v0.35.0/go.mod h1:E1Ahk9SADaLQ4qtzYFkwUqusXTcaV2uw3l14aqpL2LU= +k8s.io/apimachinery v0.35.0 h1:Z2L3IHvPVv/MJ7xRxHEtk6GoJElaAqDCCU0S6ncYok8= +k8s.io/apimachinery v0.35.0/go.mod h1:jQCgFZFR1F4Ik7hvr2g84RTJSZegBc8yHgFWKn//hns= +k8s.io/client-go v0.35.0 h1:IAW0ifFbfQQwQmga0UdoH0yvdqrbwMdq9vIFEhRpxBE= +k8s.io/client-go v0.35.0/go.mod h1:q2E5AAyqcbeLGPdoRB+Nxe3KYTfPce1Dnu1myQdqz9o= +k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= +k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= +k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e h1:iW9ChlU0cU16w8MpVYjXk12dqQ4BPFBEgif+ap7/hqQ= +k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e/go.mod h1:kdmbQkyfwUagLfXIad1y2TdrjPFWp2Q89B3qkRwf/pQ= +k8s.io/utils v0.0.0-20260108192941-914a6e750570 h1:JT4W8lsdrGENg9W+YwwdLJxklIuKWdRm+BC+xt33FOY= +k8s.io/utils v0.0.0-20260108192941-914a6e750570/go.mod h1:xDxuJ0whA3d0I4mf/C4ppKHxXynQ+fxnkmQH0vTHnuk= +sigs.k8s.io/controller-runtime v0.23.0 h1:Ubi7klJWiwEWqDY+odSVZiFA0aDSevOCXpa38yCSYu8= +sigs.k8s.io/controller-runtime v0.23.0/go.mod h1:DBOIr9NsprUqCZ1ZhsuJ0wAnQSIxY/C6VjZbmLgw0j0= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 h1:IpInykpT6ceI+QxKBbEflcR5EXP7sU1kvOlxwZh5txg= +sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= +sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= +sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= +sigs.k8s.io/structured-merge-diff/v6 v6.3.1 h1:JrhdFMqOd/+3ByqlP2I45kTOZmTRLBUm5pvRjeheg7E= +sigs.k8s.io/structured-merge-diff/v6 v6.3.1/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= +sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= +sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= From 43aa5c0f0f43a991b1d775643c869540a0876a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 6 Jul 2026 10:57:51 +0200 Subject: [PATCH 2319/2352] [OCTRL-1091] new kubernetes_direct and fairmq controlmodes --- common/controlmode/controlmode.go | 10 ++++++++++ core/task/task.go | 11 ++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/common/controlmode/controlmode.go b/common/controlmode/controlmode.go index 5cab19729..1a77e98d6 100644 --- a/common/controlmode/controlmode.go +++ b/common/controlmode/controlmode.go @@ -41,6 +41,8 @@ const ( HOOK KUBECTL_DIRECT KUBECTL_FAIRMQ + KUBERNETES_DIRECT + KUBERNETES_FAIRMQ ) func (cm ControlMode) String() string { @@ -57,6 +59,10 @@ func (cm ControlMode) String() string { return "kubectl_direct" case KUBECTL_FAIRMQ: return "kubectl_fairmq" + case KUBERNETES_DIRECT: + return "kubernetes_direct" + case KUBERNETES_FAIRMQ: + return "kubernetes_fairmq" } return "direct" } @@ -81,6 +87,10 @@ func (cm *ControlMode) UnmarshalText(b []byte) error { *cm = KUBECTL_DIRECT case "kubectl_fairmq": *cm = KUBECTL_FAIRMQ + case "kubernetes_direct": + *cm = KUBERNETES_DIRECT + case "kubernetes_fairmq": + *cm = KUBERNETES_FAIRMQ default: *cm = DIRECT } diff --git a/core/task/task.go b/core/task/task.go index bee19a1b5..2bea663bb 100644 --- a/core/task/task.go +++ b/core/task/task.go @@ -288,7 +288,9 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { class.Control.Mode == controlmode.DIRECT || class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.KUBECTL_DIRECT || - class.Control.Mode == controlmode.KUBECTL_FAIRMQ { + class.Control.Mode == controlmode.KUBECTL_FAIRMQ || + class.Control.Mode == controlmode.KUBERNETES_DIRECT || + class.Control.Mode == controlmode.KUBERNETES_FAIRMQ { var varStack map[string]string // First we get the full varStack from the parent role, and @@ -396,7 +398,8 @@ func (t *Task) BuildTaskCommand(role parentRole) (err error) { } if class.Control.Mode == controlmode.FAIRMQ || - class.Control.Mode == controlmode.KUBECTL_FAIRMQ { + class.Control.Mode == controlmode.KUBECTL_FAIRMQ || + class.Control.Mode == controlmode.KUBERNETES_FAIRMQ { // FIXME read this from configuration // if the task class doesn't provide an id, we generate one ourselves if !utils.StringSliceContains(cmd.Arguments, "--id") { @@ -640,7 +643,9 @@ func (t *Task) BuildPropertyMap(bindMap channel.BindMap) (propMap controlcommand if class.Control.Mode == controlmode.FAIRMQ || class.Control.Mode == controlmode.DIRECT || class.Control.Mode == controlmode.KUBECTL_DIRECT || - class.Control.Mode == controlmode.KUBECTL_FAIRMQ { + class.Control.Mode == controlmode.KUBECTL_FAIRMQ || + class.Control.Mode == controlmode.KUBERNETES_DIRECT || + class.Control.Mode == controlmode.KUBERNETES_FAIRMQ { for _, inbCh := range channel.MergeInbound(parent.CollectInboundChannels(), class.Bind) { // We get the FairMQ-formatted propertyMap from the inbound channel spec var chanProps controlcommands.PropertyMap From 84d194c490200fb4d9f71e95eb982a5f86f416c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 8 Jul 2026 16:52:37 +0200 Subject: [PATCH 2320/2352] [OCTRL-1091] kubernetes k8s manager --- core/task/managerk8s.go | 452 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 452 insertions(+) create mode 100644 core/task/managerk8s.go diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go new file mode 100644 index 000000000..6367afa1f --- /dev/null +++ b/core/task/managerk8s.go @@ -0,0 +1,452 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package task + +import ( + "context" + "fmt" + "maps" + "strings" + "sync" + "time" + + corev1 "k8s.io/api/core/v1" + k8sapierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/watch" + + "github.com/AliceO2Group/Control/common/gera" + "github.com/AliceO2Group/Control/common/utils/uid" + "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" + k8sclient "github.com/AliceO2Group/Control/control-operator/pkg/client" + "github.com/AliceO2Group/Control/core/task/channel" + "github.com/AliceO2Group/Control/core/task/sm" + "github.com/AliceO2Group/Control/core/task/taskclass" + "github.com/spf13/viper" +) + +// TODO: revisit all the timeouts in ECS. they shouldn't be hardcoded. +const ( + k8sDeployTimeout = 80 * time.Second + k8sTransitionTimeout = 80 * time.Second + k8sWatchRetryDelay = 5 * time.Second +) + +// k8sEnvRegistry maps ECS environment IDs to K8s Environment CRD names. +type k8sEnvRegistry struct { + mu sync.RWMutex + envs map[uid.ID]string +} + +func newK8sEnvRegistry() *k8sEnvRegistry { + return &k8sEnvRegistry{envs: make(map[uid.ID]string)} +} + +func (r *k8sEnvRegistry) set(envId uid.ID, crdName string) { + r.mu.Lock() + r.envs[envId] = crdName + r.mu.Unlock() +} + +func (r *k8sEnvRegistry) get(envId uid.ID) (string, bool) { + r.mu.RLock() + defer r.mu.RUnlock() + crdName, ok := r.envs[envId] + return crdName, ok +} + +func (r *k8sEnvRegistry) delete(envId uid.ID) { + r.mu.Lock() + delete(r.envs, envId) + r.mu.Unlock() +} + +// newK8sClientFromViper creates a K8s client from viper config. +// Returns nil, nil if kubeNamespace is not configured (K8s disabled). +func newK8sClientFromViper() (*k8sclient.Client, error) { + namespace := viper.GetString("kubeNamespace") + if namespace == "" { + return nil, nil + } + kubeconfig := viper.GetString("kubeconfig") + return k8sclient.New(kubeconfig, namespace) +} + +type k8sTaskEntry struct { + task *Task + desc *Descriptor +} + +// deployKubernetesTasks deploys all KUBERNETES-mode descriptors by creating one Environment CRD that +// references the pre-deployed TaskTemplate CRDs. It blocks until the operator reports status.state == "standby". +func (m *Manager) deployKubernetesTasks(ctx context.Context, envId uid.ID, descriptors Descriptors) (DeploymentMap, error) { + log.WithField("partition", envId). + WithField("count", len(descriptors)). + Info("deploying K8s tasks") + + entries, err := m.createK8sTaskEntries(envId, descriptors) + if err != nil { + log.WithField("partition", envId).WithError(err).Error("failed to create K8s task entries") + return nil, err + } + + nodeToRefs, err := m.buildK8sNodeTaskRefs(entries) + if err != nil { + log.WithField("partition", envId).WithError(err).Error("failed to build K8s node task refs") + return nil, err + } + + for _, e := range entries { + m.roster.append(e.task) + } + + envCRDName, err := m.createK8sEnvironmentCRD(ctx, envId, nodeToRefs) + if err != nil { + log.WithField("partition", envId).WithError(err).Error("failed to create K8s Environment CRD") + return nil, err + } + + log.WithField("partition", envId). + WithField("crd", envCRDName). + Infof("K8s Environment CRD created, waiting up to %s for standby", k8sDeployTimeout) + + if err := m.waitForK8sEnvState(ctx, envCRDName, "standby", k8sDeployTimeout); err != nil { + log.WithField("partition", envId).WithField("crd", envCRDName).WithError(err).Error("K8s Environment did not reach standby") + return nil, fmt.Errorf("waiting for Environment %s standby: %w", envCRDName, err) + } + + log.WithField("partition", envId). + WithField("crd", envCRDName). + Infof("K8s Environment reached standby, %d tasks deployed", len(entries)) + + deployed := make(DeploymentMap, len(entries)) + for _, e := range entries { + deployed[e.task] = e.desc + } + return deployed, nil +} + +func (m *Manager) createK8sTaskEntries(envId uid.ID, descriptors Descriptors) ([]k8sTaskEntry, error) { + entries := make([]k8sTaskEntry, 0, len(descriptors)) + for _, desc := range descriptors { + taskClass, ok := m.classes.GetClass(desc.TaskClassName) + if !ok || taskClass == nil { + return nil, fmt.Errorf("task class not found: %s", desc.TaskClassName) + } + + nodeName, err := nodeNameFromDescriptor(desc, taskClass) + if err != nil { + return nil, err + } + t := m.newTaskForKubernetes(desc, nodeName) + + wants, err := m.GetWantsForDescriptor(desc, envId) + if err != nil { + return nil, fmt.Errorf("getting wants for %s: %w", desc.TaskClassName, err) + } + + for _, ch := range wants.InboundChannels { + if ch.Addressing == channel.IPC { + t.localBindMap[ch.Name] = channel.NewBoundIpcEndpoint(ch.Transport) + } else { + log.WithField("task", desc.TaskClassName). + WithField("channel", ch.Name). + Warn("TCP inbound channel in K8s task — skipping port allocation") + } + if len(ch.Global) != 0 { + t.localBindMap["::"+ch.Global] = t.localBindMap[ch.Name] + } + } + + entries = append(entries, k8sTaskEntry{task: t, desc: desc}) + } + return entries, nil +} + +func (m *Manager) buildK8sNodeTaskRefs(entries []k8sTaskEntry) (map[string][]v1alpha1.TaskReference, error) { + nodeToRefs := make(map[string][]v1alpha1.TaskReference) + for _, e := range entries { + t := e.task + desc := e.desc + + taskClass, _ := m.classes.GetClass(desc.TaskClassName) + + if err := t.BuildTaskCommand(desc.TaskRole); err != nil { + return nil, fmt.Errorf("building task command for %s: %w", desc.TaskClassName, err) + } + cmd := t.GetTaskCommandInfo() + + for varName, defaultValue := range map[string]string{ + "O2_ROLE": t.hostname, + "O2_SYSTEM": "FLP", + } { + varIsSet := false + for _, e := range cmd.Env { + key, _, _ := strings.Cut(e, "=") + if key == varName { + varIsSet = true + break + } + } + if !varIsSet { + cmd.Env = append(cmd.Env, fmt.Sprintf("%s=%s", varName, defaultValue)) + } + } + + argsCLI := make([]string, 0, len(cmd.Arguments)) + for _, arg := range cmd.Arguments { + if strings.TrimSpace(arg) != "" { + argsCLI = append(argsCLI, arg) + } + } + + ref := v1alpha1.TaskReference{ + Name: taskClass.Identifier.Name, + TaskID: t.taskId, + ArgsCLI: argsCLI, + Env: cmdEnvToK8sEnvVars(cmd.Env), + } + nodeToRefs[t.hostname] = append(nodeToRefs[t.hostname], ref) + } + return nodeToRefs, nil +} + +func (m *Manager) createK8sEnvironmentCRD(ctx context.Context, envId uid.ID, nodeToRefs map[string][]v1alpha1.TaskReference) (string, error) { + envCRDName := strings.ToLower(envId.String()) + + env := &v1alpha1.Environment{ + ObjectMeta: metav1.ObjectMeta{Name: envCRDName}, + TaskTemplates: v1alpha1.TemplateSpecification{ + Tasks: nodeToRefs, + }, + Spec: v1alpha1.EnvironmentSpec{ + Tasks: make(map[string][]v1alpha1.TaskDefinition), + State: "standby", + }, + } + if err := m.k8sClient.CreateEnvironment(ctx, env); err != nil { + return "", fmt.Errorf("creating Environment CRD %s: %w", envCRDName, err) + } + m.k8sEnvs.set(envId, envCRDName) + return envCRDName, nil +} + +// equivalent of newTaskForMesosOffer in manager.go +func (m *Manager) newTaskForKubernetes(desc *Descriptor, nodeName string) *Task { + newId := uid.New().String() + t := &Task{ + name: fmt.Sprintf("%s#%s", desc.TaskClassName, newId), + parent: desc.TaskRole, + className: desc.TaskClassName, + hostname: nodeName, + agentId: "kubernetes", + offerId: "kubernetes", + taskId: newId, + executorId: "kubernetes", + properties: gera.MakeMap[string, string]().Wrap(m.GetTaskClass(desc.TaskClassName).Properties), + localBindMap: make(channel.BindMap), + state: sm.STANDBY, + status: ACTIVE, + } + t.GetTaskClass = func() *taskclass.Class { + return m.GetTaskClass(t.className) + } + return t +} + +func (m *Manager) waitForK8sEnvState(ctx context.Context, envCRDName, expected string, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + // Check current state before watching in case it's already reached. + env, err := m.k8sClient.GetEnvironment(ctx, envCRDName) + if err != nil { + return fmt.Errorf("getting Environment %s: %w", envCRDName, err) + } + if env.Status.State == expected { + return nil + } + + watcher, err := m.k8sClient.WatchEnvironmentsFromVersion(ctx, env.ResourceVersion) + if err != nil { + return fmt.Errorf("watching Environments: %w", err) + } + defer watcher.Stop() + + for { + select { + case <-ctx.Done(): + return fmt.Errorf("timeout waiting for Environment %s to reach state %q: %w", envCRDName, expected, ctx.Err()) + case ev, ok := <-watcher.ResultChan(): + if !ok { + return fmt.Errorf("watch channel closed waiting for Environment %s", envCRDName) + } + env, ok := ev.Object.(*v1alpha1.Environment) + if !ok { + continue + } + log.WithField("partition", envCRDName). + WithField("crd", envCRDName).Debug("received some environment update") + if env.Name == envCRDName { + log.WithField("crd", envCRDName). + WithField("state", env.Status.State). + WithField("expected", expected). + Debug("K8s Environment state update received") + if env.Status.State == expected { + return nil + } + } + } + } +} + +// configureK8sTasks is necessary addition to transitionAndWaitK8sEnvState because we need to pass generated +// channels to individual tasks. These are generated during Configure transition +func (m *Manager) configureK8sTasks(ctx context.Context, envId uid.ID, tasks Tasks, bindMap channel.BindMap) error { + for _, t := range tasks { + propMap, err := t.BuildPropertyMap(bindMap) + if err != nil { + return fmt.Errorf("building property map for K8s task %s: %w", t.GetClassName(), err) + } + + k8sTaskList, err := m.k8sClient.ListTasksByLabel(ctx, map[string]string{"taskID": t.taskId}) + if err != nil { + return fmt.Errorf("error while listing K8s Task CRD for task %s: %w", t.taskId, err) + } + if len(k8sTaskList) == 0 { + return fmt.Errorf("there were not tasks for taskId %s", t.taskId) + } else if len(k8sTaskList) > 1 { + return fmt.Errorf("there was more than one task for taskId %s", t.taskId) + } + + k8sTask := k8sTaskList[0] + if k8sTask.Spec.Arguments == nil { + k8sTask.Spec.Arguments = make(map[string]string) + } + maps.Copy(k8sTask.Spec.Arguments, propMap) + if err := m.k8sClient.UpdateTask(ctx, &k8sTask); err != nil { + return fmt.Errorf("updating arguments for K8s Task CRD %s: %w", k8sTask.Name, err) + } + } + return m.transitionAndWaitK8sEnvState(ctx, envId, "configured") +} + +// transitionAndWaitK8sEnvState is the easy way to transition tasks. Posibility for future: make this async, +// so we don't have to wait during deployment +func (m *Manager) transitionAndWaitK8sEnvState(ctx context.Context, envId uid.ID, targetState string) error { + crdName, ok := m.k8sEnvs.get(envId) + if !ok { + return fmt.Errorf("no K8s Environment CRD registered for env %s", envId) + } + env, err := m.k8sClient.GetEnvironment(ctx, crdName) + if err != nil { + return fmt.Errorf("error getting Environment CRD %s: %w", crdName, err) + } + env.Spec.State = targetState + if err := m.k8sClient.UpdateEnvironment(ctx, env); err != nil { + return fmt.Errorf("updating Environment CRD %s: %w", crdName, err) + } + return m.waitForK8sEnvState(ctx, crdName, targetState, k8sTransitionTimeout) +} + +func (m *Manager) killK8sEnvironment(ctx context.Context, envId uid.ID) error { + crdName, ok := m.k8sEnvs.get(envId) + if !ok { + return nil + } + if err := m.k8sClient.DeleteEnvironment(ctx, crdName); err != nil { + return fmt.Errorf("deleting Environment CRD %s: %w", crdName, err) + } + m.k8sEnvs.delete(envId) + return nil +} + +func (m *Manager) killK8sTask(ctx context.Context, task *Task) error { + err := m.k8sClient.DeleteTask(ctx, task.taskId) + if k8sapierrors.IsNotFound(err) { + return nil + } + return err +} + +func (m *Manager) watchK8sTasks(ctx context.Context) { + for ctx.Err() == nil { + watcher, err := m.k8sClient.WatchTasks(ctx) + if err != nil { + log.WithError(err).Warnf("failed to start K8s task watcher, retrying after %v", k8sWatchRetryDelay) + time.Sleep(k8sWatchRetryDelay) + continue + } + messages: + for { + select { + case <-ctx.Done(): + watcher.Stop() + return + case ev, ok := <-watcher.ResultChan(): + if !ok { + break messages + } + m.process(ev) + } + } + } +} + +func (m *Manager) process(ev watch.Event) { + k8sTask, ok := ev.Object.(*v1alpha1.Task) + if !ok || k8sTask.Status.State == "" { + return + } + if taskId, ok := k8sTask.Labels["taskID"]; ok && taskId != "" { + m.updateTaskState(taskId, strings.ToUpper(k8sTask.Status.State)) + } +} + +// nodeNameFromDescriptor extracts the target K8s node name from the merged constraints. +// Workflows pin tasks to a host via a machine_id constraint (set by the per-host for loop +// in workflow templates). Returns an error if no machine_id constraint is found, since K8s +// tasks require an explicit node target (there is no offer mechanism to derive it from). +func nodeNameFromDescriptor(desc *Descriptor, taskClass *taskclass.Class) (string, error) { + merged := desc.RoleConstraints.MergeParent(taskClass.Constraints) + for _, c := range merged { + if c.Attribute == "machine_id" { + return c.Value, nil + } + } + return "", fmt.Errorf("task class %q has no machine_id constraint: K8s tasks require a machine_id constraint to select the target node", desc.TaskClassName) +} + +// cmdEnvToK8sEnvVars converts a slice of "KEY=VALUE" strings to Kubernetes EnvVar objects. +func cmdEnvToK8sEnvVars(env []string) []corev1.EnvVar { + vars := make([]corev1.EnvVar, 0, len(env)) + for _, e := range env { + parts := strings.SplitN(e, "=", 2) + if len(parts) == 2 { + vars = append(vars, corev1.EnvVar{Name: parts[0], Value: parts[1]}) + } + } + return vars +} From fd6325e936cd8afbcecd84d5373f54edabb83255 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Wed, 8 Jul 2026 18:12:57 +0200 Subject: [PATCH 2321/2352] [OCTRL-1091] split deployment of k8s and mesos tasks in manager --- core/task/manager.go | 146 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 137 insertions(+), 9 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 9c96b83d3..ae220022e 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -33,6 +33,7 @@ import ( "sync" "time" + "github.com/AliceO2Group/Control/common/controlmode" "github.com/AliceO2Group/Control/common/utils/safeacks" "github.com/AliceO2Group/Control/apricot" @@ -51,6 +52,7 @@ import ( "github.com/spf13/viper" "gopkg.in/yaml.v3" + k8sclient "github.com/AliceO2Group/Control/control-operator/pkg/client" "github.com/AliceO2Group/Control/core/controlcommands" "github.com/AliceO2Group/Control/core/task/channel" "github.com/k0kubun/pp" @@ -103,6 +105,9 @@ type Manager struct { internalEventCh chan<- event.Event ackKilledTasks *safeacks.SafeAcks killTasksMu sync.Mutex // to avoid races when attempting to kill the same tasks in different goroutines + + k8sClient *k8sclient.Client + k8sEnvs *k8sEnvRegistry } func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *Manager, err error) { @@ -144,6 +149,13 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.tasksToDeploy = taskman.schedulerState.tasksToDeploy taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg taskman.ackKilledTasks = safeacks.NewAcks() + taskman.k8sEnvs = newK8sEnvRegistry() + if k8sClient, k8sErr := newK8sClientFromViper(); k8sErr != nil { + log.WithError(k8sErr).Warn("K8s client init failed, K8s tasks disabled") + } else { + log.Info("K8s client initiated") + taskman.k8sClient = k8sClient + } schedState.setupCli() @@ -476,6 +488,33 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e tasksToRun = append(tasksToRun, taskDescriptors...) } + // Split K8s descriptors out before the Mesos retry loop. + var k8sDescriptors Descriptors + { + mesos := make(Descriptors, 0, len(tasksToRun)) + for _, desc := range tasksToRun { + class, ok := m.classes.GetClass(desc.TaskClassName) + if ok && class != nil && (class.Control.Mode == controlmode.KUBERNETES_DIRECT || + class.Control.Mode == controlmode.KUBERNETES_FAIRMQ) { + k8sDescriptors = append(k8sDescriptors, desc) + } else { + mesos = append(mesos, desc) + } + } + tasksToRun = mesos + } + + var k8sDeployed DeploymentMap + var k8sDeployErr error + if len(k8sDescriptors) > 0 { + if m.k8sClient == nil { + k8sDeployErr = fmt.Errorf("K8s client not configured") + } else { + // TODO: this is synchronous call it would be worth it to make it async, so mesos loop doesn't have to wait for k8s + k8sDeployed, k8sDeployErr = m.deployKubernetesTasks(context.Background(), envId, k8sDescriptors) + } + } + // TODO: fill out tasksToTeardown in the previous loop //if len(tasksToTeardown) > 0 { // err = m.TeardownTasks(tasksToTeardown) @@ -617,6 +656,32 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } } + // Merge K8s deployment results into unified tracking. + if k8sDeployErr != nil { + logWithId.WithError(k8sDeployErr).Error("K8s task deployment failed") + for _, desc := range k8sDescriptors { + if desc.TaskRole.GetTaskTraits().Critical { + deploymentSuccess = false + undeployableCriticalDescriptors = append(undeployableCriticalDescriptors, desc) + undeployableDescriptors = append(undeployableDescriptors, desc) + } else { + undeployableNonCriticalDescriptors = append(undeployableNonCriticalDescriptors, desc) + undeployableDescriptors = append(undeployableDescriptors, desc) + } + } + } else { + logWithId.Infof("succeeded to deploy %d kubernetes tasks", len(k8sDeployed)) + for taskPtr, desc := range k8sDeployed { + taskPtr.SetParent(desc.TaskRole) + if !taskPtr.IsLocked() { + log.WithField("task", taskPtr.taskId).Warning("K8s task not locked after deployment") + deploymentSuccess = false + } + allDeployedTasks[taskPtr] = desc + desc.TaskRole.UpdateStatus(ACTIVE) + } + } + log.Infof("Succeeded to deploy %d/%d tasks", len(allDeployedTasks), len(tasksToRun)) { @@ -667,6 +732,13 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e } func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) { + if m.k8sClient != nil { + if err := m.killK8sEnvironment(context.Background(), envId); err != nil { + log.WithError(err).WithField("partition", envId.String()). + Warn("failed to delete K8s Environment CRD during release") + } + } + taskReleaseErrors := make(map[string]error) taskIdsReleased := make([]string, 0) @@ -701,18 +773,21 @@ func (m *Manager) releaseTask(envId uid.ID, task *Task) error { } func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { - notify := make(chan controlcommands.MesosCommandResponse) - receivers, err := tasks.GetMesosCommandTargets() - if err != nil { - return err - } - - if tasks == nil || len(tasks) == 0 { - return fmt.Errorf("empty task list to configure for environment %s", envId.String()) + var k8sTasks Tasks + var mesosTasks Tasks + for _, t := range tasks { + if t.GetControlMode() == controlmode.KUBERNETES_DIRECT || + t.GetControlMode() == controlmode.KUBERNETES_FAIRMQ { + k8sTasks = append(k8sTasks, t) + } else { + mesosTasks = append(mesosTasks, t) + } } // We fetch each task's local bindMap to generate a global bindMap for the whole Tasks slice, // i.e. a map of the paths of registered inbound channels and their ports. + // We use the full task list (including K8s tasks) so that Mesos tasks can resolve + // connect targets that point at K8s task channels. bindMap := make(channel.BindMap) for _, task := range tasks { if task.GetParent() == nil { // Crash reported here by Roberto 6/2022 @@ -743,11 +818,27 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { log.WithFields(logrus.Fields{"bindMap": pp.Sprint(bindMap), "envId": envId.String()}). Debug("generated inbound bindMap for environment configuration") + if len(k8sTasks) > 0 && m.k8sClient != nil { + if err := m.configureK8sTasks(context.Background(), envId, k8sTasks, bindMap); err != nil { + return err + } + } + + if len(mesosTasks) == 0 { + return nil + } + + notify := make(chan controlcommands.MesosCommandResponse) + receivers, err := mesosTasks.GetMesosCommandTargets() + if err != nil { + return err + } + src := sm.STANDBY.String() evt := "CONFIGURE" dest := sm.CONFIGURED.String() args := make(controlcommands.PropertyMapsMap) - args, err = tasks.BuildPropertyMaps(bindMap) + args, err = mesosTasks.BuildPropertyMaps(bindMap) if err != nil { return err } @@ -811,6 +902,28 @@ func (m *Manager) configureTasks(envId uid.ID, tasks Tasks) error { } func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event string, dest string, commonArgs controlcommands.PropertyMap) error { + var mesosTasks Tasks + + for _, t := range tasks { + if t.GetControlMode() != controlmode.KUBERNETES_DIRECT && + t.GetControlMode() != controlmode.KUBERNETES_FAIRMQ { + mesosTasks = append(mesosTasks, t) + } + } + + if len(mesosTasks) == 0 { + return nil + } + + if len(tasks) != len(mesosTasks) { + log.WithField("partition", envId).Infof("Transitioning k8s environment from %s, to %s, event: %s", src, dest, event) + if err := m.transitionAndWaitK8sEnvState(context.Background(), envId, strings.ToLower(dest)); err != nil { + return err + } + } + + tasks = mesosTasks + notify := make(chan controlcommands.MesosCommandResponse) receivers, err := tasks.GetMesosCommandTargets() if err != nil { @@ -1128,6 +1241,17 @@ func (m *Manager) KillTasks(taskIds []string) (killed Tasks, running Tasks, err } func (m *Manager) doKillTask(task *Task) error { + if task.GetControlMode() == controlmode.KUBERNETES_DIRECT || + task.GetControlMode() == controlmode.KUBERNETES_FAIRMQ { + if m.k8sClient != nil { + if err := m.killK8sTask(context.Background(), task); err != nil { + return err + } + } + // K8s delete is synchronous — send the ack immediately so KillTasks doesn't block. + _ = m.ackKilledTasks.TrySendAck(task.taskId) + return nil + } return m.schedulerState.killTask(context.TODO(), task.GetMesosCommandTarget()) } @@ -1178,6 +1302,10 @@ func (m *Manager) Start(ctx context.Context) { m.schedulerState.Start(ctx) + if m.k8sClient != nil { + go m.watchK8sTasks(ctx) + } + go func() { for { select { From a8706cfefc3ec5de7ccb0625347f54f7c8721d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 9 Jul 2026 15:27:02 +0200 Subject: [PATCH 2322/2352] [OCTRL-1091] argsTransition param is optional --- control-operator/api/v1alpha1/environment_types.go | 2 +- .../config/crd/bases/aliecs.alice.cern_environments.yaml | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go index 7fa67fdb2..2400addae 100644 --- a/control-operator/api/v1alpha1/environment_types.go +++ b/control-operator/api/v1alpha1/environment_types.go @@ -83,7 +83,7 @@ type TaskReference struct { TaskID string `json:"taskID,omitempty"` Env []v1.EnvVar `json:"env"` ArgsCLI []string `json:"argsCLI"` - ArgsTransition map[string]string `json:"argsTransition"` + ArgsTransition map[string]string `json:"argsTransition,omitempty"` } type TemplateSpecification struct { diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml index 0df33f7e1..be25cf235 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml @@ -4104,7 +4104,6 @@ spec: type: string required: - argsCLI - - argsTransition - env - name type: object From 0998bac2580990b61e77349aab210da58c2f8cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 9 Jul 2026 15:30:10 +0200 Subject: [PATCH 2323/2352] [OCTRL-1091] control-workflows manifests for readout and dd to be used by k8s bridge --- .../control-workflows/readout-docker.yaml | 2 +- .../readout-kube-direct.yaml | 33 +++++++++ .../stfbuilder-senderoutput-kube-direct.yaml | 64 +++++++++++++++++ .../stfsender-kube-direct.yaml | 68 +++++++++++++++++++ 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 control-operator/ecs-manifests/control-workflows/readout-kube-direct.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube-direct.yaml create mode 100644 control-operator/ecs-manifests/control-workflows/stfsender-kube-direct.yaml diff --git a/control-operator/ecs-manifests/control-workflows/readout-docker.yaml b/control-operator/ecs-manifests/control-workflows/readout-docker.yaml index 043b05f7c..4c7ee2cfc 100644 --- a/control-operator/ecs-manifests/control-workflows/readout-docker.yaml +++ b/control-operator/ecs-manifests/control-workflows/readout-docker.yaml @@ -7,7 +7,7 @@ defaults: _module_cmdline: >- source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && o2-readout-exe - _plain_cmdline: "sudo -E docker run --name readout --replace --privileged --user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /tmp:/tmp -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) --network=host --ipc=host -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT -e O2_SYSTEM -e O2_ROLE gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node:2 /opt/o2/bin/o2-readout-exe" + _plain_cmdline: "sudo -E docker run --name readout --replace --privileged --user flp -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -v /tmp:/tmp -v /lib/modules/$(uname -r):/lib/modules/$(uname -r) --network=host --ipc=host -e O2_DETECTOR -e O2_PARTITION -e OCC_CONTROL_PORT -e O2_SYSTEM -e O2_ROLE gitlab-registry.cern.ch/aliceo2group/dockerfiles/alma9-flp-node/readout:1 /opt/o2/bin/o2-readout-exe" control: mode: direct wants: diff --git a/control-operator/ecs-manifests/control-workflows/readout-kube-direct.yaml b/control-operator/ecs-manifests/control-workflows/readout-kube-direct.yaml new file mode 100644 index 000000000..ca81df06d --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/readout-kube-direct.yaml @@ -0,0 +1,33 @@ +name: readout # read by workflow +defaults: + readout_cfg_uri: "consul-ini://{{ consul_endpoint }}/o2/components/readout/ANY/any/readout-standalone-{{ task_hostname }}" + user: flp + log_task_stdout: none + log_task_stderr: none + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load Readout Control-OCCPlugin && + o2-readout-exe + _plain_cmdline: "{{ o2_install_path }}/bin/o2-readout-exe" +control: + mode: kubernetes_direct +wants: + cpu: 0.15 + memory: 128 +bind: + - name: readout + type: push + rateLogging: "{{ fmq_rate_logging }}" + addressing: ipc + transport: shmem +properties: {} +command: + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + env: + - O2_DETECTOR={{ detector }} + - O2_PARTITION={{ environment_id }} + user: "{{ user }}" + arguments: + - "{{ readout_cfg_uri }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube-direct.yaml b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube-direct.yaml new file mode 100644 index 000000000..d409de28a --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfbuilder-senderoutput-kube-direct.yaml @@ -0,0 +1,64 @@ +name: stfbuilder-senderoutput +control: + mode: kubernetes_fairmq +defaults: + detector: TST + rdh_version: "6" + user: flp + fmq_severity: info + dd_detector_subspec: feeid + dd_discovery_endpoint: "no-op://" # location of consul docker instance + log_task_stdout: none + log_task_stderr: none + stfb_dd_mode: "physics" + stfb_fee_mask: "0xffff" + stfb_enable_datasink: "false" + stfb_datasink_dir: "/tmp" + stfb_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + StfBuilder + _plain_cmdline: "{{ o2_install_path }}/bin/StfBuilder" +wants: + cpu: 0.15 + memory: 128 +bind: + - name: buildertosender + type: push + rateLogging: "{{ fmq_rate_logging }}" + transport: shmem + addressing: ipc + sndBufSize: "4" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - O2_DETECTOR={{ detector }} + - DATADIST_FEE_MASK={{ stfb_fee_mask }} + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + - "--session=default" + - "--transport=shmem" + - "--shm-segment-id=2" + - "--shm-segment-size=33554432" + - "--monitoring-backend={{ monitoring_dd_url }}" + - "--monitoring-process-interval={{ monitoring_dd_interval }}" + - "--discovery-partition={{ environment_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--detector-rdh={{ rdh_version }}" + - "--detector-subspec={{ dd_detector_subspec }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--output-channel-name=buildertosender" + - "--shm-monitor=false" + - "--detector={{ detector }}" + - "--run-type={{ stfb_dd_mode }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-dir=' + stfb_datasink_dir : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfb_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfb_datasink_filesize : ' ' }}" diff --git a/control-operator/ecs-manifests/control-workflows/stfsender-kube-direct.yaml b/control-operator/ecs-manifests/control-workflows/stfsender-kube-direct.yaml new file mode 100644 index 000000000..6ed26731c --- /dev/null +++ b/control-operator/ecs-manifests/control-workflows/stfsender-kube-direct.yaml @@ -0,0 +1,68 @@ +name: stfsender +control: + mode: kubernetes_fairmq +wants: + cpu: 0.15 + memory: 128 +defaults: + max_buffered_stfs: "-1" + dd_discovery_net_if: "ib0" #the loopback intf + dd_discovery_endpoint: "no-op://" # location of consul docker instance + user: flp + fmq_severity: info + log_task_stdout: none + log_task_stderr: none + stfs_dd_region_size: 4096 + stfs_shm_segment_size: 33554432 + stfs_enable_datasink: "false" + stfs_datasink_dir: "/tmp" + stfs_datasink_filesize: "2048" + monitoring_dd_interval: "5" + _module_cmdline: >- + source /etc/profile.d/modules.sh && MODULEPATH={{ modulepath }} module load DataDistribution Control-OCCPlugin && + numactl --cpunodebind=0 --preferred=0 -- StfSender + _plain_cmdline: "numactl" +command: + env: + - O2_INFOLOGGER_MODE={{infologger_mode}} + - http_proxy="" + - https_proxy="" + - no_proxy=-ib,.internal + - O2_DETECTOR={{ detector }} + - UCX_NET_DEVICES=mlx5_0:1 # This limits StfSender to IB interface (used as of DD v1.3.0) + - UCX_TLS=sm,self,dc,rc # Force dc/rc connection (used as of DD v1.4.0) + - UCX_IB_SL=1 # Force IB SL1 with Adaptive Routing (AR) + - UCX_DC_MAX_NUM_EPS=512 # Allow 512 peers for DC transport + - UCX_RC_MAX_NUM_EPS=512 # Allow 512 peers for RC transport + - O2_PARTITION={{ environment_id }} + stdout: "{{ log_task_stdout }}" + stderr: "{{ log_task_stderr }}" + shell: true + user: "{{ user }}" + value: "{{ len(modulepath)>0 ? _module_cmdline : _plain_cmdline }}" + arguments: + - "--cpunodebind=0" + - "--preferred=0" + - "--" + - "{{ o2_install_path }}/bin/StfSender" + - "--session=default" + - "--shm-segment-id=2" + - "--shm-segment-size={{ stfs_shm_segment_size }}" + - "--dd-region-size={{ stfs_dd_region_size }}" + - "--dd-region-id=3536" + - "--transport=shmem" + - "--input-channel-name={{ stfs_input_channel_name }}" + - "--severity={{ fmq_severity }}" + - "--severity-infologger={{ infologger_severity }}" + - "--monitoring-backend={{ monitoring_dd_url }}" + - "--monitoring-process-interval={{ monitoring_dd_interval }}" + - "--discovery-partition={{ environment_id }}" + - "--discovery-id={{ dd_discovery_stfs_id }}" + - "--discovery-endpoint={{ dd_discovery_endpoint }}" + - "--discovery-net-if={{ dd_discovery_net_if }}" + - '{{ ddsched_enabled == "true" ? "" : "--stand-alone" }}' + - "--shm-monitor=false" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-enable' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-dir=' + stfs_datasink_dir : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-stfs-per-file=0' : ' ' }}" + - "{{ stfs_enable_datasink == 'true' ? '--data-sink-max-file-size=' + stfs_datasink_filesize : ' ' }}" From 2f4a689f0259420c12f3ab85df8fa0bd8f20f057 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Thu, 9 Jul 2026 16:50:17 +0200 Subject: [PATCH 2324/2352] [OCTRL-1091] kubernetes ecs bridge documentation --- core/task/manager.go | 8 ++++---- core/task/managerk8s.go | 1 + docs/kubernetes_ecs.md | 42 ++++++++++++++++++++++++++++++++++------- 3 files changed, 40 insertions(+), 11 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index ae220022e..8d07590df 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -151,7 +151,7 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.ackKilledTasks = safeacks.NewAcks() taskman.k8sEnvs = newK8sEnvRegistry() if k8sClient, k8sErr := newK8sClientFromViper(); k8sErr != nil { - log.WithError(k8sErr).Warn("K8s client init failed, K8s tasks disabled") + log.WithField("level", infologger.IL_Devel).WithError(k8sErr).Warn("K8s client init failed, K8s tasks disabled") } else { log.Info("K8s client initiated") taskman.k8sClient = k8sClient @@ -491,17 +491,17 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e // Split K8s descriptors out before the Mesos retry loop. var k8sDescriptors Descriptors { - mesos := make(Descriptors, 0, len(tasksToRun)) + mesosDescriptors := make(Descriptors, 0, len(tasksToRun)) for _, desc := range tasksToRun { class, ok := m.classes.GetClass(desc.TaskClassName) if ok && class != nil && (class.Control.Mode == controlmode.KUBERNETES_DIRECT || class.Control.Mode == controlmode.KUBERNETES_FAIRMQ) { k8sDescriptors = append(k8sDescriptors, desc) } else { - mesos = append(mesos, desc) + mesosDescriptors = append(mesosDescriptors, desc) } } - tasksToRun = mesos + tasksToRun = mesosDescriptors } var k8sDeployed DeploymentMap diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go index 6367afa1f..a462b5293 100644 --- a/core/task/managerk8s.go +++ b/core/task/managerk8s.go @@ -313,6 +313,7 @@ func (m *Manager) waitForK8sEnvState(ctx context.Context, envCRDName, expected s log.WithField("crd", envCRDName). WithField("state", env.Status.State). WithField("expected", expected). + WithField("partition", envCRDName). Debug("K8s Environment state update received") if env.Status.State == expected { return nil diff --git a/docs/kubernetes_ecs.md b/docs/kubernetes_ecs.md index dfe89e03d..043fec79b 100644 --- a/docs/kubernetes_ecs.md +++ b/docs/kubernetes_ecs.md @@ -8,12 +8,13 @@ While prototyping we used many Kubernetes clusters, namely [`kind`](https://kind.sigs.k8s.io/), [`minikube`](https://minikube.sigs.k8s.io/docs/) and [`k3s`](https://k3s.io/) in both local and remote cluster deployment. We used Openstack for remote deployment. Follow the guides at the individual distributions in order to create the desired cluster setup. -k3s is recommended to run this prototype, as it is lightweight -and easily installed distribution which is also [`CNCF`](https://www.cncf.io/training/certification/) certified. +k3s is recommended to run this prototype, as it is lightweight and easily installed distribution +which is also [`CNCF`](https://www.cncf.io/training/certification/) certified. However kubernetes +operator patterns used in this repo should be k8s distribution agnostic. All settings of `k3s` were used as default except one: locked-in-memory size. Use `ulimit -l` to learn what is the limit for the current user and `LimitMEMLOCK` inside the k3s systemd service config -to set it for correct value. Right now the `flp` user has unlimited size (`LimitMEMLOCK=infinity`). +to set it for correct value. Right now the `flp` user should have unlimited size (`LimitMEMLOCK=infinity`). This config is necessary because even if you are running Pods with the privileged security context under user flp, Kubernetes still sets limits according to its internal settings and doesn't respect linux settings. @@ -23,14 +24,41 @@ is ability to run Pods with privileged permissions and also under user `flp`. This means that the machine has to have `flp` user setup the same way as if you would do the installation with [`o2-flp-setup`](https://alice-flp.docs.cern.ch/Operations/Experts/system-configuration/utils/o2-flp-setup/). -## Task Controller +## Operator pattern -Following text assumes that there is a Task Controller from `control-operator` running -at your K8s cluster and Task CRD installed at your cluster. -You can find the details about the usage in the [documentation](/control-operator/README.md). +Any communication between kubernetes and OCC tasks and ECS and kubernetes is based on [operator pattern](https://kubernetes.io/docs/concepts/extend-kubernetes/operator/). +All operator pattern code implemented and expected to be used and deployed by ECS is located in the folder `control-operator` +with [README.md](/control-operator/README.md). + +## Direct ECS <-> Kubernetes bridge + +Apart from the old way of deploying tasks via Apache Mesos ECS now supports deployment of tasks +directly to the Kubernetes as well and it is up to Admin/User to decide where the task should run. +In order for Task to be deployed in Kubernetes cluster we need to have environment and task managers +running inside the cluster as these are responsible for managing Custom Resource Definitions of Task and Environment. + +The bridge works as follows: + +1. **ECS core** (running outside the cluster) uses a typed Kubernetes client (`control-operator/pkg/client`) backed by `controller-runtime` to interact with the cluster. +2. When ECS deploys a task whose control mode is `kubernetes_direct` or `kubernetes_fairmq`, it creates a **Task CRD** and, if needed, an **Environment CRD** in the cluster instead of submitting a Mesos offer. +3. Inside the cluster, the **task-manager** and **environment-manager** operators (see `control-operator/cmd/`) watch these CRDs and reconcile the desired state — scheduling Pods, driving OCC gRPC state transitions, and writing status back into the CRD. +4. ECS watches the CRDs via the Kubernetes Watch API and reacts to status changes exactly as it would to Mesos task updates, keeping the rest of the ECS state machine intact. + +This design lets ECS reuse its existing environment lifecycle, configuration generation, and monitoring logic while outsourcing Pod scheduling and OCC communication to the in-cluster operators. The relevant code can be found in `task/manager.go` and `task/managerk8s.go`. +The manager.go implements the split between Mesos and K8s tasks while managerk8s.go implements actual creation, deployment, transitioning and updating ECS structure. + +To deploy a Kubernetes task you can in principle reuse existing control-workflow task YAML manifests by changing the control mode to `kubernetes_direct` or `kubernetes_fairmq`. But in practice there can be issues +with reusing existing manifests, for example bad quotation of arguments: Mesos runs tasks via shell, which interpreted and stripped quotation from commands. For this reason you can find ready-to-use manifests with all necessary changes +inside `control-operator/ecs-manifests/control-workflows/*kube-direct*`. ## Running tasks (`KubectlTask`) +This method is obsoleted by direct ECS <-> Kubernetes bridge. However it should still work +for debugging purposes. It is maintained on a best-effort basis only. + +To use KubectlTasks you need to have Task controller running in k8s cluster. +You can find the details about the usage in the [documentation](/control-operator/README.md). + ECS is setup to run tasks through Mesos on all required hosts baremetal with active task management (see [`ControllableTask`](/executor/executable/controllabletask.go)) and OCC gRPC communication. When running docker task through ECS we could easily From c97d5fdae7f4303d7798290f8c5122b9d104e61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 11 Aug 2026 16:02:00 +0200 Subject: [PATCH 2325/2352] [OCTRL-1091] rename CRD to custom object --- core/task/manager.go | 2 +- core/task/managerk8s.go | 88 +++++++++++++++++++++-------------------- docs/kubernetes_ecs.md | 8 ++-- 3 files changed, 50 insertions(+), 48 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 8d07590df..18815e934 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -735,7 +735,7 @@ func (m *Manager) releaseTasks(envId uid.ID, tasks Tasks) { if m.k8sClient != nil { if err := m.killK8sEnvironment(context.Background(), envId); err != nil { log.WithError(err).WithField("partition", envId.String()). - Warn("failed to delete K8s Environment CRD during release") + Warn("failed to delete K8s custom Environment object during release") } } diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go index a462b5293..6600d15dc 100644 --- a/core/task/managerk8s.go +++ b/core/task/managerk8s.go @@ -54,7 +54,7 @@ const ( k8sWatchRetryDelay = 5 * time.Second ) -// k8sEnvRegistry maps ECS environment IDs to K8s Environment CRD names. +// k8sEnvRegistry maps ECS environment IDs to K8s custom Environment names. type k8sEnvRegistry struct { mu sync.RWMutex envs map[uid.ID]string @@ -64,17 +64,17 @@ func newK8sEnvRegistry() *k8sEnvRegistry { return &k8sEnvRegistry{envs: make(map[uid.ID]string)} } -func (r *k8sEnvRegistry) set(envId uid.ID, crdName string) { +func (r *k8sEnvRegistry) set(envId uid.ID, customObjectName string) { r.mu.Lock() - r.envs[envId] = crdName + r.envs[envId] = customObjectName r.mu.Unlock() } func (r *k8sEnvRegistry) get(envId uid.ID) (string, bool) { r.mu.RLock() defer r.mu.RUnlock() - crdName, ok := r.envs[envId] - return crdName, ok + envK8sName, ok := r.envs[envId] + return envK8sName, ok } func (r *k8sEnvRegistry) delete(envId uid.ID) { @@ -99,8 +99,8 @@ type k8sTaskEntry struct { desc *Descriptor } -// deployKubernetesTasks deploys all KUBERNETES-mode descriptors by creating one Environment CRD that -// references the pre-deployed TaskTemplate CRDs. It blocks until the operator reports status.state == "standby". +// deployKubernetesTasks deploys all KUBERNETES-mode descriptors by creating one custom Environment object that +// references the pre-deployed custom TaskTemplate object. It blocks until the operator reports status.state == "standby". func (m *Manager) deployKubernetesTasks(ctx context.Context, envId uid.ID, descriptors Descriptors) (DeploymentMap, error) { log.WithField("partition", envId). WithField("count", len(descriptors)). @@ -122,23 +122,25 @@ func (m *Manager) deployKubernetesTasks(ctx context.Context, envId uid.ID, descr m.roster.append(e.task) } - envCRDName, err := m.createK8sEnvironmentCRD(ctx, envId, nodeToRefs) + envK8sName, err := m.createK8sCustomEnvironmentObject(ctx, envId, nodeToRefs) if err != nil { - log.WithField("partition", envId).WithError(err).Error("failed to create K8s Environment CRD") + log.WithField("partition", envId).WithError(err).Error("failed to create K8s custom Environment object") return nil, err } log.WithField("partition", envId). - WithField("crd", envCRDName). - Infof("K8s Environment CRD created, waiting up to %s for standby", k8sDeployTimeout) - - if err := m.waitForK8sEnvState(ctx, envCRDName, "standby", k8sDeployTimeout); err != nil { - log.WithField("partition", envId).WithField("crd", envCRDName).WithError(err).Error("K8s Environment did not reach standby") - return nil, fmt.Errorf("waiting for Environment %s standby: %w", envCRDName, err) + WithField("customEnvObj", envK8sName). + Infof("K8s custom Environment object created, waiting up to %s for standby", k8sDeployTimeout) + + if err := m.waitForK8sEnvState(ctx, envK8sName, "standby", k8sDeployTimeout); err != nil { + log.WithField("partition", envId). + WithField("customEnvName", envK8sName). + WithError(err).Error("K8s Environment did not reach standby") + return nil, fmt.Errorf("waiting for Environment %s standby: %w", envK8sName, err) } log.WithField("partition", envId). - WithField("crd", envCRDName). + WithField("customEnvObj", envK8sName). Infof("K8s Environment reached standby, %d tasks deployed", len(entries)) deployed := make(DeploymentMap, len(entries)) @@ -233,11 +235,11 @@ func (m *Manager) buildK8sNodeTaskRefs(entries []k8sTaskEntry) (map[string][]v1a return nodeToRefs, nil } -func (m *Manager) createK8sEnvironmentCRD(ctx context.Context, envId uid.ID, nodeToRefs map[string][]v1alpha1.TaskReference) (string, error) { - envCRDName := strings.ToLower(envId.String()) +func (m *Manager) createK8sCustomEnvironmentObject(ctx context.Context, envId uid.ID, nodeToRefs map[string][]v1alpha1.TaskReference) (string, error) { + envK8sName := strings.ToLower(envId.String()) env := &v1alpha1.Environment{ - ObjectMeta: metav1.ObjectMeta{Name: envCRDName}, + ObjectMeta: metav1.ObjectMeta{Name: envK8sName}, TaskTemplates: v1alpha1.TemplateSpecification{ Tasks: nodeToRefs, }, @@ -247,10 +249,10 @@ func (m *Manager) createK8sEnvironmentCRD(ctx context.Context, envId uid.ID, nod }, } if err := m.k8sClient.CreateEnvironment(ctx, env); err != nil { - return "", fmt.Errorf("creating Environment CRD %s: %w", envCRDName, err) + return "", fmt.Errorf("creating custom Environment object %s: %w", envK8sName, err) } - m.k8sEnvs.set(envId, envCRDName) - return envCRDName, nil + m.k8sEnvs.set(envId, envK8sName) + return envK8sName, nil } // equivalent of newTaskForMesosOffer in manager.go @@ -276,14 +278,14 @@ func (m *Manager) newTaskForKubernetes(desc *Descriptor, nodeName string) *Task return t } -func (m *Manager) waitForK8sEnvState(ctx context.Context, envCRDName, expected string, timeout time.Duration) error { +func (m *Manager) waitForK8sEnvState(ctx context.Context, customEnvObjName, expected string, timeout time.Duration) error { ctx, cancel := context.WithTimeout(ctx, timeout) defer cancel() // Check current state before watching in case it's already reached. - env, err := m.k8sClient.GetEnvironment(ctx, envCRDName) + env, err := m.k8sClient.GetEnvironment(ctx, customEnvObjName) if err != nil { - return fmt.Errorf("getting Environment %s: %w", envCRDName, err) + return fmt.Errorf("getting Environment %s: %w", customEnvObjName, err) } if env.Status.State == expected { return nil @@ -298,22 +300,22 @@ func (m *Manager) waitForK8sEnvState(ctx context.Context, envCRDName, expected s for { select { case <-ctx.Done(): - return fmt.Errorf("timeout waiting for Environment %s to reach state %q: %w", envCRDName, expected, ctx.Err()) + return fmt.Errorf("timeout waiting for Environment %s to reach state %q: %w", customEnvObjName, expected, ctx.Err()) case ev, ok := <-watcher.ResultChan(): if !ok { - return fmt.Errorf("watch channel closed waiting for Environment %s", envCRDName) + return fmt.Errorf("watch channel closed waiting for Environment %s", customEnvObjName) } env, ok := ev.Object.(*v1alpha1.Environment) if !ok { continue } - log.WithField("partition", envCRDName). - WithField("crd", envCRDName).Debug("received some environment update") - if env.Name == envCRDName { - log.WithField("crd", envCRDName). + log.WithField("partition", customEnvObjName). + WithField("customEnvObj", customEnvObjName).Debug("received some environment update") + if env.Name == customEnvObjName { + log.WithField("customEnvObj", customEnvObjName). WithField("state", env.Status.State). WithField("expected", expected). - WithField("partition", envCRDName). + WithField("partition", customEnvObjName). Debug("K8s Environment state update received") if env.Status.State == expected { return nil @@ -334,7 +336,7 @@ func (m *Manager) configureK8sTasks(ctx context.Context, envId uid.ID, tasks Tas k8sTaskList, err := m.k8sClient.ListTasksByLabel(ctx, map[string]string{"taskID": t.taskId}) if err != nil { - return fmt.Errorf("error while listing K8s Task CRD for task %s: %w", t.taskId, err) + return fmt.Errorf("error while listing K8s custom Task object for task %s: %w", t.taskId, err) } if len(k8sTaskList) == 0 { return fmt.Errorf("there were not tasks for taskId %s", t.taskId) @@ -348,7 +350,7 @@ func (m *Manager) configureK8sTasks(ctx context.Context, envId uid.ID, tasks Tas } maps.Copy(k8sTask.Spec.Arguments, propMap) if err := m.k8sClient.UpdateTask(ctx, &k8sTask); err != nil { - return fmt.Errorf("updating arguments for K8s Task CRD %s: %w", k8sTask.Name, err) + return fmt.Errorf("updating arguments for K8s custom Task object %s: %w", k8sTask.Name, err) } } return m.transitionAndWaitK8sEnvState(ctx, envId, "configured") @@ -357,28 +359,28 @@ func (m *Manager) configureK8sTasks(ctx context.Context, envId uid.ID, tasks Tas // transitionAndWaitK8sEnvState is the easy way to transition tasks. Posibility for future: make this async, // so we don't have to wait during deployment func (m *Manager) transitionAndWaitK8sEnvState(ctx context.Context, envId uid.ID, targetState string) error { - crdName, ok := m.k8sEnvs.get(envId) + envK8sName, ok := m.k8sEnvs.get(envId) if !ok { - return fmt.Errorf("no K8s Environment CRD registered for env %s", envId) + return fmt.Errorf("no K8s custom Environment object registered for env %s", envId) } - env, err := m.k8sClient.GetEnvironment(ctx, crdName) + env, err := m.k8sClient.GetEnvironment(ctx, envK8sName) if err != nil { - return fmt.Errorf("error getting Environment CRD %s: %w", crdName, err) + return fmt.Errorf("error getting custom Environment object %s: %w", envK8sName, err) } env.Spec.State = targetState if err := m.k8sClient.UpdateEnvironment(ctx, env); err != nil { - return fmt.Errorf("updating Environment CRD %s: %w", crdName, err) + return fmt.Errorf("updating custom Environment object %s: %w", envK8sName, err) } - return m.waitForK8sEnvState(ctx, crdName, targetState, k8sTransitionTimeout) + return m.waitForK8sEnvState(ctx, envK8sName, targetState, k8sTransitionTimeout) } func (m *Manager) killK8sEnvironment(ctx context.Context, envId uid.ID) error { - crdName, ok := m.k8sEnvs.get(envId) + envK8sName, ok := m.k8sEnvs.get(envId) if !ok { return nil } - if err := m.k8sClient.DeleteEnvironment(ctx, crdName); err != nil { - return fmt.Errorf("deleting Environment CRD %s: %w", crdName, err) + if err := m.k8sClient.DeleteEnvironment(ctx, envK8sName); err != nil { + return fmt.Errorf("deleting custom Environment object %s: %w", envK8sName, err) } m.k8sEnvs.delete(envId) return nil diff --git a/docs/kubernetes_ecs.md b/docs/kubernetes_ecs.md index 043fec79b..1452dd8c9 100644 --- a/docs/kubernetes_ecs.md +++ b/docs/kubernetes_ecs.md @@ -40,9 +40,9 @@ running inside the cluster as these are responsible for managing Custom Resource The bridge works as follows: 1. **ECS core** (running outside the cluster) uses a typed Kubernetes client (`control-operator/pkg/client`) backed by `controller-runtime` to interact with the cluster. -2. When ECS deploys a task whose control mode is `kubernetes_direct` or `kubernetes_fairmq`, it creates a **Task CRD** and, if needed, an **Environment CRD** in the cluster instead of submitting a Mesos offer. -3. Inside the cluster, the **task-manager** and **environment-manager** operators (see `control-operator/cmd/`) watch these CRDs and reconcile the desired state — scheduling Pods, driving OCC gRPC state transitions, and writing status back into the CRD. -4. ECS watches the CRDs via the Kubernetes Watch API and reacts to status changes exactly as it would to Mesos task updates, keeping the rest of the ECS state machine intact. +2. When ECS deploys a task whose control mode is `kubernetes_direct` or `kubernetes_fairmq`, it creates a **custom Task object** and, if needed, an **custom Environment object** in the cluster instead of submitting a Mesos offer. +3. Inside the cluster, the **task-manager** and **environment-manager** operators (see `control-operator/cmd/`) watch these custom objects and reconcile the desired state — scheduling Pods, driving OCC gRPC state transitions, and writing status back into the custom object. +4. ECS watches the custom objectss via the Kubernetes Watch API and reacts to status changes exactly as it would to Mesos task updates, keeping the rest of the ECS state machine intact. This design lets ECS reuse its existing environment lifecycle, configuration generation, and monitoring logic while outsourcing Pod scheduling and OCC communication to the in-cluster operators. The relevant code can be found in `task/manager.go` and `task/managerk8s.go`. The manager.go implements the split between Mesos and K8s tasks while managerk8s.go implements actual creation, deployment, transitioning and updating ECS structure. @@ -89,7 +89,7 @@ It is based on following `kubectl` commands: These four commands allow us to deploy and monitor status of the deployed resource without necessity to interact with it directly. However `KubectlTask` -expects that resource is the CRD [Task](/control-operator/api/v1alpha1/task_types.go). +expects that resource is the [Task](/control-operator/api/v1alpha1/task_types.go). In order to activate `KubectlTask` you need to change yaml template inside the `ControlWorkflows` directory. Namely: From 9770b1f5debce03835b9ee8190b269ae559a1b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Thu, 13 Aug 2026 14:02:50 +0200 Subject: [PATCH 2326/2352] test deploy github workflow (#848) --- .../workflows/control-operator-release.yml | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 .github/workflows/control-operator-release.yml diff --git a/.github/workflows/control-operator-release.yml b/.github/workflows/control-operator-release.yml new file mode 100644 index 000000000..2d392aaec --- /dev/null +++ b/.github/workflows/control-operator-release.yml @@ -0,0 +1,59 @@ +name: AliECS Control Operator Release + +on: + push: + tags: + - 'control-operator-v*' + +permissions: + contents: read + packages: write + +defaults: + run: + working-directory: control-operator + +jobs: + release: + name: Test, Build & Publish Images + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v7 + + - uses: actions/setup-go@v7 + with: + go-version: '1.25.0' + + - uses: arduino/setup-protoc@v3 + with: + version: '35.1' + repo-token: ${{ secrets.GITHUB_TOKEN }} + + - name: Derive version from tag + id: version + run: | + echo "version=${GITHUB_REF_NAME#control-operator-v}" >> "$GITHUB_OUTPUT" + + - name: Verify tag matches Makefile VERSION + run: | + MAKEFILE_VERSION=$(sed -n 's/^VERSION ?= //p' Makefile) + if [ "$MAKEFILE_VERSION" != "${{ steps.version.outputs.version }}" ]; then + echo "Tag version (${{ steps.version.outputs.version }}) does not match Makefile VERSION ($MAKEFILE_VERSION)" >&2 + exit 1 + fi + + - name: Run tests + run: make test + + - name: Log in to GHCR + uses: docker/login-action@v4 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build & push images + run: | + make docker-build docker-push \ + TASK_IMG=ghcr.io/aliceo2group/control-operator/task-manager:v${{ steps.version.outputs.version }} \ + ENVIRONMENT_IMG=ghcr.io/aliceo2group/control-operator/environment-manager:v${{ steps.version.outputs.version }} From cb2d3e96114dabe2746b7028e3fde7f35952b2fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Thu, 3 Sep 2026 16:35:43 +0200 Subject: [PATCH 2327/2352] [task-controller] properly respect *_IMG for deployment via Makefile (#853) --- .../config/manager/environment-manager/kustomization.yaml | 5 ----- .../config/manager/task-manager/kustomization.yaml | 5 ----- 2 files changed, 10 deletions(-) diff --git a/control-operator/config/manager/environment-manager/kustomization.yaml b/control-operator/config/manager/environment-manager/kustomization.yaml index 31c476c0f..3349a34d4 100644 --- a/control-operator/config/manager/environment-manager/kustomization.yaml +++ b/control-operator/config/manager/environment-manager/kustomization.yaml @@ -3,8 +3,3 @@ kind: Kustomization resources: - environment-manager.yaml - -images: -- name: environment-manager - newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager - newTag: latest diff --git a/control-operator/config/manager/task-manager/kustomization.yaml b/control-operator/config/manager/task-manager/kustomization.yaml index 51192d22e..578dd785e 100644 --- a/control-operator/config/manager/task-manager/kustomization.yaml +++ b/control-operator/config/manager/task-manager/kustomization.yaml @@ -3,8 +3,3 @@ kind: Kustomization resources: - task-manager.yaml - -images: -- name: task-manager - newName: gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager - newTag: latest From 3132cfb74b3df8e40f74de77fbcac3ba0bafef83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Fri, 4 Sep 2026 09:09:45 +0200 Subject: [PATCH 2328/2352] Minor fixes to TaskTemplates and test_env yamls (#855) [control-operator] minor fixes to TaskTemplates and test_env yamls --- control-operator/ecs-manifests/environment/test_env.yaml | 3 +-- .../ecs-manifests/task-templates/readout-tasktemplate.yaml | 1 - .../task-templates/stfbuilder-senderoutput-tasktemplate.yaml | 1 - .../ecs-manifests/task-templates/stfsender-tasktemplate.yaml | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) diff --git a/control-operator/ecs-manifests/environment/test_env.yaml b/control-operator/ecs-manifests/environment/test_env.yaml index ae3c21eaf..8e0f94821 100644 --- a/control-operator/ecs-manifests/environment/test_env.yaml +++ b/control-operator/ecs-manifests/environment/test_env.yaml @@ -6,8 +6,7 @@ metadata: taskTemplates: tasks: - mtichak-ost.cern.ch: - # mtichak-ost: + mtichak-ost: # mtichak-xps-cern: # - name: readout # argsCLI: diff --git a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml index 71c0dc91b..2db71f56c 100644 --- a/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/readout-tasktemplate.yaml @@ -7,7 +7,6 @@ spec: envVars: - O2_DETECTOR - O2_PARTITION - - OCC_CONTROL_PORT - O2_SYSTEM - O2_ROLE pod: diff --git a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml index cc7136c7e..c097c4f6a 100644 --- a/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfbuilder-senderoutput-tasktemplate.yaml @@ -7,7 +7,6 @@ spec: envVars: - O2_DETECTOR - O2_PARTITION - - OCC_CONTROL_PORT - O2_SYSTEM - O2_ROLE - O2_INFOLOGGER_MODE diff --git a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml index 87111c255..6efbab4d0 100644 --- a/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml +++ b/control-operator/ecs-manifests/task-templates/stfsender-tasktemplate.yaml @@ -7,7 +7,6 @@ spec: envVars: - O2_DETECTOR - O2_PARTITION - - OCC_CONTROL_PORT - O2_SYSTEM - O2_ROLE - O2_INFOLOGGER_MODE From 17ad2fbfdcb2d2740cefce4c801be02aa8f77042 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Tue, 8 Sep 2026 16:37:29 +0200 Subject: [PATCH 2329/2352] [task-controller] remove unused prettyPrint --- .../internal/controller/task_controller.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index a9a486a4f..3cfe8db74 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -26,7 +26,6 @@ package controller import ( "context" - "encoding/json" "fmt" "reflect" "strings" @@ -451,12 +450,3 @@ func (r *TaskReconciler) recordCondition(ctx context.Context, t *aliecsv1alpha1. r.Recorder.Event(t, eventType, reason, message) return r.Status().Patch(ctx, t, patch) } - -func prettyPrint(i any) string { - s, err := json.MarshalIndent(i, "", " ") - if err != nil { - // If marshalling fails, return a simple error string - return "failed to pretty-print object" - } - return string(s) -} From 8f5f828df1563f942e006f0c2c8afee8f8f8d52f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Thu, 17 Sep 2026 09:11:40 +0200 Subject: [PATCH 2330/2352] Concurrent reconciles for task controller (#854) [task-controller] parallel reconciliation settable from cli --- control-operator/cmd/task-manager/main.go | 12 ++++--- .../manager/task-manager/task-manager.yaml | 1 + .../internal/controller/task_controller.go | 36 ++++++++++--------- 3 files changed, 29 insertions(+), 20 deletions(-) diff --git a/control-operator/cmd/task-manager/main.go b/control-operator/cmd/task-manager/main.go index 046a0b6f9..7701356a5 100644 --- a/control-operator/cmd/task-manager/main.go +++ b/control-operator/cmd/task-manager/main.go @@ -57,11 +57,14 @@ func main() { var metricsAddr string var enableLeaderElection bool var probeAddr string + var maxConcurrentReconciles int flag.StringVar(&metricsAddr, "metrics-bind-address", ":9082", "The address the metric endpoint binds to.") flag.StringVar(&probeAddr, "health-probe-bind-address", ":9083", "The address the probe endpoint binds to.") flag.BoolVar(&enableLeaderElection, "leader-elect", false, "Enable leader election for controller manager. "+ "Enabling this will ensure there is only one active controller manager.") + flag.IntVar(&maxConcurrentReconciles, "max-concurrent-reconciles", 1, + "Number of Tasks that are reconciled in parallel. Reconciles of a single Task are always serialized.") opts := zap.Options{ Development: true, } @@ -90,10 +93,11 @@ func main() { } if err = (&controller.TaskReconciler{ - Client: mgr.GetClient(), - Scheme: mgr.GetScheme(), - Recorder: mgr.GetEventRecorderFor("task-controller"), - NodeName: nodeName, + Client: mgr.GetClient(), + Scheme: mgr.GetScheme(), + Recorder: mgr.GetEventRecorderFor("task-controller"), + NodeName: nodeName, + MaxConcurrentReconciles: maxConcurrentReconciles, }).SetupWithManager(mgr); err != nil { setupLog.Error(err, "unable to create controller", "controller", "Task") os.Exit(1) diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 15cefd9a2..717c9a8d5 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -33,6 +33,7 @@ spec: args: - --health-probe-bind-address=:9082 - --metrics-bind-address=:9083 + - --max-concurrent-reconciles=5 - --zap-encoder=json env: - name: NODE_NAME diff --git a/control-operator/internal/controller/task_controller.go b/control-operator/internal/controller/task_controller.go index 3cfe8db74..e5a39dad5 100644 --- a/control-operator/internal/controller/task_controller.go +++ b/control-operator/internal/controller/task_controller.go @@ -29,6 +29,7 @@ import ( "fmt" "reflect" "strings" + "sync" "time" v1 "k8s.io/api/core/v1" @@ -53,12 +54,13 @@ import ( // TaskReconciler reconciles a Task object type TaskReconciler struct { client.Client - Scheme *runtime.Scheme - Recorder record.EventRecorder - NodeName string + Scheme *runtime.Scheme + Recorder record.EventRecorder + NodeName string + MaxConcurrentReconciles int } -var clientsForContainers map[string]*OccClient = make(map[string]*OccClient) +var clientsForContainers sync.Map const taskFinalizer string = "aliecs.alice.cern/finalizer" @@ -135,7 +137,7 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. return ctrl.Result{}, nil } - if _, exists := clientsForContainers[t.Name]; !exists { + if _, exists := clientsForContainers.Load(t.Name); !exists { if existingPod.Status.PodIP == "" { log.Info("pod doesn't have IP yet, we wait for different event") return ctrl.Result{}, nil @@ -158,12 +160,12 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. // on them being implemented if t.Status.State == "" { log.V(1).Info("Status.State is empty, querying container") - client, exists := clientsForContainers[t.Name] + client, exists := clientsForContainers.Load(t.Name) if !exists { return ctrl.Result{Requeue: true}, nil } - stateReply, err := client.GetState(ctx) + stateReply, err := client.(*OccClient).GetState(ctx) if err != nil { log.Error(err, "Failed to GetState") return ctrl.Result{RequeueAfter: 5 * time.Second}, nil @@ -187,16 +189,18 @@ func (r *TaskReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl. // Handle Spec -> gRPC State Sync if t.Status.State != t.Spec.State { - client, exists := clientsForContainers[t.Name] + clientAny, exists := clientsForContainers.Load(t.Name) if !exists { return ctrl.Result{Requeue: true}, nil } + client := clientAny.(*OccClient) + stateReply, err := client.GetState(ctx) if err != nil { log.Info("Failed to get state for sync, retrying in 5s", "error", err.Error()) client.Close() - delete(clientsForContainers, t.Name) + clientsForContainers.Delete(t.Name) return ctrl.Result{RequeueAfter: 5 * time.Second}, nil } @@ -267,7 +271,7 @@ func (r *TaskReconciler) createGRPCConsumer(ctx context.Context, t *aliecsv1alph return ctrl.Result{RequeueAfter: 5 * time.Second}, nil } - clientsForContainers[t.Name] = client + clientsForContainers.Store(t.Name, client) if err := r.recordCondition(ctx, t, aliecsv1alpha1.ConditionGRPCConnected, metav1.ConditionTrue, "Connected", fmt.Sprintf("gRPC connection established to %s", addr)); err != nil { return ctrl.Result{}, err @@ -276,14 +280,14 @@ func (r *TaskReconciler) createGRPCConsumer(ctx context.Context, t *aliecsv1alph } func (r *TaskReconciler) consumeGRPCConsumerIfReady(ctx context.Context, t *aliecsv1alpha1.Task, log logr.Logger) ctrl.Result { - client, exists := clientsForContainers[t.Name] + client, exists := clientsForContainers.Load(t.Name) if !exists { log.Info("didn't found existing client, retrying ", "task", t.Name) return ctrl.Result{RequeueAfter: time.Second} } - if !client.ConsumeIfReady(ctx) { + if !client.(*OccClient).ConsumeIfReady(ctx) { log.Info("gRPC client is not ready, retrying in 5 seconds", "name", t.Name) return ctrl.Result{RequeueAfter: 5 * time.Second} } @@ -341,12 +345,12 @@ func (r *TaskReconciler) deletePod(ctx context.Context, t *aliecsv1alpha1.Task, } func (*TaskReconciler) cleargRPC(t *aliecsv1alpha1.Task, log logr.Logger) { - if client, exists := clientsForContainers[t.Name]; exists { + if client, exists := clientsForContainers.Load(t.Name); exists { log.Info("Cleaning up gRPC connection") - if err := client.Close(); err != nil { + if err := client.(*OccClient).Close(); err != nil { log.Error(err, "Failed to close gRPC client during deletion") } - delete(clientsForContainers, t.Name) + clientsForContainers.Delete(t.Name) log.Info("gRPC cleaned") } } @@ -431,7 +435,7 @@ func (r *TaskReconciler) SetupWithManager(mgr ctrl.Manager) error { }), )). Owns(&v1.Pod{}). - WithOptions(controller.Options{MaxConcurrentReconciles: 1}). + WithOptions(controller.Options{MaxConcurrentReconciles: r.MaxConcurrentReconciles}). Complete(r) } From ee764aa796808ea8ecdac98a661248a3ff53d570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Tue, 29 Sep 2026 12:02:16 +0200 Subject: [PATCH 2331/2352] Bump control-operator to v0.0.2 (#859) --- control-operator/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/control-operator/Makefile b/control-operator/Makefile index b0a1cb07e..45ccb9502 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -3,7 +3,7 @@ # To re-generate a bundle for another specific version without changing the standard setup, you can: # - use the VERSION as arg of the bundle target (e.g make bundle VERSION=0.0.2) # - use environment variables to overwrite this value (e.g export VERSION=0.0.2) -VERSION ?= 0.0.1 +VERSION ?= 0.0.2 # CHANNELS define the bundle channels used in the bundle. # Add a new line here if you would like to change its default config. (E.g CHANNELS = "candidate,fast,stable") From b1589b651121b8ae000c2f3632b1b7bfa1cb8cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Tue, 29 Sep 2026 14:37:27 +0200 Subject: [PATCH 2332/2352] golang version 1.26 (#860) --- .github/workflows/control-operator-release.yml | 2 +- .github/workflows/control-operator.yml | 2 +- .github/workflows/control.yml | 2 +- control-operator/Dockerfile | 2 +- control-operator/go.mod | 2 +- go.mod | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/control-operator-release.yml b/.github/workflows/control-operator-release.yml index 2d392aaec..c05c536f9 100644 --- a/.github/workflows/control-operator-release.yml +++ b/.github/workflows/control-operator-release.yml @@ -22,7 +22,7 @@ jobs: - uses: actions/setup-go@v7 with: - go-version: '1.25.0' + go-version: '1.26.8' - uses: arduino/setup-protoc@v3 with: diff --git a/.github/workflows/control-operator.yml b/.github/workflows/control-operator.yml index de76438ad..db9bfbcb7 100644 --- a/.github/workflows/control-operator.yml +++ b/.github/workflows/control-operator.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false matrix: os: [macOS-latest, ubuntu-24.04] - go: [ '1.26.5' ] + go: [ '1.26.8' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 diff --git a/.github/workflows/control.yml b/.github/workflows/control.yml index 3b1fc2117..fa272d1ca 100644 --- a/.github/workflows/control.yml +++ b/.github/workflows/control.yml @@ -14,7 +14,7 @@ jobs: fail-fast: false matrix: os: [macOS-latest, ubuntu-24.04] - go: [ '1.25.0' ] + go: [ '1.26.8' ] steps: - uses: actions/checkout@v2 - uses: actions/setup-go@v2 diff --git a/control-operator/Dockerfile b/control-operator/Dockerfile index 2fcd5a5e2..b4548ab78 100644 --- a/control-operator/Dockerfile +++ b/control-operator/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.25 AS builder +FROM golang:1.26.8 AS builder ARG TARGETOS ARG TARGETARCH ARG MANAGER=task-manager diff --git a/control-operator/go.mod b/control-operator/go.mod index 1a50ceea8..0754656af 100644 --- a/control-operator/go.mod +++ b/control-operator/go.mod @@ -1,6 +1,6 @@ module github.com/AliceO2Group/Control/control-operator -go 1.25.0 +go 1.26.8 require ( github.com/go-logr/logr v1.4.3 diff --git a/go.mod b/go.mod index dab649326..6334e9bac 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/AliceO2Group/Control -go 1.25.0 +go 1.26.8 // github.com/coreos/bbolt@v1.3.4: parsing go.mod: // module declares its path as: go.etcd.io/bbolt From d715230f9a28f3905bfd19ce064bae17841aa53c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 19 Oct 2026 09:09:08 +0200 Subject: [PATCH 2333/2352] PULL_SECRET env var in control-operator makefile (#863) [control-operator] adding variable PULL_SECRET for the operator image deployment --- control-operator/Makefile | 6 ++++-- control-operator/README.md | 4 ++-- .../manager/environment-manager/environment-manager.yaml | 3 ++- .../config/manager/task-manager/task-manager.yaml | 3 ++- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/control-operator/Makefile b/control-operator/Makefile index 45ccb9502..ee2fb687f 100644 --- a/control-operator/Makefile +++ b/control-operator/Makefile @@ -53,6 +53,8 @@ OPERATOR_SDK_VERSION ?= unknown # Image URL to use all building/pushing image targets TASK_IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/task-manager:latest ENVIRONMENT_IMG ?= gitlab-registry.cern.ch/aliceo2group/dockerfiles/aliecs/environment-manager:latest +# Name of the image pull secret (in operator-system namespace) used by deployed controllers +PULL_SECRET ?= ghcr-pull # ENVTEST_K8S_VERSION refers to the version of kubebuilder assets to be downloaded by envtest binary. ENVTEST_K8S_VERSION = 1.27.1 @@ -212,12 +214,12 @@ deploy: deploy-task deploy-environment ## Deploy both controllers to the K8s clu .PHONY: deploy-task deploy-task: manifests kustomize ## Deploy task controller to the K8s cluster specified in ~/.kube/config. cd config/task && $(KUSTOMIZE) edit set image task-manager=${TASK_IMG} - $(KUSTOMIZE) build config/task | $(KUBECTL) apply -f - --server-side + $(KUSTOMIZE) build config/task | sed 's/- name: pull-secret-placeholder$$/- name: $(PULL_SECRET)/' | $(KUBECTL) apply -f - --server-side .PHONY: deploy-environment deploy-environment: manifests kustomize ## Deploy environment controller to the K8s cluster specified in ~/.kube/config. cd config/environment && $(KUSTOMIZE) edit set image environment-manager=${ENVIRONMENT_IMG} - $(KUSTOMIZE) build config/environment | $(KUBECTL) apply -f - --server-side + $(KUSTOMIZE) build config/environment | sed 's/- name: pull-secret-placeholder$$/- name: $(PULL_SECRET)/' | $(KUBECTL) apply -f - --server-side .PHONY: undeploy undeploy: undeploy-task undeploy-environment ## Undeploy both controllers from the K8s cluster specified in ~/.kube/config. diff --git a/control-operator/README.md b/control-operator/README.md index 208ff6b67..91fc6b931 100644 --- a/control-operator/README.md +++ b/control-operator/README.md @@ -37,10 +37,10 @@ kubectl apply -f config/samples/ make docker-build docker-push TASK_IMG=/task-manager:tag ENVIRONMENT_IMG=/environment-manager:tag ``` -1. Deploy the controllers to the cluster. Uses the same `TASK_IMG` and `ENVIRONMENT_IMG` defaults, override them if needed: +1. Deploy the controllers to the cluster. Uses the same `TASK_IMG` and `ENVIRONMENT_IMG` defaults, override them if needed. Images are pulled using the secret named by `PULL_SECRET` (default `ghcr-pull`), which must exist in the `operator-system` namespace: ```sh -make deploy TASK_IMG=/task-manager:tag ENVIRONMENT_IMG=/environment-manager:tag +make deploy TASK_IMG=/task-manager:tag ENVIRONMENT_IMG=/environment-manager:tag PULL_SECRET= ``` ### Uninstall CRDs diff --git a/control-operator/config/manager/environment-manager/environment-manager.yaml b/control-operator/config/manager/environment-manager/environment-manager.yaml index 11b12925d..f4536ca02 100644 --- a/control-operator/config/manager/environment-manager/environment-manager.yaml +++ b/control-operator/config/manager/environment-manager/environment-manager.yaml @@ -23,8 +23,9 @@ spec: labels: control-plane: environment-manager spec: + # placeholder, replaced with $(PULL_SECRET) by `make deploy-task` / `make deploy-environment` imagePullSecrets: - - name: gitlab-registry-secret + - name: pull-secret-placeholder securityContext: runAsNonRoot: true containers: diff --git a/control-operator/config/manager/task-manager/task-manager.yaml b/control-operator/config/manager/task-manager/task-manager.yaml index 717c9a8d5..c7bcf8adb 100644 --- a/control-operator/config/manager/task-manager/task-manager.yaml +++ b/control-operator/config/manager/task-manager/task-manager.yaml @@ -23,8 +23,9 @@ spec: control-plane: task-manager spec: hostNetwork: true + # placeholder, replaced with $(PULL_SECRET) by `make deploy-task` / `make deploy-environment` imagePullSecrets: - - name: gitlab-registry-secret + - name: pull-secret-placeholder securityContext: runAsNonRoot: true containers: From 9a9f0d11d4a8d3aae8363f085c91616869a04714 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 19 Oct 2026 09:21:32 +0200 Subject: [PATCH 2334/2352] Fix muted unlocking while deploying only k8s tasks (#864) [core] mutex fix for k8s only tasks --- core/task/manager.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 18815e934..2a3008069 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -540,14 +540,13 @@ func (m *Manager) acquireTasks(envId uid.ID, taskDescriptors Descriptors) (err e copy(tasksToRunThisAttempt, tasksToRun) allDeployedTasks := make(DeploymentMap) + m.deployMu.Lock() if len(tasksToRun) > 0 { // Alright, so we have some descriptors whose requirements should be met with // new Tasks we're about to deploy here. // First we ask Mesos to revive offers and block until done, then upon receiving // the offers, we ask Mesos to run the required roles - if any. - m.deployMu.Lock() - DEPLOYMENT_ATTEMPTS_LOOP: for attemptCount := 0; attemptCount < MAX_ATTEMPTS_PER_DEPLOY_REQUEST; attemptCount++ { // We loop through the deployment attempts until we either succeed or From db93cb1f871aae9be7e57b7fc5b455ed6df8fa74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 7 Sep 2026 13:51:51 +0200 Subject: [PATCH 2335/2352] [task-controller] split Reconcile and other tests --- .../controller/task_controller_helper_test.go | 284 +++++++++++++++++ .../controller/task_controller_test.go | 294 ++++-------------- 2 files changed, 337 insertions(+), 241 deletions(-) create mode 100644 control-operator/internal/controller/task_controller_helper_test.go diff --git a/control-operator/internal/controller/task_controller_helper_test.go b/control-operator/internal/controller/task_controller_helper_test.go new file mode 100644 index 000000000..7d37a8d68 --- /dev/null +++ b/control-operator/internal/controller/task_controller_helper_test.go @@ -0,0 +1,284 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "testing" + + v1 "k8s.io/api/core/v1" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/types" + + aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" +) + +// newTestScheme is used to register owner of pod properly in TestPodForTask +func newTestScheme(t *testing.T) *runtime.Scheme { + t.Helper() + scheme := runtime.NewScheme() + if err := aliecsv1alpha1.AddToScheme(scheme); err != nil { + t.Fatalf("failed to add aliecsv1alpha1 to scheme: %v", err) + } + return scheme +} + +func TestPodForTask(t *testing.T) { + r := &TaskReconciler{Scheme: newTestScheme(t)} + + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-task", + Namespace: "my-namespace", + UID: types.UID("test-uid"), + }, + Spec: aliecsv1alpha1.TaskSpec{ + Pod: v1.PodSpec{ + RestartPolicy: v1.RestartPolicyAlways, + Containers: []v1.Container{ + {Name: "main", Image: "example.io/image:latest"}, + }, + }, + }, + } + + pod := r.podForTask(task) + + if pod.Name != "aliecs-task-pod-my-task" { + t.Errorf("pod.Name = %q, want %q", pod.Name, "aliecs-task-pod-my-task") + } + if pod.Namespace != task.Namespace { + t.Errorf("pod.Namespace = %q, want %q", pod.Namespace, task.Namespace) + } + + wantLabels := map[string]string{ + "task_name": "my-task", + "application": "ControlOperator", + } + for k, v := range wantLabels { + if got := pod.Labels[k]; got != v { + t.Errorf("pod.Labels[%q] = %q, want %q", k, got, v) + } + } + + if len(pod.Spec.Containers) != 1 || pod.Spec.Containers[0].Name != "main" { + t.Errorf("pod.Spec.Containers not copied from task.Spec.Pod, got %+v", pod.Spec.Containers) + } + + // podForTask always forces RestartPolicyNever, regardless of what's set on the Task spec. + if pod.Spec.RestartPolicy != v1.RestartPolicyNever { + t.Errorf("pod.Spec.RestartPolicy = %q, want %q", pod.Spec.RestartPolicy, v1.RestartPolicyNever) + } + + ownerRefs := pod.GetOwnerReferences() + if len(ownerRefs) != 1 { + t.Fatalf("expected exactly one owner reference, got %d: %+v", len(ownerRefs), ownerRefs) + } + owner := ownerRefs[0] + if owner.Kind != "Task" { + t.Errorf("owner.Kind = %q, want %q", owner.Kind, "Task") + } + if owner.Name != task.Name { + t.Errorf("owner.Name = %q, want %q", owner.Name, task.Name) + } + if owner.UID != task.UID { + t.Errorf("owner.UID = %q, want %q", owner.UID, task.UID) + } + if owner.Controller == nil || !*owner.Controller { + t.Errorf("owner.Controller = %v, want true", owner.Controller) + } +} + +func TestPodNameFromTask(t *testing.T) { + tests := []struct { + name string + taskName string + want string + }{ + {name: "simple task name", taskName: "my-task", want: "aliecs-task-pod-my-task"}, + {name: "empty task name", taskName: "", want: "aliecs-task-pod-"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := podNameFromTask(tt.taskName); got != tt.want { + t.Errorf("podNameFromTask(%q) = %q, want %q", tt.taskName, got, tt.want) + } + }) + } +} + +func TestLabelsForTask(t *testing.T) { + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: "my-task", + }, + } + + want := map[string]string{ + "task_name": "my-task", + "application": "ControlOperator", + } + + got := labelsForTask(task) + + if len(got) != len(want) { + t.Fatalf("labelsForTask() = %v, want %v", got, want) + } + for k, v := range want { + if got[k] != v { + t.Errorf("labelsForTask()[%q] = %q, want %q", k, got[k], v) + } + } +} + +func TestIsPodFailed(t *testing.T) { + tests := []struct { + name string + pod *v1.Pod + wantFailed bool + }{ + { + name: "running pod with ready container is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", Ready: true}}, + }, + }, + wantFailed: false, + }, + { + name: "pod phase Failed is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodFailed, + Reason: "Evicted", + }, + }, + wantFailed: true, + }, + { + name: "container waiting CrashLoopBackOff is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "CrashLoopBackOff"}}, + }}, + }, + }, + wantFailed: true, + }, + { + name: "container waiting for a benign reason is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "ContainerCreating"}}, + }}, + }, + }, + wantFailed: false, + }, + { + name: "container terminated with non-zero exit code is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 1}}, + }}, + }, + }, + wantFailed: true, + }, + { + name: "container terminated with exit code 0 is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{ + Name: "main", + State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 0}}, + }}, + }, + }, + wantFailed: false, + }, + { + name: "container with more than 3 restarts and not ready is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: false}}, + }, + }, + wantFailed: true, + }, + { + name: "container with more than 3 restarts but ready is not failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: true}}, + }, + }, + wantFailed: false, + }, + { + name: "init container failure is failed", + pod: &v1.Pod{ + Status: v1.PodStatus{ + Phase: v1.PodRunning, + InitContainerStatuses: []v1.ContainerStatus{{ + Name: "init", + State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "InvalidImageName"}}, + }}, + }, + }, + wantFailed: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + gotFailed, gotReason := isPodFailed(tt.pod) + if gotFailed != tt.wantFailed { + t.Errorf("isPodFailed() failed = %v, want %v (reason: %q)", gotFailed, tt.wantFailed, gotReason) + } + if gotFailed && gotReason == "" { + t.Errorf("isPodFailed() returned failed=true with empty reason") + } + if !gotFailed && gotReason != "" { + t.Errorf("isPodFailed() returned failed=false with non-empty reason %q", gotReason) + } + }) + } +} diff --git a/control-operator/internal/controller/task_controller_test.go b/control-operator/internal/controller/task_controller_test.go index 7d37a8d68..0266caf02 100644 --- a/control-operator/internal/controller/task_controller_test.go +++ b/control-operator/internal/controller/task_controller_test.go @@ -25,260 +25,72 @@ package controller import ( - "testing" + "context" + . "github.com/onsi/ginkgo/v2" + . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/types" + "sigs.k8s.io/controller-runtime/pkg/reconcile" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" ) -// newTestScheme is used to register owner of pod properly in TestPodForTask -func newTestScheme(t *testing.T) *runtime.Scheme { - t.Helper() - scheme := runtime.NewScheme() - if err := aliecsv1alpha1.AddToScheme(scheme); err != nil { - t.Fatalf("failed to add aliecsv1alpha1 to scheme: %v", err) - } - return scheme -} - -func TestPodForTask(t *testing.T) { - r := &TaskReconciler{Scheme: newTestScheme(t)} - - task := &aliecsv1alpha1.Task{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-task", - Namespace: "my-namespace", - UID: types.UID("test-uid"), - }, - Spec: aliecsv1alpha1.TaskSpec{ - Pod: v1.PodSpec{ - RestartPolicy: v1.RestartPolicyAlways, - Containers: []v1.Container{ - {Name: "main", Image: "example.io/image:latest"}, - }, - }, - }, - } +var _ = Describe("Task Controller", func() { + Context("When reconciling a resource", func() { + const resourceName = "test-resource" - pod := r.podForTask(task) + ctx := context.Background() - if pod.Name != "aliecs-task-pod-my-task" { - t.Errorf("pod.Name = %q, want %q", pod.Name, "aliecs-task-pod-my-task") - } - if pod.Namespace != task.Namespace { - t.Errorf("pod.Namespace = %q, want %q", pod.Namespace, task.Namespace) - } - - wantLabels := map[string]string{ - "task_name": "my-task", - "application": "ControlOperator", - } - for k, v := range wantLabels { - if got := pod.Labels[k]; got != v { - t.Errorf("pod.Labels[%q] = %q, want %q", k, got, v) + typeNamespacedName := types.NamespacedName{ + Name: resourceName, + Namespace: "default", // TODO(user):Modify as needed } - } - - if len(pod.Spec.Containers) != 1 || pod.Spec.Containers[0].Name != "main" { - t.Errorf("pod.Spec.Containers not copied from task.Spec.Pod, got %+v", pod.Spec.Containers) - } - - // podForTask always forces RestartPolicyNever, regardless of what's set on the Task spec. - if pod.Spec.RestartPolicy != v1.RestartPolicyNever { - t.Errorf("pod.Spec.RestartPolicy = %q, want %q", pod.Spec.RestartPolicy, v1.RestartPolicyNever) - } - - ownerRefs := pod.GetOwnerReferences() - if len(ownerRefs) != 1 { - t.Fatalf("expected exactly one owner reference, got %d: %+v", len(ownerRefs), ownerRefs) - } - owner := ownerRefs[0] - if owner.Kind != "Task" { - t.Errorf("owner.Kind = %q, want %q", owner.Kind, "Task") - } - if owner.Name != task.Name { - t.Errorf("owner.Name = %q, want %q", owner.Name, task.Name) - } - if owner.UID != task.UID { - t.Errorf("owner.UID = %q, want %q", owner.UID, task.UID) - } - if owner.Controller == nil || !*owner.Controller { - t.Errorf("owner.Controller = %v, want true", owner.Controller) - } -} - -func TestPodNameFromTask(t *testing.T) { - tests := []struct { - name string - taskName string - want string - }{ - {name: "simple task name", taskName: "my-task", want: "aliecs-task-pod-my-task"}, - {name: "empty task name", taskName: "", want: "aliecs-task-pod-"}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := podNameFromTask(tt.taskName); got != tt.want { - t.Errorf("podNameFromTask(%q) = %q, want %q", tt.taskName, got, tt.want) + task := &aliecsv1alpha1.Task{} + + BeforeEach(func() { + By("creating the custom resource for the Kind Task") + err := k8sClient.Get(ctx, typeNamespacedName, task) + if err != nil && errors.IsNotFound(err) { + resource := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: "default", + }, + Spec: aliecsv1alpha1.TaskSpec{ + State: "standby", + Pod: v1.PodSpec{Containers: []v1.Container{}}, + }, + } + Expect(k8sClient.Create(ctx, resource)).To(Succeed()) } }) - } -} - -func TestLabelsForTask(t *testing.T) { - task := &aliecsv1alpha1.Task{ - ObjectMeta: metav1.ObjectMeta{ - Name: "my-task", - }, - } - - want := map[string]string{ - "task_name": "my-task", - "application": "ControlOperator", - } - - got := labelsForTask(task) - - if len(got) != len(want) { - t.Fatalf("labelsForTask() = %v, want %v", got, want) - } - for k, v := range want { - if got[k] != v { - t.Errorf("labelsForTask()[%q] = %q, want %q", k, got[k], v) - } - } -} -func TestIsPodFailed(t *testing.T) { - tests := []struct { - name string - pod *v1.Pod - wantFailed bool - }{ - { - name: "running pod with ready container is not failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{Name: "main", Ready: true}}, - }, - }, - wantFailed: false, - }, - { - name: "pod phase Failed is failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodFailed, - Reason: "Evicted", - }, - }, - wantFailed: true, - }, - { - name: "container waiting CrashLoopBackOff is failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{ - Name: "main", - State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "CrashLoopBackOff"}}, - }}, - }, - }, - wantFailed: true, - }, - { - name: "container waiting for a benign reason is not failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{ - Name: "main", - State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "ContainerCreating"}}, - }}, - }, - }, - wantFailed: false, - }, - { - name: "container terminated with non-zero exit code is failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{ - Name: "main", - State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 1}}, - }}, - }, - }, - wantFailed: true, - }, - { - name: "container terminated with exit code 0 is not failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{ - Name: "main", - State: v1.ContainerState{Terminated: &v1.ContainerStateTerminated{ExitCode: 0}}, - }}, - }, - }, - wantFailed: false, - }, - { - name: "container with more than 3 restarts and not ready is failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: false}}, - }, - }, - wantFailed: true, - }, - { - name: "container with more than 3 restarts but ready is not failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - ContainerStatuses: []v1.ContainerStatus{{Name: "main", RestartCount: 4, Ready: true}}, - }, - }, - wantFailed: false, - }, - { - name: "init container failure is failed", - pod: &v1.Pod{ - Status: v1.PodStatus{ - Phase: v1.PodRunning, - InitContainerStatuses: []v1.ContainerStatus{{ - Name: "init", - State: v1.ContainerState{Waiting: &v1.ContainerStateWaiting{Reason: "InvalidImageName"}}, - }}, - }, - }, - wantFailed: true, - }, - } + AfterEach(func() { + // TODO(user): Cleanup logic after each test, like removing the task instance. + task := &aliecsv1alpha1.Task{} + err := k8sClient.Get(ctx, typeNamespacedName, task) + Expect(err).NotTo(HaveOccurred()) - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - gotFailed, gotReason := isPodFailed(tt.pod) - if gotFailed != tt.wantFailed { - t.Errorf("isPodFailed() failed = %v, want %v (reason: %q)", gotFailed, tt.wantFailed, gotReason) - } - if gotFailed && gotReason == "" { - t.Errorf("isPodFailed() returned failed=true with empty reason") - } - if !gotFailed && gotReason != "" { - t.Errorf("isPodFailed() returned failed=false with non-empty reason %q", gotReason) + By("Cleanup the specific resource instance Task") + Expect(k8sClient.Delete(ctx, task)).To(Succeed()) + }) + It("should successfully reconcile the resource", func() { + By("Reconciling the created resource") + controllerReconciler := &TaskReconciler{ + Client: k8sClient, + Scheme: k8sClient.Scheme(), } + + _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ + NamespacedName: typeNamespacedName, + }) + Expect(err).NotTo(HaveOccurred()) + // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. + // Example: If you expect a certain status condition after reconciliation, verify it here. }) - } -} + }) +}) From c0059ac53199d591945a6e66d3a46731bee32f2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 11 Sep 2026 16:01:18 +0200 Subject: [PATCH 2336/2352] [task-controller] reconcile happy path tests from Task creation until working transition --- .../internal/controller/occ_server_test.go | 137 +++++++++++ .../controller/task_controller_test.go | 230 ++++++++++++++---- 2 files changed, 326 insertions(+), 41 deletions(-) create mode 100644 control-operator/internal/controller/occ_server_test.go diff --git a/control-operator/internal/controller/occ_server_test.go b/control-operator/internal/controller/occ_server_test.go new file mode 100644 index 000000000..13a73e281 --- /dev/null +++ b/control-operator/internal/controller/occ_server_test.go @@ -0,0 +1,137 @@ +/* + * === This file is part of ALICE O² === + * + * Copyright 2026 CERN and copyright holders of ALICE O². + * Author: Michal Tichak + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * In applying this license CERN does not waive the privileges and + * immunities granted to it by virtue of its status as an + * Intergovernmental Organization or submit itself to any jurisdiction. + */ + +package controller + +import ( + "context" + "errors" + "net" + "strings" + "sync" + + "google.golang.org/grpc" + + pb "github.com/AliceO2Group/Control/control-operator/internal/controller/protos/generated" +) + +// occServerStub is an in-process implementation of the OCC gRPC service defined +// in occ/protos/occ.proto. Embedding pb.UnimplementedOccServer satisfies the +// generated interface and keeps this type valid if the service gains methods. +// The state is guarded because the gRPC server answers on its own goroutines while +// the test reads and writes it. +type occServerStub struct { + pb.UnimplementedOccServer + + returnError bool + mu sync.RWMutex + state string +} + +func (s *occServerStub) setState(state string) { + s.mu.Lock() + defer s.mu.Unlock() + s.state = state +} + +func (s *occServerStub) getState() string { + s.mu.RLock() + defer s.mu.RUnlock() + return s.state +} + +func (s *occServerStub) GetState(ctx context.Context, req *pb.GetStateRequest) (*pb.GetStateReply, error) { + if s.returnError == true { + return nil, errors.New("returning error as requested by user") + } + return &pb.GetStateReply{State: s.getState()}, nil +} + +// Transition answers with the state the requested event leads to, looked up in the +// same FSM table the controller used to pick the event, and moves the stub to that +// state so a following GetState reports it. +func (s *occServerStub) Transition(ctx context.Context, req *pb.TransitionRequest) (*pb.TransitionReply, error) { + if s.returnError == true { + return nil, errors.New("returning error as requested by user") + } + + src, err := StateFromString(strings.ToLower(req.GetSrcState())) + if err != nil { + return nil, err + } + event, err := TransitionFromString(strings.ToLower(req.GetTransitionEvent())) + if err != nil { + return nil, err + } + + for fromTo, transition := range fromStatesToTransition { + if fromTo.from == src && transition == event { + newState := fromTo.to.String() + s.setState(newState) + return &pb.TransitionReply{ + Trigger: pb.StateChangeTrigger_EXECUTOR, + State: newState, + TransitionEvent: req.GetTransitionEvent(), + Ok: true, + }, nil + } + } + + // No rule for this event in this state, so the device stays where it is. + return &pb.TransitionReply{ + Trigger: pb.StateChangeTrigger_EXECUTOR, + State: src.String(), + TransitionEvent: req.GetTransitionEvent(), + Ok: false, + }, nil +} + +func (s *occServerStub) StateStream(req *pb.StateStreamRequest, srv grpc.ServerStreamingServer[pb.StateStreamReply]) error { + <-srv.Context().Done() + return nil +} + +func (s *occServerStub) EventStream(req *pb.EventStreamRequest, srv grpc.ServerStreamingServer[pb.EventStreamReply]) error { + <-srv.Context().Done() + return nil +} + +// startOccServerStub serves a stub on a kernel-assigned loopback port and +// returns it together with that port and a stop function. +func startOccServerStub() (*occServerStub, int, func(), error) { + lis, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + return nil, 0, nil, err + } + + stub := &occServerStub{} + srv := grpc.NewServer() + pb.RegisterOccServer(srv, stub) + + go func() { + _ = srv.Serve(lis) + }() + + return stub, lis.Addr().(*net.TCPAddr).Port, srv.Stop, nil +} diff --git a/control-operator/internal/controller/task_controller_test.go b/control-operator/internal/controller/task_controller_test.go index 0266caf02..16be626a3 100644 --- a/control-operator/internal/controller/task_controller_test.go +++ b/control-operator/internal/controller/task_controller_test.go @@ -26,71 +26,219 @@ package controller import ( "context" + "time" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" v1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" + "k8s.io/client-go/tools/record" + "sigs.k8s.io/controller-runtime/pkg/client" + "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil" "sigs.k8s.io/controller-runtime/pkg/reconcile" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - aliecsv1alpha1 "github.com/AliceO2Group/Control/control-operator/api/v1alpha1" ) var _ = Describe("Task Controller", func() { - Context("When reconciling a resource", func() { - const resourceName = "test-resource" + // Reconcile takes the Task one step further on every pass and then returns to wait + // for the next event: first the finalizer, then the Pod, then the gRPC connection, + // then the state of the container, and finally the transition. These specs run in + // order and each one drives the pass responsible for the next step. + Describe("When reconciling a Task step by step", Ordered, func() { + const ( + resourceName = "test-resource" + namespace = "default" + containerName = "placeholder-name" + containerImg = "placeholder-image:latest" + // The OCC stub listens on loopback, so the Pod IP the controller dials has + // to point back at the test process. + podIP = "127.0.0.1" + ) - ctx := context.Background() + var ( + ctx context.Context + taskName types.NamespacedName + podName types.NamespacedName + occServer *occServerStub + reconciler *TaskReconciler + ) - typeNamespacedName := types.NamespacedName{ - Name: resourceName, - Namespace: "default", // TODO(user):Modify as needed + reconcileOnce := func() reconcile.Result { + GinkgoHelper() + res, err := reconciler.Reconcile(ctx, reconcile.Request{NamespacedName: taskName}) + Expect(err).NotTo(HaveOccurred()) + return res } - task := &aliecsv1alpha1.Task{} - BeforeEach(func() { - By("creating the custom resource for the Kind Task") - err := k8sClient.Get(ctx, typeNamespacedName, task) - if err != nil && errors.IsNotFound(err) { - resource := &aliecsv1alpha1.Task{ - ObjectMeta: metav1.ObjectMeta{ - Name: resourceName, - Namespace: "default", - }, - Spec: aliecsv1alpha1.TaskSpec{ - State: "standby", - Pod: v1.PodSpec{Containers: []v1.Container{}}, - }, - } - Expect(k8sClient.Create(ctx, resource)).To(Succeed()) - } - }) - - AfterEach(func() { - // TODO(user): Cleanup logic after each test, like removing the task instance. + getTask := func() *aliecsv1alpha1.Task { + GinkgoHelper() task := &aliecsv1alpha1.Task{} - err := k8sClient.Get(ctx, typeNamespacedName, task) + Expect(k8sClient.Get(ctx, taskName, task)).To(Succeed()) + return task + } + + BeforeAll(func() { + ctx = context.Background() + taskName = types.NamespacedName{Name: resourceName, Namespace: namespace} + podName = types.NamespacedName{Name: podNameFromTask(resourceName), Namespace: namespace} + + By("starting the OCC server stub that stands in for the task container") + stub, port, stopOccServer, err := startOccServerStub() Expect(err).NotTo(HaveOccurred()) + DeferCleanup(stopOccServer) - By("Cleanup the specific resource instance Task") - Expect(k8sClient.Delete(ctx, task)).To(Succeed()) - }) - It("should successfully reconcile the resource", func() { - By("Reconciling the created resource") - controllerReconciler := &TaskReconciler{ + occServer = stub + occServer.setState("standby") + + reconciler = &TaskReconciler{ Client: k8sClient, Scheme: k8sClient.Scheme(), + // A zero-value FakeRecorder discards events; NewFakeRecorder would block + // once its buffer filled up. + Recorder: &record.FakeRecorder{}, } - _, err := controllerReconciler.Reconcile(ctx, reconcile.Request{ - NamespacedName: typeNamespacedName, + By("creating the custom resource for the Kind Task") + task := &aliecsv1alpha1.Task{ + ObjectMeta: metav1.ObjectMeta{ + Name: resourceName, + Namespace: namespace, + }, + Spec: aliecsv1alpha1.TaskSpec{ + Control: aliecsv1alpha1.TaskSpecControl{Mode: "direct", Port: port}, + State: "standby", + Pod: v1.PodSpec{ + Containers: []v1.Container{{Name: containerName, Image: containerImg}}, + }, + }, + } + Expect(k8sClient.Create(ctx, task)).To(Succeed()) + + // The last spec deletes the Task and its Pod through the controller, so this + // only clears what an earlier failure left behind. + DeferCleanup(func() { + if c, loaded := clientsForContainers.LoadAndDelete(resourceName); loaded { + Expect(c.(*OccClient).Close()).To(Succeed()) + } + + pod := &v1.Pod{} + if err := k8sClient.Get(ctx, podName, pod); err == nil { + Expect(client.IgnoreNotFound(k8sClient.Delete(ctx, pod, client.GracePeriodSeconds(0)))).To(Succeed()) + } + + leftover := &aliecsv1alpha1.Task{} + if err := k8sClient.Get(ctx, taskName, leftover); err == nil { + controllerutil.RemoveFinalizer(leftover, taskFinalizer) + Expect(k8sClient.Update(ctx, leftover)).To(Succeed()) + Expect(client.IgnoreNotFound(k8sClient.Delete(ctx, leftover))).To(Succeed()) + } }) - Expect(err).NotTo(HaveOccurred()) - // TODO(user): Add more specific assertions depending on your controller's reconciliation logic. - // Example: If you expect a certain status condition after reconciliation, verify it here. + }) + + It("sets the finalizer before touching anything else", func() { + reconcileOnce() + + Expect(controllerutil.ContainsFinalizer(getTask(), taskFinalizer)).To(BeTrue()) + Expect(k8sClient.Get(ctx, podName, &v1.Pod{})).To(Satisfy(errors.IsNotFound), + "the Pod should wait until the finalizer is persisted") + }) + + It("creates the Pod for the Task", func() { + reconcileOnce() + + pod := &v1.Pod{} + Expect(k8sClient.Get(ctx, podName, pod)).To(Succeed()) + + Expect(pod.Spec.Containers).To(HaveLen(1)) + Expect(pod.Spec.Containers[0].Image).To(Equal(containerImg)) + Expect(pod.Spec.RestartPolicy).To(Equal(v1.RestartPolicyNever)) + Expect(pod.Labels).To(HaveKeyWithValue("task_name", resourceName)) + + Expect(pod.OwnerReferences).To(HaveLen(1)) + Expect(pod.OwnerReferences[0].Name).To(Equal(resourceName)) + Expect(pod.OwnerReferences[0].Controller).To(HaveValue(BeTrue())) + }) + + It("waits for the Pod to report an IP before connecting", func() { + reconcileOnce() + + _, connected := clientsForContainers.Load(resourceName) + Expect(connected).To(BeFalse()) + Expect(meta.FindStatusCondition(getTask().Status.Conditions, aliecsv1alpha1.ConditionPodReady)).To(BeNil()) + }) + + It("connects to the container once the Pod is running", func() { + By("reporting the Pod status that a kubelet would report") + // envtest runs no kubelet, so nothing else moves the Pod to Running. + pod := &v1.Pod{} + Expect(k8sClient.Get(ctx, podName, pod)).To(Succeed()) + pod.Status.Phase = v1.PodRunning + pod.Status.PodIP = podIP + Expect(k8sClient.Status().Update(ctx, pod)).To(Succeed()) + + reconcileOnce() + + occClient, connected := clientsForContainers.Load(resourceName) + Expect(connected).To(BeTrue()) + + task := getTask() + Expect(meta.IsStatusConditionTrue(task.Status.Conditions, aliecsv1alpha1.ConditionPodReady)).To(BeTrue()) + Expect(meta.IsStatusConditionTrue(task.Status.Conditions, aliecsv1alpha1.ConditionGRPCConnected)).To(BeTrue()) + + // This pass asked to be requeued until the connection is Ready, which is what + // the next step needs. + connectCtx, cancel := context.WithTimeout(ctx, 5*time.Second) + defer cancel() + Expect(occClient.(*OccClient).WaitUntilConnected(connectCtx)).To(Succeed()) + }) + + It("reads the state from the container", func() { + reconcileOnce() + + task := getTask() + Expect(task.Status.State).To(Equal(occServer.getState())) + Expect(task.Status.Error).To(BeEmpty()) + Expect(meta.IsStatusConditionTrue(task.Status.Conditions, aliecsv1alpha1.ConditionStateAccessible)).To(BeTrue()) + }) + + It("transitions the container to a newly requested state", func() { + By("asking the Task for a state the container is not in") + task := getTask() + task.Spec.State = "configured" + Expect(k8sClient.Update(ctx, task)).To(Succeed()) + + reconcileOnce() + + task = getTask() + Expect(task.Status.State).To(Equal("configured")) + Expect(task.Status.Error).To(BeEmpty()) + Expect(meta.IsStatusConditionTrue(task.Status.Conditions, aliecsv1alpha1.ConditionStateTransitionResult)).To(BeTrue()) + + By("leaving the container in the requested state") + Expect(occServer.getState()).To(Equal("configured")) + }) + + It("clears the connection and the Pod when the Task is deleted", func() { + Expect(k8sClient.Delete(ctx, getTask())).To(Succeed()) + + reconcileOnce() + + _, connected := clientsForContainers.Load(resourceName) + Expect(connected).To(BeFalse()) + + // Nothing schedules the Pod in envtest, so the API server drops it right away + // instead of waiting for a kubelet to confirm termination. + Expect(k8sClient.Get(ctx, podName, &v1.Pod{})).To(Satisfy(errors.IsNotFound)) + Expect(controllerutil.ContainsFinalizer(getTask(), taskFinalizer)).To(BeTrue(), + "this pass only deletes the Pod, the finalizer goes on the next one") + + reconcileOnce() + + Expect(k8sClient.Get(ctx, taskName, &aliecsv1alpha1.Task{})).To(Satisfy(errors.IsNotFound)) }) }) }) From f81cca4dab79511113ab0c68f4bdb1aa0e1a37eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Mon, 19 Oct 2026 10:30:51 +0200 Subject: [PATCH 2337/2352] Fix ordering between mesos and k8s tasks transitions (#866) [core] fix ordering between mesos and k8s tasks transitions --- core/task/manager.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/task/manager.go b/core/task/manager.go index 2a3008069..cc754c55d 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -910,10 +910,6 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s } } - if len(mesosTasks) == 0 { - return nil - } - if len(tasks) != len(mesosTasks) { log.WithField("partition", envId).Infof("Transitioning k8s environment from %s, to %s, event: %s", src, dest, event) if err := m.transitionAndWaitK8sEnvState(context.Background(), envId, strings.ToLower(dest)); err != nil { @@ -921,6 +917,10 @@ func (m *Manager) transitionTasks(envId uid.ID, tasks Tasks, src string, event s } } + if len(mesosTasks) == 0 { + return nil + } + tasks = mesosTasks notify := make(chan controlcommands.MesosCommandResponse) From 5260649dd0c866f43c66acec62ec2fee6ef3fecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Fri, 16 Oct 2026 17:02:57 +0200 Subject: [PATCH 2338/2352] fixing k8s core arguments --- core/config.go | 4 ++++ core/task/manager.go | 2 ++ core/task/managerk8s.go | 2 +- docs/kubernetes_ecs.md | 25 ++++++++++++++++++++++--- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/core/config.go b/core/config.go index 0f64cbac9..acef70e4f 100644 --- a/core/config.go +++ b/core/config.go @@ -129,6 +129,8 @@ func setDefaults() error { viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) viper.SetDefault("metricsEndpoint", "8088/ecsmetrics") + viper.SetDefault("kubeNamespace", "alice-tasks") + viper.SetDefault("kubeConfig", "/home/aliecs/.kube/config") return nil } @@ -200,6 +202,8 @@ func setFlags() error { pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") pflag.Bool("logAllIL", viper.GetBool("logAllIL"), "Send all the logs into IL, including Debug and Trace messages") pflag.String("metricsEndpoint", viper.GetString("metricsEndpoint"), "Http endpoint from which metrics can be scraped: [port/endpoint]") + pflag.String("kubeNamespace", viper.GetString("kubeNamespace"), "Kubernetes namespace in which ECS creates Task and Environment objects (empty disables Kubernetes support)") + pflag.String("kubeConfig", viper.GetString("kubeConfig"), "Path to the kubeconfig used to access the Kubernetes cluster (empty uses in-cluster config)") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/task/manager.go b/core/task/manager.go index cc754c55d..279c20e88 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -152,6 +152,8 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.k8sEnvs = newK8sEnvRegistry() if k8sClient, k8sErr := newK8sClientFromViper(); k8sErr != nil { log.WithField("level", infologger.IL_Devel).WithError(k8sErr).Warn("K8s client init failed, K8s tasks disabled") + } else if k8sClient == nil { + log.Info("kubeNamespace not set, K8s tasks disabled") } else { log.Info("K8s client initiated") taskman.k8sClient = k8sClient diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go index 6600d15dc..36d2cf514 100644 --- a/core/task/managerk8s.go +++ b/core/task/managerk8s.go @@ -90,7 +90,7 @@ func newK8sClientFromViper() (*k8sclient.Client, error) { if namespace == "" { return nil, nil } - kubeconfig := viper.GetString("kubeconfig") + kubeconfig := viper.GetString("kubeConfig") return k8sclient.New(kubeconfig, namespace) } diff --git a/docs/kubernetes_ecs.md b/docs/kubernetes_ecs.md index 1452dd8c9..f41490217 100644 --- a/docs/kubernetes_ecs.md +++ b/docs/kubernetes_ecs.md @@ -47,9 +47,28 @@ The bridge works as follows: This design lets ECS reuse its existing environment lifecycle, configuration generation, and monitoring logic while outsourcing Pod scheduling and OCC communication to the in-cluster operators. The relevant code can be found in `task/manager.go` and `task/managerk8s.go`. The manager.go implements the split between Mesos and K8s tasks while managerk8s.go implements actual creation, deployment, transitioning and updating ECS structure. -To deploy a Kubernetes task you can in principle reuse existing control-workflow task YAML manifests by changing the control mode to `kubernetes_direct` or `kubernetes_fairmq`. But in practice there can be issues -with reusing existing manifests, for example bad quotation of arguments: Mesos runs tasks via shell, which interpreted and stripped quotation from commands. For this reason you can find ready-to-use manifests with all necessary changes -inside `control-operator/ecs-manifests/control-workflows/*kube-direct*`. +To deploy a Kubernetes task you can in principle reuse existing control-workflow task YAML manifests by changing the control mode to `kubernetes_direct` or `kubernetes_fairmq`. But in practice there can be issues reusing existing manifests, for example issues with argument quotation: Mesos runs tasks via shell, which interpreted and stripped quotation from commands. But K8s uses arguments as they are passed. For this reason you can find ready-to-use manifests with all necessary changes inside `control-operator/ecs-manifests/control-workflows/*kube-direct*` and you can just copy these files to be used instead of Workflow yaml templates. + +### Core configuration + +The Kubernetes client in ECS core is configured with the following parameters. Like any other core parameter they can be passed as CLI arguments +| Parameter | Default | Description | +|-----------------|-----------------------------|-------------| +| `kubeNamespace` | `alice-tasks` | Namespace in which ECS creates custom Task and Environment objects. Setting it to an empty string disables Kubernetes support in core. | +| `kubeConfig` | `/home/aliecs/.kube/config` | Path to the kubeconfig used to access the cluster. If empty, core tries to use the in-cluster config, which works only when core itself runs inside the cluster. | + +If the Kubernetes client cannot be created (e.g. the kubeconfig file doesn't exist), core logs a warning `K8s client init failed, K8s tasks disabled` +and continues running with Mesos only. Deploying a task with a Kubernetes control mode then fails. + +### TaskTemplates + +Since some tasks are deployed with known values ahead of time (image, env vars, ...), we added the `TaskTemplate` CR, which stores this data in the cluster so the user doesn't have to define everything every time. You can find all the `TaskTemplate`s in the `ecs-manifests/task-templates` folder. Currently we have templates for DPL, Readout, and StfBuilder/Sender. These templates must be applied to the cluster for the ECS bridge to work. + +### DPL and JIT + +DPL tasks work similarly to those mentioned before: they use `kubernetes_fairmq` in their workflow YAML manifests. However, there is a problem: JIT tasks' manifests are created the moment they are run. So for now you need to first run the workflow to generate those tasks, then change the control mode after they've been generated. This will be changed in the future. + +### Worflow templates ## Running tasks (`KubectlTask`) From fab9e7968ad1b55752832ba4c9244000776b13c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 19 Oct 2026 16:04:05 +0200 Subject: [PATCH 2339/2352] fixup! fixing k8s core arguments --- core/config.go | 4 +++- core/task/manager.go | 12 +++++++----- core/task/managerk8s.go | 3 +-- docs/kubernetes_ecs.md | 24 ++++++------------------ 4 files changed, 17 insertions(+), 26 deletions(-) diff --git a/core/config.go b/core/config.go index acef70e4f..7c116d312 100644 --- a/core/config.go +++ b/core/config.go @@ -129,6 +129,7 @@ func setDefaults() error { viper.SetDefault("enableKafka", true) viper.SetDefault("logAllIL", false) viper.SetDefault("metricsEndpoint", "8088/ecsmetrics") + viper.SetDefault("enableKubernetes", false) viper.SetDefault("kubeNamespace", "alice-tasks") viper.SetDefault("kubeConfig", "/home/aliecs/.kube/config") return nil @@ -202,7 +203,8 @@ func setFlags() error { pflag.Bool("enableKafka", viper.GetBool("enableKafka"), "Turn on the kafka messaging") pflag.Bool("logAllIL", viper.GetBool("logAllIL"), "Send all the logs into IL, including Debug and Trace messages") pflag.String("metricsEndpoint", viper.GetString("metricsEndpoint"), "Http endpoint from which metrics can be scraped: [port/endpoint]") - pflag.String("kubeNamespace", viper.GetString("kubeNamespace"), "Kubernetes namespace in which ECS creates Task and Environment objects (empty disables Kubernetes support)") + pflag.Bool("enableKubernetes", viper.GetBool("enableKubernetes"), "Turn on Kubernetes support (requires valid kubeNamespace and kubeConfig)") + pflag.String("kubeNamespace", viper.GetString("kubeNamespace"), "Kubernetes namespace in which ECS creates Task and Environment objects") pflag.String("kubeConfig", viper.GetString("kubeConfig"), "Path to the kubeconfig used to access the Kubernetes cluster (empty uses in-cluster config)") pflag.Parse() diff --git a/core/task/manager.go b/core/task/manager.go index 279c20e88..706a62863 100644 --- a/core/task/manager.go +++ b/core/task/manager.go @@ -150,13 +150,15 @@ func NewManager(shutdown func(), internalEventCh chan<- event.Event) (taskman *M taskman.reviveOffersTrg = taskman.schedulerState.reviveOffersTrg taskman.ackKilledTasks = safeacks.NewAcks() taskman.k8sEnvs = newK8sEnvRegistry() - if k8sClient, k8sErr := newK8sClientFromViper(); k8sErr != nil { - log.WithField("level", infologger.IL_Devel).WithError(k8sErr).Warn("K8s client init failed, K8s tasks disabled") - } else if k8sClient == nil { - log.Info("kubeNamespace not set, K8s tasks disabled") - } else { + if viper.GetBool("enableKubernetes") { + k8sClient, k8sErr := newK8sClientFromViper() + if k8sErr != nil { + return nil, fmt.Errorf("failed to initialize K8s client: %w", k8sErr) + } log.Info("K8s client initiated") taskman.k8sClient = k8sClient + } else { + log.Info("enableKubernetes not set, K8s tasks disabled") } schedState.setupCli() diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go index 36d2cf514..9a6039b2f 100644 --- a/core/task/managerk8s.go +++ b/core/task/managerk8s.go @@ -84,11 +84,10 @@ func (r *k8sEnvRegistry) delete(envId uid.ID) { } // newK8sClientFromViper creates a K8s client from viper config. -// Returns nil, nil if kubeNamespace is not configured (K8s disabled). func newK8sClientFromViper() (*k8sclient.Client, error) { namespace := viper.GetString("kubeNamespace") if namespace == "" { - return nil, nil + return nil, fmt.Errorf("kubeNamespace is empty") } kubeconfig := viper.GetString("kubeConfig") return k8sclient.New(kubeconfig, namespace) diff --git a/docs/kubernetes_ecs.md b/docs/kubernetes_ecs.md index f41490217..14ce6517b 100644 --- a/docs/kubernetes_ecs.md +++ b/docs/kubernetes_ecs.md @@ -51,24 +51,12 @@ To deploy a Kubernetes task you can in principle reuse existing control-workflow ### Core configuration -The Kubernetes client in ECS core is configured with the following parameters. Like any other core parameter they can be passed as CLI arguments -| Parameter | Default | Description | -|-----------------|-----------------------------|-------------| -| `kubeNamespace` | `alice-tasks` | Namespace in which ECS creates custom Task and Environment objects. Setting it to an empty string disables Kubernetes support in core. | -| `kubeConfig` | `/home/aliecs/.kube/config` | Path to the kubeconfig used to access the cluster. If empty, core tries to use the in-cluster config, which works only when core itself runs inside the cluster. | - -If the Kubernetes client cannot be created (e.g. the kubeconfig file doesn't exist), core logs a warning `K8s client init failed, K8s tasks disabled` -and continues running with Mesos only. Deploying a task with a Kubernetes control mode then fails. - -### TaskTemplates - -Since some tasks are deployed with known values ahead of time (image, env vars, ...), we added the `TaskTemplate` CR, which stores this data in the cluster so the user doesn't have to define everything every time. You can find all the `TaskTemplate`s in the `ecs-manifests/task-templates` folder. Currently we have templates for DPL, Readout, and StfBuilder/Sender. These templates must be applied to the cluster for the ECS bridge to work. - -### DPL and JIT - -DPL tasks work similarly to those mentioned before: they use `kubernetes_fairmq` in their workflow YAML manifests. However, there is a problem: JIT tasks' manifests are created the moment they are run. So for now you need to first run the workflow to generate those tasks, then change the control mode after they've been generated. This will be changed in the future. - -### Worflow templates +The Kubernetes client in ECS core is configured with the following parameters, passed as CLI arguments or in placed in `o2/components/aliecs/ANY/any/settings` consul file: +| Parameter | Default | Description | +|--------------------|-----------------------------|-------------| +| `enableKubernetes` | `false` | Turns on Kubernetes support in core. When disabled, the other parameters are ignored and core runs with Mesos only. | +| `kubeNamespace` | `alice-tasks` | Namespace in which ECS creates custom Task and Environment objects. Must not be empty when `enableKubernetes` is set. | +| `kubeConfig` | `/home/aliecs/.kube/config` | Path to the kubeconfig used to access the cluster. If empty, core tries to use the in-cluster config, which works only when core itself runs inside the cluster. | ## Running tasks (`KubectlTask`) From 7909152716e5c426dcb998d5680c595ca34e7dc6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= <53997499+justonedev1@users.noreply.github.com> Date: Tue, 20 Oct 2026 08:51:55 +0200 Subject: [PATCH 2340/2352] Fix race conditions while distributing ACTIVE stattus (#867) [core] fix lost ACTIVE status notification during deploy --- core/environment/transition_deploy.go | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/core/environment/transition_deploy.go b/core/environment/transition_deploy.go index 9c0e49b5b..28e938dd7 100644 --- a/core/environment/transition_deploy.go +++ b/core/environment/transition_deploy.go @@ -184,9 +184,13 @@ func (t DeployTransition) do(env *Environment) (err error) { return*/ - notifyStatus := make(chan task.Status) + // notifyStatusCh is used only as a wake-up signal. To be sure that updates are not missed we need to + // query the status wia wf.GetStatus() because senders is sending asynchronously so the value + // inside the channel does not have to be the most recent. I didn't change the channel type to + // not break something else. + notifyStatusCh := make(chan task.Status, 1) subscriptionId := uuid.NewUUID().String() - env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatus) + env.wfAdapter.SubscribeToStatusChange(subscriptionId, notifyStatusCh) defer env.wfAdapter.UnsubscribeFromStatusChange(subscriptionId) // listen to workflow State changes @@ -230,7 +234,8 @@ func (t DeployTransition) do(env *Environment) (err error) { WORKFLOW_ACTIVE_LOOP: for { select { - case wfStatus = <-notifyStatus: + case <-notifyStatusCh: + wfStatus = wf.GetStatus() log.WithField("status", wfStatus.String()). WithField("partition", env.Id().String()). Debug("workflow status change") @@ -268,6 +273,10 @@ func (t DeployTransition) do(env *Environment) (err error) { case <-time.After(deploymentTimeout): wfStatus = wf.GetStatus() + // just a safety check in case we missed the final update + if wfStatus == task.ACTIVE { + break WORKFLOW_ACTIVE_LOOP + } inactiveTaskRoles := make([]string, 0) undeployableTaskRoles := make([]string, 0) workflow.LeafWalk(wf, func(role workflow.Role) { From e07663ca9c8dcb39fe63823220e29d215fd615ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Tich=C3=A1k?= Date: Mon, 17 Aug 2026 13:49:05 +0200 Subject: [PATCH 2341/2352] running dpl in k8s vis ECS --- .../api/v1alpha1/environment_types.go | 1 + .../bases/aliecs.alice.cern_environments.yaml | 2 + .../task-templates/dpl-tasktemplate.yaml | 62 +++++++++++ .../controller/environment_controller.go | 15 ++- core/config.go | 2 + core/task/managerk8s.go | 100 ++++++++++++++++-- 6 files changed, 170 insertions(+), 12 deletions(-) create mode 100644 control-operator/ecs-manifests/task-templates/dpl-tasktemplate.yaml diff --git a/control-operator/api/v1alpha1/environment_types.go b/control-operator/api/v1alpha1/environment_types.go index 2400addae..330fbde11 100644 --- a/control-operator/api/v1alpha1/environment_types.go +++ b/control-operator/api/v1alpha1/environment_types.go @@ -81,6 +81,7 @@ type EnvironmentStatus struct { type TaskReference struct { Name string `json:"name"` TaskID string `json:"taskID,omitempty"` + NameSuffix string `json:"nameSuffix,omitempty"` Env []v1.EnvVar `json:"env"` ArgsCLI []string `json:"argsCLI"` ArgsTransition map[string]string `json:"argsTransition,omitempty"` diff --git a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml index be25cf235..e3184eb46 100644 --- a/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml +++ b/control-operator/config/crd/bases/aliecs.alice.cern_environments.yaml @@ -4100,6 +4100,8 @@ spec: type: array name: type: string + nameSuffix: + type: string taskID: type: string required: diff --git a/control-operator/ecs-manifests/task-templates/dpl-tasktemplate.yaml b/control-operator/ecs-manifests/task-templates/dpl-tasktemplate.yaml new file mode 100644 index 000000000..1c48ee0a4 --- /dev/null +++ b/control-operator/ecs-manifests/task-templates/dpl-tasktemplate.yaml @@ -0,0 +1,62 @@ +apiVersion: aliecs.alice.cern/v1alpha1 +kind: TaskTemplate +metadata: + name: dpl + namespace: alice-tasks +spec: + envVars: + - O2_DETECTOR + - O2_PARTITION + - OCC_CONTROL_PORT + - O2_SYSTEM + - O2_ROLE + pod: + hostNetwork: true + hostIPC: true + securityContext: + fsGroup: 1100 + supplementalGroups: [10, 1105] + containers: + - name: dpl + image: gitlab-registry.cern.ch/pkonopka/dockerfiles/flp-sw:20260729-1 + command: ["bash", "-c"] + securityContext: + privileged: true + runAsUser: 1100 + runAsGroup: 1100 + volumeMounts: + - name: host-shm + mountPath: /dev/shm + - name: group + mountPath: /etc/group + readOnly: true + - name: passwd + mountPath: /etc/passwd + readOnly: true + - name: tmp + mountPath: /tmp + - name: modules + mountPath: /lib/modules + imagePullPolicy: IfNotPresent + volumes: + - name: host-shm + hostPath: + path: /dev/shm + type: Directory + - name: group + hostPath: + path: /etc/group + - name: passwd + hostPath: + path: /etc/passwd + - name: tmp + hostPath: + path: /tmp + - name: modules + hostPath: + path: /lib/modules + imagePullSecrets: + - name: gitlab-registry-secret + control: + mode: "fairmq" + # port: ${OCC_CONTROL_PORT} # to be filled in diff --git a/control-operator/internal/controller/environment_controller.go b/control-operator/internal/controller/environment_controller.go index a605b37ae..702b13d0c 100644 --- a/control-operator/internal/controller/environment_controller.go +++ b/control-operator/internal/controller/environment_controller.go @@ -57,9 +57,15 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, nodename string, resolvedNodename string, req ctrl.Request, environment *aliecsv1alpha1.Environment, log logr.Logger, ) (*ctrl.Result, error) { for _, taskReference := range taskReferences { - log.Info("geting stored template for task", "task", taskReference.Name) + + log.Info("getting stored template for task", "task", taskReference.Name) + taskTemplateName := taskReference.Name + if strings.HasPrefix(taskTemplateName, "jit-") { + log.Info("getting dpl TaskTemplate for task", "task", taskReference.Name) + taskTemplateName = "dpl" + } template := &aliecsv1alpha1.TaskTemplate{} - if err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: taskReference.Name}, template); err != nil { + if err := r.Get(ctx, types.NamespacedName{Namespace: req.Namespace, Name: taskTemplateName}, template); err != nil { log.Error(err, "failed to get template for task", "task", taskReference.Name) return &ctrl.Result{}, nil } @@ -67,6 +73,11 @@ func (r *EnvironmentReconciler) runTasksFromReferenceOnNode(ctx context.Context, task := &aliecsv1alpha1.Task{} task.Namespace = req.Namespace task.Name = fmt.Sprintf("%s-%s", nodename, template.Name) + if taskReference.NameSuffix != "" { + task.Name = fmt.Sprintf("%s-%s", task.Name, taskReference.NameSuffix) + } + task.Name = strings.ToLower(task.Name) + if err := r.Get(ctx, types.NamespacedName{Name: task.Name, Namespace: task.Namespace}, task); err == nil { continue } diff --git a/core/config.go b/core/config.go index 7c116d312..6e14c97af 100644 --- a/core/config.go +++ b/core/config.go @@ -132,6 +132,7 @@ func setDefaults() error { viper.SetDefault("enableKubernetes", false) viper.SetDefault("kubeNamespace", "alice-tasks") viper.SetDefault("kubeConfig", "/home/aliecs/.kube/config") + viper.SetDefault("jitK8sBasePort", uint16(32000)) return nil } @@ -206,6 +207,7 @@ func setFlags() error { pflag.Bool("enableKubernetes", viper.GetBool("enableKubernetes"), "Turn on Kubernetes support (requires valid kubeNamespace and kubeConfig)") pflag.String("kubeNamespace", viper.GetString("kubeNamespace"), "Kubernetes namespace in which ECS creates Task and Environment objects") pflag.String("kubeConfig", viper.GetString("kubeConfig"), "Path to the kubeconfig used to access the Kubernetes cluster (empty uses in-cluster config)") + pflag.Uint16("jitK8sBasePort", viper.GetUint16("jitK8sBasePort"), "First control port to allocate for JIT tasks on Kubernetes, incremented per-node") pflag.Parse() return viper.BindPFlags(pflag.CommandLine) diff --git a/core/task/managerk8s.go b/core/task/managerk8s.go index 9a6039b2f..ae2c4ce4e 100644 --- a/core/task/managerk8s.go +++ b/core/task/managerk8s.go @@ -28,6 +28,8 @@ import ( "context" "fmt" "maps" + "regexp" + "strconv" "strings" "sync" "time" @@ -52,8 +54,29 @@ const ( k8sDeployTimeout = 80 * time.Second k8sTransitionTimeout = 80 * time.Second k8sWatchRetryDelay = 5 * time.Second + + // k8sJitTaskTemplateName is the shared TaskTemplate used to run JIT/DPL + // pipeline tasks, since their task class name is unique per generated + // workflow and can't be pre-registered as its own TaskTemplate. + k8sJitTaskTemplateName = "dpl" ) +// jitClassNameRe matches JIT-generated task class identifiers of the form +// "jit-<40-hex-char-sha1>-" (see configuration/template/dplutil.go) +// and captures the devicename, e.g. "readout-proxy" or "Dispatcher". +var jitClassNameRe = regexp.MustCompile(`^jit-[0-9a-f]{40}-(.+)$`) + +func isJitClassName(name string) bool { + return jitClassNameRe.MatchString(name) +} + +// jitOnK8sEnabled reports whether ECS may route JIT/DPL task classes to the +// K8s path. Missing/false means JIT keeps running through Mesos, same as +// before this bridge existed. +func jitOnK8sEnabled() bool { + return viper.GetBool("jitOnK8s") +} + // k8sEnvRegistry maps ECS environment IDs to K8s custom Environment names. type k8sEnvRegistry struct { mu sync.RWMutex @@ -83,6 +106,27 @@ func (r *k8sEnvRegistry) delete(envId uid.ID) { r.mu.Unlock() } +// k8sPortAllocator hands out control ports for JIT tasks, one monotonically +// increasing counter per node (hostNetwork is used, so ports must not collide +// between JIT tasks scheduled to the same node) +type k8sPortAllocator struct { + portBase uint16 + next map[string]uint16 +} + +func newK8sPortAllocator(port uint16) *k8sPortAllocator { + return &k8sPortAllocator{portBase: port, next: make(map[string]uint16)} +} + +func (allocator *k8sPortAllocator) allocate(hostname string) uint16 { + port, ok := allocator.next[hostname] + if !ok { + port = allocator.portBase + } + allocator.next[hostname] = port + 1 + return port +} + // newK8sClientFromViper creates a K8s client from viper config. func newK8sClientFromViper() (*k8sclient.Client, error) { namespace := viper.GetString("kubeNamespace") @@ -111,7 +155,7 @@ func (m *Manager) deployKubernetesTasks(ctx context.Context, envId uid.ID, descr return nil, err } - nodeToRefs, err := m.buildK8sNodeTaskRefs(entries) + nodeToRefs, err := m.buildK8sNodeTaskRefs(envId, entries) if err != nil { log.WithField("partition", envId).WithError(err).Error("failed to build K8s node task refs") return nil, err @@ -186,8 +230,12 @@ func (m *Manager) createK8sTaskEntries(envId uid.ID, descriptors Descriptors) ([ return entries, nil } -func (m *Manager) buildK8sNodeTaskRefs(entries []k8sTaskEntry) (map[string][]v1alpha1.TaskReference, error) { +const jitK8sBasePortStr = "jitK8sBasePort" + +func (m *Manager) buildK8sNodeTaskRefs(envId uid.ID, entries []k8sTaskEntry) (map[string][]v1alpha1.TaskReference, error) { nodeToRefs := make(map[string][]v1alpha1.TaskReference) + + portAllocator := newK8sPortAllocator(viper.GetUint16(jitK8sBasePortStr)) for _, e := range entries { t := e.task desc := e.desc @@ -216,18 +264,50 @@ func (m *Manager) buildK8sNodeTaskRefs(entries []k8sTaskEntry) (map[string][]v1a } } - argsCLI := make([]string, 0, len(cmd.Arguments)) - for _, arg := range cmd.Arguments { - if strings.TrimSpace(arg) != "" { - argsCLI = append(argsCLI, arg) + refName := taskClass.Identifier.Name + nameSuffix := "" + isJit := false + if match := jitClassNameRe.FindStringSubmatch(refName); match != nil { + isJit = true + refName = k8sJitTaskTemplateName + nameSuffix = match[1] + } + + var argsCLI []string + if isJit { + // Unlike readout/stfbuilder/stfsender (one fixed port per task type, + // baked into their TaskTemplate), JIT devices are dynamic and several + // can run on the same node, so each needs its own control port. K8s has + // no Mesos-style resource offer to claim a verified-free port from, so + // ECS tracks per-node allocation itself (mirrors scheduler.go's + // Mesos-offer-based control port claim for FAIRMQ tasks). + controlPort := portAllocator.allocate(t.hostname) + cmd.Env = append(cmd.Env, fmt.Sprintf("OCC_CONTROL_PORT=%d", controlPort)) + cmd.Arguments = append(cmd.Arguments, "--control-port", strconv.FormatUint(uint64(controlPort), 10)) + + // The "dpl" TaskTemplate runs `bash -c